From 8e6c1d5925cffd062a4dc9c791f730b3532060df Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Fri, 8 Mar 2024 22:31:50 -0600 Subject: [PATCH 001/286] Regions for sequential poromechanics solver (#2897) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pavel Tomin <“paveltomin@users.noreply.github.com”> Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Co-authored-by: Randolph R. Settgast --- .../PoroElastic_staircase_co2_3d_fim.xml | 6 +- ...oroElastic_staircase_co2_3d_sequential.xml | 6 +- integratedTests | 2 +- .../SolidMechanicsLagrangianFEM.cpp | 119 +++++++++++++----- .../SolidMechanicsLagrangianFEM.hpp | 96 ++++++-------- 5 files changed, 134 insertions(+), 95 deletions(-) diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml index eaf0aa683e2..08585c7347b 100644 --- a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml @@ -27,9 +27,9 @@ solidSolverName="linearElasticity" flowSolverName="twoPhaseFlow" stabilizationType="Global" - stabilizationRegionNames="{ channel, barrier }" + stabilizationRegionNames="{ channel }" logLevel="1" - targetRegions="{ channel, barrier }"/> + targetRegions="{ channel }"/> diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml index 2775e1326bf..889d76a25b7 100755 --- a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml @@ -13,7 +13,7 @@ solidSolverName="linearElasticity" reservoirAndWellsSolverName="reservoirAndWells" logLevel="1" - targetRegions="{ channel, barrier }"> + targetRegions="{ channel }"> + targetRegions="{ channel, wellRegion1, wellRegion2 }"> diff --git a/integratedTests b/integratedTests index fe5d9eb0601..a9982c1d952 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit fe5d9eb06019a23b98d1dc228dad2a9327555158 +Subproject commit a9982c1d952361a405b49446489d9a9c0ebd19e9 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index f76259f186b..8c778aba886 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -1022,42 +1022,97 @@ void SolidMechanicsLagrangianFEM::assembleSystem( real64 const GEOS_UNUSED_PARAM localMatrix.zero(); localRhs.zero(); - if( m_isFixedStressPoromechanicsUpdate ) - { - //GEOS_UNUSED_VAR( dt ); - assemblyLaunch< constitutive::PorousSolid< ElasticIsotropic >, // TODO: change once there is a cmake solution - solidMechanicsLagrangianFEMKernels::FixedStressThermoPoromechanicsFactory >( domain, - dofManager, - localMatrix, - localRhs, - dt ); - } - else + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { - if( m_timeIntegrationOption == TimeIntegrationOption::QuasiStatic ) + if( m_isFixedStressPoromechanicsUpdate ) { - //GEOS_UNUSED_VAR( dt ); - assemblyLaunch< constitutive::SolidBase, - solidMechanicsLagrangianFEMKernels::QuasiStaticFactory >( domain, - dofManager, - localMatrix, - localRhs, - dt ); + set< string > poromechanicsRegions; + set< string > mechanicsRegions; + ElementRegionManager const & elementRegionManager = mesh.getElemManager(); + elementRegionManager.forElementSubRegions< CellElementSubRegion >( regionNames, + [&] + ( localIndex const regionIndex, auto & elementSubRegion ) + { + if( elementSubRegion.template hasWrapper< string >( FlowSolverBase::viewKeyStruct::solidNamesString() ) ) + { + poromechanicsRegions.insert( regionNames[regionIndex] ); + } + else + { + mechanicsRegions.insert( regionNames[regionIndex] ); + } + } ); + + array1d< string > poromechanicsRegionNames; + poromechanicsRegionNames.reserve( poromechanicsRegions.size()); + for( auto const & region : poromechanicsRegions ) + { + poromechanicsRegionNames.emplace_back( region ); + } + array1d< string > mechanicsRegionNames; + mechanicsRegionNames.reserve( mechanicsRegions.size()); + for( auto const & region : mechanicsRegions ) + { + mechanicsRegionNames.emplace_back( region ); + } + + // first pass for coupled poromechanics regions + real64 const poromechanicsMaxForce= assemblyLaunch< constitutive::PorousSolid< ElasticIsotropic >, // TODO: change once there is a + // cmake solution + solidMechanicsLagrangianFEMKernels::FixedStressThermoPoromechanicsFactory >( mesh, + dofManager, + poromechanicsRegionNames, + FlowSolverBase::viewKeyStruct::solidNamesString(), + localMatrix, + localRhs, + dt ); + // second pass for pure mechanics regions + real64 const mechanicsMaxForce = assemblyLaunch< constitutive::SolidBase, + solidMechanicsLagrangianFEMKernels::QuasiStaticFactory >( mesh, + dofManager, + mechanicsRegionNames, + viewKeyStruct::solidMaterialNamesString(), + localMatrix, + localRhs, + dt ); + + m_maxForce = LvArray::math::max( mechanicsMaxForce, poromechanicsMaxForce ); } - else if( m_timeIntegrationOption == TimeIntegrationOption::ImplicitDynamic ) + else { - assemblyLaunch< constitutive::SolidBase, - solidMechanicsLagrangianFEMKernels::ImplicitNewmarkFactory >( domain, - dofManager, - localMatrix, - localRhs, - dt, - m_newmarkGamma, - m_newmarkBeta, - m_massDamping, - m_stiffnessDamping ); + if( m_timeIntegrationOption == TimeIntegrationOption::QuasiStatic ) + { + m_maxForce = assemblyLaunch< constitutive::SolidBase, + solidMechanicsLagrangianFEMKernels::QuasiStaticFactory >( mesh, + dofManager, + regionNames, + viewKeyStruct::solidMaterialNamesString(), + localMatrix, + localRhs, + dt ); + } + else if( m_timeIntegrationOption == TimeIntegrationOption::ImplicitDynamic ) + { + m_maxForce = assemblyLaunch< constitutive::SolidBase, + solidMechanicsLagrangianFEMKernels::ImplicitNewmarkFactory >( mesh, + dofManager, + regionNames, + viewKeyStruct::solidMaterialNamesString(), + localMatrix, + localRhs, + dt, + m_newmarkGamma, + m_newmarkBeta, + m_massDamping, + m_stiffnessDamping ); + } } - } + } ); + + applyContactConstraint( dofManager, domain, localMatrix, localRhs ); + } void @@ -1157,7 +1212,7 @@ SolidMechanicsLagrangianFEM:: } } } ); - real64 const localResidualNorm[2] = { localSum.get(), this->m_maxForce }; + real64 const localResidualNorm[2] = { localSum.get(), m_maxForce }; // globalResidualNorm[0]: the sum of all the local sum(rhs^2). // globalResidualNorm[1]: max of max force of each rank. Basically max force globally diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index 8adbd04b132..a8394a44f33 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -172,12 +172,14 @@ class SolidMechanicsLagrangianFEM : public SolverBase template< typename CONSTITUTIVE_BASE, typename KERNEL_WRAPPER, typename ... PARAMS > - void assemblyLaunch( DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - real64 const dt, - PARAMS && ... params ); + real64 assemblyLaunch( MeshLevel & mesh, + DofManager const & dofManager, + arrayView1d< string const > const & regionNames, + string const & materialNamesString, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + real64 const dt, + PARAMS && ... params ); template< typename ... PARAMS > @@ -313,59 +315,41 @@ ENUM_STRINGS( SolidMechanicsLagrangianFEM::TimeIntegrationOption, template< typename CONSTITUTIVE_BASE, typename KERNEL_WRAPPER, typename ... PARAMS > -void SolidMechanicsLagrangianFEM::assemblyLaunch( DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - real64 const dt, - PARAMS && ... params ) +real64 SolidMechanicsLagrangianFEM::assemblyLaunch( MeshLevel & mesh, + DofManager const & dofManager, + arrayView1d< string const > const & regionNames, + string const & materialNamesString, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + real64 const dt, + PARAMS && ... params ) { GEOS_MARK_FUNCTION; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) - { - NodeManager const & nodeManager = mesh.getNodeManager(); - - string const dofKey = dofManager.getKey( fields::solidMechanics::totalDisplacement::key() ); - arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey ); - - real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( gravityVector() ); - - KERNEL_WRAPPER kernelWrapper( dofNumber, - dofManager.rankOffset(), - localMatrix, - localRhs, - dt, - gravityVectorData, - std::forward< PARAMS >( params )... ); - - if( m_isFixedStressPoromechanicsUpdate ) - { - m_maxForce = finiteElement:: - regionBasedKernelApplication< parallelDevicePolicy< >, - CONSTITUTIVE_BASE, - CellElementSubRegion >( mesh, - regionNames, - this->getDiscretizationName(), - FlowSolverBase::viewKeyStruct::solidNamesString(), - kernelWrapper ); - } - else - { - m_maxForce = finiteElement:: - regionBasedKernelApplication< parallelDevicePolicy< >, - CONSTITUTIVE_BASE, - CellElementSubRegion >( mesh, - regionNames, - this->getDiscretizationName(), - viewKeyStruct::solidMaterialNamesString(), - kernelWrapper ); - } - } ); - - applyContactConstraint( dofManager, domain, localMatrix, localRhs ); + NodeManager const & nodeManager = mesh.getNodeManager(); + + string const dofKey = dofManager.getKey( fields::solidMechanics::totalDisplacement::key() ); + arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey ); + + real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( gravityVector() ); + + KERNEL_WRAPPER kernelWrapper( dofNumber, + dofManager.rankOffset(), + localMatrix, + localRhs, + dt, + gravityVectorData, + std::forward< PARAMS >( params )... ); + + return finiteElement:: + regionBasedKernelApplication< parallelDevicePolicy< >, + CONSTITUTIVE_BASE, + CellElementSubRegion >( mesh, + regionNames, + this->getDiscretizationName(), + materialNamesString, + kernelWrapper ); + } } /* namespace geos */ From defddcc230f1d4608e83f69b088ff8d8c6e4a787 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Sun, 10 Mar 2024 13:33:12 -0500 Subject: [PATCH 002/286] Uniaxial in fixed stress (#2906) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pavel Tomin <“paveltomin@users.noreply.github.com”> Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Co-authored-by: Randolph R. Settgast --- integratedTests | 2 +- .../constitutive/solid/CompressibleSolid.hpp | 2 + .../constitutive/solid/CoupledSolid.hpp | 6 +- .../constitutive/solid/PorousSolid.hpp | 16 +-- .../solid/porosity/BiotPorosity.cpp | 9 ++ .../solid/porosity/BiotPorosity.hpp | 89 +++++++++----- .../physicsSolvers/SolverBase.cpp | 2 +- .../physicsSolvers/SolverBase.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 91 +++++++------- .../fluidFlow/CompositionalMultiphaseBase.hpp | 5 +- .../fluidFlow/FlowSolverBase.cpp | 113 +++++++++--------- .../fluidFlow/FlowSolverBase.hpp | 10 +- ...mpositionalMultiphaseReservoirAndWells.hpp | 2 +- .../multiphysics/CoupledSolver.hpp | 14 +-- .../SinglePhaseReservoirAndWells.hpp | 2 +- .../simplePDE/PhaseFieldDamageFEM.cpp | 2 +- .../simplePDE/PhaseFieldDamageFEM.hpp | 2 +- .../SolidMechanicsLagrangianFEM.cpp | 2 +- .../SolidMechanicsLagrangianFEM.hpp | 2 +- .../schema/docs/BiotPorosity.rst | 17 +-- .../schema/docs/BiotPorosity_other.rst | 1 + src/coreComponents/schema/schema.xsd | 2 + src/coreComponents/schema/schema.xsd.other | 2 + 23 files changed, 211 insertions(+), 184 deletions(-) diff --git a/integratedTests b/integratedTests index a9982c1d952..c0cc4a087b5 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit a9982c1d952361a405b49446489d9a9c0ebd19e9 +Subproject commit c0cc4a087b555926c8e5509ff9f24d99cf261c77 diff --git a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp index dafb968fd58..b8c37b4c07a 100644 --- a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp +++ b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp @@ -54,8 +54,10 @@ class CompressibleSolidUpdates : public CoupledSolidUpdates< NullModel, PORO_TYP virtual void updateStateFromPressureAndTemperature( localIndex const k, localIndex const q, real64 const & pressure, + real64 const & GEOS_UNUSED_PARAM( pressure_k ), real64 const & GEOS_UNUSED_PARAM( pressure_n ), real64 const & temperature, + real64 const & GEOS_UNUSED_PARAM( temperature_k ), real64 const & GEOS_UNUSED_PARAM( temperature_n ) ) const override final { m_porosityUpdate.updateFromPressureAndTemperature( k, q, pressure, temperature ); diff --git a/src/coreComponents/constitutive/solid/CoupledSolid.hpp b/src/coreComponents/constitutive/solid/CoupledSolid.hpp index 5e82c59310a..e871f07e219 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolid.hpp +++ b/src/coreComponents/constitutive/solid/CoupledSolid.hpp @@ -84,13 +84,15 @@ class CoupledSolidUpdates virtual void updateStateFromPressureAndTemperature( localIndex const k, localIndex const q, real64 const & pressure, + real64 const & pressure_k, real64 const & pressure_n, real64 const & temperature, + real64 const & temperature_k, real64 const & temperature_n ) const { GEOS_UNUSED_VAR( k, q, - pressure, pressure_n, - temperature, temperature_n ); + pressure, pressure_k, pressure_n, + temperature, temperature_k, temperature_n ); } GEOS_HOST_DEVICE diff --git a/src/coreComponents/constitutive/solid/PorousSolid.hpp b/src/coreComponents/constitutive/solid/PorousSolid.hpp index 3b81fccc634..2ed3b1fb4a3 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.hpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.hpp @@ -56,15 +56,17 @@ class PorousSolidUpdates : public CoupledSolidUpdates< SOLID_TYPE, BiotPorosity, virtual void updateStateFromPressureAndTemperature( localIndex const k, localIndex const q, real64 const & pressure, + real64 const & pressure_k, real64 const & pressure_n, real64 const & temperature, + real64 const & temperature_k, real64 const & temperature_n ) const override final { - updateBiotCoefficientAndAssignBulkModulus( k ); + updateBiotCoefficientAndAssignModuli( k ); m_porosityUpdate.updateFixedStress( k, q, - pressure, pressure_n, - temperature, temperature_n ); + pressure, pressure_k, pressure_n, + temperature, temperature_k, temperature_n ); } GEOS_HOST_DEVICE @@ -146,7 +148,6 @@ class PorousSolidUpdates : public CoupledSolidUpdates< SOLID_TYPE, BiotPorosity, stiffness ); // Compute total stress increment for the porosity update - GEOS_UNUSED_VAR( pressure_n, temperature_n ); real64 const bulkModulus = m_solidUpdate.getBulkModulus( k ); real64 const meanEffectiveStressIncrement = bulkModulus * ( strainIncrement[0] + strainIncrement[1] + strainIncrement[2] ); real64 const biotCoefficient = m_porosityUpdate.getBiotCoefficient( k ); @@ -209,12 +210,13 @@ class PorousSolidUpdates : public CoupledSolidUpdates< SOLID_TYPE, BiotPorosity, GEOS_HOST_DEVICE inline - void updateBiotCoefficientAndAssignBulkModulus( localIndex const k ) const + void updateBiotCoefficientAndAssignModuli( localIndex const k ) const { // This call is not general like this. real64 const bulkModulus = m_solidUpdate.getBulkModulus( k ); + real64 const shearModulus = m_solidUpdate.getShearModulus( k ); - m_porosityUpdate.updateBiotCoefficientAndAssignBulkModulus( k, bulkModulus ); + m_porosityUpdate.updateBiotCoefficientAndAssignModuli( k, bulkModulus, shearModulus ); } GEOS_HOST_DEVICE @@ -265,7 +267,7 @@ class PorousSolidUpdates : public CoupledSolidUpdates< SOLID_TYPE, BiotPorosity, real64 ( & dTotalStress_dTemperature )[6], DiscretizationOps & stiffness ) const { - updateBiotCoefficientAndAssignBulkModulus( k ); + updateBiotCoefficientAndAssignModuli( k ); // Compute total stress increment and its derivative w.r.t. pressure m_solidUpdate.smallStrainUpdate( k, diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp index 1494de982b9..861bfed8fe5 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp @@ -40,6 +40,11 @@ BiotPorosity::BiotPorosity( string const & name, Group * const parent ): setInputFlag( InputFlags::OPTIONAL ). setDescription( "Default thermal expansion coefficient" ); + registerWrapper( viewKeyStruct::useUniaxialFixedStressString(), &m_useUniaxialFixedStress ). + setApplyDefaultValue( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Flag enabling uniaxial approximation in fixed stress update" ); + registerField( fields::porosity::biotCoefficient{}, &m_biotCoefficient ). setApplyDefaultValue( 1.0 ); // this is useful for sequential simulations, for the first flow solve // ultimately, we want to be able to load the biotCoefficient from input directly, and this won't be necessary anymore @@ -53,6 +58,10 @@ BiotPorosity::BiotPorosity( string const & name, Group * const parent ): registerWrapper( viewKeyStruct::solidBulkModulusString(), &m_bulkModulus ). setApplyDefaultValue( 1e-6 ). setDescription( "Solid bulk modulus" ); + + registerWrapper( viewKeyStruct::solidShearModulusString(), &m_shearModulus ). + setApplyDefaultValue( 1e-6 ). + setDescription( "Solid shear modulus" ); } void BiotPorosity::allocateConstitutiveData( dataRepository::Group & parent, diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp index 9cb7b502668..4d64b0d9416 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp @@ -55,18 +55,22 @@ class BiotPorosityUpdates : public PorosityBaseUpdates arrayView2d< real64 > const & meanTotalStressIncrement_k, arrayView1d< real64 > const & averageMeanTotalStressIncrement_k, arrayView1d< real64 > const & bulkModulus, - real64 const & grainBulkModulus ): PorosityBaseUpdates( newPorosity, - porosity_n, - dPorosity_dPressure, - dPorosity_dTemperature, - initialPorosity, - referencePorosity ), + arrayView1d< real64 > const & shearModulus, + real64 const & grainBulkModulus, + integer const useUniaxialFixedStress ): PorosityBaseUpdates( newPorosity, + porosity_n, + dPorosity_dPressure, + dPorosity_dTemperature, + initialPorosity, + referencePorosity ), m_grainBulkModulus( grainBulkModulus ), m_thermalExpansionCoefficient( thermalExpansionCoefficient ), m_biotCoefficient( biotCoefficient ), m_bulkModulus( bulkModulus ), + m_shearModulus( shearModulus ), m_meanTotalStressIncrement_k( meanTotalStressIncrement_k ), - m_averageMeanTotalStressIncrement_k( averageMeanTotalStressIncrement_k ) + m_averageMeanTotalStressIncrement_k( averageMeanTotalStressIncrement_k ), + m_useUniaxialFixedStress( useUniaxialFixedStress ) {} GEOS_HOST_DEVICE @@ -104,8 +108,12 @@ class BiotPorosityUpdates : public PorosityBaseUpdates } GEOS_HOST_DEVICE - void computePorosityFixedStress( real64 const & deltaPressureFromBeginningOfTimeStep, - real64 const & deltaTemperatureFromBeginningOfTimeStep, + void computePorosityFixedStress( real64 const & pressure, + real64 const & pressure_k, + real64 const & pressure_n, + real64 const & temperature, + real64 const & temperature_k, + real64 const & temperature_n, real64 const & porosity_n, real64 const & referencePorosity, real64 & porosity, @@ -114,25 +122,30 @@ class BiotPorosityUpdates : public PorosityBaseUpdates real64 const & biotCoefficient, real64 const & thermalExpansionCoefficient, real64 const & averageMeanTotalStressIncrement_k, - real64 const & bulkModulus ) const + real64 const & bulkModulus, + real64 const & fixedStressModulus ) const { real64 const biotSkeletonModulusInverse = (biotCoefficient - referencePorosity) / m_grainBulkModulus; real64 const porosityThermalExpansion = 3 * thermalExpansionCoefficient * ( biotCoefficient - referencePorosity ); - real64 const fixedStressPressureCoefficient = biotCoefficient * biotCoefficient / bulkModulus; - real64 const fixedStressTemperatureCoefficient = 3 * biotCoefficient * thermalExpansionCoefficient; + real64 const pressureCoefficient = biotCoefficient * biotCoefficient / bulkModulus; + real64 const temperatureCoefficient = 3 * biotCoefficient * thermalExpansionCoefficient; // total stress formulation for porosity update porosity = porosity_n - + biotCoefficient * averageMeanTotalStressIncrement_k / bulkModulus // change due to stress increment (at the previous - // sequential iteration) - + biotSkeletonModulusInverse * deltaPressureFromBeginningOfTimeStep // change due to pressure increment - - porosityThermalExpansion * deltaTemperatureFromBeginningOfTimeStep; // change due to temperature increment + // change due to stress increment + + biotCoefficient * averageMeanTotalStressIncrement_k / bulkModulus + // change due to pressure increment + + biotSkeletonModulusInverse * ( pressure - pressure_n ) + pressureCoefficient * ( pressure_k - pressure_n ) + // change due to temperature increment + - porosityThermalExpansion * ( temperature - temperature_n ) + temperatureCoefficient * ( temperature_k - temperature_n ); dPorosity_dPressure = biotSkeletonModulusInverse; dPorosity_dTemperature = -porosityThermalExpansion; // Fixed-stress part - porosity += fixedStressPressureCoefficient * deltaPressureFromBeginningOfTimeStep // fixed-stress pressure term - + fixedStressTemperatureCoefficient * deltaTemperatureFromBeginningOfTimeStep; // fixed-stress temperature term + real64 const fixedStressPressureCoefficient = biotCoefficient * biotCoefficient / fixedStressModulus; + real64 const fixedStressTemperatureCoefficient = 3 * biotCoefficient * thermalExpansionCoefficient * bulkModulus / fixedStressModulus; + porosity += fixedStressPressureCoefficient * ( pressure - pressure_k ) // fixed-stress pressure term + + fixedStressTemperatureCoefficient * ( temperature - temperature_k ); // fixed-stress temperature term dPorosity_dPressure += fixedStressPressureCoefficient; dPorosity_dTemperature += fixedStressTemperatureCoefficient; } @@ -142,16 +155,17 @@ class BiotPorosityUpdates : public PorosityBaseUpdates GEOS_HOST_DEVICE virtual void updateFixedStress( localIndex const k, localIndex const q, - real64 const & pressure, // current - real64 const & pressure_n, // last time step + real64 const & pressure, + real64 const & pressure_k, + real64 const & pressure_n, real64 const & temperature, + real64 const & temperature_k, real64 const & temperature_n ) const { - real64 const deltaPressureFromBeginningOfTimeStep = pressure - pressure_n; - real64 const deltaTemperatureFromBeginningOfTimeStep = temperature - temperature_n; + real64 const fixedStressModulus = m_useUniaxialFixedStress ? (m_bulkModulus[k] + 4 * m_shearModulus[k] / 3) : m_bulkModulus[k]; - computePorosityFixedStress( deltaPressureFromBeginningOfTimeStep, - deltaTemperatureFromBeginningOfTimeStep, + computePorosityFixedStress( pressure, pressure_k, pressure_n, + temperature, temperature_k, temperature_n, m_porosity_n[k][q], m_referencePorosity[k], m_newPorosity[k][q], @@ -160,14 +174,16 @@ class BiotPorosityUpdates : public PorosityBaseUpdates m_biotCoefficient[k], m_thermalExpansionCoefficient[k], m_averageMeanTotalStressIncrement_k[k], - m_bulkModulus[k] ); + m_bulkModulus[k], + fixedStressModulus ); } GEOS_HOST_DEVICE - void updateBiotCoefficientAndAssignBulkModulus( localIndex const k, - real64 const bulkModulus ) const + void updateBiotCoefficientAndAssignModuli( localIndex const k, + real64 const bulkModulus, real64 const shearModulus ) const { m_bulkModulus[k] = bulkModulus; + m_shearModulus[k] = shearModulus; m_biotCoefficient[k] = 1 - bulkModulus / m_grainBulkModulus; } @@ -193,12 +209,17 @@ class BiotPorosityUpdates : public PorosityBaseUpdates /// View on the bulk modulus (updated by PorousSolid) arrayView1d< real64 > const m_bulkModulus; + /// View on the shear modulus (updated by PorousSolid) + arrayView1d< real64 > const m_shearModulus; + /// View on the mean total stress increment at quadrature points (updated by PorousSolid) arrayView2d< real64 > const m_meanTotalStressIncrement_k; /// View on the average mean total stress increment arrayView1d< real64 > const m_averageMeanTotalStressIncrement_k; + /// Flag enabling uniaxial approximation in fixed stress update + integer m_useUniaxialFixedStress; }; class BiotPorosity : public PorosityBase @@ -223,7 +244,11 @@ class BiotPorosity : public PorosityBase static constexpr char const *solidBulkModulusString() { return "solidBulkModulus"; } + static constexpr char const *solidShearModulusString() { return "solidShearModulus"; } + static constexpr char const *defaultThermalExpansionCoefficientString() { return "defaultPorosityTEC"; } + + static constexpr char const *useUniaxialFixedStressString() { return "useUniaxialFixedStress"; } } viewKeys; virtual void initializeState() const override final; @@ -273,7 +298,9 @@ class BiotPorosity : public PorosityBase m_meanTotalStressIncrement_k, m_averageMeanTotalStressIncrement_k, m_bulkModulus, - m_grainBulkModulus ); + m_shearModulus, + m_grainBulkModulus, + m_useUniaxialFixedStress ); } protected: @@ -292,6 +319,9 @@ class BiotPorosity : public PorosityBase /// Bulk modulus (updated in the update class, not read in input) array1d< real64 > m_bulkModulus; + /// Shear modulus (updated in the update class, not read in input) + array1d< real64 > m_shearModulus; + /// Mean total stress increment (updated in the update class, not read in input) array2d< real64 > m_meanTotalStressIncrement_k; @@ -300,6 +330,9 @@ class BiotPorosity : public PorosityBase /// Grain bulk modulus (read from XML) real64 m_grainBulkModulus; + + /// Flag enabling uniaxial approximation in fixed stress update + integer m_useUniaxialFixedStress; }; } /* namespace constitutive */ diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index 59d5e29a041..26738950857 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -1353,7 +1353,7 @@ bool SolverBase::checkSequentialSolutionIncrements( DomainPartition & GEOS_UNUSE return true; } -void SolverBase::saveSequentialIterationState( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) const +void SolverBase::saveSequentialIterationState( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { // up to specific solver to save what is needed GEOS_ERROR( "Call to SolverBase::saveSequentialIterationState. Method should be overloaded by the solver" ); diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index b3390f828e6..af7ff222f37 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -629,7 +629,7 @@ class SolverBase : public ExecutableGroup virtual bool checkSequentialSolutionIncrements( DomainPartition & domain ) const; - virtual void saveSequentialIterationState( DomainPartition & domain ) const; + virtual void saveSequentialIterationState( DomainPartition & domain ); /** * @brief accessor for the linear solver parameters. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 7a82e5bc1de..7f914e12b22 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -2393,20 +2393,50 @@ void CompositionalMultiphaseBase::saveConvergedState( ElementSubRegionBase & sub } } -void CompositionalMultiphaseBase::saveSequentialIterationState( DomainPartition & domain ) const +void CompositionalMultiphaseBase::saveSequentialIterationState( DomainPartition & domain ) { FlowSolverBase::saveSequentialIterationState( domain ); -} -void CompositionalMultiphaseBase::saveSequentialIterationState( ElementSubRegionBase & subRegion ) const -{ - FlowSolverBase::saveSequentialIterationState( subRegion ); + integer const numComp = m_numComponents; - arrayView2d< real64 const, compflow::USD_COMP > const compDens = subRegion.template getField< fields::flow::globalCompDensity >(); - arrayView2d< real64, compflow::USD_COMP > const compDens_k = subRegion.template getField< fields::flow::globalCompDensity_k >(); - compDens_k.setValues< parallelDevicePolicy<> >( compDens ); -} + real64 maxCompDensChange = 0.0; + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); + + arrayView2d< real64 const, compflow::USD_COMP > + const compDens = subRegion.getField< fields::flow::globalCompDensity >(); + arrayView2d< real64, compflow::USD_COMP > + const compDens_k = subRegion.getField< fields::flow::globalCompDensity_k >(); + + RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxCompDensChange( 0.0 ); + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] + GEOS_HOST_DEVICE ( localIndex + const ei ) + { + if( ghostRank[ei] < 0 ) + { + for( integer ic = 0; ic < numComp; ++ic ) + { + subRegionMaxCompDensChange.max( LvArray::math::abs( compDens[ei][ic] - compDens_k[ei][ic] ) ); + compDens_k[ei][ic] = compDens[ei][ic]; + } + } + } ); + + maxCompDensChange = LvArray::math::max( maxCompDensChange, subRegionMaxCompDensChange.get() ); + } ); + } ); + + m_sequentialCompDensChange = MpiWrapper::max( maxCompDensChange ); // store to be later used for convergence check +} void CompositionalMultiphaseBase::updateState( DomainPartition & domain ) { @@ -2443,50 +2473,11 @@ bool CompositionalMultiphaseBase::checkSequentialSolutionIncrements( DomainParti { bool isConverged = FlowSolverBase::checkSequentialSolutionIncrements( domain ); - integer const numComp = m_numComponents; - - real64 maxCompDensChange = 0.0; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) - { - mesh.getElemManager().forElementSubRegions( regionNames, - [&]( localIndex const, - ElementSubRegionBase & subRegion ) - { - arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); - - arrayView2d< real64 const, compflow::USD_COMP > - const compDens = subRegion.getField< fields::flow::globalCompDensity >(); - arrayView2d< real64 const, compflow::USD_COMP > - const compDens_k = subRegion.getField< fields::flow::globalCompDensity_k >(); - - RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxCompDensChange( 0.0 ); - - forAll< parallelDevicePolicy<> >( subRegion.size(), [=] - GEOS_HOST_DEVICE ( localIndex - const ei ) - { - if( ghostRank[ei] < 0 ) - { - for( integer ic = 0; ic < numComp; ++ic ) - { - subRegionMaxCompDensChange.max( LvArray::math::abs( compDens[ei][ic] - compDens_k[ei][ic] ) ); - } - } - } ); - - maxCompDensChange = LvArray::math::max( maxCompDensChange, subRegionMaxCompDensChange.get() ); - } ); - } ); - - maxCompDensChange = MpiWrapper::max( maxCompDensChange ); - string const unit = m_useMass ? "kg/m3" : "mol/m3"; GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max component density change during outer iteration: {} {}", - getName(), fmt::format( "{:.{}f}", maxCompDensChange, 3 ), unit ) ); + getName(), fmt::format( "{:.{}f}", m_sequentialCompDensChange, 3 ), unit ) ); - return isConverged && (maxCompDensChange < m_maxSequentialCompDensChange); + return isConverged && (m_sequentialCompDensChange < m_maxSequentialCompDensChange); } real64 CompositionalMultiphaseBase::setNextDt( const geos::real64 & currentDt, geos::DomainPartition & domain ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index 21e16c269d2..5e5803d3a04 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -153,7 +153,7 @@ class CompositionalMultiphaseBase : public FlowSolverBase virtual void saveConvergedState( ElementSubRegionBase & subRegion ) const override final; - virtual void saveSequentialIterationState( DomainPartition & domain ) const override final; + virtual void saveSequentialIterationState( DomainPartition & domain ) override final; virtual void updateState( DomainPartition & domain ) override final; @@ -417,8 +417,6 @@ class CompositionalMultiphaseBase : public FlowSolverBase string const fieldKey, string const boundaryFieldKey ) const; - virtual void saveSequentialIterationState( ElementSubRegionBase & subRegion ) const override final; - /// the max number of fluid phases integer m_numPhases; @@ -483,6 +481,7 @@ class CompositionalMultiphaseBase : public FlowSolverBase string m_referenceFluidModelName; /// maximum (absolute) component density change in a sequential iteration + real64 m_sequentialCompDensChange; real64 m_maxSequentialCompDensChange; /// the targeted CFL for timestep diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 44db12ad94c..cd8ed422404 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -44,8 +44,10 @@ template< typename POROUSWRAPPER_TYPE > void updatePorosityAndPermeabilityFromPressureAndTemperature( POROUSWRAPPER_TYPE porousWrapper, CellElementSubRegion & subRegion, arrayView1d< real64 const > const & pressure, + arrayView1d< real64 const > const & pressure_k, arrayView1d< real64 const > const & pressure_n, arrayView1d< real64 const > const & temperature, + arrayView1d< real64 const > const & temperature_k, arrayView1d< real64 const > const & temperature_n ) { forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_DEVICE ( localIndex const k ) @@ -54,8 +56,10 @@ void updatePorosityAndPermeabilityFromPressureAndTemperature( POROUSWRAPPER_TYPE { porousWrapper.updateStateFromPressureAndTemperature( k, q, pressure[k], + pressure_k[k], pressure_n[k], temperature[k], + temperature_k[k], temperature_n[k] ); } } ); @@ -224,31 +228,49 @@ void FlowSolverBase::saveConvergedState( ElementSubRegionBase & subRegion ) cons } } -void FlowSolverBase::saveSequentialIterationState( ElementSubRegionBase & subRegion ) const +void FlowSolverBase::saveSequentialIterationState( DomainPartition & domain ) { GEOS_ASSERT( m_isFixedStressPoromechanicsUpdate ); - arrayView1d< real64 const > const pres = subRegion.template getField< fields::flow::pressure >(); - arrayView1d< real64 const > const temp = subRegion.template getField< fields::flow::temperature >(); - arrayView1d< real64 > const pres_k = subRegion.template getField< fields::flow::pressure_k >(); - arrayView1d< real64 > const temp_k = subRegion.template getField< fields::flow::temperature_k >(); - pres_k.setValues< parallelDevicePolicy<> >( pres ); - temp_k.setValues< parallelDevicePolicy<> >( temp ); -} - -void FlowSolverBase::saveSequentialIterationState( DomainPartition & domain ) const -{ - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + real64 maxPresChange = 0.0; + real64 maxTempChange = 0.0; + forDiscretizationOnMeshTargets ( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { - mesh.getElemManager().forElementSubRegions( regionNames, - [&]( localIndex const, - ElementSubRegionBase & subRegion ) + mesh.getElemManager().forElementSubRegions ( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) { - saveSequentialIterationState( subRegion ); + arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); + + arrayView1d< real64 const > const pres = subRegion.getField< fields::flow::pressure >(); + arrayView1d< real64 > const pres_k = subRegion.getField< fields::flow::pressure_k >(); + arrayView1d< real64 const > const temp = subRegion.getField< fields::flow::temperature >(); + arrayView1d< real64 > const temp_k = subRegion.getField< fields::flow::temperature_k >(); + + RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxPresChange( 0.0 ); + RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxTempChange( 0.0 ); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( ghostRank[ei] < 0 ) + { + subRegionMaxPresChange.max( LvArray::math::abs( pres[ei] - pres_k[ei] ) ); + pres_k[ei] = pres[ei]; + subRegionMaxTempChange.max( LvArray::math::abs( temp[ei] - temp_k[ei] ) ); + temp_k[ei] = temp[ei]; + } + } ); + + maxPresChange = LvArray::math::max( maxPresChange, subRegionMaxPresChange.get() ); + maxTempChange = LvArray::math::max( maxTempChange, subRegionMaxTempChange.get() ); } ); } ); + + // store to be later used in convergence check + m_sequentialPresChange = MpiWrapper::max( maxPresChange ); + m_sequentialTempChange = m_isThermal ? MpiWrapper::max( maxTempChange ) : 0.0; } void FlowSolverBase::enableFixedStressPoromechanicsUpdate() @@ -467,8 +489,16 @@ void FlowSolverBase::updatePorosityAndPermeability( CellElementSubRegion & subRe constitutive::ConstitutivePassThru< CoupledSolidBase >::execute( porousSolid, [=, &subRegion] ( auto & castedPorousSolid ) { typename TYPEOFREF( castedPorousSolid ) ::KernelWrapper porousWrapper = castedPorousSolid.createKernelUpdates(); - - updatePorosityAndPermeabilityFromPressureAndTemperature( porousWrapper, subRegion, pressure, pressure_n, temperature, temperature_n ); + if( m_isFixedStressPoromechanicsUpdate ) + { + arrayView1d< real64 const > const & pressure_k = subRegion.getField< fields::flow::pressure_k >(); + arrayView1d< real64 const > const & temperature_k = subRegion.getField< fields::flow::temperature_k >(); + updatePorosityAndPermeabilityFromPressureAndTemperature( porousWrapper, subRegion, pressure, pressure_k, pressure_n, temperature, temperature_k, temperature_n ); + } + else + { + updatePorosityAndPermeabilityFromPressureAndTemperature( porousWrapper, subRegion, pressure, pressure_n, pressure_n, temperature, temperature_n, temperature_n ); + } } ); } @@ -742,54 +772,19 @@ void FlowSolverBase::updateStencilWeights( DomainPartition & domain ) const } ); } -bool FlowSolverBase::checkSequentialSolutionIncrements( DomainPartition & domain ) const +bool FlowSolverBase::checkSequentialSolutionIncrements( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) const { - real64 maxPresChange = 0.0; - real64 maxTempChange = 0.0; - forDiscretizationOnMeshTargets ( domain.getMeshBodies(), [&]( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) - { - mesh.getElemManager().forElementSubRegions ( regionNames, - [&]( localIndex const, - ElementSubRegionBase & subRegion ) - { - arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); - - arrayView1d< real64 const > const pres = subRegion.getField< fields::flow::pressure >(); - arrayView1d< real64 const > const pres_k = subRegion.getField< fields::flow::pressure_k >(); - arrayView1d< real64 const > const temp = subRegion.getField< fields::flow::temperature >(); - arrayView1d< real64 const > const temp_k = subRegion.getField< fields::flow::temperature_k >(); - - RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxPresChange( 0.0 ); - RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxTempChange( 0.0 ); - - forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( ghostRank[ei] < 0 ) - { - subRegionMaxPresChange.max( LvArray::math::abs( pres[ei] - pres_k[ei] ) ); - subRegionMaxTempChange.max( LvArray::math::abs( temp[ei] - temp_k[ei] ) ); - } - } ); - - maxPresChange = LvArray::math::max( maxPresChange, subRegionMaxPresChange.get() ); - maxTempChange = LvArray::math::max( maxTempChange, subRegionMaxTempChange.get() ); - } ); - } ); - maxPresChange = MpiWrapper::max( maxPresChange ); GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change during outer iteration: {} Pa", - getName(), fmt::format( "{:.{}f}", maxPresChange, 3 ) ) ); + getName(), fmt::format( "{:.{}f}", m_sequentialPresChange, 3 ) ) ); if( m_isThermal ) { - maxTempChange = MpiWrapper::max( maxTempChange ); GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max temperature change during outer iteration: {} K", - getName(), fmt::format( "{:.{}f}", maxTempChange, 3 ) ) ); + getName(), fmt::format( "{:.{}f}", m_sequentialTempChange, 3 ) ) ); } - return (maxPresChange < m_maxSequentialPresChange) && (maxTempChange < m_maxSequentialTempChange); + return (m_sequentialPresChange < m_maxSequentialPresChange) && (m_sequentialTempChange < m_maxSequentialTempChange); } } // namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index 0dac0799c6b..5aa98bf3772 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -101,7 +101,7 @@ class FlowSolverBase : public SolverBase * @brief Utility function to save the iteration state (useful for sequential simulations) * @param[in] domain the domain partition */ - virtual void saveSequentialIterationState( DomainPartition & domain ) const override; + virtual void saveSequentialIterationState( DomainPartition & domain ) override; /** * @brief For each equilibrium initial condition, loop over all the target cells and compute the min/max elevation @@ -159,12 +159,6 @@ class FlowSolverBase : public SolverBase */ virtual void saveConvergedState( ElementSubRegionBase & subRegion ) const; - /** - * @brief Utility function to save the state at the end of a sequential iteration - * @param[in] subRegion the element subRegion - */ - virtual void saveSequentialIterationState( ElementSubRegionBase & subRegion ) const; - /** * @brief Helper function to compute/report the elements with small pore volumes * @param[in] domain the domain partition @@ -196,9 +190,11 @@ class FlowSolverBase : public SolverBase real64 m_maxAbsolutePresChange; /// maximum (absolute) pressure change in a sequential iteration + real64 m_sequentialPresChange; real64 m_maxSequentialPresChange; /// maximum (absolute) temperature change in a sequential iteration + real64 m_sequentialTempChange; real64 m_maxSequentialTempChange; private: diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index 108dfed9d80..6dafaf94948 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -106,7 +106,7 @@ class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWells void enableFixedStressPoromechanicsUpdate() { flowSolver()->enableFixedStressPoromechanicsUpdate(); } - virtual void saveSequentialIterationState( DomainPartition & domain ) const override final { flowSolver()->saveSequentialIterationState( domain ); } + virtual void saveSequentialIterationState( DomainPartition & domain ) override final { flowSolver()->saveSequentialIterationState( domain ); } protected: diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index 61b69720a39..36eaa63652f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -355,14 +355,6 @@ class CoupledSolver : public SolverBase return isConverged; } - virtual void saveSequentialIterationState( DomainPartition & domain ) const override - { - forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) - { - solver->saveSequentialIterationState( domain ); - } ); - } - protected: /** @@ -460,6 +452,9 @@ class CoupledSolver : public SolverBase cycleNumber, domain ); + // save fields (e.g. pressure and temperature) after inner solve + solver->saveSequentialIterationState( domain ); + mapSolutionBetweenSolvers( domain, idx() ); if( solverDt < stepDt ) // subsolver had to cut the time step @@ -475,9 +470,6 @@ class CoupledSolver : public SolverBase stepDt, domain ); - // save fields (e.g. pressure and temperature) at the end of this iteration - saveSequentialIterationState( domain ); - if( isConverged ) { // exit outer loop diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index ef7315a6c95..04891c91dd3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -93,7 +93,7 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< SINGLE void enableFixedStressPoromechanicsUpdate() { flowSolver()->enableFixedStressPoromechanicsUpdate(); } - virtual void saveSequentialIterationState( DomainPartition & domain ) const override { flowSolver()->saveSequentialIterationState( domain ); } + virtual void saveSequentialIterationState( DomainPartition & domain ) override { flowSolver()->saveSequentialIterationState( domain ); } protected: diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp index 75818129611..d314092bebc 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp @@ -645,7 +645,7 @@ void PhaseFieldDamageFEM::applyIrreversibilityConstraint( DofManager const & dof } ); } -void PhaseFieldDamageFEM::saveSequentialIterationState( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) const +void PhaseFieldDamageFEM::saveSequentialIterationState( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { // nothing to save yet } diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp index 6c623e73fe3..a38c1ad3d79 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp @@ -131,7 +131,7 @@ class PhaseFieldDamageFEM : public SolverBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ); - virtual void saveSequentialIterationState( DomainPartition & domain ) const override; + virtual void saveSequentialIterationState( DomainPartition & domain ) override; enum class TimeIntegrationOption { diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 8c778aba886..92faf16b5b5 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -1448,7 +1448,7 @@ void SolidMechanicsLagrangianFEM::enableFixedStressPoromechanicsUpdate() m_isFixedStressPoromechanicsUpdate = true; } -void SolidMechanicsLagrangianFEM::saveSequentialIterationState( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) const +void SolidMechanicsLagrangianFEM::saveSequentialIterationState( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { // nothing to save } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index a8394a44f33..d7bf9af216b 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -226,7 +226,7 @@ class SolidMechanicsLagrangianFEM : public SolverBase void enableFixedStressPoromechanicsUpdate(); - virtual void saveSequentialIterationState( DomainPartition & domain ) const override; + virtual void saveSequentialIterationState( DomainPartition & domain ) override; struct viewKeyStruct : SolverBase::viewKeyStruct { diff --git a/src/coreComponents/schema/docs/BiotPorosity.rst b/src/coreComponents/schema/docs/BiotPorosity.rst index 2bc5c5f2678..1045d74ae9e 100644 --- a/src/coreComponents/schema/docs/BiotPorosity.rst +++ b/src/coreComponents/schema/docs/BiotPorosity.rst @@ -1,12 +1,13 @@ -======================== ========= ======== =========================================== -Name Type Default Description -======================== ========= ======== =========================================== -defaultPorosityTEC real64 0 Default thermal expansion coefficient -defaultReferencePorosity real64 required Default value of the reference porosity -grainBulkModulus real64 required Grain bulk modulus -name groupName required A name is required for any non-unique nodes -======================== ========= ======== =========================================== +======================== ========= ======== =========================================================== +Name Type Default Description +======================== ========= ======== =========================================================== +defaultPorosityTEC real64 0 Default thermal expansion coefficient +defaultReferencePorosity real64 required Default value of the reference porosity +grainBulkModulus real64 required Grain bulk modulus +name groupName required A name is required for any non-unique nodes +useUniaxialFixedStress integer 0 Flag enabling uniaxial approximation in fixed stress update +======================== ========= ======== =========================================================== diff --git a/src/coreComponents/schema/docs/BiotPorosity_other.rst b/src/coreComponents/schema/docs/BiotPorosity_other.rst index 49c9bd3d373..d5bd2487301 100644 --- a/src/coreComponents/schema/docs/BiotPorosity_other.rst +++ b/src/coreComponents/schema/docs/BiotPorosity_other.rst @@ -13,6 +13,7 @@ porosity real64_array2d Rock porosity porosity_n real64_array2d Rock porosity at the previous converged time step referencePorosity real64_array Reference porosity solidBulkModulus real64_array Solid bulk modulus +solidShearModulus real64_array Solid shear modulus thermalExpansionCoefficient real64_array Thermal expansion coefficient ================================= ============== ================================================================================================ diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index bb9ab1cbbdf..2f990484697 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -3833,6 +3833,8 @@ Local - Add stabilization only to interiors of macro elements.--> + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index c81efef7141..c4c0af4cf3e 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1450,6 +1450,8 @@ + + From d814b2213c1d15a988ff56581ecd64a25bea9dd2 Mon Sep 17 00:00:00 2001 From: Arnaud DUDES <155963334+arng40@users.noreply.github.com> Date: Mon, 11 Mar 2024 03:57:51 +0100 Subject: [PATCH 003/286] injection example fix (#2933) --- inputFiles/compositionalMultiphaseWell/co2flash.txt | 2 +- inputFiles/compositionalMultiphaseWell/pvtgas.txt | 4 ++-- inputFiles/compositionalMultiphaseWell/pvtliquid.txt | 2 +- integratedTests | 2 +- src/docs/sphinx/basicExamples/co2Injection/Example.rst | 10 +++++++--- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/inputFiles/compositionalMultiphaseWell/co2flash.txt b/inputFiles/compositionalMultiphaseWell/co2flash.txt index 033d013cc31..767338389fb 100644 --- a/inputFiles/compositionalMultiphaseWell/co2flash.txt +++ b/inputFiles/compositionalMultiphaseWell/co2flash.txt @@ -1 +1 @@ -FlashModel CO2Solubility 1e6 7.5e7 5e4 367.15 369.15 1 0 +FlashModel CO2Solubility 1.0e5 7.5e7 1e5 285.15 395.15 5 0 diff --git a/inputFiles/compositionalMultiphaseWell/pvtgas.txt b/inputFiles/compositionalMultiphaseWell/pvtgas.txt index 785e55ef684..30688e58cec 100644 --- a/inputFiles/compositionalMultiphaseWell/pvtgas.txt +++ b/inputFiles/compositionalMultiphaseWell/pvtgas.txt @@ -1,2 +1,2 @@ -DensityFun SpanWagnerCO2Density 1e6 7.5e7 5e4 367.15 369.15 1 -ViscosityFun FenghourCO2Viscosity 1e6 7.5e7 5e4 367.15 369.15 1 +DensityFun SpanWagnerCO2Density 1.0e5 7.5e7 1e5 285.15 395.15 5 +ViscosityFun FenghourCO2Viscosity 1.0e5 7.5e7 1e5 285.15 395.15 5 diff --git a/inputFiles/compositionalMultiphaseWell/pvtliquid.txt b/inputFiles/compositionalMultiphaseWell/pvtliquid.txt index cc514a9cae2..c2811b6c310 100644 --- a/inputFiles/compositionalMultiphaseWell/pvtliquid.txt +++ b/inputFiles/compositionalMultiphaseWell/pvtliquid.txt @@ -1,2 +1,2 @@ -DensityFun PhillipsBrineDensity 1e6 7.5e7 5e4 367.15 369.15 1 0 +DensityFun PhillipsBrineDensity 1.0e5 7.5e7 1e5 285.15 395.15 5 0 ViscosityFun PhillipsBrineViscosity 0 diff --git a/integratedTests b/integratedTests index c0cc4a087b5..90fe6f90014 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit c0cc4a087b555926c8e5509ff9f24d99cf261c77 +Subproject commit 90fe6f900143bcfe5125557e25b947308534e112 diff --git a/src/docs/sphinx/basicExamples/co2Injection/Example.rst b/src/docs/sphinx/basicExamples/co2Injection/Example.rst index cec5f2b464c..3076ae46b68 100644 --- a/src/docs/sphinx/basicExamples/co2Injection/Example.rst +++ b/src/docs/sphinx/basicExamples/co2Injection/Example.rst @@ -181,12 +181,12 @@ The *pvtgas.txt* and *pvtliquid.txt* files define the models used to compute the .. code:: - DensityFun SpanWagnerCO2Density 1e6 1.5e7 5e4 94 96 1 - ViscosityFun FenghourCO2Viscosity 1e6 1.5e7 5e4 94 96 + DensityFun SpanWagnerCO2Density 1.0e5 7.5e7 1e5 285.15 395.15 5 + ViscosityFun FenghourCO2Viscosity 1.0e5 7.5e7 1e5 285.15 395.15 5 .. code:: - DensityFun PhillipsBrineDensity 1e6 1.5e7 5e4 94 96 1 0 + DensityFun PhillipsBrineDensity 1.0e5 7.5e7 1e5 285.15 395.15 5 0 ViscosityFun PhillipsBrineViscosity 0 In these files, the first keyword of each line is an identifier for the model type (either a density or a viscosity model). @@ -218,6 +218,10 @@ Here, these fields are homogeneous, except for the permeability field that is ta .. _Outputs_tag_co2_field_case: +.. warning:: + This XML file example does not take into account elevation when imposing the intial pressure with ``initialPressure``. + Consider using a "HydrostraticEquilibrium" for a closer answer to modeled physical processes. + ------ Output ------ From 8ed595ab25b1197e078dd605a1a87f4b2aae275e Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Mon, 11 Mar 2024 17:35:11 -0500 Subject: [PATCH 004/286] Support sequential in SinglePhasePoromechanicsConformingFractures (#3007) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Delete inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_base.xml * directParallel=0 * Update poromechanicsFractures.ats --------- Co-authored-by: Pavel Tomin <“paveltomin@users.noreply.github.com”> Co-authored-by: Matteo Cusini --- ...c_conformingFracture_2d_faultSlip_base.xml | 48 ------ ...formingFracture_2d_faultSlip_benchmark.xml | 4 + ...ture_2d_faultSlip_sequential_benchmark.xml | 47 ++++++ ...Fracture_2d_faultSlip_sequential_smoke.xml | 54 ++++++ ...acture_2d_faultSlip_sequential_solvers.xml | 59 +++++++ ..._conformingFracture_2d_faultSlip_smoke.xml | 4 + ...onformingFracture_2d_faultSlip_solvers.xml | 51 ++++++ ...conformingFracture_2d_openingFrac_base.xml | 48 ------ ...peningFrac_horizontal_sequential_smoke.xml | 151 +++++++++++++++++ ...acture_2d_openingFrac_horizontal_smoke.xml | 4 + ...ture_2d_openingFrac_sequential_solvers.xml | 58 +++++++ ...formingFracture_2d_openingFrac_solvers.xml | 50 ++++++ ...ture_2d_openingFrac_vertical_benchmark.xml | 4 + ...ningFrac_vertical_sequential_benchmark.xml | 138 ++++++++++++++++ ..._openingFrac_vertical_sequential_smoke.xml | 154 ++++++++++++++++++ ...Fracture_2d_openingFrac_vertical_smoke.xml | 4 + .../poromechanicsFractures.ats | 14 ++ integratedTests | 2 +- .../contact/SolidMechanicsLagrangeContact.cpp | 94 +++++++++++ .../contact/SolidMechanicsLagrangeContact.hpp | 6 + .../multiphysics/PoromechanicsSolver.hpp | 4 +- 21 files changed, 899 insertions(+), 99 deletions(-) create mode 100755 inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_benchmark.xml create mode 100755 inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_smoke.xml create mode 100755 inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_solvers.xml create mode 100755 inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_solvers.xml create mode 100755 inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_horizontal_sequential_smoke.xml create mode 100755 inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_sequential_solvers.xml create mode 100755 inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_solvers.xml create mode 100755 inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_sequential_benchmark.xml create mode 100755 inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_sequential_smoke.xml diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml index a1f1bfdf98a..b811af3ef4a 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml @@ -1,54 +1,6 @@ - - - - - - - - - - - - - - - - + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_benchmark.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_benchmark.xml new file mode 100755 index 00000000000..d9312aade45 --- /dev/null +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_benchmark.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_smoke.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_smoke.xml new file mode 100755 index 00000000000..99098cfeb82 --- /dev/null +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_smoke.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_solvers.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_solvers.xml new file mode 100755 index 00000000000..845f3151232 --- /dev/null +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_sequential_solvers.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_smoke.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_smoke.xml index 42cee5e69c0..6da3d3746bd 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_smoke.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_smoke.xml @@ -1,6 +1,10 @@ + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_solvers.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_solvers.xml new file mode 100755 index 00000000000..2c8d9f8936b --- /dev/null +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_solvers.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_base.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_base.xml index 259cf4e34d8..6fab669691b 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_base.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_base.xml @@ -1,54 +1,6 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_horizontal_smoke.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_horizontal_smoke.xml index 3e9282ccb5d..993b40bfaae 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_horizontal_smoke.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_horizontal_smoke.xml @@ -1,6 +1,10 @@ + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_sequential_solvers.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_sequential_solvers.xml new file mode 100755 index 00000000000..4112be144f1 --- /dev/null +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_sequential_solvers.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_solvers.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_solvers.xml new file mode 100755 index 00000000000..cc365b429c6 --- /dev/null +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_solvers.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_benchmark.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_benchmark.xml index 897967aefa3..20c65d99a94 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_benchmark.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_benchmark.xml @@ -1,6 +1,10 @@ + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_sequential_benchmark.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_sequential_benchmark.xml new file mode 100755 index 00000000000..a7b5775a538 --- /dev/null +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_sequential_benchmark.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_sequential_smoke.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_sequential_smoke.xml new file mode 100755 index 00000000000..3feed452401 --- /dev/null +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_sequential_smoke.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_smoke.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_smoke.xml index 88891999ccb..3feed452401 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_smoke.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_vertical_smoke.xml @@ -1,6 +1,10 @@ + + + diff --git a/inputFiles/poromechanicsFractures/poromechanicsFractures.ats b/inputFiles/poromechanicsFractures/poromechanicsFractures.ats index 02dfc957812..5cbe443b5a9 100644 --- a/inputFiles/poromechanicsFractures/poromechanicsFractures.ats +++ b/inputFiles/poromechanicsFractures/poromechanicsFractures.ats @@ -26,6 +26,13 @@ decks = [ restart_step=0, check_step=10, restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="PoroElastic_conformingFracture_2d_openingFrac_horizontal_sequential_smoke", + description='PoroElastic conformingFracture 2d case (sequential)', + partitions=((1, 1, 1), (2, 2, 1)), + restart_step=0, + check_step=10, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( name="PoroElastic_conformingFracture_2d_openingFrac_vertical_smoke", description='PoroElastic conformingFracture 2d case', @@ -33,6 +40,13 @@ decks = [ restart_step=0, check_step=10, restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="PoroElastic_conformingFracture_2d_openingFrac_vertical_sequential_smoke", + description='PoroElastic conformingFracture 2d case (sequential)', + partitions=((1, 1, 1), (2, 2, 1)), + restart_step=0, + check_step=10, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( name="PoroElastic_efem-edfm_pressurizedFrac_smoke", description='poromechanics efem-edfm pressurized vertical frac', diff --git a/integratedTests b/integratedTests index 90fe6f90014..aaeda396397 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit 90fe6f900143bcfe5125557e25b947308534e112 +Subproject commit aaeda396397173c7fc2253dc3f4975365f33502c diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 82502764d63..2f690495827 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -548,6 +548,17 @@ void SolidMechanicsLagrangeContact::assembleSystem( real64 const time, localRhs ); assembleContact( domain, dofManager, localMatrix, localRhs ); + + // for sequenatial: add (fixed) pressure force contribution into residual (no derivatives) + if( m_isFixedStressPoromechanicsUpdate ) + { + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) + { + assembleForceResidualPressureContribution( mesh, regionNames, dofManager, localMatrix, localRhs ); + } ); + } } void SolidMechanicsLagrangeContact::assembleContact( DomainPartition & domain, @@ -568,6 +579,89 @@ void SolidMechanicsLagrangeContact::assembleContact( DomainPartition & domain, } ); } +void SolidMechanicsLagrangeContact:: + assembleForceResidualPressureContribution( MeshLevel const & mesh, + arrayView1d< string const > const & regionNames, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + GEOS_MARK_FUNCTION; + + FaceManager const & faceManager = mesh.getFaceManager(); + NodeManager const & nodeManager = mesh.getNodeManager(); + ElementRegionManager const & elemManager = mesh.getElemManager(); + + ArrayOfArraysView< localIndex const > const & faceToNodeMap = faceManager.nodeList().toViewConst(); + arrayView2d< real64 const > const & faceNormal = faceManager.faceNormal(); + + string const & dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + + arrayView1d< globalIndex const > const & + dispDofNumber = nodeManager.getReference< globalIndex_array >( dispDofKey ); + globalIndex const rankOffset = dofManager.rankOffset(); + + // Get the coordinates for all nodes + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodePosition = nodeManager.referencePosition(); + + elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, + [&]( localIndex const, + FaceElementSubRegion const & subRegion ) + { + arrayView1d< real64 const > const & pressure = subRegion.getReference< array1d< real64 > >( flow::pressure::key() ); + ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + + forAll< serialPolicy >( subRegion.size(), [=]( localIndex const kfe ) + { + localIndex const kf0 = elemsToFaces[kfe][0]; + localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( kf0 ); + + real64 Nbar[3]; + Nbar[ 0 ] = faceNormal[elemsToFaces[kfe][0]][0] - faceNormal[elemsToFaces[kfe][1]][0]; + Nbar[ 1 ] = faceNormal[elemsToFaces[kfe][0]][1] - faceNormal[elemsToFaces[kfe][1]][1]; + Nbar[ 2 ] = faceNormal[elemsToFaces[kfe][0]][2] - faceNormal[elemsToFaces[kfe][1]][2]; + LvArray::tensorOps::normalize< 3 >( Nbar ); + + globalIndex rowDOF[12]; + real64 nodeRHS[12]; + stackArray1d< real64, 12 > dRdP( 3*numNodesPerFace ); + + for( localIndex kf=0; kf<2; ++kf ) + { + localIndex const faceIndex = elemsToFaces[kfe][kf]; + + for( localIndex a=0; a nodalArea; + computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); + + real64 const nodalForceMag = -( pressure[kfe] ) * nodalArea[a]; + array1d< real64 > globalNodalForce( 3 ); + LvArray::tensorOps::scaledCopy< 3 >( globalNodalForce, Nbar, nodalForceMag ); + + for( localIndex i=0; i<3; ++i ) + { + rowDOF[3*a+i] = dispDofNumber[faceToNodeMap( faceIndex, a )] + LvArray::integerConversion< globalIndex >( i ); + // Opposite sign w.r.t. theory because of minus sign in stiffness matrix definition (K < 0) + nodeRHS[3*a+i] = +globalNodalForce[i] * pow( -1, kf ); + } + } + + for( localIndex idof = 0; idof < numNodesPerFace * 3; ++idof ) + { + localIndex const localRow = LvArray::integerConversion< localIndex >( rowDOF[idof] - rankOffset ); + + if( localRow >= 0 && localRow < localMatrix.numRows() ) + { + RAJA::atomicAdd( parallelHostAtomic{}, &localRhs[localRow], nodeRHS[idof] ); + } + } + } + } ); + } ); +} + real64 SolidMechanicsLagrangeContact::calculateResidualNorm( real64 const & time, real64 const & dt, DomainPartition const & domain, diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index f2999e54c01..8b665165759 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -123,6 +123,12 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ); + void assembleForceResidualPressureContribution( MeshLevel const & mesh, + arrayView1d< string const > const & regionNames, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ); + void assembleStabilization( MeshLevel const & mesh, NumericalMethodsManager const & numericalMethodManager, DofManager const & dofManager, diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index 6dfb59aaf1a..d4b3505373a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -94,7 +94,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER arrayView1d< string const > const & regionNames ) { ElementRegionManager & elementRegionManager = mesh.getElemManager(); - elementRegionManager.forElementSubRegions< ElementSubRegionBase >( regionNames, + elementRegionManager.forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, ElementSubRegionBase & subRegion ) { @@ -140,7 +140,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER { ElementRegionManager & elemManager = mesh.getElemManager(); - elemManager.forElementSubRegions< ElementSubRegionBase >( regionNames, + elemManager.forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, ElementSubRegionBase & subRegion ) { From 2323a028cd39b4c89f6e2f907cfae33f1ffadfca Mon Sep 17 00:00:00 2001 From: Joshua White Date: Tue, 12 Mar 2024 15:34:59 -0700 Subject: [PATCH 005/286] Switch min() to lowest() (#3034) --- src/coreComponents/mesh/utilities/ComputationalGeometry.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp index d90df153066..4b4383f6848 100644 --- a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp +++ b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp @@ -422,7 +422,7 @@ void getBoundingBox( localIndex const elemIndex, LvArray::NumericLimits< real64 >::max }; // boxDims is used to hold the max coordinates. - LvArray::tensorOps::fill< 3 >( boxDims, LvArray::NumericLimits< real64 >::min ); + LvArray::tensorOps::fill< 3 >( boxDims, LvArray::NumericLimits< real64 >::lowest ); // loop over all the vertices of the element to get the min and max coords for( localIndex a = 0; a < pointIndices.size( 1 ); ++a ) From b21a2800925211a7bf1464e83cc835f5a078152e Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 12 Mar 2024 15:50:10 -0700 Subject: [PATCH 006/286] Get cpu integrated tests running on streak. (#2991) * specify that cpu integratedTests to run on streak * run with np<=2 filter --- .github/workflows/build_and_test.yml | 30 +++++++++++++++---- .github/workflows/ci_tests.yml | 2 +- scripts/ci_build_and_test_in_container.sh | 11 ++++++- .../fileIO/timeHistory/HDFFile.cpp | 1 + 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 2da2c18ea9b..0564ce0c218 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -54,6 +54,15 @@ jobs: build_test_deploy: runs-on: ${{ inputs.RUNS_ON }} steps: + - name: 'Cleanup build folder' + run: | + pwd + echo "cleaning ${GITHUB_WORKSPACE}" + ls -la ./ + rm -rf ./* ./.*|| true + echo "expecting ${GITHUB_WORKSPACE} to be empty" + ls -la ./ + - name: Checkout Repository uses: actions/checkout@v4.1.1 with: @@ -181,11 +190,11 @@ jobs: echo "Download the bundle at https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/${DATA_BASENAME}" fi fi - - # Remove the container and the workspace to avoid any conflict with the next run. - echo github.workspace = ${{ github.workspace }} - #rm -rf ${{ github.workspace }}/* - #docker rm -f ${CONTAINER_NAME} + + # manually remove the workspace to avoid issues with the next job when using self-hosted runners + if [ -d "${GITHUB_WORKSPACE}/integratedTests" ]; then + rm -rf ${GITHUB_WORKSPACE}/integratedTests + fi exit ${EXIT_STATUS} @@ -196,4 +205,13 @@ jobs: files: geos_coverage.info.cleaned fail_ci_if_error: true env: - CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} \ No newline at end of file + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + - name: 'Cleanup build folder' + run: | + pwd + echo "cleaning ${GITHUB_WORKSPACE}" + ls -la ./ + rm -rf ./* ./.*|| true + echo "expecting ${GITHUB_WORKSPACE} to be empty" + ls -la ./ diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 46b45151698..dce33777940 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -200,7 +200,7 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF GCP_BUCKET: geosx/integratedTests - RUNS_ON: ubuntu-22.04 + RUNS_ON: self-hosted code_coverage: needs: diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index c292755a605..84e5966968a 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -1,6 +1,8 @@ #!/bin/bash set -o pipefail +export PYTHONDONTWRITEBYTECODE=1 + printenv SCRIPT_NAME=$0 @@ -174,7 +176,8 @@ if [[ "${RUN_INTEGRATED_TESTS}" = true ]]; then or_die apt-get install -y virtualenv python3-dev python-is-python3 ATS_PYTHON_HOME=/tmp/run_integrated_tests_virtualenv or_die virtualenv ${ATS_PYTHON_HOME} - ATS_CMAKE_ARGS="-DATS_ARGUMENTS=\"--machine openmpi --ats openmpi_mpirun=/usr/bin/mpirun --ats openmpi_args=--allow-run-as-root --ats openmpi_procspernode=2 --ats openmpi_maxprocs=2\" -DPython3_ROOT_DIR=${ATS_PYTHON_HOME}" + export ATS_FILTER="np<=2" + ATS_CMAKE_ARGS="-DATS_ARGUMENTS=\"--machine openmpi --ats openmpi_mpirun=/usr/bin/mpirun --ats openmpi_args=--allow-run-as-root --ats openmpi_procspernode=4 --ats openmpi_maxprocs=4\" -DPython3_ROOT_DIR=${ATS_PYTHON_HOME}" fi @@ -288,6 +291,12 @@ fi # Cleaning the build directory. or_die ninja clean + +# Clean the repository +or_die cd ${GEOS_SRC_DIR}/inputFiles +find . -name *.pyc | xargs rm -f + + # If we're here, either everything went OK or we have to deal with the integrated tests manually. if [[ ! -z "${INTEGRATED_TEST_EXIT_STATUS+x}" ]]; then echo "Exiting the build process with exit status ${INTEGRATED_TEST_EXIT_STATUS} from the integrated tests." diff --git a/src/coreComponents/fileIO/timeHistory/HDFFile.cpp b/src/coreComponents/fileIO/timeHistory/HDFFile.cpp index d9c046b86af..eda9360f14c 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFFile.cpp +++ b/src/coreComponents/fileIO/timeHistory/HDFFile.cpp @@ -77,6 +77,7 @@ HDFFile::~HDFFile() { if( m_mpioFapl ) { +// H5Fflush( m_fileId, H5F_SCOPE_GLOBAL ); H5Pclose( m_faplId ); } H5Fclose( m_fileId ); From 2dc91a107c982907ac90b0dfeec135649eeb7ae8 Mon Sep 17 00:00:00 2001 From: TotoGaz <49004943+TotoGaz@users.noreply.github.com> Date: Tue, 12 Mar 2024 16:26:28 -0700 Subject: [PATCH 007/286] Load pretty printers for LvArray in codespace (#3022) --- .devcontainer/postCreateCommand.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/postCreateCommand.sh index 7267acb2d1d..5a7ad497636 100755 --- a/.devcontainer/postCreateCommand.sh +++ b/.devcontainer/postCreateCommand.sh @@ -4,3 +4,5 @@ git submodule init git submodule deinit integratedTests git submodule update +# Load the pretty printer for LvArray +echo "source /workspaces/GEOS/src/coreComponents/LvArray/scripts/gdb-printers-shallow.py" > ~/.gdbinit From d8986246dab727e457faa48ebeee1c2d1fe6c36c Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Tue, 12 Mar 2024 18:27:21 -0500 Subject: [PATCH 008/286] Change METIS version (#3028) --- src/coreComponents/mainInterface/version.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/mainInterface/version.cpp b/src/coreComponents/mainInterface/version.cpp index 123025930d8..4c285e327c0 100644 --- a/src/coreComponents/mainInterface/version.cpp +++ b/src/coreComponents/mainInterface/version.cpp @@ -122,11 +122,11 @@ void outputVersionInfo() #endif #if defined(metis_VERSION) - GEOS_LOG_RANK_0( " - METIS version: " << STRINGIZE( METIS_VERSION ) ); + GEOS_LOG_RANK_0( " - METIS version: " << STRINGIZE( metis_VERSION ) ); #endif #if defined(parmetis_VERSION) - GEOS_LOG_RANK_0( " - PARAMETIS version: " << STRINGIZE( PARAMETIS_VERSION ) ); + GEOS_LOG_RANK_0( " - PARAMETIS version: " << STRINGIZE( parmetis_VERSION ) ); #endif #if defined(scotch_VERSION) From 965ea1764de0b0fd998f00b121ed8a5797723262 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 12 Mar 2024 18:50:30 -0500 Subject: [PATCH 009/286] Remove wrong zero diag check (#3033) --- .../IsothermalCompositionalMultiphaseBaseKernels.hpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp index 8adafb2945a..c5863e9bcad 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp @@ -782,13 +782,6 @@ class ElementBasedAssemblyKernel } } - - // check zero diagonal (works only in debug) - for( integer ic = 0; ic < numComp; ++ic ) - { - GEOS_ASSERT_MSG( LvArray::math::abs( stack.localJacobian[ic][ic] ) > minDensForDivision, - GEOS_FMT( "Zero diagonal in Jacobian: equation {}, value = {}", ic, stack.localJacobian[ic][ic] ) ); - } } /** From bc0f67a3bcc6b1bfdab1e7a57fb65a3ce89398d3 Mon Sep 17 00:00:00 2001 From: TotoGaz <49004943+TotoGaz@users.noreply.github.com> Date: Thu, 14 Mar 2024 18:36:43 -0700 Subject: [PATCH 010/286] Fixes spikes when importing fractures in parallel (#3020) --- .../codingUtilities/Utilities.hpp | 48 ++- .../codingUtilities/tests/CMakeLists.txt | 3 +- .../codingUtilities/tests/testUtilities.cpp | 35 ++ .../fileIO/vtk/VTKPolyDataWriterInterface.cpp | 2 +- .../mesh/FaceElementSubRegion.cpp | 364 ++++++++++++++---- .../mesh/generators/VTKFaceBlockUtilities.cpp | 120 +++--- 6 files changed, 439 insertions(+), 133 deletions(-) create mode 100644 src/coreComponents/codingUtilities/tests/testUtilities.cpp diff --git a/src/coreComponents/codingUtilities/Utilities.hpp b/src/coreComponents/codingUtilities/Utilities.hpp index b6e39ba6667..fcecf9a6dec 100644 --- a/src/coreComponents/codingUtilities/Utilities.hpp +++ b/src/coreComponents/codingUtilities/Utilities.hpp @@ -209,6 +209,31 @@ VAL findOption( mapBase< KEY, VAL, SORTED > const & map, return iter->second; } +namespace +{ + +/** + * @brief Apply functor @p transformer onto the map elements and store the results into a container of type @p C. + * @tparam MAP Type of the considered map. + * @tparam C Type of the container holding the keys. + * @tparam TRANSFORMER Type of the unary functor. + * @param[in] map The map from which keys will be extracted. + * @param transformer Which unary functor to apply to the @p map elements. + * @return The container with the results for the @p transformer application. + */ +template< template< typename ... > class C, typename MAP, typename TRANSFORMER > +auto mapTransformer( MAP const & map, + TRANSFORMER const & transformer ) +{ + using v = typename std::result_of< TRANSFORMER( typename MAP::const_reference ) >::type; + C< v > result; + auto inserter = std::inserter( result, result.end() ); + std::transform( map.begin(), map.end(), inserter, transformer ); + return result; +} + +} + /** * @brief Extract the keys from the given map. * @tparam MAP Type of the considered map. @@ -219,11 +244,24 @@ VAL findOption( mapBase< KEY, VAL, SORTED > const & map, template< template< typename ... > class C = std::vector, typename MAP > C< typename MAP::key_type > mapKeys( MAP const & map ) { - C< typename MAP::key_type > keys; - auto transformer = []( auto const & p ) { return p.first; }; - auto inserter = std::inserter( keys, keys.end() ); - std::transform( map.begin(), map.end(), inserter, transformer ); - return keys; + auto transformer = []( auto const & p ) -> typename MAP::key_type + { return p.first; }; + return mapTransformer< C >( map, transformer ); +} + +/** + * @brief Extract the values from the given map. + * @tparam MAP Type of the considered map. + * @tparam C Type of the container holding the values. + * @param[in] map The map from which values will be extracted. + * @return The container with the values. + */ +template< template< typename ... > class C = std::vector, typename MAP > +C< typename MAP::mapped_type > mapValues( MAP const & map ) +{ + auto transformer = []( typename MAP::const_reference p ) -> typename MAP::mapped_type + { return p.second; }; + return mapTransformer< C >( map, transformer ); } namespace internal diff --git a/src/coreComponents/codingUtilities/tests/CMakeLists.txt b/src/coreComponents/codingUtilities/tests/CMakeLists.txt index f70776694a0..f6009a67062 100644 --- a/src/coreComponents/codingUtilities/tests/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/tests/CMakeLists.txt @@ -2,7 +2,8 @@ set( testSources testGeosxTraits.cpp testStringUtilities.cpp - testParsing.cpp ) + testParsing.cpp + testUtilities.cpp ) set( dependencyList gtest codingUtilities ${parallelDeps} ) diff --git a/src/coreComponents/codingUtilities/tests/testUtilities.cpp b/src/coreComponents/codingUtilities/tests/testUtilities.cpp new file mode 100644 index 00000000000..94a3147a245 --- /dev/null +++ b/src/coreComponents/codingUtilities/tests/testUtilities.cpp @@ -0,0 +1,35 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "codingUtilities/Utilities.hpp" + +#include + +#include + +using namespace geos; + +TEST( Utilities, MapExtraction ) +{ + std::map< string, int > const m{ + { "k0", 0 }, + { "k1", 1 }, + { "k2", 2 } + }; + + EXPECT_EQ( mapKeys( m ), std::vector< string >( { "k0", "k1", "k2" } ) ); + EXPECT_EQ( mapKeys< std::set >( m ), std::set< string >( { "k0", "k1", "k2" } ) ); + EXPECT_EQ( mapValues( m ), std::vector< int >( { 0, 1, 2 } ) ); + EXPECT_EQ( mapValues< std::set >( m ), std::set< int >( { 0, 1, 2 } ) ); +} diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp index fce83637687..7428485e820 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp @@ -143,7 +143,7 @@ static std::vector< int > getVtkConnectivity( ElementType const elementType, loc case ElementType::Vertex: return { 0 }; case ElementType::Line: return { 0, 1 }; case ElementType::Triangle: return { 0, 1, 2 }; - case ElementType::Quadrilateral: return { 0, 1, 3, 2 }; + case ElementType::Quadrilateral: return { 0, 1, 2, 3 }; case ElementType::Polygon: return { }; // TODO case ElementType::Tetrahedron: return { 0, 1, 2, 3 }; case ElementType::Pyramid: return { 0, 1, 3, 2, 4 }; diff --git a/src/coreComponents/mesh/FaceElementSubRegion.cpp b/src/coreComponents/mesh/FaceElementSubRegion.cpp index 894071a752c..4c9b6cd7157 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.cpp @@ -363,7 +363,7 @@ localIndex FaceElementSubRegion::unpackUpDownMaps( buffer_unit_type const * & bu * in the sense that each @p face for a given index must "belong" to @p 3d @p element at the same index. * @param[in] fractureName The name of the fracture for which we're checking the mapping consistency. * @param[in] elem2dToElems3d A mapping. - * @param[inout] elem2dToFaces This mapping will be corrected if needed to match @p elem2dToElems3d. + * @param[in,out] elem2dToFaces This mapping will be corrected if needed to match @p elem2dToElems3d. */ void fixNeighborMappingsInconsistency( string const & fractureName, OrderedVariableToManyElementRelation const & elem2dToElems3d, @@ -474,30 +474,48 @@ std::map< globalIndex, globalIndex > buildReferenceCollocatedNodes( ArrayOfArray /** - * @brief Returns a mapping that links any collocated edge to the collocated edge with the lowest index. - * @param referenceCollocatedNodes The mapping that links any collocated node to its collocated node with the lowest index. - * @param nl2g The local to glocal mapping for nodes. - * @param edgeToNodes The edge to nodes mapping. - * @param elem2dToEdges The 2d elem to edges mapping. - * @param edgeGhostRanks The ghost rank of the edges. - * @return The computed map. + * @brief Computes the mapping which links a pair of collocated nodes + * to all the edges having their nodes collocated to this key pair of nodes. + * @param referenceCollocatedNodes Mapping that link all the collocated nodes + * to the collocated node with the lowest index (considered as a reference). + * The reference node can then be used to make connection between geometrical objects + * relying on collocated nodes (in the case of this function, edges). + * @param nl2g The node local to global mapping. + * @param edgeToNodes The mapping from local edges to local nodes. + * @return The computed mapping. + * @details For each edge based on collocated nodes (i.e. each edge on the fracture), + * we consider each node and compute the reference collocated node. + * There will be multiple edges with the same pair of reference collocated nodes. + * This information is contained in the returned mapping. */ -std::map< localIndex, localIndex > buildReferenceCollocatedEdges( std::map< globalIndex, globalIndex > const & referenceCollocatedNodes, - arrayView1d< globalIndex const > const nl2g, - EdgeManager::NodeMapType const & edgeToNodes, - ArrayOfArraysView< localIndex const > const elem2dToEdges, - arrayView1d< integer const > edgeGhostRanks ) +std::map< std::pair< globalIndex, globalIndex >, std::set< localIndex > > +buildCollocatedEdgeBuckets( std::map< globalIndex, globalIndex > const & referenceCollocatedNodes, + arrayView1d< globalIndex const > const nl2g, + arrayView2d< localIndex const > const edgeToNodes ) { - // `edgeIds` maps the nodes of the edges of the face element sub-region to its index. + GEOS_ASSERT_EQ( edgeToNodes.size( 1 ), 2 ); + static constexpr std::string_view nodeNotFound = "Internal error when trying to access the reference collocated node for global node {}."; + + // Checks if the node `gni` is handled as a collocated node on the curren rank. + auto hasCollocatedNode = [&]( globalIndex const gni ) -> bool + { + return referenceCollocatedNodes.find( gni ) != referenceCollocatedNodes.cend(); + }; + + // `edgeIds` is a temporary container that maps the two nodes of any edge of all the face elements, + // to the local index of the edge itself. We fill this container using the `edgeToNodes` mapping + // because we want to be sure to test all the combinations of nodes, + // and therefore not to forget any possible edge. + // It's important to note that the key of `edgeIds` are the global indices of the nodes, in no particular order. std::map< std::pair< globalIndex, globalIndex >, localIndex > edgesIds; - for( int ei = 0; ei < elem2dToEdges.size(); ++ei ) + for( localIndex lei = 0; lei < edgeToNodes.size( 0 ); ++lei ) { - for( localIndex const & edi: elem2dToEdges[ei] ) + auto const & nodes = edgeToNodes[lei]; + globalIndex const & gni0 = nl2g[nodes[0]]; + globalIndex const & gni1 = nl2g[nodes[1]]; + if( hasCollocatedNode( gni0 ) && hasCollocatedNode( gni1 ) ) { - auto const nodes = edgeToNodes[edi]; - GEOS_ASSERT_EQ( nodes.size(), 2 ); - auto const p = std::minmax( { nl2g[nodes[0]], nl2g[nodes[1]] } ); - edgesIds[p] = edi; + edgesIds[{ gni0, gni1 }] = lei; } } @@ -506,22 +524,36 @@ std::map< localIndex, localIndex > buildReferenceCollocatedEdges( std::map< glob // But this trick lets us define some kind of _hash_ that allows to compare the location of the edges: // edges sharing the same hash lie in the same position. std::map< std::pair< globalIndex, globalIndex >, std::set< localIndex > > collocatedEdgeBuckets; - // The `collocatedEdgeIds` map gathers all the collocated edges together. for( auto const & p: edgesIds ) { std::pair< globalIndex, globalIndex > const & nodes = p.first; localIndex const & edge = p.second; auto it0 = referenceCollocatedNodes.find( nodes.first ); - globalIndex const n0 = it0 != referenceCollocatedNodes.cend() ? it0->second : nodes.first; + GEOS_ERROR_IF( it0 == referenceCollocatedNodes.cend(), GEOS_FMT( nodeNotFound, nodes.first ) ); + globalIndex const n0 = it0->second; auto it1 = referenceCollocatedNodes.find( nodes.second ); - globalIndex const n1 = it1 != referenceCollocatedNodes.cend() ? it1->second : nodes.second; + GEOS_ERROR_IF( it1 == referenceCollocatedNodes.cend(), GEOS_FMT( nodeNotFound, nodes.second ) ); + globalIndex const n1 = it1->second; std::pair< globalIndex, globalIndex > const edgeHash = std::minmax( n0, n1 ); collocatedEdgeBuckets[edgeHash].insert( edge ); } + return collocatedEdgeBuckets; +} + + +/** + * @brief Returns a mapping that links any collocated edge to the collocated edge with the lowest index. + * @param collocatedEdgeBuckets Links the pairs of reference collocated nodes to the edges overlapping those nodes (even with other nodes). + * @param edgeGhostRanks The ghost rank of the edges. + * @return The computed mapping. + */ +std::map< localIndex, localIndex > buildReferenceCollocatedEdges( std::map< std::pair< globalIndex, globalIndex >, std::set< localIndex > > const & collocatedEdgeBuckets, + arrayView1d< integer const > const edgeGhostRanks ) +{ std::map< localIndex, localIndex > referenceCollocatedEdges; // We want to consider in priority the edges that are owned by the rank. @@ -568,20 +600,20 @@ SortedArray< localIndex > makeSortedArrayIota( localIndex newSize, localIndex va /** * @brief Builds the 2d face to 2d elements mapping. - * @param num2dFaces The number of 2d faces. - * @param num2dElems The number of 2d elements. * @param elem2dToEdges The 2d element (geometrical faces in 3d) to edges mapping. * @param edgesTo2dFaces The edges to 2d faces (geometrical edges in 3d) mapping. * @param referenceCollocatedEdges The mapping that, for a given edge index, returns the collocated edge with lowest index. * @return The computed mapping. */ -ArrayOfArrays< geos::localIndex > build2dFaceTo2dElems( std::size_t num2dFaces, - localIndex num2dElems, - ArrayOfArraysView< localIndex const > const elem2dToEdges, +ArrayOfArrays< geos::localIndex > build2dFaceTo2dElems( ArrayOfArraysView< localIndex const > const elem2dToEdges, map< localIndex, localIndex > const & edgesTo2dFaces, std::map< geos::localIndex, geos::localIndex > const & referenceCollocatedEdges ) { - ArrayOfArrays< localIndex > m_2dFaceTo2dElems; + ArrayOfArrays< localIndex > face2dTo2dElems; + + auto const num2dElems = elem2dToEdges.size(); + auto const num2dFaces = edgesTo2dFaces.size(); + // `tmp` contains the 2d face to 2d elements mappings as a `std` container. // Eventually, it's copied into an `LvArray` container. std::vector< std::vector< localIndex > > tmp( num2dFaces ); @@ -589,6 +621,10 @@ ArrayOfArrays< geos::localIndex > build2dFaceTo2dElems( std::size_t num2dFaces, { for( auto const & e: elem2dToEdges[i] ) { + if( e < 0 ) + { + continue; + } tmp[edgesTo2dFaces.at( referenceCollocatedEdges.at( e ) )].push_back( i ); } } @@ -598,64 +634,245 @@ ArrayOfArrays< geos::localIndex > build2dFaceTo2dElems( std::size_t num2dFaces, { sizes.push_back( t.size() ); } - for( auto i = 0; i < m_2dFaceTo2dElems.size(); ++i ) - { - m_2dFaceTo2dElems.clearArray( i ); - } - m_2dFaceTo2dElems.resizeFromCapacities< serialPolicy >( sizes.size(), sizes.data() ); + + face2dTo2dElems.resizeFromCapacities< serialPolicy >( sizes.size(), sizes.data() ); for( std::size_t i = 0; i < tmp.size(); ++i ) { for( std::size_t j = 0; j < tmp[i].size(); ++j ) { - m_2dFaceTo2dElems.emplaceBack( i, tmp[i][j] ); + face2dTo2dElems.emplaceBack( i, tmp[i][j] ); } } - return m_2dFaceTo2dElems; + return face2dTo2dElems; } -void FaceElementSubRegion::fixSecondaryMappings( NodeManager const & nodeManager, - EdgeManager const & edgeManager, - FaceManager const & faceManager, - ElementRegionManager const & elemManager ) +/** + * @brief Adds some missing connections to the @p elem2dToNodes mapping. + * @param[in] elem2dToCollocatedNodesBuckets The bucket of all the collocated nodes nodes, for each 2d element. + * @param[in] ng2l The global to local node mapping. + * @param[in,out] elem2dToNodes The 2d element to nodes mapping that will receive new connections + * @details Due to the specific way 2d elements are managing nodes, some connections may be missing before the ghosting process. + * After the ghosting has been performed, those connections can be added using this function. + * @note This functions is meant to be called after the ghosting has occurred. + */ +void fillMissing2dElemToNodes( ArrayOfArrays< array1d< globalIndex > > const & elem2dToCollocatedNodesBuckets, + unordered_map< globalIndex, localIndex > const & ng2l, + ArrayOfArrays< localIndex > & elem2dToNodes ) { - arrayView1d< globalIndex const > const nl2g = nodeManager.localToGlobalMap(); + auto const num2dElems = elem2dToNodes.size(); - // First let's create the reference mappings for both nodes and edges. - std::map< globalIndex, globalIndex > const referenceCollocatedNodes = buildReferenceCollocatedNodes( m_2dElemToCollocatedNodesBuckets ); - std::map< localIndex, localIndex > const referenceCollocatedEdges = - buildReferenceCollocatedEdges( referenceCollocatedNodes, nl2g, edgeManager.nodeList(), m_toEdgesRelation.toViewConst(), edgeManager.ghostRank().toViewConst() ); + // We loop over all the collocated nodes attached to the 2d elements. + // If a node is on the rank while not attached to the 2d element, then we add a connection. + for( int e2d = 0; e2d < num2dElems; ++e2d ) + { + auto bucket = elem2dToCollocatedNodesBuckets[e2d]; + for( array1d< globalIndex > const & collocatedNodes: bucket ) + { + for( globalIndex const & collocatedNode: collocatedNodes ) + { + auto g2l = ng2l.find( collocatedNode ); + if( g2l != ng2l.cend() ) + { + localIndex const lni = g2l->second; + auto nodes = elem2dToNodes[e2d]; + if( std::find( nodes.begin(), nodes.end(), lni ) == nodes.end() ) + { + elem2dToNodes.emplaceBack( e2d, lni ); + } + } + } + } + } +} - localIndex const num2dElems = this->size(); - localIndex const num2dFaces = LvArray::integerConversion< localIndex >( referenceCollocatedEdges.size() ); + +/** + * @brief Adds some missing connections to the @p elem2dToEdges mapping. + * @param[in] elem2dToNodes The 2d elements to nodes mappings. + * @param[in] nodesToEdges The nodes to edges mapping. + * @param[in] nl2g The global to local mapping for nodes. + * @param[in] referenceCollocatedNodes A mapping that link all each collocated node to the node that must be used as a reference. + * @param[in] collocatedEdgeBuckets A specific mapping that links all pair of collocated nodes + * to the reference edge built on top of the two locations. + * @param[in,out] elem2dToEdges The 2d element to edges that will be completed/corrected. + * @details The @p elem2dToEdges is (for the moment) used to build connection between the 2d elements. + * Due to the specific way 2d elements are managing nodes, before the ghosting process: + * - some edges may be missing, + * - some edges may be "wrong" (in the sense where there may be multiple collocated edges, + * and we must be sure that all the elements use the same reference edges). + * After the ghosting's been performed, those connections can be reset. + */ +void fillMissing2dElemToEdges( ArrayOfArraysView< localIndex const > const elem2dToNodes, + ArrayOfSetsView< localIndex const > const nodesToEdges, + arrayView1d< globalIndex const > const nl2g, + std::map< globalIndex, globalIndex > const & referenceCollocatedNodes, + std::map< std::pair< globalIndex, globalIndex >, std::set< localIndex > > const & collocatedEdgeBuckets, + ArrayOfArrays< localIndex > & elem2dToEdges ) +{ + localIndex const num2dElems = elem2dToNodes.size(); + for( localIndex e2d = 0; e2d < num2dElems; ++e2d ) + { + auto const numNodes = elem2dToNodes.sizeOfArray( e2d ); + auto const numEdges = elem2dToEdges.sizeOfArray( e2d ); + if( 2 * numEdges == numNodes ) + { + // If the previous conditions is true, all the information could be constructed and therefore should be OK. + // There's no need to proceed. + continue; + } + + // `nodesOfEdgesTouching2dElem` deals with the edges that have at least one point touching the 2d element. + // While `nodesOfEdgesOf2dElem` deals with the edges for which all two nodes are on the 2d element. + // For both mappings, the key is the edge index and the values are the local nodes indices of the concerned edges. + std::map< localIndex, std::vector< localIndex > > nodesOfEdgesTouching2dElem, nodesOfEdgesOf2dElem; + for( localIndex const & n: elem2dToNodes[e2d] ) + { + for( localIndex const & e: nodesToEdges[n] ) + { + nodesOfEdgesTouching2dElem[e].push_back( n ); + } + } + for( auto const & ens: nodesOfEdgesTouching2dElem ) + { + if( ens.second.size() == 2 ) + { + nodesOfEdgesOf2dElem.insert( ens ); + } + } + // We are now recomputing all the edges of the 2d elements. + // Even if some edges were already present in the initial `elem2dToEdges` mapping, + // we'll ditch them and start with a new collection. + std::set< localIndex > allEdgesOf2dElem; + for( auto const & ens: nodesOfEdgesOf2dElem ) + { + std::vector< localIndex > const & nodesOfEdge = ens.second; + globalIndex const & gn0 = referenceCollocatedNodes.at( nl2g[ nodesOfEdge[0] ] ); + globalIndex const & gn1 = referenceCollocatedNodes.at( nl2g[ nodesOfEdge[1] ] ); + std::set< localIndex > candidateEdges = collocatedEdgeBuckets.at( std::minmax( { gn0, gn1 } ) ); + auto const min = std::min_element( candidateEdges.cbegin(), candidateEdges.cend() ); + allEdgesOf2dElem.insert( *min ); + } + elem2dToEdges.clearArray( e2d ); + for( localIndex const & e: allEdgesOf2dElem ) + { + elem2dToEdges.emplaceBack( e2d, e ); + } + } +} + + +/** + * @brief Builds a 2d face to edges mapping + * @param referenceCollocatedEdges Maps all the collocated edges to a single reference collocated edge. + * @return A 1d array that maps local index of a 2d face to the equivalent (3d) reference edge. + * @details The @p referenceCollocatedEdges input basically contains all the edges of the fracture. + * This function only selects the reference edges and builds a 2d face for each. + * The 2d face ordering is more or less random (actually it's sorted on the index of the reference edge). + * But the ordering is not critical as long as it's consistent withing the fracture. + */ +array1d< localIndex > build2dFaceToEdge( std::map< localIndex, localIndex > const & referenceCollocatedEdges ) +{ + std::set< localIndex > const referenceEdges = mapValues< std::set >( referenceCollocatedEdges ); + + localIndex const num2dFaces = LvArray::integerConversion< localIndex >( referenceEdges.size() ); // For the `m_2dFaceToEdge`, we can select any values that we want. // But then we need to be consistent... - m_2dFaceToEdge.clear(); - m_2dFaceToEdge.reserve( num2dFaces ); - for( auto const & p: referenceCollocatedEdges ) + array1d< localIndex > face2dToEdge; + face2dToEdge.reserve( num2dFaces ); + for( localIndex const & refEdge: referenceEdges ) { - globalIndex const & refEdge = p.second; - m_2dFaceToEdge.emplace_back( refEdge ); + face2dToEdge.emplace_back( refEdge ); } + GEOS_ASSERT_EQ( num2dFaces, face2dToEdge.size() ); + + return face2dToEdge; +} + + +/** + * @brief Builds the edges to 2d faces mappings by inverting the 2d faces to edges mappings. + * @param face2dToEdges The mappings to be inverted. + * @return The mapping + */ +map< localIndex, localIndex > buildEdgesToFace2d( arrayView1d< localIndex const > const face2dToEdges ) +{ + map< localIndex, localIndex > edgesToFace2d; + localIndex const num2dFaces = face2dToEdges.size(); - // `m_edgesTo2dFaces` is computed by the simple inversion of `m_2dFaceToEdge` - m_edgesTo2dFaces.clear(); for( localIndex i = 0; i < num2dFaces; ++i ) { - m_edgesTo2dFaces[m_2dFaceToEdge[i]] = i; + edgesToFace2d[face2dToEdges[i]] = i; + } + + GEOS_ASSERT_EQ_MSG( LvArray::integerConversion< localIndex >( edgesToFace2d.size() ), num2dFaces, "Internal error. The mappings `edgesToFace2d` and `face2dToEdges` should have the same size" ); + + return edgesToFace2d; +} + + +/** + * @brief Uses the two input mappings to reorder the @p elem2dToNodes mapping. + * @param[in] elem2dToFaces The 2d element to faces mapping. + * @param[in] facesToNodes The face to nodes mapping. + * @param[out] elem2dToNodes The 2d element to nodes that will be overwritten. + * @details The @p elem2dToNodes a priori does not respect any specific nodes order. + * But the vtk output expects the first half of the nodes to make a first face (in the correct order), + * and the second to make a second face. But nothing imposes this in our design. + * Even if we should have a more explicit design, + * the current function resets this implicit information in our mappings. + */ +void fixNodesOrder( ArrayOfArraysView< localIndex const > const elem2dToFaces, + ArrayOfArraysView< localIndex const > const facesToNodes, + ArrayOfArrays< localIndex > & elem2dToNodes ) +{ + localIndex const num2dElems = elem2dToNodes.size(); + for( localIndex e2d = 0; e2d < num2dElems; ++e2d ) + { + std::vector< localIndex > nodesOfFace; + for( localIndex fi: elem2dToFaces[e2d] ) + { + for( localIndex ni: facesToNodes[fi] ) + { + nodesOfFace.push_back( ni ); + } + } + elem2dToNodes.clearArray( e2d ); + elem2dToNodes.appendToArray( e2d, nodesOfFace.cbegin(), nodesOfFace.cend() ); } +} + +void FaceElementSubRegion::fixSecondaryMappings( NodeManager const & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + ElementRegionManager const & elemManager ) +{ + arrayView1d< globalIndex const > const nl2g = nodeManager.localToGlobalMap(); + ArrayOfArraysView< localIndex const > const faceToNodes = faceManager.nodeList().toViewConst(); + + // First let's create the reference mappings for both nodes and edges. + std::map< globalIndex, globalIndex > const referenceCollocatedNodes = buildReferenceCollocatedNodes( m_2dElemToCollocatedNodesBuckets ); + + fillMissing2dElemToNodes( m_2dElemToCollocatedNodesBuckets, nodeManager.globalToLocalMap(), m_toNodesRelation ); + + std::map< std::pair< globalIndex, globalIndex >, std::set< localIndex > > const collocatedEdgeBuckets = buildCollocatedEdgeBuckets( referenceCollocatedNodes, nl2g, edgeManager.nodeList() ); + std::map< localIndex, localIndex > const referenceCollocatedEdges = buildReferenceCollocatedEdges( collocatedEdgeBuckets, edgeManager.ghostRank() ); + + m_2dFaceToEdge = build2dFaceToEdge( referenceCollocatedEdges ); + m_edgesTo2dFaces = buildEdgesToFace2d( m_2dFaceToEdge.toViewConst() ); + + localIndex const num2dElems = this->size(); + localIndex const num2dFaces = m_2dFaceToEdge.size(); // Mark 2d elements and their connections as "new" so they get considered during the stencil computations. // This is mainly due to the dynamic process of the fracture propagation and the legacy unique way to import the fracture // by splitting the mesh during the first steps of the simulations. m_newFaceElements = makeSortedArrayIota( num2dElems ); m_recalculateConnectionsFor2dFaces = makeSortedArrayIota( num2dFaces ); - m_2dFaceTo2dElems = build2dFaceTo2dElems( num2dFaces, num2dElems, m_toEdgesRelation.toViewConst(), m_edgesTo2dFaces, referenceCollocatedEdges ); - // When a fracture element has only one (or less!) neighbor, let's try to find the other one. // The `ElemPath` provides all the information of a given face: obviously its face index, // but also the element index that touch the face, and the node indices of the face as well. @@ -674,7 +891,7 @@ void FaceElementSubRegion::fixSecondaryMappings( NodeManager const & nodeManager }; // We are building the mapping that connects all the reference (collocated) nodes of any face to the elements those nodes are touching. - // Using this nodal information will let use reconnect the fracture 2d element to its 3d neighbor. + // Using this nodal information will let us reconnect the fracture 2d element to its 3d neighbor. std::map< std::set< globalIndex >, std::set< ElemPath > > faceRefNodesToElems; elemManager.forElementSubRegionsComplete< CellElementSubRegion >( [&]( localIndex const er, localIndex const esr, @@ -682,7 +899,6 @@ void FaceElementSubRegion::fixSecondaryMappings( NodeManager const & nodeManager CellElementSubRegion const & subRegion ) { auto const & elemToFaces = subRegion.faceList().base(); - auto const & faceToNodes = faceManager.nodeList(); for( localIndex ei = 0; ei < elemToFaces.size( 0 ); ++ei ) { for( auto const & face: elemToFaces[ei] ) @@ -705,18 +921,16 @@ void FaceElementSubRegion::fixSecondaryMappings( NodeManager const & nodeManager } // We still double-check that all the nodes of the face were found, // even if there's no chance for this entry to successfully match any request. - if( nodesOfFace.size() == LvArray::integerConversion< std::size_t >( faceToNodes[face].size() ) ) + auto const & nodes = faceToNodes[face]; + if( nodesOfFace.size() == LvArray::integerConversion< std::size_t >( nodes.size() ) ) { - std::vector< localIndex > const nodes( faceToNodes[face].begin(), faceToNodes[face].end() ); - faceRefNodesToElems[nodesOfFace].insert( ElemPath{ er, esr, ei, face, nodes } ); + std::vector< localIndex > const ns( nodes.begin(), nodes.end() ); + faceRefNodesToElems[nodesOfFace].insert( ElemPath{ er, esr, ei, face, ns } ); } } } } ); - // The `misMatches` array will contain fracture element that did not find all of its neighbors. - // This is used to display a more precise error message. - std::vector< localIndex > misMatches; // Here we loop over all the elements of the fracture. // When there's neighbor missing, we search for a face that would lie on the collocated nodes of the fracture element. for( int e2d = 0; e2d < num2dElems; ++e2d ) @@ -769,16 +983,17 @@ void FaceElementSubRegion::fixSecondaryMappings( NodeManager const & nodeManager m_toFacesRelation.emplaceBack( e2d, path.face ); for( localIndex const & n: path.nodes ) { - m_toNodesRelation.emplaceBack( e2d, n ); + auto currentNodes = m_toNodesRelation[e2d]; + if( std::find( currentNodes.begin(), currentNodes.end(), n ) == currentNodes.end() ) + { + m_toNodesRelation.emplaceBack( e2d, n ); + } } } } } } - GEOS_ERROR_IF( !misMatches.empty(), - "Fracture " << this->getName() << " has elements {" << stringutilities::join( misMatches, ", " ) << "} without two neighbors." ); - // Checking that each face has two neighboring elements. // If not, we pop up an error. std::vector< localIndex > isolatedFractureElements; @@ -792,7 +1007,18 @@ void FaceElementSubRegion::fixSecondaryMappings( NodeManager const & nodeManager GEOS_ERROR_IF( !isolatedFractureElements.empty(), "Fracture " << this->getName() << " has elements {" << stringutilities::join( isolatedFractureElements, ", " ) << "} with less than two neighbors." ); + fillMissing2dElemToEdges( m_toNodesRelation.toViewConst(), + nodeManager.edgeList().toViewConst(), + nl2g, + referenceCollocatedNodes, + collocatedEdgeBuckets, + m_toEdgesRelation ); + + m_2dFaceTo2dElems = build2dFaceTo2dElems( m_toEdgesRelation.toViewConst(), m_edgesTo2dFaces, referenceCollocatedEdges ); + fixNeighborMappingsInconsistency( getName(), m_2dElemToElems, m_toFacesRelation ); + + fixNodesOrder( m_toFacesRelation.toViewConst(), faceToNodes, m_toNodesRelation ); } void FaceElementSubRegion::inheritGhostRankFromParentFace( FaceManager const & faceManager, diff --git a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp index f76540ce576..3e7108ca858 100644 --- a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp @@ -176,16 +176,18 @@ ArrayOfArrays< localIndex > build2dElemTo2dNodes( vtkSmartPointer< vtkDataSet > ArrayOfArrays< array1d< globalIndex > > buildCollocatedNodesBucketsOf2dElemsMap( ArrayOfArrays< localIndex > const & elem2dTo2dNodes, ArrayOfArrays< globalIndex > const & nodes2dToCollocatedNodes ) { + localIndex const num2dElems = elem2dTo2dNodes.size(); ArrayOfArrays< array1d< globalIndex > > result; // Allocation... - result.resize( elem2dTo2dNodes.size() ); - for( localIndex e2d = 0; e2d < elem2dTo2dNodes.size(); ++e2d ) + result.resize( num2dElems ); + for( localIndex e2d = 0; e2d < num2dElems; ++e2d ) { result.resizeArray( e2d, elem2dTo2dNodes[e2d].size() ); } - for( localIndex e2d = 0; e2d < elem2dTo2dNodes.size(); ++e2d ) + for( localIndex e2d = 0; e2d < num2dElems; ++e2d ) { - for( integer ni = 0; ni < elem2dTo2dNodes[e2d].size(); ++ni ) + auto const numNodes = elem2dTo2dNodes[e2d].size(); + for( integer ni = 0; ni < numNodes; ++ni ) { auto & dest = result( e2d, ni ); localIndex const node = elem2dTo2dNodes[e2d][ni]; @@ -269,7 +271,8 @@ ArrayOfArrays< localIndex > buildFace2dToElems2d( vtkPolyData * edges, * @param edges[in] The edges as computed by vtk. * @param collocatedNodes[in] The collocated nodes information. * @param nodeToEdges[in] The node to edges mapping. - * @return The 2d face to 3d edge mapping. + * @return The 2d face to 3d edge mapping. In the case where the face is at the boundary of the MPI domain, + * then the edge index will be set to @e -1 for further actions. */ array1d< localIndex > buildFace2dToEdge( vtkIdTypeArray const * globalPtIds, vtkPolyData * edges, @@ -314,7 +317,11 @@ array1d< localIndex > buildFace2dToEdge( vtkIdTypeArray const * globalPtIds, } } auto const res = std::max_element( edgeCount.cbegin(), edgeCount.cend(), comp ); - face2dToEdge[i] = LvArray::integerConversion< localIndex >( res->first ); + // If we're in a case where there aren't two edges sharing two nodes, + // then it means that we're in a corner case where the 2d element is on the boundary of the MPI domain, + // and maybe some nodes are missing for the 2d element to be properly and consistently defines. + // In this case, we explicitly set the edge index at `-1`, so we can get back on it later. + face2dToEdge[i] = res->second < 2 ? -1: LvArray::integerConversion< localIndex >( res->first ); } return face2dToEdge; @@ -361,7 +368,11 @@ ArrayOfArrays< localIndex > buildElem2dToEdges( vtkIdType num2dElements, { for( auto const & face2dIndex: elem2dToFace2d[elemIndex] ) { - elem2dToEdges.emplaceBack( elemIndex, face2dToEdge[face2dIndex] ); + localIndex const & e = face2dToEdge[face2dIndex]; + if( e > -1 ) + { + elem2dToEdges.emplaceBack( elemIndex, e ); + } } } @@ -369,17 +380,28 @@ ArrayOfArrays< localIndex > buildElem2dToEdges( vtkIdType num2dElements, } /** - * @brief Utility structure which connects 2d element to their 3d element and faces neighbors. + * @brief Utility structure which connects 2d element to their 3d element, faces and nodes neighbors. */ struct Elem2dTo3dInfo { ToCellRelation< ArrayOfArrays< localIndex > > elem2dToElem3d; ArrayOfArrays< localIndex > elem2dToFaces; + /** + * @brief All the neighboring points of the 2d element @e available on the current MPI rank. + * @note During the MPI partitioning, a 2d element may not already have its neighbors (face, 3d element). + * But this does not mean that the 2d element has no neighboring points. + * @note This container will not keep the order of the nodes. + * @note This container may not contain all the nodes of the 2d element. + * The missing nodes must therefore be added as part of the ghosting process. + */ + ArrayOfArrays< localIndex > elem2dToNodes; Elem2dTo3dInfo( ToCellRelation< ArrayOfArrays< localIndex > > && elem2dToElem3d_, - ArrayOfArrays< localIndex > && elem2dToFaces_ ) + ArrayOfArrays< localIndex > && elem2dToFaces_, + ArrayOfArrays< localIndex > && elem2dToNodes_ ) : elem2dToElem3d( elem2dToElem3d_ ), - elem2dToFaces( elem2dToFaces_ ) + elem2dToFaces( elem2dToFaces_ ), + elem2dToNodes( elem2dToNodes_ ) { } }; @@ -419,6 +441,12 @@ Elem2dTo3dInfo buildElem2dTo3dElemAndFaces( vtkSmartPointer< vtkDataSet > faceMe vtkIdTypeArray const * globalPtIds = vtkIdTypeArray::FastDownCast( mesh->GetPointData()->GetGlobalIds() ); vtkIdTypeArray const * globalCellIds = vtkIdTypeArray::FastDownCast( mesh->GetCellData()->GetGlobalIds() ); + std::map< vtkIdType, localIndex > ng2l; // global to local mapping for nodes. + for( vtkIdType i = 0; i < globalPtIds->GetNumberOfValues(); ++i ) + { + ng2l[globalPtIds->GetValue( i )] = i; + } + // Let's build the elem2d to elem3d mapping. We need to find the 3d elements! // First we compute the mapping from all the boundary nodes to the 3d elements that rely on those nodes. std::map< vtkIdType, std::vector< vtkIdType > > nodesToCellsFull; @@ -460,12 +488,13 @@ Elem2dTo3dInfo buildElem2dTo3dElemAndFaces( vtkSmartPointer< vtkDataSet > faceMe ArrayOfArrays< localIndex > elem2dToElem3d( num2dElements, 2 ); ArrayOfArrays< localIndex > elem2dToCellBlock( num2dElements, 2 ); ArrayOfArrays< localIndex > elem2dToFaces( num2dElements, 2 ); + ArrayOfArrays< localIndex > elem2dToNodes( num2dElements, 10 ); // Now we loop on all the 2d elements. - for( int i = 0; i < num2dElements; ++i ) + for( int e2d = 0; e2d < num2dElements; ++e2d ) { // We collect all the duplicated points that are involved for each 2d element. - vtkIdList * pointIds = faceMesh->GetCell( i )->GetPointIds(); + vtkIdList * pointIds = faceMesh->GetCell( e2d )->GetPointIds(); std::size_t const elem2dNumPoints = pointIds->GetNumberOfIds(); // All the duplicated points of the 2d element. Note that we lose the collocation of the duplicated nodes. std::set< vtkIdType > duplicatedPointOfElem2d; @@ -475,6 +504,21 @@ Elem2dTo3dInfo buildElem2dTo3dElemAndFaces( vtkSmartPointer< vtkDataSet > faceMe duplicatedPointOfElem2d.insert( ns.cbegin(), ns.cend() ); } + for( vtkIdType const & gni: duplicatedPointOfElem2d ) + { + auto it = ng2l.find( gni ); + if( it != ng2l.cend() ) // If the node is not on this rank, we want to ignore this entry. + { + // The node lists in `elem2dToNodes` may be in any order. + // Anyway, there will be a specific step to reset the appropriate order. + // Note that due to ghosting, there will also always be some cases where + // some nodes will be missing in `elem2dToNodes` _before_ the ghosting. + // After the ghosting, the whole information will be gathered, + // but a reordering step will always be compulsory. + elem2dToNodes.emplaceBack( e2d, it->second ); + } + } + // Here, we collect all the 3d elements that are concerned by at least one of those duplicated elements. std::map< vtkIdType, std::set< vtkIdType > > elem3dToDuplicatedNodes; for( vtkIdType const & n: duplicatedPointOfElem2d ) @@ -495,7 +539,7 @@ Elem2dTo3dInfo buildElem2dTo3dElemAndFaces( vtkSmartPointer< vtkDataSet > faceMe if( e2n.second.size() == elem2dNumPoints ) { // Now we know that the element 3d has a face that touches the element 2d. Let's find which one. - elem2dToElem3d.emplaceBack( i, elemToFaces.getElementIndexInCellBlock( e2n.first ) ); + elem2dToElem3d.emplaceBack( e2d, elemToFaces.getElementIndexInCellBlock( e2n.first ) ); // Computing the elem2dToFaces mapping. auto faces = elemToFaces[e2n.first]; for( int j = 0; j < faces.size( 0 ); ++j ) @@ -509,8 +553,8 @@ Elem2dTo3dInfo buildElem2dTo3dElemAndFaces( vtkSmartPointer< vtkDataSet > faceMe } if( globalNodes == e2n.second ) { - elem2dToFaces.emplaceBack( i, faceIndex ); - elem2dToCellBlock.emplaceBack( i, elemToFaces.getCellBlockIndex( e2n.first ) ); + elem2dToFaces.emplaceBack( e2d, faceIndex ); + elem2dToCellBlock.emplaceBack( e2d, elemToFaces.getCellBlockIndex( e2n.first ) ); break; } } @@ -519,44 +563,7 @@ Elem2dTo3dInfo buildElem2dTo3dElemAndFaces( vtkSmartPointer< vtkDataSet > faceMe } auto cellRelation = ToCellRelation< ArrayOfArrays< localIndex > >( std::move( elem2dToCellBlock ), std::move( elem2dToElem3d ) ); - return Elem2dTo3dInfo( std::move( cellRelation ), std::move( elem2dToFaces ) ); -} - - -/** - * @brief Computes the 2d element to nodes mapping. - * @param num2dElements Number of (2d) elements in the fracture. - * @param faceToNodes The face to nodes mapping. - * @param elem2dToFaces The 2d element to faces mapping. - * @return The computed mapping. - */ -ArrayOfArrays< localIndex > buildElem2dToNodes( vtkIdType num2dElements, - ArrayOfArraysView< localIndex const > faceToNodes, - ArrayOfArraysView< localIndex const > elem2dToFaces ) -{ - ArrayOfArrays< localIndex > elem2dToNodes( LvArray::integerConversion< localIndex >( num2dElements ) ); - for( localIndex elem2dIndex = 0; elem2dIndex < elem2dToFaces.size(); ++elem2dIndex ) - { - for( localIndex const & faceIndex: elem2dToFaces[elem2dIndex] ) - { - if( faceIndex < 0 ) - { - continue; - } - std::set< localIndex > tmp; - for( auto j = 0; j < faceToNodes[faceIndex].size(); ++j ) - { - localIndex const & nodeIndex = faceToNodes[faceIndex][j]; - tmp.insert( nodeIndex ); - } - for( localIndex const & nodeIndex: tmp ) - { - elem2dToNodes.emplaceBack( elem2dIndex, nodeIndex ); - } - } - } - - return elem2dToNodes; + return Elem2dTo3dInfo( std::move( cellRelation ), std::move( elem2dToFaces ), std::move( elem2dToNodes ) ); } @@ -615,20 +622,19 @@ void importFractureNetwork( string const & faceBlockName, vtkIdType const num2dElements = faceMesh->GetNumberOfCells(); // Now let's build the elem2dTo* mappings. Elem2dTo3dInfo elem2dTo3d = buildElem2dTo3dElemAndFaces( faceMesh, mesh, collocatedNodes, faceToNodes.toViewConst(), elemToFaces ); - ArrayOfArrays< localIndex > elem2dToNodes = buildElem2dToNodes( num2dElements, faceToNodes.toViewConst(), elem2dTo3d.elem2dToFaces.toViewConst() ); ArrayOfArrays< localIndex > face2dToElems2d = buildFace2dToElems2d( edges, faceMesh ); array1d< localIndex > face2dToEdge = buildFace2dToEdge( vtkIdTypeArray::FastDownCast( mesh->GetPointData()->GetGlobalIds() ), edges, collocatedNodes, nodeToEdges.toViewConst() ); ArrayOfArrays< localIndex > const elem2dToFace2d = buildElem2dToFace2d( num2dElements, face2dToElems2d.toViewConst() ); - ArrayOfArrays< localIndex > elem2DToEdges = buildElem2dToEdges( num2dElements, face2dToEdge.toViewConst(), elem2dToFace2d.toViewConst() ); + ArrayOfArrays< localIndex > elem2dToEdges = buildElem2dToEdges( num2dElements, face2dToEdge.toViewConst(), elem2dToFace2d.toViewConst() ); // Mappings are now computed. Just create the face block by value. FaceBlock & faceBlock = cellBlockManager.registerFaceBlock( faceBlockName ); faceBlock.setNum2dElements( num2dElements ); faceBlock.setNum2dFaces( num2dFaces ); - faceBlock.set2dElemToNodes( std::move( elem2dToNodes ) ); - faceBlock.set2dElemToEdges( std::move( elem2DToEdges ) ); + faceBlock.set2dElemToNodes( std::move( elem2dTo3d.elem2dToNodes ) ); + faceBlock.set2dElemToEdges( std::move( elem2dToEdges ) ); faceBlock.set2dFaceToEdge( std::move( face2dToEdge ) ); faceBlock.set2dFaceTo2dElems( std::move( face2dToElems2d ) ); From e7da2c5370ef75caa11776f55a0c6c187b24e6a3 Mon Sep 17 00:00:00 2001 From: Stefano Frambati Date: Fri, 15 Mar 2024 19:32:00 +0100 Subject: [PATCH 011/286] Optimization of the construction of high-order mesh maps (#2731) --- integratedTests | 2 +- .../mesh/generators/CellBlockManager.cpp | 440 +++++++++++------- .../meshTests/testMeshGeneration.cpp | 51 ++ 3 files changed, 320 insertions(+), 173 deletions(-) diff --git a/integratedTests b/integratedTests index aaeda396397..abea2ddbfab 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit aaeda396397173c7fc2253dc3f4975365f33502c +Subproject commit abea2ddbfab58ba445a9254d514dd5ac392a25ee diff --git a/src/coreComponents/mesh/generators/CellBlockManager.cpp b/src/coreComponents/mesh/generators/CellBlockManager.cpp index 356bd937d18..5db8c1fac2f 100644 --- a/src/coreComponents/mesh/generators/CellBlockManager.cpp +++ b/src/coreComponents/mesh/generators/CellBlockManager.cpp @@ -822,61 +822,78 @@ static array1d< real64 > gaussLobattoPoints( int order ) switch( order ) { - case 1: - GaussLobattoPts[0] = -1.0; - GaussLobattoPts[1] = 1.0; - break; case 2: - GaussLobattoPts[0] = -1.0; - GaussLobattoPts[1] = 0.0; - GaussLobattoPts[2] = 1.0; + GaussLobattoPts[0] = 0; break; case 3: static constexpr real64 sqrt5 = 2.2360679774997897; - GaussLobattoPts[0] = -1.0; - GaussLobattoPts[1] = -1./sqrt5; - GaussLobattoPts[2] = 1./sqrt5; - GaussLobattoPts[3] = 1.; + GaussLobattoPts[0] = -1./sqrt5; + GaussLobattoPts[1] = 1./sqrt5; break; case 4: static constexpr real64 sqrt3_7 = 0.6546536707079771; - GaussLobattoPts[0] = -1.0; - GaussLobattoPts[1] = -sqrt3_7; - GaussLobattoPts[2] = 0.0; - GaussLobattoPts[3] = sqrt3_7; - GaussLobattoPts[4] = 1.0; + GaussLobattoPts[0] = -sqrt3_7; + GaussLobattoPts[1] = 0.0; + GaussLobattoPts[2] = sqrt3_7; break; case 5: static constexpr real64 sqrt__7_plus_2sqrt7__ = 3.50592393273573196; static constexpr real64 sqrt__7_mins_2sqrt7__ = 1.30709501485960033; static constexpr real64 sqrt_inv21 = 0.218217890235992381; - GaussLobattoPts[0] = -1.0; - GaussLobattoPts[1] = -sqrt_inv21*sqrt__7_plus_2sqrt7__; - GaussLobattoPts[2] = -sqrt_inv21*sqrt__7_mins_2sqrt7__; - GaussLobattoPts[3] = sqrt_inv21*sqrt__7_mins_2sqrt7__; - GaussLobattoPts[4] = sqrt_inv21*sqrt__7_plus_2sqrt7__; - GaussLobattoPts[5] = 1.0; + GaussLobattoPts[0] = -sqrt_inv21*sqrt__7_plus_2sqrt7__; + GaussLobattoPts[1] = -sqrt_inv21*sqrt__7_mins_2sqrt7__; + GaussLobattoPts[2] = sqrt_inv21*sqrt__7_mins_2sqrt7__; + GaussLobattoPts[3] = sqrt_inv21*sqrt__7_plus_2sqrt7__; break; } return GaussLobattoPts; } +static void linearInterp( real64 const alpha, + arrayView2d< real64, nodes::REFERENCE_POSITION_USD > const refPos, + localIndex const vi[2], + arrayView2d< real64, nodes::REFERENCE_POSITION_USD > refPosNew, + localIndex const v ) +{ + for( int i=0; i<3; i++ ) + { + refPosNew( v, i ) = refPos( vi[0], i )*( 1.0-alpha )+ + refPos( vi[1], i )* alpha; + } +} +static void bilinearInterp( real64 const alpha, + real64 const beta, + arrayView2d< real64, nodes::REFERENCE_POSITION_USD > const refPos, + localIndex const vi[4], + arrayView2d< real64, nodes::REFERENCE_POSITION_USD > refPosNew, + localIndex const v ) +{ + for( int i=0; i<3; i++ ) + { + refPosNew( v, i ) = refPos( vi[0], i )*( 1.0-alpha )*( 1.0-beta )+ + refPos( vi[1], i )* alpha *( 1.0-beta )+ + refPos( vi[2], i )*( 1.0-alpha )* beta + + refPos( vi[3], i )* alpha * beta; + } +} static void trilinearInterp( real64 const alpha, real64 const beta, real64 const gamma, - real64 const (&X)[8][3], - real64 (& coords)[3] ) + arrayView2d< real64, nodes::REFERENCE_POSITION_USD > const refPos, + localIndex const vi[8], + arrayView2d< real64, nodes::REFERENCE_POSITION_USD > refPosNew, + localIndex const v ) { for( int i=0; i<3; i++ ) { - coords[i] = X[0][i]*( 1.0-alpha )*( 1.0-beta )*( 1.0-gamma )+ - X[1][i]* alpha *( 1.0-beta )*( 1.0-gamma )+ - X[2][i]*( 1.0-alpha )* beta *( 1.0-gamma )+ - X[3][i]* alpha * beta *( 1.0-gamma )+ - X[4][i]*( 1.0-alpha )*( 1.0-beta )* gamma+ - X[5][i]* alpha *( 1.0-beta )* gamma+ - X[6][i]*( 1.0-alpha )* beta * gamma+ - X[7][i]* alpha * beta * gamma; + refPosNew( v, i ) = refPos( vi[0], i ) *( 1.0-alpha )*( 1.0-beta )*( 1.0-gamma )+ + refPos( vi[1], i ) * alpha *( 1.0-beta )*( 1.0-gamma )+ + refPos( vi[2], i ) *( 1.0-alpha )* beta *( 1.0-gamma )+ + refPos( vi[3], i ) * alpha * beta *( 1.0-gamma )+ + refPos( vi[4], i ) *( 1.0-alpha )*( 1.0-beta )* gamma+ + refPos( vi[5], i ) * alpha *( 1.0-beta )* gamma+ + refPos( vi[6], i ) *( 1.0-alpha )* beta * gamma+ + refPos( vi[7], i ) * alpha * beta * gamma; } } @@ -888,10 +905,34 @@ void CellBlockManager::generateHighOrderMaps( localIndex const order, arrayView1d< globalIndex const > const faceLocalToGlobal ) { - // constants for hex mesh + // The general idea for building higher-order nodes is as follows: + // 1. Original mesh-level 0 nodes are added, keeping their global IDs; + // 2. Nodes internal to edges, faces and elements are added in this order. + // Their global IDs are computed based on the global IDs of the edge, face or element containing them. + // 3. The edge, face and element-to-node maps are created by adding nodes in a hierarchical order: + // Endpoints/vertices, then edge nodes, face nodes and element nodes last + // 4. The maps are then re-ordered in the usual tensor-product ordering using a hash map, using nodeKeys as the keys of the map. + // 5. Finally, global orientation consistency across MPI ranks is guaranteed by using a consistent global face/edge orientation + // to create node global IDs. This is obtained using nodeKeys, which always order nodes in a consistent manner. + // + // nodeKeys identify each high-order node with a list of 6 integers [i1, i2, i3, i4, a, b], as follows: + // - nodes on a mesh vertex v are identified by the vector [v, -1, -1, -1, -1, -1]; + // - nodes internal to an edge are given by a linear interpolation between vertices v1 and v2, 'a' steps away from v1. + // The edge erndpoints are oriented such that v1 < v2, and the vertex is and identified with [v1, v2, -1, -1, a, -1]); + // - nodes internal to a face are given by a bilinear interpolation between edges v1->v2 and v3->v4 + // (v1-v4 and v2-v3 are the diagonals), with interpolation parameters 'a' and 'b' respectively. + // Faces are oriented so that v1 is always the smallest index, and v2 < v3. Then face nodes are identified with [v1, v2, v3, v4, a, b]; + // - Nodes internal to mesh cells do not need to be oriented, as they are not used for global data exchange. + GEOS_MARK_FUNCTION; + // constants for hex mesh + localIndex const numEdgesPerFace = 4; + localIndex const numFacesPerCell = 6; + localIndex const numEdgesPerCell = 12; + localIndex const numVerticesPerFace = 4; localIndex const numVerticesPerCell = 8; + localIndex const numNodesPerEdge = ( order+1 ); localIndex const numNodesPerFace = ( order+1 )*( order+1 ); localIndex const numNodesPerCell = ( order+1 )*( order+1 )*( order+1 ); @@ -929,38 +970,26 @@ void CellBlockManager::generateHighOrderMaps( localIndex const order, m_edgeToNodes.resize( m_numEdges, order+1 ); m_nodesPositions.resize( m_numNodes ); + // also assign node coordinates using trilinear interpolation in th elements + arrayView2d< real64, nodes::REFERENCE_POSITION_USD > refPosNew = this->getNodePositions(); + refPosNew.setValues< parallelHostPolicy >( -1.0 ); + array1d< real64 > glCoords = gaussLobattoPoints( order ); - // --------------------------------------- - // initialize the node local to global map - // --------------------------------------- - - // The general idea for building nodes local-to-global map for the high-order meshes are: - // 1. for all the nodes that already in the base mesh-level, we keep their globalIDs the same - // 2. for the new nodes on the edges, we assign their global ID according to the global information from edgeLocalToGlobal map - // 3. for the new nodes on the faces, we assign their global ID according to the global information from faceLocalToGlobal map - // 4. for the new nodes on the internal of each elements, we assign the global ID for the new nodes - // according to the global information for the elements from elementLocalToGlobal map. arrayView1d< globalIndex > nodeLocalToGlobalNew = m_nodeLocalToGlobal.toView(); + localIndex localNodeOffset = 0; - // nodeIDs is a hash map that contains unique vertices and their indices for shared nodes: - // - A vertex is identified by 6 integers [i1 i2 i3 i4 a b], as follows: - // - nodes on a vertex v are identified by the vector [v -1 -1 -1 -1 -1] - // - nodes on a edge are given by a linear interpolation between vertices v1 and v2, 'a' steps away from v1 - // (we assume that v1 < v2 and identify these nodes with [v1 v2 -1 -1 a -1]). - // - nodes on a face are given by a bilinear interpolation between edges v1-v2 and v3-v4 - // (v1-v4 and v2-v3 are the diagonals), with interpolation parameters 'a' and 'b'. - // (we assume that v1 is the smallest, and that v2 < v3) Then these nodes are identified with [v1 v2 v3 v4 a b] - // - nodes within the internal of a cell are encountered only once, and thus do not need to be put in the hash map - std::unordered_map< std::array< localIndex, 6 >, localIndex, NodeKeyHasher< localIndex > > nodeIDs; - - // Create new nodes, with local and global IDs - localIndex localNodeID = 0; - for( localIndex iter_vertex=0; iter_vertex < numLocalVertices; iter_vertex++ ) + forAll< parallelHostPolicy >( numLocalVertices, + [ nodeLocalToGlobalSource=nodeLocalToGlobalSource.toView(), + nodeLocalToGlobalNew=nodeLocalToGlobalNew.toView(), + refPosSource=refPosSource.toView(), + refPosNew=refPosNew.toView() ]( localIndex const iter_vertex ) { - nodeLocalToGlobalNew[ localNodeID ] = nodeLocalToGlobalSource.toView()[ iter_vertex ]; - nodeIDs[ createNodeKey( iter_vertex ) ] = localNodeID; - localNodeID++; - } + nodeLocalToGlobalNew[ iter_vertex ] = nodeLocalToGlobalSource[ iter_vertex ]; + refPosNew[ iter_vertex ][0] = refPosSource[ iter_vertex ][0]; + refPosNew[ iter_vertex ][1] = refPosSource[ iter_vertex ][1]; + refPosNew[ iter_vertex ][2] = refPosSource[ iter_vertex ][2]; + } ); + localNodeOffset = numLocalVertices; ////////////////////////// // Edges @@ -972,34 +1001,47 @@ void CellBlockManager::generateHighOrderMaps( localIndex const order, arrayView2d< localIndex > edgeToNodeMapNew = m_edgeToNodes.toView(); // create / retrieve nodes on edges - localIndex offset = maxVertexGlobalID; - for( localIndex iter_edge = 0; iter_edge < numLocalEdges; iter_edge++ ) + localIndex globalNodeOffset = maxVertexGlobalID; + + forAll< parallelHostPolicy >( numLocalEdges, + [ edgeToNodesMapSource=edgeToNodesMapSource.toView(), + edgeToNodeMapNew=edgeToNodeMapNew.toView(), + refPosSrc=refPosSource.toView(), + refPosNew=refPosNew.toView(), + edgeLocalToGlobal=edgeLocalToGlobal.toView(), + nodeLocalToGlobalNew=nodeLocalToGlobalNew.toView(), + numInternalNodesPerEdge, numNodesPerEdge, globalNodeOffset, glCoords, localNodeOffset, order]( localIndex const iter_edge ) { - localIndex v1 = edgeToNodesMapSource[ iter_edge ][ 0 ]; - localIndex v2 = edgeToNodesMapSource[ iter_edge ][ 1 ]; - globalIndex gv1 = nodeLocalToGlobalSource.toView()[v1]; - globalIndex gv2 = nodeLocalToGlobalSource.toView()[v2]; - for( int q=0; q, localIndex, NodeKeyHasher< localIndex > > nodeIDs; + localIndex edgeHeadNode = edgeToNodesMapSource[ iter_edge ][ 0 ]; + localIndex edgeEndNode = edgeToNodesMapSource[ iter_edge ][ 1 ]; + globalIndex edgeHeadNodeG = nodeLocalToGlobalNew[ edgeHeadNode ]; + globalIndex edgeEndNodeG = nodeLocalToGlobalNew[ edgeEndNode ]; + array1d< localIndex > const edgeToNodeMapWork( numNodesPerEdge ); + edgeToNodeMapWork[ 0 ] = edgeHeadNode; + edgeToNodeMapWork[ 1 ] = edgeEndNode; + nodeIDs[ createNodeKey( edgeHeadNode ) ] = 0; + nodeIDs[ createNodeKey( edgeEndNode ) ] = 1; + + for( localIndex iter_node = 0; iter_node < numInternalNodesPerEdge; iter_node++ ) { - localIndex nodeID; - std::array< localIndex, 6 > nodeKey = createNodeKey( v1, v2, q, order ); - if( nodeIDs.count( nodeKey ) == 0 ) - { - // this is an internal edge node: create it - nodeID = localNodeID; - nodeIDs[ nodeKey ] = nodeID; - std::array< globalIndex, 6 > referenceOrientation = createNodeKey( gv1, gv2, q, order ); - int gq = referenceOrientation[4] - 1; - nodeLocalToGlobalNew[ nodeID ] = offset + edgeLocalToGlobal[ iter_edge ] * numInternalNodesPerEdge + gq; - localNodeID++; - } - else - { - nodeID = nodeIDs[ nodeKey ]; - } - edgeToNodeMapNew[ iter_edge ][ q ] = nodeID; + real64 alpha = ( glCoords[ iter_node ] + 1.0 ) / 2.0; + localIndex nodeLocalID = localNodeOffset + iter_edge * ( numInternalNodesPerEdge ) + iter_node; + edgeToNodeMapWork[ iter_node + 2 ] = nodeLocalID; + nodeIDs[ createNodeKey( edgeHeadNode, edgeEndNode, iter_node + 1, order ) ] = iter_node + 2; + std::array< globalIndex, 6 > referenceOrientation = createNodeKey( edgeHeadNodeG, edgeEndNodeG, iter_node + 1, order ); + int gq = referenceOrientation[4] - 1; + nodeLocalToGlobalNew[ nodeLocalID ] = globalNodeOffset + edgeLocalToGlobal[ iter_edge ] * numInternalNodesPerEdge + gq; + localIndex e[2] = { edgeHeadNode, edgeEndNode }; + linearInterp( alpha, refPosSrc, e, refPosNew, nodeLocalID ); } - } + // reorder map + for( localIndex q = 0; q < numNodesPerEdge; q++ ) + { + edgeToNodeMapNew[ iter_edge ][ q ] = edgeToNodeMapWork[ nodeIDs[ createNodeKey( edgeHeadNode, edgeEndNode, q, order ) ] ]; + } + } ); + localNodeOffset += numInternalNodesPerEdge * numLocalEdges; ///////////////////////// // Faces @@ -1022,48 +1064,79 @@ void CellBlockManager::generateHighOrderMaps( localIndex const order, } } ); - // create / retrieve nodes on faces - // by default, faces are oriented so that the normal has an outward orientation for the current rank. - // For this reason : - // - The 3rd and 4th node need to be swapped, to be consistent with the GL ordering - // - The global IDs of the internal nodes must be referred to a global "reference" orientation (using the createNodeKey method) - offset = maxVertexGlobalID + maxEdgeGlobalID * numInternalNodesPerEdge; - for( localIndex iter_face = 0; iter_face < numLocalFaces; iter_face++ ) + globalNodeOffset = maxVertexGlobalID + maxEdgeGlobalID * numInternalNodesPerEdge; + + forAll< parallelHostPolicy >( numLocalFaces, + [ faceToNodesMapSource=faceToNodesMapSource.toView(), + edgeToNodeMapNew=edgeToNodeMapNew.toView(), + faceToNodeMapNew=faceToNodeMapNew.toView(), + m_faceToEdges=m_faceToEdges.toView(), + refPosSrc=refPosSource.toView(), + refPosNew=refPosNew.toView(), + faceLocalToGlobal=faceLocalToGlobal.toView(), + nodeLocalToGlobalNew=nodeLocalToGlobalNew.toView(), + numNodesPerEdge, numEdgesPerFace, numVerticesPerFace, + numInternalNodesPerEdge, numInternalNodesPerFace, numNodesPerFace, + globalNodeOffset, glCoords, localNodeOffset, order ]( localIndex const iter_face ) { - localIndex v1 = faceToNodesMapSource[ iter_face ][ 0 ]; - localIndex v2 = faceToNodesMapSource[ iter_face ][ 1 ]; - localIndex v3 = faceToNodesMapSource[ iter_face ][ 2 ]; - localIndex v4 = faceToNodesMapSource[ iter_face ][ 3 ]; - std::swap( v3, v4 ); - globalIndex gv1 = nodeLocalToGlobalSource.toView()[v1]; - globalIndex gv2 = nodeLocalToGlobalSource.toView()[v2]; - globalIndex gv3 = nodeLocalToGlobalSource.toView()[v3]; - globalIndex gv4 = nodeLocalToGlobalSource.toView()[v4]; - for( int q1=0; q1, localIndex, NodeKeyHasher< localIndex > > nodeIDs; + localIndex faceVertID[ numVerticesPerFace ]; + globalIndex faceVertGID[ numVerticesPerFace ]; + array1d< localIndex > const faceToNodeMapWork( numNodesPerFace ); + for( localIndex iter_node=0; iter_node nodeKey = createNodeKey( v1, v2, v3, v4, q1, q2, order ); - if( nodeIDs.count( nodeKey ) == 0 ) - { - // this is an internal face node: create it - nodeID = localNodeID; - nodeIDs[ nodeKey ] = nodeID; - std::array< globalIndex, 6 > referenceOrientation = createNodeKey( gv1, gv2, gv3, gv4, q1, q2, order ); - int gq1 = referenceOrientation[4] - 1; - int gq2 = referenceOrientation[5] - 1; - nodeLocalToGlobalNew[ nodeID ] = offset + faceLocalToGlobal[ iter_face ] * numInternalNodesPerFace + gq1* numInternalNodesPerEdge + gq2; - localNodeID++; - } - else - { - nodeID = nodeIDs[ nodeKey ]; - } - faceToNodeMapNew[ iter_face ][ q2 + q1*numNodesPerEdge ] = nodeID; + localIndex nodeIdxInMap = numVerticesPerFace + iter_edge * numInternalNodesPerEdge + iter_node; + localIndex edge = m_faceToEdges[ iter_face ][ iter_edge ]; + faceToNodeMapWork[ nodeIdxInMap ] = edgeToNodeMapNew[ edge ][ iter_node + 1 ]; + nodeIDs[ createNodeKey( edgeToNodeMapNew[ edge ][ 0 ], edgeToNodeMapNew[ edge ][ numNodesPerEdge - 1 ], iter_node + 1, order ) ] = nodeIdxInMap; } } - } + for( localIndex iter_node=0; iter_node referenceOrientation = createNodeKey( faceVertGID[ 0 ], faceVertGID[ 1 ], faceVertGID[ 2 ], faceVertGID[ 3 ], + q1 + 1, q2 + 1, order ); + int gq1 = referenceOrientation[4] - 1; + int gq2 = referenceOrientation[5] - 1; + nodeLocalToGlobalNew[ nodeLocalID ] = globalNodeOffset + faceLocalToGlobal[ iter_face ] * numInternalNodesPerFace + gq2 * numInternalNodesPerEdge + gq1; + + bilinearInterp( alpha, beta, refPosSrc, faceVertID, refPosNew, nodeLocalID ); + } + // reorder map + for( localIndex q = 0; q < numNodesPerFace; q++ ) + { + localIndex q1 = q % numNodesPerEdge; + localIndex q2 = ( q / numNodesPerEdge ) % numNodesPerEdge; + if( q1 == 0 || q1 == numNodesPerEdge - 1 || q2 == 0 || q2 == numNodesPerEdge - 1 ) + { + faceToNodeMapNew[ iter_face ][ q ] = faceToNodeMapWork[ + nodeIDs[ createNodeKey( faceVertID[0], faceVertID[1], faceVertID[2], faceVertID[3], q1, q2, order ) ] ]; + } + } + } ); + + localNodeOffset += numInternalNodesPerFace * numLocalFaces; // add all nodes to the target set "all" SortedArray< localIndex > & allNodesSet = this->getNodeSets()[ "all" ]; @@ -1074,20 +1147,12 @@ void CellBlockManager::generateHighOrderMaps( localIndex const order, allNodesSet.insert( iter_nodes ); } + ///////////////////////// // Elements ////////////////////////// - // also assign node coordinates using trilinear interpolation in th elements - arrayView2d< real64, nodes::REFERENCE_POSITION_USD > refPosNew = this->getNodePositions(); - refPosNew.setValues< parallelHostPolicy >( -1.0 ); - - real64 Xmesh[ numVerticesPerCell ][ 3 ] = { { } }; - real64 X[ 3 ] = { { } }; - array1d< real64 > glCoords = gaussLobattoPoints( order ); - localIndex elemMeshVertices[ numVerticesPerCell ] = { }; - offset = maxVertexGlobalID + maxEdgeGlobalID * numInternalNodesPerEdge + maxFaceGlobalID * numInternalNodesPerFace; - std::array< localIndex, 6 > const nullKey = std::array< localIndex, 6 >{ -1, -1, -1, -1, -1, -1 }; + globalNodeOffset = maxVertexGlobalID + maxEdgeGlobalID * numInternalNodesPerEdge + maxFaceGlobalID * numInternalNodesPerFace; // initialize the elements-to-nodes map arrayView2d< localIndex, cells::NODE_MAP_USD > elemsToNodesNew; @@ -1097,61 +1162,92 @@ void CellBlockManager::generateHighOrderMaps( localIndex const order, arrayView1d< globalIndex > elementLocalToGlobal( cellBlock.localToGlobalMap() ); array2d< localIndex, cells::NODE_MAP_PERMUTATION > elemsToNodesSource ( cellBlock.getElemToNodes() ); + array2d< localIndex > elemsToEdges ( cellBlock.getElemToEdges() ); + array2d< localIndex > elemsToFaces ( cellBlock.getElemToFaces() ); + cellBlock.resizeNumNodes( numNodesPerCell ); elemsToNodesNew = cellBlock.getElemToNode(); localIndex const numCellElements = cellBlock.numElements(); - // then loop through all the elements and assign the globalID according to the globalID of the Element - // and insert the new local to global ID ( for the internal nodes of elements ) into the nodeLocalToGlobal - // retrieve finite element type - for( localIndex iter_elem = 0; iter_elem < numCellElements; ++iter_elem ) + forAll< parallelHostPolicy >( numCellElements, + [ elemsToNodesSource=elemsToNodesSource.toView(), + elemsToNodesNew=elemsToNodesNew.toView(), + elemsToEdges=elemsToEdges.toView(), + elemsToFaces=elemsToFaces.toView(), + edgeToNodeMapNew=edgeToNodeMapNew.toView(), + faceToNodeMapNew=faceToNodeMapNew.toView(), + refPosSrc=refPosSource.toView(), + refPosNew=refPosNew.toView(), + elementLocalToGlobal=elementLocalToGlobal.toView(), + nodeLocalToGlobalNew=nodeLocalToGlobalNew.toView(), + numEdgesPerFace, numVerticesPerFace, + numVerticesPerCell, numEdgesPerCell, numFacesPerCell, numNodesPerCell, numNodesPerFace, numNodesPerEdge, order, + numInternalNodesPerCell, numInternalNodesPerEdge, numInternalNodesPerFace, + globalNodeOffset, glCoords, localNodeOffset ]( localIndex const iter_elem ) { - localIndex newCellNodes = 0; - for( localIndex iter_vertex = 0; iter_vertex < numVerticesPerCell; iter_vertex++ ) + std::unordered_map< std::array< localIndex, 6 >, localIndex, NodeKeyHasher< localIndex > > nodeIDs; + localIndex elemVertID[ numVerticesPerCell]; + array1d< localIndex > const elemToNodeMapWork( numNodesPerCell ); + for( localIndex iter_node=0; iter_node < numVerticesPerCell; iter_node++ ) { - elemMeshVertices[ iter_vertex ] = elemsToNodesSource[ iter_elem ][ iter_vertex ]; - for( int i =0; i < 3; i++ ) - { - Xmesh[ iter_vertex ][ i ] = refPosSource[ elemMeshVertices[ iter_vertex ] ][ i ]; - } + elemVertID[ iter_node ] = elemsToNodesSource[ iter_elem ][ iter_node ]; + elemToNodeMapWork[ iter_node ] = elemVertID[ iter_node ]; + nodeIDs[ createNodeKey( elemVertID[ iter_node ] ) ] = iter_node; } - for( int q = 0; q < numNodesPerCell; q++ ) + for( localIndex iter_edge=0; iter_edge < numEdgesPerCell; iter_edge++ ) { - localIndex nodeID; - int dof = q; - int q1 = dof % numNodesPerEdge; - dof /= ( numNodesPerEdge ); - int q2 = dof % ( numNodesPerEdge ); - dof /= ( numNodesPerEdge ); - int q3 = dof % ( numNodesPerEdge ); - // compute node coords - real64 alpha = ( glCoords[ q1 ] + 1.0 ) / 2.0; - real64 beta = ( glCoords[ q2 ] + 1.0 ) / 2.0; - real64 gamma = ( glCoords[ q3 ] + 1.0 ) / 2.0; - trilinearInterp( alpha, beta, gamma, Xmesh, X ); - // find node ID - std::array< localIndex, 6 > nodeKey = createNodeKey( elemMeshVertices, q1, q2, q3, order ); - if( nodeKey == nullKey ) + for( localIndex iter_node=0; iter_node < numInternalNodesPerEdge; iter_node++ ) { - // the node is internal to a cell -- create it - nodeID = localNodeID; - nodeLocalToGlobalNew[ nodeID ] = offset + elementLocalToGlobal[ iter_elem ] * numInternalNodesPerCell + newCellNodes; - localNodeID++; - newCellNodes++; + localIndex nodeIdxInMap = numVerticesPerCell + iter_edge * numInternalNodesPerEdge + iter_node; + localIndex edge = elemsToEdges[iter_elem][iter_edge]; + elemToNodeMapWork[ nodeIdxInMap ] = edgeToNodeMapNew[ edge ][iter_node+1]; + nodeIDs[ createNodeKey( edgeToNodeMapNew[ edge ][ 0 ], edgeToNodeMapNew[ edge ][ numNodesPerEdge - 1 ], iter_node + 1, order ) ] = nodeIdxInMap; } - else + } + for( localIndex iter_face=0; iter_face < numFacesPerCell; iter_face++ ) + { + for( localIndex iter_node=0; iter_node < numInternalNodesPerFace; iter_node++ ) { - nodeID = nodeIDs[ nodeKey ]; + localIndex q1 = iter_node % numInternalNodesPerEdge; + localIndex q2 = ( iter_node / numInternalNodesPerEdge ) % numInternalNodesPerEdge; + localIndex nodeIdxInMap = numVerticesPerCell + numEdgesPerCell * numInternalNodesPerEdge + iter_face * numInternalNodesPerFace + iter_node; + localIndex face = elemsToFaces[iter_elem][iter_face]; + elemToNodeMapWork[ nodeIdxInMap ] = faceToNodeMapNew[face][(q2 + 1) * numNodesPerEdge + (q1 + 1 )]; + nodeIDs[ createNodeKey( faceToNodeMapNew[ face ][ 0 ], faceToNodeMapNew[ face ][ numNodesPerEdge - 1 ], + faceToNodeMapNew[ face ][ numNodesPerFace - numNodesPerEdge ], faceToNodeMapNew[ face ][ numNodesPerFace- 1 ], q1 + 1, q2 + 1, order ) ] = nodeIdxInMap; } - for( int i=0; i<3; i++ ) + } + for( localIndex iter_node=0; iter_node < numInternalNodesPerCell; iter_node++ ) + { + localIndex q1 = iter_node % numInternalNodesPerEdge; + localIndex q2 = ( iter_node / numInternalNodesPerEdge ) % numInternalNodesPerEdge; + localIndex q3 = ( iter_node / numInternalNodesPerEdge ) / numInternalNodesPerEdge; + real64 alpha = ( glCoords[ q1 ] + 1.0 ) / 2.0; + real64 beta = ( glCoords[ q2 ] + 1.0 ) / 2.0; + real64 gamma = ( glCoords[ q3 ] + 1.0 ) / 2.0; + + localIndex nodeLocalID = localNodeOffset + iter_elem * numInternalNodesPerCell + iter_node; + elemsToNodesNew[ iter_elem ][ (q3 + 1) * numNodesPerFace + (q2 + 1) * numNodesPerEdge + (q1 + 1) ] = nodeLocalID; + nodeLocalToGlobalNew[ nodeLocalID ] = globalNodeOffset + elementLocalToGlobal[ iter_elem ] * numInternalNodesPerCell + iter_node; + trilinearInterp( alpha, beta, gamma, refPosSrc, elemVertID, refPosNew, nodeLocalID ); + + } + // reorder map + for( localIndex q = 0; q < numNodesPerCell; q++ ) + { + localIndex q1 = q % numNodesPerEdge; + localIndex q2 = ( q / numNodesPerEdge ) % numNodesPerEdge; + localIndex q3 = ( q / numNodesPerEdge ) / numNodesPerEdge; + if( q1 == 0 || q1 == numNodesPerEdge - 1 || q2 == 0 || q2 == numNodesPerEdge - 1 || q3 == 0 || q3 == numNodesPerEdge - 1 ) { - refPosNew( nodeID, i ) = X[ i ]; + elemsToNodesNew[ iter_elem ][ q ] = elemToNodeMapWork[ + nodeIDs[ createNodeKey( elemVertID, q1, q2, q3, order ) ] ]; } - elemsToNodesNew[ iter_elem ][ q ] = nodeID; } - } + } ); + localNodeOffset += numCellElements; } ); } -} +} // namespace geos diff --git a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp index ab91b136ee2..a2529c16406 100644 --- a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp +++ b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp @@ -49,6 +49,9 @@ constexpr localIndex node_dJ = numNodesInZ; constexpr localIndex elem_dI = numElemsInY * numElemsInZ; constexpr localIndex elem_dJ = numElemsInZ; +constexpr localIndex minOrder = 1; +constexpr localIndex maxOrder = 5; + class MeshGenerationTest : public ::testing::Test { protected: @@ -514,6 +517,54 @@ TEST_F( MeshGenerationTest, edgeFaceMaps ) } } +TEST_F( MeshGenerationTest, highOrderMapsSizes ) +{ + ProblemManager & problemManager = getGlobalState().getProblemManager(); + DomainPartition & domain = problemManager.getDomainPartition(); + MeshBody & meshBody = domain.getMeshBody( 0 ); + MeshManager & meshManager = problemManager.getGroup< MeshManager >( problemManager.groupKeys.meshManager ); + meshManager.generateMeshes( domain ); + for( int order = minOrder; order < maxOrder; order++ ) + { + MeshLevel & meshLevel = meshBody.createMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString(), GEOS_FMT( "TestLevel{}", order ), order ); + ElementRegionManager & elemManager = meshLevel.getElemManager(); + NodeManager & nodeManager = meshLevel.getNodeManager(); + FaceManager & faceManager = meshLevel.getFaceManager(); + EdgeManager & edgeManager = meshLevel.getEdgeManager(); + CellBlockManagerABC const & cellBlockManager = meshBody.getCellBlockManager(); + nodeManager.setGeometricalRelations( cellBlockManager, elemManager, false ); + edgeManager.setGeometricalRelations( cellBlockManager, false ); + faceManager.setGeometricalRelations( cellBlockManager, elemManager, nodeManager, false ); + + ASSERT_EQ( elemManager.numRegions(), 1 ); + + ElementRegionBase & elemRegion = elemManager.getRegion( 0 ); + ASSERT_EQ( elemRegion.numSubRegions(), 1 ); + + CellElementSubRegion & subRegion = elemRegion.getSubRegion< CellElementSubRegion >( 0 ); + + EXPECT_EQ( subRegion.numNodesPerElement(), pow( order + 1, 3 ) ); + + localIndex const numVertices = numNodesInX * numNodesInY * numNodesInZ; + localIndex const numEdges = numNodesInX * numNodesInY * numElemsInZ + numNodesInX * numElemsInY * numNodesInZ + numElemsInX * numNodesInY *numNodesInZ; + localIndex const numFaces = numNodesInX * numElemsInY * numElemsInZ + numElemsInX * numElemsInY * numNodesInZ + numElemsInX * numNodesInY *numElemsInZ; + localIndex const numElems = numElemsInX * numElemsInY * numElemsInZ; + localIndex const numNodes = numVertices + numEdges * (order-1) + numFaces * pow((order-1), 2 ) + numElems * pow((order-1), 3 ); + + EXPECT_EQ( numNodes, nodeManager.size() ); + + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & nodeMap = subRegion.nodeList(); + EXPECT_EQ( nodeMap.size( 1 ), pow( order+1, 3 ) ); + arrayView2d< localIndex const > const & edgeToNodeMap = edgeManager.nodeList(); + EXPECT_EQ( edgeToNodeMap.size( 1 ), order+1 ); + ArrayOfArraysView< localIndex const > const & faceToNodeMap = faceManager.nodeList().toViewConst(); + for( localIndex f = 0; f < faceManager.size(); ++f ) + { + EXPECT_EQ( faceToNodeMap.sizeOfArray( f ), pow( order+1, 2 ) ); + } + } +} + int main( int argc, char * * argv ) { ::testing::InitGoogleTest( &argc, argv ); From 0b4aab8f5ccf2cde1f13277415ff8e775c7d2a4d Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Fri, 15 Mar 2024 12:50:10 -0700 Subject: [PATCH 012/286] Add more memory to streak build...specify resources for integratedTests (#3042) --- .github/workflows/ci_tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index dce33777940..614a2e03707 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -201,6 +201,7 @@ jobs: ENABLE_TRILINOS: OFF GCP_BUCKET: geosx/integratedTests RUNS_ON: self-hosted + DOCKER_RUN_ARGS: "--cpus=8 --memory=128g" code_coverage: needs: @@ -247,7 +248,7 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF RUNS_ON: self-hosted - DOCKER_RUN_ARGS: "--cpus=8 --memory=128g --runtime=nvidia --gpus all" + DOCKER_RUN_ARGS: "--cpus=8 --memory=256g --runtime=nvidia --gpus all" - name: Centos (7.7, gcc 8.3.1, open-mpi 1.10.7, cuda 11.8.89) From be2aaafaf799b6800b9c05d185b721bf9cfe1418 Mon Sep 17 00:00:00 2001 From: tbeltzun <129868353+tbeltzun@users.noreply.github.com> Date: Fri, 15 Mar 2024 22:22:49 +0100 Subject: [PATCH 013/286] Allow building GEOS with `clang >= 15` (#3024) --- .devcontainer/devcontainer.json | 2 +- .github/workflows/build_and_test.yml | 2 +- .github/workflows/ci_tests.yml | 15 ++++++++++----- src/cmake/thirdparty/SetupGeosxThirdParty.cmake | 2 +- .../mesh/generators/CellBlockManager.cpp | 16 +++++----------- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 7729845a464..30466d17298 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "256-147" + "GEOS_TPL_TAG": "260-235" } }, "runArgs": [ diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 0564ce0c218..b34d56c8e70 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -178,7 +178,7 @@ jobs: -h=`hostname` \ ${{ inputs.DOCKER_REPOSITORY }}:${{ inputs.DOCKER_IMAGE_TAG }} \ ${GITHUB_WORKSPACE_MOUNT_POINT}/scripts/ci_build_and_test_in_container.sh \ - ${script_args[@]} + ${script_args[@]} EXIT_STATUS=$? echo "Received exit status ${EXIT_STATUS} from the build process." set -e diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 614a2e03707..150718bf957 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -124,19 +124,19 @@ jobs: fail-fast : false matrix: include: - - name: Ubuntu (20.04, gcc 9.3.0, open-mpi 4.0.3) + - name: Ubuntu (20.04, gcc 9.4.0, open-mpi 4.0.3) CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/ubuntu20.04-gcc9 - - name: Ubuntu debug (20.04, gcc 10.3.0, open-mpi 4.0.3) - github codespaces + - name: Ubuntu debug (20.04, gcc 10.5.0, open-mpi 4.0.3) - github codespaces CMAKE_BUILD_TYPE: Debug DOCKER_REPOSITORY: geosx/ubuntu20.04-gcc10 - - name: Ubuntu (20.04, gcc 10.3.0, open-mpi 4.0.3) - github codespaces + - name: Ubuntu (20.04, gcc 10.5.0, open-mpi 4.0.3) - github codespaces CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/ubuntu20.04-gcc10 - - name: Ubuntu (22.04, gcc 11.2.0, open-mpi 4.1.2) + - name: Ubuntu (22.04, gcc 11.4.0, open-mpi 4.1.2) CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/ubuntu22.04-gcc11 ENABLE_HYPRE: ON @@ -149,6 +149,12 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF + - name: Ubuntu (22.04, clang 15.0.7, open-mpi 4.1.2) + CMAKE_BUILD_TYPE: Release + DOCKER_REPOSITORY: geosx/ubuntu22.04-clang15 + ENABLE_HYPRE: ON + ENABLE_TRILINOS: OFF + - name: Pecan CPU (centos 7.7, gcc 8.2.0, open-mpi 4.0.1, mkl 2019.5) CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/pecan-cpu-gcc8.2.0-openmpi4.0.1-mkl2019.5 @@ -250,7 +256,6 @@ jobs: RUNS_ON: self-hosted DOCKER_RUN_ARGS: "--cpus=8 --memory=256g --runtime=nvidia --gpus all" - - name: Centos (7.7, gcc 8.3.1, open-mpi 1.10.7, cuda 11.8.89) BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" CMAKE_BUILD_TYPE: Release diff --git a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake index e6ce967a316..2a7529576b7 100644 --- a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake +++ b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake @@ -841,7 +841,7 @@ if( ${CMAKE_VERSION} VERSION_LESS "3.19" ) set( PYTHON_AND_VERSION Python3 ) set( PYTHON_OPTIONAL_COMPONENTS) else() - set( PYTHON_AND_VERSION Python3 3.7.0...3.11.2 ) + set( PYTHON_AND_VERSION Python3 3.6.0...3.12.2 ) set( PYTHON_OPTIONAL_COMPONENTS OPTIONAL_COMPONENTS Development NumPy) endif() if(ENABLE_PYGEOSX) diff --git a/src/coreComponents/mesh/generators/CellBlockManager.cpp b/src/coreComponents/mesh/generators/CellBlockManager.cpp index 5db8c1fac2f..4c18351d70b 100644 --- a/src/coreComponents/mesh/generators/CellBlockManager.cpp +++ b/src/coreComponents/mesh/generators/CellBlockManager.cpp @@ -1067,17 +1067,14 @@ void CellBlockManager::generateHighOrderMaps( localIndex const order, globalNodeOffset = maxVertexGlobalID + maxEdgeGlobalID * numInternalNodesPerEdge; forAll< parallelHostPolicy >( numLocalFaces, - [ faceToNodesMapSource=faceToNodesMapSource.toView(), + [ =, faceToNodesMapSource=faceToNodesMapSource.toView(), edgeToNodeMapNew=edgeToNodeMapNew.toView(), faceToNodeMapNew=faceToNodeMapNew.toView(), m_faceToEdges=m_faceToEdges.toView(), refPosSrc=refPosSource.toView(), refPosNew=refPosNew.toView(), faceLocalToGlobal=faceLocalToGlobal.toView(), - nodeLocalToGlobalNew=nodeLocalToGlobalNew.toView(), - numNodesPerEdge, numEdgesPerFace, numVerticesPerFace, - numInternalNodesPerEdge, numInternalNodesPerFace, numNodesPerFace, - globalNodeOffset, glCoords, localNodeOffset, order ]( localIndex const iter_face ) + nodeLocalToGlobalNew=nodeLocalToGlobalNew.toView() ]( localIndex const iter_face ) { std::unordered_map< std::array< localIndex, 6 >, localIndex, NodeKeyHasher< localIndex > > nodeIDs; localIndex faceVertID[ numVerticesPerFace ]; @@ -1170,7 +1167,8 @@ void CellBlockManager::generateHighOrderMaps( localIndex const order, localIndex const numCellElements = cellBlock.numElements(); forAll< parallelHostPolicy >( numCellElements, - [ elemsToNodesSource=elemsToNodesSource.toView(), + [ =, + elemsToNodesSource=elemsToNodesSource.toView(), elemsToNodesNew=elemsToNodesNew.toView(), elemsToEdges=elemsToEdges.toView(), elemsToFaces=elemsToFaces.toView(), @@ -1179,11 +1177,7 @@ void CellBlockManager::generateHighOrderMaps( localIndex const order, refPosSrc=refPosSource.toView(), refPosNew=refPosNew.toView(), elementLocalToGlobal=elementLocalToGlobal.toView(), - nodeLocalToGlobalNew=nodeLocalToGlobalNew.toView(), - numEdgesPerFace, numVerticesPerFace, - numVerticesPerCell, numEdgesPerCell, numFacesPerCell, numNodesPerCell, numNodesPerFace, numNodesPerEdge, order, - numInternalNodesPerCell, numInternalNodesPerEdge, numInternalNodesPerFace, - globalNodeOffset, glCoords, localNodeOffset ]( localIndex const iter_elem ) + nodeLocalToGlobalNew=nodeLocalToGlobalNew.toView() ]( localIndex const iter_elem ) { std::unordered_map< std::array< localIndex, 6 >, localIndex, NodeKeyHasher< localIndex > > nodeIDs; localIndex elemVertID[ numVerticesPerCell]; From 8300a43708f69b84cebaefb66590adaccf2c8c1a Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Fri, 15 Mar 2024 17:18:56 -0500 Subject: [PATCH 014/286] Implement Spycher-Pruess solubility tables (#2820) --- .../constitutive/CMakeLists.txt | 20 +- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 3 +- .../multifluid/CO2Brine/CO2BrineFluid.hpp | 1 - .../CO2Brine/functions/CO2Solubility.cpp | 443 ++++++------------ .../CO2Brine/functions/CO2Solubility.hpp | 13 +- .../functions/CO2SolubilityDuanSun.cpp | 222 +++++++++ .../functions/CO2SolubilityDuanSun.hpp | 57 +++ .../functions/CO2SolubilitySpycherPruess.cpp | 202 ++++++++ .../functions/CO2SolubilitySpycherPruess.hpp | 59 +++ .../CO2Brine/functions/PVTFunctionHelpers.cpp | 1 - .../CO2Brine/functions/PVTFunctionHelpers.hpp | 6 +- .../constitutiveTests/CMakeLists.txt | 9 +- .../testCO2SpycherPruessModels.cpp | 374 +++++++++++++++ .../constitutiveTests/testPVT_CO2Brine.xml | 35 ++ ...tCo2SpycherPruessBrinePhillipsMixtureA.txt | 31 ++ ...tCo2SpycherPruessBrinePhillipsMixtureB.txt | 31 ++ .../carbonDioxideSpycherPruessFlash.txt | 1 + 17 files changed, 1196 insertions(+), 312 deletions(-) create mode 100644 src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp create mode 100644 src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp create mode 100644 src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine_testCo2SpycherPruessBrinePhillipsMixtureA.txt create mode 100644 src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine_testCo2SpycherPruessBrinePhillipsMixtureB.txt create mode 100644 src/coreComponents/unitTests/constitutiveTests/testPVT_data/carbonDioxideSpycherPruessFlash.txt diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index 47e573b6f13..28ff5208229 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -43,21 +43,23 @@ set( constitutive_headers fluid/multifluid/blackOil/PVTOData.hpp fluid/multifluid/CO2Brine/CO2BrineFluid.hpp fluid/multifluid/CO2Brine/PhaseModel.hpp - fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp - fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp + fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp + fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp + fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp + fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp + fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp + fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp - fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp - fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp + fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp + fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp + fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp + fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp - fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp - fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp - fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp - fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp fluid/multifluid/CO2Brine/functions/WaterDensity.hpp fluid/multifluid/compositional/functions/CompositionalProperties.hpp fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp @@ -202,6 +204,8 @@ set( constitutive_sources fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp + fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp + fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 0a02e19ad51..b30d367dd4c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -377,9 +377,10 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() // If 1 table is provided, it is the CO2 solubility table and water vapourisation is zero // If 2 tables are provided, they are the CO2 solubility and water vapourisation tables depending // on how phaseNames is arranged + string const solubilityModel = EnumStrings< CO2Solubility::SolubilityModel >::toString( CO2Solubility::SolubilityModel::Tables ); string_array strs; strs.emplace_back( "FlashModel" ); - strs.emplace_back( "Tables" ); // Marker to indicate that tables are provided + strs.emplace_back( solubilityModel ); // Marker to indicate that tables are provided strs.emplace_back( "" ); // 2 empty strings for the 2 phase tables gas first, then water strs.emplace_back( "" ); if( m_solubilityTables.size() == 2 ) diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp index b68851478f2..835a475fec1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp @@ -194,7 +194,6 @@ class CO2BrineFluid : public MultiFluidBase // Flash model std::unique_ptr< FLASH > m_flash; - }; // these aliases are useful in constitutive dispatch diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp index ce4041bce68..f43009e5204 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp @@ -17,9 +17,8 @@ */ #include "constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp" - -#include "constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp" -#include "constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp" +#include "constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp" +#include "constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp" #include "functions/FunctionManager.hpp" #include "common/Units.hpp" @@ -29,337 +28,185 @@ namespace geos using namespace stringutilities; -namespace constitutive -{ - -namespace PVTProps -{ - namespace { -constexpr real64 P_Pa_f = 1e+5; -constexpr real64 P_c = 73.773 * P_Pa_f; -constexpr real64 T_c = 304.1282; -constexpr real64 Rgas = constants::gasConstant; -constexpr real64 V_c = Rgas*T_c/P_c; - -// these coefficients are in Table (A1) of Duan and Sun (2003) -constexpr real64 acoef[] = -{ 8.99288497e-2, -4.94783127e-1, 4.77922245e-2, 1.03808883e-2, -2.82516861e-2, 9.49887563e-2, 5.20600880e-4, - -2.93540971e-4, -1.77265112e-3, -2.51101973e-5, 8.93353441e-5, 7.88998563e-5, -1.66727022e-2, 1.398, 2.96e-2 }; - -real64 co2EOS( real64 const & T, real64 const & P, real64 const & V_r ) -{ - // reduced pressure - real64 const P_r = P*P_Pa_f/P_c; - // reduced temperature - real64 const T_r = units::convertCToK( T )/T_c; - - // CO2 equation of state - // see equation (A1) in Duan and Sun (2003) - real64 const f_Z = 1.0 - + ( acoef[0] + acoef[1]/(T_r * T_r) + acoef[2]/(T_r * T_r * T_r) )/V_r - + ( acoef[3] + acoef[4]/(T_r * T_r) + acoef[5]/(T_r * T_r * T_r) )/(V_r*V_r) - + ( acoef[6] + acoef[7]/(T_r * T_r) + acoef[8]/(T_r * T_r * T_r) )/(V_r*V_r*V_r*V_r) - + ( acoef[9] + acoef[10]/(T_r * T_r) + acoef[11]/(T_r * T_r * T_r) )/(V_r*V_r*V_r*V_r*V_r) - + acoef[12]/(T_r * T_r * T_r)/(V_r * V_r) * (acoef[13] + acoef[14]/(V_r * V_r)) * exp( -acoef[14]/(V_r * V_r)) - P_r * V_r / T_r; - - return f_Z; -} - -real64 PWater( real64 const & T ) +TableFunction const * makeTable( string const & tableName, + constitutive::PVTProps::PTTableCoordinates const & tableCoords, + array1d< real64 > && values, + FunctionManager & functionManager ) { - // these coefficients are defined in Table (B1) of Duan and Sun (2003) - constexpr real64 ccoef[] = { -38.640844, 5.8948420, 59.876516, 26.654627, 10.637097 }; - - // H2O critical pressure (bars) - real64 const P_c_w = 220.85; - // H2O critical temperature (K) - real64 const T_c_w = 647.29; - real64 const tt = ( units::convertCToK( T )-T_c_w )/T_c_w; - // Empirical model for water pressure of equation (B1) of Duan and Sun (2003) - real64 const x = ( P_c_w*units::convertCToK( T )/T_c_w ) - * (1 - + ccoef[0]*pow( -tt, 1.9 ) - + ccoef[1]*tt - + ccoef[2]*tt*tt - + ccoef[3]*tt*tt*tt - + ccoef[4]*tt*tt*tt*tt); - - return x; -} - -real64 logF( real64 const & T, real64 const & P, real64 const & V_r ) -{ - // reduced pressure - real64 const P_r = P*P_Pa_f/P_c; - // reduced temperature - real64 const T_r = units::convertCToK( T ) / T_c; - real64 const Z = P_r * V_r/T_r; - - // fugacity coefficient of CO2, equation (A6) of Duan and Sun (2003) - real64 const log_f = Z - 1 - log( Z ) + - ( acoef[0] + acoef[1]/T_r/T_r + acoef[2]/T_r/T_r/T_r )/V_r - + ( acoef[3] + acoef[4]/T_r/T_r + acoef[5]/T_r/T_r/T_r )/2.0/V_r/V_r - + ( acoef[6] + acoef[7]/T_r/T_r + acoef[8]/T_r/T_r/T_r )/4.0/V_r/V_r/V_r/V_r - + ( acoef[9] + acoef[10]/T_r/T_r + acoef[11]/T_r/T_r/T_r )/5.0/V_r/V_r/V_r/V_r/V_r - + acoef[12]/2.0/T_r/T_r/T_r/acoef[14] * ( acoef[13] + 1.0 - (acoef[13] + 1.0 + acoef[14]/V_r/V_r) * exp( -acoef[14]/V_r/V_r ) ); - - return log_f; -} - -real64 Par( real64 const & T, real64 const & P, real64 const * cc ) -{ - // "equation for the parameters", see equation (7) of Duan and Sun (2003) - real64 x = cc[0] - + cc[1]*T - + cc[2]/T - + cc[3]*T*T - + cc[4]/(630.0-T) - + cc[5]*P - + cc[6]*P *log( T ) - + cc[7]*P/T - + cc[8]*P/(630.0-T) - + cc[9]*P*P/(630.0-T)/(630.0-T) - + cc[10]*T *log( P ); - - return x; -} - -real64 CO2SolubilityFunction( string const & name, - real64 const & tolerance, - real64 const & T, - real64 const & P, - real64 (* f)( real64 const & x1, real64 const & x2, real64 const & x3 ) ) -{ - // compute the initial guess for Newton's method - real64 const initialReducedVolume = 0.75*Rgas*units::convertCToK( T )/(P*P_Pa_f)*(1/V_c); - - // define the local solver parameters - // for now, this is hard-coded, but we may want to let the user access the parameters at some point - integer const maxNumNewtonIter = 500; - integer const maxNumBacktrackIter = 8; - real64 const maxAbsUpdate = 1e12; - real64 const minAbsDeriv = 0; - real64 const allowedMinValue = 0.05; // value chosen to match previous implementation - real64 const presMultiplierForReporting = 1e5; // this is because P is in hectopascal in this function - - // solve the CO2 equation of state for this pair of (pres, temp) - // return the reduced volume - return CO2EOSSolver::solve( name, - maxNumNewtonIter, - maxNumBacktrackIter, - tolerance, - minAbsDeriv, - maxAbsUpdate, - allowedMinValue, - initialReducedVolume, - T, - P, - presMultiplierForReporting, - f ); + TableFunction * tableFunction = nullptr; + if( functionManager.hasGroup< TableFunction >( tableName ) ) + { + tableFunction = functionManager.getGroupPointer< TableFunction >( tableName ); + } + else + { + tableFunction = dynamicCast< TableFunction * >( functionManager.createChild( "TableFunction", tableName ) ); + tableFunction->setTableCoordinates( tableCoords.getCoords(), { units::Pressure, units::TemperatureInC } ); + tableFunction->setTableValues( values, units::Solubility ); + tableFunction->setInterpolationMethod( TableFunction::InterpolationType::Linear ); + } + tableFunction->initializeFunction(); + return tableFunction; } -void calculateCO2Solubility( string const & functionName, - real64 const & tolerance, - PTTableCoordinates const & tableCoords, - real64 const & salinity, - array1d< real64 > const & values ) +std::pair< TableFunction const *, TableFunction const * > +makeSolubilityTables( string const & functionName, + string_array const & inputParams, + constitutive::PVTProps::CO2Solubility::SolubilityModel const & solubilityModel ) { - // Interaction parameters, see Table 2 of Duan and Sun (2003) - constexpr real64 mu[] = - { 28.9447706, -0.0354581768, -4770.67077, 1.02782768e-5, 33.8126098, 9.04037140e-3, - -1.14934031e-3, -0.307405726, -0.0907301486, 9.32713393e-4, 0 }; - constexpr real64 lambda[] = { -0.411370585, 6.07632013e-4, 97.5347708, 0, 0, 0, 0, -0.0237622469, 0.0170656236, 0, 1.41335834e-5 }; - constexpr real64 zeta[] = { 3.36389723e-4, -1.98298980e-5, 0, 0, 0, 0, 0, 2.12220830e-3, -5.24873303e-3, 0, 0 }; + FunctionManager & functionManager = FunctionManager::getInstance(); + constitutive::PVTProps::PTTableCoordinates tableCoords; - localIndex const nPressures = tableCoords.nPressures(); - localIndex const nTemperatures = tableCoords.nTemperatures(); - - for( localIndex i = 0; i < nPressures; ++i ) + // Check solubility model for explicit table input + if( solubilityModel == constitutive::PVTProps::CO2Solubility::SolubilityModel::Tables ) { - real64 const P = tableCoords.getPressure( i ) / P_Pa_f; - - for( localIndex j = 0; j < nTemperatures; ++j ) + // The default table is a table with all zeros unless the name is explicitly provided + // The pressure and temperature values below will be used only to create the zero table so they + // simply give a range large enough to cover most values. + tableCoords.appendPressure( 1.0e5 ).appendPressure( 1.0e8 ) + .appendTemperature( 0.0 ).appendTemperature( 800.0 ); + + TableFunction const * tables[2] = { nullptr, nullptr }; + for( integer tableIndex : { 0, 1 } ) { - real64 const T = tableCoords.getTemperature( j ); + array1d< real64 > values( 4 ); + values.zero(); - // compute reduced volume by solving the CO2 equation of state - real64 const V_r = CO2SolubilityFunction( functionName, tolerance, T, P, &co2EOS ); - - // compute equation (6) of Duan and Sun (2003) - real64 const logK = Par( units::convertCToK( T ), P, mu ) - - logF( T, P, V_r ) - + 2*Par( units::convertCToK( T ), P, lambda ) * salinity - + Par( units::convertCToK( T ), P, zeta ) * salinity * salinity; - real64 const expLogK = exp( logK ); - - // mole fraction of CO2 in vapor phase, equation (4) of Duan and Sun (2003) - real64 const Pw = PWater( T ); - real64 const y_CO2 = (P - Pw)/P; - values[j*nPressures+i] = y_CO2 * P / expLogK; - - GEOS_WARNING_IF( expLogK <= 1e-10, - GEOS_FMT( "CO2Solubility: exp(logK) = {} is too small (logK = {}, P = {}, T = {}, V_r = {}), resulting solubility value is {}", - expLogK, logK, P, T, V_r, values[j*nPressures+i] )); - - if( values[j*nPressures+i] < 0 ) + string inputTableName = inputParams[2 + tableIndex]; + if( inputTableName.empty() ) + { + inputTableName = GEOS_FMT( "{}_zeroDissolution_table", constitutive::PVTProps::CO2Solubility::catalogName() ); + } + else { - GEOS_LOG_RANK_0( GEOS_FMT( "CO2Solubility: negative solubility value = {}, y_CO2 = {}, P = {}, PWater(T) = {}; corrected to 0", - values[j * nPressures + i], y_CO2, P, Pw ) ); - values[j*nPressures+i] = 0.0; + // If a name is explicitly given, then check that it exists + GEOS_THROW_IF( !functionManager.hasGroup< TableFunction >( inputTableName ), + GEOS_FMT( "{}: Could not find TableFunction with name {}", functionName, inputTableName ), + InputError ); } + tables[tableIndex] = makeTable( inputTableName, tableCoords, std::move ( values ), functionManager ); } + return { tables[0], tables[1] }; } -} -TableFunction const * getSolubilityTable( string const & tableName, - FunctionManager & functionManager ) -{ - TableFunction * const table = functionManager.getGroupPointer< TableFunction >( tableName ); - table->initializeFunction(); - table->setDimUnits( { units::Pressure, units::TemperatureInC } ); - table->setValueUnits( units::Solubility ); - return table; -} + // Initialize the (p,T) coordinates + constitutive::PVTProps::PVTFunctionHelpers::initializePropertyTable( inputParams, tableCoords ); -TableFunction const * makeSolubilityTable( array1d< real64_array > const & coords, - array1d< real64 > const & values, - string const & tableName, - FunctionManager & functionManager ) -{ - TableFunction * const table = dynamicCast< TableFunction * >( functionManager.createChild( "TableFunction", tableName ) ); - table->setTableCoordinates( coords, { units::Pressure, units::TemperatureInC } ); - table->setTableValues( values, units::Solubility ); - table->setInterpolationMethod( TableFunction::InterpolationType::Linear ); - return table; -} + // Initialize salinity and tolerance + GEOS_THROW_IF_LT_MSG( inputParams.size(), 9, + GEOS_FMT( "{}: insufficient number of model parameters", functionName ), + InputError ); -TableFunction const * makeZeroTable( string const & tableName, - FunctionManager & functionManager ) -{ - if( functionManager.hasGroup< TableFunction >( tableName ) ) - { - return getSolubilityTable( tableName, functionManager ); - } - else + real64 tolerance = 1e-9; + real64 salinity = 0.0; + try { - array1d< array1d< real64 > > coords( 2 ); - for( integer dim = 0; dim < 2; ++dim ) + salinity = stod( inputParams[8] ); + if( inputParams.size() >= 10 ) { - coords[dim].emplace_back( -1.0e10 ); - coords[dim].emplace_back( 1.0e10 ); + tolerance = stod( inputParams[9] ); } - array1d< real64 > values( 4 ); - values.zero(); - - return makeSolubilityTable( coords, values, tableName, functionManager ); } -} - -TableFunction const * makeSolubilityTable( string_array const & inputParams, - string const & functionName, - FunctionManager & functionManager ) -{ - // Check the second argument - if( inputParams[1] == "Tables" ) + catch( const std::invalid_argument & e ) { - string const inputTableName = inputParams[2]; - if( inputTableName.empty()) - { - return makeZeroTable( GEOS_FMT( "{}_zeroDissolution_table", CO2Solubility::catalogName() ), functionManager ); - } - else - { - GEOS_THROW_IF( !functionManager.hasGroup< TableFunction >( inputTableName ), - GEOS_FMT( "{}: Could not find TableFunction with name {}", functionName, inputTableName ), - InputError ); - return getSolubilityTable( inputTableName, functionManager ); - } + GEOS_THROW( GEOS_FMT( "{}: invalid model parameter value: {}", functionName, e.what() ), InputError ); } - string const tableName = functionName + "_co2Dissolution_table"; + integer const nPressures = tableCoords.nPressures(); + integer const nTemperatures = tableCoords.nTemperatures(); - if( functionManager.hasGroup< TableFunction >( tableName ) ) + array1d< real64 > co2Solubility( nPressures * nTemperatures ); + array1d< real64 > h2oSolubility( nPressures * nTemperatures ); + + if( solubilityModel == constitutive::PVTProps::CO2Solubility::SolubilityModel::DuanSun ) { - return getSolubilityTable( tableName, functionManager ); + constitutive::PVTProps::CO2SolubilityDuanSun::populateSolubilityTables( + functionName, + tableCoords, + salinity, + tolerance, + co2Solubility, + h2oSolubility ); } - else + else if( solubilityModel == constitutive::PVTProps::CO2Solubility::SolubilityModel::SpycherPruess ) { - // initialize the (p,T) coordinates - PTTableCoordinates tableCoords; - PVTFunctionHelpers::initializePropertyTable( inputParams, tableCoords ); - - // initialize salinity and tolerance - GEOS_THROW_IF_LT_MSG( inputParams.size(), 9, - GEOS_FMT( "{}: insufficient number of model parameters", functionName ), - InputError ); - - real64 tolerance = 1e-9; - real64 salinity = 0.0; - try + constitutive::PVTProps::CO2SolubilitySpycherPruess::populateSolubilityTables( + functionName, + tableCoords, + salinity, + tolerance, + co2Solubility, + h2oSolubility ); + } + + // Truncate negative solubility and warn + integer constexpr maxBad = 5; // Maximum number of bad values to report + stackArray2d< real64, maxBad *4 > badValues( maxBad, 4 ); + integer badCount = 0; + for( localIndex i = 0; i < nPressures; ++i ) + { + real64 const P = tableCoords.getPressure( i ); + for( localIndex j = 0; j < nTemperatures; ++j ) { - salinity = stod( inputParams[8] ); - if( inputParams.size() >= 10 ) + real64 const T = tableCoords.getTemperature( j ); + if( co2Solubility[j*nPressures+i] < 0.0 || h2oSolubility[j*nPressures+i] < 0.0 ) { - tolerance = stod( inputParams[9] ); + badValues( badCount % maxBad, 0 ) = P; + badValues( badCount % maxBad, 1 ) = T; + badValues( badCount % maxBad, 2 ) = co2Solubility[j*nPressures+i]; + badValues( badCount % maxBad, 3 ) = h2oSolubility[j*nPressures+i]; + ++badCount; + } + if( co2Solubility[j*nPressures+i] < 0.0 ) + { + co2Solubility[j*nPressures+i] = 0.0; + } + if( h2oSolubility[j*nPressures+i] < 0.0 ) + { + h2oSolubility[j*nPressures+i] = 0.0; } } - catch( const std::invalid_argument & e ) - { - GEOS_THROW( GEOS_FMT( "{}: invalid model parameter value: {}", functionName, e.what() ), InputError ); - } - - array1d< real64 > values( tableCoords.nPressures() * tableCoords.nTemperatures() ); - calculateCO2Solubility( functionName, tolerance, tableCoords, salinity, values ); - - return makeSolubilityTable( tableCoords.getCoords(), values, tableName, functionManager ); } -} -TableFunction const * makeVapourisationTable( string_array const & inputParams, - string const & functionName, - FunctionManager & functionManager ) -{ - if( inputParams[1] == "Tables" ) + if( 0 < badCount ) { - string const inputTableName = inputParams[3]; - if( inputTableName.empty()) - { - return makeZeroTable( GEOS_FMT( "{}_zeroDissolution_table", CO2Solubility::catalogName() ), functionManager ); - } - else + std::ostringstream badValueTable; + badValueTable + << std::setw( 15 ) << "Pressure (Pa)" << " " + << std::setw( 15 ) << "Temperature (C)" << " " + << std::setw( 23 ) << "CO2 solubility (mol/kg)" << " " + << std::setw( 15 ) << "H2O solubility (mol/kg)" << " " + << "\n"; + for( integer row = 0; row < LvArray::math::min( maxBad, badCount ); ++row ) { - GEOS_THROW_IF( !functionManager.hasGroup< TableFunction >( inputTableName ), - GEOS_FMT( "{}: Could not find TableFunction with name {}", functionName, inputTableName ), - InputError ); - return getSolubilityTable( inputTableName, functionManager ); + badValueTable + << std::setw( 15 ) << badValues( row, 0 ) << " " + << std::setw( 15 ) << badValues( row, 1 ) << " " + << std::setw( 23 ) << badValues( row, 2 ) << " " + << std::setw( 15 ) << badValues( row, 3 ) << " " + << "\n"; } + GEOS_LOG_RANK_0( GEOS_FMT( "CO2Solubility: {} negative solubility values encountered. These will be truncated to zero.\n Check out report table {} with max {} values", + badCount, badValueTable.str(), maxBad ) ); } - string const tableName = functionName + "_waterVaporization_table"; - - if( functionManager.hasGroup< TableFunction >( tableName ) ) - { - return getSolubilityTable( tableName, functionManager ); - } - else - { - // initialize the (p,T) coordinates - PTTableCoordinates tableCoords; - PVTFunctionHelpers::initializePropertyTable( inputParams, tableCoords ); - - // Currently initialise to all zeros - array1d< real64 > values( tableCoords.nPressures() * tableCoords.nTemperatures() ); - values.zero(); - - return makeSolubilityTable( tableCoords.getCoords(), values, tableName, functionManager ); - } + string const co2TableName = functionName + "_co2Dissolution_table"; + TableFunction const * co2SolubilityTable = makeTable( co2TableName, tableCoords, std::move( co2Solubility ), functionManager ); + string const h2oTableName = functionName + "_waterVaporization_table"; + TableFunction const * h2oSolubilityTable = makeTable( h2oTableName, tableCoords, std::move( h2oSolubility ), functionManager ); + return {co2SolubilityTable, h2oSolubilityTable}; } } // namespace +namespace constitutive +{ +namespace PVTProps +{ + CO2Solubility::CO2Solubility( string const & name, string_array const & inputParams, string_array const & phaseNames, @@ -389,8 +236,18 @@ CO2Solubility::CO2Solubility( string const & name, string const expectedWaterPhaseNames[] = { "Water", "water", "Liquid", "liquid" }; m_phaseLiquidIndex = PVTFunctionHelpers::findName( phaseNames, expectedWaterPhaseNames, "phaseNames" ); - m_CO2SolubilityTable = makeSolubilityTable( inputParams, m_modelName, FunctionManager::getInstance() ); - m_WaterVapourisationTable = makeVapourisationTable( inputParams, m_modelName, FunctionManager::getInstance() ); + SolubilityModel solubilityModel = SolubilityModel::DuanSun; // Default solubility model + if( inputParams[1] == EnumStrings< SolubilityModel >::toString( SolubilityModel::Tables ) ) + { + solubilityModel = SolubilityModel::Tables; + } + else if( 11 <= inputParams.size() ) + { + solubilityModel = EnumStrings< SolubilityModel >::fromString( inputParams[10] ); + } + + std::tie( m_CO2SolubilityTable, m_WaterVapourisationTable ) = makeSolubilityTables( m_modelName, inputParams, solubilityModel ); + if( printTable ) { m_CO2SolubilityTable->print( m_CO2SolubilityTable->getName() ); @@ -418,8 +275,6 @@ CO2Solubility::KernelWrapper CO2Solubility::createKernelWrapper() const m_phaseLiquidIndex ); } -REGISTER_CATALOG_ENTRY( FlashModelBase, CO2Solubility, string const &, string_array const &, string_array const &, string_array const &, array1d< real64 > const &, bool const ) - } // end namespace PVTProps } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp index bc0492008fa..9221c48503b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp @@ -103,7 +103,14 @@ class CO2SolubilityUpdate final : public FlashModelBaseUpdate class CO2Solubility : public FlashModelBase { public: + enum class SolubilityModel : integer + { + DuanSun, + SpycherPruess, + Tables + }; +public: CO2Solubility( string const & name, string_array const & inputParams, string_array const & phaseNames, @@ -130,7 +137,6 @@ class CO2Solubility : public FlashModelBase KernelWrapper createKernelWrapper() const; private: - /// Table to compute solubility as a function of pressure and temperature TableFunction const * m_CO2SolubilityTable; @@ -332,6 +338,11 @@ CO2SolubilityUpdate::compute( real64 const & pressure, } } +ENUM_STRINGS( CO2Solubility::SolubilityModel, + "DuanSun", + "SpycherPruess", + "Tables" ); + } // end namespace PVTProps } // end namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp new file mode 100644 index 00000000000..cc7b5f3bab2 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp @@ -0,0 +1,222 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file CO2SolubilityDuanSun.cpp + */ + +#include "constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp" +#include "constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp" + +#include "common/Units.hpp" + +namespace geos +{ +namespace constitutive +{ +namespace PVTProps +{ + +namespace +{ + +constexpr real64 P_Pa_f = 1e+5; +constexpr real64 P_c = 73.773 * P_Pa_f; +constexpr real64 T_c = 304.1282; +constexpr real64 Rgas = constants::gasConstant; +constexpr real64 V_c = Rgas*T_c/P_c; + +// these coefficients are in Table (A1) of Duan and Sun (2003) +constexpr real64 acoef[] = +{ 8.99288497e-2, -4.94783127e-1, 4.77922245e-2, 1.03808883e-2, -2.82516861e-2, 9.49887563e-2, 5.20600880e-4, + -2.93540971e-4, -1.77265112e-3, -2.51101973e-5, 8.93353441e-5, 7.88998563e-5, -1.66727022e-2, 1.398, 2.96e-2 }; + +real64 co2EOS( real64 const & T, real64 const & P, real64 const & V_r ) +{ + // reduced pressure + real64 const P_r = P*P_Pa_f/P_c; + // reduced temperature + real64 const T_r = units::convertCToK( T )/T_c; + + // CO2 equation of state + // see equation (A1) in Duan and Sun (2003) + real64 const f_Z = 1.0 + + ( acoef[0] + acoef[1]/(T_r * T_r) + acoef[2]/(T_r * T_r * T_r) )/V_r + + ( acoef[3] + acoef[4]/(T_r * T_r) + acoef[5]/(T_r * T_r * T_r) )/(V_r*V_r) + + ( acoef[6] + acoef[7]/(T_r * T_r) + acoef[8]/(T_r * T_r * T_r) )/(V_r*V_r*V_r*V_r) + + ( acoef[9] + acoef[10]/(T_r * T_r) + acoef[11]/(T_r * T_r * T_r) )/(V_r*V_r*V_r*V_r*V_r) + + acoef[12]/(T_r * T_r * T_r)/(V_r * V_r) * (acoef[13] + acoef[14]/(V_r * V_r)) * exp( -acoef[14]/(V_r * V_r)) - P_r * V_r / T_r; + + return f_Z; +} + +real64 PWater( real64 const & T ) +{ + // these coefficients are defined in Table (B1) of Duan and Sun (2003) + constexpr real64 ccoef[] = { -38.640844, 5.8948420, 59.876516, 26.654627, 10.637097 }; + + // H2O critical pressure (bars) + real64 const P_c_w = 220.85; + // H2O critical temperature (K) + real64 const T_c_w = 647.29; + real64 const tt = ( units::convertCToK( T )-T_c_w )/T_c_w; + // Empirical model for water pressure of equation (B1) of Duan and Sun (2003) + real64 const x = ( P_c_w*units::convertCToK( T )/T_c_w ) + * (1 + + ccoef[0]*pow( -tt, 1.9 ) + + ccoef[1]*tt + + ccoef[2]*tt*tt + + ccoef[3]*tt*tt*tt + + ccoef[4]*tt*tt*tt*tt); + + return x; +} + +real64 logF( real64 const & T, real64 const & P, real64 const & V_r ) +{ + // reduced pressure + real64 const P_r = P*P_Pa_f/P_c; + // reduced temperature + real64 const T_r = units::convertCToK( T ) / T_c; + real64 const Z = P_r * V_r/T_r; + + // fugacity coefficient of CO2, equation (A6) of Duan and Sun (2003) + real64 const log_f = Z - 1 - log( Z ) + + ( acoef[0] + acoef[1]/T_r/T_r + acoef[2]/T_r/T_r/T_r )/V_r + + ( acoef[3] + acoef[4]/T_r/T_r + acoef[5]/T_r/T_r/T_r )/2.0/V_r/V_r + + ( acoef[6] + acoef[7]/T_r/T_r + acoef[8]/T_r/T_r/T_r )/4.0/V_r/V_r/V_r/V_r + + ( acoef[9] + acoef[10]/T_r/T_r + acoef[11]/T_r/T_r/T_r )/5.0/V_r/V_r/V_r/V_r/V_r + + acoef[12]/2.0/T_r/T_r/T_r/acoef[14] * ( acoef[13] + 1.0 - (acoef[13] + 1.0 + acoef[14]/V_r/V_r) * exp( -acoef[14]/V_r/V_r ) ); + + return log_f; +} + +real64 Par( real64 const & T, real64 const & P, real64 const * cc ) +{ + // "equation for the parameters", see equation (7) of Duan and Sun (2003) + real64 x = cc[0] + + cc[1]*T + + cc[2]/T + + cc[3]*T*T + + cc[4]/(630.0-T) + + cc[5]*P + + cc[6]*P *log( T ) + + cc[7]*P/T + + cc[8]*P/(630.0-T) + + cc[9]*P*P/(630.0-T)/(630.0-T) + + cc[10]*T *log( P ); + + return x; +} + +real64 CO2SolubilityFunction( string const & name, + real64 const & tolerance, + real64 const & T, + real64 const & P, + real64 (* f)( real64 const & x1, real64 const & x2, real64 const & x3 ) ) +{ + // compute the initial guess for Newton's method + real64 const initialReducedVolume = 0.75*Rgas*units::convertCToK( T )/(P*P_Pa_f)*(1/V_c); + + // define the local solver parameters + // for now, this is hard-coded, but we may want to let the user access the parameters at some point + integer const maxNumNewtonIter = 500; + integer const maxNumBacktrackIter = 8; + real64 const maxAbsUpdate = 1e12; + real64 const minAbsDeriv = 0; + real64 const allowedMinValue = 0.05; // value chosen to match previous implementation + real64 const presMultiplierForReporting = 1e5; // this is because P is in hectopascal in this function + + // solve the CO2 equation of state for this pair of (pres, temp) + // return the reduced volume + return CO2EOSSolver::solve( name, + maxNumNewtonIter, + maxNumBacktrackIter, + tolerance, + minAbsDeriv, + maxAbsUpdate, + allowedMinValue, + initialReducedVolume, + T, + P, + presMultiplierForReporting, + f ); +} + +void calculateCO2Solubility( string const & functionName, + real64 const & tolerance, + PTTableCoordinates const & tableCoords, + real64 const & salinity, + array1d< real64 > const & values ) +{ + // Interaction parameters, see Table 2 of Duan and Sun (2003) + constexpr real64 mu[] = + { 28.9447706, -0.0354581768, -4770.67077, 1.02782768e-5, 33.8126098, 9.04037140e-3, + -1.14934031e-3, -0.307405726, -0.0907301486, 9.32713393e-4, 0 }; + constexpr real64 lambda[] = { -0.411370585, 6.07632013e-4, 97.5347708, 0, 0, 0, 0, -0.0237622469, 0.0170656236, 0, 1.41335834e-5 }; + constexpr real64 zeta[] = { 3.36389723e-4, -1.98298980e-5, 0, 0, 0, 0, 0, 2.12220830e-3, -5.24873303e-3, 0, 0 }; + + localIndex const nPressures = tableCoords.nPressures(); + localIndex const nTemperatures = tableCoords.nTemperatures(); + + for( localIndex i = 0; i < nPressures; ++i ) + { + real64 const P = tableCoords.getPressure( i ) / P_Pa_f; + + for( localIndex j = 0; j < nTemperatures; ++j ) + { + real64 const T = tableCoords.getTemperature( j ); + + // compute reduced volume by solving the CO2 equation of state + real64 const V_r = CO2SolubilityFunction( functionName, tolerance, T, P, &co2EOS ); + + // compute equation (6) of Duan and Sun (2003) + real64 const logK = Par( units::convertCToK( T ), P, mu ) + - logF( T, P, V_r ) + + 2*Par( units::convertCToK( T ), P, lambda ) * salinity + + Par( units::convertCToK( T ), P, zeta ) * salinity * salinity; + real64 const expLogK = exp( logK ); + + // mole fraction of CO2 in vapor phase, equation (4) of Duan and Sun (2003) + real64 const Pw = PWater( T ); + real64 const y_CO2 = (P - Pw)/P; + values[j*nPressures+i] = y_CO2 * P / expLogK; + + GEOS_WARNING_IF( expLogK <= 1e-10, + GEOS_FMT( "CO2Solubility: exp(logK) = {} is too small (logK = {}, P = {}, T = {}, V_r = {}), resulting solubility value is {}", + expLogK, logK, P, T, V_r, values[j*nPressures+i] )); + } + } +} + +} // end namespace + +void CO2SolubilityDuanSun::populateSolubilityTables( string const & functionName, + PTTableCoordinates const & tableCoords, + real64 const & salinity, + real64 const & tolerance, + array1d< real64 > const & co2SolubilityValues, + array1d< real64 > const & h2oSolubilityValues ) +{ + h2oSolubilityValues.zero(); + calculateCO2Solubility( functionName, + tolerance, + tableCoords, + salinity, + co2SolubilityValues ); +} + +} // end namespace PVTProps +} // namespace constitutive +} // end namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp new file mode 100644 index 00000000000..f0db58369b3 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp @@ -0,0 +1,57 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file CO2SolubilityDuanSun.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_FUNCTIONS_CO2SOLUBILITYDUANSUN_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_FUNCTIONS_CO2SOLUBILITYDUANSUN_HPP_ + +#include "constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp" + +namespace geos +{ +namespace constitutive +{ +namespace PVTProps +{ + +struct CO2SolubilityDuanSun +{ +/** + * @brief Create CO2 and H2O solubility table based on Duan and Sun (2003) + * @details Each generated table is a 2D table with lookup properties pressure (in Pa) and + * temperature (in degC). The returned CO2 solubility is in mole of CO2 per kg of + * H2O and the returned water vapourisation is in moles of H2O per kg of CO2. + * @param[in] functionName The name of the model + * @param[in] tableCoords The values of pressure and temperature + * @param[in] salinity The salinity of the brine + * @param[in] tolerance Tolerance to be used in solving for the solubility + * @param[out] co2SolubilityValues The CO2 solubility values (mol/kg) at the given pressures and temperatures + * @param[out] h2oSolubilityValues The H2O solubility values (mol/kg) at the given pressures and temperatures + */ + static void populateSolubilityTables( string const & functionName, + PTTableCoordinates const & tableCoords, + real64 const & salinity, + real64 const & tolerance, + array1d< real64 > const & co2SolubilityValues, + array1d< real64 > const & h2oSolubilityValues ); +}; + +} // end namespace PVTProps +} // end namespace constitutive +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_FUNCTIONS_CO2SOLUBILITYDUANSUN_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp new file mode 100644 index 00000000000..70c4425a9b3 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp @@ -0,0 +1,202 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file CO2SolubilitySpycherPruess.cpp + */ + +#include "CO2SolubilitySpycherPruess.hpp" +#include "constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp" +#include "common/Units.hpp" + +namespace geos +{ + +namespace +{ +/** + * Physical constants + * These correlations are developed with units: pressure [bar], volume [cm3], temperature [K]. + * The equilibrium constant correlations (equilibriumConstantCO2 and equilibriumConstantH2O) have a temperature in C + */ +static constexpr real64 P_ref = 1.0; // Reference pressure is 1 bar +static constexpr real64 Pa_2_bar = 1.0e-5; // Conversion factor from Pa to Bar +static constexpr real64 R = 10.0*constants::gasConstant; // Universal gas constant in [bar.cm3/mol.K] +static constexpr real64 molarMassCO2 = 44.01e-3; // Molar mass of CO2 [kg/mol] +static constexpr real64 molarMassH2O = 18.01e-3; // Molar mass of H2O [kg/mol] +static constexpr real64 v_av_H2O = 18.1; // Average partial molar volume of H2O [cm3/mol] +static constexpr real64 v_av_CO2 = 32.6; // Average partial molar volume of CO2 [cm3/mol] + +/** + * @brief Calculate the CO2 equilibrium constant from Spycher et al. (2003) + * @details The correlation parameters are given in Table 2 of Spycher et al. (2003) + * @param[in] T Temperature [C] + */ +real64 equilibriumConstantCO2( real64 const T ) +{ + constexpr real64 c[] = {1.189, 1.304e-2, -5.446e-5}; + real64 const logk0_CO2 = c[0] + T * (c[1] + T * c[2]); + return pow( 10.0, logk0_CO2 ); +} + +/** + * @brief Calculate the H2O equilibrium constant from Spycher et al. (2003) + * @details The correlation parameters are given in Table 2 of Spycher et al. (2003) + * @param[in] T Temperature [C] + */ +real64 equilibriumConstantH2O( real64 const T ) +{ + constexpr real64 c[] = {-2.209, 3.097e-2, -1.098e-4, 2.048e-7}; + real64 const logk0_H2O = c[0] + T * (c[1] + T * (c[2] + T* c[3])); + return pow( 10.0, logk0_H2O ); +} + +/** + * @brief Calculate the fugacity coefficient of CO2 from the RK-EOS + * @param[in] P Pressure [bar] + * @param[in] T Temperature [K] + * @param[in] rhoCO2 Density of CO2 [kg/m3] + * @param[in] salinity Salinity of water + */ +real64 fugacityCoefficientCO2( real64 const P, real64 const T, real64 const rhoCO2, real64 const salinity ) +{ + GEOS_UNUSED_VAR( salinity ); + real64 const V = 1.0e6*molarMassCO2/rhoCO2; // Molar volume [cm3/mol] + + // Mixture parameters from the tuned Redlich-Kwong EOS + // These values are given in Table 1 of Spycher et al. (2003) + real64 const a_CO2 = (7.54e7 - 4.13e4*T); // [bar.cm3.K^(1/2)/mol^2] + real64 constexpr b_CO2 = 27.8; // [cm3/mol] + + real64 const lnPhiCO2 = log( V/(V - b_CO2)) + b_CO2/(V - b_CO2) + - 2*a_CO2/(R*pow( T, 1.5 )*b_CO2)*log((V + b_CO2)/V ) + + a_CO2*b_CO2/(R*pow( T, 1.5 )*b_CO2*b_CO2) * (log((V + b_CO2)/V ) - b_CO2/(V + b_CO2)) + - log( P*V/(R*T)); + return exp( lnPhiCO2 ); +} + +/** + * @brief Calculate the fugacity coefficient of CO2 from the RK-EOS + * @param[in] P Pressure [bar] + * @param[in] T Temperature [K] + * @param[in] rhoCO2 Density of CO2 [kg/m3] + * @param[in] salinity Salinity of water + */ +real64 fugacityCoefficientH2O( real64 const P, real64 const T, real64 const rhoCO2, real64 const salinity ) +{ + GEOS_UNUSED_VAR( salinity ); + real64 const V = 1.0e6*molarMassCO2/rhoCO2; // Molar volume [cm3/mol] + + // Mixture parameters from the tuned Redlich-Kwong EOS + // These values are given in Table 1 of Spycher et al. (2003) + real64 const a_CO2 = (7.54e7 - 4.13e4*T); // [bar.cm3.K^(1/2)/mol^2] + real64 constexpr a_CO2_H2O = 7.89e7; // [bar.cm3.K^(1/2)/mol^2] + real64 constexpr b_CO2 = 27.8; // [cm3/mol] + real64 constexpr b_H2O = 18.18; // [cm3/mol] + + real64 const lnPhiH2O = log( V/(V - b_CO2) ) + b_H2O/(V - b_CO2) + - 2.0 * a_CO2_H2O * log( (V + b_CO2)/V ) / ( R*pow( T, 1.5 )*b_CO2 ) + + a_CO2 * b_H2O / ( R*pow( T, 1.5 )*b_CO2*b_CO2 )*( log( (V + b_CO2)/V ) - b_CO2/(V + b_CO2) ) + - log( P*V/(R*T) ); + return exp( lnPhiH2O ); +} + +/** + * @brief Calculate the parameter A from Eq (11) of Spycher et al. (2003) + * @param[in] P Pressure [Pa] + * @param[in] T Temperature [C] + * @param[in] rhoCO2 CO2 density [kg/m3] + * @param[in] salinity Salinity of the water + */ +real64 computeA( real64 const P, real64 const T, real64 const rhoCO2, real64 const salinity ) +{ + real64 const P_in_bar = P * Pa_2_bar; + real64 const deltaP = P_in_bar - P_ref; + real64 const TinK = units::convertCToK( T ); + real64 const k0_H2O = equilibriumConstantH2O( T ); // K-value for H2O at 1 bar + real64 const phi_H2O = fugacityCoefficientH2O( P_in_bar, TinK, rhoCO2, salinity ); // Fugacity coefficient of H2O for the water-CO2 system + real64 const A = k0_H2O/(phi_H2O*P_in_bar) * exp( deltaP*v_av_H2O/(R*TinK)); + return A; +} + +/** + * @brief Calculate the parameter B from Eq (12) of Spycher et al. (2003) + * @param[in] P Pressure [Pa] + * @param[in] T Temperature [C] + * @param[in] rhoCO2 CO2 density [kg/m3] + * @param[in] salinity Salinity of the water + */ +real64 computeB( real64 const P, real64 const T, real64 const rhoCO2, real64 const salinity ) +{ + real64 const P_in_bar = P * Pa_2_bar; + real64 const deltaP = P_in_bar - P_ref; + real64 const TinK = units::convertCToK( T ); + real64 const k0_CO2 = equilibriumConstantCO2( T ); // K-value for CO2 at 1 bar + real64 const phi_CO2 = fugacityCoefficientCO2( P_in_bar, TinK, rhoCO2, salinity ); // Fugacity coefficient of CO2 for the water-CO2 system + real64 const B = phi_CO2*P_in_bar/(55.508*k0_CO2) * exp( -(deltaP*v_av_CO2)/(R*TinK) ); + return B; +} +} // end namespace + +namespace constitutive +{ +namespace PVTProps +{ +void CO2SolubilitySpycherPruess::populateSolubilityTables( string const & functionName, + PTTableCoordinates const & tableCoords, + real64 const & salinity, + real64 const & tolerance, + array1d< real64 > const & co2SolubilityValues, + array1d< real64 > const & h2oSolubilityValues ) +{ + localIndex const nPressures = tableCoords.nPressures(); + localIndex const nTemperatures = tableCoords.nTemperatures(); + + // Calculate the CO2 density + array1d< real64 > densities( nPressures*nTemperatures ); + SpanWagnerCO2Density::calculateCO2Density( GEOS_FMT( "{}_co2_density", functionName ), + tolerance, + tableCoords, + densities ); + + for( localIndex i = 0; i < nPressures; ++i ) + { + real64 const P = tableCoords.getPressure( i ); + + for( localIndex j = 0; j < nTemperatures; ++j ) + { + real64 const T = tableCoords.getTemperature( j ); + + // Get the CO2 density + real64 const rhoCO2 = densities[j*nPressures+i]; + + // Calculate A and B + real64 const A = computeA( P, T, rhoCO2, salinity ); + real64 const B = computeB( P, T, rhoCO2, salinity ); + + // Calculate the mole fractions + // Eqns (13) and (14) from Spycher et al. (2003) + real64 const y_H2O = (1.0 - B)/(1.0/A - B); + real64 const x_CO2 = B*(1.0 - y_H2O); + + // Calculate the solubility + co2SolubilityValues[j*nPressures+i] = x_CO2/((1.0 - x_CO2)*molarMassH2O); + h2oSolubilityValues[j*nPressures+i] = y_H2O/((1.0 - y_H2O)*molarMassCO2); + } + } +} + +} // end namespace PVTProps +} // namespace constitutive +} // end namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp new file mode 100644 index 00000000000..01c71019b86 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp @@ -0,0 +1,59 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file CO2SolubilitySpycherPruess.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_FUNCTIONS_CO2SOLUBILITYSPYCHERPRUESS_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_FUNCTIONS_CO2SOLUBILITYSPYCHERPRUESS_HPP_ + +#include "constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp" + +namespace geos +{ +namespace constitutive +{ +namespace PVTProps +{ + +struct CO2SolubilitySpycherPruess +{ + +/** + * @brief Create CO2 and H2O solubility table based on Spycher, Pruess, Ennis-King (2003) + * @details Each generated table is a 2D table with lookup properties pressure (in Pa) and + * temperature (in degC). The returned CO2 solubility is in mole of CO2 per kg of + * H2O and the returned water vapourisation is in moles of H2O per kg of CO2. + * @param[in] functionName The name of the model + * @param[in] tableCoords The values of pressure and temperature + * @param[in] salinity The salinity of the brine + * @param[in] tolerance Tolerance to be used in solving for the solubility + * @param[out] co2SolubilityValues The CO2 solubility values (mol/kg) at the given pressures and temperatures + * @param[out] h2oSolubilityValues The H2O solubility values (mol/kg) at the given pressures and temperatures + */ + static void populateSolubilityTables( string const & functionName, + PTTableCoordinates const & tableCoords, + real64 const & salinity, + real64 const & tolerance, + array1d< real64 > const & co2SolubilityValues, + array1d< real64 > const & h2oSolubilityValues ); + +}; + +} // end namespace PVTProps +} // end namespace constitutive +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_FUNCTIONS_CO2SOLUBILITYSPYCHERPRUESS_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp index 951fd1c22f6..f71c6ed46dd 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp @@ -16,7 +16,6 @@ * @file PVTFunctionHelpers.cpp */ -#include "codingUtilities/StringUtilities.hpp" #include "constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp" #include "LvArray/src/sortedArrayManipulation.hpp" diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp index fd0cc5d2386..5f0e3f39276 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp @@ -19,6 +19,8 @@ #include "common/DataTypes.hpp" #include "common/Units.hpp" +#include "codingUtilities/StringUtilities.hpp" + #ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_FUNCTIONS_PVTFUNCTIONHELPERS_HPP_ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_FUNCTIONS_PVTFUNCTIONHELPERS_HPP_ @@ -122,8 +124,8 @@ class PTTableCoordinates localIndex nPressures() const { return coords[coordType::PRES].size(); } localIndex nTemperatures() const { return coords[coordType::TEMP].size(); } - void appendPressure( const real64 & pres ) { coords[coordType::PRES].emplace_back( pres ); } - void appendTemperature( const real64 & temp ) { coords[coordType::TEMP].emplace_back( temp ); } + PTTableCoordinates & appendPressure( const real64 & pres ) { coords[coordType::PRES].emplace_back( pres ); return *this; } + PTTableCoordinates & appendTemperature( const real64 & temp ) { coords[coordType::TEMP].emplace_back( temp ); return *this; } real64 const & getPressure( localIndex i ) const { return coords[coordType::PRES][i]; } real64 const & getTemperature( localIndex i ) const { return coords[coordType::TEMP][i]; } diff --git a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt index e8b27218b8f..5f03cf2eaaa 100644 --- a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt @@ -1,9 +1,11 @@ # Specify list of tests set( gtest_geosx_tests + testCapillaryPressure.cpp + testCO2BrinePVTModels.cpp + testCO2SpycherPruessModels.cpp testDamage.cpp testRelPerm.cpp - testRelPermHysteresis.cpp - testCapillaryPressure.cpp ) + testRelPermHysteresis.cpp ) set( gtest_triaxial_xmls testTriaxial_druckerPragerExtended.xml @@ -37,8 +39,7 @@ endif() if( ENABLE_PVTPackage ) list( APPEND gtest_geosx_tests - testMultiFluid.cpp - testCO2BrinePVTModels.cpp ) + testMultiFluid.cpp ) list( APPEND dependencyList PVTPackage ) endif() diff --git a/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp b/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp new file mode 100644 index 00000000000..7a248a4007b --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp @@ -0,0 +1,374 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp" +#include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mainInterface/initialization.hpp" +#include "functions/FunctionManager.hpp" + +// TPL includes +#include + +using namespace geos; +using namespace geos::testing; +using namespace geos::stringutilities; +using namespace geos::constitutive; +using namespace geos::constitutive::multifluid; +using namespace geos::constitutive::PVTProps; + +// Test parameter +using TestParam = std::tuple< + real64 const, // Pressure [Pa] + real64 const, // Temperature [C] + real64 const, // Total co2 mole fraction (z_co2 = 1-z_wat) + real64 const, // Expected vapour fraction (V) + real64 const, // Expected dissolved CO2 fraction (x_co2) + real64 const // Expected vapourised water fraction (y_wat) + >; + +class CO2SolubilitySpycherPruessTestFixture : public ::testing::TestWithParam< TestParam > +{ +protected: + static integer constexpr numPhase = 2; + static integer constexpr numComp = 2; + static integer constexpr numDof = numComp + 2; + static real64 constexpr relTol = 1.0e-5; + static real64 constexpr absTol = 1.0e-7; + static real64 constexpr pertubation = 1.0e-6; + static constexpr char const * flashContent = "FlashModel CO2Solubility 1.0e5 1.0e7 9.9e5 283.15 383.15 10.0 0.15 1.0e-8 SpycherPruess"; + +public: + CO2SolubilitySpycherPruessTestFixture() = default; + ~CO2SolubilitySpycherPruessTestFixture() override = default; + +protected: + static std::unique_ptr< CO2Solubility > makeFlashModel( string const & fileContent ); +}; + +std::unique_ptr< CO2Solubility > +CO2SolubilitySpycherPruessTestFixture::makeFlashModel( string const & fileContent ) +{ + // Define phase names + string_array phaseNames; + phaseNames.resize( 2 ); + phaseNames[0] = "gas"; + phaseNames[1] = "liquid"; + + // Define component names and molar weight + string_array componentNames; + componentNames.resize( 2 ); + componentNames[0] = "co2"; + componentNames[1] = "water"; + + array1d< real64 > componentMolarWeight; + componentMolarWeight.resize( 2 ); + componentMolarWeight[0] = 44.0e-3; + componentMolarWeight[1] = 18.0e-3; + + // Read file parameters + array1d< string > const strs = stringutilities::tokenizeBySpaces< array1d >( fileContent ); + + return std::make_unique< CO2Solubility >( strs[1], + strs, + phaseNames, + componentNames, + componentMolarWeight, + false ); +} + +TEST_P( CO2SolubilitySpycherPruessTestFixture, testExpectedValues ) +{ + auto flashModel = makeFlashModel( CO2SolubilitySpycherPruessTestFixture::flashContent ); + + auto [pressure, temperature, z_co2, expected_V, expected_x_co2, expected_y_wat] = GetParam(); + + StackArray< real64, 1, numComp > composition( 2 ); + composition[0] = z_co2; + composition[1] = 1.0 - z_co2; + + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseFrac( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseFrac( 1, 1, numPhase, numDof ); + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > + phaseFracAndDeriv { phaseFrac[0][0], dPhaseFrac[0][0] }; + + StackArray< real64, 4, numComp *numPhase, LAYOUT_PHASE_COMP > phaseCompFrac( 1, 1, numPhase, numComp ); + StackArray< real64, 5, numDof *numComp *numPhase, LAYOUT_PHASE_COMP_DC > dPhaseCompFrac( 1, 1, numPhase, numComp, numDof ); + MultiFluidVarSlice< real64, 2, USD_PHASE_COMP - 2, USD_PHASE_COMP_DC - 2 > + phaseCompFracAndDeriv { phaseCompFrac[0][0], dPhaseCompFrac[0][0] }; + + auto flashModelWrapper = flashModel->createKernelWrapper(); + + flashModelWrapper.compute( pressure, + temperature, + composition.toSliceConst(), + phaseFracAndDeriv, + phaseCompFracAndDeriv ); + + real64 const V = phaseFracAndDeriv.value[0]; + real64 const x_co2 = phaseCompFracAndDeriv.value[1][0]; + real64 const y_wat = phaseCompFracAndDeriv.value[0][1]; + + checkRelativeError( V, expected_V, relTol, absTol ); + checkRelativeError( x_co2, expected_x_co2, relTol, absTol ); + checkRelativeError( y_wat, expected_y_wat, relTol, absTol ); +} + +TEST_P( CO2SolubilitySpycherPruessTestFixture, testNumericalDerivatives ) +{ + using Deriv = multifluid::DerivativeOffset; + + auto flashModel = makeFlashModel( CO2SolubilitySpycherPruessTestFixture::flashContent ); + + auto [pressure, temperature, z_co2, expected_V, expected_x_co2, expected_y_wat] = GetParam(); + GEOS_UNUSED_VAR( expected_V, expected_x_co2, expected_y_wat ); + + StackArray< real64, 1, numComp > composition( numComp ); + composition[0] = z_co2; + composition[1] = 1.0 - z_co2; + StackArray< real64, 1, numComp > perturbedComposition( numComp ); + + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseFrac( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseFrac( 1, 1, numPhase, numDof ); + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > + phaseFracAndDeriv { phaseFrac[0][0], dPhaseFrac[0][0] }; + + StackArray< real64, 4, numComp *numPhase, LAYOUT_PHASE_COMP > phaseCompFrac( 1, 1, numPhase, numComp ); + StackArray< real64, 5, numDof *numComp *numPhase, LAYOUT_PHASE_COMP_DC > dPhaseCompFrac( 1, 1, numPhase, numComp, numDof ); + MultiFluidVarSlice< real64, 2, USD_PHASE_COMP - 2, USD_PHASE_COMP_DC - 2 > + phaseCompFracAndDeriv { phaseCompFrac[0][0], dPhaseCompFrac[0][0] }; + + // 1) First compute the unperturbed parameters + + auto flashModelWrapper = flashModel->createKernelWrapper(); + + flashModelWrapper.compute( pressure, + temperature, + composition.toSliceConst(), + phaseFracAndDeriv, + phaseCompFracAndDeriv ); + + StackArray< real64, 3, numPhase, LAYOUT_PHASE > perturbedPhaseFrac( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPerturbedPhaseFrac( 1, 1, numPhase, numDof ); + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > + perturbedPhaseFracAndDeriv { perturbedPhaseFrac[0][0], dPerturbedPhaseFrac[0][0] }; + + StackArray< real64, 4, numComp *numPhase, LAYOUT_PHASE_COMP > perturbedPhaseCompFrac( 1, 1, numPhase, numComp ); + StackArray< real64, 5, numDof *numComp *numPhase, LAYOUT_PHASE_COMP_DC > dPerturbedPhaseCompFrac( 1, 1, numPhase, numComp, numDof ); + MultiFluidVarSlice< real64, 2, USD_PHASE_COMP - 2, USD_PHASE_COMP_DC - 2 > + perturbedPhaseCompFracAndDeriv { perturbedPhaseCompFrac[0][0], dPerturbedPhaseCompFrac[0][0] }; + + real64 numericalDerivative = 0.0; + real64 analyticalDerivative = 0.0; + + // 2) Check derivative with respect to pressure + real64 const dP = pertubation * pressure; + flashModelWrapper.compute( pressure + dP, + temperature, + composition.toSliceConst(), + perturbedPhaseFracAndDeriv, + perturbedPhaseCompFracAndDeriv ); + + for( integer i = 0; i < numPhase; ++i ) + { + numericalDerivative = (perturbedPhaseFracAndDeriv.value[i]-phaseFracAndDeriv.value[i])/dP; + analyticalDerivative = perturbedPhaseFracAndDeriv.derivs[i][Deriv::dP]; + checkRelativeError( numericalDerivative, analyticalDerivative, relTol, absTol ); + for( integer j = 0; j < numComp; ++j ) + { + numericalDerivative = (perturbedPhaseCompFracAndDeriv.value[i][j]-phaseCompFracAndDeriv.value[i][j])/dP; + analyticalDerivative = perturbedPhaseCompFracAndDeriv.derivs[i][j][Deriv::dP]; + checkRelativeError( numericalDerivative, analyticalDerivative, relTol, absTol ); + } + } + + // 3) Check derivative with respect to temperature + real64 const dT = pertubation * temperature; + flashModelWrapper.compute( pressure, + temperature + dT, + composition.toSliceConst(), + perturbedPhaseFracAndDeriv, + perturbedPhaseCompFracAndDeriv ); + + for( integer i = 0; i < numPhase; ++i ) + { + numericalDerivative = (perturbedPhaseFracAndDeriv.value[i]-phaseFracAndDeriv.value[i])/dT; + analyticalDerivative = perturbedPhaseFracAndDeriv.derivs[i][Deriv::dT]; + checkRelativeError( numericalDerivative, analyticalDerivative, relTol, absTol ); + + for( integer j = 0; j < numComp; ++j ) + { + numericalDerivative = (perturbedPhaseCompFracAndDeriv.value[i][j]-phaseCompFracAndDeriv.value[i][j])/dT; + analyticalDerivative = perturbedPhaseCompFracAndDeriv.derivs[i][j][Deriv::dT]; + checkRelativeError( numericalDerivative, analyticalDerivative, relTol, absTol ); + } + } + + // 4) Check derivative with respect to composition + for( integer ic=0; ic < numComp; ++ic ) + { + real64 const dC = pertubation; + for( integer k=0; k < numComp; ++k ) + perturbedComposition[k] = composition[k]; + perturbedComposition[ic] += dC; + + flashModelWrapper.compute( pressure, + temperature, + perturbedComposition.toSliceConst(), + perturbedPhaseFracAndDeriv, + perturbedPhaseCompFracAndDeriv ); + + for( integer i = 0; i < numPhase; ++i ) + { + numericalDerivative = (perturbedPhaseFracAndDeriv.value[i]-phaseFracAndDeriv.value[i])/dC; + analyticalDerivative = perturbedPhaseFracAndDeriv.derivs[i][Deriv::dC+ic]; + checkRelativeError( numericalDerivative, analyticalDerivative, relTol, absTol ); + + for( integer j = 0; j < numComp; ++j ) + { + numericalDerivative = (perturbedPhaseCompFracAndDeriv.value[i][j]-phaseCompFracAndDeriv.value[i][j])/dC; + analyticalDerivative = perturbedPhaseCompFracAndDeriv.derivs[i][j][Deriv::dC+ic]; + checkRelativeError( numericalDerivative, analyticalDerivative, relTol, absTol ); + } + } + } +} + +// Test data +std::vector< TestParam > generateTestData() +{ + return { + {1.00000000e+05, 1.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+05, 5.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+05, 8.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+05, 1.10000000e+02, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+06, 1.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+06, 5.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+06, 8.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+06, 1.10000000e+02, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {5.00000000e+06, 1.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {5.00000000e+06, 5.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {5.00000000e+06, 8.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {5.00000000e+06, 1.10000000e+02, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+07, 1.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+07, 5.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+07, 8.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+07, 1.10000000e+02, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+08, 1.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+08, 5.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+08, 8.00000000e+01, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+08, 1.10000000e+02, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+05, 1.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+05, 5.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+05, 8.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+05, 1.10000000e+02, 1.00000000e-05, 1.00000000e-05, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+06, 1.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+06, 5.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+06, 8.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+06, 1.10000000e+02, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {5.00000000e+06, 1.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {5.00000000e+06, 5.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {5.00000000e+06, 8.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {5.00000000e+06, 1.10000000e+02, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+07, 1.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+07, 5.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+07, 8.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+07, 1.10000000e+02, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+08, 1.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+08, 5.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+08, 8.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+08, 1.10000000e+02, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, + {1.00000000e+05, 1.00000000e+01, 3.00000000e-01, 3.03161030e-01, 8.58355906e-04, 1.23998968e-02}, + {1.00000000e+05, 5.00000000e+01, 3.00000000e-01, 3.42216891e-01, 3.10066097e-04, 1.23958952e-01}, + {1.00000000e+05, 8.00000000e+01, 3.00000000e-01, 5.66944658e-01, 1.24160030e-04, 4.70942662e-01}, + {1.00000000e+05, 1.10000000e+02, 3.00000000e-01, 3.00000000e-01, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+06, 1.00000000e+01, 3.00000000e-01, 2.94948990e-01, 8.11504677e-03, 2.27331474e-03}, + {1.00000000e+06, 5.00000000e+01, 3.00000000e-01, 3.04861076e-01, 3.32772200e-03, 2.35330303e-02}, + {1.00000000e+06, 8.00000000e+01, 3.00000000e-01, 3.35758987e-01, 2.14620607e-03, 1.10747849e-01}, + {1.00000000e+06, 1.10000000e+02, 3.00000000e-01, 3.40957999e-01, 1.62203194e-03, 1.23261476e-01}, + {5.00000000e+06, 1.00000000e+01, 3.00000000e-01, 2.79742151e-01, 2.89079228e-02, 2.01367187e-03}, + {5.00000000e+06, 5.00000000e+01, 3.00000000e-01, 2.91378214e-01, 1.36880088e-02, 3.69909366e-03}, + {5.00000000e+06, 8.00000000e+01, 3.00000000e-01, 2.97134400e-01, 9.51668603e-03, 1.28674138e-02}, + {5.00000000e+06, 1.10000000e+02, 3.00000000e-01, 3.05337535e-01, 8.04059852e-03, 3.57736478e-02}, + {1.00000000e+07, 1.00000000e+01, 3.00000000e-01, 2.78859111e-01, 3.01769401e-02, 2.22670319e-03}, + {1.00000000e+07, 5.00000000e+01, 3.00000000e-01, 2.86981820e-01, 1.98935606e-02, 4.06398711e-03}, + {1.00000000e+07, 8.00000000e+01, 3.00000000e-01, 2.91881746e-01, 1.54455782e-02, 9.65816584e-03}, + {1.00000000e+07, 1.10000000e+02, 3.00000000e-01, 2.97372350e-01, 1.38649677e-02, 2.39237441e-02}, + {1.00000000e+08, 1.00000000e+01, 3.00000000e-01, 2.78859111e-01, 3.01769401e-02, 2.22670319e-03}, + {1.00000000e+08, 5.00000000e+01, 3.00000000e-01, 2.86981820e-01, 1.98935606e-02, 4.06398711e-03}, + {1.00000000e+08, 8.00000000e+01, 3.00000000e-01, 2.91881746e-01, 1.54455782e-02, 9.65816584e-03}, + {1.00000000e+08, 1.10000000e+02, 3.00000000e-01, 2.97372350e-01, 1.38649677e-02, 2.39237441e-02}, + {1.00000000e+05, 1.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+05, 5.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+05, 8.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+05, 1.10000000e+02, 9.99990000e-01, 9.99990000e-01, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+06, 1.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+06, 5.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+06, 8.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+06, 1.10000000e+02, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {5.00000000e+06, 1.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {5.00000000e+06, 5.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {5.00000000e+06, 8.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {5.00000000e+06, 1.10000000e+02, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+07, 1.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+07, 5.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+07, 8.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+07, 1.10000000e+02, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+08, 1.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+08, 5.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+08, 8.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+08, 1.10000000e+02, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, + {1.00000000e+05, 1.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+05, 5.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+05, 8.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+05, 1.10000000e+02, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+06, 1.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+06, 5.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+06, 8.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+06, 1.10000000e+02, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {5.00000000e+06, 1.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {5.00000000e+06, 5.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {5.00000000e+06, 8.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {5.00000000e+06, 1.10000000e+02, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+07, 1.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+07, 5.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+07, 8.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+07, 1.10000000e+02, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+08, 1.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+08, 5.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+08, 8.00000000e+01, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00}, + {1.00000000e+08, 1.10000000e+02, 1.00000000e+00, 1.00000000e+00, 0.00000000e+00, 0.00000000e+00} + }; +} + +INSTANTIATE_TEST_SUITE_P( + CO2SolubilitySpycherPruessTest, + CO2SolubilitySpycherPruessTestFixture, + ::testing::ValuesIn( generateTestData() ) + ); + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + + geos::GeosxState state( geos::basicSetup( argc, argv ) ); + + int const result = RUN_ALL_TESTS(); + + geos::basicCleanup(); + + return result; +} diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine.xml index 7363117393c..12ec4e62d8d 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine.xml @@ -46,6 +46,28 @@ outputPhaseComposition="1" baseline="testPVT_CO2Brine_testCo2BrineEzrokhiMixtureB.txt" logLevel="1" /> + + + + @@ -79,6 +107,13 @@ componentMolarWeight="{ 44e-3, 18e-3 }" phasePVTParaFiles="{ testPVT_data/carbonDioxidePVT.txt, testPVT_data/brinePVTEzrokhi.txt }" flashModelParaFile="testPVT_data/carbonDioxideFlash.txt" /> + diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine_testCo2SpycherPruessBrinePhillipsMixtureA.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine_testCo2SpycherPruessBrinePhillipsMixtureA.txt new file mode 100644 index 00000000000..0a33d6dc22e --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine_testCo2SpycherPruessBrinePhillipsMixtureA.txt @@ -0,0 +1,31 @@ +# column 1 = time +# column 2 = pressure +# column 3 = temperature +# column 4 = density +# column 5 = total compressibility +# columns 6-7 = phase fractions +# columns 8-9 = phase densities +# columns 10-11 = phase viscosities +# columns 12-13 = gas phase fractions [co2, water] +# columns 14-15 = water phase fractions [co2, water] +0.0000e+00 1.0000e+06 3.5000e+02 6.7780e+01 2.1337e-08 2.1773e-01 7.8227e-01 1.5581e+01 1.0033e+03 1.7476e-05 4.1330e-04 9.5589e-01 4.4112e-02 2.2320e-03 9.9777e-01 +5.0000e-02 6.4444e+06 3.5000e+02 4.2328e+02 1.3988e-07 1.9253e-01 8.0747e-01 1.2309e+02 1.0114e+03 1.8998e-05 4.1330e-04 9.8984e-01 1.0158e-02 1.1731e-02 9.8827e-01 +1.0000e-01 1.1889e+07 3.5000e+02 7.1407e+02 6.1644e-08 1.8180e-01 8.1820e-01 3.0497e+02 1.0173e+03 2.5353e-05 4.1330e-04 9.9079e-01 9.2115e-03 1.7035e-02 9.8297e-01 +1.5000e-01 1.7333e+07 3.5000e+02 8.8262e+02 1.8484e-08 1.7661e-01 8.2339e-01 5.3970e+02 1.0219e+03 4.0932e-05 4.1330e-04 9.8874e-01 1.1255e-02 1.9789e-02 9.8021e-01 +2.0000e-01 2.2778e+07 3.5000e+02 9.3903e+02 7.0636e-09 1.7314e-01 8.2686e-01 6.6850e+02 1.0260e+03 5.3806e-05 4.1330e-04 9.8725e-01 1.2749e-02 2.1623e-02 9.7838e-01 +2.5000e-01 2.8222e+07 3.5000e+02 9.6553e+02 3.7969e-09 1.7065e-01 8.2935e-01 7.4098e+02 1.0297e+03 6.3051e-05 4.1330e-04 9.8650e-01 1.3500e-02 2.2909e-02 9.7709e-01 +3.0000e-01 3.3667e+07 3.5000e+02 9.8236e+02 2.6667e-09 1.6883e-01 8.3117e-01 7.9054e+02 1.0333e+03 7.0528e-05 4.1330e-04 9.8604e-01 1.3961e-02 2.3841e-02 9.7616e-01 +3.5000e-01 3.9111e+07 3.5000e+02 9.9478e+02 2.0090e-09 1.6746e-01 8.3254e-01 8.2831e+02 1.0367e+03 7.7028e-05 4.1330e-04 9.8571e-01 1.4290e-02 2.4538e-02 9.7546e-01 +4.0000e-01 4.4556e+07 3.5000e+02 1.0047e+03 1.6650e-09 1.6641e-01 8.3359e-01 8.5890e+02 1.0400e+03 8.2914e-05 4.1330e-04 9.8545e-01 1.4547e-02 2.5069e-02 9.7493e-01 +4.5000e-01 5.0000e+07 3.5000e+02 1.0131e+03 5.1360e-11 1.6561e-01 8.3439e-01 8.8476e+02 1.0432e+03 8.8389e-05 4.1330e-04 9.8524e-01 1.4761e-02 2.5477e-02 9.7452e-01 +5.0000e-01 3.0000e+07 3.0400e+02 9.8816e+02 2.6607e-09 1.6844e-01 8.3156e-01 8.0121e+02 1.0372e+03 7.1971e-05 8.6631e-04 9.8918e-01 1.0819e-02 2.3786e-02 9.7621e-01 +5.5000e-01 1.0000e+07 2.5800e+02 6.6430e+02 8.2527e-08 1.8156e-01 8.1844e-01 2.5862e+02 1.0189e+03 2.2796e-05 1.9511e-03 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +6.0000e-01 1.0000e+07 2.7156e+02 6.6481e+02 8.2643e-08 1.8156e-01 8.1844e-01 2.5862e+02 1.0203e+03 2.2796e-05 1.9588e-03 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +6.5000e-01 1.0000e+07 2.8511e+02 6.6522e+02 8.2733e-08 1.8156e-01 8.1844e-01 2.5862e+02 1.0215e+03 2.2796e-05 1.3681e-03 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +7.0000e-01 1.0000e+07 2.9867e+02 6.6551e+02 8.2800e-08 1.8156e-01 8.1844e-01 2.5862e+02 1.0223e+03 2.2796e-05 9.7022e-04 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +7.5000e-01 1.0000e+07 3.1222e+02 6.6570e+02 8.2842e-08 1.8156e-01 8.1844e-01 2.5862e+02 1.0229e+03 2.2796e-05 7.3691e-04 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +8.0000e-01 1.0000e+07 3.2578e+02 6.6579e+02 8.2862e-08 1.8156e-01 8.1844e-01 2.5862e+02 1.0231e+03 2.2796e-05 5.8345e-04 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +8.5000e-01 1.0000e+07 3.3933e+02 6.6563e+02 8.2888e-08 1.8167e-01 8.1833e-01 2.5862e+02 1.0231e+03 2.2796e-05 4.7645e-04 9.9353e-01 6.4726e-03 1.6875e-02 9.8313e-01 +9.0000e-01 1.0000e+07 3.5289e+02 6.1186e+02 7.9623e-08 1.8498e-01 8.1502e-01 2.2287e+02 1.0133e+03 2.2020e-05 3.9764e-04 9.9066e-01 9.3377e-03 1.5456e-02 9.8454e-01 +9.5000e-01 1.0000e+07 3.6644e+02 5.8928e+02 7.7989e-08 1.8498e-01 8.1502e-01 2.0825e+02 1.0078e+03 2.1800e-05 3.4093e-04 9.9066e-01 9.3377e-03 1.5456e-02 9.8454e-01 +1.0000e+00 1.0000e+07 3.8000e+02 5.8907e+02 7.7935e-08 1.8498e-01 8.1502e-01 2.0825e+02 1.0070e+03 2.1860e-05 2.9672e-04 9.9066e-01 9.3377e-03 1.5456e-02 9.8454e-01 diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine_testCo2SpycherPruessBrinePhillipsMixtureB.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine_testCo2SpycherPruessBrinePhillipsMixtureB.txt new file mode 100644 index 00000000000..762ffae5a75 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine_testCo2SpycherPruessBrinePhillipsMixtureB.txt @@ -0,0 +1,31 @@ +# column 1 = time +# column 2 = pressure +# column 3 = temperature +# column 4 = density +# column 5 = total compressibility +# columns 6-7 = phase fractions +# columns 8-9 = phase densities +# columns 10-11 = phase viscosities +# columns 12-13 = gas phase fractions [co2, water] +# columns 14-15 = water phase fractions [co2, water] +0.0000e+00 1.0000e+06 3.5000e+02 2.9256e+01 8.7493e-09 5.2521e-01 4.7479e-01 1.5581e+01 1.0033e+03 1.7476e-05 4.1330e-04 9.5589e-01 4.4112e-02 2.2320e-03 9.9777e-01 +5.0000e-02 6.4444e+06 3.5000e+02 2.1910e+02 1.8135e-07 5.0111e-01 4.9889e-01 1.2309e+02 1.0114e+03 1.8998e-05 4.1330e-04 9.8984e-01 1.0158e-02 1.1731e-02 9.8827e-01 +1.0000e-01 1.1889e+07 3.5000e+02 4.7218e+02 1.0761e-07 4.9425e-01 5.0575e-01 3.0497e+02 1.0173e+03 2.5353e-05 4.1330e-04 9.9079e-01 9.2115e-03 1.7035e-02 9.8297e-01 +1.5000e-01 1.7333e+07 3.5000e+02 7.1004e+02 3.9438e-08 4.9158e-01 5.0842e-01 5.3970e+02 1.0219e+03 4.0932e-05 4.1330e-04 9.8874e-01 1.1255e-02 1.9789e-02 9.8021e-01 +2.0000e-01 2.2778e+07 3.5000e+02 8.1301e+02 1.5784e-08 4.8984e-01 5.1016e-01 6.6850e+02 1.0260e+03 5.3806e-05 4.1330e-04 9.8725e-01 1.2749e-02 2.1623e-02 9.7838e-01 +2.5000e-01 2.8222e+07 3.5000e+02 8.6506e+02 8.4258e-09 4.8850e-01 5.1150e-01 7.4098e+02 1.0297e+03 6.3051e-05 4.1330e-04 9.8650e-01 1.3500e-02 2.2909e-02 9.7709e-01 +3.0000e-01 3.3667e+07 3.5000e+02 8.9875e+02 5.8443e-09 4.8750e-01 5.1250e-01 7.9054e+02 1.0333e+03 7.0528e-05 4.1330e-04 9.8604e-01 1.3961e-02 2.3841e-02 9.7616e-01 +3.5000e-01 3.9111e+07 3.5000e+02 9.2359e+02 4.2911e-09 4.8675e-01 5.1325e-01 8.2831e+02 1.0367e+03 7.7028e-05 4.1330e-04 9.8571e-01 1.4290e-02 2.4538e-02 9.7546e-01 +4.0000e-01 4.4556e+07 3.5000e+02 9.4329e+02 3.4823e-09 4.8618e-01 5.1382e-01 8.5890e+02 1.0400e+03 8.2914e-05 4.1330e-04 9.8545e-01 1.4547e-02 2.5069e-02 9.7493e-01 +4.5000e-01 5.0000e+07 3.5000e+02 9.5970e+02 2.8240e-11 4.8574e-01 5.1426e-01 8.8476e+02 1.0432e+03 8.8389e-05 4.1330e-04 9.8524e-01 1.4761e-02 2.5477e-02 9.7452e-01 +5.0000e-01 3.0000e+07 3.0400e+02 9.0721e+02 5.8529e-09 4.8643e-01 5.1357e-01 8.0121e+02 1.0372e+03 7.1971e-05 8.6631e-04 9.8918e-01 1.0819e-02 2.3786e-02 9.7621e-01 +5.5000e-01 1.0000e+07 2.5800e+02 4.1580e+02 1.3435e-07 4.9338e-01 5.0662e-01 2.5862e+02 1.0189e+03 2.2796e-05 1.9511e-03 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +6.0000e-01 1.0000e+07 2.7156e+02 4.1592e+02 1.3441e-07 4.9338e-01 5.0662e-01 2.5862e+02 1.0203e+03 2.2796e-05 1.9588e-03 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +6.5000e-01 1.0000e+07 2.8511e+02 4.1602e+02 1.3446e-07 4.9338e-01 5.0662e-01 2.5862e+02 1.0215e+03 2.2796e-05 1.3681e-03 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +7.0000e-01 1.0000e+07 2.9867e+02 4.1609e+02 1.3449e-07 4.9338e-01 5.0662e-01 2.5862e+02 1.0223e+03 2.2796e-05 9.7022e-04 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +7.5000e-01 1.0000e+07 3.1222e+02 4.1614e+02 1.3452e-07 4.9338e-01 5.0662e-01 2.5862e+02 1.0229e+03 2.2796e-05 7.3691e-04 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +8.0000e-01 1.0000e+07 3.2578e+02 4.1616e+02 1.3453e-07 4.9338e-01 5.0662e-01 2.5862e+02 1.0231e+03 2.2796e-05 5.8345e-04 9.9359e-01 6.4066e-03 1.6921e-02 9.8308e-01 +8.5000e-01 1.0000e+07 3.3933e+02 4.1611e+02 1.3454e-07 4.9346e-01 5.0654e-01 2.5862e+02 1.0231e+03 2.2796e-05 4.7645e-04 9.9353e-01 6.4726e-03 1.6875e-02 9.8313e-01 +9.0000e-01 1.0000e+07 3.5289e+02 3.6713e+02 1.2176e-07 4.9624e-01 5.0376e-01 2.2287e+02 1.0133e+03 2.2020e-05 3.9764e-04 9.9066e-01 9.3377e-03 1.5456e-02 9.8454e-01 +9.5000e-01 1.0000e+07 3.6644e+02 3.4688e+02 1.1663e-07 4.9624e-01 5.0376e-01 2.0825e+02 1.0078e+03 2.1800e-05 3.4093e-04 9.9066e-01 9.3377e-03 1.5456e-02 9.8454e-01 +1.0000e+00 1.0000e+07 3.8000e+02 3.4684e+02 1.1661e-07 4.9624e-01 5.0376e-01 2.0825e+02 1.0070e+03 2.1860e-05 2.9672e-04 9.9066e-01 9.3377e-03 1.5456e-02 9.8454e-01 diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_data/carbonDioxideSpycherPruessFlash.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_data/carbonDioxideSpycherPruessFlash.txt new file mode 100644 index 00000000000..98f2cb18927 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_data/carbonDioxideSpycherPruessFlash.txt @@ -0,0 +1 @@ +FlashModel CO2Solubility 0.99e6 5.01e7 4.911e6 339 351 1 0 1.0e-10 SpycherPruess From 8c37d379aac64e4aad1e24fe7ebd4447da018251 Mon Sep 17 00:00:00 2001 From: Lionel Untereiner Date: Fri, 15 Mar 2024 23:49:22 +0100 Subject: [PATCH 015/286] add dependabot (#2962) --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..7e248436149 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +version: 2 +updates: +- package-ecosystem: github-actions + directory: / + schedule: + interval: monthly + groups: + # open a single pull-request for all GitHub actions updates + github-actions: + patterns: + - '*' \ No newline at end of file From 2097a5453978accbe88fb86d2ae1050eb49a0020 Mon Sep 17 00:00:00 2001 From: TotoGaz <49004943+TotoGaz@users.noreply.github.com> Date: Fri, 15 Mar 2024 18:27:11 -0700 Subject: [PATCH 016/286] Reassess include of the mesh generators (#3038) Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- src/coreComponents/common/MpiWrapper.hpp | 1 - src/coreComponents/mesh/generators/CellBlock.hpp | 2 -- .../mesh/generators/CellBlockUtilities.cpp | 2 -- .../mesh/generators/CollocatedNodes.cpp | 5 +++++ .../mesh/generators/CollocatedNodes.hpp | 4 ---- .../mesh/generators/InternalMeshGenerator.cpp | 1 - .../mesh/generators/InternalWellboreGenerator.cpp | 1 - src/coreComponents/mesh/generators/LineBlock.cpp | 7 ------- src/coreComponents/mesh/generators/LineBlock.hpp | 1 - src/coreComponents/mesh/generators/LineBlockABC.hpp | 2 -- .../mesh/generators/MeshGeneratorBase.hpp | 1 - .../mesh/generators/PTScotchInterface.hpp | 1 + .../mesh/generators/ParticleBlock.cpp | 2 -- .../mesh/generators/ParticleBlock.hpp | 5 ++--- .../mesh/generators/ParticleBlockABC.hpp | 3 ++- .../mesh/generators/ParticleBlockManager.cpp | 4 ---- .../mesh/generators/ParticleBlockManager.hpp | 2 +- .../mesh/generators/ParticleBlockManagerABC.hpp | 2 -- .../mesh/generators/ParticleMeshGenerator.cpp | 4 +--- .../mesh/generators/ParticleMeshGenerator.hpp | 3 ++- .../mesh/generators/VTKFaceBlockUtilities.cpp | 4 ++-- .../mesh/generators/VTKFaceBlockUtilities.hpp | 3 ++- .../mesh/generators/VTKMeshGenerator.cpp | 2 -- .../mesh/generators/VTKMeshGenerator.hpp | 1 + .../mesh/generators/VTKMeshGeneratorTools.cpp | 9 +++------ .../mesh/generators/VTKMeshGeneratorTools.hpp | 13 +++++-------- src/coreComponents/mesh/generators/VTKUtilities.hpp | 4 +--- .../mesh/generators/VTKWellGenerator.cpp | 1 - .../mesh/generators/VTKWellGenerator.hpp | 1 - 29 files changed, 28 insertions(+), 63 deletions(-) diff --git a/src/coreComponents/common/MpiWrapper.hpp b/src/coreComponents/common/MpiWrapper.hpp index 10fb0dccde6..3c8c97a3dce 100644 --- a/src/coreComponents/common/MpiWrapper.hpp +++ b/src/coreComponents/common/MpiWrapper.hpp @@ -20,7 +20,6 @@ #include "common/DataTypes.hpp" #include "common/Span.hpp" -#include "mesh/ElementType.hpp" #if defined(GEOSX_USE_MPI) #include diff --git a/src/coreComponents/mesh/generators/CellBlock.hpp b/src/coreComponents/mesh/generators/CellBlock.hpp index dbb686c0f44..01fa2124bd8 100644 --- a/src/coreComponents/mesh/generators/CellBlock.hpp +++ b/src/coreComponents/mesh/generators/CellBlock.hpp @@ -16,8 +16,6 @@ #define GEOS_MESH_CELLBLOCK_HPP_ #include "dataRepository/Group.hpp" -#include "mesh/utilities/ComputationalGeometry.hpp" -#include "common/GEOS_RAJA_Interface.hpp" #include "mesh/generators/CellBlockABC.hpp" #include "mesh/ElementType.hpp" diff --git a/src/coreComponents/mesh/generators/CellBlockUtilities.cpp b/src/coreComponents/mesh/generators/CellBlockUtilities.cpp index 74190802863..d29fadbc5ef 100644 --- a/src/coreComponents/mesh/generators/CellBlockUtilities.cpp +++ b/src/coreComponents/mesh/generators/CellBlockUtilities.cpp @@ -15,8 +15,6 @@ #include "CellBlockUtilities.hpp" #include "codingUtilities/Utilities.hpp" -#include "common/GEOS_RAJA_Interface.hpp" -#include "common/TimingMacros.hpp" #include "mesh/generators/CellBlockManagerABC.hpp" #include "mesh/generators/PrismUtilities.hpp" diff --git a/src/coreComponents/mesh/generators/CollocatedNodes.cpp b/src/coreComponents/mesh/generators/CollocatedNodes.cpp index 80ebf967963..4351294fee2 100644 --- a/src/coreComponents/mesh/generators/CollocatedNodes.cpp +++ b/src/coreComponents/mesh/generators/CollocatedNodes.cpp @@ -14,6 +14,11 @@ #include "CollocatedNodes.hpp" +#include "common/MpiWrapper.hpp" + + +#include + namespace geos::vtk { diff --git a/src/coreComponents/mesh/generators/CollocatedNodes.hpp b/src/coreComponents/mesh/generators/CollocatedNodes.hpp index a4819d67e08..e028569b054 100644 --- a/src/coreComponents/mesh/generators/CollocatedNodes.hpp +++ b/src/coreComponents/mesh/generators/CollocatedNodes.hpp @@ -17,14 +17,10 @@ #include "common/DataTypes.hpp" -#include "common/MpiWrapper.hpp" - #include #include -#include #include - namespace geos::vtk { diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index 52727b04258..23845ab3b8f 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -20,7 +20,6 @@ #include "CellBlockManager.hpp" #include "common/DataTypes.hpp" -#include "common/TimingMacros.hpp" #include diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp index 9dfe5df2c53..9dbb3ab931a 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp @@ -18,7 +18,6 @@ #include "InternalWellboreGenerator.hpp" -#include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/SpatialPartition.hpp" namespace geos diff --git a/src/coreComponents/mesh/generators/LineBlock.cpp b/src/coreComponents/mesh/generators/LineBlock.cpp index b49289325b4..05b655657b6 100644 --- a/src/coreComponents/mesh/generators/LineBlock.cpp +++ b/src/coreComponents/mesh/generators/LineBlock.cpp @@ -12,14 +12,7 @@ * ------------------------------------------------------------------------------------------------------------ */ -/** - * @file DomainPartition.cpp - */ - -#include "mesh/Perforation.hpp" #include "mesh/generators/LineBlock.hpp" -#include "mesh/generators/InternalWellGenerator.hpp" - namespace geos diff --git a/src/coreComponents/mesh/generators/LineBlock.hpp b/src/coreComponents/mesh/generators/LineBlock.hpp index 0582ee45f21..d81463dd4a3 100644 --- a/src/coreComponents/mesh/generators/LineBlock.hpp +++ b/src/coreComponents/mesh/generators/LineBlock.hpp @@ -16,7 +16,6 @@ #define GEOSX_WELLBLOCK_HPP #include "mesh/generators/LineBlockABC.hpp" -#include "mesh/generators/InternalWellGenerator.hpp" namespace geos diff --git a/src/coreComponents/mesh/generators/LineBlockABC.hpp b/src/coreComponents/mesh/generators/LineBlockABC.hpp index 240f1b633ef..723aaa69f7e 100644 --- a/src/coreComponents/mesh/generators/LineBlockABC.hpp +++ b/src/coreComponents/mesh/generators/LineBlockABC.hpp @@ -16,9 +16,7 @@ #define GEOSX_WELLBLOCKABC_HPP #include "dataRepository/Group.hpp" -#include "mesh/ElementType.hpp" #include "common/DataTypes.hpp" -#include "dataRepository/Group.hpp" #include diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp index db085ee8b14..016e00e1389 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp @@ -20,7 +20,6 @@ #define GEOS_MESH_GENERATORS_MESHGENERATORBASE_HPP #include "mesh/mpiCommunications/SpatialPartition.hpp" -#include "mesh/generators/CellBlockManagerABC.hpp" #include "dataRepository/Group.hpp" #include "dataRepository/WrapperBase.hpp" diff --git a/src/coreComponents/mesh/generators/PTScotchInterface.hpp b/src/coreComponents/mesh/generators/PTScotchInterface.hpp index 6806ece7ed8..23999876031 100644 --- a/src/coreComponents/mesh/generators/PTScotchInterface.hpp +++ b/src/coreComponents/mesh/generators/PTScotchInterface.hpp @@ -20,6 +20,7 @@ #define GEOS_MESH_GENERATORS_PTSCOTCHINTERFACE_HPP_ #include "common/DataTypes.hpp" + #include "common/MpiWrapper.hpp" namespace geos diff --git a/src/coreComponents/mesh/generators/ParticleBlock.cpp b/src/coreComponents/mesh/generators/ParticleBlock.cpp index 55caa0aaadb..2d3b605ad9e 100644 --- a/src/coreComponents/mesh/generators/ParticleBlock.cpp +++ b/src/coreComponents/mesh/generators/ParticleBlock.cpp @@ -19,8 +19,6 @@ #include "ParticleBlock.hpp" -#include "common/GEOS_RAJA_Interface.hpp" - namespace geos { using namespace dataRepository; diff --git a/src/coreComponents/mesh/generators/ParticleBlock.hpp b/src/coreComponents/mesh/generators/ParticleBlock.hpp index ff054619bc4..333fb196ae3 100644 --- a/src/coreComponents/mesh/generators/ParticleBlock.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlock.hpp @@ -15,12 +15,11 @@ #ifndef GEOSX_MESH_PARTICLEBLOCK_HPP_ #define GEOSX_MESH_PARTICLEBLOCK_HPP_ -#include "dataRepository/Group.hpp" -#include "mesh/utilities/ComputationalGeometry.hpp" -#include "common/GEOS_RAJA_Interface.hpp" #include "mesh/generators/ParticleBlockABC.hpp" #include "mesh/ParticleType.hpp" +#include "dataRepository/Group.hpp" + namespace geos { diff --git a/src/coreComponents/mesh/generators/ParticleBlockABC.hpp b/src/coreComponents/mesh/generators/ParticleBlockABC.hpp index 030e2ce3e92..17c232b1d60 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockABC.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockABC.hpp @@ -15,8 +15,9 @@ #ifndef GEOSX_PARTICLEBLOCKABC_HPP #define GEOSX_PARTICLEBLOCKABC_HPP -#include "dataRepository/Group.hpp" #include "mesh/ParticleType.hpp" + +#include "dataRepository/Group.hpp" #include "common/DataTypes.hpp" #include diff --git a/src/coreComponents/mesh/generators/ParticleBlockManager.cpp b/src/coreComponents/mesh/generators/ParticleBlockManager.cpp index 48b8b0ba126..d5c4beeddb3 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManager.cpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManager.cpp @@ -14,10 +14,6 @@ #include "ParticleBlockManager.hpp" -#include "mesh/generators/CellBlockUtilities.hpp" -#include "mesh/utilities/MeshMapUtilities.hpp" - -#include namespace geos { diff --git a/src/coreComponents/mesh/generators/ParticleBlockManager.hpp b/src/coreComponents/mesh/generators/ParticleBlockManager.hpp index 70c8cb588b8..c47bafb048f 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManager.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManager.hpp @@ -19,8 +19,8 @@ #ifndef GEOSX_MESH_PARTICLEBLOCKMANAGER_H_ #define GEOSX_MESH_PARTICLEBLOCKMANAGER_H_ -#include "mesh/generators/ParticleBlockManagerABC.hpp" #include "mesh/generators/ParticleBlock.hpp" +#include "mesh/generators/ParticleBlockManagerABC.hpp" namespace geos { diff --git a/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp b/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp index 4777179f57d..4f6f5579bf6 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp @@ -16,9 +16,7 @@ #define GEOSX_PARTICLEBLOCKMANAGERABC_HPP #include "dataRepository/Group.hpp" -#include "mesh/ParticleType.hpp" #include "common/DataTypes.hpp" -#include "dataRepository/Group.hpp" namespace geos { diff --git a/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp b/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp index 5f3ad2510d6..f0a9e219668 100644 --- a/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp @@ -17,11 +17,9 @@ */ #include "ParticleMeshGenerator.hpp" +#include "ParticleBlockManager.hpp" -#include "mesh/DomainPartition.hpp" -#include "mesh/mpiCommunications/PartitionBase.hpp" #include "mesh/mpiCommunications/SpatialPartition.hpp" -#include "ParticleBlockManager.hpp" #include "common/DataTypes.hpp" #include "common/TimingMacros.hpp" diff --git a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp index 0ae0de19e9e..fd2d605bc19 100644 --- a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp @@ -19,8 +19,9 @@ #ifndef GEOSX_MESH_GENERATORS_PARTICLEMESHGENERATOR_HPP #define GEOSX_MESH_GENERATORS_PARTICLEMESHGENERATOR_HPP +#include "mesh/generators/MeshGeneratorBase.hpp" + #include "codingUtilities/EnumStrings.hpp" -#include "mesh/generators/ExternalMeshGeneratorBase.hpp" namespace geos { diff --git a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp index 3e7108ca858..832b350792f 100644 --- a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp @@ -20,10 +20,10 @@ #include "dataRepository/Group.hpp" #include - +#include #include #include -#include +#include #include diff --git a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp index 468b54f107a..f812949c117 100644 --- a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp +++ b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp @@ -15,9 +15,10 @@ #ifndef GEOS_VTKFACEBLOCKUTILITIES_HPP #define GEOS_VTKFACEBLOCKUTILITIES_HPP -#include "common/DataTypes.hpp" #include "CellBlockManager.hpp" +#include "common/DataTypes.hpp" + #include #include diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp index 63e66cdeb85..b45ed3f9e30 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp @@ -22,8 +22,6 @@ #include "mesh/generators/VTKMeshGeneratorTools.hpp" #include "mesh/generators/CellBlockManager.hpp" #include "common/DataTypes.hpp" -#include "common/DataLayouts.hpp" -#include "common/MpiWrapper.hpp" #include diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp index 7fa30004ee6..3fae5d6d343 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp @@ -21,6 +21,7 @@ #include "mesh/generators/ExternalMeshGeneratorBase.hpp" #include "mesh/generators/VTKUtilities.hpp" +#include "mesh/mpiCommunications/SpatialPartition.hpp" #include diff --git a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp index e76a2079f17..c7d067777bd 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp @@ -19,15 +19,13 @@ #include "VTKMeshGeneratorTools.hpp" #include -#include #include +#include // NOTE: do NOT include anything from GEOS here. // See full explanation in VTKMeshGeneratorTools.hpp. -namespace geos -{ -namespace vtk +namespace geos::vtk { vtkSmartPointer< vtkUnstructuredGrid > @@ -264,5 +262,4 @@ exchangeBoundingBoxes( vtkDataSet & dataSet, MPI_Comm mpiComm ) return boxes; } -} // namespace vtk -} // namespace geos +} // namespace geos::vtk diff --git a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp index 0e70f32d766..04ca9af0ee3 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp +++ b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp @@ -19,21 +19,19 @@ #ifndef GEOS_VTK_MESH_GENERATORS_VTKMESHGENERATORTOOLS_HPP_ #define GEOS_VTK_MESH_GENERATORS_VTKMESHGENERATORTOOLS_HPP_ +#include #include #include -#include #include -// NOTE: do NOT include anything from GEOSX here. +// NOTE: do NOT include anything from GEOS here. // In particular, nothing that directly or transitively includes "common/Format.hpp". -// The reason is "diy2" library includes an older version of {fmt} than the one used by GEOSX. +// The reason is "diy2" library includes an older version of {fmt} than the one used by GEOS. // Collision of includes leads to all kinds of impossible to fix compilation errors. // Thankfully, no link errors, owing to namespace versioning employed by {fmt}. -namespace geos -{ -namespace vtk +namespace geos::vtk { /** @@ -59,7 +57,6 @@ redistribute( vtkPartitionedDataSet & localParts, MPI_Comm mpiComm ); std::vector< vtkBoundingBox > exchangeBoundingBoxes( vtkDataSet & dataSet, MPI_Comm mpiComm ); -} // namespace vtk -} // namespace geos +} // namespace geos::vtk #endif //GEOS_VTK_MESH_GENERATORS_VTKMESHGENERATORTOOLS_HPP_ diff --git a/src/coreComponents/mesh/generators/VTKUtilities.hpp b/src/coreComponents/mesh/generators/VTKUtilities.hpp index bbe3581877b..6f8e97a2180 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.hpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.hpp @@ -20,14 +20,12 @@ #define GEOS_MESH_GENERATORS_VTKUTILITIES_HPP #include "common/DataTypes.hpp" -#include "common/DataLayouts.hpp" #include "common/MpiWrapper.hpp" -#include "mesh/DomainPartition.hpp" #include "mesh/generators/CellBlockManager.hpp" -#include #include #include +#include #include #include diff --git a/src/coreComponents/mesh/generators/VTKWellGenerator.cpp b/src/coreComponents/mesh/generators/VTKWellGenerator.cpp index 3dc7fe343bf..3ea92f78551 100644 --- a/src/coreComponents/mesh/generators/VTKWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKWellGenerator.cpp @@ -21,7 +21,6 @@ #include "mesh/generators/VTKUtilities.hpp" #include -#include #include #include #include diff --git a/src/coreComponents/mesh/generators/VTKWellGenerator.hpp b/src/coreComponents/mesh/generators/VTKWellGenerator.hpp index 1290db3f7fe..2c9b265143e 100644 --- a/src/coreComponents/mesh/generators/VTKWellGenerator.hpp +++ b/src/coreComponents/mesh/generators/VTKWellGenerator.hpp @@ -20,7 +20,6 @@ #define GEOS_MESH_GENERATORS_VTKWELLGENERATOR_HPP #include "mesh/generators/WellGeneratorBase.hpp" -#include "mesh/Perforation.hpp" #include "dataRepository/Group.hpp" #include "codingUtilities/Utilities.hpp" #include "common/DataTypes.hpp" From b48741bee0f7b7ef79e67f286f8f3bd5c8e36d90 Mon Sep 17 00:00:00 2001 From: Jacques Franc <49998870+jafranc@users.noreply.github.com> Date: Sat, 16 Mar 2024 23:29:38 +0100 Subject: [PATCH 017/286] Implementing hybrid upwinding for total velocity schemes (#2394) --- .../4comp_2ph_cap_1d_upwind.xml | 196 ++ .../compositionalMultiphaseFlow/pvdg_m.txt | 8 + .../compositionalMultiphaseFlow/pvdo_m.txt | 8 + .../finiteVolume/FluxApproximationBase.cpp | 4 - .../finiteVolume/FluxApproximationBase.hpp | 6 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 1 + ...positionalMultiphaseFVMKernelUtilities.hpp | 2030 ++++++++++++++++- ...ermalCompositionalMultiphaseFVMKernels.hpp | 83 +- .../schema/docs/TwoPointFluxApproximation.rst | 23 +- src/coreComponents/schema/schema.xsd | 5 +- .../unitTests/fluidFlowTests/CMakeLists.txt | 10 +- 11 files changed, 2277 insertions(+), 97 deletions(-) create mode 100644 inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d_upwind.xml create mode 100644 inputFiles/compositionalMultiphaseFlow/pvdg_m.txt create mode 100644 inputFiles/compositionalMultiphaseFlow/pvdo_m.txt diff --git a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d_upwind.xml b/inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d_upwind.xml new file mode 100644 index 00000000000..5d043375c8f --- /dev/null +++ b/inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d_upwind.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/compositionalMultiphaseFlow/pvdg_m.txt b/inputFiles/compositionalMultiphaseFlow/pvdg_m.txt new file mode 100644 index 00000000000..f2ff16c2d2f --- /dev/null +++ b/inputFiles/compositionalMultiphaseFlow/pvdg_m.txt @@ -0,0 +1,8 @@ +# Pg(Pa) Bg(m3/sm3) Visc(Pa.s) +3000000 0.04234 1 +12000000 0.00977 1 +21000000 0.005541 1 +24000000 0.004919 1 +29500000 0.004194 1 +33000000 0.00391 1 +53000000 0.003868 1 diff --git a/inputFiles/compositionalMultiphaseFlow/pvdo_m.txt b/inputFiles/compositionalMultiphaseFlow/pvdo_m.txt new file mode 100644 index 00000000000..7c073714556 --- /dev/null +++ b/inputFiles/compositionalMultiphaseFlow/pvdo_m.txt @@ -0,0 +1,8 @@ +# P[Pa] Bo[m3/sm3] Visc(Pa.s) +2000000 1.02 1 +5000000 1.03 1 +10000000 1.04 1 +20000000 1.05 1 +30000000 1.07 1 +40000000 1.08 1 +50000000.7 1.09 1 diff --git a/src/coreComponents/finiteVolume/FluxApproximationBase.cpp b/src/coreComponents/finiteVolume/FluxApproximationBase.cpp index 05f0b2dbddd..259006f3d56 100644 --- a/src/coreComponents/finiteVolume/FluxApproximationBase.cpp +++ b/src/coreComponents/finiteVolume/FluxApproximationBase.cpp @@ -59,10 +59,6 @@ FluxApproximationBase::FluxApproximationBase( string const & name, Group * const setDescription( "Type of upwinding scheme. " "Valid options:\n* " + EnumStrings< UpwindingScheme >::concat( "\n* " ) ); -// registerWrapper( viewKeyStruct::epsC1PPUString(), &m_upwindingParams.epsC1PPU ). -// setApplyDefaultValue( 1e-10 ). -// setInputFlag( InputFlags::OPTIONAL ). -// setDescription( "Tolerance for C1-PPU smoothing" ); } FluxApproximationBase::CatalogInterface::CatalogType & diff --git a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp index a26320b39c3..0f509669063 100644 --- a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp +++ b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp @@ -38,6 +38,7 @@ enum class UpwindingScheme : integer { PPU, ///< PPU upwinding C1PPU, ///< C1-PPU upwinding from https://doi.org/10.1016/j.advwatres.2017.07.028 + IHU ///< IHU as in https://link.springer.com/content/pdf/10.1007/s10596-019-09835-6.pdf }; /** @@ -45,7 +46,8 @@ enum class UpwindingScheme : integer */ ENUM_STRINGS( UpwindingScheme, "PPU", - "C1PPU" ); + "C1PPU", + "IHU" ); /** * @struct UpwindingParameters @@ -54,7 +56,7 @@ ENUM_STRINGS( UpwindingScheme, */ struct UpwindingParameters { - /// PPU or C1-PPU + /// PPU or C1-PPU or IHU UpwindingScheme upwindingScheme; /// C1-PPU smoothing tolerance diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 92c447071a4..a1da4a86c46 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -972,6 +972,7 @@ void CompositionalMultiphaseFVM::applyFaceDirichletBC( real64 const time_n, if( m_isThermal ) { + //todo (jafranc) extend upwindScheme name if satisfied in isothermalCase thermalCompositionalMultiphaseFVMKernels:: DirichletFaceBasedAssemblyKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp index f63126c5cbb..9824d8a17e4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp @@ -182,6 +182,94 @@ struct PotGrad }; +struct PhaseComponentFlux +{ + /** + * @brief Compute the component flux for a given phase + * @tparam numComp number of components + * @tparam numFluxSupportPoints number of flux support points + * @param ip phase index + * @param k_up uptream index for this phase + * @param seri arraySlice of the stencil-implied element region index + * @param sesri arraySlice of the stencil-implied element subregion index + * @param sei arraySlice of the stencil-implied element index + * @param phaseCompFrac phase component fraction + * @param dPhaseCompFrac derivative of phase component fraction wrt pressure, temperature, component fraction + * @param dCompFrac_dCompDens derivative of component fraction wrt component density + * @param phaseFlux phase flux + * @param dPhaseFlux_dP derivative of phase flux wrt pressure + * @param dPhaseFlux_dC derivative of phase flux wrt comp density + * @param compFlux component flux + * @param dCompFlux_dP derivative of phase flux wrt pressure + * @param dCompFlux_dC derivative of phase flux wrt comp density + */ + template< localIndex numComp, localIndex numFluxSupportPoints > + GEOS_HOST_DEVICE + static void + compute( localIndex const ip, + localIndex const k_up, + localIndex const ( &seri )[numFluxSupportPoints], + localIndex const ( &sesri )[numFluxSupportPoints], + localIndex const ( &sei )[numFluxSupportPoints], + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + real64 const & phaseFlux, + real64 const ( &dPhaseFlux_dP )[numFluxSupportPoints], + real64 const ( &dPhaseFlux_dC )[numFluxSupportPoints][numComp], + real64 ( & compFlux )[numComp], + real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp], + real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp] ) + { + localIndex const er_up = seri[k_up]; + localIndex const esr_up = sesri[k_up]; + localIndex const ei_up = sei[k_up]; + + real64 dProp_dC[numComp]{}; + + // slice some constitutive arrays to avoid too much indexing in component loop + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP-3 > phaseCompFracSub = + phaseCompFrac[er_up][esr_up][ei_up][0][ip]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC-3 > dPhaseCompFracSub = + dPhaseCompFrac[er_up][esr_up][ei_up][0][ip]; + + // compute component fluxes and derivatives using upstream cell composition + for( integer ic = 0; ic < numComp; ++ic ) + { + real64 const ycp = phaseCompFracSub[ic]; + compFlux[ic] += phaseFlux * ycp; + + // derivatives stemming from phase flux + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dCompFlux_dP[ke][ic] += dPhaseFlux_dP[ke] * ycp; + for( integer jc = 0; jc < numComp; ++jc ) + { + dCompFlux_dC[ke][ic][jc] += dPhaseFlux_dC[ke][jc] * ycp; + } + } + + // additional derivatives stemming from upstream cell phase composition + dCompFlux_dP[k_up][ic] += phaseFlux * dPhaseCompFracSub[ic][Deriv::dP]; + + // convert derivatives of comp fraction w.r.t. comp fractions to derivatives w.r.t. comp densities + applyChainRule( numComp, + dCompFrac_dCompDens[er_up][esr_up][ei_up], + dPhaseCompFracSub[ic], + dProp_dC, + Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + dCompFlux_dC[k_up][ic][jc] += phaseFlux * dProp_dC[jc]; + } + } + + + + } + +}; + struct PPUPhaseFlux { /** @@ -228,6 +316,8 @@ struct PPUPhaseFlux ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, @@ -237,7 +327,10 @@ struct PPUPhaseFlux real64 & potGrad, real64 ( &phaseFlux ), real64 ( & dPhaseFlux_dP )[numFluxSupportPoints], - real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp] ) + real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp], + real64 ( & compFlux )[numComp], + real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp], + real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp] ) { real64 dPresGrad_dP[numFluxSupportPoints]{}; real64 dPresGrad_dC[numFluxSupportPoints][numComp]{}; @@ -283,6 +376,11 @@ struct PPUPhaseFlux { dPhaseFlux_dC[k_up][jc] += dPhaseMobSub[Deriv::dC+jc] * potGrad; } + + //distribute on phaseComponentFlux here + PhaseComponentFlux::compute( ip, k_up, seri, sesri, sei, phaseCompFrac, dPhaseCompFrac, dCompFrac_dCompDens, phaseFlux + , dPhaseFlux_dP, dPhaseFlux_dC, compFlux, dCompFlux_dP, dCompFlux_dC ); + } }; @@ -322,7 +420,6 @@ struct C1PPUPhaseFlux compute( integer const numPhase, integer const ip, integer const hasCapPressure, - //real64 const epsC1PPU, localIndex const ( &seri )[numFluxSupportPoints], localIndex const ( &sesri )[numFluxSupportPoints], localIndex const ( &sei )[numFluxSupportPoints], @@ -333,6 +430,8 @@ struct C1PPUPhaseFlux ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, @@ -342,7 +441,10 @@ struct C1PPUPhaseFlux real64 & potGrad, real64 ( &phaseFlux ), real64 ( & dPhaseFlux_dP )[numFluxSupportPoints], - real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp] ) + real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp], + real64 ( & compFlux )[numComp], + real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp], + real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp] ) { real64 dPresGrad_dP[numFluxSupportPoints]{}; real64 dPresGrad_dC[numFluxSupportPoints][numComp]{}; @@ -452,94 +554,1930 @@ struct C1PPUPhaseFlux // choose upstream cell for composition upwinding k_up = (phaseFlux >= 0) ? 0 : 1; + //distribute on phaseComponentFlux here + PhaseComponentFlux::compute( ip, k_up, seri, sesri, sei, phaseCompFrac, dPhaseCompFrac, dCompFrac_dCompDens, phaseFlux + , dPhaseFlux_dP, dPhaseFlux_dC, compFlux, dCompFlux_dP, dCompFlux_dC ); } }; -struct PhaseComponentFlux + + +/************************* HELPERS ******************/ +namespace UpwindHelpers +{ + +static constexpr double minTotMob = 1e-12; + +template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > +GEOS_HOST_DEVICE +static void +upwindMobilityViscous( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + real64 const totFlux, //in fine should be a ElemnetViewConst once seq form are in place + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const capPressureFlag, + localIndex & upwindDir, + real64 & mobility, + real64( &dMobility_dP), + real64 ( & dMobility_dC)[numComp] + ) +{ + + //reinit + mobility = 0.0; + dMobility_dP = 0.0; + for( localIndex ic = 0; ic < numComp; ++ic ) + { + dMobility_dC[ic] = 0.0; + } + + UPWIND scheme; + scheme.template getUpwindDirectionViscous< numComp, numFluxSupportPoints, UPWIND >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + pres, + gravCoef, + phaseMob, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + upwindDir ); + + localIndex const er_up = seri[upwindDir]; + localIndex const esr_up = sesri[upwindDir]; + localIndex const ei_up = sei[upwindDir]; + + if( std::fabs( phaseMob[er_up][esr_up][ei_up][ip] ) > 1e-20 ) + { + mobility = phaseMob[er_up][esr_up][ei_up][ip]; + dMobility_dP = dPhaseMob[er_up][esr_up][ei_up][ip][Deriv::dP]; + for( localIndex ic = 0; ic < numComp; ++ic ) + { + dMobility_dC[ic] = dPhaseMob[er_up][esr_up][ei_up][ip][Deriv::dC + ic]; + } + } +} + +template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > +GEOS_HOST_DEVICE +static void +upwindMobilityGravity( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + real64 const totFlux, //in fine should be a ElemnetViewConst once seq form are in place + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const capPressureFlag, + localIndex & upwindDir, + real64 & mobility, + real64( &dMobility_dP), + real64 ( & dMobility_dC)[numComp] + ) +{ + + //reinit + mobility = 0.0; + dMobility_dP = 0.0; + for( localIndex ic = 0; ic < numComp; ++ic ) + { + dMobility_dC[ic] = 0.0; + } + + UPWIND scheme; + scheme.template getUpwindDirectionGravity< numComp, numFluxSupportPoints, UPWIND >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + pres, + gravCoef, + phaseMob, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + upwindDir ); + + localIndex const er_up = seri[upwindDir]; + localIndex const esr_up = sesri[upwindDir]; + localIndex const ei_up = sei[upwindDir]; + + if( std::fabs( phaseMob[er_up][esr_up][ei_up][ip] ) > 1e-20 ) + { + mobility = phaseMob[er_up][esr_up][ei_up][ip]; + dMobility_dP = dPhaseMob[er_up][esr_up][ei_up][ip][Deriv::dP]; + for( localIndex ic = 0; ic < numComp; ++ic ) + { + dMobility_dC[ic] = dPhaseMob[er_up][esr_up][ei_up][ip][Deriv::dC + ic]; + } + } +} + +template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > +GEOS_HOST_DEVICE +static void +upwindMobilityCapillary( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + real64 const totFlux, //in fine should be a ElemnetViewConst once seq form are in place + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const capPressureFlag, + localIndex & upwindDir, + real64 & mobility, + real64( &dMobility_dP), + real64 ( & dMobility_dC)[numComp] + ) +{ + + //reinit + mobility = 0.0; + dMobility_dP = 0.0; + for( localIndex ic = 0; ic < numComp; ++ic ) + { + dMobility_dC[ic] = 0.0; + } + + UPWIND scheme; + scheme.template getUpwindDirectionCapillary< numComp, numFluxSupportPoints, UPWIND >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + pres, + gravCoef, + phaseMob, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + upwindDir ); + + localIndex const er_up = seri[upwindDir]; + localIndex const esr_up = sesri[upwindDir]; + localIndex const ei_up = sei[upwindDir]; + + if( std::fabs( phaseMob[er_up][esr_up][ei_up][ip] ) > 1e-20 ) + { + mobility = phaseMob[er_up][esr_up][ei_up][ip]; + dMobility_dP = dPhaseMob[er_up][esr_up][ei_up][ip][Deriv::dP]; + for( localIndex ic = 0; ic < numComp; ++ic ) + { + dMobility_dC[ic] = dPhaseMob[er_up][esr_up][ei_up][ip][Deriv::dC + ic]; + } + } +} + +template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > +GEOS_HOST_DEVICE +static void +computeFractionalFlowViscous( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + localIndex const & k_up_ppu, + real64 const totFlux, + real64 const totMob, + real64 const (&dTotMob_dP)[numFluxSupportPoints], + real64 const (&dTotMob_dC)[numFluxSupportPoints][numComp], + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const capPressureFlag, + localIndex & k_up_main, + real64 & fractionalFlow, + real64 ( & dFractionalFlow_dP)[numFluxSupportPoints], + real64 ( & dFractionalFlow_dC)[numFluxSupportPoints][numComp] ) +{ + // get var to memorized the numerator mobility properly upwinded + real64 mainMob{}; + real64 dMMob_dP{}; + real64 dMMob_dC[numComp]{}; + +// real64 totMob{}; +// real64 dTotMob_dP[numFluxSupportPoints]{}; +// real64 dTotMob_dC[numFluxSupportPoints][numComp]{}; + + //reinit + //fractional flow too low to let the upstream phase flow + k_up_main = -1; //to throw error if unmodified + fractionalFlow = 0; + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dFractionalFlow_dP[ke] = 0; + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dFractionalFlow_dC[ke][jc] = 0; + } + } + + localIndex k_up; + real64 mob{}; + real64 dMob_dP{}; + real64 dMob_dC[numComp]{}; + + upwindMobilityViscous< numComp, numFluxSupportPoints, UPWIND >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + pres, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + phaseMob, + dPhaseMob, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + k_up, + mob, + dMob_dP, + dMob_dC ); + + k_up_main = k_up; + mainMob = mob; + dMMob_dP = dMob_dP; + for( localIndex ic = 0; ic < numComp; ++ic ) + { + dMMob_dC[ic] = dMob_dC[ic]; + } + + //guard against no flow region + if( std::fabs( mainMob ) > 1e-20 ) + { + fractionalFlow = mainMob / LvArray::math::max( totMob, minTotMob ); + dFractionalFlow_dP[k_up_main] = dMMob_dP / LvArray::math::max( totMob, minTotMob ); + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dFractionalFlow_dC[k_up_main][jc] = dMMob_dC[jc] / totMob; + + } + + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dFractionalFlow_dP[ke] -= fractionalFlow * dTotMob_dP[k_up_ppu] / LvArray::math::max( totMob, minTotMob ); + + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dFractionalFlow_dC[ke][jc] -= fractionalFlow * dTotMob_dC[k_up_ppu][jc] / LvArray::math::max( totMob, minTotMob ); + } + } + } +} + + +template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > +GEOS_HOST_DEVICE +static void +computeFractionalFlowGravity( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + localIndex const & k_up_ppu, + real64 const totFlux, + real64 const totMob, + real64 const (&dTotMob_dP)[numFluxSupportPoints], + real64 const (&dTotMob_dC)[numFluxSupportPoints][numComp], + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const capPressureFlag, + localIndex & k_up_main, + real64 & fractionalFlow, + real64 ( & dFractionalFlow_dP)[numFluxSupportPoints], + real64 ( & dFractionalFlow_dC)[numFluxSupportPoints][numComp] + ) +{ + // get var to memorized the numerator mobility properly upwinded + real64 mainMob{}; + real64 dMMob_dP{}; + real64 dMMob_dC[numComp]{}; + + //reinit + //fractional flow too low to let the upstream phase flow + k_up_main = -1; //to throw error if unmodified + fractionalFlow = 0; + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dFractionalFlow_dP[ke] = 0; + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dFractionalFlow_dC[ke][jc] = 0; + } + } + + + localIndex k_up; + real64 mob{}; + real64 dMob_dP{}; + real64 dMob_dC[numComp]{}; + + upwindMobilityGravity< numComp, numFluxSupportPoints, UPWIND >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + pres, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + phaseMob, + dPhaseMob, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + k_up, + mob, + dMob_dP, + dMob_dC ); + + k_up_main = k_up; + mainMob = mob; + dMMob_dP = dMob_dP; + for( localIndex ic = 0; ic < numComp; ++ic ) + { + dMMob_dC[ic] = dMob_dC[ic]; + } + + //guard against no flow region + if( std::fabs( mainMob ) > 1e-20 ) + { + fractionalFlow = mainMob / LvArray::math::max( totMob, minTotMob ); + dFractionalFlow_dP[k_up_main] = dMMob_dP / LvArray::math::max( totMob, minTotMob ); + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dFractionalFlow_dC[k_up_main][jc] = dMMob_dC[jc] / totMob; + + } + + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dFractionalFlow_dP[ke] -= fractionalFlow * dTotMob_dP[k_up_ppu] / LvArray::math::max( totMob, minTotMob ); + + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dFractionalFlow_dC[ke][jc] -= fractionalFlow * dTotMob_dC[k_up_ppu][jc] / LvArray::math::max( totMob, minTotMob ); + } + } + } +} + + +template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > +GEOS_HOST_DEVICE +static void +computeFractionalFlowCapillary( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + localIndex const & k_up_ppu, + real64 const totFlux, + real64 const totMob, + real64 const (&dTotMob_dP)[numFluxSupportPoints], + real64 const (&dTotMob_dC)[numFluxSupportPoints][numComp], + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const capPressureFlag, + localIndex & k_up_main, + real64 & fractionalFlow, + real64 ( & dFractionalFlow_dP)[numFluxSupportPoints], + real64 ( & dFractionalFlow_dC)[numFluxSupportPoints][numComp] + ) +{ + // get var to memorized the numerator mobility properly upwinded + real64 mainMob{}; + real64 dMMob_dP{}; + real64 dMMob_dC[numComp]{}; + + //reinit + //fractional flow too low to let the upstream phase flow + k_up_main = -1; //to throw error if unmodified + fractionalFlow = 0; + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dFractionalFlow_dP[ke] = 0; + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dFractionalFlow_dC[ke][jc] = 0; + } + } + + + localIndex k_up; + real64 mob{}; + real64 dMob_dP{}; + real64 dMob_dC[numComp]{}; + + upwindMobilityCapillary< numComp, numFluxSupportPoints, UPWIND >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + pres, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + phaseMob, + dPhaseMob, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + k_up, + mob, + dMob_dP, + dMob_dC ); + + + k_up_main = k_up; + mainMob = mob; + dMMob_dP = dMob_dP; + for( localIndex ic = 0; ic < numComp; ++ic ) + { + dMMob_dC[ic] = dMob_dC[ic]; + } + + //guard against no flow region + if( std::fabs( mainMob ) > 1e-20 ) + { + fractionalFlow = mainMob / LvArray::math::max( totMob, minTotMob ); + dFractionalFlow_dP[k_up_main] = dMMob_dP / LvArray::math::max( totMob, minTotMob ); + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dFractionalFlow_dC[k_up_main][jc] = dMMob_dC[jc] / LvArray::math::max( totMob, minTotMob ); + + } + + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dFractionalFlow_dP[ke] -= fractionalFlow * dTotMob_dP[k_up_ppu] / LvArray::math::max( totMob, minTotMob ); + + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dFractionalFlow_dC[ke][jc] -= fractionalFlow * dTotMob_dC[k_up_ppu][jc] / LvArray::math::max( totMob, minTotMob ); + } + } + } +} + +/** + * @brief Struct defining formation of potential from different Physics (flagged by enum type T) to be used + * in Upwind discretization schemes + * @tparam numComp number of component + * @tparam T the concerned physics (Viscou,Gravity or Capillary) + * @tparam numFluxSupportPoints number of point in the stencil + */ +struct computePotentialViscous +{ + + template< localIndex numComp, localIndex numFluxSupportPoints > + GEOS_HOST_DEVICE + static void compute( localIndex const GEOS_UNUSED_PARAM( numPhase ), + localIndex const GEOS_UNUSED_PARAM( ip ), + localIndex const (&GEOS_UNUSED_PARAM( seri ))[numFluxSupportPoints], + localIndex const (&GEOS_UNUSED_PARAM( sesri ))[numFluxSupportPoints], + localIndex const (&GEOS_UNUSED_PARAM( sei ))[numFluxSupportPoints], + real64 const (&GEOS_UNUSED_PARAM( transmissibility ))[2], + real64 const (&GEOS_UNUSED_PARAM( dTrans_dPres ))[2], + real64 const totFlux, + ElementViewConst< arrayView1d< real64 const > > const & GEOS_UNUSED_PARAM( gravCoef ), + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & + GEOS_UNUSED_PARAM( dCompFrac_dCompDens ), + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & + GEOS_UNUSED_PARAM( phaseMassDens ), + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & + GEOS_UNUSED_PARAM( dPhaseMassDens ), + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & + GEOS_UNUSED_PARAM( dPhaseVolFrac ), + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & + GEOS_UNUSED_PARAM( phaseCapPressure ), + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & + GEOS_UNUSED_PARAM( dPhaseCapPressure_dPhaseVolFrac ), + real64 & pot, + real64( &GEOS_UNUSED_PARAM( dPot_dPres ))[numFluxSupportPoints], + real64( &GEOS_UNUSED_PARAM( dPot_dComp ))[numFluxSupportPoints][numComp], + real64( &GEOS_UNUSED_PARAM( dProp_dComp ))[numComp] ) + { + pot = totFlux; + //could be relevant for symmetry to include derivative + + } +}; + +/*! @copydoc computePotential + */ +struct computePotentialGravity +{ + /*! @copydoc computePotential::compute + * + * @brief specialization for gravitational driving forces which only relies on total flux + */ + template< localIndex numComp, localIndex numFluxSupportPoints > + GEOS_HOST_DEVICE + static void compute( localIndex const GEOS_UNUSED_PARAM( numPhase ), + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + real64 const GEOS_UNUSED_PARAM( totFlux ), + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & + GEOS_UNUSED_PARAM( dPhaseVolFrac ), + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & + GEOS_UNUSED_PARAM( phaseCapPressure ), + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & + GEOS_UNUSED_PARAM( dPhaseCapPressure_dPhaseVolFrac ), + real64 & pot, + real64 ( & dPot_dPres )[numFluxSupportPoints], + real64 (& dPot_dComp )[numFluxSupportPoints][numComp], + real64 ( & dProp_dComp )[numComp] ) + { + //working arrays + real64 densMean{}; + real64 dDensMean_dPres[numFluxSupportPoints]{}; + real64 dDensMean_dComp[numFluxSupportPoints][numComp]{}; + + //init + pot = 0.0; + for( localIndex i = 0; i < numFluxSupportPoints; ++i ) + { + dPot_dPres[i] = 0.0; + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dPot_dComp[i][jc] = 0.0; + dProp_dComp[jc] = 0.0; + } + } + + //inner loop to get average density + for( localIndex i = 0; i < numFluxSupportPoints; ++i ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + // density + real64 const density = phaseMassDens[er][esr][ei][0][ip]; + real64 const dDens_dPres = dPhaseMassDens[er][esr][ei][0][ip][Deriv::dP]; + + applyChainRule( numComp, + dCompFrac_dCompDens[er][esr][ei], + dPhaseMassDens[er][esr][ei][0][ip], + dProp_dComp, + Deriv::dC ); + + // average density and derivatives + densMean += 0.5 * density; + dDensMean_dPres[i] = 0.5 * dDens_dPres; + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dDensMean_dComp[i][jc] = 0.5 * dProp_dComp[jc]; + } + } + + // compute potential difference MPFA-style + for( localIndex i = 0; i < numFluxSupportPoints; ++i ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + real64 const gravD = transmissibility[i] * gravCoef[er][esr][ei]; + real64 const dGravD_dP = dTrans_dPres[i] * gravCoef[er][esr][ei]; + pot += densMean * gravD; + + // need to add contributions from both cells the mean density depends on + for( localIndex j = 0; j < numFluxSupportPoints; ++j ) + { + dPot_dPres[j] += dDensMean_dPres[j] * gravD + densMean * dGravD_dP; + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dPot_dComp[j][jc] += dDensMean_dComp[j][jc] * gravD; + } + } + } + + } +}; + +/*! @copydoc computePotential + */ +struct computePotentialCapillary +{ + /*! @copydoc computePotential::compute + * + * @brief specialization for capillary driving forces which only relies on total flux + */ + template< localIndex numComp, localIndex numFluxSupportPoints > + GEOS_HOST_DEVICE + static void compute( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + real64 const GEOS_UNUSED_PARAM( totFlux ), + ElementViewConst< arrayView1d< real64 const > > const & GEOS_UNUSED_PARAM( gravCoef ), + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & + GEOS_UNUSED_PARAM( dCompFrac_dCompDens ), + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & + GEOS_UNUSED_PARAM( phaseMassDens ), + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & + GEOS_UNUSED_PARAM( dPhaseMassDens ), + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + real64 & pot, + real64 ( & dPot_dPres)[numFluxSupportPoints], + real64 (& dPot_dComp)[numFluxSupportPoints][numComp], + real64( &GEOS_UNUSED_PARAM( dProp_dComp ))[numComp] ) + { + + + for( localIndex i = 0; i < numFluxSupportPoints; ++i ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + pot += transmissibility[i] * phaseCapPressure[er][esr][ei][0][ip]; + // need to add contributions from both cells + for( localIndex jp = 0; jp < numPhase; ++jp ) + { + + real64 const dCapPressure_dS = dPhaseCapPressure_dPhaseVolFrac[er][esr][ei][0][ip][jp]; + dPot_dPres[i] += + transmissibility[i] * dCapPressure_dS * dPhaseVolFrac[er][esr][ei][jp][Deriv::dP] + + dTrans_dPres[i] * phaseCapPressure[er][esr][ei][0][jp]; + + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dPot_dComp[i][jc] += transmissibility[i] * dCapPressure_dS * + dPhaseVolFrac[er][esr][ei][jp][Deriv::dC + jc]; + } + + } + + } + + } +}; + + +/// Form potential-related parts of fluxes + +template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > +GEOS_HOST_DEVICE +static void computePotentialFluxesGravity( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + localIndex const & k_up_ppu, + real64 const totFlux, + real64 const totMob, + real64 const (&dTotMob_dP)[numFluxSupportPoints], + real64 const (&dTotMob_dC)[numFluxSupportPoints][numComp], + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + localIndex const capPressureFlag, + localIndex( &k_up), + localIndex (&k_up_o), + real64 & phaseFlux, + real64 (& dPhaseFlux_dP)[numFluxSupportPoints], + real64 ( & dPhaseFlux_dC)[numFluxSupportPoints][numComp] ) +{ + + real64 fflow{}; + real64 dFflow_dP[numFluxSupportPoints]{}; + real64 dFflow_dC[numFluxSupportPoints][numComp]{}; + + real64 pot{}; + real64 dPot_dP[numFluxSupportPoints]{}; + real64 dPot_dC[numFluxSupportPoints][numComp]{}; + real64 dProp_dC[numComp]{}; + + // + UpwindHelpers::computePotentialGravity::compute< numComp, numFluxSupportPoints >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + pot, + dPot_dP, + dPot_dC, + dProp_dC ); + + // and the fractional flow for gravitational part as \lambda_i^{up}/\sum_{numPhase}(\lambda_k^{up}) with up decided upon + // the Upwind strategy + UpwindHelpers::computeFractionalFlowGravity< numComp, numFluxSupportPoints, UPWIND >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + k_up_ppu, + totFlux, + totMob, + dTotMob_dP, + dTotMob_dC, + pres, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + phaseMob, + dPhaseMob, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + k_up, + fflow, + dFflow_dP, + dFflow_dC ); + + + for( localIndex jp = 0; jp < numPhase; ++jp ) + { + if( ip != jp ) + { + + real64 potOther{}; + real64 dPotOther_dP[numFluxSupportPoints]{}; + real64 dPotOther_dC[numFluxSupportPoints][numComp]{}; + real64 dPropOther_dC[numComp]{}; + + //Fetch pot for phase j!=i defined as \rho_j g dz/dx + UpwindHelpers::computePotentialGravity::compute< numComp, numFluxSupportPoints >( numPhase, + jp, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + potOther, + dPotOther_dP, + dPotOther_dC, + dPropOther_dC ); + + //Eventually get the mobility of the second phase + real64 mobOther{}; + real64 dMobOther_dP{}; + real64 dMobOther_dC[numComp]{}; + + // and the other mobility for gravitational part as \lambda_j^{up} with up decided upon + // the Upwind strategy - Note that it should be the same as the gravitational fractional flow + + UpwindHelpers::upwindMobilityGravity< numComp, numFluxSupportPoints, UPWIND >( numPhase, + jp, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + pres, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + phaseMob, + dPhaseMob, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + k_up_o, + mobOther, + dMobOther_dP, + dMobOther_dC ); + + + // Assembling gravitational flux phase-wise as \phi_{i,g} = \sum_{k\nei} \lambda_k^{up,g} f_k^{up,g} (G_i - G_k) + phaseFlux -= fflow * mobOther * (pot - potOther); + dPhaseFlux_dP[k_up_o] -= fflow * dMobOther_dP * (pot - potOther); + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dPhaseFlux_dC[k_up_o][jc] -= fflow * dMobOther_dC[jc] * (pot - potOther); + } + + //mob related part of dFflow_dP is only upstream defined but totMob related is defined everywhere + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dPhaseFlux_dP[ke] -= dFflow_dP[ke] * mobOther * (pot - potOther); + + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dPhaseFlux_dC[ke][jc] -= dFflow_dC[ke][jc] * mobOther * (pot - potOther); + } + } + + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dPhaseFlux_dP[ke] -= fflow * mobOther * (dPot_dP[ke] - dPotOther_dP[ke]); + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dPhaseFlux_dC[ke][jc] -= fflow * mobOther * (dPot_dC[ke][jc] - dPotOther_dC[ke][jc]); + } + } + } + } + +} + +template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > +GEOS_HOST_DEVICE +static void computePotentialFluxesCapillary( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + localIndex const & k_up_ppu, + real64 const totFlux, + real64 const totMob, + real64 const (&dTotMob_dP)[numFluxSupportPoints], + real64 const (&dTotMob_dC)[numFluxSupportPoints][numComp], + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + localIndex const capPressureFlag, + localIndex( &k_up), + localIndex (&k_up_o), + real64 & phaseFlux, + real64 (& dPhaseFlux_dP)[numFluxSupportPoints], + real64 ( & dPhaseFlux_dC)[numFluxSupportPoints][numComp] ) +{ + + real64 fflow{}; + real64 dFflow_dP[numFluxSupportPoints]{}; + real64 dFflow_dC[numFluxSupportPoints][numComp]{}; + + real64 pot{}; + real64 dPot_dP[numFluxSupportPoints]{}; + real64 dPot_dC[numFluxSupportPoints][numComp]{}; + real64 dProp_dC[numComp]{}; + + UpwindHelpers::computePotentialCapillary::compute< numComp, numFluxSupportPoints >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + pot, + dPot_dP, + dPot_dC, + dProp_dC ); + + // and the fractional flow for gravitational part as \lambda_i^{up}/\sum_{numPhase}(\lambda_k^{up}) with up decided upon + // the Upwind strategy + UpwindHelpers::computeFractionalFlowCapillary< numComp, numFluxSupportPoints, UPWIND >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + k_up_ppu, + totFlux, + totMob, + dTotMob_dP, + dTotMob_dC, + pres, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + phaseMob, + dPhaseMob, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + k_up, + fflow, + dFflow_dP, + dFflow_dC ); + + + for( localIndex jp = 0; jp < numPhase; ++jp ) + { + if( ip != jp ) + { + + real64 potOther{}; + real64 dPotOther_dP[numFluxSupportPoints]{}; + real64 dPotOther_dC[numFluxSupportPoints][numComp]{}; + real64 dPropOther_dC[numComp]{}; + + //Fetch pot for phase j!=i defined as \rho_j g dz/dx + UpwindHelpers::computePotentialCapillary::compute< numComp, numFluxSupportPoints >( numPhase, + jp, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + potOther, + dPotOther_dP, + dPotOther_dC, + dPropOther_dC ); + + //Eventually get the mobility of the second phase + real64 mobOther{}; + real64 dMobOther_dP{}; + real64 dMobOther_dC[numComp]{}; + + // and the other mobility for gravitational part as \lambda_j^{up} with up decided upon + // the Upwind strategy - Note that it should be the same as the gravitational fractional flow + + UpwindHelpers::upwindMobilityCapillary< numComp, numFluxSupportPoints, UPWIND >( numPhase, + jp, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + pres, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + phaseMob, + dPhaseMob, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + k_up_o, + mobOther, + dMobOther_dP, + dMobOther_dC ); + + + // Assembling gravitational flux phase-wise as \phi_{i,g} = \sum_{k\nei} \lambda_k^{up,g} f_k^{up,g} (G_i - G_k) + phaseFlux -= fflow * mobOther * (pot - potOther); + dPhaseFlux_dP[k_up_o] -= fflow * dMobOther_dP * (pot - potOther); + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dPhaseFlux_dC[k_up_o][jc] -= fflow * dMobOther_dC[jc] * (pot - potOther); + } + + //mob related part of dFflow_dP is only upstream defined but totMob related is defined everywhere + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dPhaseFlux_dP[ke] -= dFflow_dP[ke] * mobOther * (pot - potOther); + + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dPhaseFlux_dC[ke][jc] -= dFflow_dC[ke][jc] * mobOther * (pot - potOther); + } + } + + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dPhaseFlux_dP[ke] -= fflow * mobOther * (dPot_dP[ke] - dPotOther_dP[ke]); + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dPhaseFlux_dC[ke][jc] -= fflow * mobOther * (dPot_dC[ke][jc] - dPotOther_dC[ke][jc]); + } + } + } + } + +} + + +}//end of struct UpwindHelpers + +/************************* UPWIND ******************/ + +/** + * @brief Template base class for different upwind Scheme + * @tparam T physics concerned by the scheme if specialized + */ +class UpwindScheme +{ + +public: + + //default ctor + UpwindScheme() = default; + + //usual copy ctor + UpwindScheme( UpwindScheme const & scheme ) = default; + + //default move ctor + UpwindScheme( UpwindScheme && ) = default; + + //deleted copy and move assignement + UpwindScheme & operator=( UpwindScheme const & ) = delete; + + UpwindScheme & operator=( UpwindScheme && ) = delete; + + virtual ~UpwindScheme() = default; + + template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > + GEOS_HOST_DEVICE + inline + void getUpwindDirectionViscous( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + real64 const totFlux, //in fine should be a ElemnetViewConst once seq form are in place + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const capPressureFlag, + localIndex & upwindDir + ) + { + real64 pot{}; + + /// each derived concrete class has to define a computePotential method that is calling UpwindScheme::potential method with a specific + /// lamda defining how to get these potentials + UPWIND::template computePotentialViscous< numComp, numFluxSupportPoints >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + pres, + gravCoef, + phaseMob, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + pot ); + + //all definition has been changed to fit pot>0 => first cell is upstream + upwindDir = (pot > 0) ? 0 : 1; + } + + + template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > + GEOS_HOST_DEVICE + void getUpwindDirectionGravity( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + real64 const totFlux, + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const capPressureFlag, + localIndex & upwindDir + ) + { + real64 pot{}; + + /// each derived concrete class has to define a computePotential method that is calling UpwindScheme::potential method with a specific + /// lamda defining how to get these potentials + UPWIND::template computePotentialGravity< numComp, numFluxSupportPoints >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + pres, + gravCoef, + phaseMob, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + pot ); + + //all definition has been changed to fit pot>0 => first cell is upstream + upwindDir = (pot >= 0) ? 0 : 1; + } + + + template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > + GEOS_HOST_DEVICE + void getUpwindDirectionCapillary( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + real64 const totFlux, //in fine should be a ElemnetViewConst once seq form are in + // place + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const capPressureFlag, + localIndex & upwindDir + ) + { + real64 pot{}; + + // each derived concrete class has to define a computePotential method that is calling UpwindScheme::potential method with a specific + // lamda defining how to get these potentials + UPWIND::template computePotentialCapillary< numComp, numFluxSupportPoints >( numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totFlux, + pres, + gravCoef, + phaseMob, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + capPressureFlag, + pot ); + + //all definition has been changed to fit pot>0 => first cell is upstream + upwindDir = (pot >= 0) ? 0 : 1; + } + + + + // templated way of evaluating the potential (to the exception of viscous one) which relies on + // up-or-downwinded mobility terms pre-multiplying potential differences + template< localIndex numComp, localIndex numFluxSupportPoints, typename LAMBDA > + GEOS_HOST_DEVICE + static void potential( localIndex numPhase, + localIndex ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + real64 & weightedPotential, + LAMBDA && fn ) + { + //getPhase Pot + real64 pot{}; + real64 pot_dP[numFluxSupportPoints]{}; + real64 pot_dC[numFluxSupportPoints][numComp]{}; + real64 dProp_dC[numComp]{}; + + fn( ip, pot, pot_dP, pot_dC, dProp_dC ); + + localIndex const k_up = 0; + localIndex const k_dw = 1; + + //loop other other phases to form + for( localIndex jp = 0; jp < numPhase; ++jp ) + { + if( jp != ip ) + { + localIndex const er_up = seri[k_up]; + localIndex const esr_up = sesri[k_up]; + localIndex const ei_up = sei[k_up]; + + localIndex const er_dw = seri[k_dw]; + localIndex const esr_dw = sesri[k_dw]; + localIndex const ei_dw = sei[k_dw]; + + real64 potOther{}; + real64 potOther_dP[numFluxSupportPoints]{}; + real64 potOther_dC[numFluxSupportPoints][numComp]{}; + real64 dPropOther_dC[numComp]{}; + + fn( jp, potOther, potOther_dP, potOther_dC, dPropOther_dC ); + + real64 const mob_up = phaseMob[er_up][esr_up][ei_up][jp]; + real64 const mob_dw = phaseMob[er_dw][esr_dw][ei_dw][jp]; + + weightedPotential += (pot - potOther >= 0) ? mob_dw * (potOther - pot) : mob_up * (potOther - pot); + + } + } + } + +}; + +/** + * @brief Class describing the Hybrid Upwind scheme as defined in "Consistent upwinding for sequential fully implicit + * multiscale compositional simulation" (Moncorge,2020) + */ +class HybridUpwind : public UpwindScheme +{ + +public: + template< localIndex numComp, localIndex numFluxSupportPoints > + GEOS_HOST_DEVICE + static + void computePotentialViscous( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + real64 const totalFlux, + ElementViewConst< arrayView1d< real64 const > > const & GEOS_UNUSED_PARAM( pres ), + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & + GEOS_UNUSED_PARAM( phaseMob ), + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const GEOS_UNUSED_PARAM( capPressureFlag ), + real64 & potential + ) + { + real64 dPot_dP[numFluxSupportPoints]{}; + real64 dPot_dC[numFluxSupportPoints][numComp]{}; + real64 dProp_dC[numComp]{}; + + + UpwindHelpers::computePotentialViscous::compute< numComp, numFluxSupportPoints >( + numPhase, + ip, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totalFlux, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + potential, + dPot_dP, + dPot_dC, + dProp_dC ); + } + + template< localIndex numComp, localIndex numFluxSupportPoints > + GEOS_HOST_DEVICE + static + void computePotentialGravity( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + real64 const totalFlux, + ElementViewConst< arrayView1d< real64 const > > const & GEOS_UNUSED_PARAM( pres ), + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const GEOS_UNUSED_PARAM( capPressureFlag ), + real64 & potential + ) + { + + //Form total velocity + potential = 0; + + //the arg lambda allows us to access some genericity + UpwindScheme::template potential< numComp, numFluxSupportPoints >( numPhase, ip, seri, sesri, sei, + phaseMob, potential, + [&]( localIndex ipp, + real64 & potential_, + real64 (& dPotential_dP_)[numFluxSupportPoints], + real64 (& dPotential_dC_)[numFluxSupportPoints][numComp], + real64 (& dProp_dC)[numComp] ) { + + UpwindHelpers::computePotentialGravity::compute< numComp, numFluxSupportPoints >( + numPhase, + ipp, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totalFlux, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + potential_, + dPotential_dP_, + dPotential_dC_, + dProp_dC ); + + } ); + } + + + template< localIndex numComp, localIndex numFluxSupportPoints > + GEOS_HOST_DEVICE + static + void computePotentialCapillary( localIndex const numPhase, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&transmissibility)[2], + real64 const (&dTrans_dPres)[2], + real64 const totalFlux, + ElementViewConst< arrayView1d< real64 const > > const & GEOS_UNUSED_PARAM( pres ), + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & + phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + integer const GEOS_UNUSED_PARAM( capPressureFlag ), + real64 & potential ) + + { + + //Form total velocity + potential = 0; + + //the arg lambda allows us to access some genericity + UpwindScheme::template potential< numComp, numFluxSupportPoints >( numPhase, ip, seri, sesri, sei, + phaseMob, potential, + [&]( localIndex ipp, + real64 & potential_, + real64 (& dPotential_dP_)[numFluxSupportPoints], + real64 (& dPotential_dC_)[numFluxSupportPoints][numComp], + real64 (& dProp_dC)[numComp] ) { + + UpwindHelpers::computePotentialCapillary::compute< numComp, numFluxSupportPoints >( + numPhase, + ipp, + seri, + sesri, + sei, + transmissibility, + dTrans_dPres, + totalFlux, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + potential_, + dPotential_dP_, + dPotential_dC_, + dProp_dC ); + } ); + } + +}; + +/*** IHU ***/ + +struct IHUPhaseFlux { + + using UPWIND_SCHEME = HybridUpwind; + /** - * @brief Compute the component flux for a given phase + * @brief Form the Implicit Hybrid Upwind from pressure gradient and gravitational head * @tparam numComp number of components * @tparam numFluxSupportPoints number of flux support points + * @param numPhase number of phases * @param ip phase index - * @param k_up uptream index for this phase + * @param hasCapPressure flag indicating if there is capillary pressure * @param seri arraySlice of the stencil-implied element region index * @param sesri arraySlice of the stencil-implied element subregion index * @param sei arraySlice of the stencil-implied element index - * @param phaseCompFrac phase component fraction - * @param dPhaseCompFrac derivative of phase component fraction wrt pressure, temperature, component fraction + * @param trans transmissibility at the connection + * @param dTrans_dPres derivative of transmissibility wrt pressure + * @param pres pressure + * @param gravCoef gravitational coefficient + * @param phaseMob phase mobility + * @param dPhaseMob derivative of phase mobility wrt pressure, temperature, comp density + * @param dPhaseVolFrac derivative of phase volume fraction wrt pressure, temperature, comp density * @param dCompFrac_dCompDens derivative of component fraction wrt component density + * @param phaseMassDens phase mass density + * @param dPhaseMassDens derivative of phase mass density wrt pressure, temperature, comp fraction + * @param phaseCapPressure phase capillary pressure + * @param dPhaseCapPressure_dPhaseVolFrac derivative of phase capillary pressure wrt phase volume fraction + * @param k_up uptream index for this phase + * @param potGrad potential gradient for this phase * @param phaseFlux phase flux * @param dPhaseFlux_dP derivative of phase flux wrt pressure * @param dPhaseFlux_dC derivative of phase flux wrt comp density - * @param compFlux component flux - * @param dCompFlux_dP derivative of phase flux wrt pressure - * @param dCompFlux_dC derivative of phase flux wrt comp density */ - template< localIndex numComp, localIndex numFluxSupportPoints > + template< integer numComp, integer numFluxSupportPoints > GEOS_HOST_DEVICE static void - compute( localIndex const ip, - localIndex const k_up, + compute( integer const numPhase, + integer const ip, + integer const hasCapPressure, localIndex const ( &seri )[numFluxSupportPoints], localIndex const ( &sesri )[numFluxSupportPoints], localIndex const ( &sei )[numFluxSupportPoints], + real64 const ( &trans )[2], + real64 const ( &dTrans_dPres )[2], + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - real64 const & phaseFlux, - real64 const ( &dPhaseFlux_dP )[numFluxSupportPoints], - real64 const ( &dPhaseFlux_dC )[numFluxSupportPoints][numComp], + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + localIndex & k_up, + real64 & potGrad, + real64 ( &phaseFlux ), + real64 ( & dPhaseFlux_dP )[numFluxSupportPoints], + real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp], real64 ( & compFlux )[numComp], real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp], real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp] ) { - localIndex const er_up = seri[k_up]; - localIndex const esr_up = sesri[k_up]; - localIndex const ei_up = sei[k_up]; - real64 dProp_dC[numComp]{}; + //loop over all phases to form total velocity + real64 totFlux{}; + real64 dTotFlux_dP[numFluxSupportPoints]{}; + real64 dTotFlux_dC[numFluxSupportPoints][numComp]{}; - // slice some constitutive arrays to avoid too much indexing in component loop - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP-3 > phaseCompFracSub = - phaseCompFrac[er_up][esr_up][ei_up][0][ip]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC-3 > dPhaseCompFracSub = - dPhaseCompFrac[er_up][esr_up][ei_up][0][ip]; + //store totMob upwinded by PPU for later schemes + real64 totMob{}; + real64 dTotMob_dP[numFluxSupportPoints]{}; + real64 dTotMob_dC[numFluxSupportPoints][numComp]{}; + localIndex k_up_ppu = -1; - // compute component fluxes and derivatives using upstream cell composition - for( integer ic = 0; ic < numComp; ++ic ) - { - real64 const ycp = phaseCompFracSub[ic]; - compFlux[ic] += phaseFlux * ycp; + //unelegant but need dummy when forming PPU total velocity + real64 dummy[numComp]; + real64 dDummy_dP[numFluxSupportPoints][numComp]; + real64 dDummy_dC[numFluxSupportPoints][numComp][numComp]; - // derivatives stemming from phase flux - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + + for( integer jp = 0; jp < numPhase; ++jp ) + { + PPUPhaseFlux::compute( numPhase, jp, hasCapPressure, + seri, sesri, sei, + trans, dTrans_dPres, + pres, gravCoef, + phaseMob, dPhaseMob, + dPhaseVolFrac, + phaseCompFrac, dPhaseCompFrac, + dCompFrac_dCompDens, + phaseMassDens, dPhaseMassDens, + phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, + k_up_ppu, potGrad, + phaseFlux, dPhaseFlux_dP, dPhaseFlux_dC, + dummy, dDummy_dP, dDummy_dC ); + + totFlux += phaseFlux; + + phaseFlux = 0.; + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) { - dCompFlux_dP[ke][ic] += dPhaseFlux_dP[ke] * ycp; - for( integer jc = 0; jc < numComp; ++jc ) + dTotFlux_dP[ke] += dPhaseFlux_dP[ke]; + totMob += phaseMob[seri[ke]][sesri[ke]][sei[ke]][jp]; + dTotMob_dP[ke] += dPhaseMob[seri[ke]][sesri[ke]][sei[ke]][jp][Deriv::dP]; + dPhaseFlux_dP[ke] = 0.; + + for( localIndex jc = 0; jc < numComp; ++jc ) { - dCompFlux_dC[ke][ic][jc] += dPhaseFlux_dC[ke][jc] * ycp; + dTotFlux_dC[ke][jc] += dPhaseFlux_dC[ke][jc]; + dTotMob_dC[ke][jc] += dPhaseMob[seri[ke]][sesri[ke]][sei[ke]][jp][Deriv::dC + jc]; + dPhaseFlux_dC[ke][jc] = 0.; } } - // additional derivatives stemming from upstream cell phase composition - dCompFlux_dP[k_up][ic] += phaseFlux * dPhaseCompFracSub[ic][Deriv::dP]; - // convert derivatives of comp fraction w.r.t. comp fractions to derivatives w.r.t. comp densities - applyChainRule( numComp, - dCompFrac_dCompDens[er_up][esr_up][ei_up], - dPhaseCompFracSub[ic], - dProp_dC, - Deriv::dC ); - for( integer jc = 0; jc < numComp; ++jc ) + } + + //fractional flow loop with IHU + //maybe needed to have density out for upwinding + + // choose upstream cell + // create local work arrays + real64 viscousPhaseFlux{}; + real64 dViscousPhaseFlux_dP[numFluxSupportPoints]{}; + real64 dViscousPhaseFlux_dC[numFluxSupportPoints][numComp]{}; + + real64 fractionalFlow{}; + real64 dFractionalFlow_dP[numFluxSupportPoints]{}; + real64 dFractionalFlow_dC[numFluxSupportPoints][numComp]{}; + + // and the fractional flow for viscous part as \lambda_i^{up}/\sum_{NP}(\lambda_j^{up}) with up decided upon + // the Upwind strategy + UpwindHelpers::computeFractionalFlowViscous< numComp, numFluxSupportPoints, + UPWIND_SCHEME >( numPhase, + ip, + seri, + sesri, + sei, + trans, + dTrans_dPres, + k_up_ppu, + totFlux, + totMob, + dTotMob_dP, + dTotMob_dC, + pres, + gravCoef, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + phaseMob, + dPhaseMob, + dPhaseVolFrac, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + hasCapPressure, + k_up, + fractionalFlow, + dFractionalFlow_dP, + dFractionalFlow_dC ); + + + /// Assembling the viscous flux (and derivatives) from fractional flow and total velocity as \phi_{\mu} = f_i^{up,\mu} uT + viscousPhaseFlux = fractionalFlow * totFlux; + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dViscousPhaseFlux_dP[ke] += dFractionalFlow_dP[ke] * totFlux; + + + for( localIndex jc = 0; jc < numComp; ++jc ) { - dCompFlux_dC[k_up][ic][jc] += phaseFlux * dProp_dC[jc]; + dViscousPhaseFlux_dC[ke][jc] += dFractionalFlow_dC[ke][jc] * totFlux; + } + } + + //NON-FIXED UT -- to be canceled out if considered fixed + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dViscousPhaseFlux_dP[ke] += fractionalFlow * dTotFlux_dP[ke]; + + + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dViscousPhaseFlux_dC[ke][jc] += fractionalFlow * dTotFlux_dC[ke][jc]; } } + //distribute on phaseComponentFlux here + PhaseComponentFlux::compute( ip, k_up, + seri, sesri, sei, + phaseCompFrac, dPhaseCompFrac, dCompFrac_dCompDens, + viscousPhaseFlux, dViscousPhaseFlux_dP, dViscousPhaseFlux_dC, + compFlux, dCompFlux_dP, dCompFlux_dC ); + + // accumulate in the flux and its derivatives + phaseFlux += viscousPhaseFlux; + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dPhaseFlux_dP[ke] += dViscousPhaseFlux_dP[ke]; + + + for( localIndex ic = 0; ic < numComp; ++ic ) + dPhaseFlux_dC[ke][ic] += dViscousPhaseFlux_dC[ke][ic]; + } + + /// Assembling the gravitational flux (and derivatives) from fractional flow and total velocity as \phi_{g} = f_i^{up,g} uT + localIndex k_up_g = -1; + localIndex k_up_og = -1; + + real64 gravitationalPhaseFlux{}; + real64 gravitationalPhaseFlux_dP[numFluxSupportPoints]{}; + real64 gravitationalPhaseFlux_dC[numFluxSupportPoints][numComp]{}; + + UpwindHelpers::computePotentialFluxesGravity< numComp, + numFluxSupportPoints, UPWIND_SCHEME >( + numPhase, + ip, + seri, + sesri, + sei, + trans, + dTrans_dPres, + k_up_ppu, + totFlux, + totMob, + dTotMob_dP, + dTotMob_dC, + pres, + gravCoef, + phaseMob, + dPhaseMob, + dPhaseVolFrac, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + hasCapPressure, + k_up_g, + k_up_og, + gravitationalPhaseFlux, + gravitationalPhaseFlux_dP, + gravitationalPhaseFlux_dC ); + + + + //distribute on phaseComponentFlux here + PhaseComponentFlux::compute( ip, k_up_g, + seri, sesri, sei, + phaseCompFrac, dPhaseCompFrac, dCompFrac_dCompDens, + gravitationalPhaseFlux, gravitationalPhaseFlux_dP, gravitationalPhaseFlux_dC, + compFlux, dCompFlux_dP, dCompFlux_dC ); + + + //update phaseFlux from gravitational + phaseFlux += gravitationalPhaseFlux; + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dPhaseFlux_dP[ke] += gravitationalPhaseFlux_dP[ke]; + for( localIndex ic = 0; ic < numComp; ++ic ) + dPhaseFlux_dC[ke][ic] += gravitationalPhaseFlux_dC[ke][ic]; + } + + + if( hasCapPressure ) + { + /// Assembling the capillary flux (and derivatives) from fractional flow and total velocity as \phi_{g} = f_i^{up,g} uT + localIndex k_up_pc = -1; + localIndex k_up_opc = -1; + + real64 capillaryPhaseFlux{}; + real64 capillaryPhaseFlux_dP[numFluxSupportPoints]{}; + real64 capillaryPhaseFlux_dC[numFluxSupportPoints][numComp]{}; + + UpwindHelpers::computePotentialFluxesCapillary< numComp, + numFluxSupportPoints, UPWIND_SCHEME >( + numPhase, + ip, + seri, + sesri, + sei, + trans, + dTrans_dPres, + k_up_ppu, + totFlux, + totMob, + dTotMob_dP, + dTotMob_dC, + pres, + gravCoef, + phaseMob, + dPhaseMob, + dPhaseVolFrac, + dCompFrac_dCompDens, + phaseMassDens, + dPhaseMassDens, + phaseCapPressure, + dPhaseCapPressure_dPhaseVolFrac, + hasCapPressure, + k_up_pc, + k_up_opc, + capillaryPhaseFlux, + capillaryPhaseFlux_dP, + capillaryPhaseFlux_dC ); + + //distribute on phaseComponentFlux here + PhaseComponentFlux::compute( ip, k_up_pc, + seri, sesri, sei, + phaseCompFrac, dPhaseCompFrac, dCompFrac_dCompDens, + capillaryPhaseFlux, capillaryPhaseFlux_dP, capillaryPhaseFlux_dC, + compFlux, dCompFlux_dP, dCompFlux_dC ); + + + //update phaseFlux from capillary + phaseFlux += capillaryPhaseFlux; + for( localIndex ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dPhaseFlux_dP[ke] += capillaryPhaseFlux_dP[ke]; + for( localIndex ic = 0; ic < numComp; ++ic ) + dPhaseFlux_dC[ke][ic] += capillaryPhaseFlux_dC[ke][ic]; + + } + + }//end if cappres + } }; + + } // namespace isothermalCompositionalMultiPhaseFVMKernelUtilities } // namespace geosx diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp index da4e426d578..7efdb9aa8d3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp @@ -65,12 +65,13 @@ enum class FaceBasedAssemblyKernelFlags TotalMassEquation = 1 << 1, // 2 /// Flag indicating whether C1-PPU is used or not C1PPU = 1 << 2, // 4 - /// Add more flags like that if needed: - // Flag4 = 1 << 3, // 8 - // Flag5 = 1 << 4, // 16 - // Flag6 = 1 << 5, // 32 - // Flag7 = 1 << 6, // 64 - // Flag8 = 1 << 7 //128 + /// Flag indicating whether IHU is used or not + IHU = 1 << 3 // 8 + /// Add more flags like that if needed: + // Flag5 = 1 << 4, // 16 + // Flag6 = 1 << 5, // 32 + // Flag7 = 1 << 6, // 64 + // Flag8 = 1 << 7 //128 }; /******************************** PhaseMobilityKernel ********************************/ @@ -529,8 +530,7 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase */ GEOS_HOST_DEVICE inline - localIndex stencilSize( localIndex const iconn ) const - { return m_sei[iconn].size(); } + localIndex stencilSize( localIndex const iconn ) const { return m_sei[iconn].size(); } /** * @brief Getter for the number of elements at this connection @@ -539,8 +539,7 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase */ GEOS_HOST_DEVICE inline - localIndex numPointsInFlux( localIndex const iconn ) const - { return m_stencilWrapper.numPointsInFlux( iconn ); } + localIndex numPointsInFlux( localIndex const iconn ) const { return m_stencilWrapper.numPointsInFlux( iconn ); } /** @@ -579,6 +578,7 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase StackVariables & stack, FUNC && compFluxKernelOp = NoOpFunc{} ) const { + // first, compute the transmissibilities at this face m_stencilWrapper.computeWeights( iconn, m_permeability, @@ -621,7 +621,7 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase localIndex k_up = -1; - if( m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::C1PPU )) + if( m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::C1PPU ) ) { isothermalCompositionalMultiphaseFVMKernelUtilities::C1PPUPhaseFlux::compute< numComp, numFluxSupportPoints > ( m_numPhases, @@ -634,6 +634,7 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase m_gravCoef, m_phaseMob, m_dPhaseMob, m_dPhaseVolFrac, + m_phaseCompFrac, m_dPhaseCompFrac, m_dCompFrac_dCompDens, m_phaseMassDens, m_dPhaseMassDens, m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac, @@ -641,7 +642,36 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase potGrad, phaseFlux, dPhaseFlux_dP, - dPhaseFlux_dC ); + dPhaseFlux_dC, + compFlux, + dCompFlux_dP, + dCompFlux_dC ); + } + else if( m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::IHU ) ) + { + isothermalCompositionalMultiphaseFVMKernelUtilities::IHUPhaseFlux::compute< numComp, numFluxSupportPoints > + ( m_numPhases, + ip, + m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::CapPressure ), + seri, sesri, sei, + trans, + dTrans_dPres, + m_pres, + m_gravCoef, + m_phaseMob, m_dPhaseMob, + m_dPhaseVolFrac, + m_phaseCompFrac, m_dPhaseCompFrac, + m_dCompFrac_dCompDens, + m_phaseMassDens, m_dPhaseMassDens, + m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac, + k_up, + potGrad, + phaseFlux, + dPhaseFlux_dP, + dPhaseFlux_dC, + compFlux, + dCompFlux_dP, + dCompFlux_dC ); } else { @@ -656,6 +686,7 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase m_gravCoef, m_phaseMob, m_dPhaseMob, m_dPhaseVolFrac, + m_phaseCompFrac, m_dPhaseCompFrac, m_dCompFrac_dCompDens, m_phaseMassDens, m_dPhaseMassDens, m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac, @@ -663,28 +694,21 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase potGrad, phaseFlux, dPhaseFlux_dP, - dPhaseFlux_dC ); + dPhaseFlux_dC, + compFlux, + dCompFlux_dP, + dCompFlux_dC ); } - isothermalCompositionalMultiphaseFVMKernelUtilities:: - PhaseComponentFlux::compute< numComp, numFluxSupportPoints > - ( ip, - k_up, - seri, sesri, sei, - m_phaseCompFrac, m_dPhaseCompFrac, - m_dCompFrac_dCompDens, - phaseFlux, dPhaseFlux_dP, dPhaseFlux_dC, - compFlux, dCompFlux_dP, dCompFlux_dC ); - // call the lambda in the phase loop to allow the reuse of the phase fluxes and their derivatives // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase compFluxKernelOp( ip, k, seri, sesri, sei, connectionIndex, k_up, seri[k_up], sesri[k_up], sei[k_up], potGrad, phaseFlux, dPhaseFlux_dP, dPhaseFlux_dC ); - } // loop over phases + } // loop over phases - // populate local flux vector and derivatives + /// populate local flux vector and derivatives for( integer ic = 0; ic < numComp; ++ic ) { integer const eqIndex0 = k[0] * numEqn + ic; @@ -751,7 +775,8 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase for( integer ic = 0; ic < numComp; ++ic ) { - RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[localRow + ic], stack.localFlux[i * numEqn + ic] ); + RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[localRow + ic], + stack.localFlux[i * numEqn + ic] ); m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > ( localRow + ic, stack.dofColIndices.data(), @@ -875,6 +900,9 @@ class FaceBasedAssemblyKernelFactory if( upwindingParams.upwindingScheme == UpwindingScheme::C1PPU && isothermalCompositionalMultiphaseFVMKernelUtilities::epsC1PPU > 0 ) kernelFlags.set( FaceBasedAssemblyKernelFlags::C1PPU ); + else if( upwindingParams.upwindingScheme == UpwindingScheme::IHU ) + kernelFlags.set( FaceBasedAssemblyKernelFlags::IHU ); + using kernelType = FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); @@ -1743,8 +1771,7 @@ class DirichletFaceBasedAssemblyKernel : public FaceBasedAssemblyKernel< NUM_COM */ GEOS_HOST_DEVICE StackVariables( localIndex const GEOS_UNUSED_PARAM( size ), - localIndex GEOS_UNUSED_PARAM( numElems ) ) - {} + localIndex GEOS_UNUSED_PARAM( numElems )) {} // Transmissibility real64 transmissibility = 0.0; diff --git a/src/coreComponents/schema/docs/TwoPointFluxApproximation.rst b/src/coreComponents/schema/docs/TwoPointFluxApproximation.rst index 57ec23d2f8a..30fa4827360 100644 --- a/src/coreComponents/schema/docs/TwoPointFluxApproximation.rst +++ b/src/coreComponents/schema/docs/TwoPointFluxApproximation.rst @@ -1,15 +1,16 @@ -=================== ==================== ======== ======================================================== -Name Type Default Description -=================== ==================== ======== ======================================================== -areaRelTol real64 1e-08 Relative tolerance for area calculations. -meanPermCoefficient real64 1 (no description available) -name groupName required A name is required for any non-unique nodes -upwindingScheme geos_UpwindingScheme PPU | Type of upwinding scheme. Valid options: - | * PPU - | * C1PPU -usePEDFM integer 0 (no description available) -=================== ==================== ======== ======================================================== +=================== ==================== ======== =============================================================== +Name Type Default Description +=================== ==================== ======== =============================================================== +areaRelTol real64 1e-08 Relative tolerance for area calculations. +meanPermCoefficient real64 1 (no description available) +name groupName required A name is required for any non-unique nodes +upwindingScheme geos_UpwindingScheme PPU | Type of upwinding scheme. Valid options: + | * PPU + | * C1PPU + | * IHU +usePEDFM integer 0 (no description available) +=================== ==================== ======== =============================================================== diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 2f990484697..1f6363b218c 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -1956,7 +1956,8 @@ the relative residual norm satisfies: +* C1PPU +* IHU--> @@ -1965,7 +1966,7 @@ the relative residual norm satisfies: - + diff --git a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt index 597d97dff87..7abc6ca2de1 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt @@ -1,8 +1,10 @@ # Specify list of tests -set( gtest_geosx_tests - testSinglePhaseBaseKernels.cpp - testThermalCompMultiphaseFlow.cpp - testThermalSinglePhaseFlow.cpp ) + +set(gtest_geosx_tests + testSinglePhaseBaseKernels.cpp + testThermalCompMultiphaseFlow.cpp + testThermalSinglePhaseFlow.cpp + ) set( dependencyList ${parallelDeps} gtest ) From f78d16242377820f529a6194504f8710e77ac72b Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Sun, 17 Mar 2024 00:45:08 -0700 Subject: [PATCH 018/286] Replace result_of of invoke_result to fix macOS compilation. (#3046) * Replace result_of of invoke_result Co-authored-by: TotoGaz <49004943+TotoGaz@users.noreply.github.com> --- src/coreComponents/codingUtilities/Utilities.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/codingUtilities/Utilities.hpp b/src/coreComponents/codingUtilities/Utilities.hpp index fcecf9a6dec..7555c6bbfbc 100644 --- a/src/coreComponents/codingUtilities/Utilities.hpp +++ b/src/coreComponents/codingUtilities/Utilities.hpp @@ -225,7 +225,7 @@ template< template< typename ... > class C, typename MAP, typename TRANSFORMER > auto mapTransformer( MAP const & map, TRANSFORMER const & transformer ) { - using v = typename std::result_of< TRANSFORMER( typename MAP::const_reference ) >::type; + using v = std::invoke_result_t< TRANSFORMER, typename MAP::const_reference >; C< v > result; auto inserter = std::inserter( result, result.end() ); std::transform( map.begin(), map.end(), inserter, transformer ); From 63ad3e91ab85e08c9505509a8ffbcba7f09b08a0 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Mon, 18 Mar 2024 12:19:38 -0700 Subject: [PATCH 019/286] Modifying rst table type names (#3040) --- scripts/SchemaToRSTDocumentation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/SchemaToRSTDocumentation.py b/scripts/SchemaToRSTDocumentation.py index 0710515381c..e6492853736 100644 --- a/scripts/SchemaToRSTDocumentation.py +++ b/scripts/SchemaToRSTDocumentation.py @@ -191,6 +191,10 @@ def buildTableValues(type_map, link_string='XML', include_defaults=True): if k in type_map[att_name]: table_row[jj] = type_map[att_name][k] + # Fix type strings + if ('Type' in k): + table_row[jj] = table_row[jj].replace('_lt_', '<').replace('_gt_', '>').replace('_cm_', ',').replace('-', ' ') + # Format any registration entries as links if ('Registered' in k): table_row[jj] = ", ".join([':ref:`%s_%s`' % (link_string, x) for x in table_row[jj]]) From 9a94d80edb5ac394deae1301bb828990d0f58fef Mon Sep 17 00:00:00 2001 From: Nicola Castelletto <38361926+castelletto1@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:07:21 -0700 Subject: [PATCH 020/286] Node/cell ordering in `InternalMesh` (#2881) * XYZ ordering for internal mesh generator * Updating testMeshGeneration unit test * Fix for periodic boundary * Adding check for setConnectivityForPeriodicBoundary * Adding IJK logic to cell block ordering * Updating doc (Advanced Cell Block Specification) * Updating input files * Typo in integrated tests documentation * Updating the integratedTests hash * Switching to direct solver for validationCase * Updating the integratedTests hash --------- Co-authored-by: Pavel Tomin --- .../isothermalLeakyWell_base_direct.xml | 30 +- .../isothermalLeakyWell_base_iterative.xml | 30 +- .../isothermalLeakyWell_benchmark.xml | 24 +- .../isothermalLeakyWell_smoke_3d.xml | 24 +- .../thermalLeakyWell_base_direct.xml | 28 +- .../thermalLeakyWell_base_iterative.xml | 28 +- .../thermalLeakyWell_benchmark.xml | 24 +- .../thermalLeakyWell_smoke_3d.xml | 24 +- ...l_2ph_staircase_gravity_segregation_3d.xml | 9 +- .../deadoil_3ph_staircase_3d.xml | 9 +- .../deadoil_3ph_staircase_hybrid_3d.xml | 9 +- .../deadoil_3ph_staircase_obl_3d.xml | 9 +- .../staircase_co2_wells_3d.xml | 9 +- .../PoroElastic_staircase_co2_3d_base.xml | 9 +- ...oElastic_staircase_singlephase_3d_base.xml | 9 +- .../poroelasticCoupling_validation.ats | 2 +- .../validationCase/validationCase.xml | 66 ++- .../compressible_1d_2solids.xml | 6 +- .../compressible_2d_2fluids.xml | 6 +- .../compressible_2d_2fluids_hybrid.xml | 8 +- inputFiles/singlePhaseFlow/staircase_3d.xml | 9 +- .../staircase_single_phase_wells_3d.xml | 9 +- ...staircase_single_phase_wells_hybrid_3d.xml | 9 +- ...oExtendedDruckerPrager_relaxation_base.xml | 5 +- ...ndedDruckerPrager_relaxation_benchmark.xml | 3 +- ...ExtendedDruckerPrager_relaxation_smoke.xml | 3 +- .../ThermoPoroElastic_staircase_co2_smoke.xml | 9 +- .../wavePropagation/acous3D_pml_smoke.xml | 38 +- integratedTests | 2 +- src/coreComponents/mesh/docs/Mesh.rst | 10 +- src/coreComponents/mesh/docs/staircase.svg | 430 +++++++++--------- .../mesh/generators/InternalMeshGenerator.cpp | 149 +++--- .../mesh/generators/InternalMeshGenerator.hpp | 4 +- .../meshTests/testMeshGeneration.cpp | 78 ++-- .../Contributing/IntegratedTests.rst | 4 +- 35 files changed, 563 insertions(+), 562 deletions(-) diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_direct.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_direct.xml index 921966dad20..25668102c78 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_direct.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_direct.xml @@ -47,7 +47,7 @@ target="/Solvers/compflow"/> diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_iterative.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_iterative.xml index dea8dc17e22..a70fd719ee6 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_iterative.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_base_iterative.xml @@ -2,7 +2,7 @@ - + diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_benchmark.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_benchmark.xml index cd134e9e2f1..3edd2f02657 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_benchmark.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_benchmark.xml @@ -18,21 +18,15 @@ nx="{ 50, 1, 20, 1, 40 }" ny="{ 50, 1, 50 }" nz="{ 20, 30, 10 }" - cellBlockNames="{ aquiferBottom00, aquitard00, aquiferTop00, - aquiferBottom01, aquitard01, aquiferTop01, - aquiferBottom02, aquitard02, aquiferTop02, - aquiferBottom10, aquitard10, aquiferTop10, - aquiferBottom11, aquitard11, aquiferTop11, - aquiferBottom12, aquitard12, aquiferTop12, - aquiferBottom20, aquitard20, aquiferTop20, - aquiferBottom21, aquitard21, aquiferTop21, - aquiferBottom22, aquitard22, aquiferTop22, - aquiferBottom30, aquitard30, aquiferTop30, - aquiferBottom31, aquitard31, aquiferTop31, - aquiferBottom32, aquitard32, aquiferTop32, - aquiferBottom40, aquitard40, aquiferTop40, - aquiferBottom41, aquitard41, aquiferTop41, - aquiferBottom42, aquitard42, aquiferTop42 }"/> + cellBlockNames="{ aquiferBottom00, aquiferBottom10, aquiferBottom20, aquiferBottom30, aquiferBottom40, + aquiferBottom01, aquiferBottom11, aquiferBottom21, aquiferBottom31, aquiferBottom41, + aquiferBottom02, aquiferBottom12, aquiferBottom22, aquiferBottom32, aquiferBottom42, + aquitard00, aquitard10, aquitard20, aquitard30, aquitard40, + aquitard01, aquitard11, aquitard21, aquitard31, aquitard41, + aquitard02, aquitard12, aquitard22, aquitard32, aquitard42, + aquiferTop00, aquiferTop10, aquiferTop20, aquiferTop30, aquiferTop40, + aquiferTop01, aquiferTop11, aquiferTop21, aquiferTop31, aquiferTop41, + aquiferTop02, aquiferTop12, aquiferTop22, aquiferTop32, aquiferTop42 }"/> diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_smoke_3d.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_smoke_3d.xml index 775890d368f..69362de80c4 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_smoke_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell_smoke_3d.xml @@ -18,21 +18,15 @@ nx="{ 5, 1, 2, 1, 4 }" ny="{ 5, 1, 5 }" nz="{ 5, 30, 5 }" - cellBlockNames="{ aquiferBottom00, aquitard00, aquiferTop00, - aquiferBottom01, aquitard01, aquiferTop01, - aquiferBottom02, aquitard02, aquiferTop02, - aquiferBottom10, aquitard10, aquiferTop10, - aquiferBottom11, aquitard11, aquiferTop11, - aquiferBottom12, aquitard12, aquiferTop12, - aquiferBottom20, aquitard20, aquiferTop20, - aquiferBottom21, aquitard21, aquiferTop21, - aquiferBottom22, aquitard22, aquiferTop22, - aquiferBottom30, aquitard30, aquiferTop30, - aquiferBottom31, aquitard31, aquiferTop31, - aquiferBottom32, aquitard32, aquiferTop32, - aquiferBottom40, aquitard40, aquiferTop40, - aquiferBottom41, aquitard41, aquiferTop41, - aquiferBottom42, aquitard42, aquiferTop42 }"/> + cellBlockNames="{ aquiferBottom00, aquiferBottom10, aquiferBottom20, aquiferBottom30, aquiferBottom40, + aquiferBottom01, aquiferBottom11, aquiferBottom21, aquiferBottom31, aquiferBottom41, + aquiferBottom02, aquiferBottom12, aquiferBottom22, aquiferBottom32, aquiferBottom42, + aquitard00, aquitard10, aquitard20, aquitard30, aquitard40, + aquitard01, aquitard11, aquitard21, aquitard31, aquitard41, + aquitard02, aquitard12, aquitard22, aquitard32, aquitard42, + aquiferTop00, aquiferTop10, aquiferTop20, aquiferTop30, aquiferTop40, + aquiferTop01, aquiferTop11, aquiferTop21, aquiferTop31, aquiferTop41, + aquiferTop02, aquiferTop12, aquiferTop22, aquiferTop32, aquiferTop42 }"/> diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_direct.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_direct.xml index 9680e6ef85f..961d7c6d00d 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_direct.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_direct.xml @@ -73,19 +73,15 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_iterative.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_iterative.xml index 91ec5e502d4..985cec900ae 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_iterative.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_base_iterative.xml @@ -61,19 +61,15 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_benchmark.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_benchmark.xml index 7cd5d9467cd..45e0669af83 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_benchmark.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_benchmark.xml @@ -18,21 +18,15 @@ nx="{ 50, 1, 20, 1, 40 }" ny="{ 50, 1, 50 }" nz="{ 20, 30, 10 }" - cellBlockNames="{ aquiferBottom00, aquitard00, aquiferTop00, - aquiferBottom01, aquitard01, aquiferTop01, - aquiferBottom02, aquitard02, aquiferTop02, - aquiferBottom10, aquitard10, aquiferTop10, - aquiferBottom11, aquitard11, aquiferTop11, - aquiferBottom12, aquitard12, aquiferTop12, - aquiferBottom20, aquitard20, aquiferTop20, - aquiferBottom21, aquitard21, aquiferTop21, - aquiferBottom22, aquitard22, aquiferTop22, - aquiferBottom30, aquitard30, aquiferTop30, - aquiferBottom31, aquitard31, aquiferTop31, - aquiferBottom32, aquitard32, aquiferTop32, - aquiferBottom40, aquitard40, aquiferTop40, - aquiferBottom41, aquitard41, aquiferTop41, - aquiferBottom42, aquitard42, aquiferTop42 }"/> + cellBlockNames="{ aquiferBottom00, aquiferBottom10, aquiferBottom20, aquiferBottom30, aquiferBottom40, + aquiferBottom01, aquiferBottom11, aquiferBottom21, aquiferBottom31, aquiferBottom41, + aquiferBottom02, aquiferBottom12, aquiferBottom22, aquiferBottom32, aquiferBottom42, + aquitard00, aquitard10, aquitard20, aquitard30, aquitard40, + aquitard01, aquitard11, aquitard21, aquitard31, aquitard41, + aquitard02, aquitard12, aquitard22, aquitard32, aquitard42, + aquiferTop00, aquiferTop10, aquiferTop20, aquiferTop30, aquiferTop40, + aquiferTop01, aquiferTop11, aquiferTop21, aquiferTop31, aquiferTop41, + aquiferTop02, aquiferTop12, aquiferTop22, aquiferTop32, aquiferTop42 }"/> diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_smoke_3d.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_smoke_3d.xml index ac2e8ae02d5..3aabd020d74 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_smoke_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell_smoke_3d.xml @@ -18,21 +18,15 @@ nx="{ 5, 1, 2, 1, 4 }" ny="{ 5, 1, 5 }" nz="{ 5, 30, 5 }" - cellBlockNames="{ aquiferBottom00, aquitard00, aquiferTop00, - aquiferBottom01, aquitard01, aquiferTop01, - aquiferBottom02, aquitard02, aquiferTop02, - aquiferBottom10, aquitard10, aquiferTop10, - aquiferBottom11, aquitard11, aquiferTop11, - aquiferBottom12, aquitard12, aquiferTop12, - aquiferBottom20, aquitard20, aquiferTop20, - aquiferBottom21, aquitard21, aquiferTop21, - aquiferBottom22, aquitard22, aquiferTop22, - aquiferBottom30, aquitard30, aquiferTop30, - aquiferBottom31, aquitard31, aquiferTop31, - aquiferBottom32, aquitard32, aquiferTop32, - aquiferBottom40, aquitard40, aquiferTop40, - aquiferBottom41, aquitard41, aquiferTop41, - aquiferBottom42, aquitard42, aquiferTop42 }"/> + cellBlockNames="{ aquiferBottom00, aquiferBottom10, aquiferBottom20, aquiferBottom30, aquiferBottom40, + aquiferBottom01, aquiferBottom11, aquiferBottom21, aquiferBottom31, aquiferBottom41, + aquiferBottom02, aquiferBottom12, aquiferBottom22, aquiferBottom32, aquiferBottom42, + aquitard00, aquitard10, aquitard20, aquitard30, aquitard40, + aquitard01, aquitard11, aquitard21, aquitard31, aquitard41, + aquitard02, aquitard12, aquitard22, aquitard32, aquitard42, + aquiferTop00, aquiferTop10, aquiferTop20, aquiferTop30, aquiferTop40, + aquiferTop01, aquiferTop11, aquiferTop21, aquiferTop31, aquiferTop41, + aquiferTop02, aquiferTop12, aquiferTop22, aquiferTop32, aquiferTop42 }"/> diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml index 23af6f08231..0d9e9853828 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml @@ -30,7 +30,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -71,12 +74,12 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml index 2b90105cff6..fc452b3d6d1 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml @@ -31,7 +31,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -92,12 +95,12 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_hybrid_3d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_hybrid_3d.xml index e4daec34867..4fe769a93b1 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_hybrid_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_hybrid_3d.xml @@ -29,7 +29,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -81,12 +84,12 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml index 2be6da038ed..f9722261b2b 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml @@ -34,7 +34,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -91,12 +94,12 @@ diff --git a/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml b/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml index 2c66c759f13..93f9b1469eb 100644 --- a/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml +++ b/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_3d.xml @@ -65,7 +65,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"> - @@ -36,10 +30,8 @@ newtonTol="1.0e-7" newtonMaxIter="40"/> + solverType="direct" + directParallel="0"/> @@ -54,10 +46,8 @@ newtonTol="1.0e-7" newtonMaxIter="40"/> + solverType="direct" + directParallel="0"/> @@ -89,15 +79,13 @@ nx="{ 5, 11, 5 }" ny="{ 5, 11, 5 }" nz="{ 2, 5, 1, 1, 1, 1, 1 }" - cellBlockNames="{ b00,b01,b02,b03,b04,b05,b06, - b07,b08,b09,b10,b11,b12,b13, - b14,b15,b16,b17,b18,b19,b20, - b21,b22,b23,b24,b25,b26,b27, - b28,b29,b30,b31,b32,b33,b34, - b35,b36,b37,b38,b39,b40,b41, - b42,b43,b44,b45,b46,b47,b48, - b49,b50,b51,b52,b53,b54,b55, - b56,b57,b58,b59,b60,b61,b62 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-2_0_0, cb-0_1_0, cb-1_1_0, cb-2_1_0, cb-0_2_0, cb-1_2_0, cb-2_2_0, + cb-0_0_1, cb-1_0_1, cb-2_0_1, cb-0_1_1, cb-1_1_1, cb-2_1_1, cb-0_2_1, cb-1_2_1, cb-2_2_1, + cb-0_0_2, cb-1_0_2, cb-2_0_2, cb-0_1_2, cb-1_1_2, cb-2_1_2, cb-0_2_2, cb-1_2_2, cb-2_2_2, + cb-0_0_3, cb-1_0_3, cb-2_0_3, cb-0_1_3, cb-1_1_3, cb-2_1_3, cb-0_2_3, cb-1_2_3, cb-2_2_3, + cb-0_0_4, cb-1_0_4, cb-2_0_4, cb-0_1_4, cb-1_1_4, cb-2_1_4, cb-0_2_4, cb-1_2_4, cb-2_2_4, + cb-0_0_5, cb-1_0_5, cb-2_0_5, cb-0_1_5, cb-1_1_5, cb-2_1_5, cb-0_2_5, cb-1_2_5, cb-2_2_5, + cb-0_0_6, cb-1_0_6, cb-2_0_6, cb-0_1_6, cb-1_1_6, cb-2_1_6, cb-0_2_6, cb-1_2_6, cb-2_2_6 }"> @@ -167,18 +155,16 @@ @@ -195,7 +181,7 @@ + maxTime="3456000"> @@ -391,7 +377,7 @@ name="sigma_xx_Res" initialCondition="1" setNames="{ all }" - objectPath="ElementRegions/reservoir/b29" + objectPath="ElementRegions/reservoir/cb-1_1_1" fieldName="skeletonRes_stress" component="0" scale="0.0"/> @@ -407,7 +393,7 @@ name="sigma_yy_Res" initialCondition="1" setNames="{ all }" - objectPath="ElementRegions/reservoir/b29" + objectPath="ElementRegions/reservoir/cb-1_1_1" fieldName="skeletonRes_stress" component="1" scale="0.0"/> @@ -423,7 +409,7 @@ name="sigma_zz_Res" initialCondition="1" setNames="{ all }" - objectPath="ElementRegions/reservoir/b29" + objectPath="ElementRegions/reservoir/cb-1_1_1" fieldName="skeletonRes_stress" component="2" scale="0.0"/> @@ -463,7 +449,7 @@ @@ -481,7 +467,7 @@ diff --git a/inputFiles/singlePhaseFlow/compressible_1d_2solids.xml b/inputFiles/singlePhaseFlow/compressible_1d_2solids.xml index 1f28c8d3e13..b6c38999957 100644 --- a/inputFiles/singlePhaseFlow/compressible_1d_2solids.xml +++ b/inputFiles/singlePhaseFlow/compressible_1d_2solids.xml @@ -25,7 +25,7 @@ nx="{ 5, 5 }" ny="{ 1 }" nz="{ 1 }" - cellBlockNames="{ block1, block2 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0 }"/> @@ -69,12 +69,12 @@ diff --git a/inputFiles/singlePhaseFlow/compressible_2d_2fluids.xml b/inputFiles/singlePhaseFlow/compressible_2d_2fluids.xml index 96110f04bbf..17b28f92439 100644 --- a/inputFiles/singlePhaseFlow/compressible_2d_2fluids.xml +++ b/inputFiles/singlePhaseFlow/compressible_2d_2fluids.xml @@ -25,7 +25,7 @@ nx="{ 5, 5 }" ny="{ 3 }" nz="{ 1 }" - cellBlockNames="{ block1, block2 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0 }"/> @@ -85,12 +85,12 @@ diff --git a/inputFiles/singlePhaseFlow/compressible_2d_2fluids_hybrid.xml b/inputFiles/singlePhaseFlow/compressible_2d_2fluids_hybrid.xml index 2c934611c49..c7589636004 100644 --- a/inputFiles/singlePhaseFlow/compressible_2d_2fluids_hybrid.xml +++ b/inputFiles/singlePhaseFlow/compressible_2d_2fluids_hybrid.xml @@ -25,7 +25,7 @@ nx="{ 5, 5 }" ny="{ 3 }" nz="{ 1 }" - cellBlockNames="{ block1, block2 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0 }"/> @@ -85,12 +85,12 @@ @@ -137,7 +137,7 @@ name="Porosity" initialCondition="1" setNames="{ all }" - objectPath="ElementRegions/Region1/block1" + objectPath="ElementRegions/Region1/cb-0_0_0" fieldName="rockPorosity_referencePorosity" scale="0.05"/> diff --git a/inputFiles/singlePhaseFlow/staircase_3d.xml b/inputFiles/singlePhaseFlow/staircase_3d.xml index 95628bc339d..199f1a726ea 100644 --- a/inputFiles/singlePhaseFlow/staircase_3d.xml +++ b/inputFiles/singlePhaseFlow/staircase_3d.xml @@ -25,7 +25,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -73,12 +76,12 @@ diff --git a/inputFiles/singlePhaseWell/staircase_single_phase_wells_3d.xml b/inputFiles/singlePhaseWell/staircase_single_phase_wells_3d.xml index 00d189ec214..6789ab90542 100644 --- a/inputFiles/singlePhaseWell/staircase_single_phase_wells_3d.xml +++ b/inputFiles/singlePhaseWell/staircase_single_phase_wells_3d.xml @@ -51,7 +51,10 @@ nx="{ 5, 5 }" ny="{ 5, 5 }" nz="{ 3, 3, 3, 3 }" - cellBlockNames="{ b00, b01, b02, b03, b04, b05, b06, b07, b08, b09, b10, b11, b12, b13, b14, b15 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"> @@ -155,7 +156,7 @@ + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1 }"/> diff --git a/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_smoke.xml b/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_smoke.xml index 0d50bd21c23..172adadc4f4 100644 --- a/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_smoke.xml +++ b/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_smoke.xml @@ -15,7 +15,8 @@ nx="{ 1, 1 }" ny="{ 1, 1 }" nz="{ 1, 1 }" - cellBlockNames="{ cb1, cb2, cb3, cb4, cb5, cb6, cb7, cb8 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1 }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3 }"/> @@ -131,11 +134,11 @@ diff --git a/inputFiles/wavePropagation/acous3D_pml_smoke.xml b/inputFiles/wavePropagation/acous3D_pml_smoke.xml index 7e2b978d31d..3a1e3db0f47 100644 --- a/inputFiles/wavePropagation/acous3D_pml_smoke.xml +++ b/inputFiles/wavePropagation/acous3D_pml_smoke.xml @@ -31,15 +31,15 @@ nx="{ 1, 3, 1}" ny="{ 1, 3, 1}" nz="{ 1, 3, 1}" - cellBlockNames="{ pmlLeftFrontBottom, pmlLeftFrontMid, pmlLeftFrontTop, - pmlLeftMidBottom, pmlLeftMidMid, pmlLeftMidTop, - pmlLeftBackBottom, pmlLeftBackMid, pmlLeftBackTop, - pmlMidFrontBottom, pmlMidFrontMid, pmlMidFrontTop, - pmlMidMidBottom, interiorMidMidMid, pmlMidMidTop, - pmlMidBackBottom, pmlMidBackMid, pmlMidBackTop, - pmlRightFrontBottom, pmlRightFrontMid, pmlRightFrontTop, - pmlRightMidBottom, pmlRightMidMid, pmlRightMidTop, - pmlRightBackBottom, pmlRightBackMid, pmlRightBackTop }"/> + cellBlockNames="{ cb-0_0_0, cb-1_0_0, cb-2_0_0, + cb-0_1_0, cb-1_1_0, cb-2_1_0, + cb-0_2_0, cb-1_2_0, cb-2_2_0, + cb-0_0_1, cb-1_0_1, cb-2_0_1, + cb-0_1_1, cb-1_1_1, cb-2_1_1, + cb-0_2_1, cb-1_2_1, cb-2_2_1, + cb-0_0_2, cb-1_0_2, cb-2_0_2, + cb-0_1_2, cb-1_1_2, cb-2_1_2, + cb-0_2_2, cb-1_2_2, cb-2_2_2 }"/> @@ -115,20 +115,20 @@ diff --git a/integratedTests b/integratedTests index abea2ddbfab..b50e624e7d9 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit abea2ddbfab58ba445a9254d514dd5ac392a25ee +Subproject commit b50e624e7d905faa2e4078e53162e159b75ebe6a diff --git a/src/coreComponents/mesh/docs/Mesh.rst b/src/coreComponents/mesh/docs/Mesh.rst index d4231f7ac20..c87441015b4 100644 --- a/src/coreComponents/mesh/docs/Mesh.rst +++ b/src/coreComponents/mesh/docs/Mesh.rst @@ -121,15 +121,18 @@ with the following code. nx="{5, 5}" ny="{5, 5}" nz="{3, 3, 3, 3}" - cellBlockNames="{b00,b01,b02,b03,b04,b05,b06,b07,b08,b09,b10,b11,b12,b13,b14,b15}"/> + cellBlockNames="{cb-0_0_0, cb-1_0_0, cb-0_1_0, cb-1_1_0, + cb-0_0_1, cb-1_0_1, cb-0_1_1, cb-1_1_1, + cb-0_0_2, cb-1_0_2, cb-0_1_2, cb-1_1_2, + cb-0_0_3, cb-1_0_3, cb-0_1_3, cb-1_1_3}"/> @@ -139,6 +142,7 @@ Thus, the generated mesh will be : :align: center :width: 500 +Note that ``CellBlocks`` are ordered following the natural IJK logic, with indices increasing first in I (x-direction), then in J (y-direction) and last in K (z-direction). .. _ExternalMeshUsage: diff --git a/src/coreComponents/mesh/docs/staircase.svg b/src/coreComponents/mesh/docs/staircase.svg index bda6f11f955..4a5dffd595d 100644 --- a/src/coreComponents/mesh/docs/staircase.svg +++ b/src/coreComponents/mesh/docs/staircase.svg @@ -2,24 +2,24 @@ + inkscape:export-ydpi="96" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + inkscape:object-paths="true" + inkscape:showpageshadow="2" + inkscape:pagecheckerboard="0" + inkscape:deskcolor="#d1d1d1" /> @@ -55,7 +58,7 @@ image/svg+xml - + @@ -1611,263 +1614,280 @@ transform="translate(433.05483,92.624135)"> b00 + sodipodi:role="line">cb_0-0-0 b01 + sodipodi:role="line">cb_0-0-1 b02 - b07 + sodipodi:role="line">cb_0-0-2 b03 - cb_0-0-3 + b08 - cb_1-0-0 + b09 - cb_1-0-1 + b10 - cb_1-0-2 + b11 + sodipodi:role="line" + id="tspan1275-0" + x="-237.57898" + y="16.654467" + style="stroke-width:0.264583">cb_1-0-3 b03 + sodipodi:role="line">cb_0-0-3 b08 - cb_1-0-0 + b09 - cb_1-0-1 + b10 - cb_1-0-2 + b11 + inkscape:export-ydpi="96" + transform="skewY(-40)">cb_1-0-3 + cb_1-1-0 + cb_1-1-1 + cb_1-1-2 + cb_1-1-3 b11 + style="stroke-width:0.264583">cb_1-0-3 b12 + style="stroke-width:0.264583" + y="-66.60495" + x="-256.42575" + id="tspan1311-8" + sodipodi:role="line">cb_0-1-3 b13 + id="tspan1331-0" + x="-165.55382" + y="-66.60495" + style="stroke-width:0.264583">cb_1-1-3 b14 - b15 - b15 + id="tspan1" + style="stroke-width:0.264583" /> diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index 23845ab3b8f..71410f24651 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -585,54 +585,54 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa // Find elemCenters for even uniform element sizes array1d< array1d< real64 > > elemCenterCoords( 3 ); - for( int i = 0; i < 3; ++i ) + for( int dim = 0; dim < m_dim; ++dim ) { - m_numElemsTotal[i] = 0; - for( int block = 0; block < m_nElems[i].size(); ++block ) + m_numElemsTotal[dim] = 0; + for( int block = 0; block < m_nElems[dim].size(); ++block ) { - m_numElemsTotal[i] += m_nElems[i][block]; + m_numElemsTotal[dim] += m_nElems[dim][block]; } array1d< int > const & parts = partition.getPartitions(); - GEOS_ERROR_IF( parts[i] > m_numElemsTotal[i], "Number of partitions in a direction should not exceed the number of elements in that direction" ); + GEOS_ERROR_IF( parts[dim] > m_numElemsTotal[dim], "Number of partitions in a direction should not exceed the number of elements in that direction" ); - elemCenterCoords[i].resize( m_numElemsTotal[i] ); - array1d< real64 > elemCenterCoordsLocal( m_numElemsTotal[i] ); - for( int k = 0; k < m_numElemsTotal[i]; ++k ) + elemCenterCoords[dim].resize( m_numElemsTotal[dim] ); + array1d< real64 > elemCenterCoordsLocal( m_numElemsTotal[dim] ); + for( integer k = 0; k < m_numElemsTotal[dim]; ++k ) { - elemCenterCoordsLocal[k] = m_min[i] + ( m_max[i] - m_min[i] ) * ( k + 0.5 ) / m_numElemsTotal[i]; + elemCenterCoordsLocal[k] = m_min[dim] + ( m_max[dim] - m_min[dim] ) * ( k + 0.5 ) / m_numElemsTotal[dim]; } MpiWrapper::allReduce( elemCenterCoordsLocal.data(), - elemCenterCoords[i].data(), - m_numElemsTotal[i], + elemCenterCoords[dim].data(), + m_numElemsTotal[dim], MPI_MAX, MPI_COMM_GEOSX ); } // Find starting/ending index // Get the first and last indices in this partition each direction - int firstElemIndexInPartition[3] = { -1, -1, -1 }; - int lastElemIndexInPartition[3] = { -2, -2, -2 }; + integer firstElemIndexInPartition[3] = { -1, -1, -1 }; + integer lastElemIndexInPartition[3] = { -2, -2, -2 }; - for( int i = 0; i < 3; ++i ) + for( int dim = 0; dim < m_dim; ++dim ) { // firstElemIndexInPartition[i] = -1; // lastElemIndexInPartition[i] = -2; - for( int k = 0; k < m_numElemsTotal[i]; ++k ) + for( int k = 0; k < m_numElemsTotal[dim]; ++k ) { - if( partition.isCoordInPartition( elemCenterCoords[i][k], i ) ) + if( partition.isCoordInPartition( elemCenterCoords[dim][k], dim ) ) { - firstElemIndexInPartition[i] = k; + firstElemIndexInPartition[dim] = k; break; } } - if( firstElemIndexInPartition[i] > -1 ) + if( firstElemIndexInPartition[dim] > -1 ) { - for( int k = firstElemIndexInPartition[i]; k < m_numElemsTotal[i]; ++k ) + for( int k = firstElemIndexInPartition[dim]; k < m_numElemsTotal[dim]; ++k ) { - if( partition.isCoordInPartition( elemCenterCoords[i][k], i ) ) + if( partition.isCoordInPartition( elemCenterCoords[dim][k], dim ) ) { - lastElemIndexInPartition[i] = k; + lastElemIndexInPartition[dim] = k; } } } @@ -647,28 +647,28 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa array1d< integer > firstElemIndexForBlockInPartition[3]; array1d< integer > lastElemIndexForBlockInPartition[3]; - for( int dir = 0; dir < 3; ++dir ) + for( int dim = 0; dim < 3; ++dim ) { - firstElemIndexForBlockInPartition[dir] = m_firstElemIndexForBlock[dir]; - lastElemIndexForBlockInPartition[dir] = m_lastElemIndexForBlock[dir]; + firstElemIndexForBlockInPartition[dim] = m_firstElemIndexForBlock[dim]; + lastElemIndexForBlockInPartition[dim] = m_lastElemIndexForBlock[dim]; - for( int block = 0; block < m_nElems[dir].size(); ++block ) + for( integer block = 0; block < m_nElems[dim].size(); ++block ) { - if( firstElemIndexForBlockInPartition[dir][block] > lastElemIndexInPartition[dir] || - lastElemIndexForBlockInPartition[dir][block] < firstElemIndexInPartition[dir] ) + if( firstElemIndexForBlockInPartition[dim][block] > lastElemIndexInPartition[dim] || + lastElemIndexForBlockInPartition[dim][block] < firstElemIndexInPartition[dim] ) { - firstElemIndexForBlockInPartition[dir][block] = -1; - lastElemIndexForBlockInPartition[dir][block] = -2; + firstElemIndexForBlockInPartition[dim][block] = -1; + lastElemIndexForBlockInPartition[dim][block] = -2; } else { - if( firstElemIndexForBlockInPartition[dir][block] < firstElemIndexInPartition[dir] ) + if( firstElemIndexForBlockInPartition[dim][block] < firstElemIndexInPartition[dim] ) { - firstElemIndexForBlockInPartition[dir][block] = firstElemIndexInPartition[dir]; + firstElemIndexForBlockInPartition[dim][block] = firstElemIndexInPartition[dim]; } - if( lastElemIndexForBlockInPartition[dir][block] > lastElemIndexInPartition[dir] ) + if( lastElemIndexForBlockInPartition[dim][block] > lastElemIndexInPartition[dim] ) { - lastElemIndexForBlockInPartition[dir][block] = lastElemIndexInPartition[dir]; + lastElemIndexForBlockInPartition[dim][block] = lastElemIndexInPartition[dim]; } } } @@ -676,11 +676,11 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa // TODO This needs to be rewritten for dimensions lower than 3. localIndex regionOffset = 0; - for( int iblock = 0; iblock < m_nElems[0].size(); ++iblock ) + for( integer kblock = 0; kblock < m_nElems[2].size(); ++kblock ) { - for( int jblock = 0; jblock < m_nElems[1].size(); ++jblock ) + for( integer jblock = 0; jblock < m_nElems[1].size(); ++jblock ) { - for( int kblock = 0; kblock < m_nElems[2].size(); ++kblock, ++regionOffset ) + for( integer iblock = 0; iblock < m_nElems[0].size(); ++iblock, ++regionOffset ) { numElemsInRegions[ m_regionNames[ regionOffset ] ] = 0; elemTypeInRegions[ m_regionNames[ regionOffset ] ] = ElementType::Quadrilateral; @@ -691,13 +691,13 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa regionOffset = 0; { localIndex iR = 0; - for( int iblock = 0; iblock < m_nElems[0].size(); ++iblock ) + for( integer kblock = 0; kblock < m_nElems[2].size(); ++kblock ) { - for( int jblock = 0; jblock < m_nElems[1].size(); ++jblock ) + for( integer jblock = 0; jblock < m_nElems[1].size(); ++jblock ) { - for( int kblock = 0; kblock < m_nElems[2].size(); ++kblock, ++regionOffset, ++iR ) + for( integer iblock = 0; iblock < m_nElems[0].size(); ++iblock, ++regionOffset, ++iR ) { - int numElemsInRegion = 1; + integer numElemsInRegion = 1; numElemsInRegion *= lastElemIndexForBlockInPartition[0][iblock] - firstElemIndexForBlockInPartition[0][iblock] + 1; if( m_dim > 1 ) @@ -719,10 +719,9 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa localIndex numNodes = 1; integer numNodesInDir[3] = { 1, 1, 1 }; - - for( int i = 0; i < m_dim; ++i ) + for( int dim = 0; dim < m_dim; ++dim ) { - numNodesInDir[i] = lastElemIndexInPartition[i] - firstElemIndexInPartition[i] + 2; + numNodesInDir[dim] = lastElemIndexInPartition[dim] - firstElemIndexInPartition[dim] + 2; } reduceNumNodesForPeriodicBoundary( partition, numNodesInDir ); numNodes = numNodesInDir[0] * numNodesInDir[1] * numNodesInDir[2]; @@ -735,17 +734,17 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa { localIndex localNodeIndex = 0; - for( int i = 0; i < numNodesInDir[0]; ++i ) + for( integer k = 0; k < numNodesInDir[2]; ++k ) { - for( int j = 0; j < numNodesInDir[1]; ++j ) + for( integer j = 0; j < numNodesInDir[1]; ++j ) { - for( int k = 0; k < numNodesInDir[2]; ++k ) + for( integer i = 0; i < numNodesInDir[0]; ++i ) { - int globalIJK[3] = { i, j, k }; + integer globalIJK[3] = { i, j, k }; - for( int a = 0; a < m_dim; ++a ) + for( int dim = 0; dim < m_dim; ++dim ) { - globalIJK[a] += firstElemIndexInPartition[a]; + globalIJK[dim] += firstElemIndexInPartition[dim]; } getNodePosition( globalIJK, m_trianglePattern, X[localNodeIndex] ); @@ -824,11 +823,11 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa numNodes = numNodesInDir[0] * numNodesInDir[1] * numNodesInDir[2]; } - for( int iblock = 0; iblock < m_nElems[0].size(); ++iblock ) + for( integer kblock = 0; kblock < m_nElems[2].size(); ++kblock ) { - for( int jblock = 0; jblock < m_nElems[1].size(); ++jblock ) + for( integer jblock = 0; jblock < m_nElems[1].size(); ++jblock ) { - for( int kblock = 0; kblock < m_nElems[2].size(); ++kblock, ++regionOffset, ++iR ) + for( integer iblock = 0; iblock < m_nElems[0].size(); ++iblock, ++regionOffset, ++iR ) { ElementType const elementType = EnumStrings< ElementType >::fromString( m_elementType[iR] ); @@ -839,25 +838,25 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa arrayView2d< localIndex, cells::NODE_MAP_USD > elemsToNodes = cellBlock.getElemToNode(); arrayView1d< globalIndex > const & elemLocalToGlobal = cellBlock.localToGlobalMap(); - int numElemsInDirForBlock[3] = + integer numElemsInDirForBlock[3] = { lastElemIndexForBlockInPartition[0][iblock] - firstElemIndexForBlockInPartition[0][iblock] + 1, lastElemIndexForBlockInPartition[1][jblock] - firstElemIndexForBlockInPartition[1][jblock] + 1, lastElemIndexForBlockInPartition[2][kblock] - firstElemIndexForBlockInPartition[2][kblock] + 1 }; - for( int i = 0; i < numElemsInDirForBlock[0]; ++i ) + for( integer k = 0; k < numElemsInDirForBlock[2]; ++k ) { - for( int j = 0; j < numElemsInDirForBlock[1]; ++j ) + for( integer j = 0; j < numElemsInDirForBlock[1]; ++j ) { - for( int k = 0; k < numElemsInDirForBlock[2]; ++k ) + for( integer i = 0; i < numElemsInDirForBlock[0]; ++i ) { - int globalIJK[3] = + integer globalIJK[3] = { i + firstElemIndexForBlockInPartition[0][iblock], j + firstElemIndexForBlockInPartition[1][jblock], k + firstElemIndexForBlockInPartition[2][kblock] }; - const localIndex firstNodeIndex = numNodesInDir[1] * numNodesInDir[2] * ( globalIJK[0] - firstElemIndexInPartition[0] ) - + numNodesInDir[2] * ( globalIJK[1] - firstElemIndexInPartition[1] ) - + ( globalIJK[2] - firstElemIndexInPartition[2] ); + localIndex const firstNodeIndex = ( globalIJK[0] - firstElemIndexInPartition[0] ) + + numNodesInDir[0] * ( globalIJK[1] - firstElemIndexInPartition[1] ) + + numNodesInDir[0] * numNodesInDir[1] * ( globalIJK[2] - firstElemIndexInPartition[2] ); localIndex nodeOfBox[8]; if( elementType == ElementType::Quadrilateral || elementType == ElementType::Triangle ) @@ -869,15 +868,17 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa } else { + localIndex const stride[3] = { 1, numNodesInDir[0], numNodesInDir[0] * numNodesInDir[1] }; + nodeOfBox[0] = firstNodeIndex; - nodeOfBox[1] = numNodesInDir[1] * numNodesInDir[2] + firstNodeIndex; - nodeOfBox[2] = numNodesInDir[1] * numNodesInDir[2] + numNodesInDir[2] + firstNodeIndex; - nodeOfBox[3] = numNodesInDir[2] + firstNodeIndex; + nodeOfBox[1] = nodeOfBox[0] + stride[0]; + nodeOfBox[2] = nodeOfBox[1] + stride[1]; + nodeOfBox[3] = nodeOfBox[0] + stride[1]; - nodeOfBox[4] = firstNodeIndex + 1; - nodeOfBox[5] = numNodesInDir[1] * numNodesInDir[2] + firstNodeIndex + 1; - nodeOfBox[6] = numNodesInDir[1] * numNodesInDir[2] + numNodesInDir[2] + firstNodeIndex + 1; - nodeOfBox[7] = numNodesInDir[2] + firstNodeIndex + 1; + nodeOfBox[4] = nodeOfBox[0] + stride[2]; + nodeOfBox[5] = nodeOfBox[1] + stride[2]; + nodeOfBox[6] = nodeOfBox[2] + stride[2]; + nodeOfBox[7] = nodeOfBox[3] + stride[2]; // 7___________________ 6 // / /| @@ -977,6 +978,8 @@ InternalMeshGenerator:: int const (&firstElemIndexInPartition)[3], localIndex (& nodeOfBox)[8] ) { + GEOS_ERROR_IF( component != 1, "Connectivity for periodic boundary implemented for the 1-component only" ); + // Condition is: // 1) element is last index in component direction // 2) first local element in component partition is zero @@ -986,14 +989,14 @@ InternalMeshGenerator:: // Last set of nodes int modGlobalIJK[3] = { globalIJK[0], globalIJK[1], globalIJK[2] }; modGlobalIJK[component] = 0; - const localIndex firstNodeIndex = numNodesInDir[1] * numNodesInDir[2] * ( modGlobalIJK[0] - firstElemIndexInPartition[0] ) - + numNodesInDir[2] * ( modGlobalIJK[1] - 0 ) - + ( modGlobalIJK[2] - firstElemIndexInPartition[2] ); + localIndex const firstNodeIndex = ( modGlobalIJK[0] - firstElemIndexInPartition[0] ) + + numNodesInDir[0] * ( modGlobalIJK[1] - firstElemIndexInPartition[1] ) + + numNodesInDir[0] * numNodesInDir[1] * ( modGlobalIJK[2] - firstElemIndexInPartition[2] ); nodeOfBox[3] = firstNodeIndex; - nodeOfBox[2] = numNodesInDir[1] * numNodesInDir[2] + firstNodeIndex; - nodeOfBox[7] = firstNodeIndex + 1; - nodeOfBox[6] = numNodesInDir[1] * numNodesInDir[2] + firstNodeIndex + 1; + nodeOfBox[2] = nodeOfBox[3] + 1; + nodeOfBox[7] = nodeOfBox[3] + numNodesInDir[0] * numNodesInDir[1]; + nodeOfBox[6] = nodeOfBox[7] + 1; } } diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp index 9b95d975df9..bcb16630c92 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp @@ -271,7 +271,7 @@ class InternalMeshGenerator : public MeshGeneratorBase */ inline globalIndex nodeGlobalIndex( int const index[3] ) { - return index[0]*(m_numElemsTotal[1]+1)*(m_numElemsTotal[2]+1) + index[1]*(m_numElemsTotal[2]+1) + index[2]; + return index[0] + index[1]*(m_numElemsTotal[0]+1) + index[2]*(m_numElemsTotal[0]+1)*(m_numElemsTotal[1]+1); } /** @@ -280,7 +280,7 @@ class InternalMeshGenerator : public MeshGeneratorBase */ inline globalIndex elemGlobalIndex( int const index[3] ) { - return index[0]*m_numElemsTotal[1]*m_numElemsTotal[2] + index[1]*m_numElemsTotal[2] + index[2]; + return index[0] + index[1]*m_numElemsTotal[0] + index[2]*m_numElemsTotal[0]*m_numElemsTotal[1]; } /** diff --git a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp index a2529c16406..e2891e9eb96 100644 --- a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp +++ b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp @@ -43,11 +43,11 @@ constexpr double dx = maxCoordInX / numElemsInX; constexpr double dy = maxCoordInY / numElemsInY; constexpr double dz = maxCoordInZ / numElemsInZ; -constexpr localIndex node_dI = numNodesInY * numNodesInZ; -constexpr localIndex node_dJ = numNodesInZ; +constexpr localIndex node_dJ = numNodesInX; +constexpr localIndex node_dK = numNodesInX * numNodesInY; -constexpr localIndex elem_dI = numElemsInY * numElemsInZ; -constexpr localIndex elem_dJ = numElemsInZ; +constexpr localIndex elem_dJ = numElemsInX; +constexpr localIndex elem_dK = numElemsInX * numElemsInY; constexpr localIndex minOrder = 1; constexpr localIndex maxOrder = 5; @@ -151,11 +151,11 @@ TEST_F( MeshGenerationTest, nodePositions ) arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & X = m_nodeManager->referencePosition(); localIndex nodeIndex = 0; - for( localIndex i = 0; i < numNodesInX; ++i ) + for( localIndex k = 0; k < numNodesInZ; ++k ) { for( localIndex j = 0; j < numNodesInY; ++j ) { - for( localIndex k = 0; k < numNodesInZ; ++k ) + for( localIndex i = 0; i < numNodesInX; ++i ) { EXPECT_DOUBLE_EQ( X( nodeIndex, 0 ), i * dx ); EXPECT_DOUBLE_EQ( X( nodeIndex, 1 ), j * dy ); @@ -174,11 +174,11 @@ TEST_F( MeshGenerationTest, elementCentersAndVolumes ) constexpr double VOLUME = dx * dy * dz; localIndex elemID = 0; - for( localIndex i = 0; i < numElemsInX; ++i ) + for( localIndex k = 0; k < numElemsInZ; ++k ) { for( localIndex j = 0; j < numElemsInY; ++j ) { - for( localIndex k = 0; k < numElemsInZ; ++k ) + for( localIndex i = 0; i < numElemsInX; ++i ) { EXPECT_DOUBLE_EQ( centers[ elemID ][ 0 ], i * dx + dx / 2.0 ); EXPECT_DOUBLE_EQ( centers[ elemID ][ 1 ], j * dy + dy / 2.0 ); @@ -196,23 +196,23 @@ TEST_F( MeshGenerationTest, elemToNodeMap ) GEOS_ERROR_IF_NE( nodeMap.size( 1 ), 8 ); localIndex elemID = 0; - for( localIndex i = 0; i < numElemsInX; ++i ) + for( localIndex k = 0; k < numElemsInZ; ++k ) { for( localIndex j = 0; j < numElemsInY; ++j ) { - for( localIndex k = 0; k < numElemsInZ; ++k ) + for( localIndex i = 0; i < numElemsInX; ++i ) { - localIndex const firstNodeID = i * node_dI + j * node_dJ + k; + localIndex const firstNodeID = i + j * node_dJ + k * node_dK; EXPECT_EQ( firstNodeID, nodeMap( elemID, 0 ) ); - EXPECT_EQ( firstNodeID + node_dI, nodeMap( elemID, 1 ) ); - EXPECT_EQ( firstNodeID + node_dI + node_dJ, nodeMap( elemID, 3 ) ); + EXPECT_EQ( firstNodeID + 1, nodeMap( elemID, 1 ) ); + EXPECT_EQ( firstNodeID + 1 + node_dJ, nodeMap( elemID, 3 ) ); EXPECT_EQ( firstNodeID + node_dJ, nodeMap( elemID, 2 ) ); - EXPECT_EQ( firstNodeID + 1, nodeMap( elemID, 4 ) ); - EXPECT_EQ( firstNodeID + 1 + node_dI, nodeMap( elemID, 5 ) ); - EXPECT_EQ( firstNodeID + 1 + node_dI + node_dJ, nodeMap( elemID, 7 ) ); - EXPECT_EQ( firstNodeID + 1 + node_dJ, nodeMap( elemID, 6 ) ); + EXPECT_EQ( firstNodeID + node_dK, nodeMap( elemID, 4 ) ); + EXPECT_EQ( firstNodeID + node_dK + 1, nodeMap( elemID, 5 ) ); + EXPECT_EQ( firstNodeID + node_dK + 1 + node_dJ, nodeMap( elemID, 7 ) ); + EXPECT_EQ( firstNodeID + node_dK + node_dJ, nodeMap( elemID, 6 ) ); ++elemID; } } @@ -224,13 +224,13 @@ TEST_F( MeshGenerationTest, nodeToElemMap ) ArrayOfArraysView< localIndex const > const & nodeToElemMap = m_nodeManager->elementList().toViewConst(); localIndex nodeIndex = 0; - for( localIndex i = 0; i < numNodesInX; ++i ) + for( localIndex k = 0; k < numNodesInZ; ++k ) { for( localIndex j = 0; j < numNodesInY; ++j ) { - for( localIndex k = 0; k < numNodesInZ; ++k ) + for( localIndex i = 0; i < numNodesInX; ++i ) { - localIndex const elemID = i * elem_dI + j * elem_dJ + k; + localIndex const elemID = i + j * elem_dJ + k * elem_dK; std::vector< localIndex > expectedElems; if( k < numElemsInZ ) @@ -238,9 +238,9 @@ TEST_F( MeshGenerationTest, nodeToElemMap ) if( i < numElemsInX && j < numElemsInY ) expectedElems.push_back( elemID ); if( i > 0 && j < numElemsInY ) - expectedElems.push_back( elemID - elem_dI ); + expectedElems.push_back( elemID - 1 ); if( i > 0 && j > 0 ) - expectedElems.push_back( elemID - elem_dI - elem_dJ ); + expectedElems.push_back( elemID - 1 - elem_dJ ); if( i < numElemsInX && j > 0 ) expectedElems.push_back( elemID - elem_dJ ); } @@ -248,13 +248,13 @@ TEST_F( MeshGenerationTest, nodeToElemMap ) if( k > 0 ) { if( i < numElemsInX && j < numElemsInY ) - expectedElems.push_back( elemID - 1 ); + expectedElems.push_back( elemID - elem_dK ); if( i > 0 && j < numElemsInY ) - expectedElems.push_back( elemID - elem_dI - 1 ); + expectedElems.push_back( elemID - elem_dK - 1 ); if( i > 0 && j > 0 ) - expectedElems.push_back( elemID - elem_dI - elem_dJ - 1 ); + expectedElems.push_back( elemID - 1 - elem_dJ - elem_dK ); if( i < numElemsInX && j > 0 ) - expectedElems.push_back( elemID - elem_dJ - 1 ); + expectedElems.push_back( elemID - elem_dJ - elem_dK ); } localIndex const numElems = expectedElems.size(); @@ -290,11 +290,11 @@ TEST_F( MeshGenerationTest, faceNodeMaps ) array1d< localIndex > faceNodesFromFace( 4 ); localIndex elemID = 0; - for( localIndex i = 0; i < numElemsInX; ++i ) + for( localIndex k = 0; k < numElemsInZ; ++k ) { for( localIndex j = 0; j < numElemsInY; ++j ) { - for( localIndex k = 0; k < numElemsInZ; ++k ) + for( localIndex i = 0; i < numElemsInX; ++i ) { for( localIndex f = 0; f < 6; ++f ) { @@ -340,14 +340,14 @@ TEST_F( MeshGenerationTest, faceElementMaps ) GEOS_ERROR_IF_NE( elementToFaceMap.size( 1 ), 6 ); - localIndex const elemIDOffset[6] = { -elem_dJ, -1, -elem_dI, elem_dI, elem_dJ, 1 }; + localIndex const elemIDOffset[6] = { -elem_dJ, -elem_dK, -1, 1, elem_dJ, elem_dK }; localIndex elemID = 0; - for( localIndex i = 0; i < numElemsInX; ++i ) + for( localIndex k = 0; k < numElemsInZ; ++k ) { for( localIndex j = 0; j < numElemsInY; ++j ) { - for( localIndex k = 0; k < numElemsInZ; ++k ) + for( localIndex i = 0; i < numElemsInX; ++i ) { for( localIndex f = 0; f < 6; ++f ) { @@ -421,21 +421,21 @@ TEST_F( MeshGenerationTest, edgeNodeMaps ) GEOS_ERROR_IF_NE( edgeToNodeMap.size( 1 ), 2 ); localIndex nodeIndex = 0; - for( localIndex i = 0; i < numNodesInX; ++i ) + for( localIndex k = 0; k < numNodesInZ; ++k ) { for( localIndex j = 0; j < numNodesInY; ++j ) { - for( localIndex k = 0; k < numNodesInZ; ++k ) + for( localIndex i = 0; i < numNodesInX; ++i ) { localIndex numEdges = 0; if( i != 0 ) { - EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex - node_dI, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); + EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex - 1, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); ++numEdges; } if( i != numNodesInX - 1 ) { - EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex + node_dI, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); + EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex + 1, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); ++numEdges; } if( j != 0 ) @@ -450,12 +450,12 @@ TEST_F( MeshGenerationTest, edgeNodeMaps ) } if( k != 0 ) { - EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex - 1, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); + EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex - node_dK, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); ++numEdges; } if( k != numNodesInZ - 1 ) { - EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex + 1, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); + EXPECT_TRUE( walkEdgesToFindNeighbor( nodeIndex, nodeIndex + node_dK, nodeToEdgeMap[ nodeIndex ], edgeToNodeMap ) ); ++numEdges; } @@ -477,11 +477,11 @@ TEST_F( MeshGenerationTest, edgeFaceMaps ) GEOS_ERROR_IF_NE( elementToFaceMap.size( 1 ), 6 ); localIndex elemID = 0; - for( localIndex i = 0; i < numElemsInX; ++i ) + for( localIndex k = 0; k < numElemsInZ; ++k ) { for( localIndex j = 0; j < numElemsInY; ++j ) { - for( localIndex k = 0; k < numElemsInZ; ++k ) + for( localIndex i = 0; i < numElemsInX; ++i ) { for( localIndex f = 0; f < 6; ++f ) { diff --git a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst index f2e355372c2..e8a97841ac2 100644 --- a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst +++ b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst @@ -542,11 +542,11 @@ To do this you can run this command in the build directory: make ats_rebaseline_failed -Otherwise, you can run the following command, and select whether tests should be rebaselined one at a time via a ``[y/n]`` prompt. +Otherwise, you can run the following command, and select whether tests should be rebaselined one at a time via a ``[y/n]`` prompt: .. code-block:: sh - make ats_rebaseline_failed + make ats_rebaseline Make sure to only answer ``y`` to the tests that you actually want to rebaseline, otherwise correct baselines for already passing tests will still be updated and bloat your pull request and repository size. From ce219dc5e64ecb7d6dacd09accf0a0816f0f24f4 Mon Sep 17 00:00:00 2001 From: frankfeifan Date: Tue, 19 Mar 2024 21:29:55 -0700 Subject: [PATCH 021/286] Initialization of fields in new fracture cells in HydroFracture solver (#2960) --- integratedTests | 2 +- .../finiteVolume/FluxApproximationBase.hpp | 4 +- .../finiteVolume/SurfaceElementStencil.hpp | 19 -- .../TwoPointFluxApproximation.cpp | 244 +----------------- .../TwoPointFluxApproximation.hpp | 3 +- .../fluidFlow/SinglePhaseBaseKernels.hpp | 12 +- .../ThermalSinglePhaseBaseKernels.hpp | 17 +- .../multiphysics/HydrofractureSolver.cpp | 185 ++++++++++++- .../multiphysics/HydrofractureSolver.hpp | 22 ++ .../surfaceGeneration/SurfaceGenerator.cpp | 6 +- .../schema/docs/AcousticElasticSEM_other.rst | 18 +- .../docs/AcousticFirstOrderSEM_other.rst | 58 ++--- .../schema/docs/AcousticSEM_other.rst | 48 ++-- .../schema/docs/AcousticVTISEM_other.rst | 48 ++-- .../schema/docs/BlackOilFluid_other.rst | 64 ++--- .../docs/CO2BrineEzrokhiFluid_other.rst | 52 ++-- .../CO2BrineEzrokhiThermalFluid_other.rst | 52 ++-- .../docs/CO2BrinePhillipsFluid_other.rst | 52 ++-- .../CO2BrinePhillipsThermalFluid_other.rst | 52 ++-- .../schema/docs/CellElementRegion_other.rst | 24 +- .../docs/CompositionalMultiphaseFVM_other.rst | 18 +- .../CompositionalMultiphaseFluid_other.rst | 52 ++-- ...CompositionalMultiphaseHybridFVM_other.rst | 22 +- ...MultiphaseReservoirPoromechanics_other.rst | 22 +- ...CompositionalMultiphaseReservoir_other.rst | 20 +- .../CompositionalMultiphaseWell_other.rst | 22 +- ...sitonalTwoPhaseFluidPengRobinson_other.rst | 52 ++-- ...alTwoPhaseFluidSoaveRedlichKwong_other.rst | 52 ++-- .../schema/docs/DeadOilFluid_other.rst | 62 ++--- .../docs/ElasticFirstOrderSEM_other.rst | 68 ++--- .../schema/docs/ElasticSEM_other.rst | 54 ++-- .../schema/docs/ElementRegions_other.rst | 30 +-- .../docs/EmbeddedSurfaceGenerator_other.rst | 20 +- .../docs/FlowProppantTransport_other.rst | 20 +- .../schema/docs/Hydrofracture.rst | 39 +-- .../schema/docs/Hydrofracture_other.rst | 22 +- .../docs/JFunctionCapillaryPressure_other.rst | 20 +- .../schema/docs/LaplaceFEM_other.rst | 18 +- ...MultiphasePoromechanicsReservoir_other.rst | 20 +- .../docs/MultiphasePoromechanics_other.rst | 22 +- .../schema/docs/ParticleRegion_other.rst | 24 +- .../schema/docs/ParticleRegions_other.rst | 26 +- .../schema/docs/PhaseFieldDamageFEM_other.rst | 18 +- .../schema/docs/PhaseFieldFracture_other.rst | 20 +- .../schema/docs/ProppantTransport_other.rst | 18 +- .../docs/ReactiveBrineThermal_other.rst | 60 ++--- .../schema/docs/ReactiveBrine_other.rst | 60 ++--- ...activeCompositionalMultiphaseOBL_other.rst | 18 +- .../schema/docs/SinglePhaseFVM_other.rst | 18 +- .../docs/SinglePhaseHybridFVM_other.rst | 20 +- ...PoromechanicsConformingFractures_other.rst | 22 +- ...sePoromechanicsEmbeddedFractures_other.rst | 22 +- ...inglePhasePoromechanicsReservoir_other.rst | 20 +- .../docs/SinglePhasePoromechanics_other.rst | 22 +- .../docs/SinglePhaseProppantFVM_other.rst | 18 +- ...inglePhaseReservoirPoromechanics_other.rst | 22 +- .../docs/SinglePhaseReservoir_other.rst | 20 +- .../schema/docs/SinglePhaseWell_other.rst | 22 +- .../SolidMechanicsEmbeddedFractures_other.rst | 24 +- .../SolidMechanicsLagrangeContact_other.rst | 24 +- .../SolidMechanicsLagrangianSSLE_other.rst | 20 +- .../SolidMechanics_LagrangianFEM_other.rst | 20 +- .../schema/docs/SolidMechanics_MPM_other.rst | 60 ++--- .../docs/SurfaceElementRegion_other.rst | 24 +- .../schema/docs/SurfaceGenerator_other.rst | 30 +-- .../docs/TableCapillaryPressure_other.rst | 18 +- ...leRelativePermeabilityHysteresis_other.rst | 46 ++-- .../docs/TableRelativePermeability_other.rst | 26 +- .../docs/TwoPointFluxApproximation_other.rst | 22 +- ...WellElementRegionUniqueSubRegion_other.rst | 50 ++-- .../schema/docs/WellElementRegion_other.rst | 28 +- .../schema/docs/domain_other.rst | 16 +- .../schema/docs/edgeManager_other.rst | 26 +- .../embeddedSurfacesEdgeManager_other.rst | 26 +- .../embeddedSurfacesNodeManager_other.rst | 36 +-- .../schema/docs/faceManager_other.rst | 42 +-- .../schema/docs/nodeManager_other.rst | 36 +-- src/coreComponents/schema/docs/sets_other.rst | 10 +- .../docs/wellElementSubRegion_other.rst | 38 +-- src/coreComponents/schema/schema.xsd | 7 + src/coreComponents/schema/schema.xsd.other | 186 ++++++------- src/coreComponents/schema/schemaUtilities.cpp | 12 +- 82 files changed, 1423 insertions(+), 1491 deletions(-) diff --git a/integratedTests b/integratedTests index b50e624e7d9..9821b209d73 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit b50e624e7d905faa2e4078e53162e159b75ebe6a +Subproject commit 9821b209d730ef24e5231e66e33c9cdc57459dad diff --git a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp index 0f509669063..3830cf52cc1 100644 --- a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp +++ b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp @@ -132,11 +132,9 @@ class FluxApproximationBase : public dataRepository::Group * @brief Add a new fracture stencil. * @param[in,out] mesh the mesh on which to add the fracture stencil * @param[in] faceElementRegionName the face element region name - * @param[in] initFields if true initialize physical fields, like pressure */ virtual void addToFractureStencil( MeshLevel & mesh, - string const & faceElementRegionName, - bool const initFields ) const = 0; + string const & faceElementRegionName ) const = 0; /** * @brief Add a new embedded fracture stencil. diff --git a/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp b/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp index 62f07d7dc51..714ac59115d 100644 --- a/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp +++ b/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp @@ -24,25 +24,6 @@ namespace geos { -/// @cond DO_NOT_DOCUMENT -// TODO remove! This option allows for the creation of new mass inside a newly -// created FaceElement. The new mass will be equal to: -// creationMass = defaultDensity * defaultAperture * faceArea. -// If 0, then the beginning of step density is artificially set to zero...which -// may cause some newton convergence problems. -#define ALLOW_CREATION_MASS 1 - - -// TODO remove! This option sets the pressure in a newly created FaceElement to -// be the lowest value of all attached non-new FaceElements. -#define SET_CREATION_PRESSURE 1 - -// TODO remove! This option sets the nodal displacements attached a newly -// created FaceElement to some scalar fraction of the aperture of the -// lowest attached non-new FaceElements. -#define SET_CREATION_DISPLACEMENT 0 -/// @endcond - /** * @brief Describes properties of SurfaceElementStencil. * diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp index 8e96749683a..d4d2ce4c3cf 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp @@ -282,11 +282,6 @@ void TwoPointFluxApproximation::addFractureFractureConnectionsDFM( MeshLevel & m hydraulicAperture, fractureRegionIndex, elemGhostRank, -#if SET_CREATION_DISPLACEMENT==1 - faceToNodesMap, - totalDisplacement, - aperture, -#endif &fractureStencil] ( localIndex const k ) { @@ -365,237 +360,6 @@ void TwoPointFluxApproximation::addFractureFractureConnectionsDFM( MeshLevel & m } ); } -void TwoPointFluxApproximation::initNewFractureFieldsDFM( MeshLevel & mesh, - string const & faceElementRegionName ) const -{ - // TODO Note that all of this initialization should be performed elsewhere. - // This is just here because it was convenient, but it is not appropriate - // to have physics based initialization in the flux approximator. - -#if !defined(SET_CREATION_DISPLACEMENT) - static_assert( true, "must have SET_CREATION_DISPLACEMENT defined" ); -#endif - -#if !defined(ALLOW_CREATION_MASS) - static_assert( true, "must have ALLOW_CREATION_MASS defined" ); -#endif - -#if !defined(SET_CREATION_PRESSURE) - static_assert( true, "must have SET_CREATION_PRESSURE defined" ); -#endif - - ElementRegionManager & elemManager = mesh.getElemManager(); - ElementRegionManager::ElementViewAccessor< arrayView1d< integer const > > const elemGhostRank = - elemManager.constructArrayViewAccessor< integer, 1 >( ObjectManagerBase::viewKeyStruct::ghostRankString() ); - - SurfaceElementRegion & fractureRegion = elemManager.getRegion< SurfaceElementRegion >( faceElementRegionName ); - localIndex const fractureRegionIndex = fractureRegion.getIndexInParent(); - FaceElementSubRegion & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); - ArrayOfArraysView< localIndex const > const & fractureConnectorsToFaceElements = fractureSubRegion.m_2dFaceTo2dElems.toViewConst(); -#if SET_CREATION_DISPLACEMENT==1 - NodeManager & nodeManager = mesh.getNodeManager(); - FaceManager const & faceManager = mesh.getFaceManager(); - ArrayOfArraysView< localIndex const > const & faceToNodesMap = faceManager.nodeList(); - FaceElementSubRegion::FaceMapType const & faceMap = fractureSubRegion.faceList(); - array2dLayoutIncrDisplacementConst const incrementalDisplacement = - nodeManager.getField< fields::solidMechanics::incrementalDisplacement >(); - array2dLayoutTotalDisplacementConst const totalDisplacement = - nodeManager.getField< fields::solidMechanics::totalDisplacement >(); - arrayView1d< real64 > const aperture = fractureSubRegion.getReference< array1d< real64 > >( "elementAperture" ); -#endif - -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT - arrayView1d< real64 > const apertureF = fractureSubRegion.getReference< array1d< real64 > >( "apertureAtFailure" ); -#endif - -#if ALLOW_CREATION_MASS==0 - arrayView1d< real64 > const dens = fractureSubRegion.getReference< array1d< real64 > >( "density_n" ); -#endif - -#if SET_CREATION_PRESSURE==1 - arrayView1d< real64 > const fluidPressure_n = fractureSubRegion.getField< fields::flow::pressure_n >(); - arrayView1d< real64 > const fluidPressure = fractureSubRegion.getField< fields::flow::pressure >(); - // Set the new face elements to some unphysical numbers to make sure they get set by the following routines. - SortedArrayView< localIndex const > const newFaceElements = fractureSubRegion.m_newFaceElements.toViewConst(); - - forAll< serialPolicy >( fractureSubRegion.m_newFaceElements.size(), [=]( localIndex const k ) - { - localIndex const kfe = newFaceElements[k]; - fluidPressure[kfe] = 1.0e99; -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT - apertureF[kfe] = aperture[kfe]; -#endif -#if SET_CREATION_DISPLACEMENT==1 - aperture[kfe] = 1.0e99; -#endif - } ); - -#endif // SET_CREATION_PRESSURE - - SortedArray< localIndex > allNewElems; - allNewElems.insert( fractureSubRegion.m_newFaceElements.begin(), - fractureSubRegion.m_newFaceElements.end() ); - SortedArrayView< localIndex const > const recalculateFractureConnectorEdges = fractureSubRegion.m_recalculateConnectionsFor2dFaces.toViewConst(); - - // add new connectors/connections between face elements to the fracture stencil - forAll< serialPolicy >( recalculateFractureConnectorEdges.size(), - [ &allNewElems, - recalculateFractureConnectorEdges, - fractureConnectorsToFaceElements, - fractureRegionIndex, - elemGhostRank, - fluidPressure, - fluidPressure_n, -#if SET_CREATION_DISPLACEMENT==1 - faceToNodesMap, - totalDisplacement, - aperture, -#endif - &fractureSubRegion - ] - ( localIndex const k ) - { - localIndex const fci = recalculateFractureConnectorEdges[k]; - localIndex const numElems = fractureConnectorsToFaceElements.sizeOfArray( fci ); -#if SET_CREATION_PRESSURE==1 - real64 initialPressure = 1.0e99; -#endif -#if SET_CREATION_DISPLACEMENT==1 - real64 initialAperture = 1.0e99; -#endif - SortedArray< localIndex > newElems; - bool containsLocalElement = false; - - // loop over all face elements attached to the connector and add them to the stencil - for( localIndex kfe=0; kfe( totalDisplacement[node0] ) ) > 1.0e-99 && - LvArray::math::abs( LvArray::tensorOps::l2Norm< 3 >( totalDisplacement[node1] ) ) > 1.0e-99 ) - { - zeroDisp = false; - } - } - if( zeroDisp ) - { - aperture[newElemIndex] = 0; - } -#endif - } - } ); - - SortedArray< localIndex > touchedNodes; - forAll< serialPolicy >( allNewElems.size(), - [ &allNewElems - , fluidPressure - , fluidPressure_n -#if SET_CREATION_DISPLACEMENT==1 - , aperture - , faceMap - , faceNormal - , faceToNodesMap - , &touchedNodes - , incrementalDisplacement - , totalDisplacement - , this -#endif - ]( localIndex const k ) - { - localIndex const newElemIndex = allNewElems[k]; - // if the value of pressure was not set, then set it to zero and punt. - if( fluidPressure[newElemIndex] > 1.0e98 ) - { - fluidPressure[newElemIndex] = 0.0; - } - fluidPressure_n[newElemIndex] = fluidPressure[newElemIndex]; -#if ALLOW_CREATION_MASS==0 - // set the initial density of the face element to 0 to enforce mass conservation ( i.e. no creation of mass) - dens[newElemIndex] = 0.0; -#endif -#if SET_CREATION_DISPLACEMENT==1 - // If the aperture has been set, then we can set the estimate of displacements. - if( aperture[newElemIndex] < 1e98 ) - { - localIndex const faceIndex0 = faceMap( newElemIndex, 0 ); - localIndex const faceIndex1 = faceMap( newElemIndex, 1 ); - - real64 newDisp[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceNormal[ faceIndex0 ] ); - LvArray::tensorOps::scale< 3 >( newDisp, -aperture[newElemIndex] ); - localIndex const numNodesPerFace = faceToNodesMap.sizeOfArray( faceIndex0 ); - for( localIndex a=0; a( incrementalDisplacement[node0], newDisp ); - LvArray::tensorOps::add< 3 >( totalDisplacement[node0], newDisp ); - LvArray::tensorOps::subtract< 3 >( incrementalDisplacement[node1], newDisp ); - LvArray::tensorOps::subtract< 3 >( totalDisplacement[node1], newDisp ); - } - } - } - if( this->getLogLevel() > 1 ) - { - printf( "New elem index, init aper, init press = %4ld, %4.2e, %4.2e \n", - newElemIndex, - aperture[newElemIndex], - fluidPressure[newElemIndex] ); - } -#endif - } ); -} - void TwoPointFluxApproximation::cleanMatrixMatrixConnectionsDFM( MeshLevel & mesh, string const & faceElementRegionName ) const { @@ -761,17 +525,11 @@ void TwoPointFluxApproximation::addFractureMatrixConnectionsDFM( MeshLevel & mes } void TwoPointFluxApproximation::addToFractureStencil( MeshLevel & mesh, - string const & faceElementRegionName, - bool const initFields ) const + string const & faceElementRegionName ) const { this->addFractureFractureConnectionsDFM( mesh, faceElementRegionName ); this->cleanMatrixMatrixConnectionsDFM( mesh, faceElementRegionName ); this->addFractureMatrixConnectionsDFM( mesh, faceElementRegionName ); - - if( initFields ) - { - this->initNewFractureFieldsDFM( mesh, faceElementRegionName ); - } } void TwoPointFluxApproximation::addFractureMatrixConnectionsEDFM( MeshLevel & mesh, diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp index 8820dd4a388..1cbd8453763 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp @@ -73,8 +73,7 @@ class TwoPointFluxApproximation : public FluxApproximationBase virtual void registerFractureStencil( Group & stencilGroup ) const override; virtual void addToFractureStencil( MeshLevel & mesh, - string const & faceElementRegionName, - bool const initFields ) const override; + string const & faceElementRegionName ) const override; virtual void registerBoundaryStencil( Group & stencilGroup, string const & setName ) const override; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp index 1a53a221166..8a101bea087 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp @@ -359,14 +359,8 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ) -#if ALLOW_CREATION_MASS , m_creationMass( subRegion.getReference< array1d< real64 > >( SurfaceElementSubRegion::viewKeyStruct::creationMassString() ) ) -#endif - { -#if !defined(ALLOW_CREATION_MASS) - static_assert( true, "must have ALLOW_CREATION_MASS defined" ); -#endif - } + {} /** * @brief Compute the local accumulation contributions to the residual and Jacobian @@ -380,20 +374,16 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur { Base::computeAccumulation( ei, stack, [&] () { -#if ALLOW_CREATION_MASS if( Base::m_volume[ei] * Base::m_density_n[ei][0] > 1.1 * m_creationMass[ei] ) { stack.localResidual[0] += m_creationMass[ei] * 0.25; } -#endif } ); } protected: -#if ALLOW_CREATION_MASS arrayView1d< real64 const > const m_creationMass; -#endif }; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp index 8db24520903..12047977050 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp @@ -337,15 +337,9 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur constitutive::CoupledSolidBase const & solid, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) - : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ) -#if ALLOW_CREATION_MASS - , m_creationMass( subRegion.getReference< array1d< real64 > >( SurfaceElementSubRegion::viewKeyStruct::creationMassString() ) ) -#endif - { -#if !defined(ALLOW_CREATION_MASS) - static_assert( true, "must have ALLOW_CREATION_MASS defined" ); -#endif - } + : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ), + m_creationMass( subRegion.getReference< array1d< real64 > >( SurfaceElementSubRegion::viewKeyStruct::creationMassString() ) ) + {} /** * @brief Compute the local accumulation contributions to the residual and Jacobian @@ -358,20 +352,15 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur Base::StackVariables & stack ) const { Base::computeAccumulation( ei, stack ); - -#if ALLOW_CREATION_MASS if( Base::m_volume[ei] * Base::m_density_n[ei][0] > 1.1 * m_creationMass[ei] ) { stack.localResidual[0] += m_creationMass[ei] * 0.25; } -#endif } protected: -#if ALLOW_CREATION_MASS arrayView1d< real64 const > const m_creationMass; -#endif }; diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 46d83cd528c..858d9c55585 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -75,7 +75,8 @@ HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & m_surfaceGeneratorName(), m_surfaceGenerator( nullptr ), m_maxNumResolves( 10 ), - m_isMatrixPoroelastic() + m_isMatrixPoroelastic(), + m_newFractureInitializationType() { registerWrapper( viewKeyStruct::surfaceGeneratorNameString(), &m_surfaceGeneratorName ). setRTTypeName( rtTypes::CustomTypes::groupNameRef ). @@ -96,6 +97,12 @@ HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ); + /// GEOS mainly initializes pressure in the new fracture elements. + registerWrapper( viewKeyStruct::newFractureInitializationTypeString(), &m_newFractureInitializationType ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( InitializationType::Pressure ). + setDescription( "Type of new fracture element initialization. Can be Pressure or Displacement. " ); + registerWrapper( viewKeyStruct::useQuasiNewtonString(), &m_useQuasiNewton ). setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ); @@ -176,6 +183,9 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::postProcessInput() static const std::set< integer > binaryOptions = { 0, 1 }; GEOS_ERROR_IF( binaryOptions.count( m_isMatrixPoroelastic ) == 0, viewKeyStruct::isMatrixPoroelasticString() << " option can be either 0 (false) or 1 (true)" ); + GEOS_ERROR_IF( m_newFractureInitializationType != InitializationType::Pressure && m_newFractureInitializationType != InitializationType::Displacement, + viewKeyStruct::newFractureInitializationTypeString() << " option can be either Pressure or Displacement" ); + m_surfaceGenerator = &this->getParent().template getGroup< SurfaceGenerator >( m_surfaceGeneratorName ); flowSolver()->allowNegativePressure(); @@ -189,6 +199,11 @@ real64 HydrofractureSolver< POROMECHANICS_SOLVER >::fullyCoupledSolverStep( real int const cycleNumber, DomainPartition & domain ) { + if( cycleNumber == 0 && time_n <= 0 ) + { + initializeNewFractureFields( domain ); + } + real64 dtReturn = dt; implicitStepSetup( time_n, dt, domain ); @@ -236,6 +251,9 @@ real64 HydrofractureSolver< POROMECHANICS_SOLVER >::fullyCoupledSolverStep( real } else { + // We initialize the fields for new fracture cells + initializeNewFractureFields( domain ); + FieldIdentifiers fieldsToBeSync; fieldsToBeSync.addElementFields( { flow::pressure::key(), @@ -971,6 +989,171 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::setUpDflux_dApertureMatrix( Do } ); } +template< typename POROMECHANICS_SOLVER > +void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( DomainPartition & domain ) +{ + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & meshLevel, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = meshLevel.getElemManager(); + NodeManager & nodeManager = meshLevel.getNodeManager(); + FaceManager const & faceManager = meshLevel.getFaceManager(); + ArrayOfArraysView< localIndex const > const faceToNodesMap = faceManager.nodeList().toViewConst(); + arrayView2d< real64 const > faceNormal = faceManager.faceNormal(); + + solidMechanics::arrayView2dLayoutIncrDisplacement const incrementalDisplacement = + nodeManager.getField< fields::solidMechanics::incrementalDisplacement >(); + solidMechanics::arrayView2dLayoutTotalDisplacement const totalDisplacement = + nodeManager.getField< fields::solidMechanics::totalDisplacement >(); + + elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, + [=]( localIndex const, + FaceElementSubRegion & subRegion ) + { + ArrayOfArraysView< localIndex const > const facesToEdges = subRegion.edgeList().toViewConst(); + ArrayOfArraysView< localIndex const > const & fractureConnectorsToFaceElements = subRegion.m_2dFaceTo2dElems.toViewConst(); + map< localIndex, localIndex > const & edgesToConnectorEdges = subRegion.m_edgesTo2dFaces; + + ArrayOfArraysView< localIndex const > const faceMap = subRegion.faceList().toViewConst(); + + arrayView1d< real64 > const fluidPressure_n = subRegion.getField< fields::flow::pressure_n >(); + arrayView1d< real64 > const fluidPressure = subRegion.getField< fields::flow::pressure >(); + + arrayView1d< real64 > const aperture = subRegion.getReference< array1d< real64 > >( "elementAperture" ); + + // Get the list of newFractureElements + SortedArrayView< localIndex const > const newFractureElements = subRegion.m_newFaceElements.toViewConst(); + + #ifdef GEOSX_USE_SEPARATION_COEFFICIENT + arrayView1d< real64 > const apertureF = subRegion.getReference< array1d< real64 > >( "apertureAtFailure" ); + #endif + + // arrayView1d< real64 > const dens = subRegion.getReference< array1d< real64 > >( "density_n" ); // change it to make aperture + // zero + + forAll< serialPolicy >( newFractureElements.size(), [&] ( localIndex const k ) + { + localIndex const newElemIndex = newFractureElements[k]; + real64 initialPressure = 1.0e99; + real64 initialAperture = 1.0e99; + #ifdef GEOSX_USE_SEPARATION_COEFFICIENT + apertureF[newElemIndex] = aperture[newElemIndex]; + #endif + if( m_newFractureInitializationType == InitializationType::Displacement ) + { + aperture[newElemIndex] = 1.0e99; + } + arraySlice1d< localIndex const > const faceToEdges = facesToEdges[newElemIndex]; + + for( localIndex ke=0; ke 1.0e98? 0.0:initialPressure; + fluidPressure_n[newElemIndex] = fluidPressure[newElemIndex]; + } + else if( m_newFractureInitializationType == InitializationType::Displacement ) + { + // Set the aperture/fluid pressure for the new face element to be the minimum + // of the existing value, smallest aperture/pressure from a connected face element. + // aperture[newElemIndex] = std::min(aperture[newElemIndex], initialAperture); + + localIndex const faceIndex0 = faceMap[newElemIndex][0]; + localIndex const faceIndex1 = faceMap[newElemIndex][1]; + + localIndex const numNodesPerFace = faceToNodesMap.sizeOfArray( faceIndex0 ); + + bool zeroDisp = true; + + for( localIndex a=0; a( totalDisplacement[node0] ) ) > 1.0e-99 && + LvArray::math::abs( LvArray::tensorOps::l2Norm< 3 >( totalDisplacement[node1] ) ) > 1.0e-99 ) + { + zeroDisp = false; + } + } + if( zeroDisp ) + { + aperture[newElemIndex] = 0; + } + } + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "New elem index = {:4d} , init aper = {:4.2e}, init press = {:4.2e} ", + newElemIndex, aperture[newElemIndex], fluidPressure[newElemIndex] ) ); + } ); + + if( m_newFractureInitializationType == InitializationType::Displacement ) + { + SortedArray< localIndex > touchedNodes; + forAll< serialPolicy >( newFractureElements.size(), [ newFractureElements + , aperture + , faceMap + , faceNormal + , faceToNodesMap + , &touchedNodes + , incrementalDisplacement + , totalDisplacement ]( localIndex const k ) + { + localIndex const newElemIndex = newFractureElements[k]; + + if( aperture[newElemIndex] < 1e98 ) + { + localIndex const faceIndex0 = faceMap( newElemIndex, 0 ); + localIndex const faceIndex1 = faceMap( newElemIndex, 1 ); + localIndex const numNodesPerFace = faceToNodesMap.sizeOfArray( faceIndex0 ); + + real64 newDisp[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceNormal[ faceIndex0 ] ); + LvArray::tensorOps::scale< 3 >( newDisp, -aperture[newElemIndex] ); + for( localIndex a=0; a( incrementalDisplacement[node0], newDisp ); + LvArray::tensorOps::add< 3 >( totalDisplacement[node0], newDisp ); + LvArray::tensorOps::subtract< 3 >( incrementalDisplacement[node1], newDisp ); + LvArray::tensorOps::subtract< 3 >( totalDisplacement[node1], newDisp ); + } + } + } + } ); + } + + subRegion.m_recalculateConnectionsFor2dFaces.clear(); + subRegion.m_newFaceElements.clear(); + } ); + } ); +} + namespace { typedef HydrofractureSolver< SinglePhasePoromechanics< SinglePhaseBase > > SinglePhaseHydrofracture; diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index 9ee4adcdd04..152169f57c9 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -138,6 +138,12 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER return m_derivativeFluxResidual_dAperture->toViewConst(); } + enum class InitializationType : integer + { + Pressure, + Displacement, + }; + struct viewKeyStruct : Base::viewKeyStruct { constexpr static char const * contactRelationNameString() { return "contactRelationName"; } @@ -148,6 +154,8 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER constexpr static char const * isMatrixPoroelasticString() { return "isMatrixPoroelastic"; } + constexpr static char const * newFractureInitializationTypeString() { return "newFractureInitializationType"; } + constexpr static char const * useQuasiNewtonString() { return "useQuasiNewton"; } #ifdef GEOSX_USE_SEPARATION_COEFFICIENT @@ -194,6 +202,13 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER int const cycleNumber, DomainPartition & domain ) override final; + + /** + * @brief Initialize fields on the newly created elements of the fracture. + * @param domain the physical domain object + */ + void initializeNewFractureFields( DomainPartition & domain ); + // name of the contact relation string m_contactRelationName; @@ -211,10 +226,17 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER integer m_isMatrixPoroelastic; + // flag to determine which initialization type to use for the new fracture cell + InitializationType m_newFractureInitializationType; + integer m_useQuasiNewton; // use Quasi-Newton (see https://arxiv.org/abs/2111.00264) }; +ENUM_STRINGS( HydrofractureSolver< SinglePhasePoromechanics< SinglePhaseBase > >::InitializationType, + "Pressure", + "Displacement" ); + } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index 42e8639eab7..cae283b4241 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -453,7 +453,7 @@ void SurfaceGenerator::postRestartInitialization() FluxApproximationBase * const fluxApprox = fvManager.getGroupPointer< FluxApproximationBase >( a ); if( fluxApprox!=nullptr ) { - fluxApprox->addToFractureStencil( meshLevel, this->m_fractureRegionName, false ); + fluxApprox->addToFractureStencil( meshLevel, this->m_fractureRegionName ); } } @@ -508,13 +508,11 @@ real64 SurfaceGenerator::solverStep( real64 const & time_n, FluxApproximationBase * const fluxApprox = fvManager.getGroupPointer< FluxApproximationBase >( a ); if( fluxApprox!=nullptr ) { - fluxApprox->addToFractureStencil( meshLevel, this->m_fractureRegionName, true ); + fluxApprox->addToFractureStencil( meshLevel, this->m_fractureRegionName ); } } FaceElementSubRegion & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); - fractureSubRegion.m_recalculateConnectionsFor2dFaces.clear(); - fractureSubRegion.m_newFaceElements.clear(); // Recreate geometric sets meshLevel.getNodeManager().buildGeometricSets( GeometricObjectManager::getInstance() ); diff --git a/src/coreComponents/schema/docs/AcousticElasticSEM_other.rst b/src/coreComponents/schema/docs/AcousticElasticSEM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/AcousticElasticSEM_other.rst +++ b/src/coreComponents/schema/docs/AcousticElasticSEM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst b/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst index 955f1c1ca6d..44522b87d49 100644 --- a/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst +++ b/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst @@ -1,33 +1,33 @@ -========================= ============================================================================================================================================================== ======================================================================= -Name Type Description -========================= ============================================================================================================================================================== ======================================================================= -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -rcvElem integer_array Element containing the receivers -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceElem integer_array Element containing the sources -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceRegion integer_array Region containing the sources -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -uxNp1AtReceivers real32_array2d Ux value at each receiver for each timestep -uyNp1AtReceivers real32_array2d Uy value at each receiver for each timestep -uzNp1AtReceivers real32_array2d Uz value at each receiver for each timestep -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================= +========================= ====================================================================================================================================================== ======================================================================= +Name Type Description +========================= ====================================================================================================================================================== ======================================================================= +indexSeismoTrace integer Count for output pressure at receivers +linearDASVectorX real32_array X component of the linear DAS direction vector +linearDASVectorY real32_array Y component of the linear DAS direction vector +linearDASVectorZ real32_array Z component of the linear DAS direction vector +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep +rcvElem integer_array Element containing the receivers +receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank +receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point +receiverRegion integer_array Region containing the receivers +sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds +sourceElem integer_array Element containing the sources +sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank +sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point +sourceRegion integer_array Region containing the sources +sourceValue real32_array2d Source Value of the sources +usePML integer Flag to apply PML +uxNp1AtReceivers real32_array2d Ux value at each receiver for each timestep +uyNp1AtReceivers real32_array2d Uy value at each receiver for each timestep +uzNp1AtReceivers real32_array2d Uz value at each receiver for each timestep +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================= diff --git a/src/coreComponents/schema/docs/AcousticSEM_other.rst b/src/coreComponents/schema/docs/AcousticSEM_other.rst index 280974da35a..80dd4136b81 100644 --- a/src/coreComponents/schema/docs/AcousticSEM_other.rst +++ b/src/coreComponents/schema/docs/AcousticSEM_other.rst @@ -1,28 +1,28 @@ -========================= ============================================================================================================================================================== ======================================================================= -Name Type Description -========================= ============================================================================================================================================================== ======================================================================= -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -rcvElem integer_array Element containing the receivers -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================= +========================= ====================================================================================================================================================== ======================================================================= +Name Type Description +========================= ====================================================================================================================================================== ======================================================================= +indexSeismoTrace integer Count for output pressure at receivers +linearDASVectorX real32_array X component of the linear DAS direction vector +linearDASVectorY real32_array Y component of the linear DAS direction vector +linearDASVectorZ real32_array Z component of the linear DAS direction vector +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep +rcvElem integer_array Element containing the receivers +receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank +receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point +receiverRegion integer_array Region containing the receivers +sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds +sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank +sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point +sourceValue real32_array2d Source Value of the sources +usePML integer Flag to apply PML +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================= diff --git a/src/coreComponents/schema/docs/AcousticVTISEM_other.rst b/src/coreComponents/schema/docs/AcousticVTISEM_other.rst index 280974da35a..80dd4136b81 100644 --- a/src/coreComponents/schema/docs/AcousticVTISEM_other.rst +++ b/src/coreComponents/schema/docs/AcousticVTISEM_other.rst @@ -1,28 +1,28 @@ -========================= ============================================================================================================================================================== ======================================================================= -Name Type Description -========================= ============================================================================================================================================================== ======================================================================= -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -rcvElem integer_array Element containing the receivers -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================= +========================= ====================================================================================================================================================== ======================================================================= +Name Type Description +========================= ====================================================================================================================================================== ======================================================================= +indexSeismoTrace integer Count for output pressure at receivers +linearDASVectorX real32_array X component of the linear DAS direction vector +linearDASVectorY real32_array Y component of the linear DAS direction vector +linearDASVectorZ real32_array Z component of the linear DAS direction vector +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep +rcvElem integer_array Element containing the receivers +receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank +receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point +receiverRegion integer_array Region containing the receivers +sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds +sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank +sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point +sourceValue real32_array2d Source Value of the sources +usePML integer Flag to apply PML +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================= diff --git a/src/coreComponents/schema/docs/BlackOilFluid_other.rst b/src/coreComponents/schema/docs/BlackOilFluid_other.rst index 60b6325d615..0ceddaa556f 100644 --- a/src/coreComponents/schema/docs/BlackOilFluid_other.rst +++ b/src/coreComponents/schema/docs/BlackOilFluid_other.rst @@ -1,36 +1,36 @@ -=============================== ======================================================================================================= ============================================================================================================ -Name Type Description -=============================== ======================================================================================================= ============================================================================================================ -PVTO geos_constitutive_PVTOData (no description available) -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -formationVolFactorTableWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -hydrocarbonPhaseOrder integer_array (no description available) -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -viscosityTableWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -=============================== ======================================================================================================= ============================================================================================================ +=============================== =================================================================================================== ============================================================================================================ +Name Type Description +=============================== =================================================================================================== ============================================================================================================ +PVTO geos_constitutive_PVTOData (no description available) +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +formationVolFactorTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +hydrocarbonPhaseOrder integer_array (no description available) +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseOrder integer_array (no description available) +phaseTypes integer_array (no description available) +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +viscosityTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +=============================== =================================================================================================== ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst b/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst +++ b/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst b/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst +++ b/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst b/src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst +++ b/src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst b/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst +++ b/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CellElementRegion_other.rst b/src/coreComponents/schema/docs/CellElementRegion_other.rst index a65968b0105..bb012ac8ff4 100644 --- a/src/coreComponents/schema/docs/CellElementRegion_other.rst +++ b/src/coreComponents/schema/docs/CellElementRegion_other.rst @@ -1,16 +1,16 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst index c69ff8f4e38..2944d71993d 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst @@ -1,15 +1,15 @@ -========================= ============================================================================================================================================================== ================================ ================================================================ -Name Type Registered On Description -========================= ============================================================================================================================================================== ================================ ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -facePressure_n real64_array :ref:`DATASTRUCTURE_faceManager` Face pressure at the previous converged time step -mimGravityCoefficient real64_array :ref:`DATASTRUCTURE_faceManager` Mimetic gravity coefficient -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================ ================================================================ +========================= ====================================================================================================================================================== ================================ ================================================================ +Name Type Registered On Description +========================= ====================================================================================================================================================== ================================ ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +facePressure_n real64_array :ref:`DATASTRUCTURE_faceManager` Face pressure at the previous converged time step +mimGravityCoefficient real64_array :ref:`DATASTRUCTURE_faceManager` Mimetic gravity coefficient +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================ ================================================================ diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst index 3f16a155d2b..f2c739b92d8 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst @@ -1,15 +1,15 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -WellControls node :ref:`DATASTRUCTURE_WellControls` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +WellControls node :ref:`DATASTRUCTURE_WellControls` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst b/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst +++ b/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst b/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst index 476b50195e5..28636011f61 100644 --- a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst +++ b/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst @@ -1,30 +1,30 @@ -===================== ============================================================================================= ============================================================================================================ -Name Type Description -===================== ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ============================================================================================= ============================================================================================================ +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/DeadOilFluid_other.rst b/src/coreComponents/schema/docs/DeadOilFluid_other.rst index 139d0708316..de90cbaf87f 100644 --- a/src/coreComponents/schema/docs/DeadOilFluid_other.rst +++ b/src/coreComponents/schema/docs/DeadOilFluid_other.rst @@ -1,35 +1,35 @@ -=============================== ======================================================================================================= ============================================================================================================ -Name Type Description -=============================== ======================================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -formationVolFactorTableWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -hydrocarbonPhaseOrder integer_array (no description available) -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -viscosityTableWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -=============================== ======================================================================================================= ============================================================================================================ +=============================== =================================================================================================== ============================================================================================================ +Name Type Description +=============================== =================================================================================================== ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +formationVolFactorTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +hydrocarbonPhaseOrder integer_array (no description available) +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseOrder integer_array (no description available) +phaseTypes integer_array (no description available) +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +viscosityTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +=============================== =================================================================================================== ============================================================================================================ diff --git a/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst b/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst index a5e6f05623a..67c4b18bc7c 100644 --- a/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst +++ b/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst @@ -1,38 +1,38 @@ -=========================== ============================================================================================================================================================== ======================================================================= -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================= -displacementxNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (x-components) -displacementyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (y-components) -displacementzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -rcvElem integer_array Element containing the receivers -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sigmaxxNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmaxyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmaxzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmayyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmayzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmazzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceElem integer_array Element containing the sources -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceRegion integer_array Region containing the sources -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================= +=========================== ====================================================================================================================================================== ======================================================================= +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================= +displacementxNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (x-components) +displacementyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (y-components) +displacementzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +indexSeismoTrace integer Count for output pressure at receivers +linearDASVectorX real32_array X component of the linear DAS direction vector +linearDASVectorY real32_array Y component of the linear DAS direction vector +linearDASVectorZ real32_array Z component of the linear DAS direction vector +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +rcvElem integer_array Element containing the receivers +receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank +receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point +receiverRegion integer_array Region containing the receivers +sigmaxxNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sigmaxyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sigmaxzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sigmayyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sigmayzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sigmazzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) +sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds +sourceElem integer_array Element containing the sources +sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank +sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point +sourceRegion integer_array Region containing the sources +sourceValue real32_array2d Source Value of the sources +usePML integer Flag to apply PML +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================= diff --git a/src/coreComponents/schema/docs/ElasticSEM_other.rst b/src/coreComponents/schema/docs/ElasticSEM_other.rst index 06969fee16a..dbe0ac40e7a 100644 --- a/src/coreComponents/schema/docs/ElasticSEM_other.rst +++ b/src/coreComponents/schema/docs/ElasticSEM_other.rst @@ -1,31 +1,31 @@ -=========================== ============================================================================================================================================================== ================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ================================================================================== -dasSignalNp1AtReceivers real32_array2d DAS signal value at each receiver for each timestep -displacementXNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (x-component) -displacementYNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (y-component) -displacementZNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-component) -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -rcvElem integer_array Element containing the receivers -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds in z-direction -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ================================================================================== +=========================== ====================================================================================================================================================== ================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ================================================================================== +dasSignalNp1AtReceivers real32_array2d DAS signal value at each receiver for each timestep +displacementXNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (x-component) +displacementYNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (y-component) +displacementZNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-component) +indexSeismoTrace integer Count for output pressure at receivers +linearDASVectorX real32_array X component of the linear DAS direction vector +linearDASVectorY real32_array Y component of the linear DAS direction vector +linearDASVectorZ real32_array Z component of the linear DAS direction vector +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +rcvElem integer_array Element containing the receivers +receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank +receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point +receiverRegion integer_array Region containing the receivers +sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds in z-direction +sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank +sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point +sourceValue real32_array2d Source Value of the sources +usePML integer Flag to apply PML +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ================================================================================== diff --git a/src/coreComponents/schema/docs/ElementRegions_other.rst b/src/coreComponents/schema/docs/ElementRegions_other.rst index 17af822cdb0..f62357429ae 100644 --- a/src/coreComponents/schema/docs/ElementRegions_other.rst +++ b/src/coreComponents/schema/docs/ElementRegions_other.rst @@ -1,19 +1,19 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -CellElementRegion node :ref:`DATASTRUCTURE_CellElementRegion` -SurfaceElementRegion node :ref:`DATASTRUCTURE_SurfaceElementRegion` -WellElementRegion node :ref:`DATASTRUCTURE_WellElementRegion` -elementRegionsGroup node :ref:`DATASTRUCTURE_elementRegionsGroup` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +CellElementRegion node :ref:`DATASTRUCTURE_CellElementRegion` +SurfaceElementRegion node :ref:`DATASTRUCTURE_SurfaceElementRegion` +WellElementRegion node :ref:`DATASTRUCTURE_WellElementRegion` +elementRegionsGroup node :ref:`DATASTRUCTURE_elementRegionsGroup` +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst b/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst index 46c029f2c1a..f2590daca7c 100644 --- a/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst +++ b/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ================================================ ================================================================ -Name Type Registered On Description -========================= ============================================================================================================================================================== ================================================ ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -parentEdgeIndex integer_array :ref:`DATASTRUCTURE_embeddedSurfacesNodeManager` Index of parent edge within the mesh object it is registered on. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================ ================================================================ +========================= ====================================================================================================================================================== ================================================ ================================================================ +Name Type Registered On Description +========================= ====================================================================================================================================================== ================================================ ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +parentEdgeIndex integer_array :ref:`DATASTRUCTURE_embeddedSurfacesNodeManager` Index of parent edge within the mesh object it is registered on. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================ ================================================================ diff --git a/src/coreComponents/schema/docs/FlowProppantTransport_other.rst b/src/coreComponents/schema/docs/FlowProppantTransport_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/FlowProppantTransport_other.rst +++ b/src/coreComponents/schema/docs/FlowProppantTransport_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/Hydrofracture.rst b/src/coreComponents/schema/docs/Hydrofracture.rst index c65d103f356..2c63529e0c0 100644 --- a/src/coreComponents/schema/docs/Hydrofracture.rst +++ b/src/coreComponents/schema/docs/Hydrofracture.rst @@ -1,23 +1,24 @@ -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contactRelationName groupNameRef required Name of contact relation to enforce constraints on fracture boundary. -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isMatrixPoroelastic integer 0 (no description available) -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -maxNumResolves integer 10 Value to indicate how many resolves may be executed to perform surface generation after the execution of flow and mechanics solver. -name groupName required A name is required for any non-unique nodes -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -surfaceGeneratorName groupNameRef required Name of the surface generator to use in the hydrofracture solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -useQuasiNewton integer 0 (no description available) -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== +============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +contactRelationName groupNameRef required Name of contact relation to enforce constraints on fracture boundary. +flowSolverName groupNameRef required Name of the flow solver used by the coupled solver +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isMatrixPoroelastic integer 0 (no description available) +isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling +logLevel integer 0 Log level +maxNumResolves integer 10 Value to indicate how many resolves may be executed to perform surface generation after the execution of flow and mechanics solver. +name groupName required A name is required for any non-unique nodes +newFractureInitializationType geos_HydrofractureSolver >_InitializationType Pressure Type of new fracture element initialization. Can be Pressure or Displacement. +solidSolverName groupNameRef required Name of the solid solver used by the coupled solver +surfaceGeneratorName groupNameRef required Name of the surface generator to use in the hydrofracture solver +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +useQuasiNewton integer 0 (no description available) +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/Hydrofracture_other.rst b/src/coreComponents/schema/docs/Hydrofracture_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/Hydrofracture_other.rst +++ b/src/coreComponents/schema/docs/Hydrofracture_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst b/src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst index 68708936927..a9cd8c30fda 100644 --- a/src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst +++ b/src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst @@ -1,14 +1,14 @@ -=================================== ======================================================================================================= ============================================================================ -Name Type Description -=================================== ======================================================================================================= ============================================================================ -dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction -jFuncMultiplier real64_array2d Multiplier for the Leverett J-function -jFunctionWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -phaseCapPressure real64_array3d Phase capillary pressure -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -=================================== ======================================================================================================= ============================================================================ +=================================== =================================================================================================== ============================================================================ +Name Type Description +=================================== =================================================================================================== ============================================================================ +dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction +jFuncMultiplier real64_array2d Multiplier for the Leverett J-function +jFunctionWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +phaseCapPressure real64_array3d Phase capillary pressure +phaseOrder integer_array (no description available) +phaseTypes integer_array (no description available) +=================================== =================================================================================================== ============================================================================ diff --git a/src/coreComponents/schema/docs/LaplaceFEM_other.rst b/src/coreComponents/schema/docs/LaplaceFEM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/LaplaceFEM_other.rst +++ b/src/coreComponents/schema/docs/LaplaceFEM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst b/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst +++ b/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst b/src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst +++ b/src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/ParticleRegion_other.rst b/src/coreComponents/schema/docs/ParticleRegion_other.rst index fbfc33ebf7f..f57cca08d6b 100644 --- a/src/coreComponents/schema/docs/ParticleRegion_other.rst +++ b/src/coreComponents/schema/docs/ParticleRegion_other.rst @@ -1,16 +1,16 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -neighborData node :ref:`DATASTRUCTURE_neighborData` -particleSubRegions node :ref:`DATASTRUCTURE_particleSubRegions` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +neighborData node :ref:`DATASTRUCTURE_neighborData` +particleSubRegions node :ref:`DATASTRUCTURE_particleSubRegions` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/ParticleRegions_other.rst b/src/coreComponents/schema/docs/ParticleRegions_other.rst index 48075ebfe05..94022d14540 100644 --- a/src/coreComponents/schema/docs/ParticleRegions_other.rst +++ b/src/coreComponents/schema/docs/ParticleRegions_other.rst @@ -1,17 +1,17 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -ParticleRegion node :ref:`DATASTRUCTURE_ParticleRegion` -neighborData node :ref:`DATASTRUCTURE_neighborData` -particleRegionsGroup node :ref:`DATASTRUCTURE_particleRegionsGroup` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +ParticleRegion node :ref:`DATASTRUCTURE_ParticleRegion` +neighborData node :ref:`DATASTRUCTURE_neighborData` +particleRegionsGroup node :ref:`DATASTRUCTURE_particleRegionsGroup` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst b/src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst +++ b/src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/PhaseFieldFracture_other.rst b/src/coreComponents/schema/docs/PhaseFieldFracture_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/PhaseFieldFracture_other.rst +++ b/src/coreComponents/schema/docs/PhaseFieldFracture_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/ProppantTransport_other.rst b/src/coreComponents/schema/docs/ProppantTransport_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/ProppantTransport_other.rst +++ b/src/coreComponents/schema/docs/ProppantTransport_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst b/src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst index 74f30d53b77..05bd31c0020 100644 --- a/src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst +++ b/src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst @@ -1,34 +1,34 @@ -================================ ============================================================================================= ============================================================================================================ -Name Type Description -================================ ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -kineticReactionRates real64_array2d kineticReactionRates -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -primarySpeciesConcentration real64_array2d primarySpeciesConcentration -primarySpeciesTotalConcentration real64_array2d primarySpeciesTotalConcentration -secondarySpeciesConcentration real64_array2d secondarySpeciesConcentration -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -================================ ============================================================================================= ============================================================================================================ +================================ ========================================================================================= ============================================================================================================ +Name Type Description +================================ ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kineticReactionRates real64_array2d kineticReactionRates +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +primarySpeciesConcentration real64_array2d primarySpeciesConcentration +primarySpeciesTotalConcentration real64_array2d primarySpeciesTotalConcentration +secondarySpeciesConcentration real64_array2d secondarySpeciesConcentration +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +================================ ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/ReactiveBrine_other.rst b/src/coreComponents/schema/docs/ReactiveBrine_other.rst index 74f30d53b77..05bd31c0020 100644 --- a/src/coreComponents/schema/docs/ReactiveBrine_other.rst +++ b/src/coreComponents/schema/docs/ReactiveBrine_other.rst @@ -1,34 +1,34 @@ -================================ ============================================================================================= ============================================================================================================ -Name Type Description -================================ ============================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array< double, 5, camp_int_seq< long, 0l, 1l, 2l, 3l, 4l >, int, LvArray_ChaiBuffer > Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -kineticReactionRates real64_array2d kineticReactionRates -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -primarySpeciesConcentration real64_array2d primarySpeciesConcentration -primarySpeciesTotalConcentration real64_array2d primarySpeciesTotalConcentration -secondarySpeciesConcentration real64_array2d secondarySpeciesConcentration -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -================================ ============================================================================================= ============================================================================================================ +================================ ========================================================================================= ============================================================================================================ +Name Type Description +================================ ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kineticReactionRates real64_array2d kineticReactionRates +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +primarySpeciesConcentration real64_array2d primarySpeciesConcentration +primarySpeciesTotalConcentration real64_array2d primarySpeciesTotalConcentration +secondarySpeciesConcentration real64_array2d secondarySpeciesConcentration +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +================================ ========================================================================================= ============================================================================================================ diff --git a/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst b/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst +++ b/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/SinglePhaseFVM_other.rst b/src/coreComponents/schema/docs/SinglePhaseFVM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/SinglePhaseFVM_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseFVM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst b/src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst index d1627f7fba7..f0cca96f3a1 100644 --- a/src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ================================ ================================================================ -Name Type Registered On Description -========================= ============================================================================================================================================================== ================================ ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -facePressure_n real64_array :ref:`DATASTRUCTURE_faceManager` Face pressure at the previous converged time step -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================ ================================================================ +========================= ====================================================================================================================================================== ================================ ================================================================ +Name Type Registered On Description +========================= ====================================================================================================================================================== ================================ ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +facePressure_n real64_array :ref:`DATASTRUCTURE_faceManager` Face pressure at the previous converged time step +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================ ================================================================ diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst b/src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst index 3f1b37c3d6c..f296d4de732 100644 --- a/src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst @@ -1,13 +1,13 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst index 80b71ab722d..dc33be0a036 100644 --- a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst @@ -1,15 +1,15 @@ -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst b/src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst index 45d9a187f0a..cccf4603c70 100644 --- a/src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseWell_other.rst b/src/coreComponents/schema/docs/SinglePhaseWell_other.rst index 3f16a155d2b..f2c739b92d8 100644 --- a/src/coreComponents/schema/docs/SinglePhaseWell_other.rst +++ b/src/coreComponents/schema/docs/SinglePhaseWell_other.rst @@ -1,15 +1,15 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -WellControls node :ref:`DATASTRUCTURE_WellControls` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +WellControls node :ref:`DATASTRUCTURE_WellControls` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst b/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst index 17da1cb5b33..1a9ad823675 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst @@ -1,16 +1,16 @@ -========================= ============================================================================================================================================================== ===================================================================== -Name Type Description -========================= ============================================================================================================================================================== ===================================================================== -contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -surfaceGeneratorName string Name of the surface generator to use -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ===================================================================== +========================= ====================================================================================================================================================== ===================================================================== +Name Type Description +========================= ====================================================================================================================================================== ===================================================================== +contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. +maxForce real64 The maximum force contribution in the problem domain. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +surfaceGeneratorName string Name of the surface generator to use +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ===================================================================== diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst index 17da1cb5b33..1a9ad823675 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst @@ -1,16 +1,16 @@ -========================= ============================================================================================================================================================== ===================================================================== -Name Type Description -========================= ============================================================================================================================================================== ===================================================================== -contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -surfaceGeneratorName string Name of the surface generator to use -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ===================================================================== +========================= ====================================================================================================================================================== ===================================================================== +Name Type Description +========================= ====================================================================================================================================================== ===================================================================== +contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. +maxForce real64 The maximum force contribution in the problem domain. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +surfaceGeneratorName string Name of the surface generator to use +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ===================================================================== diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst index a4018f48d74..e458a0e69b3 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxForce real64 The maximum force contribution in the problem domain. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst b/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst index a4018f48d74..e458a0e69b3 100644 --- a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst +++ b/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst @@ -1,14 +1,14 @@ -========================= ============================================================================================================================================================== ================================================================ -Name Type Description -========================= ============================================================================================================================================================== ================================================================ -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================ +========================= ====================================================================================================================================================== ================================================================ +Name Type Description +========================= ====================================================================================================================================================== ================================================================ +maxForce real64 The maximum force contribution in the problem domain. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================ diff --git a/src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst b/src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst index 4cd129ff504..e0b8502fb7f 100644 --- a/src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst +++ b/src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst @@ -1,34 +1,34 @@ -========================= ============================================================================================================================================================== ================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ================================================================================================== -bcTable real64_array2d Array that stores time-dependent bc types on x-, x+, y-, y+, z- and z+ faces. -binSizeMultiplier integer Multiplier for setting bin size, used to speed up particle neighbor sorting -domainExtent real64_array domain extent -domainF real64_array domain deformation gradient -domainL real64_array domain L -elementSize real64_array Minimum element size in x, y and z -fTable real64_array2d Array that stores time-dependent grid-aligned stretches interpreted as a global background grid F. -globalMaximum real64_array global maximum -globalMinimum real64_array global minimum -localMaximum real64_array local maximum -localMaximumNoGhost real64_array local maximum without ghost cells -localMinimum real64_array local minimum -localMinimumNoGhost real64_array local minimum without ghost cells -m_ijkMap integer_array3d Map from indices in each spatial dimension to local node ID -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -numContactFlags integer Number of contact flags that can appear due to damage -numContactGroups integer Number of prescribed contact groups -numDims integer The number of active spatial dimensions, 2 for plane strain, 3 otherwise -numElements integer_array number of elements along partition directions -numVelocityFields integer Number of velocity fields -partitionExtent real64_array parititon extent -smallMass real64 The small mass threshold for ignoring extremely low-mass nodes. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ================================================================================================== +========================= ====================================================================================================================================================== ================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ================================================================================================== +bcTable real64_array2d Array that stores time-dependent bc types on x-, x+, y-, y+, z- and z+ faces. +binSizeMultiplier integer Multiplier for setting bin size, used to speed up particle neighbor sorting +domainExtent real64_array domain extent +domainF real64_array domain deformation gradient +domainL real64_array domain L +elementSize real64_array Minimum element size in x, y and z +fTable real64_array2d Array that stores time-dependent grid-aligned stretches interpreted as a global background grid F. +globalMaximum real64_array global maximum +globalMinimum real64_array global minimum +localMaximum real64_array local maximum +localMaximumNoGhost real64_array local maximum without ghost cells +localMinimum real64_array local minimum +localMinimumNoGhost real64_array local minimum without ghost cells +m_ijkMap integer_array3d Map from indices in each spatial dimension to local node ID +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +numContactFlags integer Number of contact flags that can appear due to damage +numContactGroups integer Number of prescribed contact groups +numDims integer The number of active spatial dimensions, 2 for plane strain, 3 otherwise +numElements integer_array number of elements along partition directions +numVelocityFields integer Number of velocity fields +partitionExtent real64_array parititon extent +smallMass real64 The small mass threshold for ignoring extremely low-mass nodes. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ================================================================================================== diff --git a/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst b/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst index a65968b0105..bb012ac8ff4 100644 --- a/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst +++ b/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst @@ -1,16 +1,16 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/SurfaceGenerator_other.rst b/src/coreComponents/schema/docs/SurfaceGenerator_other.rst index d9e8cac2e2d..644325ed6a9 100644 --- a/src/coreComponents/schema/docs/SurfaceGenerator_other.rst +++ b/src/coreComponents/schema/docs/SurfaceGenerator_other.rst @@ -1,19 +1,19 @@ -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -failCriterion integer (no description available) -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase< std_pair< string, string >, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > MeshBody/Region combinations that the solver will be applied to. -tipEdges LvArray_SortedArray< int, int, LvArray_ChaiBuffer > Set containing all the tip edges -tipFaces LvArray_SortedArray< int, int, LvArray_ChaiBuffer > Set containing all the tip faces -tipNodes LvArray_SortedArray< int, int, LvArray_ChaiBuffer > Set containing all the nodes at the fracture tip -trailingFaces LvArray_SortedArray< int, int, LvArray_ChaiBuffer > Set containing all the trailing faces -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ============================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +failCriterion integer (no description available) +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +tipEdges LvArray_SortedArray Set containing all the tip edges +tipFaces LvArray_SortedArray Set containing all the tip faces +tipNodes LvArray_SortedArray Set containing all the nodes at the fracture tip +trailingFaces LvArray_SortedArray Set containing all the trailing faces +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/TableCapillaryPressure_other.rst b/src/coreComponents/schema/docs/TableCapillaryPressure_other.rst index d8e9f22248c..d4c775cae61 100644 --- a/src/coreComponents/schema/docs/TableCapillaryPressure_other.rst +++ b/src/coreComponents/schema/docs/TableCapillaryPressure_other.rst @@ -1,13 +1,13 @@ -=================================== ======================================================================================================= ============================================================================ -Name Type Description -=================================== ======================================================================================================= ============================================================================ -capPresWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction -phaseCapPressure real64_array3d Phase capillary pressure -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -=================================== ======================================================================================================= ============================================================================ +=================================== =================================================================================================== ============================================================================ +Name Type Description +=================================== =================================================================================================== ============================================================================ +capPresWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction +phaseCapPressure real64_array3d Phase capillary pressure +phaseOrder integer_array (no description available) +phaseTypes integer_array (no description available) +=================================== =================================================================================================== ============================================================================ diff --git a/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst b/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst index 1952771c2e9..f8e13266217 100644 --- a/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst +++ b/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst @@ -1,27 +1,27 @@ -================================ ======================================================================================================= =============================================================================== -Name Type Description -================================ ======================================================================================================= =============================================================================== -dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction -drainagePhaseMaxVolumeFraction real64_array (no description available) -drainagePhaseMinVolumeFraction real64_array (no description available) -drainagePhaseRelPermEndPoint real64_array (no description available) -drainageRelPermWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -imbibitionPhaseMaxVolumeFraction real64_array (no description available) -imbibitionPhaseMinVolumeFraction real64_array (no description available) -imbibitionPhaseRelPermEndPoint real64_array (no description available) -imbibitionRelPermWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -landParameter real64_array (no description available) -phaseHasHysteresis integer_array (no description available) -phaseMaxHistoricalVolFraction real64_array2d Phase max historical phase volume fraction -phaseMinHistoricalVolFraction real64_array2d Phase min historical phase volume fraction -phaseOrder integer_array (no description available) -phaseRelPerm real64_array3d Phase relative permeability -phaseRelPerm_n real64_array3d Phase relative permeability at previous time -phaseTrappedVolFraction real64_array3d Phase trapped volume fraction -phaseTypes integer_array (no description available) -waterOilMaxRelPerm real64 (no description available) -================================ ======================================================================================================= =============================================================================== +================================ =================================================================================================== =============================================================================== +Name Type Description +================================ =================================================================================================== =============================================================================== +dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction +drainagePhaseMaxVolumeFraction real64_array (no description available) +drainagePhaseMinVolumeFraction real64_array (no description available) +drainagePhaseRelPermEndPoint real64_array (no description available) +drainageRelPermWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +imbibitionPhaseMaxVolumeFraction real64_array (no description available) +imbibitionPhaseMinVolumeFraction real64_array (no description available) +imbibitionPhaseRelPermEndPoint real64_array (no description available) +imbibitionRelPermWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +landParameter real64_array (no description available) +phaseHasHysteresis integer_array (no description available) +phaseMaxHistoricalVolFraction real64_array2d Phase max historical phase volume fraction +phaseMinHistoricalVolFraction real64_array2d Phase min historical phase volume fraction +phaseOrder integer_array (no description available) +phaseRelPerm real64_array3d Phase relative permeability +phaseRelPerm_n real64_array3d Phase relative permeability at previous time +phaseTrappedVolFraction real64_array3d Phase trapped volume fraction +phaseTypes integer_array (no description available) +waterOilMaxRelPerm real64 (no description available) +================================ =================================================================================================== =============================================================================== diff --git a/src/coreComponents/schema/docs/TableRelativePermeability_other.rst b/src/coreComponents/schema/docs/TableRelativePermeability_other.rst index d71522f8a7a..4d6a2f00651 100644 --- a/src/coreComponents/schema/docs/TableRelativePermeability_other.rst +++ b/src/coreComponents/schema/docs/TableRelativePermeability_other.rst @@ -1,17 +1,17 @@ -=============================== ======================================================================================================= =============================================================================== -Name Type Description -=============================== ======================================================================================================= =============================================================================== -dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction -phaseMinVolumeFraction real64_array (no description available) -phaseOrder integer_array (no description available) -phaseRelPerm real64_array3d Phase relative permeability -phaseRelPerm_n real64_array3d Phase relative permeability at previous time -phaseTrappedVolFraction real64_array3d Phase trapped volume fraction -phaseTypes integer_array (no description available) -relPermWrappers LvArray_Array< geos_TableFunction_KernelWrapper, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer > (no description available) -waterOilMaxRelPerm real64 (no description available) -=============================== ======================================================================================================= =============================================================================== +=============================== =================================================================================================== =============================================================================== +Name Type Description +=============================== =================================================================================================== =============================================================================== +dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction +phaseMinVolumeFraction real64_array (no description available) +phaseOrder integer_array (no description available) +phaseRelPerm real64_array3d Phase relative permeability +phaseRelPerm_n real64_array3d Phase relative permeability at previous time +phaseTrappedVolFraction real64_array3d Phase trapped volume fraction +phaseTypes integer_array (no description available) +relPermWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) +waterOilMaxRelPerm real64 (no description available) +=============================== =================================================================================================== =============================================================================== diff --git a/src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst b/src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst index 9194c2431f9..a21d5757d0f 100644 --- a/src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst +++ b/src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst @@ -1,15 +1,15 @@ -======================== ========================================================================================================================================== ======================================== -Name Type Description -======================== ========================================================================================================================================== ======================================== -cellStencil geos_CellElementStencilTPFA (no description available) -coefficientName groupNameRef Name of coefficient field -edfmStencil geos_EmbeddedSurfaceToCellStencil (no description available) -faceElementToCellStencil geos_FaceElementToCellStencil (no description available) -fieldName groupNameRef_array Name of primary solution field -fractureStencil geos_SurfaceElementStencil (no description available) -targetRegions geos_mapBase< string, LvArray_Array< string, 1, camp_int_seq< long, 0l >, int, LvArray_ChaiBuffer >, std_integral_constant< bool, true > > List of regions to build the stencil for -======================== ========================================================================================================================================== ======================================== +======================== =================================================================================================================================== ======================================== +Name Type Description +======================== =================================================================================================================================== ======================================== +cellStencil geos_CellElementStencilTPFA (no description available) +coefficientName groupNameRef Name of coefficient field +edfmStencil geos_EmbeddedSurfaceToCellStencil (no description available) +faceElementToCellStencil geos_FaceElementToCellStencil (no description available) +fieldName groupNameRef_array Name of primary solution field +fractureStencil geos_SurfaceElementStencil (no description available) +targetRegions geos_mapBase, int, LvArray_ChaiBuffer>, std_integral_constant > List of regions to build the stencil for +======================== =================================================================================================================================== ======================================== diff --git a/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst b/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst index 3a4675201c0..eca5644ac14 100644 --- a/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst +++ b/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst @@ -1,29 +1,29 @@ -========================== ========================================================================================================== ========================================================= -Name Type Description -========================== ========================================================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -elementCenter real64_array2d (no description available) -elementVolume real64_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -nextWellElementIndex integer_array (no description available) -nextWellElementIndexGlobal integer_array (no description available) -nodeList geos_InterObjectRelation< LvArray_Array< int, 2, camp_int_seq< long, 0l, 1l >, int, LvArray_ChaiBuffer > > (no description available) -numEdgesPerElement integer (no description available) -numFacesPerElement integer (no description available) -numNodesPerElement integer (no description available) -radius real64_array (no description available) -topRank integer (no description available) -topWellElementIndex integer (no description available) -wellControlsName groupNameRef (no description available) -ConstitutiveModels node :ref:`DATASTRUCTURE_ConstitutiveModels` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -wellElementSubRegion node :ref:`DATASTRUCTURE_wellElementSubRegion` -========================== ========================================================================================================== ========================================================= +========================== ===================================================================================================== ========================================================= +Name Type Description +========================== ===================================================================================================== ========================================================= +domainBoundaryIndicator integer_array (no description available) +elementCenter real64_array2d (no description available) +elementVolume real64_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +nextWellElementIndex integer_array (no description available) +nextWellElementIndexGlobal integer_array (no description available) +nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) +numEdgesPerElement integer (no description available) +numFacesPerElement integer (no description available) +numNodesPerElement integer (no description available) +radius real64_array (no description available) +topRank integer (no description available) +topWellElementIndex integer (no description available) +wellControlsName groupNameRef (no description available) +ConstitutiveModels node :ref:`DATASTRUCTURE_ConstitutiveModels` +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +wellElementSubRegion node :ref:`DATASTRUCTURE_wellElementSubRegion` +========================== ===================================================================================================== ========================================================= diff --git a/src/coreComponents/schema/docs/WellElementRegion_other.rst b/src/coreComponents/schema/docs/WellElementRegion_other.rst index 7235a663f6d..bb655ec67d1 100644 --- a/src/coreComponents/schema/docs/WellElementRegion_other.rst +++ b/src/coreComponents/schema/docs/WellElementRegion_other.rst @@ -1,18 +1,18 @@ -======================= ==================================================================== ========================================================= -Name Type Description -======================= ==================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -wellControlsName groupNameRef (no description available) -wellGeneratorName groupNameRef (no description available) -elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ==================================================================== ========================================================= +======================= ================================================================= ========================================================= +Name Type Description +======================= ================================================================= ========================================================= +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +wellControlsName groupNameRef (no description available) +wellGeneratorName groupNameRef (no description available) +elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ================================================================= ========================================================= diff --git a/src/coreComponents/schema/docs/domain_other.rst b/src/coreComponents/schema/docs/domain_other.rst index 18e678dae42..4cbdf6ffbda 100644 --- a/src/coreComponents/schema/docs/domain_other.rst +++ b/src/coreComponents/schema/docs/domain_other.rst @@ -1,12 +1,12 @@ -================ =================================================================================== ================================= -Name Type Description -================ =================================================================================== ================================= -Neighbors std_vector< geos_NeighborCommunicator, std_allocator< geos_NeighborCommunicator > > (no description available) -partitionManager geos_PartitionBase (no description available) -Constitutive node :ref:`DATASTRUCTURE_Constitutive` -MeshBodies node :ref:`DATASTRUCTURE_MeshBodies` -================ =================================================================================== ================================= +================ ================================================================================ ================================= +Name Type Description +================ ================================================================================ ================================= +Neighbors std_vector > (no description available) +partitionManager geos_PartitionBase (no description available) +Constitutive node :ref:`DATASTRUCTURE_Constitutive` +MeshBodies node :ref:`DATASTRUCTURE_MeshBodies` +================ ================================================================================ ================================= diff --git a/src/coreComponents/schema/docs/edgeManager_other.rst b/src/coreComponents/schema/docs/edgeManager_other.rst index 597da5bf9b8..0d02ec6d8c8 100644 --- a/src/coreComponents/schema/docs/edgeManager_other.rst +++ b/src/coreComponents/schema/docs/edgeManager_other.rst @@ -1,17 +1,17 @@ -======================= ========================================================================================================== ========================================================= -Name Type Description -======================= ========================================================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -faceList geos_InterObjectRelation< LvArray_ArrayOfSets< int, int, LvArray_ChaiBuffer > > (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -nodeList geos_InterObjectRelation< LvArray_Array< int, 2, camp_int_seq< long, 0l, 1l >, int, LvArray_ChaiBuffer > > (no description available) -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ========================================================================================================== ========================================================= +======================= ===================================================================================================== ========================================================= +Name Type Description +======================= ===================================================================================================== ========================================================= +domainBoundaryIndicator integer_array (no description available) +faceList geos_InterObjectRelation > (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ===================================================================================================== ========================================================= diff --git a/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst b/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst index 597da5bf9b8..0d02ec6d8c8 100644 --- a/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst +++ b/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst @@ -1,17 +1,17 @@ -======================= ========================================================================================================== ========================================================= -Name Type Description -======================= ========================================================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -faceList geos_InterObjectRelation< LvArray_ArrayOfSets< int, int, LvArray_ChaiBuffer > > (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -nodeList geos_InterObjectRelation< LvArray_Array< int, 2, camp_int_seq< long, 0l, 1l >, int, LvArray_ChaiBuffer > > (no description available) -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ========================================================================================================== ========================================================= +======================= ===================================================================================================== ========================================================= +Name Type Description +======================= ===================================================================================================== ========================================================= +domainBoundaryIndicator integer_array (no description available) +faceList geos_InterObjectRelation > (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ===================================================================================================== ========================================================= diff --git a/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst b/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst index 7c14a19c09a..3a3c4f725f8 100644 --- a/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst +++ b/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst @@ -1,22 +1,22 @@ -======================= =============================================================================== ============================================= ================================================================ -Name Type Registered By Description -======================= =============================================================================== ============================================= ================================================================ -domainBoundaryIndicator integer_array (no description available) -edgeList geos_InterObjectRelation< LvArray_ArrayOfSets< int, int, LvArray_ChaiBuffer > > (no description available) -elemList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -elemRegionList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -elemSubRegionList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -parentEdgeGlobalIndex globalIndex_array (no description available) -referencePosition real64_array2d (no description available) -parentEdgeIndex integer_array :ref:`DATASTRUCTURE_EmbeddedSurfaceGenerator` Index of parent edge within the mesh object it is registered on. -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= =============================================================================== ============================================= ================================================================ +======================= ============================================================================ ============================================= ================================================================ +Name Type Registered By Description +======================= ============================================================================ ============================================= ================================================================ +domainBoundaryIndicator integer_array (no description available) +edgeList geos_InterObjectRelation > (no description available) +elemList LvArray_ArrayOfArrays (no description available) +elemRegionList LvArray_ArrayOfArrays (no description available) +elemSubRegionList LvArray_ArrayOfArrays (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +parentEdgeGlobalIndex globalIndex_array (no description available) +referencePosition real64_array2d (no description available) +parentEdgeIndex integer_array :ref:`DATASTRUCTURE_EmbeddedSurfaceGenerator` Index of parent edge within the mesh object it is registered on. +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ============================================================================ ============================================= ================================================================ diff --git a/src/coreComponents/schema/docs/faceManager_other.rst b/src/coreComponents/schema/docs/faceManager_other.rst index f821f295cfd..7f1730f0304 100644 --- a/src/coreComponents/schema/docs/faceManager_other.rst +++ b/src/coreComponents/schema/docs/faceManager_other.rst @@ -1,25 +1,25 @@ -======================= ================================================================================= ================================================================================================ ========================================================= -Name Type Registered By Description -======================= ================================================================================= ================================================================================================ ========================================================= -domainBoundaryIndicator integer_array (no description available) -edgeList geos_InterObjectRelation< LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > > (no description available) -elemList integer_array2d (no description available) -elemRegionList integer_array2d (no description available) -elemSubRegionList integer_array2d (no description available) -faceArea real64_array (no description available) -faceCenter real64_array2d (no description available) -faceNormal real64_array2d (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -nodeList geos_InterObjectRelation< LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > > (no description available) -facePressure_n real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM`, :ref:`DATASTRUCTURE_SinglePhaseHybridFVM` Face pressure at the previous converged time step -mimGravityCoefficient real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM` Mimetic gravity coefficient -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ================================================================================= ================================================================================================ ========================================================= +======================= ============================================================================== ================================================================================================ ========================================================= +Name Type Registered By Description +======================= ============================================================================== ================================================================================================ ========================================================= +domainBoundaryIndicator integer_array (no description available) +edgeList geos_InterObjectRelation > (no description available) +elemList integer_array2d (no description available) +elemRegionList integer_array2d (no description available) +elemSubRegionList integer_array2d (no description available) +faceArea real64_array (no description available) +faceCenter real64_array2d (no description available) +faceNormal real64_array2d (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +nodeList geos_InterObjectRelation > (no description available) +facePressure_n real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM`, :ref:`DATASTRUCTURE_SinglePhaseHybridFVM` Face pressure at the previous converged time step +mimGravityCoefficient real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM` Mimetic gravity coefficient +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ============================================================================== ================================================================================================ ========================================================= diff --git a/src/coreComponents/schema/docs/nodeManager_other.rst b/src/coreComponents/schema/docs/nodeManager_other.rst index e4fa1245fee..cde3077884e 100644 --- a/src/coreComponents/schema/docs/nodeManager_other.rst +++ b/src/coreComponents/schema/docs/nodeManager_other.rst @@ -1,22 +1,22 @@ -======================= =============================================================================== ========================================================= -Name Type Description -======================= =============================================================================== ========================================================= -ReferencePosition real64_array2d (no description available) -domainBoundaryIndicator integer_array (no description available) -edgeList geos_InterObjectRelation< LvArray_ArrayOfSets< int, int, LvArray_ChaiBuffer > > (no description available) -elemList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -elemRegionList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -elemSubRegionList LvArray_ArrayOfArrays< int, int, LvArray_ChaiBuffer > (no description available) -faceList geos_InterObjectRelation< LvArray_ArrayOfSets< int, int, LvArray_ChaiBuffer > > (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -primaryField real64_array Primary field variable -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= =============================================================================== ========================================================= +======================= ============================================================================ ========================================================= +Name Type Description +======================= ============================================================================ ========================================================= +ReferencePosition real64_array2d (no description available) +domainBoundaryIndicator integer_array (no description available) +edgeList geos_InterObjectRelation > (no description available) +elemList LvArray_ArrayOfArrays (no description available) +elemRegionList LvArray_ArrayOfArrays (no description available) +elemSubRegionList LvArray_ArrayOfArrays (no description available) +faceList geos_InterObjectRelation > (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +primaryField real64_array Primary field variable +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +======================= ============================================================================ ========================================================= diff --git a/src/coreComponents/schema/docs/sets_other.rst b/src/coreComponents/schema/docs/sets_other.rst index 07baf6428bc..59e718c41f8 100644 --- a/src/coreComponents/schema/docs/sets_other.rst +++ b/src/coreComponents/schema/docs/sets_other.rst @@ -1,9 +1,9 @@ -=========== =================================================== ========================== -Name Type Description -=========== =================================================== ========================== -externalSet LvArray_SortedArray< int, int, LvArray_ChaiBuffer > (no description available) -=========== =================================================== ========================== +=========== ================================================= ========================== +Name Type Description +=========== ================================================= ========================== +externalSet LvArray_SortedArray (no description available) +=========== ================================================= ========================== diff --git a/src/coreComponents/schema/docs/wellElementSubRegion_other.rst b/src/coreComponents/schema/docs/wellElementSubRegion_other.rst index 13799ea3e78..6ceeee5546c 100644 --- a/src/coreComponents/schema/docs/wellElementSubRegion_other.rst +++ b/src/coreComponents/schema/docs/wellElementSubRegion_other.rst @@ -1,23 +1,23 @@ -========================= ==================================================================== ====================================================================== -Name Type Description -========================= ==================================================================== ====================================================================== -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase< long long, int, std_integral_constant< bool, false > > (no description available) -isExternal integer_array (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -location real64_array2d For each perforation, physical location (x,y,z coordinates) -numPerforationsGlobal globalIndex (no description available) -reservoirElementIndex integer_array For each perforation, element index of the perforated element -reservoirElementRegion integer_array For each perforation, elementRegion index of the perforated element -reservoirElementSubregion integer_array For each perforation, elementSubRegion index of the perforated element -wellElementIndex integer_array For each perforation, index of the well element -wellSkinFactor real64_array For each perforation, well skin factor -wellTransmissibility real64_array For each perforation, well transmissibility -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -========================= ==================================================================== ====================================================================== +========================= ================================================================= ====================================================================== +Name Type Description +========================= ================================================================= ====================================================================== +domainBoundaryIndicator integer_array (no description available) +ghostRank integer_array (no description available) +globalToLocalMap geos_mapBase > (no description available) +isExternal integer_array (no description available) +localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +location real64_array2d For each perforation, physical location (x,y,z coordinates) +numPerforationsGlobal globalIndex (no description available) +reservoirElementIndex integer_array For each perforation, element index of the perforated element +reservoirElementRegion integer_array For each perforation, elementRegion index of the perforated element +reservoirElementSubregion integer_array For each perforation, elementSubRegion index of the perforated element +wellElementIndex integer_array For each perforation, index of the well element +wellSkinFactor real64_array For each perforation, well skin factor +wellTransmissibility real64_array For each perforation, well transmissibility +neighborData node :ref:`DATASTRUCTURE_neighborData` +sets node :ref:`DATASTRUCTURE_sets` +========================= ================================================================= ====================================================================== diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 1f6363b218c..965cf0f3546 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -2802,6 +2802,8 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + @@ -2813,6 +2815,11 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index c4c0af4cf3e..a9095627224 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -471,7 +471,7 @@ - + @@ -550,7 +550,7 @@ - + @@ -587,7 +587,7 @@ - + @@ -638,7 +638,7 @@ - + @@ -679,7 +679,7 @@ - + @@ -712,7 +712,7 @@ - + @@ -723,7 +723,7 @@ - + @@ -736,7 +736,7 @@ - + @@ -749,7 +749,7 @@ - + @@ -765,7 +765,7 @@ - + @@ -799,7 +799,7 @@ - + @@ -862,7 +862,7 @@ - + @@ -893,7 +893,7 @@ - + @@ -906,7 +906,7 @@ - + @@ -919,7 +919,7 @@ - + @@ -932,7 +932,7 @@ - + @@ -945,7 +945,7 @@ - + @@ -960,7 +960,7 @@ - + @@ -971,7 +971,7 @@ - + @@ -984,7 +984,7 @@ - + @@ -995,7 +995,7 @@ - + @@ -1006,7 +1006,7 @@ - + @@ -1017,7 +1017,7 @@ - + @@ -1028,7 +1028,7 @@ - + @@ -1041,7 +1041,7 @@ - + @@ -1056,7 +1056,7 @@ - + @@ -1071,7 +1071,7 @@ - + @@ -1086,7 +1086,7 @@ - + @@ -1097,7 +1097,7 @@ - + @@ -1110,7 +1110,7 @@ - + @@ -1123,7 +1123,7 @@ - + @@ -1139,7 +1139,7 @@ - + @@ -1154,7 +1154,7 @@ - + @@ -1171,7 +1171,7 @@ - + @@ -1186,7 +1186,7 @@ - + @@ -1199,7 +1199,7 @@ - + @@ -1238,7 +1238,7 @@ - + @@ -1267,15 +1267,15 @@ - + - + - + - + - + @@ -1339,7 +1339,7 @@ - + @@ -1459,7 +1459,7 @@ - + @@ -1475,7 +1475,7 @@ - + @@ -1511,7 +1511,7 @@ - + @@ -1575,7 +1575,7 @@ - + @@ -1621,7 +1621,7 @@ - + @@ -1667,7 +1667,7 @@ - + @@ -1713,7 +1713,7 @@ - + @@ -1787,7 +1787,7 @@ - + @@ -1833,7 +1833,7 @@ - + @@ -1879,7 +1879,7 @@ - + @@ -2039,7 +2039,7 @@ - + @@ -2055,7 +2055,7 @@ - + @@ -2091,7 +2091,7 @@ - + @@ -2268,7 +2268,7 @@ - + @@ -2479,7 +2479,7 @@ - + @@ -2533,7 +2533,7 @@ - + @@ -2607,7 +2607,7 @@ - + @@ -2633,7 +2633,7 @@ - + @@ -2647,7 +2647,7 @@ - + @@ -2655,7 +2655,7 @@ - + @@ -2879,7 +2879,7 @@ - + @@ -2889,7 +2889,7 @@ - + @@ -2903,7 +2903,7 @@ - + @@ -2918,17 +2918,17 @@ - + - + - + @@ -2938,17 +2938,17 @@ - + - + - + @@ -2958,17 +2958,17 @@ - + - + - + - + - + @@ -2988,7 +2988,7 @@ - + @@ -3006,7 +3006,7 @@ - + @@ -3014,7 +3014,7 @@ - + @@ -3026,19 +3026,19 @@ - + - + - + - + - + - + @@ -3057,7 +3057,7 @@ - + @@ -3079,7 +3079,7 @@ - + @@ -3096,7 +3096,7 @@ - + @@ -3122,7 +3122,7 @@ - + @@ -3132,7 +3132,7 @@ - + @@ -3159,7 +3159,7 @@ - + @@ -3192,7 +3192,7 @@ - + diff --git a/src/coreComponents/schema/schemaUtilities.cpp b/src/coreComponents/schema/schemaUtilities.cpp index 93eb8ce0f7e..4bf19a4541d 100644 --- a/src/coreComponents/schema/schemaUtilities.cpp +++ b/src/coreComponents/schema/schemaUtilities.cpp @@ -76,9 +76,15 @@ string getSchemaTypeName( string_view rtTypeName ) // Note: Some type names involving strings can vary on compiler and be ugly. Convert these to "string" auto constexpr typeMergingRegex = "std_(__cxx11_basic_)?string(<\\s*char,\\s*std_char_traits,\\s*std_allocator\\s*>)?"; - string const xmlSafeName = std::regex_replace( sanitizedName, - std::regex( typeMergingRegex ), - "string" ); + string xmlSafeName = std::regex_replace( sanitizedName, + std::regex( typeMergingRegex ), + "string" ); + + // Replace '<', '>', spaces and ',' because the schema does not like them + xmlSafeName = std::regex_replace( xmlSafeName, std::regex( "<" ), "_lt_" ); + xmlSafeName = std::regex_replace( xmlSafeName, std::regex( ">" ), "_gt_" ); + xmlSafeName = std::regex_replace( xmlSafeName, std::regex( "," ), "_cm_" ); + xmlSafeName = std::regex_replace( xmlSafeName, std::regex( " " ), "-" ); return xmlSafeName; } From 4148bbc5d19e1efbe1643671126d300ffee3009e Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 20 Mar 2024 13:18:39 -0500 Subject: [PATCH 022/286] Small fix in SinglePhasePoromechanicsConformingFractures MGR strategy (#3047) --- ...nglePhasePoromechanicsConformingFractures.hpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp index 0dfb0b0ec88..65341d2ba90 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp @@ -38,15 +38,15 @@ namespace mgr * dofLabel: 0 = displacement, x-component * dofLabel: 1 = displacement, y-component * dofLabel: 2 = displacement, z-component - * dofLabel: 3 = pressure (cell elem + fracture elems) - * dofLabel: 4 = face-centered lagrange multiplier (tn) - * dofLabel: 5 = face-centered lagrange multiplier (tt1) - * dofLabel: 6 = face-centered lagrange multiplier (tt2) + * dofLabel: 3 = face-centered lagrange multiplier (tn) + * dofLabel: 4 = face-centered lagrange multiplier (tt1) + * dofLabel: 5 = face-centered lagrange multiplier (tt2) + * dofLabel: 6 = pressure (cell elem + fracture elems) * * Ingredients: - * 1. Level 1: F-points displacement (4,5,6), C-points pressure (0,1,2,3) - * 2. Level 2: F-points displacement (0,1,2), C-points pressure (3) + * 1. Level 1: F-points displacement (3,4,5), C-points pressure (0,1,2,6) + * 2. Level 2: F-points displacement (0,1,2), C-points pressure (6) * 2. F-points smoother: BoomerAMG, single V-cycle * 3. C-points coarse-grid/Schur complement solver: BoomerAMG * 4. Global smoother: none @@ -66,9 +66,9 @@ class SinglePhasePoromechanicsConformingFractures : public MGRStrategyBase< 2 > m_labels[0].push_back( 0 ); m_labels[0].push_back( 1 ); m_labels[0].push_back( 2 ); - m_labels[0].push_back( 3 ); + m_labels[0].push_back( 6 ); // we keep p - m_labels[1].push_back( 3 ); + m_labels[1].push_back( 6 ); setupLabels(); From cb20b88c5e2d9afcf0b727bd8abb70f2c5366772 Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:28:20 -0500 Subject: [PATCH 023/286] Fix solubility message (#3048) --- .../CO2Brine/functions/CO2Solubility.cpp | 24 ++++++++++++------- .../CompositionalMultiphaseWellKernels.cpp | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp index f43009e5204..4f2a140f99d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp @@ -92,6 +92,17 @@ makeSolubilityTables( string const & functionName, return { tables[0], tables[1] }; } + // If the tables have already been created, then simply retrieve them + string const co2TableName = functionName + "_co2Dissolution_table"; + string const h2oTableName = functionName + "_waterVaporization_table"; + + if( functionManager.hasGroup< TableFunction >( co2TableName ) && functionManager.hasGroup< TableFunction >( h2oTableName )) + { + TableFunction const * co2SolubilityTable = functionManager.getGroupPointer< TableFunction >( co2TableName ); + TableFunction const * h2oSolubilityTable = functionManager.getGroupPointer< TableFunction >( h2oTableName ); + return {co2SolubilityTable, h2oSolubilityTable}; + } + // Initialize the (p,T) coordinates constitutive::PVTProps::PVTFunctionHelpers::initializePropertyTable( inputParams, tableCoords ); @@ -178,24 +189,21 @@ makeSolubilityTables( string const & functionName, << std::setw( 15 ) << "Pressure (Pa)" << " " << std::setw( 15 ) << "Temperature (C)" << " " << std::setw( 23 ) << "CO2 solubility (mol/kg)" << " " - << std::setw( 15 ) << "H2O solubility (mol/kg)" << " " - << "\n"; + << std::setw( 23 ) << "H2O solubility (mol/kg)" << " "; for( integer row = 0; row < LvArray::math::min( maxBad, badCount ); ++row ) { badValueTable + << "\n" << std::setw( 15 ) << badValues( row, 0 ) << " " << std::setw( 15 ) << badValues( row, 1 ) << " " << std::setw( 23 ) << badValues( row, 2 ) << " " - << std::setw( 15 ) << badValues( row, 3 ) << " " - << "\n"; + << std::setw( 23 ) << badValues( row, 3 ) << " "; } - GEOS_LOG_RANK_0( GEOS_FMT( "CO2Solubility: {} negative solubility values encountered. These will be truncated to zero.\n Check out report table {} with max {} values", - badCount, badValueTable.str(), maxBad ) ); + GEOS_LOG_RANK_0( GEOS_FMT( "CO2Solubility: {} negative solubility values encountered. These will be truncated to zero.\nCheck out report table with max {} values.\n{}", + badCount, maxBad, badValueTable.str() ) ); } - string const co2TableName = functionName + "_co2Dissolution_table"; TableFunction const * co2SolubilityTable = makeTable( co2TableName, tableCoords, std::move( co2Solubility ), functionManager ); - string const h2oTableName = functionName + "_waterVaporization_table"; TableFunction const * h2oSolubilityTable = makeTable( h2oTableName, tableCoords, std::move( h2oSolubility ), functionManager ); return {co2SolubilityTable, h2oSolubilityTable}; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp index 70a8e51721d..74cafe77cc4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp @@ -1690,7 +1690,7 @@ PresTempCompFracInitializationKernel:: { foundNegativeTemp.max( 1 ); } - if( !isZero( sumCompFracForCheck - 1.0 ) ) + if( !isZero( sumCompFracForCheck - 1.0, constitutive::MultiFluidConstants::minForSpeciesPresence ) ) { foundInconsistentCompFrac.max( 1 ); } From 9108c3abfdf8aa617f8859980abdac2d1ef74944 Mon Sep 17 00:00:00 2001 From: acitrain <60715545+acitrain@users.noreply.github.com> Date: Thu, 28 Mar 2024 19:19:13 +0100 Subject: [PATCH 024/286] Refactor wave solvers: separation of time and space update inside wave solvers (#2989) * Move fields for second solver into WaveSolverBaseFields * Split huge namespace inside WaveSolverBaseFields into several files with one namespace for each physics * Modify CMakeList * Move acousto-elastic coupling arrays into one specific file + do some cleanup * Remove unused include inside unit test * Move Leap-Frog loop from acoustic second order solver to specific time-scheme file * Extract time scheme from VTI file * Move time update for second order elastic solver into e dedicated file * Put time scheme for acousto-elastic also into a separate file * Remove commented code * Add comments + little change in time scheme for acoustic VTI * uncrustify + remove unused variable * Add Q2 unit test --- .../physicsSolvers/CMakeLists.txt | 3 + .../AcousticElasticWaveEquationSEM.cpp | 20 +- .../AcousticTimeSchemeSEMKernel.hpp | 168 ++++++++++++ .../AcousticVTIWaveEquationSEM.cpp | 50 +--- .../AcousticWaveEquationSEM.cpp | 15 +- .../AcoustoElasticTimeSchemeSEMKernel.hpp | 80 ++++++ .../ElasticTimeSchemeSEMKernel.hpp | 107 ++++++++ .../ElasticWaveEquationSEM.cpp | 28 +- .../wavePropagationTests/CMakeLists.txt | 1 + .../testWavePropagationQ2.cpp | 242 ++++++++++++++++++ 10 files changed, 617 insertions(+), 97 deletions(-) create mode 100644 src/coreComponents/physicsSolvers/wavePropagation/AcousticTimeSchemeSEMKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/wavePropagation/AcoustoElasticTimeSchemeSEMKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/wavePropagation/ElasticTimeSchemeSEMKernel.hpp create mode 100644 src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index c7d26a6bfd3..5d64a88b399 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -133,9 +133,11 @@ set( physicsSolvers_headers wavePropagation/AcousticFields.hpp wavePropagation/AcousticWaveEquationSEM.hpp wavePropagation/AcousticWaveEquationSEMKernel.hpp + wavePropagation/AcousticTimeSchemeSEMKernel.hpp wavePropagation/ElasticFields.hpp wavePropagation/ElasticWaveEquationSEM.hpp wavePropagation/ElasticWaveEquationSEMKernel.hpp + wavePropagation/ElasticTimeSchemeSEMKernel.hpp wavePropagation/ElasticFirstOrderWaveEquationSEM.hpp wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp @@ -144,6 +146,7 @@ set( physicsSolvers_headers wavePropagation/AcousticVTIWaveEquationSEM.hpp wavePropagation/AcousticVTIWaveEquationSEMKernel.hpp wavePropagation/AcoustoElasticFields.hpp + wavePropagation/AcoustoElasticTimeSchemeSEMKernel.hpp wavePropagation/AcousticElasticWaveEquationSEM.hpp wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp ) diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp index 590cfd0f084..0ba29d65cd3 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp @@ -18,6 +18,7 @@ #include "AcousticElasticWaveEquationSEM.hpp" #include "AcousticElasticWaveEquationSEMKernel.hpp" +#include "AcoustoElasticTimeSchemeSEMKernel.hpp" #include "dataRepository/Group.hpp" #include #include @@ -159,25 +160,10 @@ real64 AcousticElasticWaveEquationSEM::solverStep( real64 const & time_n, arrayView1d< real32 > const uy_np1 = nodeManager.getField< elasticfields::Displacementy_np1 >(); arrayView1d< real32 > const uz_np1 = nodeManager.getField< elasticfields::Displacementz_np1 >(); - real32 const dt2 = pow( dt, 2 ); - elasSolver->computeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_elasRegions ); - forAll< EXEC_POLICY >( interfaceNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) - { - localIndex const a = interfaceNodesSet[n]; - if( elasticFSNodeIndicator[a] == 1 ) - return; - - real32 const aux = -p_n[a] / elasticMass[a]; - real32 const localIncrementx = dt2 * atoex[a] * aux; - real32 const localIncrementy = dt2 * atoey[a] * aux; - real32 const localIncrementz = dt2 * atoez[a] * aux; - - RAJA::atomicAdd< ATOMIC_POLICY >( &ux_np1[a], localIncrementx ); - RAJA::atomicAdd< ATOMIC_POLICY >( &uy_np1[a], localIncrementy ); - RAJA::atomicAdd< ATOMIC_POLICY >( &uz_np1[a], localIncrementz ); - } ); + AcoustoElasticTimeSchemeSEM::LeapFrog( dt, ux_np1, uy_np1, uz_np1, p_n, elasticMass, atoex, atoey, atoez, + elasticFSNodeIndicator, interfaceNodesSet ); elasSolver->synchronizeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_elasRegions ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticTimeSchemeSEMKernel.hpp new file mode 100644 index 00000000000..d656fbaa803 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticTimeSchemeSEMKernel.hpp @@ -0,0 +1,168 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file AcousticTimeSchemeSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICTIMESCHEMESEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICTIMESCHEMESEMKERNEL_HPP_ + +namespace geos +{ + +struct AcousticTimeSchemeSEM +{ + + using EXEC_POLICY = parallelDevicePolicy< >; + + + /** + * @brief Apply second order Leap-Frog time scheme for isotropic case without PML + * @param[in] dt time-step + * @param[out] p_np1 pressure array at time n+1 (updated here) + * @param[in] p_n pressure array at time n + * @param[in] p_nm1 pressure array at time n-1 + * @param[in] mass the mass matrix + * @param[in] stiffnessVector array containing the product of the stiffness matrix R and the pressure at time n + * @param[in] damping the damping matrix + * @param[in] rhs the right-hand-side + * @param[in] freeSurfaceNodeIndicator array which contains indicators to tell if we are on a free-surface boundary or not + * @param[in] solverTargetNodesSet the targetted nodeset (useful in particular when we do elasto-acoustic simulation ) + */ + static void LeapFrogWithoutPML( real64 const dt, + arrayView1d< real32 > const p_np1, + arrayView1d< real32 > const p_n, + arrayView1d< real32 > const p_nm1, + arrayView1d< real32 const > const mass, + arrayView1d< real32 > const stiffnessVector, + arrayView1d< real32 const > const damping, + arrayView1d< real32 > const rhs, + arrayView1d< localIndex const > const freeSurfaceNodeIndicator, + SortedArrayView< localIndex const > const solverTargetNodesSet ) + { + real64 const dt2 = pow( dt, 2 ); + forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + { + localIndex const a = solverTargetNodesSet[n]; + if( freeSurfaceNodeIndicator[a] != 1 ) + { + p_np1[a] = p_n[a]; + p_np1[a] *= 2.0 * mass[a]; + p_np1[a] -= (mass[a] - 0.5 * dt * damping[a]) * p_nm1[a]; + p_np1[a] += dt2 * (rhs[a] - stiffnessVector[a]); + p_np1[a] /= mass[a] + 0.5 * dt * damping[a]; + } + } ); + + }; + + /** + * @brief Apply second order Leap-Frog time scheme for VTI case without PML + * @param[in] size The number of nodes in the nodeManager + * @param[in] dt time-step + * @param[out] p_np1 pressure array at time n+1 (updated here) + * @param[in] p_n pressure array at time n + * @param[in] p_nm1 pressure array at time n-1 + * @param[out] q_np1 auxiliary pressure array at time n+1 (updated here) + * @param[in] q_n auxiliary pressure array at time n + * @param[in] q_nm1 auxiliary pressure array at time n-1 + * @param[in] mass the mass matrix + * @param[in] stiffnessVector_p array containing the product of the stiffness matrix R and the pressure at time n + * @param[in] stiffnessVector_q array containing the product of the stiffness matrix R and the auxiliary pressure at time n + * @param[in] damping_p the damping matrix + * @param[in] damping_pq the damping matrix + * @param[in] damping_q the damping matrix + * @param[in] damping_qp the damping matrix + * @param[in] rhs the right-hand-side + * @param[in] freeSurfaceNodeIndicator array which contains indicators to tell if we are on a free-surface boundary or not + * @param[in] lateralSurfaceNodeIndicator array which contains indicators to tell if we are on a lateral boundary or not + * @param[in] bottomSurfaceNodeIndicator array which contains indicators to telle if we are on the bottom boundary or not + */ + static void LeapFrogforVTI( localIndex const size, + real64 const dt, + arrayView1d< real32 > const p_np1, + arrayView1d< real32 > const p_n, + arrayView1d< real32 > const p_nm1, + arrayView1d< real32 > const q_np1, + arrayView1d< real32 > const q_n, + arrayView1d< real32 > const q_nm1, + arrayView1d< real32 const > const mass, + arrayView1d< real32 > const stiffnessVector_p, + arrayView1d< real32 > const stiffnessVector_q, + arrayView1d< real32 const > const damping_p, + arrayView1d< real32 const > const damping_pq, + arrayView1d< real32 const > const damping_q, + arrayView1d< real32 const > const damping_qp, + arrayView1d< real32 > const rhs, + arrayView1d< localIndex const > const freeSurfaceNodeIndicator, + arrayView1d< localIndex const > const lateralSurfaceNodeIndicator, + arrayView1d< localIndex const > const bottomSurfaceNodeIndicator ) + + { + real64 const dt2 = pow( dt, 2 ); + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + if( freeSurfaceNodeIndicator[a] != 1 ) + { + p_np1[a] = 2.0*mass[a]*p_n[a]/dt2; + p_np1[a] -= mass[a]*p_nm1[a]/dt2; + p_np1[a] += stiffnessVector_p[a]; + p_np1[a] += rhs[a]; + + q_np1[a] = 2.0*mass[a]*q_n[a]/dt2; + q_np1[a] -= mass[a]*q_nm1[a]/dt2; + q_np1[a] += stiffnessVector_q[a]; + q_np1[a] += rhs[a]; + + if( lateralSurfaceNodeIndicator[a] != 1 && bottomSurfaceNodeIndicator[a] != 1 ) + { + // Interior node, no boundary terms + p_np1[a] /= mass[a]/dt2; + q_np1[a] /= mass[a]/dt2; + } + else + { + // Boundary node + p_np1[a] += damping_p[a]*p_nm1[a]/dt/2; + p_np1[a] += damping_pq[a]*q_nm1[a]/dt/2; + + q_np1[a] += damping_q[a]*q_nm1[a]/dt/2; + q_np1[a] += damping_qp[a]*p_nm1[a]/dt/2; + // Hand-made Inversion of 2x2 matrix + real32 coef_pp = mass[a]/dt2; + coef_pp += damping_p[a]/dt/2; + real32 coef_pq = damping_pq[a]/dt/2; + + real32 coef_qq = mass[a]/dt2; + coef_qq += damping_q[a]/2/dt; + real32 coef_qp = damping_qp[a]/dt/2; + + real32 det_pq = 1/(coef_pp * coef_qq - coef_pq*coef_qp); + + real32 aux_p_np1 = p_np1[a]; + p_np1[a] = det_pq*(coef_qq*p_np1[a] - coef_pq*q_np1[a]); + q_np1[a] = det_pq*(coef_pp*q_np1[a] - coef_qp*aux_p_np1); + } + } + } ); + }; + + + +}; + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICTIMESCHEMESEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp index 967327730a6..178ecfdac47 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp @@ -27,6 +27,7 @@ #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "WaveSolverUtils.hpp" +#include "AcousticTimeSchemeSEMKernel.hpp" namespace geos { @@ -586,54 +587,13 @@ real64 AcousticVTIWaveEquationSEM::explicitStepInternal( real64 const & time_n, addSourceToRightHandSide( cycleNumber, rhs ); /// calculate your time integrators - real64 const dt2 = dt*dt; GEOS_MARK_SCOPE ( updateP ); - forAll< EXEC_POLICY >( nodeManager.size(), [=] GEOS_HOST_DEVICE ( localIndex const a ) - { - if( freeSurfaceNodeIndicator[a] != 1 ) - { - p_np1[a] = 2.0*mass[a]*p_n[a]/dt2; - p_np1[a] -= mass[a]*p_nm1[a]/dt2; - p_np1[a] += stiffnessVector_p[a]; - p_np1[a] += rhs[a]; - q_np1[a] = 2.0*mass[a]*q_n[a]/dt2; - q_np1[a] -= mass[a]*q_nm1[a]/dt2; - q_np1[a] += stiffnessVector_q[a]; - q_np1[a] += rhs[a]; - - if( lateralSurfaceNodeIndicator[a] != 1 && bottomSurfaceNodeIndicator[a] != 1 ) - { - // Interior node, no boundary terms - p_np1[a] /= mass[a]/dt2; - q_np1[a] /= mass[a]/dt2; - } - else - { - // Boundary node - p_np1[a] += damping_p[a]*p_nm1[a]/dt/2; - p_np1[a] += damping_pq[a]*q_nm1[a]/dt/2; - - q_np1[a] += damping_q[a]*q_nm1[a]/dt/2; - q_np1[a] += damping_qp[a]*p_nm1[a]/dt/2; - // Hand-made Inversion of 2x2 matrix - real32 coef_pp = mass[a]/dt2; - coef_pp += damping_p[a]/dt/2; - real32 coef_pq = damping_pq[a]/dt/2; - - real32 coef_qq = mass[a]/dt2; - coef_qq += damping_q[a]/2/dt; - real32 coef_qp = damping_qp[a]/dt/2; - - real32 det_pq = 1/(coef_pp * coef_qq - coef_pq*coef_qp); - - real32 aux_p_np1 = p_np1[a]; - p_np1[a] = det_pq*(coef_qq*p_np1[a] - coef_pq*q_np1[a]); - q_np1[a] = det_pq*(coef_pp*q_np1[a] - coef_qp*aux_p_np1); - } - } - } ); + AcousticTimeSchemeSEM::LeapFrogforVTI( nodeManager.size(), dt, p_np1, p_n, p_nm1, q_np1, q_n, q_nm1, mass, stiffnessVector_p, + stiffnessVector_q, damping_p, damping_pq, damping_q, damping_qp, + rhs, freeSurfaceNodeIndicator, lateralSurfaceNodeIndicator, + bottomSurfaceNodeIndicator ); /// synchronize pressure fields FieldIdentifiers fieldsToBeSync; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp index 0dc0f3f97c7..82f6e566537 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp @@ -27,6 +27,7 @@ #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "WaveSolverUtils.hpp" +#include "AcousticTimeSchemeSEMKernel.hpp" namespace geos { @@ -965,18 +966,8 @@ void AcousticWaveEquationSEM::computeUnknowns( real64 const & time_n, if( !m_usePML ) { GEOS_MARK_SCOPE ( updateP ); - forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) - { - localIndex const a = solverTargetNodesSet[n]; - if( freeSurfaceNodeIndicator[a] != 1 ) - { - p_np1[a] = p_n[a]; - p_np1[a] *= 2.0 * mass[a]; - p_np1[a] -= (mass[a] - 0.5 * dt * damping[a]) * p_nm1[a]; - p_np1[a] += dt2 * (rhs[a] - stiffnessVector[a]); - p_np1[a] /= mass[a] + 0.5 * dt * damping[a]; - } - } ); + AcousticTimeSchemeSEM::LeapFrogWithoutPML( dt, p_np1, p_n, p_nm1, mass, stiffnessVector, damping, + rhs, freeSurfaceNodeIndicator, solverTargetNodesSet ); } else { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcoustoElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcoustoElasticTimeSchemeSEMKernel.hpp new file mode 100644 index 00000000000..4676d6174b9 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcoustoElasticTimeSchemeSEMKernel.hpp @@ -0,0 +1,80 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file AcoustoElasticTimeSchemeSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTOELASTICTIMESCHEMESEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTOELASTICTIMESCHEMESEMKERNEL_HPP_ + +namespace geos +{ + +struct AcoustoElasticTimeSchemeSEM +{ + + using EXEC_POLICY = parallelDevicePolicy< >; + using ATOMIC_POLICY = parallelDeviceAtomic; + /** + * @brief Apply second order Leap-Frog time scheme for the coupling condition of elasto-acoustic scheme + * @param[in] dt time-step + * @param[out] ux_np1 displacement in x-direction array at time n+1 (updated here) + * @param[out] uy_np1 displacement in y-direction array at time n+1 (updated here) + * @param[out] uz_np1 displacement in z-direction array at time n+1 (updated here) + * @param[in] p_n pressure at time n + * @param[in] elasticMass the mass matrix for the elastic equation + * @param[in] atoex the coupling matrix for x-component + * @param[in] atoey the coupling matrix for y-component + * @param[in] atoez the coupling matrix for z-component + * @param[in] elasticFSNodeIndicator array which contains indicators to tell if we are on a free-surface boundary or not (elastic region) + * @param[in] interfaceNodesSet the nodeset containing the nodes belonging to the interface + */ + + static void LeapFrog( real64 const dt, + arrayView1d< real32 > const ux_np1, + arrayView1d< real32 > const uy_np1, + arrayView1d< real32 > const uz_np1, + arrayView1d< real32 const > const p_n, + arrayView1d< real32 const > const elasticMass, + arrayView1d< real32 const > const atoex, + arrayView1d< real32 const > const atoey, + arrayView1d< real32 const > const atoez, + arrayView1d< localIndex const > const elasticFSNodeIndicator, + SortedArrayView< localIndex const > const interfaceNodesSet ) + { + real64 const dt2 = pow( dt, 2 ); + forAll< EXEC_POLICY >( interfaceNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + { + localIndex const a = interfaceNodesSet[n]; + if( elasticFSNodeIndicator[a] == 1 ) + return; + + real32 const aux = -p_n[a] / elasticMass[a]; + real32 const localIncrementx = dt2 * atoex[a] * aux; + real32 const localIncrementy = dt2 * atoey[a] * aux; + real32 const localIncrementz = dt2 * atoez[a] * aux; + + RAJA::atomicAdd< ATOMIC_POLICY >( &ux_np1[a], localIncrementx ); + RAJA::atomicAdd< ATOMIC_POLICY >( &uy_np1[a], localIncrementy ); + RAJA::atomicAdd< ATOMIC_POLICY >( &uz_np1[a], localIncrementz ); + } ); + + }; + +}; + +} + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTOELASTICTIMESCHEMESEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticTimeSchemeSEMKernel.hpp new file mode 100644 index 00000000000..3e9aefbbd82 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticTimeSchemeSEMKernel.hpp @@ -0,0 +1,107 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ElasticTimeSchemeSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICTIMESCHEMESEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICTIMESCHEMESEMKERNEL_HPP_ + +namespace geos +{ + +struct ElasticTimeSchemeSEM +{ + + using EXEC_POLICY = parallelDevicePolicy< >; + /** + * @brief Apply second order Leap-Frog time scheme for isotropic case without PML + * @param[in] dt time-step + * @param[out] ux_np1 displacement in x-direction array at time n+1 (updated here) + * @param[in] ux_n displacement in x-direction array at time n + * @param[in] ux_nm1 displacement in x-direction array at time n-1 + * @param[out] uy_np1 displacement in y-direction array at time n+1 (updated here) + * @param[in] uy_n displacement in y-direction array at time n + * @param[in] uy_nm1 displacement in y-direction array at time n-1 + * @param[out] uz_np1 displacement in z-direction array at time n+1 (updated here) + * @param[in] uz_n displacement in z-direction array at time n + * @param[in] uz_nm1 displacement in z-direction array at time n-1 + * @param[in] mass the mass matrix + * @param[in] dampingx the damping matrix for x-component + * @param[in] dampingy the damping matrix for y-component + * @param[in] dampingz the damping matrix for z-component + * @param[in] stiffnessVectorx array containing the product of the stiffness matrix R and the displacement in x-direction at time n + * @param[in] stiffnessVectory array containing the product of the stiffness matrix R and the displacement in y-direction at time n + * @param[in] stiffnessVectorz array containing the product of the stiffness matrix R and the displacement in z-direction at time n + * @param[in] rhsx the right-hand-side for displacement in x-direction + * @param[in] rhsy the right-hand-side for displacement in y-direction + * @param[in] rhsz the right-hand-side for displacement in z-direction + * @param[in] freeSurfaceNodeIndicator array which contains indicators to tell if we are on a free-surface boundary or not + * @param[in] solverTargetNodesSet the targetted nodeset (useful in particular when we do elasto-acoustic simulation ) + */ + static void LeapFrog( real64 const dt, + arrayView1d< real32 > const ux_np1, + arrayView1d< real32 > const ux_n, + arrayView1d< real32 > const ux_nm1, + arrayView1d< real32 > const uy_np1, + arrayView1d< real32 > const uy_n, + arrayView1d< real32 > const uy_nm1, + arrayView1d< real32 > const uz_np1, + arrayView1d< real32 > const uz_n, + arrayView1d< real32 > const uz_nm1, + arrayView1d< real32 const > const mass, + arrayView1d< real32 const > const dampingx, + arrayView1d< real32 const > const dampingy, + arrayView1d< real32 const > const dampingz, + arrayView1d< real32 > const stiffnessVectorx, + arrayView1d< real32 > const stiffnessVectory, + arrayView1d< real32 > const stiffnessVectorz, + arrayView1d< real32 > const rhsx, + arrayView1d< real32 > const rhsy, + arrayView1d< real32 > const rhsz, + arrayView1d< localIndex const > const freeSurfaceNodeIndicator, + SortedArrayView< localIndex const > const solverTargetNodesSet ) + { + real64 const dt2 = pow( dt, 2 ); + forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + { + localIndex const a = solverTargetNodesSet[n]; + if( freeSurfaceNodeIndicator[a] != 1 ) + { + ux_np1[a] = ux_n[a]; + ux_np1[a] *= 2.0*mass[a]; + ux_np1[a] -= (mass[a]-0.5*dt*dampingx[a])*ux_nm1[a]; + ux_np1[a] += dt2*(rhsx[a]-stiffnessVectorx[a]); + ux_np1[a] /= mass[a]+0.5*dt*dampingx[a]; + uy_np1[a] = uy_n[a]; + uy_np1[a] *= 2.0*mass[a]; + uy_np1[a] -= (mass[a]-0.5*dt*dampingy[a])*uy_nm1[a]; + uy_np1[a] += dt2*(rhsy[a]-stiffnessVectory[a]); + uy_np1[a] /= mass[a]+0.5*dt*dampingy[a]; + uz_np1[a] = uz_n[a]; + uz_np1[a] *= 2.0*mass[a]; + uz_np1[a] -= (mass[a]-0.5*dt*dampingz[a])*uz_nm1[a]; + uz_np1[a] += dt2*(rhsz[a]-stiffnessVectorz[a]); + uz_np1[a] /= mass[a]+0.5*dt*dampingz[a]; + } + } ); + + }; + +}; + +} + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICTIMESCHEMESEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp index 1d9e8fed402..4cfb38b666c 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp @@ -26,6 +26,7 @@ #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "WaveSolverUtils.hpp" +#include "ElasticTimeSchemeSEMKernel.hpp" namespace geos { @@ -575,30 +576,11 @@ void ElasticWaveEquationSEM::computeUnknowns( real64 const &, addSourceToRightHandSide( cycleNumber, rhsx, rhsy, rhsz ); - real64 const dt2 = pow( dt, 2 ); SortedArrayView< localIndex const > const solverTargetNodesSet = m_solverTargetNodesSet.toViewConst(); - forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) - { - localIndex const a = solverTargetNodesSet[n]; - if( freeSurfaceNodeIndicator[a] != 1 ) - { - ux_np1[a] = ux_n[a]; - ux_np1[a] *= 2.0*mass[a]; - ux_np1[a] -= (mass[a]-0.5*dt*dampingx[a])*ux_nm1[a]; - ux_np1[a] += dt2*(rhsx[a]-stiffnessVectorx[a]); - ux_np1[a] /= mass[a]+0.5*dt*dampingx[a]; - uy_np1[a] = uy_n[a]; - uy_np1[a] *= 2.0*mass[a]; - uy_np1[a] -= (mass[a]-0.5*dt*dampingy[a])*uy_nm1[a]; - uy_np1[a] += dt2*(rhsy[a]-stiffnessVectory[a]); - uy_np1[a] /= mass[a]+0.5*dt*dampingy[a]; - uz_np1[a] = uz_n[a]; - uz_np1[a] *= 2.0*mass[a]; - uz_np1[a] -= (mass[a]-0.5*dt*dampingz[a])*uz_nm1[a]; - uz_np1[a] += dt2*(rhsz[a]-stiffnessVectorz[a]); - uz_np1[a] /= mass[a]+0.5*dt*dampingz[a]; - } - } ); + ElasticTimeSchemeSEM::LeapFrog( dt, ux_np1, ux_n, ux_nm1, uy_np1, uy_n, uy_nm1, uz_np1, uz_n, uz_nm1, + mass, dampingx, dampingy, dampingz, stiffnessVectorx, stiffnessVectory, + stiffnessVectorz, rhsx, rhsy, rhsz, freeSurfaceNodeIndicator, + solverTargetNodesSet ); } void ElasticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, diff --git a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt index a555936aeaf..18d6ecf1757 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt @@ -1,6 +1,7 @@ # Specify list of tests set( gtest_geosx_tests testWavePropagation.cpp + testWavePropagationQ2.cpp testWavePropagationElasticFirstOrder.cpp testWavePropagationDAS.cpp testWavePropagationAcousticFirstOrder.cpp ) diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp new file mode 100644 index 00000000000..576be10cd46 --- /dev/null +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp @@ -0,0 +1,242 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2020- GEOSX Contributors + * All right reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// using some utility classes from the following unit test +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" + +#include "common/DataTypes.hpp" +#include "mainInterface/initialization.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" +#include "mainInterface/GeosxState.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/wavePropagation/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp" + +#include + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; + +// This unit test checks the interpolation done to extract seismic traces from a wavefield. +// It computes a seismogram at a receiver co-located with the source and compares it to the surrounding receivers. +char const * xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )xml"; + +class AcousticWaveEquationSEMTest : public ::testing::Test +{ +public: + + AcousticWaveEquationSEMTest(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + +protected: + + void SetUp() override + { + setupProblemFromXML( state.getProblemManager(), xmlInput ); + } + + static real64 constexpr time = 0.0; + static real64 constexpr dt = 5e-4; + static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); + + GeosxState state; + AcousticWaveEquationSEM * propagator; +}; + +real64 constexpr AcousticWaveEquationSEMTest::time; +real64 constexpr AcousticWaveEquationSEMTest::dt; +real64 constexpr AcousticWaveEquationSEMTest::eps; + +TEST_F( AcousticWaveEquationSEMTest, SeismoTrace ) +{ + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + propagator = &state.getProblemManager().getPhysicsSolverManager().getGroup< AcousticWaveEquationSEM >( "acousticSolver" ); + real64 time_n = time; + // run for 1s (10 steps) + for( int i=0; i<10; i++ ) + { + propagator->explicitStepForward( time_n, dt, i, domain, false ); + time_n += dt; + } + // cleanup (triggers calculation of the remaining seismograms data points) + propagator->cleanup( 1.0, 10, 0, 0, domain ); + + // retrieve seismo + arrayView2d< real32 > const pReceivers = propagator->getReference< array2d< real32 > >( AcousticWaveEquationSEM::viewKeyStruct::pressureNp1AtReceiversString() ).toView(); + + // move it to CPU, if needed + pReceivers.move( hostMemorySpace, false ); + + // check number of seismos and trace length + ASSERT_EQ( pReceivers.size( 1 ), 10 ); + ASSERT_EQ( pReceivers.size( 0 ), 11 ); + + // check seismo content. The pressure values cannot be directly checked as the problem is too small. + // Since the basis is linear, check that the seismograms are nonzero (for t>0) and the seismogram at the center is equal + // to the average of the others. + for( int i = 0; i < 11; i++ ) + { + if( i > 0 ) + { + ASSERT_TRUE( std::abs( pReceivers[i][8] ) > 0 ); + } + double avg = 0; + for( int r=0; r<8; r++ ) + { + avg += pReceivers[i][r]; + } + avg /= 8.0; + std::cout << "p= "<< pReceivers[i][8] << std::endl; + std::cout << "avg= "<explicitStepBackward( time_n, dt, i, domain, false ); + time_n += dt; + } + // check again the seismo content. + for( int i = 0; i < 11; i++ ) + { + if( i > 0 ) + { + ASSERT_TRUE( std::abs( pReceivers[i][8] ) > 0 ); + } + double avg = 0; + for( int r=0; r<8; r++ ) + { + avg += pReceivers[i][r]; + } + avg /= 8.0; + ASSERT_TRUE( std::abs( pReceivers[i][8] - avg ) < 0.00001 ); + } +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + return result; +} From 3546d472ba9bf1d62f4b84089940293d3c88e43e Mon Sep 17 00:00:00 2001 From: Lionel Untereiner Date: Fri, 29 Mar 2024 04:58:31 +0100 Subject: [PATCH 025/286] documentation for VTKWell (#2963) * doc for VTKWell * Wordsmithing --------- Co-authored-by: Herve Gross <40979822+herve-gross@users.noreply.github.com> Co-authored-by: Nicola Castelletto <38361926+castelletto1@users.noreply.github.com> --- .../Egg/deadOilEggVTK_benchmark.xml | 382 ++++++++++++++++++ .../multiphaseFlowWithWells/Example.rst | 75 ++-- 2 files changed, 431 insertions(+), 26 deletions(-) create mode 100644 inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEggVTK_benchmark.xml diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEggVTK_benchmark.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEggVTK_benchmark.xml new file mode 100644 index 00000000000..675d20853a3 --- /dev/null +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEggVTK_benchmark.xml @@ -0,0 +1,382 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst b/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst index 0c1d7be2a45..1afb1185816 100644 --- a/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst +++ b/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst @@ -119,48 +119,71 @@ Mesh definition and well geometry In the presence of wells, the **Mesh** block of the XML input file includes two parts: - a sub-block **VTKMesh** defining the reservoir mesh (see :ref:`TutorialSinglePhaseFlowExternalMesh` for more on this), - - a collection of sub-blocks **InternalWell** defining the geometry of the wells. + - a collection of sub-blocks defining the geometry of the wells. The reservoir mesh is imported from a ``.vtu`` file that contains the mesh geometry and also includes the permeability values in the x, y, and z directions. These quantities must be specified using the metric unit system, i.e., in meters for the well geometry and square meters for the permeability field. -We note that the mesh file only contains the active cells, so there is no keyword -needed in the XML file to define them. +We note that the mesh file only contains active cells, so there is no keyword +needed in the XML file to define them. + +.. image:: egg_model.png + :width: 400px + :align: center + +.. literalinclude:: ../../../../../inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_benchmark.xml + :language: xml + :start-after: + :end-before: + + +.. _Events_tag_dead_oil_egg_model: + +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**InternalWell** sub-blocks +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Each well is defined internally (i.e., not imported from a file) in a separate **InternalWell** -XML sub-block. An **InternalWell** sub-block must point to the reservoir mesh that the well perforates -using the attribute ``meshName``, to the region corresponding to this well using the attribute +XML sub-block. An **InternalWell** sub-block must point to the region corresponding to this well using the attribute ``wellRegionName``, and to the control of this well using the attribute ``wellControl``. -Each block **InternalWell** must point to the reservoir mesh -(using the attribute ``meshName``), the corresponding well region (using -the attribute ``wellRegionName``), and the corresponding well control -(using the attribute ``wellControlName``). Each well is defined using a vertical polyline going through the seven layers of the -mesh, with a perforation in each layer. +mesh with a perforation in each layer. The well placement implemented here follows the pattern of the original test case. The well geometry must be specified in meters. The location of the perforations is found internally using the linear distance along the wellbore -from the top of the well, specified by the attribute ``distanceFromHead``. +from the top of the well specified by the attribute ``distanceFromHead``. It is the responsibility of the user to make sure that there is a perforation in the bottom cell of the well mesh otherwise an error will be thrown and the simulation will terminate. For each perforation, the well transmissibility factors employed to compute the perforation rates are calculated internally using the Peaceman formulation. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +**VTKWell** sub-blocks +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. image:: egg_model.png - :width: 400px - :align: center +Each well is loaded from a file in a separate **VTKWell** +XML sub-block. A **VTKWell** sub-block must point to the region corresponding to this well using the attribute +``wellRegionName``, and to the control of this well using the attribute ``wellControl``. -.. literalinclude:: ../../../../../inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_benchmark.xml - :language: xml - :start-after: - :end-before: +Each well is defined using a vertical VTK polyline going through the seven layers of the +mesh with a perforation in each layer. +The well placement implemented here follows the pattern of the original test case. +The well geometry must be specified in meters. +The location of perforations is found internally using the linear distance along the wellbore +from the top of the well specified by the attribute ``distanceFromHead``. +It is the responsibility of the user to make sure that there is a perforation in the bottom cell +of the well mesh otherwise an error will be thrown and the simulation will terminate. +For each perforation, the well transmissibility factors employed to compute the perforation rates are calculated +internally using the Peaceman formulation. -.. _Events_tag_dead_oil_egg_model: +.. literalinclude:: ../../../../../inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEggVTK_benchmark.xml + :language: xml + :start-after: + :end-before: ------------------------ Events @@ -181,11 +204,11 @@ by the attribute ``timeFrequency``. Here, we choose to output the results using the VTK format (see :ref:`TutorialSinglePhaseFlowExternalMesh` for a example that uses the Silo output file format). The ``target`` attribute must point to the **VTK** sub-block of the **Outputs** -block (defined at the end of the XML file) by name (here, ``vtkOutput``). +block defined at the end of the XML file by its user-specified name (here, ``vtkOutput``). -We define the events involved in the collection and output of the well production rates following the procedure defined in :ref:`TasksManager`. -The time history collection events trigger the collection of the well rates at the desired frequency, while the time history output events trigger the output of the HDF5 files containing the time series. -These events point by name to the corresponding blocks of the **Tasks** and **Outputs** XML blocks, respectively. Here, these names are ``wellRateCollection1`` and ``timeHistoryOutput1``. +We define the events involved in the collection and output of well production rates following the procedure defined in :ref:`TasksManager`. +The time-history collection events trigger the collection of well rates at the desired frequency, while the time-history output events trigger the output of HDF5 files containing the time series. +These events point by name to the corresponding blocks of the **Tasks** and **Outputs** XML blocks. Here, these names are ``wellRateCollection1`` and ``timeHistoryOutput1``. .. literalinclude:: ../../../../../inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_base_iterative.xml :language: xml @@ -199,7 +222,7 @@ These events point by name to the corresponding blocks of the **Tasks** and **Ou Numerical methods ---------------------------------- -In the ``NumericalMethods`` XML block, we instruct GEOS to use a TPFA finite-volume +In the ``NumericalMethods`` XML block, we instruct GEOS to use a TPFA (Two-Point Flux Approximation) finite-volume numerical scheme. This part is similar to the corresponding section of :ref:`TutorialDeadOilBottomLayersSPE10`, and has been adapted to match the specifications of the Egg model. @@ -215,7 +238,7 @@ This part is similar to the corresponding section of :ref:`TutorialDeadOilBottom Reservoir and well regions ----------------------------------- -In this section of the input file, we follow the procedure already described in +In this section of the input file, we follow the procedure described in :ref:`TutorialDeadOilBottomLayersSPE10` for the definition of the reservoir region with multiphase constitutive models. We associate a **CellElementRegion** named ``reservoir`` to the reservoir mesh. @@ -421,7 +444,7 @@ We can load this file into Paraview directly and visualize results: :width: 45% We have instructed GEOS to output the time series of rates for each producer. -The data contained in the corresponding hdf5 files can be extracted and plotted +The data contained in the corresponding HDF5 files can be extracted and plotted as shown below. .. plot:: docs/sphinx/basicExamples/multiphaseFlowWithWells/multiphaseFlowWithWellsFigure.py From 620259598dc9ef589ca0ea9603295e9a27974a1b Mon Sep 17 00:00:00 2001 From: tbeltzun <129868353+tbeltzun@users.noreply.github.com> Date: Fri, 29 Mar 2024 09:56:35 +0100 Subject: [PATCH 026/286] acoustic / elastic solver updates (#3027) * enhance comments * add coupled solver elastic source * rename xmls, use base xml * xml fixes - reduce timestep and seismo sample step * test alternative timestep * reduce end-time * reduce ny * increase timestep * reduce compute time * add ny * restore ny * reduce ny * restore ny * debug kernel * try alternative coupling strategy * fix coupling for domain decomposition * remove debugging code * Removed leftover debug commented line * reduce problem size * Checking updated baselines on the CI * Updating the integratedTests hash --------- Co-authored-by: Stefano Frambati Co-authored-by: Nicola Castelletto --- ...3D.xml => acouselas3D_komatitsch_base.xml} | 83 +++-------- .../benchmarks/acouselas3D_komatitsch_flu.xml | 39 +++++ .../benchmarks/acouselas3D_komatitsch_sol.xml | 34 +++++ .../benchmarks/acouselas3D_layers_aea.xml | 46 ++++++ .../benchmarks/acouselas3D_layers_base.xml | 138 ++++++++++++++++++ .../benchmarks/acouselas3D_layers_eae.xml | 46 ++++++ integratedTests | 2 +- .../AcousticElasticWaveEquationSEM.cpp | 25 ++-- .../AcousticElasticWaveEquationSEM.hpp | 8 +- .../AcousticElasticWaveEquationSEMKernel.hpp | 34 +++-- 10 files changed, 367 insertions(+), 88 deletions(-) rename inputFiles/wavePropagation/benchmarks/{acouselas3D.xml => acouselas3D_komatitsch_base.xml} (67%) create mode 100644 inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_flu.xml create mode 100644 inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_sol.xml create mode 100644 inputFiles/wavePropagation/benchmarks/acouselas3D_layers_aea.xml create mode 100644 inputFiles/wavePropagation/benchmarks/acouselas3D_layers_base.xml create mode 100644 inputFiles/wavePropagation/benchmarks/acouselas3D_layers_eae.xml diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_base.xml similarity index 67% rename from inputFiles/wavePropagation/benchmarks/acouselas3D.xml rename to inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_base.xml index 7ee7cc3e86e..80fe7332730 100644 --- a/inputFiles/wavePropagation/benchmarks/acouselas3D.xml +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_base.xml @@ -13,21 +13,13 @@ 6400x1600x4800m domain NOTES: nx="{ 320 }" - ny="{ 240 }" - nz="{ 120, 120 } - => local threshold for local builds 3D Q1 Δt=1e-4 (18e6 elems, 10Gb per 1 GPU) - -> Q4 180 procs / GPU 16h - -> Q1 180 procs / GPU 1h40min - -> Q3 gar6more results - nx="{ 160 }" ny="{ 120 }" - nz="{ 60, 60 } - => local threshold for local builds 3D Q2 Δt=1e-4 (2e6 elems, 4Gb per 1 GPU) - -> Q3 swaps - nx="{ 80 }" - ny="{ 60 }" - nz="{ 30, 30 } - => coarse 10 min frontal run 3D Q5 Δt=1e-3 (288e3 elems, 8Gb per 6 GPU) + nz="{ 120, 120 }" + => Q3 24 procs / GPUs -> 10min run on P3 (validation run) + nx="{ 320 }" + ny="{ 80 }" + nz="{ 120, 120 }" + => Q2 18 procs / GPUs -> 5min run on P3 (debug run) # Validation againt [gar6more3d](https://gitlab.inria.fr/jdiaz/gar6more3d) @@ -37,7 +29,7 @@ 0 first layer : acoustic (0) elastodynamic (1), poroelastic (2) 4 Source derivative (Hermite functions derivative, i.e. 2 for a ricker source) 10. Central frequency of the source - 1020. Amplitude of the source (× ρᶠ ?) + 2.295e9 Amplitude of the source (≡ λᶠ) 0.115 Delay of the source 500. Height of the source 533.3333 Height of the line of receivers (relative to interface) @@ -47,10 +39,10 @@ 0. Ordinate of the last receiver 1 Numbers of receivers 0. Start time - 3. Stop time + 1.85 Stop time 1e-3 Time step (of the seismo samples) - 1000 Number of intervals for the numerical computation of the convolution - 1000 Number of intervals for the numerical computation of the space integration + 100 Number of intervals for the numerical computation of the convolution + 100 Number of intervals for the numerical computation of the space integration 2.295e9 1020. λᶠ and ρᶠ 1 second layer : acoustic (0) elastodynamic (1), poroelastic (2) 9.6334225e9 9.633155e9 2500. μˢ, λˢ and ρˢ @@ -60,9 +52,9 @@ ``` 4 infinite medium (1), free surface (2), wall boundary (3) or bilayered medium(4) 0 first layer : acoustic (0) elastodynamic (1), poroelastic (2) - 4 Source derivative (Hermite functions derivative, i.e. 2 for a ricker source) + 3 Source derivative (Hermite functions derivative, i.e. 2 for a ricker source) 10. Central frequency of the source - 1020. Amplitude of the source (× ρᶠ ?) + 2.295e9 Amplitude of the source (≡ λᶠ) 0.115 Delay of the source 500. Height of the source -533.3333 Height of the line of receivers (relative to interface) @@ -72,10 +64,10 @@ 0. Ordinate of the last receiver 1 Numbers of receivers 0. Start time - 3. Stop time + 1.85 Stop time 1e-3 Time step (of the seismo samples) - 500 Number of intervals for the numerical computation of the convolution - 500 Number of intervals for the numerical computation of the space integration + 100 Number of intervals for the numerical computation of the convolution + 100 Number of intervals for the numerical computation of the space integration 2.295e9 1020. λᶠ and ρᶠ 1 second layer : acoustic (0) elastodynamic (1), poroelastic (2) 9.6334225e9 9.633155e9 2500. μˢ, λˢ and ρˢ @@ -83,37 +75,6 @@ --> - - - - - - - @@ -137,22 +98,21 @@ - + @@ -169,8 +129,7 @@ - + diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_flu.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_flu.xml new file mode 100644 index 00000000000..a1367ef4128 --- /dev/null +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_flu.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_sol.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_sol.xml new file mode 100644 index 00000000000..5a4e3ff62ee --- /dev/null +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_komatitsch_sol.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_aea.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_aea.xml new file mode 100644 index 00000000000..141cf84d7a6 --- /dev/null +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_aea.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_base.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_base.xml new file mode 100644 index 00000000000..83922fb1c8c --- /dev/null +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_base.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_eae.xml b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_eae.xml new file mode 100644 index 00000000000..e75b0cb0c93 --- /dev/null +++ b/inputFiles/wavePropagation/benchmarks/acouselas3D_layers_eae.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + diff --git a/integratedTests b/integratedTests index 9821b209d73..9e5112893b1 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit 9821b209d730ef24e5231e66e33c9cdc57459dad +Subproject commit 9e5112893b1fc371c058a4da293771e8e18aee2b diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp index 0ba29d65cd3..1b3c5d659f8 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp @@ -68,7 +68,7 @@ void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, - arrayView1d< string const > const & GEOS_UNUSED_PARAM( regionNames ) ) + arrayView1d< string const > const & ) { NodeManager & nodeManager = mesh.getNodeManager(); FaceManager & faceManager = mesh.getFaceManager(); @@ -77,6 +77,7 @@ void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords = nodeManager.getField< fields::referencePosition32 >().toViewConst(); arrayView2d< real64 const > const faceNormals = faceManager.faceNormal().toViewConst(); + arrayView2d< real64 const > const faceCenters = faceManager.faceCenter().toViewConst(); ArrayOfArraysView< localIndex const > const faceToNode = faceManager.nodeList().toViewConst(); arrayView2d< localIndex const > const faceToSubRegion = faceManager.elementSubRegionList(); arrayView2d< localIndex const > const faceToRegion = faceManager.elementRegionList(); @@ -97,6 +98,7 @@ void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups { finiteElement::FiniteElementBase const & fe = elementSubRegion.getReference< finiteElement::FiniteElementBase >( getDiscretizationName() ); + arrayView2d< real64 const > const elemCenters = elementSubRegion.getElementCenter().toViewConst(); finiteElement::FiniteElementDispatchHandler< SEM_FE_TYPES >::dispatch3D( fe, [&] ( auto const finiteElement ) { @@ -112,6 +114,8 @@ void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups faceToElement, faceToNode, faceNormals, + faceCenters, + elemCenters, couplingVectorx, couplingVectory, couplingVectorz ); @@ -135,7 +139,7 @@ real64 AcousticElasticWaveEquationSEM::solverStep( real64 const & time_n, forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, - arrayView1d< string const > const & GEOS_UNUSED_PARAM( regionNames ) ) + arrayView1d< string const > const & ) { NodeManager & nodeManager = mesh.getNodeManager(); @@ -151,6 +155,7 @@ real64 AcousticElasticWaveEquationSEM::solverStep( real64 const & time_n, arrayView1d< real32 const > const ux_n = nodeManager.getField< elasticfields::Displacementx_n >(); arrayView1d< real32 const > const uy_n = nodeManager.getField< elasticfields::Displacementy_n >(); arrayView1d< real32 const > const uz_n = nodeManager.getField< elasticfields::Displacementz_n >(); + // acoutic -> elastic coupling vectors arrayView1d< real32 const > const atoex = nodeManager.getField< acoustoelasticfields::CouplingVectorx >(); arrayView1d< real32 const > const atoey = nodeManager.getField< acoustoelasticfields::CouplingVectory >(); arrayView1d< real32 const > const atoez = nodeManager.getField< acoustoelasticfields::CouplingVectorz >(); @@ -169,19 +174,19 @@ real64 AcousticElasticWaveEquationSEM::solverStep( real64 const & time_n, acousSolver->computeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_acousRegions ); - forAll< EXEC_POLICY >( interfaceNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + forAll< EXEC_POLICY >( interfaceNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const in ) { - localIndex const a = interfaceNodesSet[n]; - if( acousticFSNodeIndicator[a] == 1 ) + localIndex const n = interfaceNodesSet[in]; + if( acousticFSNodeIndicator[n] == 1 ) return; real32 const localIncrement = ( - atoex[a] * ( ux_np1[a] - 2.0 * ux_n[a] + ux_nm1[a] ) + - atoey[a] * ( uy_np1[a] - 2.0 * uy_n[a] + uy_nm1[a] ) + - atoez[a] * ( uz_np1[a] - 2.0 * uz_n[a] + uz_nm1[a] ) - ) / acousticMass[a]; + atoex[n] * ( ux_np1[n] - 2.0 * ux_n[n] + ux_nm1[n] ) + + atoey[n] * ( uy_np1[n] - 2.0 * uy_n[n] + uy_nm1[n] ) + + atoez[n] * ( uz_np1[n] - 2.0 * uz_n[n] + uz_nm1[n] ) + ) / acousticMass[n]; - RAJA::atomicAdd< ATOMIC_POLICY >( &p_np1[a], localIncrement ); + RAJA::atomicAdd< ATOMIC_POLICY >( &p_np1[n], localIncrement ); } ); acousSolver->synchronizeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_acousRegions ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.hpp index ea72af060af..54e8a22a352 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.hpp @@ -140,8 +140,8 @@ class AcousticElasticWaveEquationSEM : public CoupledWaveSolver< AcousticWaveEqu string getCatalogName() const override { return catalogName(); } /** - * @brief accessor for the pointer to the solid mechanics solver - * @return a pointer to the solid mechanics solver + * @brief accessor for the pointer to the acoustic solver + * @return a pointer to the acoustic solver */ AcousticWaveEquationSEM * acousticSolver() const { @@ -149,8 +149,8 @@ class AcousticElasticWaveEquationSEM : public CoupledWaveSolver< AcousticWaveEqu } /** - * @brief accessor for the pointer to the flow solver - * @return a pointer to the flow solver + * @brief accessor for the pointer to the elastic solver + * @return a pointer to the elastic solver */ ElasticWaveEquationSEM * elasticSolver() const { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp index 9c3e9f5fbdc..91c9ed8a99b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp @@ -42,27 +42,32 @@ struct CouplingKernel launch( localIndex const size, arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - localIndex const regionIndex, - localIndex const subRegionIndex, + localIndex const fluidRegionIndex, + localIndex const fluidSubRegionIndex, arrayView2d< localIndex const > const faceToSubRegion, arrayView2d< localIndex const > const faceToRegion, arrayView2d< localIndex const > const faceToElement, ArrayOfArraysView< localIndex const > const facesToNodes, arrayView2d< real64 const > const faceNormals, + arrayView2d< real64 const > const faceCenters, + arrayView2d< real64 const > const elemCenters, arrayView1d< real32 > const couplingVectorx, arrayView1d< real32 > const couplingVectory, arrayView1d< real32 > const couplingVectorz ) { forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const f ) { - localIndex e0 = faceToElement( f, 0 ), e1 = faceToElement( f, 1 ); - localIndex er0 = faceToRegion( f, 0 ), er1 = faceToRegion( f, 1 ); - localIndex esr0 = faceToSubRegion( f, 0 ), esr1 = faceToSubRegion( f, 1 ); + localIndex const e0 = faceToElement( f, 0 ), e1 = faceToElement( f, 1 ); + localIndex const er0 = faceToRegion( f, 0 ), er1 = faceToRegion( f, 1 ); + localIndex const esr0 = faceToSubRegion( f, 0 ), esr1 = faceToSubRegion( f, 1 ); if( e0 != -1 && e1 != -1 && er0 != er1 ) // an interface is defined as a transition between regions { // check that one of the region is the fluid subregion for the fluid -> solid coupling term - if((er0 == regionIndex && esr0 == subRegionIndex) || (er1 == regionIndex && esr1 == subRegionIndex)) + bool const e0IsFluid = er0 == fluidRegionIndex && esr0 == fluidSubRegionIndex; + bool const e1IsFluid = er1 == fluidRegionIndex && esr1 == fluidSubRegionIndex; + + if( e0IsFluid != e1IsFluid ) // xor: a single element must be fluid { // only the four corners of the mesh face are needed to compute the Jacobian real64 xLocal[ 4 ][ 3 ]; @@ -75,16 +80,23 @@ struct CouplingKernel } } - // determine normal sign for fluid -> solid coupling - localIndex sgn = er0 == regionIndex ? 1 : (er1 == regionIndex ? -1 : 0); + real64 const nx = faceNormals( f, 0 ), ny = faceNormals( f, 1 ), nz = faceNormals( f, 2 ); + + // determine sign to get an outward pointing normal for the fluid -> solid coupling + localIndex const e = e0IsFluid ? e0 : (e1IsFluid ? e1 : -1); // fluid element + localIndex const sgn = ( + (faceCenters( f, 0 ) - elemCenters( e, 0 )) * nx + + (faceCenters( f, 1 ) - elemCenters( e, 1 )) * ny + + (faceCenters( f, 2 ) - elemCenters( e, 2 )) * nz + ) < 0 ? 1 : -1; for( localIndex q = 0; q < numNodesPerFace; ++q ) { real64 const aux = FE_TYPE::computeDampingTerm( q, xLocal ); - real32 const localIncrementx = aux * (sgn * faceNormals( f, 0 )); - real32 const localIncrementy = aux * (sgn * faceNormals( f, 1 )); - real32 const localIncrementz = aux * (sgn * faceNormals( f, 2 )); + real32 const localIncrementx = aux * (sgn * nx); + real32 const localIncrementy = aux * (sgn * ny); + real32 const localIncrementz = aux * (sgn * nz); RAJA::atomicAdd< ATOMIC_POLICY >( &couplingVectorx[facesToNodes( f, q )], localIncrementx ); RAJA::atomicAdd< ATOMIC_POLICY >( &couplingVectory[facesToNodes( f, q )], localIncrementy ); From 82879a1231e588a682fd427494ed128f643d4446 Mon Sep 17 00:00:00 2001 From: acitrain <60715545+acitrain@users.noreply.github.com> Date: Tue, 2 Apr 2024 21:06:54 +0200 Subject: [PATCH 027/286] Refactor wave solvers: move mass + damping matrix and PML inside dedicated files (#2995) --- .../physicsSolvers/CMakeLists.txt | 3 + .../AcousticFirstOrderWaveEquationSEM.cpp | 63 ++- ...cousticFirstOrderWaveEquationSEMKernel.hpp | 128 ----- .../AcousticMatricesSEMKernel.hpp | 160 ++++++ .../wavePropagation/AcousticPMLSEMKernel.hpp | 389 ++++++++++++++ .../AcousticWaveEquationSEM.cpp | 71 ++- .../AcousticWaveEquationSEMKernel.hpp | 486 ------------------ .../ElasticFirstOrderWaveEquationSEM.cpp | 49 +- ...ElasticFirstOrderWaveEquationSEMKernel.hpp | 134 ----- .../ElasticMatricesSEMKernel.hpp | 168 ++++++ .../ElasticWaveEquationSEM.cpp | 43 +- .../ElasticWaveEquationSEMKernel.hpp | 137 ----- 12 files changed, 860 insertions(+), 971 deletions(-) create mode 100644 src/coreComponents/physicsSolvers/wavePropagation/AcousticMatricesSEMKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/wavePropagation/AcousticPMLSEMKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/wavePropagation/ElasticMatricesSEMKernel.hpp diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index 5d64a88b399..06149f32719 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -134,6 +134,8 @@ set( physicsSolvers_headers wavePropagation/AcousticWaveEquationSEM.hpp wavePropagation/AcousticWaveEquationSEMKernel.hpp wavePropagation/AcousticTimeSchemeSEMKernel.hpp + wavePropagation/AcousticMatricesSEMKernel.hpp + wavePropagation/AcousticPMLSEMKernel.hpp wavePropagation/ElasticFields.hpp wavePropagation/ElasticWaveEquationSEM.hpp wavePropagation/ElasticWaveEquationSEMKernel.hpp @@ -142,6 +144,7 @@ set( physicsSolvers_headers wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp + wavePropagation/ElasticMatricesSEMKernel.hpp wavePropagation/AcousticVTIFields.hpp wavePropagation/AcousticVTIWaveEquationSEM.hpp wavePropagation/AcousticVTIWaveEquationSEMKernel.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp index 1ede25c9b42..8e1264038fb 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp @@ -26,6 +26,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "AcousticMatricesSEMKernel.hpp" namespace geos { @@ -265,7 +266,7 @@ void AcousticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGro /// get the array of indicators: 1 if the face is on the boundary; 0 otherwise arrayView1d< integer const > const & facesDomainBoundaryIndicator = faceManager.getDomainBoundaryIndicator(); - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const X = nodeManager.getField< fields::referencePosition32 >().toViewConst(); + arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords = nodeManager.getField< fields::referencePosition32 >().toViewConst(); /// get table containing face to nodes map ArrayOfArraysView< localIndex const > const facesToNodes = faceManager.nodeList().toViewConst(); @@ -295,25 +296,47 @@ void AcousticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGro { using FE_TYPE = TYPEOFREF( finiteElement ); - acousticFirstOrderWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); - - kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - X, - elemsToNodes, - velocity, - density, - mass ); - - acousticFirstOrderWaveEquationSEMKernels::DampingMatrixKernel< FE_TYPE > kernelD( finiteElement ); - - kernelD.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - X, - elemsToFaces, - facesToNodes, - facesDomainBoundaryIndicator, - freeSurfaceFaceIndicator, - velocity, - damping ); + // acousticFirstOrderWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); + + // kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + // X, + // elemsToNodes, + // velocity, + // density, + // mass ); + + // acousticFirstOrderWaveEquationSEMKernels::DampingMatrixKernel< FE_TYPE > kernelD( finiteElement ); + + // kernelD.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + // X, + // elemsToFaces, + // facesToNodes, + // facesDomainBoundaryIndicator, + // freeSurfaceFaceIndicator, + // velocity, + // damping ); + + + AcousticMatricesSEM::MassMatrix< FE_TYPE > kernelM( finiteElement ); + kernelM.template computeMassMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToNodes, + velocity, + density, + mass ); + + AcousticMatricesSEM::DampingMatrix< FE_TYPE > kernelD( finiteElement ); + kernelD.template computeDampingMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToFaces, + facesToNodes, + facesDomainBoundaryIndicator, + freeSurfaceFaceIndicator, + velocity, + density, + damping ); + + } ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp index 97eddf54faf..9542d0b6cf6 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp @@ -197,134 +197,6 @@ struct PrecomputeSourceAndReceiverKernel } }; -template< typename FE_TYPE > -struct MassMatrixKernel -{ - - MassMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the mass matrix - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToNodes map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[in] density cell-wise density - * @param[out] mass diagonal of the mass matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, - arrayView1d< real32 const > const velocity, - arrayView1d< real32 const > const density, - arrayView1d< real32 > const mass ) - - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - - - real32 const invC2 = 1.0 / ( density[e] * pow( velocity[e], 2 ) ); - // only the eight corners of the mesh cell are needed to compute the Jacobian - real64 xLocal[ 8 ][ 3 ]; - for( localIndex a = 0; a < 8; ++a ) - { - localIndex const nodeIndex = elemsToNodes( e, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( localIndex i = 0; i < 3; ++i ) - { - xLocal[a][i] = nodeCoords( nodeIndex, i ); - } - } - - constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; - for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) - { - real32 const localIncrement = invC2 * m_finiteElement.computeMassTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes( e, q )], localIncrement ); - } - } ); // end loop over element - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -template< typename FE_TYPE > -struct DampingMatrixKernel -{ - - DampingMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the damping matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToFaces map from elements to faces - * @param[in] facesToNodes map from face to nodes - * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise - * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise - * @param[in] velocity cell-wise velocity - * @param[out] damping diagonal of the damping matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const > const elemsToFaces, - ArrayOfArraysView< localIndex const > const facesToNodes, - arrayView1d< integer const > const facesDomainBoundaryIndicator, - arrayView1d< localIndex const > const freeSurfaceFaceIndicator, - arrayView1d< real32 const > const velocity, - arrayView1d< real32 > const damping ) - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) - { - localIndex const f = elemsToFaces( e, i ); - // face on the domain boundary and not on free surface - if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) - { - // only the four corners of the mesh face are needed to compute the Jacobian - real64 xLocal[ 4 ][ 3 ]; - for( localIndex a = 0; a < 4; ++a ) - { - localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); - for( localIndex d = 0; d < 3; ++d ) - { - xLocal[a][d] = nodeCoords( nodeIndex, d ); - } - } - - real32 const alpha = 1.0 / velocity[e]; - constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; - for( localIndex q = 0; q < numNodesPerFace; ++q ) - { - real32 const localIncrement = alpha * m_finiteElement.computeDampingTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &damping[facesToNodes( f, q )], localIncrement ); - } - } - } - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - - template< typename FE_TYPE > struct VelocityComputation diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticMatricesSEMKernel.hpp new file mode 100644 index 00000000000..811fcef0f3f --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticMatricesSEMKernel.hpp @@ -0,0 +1,160 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file AcousticMatricesSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICMATRICESSEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICMATRICESSEMKERNEL_HPP_ + +namespace geos +{ + +struct AcousticMatricesSEM +{ + + template< typename FE_TYPE > + struct MassMatrix + { + + MassMatrix( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + /** + * @brief Launches the precomputation of the mass matrices + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @tparam FE_TYPE the type of discretization + * @param[in] finiteElement The finite element discretization used + * @param[in] size the number of cells in the subRegion + * @param[in] numFacesPerElem number of faces per element + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToNodes map from element to nodes + * @param[in] velocity cell-wise velocity + * @param[in] density cell-wise density + * @param[out] mass diagonal of the mass matrix + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + computeMassMatrix( localIndex const size, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, + arrayView1d< real32 const > const velocity, + arrayView1d< real32 const > const density, + arrayView1d< real32 > const mass ) + + { + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) + { + + real32 const invC2 = 1.0 / ( density[e] * pow( velocity[e], 2 ) ); + // only the eight corners of the mesh cell are needed to compute the Jacobian + real64 xLocal[ 8 ][ 3 ]; + for( localIndex a = 0; a < 8; ++a ) + { + localIndex const nodeIndex = elemsToNodes( e, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( localIndex i = 0; i < 3; ++i ) + { + xLocal[a][i] = nodeCoords( nodeIndex, i ); + } + } + constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) + { + real32 const localIncrement = invC2 * m_finiteElement.computeMassTerm( q, xLocal ); + RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes( e, q )], localIncrement ); + } + } ); // end loop over element + } + + FE_TYPE const & m_finiteElement; + + }; + template< typename FE_TYPE > + struct DampingMatrix + { + + DampingMatrix( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the precomputation of the damping matrices + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToFaces map from elements to faces + * @param[in] facesToNodes map from face to nodes + * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise + * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise + * @param[in] velocity cell-wise velocity + * @param[in] density cell-wise density + * @param[out] damping diagonal of the damping matrix + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + computeDampingMatrix( localIndex const size, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< localIndex const > const elemsToFaces, + ArrayOfArraysView< localIndex const > const facesToNodes, + arrayView1d< integer const > const facesDomainBoundaryIndicator, + arrayView1d< localIndex const > const freeSurfaceFaceIndicator, + arrayView1d< real32 const > const velocity, + arrayView1d< real32 const > const density, + arrayView1d< real32 > const damping ) + { + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) + { + for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) + { + localIndex const f = elemsToFaces( e, i ); + // face on the domain boundary and not on free surface + if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) + { + // only the four corners of the mesh face are needed to compute the Jacobian + real64 xLocal[ 4 ][ 3 ]; + for( localIndex a = 0; a < 4; ++a ) + { + localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); + for( localIndex d = 0; d < 3; ++d ) + { + xLocal[a][d] = nodeCoords( nodeIndex, d ); + } + } + real32 const alpha = 1.0 / (density[e] * velocity[e]); + constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; + for( localIndex q = 0; q < numNodesPerFace; ++q ) + { + real32 const localIncrement = alpha * m_finiteElement.computeDampingTerm( q, xLocal ); + RAJA::atomicAdd< ATOMIC_POLICY >( &damping[facesToNodes( f, q )], localIncrement ); + } + } + } + } ); + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + + }; + + + +}; + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICMATRICESSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticPMLSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticPMLSEMKernel.hpp new file mode 100644 index 00000000000..c6f2f54586c --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticPMLSEMKernel.hpp @@ -0,0 +1,389 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file AcousticPMLSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICPMLSEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICPMLSEMKERNEL_HPP_ + +namespace geos +{ + +struct AcousticPMLSEM +{ + struct ComputeDamping + { + /** + * @brief Compute the damping profile for the Perfectly Matched Layer (PML) + * @param xLocal a given x-y-z coordinates (3-components array) + * @param xMin coordinate limits of the inner PML boundaries, left-front-top + * @param xMax coordinate limits of the inner PML boundaries, right-back-bottom + * @param dMin PML thickness, left-front-top + * @param dMax PML thickness, right-back-bottom + * @param cMin PML wave speed, left-front-top + * @param cMax PML wave speed, right-back-bottom + * @param r desired reflectivity of the PML + * @param sigma 3-components array to hold the damping profile in each direction + */ + GEOS_HOST_DEVICE + inline + static void computeDampingProfile( real32 const (&xLocal)[3], + real32 const (&xMin)[3], + real32 const (&xMax)[3], + real32 const (&dMin)[3], + real32 const (&dMax)[3], + real32 const (&cMin)[3], + real32 const (&cMax)[3], + real32 const r, + real32 (& sigma)[3] ) + { + + sigma[0] = 0; + sigma[1] = 0; + sigma[2] = 0; + + if( xLocal[0] < xMin[0] ) + { + real32 const factor = -3.0/2.0*cMin[0]*log( r )/(dMin[0]*dMin[0]*dMin[0]); + sigma[0] = factor*(xLocal[0]-xMin[0])*(xLocal[0]-xMin[0]); + } + else if( xLocal[0] > xMax[0] ) + { + real32 const factor = -3.0/2.0*cMax[0]*log( r )/(dMax[0]*dMax[0]*dMax[0]); + sigma[0] = factor*(xLocal[0]-xMax[0])*(xLocal[0]-xMax[0]); + } + if( xLocal[1] < xMin[1] ) + { + real32 const factor = -3.0/2.0*cMin[1]*log( r )/(dMin[1]*dMin[1]*dMin[1]); + sigma[1] = factor*(xLocal[1]-xMin[1])*(xLocal[1]-xMin[1]); + } + else if( xLocal[1] > xMax[1] ) + { + real32 const factor = -3.0/2.0*cMax[1]*log( r )/(dMax[1]*dMax[1]*dMax[1]); + sigma[1] = factor*(xLocal[1]-xMax[1])*(xLocal[1]-xMax[1]); + } + if( xLocal[2] < xMin[2] ) + { + real32 const factor = -3.0/2.0*cMin[2]*log( r )/(dMin[2]*dMin[2]*dMin[2]); + sigma[2] = factor*(xLocal[2]-xMin[2])*(xLocal[2]-xMin[2]); + } + else if( xLocal[2] > xMax[2] ) + { + real32 const factor = -3.0/2.0*cMax[2]*log( r )/(dMax[2]*dMax[2]*dMax[2]); + sigma[2] = factor*(xLocal[2]-xMax[2])*(xLocal[2]-xMax[2]); + } + } + }; + + template< typename FE_TYPE > + struct PMLKernel + { + + PMLKernel( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the computation of field gradients and divergence for PML region + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] targetSet list of cells in the target set + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemToNodes constant array view of map from element to nodes + * @param[in] velocity cell-wise velocity + * @param[in] p_n pressure field at time n + * @param[in] v_n PML auxiliary field at time n + * @param[in] u_n PML auxiliary field at time n + * @param[in] xMin coordinate limits of the inner PML boundaries, left-front-top + * @param[in] xMax coordinate limits of the inner PML boundaries, right-back-bottom + * @param[in] dMin PML thickness, left-front-top + * @param[in] dMax PML thickness, right-back-bottom + * @param[in] cMin PML wave speed, left-front-top + * @param[in] cMax PML wave speed, right-back-bottom + * @param[in] r desired reflectivity of the PML + * @param[out] grad_n array holding the gradients at time n + * @param[out] divV_n array holding the divergence at time n + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + launch( SortedArrayView< localIndex const > const targetSet, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + traits::ViewTypeConst< CellElementSubRegion::NodeMapType > const elemToNodes, + arrayView1d< real32 const > const velocity, + arrayView1d< real32 const > const p_n, + arrayView2d< real32 const > const v_n, + arrayView1d< real32 const > const u_n, + real32 const (&xMin)[3], + real32 const (&xMax)[3], + real32 const (&dMin)[3], + real32 const (&dMax)[3], + real32 const (&cMin)[3], + real32 const (&cMax)[3], + real32 const r, + arrayView2d< real32 > const grad_n, + arrayView1d< real32 > const divV_n ) + { + /// Loop over elements in the subregion, 'l' is the element index within the target set + forAll< EXEC_POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const l ) + { + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + + /// global element index + localIndex const k = targetSet[l]; + + /// wave speed at the element + real32 const c = velocity[k]; + + /// coordinates of the element nodes + real64 xLocal[ numNodesPerElem ][ 3 ]; + real32 xLocal32[ numNodesPerElem ][ 3 ]; + + /// local arrays to store the pressure at all nodes and its gradient at a given node + real64 pressure[ numNodesPerElem ]; + real64 pressureGrad[ 3 ]; + + /// local arrays to store the PML vectorial auxiliary variable at all nodes and its gradient at a given node + real64 auxV[3][ numNodesPerElem ]; + real64 auxVGrad[3][3]; + + /// local arrays to store the PML scalar auxiliary variable at all nodes and its gradient at a given node + real64 auxU[ numNodesPerElem ]; + real64 auxUGrad[3]; + + /// local array to store the PML damping profile + real32 sigma[ 3 ]; + + /// copy from global to local arrays + for( localIndex i=0; i( k, i, xLocal, gradN ); + GEOS_UNUSED_VAR ( detJ ); + + /// compute the gradient of the pressure and the PML auxiliary variables at the node + m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, pressure, pressureGrad ); + m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, auxU, auxUGrad ); + for( int j=0; j<3; ++j ) + { + m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, auxV[j], auxVGrad[j] ); + } + + /// compute the PML damping profile + ComputeDamping::computeDampingProfile( + xLocal32[i], + xMin, + xMax, + dMin, + dMax, + cMin, + cMax, + r, + sigma ); + + /// compute B.pressureGrad - C.auxUGrad where B and C are functions of the damping profile + /// WARNING: the division by 'numNodesPerElem' below is needed because the average of + /// gradient and divergence at the nodes are sought. It is the number of cells contributing + /// to each node that is needed. In this case, it is equal to 'numNodesPerElem'. For high-order + /// SEM, this approach won't work and the average needs to be computed differently (maybe using counters). + real32 localIncrementArray[3]; + localIncrementArray[0] = (sigma[0]-sigma[1]-sigma[2])*pressureGrad[0] - (sigma[1]*sigma[2])*auxUGrad[0]; + localIncrementArray[1] = (sigma[1]-sigma[0]-sigma[2])*pressureGrad[1] - (sigma[0]*sigma[2])*auxUGrad[1]; + localIncrementArray[2] = (sigma[2]-sigma[0]-sigma[1])*pressureGrad[2] - (sigma[0]*sigma[1])*auxUGrad[2]; + for( int j=0; j<3; ++j ) + { + RAJA::atomicAdd< ATOMIC_POLICY >( &grad_n[elemToNodes( k, i )][j], localIncrementArray[j]/numNodesPerElem ); + } + /// compute beta.pressure + gamma.u - c^2 * divV where beta and gamma are functions of the damping profile + real32 const beta = sigma[0]*sigma[1]+sigma[0]*sigma[2]+sigma[1]*sigma[2]; + real32 const gamma = sigma[0]*sigma[1]*sigma[2]; + real32 const localIncrement = beta*p_n[elemToNodes( k, i )] + + gamma*u_n[elemToNodes( k, i )] + - c*c*( auxVGrad[0][0] + auxVGrad[1][1] + auxVGrad[2][2] ); + + RAJA::atomicAdd< ATOMIC_POLICY >( &divV_n[elemToNodes( k, i )], localIncrement/numNodesPerElem ); + } + } ); + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + }; + + + template< typename FE_TYPE > + struct waveSpeedPMLKernel + { + + waveSpeedPMLKernel( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the computation of average wave speeds in the PML region + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] targetSet list of cells in the target set + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemToNodes constant array view of map from element to nodes + * @param[in] velocity cell-wise velocity + * @param[in] xMin coordinate limits of the inner PML boundaries, left-front-top + * @param[in] xMax coordinate limits of the inner PML boundaries, right-back-bottom + * @param[out] cMin PML wave speed, left-front-top + * @param[out] cMax PML wave speed, right-back-bottom + * @param[out] counterMin PML wave speed counter, left-front-top + * @param[out] counterMax PML wave speed counter, left-front-top + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + launch( SortedArrayView< localIndex const > const targetSet, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + traits::ViewTypeConst< CellElementSubRegion::NodeMapType > const elemToNodes, + arrayView1d< real32 const > const velocity, + real32 const (&xMin)[3], + real32 const (&xMax)[3], + real32 (& cMin)[3], + real32 (& cMax)[3], + int (& counterMin)[3], + int (& counterMax)[3] ) + { + + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedLeft( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedRight( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedFront( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedBack( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedTop( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedBottom( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterLeft( 0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterRight( 0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterFront( 0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterBack( 0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterTop( 0 ); + RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterBottom( 0 ); + + /// Loop over elements in the subregion, 'l' is the element index within the target set + forAll< EXEC_POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const l ) + { + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + + /// global element index + localIndex const k = targetSet[l]; + + /// wave speed at the element + real32 const c = velocity[k]; + + /// coordinates of the element center + real64 xLocal[ 3 ] = {0.0, 0.0, 0.0}; + + /// compute the coordinates of the element center + for( int j=0; j<3; ++j ) + { + for( localIndex i=0; i= xMin[1] && xLocal[1] <= xMax[1] + && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) + { + subRegionAvgWaveSpeedLeft += c; + subRegionAvgWaveSpeedCounterLeft += 1; + } + else if( xLocal[0] > xMax[0] + && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] + && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) + { + subRegionAvgWaveSpeedRight += c; + subRegionAvgWaveSpeedCounterRight += 1; + } + if( xLocal[1] < xMin[1] + && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] + && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) + { + subRegionAvgWaveSpeedFront += c; + subRegionAvgWaveSpeedCounterFront += 1; + } + else if( xLocal[1] > xMax[1] + && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] + && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) + { + subRegionAvgWaveSpeedBack += c; + subRegionAvgWaveSpeedCounterBack += 1; + } + if( xLocal[2] < xMin[2] + && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] + && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] ) + { + subRegionAvgWaveSpeedTop += c; + subRegionAvgWaveSpeedCounterTop += 1; + } + else if( xLocal[2] > xMax[2] + && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] + && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] ) + { + subRegionAvgWaveSpeedBottom += c; + subRegionAvgWaveSpeedCounterBottom += 1; + } + } ); + + /// transfer local results to global variables + cMin[0]+=subRegionAvgWaveSpeedLeft.get(); + cMin[1]+=subRegionAvgWaveSpeedFront.get(); + cMin[2]+=subRegionAvgWaveSpeedTop.get(); + cMax[0]+=subRegionAvgWaveSpeedRight.get(); + cMax[1]+=subRegionAvgWaveSpeedBack.get(); + cMax[2]+=subRegionAvgWaveSpeedBottom.get(); + counterMin[0]+=subRegionAvgWaveSpeedCounterLeft.get(); + counterMin[1]+=subRegionAvgWaveSpeedCounterFront.get(); + counterMin[2]+=subRegionAvgWaveSpeedCounterTop.get(); + counterMax[0]+=subRegionAvgWaveSpeedCounterRight.get(); + counterMax[1]+=subRegionAvgWaveSpeedCounterBack.get(); + counterMax[2]+=subRegionAvgWaveSpeedCounterBottom.get(); + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + }; + + +}; + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICPMLSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp index 82f6e566537..fef341ef1a4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp @@ -28,6 +28,8 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "WaveSolverUtils.hpp" #include "AcousticTimeSchemeSEMKernel.hpp" +#include "AcousticMatricesSEMKernel.hpp" +#include "AcousticPMLSEMKernel.hpp" namespace geos { @@ -295,24 +297,51 @@ void AcousticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() { using FE_TYPE = TYPEOFREF( finiteElement ); - acousticWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); - kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - nodeCoords, - elemsToNodes, - velocity, - density, - mass ); - - acousticWaveEquationSEMKernels::DampingMatrixKernel< FE_TYPE > kernelD( finiteElement ); - kernelD.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - nodeCoords, - elemsToFaces, - facesToNodes, - facesDomainBoundaryIndicator, - freeSurfaceFaceIndicator, - velocity, - density, - damping ); + // acousticWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); + // kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + // nodeCoords, + // elemsToNodes, + // velocity, + // density, + // mass ); + + AcousticMatricesSEM::MassMatrix< FE_TYPE > kernelM( finiteElement ); + kernelM.template computeMassMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToNodes, + velocity, + density, + mass ); + + AcousticMatricesSEM::DampingMatrix< FE_TYPE > kernelD( finiteElement ); + kernelD.template computeDampingMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToFaces, + facesToNodes, + facesDomainBoundaryIndicator, + freeSurfaceFaceIndicator, + velocity, + density, + damping ); + + //AcousticMatricesSEM::computeDampingMatrix(finiteElement, + // elementSubRegion.size(), + // + // + // + // + // + // + // nodeCoords, + // elemsToFaces, + // facesToNodes, + // facesDomainBoundaryIndicator, + // freeSurfaceFaceIndicator, + // velocity, + // density, + //damping ); + + } ); } ); @@ -566,7 +595,7 @@ void AcousticWaveEquationSEM::initializePML() { using FE_TYPE = TYPEOFREF( finiteElement ); - acousticWaveEquationSEMKernels:: + AcousticPMLSEM:: waveSpeedPMLKernel< FE_TYPE > kernel( finiteElement ); kernel.template launch< EXEC_POLICY, ATOMIC_POLICY > ( targetSet, @@ -714,7 +743,7 @@ void AcousticWaveEquationSEM::applyPML( real64 const time, DomainPartition & dom using FE_TYPE = TYPEOFREF( finiteElement ); /// apply the PML kernel - acousticWaveEquationSEMKernels:: + AcousticPMLSEM:: PMLKernel< FE_TYPE > kernel( finiteElement ); kernel.template launch< EXEC_POLICY, ATOMIC_POLICY > ( targetSet, @@ -1005,7 +1034,7 @@ void AcousticWaveEquationSEM::computeUnknowns( real64 const & time_n, xLocal[i] = nodeCoords32[a][i]; } - acousticWaveEquationSEMKernels::PMLKernelHelper::computeDampingProfilePML( + AcousticPMLSEM::ComputeDamping::computeDampingProfile( xLocal, xMin, xMax, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp index a0179b278d9..fbb7ba7ea58 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp @@ -183,492 +183,6 @@ struct PrecomputeSourceAndReceiverKernel } }; -template< typename FE_TYPE > -struct MassMatrixKernel -{ - - MassMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the mass matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of faces per element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToNodes map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[in] density cell-wise density - * @param[out] mass diagonal of the mass matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, - arrayView1d< real32 const > const velocity, - arrayView1d< real32 const > const density, - arrayView1d< real32 > const mass ) - - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - - real32 const invC2 = 1.0 / ( density[e] * pow( velocity[e], 2 ) ); - // only the eight corners of the mesh cell are needed to compute the Jacobian - real64 xLocal[ 8 ][ 3 ]; - for( localIndex a = 0; a < 8; ++a ) - { - localIndex const nodeIndex = elemsToNodes( e, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( localIndex i = 0; i < 3; ++i ) - { - xLocal[a][i] = nodeCoords( nodeIndex, i ); - } - } - constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; - for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) - { - real32 const localIncrement = invC2 * m_finiteElement.computeMassTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes( e, q )], localIncrement ); - } - } ); // end loop over element - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -template< typename FE_TYPE > -struct DampingMatrixKernel -{ - - DampingMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the damping matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToFaces map from elements to faces - * @param[in] facesToNodes map from face to nodes - * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise - * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise - * @param[in] velocity cell-wise velocity - * @param[in] density cell-wise density - * @param[out] damping diagonal of the damping matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const > const elemsToFaces, - ArrayOfArraysView< localIndex const > const facesToNodes, - arrayView1d< integer const > const facesDomainBoundaryIndicator, - arrayView1d< localIndex const > const freeSurfaceFaceIndicator, - arrayView1d< real32 const > const velocity, - arrayView1d< real32 const > const density, - arrayView1d< real32 > const damping ) - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) - { - localIndex const f = elemsToFaces( e, i ); - // face on the domain boundary and not on free surface - if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) - { - // only the four corners of the mesh face are needed to compute the Jacobian - real64 xLocal[ 4 ][ 3 ]; - for( localIndex a = 0; a < 4; ++a ) - { - localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); - for( localIndex d = 0; d < 3; ++d ) - { - xLocal[a][d] = nodeCoords( nodeIndex, d ); - } - } - real32 const alpha = 1.0 / (density[e] * velocity[e]); - constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; - for( localIndex q = 0; q < numNodesPerFace; ++q ) - { - real32 const localIncrement = alpha * m_finiteElement.computeDampingTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &damping[facesToNodes( f, q )], localIncrement ); - } - } - } - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -struct PMLKernelHelper -{ - /** - * @brief Compute the damping profile for the Perfectly Matched Layer (PML) - * @param xLocal a given x-y-z coordinates (3-components array) - * @param xMin coordinate limits of the inner PML boundaries, left-front-top - * @param xMax coordinate limits of the inner PML boundaries, right-back-bottom - * @param dMin PML thickness, left-front-top - * @param dMax PML thickness, right-back-bottom - * @param cMin PML wave speed, left-front-top - * @param cMax PML wave speed, right-back-bottom - * @param r desired reflectivity of the PML - * @param sigma 3-components array to hold the damping profile in each direction - */ - GEOS_HOST_DEVICE - inline - static void computeDampingProfilePML( real32 const (&xLocal)[3], - real32 const (&xMin)[3], - real32 const (&xMax)[3], - real32 const (&dMin)[3], - real32 const (&dMax)[3], - real32 const (&cMin)[3], - real32 const (&cMax)[3], - real32 const r, - real32 (& sigma)[3] ) - { - - sigma[0] = 0; - sigma[1] = 0; - sigma[2] = 0; - - if( xLocal[0] < xMin[0] ) - { - real32 const factor = -3.0/2.0*cMin[0]*log( r )/(dMin[0]*dMin[0]*dMin[0]); - sigma[0] = factor*(xLocal[0]-xMin[0])*(xLocal[0]-xMin[0]); - } - else if( xLocal[0] > xMax[0] ) - { - real32 const factor = -3.0/2.0*cMax[0]*log( r )/(dMax[0]*dMax[0]*dMax[0]); - sigma[0] = factor*(xLocal[0]-xMax[0])*(xLocal[0]-xMax[0]); - } - if( xLocal[1] < xMin[1] ) - { - real32 const factor = -3.0/2.0*cMin[1]*log( r )/(dMin[1]*dMin[1]*dMin[1]); - sigma[1] = factor*(xLocal[1]-xMin[1])*(xLocal[1]-xMin[1]); - } - else if( xLocal[1] > xMax[1] ) - { - real32 const factor = -3.0/2.0*cMax[1]*log( r )/(dMax[1]*dMax[1]*dMax[1]); - sigma[1] = factor*(xLocal[1]-xMax[1])*(xLocal[1]-xMax[1]); - } - if( xLocal[2] < xMin[2] ) - { - real32 const factor = -3.0/2.0*cMin[2]*log( r )/(dMin[2]*dMin[2]*dMin[2]); - sigma[2] = factor*(xLocal[2]-xMin[2])*(xLocal[2]-xMin[2]); - } - else if( xLocal[2] > xMax[2] ) - { - real32 const factor = -3.0/2.0*cMax[2]*log( r )/(dMax[2]*dMax[2]*dMax[2]); - sigma[2] = factor*(xLocal[2]-xMax[2])*(xLocal[2]-xMax[2]); - } - } -}; - -template< typename FE_TYPE > -struct PMLKernel -{ - - PMLKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the computation of field gradients and divergence for PML region - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] targetSet list of cells in the target set - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemToNodes constant array view of map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[in] p_n pressure field at time n - * @param[in] v_n PML auxiliary field at time n - * @param[in] u_n PML auxiliary field at time n - * @param[in] xMin coordinate limits of the inner PML boundaries, left-front-top - * @param[in] xMax coordinate limits of the inner PML boundaries, right-back-bottom - * @param[in] dMin PML thickness, left-front-top - * @param[in] dMax PML thickness, right-back-bottom - * @param[in] cMin PML wave speed, left-front-top - * @param[in] cMax PML wave speed, right-back-bottom - * @param[in] r desired reflectivity of the PML - * @param[out] grad_n array holding the gradients at time n - * @param[out] divV_n array holding the divergence at time n - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( SortedArrayView< localIndex const > const targetSet, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - traits::ViewTypeConst< CellElementSubRegion::NodeMapType > const elemToNodes, - arrayView1d< real32 const > const velocity, - arrayView1d< real32 const > const p_n, - arrayView2d< real32 const > const v_n, - arrayView1d< real32 const > const u_n, - real32 const (&xMin)[3], - real32 const (&xMax)[3], - real32 const (&dMin)[3], - real32 const (&dMax)[3], - real32 const (&cMin)[3], - real32 const (&cMax)[3], - real32 const r, - arrayView2d< real32 > const grad_n, - arrayView1d< real32 > const divV_n ) - { - /// Loop over elements in the subregion, 'l' is the element index within the target set - forAll< EXEC_POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const l ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - - /// global element index - localIndex const k = targetSet[l]; - - /// wave speed at the element - real32 const c = velocity[k]; - - /// coordinates of the element nodes - real64 xLocal[ numNodesPerElem ][ 3 ]; - real32 xLocal32[ numNodesPerElem ][ 3 ]; - - /// local arrays to store the pressure at all nodes and its gradient at a given node - real64 pressure[ numNodesPerElem ]; - real64 pressureGrad[ 3 ]; - - /// local arrays to store the PML vectorial auxiliary variable at all nodes and its gradient at a given node - real64 auxV[3][ numNodesPerElem ]; - real64 auxVGrad[3][3]; - - /// local arrays to store the PML scalar auxiliary variable at all nodes and its gradient at a given node - real64 auxU[ numNodesPerElem ]; - real64 auxUGrad[3]; - - /// local array to store the PML damping profile - real32 sigma[ 3 ]; - - /// copy from global to local arrays - for( localIndex i=0; i( k, i, xLocal, gradN ); - GEOS_UNUSED_VAR ( detJ ); - - /// compute the gradient of the pressure and the PML auxiliary variables at the node - m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, pressure, pressureGrad ); - m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, auxU, auxUGrad ); - for( int j=0; j<3; ++j ) - { - m_finiteElement.template gradient< numNodesPerElem, GRADIENT_TYPE >( gradN, auxV[j], auxVGrad[j] ); - } - - /// compute the PML damping profile - PMLKernelHelper::computeDampingProfilePML( - xLocal32[i], - xMin, - xMax, - dMin, - dMax, - cMin, - cMax, - r, - sigma ); - - /// compute B.pressureGrad - C.auxUGrad where B and C are functions of the damping profile - /// WARNING: the division by 'numNodesPerElem' below is needed because the average of - /// gradient and divergence at the nodes are sought. It is the number of cells contributing - /// to each node that is needed. In this case, it is equal to 'numNodesPerElem'. For high-order - /// SEM, this approach won't work and the average needs to be computed differently (maybe using counters). - real32 localIncrementArray[3]; - localIncrementArray[0] = (sigma[0]-sigma[1]-sigma[2])*pressureGrad[0] - (sigma[1]*sigma[2])*auxUGrad[0]; - localIncrementArray[1] = (sigma[1]-sigma[0]-sigma[2])*pressureGrad[1] - (sigma[0]*sigma[2])*auxUGrad[1]; - localIncrementArray[2] = (sigma[2]-sigma[0]-sigma[1])*pressureGrad[2] - (sigma[0]*sigma[1])*auxUGrad[2]; - for( int j=0; j<3; ++j ) - { - RAJA::atomicAdd< ATOMIC_POLICY >( &grad_n[elemToNodes( k, i )][j], localIncrementArray[j]/numNodesPerElem ); - } - /// compute beta.pressure + gamma.u - c^2 * divV where beta and gamma are functions of the damping profile - real32 const beta = sigma[0]*sigma[1]+sigma[0]*sigma[2]+sigma[1]*sigma[2]; - real32 const gamma = sigma[0]*sigma[1]*sigma[2]; - real32 const localIncrement = beta*p_n[elemToNodes( k, i )] - + gamma*u_n[elemToNodes( k, i )] - - c*c*( auxVGrad[0][0] + auxVGrad[1][1] + auxVGrad[2][2] ); - - RAJA::atomicAdd< ATOMIC_POLICY >( &divV_n[elemToNodes( k, i )], localIncrement/numNodesPerElem ); - } - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; -}; - - -template< typename FE_TYPE > -struct waveSpeedPMLKernel -{ - - waveSpeedPMLKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the computation of average wave speeds in the PML region - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] targetSet list of cells in the target set - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemToNodes constant array view of map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[in] xMin coordinate limits of the inner PML boundaries, left-front-top - * @param[in] xMax coordinate limits of the inner PML boundaries, right-back-bottom - * @param[out] cMin PML wave speed, left-front-top - * @param[out] cMax PML wave speed, right-back-bottom - * @param[out] counterMin PML wave speed counter, left-front-top - * @param[out] counterMax PML wave speed counter, left-front-top - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( SortedArrayView< localIndex const > const targetSet, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - traits::ViewTypeConst< CellElementSubRegion::NodeMapType > const elemToNodes, - arrayView1d< real32 const > const velocity, - real32 const (&xMin)[3], - real32 const (&xMax)[3], - real32 (& cMin)[3], - real32 (& cMax)[3], - int (& counterMin)[3], - int (& counterMax)[3] ) - { - - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedLeft( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedRight( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedFront( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedBack( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedTop( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real32 > subRegionAvgWaveSpeedBottom( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterLeft( 0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterRight( 0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterFront( 0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterBack( 0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterTop( 0 ); - RAJA::ReduceSum< parallelDeviceReduce, int > subRegionAvgWaveSpeedCounterBottom( 0 ); - - /// Loop over elements in the subregion, 'l' is the element index within the target set - forAll< EXEC_POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const l ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - - /// global element index - localIndex const k = targetSet[l]; - - /// wave speed at the element - real32 const c = velocity[k]; - - /// coordinates of the element center - real64 xLocal[ 3 ] = {0.0, 0.0, 0.0}; - - /// compute the coordinates of the element center - for( int j=0; j<3; ++j ) - { - for( localIndex i=0; i= xMin[1] && xLocal[1] <= xMax[1] - && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) - { - subRegionAvgWaveSpeedLeft += c; - subRegionAvgWaveSpeedCounterLeft += 1; - } - else if( xLocal[0] > xMax[0] - && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] - && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) - { - subRegionAvgWaveSpeedRight += c; - subRegionAvgWaveSpeedCounterRight += 1; - } - if( xLocal[1] < xMin[1] - && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] - && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) - { - subRegionAvgWaveSpeedFront += c; - subRegionAvgWaveSpeedCounterFront += 1; - } - else if( xLocal[1] > xMax[1] - && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] - && xLocal[2] >= xMin[2] && xLocal[2] <= xMax[2] ) - { - subRegionAvgWaveSpeedBack += c; - subRegionAvgWaveSpeedCounterBack += 1; - } - if( xLocal[2] < xMin[2] - && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] - && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] ) - { - subRegionAvgWaveSpeedTop += c; - subRegionAvgWaveSpeedCounterTop += 1; - } - else if( xLocal[2] > xMax[2] - && xLocal[0] >= xMin[0] && xLocal[0] <= xMax[0] - && xLocal[1] >= xMin[1] && xLocal[1] <= xMax[1] ) - { - subRegionAvgWaveSpeedBottom += c; - subRegionAvgWaveSpeedCounterBottom += 1; - } - } ); - - /// transfer local results to global variables - cMin[0]+=subRegionAvgWaveSpeedLeft.get(); - cMin[1]+=subRegionAvgWaveSpeedFront.get(); - cMin[2]+=subRegionAvgWaveSpeedTop.get(); - cMax[0]+=subRegionAvgWaveSpeedRight.get(); - cMax[1]+=subRegionAvgWaveSpeedBack.get(); - cMax[2]+=subRegionAvgWaveSpeedBottom.get(); - counterMin[0]+=subRegionAvgWaveSpeedCounterLeft.get(); - counterMin[1]+=subRegionAvgWaveSpeedCounterFront.get(); - counterMin[2]+=subRegionAvgWaveSpeedCounterTop.get(); - counterMax[0]+=subRegionAvgWaveSpeedCounterRight.get(); - counterMax[1]+=subRegionAvgWaveSpeedCounterBack.get(); - counterMax[2]+=subRegionAvgWaveSpeedCounterBottom.get(); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; -}; - - - /** * @brief Implements kernels for solving the acoustic wave equations * explicit central FD method and SEM diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp index 5a2c9e053b8..cf7a5c0743a 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp @@ -25,6 +25,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "ElasticMatricesSEMKernel.hpp" namespace geos { @@ -317,7 +318,7 @@ void ElasticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGrou /// get the array of indicators: 1 if the face is on the boundary; 0 otherwise arrayView1d< integer const > const & facesDomainBoundaryIndicator = faceManager.getDomainBoundaryIndicator(); - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const X = nodeManager.getField< fields::referencePosition32 >().toViewConst(); + arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords = nodeManager.getField< fields::referencePosition32 >().toViewConst(); arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); /// get face to node map @@ -356,29 +357,29 @@ void ElasticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGrou { using FE_TYPE = TYPEOFREF( finiteElement ); - elasticFirstOrderWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); - - kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - X, - elemsToNodes, - density, - mass ); - - elasticFirstOrderWaveEquationSEMKernels::DampingMatrixKernel< FE_TYPE > kernelD( finiteElement ); - - kernelD.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - X, - elemsToFaces, - facesToNodes, - facesDomainBoundaryIndicator, - freeSurfaceFaceIndicator, - faceNormal, - density, - velocityVp, - velocityVs, - dampingx, - dampingy, - dampingz ); + ElasticMatricesSEM::MassMatrix< FE_TYPE > kernelM( finiteElement ); + + kernelM.template computeMassMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToNodes, + density, + mass ); + + ElasticMatricesSEM::DampingMatrix< FE_TYPE > kernelD( finiteElement ); + + kernelD.template computeDampingMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToFaces, + facesToNodes, + facesDomainBoundaryIndicator, + freeSurfaceFaceIndicator, + faceNormal, + density, + velocityVp, + velocityVs, + dampingx, + dampingy, + dampingz ); } ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp index 8ab22a047d1..c74727935d1 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp @@ -190,140 +190,6 @@ struct PrecomputeSourceAndReceiverKernel } }; -template< typename FE_TYPE > -struct MassMatrixKernel -{ - - MassMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the mass matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of faces per element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToNodes map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[out] mass diagonal of the mass matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, - arrayView1d< real32 const > const density, - arrayView1d< real32 > const mass ) - - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - // only the eight corners of the mesh cell are needed to compute the Jacobian - real64 xLocal[ 8 ][ 3 ]; - for( localIndex a = 0; a < 8; ++a ) - { - localIndex const nodeIndex = elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( localIndex i = 0; i < 3; ++i ) - { - xLocal[a][i] = nodeCoords( nodeIndex, i ); - } - } - - constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; - for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) - { - real32 const localIncrement = density[k] * m_finiteElement.computeMassTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes[k][q]], localIncrement ); - } - } ); // end loop over element - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -template< typename FE_TYPE > -struct DampingMatrixKernel -{ - - DampingMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the damping matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToFaces map from elements to faces - * @param[in] facesToNodes map from face to nodes - * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise - * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise - * @param[in] velocity cell-wise velocity - * @param[out] damping diagonal of the damping matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const > const elemsToFaces, - ArrayOfArraysView< localIndex const > const facesToNodes, - arrayView1d< integer const > const facesDomainBoundaryIndicator, - arrayView1d< localIndex const > const freeSurfaceFaceIndicator, - arrayView2d< real64 const > const faceNormal, - arrayView1d< real32 const > const density, - arrayView1d< real32 const > const velocityVp, - arrayView1d< real32 const > const velocityVs, - arrayView1d< real32 > const dampingx, - arrayView1d< real32 > const dampingy, - arrayView1d< real32 > const dampingz ) - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) - { - localIndex const f = elemsToFaces( e, i ); - // face on the domain boundary and not on free surface - if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) - { - // only the four corners of the mesh face are needed to compute the Jacobian - real64 xLocal[ 4 ][ 3 ]; - for( localIndex a = 0; a < 4; ++a ) - { - localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); - for( localIndex d = 0; d < 3; ++d ) - { - xLocal[a][d] = nodeCoords( nodeIndex, d ); - } - } - - real32 const nx = faceNormal( f, 0 ), ny = faceNormal( f, 1 ), nz = faceNormal( f, 2 ); - constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; - for( localIndex q = 0; q < numNodesPerFace; ++q ) - { - real32 const aux = density[e] * m_finiteElement.computeDampingTerm( q, xLocal ); - real32 const localIncrementx = density[e] * (velocityVp[e] * LvArray::math::abs( nx ) + velocityVs[e] * LvArray::math::sqrt( pow( ny, 2 ) + pow( nz, 2 ) ) ) * aux; - real32 const localIncrementy = density[e] * (velocityVp[e] * LvArray::math::abs( ny ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( nz, 2 ) ) ) * aux; - real32 const localIncrementz = density[e] * (velocityVp[e] * LvArray::math::abs( nz ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( ny, 2 ) ) ) * aux; - - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingx[facesToNodes( f, q )], localIncrementx ); - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingy[facesToNodes( f, q )], localIncrementy ); - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingz[facesToNodes( f, q )], localIncrementz ); - } - } - } - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - template< typename FE_TYPE > struct StressComputation { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticMatricesSEMKernel.hpp new file mode 100644 index 00000000000..8d52ac2dafb --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticMatricesSEMKernel.hpp @@ -0,0 +1,168 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ElasticMatricesSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICMATRICESSEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICMATRICESSEMKERNEL_HPP_ + +namespace geos +{ + +struct ElasticMatricesSEM +{ + template< typename FE_TYPE > + struct MassMatrix + { + + MassMatrix( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the precomputation of the mass matrices + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] numFacesPerElem number of faces per element + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToNodes map from element to nodes + * @param[in] velocity cell-wise velocity + * @param[out] mass diagonal of the mass matrix + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + computeMassMatrix( localIndex const size, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, + arrayView1d< real32 const > const density, + arrayView1d< real32 > const mass ) + + { + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) + { + + // only the eight corners of the mesh cell are needed to compute the Jacobian + real64 xLocal[ 8 ][ 3 ]; + for( localIndex a = 0; a < 8; ++a ) + { + localIndex const nodeIndex = elemsToNodes( e, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( localIndex i = 0; i < 3; ++i ) + { + xLocal[a][i] = nodeCoords( nodeIndex, i ); + } + } + + constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) + { + real32 const localIncrement = density[e] * m_finiteElement.computeMassTerm( q, xLocal ); + RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes( e, q )], localIncrement ); + } + } ); // end loop over element + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + + }; + + template< typename FE_TYPE > + struct DampingMatrix + { + + DampingMatrix( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launches the precomputation of the damping matrices + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToFaces map from elements to faces + * @param[in] facesToNodes map from face to nodes + * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise + * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise + * @param[in] velocity cell-wise velocity + * @param[out] damping diagonal of the damping matrix + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + computeDampingMatrix( localIndex const size, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< localIndex const > const elemsToFaces, + ArrayOfArraysView< localIndex const > const facesToNodes, + arrayView1d< integer const > const facesDomainBoundaryIndicator, + arrayView1d< localIndex const > const freeSurfaceFaceIndicator, + arrayView2d< real64 const > const faceNormal, + arrayView1d< real32 const > const density, + arrayView1d< real32 const > const velocityVp, + arrayView1d< real32 const > const velocityVs, + arrayView1d< real32 > const dampingx, + arrayView1d< real32 > const dampingy, + arrayView1d< real32 > const dampingz ) + { + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) + { + for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) + { + localIndex const f = elemsToFaces( e, i ); + // face on the domain boundary and not on free surface + if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) + { + // only the four corners of the mesh face are needed to compute the Jacobian + real64 xLocal[ 4 ][ 3 ]; + for( localIndex a = 0; a < 4; ++a ) + { + localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); + for( localIndex d = 0; d < 3; ++d ) + { + xLocal[a][d] = nodeCoords( nodeIndex, d ); + } + } + + real32 const nx = faceNormal( f, 0 ), ny = faceNormal( f, 1 ), nz = faceNormal( f, 2 ); + constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; + for( localIndex q = 0; q < numNodesPerFace; ++q ) + { + real32 const aux = density[e] * m_finiteElement.computeDampingTerm( q, xLocal ); + real32 const localIncrementx = aux * ( velocityVp[e] * LvArray::math::abs( nx ) + velocityVs[e] * LvArray::math::sqrt( pow( ny, 2 ) + pow( nz, 2 ) ) ); + real32 const localIncrementy = aux * ( velocityVp[e] * LvArray::math::abs( ny ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( nz, 2 ) ) ); + real32 const localIncrementz = aux * ( velocityVp[e] * LvArray::math::abs( nz ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( ny, 2 ) ) ); + + RAJA::atomicAdd< ATOMIC_POLICY >( &dampingx[facesToNodes( f, q )], localIncrementx ); + RAJA::atomicAdd< ATOMIC_POLICY >( &dampingy[facesToNodes( f, q )], localIncrementy ); + RAJA::atomicAdd< ATOMIC_POLICY >( &dampingz[facesToNodes( f, q )], localIncrementz ); + } + } + } + } ); + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + + }; + + + +}; + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICMATRICESSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp index 4cfb38b666c..823cccfa014 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp @@ -27,6 +27,7 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "WaveSolverUtils.hpp" #include "ElasticTimeSchemeSEMKernel.hpp" +#include "ElasticMatricesSEMKernel.hpp" namespace geos { @@ -401,27 +402,27 @@ void ElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() { using FE_TYPE = TYPEOFREF( finiteElement ); - elasticWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); - kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - nodeCoords, - elemsToNodes, - density, - mass ); - - elasticWaveEquationSEMKernels::DampingMatrixKernel< FE_TYPE > kernelD( finiteElement ); - kernelD.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - nodeCoords, - elemsToFaces, - facesToNodes, - facesDomainBoundaryIndicator, - freeSurfaceFaceIndicator, - faceNormal, - density, - velocityVp, - velocityVs, - dampingx, - dampingy, - dampingz ); + ElasticMatricesSEM::MassMatrix< FE_TYPE > kernelM( finiteElement ); + kernelM.template computeMassMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToNodes, + density, + mass ); + + ElasticMatricesSEM::DampingMatrix< FE_TYPE > kernelD( finiteElement ); + kernelD.template computeDampingMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToFaces, + facesToNodes, + facesDomainBoundaryIndicator, + freeSurfaceFaceIndicator, + faceNormal, + density, + velocityVp, + velocityVs, + dampingx, + dampingy, + dampingz ); } ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp index 78b7292eda7..98a8e1c62dd 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp @@ -304,143 +304,6 @@ struct PrecomputeSourceAndReceiverKernel } }; -template< typename FE_TYPE > -struct MassMatrixKernel -{ - - MassMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the mass matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of faces per element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToNodes map from element to nodes - * @param[in] velocity cell-wise velocity - * @param[out] mass diagonal of the mass matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - //std::enable_if_t< geos::is_sem_formulation< std::remove_cv_t< FE_TYPE_ > >::value, void > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, - arrayView1d< real32 const > const density, - arrayView1d< real32 > const mass ) - - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - - // only the eight corners of the mesh cell are needed to compute the Jacobian - real64 xLocal[ 8 ][ 3 ]; - for( localIndex a = 0; a < 8; ++a ) - { - localIndex const nodeIndex = elemsToNodes( e, FE_TYPE::meshIndexToLinearIndex3D( a ) ); - for( localIndex i = 0; i < 3; ++i ) - { - xLocal[a][i] = nodeCoords( nodeIndex, i ); - } - } - - constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; - for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) - { - real32 const localIncrement = density[e] * m_finiteElement.computeMassTerm( q, xLocal ); - RAJA::atomicAdd< ATOMIC_POLICY >( &mass[elemsToNodes( e, q )], localIncrement ); - } - } ); // end loop over element - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - -template< typename FE_TYPE > -struct DampingMatrixKernel -{ - - DampingMatrixKernel( FE_TYPE const & finiteElement ) - : m_finiteElement( finiteElement ) - {} - - /** - * @brief Launches the precomputation of the damping matrices - * @tparam EXEC_POLICY the execution policy - * @tparam ATOMIC_POLICY the atomic policy - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToFaces map from elements to faces - * @param[in] facesToNodes map from face to nodes - * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise - * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise - * @param[in] velocity cell-wise velocity - * @param[out] damping diagonal of the damping matrix - */ - template< typename EXEC_POLICY, typename ATOMIC_POLICY > - //std::enable_if_t< geos::is_sem_formulation< std::remove_cv_t< FE_TYPE_ > >::value, void > - void - launch( localIndex const size, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView2d< localIndex const > const elemsToFaces, - ArrayOfArraysView< localIndex const > const facesToNodes, - arrayView1d< integer const > const facesDomainBoundaryIndicator, - arrayView1d< localIndex const > const freeSurfaceFaceIndicator, - arrayView2d< real64 const > const faceNormal, - arrayView1d< real32 const > const density, - arrayView1d< real32 const > const velocityVp, - arrayView1d< real32 const > const velocityVs, - arrayView1d< real32 > const dampingx, - arrayView1d< real32 > const dampingy, - arrayView1d< real32 > const dampingz ) - { - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) - { - for( localIndex i = 0; i < elemsToFaces.size( 1 ); ++i ) - { - localIndex const f = elemsToFaces( e, i ); - // face on the domain boundary and not on free surface - if( facesDomainBoundaryIndicator[f] == 1 && freeSurfaceFaceIndicator[f] != 1 ) - { - // only the four corners of the mesh face are needed to compute the Jacobian - real64 xLocal[ 4 ][ 3 ]; - for( localIndex a = 0; a < 4; ++a ) - { - localIndex const nodeIndex = facesToNodes( f, FE_TYPE::meshIndexToLinearIndex2D( a ) ); - for( localIndex d = 0; d < 3; ++d ) - { - xLocal[a][d] = nodeCoords( nodeIndex, d ); - } - } - - real32 const nx = faceNormal( f, 0 ), ny = faceNormal( f, 1 ), nz = faceNormal( f, 2 ); - constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; - for( localIndex q = 0; q < numNodesPerFace; ++q ) - { - real32 const aux = density[e] * m_finiteElement.computeDampingTerm( q, xLocal ); - real32 const localIncrementx = aux * ( velocityVp[e] * LvArray::math::abs( nx ) + velocityVs[e] * LvArray::math::sqrt( pow( ny, 2 ) + pow( nz, 2 ) ) ); - real32 const localIncrementy = aux * ( velocityVp[e] * LvArray::math::abs( ny ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( nz, 2 ) ) ); - real32 const localIncrementz = aux * ( velocityVp[e] * LvArray::math::abs( nz ) + velocityVs[e] * LvArray::math::sqrt( pow( nx, 2 ) + pow( ny, 2 ) ) ); - - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingx[facesToNodes( f, q )], localIncrementx ); - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingy[facesToNodes( f, q )], localIncrementy ); - RAJA::atomicAdd< ATOMIC_POLICY >( &dampingz[facesToNodes( f, q )], localIncrementz ); - } - } - } - } ); - } - - /// The finite element space/discretization object for the element type in the subRegion - FE_TYPE const & m_finiteElement; - -}; - /** * @brief Implements kernels for solving the elastic wave equations * explicit central FD method and SEM From d6fffe4e8a1c6d9c75cbf9998882a3bf7a878013 Mon Sep 17 00:00:00 2001 From: acitrain <60715545+acitrain@users.noreply.github.com> Date: Thu, 4 Apr 2024 16:04:39 +0200 Subject: [PATCH 028/286] Refactor wave solvers: Move sources and receivers routine inside a dedicated file (#3032) --- .../physicsSolvers/CMakeLists.txt | 1 + .../AcousticFirstOrderWaveEquationSEM.cpp | 28 +- ...cousticFirstOrderWaveEquationSEMKernel.hpp | 167 ----- .../AcousticWaveEquationSEM.cpp | 7 +- .../AcousticWaveEquationSEMKernel.hpp | 148 ----- .../ElasticFirstOrderWaveEquationSEM.cpp | 7 +- ...ElasticFirstOrderWaveEquationSEMKernel.hpp | 160 ----- .../ElasticWaveEquationSEM.cpp | 7 +- .../ElasticWaveEquationSEMKernel.hpp | 274 -------- .../PrecomputeSourcesAndReceiversKernel.hpp | 623 ++++++++++++++++++ 10 files changed, 640 insertions(+), 782 deletions(-) create mode 100644 src/coreComponents/physicsSolvers/wavePropagation/PrecomputeSourcesAndReceiversKernel.hpp diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index 06149f32719..d23d07265e6 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -130,6 +130,7 @@ set( physicsSolvers_headers surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp wavePropagation/WaveSolverBase.hpp wavePropagation/WaveSolverUtils.hpp + wavePropagation/PrecomputeSourcesAndReceiversKernel.hpp wavePropagation/AcousticFields.hpp wavePropagation/AcousticWaveEquationSEM.hpp wavePropagation/AcousticWaveEquationSEMKernel.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp index 8e1264038fb..2bbdd46bf1c 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp @@ -27,6 +27,7 @@ #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "AcousticMatricesSEMKernel.hpp" +#include "PrecomputeSourcesAndReceiversKernel.hpp" namespace geos { @@ -212,9 +213,9 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev localIndex const numFacesPerElem = elementSubRegion.numFacesPerElement(); - acousticFirstOrderWaveEquationSEMKernels:: - PrecomputeSourceAndReceiverKernel:: - launch< EXEC_POLICY, FE_TYPE > + PreComputeSourcesAndReceivers:: + Compute1DSourceAndReceiverConstantsWithElementsAndRegionStorage + < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), regionIndex, numFacesPerElem, @@ -296,27 +297,6 @@ void AcousticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGro { using FE_TYPE = TYPEOFREF( finiteElement ); - // acousticFirstOrderWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); - - // kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - // X, - // elemsToNodes, - // velocity, - // density, - // mass ); - - // acousticFirstOrderWaveEquationSEMKernels::DampingMatrixKernel< FE_TYPE > kernelD( finiteElement ); - - // kernelD.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - // X, - // elemsToFaces, - // facesToNodes, - // facesDomainBoundaryIndicator, - // freeSurfaceFaceIndicator, - // velocity, - // damping ); - - AcousticMatricesSEM::MassMatrix< FE_TYPE > kernelM( finiteElement ); kernelM.template computeMassMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), nodeCoords, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp index 9542d0b6cf6..3688f49df86 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp @@ -31,173 +31,6 @@ namespace geos namespace acousticFirstOrderWaveEquationSEMKernels { -struct PrecomputeSourceAndReceiverKernel -{ - - /** - * @brief Launches the precomputation of the source and receiver terms - * @tparam EXEC_POLICY execution policy - * @tparam FE_TYPE finite element type - * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of faces per element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemGhostRank rank of the ghost element - * @param[in] elemsToNodes map from element to nodes - * @param[in] elemsToFaces map from element to faces - * @param[in] elemCenter coordinates of the element centers - * @param[in] faceNormal normal of each faces - * @param[in] faceCenter coordinates of the center of a face - * @param[in] sourceCoordinates coordinates of the source terms - * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not - * @param[out] sourceElem element where a source is located - * @param[out] sourceNodeIds indices of the nodes of the element where the source is located - * @param[out] sourceConstants constant part of the source terms - * @param[in] receiverCoordinates coordinates of the receiver terms - * @param[out] receiverIsLocal flag indicating whether the receiver is local or not - * @param[out] rcvElem element where a receiver is located - * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located - * @param[out] receiverConstants constant part of the receiver term - * @param[out] sourceValue value of the temporal source (eg. Ricker) - * @param[in] dt time-step - * @param[in] timeSourceFrequency the central frequency of the source - * @param[in] timeSourceDelay the time delay of the source - * @param[in] rickerOrder order of the Ricker wavelet - */ - template< typename EXEC_POLICY, typename FE_TYPE > - static void - launch( localIndex const size, - localIndex const regionIndex, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView1d< integer const > const elemGhostRank, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, - arrayView2d< localIndex const > const elemsToFaces, - arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, - arrayView2d< real64 const > const sourceCoordinates, - arrayView1d< localIndex > const sourceIsAccessible, - arrayView1d< localIndex > const sourceElem, - arrayView2d< localIndex > const sourceNodeIds, - arrayView2d< real64 > const sourceConstants, - arrayView1d< localIndex > const sourceRegion, - arrayView2d< real64 const > const receiverCoordinates, - arrayView1d< localIndex > const receiverIsLocal, - arrayView1d< localIndex > const rcvElem, - arrayView2d< localIndex > const receiverNodeIds, - arrayView2d< real64 > const receiverConstants, - arrayView1d< localIndex > const receiverRegion, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - real64 const center[3] = { elemCenter[k][0], - elemCenter[k][1], - elemCenter[k][2] }; - - // Step 1: locate the sources, and precompute the source term - - /// loop over all the source that haven't been found yet - for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) - { - if( sourceIsAccessible[isrc] == 0 ) - { - real64 const coords[3] = { sourceCoordinates[isrc][0], - sourceCoordinates[isrc][1], - sourceCoordinates[isrc][2] }; - - bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - - if( sourceFound ) - { - real64 coordsOnRefElem[3]{}; - - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - - sourceIsAccessible[isrc] = 1; - sourceElem[isrc] = k; - sourceRegion[isrc] = regionIndex; - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - sourceNodeIds[isrc][a] = elemsToNodes[k][a]; - sourceConstants[isrc][a] = Ntest[a]; - } - - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } - } - } - } // end loop over all sources - - - // Step 2: locate the receivers, and precompute the receiver term - - /// loop over all the receivers that haven't been found yet - for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) - { - if( receiverIsLocal[ircv] == 0 ) - { - real64 const coords[3] = { receiverCoordinates[ircv][0], - receiverCoordinates[ircv][1], - receiverCoordinates[ircv][2] }; - - real64 coordsOnRefElem[3]{}; - bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - - if( receiverFound && elemGhostRank[k] < 0 ) - { - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - receiverIsLocal[ircv] = 1; - rcvElem[ircv] = k; - receiverRegion[ircv] = regionIndex; - - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - receiverNodeIds[ircv][a] = elemsToNodes[k][a]; - receiverConstants[ircv][a] = Ntest[a]; - } - } - } - } // end loop over receivers - - } ); - - } -}; - - template< typename FE_TYPE > struct VelocityComputation { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp index fef341ef1a4..a803142b574 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp @@ -30,6 +30,7 @@ #include "AcousticTimeSchemeSEMKernel.hpp" #include "AcousticMatricesSEMKernel.hpp" #include "AcousticPMLSEMKernel.hpp" +#include "PrecomputeSourcesAndReceiversKernel.hpp" namespace geos { @@ -178,9 +179,9 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, { GEOS_MARK_SCOPE( acousticWaveEquationSEMKernels::PrecomputeSourceAndReceiverKernel ); - acousticWaveEquationSEMKernels:: - PrecomputeSourceAndReceiverKernel:: - launch< EXEC_POLICY, FE_TYPE > + PreComputeSourcesAndReceivers:: + Compute1DSourceAndReceiverConstants + < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), numFacesPerElem, nodeCoords32, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp index fbb7ba7ea58..ddf9b731f6f 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp @@ -35,154 +35,6 @@ using namespace fields; namespace acousticWaveEquationSEMKernels { -struct PrecomputeSourceAndReceiverKernel -{ - - /** - * @brief Launches the precomputation of the source and receiver terms - * @tparam EXEC_POLICY execution policy - * @tparam FE_TYPE finite element type - * @param[in] size the number of cells in the subRegion - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemsToNodes map from element to nodes - * @param[in] elemsToFaces map from element to faces - * @param[in] facesToNodes map from faces to nodes - * @param[in] elemCenter coordinates of the element centers - * @param[in] sourceCoordinates coordinates of the source terms - * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not - * @param[out] sourceNodeIds indices of the nodes of the element where the source is located - * @param[out] sourceNodeConstants constant part of the source terms - * @param[in] receiverCoordinates coordinates of the receiver terms - * @param[out] receiverIsLocal flag indicating whether the receiver is local or not - * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located - * @param[out] receiverNodeConstants constant part of the receiver term - */ - template< typename EXEC_POLICY, typename FE_TYPE > - static void - launch( localIndex const size, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView1d< integer const > const elemGhostRank, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, - arrayView2d< localIndex const > const elemsToFaces, - arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, - arrayView2d< real64 const > const sourceCoordinates, - arrayView1d< localIndex > const sourceIsAccessible, - arrayView2d< localIndex > const sourceNodeIds, - arrayView2d< real64 > const sourceConstants, - arrayView2d< real64 const > const receiverCoordinates, - arrayView1d< localIndex > const receiverIsLocal, - arrayView2d< localIndex > const receiverNodeIds, - arrayView2d< real64 > const receiverConstants, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - real64 const center[3] = { elemCenter[k][0], - elemCenter[k][1], - elemCenter[k][2] }; - - // Step 1: locate the sources, and precompute the source term - - /// loop over all the source that haven't been found yet - for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) - { - if( sourceIsAccessible[isrc] == 0 ) - { - real64 const coords[3] = { sourceCoordinates[isrc][0], - sourceCoordinates[isrc][1], - sourceCoordinates[isrc][2] }; - - bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - if( sourceFound ) - { - real64 coordsOnRefElem[3]{}; - - - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - - sourceIsAccessible[isrc] = 1; - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - sourceNodeIds[isrc][a] = elemsToNodes( k, a ); - sourceConstants[isrc][a] = Ntest[a]; - } - - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } - } - } - } // end loop over all sources - - - // Step 2: locate the receivers, and precompute the receiver term - - /// loop over all the receivers that haven't been found yet - for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) - { - if( receiverIsLocal[ircv] == 0 ) - { - real64 const coords[3] = { receiverCoordinates[ircv][0], - receiverCoordinates[ircv][1], - receiverCoordinates[ircv][2] }; - - real64 coordsOnRefElem[3]{}; - bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - - if( receiverFound && elemGhostRank[k] < 0 ) - { - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - - receiverIsLocal[ircv] = 1; - - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - receiverNodeIds[ircv][a] = elemsToNodes( k, a ); - receiverConstants[ircv][a] = Ntest[a]; - } - } - } - } // end loop over receivers - - } ); - - } -}; - /** * @brief Implements kernels for solving the acoustic wave equations * explicit central FD method and SEM diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp index cf7a5c0743a..2e0150b0299 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp @@ -26,6 +26,7 @@ #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "ElasticMatricesSEMKernel.hpp" +#include "PrecomputeSourcesAndReceiversKernel.hpp" namespace geos { @@ -263,9 +264,9 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve localIndex const numFacesPerElem = elementSubRegion.numFacesPerElement(); - elasticFirstOrderWaveEquationSEMKernels:: - PrecomputeSourceAndReceiverKernel:: - launch< EXEC_POLICY, FE_TYPE > + PreComputeSourcesAndReceivers:: + Compute1DSourceAndReceiverConstantsWithElementsAndRegionStorage + < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), regionIndex, numFacesPerElem, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp index c74727935d1..644b7650670 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp @@ -30,166 +30,6 @@ namespace geos namespace elasticFirstOrderWaveEquationSEMKernels { -struct PrecomputeSourceAndReceiverKernel -{ - - /** - * @brief Launches the precomputation of the source and receiver terms - * @tparam EXEC_POLICY execution policy - * @tparam FE_TYPE finite element type - * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of face on an element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemGhostRank array containing the ghost rank - * @param[in] elemsToNodes map from element to nodes - * @param[in] elemsToFaces map from element to faces - * @param[in] elemCenter coordinates of the element centers - * @param[in] faceNormal array containing the normal of all faces - * @param[in] faceCenter array containing the center of all faces - * @param[in] sourceCoordinates coordinates of the source terms - * @param[in] receiverCoordinates coordinates of the receiver terms - * @param[in] dt time-step - * @param[in] timeSourceFrequency Peak frequency of the source - * @param[in] timeSourceDelay the time delay of the source - * @param[in] rickerOrder Order of the Ricker wavelet - * @param[out] sourceNodeIds indices of the nodes of the element where the source is located - * @param[out] sourceConstants constant part of the source terms - * @param[out] receiverIsLocal flag indicating whether the receiver is local or not - * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located - * @param[out] sourceValue array containing the value of the time dependent source (Ricker for e.g) - */ - template< typename EXEC_POLICY, typename FE_TYPE > - static void - launch( localIndex const size, - localIndex const regionIndex, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView1d< integer const > const elemGhostRank, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, - arrayView2d< localIndex const > const elemsToFaces, - arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, - arrayView2d< real64 const > const sourceCoordinates, - arrayView1d< localIndex > const sourceIsAccessible, - arrayView1d< localIndex > const sourceElem, - arrayView2d< localIndex > const sourceNodeIds, - arrayView2d< real64 > const sourceConstants, - arrayView1d< localIndex > const sourceRegion, - arrayView2d< real64 const > const receiverCoordinates, - arrayView1d< localIndex > const receiverIsLocal, - arrayView1d< localIndex > const rcvElem, - arrayView2d< localIndex > const receiverNodeIds, - arrayView2d< real64 > const receiverConstants, - arrayView1d< localIndex > const receiverRegion, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - real64 const center[3] = { elemCenter[k][0], - elemCenter[k][1], - elemCenter[k][2] }; - - // Step 1: locate the sources, and precompute the source term - - /// loop over all the source that haven't been found yet - for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) - { - if( sourceIsAccessible[isrc] == 0 ) - { - real64 const coords[3] = { sourceCoordinates[isrc][0], - sourceCoordinates[isrc][1], - sourceCoordinates[isrc][2] }; - - bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - - if( sourceFound ) - { - real64 coordsOnRefElem[3]{}; - - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - sourceIsAccessible[isrc] = 1; - sourceElem[isrc] = k; - sourceRegion[isrc] = regionIndex; - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - sourceNodeIds[isrc][a] = elemsToNodes[k][a]; - sourceConstants[isrc][a] = Ntest[a]; - } - - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } - - } - } - } // end loop over all sources - - - // Step 2: locate the receivers, and precompute the receiver term - - /// loop over all the receivers that haven't been found yet - for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) - { - if( receiverIsLocal[ircv] == 0 ) - { - real64 const coords[3] = { receiverCoordinates[ircv][0], - receiverCoordinates[ircv][1], - receiverCoordinates[ircv][2] }; - - real64 coordsOnRefElem[3]{}; - bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - if( receiverFound && elemGhostRank[k] < 0 ) - { - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - receiverIsLocal[ircv] = 1; - rcvElem[ircv] = k; - receiverRegion[ircv] = regionIndex; - - real64 Ntest[numNodesPerElem]; - FE_TYPE::calcN( coordsOnRefElem, Ntest ); - - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - receiverNodeIds[ircv][a] = elemsToNodes[k][a]; - receiverConstants[ircv][a] = Ntest[a]; - } - } - } - } // end loop over receivers - } ); - - } -}; - template< typename FE_TYPE > struct StressComputation { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp index 823cccfa014..ad13781738e 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp @@ -28,6 +28,7 @@ #include "WaveSolverUtils.hpp" #include "ElasticTimeSchemeSEMKernel.hpp" #include "ElasticMatricesSEMKernel.hpp" +#include "PrecomputeSourcesAndReceiversKernel.hpp" namespace geos { @@ -278,9 +279,9 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, using FE_TYPE = TYPEOFREF( finiteElement ); localIndex const numFacesPerElem = elementSubRegion.numFacesPerElement(); - elasticWaveEquationSEMKernels:: - PrecomputeSourceAndReceiverKernel:: - launch< EXEC_POLICY, FE_TYPE > + PreComputeSourcesAndReceivers:: + Compute3DSourceAndReceiverConstantsWithDAS + < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), numFacesPerElem, X, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp index 98a8e1c62dd..8518444a746 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp @@ -30,280 +30,6 @@ using namespace fields; namespace elasticWaveEquationSEMKernels { -struct PrecomputeSourceAndReceiverKernel -{ - - /** - * @brief Launches the precomputation of the source and receiver terms - * @tparam EXEC_POLICY execution policy - * @tparam FE_TYPE finite element type - * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of face on an element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemGhostRank array containing the ghost rank - * @param[in] elemsToNodes map from element to nodes - * @param[in] elemsToFaces map from element to faces - * @param[in] elemCenter coordinates of the element centers - * @param[in] faceNormal array containing the normal of all faces - * @param[in] faceCenter array containing the center of all faces - * @param[in] sourceCoordinates coordinates of the source terms - * @param[in] receiverCoordinates coordinates of the receiver terms - * @param[in] dt time-step - * @param[in] timeSourceFrequency Peak frequency of the source - * @param[in] sourceForce force vector of the source - * @param[in] sourceMoment moment (symmetric rank-2 tensor) of the source - * @param[in] useDAS parameter that determines which kind of receiver needs to be modeled (DAS or not, and which type) - * @param[in] linearDASSamples parameter that gives the number of integration points to be used when computing the DAS signal via strain - * integration - * @param[in] linearDASGeometry geometry of the linear DAS receivers, if needed - * @param[in] rickerOrder Order of the Ricker wavelet - * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not - * @param[out] sourceNodeIds indices of the nodes of the element where the source is located - * @param[out] sourceConstantsx constant part of the source terms in x-direction - * @param[out] sourceConstantsy constant part of the source terms in y-direction - * @param[out] sourceConstantsz constant part of the source terms in z-direction - * @param[out] receiverIsLocal flag indicating whether the receiver is local or not - * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located - * @param[out] receiverNodeConstants constant part of the receiver term - * @param[out] sourceValue array containing the value of the time dependent source (Ricker for e.g) - */ - template< typename EXEC_POLICY, typename FE_TYPE > - static void - launch( localIndex const size, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, - arrayView1d< integer const > const elemGhostRank, - arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, - arrayView2d< localIndex const > const elemsToFaces, - arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, - arrayView2d< real64 const > const sourceCoordinates, - arrayView1d< localIndex > const sourceIsAccessible, - arrayView2d< localIndex > const sourceNodeIds, - arrayView2d< real64 > const sourceConstantsx, - arrayView2d< real64 > const sourceConstantsy, - arrayView2d< real64 > const sourceConstantsz, - arrayView2d< real64 const > const receiverCoordinates, - arrayView1d< localIndex > const receiverIsLocal, - arrayView2d< localIndex > const receiverNodeIds, - arrayView2d< real64 > const receiverConstants, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder, - WaveSolverUtils::DASType useDAS, - integer linearDASSamples, - arrayView2d< real64 const > const linearDASGeometry, - R1Tensor const sourceForce, - R2SymTensor const sourceMoment ) - { - constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; - integer nSamples = useDAS == WaveSolverUtils::DASType::none ? 1 : linearDASSamples; - array1d< real64 > const samplePointLocationsA( nSamples ); - arrayView1d< real64 > const samplePointLocations = samplePointLocationsA.toView(); - array1d< real64 > const sampleIntegrationConstantsA( nSamples ); - arrayView1d< real64 > const sampleIntegrationConstants = sampleIntegrationConstantsA.toView(); - - forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - real64 const center[3] = { elemCenter[k][0], - elemCenter[k][1], - elemCenter[k][2] }; - - // Step 1: locate the sources, and precompute the source term - - /// loop over all the source that haven't been found yet - for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) - { - if( sourceIsAccessible[isrc] == 0 ) - { - real64 const coords[3] = { sourceCoordinates[isrc][0], - sourceCoordinates[isrc][1], - sourceCoordinates[isrc][2] }; - - real64 xLocal[numNodesPerElem][3]; - - for( localIndex a=0; a< numNodesPerElem; ++a ) - { - for( localIndex i=0; i<3; ++i ) - { - xLocal[a][i] = nodeCoords( elemsToNodes( k, a ), i ); - } - } - - - bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - - if( sourceFound ) - { - real64 coordsOnRefElem[3]{}; - - - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - sourceIsAccessible[isrc] = 1; - - real64 N[numNodesPerElem]; - real64 gradN[numNodesPerElem][3]; - FE_TYPE::calcN( coordsOnRefElem, N ); - FE_TYPE::calcGradN( coordsOnRefElem, xLocal, gradN ); - R2SymTensor moment = sourceMoment; - for( localIndex q=0; q< numNodesPerElem; ++q ) - { - real64 inc[3] = { 0, 0, 0 }; - sourceNodeIds[isrc][q] = elemsToNodes( k, q ); - inc[0] += sourceForce[0] * N[q]; - inc[1] += sourceForce[1] * N[q]; - inc[2] += sourceForce[2] * N[q]; - - LvArray::tensorOps::Ri_add_symAijBj< 3 >( inc, moment.data, gradN[q] ); - sourceConstantsx[isrc][q] += inc[0]; - sourceConstantsy[isrc][q] += inc[1]; - sourceConstantsz[isrc][q] += inc[2]; - } - - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } - - } - } - } // end loop over all sources - - // Step 2: locate the receivers, and precompute the receiver term - - // for geophones, we need only a point per receiver. - // for DAS, we need multiple points - - /// compute locations of samples along receiver - if( nSamples == 1 ) - { - samplePointLocations[ 0 ] = 0; - } - else - { - for( integer i = 0; i < nSamples; ++i ) - { - samplePointLocations[ i ] = -0.5 + (real64) i / ( linearDASSamples - 1 ); - } - } - - /// compute integration constants of samples - /// for displacement difference (dipole) DAS, take the discrete derivative of the pair of geophones - if( useDAS == WaveSolverUtils::DASType::dipole ) - { - sampleIntegrationConstants[ 0 ] = -1.0; - sampleIntegrationConstants[ 1 ] = 1.0; - } - /// for strain integration DAS, take the average of strains to average strain data - else if( nSamples == 1 ) - { - sampleIntegrationConstants[ 0 ] = 1.0; - } - else - { - for( integer i = 0; i < linearDASSamples; i++ ) - { - sampleIntegrationConstants[ i ] = 1.0 / nSamples; - } - } - - /// loop over all the receivers - for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) - { - R1Tensor receiverCenter = { receiverCoordinates[ ircv ][ 0 ], receiverCoordinates[ ircv ][ 1 ], receiverCoordinates[ ircv ][ 2 ] }; - R1Tensor receiverVector; - if( useDAS == WaveSolverUtils::DASType::none ) - { - receiverVector = { 0, 0, 0 }; - } - else - { - receiverVector = WaveSolverUtils::computeDASVector( linearDASGeometry[ ircv ][ 0 ], linearDASGeometry[ ircv ][ 1 ] ); - } - real64 receiverLength = useDAS == WaveSolverUtils::DASType::none ? 0 : linearDASGeometry[ ircv ][ 2 ]; - /// loop over samples - for( integer iSample = 0; iSample < nSamples; ++iSample ) - { - /// compute sample coordinates and locate the element containing it - real64 const coords[3] = { receiverCenter[ 0 ] + receiverVector[ 0 ] * receiverLength * samplePointLocations[ iSample ], - receiverCenter[ 1 ] + receiverVector[ 1 ] * receiverLength * samplePointLocations[ iSample ], - receiverCenter[ 2 ] + receiverVector[ 2 ] * receiverLength * samplePointLocations[ iSample ] }; - bool const sampleFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - if( sampleFound && elemGhostRank[k] < 0 ) - { - real64 coordsOnRefElem[3]{}; - real64 xLocal[numNodesPerElem][3]; - - for( localIndex a=0; a< numNodesPerElem; ++a ) - { - for( localIndex i=0; i<3; ++i ) - { - xLocal[a][i] = nodeCoords( elemsToNodes( k, a ), i ); - } - } - - WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, - coordsOnRefElem ); - real64 N[numNodesPerElem]; - real64 gradN[numNodesPerElem][3]; - FE_TYPE::calcN( coordsOnRefElem, N ); - FE_TYPE::calcGradN( coordsOnRefElem, xLocal, gradN ); - for( localIndex a = 0; a < numNodesPerElem; ++a ) - { - receiverNodeIds[ircv][iSample * numNodesPerElem + a] = elemsToNodes( k, - a ); - if( useDAS == WaveSolverUtils::DASType::strainIntegration ) - { - receiverConstants[ircv][iSample * numNodesPerElem + a] += ( gradN[a][0] * receiverVector[0] + gradN[a][1] * receiverVector[1] + gradN[a][2] * receiverVector[2] ) * - sampleIntegrationConstants[ iSample ]; - } - else - { - receiverConstants[ircv][iSample * numNodesPerElem + a] += N[a] * sampleIntegrationConstants[ iSample ]; - } - } - receiverIsLocal[ ircv ] = 2; - } - } // end loop over samples - // determine if the current rank is the owner of this receiver - real64 const coords[3] = { receiverCenter[ 0 ], receiverCenter[ 1 ], receiverCenter[ 2 ] }; - bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - if( receiverFound && elemGhostRank[k] < 0 ) - { - receiverIsLocal[ ircv ] = 1; - } - } // end loop over receivers - } ); - - } -}; - /** * @brief Implements kernels for solving the elastic wave equations * explicit central FD method and SEM diff --git a/src/coreComponents/physicsSolvers/wavePropagation/PrecomputeSourcesAndReceiversKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/PrecomputeSourcesAndReceiversKernel.hpp new file mode 100644 index 00000000000..aebc8b92761 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/PrecomputeSourcesAndReceiversKernel.hpp @@ -0,0 +1,623 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file PrecomputeSourcesAndReceiversKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_PRECOMPUTESOURCESANDRECEIVERSKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_PRECOMPUTESOURCESANDRECEIVERSKERNEL_HPP_ + +namespace geos +{ + +struct PreComputeSourcesAndReceivers +{ + + using EXEC_POLICY = parallelDevicePolicy< >; + + /** + * @brief Launches the precomputation of the source and receiver terms for 1D solution (2nd order acoustic) + * @tparam EXEC_POLICY execution policy + * @tparam FE_TYPE finite element type + * @param[in] size the number of cells in the subRegion + * @param[in] numFacesPerElem number of faces per element + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemGhostRank rank of the ghost element + * @param[in] elemsToNodes map from element to nodes + * @param[in] elemsToFaces map from element to faces + * @param[in] elemCenter coordinates of the element centers + * @param[in] faceNormal normal of each faces + * @param[in] faceCenter coordinates of the center of a face + * @param[in] sourceCoordinates coordinates of the source terms + * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not + * @param[out] sourceNodeIds indices of the nodes of the element where the source is located + * @param[out] sourceConstants constant part of the source terms + * @param[in] receiverCoordinates coordinates of the receiver terms + * @param[out] receiverIsLocal flag indicating whether the receiver is local or not + * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located + * @param[out] receiverConstants constant part of the receiver term + * @param[out] sourceValue value of the temporal source (eg. Ricker) + * @param[in] dt time-step + * @param[in] timeSourceFrequency the central frequency of the source + * @param[in] timeSourceDelay the time delay of the source + * @param[in] rickerOrder order of the Ricker wavelet + */ + template< typename EXEC_POLICY, typename FE_TYPE > + static void + Compute1DSourceAndReceiverConstants( localIndex const size, + localIndex const numFacesPerElem, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView1d< integer const > const elemGhostRank, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, + arrayView2d< localIndex const > const elemsToFaces, + arrayView2d< real64 const > const & elemCenter, + arrayView2d< real64 const > const faceNormal, + arrayView2d< real64 const > const faceCenter, + arrayView2d< real64 const > const sourceCoordinates, + arrayView1d< localIndex > const sourceIsAccessible, + arrayView2d< localIndex > const sourceNodeIds, + arrayView2d< real64 > const sourceConstants, + arrayView2d< real64 const > const receiverCoordinates, + arrayView1d< localIndex > const receiverIsLocal, + arrayView2d< localIndex > const receiverNodeIds, + arrayView2d< real64 > const receiverConstants, + arrayView2d< real32 > const sourceValue, + real64 const dt, + real32 const timeSourceFrequency, + real32 const timeSourceDelay, + localIndex const rickerOrder ) + { + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + real64 const center[3] = { elemCenter[k][0], + elemCenter[k][1], + elemCenter[k][2] }; + + // Step 1: locate the sources, and precompute the source term + + /// loop over all the source that haven't been found yet + for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) + { + if( sourceIsAccessible[isrc] == 0 ) + { + real64 const coords[3] = { sourceCoordinates[isrc][0], + sourceCoordinates[isrc][1], + sourceCoordinates[isrc][2] }; + + bool const sourceFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + if( sourceFound ) + { + real64 coordsOnRefElem[3]{}; + + + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + + sourceIsAccessible[isrc] = 1; + real64 Ntest[numNodesPerElem]; + FE_TYPE::calcN( coordsOnRefElem, Ntest ); + + for( localIndex a = 0; a < numNodesPerElem; ++a ) + { + sourceNodeIds[isrc][a] = elemsToNodes( k, a ); + sourceConstants[isrc][a] = Ntest[a]; + } + + for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) + { + sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); + } + } + } + } // end loop over all sources + + + // Step 2: locate the receivers, and precompute the receiver term + + /// loop over all the receivers that haven't been found yet + for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) + { + if( receiverIsLocal[ircv] == 0 ) + { + real64 const coords[3] = { receiverCoordinates[ircv][0], + receiverCoordinates[ircv][1], + receiverCoordinates[ircv][2] }; + + real64 coordsOnRefElem[3]{}; + bool const receiverFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + + if( receiverFound && elemGhostRank[k] < 0 ) + { + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + + receiverIsLocal[ircv] = 1; + + real64 Ntest[numNodesPerElem]; + FE_TYPE::calcN( coordsOnRefElem, Ntest ); + + for( localIndex a = 0; a < numNodesPerElem; ++a ) + { + receiverNodeIds[ircv][a] = elemsToNodes( k, a ); + receiverConstants[ircv][a] = Ntest[a]; + } + } + } + } // end loop over receivers + + } ); + + } + + + /** + * @brief Launches the precomputation of the source and receiver terms with storage of elements and region + * in which the receivers and sources are located + * @tparam EXEC_POLICY execution policy + * @tparam FE_TYPE finite element type + * @param[in] size the number of cells in the subRegion + * @param[in] numFacesPerElem number of faces per element + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemGhostRank rank of the ghost element + * @param[in] elemsToNodes map from element to nodes + * @param[in] elemsToFaces map from element to faces + * @param[in] elemCenter coordinates of the element centers + * @param[in] faceNormal normal of each faces + * @param[in] faceCenter coordinates of the center of a face + * @param[in] sourceCoordinates coordinates of the source terms + * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not + * @param[out] sourceElem element where a source is located + * @param[out] sourceNodeIds indices of the nodes of the element where the source is located + * @param[out] sourceConstants constant part of the source terms + * @param[in] receiverCoordinates coordinates of the receiver terms + * @param[out] receiverIsLocal flag indicating whether the receiver is local or not + * @param[out] rcvElem element where a receiver is located + * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located + * @param[out] receiverConstants constant part of the receiver term + * @param[out] sourceValue value of the temporal source (eg. Ricker) + * @param[in] dt time-step + * @param[in] timeSourceFrequency the central frequency of the source + * @param[in] timeSourceDelay the time delay of the source + * @param[in] rickerOrder order of the Ricker wavelet + */ + template< typename EXEC_POLICY, typename FE_TYPE > + static void + Compute1DSourceAndReceiverConstantsWithElementsAndRegionStorage( localIndex const size, + localIndex const regionIndex, + localIndex const numFacesPerElem, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView1d< integer const > const elemGhostRank, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, + arrayView2d< localIndex const > const elemsToFaces, + arrayView2d< real64 const > const & elemCenter, + arrayView2d< real64 const > const faceNormal, + arrayView2d< real64 const > const faceCenter, + arrayView2d< real64 const > const sourceCoordinates, + arrayView1d< localIndex > const sourceIsAccessible, + arrayView1d< localIndex > const sourceElem, + arrayView2d< localIndex > const sourceNodeIds, + arrayView2d< real64 > const sourceConstants, + arrayView1d< localIndex > const sourceRegion, + arrayView2d< real64 const > const receiverCoordinates, + arrayView1d< localIndex > const receiverIsLocal, + arrayView1d< localIndex > const rcvElem, + arrayView2d< localIndex > const receiverNodeIds, + arrayView2d< real64 > const receiverConstants, + arrayView1d< localIndex > const receiverRegion, + arrayView2d< real32 > const sourceValue, + real64 const dt, + real32 const timeSourceFrequency, + real32 const timeSourceDelay, + localIndex const rickerOrder ) + { + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + real64 const center[3] = { elemCenter[k][0], + elemCenter[k][1], + elemCenter[k][2] }; + + // Step 1: locate the sources, and precompute the source term + + /// loop over all the source that haven't been found yet + for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) + { + if( sourceIsAccessible[isrc] == 0 ) + { + real64 const coords[3] = { sourceCoordinates[isrc][0], + sourceCoordinates[isrc][1], + sourceCoordinates[isrc][2] }; + + bool const sourceFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + + if( sourceFound ) + { + real64 coordsOnRefElem[3]{}; + + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + + sourceIsAccessible[isrc] = 1; + sourceElem[isrc] = k; + sourceRegion[isrc] = regionIndex; + real64 Ntest[numNodesPerElem]; + FE_TYPE::calcN( coordsOnRefElem, Ntest ); + + for( localIndex a = 0; a < numNodesPerElem; ++a ) + { + sourceNodeIds[isrc][a] = elemsToNodes[k][a]; + sourceConstants[isrc][a] = Ntest[a]; + } + + for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) + { + sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); + } + } + } + } // end loop over all sources + + + // Step 2: locate the receivers, and precompute the receiver term + + /// loop over all the receivers that haven't been found yet + for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) + { + if( receiverIsLocal[ircv] == 0 ) + { + real64 const coords[3] = { receiverCoordinates[ircv][0], + receiverCoordinates[ircv][1], + receiverCoordinates[ircv][2] }; + + real64 coordsOnRefElem[3]{}; + bool const receiverFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + + if( receiverFound && elemGhostRank[k] < 0 ) + { + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + receiverIsLocal[ircv] = 1; + rcvElem[ircv] = k; + receiverRegion[ircv] = regionIndex; + + real64 Ntest[numNodesPerElem]; + FE_TYPE::calcN( coordsOnRefElem, Ntest ); + + for( localIndex a = 0; a < numNodesPerElem; ++a ) + { + receiverNodeIds[ircv][a] = elemsToNodes[k][a]; + receiverConstants[ircv][a] = Ntest[a]; + } + } + } + } // end loop over receivers + + } ); + + } + + + + /** + * @brief Launches the precomputation of the source and receiver terms for 3D arrays solution and DAS receiver constants + * computation + * @tparam EXEC_POLICY execution policy + * @tparam FE_TYPE finite element type + * @param[in] size the number of cells in the subRegion + * @param[in] numFacesPerElem number of face on an element + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemGhostRank array containing the ghost rank + * @param[in] elemsToNodes map from element to nodes + * @param[in] elemsToFaces map from element to faces + * @param[in] elemCenter coordinates of the element centers + * @param[in] faceNormal array containing the normal of all faces + * @param[in] faceCenter array containing the center of all faces + * @param[in] sourceCoordinates coordinates of the source terms + * @param[in] receiverCoordinates coordinates of the receiver terms + * @param[in] dt time-step + * @param[in] timeSourceFrequency Peak frequency of the source + * @param[in] sourceForce force vector of the source + * @param[in] sourceMoment moment (symmetric rank-2 tensor) of the source + * @param[in] useDAS parameter that determines which kind of receiver needs to be modeled (DAS or not, and which type) + * @param[in] linearDASSamples parameter that gives the number of integration points to be used when computing the DAS signal via strain + * integration + * @param[in] linearDASGeometry geometry of the linear DAS receivers, if needed + * @param[in] rickerOrder Order of the Ricker wavelet + * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not + * @param[out] sourceNodeIds indices of the nodes of the element where the source is located + * @param[out] sourceConstantsx constant part of the source terms in x-direction + * @param[out] sourceConstantsy constant part of the source terms in y-direction + * @param[out] sourceConstantsz constant part of the source terms in z-direction + * @param[out] receiverIsLocal flag indicating whether the receiver is local or not + * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located + * @param[out] receiverNodeConstants constant part of the receiver term + * @param[out] sourceValue array containing the value of the time dependent source (Ricker for e.g) + */ + template< typename EXEC_POLICY, typename FE_TYPE > + static void + Compute3DSourceAndReceiverConstantsWithDAS( localIndex const size, + localIndex const numFacesPerElem, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView1d< integer const > const elemGhostRank, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, + arrayView2d< localIndex const > const elemsToFaces, + arrayView2d< real64 const > const & elemCenter, + arrayView2d< real64 const > const faceNormal, + arrayView2d< real64 const > const faceCenter, + arrayView2d< real64 const > const sourceCoordinates, + arrayView1d< localIndex > const sourceIsAccessible, + arrayView2d< localIndex > const sourceNodeIds, + arrayView2d< real64 > const sourceConstantsx, + arrayView2d< real64 > const sourceConstantsy, + arrayView2d< real64 > const sourceConstantsz, + arrayView2d< real64 const > const receiverCoordinates, + arrayView1d< localIndex > const receiverIsLocal, + arrayView2d< localIndex > const receiverNodeIds, + arrayView2d< real64 > const receiverConstants, + arrayView2d< real32 > const sourceValue, + real64 const dt, + real32 const timeSourceFrequency, + real32 const timeSourceDelay, + localIndex const rickerOrder, + WaveSolverUtils::DASType useDAS, + integer linearDASSamples, + arrayView2d< real64 const > const linearDASGeometry, + R1Tensor const sourceForce, + R2SymTensor const sourceMoment ) + { + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + integer nSamples = useDAS == WaveSolverUtils::DASType::none ? 1 : linearDASSamples; + array1d< real64 > const samplePointLocationsA( nSamples ); + arrayView1d< real64 > const samplePointLocations = samplePointLocationsA.toView(); + array1d< real64 > const sampleIntegrationConstantsA( nSamples ); + arrayView1d< real64 > const sampleIntegrationConstants = sampleIntegrationConstantsA.toView(); + + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + real64 const center[3] = { elemCenter[k][0], + elemCenter[k][1], + elemCenter[k][2] }; + + // Step 1: locate the sources, and precompute the source term + + /// loop over all the source that haven't been found yet + for( localIndex isrc = 0; isrc < sourceCoordinates.size( 0 ); ++isrc ) + { + if( sourceIsAccessible[isrc] == 0 ) + { + real64 const coords[3] = { sourceCoordinates[isrc][0], + sourceCoordinates[isrc][1], + sourceCoordinates[isrc][2] }; + + real64 xLocal[numNodesPerElem][3]; + + for( localIndex a=0; a< numNodesPerElem; ++a ) + { + for( localIndex i=0; i<3; ++i ) + { + xLocal[a][i] = nodeCoords( elemsToNodes( k, a ), i ); + } + } + + + bool const sourceFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + + if( sourceFound ) + { + real64 coordsOnRefElem[3]{}; + + + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + sourceIsAccessible[isrc] = 1; + + real64 N[numNodesPerElem]; + real64 gradN[numNodesPerElem][3]; + FE_TYPE::calcN( coordsOnRefElem, N ); + FE_TYPE::calcGradN( coordsOnRefElem, xLocal, gradN ); + R2SymTensor moment = sourceMoment; + for( localIndex q=0; q< numNodesPerElem; ++q ) + { + real64 inc[3] = { 0, 0, 0 }; + sourceNodeIds[isrc][q] = elemsToNodes( k, q ); + inc[0] += sourceForce[0] * N[q]; + inc[1] += sourceForce[1] * N[q]; + inc[2] += sourceForce[2] * N[q]; + + LvArray::tensorOps::Ri_add_symAijBj< 3 >( inc, moment.data, gradN[q] ); + sourceConstantsx[isrc][q] += inc[0]; + sourceConstantsy[isrc][q] += inc[1]; + sourceConstantsz[isrc][q] += inc[2]; + } + + for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) + { + sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); + } + + } + } + } // end loop over all sources + + // Step 2: locate the receivers, and precompute the receiver term + + // for geophones, we need only a point per receiver. + // for DAS, we need multiple points + + /// compute locations of samples along receiver + if( nSamples == 1 ) + { + samplePointLocations[ 0 ] = 0; + } + else + { + for( integer i = 0; i < nSamples; ++i ) + { + samplePointLocations[ i ] = -0.5 + (real64) i / ( linearDASSamples - 1 ); + } + } + + /// compute integration constants of samples + /// for displacement difference (dipole) DAS, take the discrete derivative of the pair of geophones + if( useDAS == WaveSolverUtils::DASType::dipole ) + { + sampleIntegrationConstants[ 0 ] = -1.0; + sampleIntegrationConstants[ 1 ] = 1.0; + } + /// for strain integration DAS, take the average of strains to average strain data + else if( nSamples == 1 ) + { + sampleIntegrationConstants[ 0 ] = 1.0; + } + else + { + for( integer i = 0; i < linearDASSamples; i++ ) + { + sampleIntegrationConstants[ i ] = 1.0 / nSamples; + } + } + + /// loop over all the receivers + for( localIndex ircv = 0; ircv < receiverCoordinates.size( 0 ); ++ircv ) + { + R1Tensor receiverCenter = { receiverCoordinates[ ircv ][ 0 ], receiverCoordinates[ ircv ][ 1 ], receiverCoordinates[ ircv ][ 2 ] }; + R1Tensor receiverVector; + if( useDAS == WaveSolverUtils::DASType::none ) + { + receiverVector = { 0, 0, 0 }; + } + else + { + receiverVector = WaveSolverUtils::computeDASVector( linearDASGeometry[ ircv ][ 0 ], linearDASGeometry[ ircv ][ 1 ] ); + } + real64 receiverLength = useDAS == WaveSolverUtils::DASType::none ? 0 : linearDASGeometry[ ircv ][ 2 ]; + /// loop over samples + for( integer iSample = 0; iSample < nSamples; ++iSample ) + { + /// compute sample coordinates and locate the element containing it + real64 const coords[3] = { receiverCenter[ 0 ] + receiverVector[ 0 ] * receiverLength * samplePointLocations[ iSample ], + receiverCenter[ 1 ] + receiverVector[ 1 ] * receiverLength * samplePointLocations[ iSample ], + receiverCenter[ 2 ] + receiverVector[ 2 ] * receiverLength * samplePointLocations[ iSample ] }; + bool const sampleFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + if( sampleFound && elemGhostRank[k] < 0 ) + { + real64 coordsOnRefElem[3]{}; + real64 xLocal[numNodesPerElem][3]; + + for( localIndex a=0; a< numNodesPerElem; ++a ) + { + for( localIndex i=0; i<3; ++i ) + { + xLocal[a][i] = nodeCoords( elemsToNodes( k, a ), i ); + } + } + + WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, + elemsToNodes[k], + nodeCoords, + coordsOnRefElem ); + real64 N[numNodesPerElem]; + real64 gradN[numNodesPerElem][3]; + FE_TYPE::calcN( coordsOnRefElem, N ); + FE_TYPE::calcGradN( coordsOnRefElem, xLocal, gradN ); + for( localIndex a = 0; a < numNodesPerElem; ++a ) + { + receiverNodeIds[ircv][iSample * numNodesPerElem + a] = elemsToNodes( k, + a ); + if( useDAS == WaveSolverUtils::DASType::strainIntegration ) + { + receiverConstants[ircv][iSample * numNodesPerElem + a] += ( gradN[a][0] * receiverVector[0] + gradN[a][1] * receiverVector[1] + gradN[a][2] * receiverVector[2] ) * + sampleIntegrationConstants[ iSample ]; + } + else + { + receiverConstants[ircv][iSample * numNodesPerElem + a] += N[a] * sampleIntegrationConstants[ iSample ]; + } + } + receiverIsLocal[ ircv ] = 2; + } + } // end loop over samples + // determine if the current rank is the owner of this receiver + real64 const coords[3] = { receiverCenter[ 0 ], receiverCenter[ 1 ], receiverCenter[ 2 ] }; + bool const receiverFound = + WaveSolverUtils::locateSourceElement( numFacesPerElem, + center, + faceNormal, + faceCenter, + elemsToFaces[k], + coords ); + if( receiverFound && elemGhostRank[k] < 0 ) + { + receiverIsLocal[ ircv ] = 1; + } + } // end loop over receivers + } ); + + } + +}; + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_PRECOMPUTESOURCESANDRECEIVERSKERNEL_HPP_ From 45725d5f8910a7421edc7c7d10a7e036f5e5db45 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 4 Apr 2024 09:55:38 -0500 Subject: [PATCH 029/286] Minor include cleanup for flow solvers (#3064) --- src/coreComponents/physicsSolvers/SolverBase.cpp | 1 - src/coreComponents/physicsSolvers/SolverBase.hpp | 2 -- .../contact/SolidMechanicsLagrangeContact.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 4 ---- .../fluidFlow/CompositionalMultiphaseBase.hpp | 6 +----- .../physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp | 2 -- .../fluidFlow/CompositionalMultiphaseHybridFVM.cpp | 3 +-- .../fluidFlow/CompositionalMultiphaseHybridFVM.hpp | 1 - .../physicsSolvers/fluidFlow/FlowSolverBase.cpp | 1 - .../physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp | 1 - .../physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp | 3 --- .../multiphysics/CoupledReservoirAndWellsBase.hpp | 1 + .../physicsSolvers/multiphysics/PoromechanicsSolver.hpp | 1 + .../solidMechanics/SolidMechanicsStateReset.cpp | 1 + .../solidMechanics/SolidMechanicsStatistics.cpp | 1 + .../wavePropagation/AcousticElasticWaveEquationSEM.cpp | 1 + 17 files changed, 9 insertions(+), 24 deletions(-) diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index 26738950857..6a71ae08f54 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -16,7 +16,6 @@ #include "PhysicsSolverManager.hpp" #include "common/TimingMacros.hpp" -#include "linearAlgebra/utilities/LinearSolverParameters.hpp" #include "linearAlgebra/solvers/KrylovSolver.hpp" #include "mesh/DomainPartition.hpp" #include "math/interpolation/Interpolation.hpp" diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index af7ff222f37..6e79f0cf05c 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -21,13 +21,11 @@ #include "linearAlgebra/interfaces/InterfaceTypes.hpp" #include "linearAlgebra/utilities/LinearSolverResult.hpp" #include "linearAlgebra/DofManager.hpp" -#include "mesh/DomainPartition.hpp" #include "mesh/MeshBody.hpp" #include "physicsSolvers/NonlinearSolverParameters.hpp" #include "physicsSolvers/LinearSolverParameters.hpp" #include "physicsSolvers/SolverStatistics.hpp" - #include namespace geos diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index 8b665165759..a0ab282a6c2 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -25,7 +25,7 @@ namespace geos { -class SolidMechanicsLagrangianFEM; +class NumericalMethodsManager; class SolidMechanicsLagrangeContact : public ContactSolverBase { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 7f914e12b22..0513f370c70 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -18,8 +18,6 @@ #include "CompositionalMultiphaseBase.hpp" -#include "common/DataTypes.hpp" -#include "common/TimingMacros.hpp" #include "constitutive/ConstitutiveManager.hpp" #include "constitutive/capillaryPressure/CapillaryPressureFields.hpp" #include "constitutive/capillaryPressure/capillaryPressureSelector.hpp" @@ -32,10 +30,8 @@ #include "constitutive/fluid/multifluid/MultiFluidSelector.hpp" #include "constitutive/relativePermeability/RelativePermeabilityFields.hpp" #include "constitutive/relativePermeability/RelativePermeabilitySelector.hpp" -#include "constitutive/solid/SolidBase.hpp" #include "constitutive/solid/SolidInternalEnergy.hpp" #include "constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp" -#include "constitutive/permeability/PermeabilityFields.hpp" #include "fieldSpecification/AquiferBoundaryCondition.hpp" #include "fieldSpecification/EquilibriumInitialCondition.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index 5e5803d3a04..728ab922bfc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -19,12 +19,8 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONALMULTIPHASEBASE_HPP_ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONALMULTIPHASEBASE_HPP_ -#include "common/DataLayouts.hpp" -#include "constitutive/fluid/multifluid/Layouts.hpp" -#include "constitutive/relativePermeability/layouts.hpp" -#include "constitutive/capillaryPressure/layouts.hpp" -#include "fieldSpecification/FieldSpecificationManager.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBase.hpp" +#include "fieldSpecification/FieldSpecificationManager.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index a1da4a86c46..2387a59291b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -18,9 +18,7 @@ #include "CompositionalMultiphaseFVM.hpp" -#include "common/DataTypes.hpp" #include "common/MpiWrapper.hpp" -#include "common/TimingMacros.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/relativePermeability/RelativePermeabilityBase.hpp" #include "constitutive/solid/CoupledSolidBase.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index 431a7320860..b83902dcf0b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -18,7 +18,6 @@ #include "CompositionalMultiphaseHybridFVM.hpp" -#include "common/TimingMacros.hpp" #include "constitutive/ConstitutivePassThru.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/relativePermeability/RelativePermeabilityBase.hpp" @@ -31,7 +30,7 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp" /** * @namespace the geosx namespace that encapsulates the majority of the code diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp index 12e85758df4..428fc115a06 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp @@ -20,7 +20,6 @@ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONALMULTIPHASEHYBRIDFVM_HPP_ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index cd8ed422404..3d38dd95302 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -32,7 +32,6 @@ #include "physicsSolvers/fluidFlow/FluxKernelsHelper.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp" -#include "physicsSolvers/NonlinearSolverParameters.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 24ebda97229..a21e8cc461e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -18,7 +18,6 @@ #include "SinglePhaseHybridFVM.hpp" -#include "common/TimingMacros.hpp" #include "constitutive/ConstitutivePassThru.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "fieldSpecification/AquiferBoundaryCondition.hpp" @@ -28,6 +27,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp" /** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp index 2f124db3319..7ba6c5d6dd6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp @@ -20,7 +20,6 @@ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEHYBRIDFVM_HPP_ #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp index e74bdc9619a..6ad40238385 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp @@ -22,12 +22,9 @@ #include "constitutive/ConstitutivePassThru.hpp" #include "constitutive/fluid/singlefluid/SlurryFluidSelector.hpp" #include "constitutive/fluid/singlefluid/SingleFluidFields.hpp" -#include "constitutive/fluid/singlefluid/SlurryFluidFields.hpp" -#include "constitutive/permeability/PermeabilityFields.hpp" #include "constitutive/solid/CoupledSolidBase.hpp" #include "constitutive/solid/ProppantSolid.hpp" #include "constitutive/solid/porosity/ProppantPorosity.hpp" -#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index e08ccb8ea4a..0a5d2f4eff4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -26,6 +26,7 @@ #include "constitutive/permeability/PermeabilityFields.hpp" #include "constitutive/permeability/PermeabilityBase.hpp" #include "mesh/PerforationFields.hpp" +#include "mesh/DomainPartition.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBase.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index d4b3505373a..b5c05483d87 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -25,6 +25,7 @@ #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "constitutive/solid/CoupledSolidBase.hpp" #include "constitutive/solid/PorousSolid.hpp" +#include "mesh/DomainPartition.hpp" #include "mesh/utilities/AverageOverQuadraturePointsKernel.hpp" #include "codingUtilities/Utilities.hpp" diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index 96179dd8a5c..f77dd4fd535 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -21,6 +21,7 @@ #include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp index ec97b4bc55d..855fb547a3f 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp @@ -23,6 +23,7 @@ #include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "fileIO/Outputs/OutputBase.hpp" +#include "mesh/DomainPartition.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp index 1b3c5d659f8..3686bc52d71 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp @@ -20,6 +20,7 @@ #include "AcousticElasticWaveEquationSEMKernel.hpp" #include "AcoustoElasticTimeSchemeSEMKernel.hpp" #include "dataRepository/Group.hpp" +#include "mesh/DomainPartition.hpp" #include #include From 344c9d9084e8eabe43b7640831606f639302a290 Mon Sep 17 00:00:00 2001 From: MelReyCG <122801580+MelReyCG@users.noreply.github.com> Date: Tue, 9 Apr 2024 22:13:30 +0200 Subject: [PATCH 030/286] PVT & TPL error message rewrite (#2929) Co-authored-by: Randolph Settgast --- host-configs/tpls.cmake | 8 ++++ .../thirdparty/SetupGeosxThirdParty.cmake | 37 +++++++++++++++---- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 9 +++-- .../reactive/ReactiveBrineFluid.cpp | 3 +- .../functions/TableFunction.cpp | 5 ++- 5 files changed, 50 insertions(+), 12 deletions(-) diff --git a/host-configs/tpls.cmake b/host-configs/tpls.cmake index 08e605d79bf..e0a7b0f1146 100644 --- a/host-configs/tpls.cmake +++ b/host-configs/tpls.cmake @@ -3,6 +3,14 @@ # message("in tpls.cmake GEOSX_TPL_DIR=${GEOSX_TPL_DIR}") +# +# General TPL Folder verifications +# +if(NOT EXISTS ${GEOSX_TPL_DIR}) + message(WARNING "'GEOSX_TPL_DIR' does not exist.\n") +endif() + + if(EXISTS ${GEOSX_TPL_DIR}/raja) set(RAJA_DIR ${GEOSX_TPL_DIR}/raja CACHE PATH "" FORCE) endif() diff --git a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake index 2a7529576b7..a3a4edd3f0e 100644 --- a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake +++ b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake @@ -1,7 +1,16 @@ #################################### +# # 3rd Party Dependencies +# +# Setup all GEOS TPL +# #################################### + +################################ +# Helper macros & functions +################################ + macro(find_and_import) set(singleValueArgs NAME HEADER) set(multiValueArgs INCLUDE_DIRECTORIES @@ -101,8 +110,22 @@ macro(extract_version_from_header) endmacro( extract_version_from_header) + +macro(mandatory_tpl_doesnt_exist + CURRENT_TPL_NAME + CURRENT_TPL_DIR_VAR) + + message(FATAL_ERROR + "GEOSX requires ${CURRENT_TPL_NAME}, either :\n" + " - Verify that you provided a valid TPL installation directory (GEOSX_TPL_DIR = \"${GEOSX_TPL_DIR}\"),\n" + " - Or set ${CURRENT_TPL_DIR_VAR} to the ${CURRENT_TPL_NAME} installation directory (${CURRENT_TPL_DIR_VAR} = \"${${CURRENT_TPL_DIR_VAR}}\").\n") + +endmacro(mandatory_tpl_doesnt_exist) + + set(thirdPartyLibs "") + ################################ # BLAS/LAPACK ################################ @@ -184,7 +207,7 @@ if(DEFINED CONDUIT_DIR) set(thirdPartyLibs ${thirdPartyLibs} conduit::conduit) else() - message(FATAL_ERROR "GEOSX requires conduit, set CONDUIT_DIR to the conduit installation directory.") + mandatory_tpl_doesnt_exist("Conduit" CONDUIT_DIR) endif() ################################ @@ -215,7 +238,7 @@ if(DEFINED HDF5_DIR) set(ENABLE_HDF5 ON CACHE BOOL "") set(thirdPartyLibs ${thirdPartyLibs} hdf5) else() - message(FATAL_ERROR "GEOSX requires hdf5, set HDF5_DIR to the hdf5 installation directory.") + mandatory_tpl_doesnt_exist("hdf5" HDF5_DIR) endif() ################################ @@ -259,7 +282,7 @@ if(DEFINED PUGIXML_DIR) set(thirdPartyLibs ${thirdPartyLibs} pugixml) endif() else() - message(FATAL_ERROR "GEOSX requires pugixml, set PUGIXML_DIR to the pugixml installation directory.") + mandatory_tpl_doesnt_exist("pugixml" PUGIXML_DIR) endif() ################################ @@ -291,7 +314,7 @@ if(DEFINED RAJA_DIR) set(ENABLE_RAJA ON CACHE BOOL "") set(thirdPartyLibs ${thirdPartyLibs} RAJA ) else() - message(FATAL_ERROR "GEOSX requires RAJA, set RAJA_DIR to the RAJA installation directory.") + mandatory_tpl_doesnt_exist("RAJA" RAJA_DIR) endif() ################################ @@ -322,7 +345,7 @@ if(DEFINED UMPIRE_DIR) set(ENABLE_UMPIRE ON CACHE BOOL "") set(thirdPartyLibs ${thirdPartyLibs} umpire) else() - message(FATAL_ERROR "GEOSX requires Umpire, set UMPIRE_DIR to the Umpire installation directory.") + mandatory_tpl_doesnt_exist("Umpire" UMPIRE_DIR) endif() @@ -345,7 +368,7 @@ if(DEFINED CHAI_DIR) set(ENABLE_CHAI ON CACHE BOOL "") set(thirdPartyLibs ${thirdPartyLibs} chai) else() - message(FATAL_ERROR "GEOSX requires CHAI, set CHAI_DIR to the CHAI installation directory.") + mandatory_tpl_doesnt_exist("CHAI" CHAI_DIR) endif() ################################ @@ -800,7 +823,7 @@ if(DEFINED FMT_DIR) set(thirdPartyLibs ${thirdPartyLibs} fmt::fmt ) else() - message(FATAL_ERROR "GEOSX requires {fmt}, set FMT_DIR to the {fmt} installation directory.") + mandatory_tpl_doesnt_exist("{fmt}" FMT_DIR) endif() ################################ diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index b30d367dd4c..01e210d20a1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -162,7 +162,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const m_phase1->enthalpy.checkTablesParameters( pressure, temperatureInCelsius ); } catch( SimulationError const & ex ) { - string const errorMsg = GEOS_FMT( "{}: Table input error for phase no. 1.\n", getDataContext() ); + string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", + m_phaseNames[m_p1Index], m_phasePVTParaFiles[m_p1Index] ); throw SimulationError( ex, errorMsg ); } @@ -173,7 +174,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const m_phase2->enthalpy.checkTablesParameters( pressure, temperatureInCelsius ); } catch( SimulationError const & ex ) { - string const errorMsg = GEOS_FMT( "{}: Table input error for phase no. 2.\n", getDataContext() ); + string const errorMsg = GEOS_FMT( "Table input error for {} phase (in table from \"{}\").\n", + m_phaseNames[m_p2Index], m_phasePVTParaFiles[m_p2Index] ); throw SimulationError( ex, errorMsg ); } @@ -182,7 +184,8 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const m_flash->checkTablesParameters( pressure, temperatureInCelsius ); } catch( SimulationError const & ex ) { - string const errorMsg = GEOS_FMT( "{}: Table input error for flash phase.\n", getDataContext() ); + string const errorMsg = GEOS_FMT( "Table input error for flash phase (in table from \"{}\").\n", + m_flashModelParaFile ); throw SimulationError( ex, errorMsg ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index f118a6a6819..93b463ccdd3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -214,7 +214,8 @@ void ReactiveBrineFluid< PHASE >::checkTablesParameters( real64 const pressure, m_phase->enthalpy.checkTablesParameters( pressure, temperatureInCelsius ); } catch( SimulationError const & ex ) { - string const errorMsg = GEOS_FMT( "{}: Table input error.\n", getDataContext() ); + string const errorMsg = GEOS_FMT( "Table input error (in table from {}).\n", + stringutilities::join( m_phasePVTParaFiles ) ); throw SimulationError( ex, errorMsg ); } } diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index 0a8751c28ab..3fa60e36e92 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -177,7 +177,10 @@ void TableFunction::checkCoord( real64 const coord, localIndex const dim ) const real64 const upperBound = m_coordinates[dim][m_coordinates.sizeOfArray( dim ) - 1]; GEOS_THROW_IF( coord > upperBound || coord < lowerBound, GEOS_FMT( "{}: Requested {} is out of the table bounds ( lower bound: {} -> upper bound: {} ).", - getDataContext(), units::formatValue( coord, getDimUnit( dim ) ), lowerBound, upperBound ), + getDataContext(), + units::formatValue( coord, getDimUnit( dim ) ), + units::formatValue( lowerBound, getDimUnit( dim ) ), + units::formatValue( upperBound, getDimUnit( dim ) ) ), SimulationError ); } From 4696a656f7f586c824eb8106341e9af676981362 Mon Sep 17 00:00:00 2001 From: Stefano Frambati Date: Tue, 9 Apr 2024 22:14:35 +0200 Subject: [PATCH 031/286] Fix broken compilation on Pangea3 (#3070) * re-added necessary include * moved include into PySolver --- src/coreComponents/physicsSolvers/python/PySolver.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/coreComponents/physicsSolvers/python/PySolver.cpp b/src/coreComponents/physicsSolvers/python/PySolver.cpp index b4feca82892..8e9cdf0438d 100644 --- a/src/coreComponents/physicsSolvers/python/PySolver.cpp +++ b/src/coreComponents/physicsSolvers/python/PySolver.cpp @@ -5,6 +5,7 @@ #include "PySolver.hpp" #include "dataRepository/python/PyGroupType.hpp" #include "PySolverType.hpp" +#include "mesh/DomainPartition.hpp" #define VERIFY_NON_NULL_SELF( self ) \ PYTHON_ERROR_IF( self == nullptr, PyExc_RuntimeError, "Passed a nullptr as self.", nullptr ) From 65064b0ce78cdab2035d935c93a7317293da05fa Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 18 Apr 2024 17:16:41 -0500 Subject: [PATCH 032/286] Make sequential poromechanics to conserve mass (#2952) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Pavel Tomin <“paveltomin@users.noreply.github.com”> Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Co-authored-by: Randolph R. Settgast Co-authored-by: Nicola Castelletto --- integratedTests | 2 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 86 ++++++++++++++++--- .../fluidFlow/CompositionalMultiphaseBase.hpp | 14 ++- .../CompositionalMultiphaseBaseFields.hpp | 25 ++++-- .../fluidFlow/FlowSolverBase.cpp | 12 +++ .../fluidFlow/FlowSolverBaseFields.hpp | 50 +++++++++-- ...rmalCompositionalMultiphaseBaseKernels.hpp | 37 +++----- .../fluidFlow/SinglePhaseBase.cpp | 83 +++++++++++++++++- .../fluidFlow/SinglePhaseBase.hpp | 23 ++++- .../fluidFlow/SinglePhaseBaseKernels.hpp | 46 ++++------ .../fluidFlow/SinglePhaseFVM.cpp | 8 +- .../fluidFlow/SinglePhaseHybridFVM.cpp | 5 -- ...rmalCompositionalMultiphaseBaseKernels.hpp | 32 +++---- .../ThermalSinglePhaseBaseKernels.hpp | 35 +++----- ...mpositionalMultiphaseReservoirAndWells.hpp | 2 +- .../multiphysics/CoupledSolver.hpp | 8 +- .../multiphysics/PoromechanicsSolver.hpp | 19 ++++ .../SinglePhaseReservoirAndWells.hpp | 2 +- 18 files changed, 341 insertions(+), 148 deletions(-) diff --git a/integratedTests b/integratedTests index 9e5112893b1..671feaaf28d 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit 9e5112893b1fc371c058a4da293771e8e18aee2b +Subproject commit 671feaaf28d51f101144145afa00a6c535669ff1 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 0513f370c70..f023c1a9ec3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -359,10 +359,15 @@ void CompositionalMultiphaseBase::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< dPhaseMobility >( getName() ). reference().resizeDimension< 1, 2 >( m_numPhases, m_numComponents + 2 ); // dP, dT, dC + // needed for time step selector subRegion.registerField< phaseVolumeFraction_n >( getName() ). reference().resizeDimension< 1 >( m_numPhases ); - subRegion.registerField< phaseMobility_n >( getName() ). - reference().resizeDimension< 1 >( m_numPhases ); + + subRegion.registerField< compAmount >( getName() ). + reference().resizeDimension< 1 >( m_numComponents ); + subRegion.registerField< compAmount_n >( getName() ). + reference().resizeDimension< 1 >( m_numComponents ); + } ); FaceManager & faceManager = mesh.getFaceManager(); @@ -697,6 +702,57 @@ void CompositionalMultiphaseBase::updateCapPressureModel( ObjectManagerBase & da } } +void CompositionalMultiphaseBase::updateCompAmount( ElementSubRegionBase & subRegion ) const +{ + GEOS_MARK_FUNCTION; + + string const & solidName = subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ); + CoupledSolidBase const & porousMaterial = getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); + arrayView2d< real64 const > const porosity = porousMaterial.getPorosity(); + arrayView1d< real64 const > const volume = subRegion.getElementVolume(); + arrayView2d< real64 const, compflow::USD_COMP > const compDens = subRegion.getField< fields::flow::globalCompDensity >(); + arrayView2d< real64, compflow::USD_COMP > const compAmount = subRegion.getField< fields::flow::compAmount >(); + + integer const numComp = m_numComponents; + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + for( integer ic = 0; ic < numComp; ++ic ) + { + compAmount[ei][ic] = porosity[ei][0] * volume[ei] * compDens[ei][ic]; + } + } ); +} + +void CompositionalMultiphaseBase::updateEnergy( ElementSubRegionBase & subRegion ) const +{ + GEOS_MARK_FUNCTION; + + string const & solidName = subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ); + CoupledSolidBase const & porousMaterial = getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); + arrayView2d< real64 const > const porosity = porousMaterial.getPorosity(); + arrayView2d< real64 const > rockInternalEnergy = porousMaterial.getInternalEnergy(); + arrayView1d< real64 const > const volume = subRegion.getElementVolume(); + arrayView2d< real64 const, compflow::USD_PHASE > const phaseVolFrac = subRegion.getField< fields::flow::phaseVolumeFraction >(); + string const & fluidName = getConstitutiveName< MultiFluidBase >( subRegion ); + MultiFluidBase & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); + arrayView3d< real64 const, multifluid::USD_PHASE > const phaseDens = fluid.phaseDensity(); + arrayView3d< real64 const, multifluid::USD_PHASE > const phaseInternalEnergy = fluid.phaseInternalEnergy(); + + arrayView1d< real64 > const energy = subRegion.getField< fields::flow::energy >(); + + integer const numPhases = m_numPhases; + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + energy[ei] = volume[ei] * (1.0 - porosity[ei][0]) * rockInternalEnergy[ei][0]; + for( integer ip = 0; ip < numPhases; ++ip ) + { + energy[ei] += volume[ei] * porosity[ei][0] * phaseVolFrac[ei][ip] * phaseDens[ei][0][ip] * phaseInternalEnergy[ei][0][ip]; + } + } ); +} + void CompositionalMultiphaseBase::updateSolidInternalEnergyModel( ObjectManagerBase & dataGroup ) const { arrayView1d< real64 const > const temp = dataGroup.getField< fields::flow::temperature >(); @@ -715,12 +771,13 @@ void CompositionalMultiphaseBase::updateSolidInternalEnergyModel( ObjectManagerB temp ); } -real64 CompositionalMultiphaseBase::updateFluidState( ObjectManagerBase & subRegion ) const +real64 CompositionalMultiphaseBase::updateFluidState( ElementSubRegionBase & subRegion ) const { GEOS_MARK_FUNCTION; updateGlobalComponentFraction( subRegion ); updateFluidModel( subRegion ); + updateCompAmount( subRegion ); real64 const maxDeltaPhaseVolFrac = updatePhaseVolumeFraction( subRegion ); updateRelPermModel( subRegion ); updatePhaseMobility( subRegion ); @@ -768,7 +825,6 @@ void CompositionalMultiphaseBase::initializeFluidState( MeshLevel & mesh, compDens[ei][ic] = totalDens[ei][0] * compFrac[ei][ic]; } } ); - } ); // with initial component densities defined - check if they need to be corrected to avoid zero diags etc @@ -796,6 +852,7 @@ void CompositionalMultiphaseBase::initializeFluidState( MeshLevel & mesh, porousSolid.scaleReferencePorosity( netToGross ); saveConvergedState( subRegion ); // necessary for a meaningful porosity update in sequential schemes updatePorosityAndPermeability( subRegion ); + updateCompAmount( subRegion ); updatePhaseVolumeFraction( subRegion ); // Now, we initialize and update each constitutive model one by one @@ -883,6 +940,8 @@ void CompositionalMultiphaseBase::initializeFluidState( MeshLevel & mesh, SolidInternalEnergy const & solidInternalEnergyMaterial = getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); solidInternalEnergyMaterial.saveConvergedState(); + + updateEnergy( subRegion ); } // Step 4.7: if the diffusion and/or dispersion is/are supported, initialize the two models @@ -1251,19 +1310,13 @@ CompositionalMultiphaseBase::implicitStepSetup( real64 const & GEOS_UNUSED_PARAM updateSolidInternalEnergyModel( subRegion ); } - // after the update, save the new saturation and phase mobilities + // after the update, save the new saturation arrayView2d< real64 const, compflow::USD_PHASE > const phaseVolFrac = subRegion.template getField< fields::flow::phaseVolumeFraction >(); arrayView2d< real64, compflow::USD_PHASE > const phaseVolFrac_n = subRegion.template getField< fields::flow::phaseVolumeFraction_n >(); phaseVolFrac_n.setValues< parallelDevicePolicy<> >( phaseVolFrac ); - arrayView2d< real64 const, compflow::USD_PHASE > const phaseMob = - subRegion.template getField< fields::flow::phaseMobility >(); - arrayView2d< real64, compflow::USD_PHASE > const phaseMob_n = - subRegion.template getField< fields::flow::phaseMobility_n >(); - phaseMob_n.setValues< parallelDevicePolicy<> >( phaseMob ); - } ); } ); } @@ -2381,6 +2434,13 @@ void CompositionalMultiphaseBase::saveConvergedState( ElementSubRegionBase & sub arrayView2d< real64, compflow::USD_COMP > const & compDens_n = subRegion.template getField< fields::flow::globalCompDensity_n >(); compDens_n.setValues< parallelDevicePolicy<> >( compDens ); + + arrayView2d< real64 const, compflow::USD_COMP > const & compAmount = + subRegion.template getField< fields::flow::compAmount >(); + arrayView2d< real64, compflow::USD_COMP > const & compAmount_n = + subRegion.template getField< fields::flow::compAmount_n >(); + compAmount_n.setValues< parallelDevicePolicy<> >( compAmount ); + if( m_isFixedStressPoromechanicsUpdate ) { arrayView2d< real64, compflow::USD_COMP > const & compDens_k = @@ -2438,6 +2498,9 @@ void CompositionalMultiphaseBase::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; + if( m_keepFlowVariablesConstantDuringInitStep ) + return; + real64 maxDeltaPhaseVolFrac = 0.0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, MeshLevel & mesh, @@ -2456,6 +2519,7 @@ void CompositionalMultiphaseBase::updateState( DomainPartition & domain ) if( m_isThermal ) { updateSolidInternalEnergyModel( subRegion ); + updateEnergy( subRegion ); } } ); } ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index 728ab922bfc..594b452f270 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -133,6 +133,18 @@ class CompositionalMultiphaseBase : public FlowSolverBase */ void updateCapPressureModel( ObjectManagerBase & dataGroup ) const; + /** + * @brief Update components mass/moles + * @param subRegion the subregion storing the required fields + */ + void updateCompAmount( ElementSubRegionBase & subRegion ) const; + + /** + * @brief Update energy + * @param subRegion the subregion storing the required fields + */ + void updateEnergy( ElementSubRegionBase & subRegion ) const; + /** * @brief Update all relevant solid internal energy models using current values of temperature * @param dataGroup the group storing the required fields @@ -145,7 +157,7 @@ class CompositionalMultiphaseBase : public FlowSolverBase */ virtual void updatePhaseMobility( ObjectManagerBase & dataGroup ) const = 0; - real64 updateFluidState( ObjectManagerBase & dataGroup ) const; + real64 updateFluidState( ElementSubRegionBase & subRegion ) const; virtual void saveConvergedState( ElementSubRegionBase & subRegion ) const override final; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp index 847126b111b..2c687f7dfb8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp @@ -119,6 +119,7 @@ DECLARE_FIELD( dPhaseMobility, NO_WRITE, "Derivative of phase volume fraction with respect to pressure, temperature, global component density" ); +// this is needed for time step selector DECLARE_FIELD( phaseVolumeFraction_n, "phaseVolumeFraction_n", array2dLayoutPhase, @@ -127,14 +128,6 @@ DECLARE_FIELD( phaseVolumeFraction_n, WRITE_AND_READ, "Phase volume fraction at the previous converged time step" ); -DECLARE_FIELD( phaseMobility_n, - "phaseMobility_n", - array2dLayoutPhase, - 0, - NOPLOT, - WRITE_AND_READ, - "Phase mobility at the previous converged time step" ); - DECLARE_FIELD( phaseOutflux, "phaseOutflux", array2dLayoutPhase, @@ -175,6 +168,22 @@ DECLARE_FIELD( globalCompDensityScalingFactor, NO_WRITE, "Scaling factors for global component densities" ); +DECLARE_FIELD( compAmount, + "compAmount", + array2dLayoutComp, + 0, + LEVEL_0, + WRITE_AND_READ, + "Component amount" ); + +DECLARE_FIELD( compAmount_n, + "compAmount_n", + array2dLayoutComp, + 0, + LEVEL_0, + WRITE_AND_READ, + "Component amount at the previous converged time step" ); + } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 3d38dd95302..a116226a893 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -160,6 +160,11 @@ void FlowSolverBase::registerDataOnMesh( Group & meshBodies ) { subRegion.registerField< fields::flow::temperature_k >( getName() ); // needed for the fixed-stress porosity update } + if( m_isThermal ) + { + subRegion.registerField< fields::flow::energy >( getName() ); + subRegion.registerField< fields::flow::energy_n >( getName() ); + } } ); elemManager.forElementSubRegionsComplete< SurfaceElementSubRegion >( [&]( localIndex const, @@ -218,6 +223,13 @@ void FlowSolverBase::saveConvergedState( ElementSubRegionBase & subRegion ) cons arrayView1d< real64 > const temp_n = subRegion.template getField< fields::flow::temperature_n >(); temp_n.setValues< parallelDevicePolicy<> >( temp ); + if( m_isThermal ) + { + arrayView1d< real64 const > const energy = subRegion.template getField< fields::flow::energy >(); + arrayView1d< real64 > const energy_n = subRegion.template getField< fields::flow::energy_n >(); + energy_n.setValues< parallelDevicePolicy<> >( energy ); + } + if( m_isFixedStressPoromechanicsUpdate ) { arrayView1d< real64 > const pres_k = subRegion.template getField< fields::flow::pressure_k >(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp index 0b17130255f..64ca6c6a682 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp @@ -96,14 +96,6 @@ DECLARE_FIELD( temperature, WRITE_AND_READ, "Temperature" ); -DECLARE_FIELD( faceTemperature, - "faceTemperature", - array1d< real64 >, - 0, - LEVEL_0, - WRITE_AND_READ, - "Face temperature" ); - DECLARE_FIELD( temperature_n, "temperature_n", array1d< real64 >, @@ -116,7 +108,7 @@ DECLARE_FIELD( temperature_k, "temperature_k", array1d< real64 >, 0, - LEVEL_0, + NOPLOT, NO_WRITE, "Temperature at the previous sequential iteration" ); @@ -128,6 +120,14 @@ DECLARE_FIELD( initialTemperature, WRITE_AND_READ, "Initial temperature" ); +DECLARE_FIELD( faceTemperature, + "faceTemperature", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Face temperature" ); + DECLARE_FIELD( netToGross, "netToGross", array1d< real64 >, @@ -240,6 +240,38 @@ DECLARE_FIELD( temperatureScalingFactor, NO_WRITE, "Scaling factors for temperature" ); +DECLARE_FIELD( mass, + "mass", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Mass" ); + +DECLARE_FIELD( mass_n, + "mass_n", + array1d< real64 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Mass at the previous converged time step" ); + +DECLARE_FIELD( energy, + "energy", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Energy" ); + +DECLARE_FIELD( energy_n, + "energy_n", + array1d< real64 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Energy at the previous converged time step" ); + } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp index c5863e9bcad..f0a3c194c5b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp @@ -587,21 +587,17 @@ class ElementBasedAssemblyKernel m_dofNumber( subRegion.getReference< array1d< globalIndex > >( dofKey ) ), m_elemGhostRank( subRegion.ghostRank() ), m_volume( subRegion.getElementVolume() ), - m_porosity_n( solid.getPorosity_n() ), m_porosity( solid.getPorosity() ), m_dPoro_dPres( solid.getDporosity_dPressure() ), m_dCompFrac_dCompDens( subRegion.getField< fields::flow::dGlobalCompFraction_dGlobalCompDensity >() ), - m_phaseVolFrac_n( subRegion.getField< fields::flow::phaseVolumeFraction_n >() ), m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), - m_phaseDens_n( fluid.phaseDensity_n() ), m_phaseDens( fluid.phaseDensity() ), m_dPhaseDens( fluid.dPhaseDensity() ), - m_phaseCompFrac_n( fluid.phaseCompFraction_n() ), m_phaseCompFrac( fluid.phaseCompFraction() ), m_dPhaseCompFrac( fluid.dPhaseCompFraction() ), m_compDens( subRegion.getField< fields::flow::globalCompDensity >() ), - m_compDens_n( subRegion.getField< fields::flow::globalCompDensity_n >() ), + m_compAmount_n( subRegion.getField< fields::flow::compAmount_n >() ), m_localMatrix( localMatrix ), m_localRhs( localRhs ), m_kernelFlags( kernelFlags ) @@ -620,9 +616,6 @@ class ElementBasedAssemblyKernel /// Pore volume at time n+1 real64 poreVolume = 0.0; - /// Pore volume at the previous converged time step - real64 poreVolume_n = 0.0; - /// Derivative of pore volume with respect to pressure real64 dPoreVolume_dPres = 0.0; @@ -663,7 +656,6 @@ class ElementBasedAssemblyKernel { // initialize the pore volume stack.poreVolume = m_volume[ei] * m_porosity[ei][0]; - stack.poreVolume_n = m_volume[ei] * m_porosity_n[ei][0]; stack.dPoreVolume_dPres = m_volume[ei] * m_dPoro_dPres[ei][0]; // set row index and degrees of freedom indices for this element @@ -694,7 +686,7 @@ class ElementBasedAssemblyKernel for( integer ic = 0; ic < numComp; ++ic ) { real64 const compAmount = stack.poreVolume * m_compDens[ei][ic]; - real64 const compAmount_n = stack.poreVolume_n * m_compDens_n[ei][ic]; + real64 const compAmount_n = m_compAmount_n[ei][ic]; stack.localResidual[ic] += compAmount - compAmount_n; @@ -714,15 +706,12 @@ class ElementBasedAssemblyKernel // construct the slices for variables accessed multiple times arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac_n = m_phaseVolFrac_n[ei]; arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseDens_n = m_phaseDens_n[ei][0]; arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseDens = m_phaseDens[ei][0]; arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > phaseCompFrac_n = m_phaseCompFrac_n[ei][0]; arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; @@ -730,11 +719,16 @@ class ElementBasedAssemblyKernel real64 dPhaseAmount_dC[numComp]{}; real64 dPhaseCompFrac_dC[numComp]{}; + // start with old time step values + for( integer ic = 0; ic < numComp; ++ic ) + { + stack.localResidual[ic] = -m_compAmount_n[ei][ic]; + } + // sum contributions to component accumulation from each phase for( integer ip = 0; ip < m_numPhases; ++ip ) { real64 const phaseAmount = stack.poreVolume * phaseVolFrac[ip] * phaseDens[ip]; - real64 const phaseAmount_n = stack.poreVolume_n * phaseVolFrac_n[ip] * phaseDens_n[ip]; real64 const dPhaseAmount_dP = stack.dPoreVolume_dPres * phaseVolFrac[ip] * phaseDens[ip] + stack.poreVolume * ( dPhaseVolFrac[ip][Deriv::dP] * phaseDens[ip] @@ -754,12 +748,11 @@ class ElementBasedAssemblyKernel for( integer ic = 0; ic < numComp; ++ic ) { real64 const phaseCompAmount = phaseAmount * phaseCompFrac[ip][ic]; - real64 const phaseCompAmount_n = phaseAmount_n * phaseCompFrac_n[ip][ic]; real64 const dPhaseCompAmount_dP = dPhaseAmount_dP * phaseCompFrac[ip][ic] + phaseAmount * dPhaseCompFrac[ip][ic][Deriv::dP]; - stack.localResidual[ic] += phaseCompAmount - phaseCompAmount_n; + stack.localResidual[ic] += phaseCompAmount; stack.localJacobian[ic][0] += dPhaseCompAmount_dP; // jc - index of component w.r.t. whose compositional var the derivative is being taken @@ -778,7 +771,7 @@ class ElementBasedAssemblyKernel // call the lambda in the phase loop to allow the reuse of the phase amounts and their derivatives // possible use: assemble the derivatives wrt temperature, and the accumulation term of the energy equation for this phase - phaseAmountKernelOp( ip, phaseAmount, phaseAmount_n, dPhaseAmount_dP, dPhaseAmount_dC ); + phaseAmountKernelOp( ip, phaseAmount, dPhaseAmount_dP, dPhaseAmount_dC ); } } @@ -911,7 +904,6 @@ class ElementBasedAssemblyKernel arrayView1d< real64 const > const m_volume; /// Views on the porosity - arrayView2d< real64 const > const m_porosity_n; arrayView2d< real64 const > const m_porosity; arrayView2d< real64 const > const m_dPoro_dPres; @@ -919,23 +911,22 @@ class ElementBasedAssemblyKernel arrayView3d< real64 const, compflow::USD_COMP_DC > const m_dCompFrac_dCompDens; /// Views on the phase volume fractions - arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFrac_n; arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFrac; arrayView3d< real64 const, compflow::USD_PHASE_DC > const m_dPhaseVolFrac; /// Views on the phase densities - arrayView3d< real64 const, multifluid::USD_PHASE > const m_phaseDens_n; arrayView3d< real64 const, multifluid::USD_PHASE > const m_phaseDens; arrayView4d< real64 const, multifluid::USD_PHASE_DC > const m_dPhaseDens; /// Views on the phase component fraction - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const m_phaseCompFrac_n; arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const m_phaseCompFrac; arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > const m_dPhaseCompFrac; - // Views on component densities + // View on component densities arrayView2d< real64 const, compflow::USD_COMP > m_compDens; - arrayView2d< real64 const, compflow::USD_COMP > m_compDens_n; + + // View on component amount (mass/moles) from previous time step + arrayView2d< real64 const, compflow::USD_COMP > m_compAmount_n; /// View on the local CRS matrix CRSMatrixView< real64, globalIndex const > const m_localMatrix; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 1b344dc0130..4c2538c4d67 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -85,6 +85,9 @@ void SinglePhaseBase::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< mobility >( getName() ); subRegion.registerField< dMobility_dPressure >( getName() ); + subRegion.registerField< fields::flow::mass >( getName() ); + subRegion.registerField< fields::flow::mass_n >( getName() ); + if( m_isThermal ) { subRegion.registerField< dMobility_dTemperature >( getName() ); @@ -244,6 +247,60 @@ void SinglePhaseBase::updateFluidModel( ObjectManagerBase & dataGroup ) const } ); } +void SinglePhaseBase::updateMass( ElementSubRegionBase & subRegion ) const +{ + GEOS_MARK_FUNCTION; + + arrayView1d< real64 > const mass = subRegion.getField< fields::flow::mass >(); + arrayView1d< real64 > const mass_n = subRegion.getField< fields::flow::mass_n >(); + + CoupledSolidBase const & porousSolid = + getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); + arrayView2d< real64 const > const porosity = porousSolid.getPorosity(); + arrayView2d< real64 const > const porosity_n = porousSolid.getPorosity_n(); + + arrayView1d< real64 const > const volume = subRegion.getElementVolume(); + arrayView1d< real64 > const deltaVolume = subRegion.getField< fields::flow::deltaVolume >(); + + SingleFluidBase & fluid = + getConstitutiveModel< SingleFluidBase >( subRegion, subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ) ); + arrayView2d< real64 const > const density = fluid.density(); + arrayView2d< real64 const > const density_n = fluid.density_n(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + mass[ei] = porosity[ei][0] * ( volume[ei] + deltaVolume[ei] ) * density[ei][0]; + if( isZero( mass_n[ei] ) ) // this is a hack for hydrofrac cases + mass_n[ei] = porosity_n[ei][0] * volume[ei] * density_n[ei][0]; // initialize newly created element mass + } ); +} + +void SinglePhaseBase::updateEnergy( ElementSubRegionBase & subRegion ) const +{ + GEOS_MARK_FUNCTION; + + arrayView1d< real64 > const energy = subRegion.getField< fields::flow::energy >(); + + CoupledSolidBase const & porousSolid = + getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); + arrayView2d< real64 const > const porosity = porousSolid.getPorosity(); + arrayView2d< real64 const > const rockInternalEnergy = porousSolid.getInternalEnergy(); + + arrayView1d< real64 const > const volume = subRegion.getElementVolume(); + arrayView1d< real64 > const deltaVolume = subRegion.getField< fields::flow::deltaVolume >(); + + SingleFluidBase & fluid = + getConstitutiveModel< SingleFluidBase >( subRegion, subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ) ); + arrayView2d< real64 const > const density = fluid.density(); + arrayView2d< real64 const > const fluidInternalEnergy = fluid.internalEnergy(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + energy[ei] = ( volume[ei] + deltaVolume[ei] ) * + ( porosity[ei][0] * density[ei][0] * fluidInternalEnergy[ei][0] + ( 1.0 - porosity[ei][0] ) * rockInternalEnergy[ei][0] ); + } ); +} + void SinglePhaseBase::updateSolidInternalEnergyModel( ObjectManagerBase & dataGroup ) const { arrayView1d< real64 const > const temp = dataGroup.getField< fields::flow::temperature >(); @@ -271,9 +328,10 @@ void SinglePhaseBase::updateThermalConductivity( ElementSubRegionBase & subRegio conductivityMaterial.update( porosity ); } -void SinglePhaseBase::updateFluidState( ObjectManagerBase & subRegion ) const +void SinglePhaseBase::updateFluidState( ElementSubRegionBase & subRegion ) const { updateFluidModel( subRegion ); + updateMass( subRegion ); updateMobility( subRegion ); } @@ -388,7 +446,6 @@ void SinglePhaseBase::initializePostInitialConditionsPreSubGroups() SolidInternalEnergy const & solidInternalEnergyMaterial = getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); solidInternalEnergyMaterial.saveConvergedState(); - } } ); @@ -409,16 +466,21 @@ void SinglePhaseBase::initializePostInitialConditionsPreSubGroups() } ); } ); - // Save initial pressure field mesh.getElemManager().forElementSubRegions( regionNames, [&]( localIndex const, ElementSubRegionBase & subRegion ) { + // Save initial pressure field arrayView1d< real64 const > const pres = subRegion.getField< fields::flow::pressure >(); arrayView1d< real64 > const initPres = subRegion.getField< fields::flow::initialPressure >(); arrayView1d< real64 const > const & temp = subRegion.template getField< fields::flow::temperature >(); arrayView1d< real64 > const initTemp = subRegion.template getField< fields::flow::initialTemperature >(); initPres.setValues< parallelDevicePolicy<> >( pres ); initTemp.setValues< parallelDevicePolicy<> >( temp ); + + // finally update mass and energy + updateMass( subRegion ); + if( m_isThermal ) + updateEnergy( subRegion ); } ); } ); @@ -628,6 +690,7 @@ void SinglePhaseBase::implicitStepSetup( real64 const & GEOS_UNUSED_PARAM( time_ { updateSolidInternalEnergyModel( subRegion ); updateThermalConductivity( subRegion ); + updateEnergy( subRegion ); } } ); @@ -1193,6 +1256,9 @@ void SinglePhaseBase::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; + if( m_keepFlowVariablesConstantDuringInitStep ) + return; + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) @@ -1206,6 +1272,7 @@ void SinglePhaseBase::updateState( DomainPartition & domain ) if( m_isThermal ) { updateSolidInternalEnergyModel( subRegion ); + updateEnergy( subRegion ); } } ); } ); @@ -1237,6 +1304,7 @@ void SinglePhaseBase::resetStateToBeginningOfStep( DomainPartition & domain ) if( m_isThermal ) { updateSolidInternalEnergyModel( subRegion ); + updateEnergy( subRegion ); } } ); } ); @@ -1324,4 +1392,13 @@ bool SinglePhaseBase::checkSystemSolution( DomainPartition & domain, return (m_allowNegativePressure || numNegativePressures == 0) ? 1 : 0; } +void SinglePhaseBase::saveConvergedState( ElementSubRegionBase & subRegion ) const +{ + FlowSolverBase::saveConvergedState( subRegion ); + + arrayView1d< real64 const > const mass = subRegion.template getField< fields::flow::mass >(); + arrayView1d< real64 > const mass_n = subRegion.template getField< fields::flow::mass_n >(); + mass_n.setValues< parallelDevicePolicy<> >( mass ); +} + } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index 56dbab8979e..4a61817a2f4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -272,10 +272,10 @@ class SinglePhaseBase : public FlowSolverBase /** * @brief Function to update all constitutive state and dependent variables - * @param dataGroup group that contains the fields + * @param subRegion subregion that contains the fields */ void - updateFluidState( ObjectManagerBase & subRegion ) const; + updateFluidState( ElementSubRegionBase & subRegion ) const; /** @@ -285,6 +285,20 @@ class SinglePhaseBase : public FlowSolverBase virtual void updateFluidModel( ObjectManagerBase & dataGroup ) const; + /** + * @brief Function to update fluid mass + * @param subRegion subregion that contains the fields + */ + void + updateMass( ElementSubRegionBase & subRegion ) const; + + /** + * @brief Function to update energy + * @param subRegion subregion that contains the fields + */ + void + updateEnergy( ElementSubRegionBase & subRegion ) const; + /** * @brief Update all relevant solid internal energy models using current values of temperature * @param dataGroup the group storing the required fields @@ -354,6 +368,11 @@ class SinglePhaseBase : public FlowSolverBase virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override; + /** + * @brief Utility function to save the converged state + * @param[in] subRegion the element subRegion + */ + virtual void saveConvergedState( ElementSubRegionBase & subRegion ) const override; /** * @brief Structure holding views into fluid properties used by the base solver. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp index 8a101bea087..2d908b6dc10 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp @@ -151,12 +151,11 @@ class ElementBasedAssemblyKernel m_elemGhostRank( subRegion.ghostRank() ), m_volume( subRegion.getElementVolume() ), m_deltaVolume( subRegion.template getField< fields::flow::deltaVolume >() ), - m_porosity_n( solid.getPorosity_n() ), - m_porosityNew( solid.getPorosity() ), + m_porosity( solid.getPorosity() ), m_dPoro_dPres( solid.getDporosity_dPressure() ), - m_density_n( fluid.density_n() ), m_density( fluid.density() ), m_dDensity_dPres( fluid.dDensity_dPressure() ), + m_mass_n( subRegion.template getField< fields::flow::mass_n >() ), m_localMatrix( localMatrix ), m_localRhs( localRhs ) {} @@ -174,9 +173,6 @@ class ElementBasedAssemblyKernel /// Pore volume at time n+1 real64 poreVolume = 0.0; - /// Pore volume at the previous converged time step - real64 poreVolume_n = 0.0; - /// Derivative of pore volume with respect to pressure real64 dPoreVolume_dPres = 0.0; @@ -216,8 +212,7 @@ class ElementBasedAssemblyKernel StackVariables & stack ) const { // initialize the pore volume - stack.poreVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * m_porosityNew[ei][0]; - stack.poreVolume_n = m_volume[ei] * m_porosity_n[ei][0]; + stack.poreVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * m_porosity[ei][0]; stack.dPoreVolume_dPres = ( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dPres[ei][0]; // set row index and degrees of freedom indices for this element @@ -242,7 +237,7 @@ class ElementBasedAssemblyKernel FUNC && kernelOp = NoOpFunc{} ) const { // Residual contribution is mass conservation in the cell - stack.localResidual[0] = stack.poreVolume * m_density[ei][0] - stack.poreVolume_n * m_density_n[ei][0]; + stack.localResidual[0] = stack.poreVolume * m_density[ei][0] - m_mass_n[ei]; // Derivative of residual wrt to pressure in the cell stack.localJacobian[0][0] = stack.dPoreVolume_dPres * m_density[ei][0] + m_dDensity_dPres[ei][0] * stack.poreVolume; @@ -314,15 +309,16 @@ class ElementBasedAssemblyKernel arrayView1d< real64 const > const m_deltaVolume; /// Views on the porosity - arrayView2d< real64 const > const m_porosity_n; - arrayView2d< real64 const > const m_porosityNew; + arrayView2d< real64 const > const m_porosity; arrayView2d< real64 const > const m_dPoro_dPres; /// Views on density - arrayView2d< real64 const > const m_density_n; arrayView2d< real64 const > const m_density; arrayView2d< real64 const > const m_dDensity_dPres; + /// View on mass + arrayView1d< real64 const > const m_mass_n; + /// View on the local CRS matrix CRSMatrixView< real64, globalIndex const > const m_localMatrix; /// View on the local RHS @@ -374,7 +370,7 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur { Base::computeAccumulation( ei, stack, [&] () { - if( Base::m_volume[ei] * Base::m_density_n[ei][0] > 1.1 * m_creationMass[ei] ) + if( Base::m_mass_n[ei] > 1.1 * m_creationMass[ei] ) { stack.localResidual[0] += m_creationMass[ei] * 0.25; } @@ -470,24 +466,20 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > arrayView1d< globalIndex const > const & dofNumber, arrayView1d< localIndex const > const & ghostRank, ElementSubRegionBase const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, real64 const minNormalizer ) : Base( rankOffset, localResidual, dofNumber, ghostRank, minNormalizer ), - m_volume( subRegion.getElementVolume() ), - m_porosity_n( solid.getPorosity_n() ), - m_density_n( fluid.density_n() ) + m_mass_n( subRegion.template getField< fields::flow::mass_n >() ) {} GEOS_HOST_DEVICE virtual void computeLinf( localIndex const ei, LinfStackVariables & stack ) const override { - real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_density_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ); + real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_mass_n[ei] ); real64 const valMass = LvArray::math::abs( m_localResidual[stack.localRow] ) / massNormalizer; if( valMass > stack.localValue[0] ) { @@ -499,7 +491,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > virtual void computeL2( localIndex const ei, L2StackVariables & stack ) const override { - real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_density_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ); + real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_mass_n[ei] ); stack.localValue[0] += m_localResidual[stack.localRow] * m_localResidual[stack.localRow]; stack.localNormalizer[0] += massNormalizer; } @@ -507,14 +499,8 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > protected: - /// View on the volume - arrayView1d< real64 const > const m_volume; - - /// View on porosity at the previous converged time step - arrayView2d< real64 const > const m_porosity_n; - - /// View on total mass/molar density at the previous converged time step - arrayView2d< real64 const > const m_density_n; + /// View on mass at the previous converged time step + arrayView1d< real64 const > const m_mass_n; }; @@ -545,8 +531,6 @@ class ResidualNormKernelFactory string const dofKey, arrayView1d< real64 const > const & localResidual, ElementSubRegionBase const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, real64 const minNormalizer, real64 (& residualNorm)[1], real64 (& residualNormalizer)[1] ) @@ -554,7 +538,7 @@ class ResidualNormKernelFactory arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); - ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, subRegion, fluid, solid, minNormalizer ); + ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, subRegion, minNormalizer ); if( normType == solverBaseKernels::NormType::Linf ) { ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index e207d50ad99..565a4621fbe 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -150,13 +150,13 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED string const & fluidName = subRegion.template getReference< string >( BASE::viewKeyStruct::fluidNamesString() ); SingleFluidBase const & fluid = SolverBase::getConstitutiveModel< SingleFluidBase >( subRegion, fluidName ); - string const & solidName = subRegion.template getReference< string >( BASE::viewKeyStruct::solidNamesString() ); - CoupledSolidBase const & solid = SolverBase::getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); - // step 1: compute the norm in the subRegion if( m_isThermal ) { + string const & solidName = subRegion.template getReference< string >( BASE::viewKeyStruct::solidNamesString() ); + CoupledSolidBase const & solid = SolverBase::getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); + string const & solidInternalEnergyName = subRegion.template getReference< string >( BASE::viewKeyStruct::solidInternalEnergyNamesString() ); SolidInternalEnergy const & solidInternalEnergy = SolverBase::getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); @@ -185,8 +185,6 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED dofKey, localRhs, subRegion, - fluid, - solid, m_nonlinearSolverParameters.m_minNormalizer, subRegionFlowResidualNorm, subRegionFlowResidualNormalizer ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index a21e8cc461e..1ce44237606 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -471,9 +471,6 @@ real64 SinglePhaseHybridFVM::calculateResidualNorm( real64 const & GEOS_UNUSED_P defaultViscosity += fluid.defaultViscosity(); subRegionCounter++; - string const & solidName = subRegion.getReference< string >( viewKeyStruct::solidNamesString() ); - CoupledSolidBase const & solid = getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); - // step 1.1: compute the norm in the subRegion singlePhaseBaseKernels:: @@ -483,8 +480,6 @@ real64 SinglePhaseHybridFVM::calculateResidualNorm( real64 const & GEOS_UNUSED_P elemDofKey, localRhs, subRegion, - fluid, - solid, m_nonlinearSolverParameters.m_minNormalizer, subRegionResidualNorm, subRegionResidualNormalizer ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp index 0fec20002a4..8df182ad30e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -159,17 +159,13 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK using Base::m_dofNumber; using Base::m_elemGhostRank; using Base::m_volume; - using Base::m_porosity_n; using Base::m_porosity; using Base::m_dPoro_dPres; using Base::m_dCompFrac_dCompDens; - using Base::m_phaseVolFrac_n; using Base::m_phaseVolFrac; using Base::m_dPhaseVolFrac; - using Base::m_phaseDens_n; using Base::m_phaseDens; using Base::m_dPhaseDens; - using Base::m_phaseCompFrac_n; using Base::m_phaseCompFrac; using Base::m_dPhaseCompFrac; using Base::m_localMatrix; @@ -197,12 +193,11 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > const kernelFlags ) : Base( numPhases, rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs, kernelFlags ), m_dPoro_dTemp( solid.getDporosity_dTemperature() ), - m_phaseInternalEnergy_n( fluid.phaseInternalEnergy_n() ), m_phaseInternalEnergy( fluid.phaseInternalEnergy() ), m_dPhaseInternalEnergy( fluid.dPhaseInternalEnergy() ), - m_rockInternalEnergy_n( solid.getInternalEnergy_n() ), m_rockInternalEnergy( solid.getInternalEnergy() ), - m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ) + m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ), + m_energy_n( subRegion.getField< fields::flow::energy_n >() ) {} struct StackVariables : public Base::StackVariables @@ -214,9 +209,6 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK : Base::StackVariables() {} - using Base::StackVariables::poreVolume; - using Base::StackVariables::poreVolume_n; - using Base::StackVariables::dPoreVolume_dPres; using Base::StackVariables::localRow; using Base::StackVariables::dofIndices; using Base::StackVariables::localResidual; @@ -230,9 +222,6 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK /// Solid energy at time n+1 real64 solidEnergy = 0.0; - /// Solid energy at the previous converged time step - real64 solidEnergy_n = 0.0; - /// Derivative of solid internal energy with respect to pressure real64 dSolidEnergy_dPres = 0.0; @@ -257,13 +246,11 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK // initialize the solid volume real64 const solidVolume = m_volume[ei] * ( 1.0 - m_porosity[ei][0] ); - real64 const solidVolume_n = m_volume[ei] * ( 1.0 - m_porosity_n[ei][0] ); real64 const dSolidVolume_dPres = -m_volume[ei] * m_dPoro_dPres[ei][0]; real64 const dSolidVolume_dTemp = -stack.dPoreVolume_dTemp; // initialize the solid internal energy stack.solidEnergy = solidVolume * m_rockInternalEnergy[ei][0]; - stack.solidEnergy_n = solidVolume_n * m_rockInternalEnergy_n[ei][0]; stack.dSolidEnergy_dPres = dSolidVolume_dPres * m_rockInternalEnergy[ei][0]; stack.dSolidEnergy_dTemp = solidVolume * m_dRockInternalEnergy_dTemp[ei][0] + dSolidVolume_dTemp * m_rockInternalEnergy[ei][0]; @@ -281,9 +268,11 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK { using Deriv = multifluid::DerivativeOffset; + // start with old time step value + stack.localResidual[numEqn-1] = -m_energy_n[ei]; + Base::computeAccumulation( ei, stack, [&] ( integer const ip, real64 const & phaseAmount, - real64 const & phaseAmount_n, real64 const & dPhaseAmount_dP, real64 const (&dPhaseAmount_dC)[numComp] ) { @@ -302,7 +291,6 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseInternalEnergy_n = m_phaseInternalEnergy_n[ei][0]; arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseInternalEnergy = m_phaseInternalEnergy[ei][0]; arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseInternalEnergy = m_dPhaseInternalEnergy[ei][0]; @@ -319,14 +307,13 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK // Step 2: assemble the phase-dependent part of the accumulation term of the energy equation real64 const phaseEnergy = phaseAmount * phaseInternalEnergy[ip]; - real64 const phaseEnergy_n = phaseAmount_n * phaseInternalEnergy_n[ip]; real64 const dPhaseEnergy_dP = dPhaseAmount_dP * phaseInternalEnergy[ip] + phaseAmount * dPhaseInternalEnergy[ip][Deriv::dP]; real64 const dPhaseEnergy_dT = dPhaseAmount_dT * phaseInternalEnergy[ip] + phaseAmount * dPhaseInternalEnergy[ip][Deriv::dT]; // local accumulation - stack.localResidual[numEqn-1] += phaseEnergy - phaseEnergy_n; + stack.localResidual[numEqn-1] += phaseEnergy; // derivatives w.r.t. pressure and temperature stack.localJacobian[numEqn-1][0] += dPhaseEnergy_dP; @@ -344,7 +331,7 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK // Step 3: assemble the solid part of the accumulation term // local accumulation and derivatives w.r.t. pressure and temperature - stack.localResidual[numEqn-1] += stack.solidEnergy - stack.solidEnergy_n; + stack.localResidual[numEqn-1] += stack.solidEnergy; stack.localJacobian[numEqn-1][0] += stack.dSolidEnergy_dPres; stack.localJacobian[numEqn-1][numDof-1] += stack.dSolidEnergy_dTemp; @@ -396,15 +383,16 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK arrayView2d< real64 const > const m_dPoro_dTemp; /// Views on phase internal energy - arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseInternalEnergy_n; arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseInternalEnergy; arrayView4d< real64 const, multifluid::USD_PHASE_DC > m_dPhaseInternalEnergy; /// Views on rock internal energy - arrayView2d< real64 const > m_rockInternalEnergy_n; arrayView2d< real64 const > m_rockInternalEnergy; arrayView2d< real64 const > m_dRockInternalEnergy_dTemp; + /// Views on energy + arrayView1d< real64 const > m_energy_n; + }; /** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp index 12047977050..bc006a230c6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp @@ -120,10 +120,8 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs using Base::m_elemGhostRank; using Base::m_volume; using Base::m_deltaVolume; - using Base::m_porosity_n; - using Base::m_porosityNew; + using Base::m_porosity; using Base::m_dPoro_dPres; - using Base::m_density_n; using Base::m_density; using Base::m_dDensity_dPres; using Base::m_localMatrix; @@ -149,13 +147,12 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ), m_dDensity_dTemp( fluid.dDensity_dTemperature() ), m_dPoro_dTemp( solid.getDporosity_dTemperature() ), - m_internalEnergy_n( fluid.internalEnergy_n() ), m_internalEnergy( fluid.internalEnergy() ), m_dInternalEnergy_dPres( fluid.dInternalEnergy_dPressure() ), m_dInternalEnergy_dTemp( fluid.dInternalEnergy_dTemperature() ), - m_rockInternalEnergy_n( solid.getInternalEnergy_n() ), m_rockInternalEnergy( solid.getInternalEnergy() ), - m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ) + m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ), + m_energy_n( subRegion.template getField< fields::flow::energy_n >() ) {} /** @@ -172,7 +169,6 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs {} using Base::StackVariables::poreVolume; - using Base::StackVariables::poreVolume_n; using Base::StackVariables::dPoreVolume_dPres; using Base::StackVariables::localRow; using Base::StackVariables::dofIndices; @@ -187,9 +183,6 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs /// Solid energy at time n+1 real64 solidEnergy = 0.0; - /// Solid energy at the previous converged time step - real64 solidEnergy_n = 0.0; - /// Derivative of solid internal energy with respect to pressure real64 dSolidEnergy_dPres = 0.0; @@ -212,14 +205,12 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs stack.dPoreVolume_dTemp = ( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dTemp[ei][0]; // initialize the solid volume - real64 const solidVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * ( 1.0 - m_porosityNew[ei][0] ); - real64 const solidVolume_n = m_volume[ei] * ( 1.0 - m_porosity_n[ei][0] ); + real64 const solidVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * ( 1.0 - m_porosity[ei][0] ); real64 const dSolidVolume_dPres = -( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dPres[ei][0]; real64 const dSolidVolume_dTemp = -( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dTemp[ei][0]; // initialize the solid internal energy stack.solidEnergy = solidVolume * m_rockInternalEnergy[ei][0]; - stack.solidEnergy_n = solidVolume_n * m_rockInternalEnergy_n[ei][0]; stack.dSolidEnergy_dPres = dSolidVolume_dPres * m_rockInternalEnergy[ei][0]; stack.dSolidEnergy_dTemp = solidVolume * m_dRockInternalEnergy_dTemp[ei][0] + dSolidVolume_dTemp * m_rockInternalEnergy[ei][0]; } @@ -235,6 +226,8 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs void computeAccumulation( localIndex const ei, StackVariables & stack ) const { + stack.localResidual[numEqn-1] = -m_energy_n[ei]; + Base::computeAccumulation( ei, stack, [&] () { // Step 1: assemble the derivatives of the mass balance equation w.r.t temperature @@ -242,7 +235,6 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs // Step 2: assemble the fluid part of the accumulation term of the energy equation real64 const fluidEnergy = stack.poreVolume * m_density[ei][0] * m_internalEnergy[ei][0]; - real64 const fluidEnergy_n = stack.poreVolume_n * m_density_n[ei][0] * m_internalEnergy_n[ei][0]; real64 const dFluidEnergy_dP = stack.dPoreVolume_dPres * m_density[ei][0] * m_internalEnergy[ei][0] + stack.poreVolume * m_dDensity_dPres[ei][0] * m_internalEnergy[ei][0] @@ -253,7 +245,7 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs + stack.dPoreVolume_dTemp * m_density[ei][0] * m_internalEnergy[ei][0]; // local accumulation - stack.localResidual[numEqn-1] = fluidEnergy - fluidEnergy_n; + stack.localResidual[numEqn-1] += fluidEnergy; // derivatives w.r.t. pressure and temperature stack.localJacobian[numEqn-1][0] = dFluidEnergy_dP; @@ -261,7 +253,7 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs } ); // Step 3: assemble the solid part of the accumulation term of the energy equation - stack.localResidual[numEqn-1] += stack.solidEnergy - stack.solidEnergy_n; + stack.localResidual[numEqn-1] += stack.solidEnergy; stack.localJacobian[numEqn-1][0] += stack.dSolidEnergy_dPres; stack.localJacobian[numEqn-1][numDof-1] += stack.dSolidEnergy_dTemp; } @@ -297,15 +289,16 @@ class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAs arrayView2d< real64 const > const m_dPoro_dTemp; /// Views on fluid internal energy - arrayView2d< real64 const > const m_internalEnergy_n; arrayView2d< real64 const > const m_internalEnergy; arrayView2d< real64 const > const m_dInternalEnergy_dPres; arrayView2d< real64 const > const m_dInternalEnergy_dTemp; /// Views on rock internal energy - arrayView2d< real64 const > m_rockInternalEnergy_n; - arrayView2d< real64 const > m_rockInternalEnergy; - arrayView2d< real64 const > m_dRockInternalEnergy_dTemp; + arrayView2d< real64 const > const m_rockInternalEnergy; + arrayView2d< real64 const > const m_dRockInternalEnergy_dTemp; + + /// View on energy + arrayView1d< real64 const > const m_energy_n; }; @@ -352,7 +345,7 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur Base::StackVariables & stack ) const { Base::computeAccumulation( ei, stack ); - if( Base::m_volume[ei] * Base::m_density_n[ei][0] > 1.1 * m_creationMass[ei] ) + if( Base::m_mass_n[ei] > 1.1 * m_creationMass[ei] ) { stack.localResidual[0] += m_creationMass[ei] * 0.25; } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index 6dafaf94948..e884fb94cfd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -90,7 +90,7 @@ class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWells void keepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) { flowSolver()->keepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } - real64 updateFluidState( ObjectManagerBase & subRegion ) const + real64 updateFluidState( ElementSubRegionBase & subRegion ) const { return flowSolver()->updateFluidState( subRegion ); } void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const { flowSolver()->updatePorosityAndPermeability( subRegion ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index 36eaa63652f..d51345298cd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -539,10 +539,10 @@ class CoupledSolver : public SolverBase GEOS_UNUSED_VAR( domain, solverType ); } - bool checkSequentialConvergence( int const & iter, - real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) + virtual bool checkSequentialConvergence( int const & iter, + real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) { NonlinearSolverParameters const & params = getNonlinearSolverParameters(); bool isConverged = true; diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index b5c05483d87..e0b93cb71bd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -186,6 +186,25 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER this->setupCoupling( domain, dofManager ); } + virtual bool checkSequentialConvergence( int const & iter, + real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) override + { + // always force outer loop for initialization + auto & subcycling = this->getNonlinearSolverParameters().m_subcyclingOption; + auto const subcycling_orig = subcycling; + if( m_performStressInitialization ) + subcycling = 1; + + bool isConverged = Base::checkSequentialConvergence( iter, time_n, dt, domain ); + + // restore original + subcycling = subcycling_orig; + + return isConverged; + } + /** * @brief accessor for the pointer to the solid mechanics solver * @return a pointer to the solid mechanics solver diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 04891c91dd3..2d1c5057c85 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -82,7 +82,7 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< SINGLE void keepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) { flowSolver()->keepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } - void updateFluidState( ObjectManagerBase & subRegion ) const + void updateFluidState( ElementSubRegionBase & subRegion ) const { flowSolver()->updateFluidState( subRegion ); } void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const { flowSolver()->updatePorosityAndPermeability( subRegion ); } From 5408b7d3abbcb29ab1bc5d0ff125a2ed3b2d6728 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Fri, 19 Apr 2024 13:29:51 -0500 Subject: [PATCH 033/286] Freeze porosity when doing poromechanics initialization (#3056) --- integratedTests | 2 +- src/coreComponents/constitutive/solid/PorousSolid.hpp | 10 ++++++++++ .../multiphysics/MultiphasePoromechanics.cpp | 2 ++ .../multiphysics/PoromechanicsSolver.hpp | 3 ++- .../multiphysics/SinglePhasePoromechanics.cpp | 2 ++ .../SinglePhasePoromechanicsEmbeddedFractures.hpp | 1 + .../poromechanicsKernels/MultiphasePoromechanics.hpp | 4 ++++ .../MultiphasePoromechanics_impl.hpp | 5 ++++- .../poromechanicsKernels/SinglePhasePoromechanics.hpp | 3 +++ .../SinglePhasePoromechanics_impl.hpp | 5 ++++- .../ThermalMultiphasePoromechanics.hpp | 3 +++ .../ThermalMultiphasePoromechanics_impl.hpp | 3 +++ .../ThermalSinglePhasePoromechanics.hpp | 3 +++ .../ThermalSinglePhasePoromechanics_impl.hpp | 3 +++ 14 files changed, 45 insertions(+), 4 deletions(-) diff --git a/integratedTests b/integratedTests index 671feaaf28d..268498a406a 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit 671feaaf28d51f101144145afa00a6c535669ff1 +Subproject commit 268498a406af2a44fdf7a6952d6703ca7dab30e8 diff --git a/src/coreComponents/constitutive/solid/PorousSolid.hpp b/src/coreComponents/constitutive/solid/PorousSolid.hpp index 2ed3b1fb4a3..078ca36ce7d 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.hpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.hpp @@ -82,6 +82,7 @@ class PorousSolidUpdates : public CoupledSolidUpdates< SOLID_TYPE, BiotPorosity, real64 ( & dTotalStress_dPressure )[6], real64 ( & dTotalStress_dTemperature )[6], DiscretizationOps & stiffness, + integer const performStressInitialization, real64 & porosity, real64 & porosity_n, real64 & dPorosity_dVolStrain, @@ -116,6 +117,15 @@ class PorousSolidUpdates : public CoupledSolidUpdates< SOLID_TYPE, BiotPorosity, dPorosity_dPressure, dPorosity_dTemperature ); + // skip porosity update when doing poromechanics initialization + if( performStressInitialization ) + { + porosity = porosityInit; + dPorosity_dVolStrain = 0.0; + dPorosity_dPressure = 0.0; + dPorosity_dTemperature = 0.0; + } + // Save the derivative of solid density wrt pressure for the computation of the body force dSolidDensity_dPressure = m_porosityUpdate.dGrainDensity_dPressure(); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index ac12d92bbf7..4874ee13e30 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -224,6 +224,7 @@ void MultiphasePoromechanics< FLOW_SOLVER >::assembleElementBasedTerms( real64 c this->flowSolver()->numFluidComponents(), this->flowSolver()->numFluidPhases(), this->flowSolver()->useTotalMassEquation(), + this->m_performStressInitialization, FlowSolverBase::viewKeyStruct::fluidNamesString() ); } else @@ -242,6 +243,7 @@ void MultiphasePoromechanics< FLOW_SOLVER >::assembleElementBasedTerms( real64 c this->flowSolver()->numFluidPhases(), this->flowSolver()->useSimpleAccumulation(), this->flowSolver()->useTotalMassEquation(), + this->m_performStressInitialization, FlowSolverBase::viewKeyStruct::fluidNamesString() ); } } ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index e0b93cb71bd..6d85889df85 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -389,7 +389,8 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER } /// After the solid mechanics solver - if( solverType == static_cast< integer >( SolverType::SolidMechanics ) ) + if( solverType == static_cast< integer >( SolverType::SolidMechanics ) + && !m_performStressInitialization ) // do not update during poromechanics initialization { // compute the average of the mean total stress increment over quadrature points averageMeanTotalStressIncrement( domain ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index d21eef612ae..445661f7daf 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -223,6 +223,7 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementB localRhs, dt, flowDofKey, + this->m_performStressInitialization, FlowSolverBase::viewKeyStruct::fluidNamesString() ); } else @@ -237,6 +238,7 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementB localRhs, dt, flowDofKey, + this->m_performStressInitialization, FlowSolverBase::viewKeyStruct::fluidNamesString() ); } } ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp index e34b3289a7a..5cd29456ab4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -185,6 +185,7 @@ real64 SinglePhasePoromechanicsEmbeddedFractures::assemblyLaunch( MeshLevel & me dt, gravityVectorData, flowDofKey, + m_performStressInitialization, FlowSolverBase::viewKeyStruct::fluidNamesString() ); real64 const maxForce = diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp index 0367fb42b67..c6dabc3a35a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp @@ -102,6 +102,7 @@ class MultiphasePoromechanics : localIndex const numPhases, integer const useSimpleAccumulation, integer const useTotalMassEquation, + integer const performStressInitialization, string const fluidModelKey ); //***************************************************************************** @@ -354,6 +355,8 @@ class MultiphasePoromechanics : /// Use total mass equation flag integer const m_useTotalMassEquation; + + integer const m_performStressInitialization; }; using MultiphasePoromechanicsKernelFactory = @@ -369,6 +372,7 @@ using MultiphasePoromechanicsKernelFactory = localIndex const, integer const, integer const, + integer const, string const >; /** diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp index 51645867ddc..b7104c38fb8 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp @@ -54,6 +54,7 @@ MultiphasePoromechanics( NodeManager const & nodeManager, localIndex const numPhases, integer const useSimpleAccumulation, integer const useTotalMassEquation, + integer const performStressInitialization, string const fluidModelKey ): Base( nodeManager, edgeManager, @@ -79,7 +80,8 @@ MultiphasePoromechanics( NodeManager const & nodeManager, m_numComponents( numComponents ), m_numPhases( numPhases ), m_useSimpleAccumulation( useSimpleAccumulation ), - m_useTotalMassEquation( useTotalMassEquation ) + m_useTotalMassEquation( useTotalMassEquation ), + m_performStressInitialization( performStressInitialization ) { GEOS_ERROR_IF_GT_MSG( m_numComponents, maxNumComponents, "MultiphasePoromechanics solver allows at most " << @@ -162,6 +164,7 @@ smallStrainUpdate( localIndex const k, stack.dTotalStress_dPressure, stack.dTotalStress_dTemperature, stack.stiffness, + m_performStressInitialization, porosity, porosity_n, dPorosity_dVolStrain, diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp index 08b9c07e5d7..f8902f25f4e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp @@ -94,6 +94,7 @@ class SinglePhasePoromechanics : real64 const inputDt, real64 const (&gravityVector)[3], string const inputFlowDofKey, + integer const performStressInitialization, string const fluidModelKey ); //***************************************************************************** @@ -257,6 +258,7 @@ class SinglePhasePoromechanics : /// Derivative of fluid density wrt pressure arrayView2d< real64 const > const m_dFluidDensity_dPressure; + integer const m_performStressInitialization; }; using SinglePhasePoromechanicsKernelFactory = @@ -268,6 +270,7 @@ using SinglePhasePoromechanicsKernelFactory = real64 const, real64 const (&)[3], string const, + integer const, string const >; /** diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp index 023aeb08bff..e76c112220a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp @@ -50,6 +50,7 @@ SinglePhasePoromechanics( NodeManager const & nodeManager, real64 const inputDt, real64 const (&gravityVector)[3], string const inputFlowDofKey, + integer const performStressInitialization, string const fluidModelKey ): Base( nodeManager, edgeManager, @@ -68,7 +69,8 @@ SinglePhasePoromechanics( NodeManager const & nodeManager, fluidModelKey ), m_fluidDensity( elementSubRegion.template getConstitutiveModel< constitutive::SingleFluidBase >( elementSubRegion.template getReference< string >( fluidModelKey ) ).density() ), m_fluidDensity_n( elementSubRegion.template getConstitutiveModel< constitutive::SingleFluidBase >( elementSubRegion.template getReference< string >( fluidModelKey ) ).density_n() ), - m_dFluidDensity_dPressure( elementSubRegion.template getConstitutiveModel< constitutive::SingleFluidBase >( elementSubRegion.template getReference< string >( fluidModelKey ) ).dDensity_dPressure() ) + m_dFluidDensity_dPressure( elementSubRegion.template getConstitutiveModel< constitutive::SingleFluidBase >( elementSubRegion.template getReference< string >( fluidModelKey ) ).dDensity_dPressure() ), + m_performStressInitialization( performStressInitialization ) {} template< typename SUBREGION_TYPE, @@ -100,6 +102,7 @@ smallStrainUpdate( localIndex const k, stack.dTotalStress_dPressure, stack.dTotalStress_dTemperature, stack.stiffness, + m_performStressInitialization, porosity, porosity_n, dPorosity_dVolStrain, diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp index 5c60e6820da..62833506841 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp @@ -76,6 +76,7 @@ class ThermalMultiphasePoromechanics : using Base::m_numComponents; using Base::m_numPhases; using Base::m_useTotalMassEquation; + using Base::m_performStressInitialization; using Base::m_solidDensity; using Base::m_fluidPhaseMassDensity; using Base::m_dFluidPhaseMassDensity; @@ -110,6 +111,7 @@ class ThermalMultiphasePoromechanics : localIndex const numComponents, localIndex const numPhases, integer const useTotalMassEquation, + integer const performStressInitialization, string const fluidModelKey ); /** @@ -341,6 +343,7 @@ using ThermalMultiphasePoromechanicsKernelFactory = localIndex const, localIndex const, integer const, + integer const, string const >; } // namespace thermalporomechanicsKernels diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp index 0c19141489f..fe18bd5f75c 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp @@ -52,6 +52,7 @@ ThermalMultiphasePoromechanics( NodeManager const & nodeManager, localIndex const numComponents, localIndex const numPhases, integer const useTotalMassEquation, + integer const performStressInitialization, string const fluidModelKey ): Base( nodeManager, edgeManager, @@ -71,6 +72,7 @@ ThermalMultiphasePoromechanics( NodeManager const & nodeManager, numPhases, false, // do not use simple accumulation form useTotalMassEquation, + performStressInitialization, fluidModelKey ), m_rockInternalEnergy_n( inputConstitutiveType.getInternalEnergy_n() ), m_rockInternalEnergy( inputConstitutiveType.getInternalEnergy() ), @@ -137,6 +139,7 @@ smallStrainUpdate( localIndex const k, stack.dTotalStress_dPressure, stack.dTotalStress_dTemperature, stack.stiffness, + m_performStressInitialization, porosity, porosity_n, dPorosity_dVolStrain, diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp index 5fe11040d59..178da2ea3bc 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp @@ -70,6 +70,7 @@ class ThermalSinglePhasePoromechanics : using Base::m_solidDensity; using Base::m_flowDofNumber; using Base::m_dt; + using Base::m_performStressInitialization; /** * @brief Constructor @@ -90,6 +91,7 @@ class ThermalSinglePhasePoromechanics : real64 const inputDt, real64 const (&gravityVector)[3], string const inputFlowDofKey, + integer const performStressInitialization, string const fluidModelKey ); //***************************************************************************** @@ -305,6 +307,7 @@ using ThermalSinglePhasePoromechanicsKernelFactory = real64 const, real64 const (&)[3], string const, + integer const, string const >; } // namespace thermalPoromechanicsKernels diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp index a3f3d4db3a9..76584fb52dd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp @@ -46,6 +46,7 @@ ThermalSinglePhasePoromechanics( NodeManager const & nodeManager, real64 const inputDt, real64 const (&gravityVector)[3], string const inputFlowDofKey, + integer const performStressInitialization, string const fluidModelKey ): Base( nodeManager, edgeManager, @@ -61,6 +62,7 @@ ThermalSinglePhasePoromechanics( NodeManager const & nodeManager, inputDt, gravityVector, inputFlowDofKey, + performStressInitialization, fluidModelKey ), m_dFluidDensity_dTemperature( elementSubRegion.template getConstitutiveModel< constitutive::SingleFluidBase >( elementSubRegion.template getReference< string >( fluidModelKey ) ).dDensity_dTemperature() ), @@ -121,6 +123,7 @@ smallStrainUpdate( localIndex const k, stack.dTotalStress_dPressure, stack.dTotalStress_dTemperature, stack.stiffness, + m_performStressInitialization, porosity, porosity_n, dPorosity_dVolStrain, From 6efbd27c91a76f1c92dcd763255a4088419490de Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Mon, 22 Apr 2024 07:57:00 -0700 Subject: [PATCH 034/286] update tpls tag and lvarray. (#3087) --- .devcontainer/devcontainer.json | 2 +- src/cmake/thirdparty/SetupGeosxThirdParty.cmake | 2 +- src/coreComponents/LvArray | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 30466d17298..dda45adc958 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "260-235" + "GEOS_TPL_TAG": "263-252" } }, "runArgs": [ diff --git a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake index a3a4edd3f0e..7706da01a5b 100644 --- a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake +++ b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake @@ -636,7 +636,7 @@ if(DEFINED HYPRE_DIR AND ENABLE_HYPRE) set( HYPRE_DEPENDS ${HYPRE_DEPENDS} superlu_dist ) endif() if( ${ENABLE_HYPRE_DEVICE} STREQUAL "CUDA" ) - set( EXTRA_LIBS ${CUDA_cusparse_LIBRARY} ${CUDA_cublas_LIBRARY} ${CUDA_curand_LIBRARY} ) + set( EXTRA_LIBS ${CUDA_cusparse_LIBRARY} ${CUDA_cublas_LIBRARY} ${CUDA_curand_LIBRARY} ${CUDA_cusolver_LIBRARY} ) elseif( ${ENABLE_HYPRE_DEVICE} STREQUAL "HIP" ) find_package( rocblas REQUIRED ) find_package( rocsolver REQUIRED ) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 1531241583e..fb5200d7436 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 1531241583eebe21cfcdc0facd16a80f1e03c939 +Subproject commit fb5200d743621126f2117eaef0dd855792fa0443 From 6ee342807c0606f453619ea4c887382c9d2b35f6 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Mon, 22 Apr 2024 16:26:52 -0500 Subject: [PATCH 035/286] Simplify poromechanics initialization setup (#3058) --- .../PoroElastic_staircase_co2_3d_fim.xml | 45 +++------- ...oroElastic_staircase_co2_3d_sequential.xml | 45 +++------- ...roElastic_staircase_singlephase_3d_fim.xml | 32 ++----- ...ic_staircase_singlephase_3d_sequential.xml | 33 ++------ .../ThermoPoroElastic_staircase_co2_smoke.xml | 42 +++------- integratedTests | 2 +- .../mainInterface/ProblemManager.cpp | 2 +- .../mainInterface/ProblemManager.hpp | 19 ++++- .../PoromechanicsInitialization.cpp | 83 ++++++++----------- .../PoromechanicsInitialization.hpp | 17 ++-- .../AcousticFirstOrderWaveEquationSEM.cpp | 1 + .../AcousticVTIWaveEquationSEM.cpp | 1 + .../AcousticWaveEquationSEM.cpp | 1 + .../ElasticFirstOrderWaveEquationSEM.cpp | 1 + .../ElasticWaveEquationSEM.cpp | 1 + .../wavePropagation/WaveSolverBase.cpp | 1 + ...seReservoirPoromechanicsInitialization.rst | 16 ++-- .../MultiphasePoromechanicsInitialization.rst | 16 ++-- ...SinglePhasePoromechanicsInitialization.rst | 16 ++-- ...seReservoirPoromechanicsInitialization.rst | 16 ++-- src/coreComponents/schema/schema.xsd | 16 ++-- 21 files changed, 162 insertions(+), 244 deletions(-) diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml index 08585c7347b..bf49f42200f 100644 --- a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim.xml @@ -90,32 +90,11 @@ target="/Outputs/vtkOutput"/> - - + target="/Tasks/multiphasePoroelasticityEquilibrationStep"/> - - - - - + + - - + name="multiphasePoroelasticityEquilibrationStep" + poromechanicsSolverName="multiphasePoroelasticity" + solidMechanicsStatisticsName="linearElasticityStatistics"/> diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml index 889d76a25b7..e0f04762409 100755 --- a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential.xml @@ -97,32 +97,11 @@ target="/Outputs/vtkOutput_seq"/> - - + target="/Tasks/multiphasePoroelasticityEquilibrationStep"/> - - - - - + + - - + name="multiphasePoroelasticityEquilibrationStep" + poromechanicsSolverName="reservoirSystem" + solidMechanicsStatisticsName="linearElasticityStatistics"/> diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim.xml index 62345094c30..3be995c1621 100644 --- a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim.xml @@ -79,23 +79,16 @@ target="/Outputs/vtkOutput"/> + target="/Tasks/singlePhasePoroelasticityEquilibrationStep"/> - - - - - - + name="singlePhasePoroelasticityEquilibrationStep" + poromechanicsSolverName="singlePhasePoroelasticity" + solidMechanicsStatisticsName="linearElasticityStatistics"/> diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential.xml index a95a1d1d185..58e14123fef 100755 --- a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential.xml @@ -86,23 +86,18 @@ name="outputs" timeFrequency="1e6" target="/Outputs/vtkOutput_seq"/> + + target="/Tasks/singlePhasePoroelasticityEquilibrationStep"/> - - - - - - + name="singlePhasePoroelasticityEquilibrationStep" + poromechanicsSolverName="reservoirPoromechanics" + solidMechanicsStatisticsName="linearElasticityStatistics"/> diff --git a/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml b/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml index 19751f2670a..4a570a3d38f 100644 --- a/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml +++ b/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml @@ -76,23 +76,21 @@ target="/Outputs/vtkOutput"/> + target="/Tasks/multiphasePoroelasticityEquilibrationStep"/> + - - - - - - - - - + diff --git a/integratedTests b/integratedTests index 268498a406a..0db7af94f9f 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit 268498a406af2a44fdf7a6952d6703ca7dab30e8 +Subproject commit 0db7af94f9fae57599319546197909201be94b39 diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 3e677e9c4c8..d112a884b7c 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -79,7 +79,7 @@ ProblemManager::ProblemManager( conduit::Node & root ): registerGroup< MeshManager >( groupKeys.meshManager ); registerGroup< OutputManager >( groupKeys.outputManager ); m_physicsSolverManager = ®isterGroup< PhysicsSolverManager >( groupKeys.physicsSolverManager ); - registerGroup< TasksManager >( groupKeys.tasksManager ); + m_tasksManager = ®isterGroup< TasksManager >( groupKeys.tasksManager ); m_functionManager = ®isterGroup< FunctionManager >( groupKeys.functionManager ); // Command line entries diff --git a/src/coreComponents/mainInterface/ProblemManager.hpp b/src/coreComponents/mainInterface/ProblemManager.hpp index aaeb01951da..00a453c34ea 100644 --- a/src/coreComponents/mainInterface/ProblemManager.hpp +++ b/src/coreComponents/mainInterface/ProblemManager.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_MAININTERFACE_PROBLEMMANAGER_HPP_ #define GEOS_MAININTERFACE_PROBLEMMANAGER_HPP_ -#include "events/EventManager.hpp" +#include "dataRepository/Group.hpp" namespace geos { @@ -34,6 +34,8 @@ namespace constitutive { class ConstitutiveManager; } +class EventManager; +class TasksManager; class FunctionManager; class FieldSpecificationManager; struct CommandLineOptions; @@ -308,14 +310,20 @@ class ProblemManager : public dataRepository::Group return *m_fieldSpecificationManager; } - /** - * @brief Returns the const EventManager. - * @return The const EventManager. + * @brief Returns the EventManager. + * @return The EventManager. */ EventManager & getEventManager() {return *m_eventManager;} + /** + * @brief Returns the TasksManager. + * @return The TasksManager. + */ + TasksManager & getTasksManager() + {return *m_tasksManager;} + protected: /** * @brief Post process the command line input @@ -367,6 +375,9 @@ class ProblemManager : public dataRepository::Group /// The EventManager EventManager * m_eventManager; + /// The TasksManager + TasksManager * m_tasksManager; + /// The FunctionManager FunctionManager * m_functionManager; diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index cb0e6541120..350e5994273 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -25,51 +25,21 @@ #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" #include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" +#include "physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp" +#include "events/tasks/TasksManager.hpp" namespace geos { using namespace dataRepository; -namespace -{ - -// This is meant to be specialized to work, see below -template< typename POROMECHANICS_SOLVER > class - PoromechanicsCatalogNames {}; - -// Class specializations for a POROMECHANICS_SOLVER set to SinglePhasePoromechanics -template<> class PoromechanicsCatalogNames< SinglePhasePoromechanics< SinglePhaseBase > > -{ -public: - static string name() { return SinglePhasePoromechanics< SinglePhaseBase >::catalogName() + "Initialization"; } -}; -template<> class PoromechanicsCatalogNames< SinglePhasePoromechanics< SinglePhaseReservoirAndWells< SinglePhaseBase > > > -{ -public: - static string name() { return SinglePhasePoromechanics< SinglePhaseReservoirAndWells< SinglePhaseBase > >::catalogName() + "Initialization"; } -}; -// Class specializations for a POROMECHANICS_SOLVER set to MultiphasePoromechanics -template<> class PoromechanicsCatalogNames< MultiphasePoromechanics< CompositionalMultiphaseBase > > -{ -public: - static string name() { return MultiphasePoromechanics< CompositionalMultiphaseBase >::catalogName() + "Initialization"; } -}; -template<> class PoromechanicsCatalogNames< MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > > > -{ -public: - static string name() { return MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > >::catalogName() + "Initialization"; } -}; - -} - // provide a definition for catalogName() template< typename POROMECHANICS_SOLVER > string PoromechanicsInitialization< POROMECHANICS_SOLVER >:: catalogName() { - return PoromechanicsCatalogNames< POROMECHANICS_SOLVER >::name(); + return POROMECHANICS_SOLVER::catalogName() + "Initialization"; } template< typename POROMECHANICS_SOLVER > @@ -78,6 +48,7 @@ PoromechanicsInitialization( const string & name, Group * const parent ): TaskBase( name, parent ), m_poromechanicsSolverName(), + m_solidMechanicsStatistics(), m_solidMechanicsStateResetTask( name, parent ) { enableLogLevelInput(); @@ -87,10 +58,11 @@ PoromechanicsInitialization( const string & name, setInputFlag( InputFlags::REQUIRED ). setDescription( "Name of the poromechanics solver" ); - registerWrapper( viewKeyStruct::performStressInitializationString(), &m_performStressInitialization ). - setApplyDefaultValue( true ). - setInputFlag( InputFlags::REQUIRED ). - setDescription( "Flag to indicate that the solver is going to perform stress initialization" ); + registerWrapper( viewKeyStruct::solidMechanicsStatisticsNameString(), &m_solidMechanicsStatisticsName ). + setRTTypeName( rtTypes::CustomTypes::groupNameRef ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( "" ). + setDescription( "Name of the solid mechanics statistics" ); } template< typename POROMECHANICS_SOLVER > @@ -112,6 +84,19 @@ postProcessInput() m_poromechanicsSolver = &physicsSolverManager.getGroup< POROMECHANICS_SOLVER >( m_poromechanicsSolverName ); + if( !m_solidMechanicsStatisticsName.empty()) + { + TasksManager & tasksManager = problemManager.getTasksManager(); + + GEOS_THROW_IF( !tasksManager.hasGroup( m_solidMechanicsStatisticsName ), + GEOS_FMT( "{}: statistics task named {} not found", + getWrapperDataContext( viewKeyStruct::solidMechanicsStatisticsNameString() ), + m_solidMechanicsStatisticsName ), + InputError ); + + m_solidMechanicsStatistics = &tasksManager.getGroup< SolidMechanicsStatistics >( m_solidMechanicsStatisticsName ); + } + m_solidMechanicsStateResetTask.setLogLevel( getLogLevel()); m_solidMechanicsStateResetTask.m_solidSolverName = m_poromechanicsSolver->solidMechanicsSolver()->getName(); m_solidMechanicsStateResetTask.postProcessInput(); @@ -127,17 +112,21 @@ execute( real64 const time_n, real64 const eventProgress, DomainPartition & domain ) { - if( m_performStressInitialization ) - { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` is set to perform stress initialization during the next time step(s)", - getName(), time_n, m_poromechanicsSolverName ) ); - m_poromechanicsSolver->setStressInitialization( true ); - } - else + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` is set to perform stress initialization during the next time step(s)", + getName(), time_n, m_poromechanicsSolverName ) ); + m_poromechanicsSolver->setStressInitialization( true ); + + m_solidMechanicsStateResetTask.execute( time_n, dt, cycleNumber, eventCounter, eventProgress, domain ); + + m_poromechanicsSolver->execute( time_n, dt, cycleNumber, eventCounter, eventProgress, domain ); + + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` has completed stress initialization", + getName(), time_n + dt, m_poromechanicsSolverName ) ); + m_poromechanicsSolver->setStressInitialization( false ); + + if( m_solidMechanicsStatistics != nullptr ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` has completed stress initialization", - getName(), time_n, m_poromechanicsSolverName ) ); - m_poromechanicsSolver->setStressInitialization( false ); + m_solidMechanicsStatistics->execute( time_n, dt, cycleNumber, eventCounter, eventProgress, domain ); } m_solidMechanicsStateResetTask.execute( time_n, dt, cycleNumber, eventCounter, eventProgress, domain ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp index 22f971dcdb3..22f86654464 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp @@ -24,6 +24,7 @@ namespace geos { +class SolidMechanicsStatistics; /** * @class PoromechanicsInitialization @@ -80,21 +81,25 @@ class PoromechanicsInitialization : public TaskBase { /// String for the poromechanics solver name constexpr static char const * poromechanicsSolverNameString() { return "poromechanicsSolverName"; } - /// String for the solver configuration - constexpr static char const * performStressInitializationString() { return "performStressInitialization"; } + /// String for the solid mechanics statistics name + constexpr static char const * solidMechanicsStatisticsNameString() { return "solidMechanicsStatisticsName"; } }; - void postProcessInput() override; +// void registerDataOnMesh( Group & meshBodies ) override; + /// Name of the poromechanics solver string m_poromechanicsSolverName; - /// Pointer to the multiphase poromechanics solver + /// Name of the solid mechanics statistics + string m_solidMechanicsStatisticsName; + + /// Pointer to the poromechanics solver POROMECHANICS_SOLVER * m_poromechanicsSolver; - /// Flag to indicate that the solver is going to perform stress initialization - integer m_performStressInitialization; + /// Pointer to the solid mechanics statistics + SolidMechanicsStatistics * m_solidMechanicsStatistics; SolidMechanicsStateReset m_solidMechanicsStateResetTask; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp index 2bbdd46bf1c..39c8fdfad81 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp @@ -26,6 +26,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "events/EventManager.hpp" #include "AcousticMatricesSEMKernel.hpp" #include "PrecomputeSourcesAndReceiversKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp index 178ecfdac47..b036542b61d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp @@ -26,6 +26,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "events/EventManager.hpp" #include "WaveSolverUtils.hpp" #include "AcousticTimeSchemeSEMKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp index a803142b574..f8404f01964 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp @@ -26,6 +26,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "events/EventManager.hpp" #include "WaveSolverUtils.hpp" #include "AcousticTimeSchemeSEMKernel.hpp" #include "AcousticMatricesSEMKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp index 2e0150b0299..44ccacc6b9b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp @@ -25,6 +25,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "events/EventManager.hpp" #include "ElasticMatricesSEMKernel.hpp" #include "PrecomputeSourcesAndReceiversKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp index ad13781738e..27bb85b93be 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp @@ -25,6 +25,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "events/EventManager.hpp" #include "WaveSolverUtils.hpp" #include "ElasticTimeSchemeSEMKernel.hpp" #include "ElasticMatricesSEMKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.cpp index 3278086f9e4..4081681f62f 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.cpp @@ -27,6 +27,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "WaveSolverUtils.hpp" +#include "events/EventManager.hpp" #include diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst index 27129634c0b..18e3a0dd9e7 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst @@ -1,12 +1,12 @@ -=========================== ============ ======== ========================================================================== -Name Type Default Description -=========================== ============ ======== ========================================================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -performStressInitialization integer required Flag to indicate that the solver is going to perform stress initialization -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -=========================== ============ ======== ========================================================================== +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst b/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst index 27129634c0b..18e3a0dd9e7 100644 --- a/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst +++ b/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst @@ -1,12 +1,12 @@ -=========================== ============ ======== ========================================================================== -Name Type Default Description -=========================== ============ ======== ========================================================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -performStressInitialization integer required Flag to indicate that the solver is going to perform stress initialization -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -=========================== ============ ======== ========================================================================== +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst index 27129634c0b..18e3a0dd9e7 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst @@ -1,12 +1,12 @@ -=========================== ============ ======== ========================================================================== -Name Type Default Description -=========================== ============ ======== ========================================================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -performStressInitialization integer required Flag to indicate that the solver is going to perform stress initialization -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -=========================== ============ ======== ========================================================================== +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst index 27129634c0b..18e3a0dd9e7 100644 --- a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst +++ b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst @@ -1,12 +1,12 @@ -=========================== ============ ======== ========================================================================== -Name Type Default Description -=========================== ============ ======== ========================================================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -performStressInitialization integer required Flag to indicate that the solver is going to perform stress initialization -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -=========================== ============ ======== ========================================================================== +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 965cf0f3546..c814c8b81ca 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -3564,10 +3564,10 @@ Local - Add stabilization only to interiors of macro elements.--> - - + + @@ -3590,10 +3590,10 @@ Local - Add stabilization only to interiors of macro elements.--> - - + + @@ -3672,20 +3672,20 @@ Local - Add stabilization only to interiors of macro elements.--> - - + + - - + + From 4cf7ba0adbd8dacb9aa184af90dcb9dead24a286 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Mon, 22 Apr 2024 19:30:42 -0500 Subject: [PATCH 036/286] Unify convergence check for lagrange-contact solvers (#3049) Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- integratedTests | 2 +- .../contact/SolidMechanicsLagrangeContact.cpp | 139 +++++------------- .../contact/SolidMechanicsLagrangeContact.hpp | 8 +- ...ePhasePoromechanicsConformingFractures.cpp | 3 - 4 files changed, 48 insertions(+), 104 deletions(-) diff --git a/integratedTests b/integratedTests index 0db7af94f9f..1bbf151ccc7 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit 0db7af94f9fae57599319546197909201be94b39 +Subproject commit 1bbf151ccc7de982e201753f16dfe1f9035b0311 diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 2f690495827..f0993972ccb 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -672,37 +672,24 @@ real64 SolidMechanicsLagrangeContact::calculateResidualNorm( real64 const & time real64 const solidResidual = SolidMechanicsLagrangianFEM::calculateResidualNorm( time, dt, domain, dofManager, localRhs ); - real64 momentumR2 = 0.0; - real64 contactR2 = 0.0; + real64 const contactResidual = calculateContactResidualNorm( domain, dofManager, localRhs ); + + return sqrt( solidResidual * solidResidual + contactResidual * contactResidual ); +} + +real64 SolidMechanicsLagrangeContact::calculateContactResidualNorm( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ) +{ + string const & dofKey = dofManager.getKey( contact::traction::key() ); + globalIndex const rankOffset = dofManager.rankOffset(); + + real64 contactResidual = 0.0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel const & mesh, arrayView1d< string const > const & regionNames ) { - NodeManager const & nodeManager = mesh.getNodeManager(); - arrayView1d< globalIndex const > const & dispDofNumber = - nodeManager.getReference< array1d< globalIndex > >( dofManager.getKey( solidMechanics::totalDisplacement::key() ) ); - - string const & dofKey = dofManager.getKey( contact::traction::key() ); - globalIndex const rankOffset = dofManager.rankOffset(); - - arrayView1d< integer const > const & elemGhostRank = nodeManager.ghostRank(); - - RAJA::ReduceSum< parallelDeviceReduce, real64 > localSum0( 0.0 ); - forAll< parallelDevicePolicy<> >( nodeManager.size(), - [localRhs, localSum0, dispDofNumber, rankOffset, elemGhostRank] GEOS_HOST_DEVICE ( localIndex const k ) - { - if( elemGhostRank[k] < 0 ) - { - localIndex const localRow = LvArray::integerConversion< localIndex >( dispDofNumber[k] - rankOffset ); - for( localIndex dim = 0; dim < 3; ++dim ) - { - localSum0 += localRhs[localRow + dim] * localRhs[localRow + dim]; - } - } - } ); - momentumR2 += localSum0.get(); - mesh.getElemManager().forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, FaceElementSubRegion const & subRegion ) { @@ -721,68 +708,29 @@ real64 SolidMechanicsLagrangeContact::calculateResidualNorm( real64 const & time } } } ); - contactR2 += localSum.get(); + contactResidual += localSum.get(); } ); } ); - real64 localR2[2] = { momentumR2, contactR2 }; - real64 globalResidualNorm[3]{}; - - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); - int const size = MpiWrapper::commSize( MPI_COMM_GEOSX ); - array1d< real64 > globalR2( 2 * size ); - globalR2.zero(); - - // Everything is done on rank 0 - MpiWrapper::gather( localR2, - 2, - globalR2.data(), - 2, - 0, - MPI_COMM_GEOSX ); - - if( rank==0 ) - { - globalResidualNorm[0] = 0.0; - globalResidualNorm[1] = 0.0; - for( int r=0; rm_nonlinearSolverParameters.m_numNewtonIterations == 0 ) { - m_initialResidual[0] = globalResidualNorm[0]; - m_initialResidual[1] = globalResidualNorm[1]; - m_initialResidual[2] = globalResidualNorm[2]; - globalResidualNorm[0] = 1.0; - globalResidualNorm[1] = 1.0; - globalResidualNorm[2] = 1.0; + this->m_initialContactResidual = contactResidual; + contactResidual = 1.0; } else { - globalResidualNorm[0] /= (m_initialResidual[0]+1.0); - globalResidualNorm[1] /= (m_initialResidual[1]+1.0); - // Add 0 just to match Matlab code results - globalResidualNorm[2] /= (m_initialResidual[2]+1.0); + contactResidual /= (this->m_initialContactResidual + 1.0); } - if( getLogLevel() >= 1 && logger::internal::rank == 0 ) + + if( getLogLevel() >= 1 && logger::internal::rank==0 ) { - std::cout<< GEOS_FMT( - " ( Rdisplacement, Rtraction, Rtotal ) = ( {:15.6e}, {:15.6e}, {:15.6e} )", - globalResidualNorm[0], - globalResidualNorm[1], - globalResidualNorm[2] ); + std::cout << GEOS_FMT( " ( Rtraction ) = ( {:15.6e} )", contactResidual ); } - return sqrt( globalResidualNorm[2]*globalResidualNorm[2] + solidResidual*solidResidual ); + + return contactResidual; } void SolidMechanicsLagrangeContact::createPreconditioner( DomainPartition const & domain ) @@ -1184,11 +1132,11 @@ void SolidMechanicsLagrangeContact:: { if( i == 0 ) { - elemRHS[i] = +Ja * dispJump[kfe][i]; + elemRHS[i] = Ja * dispJump[kfe][i]; } else { - elemRHS[i] = +Ja * ( dispJump[kfe][i] - previousDispJump[kfe][i] ); + elemRHS[i] = Ja * ( dispJump[kfe][i] - previousDispJump[kfe][i] ); } } @@ -1216,7 +1164,7 @@ void SolidMechanicsLagrangeContact:: case contact::FractureState::Slip: case contact::FractureState::NewSlip: { - elemRHS[0] = +Ja * dispJump[kfe][0]; + elemRHS[0] = Ja * dispJump[kfe][0]; for( localIndex kf = 0; kf < 2; ++kf ) { @@ -1247,7 +1195,10 @@ void SolidMechanicsLagrangeContact:: { for( localIndex i = 1; i < 3; ++i ) { - elemRHS[i] = +Ja * ( traction[kfe][i] - limitTau * sliding[ i-1 ] / slidingNorm ); + elemRHS[i] = Ja * ( traction[kfe][i] - limitTau * sliding[ i-1 ] / slidingNorm ); + + dRdT( i, 0 ) = Ja * dLimitTau_dNormalTraction * sliding[ i-1 ] / slidingNorm; + dRdT( i, i ) = Ja; } // A symmetric 2x2 matrix. @@ -1275,11 +1226,6 @@ void SolidMechanicsLagrangeContact:: } } } - for( localIndex i = 1; i < 3; ++i ) - { - dRdT( i, 0 ) = Ja * dLimitTau_dNormalTraction * sliding[ i-1 ] / slidingNorm; - dRdT( i, i ) = Ja; - } } else { @@ -1289,21 +1235,18 @@ void SolidMechanicsLagrangeContact:: { for( localIndex i = 1; i < 3; ++i ) { - elemRHS[i] = +Ja * ( traction[kfe][i] - limitTau * vaux[ i-1 ] / vauxNorm ); - } - for( localIndex i = 1; i < 3; ++i ) - { + elemRHS[i] = Ja * traction[kfe][i] * ( 1.0 - limitTau / vauxNorm ); + + dRdT( i, 0 ) = Ja * traction[kfe][i] * dLimitTau_dNormalTraction / vauxNorm; dRdT( i, i ) = Ja; } } else { - for( localIndex i = 1; i < 3; ++i ) + for( int i = 1; i < 3; ++i ) { elemRHS[i] = 0.0; - } - for( localIndex i = 1; i < 3; ++i ) - { + dRdT( i, i ) = Ja; } } @@ -1312,13 +1255,10 @@ void SolidMechanicsLagrangeContact:: } case contact::FractureState::Open: { - for( localIndex i = 0; i < 3; ++i ) + for( int i = 0; i < 3; ++i ) { - elemRHS[i] = +Ja * traction[kfe][i]; - } + elemRHS[i] = Ja * traction[kfe][i]; - for( localIndex i = 0; i < 3; ++i ) - { dRdT( i, i ) = Ja; } break; @@ -1942,6 +1882,7 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai hasConfigurationConverged &= checkActiveSetSub.get(); } ); } ); + // Need to synchronize the fracture state due to the use will be made of in AssemblyStabilization synchronizeFractureState( domain ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index a0ab282a6c2..4f430fa486d 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -154,12 +154,18 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase string getStabilizationName() const { return m_stabilizationName; } +protected: + + real64 calculateContactResidualNorm( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ); + private: string m_stabilizationName; real64 const m_slidingCheckTolerance = 0.05; - real64 m_initialResidual[3] = {0.0, 0.0, 0.0}; + real64 m_initialContactResidual = 0.0; void createPreconditioner( DomainPartition const & domain ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 86d04ed2cf1..0c215c0db50 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -191,9 +191,6 @@ void SinglePhasePoromechanicsConformingFractures::assembleElementBasedContributi /// 3. assemble Force Residual w.r.t. pressure and Flow mass residual w.r.t. displacement Base::assembleElementBasedTerms( time_n, dt, domain, dofManager, localMatrix, localRhs ); - this->solidMechanicsSolver()->getMaxForce() = 0.0; - /// TODO: this is to be consistent with old version but it should be changed. We likely want to scale the residual for contact the same - /// way we scale the mechanics one. // Flow accumulation for fractures forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, From 9a18d31ccdb5f103512c27f3285c504e6ca3a4c4 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" <50467563+victorapm@users.noreply.github.com> Date: Tue, 23 Apr 2024 15:16:55 -0400 Subject: [PATCH 037/286] Update default hypre parameters (#3066) --- .../interfaces/hypre/HypreMGR.hpp | 6 +- .../interfaces/hypre/HyprePreconditioner.cpp | 1 + .../CompositionalMultiphaseFVM.hpp | 3 +- .../CompositionalMultiphaseHybridFVM.hpp | 3 +- .../CompositionalMultiphaseReservoirFVM.hpp | 3 +- ...positionalMultiphaseReservoirHybridFVM.hpp | 3 +- .../MultiphasePoromechanicsReservoirFVM.hpp | 3 +- .../ReactiveCompositionalMultiphaseOBL.hpp | 3 +- .../ThermalCompositionalMultiphaseFVM.hpp | 7 +- .../ThermalMultiphasePoromechanics.hpp | 3 +- .../unitTests/testKrylovSolvers.cpp | 1 + .../utilities/LinearSolverParameters.hpp | 17 +- .../schema/docs/elementRegionsGroup_other.rst | 12 +- .../docs/particleRegionsGroup_other.rst | 10 +- src/coreComponents/schema/schema.xsd.other | 276 +++++++++--------- 15 files changed, 182 insertions(+), 169 deletions(-) diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp index 6063db453c3..886d0a8b009 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp @@ -203,6 +203,7 @@ class MGRStrategyBase GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggPMaxElmts( solver.ptr, 16 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetTol( solver.ptr, 0.0 ) ); #if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( solver.ptr, 0 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetCoarsenType( solver.ptr, toUnderlying( AMGCoarseningType::PMIS ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxType( solver.ptr, getAMGRelaxationType( LinearSolverParameters::AMG::SmootherType::l1jacobi ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumSweeps( solver.ptr, 2 ) ); @@ -225,11 +226,12 @@ class MGRStrategyBase GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGCreate( &solver.ptr ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetPrintLevel( solver.ptr, 0 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetMaxIter( solver.ptr, 1 ) ); - // TODO: keep or not 1 aggressive level? - GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( solver.ptr, 1 ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( solver.ptr, 1 ) ); // TODO: keep or not 1 aggressive level? + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggPMaxElmts( solver.ptr, 16 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetTol( solver.ptr, 0.0 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumFunctions( solver.ptr, 2 ) ); // pressure and temperature (CPTR) #if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( solver.ptr, 0 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetCoarsenType( solver.ptr, toUnderlying( AMGCoarseningType::PMIS ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxType( solver.ptr, getAMGRelaxationType( LinearSolverParameters::AMG::SmootherType::l1jacobi ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumSweeps( solver.ptr, 2 ) ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp index a6ed6bbd705..ca99a2e832f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp @@ -182,6 +182,7 @@ void createAMG( LinearSolverParameters const & params, GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumPaths( precond.ptr, params.amg.aggressiveNumPaths ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( precond.ptr, params.amg.aggressiveNumLevels ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggInterpType( precond.ptr, aggInterpType ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggPMaxElmts( precond.ptr, params.amg.aggressiveInterpMaxNonZeros ) ); } // Set coarsest level solver diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp index 4c0f16f5766..241593eed7f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp @@ -70,8 +70,7 @@ class CompositionalMultiphaseFVM : public MGRStrategyBase< 2 > m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::galerkin; m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; - m_levelFRelaxType[1] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[1] = 1; + m_levelFRelaxType[1] = MGRFRelaxationType::none; m_levelInterpType[1] = MGRInterpolationType::injection; m_levelRestrictType[1] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkinRAI; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp index 091e55857b1..7c2f53c845a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp @@ -79,8 +79,7 @@ class CompositionalMultiphaseHybridFVM : public MGRStrategyBase< 3 > m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; // Level 1 - m_levelFRelaxType[1] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[1] = 1; + m_levelFRelaxType[1] = MGRFRelaxationType::none; m_levelInterpType[1] = MGRInterpolationType::jacobi; m_levelRestrictType[1] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkinRAI; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp index 2c994aef5e3..55b8cfef2a0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp @@ -91,8 +91,7 @@ class CompositionalMultiphaseReservoirFVM : public MGRStrategyBase< 3 > m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // level 2 - m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[2] = 1; + m_levelFRelaxType[2] = MGRFRelaxationType::none; m_levelInterpType[2] = MGRInterpolationType::injection; m_levelRestrictType[2] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkinRAI; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp index 929c02d598c..37ea6379208 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp @@ -99,8 +99,7 @@ class CompositionalMultiphaseReservoirHybridFVM : public MGRStrategyBase< 4 > m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // Level 2 - m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[2] = 1; + m_levelFRelaxType[2] = MGRFRelaxationType::none; m_levelInterpType[2] = MGRInterpolationType::injection; m_levelRestrictType[2] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkinRAI; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp index 22b3843b4d6..46397b4519f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp @@ -107,8 +107,7 @@ class MultiphasePoromechanicsReservoirFVM : public MGRStrategyBase< 4 > m_levelGlobalSmootherType[2] = MGRGlobalSmootherType::none; // Level 3 - m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; //default, i.e. Jacobi - m_levelFRelaxIters[2] = 1; + m_levelFRelaxType[3] = MGRFRelaxationType::none; m_levelInterpType[3] = MGRInterpolationType::injection; m_levelRestrictType[3] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[3] = MGRCoarseGridMethod::galerkinRAI; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp index 38792f6baff..03eec16db7e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp @@ -65,8 +65,7 @@ class ReactiveCompositionalMultiphaseOBL : public MGRStrategyBase< 1 > setupLabels(); - m_levelFRelaxType[0] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[0] = 1; + m_levelFRelaxType[0] = MGRFRelaxationType::none; m_levelInterpType[0] = MGRInterpolationType::injection; m_levelRestrictType[0] = MGRRestrictionType::injection; m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::cprLikeBlockDiag; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp index 0cea36ca96e..5870bb0cc37 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp @@ -70,13 +70,12 @@ class ThermalCompositionalMultiphaseFVM : public MGRStrategyBase< 2 > m_levelFRelaxIters[0] = 1; m_levelInterpType[0] = MGRInterpolationType::jacobi; // Diagonal scaling (Jacobi) m_levelRestrictType[0] = MGRRestrictionType::injection; - m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::galerkin; // Standard Galerkin + m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::galerkin; m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::blockGaussSeidel; m_levelGlobalSmootherIters[0] = 1; - m_levelFRelaxType[1] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[1] = 1; - m_levelInterpType[1] = MGRInterpolationType::injection; // Injection + m_levelFRelaxType[1] = MGRFRelaxationType::none; + m_levelInterpType[1] = MGRInterpolationType::injection; m_levelRestrictType[1] = MGRRestrictionType::injection; m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::cprLikeBlockDiag; // Non-Galerkin Quasi-IMPES CPR m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::ilu0; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp index 68ea0e4cf10..bf12729ff28 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp @@ -90,8 +90,7 @@ class ThermalMultiphasePoromechanics : public MGRStrategyBase< 3 > m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // Level 2 - m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[2] = 1; + m_levelFRelaxType[2] = MGRFRelaxationType::none; m_levelInterpType[2] = MGRInterpolationType::injection; m_levelRestrictType[2] = MGRRestrictionType::injection; m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::cprLikeBlockDiag; diff --git a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp index da8d734d661..63d8dbe2f8d 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp @@ -50,6 +50,7 @@ LinearSolverParameters params_GMRES() LinearSolverParameters parameters; parameters.krylov.relTolerance = 1e-8; parameters.krylov.maxIterations = 500; + parameters.krylov.maxRestart = 100; parameters.solverType = geos::LinearSolverParameters::SolverType::gmres; return parameters; } diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp index 881fcc9984c..bdcf1de4eb2 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp @@ -116,7 +116,11 @@ struct LinearSolverParameters { real64 relTolerance = 1e-6; ///< Relative convergence tolerance for iterative solvers integer maxIterations = 200; ///< Max iterations before declaring convergence failure - integer maxRestart = 200; ///< Max number of vectors in Krylov basis before restarting +#if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP + integer maxRestart = 50; ///< Max number of vectors in Krylov basis before restarting (GPUs) +#else + integer maxRestart = 200; ///< Max number of vectors in Krylov basis before restarting (CPUs) +#endif integer useAdaptiveTol = false; ///< Use Eisenstat-Walker adaptive tolerance real64 weakestTol = 1e-3; ///< Weakest allowed tolerance when using adaptive method } @@ -227,12 +231,12 @@ struct LinearSolverParameters rigidBodyModes ///< Rigid body modes }; -#if defined(GEOSX_USE_HYPRE_CUDA) || defined(GEOSX_USE_HYPRE_HIP) - CoarseningType coarseningType = CoarseningType::PMIS; ///< Coarsening algorithm - SmootherType smootherType = SmootherType::l1jacobi; ///< Smoother type +#if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP + CoarseningType coarseningType = CoarseningType::PMIS; ///< Coarsening algorithm (GPUs) + SmootherType smootherType = SmootherType::l1jacobi; ///< Smoother type (GPUs) #else - CoarseningType coarseningType = CoarseningType::HMIS; ///< Coarsening algorithm - SmootherType smootherType = SmootherType::l1sgs; ///< Smoother type + CoarseningType coarseningType = CoarseningType::HMIS; ///< Coarsening algorithm (CPUs) + SmootherType smootherType = SmootherType::l1sgs; ///< Smoother type (CPUs) #endif integer maxLevels = 20; ///< Maximum number of coarsening levels @@ -246,6 +250,7 @@ struct LinearSolverParameters integer aggressiveNumPaths = 1; ///< Number of paths agg. coarsening. integer aggressiveNumLevels = 0; ///< Number of levels for aggressive coarsening. AggInterpType aggressiveInterpType = AggInterpType::multipass; ///< Interp. type for agg. coarsening. + integer aggressiveInterpMaxNonZeros = 16; ///< Aggressive Interpolation - Max. nonzeros/row. PreOrPost preOrPostSmoothing = PreOrPost::both; ///< Pre and/or post smoothing real64 threshold = 0.0; ///< Threshold for "strong connections" (for classical ///< and smoothed-aggregation AMG) diff --git a/src/coreComponents/schema/docs/elementRegionsGroup_other.rst b/src/coreComponents/schema/docs/elementRegionsGroup_other.rst index adf1c1b8aec..4fd505d0214 100644 --- a/src/coreComponents/schema/docs/elementRegionsGroup_other.rst +++ b/src/coreComponents/schema/docs/elementRegionsGroup_other.rst @@ -1,9 +1,11 @@ -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ +==================== ==== ========================================= +Name Type Description +==================== ==== ========================================= +CellElementRegion node :ref:`DATASTRUCTURE_CellElementRegion` +SurfaceElementRegion node :ref:`DATASTRUCTURE_SurfaceElementRegion` +WellElementRegion node :ref:`DATASTRUCTURE_WellElementRegion` +==================== ==== ========================================= diff --git a/src/coreComponents/schema/docs/particleRegionsGroup_other.rst b/src/coreComponents/schema/docs/particleRegionsGroup_other.rst index adf1c1b8aec..4a1517c2a56 100644 --- a/src/coreComponents/schema/docs/particleRegionsGroup_other.rst +++ b/src/coreComponents/schema/docs/particleRegionsGroup_other.rst @@ -1,9 +1,9 @@ -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ +============== ==== =================================== +Name Type Description +============== ==== =================================== +ParticleRegion node :ref:`DATASTRUCTURE_ParticleRegion` +============== ==== =================================== diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index a9095627224..1e0a54c1348 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -2885,18 +2885,18 @@ - - - - - + + + + + + - + + - - @@ -2909,16 +2909,24 @@ - - + + + + + + + + + + + + - - @@ -2927,18 +2935,15 @@ - - - + + - - @@ -2947,24 +2952,24 @@ - - + + + + - + + + - - - - - - - - + + + + @@ -2973,36 +2978,35 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + - + + - - - - - - - - - - - - - - - - @@ -3011,30 +3015,32 @@ - - - - + + + + + + + + + + + + + + + + - + + + - - - - - - - - - - - - @@ -3043,13 +3049,16 @@ - - - + + + + + + - + @@ -3063,19 +3072,16 @@ - - - - - - + + - + + @@ -3084,15 +3090,18 @@ + + - + - + + @@ -3101,24 +3110,24 @@ - - - - + + - + - - - - - - + + + + + + + + @@ -3127,35 +3136,36 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + - - + + + + + + + + + + + + + + + + + @@ -3164,31 +3174,30 @@ - - - - - - - - - - - - - - - - + + + + - + - + + + + + + + + + + + + @@ -3197,6 +3206,7 @@ + + - From 8ec9d992135fa2b8bec53b22d463cddb33edaef6 Mon Sep 17 00:00:00 2001 From: Herve Gross <40979822+herve-gross@users.noreply.github.com> Date: Wed, 24 Apr 2024 10:03:32 -0700 Subject: [PATCH 038/286] fix blas lapack links for tests (#2685) --- src/coreComponents/mesh/unitTests/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/mesh/unitTests/CMakeLists.txt b/src/coreComponents/mesh/unitTests/CMakeLists.txt index c017bec6962..862bbca219e 100644 --- a/src/coreComponents/mesh/unitTests/CMakeLists.txt +++ b/src/coreComponents/mesh/unitTests/CMakeLists.txt @@ -4,7 +4,7 @@ set( mesh_tests testComputationalGeometry.cpp testGeometricObjects.cpp ) -set( dependencyList gtest mesh ${parallelDeps} ) +set( dependencyList blas lapack gtest mesh ${parallelDeps} ) # Add gtest C++ based tests foreach(test ${mesh_tests}) From f87a70882978bd707b7e3324df1ec450084c423d Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Thu, 25 Apr 2024 17:37:45 -0700 Subject: [PATCH 039/286] change "self-hosted specification" in yaml files to "streak" (#3097) --- .github/workflows/ci_tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 150718bf957..8e41dffcd88 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -206,7 +206,7 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF GCP_BUCKET: geosx/integratedTests - RUNS_ON: self-hosted + RUNS_ON: streak DOCKER_RUN_ARGS: "--cpus=8 --memory=128g" code_coverage: @@ -253,7 +253,7 @@ jobs: ENABLE_HYPRE_DEVICE: CUDA ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF - RUNS_ON: self-hosted + RUNS_ON: streak DOCKER_RUN_ARGS: "--cpus=8 --memory=256g --runtime=nvidia --gpus all" - name: Centos (7.7, gcc 8.3.1, open-mpi 1.10.7, cuda 11.8.89) From 92e12f1a0cedcf8dbe63af99a0dd31eb82657cb8 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Fri, 26 Apr 2024 17:59:23 -0500 Subject: [PATCH 040/286] Small clean up for SinglePhasePoromechanicsEmbeddedFractures (#3093) --- ...glePhasePoromechanicsEmbeddedFractures.cpp | 82 ++----------------- ...glePhasePoromechanicsEmbeddedFractures.hpp | 40 +-------- 2 files changed, 9 insertions(+), 113 deletions(-) diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 5d890ad3003..20308bf7eaa 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -52,7 +52,7 @@ SinglePhasePoromechanicsEmbeddedFractures::~SinglePhasePoromechanicsEmbeddedFrac void SinglePhasePoromechanicsEmbeddedFractures::registerDataOnMesh( dataRepository::Group & meshBodies ) { - SinglePhasePoromechanics::registerDataOnMesh( meshBodies ); + Base::registerDataOnMesh( meshBodies ); forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, MeshLevel & mesh, @@ -69,7 +69,7 @@ void SinglePhasePoromechanicsEmbeddedFractures::registerDataOnMesh( dataReposito void SinglePhasePoromechanicsEmbeddedFractures::initializePostInitialConditionsPreSubGroups() { - SinglePhasePoromechanics::initializePostInitialConditionsPreSubGroups(); + Base::initializePostInitialConditionsPreSubGroups(); updateState( this->getGroupByPath< DomainPartition >( "/Problem/domain" ) ); } @@ -406,7 +406,7 @@ void SinglePhasePoromechanicsEmbeddedFractures::assembleSystem( real64 const tim thermoPoromechanicsEFEMKernels::ThermalSinglePhasePoromechanicsEFEMKernelFactory >( mesh, dofManager, regionNames, - SinglePhasePoromechanics::viewKeyStruct::porousMaterialNamesString(), + Base::viewKeyStruct::porousMaterialNamesString(), localMatrix, localRhs, dt ); @@ -419,7 +419,7 @@ void SinglePhasePoromechanicsEmbeddedFractures::assembleSystem( real64 const tim poromechanicsEFEMKernels::SinglePhaseKernelFactory >( mesh, dofManager, regionNames, - SinglePhasePoromechanics::viewKeyStruct::porousMaterialNamesString(), + Base::viewKeyStruct::porousMaterialNamesString(), localMatrix, localRhs, dt ); @@ -438,84 +438,12 @@ void SinglePhasePoromechanicsEmbeddedFractures::assembleSystem( real64 const tim } -void SinglePhasePoromechanicsEmbeddedFractures::applyBoundaryConditions( real64 const time_n, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) -{ - solidMechanicsSolver()->applyBoundaryConditions( time_n, dt, - domain, - dofManager, - localMatrix, - localRhs ); - - flowSolver()->applyBoundaryConditions( time_n, dt, - domain, - dofManager, - localMatrix, - localRhs ); -} - -void SinglePhasePoromechanicsEmbeddedFractures::implicitStepSetup( real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) -{ - flowSolver()->implicitStepSetup( time_n, dt, domain ); - solidMechanicsSolver()->implicitStepSetup( time_n, dt, domain ); -} - -void SinglePhasePoromechanicsEmbeddedFractures::implicitStepComplete( real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) -{ - solidMechanicsSolver()->implicitStepComplete( time_n, dt, domain ); - flowSolver()->implicitStepComplete( time_n, dt, domain ); -} - -void SinglePhasePoromechanicsEmbeddedFractures::resetStateToBeginningOfStep( DomainPartition & domain ) -{ - flowSolver()->resetStateToBeginningOfStep( domain ); - solidMechanicsSolver()->resetStateToBeginningOfStep( domain ); -} - - -real64 SinglePhasePoromechanicsEmbeddedFractures::calculateResidualNorm( real64 const & time_n, - real64 const & dt, - DomainPartition const & domain, - DofManager const & dofManager, - arrayView1d< real64 const > const & localRhs ) -{ - // compute norm of momentum balance residual equations - real64 const momentumResidualNorm = solidMechanicsSolver()->calculateResidualNorm( time_n, dt, domain, dofManager, localRhs ); - - // compute norm of mass balance residual equations - real64 const massResidualNorm = flowSolver()->calculateResidualNorm( time_n, dt, domain, dofManager, localRhs ); - - real64 const residual = sqrt( momentumResidualNorm * momentumResidualNorm + massResidualNorm * massResidualNorm ); - - return residual; -} - -void SinglePhasePoromechanicsEmbeddedFractures::applySystemSolution( DofManager const & dofManager, - arrayView1d< real64 const > const & localSolution, - real64 const scalingFactor, - real64 const dt, - DomainPartition & domain ) -{ - // update displacement and jump - solidMechanicsSolver()->applySystemSolution( dofManager, localSolution, scalingFactor, dt, domain ); - // update pressure field - flowSolver()->applySystemSolution( dofManager, localSolution, scalingFactor, dt, domain ); -} - void SinglePhasePoromechanicsEmbeddedFractures::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; /// 1. update the reservoir - SinglePhasePoromechanics::updateState( domain ); + Base::updateState( domain ); // remove the contribution of the hydraulic aperture from the stencil weights flowSolver()->prepareStencilWeights( domain ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp index 5cd29456ab4..efa598b9de7 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -29,6 +29,9 @@ namespace geos class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsEmbeddedFractures > { public: + + using Base = SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsEmbeddedFractures >; + SinglePhasePoromechanicsEmbeddedFractures( const std::string & name, Group * const parent ); ~SinglePhasePoromechanicsEmbeddedFractures() override; @@ -38,7 +41,7 @@ class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanic * @return string that contains the catalog name to generate a new SinglePhasePoromechanicsEmbeddedFractures object through the object * catalog. */ - static string catalogName() { return "SinglePhasePoromechanicsEmbeddedFractures"; } + static string catalogName() { return Base::catalogName() + "EmbeddedFractures"; } /** * @copydoc SolverBase::getCatalogName() */ @@ -57,11 +60,6 @@ class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanic setupDofs( DomainPartition const & domain, DofManager & dofManager ) const override; - virtual void - implicitStepSetup( real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) override final; - virtual void assembleSystem( real64 const time, real64 const dt, @@ -70,36 +68,6 @@ class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanic CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) override; - virtual void - applyBoundaryConditions( real64 const time_n, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) override; - - virtual real64 - calculateResidualNorm( real64 const & time_n, - real64 const & dt, - DomainPartition const & domain, - DofManager const & dofManager, - arrayView1d< real64 const > const & localRhs ) override; - - virtual void - applySystemSolution( DofManager const & dofManager, - arrayView1d< real64 const > const & localSolution, - real64 const scalingFactor, - real64 const dt, - DomainPartition & domain ) override; - - virtual void - implicitStepComplete( real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) override final; - - virtual void - resetStateToBeginningOfStep( DomainPartition & domain ) override; - /** * @Brief add extra nnz to each row induced by the coupling * @param domain the physical domain object From a7c0d02600fda16196e5e04f39bdb1a8dd7bc068 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Mon, 29 Apr 2024 09:03:37 -0700 Subject: [PATCH 041/286] Fix inconsistencies between serial and parallel conforming fracs run + add new output fields. (#3065) --- host-configs/apple/macOS_Matteo.cmake | 4 - host-configs/apple/macOS_customized.cmake | 7 ++ .../ContactMechanics_TFrac_base.xml | 8 +- .../ContactMechanics_TFrac_benchmark.xml | 6 +- .../ContactMechanics_TFrac_smoke.xml | 6 +- ...asticWellbore_ImperfectInterfaces_base.xml | 3 +- ...asticWellbore_ImperfectInterfaces_base.xml | 9 +- integratedTests | 2 +- .../mainInterface/ProblemManager.cpp | 16 ++- .../mesh/EmbeddedSurfaceSubRegion.cpp | 12 --- .../mesh/EmbeddedSurfaceSubRegion.hpp | 57 ---------- .../mesh/FaceElementSubRegion.cpp | 100 ++++++++++++++++++ .../mesh/FaceElementSubRegion.hpp | 24 +++++ src/coreComponents/mesh/MeshFields.hpp | 32 ++++++ .../mesh/SurfaceElementRegion.cpp | 2 +- .../mesh/SurfaceElementSubRegion.cpp | 29 +++-- .../mesh/SurfaceElementSubRegion.hpp | 80 ++++++++++++-- .../physicsSolvers/SolverBase.cpp | 2 +- .../physicsSolvers/contact/ContactFields.hpp | 15 ++- .../contact/ContactSolverBase.cpp | 2 + .../contact/SolidMechanicsEFEMKernels.hpp | 6 +- .../SolidMechanicsEmbeddedFractures.cpp | 5 +- .../contact/SolidMechanicsLagrangeContact.cpp | 73 +++++++++---- .../contact/SolidMechanicsLagrangeContact.hpp | 6 ++ .../proppantTransport/ProppantTransport.cpp | 6 +- .../multiphysics/HydrofractureSolver.cpp | 5 +- 26 files changed, 367 insertions(+), 150 deletions(-) delete mode 100644 host-configs/apple/macOS_Matteo.cmake create mode 100644 host-configs/apple/macOS_customized.cmake diff --git a/host-configs/apple/macOS_Matteo.cmake b/host-configs/apple/macOS_Matteo.cmake deleted file mode 100644 index 6edb525f1aa..00000000000 --- a/host-configs/apple/macOS_Matteo.cmake +++ /dev/null @@ -1,4 +0,0 @@ -set( HOMEBREW_DIR "/Users/cusini1/local" ) -set( CONFIG_NAME "macOS_Matteo" ) - -include(${CMAKE_CURRENT_LIST_DIR}/macOS_base.cmake) diff --git a/host-configs/apple/macOS_customized.cmake b/host-configs/apple/macOS_customized.cmake new file mode 100644 index 00000000000..c1707a0b945 --- /dev/null +++ b/host-configs/apple/macOS_customized.cmake @@ -0,0 +1,7 @@ +set( HOMEBREW_DIR $ENV{HOMEBREW_DIR} ) +set( CONFIG_NAME $ENV{GEOS_CONFIG_NAME} ) + +set(Python3_ROOT_DIR $ENV{GEOS_PYTHON_DIR} CACHE PATH "") +set(Python3_EXECUTABLE ${Python3_ROOT_DIR}/bin/python3 CACHE PATH "") + +include(${CMAKE_CURRENT_LIST_DIR}/macOS_base.cmake) diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml index e68f003b6e3..524da88f684 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml @@ -9,7 +9,7 @@ origin="{0.0, 0.0, 0.0}" lengthVector="{0.0, 1.0, 0.0}" widthVector="{0.0, 0.0, 1.0}" - dimensions="{ 100, 10 }"/> + dimensions="{ 100, 200 }"/> + dimensions="{ 100, 200 }"/> + dimensions="{ 50, 200 }"/> + dimensions="{ 50, 200 }"/> diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml index a4678fac840..83e9561f2c4 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml @@ -46,9 +46,9 @@ elementTypes="{ C3D8 }" xCoords="{ -1000, -100, 100, 1000 }" yCoords="{ -1000, -100, 100, 1000 }" - zCoords="{ 0, 1 }" - nx="{ 50, 200, 50 }" - ny="{ 50, 200, 50 }" + zCoords="{ 0, 2 }" + nx="{ 150, 200, 150 }" + ny="{ 150, 200, 150 }" nz="{ 2 }" cellBlockNames="{ cb1 }"/> diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml index ef470599b58..b788e0ac183 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml @@ -46,9 +46,9 @@ elementTypes="{ C3D8 }" xCoords="{ -1000, -100, 100, 1000 }" yCoords="{ -1000, -100, 100, 1000 }" - zCoords="{ 0, 1 }" - nx="{ 5, 52, 5 }" - ny="{ 5, 52, 5 }" + zCoords="{ 0, 100 }" + nx="{ 20, 20, 20 }" + ny="{ 20, 20, 20 }" nz="{ 2 }" cellBlockNames="{ cb1 }"/> diff --git a/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml b/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml index 04a17b7ea8b..06384dcce1c 100644 --- a/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml +++ b/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml @@ -12,8 +12,7 @@ + newtonMaxIter="10"/> diff --git a/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml b/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml index b2028906503..82aae72d5bb 100644 --- a/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml +++ b/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml @@ -24,15 +24,14 @@ + newtonMaxIter="10"/> @@ -67,8 +66,10 @@ - + diff --git a/integratedTests b/integratedTests index 1bbf151ccc7..1de49d91217 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit 1bbf151ccc7de982e201753f16dfe1f9035b0311 +Subproject commit 1de49d91217f6ddd2b254948636513a7e1bee108 diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index d112a884b7c..0d86412e41f 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -683,13 +683,21 @@ void ProblemManager::generateMesh() FaceManager & faceManager = meshLevel.getFaceManager(); EdgeManager & edgeManager = meshLevel.getEdgeManager(); NodeManager const & nodeManager = meshLevel.getNodeManager(); + ElementRegionManager & elementManager = meshLevel.getElemManager(); - // The computation of geometric quantities is now possible for `FaceElementSubRegion`, - // because the ghosting ensures that the neighbor cells of the fracture elements are available. - // These neighbor cells are providing the node information to the fracture elements. - meshLevel.getElemManager().forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) + elementManager.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) { + /// 1. The computation of geometric quantities which is now possible for `FaceElementSubRegion`, + // because the ghosting ensures that the neighbor cells of the fracture elements are available. + // These neighbor cells are providing the node information to the fracture elements. subRegion.calculateElementGeometricQuantities( nodeManager, faceManager ); + + // 2. Reorder the face map based on global numbering of neighboring cells + subRegion.flipFaceMap( faceManager, elementManager ); + + // 3. We flip the face normals of faces adjacent to the faceElements if they are not pointing in the + // direction of the fracture. + subRegion.fixNeighboringFacesNormals( faceManager, elementManager ); } ); faceManager.setIsExternal(); diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp index 6dd53dec055..d7101bfa3b8 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp @@ -40,24 +40,12 @@ void surfaceWithGhostNodes::insert( globalIndex const & edgeIndex ) EmbeddedSurfaceSubRegion::EmbeddedSurfaceSubRegion( string const & name, dataRepository::Group * const parent ): SurfaceElementSubRegion( name, parent ), - m_normalVector(), - m_tangentVector1(), - m_tangentVector2(), m_numOfJumpEnrichments( 3 ), m_connectivityIndex(), m_parentPlaneName() { m_elementType = ElementType::Polygon; - registerWrapper( viewKeyStruct::normalVectorString(), &m_normalVector ). - setDescription( "Unit normal vector to the embedded surface." ); - - registerWrapper( viewKeyStruct::t1VectorString(), &m_tangentVector1 ). - setDescription( "Unit vector in the first tangent direction to the embedded surface." ); - - registerWrapper( viewKeyStruct::t2VectorString(), &m_tangentVector2 ). - setDescription( "Unit vector in the second tangent direction to the embedded surface." ); - registerWrapper( viewKeyStruct::elementCenterString(), &m_elementCenter ). setDescription( "The center of each EmbeddedSurface element." ); diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp index 95d5c649d4e..a0bf416d2a1 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp @@ -178,15 +178,6 @@ class EmbeddedSurfaceSubRegion : public SurfaceElementSubRegion */ struct viewKeyStruct : SurfaceElementSubRegion::viewKeyStruct { - /// @return Embedded surface element normal vector string - static constexpr char const * normalVectorString() { return "normalVector"; } - - /// @return Tangent vector 1 string - static constexpr char const * t1VectorString() { return "tangentVector1"; } - - /// @return Tangent vector 2 string - static constexpr char const * t2VectorString() { return "tangentVector2"; } - /// @return Connectivity index string static constexpr char const * connectivityIndexString() { return "connectivityIndex"; } @@ -216,19 +207,6 @@ class EmbeddedSurfaceSubRegion : public SurfaceElementSubRegion */ localIndex const & numOfJumpEnrichments() const {return m_numOfJumpEnrichments;} - /** - * @brief Get normal vectors. - * @return an array of normal vectors. - */ - arrayView2d< real64 const > getNormalVector() const { return m_normalVector; } - - /** - * @brief Get normal vector of a specific embedded surface element. - * @param k index of the embedded surface element - * @return the normal vector of a specific embedded surface element - */ - arraySlice1d< real64 const > getNormalVector( localIndex k ) const { return m_normalVector[k]; } - /** * @brief Get the name of the bounding plate that was used to generate fracture element k. * @param k the index of the embedded surface element @@ -236,32 +214,6 @@ class EmbeddedSurfaceSubRegion : public SurfaceElementSubRegion */ string const & getFractureName( localIndex k ) const { return m_parentPlaneName[k]; } - /** - * @brief Get an array of the first tangent vector of the embedded surface elements. - * @return an array of the first tangent vector of the embedded surface elements - */ - arrayView2d< real64 const > getTangentVector1() const { return m_tangentVector1; } - - /** - * @brief Get the first tangent vector of a specific embedded surface element. - * @param k index of the embedded surface element - * @return the first tangent vector of a specific embedded surface element - */ - arraySlice1d< real64 const > getTangentVector1( localIndex k ) const { return m_tangentVector1[k]; } - - /** - * @brief Get an array of the second tangent vector of the embedded surface elements. - * @return an array of the second tangent vector of the embedded surface elements - */ - arrayView2d< real64 const > getTangentVector2() const { return m_tangentVector2.toViewConst(); } - - /** - * @brief Get the second tangent vector of a specific embedded surface element. - * @param k index of the embedded surface element - * @return the second tangent vector of a specific embedded surface element - */ - arraySlice1d< real64 const > getTangentVector2( localIndex k ) const { return m_tangentVector2[k];} - /** * @brief Get the connectivity index of the embedded surface element. * @return the connectivity index @@ -294,15 +246,6 @@ class EmbeddedSurfaceSubRegion : public SurfaceElementSubRegion localIndex packUpDownMapsImpl( buffer_unit_type * & buffer, arrayView1d< localIndex const > const & packList ) const; - /// normal vector to the embedded surface element - array2d< real64 > m_normalVector; - - // tangential direction 1 - array2d< real64 > m_tangentVector1; - - // tangential direction 2 - array2d< real64 > m_tangentVector2; - /// The number of jump enrichments localIndex m_numOfJumpEnrichments; diff --git a/src/coreComponents/mesh/FaceElementSubRegion.cpp b/src/coreComponents/mesh/FaceElementSubRegion.cpp index 4c9b6cd7157..bcef879113d 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.cpp @@ -1048,4 +1048,104 @@ std::set< std::set< globalIndex > > FaceElementSubRegion::getCollocatedNodes() c return result; } +void FaceElementSubRegion::flipFaceMap( FaceManager & faceManager, + ElementRegionManager const & elemManager ) +{ + ArrayOfArraysView< localIndex > const & elems2dToFaces = faceList().toView(); + arrayView2d< localIndex const > const & faceToElementRegionIndex = faceManager.elementRegionList(); + arrayView2d< localIndex const > const & faceToElementSubRegionIndex = faceManager.elementSubRegionList(); + arrayView2d< localIndex const > const & faceToElementIndex = faceManager.elementList(); + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > const cellElemGlobalIndex = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( ObjectManagerBase::viewKeyStruct::localToGlobalMapString() ); + + forAll< parallelHostPolicy >( this->size(), [=]( localIndex const kfe ) + { + if( elems2dToFaces.sizeOfArray( kfe ) != 2 ) + { + return; + } + + localIndex & f0 = elems2dToFaces[kfe][0]; + localIndex & f1 = elems2dToFaces[kfe][1]; + + localIndex const er0 = faceToElementRegionIndex[f0][0]; + localIndex const esr0 = faceToElementSubRegionIndex[f0][0]; + localIndex const ek0 = faceToElementIndex[f0][0]; + + localIndex const er1 = faceToElementRegionIndex[f1][0]; + localIndex const esr1 = faceToElementSubRegionIndex[f1][0]; + localIndex const ek1 = faceToElementIndex[f1][0]; + + globalIndex const globalIndexElem0 = cellElemGlobalIndex[er0][esr0][ek0]; + globalIndex const globalIndexElem1 = cellElemGlobalIndex[er1][esr1][ek1]; + + if( globalIndexElem0 > globalIndexElem1 ) + { + std::swap( f0, f1 ); + } + } ); + +} + +void FaceElementSubRegion::fixNeighboringFacesNormals( FaceManager & faceManager, + ElementRegionManager const & elemManager ) +{ + ArrayOfArraysView< localIndex > const & elems2dToFaces = faceList().toView(); + arrayView2d< localIndex const > const & faceToElementRegionIndex = faceManager.elementRegionList(); + arrayView2d< localIndex const > const & faceToElementSubRegionIndex = faceManager.elementSubRegionList(); + arrayView2d< localIndex const > const & faceToElementIndex = faceManager.elementList(); + + arrayView2d< real64 const > const faceCenter = faceManager.faceCenter(); + FaceManager::NodeMapType & faceToNodes = faceManager.nodeList(); + + auto elemCenter = elemManager.constructArrayViewAccessor< real64, 2 >( CellElementSubRegion::viewKeyStruct::elementCenterString() ); + + // We need to modify the normals and the nodes ordering to be consistent. + arrayView2d< real64 > const faceNormal = faceManager.faceNormal(); + forAll< parallelHostPolicy >( this->size(), [=, &faceToNodes]( localIndex const kfe ) + { + if( elems2dToFaces.sizeOfArray( kfe ) != 2 ) + { + return; + } + + localIndex const f0 = elems2dToFaces[kfe][0]; + localIndex const f1 = elems2dToFaces[kfe][1]; + + /// Note: I am assuming that the 0 element is the elementSubregion one for faces + /// touching both a 3D and a 2D cell. + localIndex const er0 = faceToElementRegionIndex[f0][0]; + localIndex const esr0 = faceToElementSubRegionIndex[f0][0]; + localIndex const ek0 = faceToElementIndex[f0][0]; + + localIndex const er1 = faceToElementRegionIndex[f1][0]; + localIndex const esr1 = faceToElementSubRegionIndex[f1][0]; + localIndex const ek1 = faceToElementIndex[f1][0]; + + real64 f0e0vector[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceCenter[f0] ); + real64 f1e1vector[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceCenter[f1] ); + + LvArray::tensorOps::subtract< 3 >( f0e0vector, elemCenter[er0][esr0][ek0] ); + LvArray::tensorOps::subtract< 3 >( f1e1vector, elemCenter[er1][esr1][ek1] ); + + // If the vector connecting the face center and the elem center is in the same + // direction as the unit normal, we flip the normal coz it should be pointing outward + // (i.e., towards the fracture element). + if( LvArray::tensorOps::AiBi< 3 >( faceNormal[f0], f0e0vector ) < 0.0 ) + { + GEOS_WARNING( GEOS_FMT( "For fracture element {}, I had to flip the normal nf0 of face {}", kfe, f0 ) ); + LvArray::tensorOps::scale< 3 >( faceNormal[f0], -1.0 ); + std::reverse( faceToNodes[f0].begin(), faceToNodes[f0].end() ); + } + if( LvArray::tensorOps::AiBi< 3 >( faceNormal[f1], f1e1vector ) < 0.0 ) + { + GEOS_WARNING( GEOS_FMT( "For fracture element {}, I had to flip the normal nf1 of face {}", kfe, f1 ) ); + LvArray::tensorOps::scale< 3 >( faceNormal[f1], -1.0 ); + std::reverse( faceToNodes[f1].begin(), faceToNodes[f1].end() ); + } + } ); + +} + } /* namespace geos */ diff --git a/src/coreComponents/mesh/FaceElementSubRegion.hpp b/src/coreComponents/mesh/FaceElementSubRegion.hpp index 262f0aeeba5..4823f96ce8b 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.hpp @@ -133,6 +133,30 @@ class FaceElementSubRegion : public SurfaceElementSubRegion void inheritGhostRankFromParentFace( FaceManager const & faceManager, std::set< localIndex > const & indices ); + /** + * @brief Function to flip the face normals of faces adjacent to the faceElements if they are not pointing in the direction of the + * fracture. + * @param faceManager The face manager group + * @param elemManager The element region manager + * @details We want to flip the normals of the faces neighboring the fracture element. To do so, we check + * if the vector connecting the face center and the element center of the neighboring 3d cell is in the same + * direction as the unit normal of the face. If they are not, we flip the normal because it should be pointing outward + * (i.e., towards the fracture element). + */ + void fixNeighboringFacesNormals( FaceManager & faceManager, + ElementRegionManager const & elemManager ); + + /** + * @brief Function to flip the face map based on the gloal index of the nighboring elements + * @param faceManager The face manager group + * @param elemManager The element region manager + * @details In order to keep a consistent normal between multi processors ranks, we force the faces to be ordered + * based on the global numbering of the 3d elements attached to each face. The first face is always the one + * attached to the 3d cell with the smallest globalIndex. + */ + void flipFaceMap( FaceManager & faceManager, + ElementRegionManager const & elemManager ); + /** * @brief Struct containing the keys to all face element views. * @struct viewKeyStruct diff --git a/src/coreComponents/mesh/MeshFields.hpp b/src/coreComponents/mesh/MeshFields.hpp index 1b4cca146b3..f6b46623836 100644 --- a/src/coreComponents/mesh/MeshFields.hpp +++ b/src/coreComponents/mesh/MeshFields.hpp @@ -114,6 +114,14 @@ DECLARE_FIELD( elementAperture, WRITE_AND_READ, "Element aperture." ); +DECLARE_FIELD( elementArea, + "elementArea", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Element area." ); + DECLARE_FIELD( parentIndex, "parentIndex", array1d< localIndex >, @@ -146,6 +154,30 @@ DECLARE_FIELD( ruptureTime, WRITE_AND_READ, "Time that the object was ruptured/split." ); +DECLARE_FIELD( normalVector, + "normalVector", + array2d< real64 >, + 0.0, + LEVEL_0, + WRITE_AND_READ, + "Unit normal vector to the surface." ); + +DECLARE_FIELD( tangentVector1, + "tangentVector1", + array2d< real64 >, + 0.0, + LEVEL_0, + WRITE_AND_READ, + "Unit vector in the first tangent direction to the surface." ); + +DECLARE_FIELD( tangentVector2, + "tangentVector2", + array2d< real64 >, + 0.0, + LEVEL_0, + WRITE_AND_READ, + "Unit vector in the second tangent direction to the surface." ); + } // namespace fields } // namespace geos diff --git a/src/coreComponents/mesh/SurfaceElementRegion.cpp b/src/coreComponents/mesh/SurfaceElementRegion.cpp index 021e914310e..c9f036a6553 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.cpp @@ -76,7 +76,7 @@ void SurfaceElementRegion::initializePreSubGroups() { this->forElementSubRegions< SurfaceElementSubRegion >( [&] ( SurfaceElementSubRegion & subRegion ) { - subRegion.getWrapper< array1d< real64 > >( SurfaceElementSubRegion::viewKeyStruct::elementApertureString() ). + subRegion.getWrapper< array1d< real64 > >( fields::elementAperture::key() ). setApplyDefaultValue( m_defaultAperture ); } ); } diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp index 8261deb0bae..23c7e59eee6 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp @@ -20,6 +20,7 @@ #include "SurfaceElementSubRegion.hpp" #include "ElementRegionManager.hpp" +#include "MeshFields.hpp" namespace geos { @@ -34,7 +35,10 @@ SurfaceElementSubRegion::SurfaceElementSubRegion( string const & name, m_toNodesRelation(), m_toEdgesRelation(), m_elementAperture(), - m_elementArea() + m_elementArea(), + m_normalVector(), + m_tangentVector1(), + m_tangentVector2() { registerWrapper( viewKeyStruct::nodeListString(), &m_toNodesRelation ). setDescription( "Map to the nodes attached to each SurfaceElement." ); @@ -54,21 +58,24 @@ SurfaceElementSubRegion::SurfaceElementSubRegion( string const & name, setPlotLevel( PlotLevel::NOPLOT ). setDescription( "A map of face element local indices to the cell local indices" ); - registerWrapper( viewKeyStruct::elementApertureString(), &m_elementAperture ). - setApplyDefaultValue( 1.0e-5 ). - setPlotLevel( dataRepository::PlotLevel::LEVEL_0 ). - setDescription( "The aperture of each SurfaceElement." ); - - registerWrapper( viewKeyStruct::elementAreaString(), &m_elementArea ). - setApplyDefaultValue( -1.0 ). - setPlotLevel( dataRepository::PlotLevel::LEVEL_2 ). - setDescription( "The area of each SurfaceElement." ); - registerWrapper< real64_array >( viewKeyStruct::creationMassString() ). setApplyDefaultValue( 0.0 ). setPlotLevel( dataRepository::PlotLevel::LEVEL_1 ). setDescription( "The amount of remaining mass that was introduced when the SurfaceElement was created." ); + registerField( fields::elementAperture{}, &m_elementAperture ); + + registerField( fields::elementArea{}, &m_elementArea ); + + registerField( fields::normalVector{}, &m_normalVector ). + reference().resizeDimension< 1 >( 3 ); + + registerField( fields::tangentVector1{}, &m_tangentVector1 ). + reference().resizeDimension< 1 >( 3 ); + + registerField( fields::tangentVector2{}, &m_tangentVector2 ). + reference().resizeDimension< 1 >( 3 ); + excludeWrappersFromPacking( { viewKeyStruct::nodeListString(), viewKeyStruct::edgeListString(), viewKeyStruct::surfaceElementsToCellRegionsString(), diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp index df5f199524e..1462a12aa83 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp @@ -32,7 +32,7 @@ namespace geos * @class SurfaceElementSubRegion * * The SurfaceElementSubRegion class contains the functionality to support the concept of a - * surface element that can be either and embedded surface element or a face element. + * surface element that can be either and surface element or a face element. */ class SurfaceElementSubRegion : public ElementSubRegionBase { @@ -201,10 +201,68 @@ class SurfaceElementSubRegion : public ElementSubRegionBase */ arrayView1d< real64 const > getElementArea() const { return m_elementArea; } + /** + * @brief Const accessor to the normal vectors. + * @return a const view to the array of normal vectors. + */ + arrayView2d< real64 const > getNormalVector() const { return m_normalVector; } + + /** + * @brief Non const accessor to the normal vectors. + * @return a non const view to the array of normal vectors. + */ + arrayView2d< real64 > getNormalVector() { return m_normalVector; } + + /** + * @brief Get normal vector of a specific surface element. + * @param k index of the surface element + * @return the normal vector of a specific surface element + */ + arraySlice1d< real64 const > getNormalVector( localIndex k ) const { return m_normalVector[k]; } + + /** + * @brief Get an array of the first tangent vector of the surface elements. + * @return an array of the first tangent vector of the surface elements + */ + arrayView2d< real64 const > getTangentVector1() const { return m_tangentVector1; } + + /** + * @brief Get an array of the first tangent vector of the surface elements. + * @return a non const view to the array of the first tangent vector of the surface elements + */ + arrayView2d< real64 > getTangentVector1() { return m_tangentVector1; } + + /** + * @brief Get the first tangent vector of a specific surface element. + * @param k index of the surface element + * @return the first tangent vector of a specific surface element + */ + arraySlice1d< real64 const > getTangentVector1( localIndex const k ) const { return m_tangentVector1[k]; } + + /** + * @brief Get an array of the second tangent vector of the surface elements. + * @return aconst view to the array of the second tangent vector of the surface elements + */ + arrayView2d< real64 const > getTangentVector2() const { return m_tangentVector2.toViewConst(); } + + /** + * @brief Get an array of the first tangent vector of the surface elements. + * @return a non const view to the array of the second tangent vector of the surface elements + */ + arrayView2d< real64 > getTangentVector2() { return m_tangentVector2; } + + /** + * @brief Get the second tangent vector of a specific surface element. + * @param k index of the surface element + * @return the second tangent vector of a specific surface element + */ + arraySlice1d< real64 const > getTangentVector2( localIndex const k ) const { return m_tangentVector2[k];} + + ///@} /** - * @brief Struct containing the keys to all embedded surface element views. + * @brief Struct containing the keys to all surface element views. * @struct viewKeyStruct */ struct viewKeyStruct : ElementSubRegionBase::viewKeyStruct @@ -218,17 +276,10 @@ class SurfaceElementSubRegion : public ElementSubRegionBase /// @return Face element to cell indices map string. static constexpr char const * surfaceElementsToCellIndexString() { return "fractureElementsToCellIndices"; } - - /// @return Embedded surface element aperture string - static constexpr char const * elementApertureString() { return "elementAperture"; } - - /// @return Embedded surface element surface are string - static constexpr char const * elementAreaString() { return "elementArea"; } - /// @return Mass creation string. constexpr static char const * creationMassString() { return "creationMass"; } - /// @return embedded surface element to parent plane string. + /// @return surface element to parent plane string. constexpr static char const * surfaceElementToParentPlaneString() { return "surfaceElementToParentPlane"; } }; @@ -252,6 +303,15 @@ class SurfaceElementSubRegion : public ElementSubRegionBase /// Member level field for the element center array1d< real64 > m_elementArea; + /// Normal vector to the surface element + array2d< real64 > m_normalVector; + + /// Unit vector indicating the first tangential direction + array2d< real64 > m_tangentVector1; + + /// Unit vector indicating the second tangential direction + array2d< real64 > m_tangentVector2; + }; } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index 6a71ae08f54..e2d15594a1b 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -1120,7 +1120,7 @@ void debugOutputLAObject( T const & obj, if( toFile ) { string const filename = GEOS_FMT( "{}_{:06}_{:02}.mtx", filePrefix.c_str(), cycleNumber, nonlinearIteration ); - obj.write( filename, LAIOutputFormat::MATRIX_MARKET ); + obj.write( filename, LAIOutputFormat::NATIVE_ASCII ); GEOS_LOG_RANK_0( screenName << " written to " << filename ); } } diff --git a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp index 214ca10513c..32cbfe32d1d 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp @@ -55,7 +55,15 @@ DECLARE_FIELD( dispJump, 0, LEVEL_0, WRITE_AND_READ, - "Displacement jump vector" ); + "Displacement jump vector in the local reference system" ); + +DECLARE_FIELD( slip, + "slip", + array1d< real64 >, + 0, + LEVEL_0, + NO_WRITE, + "Slip." ); DECLARE_FIELD( deltaDispJump, "deltaDisplacementJump", @@ -78,8 +86,8 @@ DECLARE_FIELD( traction, array2d< real64 >, 0, LEVEL_0, - NO_WRITE, - "Fracture traction vector" ); + WRITE_AND_READ, + "Fracture traction vector in the local reference system." ); DECLARE_FIELD( deltaTraction, "deltaTraction", @@ -89,7 +97,6 @@ DECLARE_FIELD( deltaTraction, NO_WRITE, "An array that holds the traction increments on the fracture." ); - DECLARE_FIELD( dTraction_dJump, "dTraction_dJump", array3d< real64 >, diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index b9f0e1d8645..da4433b0989 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -94,6 +94,8 @@ void ContactSolverBase::registerDataOnMesh( dataRepository::Group & meshBodies ) subRegion.registerField< fields::contact::fractureState >( getName() ); subRegion.registerField< fields::contact::oldFractureState >( getName() ); + + subRegion.registerField< fields::contact::slip >( getName() ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp index a1c2b6c5b08..9bb7a3702dd 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp @@ -305,7 +305,8 @@ struct StateUpdateKernel arrayView2d< real64 const > const & jump, arrayView2d< real64 > const & fractureTraction, arrayView3d< real64 > const & dFractureTraction_dJump, - arrayView1d< integer const > const & fractureState ) + arrayView1d< integer const > const & fractureState, + arrayView1d< real64 > const & slip ) { forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) { @@ -313,6 +314,9 @@ struct StateUpdateKernel fractureState[k], fractureTraction[k], dFractureTraction_dJump[k] ); + + slip[ k ] = LvArray::math::sqrt( LvArray::math::square( jump( k, 1 ) ) + + LvArray::math::square( jump( k, 2 ) ) ); } ); } diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index 0a082067cfa..a1b6f02c927 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -723,6 +723,8 @@ void SolidMechanicsEmbeddedFractures::updateState( DomainPartition & domain ) arrayView1d< integer const > const & fractureState = subRegion.getField< contact::fractureState >(); + arrayView1d< real64 > const & slip = subRegion.getField< fields::contact::slip >(); + constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) { using ContactType = TYPEOFREF( castedContact ); @@ -735,7 +737,8 @@ void SolidMechanicsEmbeddedFractures::updateState( DomainPartition & domain ) jump, fractureTraction, dFractureTraction_dJump, - fractureState ); + fractureState, + slip ); } ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index f0993972ccb..f9d018d9803 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -64,6 +64,11 @@ SolidMechanicsLagrangeContact::SolidMechanicsLagrangeContact( const string & nam setInputFlag( InputFlags::REQUIRED ). setDescription( "Name of the stabilization to use in the lagrangian contact solver" ); + registerWrapper( viewKeyStruct::stabilizationScalingCoefficientString(), &m_stabilitzationScalingCoefficient ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 1.0 ). + setDescription( "It be used to increase the scale of the stabilization entries. A value < 1.0 results in larger entries in the stabilization matrix." ); + LinearSolverParameters & linSolParams = m_linearSolverParameters.get(); linSolParams.mgr.strategy = LinearSolverParameters::MGR::StrategyType::lagrangianContactMechanics; linSolParams.mgr.separateComponents = true; @@ -147,18 +152,18 @@ void SolidMechanicsLagrangeContact::initializePreSubGroups() fluxApprox.addFieldName( contact::traction::key() ); fluxApprox.setCoeffName( "penaltyStiffness" ); + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshBodyName, - MeshLevel &, + MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - array1d< string > & stencilTargetRegions = fluxApprox.targetRegions( meshBodyName ); - std::set< string > stencilTargetRegionsSet( stencilTargetRegions.begin(), stencilTargetRegions.end() ); - stencilTargetRegionsSet.insert( regionNames.begin(), regionNames.end() ); - stencilTargetRegions.clear(); - for( auto const & targetRegion: stencilTargetRegionsSet ) + mesh.getElemManager().forElementRegions< SurfaceElementRegion >( regionNames, + [&]( localIndex const, + SurfaceElementRegion const & region ) { - stencilTargetRegions.emplace_back( targetRegion ); - } + array1d< string > & stencilTargetRegions = fluxApprox.targetRegions( meshBodyName ); + stencilTargetRegions.emplace_back( region.getName() ); + } ); } ); } @@ -452,9 +457,12 @@ void SolidMechanicsLagrangeContact::computeFaceDisplacementJump( DomainPartition arrayView3d< real64 > const & rotationMatrix = subRegion.getReference< array3d< real64 > >( viewKeyStruct::rotationMatrixString() ); ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); - arrayView2d< real64 > const & dispJump = subRegion.getField< contact::dispJump >(); arrayView1d< real64 const > const & area = subRegion.getElementArea().toViewConst(); + arrayView2d< real64 > const & dispJump = subRegion.getField< contact::dispJump >(); + arrayView1d< real64 > const & slip = subRegion.getField< fields::contact::slip >(); + arrayView1d< real64 > const & aperture = subRegion.getField< fields::elementAperture >(); + forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { if( elemsToFaces.sizeOfArray( kfe ) != 2 ) @@ -483,6 +491,10 @@ void SolidMechanicsLagrangeContact::computeFaceDisplacementJump( DomainPartition real64 dispJumpTemp[ 3 ]; LvArray::tensorOps::Ri_eq_AjiBj< 3, 3 >( dispJumpTemp, rotationMatrix[ kfe ], globalJumpTemp ); LvArray::tensorOps::copy< 3 >( dispJump[ kfe ], dispJumpTemp ); + + slip[ kfe ] = LvArray::math::sqrt( LvArray::math::square( dispJump( kfe, 1 ) ) + + LvArray::math::square( dispJump( kfe, 2 ) ) ); + aperture[ kfe ] = dispJump[ kfe ][ 0 ]; } ); } } ); @@ -518,15 +530,16 @@ void SolidMechanicsLagrangeContact::setupDofs( DomainPartition const & domain, 3, meshTargets ); - dofManager.addCoupling( contact::traction::key(), - contact::traction::key(), - DofManager::Connector::Face, - meshTargets ); - dofManager.addCoupling( solidMechanics::totalDisplacement::key(), contact::traction::key(), DofManager::Connector::Elem, meshTargets ); + + NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); + FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); + FluxApproximationBase const & stabilizationMethod = fvManager.getFluxApproximation( m_stabilizationName ); + + dofManager.addCoupling( contact::traction::key(), stabilizationMethod ); } void SolidMechanicsLagrangeContact::assembleSystem( real64 const time, @@ -812,18 +825,20 @@ void SolidMechanicsLagrangeContact::computeRotationMatrices( DomainPartition & d arrayView1d< string const > const & regionNames ) { FaceManager const & faceManager = mesh.getFaceManager(); - ElementRegionManager & elemManager = mesh.getElemManager(); - arrayView2d< real64 const > const & faceNormal = faceManager.faceNormal(); + arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); - elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, - [&]( localIndex const, - FaceElementSubRegion & subRegion ) + mesh.getElemManager().forElementSubRegions< FaceElementSubRegion >( regionNames, + [&]( localIndex const, + FaceElementSubRegion & subRegion ) { ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); arrayView3d< real64 > const & rotationMatrix = subRegion.getReference< array3d< real64 > >( viewKeyStruct::rotationMatrixString() ); + arrayView2d< real64 > const unitNormal = subRegion.getNormalVector(); + arrayView2d< real64 > const unitTangent1 = subRegion.getTangentVector1(); + arrayView2d< real64 > const unitTangent2 = subRegion.getTangentVector2(); forAll< parallelHostPolicy >( subRegion.size(), [=]( localIndex const kfe ) { @@ -832,14 +847,27 @@ void SolidMechanicsLagrangeContact::computeRotationMatrices( DomainPartition & d return; } + localIndex const f0 = elemsToFaces[kfe][0]; + localIndex const f1 = elemsToFaces[kfe][1]; + stackArray1d< real64, 3 > Nbar( 3 ); - localIndex const & f0 = elemsToFaces[kfe][0], f1 = elemsToFaces[kfe][1]; Nbar[ 0 ] = faceNormal[f0][0] - faceNormal[f1][0]; Nbar[ 1 ] = faceNormal[f0][1] - faceNormal[f1][1]; Nbar[ 2 ] = faceNormal[f0][2] - faceNormal[f1][2]; LvArray::tensorOps::normalize< 3 >( Nbar ); computationalGeometry::RotationMatrix_3D( Nbar.toSliceConst(), rotationMatrix[kfe] ); + real64 const columnVector1[3] = { rotationMatrix[kfe][ 0 ][ 1 ], + rotationMatrix[kfe][ 1 ][ 1 ], + rotationMatrix[kfe][ 2 ][ 1 ] }; + + real64 const columnVector2[3] = { rotationMatrix[kfe][ 0 ][ 2 ], + rotationMatrix[kfe][ 1 ][ 2 ], + rotationMatrix[kfe][ 2 ][ 2 ] }; + + LvArray::tensorOps::copy< 3 >( unitNormal[kfe], Nbar ); + LvArray::tensorOps::copy< 3 >( unitTangent1[kfe], columnVector1 ); + LvArray::tensorOps::copy< 3 >( unitTangent2[kfe], columnVector2 ); } ); } ); } ); @@ -1267,13 +1295,13 @@ void SolidMechanicsLagrangeContact:: localIndex const localRow = LvArray::integerConversion< localIndex >( elemDOF[0] - rankOffset ); - for( localIndex idof = 0; idof < 3; ++idof ) { localRhs[localRow + idof] += elemRHS[idof]; if( fractureState[kfe] != contact::FractureState::Open ) { + localMatrix.addToRowBinarySearchUnsorted< serialAtomic >( localRow + idof, nodeDOF, dRdU[idof].dataIfContiguous(), @@ -1499,7 +1527,7 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes // Combine E and nu to obtain a stiffness approximation (like it was an hexahedron) for( localIndex j = 0; j < 3; ++j ) { - stiffDiagApprox[ kf ][ i ][ j ] = E / ( ( 1.0 + nu )*( 1.0 - 2.0*nu ) ) * 2.0 / 9.0 * ( 2.0 - 3.0 * nu ) * volume / ( boxSize[j]*boxSize[j] ); + stiffDiagApprox[ kf ][ i ][ j ] = m_stabilitzationScalingCoefficient * E / ( ( 1.0 + nu )*( 1.0 - 2.0*nu ) ) * 2.0 / 9.0 * ( 2.0 - 3.0 * nu ) * volume / ( boxSize[j]*boxSize[j] ); } } } @@ -1749,7 +1777,6 @@ void SolidMechanicsLagrangeContact::applySystemSolution( DofManager const & dofM void SolidMechanicsLagrangeContact::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; - computeFaceDisplacementJump( domain ); } diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index 4f430fa486d..28485284008 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -167,6 +167,8 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase real64 m_initialContactResidual = 0.0; + real64 m_stabilitzationScalingCoefficient = 1.0; + void createPreconditioner( DomainPartition const & domain ); void computeFaceDisplacementJump( DomainPartition & domain ); @@ -178,10 +180,14 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase constexpr static char const * rotationMatrixString() { return "rotationMatrix"; } constexpr static char const * normalDisplacementToleranceString() { return "normalDisplacementTolerance"; } + constexpr static char const * normalTractionToleranceString() { return "normalTractionTolerance"; } + constexpr static char const * slidingToleranceString() { return "slidingTolerance"; } constexpr static char const * transMultiplierString() { return "penaltyStiffnessTransMultiplier"; } + + constexpr static char const * stabilizationScalingCoefficientString() { return "stabilizationScalingCoefficient"; } }; }; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp index be24ccd834d..365c38eda92 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp @@ -35,6 +35,8 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp" #include "physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp" +#include "mesh/MeshFields.hpp" + /** * @namespace the geosx namespace that encapsulates the majority of the code @@ -286,7 +288,7 @@ void ProppantTransport::updateProppantMobility( ObjectManagerBase & dataGroup ) GEOS_MARK_FUNCTION; arrayView1d< real64 const > const conc = dataGroup.getField< fields::proppant::proppantConcentration >(); - arrayView1d< real64 const > const aperture = dataGroup.getReference< array1d< real64 > >( FaceElementSubRegion::viewKeyStruct::elementApertureString() ); + arrayView1d< real64 const > const aperture = dataGroup.getReference< array1d< real64 > >( fields::elementAperture::key() ); arrayView1d< integer > const isProppantMobile = dataGroup.getField< fields::proppant::isProppantMobile >(); real64 const minAperture = m_minAperture; @@ -1054,7 +1056,7 @@ void ProppantTransport::updateProppantPackVolume( real64 const GEOS_UNUSED_PARAM elemManager.constructViewAccessor< array1d< real64 >, arrayView1d< real64 > >( fields::proppant::proppantLiftFlux::key() ); ElementRegionManager::ElementViewAccessor< arrayView1d< real64 const > > const - aperture = elemManager.constructArrayViewAccessor< real64, 1 >( FaceElementSubRegion::viewKeyStruct::elementApertureString() ); + aperture = elemManager.constructArrayViewAccessor< real64, 1 >( fields::elementAperture::key() ); typename ProppantPackVolumeKernel::FlowAccessors flowAccessors( elemManager, getName() ); typename ProppantPackVolumeKernel::SlurryFluidAccessors slurryFluidAccessors( elemManager, getName() ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 858d9c55585..dfa208b5794 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -26,6 +26,7 @@ #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/MultiphasePoromechanics.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" +#include "mesh/MeshFields.hpp" namespace geos { @@ -258,7 +259,7 @@ real64 HydrofractureSolver< POROMECHANICS_SOLVER >::fullyCoupledSolverStep( real fieldsToBeSync.addElementFields( { flow::pressure::key(), flow::pressure_n::key(), - SurfaceElementSubRegion::viewKeyStruct::elementApertureString() }, + fields::elementAperture::key() }, { m_surfaceGenerator->getFractureRegionName() } ); fieldsToBeSync.addFields( FieldLocation::Node, @@ -1020,7 +1021,7 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( D arrayView1d< real64 > const fluidPressure_n = subRegion.getField< fields::flow::pressure_n >(); arrayView1d< real64 > const fluidPressure = subRegion.getField< fields::flow::pressure >(); - arrayView1d< real64 > const aperture = subRegion.getReference< array1d< real64 > >( "elementAperture" ); + arrayView1d< real64 > const aperture = subRegion.getField< fields::elementAperture >(); // Get the list of newFractureElements SortedArrayView< localIndex const > const newFractureElements = subRegion.m_newFaceElements.toViewConst(); From 56fb6fd24b4422fb4d9780c98bcc8db9f87450ae Mon Sep 17 00:00:00 2001 From: Ryan Aronson Date: Mon, 29 Apr 2024 13:21:48 -0700 Subject: [PATCH 042/286] Stabilized Fixed-Stress (#3092) --- .../fluidFlow/CompositionalMultiphaseBase.cpp | 21 ++++++++++++++----- .../fluidFlow/FlowSolverBase.cpp | 8 ++++++- .../fluidFlow/FlowSolverBase.hpp | 5 +++++ ...mpositionalMultiphaseReservoirAndWells.hpp | 3 +++ .../multiphysics/MultiphasePoromechanics.cpp | 20 ++++++++++++++++++ .../multiphysics/MultiphasePoromechanics.hpp | 4 ++++ 6 files changed, 55 insertions(+), 6 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index f023c1a9ec3..1a322d78e90 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -1335,11 +1335,22 @@ void CompositionalMultiphaseBase::assembleSystem( real64 const GEOS_UNUSED_PARAM localMatrix, localRhs ); - assembleFluxTerms( dt, - domain, - dofManager, - localMatrix, - localRhs ); + if( m_isJumpStabilized ) + { + assembleStabilizedFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } + else + { + assembleFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } } void CompositionalMultiphaseBase::assembleAccumulationAndVolumeBalanceTerms( DomainPartition & domain, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index a116226a893..65e4508e4c7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -89,7 +89,8 @@ FlowSolverBase::FlowSolverBase( string const & name, SolverBase( name, parent ), m_numDofPerCell( 0 ), m_isThermal( 0 ), - m_isFixedStressPoromechanicsUpdate( false ) + m_isFixedStressPoromechanicsUpdate( false ), + m_isJumpStabilized( false ) { this->registerWrapper( viewKeyStruct::isThermalString(), &m_isThermal ). setApplyDefaultValue( 0 ). @@ -289,6 +290,11 @@ void FlowSolverBase::enableFixedStressPoromechanicsUpdate() m_isFixedStressPoromechanicsUpdate = true; } +void FlowSolverBase::enableJumpStabilization() +{ + m_isJumpStabilized = true; +} + void FlowSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const { SolverBase::setConstitutiveNamesCallSuper( subRegion ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index 5aa98bf3772..f917c1673e8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -93,6 +93,8 @@ class FlowSolverBase : public SolverBase void enableFixedStressPoromechanicsUpdate(); + void enableJumpStabilization(); + void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const; virtual void updatePorosityAndPermeability( SurfaceElementSubRegion & subRegion ) const; @@ -183,6 +185,9 @@ class FlowSolverBase : public SolverBase /// enable the fixed stress poromechanics update of porosity bool m_isFixedStressPoromechanicsUpdate; + /// enable pressure jump stabilzation for fixed-stress poromechanics + bool m_isJumpStabilized; + /// flag if negative pressure is allowed integer m_allowNegativePressure; diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index e884fb94cfd..3d0ab667ee4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -106,6 +106,9 @@ class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWells void enableFixedStressPoromechanicsUpdate() { flowSolver()->enableFixedStressPoromechanicsUpdate(); } + void enableJumpStabilization() + {flowSolver()->enableJumpStabilization(); } + virtual void saveSequentialIterationState( DomainPartition & domain ) override final { flowSolver()->saveSequentialIterationState( domain ); } protected: diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 4874ee13e30..9367234c0ce 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -118,6 +118,12 @@ void MultiphasePoromechanics< FLOW_SOLVER >::registerDataOnMesh( Group & meshBod if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) { + + if( this->getNonlinearSolverParameters().m_couplingType == NonlinearSolverParameters::CouplingType::Sequential ) + { + this->flowSolver()->enableJumpStabilization(); + } + this->template forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) @@ -363,6 +369,20 @@ void MultiphasePoromechanics< FLOW_SOLVER >::initializePreSubGroups() InputError ); } +template< typename FLOW_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER >::implicitStepSetup( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) +{ + Base::implicitStepSetup( time_n, dt, domain ); + if( this->getNonlinearSolverParameters().m_couplingType == NonlinearSolverParameters::CouplingType::Sequential && + (this->m_stabilizationType == StabilizationType::Global || this->m_stabilizationType == StabilizationType::Local)) + { + this->updateStabilizationParameters( domain ); + } + +} + template< typename FLOW_SOLVER > void MultiphasePoromechanics< FLOW_SOLVER >::updateStabilizationParameters( DomainPartition & domain ) const { diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index 0d0835869cb..2ba88eba253 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -104,6 +104,10 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER > virtual void updateState( DomainPartition & domain ) override; + virtual void implicitStepSetup( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) override; + /**@}*/ /* From 892691128046cd390a7eaf8c20528cac29f8ab25 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Mon, 29 Apr 2024 13:27:19 -0700 Subject: [PATCH 043/286] Enable CI testing on streak2 (#3090) Run integrated tests on streak 2 --- .github/workflows/build_and_test.yml | 6 +++--- .github/workflows/ci_tests.yml | 4 ++-- scripts/ci_build_and_test_in_container.sh | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index b34d56c8e70..b0fb147a734 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -112,9 +112,9 @@ jobs: script_args+=(--data-basename ${DATA_BASENAME}) - DATA_EXCHANGE_DIR=/mnt/geos-exchange # Exchange folder outside of the container + DATA_EXCHANGE_DIR=${GITHUB_WORKSPACE}/geos-exchange # Exchange folder outside of the container if [ ! -d "${DATA_EXCHANGE_DIR}" ]; then - sudo mkdir -p ${DATA_EXCHANGE_DIR} + mkdir -p ${DATA_EXCHANGE_DIR} fi DATA_EXCHANGE_MOUNT_POINT=/tmp/exchange # Exchange folder inside of the container docker_args+=(--volume=${DATA_EXCHANGE_DIR}:${DATA_EXCHANGE_MOUNT_POINT}) @@ -128,7 +128,7 @@ jobs: script_args+=(--sccache-credentials $(basename ${GOOGLE_GHA_CREDS_PATH})) fi - if [ ${{ inputs.RUNS_ON }} == 'self-hosted' ]; then + if [ ${{ inputs.RUNS_ON }} == 'streak' ] || [ ${{ inputs.RUNS_ON }} == 'streak2' ]; then RUNNER_CERTIFICATES_DIR=/etc/pki/ca-trust/source/anchors/ mkdir -p ${GITHUB_WORKSPACE}/certificates cp ${RUNNER_CERTIFICATES_DIR}/*.crt* ${GITHUB_WORKSPACE}/certificates diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 8e41dffcd88..7bd8128679c 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -206,8 +206,8 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF GCP_BUCKET: geosx/integratedTests - RUNS_ON: streak - DOCKER_RUN_ARGS: "--cpus=8 --memory=128g" + RUNS_ON: streak2 + DOCKER_RUN_ARGS: "--cpus=32 --memory=384g" code_coverage: needs: diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index 84e5966968a..405cb7a46c3 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -145,7 +145,7 @@ EOT # The path to the `sccache` executable is available through the SCCACHE environment variable. SCCACHE_CMAKE_ARGS="-DCMAKE_CXX_COMPILER_LAUNCHER=${SCCACHE} -DCMAKE_CUDA_COMPILER_LAUNCHER=${SCCACHE}" - if [[ ${HOSTNAME} == 'streak.llnl.gov' ]]; then + if [ ${HOSTNAME} == 'streak.llnl.gov' ] || [ ${HOSTNAME} == 'streak2.llnl.gov' ]; then DOCKER_CERTS_DIR=/usr/local/share/ca-certificates for file in "${GEOS_SRC_DIR}"/certificates/*.crt.pem; do if [ -f "$file" ]; then @@ -176,8 +176,8 @@ if [[ "${RUN_INTEGRATED_TESTS}" = true ]]; then or_die apt-get install -y virtualenv python3-dev python-is-python3 ATS_PYTHON_HOME=/tmp/run_integrated_tests_virtualenv or_die virtualenv ${ATS_PYTHON_HOME} - export ATS_FILTER="np<=2" - ATS_CMAKE_ARGS="-DATS_ARGUMENTS=\"--machine openmpi --ats openmpi_mpirun=/usr/bin/mpirun --ats openmpi_args=--allow-run-as-root --ats openmpi_procspernode=4 --ats openmpi_maxprocs=4\" -DPython3_ROOT_DIR=${ATS_PYTHON_HOME}" + export ATS_FILTER="np<=32" + ATS_CMAKE_ARGS="-DATS_ARGUMENTS=\"--machine openmpi --ats openmpi_mpirun=/usr/bin/mpirun --ats openmpi_args=--allow-run-as-root --ats openmpi_procspernode=32 --ats openmpi_maxprocs=32\" -DPython3_ROOT_DIR=${ATS_PYTHON_HOME}" fi @@ -255,7 +255,7 @@ fi # Run the unit tests (excluding previously ran checks). if [[ "${RUN_UNIT_TESTS}" = true ]]; then - if [[ ${HOSTNAME} == 'streak.llnl.gov' ]]; then + if [ ${HOSTNAME} == 'streak.llnl.gov' ] || [ ${HOSTNAME} == 'streak2.llnl.gov' ]; then or_die ctest --output-on-failure -E "testUncrustifyCheck|testDoxygenCheck|testLifoStorage|testExternalSolvers" else or_die ctest --output-on-failure -E "testUncrustifyCheck|testDoxygenCheck" From b92d789b030baedf1b82a24379509ac07495e3ab Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Mon, 29 Apr 2024 17:31:30 -0500 Subject: [PATCH 044/286] Check that useStaticCondensation is not enabled when running SinglePhasePoromechanicsEmbeddedFractures (#3099) --- .../contact/SolidMechanicsEmbeddedFractures.hpp | 12 +++++++----- .../SinglePhasePoromechanicsEmbeddedFractures.cpp | 10 ++++++++++ .../SinglePhasePoromechanicsEmbeddedFractures.hpp | 2 ++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index 3069cfd28e6..23153c33df6 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -106,9 +106,15 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase real64 const dt, DomainPartition & domain ); - virtual bool updateConfiguration( DomainPartition & domain ) override final; + bool useStaticCondensation() const { return m_useStaticCondensation; } + + struct viewKeyStruct : ContactSolverBase::viewKeyStruct + { + constexpr static char const * useStaticCondensationString() { return "useStaticCondensation"; } + }; + protected: virtual void initializePostInitialConditionsPreSubGroups() override final; @@ -124,10 +130,6 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase /// decide whether to use static condensation or not integer m_useStaticCondensation; - struct viewKeyStruct : ContactSolverBase::viewKeyStruct - { - constexpr static char const * useStaticCondensationString() { return "useStaticCondensation"; } - }; }; diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 20308bf7eaa..74413953f66 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -50,6 +50,16 @@ SinglePhasePoromechanicsEmbeddedFractures::SinglePhasePoromechanicsEmbeddedFract SinglePhasePoromechanicsEmbeddedFractures::~SinglePhasePoromechanicsEmbeddedFractures() {} +void SinglePhasePoromechanicsEmbeddedFractures::postProcessInput() +{ + Base::postProcessInput(); + + GEOS_ERROR_IF( solidMechanicsSolver()->useStaticCondensation(), + GEOS_FMT( "{}: {} = 1 in {} solver named {} is not supported for {}", + this->getName(), SolidMechanicsEmbeddedFractures::viewKeyStruct::useStaticCondensationString(), + solidMechanicsSolver()->getCatalogName(), solidMechanicsSolver()->getName(), getCatalogName() )); +} + void SinglePhasePoromechanicsEmbeddedFractures::registerDataOnMesh( dataRepository::Group & meshBodies ) { Base::registerDataOnMesh( meshBodies ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp index efa598b9de7..f33efce4a10 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -100,6 +100,8 @@ class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanic protected: + virtual void postProcessInput() override final; + virtual void initializePostInitialConditionsPreSubGroups() override final; private: From d85399d0ef13489f527491f26da5f4af6ecee733 Mon Sep 17 00:00:00 2001 From: Stefano Frambati Date: Tue, 30 Apr 2024 05:42:51 +0200 Subject: [PATCH 045/286] removed zeroing of free-boundary nodes to implement Neumann boudnary conditions (free-surface conditions in the elastic case (#3072) --- .../ElasticTimeSchemeSEMKernel.hpp | 35 ++++++++----------- .../ElasticWaveEquationSEM.cpp | 6 +--- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticTimeSchemeSEMKernel.hpp index 3e9aefbbd82..b2df78e5c2d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticTimeSchemeSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticTimeSchemeSEMKernel.hpp @@ -48,7 +48,6 @@ struct ElasticTimeSchemeSEM * @param[in] rhsx the right-hand-side for displacement in x-direction * @param[in] rhsy the right-hand-side for displacement in y-direction * @param[in] rhsz the right-hand-side for displacement in z-direction - * @param[in] freeSurfaceNodeIndicator array which contains indicators to tell if we are on a free-surface boundary or not * @param[in] solverTargetNodesSet the targetted nodeset (useful in particular when we do elasto-acoustic simulation ) */ static void LeapFrog( real64 const dt, @@ -71,31 +70,27 @@ struct ElasticTimeSchemeSEM arrayView1d< real32 > const rhsx, arrayView1d< real32 > const rhsy, arrayView1d< real32 > const rhsz, - arrayView1d< localIndex const > const freeSurfaceNodeIndicator, SortedArrayView< localIndex const > const solverTargetNodesSet ) { real64 const dt2 = pow( dt, 2 ); forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) { localIndex const a = solverTargetNodesSet[n]; - if( freeSurfaceNodeIndicator[a] != 1 ) - { - ux_np1[a] = ux_n[a]; - ux_np1[a] *= 2.0*mass[a]; - ux_np1[a] -= (mass[a]-0.5*dt*dampingx[a])*ux_nm1[a]; - ux_np1[a] += dt2*(rhsx[a]-stiffnessVectorx[a]); - ux_np1[a] /= mass[a]+0.5*dt*dampingx[a]; - uy_np1[a] = uy_n[a]; - uy_np1[a] *= 2.0*mass[a]; - uy_np1[a] -= (mass[a]-0.5*dt*dampingy[a])*uy_nm1[a]; - uy_np1[a] += dt2*(rhsy[a]-stiffnessVectory[a]); - uy_np1[a] /= mass[a]+0.5*dt*dampingy[a]; - uz_np1[a] = uz_n[a]; - uz_np1[a] *= 2.0*mass[a]; - uz_np1[a] -= (mass[a]-0.5*dt*dampingz[a])*uz_nm1[a]; - uz_np1[a] += dt2*(rhsz[a]-stiffnessVectorz[a]); - uz_np1[a] /= mass[a]+0.5*dt*dampingz[a]; - } + ux_np1[a] = ux_n[a]; + ux_np1[a] *= 2.0*mass[a]; + ux_np1[a] -= (mass[a]-0.5*dt*dampingx[a])*ux_nm1[a]; + ux_np1[a] += dt2*(rhsx[a]-stiffnessVectorx[a]); + ux_np1[a] /= mass[a]+0.5*dt*dampingx[a]; + uy_np1[a] = uy_n[a]; + uy_np1[a] *= 2.0*mass[a]; + uy_np1[a] -= (mass[a]-0.5*dt*dampingy[a])*uy_nm1[a]; + uy_np1[a] += dt2*(rhsy[a]-stiffnessVectory[a]); + uy_np1[a] /= mass[a]+0.5*dt*dampingy[a]; + uz_np1[a] = uz_n[a]; + uz_np1[a] *= 2.0*mass[a]; + uz_np1[a] -= (mass[a]-0.5*dt*dampingz[a])*uz_nm1[a]; + uz_np1[a] += dt2*(rhsz[a]-stiffnessVectorz[a]); + uz_np1[a] /= mass[a]+0.5*dt*dampingz[a]; } ); }; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp index 27bb85b93be..85b409ccfa1 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp @@ -558,9 +558,6 @@ void ElasticWaveEquationSEM::computeUnknowns( real64 const &, arrayView1d< real32 > const uy_np1 = nodeManager.getField< elasticfields::Displacementy_np1 >(); arrayView1d< real32 > const uz_np1 = nodeManager.getField< elasticfields::Displacementz_np1 >(); - /// get array of indicators: 1 if node on free surface; 0 otherwise - arrayView1d< localIndex const > const freeSurfaceNodeIndicator = nodeManager.getField< elasticfields::ElasticFreeSurfaceNodeIndicator >(); - arrayView1d< real32 > const rhsx = nodeManager.getField< elasticfields::ForcingRHSx >(); arrayView1d< real32 > const rhsy = nodeManager.getField< elasticfields::ForcingRHSy >(); arrayView1d< real32 > const rhsz = nodeManager.getField< elasticfields::ForcingRHSz >(); @@ -582,8 +579,7 @@ void ElasticWaveEquationSEM::computeUnknowns( real64 const &, SortedArrayView< localIndex const > const solverTargetNodesSet = m_solverTargetNodesSet.toViewConst(); ElasticTimeSchemeSEM::LeapFrog( dt, ux_np1, ux_n, ux_nm1, uy_np1, uy_n, uy_nm1, uz_np1, uz_n, uz_nm1, mass, dampingx, dampingy, dampingz, stiffnessVectorx, stiffnessVectory, - stiffnessVectorz, rhsx, rhsy, rhsz, freeSurfaceNodeIndicator, - solverTargetNodesSet ); + stiffnessVectorz, rhsx, rhsy, rhsz, solverTargetNodesSet ); } void ElasticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, From d84a7e19607988cb090f9c52f415a4b18f112510 Mon Sep 17 00:00:00 2001 From: TotoGaz <49004943+TotoGaz@users.noreply.github.com> Date: Tue, 30 Apr 2024 10:21:49 -0700 Subject: [PATCH 046/286] Change Unsupported tag to best effort (#3102) Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .../Contributing/Dockerfile-remote-dev.example | 8 ++++++++ .../sphinx/developerGuide/Contributing/InstallWin.rst | 2 +- .../sphinx/developerGuide/Contributing/UsingDocker.rst | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example b/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example index 15e46a7cf90..edf71ed717f 100644 --- a/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example +++ b/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example @@ -53,6 +53,14 @@ RUN touch /root/.ssh/environment &&\ # to your environment. This will prevent you from adding the `--allow-run-as-root` option # when you run mpi. Of course, weigh the benefits and risks and make your own decision. +# In case you want to use `sccache` (https://github.com/mozilla/sccache) to make your builds faster, +# you may configure the `sccache` config file at your convenience. +# Meanwhile, we provide here a simple local configuration. +RUN mkdir -p ${HOME}/.config/sccache +RUN printf '[cache.disk]\n\ +dir = "/tmp/.cache/sccache"\n\ +size = 3221225472 # 3GB\n' > ${HOME}/.config/sccache/config + # Default ssh port 22 is exposed. For _development_ purposes, # it can be useful to expose other ports for remote tools. EXPOSE 22 11111 64010-64020 diff --git a/src/docs/sphinx/developerGuide/Contributing/InstallWin.rst b/src/docs/sphinx/developerGuide/Contributing/InstallWin.rst index 6fa4b1d6d55..0b9275a9584 100644 --- a/src/docs/sphinx/developerGuide/Contributing/InstallWin.rst +++ b/src/docs/sphinx/developerGuide/Contributing/InstallWin.rst @@ -1,6 +1,6 @@ .. _InstallWin: -[Unsupported] Installing GEOS on Windows machines using Docker +[Best effort] Installing GEOS on Windows machines using Docker ================================================================= In this section, we will install GEOS on a Windows machine using a ``Docker`` container with a precompiled version of diff --git a/src/docs/sphinx/developerGuide/Contributing/UsingDocker.rst b/src/docs/sphinx/developerGuide/Contributing/UsingDocker.rst index 46bbf885b50..5600e7fef3f 100644 --- a/src/docs/sphinx/developerGuide/Contributing/UsingDocker.rst +++ b/src/docs/sphinx/developerGuide/Contributing/UsingDocker.rst @@ -1,6 +1,6 @@ .. _UsingDocker: -[Unsupported] Developing inside Docker with precompiled TPL binaries +[Best effort] Developing inside Docker with precompiled TPL binaries ==================================================================== For development purposes, you may want to use the publicly available docker images instead of compiling them yourself. From 9289b769d5f27bf17c31cdffe72f02e42e947c5f Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 2 May 2024 16:48:34 -0500 Subject: [PATCH 047/286] Separate stick, slip, open parts of contact residual and try to normalize them properly (#3059) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * small fix * do not set to 0 * Update SinglePhasePoromechanicsConformingFractures.cpp * separate and try to normalize * Update src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp * Update src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp * Update NonlinearSolverParameters.cpp * cuda build * Update src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp * Update src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp * bug fix * new baselines * fix the case * Checking integrated tests on CI * Updating the integratedTests hash --------- Co-authored-by: Pavel Tomin <“paveltomin@users.noreply.github.com”> Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Co-authored-by: Nicola Castelletto --- .../ContactMechanics_SimpleCubes_base.xml | 3 +- integratedTests | 2 +- .../NonlinearSolverParameters.cpp | 12 +- .../NonlinearSolverParameters.hpp | 5 + .../physicsSolvers/SolverBase.cpp | 3 +- .../SolidMechanicsEmbeddedFractures.cpp | 115 ++++++++++-------- .../SolidMechanicsEmbeddedFractures.hpp | 4 + .../contact/SolidMechanicsLagrangeContact.cpp | 76 +++++++++--- .../contact/SolidMechanicsLagrangeContact.hpp | 2 - .../SolidMechanicsLagrangianFEM.cpp | 4 +- .../SolidMechanicsLagrangianFEM.hpp | 1 + .../schema/docs/NonlinearSolverParameters.rst | 1 + src/coreComponents/schema/schema.xsd | 2 + 13 files changed, 150 insertions(+), 80 deletions(-) diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml index a36624ce39c..0c293f01565 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml @@ -13,8 +13,9 @@ registerWrapper( viewKeysStruct::nonlinearAccelerationTypeString(), &m_nonlinearAccelerationType ). + registerWrapper( viewKeysStruct::nonlinearAccelerationTypeString(), &m_nonlinearAccelerationType ). setApplyDefaultValue( NonlinearAccelerationType::None ). setInputFlag( dataRepository::InputFlags::OPTIONAL ). setDescription( "Nonlinear acceleration type for sequential solver." ); @@ -173,6 +178,9 @@ void NonlinearSolverParameters::postProcessInput() getWrapperDataContext( viewKeysStruct::timeStepIncreaseIterLimString() ) << ": should be smaller than " << viewKeysStruct::timeStepDecreaseIterLimString() ); + GEOS_ERROR_IF_LE_MSG( m_lineSearchResidualFactor, 0.0, + getWrapperDataContext( viewKeysStruct::lineSearchResidualFactorString() ) << ": should be positive" ); + if( getLogLevel() > 0 ) { GEOS_LOG_RANK_0( "Nonlinear solver parameters:" ); @@ -182,6 +190,8 @@ void NonlinearSolverParameters::postProcessInput() GEOS_LOG_RANK_0( GEOS_FMT( " Line search interpolation type = {}", EnumStrings< LineSearchInterpolationType >::toString( m_lineSearchInterpType ) ) ); GEOS_LOG_RANK_0( GEOS_FMT( " Line search maximum number of cuts = {}", m_lineSearchMaxCuts ) ); GEOS_LOG_RANK_0( GEOS_FMT( " Line search cut factor = {}", m_lineSearchCutFactor ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Line search starting iteration = {}", m_lineSearchStartingIteration ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Line search residual increase factor = {}", m_lineSearchResidualFactor ) ); } GEOS_LOG_RANK_0( GEOS_FMT( " Norm type (flow solver) = {}", EnumStrings< solverBaseKernels::NormType >::toString( m_normType ) ) ); GEOS_LOG_RANK_0( GEOS_FMT( " Minimum residual normalizer = {}", m_minNormalizer ) ); diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp index 9f9f93da0fc..e5e7a1d1120 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp @@ -64,6 +64,7 @@ class NonlinearSolverParameters : public dataRepository::Group m_lineSearchMaxCuts = params.m_lineSearchMaxCuts; m_lineSearchCutFactor = params.m_lineSearchCutFactor; m_lineSearchStartingIteration = params.m_lineSearchStartingIteration; + m_lineSearchResidualFactor = params.m_lineSearchResidualFactor; m_newtonTol = params.m_newtonTol; m_maxIterNewton = params.m_maxIterNewton; @@ -103,6 +104,7 @@ class NonlinearSolverParameters : public dataRepository::Group static constexpr char const * lineSearchCutFactorString() { return "lineSearchCutFactor"; } static constexpr char const * lineSearchInterpolationTypeString() { return "lineSearchInterpolationType"; } static constexpr char const * lineSearchStartingIterationString() { return "lineSearchStartingIteration"; } + static constexpr char const * lineSearchResidualFactorString() { return "lineSearchResidualFactor"; } static constexpr char const * normTypeString() { return "normType"; } static constexpr char const * minNormalizerString() { return "minNormalizer"; } @@ -261,6 +263,9 @@ class NonlinearSolverParameters : public dataRepository::Group /// Iteration when line search starts integer m_lineSearchStartingIteration; + /// Factor to determine residual increase + real64 m_lineSearchResidualFactor; + /// Norm used to check the nonlinear loop convergence solverBaseKernels::NormType m_normType; diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index e2d15594a1b..b612e2ed3f9 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -896,7 +896,8 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, // do line search in case residual has increased if( m_nonlinearSolverParameters.m_lineSearchAction != NonlinearSolverParameters::LineSearchAction::None - && residualNorm > lastResidual && newtonIter >= m_nonlinearSolverParameters.m_lineSearchStartingIteration ) + && residualNorm > lastResidual * m_nonlinearSolverParameters.m_lineSearchResidualFactor + && newtonIter >= m_nonlinearSolverParameters.m_lineSearchStartingIteration ) { bool lineSearchSuccess = false; if( m_nonlinearSolverParameters.m_lineSearchInterpType == NonlinearSolverParameters::LineSearchInterpolationType::Linear ) diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index a1b6f02c927..563a07119ed 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -537,83 +537,90 @@ real64 SolidMechanicsEmbeddedFractures::calculateResidualNorm( real64 const & ti if( !m_useStaticCondensation ) { + real64 const fractureResidualNorm = calculateFractureResidualNorm( domain, dofManager, localRhs ); - string const jumpDofKey = dofManager.getKey( contact::dispJump::key() ); + return sqrt( solidResidualNorm * solidResidualNorm + fractureResidualNorm * fractureResidualNorm ); + } + else + { + return solidResidualNorm; + } +} - globalIndex const rankOffset = dofManager.rankOffset(); +real64 SolidMechanicsEmbeddedFractures::calculateFractureResidualNorm( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ) const +{ + string const jumpDofKey = dofManager.getKey( contact::dispJump::key() ); + + globalIndex const rankOffset = dofManager.rankOffset(); - RAJA::ReduceSum< parallelDeviceReduce, real64 > localSum( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real64 > localSum( 0.0 ); - // globalResidualNorm[0]: the sum of all the local sum(rhs^2). - // globalResidualNorm[1]: max of max force of each rank. Basically max force globally - real64 globalResidualNorm[2] = {0, 0}; + // globalResidualNorm[0]: the sum of all the local sum(rhs^2). + // globalResidualNorm[1]: max of max force of each rank. Basically max force globally + real64 globalResidualNorm[2] = {0.0, 0.0}; - // Fracture residual - forFractureRegionOnMeshTargets( domain.getMeshBodies(), [&] ( SurfaceElementRegion const & fractureRegion ) + // Fracture residual + forFractureRegionOnMeshTargets( domain.getMeshBodies(), [&] ( SurfaceElementRegion const & fractureRegion ) + { + fractureRegion.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion const & subRegion ) { - fractureRegion.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion const & subRegion ) - { - arrayView1d< globalIndex const > const & - dofNumber = subRegion.getReference< array1d< globalIndex > >( jumpDofKey ); - arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); + arrayView1d< globalIndex const > const & + dofNumber = subRegion.getReference< array1d< globalIndex > >( jumpDofKey ); + arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); - forAll< parallelDevicePolicy<> >( subRegion.size(), - [localRhs, localSum, dofNumber, rankOffset, ghostRank] GEOS_HOST_DEVICE ( localIndex const k ) + forAll< parallelDevicePolicy<> >( subRegion.size(), + [localRhs, localSum, dofNumber, rankOffset, ghostRank] GEOS_HOST_DEVICE ( localIndex const k ) + { + if( ghostRank[k] < 0 ) { - if( ghostRank[k] < 0 ) + localIndex const localRow = LvArray::integerConversion< localIndex >( dofNumber[k] - rankOffset ); + for( int i = 0; i < 3; ++i ) { - localIndex const localRow = LvArray::integerConversion< localIndex >( dofNumber[k] - rankOffset ); - for( localIndex i = 0; i < 3; ++i ) - { - localSum += localRhs[localRow + i] * localRhs[localRow + i]; - } + localSum += localRhs[localRow + i] * localRhs[localRow + i]; } - } ); - + } } ); - real64 const localResidualNorm[2] = { localSum.get(), SolidMechanicsLagrangianFEM::getMaxForce() }; + } ); + real64 const localResidualNorm[2] = { localSum.get(), SolidMechanicsLagrangianFEM::getMaxForce() }; - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); - int const numRanks = MpiWrapper::commSize( MPI_COMM_GEOSX ); - array1d< real64 > globalValues( numRanks * 2 ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const numRanks = MpiWrapper::commSize( MPI_COMM_GEOSX ); + array1d< real64 > globalValues( numRanks * 2 ); - // Everything is done on rank 0 - MpiWrapper::gather( localResidualNorm, - 2, - globalValues.data(), - 2, - 0, - MPI_COMM_GEOSX ); + // Everything is done on rank 0 + MpiWrapper::gather( localResidualNorm, + 2, + globalValues.data(), + 2, + 0, + MPI_COMM_GEOSX ); - if( rank==0 ) + if( rank==0 ) + { + for( int r=0; r= 1 && logger::internal::rank==0 ) - { - std::cout << GEOS_FMT( " ( RFracture ) = ( {:4.2e} )", fractureResidualNorm ); - } + real64 const fractureResidualNorm = sqrt( globalResidualNorm[0] )/(globalResidualNorm[1]+1); // the + 1 is for the first + // time-step when maxForce = 0; - return sqrt( solidResidualNorm * solidResidualNorm + fractureResidualNorm * fractureResidualNorm ); - } - else + if( getLogLevel() >= 1 && logger::internal::rank==0 ) { - return solidResidualNorm; + std::cout << GEOS_FMT( " ( RFracture ) = ( {:4.2e} )", fractureResidualNorm ); } + + return fractureResidualNorm; } void SolidMechanicsEmbeddedFractures::applySystemSolution( DofManager const & dofManager, diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index 23153c33df6..0422634b20d 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -77,6 +77,10 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase DofManager const & dofManager, arrayView1d< real64 const > const & localRhs ) override; + real64 calculateFractureResidualNorm( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ) const; + virtual void applySystemSolution( DofManager const & dofManager, arrayView1d< real64 const > const & localSolution, diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index f9d018d9803..8c5439511cc 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -697,7 +697,11 @@ real64 SolidMechanicsLagrangeContact::calculateContactResidualNorm( DomainPartit string const & dofKey = dofManager.getKey( contact::traction::key() ); globalIndex const rankOffset = dofManager.rankOffset(); - real64 contactResidual = 0.0; + real64 stickResidual = 0.0; + real64 slipResidual = 0.0; + real64 slipNormalizer = 0.0; + real64 openResidual = 0.0; + real64 openNormalizer = 0.0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel const & mesh, @@ -708,42 +712,78 @@ real64 SolidMechanicsLagrangeContact::calculateContactResidualNorm( DomainPartit { arrayView1d< globalIndex const > const & dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); + arrayView1d< integer const > const & fractureState = subRegion.getField< contact::fractureState >(); + arrayView1d< real64 const > const & area = subRegion.getElementArea(); - RAJA::ReduceSum< parallelHostReduce, real64 > localSum( 0.0 ); + RAJA::ReduceSum< parallelHostReduce, real64 > stickSum( 0.0 ); + RAJA::ReduceSum< parallelHostReduce, real64 > slipSum( 0.0 ); + RAJA::ReduceMax< parallelHostReduce, real64 > slipMax( 0.0 ); + RAJA::ReduceSum< parallelHostReduce, real64 > openSum( 0.0 ); + RAJA::ReduceMax< parallelHostReduce, real64 > openMax( 0.0 ); forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const k ) { if( ghostRank[k] < 0 ) { localIndex const localRow = LvArray::integerConversion< localIndex >( dofNumber[k] - rankOffset ); - for( localIndex dim = 0; dim < 3; ++dim ) + switch( fractureState[k] ) { - localSum += localRhs[localRow + dim] * localRhs[localRow + dim]; + case contact::FractureState::Stick: + { + for( localIndex dim = 0; dim < 3; ++dim ) + { + real64 const norm = localRhs[localRow + dim] / area[k]; + stickSum += norm * norm; + } + break; + } + case contact::FractureState::Slip: + case contact::FractureState::NewSlip: + { + for( localIndex dim = 0; dim < 3; ++dim ) + { + slipSum += localRhs[localRow + dim] * localRhs[localRow + dim]; + slipMax.max( LvArray::math::abs( localRhs[localRow + dim] ) ); + } + break; + } + case contact::FractureState::Open: + { + for( localIndex dim = 0; dim < 3; ++dim ) + { + openSum += localRhs[localRow + dim] * localRhs[localRow + dim]; + openMax.max( LvArray::math::abs( localRhs[localRow + dim] ) ); + } + break; + } } } } ); - contactResidual += localSum.get(); + + stickResidual += stickSum.get(); + slipResidual += slipSum.get(); + slipNormalizer = LvArray::math::max( slipNormalizer, slipMax.get()); + openResidual += openSum.get(); + openNormalizer = LvArray::math::max( openNormalizer, openMax.get()); } ); } ); - contactResidual = MpiWrapper::sum( contactResidual ); - contactResidual = sqrt( contactResidual ); + stickResidual = MpiWrapper::sum( stickResidual ); + stickResidual = sqrt( stickResidual ); - if( this->m_nonlinearSolverParameters.m_numNewtonIterations == 0 ) - { - this->m_initialContactResidual = contactResidual; - contactResidual = 1.0; - } - else - { - contactResidual /= (this->m_initialContactResidual + 1.0); - } + slipResidual = MpiWrapper::sum( slipResidual ); + slipNormalizer = MpiWrapper::max( slipNormalizer ); + slipResidual = sqrt( slipResidual ) / ( slipNormalizer + 1.0 ); + + openResidual = MpiWrapper::sum( openResidual ); + openNormalizer = MpiWrapper::max( openNormalizer ); + openResidual = sqrt( openResidual ) / ( openNormalizer + 1.0 ); if( getLogLevel() >= 1 && logger::internal::rank==0 ) { - std::cout << GEOS_FMT( " ( Rtraction ) = ( {:15.6e} )", contactResidual ); + std::cout << GEOS_FMT( " ( Rstick Rslip Ropen ) = ( {:15.6e} {:15.6e} {:15.6e} )", stickResidual, slipResidual, openResidual ); } - return contactResidual; + return sqrt( stickResidual * stickResidual + slipResidual * slipResidual + openResidual * openResidual ); } void SolidMechanicsLagrangeContact::createPreconditioner( DomainPartition const & domain ) diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index 28485284008..bdb00997153 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -165,8 +165,6 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase real64 const m_slidingCheckTolerance = 0.05; - real64 m_initialContactResidual = 0.0; - real64 m_stabilitzationScalingCoefficient = 1.0; void createPreconditioner( DomainPartition const & domain ); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 92faf16b5b5..b7e02bf0c41 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -1243,8 +1243,8 @@ SolidMechanicsLagrangianFEM:: MpiWrapper::bcast( globalResidualNorm, 2, 0, MPI_COMM_GEOSX ); - real64 const residual = sqrt( globalResidualNorm[0] )/(globalResidualNorm[1]+1); // the + 1 is for the first - // time-step when maxForce = 0; + real64 const residual = sqrt( globalResidualNorm[0] ) / ( globalResidualNorm[1] + 1 ); // the + 1 is for the first + // time-step when maxForce = 0; totalResidualNorm = std::max( residual, totalResidualNorm ); } ); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index d7bf9af216b..dc24a47e941 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -262,6 +262,7 @@ class SolidMechanicsLagrangianFEM : public SolverBase } real64 & getMaxForce() { return m_maxForce; } + real64 const & getMaxForce() const { return m_maxForce; } arrayView1d< ParallelVector > const & getRigidBodyModes() const { diff --git a/src/coreComponents/schema/docs/NonlinearSolverParameters.rst b/src/coreComponents/schema/docs/NonlinearSolverParameters.rst index 0a48c42e401..bf61e0939db 100644 --- a/src/coreComponents/schema/docs/NonlinearSolverParameters.rst +++ b/src/coreComponents/schema/docs/NonlinearSolverParameters.rst @@ -16,6 +16,7 @@ lineSearchInterpolationType geos_NonlinearSolverParameters_LineSearchInterpol | * Linear | * Parabolic lineSearchMaxCuts integer 4 Maximum number of line search cuts. +lineSearchResidualFactor real64 1 Factor to determine residual increase (recommended values: 1.1 (conservative), 2.0 (relaxed), 10.0 (aggressive)). lineSearchStartingIteration integer 0 Iteration when line search starts. logLevel integer 0 Log level maxAllowedResidualNorm real64 1e+09 Maximum value of residual norm that is allowed in a Newton loop diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index c814c8b81ca..c4a1fa77a16 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -1868,6 +1868,8 @@ the relative residual norm satisfies: + + From c2b35cc27a4714640438c074072a105b5acedd2a Mon Sep 17 00:00:00 2001 From: acitrain <60715545+acitrain@users.noreply.github.com> Date: Fri, 3 May 2024 07:30:54 +0200 Subject: [PATCH 048/286] Refactoring wave solver: new folder organization (#3074) * Finalization of refactoring: new folder organization for wave solvers * Change default value for acoustic density * Modify path inside unit tests * Add one folder for numerical method (prevision for DG) * Modify CMakeLists (forgot in last commit..) * Update comments * Modify acoustic vti folder into anisotropic * Checking integrating tests on CI * Updating the integratedTests hash --------- Co-authored-by: Stefano Frambati Co-authored-by: Nicola Castelletto --- integratedTests | 2 +- .../physicsSolvers/CMakeLists.txt | 64 +++++++++---------- .../AcousticFirstOrderWaveEquationSEM.cpp | 10 +-- .../AcousticFirstOrderWaveEquationSEM.hpp | 4 +- ...cousticFirstOrderWaveEquationSEMKernel.hpp | 4 +- .../anisotropic}/AcousticVTIFields.hpp | 0 .../AcousticVTIWaveEquationSEM.cpp | 4 +- .../AcousticVTIWaveEquationSEM.hpp | 4 +- .../AcousticVTIWaveEquationSEMKernel.hpp | 2 +- .../isotropic}/AcousticPMLSEMKernel.hpp | 0 .../isotropic}/AcousticWaveEquationSEM.cpp | 37 ++--------- .../isotropic}/AcousticWaveEquationSEM.hpp | 4 +- .../AcousticWaveEquationSEMKernel.hpp | 4 +- .../acoustic/shared}/AcousticFields.hpp | 2 +- .../shared}/AcousticMatricesSEMKernel.hpp | 0 .../shared}/AcousticTimeSchemeSEMKernel.hpp | 0 .../AcousticElasticWaveEquationSEM.cpp | 0 .../AcousticElasticWaveEquationSEM.hpp | 4 +- .../AcousticElasticWaveEquationSEMKernel.hpp | 20 ++++++ .../isotropic}/AcoustoElasticFields.hpp | 0 .../AcoustoElasticTimeSchemeSEMKernel.hpp | 0 .../ElasticFirstOrderWaveEquationSEM.cpp | 10 +-- .../ElasticFirstOrderWaveEquationSEM.hpp | 4 +- ...ElasticFirstOrderWaveEquationSEMKernel.hpp | 52 ++++++++++++++- .../isotropic}/ElasticWaveEquationSEM.cpp | 8 +-- .../isotropic}/ElasticWaveEquationSEM.hpp | 4 +- .../ElasticWaveEquationSEMKernel.hpp | 4 +- .../elastic/shared}/ElasticFields.hpp | 0 .../shared}/ElasticMatricesSEMKernel.hpp | 9 ++- .../shared}/ElasticTimeSchemeSEMKernel.hpp | 0 .../PrecomputeSourcesAndReceiversKernel.hpp | 29 +++++---- .../{ => shared}/WaveSolverBase.cpp | 4 +- .../{ => shared}/WaveSolverBase.hpp | 4 +- .../{ => shared}/WaveSolverUtils.hpp | 60 +++++++++++++++-- .../testWavePropagation.cpp | 4 +- .../testWavePropagationAcousticFirstOrder.cpp | 4 +- .../testWavePropagationDAS.cpp | 4 +- .../testWavePropagationElasticFirstOrder.cpp | 4 +- .../testWavePropagationQ2.cpp | 4 +- 39 files changed, 231 insertions(+), 142 deletions(-) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/firstOrderEqn/isotropic}/AcousticFirstOrderWaveEquationSEM.cpp (98%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/firstOrderEqn/isotropic}/AcousticFirstOrderWaveEquationSEM.hpp (97%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/firstOrderEqn/isotropic}/AcousticFirstOrderWaveEquationSEMKernel.hpp (99%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/secondOrderEqn/anisotropic}/AcousticVTIFields.hpp (100%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/secondOrderEqn/anisotropic}/AcousticVTIWaveEquationSEM.cpp (99%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/secondOrderEqn/anisotropic}/AcousticVTIWaveEquationSEM.hpp (97%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/secondOrderEqn/anisotropic}/AcousticVTIWaveEquationSEMKernel.hpp (99%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/secondOrderEqn/isotropic}/AcousticPMLSEMKernel.hpp (100%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/secondOrderEqn/isotropic}/AcousticWaveEquationSEM.cpp (96%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/secondOrderEqn/isotropic}/AcousticWaveEquationSEM.hpp (97%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/secondOrderEqn/isotropic}/AcousticWaveEquationSEMKernel.hpp (98%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/shared}/AcousticFields.hpp (99%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/shared}/AcousticMatricesSEMKernel.hpp (100%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustic/shared}/AcousticTimeSchemeSEMKernel.hpp (100%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustoelastic/secondOrderEqn/isotropic}/AcousticElasticWaveEquationSEM.cpp (100%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustoelastic/secondOrderEqn/isotropic}/AcousticElasticWaveEquationSEM.hpp (96%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustoelastic/secondOrderEqn/isotropic}/AcousticElasticWaveEquationSEMKernel.hpp (81%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustoelastic/secondOrderEqn/isotropic}/AcoustoElasticFields.hpp (100%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/acoustoelastic/secondOrderEqn/isotropic}/AcoustoElasticTimeSchemeSEMKernel.hpp (100%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/elastic/firstOrderEqn/isotropic}/ElasticFirstOrderWaveEquationSEM.cpp (99%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/elastic/firstOrderEqn/isotropic}/ElasticFirstOrderWaveEquationSEM.hpp (98%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/elastic/firstOrderEqn/isotropic}/ElasticFirstOrderWaveEquationSEMKernel.hpp (80%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/elastic/secondOrderEqn/isotropic}/ElasticWaveEquationSEM.cpp (99%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/elastic/secondOrderEqn/isotropic}/ElasticWaveEquationSEM.hpp (98%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/elastic/secondOrderEqn/isotropic}/ElasticWaveEquationSEMKernel.hpp (98%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/elastic/shared}/ElasticFields.hpp (100%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/elastic/shared}/ElasticMatricesSEMKernel.hpp (94%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => sem/elastic/shared}/ElasticTimeSchemeSEMKernel.hpp (100%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => shared}/PrecomputeSourcesAndReceiversKernel.hpp (99%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => shared}/WaveSolverBase.cpp (99%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => shared}/WaveSolverBase.hpp (99%) rename src/coreComponents/physicsSolvers/wavePropagation/{ => shared}/WaveSolverUtils.hpp (79%) diff --git a/integratedTests b/integratedTests index ff17461c186..3e88000a304 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit ff17461c18635b499c0a672b2a651c9f01b9d9d3 +Subproject commit 3e88000a3047d0bea11908f012ba08174ce6b838 diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index d23d07265e6..bf0278adf7e 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -128,31 +128,31 @@ set( physicsSolvers_headers surfaceGeneration/SurfaceGeneratorFields.hpp surfaceGeneration/kernels/surfaceGenerationKernels.hpp surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp - wavePropagation/WaveSolverBase.hpp - wavePropagation/WaveSolverUtils.hpp - wavePropagation/PrecomputeSourcesAndReceiversKernel.hpp - wavePropagation/AcousticFields.hpp - wavePropagation/AcousticWaveEquationSEM.hpp - wavePropagation/AcousticWaveEquationSEMKernel.hpp - wavePropagation/AcousticTimeSchemeSEMKernel.hpp - wavePropagation/AcousticMatricesSEMKernel.hpp - wavePropagation/AcousticPMLSEMKernel.hpp - wavePropagation/ElasticFields.hpp - wavePropagation/ElasticWaveEquationSEM.hpp - wavePropagation/ElasticWaveEquationSEMKernel.hpp - wavePropagation/ElasticTimeSchemeSEMKernel.hpp - wavePropagation/ElasticFirstOrderWaveEquationSEM.hpp - wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp - wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp - wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp - wavePropagation/ElasticMatricesSEMKernel.hpp - wavePropagation/AcousticVTIFields.hpp - wavePropagation/AcousticVTIWaveEquationSEM.hpp - wavePropagation/AcousticVTIWaveEquationSEMKernel.hpp - wavePropagation/AcoustoElasticFields.hpp - wavePropagation/AcoustoElasticTimeSchemeSEMKernel.hpp - wavePropagation/AcousticElasticWaveEquationSEM.hpp - wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp ) + wavePropagation/shared/WaveSolverBase.hpp + wavePropagation/shared/WaveSolverUtils.hpp + wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp + wavePropagation/sem/acoustic/shared/AcousticFields.hpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp + wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp + wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp + wavePropagation/sem/elastic/shared/ElasticFields.hpp + wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp + wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp + wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp + wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp + wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp + wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp + wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp + wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp ) # Specify solver sources set( physicsSolvers_sources @@ -209,13 +209,13 @@ set( physicsSolvers_sources surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp surfaceGeneration/ParallelTopologyChange.cpp surfaceGeneration/SurfaceGenerator.cpp - wavePropagation/WaveSolverBase.cpp - wavePropagation/AcousticWaveEquationSEM.cpp - wavePropagation/ElasticWaveEquationSEM.cpp - wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp - wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp - wavePropagation/AcousticVTIWaveEquationSEM.cpp - wavePropagation/AcousticElasticWaveEquationSEM.cpp ) + wavePropagation/shared/WaveSolverBase.cpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp + wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp + wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp + wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp ) include( solidMechanics/kernels/SolidMechanicsKernels.cmake) include( multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake) diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp similarity index 98% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 39c8fdfad81..4935ac3e1eb 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -26,9 +26,9 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp" +#include "physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp" #include "events/EventManager.hpp" -#include "AcousticMatricesSEMKernel.hpp" -#include "PrecomputeSourcesAndReceiversKernel.hpp" namespace geos { @@ -148,7 +148,7 @@ void AcousticFirstOrderWaveEquationSEM::postProcessInput() m_uzNp1AtReceivers.resize( m_nsamplesSeismoTrace, numReceiversGlobal + 1 ); m_sourceElem.resize( numSourcesGlobal ); m_sourceRegion.resize( numSourcesGlobal ); - m_rcvElem.resize( numReceiversGlobal ); + m_receiverElem.resize( numReceiversGlobal ); m_receiverRegion.resize( numReceiversGlobal ); } @@ -176,7 +176,7 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev arrayView2d< localIndex > const receiverNodeIds = m_receiverNodeIds.toView(); arrayView2d< real64 > const receiverConstants = m_receiverConstants.toView(); arrayView1d< localIndex > const receiverIsLocal = m_receiverIsLocal.toView(); - arrayView1d< localIndex > const rcvElem = m_rcvElem.toView(); + arrayView1d< localIndex > const receiverElem = m_receiverElem.toView(); arrayView1d< localIndex > const receiverRegion = m_receiverRegion.toView(); receiverNodeIds.setValues< EXEC_POLICY >( -1 ); receiverConstants.setValues< EXEC_POLICY >( -1 ); @@ -235,7 +235,7 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev sourceRegion, receiverCoordinates, receiverIsLocal, - rcvElem, + receiverElem, receiverNodeIds, receiverConstants, receiverRegion, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp similarity index 97% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp index 14a6dc502ae..eba7dc066c0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp @@ -21,8 +21,8 @@ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICFIRSTORDERWAVEEQUATIONSEM_HPP_ #include "mesh/MeshFields.hpp" -#include "AcousticFields.hpp" -#include "WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp index 3688f49df86..744e288fd87 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp @@ -20,9 +20,6 @@ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICFIRSTTORDERWAVEEQUATIONSEMKERNEL_HPP_ #include "finiteElement/kernelInterface/KernelBase.hpp" -#include "WaveSolverUtils.hpp" - - namespace geos { @@ -47,6 +44,7 @@ struct VelocityComputation * @param[in] nodeCoords coordinates of the nodes * @param[in] elemsToNodes map from element to nodes * @param[in] p_np1 pressure array (only used here) + * @param[in] density cell-wise density * @param[in] dt time-step * @param[out] velocity_x velocity array in the x direction (updated here) * @param[out] velocity_y velocity array in the y direction (updated here) diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIFields.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp similarity index 99% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index b036542b61d..5f9497ffc37 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -26,9 +26,9 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp" #include "events/EventManager.hpp" -#include "WaveSolverUtils.hpp" -#include "AcousticTimeSchemeSEMKernel.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp similarity index 97% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp index 932568e3f6e..712104350de 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp @@ -22,8 +22,8 @@ #include "mesh/MeshFields.hpp" #include "physicsSolvers/SolverBase.hpp" -#include "WaveSolverBase.hpp" -#include "AcousticFields.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp" #include "AcousticVTIFields.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp index 72cd2da8d73..1f9f15608a1 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp @@ -21,7 +21,7 @@ #include "finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp" #include "finiteElement/kernelInterface/KernelBase.hpp" -#include "WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" #include "AcousticVTIFields.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticPMLSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticPMLSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp similarity index 96% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index f8404f01964..a6171a8028c 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -26,12 +26,12 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp" #include "events/EventManager.hpp" -#include "WaveSolverUtils.hpp" -#include "AcousticTimeSchemeSEMKernel.hpp" -#include "AcousticMatricesSEMKernel.hpp" #include "AcousticPMLSEMKernel.hpp" -#include "PrecomputeSourcesAndReceiversKernel.hpp" +#include "physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp" namespace geos { @@ -299,14 +299,6 @@ void AcousticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() { using FE_TYPE = TYPEOFREF( finiteElement ); - // acousticWaveEquationSEMKernels::MassMatrixKernel< FE_TYPE > kernelM( finiteElement ); - // kernelM.template launch< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), - // nodeCoords, - // elemsToNodes, - // velocity, - // density, - // mass ); - AcousticMatricesSEM::MassMatrix< FE_TYPE > kernelM( finiteElement ); kernelM.template computeMassMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), nodeCoords, @@ -326,24 +318,6 @@ void AcousticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() density, damping ); - //AcousticMatricesSEM::computeDampingMatrix(finiteElement, - // elementSubRegion.size(), - // - // - // - // - // - // - // nodeCoords, - // elemsToFaces, - // facesToNodes, - // facesDomainBoundaryIndicator, - // freeSurfaceFaceIndicator, - // velocity, - // density, - //damping ); - - } ); } ); @@ -374,9 +348,6 @@ void AcousticWaveEquationSEM::applyFreeSurfaceBC( real64 time, DomainPartition & /// array of indicators: 1 if a node is on on free surface; 0 otherwise arrayView1d< localIndex > const freeSurfaceNodeIndicator = nodeManager.getField< acousticfields::AcousticFreeSurfaceNodeIndicator >(); - // freeSurfaceFaceIndicator.zero(); - // freeSurfaceNodeIndicator.zero(); - fsManager.apply< FaceManager >( time, domain.getMeshBody( 0 ).getMeshLevel( m_discretizationName ), string( "FreeSurface" ), diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp similarity index 97% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp index 9396a8201bf..d8d7e6fc981 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp @@ -20,10 +20,10 @@ #ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICWAVEEQUATIONSEM_HPP_ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICWAVEEQUATIONSEM_HPP_ -#include "WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" #include "mesh/MeshFields.hpp" #include "physicsSolvers/SolverBase.hpp" -#include "AcousticFields.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp similarity index 98% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp index ddf9b731f6f..60b3bfe56c1 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp @@ -20,11 +20,11 @@ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICWAVEEQUATIONSEMKERNEL_HPP_ #include "finiteElement/kernelInterface/KernelBase.hpp" -#include "WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" #if !defined( GEOS_USE_HIP ) #include "finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp" #endif -#include "AcousticFields.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticFields.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp index 903809d893b..8901bea6a47 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp @@ -141,7 +141,7 @@ DECLARE_FIELD( AcousticVelocity, DECLARE_FIELD( AcousticDensity, "acousticDensity", array1d< real32 >, - 0, + 1, NOPLOT, WRITE_AND_READ, "Medium density of the cell" ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticMatricesSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticTimeSchemeSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp similarity index 100% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp similarity index 96% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp index 54e8a22a352..31a5a2d7969 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp @@ -20,8 +20,8 @@ #ifndef SRC_CORECOMPONENTS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICELASTICWAVEEQUATIONSEM_HPP_ #define SRC_CORECOMPONENTS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICELASTICWAVEEQUATIONSEM_HPP_ -#include "physicsSolvers/wavePropagation/ElasticWaveEquationSEM.hpp" -#include "physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp" #include "physicsSolvers/SolverBase.hpp" #include "AcoustoElasticFields.hpp" #include diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp similarity index 81% rename from src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp index 91c9ed8a99b..8a9db1426a4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/AcousticElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp @@ -37,6 +37,26 @@ struct CouplingKernel { static constexpr localIndex numNodesPerFace = FE_TYPE::numNodesPerFace; + + /** + * @brief Launches the computation of the coupling vector + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of faces + * @param[in] nodeCoords coordinates of the nodes + * @param[in] fluidRegionIndex Acoustic region + * @param[in] fluidSubRegionIndex Acoustic subregion + * @param[in] faceToSubRegion Array which gives you the subregion on which the face belongs + * @param[in] faceToRegion Array which gives you the region on which the face belongs + * @param[in] faceToElement Array which gives you the element on which the face belongs + * @param[in] facesToNodes Array which gives the nodes on the mesh knowing the face and the local node on an element + * @param[in] faceNormal Normals of the faces + * @param[in] faceCenters Centers of the faces + * @param[in] elemCenters Centers of the elements + * @param[out] couplingVectorx x-component of the coupling vector + * @param[out] couplingVectory y-component of the coupling vector + * @param[out] couplingVectorz z-component of the coupling vector + */ template< typename EXEC_POLICY, typename ATOMIC_POLICY > void launch( localIndex const size, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcoustoElasticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/wavePropagation/AcoustoElasticFields.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/AcoustoElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/wavePropagation/AcoustoElasticTimeSchemeSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp similarity index 99% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index 44ccacc6b9b..a546c6b4821 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -25,9 +25,9 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp" +#include "physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp" #include "events/EventManager.hpp" -#include "ElasticMatricesSEMKernel.hpp" -#include "PrecomputeSourcesAndReceiversKernel.hpp" namespace geos { @@ -185,7 +185,7 @@ void ElasticFirstOrderWaveEquationSEM::postProcessInput() m_sourceRegion.resize( numSourcesGlobal ); localIndex const numReceiversGlobal = m_receiverCoordinates.size( 0 ); - m_rcvElem.resize( numReceiversGlobal ); + m_receiverElem.resize( numReceiversGlobal ); m_receiverRegion.resize( numReceiversGlobal ); m_displacementxNp1AtReceivers.resize( m_nsamplesSeismoTrace, numReceiversGlobal + 1 ); @@ -224,7 +224,7 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve arrayView2d< localIndex > const receiverNodeIds = m_receiverNodeIds.toView(); arrayView2d< real64 > const receiverConstants = m_receiverConstants.toView(); arrayView1d< localIndex > const receiverIsLocal = m_receiverIsLocal.toView(); - arrayView1d< localIndex > const rcvElem = m_rcvElem.toView(); + arrayView1d< localIndex > const receiverElem = m_receiverElem.toView(); arrayView1d< localIndex > const receiverRegion = m_receiverRegion.toView(); receiverNodeIds.setValues< serialPolicy >( -1 ); @@ -286,7 +286,7 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve sourceRegion, receiverCoordinates, receiverIsLocal, - rcvElem, + receiverElem, receiverNodeIds, receiverConstants, receiverRegion, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp similarity index 98% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp index b96d8697412..dc9939f117b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp @@ -21,8 +21,8 @@ #define SRC_CORECOMPONENTS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICFIRSTORDERWAVEEQUATIONSEM_HPP_ #include "mesh/MeshFields.hpp" -#include "ElasticFields.hpp" -#include "WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp similarity index 80% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp index 644b7650670..e831ecf902b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp @@ -20,7 +20,7 @@ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICFIRSTORDERWAVEEQUATIONSEMKERNEL_HPP_ #include "finiteElement/kernelInterface/KernelBase.hpp" -#include "WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" namespace geos @@ -39,7 +39,33 @@ struct StressComputation {} /** - * Add comments + * @brief Launches the computation of the strain tensor for one iteration + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] regionIndex Index of the subregion + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToNodes map from element to nodes + * @param[in] ux_np1 displacement array in the x direction (only used here) + * @param[in] uy_np1 displacement array in the y direction (only used here) + * @param[in] uz_np1 displacement array in the z direction (only used here) + * @param[in] velocityVp P-wavespeed array + * @param[in] velocityVs S-wavespeed array + * @param[in] lambda lambda (Lamé parameter) array + * @param[in] mu mu (Lamé parameter) array + * @param[in] sourceConstants constant part of the source terms + * @param[in] sourceIsLocal flag indicating whether the source is accessible or not + * @param[in] sourceElem element where a source is located + * @param[in] sourceRegion region where the source is located + * @param[in] sourceValue value of the temporal source (eg. Ricker) + * @param[in] dt time-step + * @param[in] cycleNumber the number of cycle + * @param[out] stressxx xx-component of the strain tensor array (updated here) + * @param[out] stressyy yy-component of the strain tensor array (updated here) + * @param[out] stresszz zz-component of the strain tensor array (updated here) + * @param[out] stressxy xy-component of the strain tensor array (updated here) + * @param[out] stressxz xz-component of the strain tensor array (updated here) + * @param[out] stressyz yz-component of the strain tensor array (updated here) */ template< typename EXEC_POLICY, typename ATOMIC_POLICY > @@ -215,7 +241,27 @@ struct VelocityComputation {} /** - * add doc + * @brief Launches the computation of the displacement for one iteration + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] size_node the number of nodes in the subRegion + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToNodes map from element to nodes + * @param[out] stressxx xx-component of the strain tensor array (only used here) + * @param[out] stressyy yy-component of the strain tensor array (only used here) + * @param[out] stresszz zz-component of the strain tensor array (only used here) + * @param[out] stressxy xy-component of the strain tensor array (only used here) + * @param[out] stressxz xz-component of the strain tensor array (only used here) + * @param[out] stressyz yz-component of the strain tensor array (only used here) + * @param[in] mass the mass matrix + * @param[in] dampingx the damping (x-component) matrix + * @param[in] dampingy the damping for (y-component) matrix + * @param[in] dampingz the damping for (z-component) matrix + * @param[in] dt time-step + * @param[in] ux_np1 displacement array in the x direction (updated here) + * @param[in] uy_np1 displacement array in the y direction (updated here) + * @param[in] uz_np1 displacement array in the z direction (updated here) */ template< typename EXEC_POLICY, typename ATOMIC_POLICY > diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp similarity index 99% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 85b409ccfa1..a85c110da48 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -25,11 +25,11 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp" #include "events/EventManager.hpp" -#include "WaveSolverUtils.hpp" -#include "ElasticTimeSchemeSEMKernel.hpp" -#include "ElasticMatricesSEMKernel.hpp" -#include "PrecomputeSourcesAndReceiversKernel.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp similarity index 98% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp index 74d58e3cfd0..834e9783fff 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp @@ -20,10 +20,10 @@ #ifndef SRC_CORECOMPONENTS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICWAVEEQUATIONSEM_HPP_ #define SRC_CORECOMPONENTS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICWAVEEQUATIONSEM_HPP_ -#include "WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" #include "mesh/MeshFields.hpp" #include "physicsSolvers/SolverBase.hpp" -#include "ElasticFields.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp similarity index 98% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp index 8518444a746..b8e69242e9e 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp @@ -20,8 +20,8 @@ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICWAVEEQUATIONSEMKERNEL_HPP_ #include "finiteElement/kernelInterface/KernelBase.hpp" -#include "WaveSolverUtils.hpp" -#include "ElasticFields.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticFields.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp similarity index 94% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticMatricesSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp index 8d52ac2dafb..575602a53c8 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/ElasticMatricesSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp @@ -98,8 +98,13 @@ struct ElasticMatricesSEM * @param[in] facesToNodes map from face to nodes * @param[in] facesDomainBoundaryIndicator flag equal to 1 if the face is on the boundary, and to 0 otherwise * @param[in] freeSurfaceFaceIndicator flag equal to 1 if the face is on the free surface, and to 0 otherwise - * @param[in] velocity cell-wise velocity - * @param[out] damping diagonal of the damping matrix + * @param[in] faceNormal array containing the normal fo the faces + * @param[in] density cell-wise density + * @param[in] velocityVp cell-wise P-wavespeed + * @param[in] velocityVs cell-wise S-wavespeed + * @param[out] dampingx diagonal of the damping matrix (x-direction) + * @param[out] dampingy diagonal of the damping matrix (y-direction) + * @param[out] dampingz diagonal of the damping matrix (z-direction) */ template< typename EXEC_POLICY, typename ATOMIC_POLICY > void diff --git a/src/coreComponents/physicsSolvers/wavePropagation/ElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/wavePropagation/ElasticTimeSchemeSEMKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/PrecomputeSourcesAndReceiversKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/wavePropagation/PrecomputeSourcesAndReceiversKernel.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp index aebc8b92761..51e9cbfd04c 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/PrecomputeSourcesAndReceiversKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp @@ -201,7 +201,7 @@ struct PreComputeSourcesAndReceivers * @param[out] sourceConstants constant part of the source terms * @param[in] receiverCoordinates coordinates of the receiver terms * @param[out] receiverIsLocal flag indicating whether the receiver is local or not - * @param[out] rcvElem element where a receiver is located + * @param[out] receiverElem element where a receiver is located * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located * @param[out] receiverConstants constant part of the receiver term * @param[out] sourceValue value of the temporal source (eg. Ricker) @@ -230,7 +230,7 @@ struct PreComputeSourcesAndReceivers arrayView1d< localIndex > const sourceRegion, arrayView2d< real64 const > const receiverCoordinates, arrayView1d< localIndex > const receiverIsLocal, - arrayView1d< localIndex > const rcvElem, + arrayView1d< localIndex > const receiverElem, arrayView2d< localIndex > const receiverNodeIds, arrayView2d< real64 > const receiverConstants, arrayView1d< localIndex > const receiverRegion, @@ -324,7 +324,7 @@ struct PreComputeSourcesAndReceivers nodeCoords, coordsOnRefElem ); receiverIsLocal[ircv] = 1; - rcvElem[ircv] = k; + receiverElem[ircv] = k; receiverRegion[ircv] = regionIndex; real64 Ntest[numNodesPerElem]; @@ -360,25 +360,26 @@ struct PreComputeSourcesAndReceivers * @param[in] faceNormal array containing the normal of all faces * @param[in] faceCenter array containing the center of all faces * @param[in] sourceCoordinates coordinates of the source terms - * @param[in] receiverCoordinates coordinates of the receiver terms - * @param[in] dt time-step - * @param[in] timeSourceFrequency Peak frequency of the source - * @param[in] sourceForce force vector of the source - * @param[in] sourceMoment moment (symmetric rank-2 tensor) of the source - * @param[in] useDAS parameter that determines which kind of receiver needs to be modeled (DAS or not, and which type) - * @param[in] linearDASSamples parameter that gives the number of integration points to be used when computing the DAS signal via strain - * integration - * @param[in] linearDASGeometry geometry of the linear DAS receivers, if needed - * @param[in] rickerOrder Order of the Ricker wavelet * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not * @param[out] sourceNodeIds indices of the nodes of the element where the source is located * @param[out] sourceConstantsx constant part of the source terms in x-direction * @param[out] sourceConstantsy constant part of the source terms in y-direction * @param[out] sourceConstantsz constant part of the source terms in z-direction + * @param[in] receiverCoordinates coordinates of the receiver terms * @param[out] receiverIsLocal flag indicating whether the receiver is local or not * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located - * @param[out] receiverNodeConstants constant part of the receiver term + * @param[out] receiverConstants constant part of the receiver term * @param[out] sourceValue array containing the value of the time dependent source (Ricker for e.g) + * @param[in] dt time-step + * @param[in] timeSourceFrequency Peak frequency of the source + * @param[in] timeSourceDelay Delay of the source + * @param[in] rickerOrder Order of the Ricker wavelet + * @param[in] useDAS parameter that determines which kind of receiver needs to be modeled (DAS or not, and which type) + * @param[in] linearDASSamples parameter that gives the number of integration points to be used when computing the DAS signal via strain + * integration + * @param[in] linearDASGeometry geometry of the linear DAS receivers, if needed + * @param[in] sourceForce force vector of the source + * @param[in] sourceMoment moment (symmetric rank-2 tensor) of the source */ template< typename EXEC_POLICY, typename FE_TYPE > static void diff --git a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp similarity index 99% rename from src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.cpp rename to src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index 4081681f62f..3eb561b2704 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -193,7 +193,7 @@ WaveSolverBase::WaveSolverBase( const std::string & name, setSizedFromParent( 0 ). setDescription( "Region containing the receivers" ); - registerWrapper( viewKeyStruct::receiverElemString(), &m_rcvElem ). + registerWrapper( viewKeyStruct::receiverElemString(), &m_receiverElem ). setInputFlag( InputFlags::FALSE ). setSizedFromParent( 0 ). setDescription( "Element containing the receivers" ); @@ -490,7 +490,7 @@ void WaveSolverBase::compute2dVariableAllSeismoTraces( localIndex const regionIn real64 const timeSeismo = m_dtSeismoTrace * (m_forward ? iSeismo : (m_nsamplesSeismoTrace - 1) - iSeismo); if( dir * timeSeismo > dir * (time_n + epsilonLoc)) break; - WaveSolverUtils::compute2dVariableSeismoTrace( time_n, dir * dt, regionIndex, m_receiverRegion, timeSeismo, iSeismo, m_rcvElem, + WaveSolverUtils::compute2dVariableSeismoTrace( time_n, dir * dt, regionIndex, m_receiverRegion, timeSeismo, iSeismo, m_receiverElem, m_receiverConstants, m_receiverIsLocal, var_np1, var_n, varAtReceivers ); } } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp index 93819ec6a60..0271d0382d0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp @@ -118,7 +118,7 @@ class WaveSolverBase : public SolverBase static constexpr char const * usePMLString() { return "usePML"; } static constexpr char const * parametersPMLString() { return "parametersPML"; } - static constexpr char const * receiverElemString() { return "rcvElem"; } + static constexpr char const * receiverElemString() { return "receiverElem"; } static constexpr char const * receiverRegionString() { return "receiverRegion"; } static constexpr char const * freeSurfaceString() { return "FreeSurface"; } }; @@ -319,7 +319,7 @@ class WaveSolverBase : public SolverBase array1d< localIndex > m_receiverIsLocal; /// Array containing the elements which contain a receiver - array1d< localIndex > m_rcvElem; + array1d< localIndex > m_receiverElem; /// Array containing the elements which contain the region which the receiver belongs array1d< localIndex > m_receiverRegion; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverUtils.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp similarity index 79% rename from src/coreComponents/physicsSolvers/wavePropagation/WaveSolverUtils.hpp rename to src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp index 5b9e91dbcb8..84875cf7bc7 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/WaveSolverUtils.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp @@ -82,6 +82,11 @@ struct WaveSolverUtils /** * @brief Initialize (clear) the trace file. + * @param[in] prefix Prefix of the output file + * @param[in] name Name of the solver on which you write the seismo trace + * @param[in] outputSeismoTrace Boolean equals to 1 if you want to output the seismotrace on a txt file 0 either + * @param[in] nReceivers Number of receivers + * @param[in] receiverIsLocal Array to check if the receiver is local to the MPI partition */ static void initTrace( char const * prefix, string const & name, @@ -110,6 +115,15 @@ struct WaveSolverUtils /** * @brief Convenient helper for 3D vectors calling 3 times the scalar version with only the sampled variable argument changed. + * @param[in] prefix Prefix of the output file + * @param[in] name Name of the solver on which you write the seismo trace + * @param[in] outputSeismoTrace Boolean equals to 1 if you want to output the seismotrace on a txt file 0 either + * @param[in] nReceivers Number of receivers + * @param[in] receiverIsLocal Array to check if the receiver is local to the MPI partition + * @param[in] nsamplesSeismoTrace Number of samples per seismo trace + * @param[out] varAtReceiversx Array containing the variable (x-direction) computed at the receivers + * @param[out] varAtReceiversy Array containing the variable (y-direction) computed at the receivers + * @param[out] varAtReceiversz Array containing the variable (z-direction) computed at the receivers */ static void writeSeismoTraceVector( char const * prefix, string const & name, @@ -128,6 +142,13 @@ struct WaveSolverUtils /** * @brief Write the seismo traces to a file. + * @param[in] prefix Prefix of the output file + * @param[in] name Name of the solver on which you write the seismo trace + * @param[in] outputSeismoTrace Boolean equals to 1 if you want to output the seismotrace on a txt file 0 either + * @param[in] nReceivers Number of receivers + * @param[in] receiverIsLocal Array to check if the receiver is local to the MPI partition + * @param[in] nsamplesSeismoTrace Number of samples per seismo trace + * @param[in] varAtReceivers Array containing the the variable computed at the receivers */ static void writeSeismoTrace( char const * prefix, string const & name, @@ -166,6 +187,18 @@ struct WaveSolverUtils /** * @brief Compute the seismo traces. + * @param[in] time_n Current time iteration + * @param[in] dt time-step + * @param[in] timeSeismo time when the seismo is computed + * @param[in] iSeismo i-th seismo trace + * @param[in] receiverNodeIds indices of the nodes of the element where the receiver is located + * @param[in] receiverConstants constant part of the receiver term + * @param[in] receiverIsLocal flag indicating whether the receiver is local or not + * @param[in] var_np1 Array containing the variable at time n+1 + * @param[in] var_n Array containing the variable at time n + * @param[out] varAtReceivers Array containing the the variable computed at the receivers + * @param[in] coeffs Coefficients array for receivers + * @param[in] add Boolean to say if you want to add the value of interpolation to the same receiver coefficient or not */ static void computeSeismoTrace( real64 const time_n, real64 const dt, @@ -200,14 +233,14 @@ struct WaveSolverUtils } } // linear interpolation between the pressure value at time_n and time_{n+1} - real32 rcvCoeff = coeffs.size( 0 ) == 0 ? 1.0 : coeffs( ircv ); + real32 receiverCoeff = coeffs.size( 0 ) == 0 ? 1.0 : coeffs( ircv ); if( add ) { - varAtReceivers( iSeismo, ircv ) += rcvCoeff * ( a1 * vtmp_n + a2 * vtmp_np1 ); + varAtReceivers( iSeismo, ircv ) += receiverCoeff * ( a1 * vtmp_n + a2 * vtmp_np1 ); } else { - varAtReceivers( iSeismo, ircv ) = rcvCoeff * ( a1 * vtmp_n + a2 * vtmp_np1 ); + varAtReceivers( iSeismo, ircv ) = receiverCoeff * ( a1 * vtmp_n + a2 * vtmp_np1 ); } // NOTE: varAtReceivers has size(1) = numReceiversGlobal + 1, this does not OOB // left in the forAll loop for sync issues since the following does not depend on `ircv` @@ -216,13 +249,28 @@ struct WaveSolverUtils } ); } + /** + * @brief Compute the seismo traces for 2d arrays + * @param[in] time_n Current time iteration + * @param[in] dt time-step + * @param[in] regionIndex Index of the current region + * @param[in] receiverRegion Array containing the region in which the receiver is located + * @param[in] timeSeismo time when the seismo is computed + * @param[in] iSeismo i-th seismo trace + * @param[in] receiverElem Array containing the element on which the receiver is located + * @param[in] receiverConstants constant part of the receiver term + * @param[in] receiverIsLocal flag indicating whether the receiver is local or not + * @param[in] var_np1 Array containing the variable at time n+1 + * @param[in] var_n Array containing the variable at time n + * @param[out] varAtReceivers Array containing the the variable computed at the receivers + */ static void compute2dVariableSeismoTrace( real64 const time_n, real64 const dt, localIndex const regionIndex, arrayView1d< localIndex const > const receiverRegion, real64 const timeSeismo, localIndex const iSeismo, - arrayView1d< localIndex const > const rcvElem, + arrayView1d< localIndex const > const receiverElem, arrayView2d< real64 const > const receiverConstants, arrayView1d< localIndex const > const receiverIsLocal, arrayView2d< real32 const > const var_np1, @@ -245,8 +293,8 @@ struct WaveSolverUtils real32 vtmp_np1 = 0.0, vtmp_n = 0.0; for( localIndex inode = 0; inode < receiverConstants.size( 1 ); ++inode ) { - vtmp_np1 += var_np1( rcvElem[ircv], inode ) * receiverConstants( ircv, inode ); - vtmp_n += var_n( rcvElem[ircv], inode ) * receiverConstants( ircv, inode ); + vtmp_np1 += var_np1( receiverElem[ircv], inode ) * receiverConstants( ircv, inode ); + vtmp_n += var_n( receiverElem[ircv], inode ) * receiverConstants( ircv, inode ); } // linear interpolation between the pressure value at time_n and time_{n+1} varAtReceivers( iSeismo, ircv ) = a1 * vtmp_n + a2 * vtmp_np1; diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp index 4edd9e63d6f..493dc54a71f 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp @@ -21,8 +21,8 @@ #include "mesh/DomainPartition.hpp" #include "mainInterface/GeosxState.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" -#include "physicsSolvers/wavePropagation/WaveSolverBase.hpp" -#include "physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp" #include diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp index 2da611b46e7..0b37a9d382e 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp @@ -21,8 +21,8 @@ #include "mesh/DomainPartition.hpp" #include "mainInterface/GeosxState.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" -#include "physicsSolvers/wavePropagation/WaveSolverBase.hpp" -#include "physicsSolvers/wavePropagation/AcousticFirstOrderWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp" #include diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp index 2ea5aa70170..c5c6243d013 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp @@ -21,8 +21,8 @@ #include "mesh/DomainPartition.hpp" #include "mainInterface/GeosxState.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" -#include "physicsSolvers/wavePropagation/WaveSolverBase.hpp" -#include "physicsSolvers/wavePropagation/ElasticWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp" #include diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp index f34f65d7a92..b36915027a9 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp @@ -21,8 +21,8 @@ #include "mesh/DomainPartition.hpp" #include "mainInterface/GeosxState.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" -#include "physicsSolvers/wavePropagation/WaveSolverBase.hpp" -#include "physicsSolvers/wavePropagation/ElasticFirstOrderWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp" #include diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp index 576be10cd46..3f74d76d860 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp @@ -21,8 +21,8 @@ #include "mesh/DomainPartition.hpp" #include "mainInterface/GeosxState.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" -#include "physicsSolvers/wavePropagation/WaveSolverBase.hpp" -#include "physicsSolvers/wavePropagation/AcousticWaveEquationSEM.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp" #include From 779dfaf7808d24f9a23d76b2270fc8426bfceb1f Mon Sep 17 00:00:00 2001 From: Guotong <133127368+Guotong-Ren@users.noreply.github.com> Date: Fri, 3 May 2024 09:20:56 -0500 Subject: [PATCH 049/286] add penalty contact for hydraulic fracturing in poroelastic materials. (#3096) Co-authored-by: Nicola Castelletto --- integratedTests | 2 +- .../physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/integratedTests b/integratedTests index 3e88000a304..fafec8f82db 160000 --- a/integratedTests +++ b/integratedTests @@ -1 +1 @@ -Subproject commit 3e88000a3047d0bea11908f012ba08174ce6b838 +Subproject commit fafec8f82dbfe76b0653ebf302f914eab5fc3bde diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 445661f7daf..6c4779fd743 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -278,6 +278,7 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementB dt ); } ); + this->solidMechanicsSolver()->applyContactConstraint( dofManager, domain, localMatrix, localRhs ); this->solidMechanicsSolver()->getMaxForce() = LvArray::math::max( mechanicsMaxForce, poromechanicsMaxForce ); } From ddf3e97a398c1261cae81cf2f864112061e5b259 Mon Sep 17 00:00:00 2001 From: Ryan Aronson Date: Fri, 3 May 2024 07:24:31 -0700 Subject: [PATCH 050/286] Make optional builds re-runnable on CI (#3094) --- .github/workflows/build_and_test.yml | 14 ++++++++++++++ .github/workflows/ci_tests.yml | 10 ++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index b0fb147a734..d7fd4c14cd5 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -47,6 +47,9 @@ on: required: false type: boolean default: true + REQUIRED_LABEL: + required: false + type: string secrets: GOOGLE_CLOUD_GCP: required: false @@ -54,6 +57,17 @@ jobs: build_test_deploy: runs-on: ${{ inputs.RUNS_ON }} steps: + - name: does_pr_have_necessary_labels + if: ${{inputs.REQUIRED_LABEL && github.event_name == 'pull_request'}} + run: | + pr_json=$(curl -H "Accept: application/vnd.github+json" https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.number }}) + LABELS=$(echo ${pr_json} | jq -crM '[.labels[].name]') + echo " the labels are ${LABELS}" + echo " the required label is ${{inputs.REQUIRED_LABEL}}" + if [[ "${LABELS}" != *"${{inputs.REQUIRED_LABEL}}"* ]]; then + exit 1 + fi + - name: 'Cleanup build folder' run: | pwd diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 7bd8128679c..40e4953fa93 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -23,7 +23,6 @@ jobs: runs-on: ubuntu-22.04 outputs: DOCKER_IMAGE_TAG: ${{ steps.extract_docker_image_tag.outputs.DOCKER_IMAGE_TAG }} - LABELS: ${{ steps.extract_pr_info.outputs.LABELS }} steps: - name: Check that the PR is not a draft (cancel rest of jobs otherwise) id: extract_pr_info @@ -37,11 +36,6 @@ jobs: draft_status=$(echo ${pr_json} | jq '.draft') echo "Draft status of PR is ${draft_status}." if [[ $draft_status == true ]]; then exit 1 ; fi - - # If the workflow is meant to continue, we extract additional information for the json of the pr. - echo "LABELS=$(echo ${pr_json} | jq -crM '[.labels[].name]')" >> "$GITHUB_OUTPUT" - else - echo "LABELS=['ci: ready to be merged']" >> "$GITHUB_OUTPUT" fi @@ -194,7 +188,6 @@ jobs: needs: - is_not_draft_pull_request - cpu_builds - if: "${{ contains( fromJSON( needs.is_not_draft_pull_request.outputs.LABELS ), 'ci: run integrated tests') || github.event_name != 'pull_request' }}" uses: ./.github/workflows/build_and_test.yml secrets: inherit with: @@ -208,6 +201,7 @@ jobs: GCP_BUCKET: geosx/integratedTests RUNS_ON: streak2 DOCKER_RUN_ARGS: "--cpus=32 --memory=384g" + REQUIRED_LABEL: "ci: run integrated tests" code_coverage: needs: @@ -231,7 +225,6 @@ jobs: name: ${{ matrix.name }} needs: - is_not_draft_pull_request - if: "${{ contains( fromJSON( needs.is_not_draft_pull_request.outputs.LABELS ), 'ci: ready to be merged') }}" strategy: # In-progress jobs will not be cancelled if there is a failure fail-fast : false @@ -294,6 +287,7 @@ jobs: GCP_BUCKET: ${{ matrix.GCP_BUCKET }} HOST_CONFIG: ${{ matrix.HOST_CONFIG }} RUNS_ON: ${{ matrix.RUNS_ON }} + REQUIRED_LABEL: "ci: ready to be merged" secrets: inherit # Convenience job - passes when all other jobs have passed (must pass the CUDA jobs). From 04cda6ca9d78c333edca4f620cf7c803acdc82d4 Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Tue, 7 May 2024 09:01:39 -0500 Subject: [PATCH 051/286] Link compositional fluid model to static function implementation (#2879) --- .../constitutive/CMakeLists.txt | 17 +- .../constitutive/docs/PVTDriver.rst | 1 + .../fluid/multifluid/MultiFluidConstants.hpp | 2 +- .../fluid/multifluid/MultiFluidSelector.hpp | 4 + .../fluid/multifluid/MultiFluidUtils.hpp | 12 +- .../fluid/multifluid/PVTDriver.cpp | 21 + .../fluid/multifluid/PVTDriver.hpp | 2 + .../fluid/multifluid/PVTDriverRunTest.hpp | 35 +- .../CompositionalMultiphaseFluid.cpp | 91 +- .../CompositionalMultiphaseFluid.hpp | 29 +- ...CompositionalMultiphaseFluidPVTPackage.cpp | 20 +- ...CompositionalMultiphaseFluidPVTPackage.hpp | 8 +- .../CompositionalMultiphaseFluidUpdates.hpp | 171 ++- ...verRunTestCompositionalMultiphaseFluid.cpp | 9 - .../PVTDriverRunTestCompositionalPR.cpp | 26 + .../PVTDriverRunTestCompositionalPRLBC.cpp | 26 + .../PVTDriverRunTestCompositionalSRK.cpp | 26 + .../PVTDriverRunTestCompositionalSRKLBC.cpp | 26 + .../functions/CompositionalProperties.hpp | 86 +- ...es.cpp => CompositionalPropertiesImpl.hpp} | 98 +- .../functions/CubicEOSPhaseModel.hpp | 671 ++++++++--- .../functions/KValueInitialization.hpp | 36 +- .../functions/NegativeTwoPhaseFlash.hpp | 418 ++++++- .../compositional/functions/RachfordRice.hpp | 73 +- .../models/ComponentProperties.hpp | 10 + .../models/CompositionalDensity.cpp | 15 +- .../models/CompositionalDensity.hpp | 126 +- .../models/ConstantViscosity.hpp | 42 +- .../models/LohrenzBrayClarkViscosity.cpp | 51 + .../models/LohrenzBrayClarkViscosity.hpp | 304 +++++ .../models/LohrenzBrayClarkViscosityImpl.hpp | 408 +++++++ .../models/NegativeTwoPhaseFlashModel.cpp | 10 +- .../models/NegativeTwoPhaseFlashModel.hpp | 74 +- .../compositional/models/NullModel.hpp | 12 - .../constitutive/unitTests/CMakeLists.txt | 3 + .../constitutive/unitTests/TestFluid.hpp | 77 +- .../unitTests/TestFluidUtilities.hpp | 53 + .../unitTests/testCompositionalDensity.cpp | 256 +++++ .../unitTests/testCompositionalProperties.cpp | 322 ++---- .../constitutive/unitTests/testCubicEOS.cpp | 296 +++-- .../unitTests/testKValueInitialization.cpp | 4 +- .../testLohrenzBrayClarkViscosity.cpp | 277 +++++ .../unitTests/testNegativeTwoPhaseFlash.cpp | 172 ++- .../testNegativeTwoPhaseFlash9Comp.cpp | 540 +++++++++ .../docs/CompositionalMultiphaseFluid.rst | 1 + ...ompositionalTwoPhaseFluidPengRobinson.rst} | 0 ...ositionalTwoPhaseFluidPengRobinsonLBC.rst} | 0 ...nalTwoPhaseFluidPengRobinsonLBC_other.rst} | 1 + ...tionalTwoPhaseFluidPengRobinson_other.rst} | 1 + ...sitionalTwoPhaseFluidSoaveRedlichKwong.rst | 19 + ...ionalTwoPhaseFluidSoaveRedlichKwongLBC.rst | 19 + ...woPhaseFluidSoaveRedlichKwongLBC_other.rst | 31 + ...alTwoPhaseFluidSoaveRedlichKwong_other.rst | 31 + .../schema/docs/Constitutive.rst | 174 +-- .../schema/docs/Constitutive_other.rst | 174 +-- src/coreComponents/schema/docs/PVTDriver.rst | 31 +- src/coreComponents/schema/schema.xsd | 78 +- src/coreComponents/schema/schema.xsd.other | 110 +- .../testPVT_Compositional.xml | 192 ++++ .../testPVT_Compositional_liveOilPR.txt | 112 ++ .../testPVT_Compositional_liveOilPRLBC.txt | 1012 +++++++++++++++++ .../testPVT_Compositional_liveOilSRK.txt | 112 ++ .../testPVT_Compositional_liveOilSRKLBC.txt | 1012 +++++++++++++++++ src/docs/sphinx/CompleteXMLSchema.rst | 60 +- 64 files changed, 7027 insertions(+), 1103 deletions(-) create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp rename src/coreComponents/constitutive/fluid/multifluid/compositional/functions/{CompositionalProperties.cpp => CompositionalPropertiesImpl.hpp} (50%) create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp create mode 100644 src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp create mode 100644 src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp create mode 100644 src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp rename src/coreComponents/schema/docs/{CompositonalTwoPhaseFluidPengRobinson.rst => CompositionalTwoPhaseFluidPengRobinson.rst} (100%) rename src/coreComponents/schema/docs/{CompositonalTwoPhaseFluidSoaveRedlichKwong.rst => CompositionalTwoPhaseFluidPengRobinsonLBC.rst} (100%) rename src/coreComponents/schema/docs/{CompositonalTwoPhaseFluidPengRobinson_other.rst => CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst} (96%) rename src/coreComponents/schema/docs/{CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst => CompositionalTwoPhaseFluidPengRobinson_other.rst} (96%) create mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst create mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst create mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst create mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst create mode 100644 src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml create mode 100644 src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPR.txt create mode 100644 src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPRLBC.txt create mode 100644 src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRK.txt create mode 100644 src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRKLBC.txt diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index 28ff5208229..7420efea9d3 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -62,6 +62,7 @@ set( constitutive_headers fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp fluid/multifluid/CO2Brine/functions/WaterDensity.hpp fluid/multifluid/compositional/functions/CompositionalProperties.hpp + fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp fluid/multifluid/compositional/functions/KValueInitialization.hpp fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -70,6 +71,8 @@ set( constitutive_headers fluid/multifluid/compositional/models/CompositionalDensity.hpp fluid/multifluid/compositional/models/ConstantViscosity.hpp fluid/multifluid/compositional/models/FunctionBase.hpp + fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp + fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp fluid/multifluid/compositional/models/NullModel.hpp fluid/multifluid/compositional/models/PhaseModel.hpp @@ -214,13 +217,16 @@ set( constitutive_sources fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp fluid/multifluid/CO2Brine/functions/WaterDensity.cpp - fluid/multifluid/compositional/functions/CompositionalProperties.cpp fluid/multifluid/compositional/models/CompositionalDensity.cpp fluid/multifluid/compositional/models/ConstantViscosity.cpp + fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp - fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp fluid/multifluid/reactive/ReactiveBrineFluid.cpp fluid/multifluid/reactive/ReactiveMultiFluid.cpp fluid/multifluid/reactive/ReactiveFluidDriver.cpp @@ -253,10 +259,10 @@ set( constitutive_sources relativePermeability/VanGenuchtenStone2RelativePermeability.cpp relativePermeability/RelpermDriver.cpp relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp - relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp + relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp - relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp + relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp relativePermeability/RelpermDriverTableRelativeRunTest.cpp relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp solid/CompressibleSolid.cpp @@ -300,7 +306,8 @@ if( ENABLE_PVTPackage ) set( constitutive_sources ${constitutive_sources} - fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp ) + fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp ) add_subdirectory( PVTPackage ) diff --git a/src/coreComponents/constitutive/docs/PVTDriver.rst b/src/coreComponents/constitutive/docs/PVTDriver.rst index c0b46436a7d..ae9563480c1 100644 --- a/src/coreComponents/constitutive/docs/PVTDriver.rst +++ b/src/coreComponents/constitutive/docs/PVTDriver.rst @@ -107,6 +107,7 @@ In this case, we have a two-phase, two-component mixture. The total density is reported in column 4, while phase fractions, phase densities, and phase viscosities are reported in subsequent columns. If the ``outputCompressibility`` flag is activated, an extra column will be added for the total fluid compressibility after the density. This is defined as :math:`c_t=\frac{1}{\rho_t}\left(\partial{\rho_t}/\partial P\right)` where :math:`\rho_t` is the total density. +If the ``outputMassDensity`` flag is activated, extra columns will be added for the mass density of each phase. The number of columns will also depend on whether the ``outputPhaseComposition`` flag is activated or not. If it is activated, there will be an extra column for the mole fraction of each component in each phase. The phase order will match the one defined in the input XML (here, the co2-rich phase followed by the water-rich phase). This file can be readily plotted using any number of plotting tools. Each row corresponds to one timestep of the driver, starting from initial conditions in the first row. diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp index 4f69f3efa17..24055925e16 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp @@ -49,7 +49,7 @@ struct MultiFluidConstants /** * @brief Max number of SSI iterations */ - static constexpr integer maxSSIIterations = 200; + static constexpr integer maxSSIIterations = 1000; /** * @brief Max number of Newton iterations diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index 6eeb7e4dd79..b7a71a3d9ca 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -43,6 +43,8 @@ void constitutiveUpdatePassThru( MultiFluidBase const & fluid, BlackOilFluid, CompositionalTwoPhasePengRobinsonConstantViscosity, CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity, +// CompositionalTwoPhasePengRobinsonLBCViscosity, +// CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, #ifdef GEOSX_USE_PVTPackage CompositionalMultiphaseFluidPVTPackage, #endif @@ -62,6 +64,8 @@ void constitutiveUpdatePassThru( MultiFluidBase & fluid, BlackOilFluid, CompositionalTwoPhasePengRobinsonConstantViscosity, CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity, +// CompositionalTwoPhasePengRobinsonLBCViscosity, +// CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, #ifdef GEOSX_USE_PVTPackage CompositionalMultiphaseFluidPVTPackage, #endif diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp index 6f3db3ca97f..e911cc5260e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp @@ -63,6 +63,8 @@ struct MultiFluidVarSlice internal::ArraySliceOrRef< T, DIM, USD > value; /// variable value internal::ArraySliceOrRef< T, DIM + 1, USD_DC > derivs; /// derivative w.r.t. pressure, temperature, compositions + + using ValueType = internal::ArraySliceOrRef< T, DIM, USD >; }; /** @@ -87,13 +89,15 @@ struct MultiFluidVarView ArrayView< T, NDIM + 1, USD_DC > const & derivsSrc ): value( valueSrc ), derivs( derivsSrc ) - {}; + {} ArrayView< T, NDIM, USD > value; ///< View into property values ArrayView< T, NDIM + 1, USD_DC > derivs; ///< View into property derivatives w.r.t. pressure, temperature, compositions using SliceType = MultiFluidVarSlice< T, NDIM - 2, USD - 2, USD_DC - 2 >; + using ValueType = ArrayView< T, NDIM, USD >; + GEOS_HOST_DEVICE SliceType operator()( localIndex const k, localIndex const q ) const { @@ -119,6 +123,12 @@ struct MultiFluidVar using SliceType = typename ViewType::SliceType; using SliceTypeConst = typename ViewTypeConst::SliceType; + using ValueType = Array< real64, NDIM, PERM >; + template< int MAXSIZE > + using StackValueType = StackArray< real64, NDIM, MAXSIZE, PERM >; + using ViewValueType = typename ViewType::ValueType; + using SliceValueType = typename SliceType::ValueType; + ViewType toView() { return { value.toView(), derivs.toView() }; diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp index ebee0639d42..b77ee54e653 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp @@ -61,6 +61,11 @@ PVTDriver::PVTDriver( const string & name, setInputFlag( InputFlags::REQUIRED ). setDescription( "Function controlling temperature time history" ); + registerWrapper( viewKeyStruct::outputMassDensityString(), &m_outputMassDensity ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 0 ). + setDescription( "Flag to indicate that the mass density of each phase should be output" ); + registerWrapper( viewKeyStruct::outputCompressibilityString(), &m_outputCompressibility ). setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( 0 ). @@ -90,6 +95,10 @@ PVTDriver::PVTDriver( const string & name, void PVTDriver::postProcessInput() { // Validate some inputs + GEOS_ERROR_IF( m_outputMassDensity != 0 && m_outputMassDensity != 1, + getWrapperDataContext( viewKeyStruct::outputMassDensityString() ) << + ": option can be either 0 (false) or 1 (true)" ); + GEOS_ERROR_IF( m_outputCompressibility != 0 && m_outputCompressibility != 1, getWrapperDataContext( viewKeyStruct::outputCompressibilityString() ) << ": option can be either 0 (false) or 1 (true)" ); @@ -112,6 +121,12 @@ void PVTDriver::postProcessInput() // Default column order = time, pressure, temp, totalDensity, phaseFraction_{1:NP}, phaseDensity_{1:NP}, phaseViscosity_{1:NP} integer numCols = 3*m_numPhases+4; + // If the mass density is requested then add NP columns + if( m_outputMassDensity != 0 ) + { + numCols += m_numPhases; + } + // If the total compressibility is requested then add a column if( m_outputCompressibility != 0 ) { @@ -185,6 +200,7 @@ bool PVTDriver::execute( real64 const GEOS_UNUSED_PARAM( time_n ), GEOS_LOG_RANK_0( " Steps .................. " << m_numSteps ); GEOS_LOG_RANK_0( " Output ................. " << m_outputFile ); GEOS_LOG_RANK_0( " Baseline ............... " << m_baselineFile ); + GEOS_LOG_RANK_0( " Output Mass Density .... " << m_outputMassDensity ); GEOS_LOG_RANK_0( " Output Compressibility . " << m_outputCompressibility ); GEOS_LOG_RANK_0( " Output Phase Comp. ..... " << m_outputPhaseComposition ); } @@ -248,6 +264,11 @@ void PVTDriver::outputResults() columnIndex += m_numPhases; fprintf( fp, "# columns %d-%d = phase densities\n", columnIndex+1, columnIndex + m_numPhases ); columnIndex += m_numPhases; + if( m_outputMassDensity != 0 ) + { + fprintf( fp, "# columns %d-%d = phase mass densities\n", columnIndex+1, columnIndex + m_numPhases ); + columnIndex += m_numPhases; + } fprintf( fp, "# columns %d-%d = phase viscosities\n", columnIndex+1, columnIndex + m_numPhases ); columnIndex += m_numPhases; diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp index ed1c763571c..c81814ac5fd 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp @@ -90,6 +90,7 @@ class PVTDriver : public TaskBase constexpr static char const * outputString() { return "output"; } constexpr static char const * baselineString() { return "baseline"; } constexpr static char const * feedString() { return "feedComposition"; } + constexpr static char const * outputMassDensityString() { return "outputMassDensity"; } constexpr static char const * outputCompressibilityString() { return "outputCompressibility"; } constexpr static char const * outputPhaseCompositionString() { return "outputPhaseComposition"; } }; @@ -102,6 +103,7 @@ class PVTDriver : public TaskBase string m_pressureFunctionName; ///< Time-dependent function controlling pressure string m_temperatureFunctionName; ///< Time-dependent function controlling temperature string m_outputFile; ///< Output file (optional, no output if not specified) + integer m_outputMassDensity{0}; ///< Flag to indicate that the mass density of each phase should be output integer m_outputCompressibility{0}; ///< Flag to indicate that the total compressibility should be output integer m_outputPhaseComposition{0}; ///< Flag to indicate that phase compositions should be output diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp index da522d27913..8035817461c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp @@ -63,17 +63,23 @@ void PVTDriver::runTest( FLUID_TYPE & fluid, arrayView2d< real64 > const & table // perform fluid update using table (P,T) and save resulting total density, etc. // note: column indexing should be kept consistent with output file header below. + bool const outputMassDensity = (m_outputMassDensity != 0); + bool const outputCompressibility = (m_outputCompressibility != 0); + bool const outputPhaseComposition = (m_outputPhaseComposition != 0); + integer const numSteps = m_numSteps; - integer const outputCompressibility = m_outputCompressibility; - integer const outputPhaseComposition = m_outputPhaseComposition; using ExecPolicy = typename FLUID_TYPE::exec_policy; forAll< ExecPolicy >( composition.size( 0 ), - [ outputCompressibility, outputPhaseComposition, numPhases, numComponents, numSteps, kernelWrapper, - table, composition] + [outputMassDensity, outputCompressibility, outputPhaseComposition, + numPhases, numComponents, numSteps, kernelWrapper, + table, composition] GEOS_HOST_DEVICE ( localIndex const i ) { // Index for start of phase properties - integer const PHASE = outputCompressibility != 0 ? TEMP + 3 : TEMP + 2; + integer const PHASE_FRACTION = outputCompressibility ? TEMP + 3 : TEMP + 2; + integer const PHASE_DENSITY = PHASE_FRACTION + numPhases; + integer const PHASE_VISCOSITY = outputMassDensity ? PHASE_DENSITY + 2*numPhases : PHASE_DENSITY + numPhases; + integer const PHASE_COMP = PHASE_VISCOSITY + numPhases; // Temporary space for phase mole fractions stackArray1d< real64, constitutive::MultiFluidBase::MAX_NUM_COMPONENTS > phaseComposition( numComponents ); @@ -83,22 +89,29 @@ void PVTDriver::runTest( FLUID_TYPE & fluid, arrayView2d< real64 > const & table kernelWrapper.update( i, 0, table( n, PRES ), table( n, TEMP ), composition[i] ); table( n, TEMP + 1 ) = kernelWrapper.totalDensity()( i, 0 ); - if( outputCompressibility != 0 ) + if( outputCompressibility ) { table( n, TEMP + 2 ) = kernelWrapper.totalCompressibility( i, 0 ); } for( integer p = 0; p < numPhases; ++p ) { - table( n, PHASE + p ) = kernelWrapper.phaseFraction()( i, 0, p ); - table( n, PHASE + p + numPhases ) = kernelWrapper.phaseDensity()( i, 0, p ); - table( n, PHASE + p + 2 * numPhases ) = kernelWrapper.phaseViscosity()( i, 0, p ); + table( n, PHASE_FRACTION + p ) = kernelWrapper.phaseFraction()( i, 0, p ); + table( n, PHASE_DENSITY + p ) = kernelWrapper.phaseDensity()( i, 0, p ); + table( n, PHASE_VISCOSITY + p ) = kernelWrapper.phaseViscosity()( i, 0, p ); + } + if( outputMassDensity ) + { + for( integer p = 0; p < numPhases; ++p ) + { + table( n, PHASE_DENSITY + numPhases + p ) = kernelWrapper.phaseMassDensity()( i, 0, p ); + } } - if( outputPhaseComposition != 0 ) + if( outputPhaseComposition ) { for( integer p = 0; p < numPhases; ++p ) { - integer const compStartIndex = PHASE + 3 * numPhases + p * numComponents; + integer const compStartIndex = PHASE_COMP + p * numComponents; kernelWrapper.phaseCompMoleFraction( i, 0, p, phaseComposition ); for( integer ic = 0; ic < numComponents; ++ic ) diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp index 9f9ec01ffbb..ac083badbd2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp @@ -19,11 +19,26 @@ #include "CompositionalMultiphaseFluid.hpp" #include "constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp" +#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" #include "codingUtilities/Utilities.hpp" namespace geos { +namespace fields +{ +namespace multifluid +{ +DECLARE_FIELD( kValues, + "kValues", + array4dLayoutPhaseComp, + 0, + NOPLOT, + WRITE_AND_READ, + "Phase equilibrium ratios" ); +} +} + namespace constitutive { @@ -61,6 +76,8 @@ CompositionalMultiphaseFluid( string const & name, Group * const parent ) registerWrapper( viewKeyStruct::componentBinaryCoeffString(), &m_componentBinaryCoeff ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Table of binary interaction coefficients" ); + + registerField( fields::multifluid::kValues{}, &m_kValues ); } template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > @@ -81,12 +98,22 @@ template<> struct PhaseName< 3 > { static constexpr char const * catalogName() { template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > string CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::catalogName() { - return GEOS_FMT( "Compositonal{}Fluid{}{}", + return GEOS_FMT( "Compositional{}Fluid{}{}", compositional::PhaseName< FLASH::KernelWrapper::getNumberOfPhases() >::catalogName(), FLASH::catalogName(), PHASE1::Viscosity::catalogName() ); } +template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > +void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) +{ + MultiFluidBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); + + // Zero k-Values to force initialisation with Wilson k-Values + m_kValues.zero(); +} + template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::postProcessInput() { @@ -133,6 +160,30 @@ void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::postProcessI m_componentBinaryCoeff.zero(); } checkInputSize( m_componentBinaryCoeff, NC * NC, viewKeyStruct::componentBinaryCoeffString() ); + + // Binary interaction coefficients should be symmetric and have zero diagonal + GEOS_THROW_IF_NE_MSG( m_componentBinaryCoeff.size( 0 ), NC, + GEOS_FMT( "{}: invalid number of values in attribute '{}'", getFullName(), viewKeyStruct::componentBinaryCoeffString() ), + InputError ); + GEOS_THROW_IF_NE_MSG( m_componentBinaryCoeff.size( 1 ), NC, + GEOS_FMT( "{}: invalid number of values in attribute '{}'", getFullName(), viewKeyStruct::componentBinaryCoeffString() ), + InputError ); + for( integer ic = 0; ic < NC; ++ic ) + { + GEOS_THROW_IF_GT_MSG( LvArray::math::abs( m_componentBinaryCoeff( ic, ic )), MultiFluidConstants::epsilon, + GEOS_FMT( "{}: {} entry at ({},{}) is {}: should be zero", getFullName(), viewKeyStruct::componentBinaryCoeffString(), + ic, ic, m_componentBinaryCoeff( ic, ic ) ), + InputError ); + for( integer jc = ic + 1; jc < NC; ++jc ) + { + real64 const difference = LvArray::math::abs( m_componentBinaryCoeff( ic, jc )-m_componentBinaryCoeff( jc, ic )); + GEOS_THROW_IF_GT_MSG( difference, MultiFluidConstants::epsilon, + GEOS_FMT( "{}: {} entry at ({},{}) is {} and is different from entry at ({},{}) which is {}", + getFullName(), viewKeyStruct::componentBinaryCoeffString(), + ic, jc, m_componentBinaryCoeff( ic, jc ), jc, ic, m_componentBinaryCoeff( jc, ic ) ), + InputError ); + } + } } template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > @@ -144,6 +195,14 @@ void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::initializePo createModels(); } +template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > +void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::resizeFields( localIndex const size, localIndex const numPts ) +{ + MultiFluidBase::resizeFields( size, numPts ); + + m_kValues.resize( size, numPts, numFluidPhases()-1, numFluidComponents() ); +} + template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > std::unique_ptr< ConstitutiveBase > CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::deliverClone( string const & name, @@ -157,7 +216,6 @@ template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > typename CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::KernelWrapper CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createKernelWrapper() { - //auto phaseModels = std::make_tuple((m_phases)...); return KernelWrapper( *m_componentProperties, *m_flash, *m_phase1, @@ -172,7 +230,8 @@ CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createKernelWrapp m_phaseEnthalpy.toView(), m_phaseInternalEnergy.toView(), m_phaseCompFraction.toView(), - m_totalDensity.toView() ); + m_totalDensity.toView(), + m_kValues.toView() ); } // Create the fluid models @@ -218,12 +277,20 @@ void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::calculateCri // Explicit instantiation of the model template. template class CompositionalMultiphaseFluid< compositional::NegativeTwoPhaseFlashPRPR, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel > >; + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel > >; +template class CompositionalMultiphaseFluid< + compositional::NegativeTwoPhaseFlashSRKSRK, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel > >; +template class CompositionalMultiphaseFluid< + compositional::NegativeTwoPhaseFlashPRPR, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; template class CompositionalMultiphaseFluid< compositional::NegativeTwoPhaseFlashSRKSRK, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel > >; + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; REGISTER_CATALOG_ENTRY( ConstitutiveBase, CompositionalTwoPhasePengRobinsonConstantViscosity, @@ -235,6 +302,16 @@ REGISTER_CATALOG_ENTRY( ConstitutiveBase, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( ConstitutiveBase, + CompositionalTwoPhasePengRobinsonLBCViscosity, + string const &, + dataRepository::Group * const ) + +REGISTER_CATALOG_ENTRY( ConstitutiveBase, + CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, + string const &, + dataRepository::Group * const ) + } // namespace constitutive } // namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp index 2f2ddf4a790..57cbe7e7919 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp @@ -22,6 +22,7 @@ #include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp" #include "constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp" #include "constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp" +#include "constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp" #include "constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp" #include "constitutive/fluid/multifluid/compositional/models/NullModel.hpp" #include "constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp" @@ -77,6 +78,9 @@ class CompositionalMultiphaseFluid : public MultiFluidBase GEOS_UNUSED_VAR( pressure, temperature ); } + virtual void allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) override; + virtual integer getWaterPhaseIndex() const override final; struct viewKeyStruct : MultiFluidBase::viewKeyStruct @@ -104,6 +108,8 @@ class CompositionalMultiphaseFluid : public MultiFluidBase virtual void initializePostSubGroups() override; + virtual void resizeFields( localIndex const size, localIndex const numPts ) override; + private: /** * @brief Estimate critical volumes using Ihmels' (2010) correlation @@ -137,16 +143,27 @@ class CompositionalMultiphaseFluid : public MultiFluidBase array1d< real64 > m_componentAcentricFactor; array1d< real64 > m_componentVolumeShift; array2d< real64 > m_componentBinaryCoeff; + + // backup data + PhaseComp::ValueType m_kValues; }; -using CompositionalTwoPhasePengRobinsonConstantViscosity = CompositionalMultiphaseFluid< +using CompositionalTwoPhasePengRobinsonConstantViscosity = CompositionalMultiphaseFluid< + compositional::NegativeTwoPhaseFlashPRPR, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel > >; +using CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity = CompositionalMultiphaseFluid< + compositional::NegativeTwoPhaseFlashSRKSRK, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel > >; +using CompositionalTwoPhasePengRobinsonLBCViscosity = CompositionalMultiphaseFluid< compositional::NegativeTwoPhaseFlashPRPR, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel > >; -using CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity = CompositionalMultiphaseFluid< + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; +using CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity = CompositionalMultiphaseFluid< compositional::NegativeTwoPhaseFlashSRKSRK, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel > >; + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; } /* namespace constitutive */ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp index 2a6faab23b4..17948157954 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp @@ -45,6 +45,10 @@ CompositionalMultiphaseFluidPVTPackage::CompositionalMultiphaseFluidPVTPackage( setInputFlag( InputFlags::REQUIRED ). setDescription( "List of equation of state types for each phase" ); + registerWrapper( viewKeyStruct::constantPhaseViscosityString(), &m_constantPhaseViscosity ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Viscosity for each phase" ); + registerWrapper( viewKeyStruct::componentCriticalPressureString(), &m_componentCriticalPressure ). setInputFlag( InputFlags::REQUIRED ). setDescription( "Component critical pressures" ); @@ -104,7 +108,16 @@ void CompositionalMultiphaseFluidPVTPackage::postProcessInput() checkInputSize( m_componentCriticalPressure, NC, viewKeyStruct::componentCriticalPressureString() ); checkInputSize( m_componentCriticalTemperature, NC, viewKeyStruct::componentCriticalTemperatureString() ); checkInputSize( m_componentAcentricFactor, NC, viewKeyStruct::componentAcentricFactorString() ); - checkInputSize( m_equationsOfState, NP, viewKeyStruct::equationsOfStateString() ); + + if( m_constantPhaseViscosity.empty() ) + { + m_constantPhaseViscosity.resize( NP ); + for( integer ip = 0; ip < NP; ++ip ) + { + m_constantPhaseViscosity[ip] = 0.001; // Default value = 1 cP + } + } + checkInputSize( m_constantPhaseViscosity, NP, viewKeyStruct::constantPhaseViscosityString() ); if( m_componentVolumeShift.empty() ) { @@ -167,6 +180,7 @@ CompositionalMultiphaseFluidPVTPackage::deliverClone( string const & name, CompositionalMultiphaseFluidPVTPackage::KernelWrapper:: KernelWrapper( pvt::MultiphaseSystem & fluid, arrayView1d< pvt::PHASE_TYPE > const & phaseTypes, + arrayView1d< geos::real64 const > const & constantPhaseViscosity, arrayView1d< geos::real64 const > const & componentMolarWeight, bool useMass, PhaseProp::ViewType phaseFraction, @@ -188,7 +202,8 @@ CompositionalMultiphaseFluidPVTPackage::KernelWrapper:: std::move( phaseCompFraction ), std::move( totalDensity ) ), m_fluid( fluid ), - m_phaseTypes( phaseTypes ) + m_phaseTypes( phaseTypes ), + m_constantPhaseViscosity( constantPhaseViscosity ) {} CompositionalMultiphaseFluidPVTPackage::KernelWrapper @@ -196,6 +211,7 @@ CompositionalMultiphaseFluidPVTPackage::createKernelWrapper() { return KernelWrapper( *m_fluid, m_phaseTypes, + m_constantPhaseViscosity, m_componentMolarWeight, m_useMass, m_phaseFraction.toView(), diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp index 1be5e7ccd4a..32c4af5957c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp @@ -64,6 +64,7 @@ class CompositionalMultiphaseFluidPVTPackage : public MultiFluidBase static constexpr char const * componentAcentricFactorString() { return "componentAcentricFactor"; } static constexpr char const * componentVolumeShiftString() { return "componentVolumeShift"; } static constexpr char const * componentBinaryCoeffString() { return "componentBinaryCoeff"; } + static constexpr char const * constantPhaseViscosityString() { return "constantPhaseViscosity"; } }; /** @@ -98,6 +99,7 @@ class CompositionalMultiphaseFluidPVTPackage : public MultiFluidBase KernelWrapper( pvt::MultiphaseSystem & fluid, arrayView1d< pvt::PHASE_TYPE > const & phaseTypes, + arrayView1d< real64 const > const & constantPhaseViscosity, arrayView1d< real64 const > const & componentMolarWeight, bool const useMass, PhaseProp::ViewType phaseFraction, @@ -112,6 +114,7 @@ class CompositionalMultiphaseFluidPVTPackage : public MultiFluidBase pvt::MultiphaseSystem & m_fluid; arrayView1d< pvt::PHASE_TYPE > m_phaseTypes; + arrayView1d< real64 const > m_constantPhaseViscosity; }; /** @@ -139,6 +142,9 @@ class CompositionalMultiphaseFluidPVTPackage : public MultiFluidBase // names of equations of state to use for each phase string_array m_equationsOfState; + // Phase viscosity + array1d< real64 > m_constantPhaseViscosity; + // standard EOS component input array1d< real64 > m_componentCriticalPressure; array1d< real64 > m_componentCriticalTemperature; @@ -239,7 +245,7 @@ CompositionalMultiphaseFluidPVTPackage::KernelWrapper:: phaseMassDensity.derivs[ip][Deriv::dT] = massDens.dT; // TODO - phaseViscosity.value[ip] = 0.001; + phaseViscosity.value[ip] = m_constantPhaseViscosity[ip]; phaseViscosity.derivs[ip][Deriv::dP] = 0.0; phaseViscosity.derivs[ip][Deriv::dT] = 0.0; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp index 3ccefa5bb16..73f2d4495a8 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp @@ -54,7 +54,8 @@ class CompositionalMultiphaseFluidUpdates final : public MultiFluidBase::KernelW MultiFluidBase::PhaseProp::ViewType phaseEnthalpy, MultiFluidBase::PhaseProp::ViewType phaseInternalEnergy, MultiFluidBase::PhaseComp::ViewType phaseCompFrac, - MultiFluidBase::FluidProp::ViewType totalDensity ); + MultiFluidBase::FluidProp::ViewType totalDensity, + MultiFluidBase::PhaseComp::ViewValueType kValues ); GEOS_HOST_DEVICE virtual void compute( real64 const pressure, @@ -76,6 +77,43 @@ class CompositionalMultiphaseFluidUpdates final : public MultiFluidBase::KernelW real64 const temperature, arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & composition ) const override; +protected: + GEOS_HOST_DEVICE + void compute( real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & composition, + MultiFluidBase::PhaseProp::SliceType const phaseFrac, + MultiFluidBase::PhaseProp::SliceType const phaseDens, + MultiFluidBase::PhaseProp::SliceType const phaseMassDensity, + MultiFluidBase::PhaseProp::SliceType const phaseVisc, + MultiFluidBase::PhaseProp::SliceType const phaseEnthalpy, + MultiFluidBase::PhaseProp::SliceType const phaseInternalEnergy, + MultiFluidBase::PhaseComp::SliceType const phaseCompFrac, + MultiFluidBase::FluidProp::SliceType const totalDensity, + MultiFluidBase::PhaseComp::SliceType::ValueType const & kValues ) const; + + /** + * @brief Convert derivatives from phase mole fraction to total mole fraction + * @details Given property derivatives @c dProperty where composition derivatives are with + * respect to a phase compositions, this will transform that properties so that + * they the composition derivatives are with respect to total composition. The derivatives + * of the phase composition should be provided in @c dPhaseComposition. + * @param[in] numComps The number of components + * @param[in] dPhaseComposition Derivatives of the phase composition + * @param[in,out] dProperty The derivatives of the property + * @param[in] workSpace Temporary workspace + */ + template< int USD1, int USD2 > + GEOS_HOST_DEVICE + static void convertDerivativesToTotalMoleFraction( integer const numComps, + arraySlice2d< real64 const, USD1 > const & dPhaseComposition, + arraySlice1d< real64, USD2 > const & dProperty, + arraySlice1d< real64 > const & workSpace ); + + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void setZero( real64 & val ){ val = 0.0; } + private: // The component properties compositional::ComponentProperties::KernelWrapper m_componentProperties; @@ -87,6 +125,9 @@ class CompositionalMultiphaseFluidUpdates final : public MultiFluidBase::KernelW typename PHASE1::KernelWrapper m_phase1; typename PHASE2::KernelWrapper m_phase2; typename PHASE3::KernelWrapper m_phase3; + + // Backup variables + MultiFluidBase::PhaseComp::ViewValueType m_kValues; }; template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > @@ -105,7 +146,8 @@ CompositionalMultiphaseFluidUpdates( compositional::ComponentProperties const & MultiFluidBase::PhaseProp::ViewType phaseEnthalpy, MultiFluidBase::PhaseProp::ViewType phaseInternalEnergy, MultiFluidBase::PhaseComp::ViewType phaseCompFrac, - MultiFluidBase::FluidProp::ViewType totalDensity ): + MultiFluidBase::FluidProp::ViewType totalDensity, + MultiFluidBase::PhaseComp::ViewValueType kValues ): MultiFluidBase::KernelWrapper( componentMolarWeight, useMass, std::move( phaseFrac ), @@ -120,7 +162,8 @@ CompositionalMultiphaseFluidUpdates( compositional::ComponentProperties const & m_flash( flash.createKernelWrapper() ), m_phase1( phase1.createKernelWrapper() ), m_phase2( phase2.createKernelWrapper() ), - m_phase3( phase3.createKernelWrapper() ) + m_phase3( phase3.createKernelWrapper() ), + m_kValues( kValues ) {} template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > @@ -140,14 +183,50 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( MultiFluidBase::PhaseComp::SliceType const phaseCompFrac, MultiFluidBase::FluidProp::SliceType const totalDensity ) const { - GEOS_UNUSED_VAR( phaseEnthalpy, phaseInternalEnergy ); + integer constexpr maxNumComp = MultiFluidBase::MAX_NUM_COMPONENTS; + integer constexpr maxNumPhase = MultiFluidBase::MAX_NUM_PHASES - 1; + MultiFluidBase::PhaseComp::StackValueType< maxNumPhase *maxNumComp > kValues( 1, 1, numPhases() - 1, numComponents() ); - using Deriv = multifluid::DerivativeOffset; + LvArray::forValuesInSlice( kValues[0][0], setZero ); // Force initialisation of k-Values + + compute( pressure, + temperature, + composition, + phaseFrac, + phaseDens, + phaseMassDensity, + phaseVisc, + phaseEnthalpy, + phaseInternalEnergy, + phaseCompFrac, + totalDensity, + kValues[0][0] ); +} +template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +void +CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & composition, + MultiFluidBase::PhaseProp::SliceType const phaseFrac, + MultiFluidBase::PhaseProp::SliceType const phaseDens, + MultiFluidBase::PhaseProp::SliceType const phaseMassDensity, + MultiFluidBase::PhaseProp::SliceType const phaseVisc, + MultiFluidBase::PhaseProp::SliceType const phaseEnthalpy, + MultiFluidBase::PhaseProp::SliceType const phaseInternalEnergy, + MultiFluidBase::PhaseComp::SliceType const phaseCompFrac, + MultiFluidBase::FluidProp::SliceType const totalDensity, + MultiFluidBase::PhaseComp::SliceType::ValueType const & kValues ) const +{ integer constexpr maxNumComp = MultiFluidBase::MAX_NUM_COMPONENTS; + integer constexpr maxNumDof = MultiFluidBase::MAX_NUM_COMPONENTS + 2; integer constexpr maxNumPhase = MultiFluidBase::MAX_NUM_PHASES; integer const numComp = numComponents(); integer const numPhase = numPhases(); + integer const numDof = numComp + 2; // 1. Convert input mass fractions to mole fractions and keep derivatives @@ -174,6 +253,7 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, compMoleFrac.toSliceConst(), + kValues, phaseFrac, phaseCompFrac ); @@ -182,7 +262,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[0].toSliceConst(), - phaseCompFrac.derivs[0].toSliceConst(), phaseDens.value[0], phaseDens.derivs[0], phaseMassDensity.value[0], @@ -192,7 +271,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[1].toSliceConst(), - phaseCompFrac.derivs[1].toSliceConst(), phaseDens.value[1], phaseDens.derivs[1], phaseMassDensity.value[1], @@ -204,7 +282,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[2].toSliceConst(), - phaseCompFrac.derivs[2].toSliceConst(), phaseDens.value[2], phaseDens.derivs[2], phaseMassDensity.value[2], @@ -217,7 +294,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[0].toSliceConst(), - phaseCompFrac.derivs[0].toSliceConst(), phaseMassDensity.value[0], phaseMassDensity.derivs[0].toSliceConst(), phaseVisc.value[0], @@ -227,7 +303,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[1].toSliceConst(), - phaseCompFrac.derivs[1].toSliceConst(), phaseMassDensity.value[1], phaseMassDensity.derivs[1].toSliceConst(), phaseVisc.value[1], @@ -239,7 +314,6 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( pressure, temperature, phaseCompFrac.value[2].toSliceConst(), - phaseCompFrac.derivs[2].toSliceConst(), phaseMassDensity.value[2], phaseMassDensity.derivs[2].toSliceConst(), phaseVisc.value[2], @@ -247,23 +321,52 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( m_useMass ); } - // 5. if mass variables used instead of molar, perform the conversion + // 5. Convert derivatives from phase composition to total composition + stackArray1d< real64, maxNumDof > workSpace( numDof ); + for( integer ip = 0; ip < FLASH::KernelWrapper::getNumberOfPhases(); ++ip ) + { + convertDerivativesToTotalMoleFraction( numComp, + phaseCompFrac.derivs[ip].toSliceConst(), + phaseDens.derivs[ip], + workSpace ); + convertDerivativesToTotalMoleFraction( numComp, + phaseCompFrac.derivs[ip].toSliceConst(), + phaseMassDensity.derivs[ip], + workSpace ); + convertDerivativesToTotalMoleFraction( numComp, + phaseCompFrac.derivs[ip].toSliceConst(), + phaseVisc.derivs[ip], + workSpace ); + } + + // 6. if mass variables used instead of molar, perform the conversion if( m_useMass ) { real64 phaseMolecularWeight[maxNumPhase]{}; real64 dPhaseMolecularWeight[maxNumPhase][maxNumComp+2]{}; + arrayView1d< real64 const > const & componentMolarWeight = m_componentProperties.m_componentMolarWeight; + for( integer ip = 0; ip < numPhase; ++ip ) { - phaseMolecularWeight[ip] = 1.0; - dPhaseMolecularWeight[ip][Deriv::dP] = 0.0; - dPhaseMolecularWeight[ip][Deriv::dT] = 0.0; + phaseMolecularWeight[ip] = 0.0; + for( integer kc = 0; kc < numDof; ++kc ) + { + dPhaseMolecularWeight[ip][kc] = 0.0; + } + + auto const & phaseComposition = phaseCompFrac.value[ip].toSliceConst(); + auto const & dPhaseComposition = phaseCompFrac.derivs[ip].toSliceConst(); + for( integer ic = 0; ic < numComp; ++ic ) { - dPhaseMolecularWeight[ip][Deriv::dC+ic] = 0.0; + phaseMolecularWeight[ip] += phaseComposition[ic] * componentMolarWeight[ic]; + for( integer kc = 0; kc < numDof; ++kc ) + { + dPhaseMolecularWeight[ip][kc] += dPhaseComposition( ic, kc ) * componentMolarWeight[ic]; + } } } - convertToMassFractions( dCompMoleFrac_dCompMassFrac, phaseMolecularWeight, dPhaseMolecularWeight, @@ -275,7 +378,7 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( phaseInternalEnergy.derivs ); } - // 6. Compute total fluid mass/molar density and derivatives + // 7. Compute total fluid mass/molar density and derivatives computeTotalDensity( phaseFrac, phaseDens, @@ -303,7 +406,37 @@ update( localIndex const k, m_phaseEnthalpy( k, q ), m_phaseInternalEnergy( k, q ), m_phaseCompFraction( k, q ), - m_totalDensity( k, q ) ); + m_totalDensity( k, q ), + m_kValues[k][q] ); +} + +template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > +template< int USD1, int USD2 > +GEOS_HOST_DEVICE +void +CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >:: +convertDerivativesToTotalMoleFraction( integer const numComps, + arraySlice2d< real64 const, USD1 > const & dPhaseComposition, + arraySlice1d< real64, USD2 > const & dProperty, + arraySlice1d< real64 > const & workSpace ) +{ + using Deriv = multifluid::DerivativeOffset; + integer const numDofs = numComps + 2; + for( integer kc = 0; kc < numDofs; ++kc ) + { + workSpace[kc] = dProperty[kc]; + } + for( integer ic = 0; ic < numComps; ++ic ) + { + dProperty[Deriv::dC+ic] = 0.0; + } + for( integer kc = 0; kc < numDofs; ++kc ) + { + for( integer ic = 0; ic < numComps; ++ic ) + { + dProperty[kc] += (dPhaseComposition( ic, kc ) * workSpace[Deriv::dC+ic]); + } + } } } /* namespace constitutive */ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp index d1c69c43ca1..5f48a008cfc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp @@ -17,18 +17,9 @@ */ #include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" -#ifdef GEOSX_USE_PVTPackage #include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp" -#endif -#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" namespace geos { -#ifdef GEOSX_USE_PVTPackage template void PVTDriver::runTest< constitutive::CompositionalMultiphaseFluidPVTPackage >( constitutive::CompositionalMultiphaseFluidPVTPackage &, arrayView2d< real64 > const & ); -#endif -template void PVTDriver::runTest< constitutive::CompositionalTwoPhasePengRobinsonConstantViscosity >( - constitutive::CompositionalTwoPhasePengRobinsonConstantViscosity &, arrayView2d< real64 > const & ); -template void PVTDriver::runTest< constitutive::CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity >( - constitutive::CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity &, arrayView2d< real64 > const & ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp new file mode 100644 index 00000000000..eec79c6c150 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp @@ -0,0 +1,26 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * PVTDriverRunTestCompositionalPR.cpp + */ + +#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" + +namespace geos +{ +template void PVTDriver::runTest< constitutive::CompositionalTwoPhasePengRobinsonConstantViscosity >( + constitutive::CompositionalTwoPhasePengRobinsonConstantViscosity &, arrayView2d< real64 > const & ); +} diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp new file mode 100644 index 00000000000..449d4459c57 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp @@ -0,0 +1,26 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * PVTDriverRunTestCompositionalPRLBC.cpp + */ + +#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" + +namespace geos +{ +template void PVTDriver::runTest< constitutive::CompositionalTwoPhasePengRobinsonLBCViscosity >( + constitutive::CompositionalTwoPhasePengRobinsonLBCViscosity &, arrayView2d< real64 > const & ); +} diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp new file mode 100644 index 00000000000..edcfd2af4f5 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp @@ -0,0 +1,26 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * PVTDriverRunTestCompositionalSRK.cpp + */ + +#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" + +namespace geos +{ +template void PVTDriver::runTest< constitutive::CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity >( + constitutive::CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity &, arrayView2d< real64 > const & ); +} diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp new file mode 100644 index 00000000000..1ab0ab8b15f --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp @@ -0,0 +1,26 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * PVTDriverRunTestCompositionalSRKLBC.cpp + */ + +#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" + +namespace geos +{ +template void PVTDriver::runTest< constitutive::CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity >( + constitutive::CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity &, arrayView2d< real64 > const & ); +} diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp index 84f886df626..3f2d3d45c88 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp @@ -20,6 +20,7 @@ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_COMPOSITIONALPROPERTIES_HPP_ #include "common/DataTypes.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" namespace geos { @@ -32,97 +33,51 @@ namespace compositional struct CompositionalProperties { + using Deriv = geos::constitutive::multifluid::DerivativeOffset; public: /** - * @brief Compute the molar density of a mixture from the composition and the compressibility factor + * @brief Compute the molar density and derivatives * @param[in] numComps number of components * @param[in] pressure pressure * @param[in] temperature temperature * @param[in] composition composition of the mixture * @param[in] volumeShift dimensional volume shift parameters * @param[in] compressibilityFactor compressibility factor (z-factor) + * @param[in] compressibilityFactorDerivs derivatives of the compressibility factor (z-factor) * @param[out] molarDensity the calculated molar density - * @note The volume shifts can result in a negative molar density which will be truncated to zero + * @param[out] molarDensityDerivs derivatives of the molar density */ + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE static void computeMolarDensity( integer const numComps, real64 const pressure, real64 const temperature, - arraySlice1d< real64 const > const & composition, + arraySlice1d< real64 const, USD1 > const & composition, arraySlice1d< real64 const > const & volumeShift, real64 const compressibilityFactor, - real64 & molarDensity ); + arraySlice1d< real64 const > const & compressibilityFactorDerivs, + real64 & molarDensity, + arraySlice1d< real64, USD2 > const & molarDensityDerivs ); /** - * @brief Compute the molar density derivatives - * @param[in] numComps number of components - * @param[in] pressure pressure - * @param[in] temperature temperature - * @param[in] composition composition of the mixture - * @param[in] volumeShift dimensional volume shift parameters - * @param[in] compressibilityFactor compressibility factor (z-factor) - * @param[in] dCompressibilityFactor_dp derivative of the compressibility factor (z-factor) wrt pressure - * @param[in] dCompressibilityFactor_dp derivative of the compressibility factor (z-factor) wrt temperature - * @param[in] dCompressibilityFactor_dz derivative of the compressibility factor (z-factor) wrt composition - * @param[in] molarDensity the calculated molar density - * @param[out] dMolarDensity_dp derivative of the molar density wrt pressure - * @param[out] dMolarDensity_dt derivative of the molar density wrt temperature - * @param[out] dMolarDensity_dz derivative of the molar density wrt composition - */ - GEOS_HOST_DEVICE - static void computeMolarDensity( integer const numComps, - real64 const pressure, - real64 const temperature, - arraySlice1d< real64 const > const & composition, - arraySlice1d< real64 const > const & volumeShift, - real64 const compressibilityFactor, - real64 const dCompressibilityFactor_dp, - real64 const dCompressibilityFactor_dt, - arraySlice1d< real64 const > const & dCompressibilityFactor_dz, - real64 const molarDensity, - real64 & dMolarDensity_dp, - real64 & dMolarDensity_dt, - arraySlice1d< real64 > const & dMolarDensity_dz ); - - /** - * @brief Compute the mass density of a mixture from the composition and the molar density + * @brief Compute the mass density and derivatives * @param[in] numComps number of components * @param[in] composition composition of the mixture * @param[in] molecularWeight the component molecular weights * @param[in] molarDensity the mixture molar density - * @param[out] massDensity the calculated mass density + * @param[in] molarDensityDerivs derivatives of the molar density + * @param[out] massDensity mass density + * @param[out] massDensityDerivs derivatives of the mass density */ + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE static void computeMassDensity( integer const numComps, - arraySlice1d< real64 const > const & composition, + arraySlice1d< real64 const, USD1 > const & composition, arraySlice1d< real64 const > const & molecularWeight, real64 const molarDensity, - real64 & massDensity ); - - /** - * @brief Compute the mass density derivatives - * @param[in] numComps number of components - * @param[in] molecularWeight the component molecular weights - * @param[in] molarDensity the mixture molar density - * @param[in] dMolarDensity_dp derivative of the molar density wrt pressure - * @param[in] dMolarDensity_dt derivative of the molar density wrt temperature - * @param[in] dMolarDensity_dz derivative of the molar density wrt composition - * @param[in] massDensity mass density - * @param[out] dMassDensity_dp derivative of the mass density wrt pressure - * @param[out] dMassDensity_dt derivative of the mass density wrt temperature - * @param[out] dMassDensity_dz derivative of the mass density wrt composition - */ - GEOS_HOST_DEVICE - static void computeMassDensity( integer const numComps, - arraySlice1d< real64 const > const & molecularWeight, - real64 const molarDensity, - real64 const dMolarDensity_dp, - real64 const dMolarDensity_dt, - arraySlice1d< real64 const > const dMolarDensity_dz, - real64 const massDensity, - real64 & dMassDensity_dp, - real64 & dMassDensity_dt, - arraySlice1d< real64 > const & dMassDensity_dz ); + arraySlice1d< real64 const, USD2 > const & molarDensityDerivs, + real64 & massDensity, + arraySlice1d< real64, USD2 > const & massDensityDerivs ); }; } //namespace compositional @@ -131,4 +86,7 @@ struct CompositionalProperties } // namespace geos +// Implementation +#include "CompositionalPropertiesImpl.hpp" + #endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_COMPOSITIONALPROPERTIES_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp similarity index 50% rename from src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.cpp rename to src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp index 165801fa177..f602cd70308 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp @@ -13,9 +13,12 @@ */ /** - * @file CompositionalProperties.hpp + * @file CompositionalPropertiesImpl.hpp */ +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_COMPOSITIONALPROPERTIESIMPL_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_COMPOSITIONALPROPERTIESIMPL_HPP_ + #include "CompositionalProperties.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" @@ -34,22 +37,24 @@ namespace compositional * Peneloux, A et al. 1982. Fluid phase equilibria, 8(1):7–23. * https://doi.org/10.1016/0378-3812(82)80002-2 */ +template< integer USD1, integer USD2 > GEOS_HOST_DEVICE void CompositionalProperties::computeMolarDensity( integer const numComps, real64 const pressure, real64 const temperature, - arraySlice1d< real64 const > const & composition, + arraySlice1d< real64 const, USD1 > const & composition, arraySlice1d< real64 const > const & volumeShift, real64 const compressibilityFactor, - real64 & molarDensity ) + arraySlice1d< real64 const > const & compressibilityFactorDerivs, + real64 & molarDensity, + arraySlice1d< real64, USD2 > const & molarDensityDerivs ) { - real64 vEos = constants::gasConstant * temperature * compressibilityFactor / pressure; real64 vCorrected = vEos; for( integer ic = 0; ic < numComps; ++ic ) { - vCorrected += composition[ic] * volumeShift[ic]; + vCorrected -= composition[ic] * volumeShift[ic]; } if( MultiFluidConstants::epsilon < vCorrected ) @@ -59,89 +64,66 @@ void CompositionalProperties::computeMolarDensity( integer const numComps, else { molarDensity = 0.0; - } -} - -GEOS_HOST_DEVICE -void CompositionalProperties::computeMolarDensity( integer const numComps, - real64 const pressure, - real64 const temperature, - arraySlice1d< real64 const > const & GEOS_UNUSED_PARAM ( composition ), - arraySlice1d< real64 const > const & volumeShift, - real64 const compressibilityFactor, - real64 const dCompressibilityFactor_dp, - real64 const dCompressibilityFactor_dt, - arraySlice1d< real64 const > const & dCompressibilityFactor_dz, - real64 const molarDensity, - real64 & dMolarDensity_dp, - real64 & dMolarDensity_dt, - arraySlice1d< real64 > const & dMolarDensity_dz ) -{ - if( molarDensity < MultiFluidConstants::epsilon ) - { - dMolarDensity_dp = 0.0; - dMolarDensity_dt = 0.0; - for( integer ic = 0; ic < numComps; ++ic ) - { - dMolarDensity_dz[ic] = 0.0; - } + auto const setZero = []( real64 & val ){ val = 0.0; }; + LvArray::forValuesInSlice( molarDensityDerivs, setZero ); return; } real64 dvCorrected_dx = 0.0; // Pressure derivative - dvCorrected_dx = constants::gasConstant * temperature * (dCompressibilityFactor_dp - compressibilityFactor / pressure) / pressure; - dMolarDensity_dp = -molarDensity * molarDensity * dvCorrected_dx; + dvCorrected_dx = constants::gasConstant * temperature * (compressibilityFactorDerivs[Deriv::dP] - compressibilityFactor / pressure) / pressure; + molarDensityDerivs[Deriv::dP] = -molarDensity * molarDensity * dvCorrected_dx; // Temperature derivative - dvCorrected_dx = constants::gasConstant * (temperature * dCompressibilityFactor_dt + compressibilityFactor) / pressure; - dMolarDensity_dt = -molarDensity * molarDensity * dvCorrected_dx; + dvCorrected_dx = constants::gasConstant * (temperature * compressibilityFactorDerivs[Deriv::dT] + compressibilityFactor) / pressure; + molarDensityDerivs[Deriv::dT] = -molarDensity * molarDensity * dvCorrected_dx; // Composition derivative for( integer ic = 0; ic < numComps; ++ic ) { - dvCorrected_dx = constants::gasConstant * temperature * dCompressibilityFactor_dz[ic] / pressure + volumeShift[ic]; - dMolarDensity_dz[ic] = -molarDensity * molarDensity * dvCorrected_dx; + integer const kc = Deriv::dC + ic; + dvCorrected_dx = constants::gasConstant * temperature * compressibilityFactorDerivs[kc] / pressure - volumeShift[ic]; + molarDensityDerivs[kc] = -molarDensity * molarDensity * dvCorrected_dx; } } +template< integer USD1, integer USD2 > GEOS_HOST_DEVICE void CompositionalProperties::computeMassDensity( integer const numComps, - arraySlice1d< real64 const > const & composition, + arraySlice1d< real64 const, USD1 > const & composition, arraySlice1d< real64 const > const & molecularWeight, real64 const molarDensity, - real64 & massDensity ) + arraySlice1d< real64 const, USD2 > const & molarDensityDerivs, + real64 & massDensity, + arraySlice1d< real64, USD2 > const & massDensityDerivs ) { massDensity = 0.0; for( integer ic = 0; ic < numComps; ++ic ) { massDensity += molecularWeight[ic] * composition[ic] * molarDensity; } -} -GEOS_HOST_DEVICE -void CompositionalProperties::computeMassDensity( integer const numComps, - arraySlice1d< real64 const > const & molecularWeight, - real64 const molarDensity, - real64 const dMolarDensity_dp, - real64 const dMolarDensity_dt, - arraySlice1d< real64 const > const dMolarDensity_dz, - real64 const massDensity, - real64 & dMassDensity_dp, - real64 & dMassDensity_dt, - arraySlice1d< real64 > const & dMassDensity_dz ) -{ - // Pressure derivative - dMassDensity_dp = massDensity * dMolarDensity_dp / molarDensity; + if( massDensity < MultiFluidConstants::epsilon ) + { + auto const setZero = []( real64 & val ){ val = 0.0; }; + LvArray::forValuesInSlice( massDensityDerivs, setZero ); + return; + } - // Temperature derivative - dMassDensity_dt = massDensity * dMolarDensity_dt / molarDensity; + real64 const oneOverMolarDensity = 1.0 / molarDensity; + + // Pressure and temperature derivatives + for( integer const kc : {Deriv::dP, Deriv::dT} ) + { + massDensityDerivs[kc] = massDensity * molarDensityDerivs[kc] * oneOverMolarDensity; + } // Composition derivative for( integer ic = 0; ic < numComps; ++ic ) { - dMassDensity_dz[ic] = massDensity * dMolarDensity_dz[ic] / molarDensity + molecularWeight[ic] * molarDensity; + integer const kc = Deriv::dC + ic; + massDensityDerivs[kc] = massDensity * molarDensityDerivs[kc] * oneOverMolarDensity + molecularWeight[ic] * molarDensity; } } @@ -150,3 +132,5 @@ void CompositionalProperties::computeMassDensity( integer const numComps, } // namespace constitutive } // namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_COMPOSITIONALPROPERTIESIMPL_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp index 8adfa65457e..d1a53eeb39e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp @@ -21,6 +21,7 @@ #include "common/DataTypes.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp" namespace geos @@ -73,6 +74,7 @@ struct SoaveRedlichKwongEOS template< typename EOS_TYPE > struct CubicEOSPhaseModel { + using Deriv = geos::constitutive::multifluid::DerivativeOffset; public: /** * @brief Generate a catalog name @@ -89,15 +91,121 @@ struct CubicEOSPhaseModel * @param[in] componentProperties The compositional component properties * @param[out] logFugacityCoefficients log of the fugacity coefficients */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void computeLogFugacityCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 > const logFugacityCoefficients ); + arraySlice1d< real64 > const & logFugacityCoefficients ); + + /** + * @brief Secondary entry point of the cubic EOS model + * @details Computes the derivatives of the logarithm of the fugacity coefficients + * @param[in] numComps number of components + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] composition composition of the phase + * @param[in] componentProperties The compositional component properties + * @param[in] logFugacityCoefficients log of the fugacity coefficients + * @param[out] logFugacityCoefficientDerivs derivatives of the log of the fugacity coefficients + */ + template< integer USD > + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void + computeLogFugacityCoefficients( integer const numComps, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64 const > const & logFugacityCoefficients, + arraySlice2d< real64 > const & logFugacityCoefficientDerivs ); + + /** + * @brief Compute compressibility factor for the cubic EOS model + * @details Computes the compressibility factor (z-factor) for the cubic EOS model including derivatives + * @param[in] numComps number of components + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] composition composition of the phase + * @param[in] componentProperties The compositional component properties + * @param[out] compressibilityFactor the current compressibility factor + * @param[out] compressibilityFactorDerivs derivatives of the compressibility factor + */ + template< integer USD > + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void + computeCompressibilityFactor( integer const numComps, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & compressibilityFactor, + arraySlice1d< real64 > const & compressibilityFactorDerivs ); + + /** + * @brief Calculate the dimensional volume shift + * @details Computes the dimensional form of the volume shifts given the user defined non-dimensional form. + * @param[in] numComps The number of components + * @param[in] componentProperties The compositional model properties + * @param[out] dimensionalVolumeShift The calculated dimensional volume shifts + */ + GEOS_FORCE_INLINE + static void calculateDimensionalVolumeShift( ComponentProperties const & componentProperties, + arraySlice1d< real64 > const & dimensionalVolumeShift ); + + /** + * @brief Calculate the pure coefficients + * @details Computes the pure coefficients + * @param[in] ic Component index + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] componentProperties The compositional component properties + * @param[out] aCoefficient pure coefficient (A) + * @param[out] bCoefficient pure coefficient (B) + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void + computePureCoefficients( integer const ic, + real64 const & pressure, + real64 const & temperature, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & aCoefficient, + real64 & bCoefficient ); + + /** + * @brief Calculate the pure coefficients derivatives + * @details Computes the pure coefficients derivatives + * @param[in] ic Component index + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] componentProperties The compositional component properties + * @param[out] aCoefficient pure coefficient (A) + * @param[out] bCoefficient pure coefficient (B) + * @param[out] daCoefficient_dp pure coefficient (A) derivative w.r.t. pressure + * @param[out] dbCoefficient_dp pure coefficient (B) derivative w.r.t. pressure + * @param[out] daCoefficient_dt pure coefficient (A) derivative w.r.t. temperature + * @param[out] dbCoefficient_dt pure coefficient (B) derivative w.r.t. temperature + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void + computePureCoefficients( integer const ic, + real64 const & pressure, + real64 const & temperature, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & aCoefficient, + real64 & bCoefficient, + real64 & daCoefficient_dp, + real64 & dbCoefficient_dp, + real64 & daCoefficient_dt, + real64 & dbCoefficient_dt ); /** * @brief Compute the mixture coefficients using pressure, temperature, composition and input @@ -111,16 +219,17 @@ struct CubicEOSPhaseModel * @param[out] aMixtureCoefficient mixture coefficient (A) * @param[out] bMixtureCoefficient mixture coefficient (B) */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void computeMixtureCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 > const aPureCoefficient, - arraySlice1d< real64 > const bPureCoefficient, + arraySlice1d< real64 > const & aPureCoefficient, + arraySlice1d< real64 > const & bPureCoefficient, real64 & aMixtureCoefficient, real64 & bMixtureCoefficient ); @@ -135,32 +244,25 @@ struct CubicEOSPhaseModel * @param[in] bPureCoefficient pure coefficient (B) * @param[in] aMixtureCoefficient mixture coefficient (A) * @param[in] bMixtureCoefficient mixture coefficient (B) - * @param[out] daMixtureCoefficient_dp derivative of mixture coefficient (A) wrt pressure - * @param[out] dbMixtureCoefficient_dp derivative of mixture coefficient (B) wrt pressure - * @param[out] daMixtureCoefficient_dt derivative of mixture coefficient (A) wrt temperature - * @param[out] dbMixtureCoefficient_dt derivative of mixture coefficient (B) wrt temperature - * @param[out] daMixtureCoefficient_dz derivative of mixture coefficient (A) wrt composition - * @param[out] dbMixtureCoefficient_dz derivative of mixture coefficient (B) wrt composition + * @param[out] aMixtureCoefficientDerivs derivatives of mixture coefficient (A) + * @param[out] bMixtureCoefficientDerivs derivatives of mixture coefficient (B) * @note Assumes that pressure and temperature are strictly positive */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void computeMixtureCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const aMixtureCoefficient, real64 const bMixtureCoefficient, - real64 & daMixtureCoefficient_dp, - real64 & dbMixtureCoefficient_dp, - real64 & daMixtureCoefficient_dt, - real64 & dbMixtureCoefficient_dt, - arraySlice1d< real64 > const daMixtureCoefficient_dz, - arraySlice1d< real64 > const dbMixtureCoefficient_dz ); + arraySlice1d< real64 > const & aMixtureCoefficientDerivs, + arraySlice1d< real64 > const & bMixtureCoefficientDerivs ); /** * @brief Compute the compressibility factor using compositions, BICs, and mixture coefficients @@ -173,14 +275,15 @@ struct CubicEOSPhaseModel * @param[in] bMixtureCoefficient mixture coefficient (B) * @param[out] compressibilityFactor compressibility factor */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void computeCompressibilityFactor( integer const numComps, - arrayView1d< real64 const > const composition, - arrayView2d< real64 const > const & binaryInteractionCoefficients, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const, USD > const & composition, + arraySlice2d< real64 const > const & binaryInteractionCoefficients, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, real64 & compressibilityFactor ); @@ -191,15 +294,9 @@ struct CubicEOSPhaseModel * @param[in] aMixtureCoefficient mixture coefficient (A) * @param[in] bMixtureCoefficient mixture coefficient (B) * @param[in] compressibilityFactor the current compressibility factor - * @param[in] daMixtureCoefficient_dp derivative of mixture coefficient (A) wrt pressure - * @param[in] dbMixtureCoefficient_dp derivative of mixture coefficient (B) wrt pressure - * @param[in] daMixtureCoefficient_dt derivative of mixture coefficient (A) wrt temperature - * @param[in] dbMixtureCoefficient_dt derivative of mixture coefficient (B) wrt temperature - * @param[in] daMixtureCoefficient_dz derivative of mixture coefficient (A) wrt composition - * @param[in] dbMixtureCoefficient_dz derivative of mixture coefficient (B) wrt composition - * @param[out] dCompressibilityFactor_dp derivative of the compressibility factor wrt pressure - * @param[out] dCompressibilityFactor_dt derivative of the compressibility factor wrt temperature - * @param[out] dCompressibilityFactor_dz derivative of the compressibility factor wrt composition + * @param[in] aMixtureCoefficientDerivs derivatives of mixture coefficient (A) + * @param[in] bMixtureCoefficientDerivs derivatives of mixture coefficient (B) + * @param[out] compressibilityFactorDerivs derivatives of the compressibility factor * @note Assumes that pressure and temperature are strictly positive */ GEOS_HOST_DEVICE @@ -209,15 +306,9 @@ struct CubicEOSPhaseModel real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, real64 const & compressibilityFactor, - real64 const & daMixtureCoefficient_dp, - real64 const & dbMixtureCoefficient_dp, - real64 const & daMixtureCoefficient_dt, - real64 const & dbMixtureCoefficient_dt, - arraySlice1d< real64 const > const daMixtureCoefficient_dz, - arraySlice1d< real64 const > const dbMixtureCoefficient_dz, - real64 & dCompressibilityFactor_dp, - real64 & dCompressibilityFactor_dt, - arraySlice1d< real64 > const dCompressibilityFactor_dz ); + arraySlice1d< real64 const > const & aMixtureCoefficientDerivs, + arraySlice1d< real64 const > const & bMixtureCoefficientDerivs, + arraySlice1d< real64 > const & compressibilityFactorDerivs ); /** * @brief Compute the log of the fugacity coefficients using compositions, BICs, compressibility factor and mixture coefficients @@ -231,18 +322,19 @@ struct CubicEOSPhaseModel * @param[in] bMixtureCoefficient mixture coefficient (B) * @param[out] logFugacityCoefficients log of the fugacity coefficients */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void computeLogFugacityCoefficients( integer const numComps, - arrayView1d< real64 const > const composition, - arrayView2d< real64 const > const & binaryInteractionCoefficients, + arraySlice1d< real64 const, USD > const & composition, + arraySlice2d< real64 const > const & binaryInteractionCoefficients, real64 const & compressibilityFactor, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, - arraySlice1d< real64 > const logFugacityCoefficients ); + arraySlice1d< real64 > const & logFugacityCoefficients ); /** * @brief Helper functions solving a cubic equation using trigonometry @@ -267,15 +359,16 @@ struct CubicEOSPhaseModel }; template< typename EOS_TYPE > +template< integer USD > GEOS_HOST_DEVICE void CubicEOSPhaseModel< EOS_TYPE >:: computeLogFugacityCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 > const logFugacityCoefficients ) + arraySlice1d< real64 > const & logFugacityCoefficients ) { // step 0: allocate the stack memory needed for the update stackArray1d< real64, MultiFluidConstants::MAX_NUM_COMPONENTS > aPureCoefficient( numComps ); @@ -284,7 +377,7 @@ computeLogFugacityCoefficients( integer const numComps, real64 bMixtureCoefficient = 0.0; real64 compressibilityFactor = 0.0; - arrayView2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; + arraySlice2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; // step 1: compute the mixture coefficients aPureCoefficient, bPureCoefficient, aMixtureCoefficient, bMixtureCoefficient computeMixtureCoefficients( numComps, // number of components @@ -319,33 +412,335 @@ computeLogFugacityCoefficients( integer const numComps, logFugacityCoefficients ); // output } +template< typename EOS_TYPE > +template< integer USD > +GEOS_HOST_DEVICE +void +CubicEOSPhaseModel< EOS_TYPE >:: +computeLogFugacityCoefficients( integer const numComps, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64 const > const & logFugacityCoefficients, + arraySlice2d< real64 > const & logFugacityCoefficientDerivs ) +{ + integer constexpr numMaxComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + integer constexpr numMaxDofs = MultiFluidConstants::MAX_NUM_COMPONENTS + 2; + integer const numDofs = 2 + numComps; + + GEOS_UNUSED_VAR( logFugacityCoefficients ); + + stackArray1d< real64, numMaxComps > aPureCoefficient( numComps ); + stackArray1d< real64, numMaxComps > bPureCoefficient( numComps ); + stackArray2d< real64, 2*numMaxComps > aPureCoefficientDerivs( numComps, 2 ); + stackArray2d< real64, 2*numMaxComps > bPureCoefficientDerivs( numComps, 2 ); + real64 aMixtureCoefficient = 0.0; + real64 bMixtureCoefficient = 0.0; + real64 compressibilityFactor = 0.0; + stackArray1d< real64, numMaxDofs > aMixtureCoefficientDerivs( numDofs ); + stackArray1d< real64, numMaxDofs > bMixtureCoefficientDerivs( numDofs ); + stackArray1d< real64, numMaxDofs > compressibilityFactorDerivs( numDofs ); + + arraySlice2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; + + // 1.1: Compute the pure and mixture coefficients + computeMixtureCoefficients( numComps, // number of components + pressure, // cell input + temperature, + composition, + componentProperties, // user input, + aPureCoefficient, // output + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient ); + + // 1.2: Compute pure coefficient derivatives + for( integer ic = 0; ic < numComps; ++ic ) + { + computePureCoefficients( ic, + pressure, + temperature, + componentProperties, + aPureCoefficient[ic], + bPureCoefficient[ic], + aPureCoefficientDerivs( ic, Deriv::dP ), + bPureCoefficientDerivs( ic, Deriv::dP ), + aPureCoefficientDerivs( ic, Deriv::dT ), + bPureCoefficientDerivs( ic, Deriv::dT )); + } + + // 1.3: Compute mixture coefficient derivatives + computeMixtureCoefficients( numComps, + pressure, + temperature, + composition, + componentProperties, + aPureCoefficient, + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient, + aMixtureCoefficientDerivs, + bMixtureCoefficientDerivs ); + + // 2.1: Update the compressibility factor + computeCompressibilityFactor( numComps, // number of components + composition, // cell input + binaryInteractionCoefficients, // user input + aPureCoefficient, // computed by computeMixtureCoefficients + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient, + compressibilityFactor ); // output + // 2.2: Update the compressibility factor derivatives + computeCompressibilityFactor( numComps, + aMixtureCoefficient, + bMixtureCoefficient, + compressibilityFactor, + aMixtureCoefficientDerivs, + bMixtureCoefficientDerivs, + compressibilityFactorDerivs ); + + // 3. Calculate derivatives of the logarithm of the fugacity coefficients + stackArray1d< real64, numMaxComps > ki( numComps ); + stackArray2d< real64, numMaxComps * numMaxDofs > dki( numComps, numDofs ); + + // ki + for( integer ic = 0; ic < numComps; ++ic ) + { + ki[ic] = 0.0; + dki( ic, Deriv::dP ) = 0.0; + dki( ic, Deriv::dT ) = 0.0; + for( integer jc = 0; jc < numComps; ++jc ) + { + real64 const aCoeffI = sqrt( aPureCoefficient[ic] ); + real64 const aCoeffJ = sqrt( aPureCoefficient[jc] ); + real64 const kij = ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) * aCoeffI * aCoeffJ; + ki[ic] += composition[jc] * kij; + dki( ic, Deriv::dC + jc ) = kij; + dki( ic, Deriv::dP ) += 0.5 * composition[jc] * kij * ( aPureCoefficientDerivs( ic, Deriv::dP )/aPureCoefficient[ic] + aPureCoefficientDerivs( jc, Deriv::dP )/aPureCoefficient[jc] ); + dki( ic, Deriv::dT ) += 0.5 * composition[jc] * kij * ( aPureCoefficientDerivs( ic, Deriv::dT )/aPureCoefficient[ic] + aPureCoefficientDerivs( jc, Deriv::dT )/aPureCoefficient[jc] ); + } + } + + auto const calculateDerivatives = [&]( integer const kc ){ + real64 const E = log( compressibilityFactor + EOS_TYPE::delta1 * bMixtureCoefficient ) + - log( compressibilityFactor + EOS_TYPE::delta2 * bMixtureCoefficient ); + + real64 const dE_dX = (compressibilityFactorDerivs[kc] + EOS_TYPE::delta1*bMixtureCoefficientDerivs[kc])/( compressibilityFactor + EOS_TYPE::delta1 * bMixtureCoefficient ) + -(compressibilityFactorDerivs[kc] + EOS_TYPE::delta2*bMixtureCoefficientDerivs[kc])/( compressibilityFactor + EOS_TYPE::delta2 * bMixtureCoefficient ); + + //real64 const F = log( compressibilityFactor - bMixtureCoefficient ); + real64 const dF_dX = (compressibilityFactorDerivs[kc] - bMixtureCoefficientDerivs[kc])/(compressibilityFactor - bMixtureCoefficient); + + real64 const G = 1.0 / ( ( EOS_TYPE::delta1 - EOS_TYPE::delta2 ) * bMixtureCoefficient ); + real64 const dG_dX = -G * bMixtureCoefficientDerivs[kc] / bMixtureCoefficient; + + real64 const A = aMixtureCoefficient; + real64 const dA_dX = aMixtureCoefficientDerivs[kc]; + + for( integer ic = 0; ic < numComps; ++ic ) + { + real64 const B = bPureCoefficient[ic] / bMixtureCoefficient; + real64 dB_dX = -B*bMixtureCoefficientDerivs[kc] / bMixtureCoefficient; + if( kc < Deriv::dC ) + { + dB_dX += bPureCoefficientDerivs( ic, kc ) / bMixtureCoefficient; + } + + // lnPhi = ( compressibilityFactor - 1 ) * B - F - G * ( 2 * ki[ic] - A * B ) * E; + logFugacityCoefficientDerivs( ic, kc ) = + compressibilityFactorDerivs[kc]*B + ( compressibilityFactor - 1 ) * dB_dX + - dF_dX + - dG_dX * ( 2 * ki[ic] - A * B ) * E + - G * ( 2 * dki( ic, kc ) - dA_dX * B - A * dB_dX ) * E + - G * ( 2 * ki[ic] - A * B ) * dE_dX; + } + }; + + calculateDerivatives( Deriv::dP ); + calculateDerivatives( Deriv::dT ); + + for( integer jc = 0; jc < numComps; ++jc ) + { + calculateDerivatives( Deriv::dC+jc ); + } +} + +template< typename EOS_TYPE > +template< integer USD > +GEOS_HOST_DEVICE +void +CubicEOSPhaseModel< EOS_TYPE >:: +computeCompressibilityFactor( integer const numComps, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & compressibilityFactor, + arraySlice1d< real64 > const & compressibilityFactorDerivs ) +{ + // step 0: allocate the stack memory needed for the update + integer constexpr numMaxComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + integer constexpr numMaxDofs = MultiFluidConstants::MAX_NUM_COMPONENTS + 2; + integer const numDofs = 2 + numComps; + + stackArray1d< real64, numMaxComps > aPureCoefficient( numComps ); + stackArray1d< real64, numMaxComps > bPureCoefficient( numComps ); + real64 aMixtureCoefficient = 0.0; + real64 bMixtureCoefficient = 0.0; + stackArray1d< real64, numMaxDofs > aMixtureCoefficientDerivs( numDofs ); + stackArray1d< real64, numMaxDofs > bMixtureCoefficientDerivs( numDofs ); + + arraySlice2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; + + // step 1: compute the mixture coefficients aPureCoefficient, bPureCoefficient, aMixtureCoefficient, bMixtureCoefficient + // 1.1: Compute the pure and mixture coefficients + computeMixtureCoefficients( numComps, // number of components + pressure, // cell input + temperature, + composition, + componentProperties, // user input, + aPureCoefficient, // output + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient ); + + // 1.2: Compute mixture coefficient derivatives + computeMixtureCoefficients( numComps, + pressure, + temperature, + composition, + componentProperties, + aPureCoefficient, + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient, + aMixtureCoefficientDerivs, + bMixtureCoefficientDerivs ); + + // 2.1: Update the compressibility factor + computeCompressibilityFactor( numComps, // number of components + composition, // cell input + binaryInteractionCoefficients, // user input + aPureCoefficient, // computed by computeMixtureCoefficients + bPureCoefficient, + aMixtureCoefficient, + bMixtureCoefficient, + compressibilityFactor ); // output + + // 2.2: Update the compressibility factor derivatives + computeCompressibilityFactor( numComps, + aMixtureCoefficient, + bMixtureCoefficient, + compressibilityFactor, + aMixtureCoefficientDerivs, + bMixtureCoefficientDerivs, + compressibilityFactorDerivs ); +} + +template< typename EOS_TYPE > +void +CubicEOSPhaseModel< EOS_TYPE >:: +calculateDimensionalVolumeShift( ComponentProperties const & componentProperties, + arraySlice1d< real64 > const & dimensionalVolumeShift ) +{ + integer const numComps = componentProperties.getNumberOfComponents(); + for( integer ic = 0; ic < numComps; ++ic ) + { + real64 const Vs = componentProperties.getComponentVolumeShift()[ic]; + real64 const Pc = componentProperties.getComponentCriticalPressure()[ic]; + real64 const Tc = componentProperties.getComponentCriticalTemperature()[ic]; + real64 constexpr omegaB = EOS_TYPE::omegaB; + dimensionalVolumeShift[ic] = constants::gasConstant * Vs * omegaB * Tc / Pc; + } +} + template< typename EOS_TYPE > GEOS_HOST_DEVICE void CubicEOSPhaseModel< EOS_TYPE >:: +computePureCoefficients( integer const ic, + real64 const & pressure, + real64 const & temperature, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & aCoefficient, + real64 & bCoefficient ) +{ + real64 daCoefficient_dp = 0.0; + real64 dbCoefficient_dp = 0.0; + real64 daCoefficient_dt = 0.0; + real64 dbCoefficient_dt = 0.0; + computePureCoefficients( ic, + pressure, + temperature, + componentProperties, + aCoefficient, + bCoefficient, + daCoefficient_dp, + dbCoefficient_dp, + daCoefficient_dt, + dbCoefficient_dt ); +} + + +template< typename EOS_TYPE > +GEOS_HOST_DEVICE +void +CubicEOSPhaseModel< EOS_TYPE >:: +computePureCoefficients( integer const ic, + real64 const & pressure, + real64 const & temperature, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & aCoefficient, + real64 & bCoefficient, + real64 & daCoefficient_dp, + real64 & dbCoefficient_dp, + real64 & daCoefficient_dt, + real64 & dbCoefficient_dt ) +{ + arraySlice1d< real64 const > const & criticalPressure = componentProperties.m_componentCriticalPressure; + arraySlice1d< real64 const > const & criticalTemperature = componentProperties.m_componentCriticalTemperature; + arraySlice1d< real64 const > const & acentricFactor = componentProperties.m_componentAcentricFactor; + + real64 const m = EOS_TYPE::evaluate( acentricFactor[ic] ); + real64 const pr = pressure / criticalPressure[ic]; + real64 const tr = temperature / criticalTemperature[ic]; + + real64 const sqrtTr = sqrt( tr ); + real64 const mt = 1.0 + m * (1.0 - sqrtTr); + + aCoefficient = EOS_TYPE::omegaA * pr / (tr*tr) * mt * mt; + bCoefficient = EOS_TYPE::omegaB * pr / tr; + + daCoefficient_dp = aCoefficient / pressure; + dbCoefficient_dp = bCoefficient / pressure; + + daCoefficient_dt = -aCoefficient * (2.0/temperature + m/(mt * sqrtTr * criticalTemperature[ic])); + dbCoefficient_dt = -bCoefficient / temperature; +} + +template< typename EOS_TYPE > +template< integer USD > +GEOS_HOST_DEVICE +void +CubicEOSPhaseModel< EOS_TYPE >:: computeMixtureCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 > const aPureCoefficient, - arraySlice1d< real64 > const bPureCoefficient, + arraySlice1d< real64 > const & aPureCoefficient, + arraySlice1d< real64 > const & bPureCoefficient, real64 & aMixtureCoefficient, real64 & bMixtureCoefficient ) { - arrayView1d< real64 const > const & criticalPressure = componentProperties.m_componentCriticalPressure; - arrayView1d< real64 const > const & criticalTemperature = componentProperties.m_componentCriticalTemperature; - arrayView1d< real64 const > const & acentricFactor = componentProperties.m_componentAcentricFactor; - arrayView2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; + arraySlice2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; // mixture coefficients for( integer ic = 0; ic < numComps; ++ic ) { - real64 const m = EOS_TYPE::evaluate( acentricFactor[ic] ); - real64 const pr = pressure / criticalPressure[ic]; - real64 const tr = temperature / criticalTemperature[ic]; - aPureCoefficient[ic] = EOS_TYPE::omegaA * pr / (tr*tr) * pow( 1.0 + m * ( 1.0 - sqrt( tr ) ), 2.0 ); - bPureCoefficient[ic] = EOS_TYPE::omegaB * pr / tr; + computePureCoefficients( ic, pressure, temperature, componentProperties, aPureCoefficient[ic], bPureCoefficient[ic] ); } aMixtureCoefficient = 0.0; @@ -354,89 +749,85 @@ computeMixtureCoefficients( integer const numComps, { for( integer jc = 0; jc < numComps; ++jc ) { - aMixtureCoefficient += ( composition[ic] * composition[jc] * ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) * sqrt( aPureCoefficient[ic] * aPureCoefficient[jc] ) ); + aMixtureCoefficient += composition[ic] * composition[jc] * ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) * sqrt( aPureCoefficient[ic] * aPureCoefficient[jc] ); } bMixtureCoefficient += composition[ic] * bPureCoefficient[ic]; } } template< typename EOS_TYPE > +template< integer USD > GEOS_HOST_DEVICE void CubicEOSPhaseModel< EOS_TYPE >:: computeMixtureCoefficients( integer const numComps, real64 const & pressure, real64 const & temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const aMixtureCoefficient, real64 const bMixtureCoefficient, - real64 & daMixtureCoefficient_dp, - real64 & dbMixtureCoefficient_dp, - real64 & daMixtureCoefficient_dt, - real64 & dbMixtureCoefficient_dt, - arraySlice1d< real64 > const daMixtureCoefficient_dz, - arraySlice1d< real64 > const dbMixtureCoefficient_dz ) + arraySlice1d< real64 > const & aMixtureCoefficientDerivs, + arraySlice1d< real64 > const & bMixtureCoefficientDerivs ) { - arrayView1d< real64 const > const & criticalTemperature = componentProperties.m_componentCriticalTemperature; - arrayView1d< real64 const > const & acentricFactor = componentProperties.m_componentAcentricFactor; - arrayView2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; - - stackArray1d< real64, MultiFluidConstants::MAX_NUM_COMPONENTS > daPureCoefficient_dx( numComps ); + arraySlice2d< real64 const > const & binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; // Calculate pressure derivatives - daMixtureCoefficient_dp = aMixtureCoefficient / pressure; - dbMixtureCoefficient_dp = bMixtureCoefficient / pressure; + aMixtureCoefficientDerivs[Deriv::dP] = aMixtureCoefficient / pressure; + bMixtureCoefficientDerivs[Deriv::dP] = bMixtureCoefficient / pressure; // Calculate temperature derivatives + real64 aCoefficient = 0.0; + real64 bCoefficient = 0.0; + real64 dummy = 0.0; + stackArray1d< real64, MultiFluidConstants::MAX_NUM_COMPONENTS > daPureCoefficient_dt( numComps ); for( integer ic = 0; ic < numComps; ++ic ) { - real64 const m = EOS_TYPE::evaluate( acentricFactor[ic] ); - real64 const sqrtTr = sqrt( temperature / criticalTemperature[ic] ); - real64 const mt = 1.0 + m * (1.0 - sqrtTr); - daPureCoefficient_dx[ic] = -aPureCoefficient[ic] * (2.0/temperature + m/(mt*sqrtTr*criticalTemperature[ic])); + computePureCoefficients( ic, pressure, temperature, componentProperties, + aCoefficient, bCoefficient, dummy, dummy, daPureCoefficient_dt[ic], dummy ); } - daMixtureCoefficient_dt = 0.0; - dbMixtureCoefficient_dt = -bMixtureCoefficient / temperature; + aMixtureCoefficientDerivs[Deriv::dT] = 0.0; + bMixtureCoefficientDerivs[Deriv::dT] = -bMixtureCoefficient / temperature; for( integer ic = 0; ic < numComps; ++ic ) { for( integer jc = 0; jc < numComps; ++jc ) { real64 const coeff = composition[ic] * composition[jc] * ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) / sqrt( aPureCoefficient[ic] * aPureCoefficient[jc] ); - daMixtureCoefficient_dt += 0.5 * coeff * (daPureCoefficient_dx[ic]*aPureCoefficient[jc] + daPureCoefficient_dx[jc]*aPureCoefficient[ic]); + aMixtureCoefficientDerivs[Deriv::dT] += 0.5 * coeff * (daPureCoefficient_dt[ic]*aPureCoefficient[jc] + daPureCoefficient_dt[jc]*aPureCoefficient[ic]); } } // Calculate composition derivatives for( integer ic = 0; ic < numComps; ++ic ) { - daMixtureCoefficient_dz[ic] = 0.0; - dbMixtureCoefficient_dz[ic] = 0.0; + aMixtureCoefficientDerivs[Deriv::dC+ic] = 0.0; + bMixtureCoefficientDerivs[Deriv::dC+ic] = 0.0; } for( integer ic = 0; ic < numComps; ++ic ) { for( integer jc = 0; jc < numComps; ++jc ) { real64 const coeff = ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) * sqrt( aPureCoefficient[ic] * aPureCoefficient[jc] ); - daMixtureCoefficient_dz[ic] += coeff * composition[jc]; - daMixtureCoefficient_dz[jc] += coeff * composition[ic]; + aMixtureCoefficientDerivs[Deriv::dC+ic] += coeff * composition[jc]; + aMixtureCoefficientDerivs[Deriv::dC+jc] += coeff * composition[ic]; } - dbMixtureCoefficient_dz[ic] = bPureCoefficient[ic]; + bMixtureCoefficientDerivs[Deriv::dC+ic] = bPureCoefficient[ic]; } } template< typename EOS_TYPE > +template< integer USD > GEOS_HOST_DEVICE void CubicEOSPhaseModel< EOS_TYPE >:: computeCompressibilityFactor( integer const numComps, - arrayView1d< real64 const > const composition, - arrayView2d< real64 const > const & binaryInteractionCoefficients, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const, USD > const & composition, + arraySlice2d< real64 const > const & binaryInteractionCoefficients, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, real64 & compressibilityFactor ) @@ -505,80 +896,61 @@ computeCompressibilityFactor( integer const numComps, real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, real64 const & compressibilityFactor, - real64 const & daMixtureCoefficient_dp, - real64 const & dbMixtureCoefficient_dp, - real64 const & daMixtureCoefficient_dt, - real64 const & dbMixtureCoefficient_dt, - arraySlice1d< real64 const > const daMixtureCoefficient_dz, - arraySlice1d< real64 const > const dbMixtureCoefficient_dz, - real64 & dcompressibilityFactor_dp, - real64 & dcompressibilityFactor_dt, - arraySlice1d< real64 > const dcompressibilityFactor_dz ) + arraySlice1d< real64 const > const & aMixtureCoefficientDerivs, + arraySlice1d< real64 const > const & bMixtureCoefficientDerivs, + arraySlice1d< real64 > const & compressibilityFactorDerivs ) { - // a Z3 + b Z2 + cZ + d = 0 - // Derivatives for a,b,c,d - // dadx is zero; - real64 dbdx = 0.0; - real64 dcdx = 0.0; - real64 dddx = 0.0; - - constexpr real64 d1pd2 = EOS_TYPE::delta1 + EOS_TYPE::delta2; - constexpr real64 d1xd2 = EOS_TYPE::delta1 * EOS_TYPE::delta2; + real64 constexpr d1pd2 = EOS_TYPE::delta1 + EOS_TYPE::delta2; + real64 constexpr d1xd2 = EOS_TYPE::delta1 * EOS_TYPE::delta2; - constexpr real64 a = 1.0; + real64 constexpr a = 1.0; real64 const b = ( d1pd2 - 1.0 ) * bMixtureCoefficient - 1.0; real64 const c = aMixtureCoefficient + d1xd2 * bMixtureCoefficient * bMixtureCoefficient - d1pd2 * bMixtureCoefficient * ( bMixtureCoefficient + 1.0 ); // Implicit differentiation scale real64 const denominator = (3.0*a*compressibilityFactor + 2.0*b)*compressibilityFactor + c; - constexpr real64 epsilon = MultiFluidConstants::epsilon; - real64 const scalingFactor = fabs( denominator ) < epsilon ? 0.0 : -1.0 / denominator; - - // Pressure derivatives - dbdx = ( d1pd2 - 1.0 ) * dbMixtureCoefficient_dp; - dcdx = daMixtureCoefficient_dp + (2.0*(d1xd2-d1pd2)*bMixtureCoefficient-d1pd2)*dbMixtureCoefficient_dp; - dddx = -(aMixtureCoefficient*dbMixtureCoefficient_dp + daMixtureCoefficient_dp*bMixtureCoefficient - + d1xd2*((3.0*bMixtureCoefficient+2.0)*bMixtureCoefficient*dbMixtureCoefficient_dp)); - dcompressibilityFactor_dp = (((dbdx*compressibilityFactor) + dcdx)*compressibilityFactor + dddx) * scalingFactor; - - // Temperature derivatives - dbdx = ( d1pd2 - 1.0 ) * dbMixtureCoefficient_dt; - dcdx = daMixtureCoefficient_dt + (2.0*(d1xd2-d1pd2)*bMixtureCoefficient-d1pd2)*dbMixtureCoefficient_dt; - dddx = -(aMixtureCoefficient*dbMixtureCoefficient_dt + daMixtureCoefficient_dt*bMixtureCoefficient - + d1xd2*((3.0*bMixtureCoefficient+2.0)*bMixtureCoefficient*dbMixtureCoefficient_dt)); - dcompressibilityFactor_dt = (((dbdx*compressibilityFactor) + dcdx)*compressibilityFactor + dddx) * scalingFactor; - - // Composition derivatives - for( integer ic = 0; ic < numComps; ++ic ) + real64 const scalingFactor = LvArray::math::abs( denominator ) < MultiFluidConstants::epsilon ? 0.0 : -1.0 / denominator; + + integer const numDofs = numComps + 2; + + for( integer kc = 0; kc < numDofs; ++kc ) { - dbdx = ( d1pd2 - 1.0 ) * dbMixtureCoefficient_dz[ic]; - dcdx = daMixtureCoefficient_dz[ic] + (2.0*(d1xd2-d1pd2)*bMixtureCoefficient-d1pd2)*dbMixtureCoefficient_dz[ic]; - dddx = -(aMixtureCoefficient*dbMixtureCoefficient_dz[ic] + daMixtureCoefficient_dz[ic]*bMixtureCoefficient - + d1xd2*((3.0*bMixtureCoefficient+2.0)*bMixtureCoefficient*dbMixtureCoefficient_dz[ic])); - dcompressibilityFactor_dz[ic] = (((dbdx*compressibilityFactor) + dcdx)*compressibilityFactor + dddx) * scalingFactor; + // Given derivative of the mixture parameters a and b w.r.t. variable X, calculate the derivative of the + // compressibility factor (z-factor) w.r.t. X + real64 const da_dX = aMixtureCoefficientDerivs[kc]; + real64 const db_dX = bMixtureCoefficientDerivs[kc]; + // a Z3 + b Z2 + cZ + d = 0 + // Derivatives for a,b,c,d + real64 const dbdx = ( d1pd2 - 1.0 ) * db_dX; + real64 const dcdx = da_dX + ( 2.0*(d1xd2-d1pd2) * bMixtureCoefficient - d1pd2 )*db_dX; + real64 const dddx = -(aMixtureCoefficient*db_dX + da_dX*bMixtureCoefficient + + d1xd2*((3.0*bMixtureCoefficient+2.0)*bMixtureCoefficient*db_dX)); + compressibilityFactorDerivs[kc] = (((dbdx*compressibilityFactor) + dcdx)*compressibilityFactor + dddx) * scalingFactor; } } template< typename EOS_TYPE > +template< integer USD > GEOS_HOST_DEVICE void CubicEOSPhaseModel< EOS_TYPE >:: computeLogFugacityCoefficients( integer const numComps, - arrayView1d< real64 const > const composition, - arrayView2d< real64 const > const & binaryInteractionCoefficients, + arraySlice1d< real64 const, USD > const & composition, + arraySlice2d< real64 const > const & binaryInteractionCoefficients, real64 const & compressibilityFactor, - arraySlice1d< real64 const > const aPureCoefficient, - arraySlice1d< real64 const > const bPureCoefficient, + arraySlice1d< real64 const > const & aPureCoefficient, + arraySlice1d< real64 const > const & bPureCoefficient, real64 const & aMixtureCoefficient, real64 const & bMixtureCoefficient, - arraySlice1d< real64 > const logFugacityCoefficients ) + arraySlice1d< real64 > const & logFugacityCoefficients ) { stackArray1d< real64, MultiFluidConstants::MAX_NUM_COMPONENTS > ki( numComps ); // ki for( integer ic = 0; ic < numComps; ++ic ) { + ki[ic] = 0.0; for( integer jc = 0; jc < numComps; ++jc ) { ki[ic] += composition[jc] * ( 1.0 - binaryInteractionCoefficients( ic, jc ) ) * sqrt( aPureCoefficient[ic] * aPureCoefficient[jc] ); @@ -586,9 +958,13 @@ computeLogFugacityCoefficients( integer const numComps, } // E - real64 const E = log( ( compressibilityFactor + EOS_TYPE::delta1 * bMixtureCoefficient ) - / ( compressibilityFactor + EOS_TYPE::delta2 * bMixtureCoefficient ) ); - real64 const F = log( compressibilityFactor - bMixtureCoefficient ); + real64 const expE = ( compressibilityFactor + EOS_TYPE::delta1 * bMixtureCoefficient ) / + ( compressibilityFactor + EOS_TYPE::delta2 * bMixtureCoefficient ); + real64 const expF = compressibilityFactor - bMixtureCoefficient; + GEOS_ERROR_IF( expE < MultiFluidConstants::epsilon || expF < MultiFluidConstants::epsilon, + GEOS_FMT( "Cubic EOS failed with exp(E)={} and exp(F)={}", expE, expF )); + real64 const E = log( expE ); + real64 const F = log( expF ); real64 const G = 1.0 / ( ( EOS_TYPE::delta1 - EOS_TYPE::delta2 ) * bMixtureCoefficient ); real64 const A = aMixtureCoefficient; @@ -644,6 +1020,9 @@ solveCubicPolynomial( real64 const & m3, } } +using CubicEOSPR = CubicEOSPhaseModel< PengRobinsonEOS >; +using CubicEOSSRK = CubicEOSPhaseModel< SoaveRedlichKwongEOS >; + } // namespace compositional } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp index 0ef7352233e..69e9d330496 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp @@ -42,6 +42,7 @@ struct KValueInitialization * @param[in] componentProperties The compositional component properties * @param[out] kValues the calculated k-values **/ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static void @@ -49,7 +50,7 @@ struct KValueInitialization real64 const pressure, real64 const temperature, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64 > const kValues ) + arraySlice1d< real64, USD > const & kValues ) { arrayView1d< real64 const > const & criticalPressure = componentProperties.m_componentCriticalPressure; arrayView1d< real64 const > const & criticalTemperature = componentProperties.m_componentCriticalTemperature; @@ -62,6 +63,39 @@ struct KValueInitialization } } + /** + * @brief Calculate gas-liquid k-values near the convergence pressure + * @param[in] numComps number of components + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] componentProperties The compositional component properties + * @param[out] kValues the calculated k-values + **/ + template< integer USD > + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void + computeConstantLiquidKvalue( integer const numComps, + real64 const pressure, + real64 const temperature, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64, USD > const & kValues ) + { + GEOS_UNUSED_VAR( pressure, temperature ); + arrayView1d< real64 const > const & criticalPressure = componentProperties.m_componentCriticalPressure; + real64 averagePressure = 0.0; // Average pressure + for( integer ic = 0; ic < numComps; ++ic ) + { + averagePressure += criticalPressure[ic]; + } + averagePressure /= numComps; + constexpr real64 kValueGap = 0.01; + for( integer ic = 0; ic < numComps; ++ic ) + { + kValues[ic] = criticalPressure[ic] < averagePressure ? 1.0/(1.0 + kValueGap) : 1.0/(1.0 - kValueGap); + } + } + /** * @brief Calculate water-gas k-value * @param[in] pressure pressure diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp index 7cd8e9508cf..8498deabe1a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -24,6 +24,7 @@ #include "KValueInitialization.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" #include "constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp" +#include "denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp" namespace geos { @@ -36,6 +37,7 @@ namespace compositional struct NegativeTwoPhaseFlash { + using Deriv = geos::constitutive::multifluid::DerivativeOffset; public: /** * @brief Perform negative two-phase EOS flash @@ -49,23 +51,28 @@ struct NegativeTwoPhaseFlash * @param[out] vapourComposition the calculated vapour phase composition * @return an indicator of success of the flash */ - template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > + template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR, integer USD1, integer USD2, integer USD3 > GEOS_HOST_DEVICE static bool compute( integer const numComps, real64 const pressure, real64 const temperature, - arrayView1d< real64 const > const composition, + arraySlice1d< real64 const, USD1 > const & composition, ComponentProperties::KernelWrapper const & componentProperties, + arraySlice2d< real64, USD3 > const & kValues, real64 & vapourPhaseMoleFraction, - arrayView1d< real64 > const liquidComposition, - arrayView1d< real64 > const vapourComposition ) + arraySlice1d< real64, USD2 > const & liquidComposition, + arraySlice1d< real64, USD2 > const & vapourComposition ) { constexpr integer maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; stackArray1d< real64, maxNumComps > logLiquidFugacity( numComps ); stackArray1d< real64, maxNumComps > logVapourFugacity( numComps ); - stackArray1d< real64, maxNumComps > kVapourLiquid( numComps ); stackArray1d< real64, maxNumComps > fugacityRatios( numComps ); - stackArray1d< integer, maxNumComps > presentComponentIds( numComps ); + stackArray1d< integer, maxNumComps > availableComponents( numComps ); + auto const & kVapourLiquid = kValues[0]; + + calculatePresentComponents( numComps, composition, availableComponents ); + + auto const presentComponents = availableComponents.toSliceConst(); // Initialise compositions to feed composition for( integer ic = 0; ic < numComps; ++ic ) @@ -74,109 +81,339 @@ struct NegativeTwoPhaseFlash vapourComposition[ic] = composition[ic]; } - // Check for machine-zero feed values - integer presentCount = 0; + // Check if k-Values need to be initialised + bool needInitialisation = true; for( integer ic = 0; ic < numComps; ++ic ) { - if( MultiFluidConstants::epsilon < composition[ic] ) + if( kVapourLiquid[ic] < MultiFluidConstants::epsilon ) { - presentComponentIds[presentCount++] = ic; + needInitialisation = true; + break; } } - presentComponentIds.resize( presentCount ); - KValueInitialization::computeWilsonGasLiquidKvalue( numComps, - pressure, - temperature, - componentProperties, - kVapourLiquid ); + bool kValueReset = true; + constexpr real64 boundsTolerance = 1.0e-3; + if( needInitialisation ) + { + KValueInitialization::computeWilsonGasLiquidKvalue( numComps, + pressure, + temperature, + componentProperties, + kVapourLiquid );/** + vapourPhaseMoleFraction = RachfordRice::solve( + kVapourLiquid.toSliceConst(), composition, presentComponents + ); + if( vapourPhaseMoleFraction < -boundsTolerance || + vapourPhaseMoleFraction > 1.0 + boundsTolerance ) + { + kValueReset = true; + KValueInitialization::computeConstantLiquidKvalue( numComps, + pressure, + temperature, + componentProperties, + kVapourLiquid ); + }*/ + } + + vapourPhaseMoleFraction = RachfordRice::solve( kVapourLiquid.toSliceConst(), composition, presentComponents ); + real64 const initialVapourFraction = vapourPhaseMoleFraction; bool converged = false; for( localIndex iterationCount = 0; iterationCount < MultiFluidConstants::maxSSIIterations; ++iterationCount ) { - // Solve Rachford-Rice Equation - vapourPhaseMoleFraction = RachfordRice::solve( kVapourLiquid, composition, presentComponentIds ); + real64 const error = computeFugacityRatio< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >( + numComps, + pressure, + temperature, + composition, + componentProperties, + kVapourLiquid.toSliceConst(), + presentComponents, + vapourPhaseMoleFraction, + liquidComposition, + vapourComposition, + logLiquidFugacity.toSlice(), + logVapourFugacity.toSlice(), + fugacityRatios.toSlice() ); - // Assign phase compositions - for( integer const ic : presentComponentIds ) + // Compute fugacity ratios and check convergence + converged = (error < MultiFluidConstants::fugacityTolerance); + + if( converged ) { - liquidComposition[ic] = composition[ic] / ( 1.0 + vapourPhaseMoleFraction * ( kVapourLiquid[ic] - 1.0 ) ); - vapourComposition[ic] = kVapourLiquid[ic] * liquidComposition[ic]; + break; } - normalizeComposition( numComps, liquidComposition ); - normalizeComposition( numComps, vapourComposition ); + // Update K-values + if( (vapourPhaseMoleFraction < -boundsTolerance || vapourPhaseMoleFraction > 1.0+boundsTolerance) + && 0.2 < LvArray::math::abs( vapourPhaseMoleFraction-initialVapourFraction ) + && !kValueReset ) + { + KValueInitialization::computeConstantLiquidKvalue( numComps, + pressure, + temperature, + componentProperties, + kVapourLiquid ); + kValueReset = true; + } + else + { + for( integer const ic : presentComponents ) + { + kVapourLiquid[ic] *= exp( fugacityRatios[ic] ); + } + } +//std::cout +//<< std::setw(3) << iterationCount << " " +//<< std::setw(12) << pressure << " " +//<< std::setw(10) << temperature << " " +//<< std::setw(15) << error << " " +//<< std::setw(15) << vapourPhaseMoleFraction << " "; +//for( integer const ic : {0,1,8} ) +//{ +// std::cout << std::setw(15) << kVapourLiquid[ic] << " "; +//} +//std::cout +//<< "\n"; + } +//std::cout << "================================================================================\n"; + + // Retrieve physical bounds from negative flash values + if( vapourPhaseMoleFraction < MultiFluidConstants::epsilon ) + { + vapourPhaseMoleFraction = 0.0; + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidComposition[ic] = composition[ic]; + vapourComposition[ic] = composition[ic]; + } + } + else if( 1.0 - vapourPhaseMoleFraction < MultiFluidConstants::epsilon ) + { + vapourPhaseMoleFraction = 1.0; + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidComposition[ic] = composition[ic]; + vapourComposition[ic] = composition[ic]; + } + } + + return converged; + } + + /** + * @brief Calculate derivatives from the two-phase negative flash + * @param[in] numComps number of components + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] composition composition of the mixture + * @param[in] componentProperties The compositional component properties + * @param[in] vapourFraction the calculated vapour (gas) mole fraction + * @param[in] liquidComposition the calculated liquid phase composition + * @param[in] vapourComposition the calculated vapour phase composition + * @param[out] vapourFractionDerivs derivatives of the calculated vapour (gas) mole fraction + * @param[out] liquidCompositionDerivs derivatives of the calculated liquid phase composition + * @param[out] vapourCompositionDerivs derivatives of the calculated vapour phase composition + */ + template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR, integer USD1, integer USD2 > + GEOS_HOST_DEVICE + static void computeDerivatives( integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const vapourFraction, + arraySlice1d< real64 const, USD1 > const & liquidComposition, + arraySlice1d< real64 const, USD1 > const & vapourComposition, + arraySlice1d< real64, USD1 > const & vapourFractionDerivs, + arraySlice2d< real64, USD2 > const & liquidCompositionDerivs, + arraySlice2d< real64, USD2 > const & vapourCompositionDerivs ) + { + constexpr integer maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + constexpr integer maxNumDofs = MultiFluidConstants::MAX_NUM_COMPONENTS + 2; + + integer const numDofs = numComps + 2; + + auto const setZero = []( real64 & val ) { val = 0.0; }; + LvArray::forValuesInSlice( vapourFractionDerivs, setZero ); + LvArray::forValuesInSlice( liquidCompositionDerivs, setZero ); + LvArray::forValuesInSlice( vapourCompositionDerivs, setZero ); + + // Check if we are single or 2-phase + if( vapourFraction < MultiFluidConstants::epsilon ) + { + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + vapourCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + } + } + else if( 1.0 - vapourFraction < MultiFluidConstants::epsilon ) + { + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + vapourCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + } + } + else + { + // Calculate the liquid and vapour fugacities and derivatives + stackArray1d< real64, maxNumComps > logLiquidFugacity( numComps ); + stackArray1d< real64, maxNumComps > logVapourFugacity( numComps ); + stackArray2d< real64, maxNumComps * maxNumDofs > logLiquidFugacityDerivs( numComps, numDofs ); + stackArray2d< real64, maxNumComps * maxNumDofs > logVapourFugacityDerivs( numComps, numDofs ); - // Compute the phase fugacities EOS_TYPE_LIQUID::computeLogFugacityCoefficients( numComps, pressure, temperature, liquidComposition, componentProperties, logLiquidFugacity ); + EOS_TYPE_LIQUID::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + liquidComposition, + componentProperties, + logLiquidFugacity, + logLiquidFugacityDerivs ); EOS_TYPE_VAPOUR::computeLogFugacityCoefficients( numComps, pressure, temperature, vapourComposition, componentProperties, logVapourFugacity ); + EOS_TYPE_VAPOUR::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + vapourComposition, + componentProperties, + logVapourFugacity, + logVapourFugacityDerivs ); - // Compute fugacity ratios and check convergence - converged = true; + constexpr integer maxNumVals = 2*MultiFluidConstants::MAX_NUM_COMPONENTS+1; + integer const numVals = 2*numComps; + stackArray1d< real64, maxNumVals > b( numVals + 1 ); + stackArray1d< real64, maxNumVals > x( numVals + 1 ); + stackArray2d< real64, maxNumVals * maxNumVals > A( numVals + 1, numVals + 1 ); - for( integer const ic : presentComponentIds ) + LvArray::forValuesInSlice( A.toSlice(), setZero ); + LvArray::forValuesInSlice( b.toSlice(), setZero ); + + for( integer ic = 0; ic < numComps; ++ic ) { - fugacityRatios[ic] = exp( logLiquidFugacity[ic] - logVapourFugacity[ic] ) * liquidComposition[ic] / vapourComposition[ic]; - if( MultiFluidConstants::fugacityTolerance < fabs( fugacityRatios[ic] - 1.0 ) ) + integer const xi = ic; + integer const yi = ic + numComps; + integer const vi = numVals; + + integer e = ic; + A( e, xi ) = 1.0 - vapourFraction; + A( e, yi ) = vapourFraction; + A( e, vi ) = vapourComposition[ic] - liquidComposition[ic]; + + e = ic + numComps; + real64 const phiL = exp( logLiquidFugacity( ic ) ); + real64 const phiV = exp( logVapourFugacity( ic ) ); + for( integer jc = 0; jc < numComps; ++jc ) { - converged = false; + integer const xj = jc; + integer const yj = jc + numComps; + real64 const dPhiLdx = logLiquidFugacityDerivs( ic, Deriv::dC+jc ); + real64 const dPhiVdy = logVapourFugacityDerivs( ic, Deriv::dC+jc ); + A( e, xj ) = liquidComposition[ic] * phiL * dPhiLdx; + A( e, yj ) = -vapourComposition[ic] * phiV * dPhiVdy; } - } + A( e, xi ) += phiL; + A( e, yi ) -= phiV; - if( converged ) - { - break; + e = numVals; + A( e, xi ) = -1.0; + A( e, yi ) = 1.0; } - - // Update K-values - for( integer const ic : presentComponentIds ) + // Pressure and temperature derivatives + for( integer const pc : {Deriv::dP, Deriv::dT} ) { - kVapourLiquid[ic] *= fugacityRatios[ic]; + for( integer ic = 0; ic < numComps; ++ic ) + { + real64 const phiL = exp( logLiquidFugacity( ic ) ); + real64 const phiV = exp( logVapourFugacity( ic ) ); + b( ic ) = 0.0; + b( ic + numComps ) = -liquidComposition[ic] * phiL * logLiquidFugacityDerivs( ic, pc ) + + vapourComposition[ic] * phiV * logVapourFugacityDerivs( ic, pc ); + } + b( numVals ) = 0.0; + solveLinearSystem( A, b, x ); + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, pc ) = x( ic ); + vapourCompositionDerivs( ic, pc ) = x( ic + numComps ); + } + vapourFractionDerivs( pc ) = x( numVals ); } - } - - // Retrieve physical bounds from negative flash values - if( vapourPhaseMoleFraction <= 0.0 ) - { - vapourPhaseMoleFraction = 0.0; - for( integer ic = 0; ic < numComps; ++ic ) + // Composition derivatives + for( integer kc = 0; kc < numComps; ++kc ) { - liquidComposition[ic] = composition[ic]; + integer const pc = Deriv::dC + kc; + + for( integer ic = 0; ic < numComps; ++ic ) + { + b( ic ) = -composition[ic]; + b( ic + numComps ) = 0.0; + } + b( kc ) += 1.0; + b( numVals ) = 0.0; + solveLinearSystem( A, b, x ); + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, pc ) = x( ic ); + vapourCompositionDerivs( ic, pc ) = x( ic + numComps ); + } + vapourFractionDerivs( pc ) = x( numVals ); } } - else if( 1.0 <= vapourPhaseMoleFraction ) + } + +private: + /** + * @brief Calculate which components are present. + * @details Creates a list of indices whose components have non-zero mole fraction. + * @param[in] numComps number of components + * @param[in] composition the composition of the fluid + * @param[out] presentComponents the list of present components + * @return the number of present components + */ + template< typename ARRAY > + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static integer calculatePresentComponents( integer const numComps, + arraySlice1d< real64 const > const & composition, + ARRAY & presentComponents ) + { + // Check for machine-zero feed values + integer presentCount = 0; + for( integer ic = 0; ic < numComps; ++ic ) { - vapourPhaseMoleFraction = 1.0; - for( integer ic = 0; ic < numComps; ++ic ) + if( MultiFluidConstants::epsilon < composition[ic] ) { - vapourComposition[ic] = composition[ic]; + presentComponents[presentCount++] = ic; } } - - return converged; + presentComponents.resize( presentCount ); + return presentCount; } -private: /** * @brief Normalise a composition in place to ensure that the components add up to unity * @param[in] numComps number of components * @param[in/out] composition composition to be normalized * @return the sum of the given values */ + template< integer USD > GEOS_HOST_DEVICE GEOS_FORCE_INLINE static real64 normalizeComposition( integer const numComps, - arraySlice1d< real64 > const composition ) + arraySlice1d< real64, USD > const & composition ) { real64 totalMoles = 0.0; for( integer ic = 0; ic < numComps; ++ic ) @@ -190,6 +427,77 @@ struct NegativeTwoPhaseFlash } return totalMoles; } + + /** + * @brief Calculate the logarithms of the fugacity ratios + * @param[in] numComps number of components + * @param[in] composition composition to be normalized + */ + template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR, integer USD > + GEOS_HOST_DEVICE + static real64 computeFugacityRatio( + integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64 const, USD > const & kValues, + arraySlice1d< integer const > const & presentComponents, + real64 & vapourPhaseMoleFraction, + arraySlice1d< real64, USD > const & liquidComposition, + arraySlice1d< real64, USD > const & vapourComposition, + arraySlice1d< real64 > const & logLiquidFugacity, + arraySlice1d< real64 > const & logVapourFugacity, + arraySlice1d< real64 > const & fugacityRatios ) + { + // Solve Rachford-Rice Equation + vapourPhaseMoleFraction = RachfordRice::solve( kValues, composition, presentComponents ); + + // Assign phase compositions + for( integer const ic : presentComponents ) + { + liquidComposition[ic] = composition[ic] / ( 1.0 + vapourPhaseMoleFraction * ( kValues[ic] - 1.0 ) ); + vapourComposition[ic] = kValues[ic] * liquidComposition[ic]; + } + normalizeComposition( numComps, liquidComposition ); + normalizeComposition( numComps, vapourComposition ); + + // Compute the phase fugacities + EOS_TYPE_LIQUID::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + liquidComposition.toSliceConst(), + componentProperties, + logLiquidFugacity ); + EOS_TYPE_VAPOUR::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + vapourComposition.toSliceConst(), + componentProperties, + logVapourFugacity ); + + // Compute fugacity ratios and calculate the error + real64 error = 0.0; + for( integer const ic : presentComponents ) + { + fugacityRatios[ic] = ( logLiquidFugacity[ic] - logVapourFugacity[ic] ) + log( liquidComposition[ic] ) - log( vapourComposition[ic] ); + error += (fugacityRatios[ic]*fugacityRatios[ic]); + } + return LvArray::math::sqrt( error ); + } + + GEOS_HOST_DEVICE + static bool solveLinearSystem( arraySlice2d< real64 const > const & A, + arraySlice1d< real64 const > const & b, + arraySlice1d< real64 > const & x ) + { +#if defined(GEOS_DEVICE_COMPILE) + return false; +#else + BlasLapackLA::solveLinearSystem( A, b, x ); + return true; +#endif + } }; } // namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp index af7c05bb428..e166ad1157b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp @@ -21,6 +21,7 @@ #include "common/DataTypes.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" namespace geos { @@ -44,36 +45,24 @@ struct RachfordRice /** * @brief Function solving the Rachford-Rice equation - * @input[in] kValues the array fo K-values + * @input[in] kValues the array of K-values * @input[in] feed the component fractions * @input[in] presentComponentIds the indices of components with a non-zero fractions * @return the gas mole fraction **/ + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE real64 static - solve( arraySlice1d< real64 const > const kValues, - arraySlice1d< real64 const > const feed, - arraySlice1d< integer const > const presentComponentIds ) + solve( arraySlice1d< real64 const, USD2 > const & kValues, + arraySlice1d< real64 const, USD1 > const & feed, + arraySlice1d< integer const > const & presentComponentIds ) { real64 gasPhaseMoleFraction = 0; // min and max Kvalues for non-zero composition - real64 maxK = 0.0; - real64 minK = 1 / epsilon; - - for( integer i = 0; i < presentComponentIds.size(); ++i ) - { - integer const ic = presentComponentIds[i]; - if( kValues[ic] > maxK ) - { - maxK = kValues[ic]; - } - if( kValues[ic] < minK ) - { - minK = kValues[ic]; - } - } + real64 minK, maxK; + findKValueRange( kValues, presentComponentIds, minK, maxK ); // check for trivial solutions. // this corresponds to bad Kvalues @@ -179,12 +168,13 @@ struct RachfordRice * @input[in] x the value at which the Rachford-Rice function is evaluated * @return the value of the Rachford-Rice function at x **/ + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE real64 static - evaluate( arraySlice1d< real64 const > const kValues, - arraySlice1d< real64 const > const feed, - arraySlice1d< integer const > const presentComponentIds, + evaluate( arraySlice1d< real64 const, USD2 > const & kValues, + arraySlice1d< real64 const, USD1 > const & feed, + arraySlice1d< integer const > const & presentComponentIds, real64 const & x ) { real64 value = 0.0; @@ -205,12 +195,13 @@ struct RachfordRice * @input[in] x the value at which the derivative of the Rachford-Rice function is evaluated * @return the value of the derivative of the Rachford-Rice function at x **/ + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE real64 static - evaluateDerivative( arraySlice1d< real64 const > const kValues, - arraySlice1d< real64 const > const feed, - arraySlice1d< integer const > const presentComponentIds, + evaluateDerivative( arraySlice1d< real64 const, USD2 > const & kValues, + arraySlice1d< real64 const, USD1 > const & feed, + arraySlice1d< integer const > const & presentComponentIds, real64 const & x ) { real64 value = 0.0; @@ -224,6 +215,38 @@ struct RachfordRice return value; } + /** + * @brief Calculate the minimum and maximum k-value + * @input[in] kValues the array fo K-values + * @input[in] presentComponentIds the indices of components with a non-zero fractions + * @input[out] minK the minimum k-value for non-zero components + * @input[out] maxK the maximum k-value for non-zero components + **/ + template< integer USD > + GEOS_FORCE_INLINE + GEOS_HOST_DEVICE + void + static + findKValueRange( arraySlice1d< real64 const, USD > const & kValues, + arraySlice1d< integer const > const & presentComponentIds, + real64 & minK, + real64 & maxK ) + { + minK = 1.0 / epsilon; + maxK = 0.0; + for( integer const ic : presentComponentIds ) + { + if( kValues[ic] > maxK ) + { + maxK = kValues[ic]; + } + if( kValues[ic] < minK ) + { + minK = kValues[ic]; + } + } + } + }; } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp index 2dec4ae3c57..db04c2cafc4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp @@ -64,6 +64,16 @@ class ComponentProperties final */ integer getNumberOfComponents() const { return m_componentNames.size(); } + /** + * Data accessors + */ + arrayView1d< real64 > const & getComponentMolarWeight() const { return m_componentMolarWeight; } + arrayView1d< real64 > const & getComponentCriticalPressure() const { return m_componentCriticalPressure; } + arrayView1d< real64 > const & getComponentCriticalTemperature() const { return m_componentCriticalTemperature; } + arrayView1d< real64 > const & getComponentCriticalVolume() const { return m_componentCriticalVolume; } + arrayView1d< real64 > const & getComponentAcentricFactor() const { return m_componentAcentricFactor; } + arrayView1d< real64 > const & getComponentVolumeShift() const { return m_componentVolumeShift; } + struct KernelWrapper { KernelWrapper( arrayView1d< real64 const > const & componentMolarWeight, diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp index 50a35083871..da9ec1e02cc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp @@ -25,20 +25,7 @@ namespace constitutive { namespace compositional -{ - -CompositionalDensity::CompositionalDensity( string const & name, - ComponentProperties const & componentProperties ): - FunctionBase( name, componentProperties ) -{} - -CompositionalDensity::KernelWrapper -CompositionalDensity::createKernelWrapper() const -{ - return KernelWrapper(); -} - -} // namespace PVTProps +{} // namespace compositional } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp index 9a7fcf557a1..ea0a9b27319 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp @@ -22,6 +22,8 @@ #include "FunctionBase.hpp" #include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" +#include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp" namespace geos { @@ -32,40 +34,43 @@ namespace constitutive namespace compositional { +template< typename EOS_TYPE > class CompositionalDensityUpdate final : public FunctionBaseUpdate { public: - CompositionalDensityUpdate() = default; + explicit CompositionalDensityUpdate( arrayView1d< real64 const > const & volumeShift ) + : m_componentDimensionalVolumeShift( volumeShift ) + {} - template< int USD1 > + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE void compute( ComponentProperties::KernelWrapper const & componentProperties, real64 const & pressure, real64 const & temperature, arraySlice1d< real64 const, USD1 > const & phaseComposition, real64 & molarDensity, + arraySlice1d< real64, USD2 > const & dMolarDensity, real64 & massDensity, + arraySlice1d< real64, USD2 > const & dMassDensity, bool useMass ) const; - template< int USD1, int USD2, int USD3 > - GEOS_HOST_DEVICE - void compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - arraySlice2d< real64 const, USD2 > const & dPhaseComposition, - real64 & molarDensity, - arraySlice1d< real64, USD3 > const & dMolarDensity, - real64 & massDensity, - arraySlice1d< real64, USD3 > const & dMassDensity, - bool useMass ) const; +private: + arrayView1d< real64 const > m_componentDimensionalVolumeShift; }; +template< typename EOS_TYPE > class CompositionalDensity : public FunctionBase { public: CompositionalDensity( string const & name, - ComponentProperties const & componentProperties ); + ComponentProperties const & componentProperties ) + : FunctionBase( name, componentProperties ) + { + // Calculate the dimensional volume shift + m_componentDimensionalVolumeShift.resize( componentProperties.getNumberOfComponents()); + EOS_TYPE::calculateDimensionalVolumeShift( componentProperties, + m_componentDimensionalVolumeShift ); + } static string catalogName() { return "CompositionalDensity"; } @@ -75,53 +80,68 @@ class CompositionalDensity : public FunctionBase } /// Type of kernel wrapper for in-kernel update - using KernelWrapper = CompositionalDensityUpdate; + using KernelWrapper = CompositionalDensityUpdate< EOS_TYPE >; /** * @brief Create an update kernel wrapper. * @return the wrapper */ - KernelWrapper createKernelWrapper() const; -}; - -template< int USD1 > -GEOS_HOST_DEVICE -void CompositionalDensityUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - real64 & molarDensity, - real64 & massDensity, - bool useMass ) const -{ - GEOS_UNUSED_VAR( componentProperties, pressure, temperature, useMass ); - GEOS_UNUSED_VAR( phaseComposition ); + KernelWrapper createKernelWrapper() const + { + return KernelWrapper( m_componentDimensionalVolumeShift ); + } - massDensity = 1000.0; - molarDensity = massDensity/40.0; -} +private: + array1d< real64 > m_componentDimensionalVolumeShift; +}; -template< int USD1, int USD2, int USD3 > +template< typename EOS_TYPE > +template< integer USD1, integer USD2 > GEOS_HOST_DEVICE -void CompositionalDensityUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - arraySlice2d< real64 const, USD2 > const & dPhaseComposition, - real64 & molarDensity, - arraySlice1d< real64, USD3 > const & dMolarDensity, - real64 & massDensity, - arraySlice1d< real64, USD3 > const & dMassDensity, - bool useMass ) const +void CompositionalDensityUpdate< EOS_TYPE >:: +compute( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 & molarDensity, + arraySlice1d< real64, USD2 > const & dMolarDensity, + real64 & massDensity, + arraySlice1d< real64, USD2 > const & dMassDensity, + bool useMass ) const { - GEOS_UNUSED_VAR( componentProperties, pressure, temperature, useMass ); - GEOS_UNUSED_VAR( phaseComposition, dPhaseComposition ); - - massDensity = 1000.0; - molarDensity = massDensity/40.0; - - LvArray::forValuesInSlice( dMolarDensity, setZero ); - LvArray::forValuesInSlice( dMassDensity, setZero ); + GEOS_UNUSED_VAR( useMass ); + + integer const numComps = componentProperties.m_componentMolarWeight.size(); + integer const numDofs = 2 + numComps; + + real64 compressibilityFactor = 0.0; + stackArray1d< real64, 2+MultiFluidConstants::MAX_NUM_COMPONENTS > tempDerivs( numDofs ); + + EOS_TYPE::computeCompressibilityFactor( numComps, + pressure, + temperature, + phaseComposition, + componentProperties, + compressibilityFactor, + tempDerivs.toSlice() ); + + CompositionalProperties::computeMolarDensity( numComps, + pressure, + temperature, + phaseComposition, + m_componentDimensionalVolumeShift.toSliceConst(), + compressibilityFactor, + tempDerivs.toSlice(), + molarDensity, + dMolarDensity ); + + CompositionalProperties::computeMassDensity( numComps, + phaseComposition, + componentProperties.m_componentMolarWeight.toSliceConst(), + molarDensity, + dMolarDensity.toSliceConst(), + massDensity, + dMassDensity ); } } // end namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp index 45a38d28a11..83948f00cbb 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp @@ -35,27 +35,16 @@ class ConstantViscosityUpdate final : public FunctionBaseUpdate public: ConstantViscosityUpdate() = default; - template< int USD1 > + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE void compute( ComponentProperties::KernelWrapper const & componentProperties, real64 const & pressure, real64 const & temperature, arraySlice1d< real64 const, USD1 > const & phaseComposition, real64 const & density, + arraySlice1d< real64 const, USD2 > const & dDensity, real64 & viscosity, - bool useMass ) const; - - template< int USD1, int USD2, int USD3 > - GEOS_HOST_DEVICE - void compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - arraySlice2d< real64 const, USD2 > const & dPhaseComposition, - real64 const & density, - arraySlice1d< real64 const, USD3 > const & dDensity, - real64 & viscosity, - arraySlice1d< real64, USD3 > const & dViscosity, + arraySlice1d< real64, USD2 > const & dViscosity, bool useMass ) const; }; @@ -82,7 +71,7 @@ class ConstantViscosity : public FunctionBase KernelWrapper createKernelWrapper() const; }; -template< int USD1 > +template< integer USD1, integer USD2 > GEOS_HOST_DEVICE GEOS_FORCE_INLINE void ConstantViscosityUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, @@ -90,32 +79,13 @@ void ConstantViscosityUpdate::compute( ComponentProperties::KernelWrapper const real64 const & temperature, arraySlice1d< real64 const, USD1 > const & phaseComposition, real64 const & density, + arraySlice1d< real64 const, USD2 > const & dDensity, real64 & viscosity, + arraySlice1d< real64, USD2 > const & dViscosity, bool useMass ) const { GEOS_UNUSED_VAR( componentProperties, pressure, temperature, useMass ); GEOS_UNUSED_VAR( phaseComposition ); - GEOS_UNUSED_VAR( density ); - - viscosity = 0.001; -} - -template< int USD1, int USD2, int USD3 > -GEOS_HOST_DEVICE -GEOS_FORCE_INLINE -void ConstantViscosityUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - arraySlice2d< real64 const, USD2 > const & dPhaseComposition, - real64 const & density, - arraySlice1d< real64 const, USD3 > const & dDensity, - real64 & viscosity, - arraySlice1d< real64, USD3 > const & dViscosity, - bool useMass ) const -{ - GEOS_UNUSED_VAR( componentProperties, pressure, temperature, useMass ); - GEOS_UNUSED_VAR( phaseComposition, dPhaseComposition ); GEOS_UNUSED_VAR( density, dDensity ); viscosity = 0.001; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp new file mode 100644 index 00000000000..e9b3f1b4043 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp @@ -0,0 +1,51 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LohrenzBrayClarkViscosity.cpp + */ + +#include "LohrenzBrayClarkViscosity.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" +#include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +LohrenzBrayClarkViscosityUpdate::LohrenzBrayClarkViscosityUpdate( MixingType const mixing_type ) + : m_mixing_type( mixing_type ) +{} + +LohrenzBrayClarkViscosity::LohrenzBrayClarkViscosity( string const & name, + ComponentProperties const & componentProperties ): + FunctionBase( name, componentProperties ) +{} + +LohrenzBrayClarkViscosity::KernelWrapper +LohrenzBrayClarkViscosity::createKernelWrapper() const +{ + return KernelWrapper( m_mixing_type ); +} + +} // end namespace compositional + +} // namespace constitutive + +} // end namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp new file mode 100644 index 00000000000..647fa663e15 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp @@ -0,0 +1,304 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LohrenzBrayClarkViscosity.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_LOHRENZBRAYCLARKVISCOSITY_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_LOHRENZBRAYCLARKVISCOSITY_HPP_ + +#include "FunctionBase.hpp" +#include "codingUtilities/EnumStrings.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +class LohrenzBrayClarkViscosityUpdate final : public FunctionBaseUpdate +{ +public: +/** + * @brief Mixing types for phase viscosity + */ + enum class MixingType : integer + { + HERNING_ZIPPERER, + WILKE, + BROKAW + }; + +public: + explicit LohrenzBrayClarkViscosityUpdate( MixingType const mixing_type ); + + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void compute( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 const & density, + arraySlice1d< real64 const, USD2 > const & dDensity, + real64 & viscosity, + arraySlice1d< real64, USD2 > const & dViscosity, + bool useMass ) const; + + GEOS_HOST_DEVICE + void setMixingType( MixingType const mixing_type ) + { + m_mixing_type = mixing_type; + } + +private: + /** + * @brief Estimate pure component properties at dilute-gas conditions + * @details This estimates pure component properties at dilute-gas conditions (pressure near atmospheric) using + * Stiel and Thodos [1961] correlation: https://doi.org/10.1002/aic.690070416 + * Dilute viscosity is solely temperature dependent + * Units are converted so componentViscosity is in centipoise to match original reference + * @param[in] numComponents The number of components + * @param[in] componentProperties Physical properties of the components + * @param[in] temperature The temperature + * @param[out] componentDiluteViscosity The compoment dilute viscosity + * @param[out] dComponentDiluteViscosity_dTemperature The derivatives of compoment dilute viscosity w.r.t. temperature + */ + GEOS_HOST_DEVICE + void computeComponentDiluteViscosity_StielThodos( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 > const componentDiluteViscosity, + arraySlice1d< real64 > const dComponentDiluteViscosity_dTemperature ) const + { + for( integer ic = 0; ic < numComponents; ++ic ) + { + real64 const criticalPressure = componentProperties.m_componentCriticalPressure[ic]; + real64 const criticalTemperature = componentProperties.m_componentCriticalTemperature[ic]; + real64 const molarWeight = componentProperties.m_componentMolarWeight[ic]; + + real64 reducedTemperature = temperature / criticalTemperature; + real64 inverseComponentChi = 0.0; + real64 discardDerivative = 0.0; + inverseChiParameter( criticalPressure, criticalTemperature, molarWeight, inverseComponentChi, + discardDerivative, discardDerivative, discardDerivative ); + + if( molarWeight < 2.1e-3 ) // hydrogen correlation, Stiel & Thodos, 1961, Eq. 12 + { + componentDiluteViscosity[ic] = 90.71e-5 * pow( 0.1375*temperature - 1.67, 0.625 ); + dComponentDiluteViscosity_dTemperature[ic] = 90.71e-5 * 0.625 * 0.1375 * pow( 0.1375*temperature - 1.67, -0.375 ); + } + else if( reducedTemperature <= 1.5 ) // nonpolar gas correlation at low temp, Eq. 9 + { + componentDiluteViscosity[ic] = 34e-5 * pow( reducedTemperature, 0.94 ) * inverseComponentChi; + dComponentDiluteViscosity_dTemperature[ic] = 34e-5 * 0.94 * pow( reducedTemperature, -0.06 ) * inverseComponentChi / criticalTemperature; + } + else // nonpolar gas correlation at high temp, Eq. 10 + { + componentDiluteViscosity[ic] = 17.78e-5 * pow( 4.58*reducedTemperature-1.67, 0.625 ) * inverseComponentChi; + dComponentDiluteViscosity_dTemperature[ic] = 17.78e-5 * 4.58 * 0.625 * pow( 4.58*reducedTemperature-1.67, -0.375 ) * inverseComponentChi / criticalTemperature; + } + } + } + + /** + * @brief Estimate phase viscosity at dilute-gas conditions using Herning and Zipperer [1936] + * @details This estimates the phase viscosity properties at dilute-gas conditions (pressure near atmospheric) using + * Herning and Zipperer [1936] mixing rule. + * Herning, F. and Zipperer, L,: “Calculation of the Viscosity of Technical Gas Mixtures from the + * Viscosity of Individual Gases, german”, Gas u. Wasserfach (1936) 79, No. 49, 69. + * @param[in] numComponents The number of components + * @param[in] componentProperties Physical properties of the components + * @param[in] temperature The temperature + * @param[in] phaseComposition The composition of the phase + * @param[in] componentDiluteViscosity The compoment dilute viscosity + * @param[in] dComponentDiluteViscosity_dTemperature The derivatives of compoment dilute viscosity w.r.t. temperature + * @param[out] phaseViscosity The phase viscosity + * @param[out] dPhaseViscosity The phase viscosity derivatives + */ + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void computePhaseDiluteViscosity_HerningZipperer( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const; + + /** + * @brief Estimate phase viscosity at dilute-gas conditions using Wilke [1950] + * @details This estimates the phase viscosity properties at dilute-gas conditions (pressure near atmospheric) using + * Wilke [1950] mixing rule. https://doi.org/10.1063/1.1747673 + * @param[in] numComponents The number of components + * @param[in] componentProperties Physical properties of the components + * @param[in] temperature The temperature + * @param[in] phaseComposition The composition of the phase + * @param[in] componentDiluteViscosity The compoment dilute viscosity + * @param[in] dComponentDiluteViscosity_dTemperature The derivatives of compoment dilute viscosity w.r.t. temperature + * @param[out] phaseViscosity The phase viscosity + * @param[out] dPhaseViscosity The phase viscosity derivatives + */ + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void computePhaseDiluteViscosity_Wilke( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const; + + /** + * @brief Estimate phase viscosity at dilute-gas conditions using Brokaw[1968] + * @details This estimates the phase viscosity properties at dilute-gas conditions (pressure near atmospheric) using + * Brokaw[1968] mixing rule. + * Brokaw, R. S. (1968). Viscosity of Gas Mixtures. United States: National Aeronautics and Space Administration. + * @param[in] numComponents The number of components + * @param[in] componentProperties Physical properties of the components + * @param[in] temperature The temperature + * @param[in] phaseComposition The composition of the phase + * @param[in] componentDiluteViscosity The compoment dilute viscosity + * @param[in] dComponentDiluteViscosity_dTemperature The derivatives of compoment dilute viscosity w.r.t. temperature + * @param[out] phaseViscosity The phase viscosity + * @param[out] dPhaseViscosity The phase viscosity derivatives + */ + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void computePhaseDiluteViscosity_Brokaw( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const; + + /** + * @brief Estimates phase viscosity using Lohrenz, Bray & Clark [1964] + * @details This estimates the phase viscosity at given (P,T) conditions using the Lohrenz, Bray & Clark [1964] correlation. + * This is an additional term added to the dilute gas estimate. + * https://doi.org/10.2118/915-PA + * @param[in] numComponents The number of components + * @param[in] componentProperties Physical properties of the components + * @param[in] phaseComposition The composition of the phase + * @param[in] phaseDensity The phase density + * @param[in] dPhaseDensity The derivatives of the phase density + * @param[out] phaseViscosity The phase viscosity + * @param[out] dPhaseViscosity The phase viscosity derivatives + */ + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void computePhaseViscosity_LohrenzBrayClark( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 const phaseDensity, + arraySlice1d< real64 const, USD2 > const & dPhaseDensity, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const; + + /** + * @brief Computes inverse chi parameter + * @details Computes "1/chi" parameter (inverse of the viscosity-reducing parameter) from [ST 1961, LBC 1964]. + * Using units of (K, atm, amu). + * @param[in] criticalPressure The component critical pressure + * @param[in] criticalTemperature The component critical temperature + * @param[in] molarWeight The component molar weight + * @param[out] value The inverse chi parameter + * @param[out] derivP Derivative of the inverse chi parameter w.r.t. pressure + * @param[out] derivT Derivative of the inverse chi parameter w.r.t. temperature + * @param[out] derivM Derivative of the inverse chi parameter w.r.t. molar weight + */ + GEOS_HOST_DEVICE + void inverseChiParameter( real64 const criticalPressure, + real64 const criticalTemperature, + real64 const molarWeight, + real64 & value, + real64 & derivP, + real64 & derivT, + real64 & derivM ) const + { + real64 T = pow( criticalTemperature, 1.0/6.0 ); + real64 dT = (1.0/6.0) * pow( criticalTemperature, -5.0/6.0 ); + + real64 constexpr sqrt1000 = 31.6227766017; // note: kg/mol to atomic mass units + real64 M = sqrt1000 * sqrt( molarWeight ); + real64 dM = 0.5 * sqrt1000 / sqrt( molarWeight ); + + real64 P = pow( criticalPressure / PA_TO_ATM, 2.0/3.0 ); // note: pascal to atm conversion + real64 dP = pow( PA_TO_ATM, -2.0/3.0 ) * pow( criticalPressure, -1.0/3.0 ) * 2.0/3.0; + + value = M*P/T; + derivP = M*dP/T; + derivT = -M*P*dT/(T*T); + derivM = dM*P/T; + } + +private: + MixingType m_mixing_type; + +private: + // Conversion factor from cP to Pa.s + static constexpr real64 CP_TO_PAS = 1.0e-3; + // Conversion from Pa to atm + static constexpr real64 PA_TO_ATM = 1.01325e+5; +}; + +class LohrenzBrayClarkViscosity : public FunctionBase +{ +public: + LohrenzBrayClarkViscosity( string const & name, + ComponentProperties const & componentProperties ); + + static string catalogName() { return "LBC"; } + + FunctionType functionType() const override + { + return FunctionType::VISCOSITY; + } + + /// Type of kernel wrapper for in-kernel update + using KernelWrapper = LohrenzBrayClarkViscosityUpdate; + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelWrapper() const; + +private: + LohrenzBrayClarkViscosityUpdate::MixingType m_mixing_type{LohrenzBrayClarkViscosityUpdate::MixingType::HERNING_ZIPPERER}; +}; + +/// Declare strings associated with enumeration values. +ENUM_STRINGS( LohrenzBrayClarkViscosityUpdate::MixingType, + "Herning-Zipperer", + "Wilke", + "Brokaw" ); + +} // end namespace compositional + +} // end namespace constitutive + +} // end namespace geos + +// Implementation +#include "LohrenzBrayClarkViscosityImpl.hpp" + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_LOHRENZBRAYCLARKVISCOSITY_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp new file mode 100644 index 00000000000..3811c5950d9 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp @@ -0,0 +1,408 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LohrenzBrayClarkViscosityImpl.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_LOHRENZBRAYCLARKVISCOSITYIMPL_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_LOHRENZBRAYCLARKVISCOSITYIMPL_HPP_ + +#include "LohrenzBrayClarkViscosity.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" +#include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +void LohrenzBrayClarkViscosityUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 const & density, + arraySlice1d< real64 const, USD2 > const & dDensity, + real64 & viscosity, + arraySlice1d< real64, USD2 > const & dViscosity, + bool useMass ) const +{ + GEOS_UNUSED_VAR( pressure ); // No-direct pressure dependence (instead through density) + GEOS_UNUSED_VAR( useMass ); + + integer constexpr maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + integer constexpr maxNumDofs = MultiFluidConstants::MAX_NUM_COMPONENTS + 2; + integer const numComponents = componentProperties.m_componentMolarWeight.size(); + integer const numDofs = numComponents + 2; + + // Space for temporary variable derivatives + stackArray1d< real64, maxNumDofs > tempDerivs( numDofs ); + + // Estimate pure component properties at dilute-gas conditions (pressure near atmospheric) using + // Stiel and Thodos [1961] correlation: https://doi.org/10.1002/aic.690070416 + // Dilute viscosity is solely temperature dependent + // Units are converted so componentViscosity is in centipoise to match original reference + + stackArray1d< real64, maxNumComps > componentDiluteViscosity( numComponents ); + + computeComponentDiluteViscosity_StielThodos( numComponents, + componentProperties, + temperature, + componentDiluteViscosity, + tempDerivs ); + + // Estimate phase viscosity (in cp) at dilute gas conditions using either + // the Herning and Zipperer [1936], Wilke [1950], or Brokaw[1968] mixture rule. + // The classic LBC model uses Herning-Zipperer, but the other two may be more accurate. + + if( m_mixing_type == MixingType::HERNING_ZIPPERER ) + { + computePhaseDiluteViscosity_HerningZipperer( numComponents, + componentProperties, + temperature, + phaseComposition, + componentDiluteViscosity, + tempDerivs, + viscosity, + dViscosity ); + } + else if( m_mixing_type == MixingType::WILKE ) + { + computePhaseDiluteViscosity_Wilke( numComponents, + componentProperties, + temperature, + phaseComposition, + componentDiluteViscosity, + tempDerivs, + viscosity, + dViscosity ); + } + else if( m_mixing_type == MixingType::BROKAW ) + { + computePhaseDiluteViscosity_Brokaw( numComponents, + componentProperties, + temperature, + phaseComposition, + componentDiluteViscosity, + tempDerivs, + viscosity, + dViscosity ); + } + + // Estimate phase viscosity at given (P,T) conditions using LBC [1964] correlation. + // This is an additional term added to the dilute gas estimate above. + computePhaseViscosity_LohrenzBrayClark( numComponents, + componentProperties, + phaseComposition, + density, + dDensity, + viscosity, + dViscosity ); + + // Scale centipoise to pascal.seconds + viscosity *= CP_TO_PAS; + for( integer kc = 0; kc < numDofs; ++kc ) + { + dViscosity[kc] *= CP_TO_PAS; + } +} + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +void LohrenzBrayClarkViscosityUpdate::computePhaseDiluteViscosity_HerningZipperer( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const +{ + using Deriv = multifluid::DerivativeOffset; + GEOS_UNUSED_VAR( temperature ); + + real64 A = 0.0; + real64 dA_dT = 0.0; + real64 B = 0.0; + + for( integer ic = 0; ic < numComponents; ++ic ) + { + real64 const sqrtMolarWeight = sqrt( componentProperties.m_componentMolarWeight[ic] ); + A += phaseComposition[ic] * sqrtMolarWeight * componentDiluteViscosity[ic]; + B += phaseComposition[ic] * sqrtMolarWeight; + dA_dT += phaseComposition[ic] * sqrtMolarWeight * dComponentDiluteViscosity_dTemperature[ic]; + } + + phaseViscosity = A/B; + dPhaseViscosity[Deriv::dP] = 0.0; + dPhaseViscosity[Deriv::dT] = dA_dT/B; + + for( integer ic = 0; ic < numComponents; ++ic ) + { + real64 const sqrtMolarWeight = sqrt( componentProperties.m_componentMolarWeight[ic] ); + real64 const dA_dxi = sqrtMolarWeight * componentDiluteViscosity[ic]; + real64 const dB_dxi = sqrtMolarWeight; + dPhaseViscosity[Deriv::dC+ic] = dA_dxi / B - A * dB_dxi / (B * B); + } +} + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +void LohrenzBrayClarkViscosityUpdate::computePhaseDiluteViscosity_Wilke( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const +{ + using Deriv = multifluid::DerivativeOffset; + GEOS_UNUSED_VAR( temperature ); + + // compute the "phi" interaction matrix (and its temperature derivatives) + integer constexpr maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + stackArray2d< real64, maxNumComps *maxNumComps > phi( numComponents, numComponents ); + stackArray2d< real64, maxNumComps *maxNumComps > dPhi_dT( numComponents, numComponents ); + + LvArray::forValuesInSlice( phi.toSlice(), setZero ); + LvArray::forValuesInSlice( dPhi_dT.toSlice(), setZero ); + + for( integer ic = 0; ic < numComponents; ++ic ) + { + for( integer jc = 0; jc < numComponents; ++jc ) + { + real64 const mw_i = componentProperties.m_componentMolarWeight[ic]; + real64 const mw_j = componentProperties.m_componentMolarWeight[jc]; + + real64 const weightRatio = mw_i / mw_j; + + real64 const invVisc_j = 1.0 / componentDiluteViscosity[jc]; + real64 const viscosityRatio = componentDiluteViscosity[ic] * invVisc_j; + + real64 const dViscosityRatio_dT = dComponentDiluteViscosity_dTemperature[ic] * invVisc_j + - componentDiluteViscosity[ic] * dComponentDiluteViscosity_dTemperature[jc] * invVisc_j * invVisc_j; + + real64 const A = 1.0 + sqrt( viscosityRatio )*pow( weightRatio, -0.25 ); + real64 const dA_dT = 0.5*pow( weightRatio, -0.25 )/sqrt( viscosityRatio )*dViscosityRatio_dT; + + real64 const B = A*A; + real64 const dB_dT = 2.0*A*dA_dT; + real64 const C = sqrt( 8.0 )*sqrt( 1.0 + weightRatio ); + + phi( ic, jc ) = B/C; + dPhi_dT( ic, jc ) = dB_dT/C; + } + } + + // compute phase viscosity via Wilke mixing rule + + phaseViscosity = 0; + LvArray::forValuesInSlice( dPhaseViscosity, setZero ); + + for( integer ic = 0; ic < numComponents; ++ic ) + { + real64 A = 0; + real64 dA_dT = 0; + + for( integer jc = 0; jc < numComponents; ++jc ) + { + A += phi( ic, jc )*phaseComposition[jc]; + dA_dT += dPhi_dT( ic, jc )*phaseComposition[jc]; + } + + phaseViscosity += phaseComposition[ic] * componentDiluteViscosity[ic] / A; + dPhaseViscosity[Deriv::dT] += phaseComposition[ic] * dComponentDiluteViscosity_dTemperature[ic] / A + - phaseComposition[ic] * componentDiluteViscosity[ic] / (A*A) * dA_dT; + + dPhaseViscosity[Deriv::dC+ic] += componentDiluteViscosity[ic] / A; + + // the following is some tricky loop merging. the derivatives for other components "jc" will depend on the value of A + // computed above for component "ic", so we add these entries for other derivatives immediately. + + for( integer jc = 0; jc < numComponents; ++jc ) + { + dPhaseViscosity[Deriv::dC+jc] -= phaseComposition[ic] * componentDiluteViscosity[ic] / (A*A) * phi( ic, jc ); + } + } +} + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +void LohrenzBrayClarkViscosityUpdate::computePhaseDiluteViscosity_Brokaw( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + arraySlice1d< real64 const > const & componentDiluteViscosity, + arraySlice1d< real64 const > const & dComponentDiluteViscosity_dTemperature, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const +{ + using Deriv = multifluid::DerivativeOffset; + GEOS_UNUSED_VAR( temperature ); + + // Compute the "phi" interaction matrix (constant, as only function of molecular weights) + integer constexpr maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + stackArray2d< real64, maxNumComps *maxNumComps > phi( numComponents, numComponents ); + + LvArray::forValuesInSlice( phi.toSlice(), setZero ); + + for( integer ic = 0; ic < numComponents; ++ic ) + { + for( integer jc = 0; jc < ic; ++jc ) + { + real64 const mw_i = componentProperties.m_componentMolarWeight[ic]; + real64 const mw_j = componentProperties.m_componentMolarWeight[jc]; + real64 const A = mw_i / mw_j; + real64 const B = pow( 4.0*mw_i*mw_j/((mw_i+mw_j)*(mw_i+mw_j)), 0.25 ); + real64 const A45 = pow( A, 0.45 ); + + phi( ic, jc ) = B/sqrt( A ) * (1.0 + (A-A45)/(2.0 + 2.0*A + B*(1+A45) / (1+B))); + phi( jc, ic ) = phi( ic, jc ); + } + phi( ic, ic ) = 1.0; + } + + phaseViscosity = 0.0; + LvArray::forValuesInSlice( dPhaseViscosity, setZero ); + + for( integer ic = 0; ic < numComponents; ++ic ) + { + real64 A = 0; + real64 dA_dT = 0; + + for( integer jc = 0; jc < numComponents; ++jc ) + { + real64 const aij = phi( ic, jc )*phaseComposition[jc] / sqrt( componentDiluteViscosity[jc] ); + A += aij; + dA_dT -= 0.5*aij*dComponentDiluteViscosity_dTemperature[jc] / componentDiluteViscosity[jc]; + } + + real64 const sqrtComponentDiluteViscosity = sqrt( componentDiluteViscosity[ic] ); + phaseViscosity += phaseComposition[ic] * sqrtComponentDiluteViscosity / A; + + dPhaseViscosity[Deriv::dT] += 0.5*phaseComposition[ic] / sqrtComponentDiluteViscosity * dComponentDiluteViscosity_dTemperature[ic] / A + - phaseComposition[ic] * sqrtComponentDiluteViscosity / (A*A) * dA_dT; + + dPhaseViscosity[Deriv::dC+ic] += sqrtComponentDiluteViscosity / A; + + // the following is some tricky loop merging. the derivatives for other components "jc" will depend on the value of A + // computed above for component "ic", so we add these entries for other derivatives immediately. + + for( integer jc = 0; jc < numComponents; ++jc ) + { + dPhaseViscosity[Deriv::dC+jc] -= phaseComposition[ic] * phi( ic, jc ) * sqrt( componentDiluteViscosity[ic]/componentDiluteViscosity[jc] ) / (A*A); + } + } +} + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +void LohrenzBrayClarkViscosityUpdate::computePhaseViscosity_LohrenzBrayClark( integer const numComponents, + ComponentProperties::KernelWrapper const & componentProperties, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 const phaseDensity, + arraySlice1d< real64 const, USD2 > const & dPhaseDensity, + real64 & phaseViscosity, + arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const +{ + using Deriv = multifluid::DerivativeOffset; + // Compute phase pseudo properties via Kay's mixing rule + real64 phaseCriticalPressure = 0.0; + real64 phaseCriticalTemperature = 0.0; + real64 phaseCriticalVolume = 0.0; + real64 phaseMolarWeight = 0.0; + + auto const & criticalPressure = componentProperties.m_componentCriticalPressure; + auto const & criticalTemperature = componentProperties.m_componentCriticalTemperature; + auto const & criticalVolume = componentProperties.m_componentCriticalVolume; + auto const & molarWeight = componentProperties.m_componentMolarWeight; + + for( integer ic = 0; ic < numComponents; ++ic ) + { + phaseCriticalPressure += phaseComposition[ic] * criticalPressure[ic]; + phaseCriticalTemperature += phaseComposition[ic] * criticalTemperature[ic]; + phaseCriticalVolume += phaseComposition[ic] * criticalVolume[ic]; + phaseMolarWeight += phaseComposition[ic] * molarWeight[ic]; + } + + // Compute LBC polynomial + + real64 reducedDensity = phaseDensity * phaseCriticalVolume / phaseMolarWeight; + real64 inversePhaseChi, dInversePhaseChi_dPc, dInversePhaseChi_dTc, dInversePhaseChi_dMw; + + inverseChiParameter( phaseCriticalPressure, + phaseCriticalTemperature, + phaseMolarWeight, + inversePhaseChi, + dInversePhaseChi_dPc, + dInversePhaseChi_dTc, + dInversePhaseChi_dMw ); + + real64 polynomialOne = 0.1023000 + + 0.0233640*reducedDensity + + 0.0585330*pow( reducedDensity, 2 ) + - 0.0407580*pow( reducedDensity, 3 ) + + 0.0093324*pow( reducedDensity, 4 ); + + real64 polynomialTwo = pow( polynomialOne, 4.0 ) - 1.0e-4; + + // add polynomial contribution to dilute term to get final phase viscosity + + phaseViscosity += polynomialTwo * inversePhaseChi; + + // get derivatives, noting phaseDensity is a function of (pressure, temperature, composition) + // and inversePhaseChi is a function of composition. + // these derivatives are *added* to the ones already present from the dilute terms above. + + real64 dPolynomialOne_dReducedDensity = 0.0233640 + + 0.1170660*reducedDensity + - 0.1222740*pow( reducedDensity, 2 ) + + 0.0373296*pow( reducedDensity, 3 ); + real64 dPolynomialTwo_dReducedDensity = 4.0 * pow( polynomialOne, 3.0 ) * dPolynomialOne_dReducedDensity; + + real64 dViscosity_dDensity = dPolynomialTwo_dReducedDensity * inversePhaseChi * phaseCriticalVolume / phaseMolarWeight; + real64 dViscosity_dCriticalRatio = dPolynomialTwo_dReducedDensity * inversePhaseChi * phaseDensity; + + real64 dViscosity_dPc = polynomialTwo * dInversePhaseChi_dPc; + real64 dViscosity_dTc = polynomialTwo * dInversePhaseChi_dTc; + real64 dViscosity_dMw = polynomialTwo * dInversePhaseChi_dMw - dViscosity_dCriticalRatio * phaseCriticalVolume / pow( phaseMolarWeight, 2 ); + real64 dViscosity_dVc = dViscosity_dCriticalRatio / phaseMolarWeight; + + dPhaseViscosity[Deriv::dP] += dViscosity_dDensity * dPhaseDensity[Deriv::dP]; + dPhaseViscosity[Deriv::dT] += dViscosity_dDensity * dPhaseDensity[Deriv::dT]; + + for( integer ic = 0; ic < numComponents; ++ic ) + { + dPhaseViscosity[Deriv::dC+ic] += dViscosity_dDensity * dPhaseDensity[Deriv::dC+ic] + + dViscosity_dPc * criticalPressure[ic] + + dViscosity_dTc * criticalTemperature[ic] + + dViscosity_dMw * molarWeight[ic] + + dViscosity_dVc * criticalVolume[ic]; + } +} + +} // end namespace compositional + +} // namespace constitutive + +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_LOHRENZBRAYCLARKVISCOSITYIMPL_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp index 48048202020..836694ac9fb 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp @@ -45,13 +45,17 @@ template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > typename NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >::KernelWrapper NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >::createKernelWrapper() const { - return KernelWrapper( m_componentProperties.getNumberOfComponents() ); + return KernelWrapper( m_componentProperties.getNumberOfComponents(), 0, 1 ); } template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > NegativeTwoPhaseFlashModelUpdate< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >:: -NegativeTwoPhaseFlashModelUpdate( integer const numComponents ): - m_numComponents( numComponents ) +NegativeTwoPhaseFlashModelUpdate( integer const numComponents, + integer const liquidIndex, + integer const vapourIndex ): + m_numComponents( numComponents ), + m_liquidIndex( liquidIndex ), + m_vapourIndex( vapourIndex ) {} // Explicit instantiation of the model template. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp index e9d6d17ef6c..d9a50bb0f9c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -24,6 +24,7 @@ #include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" #include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp" namespace geos { @@ -42,54 +43,61 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate using PhaseProp = MultiFluidVar< real64, 3, multifluid::LAYOUT_PHASE, multifluid::LAYOUT_PHASE_DC >; using PhaseComp = MultiFluidVar< real64, 4, multifluid::LAYOUT_PHASE_COMP, multifluid::LAYOUT_PHASE_COMP_DC >; - explicit NegativeTwoPhaseFlashModelUpdate( integer const numComponents ); + NegativeTwoPhaseFlashModelUpdate( integer const numComponents, + integer const liquidIndex, + integer const vapourIndex ); // Mark as a 2-phase flash GEOS_HOST_DEVICE static constexpr integer getNumberOfPhases() { return 2; } - template< int USD1, int USD2, int USD3 > - GEOS_HOST_DEVICE - void compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & compFraction, - arraySlice1d< real64, USD2 > const & phaseFraction, - arraySlice2d< real64, USD3 > const & phaseCompFraction ) const - { - GEOS_UNUSED_VAR( componentProperties, pressure, temperature ); - // TODO: Constant values for now. To be linked with the static function call - phaseFraction[m_liquidIndex] = 0.5; - phaseFraction[m_vapourIndex] = 0.5; - for( integer ic = 0; ic < m_numComponents; ++ic ) - { - phaseCompFraction[m_liquidIndex][ic] = compFraction[ic]; - phaseCompFraction[m_vapourIndex][ic] = compFraction[ic]; - } - } - - template< int USD1 > + template< int USD1, int USD2 > GEOS_HOST_DEVICE void compute( ComponentProperties::KernelWrapper const & componentProperties, real64 const & pressure, real64 const & temperature, arraySlice1d< real64 const, USD1 > const & compFraction, + arraySlice2d< real64, USD2 > const & kValues, PhaseProp::SliceType const phaseFraction, PhaseComp::SliceType const phaseCompFraction ) const { - GEOS_UNUSED_VAR( componentProperties, pressure, temperature ); - - // TODO: Constant values for now. To be linked with the static function call - phaseFraction.value[m_liquidIndex] = 0.5; - phaseFraction.value[m_vapourIndex] = 0.5; - for( integer ic = 0; ic < m_numComponents; ++ic ) + integer const numDofs = 2 + m_numComponents; + + // Iterative solve to converge flash + bool const flashStatus = NegativeTwoPhaseFlash::compute< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >( + m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + kValues, + phaseFraction.value[m_vapourIndex], + phaseCompFraction.value[m_liquidIndex], + phaseCompFraction.value[m_vapourIndex] ); + GEOS_UNUSED_VAR( flashStatus ); + //GEOS_ERROR_IF( !flashStatus, + // GEOS_FMT( "Negative two phase flash failed to converge {:.5e} {:.3f}", pressure, temperature )); + + // Calculate derivatives + NegativeTwoPhaseFlash::computeDerivatives< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >( + m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + phaseFraction.value[m_vapourIndex], + phaseCompFraction.value[m_liquidIndex].toSliceConst(), + phaseCompFraction.value[m_vapourIndex].toSliceConst(), + phaseFraction.derivs[m_vapourIndex], + phaseCompFraction.derivs[m_liquidIndex], + phaseCompFraction.derivs[m_vapourIndex] ); + + // Complete by calculating liquid phase fraction + phaseFraction.value[m_liquidIndex] = 1.0 - phaseFraction.value[m_vapourIndex]; + for( integer ic = 0; ic < numDofs; ic++ ) { - phaseCompFraction.value[m_liquidIndex][ic] = compFraction[ic]; - phaseCompFraction.value[m_vapourIndex][ic] = compFraction[ic]; + phaseFraction.derivs[m_liquidIndex][ic] = -phaseFraction.derivs[m_vapourIndex][ic]; } - - LvArray::forValuesInSlice( phaseFraction.derivs, setZero ); - LvArray::forValuesInSlice( phaseCompFraction.derivs, setZero ); } private: diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp index 00eae8f5948..46ed03f89b9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp @@ -35,18 +35,6 @@ class NullModelUpdate final : public FunctionBaseUpdate public: NullModelUpdate() = default; - template< int USD1 > - GEOS_HOST_DEVICE - void compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - real64 & value, - bool useMass ) const - { - GEOS_UNUSED_VAR( componentProperties, pressure, temperature, phaseComposition, value, useMass ); - } - template< int USD1, int USD2, int USD3 > GEOS_HOST_DEVICE void compute( ComponentProperties::KernelWrapper const & componentProperties, diff --git a/src/coreComponents/constitutive/unitTests/CMakeLists.txt b/src/coreComponents/constitutive/unitTests/CMakeLists.txt index add6c460a3f..10625ef6df4 100644 --- a/src/coreComponents/constitutive/unitTests/CMakeLists.txt +++ b/src/coreComponents/constitutive/unitTests/CMakeLists.txt @@ -1,12 +1,15 @@ # Specify list of tests set( gtest_geosx_tests + testCompositionalDensity.cpp testCompositionalProperties.cpp testDamageUtilities.cpp testDruckerPrager.cpp testElasticIsotropic.cpp testKValueInitialization.cpp + testLohrenzBrayClarkViscosity.cpp testModifiedCamClay.cpp testNegativeTwoPhaseFlash.cpp + testNegativeTwoPhaseFlash9Comp.cpp testParticleFluidEnums.cpp testPropertyConversions.cpp testCubicEOS.cpp diff --git a/src/coreComponents/constitutive/unitTests/TestFluid.hpp b/src/coreComponents/constitutive/unitTests/TestFluid.hpp index e9f2f1fbf76..c0d8cbb2d1c 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluid.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluid.hpp @@ -44,12 +44,12 @@ struct Fluid static constexpr integer C8 = 9; static constexpr integer C10 = 10; - static constexpr integer Pc = 0; - static constexpr integer Tc = 1; - static constexpr integer Vc = 2; - static constexpr integer Ac = 3; - static constexpr integer Mw = 4; - static constexpr integer Vs = 5; + static constexpr integer Pc = 0; // Critical pressure + static constexpr integer Tc = 1; // Critical temperature + static constexpr integer Vc = 2; // Critical colume + static constexpr integer Ac = 3; // Accentric factor + static constexpr integer Mw = 4; // Molecular weight + static constexpr integer Vs = 5; // Volume shift static std::array< real64, 66 > data; }; @@ -66,6 +66,10 @@ class TestFluid static std::unique_ptr< TestFluid< NC > > create( std::array< integer, NC > const & components ) { std::unique_ptr< TestFluid< NC > > testFluid( new TestFluid() ); + for( integer ic = 0; ic < NC; ++ic ) + { + testFluid->componentNames.emplace_back( GEOS_FMT( "COMP{}", ic+1 )); + } createArray( testFluid->criticalPressure, components, Fluid::Pc, Fluid::data ); createArray( testFluid->criticalTemperature, components, Fluid::Tc, Fluid::data ); createArray( testFluid->criticalVolume, components, Fluid::Vc, Fluid::data ); @@ -76,21 +80,48 @@ class TestFluid return testFluid; } - constitutive::compositional::ComponentProperties::KernelWrapper createKernelWrapper() const + template< typename LIST > + void setBinaryCoefficients( LIST const & bics ) { - return constitutive::compositional::ComponentProperties::KernelWrapper( - molecularWeight, - criticalPressure, - criticalTemperature, - criticalVolume, - acentricFactor, - volumeShift, - binaryCoeff ); + auto bic = bics.begin(); + for( int i = 0; i < NC; ++i ) + { + for( int j = 0; j < i; ++j ) + { + binaryCoeff( i, j ) = *bic++; + binaryCoeff( j, i ) = binaryCoeff( i, j ); + } + binaryCoeff( i, i ) = 0.0; + } + } + + constitutive::compositional::ComponentProperties & getComponentProperties() + { + if( !m_component_properties ) + { + m_component_properties = std::make_unique< constitutive::compositional::ComponentProperties >( + componentNames, + molecularWeight, + criticalPressure, + criticalTemperature, + criticalVolume, + acentricFactor, + volumeShift, + binaryCoeff ); + } + return *m_component_properties; + } + + constitutive::compositional::ComponentProperties::KernelWrapper createKernelWrapper() + { + return getComponentProperties().createKernelWrapper(); } private: TestFluid() = default; +public: + string_array componentNames; array1d< real64 > criticalPressure; array1d< real64 > criticalTemperature; array1d< real64 > criticalVolume; @@ -99,6 +130,9 @@ class TestFluid array1d< real64 > volumeShift; array2d< real64 > binaryCoeff; +private: + std::unique_ptr< constitutive::compositional::ComponentProperties > m_component_properties{}; + private: template< typename ARRAY, typename LIST, typename DATAARRAY > static void createArray( ARRAY & array, LIST const & indices, integer const row, DATAARRAY const & data ) @@ -117,6 +151,15 @@ class TestFluid array.emplace_back( value ); } } + template< typename ARRAY, typename LIST > + static void populateArray( ARRAY & array, LIST const & data ) + { + integer i = 0; + for( auto const value : data ) + { + array[i++] = value; + } + } }; std::array< real64, 66 > Fluid::data = { @@ -133,8 +176,8 @@ std::array< real64, 66 > Fluid::data = { 3.4400e-01, 2.3900e-01, 4.0000e-02, 9.4200e-02, -2.1900e-01, 9.9500e-02, 1.5230e-01, 1.8440e-01, 1.1400e-02, 4.4300e-01, 8.1600e-01, // -- Mw - 1.8015e+01, 4.4010e+01, 2.8013e+01, 3.4100e+01, 1.6043e+01, 3.0070e+01, - 4.4097e+01, 5.8124e+01, 7.2151e+01, 1.1423e+02, 1.4228e+02, + 1.8015e-02, 4.4010e-02, 2.8013e-02, 3.4100e-02, 1.6043e-02, 3.0070e-02, + 4.4097e-02, 5.8124e-02, 7.2151e-02, 1.1423e-01, 1.4228e-01, // -- Vs 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, diff --git a/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp b/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp index ec2cea463ca..c608334e028 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp @@ -59,6 +59,59 @@ void testNumericalDerivative( real64 const x, real64 const dx, real64 const deri checkRelativeError( derivative, rightDerivative, relTolerance, absTolerance, "Right derivative" ); } +/** + * @brief Tests a multi-valued function against a derivative + * @details Will calculate the left-sided and the right-sided numerical derivatives of a function + * and compare this against a analytically calculated values provided. + * @tparam numValues the number of values that the function returns + * @tparam FUNCTION the type of function (typically a lambda) + * @param x The value at which the function should be evaluated + * @param dx The value to use to perturb @c x in the calculation of the numerical derivatives + * @param derivatives The values of the analytically calculated derivatives to use for comparison + * @param function The function which is being tested. This should be a function that takes 2 parameters. + * The first is the value at which the function is being evaluated (x) and the second is an array + * of size @c numValues which is the result of the execution of the function. + * @param absTolerance The absolute tolerance to use for the comparison + * @param relTolerance The relative tolerance to use for the comparison + */ +template< integer numValues, typename FUNCTION > +void testNumericalDerivative( real64 const x, + real64 const dx, + arraySlice1d< real64 const > const & derivatives, + FUNCTION && function, + real64 const absTolerance = absTol, + real64 const relTolerance = relTol ) +{ + stackArray1d< real64, numValues > leftValues( numValues ); + stackArray1d< real64, numValues > centreValues( numValues ); + stackArray1d< real64, numValues > rightValues( numValues ); + function( x-dx, leftValues ); + function( x, centreValues ); + function( x+dx, rightValues ); + + // Use the same space to calculate the left-sided and right sided derivatives + for( integer i = 0; i < numValues; ++i ) + { + // Choose from the left, central and right derivatives, the one that's nearest the analytical value + real64 minError = LvArray::NumericLimits< real64 >::max; + real64 selectedDerivative = 0.0; + for( real64 const distance : {centreValues[i] - leftValues[i], + rightValues[i] - centreValues[i], + 0.5*(rightValues[i] - leftValues[i])} ) + { + real64 const deriv = distance / dx; + real64 const error = LvArray::math::abs( deriv - derivatives[i] ); + if( error < minError ) + { + minError = error; + selectedDerivative = deriv; + } + } + checkRelativeError( derivatives[i], selectedDerivative, relTolerance, absTolerance, + GEOS_FMT( "Numerical derivative for component {}", i ) ); + } +} + }// namespace internal }// namespace testing diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp new file mode 100644 index 00000000000..08cfdf720c9 --- /dev/null +++ b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp @@ -0,0 +1,256 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" +#include "constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp" +#include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" + +using namespace geos::constitutive::compositional; + +namespace geos +{ +namespace testing +{ + +template< int NC > +using DensityData = std::tuple< + real64 const, // pressure + real64 const, // temperature + Feed< NC > const, // phase composition + real64 const, // expected molar density + real64 const // expected mass density + >; + +template< int NC > +struct FluidData {}; + +template<> +struct FluidData< 9 > +{ + static std::unique_ptr< TestFluid< 9 > > createFluid() + { + auto fluid = TestFluid< 9 >::create( {Fluid::H2O, Fluid::CO2, Fluid::N2, Fluid::C5, Fluid::C2, Fluid::C3, Fluid::C4, Fluid::C5, Fluid::C10} ); + const std::array< real64 const, 36 > bics = { + 0.01, 0, 0.003732, 0, 0.01, 0, 0, 0.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0.01, 0, 0.028, 0.01, 0.01, 0, 0, 0.01, 0, 0.04532, 0.01, 0.01, 0, 0, 0 + }; + fluid->setBinaryCoefficients( bics ); + return fluid; + } +}; + +template< int NC, typename EOS_TYPE > +class CompositionalDensityTestFixture : public ::testing::TestWithParam< DensityData< NC > > +{ + static constexpr real64 relTol = 1.0e-5; + static constexpr real64 absTol = 1.0e-7; + static constexpr int numComps = NC; + static constexpr int numDofs = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; +public: + CompositionalDensityTestFixture() + : m_fluid( FluidData< NC >::createFluid() ) + { + ComponentProperties const & componentProperties = this->m_fluid->getComponentProperties(); + m_density = std::make_unique< CompositionalDensity< EOS_TYPE > >( "PhaseDensity", componentProperties ); + } + + ~CompositionalDensityTestFixture() = default; + + void testDensityValues( DensityData< NC > const & data ) + { + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > phaseComposition; + TestFluid< NC >::createArray( phaseComposition, std::get< 2 >( data )); + real64 const expectedMolarDensity = std::get< 3 >( data ); + real64 const expectedMassDensity = std::get< 4 >( data ); + + auto componentProperties = m_fluid->createKernelWrapper(); + auto kernelWrapper = this->m_density->createKernelWrapper(); + + real64 molarDensity = 0.0; + real64 massDensity = 0.0; + stackArray1d< real64, numDofs > tempDerivs( numDofs ); + + kernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + molarDensity, + tempDerivs.toSlice(), + massDensity, + tempDerivs.toSlice(), + false ); + + checkRelativeError( molarDensity, expectedMolarDensity, relTol, absTol ); + checkRelativeError( massDensity, expectedMassDensity, relTol, absTol ); + } + + void testDensityDerivatives( DensityData< NC > const & data ) + { + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > phaseComposition; + TestFluid< NC >::createArray( phaseComposition, std::get< 2 >( data )); + + auto componentProperties = m_fluid->createKernelWrapper(); + auto kernelWrapper = m_density->createKernelWrapper(); + + real64 molarDensity = 0.0; + real64 massDensity = 0.0; + stackArray1d< real64, numDofs > molarDensityDerivs( numDofs ); + stackArray1d< real64, numDofs > massDensityDerivs( numDofs ); + + kernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + molarDensity, + molarDensityDerivs.toSlice(), + massDensity, + massDensityDerivs.toSlice(), + false ); + + auto calculateDensity = [&]( real64 const p, real64 const t, auto const & zmf ) -> std::pair< real64, real64 > { + real64 densityMolar = 0.0; + real64 densityMass = 0.0; + stackArray1d< real64, numDofs > tempDerivs( numDofs ); + kernelWrapper.compute( componentProperties, p, t, + zmf.toSliceConst(), + densityMolar, + tempDerivs.toSlice(), + densityMass, + tempDerivs.toSlice(), + false ); + return {densityMolar, densityMass}; + }; + + // Compare against numerical derivatives + // -- Pressure derivative + real64 const dp = 1.0e-4 * pressure; + internal::testNumericalDerivative( + pressure, dp, molarDensityDerivs[Deriv::dP], + [&]( real64 const p ) -> real64 { + return calculateDensity( p, temperature, phaseComposition ).first; + } ); + internal::testNumericalDerivative( + pressure, dp, massDensityDerivs[Deriv::dP], + [&]( real64 const p ) -> real64 { + return calculateDensity( p, temperature, phaseComposition ).second; + } ); + + // -- Temperature derivative + real64 const dT = 1.0e-6 * temperature; + internal::testNumericalDerivative( + temperature, dT, molarDensityDerivs[Deriv::dT], + [&]( real64 const t ) -> real64 { + return calculateDensity( pressure, t, phaseComposition ).first; + } ); + internal::testNumericalDerivative( + temperature, dT, massDensityDerivs[Deriv::dT], + [&]( real64 const t ) -> real64 { + return calculateDensity( pressure, t, phaseComposition ).second; + } ); + + // -- Composition derivatives derivative + real64 const dz = 1.0e-7; + for( integer ic = 0; ic < numComps; ++ic ) + { + internal::testNumericalDerivative( + 0.0, dz, molarDensityDerivs[Deriv::dC + ic], + [&]( real64 const z ) -> real64 { + stackArray1d< real64, numComps > zmf( numComps ); + for( integer jc = 0; jc < numComps; ++jc ) + { + zmf[jc] = phaseComposition[jc]; + } + zmf[ic] += z; + return calculateDensity( pressure, temperature, zmf ).first; + } ); + internal::testNumericalDerivative( + 0.0, dz, massDensityDerivs[Deriv::dC + ic], + [&]( real64 const z ) -> real64 { + stackArray1d< real64, numComps > zmf( numComps ); + for( integer jc = 0; jc < numComps; ++jc ) + { + zmf[jc] = phaseComposition[jc]; + } + zmf[ic] += z; + return calculateDensity( pressure, temperature, zmf ).second; + } ); + } + } + +protected: + std::unique_ptr< CompositionalDensity< EOS_TYPE > > m_density{}; + std::unique_ptr< TestFluid< NC > > m_fluid{}; +}; + +using CompositionalDensity9CompPR = CompositionalDensityTestFixture< 9, CubicEOSPhaseModel< PengRobinsonEOS > >; +using CompositionalDensity9CompSRK = CompositionalDensityTestFixture< 9, CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; + +TEST_P( CompositionalDensity9CompPR, testDensityDerivatives ) +{ + testDensityDerivatives( GetParam() ); +} + +TEST_P( CompositionalDensity9CompSRK, testDensityDerivatives ) +{ + testDensityDerivatives( GetParam() ); +} + +INSTANTIATE_TEST_SUITE_P( + CompositionalDensityTest, + CompositionalDensity9CompPR, + ::testing::ValuesIn( { + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 8.355571e+03, 4.559906e+02 }, + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 7.703898e+02, 2.691914e+01 }, + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 8.337694e+03, 4.567935e+02 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 9.073321e+02, 4.951606e+01 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 6.178234e+02, 2.158813e+01 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 9.197865e+02, 5.039192e+01 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.095078e+04, 5.976195e+02 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.480270e+04, 8.666618e+02 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.087917e+04, 5.960323e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.065128e+04, 5.812747e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.305823e+04, 8.057060e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.058381e+04, 5.798506e+02 } + } ) + ); +INSTANTIATE_TEST_SUITE_P( + CompositionalDensityTest, + CompositionalDensity9CompSRK, + ::testing::ValuesIn( { + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 7.433979e+03, 4.056963e+02 }, + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 7.629968e+02, 2.666082e+01 }, + DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 7.416959e+03, 4.063495e+02 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 8.919848e+02, 4.867851e+01 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 6.133569e+02, 2.143206e+01 }, + DensityData< 9 >{1.839590e+06, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 9.045641e+02, 4.955794e+01 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 9.868675e+03, 5.385656e+02 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.257420e+04, 7.887929e+02 }, + DensityData< 9 >{1.839590e+08, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 9.803814e+03, 5.371171e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 9.615674e+03, 5.247585e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.109248e+04, 7.370183e+02 }, + DensityData< 9 >{1.839590e+08, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 9.554300e+03, 5.234471e+02 } + } ) + ); + +} // testing + +} // geos diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp index c41428ed2da..320e1a4b085 100644 --- a/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp +++ b/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp @@ -51,6 +51,8 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar { public: static constexpr integer numComps = NC; + static constexpr integer numDof = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; public: CompositionalPropertiesTestDataTestFixture() : m_fluid( createFluid< NC >() ) @@ -65,7 +67,7 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar real64 const molarDensity = computeMolarDensity( pressure, temperature, - composition ); + composition.toSliceConst() ); checkRelativeError( molarDensity, expectedMolarDensity, internal::relTol, internal::absTol ); } @@ -76,23 +78,19 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar const auto [pressure, temperature, composition] = getInputData( data ); real64 molarDensity = 0.0; - real64 dMolarDensity_dp = 0.0; - real64 dMolarDensity_dt = 0.0; - array1d< real64 > dMolarDensity_dz( numComps ); + stackArray1d< real64, numDof > molarDensityDerivs( numDof ); computeMolarDensity( pressure, temperature, - composition, + composition.toSliceConst(), molarDensity, - dMolarDensity_dp, - dMolarDensity_dt, - dMolarDensity_dz ); + molarDensityDerivs.toSlice() ); // Compare against numerical derivatives // -- Pressure derivative real64 const dp = 1.0e-4 * pressure; internal::testNumericalDerivative( - pressure, dp, dMolarDensity_dp, + pressure, dp, molarDensityDerivs[Deriv::dP], [this, & t=temperature, & zmf=composition]( real64 const p ) -> real64 { return computeMolarDensity( p, t, zmf ); } ); @@ -100,7 +98,7 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar // -- Temperature derivative real64 const dT = 1.0e-6 * temperature; internal::testNumericalDerivative( - temperature, dT, dMolarDensity_dt, + temperature, dT, molarDensityDerivs[Deriv::dT], [this, & p=pressure, & zmf=composition]( real64 const t ) -> real64 { return computeMolarDensity( p, t, zmf ); } ); @@ -110,7 +108,7 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar for( integer ic = 0; ic < numComps; ++ic ) { internal::testNumericalDerivative( - 0.0, dz, dMolarDensity_dz[ic], + 0.0, dz, molarDensityDerivs[Deriv::dC + ic], [this, & p=pressure, & t=temperature, zmf=composition, ic]( real64 const z ) -> real64 { zmf[ic] += z; real64 const density = computeMolarDensity( p, t, zmf ); @@ -139,23 +137,19 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar const auto [pressure, temperature, composition] = getInputData( data ); real64 massDensity = 0.0; - real64 dMassDensity_dp = 0.0; - real64 dMassDensity_dt = 0.0; - array1d< real64 > dMassDensity_dz( numComps ); + array1d< real64 > massDensityDerivs( numDof ); computeMassDensity( pressure, temperature, composition, massDensity, - dMassDensity_dp, - dMassDensity_dt, - dMassDensity_dz ); + massDensityDerivs ); // Compare against numerical derivatives // -- Pressure derivative real64 const dp = 1.0e-4 * pressure; internal::testNumericalDerivative( - pressure, dp, dMassDensity_dp, + pressure, dp, massDensityDerivs[Deriv::dP], [this, & t=temperature, & zmf=composition]( real64 const p ) -> real64 { return computeMassDensity( p, t, zmf ); } ); @@ -163,7 +157,7 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar // -- Temperature derivative real64 const dT = 1.0e-6 * temperature; internal::testNumericalDerivative( - temperature, dT, dMassDensity_dt, + temperature, dT, massDensityDerivs[Deriv::dT], [this, & p=pressure, & zmf=composition]( real64 const t ) -> real64 { return computeMassDensity( p, t, zmf ); } ); @@ -173,11 +167,12 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar for( integer ic = 0; ic < numComps; ++ic ) { internal::testNumericalDerivative( - 0.0, dz, dMassDensity_dz[ic], + 0.0, dz, massDensityDerivs[Deriv::dC + ic], [this, & p=pressure, & t=temperature, & zmf=composition, ic]( real64 const z ) -> real64 { + real64 const z0 = zmf[ic]; zmf[ic] += z; real64 const density = computeMassDensity( p, t, zmf ); - zmf[ic] -= z; + zmf[ic] = z0; return density; } ); } @@ -195,64 +190,26 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar } real64 computeMolarDensity( real64 const pressure, real64 const temperature, - arrayView1d< real64 const > const & composition ) const + arraySlice1d< real64 const > const & composition ) const { - auto const componentProperties = this->m_fluid->createKernelWrapper(); - auto const binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; - auto const volumeShift = componentProperties.m_componentVolumeShift; - - real64 compressibilityFactor = 0.0; real64 molarDensity = 0.0; - array1d< real64 > aPureCoefficient( numComps ); - array1d< real64 > bPureCoefficient( numComps ); - real64 aMixtureCoefficient = 0.0; - real64 bMixtureCoefficient = 0.0; - - CubicEOSPhaseModel< EOS_TYPE >:: - computeMixtureCoefficients( numComps, - pressure, - temperature, - composition, - componentProperties, - aPureCoefficient, - bPureCoefficient, - aMixtureCoefficient, - bMixtureCoefficient ); - - CubicEOSPhaseModel< EOS_TYPE >:: - computeCompressibilityFactor( numComps, - composition, - binaryInteractionCoefficients, - aPureCoefficient, - bPureCoefficient, - aMixtureCoefficient, - bMixtureCoefficient, - compressibilityFactor ); - - CompositionalProperties::computeMolarDensity( numComps, - pressure, - temperature, - composition, - volumeShift, - compressibilityFactor, - molarDensity ); + stackArray1d< real64, numDof > molarDensityDerivs( numDof ); + computeMolarDensity( pressure, temperature, composition, molarDensity, molarDensityDerivs.toSlice() ); return molarDensity; } void computeMolarDensity( real64 const pressure, real64 const temperature, - arrayView1d< real64 const > const & composition, + arraySlice1d< real64 const > const & composition, real64 & molarDensity, - real64 & dMolarDensity_dp, - real64 & dMolarDensity_dt, - arraySlice1d< real64 > const dMolarDensity_dz ) const + arraySlice1d< real64 > const molarDensityDerivs ) const { auto const componentProperties = this->m_fluid->createKernelWrapper(); auto const binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; auto const volumeShift = componentProperties.m_componentVolumeShift; real64 compressibilityFactor = 0.0; - array1d< real64 > aPureCoefficient( numComps ); - array1d< real64 > bPureCoefficient( numComps ); + stackArray1d< real64, numComps > aPureCoefficient( numComps ); + stackArray1d< real64, numComps > bPureCoefficient( numComps ); real64 aMixtureCoefficient = 0.0; real64 bMixtureCoefficient = 0.0; @@ -262,17 +219,13 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar temperature, composition, componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSlice(), + bPureCoefficient.toSlice(), aMixtureCoefficient, bMixtureCoefficient ); - real64 daMixtureCoefficient_dp = 0.0; - real64 dbMixtureCoefficient_dp = 0.0; - real64 daMixtureCoefficient_dt = 0.0; - real64 dbMixtureCoefficient_dt = 0.0; - array1d< real64 > daMixtureCoefficient_dz( numComps ); - array1d< real64 > dbMixtureCoefficient_dz( numComps ); + stackArray1d< real64, numDof > aMixtureCoefficientDerivs( numDof ); + stackArray1d< real64, numDof > bMixtureCoefficientDerivs( numDof ); CubicEOSPhaseModel< EOS_TYPE >:: computeMixtureCoefficients( numComps, @@ -280,54 +233,33 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar temperature, composition, componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSliceConst(), + bPureCoefficient.toSliceConst(), aMixtureCoefficient, bMixtureCoefficient, - daMixtureCoefficient_dp, - dbMixtureCoefficient_dp, - daMixtureCoefficient_dt, - dbMixtureCoefficient_dt, - daMixtureCoefficient_dz, - dbMixtureCoefficient_dz ); + aMixtureCoefficientDerivs.toSlice(), + bMixtureCoefficientDerivs.toSlice() ); CubicEOSPhaseModel< EOS_TYPE >:: computeCompressibilityFactor( numComps, composition, binaryInteractionCoefficients, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSliceConst(), + bPureCoefficient.toSliceConst(), aMixtureCoefficient, bMixtureCoefficient, compressibilityFactor ); - real64 dCompressibilityFactor_dp = 0.0; - real64 dCompressibilityFactor_dt = 0.0; - array1d< real64 > dCompressibilityFactor_dz( numComps ); + stackArray1d< real64, numDof > compressibilityFactorDerivs( numDof ); CubicEOSPhaseModel< EOS_TYPE >:: computeCompressibilityFactor( numComps, aMixtureCoefficient, bMixtureCoefficient, compressibilityFactor, - daMixtureCoefficient_dp, - dbMixtureCoefficient_dp, - daMixtureCoefficient_dt, - dbMixtureCoefficient_dt, - daMixtureCoefficient_dz, - dbMixtureCoefficient_dz, - dCompressibilityFactor_dp, - dCompressibilityFactor_dt, - dCompressibilityFactor_dz ); - - CompositionalProperties:: - computeMolarDensity( numComps, - pressure, - temperature, - composition, - volumeShift, - compressibilityFactor, - molarDensity ); + aMixtureCoefficientDerivs.toSliceConst(), + bMixtureCoefficientDerivs.toSliceConst(), + compressibilityFactorDerivs.toSlice() ); CompositionalProperties:: computeMolarDensity( numComps, @@ -336,66 +268,44 @@ class CompositionalPropertiesTestDataTestFixture : public ::testing::TestWithPar composition, volumeShift, compressibilityFactor, - dCompressibilityFactor_dp, - dCompressibilityFactor_dt, - dCompressibilityFactor_dz, + compressibilityFactorDerivs.toSliceConst(), molarDensity, - dMolarDensity_dp, - dMolarDensity_dt, - dMolarDensity_dz ); + molarDensityDerivs ); } real64 computeMassDensity( real64 const pressure, real64 const temperature, - arrayView1d< real64 const > const & composition ) const + arraySlice1d< real64 const > const & composition ) const { - auto const componentProperties = this->m_fluid->createKernelWrapper(); - auto const molecularWeight = componentProperties.m_componentMolarWeight; - - real64 const molarDensity = computeMolarDensity( pressure, temperature, composition ); real64 massDensity = 0.0; - CompositionalProperties:: - computeMassDensity( numComps, - composition, - molecularWeight, - molarDensity, - massDensity ); + stackArray1d< real64, numDof > massDensityDerivs( numDof ); + computeMassDensity( pressure, temperature, composition, massDensity, massDensityDerivs.toSlice() ); return massDensity; } void computeMassDensity( real64 const pressure, real64 const temperature, - arrayView1d< real64 const > const & composition, + arraySlice1d< real64 const > const & composition, real64 & massDensity, - real64 & dMassDensity_dp, - real64 & dMassDensity_dt, - arraySlice1d< real64 > const dMassDensity_dz ) const + arraySlice1d< real64 > const massDensityDerivs ) const { auto const componentProperties = this->m_fluid->createKernelWrapper(); auto const molecularWeight = componentProperties.m_componentMolarWeight; - massDensity = computeMassDensity( pressure, temperature, composition ); - real64 molarDensity = 0.0; - real64 dMolarDensity_dp = 0.0; - real64 dMolarDensity_dt = 0.0; - array1d< real64 > dMolarDensity_dz( numComps ); + stackArray1d< real64, numDof > molarDensityDerivs( numDof ); + computeMolarDensity( pressure, temperature, composition, molarDensity, - dMolarDensity_dp, - dMolarDensity_dt, - dMolarDensity_dz ); + molarDensityDerivs.toSlice() ); CompositionalProperties:: computeMassDensity( numComps, + composition, molecularWeight, molarDensity, - dMolarDensity_dp, - dMolarDensity_dt, - dMolarDensity_dz, + molarDensityDerivs.toSliceConst(), massDensity, - dMassDensity_dp, - dMassDensity_dt, - dMassDensity_dz ); + massDensityDerivs ); } protected: @@ -430,72 +340,72 @@ template<> std::vector< CompositionalPropertiesTestData< 4 > > generateTestData< PengRobinsonEOS, 4 >() { return { - { 1.000000e+05, 2.771500e+02, { 0.000000, 0.495099, 0.495118, 0.009783 }, 3.733061e+03, 1.271768e+02, 4.747588e+05 }, - { 1.000000e+05, 2.771500e+02, { 0.000652, 0.128231, 0.128281, 0.742836 }, 1.119134e+04, 4.630013e+01, 5.181608e+05 }, - { 1.000000e+05, 2.771500e+02, { 0.855328, 0.000205, 0.000000, 0.144467 }, 4.348717e+01, 2.658628e+01, 1.156162e+03 }, - { 1.000000e+05, 2.886500e+02, { 0.000507, 0.112984, 0.113029, 0.773480 }, 1.214893e+04, 4.293636e+01, 5.216311e+05 }, - { 1.000000e+05, 2.886500e+02, { 0.777870, 0.000520, 0.000000, 0.221610 }, 4.177763e+01, 2.584219e+01, 1.079625e+03 }, - { 1.000000e+05, 2.886500e+02, { 0.985235, 0.000000, 0.000000, 0.014765 }, 4.169466e+01, 2.786538e+01, 1.161838e+03 }, - { 1.000000e+05, 2.981500e+02, { 0.653033, 0.000901, 0.000000, 0.346066 }, 4.049414e+01, 2.463074e+01, 9.974005e+02 }, - { 1.000000e+05, 2.981500e+02, { 0.000506, 0.143046, 0.143326, 0.713122 }, 1.013248e+04, 4.959370e+01, 5.025071e+05 }, - { 1.000000e+05, 2.981500e+02, { 0.582848, 0.000748, 0.000000, 0.416404 }, 4.053125e+01, 2.391430e+01, 9.692764e+02 }, - { 1.000000e+05, 2.981500e+02, { 0.972848, 0.000000, 0.000000, 0.027152 }, 4.036515e+01, 2.774153e+01, 1.119791e+03 }, - { 1.000000e+05, 3.331500e+02, { 0.000000, 0.477146, 0.477164, 0.045691 }, 3.754190e+03, 1.232183e+02, 4.625850e+05 }, - { 1.000000e+05, 3.331500e+02, { 0.210877, 0.008984, 0.000001, 0.780137 }, 3.640845e+01, 2.098792e+01, 7.641376e+02 }, - { 1.000000e+05, 3.331500e+02, { 0.818043, 0.000000, 0.000000, 0.181957 }, 3.614852e+01, 2.619379e+01, 9.468669e+02 }, - { 1.000000e+05, 3.721500e+02, { 0.000000, 0.104818, 0.104822, 0.790360 }, 3.312721e+01, 4.112577e+01, 1.362382e+03 }, - { 1.000000e+05, 3.721500e+02, { 0.000117, 0.356347, 0.549688, 0.093848 }, 3.581375e+03, 1.206090e+02, 4.319462e+05 }, - { 1.013250e+05, 2.771500e+02, { 0.000000, 0.495099, 0.495118, 0.009783 }, 3.733064e+03, 1.271768e+02, 4.747592e+05 }, - { 1.013250e+05, 2.886500e+02, { 0.000516, 0.112950, 0.112994, 0.773540 }, 1.215157e+04, 4.292888e+01, 5.216533e+05 }, - { 1.013250e+05, 2.886500e+02, { 0.780815, 0.000514, 0.000000, 0.218672 }, 4.233123e+01, 2.587101e+01, 1.095152e+03 }, - { 1.013250e+05, 2.886500e+02, { 0.000599, 0.132633, 0.132752, 0.734016 }, 1.081051e+04, 4.727865e+01, 5.111063e+05 }, - { 1.013250e+05, 2.886500e+02, { 0.743752, 0.000426, 0.000000, 0.255823 }, 4.234963e+01, 2.549200e+01, 1.079576e+03 }, - { 1.013250e+05, 2.981500e+02, { 0.000448, 0.114592, 0.114680, 0.770280 }, 1.192251e+04, 4.329570e+01, 5.161936e+05 }, - { 1.013250e+05, 2.981500e+02, { 0.657746, 0.000890, 0.000000, 0.341364 }, 4.103031e+01, 2.467683e+01, 1.012498e+03 }, - { 1.013250e+05, 2.981500e+02, { 0.000516, 0.142463, 0.142736, 0.714285 }, 1.016359e+04, 4.946432e+01, 5.027349e+05 }, - { 1.013250e+05, 3.331500e+02, { 0.000000, 0.477146, 0.477164, 0.045690 }, 3.754193e+03, 1.232184e+02, 4.625856e+05 }, - { 1.013250e+05, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.593026e+04, 1.801500e+01, 8.274336e+05 }, - { 1.013250e+05, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.593025e+04, 1.801500e+01, 8.274336e+05 }, - { 1.013250e+05, 3.331500e+02, { 0.820407, 0.000000, 0.000000, 0.179593 }, 3.662747e+01, 2.621743e+01, 9.602781e+02 }, - { 1.013250e+05, 3.721500e+02, { 0.080408, 0.000000, 0.000000, 0.919592 }, 3.299996e+01, 1.881892e+01, 6.210236e+02 }, - { 5.000000e+06, 2.771500e+02, { 0.000000, 0.495216, 0.495235, 0.009549 }, 3.742134e+03, 1.272026e+02, 4.760091e+05 }, - { 5.000000e+06, 2.771500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.772799e+04, 1.801500e+01, 8.598197e+05 }, - { 5.000000e+06, 2.771500e+02, { 0.029212, 0.107914, 0.107918, 0.754956 }, 1.264269e+04, 4.210047e+01, 5.322630e+05 }, - { 5.000000e+06, 2.886500e+02, { 0.000000, 0.493093, 0.493111, 0.013796 }, 3.739164e+03, 1.267344e+02, 4.738808e+05 }, - { 5.000000e+06, 2.886500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.739475e+04, 1.801500e+01, 8.538165e+05 }, - { 5.000000e+06, 2.886500e+02, { 0.999549, 0.000000, 0.000000, 0.000451 }, 2.122222e+03, 2.800849e+01, 5.944023e+04 }, - { 5.000000e+06, 2.981500e+02, { 0.000000, 0.490855, 0.490873, 0.018272 }, 3.739300e+03, 1.262410e+02, 4.720529e+05 }, - { 5.000000e+06, 2.981500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.710908e+04, 1.801500e+01, 8.486701e+05 }, - { 5.000000e+06, 2.981500e+02, { 0.030096, 0.107834, 0.107839, 0.754231 }, 1.241638e+04, 4.209177e+01, 5.226274e+05 }, - { 5.000000e+06, 3.331500e+02, { 0.031858, 0.107709, 0.107720, 0.752713 }, 1.198645e+04, 4.208259e+01, 5.044209e+05 }, - { 5.000000e+06, 3.331500e+02, { 0.964491, 0.000264, 0.000000, 0.035245 }, 1.824920e+03, 2.768343e+01, 5.052004e+04 }, - { 5.000000e+06, 3.331500e+02, { 0.035989, 0.120533, 0.120574, 0.722904 }, 1.106526e+04, 4.495504e+01, 4.974394e+05 }, - { 5.000000e+06, 3.331500e+02, { 0.961874, 0.000247, 0.000000, 0.037879 }, 1.826197e+03, 2.765560e+01, 5.050457e+04 }, - { 5.000000e+06, 3.721500e+02, { 0.037408, 0.121753, 0.121923, 0.718916 }, 1.046451e+04, 4.525417e+01, 4.735627e+05 }, - { 5.000000e+06, 3.721500e+02, { 0.889694, 0.001014, 0.000003, 0.109288 }, 1.643713e+03, 2.700817e+01, 4.439368e+04 }, - { 1.000000e+07, 2.771500e+02, { 0.000004, 0.000000, 0.000000, 0.999996 }, 4.775121e+04, 1.801504e+01, 8.602398e+05 }, - { 1.000000e+07, 2.771500e+02, { 0.999835, 0.000000, 0.000000, 0.000165 }, 4.468580e+03, 2.801135e+01, 1.251710e+05 }, - { 1.000000e+07, 2.886500e+02, { 0.000000, 0.493260, 0.493279, 0.013460 }, 3.748279e+03, 1.267714e+02, 4.751745e+05 }, - { 1.000000e+07, 2.886500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.742059e+04, 1.801500e+01, 8.542819e+05 }, - { 1.000000e+07, 2.886500e+02, { 0.055934, 0.104932, 0.104936, 0.734198 }, 1.273695e+04, 4.171005e+01, 5.312588e+05 }, - { 1.000000e+07, 2.981500e+02, { 0.000000, 0.491084, 0.491102, 0.017814 }, 3.748930e+03, 1.262914e+02, 4.734578e+05 }, - { 1.000000e+07, 2.981500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.713720e+04, 1.801500e+01, 8.491766e+05 }, - { 1.000000e+07, 2.981500e+02, { 0.056951, 0.104818, 0.104822, 0.733409 }, 1.263544e+04, 4.169517e+01, 5.268366e+05 }, - { 1.000000e+07, 2.981500e+02, { 0.065451, 0.116299, 0.116311, 0.701940 }, 1.172878e+04, 4.431245e+01, 5.197309e+05 }, - { 1.000000e+07, 2.981500e+02, { 0.991760, 0.000074, 0.000000, 0.008166 }, 4.103168e+03, 2.793775e+01, 1.146333e+05 }, - { 1.000000e+07, 3.331500e+02, { 0.000000, 0.478424, 0.478442, 0.043135 }, 3.777896e+03, 1.235001e+02, 4.665706e+05 }, - { 1.000000e+07, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.600669e+04, 1.801500e+01, 8.288105e+05 }, - { 1.000000e+07, 3.331500e+02, { 0.996818, 0.000000, 0.000000, 0.003182 }, 3.589847e+03, 2.798118e+01, 1.004482e+05 }, - { 1.000000e+07, 3.721500e+02, { 0.000000, 0.453197, 0.453215, 0.093588 }, 3.878777e+03, 1.179381e+02, 4.574555e+05 }, - { 1.000000e+08, 2.771500e+02, { 0.000000, 0.496608, 0.496627, 0.006766 }, 3.834889e+03, 1.275094e+02, 4.889844e+05 }, - { 1.000000e+08, 2.886500e+02, { 0.156951, 0.104818, 0.104822, 0.633409 }, 1.310108e+04, 4.269497e+01, 5.593502e+05 }, - { 1.000000e+08, 2.886500e+02, { 0.000031, 0.000000, 0.000000, 0.999969 }, 4.783830e+04, 1.801531e+01, 8.618217e+05 }, - { 1.000000e+08, 2.886500e+02, { 0.999447, 0.000000, 0.000000, 0.000553 }, 2.330195e+04, 2.800748e+01, 6.526287e+05 }, - { 1.000000e+08, 2.981500e+02, { 0.000000, 0.493623, 0.493642, 0.012735 }, 3.840586e+03, 1.268513e+02, 4.871835e+05 }, - { 1.000000e+08, 3.331500e+02, { 0.010000, 0.000000, 0.000000, 0.990000 }, 4.638822e+04, 1.811498e+01, 8.403216e+05 }, - { 1.000000e+08, 3.721500e+02, { 0.156951, 0.104818, 0.104822, 0.633409 }, 1.247160e+04, 4.269497e+01, 5.324747e+05 }, - { 1.000000e+08, 3.721500e+02, { 0.000671, 0.000000, 0.000000, 0.999329 }, 4.538427e+04, 1.802171e+01, 8.179019e+05 }, - { 1.000000e+08, 3.721500e+02, { 0.991955, 0.000000, 0.000000, 0.008045 }, 1.979639e+04, 2.793257e+01, 5.529641e+05 } + { 1.000000e+05, 2.771500e+02, { 0.000000, 0.495099, 0.495118, 0.009783 }, 3.733061e+03, 1.271768e+02, 4.747588e+02 }, + { 1.000000e+05, 2.771500e+02, { 0.000652, 0.128231, 0.128281, 0.742836 }, 1.119134e+04, 4.630013e+01, 5.181608e+02 }, + { 1.000000e+05, 2.771500e+02, { 0.855328, 0.000205, 0.000000, 0.144467 }, 4.348717e+01, 2.658628e+01, 1.156162e+00 }, + { 1.000000e+05, 2.886500e+02, { 0.000507, 0.112984, 0.113029, 0.773480 }, 1.214893e+04, 4.293636e+01, 5.216311e+02 }, + { 1.000000e+05, 2.886500e+02, { 0.777870, 0.000520, 0.000000, 0.221610 }, 4.177763e+01, 2.584219e+01, 1.079625e+00 }, + { 1.000000e+05, 2.886500e+02, { 0.985235, 0.000000, 0.000000, 0.014765 }, 4.169466e+01, 2.786538e+01, 1.161838e+00 }, + { 1.000000e+05, 2.981500e+02, { 0.653033, 0.000901, 0.000000, 0.346066 }, 4.049414e+01, 2.463074e+01, 9.974005e-01 }, + { 1.000000e+05, 2.981500e+02, { 0.000506, 0.143046, 0.143326, 0.713122 }, 1.013248e+04, 4.959370e+01, 5.025071e+02 }, + { 1.000000e+05, 2.981500e+02, { 0.582848, 0.000748, 0.000000, 0.416404 }, 4.053125e+01, 2.391430e+01, 9.692764e-01 }, + { 1.000000e+05, 2.981500e+02, { 0.972848, 0.000000, 0.000000, 0.027152 }, 4.036515e+01, 2.774153e+01, 1.119791e+00 }, + { 1.000000e+05, 3.331500e+02, { 0.000000, 0.477146, 0.477164, 0.045691 }, 3.754190e+03, 1.232183e+02, 4.625850e+02 }, + { 1.000000e+05, 3.331500e+02, { 0.210877, 0.008984, 0.000001, 0.780137 }, 3.640845e+01, 2.098792e+01, 7.641376e-01 }, + { 1.000000e+05, 3.331500e+02, { 0.818043, 0.000000, 0.000000, 0.181957 }, 3.614852e+01, 2.619379e+01, 9.468669e-01 }, + { 1.000000e+05, 3.721500e+02, { 0.000000, 0.104818, 0.104822, 0.790360 }, 3.312721e+01, 4.112577e+01, 1.362382e+00 }, + { 1.000000e+05, 3.721500e+02, { 0.000117, 0.356347, 0.549688, 0.093848 }, 3.581375e+03, 1.206090e+02, 4.319462e+02 }, + { 1.013250e+05, 2.771500e+02, { 0.000000, 0.495099, 0.495118, 0.009783 }, 3.733064e+03, 1.271768e+02, 4.747592e+02 }, + { 1.013250e+05, 2.886500e+02, { 0.000516, 0.112950, 0.112994, 0.773540 }, 1.215157e+04, 4.292888e+01, 5.216533e+02 }, + { 1.013250e+05, 2.886500e+02, { 0.780815, 0.000514, 0.000000, 0.218672 }, 4.233123e+01, 2.587101e+01, 1.095152e+00 }, + { 1.013250e+05, 2.886500e+02, { 0.000599, 0.132633, 0.132752, 0.734016 }, 1.081051e+04, 4.727865e+01, 5.111063e+02 }, + { 1.013250e+05, 2.886500e+02, { 0.743752, 0.000426, 0.000000, 0.255823 }, 4.234963e+01, 2.549200e+01, 1.079576e+00 }, + { 1.013250e+05, 2.981500e+02, { 0.000448, 0.114592, 0.114680, 0.770280 }, 1.192251e+04, 4.329570e+01, 5.161936e+02 }, + { 1.013250e+05, 2.981500e+02, { 0.657746, 0.000890, 0.000000, 0.341364 }, 4.103031e+01, 2.467683e+01, 1.012498e+00 }, + { 1.013250e+05, 2.981500e+02, { 0.000516, 0.142463, 0.142736, 0.714285 }, 1.016359e+04, 4.946432e+01, 5.027349e+02 }, + { 1.013250e+05, 3.331500e+02, { 0.000000, 0.477146, 0.477164, 0.045690 }, 3.754193e+03, 1.232184e+02, 4.625856e+02 }, + { 1.013250e+05, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.593026e+04, 1.801500e+01, 8.274336e+02 }, + { 1.013250e+05, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.593025e+04, 1.801500e+01, 8.274336e+02 }, + { 1.013250e+05, 3.331500e+02, { 0.820407, 0.000000, 0.000000, 0.179593 }, 3.662747e+01, 2.621743e+01, 9.602781e-01 }, + { 1.013250e+05, 3.721500e+02, { 0.080408, 0.000000, 0.000000, 0.919592 }, 3.299996e+01, 1.881892e+01, 6.210236e-01 }, + { 5.000000e+06, 2.771500e+02, { 0.000000, 0.495216, 0.495235, 0.009549 }, 3.742134e+03, 1.272026e+02, 4.760091e+02 }, + { 5.000000e+06, 2.771500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.772799e+04, 1.801500e+01, 8.598197e+02 }, + { 5.000000e+06, 2.771500e+02, { 0.029212, 0.107914, 0.107918, 0.754956 }, 1.264269e+04, 4.210047e+01, 5.322630e+02 }, + { 5.000000e+06, 2.886500e+02, { 0.000000, 0.493093, 0.493111, 0.013796 }, 3.739164e+03, 1.267344e+02, 4.738808e+02 }, + { 5.000000e+06, 2.886500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.739475e+04, 1.801500e+01, 8.538165e+02 }, + { 5.000000e+06, 2.886500e+02, { 0.999549, 0.000000, 0.000000, 0.000451 }, 2.122222e+03, 2.800849e+01, 5.944023e+01 }, + { 5.000000e+06, 2.981500e+02, { 0.000000, 0.490855, 0.490873, 0.018272 }, 3.739300e+03, 1.262410e+02, 4.720529e+02 }, + { 5.000000e+06, 2.981500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.710908e+04, 1.801500e+01, 8.486701e+02 }, + { 5.000000e+06, 2.981500e+02, { 0.030096, 0.107834, 0.107839, 0.754231 }, 1.241638e+04, 4.209177e+01, 5.226274e+02 }, + { 5.000000e+06, 3.331500e+02, { 0.031858, 0.107709, 0.107720, 0.752713 }, 1.198645e+04, 4.208259e+01, 5.044209e+02 }, + { 5.000000e+06, 3.331500e+02, { 0.964491, 0.000264, 0.000000, 0.035245 }, 1.824920e+03, 2.768343e+01, 5.052004e+01 }, + { 5.000000e+06, 3.331500e+02, { 0.035989, 0.120533, 0.120574, 0.722904 }, 1.106526e+04, 4.495504e+01, 4.974394e+02 }, + { 5.000000e+06, 3.331500e+02, { 0.961874, 0.000247, 0.000000, 0.037879 }, 1.826197e+03, 2.765560e+01, 5.050457e+01 }, + { 5.000000e+06, 3.721500e+02, { 0.037408, 0.121753, 0.121923, 0.718916 }, 1.046451e+04, 4.525417e+01, 4.735627e+02 }, + { 5.000000e+06, 3.721500e+02, { 0.889694, 0.001014, 0.000003, 0.109288 }, 1.643713e+03, 2.700817e+01, 4.439368e+01 }, + { 1.000000e+07, 2.771500e+02, { 0.000004, 0.000000, 0.000000, 0.999996 }, 4.775121e+04, 1.801504e+01, 8.602398e+02 }, + { 1.000000e+07, 2.771500e+02, { 0.999835, 0.000000, 0.000000, 0.000165 }, 4.468580e+03, 2.801135e+01, 1.251710e+02 }, + { 1.000000e+07, 2.886500e+02, { 0.000000, 0.493260, 0.493279, 0.013460 }, 3.748279e+03, 1.267714e+02, 4.751745e+02 }, + { 1.000000e+07, 2.886500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.742059e+04, 1.801500e+01, 8.542819e+02 }, + { 1.000000e+07, 2.886500e+02, { 0.055934, 0.104932, 0.104936, 0.734198 }, 1.273695e+04, 4.171005e+01, 5.312588e+02 }, + { 1.000000e+07, 2.981500e+02, { 0.000000, 0.491084, 0.491102, 0.017814 }, 3.748930e+03, 1.262914e+02, 4.734578e+02 }, + { 1.000000e+07, 2.981500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.713720e+04, 1.801500e+01, 8.491766e+02 }, + { 1.000000e+07, 2.981500e+02, { 0.056951, 0.104818, 0.104822, 0.733409 }, 1.263544e+04, 4.169517e+01, 5.268366e+02 }, + { 1.000000e+07, 2.981500e+02, { 0.065451, 0.116299, 0.116311, 0.701940 }, 1.172878e+04, 4.431245e+01, 5.197309e+02 }, + { 1.000000e+07, 2.981500e+02, { 0.991760, 0.000074, 0.000000, 0.008166 }, 4.103168e+03, 2.793775e+01, 1.146333e+02 }, + { 1.000000e+07, 3.331500e+02, { 0.000000, 0.478424, 0.478442, 0.043135 }, 3.777896e+03, 1.235001e+02, 4.665706e+02 }, + { 1.000000e+07, 3.331500e+02, { 0.000000, 0.000000, 0.000000, 1.000000 }, 4.600669e+04, 1.801500e+01, 8.288105e+02 }, + { 1.000000e+07, 3.331500e+02, { 0.996818, 0.000000, 0.000000, 0.003182 }, 3.589847e+03, 2.798118e+01, 1.004482e+02 }, + { 1.000000e+07, 3.721500e+02, { 0.000000, 0.453197, 0.453215, 0.093588 }, 3.878777e+03, 1.179381e+02, 4.574555e+02 }, + { 1.000000e+08, 2.771500e+02, { 0.000000, 0.496608, 0.496627, 0.006766 }, 3.834889e+03, 1.275094e+02, 4.889844e+02 }, + { 1.000000e+08, 2.886500e+02, { 0.156951, 0.104818, 0.104822, 0.633409 }, 1.310108e+04, 4.269497e+01, 5.593502e+02 }, + { 1.000000e+08, 2.886500e+02, { 0.000031, 0.000000, 0.000000, 0.999969 }, 4.783830e+04, 1.801531e+01, 8.618217e+02 }, + { 1.000000e+08, 2.886500e+02, { 0.999447, 0.000000, 0.000000, 0.000553 }, 2.330195e+04, 2.800748e+01, 6.526287e+02 }, + { 1.000000e+08, 2.981500e+02, { 0.000000, 0.493623, 0.493642, 0.012735 }, 3.840586e+03, 1.268513e+02, 4.871835e+02 }, + { 1.000000e+08, 3.331500e+02, { 0.010000, 0.000000, 0.000000, 0.990000 }, 4.638822e+04, 1.811498e+01, 8.403216e+02 }, + { 1.000000e+08, 3.721500e+02, { 0.156951, 0.104818, 0.104822, 0.633409 }, 1.247160e+04, 4.269497e+01, 5.324747e+02 }, + { 1.000000e+08, 3.721500e+02, { 0.000671, 0.000000, 0.000000, 0.999329 }, 4.538427e+04, 1.802171e+01, 8.179019e+02 }, + { 1.000000e+08, 3.721500e+02, { 0.991955, 0.000000, 0.000000, 0.008045 }, 1.979639e+04, 2.793257e+01, 5.529641e+02 } }; } diff --git a/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp b/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp index e453e225787..82309e58aec 100644 --- a/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp +++ b/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp @@ -53,9 +53,9 @@ TEST( CubicEOSTest, testCubicEOSTwoComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -72,9 +72,9 @@ TEST( CubicEOSTest, testCubicEOSTwoComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -91,9 +91,9 @@ TEST( CubicEOSTest, testCubicEOSTwoComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -110,9 +110,9 @@ TEST( CubicEOSTest, testCubicEOSTwoComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -149,9 +149,9 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsPR ) CubicEOSPhaseModel< PengRobinsonEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -174,9 +174,9 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsPR ) CubicEOSPhaseModel< PengRobinsonEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -199,9 +199,9 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsPR ) CubicEOSPhaseModel< PengRobinsonEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -240,9 +240,9 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -265,9 +265,9 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); @@ -290,15 +290,14 @@ TEST( CubicEOSTest, testCubicEOSFourComponentsSRK ) CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: computeLogFugacityCoefficients( numComps, - pressure, temperature, composition, + pressure, temperature, composition.toSliceConst(), componentProperties, - logFugacityCoefficients ); + logFugacityCoefficients.toSlice() ); checkRelativeError( logFugacityCoefficients[0], expectedLogFugacityCoefficients[0], relTol ); checkRelativeError( logFugacityCoefficients[1], expectedLogFugacityCoefficients[1], relTol ); checkRelativeError( logFugacityCoefficients[2], expectedLogFugacityCoefficients[2], relTol ); checkRelativeError( logFugacityCoefficients[3], expectedLogFugacityCoefficients[3], relTol ); - } // ----------------------------------------------------------------- @@ -352,6 +351,8 @@ class DerivativeTestFixture : public ::testing::TestWithParam< TestData< NC > > { public: static constexpr integer numComps = NC; + static constexpr integer numDof = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; using ParamType = std::tuple< real64 const, real64 const, Feed< NC > const >; public: DerivativeTestFixture(); @@ -384,23 +385,21 @@ class MixCoeffDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > { public: using DerivativeTestFixture< EOS, NC >::numComps; + using DerivativeTestFixture< EOS, NC >::numDof; + using Deriv = typename DerivativeTestFixture< EOS, NC >::Deriv; using ParamType = typename DerivativeTestFixture< EOS, NC >::ParamType; public: void testNumericalDerivatives( ParamType const & testData ) const { auto componentProperties = this->m_fluid->createKernelWrapper(); - array1d< real64 > aPureCoefficient( numComps ); - array1d< real64 > bPureCoefficient( numComps ); + stackArray1d< real64, numComps > aPureCoefficient( numComps ); + stackArray1d< real64, numComps > bPureCoefficient( numComps ); - real64 daMixtureCoefficient_dp = 0.0; - real64 dbMixtureCoefficient_dp = 0.0; - real64 daMixtureCoefficient_dt = 0.0; - real64 dbMixtureCoefficient_dt = 0.0; - array1d< real64 > daMixtureCoefficient_dz( numComps ); - array1d< real64 > dbMixtureCoefficient_dz( numComps ); + stackArray1d< real64, numDof > aMixtureCoefficientDerivs( numDof ); + stackArray1d< real64, numDof > bMixtureCoefficientDerivs( numDof ); - array1d< real64 > composition; + stackArray1d< real64, numComps > composition; real64 const pressure = std::get< 0 >( testData ); real64 const temperature = std::get< 1 >( testData ); TestFluid< NC >::createArray( composition, std::get< 2 >( testData )); @@ -410,10 +409,10 @@ class MixCoeffDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > real64 b = 0.0; CubicEOSPhaseModel< EOS >::computeMixtureCoefficients( numComps, - p, t, zmf, + p, t, zmf.toSliceConst(), componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSlice(), + bPureCoefficient.toSlice(), a, b ); return {a, b}; @@ -427,29 +426,25 @@ class MixCoeffDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > numComps, pressure, temperature, - composition, + composition.toSliceConst(), componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSlice(), + bPureCoefficient.toSlice(), aMixtureCoefficient, bMixtureCoefficient, - daMixtureCoefficient_dp, - dbMixtureCoefficient_dp, - daMixtureCoefficient_dt, - dbMixtureCoefficient_dt, - daMixtureCoefficient_dz, - dbMixtureCoefficient_dz ); + aMixtureCoefficientDerivs.toSlice(), + bMixtureCoefficientDerivs.toSlice() ); // Compare against numerical derivatives // -- Pressure derivative real64 const dp = 1.0e-4 * pressure; geos::testing::internal::testNumericalDerivative( - pressure, dp, daMixtureCoefficient_dp, + pressure, dp, aMixtureCoefficientDerivs[Deriv::dP], [&]( real64 const p ) -> real64 { return computeCoefficients( p, temperature, composition ).first; } ); geos::testing::internal::testNumericalDerivative( - pressure, dp, dbMixtureCoefficient_dp, + pressure, dp, bMixtureCoefficientDerivs[Deriv::dP], [&]( real64 const p ) -> real64 { return computeCoefficients( p, temperature, composition ).second; } ); @@ -457,12 +452,12 @@ class MixCoeffDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > // -- Temperature derivative real64 const dT = 1.0e-6 * temperature; geos::testing::internal::testNumericalDerivative( - temperature, dT, daMixtureCoefficient_dt, + temperature, dT, aMixtureCoefficientDerivs[Deriv::dT], [&]( real64 const t ) -> real64 { return computeCoefficients( pressure, t, composition ).first; } ); geos::testing::internal::testNumericalDerivative( - temperature, dT, dbMixtureCoefficient_dt, + temperature, dT, bMixtureCoefficientDerivs[Deriv::dT], [&]( real64 const t ) -> real64 { return computeCoefficients( pressure, t, composition ).second; } ); @@ -478,12 +473,12 @@ class MixCoeffDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > return coefficients; }; geos::testing::internal::testNumericalDerivative( - 0.0, dz, daMixtureCoefficient_dz[ic], + 0.0, dz, aMixtureCoefficientDerivs[Deriv::dC+ic], [&]( real64 const z ) -> real64 { return computeComponentCoefficients( z ).first; } ); geos::testing::internal::testNumericalDerivative( - 0.0, dz, dbMixtureCoefficient_dz[ic], + 0.0, dz, bMixtureCoefficientDerivs[Deriv::dC+ic], [&]( real64 const z ) -> real64 { return computeComponentCoefficients( z ).second; } ); @@ -543,6 +538,8 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, { public: using DerivativeTestFixture< EOS, NC >::numComps; + using DerivativeTestFixture< EOS, NC >::numDof; + using Deriv = typename DerivativeTestFixture< EOS, NC >::Deriv; using ParamType = typename DerivativeTestFixture< EOS, NC >::ParamType; public: void testNumericalDerivatives( ParamType const & testData ) const @@ -550,22 +547,16 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, auto const componentProperties = this->m_fluid->createKernelWrapper(); auto const binaryInteractionCoefficients = componentProperties.m_componentBinaryCoeff; - array1d< real64 > aPureCoefficient( numComps ); - array1d< real64 > bPureCoefficient( numComps ); + stackArray1d< real64, numComps > aPureCoefficient( numComps ); + stackArray1d< real64, numComps > bPureCoefficient( numComps ); real64 aMixtureCoefficient = 0.0; real64 bMixtureCoefficient = 0.0; - real64 daMixtureCoefficient_dp = 0.0; - real64 dbMixtureCoefficient_dp = 0.0; - real64 daMixtureCoefficient_dt = 0.0; - real64 dbMixtureCoefficient_dt = 0.0; - array1d< real64 > daMixtureCoefficient_dz( numComps ); - array1d< real64 > dbMixtureCoefficient_dz( numComps ); - - real64 dCompressibilityFactor_dp = 0.0; - real64 dCompressibilityFactor_dt = 0.0; - array1d< real64 > dCompressibilityFactor_dz( numComps ); - - array1d< real64 > composition; + stackArray1d< real64, numDof > aMixtureCoefficientDerivs( numDof ); + stackArray1d< real64, numDof > bMixtureCoefficientDerivs( numDof ); + + stackArray1d< real64, numDof > compressibilityFactorDerivs( numDof ); + + stackArray1d< real64, numComps > composition; real64 const pressure = std::get< 0 >( testData ); real64 const temperature = std::get< 1 >( testData ); TestFluid< NC >::createArray( composition, std::get< 2 >( testData )); @@ -574,18 +565,18 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, real64 z = 0.0; CubicEOSPhaseModel< EOS >::computeMixtureCoefficients( numComps, - p, t, zmf, + p, t, zmf.toSliceConst(), componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSlice(), + bPureCoefficient.toSlice(), aMixtureCoefficient, bMixtureCoefficient ); CubicEOSPhaseModel< EOS >::computeCompressibilityFactor( numComps, - zmf, + zmf.toSliceConst(), binaryInteractionCoefficients, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSliceConst(), + bPureCoefficient.toSliceConst(), aMixtureCoefficient, bMixtureCoefficient, z ); @@ -600,38 +591,28 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, numComps, pressure, temperature, - composition, + composition.toSliceConst(), componentProperties, - aPureCoefficient, - bPureCoefficient, + aPureCoefficient.toSliceConst(), + bPureCoefficient.toSliceConst(), aMixtureCoefficient, bMixtureCoefficient, - daMixtureCoefficient_dp, - dbMixtureCoefficient_dp, - daMixtureCoefficient_dt, - dbMixtureCoefficient_dt, - daMixtureCoefficient_dz, - dbMixtureCoefficient_dz ); + aMixtureCoefficientDerivs.toSlice(), + bMixtureCoefficientDerivs.toSlice() ); CubicEOSPhaseModel< EOS >::computeCompressibilityFactor( numComps, aMixtureCoefficient, bMixtureCoefficient, compressibilityFactor, - daMixtureCoefficient_dp, - dbMixtureCoefficient_dp, - daMixtureCoefficient_dt, - dbMixtureCoefficient_dt, - daMixtureCoefficient_dz, - dbMixtureCoefficient_dz, - dCompressibilityFactor_dp, - dCompressibilityFactor_dt, - dCompressibilityFactor_dz ); + aMixtureCoefficientDerivs.toSliceConst(), + bMixtureCoefficientDerivs.toSliceConst(), + compressibilityFactorDerivs.toSlice() ); // Compare against numerical derivatives // -- Pressure derivative real64 const dp = 1.0e-4 * pressure; geos::testing::internal::testNumericalDerivative( - pressure, dp, dCompressibilityFactor_dp, + pressure, dp, compressibilityFactorDerivs[Deriv::dP], [&]( real64 const p ) -> real64 { return computeCompressibilityFactor( p, temperature, composition ); } ); @@ -639,7 +620,7 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, // -- Temperature derivative real64 const dT = 1.0e-6 * temperature; geos::testing::internal::testNumericalDerivative( - temperature, dT, dCompressibilityFactor_dt, + temperature, dT, compressibilityFactorDerivs[Deriv::dT], [&]( real64 const t ) -> real64 { return computeCompressibilityFactor( pressure, t, composition ); } ); @@ -649,7 +630,7 @@ class CompressibilityDerivativeTestFixture : public DerivativeTestFixture< EOS, for( integer ic = 0; ic < numComps; ++ic ) { geos::testing::internal::testNumericalDerivative( - 0.0, dz, dCompressibilityFactor_dz[ic], + 0.0, dz, compressibilityFactorDerivs[Deriv::dC+ic], [&]( real64 const z ) -> real64 { composition[ic] += z; real64 const compressibility = computeCompressibilityFactor( pressure, temperature, composition ); @@ -705,3 +686,140 @@ INSTANTIATE_TEST_SUITE_P( CompressibilityDerivativeSRK4TestFixture, ::testing::ValuesIn( generateTestData< 4 >()) ); + +template< typename EOS, int NC > +class FugacityDerivativeTestFixture : public DerivativeTestFixture< EOS, NC > +{ +public: + using DerivativeTestFixture< EOS, NC >::numComps; + using DerivativeTestFixture< EOS, NC >::numDof; + using Deriv = typename DerivativeTestFixture< EOS, NC >::Deriv; + using ParamType = typename DerivativeTestFixture< EOS, NC >::ParamType; +public: + void testNumericalDerivatives( ParamType const & testData ) const + { + auto const componentProperties = this->m_fluid->createKernelWrapper(); + + stackArray1d< real64, numComps > logFugacityCoefficients( numComps ); + stackArray2d< real64, numComps *numDof > logFugacityCoefficientDerivs( numComps, numDof ); + + stackArray1d< real64, numComps > composition; + real64 const pressure = std::get< 0 >( testData ); + real64 const temperature = std::get< 1 >( testData ); + TestFluid< NC >::createArray( composition, std::get< 2 >( testData )); + + auto const calculateLogFugacityCoefficients = [&]( integer const ic, real64 const p, real64 const t, auto const & zmf ) -> real64 { + stackArray1d< real64, numComps > displacedLogFugacityCoefficients( numComps ); + CubicEOSPhaseModel< EOS >::computeLogFugacityCoefficients( numComps, + p, + t, + zmf.toSliceConst(), + componentProperties, + displacedLogFugacityCoefficients.toSlice() ); + return displacedLogFugacityCoefficients[ic]; + }; + + // Calculate values + CubicEOSPhaseModel< EOS >::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + logFugacityCoefficients.toSlice() ); + + // Calculate derivatives + CubicEOSPhaseModel< EOS >::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + logFugacityCoefficients.toSliceConst(), + logFugacityCoefficientDerivs.toSlice() ); + + // Compare against numerical derivatives + // -- Pressure derivative + real64 const dp = 1.0e-4 * pressure; + for( integer ic = 0; ic < numComps; ++ic ) + { + geos::testing::internal::testNumericalDerivative( + pressure, dp, logFugacityCoefficientDerivs( ic, Deriv::dP ), + [&]( real64 const p ) -> real64 { + return calculateLogFugacityCoefficients( ic, p, temperature, composition ); + } ); + } + + // -- Temperature derivative + real64 const dT = 1.0e-6 * temperature; + for( integer ic = 0; ic < numComps; ++ic ) + { + geos::testing::internal::testNumericalDerivative( + temperature, dT, logFugacityCoefficientDerivs( ic, Deriv::dT ), + [&]( real64 const t ) -> real64 { + return calculateLogFugacityCoefficients( ic, pressure, t, composition ); + } ); + } + + // -- Composition derivatives + real64 const dz = 1.0e-7; + for( integer ic = 0; ic < numComps; ++ic ) + { + for( integer jc = 0; jc < numComps; ++jc ) + { + geos::testing::internal::testNumericalDerivative( + 0.0, dz, logFugacityCoefficientDerivs( ic, Deriv::dC + jc ), + [&]( real64 const z ) -> real64 { + composition[jc] += z; + real64 const logFugacityCoefficient = calculateLogFugacityCoefficients( ic, pressure, temperature, composition ); + composition[jc] -= z; + return logFugacityCoefficient; + }, 1.0e-6 ); + } + } + } +}; + +using FugacityDerivativePR2TestFixture = FugacityDerivativeTestFixture< PengRobinsonEOS, 2 >; +using FugacityDerivativePR4TestFixture = FugacityDerivativeTestFixture< PengRobinsonEOS, 4 >; +using FugacityDerivativeSRK2TestFixture = FugacityDerivativeTestFixture< SoaveRedlichKwongEOS, 2 >; +using FugacityDerivativeSRK4TestFixture = FugacityDerivativeTestFixture< SoaveRedlichKwongEOS, 4 >; + +TEST_P( FugacityDerivativePR2TestFixture, testNumericalDerivatives ) +{ + testNumericalDerivatives( GetParam() ); +} +TEST_P( FugacityDerivativePR4TestFixture, testNumericalDerivatives ) +{ + testNumericalDerivatives( GetParam() ); +} +TEST_P( FugacityDerivativeSRK2TestFixture, testNumericalDerivatives ) +{ + testNumericalDerivatives( GetParam() ); +} +TEST_P( FugacityDerivativeSRK4TestFixture, testNumericalDerivatives ) +{ + testNumericalDerivatives( GetParam() ); +} + +// 2-component fluid test +INSTANTIATE_TEST_SUITE_P( + CubicEOSTest, + FugacityDerivativePR2TestFixture, + ::testing::ValuesIn( generateTestData< 2 >()) + ); +INSTANTIATE_TEST_SUITE_P( + CubicEOSTest, + FugacityDerivativeSRK2TestFixture, + ::testing::ValuesIn( generateTestData< 2 >()) + ); + +// 4-component fluid test +INSTANTIATE_TEST_SUITE_P( + CubicEOSTest, + FugacityDerivativePR4TestFixture, + ::testing::ValuesIn( generateTestData< 4 >()) + ); +INSTANTIATE_TEST_SUITE_P( + CubicEOSTest, + FugacityDerivativeSRK4TestFixture, + ::testing::ValuesIn( generateTestData< 4 >()) + ); diff --git a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp index de5548fd714..30719f0eff7 100644 --- a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp +++ b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp @@ -56,13 +56,13 @@ class WilsonKValueInitializationTestFixture : integer const compIndex = std::get< 2 >( GetParam() ); real64 const expectedKValue = std::get< 3 >( GetParam() ); - array1d< real64 > kValues( numComps ); + stackArray1d< real64, NC > kValues( numComps ); KValueInitialization::computeWilsonGasLiquidKvalue( numComps, pressure, temperature, createKernelWrapper(), - kValues ); + kValues.toSlice() ); ASSERT_EQ( kValues.size(), NC ); checkRelativeError( expectedKValue, kValues[compIndex], relTol ); diff --git a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp new file mode 100644 index 00000000000..d956071bb5b --- /dev/null +++ b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp @@ -0,0 +1,277 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" +#include "constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp" +#include "constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp" +#include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" + +using namespace geos::constitutive::compositional; + +namespace geos +{ +namespace testing +{ + +template< int NC > +using ViscosityData = std::tuple< + integer const, // Mixing type + real64 const, // pressure + real64 const, // temperature + Feed< NC > const, // phase composition + real64 const // expected viscosity + >; + +template< int NC > +struct FluidData {}; + +template<> +struct FluidData< 9 > +{ + static std::unique_ptr< TestFluid< 9 > > createFluid() + { + auto fluid = TestFluid< 9 >::create( {Fluid::H2O, Fluid::CO2, Fluid::N2, Fluid::C5, Fluid::C2, Fluid::C3, Fluid::C4, Fluid::C5, Fluid::C10} ); + const std::array< real64 const, 36 > bics = { + 0.01, 0, 0.003732, 0, 0.01, 0, 0, 0.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0.01, 0, 0.028, 0.01, 0.01, 0, 0, 0.01, 0, 0.04532, 0.01, 0.01, 0, 0, 0 + }; + fluid->setBinaryCoefficients( bics ); + return fluid; + } +}; + +template< int NC > +class LohrenzBrayClarkViscosityTestFixture : public ::testing::TestWithParam< ViscosityData< NC > > +{ + static constexpr real64 relTol = 1.0e-5; + static constexpr real64 absTol = 1.0e-7; + static constexpr int numComps = NC; + static constexpr int numDofs = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; +public: + LohrenzBrayClarkViscosityTestFixture() + : m_fluid( FluidData< NC >::createFluid() ) + { + ComponentProperties const & componentProperties = this->m_fluid->getComponentProperties(); + m_density = std::make_unique< CompositionalDensity< CubicEOSPhaseModel< PengRobinsonEOS > > >( "PhaseDensity", componentProperties ); + m_viscosity = std::make_unique< LohrenzBrayClarkViscosity >( "PhaseViscosity", componentProperties ); + } + + ~LohrenzBrayClarkViscosityTestFixture() = default; + + void testViscosity( ViscosityData< NC > const & data ) + { + auto const mixing_type = static_cast< LohrenzBrayClarkViscosityUpdate::MixingType >(std::get< 0 >( data )); + real64 const pressure = std::get< 1 >( data ); + real64 const temperature = std::get< 2 >( data ); + stackArray1d< real64, numComps > phaseComposition; + TestFluid< NC >::createArray( phaseComposition, std::get< 3 >( data )); + real64 const expectedViscosity = std::get< 4 >( data ); + + real64 molarDensity = 0.0; + real64 massDensity = 0.0; + real64 viscosity = 0.0; + stackArray1d< real64, numDofs > tempDerivs( numDofs ); + + auto componentProperties = m_fluid->createKernelWrapper(); + auto densityKernelWrapper = m_density->createKernelWrapper(); + auto viscosityKernelWrapper = m_viscosity->createKernelWrapper(); + + viscosityKernelWrapper.setMixingType( mixing_type ); + + densityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + molarDensity, + tempDerivs.toSlice(), + massDensity, + tempDerivs.toSlice(), + false ); + + viscosityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + massDensity, + tempDerivs.toSliceConst(), + viscosity, + tempDerivs.toSlice(), + false ); + + checkRelativeError( viscosity, expectedViscosity, relTol, absTol ); + } + + void testViscosityDerivatives( ViscosityData< NC > const & data ) + { + auto const mixing_type = static_cast< LohrenzBrayClarkViscosityUpdate::MixingType >(std::get< 0 >( data )); + real64 const pressure = std::get< 1 >( data ); + real64 const temperature = std::get< 2 >( data ); + stackArray1d< real64, numComps > phaseComposition; + TestFluid< NC >::createArray( phaseComposition, std::get< 3 >( data )); + + auto componentProperties = m_fluid->createKernelWrapper(); + auto densityKernelWrapper = m_density->createKernelWrapper(); + auto viscosityKernelWrapper = m_viscosity->createKernelWrapper(); + + viscosityKernelWrapper.setMixingType( mixing_type ); + + real64 molarDensity = 0.0; + real64 massDensity = 0.0; + real64 viscosity = 0.0; + stackArray1d< real64, numDofs > molarDensityDerivs( numDofs ); + stackArray1d< real64, numDofs > massDensityDerivs( numDofs ); + stackArray1d< real64, numDofs > viscosityDerivs( numDofs ); + + densityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + molarDensity, + molarDensityDerivs.toSlice(), + massDensity, + massDensityDerivs.toSlice(), + false ); + + viscosityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + massDensity, + massDensityDerivs.toSliceConst(), + viscosity, + viscosityDerivs.toSlice(), + false ); + + auto calculateViscosity = [&]( real64 const p, real64 const t, auto const & zmf ) -> real64 { + real64 densityMolar = 0.0; + real64 densityMass = 0.0; + real64 phaseViscosity = 0.0; + stackArray1d< real64, numDofs > tempDerivs( numDofs ); + densityKernelWrapper.compute( componentProperties, p, t, zmf.toSliceConst(), + densityMolar, tempDerivs.toSlice(), densityMass, tempDerivs.toSlice(), false ); + viscosityKernelWrapper.compute( componentProperties, p, t, zmf.toSliceConst(), + densityMass, tempDerivs.toSliceConst(), phaseViscosity, tempDerivs.toSlice(), false ); + return phaseViscosity; + }; + + // Viscosity values are very small so we will inflate the values to avoid false positives due + // to the absolute value check + real64 constexpr scale = 1.0e6; + + // Compare against numerical derivatives + // -- Pressure derivative + real64 const dp = 1.0e-4 * pressure; + internal::testNumericalDerivative( + pressure, dp, scale*viscosityDerivs[Deriv::dP], + [&]( real64 const p ) -> real64 { + return scale*calculateViscosity( p, temperature, phaseComposition ); + } ); + + // -- Temperature derivative + real64 const dT = 1.0e-6 * temperature; + internal::testNumericalDerivative( + temperature, dT, scale*viscosityDerivs[Deriv::dT], + [&]( real64 const t ) -> real64 { + return scale*calculateViscosity( pressure, t, phaseComposition ); + } ); + + // -- Composition derivatives derivative + real64 const dz = 1.0e-7; + for( integer ic = 0; ic < 1; ++ic ) + { + internal::testNumericalDerivative( + 0.0, dz, scale*viscosityDerivs[Deriv::dC + ic], + [&]( real64 const z ) -> real64 { + stackArray1d< real64, numComps > zmf( numComps ); + for( integer jc = 0; jc < numComps; ++jc ) + { + zmf[jc] = phaseComposition[jc]; + } + zmf[ic] += z; + return scale*calculateViscosity( pressure, temperature, zmf ); + } ); + } + } + +protected: + std::unique_ptr< TestFluid< NC > > m_fluid{}; + std::unique_ptr< CompositionalDensity< CubicEOSPhaseModel< PengRobinsonEOS > > > m_density{}; + std::unique_ptr< LohrenzBrayClarkViscosity > m_viscosity{}; +}; + +using LohrenzBrayClarkViscosity9 = LohrenzBrayClarkViscosityTestFixture< 9 >; + +TEST_P( LohrenzBrayClarkViscosity9, testViscosity ) +{ + testViscosity( GetParam() ); +} + +TEST_P( LohrenzBrayClarkViscosity9, testViscosityDerivatives ) +{ + testViscosityDerivatives( GetParam() ); +} + +//------------------------------------------------------------------------------- +// Data generated by PVTPackage +//------------------------------------------------------------------------------- +INSTANTIATE_TEST_SUITE_P( + LohrenzBrayClarkViscosity, + LohrenzBrayClarkViscosity9, + ::testing::ValuesIn( { + ViscosityData< 9 >{ 0, 1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.041140e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.001152e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.064158e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.761220e-05 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.659626e-05 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.844604e-05 }, + ViscosityData< 9 >{ 0, 1.839590e+06, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.062011e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.021978e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.085108e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+06, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.681288e-05 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.230528e-05 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1.959149e-05 }, + ViscosityData< 9 >{ 0, 1.839590e+06, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.033595e-05 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.923634e-05 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 2.133312e-05 }, + ViscosityData< 9 >{ 0, 1.839590e+06, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.681118e-05 }, + ViscosityData< 9 >{ 1, 1.839590e+06, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.229779e-05 }, + ViscosityData< 9 >{ 2, 1.839590e+06, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 1.959939e-05 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 6.123583e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 6.083595e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 6.146601e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.451048e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.440889e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.459387e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 6.170310e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 6.130277e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 2.971500e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 6.193407e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 4.720985e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 4.675909e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 3.630000e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 4.748771e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.078437e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.067441e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 3.630000e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 1.088409e-04 }, + ViscosityData< 9 >{ 0, 1.839590e+08, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 4.763030e-04 }, + ViscosityData< 9 >{ 1, 1.839590e+08, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 4.717896e-04 }, + ViscosityData< 9 >{ 2, 1.839590e+08, 3.630000e+02, {0.008990, 0.002990, 0.532810, 0.114470, 0.087910, 0.045660, 0.020950, 0.015160, 0.171070}, 4.790912e-04 } + } ) + ); + +} // testing + +} // geos diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp index bfc074c578d..6dfc1929eb1 100644 --- a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp @@ -17,6 +17,7 @@ #include "constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp" #include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" #include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" using namespace geos::constitutive::compositional; @@ -64,6 +65,8 @@ class NegativeTwoPhaseFlashTestFixture : public ::testing::TestWithParam< Flash static constexpr real64 relTol = 1.0e-5; static constexpr real64 absTol = 1.0e-7; static constexpr int numComps = NC; + static constexpr int numDofs = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; public: NegativeTwoPhaseFlashTestFixture() : m_fluid( FluidData< NC >::createFluid() ) @@ -77,30 +80,33 @@ class NegativeTwoPhaseFlashTestFixture : public ::testing::TestWithParam< Flash real64 const pressure = std::get< 0 >( data ); real64 const temperature = std::get< 1 >( data ); - array1d< real64 > composition; + stackArray1d< real64, numComps > composition; TestFluid< NC >::createArray( composition, std::get< 2 >( data )); bool const expectedStatus = std::get< 3 >( data ); real64 const expectedVapourFraction = std::get< 4 >( data ); - stackArray1d< real64, NC > expectedLiquidComposition; + stackArray1d< real64, numComps > expectedLiquidComposition; TestFluid< NC >::createArray( expectedLiquidComposition, std::get< 5 >( data )); - stackArray1d< real64, NC > expectedVapourComposition; + stackArray1d< real64, numComps > expectedVapourComposition; TestFluid< NC >::createArray( expectedVapourComposition, std::get< 6 >( data )); real64 vapourFraction = -1.0; - array1d< real64 > liquidComposition( numComps ); - array1d< real64 > vapourComposition( numComps ); + stackArray1d< real64, numComps > liquidComposition( numComps ); + stackArray1d< real64, numComps > vapourComposition( numComps ); + stackArray2d< real64, numComps > kValues( 1, numComps ); + kValues.zero(); bool status = NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( numComps, pressure, temperature, - composition, + composition.toSliceConst(), componentProperties, + kValues.toSlice(), vapourFraction, - liquidComposition, - vapourComposition ); + liquidComposition.toSlice(), + vapourComposition.toSlice() ); // Check the flash success result ASSERT_EQ( expectedStatus, status ); @@ -132,6 +138,126 @@ class NegativeTwoPhaseFlashTestFixture : public ::testing::TestWithParam< Flash } } + void testFlashDerivatives( FlashData< NC > const & data ) + { + // Number of output values from each flash calculation + constexpr integer numValues = 1 + 2*numComps; + + auto componentProperties = this->m_fluid->createKernelWrapper(); + + bool const expectedStatus = std::get< 3 >( data ); + if( !expectedStatus ) return; + + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > composition; + TestFluid< NC >::createArray( composition, std::get< 2 >( data )); + + real64 vapourFraction = -1.0; + stackArray1d< real64, numComps > liquidComposition( numComps ); + stackArray1d< real64, numComps > vapourComposition( numComps ); + stackArray2d< real64, numComps > kValues( 1, numComps ); + kValues.zero(); + + stackArray1d< real64, numDofs > vapourFractionDerivs( numDofs ); + stackArray2d< real64, numComps * numDofs > liquidCompositionDerivs( numComps, numDofs ); + stackArray2d< real64, numComps * numDofs > vapourCompositionDerivs( numComps, numDofs ); + stackArray1d< real64, numValues > derivatives( numValues ); + + // Combine values and derivatives into a single output + auto const concatDerivatives = []( integer const kc, auto & derivs, auto const & v, auto const & xmf, auto const & ymf ){ + derivs[0] = v[kc]; + for( integer ic = 0; ic < numComps; ++ic ) + { + derivs[1+ic] = xmf( ic, kc ); + derivs[1+ic+numComps] = ymf( ic, kc ); + } + }; + std::cout << std::scientific << std::setprecision( 8 ); + + auto const evaluateFlash = [&]( real64 const p, real64 const t, auto const & zmf, auto & values ){ + stackArray1d< real64, numComps > displacedLiquidComposition( numComps ); + stackArray1d< real64, numComps > displacedVapourComposition( numComps ); + kValues.zero(); + + NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + numComps, + p, + t, + zmf.toSliceConst(), + componentProperties, + kValues.toSlice(), + values[0], + displacedLiquidComposition.toSlice(), + displacedVapourComposition.toSlice() ); + for( integer ic = 0; ic < numComps; ++ic ) + { + values[1+ic] = displacedLiquidComposition[ic]; + values[1+ic+numComps] = displacedVapourComposition[ic]; + } + }; + + NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + kValues.toSlice(), + vapourFraction, + liquidComposition.toSlice(), + vapourComposition.toSlice() ); + + NegativeTwoPhaseFlash::computeDerivatives< EOS_TYPE, EOS_TYPE >( + numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + vapourFraction, + liquidComposition.toSliceConst(), + vapourComposition.toSliceConst(), + vapourFractionDerivs.toSlice(), + liquidCompositionDerivs.toSlice(), + vapourCompositionDerivs.toSlice() ); + + // Test against numerically calculated values + // --- Pressure derivatives --- + concatDerivatives( Deriv::dP, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + real64 const dp = 1.0e-4 * pressure; + geos::testing::internal::testNumericalDerivative< numValues >( + pressure, dp, derivatives, + [&]( real64 const p, auto & values ) { + evaluateFlash( p, temperature, composition, values ); + } ); + + // --- Temperature derivatives --- + concatDerivatives( Deriv::dT, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + real64 const dT = 1.0e-6 * temperature; + geos::testing::internal::testNumericalDerivative< numValues >( + temperature, dT, derivatives, + [&]( real64 const t, auto & values ) { + evaluateFlash( pressure, t, composition, values ); + } ); + + // --- Composition derivatives --- + real64 constexpr dz = 1.0e-7; + for( integer jc = 0; jc < numComps; ++jc ) + { + if( composition[jc] < 1.0e-6 ) continue; + integer const kc = Deriv::dC + jc; + concatDerivatives( kc, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + geos::testing::internal::testNumericalDerivative< numValues >( + 0.0, dz, derivatives, + [&]( real64 const z, auto & values ) { + real64 const originalFraction = composition[jc]; + composition[jc] += z; + evaluateFlash( pressure, temperature, composition, values ); + composition[jc] = originalFraction; + }, relTol, absTol ); + } + } + protected: std::unique_ptr< TestFluid< NC > > m_fluid{}; }; @@ -161,6 +287,26 @@ TEST_P( NegativeTwoPhaseFlash4CompSRK, testNegativeFlash ) testFlash( GetParam() ); } +TEST_P( NegativeTwoPhaseFlash2CompPR, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash2CompSRK, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash4CompPR, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash4CompSRK, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + //------------------------------------------------------------------------------- // Data generated by PVTPackage //------------------------------------------------------------------------------- @@ -210,10 +356,10 @@ INSTANTIATE_TEST_SUITE_P( FlashData< 2 >( 1.013250e+05, 1.231500e+02, { 0.50000000, 0.50000000 }, true, 0.44681454, { 0.90248098, 0.09751902 }, { 0.00170237, 0.99829763 } ), FlashData< 2 >( 1.013250e+05, 1.231500e+02, { 0.90000000, 0.10000000 }, true, 0.00275426, { 0.90248098, 0.09751902 }, { 0.00170237, 0.99829763 } ), FlashData< 2 >( 1.000000e+06, 1.231500e+02, { 0.10000000, 0.90000000 }, true, 0.00000000, { 0.10000000, 0.90000000 }, { 0.10000000, 0.90000000 } ), - FlashData< 2 >( 1.000000e+06, 1.231500e+02, { 0.50000000, 0.50000000 }, false, 0.00000000, { 0.50000000, 0.50000000 }, { 0.49950202, 0.50049798 } ), + FlashData< 2 >( 1.000000e+06, 1.231500e+02, { 0.50000000, 0.50000000 }, true, 0.00000000, { 0.50000000, 0.50000000 }, { 0.49950202, 0.50049798 } ), FlashData< 2 >( 1.000000e+06, 1.231500e+02, { 0.90000000, 0.10000000 }, true, 0.00000000, { 0.90000000, 0.10000000 }, { 0.90000000, 0.10000000 } ), FlashData< 2 >( 5.000000e+06, 1.231500e+02, { 0.75000000, 0.25000000 }, true, 0.00000000, { 0.75000000, 0.25000000 }, { 0.74999999, 0.25000001 } ), - FlashData< 2 >( 5.000000e+06, 1.231500e+02, { 0.50000000, 0.50000000 }, false, 0.00000000, { 0.50000000, 0.50000000 }, { 0.49979984, 0.50020016 } ), + FlashData< 2 >( 5.000000e+06, 1.231500e+02, { 0.50000000, 0.50000000 }, true, 0.00000000, { 0.50000000, 0.50000000 }, { 0.49979984, 0.50020016 } ), FlashData< 2 >( 5.000000e+06, 1.231500e+02, { 0.90000000, 0.10000000 }, true, 0.00000000, { 0.90000000, 0.10000000 }, { 0.90000000, 0.10000000 } ), FlashData< 2 >( 1.000000e+08, 1.231500e+02, { 0.90000000, 0.10000000 }, true, 0.00000000, { 0.90000000, 0.10000000 }, { 0.90000000, 0.10000000 } ), FlashData< 2 >( 1.000000e+05, 1.931500e+02, { 0.10000000, 0.90000000 }, true, 1.00000000, { 0.10000000, 0.90000000 }, { 0.10000000, 0.90000000 } ), @@ -316,13 +462,13 @@ INSTANTIATE_TEST_SUITE_P( { 0.59975210, 0.00000000, 0.00078842, 0.39945949 } ), FlashData< 4 >( 1.000000e+07, 4.731500e+02, { 0.01000000, 0.00000000, 0.00000000, 0.99000000 }, true, 0.01121076, { 0.00102378, 0.00000000, 0.00000000, 0.99897622 }, { 0.80170284, 0.00000000, 0.00000000, 0.19829716 } ), - FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.05695100, 0.10481800, 0.10482200, 0.73340900 }, false, 0.00000000, { 0.05695100, 0.10481800, 0.10482200, 0.73340900 }, + FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.05695100, 0.10481800, 0.10482200, 0.73340900 }, true, 0.00000000, { 0.05695100, 0.10481800, 0.10482200, 0.73340900 }, { 0.72438623, 0.02564505, 0.01665696, 0.23331176 } ), - FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.15695100, 0.10481800, 0.10482200, 0.63340900 }, false, 0.00000000, { 0.15695100, 0.10481800, 0.10482200, 0.63340900 }, + FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.15695100, 0.10481800, 0.10482200, 0.63340900 }, true, 0.00000000, { 0.15695100, 0.10481800, 0.10482200, 0.63340900 }, { 0.73612750, 0.02738195, 0.01777184, 0.21871871 } ), FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.00000000, 0.10481800, 0.10482200, 0.79036000 }, true, 0.72801768, { 0.00000000, 0.38538472, 0.38540005, 0.22921523 }, { 0.00000000, 0.00000023, 0.00000000, 0.99999977 } ), - FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.10481800, 0.00000000, 0.10482200, 0.79036000 }, false, 0.00000000, { 0.10481800, 0.00000000, 0.10482200, 0.79036000 }, + FlashData< 4 >( 1.000000e+08, 4.731500e+02, { 0.10481800, 0.00000000, 0.10482200, 0.79036000 }, true, 0.00000000, { 0.10481800, 0.00000000, 0.10482200, 0.79036000 }, { 0.74504275, 0.00000000, 0.01613702, 0.23882023 } ) ) ); diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp new file mode 100644 index 00000000000..9e214b56e5b --- /dev/null +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp @@ -0,0 +1,540 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" +#include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" + +using namespace geos::constitutive::compositional; + +namespace geos +{ +namespace testing +{ + +static constexpr integer numComps = 9; + +using FlashData = std::tuple< + real64 const, // pressure + real64 const, // temperature + Feed< numComps > const, // total composition + int, // expected flash status (success (1)/failure (0)) + real64 const, // expected vapour fraction + Feed< 2 > const, // expected liquid composition (2 selected components) + Feed< 2 > const // expected vapour composition (2 selected components) + >; + +template< typename EOS_TYPE > +class NegativeTwoPhaseFlashTest9CompFixture : public ::testing::TestWithParam< FlashData > +{ + static constexpr real64 relTol = 1.0e-5; + static constexpr real64 absTol = 1.0e-7; + static constexpr int numDofs = numComps + 2; + // Selected components for test + static constexpr int comp0 = 0; + static constexpr int comp1 = numComps-1; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; +public: + NegativeTwoPhaseFlashTest9CompFixture() + : m_fluid( createFluid() ) + {} + + ~NegativeTwoPhaseFlashTest9CompFixture() = default; + + void testFlash( FlashData const & data ) + { + auto componentProperties = this->m_fluid->createKernelWrapper(); + + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > composition; + TestFluid< numComps >::createArray( composition, std::get< 2 >( data )); + + bool const expectedStatus = std::get< 3 >( data ); + real64 const expectedVapourFraction = std::get< 4 >( data ); + + stackArray1d< real64, numComps > expectedLiquidComposition; + stackArray1d< real64, numComps > expectedVapourComposition; + TestFluid< numComps >::createArray( expectedLiquidComposition, std::get< 5 >( data )); + TestFluid< numComps >::createArray( expectedVapourComposition, std::get< 6 >( data )); + + real64 vapourFraction = -1.0; + stackArray1d< real64, numComps > liquidComposition( numComps ); + stackArray1d< real64, numComps > vapourComposition( numComps ); + stackArray2d< real64, numComps > kValues( 1, numComps ); + kValues.zero(); + + bool status = NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + kValues.toSlice(), + vapourFraction, + liquidComposition.toSlice(), + vapourComposition.toSlice() ); + + // Check the flash success result + ASSERT_EQ( expectedStatus, status ); + + if( !expectedStatus ) + { + return; + } + + // Check the vaopur fraction + checkRelativeError( expectedVapourFraction, vapourFraction, relTol, absTol ); + + // Check liquid composition + if( expectedVapourFraction < 1.0 - absTol ) + { + checkRelativeError( expectedLiquidComposition[0], liquidComposition[comp0], relTol, absTol ); + checkRelativeError( expectedLiquidComposition[1], liquidComposition[comp1], relTol, absTol ); + } + + // Check vapour composition + if( absTol < expectedVapourFraction ) + { + checkRelativeError( expectedVapourComposition[0], vapourComposition[comp0], relTol, absTol ); + checkRelativeError( expectedVapourComposition[1], vapourComposition[comp1], relTol, absTol ); + } + } + + void testFlashDerivatives( FlashData const & data ) + { + // Number of output values from each flash calculation + constexpr integer numValues = 1 + 2*numComps; + + auto componentProperties = this->m_fluid->createKernelWrapper(); + + bool const expectedStatus = std::get< 3 >( data ); + if( !expectedStatus ) return; + + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > composition; + TestFluid< numComps >::createArray( composition, std::get< 2 >( data )); + + real64 vapourFraction = -1.0; + stackArray1d< real64, numComps > liquidComposition( numComps ); + stackArray1d< real64, numComps > vapourComposition( numComps ); + stackArray2d< real64, numComps > kValues( 1, numComps ); + kValues.zero(); + + stackArray1d< real64, numDofs > vapourFractionDerivs( numDofs ); + stackArray2d< real64, numComps * numDofs > liquidCompositionDerivs( numComps, numDofs ); + stackArray2d< real64, numComps * numDofs > vapourCompositionDerivs( numComps, numDofs ); + stackArray1d< real64, numValues > derivatives( numValues ); + + // Combine values and derivatives into a single output + auto const concatDerivatives = []( integer const kc, auto & derivs, auto const & v, auto const & xmf, auto const & ymf ){ + derivs[0] = v[kc]; + for( integer ic = 0; ic < numComps; ++ic ) + { + derivs[1+ic] = xmf( ic, kc ); + derivs[1+ic+numComps] = ymf( ic, kc ); + } + }; + + auto const evaluateFlash = [&]( real64 const p, real64 const t, auto const & zmf, auto & values ){ + stackArray1d< real64, numComps > displacedLiquidComposition( numComps ); + stackArray1d< real64, numComps > displacedVapourComposition( numComps ); + + NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + numComps, + p, + t, + zmf.toSliceConst(), + componentProperties, + kValues.toSlice(), + values[0], + displacedLiquidComposition.toSlice(), + displacedVapourComposition.toSlice() ); + for( integer ic = 0; ic < numComps; ++ic ) + { + values[1+ic] = displacedLiquidComposition[ic]; + values[1+ic+numComps] = displacedVapourComposition[ic]; + } + }; + + NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + kValues.toSlice(), + vapourFraction, + liquidComposition.toSlice(), + vapourComposition.toSlice() ); + + NegativeTwoPhaseFlash::computeDerivatives< EOS_TYPE, EOS_TYPE >( + numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + vapourFraction, + liquidComposition.toSliceConst(), + vapourComposition.toSliceConst(), + vapourFractionDerivs.toSlice(), + liquidCompositionDerivs.toSlice(), + vapourCompositionDerivs.toSlice() ); + + // Test against numerically calculated values + // --- Pressure derivatives --- + concatDerivatives( Deriv::dP, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + real64 const dp = 1.0e-4 * pressure; + geos::testing::internal::testNumericalDerivative< numValues >( + pressure, dp, derivatives, + [&]( real64 const p, auto & values ) { + evaluateFlash( p, temperature, composition, values ); + } ); + + // --- Temperature derivatives --- + concatDerivatives( Deriv::dT, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + real64 const dT = 1.0e-6 * temperature; + geos::testing::internal::testNumericalDerivative< numValues >( + temperature, dT, derivatives, + [&]( real64 const t, auto & values ) { + evaluateFlash( pressure, t, composition, values ); + } ); + + // --- Composition derivatives --- + real64 constexpr dz = 1.0e-7; + for( integer jc = 0; jc < numComps; ++jc ) + { + if( composition[jc] < 1.0e-6 ) continue; + integer const kc = Deriv::dC + jc; + concatDerivatives( kc, derivatives, vapourFractionDerivs, liquidCompositionDerivs, vapourCompositionDerivs ); + geos::testing::internal::testNumericalDerivative< numValues >( + 0.0, dz, derivatives, + [&]( real64 const z, auto & values ) { + real64 const originalFraction = composition[jc]; + composition[jc] += z; + evaluateFlash( pressure, temperature, composition, values ); + composition[jc] = originalFraction; + }, 10*relTol, 10*absTol ); + } + } + +protected: + std::unique_ptr< TestFluid< numComps > > m_fluid{}; +private: + static std::unique_ptr< TestFluid< numComps > > createFluid(); +}; + +template< typename EOS_TYPE > +std::unique_ptr< TestFluid< numComps > > NegativeTwoPhaseFlashTest9CompFixture< EOS_TYPE >::createFluid() +{ + std::unique_ptr< TestFluid< numComps > > fluid = TestFluid< numComps >::create( {0, 0, 0, 0, 0, 0, 0, 0, 0} ); + // Manually populate + TestFluid< numComps >::populateArray( fluid->criticalPressure, Feed< 9 >{73.8659e5, 33.9439e5, 46.0421e5, 48.8387e5, 42.4552e5, 37.47e5, 33.5892e5, 30.1037e5, 20.549e5} ); + TestFluid< numComps >::populateArray( fluid->criticalTemperature, Feed< 9 >{304.7, 126.2, 190.6, 305.43, 369.8, 419.5, 465.9, 507.5, 678.8} ); + TestFluid< numComps >::populateArray( fluid->criticalVolume, Feed< 9 >{9.3999e-05, 9.0001e-05, 9.7999e-05, 1.4800e-04, 2.0000e-04, 2.5800e-04, 3.1000e-04, 3.5100e-04, 6.8243e-04} ); + TestFluid< numComps >::populateArray( fluid->acentricFactor, Feed< 9 >{0.225, 0.04, 0.013, 0.0986, 0.1524, 0.1956, 0.2413, 0.299, 0.5618} ); + TestFluid< numComps >::populateArray( fluid->molecularWeight, Feed< 9 >{44.01e-3, 28.01e-3, 16.04e-3, 30.07e-3, 44.1e-3, 58.12e-3, 72.15e-3, 84e-3, 173e-3} ); + TestFluid< numComps >::populateArray( fluid->volumeShift, Feed< 9 >{ -0.04958, -0.136012, -0.1486264, -0.10863408, -0.08349872, -0.06331568, -0.04196464, -0.0150072, 0.0000 } ); + fluid->setBinaryCoefficients( Feed< 36 >{ + 1.0000e-02, + 0.0000e+00, 3.7320e-03, + 0.0000e+00, 1.0000e-02, 0.0000e+00, + 0.0000e+00, 1.0000e-02, 0.0000e+00, 0.0000e+00, + 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, + 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, + 1.0000e-02, 0.0000e+00, 2.8000e-02, 1.0000e-02, 1.0000e-02, 0.0000e+00, 0.0000e+00, + 1.0000e-02, 0.0000e+00, 4.5320e-02, 1.0000e-02, 1.0000e-02, 0.0000e+00, 0.0000e+00, 0.0000e+00 + } ); + return fluid; +} + +using NegativeTwoPhaseFlash9CompPR = NegativeTwoPhaseFlashTest9CompFixture< CubicEOSPhaseModel< PengRobinsonEOS > >; +using NegativeTwoPhaseFlash9CompSRK = NegativeTwoPhaseFlashTest9CompFixture< CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; + +TEST_P( NegativeTwoPhaseFlash9CompPR, testNegativeFlash ) +{ + testFlash( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash9CompPR, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash9CompSRK, testNegativeFlash ) +{ + testFlash( GetParam() ); +} + +TEST_P( NegativeTwoPhaseFlash9CompSRK, testNegativeFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +//------------------------------------------------------------------------------- +// Data +//------------------------------------------------------------------------------- + +/* UNCRUSTIFY-OFF */ + +INSTANTIATE_TEST_SUITE_P( + NegativeTwoPhaseFlash, + NegativeTwoPhaseFlash9CompPR, + ::testing::Values( + FlashData( 1.000000e+05, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.798353, {0.000363, 0.839010}, {0.011181, 0.000020} ), + FlashData( 1.000000e+05, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998685, {0.000228, 0.938644}, {0.007035, 0.000022} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.798070, {0.000368, 0.837836}, {0.011184, 0.000020} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998684, {0.000231, 0.937856}, {0.007035, 0.000022} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.700780, {0.003486, 0.565464}, {0.011355, 0.000003} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.997643, {0.002159, 0.531971}, {0.007037, 0.000002} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.349114, {0.010010, 0.259905}, {0.007116, 0.000090} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.991703, {0.009755, 0.140969}, {0.007003, 0.000087} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.176058, {0.009422, 0.205086}, {0.007026, 0.001256} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.009422, 0.205089}, {0.007026, 0.001256} ), + FlashData( 5.000000e+07, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+08, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.001168, {0.000348, 0.839991}, {0.013059, 0.000053} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.805671, {0.000295, 0.870461}, {0.011100, 0.000055} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998750, {0.000187, 0.957531}, {0.007035, 0.000059} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.001057, {0.000350, 0.839898}, {0.012947, 0.000052} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.805431, {0.000299, 0.869390}, {0.011102, 0.000054} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998749, {0.000189, 0.956982}, {0.007035, 0.000058} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.719045, {0.002880, 0.602213}, {0.011391, 0.000007} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998097, {0.001770, 0.656139}, {0.007036, 0.000007} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.391974, {0.009806, 0.278198}, {0.007750, 0.000123} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.994318, {0.008887, 0.201207}, {0.007015, 0.000113} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.231493, {0.009474, 0.219807}, {0.007427, 0.001195} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999406, {0.009004, 0.228228}, {0.007025, 0.001121} ), + FlashData( 5.000000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.002535, {0.000327, 0.841142}, {0.014448, 0.000119} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.811028, {0.000249, 0.894832}, {0.011039, 0.000125} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998841, {0.000158, 0.968326}, {0.007034, 0.000134} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.002401, {0.000329, 0.841029}, {0.014353, 0.000118} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.810823, {0.000253, 0.893869}, {0.011041, 0.000124} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998839, {0.000161, 0.967914}, {0.007034, 0.000132} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.733594, {0.002451, 0.635078}, {0.011378, 0.000016} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998313, {0.001505, 0.734457}, {0.007035, 0.000017} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.426139, {0.009539, 0.294719}, {0.008274, 0.000169} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.995698, {0.008127, 0.256601}, {0.007021, 0.000153} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.275063, {0.009454, 0.232929}, {0.007803, 0.001242} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999403, {0.008577, 0.252667}, {0.007025, 0.001106} ), + FlashData( 5.000000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.009514, {0.000227, 0.847062}, {0.014475, 0.000776} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.820830, {0.000171, 0.940506}, {0.010927, 0.000840} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999605, {0.000110, 0.982954}, {0.007029, 0.000869} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.009213, {0.000231, 0.846804}, {0.014528, 0.000766} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.820694, {0.000173, 0.939845}, {0.010929, 0.000829} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999594, {0.000111, 0.982731}, {0.007029, 0.000858} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.763803, {0.001692, 0.716010}, {0.011260, 0.000105} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998655, {0.001048, 0.848573}, {0.007034, 0.000115} ), + FlashData( 1.000000e+07, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.500392, {0.008630, 0.338259}, {0.009369, 0.000406} ), + FlashData( 1.000000e+07, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.997667, {0.006476, 0.384497}, {0.007027, 0.000360} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.367748, {0.009160, 0.266615}, {0.008725, 0.001720} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 5.000000e+07, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.031155, {0.000097, 0.865831}, {0.008647, 0.004929} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.829852, {0.000120, 0.968392}, {0.010821, 0.005338} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.030488, {0.000099, 0.865241}, {0.008755, 0.004866} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.829724, {0.000121, 0.968002}, {0.010822, 0.005269} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.787992, {0.001191, 0.795638}, {0.011101, 0.000658} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999382, {0.000748, 0.906103}, {0.007030, 0.000696} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.567463, {0.007479, 0.389712}, {0.010159, 0.001120} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999429, {0.005131, 0.493383}, {0.007027, 0.000975} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.449715, {0.008545, 0.304966}, {0.009556, 0.003072} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.053370, {0.000054, 0.885524}, {0.005836, 0.013991} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.839835, {0.000099, 0.977972}, {0.010698, 0.014959} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.013250e+05, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.052543, {0.000056, 0.884773}, {0.005903, 0.013808} ), + FlashData( 1.013250e+05, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.839621, {0.000100, 0.977689}, {0.010700, 0.014767} ), + FlashData( 1.013250e+05, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.799362, {0.000988, 0.836026}, {0.011011, 0.001828} ), + FlashData( 1.000000e+06, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+07, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.602229, {0.006805, 0.422215}, {0.010450, 0.002084} ), + FlashData( 1.000000e+07, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.500000e+07, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.492074, {0.008098, 0.328602}, {0.009931, 0.004663} ), + FlashData( 1.500000e+07, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+05, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.078426, {0.000034, 0.907428}, {0.004230, 0.035040} ), + FlashData( 1.000000e+05, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.860286, {0.000083, 0.983960}, {0.010448, 0.036880} ), + FlashData( 1.000000e+05, 3.931500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.013250e+05, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.077531, {0.000035, 0.906620}, {0.004269, 0.034580} ), + FlashData( 1.013250e+05, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.859825, {0.000084, 0.983745}, {0.010454, 0.036407} ), + FlashData( 1.000000e+06, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.808966, {0.000846, 0.866838}, {0.010926, 0.004456} ), + FlashData( 1.000000e+07, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.630979, {0.006236, 0.452193}, {0.010617, 0.003695} ), + FlashData( 1.500000e+07, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.527277, {0.007678, 0.350047}, {0.010185, 0.007065} ), + FlashData( 1.500000e+07, 3.931500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 5.000000e+07, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.013250e+05, 5.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.013401, {0.000295, 0.847670}, {0.005333, 0.201455} ), + FlashData( 1.000000e+06, 5.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 1.000000, {0.009000, 0.169200}, {0.009000, 0.169200} ), + FlashData( 1.000000e+07, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 5.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.783614, {0.004654, 0.554668}, {0.010200, 0.062757} ), + FlashData( 1.500000e+07, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 5.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.717160, {0.006496, 0.400841}, {0.009988, 0.077843} ), + FlashData( 1.013250e+05, 5.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 5.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.166124, {0.000103, 0.906268}, {0.001666, 0.501402} ), + FlashData( 1.000000e+07, 5.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.947056, {0.004797, 0.541766}, {0.009235, 0.148372} ), + FlashData( 8.000000e+07, 8.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 8.000000e+07, 8.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 1.000000, {0.009000, 0.169200}, {0.009000, 0.169200} ), + FlashData( 8.000000e+07, 8.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 1.000000, {0.009000, 0.169200}, {0.009000, 0.169200} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ) + ) + ); + +INSTANTIATE_TEST_SUITE_P( + NegativeTwoPhaseFlash, + NegativeTwoPhaseFlash9CompSRK, + ::testing::Values( + FlashData( 1.000000e+05, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000197, {0.000361, 0.839175}, {0.010852, 0.000016} ), + FlashData( 1.000000e+05, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.798097, {0.000372, 0.837963}, {0.011183, 0.000016} ), + FlashData( 1.000000e+05, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998678, {0.000233, 0.937435}, {0.007035, 0.000017} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000102, {0.000362, 0.839096}, {0.010741, 0.000015} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.797815, {0.000377, 0.836797}, {0.011185, 0.000015} ), + FlashData( 1.013250e+05, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998677, {0.000236, 0.936631}, {0.007035, 0.000017} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.701296, {0.003551, 0.566442}, {0.011321, 0.000002} ), + FlashData( 1.000000e+06, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.997601, {0.002208, 0.522879}, {0.007038, 0.000002} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.355337, {0.010126, 0.262428}, {0.006957, 0.000064} ), + FlashData( 1.000000e+07, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.990607, {0.010007, 0.127315}, {0.006998, 0.000061} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.189968, {0.009500, 0.208646}, {0.006869, 0.001001} ), + FlashData( 1.500000e+07, 2.781500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998881, {0.009683, 0.203759}, {0.007023, 0.001029} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.001347, {0.000346, 0.840142}, {0.012715, 0.000042} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.805502, {0.000302, 0.869750}, {0.011100, 0.000044} ), + FlashData( 1.000000e+05, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998737, {0.000191, 0.957109}, {0.007035, 0.000047} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.001238, {0.000348, 0.840050}, {0.012604, 0.000042} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.805263, {0.000306, 0.868685}, {0.011102, 0.000043} ), + FlashData( 1.013250e+05, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998736, {0.000193, 0.956554}, {0.007035, 0.000047} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.719517, {0.002933, 0.603231}, {0.011365, 0.000006} ), + FlashData( 1.000000e+06, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998081, {0.001810, 0.651470}, {0.007036, 0.000006} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.396003, {0.009922, 0.280076}, {0.007594, 0.000088} ), + FlashData( 1.000000e+07, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.993728, {0.009141, 0.187545}, {0.007013, 0.000080} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.240606, {0.009550, 0.222512}, {0.007264, 0.000938} ), + FlashData( 1.500000e+07, 2.886500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998414, {0.009259, 0.224729}, {0.007022, 0.000901} ), + FlashData( 5.000000e+07, 2.886500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.002711, {0.000326, 0.841291}, {0.014087, 0.000098} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.810920, {0.000255, 0.894421}, {0.011039, 0.000103} ), + FlashData( 1.000000e+05, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998816, {0.000162, 0.968232}, {0.007034, 0.000110} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.002578, {0.000328, 0.841178}, {0.013993, 0.000096} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.810716, {0.000258, 0.893460}, {0.011041, 0.000101} ), + FlashData( 1.013250e+05, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998814, {0.000164, 0.967820}, {0.007034, 0.000108} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.734036, {0.002496, 0.636140}, {0.011357, 0.000013} ), + FlashData( 1.000000e+06, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998304, {0.001539, 0.732405}, {0.007035, 0.000014} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.428647, {0.009656, 0.296047}, {0.008126, 0.000123} ), + FlashData( 1.000000e+07, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.995306, {0.008367, 0.244161}, {0.007020, 0.000110} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.280995, {0.009532, 0.234947}, {0.007638, 0.000967} ), + FlashData( 1.500000e+07, 2.981500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998466, {0.008825, 0.247830}, {0.007023, 0.000877} ), + FlashData( 5.000000e+07, 2.981500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.009799, {0.000227, 0.847306}, {0.014141, 0.000671} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.820760, {0.000174, 0.940659}, {0.010927, 0.000727} ), + FlashData( 1.000000e+05, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999486, {0.000112, 0.983094}, {0.007030, 0.000751} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.009494, {0.000230, 0.847045}, {0.014191, 0.000663} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.820626, {0.000176, 0.940001}, {0.010929, 0.000717} ), + FlashData( 1.013250e+05, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999476, {0.000113, 0.982873}, {0.007030, 0.000741} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.764168, {0.001724, 0.717170}, {0.011245, 0.000089} ), + FlashData( 1.000000e+06, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.998636, {0.001071, 0.849075}, {0.007034, 0.000098} ), + FlashData( 1.000000e+07, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.500247, {0.008751, 0.338258}, {0.009248, 0.000309} ), + FlashData( 1.000000e+07, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.997385, {0.006666, 0.376212}, {0.007027, 0.000273} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.368341, {0.009249, 0.267083}, {0.008574, 0.001342} ), + FlashData( 1.500000e+07, 3.231500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999515, {0.007646, 0.315975}, {0.007026, 0.001103} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.031804, {0.000097, 0.866423}, {0.008470, 0.004481} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.829483, {0.000122, 0.968691}, {0.010825, 0.004849} ), + FlashData( 1.000000e+05, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.031134, {0.000099, 0.865829}, {0.008574, 0.004423} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.829361, {0.000124, 0.968304}, {0.010826, 0.004786} ), + FlashData( 1.013250e+05, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.788230, {0.001216, 0.796793}, {0.011091, 0.000588} ), + FlashData( 1.000000e+06, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999299, {0.000766, 0.906819}, {0.007030, 0.000621} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.565606, {0.007602, 0.388344}, {0.010074, 0.000894} ), + FlashData( 1.000000e+07, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 0.999017, {0.005276, 0.488289}, {0.007028, 0.000777} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.446859, {0.008647, 0.303916}, {0.009437, 0.002442} ), + FlashData( 1.500000e+07, 3.531500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.054177, {0.000055, 0.886321}, {0.005743, 0.013044} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.838983, {0.000101, 0.978218}, {0.010708, 0.013933} ), + FlashData( 1.000000e+05, 3.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.013250e+05, 3.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.053352, {0.000056, 0.885570}, {0.005808, 0.012873} ), + FlashData( 1.013250e+05, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.838780, {0.000102, 0.977938}, {0.010710, 0.013754} ), + FlashData( 1.000000e+06, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.799463, {0.001011, 0.837056}, {0.011004, 0.001676} ), + FlashData( 1.000000e+07, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.599654, {0.006926, 0.420077}, {0.010385, 0.001707} ), + FlashData( 1.500000e+07, 3.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.487747, {0.008205, 0.326722}, {0.009835, 0.003763} ), + FlashData( 1.000000e+05, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.079189, {0.000034, 0.908297}, {0.004184, 0.033343} ), + FlashData( 1.000000e+05, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.858658, {0.000085, 0.984127}, {0.010467, 0.035057} ), + FlashData( 1.013250e+05, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.078302, {0.000035, 0.907492}, {0.004221, 0.032904} ), + FlashData( 1.013250e+05, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.858220, {0.000086, 0.983915}, {0.010473, 0.034607} ), + FlashData( 1.013250e+05, 3.931500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ), + FlashData( 1.000000e+06, 3.931500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+06, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.808878, {0.000868, 0.867643}, {0.010922, 0.004171} ), + FlashData( 1.000000e+07, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.627809, {0.006355, 0.449384}, {0.010568, 0.003096} ), + FlashData( 1.500000e+07, 3.931500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.521757, {0.007786, 0.347485}, {0.010113, 0.005784} ), + FlashData( 1.000000e+06, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.013083, {0.000299, 0.847460}, {0.005181, 0.201586} ), + FlashData( 1.000000e+07, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 5.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.771605, {0.004757, 0.549320}, {0.010256, 0.056684} ), + FlashData( 1.500000e+07, 5.231500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.500000e+07, 5.231500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.692342, {0.006548, 0.399534}, {0.010089, 0.066846} ), + FlashData( 1.000000e+06, 5.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.168528, {0.000106, 0.906625}, {0.001631, 0.505413} ), + FlashData( 1.000000e+07, 5.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+07, 5.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.914262, {0.004869, 0.538035}, {0.009387, 0.134611} ), + FlashData( 1.500000e+07, 5.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.986509, {0.007097, 0.343039}, {0.009026, 0.166823} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 1.000000, {0.009000, 0.169200}, {0.009000, 0.169200} ), + FlashData( 1.000000e+08, 8.731500e+02, {0.007026, 0.006161, 0.827761, 0.091046, 0.045353, 0.015026, 0.004474, 0.001898, 0.001256}, 1, 1.000000, {0.007026, 0.001256}, {0.007026, 0.001256} ) + ) + ); + +/* UNCRUSTIFY-ON */ + +} // testing + +} // geos diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst index c9db4e7d190..dab7f7ffa9f 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst @@ -11,6 +11,7 @@ componentCriticalTemperature real64_array required Component critical temp componentMolarWeight real64_array required Component molar weights componentNames string_array required List of component names componentVolumeShift real64_array {0} Component volume shifts +constantPhaseViscosity real64_array {0} Viscosity for each phase equationsOfState string_array required List of equation of state types for each phase name groupName required A name is required for any non-unique nodes phaseNames groupNameRef_array required List of fluid phases diff --git a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst similarity index 100% rename from src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson.rst rename to src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst diff --git a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst similarity index 100% rename from src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong.rst rename to src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst diff --git a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst similarity index 96% rename from src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst rename to src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst index 28636011f61..c8f51e2b3c9 100644 --- a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst @@ -11,6 +11,7 @@ dPhaseInternalEnergy real64_array4d dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kValues real64_array4d Phase equilibrium ratios phaseCompFraction real64_array4d Phase component fraction phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step phaseDensity real64_array3d Phase density diff --git a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson_other.rst similarity index 96% rename from src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst rename to src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson_other.rst index 28636011f61..c8f51e2b3c9 100644 --- a/src/coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson_other.rst @@ -11,6 +11,7 @@ dPhaseInternalEnergy real64_array4d dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kValues real64_array4d Phase equilibrium ratios phaseCompFraction real64_array4d Phase component fraction phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step phaseDensity real64_array3d Phase density diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst new file mode 100644 index 00000000000..cf67a8118c4 --- /dev/null +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst @@ -0,0 +1,19 @@ + + +============================ ================== ======== ============================================================================================================ +Name Type Default Description +============================ ================== ======== ============================================================================================================ +checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. +componentAcentricFactor real64_array required Component acentric factors +componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients +componentCriticalPressure real64_array required Component critical pressures +componentCriticalTemperature real64_array required Component critical temperatures +componentCriticalVolume real64_array {0} Component critical volumnes +componentMolarWeight real64_array required Component molar weights +componentNames string_array required List of component names +componentVolumeShift real64_array {0} Component volume shifts +name groupName required A name is required for any non-unique nodes +phaseNames groupNameRef_array required List of fluid phases +============================ ================== ======== ============================================================================================================ + + diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst new file mode 100644 index 00000000000..cf67a8118c4 --- /dev/null +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst @@ -0,0 +1,19 @@ + + +============================ ================== ======== ============================================================================================================ +Name Type Default Description +============================ ================== ======== ============================================================================================================ +checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. +componentAcentricFactor real64_array required Component acentric factors +componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients +componentCriticalPressure real64_array required Component critical pressures +componentCriticalTemperature real64_array required Component critical temperatures +componentCriticalVolume real64_array {0} Component critical volumnes +componentMolarWeight real64_array required Component molar weights +componentNames string_array required List of component names +componentVolumeShift real64_array {0} Component volume shifts +name groupName required A name is required for any non-unique nodes +phaseNames groupNameRef_array required List of fluid phases +============================ ================== ======== ============================================================================================================ + + diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst new file mode 100644 index 00000000000..c8f51e2b3c9 --- /dev/null +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst @@ -0,0 +1,31 @@ + + +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kValues real64_array4d Phase equilibrium ratios +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ + + diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst new file mode 100644 index 00000000000..c8f51e2b3c9 --- /dev/null +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst @@ -0,0 +1,31 @@ + + +===================== ========================================================================================= ============================================================================================================ +Name Type Description +===================== ========================================================================================= ============================================================================================================ +dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions +dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions +dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions +dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions +dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions +dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions +dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions +dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions +kValues real64_array4d Phase equilibrium ratios +phaseCompFraction real64_array4d Phase component fraction +phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step +phaseDensity real64_array3d Phase density +phaseDensity_n real64_array3d Phase density at the previous converged time step +phaseEnthalpy real64_array3d Phase enthalpy +phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step +phaseFraction real64_array3d Phase fraction +phaseInternalEnergy real64_array3d Phase internal energy +phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step +phaseMassDensity real64_array3d Phase mass density +phaseViscosity real64_array3d Phase viscosity +totalDensity real64_array2d Total density +totalDensity_n real64_array2d Total density at the previous converged time step +useMass integer (no description available) +===================== ========================================================================================= ============================================================================================================ + + diff --git a/src/coreComponents/schema/docs/Constitutive.rst b/src/coreComponents/schema/docs/Constitutive.rst index f0a48fcf31f..c68ec412fa7 100644 --- a/src/coreComponents/schema/docs/Constitutive.rst +++ b/src/coreComponents/schema/docs/Constitutive.rst @@ -1,90 +1,92 @@ -============================================= ==== ======= ======================================================== -Name Type Default Description -============================================= ==== ======= ======================================================== -BiotPorosity node :ref:`XML_BiotPorosity` -BlackOilFluid node :ref:`XML_BlackOilFluid` -BrooksCoreyBakerRelativePermeability node :ref:`XML_BrooksCoreyBakerRelativePermeability` -BrooksCoreyCapillaryPressure node :ref:`XML_BrooksCoreyCapillaryPressure` -BrooksCoreyRelativePermeability node :ref:`XML_BrooksCoreyRelativePermeability` -BrooksCoreyStone2RelativePermeability node :ref:`XML_BrooksCoreyStone2RelativePermeability` -CO2BrineEzrokhiFluid node :ref:`XML_CO2BrineEzrokhiFluid` -CO2BrineEzrokhiThermalFluid node :ref:`XML_CO2BrineEzrokhiThermalFluid` -CO2BrinePhillipsFluid node :ref:`XML_CO2BrinePhillipsFluid` -CO2BrinePhillipsThermalFluid node :ref:`XML_CO2BrinePhillipsThermalFluid` -CarmanKozenyPermeability node :ref:`XML_CarmanKozenyPermeability` -CeramicDamage node :ref:`XML_CeramicDamage` -CompositionalMultiphaseFluid node :ref:`XML_CompositionalMultiphaseFluid` -CompositonalTwoPhaseFluidPengRobinson node :ref:`XML_CompositonalTwoPhaseFluidPengRobinson` -CompositonalTwoPhaseFluidSoaveRedlichKwong node :ref:`XML_CompositonalTwoPhaseFluidSoaveRedlichKwong` -CompressibleSinglePhaseFluid node :ref:`XML_CompressibleSinglePhaseFluid` -CompressibleSolidCarmanKozenyPermeability node :ref:`XML_CompressibleSolidCarmanKozenyPermeability` -CompressibleSolidConstantPermeability node :ref:`XML_CompressibleSolidConstantPermeability` -CompressibleSolidExponentialDecayPermeability node :ref:`XML_CompressibleSolidExponentialDecayPermeability` -CompressibleSolidParallelPlatesPermeability node :ref:`XML_CompressibleSolidParallelPlatesPermeability` -CompressibleSolidSlipDependentPermeability node :ref:`XML_CompressibleSolidSlipDependentPermeability` -CompressibleSolidWillisRichardsPermeability node :ref:`XML_CompressibleSolidWillisRichardsPermeability` -ConstantDiffusion node :ref:`XML_ConstantDiffusion` -ConstantPermeability node :ref:`XML_ConstantPermeability` -Coulomb node :ref:`XML_Coulomb` -DamageElasticIsotropic node :ref:`XML_DamageElasticIsotropic` -DamageSpectralElasticIsotropic node :ref:`XML_DamageSpectralElasticIsotropic` -DamageVolDevElasticIsotropic node :ref:`XML_DamageVolDevElasticIsotropic` -DeadOilFluid node :ref:`XML_DeadOilFluid` -DelftEgg node :ref:`XML_DelftEgg` -DruckerPrager node :ref:`XML_DruckerPrager` -ElasticIsotropic node :ref:`XML_ElasticIsotropic` -ElasticIsotropicPressureDependent node :ref:`XML_ElasticIsotropicPressureDependent` -ElasticOrthotropic node :ref:`XML_ElasticOrthotropic` -ElasticTransverseIsotropic node :ref:`XML_ElasticTransverseIsotropic` -ExponentialDecayPermeability node :ref:`XML_ExponentialDecayPermeability` -ExtendedDruckerPrager node :ref:`XML_ExtendedDruckerPrager` -FrictionlessContact node :ref:`XML_FrictionlessContact` -JFunctionCapillaryPressure node :ref:`XML_JFunctionCapillaryPressure` -LinearIsotropicDispersion node :ref:`XML_LinearIsotropicDispersion` -ModifiedCamClay node :ref:`XML_ModifiedCamClay` -MultiPhaseConstantThermalConductivity node :ref:`XML_MultiPhaseConstantThermalConductivity` -MultiPhaseVolumeWeightedThermalConductivity node :ref:`XML_MultiPhaseVolumeWeightedThermalConductivity` -NullModel node :ref:`XML_NullModel` -ParallelPlatesPermeability node :ref:`XML_ParallelPlatesPermeability` -ParticleFluid node :ref:`XML_ParticleFluid` -PerfectlyPlastic node :ref:`XML_PerfectlyPlastic` -PermeabilityBase node :ref:`XML_PermeabilityBase` -PorousDamageElasticIsotropic node :ref:`XML_PorousDamageElasticIsotropic` -PorousDamageSpectralElasticIsotropic node :ref:`XML_PorousDamageSpectralElasticIsotropic` -PorousDamageVolDevElasticIsotropic node :ref:`XML_PorousDamageVolDevElasticIsotropic` -PorousDelftEgg node :ref:`XML_PorousDelftEgg` -PorousDruckerPrager node :ref:`XML_PorousDruckerPrager` -PorousElasticIsotropic node :ref:`XML_PorousElasticIsotropic` -PorousElasticOrthotropic node :ref:`XML_PorousElasticOrthotropic` -PorousElasticTransverseIsotropic node :ref:`XML_PorousElasticTransverseIsotropic` -PorousExtendedDruckerPrager node :ref:`XML_PorousExtendedDruckerPrager` -PorousModifiedCamClay node :ref:`XML_PorousModifiedCamClay` -PorousViscoDruckerPrager node :ref:`XML_PorousViscoDruckerPrager` -PorousViscoExtendedDruckerPrager node :ref:`XML_PorousViscoExtendedDruckerPrager` -PorousViscoModifiedCamClay node :ref:`XML_PorousViscoModifiedCamClay` -PressurePorosity node :ref:`XML_PressurePorosity` -ProppantPermeability node :ref:`XML_ProppantPermeability` -ProppantPorosity node :ref:`XML_ProppantPorosity` -ProppantSlurryFluid node :ref:`XML_ProppantSlurryFluid` -ProppantSolidProppantPermeability node :ref:`XML_ProppantSolidProppantPermeability` -ReactiveBrine node :ref:`XML_ReactiveBrine` -ReactiveBrineThermal node :ref:`XML_ReactiveBrineThermal` -SinglePhaseConstantThermalConductivity node :ref:`XML_SinglePhaseConstantThermalConductivity` -SlipDependentPermeability node :ref:`XML_SlipDependentPermeability` -SolidInternalEnergy node :ref:`XML_SolidInternalEnergy` -TableCapillaryPressure node :ref:`XML_TableCapillaryPressure` -TableRelativePermeability node :ref:`XML_TableRelativePermeability` -TableRelativePermeabilityHysteresis node :ref:`XML_TableRelativePermeabilityHysteresis` -ThermalCompressibleSinglePhaseFluid node :ref:`XML_ThermalCompressibleSinglePhaseFluid` -VanGenuchtenBakerRelativePermeability node :ref:`XML_VanGenuchtenBakerRelativePermeability` -VanGenuchtenCapillaryPressure node :ref:`XML_VanGenuchtenCapillaryPressure` -VanGenuchtenStone2RelativePermeability node :ref:`XML_VanGenuchtenStone2RelativePermeability` -ViscoDruckerPrager node :ref:`XML_ViscoDruckerPrager` -ViscoExtendedDruckerPrager node :ref:`XML_ViscoExtendedDruckerPrager` -ViscoModifiedCamClay node :ref:`XML_ViscoModifiedCamClay` -WillisRichardsPermeability node :ref:`XML_WillisRichardsPermeability` -============================================= ==== ======= ======================================================== +============================================== ==== ======= ========================================================= +Name Type Default Description +============================================== ==== ======= ========================================================= +BiotPorosity node :ref:`XML_BiotPorosity` +BlackOilFluid node :ref:`XML_BlackOilFluid` +BrooksCoreyBakerRelativePermeability node :ref:`XML_BrooksCoreyBakerRelativePermeability` +BrooksCoreyCapillaryPressure node :ref:`XML_BrooksCoreyCapillaryPressure` +BrooksCoreyRelativePermeability node :ref:`XML_BrooksCoreyRelativePermeability` +BrooksCoreyStone2RelativePermeability node :ref:`XML_BrooksCoreyStone2RelativePermeability` +CO2BrineEzrokhiFluid node :ref:`XML_CO2BrineEzrokhiFluid` +CO2BrineEzrokhiThermalFluid node :ref:`XML_CO2BrineEzrokhiThermalFluid` +CO2BrinePhillipsFluid node :ref:`XML_CO2BrinePhillipsFluid` +CO2BrinePhillipsThermalFluid node :ref:`XML_CO2BrinePhillipsThermalFluid` +CarmanKozenyPermeability node :ref:`XML_CarmanKozenyPermeability` +CeramicDamage node :ref:`XML_CeramicDamage` +CompositionalMultiphaseFluid node :ref:`XML_CompositionalMultiphaseFluid` +CompositionalTwoPhaseFluidPengRobinson node :ref:`XML_CompositionalTwoPhaseFluidPengRobinson` +CompositionalTwoPhaseFluidPengRobinsonLBC node :ref:`XML_CompositionalTwoPhaseFluidPengRobinsonLBC` +CompositionalTwoPhaseFluidSoaveRedlichKwong node :ref:`XML_CompositionalTwoPhaseFluidSoaveRedlichKwong` +CompositionalTwoPhaseFluidSoaveRedlichKwongLBC node :ref:`XML_CompositionalTwoPhaseFluidSoaveRedlichKwongLBC` +CompressibleSinglePhaseFluid node :ref:`XML_CompressibleSinglePhaseFluid` +CompressibleSolidCarmanKozenyPermeability node :ref:`XML_CompressibleSolidCarmanKozenyPermeability` +CompressibleSolidConstantPermeability node :ref:`XML_CompressibleSolidConstantPermeability` +CompressibleSolidExponentialDecayPermeability node :ref:`XML_CompressibleSolidExponentialDecayPermeability` +CompressibleSolidParallelPlatesPermeability node :ref:`XML_CompressibleSolidParallelPlatesPermeability` +CompressibleSolidSlipDependentPermeability node :ref:`XML_CompressibleSolidSlipDependentPermeability` +CompressibleSolidWillisRichardsPermeability node :ref:`XML_CompressibleSolidWillisRichardsPermeability` +ConstantDiffusion node :ref:`XML_ConstantDiffusion` +ConstantPermeability node :ref:`XML_ConstantPermeability` +Coulomb node :ref:`XML_Coulomb` +DamageElasticIsotropic node :ref:`XML_DamageElasticIsotropic` +DamageSpectralElasticIsotropic node :ref:`XML_DamageSpectralElasticIsotropic` +DamageVolDevElasticIsotropic node :ref:`XML_DamageVolDevElasticIsotropic` +DeadOilFluid node :ref:`XML_DeadOilFluid` +DelftEgg node :ref:`XML_DelftEgg` +DruckerPrager node :ref:`XML_DruckerPrager` +ElasticIsotropic node :ref:`XML_ElasticIsotropic` +ElasticIsotropicPressureDependent node :ref:`XML_ElasticIsotropicPressureDependent` +ElasticOrthotropic node :ref:`XML_ElasticOrthotropic` +ElasticTransverseIsotropic node :ref:`XML_ElasticTransverseIsotropic` +ExponentialDecayPermeability node :ref:`XML_ExponentialDecayPermeability` +ExtendedDruckerPrager node :ref:`XML_ExtendedDruckerPrager` +FrictionlessContact node :ref:`XML_FrictionlessContact` +JFunctionCapillaryPressure node :ref:`XML_JFunctionCapillaryPressure` +LinearIsotropicDispersion node :ref:`XML_LinearIsotropicDispersion` +ModifiedCamClay node :ref:`XML_ModifiedCamClay` +MultiPhaseConstantThermalConductivity node :ref:`XML_MultiPhaseConstantThermalConductivity` +MultiPhaseVolumeWeightedThermalConductivity node :ref:`XML_MultiPhaseVolumeWeightedThermalConductivity` +NullModel node :ref:`XML_NullModel` +ParallelPlatesPermeability node :ref:`XML_ParallelPlatesPermeability` +ParticleFluid node :ref:`XML_ParticleFluid` +PerfectlyPlastic node :ref:`XML_PerfectlyPlastic` +PermeabilityBase node :ref:`XML_PermeabilityBase` +PorousDamageElasticIsotropic node :ref:`XML_PorousDamageElasticIsotropic` +PorousDamageSpectralElasticIsotropic node :ref:`XML_PorousDamageSpectralElasticIsotropic` +PorousDamageVolDevElasticIsotropic node :ref:`XML_PorousDamageVolDevElasticIsotropic` +PorousDelftEgg node :ref:`XML_PorousDelftEgg` +PorousDruckerPrager node :ref:`XML_PorousDruckerPrager` +PorousElasticIsotropic node :ref:`XML_PorousElasticIsotropic` +PorousElasticOrthotropic node :ref:`XML_PorousElasticOrthotropic` +PorousElasticTransverseIsotropic node :ref:`XML_PorousElasticTransverseIsotropic` +PorousExtendedDruckerPrager node :ref:`XML_PorousExtendedDruckerPrager` +PorousModifiedCamClay node :ref:`XML_PorousModifiedCamClay` +PorousViscoDruckerPrager node :ref:`XML_PorousViscoDruckerPrager` +PorousViscoExtendedDruckerPrager node :ref:`XML_PorousViscoExtendedDruckerPrager` +PorousViscoModifiedCamClay node :ref:`XML_PorousViscoModifiedCamClay` +PressurePorosity node :ref:`XML_PressurePorosity` +ProppantPermeability node :ref:`XML_ProppantPermeability` +ProppantPorosity node :ref:`XML_ProppantPorosity` +ProppantSlurryFluid node :ref:`XML_ProppantSlurryFluid` +ProppantSolidProppantPermeability node :ref:`XML_ProppantSolidProppantPermeability` +ReactiveBrine node :ref:`XML_ReactiveBrine` +ReactiveBrineThermal node :ref:`XML_ReactiveBrineThermal` +SinglePhaseConstantThermalConductivity node :ref:`XML_SinglePhaseConstantThermalConductivity` +SlipDependentPermeability node :ref:`XML_SlipDependentPermeability` +SolidInternalEnergy node :ref:`XML_SolidInternalEnergy` +TableCapillaryPressure node :ref:`XML_TableCapillaryPressure` +TableRelativePermeability node :ref:`XML_TableRelativePermeability` +TableRelativePermeabilityHysteresis node :ref:`XML_TableRelativePermeabilityHysteresis` +ThermalCompressibleSinglePhaseFluid node :ref:`XML_ThermalCompressibleSinglePhaseFluid` +VanGenuchtenBakerRelativePermeability node :ref:`XML_VanGenuchtenBakerRelativePermeability` +VanGenuchtenCapillaryPressure node :ref:`XML_VanGenuchtenCapillaryPressure` +VanGenuchtenStone2RelativePermeability node :ref:`XML_VanGenuchtenStone2RelativePermeability` +ViscoDruckerPrager node :ref:`XML_ViscoDruckerPrager` +ViscoExtendedDruckerPrager node :ref:`XML_ViscoExtendedDruckerPrager` +ViscoModifiedCamClay node :ref:`XML_ViscoModifiedCamClay` +WillisRichardsPermeability node :ref:`XML_WillisRichardsPermeability` +============================================== ==== ======= ========================================================= diff --git a/src/coreComponents/schema/docs/Constitutive_other.rst b/src/coreComponents/schema/docs/Constitutive_other.rst index 9ce0f20a901..ad9b49f53c9 100644 --- a/src/coreComponents/schema/docs/Constitutive_other.rst +++ b/src/coreComponents/schema/docs/Constitutive_other.rst @@ -1,90 +1,92 @@ -============================================= ==== ================================================================== -Name Type Description -============================================= ==== ================================================================== -BiotPorosity node :ref:`DATASTRUCTURE_BiotPorosity` -BlackOilFluid node :ref:`DATASTRUCTURE_BlackOilFluid` -BrooksCoreyBakerRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyBakerRelativePermeability` -BrooksCoreyCapillaryPressure node :ref:`DATASTRUCTURE_BrooksCoreyCapillaryPressure` -BrooksCoreyRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyRelativePermeability` -BrooksCoreyStone2RelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyStone2RelativePermeability` -CO2BrineEzrokhiFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiFluid` -CO2BrineEzrokhiThermalFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiThermalFluid` -CO2BrinePhillipsFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsFluid` -CO2BrinePhillipsThermalFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsThermalFluid` -CarmanKozenyPermeability node :ref:`DATASTRUCTURE_CarmanKozenyPermeability` -CeramicDamage node :ref:`DATASTRUCTURE_CeramicDamage` -CompositionalMultiphaseFluid node :ref:`DATASTRUCTURE_CompositionalMultiphaseFluid` -CompositonalTwoPhaseFluidPengRobinson node :ref:`DATASTRUCTURE_CompositonalTwoPhaseFluidPengRobinson` -CompositonalTwoPhaseFluidSoaveRedlichKwong node :ref:`DATASTRUCTURE_CompositonalTwoPhaseFluidSoaveRedlichKwong` -CompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_CompressibleSinglePhaseFluid` -CompressibleSolidCarmanKozenyPermeability node :ref:`DATASTRUCTURE_CompressibleSolidCarmanKozenyPermeability` -CompressibleSolidConstantPermeability node :ref:`DATASTRUCTURE_CompressibleSolidConstantPermeability` -CompressibleSolidExponentialDecayPermeability node :ref:`DATASTRUCTURE_CompressibleSolidExponentialDecayPermeability` -CompressibleSolidParallelPlatesPermeability node :ref:`DATASTRUCTURE_CompressibleSolidParallelPlatesPermeability` -CompressibleSolidSlipDependentPermeability node :ref:`DATASTRUCTURE_CompressibleSolidSlipDependentPermeability` -CompressibleSolidWillisRichardsPermeability node :ref:`DATASTRUCTURE_CompressibleSolidWillisRichardsPermeability` -ConstantDiffusion node :ref:`DATASTRUCTURE_ConstantDiffusion` -ConstantPermeability node :ref:`DATASTRUCTURE_ConstantPermeability` -Coulomb node :ref:`DATASTRUCTURE_Coulomb` -DamageElasticIsotropic node :ref:`DATASTRUCTURE_DamageElasticIsotropic` -DamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_DamageSpectralElasticIsotropic` -DamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_DamageVolDevElasticIsotropic` -DeadOilFluid node :ref:`DATASTRUCTURE_DeadOilFluid` -DelftEgg node :ref:`DATASTRUCTURE_DelftEgg` -DruckerPrager node :ref:`DATASTRUCTURE_DruckerPrager` -ElasticIsotropic node :ref:`DATASTRUCTURE_ElasticIsotropic` -ElasticIsotropicPressureDependent node :ref:`DATASTRUCTURE_ElasticIsotropicPressureDependent` -ElasticOrthotropic node :ref:`DATASTRUCTURE_ElasticOrthotropic` -ElasticTransverseIsotropic node :ref:`DATASTRUCTURE_ElasticTransverseIsotropic` -ExponentialDecayPermeability node :ref:`DATASTRUCTURE_ExponentialDecayPermeability` -ExtendedDruckerPrager node :ref:`DATASTRUCTURE_ExtendedDruckerPrager` -FrictionlessContact node :ref:`DATASTRUCTURE_FrictionlessContact` -JFunctionCapillaryPressure node :ref:`DATASTRUCTURE_JFunctionCapillaryPressure` -LinearIsotropicDispersion node :ref:`DATASTRUCTURE_LinearIsotropicDispersion` -ModifiedCamClay node :ref:`DATASTRUCTURE_ModifiedCamClay` -MultiPhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseConstantThermalConductivity` -MultiPhaseVolumeWeightedThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseVolumeWeightedThermalConductivity` -NullModel node :ref:`DATASTRUCTURE_NullModel` -ParallelPlatesPermeability node :ref:`DATASTRUCTURE_ParallelPlatesPermeability` -ParticleFluid node :ref:`DATASTRUCTURE_ParticleFluid` -PerfectlyPlastic node :ref:`DATASTRUCTURE_PerfectlyPlastic` -PermeabilityBase node :ref:`DATASTRUCTURE_PermeabilityBase` -PorousDamageElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageElasticIsotropic` -PorousDamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageSpectralElasticIsotropic` -PorousDamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageVolDevElasticIsotropic` -PorousDelftEgg node :ref:`DATASTRUCTURE_PorousDelftEgg` -PorousDruckerPrager node :ref:`DATASTRUCTURE_PorousDruckerPrager` -PorousElasticIsotropic node :ref:`DATASTRUCTURE_PorousElasticIsotropic` -PorousElasticOrthotropic node :ref:`DATASTRUCTURE_PorousElasticOrthotropic` -PorousElasticTransverseIsotropic node :ref:`DATASTRUCTURE_PorousElasticTransverseIsotropic` -PorousExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousExtendedDruckerPrager` -PorousModifiedCamClay node :ref:`DATASTRUCTURE_PorousModifiedCamClay` -PorousViscoDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoDruckerPrager` -PorousViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoExtendedDruckerPrager` -PorousViscoModifiedCamClay node :ref:`DATASTRUCTURE_PorousViscoModifiedCamClay` -PressurePorosity node :ref:`DATASTRUCTURE_PressurePorosity` -ProppantPermeability node :ref:`DATASTRUCTURE_ProppantPermeability` -ProppantPorosity node :ref:`DATASTRUCTURE_ProppantPorosity` -ProppantSlurryFluid node :ref:`DATASTRUCTURE_ProppantSlurryFluid` -ProppantSolidProppantPermeability node :ref:`DATASTRUCTURE_ProppantSolidProppantPermeability` -ReactiveBrine node :ref:`DATASTRUCTURE_ReactiveBrine` -ReactiveBrineThermal node :ref:`DATASTRUCTURE_ReactiveBrineThermal` -SinglePhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_SinglePhaseConstantThermalConductivity` -SlipDependentPermeability node :ref:`DATASTRUCTURE_SlipDependentPermeability` -SolidInternalEnergy node :ref:`DATASTRUCTURE_SolidInternalEnergy` -TableCapillaryPressure node :ref:`DATASTRUCTURE_TableCapillaryPressure` -TableRelativePermeability node :ref:`DATASTRUCTURE_TableRelativePermeability` -TableRelativePermeabilityHysteresis node :ref:`DATASTRUCTURE_TableRelativePermeabilityHysteresis` -ThermalCompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_ThermalCompressibleSinglePhaseFluid` -VanGenuchtenBakerRelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenBakerRelativePermeability` -VanGenuchtenCapillaryPressure node :ref:`DATASTRUCTURE_VanGenuchtenCapillaryPressure` -VanGenuchtenStone2RelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenStone2RelativePermeability` -ViscoDruckerPrager node :ref:`DATASTRUCTURE_ViscoDruckerPrager` -ViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_ViscoExtendedDruckerPrager` -ViscoModifiedCamClay node :ref:`DATASTRUCTURE_ViscoModifiedCamClay` -WillisRichardsPermeability node :ref:`DATASTRUCTURE_WillisRichardsPermeability` -============================================= ==== ================================================================== +============================================== ==== =================================================================== +Name Type Description +============================================== ==== =================================================================== +BiotPorosity node :ref:`DATASTRUCTURE_BiotPorosity` +BlackOilFluid node :ref:`DATASTRUCTURE_BlackOilFluid` +BrooksCoreyBakerRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyBakerRelativePermeability` +BrooksCoreyCapillaryPressure node :ref:`DATASTRUCTURE_BrooksCoreyCapillaryPressure` +BrooksCoreyRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyRelativePermeability` +BrooksCoreyStone2RelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyStone2RelativePermeability` +CO2BrineEzrokhiFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiFluid` +CO2BrineEzrokhiThermalFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiThermalFluid` +CO2BrinePhillipsFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsFluid` +CO2BrinePhillipsThermalFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsThermalFluid` +CarmanKozenyPermeability node :ref:`DATASTRUCTURE_CarmanKozenyPermeability` +CeramicDamage node :ref:`DATASTRUCTURE_CeramicDamage` +CompositionalMultiphaseFluid node :ref:`DATASTRUCTURE_CompositionalMultiphaseFluid` +CompositionalTwoPhaseFluidPengRobinson node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidPengRobinson` +CompositionalTwoPhaseFluidPengRobinsonLBC node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidPengRobinsonLBC` +CompositionalTwoPhaseFluidSoaveRedlichKwong node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidSoaveRedlichKwong` +CompositionalTwoPhaseFluidSoaveRedlichKwongLBC node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidSoaveRedlichKwongLBC` +CompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_CompressibleSinglePhaseFluid` +CompressibleSolidCarmanKozenyPermeability node :ref:`DATASTRUCTURE_CompressibleSolidCarmanKozenyPermeability` +CompressibleSolidConstantPermeability node :ref:`DATASTRUCTURE_CompressibleSolidConstantPermeability` +CompressibleSolidExponentialDecayPermeability node :ref:`DATASTRUCTURE_CompressibleSolidExponentialDecayPermeability` +CompressibleSolidParallelPlatesPermeability node :ref:`DATASTRUCTURE_CompressibleSolidParallelPlatesPermeability` +CompressibleSolidSlipDependentPermeability node :ref:`DATASTRUCTURE_CompressibleSolidSlipDependentPermeability` +CompressibleSolidWillisRichardsPermeability node :ref:`DATASTRUCTURE_CompressibleSolidWillisRichardsPermeability` +ConstantDiffusion node :ref:`DATASTRUCTURE_ConstantDiffusion` +ConstantPermeability node :ref:`DATASTRUCTURE_ConstantPermeability` +Coulomb node :ref:`DATASTRUCTURE_Coulomb` +DamageElasticIsotropic node :ref:`DATASTRUCTURE_DamageElasticIsotropic` +DamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_DamageSpectralElasticIsotropic` +DamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_DamageVolDevElasticIsotropic` +DeadOilFluid node :ref:`DATASTRUCTURE_DeadOilFluid` +DelftEgg node :ref:`DATASTRUCTURE_DelftEgg` +DruckerPrager node :ref:`DATASTRUCTURE_DruckerPrager` +ElasticIsotropic node :ref:`DATASTRUCTURE_ElasticIsotropic` +ElasticIsotropicPressureDependent node :ref:`DATASTRUCTURE_ElasticIsotropicPressureDependent` +ElasticOrthotropic node :ref:`DATASTRUCTURE_ElasticOrthotropic` +ElasticTransverseIsotropic node :ref:`DATASTRUCTURE_ElasticTransverseIsotropic` +ExponentialDecayPermeability node :ref:`DATASTRUCTURE_ExponentialDecayPermeability` +ExtendedDruckerPrager node :ref:`DATASTRUCTURE_ExtendedDruckerPrager` +FrictionlessContact node :ref:`DATASTRUCTURE_FrictionlessContact` +JFunctionCapillaryPressure node :ref:`DATASTRUCTURE_JFunctionCapillaryPressure` +LinearIsotropicDispersion node :ref:`DATASTRUCTURE_LinearIsotropicDispersion` +ModifiedCamClay node :ref:`DATASTRUCTURE_ModifiedCamClay` +MultiPhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseConstantThermalConductivity` +MultiPhaseVolumeWeightedThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseVolumeWeightedThermalConductivity` +NullModel node :ref:`DATASTRUCTURE_NullModel` +ParallelPlatesPermeability node :ref:`DATASTRUCTURE_ParallelPlatesPermeability` +ParticleFluid node :ref:`DATASTRUCTURE_ParticleFluid` +PerfectlyPlastic node :ref:`DATASTRUCTURE_PerfectlyPlastic` +PermeabilityBase node :ref:`DATASTRUCTURE_PermeabilityBase` +PorousDamageElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageElasticIsotropic` +PorousDamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageSpectralElasticIsotropic` +PorousDamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageVolDevElasticIsotropic` +PorousDelftEgg node :ref:`DATASTRUCTURE_PorousDelftEgg` +PorousDruckerPrager node :ref:`DATASTRUCTURE_PorousDruckerPrager` +PorousElasticIsotropic node :ref:`DATASTRUCTURE_PorousElasticIsotropic` +PorousElasticOrthotropic node :ref:`DATASTRUCTURE_PorousElasticOrthotropic` +PorousElasticTransverseIsotropic node :ref:`DATASTRUCTURE_PorousElasticTransverseIsotropic` +PorousExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousExtendedDruckerPrager` +PorousModifiedCamClay node :ref:`DATASTRUCTURE_PorousModifiedCamClay` +PorousViscoDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoDruckerPrager` +PorousViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoExtendedDruckerPrager` +PorousViscoModifiedCamClay node :ref:`DATASTRUCTURE_PorousViscoModifiedCamClay` +PressurePorosity node :ref:`DATASTRUCTURE_PressurePorosity` +ProppantPermeability node :ref:`DATASTRUCTURE_ProppantPermeability` +ProppantPorosity node :ref:`DATASTRUCTURE_ProppantPorosity` +ProppantSlurryFluid node :ref:`DATASTRUCTURE_ProppantSlurryFluid` +ProppantSolidProppantPermeability node :ref:`DATASTRUCTURE_ProppantSolidProppantPermeability` +ReactiveBrine node :ref:`DATASTRUCTURE_ReactiveBrine` +ReactiveBrineThermal node :ref:`DATASTRUCTURE_ReactiveBrineThermal` +SinglePhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_SinglePhaseConstantThermalConductivity` +SlipDependentPermeability node :ref:`DATASTRUCTURE_SlipDependentPermeability` +SolidInternalEnergy node :ref:`DATASTRUCTURE_SolidInternalEnergy` +TableCapillaryPressure node :ref:`DATASTRUCTURE_TableCapillaryPressure` +TableRelativePermeability node :ref:`DATASTRUCTURE_TableRelativePermeability` +TableRelativePermeabilityHysteresis node :ref:`DATASTRUCTURE_TableRelativePermeabilityHysteresis` +ThermalCompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_ThermalCompressibleSinglePhaseFluid` +VanGenuchtenBakerRelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenBakerRelativePermeability` +VanGenuchtenCapillaryPressure node :ref:`DATASTRUCTURE_VanGenuchtenCapillaryPressure` +VanGenuchtenStone2RelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenStone2RelativePermeability` +ViscoDruckerPrager node :ref:`DATASTRUCTURE_ViscoDruckerPrager` +ViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_ViscoExtendedDruckerPrager` +ViscoModifiedCamClay node :ref:`DATASTRUCTURE_ViscoModifiedCamClay` +WillisRichardsPermeability node :ref:`DATASTRUCTURE_WillisRichardsPermeability` +============================================== ==== =================================================================== diff --git a/src/coreComponents/schema/docs/PVTDriver.rst b/src/coreComponents/schema/docs/PVTDriver.rst index 6faf196ec68..9196c73c11a 100644 --- a/src/coreComponents/schema/docs/PVTDriver.rst +++ b/src/coreComponents/schema/docs/PVTDriver.rst @@ -1,19 +1,20 @@ -====================== ============ ======== ================================================================ -Name Type Default Description -====================== ============ ======== ================================================================ -baseline path none Baseline file -feedComposition real64_array required Feed composition array [mol fraction] -fluid groupNameRef required Fluid to test -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -output string none Output file -outputCompressibility integer 0 Flag to indicate that the total compressibility should be output -outputPhaseComposition integer 0 Flag to indicate that phase compositions should be output -pressureControl groupNameRef required Function controlling pressure time history -steps integer required Number of load steps to take -temperatureControl groupNameRef required Function controlling temperature time history -====================== ============ ======== ================================================================ +====================== ============ ======== ===================================================================== +Name Type Default Description +====================== ============ ======== ===================================================================== +baseline path none Baseline file +feedComposition real64_array required Feed composition array [mol fraction] +fluid groupNameRef required Fluid to test +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +output string none Output file +outputCompressibility integer 0 Flag to indicate that the total compressibility should be output +outputMassDensity integer 0 Flag to indicate that the mass density of each phase should be output +outputPhaseComposition integer 0 Flag to indicate that phase compositions should be output +pressureControl groupNameRef required Function controlling pressure time history +steps integer required Number of load steps to take +temperatureControl groupNameRef required Function controlling temperature time history +====================== ============ ======== ===================================================================== diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index c4a1fa77a16..904c4e58302 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -565,12 +565,20 @@ - - + + - - + + + + + + + + + + @@ -3612,6 +3620,8 @@ Local - Add stabilization only to interiors of macro elements.--> + + @@ -3765,8 +3775,10 @@ Local - Add stabilization only to interiors of macro elements.--> - - + + + + @@ -4077,6 +4089,8 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + @@ -4084,7 +4098,55 @@ The expected format is "{ waterMax, oilMax }", in that order--> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -4108,7 +4170,7 @@ The expected format is "{ waterMax, oilMax }", in that order--> - + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 1e0a54c1348..a2fe29ca010 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1358,8 +1358,10 @@ - - + + + + @@ -1831,7 +1833,7 @@ - + @@ -1848,6 +1850,8 @@ + + @@ -1877,7 +1881,7 @@ - + @@ -1894,6 +1898,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml new file mode 100644 index 00000000000..8a2bab3b501 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPR.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPR.txt new file mode 100644 index 00000000000..d0479350bf9 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPR.txt @@ -0,0 +1,112 @@ +# column 1 = time +# column 2 = pressure +# column 3 = temperature +# column 4 = density +# column 5 = total compressibility +# columns 6-7 = phase fractions +# columns 8-9 = phase densities +# columns 10-11 = phase mass densities +# columns 12-13 = phase viscosities +# columns 14-22 = oil phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +# columns 23-31 = gas phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +0.0000e+00 3.5000e+07 5.5315e+02 6.8078e+03 1.3932e-08 1.0000e+00 0.0000e+00 6.8078e+03 6.8078e+03 3.4772e+02 3.4772e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-02 3.4000e+07 5.5315e+02 6.7113e+03 1.4639e-08 1.0000e+00 0.0000e+00 6.7113e+03 6.7113e+03 3.4279e+02 3.4279e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-02 3.3000e+07 5.5315e+02 6.6112e+03 1.5406e-08 1.0000e+00 0.0000e+00 6.6112e+03 6.6112e+03 3.3768e+02 3.3768e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-02 3.2000e+07 5.5315e+02 6.5075e+03 1.6240e-08 1.0000e+00 0.0000e+00 6.5075e+03 6.5075e+03 3.3238e+02 3.3238e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.0000e-02 3.1000e+07 5.5315e+02 6.3998e+03 1.7151e-08 0.0000e+00 1.0000e+00 6.3998e+03 6.3998e+03 3.2688e+02 3.2688e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e-01 3.0000e+07 5.5315e+02 6.2879e+03 1.8147e-08 0.0000e+00 1.0000e+00 6.2879e+03 6.2879e+03 3.2117e+02 3.2117e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e-01 2.9000e+07 5.5315e+02 6.1715e+03 1.9240e-08 0.0000e+00 1.0000e+00 6.1715e+03 6.1715e+03 3.1522e+02 3.1522e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4000e-01 2.8000e+07 5.5315e+02 6.0503e+03 2.0443e-08 0.0000e+00 1.0000e+00 6.0503e+03 6.0503e+03 3.0903e+02 3.0903e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e-01 2.7000e+07 5.5315e+02 5.9240e+03 2.1772e-08 0.0000e+00 1.0000e+00 5.9240e+03 5.9240e+03 3.0258e+02 3.0258e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e-01 2.6000e+07 5.5315e+02 5.7922e+03 2.3244e-08 0.0000e+00 1.0000e+00 5.7922e+03 5.7922e+03 2.9585e+02 2.9585e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e-01 2.5000e+07 5.5315e+02 5.6546e+03 2.4879e-08 0.0000e+00 1.0000e+00 5.6546e+03 5.6546e+03 2.8882e+02 2.8882e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2000e-01 2.4000e+07 5.5315e+02 5.5107e+03 2.6704e-08 0.0000e+00 1.0000e+00 5.5107e+03 5.5107e+03 2.8147e+02 2.8147e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4000e-01 2.3000e+07 5.5315e+02 5.3601e+03 2.8747e-08 0.0000e+00 1.0000e+00 5.3601e+03 5.3601e+03 2.7378e+02 2.7378e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6000e-01 2.2000e+07 5.5315e+02 5.2024e+03 3.1042e-08 0.0000e+00 1.0000e+00 5.2024e+03 5.2024e+03 2.6572e+02 2.6572e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8000e-01 2.1000e+07 5.5315e+02 5.0370e+03 3.3630e-08 0.0000e+00 1.0000e+00 5.0370e+03 5.0370e+03 2.5728e+02 2.5728e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0000e-01 2.0000e+07 5.5315e+02 4.8634e+03 3.6560e-08 0.0000e+00 1.0000e+00 4.8634e+03 4.8634e+03 2.4841e+02 2.4841e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2000e-01 1.9000e+07 5.5315e+02 4.6812e+03 3.9890e-08 0.0000e+00 1.0000e+00 4.6812e+03 4.6812e+03 2.3910e+02 2.3910e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4000e-01 1.8000e+07 5.5315e+02 4.4898e+03 4.3686e-08 0.0000e+00 1.0000e+00 4.4898e+03 4.4898e+03 2.2933e+02 2.2933e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.6000e-01 1.7000e+07 5.5315e+02 4.2898e+03 4.6261e-08 4.5641e-02 9.5436e-01 4.7351e+03 4.2706e+03 3.3247e+02 2.1533e+02 1.0000e-03 1.0000e-03 7.6825e-03 2.2373e-03 4.2618e-01 1.0167e-01 8.3774e-02 4.6651e-02 2.2890e-02 1.7745e-02 2.9117e-01 9.0452e-03 3.0262e-03 5.3843e-01 1.1504e-01 8.8042e-02 4.5564e-02 2.0832e-02 1.5009e-02 1.6501e-01 +3.8000e-01 1.6000e+07 5.5315e+02 4.0893e+03 4.9564e-08 1.8812e-01 8.1188e-01 4.6823e+03 3.9727e+03 3.6079e+02 1.8822e+02 1.0000e-03 1.0000e-03 7.1915e-03 1.9892e-03 3.8884e-01 9.6576e-02 8.1672e-02 4.6619e-02 2.3403e-02 1.8552e-02 3.3516e-01 9.2576e-03 3.1440e-03 5.5548e-01 1.1717e-01 8.8787e-02 4.5455e-02 2.0543e-02 1.4608e-02 1.4556e-01 +4.0000e-01 1.5000e+07 5.5315e+02 3.8842e+03 5.3440e-08 2.4423e-01 7.5577e-01 4.6085e+03 3.6965e+03 3.8231e+02 1.6795e+02 1.0000e-03 1.0000e-03 6.7572e-03 1.7894e-03 3.5754e-01 9.1894e-02 7.9461e-02 4.6321e-02 2.3709e-02 1.9148e-02 3.7339e-01 9.3969e-03 3.2143e-03 5.6606e-01 1.1862e-01 8.9394e-02 4.5472e-02 2.0403e-02 1.4383e-02 1.3306e-01 +4.2000e-01 1.4000e+07 5.5315e+02 3.6739e+03 5.8034e-08 2.7428e-01 7.2572e-01 4.5259e+03 3.4299e+03 4.0050e+02 1.5105e+02 1.0000e-03 1.0000e-03 6.3418e-03 1.6141e-03 3.2902e-01 8.7264e-02 7.7032e-02 4.5789e-02 2.3863e-02 1.9608e-02 4.0947e-01 9.5000e-03 3.2607e-03 5.7339e-01 1.1974e-01 8.9944e-02 4.5565e-02 2.0343e-02 1.4252e-02 1.2401e-01 +4.4000e-01 1.3000e+07 5.5315e+02 3.4575e+03 6.3540e-08 2.9189e-01 7.0811e-01 4.4387e+03 3.1688e+03 4.1665e+02 1.3625e+02 1.0000e-03 1.0000e-03 5.9319e-03 1.4546e-03 3.0213e-01 8.2554e-02 7.4331e-02 4.5021e-02 2.3875e-02 1.9947e-02 4.4476e-01 9.5793e-03 3.2918e-03 5.7862e-01 1.2065e-01 9.0462e-02 4.5709e-02 2.0338e-02 1.4185e-02 1.1717e-01 +4.6000e-01 1.2000e+07 5.5315e+02 3.2342e+03 7.0225e-08 3.0194e-01 6.9806e-01 4.3489e+03 2.9114e+03 4.3138e+02 1.2292e+02 1.0000e-03 1.0000e-03 5.5208e-03 1.3065e-03 2.7628e-01 7.7691e-02 7.1321e-02 4.4001e-02 2.3741e-02 2.0165e-02 4.7998e-01 9.6405e-03 3.3118e-03 5.8228e-01 1.2140e-01 9.0952e-02 4.5894e-02 2.0377e-02 1.4168e-02 1.1198e-01 +4.8000e-01 1.1000e+07 5.5315e+02 3.0029e+03 7.8464e-08 3.0653e-01 6.9347e-01 4.2574e+03 2.6569e+03 4.4506e+02 1.1069e+02 1.0000e-03 1.0000e-03 5.1047e-03 1.1672e-03 2.5115e-01 7.2629e-02 6.7965e-02 4.2709e-02 2.3447e-02 2.0250e-02 5.1558e-01 9.6862e-03 3.3228e-03 5.8465e-01 1.2199e-01 9.1412e-02 4.6109e-02 2.0451e-02 1.4193e-02 1.0818e-01 +5.0000e-01 1.0000e+07 5.5315e+02 2.7626e+03 8.8797e-08 3.0652e-01 6.9348e-01 4.1650e+03 2.4047e+03 4.5794e+02 9.9319e+01 1.0000e-03 1.0000e-03 4.6810e-03 1.0353e-03 2.2653e-01 6.7336e-02 6.4228e-02 4.1113e-02 2.2974e-02 2.0183e-02 5.5192e-01 9.7171e-03 3.3262e-03 5.8587e-01 1.2245e-01 9.1830e-02 4.6345e-02 2.0556e-02 1.4256e-02 1.0566e-01 +5.2000e-01 9.6040e+06 5.5315e+02 2.6646e+03 9.3634e-08 3.0530e-01 6.9470e-01 4.1282e+03 2.3054e+03 4.6286e+02 9.5019e+01 1.0000e-03 1.0000e-03 4.5107e-03 9.8476e-04 2.1689e-01 6.5170e-02 6.2635e-02 4.0391e-02 2.2731e-02 2.0109e-02 5.6658e-01 9.7252e-03 3.3256e-03 5.8604e-01 1.2259e-01 9.1982e-02 4.6442e-02 2.0604e-02 1.4291e-02 1.0500e-01 +5.4000e-01 9.2080e+06 5.5315e+02 2.5649e+03 9.8987e-08 3.0338e-01 6.9662e-01 4.0913e+03 2.2065e+03 4.6768e+02 9.0820e+01 1.0000e-03 1.0000e-03 4.3389e-03 9.3517e-04 2.0731e-01 6.2962e-02 6.0974e-02 3.9613e-02 2.2454e-02 2.0005e-02 5.8141e-01 9.7309e-03 3.3238e-03 5.8604e-01 1.2270e-01 9.2122e-02 4.6539e-02 2.0656e-02 1.4331e-02 1.0456e-01 +5.6000e-01 8.8120e+06 5.5315e+02 2.4635e+03 1.0494e-07 3.0072e-01 6.9928e-01 4.0544e+03 2.1078e+03 4.7243e+02 8.6716e+01 1.0000e-03 1.0000e-03 4.1655e-03 8.8643e-04 1.9777e-01 6.0710e-02 5.9243e-02 3.8777e-02 2.2141e-02 1.9868e-02 5.9644e-01 9.7341e-03 3.3209e-03 5.8586e-01 1.2278e-01 9.2251e-02 4.6636e-02 2.0712e-02 1.4376e-02 1.0433e-01 +5.8000e-01 8.4160e+06 5.5315e+02 2.3602e+03 1.1158e-07 2.9729e-01 7.0271e-01 4.0174e+03 2.0095e+03 4.7709e+02 8.2700e+01 1.0000e-03 1.0000e-03 3.9904e-03 8.3852e-04 1.8827e-01 5.8414e-02 5.7439e-02 3.7881e-02 2.1790e-02 1.9696e-02 6.1168e-01 9.7345e-03 3.3169e-03 5.8549e-01 1.2284e-01 9.2366e-02 4.6732e-02 2.0769e-02 1.4426e-02 1.0433e-01 +6.0000e-01 8.0200e+06 5.5315e+02 2.2549e+03 1.1902e-07 2.9301e-01 7.0699e-01 3.9803e+03 1.9115e+03 4.8169e+02 7.8767e+01 1.0000e-03 1.0000e-03 3.8136e-03 7.9138e-04 1.7882e-01 5.6072e-02 5.5560e-02 3.6921e-02 2.1398e-02 1.9487e-02 6.2714e-01 9.7319e-03 3.3117e-03 5.8492e-01 1.2286e-01 9.2464e-02 4.6825e-02 2.0830e-02 1.4481e-02 1.0457e-01 +6.2000e-01 7.6240e+06 5.5315e+02 2.1476e+03 1.2742e-07 2.8781e-01 7.1219e-01 3.9433e+03 1.8138e+03 4.8622e+02 7.4911e+01 1.0000e-03 1.0000e-03 3.6350e-03 7.4500e-04 1.6939e-01 5.3682e-02 5.3604e-02 3.5895e-02 2.0962e-02 1.9237e-02 6.4285e-01 9.7262e-03 3.3052e-03 5.8415e-01 1.2285e-01 9.2542e-02 4.6914e-02 2.0892e-02 1.4540e-02 1.0509e-01 +6.4000e-01 7.2280e+06 5.5315e+02 2.0381e+03 1.3694e-07 2.8158e-01 7.1842e-01 3.9062e+03 1.7164e+03 4.9069e+02 7.1128e+01 1.0000e-03 1.0000e-03 3.4546e-03 6.9934e-04 1.6000e-01 5.1244e-02 5.1567e-02 3.4799e-02 2.0480e-02 1.8942e-02 6.5881e-01 9.7170e-03 3.2975e-03 5.8315e-01 1.2279e-01 9.2598e-02 4.6997e-02 2.0954e-02 1.4603e-02 1.0590e-01 +6.6000e-01 6.8320e+06 5.5315e+02 1.9265e+03 1.4781e-07 2.7416e-01 7.2584e-01 3.8690e+03 1.6194e+03 4.9510e+02 6.7415e+01 1.0000e-03 1.0000e-03 3.2724e-03 6.5437e-04 1.5064e-01 4.8757e-02 4.9447e-02 3.3630e-02 1.9949e-02 1.8599e-02 6.7505e-01 9.7038e-03 3.2882e-03 5.8189e-01 1.2269e-01 9.2625e-02 4.7071e-02 2.1017e-02 1.4670e-02 1.0704e-01 +6.8000e-01 6.4360e+06 5.5315e+02 1.8126e+03 1.6031e-07 2.6540e-01 7.3460e-01 3.8319e+03 1.5227e+03 4.9946e+02 6.3766e+01 1.0000e-03 1.0000e-03 3.0883e-03 6.1007e-04 1.4131e-01 4.6220e-02 4.7241e-02 3.2385e-02 1.9365e-02 1.8204e-02 6.9158e-01 9.6862e-03 3.2774e-03 5.8036e-01 1.2254e-01 9.2619e-02 4.7134e-02 2.1078e-02 1.4740e-02 1.0857e-01 +7.0000e-01 6.0400e+06 5.5315e+02 1.6964e+03 1.7480e-07 2.5503e-01 7.4497e-01 3.7947e+03 1.4263e+03 5.0378e+02 6.0179e+01 1.0000e-03 1.0000e-03 2.9022e-03 5.6642e-04 1.3200e-01 4.3631e-02 4.4946e-02 3.1059e-02 1.8725e-02 1.7751e-02 7.0842e-01 9.6634e-03 3.2648e-03 5.7851e-01 1.2232e-01 9.2573e-02 4.7182e-02 2.1137e-02 1.4812e-02 1.1054e-01 +7.2000e-01 5.6440e+06 5.5315e+02 1.5777e+03 1.9174e-07 2.4276e-01 7.5724e-01 3.7575e+03 1.3303e+03 5.0805e+02 5.6650e+01 1.0000e-03 1.0000e-03 2.7143e-03 5.2340e-04 1.2272e-01 4.0990e-02 4.2560e-02 2.9648e-02 1.8024e-02 1.7237e-02 7.2559e-01 9.6346e-03 3.2500e-03 5.7630e-01 1.2203e-01 9.2478e-02 4.7211e-02 2.1190e-02 1.4884e-02 1.1303e-01 +7.4000e-01 5.2480e+06 5.5315e+02 1.4568e+03 2.1177e-07 2.2816e-01 7.7184e-01 3.7203e+03 1.2347e+03 5.1228e+02 5.3177e+01 1.0000e-03 1.0000e-03 2.5244e-03 4.8100e-04 1.1346e-01 3.8295e-02 4.0080e-02 2.8149e-02 1.7259e-02 1.6654e-02 7.4310e-01 9.5987e-03 3.2329e-03 5.7365e-01 1.2165e-01 9.2321e-02 4.7213e-02 2.1237e-02 1.4956e-02 1.1614e-01 +7.6000e-01 4.8520e+06 5.5315e+02 1.3334e+03 2.3574e-07 2.1067e-01 7.8933e-01 3.6830e+03 1.1394e+03 5.1647e+02 4.9756e+01 1.0000e-03 1.0000e-03 2.3326e-03 4.3920e-04 1.0422e-01 3.5547e-02 3.7502e-02 2.6557e-02 1.6425e-02 1.5997e-02 7.6098e-01 9.5541e-03 3.2128e-03 5.7048e-01 1.2117e-01 9.2089e-02 4.7183e-02 2.1272e-02 1.5025e-02 1.2002e-01 +7.8000e-01 4.4560e+06 5.5315e+02 1.2078e+03 2.6481e-07 1.8950e-01 8.1050e-01 3.6457e+03 1.0445e+03 5.2063e+02 4.6386e+01 1.0000e-03 1.0000e-03 2.1388e-03 3.9798e-04 9.4999e-02 3.2743e-02 3.4823e-02 2.4868e-02 1.5517e-02 1.5258e-02 7.7926e-01 9.4988e-03 3.1892e-03 5.6667e-01 1.2055e-01 9.1759e-02 4.7107e-02 2.1291e-02 1.5089e-02 1.2485e-01 +8.0000e-01 4.0600e+06 5.5315e+02 1.0802e+03 3.0068e-07 1.6353e-01 8.3647e-01 3.6084e+03 9.5005e+02 5.2476e+02 4.3064e+01 1.0000e-03 1.0000e-03 1.9431e-03 3.5734e-04 8.5803e-02 2.9884e-02 3.2040e-02 2.3075e-02 1.4530e-02 1.4429e-02 7.9794e-01 9.4300e-03 3.1610e-03 5.6205e-01 1.1976e-01 9.1304e-02 4.6973e-02 2.1288e-02 1.5141e-02 1.3089e-01 +8.2000e-01 3.6640e+06 5.5315e+02 9.5074e+02 3.4583e-07 1.3110e-01 8.6890e-01 3.5711e+03 8.5597e+02 5.2886e+02 3.9788e+01 1.0000e-03 1.0000e-03 1.7455e-03 3.1726e-04 7.6629e-02 2.6969e-02 2.9151e-02 2.1175e-02 1.3457e-02 1.3502e-02 8.1705e-01 9.3436e-03 3.1270e-03 5.5639e-01 1.1875e-01 9.0682e-02 4.6757e-02 2.1252e-02 1.5176e-02 1.3852e-01 +8.4000e-01 3.2680e+06 5.5315e+02 8.1998e+02 4.0405e-07 8.9676e-02 9.1032e-01 3.5337e+03 7.6231e+02 5.3294e+02 3.6555e+01 1.0000e-03 1.0000e-03 1.5459e-03 2.7773e-04 6.7475e-02 2.3996e-02 2.6151e-02 1.9163e-02 1.2294e-02 1.2467e-02 8.3663e-01 9.2335e-03 3.0853e-03 5.4933e-01 1.1744e-01 8.9834e-02 4.6428e-02 2.1170e-02 1.5182e-02 1.4830e-01 +8.6000e-01 2.8720e+06 5.5315e+02 6.8864e+02 4.8147e-07 3.5115e-02 9.6488e-01 3.4962e+03 6.6908e+02 5.3699e+02 3.3364e+01 1.0000e-03 1.0000e-03 1.3444e-03 2.3875e-04 5.8344e-02 2.0966e-02 2.3038e-02 1.7031e-02 1.1033e-02 1.1313e-02 8.5669e-01 9.0905e-03 3.0326e-03 5.4033e-01 1.1571e-01 8.8666e-02 4.5938e-02 2.1017e-02 1.5145e-02 1.6108e-01 +8.8000e-01 2.4760e+06 5.5315e+02 5.7384e+02 4.2818e-07 0.0000e+00 1.0000e+00 5.7384e+02 5.7384e+02 2.9310e+01 2.9310e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0000e-01 2.0800e+06 5.5315e+02 4.7739e+02 5.0563e-07 0.0000e+00 1.0000e+00 4.7739e+02 4.7739e+02 2.4384e+01 2.4384e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2000e-01 1.6840e+06 5.5315e+02 3.8268e+02 6.1919e-07 0.0000e+00 1.0000e+00 3.8268e+02 3.8268e+02 1.9546e+01 1.9546e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4000e-01 1.2880e+06 5.5315e+02 2.8974e+02 8.0221e-07 0.0000e+00 1.0000e+00 2.8974e+02 2.8974e+02 1.4799e+01 1.4799e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6000e-01 8.9200e+05 5.5315e+02 1.9860e+02 1.1473e-06 0.0000e+00 1.0000e+00 1.9860e+02 1.9860e+02 1.0144e+01 1.0144e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8000e-01 4.9600e+05 5.5315e+02 1.0929e+02 2.0427e-06 0.0000e+00 1.0000e+00 1.0929e+02 1.0929e+02 5.5820e+00 5.5820e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e+00 1.0000e+05 5.5315e+02 2.1802e+01 1.0027e-05 0.0000e+00 1.0000e+00 2.1802e+01 2.1802e+01 1.1136e+00 1.1136e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0200e+00 4.9600e+05 5.8315e+02 1.0339e+02 2.0372e-06 0.0000e+00 1.0000e+00 1.0339e+02 1.0339e+02 5.2808e+00 5.2808e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0400e+00 8.9200e+05 5.8315e+02 1.8748e+02 1.1418e-06 0.0000e+00 1.0000e+00 1.8748e+02 1.8748e+02 9.5758e+00 9.5758e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0600e+00 1.2880e+06 5.8315e+02 2.7291e+02 7.9661e-07 0.0000e+00 1.0000e+00 2.7291e+02 2.7291e+02 1.3939e+01 1.3939e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0800e+00 1.6840e+06 5.8315e+02 3.5965e+02 6.1354e-07 0.0000e+00 1.0000e+00 3.5965e+02 3.5965e+02 1.8370e+01 1.8370e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1000e+00 2.0800e+06 5.8315e+02 4.4765e+02 4.9994e-07 0.0000e+00 1.0000e+00 4.4765e+02 4.4765e+02 2.2865e+01 2.2865e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1200e+00 2.4760e+06 5.8315e+02 5.3688e+02 4.2246e-07 0.0000e+00 1.0000e+00 5.3688e+02 5.3688e+02 2.7422e+01 2.7422e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1400e+00 2.8720e+06 5.8315e+02 6.2727e+02 3.6616e-07 0.0000e+00 1.0000e+00 6.2727e+02 6.2727e+02 3.2039e+01 3.2039e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1600e+00 3.2680e+06 5.8315e+02 7.1876e+02 3.2331e-07 0.0000e+00 1.0000e+00 7.1876e+02 7.1876e+02 3.6712e+01 3.6712e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1800e+00 3.6640e+06 5.8315e+02 8.1129e+02 2.8954e-07 0.0000e+00 1.0000e+00 8.1129e+02 8.1129e+02 4.1438e+01 4.1438e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e+00 4.0600e+06 5.8315e+02 9.0478e+02 2.6219e-07 0.0000e+00 1.0000e+00 9.0478e+02 9.0478e+02 4.6214e+01 4.6214e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2200e+00 4.4560e+06 5.8315e+02 9.9914e+02 2.3954e-07 0.0000e+00 1.0000e+00 9.9914e+02 9.9914e+02 5.1033e+01 5.1033e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2400e+00 4.8520e+06 5.8315e+02 1.0943e+03 2.2043e-07 0.0000e+00 1.0000e+00 1.0943e+03 1.0943e+03 5.5894e+01 5.5894e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2600e+00 5.2480e+06 5.8315e+02 1.1902e+03 2.0406e-07 0.0000e+00 1.0000e+00 1.1902e+03 1.1902e+03 6.0790e+01 6.0790e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2800e+00 5.6440e+06 5.8315e+02 1.2866e+03 1.8984e-07 0.0000e+00 1.0000e+00 1.2866e+03 1.2866e+03 6.5717e+01 6.5717e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3000e+00 6.0400e+06 5.8315e+02 1.3836e+03 1.7735e-07 0.0000e+00 1.0000e+00 1.3836e+03 1.3836e+03 7.0669e+01 7.0669e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3200e+00 6.4360e+06 5.8315e+02 1.4809e+03 1.6627e-07 0.0000e+00 1.0000e+00 1.4809e+03 1.4809e+03 7.5641e+01 7.5641e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3400e+00 6.8320e+06 5.8315e+02 1.5785e+03 1.5636e-07 0.0000e+00 1.0000e+00 1.5785e+03 1.5785e+03 8.0628e+01 8.0628e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3600e+00 7.2280e+06 5.8315e+02 1.6764e+03 1.4743e-07 0.0000e+00 1.0000e+00 1.6764e+03 1.6764e+03 8.5624e+01 8.5624e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3800e+00 7.6240e+06 5.8315e+02 1.7742e+03 1.3931e-07 0.0000e+00 1.0000e+00 1.7742e+03 1.7742e+03 9.0624e+01 9.0624e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4000e+00 8.0200e+06 5.8315e+02 1.8721e+03 1.3191e-07 0.0000e+00 1.0000e+00 1.8721e+03 1.8721e+03 9.5621e+01 9.5621e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4200e+00 8.4160e+06 5.8315e+02 1.9698e+03 1.2511e-07 0.0000e+00 1.0000e+00 1.9698e+03 1.9698e+03 1.0061e+02 1.0061e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4400e+00 8.8120e+06 5.8315e+02 2.0672e+03 1.1885e-07 0.0000e+00 1.0000e+00 2.0672e+03 2.0672e+03 1.0559e+02 1.0559e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4600e+00 9.2080e+06 5.8315e+02 2.1643e+03 1.1305e-07 0.0000e+00 1.0000e+00 2.1643e+03 2.1643e+03 1.1055e+02 1.1055e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4800e+00 9.6040e+06 5.8315e+02 2.2610e+03 1.0766e-07 0.0000e+00 1.0000e+00 2.2610e+03 2.2610e+03 1.1549e+02 1.1549e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5000e+00 1.0000e+07 5.8315e+02 2.3571e+03 1.0264e-07 0.0000e+00 1.0000e+00 2.3571e+03 2.3571e+03 1.2039e+02 1.2039e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5200e+00 1.1000e+07 5.8315e+02 2.5968e+03 9.1381e-08 0.0000e+00 1.0000e+00 2.5968e+03 2.5968e+03 1.3264e+02 1.3264e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5400e+00 1.2000e+07 5.8315e+02 2.8313e+03 8.1781e-08 0.0000e+00 1.0000e+00 2.8313e+03 2.8313e+03 1.4462e+02 1.4462e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5600e+00 1.3000e+07 5.8315e+02 3.0596e+03 7.3522e-08 0.0000e+00 1.0000e+00 3.0596e+03 3.0596e+03 1.5628e+02 1.5628e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e+00 1.4000e+07 5.8315e+02 3.2810e+03 6.6367e-08 0.0000e+00 1.0000e+00 3.2810e+03 3.2810e+03 1.6759e+02 1.6759e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e+00 1.5000e+07 5.8315e+02 3.4950e+03 6.0138e-08 0.0000e+00 1.0000e+00 3.4950e+03 3.4950e+03 1.7852e+02 1.7852e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e+00 1.6000e+07 5.8315e+02 3.7013e+03 5.4692e-08 0.0000e+00 1.0000e+00 3.7013e+03 3.7013e+03 1.8905e+02 1.8905e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e+00 1.7000e+07 5.8315e+02 3.8999e+03 4.9912e-08 0.0000e+00 1.0000e+00 3.8999e+03 3.8999e+03 1.9920e+02 1.9920e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e+00 1.8000e+07 5.8315e+02 4.0907e+03 4.5705e-08 0.0000e+00 1.0000e+00 4.0907e+03 4.0907e+03 2.0894e+02 2.0894e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e+00 1.9000e+07 5.8315e+02 4.2739e+03 4.1989e-08 0.0000e+00 1.0000e+00 4.2739e+03 4.2739e+03 2.1830e+02 2.1830e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e+00 2.0000e+07 5.8315e+02 4.4497e+03 3.8697e-08 0.0000e+00 1.0000e+00 4.4497e+03 4.4497e+03 2.2728e+02 2.2728e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e+00 2.1000e+07 5.8315e+02 4.6183e+03 3.5771e-08 0.0000e+00 1.0000e+00 4.6183e+03 4.6183e+03 2.3589e+02 2.3589e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e+00 2.2000e+07 5.8315e+02 4.7802e+03 3.3162e-08 0.0000e+00 1.0000e+00 4.7802e+03 4.7802e+03 2.4416e+02 2.4416e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e+00 2.3000e+07 5.8315e+02 4.9355e+03 3.0829e-08 0.0000e+00 1.0000e+00 4.9355e+03 4.9355e+03 2.5209e+02 2.5209e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e+00 2.4000e+07 5.8315e+02 5.0846e+03 2.8736e-08 0.0000e+00 1.0000e+00 5.0846e+03 5.0846e+03 2.5971e+02 2.5971e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e+00 2.5000e+07 5.8315e+02 5.2278e+03 2.6853e-08 0.0000e+00 1.0000e+00 5.2278e+03 5.2278e+03 2.6702e+02 2.6702e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e+00 2.6000e+07 5.8315e+02 5.3654e+03 2.5153e-08 0.0000e+00 1.0000e+00 5.3654e+03 5.3654e+03 2.7405e+02 2.7405e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e+00 2.7000e+07 5.8315e+02 5.4978e+03 2.3615e-08 0.0000e+00 1.0000e+00 5.4978e+03 5.4978e+03 2.8081e+02 2.8081e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e+00 2.8000e+07 5.8315e+02 5.6252e+03 2.2218e-08 0.0000e+00 1.0000e+00 5.6252e+03 5.6252e+03 2.8732e+02 2.8732e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e+00 2.9000e+07 5.8315e+02 5.7479e+03 2.0947e-08 0.0000e+00 1.0000e+00 5.7479e+03 5.7479e+03 2.9359e+02 2.9359e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e+00 3.0000e+07 5.8315e+02 5.8661e+03 1.9787e-08 0.0000e+00 1.0000e+00 5.8661e+03 5.8661e+03 2.9962e+02 2.9962e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e+00 3.1000e+07 5.8315e+02 5.9801e+03 1.8725e-08 0.0000e+00 1.0000e+00 5.9801e+03 5.9801e+03 3.0545e+02 3.0545e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e+00 3.2000e+07 5.8315e+02 6.0901e+03 1.7751e-08 0.0000e+00 1.0000e+00 6.0901e+03 6.0901e+03 3.1107e+02 3.1107e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e+00 3.3000e+07 5.8315e+02 6.1964e+03 1.6856e-08 0.0000e+00 1.0000e+00 6.1964e+03 6.1964e+03 3.1649e+02 3.1649e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e+00 3.4000e+07 5.8315e+02 6.2991e+03 1.6030e-08 0.0000e+00 1.0000e+00 6.2991e+03 6.2991e+03 3.2174e+02 3.2174e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e+00 3.5000e+07 5.8315e+02 6.3984e+03 1.5268e-08 0.0000e+00 1.0000e+00 6.3984e+03 6.3984e+03 3.2681e+02 3.2681e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPRLBC.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPRLBC.txt new file mode 100644 index 00000000000..9094419bc8a --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilPRLBC.txt @@ -0,0 +1,1012 @@ +# column 1 = time +# column 2 = pressure +# column 3 = temperature +# column 4 = density +# column 5 = total compressibility +# columns 6-7 = phase fractions +# columns 8-9 = phase densities +# columns 10-11 = phase mass densities +# columns 12-13 = phase viscosities +# columns 14-22 = oil phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +# columns 23-31 = gas phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +0.0000e+00 3.5000e+07 5.5315e+02 6.8078e+03 1.3932e-08 1.0000e+00 0.0000e+00 6.8078e+03 6.8078e+03 3.4772e+02 3.4772e+02 4.5175e-05 4.5175e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-03 3.4900e+07 5.5315e+02 6.7983e+03 1.4001e-08 1.0000e+00 0.0000e+00 6.7983e+03 6.7983e+03 3.4724e+02 3.4724e+02 4.5093e-05 4.5093e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-03 3.4800e+07 5.5315e+02 6.7887e+03 1.4069e-08 1.0000e+00 0.0000e+00 6.7887e+03 6.7887e+03 3.4675e+02 3.4675e+02 4.5010e-05 4.5010e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-03 3.4700e+07 5.5315e+02 6.7792e+03 1.4138e-08 1.0000e+00 0.0000e+00 6.7792e+03 6.7792e+03 3.4626e+02 3.4626e+02 4.4928e-05 4.4928e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.0000e-03 3.4600e+07 5.5315e+02 6.7696e+03 1.4208e-08 1.0000e+00 0.0000e+00 6.7696e+03 6.7696e+03 3.4577e+02 3.4577e+02 4.4845e-05 4.4845e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0000e-02 3.4500e+07 5.5315e+02 6.7599e+03 1.4278e-08 1.0000e+00 0.0000e+00 6.7599e+03 6.7599e+03 3.4528e+02 3.4528e+02 4.4762e-05 4.4762e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2000e-02 3.4400e+07 5.5315e+02 6.7503e+03 1.4349e-08 1.0000e+00 0.0000e+00 6.7503e+03 6.7503e+03 3.4479e+02 3.4479e+02 4.4679e-05 4.4679e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4000e-02 3.4300e+07 5.5315e+02 6.7406e+03 1.4421e-08 1.0000e+00 0.0000e+00 6.7406e+03 6.7406e+03 3.4429e+02 3.4429e+02 4.4596e-05 4.4596e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.6000e-02 3.4200e+07 5.5315e+02 6.7308e+03 1.4493e-08 1.0000e+00 0.0000e+00 6.7308e+03 6.7308e+03 3.4379e+02 3.4379e+02 4.4513e-05 4.4513e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.8000e-02 3.4100e+07 5.5315e+02 6.7211e+03 1.4566e-08 1.0000e+00 0.0000e+00 6.7211e+03 6.7211e+03 3.4329e+02 3.4329e+02 4.4430e-05 4.4430e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-02 3.4000e+07 5.5315e+02 6.7113e+03 1.4639e-08 1.0000e+00 0.0000e+00 6.7113e+03 6.7113e+03 3.4279e+02 3.4279e+02 4.4346e-05 4.4346e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.2000e-02 3.3900e+07 5.5315e+02 6.7014e+03 1.4713e-08 1.0000e+00 0.0000e+00 6.7014e+03 6.7014e+03 3.4229e+02 3.4229e+02 4.4263e-05 4.4263e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.4000e-02 3.3800e+07 5.5315e+02 6.6915e+03 1.4787e-08 1.0000e+00 0.0000e+00 6.6915e+03 6.6915e+03 3.4179e+02 3.4179e+02 4.4179e-05 4.4179e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.6000e-02 3.3700e+07 5.5315e+02 6.6816e+03 1.4862e-08 1.0000e+00 0.0000e+00 6.6816e+03 6.6816e+03 3.4128e+02 3.4128e+02 4.4095e-05 4.4095e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.8000e-02 3.3600e+07 5.5315e+02 6.6717e+03 1.4938e-08 1.0000e+00 0.0000e+00 6.6717e+03 6.6717e+03 3.4077e+02 3.4077e+02 4.4012e-05 4.4012e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.0000e-02 3.3500e+07 5.5315e+02 6.6617e+03 1.5014e-08 1.0000e+00 0.0000e+00 6.6617e+03 6.6617e+03 3.4026e+02 3.4026e+02 4.3928e-05 4.3928e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.2000e-02 3.3400e+07 5.5315e+02 6.6517e+03 1.5091e-08 1.0000e+00 0.0000e+00 6.6517e+03 6.6517e+03 3.3975e+02 3.3975e+02 4.3843e-05 4.3843e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.4000e-02 3.3300e+07 5.5315e+02 6.6416e+03 1.5169e-08 1.0000e+00 0.0000e+00 6.6416e+03 6.6416e+03 3.3924e+02 3.3924e+02 4.3759e-05 4.3759e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.6000e-02 3.3200e+07 5.5315e+02 6.6315e+03 1.5247e-08 1.0000e+00 0.0000e+00 6.6315e+03 6.6315e+03 3.3872e+02 3.3872e+02 4.3675e-05 4.3675e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.8000e-02 3.3100e+07 5.5315e+02 6.6214e+03 1.5326e-08 1.0000e+00 0.0000e+00 6.6214e+03 6.6214e+03 3.3820e+02 3.3820e+02 4.3590e-05 4.3590e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-02 3.3000e+07 5.5315e+02 6.6112e+03 1.5406e-08 1.0000e+00 0.0000e+00 6.6112e+03 6.6112e+03 3.3768e+02 3.3768e+02 4.3505e-05 4.3505e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.2000e-02 3.2900e+07 5.5315e+02 6.6010e+03 1.5486e-08 1.0000e+00 0.0000e+00 6.6010e+03 6.6010e+03 3.3716e+02 3.3716e+02 4.3420e-05 4.3420e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.4000e-02 3.2800e+07 5.5315e+02 6.5908e+03 1.5567e-08 1.0000e+00 0.0000e+00 6.5908e+03 6.5908e+03 3.3664e+02 3.3664e+02 4.3336e-05 4.3336e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.6000e-02 3.2700e+07 5.5315e+02 6.5805e+03 1.5648e-08 1.0000e+00 0.0000e+00 6.5805e+03 6.5805e+03 3.3611e+02 3.3611e+02 4.3250e-05 4.3250e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.8000e-02 3.2600e+07 5.5315e+02 6.5702e+03 1.5731e-08 1.0000e+00 0.0000e+00 6.5702e+03 6.5702e+03 3.3559e+02 3.3559e+02 4.3165e-05 4.3165e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.0000e-02 3.2500e+07 5.5315e+02 6.5598e+03 1.5814e-08 1.0000e+00 0.0000e+00 6.5598e+03 6.5598e+03 3.3506e+02 3.3506e+02 4.3080e-05 4.3080e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.2000e-02 3.2400e+07 5.5315e+02 6.5494e+03 1.5898e-08 1.0000e+00 0.0000e+00 6.5494e+03 6.5494e+03 3.3453e+02 3.3453e+02 4.2994e-05 4.2994e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.4000e-02 3.2300e+07 5.5315e+02 6.5390e+03 1.5982e-08 1.0000e+00 0.0000e+00 6.5390e+03 6.5390e+03 3.3400e+02 3.3400e+02 4.2909e-05 4.2909e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.6000e-02 3.2200e+07 5.5315e+02 6.5285e+03 1.6067e-08 1.0000e+00 0.0000e+00 6.5285e+03 6.5285e+03 3.3346e+02 3.3346e+02 4.2823e-05 4.2823e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.8000e-02 3.2100e+07 5.5315e+02 6.5180e+03 1.6153e-08 1.0000e+00 0.0000e+00 6.5180e+03 6.5180e+03 3.3292e+02 3.3292e+02 4.2737e-05 4.2737e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-02 3.2000e+07 5.5315e+02 6.5075e+03 1.6240e-08 1.0000e+00 0.0000e+00 6.5075e+03 6.5075e+03 3.3238e+02 3.3238e+02 4.2651e-05 4.2651e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.2000e-02 3.1900e+07 5.5315e+02 6.4969e+03 1.6327e-08 1.0000e+00 0.0000e+00 6.4969e+03 6.4969e+03 3.3184e+02 3.3184e+02 4.2564e-05 4.2564e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.4000e-02 3.1800e+07 5.5315e+02 6.4863e+03 1.6416e-08 1.0000e+00 0.0000e+00 6.4863e+03 6.4863e+03 3.3130e+02 3.3130e+02 4.2478e-05 4.2478e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.6000e-02 3.1700e+07 5.5315e+02 6.4756e+03 1.6505e-08 1.0000e+00 0.0000e+00 6.4756e+03 6.4756e+03 3.3076e+02 3.3076e+02 4.2391e-05 4.2391e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.8000e-02 3.1600e+07 5.5315e+02 6.4649e+03 1.6595e-08 1.0000e+00 0.0000e+00 6.4649e+03 6.4649e+03 3.3021e+02 3.3021e+02 4.2305e-05 4.2305e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.0000e-02 3.1500e+07 5.5315e+02 6.4541e+03 1.6685e-08 1.0000e+00 0.0000e+00 6.4541e+03 6.4541e+03 3.2966e+02 3.2966e+02 4.2218e-05 4.2218e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.2000e-02 3.1400e+07 5.5315e+02 6.4434e+03 1.6777e-08 1.0000e+00 0.0000e+00 6.4434e+03 6.4434e+03 3.2911e+02 3.2911e+02 4.2131e-05 4.2131e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.4000e-02 3.1300e+07 5.5315e+02 6.4325e+03 1.6869e-08 0.0000e+00 1.0000e+00 6.4325e+03 6.4325e+03 3.2856e+02 3.2856e+02 4.2044e-05 4.2044e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +7.6000e-02 3.1200e+07 5.5315e+02 6.4216e+03 1.6962e-08 0.0000e+00 1.0000e+00 6.4216e+03 6.4216e+03 3.2800e+02 3.2800e+02 4.1956e-05 4.1956e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +7.8000e-02 3.1100e+07 5.5315e+02 6.4107e+03 1.7056e-08 0.0000e+00 1.0000e+00 6.4107e+03 6.4107e+03 3.2744e+02 3.2744e+02 4.1869e-05 4.1869e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.0000e-02 3.1000e+07 5.5315e+02 6.3998e+03 1.7151e-08 0.0000e+00 1.0000e+00 6.3998e+03 6.3998e+03 3.2688e+02 3.2688e+02 4.1781e-05 4.1781e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.2000e-02 3.0900e+07 5.5315e+02 6.3888e+03 1.7246e-08 0.0000e+00 1.0000e+00 6.3888e+03 6.3888e+03 3.2632e+02 3.2632e+02 4.1693e-05 4.1693e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.4000e-02 3.0800e+07 5.5315e+02 6.3777e+03 1.7343e-08 0.0000e+00 1.0000e+00 6.3777e+03 6.3777e+03 3.2576e+02 3.2576e+02 4.1605e-05 4.1605e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.6000e-02 3.0700e+07 5.5315e+02 6.3667e+03 1.7440e-08 0.0000e+00 1.0000e+00 6.3667e+03 6.3667e+03 3.2519e+02 3.2519e+02 4.1517e-05 4.1517e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8000e-02 3.0600e+07 5.5315e+02 6.3555e+03 1.7538e-08 0.0000e+00 1.0000e+00 6.3555e+03 6.3555e+03 3.2462e+02 3.2462e+02 4.1429e-05 4.1429e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0000e-02 3.0500e+07 5.5315e+02 6.3444e+03 1.7637e-08 0.0000e+00 1.0000e+00 6.3444e+03 6.3444e+03 3.2405e+02 3.2405e+02 4.1341e-05 4.1341e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2000e-02 3.0400e+07 5.5315e+02 6.3332e+03 1.7737e-08 0.0000e+00 1.0000e+00 6.3332e+03 6.3332e+03 3.2348e+02 3.2348e+02 4.1252e-05 4.1252e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4000e-02 3.0300e+07 5.5315e+02 6.3219e+03 1.7838e-08 0.0000e+00 1.0000e+00 6.3219e+03 6.3219e+03 3.2291e+02 3.2291e+02 4.1163e-05 4.1163e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6000e-02 3.0200e+07 5.5315e+02 6.3106e+03 1.7940e-08 0.0000e+00 1.0000e+00 6.3106e+03 6.3106e+03 3.2233e+02 3.2233e+02 4.1074e-05 4.1074e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8000e-02 3.0100e+07 5.5315e+02 6.2993e+03 1.8043e-08 0.0000e+00 1.0000e+00 6.2993e+03 6.2993e+03 3.2175e+02 3.2175e+02 4.0985e-05 4.0985e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e-01 3.0000e+07 5.5315e+02 6.2879e+03 1.8147e-08 0.0000e+00 1.0000e+00 6.2879e+03 6.2879e+03 3.2117e+02 3.2117e+02 4.0896e-05 4.0896e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0200e-01 2.9900e+07 5.5315e+02 6.2764e+03 1.8252e-08 0.0000e+00 1.0000e+00 6.2764e+03 6.2764e+03 3.2058e+02 3.2058e+02 4.0806e-05 4.0806e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0400e-01 2.9800e+07 5.5315e+02 6.2650e+03 1.8357e-08 0.0000e+00 1.0000e+00 6.2650e+03 6.2650e+03 3.2000e+02 3.2000e+02 4.0717e-05 4.0717e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0600e-01 2.9700e+07 5.5315e+02 6.2534e+03 1.8464e-08 0.0000e+00 1.0000e+00 6.2534e+03 6.2534e+03 3.1941e+02 3.1941e+02 4.0627e-05 4.0627e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0800e-01 2.9600e+07 5.5315e+02 6.2419e+03 1.8572e-08 0.0000e+00 1.0000e+00 6.2419e+03 6.2419e+03 3.1882e+02 3.1882e+02 4.0537e-05 4.0537e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1000e-01 2.9500e+07 5.5315e+02 6.2303e+03 1.8681e-08 0.0000e+00 1.0000e+00 6.2303e+03 6.2303e+03 3.1822e+02 3.1822e+02 4.0447e-05 4.0447e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1200e-01 2.9400e+07 5.5315e+02 6.2186e+03 1.8790e-08 0.0000e+00 1.0000e+00 6.2186e+03 6.2186e+03 3.1763e+02 3.1763e+02 4.0356e-05 4.0356e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1400e-01 2.9300e+07 5.5315e+02 6.2069e+03 1.8901e-08 0.0000e+00 1.0000e+00 6.2069e+03 6.2069e+03 3.1703e+02 3.1703e+02 4.0266e-05 4.0266e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1600e-01 2.9200e+07 5.5315e+02 6.1951e+03 1.9013e-08 0.0000e+00 1.0000e+00 6.1951e+03 6.1951e+03 3.1643e+02 3.1643e+02 4.0175e-05 4.0175e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1800e-01 2.9100e+07 5.5315e+02 6.1833e+03 1.9126e-08 0.0000e+00 1.0000e+00 6.1833e+03 6.1833e+03 3.1583e+02 3.1583e+02 4.0084e-05 4.0084e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e-01 2.9000e+07 5.5315e+02 6.1715e+03 1.9240e-08 0.0000e+00 1.0000e+00 6.1715e+03 6.1715e+03 3.1522e+02 3.1522e+02 3.9993e-05 3.9993e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2200e-01 2.8900e+07 5.5315e+02 6.1596e+03 1.9355e-08 0.0000e+00 1.0000e+00 6.1596e+03 6.1596e+03 3.1461e+02 3.1461e+02 3.9902e-05 3.9902e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2400e-01 2.8800e+07 5.5315e+02 6.1476e+03 1.9472e-08 0.0000e+00 1.0000e+00 6.1476e+03 6.1476e+03 3.1400e+02 3.1400e+02 3.9811e-05 3.9811e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2600e-01 2.8700e+07 5.5315e+02 6.1356e+03 1.9589e-08 0.0000e+00 1.0000e+00 6.1356e+03 6.1356e+03 3.1339e+02 3.1339e+02 3.9719e-05 3.9719e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2800e-01 2.8600e+07 5.5315e+02 6.1236e+03 1.9707e-08 0.0000e+00 1.0000e+00 6.1236e+03 6.1236e+03 3.1278e+02 3.1278e+02 3.9627e-05 3.9627e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3000e-01 2.8500e+07 5.5315e+02 6.1115e+03 1.9827e-08 0.0000e+00 1.0000e+00 6.1115e+03 6.1115e+03 3.1216e+02 3.1216e+02 3.9535e-05 3.9535e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3200e-01 2.8400e+07 5.5315e+02 6.0994e+03 1.9948e-08 0.0000e+00 1.0000e+00 6.0994e+03 6.0994e+03 3.1154e+02 3.1154e+02 3.9443e-05 3.9443e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3400e-01 2.8300e+07 5.5315e+02 6.0872e+03 2.0070e-08 0.0000e+00 1.0000e+00 6.0872e+03 6.0872e+03 3.1092e+02 3.1092e+02 3.9351e-05 3.9351e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3600e-01 2.8200e+07 5.5315e+02 6.0749e+03 2.0193e-08 0.0000e+00 1.0000e+00 6.0749e+03 6.0749e+03 3.1029e+02 3.1029e+02 3.9258e-05 3.9258e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3800e-01 2.8100e+07 5.5315e+02 6.0626e+03 2.0318e-08 0.0000e+00 1.0000e+00 6.0626e+03 6.0626e+03 3.0966e+02 3.0966e+02 3.9166e-05 3.9166e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4000e-01 2.8000e+07 5.5315e+02 6.0503e+03 2.0443e-08 0.0000e+00 1.0000e+00 6.0503e+03 6.0503e+03 3.0903e+02 3.0903e+02 3.9073e-05 3.9073e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4200e-01 2.7900e+07 5.5315e+02 6.0379e+03 2.0570e-08 0.0000e+00 1.0000e+00 6.0379e+03 6.0379e+03 3.0840e+02 3.0840e+02 3.8979e-05 3.8979e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4400e-01 2.7800e+07 5.5315e+02 6.0254e+03 2.0699e-08 0.0000e+00 1.0000e+00 6.0254e+03 6.0254e+03 3.0776e+02 3.0776e+02 3.8886e-05 3.8886e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4600e-01 2.7700e+07 5.5315e+02 6.0129e+03 2.0828e-08 0.0000e+00 1.0000e+00 6.0129e+03 6.0129e+03 3.0713e+02 3.0713e+02 3.8793e-05 3.8793e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4800e-01 2.7600e+07 5.5315e+02 6.0004e+03 2.0959e-08 0.0000e+00 1.0000e+00 6.0004e+03 6.0004e+03 3.0648e+02 3.0648e+02 3.8699e-05 3.8699e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5000e-01 2.7500e+07 5.5315e+02 5.9878e+03 2.1091e-08 0.0000e+00 1.0000e+00 5.9878e+03 5.9878e+03 3.0584e+02 3.0584e+02 3.8605e-05 3.8605e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5200e-01 2.7400e+07 5.5315e+02 5.9751e+03 2.1224e-08 0.0000e+00 1.0000e+00 5.9751e+03 5.9751e+03 3.0519e+02 3.0519e+02 3.8511e-05 3.8511e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5400e-01 2.7300e+07 5.5315e+02 5.9624e+03 2.1359e-08 0.0000e+00 1.0000e+00 5.9624e+03 5.9624e+03 3.0455e+02 3.0455e+02 3.8416e-05 3.8416e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5600e-01 2.7200e+07 5.5315e+02 5.9497e+03 2.1495e-08 0.0000e+00 1.0000e+00 5.9497e+03 5.9497e+03 3.0389e+02 3.0389e+02 3.8322e-05 3.8322e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e-01 2.7100e+07 5.5315e+02 5.9369e+03 2.1633e-08 0.0000e+00 1.0000e+00 5.9369e+03 5.9369e+03 3.0324e+02 3.0324e+02 3.8227e-05 3.8227e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e-01 2.7000e+07 5.5315e+02 5.9240e+03 2.1772e-08 0.0000e+00 1.0000e+00 5.9240e+03 5.9240e+03 3.0258e+02 3.0258e+02 3.8132e-05 3.8132e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e-01 2.6900e+07 5.5315e+02 5.9111e+03 2.1912e-08 0.0000e+00 1.0000e+00 5.9111e+03 5.9111e+03 3.0192e+02 3.0192e+02 3.8037e-05 3.8037e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e-01 2.6800e+07 5.5315e+02 5.8981e+03 2.2054e-08 0.0000e+00 1.0000e+00 5.8981e+03 5.8981e+03 3.0126e+02 3.0126e+02 3.7942e-05 3.7942e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e-01 2.6700e+07 5.5315e+02 5.8850e+03 2.2198e-08 0.0000e+00 1.0000e+00 5.8850e+03 5.8850e+03 3.0059e+02 3.0059e+02 3.7846e-05 3.7846e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e-01 2.6600e+07 5.5315e+02 5.8720e+03 2.2342e-08 0.0000e+00 1.0000e+00 5.8720e+03 5.8720e+03 2.9992e+02 2.9992e+02 3.7750e-05 3.7750e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e-01 2.6500e+07 5.5315e+02 5.8588e+03 2.2489e-08 0.0000e+00 1.0000e+00 5.8588e+03 5.8588e+03 2.9925e+02 2.9925e+02 3.7654e-05 3.7654e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e-01 2.6400e+07 5.5315e+02 5.8456e+03 2.2637e-08 0.0000e+00 1.0000e+00 5.8456e+03 5.8456e+03 2.9858e+02 2.9858e+02 3.7558e-05 3.7558e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e-01 2.6300e+07 5.5315e+02 5.8323e+03 2.2786e-08 0.0000e+00 1.0000e+00 5.8323e+03 5.8323e+03 2.9790e+02 2.9790e+02 3.7462e-05 3.7462e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e-01 2.6200e+07 5.5315e+02 5.8190e+03 2.2937e-08 0.0000e+00 1.0000e+00 5.8190e+03 5.8190e+03 2.9722e+02 2.9722e+02 3.7365e-05 3.7365e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e-01 2.6100e+07 5.5315e+02 5.8056e+03 2.3090e-08 0.0000e+00 1.0000e+00 5.8056e+03 5.8056e+03 2.9654e+02 2.9654e+02 3.7268e-05 3.7268e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e-01 2.6000e+07 5.5315e+02 5.7922e+03 2.3244e-08 0.0000e+00 1.0000e+00 5.7922e+03 5.7922e+03 2.9585e+02 2.9585e+02 3.7171e-05 3.7171e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e-01 2.5900e+07 5.5315e+02 5.7787e+03 2.3400e-08 0.0000e+00 1.0000e+00 5.7787e+03 5.7787e+03 2.9516e+02 2.9516e+02 3.7074e-05 3.7074e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e-01 2.5800e+07 5.5315e+02 5.7652e+03 2.3557e-08 0.0000e+00 1.0000e+00 5.7652e+03 5.7652e+03 2.9447e+02 2.9447e+02 3.6976e-05 3.6976e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e-01 2.5700e+07 5.5315e+02 5.7516e+03 2.3716e-08 0.0000e+00 1.0000e+00 5.7516e+03 5.7516e+03 2.9377e+02 2.9377e+02 3.6879e-05 3.6879e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e-01 2.5600e+07 5.5315e+02 5.7379e+03 2.3877e-08 0.0000e+00 1.0000e+00 5.7379e+03 5.7379e+03 2.9308e+02 2.9308e+02 3.6781e-05 3.6781e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e-01 2.5500e+07 5.5315e+02 5.7242e+03 2.4040e-08 0.0000e+00 1.0000e+00 5.7242e+03 5.7242e+03 2.9237e+02 2.9237e+02 3.6682e-05 3.6682e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e-01 2.5400e+07 5.5315e+02 5.7104e+03 2.4204e-08 0.0000e+00 1.0000e+00 5.7104e+03 5.7104e+03 2.9167e+02 2.9167e+02 3.6584e-05 3.6584e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e-01 2.5300e+07 5.5315e+02 5.6965e+03 2.4370e-08 0.0000e+00 1.0000e+00 5.6965e+03 5.6965e+03 2.9096e+02 2.9096e+02 3.6485e-05 3.6485e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e-01 2.5200e+07 5.5315e+02 5.6826e+03 2.4538e-08 0.0000e+00 1.0000e+00 5.6826e+03 5.6826e+03 2.9025e+02 2.9025e+02 3.6387e-05 3.6387e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e-01 2.5100e+07 5.5315e+02 5.6686e+03 2.4708e-08 0.0000e+00 1.0000e+00 5.6686e+03 5.6686e+03 2.8954e+02 2.8954e+02 3.6287e-05 3.6287e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e-01 2.5000e+07 5.5315e+02 5.6546e+03 2.4879e-08 0.0000e+00 1.0000e+00 5.6546e+03 5.6546e+03 2.8882e+02 2.8882e+02 3.6188e-05 3.6188e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0200e-01 2.4900e+07 5.5315e+02 5.6405e+03 2.5053e-08 0.0000e+00 1.0000e+00 5.6405e+03 5.6405e+03 2.8810e+02 2.8810e+02 3.6089e-05 3.6089e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0400e-01 2.4800e+07 5.5315e+02 5.6263e+03 2.5228e-08 0.0000e+00 1.0000e+00 5.6263e+03 5.6263e+03 2.8738e+02 2.8738e+02 3.5989e-05 3.5989e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0600e-01 2.4700e+07 5.5315e+02 5.6121e+03 2.5406e-08 0.0000e+00 1.0000e+00 5.6121e+03 5.6121e+03 2.8665e+02 2.8665e+02 3.5889e-05 3.5889e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0800e-01 2.4600e+07 5.5315e+02 5.5978e+03 2.5585e-08 0.0000e+00 1.0000e+00 5.5978e+03 5.5978e+03 2.8592e+02 2.8592e+02 3.5789e-05 3.5789e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1000e-01 2.4500e+07 5.5315e+02 5.5835e+03 2.5766e-08 0.0000e+00 1.0000e+00 5.5835e+03 5.5835e+03 2.8519e+02 2.8519e+02 3.5688e-05 3.5688e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1200e-01 2.4400e+07 5.5315e+02 5.5690e+03 2.5950e-08 0.0000e+00 1.0000e+00 5.5690e+03 5.5690e+03 2.8445e+02 2.8445e+02 3.5587e-05 3.5587e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1400e-01 2.4300e+07 5.5315e+02 5.5545e+03 2.6135e-08 0.0000e+00 1.0000e+00 5.5545e+03 5.5545e+03 2.8371e+02 2.8371e+02 3.5487e-05 3.5487e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1600e-01 2.4200e+07 5.5315e+02 5.5400e+03 2.6323e-08 0.0000e+00 1.0000e+00 5.5400e+03 5.5400e+03 2.8297e+02 2.8297e+02 3.5385e-05 3.5385e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1800e-01 2.4100e+07 5.5315e+02 5.5254e+03 2.6512e-08 0.0000e+00 1.0000e+00 5.5254e+03 5.5254e+03 2.8222e+02 2.8222e+02 3.5284e-05 3.5284e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2000e-01 2.4000e+07 5.5315e+02 5.5107e+03 2.6704e-08 0.0000e+00 1.0000e+00 5.5107e+03 5.5107e+03 2.8147e+02 2.8147e+02 3.5182e-05 3.5182e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2200e-01 2.3900e+07 5.5315e+02 5.4960e+03 2.6898e-08 0.0000e+00 1.0000e+00 5.4960e+03 5.4960e+03 2.8072e+02 2.8072e+02 3.5080e-05 3.5080e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2400e-01 2.3800e+07 5.5315e+02 5.4811e+03 2.7094e-08 0.0000e+00 1.0000e+00 5.4811e+03 5.4811e+03 2.7996e+02 2.7996e+02 3.4978e-05 3.4978e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2600e-01 2.3700e+07 5.5315e+02 5.4663e+03 2.7292e-08 0.0000e+00 1.0000e+00 5.4663e+03 5.4663e+03 2.7920e+02 2.7920e+02 3.4876e-05 3.4876e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2800e-01 2.3600e+07 5.5315e+02 5.4513e+03 2.7493e-08 0.0000e+00 1.0000e+00 5.4513e+03 5.4513e+03 2.7844e+02 2.7844e+02 3.4773e-05 3.4773e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3000e-01 2.3500e+07 5.5315e+02 5.4363e+03 2.7696e-08 0.0000e+00 1.0000e+00 5.4363e+03 5.4363e+03 2.7767e+02 2.7767e+02 3.4671e-05 3.4671e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3200e-01 2.3400e+07 5.5315e+02 5.4212e+03 2.7901e-08 0.0000e+00 1.0000e+00 5.4212e+03 5.4212e+03 2.7690e+02 2.7690e+02 3.4568e-05 3.4568e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3400e-01 2.3300e+07 5.5315e+02 5.4060e+03 2.8109e-08 0.0000e+00 1.0000e+00 5.4060e+03 5.4060e+03 2.7613e+02 2.7613e+02 3.4464e-05 3.4464e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3600e-01 2.3200e+07 5.5315e+02 5.3908e+03 2.8319e-08 0.0000e+00 1.0000e+00 5.3908e+03 5.3908e+03 2.7535e+02 2.7535e+02 3.4361e-05 3.4361e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3800e-01 2.3100e+07 5.5315e+02 5.3755e+03 2.8532e-08 0.0000e+00 1.0000e+00 5.3755e+03 5.3755e+03 2.7457e+02 2.7457e+02 3.4257e-05 3.4257e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4000e-01 2.3000e+07 5.5315e+02 5.3601e+03 2.8747e-08 0.0000e+00 1.0000e+00 5.3601e+03 5.3601e+03 2.7378e+02 2.7378e+02 3.4153e-05 3.4153e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4200e-01 2.2900e+07 5.5315e+02 5.3447e+03 2.8964e-08 0.0000e+00 1.0000e+00 5.3447e+03 5.3447e+03 2.7299e+02 2.7299e+02 3.4049e-05 3.4049e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4400e-01 2.2800e+07 5.5315e+02 5.3292e+03 2.9184e-08 0.0000e+00 1.0000e+00 5.3292e+03 5.3292e+03 2.7220e+02 2.7220e+02 3.3944e-05 3.3944e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4600e-01 2.2700e+07 5.5315e+02 5.3136e+03 2.9407e-08 0.0000e+00 1.0000e+00 5.3136e+03 5.3136e+03 2.7140e+02 2.7140e+02 3.3839e-05 3.3839e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4800e-01 2.2600e+07 5.5315e+02 5.2979e+03 2.9632e-08 0.0000e+00 1.0000e+00 5.2979e+03 5.2979e+03 2.7060e+02 2.7060e+02 3.3734e-05 3.3734e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5000e-01 2.2500e+07 5.5315e+02 5.2822e+03 2.9860e-08 0.0000e+00 1.0000e+00 5.2822e+03 5.2822e+03 2.6980e+02 2.6980e+02 3.3629e-05 3.3629e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5200e-01 2.2400e+07 5.5315e+02 5.2664e+03 3.0091e-08 0.0000e+00 1.0000e+00 5.2664e+03 5.2664e+03 2.6899e+02 2.6899e+02 3.3524e-05 3.3524e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5400e-01 2.2300e+07 5.5315e+02 5.2505e+03 3.0324e-08 0.0000e+00 1.0000e+00 5.2505e+03 5.2505e+03 2.6818e+02 2.6818e+02 3.3418e-05 3.3418e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5600e-01 2.2200e+07 5.5315e+02 5.2345e+03 3.0561e-08 0.0000e+00 1.0000e+00 5.2345e+03 5.2345e+03 2.6737e+02 2.6737e+02 3.3312e-05 3.3312e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5800e-01 2.2100e+07 5.5315e+02 5.2185e+03 3.0800e-08 0.0000e+00 1.0000e+00 5.2185e+03 5.2185e+03 2.6655e+02 2.6655e+02 3.3206e-05 3.3206e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6000e-01 2.2000e+07 5.5315e+02 5.2024e+03 3.1042e-08 0.0000e+00 1.0000e+00 5.2024e+03 5.2024e+03 2.6572e+02 2.6572e+02 3.3099e-05 3.3099e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6200e-01 2.1900e+07 5.5315e+02 5.1862e+03 3.1286e-08 0.0000e+00 1.0000e+00 5.1862e+03 5.1862e+03 2.6490e+02 2.6490e+02 3.2993e-05 3.2993e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6400e-01 2.1800e+07 5.5315e+02 5.1699e+03 3.1534e-08 0.0000e+00 1.0000e+00 5.1699e+03 5.1699e+03 2.6407e+02 2.6407e+02 3.2886e-05 3.2886e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6600e-01 2.1700e+07 5.5315e+02 5.1536e+03 3.1785e-08 0.0000e+00 1.0000e+00 5.1536e+03 5.1536e+03 2.6323e+02 2.6323e+02 3.2779e-05 3.2779e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6800e-01 2.1600e+07 5.5315e+02 5.1372e+03 3.2039e-08 0.0000e+00 1.0000e+00 5.1372e+03 5.1372e+03 2.6239e+02 2.6239e+02 3.2671e-05 3.2671e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7000e-01 2.1500e+07 5.5315e+02 5.1207e+03 3.2296e-08 0.0000e+00 1.0000e+00 5.1207e+03 5.1207e+03 2.6155e+02 2.6155e+02 3.2564e-05 3.2564e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7200e-01 2.1400e+07 5.5315e+02 5.1041e+03 3.2556e-08 0.0000e+00 1.0000e+00 5.1041e+03 5.1041e+03 2.6070e+02 2.6070e+02 3.2456e-05 3.2456e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7400e-01 2.1300e+07 5.5315e+02 5.0874e+03 3.2820e-08 0.0000e+00 1.0000e+00 5.0874e+03 5.0874e+03 2.5985e+02 2.5985e+02 3.2348e-05 3.2348e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7600e-01 2.1200e+07 5.5315e+02 5.0707e+03 3.3087e-08 0.0000e+00 1.0000e+00 5.0707e+03 5.0707e+03 2.5900e+02 2.5900e+02 3.2239e-05 3.2239e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7800e-01 2.1100e+07 5.5315e+02 5.0539e+03 3.3357e-08 0.0000e+00 1.0000e+00 5.0539e+03 5.0539e+03 2.5814e+02 2.5814e+02 3.2131e-05 3.2131e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8000e-01 2.1000e+07 5.5315e+02 5.0370e+03 3.3630e-08 0.0000e+00 1.0000e+00 5.0370e+03 5.0370e+03 2.5728e+02 2.5728e+02 3.2022e-05 3.2022e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8200e-01 2.0900e+07 5.5315e+02 5.0200e+03 3.3907e-08 0.0000e+00 1.0000e+00 5.0200e+03 5.0200e+03 2.5641e+02 2.5641e+02 3.1913e-05 3.1913e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8400e-01 2.0800e+07 5.5315e+02 5.0029e+03 3.4187e-08 0.0000e+00 1.0000e+00 5.0029e+03 5.0029e+03 2.5554e+02 2.5554e+02 3.1803e-05 3.1803e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8600e-01 2.0700e+07 5.5315e+02 4.9858e+03 3.4471e-08 0.0000e+00 1.0000e+00 4.9858e+03 4.9858e+03 2.5466e+02 2.5466e+02 3.1694e-05 3.1694e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8800e-01 2.0600e+07 5.5315e+02 4.9686e+03 3.4758e-08 0.0000e+00 1.0000e+00 4.9686e+03 4.9686e+03 2.5378e+02 2.5378e+02 3.1584e-05 3.1584e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9000e-01 2.0500e+07 5.5315e+02 4.9512e+03 3.5049e-08 0.0000e+00 1.0000e+00 4.9512e+03 4.9512e+03 2.5290e+02 2.5290e+02 3.1474e-05 3.1474e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9200e-01 2.0400e+07 5.5315e+02 4.9339e+03 3.5344e-08 0.0000e+00 1.0000e+00 4.9339e+03 4.9339e+03 2.5201e+02 2.5201e+02 3.1364e-05 3.1364e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9400e-01 2.0300e+07 5.5315e+02 4.9164e+03 3.5642e-08 0.0000e+00 1.0000e+00 4.9164e+03 4.9164e+03 2.5112e+02 2.5112e+02 3.1253e-05 3.1253e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9600e-01 2.0200e+07 5.5315e+02 4.8988e+03 3.5944e-08 0.0000e+00 1.0000e+00 4.8988e+03 4.8988e+03 2.5022e+02 2.5022e+02 3.1143e-05 3.1143e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9800e-01 2.0100e+07 5.5315e+02 4.8812e+03 3.6250e-08 0.0000e+00 1.0000e+00 4.8812e+03 4.8812e+03 2.4932e+02 2.4932e+02 3.1032e-05 3.1032e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0000e-01 2.0000e+07 5.5315e+02 4.8634e+03 3.6560e-08 0.0000e+00 1.0000e+00 4.8634e+03 4.8634e+03 2.4841e+02 2.4841e+02 3.0921e-05 3.0921e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0200e-01 1.9900e+07 5.5315e+02 4.8456e+03 3.6874e-08 0.0000e+00 1.0000e+00 4.8456e+03 4.8456e+03 2.4750e+02 2.4750e+02 3.0809e-05 3.0809e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0400e-01 1.9800e+07 5.5315e+02 4.8277e+03 3.7192e-08 0.0000e+00 1.0000e+00 4.8277e+03 4.8277e+03 2.4659e+02 2.4659e+02 3.0698e-05 3.0698e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0600e-01 1.9700e+07 5.5315e+02 4.8097e+03 3.7514e-08 0.0000e+00 1.0000e+00 4.8097e+03 4.8097e+03 2.4567e+02 2.4567e+02 3.0586e-05 3.0586e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0800e-01 1.9600e+07 5.5315e+02 4.7916e+03 3.7840e-08 0.0000e+00 1.0000e+00 4.7916e+03 4.7916e+03 2.4474e+02 2.4474e+02 3.0474e-05 3.0474e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1000e-01 1.9500e+07 5.5315e+02 4.7734e+03 3.8171e-08 0.0000e+00 1.0000e+00 4.7734e+03 4.7734e+03 2.4381e+02 2.4381e+02 3.0362e-05 3.0362e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1200e-01 1.9400e+07 5.5315e+02 4.7552e+03 3.8506e-08 0.0000e+00 1.0000e+00 4.7552e+03 4.7552e+03 2.4288e+02 2.4288e+02 3.0249e-05 3.0249e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1400e-01 1.9300e+07 5.5315e+02 4.7368e+03 3.8845e-08 0.0000e+00 1.0000e+00 4.7368e+03 4.7368e+03 2.4194e+02 2.4194e+02 3.0137e-05 3.0137e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1600e-01 1.9200e+07 5.5315e+02 4.7184e+03 3.9189e-08 0.0000e+00 1.0000e+00 4.7184e+03 4.7184e+03 2.4100e+02 2.4100e+02 3.0024e-05 3.0024e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1800e-01 1.9100e+07 5.5315e+02 4.6998e+03 3.9537e-08 0.0000e+00 1.0000e+00 4.6998e+03 4.6998e+03 2.4005e+02 2.4005e+02 2.9911e-05 2.9911e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2000e-01 1.9000e+07 5.5315e+02 4.6812e+03 3.9890e-08 0.0000e+00 1.0000e+00 4.6812e+03 4.6812e+03 2.3910e+02 2.3910e+02 2.9797e-05 2.9797e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2200e-01 1.8900e+07 5.5315e+02 4.6625e+03 4.0247e-08 0.0000e+00 1.0000e+00 4.6625e+03 4.6625e+03 2.3815e+02 2.3815e+02 2.9684e-05 2.9684e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2400e-01 1.8800e+07 5.5315e+02 4.6437e+03 4.0609e-08 0.0000e+00 1.0000e+00 4.6437e+03 4.6437e+03 2.3719e+02 2.3719e+02 2.9570e-05 2.9570e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2600e-01 1.8700e+07 5.5315e+02 4.6248e+03 4.0976e-08 0.0000e+00 1.0000e+00 4.6248e+03 4.6248e+03 2.3622e+02 2.3622e+02 2.9456e-05 2.9456e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2800e-01 1.8600e+07 5.5315e+02 4.6058e+03 4.1348e-08 0.0000e+00 1.0000e+00 4.6058e+03 4.6058e+03 2.3525e+02 2.3525e+02 2.9342e-05 2.9342e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.3000e-01 1.8500e+07 5.5315e+02 4.5867e+03 4.1725e-08 0.0000e+00 1.0000e+00 4.5867e+03 4.5867e+03 2.3427e+02 2.3427e+02 2.9228e-05 2.9228e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.3200e-01 1.8400e+07 5.5315e+02 4.5675e+03 4.2107e-08 0.0000e+00 1.0000e+00 4.5675e+03 4.5675e+03 2.3329e+02 2.3329e+02 2.9114e-05 2.9114e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.3400e-01 1.8300e+07 5.5315e+02 4.5482e+03 4.2494e-08 0.0000e+00 1.0000e+00 4.5482e+03 4.5482e+03 2.3231e+02 2.3231e+02 2.8999e-05 2.8999e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.3600e-01 1.8200e+07 5.5315e+02 4.5288e+03 4.2886e-08 0.0000e+00 1.0000e+00 4.5288e+03 4.5288e+03 2.3132e+02 2.3132e+02 2.8885e-05 2.8885e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.3800e-01 1.8100e+07 5.5315e+02 4.5094e+03 4.3283e-08 0.0000e+00 1.0000e+00 4.5094e+03 4.5094e+03 2.3033e+02 2.3033e+02 2.8770e-05 2.8770e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4000e-01 1.8000e+07 5.5315e+02 4.4898e+03 4.3686e-08 0.0000e+00 1.0000e+00 4.4898e+03 4.4898e+03 2.2933e+02 2.2933e+02 2.8654e-05 2.8654e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4200e-01 1.7900e+07 5.5315e+02 4.4701e+03 4.4094e-08 0.0000e+00 1.0000e+00 4.4701e+03 4.4701e+03 2.2832e+02 2.2832e+02 2.8539e-05 2.8539e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4400e-01 1.7800e+07 5.5315e+02 4.4504e+03 4.4508e-08 0.0000e+00 1.0000e+00 4.4504e+03 4.4504e+03 2.2731e+02 2.2731e+02 2.8424e-05 2.8424e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4600e-01 1.7700e+07 5.5315e+02 4.4305e+03 4.4928e-08 0.0000e+00 1.0000e+00 4.4305e+03 4.4305e+03 2.2630e+02 2.2630e+02 2.8308e-05 2.8308e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4800e-01 1.7600e+07 5.5315e+02 4.4106e+03 4.5353e-08 0.0000e+00 1.0000e+00 4.4106e+03 4.4106e+03 2.2528e+02 2.2528e+02 2.8193e-05 2.8193e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.5000e-01 1.7500e+07 5.5315e+02 4.3905e+03 4.5784e-08 0.0000e+00 1.0000e+00 4.3905e+03 4.3905e+03 2.2426e+02 2.2426e+02 2.8077e-05 2.8077e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.5200e-01 1.7400e+07 5.5315e+02 4.3704e+03 4.6221e-08 0.0000e+00 1.0000e+00 4.3704e+03 4.3704e+03 2.2323e+02 2.2323e+02 2.7961e-05 2.7961e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.5400e-01 1.7300e+07 5.5315e+02 4.3501e+03 4.6664e-08 0.0000e+00 1.0000e+00 4.3501e+03 4.3501e+03 2.2219e+02 2.2219e+02 2.7845e-05 2.7845e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.5600e-01 1.7200e+07 5.5315e+02 4.3298e+03 4.7113e-08 0.0000e+00 1.0000e+00 4.3298e+03 4.3298e+03 2.2115e+02 2.2115e+02 2.7728e-05 2.7728e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.5800e-01 1.7100e+07 5.5315e+02 4.3097e+03 4.5958e-08 1.6940e-02 9.8306e-01 4.7378e+03 4.3030e+03 3.2888e+02 2.1879e+02 4.0756e-05 2.7484e-05 7.7388e-03 2.2673e-03 4.3060e-01 1.0225e-01 8.3990e-02 4.6636e-02 2.2821e-02 1.7645e-02 2.8606e-01 9.0159e-03 3.0092e-03 5.3601e-01 1.1476e-01 8.7949e-02 4.5587e-02 2.0876e-02 1.5068e-02 1.6773e-01 +3.6000e-01 1.7000e+07 5.5315e+02 4.2898e+03 4.6261e-08 4.5641e-02 9.5436e-01 4.7351e+03 4.2706e+03 3.3247e+02 2.1533e+02 4.1261e-05 2.7137e-05 7.6825e-03 2.2373e-03 4.2618e-01 1.0167e-01 8.3774e-02 4.6651e-02 2.2890e-02 1.7745e-02 2.9117e-01 9.0452e-03 3.0262e-03 5.3843e-01 1.1504e-01 8.8042e-02 4.5564e-02 2.0832e-02 1.5009e-02 1.6501e-01 +3.6200e-01 1.6900e+07 5.5315e+02 4.2700e+03 4.6569e-08 6.9687e-02 9.3031e-01 4.7316e+03 4.2390e+03 3.3585e+02 2.1206e+02 4.1743e-05 2.6815e-05 7.6282e-03 2.2087e-03 4.2194e-01 1.0112e-01 8.3562e-02 4.6663e-02 2.2955e-02 1.7841e-02 2.9608e-01 9.0724e-03 3.0418e-03 5.4065e-01 1.1531e-01 8.8129e-02 4.5544e-02 2.0792e-02 1.4955e-02 1.6250e-01 +3.6400e-01 1.6800e+07 5.5315e+02 4.2501e+03 4.6881e-08 9.0201e-02 9.0980e-01 4.7276e+03 4.2079e+03 3.3906e+02 2.0897e+02 4.2206e-05 2.6512e-05 7.5755e-03 2.1812e-03 4.1786e-01 1.0058e-01 8.3351e-02 4.6671e-02 2.3016e-02 1.7932e-02 3.0083e-01 9.0978e-03 3.0562e-03 5.4272e-01 1.1556e-01 8.8212e-02 4.5527e-02 2.0755e-02 1.4906e-02 1.6016e-01 +3.6600e-01 1.6700e+07 5.5315e+02 4.2301e+03 4.7199e-08 1.0796e-01 8.9204e-01 4.7231e+03 4.1773e+03 3.4214e+02 2.0601e+02 4.2651e-05 2.6227e-05 7.5242e-03 2.1547e-03 4.1391e-01 1.0005e-01 8.3141e-02 4.6675e-02 2.3074e-02 1.8020e-02 3.0545e-01 9.1216e-03 3.0697e-03 5.4465e-01 1.1580e-01 8.8292e-02 4.5511e-02 2.0721e-02 1.4859e-02 1.5797e-01 +3.6800e-01 1.6600e+07 5.5315e+02 4.2101e+03 4.7521e-08 1.2352e-01 8.7648e-01 4.7181e+03 4.1472e+03 3.4508e+02 2.0319e+02 4.3082e-05 2.5958e-05 7.4742e-03 2.1291e-03 4.1008e-01 9.9536e-02 8.2932e-02 4.6676e-02 2.3128e-02 1.8104e-02 3.0994e-01 9.1441e-03 3.0822e-03 5.4647e-01 1.1602e-01 8.8369e-02 4.5498e-02 2.0690e-02 1.4816e-02 1.5591e-01 +3.7000e-01 1.6500e+07 5.5315e+02 4.1901e+03 4.7848e-08 1.3730e-01 8.6270e-01 4.7129e+03 4.1174e+03 3.4792e+02 2.0048e+02 4.3501e-05 2.5702e-05 7.4251e-03 2.1042e-03 4.0634e-01 9.9028e-02 8.2724e-02 4.6673e-02 2.3180e-02 1.8185e-02 3.1434e-01 9.1653e-03 3.0940e-03 5.4817e-01 1.1623e-01 8.8443e-02 4.5487e-02 2.0661e-02 1.4776e-02 1.5396e-01 +3.7200e-01 1.6400e+07 5.5315e+02 4.1700e+03 4.8181e-08 1.4960e-01 8.5040e-01 4.7072e+03 4.0880e+03 3.5065e+02 1.9786e+02 4.3908e-05 2.5458e-05 7.3770e-03 2.0801e-03 4.0269e-01 9.8526e-02 8.2515e-02 4.6668e-02 2.3229e-02 1.8263e-02 3.1865e-01 9.1855e-03 3.1051e-03 5.4979e-01 1.1644e-01 8.8516e-02 4.5478e-02 2.0634e-02 1.4738e-02 1.5212e-01 +3.7400e-01 1.6300e+07 5.5315e+02 4.1499e+03 4.8518e-08 1.6066e-01 8.3934e-01 4.7014e+03 4.0588e+03 3.5330e+02 1.9534e+02 4.4304e-05 2.5225e-05 7.3297e-03 2.0566e-03 3.9913e-01 9.8031e-02 8.2305e-02 4.6660e-02 2.3276e-02 1.8339e-02 3.2287e-01 9.2048e-03 3.1157e-03 5.5132e-01 1.1663e-01 8.8586e-02 4.5470e-02 2.0609e-02 1.4703e-02 1.5036e-01 +3.7600e-01 1.6200e+07 5.5315e+02 4.1298e+03 4.8861e-08 1.7067e-01 8.2933e-01 4.6952e+03 4.0299e+03 3.5587e+02 1.9289e+02 4.4692e-05 2.5002e-05 7.2830e-03 2.0336e-03 3.9563e-01 9.7542e-02 8.2095e-02 4.6649e-02 2.3320e-02 1.8412e-02 3.2703e-01 9.2231e-03 3.1256e-03 5.5277e-01 1.1682e-01 8.8654e-02 4.5464e-02 2.0585e-02 1.4670e-02 1.4869e-01 +3.7800e-01 1.6100e+07 5.5315e+02 4.1096e+03 4.9210e-08 1.7978e-01 8.2022e-01 4.6888e+03 4.0012e+03 3.5836e+02 1.9052e+02 4.5072e-05 2.4788e-05 7.2370e-03 2.0112e-03 3.9221e-01 9.7057e-02 8.1884e-02 4.6635e-02 2.3363e-02 1.8483e-02 3.3112e-01 9.2407e-03 3.1350e-03 5.5416e-01 1.1700e-01 8.8722e-02 4.5459e-02 2.0564e-02 1.4638e-02 1.4709e-01 +3.8000e-01 1.6000e+07 5.5315e+02 4.0893e+03 4.9564e-08 1.8812e-01 8.1188e-01 4.6823e+03 3.9727e+03 3.6079e+02 1.8822e+02 4.5444e-05 2.4582e-05 7.1915e-03 1.9892e-03 3.8884e-01 9.6576e-02 8.1672e-02 4.6619e-02 2.3403e-02 1.8552e-02 3.3516e-01 9.2576e-03 3.1440e-03 5.5548e-01 1.1717e-01 8.8787e-02 4.5455e-02 2.0543e-02 1.4608e-02 1.4556e-01 +3.8200e-01 1.5900e+07 5.5315e+02 4.0690e+03 4.9924e-08 1.9577e-01 8.0423e-01 4.6755e+03 3.9445e+03 3.6315e+02 1.8597e+02 4.5809e-05 2.4384e-05 7.1465e-03 1.9677e-03 3.8552e-01 9.6099e-02 8.1458e-02 4.6600e-02 2.3441e-02 1.8619e-02 3.3915e-01 9.2739e-03 3.1525e-03 5.5674e-01 1.1733e-01 8.8852e-02 4.5452e-02 2.0525e-02 1.4580e-02 1.4409e-01 +3.8400e-01 1.5800e+07 5.5315e+02 4.0487e+03 5.0289e-08 2.0283e-01 7.9717e-01 4.6686e+03 3.9164e+03 3.6546e+02 1.8379e+02 4.6168e-05 2.4193e-05 7.1020e-03 1.9466e-03 3.8225e-01 9.5624e-02 8.1244e-02 4.6578e-02 2.3478e-02 1.8684e-02 3.4309e-01 9.2895e-03 3.1607e-03 5.5795e-01 1.1749e-01 8.8915e-02 4.5451e-02 2.0507e-02 1.4553e-02 1.4268e-01 +3.8600e-01 1.5700e+07 5.5315e+02 4.0283e+03 5.0661e-08 2.0936e-01 7.9064e-01 4.6615e+03 3.8884e+03 3.6772e+02 1.8166e+02 4.6521e-05 2.4008e-05 7.0579e-03 1.9258e-03 3.7903e-01 9.5152e-02 8.1027e-02 4.6555e-02 2.3512e-02 1.8748e-02 3.4699e-01 9.3046e-03 3.1684e-03 5.5911e-01 1.1765e-01 8.8978e-02 4.5450e-02 2.0490e-02 1.4528e-02 1.4132e-01 +3.8800e-01 1.5600e+07 5.5315e+02 4.0079e+03 5.1038e-08 2.1541e-01 7.8459e-01 4.6543e+03 3.8607e+03 3.6993e+02 1.7957e+02 4.6868e-05 2.3829e-05 7.0141e-03 1.9054e-03 3.7586e-01 9.4683e-02 8.0809e-02 4.6528e-02 2.3545e-02 1.8810e-02 3.5085e-01 9.3191e-03 3.1759e-03 5.6022e-01 1.1780e-01 8.9039e-02 4.5451e-02 2.0475e-02 1.4504e-02 1.4001e-01 +3.9000e-01 1.5500e+07 5.5315e+02 3.9874e+03 5.1422e-08 2.2105e-01 7.7895e-01 4.6469e+03 3.8330e+03 3.7209e+02 1.7754e+02 4.7211e-05 2.3656e-05 6.9706e-03 1.8854e-03 3.7272e-01 9.4215e-02 8.0589e-02 4.6500e-02 2.3576e-02 1.8870e-02 3.5467e-01 9.3331e-03 3.1830e-03 5.6129e-01 1.1795e-01 8.9100e-02 4.5452e-02 2.0461e-02 1.4481e-02 1.3875e-01 +3.9200e-01 1.5400e+07 5.5315e+02 3.9669e+03 5.1812e-08 2.2631e-01 7.7369e-01 4.6394e+03 3.8055e+03 3.7421e+02 1.7554e+02 4.7550e-05 2.3489e-05 6.9274e-03 1.8656e-03 3.6962e-01 9.3749e-02 8.0368e-02 4.6468e-02 2.3606e-02 1.8928e-02 3.5847e-01 9.3467e-03 3.1898e-03 5.6232e-01 1.1809e-01 8.9160e-02 4.5455e-02 2.0447e-02 1.4460e-02 1.3754e-01 +3.9400e-01 1.5300e+07 5.5315e+02 3.9463e+03 5.2209e-08 2.3123e-01 7.6877e-01 4.6318e+03 3.7781e+03 3.7629e+02 1.7359e+02 4.7884e-05 2.3326e-05 6.8845e-03 1.8462e-03 3.6655e-01 9.3284e-02 8.0144e-02 4.6435e-02 2.3634e-02 1.8985e-02 3.6224e-01 9.3599e-03 3.1963e-03 5.6330e-01 1.1823e-01 8.9219e-02 4.5458e-02 2.0435e-02 1.4439e-02 1.3636e-01 +3.9600e-01 1.5200e+07 5.5315e+02 3.9257e+03 5.2612e-08 2.3584e-01 7.6416e-01 4.6242e+03 3.7508e+03 3.7833e+02 1.7168e+02 4.8214e-05 2.3168e-05 6.8419e-03 1.8270e-03 3.6352e-01 9.2820e-02 7.9919e-02 4.6399e-02 2.3660e-02 1.9041e-02 3.6598e-01 9.3726e-03 3.2025e-03 5.6426e-01 1.1836e-01 8.9278e-02 4.5462e-02 2.0423e-02 1.4420e-02 1.3523e-01 +3.9800e-01 1.5100e+07 5.5315e+02 3.9050e+03 5.3023e-08 2.4016e-01 7.5984e-01 4.6164e+03 3.7236e+03 3.8033e+02 1.6980e+02 4.8540e-05 2.3014e-05 6.7994e-03 1.8081e-03 3.6051e-01 9.2356e-02 7.9691e-02 4.6361e-02 2.3685e-02 1.9095e-02 3.6969e-01 9.3850e-03 3.2085e-03 5.6517e-01 1.1849e-01 8.9336e-02 4.5467e-02 2.0413e-02 1.4401e-02 1.3413e-01 +4.0000e-01 1.5000e+07 5.5315e+02 3.8842e+03 5.3440e-08 2.4423e-01 7.5577e-01 4.6085e+03 3.6965e+03 3.8231e+02 1.6795e+02 4.8863e-05 2.2865e-05 6.7572e-03 1.7894e-03 3.5754e-01 9.1894e-02 7.9461e-02 4.6321e-02 2.3709e-02 1.9148e-02 3.7339e-01 9.3969e-03 3.2143e-03 5.6606e-01 1.1862e-01 8.9394e-02 4.5472e-02 2.0403e-02 1.4383e-02 1.3306e-01 +4.0200e-01 1.4900e+07 5.5315e+02 3.8635e+03 5.3864e-08 2.4805e-01 7.5195e-01 4.6005e+03 3.6695e+03 3.8425e+02 1.6614e+02 4.9182e-05 2.2720e-05 6.7151e-03 1.7710e-03 3.5459e-01 9.1431e-02 7.9229e-02 4.6278e-02 2.3730e-02 1.9200e-02 3.7706e-01 9.4086e-03 3.2198e-03 5.6691e-01 1.1874e-01 8.9451e-02 4.5479e-02 2.0394e-02 1.4367e-02 1.3203e-01 +4.0400e-01 1.4800e+07 5.5315e+02 3.8426e+03 5.4296e-08 2.5166e-01 7.4834e-01 4.5925e+03 3.6426e+03 3.8616e+02 1.6436e+02 4.9499e-05 2.2578e-05 6.6732e-03 1.7528e-03 3.5166e-01 9.0969e-02 7.8995e-02 4.6233e-02 2.3751e-02 1.9250e-02 3.8072e-01 9.4199e-03 3.2251e-03 5.6773e-01 1.1886e-01 8.9507e-02 4.5486e-02 2.0386e-02 1.4351e-02 1.3103e-01 +4.0600e-01 1.4700e+07 5.5315e+02 3.8217e+03 5.4735e-08 2.5506e-01 7.4494e-01 4.5844e+03 3.6158e+03 3.8804e+02 1.6261e+02 4.9812e-05 2.2440e-05 6.6314e-03 1.7348e-03 3.4876e-01 9.0507e-02 7.8758e-02 4.6185e-02 2.3770e-02 1.9299e-02 3.8435e-01 9.4309e-03 3.2302e-03 5.6853e-01 1.1898e-01 8.9563e-02 4.5494e-02 2.0378e-02 1.4336e-02 1.3006e-01 +4.0800e-01 1.4600e+07 5.5315e+02 3.8008e+03 5.5182e-08 2.5828e-01 7.4172e-01 4.5762e+03 3.5890e+03 3.8989e+02 1.6088e+02 5.0123e-05 2.2306e-05 6.5897e-03 1.7170e-03 3.4588e-01 9.0045e-02 7.8519e-02 4.6136e-02 2.3787e-02 1.9347e-02 3.8798e-01 9.4416e-03 3.2351e-03 5.6929e-01 1.1910e-01 8.9619e-02 4.5502e-02 2.0371e-02 1.4322e-02 1.2912e-01 +4.1000e-01 1.4500e+07 5.5315e+02 3.7798e+03 5.5636e-08 2.6132e-01 7.3868e-01 4.5680e+03 3.5623e+03 3.9172e+02 1.5918e+02 5.0432e-05 2.2175e-05 6.5482e-03 1.6994e-03 3.4302e-01 8.9583e-02 7.8277e-02 4.6084e-02 2.3803e-02 1.9394e-02 3.9159e-01 9.4520e-03 3.2398e-03 5.7003e-01 1.1921e-01 8.9674e-02 4.5511e-02 2.0365e-02 1.4309e-02 1.2820e-01 +4.1200e-01 1.4400e+07 5.5315e+02 3.7587e+03 5.6099e-08 2.6420e-01 7.3580e-01 4.5597e+03 3.5357e+03 3.9352e+02 1.5751e+02 5.0738e-05 2.2046e-05 6.5068e-03 1.6820e-03 3.4019e-01 8.9120e-02 7.8033e-02 4.6029e-02 2.3818e-02 1.9439e-02 3.9518e-01 9.4621e-03 3.2443e-03 5.7075e-01 1.1932e-01 8.9729e-02 4.5520e-02 2.0359e-02 1.4296e-02 1.2732e-01 +4.1400e-01 1.4300e+07 5.5315e+02 3.7376e+03 5.6570e-08 2.6693e-01 7.3307e-01 4.5513e+03 3.5092e+03 3.9530e+02 1.5586e+02 5.1041e-05 2.1921e-05 6.4654e-03 1.6648e-03 3.3737e-01 8.8657e-02 7.7787e-02 4.5973e-02 2.3831e-02 1.9483e-02 3.9877e-01 9.4720e-03 3.2486e-03 5.7144e-01 1.1943e-01 8.9783e-02 4.5531e-02 2.0354e-02 1.4284e-02 1.2645e-01 +4.1600e-01 1.4200e+07 5.5315e+02 3.7164e+03 5.7049e-08 2.6951e-01 7.3049e-01 4.5429e+03 3.4827e+03 3.9706e+02 1.5424e+02 5.1343e-05 2.1799e-05 6.4241e-03 1.6477e-03 3.3457e-01 8.8194e-02 7.7538e-02 4.5914e-02 2.3843e-02 1.9526e-02 4.0234e-01 9.4815e-03 3.2528e-03 5.7211e-01 1.1954e-01 8.9837e-02 4.5541e-02 2.0350e-02 1.4273e-02 1.2561e-01 +4.1800e-01 1.4100e+07 5.5315e+02 3.6952e+03 5.7537e-08 2.7196e-01 7.2804e-01 4.5344e+03 3.4563e+03 3.9879e+02 1.5263e+02 5.1642e-05 2.1680e-05 6.3829e-03 1.6308e-03 3.3179e-01 8.7729e-02 7.7286e-02 4.5852e-02 2.3854e-02 1.9567e-02 4.0591e-01 9.4909e-03 3.2568e-03 5.7276e-01 1.1964e-01 8.9891e-02 4.5553e-02 2.0346e-02 1.4262e-02 1.2480e-01 +4.2000e-01 1.4000e+07 5.5315e+02 3.6739e+03 5.8034e-08 2.7428e-01 7.2572e-01 4.5259e+03 3.4299e+03 4.0050e+02 1.5105e+02 5.1940e-05 2.1563e-05 6.3418e-03 1.6141e-03 3.2902e-01 8.7264e-02 7.7032e-02 4.5789e-02 2.3863e-02 1.9608e-02 4.0947e-01 9.5000e-03 3.2607e-03 5.7339e-01 1.1974e-01 8.9944e-02 4.5565e-02 2.0343e-02 1.4252e-02 1.2401e-01 +4.2200e-01 1.3900e+07 5.5315e+02 3.6526e+03 5.8540e-08 2.7649e-01 7.2351e-01 4.5174e+03 3.4036e+03 4.0220e+02 1.4949e+02 5.2236e-05 2.1449e-05 6.3007e-03 1.5975e-03 3.2627e-01 8.6798e-02 7.6774e-02 4.5723e-02 2.3870e-02 1.9647e-02 4.1302e-01 9.5089e-03 3.2644e-03 5.7399e-01 1.1984e-01 8.9997e-02 4.5577e-02 2.0340e-02 1.4243e-02 1.2324e-01 +4.2400e-01 1.3800e+07 5.5315e+02 3.6312e+03 5.9055e-08 2.7858e-01 7.2142e-01 4.5088e+03 3.3773e+03 4.0387e+02 1.4795e+02 5.2530e-05 2.1337e-05 6.2596e-03 1.5811e-03 3.2354e-01 8.6332e-02 7.6515e-02 4.5654e-02 2.3876e-02 1.9685e-02 4.1656e-01 9.5175e-03 3.2680e-03 5.7458e-01 1.1994e-01 9.0050e-02 4.5590e-02 2.0338e-02 1.4234e-02 1.2248e-01 +4.2600e-01 1.3700e+07 5.5315e+02 3.6097e+03 5.9579e-08 2.8057e-01 7.1943e-01 4.5001e+03 3.3511e+03 4.0553e+02 1.4643e+02 5.2822e-05 2.1227e-05 6.2186e-03 1.5648e-03 3.2082e-01 8.5864e-02 7.6252e-02 4.5584e-02 2.3881e-02 1.9722e-02 4.2010e-01 9.5260e-03 3.2714e-03 5.7515e-01 1.2003e-01 9.0103e-02 4.5603e-02 2.0336e-02 1.4226e-02 1.2176e-01 +4.2800e-01 1.3600e+07 5.5315e+02 3.5881e+03 6.0114e-08 2.8245e-01 7.1755e-01 4.4915e+03 3.3249e+03 4.0716e+02 1.4492e+02 5.3113e-05 2.1120e-05 6.1776e-03 1.5487e-03 3.1811e-01 8.5395e-02 7.5986e-02 4.5510e-02 2.3885e-02 1.9758e-02 4.2363e-01 9.5342e-03 3.2747e-03 5.7569e-01 1.2013e-01 9.0155e-02 4.5617e-02 2.0335e-02 1.4218e-02 1.2104e-01 +4.3000e-01 1.3500e+07 5.5315e+02 3.5665e+03 6.0658e-08 2.8424e-01 7.1576e-01 4.4828e+03 3.2988e+03 4.0878e+02 1.4344e+02 5.3402e-05 2.1015e-05 6.1367e-03 1.5327e-03 3.1542e-01 8.4925e-02 7.5718e-02 4.5435e-02 2.3887e-02 1.9792e-02 4.2716e-01 9.5422e-03 3.2778e-03 5.7622e-01 1.2022e-01 9.0207e-02 4.5631e-02 2.0334e-02 1.4212e-02 1.2035e-01 +4.3200e-01 1.3400e+07 5.5315e+02 3.5449e+03 6.1213e-08 2.8594e-01 7.1406e-01 4.4740e+03 3.2727e+03 4.1039e+02 1.4197e+02 5.3690e-05 2.0912e-05 6.0957e-03 1.5168e-03 3.1273e-01 8.4453e-02 7.5447e-02 4.5357e-02 2.3887e-02 1.9825e-02 4.3068e-01 9.5500e-03 3.2809e-03 5.7673e-01 1.2031e-01 9.0258e-02 4.5646e-02 2.0334e-02 1.4205e-02 1.1968e-01 +4.3400e-01 1.3300e+07 5.5315e+02 3.5231e+03 6.1778e-08 2.8755e-01 7.1245e-01 4.4652e+03 3.2467e+03 4.1198e+02 1.4052e+02 5.3977e-05 2.0811e-05 6.0547e-03 1.5011e-03 3.1007e-01 8.3980e-02 7.5172e-02 4.5276e-02 2.3886e-02 1.9858e-02 4.3421e-01 9.5576e-03 3.2838e-03 5.7723e-01 1.2040e-01 9.0310e-02 4.5661e-02 2.0335e-02 1.4199e-02 1.1903e-01 +4.3600e-01 1.3200e+07 5.5315e+02 3.5013e+03 6.2354e-08 2.8908e-01 7.1092e-01 4.4564e+03 3.2207e+03 4.1355e+02 1.3908e+02 5.4262e-05 2.0713e-05 6.0138e-03 1.4855e-03 3.0741e-01 8.3506e-02 7.4895e-02 4.5194e-02 2.3884e-02 1.9889e-02 4.3773e-01 9.5650e-03 3.2866e-03 5.7771e-01 1.2048e-01 9.0361e-02 4.5677e-02 2.0335e-02 1.4194e-02 1.1839e-01 +4.3800e-01 1.3100e+07 5.5315e+02 3.4795e+03 6.2941e-08 2.9052e-01 7.0948e-01 4.4476e+03 3.1947e+03 4.1511e+02 1.3766e+02 5.4546e-05 2.0616e-05 5.9728e-03 1.4700e-03 3.0476e-01 8.3031e-02 7.4615e-02 4.5108e-02 2.3880e-02 1.9918e-02 4.4124e-01 9.5723e-03 3.2893e-03 5.7817e-01 1.2057e-01 9.0412e-02 4.5693e-02 2.0337e-02 1.4189e-02 1.1777e-01 +4.4000e-01 1.3000e+07 5.5315e+02 3.4575e+03 6.3540e-08 2.9189e-01 7.0811e-01 4.4387e+03 3.1688e+03 4.1665e+02 1.3625e+02 5.4829e-05 2.0521e-05 5.9319e-03 1.4546e-03 3.0213e-01 8.2554e-02 7.4331e-02 4.5021e-02 2.3875e-02 1.9947e-02 4.4476e-01 9.5793e-03 3.2918e-03 5.7862e-01 1.2065e-01 9.0462e-02 4.5709e-02 2.0338e-02 1.4185e-02 1.1717e-01 +4.4200e-01 1.2900e+07 5.5315e+02 3.4355e+03 6.4150e-08 2.9319e-01 7.0681e-01 4.4299e+03 3.1429e+03 4.1818e+02 1.3486e+02 5.5111e-05 2.0427e-05 5.8909e-03 1.4393e-03 2.9950e-01 8.2075e-02 7.4045e-02 4.4930e-02 2.3868e-02 1.9974e-02 4.4828e-01 9.5862e-03 3.2943e-03 5.7905e-01 1.2073e-01 9.0512e-02 4.5726e-02 2.0340e-02 1.4181e-02 1.1658e-01 +4.4400e-01 1.2800e+07 5.5315e+02 3.4135e+03 6.4773e-08 2.9442e-01 7.0558e-01 4.4209e+03 3.1171e+03 4.1969e+02 1.3348e+02 5.5392e-05 2.0336e-05 5.8499e-03 1.4241e-03 2.9689e-01 8.1595e-02 7.3755e-02 4.4837e-02 2.3860e-02 2.0000e-02 4.5179e-01 9.5929e-03 3.2966e-03 5.7946e-01 1.2081e-01 9.0562e-02 4.5744e-02 2.0343e-02 1.4178e-02 1.1601e-01 +4.4600e-01 1.2700e+07 5.5315e+02 3.3913e+03 6.5407e-08 2.9557e-01 7.0443e-01 4.4120e+03 3.0912e+03 4.2120e+02 1.3212e+02 5.5672e-05 2.0246e-05 5.8089e-03 1.4091e-03 2.9428e-01 8.1113e-02 7.3462e-02 4.4742e-02 2.3851e-02 2.0025e-02 4.5531e-01 9.5994e-03 3.2989e-03 5.7986e-01 1.2089e-01 9.0612e-02 4.5761e-02 2.0346e-02 1.4175e-02 1.1546e-01 +4.4800e-01 1.2600e+07 5.5315e+02 3.3691e+03 6.6055e-08 2.9667e-01 7.0333e-01 4.4031e+03 3.0655e+03 4.2269e+02 1.3077e+02 5.5951e-05 2.0157e-05 5.7679e-03 1.3941e-03 2.9168e-01 8.0630e-02 7.3166e-02 4.4644e-02 2.3840e-02 2.0049e-02 4.5883e-01 9.6058e-03 3.3010e-03 5.8025e-01 1.2097e-01 9.0662e-02 4.5779e-02 2.0349e-02 1.4172e-02 1.1492e-01 +4.5000e-01 1.2500e+07 5.5315e+02 3.3468e+03 6.6715e-08 2.9769e-01 7.0231e-01 4.3941e+03 3.0397e+03 4.2416e+02 1.2943e+02 5.6229e-05 2.0071e-05 5.7268e-03 1.3793e-03 2.8910e-01 8.0145e-02 7.2867e-02 4.4544e-02 2.3827e-02 2.0071e-02 4.6235e-01 9.6120e-03 3.3030e-03 5.8062e-01 1.2104e-01 9.0711e-02 4.5798e-02 2.0353e-02 1.4170e-02 1.1439e-01 +4.5200e-01 1.2400e+07 5.5315e+02 3.3244e+03 6.7389e-08 2.9866e-01 7.0134e-01 4.3851e+03 3.0140e+03 4.2563e+02 1.2810e+02 5.6506e-05 1.9985e-05 5.6857e-03 1.3645e-03 2.8652e-01 7.9657e-02 7.2564e-02 4.4441e-02 2.3813e-02 2.0093e-02 4.6587e-01 9.6180e-03 3.3050e-03 5.8098e-01 1.2112e-01 9.0760e-02 4.5816e-02 2.0357e-02 1.4169e-02 1.1388e-01 +4.5400e-01 1.2300e+07 5.5315e+02 3.3020e+03 6.8076e-08 2.9957e-01 7.0043e-01 4.3761e+03 2.9883e+03 4.2708e+02 1.2679e+02 5.6783e-05 1.9902e-05 5.6445e-03 1.3499e-03 2.8394e-01 7.9169e-02 7.2259e-02 4.4335e-02 2.3797e-02 2.0113e-02 4.6939e-01 9.6239e-03 3.3068e-03 5.8132e-01 1.2119e-01 9.0808e-02 4.5835e-02 2.0361e-02 1.4168e-02 1.1339e-01 +4.5600e-01 1.2200e+07 5.5315e+02 3.2795e+03 6.8778e-08 3.0041e-01 6.9959e-01 4.3670e+03 2.9627e+03 4.2853e+02 1.2549e+02 5.7058e-05 1.9819e-05 5.6033e-03 1.3353e-03 2.8138e-01 7.8678e-02 7.1949e-02 4.4226e-02 2.3780e-02 2.0131e-02 4.7292e-01 9.6296e-03 3.3086e-03 5.8165e-01 1.2126e-01 9.0857e-02 4.5855e-02 2.0366e-02 1.4167e-02 1.1290e-01 +4.5800e-01 1.2100e+07 5.5315e+02 3.2569e+03 6.9494e-08 3.0121e-01 6.9879e-01 4.3580e+03 2.9370e+03 4.2996e+02 1.2420e+02 5.7333e-05 1.9739e-05 5.5621e-03 1.3208e-03 2.7883e-01 7.8185e-02 7.1637e-02 4.4115e-02 2.3761e-02 2.0149e-02 4.7644e-01 9.6351e-03 3.3102e-03 5.8197e-01 1.2133e-01 9.0905e-02 4.5874e-02 2.0371e-02 1.4167e-02 1.1244e-01 +4.6000e-01 1.2000e+07 5.5315e+02 3.2342e+03 7.0225e-08 3.0194e-01 6.9806e-01 4.3489e+03 2.9114e+03 4.3138e+02 1.2292e+02 5.7608e-05 1.9659e-05 5.5208e-03 1.3065e-03 2.7628e-01 7.7691e-02 7.1321e-02 4.4001e-02 2.3741e-02 2.0165e-02 4.7998e-01 9.6405e-03 3.3118e-03 5.8228e-01 1.2140e-01 9.0952e-02 4.5894e-02 2.0377e-02 1.4168e-02 1.1198e-01 +4.6200e-01 1.1900e+07 5.5315e+02 3.2115e+03 7.0972e-08 3.0263e-01 6.9737e-01 4.3398e+03 2.8859e+03 4.3279e+02 1.2165e+02 5.7881e-05 1.9581e-05 5.4795e-03 1.2922e-03 2.7374e-01 7.7194e-02 7.1001e-02 4.3885e-02 2.3719e-02 2.0180e-02 4.8351e-01 9.6458e-03 3.3133e-03 5.8257e-01 1.2146e-01 9.1000e-02 4.5915e-02 2.0383e-02 1.4168e-02 1.1155e-01 +4.6400e-01 1.1800e+07 5.5315e+02 3.1886e+03 7.1734e-08 3.0326e-01 6.9674e-01 4.3307e+03 2.8603e+03 4.3419e+02 1.2039e+02 5.8154e-05 1.9504e-05 5.4381e-03 1.2780e-03 2.7120e-01 7.6695e-02 7.0678e-02 4.3766e-02 2.3696e-02 2.0193e-02 4.8705e-01 9.6509e-03 3.3147e-03 5.8285e-01 1.2153e-01 9.1047e-02 4.5935e-02 2.0389e-02 1.4169e-02 1.1112e-01 +4.6600e-01 1.1700e+07 5.5315e+02 3.1657e+03 7.2513e-08 3.0384e-01 6.9616e-01 4.3216e+03 2.8348e+03 4.3558e+02 1.1915e+02 5.8427e-05 1.9428e-05 5.3966e-03 1.2638e-03 2.6867e-01 7.6195e-02 7.0352e-02 4.3644e-02 2.3670e-02 2.0205e-02 4.9060e-01 9.6558e-03 3.3160e-03 5.8312e-01 1.2159e-01 9.1094e-02 4.5956e-02 2.0396e-02 1.4171e-02 1.1071e-01 +4.6800e-01 1.1600e+07 5.5315e+02 3.1427e+03 7.3309e-08 3.0436e-01 6.9564e-01 4.3125e+03 2.8093e+03 4.3696e+02 1.1791e+02 5.8699e-05 1.9354e-05 5.3551e-03 1.2498e-03 2.6615e-01 7.5692e-02 7.0022e-02 4.3519e-02 2.3644e-02 2.0216e-02 4.9415e-01 9.6606e-03 3.3172e-03 5.8337e-01 1.2165e-01 9.1140e-02 4.5977e-02 2.0403e-02 1.4173e-02 1.1031e-01 +4.7000e-01 1.1500e+07 5.5315e+02 3.1196e+03 7.4121e-08 3.0484e-01 6.9516e-01 4.3033e+03 2.7838e+03 4.3833e+02 1.1668e+02 5.8970e-05 1.9281e-05 5.3136e-03 1.2358e-03 2.6364e-01 7.5187e-02 6.9688e-02 4.3391e-02 2.3615e-02 2.0225e-02 4.9771e-01 9.6652e-03 3.3183e-03 5.8361e-01 1.2171e-01 9.1186e-02 4.5999e-02 2.0410e-02 1.4175e-02 1.0992e-01 +4.7200e-01 1.1400e+07 5.5315e+02 3.0965e+03 7.4952e-08 3.0527e-01 6.9473e-01 4.2942e+03 2.7584e+03 4.3970e+02 1.1546e+02 5.9241e-05 1.9208e-05 5.2719e-03 1.2220e-03 2.6113e-01 7.4680e-02 6.9351e-02 4.3260e-02 2.3585e-02 2.0233e-02 5.0127e-01 9.6697e-03 3.3194e-03 5.8384e-01 1.2177e-01 9.1232e-02 4.6020e-02 2.0418e-02 1.4178e-02 1.0955e-01 +4.7400e-01 1.1300e+07 5.5315e+02 3.0732e+03 7.5801e-08 3.0566e-01 6.9434e-01 4.2850e+03 2.7330e+03 4.4105e+02 1.1426e+02 5.9511e-05 1.9138e-05 5.2302e-03 1.2082e-03 2.5862e-01 7.4171e-02 6.9010e-02 4.3127e-02 2.3553e-02 2.0239e-02 5.0484e-01 9.6740e-03 3.3204e-03 5.8406e-01 1.2183e-01 9.1278e-02 4.6042e-02 2.0426e-02 1.4181e-02 1.0919e-01 +4.7600e-01 1.1200e+07 5.5315e+02 3.0499e+03 7.6669e-08 3.0599e-01 6.9401e-01 4.2758e+03 2.7076e+03 4.4240e+02 1.1306e+02 5.9781e-05 1.9068e-05 5.1884e-03 1.1944e-03 2.5613e-01 7.3659e-02 6.8665e-02 4.2990e-02 2.3520e-02 2.0244e-02 5.0841e-01 9.6782e-03 3.3213e-03 5.8427e-01 1.2188e-01 9.1323e-02 4.6064e-02 2.0434e-02 1.4185e-02 1.0884e-01 +4.7800e-01 1.1100e+07 5.5315e+02 3.0265e+03 7.7556e-08 3.0628e-01 6.9372e-01 4.2666e+03 2.6822e+03 4.4373e+02 1.1187e+02 6.0051e-05 1.8999e-05 5.1466e-03 1.1808e-03 2.5363e-01 7.3145e-02 6.8317e-02 4.2851e-02 2.3484e-02 2.0248e-02 5.1199e-01 9.6823e-03 3.3221e-03 5.8446e-01 1.2194e-01 9.1367e-02 4.6087e-02 2.0442e-02 1.4189e-02 1.0851e-01 +4.8000e-01 1.1000e+07 5.5315e+02 3.0029e+03 7.8464e-08 3.0653e-01 6.9347e-01 4.2574e+03 2.6569e+03 4.4506e+02 1.1069e+02 6.0320e-05 1.8931e-05 5.1047e-03 1.1672e-03 2.5115e-01 7.2629e-02 6.7965e-02 4.2709e-02 2.3447e-02 2.0250e-02 5.1558e-01 9.6862e-03 3.3228e-03 5.8465e-01 1.2199e-01 9.1412e-02 4.6109e-02 2.0451e-02 1.4193e-02 1.0818e-01 +4.8200e-01 1.0900e+07 5.5315e+02 2.9793e+03 7.9392e-08 3.0673e-01 6.9327e-01 4.2482e+03 2.6316e+03 4.4638e+02 1.0951e+02 6.0589e-05 1.8864e-05 5.0627e-03 1.1537e-03 2.4866e-01 7.2111e-02 6.7609e-02 4.2563e-02 2.3408e-02 2.0251e-02 5.1918e-01 9.6899e-03 3.3235e-03 5.8482e-01 1.2205e-01 9.1456e-02 4.6132e-02 2.0460e-02 1.4197e-02 1.0787e-01 +4.8400e-01 1.0800e+07 5.5315e+02 2.9556e+03 8.0342e-08 3.0688e-01 6.9312e-01 4.2390e+03 2.6063e+03 4.4770e+02 1.0835e+02 6.0857e-05 1.8798e-05 5.0206e-03 1.1403e-03 2.4619e-01 7.1590e-02 6.7249e-02 4.2415e-02 2.3368e-02 2.0250e-02 5.2278e-01 9.6935e-03 3.3241e-03 5.8498e-01 1.2210e-01 9.1499e-02 4.6155e-02 2.0470e-02 1.4203e-02 1.0758e-01 +4.8600e-01 1.0700e+07 5.5315e+02 2.9318e+03 8.1314e-08 3.0699e-01 6.9301e-01 4.2298e+03 2.5810e+03 4.4900e+02 1.0719e+02 6.1125e-05 1.8734e-05 4.9785e-03 1.1269e-03 2.4371e-01 7.1067e-02 6.6885e-02 4.2263e-02 2.3325e-02 2.0247e-02 5.2639e-01 9.6970e-03 3.3246e-03 5.8513e-01 1.2214e-01 9.1542e-02 4.6178e-02 2.0480e-02 1.4208e-02 1.0729e-01 +4.8800e-01 1.0600e+07 5.5315e+02 2.9080e+03 8.2308e-08 3.0705e-01 6.9295e-01 4.2205e+03 2.5557e+03 4.5030e+02 1.0605e+02 6.1393e-05 1.8670e-05 4.9362e-03 1.1136e-03 2.4125e-01 7.0542e-02 6.6518e-02 4.2109e-02 2.3281e-02 2.0243e-02 5.3001e-01 9.7003e-03 3.3251e-03 5.8527e-01 1.2219e-01 9.1585e-02 4.6202e-02 2.0490e-02 1.4214e-02 1.0702e-01 +4.9000e-01 1.0500e+07 5.5315e+02 2.8840e+03 8.3326e-08 3.0707e-01 6.9293e-01 4.2113e+03 2.5305e+03 4.5159e+02 1.0491e+02 6.1661e-05 1.8607e-05 4.8939e-03 1.1004e-03 2.3878e-01 7.0014e-02 6.6146e-02 4.1951e-02 2.3234e-02 2.0237e-02 5.3364e-01 9.7035e-03 3.3254e-03 5.8540e-01 1.2224e-01 9.1627e-02 4.6225e-02 2.0500e-02 1.4220e-02 1.0676e-01 +4.9200e-01 1.0400e+07 5.5315e+02 2.8599e+03 8.4368e-08 3.0705e-01 6.9295e-01 4.2021e+03 2.5053e+03 4.5287e+02 1.0377e+02 6.1928e-05 1.8545e-05 4.8515e-03 1.0873e-03 2.3632e-01 6.9483e-02 6.5771e-02 4.1790e-02 2.3186e-02 2.0230e-02 5.3728e-01 9.7065e-03 3.3257e-03 5.8551e-01 1.2228e-01 9.1669e-02 4.6249e-02 2.0511e-02 1.4226e-02 1.0652e-01 +4.9400e-01 1.0300e+07 5.5315e+02 2.8357e+03 8.5436e-08 3.0698e-01 6.9302e-01 4.1928e+03 2.4801e+03 4.5415e+02 1.0265e+02 6.2195e-05 1.8483e-05 4.8090e-03 1.0742e-03 2.3387e-01 6.8950e-02 6.5391e-02 4.1626e-02 2.3136e-02 2.0221e-02 5.4092e-01 9.7094e-03 3.3260e-03 5.8562e-01 1.2233e-01 9.1710e-02 4.6273e-02 2.0522e-02 1.4233e-02 1.0628e-01 +4.9600e-01 1.0200e+07 5.5315e+02 2.8114e+03 8.6529e-08 3.0687e-01 6.9313e-01 4.1835e+03 2.4550e+03 4.5542e+02 1.0153e+02 6.2462e-05 1.8423e-05 4.7664e-03 1.0611e-03 2.3142e-01 6.8415e-02 6.5007e-02 4.1458e-02 2.3084e-02 2.0210e-02 5.4458e-01 9.7121e-03 3.3261e-03 5.8571e-01 1.2237e-01 9.1751e-02 4.6297e-02 2.0533e-02 1.4241e-02 1.0606e-01 +4.9800e-01 1.0100e+07 5.5315e+02 2.7871e+03 8.7649e-08 3.0672e-01 6.9328e-01 4.1743e+03 2.4298e+03 4.5668e+02 1.0042e+02 6.2728e-05 1.8364e-05 4.7238e-03 1.0482e-03 2.2897e-01 6.7877e-02 6.4620e-02 4.1288e-02 2.3030e-02 2.0197e-02 5.4824e-01 9.7147e-03 3.3262e-03 5.8580e-01 1.2241e-01 9.1791e-02 4.6321e-02 2.0544e-02 1.4248e-02 1.0585e-01 +5.0000e-01 1.0000e+07 5.5315e+02 2.7626e+03 8.8797e-08 3.0652e-01 6.9348e-01 4.1650e+03 2.4047e+03 4.5794e+02 9.9319e+01 6.2995e-05 1.8305e-05 4.6810e-03 1.0353e-03 2.2653e-01 6.7336e-02 6.4228e-02 4.1113e-02 2.2974e-02 2.0183e-02 5.5192e-01 9.7171e-03 3.3262e-03 5.8587e-01 1.2245e-01 9.1830e-02 4.6345e-02 2.0556e-02 1.4256e-02 1.0566e-01 +5.0200e-01 9.9604e+06 5.5315e+02 2.7529e+03 8.9259e-08 3.0643e-01 6.9357e-01 4.1613e+03 2.3947e+03 4.5844e+02 9.8885e+01 6.3100e-05 1.8282e-05 4.6640e-03 1.0302e-03 2.2556e-01 6.7121e-02 6.4071e-02 4.1044e-02 2.2951e-02 2.0177e-02 5.5338e-01 9.7180e-03 3.3262e-03 5.8589e-01 1.2246e-01 9.1846e-02 4.6355e-02 2.0560e-02 1.4259e-02 1.0558e-01 +5.0400e-01 9.9208e+06 5.5315e+02 2.7431e+03 8.9726e-08 3.0633e-01 6.9367e-01 4.1576e+03 2.3848e+03 4.5893e+02 9.8451e+01 6.3206e-05 1.8259e-05 4.6471e-03 1.0251e-03 2.2460e-01 6.6906e-02 6.3914e-02 4.0973e-02 2.2928e-02 2.0171e-02 5.5484e-01 9.7189e-03 3.3262e-03 5.8592e-01 1.2248e-01 9.1861e-02 4.6364e-02 2.0565e-02 1.4263e-02 1.0551e-01 +5.0600e-01 9.8812e+06 5.5315e+02 2.7334e+03 9.0198e-08 3.0623e-01 6.9377e-01 4.1540e+03 2.3749e+03 4.5943e+02 9.8018e+01 6.3311e-05 1.8236e-05 4.6301e-03 1.0200e-03 2.2363e-01 6.6691e-02 6.3757e-02 4.0902e-02 2.2904e-02 2.0164e-02 5.5630e-01 9.7198e-03 3.3261e-03 5.8594e-01 1.2249e-01 9.1877e-02 4.6374e-02 2.0570e-02 1.4266e-02 1.0544e-01 +5.0800e-01 9.8416e+06 5.5315e+02 2.7236e+03 9.0674e-08 3.0612e-01 6.9388e-01 4.1503e+03 2.3649e+03 4.5992e+02 9.7587e+01 6.3416e-05 1.8213e-05 4.6131e-03 1.0150e-03 2.2267e-01 6.6475e-02 6.3599e-02 4.0831e-02 2.2881e-02 2.0157e-02 5.5776e-01 9.7206e-03 3.3261e-03 5.8596e-01 1.2251e-01 9.1892e-02 4.6383e-02 2.0575e-02 1.4269e-02 1.0537e-01 +5.1000e-01 9.8020e+06 5.5315e+02 2.7138e+03 9.1155e-08 3.0600e-01 6.9400e-01 4.1466e+03 2.3550e+03 4.6041e+02 9.7156e+01 6.3522e-05 1.8191e-05 4.5960e-03 1.0099e-03 2.2170e-01 6.6258e-02 6.3440e-02 4.0759e-02 2.2857e-02 2.0150e-02 5.5923e-01 9.7215e-03 3.3260e-03 5.8598e-01 1.2252e-01 9.1907e-02 4.6393e-02 2.0579e-02 1.4273e-02 1.0530e-01 +5.1200e-01 9.7624e+06 5.5315e+02 2.7040e+03 9.1641e-08 3.0587e-01 6.9413e-01 4.1429e+03 2.3451e+03 4.6090e+02 9.6727e+01 6.3627e-05 1.8168e-05 4.5790e-03 1.0049e-03 2.2074e-01 6.6042e-02 6.3280e-02 4.0686e-02 2.2832e-02 2.0142e-02 5.6069e-01 9.7223e-03 3.3260e-03 5.8599e-01 1.2253e-01 9.1922e-02 4.6403e-02 2.0584e-02 1.4276e-02 1.0524e-01 +5.1400e-01 9.7228e+06 5.5315e+02 2.6942e+03 9.2132e-08 3.0574e-01 6.9426e-01 4.1392e+03 2.3352e+03 4.6139e+02 9.6298e+01 6.3732e-05 1.8146e-05 4.5620e-03 9.9982e-04 2.1978e-01 6.5824e-02 6.3120e-02 4.0613e-02 2.2807e-02 2.0134e-02 5.6216e-01 9.7231e-03 3.3259e-03 5.8601e-01 1.2255e-01 9.1937e-02 4.6412e-02 2.0589e-02 1.4280e-02 1.0518e-01 +5.1600e-01 9.6832e+06 5.5315e+02 2.6843e+03 9.2627e-08 3.0560e-01 6.9440e-01 4.1356e+03 2.3252e+03 4.6188e+02 9.5871e+01 6.3837e-05 1.8124e-05 4.5449e-03 9.9479e-04 2.1882e-01 6.5607e-02 6.2959e-02 4.0540e-02 2.2782e-02 2.0126e-02 5.6363e-01 9.7238e-03 3.3258e-03 5.8602e-01 1.2256e-01 9.1952e-02 4.6422e-02 2.0594e-02 1.4283e-02 1.0512e-01 +5.1800e-01 9.6436e+06 5.5315e+02 2.6745e+03 9.3128e-08 3.0545e-01 6.9455e-01 4.1319e+03 2.3153e+03 4.6237e+02 9.5444e+01 6.3943e-05 1.8102e-05 4.5278e-03 9.8977e-04 2.1785e-01 6.5389e-02 6.2797e-02 4.0465e-02 2.2757e-02 2.0118e-02 5.6510e-01 9.7245e-03 3.3257e-03 5.8603e-01 1.2257e-01 9.1967e-02 4.6432e-02 2.0599e-02 1.4287e-02 1.0506e-01 +5.2000e-01 9.6040e+06 5.5315e+02 2.6646e+03 9.3634e-08 3.0530e-01 6.9470e-01 4.1282e+03 2.3054e+03 4.6286e+02 9.5019e+01 6.4048e-05 1.8080e-05 4.5107e-03 9.8476e-04 2.1689e-01 6.5170e-02 6.2635e-02 4.0391e-02 2.2731e-02 2.0109e-02 5.6658e-01 9.7252e-03 3.3256e-03 5.8604e-01 1.2259e-01 9.1982e-02 4.6442e-02 2.0604e-02 1.4291e-02 1.0500e-01 +5.2200e-01 9.5644e+06 5.5315e+02 2.6547e+03 9.4145e-08 3.0514e-01 6.9486e-01 4.1245e+03 2.2955e+03 4.6335e+02 9.4595e+01 6.4153e-05 1.8058e-05 4.4936e-03 9.7976e-04 2.1593e-01 6.4951e-02 6.2472e-02 4.0315e-02 2.2705e-02 2.0100e-02 5.6805e-01 9.7259e-03 3.3254e-03 5.8605e-01 1.2260e-01 9.1996e-02 4.6451e-02 2.0609e-02 1.4295e-02 1.0495e-01 +5.2400e-01 9.5248e+06 5.5315e+02 2.6448e+03 9.4661e-08 3.0497e-01 6.9503e-01 4.1208e+03 2.2856e+03 4.6383e+02 9.4171e+01 6.4258e-05 1.8036e-05 4.4765e-03 9.7477e-04 2.1497e-01 6.4732e-02 6.2308e-02 4.0240e-02 2.2679e-02 2.0091e-02 5.6953e-01 9.7266e-03 3.3253e-03 5.8606e-01 1.2261e-01 9.2011e-02 4.6461e-02 2.0614e-02 1.4298e-02 1.0490e-01 +5.2600e-01 9.4852e+06 5.5315e+02 2.6349e+03 9.5182e-08 3.0480e-01 6.9520e-01 4.1171e+03 2.2757e+03 4.6432e+02 9.3749e+01 6.4363e-05 1.8014e-05 4.4593e-03 9.6979e-04 2.1401e-01 6.4512e-02 6.2144e-02 4.0163e-02 2.2652e-02 2.0081e-02 5.7101e-01 9.7272e-03 3.3251e-03 5.8606e-01 1.2262e-01 9.2025e-02 4.6471e-02 2.0619e-02 1.4302e-02 1.0485e-01 +5.2800e-01 9.4456e+06 5.5315e+02 2.6250e+03 9.5709e-08 3.0462e-01 6.9538e-01 4.1134e+03 2.2658e+03 4.6480e+02 9.3328e+01 6.4469e-05 1.7993e-05 4.4422e-03 9.6482e-04 2.1305e-01 6.4292e-02 6.1979e-02 4.0086e-02 2.2625e-02 2.0071e-02 5.7249e-01 9.7278e-03 3.3250e-03 5.8606e-01 1.2263e-01 9.2039e-02 4.6480e-02 2.0625e-02 1.4306e-02 1.0480e-01 +5.3000e-01 9.4060e+06 5.5315e+02 2.6150e+03 9.6241e-08 3.0443e-01 6.9557e-01 4.1098e+03 2.2559e+03 4.6528e+02 9.2908e+01 6.4574e-05 1.7971e-05 4.4250e-03 9.5985e-04 2.1209e-01 6.4071e-02 6.1813e-02 4.0009e-02 2.2597e-02 2.0061e-02 5.7397e-01 9.7284e-03 3.3248e-03 5.8606e-01 1.2264e-01 9.2053e-02 4.6490e-02 2.0630e-02 1.4310e-02 1.0476e-01 +5.3200e-01 9.3664e+06 5.5315e+02 2.6050e+03 9.6779e-08 3.0423e-01 6.9577e-01 4.1061e+03 2.2460e+03 4.6576e+02 9.2488e+01 6.4679e-05 1.7950e-05 4.4078e-03 9.5490e-04 2.1113e-01 6.3850e-02 6.1646e-02 3.9931e-02 2.2569e-02 2.0050e-02 5.7546e-01 9.7290e-03 3.3246e-03 5.8606e-01 1.2266e-01 9.2067e-02 4.6500e-02 2.0635e-02 1.4314e-02 1.0471e-01 +5.3400e-01 9.3268e+06 5.5315e+02 2.5950e+03 9.7322e-08 3.0403e-01 6.9597e-01 4.1024e+03 2.2361e+03 4.6625e+02 9.2070e+01 6.4784e-05 1.7928e-05 4.3906e-03 9.4995e-04 2.1018e-01 6.3629e-02 6.1479e-02 3.9852e-02 2.2541e-02 2.0039e-02 5.7694e-01 9.7295e-03 3.3244e-03 5.8606e-01 1.2267e-01 9.2081e-02 4.6510e-02 2.0640e-02 1.4318e-02 1.0467e-01 +5.3600e-01 9.2872e+06 5.5315e+02 2.5850e+03 9.7871e-08 3.0382e-01 6.9618e-01 4.0987e+03 2.2262e+03 4.6673e+02 9.1652e+01 6.4889e-05 1.7907e-05 4.3734e-03 9.4502e-04 2.0922e-01 6.3407e-02 6.1312e-02 3.9773e-02 2.2513e-02 2.0028e-02 5.7843e-01 9.7300e-03 3.3242e-03 5.8605e-01 1.2268e-01 9.2095e-02 4.6519e-02 2.0646e-02 1.4322e-02 1.0463e-01 +5.3800e-01 9.2476e+06 5.5315e+02 2.5750e+03 9.8426e-08 3.0360e-01 6.9640e-01 4.0950e+03 2.2163e+03 4.6721e+02 9.1236e+01 6.4994e-05 1.7886e-05 4.3562e-03 9.4009e-04 2.0826e-01 6.3185e-02 6.1143e-02 3.9693e-02 2.2484e-02 2.0016e-02 5.7992e-01 9.7305e-03 3.3240e-03 5.8605e-01 1.2269e-01 9.2109e-02 4.6529e-02 2.0651e-02 1.4327e-02 1.0459e-01 +5.4000e-01 9.2080e+06 5.5315e+02 2.5649e+03 9.8987e-08 3.0338e-01 6.9662e-01 4.0913e+03 2.2065e+03 4.6768e+02 9.0820e+01 6.5099e-05 1.7865e-05 4.3389e-03 9.3517e-04 2.0731e-01 6.2962e-02 6.0974e-02 3.9613e-02 2.2454e-02 2.0005e-02 5.8141e-01 9.7309e-03 3.3238e-03 5.8604e-01 1.2270e-01 9.2122e-02 4.6539e-02 2.0656e-02 1.4331e-02 1.0456e-01 +5.4200e-01 9.1684e+06 5.5315e+02 2.5549e+03 9.9554e-08 3.0315e-01 6.9685e-01 4.0876e+03 2.1966e+03 4.6816e+02 9.0406e+01 6.5204e-05 1.7844e-05 4.3217e-03 9.3026e-04 2.0635e-01 6.2739e-02 6.0804e-02 3.9532e-02 2.2425e-02 1.9992e-02 5.8291e-01 9.7314e-03 3.3236e-03 5.8603e-01 1.2271e-01 9.2136e-02 4.6549e-02 2.0662e-02 1.4335e-02 1.0453e-01 +5.4400e-01 9.1288e+06 5.5315e+02 2.5448e+03 1.0013e-07 3.0291e-01 6.9709e-01 4.0839e+03 2.1867e+03 4.6864e+02 8.9992e+01 6.5309e-05 1.7824e-05 4.3044e-03 9.2535e-04 2.0540e-01 6.2515e-02 6.0633e-02 3.9450e-02 2.2395e-02 1.9980e-02 5.8440e-01 9.7318e-03 3.3233e-03 5.8602e-01 1.2272e-01 9.2149e-02 4.6558e-02 2.0667e-02 1.4340e-02 1.0450e-01 +5.4600e-01 9.0892e+06 5.5315e+02 2.5347e+03 1.0071e-07 3.0266e-01 6.9734e-01 4.0802e+03 2.1768e+03 4.6912e+02 8.9579e+01 6.5414e-05 1.7803e-05 4.2871e-03 9.2046e-04 2.0444e-01 6.2291e-02 6.0462e-02 3.9368e-02 2.2364e-02 1.9967e-02 5.8590e-01 9.7321e-03 3.3231e-03 5.8600e-01 1.2273e-01 9.2162e-02 4.6568e-02 2.0673e-02 1.4344e-02 1.0447e-01 +5.4800e-01 9.0496e+06 5.5315e+02 2.5246e+03 1.0129e-07 3.0241e-01 6.9759e-01 4.0765e+03 2.1670e+03 4.6959e+02 8.9168e+01 6.5519e-05 1.7782e-05 4.2698e-03 9.1557e-04 2.0349e-01 6.2066e-02 6.0290e-02 3.9285e-02 2.2334e-02 1.9954e-02 5.8740e-01 9.7325e-03 3.3228e-03 5.8599e-01 1.2273e-01 9.2175e-02 4.6578e-02 2.0678e-02 1.4348e-02 1.0444e-01 +5.5000e-01 9.0100e+06 5.5315e+02 2.5145e+03 1.0188e-07 3.0215e-01 6.9785e-01 4.0729e+03 2.1571e+03 4.7007e+02 8.8757e+01 6.5624e-05 1.7762e-05 4.2524e-03 9.1069e-04 2.0253e-01 6.1842e-02 6.0117e-02 3.9202e-02 2.2303e-02 1.9940e-02 5.8890e-01 9.7328e-03 3.3225e-03 5.8597e-01 1.2274e-01 9.2188e-02 4.6588e-02 2.0684e-02 1.4353e-02 1.0442e-01 +5.5200e-01 8.9704e+06 5.5315e+02 2.5043e+03 1.0248e-07 3.0188e-01 6.9812e-01 4.0692e+03 2.1472e+03 4.7054e+02 8.8347e+01 6.5729e-05 1.7742e-05 4.2351e-03 9.0583e-04 2.0158e-01 6.1616e-02 5.9944e-02 3.9118e-02 2.2271e-02 1.9927e-02 5.9040e-01 9.7331e-03 3.3222e-03 5.8595e-01 1.2275e-01 9.2201e-02 4.6597e-02 2.0689e-02 1.4357e-02 1.0439e-01 +5.5400e-01 8.9308e+06 5.5315e+02 2.4941e+03 1.0308e-07 3.0160e-01 6.9840e-01 4.0655e+03 2.1374e+03 4.7101e+02 8.7938e+01 6.5834e-05 1.7721e-05 4.2177e-03 9.0096e-04 2.0063e-01 6.1390e-02 5.9770e-02 3.9034e-02 2.2239e-02 1.9912e-02 5.9191e-01 9.7334e-03 3.3219e-03 5.8593e-01 1.2276e-01 9.2214e-02 4.6607e-02 2.0695e-02 1.4362e-02 1.0437e-01 +5.5600e-01 8.8912e+06 5.5315e+02 2.4839e+03 1.0369e-07 3.0132e-01 6.9868e-01 4.0618e+03 2.1275e+03 4.7149e+02 8.7530e+01 6.5939e-05 1.7701e-05 4.2003e-03 8.9611e-04 1.9967e-01 6.1164e-02 5.9595e-02 3.8949e-02 2.2207e-02 1.9898e-02 5.9342e-01 9.7336e-03 3.3216e-03 5.8591e-01 1.2277e-01 9.2227e-02 4.6617e-02 2.0700e-02 1.4367e-02 1.0436e-01 +5.5800e-01 8.8516e+06 5.5315e+02 2.4737e+03 1.0431e-07 3.0102e-01 6.9898e-01 4.0581e+03 2.1177e+03 4.7196e+02 8.7123e+01 6.6044e-05 1.7681e-05 4.1829e-03 8.9127e-04 1.9872e-01 6.0937e-02 5.9419e-02 3.8863e-02 2.2174e-02 1.9883e-02 5.9493e-01 9.7339e-03 3.3213e-03 5.8588e-01 1.2278e-01 9.2239e-02 4.6626e-02 2.0706e-02 1.4371e-02 1.0434e-01 +5.6000e-01 8.8120e+06 5.5315e+02 2.4635e+03 1.0494e-07 3.0072e-01 6.9928e-01 4.0544e+03 2.1078e+03 4.7243e+02 8.6716e+01 6.6149e-05 1.7661e-05 4.1655e-03 8.8643e-04 1.9777e-01 6.0710e-02 5.9243e-02 3.8777e-02 2.2141e-02 1.9868e-02 5.9644e-01 9.7341e-03 3.3209e-03 5.8586e-01 1.2278e-01 9.2251e-02 4.6636e-02 2.0712e-02 1.4376e-02 1.0433e-01 +5.6200e-01 8.7724e+06 5.5315e+02 2.4533e+03 1.0557e-07 3.0042e-01 6.9958e-01 4.0507e+03 2.0980e+03 4.7290e+02 8.6311e+01 6.6254e-05 1.7641e-05 4.1481e-03 8.8160e-04 1.9682e-01 6.0483e-02 5.9066e-02 3.8690e-02 2.2108e-02 1.9852e-02 5.9795e-01 9.7342e-03 3.3206e-03 5.8583e-01 1.2279e-01 9.2263e-02 4.6646e-02 2.0717e-02 1.4381e-02 1.0432e-01 +5.6400e-01 8.7328e+06 5.5315e+02 2.4430e+03 1.0621e-07 3.0010e-01 6.9990e-01 4.0470e+03 2.0881e+03 4.7337e+02 8.5906e+01 6.6358e-05 1.7621e-05 4.1306e-03 8.7678e-04 1.9587e-01 6.0255e-02 5.8888e-02 3.8603e-02 2.2074e-02 1.9836e-02 5.9947e-01 9.7344e-03 3.3202e-03 5.8580e-01 1.2280e-01 9.2275e-02 4.6655e-02 2.0723e-02 1.4386e-02 1.0431e-01 +5.6600e-01 8.6932e+06 5.5315e+02 2.4327e+03 1.0685e-07 2.9978e-01 7.0022e-01 4.0433e+03 2.0783e+03 4.7384e+02 8.5502e+01 6.6463e-05 1.7601e-05 4.1132e-03 8.7197e-04 1.9492e-01 6.0026e-02 5.8709e-02 3.8514e-02 2.2040e-02 1.9820e-02 6.0099e-01 9.7345e-03 3.3198e-03 5.8577e-01 1.2280e-01 9.2287e-02 4.6665e-02 2.0729e-02 1.4391e-02 1.0430e-01 +5.6800e-01 8.6536e+06 5.5315e+02 2.4224e+03 1.0750e-07 2.9945e-01 7.0055e-01 4.0396e+03 2.0684e+03 4.7430e+02 8.5100e+01 6.6568e-05 1.7582e-05 4.0957e-03 8.6717e-04 1.9397e-01 5.9797e-02 5.8530e-02 3.8426e-02 2.2006e-02 1.9804e-02 6.0251e-01 9.7345e-03 3.3194e-03 5.8573e-01 1.2281e-01 9.2299e-02 4.6675e-02 2.0734e-02 1.4396e-02 1.0430e-01 +5.7000e-01 8.6140e+06 5.5315e+02 2.4121e+03 1.0816e-07 2.9911e-01 7.0089e-01 4.0359e+03 2.0586e+03 4.7477e+02 8.4698e+01 6.6673e-05 1.7562e-05 4.0782e-03 8.6237e-04 1.9302e-01 5.9568e-02 5.8350e-02 3.8336e-02 2.1971e-02 1.9787e-02 6.0403e-01 9.7346e-03 3.3191e-03 5.8570e-01 1.2281e-01 9.2310e-02 4.6684e-02 2.0740e-02 1.4401e-02 1.0430e-01 +5.7200e-01 8.5744e+06 5.5315e+02 2.4017e+03 1.0883e-07 2.9876e-01 7.0124e-01 4.0322e+03 2.0488e+03 4.7524e+02 8.4296e+01 6.6778e-05 1.7543e-05 4.0607e-03 8.5759e-04 1.9207e-01 5.9338e-02 5.8169e-02 3.8246e-02 2.1935e-02 1.9769e-02 6.0556e-01 9.7346e-03 3.3186e-03 5.8566e-01 1.2282e-01 9.2322e-02 4.6694e-02 2.0746e-02 1.4406e-02 1.0430e-01 +5.7400e-01 8.5348e+06 5.5315e+02 2.3914e+03 1.0950e-07 2.9840e-01 7.0160e-01 4.0285e+03 2.0390e+03 4.7570e+02 8.3896e+01 6.6883e-05 1.7523e-05 4.0431e-03 8.5281e-04 1.9112e-01 5.9108e-02 5.7988e-02 3.8156e-02 2.1900e-02 1.9752e-02 6.0708e-01 9.7346e-03 3.3182e-03 5.8562e-01 1.2282e-01 9.2333e-02 4.6703e-02 2.0752e-02 1.4411e-02 1.0430e-01 +5.7600e-01 8.4952e+06 5.5315e+02 2.3810e+03 1.1019e-07 2.9804e-01 7.0196e-01 4.0248e+03 2.0291e+03 4.7617e+02 8.3497e+01 6.6988e-05 1.7504e-05 4.0256e-03 8.4804e-04 1.9017e-01 5.8877e-02 5.7806e-02 3.8065e-02 2.1864e-02 1.9733e-02 6.0861e-01 9.7346e-03 3.3178e-03 5.8558e-01 1.2283e-01 9.2344e-02 4.6713e-02 2.0758e-02 1.4416e-02 1.0431e-01 +5.7800e-01 8.4556e+06 5.5315e+02 2.3706e+03 1.1088e-07 2.9767e-01 7.0233e-01 4.0211e+03 2.0193e+03 4.7663e+02 8.3098e+01 6.7093e-05 1.7485e-05 4.0080e-03 8.4327e-04 1.8922e-01 5.8646e-02 5.7623e-02 3.7973e-02 2.1827e-02 1.9715e-02 6.1014e-01 9.7345e-03 3.3173e-03 5.8554e-01 1.2283e-01 9.2355e-02 4.6722e-02 2.0764e-02 1.4421e-02 1.0432e-01 +5.8000e-01 8.4160e+06 5.5315e+02 2.3602e+03 1.1158e-07 2.9729e-01 7.0271e-01 4.0174e+03 2.0095e+03 4.7709e+02 8.2700e+01 6.7198e-05 1.7465e-05 3.9904e-03 8.3852e-04 1.8827e-01 5.8414e-02 5.7439e-02 3.7881e-02 2.1790e-02 1.9696e-02 6.1168e-01 9.7345e-03 3.3169e-03 5.8549e-01 1.2284e-01 9.2366e-02 4.6732e-02 2.0769e-02 1.4426e-02 1.0433e-01 +5.8200e-01 8.3764e+06 5.5315e+02 2.3497e+03 1.1228e-07 2.9690e-01 7.0310e-01 4.0137e+03 1.9997e+03 4.7756e+02 8.2303e+01 6.7302e-05 1.7446e-05 3.9728e-03 8.3377e-04 1.8733e-01 5.8182e-02 5.7255e-02 3.7787e-02 2.1753e-02 1.9677e-02 6.1321e-01 9.7343e-03 3.3164e-03 5.8544e-01 1.2284e-01 9.2376e-02 4.6741e-02 2.0775e-02 1.4431e-02 1.0434e-01 +5.8400e-01 8.3368e+06 5.5315e+02 2.3393e+03 1.1300e-07 2.9650e-01 7.0350e-01 4.0100e+03 1.9899e+03 4.7802e+02 8.1907e+01 6.7407e-05 1.7427e-05 3.9552e-03 8.2903e-04 1.8638e-01 5.7949e-02 5.7069e-02 3.7694e-02 2.1715e-02 1.9657e-02 6.1475e-01 9.7342e-03 3.3159e-03 5.8539e-01 1.2284e-01 9.2387e-02 4.6751e-02 2.0781e-02 1.4437e-02 1.0436e-01 +5.8600e-01 8.2972e+06 5.5315e+02 2.3288e+03 1.1372e-07 2.9610e-01 7.0390e-01 4.0063e+03 1.9801e+03 4.7848e+02 8.1512e+01 6.7512e-05 1.7408e-05 3.9376e-03 8.2430e-04 1.8543e-01 5.7716e-02 5.6883e-02 3.7599e-02 2.1677e-02 1.9638e-02 6.1629e-01 9.7340e-03 3.3155e-03 5.8534e-01 1.2285e-01 9.2397e-02 4.6760e-02 2.0787e-02 1.4442e-02 1.0438e-01 +5.8800e-01 8.2576e+06 5.5315e+02 2.3183e+03 1.1445e-07 2.9568e-01 7.0432e-01 4.0026e+03 1.9703e+03 4.7894e+02 8.1117e+01 6.7617e-05 1.7389e-05 3.9199e-03 8.1957e-04 1.8449e-01 5.7482e-02 5.6697e-02 3.7504e-02 2.1638e-02 1.9617e-02 6.1784e-01 9.7338e-03 3.3150e-03 5.8529e-01 1.2285e-01 9.2407e-02 4.6769e-02 2.0793e-02 1.4448e-02 1.0440e-01 +5.9000e-01 8.2180e+06 5.5315e+02 2.3078e+03 1.1519e-07 2.9526e-01 7.0474e-01 3.9989e+03 1.9604e+03 4.7940e+02 8.0724e+01 6.7722e-05 1.7371e-05 3.9022e-03 8.1485e-04 1.8354e-01 5.7248e-02 5.6509e-02 3.7409e-02 2.1599e-02 1.9596e-02 6.1938e-01 9.7336e-03 3.3144e-03 5.8523e-01 1.2285e-01 9.2417e-02 4.6779e-02 2.0799e-02 1.4453e-02 1.0442e-01 +5.9200e-01 8.1784e+06 5.5315e+02 2.2973e+03 1.1594e-07 2.9483e-01 7.0517e-01 3.9952e+03 1.9506e+03 4.7986e+02 8.0331e+01 6.7827e-05 1.7352e-05 3.8845e-03 8.1014e-04 1.8259e-01 5.7014e-02 5.6321e-02 3.7313e-02 2.1560e-02 1.9575e-02 6.2093e-01 9.7333e-03 3.3139e-03 5.8517e-01 1.2285e-01 9.2427e-02 4.6788e-02 2.0805e-02 1.4458e-02 1.0444e-01 +5.9400e-01 8.1388e+06 5.5315e+02 2.2867e+03 1.1670e-07 2.9439e-01 7.0561e-01 3.9915e+03 1.9409e+03 4.8032e+02 7.9939e+01 6.7931e-05 1.7333e-05 3.8668e-03 8.0544e-04 1.8165e-01 5.6779e-02 5.6132e-02 3.7216e-02 2.1520e-02 1.9554e-02 6.2248e-01 9.7330e-03 3.3134e-03 5.8512e-01 1.2286e-01 9.2436e-02 4.6797e-02 2.0811e-02 1.4464e-02 1.0447e-01 +5.9600e-01 8.0992e+06 5.5315e+02 2.2761e+03 1.1746e-07 2.9394e-01 7.0606e-01 3.9878e+03 1.9311e+03 4.8077e+02 7.9547e+01 6.8036e-05 1.7315e-05 3.8491e-03 8.0075e-04 1.8070e-01 5.6544e-02 5.5942e-02 3.7118e-02 2.1480e-02 1.9532e-02 6.2403e-01 9.7327e-03 3.3128e-03 5.8505e-01 1.2286e-01 9.2446e-02 4.6807e-02 2.0818e-02 1.4470e-02 1.0450e-01 +5.9800e-01 8.0596e+06 5.5315e+02 2.2655e+03 1.1824e-07 2.9348e-01 7.0652e-01 3.9841e+03 1.9213e+03 4.8123e+02 7.9157e+01 6.8141e-05 1.7296e-05 3.8314e-03 7.9606e-04 1.7976e-01 5.6308e-02 5.5752e-02 3.7020e-02 2.1439e-02 1.9510e-02 6.2558e-01 9.7323e-03 3.3123e-03 5.8499e-01 1.2286e-01 9.2455e-02 4.6816e-02 2.0824e-02 1.4475e-02 1.0454e-01 +6.0000e-01 8.0200e+06 5.5315e+02 2.2549e+03 1.1902e-07 2.9301e-01 7.0699e-01 3.9803e+03 1.9115e+03 4.8169e+02 7.8767e+01 6.8246e-05 1.7278e-05 3.8136e-03 7.9138e-04 1.7882e-01 5.6072e-02 5.5560e-02 3.6921e-02 2.1398e-02 1.9487e-02 6.2714e-01 9.7319e-03 3.3117e-03 5.8492e-01 1.2286e-01 9.2464e-02 4.6825e-02 2.0830e-02 1.4481e-02 1.0457e-01 +6.0200e-01 7.9804e+06 5.5315e+02 2.2443e+03 1.1982e-07 2.9254e-01 7.0746e-01 3.9766e+03 1.9017e+03 4.8214e+02 7.8378e+01 6.8351e-05 1.7259e-05 3.7958e-03 7.8671e-04 1.7787e-01 5.5835e-02 5.5368e-02 3.6821e-02 2.1356e-02 1.9464e-02 6.2870e-01 9.7315e-03 3.3111e-03 5.8486e-01 1.2286e-01 9.2473e-02 4.6834e-02 2.0836e-02 1.4487e-02 1.0461e-01 +6.0400e-01 7.9408e+06 5.5315e+02 2.2336e+03 1.2062e-07 2.9205e-01 7.0795e-01 3.9729e+03 1.8919e+03 4.8260e+02 7.7990e+01 6.8456e-05 1.7241e-05 3.7780e-03 7.8205e-04 1.7693e-01 5.5597e-02 5.5175e-02 3.6721e-02 2.1314e-02 1.9440e-02 6.3026e-01 9.7310e-03 3.3105e-03 5.8479e-01 1.2286e-01 9.2481e-02 4.6843e-02 2.0842e-02 1.4492e-02 1.0465e-01 +6.0600e-01 7.9012e+06 5.5315e+02 2.2229e+03 1.2144e-07 2.9155e-01 7.0845e-01 3.9692e+03 1.8821e+03 4.8305e+02 7.7602e+01 6.8560e-05 1.7223e-05 3.7602e-03 7.7739e-04 1.7599e-01 5.5360e-02 5.4982e-02 3.6620e-02 2.1272e-02 1.9416e-02 6.3183e-01 9.7306e-03 3.3099e-03 5.8471e-01 1.2286e-01 9.2490e-02 4.6852e-02 2.0848e-02 1.4498e-02 1.0470e-01 +6.0800e-01 7.8616e+06 5.5315e+02 2.2122e+03 1.2226e-07 2.9105e-01 7.0895e-01 3.9655e+03 1.8724e+03 4.8351e+02 7.7216e+01 6.8665e-05 1.7204e-05 3.7424e-03 7.7274e-04 1.7504e-01 5.5121e-02 5.4787e-02 3.6519e-02 2.1229e-02 1.9392e-02 6.3339e-01 9.7300e-03 3.3093e-03 5.8464e-01 1.2286e-01 9.2498e-02 4.6861e-02 2.0854e-02 1.4504e-02 1.0474e-01 +6.1000e-01 7.8220e+06 5.5315e+02 2.2015e+03 1.2309e-07 2.9053e-01 7.0947e-01 3.9618e+03 1.8626e+03 4.8396e+02 7.6830e+01 6.8770e-05 1.7186e-05 3.7245e-03 7.6810e-04 1.7410e-01 5.4883e-02 5.4592e-02 3.6416e-02 2.1186e-02 1.9367e-02 6.3496e-01 9.7295e-03 3.3086e-03 5.8456e-01 1.2286e-01 9.2506e-02 4.6870e-02 2.0860e-02 1.4510e-02 1.0479e-01 +6.1200e-01 7.7824e+06 5.5315e+02 2.1908e+03 1.2394e-07 2.9001e-01 7.0999e-01 3.9581e+03 1.8528e+03 4.8441e+02 7.6444e+01 6.8875e-05 1.7168e-05 3.7067e-03 7.6347e-04 1.7316e-01 5.4644e-02 5.4396e-02 3.6313e-02 2.1142e-02 1.9342e-02 6.3654e-01 9.7289e-03 3.3080e-03 5.8448e-01 1.2286e-01 9.2514e-02 4.6879e-02 2.0867e-02 1.4516e-02 1.0485e-01 +6.1400e-01 7.7428e+06 5.5315e+02 2.1800e+03 1.2479e-07 2.8947e-01 7.1053e-01 3.9544e+03 1.8431e+03 4.8487e+02 7.6060e+01 6.8980e-05 1.7150e-05 3.6888e-03 7.5884e-04 1.7222e-01 5.4404e-02 5.4199e-02 3.6210e-02 2.1098e-02 1.9316e-02 6.3811e-01 9.7283e-03 3.3073e-03 5.8440e-01 1.2285e-01 9.2521e-02 4.6888e-02 2.0873e-02 1.4522e-02 1.0490e-01 +6.1600e-01 7.7032e+06 5.5315e+02 2.1692e+03 1.2566e-07 2.8893e-01 7.1107e-01 3.9507e+03 1.8333e+03 4.8532e+02 7.5676e+01 6.9085e-05 1.7132e-05 3.6709e-03 7.5422e-04 1.7128e-01 5.4164e-02 5.4001e-02 3.6105e-02 2.1053e-02 1.9290e-02 6.3969e-01 9.7276e-03 3.3066e-03 5.8432e-01 1.2285e-01 9.2528e-02 4.6896e-02 2.0879e-02 1.4528e-02 1.0496e-01 +6.1800e-01 7.6636e+06 5.5315e+02 2.1584e+03 1.2653e-07 2.8838e-01 7.1162e-01 3.9470e+03 1.8236e+03 4.8577e+02 7.5293e+01 6.9189e-05 1.7114e-05 3.6530e-03 7.4961e-04 1.7033e-01 5.3923e-02 5.3803e-02 3.6000e-02 2.1008e-02 1.9263e-02 6.4127e-01 9.7269e-03 3.3059e-03 5.8424e-01 1.2285e-01 9.2536e-02 4.6905e-02 2.0885e-02 1.4534e-02 1.0502e-01 +6.2000e-01 7.6240e+06 5.5315e+02 2.1476e+03 1.2742e-07 2.8781e-01 7.1219e-01 3.9433e+03 1.8138e+03 4.8622e+02 7.4911e+01 6.9294e-05 1.7097e-05 3.6350e-03 7.4500e-04 1.6939e-01 5.3682e-02 5.3604e-02 3.5895e-02 2.0962e-02 1.9237e-02 6.4285e-01 9.7262e-03 3.3052e-03 5.8415e-01 1.2285e-01 9.2542e-02 4.6914e-02 2.0892e-02 1.4540e-02 1.0509e-01 +6.2200e-01 7.5844e+06 5.5315e+02 2.1367e+03 1.2832e-07 2.8724e-01 7.1276e-01 3.9396e+03 1.8040e+03 4.8667e+02 7.4530e+01 6.9399e-05 1.7079e-05 3.6171e-03 7.4040e-04 1.6845e-01 5.3440e-02 5.3404e-02 3.5788e-02 2.0916e-02 1.9209e-02 6.4443e-01 9.7255e-03 3.3045e-03 5.8406e-01 1.2284e-01 9.2549e-02 4.6922e-02 2.0898e-02 1.4546e-02 1.0515e-01 +6.2400e-01 7.5448e+06 5.5315e+02 2.1259e+03 1.2923e-07 2.8665e-01 7.1335e-01 3.9359e+03 1.7943e+03 4.8712e+02 7.4149e+01 6.9504e-05 1.7061e-05 3.5991e-03 7.3581e-04 1.6751e-01 5.3198e-02 5.3203e-02 3.5681e-02 2.0870e-02 1.9181e-02 6.4602e-01 9.7247e-03 3.3038e-03 5.8397e-01 1.2284e-01 9.2555e-02 4.6931e-02 2.0904e-02 1.4552e-02 1.0522e-01 +6.2600e-01 7.5052e+06 5.5315e+02 2.1150e+03 1.3015e-07 2.8605e-01 7.1395e-01 3.9321e+03 1.7846e+03 4.8757e+02 7.3769e+01 6.9609e-05 1.7043e-05 3.5811e-03 7.3123e-04 1.6657e-01 5.2956e-02 5.3001e-02 3.5573e-02 2.0823e-02 1.9153e-02 6.4761e-01 9.7238e-03 3.3031e-03 5.8387e-01 1.2283e-01 9.2562e-02 4.6939e-02 2.0910e-02 1.4559e-02 1.0530e-01 +6.2800e-01 7.4656e+06 5.5315e+02 2.1041e+03 1.3108e-07 2.8545e-01 7.1455e-01 3.9284e+03 1.7748e+03 4.8801e+02 7.3390e+01 6.9714e-05 1.7026e-05 3.5631e-03 7.2665e-04 1.6563e-01 5.2713e-02 5.2799e-02 3.5465e-02 2.0775e-02 1.9124e-02 6.4920e-01 9.7230e-03 3.3023e-03 5.8378e-01 1.2283e-01 9.2568e-02 4.6948e-02 2.0917e-02 1.4565e-02 1.0537e-01 +6.3000e-01 7.4260e+06 5.5315e+02 2.0931e+03 1.3203e-07 2.8483e-01 7.1517e-01 3.9247e+03 1.7651e+03 4.8846e+02 7.3011e+01 6.9818e-05 1.7008e-05 3.5451e-03 7.2208e-04 1.6469e-01 5.2469e-02 5.2595e-02 3.5356e-02 2.0727e-02 1.9095e-02 6.5080e-01 9.7221e-03 3.3015e-03 5.8368e-01 1.2282e-01 9.2573e-02 4.6956e-02 2.0923e-02 1.4571e-02 1.0545e-01 +6.3200e-01 7.3864e+06 5.5315e+02 2.0822e+03 1.3299e-07 2.8420e-01 7.1580e-01 3.9210e+03 1.7553e+03 4.8891e+02 7.2633e+01 6.9923e-05 1.6991e-05 3.5270e-03 7.1752e-04 1.6376e-01 5.2225e-02 5.2391e-02 3.5246e-02 2.0679e-02 1.9065e-02 6.5239e-01 9.7211e-03 3.3007e-03 5.8358e-01 1.2282e-01 9.2579e-02 4.6964e-02 2.0929e-02 1.4578e-02 1.0553e-01 +6.3400e-01 7.3468e+06 5.5315e+02 2.0712e+03 1.3396e-07 2.8356e-01 7.1644e-01 3.9173e+03 1.7456e+03 4.8935e+02 7.2256e+01 7.0028e-05 1.6973e-05 3.5089e-03 7.1296e-04 1.6282e-01 5.1981e-02 5.2186e-02 3.5135e-02 2.0630e-02 1.9035e-02 6.5399e-01 9.7201e-03 3.2999e-03 5.8347e-01 1.2281e-01 9.2584e-02 4.6972e-02 2.0935e-02 1.4584e-02 1.0562e-01 +6.3600e-01 7.3072e+06 5.5315e+02 2.0602e+03 1.3494e-07 2.8291e-01 7.1709e-01 3.9136e+03 1.7359e+03 4.8980e+02 7.1879e+01 7.0133e-05 1.6956e-05 3.4909e-03 7.0841e-04 1.6188e-01 5.1736e-02 5.1981e-02 3.5024e-02 2.0581e-02 1.9004e-02 6.5560e-01 9.7191e-03 3.2991e-03 5.8337e-01 1.2281e-01 9.2589e-02 4.6981e-02 2.0942e-02 1.4590e-02 1.0571e-01 +6.3800e-01 7.2676e+06 5.5315e+02 2.0492e+03 1.3593e-07 2.8225e-01 7.1775e-01 3.9099e+03 1.7262e+03 4.9024e+02 7.1504e+01 7.0238e-05 1.6938e-05 3.4728e-03 7.0387e-04 1.6094e-01 5.1490e-02 5.1774e-02 3.4912e-02 2.0531e-02 1.8973e-02 6.5720e-01 9.7181e-03 3.2983e-03 5.8326e-01 1.2280e-01 9.2593e-02 4.6989e-02 2.0948e-02 1.4597e-02 1.0580e-01 +6.4000e-01 7.2280e+06 5.5315e+02 2.0381e+03 1.3694e-07 2.8158e-01 7.1842e-01 3.9062e+03 1.7164e+03 4.9069e+02 7.1128e+01 7.0343e-05 1.6921e-05 3.4546e-03 6.9934e-04 1.6000e-01 5.1244e-02 5.1567e-02 3.4799e-02 2.0480e-02 1.8942e-02 6.5881e-01 9.7170e-03 3.2975e-03 5.8315e-01 1.2279e-01 9.2598e-02 4.6997e-02 2.0954e-02 1.4603e-02 1.0590e-01 +6.4200e-01 7.1884e+06 5.5315e+02 2.0271e+03 1.3797e-07 2.8089e-01 7.1911e-01 3.9025e+03 1.7067e+03 4.9113e+02 7.0754e+01 7.0447e-05 1.6904e-05 3.4365e-03 6.9481e-04 1.5907e-01 5.0998e-02 5.1359e-02 3.4685e-02 2.0430e-02 1.8910e-02 6.6042e-01 9.7158e-03 3.2966e-03 5.8303e-01 1.2278e-01 9.2602e-02 4.7004e-02 2.0961e-02 1.4610e-02 1.0600e-01 +6.4400e-01 7.1488e+06 5.5315e+02 2.0160e+03 1.3900e-07 2.8019e-01 7.1981e-01 3.8987e+03 1.6970e+03 4.9157e+02 7.0380e+01 7.0552e-05 1.6887e-05 3.4183e-03 6.9029e-04 1.5813e-01 5.0751e-02 5.1150e-02 3.4571e-02 2.0378e-02 1.8877e-02 6.6204e-01 9.7147e-03 3.2957e-03 5.8292e-01 1.2278e-01 9.2606e-02 4.7012e-02 2.0967e-02 1.4616e-02 1.0610e-01 +6.4600e-01 7.1092e+06 5.5315e+02 2.0049e+03 1.4005e-07 2.7948e-01 7.2052e-01 3.8950e+03 1.6873e+03 4.9202e+02 7.0007e+01 7.0657e-05 1.6870e-05 3.4002e-03 6.8577e-04 1.5719e-01 5.0503e-02 5.0940e-02 3.4456e-02 2.0326e-02 1.8844e-02 6.6365e-01 9.7135e-03 3.2948e-03 5.8280e-01 1.2277e-01 9.2609e-02 4.7020e-02 2.0973e-02 1.4623e-02 1.0620e-01 +6.4800e-01 7.0696e+06 5.5315e+02 1.9938e+03 1.4112e-07 2.7876e-01 7.2124e-01 3.8913e+03 1.6776e+03 4.9246e+02 6.9635e+01 7.0762e-05 1.6852e-05 3.3820e-03 6.8127e-04 1.5626e-01 5.0255e-02 5.0729e-02 3.4340e-02 2.0274e-02 1.8811e-02 6.6527e-01 9.7122e-03 3.2939e-03 5.8268e-01 1.2276e-01 9.2612e-02 4.7027e-02 2.0979e-02 1.4630e-02 1.0631e-01 +6.5000e-01 7.0300e+06 5.5315e+02 1.9826e+03 1.4219e-07 2.7803e-01 7.2197e-01 3.8876e+03 1.6679e+03 4.9290e+02 6.9263e+01 7.0867e-05 1.6835e-05 3.3637e-03 6.7677e-04 1.5532e-01 5.0007e-02 5.0517e-02 3.4224e-02 2.0221e-02 1.8777e-02 6.6689e-01 9.7109e-03 3.2930e-03 5.8255e-01 1.2275e-01 9.2615e-02 4.7035e-02 2.0986e-02 1.4636e-02 1.0642e-01 +6.5200e-01 6.9904e+06 5.5315e+02 1.9714e+03 1.4329e-07 2.7728e-01 7.2272e-01 3.8839e+03 1.6582e+03 4.9334e+02 6.8892e+01 7.0972e-05 1.6818e-05 3.3455e-03 6.7227e-04 1.5438e-01 4.9758e-02 5.0305e-02 3.4107e-02 2.0168e-02 1.8742e-02 6.6852e-01 9.7096e-03 3.2921e-03 5.8243e-01 1.2274e-01 9.2618e-02 4.7042e-02 2.0992e-02 1.4643e-02 1.0654e-01 +6.5400e-01 6.9508e+06 5.5315e+02 1.9602e+03 1.4440e-07 2.7652e-01 7.2348e-01 3.8802e+03 1.6485e+03 4.9378e+02 6.8522e+01 7.1077e-05 1.6801e-05 3.3273e-03 6.6779e-04 1.5345e-01 4.9509e-02 5.0092e-02 3.3989e-02 2.0114e-02 1.8707e-02 6.7015e-01 9.7082e-03 3.2912e-03 5.8230e-01 1.2273e-01 9.2620e-02 4.7050e-02 2.0998e-02 1.4650e-02 1.0666e-01 +6.5600e-01 6.9112e+06 5.5315e+02 1.9490e+03 1.4552e-07 2.7575e-01 7.2425e-01 3.8765e+03 1.6388e+03 4.9422e+02 6.8152e+01 7.1181e-05 1.6784e-05 3.3090e-03 6.6331e-04 1.5251e-01 4.9259e-02 4.9878e-02 3.3870e-02 2.0059e-02 1.8672e-02 6.7178e-01 9.7068e-03 3.2902e-03 5.8216e-01 1.2271e-01 9.2622e-02 4.7057e-02 2.1004e-02 1.4656e-02 1.0678e-01 +6.5800e-01 6.8716e+06 5.5315e+02 1.9378e+03 1.4666e-07 2.7496e-01 7.2504e-01 3.8727e+03 1.6291e+03 4.9466e+02 6.7783e+01 7.1286e-05 1.6767e-05 3.2907e-03 6.5883e-04 1.5158e-01 4.9008e-02 4.9663e-02 3.3750e-02 2.0005e-02 1.8636e-02 6.7341e-01 9.7053e-03 3.2892e-03 5.8203e-01 1.2270e-01 9.2624e-02 4.7064e-02 2.1011e-02 1.4663e-02 1.0691e-01 +6.6000e-01 6.8320e+06 5.5315e+02 1.9265e+03 1.4781e-07 2.7416e-01 7.2584e-01 3.8690e+03 1.6194e+03 4.9510e+02 6.7415e+01 7.1391e-05 1.6750e-05 3.2724e-03 6.5437e-04 1.5064e-01 4.8757e-02 4.9447e-02 3.3630e-02 1.9949e-02 1.8599e-02 6.7505e-01 9.7038e-03 3.2882e-03 5.8189e-01 1.2269e-01 9.2625e-02 4.7071e-02 2.1017e-02 1.4670e-02 1.0704e-01 +6.6200e-01 6.7924e+06 5.5315e+02 1.9152e+03 1.4898e-07 2.7335e-01 7.2665e-01 3.8653e+03 1.6097e+03 4.9554e+02 6.7047e+01 7.1496e-05 1.6734e-05 3.2541e-03 6.4991e-04 1.4971e-01 4.8506e-02 4.9230e-02 3.3509e-02 1.9893e-02 1.8562e-02 6.7669e-01 9.7023e-03 3.2872e-03 5.8175e-01 1.2268e-01 9.2626e-02 4.7078e-02 2.1023e-02 1.4677e-02 1.0718e-01 +6.6400e-01 6.7528e+06 5.5315e+02 1.9039e+03 1.5017e-07 2.7253e-01 7.2747e-01 3.8616e+03 1.6000e+03 4.9598e+02 6.6680e+01 7.1601e-05 1.6717e-05 3.2357e-03 6.4546e-04 1.4877e-01 4.8254e-02 4.9013e-02 3.3387e-02 1.9837e-02 1.8524e-02 6.7833e-01 9.7007e-03 3.2862e-03 5.8161e-01 1.2266e-01 9.2627e-02 4.7084e-02 2.1029e-02 1.4684e-02 1.0731e-01 +6.6600e-01 6.7132e+06 5.5315e+02 1.8926e+03 1.5138e-07 2.7169e-01 7.2831e-01 3.8579e+03 1.5904e+03 4.9642e+02 6.6313e+01 7.1706e-05 1.6700e-05 3.2173e-03 6.4101e-04 1.4784e-01 4.8001e-02 4.8794e-02 3.3265e-02 1.9780e-02 1.8486e-02 6.7998e-01 9.6990e-03 3.2852e-03 5.8146e-01 1.2265e-01 9.2627e-02 4.7091e-02 2.1035e-02 1.4691e-02 1.0746e-01 +6.6800e-01 6.6736e+06 5.5315e+02 1.8812e+03 1.5260e-07 2.7083e-01 7.2917e-01 3.8542e+03 1.5807e+03 4.9685e+02 6.5947e+01 7.1811e-05 1.6683e-05 3.1990e-03 6.3657e-04 1.4691e-01 4.7748e-02 4.8575e-02 3.3141e-02 1.9722e-02 1.8447e-02 6.8163e-01 9.6973e-03 3.2841e-03 5.8132e-01 1.2264e-01 9.2627e-02 4.7098e-02 2.1042e-02 1.4698e-02 1.0760e-01 +6.7000e-01 6.6340e+06 5.5315e+02 1.8698e+03 1.5384e-07 2.6996e-01 7.3004e-01 3.8505e+03 1.5710e+03 4.9729e+02 6.5582e+01 7.1916e-05 1.6666e-05 3.1806e-03 6.3214e-04 1.4597e-01 4.7495e-02 4.8355e-02 3.3017e-02 1.9664e-02 1.8408e-02 6.8328e-01 9.6956e-03 3.2830e-03 5.8116e-01 1.2262e-01 9.2627e-02 4.7104e-02 2.1048e-02 1.4705e-02 1.0775e-01 +6.7200e-01 6.5944e+06 5.5315e+02 1.8584e+03 1.5510e-07 2.6908e-01 7.3092e-01 3.8467e+03 1.5613e+03 4.9772e+02 6.5218e+01 7.2020e-05 1.6650e-05 3.1621e-03 6.2771e-04 1.4504e-01 4.7241e-02 4.8134e-02 3.2892e-02 1.9605e-02 1.8368e-02 6.8493e-01 9.6938e-03 3.2819e-03 5.8101e-01 1.2261e-01 9.2626e-02 4.7110e-02 2.1054e-02 1.4712e-02 1.0791e-01 +6.7400e-01 6.5548e+06 5.5315e+02 1.8470e+03 1.5637e-07 2.6818e-01 7.3182e-01 3.8430e+03 1.5517e+03 4.9816e+02 6.4854e+01 7.2125e-05 1.6633e-05 3.1437e-03 6.2329e-04 1.4411e-01 4.6986e-02 4.7912e-02 3.2766e-02 1.9546e-02 1.8328e-02 6.8659e-01 9.6920e-03 3.2808e-03 5.8085e-01 1.2259e-01 9.2625e-02 4.7116e-02 2.1060e-02 1.4719e-02 1.0807e-01 +6.7600e-01 6.5152e+06 5.5315e+02 1.8356e+03 1.5767e-07 2.6727e-01 7.3273e-01 3.8393e+03 1.5420e+03 4.9860e+02 6.4491e+01 7.2230e-05 1.6616e-05 3.1252e-03 6.1888e-04 1.4317e-01 4.6731e-02 4.7689e-02 3.2640e-02 1.9486e-02 1.8287e-02 6.8825e-01 9.6901e-03 3.2797e-03 5.8069e-01 1.2257e-01 9.2623e-02 4.7122e-02 2.1066e-02 1.4726e-02 1.0823e-01 +6.7800e-01 6.4756e+06 5.5315e+02 1.8241e+03 1.5898e-07 2.6634e-01 7.3366e-01 3.8356e+03 1.5324e+03 4.9903e+02 6.4128e+01 7.2335e-05 1.6600e-05 3.1068e-03 6.1447e-04 1.4224e-01 4.6476e-02 4.7465e-02 3.2513e-02 1.9426e-02 1.8246e-02 6.8991e-01 9.6882e-03 3.2786e-03 5.8053e-01 1.2255e-01 9.2622e-02 4.7128e-02 2.1072e-02 1.4733e-02 1.0840e-01 +6.8000e-01 6.4360e+06 5.5315e+02 1.8126e+03 1.6031e-07 2.6540e-01 7.3460e-01 3.8319e+03 1.5227e+03 4.9946e+02 6.3766e+01 7.2440e-05 1.6583e-05 3.0883e-03 6.1007e-04 1.4131e-01 4.6220e-02 4.7241e-02 3.2385e-02 1.9365e-02 1.8204e-02 6.9158e-01 9.6862e-03 3.2774e-03 5.8036e-01 1.2254e-01 9.2619e-02 4.7134e-02 2.1078e-02 1.4740e-02 1.0857e-01 +6.8200e-01 6.3964e+06 5.5315e+02 1.8011e+03 1.6166e-07 2.6444e-01 7.3556e-01 3.8282e+03 1.5130e+03 4.9990e+02 6.3404e+01 7.2545e-05 1.6567e-05 3.0697e-03 6.0568e-04 1.4038e-01 4.5963e-02 4.7016e-02 3.2256e-02 1.9304e-02 1.8161e-02 6.9325e-01 9.6841e-03 3.2762e-03 5.8019e-01 1.2252e-01 9.2617e-02 4.7139e-02 2.1084e-02 1.4747e-02 1.0874e-01 +6.8400e-01 6.3568e+06 5.5315e+02 1.7895e+03 1.6304e-07 2.6346e-01 7.3654e-01 3.8244e+03 1.5034e+03 5.0033e+02 6.3044e+01 7.2650e-05 1.6550e-05 3.0512e-03 6.0129e-04 1.3944e-01 4.5706e-02 4.6789e-02 3.2126e-02 1.9242e-02 1.8118e-02 6.9492e-01 9.6821e-03 3.2750e-03 5.8002e-01 1.2250e-01 9.2614e-02 4.7145e-02 2.1090e-02 1.4754e-02 1.0892e-01 +6.8600e-01 6.3172e+06 5.5315e+02 1.7780e+03 1.6443e-07 2.6247e-01 7.3753e-01 3.8207e+03 1.4938e+03 5.0076e+02 6.2683e+01 7.2754e-05 1.6534e-05 3.0327e-03 5.9691e-04 1.3851e-01 4.5448e-02 4.6562e-02 3.1995e-02 1.9179e-02 1.8074e-02 6.9660e-01 9.6799e-03 3.2738e-03 5.7984e-01 1.2248e-01 9.2610e-02 4.7150e-02 2.1096e-02 1.4761e-02 1.0911e-01 +6.8800e-01 6.2776e+06 5.5315e+02 1.7664e+03 1.6584e-07 2.6146e-01 7.3854e-01 3.8170e+03 1.4841e+03 5.0120e+02 6.2324e+01 7.2859e-05 1.6517e-05 3.0141e-03 5.9253e-04 1.3758e-01 4.5190e-02 4.6334e-02 3.1864e-02 1.9116e-02 1.8030e-02 6.9828e-01 9.6777e-03 3.2726e-03 5.7966e-01 1.2246e-01 9.2606e-02 4.7155e-02 2.1102e-02 1.4768e-02 1.0930e-01 +6.9000e-01 6.2380e+06 5.5315e+02 1.7548e+03 1.6728e-07 2.6043e-01 7.3957e-01 3.8133e+03 1.4745e+03 5.0163e+02 6.1965e+01 7.2964e-05 1.6501e-05 2.9955e-03 5.8817e-04 1.3665e-01 4.4932e-02 4.6105e-02 3.1732e-02 1.9052e-02 1.7985e-02 6.9996e-01 9.6755e-03 3.2713e-03 5.7948e-01 1.2244e-01 9.2602e-02 4.7160e-02 2.1108e-02 1.4775e-02 1.0949e-01 +6.9200e-01 6.1984e+06 5.5315e+02 1.7431e+03 1.6874e-07 2.5939e-01 7.4061e-01 3.8096e+03 1.4648e+03 5.0206e+02 6.1606e+01 7.3069e-05 1.6484e-05 2.9769e-03 5.8380e-04 1.3572e-01 4.4673e-02 4.5875e-02 3.1599e-02 1.8988e-02 1.7939e-02 7.0164e-01 9.6732e-03 3.2700e-03 5.7929e-01 1.2242e-01 9.2597e-02 4.7165e-02 2.1114e-02 1.4783e-02 1.0969e-01 +6.9400e-01 6.1588e+06 5.5315e+02 1.7315e+03 1.7022e-07 2.5832e-01 7.4168e-01 3.8058e+03 1.4552e+03 5.0249e+02 6.1248e+01 7.3174e-05 1.6468e-05 2.9582e-03 5.7945e-04 1.3479e-01 4.4413e-02 4.5644e-02 3.1465e-02 1.8923e-02 1.7893e-02 7.0333e-01 9.6708e-03 3.2688e-03 5.7910e-01 1.2239e-01 9.2592e-02 4.7169e-02 2.1120e-02 1.4790e-02 1.0989e-01 +6.9600e-01 6.1192e+06 5.5315e+02 1.7198e+03 1.7172e-07 2.5725e-01 7.4275e-01 3.8021e+03 1.4456e+03 5.0292e+02 6.0891e+01 7.3279e-05 1.6451e-05 2.9396e-03 5.7510e-04 1.3386e-01 4.4153e-02 4.5413e-02 3.1330e-02 1.8857e-02 1.7847e-02 7.0503e-01 9.6684e-03 3.2674e-03 5.7891e-01 1.2237e-01 9.2586e-02 4.7174e-02 2.1125e-02 1.4797e-02 1.1010e-01 +6.9800e-01 6.0796e+06 5.5315e+02 1.7081e+03 1.7325e-07 2.5615e-01 7.4385e-01 3.7984e+03 1.4360e+03 5.0335e+02 6.0535e+01 7.3384e-05 1.6435e-05 2.9209e-03 5.7076e-04 1.3293e-01 4.3892e-02 4.5180e-02 3.1195e-02 1.8791e-02 1.7799e-02 7.0672e-01 9.6659e-03 3.2661e-03 5.7871e-01 1.2235e-01 9.2580e-02 4.7178e-02 2.1131e-02 1.4804e-02 1.1032e-01 +7.0000e-01 6.0400e+06 5.5315e+02 1.6964e+03 1.7480e-07 2.5503e-01 7.4497e-01 3.7947e+03 1.4263e+03 5.0378e+02 6.0179e+01 7.3489e-05 1.6418e-05 2.9022e-03 5.6642e-04 1.3200e-01 4.3631e-02 4.4946e-02 3.1059e-02 1.8725e-02 1.7751e-02 7.0842e-01 9.6634e-03 3.2648e-03 5.7851e-01 1.2232e-01 9.2573e-02 4.7182e-02 2.1137e-02 1.4812e-02 1.1054e-01 +7.0200e-01 6.0004e+06 5.5315e+02 1.6846e+03 1.7637e-07 2.5390e-01 7.4610e-01 3.7910e+03 1.4167e+03 5.0421e+02 5.9823e+01 7.3593e-05 1.6402e-05 2.8835e-03 5.6209e-04 1.3107e-01 4.3369e-02 4.4712e-02 3.0921e-02 1.8657e-02 1.7703e-02 7.1012e-01 9.6608e-03 3.2634e-03 5.7831e-01 1.2230e-01 9.2566e-02 4.7186e-02 2.1142e-02 1.4819e-02 1.1076e-01 +7.0400e-01 5.9608e+06 5.5315e+02 1.6728e+03 1.7797e-07 2.5274e-01 7.4726e-01 3.7873e+03 1.4071e+03 5.0464e+02 5.9468e+01 7.3698e-05 1.6385e-05 2.8648e-03 5.5777e-04 1.3014e-01 4.3107e-02 4.4477e-02 3.0783e-02 1.8589e-02 1.7654e-02 7.1183e-01 9.6582e-03 3.2620e-03 5.7810e-01 1.2227e-01 9.2558e-02 4.7189e-02 2.1148e-02 1.4826e-02 1.1099e-01 +7.0600e-01 5.9212e+06 5.5315e+02 1.6610e+03 1.7960e-07 2.5157e-01 7.4843e-01 3.7835e+03 1.3975e+03 5.0506e+02 5.9114e+01 7.3803e-05 1.6369e-05 2.8461e-03 5.5345e-04 1.2921e-01 4.2844e-02 4.4240e-02 3.0645e-02 1.8521e-02 1.7604e-02 7.1353e-01 9.6554e-03 3.2606e-03 5.7789e-01 1.2224e-01 9.2550e-02 4.7193e-02 2.1153e-02 1.4833e-02 1.1122e-01 +7.0800e-01 5.8816e+06 5.5315e+02 1.6492e+03 1.8125e-07 2.5037e-01 7.4963e-01 3.7798e+03 1.3879e+03 5.0549e+02 5.8760e+01 7.3908e-05 1.6353e-05 2.8273e-03 5.4914e-04 1.2828e-01 4.2581e-02 4.4003e-02 3.0505e-02 1.8452e-02 1.7553e-02 7.1525e-01 9.6527e-03 3.2591e-03 5.7767e-01 1.2221e-01 9.2541e-02 4.7196e-02 2.1159e-02 1.4841e-02 1.1146e-01 +7.1000e-01 5.8420e+06 5.5315e+02 1.6373e+03 1.8293e-07 2.4916e-01 7.5084e-01 3.7761e+03 1.3783e+03 5.0592e+02 5.8407e+01 7.4013e-05 1.6336e-05 2.8085e-03 5.4484e-04 1.2736e-01 4.2317e-02 4.3765e-02 3.0364e-02 1.8382e-02 1.7502e-02 7.1696e-01 9.6498e-03 3.2577e-03 5.7745e-01 1.2219e-01 9.2532e-02 4.7199e-02 2.1164e-02 1.4848e-02 1.1171e-01 +7.1200e-01 5.8024e+06 5.5315e+02 1.6255e+03 1.8463e-07 2.4792e-01 7.5208e-01 3.7724e+03 1.3687e+03 5.0635e+02 5.8055e+01 7.4118e-05 1.6320e-05 2.7897e-03 5.4054e-04 1.2643e-01 4.2052e-02 4.3526e-02 3.0223e-02 1.8312e-02 1.7450e-02 7.1868e-01 9.6469e-03 3.2562e-03 5.7723e-01 1.2216e-01 9.2522e-02 4.7202e-02 2.1170e-02 1.4855e-02 1.1196e-01 +7.1400e-01 5.7628e+06 5.5315e+02 1.6136e+03 1.8637e-07 2.4666e-01 7.5334e-01 3.7686e+03 1.3591e+03 5.0677e+02 5.7703e+01 7.4222e-05 1.6304e-05 2.7709e-03 5.3624e-04 1.2550e-01 4.1788e-02 4.3286e-02 3.0080e-02 1.8241e-02 1.7398e-02 7.2040e-01 9.6440e-03 3.2547e-03 5.7700e-01 1.2213e-01 9.2512e-02 4.7204e-02 2.1175e-02 1.4862e-02 1.1222e-01 +7.1600e-01 5.7232e+06 5.5315e+02 1.6017e+03 1.8813e-07 2.4538e-01 7.5462e-01 3.7649e+03 1.3495e+03 5.0720e+02 5.7351e+01 7.4327e-05 1.6287e-05 2.7520e-03 5.3196e-04 1.2457e-01 4.1522e-02 4.3045e-02 2.9937e-02 1.8169e-02 1.7345e-02 7.2213e-01 9.6409e-03 3.2532e-03 5.7677e-01 1.2210e-01 9.2501e-02 4.7207e-02 2.1180e-02 1.4870e-02 1.1248e-01 +7.1800e-01 5.6836e+06 5.5315e+02 1.5897e+03 1.8992e-07 2.4408e-01 7.5592e-01 3.7612e+03 1.3399e+03 5.0762e+02 5.7000e+01 7.4432e-05 1.6271e-05 2.7332e-03 5.2768e-04 1.2364e-01 4.1256e-02 4.2803e-02 2.9793e-02 1.8097e-02 1.7291e-02 7.2386e-01 9.6378e-03 3.2516e-03 5.7654e-01 1.2206e-01 9.2490e-02 4.7209e-02 2.1185e-02 1.4877e-02 1.1275e-01 +7.2000e-01 5.6440e+06 5.5315e+02 1.5777e+03 1.9174e-07 2.4276e-01 7.5724e-01 3.7575e+03 1.3303e+03 5.0805e+02 5.6650e+01 7.4537e-05 1.6254e-05 2.7143e-03 5.2340e-04 1.2272e-01 4.0990e-02 4.2560e-02 2.9648e-02 1.8024e-02 1.7237e-02 7.2559e-01 9.6346e-03 3.2500e-03 5.7630e-01 1.2203e-01 9.2478e-02 4.7211e-02 2.1190e-02 1.4884e-02 1.1303e-01 +7.2200e-01 5.6044e+06 5.5315e+02 1.5658e+03 1.9359e-07 2.4141e-01 7.5859e-01 3.7538e+03 1.3208e+03 5.0847e+02 5.6300e+01 7.4642e-05 1.6238e-05 2.6954e-03 5.1914e-04 1.2179e-01 4.0723e-02 4.2317e-02 2.9502e-02 1.7950e-02 1.7181e-02 7.2732e-01 9.6314e-03 3.2484e-03 5.7605e-01 1.2200e-01 9.2465e-02 4.7212e-02 2.1195e-02 1.4892e-02 1.1331e-01 +7.2400e-01 5.5648e+06 5.5315e+02 1.5537e+03 1.9548e-07 2.4004e-01 7.5996e-01 3.7500e+03 1.3112e+03 5.0890e+02 5.5951e+01 7.4746e-05 1.6221e-05 2.6765e-03 5.1488e-04 1.2086e-01 4.0455e-02 4.2072e-02 2.9356e-02 1.7876e-02 1.7126e-02 7.2906e-01 9.6281e-03 3.2468e-03 5.7580e-01 1.2196e-01 9.2452e-02 4.7213e-02 2.1200e-02 1.4899e-02 1.1359e-01 +7.2600e-01 5.5252e+06 5.5315e+02 1.5417e+03 1.9739e-07 2.3864e-01 7.6136e-01 3.7463e+03 1.3016e+03 5.0932e+02 5.5602e+01 7.4851e-05 1.6205e-05 2.6575e-03 5.1062e-04 1.1994e-01 4.0187e-02 4.1826e-02 2.9208e-02 1.7801e-02 1.7069e-02 7.3080e-01 9.6247e-03 3.2452e-03 5.7555e-01 1.2193e-01 9.2438e-02 4.7214e-02 2.1205e-02 1.4906e-02 1.1389e-01 +7.2800e-01 5.4856e+06 5.5315e+02 1.5296e+03 1.9934e-07 2.3722e-01 7.6278e-01 3.7426e+03 1.2920e+03 5.0975e+02 5.5254e+01 7.4956e-05 1.6189e-05 2.6386e-03 5.0637e-04 1.1901e-01 3.9918e-02 4.1580e-02 2.9060e-02 1.7726e-02 1.7012e-02 7.3255e-01 9.6212e-03 3.2435e-03 5.7529e-01 1.2189e-01 9.2423e-02 4.7215e-02 2.1210e-02 1.4913e-02 1.1419e-01 +7.3000e-01 5.4460e+06 5.5315e+02 1.5175e+03 2.0132e-07 2.3578e-01 7.6422e-01 3.7389e+03 1.2825e+03 5.1017e+02 5.4906e+01 7.5061e-05 1.6172e-05 2.6196e-03 5.0213e-04 1.1808e-01 3.9649e-02 4.1332e-02 2.8910e-02 1.7650e-02 1.6954e-02 7.3430e-01 9.6176e-03 3.2418e-03 5.7503e-01 1.2186e-01 9.2408e-02 4.7216e-02 2.1215e-02 1.4921e-02 1.1450e-01 +7.3200e-01 5.4064e+06 5.5315e+02 1.5054e+03 2.0334e-07 2.3431e-01 7.6569e-01 3.7352e+03 1.2729e+03 5.1059e+02 5.4559e+01 7.5166e-05 1.6156e-05 2.6006e-03 4.9789e-04 1.1716e-01 3.9379e-02 4.1084e-02 2.8760e-02 1.7573e-02 1.6895e-02 7.3605e-01 9.6140e-03 3.2401e-03 5.7476e-01 1.2182e-01 9.2392e-02 4.7216e-02 2.1219e-02 1.4928e-02 1.1481e-01 +7.3400e-01 5.3668e+06 5.5315e+02 1.4933e+03 2.0539e-07 2.3281e-01 7.6719e-01 3.7314e+03 1.2634e+03 5.1102e+02 5.4213e+01 7.5270e-05 1.6139e-05 2.5816e-03 4.9366e-04 1.1623e-01 3.9109e-02 4.0834e-02 2.8609e-02 1.7495e-02 1.6836e-02 7.3781e-01 9.6103e-03 3.2383e-03 5.7449e-01 1.2178e-01 9.2375e-02 4.7216e-02 2.1224e-02 1.4935e-02 1.1513e-01 +7.3600e-01 5.3272e+06 5.5315e+02 1.4811e+03 2.0748e-07 2.3129e-01 7.6871e-01 3.7277e+03 1.2538e+03 5.1144e+02 5.3867e+01 7.5375e-05 1.6123e-05 2.5625e-03 4.8943e-04 1.1531e-01 3.8838e-02 4.0584e-02 2.8456e-02 1.7417e-02 1.6776e-02 7.3957e-01 9.6065e-03 3.2365e-03 5.7421e-01 1.2174e-01 9.2358e-02 4.7215e-02 2.1228e-02 1.4942e-02 1.1546e-01 +7.3800e-01 5.2876e+06 5.5315e+02 1.4690e+03 2.0961e-07 2.2974e-01 7.7026e-01 3.7240e+03 1.2442e+03 5.1186e+02 5.3522e+01 7.5480e-05 1.6106e-05 2.5435e-03 4.8522e-04 1.1438e-01 3.8567e-02 4.0332e-02 2.8303e-02 1.7338e-02 1.6715e-02 7.4133e-01 9.6027e-03 3.2347e-03 5.7393e-01 1.2170e-01 9.2340e-02 4.7214e-02 2.1232e-02 1.4949e-02 1.1580e-01 +7.4000e-01 5.2480e+06 5.5315e+02 1.4568e+03 2.1177e-07 2.2816e-01 7.7184e-01 3.7203e+03 1.2347e+03 5.1228e+02 5.3177e+01 7.5584e-05 1.6090e-05 2.5244e-03 4.8100e-04 1.1346e-01 3.8295e-02 4.0080e-02 2.8149e-02 1.7259e-02 1.6654e-02 7.4310e-01 9.5987e-03 3.2329e-03 5.7365e-01 1.2165e-01 9.2321e-02 4.7213e-02 2.1237e-02 1.4956e-02 1.1614e-01 +7.4200e-01 5.2084e+06 5.5315e+02 1.4445e+03 2.1397e-07 2.2655e-01 7.7345e-01 3.7165e+03 1.2252e+03 5.1270e+02 5.2832e+01 7.5689e-05 1.6073e-05 2.5053e-03 4.7679e-04 1.1253e-01 3.8023e-02 3.9826e-02 2.7994e-02 1.7179e-02 1.6592e-02 7.4487e-01 9.5947e-03 3.2310e-03 5.7335e-01 1.2161e-01 9.2302e-02 4.7212e-02 2.1241e-02 1.4963e-02 1.1649e-01 +7.4400e-01 5.1688e+06 5.5315e+02 1.4323e+03 2.1622e-07 2.2491e-01 7.7509e-01 3.7128e+03 1.2156e+03 5.1312e+02 5.2488e+01 7.5794e-05 1.6056e-05 2.4862e-03 4.7259e-04 1.1161e-01 3.7750e-02 3.9572e-02 2.7838e-02 1.7098e-02 1.6529e-02 7.4665e-01 9.5905e-03 3.2291e-03 5.7306e-01 1.2157e-01 9.2281e-02 4.7210e-02 2.1245e-02 1.4970e-02 1.1685e-01 +7.4600e-01 5.1292e+06 5.5315e+02 1.4200e+03 2.1850e-07 2.2325e-01 7.7675e-01 3.7091e+03 1.2061e+03 5.1354e+02 5.2145e+01 7.5899e-05 1.6040e-05 2.4671e-03 4.6840e-04 1.1068e-01 3.7476e-02 3.9317e-02 2.7682e-02 1.7016e-02 1.6465e-02 7.4843e-01 9.5863e-03 3.2272e-03 5.7275e-01 1.2152e-01 9.2260e-02 4.7208e-02 2.1249e-02 1.4978e-02 1.1722e-01 +7.4800e-01 5.0896e+06 5.5315e+02 1.4077e+03 2.2083e-07 2.2155e-01 7.7845e-01 3.7054e+03 1.1965e+03 5.1396e+02 5.1802e+01 7.6003e-05 1.6023e-05 2.4479e-03 4.6421e-04 1.0976e-01 3.7202e-02 3.9060e-02 2.7524e-02 1.6934e-02 1.6400e-02 7.5021e-01 9.5820e-03 3.2253e-03 5.7245e-01 1.2148e-01 9.2238e-02 4.7206e-02 2.1252e-02 1.4985e-02 1.1759e-01 +7.5000e-01 5.0500e+06 5.5315e+02 1.3954e+03 2.2320e-07 2.1982e-01 7.8018e-01 3.7016e+03 1.1870e+03 5.1438e+02 5.1460e+01 7.6108e-05 1.6006e-05 2.4288e-03 4.6003e-04 1.0883e-01 3.6928e-02 3.8803e-02 2.7365e-02 1.6851e-02 1.6335e-02 7.5200e-01 9.5776e-03 3.2233e-03 5.7213e-01 1.2143e-01 9.2216e-02 4.7203e-02 2.1256e-02 1.4991e-02 1.1797e-01 +7.5200e-01 5.0104e+06 5.5315e+02 1.3830e+03 2.2561e-07 2.1805e-01 7.8195e-01 3.6979e+03 1.1775e+03 5.1480e+02 5.1118e+01 7.6212e-05 1.5990e-05 2.4096e-03 4.5585e-04 1.0791e-01 3.6653e-02 3.8545e-02 2.7206e-02 1.6767e-02 1.6269e-02 7.5379e-01 9.5731e-03 3.2212e-03 5.7181e-01 1.2138e-01 9.2192e-02 4.7200e-02 2.1259e-02 1.4998e-02 1.1836e-01 +7.5400e-01 4.9708e+06 5.5315e+02 1.3707e+03 2.2807e-07 2.1626e-01 7.8374e-01 3.6942e+03 1.1680e+03 5.1522e+02 5.0777e+01 7.6317e-05 1.5973e-05 2.3903e-03 4.5168e-04 1.0699e-01 3.6377e-02 3.8285e-02 2.7045e-02 1.6682e-02 1.6202e-02 7.5558e-01 9.5685e-03 3.2192e-03 5.7149e-01 1.2133e-01 9.2167e-02 4.7196e-02 2.1263e-02 1.5005e-02 1.1876e-01 +7.5600e-01 4.9312e+06 5.5315e+02 1.3583e+03 2.3058e-07 2.1443e-01 7.8557e-01 3.6905e+03 1.1585e+03 5.1564e+02 5.0436e+01 7.6422e-05 1.5956e-05 2.3711e-03 4.4751e-04 1.0606e-01 3.6101e-02 3.8025e-02 2.6883e-02 1.6597e-02 1.6134e-02 7.5738e-01 9.5638e-03 3.2171e-03 5.7116e-01 1.2128e-01 9.2142e-02 4.7192e-02 2.1266e-02 1.5012e-02 1.1917e-01 +7.5800e-01 4.8916e+06 5.5315e+02 1.3459e+03 2.3313e-07 2.1257e-01 7.8743e-01 3.6867e+03 1.1489e+03 5.1606e+02 5.0096e+01 7.6526e-05 1.5939e-05 2.3519e-03 4.4335e-04 1.0514e-01 3.5824e-02 3.7764e-02 2.6721e-02 1.6511e-02 1.6066e-02 7.5918e-01 9.5590e-03 3.2150e-03 5.7082e-01 1.2122e-01 9.2116e-02 4.7188e-02 2.1269e-02 1.5019e-02 1.1959e-01 +7.6000e-01 4.8520e+06 5.5315e+02 1.3334e+03 2.3574e-07 2.1067e-01 7.8933e-01 3.6830e+03 1.1394e+03 5.1647e+02 4.9756e+01 7.6631e-05 1.5922e-05 2.3326e-03 4.3920e-04 1.0422e-01 3.5547e-02 3.7502e-02 2.6557e-02 1.6425e-02 1.5997e-02 7.6098e-01 9.5541e-03 3.2128e-03 5.7048e-01 1.2117e-01 9.2089e-02 4.7183e-02 2.1272e-02 1.5025e-02 1.2002e-01 +7.6200e-01 4.8124e+06 5.5315e+02 1.3210e+03 2.3839e-07 2.0873e-01 7.9127e-01 3.6793e+03 1.1299e+03 5.1689e+02 4.9417e+01 7.6735e-05 1.5905e-05 2.3133e-03 4.3505e-04 1.0329e-01 3.5269e-02 3.7238e-02 2.6393e-02 1.6337e-02 1.5926e-02 7.6279e-01 9.5491e-03 3.2106e-03 5.7013e-01 1.2111e-01 9.2060e-02 4.7177e-02 2.1275e-02 1.5032e-02 1.2045e-01 +7.6400e-01 4.7728e+06 5.5315e+02 1.3085e+03 2.4110e-07 2.0676e-01 7.9324e-01 3.6755e+03 1.1204e+03 5.1731e+02 4.9078e+01 7.6840e-05 1.5888e-05 2.2940e-03 4.3091e-04 1.0237e-01 3.4990e-02 3.6974e-02 2.6227e-02 1.6249e-02 1.5855e-02 7.6461e-01 9.5440e-03 3.2084e-03 5.6977e-01 1.2106e-01 9.2031e-02 4.7172e-02 2.1277e-02 1.5039e-02 1.2090e-01 +7.6600e-01 4.7332e+06 5.5315e+02 1.2960e+03 2.4386e-07 2.0475e-01 7.9525e-01 3.6718e+03 1.1109e+03 5.1773e+02 4.8740e+01 7.6944e-05 1.5871e-05 2.2747e-03 4.2677e-04 1.0145e-01 3.4711e-02 3.6709e-02 2.6061e-02 1.6160e-02 1.5784e-02 7.6642e-01 9.5388e-03 3.2061e-03 5.6941e-01 1.2100e-01 9.2001e-02 4.7165e-02 2.1280e-02 1.5045e-02 1.2136e-01 +7.6800e-01 4.6936e+06 5.5315e+02 1.2835e+03 2.4667e-07 2.0269e-01 7.9731e-01 3.6681e+03 1.1014e+03 5.1814e+02 4.8402e+01 7.7049e-05 1.5854e-05 2.2553e-03 4.2264e-04 1.0053e-01 3.4432e-02 3.6442e-02 2.5893e-02 1.6071e-02 1.5711e-02 7.6825e-01 9.5334e-03 3.2038e-03 5.6904e-01 1.2094e-01 9.1970e-02 4.7159e-02 2.1282e-02 1.5052e-02 1.2182e-01 +7.7000e-01 4.6540e+06 5.5315e+02 1.2709e+03 2.4954e-07 2.0060e-01 7.9940e-01 3.6644e+03 1.0919e+03 5.1856e+02 4.8065e+01 7.7153e-05 1.5837e-05 2.2360e-03 4.1852e-04 9.9605e-02 3.4152e-02 3.6175e-02 2.5725e-02 1.5980e-02 1.5638e-02 7.7007e-01 9.5280e-03 3.2015e-03 5.6866e-01 1.2088e-01 9.1937e-02 4.7151e-02 2.1284e-02 1.5058e-02 1.2230e-01 +7.7200e-01 4.6144e+06 5.5315e+02 1.2583e+03 2.5247e-07 1.9847e-01 8.0153e-01 3.6606e+03 1.0824e+03 5.1897e+02 4.7728e+01 7.7258e-05 1.5819e-05 2.2166e-03 4.1440e-04 9.8684e-02 3.3871e-02 3.5907e-02 2.5555e-02 1.5889e-02 1.5563e-02 7.7190e-01 9.5224e-03 3.1991e-03 5.6828e-01 1.2082e-01 9.1904e-02 4.7144e-02 2.1286e-02 1.5064e-02 1.2279e-01 +7.7400e-01 4.5748e+06 5.5315e+02 1.2458e+03 2.5546e-07 1.9629e-01 8.0371e-01 3.6569e+03 1.0730e+03 5.1939e+02 4.7392e+01 7.7362e-05 1.5802e-05 2.1972e-03 4.1028e-04 9.7762e-02 3.3590e-02 3.5637e-02 2.5385e-02 1.5797e-02 1.5488e-02 7.7373e-01 9.5167e-03 3.1967e-03 5.6789e-01 1.2075e-01 9.1870e-02 4.7135e-02 2.1288e-02 1.5071e-02 1.2328e-01 +7.7600e-01 4.5352e+06 5.5315e+02 1.2331e+03 2.5852e-07 1.9407e-01 8.0593e-01 3.6532e+03 1.0635e+03 5.1980e+02 4.7056e+01 7.7466e-05 1.5785e-05 2.1777e-03 4.0618e-04 9.6841e-02 3.3308e-02 3.5367e-02 2.5214e-02 1.5704e-02 1.5412e-02 7.7557e-01 9.5109e-03 3.1942e-03 5.6749e-01 1.2069e-01 9.1834e-02 4.7127e-02 2.1289e-02 1.5077e-02 1.2379e-01 +7.7800e-01 4.4956e+06 5.5315e+02 1.2205e+03 2.6163e-07 1.9181e-01 8.0819e-01 3.6494e+03 1.0540e+03 5.2022e+02 4.6721e+01 7.7571e-05 1.5767e-05 2.1583e-03 4.0208e-04 9.5920e-02 3.3026e-02 3.5095e-02 2.5041e-02 1.5611e-02 1.5335e-02 7.7741e-01 9.5049e-03 3.1917e-03 5.6708e-01 1.2062e-01 9.1797e-02 4.7117e-02 2.1290e-02 1.5083e-02 1.2431e-01 +7.8000e-01 4.4560e+06 5.5315e+02 1.2078e+03 2.6481e-07 1.8950e-01 8.1050e-01 3.6457e+03 1.0445e+03 5.2063e+02 4.6386e+01 7.7675e-05 1.5750e-05 2.1388e-03 3.9798e-04 9.4999e-02 3.2743e-02 3.4823e-02 2.4868e-02 1.5517e-02 1.5258e-02 7.7926e-01 9.4988e-03 3.1892e-03 5.6667e-01 1.2055e-01 9.1759e-02 4.7107e-02 2.1291e-02 1.5089e-02 1.2485e-01 +7.8200e-01 4.4164e+06 5.5315e+02 1.1952e+03 2.6806e-07 1.8714e-01 8.1286e-01 3.6420e+03 1.0351e+03 5.2105e+02 4.6052e+01 7.7779e-05 1.5732e-05 2.1194e-03 3.9389e-04 9.4079e-02 3.2460e-02 3.4549e-02 2.4693e-02 1.5422e-02 1.5179e-02 7.8111e-01 9.4926e-03 3.1866e-03 5.6625e-01 1.2048e-01 9.1720e-02 4.7097e-02 2.1292e-02 1.5094e-02 1.2539e-01 +7.8400e-01 4.3768e+06 5.5315e+02 1.1825e+03 2.7138e-07 1.8473e-01 8.1527e-01 3.6383e+03 1.0256e+03 5.2146e+02 4.5718e+01 7.7884e-05 1.5714e-05 2.0998e-03 3.8981e-04 9.3159e-02 3.2176e-02 3.4275e-02 2.4518e-02 1.5326e-02 1.5099e-02 7.8296e-01 9.4863e-03 3.1839e-03 5.6582e-01 1.2041e-01 9.1679e-02 4.7086e-02 2.1293e-02 1.5100e-02 1.2595e-01 +7.8600e-01 4.3372e+06 5.5315e+02 1.1698e+03 2.7477e-07 1.8227e-01 8.1773e-01 3.6345e+03 1.0162e+03 5.2188e+02 4.5385e+01 7.7988e-05 1.5696e-05 2.0803e-03 3.8573e-04 9.2238e-02 3.1891e-02 3.3999e-02 2.4341e-02 1.5229e-02 1.5019e-02 7.8482e-01 9.4798e-03 3.1813e-03 5.6538e-01 1.2033e-01 9.1637e-02 4.7074e-02 2.1293e-02 1.5106e-02 1.2652e-01 +7.8800e-01 4.2976e+06 5.5315e+02 1.1570e+03 2.7823e-07 1.7976e-01 8.2024e-01 3.6308e+03 1.0067e+03 5.2229e+02 4.5052e+01 7.8092e-05 1.5679e-05 2.0608e-03 3.8165e-04 9.1319e-02 3.1606e-02 3.3722e-02 2.4163e-02 1.5132e-02 1.4937e-02 7.8668e-01 9.4731e-03 3.1785e-03 5.6493e-01 1.2026e-01 9.1594e-02 4.7062e-02 2.1293e-02 1.5111e-02 1.2710e-01 +7.9000e-01 4.2580e+06 5.5315e+02 1.1443e+03 2.8177e-07 1.7720e-01 8.2280e-01 3.6271e+03 9.9724e+02 5.2270e+02 4.4719e+01 7.8196e-05 1.5661e-05 2.0412e-03 3.7759e-04 9.0399e-02 3.1321e-02 3.3445e-02 2.3985e-02 1.5033e-02 1.4855e-02 7.8854e-01 9.4663e-03 3.1757e-03 5.6447e-01 1.2018e-01 9.1549e-02 4.7049e-02 2.1293e-02 1.5116e-02 1.2770e-01 +7.9200e-01 4.2184e+06 5.5315e+02 1.1315e+03 2.8538e-07 1.7458e-01 8.2542e-01 3.6233e+03 9.8780e+02 5.2312e+02 4.4387e+01 7.8300e-05 1.5642e-05 2.0216e-03 3.7353e-04 8.9479e-02 3.1034e-02 3.3166e-02 2.3805e-02 1.4934e-02 1.4772e-02 7.9041e-01 9.4594e-03 3.1729e-03 5.6401e-01 1.2010e-01 9.1503e-02 4.7035e-02 2.1293e-02 1.5122e-02 1.2830e-01 +7.9400e-01 4.1788e+06 5.5315e+02 1.1187e+03 2.8908e-07 1.7191e-01 8.2809e-01 3.6196e+03 9.7835e+02 5.2353e+02 4.4056e+01 7.8404e-05 1.5624e-05 2.0020e-03 3.6947e-04 8.8560e-02 3.0748e-02 3.2886e-02 2.3624e-02 1.4834e-02 1.4688e-02 7.9229e-01 9.4523e-03 3.1700e-03 5.6353e-01 1.2002e-01 9.1456e-02 4.7020e-02 2.1292e-02 1.5127e-02 1.2893e-01 +7.9600e-01 4.1392e+06 5.5315e+02 1.1059e+03 2.9286e-07 1.6918e-01 8.3082e-01 3.6159e+03 9.6892e+02 5.2394e+02 4.3725e+01 7.8508e-05 1.5606e-05 1.9824e-03 3.6542e-04 8.7641e-02 3.0460e-02 3.2605e-02 2.3442e-02 1.4734e-02 1.4602e-02 7.9417e-01 9.4450e-03 3.1671e-03 5.6305e-01 1.1994e-01 9.1407e-02 4.7005e-02 2.1291e-02 1.5132e-02 1.2957e-01 +7.9800e-01 4.0996e+06 5.5315e+02 1.0930e+03 2.9673e-07 1.6638e-01 8.3362e-01 3.6121e+03 9.5948e+02 5.2435e+02 4.3394e+01 7.8612e-05 1.5587e-05 1.9628e-03 3.6138e-04 8.6722e-02 3.0173e-02 3.2323e-02 2.3259e-02 1.4632e-02 1.4516e-02 7.9605e-01 9.4376e-03 3.1641e-03 5.6256e-01 1.1985e-01 9.1356e-02 4.6989e-02 2.1290e-02 1.5136e-02 1.3022e-01 +8.0000e-01 4.0600e+06 5.5315e+02 1.0802e+03 3.0068e-07 1.6353e-01 8.3647e-01 3.6084e+03 9.5005e+02 5.2476e+02 4.3064e+01 7.8716e-05 1.5569e-05 1.9431e-03 3.5734e-04 8.5803e-02 2.9884e-02 3.2040e-02 2.3075e-02 1.4530e-02 1.4429e-02 7.9794e-01 9.4300e-03 3.1610e-03 5.6205e-01 1.1976e-01 9.1304e-02 4.6973e-02 2.1288e-02 1.5141e-02 1.3089e-01 +8.0200e-01 4.0204e+06 5.5315e+02 1.0673e+03 3.0473e-07 1.6061e-01 8.3939e-01 3.6047e+03 9.4062e+02 5.2517e+02 4.2734e+01 7.8820e-05 1.5550e-05 1.9234e-03 3.5330e-04 8.4885e-02 2.9595e-02 3.1756e-02 2.2890e-02 1.4426e-02 1.4341e-02 7.9983e-01 9.4222e-03 3.1579e-03 5.6154e-01 1.1967e-01 9.1250e-02 4.6955e-02 2.1286e-02 1.5145e-02 1.3157e-01 +8.0400e-01 3.9808e+06 5.5315e+02 1.0544e+03 3.0887e-07 1.5763e-01 8.4237e-01 3.6009e+03 9.3120e+02 5.2559e+02 4.2405e+01 7.8924e-05 1.5531e-05 1.9038e-03 3.4928e-04 8.3967e-02 2.9306e-02 3.1471e-02 2.2704e-02 1.4322e-02 1.4252e-02 8.0173e-01 9.4143e-03 3.1548e-03 5.6101e-01 1.1958e-01 9.1194e-02 4.6937e-02 2.1284e-02 1.5150e-02 1.3227e-01 +8.0600e-01 3.9412e+06 5.5315e+02 1.0415e+03 3.1311e-07 1.5457e-01 8.4543e-01 3.5972e+03 9.2178e+02 5.2600e+02 4.2076e+01 7.9028e-05 1.5513e-05 1.8840e-03 3.4525e-04 8.3049e-02 2.9015e-02 3.1185e-02 2.2517e-02 1.4217e-02 1.4162e-02 8.0363e-01 9.4061e-03 3.1515e-03 5.6048e-01 1.1948e-01 9.1137e-02 4.6917e-02 2.1281e-02 1.5154e-02 1.3299e-01 +8.0800e-01 3.9016e+06 5.5315e+02 1.0286e+03 3.1745e-07 1.5145e-01 8.4855e-01 3.5935e+03 9.1237e+02 5.2641e+02 4.1748e+01 7.9132e-05 1.5493e-05 1.8643e-03 3.4124e-04 8.2131e-02 2.8725e-02 3.0898e-02 2.2329e-02 1.4111e-02 1.4071e-02 8.0553e-01 9.3978e-03 3.1482e-03 5.5993e-01 1.1939e-01 9.1078e-02 4.6897e-02 2.1278e-02 1.5157e-02 1.3372e-01 +8.1000e-01 3.8620e+06 5.5315e+02 1.0157e+03 3.2190e-07 1.4826e-01 8.5174e-01 3.5897e+03 9.0296e+02 5.2682e+02 4.1420e+01 7.9236e-05 1.5474e-05 1.8445e-03 3.3723e-04 8.1213e-02 2.8433e-02 3.0609e-02 2.2139e-02 1.4004e-02 1.3979e-02 8.0744e-01 9.3893e-03 3.1449e-03 5.5937e-01 1.1929e-01 9.1017e-02 4.6876e-02 2.1275e-02 1.5161e-02 1.3448e-01 +8.1200e-01 3.8224e+06 5.5315e+02 1.0027e+03 3.2645e-07 1.4499e-01 8.5501e-01 3.5860e+03 8.9355e+02 5.2723e+02 4.1093e+01 7.9339e-05 1.5455e-05 1.8248e-03 3.3322e-04 8.0296e-02 2.8142e-02 3.0320e-02 2.1949e-02 1.3897e-02 1.3885e-02 8.0935e-01 9.3806e-03 3.1414e-03 5.5880e-01 1.1919e-01 9.0954e-02 4.6854e-02 2.1271e-02 1.5164e-02 1.3525e-01 +8.1400e-01 3.7828e+06 5.5315e+02 9.8973e+02 3.3112e-07 1.4164e-01 8.5836e-01 3.5823e+03 8.8415e+02 5.2764e+02 4.0766e+01 7.9443e-05 1.5435e-05 1.8050e-03 3.2922e-04 7.9379e-02 2.7849e-02 3.0029e-02 2.1757e-02 1.3788e-02 1.3791e-02 8.1127e-01 9.3717e-03 3.1380e-03 5.5822e-01 1.1908e-01 9.0889e-02 4.6832e-02 2.1267e-02 1.5168e-02 1.3603e-01 +8.1600e-01 3.7432e+06 5.5315e+02 9.7675e+02 3.3590e-07 1.3821e-01 8.6179e-01 3.5785e+03 8.7475e+02 5.2805e+02 4.0439e+01 7.9547e-05 1.5416e-05 1.7852e-03 3.2523e-04 7.8462e-02 2.7556e-02 2.9737e-02 2.1564e-02 1.3679e-02 1.3696e-02 8.1319e-01 9.3625e-03 3.1344e-03 5.5762e-01 1.1897e-01 9.0822e-02 4.6808e-02 2.1263e-02 1.5171e-02 1.3684e-01 +8.1800e-01 3.7036e+06 5.5315e+02 9.6375e+02 3.4080e-07 1.3470e-01 8.6530e-01 3.5748e+03 8.6536e+02 5.2846e+02 4.0113e+01 7.9650e-05 1.5396e-05 1.7653e-03 3.2124e-04 7.7545e-02 2.7263e-02 2.9445e-02 2.1370e-02 1.3569e-02 1.3600e-02 8.1512e-01 9.3531e-03 3.1308e-03 5.5702e-01 1.1886e-01 9.0753e-02 4.6783e-02 2.1258e-02 1.5173e-02 1.3767e-01 +8.2000e-01 3.6640e+06 5.5315e+02 9.5074e+02 3.4583e-07 1.3110e-01 8.6890e-01 3.5711e+03 8.5597e+02 5.2886e+02 3.9788e+01 7.9754e-05 1.5376e-05 1.7455e-03 3.1726e-04 7.6629e-02 2.6969e-02 2.9151e-02 2.1175e-02 1.3457e-02 1.3502e-02 8.1705e-01 9.3436e-03 3.1270e-03 5.5639e-01 1.1875e-01 9.0682e-02 4.6757e-02 2.1252e-02 1.5176e-02 1.3852e-01 +8.2200e-01 3.6244e+06 5.5315e+02 9.3771e+02 3.5098e-07 1.2742e-01 8.7258e-01 3.5673e+03 8.4658e+02 5.2927e+02 3.9462e+01 7.9857e-05 1.5356e-05 1.7256e-03 3.1328e-04 7.5712e-02 2.6674e-02 2.8856e-02 2.0979e-02 1.3345e-02 1.3404e-02 8.1899e-01 9.3337e-03 3.1233e-03 5.5576e-01 1.1863e-01 9.0609e-02 4.6730e-02 2.1247e-02 1.5178e-02 1.3939e-01 +8.2400e-01 3.5848e+06 5.5315e+02 9.2467e+02 3.5627e-07 1.2364e-01 8.7636e-01 3.5636e+03 8.3720e+02 5.2968e+02 3.9138e+01 7.9961e-05 1.5335e-05 1.7057e-03 3.0931e-04 7.4796e-02 2.6379e-02 2.8560e-02 2.0782e-02 1.3232e-02 1.3304e-02 8.2093e-01 9.3237e-03 3.1194e-03 5.5511e-01 1.1851e-01 9.0533e-02 4.6701e-02 2.1240e-02 1.5180e-02 1.4028e-01 +8.2600e-01 3.5452e+06 5.5315e+02 9.1162e+02 3.6170e-07 1.1977e-01 8.8023e-01 3.5598e+03 8.2782e+02 5.3009e+02 3.8813e+01 8.0064e-05 1.5315e-05 1.6858e-03 3.0534e-04 7.3880e-02 2.6083e-02 2.8263e-02 2.0584e-02 1.3118e-02 1.3204e-02 8.2288e-01 9.3134e-03 3.1154e-03 5.5444e-01 1.1839e-01 9.0455e-02 4.6672e-02 2.1233e-02 1.5181e-02 1.4119e-01 +8.2800e-01 3.5056e+06 5.5315e+02 8.9855e+02 3.6727e-07 1.1580e-01 8.8420e-01 3.5561e+03 8.1845e+02 5.3050e+02 3.8489e+01 8.0167e-05 1.5294e-05 1.6659e-03 3.0138e-04 7.2965e-02 2.5787e-02 2.7964e-02 2.0384e-02 1.3003e-02 1.3102e-02 8.2483e-01 9.3028e-03 3.1114e-03 5.5376e-01 1.1827e-01 9.0374e-02 4.6641e-02 2.1226e-02 1.5182e-02 1.4213e-01 +8.3000e-01 3.4660e+06 5.5315e+02 8.8548e+02 3.7299e-07 1.1172e-01 8.8828e-01 3.5524e+03 8.0908e+02 5.3091e+02 3.8166e+01 8.0271e-05 1.5273e-05 1.6459e-03 2.9742e-04 7.2049e-02 2.5490e-02 2.7665e-02 2.0184e-02 1.2888e-02 1.2999e-02 8.2678e-01 9.2920e-03 3.1073e-03 5.5307e-01 1.1814e-01 9.0291e-02 4.6609e-02 2.1218e-02 1.5183e-02 1.4309e-01 +8.3200e-01 3.4264e+06 5.5315e+02 8.7240e+02 3.7887e-07 1.0754e-01 8.9246e-01 3.5486e+03 7.9972e+02 5.3131e+02 3.7843e+01 8.0374e-05 1.5252e-05 1.6260e-03 2.9347e-04 7.1134e-02 2.5192e-02 2.7365e-02 1.9982e-02 1.2771e-02 1.2895e-02 8.2874e-01 9.2808e-03 3.1031e-03 5.5236e-01 1.1801e-01 9.0206e-02 4.6576e-02 2.1210e-02 1.5184e-02 1.4408e-01 +8.3400e-01 3.3868e+06 5.5315e+02 8.5930e+02 3.8490e-07 1.0325e-01 8.9675e-01 3.5449e+03 7.9036e+02 5.3172e+02 3.7520e+01 8.0477e-05 1.5231e-05 1.6060e-03 2.8953e-04 7.0219e-02 2.4894e-02 2.7063e-02 1.9779e-02 1.2653e-02 1.2790e-02 8.3071e-01 9.2695e-03 3.0988e-03 5.5163e-01 1.1787e-01 9.0117e-02 4.6541e-02 2.1201e-02 1.5184e-02 1.4509e-01 +8.3600e-01 3.3472e+06 5.5315e+02 8.4620e+02 3.9111e-07 9.8849e-02 9.0115e-01 3.5412e+03 7.8100e+02 5.3213e+02 3.7198e+01 8.0580e-05 1.5209e-05 1.5860e-03 2.8559e-04 6.9304e-02 2.4595e-02 2.6760e-02 1.9574e-02 1.2535e-02 1.2683e-02 8.3268e-01 9.2578e-03 3.0944e-03 5.5088e-01 1.1773e-01 9.0026e-02 4.6505e-02 2.1191e-02 1.5184e-02 1.4613e-01 +8.3800e-01 3.3076e+06 5.5315e+02 8.3309e+02 3.9749e-07 9.4324e-02 9.0568e-01 3.5374e+03 7.7165e+02 5.3253e+02 3.6876e+01 8.0683e-05 1.5187e-05 1.5659e-03 2.8166e-04 6.8390e-02 2.4296e-02 2.6456e-02 1.9369e-02 1.2415e-02 1.2576e-02 8.3465e-01 9.2458e-03 3.0899e-03 5.5012e-01 1.1759e-01 8.9931e-02 4.6467e-02 2.1181e-02 1.5183e-02 1.4720e-01 +8.4000e-01 3.2680e+06 5.5315e+02 8.1998e+02 4.0405e-07 8.9676e-02 9.1032e-01 3.5337e+03 7.6231e+02 5.3294e+02 3.6555e+01 8.0786e-05 1.5165e-05 1.5459e-03 2.7773e-04 6.7475e-02 2.3996e-02 2.6151e-02 1.9163e-02 1.2294e-02 1.2467e-02 8.3663e-01 9.2335e-03 3.0853e-03 5.4933e-01 1.1744e-01 8.9834e-02 4.6428e-02 2.1170e-02 1.5182e-02 1.4830e-01 +8.4200e-01 3.2284e+06 5.5315e+02 8.0685e+02 4.1080e-07 8.4898e-02 9.1510e-01 3.5299e+03 7.5296e+02 5.3335e+02 3.6234e+01 8.0889e-05 1.5143e-05 1.5258e-03 2.7381e-04 6.6561e-02 2.3696e-02 2.5845e-02 1.8955e-02 1.2173e-02 1.2357e-02 8.3861e-01 9.2208e-03 3.0806e-03 5.4853e-01 1.1729e-01 8.9734e-02 4.6387e-02 2.1158e-02 1.5181e-02 1.4942e-01 +8.4400e-01 3.1888e+06 5.5315e+02 7.9372e+02 4.1774e-07 7.9986e-02 9.2001e-01 3.5262e+03 7.4363e+02 5.3375e+02 3.5914e+01 8.0992e-05 1.5120e-05 1.5058e-03 2.6989e-04 6.5647e-02 2.3395e-02 2.5538e-02 1.8746e-02 1.2050e-02 1.2246e-02 8.4060e-01 9.2079e-03 3.0757e-03 5.4771e-01 1.1713e-01 8.9630e-02 4.6345e-02 2.1145e-02 1.5179e-02 1.5058e-01 +8.4600e-01 3.1492e+06 5.5315e+02 7.8059e+02 4.2489e-07 7.4935e-02 9.2507e-01 3.5224e+03 7.3429e+02 5.3416e+02 3.5594e+01 8.1094e-05 1.5097e-05 1.4857e-03 2.6598e-04 6.4733e-02 2.3093e-02 2.5229e-02 1.8536e-02 1.1927e-02 1.2134e-02 8.4260e-01 9.1946e-03 3.0708e-03 5.4687e-01 1.1697e-01 8.9523e-02 4.6301e-02 2.1132e-02 1.5177e-02 1.5176e-01 +8.4800e-01 3.1096e+06 5.5315e+02 7.6746e+02 4.3226e-07 6.9737e-02 9.3026e-01 3.5187e+03 7.2496e+02 5.3456e+02 3.5274e+01 8.1197e-05 1.5074e-05 1.4655e-03 2.6207e-04 6.3820e-02 2.2791e-02 2.4920e-02 1.8325e-02 1.1802e-02 1.2020e-02 8.4459e-01 9.1809e-03 3.0657e-03 5.4601e-01 1.1680e-01 8.9412e-02 4.6255e-02 2.1118e-02 1.5174e-02 1.5298e-01 +8.5000e-01 3.0700e+06 5.5315e+02 7.5432e+02 4.3984e-07 6.4388e-02 9.3561e-01 3.5150e+03 7.1564e+02 5.3497e+02 3.4955e+01 8.1300e-05 1.5050e-05 1.4454e-03 2.5817e-04 6.2907e-02 2.2488e-02 2.4609e-02 1.8112e-02 1.1677e-02 1.1906e-02 8.4660e-01 9.1668e-03 3.0606e-03 5.4512e-01 1.1663e-01 8.9298e-02 4.6207e-02 2.1104e-02 1.5171e-02 1.5424e-01 +8.5200e-01 3.0304e+06 5.5315e+02 7.4118e+02 4.4766e-07 5.8880e-02 9.4112e-01 3.5112e+03 7.0632e+02 5.3538e+02 3.4636e+01 8.1402e-05 1.5026e-05 1.4252e-03 2.5428e-04 6.1994e-02 2.2185e-02 2.4297e-02 1.7898e-02 1.1550e-02 1.1790e-02 8.4861e-01 9.1524e-03 3.0552e-03 5.4421e-01 1.1646e-01 8.9180e-02 4.6157e-02 2.1088e-02 1.5167e-02 1.5553e-01 +8.5400e-01 2.9908e+06 5.5315e+02 7.2804e+02 4.5572e-07 5.3206e-02 9.4679e-01 3.5075e+03 6.9700e+02 5.3578e+02 3.4317e+01 8.1505e-05 1.5002e-05 1.4051e-03 2.5039e-04 6.1081e-02 2.1881e-02 2.3984e-02 1.7683e-02 1.1422e-02 1.1672e-02 8.5062e-01 9.1376e-03 3.0498e-03 5.4328e-01 1.1628e-01 8.9058e-02 4.6106e-02 2.1072e-02 1.5162e-02 1.5686e-01 +8.5600e-01 2.9512e+06 5.5315e+02 7.1490e+02 4.6404e-07 4.7360e-02 9.5264e-01 3.5037e+03 6.8769e+02 5.3619e+02 3.3999e+01 8.1607e-05 1.4978e-05 1.3849e-03 2.4650e-04 6.0168e-02 2.1577e-02 2.3670e-02 1.7467e-02 1.1294e-02 1.1554e-02 8.5264e-01 9.1223e-03 3.0442e-03 5.4232e-01 1.1609e-01 8.8932e-02 4.6052e-02 2.1054e-02 1.5157e-02 1.5822e-01 +8.5800e-01 2.9116e+06 5.5315e+02 7.0177e+02 4.7262e-07 4.1332e-02 9.5867e-01 3.5000e+03 6.7838e+02 5.3659e+02 3.3682e+01 8.1709e-05 1.4953e-05 1.3646e-03 2.4262e-04 5.9256e-02 2.1272e-02 2.3355e-02 1.7250e-02 1.1164e-02 1.1434e-02 8.5466e-01 9.1066e-03 3.0385e-03 5.4134e-01 1.1590e-01 8.8801e-02 4.5996e-02 2.1036e-02 1.5151e-02 1.5963e-01 +8.6000e-01 2.8720e+06 5.5315e+02 6.8864e+02 4.8147e-07 3.5115e-02 9.6488e-01 3.4962e+03 6.6908e+02 5.3699e+02 3.3364e+01 8.1811e-05 1.4928e-05 1.3444e-03 2.3875e-04 5.8344e-02 2.0966e-02 2.3038e-02 1.7031e-02 1.1033e-02 1.1313e-02 8.5669e-01 9.0905e-03 3.0326e-03 5.4033e-01 1.1571e-01 8.8666e-02 4.5938e-02 2.1017e-02 1.5145e-02 1.6108e-01 +8.6200e-01 2.8324e+06 5.5315e+02 6.7551e+02 4.9062e-07 2.8700e-02 9.7130e-01 3.4925e+03 6.5978e+02 5.3740e+02 3.3048e+01 8.1913e-05 1.4902e-05 1.3242e-03 2.3488e-04 5.7432e-02 2.0660e-02 2.2721e-02 1.6811e-02 1.0902e-02 1.1190e-02 8.5873e-01 9.0738e-03 3.0266e-03 5.3929e-01 1.1550e-01 8.8527e-02 4.5877e-02 2.0996e-02 1.5138e-02 1.6257e-01 +8.6400e-01 2.7928e+06 5.5315e+02 6.6239e+02 5.0007e-07 2.2078e-02 9.7792e-01 3.4887e+03 6.5049e+02 5.3780e+02 3.2731e+01 8.2015e-05 1.4876e-05 1.3039e-03 2.3102e-04 5.6520e-02 2.0353e-02 2.2402e-02 1.6590e-02 1.0769e-02 1.1067e-02 8.6076e-01 9.0567e-03 3.0204e-03 5.3822e-01 1.1529e-01 8.8383e-02 4.5814e-02 2.0975e-02 1.5130e-02 1.6410e-01 +8.6600e-01 2.7532e+06 5.5315e+02 6.4927e+02 5.0984e-07 1.5238e-02 9.8476e-01 3.4850e+03 6.4120e+02 5.3821e+02 3.2415e+01 8.2117e-05 1.4850e-05 1.2836e-03 2.2716e-04 5.5608e-02 2.0046e-02 2.2082e-02 1.6368e-02 1.0635e-02 1.0941e-02 8.6281e-01 9.0391e-03 3.0140e-03 5.3713e-01 1.1508e-01 8.8233e-02 4.5748e-02 2.0952e-02 1.5121e-02 1.6569e-01 +8.6800e-01 2.7136e+06 5.5315e+02 6.3617e+02 5.1995e-07 8.1691e-03 9.9183e-01 3.4813e+03 6.3192e+02 5.3861e+02 3.2100e+01 8.2219e-05 1.4823e-05 1.2633e-03 2.2331e-04 5.4697e-02 1.9738e-02 2.1761e-02 1.6144e-02 1.0500e-02 1.0815e-02 8.6486e-01 9.0209e-03 3.0075e-03 5.3600e-01 1.1486e-01 8.8079e-02 4.5680e-02 2.0928e-02 1.5112e-02 1.6732e-01 +8.7000e-01 2.6740e+06 5.5315e+02 6.2308e+02 5.3041e-07 8.6069e-04 9.9914e-01 3.4775e+03 6.2264e+02 5.3901e+02 3.1784e+01 8.2321e-05 1.4796e-05 1.2430e-03 2.1946e-04 5.3786e-02 1.9429e-02 2.1438e-02 1.5919e-02 1.0364e-02 1.0687e-02 8.6691e-01 9.0022e-03 3.0008e-03 5.3484e-01 1.1463e-01 8.7919e-02 4.5608e-02 2.0903e-02 1.5101e-02 1.6900e-01 +8.7200e-01 2.6344e+06 5.5315e+02 6.1289e+02 4.0366e-07 0.0000e+00 1.0000e+00 6.1289e+02 6.1289e+02 3.1305e+01 3.1305e+01 1.4781e-05 1.4781e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.7400e-01 2.5948e+06 5.5315e+02 6.0311e+02 4.0951e-07 0.0000e+00 1.0000e+00 6.0311e+02 6.0311e+02 3.0805e+01 3.0805e+01 1.4768e-05 1.4768e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.7600e-01 2.5552e+06 5.5315e+02 5.9333e+02 4.1554e-07 0.0000e+00 1.0000e+00 5.9333e+02 5.9333e+02 3.0306e+01 3.0306e+01 1.4755e-05 1.4755e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.7800e-01 2.5156e+06 5.5315e+02 5.8358e+02 4.2176e-07 0.0000e+00 1.0000e+00 5.8358e+02 5.8358e+02 2.9808e+01 2.9808e+01 1.4743e-05 1.4743e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8000e-01 2.4760e+06 5.5315e+02 5.7384e+02 4.2818e-07 0.0000e+00 1.0000e+00 5.7384e+02 5.7384e+02 2.9310e+01 2.9310e+01 1.4730e-05 1.4730e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8200e-01 2.4364e+06 5.5315e+02 5.6412e+02 4.3480e-07 0.0000e+00 1.0000e+00 5.6412e+02 5.6412e+02 2.8814e+01 2.8814e+01 1.4718e-05 1.4718e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8400e-01 2.3968e+06 5.5315e+02 5.5441e+02 4.4164e-07 0.0000e+00 1.0000e+00 5.5441e+02 5.5441e+02 2.8318e+01 2.8318e+01 1.4705e-05 1.4705e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8600e-01 2.3572e+06 5.5315e+02 5.4473e+02 4.4871e-07 0.0000e+00 1.0000e+00 5.4473e+02 5.4473e+02 2.7823e+01 2.7823e+01 1.4693e-05 1.4693e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8800e-01 2.3176e+06 5.5315e+02 5.3506e+02 4.5602e-07 0.0000e+00 1.0000e+00 5.3506e+02 5.3506e+02 2.7329e+01 2.7329e+01 1.4681e-05 1.4681e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9000e-01 2.2780e+06 5.5315e+02 5.2540e+02 4.6357e-07 0.0000e+00 1.0000e+00 5.2540e+02 5.2540e+02 2.6836e+01 2.6836e+01 1.4669e-05 1.4669e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9200e-01 2.2384e+06 5.5315e+02 5.1577e+02 4.7140e-07 0.0000e+00 1.0000e+00 5.1577e+02 5.1577e+02 2.6344e+01 2.6344e+01 1.4657e-05 1.4657e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9400e-01 2.1988e+06 5.5315e+02 5.0615e+02 4.7950e-07 0.0000e+00 1.0000e+00 5.0615e+02 5.0615e+02 2.5853e+01 2.5853e+01 1.4645e-05 1.4645e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9600e-01 2.1592e+06 5.5315e+02 4.9654e+02 4.8789e-07 0.0000e+00 1.0000e+00 4.9654e+02 4.9654e+02 2.5362e+01 2.5362e+01 1.4634e-05 1.4634e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9800e-01 2.1196e+06 5.5315e+02 4.8696e+02 4.9660e-07 0.0000e+00 1.0000e+00 4.8696e+02 4.8696e+02 2.4873e+01 2.4873e+01 1.4622e-05 1.4622e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0000e-01 2.0800e+06 5.5315e+02 4.7739e+02 5.0563e-07 0.0000e+00 1.0000e+00 4.7739e+02 4.7739e+02 2.4384e+01 2.4384e+01 1.4611e-05 1.4611e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0200e-01 2.0404e+06 5.5315e+02 4.6784e+02 5.1502e-07 0.0000e+00 1.0000e+00 4.6784e+02 4.6784e+02 2.3896e+01 2.3896e+01 1.4600e-05 1.4600e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0400e-01 2.0008e+06 5.5315e+02 4.5831e+02 5.2477e-07 0.0000e+00 1.0000e+00 4.5831e+02 4.5831e+02 2.3409e+01 2.3409e+01 1.4588e-05 1.4588e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0600e-01 1.9612e+06 5.5315e+02 4.4879e+02 5.3491e-07 0.0000e+00 1.0000e+00 4.4879e+02 4.4879e+02 2.2923e+01 2.2923e+01 1.4577e-05 1.4577e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0800e-01 1.9216e+06 5.5315e+02 4.3930e+02 5.4547e-07 0.0000e+00 1.0000e+00 4.3930e+02 4.3930e+02 2.2438e+01 2.2438e+01 1.4566e-05 1.4566e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1000e-01 1.8820e+06 5.5315e+02 4.2981e+02 5.5647e-07 0.0000e+00 1.0000e+00 4.2981e+02 4.2981e+02 2.1954e+01 2.1954e+01 1.4555e-05 1.4555e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1200e-01 1.8424e+06 5.5315e+02 4.2035e+02 5.6794e-07 0.0000e+00 1.0000e+00 4.2035e+02 4.2035e+02 2.1470e+01 2.1470e+01 1.4545e-05 1.4545e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1400e-01 1.8028e+06 5.5315e+02 4.1091e+02 5.7991e-07 0.0000e+00 1.0000e+00 4.1091e+02 4.1091e+02 2.0988e+01 2.0988e+01 1.4534e-05 1.4534e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1600e-01 1.7632e+06 5.5315e+02 4.0148e+02 5.9242e-07 0.0000e+00 1.0000e+00 4.0148e+02 4.0148e+02 2.0506e+01 2.0506e+01 1.4523e-05 1.4523e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1800e-01 1.7236e+06 5.5315e+02 3.9207e+02 6.0550e-07 0.0000e+00 1.0000e+00 3.9207e+02 3.9207e+02 2.0026e+01 2.0026e+01 1.4513e-05 1.4513e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2000e-01 1.6840e+06 5.5315e+02 3.8268e+02 6.1919e-07 0.0000e+00 1.0000e+00 3.8268e+02 3.8268e+02 1.9546e+01 1.9546e+01 1.4503e-05 1.4503e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2200e-01 1.6444e+06 5.5315e+02 3.7330e+02 6.3354e-07 0.0000e+00 1.0000e+00 3.7330e+02 3.7330e+02 1.9067e+01 1.9067e+01 1.4492e-05 1.4492e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2400e-01 1.6048e+06 5.5315e+02 3.6395e+02 6.4859e-07 0.0000e+00 1.0000e+00 3.6395e+02 3.6395e+02 1.8589e+01 1.8589e+01 1.4482e-05 1.4482e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2600e-01 1.5652e+06 5.5315e+02 3.5461e+02 6.6440e-07 0.0000e+00 1.0000e+00 3.5461e+02 3.5461e+02 1.8112e+01 1.8112e+01 1.4472e-05 1.4472e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2800e-01 1.5256e+06 5.5315e+02 3.4529e+02 6.8103e-07 0.0000e+00 1.0000e+00 3.4529e+02 3.4529e+02 1.7636e+01 1.7636e+01 1.4462e-05 1.4462e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3000e-01 1.4860e+06 5.5315e+02 3.3598e+02 6.9854e-07 0.0000e+00 1.0000e+00 3.3598e+02 3.3598e+02 1.7161e+01 1.7161e+01 1.4453e-05 1.4453e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3200e-01 1.4464e+06 5.5315e+02 3.2670e+02 7.1701e-07 0.0000e+00 1.0000e+00 3.2670e+02 3.2670e+02 1.6687e+01 1.6687e+01 1.4443e-05 1.4443e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3400e-01 1.4068e+06 5.5315e+02 3.1743e+02 7.3652e-07 0.0000e+00 1.0000e+00 3.1743e+02 3.1743e+02 1.6214e+01 1.6214e+01 1.4433e-05 1.4433e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3600e-01 1.3672e+06 5.5315e+02 3.0818e+02 7.5715e-07 0.0000e+00 1.0000e+00 3.0818e+02 3.0818e+02 1.5741e+01 1.5741e+01 1.4424e-05 1.4424e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3800e-01 1.3276e+06 5.5315e+02 2.9895e+02 7.7901e-07 0.0000e+00 1.0000e+00 2.9895e+02 2.9895e+02 1.5270e+01 1.5270e+01 1.4414e-05 1.4414e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4000e-01 1.2880e+06 5.5315e+02 2.8974e+02 8.0221e-07 0.0000e+00 1.0000e+00 2.8974e+02 2.8974e+02 1.4799e+01 1.4799e+01 1.4405e-05 1.4405e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4200e-01 1.2484e+06 5.5315e+02 2.8054e+02 8.2688e-07 0.0000e+00 1.0000e+00 2.8054e+02 2.8054e+02 1.4329e+01 1.4329e+01 1.4396e-05 1.4396e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4400e-01 1.2088e+06 5.5315e+02 2.7137e+02 8.5316e-07 0.0000e+00 1.0000e+00 2.7137e+02 2.7137e+02 1.3861e+01 1.3861e+01 1.4387e-05 1.4387e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4600e-01 1.1692e+06 5.5315e+02 2.6221e+02 8.8122e-07 0.0000e+00 1.0000e+00 2.6221e+02 2.6221e+02 1.3393e+01 1.3393e+01 1.4378e-05 1.4378e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4800e-01 1.1296e+06 5.5315e+02 2.5307e+02 9.1124e-07 0.0000e+00 1.0000e+00 2.5307e+02 2.5307e+02 1.2926e+01 1.2926e+01 1.4369e-05 1.4369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5000e-01 1.0900e+06 5.5315e+02 2.4394e+02 9.4344e-07 0.0000e+00 1.0000e+00 2.4394e+02 2.4394e+02 1.2460e+01 1.2460e+01 1.4360e-05 1.4360e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5200e-01 1.0504e+06 5.5315e+02 2.3484e+02 9.7807e-07 0.0000e+00 1.0000e+00 2.3484e+02 2.3484e+02 1.1995e+01 1.1995e+01 1.4351e-05 1.4351e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5400e-01 1.0108e+06 5.5315e+02 2.2575e+02 1.0154e-06 0.0000e+00 1.0000e+00 2.2575e+02 2.2575e+02 1.1531e+01 1.1531e+01 1.4343e-05 1.4343e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5600e-01 9.7120e+05 5.5315e+02 2.1668e+02 1.0558e-06 0.0000e+00 1.0000e+00 2.1668e+02 2.1668e+02 1.1068e+01 1.1068e+01 1.4334e-05 1.4334e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5800e-01 9.3160e+05 5.5315e+02 2.0763e+02 1.0996e-06 0.0000e+00 1.0000e+00 2.0763e+02 2.0763e+02 1.0605e+01 1.0605e+01 1.4326e-05 1.4326e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6000e-01 8.9200e+05 5.5315e+02 1.9860e+02 1.1473e-06 0.0000e+00 1.0000e+00 1.9860e+02 1.9860e+02 1.0144e+01 1.0144e+01 1.4317e-05 1.4317e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6200e-01 8.5240e+05 5.5315e+02 1.8959e+02 1.1994e-06 0.0000e+00 1.0000e+00 1.8959e+02 1.8959e+02 9.6836e+00 9.6836e+00 1.4309e-05 1.4309e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6400e-01 8.1280e+05 5.5315e+02 1.8059e+02 1.2566e-06 0.0000e+00 1.0000e+00 1.8059e+02 1.8059e+02 9.2241e+00 9.2241e+00 1.4301e-05 1.4301e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6600e-01 7.7320e+05 5.5315e+02 1.7161e+02 1.3196e-06 0.0000e+00 1.0000e+00 1.7161e+02 1.7161e+02 8.7656e+00 8.7656e+00 1.4293e-05 1.4293e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6800e-01 7.3360e+05 5.5315e+02 1.6266e+02 1.3895e-06 0.0000e+00 1.0000e+00 1.6266e+02 1.6266e+02 8.3080e+00 8.3080e+00 1.4285e-05 1.4285e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7000e-01 6.9400e+05 5.5315e+02 1.5371e+02 1.4673e-06 0.0000e+00 1.0000e+00 1.5371e+02 1.5371e+02 7.8513e+00 7.8513e+00 1.4277e-05 1.4277e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7200e-01 6.5440e+05 5.5315e+02 1.4479e+02 1.5545e-06 0.0000e+00 1.0000e+00 1.4479e+02 1.4479e+02 7.3956e+00 7.3956e+00 1.4269e-05 1.4269e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7400e-01 6.1480e+05 5.5315e+02 1.3589e+02 1.6530e-06 0.0000e+00 1.0000e+00 1.3589e+02 1.3589e+02 6.9408e+00 6.9408e+00 1.4261e-05 1.4261e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7600e-01 5.7520e+05 5.5315e+02 1.2700e+02 1.7650e-06 0.0000e+00 1.0000e+00 1.2700e+02 1.2700e+02 6.4869e+00 6.4869e+00 1.4254e-05 1.4254e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7800e-01 5.3560e+05 5.5315e+02 1.1813e+02 1.8936e-06 0.0000e+00 1.0000e+00 1.1813e+02 1.1813e+02 6.0340e+00 6.0340e+00 1.4246e-05 1.4246e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8000e-01 4.9600e+05 5.5315e+02 1.0929e+02 2.0427e-06 0.0000e+00 1.0000e+00 1.0929e+02 1.0929e+02 5.5820e+00 5.5820e+00 1.4239e-05 1.4239e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8200e-01 4.5640e+05 5.5315e+02 1.0045e+02 2.2176e-06 0.0000e+00 1.0000e+00 1.0045e+02 1.0045e+02 5.1309e+00 5.1309e+00 1.4232e-05 1.4232e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8400e-01 4.1680e+05 5.5315e+02 9.1642e+01 2.4258e-06 0.0000e+00 1.0000e+00 9.1642e+01 9.1642e+01 4.6808e+00 4.6808e+00 1.4224e-05 1.4224e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8600e-01 3.7720e+05 5.5315e+02 8.2848e+01 2.6777e-06 0.0000e+00 1.0000e+00 8.2848e+01 8.2848e+01 4.2316e+00 4.2316e+00 1.4217e-05 1.4217e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8800e-01 3.3760e+05 5.5315e+02 7.4072e+01 2.9887e-06 0.0000e+00 1.0000e+00 7.4072e+01 7.4072e+01 3.7834e+00 3.7834e+00 1.4210e-05 1.4210e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9000e-01 2.9800e+05 5.5315e+02 6.5314e+01 3.3824e-06 0.0000e+00 1.0000e+00 6.5314e+01 6.5314e+01 3.3361e+00 3.3361e+00 1.4203e-05 1.4203e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9200e-01 2.5840e+05 5.5315e+02 5.6575e+01 3.8967e-06 0.0000e+00 1.0000e+00 5.6575e+01 5.6575e+01 2.8897e+00 2.8897e+00 1.4196e-05 1.4196e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9400e-01 2.1880e+05 5.5315e+02 4.7854e+01 4.5971e-06 0.0000e+00 1.0000e+00 4.7854e+01 4.7854e+01 2.4443e+00 2.4443e+00 1.4189e-05 1.4189e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9600e-01 1.7920e+05 5.5315e+02 3.9152e+01 5.6071e-06 0.0000e+00 1.0000e+00 3.9152e+01 3.9152e+01 1.9998e+00 1.9998e+00 1.4183e-05 1.4183e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9800e-01 1.3960e+05 5.5315e+02 3.0467e+01 7.1901e-06 0.0000e+00 1.0000e+00 3.0467e+01 3.0467e+01 1.5562e+00 1.5562e+00 1.4176e-05 1.4176e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e+00 1.0000e+05 5.5315e+02 2.1802e+01 1.0027e-05 0.0000e+00 1.0000e+00 2.1802e+01 2.1802e+01 1.1136e+00 1.1136e+00 1.4170e-05 1.4170e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0020e+00 1.3960e+05 5.8315e+02 2.8879e+01 7.1848e-06 0.0000e+00 1.0000e+00 2.8879e+01 2.8879e+01 1.4750e+00 1.4750e+00 1.4780e-05 1.4780e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0040e+00 1.7920e+05 5.8315e+02 3.7102e+01 5.6018e-06 0.0000e+00 1.0000e+00 3.7102e+01 3.7102e+01 1.8951e+00 1.8951e+00 1.4786e-05 1.4786e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0060e+00 2.1880e+05 5.8315e+02 4.5339e+01 4.5918e-06 0.0000e+00 1.0000e+00 4.5339e+01 4.5339e+01 2.3158e+00 2.3158e+00 1.4793e-05 1.4793e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0080e+00 2.5840e+05 5.8315e+02 5.3591e+01 3.8913e-06 0.0000e+00 1.0000e+00 5.3591e+01 5.3591e+01 2.7373e+00 2.7373e+00 1.4799e-05 1.4799e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0100e+00 2.9800e+05 5.8315e+02 6.1856e+01 3.3770e-06 0.0000e+00 1.0000e+00 6.1856e+01 6.1856e+01 3.1594e+00 3.1594e+00 1.4806e-05 1.4806e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0120e+00 3.3760e+05 5.8315e+02 7.0135e+01 2.9834e-06 0.0000e+00 1.0000e+00 7.0135e+01 7.0135e+01 3.5823e+00 3.5823e+00 1.4812e-05 1.4812e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0140e+00 3.7720e+05 5.8315e+02 7.8427e+01 2.6724e-06 0.0000e+00 1.0000e+00 7.8427e+01 7.8427e+01 4.0059e+00 4.0059e+00 1.4819e-05 1.4819e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0160e+00 4.1680e+05 5.8315e+02 8.6734e+01 2.4204e-06 0.0000e+00 1.0000e+00 8.6734e+01 8.6734e+01 4.4301e+00 4.4301e+00 1.4826e-05 1.4826e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0180e+00 4.5640e+05 5.8315e+02 9.5054e+01 2.2122e-06 0.0000e+00 1.0000e+00 9.5054e+01 9.5054e+01 4.8551e+00 4.8551e+00 1.4832e-05 1.4832e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0200e+00 4.9600e+05 5.8315e+02 1.0339e+02 2.0372e-06 0.0000e+00 1.0000e+00 1.0339e+02 1.0339e+02 5.2808e+00 5.2808e+00 1.4839e-05 1.4839e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0220e+00 5.3560e+05 5.8315e+02 1.1174e+02 1.8881e-06 0.0000e+00 1.0000e+00 1.1174e+02 1.1174e+02 5.7071e+00 5.7071e+00 1.4846e-05 1.4846e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0240e+00 5.7520e+05 5.8315e+02 1.2010e+02 1.7596e-06 0.0000e+00 1.0000e+00 1.2010e+02 1.2010e+02 6.1342e+00 6.1342e+00 1.4853e-05 1.4853e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0260e+00 6.1480e+05 5.8315e+02 1.2847e+02 1.6475e-06 0.0000e+00 1.0000e+00 1.2847e+02 1.2847e+02 6.5620e+00 6.5620e+00 1.4860e-05 1.4860e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0280e+00 6.5440e+05 5.8315e+02 1.3686e+02 1.5491e-06 0.0000e+00 1.0000e+00 1.3686e+02 1.3686e+02 6.9905e+00 6.9905e+00 1.4868e-05 1.4868e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0300e+00 6.9400e+05 5.8315e+02 1.4526e+02 1.4618e-06 0.0000e+00 1.0000e+00 1.4526e+02 1.4526e+02 7.4196e+00 7.4196e+00 1.4875e-05 1.4875e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0320e+00 7.3360e+05 5.8315e+02 1.5368e+02 1.3840e-06 0.0000e+00 1.0000e+00 1.5368e+02 1.5368e+02 7.8495e+00 7.8495e+00 1.4882e-05 1.4882e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0340e+00 7.7320e+05 5.8315e+02 1.6211e+02 1.3141e-06 0.0000e+00 1.0000e+00 1.6211e+02 1.6211e+02 8.2800e+00 8.2800e+00 1.4890e-05 1.4890e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0360e+00 8.1280e+05 5.8315e+02 1.7055e+02 1.2511e-06 0.0000e+00 1.0000e+00 1.7055e+02 1.7055e+02 8.7113e+00 8.7113e+00 1.4897e-05 1.4897e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0380e+00 8.5240e+05 5.8315e+02 1.7901e+02 1.1939e-06 0.0000e+00 1.0000e+00 1.7901e+02 1.7901e+02 9.1432e+00 9.1432e+00 1.4905e-05 1.4905e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0400e+00 8.9200e+05 5.8315e+02 1.8748e+02 1.1418e-06 0.0000e+00 1.0000e+00 1.8748e+02 1.8748e+02 9.5758e+00 9.5758e+00 1.4912e-05 1.4912e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0420e+00 9.3160e+05 5.8315e+02 1.9596e+02 1.0941e-06 0.0000e+00 1.0000e+00 1.9596e+02 1.9596e+02 1.0009e+01 1.0009e+01 1.4920e-05 1.4920e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0440e+00 9.7120e+05 5.8315e+02 2.0446e+02 1.0502e-06 0.0000e+00 1.0000e+00 2.0446e+02 2.0446e+02 1.0443e+01 1.0443e+01 1.4928e-05 1.4928e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0460e+00 1.0108e+06 5.8315e+02 2.1297e+02 1.0099e-06 0.0000e+00 1.0000e+00 2.1297e+02 2.1297e+02 1.0878e+01 1.0878e+01 1.4936e-05 1.4936e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0480e+00 1.0504e+06 5.8315e+02 2.2149e+02 9.7252e-07 0.0000e+00 1.0000e+00 2.2149e+02 2.2149e+02 1.1313e+01 1.1313e+01 1.4944e-05 1.4944e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0500e+00 1.0900e+06 5.8315e+02 2.3003e+02 9.3789e-07 0.0000e+00 1.0000e+00 2.3003e+02 2.3003e+02 1.1749e+01 1.1749e+01 1.4952e-05 1.4952e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0520e+00 1.1296e+06 5.8315e+02 2.3858e+02 9.0568e-07 0.0000e+00 1.0000e+00 2.3858e+02 2.3858e+02 1.2186e+01 1.2186e+01 1.4960e-05 1.4960e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0540e+00 1.1692e+06 5.8315e+02 2.4714e+02 8.7565e-07 0.0000e+00 1.0000e+00 2.4714e+02 2.4714e+02 1.2623e+01 1.2623e+01 1.4968e-05 1.4968e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0560e+00 1.2088e+06 5.8315e+02 2.5572e+02 8.4758e-07 0.0000e+00 1.0000e+00 2.5572e+02 2.5572e+02 1.3061e+01 1.3061e+01 1.4977e-05 1.4977e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0580e+00 1.2484e+06 5.8315e+02 2.6431e+02 8.2129e-07 0.0000e+00 1.0000e+00 2.6431e+02 2.6431e+02 1.3500e+01 1.3500e+01 1.4985e-05 1.4985e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0600e+00 1.2880e+06 5.8315e+02 2.7291e+02 7.9661e-07 0.0000e+00 1.0000e+00 2.7291e+02 2.7291e+02 1.3939e+01 1.3939e+01 1.4993e-05 1.4993e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0620e+00 1.3276e+06 5.8315e+02 2.8152e+02 7.7341e-07 0.0000e+00 1.0000e+00 2.8152e+02 2.8152e+02 1.4379e+01 1.4379e+01 1.5002e-05 1.5002e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0640e+00 1.3672e+06 5.8315e+02 2.9015e+02 7.5154e-07 0.0000e+00 1.0000e+00 2.9015e+02 2.9015e+02 1.4820e+01 1.4820e+01 1.5011e-05 1.5011e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0660e+00 1.4068e+06 5.8315e+02 2.9879e+02 7.3090e-07 0.0000e+00 1.0000e+00 2.9879e+02 2.9879e+02 1.5262e+01 1.5262e+01 1.5019e-05 1.5019e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0680e+00 1.4464e+06 5.8315e+02 3.0745e+02 7.1139e-07 0.0000e+00 1.0000e+00 3.0745e+02 3.0745e+02 1.5704e+01 1.5704e+01 1.5028e-05 1.5028e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0700e+00 1.4860e+06 5.8315e+02 3.1612e+02 6.9292e-07 0.0000e+00 1.0000e+00 3.1612e+02 3.1612e+02 1.6146e+01 1.6146e+01 1.5037e-05 1.5037e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0720e+00 1.5256e+06 5.8315e+02 3.2480e+02 6.7540e-07 0.0000e+00 1.0000e+00 3.2480e+02 3.2480e+02 1.6590e+01 1.6590e+01 1.5046e-05 1.5046e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0740e+00 1.5652e+06 5.8315e+02 3.3349e+02 6.5876e-07 0.0000e+00 1.0000e+00 3.3349e+02 3.3349e+02 1.7034e+01 1.7034e+01 1.5055e-05 1.5055e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0760e+00 1.6048e+06 5.8315e+02 3.4220e+02 6.4295e-07 0.0000e+00 1.0000e+00 3.4220e+02 3.4220e+02 1.7478e+01 1.7478e+01 1.5064e-05 1.5064e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0780e+00 1.6444e+06 5.8315e+02 3.5092e+02 6.2789e-07 0.0000e+00 1.0000e+00 3.5092e+02 3.5092e+02 1.7924e+01 1.7924e+01 1.5074e-05 1.5074e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0800e+00 1.6840e+06 5.8315e+02 3.5965e+02 6.1354e-07 0.0000e+00 1.0000e+00 3.5965e+02 3.5965e+02 1.8370e+01 1.8370e+01 1.5083e-05 1.5083e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0820e+00 1.7236e+06 5.8315e+02 3.6839e+02 5.9984e-07 0.0000e+00 1.0000e+00 3.6839e+02 3.6839e+02 1.8816e+01 1.8816e+01 1.5092e-05 1.5092e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0840e+00 1.7632e+06 5.8315e+02 3.7715e+02 5.8676e-07 0.0000e+00 1.0000e+00 3.7715e+02 3.7715e+02 1.9264e+01 1.9264e+01 1.5102e-05 1.5102e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0860e+00 1.8028e+06 5.8315e+02 3.8592e+02 5.7425e-07 0.0000e+00 1.0000e+00 3.8592e+02 3.8592e+02 1.9712e+01 1.9712e+01 1.5111e-05 1.5111e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0880e+00 1.8424e+06 5.8315e+02 3.9470e+02 5.6227e-07 0.0000e+00 1.0000e+00 3.9470e+02 3.9470e+02 2.0160e+01 2.0160e+01 1.5121e-05 1.5121e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0900e+00 1.8820e+06 5.8315e+02 4.0349e+02 5.5079e-07 0.0000e+00 1.0000e+00 4.0349e+02 4.0349e+02 2.0609e+01 2.0609e+01 1.5131e-05 1.5131e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0920e+00 1.9216e+06 5.8315e+02 4.1230e+02 5.3979e-07 0.0000e+00 1.0000e+00 4.1230e+02 4.1230e+02 2.1059e+01 2.1059e+01 1.5141e-05 1.5141e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0940e+00 1.9612e+06 5.8315e+02 4.2112e+02 5.2923e-07 0.0000e+00 1.0000e+00 4.2112e+02 4.2112e+02 2.1510e+01 2.1510e+01 1.5151e-05 1.5151e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0960e+00 2.0008e+06 5.8315e+02 4.2995e+02 5.1908e-07 0.0000e+00 1.0000e+00 4.2995e+02 4.2995e+02 2.1961e+01 2.1961e+01 1.5161e-05 1.5161e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0980e+00 2.0404e+06 5.8315e+02 4.3880e+02 5.0932e-07 0.0000e+00 1.0000e+00 4.3880e+02 4.3880e+02 2.2413e+01 2.2413e+01 1.5171e-05 1.5171e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1000e+00 2.0800e+06 5.8315e+02 4.4765e+02 4.9994e-07 0.0000e+00 1.0000e+00 4.4765e+02 4.4765e+02 2.2865e+01 2.2865e+01 1.5181e-05 1.5181e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1020e+00 2.1196e+06 5.8315e+02 4.5652e+02 4.9090e-07 0.0000e+00 1.0000e+00 4.5652e+02 4.5652e+02 2.3318e+01 2.3318e+01 1.5192e-05 1.5192e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1040e+00 2.1592e+06 5.8315e+02 4.6540e+02 4.8219e-07 0.0000e+00 1.0000e+00 4.6540e+02 4.6540e+02 2.3771e+01 2.3771e+01 1.5202e-05 1.5202e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1060e+00 2.1988e+06 5.8315e+02 4.7429e+02 4.7379e-07 0.0000e+00 1.0000e+00 4.7429e+02 4.7429e+02 2.4226e+01 2.4226e+01 1.5212e-05 1.5212e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1080e+00 2.2384e+06 5.8315e+02 4.8320e+02 4.6569e-07 0.0000e+00 1.0000e+00 4.8320e+02 4.8320e+02 2.4681e+01 2.4681e+01 1.5223e-05 1.5223e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1100e+00 2.2780e+06 5.8315e+02 4.9212e+02 4.5786e-07 0.0000e+00 1.0000e+00 4.9212e+02 4.9212e+02 2.5136e+01 2.5136e+01 1.5234e-05 1.5234e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1120e+00 2.3176e+06 5.8315e+02 5.0104e+02 4.5030e-07 0.0000e+00 1.0000e+00 5.0104e+02 5.0104e+02 2.5592e+01 2.5592e+01 1.5244e-05 1.5244e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1140e+00 2.3572e+06 5.8315e+02 5.0999e+02 4.4300e-07 0.0000e+00 1.0000e+00 5.0999e+02 5.0999e+02 2.6049e+01 2.6049e+01 1.5255e-05 1.5255e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1160e+00 2.3968e+06 5.8315e+02 5.1894e+02 4.3593e-07 0.0000e+00 1.0000e+00 5.1894e+02 5.1894e+02 2.6506e+01 2.6506e+01 1.5266e-05 1.5266e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1180e+00 2.4364e+06 5.8315e+02 5.2790e+02 4.2909e-07 0.0000e+00 1.0000e+00 5.2790e+02 5.2790e+02 2.6964e+01 2.6964e+01 1.5277e-05 1.5277e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1200e+00 2.4760e+06 5.8315e+02 5.3688e+02 4.2246e-07 0.0000e+00 1.0000e+00 5.3688e+02 5.3688e+02 2.7422e+01 2.7422e+01 1.5289e-05 1.5289e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1220e+00 2.5156e+06 5.8315e+02 5.4587e+02 4.1604e-07 0.0000e+00 1.0000e+00 5.4587e+02 5.4587e+02 2.7881e+01 2.7881e+01 1.5300e-05 1.5300e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1240e+00 2.5552e+06 5.8315e+02 5.5486e+02 4.0982e-07 0.0000e+00 1.0000e+00 5.5486e+02 5.5486e+02 2.8341e+01 2.8341e+01 1.5311e-05 1.5311e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1260e+00 2.5948e+06 5.8315e+02 5.6388e+02 4.0379e-07 0.0000e+00 1.0000e+00 5.6388e+02 5.6388e+02 2.8801e+01 2.8801e+01 1.5323e-05 1.5323e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1280e+00 2.6344e+06 5.8315e+02 5.7290e+02 3.9794e-07 0.0000e+00 1.0000e+00 5.7290e+02 5.7290e+02 2.9262e+01 2.9262e+01 1.5334e-05 1.5334e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1300e+00 2.6740e+06 5.8315e+02 5.8193e+02 3.9225e-07 0.0000e+00 1.0000e+00 5.8193e+02 5.8193e+02 2.9723e+01 2.9723e+01 1.5346e-05 1.5346e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1320e+00 2.7136e+06 5.8315e+02 5.9098e+02 3.8673e-07 0.0000e+00 1.0000e+00 5.9098e+02 5.9098e+02 3.0185e+01 3.0185e+01 1.5357e-05 1.5357e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1340e+00 2.7532e+06 5.8315e+02 6.0003e+02 3.8137e-07 0.0000e+00 1.0000e+00 6.0003e+02 6.0003e+02 3.0648e+01 3.0648e+01 1.5369e-05 1.5369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1360e+00 2.7928e+06 5.8315e+02 6.0910e+02 3.7616e-07 0.0000e+00 1.0000e+00 6.0910e+02 6.0910e+02 3.1111e+01 3.1111e+01 1.5381e-05 1.5381e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1380e+00 2.8324e+06 5.8315e+02 6.1818e+02 3.7109e-07 0.0000e+00 1.0000e+00 6.1818e+02 6.1818e+02 3.1575e+01 3.1575e+01 1.5393e-05 1.5393e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1400e+00 2.8720e+06 5.8315e+02 6.2727e+02 3.6616e-07 0.0000e+00 1.0000e+00 6.2727e+02 6.2727e+02 3.2039e+01 3.2039e+01 1.5405e-05 1.5405e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1420e+00 2.9116e+06 5.8315e+02 6.3637e+02 3.6136e-07 0.0000e+00 1.0000e+00 6.3637e+02 6.3637e+02 3.2504e+01 3.2504e+01 1.5418e-05 1.5418e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1440e+00 2.9512e+06 5.8315e+02 6.4548e+02 3.5668e-07 0.0000e+00 1.0000e+00 6.4548e+02 6.4548e+02 3.2969e+01 3.2969e+01 1.5430e-05 1.5430e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1460e+00 2.9908e+06 5.8315e+02 6.5460e+02 3.5213e-07 0.0000e+00 1.0000e+00 6.5460e+02 6.5460e+02 3.3435e+01 3.3435e+01 1.5442e-05 1.5442e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1480e+00 3.0304e+06 5.8315e+02 6.6374e+02 3.4770e-07 0.0000e+00 1.0000e+00 6.6374e+02 6.6374e+02 3.3902e+01 3.3902e+01 1.5455e-05 1.5455e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1500e+00 3.0700e+06 5.8315e+02 6.7288e+02 3.4337e-07 0.0000e+00 1.0000e+00 6.7288e+02 6.7288e+02 3.4369e+01 3.4369e+01 1.5467e-05 1.5467e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1520e+00 3.1096e+06 5.8315e+02 6.8204e+02 3.3916e-07 0.0000e+00 1.0000e+00 6.8204e+02 6.8204e+02 3.4837e+01 3.4837e+01 1.5480e-05 1.5480e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1540e+00 3.1492e+06 5.8315e+02 6.9120e+02 3.3505e-07 0.0000e+00 1.0000e+00 6.9120e+02 6.9120e+02 3.5305e+01 3.5305e+01 1.5493e-05 1.5493e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1560e+00 3.1888e+06 5.8315e+02 7.0038e+02 3.3104e-07 0.0000e+00 1.0000e+00 7.0038e+02 7.0038e+02 3.5773e+01 3.5773e+01 1.5506e-05 1.5506e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1580e+00 3.2284e+06 5.8315e+02 7.0956e+02 3.2713e-07 0.0000e+00 1.0000e+00 7.0956e+02 7.0956e+02 3.6243e+01 3.6243e+01 1.5519e-05 1.5519e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1600e+00 3.2680e+06 5.8315e+02 7.1876e+02 3.2331e-07 0.0000e+00 1.0000e+00 7.1876e+02 7.1876e+02 3.6712e+01 3.6712e+01 1.5532e-05 1.5532e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1620e+00 3.3076e+06 5.8315e+02 7.2797e+02 3.1957e-07 0.0000e+00 1.0000e+00 7.2797e+02 7.2797e+02 3.7183e+01 3.7183e+01 1.5545e-05 1.5545e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1640e+00 3.3472e+06 5.8315e+02 7.3719e+02 3.1593e-07 0.0000e+00 1.0000e+00 7.3719e+02 7.3719e+02 3.7653e+01 3.7653e+01 1.5558e-05 1.5558e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1660e+00 3.3868e+06 5.8315e+02 7.4641e+02 3.1237e-07 0.0000e+00 1.0000e+00 7.4641e+02 7.4641e+02 3.8125e+01 3.8125e+01 1.5572e-05 1.5572e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1680e+00 3.4264e+06 5.8315e+02 7.5565e+02 3.0889e-07 0.0000e+00 1.0000e+00 7.5565e+02 7.5565e+02 3.8597e+01 3.8597e+01 1.5585e-05 1.5585e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1700e+00 3.4660e+06 5.8315e+02 7.6490e+02 3.0548e-07 0.0000e+00 1.0000e+00 7.6490e+02 7.6490e+02 3.9069e+01 3.9069e+01 1.5599e-05 1.5599e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1720e+00 3.5056e+06 5.8315e+02 7.7416e+02 3.0215e-07 0.0000e+00 1.0000e+00 7.7416e+02 7.7416e+02 3.9542e+01 3.9542e+01 1.5613e-05 1.5613e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1740e+00 3.5452e+06 5.8315e+02 7.8343e+02 2.9890e-07 0.0000e+00 1.0000e+00 7.8343e+02 7.8343e+02 4.0015e+01 4.0015e+01 1.5626e-05 1.5626e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1760e+00 3.5848e+06 5.8315e+02 7.9270e+02 2.9571e-07 0.0000e+00 1.0000e+00 7.9270e+02 7.9270e+02 4.0489e+01 4.0489e+01 1.5640e-05 1.5640e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1780e+00 3.6244e+06 5.8315e+02 8.0199e+02 2.9259e-07 0.0000e+00 1.0000e+00 8.0199e+02 8.0199e+02 4.0964e+01 4.0964e+01 1.5654e-05 1.5654e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1800e+00 3.6640e+06 5.8315e+02 8.1129e+02 2.8954e-07 0.0000e+00 1.0000e+00 8.1129e+02 8.1129e+02 4.1438e+01 4.1438e+01 1.5668e-05 1.5668e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1820e+00 3.7036e+06 5.8315e+02 8.2060e+02 2.8655e-07 0.0000e+00 1.0000e+00 8.2060e+02 8.2060e+02 4.1914e+01 4.1914e+01 1.5683e-05 1.5683e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1840e+00 3.7432e+06 5.8315e+02 8.2991e+02 2.8362e-07 0.0000e+00 1.0000e+00 8.2991e+02 8.2991e+02 4.2390e+01 4.2390e+01 1.5697e-05 1.5697e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1860e+00 3.7828e+06 5.8315e+02 8.3924e+02 2.8075e-07 0.0000e+00 1.0000e+00 8.3924e+02 8.3924e+02 4.2866e+01 4.2866e+01 1.5711e-05 1.5711e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1880e+00 3.8224e+06 5.8315e+02 8.4857e+02 2.7794e-07 0.0000e+00 1.0000e+00 8.4857e+02 8.4857e+02 4.3343e+01 4.3343e+01 1.5726e-05 1.5726e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1900e+00 3.8620e+06 5.8315e+02 8.5792e+02 2.7519e-07 0.0000e+00 1.0000e+00 8.5792e+02 8.5792e+02 4.3820e+01 4.3820e+01 1.5741e-05 1.5741e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1920e+00 3.9016e+06 5.8315e+02 8.6727e+02 2.7249e-07 0.0000e+00 1.0000e+00 8.6727e+02 8.6727e+02 4.4298e+01 4.4298e+01 1.5755e-05 1.5755e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1940e+00 3.9412e+06 5.8315e+02 8.7663e+02 2.6984e-07 0.0000e+00 1.0000e+00 8.7663e+02 8.7663e+02 4.4776e+01 4.4776e+01 1.5770e-05 1.5770e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1960e+00 3.9808e+06 5.8315e+02 8.8601e+02 2.6724e-07 0.0000e+00 1.0000e+00 8.8601e+02 8.8601e+02 4.5255e+01 4.5255e+01 1.5785e-05 1.5785e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1980e+00 4.0204e+06 5.8315e+02 8.9539e+02 2.6469e-07 0.0000e+00 1.0000e+00 8.9539e+02 8.9539e+02 4.5734e+01 4.5734e+01 1.5800e-05 1.5800e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e+00 4.0600e+06 5.8315e+02 9.0478e+02 2.6219e-07 0.0000e+00 1.0000e+00 9.0478e+02 9.0478e+02 4.6214e+01 4.6214e+01 1.5816e-05 1.5816e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2020e+00 4.0996e+06 5.8315e+02 9.1417e+02 2.5974e-07 0.0000e+00 1.0000e+00 9.1417e+02 9.1417e+02 4.6694e+01 4.6694e+01 1.5831e-05 1.5831e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2040e+00 4.1392e+06 5.8315e+02 9.2358e+02 2.5733e-07 0.0000e+00 1.0000e+00 9.2358e+02 9.2358e+02 4.7174e+01 4.7174e+01 1.5846e-05 1.5846e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2060e+00 4.1788e+06 5.8315e+02 9.3300e+02 2.5496e-07 0.0000e+00 1.0000e+00 9.3300e+02 9.3300e+02 4.7655e+01 4.7655e+01 1.5862e-05 1.5862e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2080e+00 4.2184e+06 5.8315e+02 9.4242e+02 2.5264e-07 0.0000e+00 1.0000e+00 9.4242e+02 9.4242e+02 4.8136e+01 4.8136e+01 1.5877e-05 1.5877e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2100e+00 4.2580e+06 5.8315e+02 9.5185e+02 2.5036e-07 0.0000e+00 1.0000e+00 9.5185e+02 9.5185e+02 4.8618e+01 4.8618e+01 1.5893e-05 1.5893e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2120e+00 4.2976e+06 5.8315e+02 9.6130e+02 2.4812e-07 0.0000e+00 1.0000e+00 9.6130e+02 9.6130e+02 4.9100e+01 4.9100e+01 1.5909e-05 1.5909e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2140e+00 4.3372e+06 5.8315e+02 9.7074e+02 2.4592e-07 0.0000e+00 1.0000e+00 9.7074e+02 9.7074e+02 4.9583e+01 4.9583e+01 1.5925e-05 1.5925e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2160e+00 4.3768e+06 5.8315e+02 9.8020e+02 2.4376e-07 0.0000e+00 1.0000e+00 9.8020e+02 9.8020e+02 5.0066e+01 5.0066e+01 1.5941e-05 1.5941e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2180e+00 4.4164e+06 5.8315e+02 9.8967e+02 2.4163e-07 0.0000e+00 1.0000e+00 9.8967e+02 9.8967e+02 5.0550e+01 5.0550e+01 1.5957e-05 1.5957e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2200e+00 4.4560e+06 5.8315e+02 9.9914e+02 2.3954e-07 0.0000e+00 1.0000e+00 9.9914e+02 9.9914e+02 5.1033e+01 5.1033e+01 1.5973e-05 1.5973e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2220e+00 4.4956e+06 5.8315e+02 1.0086e+03 2.3749e-07 0.0000e+00 1.0000e+00 1.0086e+03 1.0086e+03 5.1518e+01 5.1518e+01 1.5990e-05 1.5990e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2240e+00 4.5352e+06 5.8315e+02 1.0181e+03 2.3546e-07 0.0000e+00 1.0000e+00 1.0181e+03 1.0181e+03 5.2002e+01 5.2002e+01 1.6006e-05 1.6006e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2260e+00 4.5748e+06 5.8315e+02 1.0276e+03 2.3348e-07 0.0000e+00 1.0000e+00 1.0276e+03 1.0276e+03 5.2488e+01 5.2488e+01 1.6023e-05 1.6023e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2280e+00 4.6144e+06 5.8315e+02 1.0371e+03 2.3152e-07 0.0000e+00 1.0000e+00 1.0371e+03 1.0371e+03 5.2973e+01 5.2973e+01 1.6039e-05 1.6039e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2300e+00 4.6540e+06 5.8315e+02 1.0466e+03 2.2960e-07 0.0000e+00 1.0000e+00 1.0466e+03 1.0466e+03 5.3459e+01 5.3459e+01 1.6056e-05 1.6056e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2320e+00 4.6936e+06 5.8315e+02 1.0561e+03 2.2771e-07 0.0000e+00 1.0000e+00 1.0561e+03 1.0561e+03 5.3945e+01 5.3945e+01 1.6073e-05 1.6073e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2340e+00 4.7332e+06 5.8315e+02 1.0657e+03 2.2584e-07 0.0000e+00 1.0000e+00 1.0657e+03 1.0657e+03 5.4432e+01 5.4432e+01 1.6090e-05 1.6090e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2360e+00 4.7728e+06 5.8315e+02 1.0752e+03 2.2401e-07 0.0000e+00 1.0000e+00 1.0752e+03 1.0752e+03 5.4919e+01 5.4919e+01 1.6107e-05 1.6107e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2380e+00 4.8124e+06 5.8315e+02 1.0847e+03 2.2221e-07 0.0000e+00 1.0000e+00 1.0847e+03 1.0847e+03 5.5406e+01 5.5406e+01 1.6125e-05 1.6125e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2400e+00 4.8520e+06 5.8315e+02 1.0943e+03 2.2043e-07 0.0000e+00 1.0000e+00 1.0943e+03 1.0943e+03 5.5894e+01 5.5894e+01 1.6142e-05 1.6142e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2420e+00 4.8916e+06 5.8315e+02 1.1039e+03 2.1868e-07 0.0000e+00 1.0000e+00 1.1039e+03 1.1039e+03 5.6382e+01 5.6382e+01 1.6159e-05 1.6159e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2440e+00 4.9312e+06 5.8315e+02 1.1134e+03 2.1696e-07 0.0000e+00 1.0000e+00 1.1134e+03 1.1134e+03 5.6870e+01 5.6870e+01 1.6177e-05 1.6177e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2460e+00 4.9708e+06 5.8315e+02 1.1230e+03 2.1526e-07 0.0000e+00 1.0000e+00 1.1230e+03 1.1230e+03 5.7359e+01 5.7359e+01 1.6195e-05 1.6195e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2480e+00 5.0104e+06 5.8315e+02 1.1326e+03 2.1359e-07 0.0000e+00 1.0000e+00 1.1326e+03 1.1326e+03 5.7848e+01 5.7848e+01 1.6212e-05 1.6212e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2500e+00 5.0500e+06 5.8315e+02 1.1421e+03 2.1194e-07 0.0000e+00 1.0000e+00 1.1421e+03 1.1421e+03 5.8338e+01 5.8338e+01 1.6230e-05 1.6230e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2520e+00 5.0896e+06 5.8315e+02 1.1517e+03 2.1032e-07 0.0000e+00 1.0000e+00 1.1517e+03 1.1517e+03 5.8827e+01 5.8827e+01 1.6248e-05 1.6248e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2540e+00 5.1292e+06 5.8315e+02 1.1613e+03 2.0872e-07 0.0000e+00 1.0000e+00 1.1613e+03 1.1613e+03 5.9318e+01 5.9318e+01 1.6267e-05 1.6267e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2560e+00 5.1688e+06 5.8315e+02 1.1709e+03 2.0714e-07 0.0000e+00 1.0000e+00 1.1709e+03 1.1709e+03 5.9808e+01 5.9808e+01 1.6285e-05 1.6285e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2580e+00 5.2084e+06 5.8315e+02 1.1805e+03 2.0559e-07 0.0000e+00 1.0000e+00 1.1805e+03 1.1805e+03 6.0299e+01 6.0299e+01 1.6303e-05 1.6303e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2600e+00 5.2480e+06 5.8315e+02 1.1902e+03 2.0406e-07 0.0000e+00 1.0000e+00 1.1902e+03 1.1902e+03 6.0790e+01 6.0790e+01 1.6322e-05 1.6322e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2620e+00 5.2876e+06 5.8315e+02 1.1998e+03 2.0255e-07 0.0000e+00 1.0000e+00 1.1998e+03 1.1998e+03 6.1281e+01 6.1281e+01 1.6340e-05 1.6340e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2640e+00 5.3272e+06 5.8315e+02 1.2094e+03 2.0106e-07 0.0000e+00 1.0000e+00 1.2094e+03 1.2094e+03 6.1773e+01 6.1773e+01 1.6359e-05 1.6359e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2660e+00 5.3668e+06 5.8315e+02 1.2190e+03 1.9959e-07 0.0000e+00 1.0000e+00 1.2190e+03 1.2190e+03 6.2265e+01 6.2265e+01 1.6378e-05 1.6378e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2680e+00 5.4064e+06 5.8315e+02 1.2287e+03 1.9814e-07 0.0000e+00 1.0000e+00 1.2287e+03 1.2287e+03 6.2757e+01 6.2757e+01 1.6397e-05 1.6397e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2700e+00 5.4460e+06 5.8315e+02 1.2383e+03 1.9671e-07 0.0000e+00 1.0000e+00 1.2383e+03 1.2383e+03 6.3250e+01 6.3250e+01 1.6416e-05 1.6416e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2720e+00 5.4856e+06 5.8315e+02 1.2480e+03 1.9530e-07 0.0000e+00 1.0000e+00 1.2480e+03 1.2480e+03 6.3743e+01 6.3743e+01 1.6435e-05 1.6435e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2740e+00 5.5252e+06 5.8315e+02 1.2576e+03 1.9391e-07 0.0000e+00 1.0000e+00 1.2576e+03 1.2576e+03 6.4236e+01 6.4236e+01 1.6454e-05 1.6454e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2760e+00 5.5648e+06 5.8315e+02 1.2673e+03 1.9253e-07 0.0000e+00 1.0000e+00 1.2673e+03 1.2673e+03 6.4729e+01 6.4729e+01 1.6474e-05 1.6474e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2780e+00 5.6044e+06 5.8315e+02 1.2769e+03 1.9118e-07 0.0000e+00 1.0000e+00 1.2769e+03 1.2769e+03 6.5223e+01 6.5223e+01 1.6493e-05 1.6493e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2800e+00 5.6440e+06 5.8315e+02 1.2866e+03 1.8984e-07 0.0000e+00 1.0000e+00 1.2866e+03 1.2866e+03 6.5717e+01 6.5717e+01 1.6513e-05 1.6513e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2820e+00 5.6836e+06 5.8315e+02 1.2963e+03 1.8852e-07 0.0000e+00 1.0000e+00 1.2963e+03 1.2963e+03 6.6211e+01 6.6211e+01 1.6533e-05 1.6533e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2840e+00 5.7232e+06 5.8315e+02 1.3060e+03 1.8721e-07 0.0000e+00 1.0000e+00 1.3060e+03 1.3060e+03 6.6705e+01 6.6705e+01 1.6553e-05 1.6553e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2860e+00 5.7628e+06 5.8315e+02 1.3156e+03 1.8593e-07 0.0000e+00 1.0000e+00 1.3156e+03 1.3156e+03 6.7200e+01 6.7200e+01 1.6572e-05 1.6572e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2880e+00 5.8024e+06 5.8315e+02 1.3253e+03 1.8466e-07 0.0000e+00 1.0000e+00 1.3253e+03 1.3253e+03 6.7695e+01 6.7695e+01 1.6593e-05 1.6593e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2900e+00 5.8420e+06 5.8315e+02 1.3350e+03 1.8340e-07 0.0000e+00 1.0000e+00 1.3350e+03 1.3350e+03 6.8190e+01 6.8190e+01 1.6613e-05 1.6613e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2920e+00 5.8816e+06 5.8315e+02 1.3447e+03 1.8216e-07 0.0000e+00 1.0000e+00 1.3447e+03 1.3447e+03 6.8685e+01 6.8685e+01 1.6633e-05 1.6633e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2940e+00 5.9212e+06 5.8315e+02 1.3544e+03 1.8094e-07 0.0000e+00 1.0000e+00 1.3544e+03 1.3544e+03 6.9181e+01 6.9181e+01 1.6654e-05 1.6654e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2960e+00 5.9608e+06 5.8315e+02 1.3641e+03 1.7973e-07 0.0000e+00 1.0000e+00 1.3641e+03 1.3641e+03 6.9677e+01 6.9677e+01 1.6674e-05 1.6674e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2980e+00 6.0004e+06 5.8315e+02 1.3738e+03 1.7853e-07 0.0000e+00 1.0000e+00 1.3738e+03 1.3738e+03 7.0173e+01 7.0173e+01 1.6695e-05 1.6695e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3000e+00 6.0400e+06 5.8315e+02 1.3836e+03 1.7735e-07 0.0000e+00 1.0000e+00 1.3836e+03 1.3836e+03 7.0669e+01 7.0669e+01 1.6716e-05 1.6716e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3020e+00 6.0796e+06 5.8315e+02 1.3933e+03 1.7619e-07 0.0000e+00 1.0000e+00 1.3933e+03 1.3933e+03 7.1165e+01 7.1165e+01 1.6736e-05 1.6736e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3040e+00 6.1192e+06 5.8315e+02 1.4030e+03 1.7503e-07 0.0000e+00 1.0000e+00 1.4030e+03 1.4030e+03 7.1662e+01 7.1662e+01 1.6757e-05 1.6757e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3060e+00 6.1588e+06 5.8315e+02 1.4127e+03 1.7389e-07 0.0000e+00 1.0000e+00 1.4127e+03 1.4127e+03 7.2159e+01 7.2159e+01 1.6779e-05 1.6779e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3080e+00 6.1984e+06 5.8315e+02 1.4225e+03 1.7277e-07 0.0000e+00 1.0000e+00 1.4225e+03 1.4225e+03 7.2656e+01 7.2656e+01 1.6800e-05 1.6800e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3100e+00 6.2380e+06 5.8315e+02 1.4322e+03 1.7165e-07 0.0000e+00 1.0000e+00 1.4322e+03 1.4322e+03 7.3153e+01 7.3153e+01 1.6821e-05 1.6821e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3120e+00 6.2776e+06 5.8315e+02 1.4419e+03 1.7055e-07 0.0000e+00 1.0000e+00 1.4419e+03 1.4419e+03 7.3650e+01 7.3650e+01 1.6843e-05 1.6843e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3140e+00 6.3172e+06 5.8315e+02 1.4517e+03 1.6947e-07 0.0000e+00 1.0000e+00 1.4517e+03 1.4517e+03 7.4148e+01 7.4148e+01 1.6864e-05 1.6864e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3160e+00 6.3568e+06 5.8315e+02 1.4614e+03 1.6839e-07 0.0000e+00 1.0000e+00 1.4614e+03 1.4614e+03 7.4645e+01 7.4645e+01 1.6886e-05 1.6886e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3180e+00 6.3964e+06 5.8315e+02 1.4712e+03 1.6733e-07 0.0000e+00 1.0000e+00 1.4712e+03 1.4712e+03 7.5143e+01 7.5143e+01 1.6908e-05 1.6908e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3200e+00 6.4360e+06 5.8315e+02 1.4809e+03 1.6627e-07 0.0000e+00 1.0000e+00 1.4809e+03 1.4809e+03 7.5641e+01 7.5641e+01 1.6930e-05 1.6930e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3220e+00 6.4756e+06 5.8315e+02 1.4907e+03 1.6523e-07 0.0000e+00 1.0000e+00 1.4907e+03 1.4907e+03 7.6139e+01 7.6139e+01 1.6952e-05 1.6952e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3240e+00 6.5152e+06 5.8315e+02 1.5004e+03 1.6421e-07 0.0000e+00 1.0000e+00 1.5004e+03 1.5004e+03 7.6637e+01 7.6637e+01 1.6974e-05 1.6974e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3260e+00 6.5548e+06 5.8315e+02 1.5102e+03 1.6319e-07 0.0000e+00 1.0000e+00 1.5102e+03 1.5102e+03 7.7136e+01 7.7136e+01 1.6996e-05 1.6996e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3280e+00 6.5944e+06 5.8315e+02 1.5199e+03 1.6218e-07 0.0000e+00 1.0000e+00 1.5199e+03 1.5199e+03 7.7634e+01 7.7634e+01 1.7019e-05 1.7019e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3300e+00 6.6340e+06 5.8315e+02 1.5297e+03 1.6119e-07 0.0000e+00 1.0000e+00 1.5297e+03 1.5297e+03 7.8133e+01 7.8133e+01 1.7041e-05 1.7041e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3320e+00 6.6736e+06 5.8315e+02 1.5395e+03 1.6020e-07 0.0000e+00 1.0000e+00 1.5395e+03 1.5395e+03 7.8632e+01 7.8632e+01 1.7064e-05 1.7064e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3340e+00 6.7132e+06 5.8315e+02 1.5492e+03 1.5923e-07 0.0000e+00 1.0000e+00 1.5492e+03 1.5492e+03 7.9131e+01 7.9131e+01 1.7087e-05 1.7087e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3360e+00 6.7528e+06 5.8315e+02 1.5590e+03 1.5826e-07 0.0000e+00 1.0000e+00 1.5590e+03 1.5590e+03 7.9630e+01 7.9630e+01 1.7110e-05 1.7110e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3380e+00 6.7924e+06 5.8315e+02 1.5688e+03 1.5731e-07 0.0000e+00 1.0000e+00 1.5688e+03 1.5688e+03 8.0129e+01 8.0129e+01 1.7133e-05 1.7133e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3400e+00 6.8320e+06 5.8315e+02 1.5785e+03 1.5636e-07 0.0000e+00 1.0000e+00 1.5785e+03 1.5785e+03 8.0628e+01 8.0628e+01 1.7156e-05 1.7156e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3420e+00 6.8716e+06 5.8315e+02 1.5883e+03 1.5543e-07 0.0000e+00 1.0000e+00 1.5883e+03 1.5883e+03 8.1127e+01 8.1127e+01 1.7179e-05 1.7179e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3440e+00 6.9112e+06 5.8315e+02 1.5981e+03 1.5450e-07 0.0000e+00 1.0000e+00 1.5981e+03 1.5981e+03 8.1627e+01 8.1627e+01 1.7202e-05 1.7202e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3460e+00 6.9508e+06 5.8315e+02 1.6079e+03 1.5359e-07 0.0000e+00 1.0000e+00 1.6079e+03 1.6079e+03 8.2126e+01 8.2126e+01 1.7226e-05 1.7226e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3480e+00 6.9904e+06 5.8315e+02 1.6177e+03 1.5268e-07 0.0000e+00 1.0000e+00 1.6177e+03 1.6177e+03 8.2626e+01 8.2626e+01 1.7249e-05 1.7249e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3500e+00 7.0300e+06 5.8315e+02 1.6274e+03 1.5178e-07 0.0000e+00 1.0000e+00 1.6274e+03 1.6274e+03 8.3125e+01 8.3125e+01 1.7273e-05 1.7273e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3520e+00 7.0696e+06 5.8315e+02 1.6372e+03 1.5089e-07 0.0000e+00 1.0000e+00 1.6372e+03 1.6372e+03 8.3625e+01 8.3625e+01 1.7297e-05 1.7297e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3540e+00 7.1092e+06 5.8315e+02 1.6470e+03 1.5001e-07 0.0000e+00 1.0000e+00 1.6470e+03 1.6470e+03 8.4125e+01 8.4125e+01 1.7321e-05 1.7321e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3560e+00 7.1488e+06 5.8315e+02 1.6568e+03 1.4914e-07 0.0000e+00 1.0000e+00 1.6568e+03 1.6568e+03 8.4624e+01 8.4624e+01 1.7345e-05 1.7345e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3580e+00 7.1884e+06 5.8315e+02 1.6666e+03 1.4828e-07 0.0000e+00 1.0000e+00 1.6666e+03 1.6666e+03 8.5124e+01 8.5124e+01 1.7369e-05 1.7369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3600e+00 7.2280e+06 5.8315e+02 1.6764e+03 1.4743e-07 0.0000e+00 1.0000e+00 1.6764e+03 1.6764e+03 8.5624e+01 8.5624e+01 1.7393e-05 1.7393e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3620e+00 7.2676e+06 5.8315e+02 1.6862e+03 1.4658e-07 0.0000e+00 1.0000e+00 1.6862e+03 1.6862e+03 8.6124e+01 8.6124e+01 1.7417e-05 1.7417e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3640e+00 7.3072e+06 5.8315e+02 1.6959e+03 1.4574e-07 0.0000e+00 1.0000e+00 1.6959e+03 1.6959e+03 8.6624e+01 8.6624e+01 1.7442e-05 1.7442e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3660e+00 7.3468e+06 5.8315e+02 1.7057e+03 1.4491e-07 0.0000e+00 1.0000e+00 1.7057e+03 1.7057e+03 8.7124e+01 8.7124e+01 1.7467e-05 1.7467e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3680e+00 7.3864e+06 5.8315e+02 1.7155e+03 1.4409e-07 0.0000e+00 1.0000e+00 1.7155e+03 1.7155e+03 8.7624e+01 8.7624e+01 1.7491e-05 1.7491e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3700e+00 7.4260e+06 5.8315e+02 1.7253e+03 1.4328e-07 0.0000e+00 1.0000e+00 1.7253e+03 1.7253e+03 8.8124e+01 8.8124e+01 1.7516e-05 1.7516e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3720e+00 7.4656e+06 5.8315e+02 1.7351e+03 1.4247e-07 0.0000e+00 1.0000e+00 1.7351e+03 1.7351e+03 8.8624e+01 8.8624e+01 1.7541e-05 1.7541e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3740e+00 7.5052e+06 5.8315e+02 1.7449e+03 1.4167e-07 0.0000e+00 1.0000e+00 1.7449e+03 1.7449e+03 8.9124e+01 8.9124e+01 1.7566e-05 1.7566e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3760e+00 7.5448e+06 5.8315e+02 1.7547e+03 1.4088e-07 0.0000e+00 1.0000e+00 1.7547e+03 1.7547e+03 8.9624e+01 8.9624e+01 1.7591e-05 1.7591e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3780e+00 7.5844e+06 5.8315e+02 1.7645e+03 1.4009e-07 0.0000e+00 1.0000e+00 1.7645e+03 1.7645e+03 9.0124e+01 9.0124e+01 1.7617e-05 1.7617e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3800e+00 7.6240e+06 5.8315e+02 1.7742e+03 1.3931e-07 0.0000e+00 1.0000e+00 1.7742e+03 1.7742e+03 9.0624e+01 9.0624e+01 1.7642e-05 1.7642e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3820e+00 7.6636e+06 5.8315e+02 1.7840e+03 1.3854e-07 0.0000e+00 1.0000e+00 1.7840e+03 1.7840e+03 9.1124e+01 9.1124e+01 1.7668e-05 1.7668e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3840e+00 7.7032e+06 5.8315e+02 1.7938e+03 1.3778e-07 0.0000e+00 1.0000e+00 1.7938e+03 1.7938e+03 9.1624e+01 9.1624e+01 1.7693e-05 1.7693e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3860e+00 7.7428e+06 5.8315e+02 1.8036e+03 1.3702e-07 0.0000e+00 1.0000e+00 1.8036e+03 1.8036e+03 9.2124e+01 9.2124e+01 1.7719e-05 1.7719e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3880e+00 7.7824e+06 5.8315e+02 1.8134e+03 1.3627e-07 0.0000e+00 1.0000e+00 1.8134e+03 1.8134e+03 9.2623e+01 9.2623e+01 1.7745e-05 1.7745e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3900e+00 7.8220e+06 5.8315e+02 1.8232e+03 1.3553e-07 0.0000e+00 1.0000e+00 1.8232e+03 1.8232e+03 9.3123e+01 9.3123e+01 1.7771e-05 1.7771e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3920e+00 7.8616e+06 5.8315e+02 1.8330e+03 1.3479e-07 0.0000e+00 1.0000e+00 1.8330e+03 1.8330e+03 9.3623e+01 9.3623e+01 1.7797e-05 1.7797e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3940e+00 7.9012e+06 5.8315e+02 1.8427e+03 1.3406e-07 0.0000e+00 1.0000e+00 1.8427e+03 1.8427e+03 9.4123e+01 9.4123e+01 1.7823e-05 1.7823e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3960e+00 7.9408e+06 5.8315e+02 1.8525e+03 1.3334e-07 0.0000e+00 1.0000e+00 1.8525e+03 1.8525e+03 9.4622e+01 9.4622e+01 1.7850e-05 1.7850e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3980e+00 7.9804e+06 5.8315e+02 1.8623e+03 1.3262e-07 0.0000e+00 1.0000e+00 1.8623e+03 1.8623e+03 9.5122e+01 9.5122e+01 1.7876e-05 1.7876e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4000e+00 8.0200e+06 5.8315e+02 1.8721e+03 1.3191e-07 0.0000e+00 1.0000e+00 1.8721e+03 1.8721e+03 9.5621e+01 9.5621e+01 1.7902e-05 1.7902e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4020e+00 8.0596e+06 5.8315e+02 1.8819e+03 1.3120e-07 0.0000e+00 1.0000e+00 1.8819e+03 1.8819e+03 9.6121e+01 9.6121e+01 1.7929e-05 1.7929e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4040e+00 8.0992e+06 5.8315e+02 1.8916e+03 1.3050e-07 0.0000e+00 1.0000e+00 1.8916e+03 1.8916e+03 9.6620e+01 9.6620e+01 1.7956e-05 1.7956e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4060e+00 8.1388e+06 5.8315e+02 1.9014e+03 1.2981e-07 0.0000e+00 1.0000e+00 1.9014e+03 1.9014e+03 9.7120e+01 9.7120e+01 1.7983e-05 1.7983e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4080e+00 8.1784e+06 5.8315e+02 1.9112e+03 1.2912e-07 0.0000e+00 1.0000e+00 1.9112e+03 1.9112e+03 9.7619e+01 9.7619e+01 1.8010e-05 1.8010e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4100e+00 8.2180e+06 5.8315e+02 1.9210e+03 1.2844e-07 0.0000e+00 1.0000e+00 1.9210e+03 1.9210e+03 9.8118e+01 9.8118e+01 1.8037e-05 1.8037e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4120e+00 8.2576e+06 5.8315e+02 1.9307e+03 1.2776e-07 0.0000e+00 1.0000e+00 1.9307e+03 1.9307e+03 9.8617e+01 9.8617e+01 1.8064e-05 1.8064e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4140e+00 8.2972e+06 5.8315e+02 1.9405e+03 1.2709e-07 0.0000e+00 1.0000e+00 1.9405e+03 1.9405e+03 9.9116e+01 9.9116e+01 1.8091e-05 1.8091e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4160e+00 8.3368e+06 5.8315e+02 1.9503e+03 1.2643e-07 0.0000e+00 1.0000e+00 1.9503e+03 1.9503e+03 9.9615e+01 9.9615e+01 1.8119e-05 1.8119e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4180e+00 8.3764e+06 5.8315e+02 1.9600e+03 1.2577e-07 0.0000e+00 1.0000e+00 1.9600e+03 1.9600e+03 1.0011e+02 1.0011e+02 1.8146e-05 1.8146e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4200e+00 8.4160e+06 5.8315e+02 1.9698e+03 1.2511e-07 0.0000e+00 1.0000e+00 1.9698e+03 1.9698e+03 1.0061e+02 1.0061e+02 1.8174e-05 1.8174e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4220e+00 8.4556e+06 5.8315e+02 1.9795e+03 1.2446e-07 0.0000e+00 1.0000e+00 1.9795e+03 1.9795e+03 1.0111e+02 1.0111e+02 1.8202e-05 1.8202e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4240e+00 8.4952e+06 5.8315e+02 1.9893e+03 1.2382e-07 0.0000e+00 1.0000e+00 1.9893e+03 1.9893e+03 1.0161e+02 1.0161e+02 1.8230e-05 1.8230e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4260e+00 8.5348e+06 5.8315e+02 1.9991e+03 1.2318e-07 0.0000e+00 1.0000e+00 1.9991e+03 1.9991e+03 1.0211e+02 1.0211e+02 1.8258e-05 1.8258e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4280e+00 8.5744e+06 5.8315e+02 2.0088e+03 1.2255e-07 0.0000e+00 1.0000e+00 2.0088e+03 2.0088e+03 1.0260e+02 1.0260e+02 1.8286e-05 1.8286e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4300e+00 8.6140e+06 5.8315e+02 2.0186e+03 1.2192e-07 0.0000e+00 1.0000e+00 2.0186e+03 2.0186e+03 1.0310e+02 1.0310e+02 1.8314e-05 1.8314e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4320e+00 8.6536e+06 5.8315e+02 2.0283e+03 1.2129e-07 0.0000e+00 1.0000e+00 2.0283e+03 2.0283e+03 1.0360e+02 1.0360e+02 1.8342e-05 1.8342e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4340e+00 8.6932e+06 5.8315e+02 2.0380e+03 1.2067e-07 0.0000e+00 1.0000e+00 2.0380e+03 2.0380e+03 1.0410e+02 1.0410e+02 1.8371e-05 1.8371e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4360e+00 8.7328e+06 5.8315e+02 2.0478e+03 1.2006e-07 0.0000e+00 1.0000e+00 2.0478e+03 2.0478e+03 1.0459e+02 1.0459e+02 1.8399e-05 1.8399e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4380e+00 8.7724e+06 5.8315e+02 2.0575e+03 1.1945e-07 0.0000e+00 1.0000e+00 2.0575e+03 2.0575e+03 1.0509e+02 1.0509e+02 1.8428e-05 1.8428e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4400e+00 8.8120e+06 5.8315e+02 2.0672e+03 1.1885e-07 0.0000e+00 1.0000e+00 2.0672e+03 2.0672e+03 1.0559e+02 1.0559e+02 1.8457e-05 1.8457e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4420e+00 8.8516e+06 5.8315e+02 2.0770e+03 1.1825e-07 0.0000e+00 1.0000e+00 2.0770e+03 2.0770e+03 1.0609e+02 1.0609e+02 1.8486e-05 1.8486e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4440e+00 8.8912e+06 5.8315e+02 2.0867e+03 1.1765e-07 0.0000e+00 1.0000e+00 2.0867e+03 2.0867e+03 1.0658e+02 1.0658e+02 1.8514e-05 1.8514e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4460e+00 8.9308e+06 5.8315e+02 2.0964e+03 1.1706e-07 0.0000e+00 1.0000e+00 2.0964e+03 2.0964e+03 1.0708e+02 1.0708e+02 1.8544e-05 1.8544e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4480e+00 8.9704e+06 5.8315e+02 2.1061e+03 1.1647e-07 0.0000e+00 1.0000e+00 2.1061e+03 2.1061e+03 1.0758e+02 1.0758e+02 1.8573e-05 1.8573e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4500e+00 9.0100e+06 5.8315e+02 2.1158e+03 1.1589e-07 0.0000e+00 1.0000e+00 2.1158e+03 2.1158e+03 1.0807e+02 1.0807e+02 1.8602e-05 1.8602e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4520e+00 9.0496e+06 5.8315e+02 2.1255e+03 1.1531e-07 0.0000e+00 1.0000e+00 2.1255e+03 2.1255e+03 1.0857e+02 1.0857e+02 1.8631e-05 1.8631e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4540e+00 9.0892e+06 5.8315e+02 2.1353e+03 1.1474e-07 0.0000e+00 1.0000e+00 2.1353e+03 2.1353e+03 1.0906e+02 1.0906e+02 1.8661e-05 1.8661e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4560e+00 9.1288e+06 5.8315e+02 2.1450e+03 1.1417e-07 0.0000e+00 1.0000e+00 2.1450e+03 2.1450e+03 1.0956e+02 1.0956e+02 1.8690e-05 1.8690e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4580e+00 9.1684e+06 5.8315e+02 2.1546e+03 1.1361e-07 0.0000e+00 1.0000e+00 2.1546e+03 2.1546e+03 1.1005e+02 1.1005e+02 1.8720e-05 1.8720e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4600e+00 9.2080e+06 5.8315e+02 2.1643e+03 1.1305e-07 0.0000e+00 1.0000e+00 2.1643e+03 2.1643e+03 1.1055e+02 1.1055e+02 1.8750e-05 1.8750e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4620e+00 9.2476e+06 5.8315e+02 2.1740e+03 1.1249e-07 0.0000e+00 1.0000e+00 2.1740e+03 2.1740e+03 1.1104e+02 1.1104e+02 1.8780e-05 1.8780e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4640e+00 9.2872e+06 5.8315e+02 2.1837e+03 1.1194e-07 0.0000e+00 1.0000e+00 2.1837e+03 2.1837e+03 1.1154e+02 1.1154e+02 1.8810e-05 1.8810e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4660e+00 9.3268e+06 5.8315e+02 2.1934e+03 1.1139e-07 0.0000e+00 1.0000e+00 2.1934e+03 2.1934e+03 1.1203e+02 1.1203e+02 1.8840e-05 1.8840e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4680e+00 9.3664e+06 5.8315e+02 2.2031e+03 1.1085e-07 0.0000e+00 1.0000e+00 2.2031e+03 2.2031e+03 1.1253e+02 1.1253e+02 1.8870e-05 1.8870e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4700e+00 9.4060e+06 5.8315e+02 2.2127e+03 1.1031e-07 0.0000e+00 1.0000e+00 2.2127e+03 2.2127e+03 1.1302e+02 1.1302e+02 1.8900e-05 1.8900e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4720e+00 9.4456e+06 5.8315e+02 2.2224e+03 1.0977e-07 0.0000e+00 1.0000e+00 2.2224e+03 2.2224e+03 1.1351e+02 1.1351e+02 1.8931e-05 1.8931e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4740e+00 9.4852e+06 5.8315e+02 2.2320e+03 1.0924e-07 0.0000e+00 1.0000e+00 2.2320e+03 2.2320e+03 1.1401e+02 1.1401e+02 1.8961e-05 1.8961e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4760e+00 9.5248e+06 5.8315e+02 2.2417e+03 1.0871e-07 0.0000e+00 1.0000e+00 2.2417e+03 2.2417e+03 1.1450e+02 1.1450e+02 1.8992e-05 1.8992e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4780e+00 9.5644e+06 5.8315e+02 2.2513e+03 1.0818e-07 0.0000e+00 1.0000e+00 2.2513e+03 2.2513e+03 1.1499e+02 1.1499e+02 1.9023e-05 1.9023e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4800e+00 9.6040e+06 5.8315e+02 2.2610e+03 1.0766e-07 0.0000e+00 1.0000e+00 2.2610e+03 2.2610e+03 1.1549e+02 1.1549e+02 1.9053e-05 1.9053e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4820e+00 9.6436e+06 5.8315e+02 2.2706e+03 1.0714e-07 0.0000e+00 1.0000e+00 2.2706e+03 2.2706e+03 1.1598e+02 1.1598e+02 1.9084e-05 1.9084e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4840e+00 9.6832e+06 5.8315e+02 2.2803e+03 1.0663e-07 0.0000e+00 1.0000e+00 2.2803e+03 2.2803e+03 1.1647e+02 1.1647e+02 1.9115e-05 1.9115e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4860e+00 9.7228e+06 5.8315e+02 2.2899e+03 1.0612e-07 0.0000e+00 1.0000e+00 2.2899e+03 2.2899e+03 1.1696e+02 1.1696e+02 1.9147e-05 1.9147e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4880e+00 9.7624e+06 5.8315e+02 2.2995e+03 1.0561e-07 0.0000e+00 1.0000e+00 2.2995e+03 2.2995e+03 1.1745e+02 1.1745e+02 1.9178e-05 1.9178e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4900e+00 9.8020e+06 5.8315e+02 2.3091e+03 1.0511e-07 0.0000e+00 1.0000e+00 2.3091e+03 2.3091e+03 1.1794e+02 1.1794e+02 1.9209e-05 1.9209e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4920e+00 9.8416e+06 5.8315e+02 2.3187e+03 1.0461e-07 0.0000e+00 1.0000e+00 2.3187e+03 2.3187e+03 1.1843e+02 1.1843e+02 1.9240e-05 1.9240e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4940e+00 9.8812e+06 5.8315e+02 2.3283e+03 1.0411e-07 0.0000e+00 1.0000e+00 2.3283e+03 2.3283e+03 1.1892e+02 1.1892e+02 1.9272e-05 1.9272e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4960e+00 9.9208e+06 5.8315e+02 2.3379e+03 1.0362e-07 0.0000e+00 1.0000e+00 2.3379e+03 2.3379e+03 1.1941e+02 1.1941e+02 1.9304e-05 1.9304e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.4980e+00 9.9604e+06 5.8315e+02 2.3475e+03 1.0313e-07 0.0000e+00 1.0000e+00 2.3475e+03 2.3475e+03 1.1990e+02 1.1990e+02 1.9335e-05 1.9335e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5000e+00 1.0000e+07 5.8315e+02 2.3571e+03 1.0264e-07 0.0000e+00 1.0000e+00 2.3571e+03 2.3571e+03 1.2039e+02 1.2039e+02 1.9367e-05 1.9367e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5020e+00 1.0100e+07 5.8315e+02 2.3813e+03 1.0143e-07 0.0000e+00 1.0000e+00 2.3813e+03 2.3813e+03 1.2163e+02 1.2163e+02 1.9448e-05 1.9448e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5040e+00 1.0200e+07 5.8315e+02 2.4054e+03 1.0024e-07 0.0000e+00 1.0000e+00 2.4054e+03 2.4054e+03 1.2286e+02 1.2286e+02 1.9529e-05 1.9529e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5060e+00 1.0300e+07 5.8315e+02 2.4295e+03 9.9067e-08 0.0000e+00 1.0000e+00 2.4295e+03 2.4295e+03 1.2409e+02 1.2409e+02 1.9611e-05 1.9611e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5080e+00 1.0400e+07 5.8315e+02 2.4535e+03 9.7914e-08 0.0000e+00 1.0000e+00 2.4535e+03 2.4535e+03 1.2532e+02 1.2532e+02 1.9693e-05 1.9693e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5100e+00 1.0500e+07 5.8315e+02 2.4775e+03 9.6780e-08 0.0000e+00 1.0000e+00 2.4775e+03 2.4775e+03 1.2655e+02 1.2655e+02 1.9776e-05 1.9776e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5120e+00 1.0600e+07 5.8315e+02 2.5015e+03 9.5665e-08 0.0000e+00 1.0000e+00 2.5015e+03 2.5015e+03 1.2777e+02 1.2777e+02 1.9860e-05 1.9860e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5140e+00 1.0700e+07 5.8315e+02 2.5254e+03 9.4567e-08 0.0000e+00 1.0000e+00 2.5254e+03 2.5254e+03 1.2899e+02 1.2899e+02 1.9944e-05 1.9944e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5160e+00 1.0800e+07 5.8315e+02 2.5493e+03 9.3488e-08 0.0000e+00 1.0000e+00 2.5493e+03 2.5493e+03 1.3021e+02 1.3021e+02 2.0029e-05 2.0029e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5180e+00 1.0900e+07 5.8315e+02 2.5731e+03 9.2426e-08 0.0000e+00 1.0000e+00 2.5731e+03 2.5731e+03 1.3143e+02 1.3143e+02 2.0114e-05 2.0114e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5200e+00 1.1000e+07 5.8315e+02 2.5968e+03 9.1381e-08 0.0000e+00 1.0000e+00 2.5968e+03 2.5968e+03 1.3264e+02 1.3264e+02 2.0200e-05 2.0200e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5220e+00 1.1100e+07 5.8315e+02 2.6205e+03 9.0352e-08 0.0000e+00 1.0000e+00 2.6205e+03 2.6205e+03 1.3385e+02 1.3385e+02 2.0286e-05 2.0286e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5240e+00 1.1200e+07 5.8315e+02 2.6442e+03 8.9340e-08 0.0000e+00 1.0000e+00 2.6442e+03 2.6442e+03 1.3506e+02 1.3506e+02 2.0373e-05 2.0373e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5260e+00 1.1300e+07 5.8315e+02 2.6678e+03 8.8343e-08 0.0000e+00 1.0000e+00 2.6678e+03 2.6678e+03 1.3626e+02 1.3626e+02 2.0460e-05 2.0460e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5280e+00 1.1400e+07 5.8315e+02 2.6913e+03 8.7362e-08 0.0000e+00 1.0000e+00 2.6913e+03 2.6913e+03 1.3747e+02 1.3747e+02 2.0548e-05 2.0548e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5300e+00 1.1500e+07 5.8315e+02 2.7148e+03 8.6396e-08 0.0000e+00 1.0000e+00 2.7148e+03 2.7148e+03 1.3866e+02 1.3866e+02 2.0636e-05 2.0636e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5320e+00 1.1600e+07 5.8315e+02 2.7382e+03 8.5444e-08 0.0000e+00 1.0000e+00 2.7382e+03 2.7382e+03 1.3986e+02 1.3986e+02 2.0725e-05 2.0725e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5340e+00 1.1700e+07 5.8315e+02 2.7616e+03 8.4507e-08 0.0000e+00 1.0000e+00 2.7616e+03 2.7616e+03 1.4105e+02 1.4105e+02 2.0814e-05 2.0814e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5360e+00 1.1800e+07 5.8315e+02 2.7849e+03 8.3585e-08 0.0000e+00 1.0000e+00 2.7849e+03 2.7849e+03 1.4225e+02 1.4225e+02 2.0904e-05 2.0904e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5380e+00 1.1900e+07 5.8315e+02 2.8081e+03 8.2676e-08 0.0000e+00 1.0000e+00 2.8081e+03 2.8081e+03 1.4343e+02 1.4343e+02 2.0994e-05 2.0994e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5400e+00 1.2000e+07 5.8315e+02 2.8313e+03 8.1781e-08 0.0000e+00 1.0000e+00 2.8313e+03 2.8313e+03 1.4462e+02 1.4462e+02 2.1085e-05 2.1085e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5420e+00 1.2100e+07 5.8315e+02 2.8545e+03 8.0899e-08 0.0000e+00 1.0000e+00 2.8545e+03 2.8545e+03 1.4580e+02 1.4580e+02 2.1176e-05 2.1176e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5440e+00 1.2200e+07 5.8315e+02 2.8775e+03 8.0030e-08 0.0000e+00 1.0000e+00 2.8775e+03 2.8775e+03 1.4698e+02 1.4698e+02 2.1267e-05 2.1267e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5460e+00 1.2300e+07 5.8315e+02 2.9005e+03 7.9174e-08 0.0000e+00 1.0000e+00 2.9005e+03 2.9005e+03 1.4815e+02 1.4815e+02 2.1359e-05 2.1359e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5480e+00 1.2400e+07 5.8315e+02 2.9234e+03 7.8331e-08 0.0000e+00 1.0000e+00 2.9234e+03 2.9234e+03 1.4932e+02 1.4932e+02 2.1452e-05 2.1452e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5500e+00 1.2500e+07 5.8315e+02 2.9463e+03 7.7500e-08 0.0000e+00 1.0000e+00 2.9463e+03 2.9463e+03 1.5049e+02 1.5049e+02 2.1544e-05 2.1544e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5520e+00 1.2600e+07 5.8315e+02 2.9691e+03 7.6681e-08 0.0000e+00 1.0000e+00 2.9691e+03 2.9691e+03 1.5165e+02 1.5165e+02 2.1637e-05 2.1637e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5540e+00 1.2700e+07 5.8315e+02 2.9918e+03 7.5874e-08 0.0000e+00 1.0000e+00 2.9918e+03 2.9918e+03 1.5282e+02 1.5282e+02 2.1731e-05 2.1731e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5560e+00 1.2800e+07 5.8315e+02 3.0145e+03 7.5078e-08 0.0000e+00 1.0000e+00 3.0145e+03 3.0145e+03 1.5397e+02 1.5397e+02 2.1825e-05 2.1825e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5580e+00 1.2900e+07 5.8315e+02 3.0371e+03 7.4294e-08 0.0000e+00 1.0000e+00 3.0371e+03 3.0371e+03 1.5513e+02 1.5513e+02 2.1919e-05 2.1919e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5600e+00 1.3000e+07 5.8315e+02 3.0596e+03 7.3522e-08 0.0000e+00 1.0000e+00 3.0596e+03 3.0596e+03 1.5628e+02 1.5628e+02 2.2013e-05 2.2013e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5620e+00 1.3100e+07 5.8315e+02 3.0821e+03 7.2760e-08 0.0000e+00 1.0000e+00 3.0821e+03 3.0821e+03 1.5743e+02 1.5743e+02 2.2108e-05 2.2108e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5640e+00 1.3200e+07 5.8315e+02 3.1045e+03 7.2009e-08 0.0000e+00 1.0000e+00 3.1045e+03 3.1045e+03 1.5857e+02 1.5857e+02 2.2204e-05 2.2204e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5660e+00 1.3300e+07 5.8315e+02 3.1268e+03 7.1268e-08 0.0000e+00 1.0000e+00 3.1268e+03 3.1268e+03 1.5971e+02 1.5971e+02 2.2299e-05 2.2299e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5680e+00 1.3400e+07 5.8315e+02 3.1491e+03 7.0538e-08 0.0000e+00 1.0000e+00 3.1491e+03 3.1491e+03 1.6085e+02 1.6085e+02 2.2395e-05 2.2395e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5700e+00 1.3500e+07 5.8315e+02 3.1712e+03 6.9819e-08 0.0000e+00 1.0000e+00 3.1712e+03 3.1712e+03 1.6198e+02 1.6198e+02 2.2491e-05 2.2491e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5720e+00 1.3600e+07 5.8315e+02 3.1933e+03 6.9109e-08 0.0000e+00 1.0000e+00 3.1933e+03 3.1933e+03 1.6311e+02 1.6311e+02 2.2588e-05 2.2588e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5740e+00 1.3700e+07 5.8315e+02 3.2154e+03 6.8409e-08 0.0000e+00 1.0000e+00 3.2154e+03 3.2154e+03 1.6423e+02 1.6423e+02 2.2684e-05 2.2684e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5760e+00 1.3800e+07 5.8315e+02 3.2373e+03 6.7719e-08 0.0000e+00 1.0000e+00 3.2373e+03 3.2373e+03 1.6535e+02 1.6535e+02 2.2781e-05 2.2781e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5780e+00 1.3900e+07 5.8315e+02 3.2592e+03 6.7038e-08 0.0000e+00 1.0000e+00 3.2592e+03 3.2592e+03 1.6647e+02 1.6647e+02 2.2879e-05 2.2879e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e+00 1.4000e+07 5.8315e+02 3.2810e+03 6.6367e-08 0.0000e+00 1.0000e+00 3.2810e+03 3.2810e+03 1.6759e+02 1.6759e+02 2.2976e-05 2.2976e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5820e+00 1.4100e+07 5.8315e+02 3.3028e+03 6.5705e-08 0.0000e+00 1.0000e+00 3.3028e+03 3.3028e+03 1.6870e+02 1.6870e+02 2.3074e-05 2.3074e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5840e+00 1.4200e+07 5.8315e+02 3.3244e+03 6.5052e-08 0.0000e+00 1.0000e+00 3.3244e+03 3.3244e+03 1.6980e+02 1.6980e+02 2.3172e-05 2.3172e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5860e+00 1.4300e+07 5.8315e+02 3.3460e+03 6.4408e-08 0.0000e+00 1.0000e+00 3.3460e+03 3.3460e+03 1.7091e+02 1.7091e+02 2.3271e-05 2.3271e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5880e+00 1.4400e+07 5.8315e+02 3.3675e+03 6.3773e-08 0.0000e+00 1.0000e+00 3.3675e+03 3.3675e+03 1.7200e+02 1.7200e+02 2.3369e-05 2.3369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5900e+00 1.4500e+07 5.8315e+02 3.3890e+03 6.3147e-08 0.0000e+00 1.0000e+00 3.3890e+03 3.3890e+03 1.7310e+02 1.7310e+02 2.3468e-05 2.3468e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5920e+00 1.4600e+07 5.8315e+02 3.4103e+03 6.2528e-08 0.0000e+00 1.0000e+00 3.4103e+03 3.4103e+03 1.7419e+02 1.7419e+02 2.3567e-05 2.3567e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5940e+00 1.4700e+07 5.8315e+02 3.4316e+03 6.1919e-08 0.0000e+00 1.0000e+00 3.4316e+03 3.4316e+03 1.7528e+02 1.7528e+02 2.3666e-05 2.3666e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5960e+00 1.4800e+07 5.8315e+02 3.4528e+03 6.1317e-08 0.0000e+00 1.0000e+00 3.4528e+03 3.4528e+03 1.7636e+02 1.7636e+02 2.3765e-05 2.3765e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5980e+00 1.4900e+07 5.8315e+02 3.4740e+03 6.0724e-08 0.0000e+00 1.0000e+00 3.4740e+03 3.4740e+03 1.7744e+02 1.7744e+02 2.3865e-05 2.3865e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e+00 1.5000e+07 5.8315e+02 3.4950e+03 6.0138e-08 0.0000e+00 1.0000e+00 3.4950e+03 3.4950e+03 1.7852e+02 1.7852e+02 2.3964e-05 2.3964e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6020e+00 1.5100e+07 5.8315e+02 3.5160e+03 5.9560e-08 0.0000e+00 1.0000e+00 3.5160e+03 3.5160e+03 1.7959e+02 1.7959e+02 2.4064e-05 2.4064e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6040e+00 1.5200e+07 5.8315e+02 3.5369e+03 5.8990e-08 0.0000e+00 1.0000e+00 3.5369e+03 3.5369e+03 1.8066e+02 1.8066e+02 2.4164e-05 2.4164e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6060e+00 1.5300e+07 5.8315e+02 3.5577e+03 5.8428e-08 0.0000e+00 1.0000e+00 3.5577e+03 3.5577e+03 1.8172e+02 1.8172e+02 2.4265e-05 2.4265e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6080e+00 1.5400e+07 5.8315e+02 3.5785e+03 5.7872e-08 0.0000e+00 1.0000e+00 3.5785e+03 3.5785e+03 1.8278e+02 1.8278e+02 2.4365e-05 2.4365e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6100e+00 1.5500e+07 5.8315e+02 3.5991e+03 5.7325e-08 0.0000e+00 1.0000e+00 3.5991e+03 3.5991e+03 1.8383e+02 1.8383e+02 2.4465e-05 2.4465e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6120e+00 1.5600e+07 5.8315e+02 3.6197e+03 5.6784e-08 0.0000e+00 1.0000e+00 3.6197e+03 3.6197e+03 1.8489e+02 1.8489e+02 2.4566e-05 2.4566e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6140e+00 1.5700e+07 5.8315e+02 3.6403e+03 5.6251e-08 0.0000e+00 1.0000e+00 3.6403e+03 3.6403e+03 1.8593e+02 1.8593e+02 2.4667e-05 2.4667e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6160e+00 1.5800e+07 5.8315e+02 3.6607e+03 5.5724e-08 0.0000e+00 1.0000e+00 3.6607e+03 3.6607e+03 1.8698e+02 1.8698e+02 2.4768e-05 2.4768e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6180e+00 1.5900e+07 5.8315e+02 3.6811e+03 5.5204e-08 0.0000e+00 1.0000e+00 3.6811e+03 3.6811e+03 1.8802e+02 1.8802e+02 2.4869e-05 2.4869e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e+00 1.6000e+07 5.8315e+02 3.7013e+03 5.4692e-08 0.0000e+00 1.0000e+00 3.7013e+03 3.7013e+03 1.8905e+02 1.8905e+02 2.4970e-05 2.4970e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6220e+00 1.6100e+07 5.8315e+02 3.7215e+03 5.4185e-08 0.0000e+00 1.0000e+00 3.7215e+03 3.7215e+03 1.9009e+02 1.9009e+02 2.5071e-05 2.5071e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6240e+00 1.6200e+07 5.8315e+02 3.7417e+03 5.3686e-08 0.0000e+00 1.0000e+00 3.7417e+03 3.7417e+03 1.9111e+02 1.9111e+02 2.5172e-05 2.5172e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6260e+00 1.6300e+07 5.8315e+02 3.7617e+03 5.3192e-08 0.0000e+00 1.0000e+00 3.7617e+03 3.7617e+03 1.9214e+02 1.9214e+02 2.5273e-05 2.5273e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6280e+00 1.6400e+07 5.8315e+02 3.7817e+03 5.2706e-08 0.0000e+00 1.0000e+00 3.7817e+03 3.7817e+03 1.9316e+02 1.9316e+02 2.5375e-05 2.5375e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6300e+00 1.6500e+07 5.8315e+02 3.8016e+03 5.2225e-08 0.0000e+00 1.0000e+00 3.8016e+03 3.8016e+03 1.9417e+02 1.9417e+02 2.5476e-05 2.5476e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6320e+00 1.6600e+07 5.8315e+02 3.8214e+03 5.1751e-08 0.0000e+00 1.0000e+00 3.8214e+03 3.8214e+03 1.9519e+02 1.9519e+02 2.5578e-05 2.5578e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6340e+00 1.6700e+07 5.8315e+02 3.8411e+03 5.1282e-08 0.0000e+00 1.0000e+00 3.8411e+03 3.8411e+03 1.9619e+02 1.9619e+02 2.5679e-05 2.5679e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6360e+00 1.6800e+07 5.8315e+02 3.8608e+03 5.0820e-08 0.0000e+00 1.0000e+00 3.8608e+03 3.8608e+03 1.9720e+02 1.9720e+02 2.5781e-05 2.5781e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6380e+00 1.6900e+07 5.8315e+02 3.8804e+03 5.0363e-08 0.0000e+00 1.0000e+00 3.8804e+03 3.8804e+03 1.9820e+02 1.9820e+02 2.5882e-05 2.5882e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e+00 1.7000e+07 5.8315e+02 3.8999e+03 4.9912e-08 0.0000e+00 1.0000e+00 3.8999e+03 3.8999e+03 1.9920e+02 1.9920e+02 2.5984e-05 2.5984e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6420e+00 1.7100e+07 5.8315e+02 3.9193e+03 4.9467e-08 0.0000e+00 1.0000e+00 3.9193e+03 3.9193e+03 2.0019e+02 2.0019e+02 2.6086e-05 2.6086e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6440e+00 1.7200e+07 5.8315e+02 3.9386e+03 4.9028e-08 0.0000e+00 1.0000e+00 3.9386e+03 3.9386e+03 2.0118e+02 2.0118e+02 2.6187e-05 2.6187e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6460e+00 1.7300e+07 5.8315e+02 3.9579e+03 4.8594e-08 0.0000e+00 1.0000e+00 3.9579e+03 3.9579e+03 2.0216e+02 2.0216e+02 2.6289e-05 2.6289e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6480e+00 1.7400e+07 5.8315e+02 3.9771e+03 4.8166e-08 0.0000e+00 1.0000e+00 3.9771e+03 3.9771e+03 2.0314e+02 2.0314e+02 2.6391e-05 2.6391e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6500e+00 1.7500e+07 5.8315e+02 3.9962e+03 4.7743e-08 0.0000e+00 1.0000e+00 3.9962e+03 3.9962e+03 2.0412e+02 2.0412e+02 2.6493e-05 2.6493e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6520e+00 1.7600e+07 5.8315e+02 4.0153e+03 4.7325e-08 0.0000e+00 1.0000e+00 4.0153e+03 4.0153e+03 2.0509e+02 2.0509e+02 2.6595e-05 2.6595e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6540e+00 1.7700e+07 5.8315e+02 4.0342e+03 4.6912e-08 0.0000e+00 1.0000e+00 4.0342e+03 4.0342e+03 2.0606e+02 2.0606e+02 2.6696e-05 2.6696e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6560e+00 1.7800e+07 5.8315e+02 4.0531e+03 4.6505e-08 0.0000e+00 1.0000e+00 4.0531e+03 4.0531e+03 2.0702e+02 2.0702e+02 2.6798e-05 2.6798e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6580e+00 1.7900e+07 5.8315e+02 4.0719e+03 4.6102e-08 0.0000e+00 1.0000e+00 4.0719e+03 4.0719e+03 2.0798e+02 2.0798e+02 2.6900e-05 2.6900e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e+00 1.8000e+07 5.8315e+02 4.0907e+03 4.5705e-08 0.0000e+00 1.0000e+00 4.0907e+03 4.0907e+03 2.0894e+02 2.0894e+02 2.7002e-05 2.7002e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6620e+00 1.8100e+07 5.8315e+02 4.1093e+03 4.5312e-08 0.0000e+00 1.0000e+00 4.1093e+03 4.1093e+03 2.0989e+02 2.0989e+02 2.7103e-05 2.7103e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6640e+00 1.8200e+07 5.8315e+02 4.1279e+03 4.4925e-08 0.0000e+00 1.0000e+00 4.1279e+03 4.1279e+03 2.1084e+02 2.1084e+02 2.7205e-05 2.7205e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6660e+00 1.8300e+07 5.8315e+02 4.1464e+03 4.4542e-08 0.0000e+00 1.0000e+00 4.1464e+03 4.1464e+03 2.1179e+02 2.1179e+02 2.7307e-05 2.7307e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6680e+00 1.8400e+07 5.8315e+02 4.1648e+03 4.4164e-08 0.0000e+00 1.0000e+00 4.1648e+03 4.1648e+03 2.1273e+02 2.1273e+02 2.7408e-05 2.7408e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6700e+00 1.8500e+07 5.8315e+02 4.1832e+03 4.3790e-08 0.0000e+00 1.0000e+00 4.1832e+03 4.1832e+03 2.1367e+02 2.1367e+02 2.7510e-05 2.7510e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6720e+00 1.8600e+07 5.8315e+02 4.2015e+03 4.3421e-08 0.0000e+00 1.0000e+00 4.2015e+03 4.2015e+03 2.1460e+02 2.1460e+02 2.7611e-05 2.7611e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6740e+00 1.8700e+07 5.8315e+02 4.2197e+03 4.3056e-08 0.0000e+00 1.0000e+00 4.2197e+03 4.2197e+03 2.1553e+02 2.1553e+02 2.7713e-05 2.7713e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6760e+00 1.8800e+07 5.8315e+02 4.2378e+03 4.2696e-08 0.0000e+00 1.0000e+00 4.2378e+03 4.2378e+03 2.1646e+02 2.1646e+02 2.7814e-05 2.7814e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6780e+00 1.8900e+07 5.8315e+02 4.2559e+03 4.2340e-08 0.0000e+00 1.0000e+00 4.2559e+03 4.2559e+03 2.1738e+02 2.1738e+02 2.7915e-05 2.7915e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e+00 1.9000e+07 5.8315e+02 4.2739e+03 4.1989e-08 0.0000e+00 1.0000e+00 4.2739e+03 4.2739e+03 2.1830e+02 2.1830e+02 2.8017e-05 2.8017e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6820e+00 1.9100e+07 5.8315e+02 4.2918e+03 4.1642e-08 0.0000e+00 1.0000e+00 4.2918e+03 4.2918e+03 2.1921e+02 2.1921e+02 2.8118e-05 2.8118e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6840e+00 1.9200e+07 5.8315e+02 4.3096e+03 4.1299e-08 0.0000e+00 1.0000e+00 4.3096e+03 4.3096e+03 2.2012e+02 2.2012e+02 2.8219e-05 2.8219e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6860e+00 1.9300e+07 5.8315e+02 4.3274e+03 4.0960e-08 0.0000e+00 1.0000e+00 4.3274e+03 4.3274e+03 2.2103e+02 2.2103e+02 2.8320e-05 2.8320e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6880e+00 1.9400e+07 5.8315e+02 4.3451e+03 4.0625e-08 0.0000e+00 1.0000e+00 4.3451e+03 4.3451e+03 2.2193e+02 2.2193e+02 2.8421e-05 2.8421e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6900e+00 1.9500e+07 5.8315e+02 4.3627e+03 4.0294e-08 0.0000e+00 1.0000e+00 4.3627e+03 4.3627e+03 2.2283e+02 2.2283e+02 2.8522e-05 2.8522e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6920e+00 1.9600e+07 5.8315e+02 4.3802e+03 3.9967e-08 0.0000e+00 1.0000e+00 4.3802e+03 4.3802e+03 2.2373e+02 2.2373e+02 2.8623e-05 2.8623e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6940e+00 1.9700e+07 5.8315e+02 4.3977e+03 3.9643e-08 0.0000e+00 1.0000e+00 4.3977e+03 4.3977e+03 2.2462e+02 2.2462e+02 2.8723e-05 2.8723e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6960e+00 1.9800e+07 5.8315e+02 4.4151e+03 3.9324e-08 0.0000e+00 1.0000e+00 4.4151e+03 4.4151e+03 2.2551e+02 2.2551e+02 2.8824e-05 2.8824e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6980e+00 1.9900e+07 5.8315e+02 4.4324e+03 3.9008e-08 0.0000e+00 1.0000e+00 4.4324e+03 4.4324e+03 2.2640e+02 2.2640e+02 2.8925e-05 2.8925e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e+00 2.0000e+07 5.8315e+02 4.4497e+03 3.8697e-08 0.0000e+00 1.0000e+00 4.4497e+03 4.4497e+03 2.2728e+02 2.2728e+02 2.9025e-05 2.9025e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7020e+00 2.0100e+07 5.8315e+02 4.4668e+03 3.8388e-08 0.0000e+00 1.0000e+00 4.4668e+03 4.4668e+03 2.2815e+02 2.2815e+02 2.9125e-05 2.9125e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7040e+00 2.0200e+07 5.8315e+02 4.4840e+03 3.8084e-08 0.0000e+00 1.0000e+00 4.4840e+03 4.4840e+03 2.2903e+02 2.2903e+02 2.9226e-05 2.9226e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7060e+00 2.0300e+07 5.8315e+02 4.5010e+03 3.7783e-08 0.0000e+00 1.0000e+00 4.5010e+03 4.5010e+03 2.2990e+02 2.2990e+02 2.9326e-05 2.9326e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7080e+00 2.0400e+07 5.8315e+02 4.5180e+03 3.7485e-08 0.0000e+00 1.0000e+00 4.5180e+03 4.5180e+03 2.3077e+02 2.3077e+02 2.9426e-05 2.9426e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7100e+00 2.0500e+07 5.8315e+02 4.5349e+03 3.7191e-08 0.0000e+00 1.0000e+00 4.5349e+03 4.5349e+03 2.3163e+02 2.3163e+02 2.9526e-05 2.9526e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7120e+00 2.0600e+07 5.8315e+02 4.5517e+03 3.6900e-08 0.0000e+00 1.0000e+00 4.5517e+03 4.5517e+03 2.3249e+02 2.3249e+02 2.9625e-05 2.9625e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7140e+00 2.0700e+07 5.8315e+02 4.5685e+03 3.6613e-08 0.0000e+00 1.0000e+00 4.5685e+03 4.5685e+03 2.3334e+02 2.3334e+02 2.9725e-05 2.9725e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7160e+00 2.0800e+07 5.8315e+02 4.5852e+03 3.6329e-08 0.0000e+00 1.0000e+00 4.5852e+03 4.5852e+03 2.3420e+02 2.3420e+02 2.9824e-05 2.9824e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7180e+00 2.0900e+07 5.8315e+02 4.6018e+03 3.6048e-08 0.0000e+00 1.0000e+00 4.6018e+03 4.6018e+03 2.3505e+02 2.3505e+02 2.9924e-05 2.9924e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e+00 2.1000e+07 5.8315e+02 4.6183e+03 3.5771e-08 0.0000e+00 1.0000e+00 4.6183e+03 4.6183e+03 2.3589e+02 2.3589e+02 3.0023e-05 3.0023e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7220e+00 2.1100e+07 5.8315e+02 4.6348e+03 3.5496e-08 0.0000e+00 1.0000e+00 4.6348e+03 4.6348e+03 2.3673e+02 2.3673e+02 3.0122e-05 3.0122e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7240e+00 2.1200e+07 5.8315e+02 4.6512e+03 3.5225e-08 0.0000e+00 1.0000e+00 4.6512e+03 4.6512e+03 2.3757e+02 2.3757e+02 3.0221e-05 3.0221e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7260e+00 2.1300e+07 5.8315e+02 4.6676e+03 3.4957e-08 0.0000e+00 1.0000e+00 4.6676e+03 4.6676e+03 2.3841e+02 2.3841e+02 3.0320e-05 3.0320e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7280e+00 2.1400e+07 5.8315e+02 4.6839e+03 3.4691e-08 0.0000e+00 1.0000e+00 4.6839e+03 4.6839e+03 2.3924e+02 2.3924e+02 3.0419e-05 3.0419e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7300e+00 2.1500e+07 5.8315e+02 4.7001e+03 3.4429e-08 0.0000e+00 1.0000e+00 4.7001e+03 4.7001e+03 2.4007e+02 2.4007e+02 3.0518e-05 3.0518e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7320e+00 2.1600e+07 5.8315e+02 4.7162e+03 3.4170e-08 0.0000e+00 1.0000e+00 4.7162e+03 4.7162e+03 2.4089e+02 2.4089e+02 3.0616e-05 3.0616e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7340e+00 2.1700e+07 5.8315e+02 4.7323e+03 3.3914e-08 0.0000e+00 1.0000e+00 4.7323e+03 4.7323e+03 2.4171e+02 2.4171e+02 3.0714e-05 3.0714e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7360e+00 2.1800e+07 5.8315e+02 4.7483e+03 3.3660e-08 0.0000e+00 1.0000e+00 4.7483e+03 4.7483e+03 2.4253e+02 2.4253e+02 3.0813e-05 3.0813e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7380e+00 2.1900e+07 5.8315e+02 4.7643e+03 3.3410e-08 0.0000e+00 1.0000e+00 4.7643e+03 4.7643e+03 2.4335e+02 2.4335e+02 3.0911e-05 3.0911e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e+00 2.2000e+07 5.8315e+02 4.7802e+03 3.3162e-08 0.0000e+00 1.0000e+00 4.7802e+03 4.7802e+03 2.4416e+02 2.4416e+02 3.1009e-05 3.1009e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7420e+00 2.2100e+07 5.8315e+02 4.7960e+03 3.2917e-08 0.0000e+00 1.0000e+00 4.7960e+03 4.7960e+03 2.4497e+02 2.4497e+02 3.1106e-05 3.1106e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7440e+00 2.2200e+07 5.8315e+02 4.8117e+03 3.2674e-08 0.0000e+00 1.0000e+00 4.8117e+03 4.8117e+03 2.4577e+02 2.4577e+02 3.1204e-05 3.1204e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7460e+00 2.2300e+07 5.8315e+02 4.8274e+03 3.2435e-08 0.0000e+00 1.0000e+00 4.8274e+03 4.8274e+03 2.4657e+02 2.4657e+02 3.1301e-05 3.1301e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7480e+00 2.2400e+07 5.8315e+02 4.8431e+03 3.2198e-08 0.0000e+00 1.0000e+00 4.8431e+03 4.8431e+03 2.4737e+02 2.4737e+02 3.1399e-05 3.1399e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7500e+00 2.2500e+07 5.8315e+02 4.8586e+03 3.1963e-08 0.0000e+00 1.0000e+00 4.8586e+03 4.8586e+03 2.4816e+02 2.4816e+02 3.1496e-05 3.1496e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7520e+00 2.2600e+07 5.8315e+02 4.8741e+03 3.1731e-08 0.0000e+00 1.0000e+00 4.8741e+03 4.8741e+03 2.4896e+02 2.4896e+02 3.1593e-05 3.1593e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7540e+00 2.2700e+07 5.8315e+02 4.8895e+03 3.1502e-08 0.0000e+00 1.0000e+00 4.8895e+03 4.8895e+03 2.4974e+02 2.4974e+02 3.1690e-05 3.1690e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7560e+00 2.2800e+07 5.8315e+02 4.9049e+03 3.1275e-08 0.0000e+00 1.0000e+00 4.9049e+03 4.9049e+03 2.5053e+02 2.5053e+02 3.1786e-05 3.1786e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7580e+00 2.2900e+07 5.8315e+02 4.9202e+03 3.1051e-08 0.0000e+00 1.0000e+00 4.9202e+03 4.9202e+03 2.5131e+02 2.5131e+02 3.1883e-05 3.1883e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e+00 2.3000e+07 5.8315e+02 4.9355e+03 3.0829e-08 0.0000e+00 1.0000e+00 4.9355e+03 4.9355e+03 2.5209e+02 2.5209e+02 3.1979e-05 3.1979e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7620e+00 2.3100e+07 5.8315e+02 4.9507e+03 3.0609e-08 0.0000e+00 1.0000e+00 4.9507e+03 4.9507e+03 2.5287e+02 2.5287e+02 3.2076e-05 3.2076e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7640e+00 2.3200e+07 5.8315e+02 4.9658e+03 3.0392e-08 0.0000e+00 1.0000e+00 4.9658e+03 4.9658e+03 2.5364e+02 2.5364e+02 3.2172e-05 3.2172e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7660e+00 2.3300e+07 5.8315e+02 4.9808e+03 3.0177e-08 0.0000e+00 1.0000e+00 4.9808e+03 4.9808e+03 2.5441e+02 2.5441e+02 3.2268e-05 3.2268e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7680e+00 2.3400e+07 5.8315e+02 4.9958e+03 2.9965e-08 0.0000e+00 1.0000e+00 4.9958e+03 4.9958e+03 2.5517e+02 2.5517e+02 3.2363e-05 3.2363e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7700e+00 2.3500e+07 5.8315e+02 5.0108e+03 2.9754e-08 0.0000e+00 1.0000e+00 5.0108e+03 5.0108e+03 2.5594e+02 2.5594e+02 3.2459e-05 3.2459e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7720e+00 2.3600e+07 5.8315e+02 5.0257e+03 2.9546e-08 0.0000e+00 1.0000e+00 5.0257e+03 5.0257e+03 2.5670e+02 2.5670e+02 3.2554e-05 3.2554e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7740e+00 2.3700e+07 5.8315e+02 5.0405e+03 2.9340e-08 0.0000e+00 1.0000e+00 5.0405e+03 5.0405e+03 2.5745e+02 2.5745e+02 3.2650e-05 3.2650e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7760e+00 2.3800e+07 5.8315e+02 5.0552e+03 2.9137e-08 0.0000e+00 1.0000e+00 5.0552e+03 5.0552e+03 2.5821e+02 2.5821e+02 3.2745e-05 3.2745e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7780e+00 2.3900e+07 5.8315e+02 5.0699e+03 2.8935e-08 0.0000e+00 1.0000e+00 5.0699e+03 5.0699e+03 2.5896e+02 2.5896e+02 3.2840e-05 3.2840e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e+00 2.4000e+07 5.8315e+02 5.0846e+03 2.8736e-08 0.0000e+00 1.0000e+00 5.0846e+03 5.0846e+03 2.5971e+02 2.5971e+02 3.2934e-05 3.2934e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7820e+00 2.4100e+07 5.8315e+02 5.0992e+03 2.8539e-08 0.0000e+00 1.0000e+00 5.0992e+03 5.0992e+03 2.6045e+02 2.6045e+02 3.3029e-05 3.3029e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7840e+00 2.4200e+07 5.8315e+02 5.1137e+03 2.8343e-08 0.0000e+00 1.0000e+00 5.1137e+03 5.1137e+03 2.6119e+02 2.6119e+02 3.3123e-05 3.3123e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7860e+00 2.4300e+07 5.8315e+02 5.1281e+03 2.8150e-08 0.0000e+00 1.0000e+00 5.1281e+03 5.1281e+03 2.6193e+02 2.6193e+02 3.3218e-05 3.3218e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7880e+00 2.4400e+07 5.8315e+02 5.1426e+03 2.7959e-08 0.0000e+00 1.0000e+00 5.1426e+03 5.1426e+03 2.6267e+02 2.6267e+02 3.3312e-05 3.3312e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7900e+00 2.4500e+07 5.8315e+02 5.1569e+03 2.7770e-08 0.0000e+00 1.0000e+00 5.1569e+03 5.1569e+03 2.6340e+02 2.6340e+02 3.3406e-05 3.3406e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7920e+00 2.4600e+07 5.8315e+02 5.1712e+03 2.7583e-08 0.0000e+00 1.0000e+00 5.1712e+03 5.1712e+03 2.6413e+02 2.6413e+02 3.3499e-05 3.3499e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7940e+00 2.4700e+07 5.8315e+02 5.1854e+03 2.7397e-08 0.0000e+00 1.0000e+00 5.1854e+03 5.1854e+03 2.6486e+02 2.6486e+02 3.3593e-05 3.3593e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7960e+00 2.4800e+07 5.8315e+02 5.1996e+03 2.7214e-08 0.0000e+00 1.0000e+00 5.1996e+03 5.1996e+03 2.6558e+02 2.6558e+02 3.3686e-05 3.3686e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7980e+00 2.4900e+07 5.8315e+02 5.2137e+03 2.7032e-08 0.0000e+00 1.0000e+00 5.2137e+03 5.2137e+03 2.6630e+02 2.6630e+02 3.3780e-05 3.3780e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e+00 2.5000e+07 5.8315e+02 5.2278e+03 2.6853e-08 0.0000e+00 1.0000e+00 5.2278e+03 5.2278e+03 2.6702e+02 2.6702e+02 3.3873e-05 3.3873e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8020e+00 2.5100e+07 5.8315e+02 5.2418e+03 2.6675e-08 0.0000e+00 1.0000e+00 5.2418e+03 5.2418e+03 2.6774e+02 2.6774e+02 3.3966e-05 3.3966e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8040e+00 2.5200e+07 5.8315e+02 5.2558e+03 2.6499e-08 0.0000e+00 1.0000e+00 5.2558e+03 5.2558e+03 2.6845e+02 2.6845e+02 3.4058e-05 3.4058e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8060e+00 2.5300e+07 5.8315e+02 5.2697e+03 2.6325e-08 0.0000e+00 1.0000e+00 5.2697e+03 5.2697e+03 2.6916e+02 2.6916e+02 3.4151e-05 3.4151e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8080e+00 2.5400e+07 5.8315e+02 5.2835e+03 2.6152e-08 0.0000e+00 1.0000e+00 5.2835e+03 5.2835e+03 2.6987e+02 2.6987e+02 3.4243e-05 3.4243e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8100e+00 2.5500e+07 5.8315e+02 5.2973e+03 2.5981e-08 0.0000e+00 1.0000e+00 5.2973e+03 5.2973e+03 2.7057e+02 2.7057e+02 3.4336e-05 3.4336e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8120e+00 2.5600e+07 5.8315e+02 5.3110e+03 2.5812e-08 0.0000e+00 1.0000e+00 5.3110e+03 5.3110e+03 2.7127e+02 2.7127e+02 3.4428e-05 3.4428e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8140e+00 2.5700e+07 5.8315e+02 5.3247e+03 2.5645e-08 0.0000e+00 1.0000e+00 5.3247e+03 5.3247e+03 2.7197e+02 2.7197e+02 3.4520e-05 3.4520e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8160e+00 2.5800e+07 5.8315e+02 5.3383e+03 2.5479e-08 0.0000e+00 1.0000e+00 5.3383e+03 5.3383e+03 2.7267e+02 2.7267e+02 3.4611e-05 3.4611e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8180e+00 2.5900e+07 5.8315e+02 5.3519e+03 2.5315e-08 0.0000e+00 1.0000e+00 5.3519e+03 5.3519e+03 2.7336e+02 2.7336e+02 3.4703e-05 3.4703e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e+00 2.6000e+07 5.8315e+02 5.3654e+03 2.5153e-08 0.0000e+00 1.0000e+00 5.3654e+03 5.3654e+03 2.7405e+02 2.7405e+02 3.4794e-05 3.4794e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8220e+00 2.6100e+07 5.8315e+02 5.3789e+03 2.4992e-08 0.0000e+00 1.0000e+00 5.3789e+03 5.3789e+03 2.7474e+02 2.7474e+02 3.4885e-05 3.4885e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8240e+00 2.6200e+07 5.8315e+02 5.3923e+03 2.4833e-08 0.0000e+00 1.0000e+00 5.3923e+03 5.3923e+03 2.7543e+02 2.7543e+02 3.4976e-05 3.4976e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8260e+00 2.6300e+07 5.8315e+02 5.4057e+03 2.4675e-08 0.0000e+00 1.0000e+00 5.4057e+03 5.4057e+03 2.7611e+02 2.7611e+02 3.5067e-05 3.5067e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8280e+00 2.6400e+07 5.8315e+02 5.4190e+03 2.4519e-08 0.0000e+00 1.0000e+00 5.4190e+03 5.4190e+03 2.7679e+02 2.7679e+02 3.5158e-05 3.5158e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8300e+00 2.6500e+07 5.8315e+02 5.4323e+03 2.4365e-08 0.0000e+00 1.0000e+00 5.4323e+03 5.4323e+03 2.7747e+02 2.7747e+02 3.5248e-05 3.5248e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8320e+00 2.6600e+07 5.8315e+02 5.4455e+03 2.4212e-08 0.0000e+00 1.0000e+00 5.4455e+03 5.4455e+03 2.7814e+02 2.7814e+02 3.5339e-05 3.5339e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8340e+00 2.6700e+07 5.8315e+02 5.4586e+03 2.4060e-08 0.0000e+00 1.0000e+00 5.4586e+03 5.4586e+03 2.7881e+02 2.7881e+02 3.5429e-05 3.5429e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8360e+00 2.6800e+07 5.8315e+02 5.4717e+03 2.3910e-08 0.0000e+00 1.0000e+00 5.4717e+03 5.4717e+03 2.7948e+02 2.7948e+02 3.5519e-05 3.5519e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8380e+00 2.6900e+07 5.8315e+02 5.4848e+03 2.3762e-08 0.0000e+00 1.0000e+00 5.4848e+03 5.4848e+03 2.8015e+02 2.8015e+02 3.5609e-05 3.5609e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e+00 2.7000e+07 5.8315e+02 5.4978e+03 2.3615e-08 0.0000e+00 1.0000e+00 5.4978e+03 5.4978e+03 2.8081e+02 2.8081e+02 3.5699e-05 3.5699e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8420e+00 2.7100e+07 5.8315e+02 5.5108e+03 2.3469e-08 0.0000e+00 1.0000e+00 5.5108e+03 5.5108e+03 2.8148e+02 2.8148e+02 3.5788e-05 3.5788e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8440e+00 2.7200e+07 5.8315e+02 5.5237e+03 2.3324e-08 0.0000e+00 1.0000e+00 5.5237e+03 5.5237e+03 2.8213e+02 2.8213e+02 3.5877e-05 3.5877e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8460e+00 2.7300e+07 5.8315e+02 5.5365e+03 2.3181e-08 0.0000e+00 1.0000e+00 5.5365e+03 5.5365e+03 2.8279e+02 2.8279e+02 3.5967e-05 3.5967e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8480e+00 2.7400e+07 5.8315e+02 5.5493e+03 2.3040e-08 0.0000e+00 1.0000e+00 5.5493e+03 5.5493e+03 2.8345e+02 2.8345e+02 3.6056e-05 3.6056e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8500e+00 2.7500e+07 5.8315e+02 5.5621e+03 2.2900e-08 0.0000e+00 1.0000e+00 5.5621e+03 5.5621e+03 2.8410e+02 2.8410e+02 3.6144e-05 3.6144e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8520e+00 2.7600e+07 5.8315e+02 5.5748e+03 2.2761e-08 0.0000e+00 1.0000e+00 5.5748e+03 5.5748e+03 2.8475e+02 2.8475e+02 3.6233e-05 3.6233e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8540e+00 2.7700e+07 5.8315e+02 5.5875e+03 2.2623e-08 0.0000e+00 1.0000e+00 5.5875e+03 5.5875e+03 2.8539e+02 2.8539e+02 3.6322e-05 3.6322e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8560e+00 2.7800e+07 5.8315e+02 5.6001e+03 2.2487e-08 0.0000e+00 1.0000e+00 5.6001e+03 5.6001e+03 2.8604e+02 2.8604e+02 3.6410e-05 3.6410e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8580e+00 2.7900e+07 5.8315e+02 5.6127e+03 2.2352e-08 0.0000e+00 1.0000e+00 5.6127e+03 5.6127e+03 2.8668e+02 2.8668e+02 3.6498e-05 3.6498e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e+00 2.8000e+07 5.8315e+02 5.6252e+03 2.2218e-08 0.0000e+00 1.0000e+00 5.6252e+03 5.6252e+03 2.8732e+02 2.8732e+02 3.6586e-05 3.6586e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8620e+00 2.8100e+07 5.8315e+02 5.6377e+03 2.2085e-08 0.0000e+00 1.0000e+00 5.6377e+03 5.6377e+03 2.8796e+02 2.8796e+02 3.6674e-05 3.6674e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8640e+00 2.8200e+07 5.8315e+02 5.6501e+03 2.1954e-08 0.0000e+00 1.0000e+00 5.6501e+03 5.6501e+03 2.8859e+02 2.8859e+02 3.6762e-05 3.6762e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8660e+00 2.8300e+07 5.8315e+02 5.6625e+03 2.1824e-08 0.0000e+00 1.0000e+00 5.6625e+03 5.6625e+03 2.8922e+02 2.8922e+02 3.6849e-05 3.6849e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8680e+00 2.8400e+07 5.8315e+02 5.6748e+03 2.1695e-08 0.0000e+00 1.0000e+00 5.6748e+03 5.6748e+03 2.8985e+02 2.8985e+02 3.6937e-05 3.6937e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8700e+00 2.8500e+07 5.8315e+02 5.6871e+03 2.1568e-08 0.0000e+00 1.0000e+00 5.6871e+03 5.6871e+03 2.9048e+02 2.9048e+02 3.7024e-05 3.7024e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8720e+00 2.8600e+07 5.8315e+02 5.6993e+03 2.1441e-08 0.0000e+00 1.0000e+00 5.6993e+03 5.6993e+03 2.9111e+02 2.9111e+02 3.7111e-05 3.7111e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8740e+00 2.8700e+07 5.8315e+02 5.7115e+03 2.1316e-08 0.0000e+00 1.0000e+00 5.7115e+03 5.7115e+03 2.9173e+02 2.9173e+02 3.7198e-05 3.7198e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8760e+00 2.8800e+07 5.8315e+02 5.7237e+03 2.1192e-08 0.0000e+00 1.0000e+00 5.7237e+03 5.7237e+03 2.9235e+02 2.9235e+02 3.7284e-05 3.7284e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8780e+00 2.8900e+07 5.8315e+02 5.7358e+03 2.1069e-08 0.0000e+00 1.0000e+00 5.7358e+03 5.7358e+03 2.9297e+02 2.9297e+02 3.7371e-05 3.7371e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e+00 2.9000e+07 5.8315e+02 5.7479e+03 2.0947e-08 0.0000e+00 1.0000e+00 5.7479e+03 5.7479e+03 2.9359e+02 2.9359e+02 3.7457e-05 3.7457e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8820e+00 2.9100e+07 5.8315e+02 5.7599e+03 2.0826e-08 0.0000e+00 1.0000e+00 5.7599e+03 5.7599e+03 2.9420e+02 2.9420e+02 3.7544e-05 3.7544e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8840e+00 2.9200e+07 5.8315e+02 5.7718e+03 2.0706e-08 0.0000e+00 1.0000e+00 5.7718e+03 5.7718e+03 2.9481e+02 2.9481e+02 3.7630e-05 3.7630e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8860e+00 2.9300e+07 5.8315e+02 5.7838e+03 2.0588e-08 0.0000e+00 1.0000e+00 5.7838e+03 5.7838e+03 2.9542e+02 2.9542e+02 3.7716e-05 3.7716e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8880e+00 2.9400e+07 5.8315e+02 5.7957e+03 2.0470e-08 0.0000e+00 1.0000e+00 5.7957e+03 5.7957e+03 2.9603e+02 2.9603e+02 3.7801e-05 3.7801e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8900e+00 2.9500e+07 5.8315e+02 5.8075e+03 2.0354e-08 0.0000e+00 1.0000e+00 5.8075e+03 5.8075e+03 2.9663e+02 2.9663e+02 3.7887e-05 3.7887e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8920e+00 2.9600e+07 5.8315e+02 5.8193e+03 2.0238e-08 0.0000e+00 1.0000e+00 5.8193e+03 5.8193e+03 2.9723e+02 2.9723e+02 3.7972e-05 3.7972e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8940e+00 2.9700e+07 5.8315e+02 5.8311e+03 2.0124e-08 0.0000e+00 1.0000e+00 5.8311e+03 5.8311e+03 2.9784e+02 2.9784e+02 3.8058e-05 3.8058e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8960e+00 2.9800e+07 5.8315e+02 5.8428e+03 2.0010e-08 0.0000e+00 1.0000e+00 5.8428e+03 5.8428e+03 2.9843e+02 2.9843e+02 3.8143e-05 3.8143e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8980e+00 2.9900e+07 5.8315e+02 5.8544e+03 1.9898e-08 0.0000e+00 1.0000e+00 5.8544e+03 5.8544e+03 2.9903e+02 2.9903e+02 3.8228e-05 3.8228e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e+00 3.0000e+07 5.8315e+02 5.8661e+03 1.9787e-08 0.0000e+00 1.0000e+00 5.8661e+03 5.8661e+03 2.9962e+02 2.9962e+02 3.8313e-05 3.8313e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9020e+00 3.0100e+07 5.8315e+02 5.8777e+03 1.9676e-08 0.0000e+00 1.0000e+00 5.8777e+03 5.8777e+03 3.0022e+02 3.0022e+02 3.8397e-05 3.8397e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9040e+00 3.0200e+07 5.8315e+02 5.8892e+03 1.9567e-08 0.0000e+00 1.0000e+00 5.8892e+03 5.8892e+03 3.0080e+02 3.0080e+02 3.8482e-05 3.8482e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9060e+00 3.0300e+07 5.8315e+02 5.9007e+03 1.9458e-08 0.0000e+00 1.0000e+00 5.9007e+03 5.9007e+03 3.0139e+02 3.0139e+02 3.8566e-05 3.8566e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9080e+00 3.0400e+07 5.8315e+02 5.9122e+03 1.9351e-08 0.0000e+00 1.0000e+00 5.9122e+03 5.9122e+03 3.0198e+02 3.0198e+02 3.8651e-05 3.8651e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9100e+00 3.0500e+07 5.8315e+02 5.9236e+03 1.9244e-08 0.0000e+00 1.0000e+00 5.9236e+03 5.9236e+03 3.0256e+02 3.0256e+02 3.8735e-05 3.8735e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9120e+00 3.0600e+07 5.8315e+02 5.9350e+03 1.9138e-08 0.0000e+00 1.0000e+00 5.9350e+03 5.9350e+03 3.0314e+02 3.0314e+02 3.8819e-05 3.8819e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9140e+00 3.0700e+07 5.8315e+02 5.9463e+03 1.9034e-08 0.0000e+00 1.0000e+00 5.9463e+03 5.9463e+03 3.0372e+02 3.0372e+02 3.8902e-05 3.8902e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9160e+00 3.0800e+07 5.8315e+02 5.9576e+03 1.8930e-08 0.0000e+00 1.0000e+00 5.9576e+03 5.9576e+03 3.0430e+02 3.0430e+02 3.8986e-05 3.8986e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9180e+00 3.0900e+07 5.8315e+02 5.9689e+03 1.8827e-08 0.0000e+00 1.0000e+00 5.9689e+03 5.9689e+03 3.0487e+02 3.0487e+02 3.9069e-05 3.9069e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e+00 3.1000e+07 5.8315e+02 5.9801e+03 1.8725e-08 0.0000e+00 1.0000e+00 5.9801e+03 5.9801e+03 3.0545e+02 3.0545e+02 3.9153e-05 3.9153e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9220e+00 3.1100e+07 5.8315e+02 5.9913e+03 1.8624e-08 0.0000e+00 1.0000e+00 5.9913e+03 5.9913e+03 3.0602e+02 3.0602e+02 3.9236e-05 3.9236e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9240e+00 3.1200e+07 5.8315e+02 6.0024e+03 1.8523e-08 0.0000e+00 1.0000e+00 6.0024e+03 6.0024e+03 3.0659e+02 3.0659e+02 3.9319e-05 3.9319e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9260e+00 3.1300e+07 5.8315e+02 6.0135e+03 1.8424e-08 0.0000e+00 1.0000e+00 6.0135e+03 6.0135e+03 3.0715e+02 3.0715e+02 3.9402e-05 3.9402e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9280e+00 3.1400e+07 5.8315e+02 6.0246e+03 1.8325e-08 0.0000e+00 1.0000e+00 6.0246e+03 6.0246e+03 3.0772e+02 3.0772e+02 3.9485e-05 3.9485e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9300e+00 3.1500e+07 5.8315e+02 6.0356e+03 1.8228e-08 0.0000e+00 1.0000e+00 6.0356e+03 6.0356e+03 3.0828e+02 3.0828e+02 3.9567e-05 3.9567e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9320e+00 3.1600e+07 5.8315e+02 6.0466e+03 1.8131e-08 0.0000e+00 1.0000e+00 6.0466e+03 6.0466e+03 3.0884e+02 3.0884e+02 3.9650e-05 3.9650e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9340e+00 3.1700e+07 5.8315e+02 6.0575e+03 1.8035e-08 0.0000e+00 1.0000e+00 6.0575e+03 6.0575e+03 3.0940e+02 3.0940e+02 3.9732e-05 3.9732e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9360e+00 3.1800e+07 5.8315e+02 6.0684e+03 1.7939e-08 0.0000e+00 1.0000e+00 6.0684e+03 6.0684e+03 3.0996e+02 3.0996e+02 3.9814e-05 3.9814e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9380e+00 3.1900e+07 5.8315e+02 6.0793e+03 1.7845e-08 0.0000e+00 1.0000e+00 6.0793e+03 6.0793e+03 3.1051e+02 3.1051e+02 3.9896e-05 3.9896e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e+00 3.2000e+07 5.8315e+02 6.0901e+03 1.7751e-08 0.0000e+00 1.0000e+00 6.0901e+03 6.0901e+03 3.1107e+02 3.1107e+02 3.9978e-05 3.9978e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9420e+00 3.2100e+07 5.8315e+02 6.1009e+03 1.7658e-08 0.0000e+00 1.0000e+00 6.1009e+03 6.1009e+03 3.1162e+02 3.1162e+02 4.0060e-05 4.0060e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9440e+00 3.2200e+07 5.8315e+02 6.1116e+03 1.7566e-08 0.0000e+00 1.0000e+00 6.1116e+03 6.1116e+03 3.1217e+02 3.1217e+02 4.0142e-05 4.0142e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9460e+00 3.2300e+07 5.8315e+02 6.1224e+03 1.7475e-08 0.0000e+00 1.0000e+00 6.1224e+03 6.1224e+03 3.1271e+02 3.1271e+02 4.0223e-05 4.0223e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9480e+00 3.2400e+07 5.8315e+02 6.1330e+03 1.7384e-08 0.0000e+00 1.0000e+00 6.1330e+03 6.1330e+03 3.1326e+02 3.1326e+02 4.0305e-05 4.0305e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9500e+00 3.2500e+07 5.8315e+02 6.1437e+03 1.7294e-08 0.0000e+00 1.0000e+00 6.1437e+03 6.1437e+03 3.1380e+02 3.1380e+02 4.0386e-05 4.0386e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9520e+00 3.2600e+07 5.8315e+02 6.1543e+03 1.7205e-08 0.0000e+00 1.0000e+00 6.1543e+03 6.1543e+03 3.1434e+02 3.1434e+02 4.0467e-05 4.0467e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9540e+00 3.2700e+07 5.8315e+02 6.1649e+03 1.7117e-08 0.0000e+00 1.0000e+00 6.1649e+03 6.1649e+03 3.1488e+02 3.1488e+02 4.0548e-05 4.0548e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9560e+00 3.2800e+07 5.8315e+02 6.1754e+03 1.7029e-08 0.0000e+00 1.0000e+00 6.1754e+03 6.1754e+03 3.1542e+02 3.1542e+02 4.0629e-05 4.0629e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9580e+00 3.2900e+07 5.8315e+02 6.1859e+03 1.6942e-08 0.0000e+00 1.0000e+00 6.1859e+03 6.1859e+03 3.1596e+02 3.1596e+02 4.0709e-05 4.0709e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e+00 3.3000e+07 5.8315e+02 6.1964e+03 1.6856e-08 0.0000e+00 1.0000e+00 6.1964e+03 6.1964e+03 3.1649e+02 3.1649e+02 4.0790e-05 4.0790e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9620e+00 3.3100e+07 5.8315e+02 6.2068e+03 1.6770e-08 0.0000e+00 1.0000e+00 6.2068e+03 6.2068e+03 3.1703e+02 3.1703e+02 4.0871e-05 4.0871e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9640e+00 3.3200e+07 5.8315e+02 6.2172e+03 1.6685e-08 0.0000e+00 1.0000e+00 6.2172e+03 6.2172e+03 3.1756e+02 3.1756e+02 4.0951e-05 4.0951e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9660e+00 3.3300e+07 5.8315e+02 6.2275e+03 1.6601e-08 0.0000e+00 1.0000e+00 6.2275e+03 6.2275e+03 3.1809e+02 3.1809e+02 4.1031e-05 4.1031e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9680e+00 3.3400e+07 5.8315e+02 6.2379e+03 1.6517e-08 0.0000e+00 1.0000e+00 6.2379e+03 6.2379e+03 3.1861e+02 3.1861e+02 4.1111e-05 4.1111e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9700e+00 3.3500e+07 5.8315e+02 6.2481e+03 1.6435e-08 0.0000e+00 1.0000e+00 6.2481e+03 6.2481e+03 3.1914e+02 3.1914e+02 4.1191e-05 4.1191e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9720e+00 3.3600e+07 5.8315e+02 6.2584e+03 1.6352e-08 0.0000e+00 1.0000e+00 6.2584e+03 6.2584e+03 3.1966e+02 3.1966e+02 4.1271e-05 4.1271e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9740e+00 3.3700e+07 5.8315e+02 6.2686e+03 1.6271e-08 0.0000e+00 1.0000e+00 6.2686e+03 6.2686e+03 3.2018e+02 3.2018e+02 4.1350e-05 4.1350e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9760e+00 3.3800e+07 5.8315e+02 6.2788e+03 1.6190e-08 0.0000e+00 1.0000e+00 6.2788e+03 6.2788e+03 3.2070e+02 3.2070e+02 4.1430e-05 4.1430e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9780e+00 3.3900e+07 5.8315e+02 6.2889e+03 1.6110e-08 0.0000e+00 1.0000e+00 6.2889e+03 6.2889e+03 3.2122e+02 3.2122e+02 4.1509e-05 4.1509e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e+00 3.4000e+07 5.8315e+02 6.2991e+03 1.6030e-08 0.0000e+00 1.0000e+00 6.2991e+03 6.2991e+03 3.2174e+02 3.2174e+02 4.1589e-05 4.1589e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9820e+00 3.4100e+07 5.8315e+02 6.3091e+03 1.5951e-08 0.0000e+00 1.0000e+00 6.3091e+03 6.3091e+03 3.2225e+02 3.2225e+02 4.1668e-05 4.1668e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9840e+00 3.4200e+07 5.8315e+02 6.3192e+03 1.5873e-08 0.0000e+00 1.0000e+00 6.3192e+03 6.3192e+03 3.2277e+02 3.2277e+02 4.1747e-05 4.1747e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9860e+00 3.4300e+07 5.8315e+02 6.3292e+03 1.5795e-08 0.0000e+00 1.0000e+00 6.3292e+03 6.3292e+03 3.2328e+02 3.2328e+02 4.1826e-05 4.1826e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9880e+00 3.4400e+07 5.8315e+02 6.3392e+03 1.5718e-08 0.0000e+00 1.0000e+00 6.3392e+03 6.3392e+03 3.2379e+02 3.2379e+02 4.1905e-05 4.1905e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9900e+00 3.4500e+07 5.8315e+02 6.3491e+03 1.5642e-08 0.0000e+00 1.0000e+00 6.3491e+03 6.3491e+03 3.2430e+02 3.2430e+02 4.1983e-05 4.1983e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9920e+00 3.4600e+07 5.8315e+02 6.3590e+03 1.5566e-08 0.0000e+00 1.0000e+00 6.3590e+03 6.3590e+03 3.2480e+02 3.2480e+02 4.2062e-05 4.2062e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9940e+00 3.4700e+07 5.8315e+02 6.3689e+03 1.5490e-08 0.0000e+00 1.0000e+00 6.3689e+03 6.3689e+03 3.2531e+02 3.2531e+02 4.2141e-05 4.2141e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9960e+00 3.4800e+07 5.8315e+02 6.3788e+03 1.5416e-08 0.0000e+00 1.0000e+00 6.3788e+03 6.3788e+03 3.2581e+02 3.2581e+02 4.2219e-05 4.2219e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9980e+00 3.4900e+07 5.8315e+02 6.3886e+03 1.5342e-08 0.0000e+00 1.0000e+00 6.3886e+03 6.3886e+03 3.2631e+02 3.2631e+02 4.2297e-05 4.2297e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e+00 3.5000e+07 5.8315e+02 6.3984e+03 1.5268e-08 0.0000e+00 1.0000e+00 6.3984e+03 6.3984e+03 3.2681e+02 3.2681e+02 4.2375e-05 4.2375e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRK.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRK.txt new file mode 100644 index 00000000000..b2034f4c56a --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRK.txt @@ -0,0 +1,112 @@ +# column 1 = time +# column 2 = pressure +# column 3 = temperature +# column 4 = density +# column 5 = total compressibility +# columns 6-7 = phase fractions +# columns 8-9 = phase densities +# columns 10-11 = phase mass densities +# columns 12-13 = phase viscosities +# columns 14-22 = oil phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +# columns 23-31 = gas phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +0.0000e+00 3.5000e+07 5.5315e+02 6.3045e+03 1.3265e-08 1.0000e+00 0.0000e+00 6.3045e+03 6.3045e+03 3.2202e+02 3.2202e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-02 3.4000e+07 5.5315e+02 6.2193e+03 1.3936e-08 1.0000e+00 0.0000e+00 6.2193e+03 6.2193e+03 3.1767e+02 3.1767e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-02 3.3000e+07 5.5315e+02 6.1311e+03 1.4665e-08 1.0000e+00 0.0000e+00 6.1311e+03 6.1311e+03 3.1316e+02 3.1316e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-02 3.2000e+07 5.5315e+02 6.0394e+03 1.5459e-08 1.0000e+00 0.0000e+00 6.0394e+03 6.0394e+03 3.0848e+02 3.0848e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.0000e-02 3.1000e+07 5.5315e+02 5.9442e+03 1.6327e-08 1.0000e+00 0.0000e+00 5.9442e+03 5.9442e+03 3.0362e+02 3.0362e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0000e-01 3.0000e+07 5.5315e+02 5.8453e+03 1.7277e-08 1.0000e+00 0.0000e+00 5.8453e+03 5.8453e+03 2.9856e+02 2.9856e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2000e-01 2.9000e+07 5.5315e+02 5.7422e+03 1.8321e-08 1.0000e+00 0.0000e+00 5.7422e+03 5.7422e+03 2.9330e+02 2.9330e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4000e-01 2.8000e+07 5.5315e+02 5.6347e+03 1.9473e-08 1.0000e+00 0.0000e+00 5.6347e+03 5.6347e+03 2.8781e+02 2.8781e+02 1.0000e-03 1.0000e-03 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.6000e-01 2.7000e+07 5.5315e+02 5.5226e+03 2.0746e-08 0.0000e+00 1.0000e+00 5.5226e+03 5.5226e+03 2.8208e+02 2.8208e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e-01 2.6000e+07 5.5315e+02 5.4055e+03 2.2159e-08 0.0000e+00 1.0000e+00 5.4055e+03 5.4055e+03 2.7610e+02 2.7610e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e-01 2.5000e+07 5.5315e+02 5.2829e+03 2.3733e-08 0.0000e+00 1.0000e+00 5.2829e+03 5.2829e+03 2.6984e+02 2.6984e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2000e-01 2.4000e+07 5.5315e+02 5.1546e+03 2.5493e-08 0.0000e+00 1.0000e+00 5.1546e+03 5.1546e+03 2.6328e+02 2.6328e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4000e-01 2.3000e+07 5.5315e+02 5.0200e+03 2.7469e-08 0.0000e+00 1.0000e+00 5.0200e+03 5.0200e+03 2.5641e+02 2.5641e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6000e-01 2.2000e+07 5.5315e+02 4.8786e+03 2.9694e-08 0.0000e+00 1.0000e+00 4.8786e+03 4.8786e+03 2.4919e+02 2.4919e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8000e-01 2.1000e+07 5.5315e+02 4.7301e+03 3.2211e-08 0.0000e+00 1.0000e+00 4.7301e+03 4.7301e+03 2.4160e+02 2.4160e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0000e-01 2.0000e+07 5.5315e+02 4.5737e+03 3.5068e-08 0.0000e+00 1.0000e+00 4.5737e+03 4.5737e+03 2.3361e+02 2.3361e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2000e-01 1.9000e+07 5.5315e+02 4.4091e+03 3.8325e-08 0.0000e+00 1.0000e+00 4.4091e+03 4.4091e+03 2.2520e+02 2.2520e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.4000e-01 1.8000e+07 5.5315e+02 4.2347e+03 4.1795e-08 2.3675e-01 7.6325e-01 4.4993e+03 4.1589e+03 3.0206e+02 1.9775e+02 1.0000e-03 1.0000e-03 7.9266e-03 2.3296e-03 4.4197e-01 1.0420e-01 8.5138e-02 4.6987e-02 2.2860e-02 1.7555e-02 2.7104e-01 9.2358e-03 3.1473e-03 5.5507e-01 1.1688e-01 8.8507e-02 4.5295e-02 2.0469e-02 1.4561e-02 1.4683e-01 +3.6000e-01 1.7000e+07 5.5315e+02 4.0560e+03 4.4524e-08 3.0609e-01 6.9391e-01 4.4207e+03 3.9136e+03 3.2372e+02 1.7636e+02 1.0000e-03 1.0000e-03 7.5002e-03 2.0982e-03 4.0806e-01 9.9831e-02 8.3535e-02 4.7156e-02 2.3431e-02 1.8367e-02 3.1002e-01 9.4071e-03 3.2448e-03 5.6908e-01 1.1861e-01 8.9085e-02 4.5177e-02 2.0213e-02 1.4213e-02 1.3097e-01 +3.8000e-01 1.6000e+07 5.5315e+02 3.8734e+03 4.7696e-08 3.3422e-01 6.6578e-01 4.3320e+03 3.6779e+03 3.4060e+02 1.5976e+02 1.0000e-03 1.0000e-03 7.1117e-03 1.9066e-03 3.7885e-01 9.5701e-02 8.1761e-02 4.7069e-02 2.3818e-02 1.9001e-02 3.4479e-01 9.5237e-03 3.3032e-03 5.7792e-01 1.1984e-01 8.9603e-02 4.5193e-02 2.0091e-02 1.4018e-02 1.2050e-01 +4.0000e-01 1.5000e+07 5.5315e+02 3.6863e+03 5.1419e-08 3.4849e-01 6.5151e-01 4.2392e+03 3.4459e+03 3.5504e+02 1.4562e+02 1.0000e-03 1.0000e-03 6.7341e-03 1.7363e-03 3.5186e-01 9.1554e-02 7.9750e-02 4.6759e-02 2.4068e-02 1.9517e-02 3.7803e-01 9.6116e-03 3.3411e-03 5.8405e-01 1.2082e-01 9.0100e-02 4.5287e-02 2.0045e-02 1.3908e-02 1.1284e-01 +4.2000e-01 1.4000e+07 5.5315e+02 3.4940e+03 5.5834e-08 3.5574e-01 6.4426e-01 4.1447e+03 3.2153e+03 3.6794e+02 1.3304e+02 1.0000e-03 1.0000e-03 6.3570e-03 1.5798e-03 3.2615e-01 8.7288e-02 7.7465e-02 4.6228e-02 2.4191e-02 1.9928e-02 4.1082e-01 9.6802e-03 3.3655e-03 5.8837e-01 1.2163e-01 9.0586e-02 4.5438e-02 2.0053e-02 1.3857e-02 1.0702e-01 +4.4000e-01 1.3000e+07 5.5315e+02 3.2958e+03 6.1133e-08 3.5852e-01 6.4148e-01 4.0495e+03 2.9853e+03 3.7978e+02 1.2155e+02 1.0000e-03 1.0000e-03 5.9751e-03 1.4335e-03 3.0124e-01 8.2844e-02 7.4873e-02 4.5463e-02 2.4183e-02 2.0235e-02 4.4376e-01 9.7340e-03 3.3801e-03 5.9135e-01 1.2231e-01 9.1061e-02 4.5633e-02 2.0103e-02 1.3854e-02 1.0258e-01 +4.6000e-01 1.2000e+07 5.5315e+02 3.0907e+03 6.7578e-08 3.5790e-01 6.4210e-01 3.9540e+03 2.7554e+03 3.9082e+02 1.1087e+02 1.0000e-03 1.0000e-03 5.5849e-03 1.2951e-03 2.7684e-01 7.8182e-02 7.1946e-02 4.4447e-02 2.4033e-02 2.0429e-02 4.7724e-01 9.7750e-03 3.3869e-03 5.9321e-01 1.2286e-01 9.1520e-02 4.5862e-02 2.0189e-02 1.3891e-02 9.9300e-02 +4.8000e-01 1.1000e+07 5.5315e+02 2.8777e+03 7.5541e-08 3.5429e-01 6.4571e-01 3.8587e+03 2.5254e+03 4.0126e+02 1.0084e+02 1.0000e-03 1.0000e-03 5.1842e-03 1.1631e-03 2.5279e-01 7.3272e-02 6.8649e-02 4.3152e-02 2.3725e-02 2.0495e-02 5.1157e-01 9.8039e-03 3.3870e-03 5.9409e-01 1.2331e-01 9.1956e-02 4.6116e-02 2.0305e-02 1.3963e-02 9.7067e-02 +5.0000e-01 1.0000e+07 5.5315e+02 2.6555e+03 8.5560e-08 3.4770e-01 6.5230e-01 3.7636e+03 2.2953e+03 4.1122e+02 9.1318e+01 1.0000e-03 1.0000e-03 4.7715e-03 1.0365e-03 2.2895e-01 6.8089e-02 6.4950e-02 4.1548e-02 2.3236e-02 2.0409e-02 5.4701e-01 9.8207e-03 3.3811e-03 5.9404e-01 1.2363e-01 9.2354e-02 4.6386e-02 2.0447e-02 1.4070e-02 9.5871e-02 +5.2000e-01 9.6040e+06 5.5315e+02 2.5647e+03 9.0263e-08 3.4420e-01 6.5580e-01 3.7261e+03 2.2041e+03 4.1505e+02 8.7668e+01 1.0000e-03 1.0000e-03 4.6044e-03 9.8766e-04 2.1955e-01 6.5955e-02 6.3366e-02 4.0820e-02 2.2986e-02 2.0327e-02 5.6140e-01 9.8238e-03 3.3771e-03 5.9376e-01 1.2372e-01 9.2498e-02 4.6496e-02 2.0509e-02 1.4120e-02 9.5699e-02 +5.4000e-01 9.2080e+06 5.5315e+02 2.4722e+03 9.5476e-08 3.4014e-01 6.5986e-01 3.6887e+03 2.1130e+03 4.1883e+02 8.4080e+01 1.0000e-03 1.0000e-03 4.4352e-03 9.3955e-04 2.1017e-01 6.3774e-02 6.1711e-02 4.0036e-02 2.2702e-02 2.0215e-02 5.7602e-01 9.8246e-03 3.3722e-03 5.9333e-01 1.2378e-01 9.2631e-02 4.6605e-02 2.0574e-02 1.4176e-02 9.5709e-02 +5.6000e-01 8.8120e+06 5.5315e+02 2.3778e+03 1.0128e-07 3.3548e-01 6.6452e-01 3.6513e+03 2.0218e+03 4.2256e+02 8.0548e+01 1.0000e-03 1.0000e-03 4.2638e-03 8.9211e-04 2.0080e-01 6.1544e-02 5.9982e-02 3.9192e-02 2.2381e-02 2.0070e-02 5.9088e-01 9.8232e-03 3.3663e-03 5.9273e-01 1.2382e-01 9.2752e-02 4.6714e-02 2.0643e-02 1.4236e-02 9.5913e-02 +5.8000e-01 8.4160e+06 5.5315e+02 2.2814e+03 1.0777e-07 3.3016e-01 6.6984e-01 3.6140e+03 1.9305e+03 4.2624e+02 7.7071e+01 1.0000e-03 1.0000e-03 4.0901e-03 8.4530e-04 1.9144e-01 5.9264e-02 5.8178e-02 3.8287e-02 2.2021e-02 1.9889e-02 6.0599e-01 9.8192e-03 3.3595e-03 5.9197e-01 1.2383e-01 9.2859e-02 4.6820e-02 2.0713e-02 1.4301e-02 9.6328e-02 +6.0000e-01 8.0200e+06 5.5315e+02 2.1830e+03 1.1506e-07 3.2409e-01 6.7591e-01 3.5767e+03 1.8393e+03 4.2988e+02 7.3643e+01 1.0000e-03 1.0000e-03 3.9141e-03 7.9910e-04 1.8209e-01 5.6933e-02 5.6295e-02 3.7317e-02 2.1620e-02 1.9671e-02 6.2137e-01 9.8124e-03 3.3516e-03 5.9102e-01 1.2381e-01 9.2948e-02 4.6923e-02 2.0785e-02 1.4370e-02 9.6973e-02 +6.2000e-01 7.6240e+06 5.5315e+02 2.0824e+03 1.2330e-07 3.1719e-01 6.8281e-01 3.5396e+03 1.7481e+03 4.3348e+02 7.0262e+01 1.0000e-03 1.0000e-03 3.7357e-03 7.5349e-04 1.7274e-01 5.4549e-02 5.4330e-02 3.6279e-02 2.1174e-02 1.9410e-02 6.3703e-01 9.8026e-03 3.3425e-03 5.8989e-01 1.2376e-01 9.3018e-02 4.7021e-02 2.0858e-02 1.4443e-02 9.7873e-02 +6.4000e-01 7.2280e+06 5.5315e+02 1.9796e+03 1.3267e-07 3.0934e-01 6.9066e-01 3.5025e+03 1.6569e+03 4.3704e+02 6.6926e+01 1.0000e-03 1.0000e-03 3.5550e-03 7.0844e-04 1.6339e-01 5.2111e-02 5.2282e-02 3.5169e-02 2.0681e-02 1.9105e-02 6.5300e-01 9.7894e-03 3.3322e-03 5.8853e-01 1.2366e-01 9.3064e-02 4.7112e-02 2.0932e-02 1.4519e-02 9.9057e-02 +6.6000e-01 6.8320e+06 5.5315e+02 1.8744e+03 1.4339e-07 3.0037e-01 6.9963e-01 3.4655e+03 1.5657e+03 4.4057e+02 6.3631e+01 1.0000e-03 1.0000e-03 3.3719e-03 6.6393e-04 1.5405e-01 4.9619e-02 5.0148e-02 3.3986e-02 2.0138e-02 1.8751e-02 6.6928e-01 9.7724e-03 3.3206e-03 5.8694e-01 1.2352e-01 9.3081e-02 4.7194e-02 2.1005e-02 1.4599e-02 1.0057e-01 +6.8000e-01 6.4360e+06 5.5315e+02 1.7667e+03 1.5574e-07 2.9011e-01 7.0989e-01 3.4286e+03 1.4746e+03 4.4406e+02 6.0375e+01 1.0000e-03 1.0000e-03 3.1863e-03 6.1996e-04 1.4470e-01 4.7071e-02 4.7924e-02 3.2724e-02 1.9542e-02 1.8343e-02 6.8589e-01 9.7511e-03 3.3075e-03 5.8508e-01 1.2332e-01 9.3064e-02 4.7263e-02 2.1075e-02 1.4681e-02 1.0245e-01 +7.0000e-01 6.0400e+06 5.5315e+02 1.6564e+03 1.7008e-07 2.7830e-01 7.2170e-01 3.3917e+03 1.3835e+03 4.4753e+02 5.7157e+01 1.0000e-03 1.0000e-03 2.9982e-03 5.7649e-04 1.3535e-01 4.4467e-02 4.5609e-02 3.1380e-02 1.8888e-02 1.7878e-02 7.0285e-01 9.7246e-03 3.2926e-03 5.8291e-01 1.2307e-01 9.3006e-02 4.7317e-02 2.1143e-02 1.4765e-02 1.0477e-01 +7.2000e-01 5.6440e+06 5.5315e+02 1.5435e+03 1.8691e-07 2.6461e-01 7.3539e-01 3.3549e+03 1.2924e+03 4.5098e+02 5.3973e+01 1.0000e-03 1.0000e-03 2.8076e-03 5.3353e-04 1.2600e-01 4.1804e-02 4.3198e-02 2.9950e-02 1.8174e-02 1.7349e-02 7.2018e-01 9.6922e-03 3.2757e-03 5.8039e-01 1.2274e-01 9.2897e-02 4.7349e-02 2.1205e-02 1.4849e-02 1.0761e-01 +7.4000e-01 5.2480e+06 5.5315e+02 1.4279e+03 2.0685e-07 2.4862e-01 7.5138e-01 3.3182e+03 1.2015e+03 4.5440e+02 5.0823e+01 1.0000e-03 1.0000e-03 2.6145e-03 4.9105e-04 1.1665e-01 3.9083e-02 4.0689e-02 2.8430e-02 1.7394e-02 1.6752e-02 7.3790e-01 9.6527e-03 3.2564e-03 5.7743e-01 1.2232e-01 9.2726e-02 4.7355e-02 2.1258e-02 1.4931e-02 1.1107e-01 +7.6000e-01 4.8520e+06 5.5315e+02 1.3096e+03 2.3076e-07 2.2976e-01 7.7024e-01 3.2816e+03 1.1106e+03 4.5780e+02 4.7704e+01 1.0000e-03 1.0000e-03 2.4189e-03 4.4905e-04 1.0729e-01 3.6303e-02 3.8078e-02 2.6816e-02 1.6545e-02 1.6080e-02 7.5602e-01 9.6045e-03 3.2343e-03 5.7396e-01 1.2179e-01 9.2476e-02 4.7325e-02 2.1300e-02 1.5010e-02 1.1530e-01 +7.8000e-01 4.4560e+06 5.5315e+02 1.1886e+03 2.5984e-07 2.0720e-01 7.9280e-01 3.2450e+03 1.0197e+03 4.6118e+02 4.4615e+01 1.0000e-03 1.0000e-03 2.2207e-03 4.0751e-04 9.7930e-02 3.3461e-02 3.5364e-02 2.5103e-02 1.5621e-02 1.5325e-02 7.7457e-01 9.5455e-03 3.2086e-03 5.6984e-01 1.2113e-01 9.2127e-02 4.7249e-02 2.1325e-02 1.5082e-02 1.2049e-01 +8.0000e-01 4.0600e+06 5.5315e+02 1.0651e+03 2.9580e-07 1.7982e-01 8.2018e-01 3.2085e+03 9.2899e+02 4.6454e+02 4.1554e+01 1.0000e-03 1.0000e-03 2.0200e-03 3.6643e-04 8.8564e-02 3.0559e-02 3.2542e-02 2.3287e-02 1.4618e-02 1.4480e-02 7.9356e-01 9.4728e-03 3.1784e-03 5.6492e-01 1.2029e-01 9.1650e-02 4.7111e-02 2.1326e-02 1.5142e-02 1.2691e-01 +8.2000e-01 3.6640e+06 5.5315e+02 9.3920e+02 3.4116e-07 1.4592e-01 8.5408e-01 3.1720e+03 8.3838e+02 4.6788e+02 3.8520e+01 1.0000e-03 1.0000e-03 1.8167e-03 3.2579e-04 7.9193e-02 2.7594e-02 2.9610e-02 2.1362e-02 1.3529e-02 1.3537e-02 8.1303e-01 9.3823e-03 3.1423e-03 5.5894e-01 1.1923e-01 9.1002e-02 4.6890e-02 2.1292e-02 1.5183e-02 1.3494e-01 +8.4000e-01 3.2680e+06 5.5315e+02 8.1147e+02 3.9978e-07 1.0291e-01 8.9709e-01 3.1356e+03 7.4788e+02 4.7122e+02 3.5511e+01 1.0000e-03 1.0000e-03 1.6109e-03 2.8560e-04 6.9819e-02 2.4566e-02 2.6564e-02 1.9322e-02 1.2350e-02 1.2486e-02 8.3300e-01 9.2678e-03 3.0984e-03 5.5155e-01 1.1786e-01 9.0123e-02 4.6552e-02 2.1210e-02 1.5195e-02 1.4514e-01 +8.6000e-01 2.8720e+06 5.5315e+02 6.8256e+02 4.7788e-07 4.6565e-02 9.5343e-01 3.0992e+03 6.5752e+02 4.7454e+02 3.2526e+01 1.0000e-03 1.0000e-03 1.4025e-03 2.4585e-04 6.0440e-02 2.1475e-02 2.3401e-02 1.7164e-02 1.1073e-02 1.1316e-02 8.5348e-01 9.1199e-03 3.0435e-03 5.4218e-01 1.1607e-01 8.8918e-02 4.6049e-02 2.1055e-02 1.5160e-02 1.5840e-01 +8.8000e-01 2.4760e+06 5.5315e+02 5.6562e+02 4.2278e-07 0.0000e+00 1.0000e+00 5.6562e+02 5.6562e+02 2.8890e+01 2.8890e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0000e-01 2.0800e+06 5.5315e+02 4.7157e+02 5.0008e-07 0.0000e+00 1.0000e+00 4.7157e+02 4.7157e+02 2.4087e+01 2.4087e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2000e-01 1.6840e+06 5.5315e+02 3.7886e+02 6.1350e-07 0.0000e+00 1.0000e+00 3.7886e+02 3.7886e+02 1.9351e+01 1.9351e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4000e-01 1.2880e+06 5.5315e+02 2.8750e+02 7.9638e-07 0.0000e+00 1.0000e+00 2.8750e+02 2.8750e+02 1.4685e+01 1.4685e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6000e-01 8.9200e+05 5.5315e+02 1.9753e+02 1.1413e-06 0.0000e+00 1.0000e+00 1.9753e+02 1.9753e+02 1.0089e+01 1.0089e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8000e-01 4.9600e+05 5.5315e+02 1.0895e+02 2.0366e-06 0.0000e+00 1.0000e+00 1.0895e+02 1.0895e+02 5.5650e+00 5.5650e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e+00 1.0000e+05 5.5315e+02 2.1788e+01 1.0021e-05 0.0000e+00 1.0000e+00 2.1788e+01 2.1788e+01 1.1129e+00 1.1129e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0200e+00 4.9600e+05 5.8315e+02 1.0310e+02 2.0316e-06 0.0000e+00 1.0000e+00 1.0310e+02 1.0310e+02 5.2658e+00 5.2658e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0400e+00 8.9200e+05 5.8315e+02 1.8653e+02 1.1362e-06 0.0000e+00 1.0000e+00 1.8653e+02 1.8653e+02 9.5276e+00 9.5276e+00 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0600e+00 1.2880e+06 5.8315e+02 2.7095e+02 7.9121e-07 0.0000e+00 1.0000e+00 2.7095e+02 2.7095e+02 1.3839e+01 1.3839e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0800e+00 1.6840e+06 5.8315e+02 3.5631e+02 6.0826e-07 0.0000e+00 1.0000e+00 3.5631e+02 3.5631e+02 1.8199e+01 1.8199e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1000e+00 2.0800e+06 5.8315e+02 4.4259e+02 4.9480e-07 0.0000e+00 1.0000e+00 4.4259e+02 4.4259e+02 2.2606e+01 2.2606e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1200e+00 2.4760e+06 5.8315e+02 5.2974e+02 4.1747e-07 0.0000e+00 1.0000e+00 5.2974e+02 5.2974e+02 2.7058e+01 2.7058e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1400e+00 2.8720e+06 5.8315e+02 6.1772e+02 3.6131e-07 0.0000e+00 1.0000e+00 6.1772e+02 6.1772e+02 3.1552e+01 3.1552e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1600e+00 3.2680e+06 5.8315e+02 7.0649e+02 3.1862e-07 0.0000e+00 1.0000e+00 7.0649e+02 7.0649e+02 3.6085e+01 3.6085e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1800e+00 3.6640e+06 5.8315e+02 7.9598e+02 2.8501e-07 0.0000e+00 1.0000e+00 7.9598e+02 7.9598e+02 4.0656e+01 4.0656e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e+00 4.0600e+06 5.8315e+02 8.8614e+02 2.5781e-07 0.0000e+00 1.0000e+00 8.8614e+02 8.8614e+02 4.5262e+01 4.5262e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2200e+00 4.4560e+06 5.8315e+02 9.7690e+02 2.3532e-07 0.0000e+00 1.0000e+00 9.7690e+02 9.7690e+02 4.9897e+01 4.9897e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2400e+00 4.8520e+06 5.8315e+02 1.0682e+03 2.1637e-07 0.0000e+00 1.0000e+00 1.0682e+03 1.0682e+03 5.4560e+01 5.4560e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2600e+00 5.2480e+06 5.8315e+02 1.1599e+03 2.0016e-07 0.0000e+00 1.0000e+00 1.1599e+03 1.1599e+03 5.9246e+01 5.9246e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2800e+00 5.6440e+06 5.8315e+02 1.2520e+03 1.8609e-07 0.0000e+00 1.0000e+00 1.2520e+03 1.2520e+03 6.3950e+01 6.3950e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3000e+00 6.0400e+06 5.8315e+02 1.3444e+03 1.7376e-07 0.0000e+00 1.0000e+00 1.3444e+03 1.3444e+03 6.8670e+01 6.8670e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3200e+00 6.4360e+06 5.8315e+02 1.4370e+03 1.6283e-07 0.0000e+00 1.0000e+00 1.4370e+03 1.4370e+03 7.3399e+01 7.3399e+01 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3400e+00 6.8320e+06 5.8315e+02 1.5350e+03 1.6531e-07 9.9906e-03 9.9001e-01 3.1587e+03 1.5271e+03 3.9889e+02 7.7535e+01 1.0000e-03 1.0000e-03 3.4224e-03 7.4676e-04 1.6566e-01 4.9631e-02 4.8032e-02 3.1356e-02 1.8029e-02 1.6397e-02 6.6673e-01 9.0226e-03 3.0091e-03 5.3620e-01 1.1486e-01 8.8062e-02 4.5658e-02 2.0912e-02 1.5095e-02 1.6718e-01 +1.3600e+00 7.2280e+06 5.8315e+02 1.6347e+03 1.5254e-07 2.3264e-02 9.7674e-01 3.1909e+03 1.6159e+03 3.9472e+02 8.1397e+01 1.0000e-03 1.0000e-03 3.6195e-03 7.9902e-04 1.7618e-01 5.2282e-02 5.0247e-02 3.2572e-02 1.8594e-02 1.6785e-02 6.4892e-01 9.0522e-03 3.0213e-03 5.3818e-01 1.1520e-01 8.8265e-02 4.5726e-02 2.0922e-02 1.5084e-02 1.6455e-01 +1.3800e+00 7.6240e+06 5.8315e+02 1.7325e+03 1.4139e-07 3.3973e-02 9.6603e-01 3.2230e+03 1.7048e+03 3.9047e+02 8.5341e+01 1.0000e-03 1.0000e-03 3.8148e-03 8.5209e-04 1.8674e-01 5.4885e-02 5.2382e-02 3.3719e-02 1.9113e-02 1.7127e-02 6.3137e-01 9.0753e-03 3.0312e-03 5.3976e-01 1.1547e-01 8.8416e-02 4.5773e-02 2.0926e-02 1.5071e-02 1.6248e-01 +1.4000e+00 8.0200e+06 5.8315e+02 1.8287e+03 1.3160e-07 4.2388e-02 9.5761e-01 3.2551e+03 1.7939e+03 3.8614e+02 8.9374e+01 1.0000e-03 1.0000e-03 4.0084e-03 9.0604e-04 1.9734e-01 5.7441e-02 5.4439e-02 3.4800e-02 1.9586e-02 1.7425e-02 6.1405e-01 9.0928e-03 3.0389e-03 5.4097e-01 1.1566e-01 8.8522e-02 4.5801e-02 2.0924e-02 1.5057e-02 1.6093e-01 +1.4200e+00 8.4160e+06 5.8315e+02 1.9231e+03 1.2294e-07 4.8699e-02 9.5130e-01 3.2871e+03 1.8831e+03 3.8171e+02 9.3504e+01 1.0000e-03 1.0000e-03 4.2003e-03 9.6092e-04 2.0799e-01 5.9953e-02 5.6423e-02 3.5817e-02 2.0018e-02 1.7682e-02 5.9696e-01 9.1051e-03 3.0446e-03 5.4185e-01 1.1580e-01 8.8589e-02 4.5814e-02 2.0919e-02 1.5043e-02 1.5984e-01 +1.4400e+00 8.8120e+06 5.8315e+02 2.0159e+03 1.1524e-07 5.3029e-02 9.4697e-01 3.3191e+03 1.9726e+03 3.7719e+02 9.7741e+01 1.0000e-03 1.0000e-03 4.3908e-03 1.0168e-03 2.1870e-01 6.2421e-02 5.8334e-02 3.6772e-02 2.0409e-02 1.7900e-02 5.8006e-01 9.1125e-03 3.0484e-03 5.4242e-01 1.1587e-01 8.8622e-02 4.5816e-02 2.0912e-02 1.5032e-02 1.5917e-01 +1.4600e+00 9.2080e+06 5.8315e+02 2.1072e+03 1.0837e-07 5.5445e-02 9.4456e-01 3.3510e+03 2.0622e+03 3.7256e+02 1.0209e+02 1.0000e-03 1.0000e-03 4.5799e-03 1.0738e-03 2.2947e-01 6.4848e-02 6.0176e-02 3.7670e-02 2.0762e-02 1.8083e-02 5.6333e-01 9.1155e-03 3.0503e-03 5.4268e-01 1.1590e-01 8.8625e-02 4.5807e-02 2.0904e-02 1.5022e-02 1.5890e-01 +1.4800e+00 9.6040e+06 5.8315e+02 2.1968e+03 1.0221e-07 5.5953e-02 9.4405e-01 3.3827e+03 2.1521e+03 3.6780e+02 1.0657e+02 1.0000e-03 1.0000e-03 4.7678e-03 1.1319e-03 2.4033e-01 6.7236e-02 6.1951e-02 3.8510e-02 2.1079e-02 1.8232e-02 5.4676e-01 9.1142e-03 3.0504e-03 5.4265e-01 1.1588e-01 8.8600e-02 4.5791e-02 2.0895e-02 1.5015e-02 1.5901e-01 +1.5000e+00 1.0000e+07 5.8315e+02 2.2850e+03 9.6662e-08 5.4503e-02 9.4550e-01 3.4142e+03 2.2423e+03 3.6290e+02 1.1120e+02 1.0000e-03 1.0000e-03 4.9547e-03 1.1914e-03 2.5129e-01 6.9588e-02 6.3661e-02 3.9297e-02 2.1361e-02 1.8349e-02 5.3031e-01 9.1088e-03 3.0486e-03 5.4232e-01 1.1581e-01 8.8552e-02 4.5770e-02 2.0888e-02 1.5013e-02 1.5949e-01 +1.5200e+00 1.1000e+07 5.8315e+02 2.5015e+03 8.4869e-08 4.1127e-02 9.5887e-01 3.4926e+03 2.4714e+03 3.4980e+02 1.2364e+02 1.0000e-03 1.0000e-03 5.4241e-03 1.3483e-03 2.7951e-01 7.5387e-02 6.7713e-02 4.1056e-02 2.1929e-02 1.8512e-02 4.8912e-01 9.0766e-03 3.0354e-03 5.4017e-01 1.1544e-01 8.8332e-02 4.5697e-02 2.0878e-02 1.5027e-02 1.6235e-01 +1.5400e+00 1.2000e+07 5.8315e+02 2.7099e+03 7.5536e-08 9.4342e-03 9.9057e-01 3.5683e+03 2.7037e+03 3.3530e+02 1.3750e+02 1.0000e-03 1.0000e-03 5.8943e-03 1.5176e-03 3.0890e-01 8.1041e-02 7.1421e-02 4.2512e-02 2.2304e-02 1.8499e-02 4.4791e-01 9.0160e-03 3.0076e-03 5.3586e-01 1.1477e-01 8.7985e-02 4.5616e-02 2.0893e-02 1.5082e-02 1.6776e-01 +1.5600e+00 1.3000e+07 5.8315e+02 2.9203e+03 7.1624e-08 0.0000e+00 1.0000e+00 2.9203e+03 2.9203e+03 1.4916e+02 1.4916e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e+00 1.4000e+07 5.8315e+02 3.1258e+03 6.4571e-08 0.0000e+00 1.0000e+00 3.1258e+03 3.1258e+03 1.5966e+02 1.5966e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e+00 1.5000e+07 5.8315e+02 3.3239e+03 5.8427e-08 0.0000e+00 1.0000e+00 3.3239e+03 3.3239e+03 1.6977e+02 1.6977e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e+00 1.6000e+07 5.8315e+02 3.5142e+03 5.3055e-08 0.0000e+00 1.0000e+00 3.5142e+03 3.5142e+03 1.7950e+02 1.7950e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e+00 1.7000e+07 5.8315e+02 3.6968e+03 4.8343e-08 0.0000e+00 1.0000e+00 3.6968e+03 3.6968e+03 1.8882e+02 1.8882e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e+00 1.8000e+07 5.8315e+02 3.8717e+03 4.4199e-08 0.0000e+00 1.0000e+00 3.8717e+03 3.8717e+03 1.9776e+02 1.9776e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e+00 1.9000e+07 5.8315e+02 4.0391e+03 4.0543e-08 0.0000e+00 1.0000e+00 4.0391e+03 4.0391e+03 2.0631e+02 2.0631e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e+00 2.0000e+07 5.8315e+02 4.1993e+03 3.7310e-08 0.0000e+00 1.0000e+00 4.1993e+03 4.1993e+03 2.1449e+02 2.1449e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e+00 2.1000e+07 5.8315e+02 4.3526e+03 3.4441e-08 0.0000e+00 1.0000e+00 4.3526e+03 4.3526e+03 2.2232e+02 2.2232e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e+00 2.2000e+07 5.8315e+02 4.4992e+03 3.1889e-08 0.0000e+00 1.0000e+00 4.4992e+03 4.4992e+03 2.2981e+02 2.2981e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e+00 2.3000e+07 5.8315e+02 4.6396e+03 2.9611e-08 0.0000e+00 1.0000e+00 4.6396e+03 4.6396e+03 2.3698e+02 2.3698e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e+00 2.4000e+07 5.8315e+02 4.7741e+03 2.7572e-08 0.0000e+00 1.0000e+00 4.7741e+03 4.7741e+03 2.4385e+02 2.4385e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e+00 2.5000e+07 5.8315e+02 4.9030e+03 2.5740e-08 0.0000e+00 1.0000e+00 4.9030e+03 4.9030e+03 2.5043e+02 2.5043e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e+00 2.6000e+07 5.8315e+02 5.0266e+03 2.4091e-08 0.0000e+00 1.0000e+00 5.0266e+03 5.0266e+03 2.5675e+02 2.5675e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e+00 2.7000e+07 5.8315e+02 5.1453e+03 2.2601e-08 0.0000e+00 1.0000e+00 5.1453e+03 5.1453e+03 2.6281e+02 2.6281e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e+00 2.8000e+07 5.8315e+02 5.2593e+03 2.1251e-08 0.0000e+00 1.0000e+00 5.2593e+03 5.2593e+03 2.6863e+02 2.6863e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e+00 2.9000e+07 5.8315e+02 5.3689e+03 2.0024e-08 0.0000e+00 1.0000e+00 5.3689e+03 5.3689e+03 2.7423e+02 2.7423e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e+00 3.0000e+07 5.8315e+02 5.4744e+03 1.8906e-08 0.0000e+00 1.0000e+00 5.4744e+03 5.4744e+03 2.7962e+02 2.7962e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e+00 3.1000e+07 5.8315e+02 5.5760e+03 1.7885e-08 0.0000e+00 1.0000e+00 5.5760e+03 5.5760e+03 2.8481e+02 2.8481e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e+00 3.2000e+07 5.8315e+02 5.6739e+03 1.6949e-08 0.0000e+00 1.0000e+00 5.6739e+03 5.6739e+03 2.8981e+02 2.8981e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e+00 3.3000e+07 5.8315e+02 5.7684e+03 1.6090e-08 0.0000e+00 1.0000e+00 5.7684e+03 5.7684e+03 2.9463e+02 2.9463e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e+00 3.4000e+07 5.8315e+02 5.8596e+03 1.5299e-08 0.0000e+00 1.0000e+00 5.8596e+03 5.8596e+03 2.9929e+02 2.9929e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e+00 3.5000e+07 5.8315e+02 5.9477e+03 1.4569e-08 0.0000e+00 1.0000e+00 5.9477e+03 5.9477e+03 3.0379e+02 3.0379e+02 1.0000e-03 1.0000e-03 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRKLBC.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRKLBC.txt new file mode 100644 index 00000000000..aad47b3119c --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional_liveOilSRKLBC.txt @@ -0,0 +1,1012 @@ +# column 1 = time +# column 2 = pressure +# column 3 = temperature +# column 4 = density +# column 5 = total compressibility +# columns 6-7 = phase fractions +# columns 8-9 = phase densities +# columns 10-11 = phase mass densities +# columns 12-13 = phase viscosities +# columns 14-22 = oil phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +# columns 23-31 = gas phase fractions [CO2, N2, C1, C2, C3, C4, C5, C6, C7+] +0.0000e+00 3.5000e+07 5.5315e+02 6.3045e+03 1.3265e-08 1.0000e+00 0.0000e+00 6.3045e+03 6.3045e+03 3.2202e+02 3.2202e+02 4.1026e-05 4.1026e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-03 3.4900e+07 5.5315e+02 6.2961e+03 1.3330e-08 1.0000e+00 0.0000e+00 6.2961e+03 6.2961e+03 3.2159e+02 3.2159e+02 4.0960e-05 4.0960e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-03 3.4800e+07 5.5315e+02 6.2877e+03 1.3395e-08 1.0000e+00 0.0000e+00 6.2877e+03 6.2877e+03 3.2116e+02 3.2116e+02 4.0894e-05 4.0894e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-03 3.4700e+07 5.5315e+02 6.2792e+03 1.3461e-08 1.0000e+00 0.0000e+00 6.2792e+03 6.2792e+03 3.2073e+02 3.2073e+02 4.0828e-05 4.0828e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.0000e-03 3.4600e+07 5.5315e+02 6.2708e+03 1.3527e-08 1.0000e+00 0.0000e+00 6.2708e+03 6.2708e+03 3.2029e+02 3.2029e+02 4.0762e-05 4.0762e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0000e-02 3.4500e+07 5.5315e+02 6.2623e+03 1.3594e-08 1.0000e+00 0.0000e+00 6.2623e+03 6.2623e+03 3.1986e+02 3.1986e+02 4.0696e-05 4.0696e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2000e-02 3.4400e+07 5.5315e+02 6.2537e+03 1.3661e-08 1.0000e+00 0.0000e+00 6.2537e+03 6.2537e+03 3.1942e+02 3.1942e+02 4.0629e-05 4.0629e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4000e-02 3.4300e+07 5.5315e+02 6.2452e+03 1.3729e-08 1.0000e+00 0.0000e+00 6.2452e+03 6.2452e+03 3.1899e+02 3.1899e+02 4.0563e-05 4.0563e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.6000e-02 3.4200e+07 5.5315e+02 6.2366e+03 1.3797e-08 1.0000e+00 0.0000e+00 6.2366e+03 6.2366e+03 3.1855e+02 3.1855e+02 4.0496e-05 4.0496e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.8000e-02 3.4100e+07 5.5315e+02 6.2280e+03 1.3866e-08 1.0000e+00 0.0000e+00 6.2280e+03 6.2280e+03 3.1811e+02 3.1811e+02 4.0429e-05 4.0429e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.0000e-02 3.4000e+07 5.5315e+02 6.2193e+03 1.3936e-08 1.0000e+00 0.0000e+00 6.2193e+03 6.2193e+03 3.1767e+02 3.1767e+02 4.0362e-05 4.0362e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.2000e-02 3.3900e+07 5.5315e+02 6.2106e+03 1.4006e-08 1.0000e+00 0.0000e+00 6.2106e+03 6.2106e+03 3.1722e+02 3.1722e+02 4.0295e-05 4.0295e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.4000e-02 3.3800e+07 5.5315e+02 6.2019e+03 1.4077e-08 1.0000e+00 0.0000e+00 6.2019e+03 6.2019e+03 3.1678e+02 3.1678e+02 4.0228e-05 4.0228e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.6000e-02 3.3700e+07 5.5315e+02 6.1932e+03 1.4148e-08 1.0000e+00 0.0000e+00 6.1932e+03 6.1932e+03 3.1633e+02 3.1633e+02 4.0160e-05 4.0160e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +2.8000e-02 3.3600e+07 5.5315e+02 6.1844e+03 1.4220e-08 1.0000e+00 0.0000e+00 6.1844e+03 6.1844e+03 3.1588e+02 3.1588e+02 4.0093e-05 4.0093e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.0000e-02 3.3500e+07 5.5315e+02 6.1756e+03 1.4293e-08 1.0000e+00 0.0000e+00 6.1756e+03 6.1756e+03 3.1543e+02 3.1543e+02 4.0025e-05 4.0025e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.2000e-02 3.3400e+07 5.5315e+02 6.1668e+03 1.4366e-08 1.0000e+00 0.0000e+00 6.1668e+03 6.1668e+03 3.1498e+02 3.1498e+02 3.9957e-05 3.9957e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.4000e-02 3.3300e+07 5.5315e+02 6.1579e+03 1.4440e-08 1.0000e+00 0.0000e+00 6.1579e+03 6.1579e+03 3.1453e+02 3.1453e+02 3.9889e-05 3.9889e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.6000e-02 3.3200e+07 5.5315e+02 6.1490e+03 1.4514e-08 1.0000e+00 0.0000e+00 6.1490e+03 6.1490e+03 3.1407e+02 3.1407e+02 3.9821e-05 3.9821e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +3.8000e-02 3.3100e+07 5.5315e+02 6.1400e+03 1.4589e-08 1.0000e+00 0.0000e+00 6.1400e+03 6.1400e+03 3.1362e+02 3.1362e+02 3.9753e-05 3.9753e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.0000e-02 3.3000e+07 5.5315e+02 6.1311e+03 1.4665e-08 1.0000e+00 0.0000e+00 6.1311e+03 6.1311e+03 3.1316e+02 3.1316e+02 3.9684e-05 3.9684e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.2000e-02 3.2900e+07 5.5315e+02 6.1220e+03 1.4741e-08 1.0000e+00 0.0000e+00 6.1220e+03 6.1220e+03 3.1270e+02 3.1270e+02 3.9616e-05 3.9616e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.4000e-02 3.2800e+07 5.5315e+02 6.1130e+03 1.4818e-08 1.0000e+00 0.0000e+00 6.1130e+03 6.1130e+03 3.1224e+02 3.1224e+02 3.9547e-05 3.9547e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.6000e-02 3.2700e+07 5.5315e+02 6.1039e+03 1.4896e-08 1.0000e+00 0.0000e+00 6.1039e+03 6.1039e+03 3.1177e+02 3.1177e+02 3.9478e-05 3.9478e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +4.8000e-02 3.2600e+07 5.5315e+02 6.0948e+03 1.4974e-08 1.0000e+00 0.0000e+00 6.0948e+03 6.0948e+03 3.1131e+02 3.1131e+02 3.9409e-05 3.9409e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.0000e-02 3.2500e+07 5.5315e+02 6.0857e+03 1.5053e-08 1.0000e+00 0.0000e+00 6.0857e+03 6.0857e+03 3.1084e+02 3.1084e+02 3.9340e-05 3.9340e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.2000e-02 3.2400e+07 5.5315e+02 6.0765e+03 1.5133e-08 1.0000e+00 0.0000e+00 6.0765e+03 6.0765e+03 3.1037e+02 3.1037e+02 3.9270e-05 3.9270e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.4000e-02 3.2300e+07 5.5315e+02 6.0673e+03 1.5213e-08 1.0000e+00 0.0000e+00 6.0673e+03 6.0673e+03 3.0990e+02 3.0990e+02 3.9201e-05 3.9201e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.6000e-02 3.2200e+07 5.5315e+02 6.0580e+03 1.5295e-08 1.0000e+00 0.0000e+00 6.0580e+03 6.0580e+03 3.0943e+02 3.0943e+02 3.9131e-05 3.9131e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +5.8000e-02 3.2100e+07 5.5315e+02 6.0488e+03 1.5376e-08 1.0000e+00 0.0000e+00 6.0488e+03 6.0488e+03 3.0895e+02 3.0895e+02 3.9061e-05 3.9061e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.0000e-02 3.2000e+07 5.5315e+02 6.0394e+03 1.5459e-08 1.0000e+00 0.0000e+00 6.0394e+03 6.0394e+03 3.0848e+02 3.0848e+02 3.8991e-05 3.8991e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.2000e-02 3.1900e+07 5.5315e+02 6.0301e+03 1.5542e-08 1.0000e+00 0.0000e+00 6.0301e+03 6.0301e+03 3.0800e+02 3.0800e+02 3.8921e-05 3.8921e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.4000e-02 3.1800e+07 5.5315e+02 6.0207e+03 1.5626e-08 1.0000e+00 0.0000e+00 6.0207e+03 6.0207e+03 3.0752e+02 3.0752e+02 3.8851e-05 3.8851e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.6000e-02 3.1700e+07 5.5315e+02 6.0113e+03 1.5711e-08 1.0000e+00 0.0000e+00 6.0113e+03 6.0113e+03 3.0704e+02 3.0704e+02 3.8780e-05 3.8780e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +6.8000e-02 3.1600e+07 5.5315e+02 6.0018e+03 1.5797e-08 1.0000e+00 0.0000e+00 6.0018e+03 6.0018e+03 3.0656e+02 3.0656e+02 3.8709e-05 3.8709e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.0000e-02 3.1500e+07 5.5315e+02 5.9923e+03 1.5883e-08 1.0000e+00 0.0000e+00 5.9923e+03 5.9923e+03 3.0607e+02 3.0607e+02 3.8639e-05 3.8639e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.2000e-02 3.1400e+07 5.5315e+02 5.9828e+03 1.5970e-08 1.0000e+00 0.0000e+00 5.9828e+03 5.9828e+03 3.0558e+02 3.0558e+02 3.8568e-05 3.8568e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.4000e-02 3.1300e+07 5.5315e+02 5.9732e+03 1.6058e-08 1.0000e+00 0.0000e+00 5.9732e+03 5.9732e+03 3.0509e+02 3.0509e+02 3.8496e-05 3.8496e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.6000e-02 3.1200e+07 5.5315e+02 5.9636e+03 1.6147e-08 1.0000e+00 0.0000e+00 5.9636e+03 5.9636e+03 3.0460e+02 3.0460e+02 3.8425e-05 3.8425e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +7.8000e-02 3.1100e+07 5.5315e+02 5.9539e+03 1.6236e-08 1.0000e+00 0.0000e+00 5.9539e+03 5.9539e+03 3.0411e+02 3.0411e+02 3.8354e-05 3.8354e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.0000e-02 3.1000e+07 5.5315e+02 5.9442e+03 1.6327e-08 1.0000e+00 0.0000e+00 5.9442e+03 5.9442e+03 3.0362e+02 3.0362e+02 3.8282e-05 3.8282e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.2000e-02 3.0900e+07 5.5315e+02 5.9345e+03 1.6418e-08 1.0000e+00 0.0000e+00 5.9345e+03 5.9345e+03 3.0312e+02 3.0312e+02 3.8210e-05 3.8210e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.4000e-02 3.0800e+07 5.5315e+02 5.9248e+03 1.6510e-08 1.0000e+00 0.0000e+00 5.9248e+03 5.9248e+03 3.0262e+02 3.0262e+02 3.8138e-05 3.8138e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.6000e-02 3.0700e+07 5.5315e+02 5.9150e+03 1.6602e-08 1.0000e+00 0.0000e+00 5.9150e+03 5.9150e+03 3.0212e+02 3.0212e+02 3.8066e-05 3.8066e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +8.8000e-02 3.0600e+07 5.5315e+02 5.9051e+03 1.6696e-08 1.0000e+00 0.0000e+00 5.9051e+03 5.9051e+03 3.0162e+02 3.0162e+02 3.7993e-05 3.7993e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +9.0000e-02 3.0500e+07 5.5315e+02 5.8952e+03 1.6791e-08 1.0000e+00 0.0000e+00 5.8952e+03 5.8952e+03 3.0111e+02 3.0111e+02 3.7921e-05 3.7921e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +9.2000e-02 3.0400e+07 5.5315e+02 5.8853e+03 1.6886e-08 1.0000e+00 0.0000e+00 5.8853e+03 5.8853e+03 3.0061e+02 3.0061e+02 3.7848e-05 3.7848e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +9.4000e-02 3.0300e+07 5.5315e+02 5.8754e+03 1.6982e-08 1.0000e+00 0.0000e+00 5.8754e+03 5.8754e+03 3.0010e+02 3.0010e+02 3.7775e-05 3.7775e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +9.6000e-02 3.0200e+07 5.5315e+02 5.8654e+03 1.7080e-08 1.0000e+00 0.0000e+00 5.8654e+03 5.8654e+03 2.9959e+02 2.9959e+02 3.7702e-05 3.7702e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +9.8000e-02 3.0100e+07 5.5315e+02 5.8553e+03 1.7178e-08 1.0000e+00 0.0000e+00 5.8553e+03 5.8553e+03 2.9907e+02 2.9907e+02 3.7629e-05 3.7629e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0000e-01 3.0000e+07 5.5315e+02 5.8453e+03 1.7277e-08 1.0000e+00 0.0000e+00 5.8453e+03 5.8453e+03 2.9856e+02 2.9856e+02 3.7556e-05 3.7556e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0200e-01 2.9900e+07 5.5315e+02 5.8351e+03 1.7377e-08 1.0000e+00 0.0000e+00 5.8351e+03 5.8351e+03 2.9804e+02 2.9804e+02 3.7482e-05 3.7482e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0400e-01 2.9800e+07 5.5315e+02 5.8250e+03 1.7478e-08 1.0000e+00 0.0000e+00 5.8250e+03 5.8250e+03 2.9752e+02 2.9752e+02 3.7408e-05 3.7408e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0600e-01 2.9700e+07 5.5315e+02 5.8148e+03 1.7580e-08 1.0000e+00 0.0000e+00 5.8148e+03 5.8148e+03 2.9700e+02 2.9700e+02 3.7334e-05 3.7334e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.0800e-01 2.9600e+07 5.5315e+02 5.8045e+03 1.7683e-08 1.0000e+00 0.0000e+00 5.8045e+03 5.8045e+03 2.9648e+02 2.9648e+02 3.7260e-05 3.7260e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.1000e-01 2.9500e+07 5.5315e+02 5.7942e+03 1.7787e-08 1.0000e+00 0.0000e+00 5.7942e+03 5.7942e+03 2.9595e+02 2.9595e+02 3.7186e-05 3.7186e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.1200e-01 2.9400e+07 5.5315e+02 5.7839e+03 1.7891e-08 1.0000e+00 0.0000e+00 5.7839e+03 5.7839e+03 2.9543e+02 2.9543e+02 3.7111e-05 3.7111e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.1400e-01 2.9300e+07 5.5315e+02 5.7735e+03 1.7997e-08 1.0000e+00 0.0000e+00 5.7735e+03 5.7735e+03 2.9490e+02 2.9490e+02 3.7037e-05 3.7037e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.1600e-01 2.9200e+07 5.5315e+02 5.7631e+03 1.8104e-08 1.0000e+00 0.0000e+00 5.7631e+03 5.7631e+03 2.9437e+02 2.9437e+02 3.6962e-05 3.6962e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.1800e-01 2.9100e+07 5.5315e+02 5.7527e+03 1.8212e-08 1.0000e+00 0.0000e+00 5.7527e+03 5.7527e+03 2.9383e+02 2.9383e+02 3.6887e-05 3.6887e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2000e-01 2.9000e+07 5.5315e+02 5.7422e+03 1.8321e-08 1.0000e+00 0.0000e+00 5.7422e+03 5.7422e+03 2.9330e+02 2.9330e+02 3.6811e-05 3.6811e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2200e-01 2.8900e+07 5.5315e+02 5.7316e+03 1.8431e-08 1.0000e+00 0.0000e+00 5.7316e+03 5.7316e+03 2.9276e+02 2.9276e+02 3.6736e-05 3.6736e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2400e-01 2.8800e+07 5.5315e+02 5.7211e+03 1.8543e-08 1.0000e+00 0.0000e+00 5.7211e+03 5.7211e+03 2.9222e+02 2.9222e+02 3.6660e-05 3.6660e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2600e-01 2.8700e+07 5.5315e+02 5.7104e+03 1.8655e-08 1.0000e+00 0.0000e+00 5.7104e+03 5.7104e+03 2.9167e+02 2.9167e+02 3.6584e-05 3.6584e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.2800e-01 2.8600e+07 5.5315e+02 5.6997e+03 1.8768e-08 1.0000e+00 0.0000e+00 5.6997e+03 5.6997e+03 2.9113e+02 2.9113e+02 3.6508e-05 3.6508e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.3000e-01 2.8500e+07 5.5315e+02 5.6890e+03 1.8883e-08 1.0000e+00 0.0000e+00 5.6890e+03 5.6890e+03 2.9058e+02 2.9058e+02 3.6432e-05 3.6432e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.3200e-01 2.8400e+07 5.5315e+02 5.6783e+03 1.8998e-08 1.0000e+00 0.0000e+00 5.6783e+03 5.6783e+03 2.9003e+02 2.9003e+02 3.6356e-05 3.6356e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.3400e-01 2.8300e+07 5.5315e+02 5.6675e+03 1.9115e-08 1.0000e+00 0.0000e+00 5.6675e+03 5.6675e+03 2.8948e+02 2.8948e+02 3.6279e-05 3.6279e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.3600e-01 2.8200e+07 5.5315e+02 5.6566e+03 1.9233e-08 1.0000e+00 0.0000e+00 5.6566e+03 5.6566e+03 2.8892e+02 2.8892e+02 3.6202e-05 3.6202e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.3800e-01 2.8100e+07 5.5315e+02 5.6457e+03 1.9352e-08 1.0000e+00 0.0000e+00 5.6457e+03 5.6457e+03 2.8837e+02 2.8837e+02 3.6125e-05 3.6125e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4000e-01 2.8000e+07 5.5315e+02 5.6347e+03 1.9473e-08 1.0000e+00 0.0000e+00 5.6347e+03 5.6347e+03 2.8781e+02 2.8781e+02 3.6048e-05 3.6048e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4200e-01 2.7900e+07 5.5315e+02 5.6237e+03 1.9594e-08 1.0000e+00 0.0000e+00 5.6237e+03 5.6237e+03 2.8725e+02 2.8725e+02 3.5971e-05 3.5971e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4400e-01 2.7800e+07 5.5315e+02 5.6127e+03 1.9717e-08 1.0000e+00 0.0000e+00 5.6127e+03 5.6127e+03 2.8668e+02 2.8668e+02 3.5893e-05 3.5893e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4600e-01 2.7700e+07 5.5315e+02 5.6016e+03 1.9841e-08 1.0000e+00 0.0000e+00 5.6016e+03 5.6016e+03 2.8612e+02 2.8612e+02 3.5815e-05 3.5815e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.4800e-01 2.7600e+07 5.5315e+02 5.5905e+03 1.9966e-08 1.0000e+00 0.0000e+00 5.5905e+03 5.5905e+03 2.8555e+02 2.8555e+02 3.5737e-05 3.5737e-05 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 +1.5000e-01 2.7500e+07 5.5315e+02 5.5793e+03 2.0093e-08 0.0000e+00 1.0000e+00 5.5793e+03 5.5793e+03 2.8498e+02 2.8498e+02 3.5659e-05 3.5659e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5200e-01 2.7400e+07 5.5315e+02 5.5681e+03 2.0221e-08 0.0000e+00 1.0000e+00 5.5681e+03 5.5681e+03 2.8440e+02 2.8440e+02 3.5581e-05 3.5581e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5400e-01 2.7300e+07 5.5315e+02 5.5568e+03 2.0350e-08 0.0000e+00 1.0000e+00 5.5568e+03 5.5568e+03 2.8383e+02 2.8383e+02 3.5502e-05 3.5502e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5600e-01 2.7200e+07 5.5315e+02 5.5454e+03 2.0481e-08 0.0000e+00 1.0000e+00 5.5454e+03 5.5454e+03 2.8325e+02 2.8325e+02 3.5423e-05 3.5423e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e-01 2.7100e+07 5.5315e+02 5.5341e+03 2.0613e-08 0.0000e+00 1.0000e+00 5.5341e+03 5.5341e+03 2.8266e+02 2.8266e+02 3.5344e-05 3.5344e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e-01 2.7000e+07 5.5315e+02 5.5226e+03 2.0746e-08 0.0000e+00 1.0000e+00 5.5226e+03 5.5226e+03 2.8208e+02 2.8208e+02 3.5265e-05 3.5265e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e-01 2.6900e+07 5.5315e+02 5.5111e+03 2.0881e-08 0.0000e+00 1.0000e+00 5.5111e+03 5.5111e+03 2.8149e+02 2.8149e+02 3.5185e-05 3.5185e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e-01 2.6800e+07 5.5315e+02 5.4996e+03 2.1017e-08 0.0000e+00 1.0000e+00 5.4996e+03 5.4996e+03 2.8091e+02 2.8091e+02 3.5106e-05 3.5106e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e-01 2.6700e+07 5.5315e+02 5.4880e+03 2.1154e-08 0.0000e+00 1.0000e+00 5.4880e+03 5.4880e+03 2.8031e+02 2.8031e+02 3.5026e-05 3.5026e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e-01 2.6600e+07 5.5315e+02 5.4764e+03 2.1293e-08 0.0000e+00 1.0000e+00 5.4764e+03 5.4764e+03 2.7972e+02 2.7972e+02 3.4946e-05 3.4946e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e-01 2.6500e+07 5.5315e+02 5.4647e+03 2.1434e-08 0.0000e+00 1.0000e+00 5.4647e+03 5.4647e+03 2.7912e+02 2.7912e+02 3.4865e-05 3.4865e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e-01 2.6400e+07 5.5315e+02 5.4530e+03 2.1576e-08 0.0000e+00 1.0000e+00 5.4530e+03 5.4530e+03 2.7852e+02 2.7852e+02 3.4785e-05 3.4785e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e-01 2.6300e+07 5.5315e+02 5.4412e+03 2.1719e-08 0.0000e+00 1.0000e+00 5.4412e+03 5.4412e+03 2.7792e+02 2.7792e+02 3.4704e-05 3.4704e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e-01 2.6200e+07 5.5315e+02 5.4293e+03 2.1864e-08 0.0000e+00 1.0000e+00 5.4293e+03 5.4293e+03 2.7732e+02 2.7732e+02 3.4623e-05 3.4623e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e-01 2.6100e+07 5.5315e+02 5.4174e+03 2.2011e-08 0.0000e+00 1.0000e+00 5.4174e+03 5.4174e+03 2.7671e+02 2.7671e+02 3.4542e-05 3.4542e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e-01 2.6000e+07 5.5315e+02 5.4055e+03 2.2159e-08 0.0000e+00 1.0000e+00 5.4055e+03 5.4055e+03 2.7610e+02 2.7610e+02 3.4461e-05 3.4461e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e-01 2.5900e+07 5.5315e+02 5.3935e+03 2.2309e-08 0.0000e+00 1.0000e+00 5.3935e+03 5.3935e+03 2.7548e+02 2.7548e+02 3.4379e-05 3.4379e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e-01 2.5800e+07 5.5315e+02 5.3814e+03 2.2460e-08 0.0000e+00 1.0000e+00 5.3814e+03 5.3814e+03 2.7487e+02 2.7487e+02 3.4297e-05 3.4297e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e-01 2.5700e+07 5.5315e+02 5.3693e+03 2.2613e-08 0.0000e+00 1.0000e+00 5.3693e+03 5.3693e+03 2.7425e+02 2.7425e+02 3.4215e-05 3.4215e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e-01 2.5600e+07 5.5315e+02 5.3571e+03 2.2768e-08 0.0000e+00 1.0000e+00 5.3571e+03 5.3571e+03 2.7363e+02 2.7363e+02 3.4133e-05 3.4133e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e-01 2.5500e+07 5.5315e+02 5.3449e+03 2.2925e-08 0.0000e+00 1.0000e+00 5.3449e+03 5.3449e+03 2.7300e+02 2.7300e+02 3.4050e-05 3.4050e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e-01 2.5400e+07 5.5315e+02 5.3326e+03 2.3083e-08 0.0000e+00 1.0000e+00 5.3326e+03 5.3326e+03 2.7238e+02 2.7238e+02 3.3967e-05 3.3967e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e-01 2.5300e+07 5.5315e+02 5.3203e+03 2.3243e-08 0.0000e+00 1.0000e+00 5.3203e+03 5.3203e+03 2.7175e+02 2.7175e+02 3.3884e-05 3.3884e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e-01 2.5200e+07 5.5315e+02 5.3079e+03 2.3405e-08 0.0000e+00 1.0000e+00 5.3079e+03 5.3079e+03 2.7111e+02 2.7111e+02 3.3801e-05 3.3801e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e-01 2.5100e+07 5.5315e+02 5.2954e+03 2.3568e-08 0.0000e+00 1.0000e+00 5.2954e+03 5.2954e+03 2.7048e+02 2.7048e+02 3.3718e-05 3.3718e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e-01 2.5000e+07 5.5315e+02 5.2829e+03 2.3733e-08 0.0000e+00 1.0000e+00 5.2829e+03 5.2829e+03 2.6984e+02 2.6984e+02 3.3634e-05 3.3634e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0200e-01 2.4900e+07 5.5315e+02 5.2704e+03 2.3901e-08 0.0000e+00 1.0000e+00 5.2704e+03 5.2704e+03 2.6920e+02 2.6920e+02 3.3550e-05 3.3550e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0400e-01 2.4800e+07 5.5315e+02 5.2577e+03 2.4070e-08 0.0000e+00 1.0000e+00 5.2577e+03 5.2577e+03 2.6855e+02 2.6855e+02 3.3466e-05 3.3466e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0600e-01 2.4700e+07 5.5315e+02 5.2451e+03 2.4241e-08 0.0000e+00 1.0000e+00 5.2451e+03 5.2451e+03 2.6790e+02 2.6790e+02 3.3382e-05 3.3382e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0800e-01 2.4600e+07 5.5315e+02 5.2323e+03 2.4414e-08 0.0000e+00 1.0000e+00 5.2323e+03 5.2323e+03 2.6725e+02 2.6725e+02 3.3297e-05 3.3297e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1000e-01 2.4500e+07 5.5315e+02 5.2195e+03 2.4588e-08 0.0000e+00 1.0000e+00 5.2195e+03 5.2195e+03 2.6660e+02 2.6660e+02 3.3213e-05 3.3213e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1200e-01 2.4400e+07 5.5315e+02 5.2066e+03 2.4765e-08 0.0000e+00 1.0000e+00 5.2066e+03 5.2066e+03 2.6594e+02 2.6594e+02 3.3128e-05 3.3128e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1400e-01 2.4300e+07 5.5315e+02 5.1937e+03 2.4944e-08 0.0000e+00 1.0000e+00 5.1937e+03 5.1937e+03 2.6528e+02 2.6528e+02 3.3042e-05 3.3042e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1600e-01 2.4200e+07 5.5315e+02 5.1807e+03 2.5125e-08 0.0000e+00 1.0000e+00 5.1807e+03 5.1807e+03 2.6462e+02 2.6462e+02 3.2957e-05 3.2957e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.1800e-01 2.4100e+07 5.5315e+02 5.1677e+03 2.5308e-08 0.0000e+00 1.0000e+00 5.1677e+03 5.1677e+03 2.6395e+02 2.6395e+02 3.2871e-05 3.2871e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2000e-01 2.4000e+07 5.5315e+02 5.1546e+03 2.5493e-08 0.0000e+00 1.0000e+00 5.1546e+03 5.1546e+03 2.6328e+02 2.6328e+02 3.2785e-05 3.2785e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2200e-01 2.3900e+07 5.5315e+02 5.1414e+03 2.5681e-08 0.0000e+00 1.0000e+00 5.1414e+03 5.1414e+03 2.6261e+02 2.6261e+02 3.2699e-05 3.2699e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2400e-01 2.3800e+07 5.5315e+02 5.1282e+03 2.5870e-08 0.0000e+00 1.0000e+00 5.1282e+03 5.1282e+03 2.6193e+02 2.6193e+02 3.2613e-05 3.2613e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2600e-01 2.3700e+07 5.5315e+02 5.1149e+03 2.6062e-08 0.0000e+00 1.0000e+00 5.1149e+03 5.1149e+03 2.6125e+02 2.6125e+02 3.2526e-05 3.2526e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.2800e-01 2.3600e+07 5.5315e+02 5.1015e+03 2.6256e-08 0.0000e+00 1.0000e+00 5.1015e+03 5.1015e+03 2.6057e+02 2.6057e+02 3.2439e-05 3.2439e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3000e-01 2.3500e+07 5.5315e+02 5.0881e+03 2.6452e-08 0.0000e+00 1.0000e+00 5.0881e+03 5.0881e+03 2.5989e+02 2.5989e+02 3.2352e-05 3.2352e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3200e-01 2.3400e+07 5.5315e+02 5.0746e+03 2.6651e-08 0.0000e+00 1.0000e+00 5.0746e+03 5.0746e+03 2.5920e+02 2.5920e+02 3.2264e-05 3.2264e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3400e-01 2.3300e+07 5.5315e+02 5.0610e+03 2.6851e-08 0.0000e+00 1.0000e+00 5.0610e+03 5.0610e+03 2.5850e+02 2.5850e+02 3.2177e-05 3.2177e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3600e-01 2.3200e+07 5.5315e+02 5.0474e+03 2.7055e-08 0.0000e+00 1.0000e+00 5.0474e+03 5.0474e+03 2.5781e+02 2.5781e+02 3.2089e-05 3.2089e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.3800e-01 2.3100e+07 5.5315e+02 5.0337e+03 2.7260e-08 0.0000e+00 1.0000e+00 5.0337e+03 5.0337e+03 2.5711e+02 2.5711e+02 3.2001e-05 3.2001e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4000e-01 2.3000e+07 5.5315e+02 5.0200e+03 2.7469e-08 0.0000e+00 1.0000e+00 5.0200e+03 5.0200e+03 2.5641e+02 2.5641e+02 3.1913e-05 3.1913e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4200e-01 2.2900e+07 5.5315e+02 5.0061e+03 2.7679e-08 0.0000e+00 1.0000e+00 5.0061e+03 5.0061e+03 2.5570e+02 2.5570e+02 3.1824e-05 3.1824e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4400e-01 2.2800e+07 5.5315e+02 4.9923e+03 2.7892e-08 0.0000e+00 1.0000e+00 4.9923e+03 4.9923e+03 2.5499e+02 2.5499e+02 3.1735e-05 3.1735e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4600e-01 2.2700e+07 5.5315e+02 4.9783e+03 2.8108e-08 0.0000e+00 1.0000e+00 4.9783e+03 4.9783e+03 2.5428e+02 2.5428e+02 3.1646e-05 3.1646e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.4800e-01 2.2600e+07 5.5315e+02 4.9643e+03 2.8326e-08 0.0000e+00 1.0000e+00 4.9643e+03 4.9643e+03 2.5356e+02 2.5356e+02 3.1557e-05 3.1557e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5000e-01 2.2500e+07 5.5315e+02 4.9502e+03 2.8547e-08 0.0000e+00 1.0000e+00 4.9502e+03 4.9502e+03 2.5284e+02 2.5284e+02 3.1467e-05 3.1467e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5200e-01 2.2400e+07 5.5315e+02 4.9360e+03 2.8771e-08 0.0000e+00 1.0000e+00 4.9360e+03 4.9360e+03 2.5212e+02 2.5212e+02 3.1377e-05 3.1377e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5400e-01 2.2300e+07 5.5315e+02 4.9218e+03 2.8998e-08 0.0000e+00 1.0000e+00 4.9218e+03 4.9218e+03 2.5139e+02 2.5139e+02 3.1287e-05 3.1287e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5600e-01 2.2200e+07 5.5315e+02 4.9075e+03 2.9227e-08 0.0000e+00 1.0000e+00 4.9075e+03 4.9075e+03 2.5066e+02 2.5066e+02 3.1197e-05 3.1197e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.5800e-01 2.2100e+07 5.5315e+02 4.8931e+03 2.9459e-08 0.0000e+00 1.0000e+00 4.8931e+03 4.8931e+03 2.4993e+02 2.4993e+02 3.1107e-05 3.1107e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6000e-01 2.2000e+07 5.5315e+02 4.8786e+03 2.9694e-08 0.0000e+00 1.0000e+00 4.8786e+03 4.8786e+03 2.4919e+02 2.4919e+02 3.1016e-05 3.1016e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6200e-01 2.1900e+07 5.5315e+02 4.8641e+03 2.9932e-08 0.0000e+00 1.0000e+00 4.8641e+03 4.8641e+03 2.4845e+02 2.4845e+02 3.0925e-05 3.0925e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6400e-01 2.1800e+07 5.5315e+02 4.8495e+03 3.0172e-08 0.0000e+00 1.0000e+00 4.8495e+03 4.8495e+03 2.4770e+02 2.4770e+02 3.0834e-05 3.0834e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6600e-01 2.1700e+07 5.5315e+02 4.8348e+03 3.0416e-08 0.0000e+00 1.0000e+00 4.8348e+03 4.8348e+03 2.4695e+02 2.4695e+02 3.0742e-05 3.0742e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.6800e-01 2.1600e+07 5.5315e+02 4.8201e+03 3.0663e-08 0.0000e+00 1.0000e+00 4.8201e+03 4.8201e+03 2.4620e+02 2.4620e+02 3.0651e-05 3.0651e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7000e-01 2.1500e+07 5.5315e+02 4.8053e+03 3.0913e-08 0.0000e+00 1.0000e+00 4.8053e+03 4.8053e+03 2.4544e+02 2.4544e+02 3.0559e-05 3.0559e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7200e-01 2.1400e+07 5.5315e+02 4.7904e+03 3.1166e-08 0.0000e+00 1.0000e+00 4.7904e+03 4.7904e+03 2.4468e+02 2.4468e+02 3.0466e-05 3.0466e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7400e-01 2.1300e+07 5.5315e+02 4.7754e+03 3.1422e-08 0.0000e+00 1.0000e+00 4.7754e+03 4.7754e+03 2.4392e+02 2.4392e+02 3.0374e-05 3.0374e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7600e-01 2.1200e+07 5.5315e+02 4.7604e+03 3.1682e-08 0.0000e+00 1.0000e+00 4.7604e+03 4.7604e+03 2.4315e+02 2.4315e+02 3.0281e-05 3.0281e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.7800e-01 2.1100e+07 5.5315e+02 4.7453e+03 3.1945e-08 0.0000e+00 1.0000e+00 4.7453e+03 4.7453e+03 2.4238e+02 2.4238e+02 3.0189e-05 3.0189e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8000e-01 2.1000e+07 5.5315e+02 4.7301e+03 3.2211e-08 0.0000e+00 1.0000e+00 4.7301e+03 4.7301e+03 2.4160e+02 2.4160e+02 3.0095e-05 3.0095e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8200e-01 2.0900e+07 5.5315e+02 4.7148e+03 3.2480e-08 0.0000e+00 1.0000e+00 4.7148e+03 4.7148e+03 2.4082e+02 2.4082e+02 3.0002e-05 3.0002e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8400e-01 2.0800e+07 5.5315e+02 4.6994e+03 3.2753e-08 0.0000e+00 1.0000e+00 4.6994e+03 4.6994e+03 2.4003e+02 2.4003e+02 2.9908e-05 2.9908e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8600e-01 2.0700e+07 5.5315e+02 4.6840e+03 3.3030e-08 0.0000e+00 1.0000e+00 4.6840e+03 4.6840e+03 2.3925e+02 2.3925e+02 2.9815e-05 2.9815e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.8800e-01 2.0600e+07 5.5315e+02 4.6685e+03 3.3310e-08 0.0000e+00 1.0000e+00 4.6685e+03 4.6685e+03 2.3845e+02 2.3845e+02 2.9720e-05 2.9720e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9000e-01 2.0500e+07 5.5315e+02 4.6529e+03 3.3593e-08 0.0000e+00 1.0000e+00 4.6529e+03 4.6529e+03 2.3766e+02 2.3766e+02 2.9626e-05 2.9626e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9200e-01 2.0400e+07 5.5315e+02 4.6372e+03 3.3881e-08 0.0000e+00 1.0000e+00 4.6372e+03 4.6372e+03 2.3686e+02 2.3686e+02 2.9532e-05 2.9532e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9400e-01 2.0300e+07 5.5315e+02 4.6215e+03 3.4172e-08 0.0000e+00 1.0000e+00 4.6215e+03 4.6215e+03 2.3605e+02 2.3605e+02 2.9437e-05 2.9437e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9600e-01 2.0200e+07 5.5315e+02 4.6056e+03 3.4467e-08 0.0000e+00 1.0000e+00 4.6056e+03 4.6056e+03 2.3524e+02 2.3524e+02 2.9342e-05 2.9342e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.9800e-01 2.0100e+07 5.5315e+02 4.5897e+03 3.4766e-08 0.0000e+00 1.0000e+00 4.5897e+03 4.5897e+03 2.3443e+02 2.3443e+02 2.9247e-05 2.9247e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0000e-01 2.0000e+07 5.5315e+02 4.5737e+03 3.5068e-08 0.0000e+00 1.0000e+00 4.5737e+03 4.5737e+03 2.3361e+02 2.3361e+02 2.9151e-05 2.9151e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0200e-01 1.9900e+07 5.5315e+02 4.5577e+03 3.5375e-08 0.0000e+00 1.0000e+00 4.5577e+03 4.5577e+03 2.3279e+02 2.3279e+02 2.9055e-05 2.9055e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0400e-01 1.9800e+07 5.5315e+02 4.5415e+03 3.5686e-08 0.0000e+00 1.0000e+00 4.5415e+03 4.5415e+03 2.3197e+02 2.3197e+02 2.8959e-05 2.8959e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0600e-01 1.9700e+07 5.5315e+02 4.5252e+03 3.6000e-08 0.0000e+00 1.0000e+00 4.5252e+03 4.5252e+03 2.3114e+02 2.3114e+02 2.8863e-05 2.8863e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.0800e-01 1.9600e+07 5.5315e+02 4.5089e+03 3.6319e-08 0.0000e+00 1.0000e+00 4.5089e+03 4.5089e+03 2.3030e+02 2.3030e+02 2.8767e-05 2.8767e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1000e-01 1.9500e+07 5.5315e+02 4.4925e+03 3.6643e-08 0.0000e+00 1.0000e+00 4.4925e+03 4.4925e+03 2.2946e+02 2.2946e+02 2.8670e-05 2.8670e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1200e-01 1.9400e+07 5.5315e+02 4.4760e+03 3.6970e-08 0.0000e+00 1.0000e+00 4.4760e+03 4.4760e+03 2.2862e+02 2.2862e+02 2.8573e-05 2.8573e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1400e-01 1.9300e+07 5.5315e+02 4.4594e+03 3.7302e-08 0.0000e+00 1.0000e+00 4.4594e+03 4.4594e+03 2.2777e+02 2.2777e+02 2.8476e-05 2.8476e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1600e-01 1.9200e+07 5.5315e+02 4.4427e+03 3.7639e-08 0.0000e+00 1.0000e+00 4.4427e+03 4.4427e+03 2.2692e+02 2.2692e+02 2.8379e-05 2.8379e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.1800e-01 1.9100e+07 5.5315e+02 4.4259e+03 3.7979e-08 0.0000e+00 1.0000e+00 4.4259e+03 4.4259e+03 2.2607e+02 2.2607e+02 2.8282e-05 2.8282e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2000e-01 1.9000e+07 5.5315e+02 4.4091e+03 3.8325e-08 0.0000e+00 1.0000e+00 4.4091e+03 4.4091e+03 2.2520e+02 2.2520e+02 2.8184e-05 2.8184e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2200e-01 1.8900e+07 5.5315e+02 4.3922e+03 3.8675e-08 0.0000e+00 1.0000e+00 4.3922e+03 4.3922e+03 2.2434e+02 2.2434e+02 2.8086e-05 2.8086e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2400e-01 1.8800e+07 5.5315e+02 4.3751e+03 3.9030e-08 0.0000e+00 1.0000e+00 4.3751e+03 4.3751e+03 2.2347e+02 2.2347e+02 2.7988e-05 2.7988e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +3.2600e-01 1.8700e+07 5.5315e+02 4.3578e+03 4.0105e-08 3.9013e-02 9.6099e-01 4.5336e+03 4.3510e+03 2.7893e+02 2.2072e+02 3.4075e-05 2.7707e-05 8.3083e-03 2.5562e-03 4.7396e-01 1.0798e-01 8.6281e-02 4.6615e-02 2.2228e-02 1.6734e-02 2.3534e-01 9.0232e-03 3.0149e-03 5.3673e-01 1.1482e-01 8.7954e-02 4.5566e-02 2.0856e-02 1.5045e-02 1.6699e-01 +3.2800e-01 1.8600e+07 5.5315e+02 4.3403e+03 4.0336e-08 9.6700e-02 9.0330e-01 4.5314e+03 4.3208e+03 2.8320e+02 2.1646e+02 3.4587e-05 2.7288e-05 8.2428e-03 2.5161e-03 4.6836e-01 1.0734e-01 8.6103e-02 4.6692e-02 2.2344e-02 1.6880e-02 2.4152e-01 9.0650e-03 3.0415e-03 5.4039e-01 1.1522e-01 8.8054e-02 4.5506e-02 2.0776e-02 1.4947e-02 1.6299e-01 +3.3000e-01 1.8500e+07 5.5315e+02 4.3228e+03 4.0571e-08 1.3663e-01 8.6337e-01 4.5279e+03 4.2921e+03 2.8700e+02 2.1269e+02 3.5046e-05 2.6921e-05 8.1828e-03 2.4798e-03 4.6328e-01 1.0675e-01 8.5933e-02 4.6758e-02 2.2447e-02 1.7013e-02 2.4716e-01 9.1011e-03 3.0644e-03 5.4354e-01 1.1557e-01 8.8143e-02 4.5457e-02 2.0709e-02 1.4863e-02 1.5955e-01 +3.3200e-01 1.8400e+07 5.5315e+02 4.3053e+03 4.0809e-08 1.6633e-01 8.3367e-01 4.5234e+03 4.2643e+03 2.9045e+02 2.0927e+02 3.5467e-05 2.6592e-05 8.1268e-03 2.4462e-03 4.5856e-01 1.0620e-01 8.5769e-02 4.6816e-02 2.2542e-02 1.7134e-02 2.5241e-01 9.1331e-03 3.0844e-03 5.4631e-01 1.1588e-01 8.8225e-02 4.5415e-02 2.0650e-02 1.4790e-02 1.5651e-01 +3.3400e-01 1.8300e+07 5.5315e+02 4.2877e+03 4.1050e-08 1.8949e-01 8.1051e-01 4.5181e+03 4.2372e+03 2.9363e+02 2.0611e+02 3.5859e-05 2.6293e-05 8.0737e-03 2.4148e-03 4.5412e-01 1.0567e-01 8.5609e-02 4.6867e-02 2.2629e-02 1.7248e-02 2.5737e-01 9.1621e-03 3.1024e-03 5.4880e-01 1.1616e-01 8.8301e-02 4.5378e-02 2.0597e-02 1.4724e-02 1.5377e-01 +3.3600e-01 1.8200e+07 5.5315e+02 4.2701e+03 4.1295e-08 2.0819e-01 7.9181e-01 4.5123e+03 4.2106e+03 2.9661e+02 2.0316e+02 3.6228e-05 2.6016e-05 8.0230e-03 2.3851e-03 4.4990e-01 1.0517e-01 8.5451e-02 4.6912e-02 2.2710e-02 1.7356e-02 2.6210e-01 9.1886e-03 3.1187e-03 5.5107e-01 1.1642e-01 8.8373e-02 4.5347e-02 2.0551e-02 1.4665e-02 1.5127e-01 +3.3800e-01 1.8100e+07 5.5315e+02 4.2524e+03 4.1543e-08 2.2367e-01 7.7633e-01 4.5060e+03 4.1846e+03 2.9941e+02 2.0038e+02 3.6578e-05 2.5759e-05 7.9740e-03 2.3568e-03 4.4586e-01 1.0468e-01 8.5294e-02 4.6951e-02 2.2787e-02 1.7458e-02 2.6665e-01 9.2130e-03 3.1336e-03 5.5315e-01 1.1666e-01 8.8441e-02 4.5319e-02 2.0508e-02 1.4610e-02 1.4897e-01 +3.4000e-01 1.8000e+07 5.5315e+02 4.2347e+03 4.1795e-08 2.3675e-01 7.6325e-01 4.4993e+03 4.1589e+03 3.0206e+02 1.9775e+02 3.6912e-05 2.5519e-05 7.9266e-03 2.3296e-03 4.4197e-01 1.0420e-01 8.5138e-02 4.6987e-02 2.2860e-02 1.7555e-02 2.7104e-01 9.2358e-03 3.1473e-03 5.5507e-01 1.1688e-01 8.8507e-02 4.5295e-02 2.0469e-02 1.4561e-02 1.4683e-01 +3.4200e-01 1.7900e+07 5.5315e+02 4.2170e+03 4.2051e-08 2.4797e-01 7.5203e-01 4.4923e+03 4.1335e+03 3.0459e+02 1.9525e+02 3.7232e-05 2.5291e-05 7.8805e-03 2.3035e-03 4.3820e-01 1.0374e-01 8.4981e-02 4.7018e-02 2.2929e-02 1.7648e-02 2.7530e-01 9.2572e-03 3.1600e-03 5.5687e-01 1.1710e-01 8.8570e-02 4.5274e-02 2.0434e-02 1.4515e-02 1.4483e-01 +3.4400e-01 1.7800e+07 5.5315e+02 4.1993e+03 4.2310e-08 2.5772e-01 7.4228e-01 4.4851e+03 4.1084e+03 3.0702e+02 1.9285e+02 3.7541e-05 2.5076e-05 7.8355e-03 2.2782e-03 4.3455e-01 1.0328e-01 8.4825e-02 4.7046e-02 2.2994e-02 1.7738e-02 2.7945e-01 9.2773e-03 3.1718e-03 5.5854e-01 1.1729e-01 8.8632e-02 4.5256e-02 2.0401e-02 1.4472e-02 1.4295e-01 +3.4600e-01 1.7700e+07 5.5315e+02 4.1815e+03 4.2572e-08 2.6629e-01 7.3371e-01 4.4776e+03 4.0835e+03 3.0935e+02 1.9054e+02 3.7839e-05 2.4872e-05 7.7914e-03 2.2537e-03 4.3100e-01 1.0283e-01 8.4668e-02 4.7070e-02 2.3057e-02 1.7825e-02 2.8350e-01 9.2963e-03 3.1829e-03 5.6012e-01 1.1748e-01 8.8692e-02 4.5240e-02 2.0371e-02 1.4432e-02 1.4118e-01 +3.4800e-01 1.7600e+07 5.5315e+02 4.1637e+03 4.2839e-08 2.7389e-01 7.2611e-01 4.4699e+03 4.0588e+03 3.1159e+02 1.8833e+02 3.8128e-05 2.4676e-05 7.7481e-03 2.2299e-03 4.2753e-01 1.0239e-01 8.4510e-02 4.7091e-02 2.3117e-02 1.7909e-02 2.8747e-01 9.3143e-03 3.1933e-03 5.6161e-01 1.1766e-01 8.8751e-02 4.5226e-02 2.0343e-02 1.4395e-02 1.3951e-01 +3.5000e-01 1.7500e+07 5.5315e+02 4.1458e+03 4.3110e-08 2.8067e-01 7.1933e-01 4.4621e+03 4.0342e+03 3.1376e+02 1.8618e+02 3.8409e-05 2.4490e-05 7.7054e-03 2.2067e-03 4.2413e-01 1.0196e-01 8.4351e-02 4.7109e-02 2.3175e-02 1.7991e-02 2.9137e-01 9.3315e-03 3.2031e-03 5.6301e-01 1.1784e-01 8.8809e-02 4.5214e-02 2.0317e-02 1.4360e-02 1.3791e-01 +3.5200e-01 1.7400e+07 5.5315e+02 4.1279e+03 4.3384e-08 2.8678e-01 7.1322e-01 4.4540e+03 4.0099e+03 3.1587e+02 1.8410e+02 3.8682e-05 2.4310e-05 7.6634e-03 2.1841e-03 4.2081e-01 1.0152e-01 8.4191e-02 4.7124e-02 2.3230e-02 1.8070e-02 2.9521e-01 9.3479e-03 3.2124e-03 5.6435e-01 1.1800e-01 8.8866e-02 4.5203e-02 2.0293e-02 1.4327e-02 1.3640e-01 +3.5400e-01 1.7300e+07 5.5315e+02 4.1100e+03 4.3663e-08 2.9230e-01 7.0770e-01 4.4459e+03 3.9856e+03 3.1791e+02 1.8209e+02 3.8949e-05 2.4138e-05 7.6220e-03 2.1619e-03 4.1754e-01 1.0110e-01 8.4029e-02 4.7136e-02 2.3283e-02 1.8147e-02 2.9898e-01 9.3636e-03 3.2212e-03 5.6562e-01 1.1816e-01 8.8921e-02 4.5195e-02 2.0271e-02 1.4296e-02 1.3495e-01 +3.5600e-01 1.7200e+07 5.5315e+02 4.0920e+03 4.3945e-08 2.9732e-01 7.0268e-01 4.4376e+03 3.9615e+03 3.1989e+02 1.8013e+02 3.9210e-05 2.3972e-05 7.5810e-03 2.1403e-03 4.1433e-01 1.0067e-01 8.3866e-02 4.7145e-02 2.3334e-02 1.8223e-02 3.0270e-01 9.3787e-03 3.2294e-03 5.6682e-01 1.1832e-01 8.8977e-02 4.5188e-02 2.0250e-02 1.4267e-02 1.3357e-01 +3.5800e-01 1.7100e+07 5.5315e+02 4.0740e+03 4.4232e-08 3.0190e-01 6.9810e-01 4.4292e+03 3.9375e+03 3.2183e+02 1.7822e+02 3.9465e-05 2.3812e-05 7.5404e-03 2.1190e-03 4.1118e-01 1.0025e-01 8.3702e-02 4.7152e-02 2.3384e-02 1.8296e-02 3.0638e-01 9.3932e-03 3.2373e-03 5.6798e-01 1.1847e-01 8.9031e-02 4.5182e-02 2.0231e-02 1.4239e-02 1.3224e-01 +3.6000e-01 1.7000e+07 5.5315e+02 4.0560e+03 4.4524e-08 3.0609e-01 6.9391e-01 4.4207e+03 3.9136e+03 3.2372e+02 1.7636e+02 3.9714e-05 2.3657e-05 7.5002e-03 2.0982e-03 4.0806e-01 9.9831e-02 8.3535e-02 4.7156e-02 2.3431e-02 1.8367e-02 3.1002e-01 9.4071e-03 3.2448e-03 5.6908e-01 1.1861e-01 8.9085e-02 4.5177e-02 2.0213e-02 1.4213e-02 1.3097e-01 +3.6200e-01 1.6900e+07 5.5315e+02 4.0379e+03 4.4819e-08 3.0995e-01 6.9005e-01 4.4121e+03 3.8897e+03 3.2556e+02 1.7455e+02 3.9959e-05 2.3507e-05 7.4603e-03 2.0777e-03 4.0499e-01 9.9414e-02 8.3367e-02 4.7158e-02 2.3477e-02 1.8437e-02 3.1361e-01 9.4206e-03 3.2519e-03 5.7013e-01 1.1875e-01 8.9138e-02 4.5174e-02 2.0196e-02 1.4188e-02 1.2975e-01 +3.6400e-01 1.6800e+07 5.5315e+02 4.0198e+03 4.5120e-08 3.1351e-01 6.8649e-01 4.4035e+03 3.8660e+03 3.2736e+02 1.7277e+02 4.0200e-05 2.3362e-05 7.4208e-03 2.0576e-03 4.0196e-01 9.8998e-02 8.3197e-02 4.7158e-02 2.3521e-02 1.8505e-02 3.1718e-01 9.4336e-03 3.2587e-03 5.7114e-01 1.1888e-01 8.9191e-02 4.5172e-02 2.0180e-02 1.4165e-02 1.2857e-01 +3.6600e-01 1.6700e+07 5.5315e+02 4.0016e+03 4.5425e-08 3.1681e-01 6.8319e-01 4.3947e+03 3.8423e+03 3.2913e+02 1.7103e+02 4.0437e-05 2.3221e-05 7.3815e-03 2.0378e-03 3.9897e-01 9.8584e-02 8.3025e-02 4.7155e-02 2.3563e-02 1.8572e-02 3.2071e-01 9.4461e-03 3.2652e-03 5.7211e-01 1.1901e-01 8.9244e-02 4.5172e-02 2.0166e-02 1.4143e-02 1.2744e-01 +3.6800e-01 1.6600e+07 5.5315e+02 3.9834e+03 4.5734e-08 3.1986e-01 6.8014e-01 4.3859e+03 3.8186e+03 3.3086e+02 1.6933e+02 4.0669e-05 2.3084e-05 7.3424e-03 2.0183e-03 3.9601e-01 9.8170e-02 8.2851e-02 4.7149e-02 2.3604e-02 1.8637e-02 3.2422e-01 9.4582e-03 3.2714e-03 5.7304e-01 1.1914e-01 8.9296e-02 4.5172e-02 2.0152e-02 1.4122e-02 1.2635e-01 +3.7000e-01 1.6500e+07 5.5315e+02 3.9652e+03 4.6048e-08 3.2269e-01 6.7731e-01 4.3771e+03 3.7951e+03 3.3255e+02 1.6766e+02 4.0898e-05 2.2950e-05 7.3035e-03 1.9991e-03 3.9308e-01 9.7758e-02 8.2675e-02 4.7141e-02 2.3643e-02 1.8701e-02 3.2770e-01 9.4700e-03 3.2773e-03 5.7393e-01 1.1927e-01 8.9348e-02 4.5173e-02 2.0140e-02 1.4102e-02 1.2529e-01 +3.7200e-01 1.6400e+07 5.5315e+02 3.9469e+03 4.6368e-08 3.2533e-01 6.7467e-01 4.3681e+03 3.7716e+03 3.3422e+02 1.6603e+02 4.1124e-05 2.2821e-05 7.2649e-03 1.9801e-03 3.9018e-01 9.7346e-02 8.2497e-02 4.7131e-02 2.3681e-02 1.8764e-02 3.3115e-01 9.4814e-03 3.2830e-03 5.7479e-01 1.1939e-01 8.9399e-02 4.5175e-02 2.0128e-02 1.4084e-02 1.2427e-01 +3.7400e-01 1.6300e+07 5.5315e+02 3.9286e+03 4.6692e-08 3.2778e-01 6.7222e-01 4.3592e+03 3.7481e+03 3.3585e+02 1.6442e+02 4.1346e-05 2.2695e-05 7.2264e-03 1.9614e-03 3.8731e-01 9.6934e-02 8.2316e-02 4.7119e-02 2.3718e-02 1.8825e-02 3.3459e-01 9.4924e-03 3.2884e-03 5.7562e-01 1.1950e-01 8.9450e-02 4.5178e-02 2.0118e-02 1.4066e-02 1.2328e-01 +3.7600e-01 1.6200e+07 5.5315e+02 3.9102e+03 4.7021e-08 3.3008e-01 6.6992e-01 4.3501e+03 3.7247e+03 3.3746e+02 1.6284e+02 4.1565e-05 2.2572e-05 7.1880e-03 1.9429e-03 3.8447e-01 9.6523e-02 8.2133e-02 4.7105e-02 2.3752e-02 1.8885e-02 3.3800e-01 9.5032e-03 3.2935e-03 5.7642e-01 1.1962e-01 8.9501e-02 4.5182e-02 2.0108e-02 1.4049e-02 1.2233e-01 +3.7800e-01 1.6100e+07 5.5315e+02 3.8918e+03 4.7356e-08 3.3222e-01 6.6778e-01 4.3411e+03 3.7013e+03 3.3904e+02 1.6129e+02 4.1782e-05 2.2451e-05 7.1498e-03 1.9247e-03 3.8164e-01 9.6112e-02 8.1948e-02 4.7088e-02 2.3786e-02 1.8944e-02 3.4140e-01 9.5136e-03 3.2985e-03 5.7718e-01 1.1973e-01 8.9552e-02 4.5187e-02 2.0099e-02 1.4033e-02 1.2140e-01 +3.8000e-01 1.6000e+07 5.5315e+02 3.8734e+03 4.7696e-08 3.3422e-01 6.6578e-01 4.3320e+03 3.6779e+03 3.4060e+02 1.5976e+02 4.1995e-05 2.2334e-05 7.1117e-03 1.9066e-03 3.7885e-01 9.5701e-02 8.1761e-02 4.7069e-02 2.3818e-02 1.9001e-02 3.4479e-01 9.5237e-03 3.3032e-03 5.7792e-01 1.1984e-01 8.9603e-02 4.5193e-02 2.0091e-02 1.4018e-02 1.2050e-01 +3.8200e-01 1.5900e+07 5.5315e+02 3.8549e+03 4.8042e-08 3.3610e-01 6.6390e-01 4.3228e+03 3.6546e+03 3.4213e+02 1.5825e+02 4.2207e-05 2.2220e-05 7.0737e-03 1.8888e-03 3.7607e-01 9.5289e-02 8.1571e-02 4.7048e-02 2.3849e-02 1.9058e-02 3.4815e-01 9.5336e-03 3.3078e-03 5.7864e-01 1.1995e-01 8.9653e-02 4.5199e-02 2.0083e-02 1.4004e-02 1.1963e-01 +3.8400e-01 1.5800e+07 5.5315e+02 3.8363e+03 4.8393e-08 3.3786e-01 6.6214e-01 4.3136e+03 3.6313e+03 3.4364e+02 1.5677e+02 4.2415e-05 2.2108e-05 7.0357e-03 1.8712e-03 3.7331e-01 9.4877e-02 8.1379e-02 4.7024e-02 2.3879e-02 1.9113e-02 3.5151e-01 9.5432e-03 3.3121e-03 5.7933e-01 1.2005e-01 8.9703e-02 4.5206e-02 2.0076e-02 1.3990e-02 1.1879e-01 +3.8600e-01 1.5700e+07 5.5315e+02 3.8177e+03 4.8749e-08 3.3950e-01 6.6050e-01 4.3044e+03 3.6081e+03 3.4513e+02 1.5531e+02 4.2622e-05 2.1999e-05 6.9979e-03 1.8537e-03 3.7057e-01 9.4464e-02 8.1184e-02 4.6999e-02 2.3907e-02 1.9167e-02 3.5485e-01 9.5525e-03 3.3163e-03 5.7999e-01 1.2016e-01 8.9753e-02 4.5214e-02 2.0070e-02 1.3978e-02 1.1797e-01 +3.8800e-01 1.5600e+07 5.5315e+02 3.7991e+03 4.9112e-08 3.4105e-01 6.5895e-01 4.2952e+03 3.5848e+03 3.4660e+02 1.5387e+02 4.2826e-05 2.1892e-05 6.9601e-03 1.8365e-03 3.6785e-01 9.4051e-02 8.0987e-02 4.6971e-02 2.3934e-02 1.9220e-02 3.5819e-01 9.5616e-03 3.3203e-03 5.8063e-01 1.2026e-01 8.9803e-02 4.5223e-02 2.0065e-02 1.3966e-02 1.1717e-01 +3.9000e-01 1.5500e+07 5.5315e+02 3.7804e+03 4.9481e-08 3.4250e-01 6.5750e-01 4.2859e+03 3.5616e+03 3.4805e+02 1.5245e+02 4.3028e-05 2.1787e-05 6.9223e-03 1.8194e-03 3.6515e-01 9.3638e-02 8.0788e-02 4.6941e-02 2.3959e-02 1.9272e-02 3.6151e-01 9.5705e-03 3.3242e-03 5.8125e-01 1.2036e-01 8.9853e-02 4.5232e-02 2.0060e-02 1.3954e-02 1.1640e-01 +3.9200e-01 1.5400e+07 5.5315e+02 3.7617e+03 4.9856e-08 3.4385e-01 6.5615e-01 4.2766e+03 3.5384e+03 3.4948e+02 1.5105e+02 4.3228e-05 2.1684e-05 6.8846e-03 1.8025e-03 3.6246e-01 9.3223e-02 8.0585e-02 4.6909e-02 2.3984e-02 1.9323e-02 3.6483e-01 9.5791e-03 3.3278e-03 5.8185e-01 1.2045e-01 8.9902e-02 4.5242e-02 2.0056e-02 1.3944e-02 1.1565e-01 +3.9400e-01 1.5300e+07 5.5315e+02 3.7429e+03 5.0237e-08 3.4513e-01 6.5487e-01 4.2673e+03 3.5153e+03 3.5090e+02 1.4967e+02 4.3426e-05 2.1584e-05 6.8470e-03 1.7857e-03 3.5979e-01 9.2807e-02 8.0380e-02 4.6875e-02 2.4007e-02 1.9373e-02 3.6814e-01 9.5875e-03 3.3314e-03 5.8243e-01 1.2055e-01 8.9952e-02 4.5252e-02 2.0052e-02 1.3934e-02 1.1491e-01 +3.9600e-01 1.5200e+07 5.5315e+02 3.7241e+03 5.0624e-08 3.4632e-01 6.5368e-01 4.2580e+03 3.4921e+03 3.5229e+02 1.4830e+02 4.3622e-05 2.1486e-05 6.8093e-03 1.7691e-03 3.5713e-01 9.2391e-02 8.0173e-02 4.6839e-02 2.4028e-02 1.9422e-02 3.7144e-01 9.5957e-03 3.3347e-03 5.8299e-01 1.2064e-01 9.0001e-02 4.5263e-02 2.0049e-02 1.3925e-02 1.1420e-01 +3.9800e-01 1.5100e+07 5.5315e+02 3.7052e+03 5.1018e-08 3.4744e-01 6.5256e-01 4.2486e+03 3.4690e+03 3.5367e+02 1.4695e+02 4.3816e-05 2.1389e-05 6.7717e-03 1.7526e-03 3.5449e-01 9.1973e-02 7.9963e-02 4.6800e-02 2.4049e-02 1.9470e-02 3.7473e-01 9.6037e-03 3.3380e-03 5.8353e-01 1.2073e-01 9.0051e-02 4.5275e-02 2.0047e-02 1.3916e-02 1.1351e-01 +4.0000e-01 1.5000e+07 5.5315e+02 3.6863e+03 5.1419e-08 3.4849e-01 6.5151e-01 4.2392e+03 3.4459e+03 3.5504e+02 1.4562e+02 4.4009e-05 2.1294e-05 6.7341e-03 1.7363e-03 3.5186e-01 9.1554e-02 7.9750e-02 4.6759e-02 2.4068e-02 1.9517e-02 3.7803e-01 9.6116e-03 3.3411e-03 5.8405e-01 1.2082e-01 9.0100e-02 4.5287e-02 2.0045e-02 1.3908e-02 1.1284e-01 +4.0200e-01 1.4900e+07 5.5315e+02 3.6673e+03 5.1827e-08 3.4947e-01 6.5053e-01 4.2298e+03 3.4228e+03 3.5639e+02 1.4430e+02 4.4200e-05 2.1201e-05 6.6965e-03 1.7201e-03 3.4924e-01 9.1134e-02 7.9534e-02 4.6716e-02 2.4086e-02 1.9562e-02 3.8131e-01 9.6192e-03 3.3440e-03 5.8455e-01 1.2091e-01 9.0149e-02 4.5300e-02 2.0044e-02 1.3900e-02 1.1218e-01 +4.0400e-01 1.4800e+07 5.5315e+02 3.6483e+03 5.2241e-08 3.5039e-01 6.4961e-01 4.2204e+03 3.3997e+03 3.5772e+02 1.4300e+02 4.4389e-05 2.1110e-05 6.6589e-03 1.7040e-03 3.4663e-01 9.0713e-02 7.9316e-02 4.6671e-02 2.4103e-02 1.9607e-02 3.8460e-01 9.6266e-03 3.3469e-03 5.8504e-01 1.2099e-01 9.0198e-02 4.5313e-02 2.0043e-02 1.3894e-02 1.1155e-01 +4.0600e-01 1.4700e+07 5.5315e+02 3.6292e+03 5.2663e-08 3.5124e-01 6.4876e-01 4.2110e+03 3.3766e+03 3.5904e+02 1.4171e+02 4.4577e-05 2.1021e-05 6.6212e-03 1.6881e-03 3.4404e-01 9.0290e-02 7.9095e-02 4.6623e-02 2.4118e-02 1.9651e-02 3.8788e-01 9.6339e-03 3.3496e-03 5.8551e-01 1.2108e-01 9.0247e-02 4.5327e-02 2.0042e-02 1.3887e-02 1.1093e-01 +4.0800e-01 1.4600e+07 5.5315e+02 3.6100e+03 5.3093e-08 3.5204e-01 6.4796e-01 4.2016e+03 3.3535e+03 3.6035e+02 1.4043e+02 4.4763e-05 2.0933e-05 6.5836e-03 1.6723e-03 3.4145e-01 8.9866e-02 7.8871e-02 4.6574e-02 2.4132e-02 1.9693e-02 3.9116e-01 9.6410e-03 3.3522e-03 5.8596e-01 1.2116e-01 9.0295e-02 4.5342e-02 2.0043e-02 1.3881e-02 1.1032e-01 +4.1000e-01 1.4500e+07 5.5315e+02 3.5909e+03 5.3530e-08 3.5279e-01 6.4721e-01 4.1921e+03 3.3305e+03 3.6165e+02 1.3917e+02 4.4948e-05 2.0846e-05 6.5459e-03 1.6566e-03 3.3888e-01 8.9441e-02 7.8644e-02 4.6522e-02 2.4145e-02 1.9735e-02 3.9443e-01 9.6479e-03 3.3547e-03 5.8640e-01 1.2124e-01 9.0344e-02 4.5357e-02 2.0043e-02 1.3876e-02 1.0973e-01 +4.1200e-01 1.4400e+07 5.5315e+02 3.5716e+03 5.3974e-08 3.5347e-01 6.4653e-01 4.1827e+03 3.3074e+03 3.6293e+02 1.3792e+02 4.5132e-05 2.0761e-05 6.5082e-03 1.6410e-03 3.3631e-01 8.9013e-02 7.8414e-02 4.6467e-02 2.4157e-02 1.9776e-02 3.9771e-01 9.6547e-03 3.3571e-03 5.8682e-01 1.2132e-01 9.0392e-02 4.5372e-02 2.0044e-02 1.3871e-02 1.0916e-01 +4.1400e-01 1.4300e+07 5.5315e+02 3.5523e+03 5.4427e-08 3.5411e-01 6.4589e-01 4.1732e+03 3.2844e+03 3.6420e+02 1.3668e+02 4.5314e-05 2.0678e-05 6.4705e-03 1.6256e-03 3.3376e-01 8.8585e-02 7.8181e-02 4.6411e-02 2.4167e-02 1.9815e-02 4.0099e-01 9.6613e-03 3.3593e-03 5.8723e-01 1.2140e-01 9.0441e-02 4.5388e-02 2.0046e-02 1.3867e-02 1.0860e-01 +4.1600e-01 1.4200e+07 5.5315e+02 3.5329e+03 5.4887e-08 3.5470e-01 6.4530e-01 4.1637e+03 3.2614e+03 3.6546e+02 1.3545e+02 4.5495e-05 2.0596e-05 6.4327e-03 1.6102e-03 3.3121e-01 8.8154e-02 7.7945e-02 4.6352e-02 2.4177e-02 1.9854e-02 4.0426e-01 9.6678e-03 3.3615e-03 5.8763e-01 1.2148e-01 9.0489e-02 4.5404e-02 2.0048e-02 1.3864e-02 1.0806e-01 +4.1800e-01 1.4100e+07 5.5315e+02 3.5135e+03 5.5357e-08 3.5525e-01 6.4475e-01 4.1542e+03 3.2383e+03 3.6671e+02 1.3424e+02 4.5674e-05 2.0515e-05 6.3949e-03 1.5950e-03 3.2867e-01 8.7722e-02 7.7706e-02 4.6291e-02 2.4184e-02 1.9891e-02 4.0754e-01 9.6740e-03 3.3635e-03 5.8801e-01 1.2155e-01 9.0538e-02 4.5421e-02 2.0050e-02 1.3860e-02 1.0753e-01 +4.2000e-01 1.4000e+07 5.5315e+02 3.4940e+03 5.5834e-08 3.5574e-01 6.4426e-01 4.1447e+03 3.2153e+03 3.6794e+02 1.3304e+02 4.5853e-05 2.0436e-05 6.3570e-03 1.5798e-03 3.2615e-01 8.7288e-02 7.7465e-02 4.6228e-02 2.4191e-02 1.9928e-02 4.1082e-01 9.6802e-03 3.3655e-03 5.8837e-01 1.2163e-01 9.0586e-02 4.5438e-02 2.0053e-02 1.3857e-02 1.0702e-01 +4.2200e-01 1.3900e+07 5.5315e+02 3.4745e+03 5.6321e-08 3.5620e-01 6.4380e-01 4.1352e+03 3.1923e+03 3.6917e+02 1.3184e+02 4.6030e-05 2.0358e-05 6.3191e-03 1.5648e-03 3.2362e-01 8.6853e-02 7.7220e-02 4.6162e-02 2.4196e-02 1.9964e-02 4.1410e-01 9.6862e-03 3.3674e-03 5.8873e-01 1.2170e-01 9.0634e-02 4.5456e-02 2.0056e-02 1.3855e-02 1.0652e-01 +4.2400e-01 1.3800e+07 5.5315e+02 3.4549e+03 5.6816e-08 3.5661e-01 6.4339e-01 4.1257e+03 3.1693e+03 3.7038e+02 1.3066e+02 4.6206e-05 2.0281e-05 6.2812e-03 1.5498e-03 3.2111e-01 8.6415e-02 7.6972e-02 4.6094e-02 2.4200e-02 1.9998e-02 4.1738e-01 9.6920e-03 3.3691e-03 5.8907e-01 1.2177e-01 9.0682e-02 4.5474e-02 2.0060e-02 1.3853e-02 1.0603e-01 +4.2600e-01 1.3700e+07 5.5315e+02 3.4352e+03 5.7321e-08 3.5698e-01 6.4302e-01 4.1162e+03 3.1463e+03 3.7159e+02 1.2949e+02 4.6381e-05 2.0205e-05 6.2432e-03 1.5350e-03 3.1860e-01 8.5976e-02 7.6721e-02 4.6024e-02 2.4203e-02 2.0031e-02 4.2066e-01 9.6978e-03 3.3708e-03 5.8939e-01 1.2184e-01 9.0729e-02 4.5493e-02 2.0064e-02 1.3852e-02 1.0555e-01 +4.2800e-01 1.3600e+07 5.5315e+02 3.4155e+03 5.7835e-08 3.5731e-01 6.4269e-01 4.1067e+03 3.1233e+03 3.7279e+02 1.2833e+02 4.6554e-05 2.0131e-05 6.2051e-03 1.5202e-03 3.1610e-01 8.5535e-02 7.6467e-02 4.5951e-02 2.4204e-02 2.0064e-02 4.2395e-01 9.7033e-03 3.3724e-03 5.8971e-01 1.2191e-01 9.0777e-02 4.5512e-02 2.0069e-02 1.3851e-02 1.0509e-01 +4.3000e-01 1.3500e+07 5.5315e+02 3.3957e+03 5.8359e-08 3.5761e-01 6.4239e-01 4.0971e+03 3.1003e+03 3.7397e+02 1.2717e+02 4.6727e-05 2.0057e-05 6.1669e-03 1.5056e-03 3.1361e-01 8.5091e-02 7.6209e-02 4.5876e-02 2.4204e-02 2.0095e-02 4.2724e-01 9.7088e-03 3.3739e-03 5.9001e-01 1.2198e-01 9.0825e-02 4.5531e-02 2.0073e-02 1.3850e-02 1.0464e-01 +4.3200e-01 1.3400e+07 5.5315e+02 3.3759e+03 5.8892e-08 3.5786e-01 6.4214e-01 4.0876e+03 3.0773e+03 3.7515e+02 1.2603e+02 4.6899e-05 1.9985e-05 6.1287e-03 1.4910e-03 3.1112e-01 8.4646e-02 7.5949e-02 4.5798e-02 2.4202e-02 2.0125e-02 4.3054e-01 9.7141e-03 3.3753e-03 5.9030e-01 1.2205e-01 9.0872e-02 4.5551e-02 2.0079e-02 1.3850e-02 1.0421e-01 +4.3400e-01 1.3300e+07 5.5315e+02 3.3560e+03 5.9436e-08 3.5808e-01 6.4192e-01 4.0781e+03 3.0543e+03 3.7632e+02 1.2490e+02 4.7069e-05 1.9914e-05 6.0904e-03 1.4765e-03 3.0864e-01 8.4199e-02 7.5685e-02 4.5718e-02 2.4200e-02 2.0154e-02 4.3383e-01 9.7192e-03 3.3766e-03 5.9058e-01 1.2212e-01 9.0920e-02 4.5571e-02 2.0084e-02 1.3851e-02 1.0378e-01 +4.3600e-01 1.3200e+07 5.5315e+02 3.3360e+03 5.9991e-08 3.5826e-01 6.4174e-01 4.0685e+03 3.0313e+03 3.7748e+02 1.2377e+02 4.7239e-05 1.9844e-05 6.0520e-03 1.4621e-03 3.0617e-01 8.3749e-02 7.5418e-02 4.5636e-02 2.4195e-02 2.0182e-02 4.3714e-01 9.7243e-03 3.3778e-03 5.9085e-01 1.2218e-01 9.0967e-02 4.5591e-02 2.0090e-02 1.3851e-02 1.0337e-01 +4.3800e-01 1.3100e+07 5.5315e+02 3.3159e+03 6.0556e-08 3.5841e-01 6.4159e-01 4.0590e+03 3.0083e+03 3.7863e+02 1.2266e+02 4.7408e-05 1.9774e-05 6.0136e-03 1.4477e-03 3.0370e-01 8.3298e-02 7.5147e-02 4.5551e-02 2.4190e-02 2.0209e-02 4.4044e-01 9.7292e-03 3.3790e-03 5.9110e-01 1.2224e-01 9.1014e-02 4.5612e-02 2.0097e-02 1.3852e-02 1.0297e-01 +4.4000e-01 1.3000e+07 5.5315e+02 3.2958e+03 6.1133e-08 3.5852e-01 6.4148e-01 4.0495e+03 2.9853e+03 3.7978e+02 1.2155e+02 4.7576e-05 1.9706e-05 5.9751e-03 1.4335e-03 3.0124e-01 8.2844e-02 7.4873e-02 4.5463e-02 2.4183e-02 2.0235e-02 4.4376e-01 9.7340e-03 3.3801e-03 5.9135e-01 1.2231e-01 9.1061e-02 4.5633e-02 2.0103e-02 1.3854e-02 1.0258e-01 +4.4200e-01 1.2900e+07 5.5315e+02 3.2756e+03 6.1720e-08 3.5860e-01 6.4140e-01 4.0399e+03 2.9623e+03 3.8091e+02 1.2045e+02 4.7742e-05 1.9639e-05 5.9365e-03 1.4193e-03 2.9878e-01 8.2388e-02 7.4596e-02 4.5373e-02 2.4175e-02 2.0260e-02 4.4707e-01 9.7386e-03 3.3811e-03 5.9158e-01 1.2237e-01 9.1107e-02 4.5655e-02 2.0111e-02 1.3856e-02 1.0220e-01 +4.4400e-01 1.2800e+07 5.5315e+02 3.2554e+03 6.2320e-08 3.5865e-01 6.4135e-01 4.0304e+03 2.9393e+03 3.8204e+02 1.1935e+02 4.7908e-05 1.9573e-05 5.8978e-03 1.4052e-03 2.9632e-01 8.1930e-02 7.4316e-02 4.5281e-02 2.4165e-02 2.0284e-02 4.5040e-01 9.7431e-03 3.3820e-03 5.9180e-01 1.2243e-01 9.1154e-02 4.5676e-02 2.0118e-02 1.3858e-02 1.0184e-01 +4.4600e-01 1.2700e+07 5.5315e+02 3.2351e+03 6.2931e-08 3.5867e-01 6.4133e-01 4.0208e+03 2.9163e+03 3.8316e+02 1.1827e+02 4.8073e-05 1.9507e-05 5.8590e-03 1.3912e-03 2.9387e-01 8.1470e-02 7.4032e-02 4.5186e-02 2.4153e-02 2.0306e-02 4.5373e-01 9.7475e-03 3.3829e-03 5.9202e-01 1.2248e-01 9.1201e-02 4.5699e-02 2.0126e-02 1.3861e-02 1.0148e-01 +4.4800e-01 1.2600e+07 5.5315e+02 3.2147e+03 6.3555e-08 3.5865e-01 6.4135e-01 4.0113e+03 2.8934e+03 3.8428e+02 1.1719e+02 4.8238e-05 1.9443e-05 5.8201e-03 1.3773e-03 2.9143e-01 8.1008e-02 7.3744e-02 4.5088e-02 2.4141e-02 2.0327e-02 4.5707e-01 9.7518e-03 3.3837e-03 5.9222e-01 1.2254e-01 9.1247e-02 4.5721e-02 2.0134e-02 1.3864e-02 1.0114e-01 +4.5000e-01 1.2500e+07 5.5315e+02 3.1942e+03 6.4192e-08 3.5860e-01 6.4140e-01 4.0017e+03 2.8704e+03 3.8539e+02 1.1612e+02 4.8401e-05 1.9379e-05 5.7812e-03 1.3634e-03 2.8899e-01 8.0543e-02 7.3454e-02 4.4988e-02 2.4127e-02 2.0347e-02 4.6041e-01 9.7560e-03 3.3844e-03 5.9241e-01 1.2260e-01 9.1293e-02 4.5744e-02 2.0142e-02 1.3868e-02 1.0081e-01 +4.5200e-01 1.2400e+07 5.5315e+02 3.1737e+03 6.4841e-08 3.5852e-01 6.4148e-01 3.9922e+03 2.8474e+03 3.8649e+02 1.1506e+02 4.8564e-05 1.9317e-05 5.7421e-03 1.3496e-03 2.8655e-01 8.0075e-02 7.3159e-02 4.4885e-02 2.4111e-02 2.0366e-02 4.6376e-01 9.7600e-03 3.3850e-03 5.9259e-01 1.2265e-01 9.1339e-02 4.5767e-02 2.0151e-02 1.3871e-02 1.0048e-01 +4.5400e-01 1.2300e+07 5.5315e+02 3.1531e+03 6.5504e-08 3.5841e-01 6.4159e-01 3.9826e+03 2.8244e+03 3.8758e+02 1.1400e+02 4.8725e-05 1.9255e-05 5.7030e-03 1.3359e-03 2.8412e-01 7.9606e-02 7.2861e-02 4.4780e-02 2.4094e-02 2.0384e-02 4.6712e-01 9.7639e-03 3.3856e-03 5.9276e-01 1.2271e-01 9.1385e-02 4.5790e-02 2.0160e-02 1.3876e-02 1.0017e-01 +4.5600e-01 1.2200e+07 5.5315e+02 3.1324e+03 6.6181e-08 3.5827e-01 6.4173e-01 3.9731e+03 2.8014e+03 3.8867e+02 1.1295e+02 4.8886e-05 1.9194e-05 5.6637e-03 1.3222e-03 2.8169e-01 7.9134e-02 7.2560e-02 4.4671e-02 2.4075e-02 2.0400e-02 4.7048e-01 9.7677e-03 3.3861e-03 5.9292e-01 1.2276e-01 9.1430e-02 4.5814e-02 2.0169e-02 1.3880e-02 9.9871e-02 +4.5800e-01 1.2100e+07 5.5315e+02 3.1116e+03 6.6872e-08 3.5810e-01 6.4190e-01 3.9635e+03 2.7784e+03 3.8975e+02 1.1191e+02 4.9046e-05 1.9133e-05 5.6243e-03 1.3086e-03 2.7926e-01 7.8659e-02 7.2254e-02 4.4560e-02 2.4055e-02 2.0416e-02 4.7386e-01 9.7714e-03 3.3865e-03 5.9307e-01 1.2281e-01 9.1475e-02 4.5838e-02 2.0179e-02 1.3885e-02 9.9580e-02 +4.6000e-01 1.2000e+07 5.5315e+02 3.0907e+03 6.7578e-08 3.5790e-01 6.4210e-01 3.9540e+03 2.7554e+03 3.9082e+02 1.1087e+02 4.9206e-05 1.9074e-05 5.5849e-03 1.2951e-03 2.7684e-01 7.8182e-02 7.1946e-02 4.4447e-02 2.4033e-02 2.0429e-02 4.7724e-01 9.7750e-03 3.3869e-03 5.9321e-01 1.2286e-01 9.1520e-02 4.5862e-02 2.0189e-02 1.3891e-02 9.9300e-02 +4.6200e-01 1.1900e+07 5.5315e+02 3.0698e+03 6.8298e-08 3.5768e-01 6.4232e-01 3.9445e+03 2.7324e+03 3.9189e+02 1.0984e+02 4.9364e-05 1.9015e-05 5.5453e-03 1.2816e-03 2.7442e-01 7.7703e-02 7.1633e-02 4.4330e-02 2.4010e-02 2.0442e-02 4.8063e-01 9.7784e-03 3.3872e-03 5.9334e-01 1.2291e-01 9.1565e-02 4.5886e-02 2.0199e-02 1.3896e-02 9.9031e-02 +4.6400e-01 1.1800e+07 5.5315e+02 3.0488e+03 6.9034e-08 3.5742e-01 6.4258e-01 3.9349e+03 2.7094e+03 3.9295e+02 1.0882e+02 4.9522e-05 1.8957e-05 5.5056e-03 1.2682e-03 2.7201e-01 7.7221e-02 7.1317e-02 4.4211e-02 2.3985e-02 2.0453e-02 4.8403e-01 9.7817e-03 3.3874e-03 5.9346e-01 1.2296e-01 9.1610e-02 4.5911e-02 2.0210e-02 1.3902e-02 9.8771e-02 +4.6600e-01 1.1700e+07 5.5315e+02 3.0277e+03 6.9787e-08 3.5713e-01 6.4287e-01 3.9254e+03 2.6864e+03 3.9401e+02 1.0780e+02 4.9679e-05 1.8899e-05 5.4659e-03 1.2548e-03 2.6960e-01 7.6737e-02 7.0997e-02 4.4089e-02 2.3958e-02 2.0463e-02 4.8744e-01 9.7849e-03 3.3876e-03 5.9358e-01 1.2301e-01 9.1654e-02 4.5936e-02 2.0221e-02 1.3909e-02 9.8522e-02 +4.6800e-01 1.1600e+07 5.5315e+02 3.0066e+03 7.0555e-08 3.5681e-01 6.4319e-01 3.9158e+03 2.6634e+03 3.9506e+02 1.0679e+02 4.9835e-05 1.8843e-05 5.4260e-03 1.2416e-03 2.6719e-01 7.6250e-02 7.0673e-02 4.3964e-02 2.3930e-02 2.0472e-02 4.9086e-01 9.7880e-03 3.3877e-03 5.9368e-01 1.2306e-01 9.1698e-02 4.5961e-02 2.0232e-02 1.3916e-02 9.8284e-02 +4.7000e-01 1.1500e+07 5.5315e+02 2.9853e+03 7.1341e-08 3.5647e-01 6.4353e-01 3.9063e+03 2.6405e+03 3.9611e+02 1.0579e+02 4.9991e-05 1.8787e-05 5.3860e-03 1.2283e-03 2.6478e-01 7.5760e-02 7.0345e-02 4.3836e-02 2.3900e-02 2.0479e-02 4.9428e-01 9.7909e-03 3.3877e-03 5.9377e-01 1.2310e-01 9.1742e-02 4.5986e-02 2.0243e-02 1.3923e-02 9.8055e-02 +4.7200e-01 1.1400e+07 5.5315e+02 2.9640e+03 7.2143e-08 3.5609e-01 6.4391e-01 3.8968e+03 2.6175e+03 3.9715e+02 1.0479e+02 5.0146e-05 1.8731e-05 5.3458e-03 1.2152e-03 2.6238e-01 7.5268e-02 7.0014e-02 4.3705e-02 2.3868e-02 2.0485e-02 4.9772e-01 9.7938e-03 3.3877e-03 5.9386e-01 1.2314e-01 9.1785e-02 4.6012e-02 2.0255e-02 1.3930e-02 9.7837e-02 +4.7400e-01 1.1300e+07 5.5315e+02 2.9425e+03 7.2964e-08 3.5568e-01 6.4432e-01 3.8872e+03 2.5945e+03 3.9818e+02 1.0379e+02 5.0300e-05 1.8677e-05 5.3056e-03 1.2020e-03 2.5998e-01 7.4773e-02 6.9679e-02 4.3571e-02 2.3835e-02 2.0490e-02 5.0117e-01 9.7965e-03 3.3876e-03 5.9393e-01 1.2319e-01 9.1828e-02 4.6037e-02 2.0267e-02 1.3938e-02 9.7629e-02 +4.7600e-01 1.1200e+07 5.5315e+02 2.9210e+03 7.3804e-08 3.5525e-01 6.4475e-01 3.8777e+03 2.5715e+03 3.9921e+02 1.0280e+02 5.0454e-05 1.8622e-05 5.2653e-03 1.1890e-03 2.5758e-01 7.4275e-02 6.9339e-02 4.3434e-02 2.3800e-02 2.0493e-02 5.0462e-01 9.7991e-03 3.3875e-03 5.9399e-01 1.2323e-01 9.1871e-02 4.6063e-02 2.0279e-02 1.3946e-02 9.7432e-02 +4.7800e-01 1.1100e+07 5.5315e+02 2.8994e+03 7.4662e-08 3.5479e-01 6.4521e-01 3.8682e+03 2.5485e+03 4.0024e+02 1.0182e+02 5.0607e-05 1.8569e-05 5.2248e-03 1.1760e-03 2.5518e-01 7.3775e-02 6.8996e-02 4.3295e-02 2.3763e-02 2.0495e-02 5.0809e-01 9.8016e-03 3.3873e-03 5.9405e-01 1.2327e-01 9.1914e-02 4.6089e-02 2.0292e-02 1.3955e-02 9.7244e-02 +4.8000e-01 1.1000e+07 5.5315e+02 2.8777e+03 7.5541e-08 3.5429e-01 6.4571e-01 3.8587e+03 2.5254e+03 4.0126e+02 1.0084e+02 5.0759e-05 1.8516e-05 5.1842e-03 1.1631e-03 2.5279e-01 7.3272e-02 6.8649e-02 4.3152e-02 2.3725e-02 2.0495e-02 5.1157e-01 9.8039e-03 3.3870e-03 5.9409e-01 1.2331e-01 9.1956e-02 4.6116e-02 2.0305e-02 1.3963e-02 9.7067e-02 +4.8200e-01 1.0900e+07 5.5315e+02 2.8559e+03 7.6439e-08 3.5377e-01 6.4623e-01 3.8491e+03 2.5024e+03 4.0228e+02 9.9866e+01 5.0911e-05 1.8464e-05 5.1435e-03 1.1502e-03 2.5040e-01 7.2767e-02 6.8298e-02 4.3006e-02 2.3684e-02 2.0493e-02 5.1506e-01 9.8062e-03 3.3867e-03 5.9413e-01 1.2334e-01 9.1998e-02 4.6142e-02 2.0318e-02 1.3973e-02 9.6900e-02 +4.8400e-01 1.0800e+07 5.5315e+02 2.8341e+03 7.7359e-08 3.5322e-01 6.4678e-01 3.8396e+03 2.4794e+03 4.0329e+02 9.8898e+01 5.1061e-05 1.8412e-05 5.1027e-03 1.1373e-03 2.4801e-01 7.2258e-02 6.7942e-02 4.2857e-02 2.3642e-02 2.0491e-02 5.1856e-01 9.8083e-03 3.3863e-03 5.9416e-01 1.2338e-01 9.2039e-02 4.6169e-02 2.0331e-02 1.3982e-02 9.6744e-02 +4.8600e-01 1.0700e+07 5.5315e+02 2.8121e+03 7.8300e-08 3.5264e-01 6.4736e-01 3.8301e+03 2.4564e+03 4.0429e+02 9.7934e+01 5.1212e-05 1.8361e-05 5.0617e-03 1.1245e-03 2.4562e-01 7.1747e-02 6.7583e-02 4.2705e-02 2.3598e-02 2.0486e-02 5.2208e-01 9.8103e-03 3.3859e-03 5.9418e-01 1.2342e-01 9.2080e-02 4.6196e-02 2.0345e-02 1.3992e-02 9.6598e-02 +4.8800e-01 1.0600e+07 5.5315e+02 2.7900e+03 7.9264e-08 3.5203e-01 6.4797e-01 3.8206e+03 2.4334e+03 4.0530e+02 9.6975e+01 5.1361e-05 1.8311e-05 5.0206e-03 1.1118e-03 2.4323e-01 7.1233e-02 6.7220e-02 4.2549e-02 2.3552e-02 2.0480e-02 5.2560e-01 9.8122e-03 3.3854e-03 5.9419e-01 1.2345e-01 9.2121e-02 4.6223e-02 2.0359e-02 1.4002e-02 9.6462e-02 +4.9000e-01 1.0500e+07 5.5315e+02 2.7679e+03 8.0251e-08 3.5138e-01 6.4862e-01 3.8111e+03 2.4104e+03 4.0629e+02 9.6021e+01 5.1510e-05 1.8261e-05 4.9794e-03 1.0991e-03 2.4085e-01 7.0716e-02 6.6852e-02 4.2391e-02 2.3504e-02 2.0472e-02 5.2914e-01 9.8139e-03 3.3848e-03 5.9419e-01 1.2348e-01 9.2161e-02 4.6250e-02 2.0373e-02 1.4012e-02 9.6337e-02 +4.9200e-01 1.0400e+07 5.5315e+02 2.7456e+03 8.1262e-08 3.5071e-01 6.4929e-01 3.8016e+03 2.3874e+03 4.0729e+02 9.5072e+01 5.1658e-05 1.8211e-05 4.9381e-03 1.0865e-03 2.3847e-01 7.0196e-02 6.6480e-02 4.2229e-02 2.3455e-02 2.0463e-02 5.3269e-01 9.8155e-03 3.3842e-03 5.9418e-01 1.2351e-01 9.2201e-02 4.6277e-02 2.0387e-02 1.4023e-02 9.6222e-02 +4.9400e-01 1.0300e+07 5.5315e+02 2.7232e+03 8.2297e-08 3.5000e-01 6.5000e-01 3.7921e+03 2.3644e+03 4.0828e+02 9.4127e+01 5.1806e-05 1.8162e-05 4.8966e-03 1.0739e-03 2.3609e-01 6.9674e-02 6.6104e-02 4.2064e-02 2.3403e-02 2.0452e-02 5.3625e-01 9.8170e-03 3.3835e-03 5.9416e-01 1.2355e-01 9.2240e-02 4.6304e-02 2.0402e-02 1.4034e-02 9.6118e-02 +4.9600e-01 1.0200e+07 5.5315e+02 2.7008e+03 8.3358e-08 3.4927e-01 6.5073e-01 3.7826e+03 2.3414e+03 4.0926e+02 9.3186e+01 5.1953e-05 1.8113e-05 4.8550e-03 1.0614e-03 2.3371e-01 6.9148e-02 6.5723e-02 4.1895e-02 2.3349e-02 2.0440e-02 5.3982e-01 9.8184e-03 3.3828e-03 5.9413e-01 1.2357e-01 9.2278e-02 4.6331e-02 2.0416e-02 1.4046e-02 9.6025e-02 +4.9800e-01 1.0100e+07 5.5315e+02 2.6782e+03 8.4446e-08 3.4850e-01 6.5150e-01 3.7731e+03 2.3183e+03 4.1024e+02 9.2250e+01 5.2100e-05 1.8065e-05 4.8133e-03 1.0489e-03 2.3133e-01 6.8620e-02 6.5339e-02 4.1724e-02 2.3293e-02 2.0425e-02 5.4341e-01 9.8196e-03 3.3820e-03 5.9409e-01 1.2360e-01 9.2317e-02 4.6359e-02 2.0431e-02 1.4057e-02 9.5943e-02 +5.0000e-01 1.0000e+07 5.5315e+02 2.6555e+03 8.5560e-08 3.4770e-01 6.5230e-01 3.7636e+03 2.2953e+03 4.1122e+02 9.1318e+01 5.2245e-05 1.8018e-05 4.7715e-03 1.0365e-03 2.2895e-01 6.8089e-02 6.4950e-02 4.1548e-02 2.3236e-02 2.0409e-02 5.4701e-01 9.8207e-03 3.3811e-03 5.9404e-01 1.2363e-01 9.2354e-02 4.6386e-02 2.0447e-02 1.4070e-02 9.5871e-02 +5.0200e-01 9.9604e+06 5.5315e+02 2.6465e+03 8.6010e-08 3.4737e-01 6.5263e-01 3.7599e+03 2.2862e+03 4.1161e+02 9.0950e+01 5.2303e-05 1.7999e-05 4.7549e-03 1.0315e-03 2.2801e-01 6.7877e-02 6.4794e-02 4.1478e-02 2.3212e-02 2.0402e-02 5.4844e-01 9.8211e-03 3.3807e-03 5.9402e-01 1.2364e-01 9.2369e-02 4.6397e-02 2.0453e-02 1.4074e-02 9.5846e-02 +5.0400e-01 9.9208e+06 5.5315e+02 2.6375e+03 8.6463e-08 3.4704e-01 6.5296e-01 3.7561e+03 2.2771e+03 4.1199e+02 9.0583e+01 5.2360e-05 1.7981e-05 4.7382e-03 1.0266e-03 2.2707e-01 6.7666e-02 6.4639e-02 4.1407e-02 2.3188e-02 2.0395e-02 5.4987e-01 9.8215e-03 3.3804e-03 5.9400e-01 1.2365e-01 9.2384e-02 4.6408e-02 2.0459e-02 1.4079e-02 9.5823e-02 +5.0600e-01 9.8812e+06 5.5315e+02 2.6285e+03 8.6922e-08 3.4670e-01 6.5330e-01 3.7524e+03 2.2680e+03 4.1238e+02 9.0216e+01 5.2418e-05 1.7962e-05 4.7216e-03 1.0217e-03 2.2613e-01 6.7454e-02 6.4482e-02 4.1336e-02 2.3164e-02 2.0388e-02 5.5130e-01 9.8219e-03 3.3800e-03 5.9397e-01 1.2366e-01 9.2398e-02 4.6419e-02 2.0465e-02 1.4084e-02 9.5801e-02 +5.0800e-01 9.8416e+06 5.5315e+02 2.6194e+03 8.7385e-08 3.4636e-01 6.5364e-01 3.7486e+03 2.2589e+03 4.1276e+02 8.9850e+01 5.2475e-05 1.7944e-05 4.7049e-03 1.0169e-03 2.2519e-01 6.7241e-02 6.4325e-02 4.1264e-02 2.3140e-02 2.0380e-02 5.5274e-01 9.8222e-03 3.3796e-03 5.9395e-01 1.2367e-01 9.2413e-02 4.6430e-02 2.0471e-02 1.4089e-02 9.5781e-02 +5.1000e-01 9.8020e+06 5.5315e+02 2.6103e+03 8.7852e-08 3.4601e-01 6.5399e-01 3.7449e+03 2.2497e+03 4.1314e+02 8.9485e+01 5.2532e-05 1.7925e-05 4.6882e-03 1.0120e-03 2.2425e-01 6.7028e-02 6.4166e-02 4.1191e-02 2.3115e-02 2.0372e-02 5.5418e-01 9.8225e-03 3.3792e-03 5.9392e-01 1.2367e-01 9.2427e-02 4.6441e-02 2.0477e-02 1.4094e-02 9.5763e-02 +5.1200e-01 9.7624e+06 5.5315e+02 2.6013e+03 8.8325e-08 3.4566e-01 6.5434e-01 3.7411e+03 2.2406e+03 4.1353e+02 8.9121e+01 5.2589e-05 1.7907e-05 4.6715e-03 1.0071e-03 2.2331e-01 6.6814e-02 6.4008e-02 4.1118e-02 2.3090e-02 2.0363e-02 5.5562e-01 9.8228e-03 3.3788e-03 5.9389e-01 1.2368e-01 9.2442e-02 4.6452e-02 2.0484e-02 1.4099e-02 9.5746e-02 +5.1400e-01 9.7228e+06 5.5315e+02 2.5921e+03 8.8802e-08 3.4530e-01 6.5470e-01 3.7374e+03 2.2315e+03 4.1391e+02 8.8756e+01 5.2646e-05 1.7888e-05 4.6547e-03 1.0022e-03 2.2237e-01 6.6600e-02 6.3848e-02 4.1045e-02 2.3064e-02 2.0355e-02 5.5706e-01 9.8231e-03 3.3784e-03 5.9386e-01 1.2369e-01 9.2456e-02 4.6463e-02 2.0490e-02 1.4105e-02 9.5732e-02 +5.1600e-01 9.6832e+06 5.5315e+02 2.5830e+03 8.9284e-08 3.4494e-01 6.5506e-01 3.7336e+03 2.2224e+03 4.1429e+02 8.8393e+01 5.2703e-05 1.7870e-05 4.6380e-03 9.9736e-04 2.2143e-01 6.6386e-02 6.3688e-02 4.0971e-02 2.3039e-02 2.0346e-02 5.5851e-01 9.8233e-03 3.3780e-03 5.9383e-01 1.2370e-01 9.2470e-02 4.6474e-02 2.0496e-02 1.4110e-02 9.5719e-02 +5.1800e-01 9.6436e+06 5.5315e+02 2.5739e+03 8.9771e-08 3.4457e-01 6.5543e-01 3.7299e+03 2.2133e+03 4.1467e+02 8.8030e+01 5.2760e-05 1.7852e-05 4.6212e-03 9.9251e-04 2.2049e-01 6.6171e-02 6.3527e-02 4.0896e-02 2.3013e-02 2.0337e-02 5.5995e-01 9.8236e-03 3.3776e-03 5.9380e-01 1.2371e-01 9.2484e-02 4.6485e-02 2.0503e-02 1.4115e-02 9.5708e-02 +5.2000e-01 9.6040e+06 5.5315e+02 2.5647e+03 9.0263e-08 3.4420e-01 6.5580e-01 3.7261e+03 2.2041e+03 4.1505e+02 8.7668e+01 5.2817e-05 1.7834e-05 4.6044e-03 9.8766e-04 2.1955e-01 6.5955e-02 6.3366e-02 4.0820e-02 2.2986e-02 2.0327e-02 5.6140e-01 9.8238e-03 3.3771e-03 5.9376e-01 1.2372e-01 9.2498e-02 4.6496e-02 2.0509e-02 1.4120e-02 9.5699e-02 +5.2200e-01 9.5644e+06 5.5315e+02 2.5555e+03 9.0760e-08 3.4382e-01 6.5618e-01 3.7224e+03 2.1950e+03 4.1543e+02 8.7307e+01 5.2873e-05 1.7816e-05 4.5876e-03 9.8282e-04 2.1861e-01 6.5739e-02 6.3203e-02 4.0745e-02 2.2959e-02 2.0317e-02 5.6285e-01 9.8240e-03 3.3767e-03 5.9372e-01 1.2372e-01 9.2512e-02 4.6507e-02 2.0515e-02 1.4126e-02 9.5691e-02 +5.2400e-01 9.5248e+06 5.5315e+02 2.5464e+03 9.1262e-08 3.4343e-01 6.5657e-01 3.7186e+03 2.1859e+03 4.1581e+02 8.6946e+01 5.2930e-05 1.7798e-05 4.5707e-03 9.7798e-04 2.1767e-01 6.5523e-02 6.3041e-02 4.0668e-02 2.2932e-02 2.0307e-02 5.6431e-01 9.8241e-03 3.3762e-03 5.9369e-01 1.2373e-01 9.2525e-02 4.6518e-02 2.0522e-02 1.4131e-02 9.5686e-02 +5.2600e-01 9.4852e+06 5.5315e+02 2.5371e+03 9.1770e-08 3.4304e-01 6.5696e-01 3.7149e+03 2.1768e+03 4.1619e+02 8.6585e+01 5.2986e-05 1.7780e-05 4.5539e-03 9.7315e-04 2.1674e-01 6.5306e-02 6.2877e-02 4.0591e-02 2.2905e-02 2.0297e-02 5.6576e-01 9.8243e-03 3.3758e-03 5.9365e-01 1.2374e-01 9.2539e-02 4.6529e-02 2.0528e-02 1.4137e-02 9.5682e-02 +5.2800e-01 9.4456e+06 5.5315e+02 2.5279e+03 9.2283e-08 3.4264e-01 6.5736e-01 3.7111e+03 2.1677e+03 4.1657e+02 8.6226e+01 5.3042e-05 1.7762e-05 4.5370e-03 9.6833e-04 2.1580e-01 6.5089e-02 6.2712e-02 4.0514e-02 2.2877e-02 2.0286e-02 5.6722e-01 9.8244e-03 3.3753e-03 5.9361e-01 1.2375e-01 9.2553e-02 4.6540e-02 2.0535e-02 1.4142e-02 9.5680e-02 +5.3000e-01 9.4060e+06 5.5315e+02 2.5187e+03 9.2801e-08 3.4224e-01 6.5776e-01 3.7074e+03 2.1586e+03 4.1695e+02 8.5867e+01 5.3099e-05 1.7745e-05 4.5201e-03 9.6352e-04 2.1486e-01 6.4871e-02 6.2547e-02 4.0435e-02 2.2848e-02 2.0275e-02 5.6868e-01 9.8245e-03 3.3748e-03 5.9356e-01 1.2375e-01 9.2566e-02 4.6550e-02 2.0541e-02 1.4148e-02 9.5680e-02 +5.3200e-01 9.3664e+06 5.5315e+02 2.5094e+03 9.3325e-08 3.4183e-01 6.5817e-01 3.7036e+03 2.1494e+03 4.1733e+02 8.5508e+01 5.3155e-05 1.7727e-05 4.5031e-03 9.5871e-04 2.1392e-01 6.4653e-02 6.2381e-02 4.0357e-02 2.2820e-02 2.0264e-02 5.7014e-01 9.8246e-03 3.3743e-03 5.9352e-01 1.2376e-01 9.2579e-02 4.6561e-02 2.0548e-02 1.4153e-02 9.5682e-02 +5.3400e-01 9.3268e+06 5.5315e+02 2.5001e+03 9.3854e-08 3.4142e-01 6.5858e-01 3.6999e+03 2.1403e+03 4.1770e+02 8.5150e+01 5.3211e-05 1.7709e-05 4.4862e-03 9.5391e-04 2.1298e-01 6.4434e-02 6.2215e-02 4.0277e-02 2.2791e-02 2.0252e-02 5.7161e-01 9.8246e-03 3.3738e-03 5.9347e-01 1.2376e-01 9.2592e-02 4.6572e-02 2.0555e-02 1.4159e-02 9.5686e-02 +5.3600e-01 9.2872e+06 5.5315e+02 2.4908e+03 9.4389e-08 3.4100e-01 6.5900e-01 3.6961e+03 2.1312e+03 4.1808e+02 8.4793e+01 5.3267e-05 1.7692e-05 4.4692e-03 9.4912e-04 2.1204e-01 6.4214e-02 6.2047e-02 4.0198e-02 2.2762e-02 2.0240e-02 5.7308e-01 9.8246e-03 3.3733e-03 5.9343e-01 1.2377e-01 9.2605e-02 4.6583e-02 2.0561e-02 1.4164e-02 9.5691e-02 +5.3800e-01 9.2476e+06 5.5315e+02 2.4815e+03 9.4930e-08 3.4057e-01 6.5943e-01 3.6924e+03 2.1221e+03 4.1846e+02 8.4436e+01 5.3323e-05 1.7674e-05 4.4522e-03 9.4433e-04 2.1111e-01 6.3995e-02 6.1879e-02 4.0117e-02 2.2732e-02 2.0228e-02 5.7455e-01 9.8246e-03 3.3728e-03 5.9338e-01 1.2378e-01 9.2618e-02 4.6594e-02 2.0568e-02 1.4170e-02 9.5699e-02 +5.4000e-01 9.2080e+06 5.5315e+02 2.4722e+03 9.5476e-08 3.4014e-01 6.5986e-01 3.6887e+03 2.1130e+03 4.1883e+02 8.4080e+01 5.3378e-05 1.7657e-05 4.4352e-03 9.3955e-04 2.1017e-01 6.3774e-02 6.1711e-02 4.0036e-02 2.2702e-02 2.0215e-02 5.7602e-01 9.8246e-03 3.3722e-03 5.9333e-01 1.2378e-01 9.2631e-02 4.6605e-02 2.0574e-02 1.4176e-02 9.5709e-02 +5.4200e-01 9.1684e+06 5.5315e+02 2.4628e+03 9.6028e-08 3.3970e-01 6.6030e-01 3.6849e+03 2.1038e+03 4.1921e+02 8.3724e+01 5.3434e-05 1.7639e-05 4.4181e-03 9.3478e-04 2.0923e-01 6.3554e-02 6.1541e-02 3.9954e-02 2.2671e-02 2.0202e-02 5.7749e-01 9.8246e-03 3.3717e-03 5.9327e-01 1.2379e-01 9.2644e-02 4.6616e-02 2.0581e-02 1.4182e-02 9.5720e-02 +5.4400e-01 9.1288e+06 5.5315e+02 2.4534e+03 9.6587e-08 3.3926e-01 6.6074e-01 3.6812e+03 2.0947e+03 4.1958e+02 8.3369e+01 5.3489e-05 1.7622e-05 4.4011e-03 9.3001e-04 2.0829e-01 6.3332e-02 6.1371e-02 3.9872e-02 2.2641e-02 2.0189e-02 5.7897e-01 9.8245e-03 3.3711e-03 5.9322e-01 1.2379e-01 9.2656e-02 4.6627e-02 2.0588e-02 1.4188e-02 9.5733e-02 +5.4600e-01 9.0892e+06 5.5315e+02 2.4440e+03 9.7151e-08 3.3881e-01 6.6119e-01 3.6774e+03 2.0856e+03 4.1995e+02 8.3014e+01 5.3545e-05 1.7605e-05 4.3840e-03 9.2525e-04 2.0736e-01 6.3111e-02 6.1200e-02 3.9789e-02 2.2610e-02 2.0175e-02 5.8045e-01 9.8244e-03 3.3706e-03 5.9317e-01 1.2380e-01 9.2669e-02 4.6638e-02 2.0595e-02 1.4194e-02 9.5749e-02 +5.4800e-01 9.0496e+06 5.5315e+02 2.4346e+03 9.7722e-08 3.3835e-01 6.6165e-01 3.6737e+03 2.0765e+03 4.2033e+02 8.2660e+01 5.3600e-05 1.7587e-05 4.3669e-03 9.2050e-04 2.0642e-01 6.2888e-02 6.1028e-02 3.9706e-02 2.2578e-02 2.0161e-02 5.8193e-01 9.8243e-03 3.3700e-03 5.9311e-01 1.2380e-01 9.2681e-02 4.6649e-02 2.0601e-02 1.4200e-02 9.5766e-02 +5.5000e-01 9.0100e+06 5.5315e+02 2.4252e+03 9.8299e-08 3.3789e-01 6.6211e-01 3.6700e+03 2.0674e+03 4.2070e+02 8.2307e+01 5.3656e-05 1.7570e-05 4.3497e-03 9.1575e-04 2.0548e-01 6.2666e-02 6.0856e-02 3.9622e-02 2.2546e-02 2.0147e-02 5.8342e-01 9.8242e-03 3.3694e-03 5.9305e-01 1.2380e-01 9.2693e-02 4.6660e-02 2.0608e-02 1.4206e-02 9.5786e-02 +5.5200e-01 8.9704e+06 5.5315e+02 2.4157e+03 9.8882e-08 3.3742e-01 6.6258e-01 3.6662e+03 2.0582e+03 4.2107e+02 8.1954e+01 5.3711e-05 1.7553e-05 4.3326e-03 9.1101e-04 2.0455e-01 6.2442e-02 6.0683e-02 3.9537e-02 2.2514e-02 2.0132e-02 5.8490e-01 9.8240e-03 3.3688e-03 5.9299e-01 1.2381e-01 9.2705e-02 4.6670e-02 2.0615e-02 1.4212e-02 9.5807e-02 +5.5400e-01 8.9308e+06 5.5315e+02 2.4063e+03 9.9471e-08 3.3695e-01 6.6305e-01 3.6625e+03 2.0491e+03 4.2145e+02 8.1602e+01 5.3766e-05 1.7536e-05 4.3154e-03 9.0627e-04 2.0361e-01 6.2219e-02 6.0509e-02 3.9452e-02 2.2481e-02 2.0117e-02 5.8639e-01 9.8239e-03 3.3682e-03 5.9293e-01 1.2381e-01 9.2717e-02 4.6681e-02 2.0622e-02 1.4218e-02 9.5831e-02 +5.5600e-01 8.8912e+06 5.5315e+02 2.3968e+03 1.0007e-07 3.3646e-01 6.6354e-01 3.6587e+03 2.0400e+03 4.2182e+02 8.1250e+01 5.3821e-05 1.7519e-05 4.2982e-03 9.0155e-04 2.0267e-01 6.1994e-02 6.0334e-02 3.9366e-02 2.2448e-02 2.0102e-02 5.8788e-01 9.8236e-03 3.3676e-03 5.9286e-01 1.2382e-01 9.2729e-02 4.6692e-02 2.0629e-02 1.4224e-02 9.5856e-02 +5.5800e-01 8.8516e+06 5.5315e+02 2.3873e+03 1.0067e-07 3.3598e-01 6.6402e-01 3.6550e+03 2.0309e+03 4.2219e+02 8.0899e+01 5.3876e-05 1.7502e-05 4.2810e-03 8.9682e-04 2.0174e-01 6.1770e-02 6.0158e-02 3.9280e-02 2.2415e-02 2.0086e-02 5.8938e-01 9.8234e-03 3.3670e-03 5.9280e-01 1.2382e-01 9.2741e-02 4.6703e-02 2.0636e-02 1.4230e-02 9.5884e-02 +5.6000e-01 8.8120e+06 5.5315e+02 2.3778e+03 1.0128e-07 3.3548e-01 6.6452e-01 3.6513e+03 2.0218e+03 4.2256e+02 8.0548e+01 5.3930e-05 1.7485e-05 4.2638e-03 8.9211e-04 2.0080e-01 6.1544e-02 5.9982e-02 3.9192e-02 2.2381e-02 2.0070e-02 5.9088e-01 9.8232e-03 3.3663e-03 5.9273e-01 1.2382e-01 9.2752e-02 4.6714e-02 2.0643e-02 1.4236e-02 9.5913e-02 +5.6200e-01 8.7724e+06 5.5315e+02 2.3682e+03 1.0190e-07 3.3498e-01 6.6502e-01 3.6475e+03 2.0126e+03 4.2293e+02 8.0198e+01 5.3985e-05 1.7468e-05 4.2465e-03 8.8740e-04 1.9986e-01 6.1319e-02 5.9805e-02 3.9105e-02 2.2347e-02 2.0053e-02 5.9237e-01 9.8229e-03 3.3657e-03 5.9266e-01 1.2382e-01 9.2763e-02 4.6724e-02 2.0650e-02 1.4243e-02 9.5945e-02 +5.6400e-01 8.7328e+06 5.5315e+02 2.3586e+03 1.0252e-07 3.3447e-01 6.6553e-01 3.6438e+03 2.0035e+03 4.2330e+02 7.9849e+01 5.4040e-05 1.7451e-05 4.2292e-03 8.8270e-04 1.9893e-01 6.1092e-02 5.9627e-02 3.9016e-02 2.2312e-02 2.0037e-02 5.9388e-01 9.8226e-03 3.3651e-03 5.9259e-01 1.2383e-01 9.2775e-02 4.6735e-02 2.0657e-02 1.4249e-02 9.5979e-02 +5.6600e-01 8.6932e+06 5.5315e+02 2.3491e+03 1.0315e-07 3.3396e-01 6.6604e-01 3.6401e+03 1.9944e+03 4.2367e+02 7.9500e+01 5.4094e-05 1.7435e-05 4.2119e-03 8.7800e-04 1.9799e-01 6.0866e-02 5.9449e-02 3.8927e-02 2.2277e-02 2.0020e-02 5.9538e-01 9.8222e-03 3.3644e-03 5.9252e-01 1.2383e-01 9.2786e-02 4.6746e-02 2.0663e-02 1.4255e-02 9.6015e-02 +5.6800e-01 8.6536e+06 5.5315e+02 2.3394e+03 1.0379e-07 3.3344e-01 6.6656e-01 3.6363e+03 1.9853e+03 4.2404e+02 7.9151e+01 5.4149e-05 1.7418e-05 4.1946e-03 8.7331e-04 1.9705e-01 6.0638e-02 5.9270e-02 3.8838e-02 2.2242e-02 2.0002e-02 5.9689e-01 9.8219e-03 3.3637e-03 5.9245e-01 1.2383e-01 9.2797e-02 4.6757e-02 2.0671e-02 1.4262e-02 9.6053e-02 +5.7000e-01 8.6140e+06 5.5315e+02 2.3298e+03 1.0443e-07 3.3291e-01 6.6709e-01 3.6326e+03 1.9761e+03 4.2440e+02 7.8803e+01 5.4203e-05 1.7401e-05 4.1772e-03 8.6863e-04 1.9612e-01 6.0411e-02 5.9089e-02 3.8748e-02 2.2206e-02 1.9984e-02 5.9840e-01 9.8215e-03 3.3630e-03 5.9237e-01 1.2383e-01 9.2807e-02 4.6767e-02 2.0678e-02 1.4268e-02 9.6093e-02 +5.7200e-01 8.5744e+06 5.5315e+02 2.3202e+03 1.0508e-07 3.3237e-01 6.6763e-01 3.6289e+03 1.9670e+03 4.2477e+02 7.8455e+01 5.4257e-05 1.7385e-05 4.1598e-03 8.6395e-04 1.9518e-01 6.0182e-02 5.8909e-02 3.8657e-02 2.2170e-02 1.9966e-02 5.9991e-01 9.8211e-03 3.3624e-03 5.9229e-01 1.2383e-01 9.2818e-02 4.6778e-02 2.0685e-02 1.4275e-02 9.6136e-02 +5.7400e-01 8.5348e+06 5.5315e+02 2.3105e+03 1.0574e-07 3.3183e-01 6.6817e-01 3.6251e+03 1.9579e+03 4.2514e+02 7.8108e+01 5.4311e-05 1.7368e-05 4.1424e-03 8.5928e-04 1.9425e-01 5.9954e-02 5.8727e-02 3.8565e-02 2.2133e-02 1.9947e-02 6.0143e-01 9.8206e-03 3.3616e-03 5.9222e-01 1.2383e-01 9.2828e-02 4.6788e-02 2.0692e-02 1.4281e-02 9.6181e-02 +5.7600e-01 8.4952e+06 5.5315e+02 2.3008e+03 1.0641e-07 3.3128e-01 6.6872e-01 3.6214e+03 1.9488e+03 4.2551e+02 7.7762e+01 5.4365e-05 1.7352e-05 4.1250e-03 8.5461e-04 1.9331e-01 5.9724e-02 5.8545e-02 3.8473e-02 2.2096e-02 1.9928e-02 6.0294e-01 9.8202e-03 3.3609e-03 5.9213e-01 1.2383e-01 9.2839e-02 4.6799e-02 2.0699e-02 1.4288e-02 9.6228e-02 +5.7800e-01 8.4556e+06 5.5315e+02 2.2911e+03 1.0709e-07 3.3072e-01 6.6928e-01 3.6177e+03 1.9397e+03 4.2587e+02 7.7416e+01 5.4419e-05 1.7335e-05 4.1075e-03 8.4995e-04 1.9237e-01 5.9495e-02 5.8362e-02 3.8380e-02 2.2059e-02 1.9909e-02 6.0446e-01 9.8197e-03 3.3602e-03 5.9205e-01 1.2383e-01 9.2849e-02 4.6810e-02 2.0706e-02 1.4294e-02 9.6277e-02 +5.8000e-01 8.4160e+06 5.5315e+02 2.2814e+03 1.0777e-07 3.3016e-01 6.6984e-01 3.6140e+03 1.9305e+03 4.2624e+02 7.7071e+01 5.4473e-05 1.7319e-05 4.0901e-03 8.4530e-04 1.9144e-01 5.9264e-02 5.8178e-02 3.8287e-02 2.2021e-02 1.9889e-02 6.0599e-01 9.8192e-03 3.3595e-03 5.9197e-01 1.2383e-01 9.2859e-02 4.6820e-02 2.0713e-02 1.4301e-02 9.6328e-02 +5.8200e-01 8.3764e+06 5.5315e+02 2.2717e+03 1.0846e-07 3.2959e-01 6.7041e-01 3.6102e+03 1.9214e+03 4.2661e+02 7.6726e+01 5.4527e-05 1.7302e-05 4.0726e-03 8.4065e-04 1.9050e-01 5.9033e-02 5.7993e-02 3.8193e-02 2.1983e-02 1.9869e-02 6.0751e-01 9.8186e-03 3.3587e-03 5.9188e-01 1.2383e-01 9.2869e-02 4.6831e-02 2.0720e-02 1.4308e-02 9.6382e-02 +5.8400e-01 8.3368e+06 5.5315e+02 2.2619e+03 1.0916e-07 3.2901e-01 6.7099e-01 3.6065e+03 1.9123e+03 4.2697e+02 7.6381e+01 5.4580e-05 1.7286e-05 4.0551e-03 8.3601e-04 1.8957e-01 5.8802e-02 5.7807e-02 3.8098e-02 2.1944e-02 1.9849e-02 6.0904e-01 9.8180e-03 3.3580e-03 5.9179e-01 1.2383e-01 9.2878e-02 4.6841e-02 2.0727e-02 1.4314e-02 9.6438e-02 +5.8600e-01 8.2972e+06 5.5315e+02 2.2521e+03 1.0987e-07 3.2842e-01 6.7158e-01 3.6028e+03 1.9032e+03 4.2734e+02 7.6037e+01 5.4634e-05 1.7270e-05 4.0375e-03 8.3138e-04 1.8863e-01 5.8570e-02 5.7621e-02 3.8003e-02 2.1905e-02 1.9828e-02 6.1057e-01 9.8174e-03 3.3572e-03 5.9170e-01 1.2383e-01 9.2888e-02 4.6851e-02 2.0734e-02 1.4321e-02 9.6497e-02 +5.8800e-01 8.2576e+06 5.5315e+02 2.2423e+03 1.1058e-07 3.2783e-01 6.7217e-01 3.5991e+03 1.8941e+03 4.2770e+02 7.5694e+01 5.4687e-05 1.7253e-05 4.0199e-03 8.2675e-04 1.8770e-01 5.8338e-02 5.7434e-02 3.7907e-02 2.1866e-02 1.9807e-02 6.1211e-01 9.8168e-03 3.3564e-03 5.9161e-01 1.2383e-01 9.2897e-02 4.6862e-02 2.0742e-02 1.4328e-02 9.6557e-02 +5.9000e-01 8.2180e+06 5.5315e+02 2.2325e+03 1.1131e-07 3.2722e-01 6.7278e-01 3.5953e+03 1.8849e+03 4.2806e+02 7.5351e+01 5.4741e-05 1.7237e-05 4.0024e-03 8.2213e-04 1.8676e-01 5.8105e-02 5.7246e-02 3.7810e-02 2.1826e-02 1.9785e-02 6.1364e-01 9.8161e-03 3.3557e-03 5.9152e-01 1.2383e-01 9.2906e-02 4.6872e-02 2.0749e-02 1.4335e-02 9.6621e-02 +5.9200e-01 8.1784e+06 5.5315e+02 2.2226e+03 1.1204e-07 3.2661e-01 6.7339e-01 3.5916e+03 1.8758e+03 4.2843e+02 7.5008e+01 5.4794e-05 1.7221e-05 3.9847e-03 8.1751e-04 1.8583e-01 5.7872e-02 5.7057e-02 3.7713e-02 2.1785e-02 1.9763e-02 6.1518e-01 9.8154e-03 3.3549e-03 5.9142e-01 1.2382e-01 9.2915e-02 4.6882e-02 2.0756e-02 1.4342e-02 9.6686e-02 +5.9400e-01 8.1388e+06 5.5315e+02 2.2127e+03 1.1278e-07 3.2600e-01 6.7400e-01 3.5879e+03 1.8667e+03 4.2879e+02 7.4666e+01 5.4847e-05 1.7205e-05 3.9671e-03 8.1290e-04 1.8489e-01 5.7638e-02 5.6868e-02 3.7615e-02 2.1745e-02 1.9740e-02 6.1672e-01 9.8147e-03 3.3541e-03 5.9133e-01 1.2382e-01 9.2924e-02 4.6893e-02 2.0763e-02 1.4349e-02 9.6754e-02 +5.9600e-01 8.0992e+06 5.5315e+02 2.2028e+03 1.1353e-07 3.2537e-01 6.7463e-01 3.5842e+03 1.8576e+03 4.2915e+02 7.4325e+01 5.4900e-05 1.7189e-05 3.9495e-03 8.0829e-04 1.8396e-01 5.7403e-02 5.6678e-02 3.7516e-02 2.1703e-02 1.9718e-02 6.1827e-01 9.8140e-03 3.3532e-03 5.9123e-01 1.2382e-01 9.2932e-02 4.6903e-02 2.0771e-02 1.4356e-02 9.6825e-02 +5.9800e-01 8.0596e+06 5.5315e+02 2.1929e+03 1.1429e-07 3.2474e-01 6.7526e-01 3.5804e+03 1.8484e+03 4.2952e+02 7.3983e+01 5.4953e-05 1.7173e-05 3.9318e-03 8.0370e-04 1.8302e-01 5.7168e-02 5.6486e-02 3.7417e-02 2.1662e-02 1.9694e-02 6.1982e-01 9.8132e-03 3.3524e-03 5.9113e-01 1.2382e-01 9.2940e-02 4.6913e-02 2.0778e-02 1.4363e-02 9.6898e-02 +6.0000e-01 8.0200e+06 5.5315e+02 2.1830e+03 1.1506e-07 3.2409e-01 6.7591e-01 3.5767e+03 1.8393e+03 4.2988e+02 7.3643e+01 5.5006e-05 1.7157e-05 3.9141e-03 7.9910e-04 1.8209e-01 5.6933e-02 5.6295e-02 3.7317e-02 2.1620e-02 1.9671e-02 6.2137e-01 9.8124e-03 3.3516e-03 5.9102e-01 1.2381e-01 9.2948e-02 4.6923e-02 2.0785e-02 1.4370e-02 9.6973e-02 +6.0200e-01 7.9804e+06 5.5315e+02 2.1730e+03 1.1584e-07 3.2344e-01 6.7656e-01 3.5730e+03 1.8302e+03 4.3024e+02 7.3303e+01 5.5059e-05 1.7141e-05 3.8963e-03 7.9452e-04 1.8115e-01 5.6697e-02 5.6102e-02 3.7216e-02 2.1577e-02 1.9646e-02 6.2292e-01 9.8116e-03 3.3507e-03 5.9092e-01 1.2381e-01 9.2956e-02 4.6933e-02 2.0792e-02 1.4377e-02 9.7051e-02 +6.0400e-01 7.9408e+06 5.5315e+02 2.1631e+03 1.1663e-07 3.2278e-01 6.7722e-01 3.5693e+03 1.8211e+03 4.3060e+02 7.2963e+01 5.5111e-05 1.7125e-05 3.8786e-03 7.8993e-04 1.8022e-01 5.6460e-02 5.5908e-02 3.7115e-02 2.1534e-02 1.9622e-02 6.2448e-01 9.8107e-03 3.3498e-03 5.9081e-01 1.2380e-01 9.2964e-02 4.6943e-02 2.0800e-02 1.4384e-02 9.7132e-02 +6.0600e-01 7.9012e+06 5.5315e+02 2.1531e+03 1.1743e-07 3.2212e-01 6.7788e-01 3.5656e+03 1.8120e+03 4.3096e+02 7.2624e+01 5.5164e-05 1.7109e-05 3.8608e-03 7.8536e-04 1.7928e-01 5.6223e-02 5.5714e-02 3.7013e-02 2.1491e-02 1.9597e-02 6.2604e-01 9.8098e-03 3.3490e-03 5.9070e-01 1.2380e-01 9.2972e-02 4.6953e-02 2.0807e-02 1.4391e-02 9.7215e-02 +6.0800e-01 7.8616e+06 5.5315e+02 2.1430e+03 1.1824e-07 3.2144e-01 6.7856e-01 3.5619e+03 1.8028e+03 4.3132e+02 7.2285e+01 5.5216e-05 1.7093e-05 3.8430e-03 7.8079e-04 1.7835e-01 5.5986e-02 5.5519e-02 3.6910e-02 2.1447e-02 1.9572e-02 6.2760e-01 9.8089e-03 3.3481e-03 5.9059e-01 1.2379e-01 9.2979e-02 4.6963e-02 2.0814e-02 1.4399e-02 9.7301e-02 +6.1000e-01 7.8220e+06 5.5315e+02 2.1330e+03 1.1906e-07 3.2076e-01 6.7924e-01 3.5581e+03 1.7937e+03 4.3168e+02 7.1947e+01 5.5268e-05 1.7077e-05 3.8252e-03 7.7622e-04 1.7741e-01 5.5748e-02 5.5323e-02 3.6806e-02 2.1402e-02 1.9546e-02 6.2916e-01 9.8079e-03 3.3472e-03 5.9048e-01 1.2379e-01 9.2986e-02 4.6973e-02 2.0822e-02 1.4406e-02 9.7389e-02 +6.1200e-01 7.7824e+06 5.5315e+02 2.1229e+03 1.1988e-07 3.2006e-01 6.7994e-01 3.5544e+03 1.7846e+03 4.3204e+02 7.1609e+01 5.5321e-05 1.7061e-05 3.8074e-03 7.7167e-04 1.7648e-01 5.5509e-02 5.5126e-02 3.6702e-02 2.1358e-02 1.9520e-02 6.3073e-01 9.8069e-03 3.3463e-03 5.9037e-01 1.2378e-01 9.2993e-02 4.6983e-02 2.0829e-02 1.4413e-02 9.7480e-02 +6.1400e-01 7.7428e+06 5.5315e+02 2.1128e+03 1.2072e-07 3.1936e-01 6.8064e-01 3.5507e+03 1.7755e+03 4.3240e+02 7.1272e+01 5.5373e-05 1.7046e-05 3.7895e-03 7.6711e-04 1.7554e-01 5.5270e-02 5.4928e-02 3.6597e-02 2.1312e-02 1.9493e-02 6.3230e-01 9.8059e-03 3.3453e-03 5.9025e-01 1.2378e-01 9.3000e-02 4.6992e-02 2.0836e-02 1.4421e-02 9.7574e-02 +6.1600e-01 7.7032e+06 5.5315e+02 2.1027e+03 1.2157e-07 3.1865e-01 6.8135e-01 3.5470e+03 1.7664e+03 4.3276e+02 7.0935e+01 5.5425e-05 1.7030e-05 3.7716e-03 7.6257e-04 1.7461e-01 5.5030e-02 5.4730e-02 3.6492e-02 2.1267e-02 1.9466e-02 6.3388e-01 9.8048e-03 3.3444e-03 5.9013e-01 1.2377e-01 9.3006e-02 4.7002e-02 2.0844e-02 1.4428e-02 9.7671e-02 +6.1800e-01 7.6636e+06 5.5315e+02 2.0926e+03 1.2243e-07 3.1793e-01 6.8207e-01 3.5433e+03 1.7572e+03 4.3312e+02 7.0598e+01 5.5477e-05 1.7014e-05 3.7537e-03 7.5802e-04 1.7367e-01 5.4790e-02 5.4531e-02 3.6386e-02 2.1221e-02 1.9438e-02 6.3545e-01 9.8037e-03 3.3435e-03 5.9001e-01 1.2376e-01 9.3012e-02 4.7012e-02 2.0851e-02 1.4435e-02 9.7770e-02 +6.2000e-01 7.6240e+06 5.5315e+02 2.0824e+03 1.2330e-07 3.1719e-01 6.8281e-01 3.5396e+03 1.7481e+03 4.3348e+02 7.0262e+01 5.5529e-05 1.6998e-05 3.7357e-03 7.5349e-04 1.7274e-01 5.4549e-02 5.4330e-02 3.6279e-02 2.1174e-02 1.9410e-02 6.3703e-01 9.8026e-03 3.3425e-03 5.8989e-01 1.2376e-01 9.3018e-02 4.7021e-02 2.0858e-02 1.4443e-02 9.7873e-02 +6.2200e-01 7.5844e+06 5.5315e+02 2.0722e+03 1.2419e-07 3.1645e-01 6.8355e-01 3.5359e+03 1.7390e+03 4.3383e+02 6.9927e+01 5.5580e-05 1.6983e-05 3.7178e-03 7.4896e-04 1.7180e-01 5.4308e-02 5.4129e-02 3.6171e-02 2.1127e-02 1.9382e-02 6.3861e-01 9.8015e-03 3.3415e-03 5.8976e-01 1.2375e-01 9.3024e-02 4.7031e-02 2.0866e-02 1.4450e-02 9.7978e-02 +6.2400e-01 7.5448e+06 5.5315e+02 2.0620e+03 1.2508e-07 3.1570e-01 6.8430e-01 3.5321e+03 1.7299e+03 4.3419e+02 6.9591e+01 5.5632e-05 1.6967e-05 3.6998e-03 7.4443e-04 1.7087e-01 5.4066e-02 5.3928e-02 3.6063e-02 2.1079e-02 1.9353e-02 6.4020e-01 9.8003e-03 3.3406e-03 5.8963e-01 1.2374e-01 9.3029e-02 4.7040e-02 2.0873e-02 1.4458e-02 9.8086e-02 +6.2600e-01 7.5052e+06 5.5315e+02 2.0518e+03 1.2599e-07 3.1494e-01 6.8506e-01 3.5284e+03 1.7208e+03 4.3455e+02 6.9257e+01 5.5684e-05 1.6951e-05 3.6818e-03 7.3992e-04 1.6993e-01 5.3823e-02 5.3725e-02 3.5953e-02 2.1031e-02 1.9324e-02 6.4179e-01 9.7990e-03 3.3396e-03 5.8950e-01 1.2373e-01 9.3035e-02 4.7049e-02 2.0880e-02 1.4465e-02 9.8196e-02 +6.2800e-01 7.4656e+06 5.5315e+02 2.0416e+03 1.2691e-07 3.1417e-01 6.8583e-01 3.5247e+03 1.7116e+03 4.3490e+02 6.8922e+01 5.5735e-05 1.6936e-05 3.6637e-03 7.3540e-04 1.6900e-01 5.3580e-02 5.3521e-02 3.5844e-02 2.0983e-02 1.9294e-02 6.4338e-01 9.7978e-03 3.3386e-03 5.8937e-01 1.2372e-01 9.3040e-02 4.7059e-02 2.0888e-02 1.4473e-02 9.8310e-02 +6.3000e-01 7.4260e+06 5.5315e+02 2.0313e+03 1.2783e-07 3.1339e-01 6.8661e-01 3.5210e+03 1.7025e+03 4.3526e+02 6.8589e+01 5.5786e-05 1.6920e-05 3.6457e-03 7.3089e-04 1.6806e-01 5.3337e-02 5.3317e-02 3.5733e-02 2.0934e-02 1.9263e-02 6.4498e-01 9.7965e-03 3.3375e-03 5.8924e-01 1.2371e-01 9.3044e-02 4.7068e-02 2.0895e-02 1.4481e-02 9.8427e-02 +6.3200e-01 7.3864e+06 5.5315e+02 2.0210e+03 1.2878e-07 3.1260e-01 6.8740e-01 3.5173e+03 1.6934e+03 4.3562e+02 6.8255e+01 5.5838e-05 1.6905e-05 3.6276e-03 7.2639e-04 1.6713e-01 5.3093e-02 5.3112e-02 3.5622e-02 2.0884e-02 1.9233e-02 6.4657e-01 9.7951e-03 3.3365e-03 5.8910e-01 1.2370e-01 9.3049e-02 4.7077e-02 2.0902e-02 1.4488e-02 9.8547e-02 +6.3400e-01 7.3468e+06 5.5315e+02 2.0107e+03 1.2973e-07 3.1180e-01 6.8820e-01 3.5136e+03 1.6843e+03 4.3597e+02 6.7922e+01 5.5889e-05 1.6889e-05 3.6095e-03 7.2190e-04 1.6619e-01 5.2848e-02 5.2906e-02 3.5510e-02 2.0834e-02 1.9201e-02 6.4817e-01 9.7938e-03 3.3355e-03 5.8896e-01 1.2369e-01 9.3053e-02 4.7086e-02 2.0910e-02 1.4496e-02 9.8670e-02 +6.3600e-01 7.3072e+06 5.5315e+02 2.0003e+03 1.3070e-07 3.1099e-01 6.8901e-01 3.5099e+03 1.6752e+03 4.3633e+02 6.7590e+01 5.5940e-05 1.6874e-05 3.5913e-03 7.1740e-04 1.6526e-01 5.2603e-02 5.2699e-02 3.5397e-02 2.0784e-02 1.9170e-02 6.4978e-01 9.7924e-03 3.3344e-03 5.8882e-01 1.2368e-01 9.3057e-02 4.7095e-02 2.0917e-02 1.4504e-02 9.8796e-02 +6.3800e-01 7.2676e+06 5.5315e+02 1.9900e+03 1.3168e-07 3.1017e-01 6.8983e-01 3.5062e+03 1.6660e+03 4.3668e+02 6.7258e+01 5.5991e-05 1.6858e-05 3.5732e-03 7.1292e-04 1.6432e-01 5.2358e-02 5.2491e-02 3.5284e-02 2.0733e-02 1.9138e-02 6.5139e-01 9.7909e-03 3.3333e-03 5.8868e-01 1.2367e-01 9.3061e-02 4.7104e-02 2.0924e-02 1.4512e-02 9.8925e-02 +6.4000e-01 7.2280e+06 5.5315e+02 1.9796e+03 1.3267e-07 3.0934e-01 6.9066e-01 3.5025e+03 1.6569e+03 4.3704e+02 6.6926e+01 5.6041e-05 1.6843e-05 3.5550e-03 7.0844e-04 1.6339e-01 5.2111e-02 5.2282e-02 3.5169e-02 2.0681e-02 1.9105e-02 6.5300e-01 9.7894e-03 3.3322e-03 5.8853e-01 1.2366e-01 9.3064e-02 4.7112e-02 2.0932e-02 1.4519e-02 9.9057e-02 +6.4200e-01 7.1884e+06 5.5315e+02 1.9692e+03 1.3368e-07 3.0849e-01 6.9151e-01 3.4988e+03 1.6478e+03 4.3739e+02 6.6594e+01 5.6092e-05 1.6828e-05 3.5368e-03 7.0396e-04 1.6246e-01 5.1865e-02 5.2073e-02 3.5054e-02 2.0629e-02 1.9072e-02 6.5461e-01 9.7879e-03 3.3311e-03 5.8839e-01 1.2365e-01 9.3067e-02 4.7121e-02 2.0939e-02 1.4527e-02 9.9193e-02 +6.4400e-01 7.1488e+06 5.5315e+02 1.9587e+03 1.3470e-07 3.0764e-01 6.9236e-01 3.4951e+03 1.6387e+03 4.3775e+02 6.6264e+01 5.6143e-05 1.6812e-05 3.5186e-03 6.9950e-04 1.6152e-01 5.1617e-02 5.1863e-02 3.4939e-02 2.0577e-02 1.9038e-02 6.5623e-01 9.7864e-03 3.3300e-03 5.8824e-01 1.2364e-01 9.3070e-02 4.7129e-02 2.0946e-02 1.4535e-02 9.9332e-02 +6.4600e-01 7.1092e+06 5.5315e+02 1.9483e+03 1.3573e-07 3.0677e-01 6.9323e-01 3.4914e+03 1.6296e+03 4.3810e+02 6.5933e+01 5.6193e-05 1.6797e-05 3.5003e-03 6.9503e-04 1.6059e-01 5.1370e-02 5.1651e-02 3.4822e-02 2.0524e-02 1.9004e-02 6.5785e-01 9.7848e-03 3.3289e-03 5.8808e-01 1.2362e-01 9.3072e-02 4.7138e-02 2.0954e-02 1.4543e-02 9.9474e-02 +6.4800e-01 7.0696e+06 5.5315e+02 1.9378e+03 1.3678e-07 3.0590e-01 6.9410e-01 3.4877e+03 1.6204e+03 4.3845e+02 6.5603e+01 5.6244e-05 1.6781e-05 3.4820e-03 6.9057e-04 1.5965e-01 5.1121e-02 5.1439e-02 3.4705e-02 2.0470e-02 1.8969e-02 6.5947e-01 9.7831e-03 3.3278e-03 5.8793e-01 1.2361e-01 9.3075e-02 4.7146e-02 2.0961e-02 1.4551e-02 9.9620e-02 +6.5000e-01 7.0300e+06 5.5315e+02 1.9273e+03 1.3784e-07 3.0501e-01 6.9499e-01 3.4840e+03 1.6113e+03 4.3881e+02 6.5273e+01 5.6294e-05 1.6766e-05 3.4637e-03 6.8612e-04 1.5872e-01 5.0872e-02 5.1226e-02 3.4587e-02 2.0416e-02 1.8934e-02 6.6110e-01 9.7814e-03 3.3266e-03 5.8777e-01 1.2360e-01 9.3077e-02 4.7154e-02 2.0968e-02 1.4559e-02 9.9769e-02 +6.5200e-01 6.9904e+06 5.5315e+02 1.9168e+03 1.3892e-07 3.0410e-01 6.9590e-01 3.4803e+03 1.6022e+03 4.3916e+02 6.4944e+01 5.6344e-05 1.6751e-05 3.4454e-03 6.8167e-04 1.5778e-01 5.0623e-02 5.1012e-02 3.4468e-02 2.0362e-02 1.8899e-02 6.6273e-01 9.7797e-03 3.3254e-03 5.8761e-01 1.2358e-01 9.3078e-02 4.7163e-02 2.0976e-02 1.4567e-02 9.9921e-02 +6.5400e-01 6.9508e+06 5.5315e+02 1.9062e+03 1.4002e-07 3.0319e-01 6.9681e-01 3.4766e+03 1.5931e+03 4.3951e+02 6.4615e+01 5.6394e-05 1.6735e-05 3.4271e-03 6.7723e-04 1.5685e-01 5.0373e-02 5.0798e-02 3.4349e-02 2.0307e-02 1.8862e-02 6.6436e-01 9.7780e-03 3.3243e-03 5.8745e-01 1.2357e-01 9.3079e-02 4.7171e-02 2.0983e-02 1.4575e-02 1.0008e-01 +6.5600e-01 6.9112e+06 5.5315e+02 1.8956e+03 1.4112e-07 3.0226e-01 6.9774e-01 3.4729e+03 1.5840e+03 4.3986e+02 6.4287e+01 5.6444e-05 1.6720e-05 3.4087e-03 6.7279e-04 1.5591e-01 5.0122e-02 5.0582e-02 3.4228e-02 2.0251e-02 1.8826e-02 6.6599e-01 9.7762e-03 3.3231e-03 5.8728e-01 1.2355e-01 9.3080e-02 4.7179e-02 2.0990e-02 1.4583e-02 1.0024e-01 +6.5800e-01 6.8716e+06 5.5315e+02 1.8850e+03 1.4225e-07 3.0133e-01 6.9867e-01 3.4692e+03 1.5749e+03 4.4021e+02 6.3959e+01 5.6494e-05 1.6705e-05 3.3903e-03 6.6836e-04 1.5498e-01 4.9871e-02 5.0366e-02 3.4107e-02 2.0195e-02 1.8788e-02 6.6763e-01 9.7743e-03 3.3218e-03 5.8711e-01 1.2353e-01 9.3081e-02 4.7186e-02 2.0997e-02 1.4591e-02 1.0040e-01 +6.6000e-01 6.8320e+06 5.5315e+02 1.8744e+03 1.4339e-07 3.0037e-01 6.9963e-01 3.4655e+03 1.5657e+03 4.4057e+02 6.3631e+01 5.6544e-05 1.6690e-05 3.3719e-03 6.6393e-04 1.5405e-01 4.9619e-02 5.0148e-02 3.3986e-02 2.0138e-02 1.8751e-02 6.6928e-01 9.7724e-03 3.3206e-03 5.8694e-01 1.2352e-01 9.3081e-02 4.7194e-02 2.1005e-02 1.4599e-02 1.0057e-01 +6.6200e-01 6.7924e+06 5.5315e+02 1.8637e+03 1.4454e-07 2.9941e-01 7.0059e-01 3.4618e+03 1.5566e+03 4.4092e+02 6.3304e+01 5.6593e-05 1.6674e-05 3.3534e-03 6.5951e-04 1.5311e-01 4.9367e-02 4.9930e-02 3.3863e-02 2.0081e-02 1.8712e-02 6.7092e-01 9.7705e-03 3.3194e-03 5.8677e-01 1.2350e-01 9.3081e-02 4.7202e-02 2.1012e-02 1.4607e-02 1.0074e-01 +6.6400e-01 6.7528e+06 5.5315e+02 1.8530e+03 1.4572e-07 2.9843e-01 7.0157e-01 3.4581e+03 1.5475e+03 4.4127e+02 6.2977e+01 5.6643e-05 1.6659e-05 3.3349e-03 6.5510e-04 1.5218e-01 4.9114e-02 4.9711e-02 3.3740e-02 2.0023e-02 1.8674e-02 6.7257e-01 9.7685e-03 3.3181e-03 5.8659e-01 1.2348e-01 9.3081e-02 4.7209e-02 2.1019e-02 1.4615e-02 1.0091e-01 +6.6600e-01 6.7132e+06 5.5315e+02 1.8423e+03 1.4691e-07 2.9744e-01 7.0256e-01 3.4544e+03 1.5384e+03 4.4162e+02 6.2650e+01 5.6692e-05 1.6644e-05 3.3164e-03 6.5069e-04 1.5124e-01 4.8861e-02 4.9490e-02 3.3615e-02 1.9965e-02 1.8634e-02 6.7423e-01 9.7665e-03 3.3168e-03 5.8642e-01 1.2347e-01 9.3080e-02 4.7216e-02 2.1026e-02 1.4623e-02 1.0109e-01 +6.6800e-01 6.6736e+06 5.5315e+02 1.8316e+03 1.4811e-07 2.9644e-01 7.0356e-01 3.4507e+03 1.5293e+03 4.4197e+02 6.2324e+01 5.6742e-05 1.6629e-05 3.2979e-03 6.4628e-04 1.5031e-01 4.8607e-02 4.9269e-02 3.3490e-02 1.9906e-02 1.8594e-02 6.7588e-01 9.7644e-03 3.3156e-03 5.8623e-01 1.2345e-01 9.3079e-02 4.7223e-02 2.1033e-02 1.4632e-02 1.0127e-01 +6.7000e-01 6.6340e+06 5.5315e+02 1.8209e+03 1.4934e-07 2.9542e-01 7.0458e-01 3.4470e+03 1.5202e+03 4.4232e+02 6.1998e+01 5.6791e-05 1.6614e-05 3.2794e-03 6.4188e-04 1.4937e-01 4.8352e-02 4.9048e-02 3.3365e-02 1.9847e-02 1.8554e-02 6.7754e-01 9.7623e-03 3.3142e-03 5.8605e-01 1.2343e-01 9.3078e-02 4.7230e-02 2.1040e-02 1.4640e-02 1.0146e-01 +6.7200e-01 6.5944e+06 5.5315e+02 1.8101e+03 1.5058e-07 2.9439e-01 7.0561e-01 3.4433e+03 1.5111e+03 4.4267e+02 6.1673e+01 5.6840e-05 1.6598e-05 3.2608e-03 6.3749e-04 1.4844e-01 4.8097e-02 4.8825e-02 3.3238e-02 1.9787e-02 1.8513e-02 6.7920e-01 9.7602e-03 3.3129e-03 5.8586e-01 1.2341e-01 9.3076e-02 4.7237e-02 2.1047e-02 1.4648e-02 1.0165e-01 +6.7400e-01 6.5548e+06 5.5315e+02 1.7993e+03 1.5184e-07 2.9334e-01 7.0666e-01 3.4396e+03 1.5019e+03 4.4302e+02 6.1348e+01 5.6889e-05 1.6583e-05 3.2422e-03 6.3310e-04 1.4750e-01 4.7842e-02 4.8601e-02 3.3111e-02 1.9727e-02 1.8471e-02 6.8087e-01 9.7580e-03 3.3116e-03 5.8567e-01 1.2339e-01 9.3073e-02 4.7244e-02 2.1054e-02 1.4656e-02 1.0184e-01 +6.7600e-01 6.5152e+06 5.5315e+02 1.7884e+03 1.5312e-07 2.9228e-01 7.0772e-01 3.4359e+03 1.4928e+03 4.4337e+02 6.1024e+01 5.6938e-05 1.6568e-05 3.2236e-03 6.2871e-04 1.4657e-01 4.7585e-02 4.8376e-02 3.2982e-02 1.9666e-02 1.8429e-02 6.8254e-01 9.7557e-03 3.3102e-03 5.8548e-01 1.2337e-01 9.3071e-02 4.7251e-02 2.1062e-02 1.4664e-02 1.0204e-01 +6.7800e-01 6.4756e+06 5.5315e+02 1.7776e+03 1.5442e-07 2.9120e-01 7.0880e-01 3.4322e+03 1.4837e+03 4.4372e+02 6.0699e+01 5.6986e-05 1.6553e-05 3.2049e-03 6.2433e-04 1.4563e-01 4.7329e-02 4.8151e-02 3.2853e-02 1.9604e-02 1.8386e-02 6.8421e-01 9.7534e-03 3.3089e-03 5.8528e-01 1.2335e-01 9.3068e-02 4.7257e-02 2.1069e-02 1.4673e-02 1.0224e-01 +6.8000e-01 6.4360e+06 5.5315e+02 1.7667e+03 1.5574e-07 2.9011e-01 7.0989e-01 3.4286e+03 1.4746e+03 4.4406e+02 6.0375e+01 5.7035e-05 1.6538e-05 3.1863e-03 6.1996e-04 1.4470e-01 4.7071e-02 4.7924e-02 3.2724e-02 1.9542e-02 1.8343e-02 6.8589e-01 9.7511e-03 3.3075e-03 5.8508e-01 1.2332e-01 9.3064e-02 4.7263e-02 2.1075e-02 1.4681e-02 1.0245e-01 +6.8200e-01 6.3964e+06 5.5315e+02 1.7558e+03 1.5707e-07 2.8900e-01 7.1100e-01 3.4249e+03 1.4655e+03 4.4441e+02 6.0052e+01 5.7084e-05 1.6522e-05 3.1676e-03 6.1559e-04 1.4377e-01 4.6813e-02 4.7697e-02 3.2593e-02 1.9479e-02 1.8299e-02 6.8757e-01 9.7487e-03 3.3061e-03 5.8488e-01 1.2330e-01 9.3061e-02 4.7270e-02 2.1082e-02 1.4689e-02 1.0266e-01 +6.8400e-01 6.3568e+06 5.5315e+02 1.7449e+03 1.5843e-07 2.8788e-01 7.1212e-01 3.4212e+03 1.4564e+03 4.4476e+02 5.9729e+01 5.7132e-05 1.6507e-05 3.1488e-03 6.1123e-04 1.4283e-01 4.6555e-02 4.7469e-02 3.2462e-02 1.9416e-02 1.8255e-02 6.8925e-01 9.7462e-03 3.3046e-03 5.8468e-01 1.2328e-01 9.3056e-02 4.7276e-02 2.1089e-02 1.4698e-02 1.0288e-01 +6.8600e-01 6.3172e+06 5.5315e+02 1.7339e+03 1.5981e-07 2.8674e-01 7.1326e-01 3.4175e+03 1.4473e+03 4.4511e+02 5.9406e+01 5.7180e-05 1.6492e-05 3.1301e-03 6.0687e-04 1.4190e-01 4.6296e-02 4.7239e-02 3.2329e-02 1.9352e-02 1.8210e-02 6.9094e-01 9.7437e-03 3.3032e-03 5.8447e-01 1.2325e-01 9.3052e-02 4.7281e-02 2.1096e-02 1.4706e-02 1.0310e-01 +6.8800e-01 6.2776e+06 5.5315e+02 1.7229e+03 1.6121e-07 2.8559e-01 7.1441e-01 3.4138e+03 1.4382e+03 4.4545e+02 5.9084e+01 5.7228e-05 1.6477e-05 3.1113e-03 6.0251e-04 1.4096e-01 4.6036e-02 4.7009e-02 3.2196e-02 1.9287e-02 1.8164e-02 6.9263e-01 9.7411e-03 3.3017e-03 5.8426e-01 1.2323e-01 9.3046e-02 4.7287e-02 2.1103e-02 1.4714e-02 1.0332e-01 +6.9000e-01 6.2380e+06 5.5315e+02 1.7119e+03 1.6263e-07 2.8441e-01 7.1559e-01 3.4101e+03 1.4290e+03 4.4580e+02 5.8762e+01 5.7277e-05 1.6462e-05 3.0925e-03 5.9816e-04 1.4003e-01 4.5776e-02 4.6778e-02 3.2062e-02 1.9222e-02 1.8118e-02 6.9433e-01 9.7385e-03 3.3003e-03 5.8404e-01 1.2320e-01 9.3041e-02 4.7292e-02 2.1110e-02 1.4723e-02 1.0355e-01 +6.9200e-01 6.1984e+06 5.5315e+02 1.7009e+03 1.6408e-07 2.8323e-01 7.1677e-01 3.4064e+03 1.4199e+03 4.4615e+02 5.8440e+01 5.7324e-05 1.6446e-05 3.0737e-03 5.9382e-04 1.3909e-01 4.5515e-02 4.6546e-02 3.1927e-02 1.9157e-02 1.8071e-02 6.9602e-01 9.7359e-03 3.2988e-03 5.8382e-01 1.2318e-01 9.3035e-02 4.7298e-02 2.1116e-02 1.4731e-02 1.0378e-01 +6.9400e-01 6.1588e+06 5.5315e+02 1.6898e+03 1.6554e-07 2.8202e-01 7.1798e-01 3.4028e+03 1.4108e+03 4.4650e+02 5.8119e+01 5.7372e-05 1.6431e-05 3.0549e-03 5.8948e-04 1.3816e-01 4.5254e-02 4.6313e-02 3.1792e-02 1.9090e-02 1.8024e-02 6.9773e-01 9.7331e-03 3.2973e-03 5.8360e-01 1.2315e-01 9.3028e-02 4.7303e-02 2.1123e-02 1.4739e-02 1.0402e-01 +6.9600e-01 6.1192e+06 5.5315e+02 1.6787e+03 1.6703e-07 2.8080e-01 7.1920e-01 3.3991e+03 1.4017e+03 4.4684e+02 5.7798e+01 5.7420e-05 1.6416e-05 3.0360e-03 5.8515e-04 1.3722e-01 4.4992e-02 4.6079e-02 3.1655e-02 1.9024e-02 1.7976e-02 6.9943e-01 9.7304e-03 3.2957e-03 5.8338e-01 1.2312e-01 9.3021e-02 4.7308e-02 2.1130e-02 1.4748e-02 1.0427e-01 +6.9800e-01 6.0796e+06 5.5315e+02 1.6676e+03 1.6855e-07 2.7955e-01 7.2045e-01 3.3954e+03 1.3926e+03 4.4719e+02 5.7477e+01 5.7468e-05 1.6401e-05 3.0171e-03 5.8082e-04 1.3629e-01 4.4730e-02 4.5844e-02 3.1518e-02 1.8956e-02 1.7927e-02 7.0114e-01 9.7275e-03 3.2942e-03 5.8315e-01 1.2310e-01 9.3014e-02 4.7312e-02 2.1136e-02 1.4756e-02 1.0452e-01 +7.0000e-01 6.0400e+06 5.5315e+02 1.6564e+03 1.7008e-07 2.7830e-01 7.2170e-01 3.3917e+03 1.3835e+03 4.4753e+02 5.7157e+01 5.7515e-05 1.6386e-05 2.9982e-03 5.7649e-04 1.3535e-01 4.4467e-02 4.5609e-02 3.1380e-02 1.8888e-02 1.7878e-02 7.0285e-01 9.7246e-03 3.2926e-03 5.8291e-01 1.2307e-01 9.3006e-02 4.7317e-02 2.1143e-02 1.4765e-02 1.0477e-01 +7.0200e-01 6.0004e+06 5.5315e+02 1.6453e+03 1.7165e-07 2.7702e-01 7.2298e-01 3.3880e+03 1.3744e+03 4.4788e+02 5.6837e+01 5.7562e-05 1.6370e-05 2.9792e-03 5.7218e-04 1.3442e-01 4.4203e-02 4.5372e-02 3.1241e-02 1.8819e-02 1.7828e-02 7.0457e-01 9.7217e-03 3.2910e-03 5.8268e-01 1.2304e-01 9.2998e-02 4.7321e-02 2.1149e-02 1.4773e-02 1.0503e-01 +7.0400e-01 5.9608e+06 5.5315e+02 1.6341e+03 1.7323e-07 2.7572e-01 7.2428e-01 3.3843e+03 1.3653e+03 4.4822e+02 5.6518e+01 5.7610e-05 1.6355e-05 2.9603e-03 5.6786e-04 1.3348e-01 4.3939e-02 4.5134e-02 3.1101e-02 1.8750e-02 1.7777e-02 7.0629e-01 9.7187e-03 3.2894e-03 5.8244e-01 1.2301e-01 9.2989e-02 4.7325e-02 2.1156e-02 1.4781e-02 1.0529e-01 +7.0600e-01 5.9212e+06 5.5315e+02 1.6229e+03 1.7485e-07 2.7440e-01 7.2560e-01 3.3807e+03 1.3562e+03 4.4857e+02 5.6198e+01 5.7657e-05 1.6340e-05 2.9413e-03 5.6355e-04 1.3255e-01 4.3674e-02 4.4895e-02 3.0960e-02 1.8680e-02 1.7726e-02 7.0801e-01 9.7156e-03 3.2878e-03 5.8220e-01 1.2298e-01 9.2979e-02 4.7329e-02 2.1162e-02 1.4790e-02 1.0556e-01 +7.0800e-01 5.8816e+06 5.5315e+02 1.6116e+03 1.7649e-07 2.7307e-01 7.2693e-01 3.3770e+03 1.3471e+03 4.4891e+02 5.5879e+01 5.7704e-05 1.6325e-05 2.9223e-03 5.5925e-04 1.3161e-01 4.3409e-02 4.4656e-02 3.0818e-02 1.8610e-02 1.7674e-02 7.0974e-01 9.7124e-03 3.2861e-03 5.8195e-01 1.2295e-01 9.2969e-02 4.7333e-02 2.1168e-02 1.4798e-02 1.0584e-01 +7.1000e-01 5.8420e+06 5.5315e+02 1.6003e+03 1.7815e-07 2.7171e-01 7.2829e-01 3.3733e+03 1.3380e+03 4.4926e+02 5.5561e+01 5.7750e-05 1.6309e-05 2.9032e-03 5.5495e-04 1.3068e-01 4.3143e-02 4.4415e-02 3.0676e-02 1.8539e-02 1.7622e-02 7.1147e-01 9.7092e-03 3.2844e-03 5.8170e-01 1.2291e-01 9.2959e-02 4.7336e-02 2.1175e-02 1.4807e-02 1.0612e-01 +7.1200e-01 5.8024e+06 5.5315e+02 1.5890e+03 1.7985e-07 2.7033e-01 7.2967e-01 3.3696e+03 1.3289e+03 4.4960e+02 5.5243e+01 5.7797e-05 1.6294e-05 2.8841e-03 5.5066e-04 1.2974e-01 4.2876e-02 4.4174e-02 3.0533e-02 1.8467e-02 1.7569e-02 7.1320e-01 9.7060e-03 3.2827e-03 5.8144e-01 1.2288e-01 9.2947e-02 4.7339e-02 2.1181e-02 1.4815e-02 1.0640e-01 +7.1400e-01 5.7628e+06 5.5315e+02 1.5777e+03 1.8157e-07 2.6893e-01 7.3107e-01 3.3659e+03 1.3198e+03 4.4995e+02 5.4925e+01 5.7844e-05 1.6279e-05 2.8650e-03 5.4637e-04 1.2881e-01 4.2609e-02 4.3931e-02 3.0388e-02 1.8395e-02 1.7515e-02 7.1494e-01 9.7026e-03 3.2810e-03 5.8119e-01 1.2285e-01 9.2936e-02 4.7342e-02 2.1187e-02 1.4823e-02 1.0670e-01 +7.1600e-01 5.7232e+06 5.5315e+02 1.5663e+03 1.8332e-07 2.6752e-01 7.3248e-01 3.3623e+03 1.3107e+03 4.5029e+02 5.4607e+01 5.7890e-05 1.6263e-05 2.8459e-03 5.4208e-04 1.2787e-01 4.2342e-02 4.3688e-02 3.0243e-02 1.8322e-02 1.7460e-02 7.1669e-01 9.6992e-03 3.2793e-03 5.8092e-01 1.2281e-01 9.2923e-02 4.7345e-02 2.1193e-02 1.4832e-02 1.0699e-01 +7.1800e-01 5.6836e+06 5.5315e+02 1.5550e+03 1.8510e-07 2.6607e-01 7.3393e-01 3.3586e+03 1.3016e+03 4.5063e+02 5.4290e+01 5.7937e-05 1.6248e-05 2.8268e-03 5.3780e-04 1.2694e-01 4.2073e-02 4.3443e-02 3.0097e-02 1.8248e-02 1.7405e-02 7.1843e-01 9.6958e-03 3.2775e-03 5.8066e-01 1.2277e-01 9.2911e-02 4.7347e-02 2.1199e-02 1.4840e-02 1.0730e-01 +7.2000e-01 5.6440e+06 5.5315e+02 1.5435e+03 1.8691e-07 2.6461e-01 7.3539e-01 3.3549e+03 1.2924e+03 4.5098e+02 5.3973e+01 5.7983e-05 1.6233e-05 2.8076e-03 5.3353e-04 1.2600e-01 4.1804e-02 4.3198e-02 2.9950e-02 1.8174e-02 1.7349e-02 7.2018e-01 9.6922e-03 3.2757e-03 5.8039e-01 1.2274e-01 9.2897e-02 4.7349e-02 2.1205e-02 1.4849e-02 1.0761e-01 +7.2200e-01 5.6044e+06 5.5315e+02 1.5321e+03 1.8875e-07 2.6312e-01 7.3688e-01 3.3512e+03 1.2833e+03 4.5132e+02 5.3657e+01 5.8029e-05 1.6217e-05 2.7884e-03 5.2926e-04 1.2507e-01 4.1535e-02 4.2951e-02 2.9802e-02 1.8099e-02 1.7293e-02 7.2194e-01 9.6886e-03 3.2739e-03 5.8011e-01 1.2270e-01 9.2883e-02 4.7351e-02 2.1211e-02 1.4857e-02 1.0792e-01 +7.2400e-01 5.5648e+06 5.5315e+02 1.5206e+03 1.9062e-07 2.6161e-01 7.3839e-01 3.3476e+03 1.2742e+03 4.5166e+02 5.3341e+01 5.8075e-05 1.6202e-05 2.7692e-03 5.2500e-04 1.2413e-01 4.1265e-02 4.2704e-02 2.9654e-02 1.8023e-02 1.7236e-02 7.2369e-01 9.6849e-03 3.2721e-03 5.7983e-01 1.2266e-01 9.2868e-02 4.7353e-02 2.1216e-02 1.4865e-02 1.0825e-01 +7.2600e-01 5.5252e+06 5.5315e+02 1.5091e+03 1.9253e-07 2.6008e-01 7.3992e-01 3.3439e+03 1.2651e+03 4.5200e+02 5.3025e+01 5.8121e-05 1.6186e-05 2.7499e-03 5.2074e-04 1.2320e-01 4.0994e-02 4.2455e-02 2.9504e-02 1.7947e-02 1.7178e-02 7.2545e-01 9.6812e-03 3.2702e-03 5.7955e-01 1.2262e-01 9.2853e-02 4.7354e-02 2.1222e-02 1.4874e-02 1.0858e-01 +7.2800e-01 5.4856e+06 5.5315e+02 1.4976e+03 1.9447e-07 2.5852e-01 7.4148e-01 3.3402e+03 1.2560e+03 4.5235e+02 5.2709e+01 5.8166e-05 1.6171e-05 2.7307e-03 5.1648e-04 1.2226e-01 4.0723e-02 4.2206e-02 2.9353e-02 1.7870e-02 1.7119e-02 7.2722e-01 9.6773e-03 3.2683e-03 5.7926e-01 1.2258e-01 9.2837e-02 4.7355e-02 2.1227e-02 1.4882e-02 1.0891e-01 +7.3000e-01 5.4460e+06 5.5315e+02 1.4861e+03 1.9644e-07 2.5694e-01 7.4306e-01 3.3366e+03 1.2469e+03 4.5269e+02 5.2394e+01 5.8212e-05 1.6155e-05 2.7114e-03 5.1223e-04 1.2133e-01 4.0451e-02 4.1956e-02 2.9202e-02 1.7792e-02 1.7060e-02 7.2899e-01 9.6734e-03 3.2664e-03 5.7897e-01 1.2254e-01 9.2820e-02 4.7356e-02 2.1233e-02 1.4890e-02 1.0925e-01 +7.3200e-01 5.4064e+06 5.5315e+02 1.4745e+03 1.9845e-07 2.5533e-01 7.4467e-01 3.3329e+03 1.2378e+03 4.5303e+02 5.2079e+01 5.8258e-05 1.6140e-05 2.6921e-03 5.0798e-04 1.2039e-01 4.0179e-02 4.1704e-02 2.9049e-02 1.7714e-02 1.7000e-02 7.3076e-01 9.6694e-03 3.2645e-03 5.7867e-01 1.2250e-01 9.2803e-02 4.7356e-02 2.1238e-02 1.4898e-02 1.0960e-01 +7.3400e-01 5.3668e+06 5.5315e+02 1.4629e+03 2.0049e-07 2.5369e-01 7.4631e-01 3.3292e+03 1.2288e+03 4.5337e+02 5.1765e+01 5.8303e-05 1.6124e-05 2.6727e-03 5.0374e-04 1.1946e-01 3.9906e-02 4.1452e-02 2.8896e-02 1.7635e-02 1.6939e-02 7.3254e-01 9.6654e-03 3.2625e-03 5.7837e-01 1.2245e-01 9.2784e-02 4.7357e-02 2.1243e-02 1.4907e-02 1.0996e-01 +7.3600e-01 5.3272e+06 5.5315e+02 1.4513e+03 2.0257e-07 2.5203e-01 7.4797e-01 3.3255e+03 1.2197e+03 4.5371e+02 5.1451e+01 5.8348e-05 1.6108e-05 2.6533e-03 4.9951e-04 1.1852e-01 3.9632e-02 4.1198e-02 2.8742e-02 1.7555e-02 1.6877e-02 7.3432e-01 9.6612e-03 3.2605e-03 5.7806e-01 1.2241e-01 9.2766e-02 4.7356e-02 2.1248e-02 1.4915e-02 1.1032e-01 +7.3800e-01 5.2876e+06 5.5315e+02 1.4396e+03 2.0469e-07 2.5034e-01 7.4966e-01 3.3219e+03 1.2106e+03 4.5406e+02 5.1137e+01 5.8393e-05 1.6093e-05 2.6339e-03 4.9528e-04 1.1758e-01 3.9358e-02 4.0944e-02 2.8587e-02 1.7475e-02 1.6815e-02 7.3611e-01 9.6570e-03 3.2585e-03 5.7775e-01 1.2237e-01 9.2746e-02 4.7356e-02 2.1253e-02 1.4923e-02 1.1069e-01 +7.4000e-01 5.2480e+06 5.5315e+02 1.4279e+03 2.0685e-07 2.4862e-01 7.5138e-01 3.3182e+03 1.2015e+03 4.5440e+02 5.0823e+01 5.8438e-05 1.6077e-05 2.6145e-03 4.9105e-04 1.1665e-01 3.9083e-02 4.0689e-02 2.8430e-02 1.7394e-02 1.6752e-02 7.3790e-01 9.6527e-03 3.2564e-03 5.7743e-01 1.2232e-01 9.2726e-02 4.7355e-02 2.1258e-02 1.4931e-02 1.1107e-01 +7.4200e-01 5.2084e+06 5.5315e+02 1.4162e+03 2.0904e-07 2.4688e-01 7.5312e-01 3.3145e+03 1.1924e+03 4.5474e+02 5.0510e+01 5.8483e-05 1.6061e-05 2.5951e-03 4.8683e-04 1.1571e-01 3.8808e-02 4.0432e-02 2.8273e-02 1.7312e-02 1.6688e-02 7.3969e-01 9.6483e-03 3.2544e-03 5.7711e-01 1.2227e-01 9.2704e-02 4.7354e-02 2.1263e-02 1.4939e-02 1.1146e-01 +7.4400e-01 5.1688e+06 5.5315e+02 1.4045e+03 2.1128e-07 2.4510e-01 7.5490e-01 3.3109e+03 1.1833e+03 4.5508e+02 5.0197e+01 5.8527e-05 1.6045e-05 2.5756e-03 4.8261e-04 1.1478e-01 3.8532e-02 4.0175e-02 2.8115e-02 1.7230e-02 1.6624e-02 7.4149e-01 9.6438e-03 3.2523e-03 5.7678e-01 1.2222e-01 9.2683e-02 4.7352e-02 2.1268e-02 1.4947e-02 1.1185e-01 +7.4600e-01 5.1292e+06 5.5315e+02 1.3927e+03 2.1356e-07 2.4330e-01 7.5670e-01 3.3072e+03 1.1742e+03 4.5542e+02 4.9884e+01 5.8572e-05 1.6030e-05 2.5561e-03 4.7840e-04 1.1384e-01 3.8255e-02 3.9916e-02 2.7956e-02 1.7147e-02 1.6558e-02 7.4329e-01 9.6392e-03 3.2501e-03 5.7645e-01 1.2217e-01 9.2660e-02 4.7350e-02 2.1272e-02 1.4955e-02 1.1225e-01 +7.4800e-01 5.0896e+06 5.5315e+02 1.3809e+03 2.1588e-07 2.4146e-01 7.5854e-01 3.3035e+03 1.1651e+03 4.5576e+02 4.9572e+01 5.8616e-05 1.6014e-05 2.5366e-03 4.7419e-04 1.1291e-01 3.7978e-02 3.9657e-02 2.7796e-02 1.7063e-02 1.6492e-02 7.4510e-01 9.6345e-03 3.2480e-03 5.7611e-01 1.2212e-01 9.2636e-02 4.7348e-02 2.1277e-02 1.4963e-02 1.1266e-01 +7.5000e-01 5.0500e+06 5.5315e+02 1.3691e+03 2.1824e-07 2.3959e-01 7.6041e-01 3.2999e+03 1.1560e+03 4.5610e+02 4.9260e+01 5.8661e-05 1.5998e-05 2.5170e-03 4.6999e-04 1.1197e-01 3.7700e-02 3.9396e-02 2.7635e-02 1.6978e-02 1.6426e-02 7.4691e-01 9.6298e-03 3.2458e-03 5.7576e-01 1.2207e-01 9.2612e-02 4.7345e-02 2.1281e-02 1.4971e-02 1.1308e-01 +7.5200e-01 5.0104e+06 5.5315e+02 1.3573e+03 2.2065e-07 2.3769e-01 7.6231e-01 3.2962e+03 1.1469e+03 4.5644e+02 4.8948e+01 5.8705e-05 1.5982e-05 2.4974e-03 4.6579e-04 1.1103e-01 3.7422e-02 3.9135e-02 2.7474e-02 1.6893e-02 1.6358e-02 7.4872e-01 9.6249e-03 3.2435e-03 5.7541e-01 1.2202e-01 9.2586e-02 4.7342e-02 2.1285e-02 1.4979e-02 1.1351e-01 +7.5400e-01 4.9708e+06 5.5315e+02 1.3454e+03 2.2310e-07 2.3576e-01 7.6424e-01 3.2926e+03 1.1378e+03 4.5678e+02 4.8637e+01 5.8749e-05 1.5966e-05 2.4778e-03 4.6160e-04 1.1010e-01 3.7143e-02 3.8872e-02 2.7311e-02 1.6807e-02 1.6290e-02 7.5054e-01 9.6199e-03 3.2413e-03 5.7506e-01 1.2196e-01 9.2560e-02 4.7338e-02 2.1289e-02 1.4987e-02 1.1394e-01 +7.5600e-01 4.9312e+06 5.5315e+02 1.3335e+03 2.2561e-07 2.3379e-01 7.6621e-01 3.2889e+03 1.1287e+03 4.5712e+02 4.8326e+01 5.8792e-05 1.5949e-05 2.4582e-03 4.5741e-04 1.0916e-01 3.6864e-02 3.8609e-02 2.7147e-02 1.6720e-02 1.6220e-02 7.5236e-01 9.6149e-03 3.2390e-03 5.7470e-01 1.2191e-01 9.2533e-02 4.7334e-02 2.1293e-02 1.4995e-02 1.1439e-01 +7.5800e-01 4.8916e+06 5.5315e+02 1.3216e+03 2.2816e-07 2.3179e-01 7.6821e-01 3.2852e+03 1.1196e+03 4.5746e+02 4.8015e+01 5.8836e-05 1.5933e-05 2.4386e-03 4.5323e-04 1.0823e-01 3.6583e-02 3.8344e-02 2.6982e-02 1.6633e-02 1.6150e-02 7.5419e-01 9.6097e-03 3.2367e-03 5.7433e-01 1.2185e-01 9.2505e-02 4.7330e-02 2.1297e-02 1.5002e-02 1.1484e-01 +7.6000e-01 4.8520e+06 5.5315e+02 1.3096e+03 2.3076e-07 2.2976e-01 7.7024e-01 3.2816e+03 1.1106e+03 4.5780e+02 4.7704e+01 5.8880e-05 1.5917e-05 2.4189e-03 4.4905e-04 1.0729e-01 3.6303e-02 3.8078e-02 2.6816e-02 1.6545e-02 1.6080e-02 7.5602e-01 9.6045e-03 3.2343e-03 5.7396e-01 1.2179e-01 9.2476e-02 4.7325e-02 2.1300e-02 1.5010e-02 1.1530e-01 +7.6200e-01 4.8124e+06 5.5315e+02 1.2976e+03 2.3341e-07 2.2768e-01 7.7232e-01 3.2779e+03 1.1015e+03 4.5813e+02 4.7394e+01 5.8923e-05 1.5901e-05 2.3992e-03 4.4487e-04 1.0636e-01 3.6021e-02 3.7812e-02 2.6650e-02 1.6456e-02 1.6008e-02 7.5785e-01 9.5991e-03 3.2319e-03 5.7358e-01 1.2173e-01 9.2446e-02 4.7320e-02 2.1303e-02 1.5018e-02 1.1577e-01 +7.6400e-01 4.7728e+06 5.5315e+02 1.2856e+03 2.3611e-07 2.2557e-01 7.7443e-01 3.2742e+03 1.0924e+03 4.5847e+02 4.7084e+01 5.8966e-05 1.5884e-05 2.3795e-03 4.4070e-04 1.0542e-01 3.5739e-02 3.7544e-02 2.6482e-02 1.6366e-02 1.5935e-02 7.5969e-01 9.5936e-03 3.2295e-03 5.7319e-01 1.2167e-01 9.2415e-02 4.7314e-02 2.1307e-02 1.5025e-02 1.1626e-01 +7.6600e-01 4.7332e+06 5.5315e+02 1.2736e+03 2.3887e-07 2.2342e-01 7.7658e-01 3.2706e+03 1.0833e+03 4.5881e+02 4.6774e+01 5.9009e-05 1.5868e-05 2.3597e-03 4.3654e-04 1.0448e-01 3.5457e-02 3.7275e-02 2.6313e-02 1.6275e-02 1.5862e-02 7.6154e-01 9.5880e-03 3.2270e-03 5.7280e-01 1.2161e-01 9.2383e-02 4.7308e-02 2.1310e-02 1.5033e-02 1.1675e-01 +7.6800e-01 4.6936e+06 5.5315e+02 1.2615e+03 2.4169e-07 2.2123e-01 7.7877e-01 3.2669e+03 1.0742e+03 4.5915e+02 4.6465e+01 5.9052e-05 1.5851e-05 2.3399e-03 4.3238e-04 1.0355e-01 3.5173e-02 3.7005e-02 2.6143e-02 1.6184e-02 1.5788e-02 7.6339e-01 9.5823e-03 3.2245e-03 5.7240e-01 1.2154e-01 9.2350e-02 4.7301e-02 2.1312e-02 1.5040e-02 1.1725e-01 +7.7000e-01 4.6540e+06 5.5315e+02 1.2494e+03 2.4456e-07 2.1900e-01 7.8100e-01 3.2633e+03 1.0651e+03 4.5949e+02 4.6156e+01 5.9095e-05 1.5835e-05 2.3201e-03 4.2822e-04 1.0261e-01 3.4890e-02 3.6735e-02 2.5973e-02 1.6092e-02 1.5713e-02 7.6524e-01 9.5765e-03 3.2219e-03 5.7199e-01 1.2148e-01 9.2316e-02 4.7294e-02 2.1315e-02 1.5047e-02 1.1776e-01 +7.7200e-01 4.6144e+06 5.5315e+02 1.2373e+03 2.4749e-07 2.1673e-01 7.8327e-01 3.2596e+03 1.0560e+03 4.5983e+02 4.5847e+01 5.9138e-05 1.5818e-05 2.3003e-03 4.2407e-04 1.0168e-01 3.4605e-02 3.6463e-02 2.5801e-02 1.6000e-02 1.5637e-02 7.6710e-01 9.5705e-03 3.2194e-03 5.7157e-01 1.2141e-01 9.2280e-02 4.7286e-02 2.1317e-02 1.5054e-02 1.1829e-01 +7.7400e-01 4.5748e+06 5.5315e+02 1.2252e+03 2.5048e-07 2.1442e-01 7.8558e-01 3.2560e+03 1.0470e+03 4.6016e+02 4.5539e+01 5.9180e-05 1.5801e-05 2.2804e-03 4.1992e-04 1.0074e-01 3.4320e-02 3.6190e-02 2.5628e-02 1.5906e-02 1.5560e-02 7.6896e-01 9.5644e-03 3.2167e-03 5.7115e-01 1.2134e-01 9.2244e-02 4.7278e-02 2.1319e-02 1.5061e-02 1.1882e-01 +7.7600e-01 4.5352e+06 5.5315e+02 1.2130e+03 2.5354e-07 2.1206e-01 7.8794e-01 3.2523e+03 1.0379e+03 4.6050e+02 4.5230e+01 5.9223e-05 1.5784e-05 2.2606e-03 4.1578e-04 9.9803e-02 3.4035e-02 3.5915e-02 2.5454e-02 1.5812e-02 1.5483e-02 7.7082e-01 9.5583e-03 3.2141e-03 5.7072e-01 1.2127e-01 9.2206e-02 4.7269e-02 2.1321e-02 1.5068e-02 1.1937e-01 +7.7800e-01 4.4956e+06 5.5315e+02 1.2008e+03 2.5666e-07 2.0966e-01 7.9034e-01 3.2486e+03 1.0288e+03 4.6084e+02 4.4923e+01 5.9265e-05 1.5767e-05 2.2407e-03 4.1164e-04 9.8866e-02 3.3748e-02 3.5640e-02 2.5279e-02 1.5717e-02 1.5404e-02 7.7269e-01 9.5519e-03 3.2113e-03 5.7029e-01 1.2120e-01 9.2167e-02 4.7259e-02 2.1323e-02 1.5075e-02 1.1992e-01 +7.8000e-01 4.4560e+06 5.5315e+02 1.1886e+03 2.5984e-07 2.0720e-01 7.9280e-01 3.2450e+03 1.0197e+03 4.6118e+02 4.4615e+01 5.9307e-05 1.5750e-05 2.2207e-03 4.0751e-04 9.7930e-02 3.3461e-02 3.5364e-02 2.5103e-02 1.5621e-02 1.5325e-02 7.7457e-01 9.5455e-03 3.2086e-03 5.6984e-01 1.2113e-01 9.2127e-02 4.7249e-02 2.1325e-02 1.5082e-02 1.2049e-01 +7.8200e-01 4.4164e+06 5.5315e+02 1.1764e+03 2.6309e-07 2.0471e-01 7.9529e-01 3.2413e+03 1.0106e+03 4.6151e+02 4.4308e+01 5.9349e-05 1.5733e-05 2.2008e-03 4.0338e-04 9.6993e-02 3.3174e-02 3.5087e-02 2.4927e-02 1.5524e-02 1.5245e-02 7.7645e-01 9.5389e-03 3.2058e-03 5.6939e-01 1.2105e-01 9.2086e-02 4.7238e-02 2.1326e-02 1.5089e-02 1.2107e-01 +7.8400e-01 4.3768e+06 5.5315e+02 1.1641e+03 2.6642e-07 2.0216e-01 7.9784e-01 3.2377e+03 1.0016e+03 4.6185e+02 4.4001e+01 5.9390e-05 1.5716e-05 2.1808e-03 3.9926e-04 9.6057e-02 3.2886e-02 3.4808e-02 2.4749e-02 1.5427e-02 1.5163e-02 7.7833e-01 9.5321e-03 3.2029e-03 5.6893e-01 1.2098e-01 9.2043e-02 4.7227e-02 2.1327e-02 1.5095e-02 1.2167e-01 +7.8600e-01 4.3372e+06 5.5315e+02 1.1518e+03 2.6981e-07 1.9956e-01 8.0044e-01 3.2340e+03 9.9249e+02 4.6219e+02 4.3694e+01 5.9432e-05 1.5699e-05 2.1608e-03 3.9514e-04 9.5120e-02 3.2597e-02 3.4529e-02 2.4570e-02 1.5328e-02 1.5081e-02 7.8022e-01 9.5253e-03 3.2001e-03 5.6846e-01 1.2090e-01 9.1999e-02 4.7215e-02 2.1328e-02 1.5101e-02 1.2227e-01 +7.8800e-01 4.2976e+06 5.5315e+02 1.1395e+03 2.7328e-07 1.9691e-01 8.0309e-01 3.2304e+03 9.8342e+02 4.6252e+02 4.3387e+01 5.9473e-05 1.5681e-05 2.1407e-03 3.9102e-04 9.4184e-02 3.2308e-02 3.4249e-02 2.4390e-02 1.5229e-02 1.4998e-02 7.8211e-01 9.5182e-03 3.1971e-03 5.6798e-01 1.2082e-01 9.1954e-02 4.7203e-02 2.1328e-02 1.5108e-02 1.2289e-01 +7.9000e-01 4.2580e+06 5.5315e+02 1.1271e+03 2.7683e-07 1.9421e-01 8.0579e-01 3.2267e+03 9.7435e+02 4.6286e+02 4.3081e+01 5.9515e-05 1.5663e-05 2.1207e-03 3.8691e-04 9.3247e-02 3.2018e-02 3.3967e-02 2.4208e-02 1.5129e-02 1.4914e-02 7.8401e-01 9.5111e-03 3.1941e-03 5.6750e-01 1.2074e-01 9.1907e-02 4.7189e-02 2.1329e-02 1.5114e-02 1.2353e-01 +7.9200e-01 4.2184e+06 5.5315e+02 1.1148e+03 2.8045e-07 1.9145e-01 8.0855e-01 3.2231e+03 9.6527e+02 4.6319e+02 4.2775e+01 5.9556e-05 1.5646e-05 2.1006e-03 3.8281e-04 9.2311e-02 3.1727e-02 3.3684e-02 2.4026e-02 1.5029e-02 1.4829e-02 7.8591e-01 9.5037e-03 3.1911e-03 5.6700e-01 1.2065e-01 9.1858e-02 4.7175e-02 2.1329e-02 1.5120e-02 1.2417e-01 +7.9400e-01 4.1788e+06 5.5315e+02 1.1024e+03 2.8416e-07 1.8863e-01 8.1137e-01 3.2194e+03 9.5620e+02 4.6353e+02 4.2469e+01 5.9597e-05 1.5628e-05 2.0805e-03 3.7870e-04 9.1374e-02 3.1436e-02 3.3400e-02 2.3843e-02 1.4927e-02 1.4744e-02 7.8782e-01 9.4962e-03 3.1880e-03 5.6649e-01 1.2056e-01 9.1809e-02 4.7160e-02 2.1328e-02 1.5126e-02 1.2483e-01 +7.9600e-01 4.1392e+06 5.5315e+02 1.0900e+03 2.8795e-07 1.8576e-01 8.1424e-01 3.2158e+03 9.4713e+02 4.6387e+02 4.2164e+01 5.9637e-05 1.5610e-05 2.0603e-03 3.7461e-04 9.0437e-02 3.1144e-02 3.3116e-02 2.3659e-02 1.4825e-02 1.4657e-02 7.8973e-01 9.4886e-03 3.1848e-03 5.6598e-01 1.2048e-01 9.1757e-02 4.7145e-02 2.1328e-02 1.5131e-02 1.2551e-01 +7.9800e-01 4.0996e+06 5.5315e+02 1.0775e+03 2.9183e-07 1.8282e-01 8.1718e-01 3.2121e+03 9.3806e+02 4.6420e+02 4.1859e+01 5.9678e-05 1.5592e-05 2.0402e-03 3.7051e-04 8.9501e-02 3.0852e-02 3.2830e-02 2.3473e-02 1.4722e-02 1.4569e-02 7.9164e-01 9.4808e-03 3.1816e-03 5.6545e-01 1.2039e-01 9.1704e-02 4.7129e-02 2.1327e-02 1.5137e-02 1.2620e-01 +8.0000e-01 4.0600e+06 5.5315e+02 1.0651e+03 2.9580e-07 1.7982e-01 8.2018e-01 3.2085e+03 9.2899e+02 4.6454e+02 4.1554e+01 5.9718e-05 1.5574e-05 2.0200e-03 3.6643e-04 8.8564e-02 3.0559e-02 3.2542e-02 2.3287e-02 1.4618e-02 1.4480e-02 7.9356e-01 9.4728e-03 3.1784e-03 5.6492e-01 1.2029e-01 9.1650e-02 4.7111e-02 2.1326e-02 1.5142e-02 1.2691e-01 +8.0200e-01 4.0204e+06 5.5315e+02 1.0526e+03 2.9987e-07 1.7676e-01 8.2324e-01 3.2048e+03 9.1993e+02 4.6487e+02 4.1249e+01 5.9759e-05 1.5556e-05 1.9998e-03 3.6234e-04 8.7627e-02 3.0265e-02 3.2254e-02 2.3099e-02 1.4513e-02 1.4391e-02 7.9549e-01 9.4646e-03 3.1751e-03 5.6437e-01 1.2020e-01 9.1593e-02 4.7093e-02 2.1324e-02 1.5147e-02 1.2763e-01 +8.0400e-01 3.9808e+06 5.5315e+02 1.0401e+03 3.0402e-07 1.7363e-01 8.2637e-01 3.2012e+03 9.1086e+02 4.6521e+02 4.0945e+01 5.9799e-05 1.5537e-05 1.9795e-03 3.5826e-04 8.6690e-02 2.9971e-02 3.1965e-02 2.2911e-02 1.4407e-02 1.4300e-02 7.9742e-01 9.4563e-03 3.1717e-03 5.6382e-01 1.2010e-01 9.1535e-02 4.7075e-02 2.1322e-02 1.5152e-02 1.2837e-01 +8.0600e-01 3.9412e+06 5.5315e+02 1.0275e+03 3.0828e-07 1.7043e-01 8.2957e-01 3.1975e+03 9.0180e+02 4.6554e+02 4.0641e+01 5.9839e-05 1.5518e-05 1.9593e-03 3.5419e-04 8.5753e-02 2.9676e-02 3.1675e-02 2.2721e-02 1.4300e-02 1.4208e-02 7.9935e-01 9.4477e-03 3.1683e-03 5.6325e-01 1.2000e-01 9.1476e-02 4.7055e-02 2.1320e-02 1.5157e-02 1.2913e-01 +8.0800e-01 3.9016e+06 5.5315e+02 1.0150e+03 3.1264e-07 1.6717e-01 8.3283e-01 3.1939e+03 8.9273e+02 4.6588e+02 4.0337e+01 5.9879e-05 1.5500e-05 1.9390e-03 3.5012e-04 8.4816e-02 2.9380e-02 3.1383e-02 2.2530e-02 1.4193e-02 1.4115e-02 8.0129e-01 9.4390e-03 3.1648e-03 5.6267e-01 1.1990e-01 9.1414e-02 4.7034e-02 2.1317e-02 1.5161e-02 1.2990e-01 +8.1000e-01 3.8620e+06 5.5315e+02 1.0024e+03 3.1711e-07 1.6382e-01 8.3618e-01 3.1902e+03 8.8367e+02 4.6621e+02 4.0033e+01 5.9918e-05 1.5481e-05 1.9187e-03 3.4605e-04 8.3879e-02 2.9084e-02 3.1090e-02 2.2338e-02 1.4084e-02 1.4022e-02 8.0324e-01 9.4301e-03 3.1612e-03 5.6208e-01 1.1979e-01 9.1350e-02 4.7013e-02 2.1314e-02 1.5165e-02 1.3069e-01 +8.1200e-01 3.8224e+06 5.5315e+02 9.8980e+02 3.2168e-07 1.6041e-01 8.3959e-01 3.1866e+03 8.7461e+02 4.6655e+02 3.9730e+01 5.9958e-05 1.5462e-05 1.8983e-03 3.4199e-04 8.2942e-02 2.8787e-02 3.0797e-02 2.2145e-02 1.3975e-02 1.3927e-02 8.0519e-01 9.4210e-03 3.1576e-03 5.6148e-01 1.1969e-01 9.1285e-02 4.6990e-02 2.1310e-02 1.5170e-02 1.3150e-01 +8.1400e-01 3.7828e+06 5.5315e+02 9.7718e+02 3.2637e-07 1.5691e-01 8.4309e-01 3.1829e+03 8.6555e+02 4.6688e+02 3.9427e+01 5.9997e-05 1.5442e-05 1.8780e-03 3.3794e-04 8.2005e-02 2.8490e-02 3.0502e-02 2.1951e-02 1.3865e-02 1.3831e-02 8.0714e-01 9.4116e-03 3.1539e-03 5.6086e-01 1.1958e-01 9.1217e-02 4.6967e-02 2.1307e-02 1.5173e-02 1.3233e-01 +8.1600e-01 3.7432e+06 5.5315e+02 9.6454e+02 3.3118e-07 1.5333e-01 8.4667e-01 3.1793e+03 8.5649e+02 4.6722e+02 3.9124e+01 6.0036e-05 1.5423e-05 1.8576e-03 3.3388e-04 8.1068e-02 2.8192e-02 3.0206e-02 2.1756e-02 1.3754e-02 1.3734e-02 8.0910e-01 9.4021e-03 3.1501e-03 5.6024e-01 1.1946e-01 9.1148e-02 4.6942e-02 2.1302e-02 1.5177e-02 1.3318e-01 +8.1800e-01 3.7036e+06 5.5315e+02 9.5188e+02 3.3611e-07 1.4967e-01 8.5033e-01 3.1757e+03 8.4743e+02 4.6755e+02 3.8822e+01 6.0075e-05 1.5403e-05 1.8372e-03 3.2984e-04 8.0130e-02 2.7893e-02 2.9909e-02 2.1559e-02 1.3642e-02 1.3636e-02 8.1106e-01 9.3923e-03 3.1462e-03 5.5960e-01 1.1935e-01 9.1076e-02 4.6917e-02 2.1298e-02 1.5180e-02 1.3405e-01 +8.2000e-01 3.6640e+06 5.5315e+02 9.3920e+02 3.4116e-07 1.4592e-01 8.5408e-01 3.1720e+03 8.3838e+02 4.6788e+02 3.8520e+01 6.0114e-05 1.5384e-05 1.8167e-03 3.2579e-04 7.9193e-02 2.7594e-02 2.9610e-02 2.1362e-02 1.3529e-02 1.3537e-02 8.1303e-01 9.3823e-03 3.1423e-03 5.5894e-01 1.1923e-01 9.1002e-02 4.6890e-02 2.1292e-02 1.5183e-02 1.3494e-01 +8.2200e-01 3.6244e+06 5.5315e+02 9.2651e+02 3.4635e-07 1.4209e-01 8.5791e-01 3.1684e+03 8.2932e+02 4.6822e+02 3.8218e+01 6.0152e-05 1.5364e-05 1.7962e-03 3.2175e-04 7.8256e-02 2.7294e-02 2.9311e-02 2.1163e-02 1.3415e-02 1.3437e-02 8.1501e-01 9.3720e-03 3.1383e-03 5.5827e-01 1.1911e-01 9.0926e-02 4.6862e-02 2.1287e-02 1.5186e-02 1.3585e-01 +8.2400e-01 3.5848e+06 5.5315e+02 9.1379e+02 3.5167e-07 1.3816e-01 8.6184e-01 3.1647e+03 8.2027e+02 4.6855e+02 3.7916e+01 6.0190e-05 1.5343e-05 1.7758e-03 3.1772e-04 7.7319e-02 2.6994e-02 2.9010e-02 2.0963e-02 1.3301e-02 1.3336e-02 8.1698e-01 9.3616e-03 3.1342e-03 5.5759e-01 1.1898e-01 9.0847e-02 4.6833e-02 2.1280e-02 1.5188e-02 1.3678e-01 +8.2600e-01 3.5452e+06 5.5315e+02 9.0106e+02 3.5713e-07 1.3413e-01 8.6587e-01 3.1611e+03 8.1121e+02 4.6889e+02 3.7614e+01 6.0229e-05 1.5323e-05 1.7552e-03 3.1369e-04 7.6381e-02 2.6692e-02 2.8709e-02 2.0762e-02 1.3185e-02 1.3234e-02 8.1897e-01 9.3508e-03 3.1301e-03 5.5689e-01 1.1886e-01 9.0766e-02 4.6803e-02 2.1274e-02 1.5190e-02 1.3774e-01 +8.2800e-01 3.5056e+06 5.5315e+02 8.8830e+02 3.6274e-07 1.3000e-01 8.7000e-01 3.1574e+03 8.0216e+02 4.6922e+02 3.7313e+01 6.0267e-05 1.5302e-05 1.7347e-03 3.0966e-04 7.5444e-02 2.6391e-02 2.8406e-02 2.0560e-02 1.3069e-02 1.3130e-02 8.2096e-01 9.3398e-03 3.1258e-03 5.5618e-01 1.1873e-01 9.0683e-02 4.6771e-02 2.1266e-02 1.5192e-02 1.3872e-01 +8.3000e-01 3.4660e+06 5.5315e+02 8.7554e+02 3.6850e-07 1.2577e-01 8.7423e-01 3.1538e+03 7.9311e+02 4.6955e+02 3.7012e+01 6.0304e-05 1.5282e-05 1.7141e-03 3.0564e-04 7.4506e-02 2.6088e-02 2.8102e-02 2.0357e-02 1.2951e-02 1.3026e-02 8.2295e-01 9.3285e-03 3.1215e-03 5.5545e-01 1.1859e-01 9.0596e-02 4.6738e-02 2.1258e-02 1.5194e-02 1.3972e-01 +8.3200e-01 3.4264e+06 5.5315e+02 8.6275e+02 3.7442e-07 1.2143e-01 8.7857e-01 3.1502e+03 7.8406e+02 4.6989e+02 3.6711e+01 6.0342e-05 1.5261e-05 1.6935e-03 3.0163e-04 7.3569e-02 2.5785e-02 2.7796e-02 2.0152e-02 1.2833e-02 1.2920e-02 8.2495e-01 9.3170e-03 3.1171e-03 5.5471e-01 1.1845e-01 9.0508e-02 4.6704e-02 2.1250e-02 1.5195e-02 1.4075e-01 +8.3400e-01 3.3868e+06 5.5315e+02 8.4995e+02 3.8050e-07 1.1698e-01 8.8302e-01 3.1465e+03 7.7501e+02 4.7022e+02 3.6411e+01 6.0380e-05 1.5239e-05 1.6729e-03 2.9761e-04 7.2631e-02 2.5481e-02 2.7490e-02 1.9946e-02 1.2714e-02 1.2813e-02 8.2695e-01 9.3052e-03 3.1125e-03 5.5394e-01 1.1831e-01 9.0416e-02 4.6668e-02 2.1241e-02 1.5195e-02 1.4181e-01 +8.3600e-01 3.3472e+06 5.5315e+02 8.3714e+02 3.8675e-07 1.1241e-01 8.8759e-01 3.1429e+03 7.6597e+02 4.7055e+02 3.6110e+01 6.0417e-05 1.5218e-05 1.6522e-03 2.9361e-04 7.1694e-02 2.5177e-02 2.7183e-02 1.9740e-02 1.2593e-02 1.2705e-02 8.2896e-01 9.2930e-03 3.1079e-03 5.5316e-01 1.1817e-01 9.0321e-02 4.6631e-02 2.1231e-02 1.5195e-02 1.4289e-01 +8.3800e-01 3.3076e+06 5.5315e+02 8.2431e+02 3.9317e-07 1.0772e-01 8.9228e-01 3.1392e+03 7.5692e+02 4.7089e+02 3.5810e+01 6.0454e-05 1.5196e-05 1.6316e-03 2.8960e-04 7.0756e-02 2.4872e-02 2.6874e-02 1.9532e-02 1.2472e-02 1.2596e-02 8.3098e-01 9.2806e-03 3.1032e-03 5.5237e-01 1.1802e-01 9.0224e-02 4.6593e-02 2.1221e-02 1.5195e-02 1.4400e-01 +8.4000e-01 3.2680e+06 5.5315e+02 8.1147e+02 3.9978e-07 1.0291e-01 8.9709e-01 3.1356e+03 7.4788e+02 4.7122e+02 3.5511e+01 6.0491e-05 1.5174e-05 1.6109e-03 2.8560e-04 6.9819e-02 2.4566e-02 2.6564e-02 1.9322e-02 1.2350e-02 1.2486e-02 8.3300e-01 9.2678e-03 3.0984e-03 5.5155e-01 1.1786e-01 9.0123e-02 4.6552e-02 2.1210e-02 1.5195e-02 1.4514e-01 +8.4200e-01 3.2284e+06 5.5315e+02 7.9862e+02 4.0658e-07 9.7964e-02 9.0204e-01 3.1320e+03 7.3884e+02 4.7155e+02 3.5211e+01 6.0527e-05 1.5152e-05 1.5902e-03 2.8161e-04 6.8881e-02 2.4260e-02 2.6253e-02 1.9112e-02 1.2227e-02 1.2375e-02 8.3502e-01 9.2547e-03 3.0934e-03 5.5071e-01 1.1771e-01 9.0019e-02 4.6511e-02 2.1198e-02 1.5194e-02 1.4631e-01 +8.4400e-01 3.1888e+06 5.5315e+02 7.8575e+02 4.1359e-07 9.2883e-02 9.0712e-01 3.1283e+03 7.2980e+02 4.7188e+02 3.4912e+01 6.0564e-05 1.5129e-05 1.5694e-03 2.7762e-04 6.7943e-02 2.3953e-02 2.5941e-02 1.8900e-02 1.2102e-02 1.2262e-02 8.3705e-01 9.2413e-03 3.0884e-03 5.4986e-01 1.1754e-01 8.9912e-02 4.6467e-02 2.1186e-02 1.5192e-02 1.4751e-01 +8.4600e-01 3.1492e+06 5.5315e+02 7.7288e+02 4.2079e-07 8.7659e-02 9.1234e-01 3.1247e+03 7.2076e+02 4.7222e+02 3.4613e+01 6.0600e-05 1.5106e-05 1.5486e-03 2.7363e-04 6.7005e-02 2.3646e-02 2.5628e-02 1.8688e-02 1.1977e-02 1.2148e-02 8.3909e-01 9.2275e-03 3.0832e-03 5.4898e-01 1.1738e-01 8.9801e-02 4.6422e-02 2.1172e-02 1.5190e-02 1.4875e-01 +8.4800e-01 3.1096e+06 5.5315e+02 7.6000e+02 4.2822e-07 8.2288e-02 9.1771e-01 3.1211e+03 7.1172e+02 4.7255e+02 3.4314e+01 6.0636e-05 1.5083e-05 1.5278e-03 2.6965e-04 6.6068e-02 2.3338e-02 2.5313e-02 1.8474e-02 1.1851e-02 1.2033e-02 8.4113e-01 9.2133e-03 3.0780e-03 5.4808e-01 1.1721e-01 8.9687e-02 4.6375e-02 2.1158e-02 1.5188e-02 1.5001e-01 +8.5000e-01 3.0700e+06 5.5315e+02 7.4710e+02 4.3587e-07 7.6762e-02 9.2324e-01 3.1174e+03 7.0268e+02 4.7288e+02 3.4015e+01 6.0672e-05 1.5059e-05 1.5070e-03 2.6567e-04 6.5130e-02 2.3029e-02 2.4998e-02 1.8258e-02 1.1724e-02 1.1917e-02 8.4317e-01 9.1988e-03 3.0726e-03 5.4716e-01 1.1703e-01 8.9569e-02 4.6325e-02 2.1143e-02 1.5184e-02 1.5132e-01 +8.5200e-01 3.0304e+06 5.5315e+02 7.3421e+02 4.4376e-07 7.1074e-02 9.2893e-01 3.1138e+03 6.9365e+02 4.7321e+02 3.3717e+01 6.0708e-05 1.5035e-05 1.4861e-03 2.6170e-04 6.4192e-02 2.2719e-02 2.4681e-02 1.8042e-02 1.1596e-02 1.1799e-02 8.4522e-01 9.1839e-03 3.0670e-03 5.4621e-01 1.1685e-01 8.9447e-02 4.6274e-02 2.1128e-02 1.5181e-02 1.5266e-01 +8.5400e-01 2.9908e+06 5.5315e+02 7.2130e+02 4.5189e-07 6.5219e-02 9.3478e-01 3.1101e+03 6.8461e+02 4.7355e+02 3.3419e+01 6.0743e-05 1.5011e-05 1.4653e-03 2.5773e-04 6.3254e-02 2.2409e-02 2.4363e-02 1.7824e-02 1.1467e-02 1.1680e-02 8.4728e-01 9.1685e-03 3.0613e-03 5.4525e-01 1.1666e-01 8.9321e-02 4.6221e-02 2.1111e-02 1.5176e-02 1.5403e-01 +8.5600e-01 2.9512e+06 5.5315e+02 7.0839e+02 4.6028e-07 5.9188e-02 9.4081e-01 3.1065e+03 6.7558e+02 4.7388e+02 3.3121e+01 6.0779e-05 1.4987e-05 1.4444e-03 2.5376e-04 6.2316e-02 2.2098e-02 2.4043e-02 1.7605e-02 1.1336e-02 1.1560e-02 8.4934e-01 9.1528e-03 3.0555e-03 5.4425e-01 1.1647e-01 8.9191e-02 4.6166e-02 2.1093e-02 1.5172e-02 1.5545e-01 +8.5800e-01 2.9116e+06 5.5315e+02 6.9548e+02 4.6894e-07 5.2973e-02 9.4703e-01 3.1029e+03 6.6655e+02 4.7421e+02 3.2823e+01 6.0814e-05 1.4962e-05 1.4234e-03 2.4980e-04 6.1378e-02 2.1787e-02 2.3723e-02 1.7385e-02 1.1205e-02 1.1439e-02 8.5141e-01 9.1366e-03 3.0496e-03 5.4323e-01 1.1627e-01 8.9057e-02 4.6109e-02 2.1075e-02 1.5166e-02 1.5690e-01 +8.6000e-01 2.8720e+06 5.5315e+02 6.8256e+02 4.7788e-07 4.6565e-02 9.5343e-01 3.0992e+03 6.5752e+02 4.7454e+02 3.2526e+01 6.0849e-05 1.4936e-05 1.4025e-03 2.4585e-04 6.0440e-02 2.1475e-02 2.3401e-02 1.7164e-02 1.1073e-02 1.1316e-02 8.5348e-01 9.1199e-03 3.0435e-03 5.4218e-01 1.1607e-01 8.8918e-02 4.6049e-02 2.1055e-02 1.5160e-02 1.5840e-01 +8.6200e-01 2.8324e+06 5.5315e+02 6.6964e+02 4.8711e-07 3.9957e-02 9.6004e-01 3.0956e+03 6.4849e+02 4.7487e+02 3.2229e+01 6.0883e-05 1.4911e-05 1.3815e-03 2.4190e-04 5.9502e-02 2.1162e-02 2.3078e-02 1.6941e-02 1.0940e-02 1.1192e-02 8.5556e-01 9.1027e-03 3.0372e-03 5.4111e-01 1.1586e-01 8.8774e-02 4.5986e-02 2.1034e-02 1.5153e-02 1.5995e-01 +8.6400e-01 2.7928e+06 5.5315e+02 6.5673e+02 4.9665e-07 3.3136e-02 9.6686e-01 3.0920e+03 6.3947e+02 4.7520e+02 3.1932e+01 6.0918e-05 1.4885e-05 1.3605e-03 2.3795e-04 5.8564e-02 2.0849e-02 2.2754e-02 1.6717e-02 1.0805e-02 1.1067e-02 8.5764e-01 9.0851e-03 3.0308e-03 5.4000e-01 1.1564e-01 8.8625e-02 4.5922e-02 2.1012e-02 1.5145e-02 1.6153e-01 +8.6600e-01 2.7532e+06 5.5315e+02 6.4381e+02 5.0652e-07 2.6095e-02 9.7391e-01 3.0883e+03 6.3044e+02 4.7554e+02 3.1635e+01 6.0952e-05 1.4858e-05 1.3395e-03 2.3401e-04 5.7626e-02 2.0535e-02 2.2429e-02 1.6492e-02 1.0670e-02 1.0940e-02 8.5973e-01 9.0669e-03 3.0242e-03 5.3887e-01 1.1542e-01 8.8472e-02 4.5854e-02 2.0989e-02 1.5136e-02 1.6317e-01 +8.6800e-01 2.7136e+06 5.5315e+02 6.3090e+02 5.1672e-07 1.8821e-02 9.8118e-01 3.0847e+03 6.2142e+02 4.7587e+02 3.1338e+01 6.0986e-05 1.4831e-05 1.3184e-03 2.3007e-04 5.6688e-02 2.0221e-02 2.2102e-02 1.6266e-02 1.0533e-02 1.0812e-02 8.6183e-01 9.0482e-03 3.0174e-03 5.3770e-01 1.1519e-01 8.8313e-02 4.5784e-02 2.0965e-02 1.5127e-02 1.6486e-01 +8.7000e-01 2.6740e+06 5.5315e+02 6.1799e+02 5.2728e-07 1.1303e-02 9.8870e-01 3.0811e+03 6.1240e+02 4.7620e+02 3.1042e+01 6.1020e-05 1.4804e-05 1.2973e-03 2.2613e-04 5.5750e-02 1.9905e-02 2.1775e-02 1.6038e-02 1.0396e-02 1.0683e-02 8.6393e-01 9.0289e-03 3.0104e-03 5.3650e-01 1.1496e-01 8.8148e-02 4.5711e-02 2.0939e-02 1.5117e-02 1.6660e-01 +8.7200e-01 2.6344e+06 5.5315e+02 6.0509e+02 5.3822e-07 3.5289e-03 9.9647e-01 3.0774e+03 6.0338e+02 4.7653e+02 3.0746e+01 6.1053e-05 1.4776e-05 1.2762e-03 2.2220e-04 5.4811e-02 1.9589e-02 2.1446e-02 1.5809e-02 1.0257e-02 1.0552e-02 8.6604e-01 9.0090e-03 3.0032e-03 5.3526e-01 1.1471e-01 8.7977e-02 4.5635e-02 2.0912e-02 1.5105e-02 1.6839e-01 +8.7400e-01 2.5948e+06 5.5315e+02 5.9408e+02 4.0416e-07 0.0000e+00 1.0000e+00 5.9408e+02 5.9408e+02 3.0344e+01 3.0344e+01 1.4756e-05 1.4756e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.7600e-01 2.5552e+06 5.5315e+02 5.8458e+02 4.1018e-07 0.0000e+00 1.0000e+00 5.8458e+02 5.8458e+02 2.9859e+01 2.9859e+01 1.4744e-05 1.4744e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.7800e-01 2.5156e+06 5.5315e+02 5.7509e+02 4.1638e-07 0.0000e+00 1.0000e+00 5.7509e+02 5.7509e+02 2.9374e+01 2.9374e+01 1.4732e-05 1.4732e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8000e-01 2.4760e+06 5.5315e+02 5.6562e+02 4.2278e-07 0.0000e+00 1.0000e+00 5.6562e+02 5.6562e+02 2.8890e+01 2.8890e+01 1.4719e-05 1.4719e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8200e-01 2.4364e+06 5.5315e+02 5.5615e+02 4.2939e-07 0.0000e+00 1.0000e+00 5.5615e+02 5.5615e+02 2.8407e+01 2.8407e+01 1.4707e-05 1.4707e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8400e-01 2.3968e+06 5.5315e+02 5.4670e+02 4.3622e-07 0.0000e+00 1.0000e+00 5.4670e+02 5.4670e+02 2.7924e+01 2.7924e+01 1.4696e-05 1.4696e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8600e-01 2.3572e+06 5.5315e+02 5.3727e+02 4.4327e-07 0.0000e+00 1.0000e+00 5.3727e+02 5.3727e+02 2.7442e+01 2.7442e+01 1.4684e-05 1.4684e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.8800e-01 2.3176e+06 5.5315e+02 5.2784e+02 4.5056e-07 0.0000e+00 1.0000e+00 5.2784e+02 5.2784e+02 2.6961e+01 2.6961e+01 1.4672e-05 1.4672e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9000e-01 2.2780e+06 5.5315e+02 5.1843e+02 4.5810e-07 0.0000e+00 1.0000e+00 5.1843e+02 5.1843e+02 2.6480e+01 2.6480e+01 1.4660e-05 1.4660e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9200e-01 2.2384e+06 5.5315e+02 5.0903e+02 4.6590e-07 0.0000e+00 1.0000e+00 5.0903e+02 5.0903e+02 2.6000e+01 2.6000e+01 1.4649e-05 1.4649e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9400e-01 2.1988e+06 5.5315e+02 4.9965e+02 4.7399e-07 0.0000e+00 1.0000e+00 4.9965e+02 4.9965e+02 2.5521e+01 2.5521e+01 1.4638e-05 1.4638e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9600e-01 2.1592e+06 5.5315e+02 4.9028e+02 4.8237e-07 0.0000e+00 1.0000e+00 4.9028e+02 4.9028e+02 2.5042e+01 2.5042e+01 1.4626e-05 1.4626e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +8.9800e-01 2.1196e+06 5.5315e+02 4.8092e+02 4.9106e-07 0.0000e+00 1.0000e+00 4.8092e+02 4.8092e+02 2.4564e+01 2.4564e+01 1.4615e-05 1.4615e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0000e-01 2.0800e+06 5.5315e+02 4.7157e+02 5.0008e-07 0.0000e+00 1.0000e+00 4.7157e+02 4.7157e+02 2.4087e+01 2.4087e+01 1.4604e-05 1.4604e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0200e-01 2.0404e+06 5.5315e+02 4.6224e+02 5.0945e-07 0.0000e+00 1.0000e+00 4.6224e+02 4.6224e+02 2.3610e+01 2.3610e+01 1.4593e-05 1.4593e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0400e-01 2.0008e+06 5.5315e+02 4.5292e+02 5.1919e-07 0.0000e+00 1.0000e+00 4.5292e+02 4.5292e+02 2.3134e+01 2.3134e+01 1.4582e-05 1.4582e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0600e-01 1.9612e+06 5.5315e+02 4.4362e+02 5.2932e-07 0.0000e+00 1.0000e+00 4.4362e+02 4.4362e+02 2.2659e+01 2.2659e+01 1.4571e-05 1.4571e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.0800e-01 1.9216e+06 5.5315e+02 4.3432e+02 5.3986e-07 0.0000e+00 1.0000e+00 4.3432e+02 4.3432e+02 2.2184e+01 2.2184e+01 1.4561e-05 1.4561e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1000e-01 1.8820e+06 5.5315e+02 4.2505e+02 5.5085e-07 0.0000e+00 1.0000e+00 4.2505e+02 4.2505e+02 2.1710e+01 2.1710e+01 1.4550e-05 1.4550e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1200e-01 1.8424e+06 5.5315e+02 4.1578e+02 5.6230e-07 0.0000e+00 1.0000e+00 4.1578e+02 4.1578e+02 2.1237e+01 2.1237e+01 1.4539e-05 1.4539e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1400e-01 1.8028e+06 5.5315e+02 4.0653e+02 5.7426e-07 0.0000e+00 1.0000e+00 4.0653e+02 4.0653e+02 2.0764e+01 2.0764e+01 1.4529e-05 1.4529e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1600e-01 1.7632e+06 5.5315e+02 3.9729e+02 5.8675e-07 0.0000e+00 1.0000e+00 3.9729e+02 3.9729e+02 2.0293e+01 2.0293e+01 1.4519e-05 1.4519e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.1800e-01 1.7236e+06 5.5315e+02 3.8807e+02 5.9982e-07 0.0000e+00 1.0000e+00 3.8807e+02 3.8807e+02 1.9821e+01 1.9821e+01 1.4509e-05 1.4509e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2000e-01 1.6840e+06 5.5315e+02 3.7886e+02 6.1350e-07 0.0000e+00 1.0000e+00 3.7886e+02 3.7886e+02 1.9351e+01 1.9351e+01 1.4498e-05 1.4498e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2200e-01 1.6444e+06 5.5315e+02 3.6966e+02 6.2783e-07 0.0000e+00 1.0000e+00 3.6966e+02 3.6966e+02 1.8881e+01 1.8881e+01 1.4488e-05 1.4488e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2400e-01 1.6048e+06 5.5315e+02 3.6047e+02 6.4287e-07 0.0000e+00 1.0000e+00 3.6047e+02 3.6047e+02 1.8412e+01 1.8412e+01 1.4479e-05 1.4479e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2600e-01 1.5652e+06 5.5315e+02 3.5130e+02 6.5867e-07 0.0000e+00 1.0000e+00 3.5130e+02 3.5130e+02 1.7944e+01 1.7944e+01 1.4469e-05 1.4469e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.2800e-01 1.5256e+06 5.5315e+02 3.4215e+02 6.7528e-07 0.0000e+00 1.0000e+00 3.4215e+02 3.4215e+02 1.7476e+01 1.7476e+01 1.4459e-05 1.4459e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3000e-01 1.4860e+06 5.5315e+02 3.3301e+02 6.9278e-07 0.0000e+00 1.0000e+00 3.3301e+02 3.3301e+02 1.7009e+01 1.7009e+01 1.4449e-05 1.4449e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3200e-01 1.4464e+06 5.5315e+02 3.2388e+02 7.1123e-07 0.0000e+00 1.0000e+00 3.2388e+02 3.2388e+02 1.6543e+01 1.6543e+01 1.4440e-05 1.4440e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3400e-01 1.4068e+06 5.5315e+02 3.1476e+02 7.3073e-07 0.0000e+00 1.0000e+00 3.1476e+02 3.1476e+02 1.6077e+01 1.6077e+01 1.4430e-05 1.4430e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3600e-01 1.3672e+06 5.5315e+02 3.0566e+02 7.5135e-07 0.0000e+00 1.0000e+00 3.0566e+02 3.0566e+02 1.5612e+01 1.5612e+01 1.4421e-05 1.4421e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.3800e-01 1.3276e+06 5.5315e+02 2.9657e+02 7.7319e-07 0.0000e+00 1.0000e+00 2.9657e+02 2.9657e+02 1.5148e+01 1.5148e+01 1.4412e-05 1.4412e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4000e-01 1.2880e+06 5.5315e+02 2.8750e+02 7.9638e-07 0.0000e+00 1.0000e+00 2.8750e+02 2.8750e+02 1.4685e+01 1.4685e+01 1.4403e-05 1.4403e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4200e-01 1.2484e+06 5.5315e+02 2.7844e+02 8.2104e-07 0.0000e+00 1.0000e+00 2.7844e+02 2.7844e+02 1.4222e+01 1.4222e+01 1.4394e-05 1.4394e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4400e-01 1.2088e+06 5.5315e+02 2.6939e+02 8.4731e-07 0.0000e+00 1.0000e+00 2.6939e+02 2.6939e+02 1.3760e+01 1.3760e+01 1.4385e-05 1.4385e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4600e-01 1.1692e+06 5.5315e+02 2.6036e+02 8.7535e-07 0.0000e+00 1.0000e+00 2.6036e+02 2.6036e+02 1.3299e+01 1.3299e+01 1.4376e-05 1.4376e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.4800e-01 1.1296e+06 5.5315e+02 2.5134e+02 9.0536e-07 0.0000e+00 1.0000e+00 2.5134e+02 2.5134e+02 1.2838e+01 1.2838e+01 1.4367e-05 1.4367e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5000e-01 1.0900e+06 5.5315e+02 2.4234e+02 9.3755e-07 0.0000e+00 1.0000e+00 2.4234e+02 2.4234e+02 1.2378e+01 1.2378e+01 1.4358e-05 1.4358e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5200e-01 1.0504e+06 5.5315e+02 2.3335e+02 9.7216e-07 0.0000e+00 1.0000e+00 2.3335e+02 2.3335e+02 1.1919e+01 1.1919e+01 1.4350e-05 1.4350e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5400e-01 1.0108e+06 5.5315e+02 2.2437e+02 1.0095e-06 0.0000e+00 1.0000e+00 2.2437e+02 2.2437e+02 1.1460e+01 1.1460e+01 1.4341e-05 1.4341e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5600e-01 9.7120e+05 5.5315e+02 2.1541e+02 1.0499e-06 0.0000e+00 1.0000e+00 2.1541e+02 2.1541e+02 1.1003e+01 1.1003e+01 1.4333e-05 1.4333e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.5800e-01 9.3160e+05 5.5315e+02 2.0646e+02 1.0936e-06 0.0000e+00 1.0000e+00 2.0646e+02 2.0646e+02 1.0545e+01 1.0545e+01 1.4324e-05 1.4324e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6000e-01 8.9200e+05 5.5315e+02 1.9753e+02 1.1413e-06 0.0000e+00 1.0000e+00 1.9753e+02 1.9753e+02 1.0089e+01 1.0089e+01 1.4316e-05 1.4316e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6200e-01 8.5240e+05 5.5315e+02 1.8861e+02 1.1934e-06 0.0000e+00 1.0000e+00 1.8861e+02 1.8861e+02 9.6335e+00 9.6335e+00 1.4308e-05 1.4308e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6400e-01 8.1280e+05 5.5315e+02 1.7970e+02 1.2506e-06 0.0000e+00 1.0000e+00 1.7970e+02 1.7970e+02 9.1786e+00 9.1786e+00 1.4300e-05 1.4300e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6600e-01 7.7320e+05 5.5315e+02 1.7081e+02 1.3136e-06 0.0000e+00 1.0000e+00 1.7081e+02 1.7081e+02 8.7244e+00 8.7244e+00 1.4292e-05 1.4292e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.6800e-01 7.3360e+05 5.5315e+02 1.6193e+02 1.3835e-06 0.0000e+00 1.0000e+00 1.6193e+02 1.6193e+02 8.2709e+00 8.2709e+00 1.4284e-05 1.4284e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7000e-01 6.9400e+05 5.5315e+02 1.5306e+02 1.4613e-06 0.0000e+00 1.0000e+00 1.5306e+02 1.5306e+02 7.8181e+00 7.8181e+00 1.4276e-05 1.4276e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7200e-01 6.5440e+05 5.5315e+02 1.4421e+02 1.5485e-06 0.0000e+00 1.0000e+00 1.4421e+02 1.4421e+02 7.3661e+00 7.3661e+00 1.4269e-05 1.4269e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7400e-01 6.1480e+05 5.5315e+02 1.3538e+02 1.6470e-06 0.0000e+00 1.0000e+00 1.3538e+02 1.3538e+02 6.9147e+00 6.9147e+00 1.4261e-05 1.4261e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7600e-01 5.7520e+05 5.5315e+02 1.2656e+02 1.7590e-06 0.0000e+00 1.0000e+00 1.2656e+02 1.2656e+02 6.4641e+00 6.4641e+00 1.4253e-05 1.4253e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.7800e-01 5.3560e+05 5.5315e+02 1.1775e+02 1.8875e-06 0.0000e+00 1.0000e+00 1.1775e+02 1.1775e+02 6.0142e+00 6.0142e+00 1.4246e-05 1.4246e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8000e-01 4.9600e+05 5.5315e+02 1.0895e+02 2.0366e-06 0.0000e+00 1.0000e+00 1.0895e+02 1.0895e+02 5.5650e+00 5.5650e+00 1.4239e-05 1.4239e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8200e-01 4.5640e+05 5.5315e+02 1.0017e+02 2.2116e-06 0.0000e+00 1.0000e+00 1.0017e+02 1.0017e+02 5.1166e+00 5.1166e+00 1.4231e-05 1.4231e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8400e-01 4.1680e+05 5.5315e+02 9.1407e+01 2.4197e-06 0.0000e+00 1.0000e+00 9.1407e+01 9.1407e+01 4.6688e+00 4.6688e+00 1.4224e-05 1.4224e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8600e-01 3.7720e+05 5.5315e+02 8.2656e+01 2.6716e-06 0.0000e+00 1.0000e+00 8.2656e+01 8.2656e+01 4.2218e+00 4.2218e+00 1.4217e-05 1.4217e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.8800e-01 3.3760e+05 5.5315e+02 7.3918e+01 2.9826e-06 0.0000e+00 1.0000e+00 7.3918e+01 7.3918e+01 3.7755e+00 3.7755e+00 1.4210e-05 1.4210e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9000e-01 2.9800e+05 5.5315e+02 6.5194e+01 3.3763e-06 0.0000e+00 1.0000e+00 6.5194e+01 6.5194e+01 3.3300e+00 3.3300e+00 1.4203e-05 1.4203e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9200e-01 2.5840e+05 5.5315e+02 5.6485e+01 3.8906e-06 0.0000e+00 1.0000e+00 5.6485e+01 5.6485e+01 2.8851e+00 2.8851e+00 1.4196e-05 1.4196e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9400e-01 2.1880e+05 5.5315e+02 4.7790e+01 4.5910e-06 0.0000e+00 1.0000e+00 4.7790e+01 4.7790e+01 2.4410e+00 2.4410e+00 1.4189e-05 1.4189e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9600e-01 1.7920e+05 5.5315e+02 3.9108e+01 5.6010e-06 0.0000e+00 1.0000e+00 3.9108e+01 3.9108e+01 1.9975e+00 1.9975e+00 1.4183e-05 1.4183e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +9.9800e-01 1.3960e+05 5.5315e+02 3.0441e+01 7.1840e-06 0.0000e+00 1.0000e+00 3.0441e+01 3.0441e+01 1.5549e+00 1.5549e+00 1.4176e-05 1.4176e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0000e+00 1.0000e+05 5.5315e+02 2.1788e+01 1.0021e-05 0.0000e+00 1.0000e+00 2.1788e+01 2.1788e+01 1.1129e+00 1.1129e+00 1.4170e-05 1.4170e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0020e+00 1.3960e+05 5.8315e+02 2.8855e+01 7.1791e-06 0.0000e+00 1.0000e+00 2.8855e+01 2.8855e+01 1.4739e+00 1.4739e+00 1.4780e-05 1.4780e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0040e+00 1.7920e+05 5.8315e+02 3.7064e+01 5.5961e-06 0.0000e+00 1.0000e+00 3.7064e+01 3.7064e+01 1.8931e+00 1.8931e+00 1.4786e-05 1.4786e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0060e+00 2.1880e+05 5.8315e+02 4.5282e+01 4.5861e-06 0.0000e+00 1.0000e+00 4.5282e+01 4.5282e+01 2.3129e+00 2.3129e+00 1.4793e-05 1.4793e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0080e+00 2.5840e+05 5.8315e+02 5.3511e+01 3.8856e-06 0.0000e+00 1.0000e+00 5.3511e+01 5.3511e+01 2.7332e+00 2.7332e+00 1.4799e-05 1.4799e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0100e+00 2.9800e+05 5.8315e+02 6.1750e+01 3.3713e-06 0.0000e+00 1.0000e+00 6.1750e+01 6.1750e+01 3.1540e+00 3.1540e+00 1.4806e-05 1.4806e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0120e+00 3.3760e+05 5.8315e+02 6.9999e+01 2.9777e-06 0.0000e+00 1.0000e+00 6.9999e+01 6.9999e+01 3.5754e+00 3.5754e+00 1.4812e-05 1.4812e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0140e+00 3.7720e+05 5.8315e+02 7.8258e+01 2.6667e-06 0.0000e+00 1.0000e+00 7.8258e+01 7.8258e+01 3.9972e+00 3.9972e+00 1.4819e-05 1.4819e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0160e+00 4.1680e+05 5.8315e+02 8.6527e+01 2.4148e-06 0.0000e+00 1.0000e+00 8.6527e+01 8.6527e+01 4.4196e+00 4.4196e+00 1.4825e-05 1.4825e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0180e+00 4.5640e+05 5.8315e+02 9.4806e+01 2.2066e-06 0.0000e+00 1.0000e+00 9.4806e+01 9.4806e+01 4.8424e+00 4.8424e+00 1.4832e-05 1.4832e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0200e+00 4.9600e+05 5.8315e+02 1.0310e+02 2.0316e-06 0.0000e+00 1.0000e+00 1.0310e+02 1.0310e+02 5.2658e+00 5.2658e+00 1.4839e-05 1.4839e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0220e+00 5.3560e+05 5.8315e+02 1.1139e+02 1.8825e-06 0.0000e+00 1.0000e+00 1.1139e+02 1.1139e+02 5.6897e+00 5.6897e+00 1.4846e-05 1.4846e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0240e+00 5.7520e+05 5.8315e+02 1.1970e+02 1.7539e-06 0.0000e+00 1.0000e+00 1.1970e+02 1.1970e+02 6.1141e+00 6.1141e+00 1.4853e-05 1.4853e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0260e+00 6.1480e+05 5.8315e+02 1.2802e+02 1.6419e-06 0.0000e+00 1.0000e+00 1.2802e+02 1.2802e+02 6.5391e+00 6.5391e+00 1.4860e-05 1.4860e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0280e+00 6.5440e+05 5.8315e+02 1.3635e+02 1.5435e-06 0.0000e+00 1.0000e+00 1.3635e+02 1.3635e+02 6.9645e+00 6.9645e+00 1.4867e-05 1.4867e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0300e+00 6.9400e+05 5.8315e+02 1.4469e+02 1.4562e-06 0.0000e+00 1.0000e+00 1.4469e+02 1.4469e+02 7.3904e+00 7.3904e+00 1.4874e-05 1.4874e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0320e+00 7.3360e+05 5.8315e+02 1.5304e+02 1.3784e-06 0.0000e+00 1.0000e+00 1.5304e+02 1.5304e+02 7.8168e+00 7.8168e+00 1.4882e-05 1.4882e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0340e+00 7.7320e+05 5.8315e+02 1.6140e+02 1.3086e-06 0.0000e+00 1.0000e+00 1.6140e+02 1.6140e+02 8.2438e+00 8.2438e+00 1.4889e-05 1.4889e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0360e+00 8.1280e+05 5.8315e+02 1.6977e+02 1.2455e-06 0.0000e+00 1.0000e+00 1.6977e+02 1.6977e+02 8.6712e+00 8.6712e+00 1.4896e-05 1.4896e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0380e+00 8.5240e+05 5.8315e+02 1.7814e+02 1.1883e-06 0.0000e+00 1.0000e+00 1.7814e+02 1.7814e+02 9.0992e+00 9.0992e+00 1.4904e-05 1.4904e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0400e+00 8.9200e+05 5.8315e+02 1.8653e+02 1.1362e-06 0.0000e+00 1.0000e+00 1.8653e+02 1.8653e+02 9.5276e+00 9.5276e+00 1.4911e-05 1.4911e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0420e+00 9.3160e+05 5.8315e+02 1.9493e+02 1.0885e-06 0.0000e+00 1.0000e+00 1.9493e+02 1.9493e+02 9.9566e+00 9.9566e+00 1.4919e-05 1.4919e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0440e+00 9.7120e+05 5.8315e+02 2.0334e+02 1.0447e-06 0.0000e+00 1.0000e+00 2.0334e+02 2.0334e+02 1.0386e+01 1.0386e+01 1.4927e-05 1.4927e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0460e+00 1.0108e+06 5.8315e+02 2.1176e+02 1.0044e-06 0.0000e+00 1.0000e+00 2.1176e+02 2.1176e+02 1.0816e+01 1.0816e+01 1.4935e-05 1.4935e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0480e+00 1.0504e+06 5.8315e+02 2.2018e+02 9.6704e-07 0.0000e+00 1.0000e+00 2.2018e+02 2.2018e+02 1.1246e+01 1.1246e+01 1.4943e-05 1.4943e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0500e+00 1.0900e+06 5.8315e+02 2.2862e+02 9.3242e-07 0.0000e+00 1.0000e+00 2.2862e+02 2.2862e+02 1.1677e+01 1.1677e+01 1.4951e-05 1.4951e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0520e+00 1.1296e+06 5.8315e+02 2.3707e+02 9.0022e-07 0.0000e+00 1.0000e+00 2.3707e+02 2.3707e+02 1.2109e+01 1.2109e+01 1.4959e-05 1.4959e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0540e+00 1.1692e+06 5.8315e+02 2.4552e+02 8.7021e-07 0.0000e+00 1.0000e+00 2.4552e+02 2.4552e+02 1.2541e+01 1.2541e+01 1.4967e-05 1.4967e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0560e+00 1.2088e+06 5.8315e+02 2.5399e+02 8.4215e-07 0.0000e+00 1.0000e+00 2.5399e+02 2.5399e+02 1.2973e+01 1.2973e+01 1.4975e-05 1.4975e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0580e+00 1.2484e+06 5.8315e+02 2.6246e+02 8.1588e-07 0.0000e+00 1.0000e+00 2.6246e+02 2.6246e+02 1.3406e+01 1.3406e+01 1.4983e-05 1.4983e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0600e+00 1.2880e+06 5.8315e+02 2.7095e+02 7.9121e-07 0.0000e+00 1.0000e+00 2.7095e+02 2.7095e+02 1.3839e+01 1.3839e+01 1.4991e-05 1.4991e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0620e+00 1.3276e+06 5.8315e+02 2.7944e+02 7.6802e-07 0.0000e+00 1.0000e+00 2.7944e+02 2.7944e+02 1.4273e+01 1.4273e+01 1.5000e-05 1.5000e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0640e+00 1.3672e+06 5.8315e+02 2.8794e+02 7.4616e-07 0.0000e+00 1.0000e+00 2.8794e+02 2.8794e+02 1.4707e+01 1.4707e+01 1.5008e-05 1.5008e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0660e+00 1.4068e+06 5.8315e+02 2.9646e+02 7.2554e-07 0.0000e+00 1.0000e+00 2.9646e+02 2.9646e+02 1.5142e+01 1.5142e+01 1.5017e-05 1.5017e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0680e+00 1.4464e+06 5.8315e+02 3.0498e+02 7.0604e-07 0.0000e+00 1.0000e+00 3.0498e+02 3.0498e+02 1.5578e+01 1.5578e+01 1.5026e-05 1.5026e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0700e+00 1.4860e+06 5.8315e+02 3.1351e+02 6.8758e-07 0.0000e+00 1.0000e+00 3.1351e+02 3.1351e+02 1.6013e+01 1.6013e+01 1.5034e-05 1.5034e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0720e+00 1.5256e+06 5.8315e+02 3.2205e+02 6.7007e-07 0.0000e+00 1.0000e+00 3.2205e+02 3.2205e+02 1.6450e+01 1.6450e+01 1.5043e-05 1.5043e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0740e+00 1.5652e+06 5.8315e+02 3.3060e+02 6.5345e-07 0.0000e+00 1.0000e+00 3.3060e+02 3.3060e+02 1.6886e+01 1.6886e+01 1.5052e-05 1.5052e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0760e+00 1.6048e+06 5.8315e+02 3.3916e+02 6.3765e-07 0.0000e+00 1.0000e+00 3.3916e+02 3.3916e+02 1.7324e+01 1.7324e+01 1.5061e-05 1.5061e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0780e+00 1.6444e+06 5.8315e+02 3.4773e+02 6.2260e-07 0.0000e+00 1.0000e+00 3.4773e+02 3.4773e+02 1.7761e+01 1.7761e+01 1.5070e-05 1.5070e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0800e+00 1.6840e+06 5.8315e+02 3.5631e+02 6.0826e-07 0.0000e+00 1.0000e+00 3.5631e+02 3.5631e+02 1.8199e+01 1.8199e+01 1.5079e-05 1.5079e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0820e+00 1.7236e+06 5.8315e+02 3.6490e+02 5.9458e-07 0.0000e+00 1.0000e+00 3.6490e+02 3.6490e+02 1.8638e+01 1.8638e+01 1.5089e-05 1.5089e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0840e+00 1.7632e+06 5.8315e+02 3.7349e+02 5.8151e-07 0.0000e+00 1.0000e+00 3.7349e+02 3.7349e+02 1.9077e+01 1.9077e+01 1.5098e-05 1.5098e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0860e+00 1.8028e+06 5.8315e+02 3.8210e+02 5.6901e-07 0.0000e+00 1.0000e+00 3.8210e+02 3.8210e+02 1.9517e+01 1.9517e+01 1.5107e-05 1.5107e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0880e+00 1.8424e+06 5.8315e+02 3.9071e+02 5.5705e-07 0.0000e+00 1.0000e+00 3.9071e+02 3.9071e+02 1.9957e+01 1.9957e+01 1.5117e-05 1.5117e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0900e+00 1.8820e+06 5.8315e+02 3.9934e+02 5.4559e-07 0.0000e+00 1.0000e+00 3.9934e+02 3.9934e+02 2.0397e+01 2.0397e+01 1.5126e-05 1.5126e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0920e+00 1.9216e+06 5.8315e+02 4.0797e+02 5.3460e-07 0.0000e+00 1.0000e+00 4.0797e+02 4.0797e+02 2.0838e+01 2.0838e+01 1.5136e-05 1.5136e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0940e+00 1.9612e+06 5.8315e+02 4.1661e+02 5.2405e-07 0.0000e+00 1.0000e+00 4.1661e+02 4.1661e+02 2.1279e+01 2.1279e+01 1.5146e-05 1.5146e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0960e+00 2.0008e+06 5.8315e+02 4.2526e+02 5.1392e-07 0.0000e+00 1.0000e+00 4.2526e+02 4.2526e+02 2.1721e+01 2.1721e+01 1.5155e-05 1.5155e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.0980e+00 2.0404e+06 5.8315e+02 4.3392e+02 5.0418e-07 0.0000e+00 1.0000e+00 4.3392e+02 4.3392e+02 2.2163e+01 2.2163e+01 1.5165e-05 1.5165e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1000e+00 2.0800e+06 5.8315e+02 4.4259e+02 4.9480e-07 0.0000e+00 1.0000e+00 4.4259e+02 4.4259e+02 2.2606e+01 2.2606e+01 1.5175e-05 1.5175e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1020e+00 2.1196e+06 5.8315e+02 4.5126e+02 4.8578e-07 0.0000e+00 1.0000e+00 4.5126e+02 4.5126e+02 2.3049e+01 2.3049e+01 1.5185e-05 1.5185e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1040e+00 2.1592e+06 5.8315e+02 4.5995e+02 4.7708e-07 0.0000e+00 1.0000e+00 4.5995e+02 4.5995e+02 2.3493e+01 2.3493e+01 1.5196e-05 1.5196e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1060e+00 2.1988e+06 5.8315e+02 4.6864e+02 4.6870e-07 0.0000e+00 1.0000e+00 4.6864e+02 4.6864e+02 2.3937e+01 2.3937e+01 1.5206e-05 1.5206e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1080e+00 2.2384e+06 5.8315e+02 4.7734e+02 4.6061e-07 0.0000e+00 1.0000e+00 4.7734e+02 4.7734e+02 2.4381e+01 2.4381e+01 1.5216e-05 1.5216e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1100e+00 2.2780e+06 5.8315e+02 4.8605e+02 4.5280e-07 0.0000e+00 1.0000e+00 4.8605e+02 4.8605e+02 2.4826e+01 2.4826e+01 1.5226e-05 1.5226e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1120e+00 2.3176e+06 5.8315e+02 4.9477e+02 4.4526e-07 0.0000e+00 1.0000e+00 4.9477e+02 4.9477e+02 2.5272e+01 2.5272e+01 1.5237e-05 1.5237e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1140e+00 2.3572e+06 5.8315e+02 5.0350e+02 4.3796e-07 0.0000e+00 1.0000e+00 5.0350e+02 5.0350e+02 2.5718e+01 2.5718e+01 1.5247e-05 1.5247e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1160e+00 2.3968e+06 5.8315e+02 5.1224e+02 4.3091e-07 0.0000e+00 1.0000e+00 5.1224e+02 5.1224e+02 2.6164e+01 2.6164e+01 1.5258e-05 1.5258e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1180e+00 2.4364e+06 5.8315e+02 5.2098e+02 4.2408e-07 0.0000e+00 1.0000e+00 5.2098e+02 5.2098e+02 2.6610e+01 2.6610e+01 1.5269e-05 1.5269e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1200e+00 2.4760e+06 5.8315e+02 5.2974e+02 4.1747e-07 0.0000e+00 1.0000e+00 5.2974e+02 5.2974e+02 2.7058e+01 2.7058e+01 1.5280e-05 1.5280e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1220e+00 2.5156e+06 5.8315e+02 5.3850e+02 4.1107e-07 0.0000e+00 1.0000e+00 5.3850e+02 5.3850e+02 2.7505e+01 2.7505e+01 1.5291e-05 1.5291e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1240e+00 2.5552e+06 5.8315e+02 5.4727e+02 4.0486e-07 0.0000e+00 1.0000e+00 5.4727e+02 5.4727e+02 2.7953e+01 2.7953e+01 1.5302e-05 1.5302e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1260e+00 2.5948e+06 5.8315e+02 5.5605e+02 3.9884e-07 0.0000e+00 1.0000e+00 5.5605e+02 5.5605e+02 2.8401e+01 2.8401e+01 1.5313e-05 1.5313e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1280e+00 2.6344e+06 5.8315e+02 5.6483e+02 3.9300e-07 0.0000e+00 1.0000e+00 5.6483e+02 5.6483e+02 2.8850e+01 2.8850e+01 1.5324e-05 1.5324e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1300e+00 2.6740e+06 5.8315e+02 5.7363e+02 3.8733e-07 0.0000e+00 1.0000e+00 5.7363e+02 5.7363e+02 2.9299e+01 2.9299e+01 1.5335e-05 1.5335e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1320e+00 2.7136e+06 5.8315e+02 5.8243e+02 3.8183e-07 0.0000e+00 1.0000e+00 5.8243e+02 5.8243e+02 2.9749e+01 2.9749e+01 1.5346e-05 1.5346e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1340e+00 2.7532e+06 5.8315e+02 5.9124e+02 3.7648e-07 0.0000e+00 1.0000e+00 5.9124e+02 5.9124e+02 3.0199e+01 3.0199e+01 1.5358e-05 1.5358e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1360e+00 2.7928e+06 5.8315e+02 6.0006e+02 3.7128e-07 0.0000e+00 1.0000e+00 6.0006e+02 6.0006e+02 3.0649e+01 3.0649e+01 1.5369e-05 1.5369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1380e+00 2.8324e+06 5.8315e+02 6.0889e+02 3.6623e-07 0.0000e+00 1.0000e+00 6.0889e+02 6.0889e+02 3.1100e+01 3.1100e+01 1.5381e-05 1.5381e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1400e+00 2.8720e+06 5.8315e+02 6.1772e+02 3.6131e-07 0.0000e+00 1.0000e+00 6.1772e+02 6.1772e+02 3.1552e+01 3.1552e+01 1.5393e-05 1.5393e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1420e+00 2.9116e+06 5.8315e+02 6.2656e+02 3.5653e-07 0.0000e+00 1.0000e+00 6.2656e+02 6.2656e+02 3.2003e+01 3.2003e+01 1.5404e-05 1.5404e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1440e+00 2.9512e+06 5.8315e+02 6.3541e+02 3.5187e-07 0.0000e+00 1.0000e+00 6.3541e+02 6.3541e+02 3.2455e+01 3.2455e+01 1.5416e-05 1.5416e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1460e+00 2.9908e+06 5.8315e+02 6.4427e+02 3.4733e-07 0.0000e+00 1.0000e+00 6.4427e+02 6.4427e+02 3.2908e+01 3.2908e+01 1.5428e-05 1.5428e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1480e+00 3.0304e+06 5.8315e+02 6.5314e+02 3.4291e-07 0.0000e+00 1.0000e+00 6.5314e+02 6.5314e+02 3.3360e+01 3.3360e+01 1.5440e-05 1.5440e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1500e+00 3.0700e+06 5.8315e+02 6.6201e+02 3.3861e-07 0.0000e+00 1.0000e+00 6.6201e+02 6.6201e+02 3.3814e+01 3.3814e+01 1.5452e-05 1.5452e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1520e+00 3.1096e+06 5.8315e+02 6.7089e+02 3.3441e-07 0.0000e+00 1.0000e+00 6.7089e+02 6.7089e+02 3.4267e+01 3.4267e+01 1.5465e-05 1.5465e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1540e+00 3.1492e+06 5.8315e+02 6.7978e+02 3.3031e-07 0.0000e+00 1.0000e+00 6.7978e+02 6.7978e+02 3.4721e+01 3.4721e+01 1.5477e-05 1.5477e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1560e+00 3.1888e+06 5.8315e+02 6.8867e+02 3.2632e-07 0.0000e+00 1.0000e+00 6.8867e+02 6.8867e+02 3.5176e+01 3.5176e+01 1.5489e-05 1.5489e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1580e+00 3.2284e+06 5.8315e+02 6.9758e+02 3.2242e-07 0.0000e+00 1.0000e+00 6.9758e+02 6.9758e+02 3.5630e+01 3.5630e+01 1.5502e-05 1.5502e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1600e+00 3.2680e+06 5.8315e+02 7.0649e+02 3.1862e-07 0.0000e+00 1.0000e+00 7.0649e+02 7.0649e+02 3.6085e+01 3.6085e+01 1.5514e-05 1.5514e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1620e+00 3.3076e+06 5.8315e+02 7.1540e+02 3.1490e-07 0.0000e+00 1.0000e+00 7.1540e+02 7.1540e+02 3.6541e+01 3.6541e+01 1.5527e-05 1.5527e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1640e+00 3.3472e+06 5.8315e+02 7.2433e+02 3.1127e-07 0.0000e+00 1.0000e+00 7.2433e+02 7.2433e+02 3.6997e+01 3.6997e+01 1.5540e-05 1.5540e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1660e+00 3.3868e+06 5.8315e+02 7.3326e+02 3.0772e-07 0.0000e+00 1.0000e+00 7.3326e+02 7.3326e+02 3.7453e+01 3.7453e+01 1.5553e-05 1.5553e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1680e+00 3.4264e+06 5.8315e+02 7.4220e+02 3.0426e-07 0.0000e+00 1.0000e+00 7.4220e+02 7.4220e+02 3.7910e+01 3.7910e+01 1.5566e-05 1.5566e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1700e+00 3.4660e+06 5.8315e+02 7.5115e+02 3.0087e-07 0.0000e+00 1.0000e+00 7.5115e+02 7.5115e+02 3.8367e+01 3.8367e+01 1.5579e-05 1.5579e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1720e+00 3.5056e+06 5.8315e+02 7.6010e+02 2.9756e-07 0.0000e+00 1.0000e+00 7.6010e+02 7.6010e+02 3.8824e+01 3.8824e+01 1.5592e-05 1.5592e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1740e+00 3.5452e+06 5.8315e+02 7.6906e+02 2.9432e-07 0.0000e+00 1.0000e+00 7.6906e+02 7.6906e+02 3.9281e+01 3.9281e+01 1.5605e-05 1.5605e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1760e+00 3.5848e+06 5.8315e+02 7.7803e+02 2.9115e-07 0.0000e+00 1.0000e+00 7.7803e+02 7.7803e+02 3.9739e+01 3.9739e+01 1.5618e-05 1.5618e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1780e+00 3.6244e+06 5.8315e+02 7.8700e+02 2.8804e-07 0.0000e+00 1.0000e+00 7.8700e+02 7.8700e+02 4.0198e+01 4.0198e+01 1.5632e-05 1.5632e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1800e+00 3.6640e+06 5.8315e+02 7.9598e+02 2.8501e-07 0.0000e+00 1.0000e+00 7.9598e+02 7.9598e+02 4.0656e+01 4.0656e+01 1.5645e-05 1.5645e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1820e+00 3.7036e+06 5.8315e+02 8.0497e+02 2.8203e-07 0.0000e+00 1.0000e+00 8.0497e+02 8.0497e+02 4.1116e+01 4.1116e+01 1.5659e-05 1.5659e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1840e+00 3.7432e+06 5.8315e+02 8.1396e+02 2.7912e-07 0.0000e+00 1.0000e+00 8.1396e+02 8.1396e+02 4.1575e+01 4.1575e+01 1.5673e-05 1.5673e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1860e+00 3.7828e+06 5.8315e+02 8.2296e+02 2.7627e-07 0.0000e+00 1.0000e+00 8.2296e+02 8.2296e+02 4.2035e+01 4.2035e+01 1.5686e-05 1.5686e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1880e+00 3.8224e+06 5.8315e+02 8.3197e+02 2.7347e-07 0.0000e+00 1.0000e+00 8.3197e+02 8.3197e+02 4.2495e+01 4.2495e+01 1.5700e-05 1.5700e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1900e+00 3.8620e+06 5.8315e+02 8.4098e+02 2.7073e-07 0.0000e+00 1.0000e+00 8.4098e+02 8.4098e+02 4.2955e+01 4.2955e+01 1.5714e-05 1.5714e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1920e+00 3.9016e+06 5.8315e+02 8.5000e+02 2.6805e-07 0.0000e+00 1.0000e+00 8.5000e+02 8.5000e+02 4.3416e+01 4.3416e+01 1.5728e-05 1.5728e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1940e+00 3.9412e+06 5.8315e+02 8.5902e+02 2.6541e-07 0.0000e+00 1.0000e+00 8.5902e+02 8.5902e+02 4.3877e+01 4.3877e+01 1.5742e-05 1.5742e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1960e+00 3.9808e+06 5.8315e+02 8.6806e+02 2.6283e-07 0.0000e+00 1.0000e+00 8.6806e+02 8.6806e+02 4.4338e+01 4.4338e+01 1.5757e-05 1.5757e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.1980e+00 4.0204e+06 5.8315e+02 8.7709e+02 2.6030e-07 0.0000e+00 1.0000e+00 8.7709e+02 8.7709e+02 4.4800e+01 4.4800e+01 1.5771e-05 1.5771e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2000e+00 4.0600e+06 5.8315e+02 8.8614e+02 2.5781e-07 0.0000e+00 1.0000e+00 8.8614e+02 8.8614e+02 4.5262e+01 4.5262e+01 1.5785e-05 1.5785e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2020e+00 4.0996e+06 5.8315e+02 8.9519e+02 2.5538e-07 0.0000e+00 1.0000e+00 8.9519e+02 8.9519e+02 4.5724e+01 4.5724e+01 1.5800e-05 1.5800e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2040e+00 4.1392e+06 5.8315e+02 9.0424e+02 2.5298e-07 0.0000e+00 1.0000e+00 9.0424e+02 9.0424e+02 4.6186e+01 4.6186e+01 1.5815e-05 1.5815e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2060e+00 4.1788e+06 5.8315e+02 9.1330e+02 2.5063e-07 0.0000e+00 1.0000e+00 9.1330e+02 9.1330e+02 4.6649e+01 4.6649e+01 1.5829e-05 1.5829e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2080e+00 4.2184e+06 5.8315e+02 9.2237e+02 2.4833e-07 0.0000e+00 1.0000e+00 9.2237e+02 9.2237e+02 4.7112e+01 4.7112e+01 1.5844e-05 1.5844e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2100e+00 4.2580e+06 5.8315e+02 9.3145e+02 2.4606e-07 0.0000e+00 1.0000e+00 9.3145e+02 9.3145e+02 4.7576e+01 4.7576e+01 1.5859e-05 1.5859e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2120e+00 4.2976e+06 5.8315e+02 9.4052e+02 2.4384e-07 0.0000e+00 1.0000e+00 9.4052e+02 9.4052e+02 4.8039e+01 4.8039e+01 1.5874e-05 1.5874e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2140e+00 4.3372e+06 5.8315e+02 9.4961e+02 2.4165e-07 0.0000e+00 1.0000e+00 9.4961e+02 9.4961e+02 4.8503e+01 4.8503e+01 1.5889e-05 1.5889e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2160e+00 4.3768e+06 5.8315e+02 9.5870e+02 2.3951e-07 0.0000e+00 1.0000e+00 9.5870e+02 9.5870e+02 4.8968e+01 4.8968e+01 1.5905e-05 1.5905e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2180e+00 4.4164e+06 5.8315e+02 9.6779e+02 2.3740e-07 0.0000e+00 1.0000e+00 9.6779e+02 9.6779e+02 4.9432e+01 4.9432e+01 1.5920e-05 1.5920e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2200e+00 4.4560e+06 5.8315e+02 9.7690e+02 2.3532e-07 0.0000e+00 1.0000e+00 9.7690e+02 9.7690e+02 4.9897e+01 4.9897e+01 1.5935e-05 1.5935e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2220e+00 4.4956e+06 5.8315e+02 9.8600e+02 2.3328e-07 0.0000e+00 1.0000e+00 9.8600e+02 9.8600e+02 5.0362e+01 5.0362e+01 1.5951e-05 1.5951e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2240e+00 4.5352e+06 5.8315e+02 9.9511e+02 2.3128e-07 0.0000e+00 1.0000e+00 9.9511e+02 9.9511e+02 5.0828e+01 5.0828e+01 1.5966e-05 1.5966e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2260e+00 4.5748e+06 5.8315e+02 1.0042e+03 2.2931e-07 0.0000e+00 1.0000e+00 1.0042e+03 1.0042e+03 5.1293e+01 5.1293e+01 1.5982e-05 1.5982e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2280e+00 4.6144e+06 5.8315e+02 1.0134e+03 2.2737e-07 0.0000e+00 1.0000e+00 1.0134e+03 1.0134e+03 5.1759e+01 5.1759e+01 1.5998e-05 1.5998e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2300e+00 4.6540e+06 5.8315e+02 1.0225e+03 2.2546e-07 0.0000e+00 1.0000e+00 1.0225e+03 1.0225e+03 5.2225e+01 5.2225e+01 1.6014e-05 1.6014e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2320e+00 4.6936e+06 5.8315e+02 1.0316e+03 2.2358e-07 0.0000e+00 1.0000e+00 1.0316e+03 1.0316e+03 5.2692e+01 5.2692e+01 1.6030e-05 1.6030e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2340e+00 4.7332e+06 5.8315e+02 1.0407e+03 2.2174e-07 0.0000e+00 1.0000e+00 1.0407e+03 1.0407e+03 5.3158e+01 5.3158e+01 1.6046e-05 1.6046e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2360e+00 4.7728e+06 5.8315e+02 1.0499e+03 2.1992e-07 0.0000e+00 1.0000e+00 1.0499e+03 1.0499e+03 5.3625e+01 5.3625e+01 1.6062e-05 1.6062e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2380e+00 4.8124e+06 5.8315e+02 1.0590e+03 2.1813e-07 0.0000e+00 1.0000e+00 1.0590e+03 1.0590e+03 5.4092e+01 5.4092e+01 1.6078e-05 1.6078e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2400e+00 4.8520e+06 5.8315e+02 1.0682e+03 2.1637e-07 0.0000e+00 1.0000e+00 1.0682e+03 1.0682e+03 5.4560e+01 5.4560e+01 1.6095e-05 1.6095e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2420e+00 4.8916e+06 5.8315e+02 1.0773e+03 2.1464e-07 0.0000e+00 1.0000e+00 1.0773e+03 1.0773e+03 5.5027e+01 5.5027e+01 1.6111e-05 1.6111e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2440e+00 4.9312e+06 5.8315e+02 1.0865e+03 2.1293e-07 0.0000e+00 1.0000e+00 1.0865e+03 1.0865e+03 5.5495e+01 5.5495e+01 1.6128e-05 1.6128e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2460e+00 4.9708e+06 5.8315e+02 1.0957e+03 2.1125e-07 0.0000e+00 1.0000e+00 1.0957e+03 1.0957e+03 5.5963e+01 5.5963e+01 1.6144e-05 1.6144e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2480e+00 5.0104e+06 5.8315e+02 1.1048e+03 2.0959e-07 0.0000e+00 1.0000e+00 1.1048e+03 1.1048e+03 5.6432e+01 5.6432e+01 1.6161e-05 1.6161e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2500e+00 5.0500e+06 5.8315e+02 1.1140e+03 2.0796e-07 0.0000e+00 1.0000e+00 1.1140e+03 1.1140e+03 5.6900e+01 5.6900e+01 1.6178e-05 1.6178e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2520e+00 5.0896e+06 5.8315e+02 1.1232e+03 2.0636e-07 0.0000e+00 1.0000e+00 1.1232e+03 1.1232e+03 5.7369e+01 5.7369e+01 1.6195e-05 1.6195e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2540e+00 5.1292e+06 5.8315e+02 1.1324e+03 2.0477e-07 0.0000e+00 1.0000e+00 1.1324e+03 1.1324e+03 5.7838e+01 5.7838e+01 1.6212e-05 1.6212e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2560e+00 5.1688e+06 5.8315e+02 1.1415e+03 2.0321e-07 0.0000e+00 1.0000e+00 1.1415e+03 1.1415e+03 5.8307e+01 5.8307e+01 1.6229e-05 1.6229e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2580e+00 5.2084e+06 5.8315e+02 1.1507e+03 2.0167e-07 0.0000e+00 1.0000e+00 1.1507e+03 1.1507e+03 5.8776e+01 5.8776e+01 1.6247e-05 1.6247e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2600e+00 5.2480e+06 5.8315e+02 1.1599e+03 2.0016e-07 0.0000e+00 1.0000e+00 1.1599e+03 1.1599e+03 5.9246e+01 5.9246e+01 1.6264e-05 1.6264e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2620e+00 5.2876e+06 5.8315e+02 1.1691e+03 1.9866e-07 0.0000e+00 1.0000e+00 1.1691e+03 1.1691e+03 5.9715e+01 5.9715e+01 1.6281e-05 1.6281e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2640e+00 5.3272e+06 5.8315e+02 1.1783e+03 1.9719e-07 0.0000e+00 1.0000e+00 1.1783e+03 1.1783e+03 6.0185e+01 6.0185e+01 1.6299e-05 1.6299e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2660e+00 5.3668e+06 5.8315e+02 1.1875e+03 1.9573e-07 0.0000e+00 1.0000e+00 1.1875e+03 1.1875e+03 6.0655e+01 6.0655e+01 1.6317e-05 1.6317e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2680e+00 5.4064e+06 5.8315e+02 1.1967e+03 1.9430e-07 0.0000e+00 1.0000e+00 1.1967e+03 1.1967e+03 6.1125e+01 6.1125e+01 1.6334e-05 1.6334e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2700e+00 5.4460e+06 5.8315e+02 1.2059e+03 1.9289e-07 0.0000e+00 1.0000e+00 1.2059e+03 1.2059e+03 6.1596e+01 6.1596e+01 1.6352e-05 1.6352e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2720e+00 5.4856e+06 5.8315e+02 1.2151e+03 1.9149e-07 0.0000e+00 1.0000e+00 1.2151e+03 1.2151e+03 6.2066e+01 6.2066e+01 1.6370e-05 1.6370e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2740e+00 5.5252e+06 5.8315e+02 1.2244e+03 1.9011e-07 0.0000e+00 1.0000e+00 1.2244e+03 1.2244e+03 6.2537e+01 6.2537e+01 1.6388e-05 1.6388e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2760e+00 5.5648e+06 5.8315e+02 1.2336e+03 1.8876e-07 0.0000e+00 1.0000e+00 1.2336e+03 1.2336e+03 6.3008e+01 6.3008e+01 1.6407e-05 1.6407e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2780e+00 5.6044e+06 5.8315e+02 1.2428e+03 1.8742e-07 0.0000e+00 1.0000e+00 1.2428e+03 1.2428e+03 6.3479e+01 6.3479e+01 1.6425e-05 1.6425e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2800e+00 5.6440e+06 5.8315e+02 1.2520e+03 1.8609e-07 0.0000e+00 1.0000e+00 1.2520e+03 1.2520e+03 6.3950e+01 6.3950e+01 1.6443e-05 1.6443e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2820e+00 5.6836e+06 5.8315e+02 1.2613e+03 1.8479e-07 0.0000e+00 1.0000e+00 1.2613e+03 1.2613e+03 6.4422e+01 6.4422e+01 1.6462e-05 1.6462e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2840e+00 5.7232e+06 5.8315e+02 1.2705e+03 1.8350e-07 0.0000e+00 1.0000e+00 1.2705e+03 1.2705e+03 6.4893e+01 6.4893e+01 1.6480e-05 1.6480e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2860e+00 5.7628e+06 5.8315e+02 1.2797e+03 1.8223e-07 0.0000e+00 1.0000e+00 1.2797e+03 1.2797e+03 6.5365e+01 6.5365e+01 1.6499e-05 1.6499e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2880e+00 5.8024e+06 5.8315e+02 1.2890e+03 1.8097e-07 0.0000e+00 1.0000e+00 1.2890e+03 1.2890e+03 6.5836e+01 6.5836e+01 1.6518e-05 1.6518e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2900e+00 5.8420e+06 5.8315e+02 1.2982e+03 1.7973e-07 0.0000e+00 1.0000e+00 1.2982e+03 1.2982e+03 6.6308e+01 6.6308e+01 1.6537e-05 1.6537e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2920e+00 5.8816e+06 5.8315e+02 1.3074e+03 1.7851e-07 0.0000e+00 1.0000e+00 1.3074e+03 1.3074e+03 6.6780e+01 6.6780e+01 1.6556e-05 1.6556e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2940e+00 5.9212e+06 5.8315e+02 1.3167e+03 1.7730e-07 0.0000e+00 1.0000e+00 1.3167e+03 1.3167e+03 6.7252e+01 6.7252e+01 1.6575e-05 1.6575e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2960e+00 5.9608e+06 5.8315e+02 1.3259e+03 1.7611e-07 0.0000e+00 1.0000e+00 1.3259e+03 1.3259e+03 6.7725e+01 6.7725e+01 1.6594e-05 1.6594e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.2980e+00 6.0004e+06 5.8315e+02 1.3352e+03 1.7493e-07 0.0000e+00 1.0000e+00 1.3352e+03 1.3352e+03 6.8197e+01 6.8197e+01 1.6613e-05 1.6613e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3000e+00 6.0400e+06 5.8315e+02 1.3444e+03 1.7376e-07 0.0000e+00 1.0000e+00 1.3444e+03 1.3444e+03 6.8670e+01 6.8670e+01 1.6632e-05 1.6632e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3020e+00 6.0796e+06 5.8315e+02 1.3537e+03 1.7261e-07 0.0000e+00 1.0000e+00 1.3537e+03 1.3537e+03 6.9142e+01 6.9142e+01 1.6652e-05 1.6652e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3040e+00 6.1192e+06 5.8315e+02 1.3629e+03 1.7147e-07 0.0000e+00 1.0000e+00 1.3629e+03 1.3629e+03 6.9615e+01 6.9615e+01 1.6672e-05 1.6672e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3060e+00 6.1588e+06 5.8315e+02 1.3722e+03 1.7035e-07 0.0000e+00 1.0000e+00 1.3722e+03 1.3722e+03 7.0088e+01 7.0088e+01 1.6691e-05 1.6691e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3080e+00 6.1984e+06 5.8315e+02 1.3814e+03 1.6924e-07 0.0000e+00 1.0000e+00 1.3814e+03 1.3814e+03 7.0560e+01 7.0560e+01 1.6711e-05 1.6711e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3100e+00 6.2380e+06 5.8315e+02 1.3907e+03 1.6814e-07 0.0000e+00 1.0000e+00 1.3907e+03 1.3907e+03 7.1033e+01 7.1033e+01 1.6731e-05 1.6731e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3120e+00 6.2776e+06 5.8315e+02 1.4000e+03 1.6705e-07 0.0000e+00 1.0000e+00 1.4000e+03 1.4000e+03 7.1506e+01 7.1506e+01 1.6751e-05 1.6751e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3140e+00 6.3172e+06 5.8315e+02 1.4092e+03 1.6598e-07 0.0000e+00 1.0000e+00 1.4092e+03 1.4092e+03 7.1979e+01 7.1979e+01 1.6771e-05 1.6771e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3160e+00 6.3568e+06 5.8315e+02 1.4185e+03 1.6492e-07 0.0000e+00 1.0000e+00 1.4185e+03 1.4185e+03 7.2452e+01 7.2452e+01 1.6791e-05 1.6791e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3180e+00 6.3964e+06 5.8315e+02 1.4278e+03 1.6387e-07 0.0000e+00 1.0000e+00 1.4278e+03 1.4278e+03 7.2926e+01 7.2926e+01 1.6811e-05 1.6811e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3200e+00 6.4360e+06 5.8315e+02 1.4370e+03 1.6283e-07 0.0000e+00 1.0000e+00 1.4370e+03 1.4370e+03 7.3399e+01 7.3399e+01 1.6832e-05 1.6832e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3220e+00 6.4756e+06 5.8315e+02 1.4463e+03 1.6181e-07 0.0000e+00 1.0000e+00 1.4463e+03 1.4463e+03 7.3872e+01 7.3872e+01 1.6852e-05 1.6852e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3240e+00 6.5152e+06 5.8315e+02 1.4556e+03 1.6079e-07 0.0000e+00 1.0000e+00 1.4556e+03 1.4556e+03 7.4346e+01 7.4346e+01 1.6873e-05 1.6873e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3260e+00 6.5548e+06 5.8315e+02 1.4648e+03 1.5979e-07 0.0000e+00 1.0000e+00 1.4648e+03 1.4648e+03 7.4819e+01 7.4819e+01 1.6894e-05 1.6894e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.3280e+00 6.5944e+06 5.8315e+02 1.4744e+03 1.7389e-07 6.4830e-04 9.9935e-01 3.1394e+03 1.4739e+03 4.0136e+02 7.5255e+01 4.8988e-05 1.6914e-05 3.3032e-03 7.1578e-04 1.5935e-01 4.8016e-02 4.6664e-02 3.0592e-02 1.7667e-02 1.6140e-02 6.7755e-01 9.0015e-03 3.0006e-03 5.3480e-01 1.1462e-01 8.7911e-02 4.5604e-02 2.0901e-02 1.5100e-02 1.6907e-01 +1.3300e+00 6.6340e+06 5.8315e+02 1.4846e+03 1.7240e-07 2.2825e-03 9.9772e-01 3.1426e+03 1.4828e+03 4.0095e+02 7.5633e+01 4.8940e-05 1.6935e-05 3.3231e-03 7.2092e-04 1.6040e-01 4.8286e-02 4.6894e-02 3.0721e-02 1.7728e-02 1.6184e-02 6.7574e-01 9.0052e-03 3.0021e-03 5.3504e-01 1.1466e-01 8.7938e-02 4.5614e-02 2.0903e-02 1.5099e-02 1.6874e-01 +1.3320e+00 6.6736e+06 5.8315e+02 1.4947e+03 1.7094e-07 3.8852e-03 9.9611e-01 3.1458e+03 1.4917e+03 4.0054e+02 7.6012e+01 4.8891e-05 1.6955e-05 3.3430e-03 7.2607e-04 1.6145e-01 4.8556e-02 4.7123e-02 3.0849e-02 1.7790e-02 1.6228e-02 6.7393e-01 9.0088e-03 3.0035e-03 5.3528e-01 1.1470e-01 8.7964e-02 4.5623e-02 2.0905e-02 1.5098e-02 1.6841e-01 +1.3340e+00 6.7132e+06 5.8315e+02 1.5048e+03 1.6950e-07 5.4569e-03 9.9454e-01 3.1490e+03 1.5005e+03 4.0013e+02 7.6392e+01 4.8843e-05 1.6976e-05 3.3628e-03 7.3123e-04 1.6250e-01 4.8825e-02 4.7351e-02 3.0977e-02 1.7850e-02 1.6271e-02 6.7213e-01 9.0124e-03 3.0050e-03 5.3552e-01 1.1474e-01 8.7989e-02 4.5632e-02 2.0907e-02 1.5097e-02 1.6809e-01 +1.3360e+00 6.7528e+06 5.8315e+02 1.5149e+03 1.6809e-07 6.9981e-03 9.9300e-01 3.1523e+03 1.5094e+03 3.9972e+02 7.6772e+01 4.8794e-05 1.6997e-05 3.3827e-03 7.3640e-04 1.6355e-01 4.9094e-02 4.7579e-02 3.1104e-02 1.7911e-02 1.6313e-02 6.7033e-01 9.0159e-03 3.0064e-03 5.3575e-01 1.1479e-01 8.8014e-02 4.5641e-02 2.0908e-02 1.5097e-02 1.6778e-01 +1.3380e+00 6.7924e+06 5.8315e+02 1.5250e+03 1.6669e-07 8.5092e-03 9.9149e-01 3.1555e+03 1.5183e+03 3.9931e+02 7.7153e+01 4.8746e-05 1.7017e-05 3.4025e-03 7.4158e-04 1.6460e-01 4.9363e-02 4.7806e-02 3.1230e-02 1.7970e-02 1.6355e-02 6.6853e-01 9.0193e-03 3.0078e-03 5.3598e-01 1.1482e-01 8.8038e-02 4.5650e-02 2.0910e-02 1.5096e-02 1.6748e-01 +1.3400e+00 6.8320e+06 5.8315e+02 1.5350e+03 1.6531e-07 9.9906e-03 9.9001e-01 3.1587e+03 1.5271e+03 3.9889e+02 7.7535e+01 4.8697e-05 1.7038e-05 3.4224e-03 7.4676e-04 1.6566e-01 4.9631e-02 4.8032e-02 3.1356e-02 1.8029e-02 1.6397e-02 6.6673e-01 9.0226e-03 3.0091e-03 5.3620e-01 1.1486e-01 8.8062e-02 4.5658e-02 2.0912e-02 1.5095e-02 1.6718e-01 +1.3420e+00 6.8716e+06 5.8315e+02 1.5451e+03 1.6395e-07 1.1443e-02 9.8856e-01 3.1619e+03 1.5360e+03 3.9848e+02 7.7918e+01 4.8648e-05 1.7059e-05 3.4422e-03 7.5195e-04 1.6671e-01 4.9898e-02 4.8257e-02 3.1481e-02 1.8088e-02 1.6438e-02 6.6494e-01 9.0259e-03 3.0105e-03 5.3641e-01 1.1490e-01 8.8085e-02 4.5666e-02 2.0913e-02 1.5094e-02 1.6689e-01 +1.3440e+00 6.9112e+06 5.8315e+02 1.5551e+03 1.6261e-07 1.2866e-02 9.8713e-01 3.1651e+03 1.5449e+03 3.9806e+02 7.8301e+01 4.8599e-05 1.7079e-05 3.4619e-03 7.5715e-04 1.6776e-01 5.0165e-02 4.8481e-02 3.1605e-02 1.8146e-02 1.6478e-02 6.6315e-01 9.0291e-03 3.0118e-03 5.3663e-01 1.1494e-01 8.8107e-02 4.5674e-02 2.0914e-02 1.5093e-02 1.6661e-01 +1.3460e+00 6.9508e+06 5.8315e+02 1.5651e+03 1.6129e-07 1.4261e-02 9.8574e-01 3.1683e+03 1.5537e+03 3.9765e+02 7.8685e+01 4.8549e-05 1.7100e-05 3.4817e-03 7.6235e-04 1.6881e-01 5.0431e-02 4.8705e-02 3.1728e-02 1.8204e-02 1.6519e-02 6.6136e-01 9.0322e-03 3.0131e-03 5.3684e-01 1.1497e-01 8.8129e-02 4.5681e-02 2.0916e-02 1.5092e-02 1.6633e-01 +1.3480e+00 6.9904e+06 5.8315e+02 1.5751e+03 1.5999e-07 1.5628e-02 9.8437e-01 3.1716e+03 1.5626e+03 3.9723e+02 7.9070e+01 4.8500e-05 1.7121e-05 3.5014e-03 7.6757e-04 1.6986e-01 5.0697e-02 4.8927e-02 3.1851e-02 1.8261e-02 1.6558e-02 6.5957e-01 9.0353e-03 3.0143e-03 5.3704e-01 1.1501e-01 8.8150e-02 4.5688e-02 2.0917e-02 1.5091e-02 1.6605e-01 +1.3500e+00 7.0300e+06 5.8315e+02 1.5851e+03 1.5870e-07 1.6968e-02 9.8303e-01 3.1748e+03 1.5715e+03 3.9682e+02 7.9456e+01 4.8450e-05 1.7142e-05 3.5212e-03 7.7279e-04 1.7091e-01 5.0963e-02 4.9149e-02 3.1973e-02 1.8318e-02 1.6597e-02 6.5779e-01 9.0383e-03 3.0156e-03 5.3724e-01 1.1504e-01 8.8171e-02 4.5695e-02 2.0918e-02 1.5090e-02 1.6579e-01 +1.3520e+00 7.0696e+06 5.8315e+02 1.5950e+03 1.5744e-07 1.8280e-02 9.8172e-01 3.1780e+03 1.5804e+03 3.9640e+02 7.9843e+01 4.8400e-05 1.7162e-05 3.5409e-03 7.7802e-04 1.7197e-01 5.1227e-02 4.9370e-02 3.2094e-02 1.8374e-02 1.6636e-02 6.5601e-01 9.0412e-03 3.0168e-03 5.3744e-01 1.1508e-01 8.8191e-02 4.5702e-02 2.0919e-02 1.5088e-02 1.6553e-01 +1.3540e+00 7.1092e+06 5.8315e+02 1.6050e+03 1.5619e-07 1.9565e-02 9.8043e-01 3.1812e+03 1.5892e+03 3.9598e+02 8.0230e+01 4.8350e-05 1.7183e-05 3.5606e-03 7.8326e-04 1.7302e-01 5.1492e-02 4.9591e-02 3.2215e-02 1.8430e-02 1.6674e-02 6.5423e-01 9.0440e-03 3.0179e-03 5.3763e-01 1.1511e-01 8.8210e-02 4.5708e-02 2.0920e-02 1.5087e-02 1.6527e-01 +1.3560e+00 7.1488e+06 5.8315e+02 1.6149e+03 1.5496e-07 2.0824e-02 9.7918e-01 3.1844e+03 1.5981e+03 3.9556e+02 8.0618e+01 4.8300e-05 1.7204e-05 3.5802e-03 7.8850e-04 1.7407e-01 5.1756e-02 4.9810e-02 3.2334e-02 1.8485e-02 1.6711e-02 6.5246e-01 9.0468e-03 3.0191e-03 5.3781e-01 1.1514e-01 8.8229e-02 4.5715e-02 2.0921e-02 1.5086e-02 1.6503e-01 +1.3580e+00 7.1884e+06 5.8315e+02 1.6248e+03 1.5374e-07 2.2057e-02 9.7794e-01 3.1876e+03 1.6070e+03 3.9514e+02 8.1007e+01 4.8249e-05 1.7225e-05 3.5999e-03 7.9375e-04 1.7513e-01 5.2019e-02 5.0029e-02 3.2454e-02 1.8540e-02 1.6749e-02 6.5069e-01 9.0495e-03 3.0202e-03 5.3800e-01 1.1517e-01 8.8247e-02 4.5721e-02 2.0922e-02 1.5085e-02 1.6478e-01 +1.3600e+00 7.2280e+06 5.8315e+02 1.6347e+03 1.5254e-07 2.3264e-02 9.7674e-01 3.1909e+03 1.6159e+03 3.9472e+02 8.1397e+01 4.8199e-05 1.7246e-05 3.6195e-03 7.9902e-04 1.7618e-01 5.2282e-02 5.0247e-02 3.2572e-02 1.8594e-02 1.6785e-02 6.4892e-01 9.0522e-03 3.0213e-03 5.3818e-01 1.1520e-01 8.8265e-02 4.5726e-02 2.0922e-02 1.5084e-02 1.6455e-01 +1.3620e+00 7.2676e+06 5.8315e+02 1.6445e+03 1.5136e-07 2.4445e-02 9.7556e-01 3.1941e+03 1.6248e+03 3.9430e+02 8.1788e+01 4.8148e-05 1.7267e-05 3.6391e-03 8.0429e-04 1.7724e-01 5.2545e-02 5.0464e-02 3.2690e-02 1.8648e-02 1.6821e-02 6.4715e-01 9.0548e-03 3.0224e-03 5.3835e-01 1.1523e-01 8.8283e-02 4.5732e-02 2.0923e-02 1.5082e-02 1.6432e-01 +1.3640e+00 7.3072e+06 5.8315e+02 1.6544e+03 1.5019e-07 2.5601e-02 9.7440e-01 3.1973e+03 1.6337e+03 3.9388e+02 8.2179e+01 4.8097e-05 1.7288e-05 3.6587e-03 8.0956e-04 1.7829e-01 5.2807e-02 5.0680e-02 3.2807e-02 1.8702e-02 1.6857e-02 6.4539e-01 9.0573e-03 3.0235e-03 5.3852e-01 1.1526e-01 8.8299e-02 4.5737e-02 2.0924e-02 1.5081e-02 1.6409e-01 +1.3660e+00 7.3468e+06 5.8315e+02 1.6642e+03 1.4904e-07 2.6732e-02 9.7327e-01 3.2005e+03 1.6425e+03 3.9345e+02 8.2571e+01 4.8046e-05 1.7309e-05 3.6783e-03 8.1485e-04 1.7935e-01 5.3068e-02 5.0895e-02 3.2923e-02 1.8755e-02 1.6892e-02 6.4363e-01 9.0598e-03 3.0245e-03 5.3869e-01 1.1529e-01 8.8316e-02 4.5742e-02 2.0924e-02 1.5080e-02 1.6387e-01 +1.3680e+00 7.3864e+06 5.8315e+02 1.6740e+03 1.4790e-07 2.7838e-02 9.7216e-01 3.2037e+03 1.6514e+03 3.9303e+02 8.2964e+01 4.7995e-05 1.7331e-05 3.6978e-03 8.2015e-04 1.8040e-01 5.3329e-02 5.1110e-02 3.3039e-02 1.8807e-02 1.6927e-02 6.4187e-01 9.0622e-03 3.0256e-03 5.3885e-01 1.1532e-01 8.8331e-02 4.5747e-02 2.0925e-02 1.5079e-02 1.6366e-01 +1.3700e+00 7.4260e+06 5.8315e+02 1.6838e+03 1.4678e-07 2.8920e-02 9.7108e-01 3.2069e+03 1.6603e+03 3.9261e+02 8.3358e+01 4.7943e-05 1.7352e-05 3.7174e-03 8.2545e-04 1.8146e-01 5.3590e-02 5.1324e-02 3.3154e-02 1.8859e-02 1.6962e-02 6.4011e-01 9.0645e-03 3.0266e-03 5.3901e-01 1.1535e-01 8.8347e-02 4.5752e-02 2.0925e-02 1.5077e-02 1.6345e-01 +1.3720e+00 7.4656e+06 5.8315e+02 1.6936e+03 1.4568e-07 2.9978e-02 9.7002e-01 3.2101e+03 1.6692e+03 3.9218e+02 8.3753e+01 4.7892e-05 1.7373e-05 3.7369e-03 8.3076e-04 1.8251e-01 5.3850e-02 5.1537e-02 3.3268e-02 1.8911e-02 1.6996e-02 6.3836e-01 9.0668e-03 3.0275e-03 5.3917e-01 1.1537e-01 8.8362e-02 4.5757e-02 2.0925e-02 1.5076e-02 1.6325e-01 +1.3740e+00 7.5052e+06 5.8315e+02 1.7034e+03 1.4459e-07 3.1012e-02 9.6899e-01 3.2134e+03 1.6781e+03 3.9175e+02 8.4149e+01 4.7840e-05 1.7394e-05 3.7564e-03 8.3608e-04 1.8357e-01 5.4109e-02 5.1749e-02 3.3382e-02 1.8962e-02 1.7029e-02 6.3661e-01 9.0690e-03 3.0285e-03 5.3932e-01 1.1540e-01 8.8376e-02 4.5761e-02 2.0926e-02 1.5075e-02 1.6305e-01 +1.3760e+00 7.5448e+06 5.8315e+02 1.7131e+03 1.4351e-07 3.2022e-02 9.6798e-01 3.2166e+03 1.6870e+03 3.9133e+02 8.4545e+01 4.7788e-05 1.7416e-05 3.7759e-03 8.4141e-04 1.8463e-01 5.4368e-02 5.1961e-02 3.3495e-02 1.9013e-02 1.7062e-02 6.3486e-01 9.0712e-03 3.0294e-03 5.3947e-01 1.1542e-01 8.8390e-02 4.5765e-02 2.0926e-02 1.5073e-02 1.6285e-01 +1.3780e+00 7.5844e+06 5.8315e+02 1.7228e+03 1.4244e-07 3.3009e-02 9.6699e-01 3.2198e+03 1.6959e+03 3.9090e+02 8.4943e+01 4.7736e-05 1.7437e-05 3.7954e-03 8.4675e-04 1.8568e-01 5.4627e-02 5.2172e-02 3.3607e-02 1.9063e-02 1.7095e-02 6.3311e-01 9.0733e-03 3.0303e-03 5.3962e-01 1.1544e-01 8.8403e-02 4.5769e-02 2.0926e-02 1.5072e-02 1.6267e-01 +1.3800e+00 7.6240e+06 5.8315e+02 1.7325e+03 1.4139e-07 3.3973e-02 9.6603e-01 3.2230e+03 1.7048e+03 3.9047e+02 8.5341e+01 4.7684e-05 1.7459e-05 3.8148e-03 8.5209e-04 1.8674e-01 5.4885e-02 5.2382e-02 3.3719e-02 1.9113e-02 1.7127e-02 6.3137e-01 9.0753e-03 3.0312e-03 5.3976e-01 1.1547e-01 8.8416e-02 4.5773e-02 2.0926e-02 1.5071e-02 1.6248e-01 +1.3820e+00 7.6636e+06 5.8315e+02 1.7422e+03 1.4036e-07 3.4914e-02 9.6509e-01 3.2262e+03 1.7137e+03 3.9004e+02 8.5740e+01 4.7631e-05 1.7480e-05 3.8343e-03 8.5745e-04 1.8780e-01 5.5143e-02 5.2591e-02 3.3830e-02 1.9162e-02 1.7158e-02 6.2962e-01 9.0773e-03 3.0321e-03 5.3989e-01 1.1549e-01 8.8429e-02 4.5776e-02 2.0926e-02 1.5069e-02 1.6231e-01 +1.3840e+00 7.7032e+06 5.8315e+02 1.7519e+03 1.3933e-07 3.5833e-02 9.6417e-01 3.2294e+03 1.7226e+03 3.8961e+02 8.6140e+01 4.7579e-05 1.7502e-05 3.8537e-03 8.6281e-04 1.8886e-01 5.5400e-02 5.2799e-02 3.3940e-02 1.9211e-02 1.7190e-02 6.2789e-01 9.0793e-03 3.0329e-03 5.4003e-01 1.1551e-01 8.8441e-02 4.5780e-02 2.0926e-02 1.5068e-02 1.6213e-01 +1.3860e+00 7.7428e+06 5.8315e+02 1.7616e+03 1.3832e-07 3.6728e-02 9.6327e-01 3.2326e+03 1.7315e+03 3.8918e+02 8.6541e+01 4.7526e-05 1.7523e-05 3.8731e-03 8.6818e-04 1.8992e-01 5.5657e-02 5.3007e-02 3.4050e-02 1.9259e-02 1.7221e-02 6.2615e-01 9.0812e-03 3.0337e-03 5.4016e-01 1.1553e-01 8.8452e-02 4.5783e-02 2.0926e-02 1.5066e-02 1.6197e-01 +1.3880e+00 7.7824e+06 5.8315e+02 1.7712e+03 1.3733e-07 3.7602e-02 9.6240e-01 3.2358e+03 1.7404e+03 3.8875e+02 8.6943e+01 4.7473e-05 1.7545e-05 3.8925e-03 8.7356e-04 1.9098e-01 5.5913e-02 5.3214e-02 3.4159e-02 1.9307e-02 1.7251e-02 6.2441e-01 9.0830e-03 3.0345e-03 5.4028e-01 1.1555e-01 8.8464e-02 4.5786e-02 2.0926e-02 1.5065e-02 1.6180e-01 +1.3900e+00 7.8220e+06 5.8315e+02 1.7808e+03 1.3634e-07 3.8454e-02 9.6155e-01 3.2391e+03 1.7493e+03 3.8832e+02 8.7346e+01 4.7420e-05 1.7567e-05 3.9118e-03 8.7895e-04 1.9204e-01 5.6169e-02 5.3420e-02 3.4267e-02 1.9355e-02 1.7281e-02 6.2268e-01 9.0847e-03 3.0353e-03 5.4041e-01 1.1557e-01 8.8474e-02 4.5789e-02 2.0926e-02 1.5064e-02 1.6165e-01 +1.3920e+00 7.8616e+06 5.8315e+02 1.7904e+03 1.3537e-07 3.9284e-02 9.6072e-01 3.2423e+03 1.7582e+03 3.8788e+02 8.7750e+01 4.7367e-05 1.7589e-05 3.9312e-03 8.8435e-04 1.9310e-01 5.6424e-02 5.3625e-02 3.4375e-02 1.9402e-02 1.7311e-02 6.2095e-01 9.0865e-03 3.0361e-03 5.4053e-01 1.1559e-01 8.8485e-02 4.5791e-02 2.0926e-02 1.5062e-02 1.6149e-01 +1.3940e+00 7.9012e+06 5.8315e+02 1.8000e+03 1.3441e-07 4.0092e-02 9.5991e-01 3.2455e+03 1.7671e+03 3.8745e+02 8.8154e+01 4.7313e-05 1.7611e-05 3.9505e-03 8.8976e-04 1.9416e-01 5.6679e-02 5.3830e-02 3.4482e-02 1.9449e-02 1.7340e-02 6.1922e-01 9.0881e-03 3.0368e-03 5.4064e-01 1.1561e-01 8.8495e-02 4.5794e-02 2.0925e-02 1.5061e-02 1.6135e-01 +1.3960e+00 7.9408e+06 5.8315e+02 1.8096e+03 1.3346e-07 4.0878e-02 9.5912e-01 3.2487e+03 1.7761e+03 3.8701e+02 8.8560e+01 4.7260e-05 1.7633e-05 3.9698e-03 8.9518e-04 1.9522e-01 5.6934e-02 5.4034e-02 3.4589e-02 1.9495e-02 1.7368e-02 6.1750e-01 9.0897e-03 3.0375e-03 5.4076e-01 1.1563e-01 8.8504e-02 4.5796e-02 2.0925e-02 1.5060e-02 1.6120e-01 +1.3980e+00 7.9804e+06 5.8315e+02 1.8191e+03 1.3252e-07 4.1644e-02 9.5836e-01 3.2519e+03 1.7850e+03 3.8658e+02 8.8967e+01 4.7206e-05 1.7655e-05 3.9891e-03 9.0060e-04 1.9628e-01 5.7188e-02 5.4237e-02 3.4694e-02 1.9541e-02 1.7397e-02 6.1577e-01 9.0913e-03 3.0382e-03 5.4087e-01 1.1565e-01 8.8513e-02 4.5799e-02 2.0925e-02 1.5058e-02 1.6106e-01 +1.4000e+00 8.0200e+06 5.8315e+02 1.8287e+03 1.3160e-07 4.2388e-02 9.5761e-01 3.2551e+03 1.7939e+03 3.8614e+02 8.9374e+01 4.7152e-05 1.7677e-05 4.0084e-03 9.0604e-04 1.9734e-01 5.7441e-02 5.4439e-02 3.4800e-02 1.9586e-02 1.7425e-02 6.1405e-01 9.0928e-03 3.0389e-03 5.4097e-01 1.1566e-01 8.8522e-02 4.5801e-02 2.0924e-02 1.5057e-02 1.6093e-01 +1.4020e+00 8.0596e+06 5.8315e+02 1.8382e+03 1.3068e-07 4.3111e-02 9.5689e-01 3.2583e+03 1.8028e+03 3.8570e+02 8.9783e+01 4.7098e-05 1.7699e-05 4.0277e-03 9.1148e-04 1.9840e-01 5.7695e-02 5.4641e-02 3.4904e-02 1.9631e-02 1.7452e-02 6.1233e-01 9.0942e-03 3.0396e-03 5.4107e-01 1.1568e-01 8.8530e-02 4.5803e-02 2.0924e-02 1.5055e-02 1.6080e-01 +1.4040e+00 8.0992e+06 5.8315e+02 1.8477e+03 1.2978e-07 4.3814e-02 9.5619e-01 3.2615e+03 1.8117e+03 3.8526e+02 9.0192e+01 4.7043e-05 1.7721e-05 4.0469e-03 9.1694e-04 1.9947e-01 5.7947e-02 5.4842e-02 3.5008e-02 1.9676e-02 1.7479e-02 6.1062e-01 9.0957e-03 3.0402e-03 5.4117e-01 1.1569e-01 8.8538e-02 4.5805e-02 2.0924e-02 1.5054e-02 1.6068e-01 +1.4060e+00 8.1388e+06 5.8315e+02 1.8572e+03 1.2889e-07 4.4495e-02 9.5550e-01 3.2647e+03 1.8206e+03 3.8482e+02 9.0603e+01 4.6989e-05 1.7744e-05 4.0661e-03 9.2240e-04 2.0053e-01 5.8199e-02 5.5042e-02 3.5111e-02 1.9720e-02 1.7506e-02 6.0890e-01 9.0970e-03 3.0408e-03 5.4127e-01 1.1571e-01 8.8546e-02 4.5806e-02 2.0923e-02 1.5053e-02 1.6056e-01 +1.4080e+00 8.1784e+06 5.8315e+02 1.8667e+03 1.2801e-07 4.5157e-02 9.5484e-01 3.2679e+03 1.8296e+03 3.8438e+02 9.1014e+01 4.6934e-05 1.7766e-05 4.0854e-03 9.2788e-04 2.0160e-01 5.8451e-02 5.5242e-02 3.5214e-02 1.9764e-02 1.7532e-02 6.0719e-01 9.0983e-03 3.0414e-03 5.4136e-01 1.1572e-01 8.8553e-02 4.5808e-02 2.0923e-02 1.5051e-02 1.6044e-01 +1.4100e+00 8.2180e+06 5.8315e+02 1.8761e+03 1.2714e-07 4.5797e-02 9.5420e-01 3.2711e+03 1.8385e+03 3.8394e+02 9.1427e+01 4.6879e-05 1.7789e-05 4.1046e-03 9.3336e-04 2.0266e-01 5.8703e-02 5.5440e-02 3.5316e-02 1.9807e-02 1.7558e-02 6.0548e-01 9.0995e-03 3.0420e-03 5.4145e-01 1.1574e-01 8.8560e-02 4.5809e-02 2.0922e-02 1.5050e-02 1.6033e-01 +1.4120e+00 8.2576e+06 5.8315e+02 1.8856e+03 1.2628e-07 4.6418e-02 9.5358e-01 3.2743e+03 1.8474e+03 3.8350e+02 9.1840e+01 4.6824e-05 1.7811e-05 4.1238e-03 9.3885e-04 2.0373e-01 5.8953e-02 5.5638e-02 3.5417e-02 1.9850e-02 1.7584e-02 6.0377e-01 9.1007e-03 3.0426e-03 5.4154e-01 1.1575e-01 8.8567e-02 4.5810e-02 2.0922e-02 1.5049e-02 1.6022e-01 +1.4140e+00 8.2972e+06 5.8315e+02 1.8950e+03 1.2543e-07 4.7018e-02 9.5298e-01 3.2775e+03 1.8563e+03 3.8305e+02 9.2255e+01 4.6769e-05 1.7834e-05 4.1429e-03 9.4435e-04 2.0479e-01 5.9204e-02 5.5835e-02 3.5518e-02 1.9892e-02 1.7609e-02 6.0206e-01 9.1019e-03 3.0431e-03 5.4162e-01 1.1576e-01 8.8573e-02 4.5812e-02 2.0921e-02 1.5047e-02 1.6012e-01 +1.4160e+00 8.3368e+06 5.8315e+02 1.9044e+03 1.2459e-07 4.7598e-02 9.5240e-01 3.2807e+03 1.8653e+03 3.8261e+02 9.2670e+01 4.6714e-05 1.7856e-05 4.1621e-03 9.4987e-04 2.0586e-01 5.9454e-02 5.6032e-02 3.5618e-02 1.9935e-02 1.7633e-02 6.0036e-01 9.1030e-03 3.0436e-03 5.4170e-01 1.1577e-01 8.8578e-02 4.5813e-02 2.0921e-02 1.5046e-02 1.6002e-01 +1.4180e+00 8.3764e+06 5.8315e+02 1.9138e+03 1.2376e-07 4.8158e-02 9.5184e-01 3.2839e+03 1.8742e+03 3.8216e+02 9.3087e+01 4.6658e-05 1.7879e-05 4.1812e-03 9.5539e-04 2.0692e-01 5.9703e-02 5.6228e-02 3.5718e-02 1.9976e-02 1.7658e-02 5.9866e-01 9.1041e-03 3.0442e-03 5.4178e-01 1.1579e-01 8.8584e-02 4.5813e-02 2.0920e-02 1.5045e-02 1.5993e-01 +1.4200e+00 8.4160e+06 5.8315e+02 1.9231e+03 1.2294e-07 4.8699e-02 9.5130e-01 3.2871e+03 1.8831e+03 3.8171e+02 9.3504e+01 4.6603e-05 1.7902e-05 4.2003e-03 9.6092e-04 2.0799e-01 5.9953e-02 5.6423e-02 3.5817e-02 2.0018e-02 1.7682e-02 5.9696e-01 9.1051e-03 3.0446e-03 5.4185e-01 1.1580e-01 8.8589e-02 4.5814e-02 2.0919e-02 1.5043e-02 1.5984e-01 +1.4220e+00 8.4556e+06 5.8315e+02 1.9325e+03 1.2213e-07 4.9219e-02 9.5078e-01 3.2903e+03 1.8921e+03 3.8127e+02 9.3923e+01 4.6547e-05 1.7925e-05 4.2195e-03 9.6646e-04 2.0906e-01 6.0201e-02 5.6617e-02 3.5915e-02 2.0059e-02 1.7705e-02 5.9526e-01 9.1060e-03 3.0451e-03 5.4192e-01 1.1581e-01 8.8594e-02 4.5815e-02 2.0919e-02 1.5042e-02 1.5975e-01 +1.4240e+00 8.4952e+06 5.8315e+02 1.9418e+03 1.2133e-07 4.9720e-02 9.5028e-01 3.2935e+03 1.9010e+03 3.8082e+02 9.4343e+01 4.6491e-05 1.7948e-05 4.2385e-03 9.7201e-04 2.1013e-01 6.0450e-02 5.6811e-02 3.6013e-02 2.0099e-02 1.7728e-02 5.9356e-01 9.1069e-03 3.0455e-03 5.4199e-01 1.1582e-01 8.8598e-02 4.5815e-02 2.0918e-02 1.5041e-02 1.5967e-01 +1.4260e+00 8.5348e+06 5.8315e+02 1.9512e+03 1.2054e-07 5.0202e-02 9.4980e-01 3.2967e+03 1.9099e+03 3.8037e+02 9.4764e+01 4.6434e-05 1.7971e-05 4.2576e-03 9.7758e-04 2.1120e-01 6.0697e-02 5.7004e-02 3.6110e-02 2.0139e-02 1.7751e-02 5.9187e-01 9.1078e-03 3.0460e-03 5.4205e-01 1.1583e-01 8.8602e-02 4.5816e-02 2.0917e-02 1.5040e-02 1.5959e-01 +1.4280e+00 8.5744e+06 5.8315e+02 1.9605e+03 1.1975e-07 5.0664e-02 9.4934e-01 3.2999e+03 1.9189e+03 3.7992e+02 9.5186e+01 4.6378e-05 1.7995e-05 4.2767e-03 9.8315e-04 2.1227e-01 6.0945e-02 5.7196e-02 3.6206e-02 2.0179e-02 1.7774e-02 5.9017e-01 9.1086e-03 3.0464e-03 5.4211e-01 1.1583e-01 8.8606e-02 4.5816e-02 2.0917e-02 1.5039e-02 1.5952e-01 +1.4300e+00 8.6140e+06 5.8315e+02 1.9697e+03 1.1898e-07 5.1106e-02 9.4889e-01 3.3031e+03 1.9278e+03 3.7947e+02 9.5609e+01 4.6322e-05 1.8018e-05 4.2957e-03 9.8873e-04 2.1334e-01 6.1192e-02 5.7387e-02 3.6302e-02 2.0218e-02 1.7796e-02 5.8848e-01 9.1094e-03 3.0468e-03 5.4217e-01 1.1584e-01 8.8609e-02 4.5816e-02 2.0916e-02 1.5037e-02 1.5945e-01 +1.4320e+00 8.6536e+06 5.8315e+02 1.9790e+03 1.1822e-07 5.1529e-02 9.4847e-01 3.3063e+03 1.9368e+03 3.7901e+02 9.6033e+01 4.6265e-05 1.8041e-05 4.3148e-03 9.9433e-04 2.1441e-01 6.1438e-02 5.7578e-02 3.6397e-02 2.0257e-02 1.7817e-02 5.8679e-01 9.1101e-03 3.0471e-03 5.4223e-01 1.1585e-01 8.8613e-02 4.5816e-02 2.0915e-02 1.5036e-02 1.5939e-01 +1.4340e+00 8.6932e+06 5.8315e+02 1.9883e+03 1.1746e-07 5.1933e-02 9.4807e-01 3.3095e+03 1.9457e+03 3.7856e+02 9.6458e+01 4.6208e-05 1.8065e-05 4.3338e-03 9.9993e-04 2.1548e-01 6.1685e-02 5.7768e-02 3.6492e-02 2.0296e-02 1.7839e-02 5.8511e-01 9.1108e-03 3.0475e-03 5.4228e-01 1.1586e-01 8.8615e-02 4.5816e-02 2.0914e-02 1.5035e-02 1.5933e-01 +1.4360e+00 8.7328e+06 5.8315e+02 1.9975e+03 1.1671e-07 5.2318e-02 9.4768e-01 3.3127e+03 1.9547e+03 3.7810e+02 9.6884e+01 4.6151e-05 1.8089e-05 4.3528e-03 1.0055e-03 2.1655e-01 6.1930e-02 5.7957e-02 3.6586e-02 2.0334e-02 1.7860e-02 5.8342e-01 9.1114e-03 3.0478e-03 5.4233e-01 1.1586e-01 8.8618e-02 4.5816e-02 2.0914e-02 1.5034e-02 1.5927e-01 +1.4380e+00 8.7724e+06 5.8315e+02 2.0067e+03 1.1597e-07 5.2683e-02 9.4732e-01 3.3159e+03 1.9636e+03 3.7765e+02 9.7312e+01 4.6093e-05 1.8112e-05 4.3718e-03 1.0112e-03 2.1763e-01 6.2176e-02 5.8146e-02 3.6680e-02 2.0372e-02 1.7880e-02 5.8174e-01 9.1120e-03 3.0481e-03 5.4237e-01 1.1587e-01 8.8620e-02 4.5816e-02 2.0913e-02 1.5033e-02 1.5922e-01 +1.4400e+00 8.8120e+06 5.8315e+02 2.0159e+03 1.1524e-07 5.3029e-02 9.4697e-01 3.3191e+03 1.9726e+03 3.7719e+02 9.7741e+01 4.6036e-05 1.8136e-05 4.3908e-03 1.0168e-03 2.1870e-01 6.2421e-02 5.8334e-02 3.6772e-02 2.0409e-02 1.7900e-02 5.8006e-01 9.1125e-03 3.0484e-03 5.4242e-01 1.1587e-01 8.8622e-02 4.5816e-02 2.0912e-02 1.5032e-02 1.5917e-01 +1.4420e+00 8.8516e+06 5.8315e+02 2.0251e+03 1.1452e-07 5.3356e-02 9.4664e-01 3.3223e+03 1.9815e+03 3.7673e+02 9.8171e+01 4.5978e-05 1.8160e-05 4.4098e-03 1.0225e-03 2.1977e-01 6.2665e-02 5.8521e-02 3.6865e-02 2.0446e-02 1.7920e-02 5.7838e-01 9.1130e-03 3.0487e-03 5.4246e-01 1.1588e-01 8.8623e-02 4.5815e-02 2.0911e-02 1.5031e-02 1.5912e-01 +1.4440e+00 8.8912e+06 5.8315e+02 2.0343e+03 1.1381e-07 5.3665e-02 9.4634e-01 3.3255e+03 1.9905e+03 3.7627e+02 9.8602e+01 4.5920e-05 1.8184e-05 4.4287e-03 1.0281e-03 2.2085e-01 6.2909e-02 5.8708e-02 3.6956e-02 2.0483e-02 1.7940e-02 5.7670e-01 9.1135e-03 3.0490e-03 5.4249e-01 1.1588e-01 8.8625e-02 4.5815e-02 2.0910e-02 1.5029e-02 1.5908e-01 +1.4460e+00 8.9308e+06 5.8315e+02 2.0435e+03 1.1310e-07 5.3954e-02 9.4605e-01 3.3287e+03 1.9995e+03 3.7581e+02 9.9034e+01 4.5862e-05 1.8208e-05 4.4477e-03 1.0338e-03 2.2192e-01 6.3153e-02 5.8894e-02 3.7048e-02 2.0519e-02 1.7959e-02 5.7502e-01 9.1139e-03 3.0492e-03 5.4253e-01 1.1589e-01 8.8626e-02 4.5814e-02 2.0910e-02 1.5028e-02 1.5905e-01 +1.4480e+00 8.9704e+06 5.8315e+02 2.0526e+03 1.1240e-07 5.4224e-02 9.4578e-01 3.3319e+03 2.0084e+03 3.7535e+02 9.9467e+01 4.5804e-05 1.8232e-05 4.4666e-03 1.0395e-03 2.2300e-01 6.3396e-02 5.9079e-02 3.7138e-02 2.0555e-02 1.7978e-02 5.7335e-01 9.1143e-03 3.0494e-03 5.4256e-01 1.1589e-01 8.8626e-02 4.5813e-02 2.0909e-02 1.5027e-02 1.5901e-01 +1.4500e+00 9.0100e+06 5.8315e+02 2.0618e+03 1.1171e-07 5.4475e-02 9.4553e-01 3.3350e+03 2.0174e+03 3.7489e+02 9.9902e+01 4.5746e-05 1.8257e-05 4.4855e-03 1.0452e-03 2.2408e-01 6.3639e-02 5.9263e-02 3.7228e-02 2.0590e-02 1.7996e-02 5.7167e-01 9.1146e-03 3.0496e-03 5.4258e-01 1.1589e-01 8.8627e-02 4.5812e-02 2.0908e-02 1.5026e-02 1.5898e-01 +1.4520e+00 9.0496e+06 5.8315e+02 2.0709e+03 1.1103e-07 5.4707e-02 9.4529e-01 3.3382e+03 2.0263e+03 3.7442e+02 1.0034e+02 4.5687e-05 1.8281e-05 4.5044e-03 1.0509e-03 2.2516e-01 6.3882e-02 5.9447e-02 3.7318e-02 2.0625e-02 1.8014e-02 5.7000e-01 9.1149e-03 3.0498e-03 5.4261e-01 1.1590e-01 8.8627e-02 4.5812e-02 2.0907e-02 1.5026e-02 1.5896e-01 +1.4540e+00 9.0892e+06 5.8315e+02 2.0800e+03 1.1036e-07 5.4920e-02 9.4508e-01 3.3414e+03 2.0353e+03 3.7396e+02 1.0077e+02 4.5628e-05 1.8306e-05 4.5233e-03 1.0566e-03 2.2623e-01 6.4124e-02 5.9630e-02 3.7406e-02 2.0660e-02 1.8032e-02 5.6833e-01 9.1151e-03 3.0500e-03 5.4263e-01 1.1590e-01 8.8627e-02 4.5811e-02 2.0906e-02 1.5025e-02 1.5894e-01 +1.4560e+00 9.1288e+06 5.8315e+02 2.0890e+03 1.0969e-07 5.5114e-02 9.4489e-01 3.3446e+03 2.0443e+03 3.7349e+02 1.0121e+02 4.5569e-05 1.8331e-05 4.5422e-03 1.0623e-03 2.2731e-01 6.4365e-02 5.9813e-02 3.7495e-02 2.0694e-02 1.8049e-02 5.6667e-01 9.1153e-03 3.0501e-03 5.4265e-01 1.1590e-01 8.8626e-02 4.5810e-02 2.0905e-02 1.5024e-02 1.5892e-01 +1.4580e+00 9.1684e+06 5.8315e+02 2.0981e+03 1.0903e-07 5.5289e-02 9.4471e-01 3.3478e+03 2.0533e+03 3.7302e+02 1.0165e+02 4.5510e-05 1.8355e-05 4.5610e-03 1.0680e-03 2.2839e-01 6.4607e-02 5.9995e-02 3.7582e-02 2.0728e-02 1.8066e-02 5.6500e-01 9.1154e-03 3.0502e-03 5.4267e-01 1.1590e-01 8.8626e-02 4.5808e-02 2.0904e-02 1.5023e-02 1.5891e-01 +1.4600e+00 9.2080e+06 5.8315e+02 2.1072e+03 1.0837e-07 5.5445e-02 9.4456e-01 3.3510e+03 2.0622e+03 3.7256e+02 1.0209e+02 4.5451e-05 1.8380e-05 4.5799e-03 1.0738e-03 2.2947e-01 6.4848e-02 6.0176e-02 3.7670e-02 2.0762e-02 1.8083e-02 5.6333e-01 9.1155e-03 3.0503e-03 5.4268e-01 1.1590e-01 8.8625e-02 4.5807e-02 2.0904e-02 1.5022e-02 1.5890e-01 +1.4620e+00 9.2476e+06 5.8315e+02 2.1162e+03 1.0773e-07 5.5582e-02 9.4442e-01 3.3541e+03 2.0712e+03 3.7209e+02 1.0254e+02 4.5391e-05 1.8405e-05 4.5987e-03 1.0795e-03 2.3056e-01 6.5088e-02 6.0356e-02 3.7756e-02 2.0795e-02 1.8100e-02 5.6167e-01 9.1156e-03 3.0504e-03 5.4269e-01 1.1590e-01 8.8623e-02 4.5806e-02 2.0903e-02 1.5021e-02 1.5889e-01 +1.4640e+00 9.2872e+06 5.8315e+02 2.1252e+03 1.0709e-07 5.5700e-02 9.4430e-01 3.3573e+03 2.0802e+03 3.7161e+02 1.0298e+02 4.5332e-05 1.8430e-05 4.6176e-03 1.0853e-03 2.3164e-01 6.5328e-02 6.0536e-02 3.7842e-02 2.0828e-02 1.8116e-02 5.6001e-01 9.1156e-03 3.0505e-03 5.4269e-01 1.1590e-01 8.8622e-02 4.5805e-02 2.0902e-02 1.5020e-02 1.5889e-01 +1.4660e+00 9.3268e+06 5.8315e+02 2.1342e+03 1.0646e-07 5.5798e-02 9.4420e-01 3.3605e+03 2.0892e+03 3.7114e+02 1.0342e+02 4.5272e-05 1.8456e-05 4.6364e-03 1.0911e-03 2.3272e-01 6.5568e-02 6.0715e-02 3.7928e-02 2.0861e-02 1.8131e-02 5.5835e-01 9.1156e-03 3.0506e-03 5.4270e-01 1.1590e-01 8.8620e-02 4.5803e-02 2.0901e-02 1.5020e-02 1.5889e-01 +1.4680e+00 9.3664e+06 5.8315e+02 2.1432e+03 1.0583e-07 5.5878e-02 9.4412e-01 3.3637e+03 2.0982e+03 3.7067e+02 1.0387e+02 4.5212e-05 1.8481e-05 4.6552e-03 1.0969e-03 2.3381e-01 6.5807e-02 6.0894e-02 3.8013e-02 2.0893e-02 1.8147e-02 5.5669e-01 9.1155e-03 3.0506e-03 5.4270e-01 1.1590e-01 8.8618e-02 4.5802e-02 2.0900e-02 1.5019e-02 1.5890e-01 +1.4700e+00 9.4060e+06 5.8315e+02 2.1522e+03 1.0521e-07 5.5939e-02 9.4406e-01 3.3668e+03 2.1071e+03 3.7019e+02 1.0432e+02 4.5151e-05 1.8507e-05 4.6740e-03 1.1027e-03 2.3489e-01 6.6046e-02 6.1071e-02 3.8097e-02 2.0925e-02 1.8162e-02 5.5503e-01 9.1154e-03 3.0506e-03 5.4270e-01 1.1590e-01 8.8616e-02 4.5800e-02 2.0899e-02 1.5018e-02 1.5891e-01 +1.4720e+00 9.4456e+06 5.8315e+02 2.1611e+03 1.0460e-07 5.5980e-02 9.4402e-01 3.3700e+03 2.1161e+03 3.6972e+02 1.0477e+02 4.5091e-05 1.8532e-05 4.6928e-03 1.1085e-03 2.3598e-01 6.6285e-02 6.1249e-02 3.8181e-02 2.0957e-02 1.8176e-02 5.5337e-01 9.1153e-03 3.0506e-03 5.4269e-01 1.1589e-01 8.8613e-02 4.5799e-02 2.0898e-02 1.5018e-02 1.5892e-01 +1.4740e+00 9.4852e+06 5.8315e+02 2.1701e+03 1.0399e-07 5.6002e-02 9.4400e-01 3.3732e+03 2.1251e+03 3.6924e+02 1.0522e+02 4.5030e-05 1.8558e-05 4.7115e-03 1.1144e-03 2.3707e-01 6.6523e-02 6.1425e-02 3.8264e-02 2.0988e-02 1.8191e-02 5.5172e-01 9.1151e-03 3.0506e-03 5.4269e-01 1.1589e-01 8.8610e-02 4.5797e-02 2.0898e-02 1.5017e-02 1.5894e-01 +1.4760e+00 9.5248e+06 5.8315e+02 2.1790e+03 1.0339e-07 5.6005e-02 9.4399e-01 3.3763e+03 2.1341e+03 3.6876e+02 1.0567e+02 4.4969e-05 1.8584e-05 4.7303e-03 1.1202e-03 2.3815e-01 6.6761e-02 6.1601e-02 3.8347e-02 2.1019e-02 1.8205e-02 5.5006e-01 9.1148e-03 3.0506e-03 5.4268e-01 1.1589e-01 8.8607e-02 4.5795e-02 2.0897e-02 1.5016e-02 1.5896e-01 +1.4780e+00 9.5644e+06 5.8315e+02 2.1879e+03 1.0280e-07 5.5989e-02 9.4401e-01 3.3795e+03 2.1431e+03 3.6828e+02 1.0612e+02 4.4908e-05 1.8610e-05 4.7491e-03 1.1261e-03 2.3924e-01 6.6999e-02 6.1776e-02 3.8429e-02 2.1049e-02 1.8219e-02 5.4841e-01 9.1146e-03 3.0505e-03 5.4266e-01 1.1588e-01 8.8604e-02 4.5793e-02 2.0896e-02 1.5016e-02 1.5898e-01 +1.4800e+00 9.6040e+06 5.8315e+02 2.1968e+03 1.0221e-07 5.5953e-02 9.4405e-01 3.3827e+03 2.1521e+03 3.6780e+02 1.0657e+02 4.4847e-05 1.8636e-05 4.7678e-03 1.1319e-03 2.4033e-01 6.7236e-02 6.1951e-02 3.8510e-02 2.1079e-02 1.8232e-02 5.4676e-01 9.1142e-03 3.0504e-03 5.4265e-01 1.1588e-01 8.8600e-02 4.5791e-02 2.0895e-02 1.5015e-02 1.5901e-01 +1.4820e+00 9.6436e+06 5.8315e+02 2.2057e+03 1.0163e-07 5.5897e-02 9.4410e-01 3.3858e+03 2.1611e+03 3.6731e+02 1.0703e+02 4.4785e-05 1.8663e-05 4.7865e-03 1.1378e-03 2.4142e-01 6.7473e-02 6.2125e-02 3.8591e-02 2.1109e-02 1.8245e-02 5.4511e-01 9.1139e-03 3.0503e-03 5.4263e-01 1.1587e-01 8.8597e-02 4.5789e-02 2.0894e-02 1.5015e-02 1.5904e-01 +1.4840e+00 9.6832e+06 5.8315e+02 2.2146e+03 1.0106e-07 5.5822e-02 9.4418e-01 3.3890e+03 2.1701e+03 3.6683e+02 1.0749e+02 4.4724e-05 1.8689e-05 4.8053e-03 1.1437e-03 2.4251e-01 6.7709e-02 6.2298e-02 3.8672e-02 2.1138e-02 1.8258e-02 5.4346e-01 9.1135e-03 3.0502e-03 5.4260e-01 1.1587e-01 8.8593e-02 4.5787e-02 2.0894e-02 1.5015e-02 1.5907e-01 +1.4860e+00 9.7228e+06 5.8315e+02 2.2234e+03 1.0049e-07 5.5727e-02 9.4427e-01 3.3921e+03 2.1791e+03 3.6634e+02 1.0795e+02 4.4662e-05 1.8716e-05 4.8240e-03 1.1496e-03 2.4361e-01 6.7945e-02 6.2470e-02 3.8752e-02 2.1167e-02 1.8270e-02 5.4181e-01 9.1130e-03 3.0501e-03 5.4258e-01 1.1586e-01 8.8588e-02 4.5785e-02 2.0893e-02 1.5014e-02 1.5911e-01 +1.4880e+00 9.7624e+06 5.8315e+02 2.2323e+03 9.9923e-08 5.5613e-02 9.4439e-01 3.3953e+03 2.1881e+03 3.6586e+02 1.0841e+02 4.4600e-05 1.8742e-05 4.8427e-03 1.1556e-03 2.4470e-01 6.8181e-02 6.2642e-02 3.8831e-02 2.1196e-02 1.8283e-02 5.4017e-01 9.1126e-03 3.0499e-03 5.4255e-01 1.1586e-01 8.8584e-02 4.5783e-02 2.0892e-02 1.5014e-02 1.5916e-01 +1.4900e+00 9.8020e+06 5.8315e+02 2.2411e+03 9.9365e-08 5.5478e-02 9.4452e-01 3.3984e+03 2.1972e+03 3.6537e+02 1.0887e+02 4.4538e-05 1.8769e-05 4.8614e-03 1.1615e-03 2.4580e-01 6.8416e-02 6.2814e-02 3.8910e-02 2.1224e-02 1.8294e-02 5.3852e-01 9.1120e-03 3.0498e-03 5.4252e-01 1.1585e-01 8.8579e-02 4.5781e-02 2.0891e-02 1.5014e-02 1.5920e-01 +1.4920e+00 9.8416e+06 5.8315e+02 2.2499e+03 9.8813e-08 5.5324e-02 9.4468e-01 3.4016e+03 2.2062e+03 3.6488e+02 1.0933e+02 4.4475e-05 1.8796e-05 4.8801e-03 1.1674e-03 2.4689e-01 6.8651e-02 6.2985e-02 3.8989e-02 2.1252e-02 1.8306e-02 5.3688e-01 9.1115e-03 3.0496e-03 5.4249e-01 1.1584e-01 8.8574e-02 4.5779e-02 2.0890e-02 1.5013e-02 1.5925e-01 +1.4940e+00 9.8812e+06 5.8315e+02 2.2587e+03 9.8267e-08 5.5149e-02 9.4485e-01 3.4047e+03 2.2152e+03 3.6439e+02 1.0980e+02 4.4412e-05 1.8823e-05 4.8987e-03 1.1734e-03 2.4799e-01 6.8886e-02 6.3155e-02 3.9067e-02 2.1280e-02 1.8317e-02 5.3524e-01 9.1109e-03 3.0494e-03 5.4245e-01 1.1584e-01 8.8569e-02 4.5777e-02 2.0890e-02 1.5013e-02 1.5931e-01 +1.4960e+00 9.9208e+06 5.8315e+02 2.2675e+03 9.7727e-08 5.4954e-02 9.4505e-01 3.4079e+03 2.2242e+03 3.6389e+02 1.1026e+02 4.4349e-05 1.8851e-05 4.9174e-03 1.1794e-03 2.4909e-01 6.9120e-02 6.3324e-02 3.9144e-02 2.1308e-02 1.8328e-02 5.3359e-01 9.1102e-03 3.0492e-03 5.4241e-01 1.1583e-01 8.8563e-02 4.5774e-02 2.0889e-02 1.5013e-02 1.5936e-01 +1.4980e+00 9.9604e+06 5.8315e+02 2.2763e+03 9.7191e-08 5.4739e-02 9.4526e-01 3.4110e+03 2.2332e+03 3.6340e+02 1.1073e+02 4.4286e-05 1.8878e-05 4.9361e-03 1.1854e-03 2.5019e-01 6.9354e-02 6.3493e-02 3.9221e-02 2.1335e-02 1.8339e-02 5.3195e-01 9.1095e-03 3.0489e-03 5.4237e-01 1.1582e-01 8.8558e-02 4.5772e-02 2.0888e-02 1.5013e-02 1.5942e-01 +1.5000e+00 1.0000e+07 5.8315e+02 2.2850e+03 9.6662e-08 5.4503e-02 9.4550e-01 3.4142e+03 2.2423e+03 3.6290e+02 1.1120e+02 4.4223e-05 1.8906e-05 4.9547e-03 1.1914e-03 2.5129e-01 6.9588e-02 6.3661e-02 3.9297e-02 2.1361e-02 1.8349e-02 5.3031e-01 9.1088e-03 3.0486e-03 5.4232e-01 1.1581e-01 8.8552e-02 4.5770e-02 2.0888e-02 1.5013e-02 1.5949e-01 +1.5020e+00 1.0100e+07 5.8315e+02 2.3071e+03 9.5347e-08 5.3815e-02 9.4618e-01 3.4221e+03 2.2651e+03 3.6164e+02 1.1239e+02 4.4062e-05 1.8976e-05 5.0018e-03 1.2066e-03 2.5407e-01 7.0176e-02 6.4083e-02 3.9487e-02 2.1427e-02 1.8374e-02 5.2617e-01 9.1068e-03 3.0479e-03 5.4219e-01 1.1579e-01 8.8536e-02 4.5763e-02 2.0886e-02 1.5013e-02 1.5967e-01 +1.5040e+00 1.0200e+07 5.8315e+02 2.3290e+03 9.4066e-08 5.2993e-02 9.4701e-01 3.4300e+03 2.2879e+03 3.6037e+02 1.1359e+02 4.3900e-05 1.9048e-05 5.0488e-03 1.2220e-03 2.5686e-01 7.0763e-02 6.4502e-02 3.9674e-02 2.1491e-02 1.8396e-02 5.2204e-01 9.1045e-03 3.0470e-03 5.4205e-01 1.1576e-01 8.8519e-02 4.5757e-02 2.0884e-02 1.5013e-02 1.5987e-01 +1.5060e+00 1.0300e+07 5.8315e+02 2.3509e+03 9.2816e-08 5.2033e-02 9.4797e-01 3.4379e+03 2.3108e+03 3.5909e+02 1.1481e+02 4.3736e-05 1.9121e-05 5.0958e-03 1.2374e-03 2.5966e-01 7.1347e-02 6.4916e-02 3.9858e-02 2.1553e-02 1.8417e-02 5.1792e-01 9.1019e-03 3.0460e-03 5.4188e-01 1.1573e-01 8.8500e-02 4.5750e-02 2.0883e-02 1.5013e-02 1.6010e-01 +1.5080e+00 1.0400e+07 5.8315e+02 2.3727e+03 9.1596e-08 5.0932e-02 9.4907e-01 3.4458e+03 2.3336e+03 3.5780e+02 1.1603e+02 4.3571e-05 1.9194e-05 5.1428e-03 1.2529e-03 2.6247e-01 7.1930e-02 6.5327e-02 4.0039e-02 2.1613e-02 1.8436e-02 5.1379e-01 9.0991e-03 3.0449e-03 5.4170e-01 1.1570e-01 8.8480e-02 4.5743e-02 2.0882e-02 1.5014e-02 1.6034e-01 +1.5100e+00 1.0500e+07 5.8315e+02 2.3943e+03 9.0407e-08 4.9686e-02 9.5031e-01 3.4536e+03 2.3565e+03 3.5650e+02 1.1727e+02 4.3404e-05 1.9269e-05 5.1897e-03 1.2685e-03 2.6528e-01 7.2511e-02 6.5734e-02 4.0216e-02 2.1670e-02 1.8453e-02 5.0968e-01 9.0960e-03 3.0436e-03 5.4149e-01 1.1566e-01 8.8459e-02 4.5736e-02 2.0881e-02 1.5015e-02 1.6062e-01 +1.5120e+00 1.0600e+07 5.8315e+02 2.4159e+03 8.9245e-08 4.8292e-02 9.5171e-01 3.4615e+03 2.3795e+03 3.5518e+02 1.1852e+02 4.3236e-05 1.9345e-05 5.2366e-03 1.2843e-03 2.6811e-01 7.3089e-02 6.6137e-02 4.0390e-02 2.1726e-02 1.8468e-02 5.0556e-01 9.0927e-03 3.0423e-03 5.4127e-01 1.1562e-01 8.8436e-02 4.5728e-02 2.0880e-02 1.5017e-02 1.6092e-01 +1.5140e+00 1.0700e+07 5.8315e+02 2.4375e+03 8.8112e-08 4.6744e-02 9.5326e-01 3.4693e+03 2.4024e+03 3.5386e+02 1.1978e+02 4.3066e-05 1.9423e-05 5.2835e-03 1.3001e-03 2.7094e-01 7.3666e-02 6.6536e-02 4.0561e-02 2.1780e-02 1.8482e-02 5.0145e-01 9.0891e-03 3.0407e-03 5.4102e-01 1.1558e-01 8.8412e-02 4.5721e-02 2.0879e-02 1.5019e-02 1.6124e-01 +1.5160e+00 1.0800e+07 5.8315e+02 2.4589e+03 8.7005e-08 4.5038e-02 9.5496e-01 3.4771e+03 2.4254e+03 3.5252e+02 1.2105e+02 4.2895e-05 1.9502e-05 5.3304e-03 1.3160e-03 2.7379e-01 7.4242e-02 6.6932e-02 4.0729e-02 2.1832e-02 1.8494e-02 4.9734e-01 9.0852e-03 3.0391e-03 5.4076e-01 1.1554e-01 8.8387e-02 4.5713e-02 2.0878e-02 1.5021e-02 1.6158e-01 +1.5180e+00 1.0900e+07 5.8315e+02 2.4803e+03 8.5925e-08 4.3168e-02 9.5683e-01 3.4849e+03 2.4484e+03 3.5116e+02 1.2234e+02 4.2722e-05 1.9582e-05 5.3772e-03 1.3321e-03 2.7664e-01 7.4815e-02 6.7325e-02 4.0894e-02 2.1881e-02 1.8504e-02 4.9323e-01 9.0810e-03 3.0373e-03 5.4047e-01 1.1549e-01 8.8360e-02 4.5705e-02 2.0878e-02 1.5024e-02 1.6195e-01 +1.5200e+00 1.1000e+07 5.8315e+02 2.5015e+03 8.4869e-08 4.1127e-02 9.5887e-01 3.4926e+03 2.4714e+03 3.4980e+02 1.2364e+02 4.2547e-05 1.9663e-05 5.4241e-03 1.3483e-03 2.7951e-01 7.5387e-02 6.7713e-02 4.1056e-02 2.1929e-02 1.8512e-02 4.8912e-01 9.0766e-03 3.0354e-03 5.4017e-01 1.1544e-01 8.8332e-02 4.5697e-02 2.0878e-02 1.5027e-02 1.6235e-01 +1.5220e+00 1.1100e+07 5.8315e+02 2.5227e+03 8.3838e-08 3.8910e-02 9.6109e-01 3.5003e+03 2.4945e+03 3.4842e+02 1.2495e+02 4.2371e-05 1.9746e-05 5.4710e-03 1.3646e-03 2.8238e-01 7.5958e-02 6.8099e-02 4.1215e-02 2.1975e-02 1.8518e-02 4.8502e-01 9.0719e-03 3.0333e-03 5.3984e-01 1.1539e-01 8.8303e-02 4.5689e-02 2.0878e-02 1.5030e-02 1.6277e-01 +1.5240e+00 1.1200e+07 5.8315e+02 2.5438e+03 8.2830e-08 3.6507e-02 9.6349e-01 3.5080e+03 2.5176e+03 3.4703e+02 1.2628e+02 4.2193e-05 1.9830e-05 5.5179e-03 1.3810e-03 2.8527e-01 7.6527e-02 6.8481e-02 4.1370e-02 2.2019e-02 1.8523e-02 4.8091e-01 9.0669e-03 3.0311e-03 5.3949e-01 1.1533e-01 8.8273e-02 4.5681e-02 2.0878e-02 1.5034e-02 1.6321e-01 +1.5260e+00 1.1300e+07 5.8315e+02 2.5649e+03 8.1845e-08 3.3912e-02 9.6609e-01 3.5157e+03 2.5407e+03 3.4562e+02 1.2762e+02 4.2013e-05 1.9916e-05 5.5647e-03 1.3976e-03 2.8817e-01 7.7095e-02 6.8859e-02 4.1523e-02 2.2061e-02 1.8526e-02 4.7680e-01 9.0616e-03 3.0287e-03 5.3912e-01 1.1527e-01 8.8241e-02 4.5673e-02 2.0879e-02 1.5039e-02 1.6368e-01 +1.5280e+00 1.1400e+07 5.8315e+02 2.5858e+03 8.0883e-08 3.1114e-02 9.6889e-01 3.5233e+03 2.5639e+03 3.4420e+02 1.2898e+02 4.1831e-05 2.0004e-05 5.6117e-03 1.4143e-03 2.9109e-01 7.7662e-02 6.9235e-02 4.1673e-02 2.2102e-02 1.8527e-02 4.7269e-01 9.0560e-03 3.0262e-03 5.3873e-01 1.1521e-01 8.8209e-02 4.5665e-02 2.0880e-02 1.5043e-02 1.6418e-01 +1.5300e+00 1.1500e+07 5.8315e+02 2.6067e+03 7.9942e-08 2.8104e-02 9.7190e-01 3.5309e+03 2.5871e+03 3.4276e+02 1.3036e+02 4.1647e-05 2.0093e-05 5.6586e-03 1.4311e-03 2.9402e-01 7.8227e-02 6.9607e-02 4.1820e-02 2.2140e-02 1.8526e-02 4.6857e-01 9.0502e-03 3.0235e-03 5.3831e-01 1.1515e-01 8.8175e-02 4.5657e-02 2.0881e-02 1.5049e-02 1.6471e-01 +1.5320e+00 1.1600e+07 5.8315e+02 2.6275e+03 7.9021e-08 2.4871e-02 9.7513e-01 3.5385e+03 2.6103e+03 3.4130e+02 1.3175e+02 4.1461e-05 2.0184e-05 5.7056e-03 1.4481e-03 2.9696e-01 7.8791e-02 6.9976e-02 4.1964e-02 2.2177e-02 1.8524e-02 4.6445e-01 9.0440e-03 3.0207e-03 5.3787e-01 1.1508e-01 8.8139e-02 4.5649e-02 2.0883e-02 1.5054e-02 1.6526e-01 +1.5340e+00 1.1700e+07 5.8315e+02 2.6482e+03 7.8121e-08 2.1402e-02 9.7860e-01 3.5460e+03 2.6336e+03 3.3983e+02 1.3316e+02 4.1273e-05 2.0277e-05 5.7527e-03 1.4652e-03 2.9992e-01 7.9355e-02 7.0341e-02 4.2105e-02 2.2211e-02 1.8520e-02 4.6033e-01 9.0375e-03 3.0177e-03 5.3741e-01 1.1501e-01 8.8103e-02 4.5640e-02 2.0885e-02 1.5061e-02 1.6584e-01 +1.5360e+00 1.1800e+07 5.8315e+02 2.6689e+03 7.7241e-08 1.7683e-02 9.8232e-01 3.5535e+03 2.6570e+03 3.3834e+02 1.3459e+02 4.1083e-05 2.0372e-05 5.7998e-03 1.4825e-03 3.0290e-01 7.9917e-02 7.0704e-02 4.2244e-02 2.2244e-02 1.8515e-02 4.5620e-01 9.0306e-03 3.0145e-03 5.3692e-01 1.1493e-01 8.8065e-02 4.5632e-02 2.0887e-02 1.5067e-02 1.6645e-01 +1.5380e+00 1.1900e+07 5.8315e+02 2.6894e+03 7.6379e-08 1.3699e-02 9.8630e-01 3.5609e+03 2.6803e+03 3.3683e+02 1.3603e+02 4.0891e-05 2.0469e-05 5.8470e-03 1.5000e-03 3.0589e-01 8.0479e-02 7.1064e-02 4.2379e-02 2.2275e-02 1.8508e-02 4.5206e-01 9.0235e-03 3.0112e-03 5.3641e-01 1.1485e-01 8.8025e-02 4.5624e-02 2.0890e-02 1.5075e-02 1.6709e-01 +1.5400e+00 1.2000e+07 5.8315e+02 2.7099e+03 7.5536e-08 9.4342e-03 9.9057e-01 3.5683e+03 2.7037e+03 3.3530e+02 1.3750e+02 4.0696e-05 2.0568e-05 5.8943e-03 1.5176e-03 3.0890e-01 8.1041e-02 7.1421e-02 4.2512e-02 2.2304e-02 1.8499e-02 4.4791e-01 9.0160e-03 3.0076e-03 5.3586e-01 1.1477e-01 8.7985e-02 4.5616e-02 2.0893e-02 1.5082e-02 1.6776e-01 +1.5420e+00 1.2100e+07 5.8315e+02 2.7304e+03 7.4711e-08 4.8688e-03 9.9513e-01 3.5756e+03 2.7272e+03 3.3375e+02 1.3899e+02 4.0500e-05 2.0669e-05 5.9417e-03 1.5354e-03 3.1193e-01 8.1601e-02 7.1775e-02 4.2642e-02 2.2332e-02 1.8488e-02 4.4376e-01 9.0082e-03 3.0039e-03 5.3530e-01 1.1469e-01 8.7943e-02 4.5608e-02 2.0896e-02 1.5091e-02 1.6847e-01 +1.5440e+00 1.2200e+07 5.8315e+02 2.7507e+03 7.8035e-08 0.0000e+00 1.0000e+00 2.7507e+03 2.7507e+03 1.4050e+02 1.4050e+02 2.0773e-05 2.0773e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5460e+00 1.2300e+07 5.8315e+02 2.7722e+03 7.7192e-08 0.0000e+00 1.0000e+00 2.7722e+03 2.7722e+03 1.4160e+02 1.4160e+02 2.0855e-05 2.0855e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5480e+00 1.2400e+07 5.8315e+02 2.7935e+03 7.6362e-08 0.0000e+00 1.0000e+00 2.7935e+03 2.7935e+03 1.4269e+02 1.4269e+02 2.0938e-05 2.0938e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5500e+00 1.2500e+07 5.8315e+02 2.8148e+03 7.5543e-08 0.0000e+00 1.0000e+00 2.8148e+03 2.8148e+03 1.4377e+02 1.4377e+02 2.1020e-05 2.1020e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5520e+00 1.2600e+07 5.8315e+02 2.8361e+03 7.4737e-08 0.0000e+00 1.0000e+00 2.8361e+03 2.8361e+03 1.4486e+02 1.4486e+02 2.1104e-05 2.1104e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5540e+00 1.2700e+07 5.8315e+02 2.8572e+03 7.3942e-08 0.0000e+00 1.0000e+00 2.8572e+03 2.8572e+03 1.4594e+02 1.4594e+02 2.1187e-05 2.1187e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5560e+00 1.2800e+07 5.8315e+02 2.8783e+03 7.3158e-08 0.0000e+00 1.0000e+00 2.8783e+03 2.8783e+03 1.4702e+02 1.4702e+02 2.1271e-05 2.1271e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5580e+00 1.2900e+07 5.8315e+02 2.8993e+03 7.2386e-08 0.0000e+00 1.0000e+00 2.8993e+03 2.8993e+03 1.4809e+02 1.4809e+02 2.1355e-05 2.1355e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5600e+00 1.3000e+07 5.8315e+02 2.9203e+03 7.1624e-08 0.0000e+00 1.0000e+00 2.9203e+03 2.9203e+03 1.4916e+02 1.4916e+02 2.1439e-05 2.1439e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5620e+00 1.3100e+07 5.8315e+02 2.9412e+03 7.0873e-08 0.0000e+00 1.0000e+00 2.9412e+03 2.9412e+03 1.5023e+02 1.5023e+02 2.1523e-05 2.1523e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5640e+00 1.3200e+07 5.8315e+02 2.9620e+03 7.0133e-08 0.0000e+00 1.0000e+00 2.9620e+03 2.9620e+03 1.5129e+02 1.5129e+02 2.1608e-05 2.1608e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5660e+00 1.3300e+07 5.8315e+02 2.9827e+03 6.9403e-08 0.0000e+00 1.0000e+00 2.9827e+03 2.9827e+03 1.5235e+02 1.5235e+02 2.1693e-05 2.1693e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5680e+00 1.3400e+07 5.8315e+02 3.0034e+03 6.8684e-08 0.0000e+00 1.0000e+00 3.0034e+03 3.0034e+03 1.5341e+02 1.5341e+02 2.1779e-05 2.1779e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5700e+00 1.3500e+07 5.8315e+02 3.0240e+03 6.7974e-08 0.0000e+00 1.0000e+00 3.0240e+03 3.0240e+03 1.5446e+02 1.5446e+02 2.1864e-05 2.1864e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5720e+00 1.3600e+07 5.8315e+02 3.0445e+03 6.7275e-08 0.0000e+00 1.0000e+00 3.0445e+03 3.0445e+03 1.5551e+02 1.5551e+02 2.1950e-05 2.1950e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5740e+00 1.3700e+07 5.8315e+02 3.0649e+03 6.6585e-08 0.0000e+00 1.0000e+00 3.0649e+03 3.0649e+03 1.5655e+02 1.5655e+02 2.2036e-05 2.2036e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5760e+00 1.3800e+07 5.8315e+02 3.0853e+03 6.5904e-08 0.0000e+00 1.0000e+00 3.0853e+03 3.0853e+03 1.5759e+02 1.5759e+02 2.2122e-05 2.2122e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5780e+00 1.3900e+07 5.8315e+02 3.1056e+03 6.5233e-08 0.0000e+00 1.0000e+00 3.1056e+03 3.1056e+03 1.5863e+02 1.5863e+02 2.2208e-05 2.2208e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5800e+00 1.4000e+07 5.8315e+02 3.1258e+03 6.4571e-08 0.0000e+00 1.0000e+00 3.1258e+03 3.1258e+03 1.5966e+02 1.5966e+02 2.2295e-05 2.2295e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5820e+00 1.4100e+07 5.8315e+02 3.1460e+03 6.3919e-08 0.0000e+00 1.0000e+00 3.1460e+03 3.1460e+03 1.6069e+02 1.6069e+02 2.2382e-05 2.2382e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5840e+00 1.4200e+07 5.8315e+02 3.1661e+03 6.3275e-08 0.0000e+00 1.0000e+00 3.1661e+03 3.1661e+03 1.6171e+02 1.6171e+02 2.2469e-05 2.2469e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5860e+00 1.4300e+07 5.8315e+02 3.1860e+03 6.2639e-08 0.0000e+00 1.0000e+00 3.1860e+03 3.1860e+03 1.6273e+02 1.6273e+02 2.2556e-05 2.2556e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5880e+00 1.4400e+07 5.8315e+02 3.2060e+03 6.2013e-08 0.0000e+00 1.0000e+00 3.2060e+03 3.2060e+03 1.6375e+02 1.6375e+02 2.2643e-05 2.2643e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5900e+00 1.4500e+07 5.8315e+02 3.2258e+03 6.1395e-08 0.0000e+00 1.0000e+00 3.2258e+03 3.2258e+03 1.6477e+02 1.6477e+02 2.2731e-05 2.2731e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5920e+00 1.4600e+07 5.8315e+02 3.2456e+03 6.0785e-08 0.0000e+00 1.0000e+00 3.2456e+03 3.2456e+03 1.6578e+02 1.6578e+02 2.2818e-05 2.2818e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5940e+00 1.4700e+07 5.8315e+02 3.2653e+03 6.0184e-08 0.0000e+00 1.0000e+00 3.2653e+03 3.2653e+03 1.6678e+02 1.6678e+02 2.2906e-05 2.2906e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5960e+00 1.4800e+07 5.8315e+02 3.2849e+03 5.9590e-08 0.0000e+00 1.0000e+00 3.2849e+03 3.2849e+03 1.6778e+02 1.6778e+02 2.2994e-05 2.2994e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.5980e+00 1.4900e+07 5.8315e+02 3.3044e+03 5.9005e-08 0.0000e+00 1.0000e+00 3.3044e+03 3.3044e+03 1.6878e+02 1.6878e+02 2.3082e-05 2.3082e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6000e+00 1.5000e+07 5.8315e+02 3.3239e+03 5.8427e-08 0.0000e+00 1.0000e+00 3.3239e+03 3.3239e+03 1.6977e+02 1.6977e+02 2.3170e-05 2.3170e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6020e+00 1.5100e+07 5.8315e+02 3.3433e+03 5.7857e-08 0.0000e+00 1.0000e+00 3.3433e+03 3.3433e+03 1.7076e+02 1.7076e+02 2.3258e-05 2.3258e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6040e+00 1.5200e+07 5.8315e+02 3.3626e+03 5.7295e-08 0.0000e+00 1.0000e+00 3.3626e+03 3.3626e+03 1.7175e+02 1.7175e+02 2.3346e-05 2.3346e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6060e+00 1.5300e+07 5.8315e+02 3.3818e+03 5.6740e-08 0.0000e+00 1.0000e+00 3.3818e+03 3.3818e+03 1.7273e+02 1.7273e+02 2.3435e-05 2.3435e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6080e+00 1.5400e+07 5.8315e+02 3.4009e+03 5.6192e-08 0.0000e+00 1.0000e+00 3.4009e+03 3.4009e+03 1.7371e+02 1.7371e+02 2.3523e-05 2.3523e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6100e+00 1.5500e+07 5.8315e+02 3.4200e+03 5.5652e-08 0.0000e+00 1.0000e+00 3.4200e+03 3.4200e+03 1.7468e+02 1.7468e+02 2.3612e-05 2.3612e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6120e+00 1.5600e+07 5.8315e+02 3.4390e+03 5.5119e-08 0.0000e+00 1.0000e+00 3.4390e+03 3.4390e+03 1.7566e+02 1.7566e+02 2.3700e-05 2.3700e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6140e+00 1.5700e+07 5.8315e+02 3.4579e+03 5.4593e-08 0.0000e+00 1.0000e+00 3.4579e+03 3.4579e+03 1.7662e+02 1.7662e+02 2.3789e-05 2.3789e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6160e+00 1.5800e+07 5.8315e+02 3.4768e+03 5.4073e-08 0.0000e+00 1.0000e+00 3.4768e+03 3.4768e+03 1.7758e+02 1.7758e+02 2.3878e-05 2.3878e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6180e+00 1.5900e+07 5.8315e+02 3.4955e+03 5.3561e-08 0.0000e+00 1.0000e+00 3.4955e+03 3.4955e+03 1.7854e+02 1.7854e+02 2.3967e-05 2.3967e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6200e+00 1.6000e+07 5.8315e+02 3.5142e+03 5.3055e-08 0.0000e+00 1.0000e+00 3.5142e+03 3.5142e+03 1.7950e+02 1.7950e+02 2.4056e-05 2.4056e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6220e+00 1.6100e+07 5.8315e+02 3.5328e+03 5.2556e-08 0.0000e+00 1.0000e+00 3.5328e+03 3.5328e+03 1.8045e+02 1.8045e+02 2.4145e-05 2.4145e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6240e+00 1.6200e+07 5.8315e+02 3.5513e+03 5.2063e-08 0.0000e+00 1.0000e+00 3.5513e+03 3.5513e+03 1.8139e+02 1.8139e+02 2.4234e-05 2.4234e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6260e+00 1.6300e+07 5.8315e+02 3.5698e+03 5.1577e-08 0.0000e+00 1.0000e+00 3.5698e+03 3.5698e+03 1.8234e+02 1.8234e+02 2.4323e-05 2.4323e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6280e+00 1.6400e+07 5.8315e+02 3.5882e+03 5.1097e-08 0.0000e+00 1.0000e+00 3.5882e+03 3.5882e+03 1.8327e+02 1.8327e+02 2.4412e-05 2.4412e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6300e+00 1.6500e+07 5.8315e+02 3.6065e+03 5.0623e-08 0.0000e+00 1.0000e+00 3.6065e+03 3.6065e+03 1.8421e+02 1.8421e+02 2.4501e-05 2.4501e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6320e+00 1.6600e+07 5.8315e+02 3.6247e+03 5.0155e-08 0.0000e+00 1.0000e+00 3.6247e+03 3.6247e+03 1.8514e+02 1.8514e+02 2.4590e-05 2.4590e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6340e+00 1.6700e+07 5.8315e+02 3.6428e+03 4.9693e-08 0.0000e+00 1.0000e+00 3.6428e+03 3.6428e+03 1.8607e+02 1.8607e+02 2.4679e-05 2.4679e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6360e+00 1.6800e+07 5.8315e+02 3.6609e+03 4.9237e-08 0.0000e+00 1.0000e+00 3.6609e+03 3.6609e+03 1.8699e+02 1.8699e+02 2.4768e-05 2.4768e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6380e+00 1.6900e+07 5.8315e+02 3.6789e+03 4.8787e-08 0.0000e+00 1.0000e+00 3.6789e+03 3.6789e+03 1.8791e+02 1.8791e+02 2.4858e-05 2.4858e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6400e+00 1.7000e+07 5.8315e+02 3.6968e+03 4.8343e-08 0.0000e+00 1.0000e+00 3.6968e+03 3.6968e+03 1.8882e+02 1.8882e+02 2.4947e-05 2.4947e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6420e+00 1.7100e+07 5.8315e+02 3.7146e+03 4.7905e-08 0.0000e+00 1.0000e+00 3.7146e+03 3.7146e+03 1.8973e+02 1.8973e+02 2.5036e-05 2.5036e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6440e+00 1.7200e+07 5.8315e+02 3.7324e+03 4.7472e-08 0.0000e+00 1.0000e+00 3.7324e+03 3.7324e+03 1.9064e+02 1.9064e+02 2.5125e-05 2.5125e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6460e+00 1.7300e+07 5.8315e+02 3.7500e+03 4.7044e-08 0.0000e+00 1.0000e+00 3.7500e+03 3.7500e+03 1.9154e+02 1.9154e+02 2.5214e-05 2.5214e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6480e+00 1.7400e+07 5.8315e+02 3.7676e+03 4.6622e-08 0.0000e+00 1.0000e+00 3.7676e+03 3.7676e+03 1.9244e+02 1.9244e+02 2.5303e-05 2.5303e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6500e+00 1.7500e+07 5.8315e+02 3.7852e+03 4.6205e-08 0.0000e+00 1.0000e+00 3.7852e+03 3.7852e+03 1.9334e+02 1.9334e+02 2.5392e-05 2.5392e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6520e+00 1.7600e+07 5.8315e+02 3.8026e+03 4.5794e-08 0.0000e+00 1.0000e+00 3.8026e+03 3.8026e+03 1.9423e+02 1.9423e+02 2.5481e-05 2.5481e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6540e+00 1.7700e+07 5.8315e+02 3.8200e+03 4.5387e-08 0.0000e+00 1.0000e+00 3.8200e+03 3.8200e+03 1.9512e+02 1.9512e+02 2.5570e-05 2.5570e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6560e+00 1.7800e+07 5.8315e+02 3.8373e+03 4.4986e-08 0.0000e+00 1.0000e+00 3.8373e+03 3.8373e+03 1.9600e+02 1.9600e+02 2.5659e-05 2.5659e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6580e+00 1.7900e+07 5.8315e+02 3.8545e+03 4.4590e-08 0.0000e+00 1.0000e+00 3.8545e+03 3.8545e+03 1.9688e+02 1.9688e+02 2.5748e-05 2.5748e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6600e+00 1.8000e+07 5.8315e+02 3.8717e+03 4.4199e-08 0.0000e+00 1.0000e+00 3.8717e+03 3.8717e+03 1.9776e+02 1.9776e+02 2.5837e-05 2.5837e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6620e+00 1.8100e+07 5.8315e+02 3.8888e+03 4.3812e-08 0.0000e+00 1.0000e+00 3.8888e+03 3.8888e+03 1.9863e+02 1.9863e+02 2.5926e-05 2.5926e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6640e+00 1.8200e+07 5.8315e+02 3.9058e+03 4.3431e-08 0.0000e+00 1.0000e+00 3.9058e+03 3.9058e+03 1.9950e+02 1.9950e+02 2.6015e-05 2.6015e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6660e+00 1.8300e+07 5.8315e+02 3.9227e+03 4.3054e-08 0.0000e+00 1.0000e+00 3.9227e+03 3.9227e+03 2.0036e+02 2.0036e+02 2.6104e-05 2.6104e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6680e+00 1.8400e+07 5.8315e+02 3.9395e+03 4.2682e-08 0.0000e+00 1.0000e+00 3.9395e+03 3.9395e+03 2.0122e+02 2.0122e+02 2.6192e-05 2.6192e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6700e+00 1.8500e+07 5.8315e+02 3.9563e+03 4.2314e-08 0.0000e+00 1.0000e+00 3.9563e+03 3.9563e+03 2.0208e+02 2.0208e+02 2.6281e-05 2.6281e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6720e+00 1.8600e+07 5.8315e+02 3.9730e+03 4.1951e-08 0.0000e+00 1.0000e+00 3.9730e+03 3.9730e+03 2.0293e+02 2.0293e+02 2.6369e-05 2.6369e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6740e+00 1.8700e+07 5.8315e+02 3.9896e+03 4.1593e-08 0.0000e+00 1.0000e+00 3.9896e+03 3.9896e+03 2.0378e+02 2.0378e+02 2.6458e-05 2.6458e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6760e+00 1.8800e+07 5.8315e+02 4.0062e+03 4.1239e-08 0.0000e+00 1.0000e+00 4.0062e+03 4.0062e+03 2.0463e+02 2.0463e+02 2.6546e-05 2.6546e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6780e+00 1.8900e+07 5.8315e+02 4.0227e+03 4.0889e-08 0.0000e+00 1.0000e+00 4.0227e+03 4.0227e+03 2.0547e+02 2.0547e+02 2.6634e-05 2.6634e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6800e+00 1.9000e+07 5.8315e+02 4.0391e+03 4.0543e-08 0.0000e+00 1.0000e+00 4.0391e+03 4.0391e+03 2.0631e+02 2.0631e+02 2.6722e-05 2.6722e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6820e+00 1.9100e+07 5.8315e+02 4.0554e+03 4.0202e-08 0.0000e+00 1.0000e+00 4.0554e+03 4.0554e+03 2.0714e+02 2.0714e+02 2.6811e-05 2.6811e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6840e+00 1.9200e+07 5.8315e+02 4.0717e+03 3.9865e-08 0.0000e+00 1.0000e+00 4.0717e+03 4.0717e+03 2.0797e+02 2.0797e+02 2.6899e-05 2.6899e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6860e+00 1.9300e+07 5.8315e+02 4.0879e+03 3.9532e-08 0.0000e+00 1.0000e+00 4.0879e+03 4.0879e+03 2.0880e+02 2.0880e+02 2.6986e-05 2.6986e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6880e+00 1.9400e+07 5.8315e+02 4.1040e+03 3.9203e-08 0.0000e+00 1.0000e+00 4.1040e+03 4.1040e+03 2.0962e+02 2.0962e+02 2.7074e-05 2.7074e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6900e+00 1.9500e+07 5.8315e+02 4.1201e+03 3.8878e-08 0.0000e+00 1.0000e+00 4.1201e+03 4.1201e+03 2.1044e+02 2.1044e+02 2.7162e-05 2.7162e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6920e+00 1.9600e+07 5.8315e+02 4.1361e+03 3.8556e-08 0.0000e+00 1.0000e+00 4.1361e+03 4.1361e+03 2.1126e+02 2.1126e+02 2.7250e-05 2.7250e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6940e+00 1.9700e+07 5.8315e+02 4.1520e+03 3.8239e-08 0.0000e+00 1.0000e+00 4.1520e+03 4.1520e+03 2.1207e+02 2.1207e+02 2.7337e-05 2.7337e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6960e+00 1.9800e+07 5.8315e+02 4.1678e+03 3.7926e-08 0.0000e+00 1.0000e+00 4.1678e+03 4.1678e+03 2.1288e+02 2.1288e+02 2.7425e-05 2.7425e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.6980e+00 1.9900e+07 5.8315e+02 4.1836e+03 3.7616e-08 0.0000e+00 1.0000e+00 4.1836e+03 4.1836e+03 2.1369e+02 2.1369e+02 2.7512e-05 2.7512e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7000e+00 2.0000e+07 5.8315e+02 4.1993e+03 3.7310e-08 0.0000e+00 1.0000e+00 4.1993e+03 4.1993e+03 2.1449e+02 2.1449e+02 2.7599e-05 2.7599e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7020e+00 2.0100e+07 5.8315e+02 4.2149e+03 3.7007e-08 0.0000e+00 1.0000e+00 4.2149e+03 4.2149e+03 2.1529e+02 2.1529e+02 2.7686e-05 2.7686e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7040e+00 2.0200e+07 5.8315e+02 4.2305e+03 3.6709e-08 0.0000e+00 1.0000e+00 4.2305e+03 4.2305e+03 2.1608e+02 2.1608e+02 2.7773e-05 2.7773e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7060e+00 2.0300e+07 5.8315e+02 4.2460e+03 3.6413e-08 0.0000e+00 1.0000e+00 4.2460e+03 4.2460e+03 2.1687e+02 2.1687e+02 2.7860e-05 2.7860e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7080e+00 2.0400e+07 5.8315e+02 4.2614e+03 3.6121e-08 0.0000e+00 1.0000e+00 4.2614e+03 4.2614e+03 2.1766e+02 2.1766e+02 2.7946e-05 2.7946e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7100e+00 2.0500e+07 5.8315e+02 4.2768e+03 3.5833e-08 0.0000e+00 1.0000e+00 4.2768e+03 4.2768e+03 2.1845e+02 2.1845e+02 2.8033e-05 2.8033e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7120e+00 2.0600e+07 5.8315e+02 4.2921e+03 3.5548e-08 0.0000e+00 1.0000e+00 4.2921e+03 4.2921e+03 2.1923e+02 2.1923e+02 2.8119e-05 2.8119e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7140e+00 2.0700e+07 5.8315e+02 4.3073e+03 3.5267e-08 0.0000e+00 1.0000e+00 4.3073e+03 4.3073e+03 2.2000e+02 2.2000e+02 2.8206e-05 2.8206e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7160e+00 2.0800e+07 5.8315e+02 4.3224e+03 3.4988e-08 0.0000e+00 1.0000e+00 4.3224e+03 4.3224e+03 2.2078e+02 2.2078e+02 2.8292e-05 2.8292e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7180e+00 2.0900e+07 5.8315e+02 4.3375e+03 3.4713e-08 0.0000e+00 1.0000e+00 4.3375e+03 4.3375e+03 2.2155e+02 2.2155e+02 2.8378e-05 2.8378e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7200e+00 2.1000e+07 5.8315e+02 4.3526e+03 3.4441e-08 0.0000e+00 1.0000e+00 4.3526e+03 4.3526e+03 2.2232e+02 2.2232e+02 2.8464e-05 2.8464e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7220e+00 2.1100e+07 5.8315e+02 4.3675e+03 3.4172e-08 0.0000e+00 1.0000e+00 4.3675e+03 4.3675e+03 2.2308e+02 2.2308e+02 2.8550e-05 2.8550e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7240e+00 2.1200e+07 5.8315e+02 4.3824e+03 3.3907e-08 0.0000e+00 1.0000e+00 4.3824e+03 4.3824e+03 2.2384e+02 2.2384e+02 2.8635e-05 2.8635e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7260e+00 2.1300e+07 5.8315e+02 4.3972e+03 3.3644e-08 0.0000e+00 1.0000e+00 4.3972e+03 4.3972e+03 2.2460e+02 2.2460e+02 2.8721e-05 2.8721e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7280e+00 2.1400e+07 5.8315e+02 4.4120e+03 3.3385e-08 0.0000e+00 1.0000e+00 4.4120e+03 4.4120e+03 2.2535e+02 2.2535e+02 2.8806e-05 2.8806e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7300e+00 2.1500e+07 5.8315e+02 4.4267e+03 3.3128e-08 0.0000e+00 1.0000e+00 4.4267e+03 4.4267e+03 2.2610e+02 2.2610e+02 2.8891e-05 2.8891e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7320e+00 2.1600e+07 5.8315e+02 4.4413e+03 3.2875e-08 0.0000e+00 1.0000e+00 4.4413e+03 4.4413e+03 2.2685e+02 2.2685e+02 2.8976e-05 2.8976e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7340e+00 2.1700e+07 5.8315e+02 4.4559e+03 3.2624e-08 0.0000e+00 1.0000e+00 4.4559e+03 4.4559e+03 2.2759e+02 2.2759e+02 2.9061e-05 2.9061e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7360e+00 2.1800e+07 5.8315e+02 4.4704e+03 3.2376e-08 0.0000e+00 1.0000e+00 4.4704e+03 4.4704e+03 2.2834e+02 2.2834e+02 2.9146e-05 2.9146e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7380e+00 2.1900e+07 5.8315e+02 4.4848e+03 3.2131e-08 0.0000e+00 1.0000e+00 4.4848e+03 4.4848e+03 2.2907e+02 2.2907e+02 2.9231e-05 2.9231e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7400e+00 2.2000e+07 5.8315e+02 4.4992e+03 3.1889e-08 0.0000e+00 1.0000e+00 4.4992e+03 4.4992e+03 2.2981e+02 2.2981e+02 2.9315e-05 2.9315e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7420e+00 2.2100e+07 5.8315e+02 4.5135e+03 3.1649e-08 0.0000e+00 1.0000e+00 4.5135e+03 4.5135e+03 2.3054e+02 2.3054e+02 2.9399e-05 2.9399e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7440e+00 2.2200e+07 5.8315e+02 4.5278e+03 3.1413e-08 0.0000e+00 1.0000e+00 4.5278e+03 4.5278e+03 2.3127e+02 2.3127e+02 2.9484e-05 2.9484e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7460e+00 2.2300e+07 5.8315e+02 4.5420e+03 3.1178e-08 0.0000e+00 1.0000e+00 4.5420e+03 4.5420e+03 2.3199e+02 2.3199e+02 2.9568e-05 2.9568e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7480e+00 2.2400e+07 5.8315e+02 4.5561e+03 3.0947e-08 0.0000e+00 1.0000e+00 4.5561e+03 4.5561e+03 2.3271e+02 2.3271e+02 2.9651e-05 2.9651e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7500e+00 2.2500e+07 5.8315e+02 4.5702e+03 3.0718e-08 0.0000e+00 1.0000e+00 4.5702e+03 4.5702e+03 2.3343e+02 2.3343e+02 2.9735e-05 2.9735e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7520e+00 2.2600e+07 5.8315e+02 4.5842e+03 3.0492e-08 0.0000e+00 1.0000e+00 4.5842e+03 4.5842e+03 2.3415e+02 2.3415e+02 2.9819e-05 2.9819e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7540e+00 2.2700e+07 5.8315e+02 4.5981e+03 3.0268e-08 0.0000e+00 1.0000e+00 4.5981e+03 4.5981e+03 2.3486e+02 2.3486e+02 2.9902e-05 2.9902e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7560e+00 2.2800e+07 5.8315e+02 4.6120e+03 3.0046e-08 0.0000e+00 1.0000e+00 4.6120e+03 4.6120e+03 2.3557e+02 2.3557e+02 2.9985e-05 2.9985e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7580e+00 2.2900e+07 5.8315e+02 4.6258e+03 2.9827e-08 0.0000e+00 1.0000e+00 4.6258e+03 4.6258e+03 2.3628e+02 2.3628e+02 3.0068e-05 3.0068e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7600e+00 2.3000e+07 5.8315e+02 4.6396e+03 2.9611e-08 0.0000e+00 1.0000e+00 4.6396e+03 4.6396e+03 2.3698e+02 2.3698e+02 3.0151e-05 3.0151e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7620e+00 2.3100e+07 5.8315e+02 4.6533e+03 2.9397e-08 0.0000e+00 1.0000e+00 4.6533e+03 4.6533e+03 2.3768e+02 2.3768e+02 3.0234e-05 3.0234e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7640e+00 2.3200e+07 5.8315e+02 4.6670e+03 2.9185e-08 0.0000e+00 1.0000e+00 4.6670e+03 4.6670e+03 2.3838e+02 2.3838e+02 3.0317e-05 3.0317e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7660e+00 2.3300e+07 5.8315e+02 4.6806e+03 2.8976e-08 0.0000e+00 1.0000e+00 4.6806e+03 4.6806e+03 2.3907e+02 2.3907e+02 3.0399e-05 3.0399e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7680e+00 2.3400e+07 5.8315e+02 4.6941e+03 2.8768e-08 0.0000e+00 1.0000e+00 4.6941e+03 4.6941e+03 2.3976e+02 2.3976e+02 3.0481e-05 3.0481e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7700e+00 2.3500e+07 5.8315e+02 4.7076e+03 2.8563e-08 0.0000e+00 1.0000e+00 4.7076e+03 4.7076e+03 2.4045e+02 2.4045e+02 3.0563e-05 3.0563e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7720e+00 2.3600e+07 5.8315e+02 4.7210e+03 2.8361e-08 0.0000e+00 1.0000e+00 4.7210e+03 4.7210e+03 2.4114e+02 2.4114e+02 3.0645e-05 3.0645e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7740e+00 2.3700e+07 5.8315e+02 4.7344e+03 2.8160e-08 0.0000e+00 1.0000e+00 4.7344e+03 4.7344e+03 2.4182e+02 2.4182e+02 3.0727e-05 3.0727e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7760e+00 2.3800e+07 5.8315e+02 4.7477e+03 2.7962e-08 0.0000e+00 1.0000e+00 4.7477e+03 4.7477e+03 2.4250e+02 2.4250e+02 3.0809e-05 3.0809e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7780e+00 2.3900e+07 5.8315e+02 4.7609e+03 2.7766e-08 0.0000e+00 1.0000e+00 4.7609e+03 4.7609e+03 2.4317e+02 2.4317e+02 3.0890e-05 3.0890e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7800e+00 2.4000e+07 5.8315e+02 4.7741e+03 2.7572e-08 0.0000e+00 1.0000e+00 4.7741e+03 4.7741e+03 2.4385e+02 2.4385e+02 3.0971e-05 3.0971e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7820e+00 2.4100e+07 5.8315e+02 4.7872e+03 2.7380e-08 0.0000e+00 1.0000e+00 4.7872e+03 4.7872e+03 2.4452e+02 2.4452e+02 3.1052e-05 3.1052e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7840e+00 2.4200e+07 5.8315e+02 4.8003e+03 2.7190e-08 0.0000e+00 1.0000e+00 4.8003e+03 4.8003e+03 2.4519e+02 2.4519e+02 3.1133e-05 3.1133e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7860e+00 2.4300e+07 5.8315e+02 4.8133e+03 2.7002e-08 0.0000e+00 1.0000e+00 4.8133e+03 4.8133e+03 2.4585e+02 2.4585e+02 3.1214e-05 3.1214e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7880e+00 2.4400e+07 5.8315e+02 4.8263e+03 2.6816e-08 0.0000e+00 1.0000e+00 4.8263e+03 4.8263e+03 2.4651e+02 2.4651e+02 3.1294e-05 3.1294e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7900e+00 2.4500e+07 5.8315e+02 4.8392e+03 2.6632e-08 0.0000e+00 1.0000e+00 4.8392e+03 4.8392e+03 2.4717e+02 2.4717e+02 3.1375e-05 3.1375e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7920e+00 2.4600e+07 5.8315e+02 4.8521e+03 2.6450e-08 0.0000e+00 1.0000e+00 4.8521e+03 4.8521e+03 2.4783e+02 2.4783e+02 3.1455e-05 3.1455e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7940e+00 2.4700e+07 5.8315e+02 4.8649e+03 2.6270e-08 0.0000e+00 1.0000e+00 4.8649e+03 4.8649e+03 2.4849e+02 2.4849e+02 3.1535e-05 3.1535e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7960e+00 2.4800e+07 5.8315e+02 4.8776e+03 2.6091e-08 0.0000e+00 1.0000e+00 4.8776e+03 4.8776e+03 2.4914e+02 2.4914e+02 3.1615e-05 3.1615e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.7980e+00 2.4900e+07 5.8315e+02 4.8903e+03 2.5915e-08 0.0000e+00 1.0000e+00 4.8903e+03 4.8903e+03 2.4979e+02 2.4979e+02 3.1695e-05 3.1695e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8000e+00 2.5000e+07 5.8315e+02 4.9030e+03 2.5740e-08 0.0000e+00 1.0000e+00 4.9030e+03 4.9030e+03 2.5043e+02 2.5043e+02 3.1774e-05 3.1774e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8020e+00 2.5100e+07 5.8315e+02 4.9156e+03 2.5568e-08 0.0000e+00 1.0000e+00 4.9156e+03 4.9156e+03 2.5107e+02 2.5107e+02 3.1854e-05 3.1854e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8040e+00 2.5200e+07 5.8315e+02 4.9281e+03 2.5397e-08 0.0000e+00 1.0000e+00 4.9281e+03 4.9281e+03 2.5172e+02 2.5172e+02 3.1933e-05 3.1933e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8060e+00 2.5300e+07 5.8315e+02 4.9406e+03 2.5228e-08 0.0000e+00 1.0000e+00 4.9406e+03 4.9406e+03 2.5235e+02 2.5235e+02 3.2012e-05 3.2012e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8080e+00 2.5400e+07 5.8315e+02 4.9530e+03 2.5060e-08 0.0000e+00 1.0000e+00 4.9530e+03 4.9530e+03 2.5299e+02 2.5299e+02 3.2091e-05 3.2091e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8100e+00 2.5500e+07 5.8315e+02 4.9654e+03 2.4894e-08 0.0000e+00 1.0000e+00 4.9654e+03 4.9654e+03 2.5362e+02 2.5362e+02 3.2170e-05 3.2170e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8120e+00 2.5600e+07 5.8315e+02 4.9778e+03 2.4730e-08 0.0000e+00 1.0000e+00 4.9778e+03 4.9778e+03 2.5425e+02 2.5425e+02 3.2248e-05 3.2248e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8140e+00 2.5700e+07 5.8315e+02 4.9901e+03 2.4568e-08 0.0000e+00 1.0000e+00 4.9901e+03 4.9901e+03 2.5488e+02 2.5488e+02 3.2326e-05 3.2326e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8160e+00 2.5800e+07 5.8315e+02 5.0023e+03 2.4407e-08 0.0000e+00 1.0000e+00 5.0023e+03 5.0023e+03 2.5550e+02 2.5550e+02 3.2405e-05 3.2405e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8180e+00 2.5900e+07 5.8315e+02 5.0145e+03 2.4248e-08 0.0000e+00 1.0000e+00 5.0145e+03 5.0145e+03 2.5613e+02 2.5613e+02 3.2483e-05 3.2483e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8200e+00 2.6000e+07 5.8315e+02 5.0266e+03 2.4091e-08 0.0000e+00 1.0000e+00 5.0266e+03 5.0266e+03 2.5675e+02 2.5675e+02 3.2560e-05 3.2560e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8220e+00 2.6100e+07 5.8315e+02 5.0387e+03 2.3935e-08 0.0000e+00 1.0000e+00 5.0387e+03 5.0387e+03 2.5736e+02 2.5736e+02 3.2638e-05 3.2638e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8240e+00 2.6200e+07 5.8315e+02 5.0507e+03 2.3781e-08 0.0000e+00 1.0000e+00 5.0507e+03 5.0507e+03 2.5798e+02 2.5798e+02 3.2716e-05 3.2716e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8260e+00 2.6300e+07 5.8315e+02 5.0627e+03 2.3628e-08 0.0000e+00 1.0000e+00 5.0627e+03 5.0627e+03 2.5859e+02 2.5859e+02 3.2793e-05 3.2793e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8280e+00 2.6400e+07 5.8315e+02 5.0747e+03 2.3477e-08 0.0000e+00 1.0000e+00 5.0747e+03 5.0747e+03 2.5920e+02 2.5920e+02 3.2870e-05 3.2870e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8300e+00 2.6500e+07 5.8315e+02 5.0865e+03 2.3327e-08 0.0000e+00 1.0000e+00 5.0865e+03 5.0865e+03 2.5981e+02 2.5981e+02 3.2947e-05 3.2947e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8320e+00 2.6600e+07 5.8315e+02 5.0984e+03 2.3179e-08 0.0000e+00 1.0000e+00 5.0984e+03 5.0984e+03 2.6041e+02 2.6041e+02 3.3024e-05 3.3024e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8340e+00 2.6700e+07 5.8315e+02 5.1102e+03 2.3032e-08 0.0000e+00 1.0000e+00 5.1102e+03 5.1102e+03 2.6101e+02 2.6101e+02 3.3101e-05 3.3101e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8360e+00 2.6800e+07 5.8315e+02 5.1219e+03 2.2887e-08 0.0000e+00 1.0000e+00 5.1219e+03 5.1219e+03 2.6161e+02 2.6161e+02 3.3177e-05 3.3177e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8380e+00 2.6900e+07 5.8315e+02 5.1336e+03 2.2743e-08 0.0000e+00 1.0000e+00 5.1336e+03 5.1336e+03 2.6221e+02 2.6221e+02 3.3253e-05 3.3253e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8400e+00 2.7000e+07 5.8315e+02 5.1453e+03 2.2601e-08 0.0000e+00 1.0000e+00 5.1453e+03 5.1453e+03 2.6281e+02 2.6281e+02 3.3330e-05 3.3330e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8420e+00 2.7100e+07 5.8315e+02 5.1569e+03 2.2460e-08 0.0000e+00 1.0000e+00 5.1569e+03 5.1569e+03 2.6340e+02 2.6340e+02 3.3406e-05 3.3406e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8440e+00 2.7200e+07 5.8315e+02 5.1684e+03 2.2320e-08 0.0000e+00 1.0000e+00 5.1684e+03 5.1684e+03 2.6399e+02 2.6399e+02 3.3481e-05 3.3481e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8460e+00 2.7300e+07 5.8315e+02 5.1800e+03 2.2182e-08 0.0000e+00 1.0000e+00 5.1800e+03 5.1800e+03 2.6458e+02 2.6458e+02 3.3557e-05 3.3557e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8480e+00 2.7400e+07 5.8315e+02 5.1914e+03 2.2045e-08 0.0000e+00 1.0000e+00 5.1914e+03 5.1914e+03 2.6516e+02 2.6516e+02 3.3632e-05 3.3632e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8500e+00 2.7500e+07 5.8315e+02 5.2028e+03 2.1909e-08 0.0000e+00 1.0000e+00 5.2028e+03 5.2028e+03 2.6575e+02 2.6575e+02 3.3708e-05 3.3708e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8520e+00 2.7600e+07 5.8315e+02 5.2142e+03 2.1775e-08 0.0000e+00 1.0000e+00 5.2142e+03 5.2142e+03 2.6633e+02 2.6633e+02 3.3783e-05 3.3783e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8540e+00 2.7700e+07 5.8315e+02 5.2256e+03 2.1642e-08 0.0000e+00 1.0000e+00 5.2256e+03 5.2256e+03 2.6691e+02 2.6691e+02 3.3858e-05 3.3858e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8560e+00 2.7800e+07 5.8315e+02 5.2368e+03 2.1510e-08 0.0000e+00 1.0000e+00 5.2368e+03 5.2368e+03 2.6748e+02 2.6748e+02 3.3933e-05 3.3933e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8580e+00 2.7900e+07 5.8315e+02 5.2481e+03 2.1380e-08 0.0000e+00 1.0000e+00 5.2481e+03 5.2481e+03 2.6806e+02 2.6806e+02 3.4007e-05 3.4007e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8600e+00 2.8000e+07 5.8315e+02 5.2593e+03 2.1251e-08 0.0000e+00 1.0000e+00 5.2593e+03 5.2593e+03 2.6863e+02 2.6863e+02 3.4082e-05 3.4082e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8620e+00 2.8100e+07 5.8315e+02 5.2704e+03 2.1123e-08 0.0000e+00 1.0000e+00 5.2704e+03 5.2704e+03 2.6920e+02 2.6920e+02 3.4156e-05 3.4156e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8640e+00 2.8200e+07 5.8315e+02 5.2815e+03 2.0996e-08 0.0000e+00 1.0000e+00 5.2815e+03 5.2815e+03 2.6977e+02 2.6977e+02 3.4230e-05 3.4230e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8660e+00 2.8300e+07 5.8315e+02 5.2926e+03 2.0870e-08 0.0000e+00 1.0000e+00 5.2926e+03 5.2926e+03 2.7033e+02 2.7033e+02 3.4304e-05 3.4304e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8680e+00 2.8400e+07 5.8315e+02 5.3036e+03 2.0746e-08 0.0000e+00 1.0000e+00 5.3036e+03 5.3036e+03 2.7090e+02 2.7090e+02 3.4378e-05 3.4378e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8700e+00 2.8500e+07 5.8315e+02 5.3146e+03 2.0623e-08 0.0000e+00 1.0000e+00 5.3146e+03 5.3146e+03 2.7146e+02 2.7146e+02 3.4452e-05 3.4452e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8720e+00 2.8600e+07 5.8315e+02 5.3256e+03 2.0501e-08 0.0000e+00 1.0000e+00 5.3256e+03 5.3256e+03 2.7202e+02 2.7202e+02 3.4525e-05 3.4525e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8740e+00 2.8700e+07 5.8315e+02 5.3365e+03 2.0380e-08 0.0000e+00 1.0000e+00 5.3365e+03 5.3365e+03 2.7257e+02 2.7257e+02 3.4599e-05 3.4599e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8760e+00 2.8800e+07 5.8315e+02 5.3473e+03 2.0260e-08 0.0000e+00 1.0000e+00 5.3473e+03 5.3473e+03 2.7313e+02 2.7313e+02 3.4672e-05 3.4672e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8780e+00 2.8900e+07 5.8315e+02 5.3581e+03 2.0141e-08 0.0000e+00 1.0000e+00 5.3581e+03 5.3581e+03 2.7368e+02 2.7368e+02 3.4745e-05 3.4745e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8800e+00 2.9000e+07 5.8315e+02 5.3689e+03 2.0024e-08 0.0000e+00 1.0000e+00 5.3689e+03 5.3689e+03 2.7423e+02 2.7423e+02 3.4818e-05 3.4818e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8820e+00 2.9100e+07 5.8315e+02 5.3796e+03 1.9907e-08 0.0000e+00 1.0000e+00 5.3796e+03 5.3796e+03 2.7478e+02 2.7478e+02 3.4890e-05 3.4890e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8840e+00 2.9200e+07 5.8315e+02 5.3903e+03 1.9792e-08 0.0000e+00 1.0000e+00 5.3903e+03 5.3903e+03 2.7532e+02 2.7532e+02 3.4963e-05 3.4963e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8860e+00 2.9300e+07 5.8315e+02 5.4010e+03 1.9678e-08 0.0000e+00 1.0000e+00 5.4010e+03 5.4010e+03 2.7587e+02 2.7587e+02 3.5035e-05 3.5035e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8880e+00 2.9400e+07 5.8315e+02 5.4116e+03 1.9564e-08 0.0000e+00 1.0000e+00 5.4116e+03 5.4116e+03 2.7641e+02 2.7641e+02 3.5107e-05 3.5107e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8900e+00 2.9500e+07 5.8315e+02 5.4221e+03 1.9452e-08 0.0000e+00 1.0000e+00 5.4221e+03 5.4221e+03 2.7695e+02 2.7695e+02 3.5179e-05 3.5179e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8920e+00 2.9600e+07 5.8315e+02 5.4327e+03 1.9341e-08 0.0000e+00 1.0000e+00 5.4327e+03 5.4327e+03 2.7749e+02 2.7749e+02 3.5251e-05 3.5251e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8940e+00 2.9700e+07 5.8315e+02 5.4431e+03 1.9231e-08 0.0000e+00 1.0000e+00 5.4431e+03 5.4431e+03 2.7802e+02 2.7802e+02 3.5323e-05 3.5323e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8960e+00 2.9800e+07 5.8315e+02 5.4536e+03 1.9121e-08 0.0000e+00 1.0000e+00 5.4536e+03 5.4536e+03 2.7856e+02 2.7856e+02 3.5394e-05 3.5394e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.8980e+00 2.9900e+07 5.8315e+02 5.4640e+03 1.9013e-08 0.0000e+00 1.0000e+00 5.4640e+03 5.4640e+03 2.7909e+02 2.7909e+02 3.5466e-05 3.5466e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9000e+00 3.0000e+07 5.8315e+02 5.4744e+03 1.8906e-08 0.0000e+00 1.0000e+00 5.4744e+03 5.4744e+03 2.7962e+02 2.7962e+02 3.5537e-05 3.5537e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9020e+00 3.0100e+07 5.8315e+02 5.4847e+03 1.8800e-08 0.0000e+00 1.0000e+00 5.4847e+03 5.4847e+03 2.8014e+02 2.8014e+02 3.5608e-05 3.5608e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9040e+00 3.0200e+07 5.8315e+02 5.4950e+03 1.8694e-08 0.0000e+00 1.0000e+00 5.4950e+03 5.4950e+03 2.8067e+02 2.8067e+02 3.5679e-05 3.5679e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9060e+00 3.0300e+07 5.8315e+02 5.5053e+03 1.8590e-08 0.0000e+00 1.0000e+00 5.5053e+03 5.5053e+03 2.8119e+02 2.8119e+02 3.5750e-05 3.5750e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9080e+00 3.0400e+07 5.8315e+02 5.5155e+03 1.8486e-08 0.0000e+00 1.0000e+00 5.5155e+03 5.5155e+03 2.8172e+02 2.8172e+02 3.5821e-05 3.5821e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9100e+00 3.0500e+07 5.8315e+02 5.5256e+03 1.8384e-08 0.0000e+00 1.0000e+00 5.5256e+03 5.5256e+03 2.8224e+02 2.8224e+02 3.5891e-05 3.5891e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9120e+00 3.0600e+07 5.8315e+02 5.5358e+03 1.8282e-08 0.0000e+00 1.0000e+00 5.5358e+03 5.5358e+03 2.8275e+02 2.8275e+02 3.5961e-05 3.5961e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9140e+00 3.0700e+07 5.8315e+02 5.5459e+03 1.8182e-08 0.0000e+00 1.0000e+00 5.5459e+03 5.5459e+03 2.8327e+02 2.8327e+02 3.6032e-05 3.6032e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9160e+00 3.0800e+07 5.8315e+02 5.5559e+03 1.8082e-08 0.0000e+00 1.0000e+00 5.5559e+03 5.5559e+03 2.8378e+02 2.8378e+02 3.6102e-05 3.6102e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9180e+00 3.0900e+07 5.8315e+02 5.5660e+03 1.7983e-08 0.0000e+00 1.0000e+00 5.5660e+03 5.5660e+03 2.8430e+02 2.8430e+02 3.6171e-05 3.6171e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9200e+00 3.1000e+07 5.8315e+02 5.5760e+03 1.7885e-08 0.0000e+00 1.0000e+00 5.5760e+03 5.5760e+03 2.8481e+02 2.8481e+02 3.6241e-05 3.6241e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9220e+00 3.1100e+07 5.8315e+02 5.5859e+03 1.7787e-08 0.0000e+00 1.0000e+00 5.5859e+03 5.5859e+03 2.8531e+02 2.8531e+02 3.6311e-05 3.6311e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9240e+00 3.1200e+07 5.8315e+02 5.5958e+03 1.7691e-08 0.0000e+00 1.0000e+00 5.5958e+03 5.5958e+03 2.8582e+02 2.8582e+02 3.6380e-05 3.6380e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9260e+00 3.1300e+07 5.8315e+02 5.6057e+03 1.7595e-08 0.0000e+00 1.0000e+00 5.6057e+03 5.6057e+03 2.8633e+02 2.8633e+02 3.6449e-05 3.6449e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9280e+00 3.1400e+07 5.8315e+02 5.6156e+03 1.7501e-08 0.0000e+00 1.0000e+00 5.6156e+03 5.6156e+03 2.8683e+02 2.8683e+02 3.6518e-05 3.6518e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9300e+00 3.1500e+07 5.8315e+02 5.6254e+03 1.7407e-08 0.0000e+00 1.0000e+00 5.6254e+03 5.6254e+03 2.8733e+02 2.8733e+02 3.6587e-05 3.6587e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9320e+00 3.1600e+07 5.8315e+02 5.6352e+03 1.7314e-08 0.0000e+00 1.0000e+00 5.6352e+03 5.6352e+03 2.8783e+02 2.8783e+02 3.6656e-05 3.6656e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9340e+00 3.1700e+07 5.8315e+02 5.6449e+03 1.7221e-08 0.0000e+00 1.0000e+00 5.6449e+03 5.6449e+03 2.8833e+02 2.8833e+02 3.6725e-05 3.6725e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9360e+00 3.1800e+07 5.8315e+02 5.6546e+03 1.7130e-08 0.0000e+00 1.0000e+00 5.6546e+03 5.6546e+03 2.8882e+02 2.8882e+02 3.6793e-05 3.6793e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9380e+00 3.1900e+07 5.8315e+02 5.6643e+03 1.7039e-08 0.0000e+00 1.0000e+00 5.6643e+03 5.6643e+03 2.8932e+02 2.8932e+02 3.6862e-05 3.6862e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9400e+00 3.2000e+07 5.8315e+02 5.6739e+03 1.6949e-08 0.0000e+00 1.0000e+00 5.6739e+03 5.6739e+03 2.8981e+02 2.8981e+02 3.6930e-05 3.6930e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9420e+00 3.2100e+07 5.8315e+02 5.6835e+03 1.6860e-08 0.0000e+00 1.0000e+00 5.6835e+03 5.6835e+03 2.9030e+02 2.9030e+02 3.6998e-05 3.6998e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9440e+00 3.2200e+07 5.8315e+02 5.6931e+03 1.6771e-08 0.0000e+00 1.0000e+00 5.6931e+03 5.6931e+03 2.9079e+02 2.9079e+02 3.7066e-05 3.7066e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9460e+00 3.2300e+07 5.8315e+02 5.7026e+03 1.6684e-08 0.0000e+00 1.0000e+00 5.7026e+03 5.7026e+03 2.9127e+02 2.9127e+02 3.7134e-05 3.7134e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9480e+00 3.2400e+07 5.8315e+02 5.7121e+03 1.6597e-08 0.0000e+00 1.0000e+00 5.7121e+03 5.7121e+03 2.9176e+02 2.9176e+02 3.7202e-05 3.7202e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9500e+00 3.2500e+07 5.8315e+02 5.7216e+03 1.6510e-08 0.0000e+00 1.0000e+00 5.7216e+03 5.7216e+03 2.9224e+02 2.9224e+02 3.7269e-05 3.7269e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9520e+00 3.2600e+07 5.8315e+02 5.7310e+03 1.6425e-08 0.0000e+00 1.0000e+00 5.7310e+03 5.7310e+03 2.9272e+02 2.9272e+02 3.7337e-05 3.7337e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9540e+00 3.2700e+07 5.8315e+02 5.7404e+03 1.6340e-08 0.0000e+00 1.0000e+00 5.7404e+03 5.7404e+03 2.9320e+02 2.9320e+02 3.7404e-05 3.7404e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9560e+00 3.2800e+07 5.8315e+02 5.7497e+03 1.6256e-08 0.0000e+00 1.0000e+00 5.7497e+03 5.7497e+03 2.9368e+02 2.9368e+02 3.7471e-05 3.7471e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9580e+00 3.2900e+07 5.8315e+02 5.7591e+03 1.6173e-08 0.0000e+00 1.0000e+00 5.7591e+03 5.7591e+03 2.9416e+02 2.9416e+02 3.7538e-05 3.7538e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9600e+00 3.3000e+07 5.8315e+02 5.7684e+03 1.6090e-08 0.0000e+00 1.0000e+00 5.7684e+03 5.7684e+03 2.9463e+02 2.9463e+02 3.7605e-05 3.7605e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9620e+00 3.3100e+07 5.8315e+02 5.7776e+03 1.6008e-08 0.0000e+00 1.0000e+00 5.7776e+03 5.7776e+03 2.9511e+02 2.9511e+02 3.7671e-05 3.7671e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9640e+00 3.3200e+07 5.8315e+02 5.7869e+03 1.5927e-08 0.0000e+00 1.0000e+00 5.7869e+03 5.7869e+03 2.9558e+02 2.9558e+02 3.7738e-05 3.7738e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9660e+00 3.3300e+07 5.8315e+02 5.7961e+03 1.5846e-08 0.0000e+00 1.0000e+00 5.7961e+03 5.7961e+03 2.9605e+02 2.9605e+02 3.7804e-05 3.7804e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9680e+00 3.3400e+07 5.8315e+02 5.8052e+03 1.5766e-08 0.0000e+00 1.0000e+00 5.8052e+03 5.8052e+03 2.9652e+02 2.9652e+02 3.7871e-05 3.7871e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9700e+00 3.3500e+07 5.8315e+02 5.8144e+03 1.5686e-08 0.0000e+00 1.0000e+00 5.8144e+03 5.8144e+03 2.9698e+02 2.9698e+02 3.7937e-05 3.7937e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9720e+00 3.3600e+07 5.8315e+02 5.8235e+03 1.5608e-08 0.0000e+00 1.0000e+00 5.8235e+03 5.8235e+03 2.9745e+02 2.9745e+02 3.8003e-05 3.8003e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9740e+00 3.3700e+07 5.8315e+02 5.8326e+03 1.5530e-08 0.0000e+00 1.0000e+00 5.8326e+03 5.8326e+03 2.9791e+02 2.9791e+02 3.8069e-05 3.8069e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9760e+00 3.3800e+07 5.8315e+02 5.8416e+03 1.5452e-08 0.0000e+00 1.0000e+00 5.8416e+03 5.8416e+03 2.9837e+02 2.9837e+02 3.8134e-05 3.8134e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9780e+00 3.3900e+07 5.8315e+02 5.8506e+03 1.5375e-08 0.0000e+00 1.0000e+00 5.8506e+03 5.8506e+03 2.9883e+02 2.9883e+02 3.8200e-05 3.8200e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9800e+00 3.4000e+07 5.8315e+02 5.8596e+03 1.5299e-08 0.0000e+00 1.0000e+00 5.8596e+03 5.8596e+03 2.9929e+02 2.9929e+02 3.8265e-05 3.8265e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9820e+00 3.4100e+07 5.8315e+02 5.8685e+03 1.5223e-08 0.0000e+00 1.0000e+00 5.8685e+03 5.8685e+03 2.9975e+02 2.9975e+02 3.8331e-05 3.8331e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9840e+00 3.4200e+07 5.8315e+02 5.8775e+03 1.5148e-08 0.0000e+00 1.0000e+00 5.8775e+03 5.8775e+03 3.0020e+02 3.0020e+02 3.8396e-05 3.8396e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9860e+00 3.4300e+07 5.8315e+02 5.8863e+03 1.5074e-08 0.0000e+00 1.0000e+00 5.8863e+03 5.8863e+03 3.0066e+02 3.0066e+02 3.8461e-05 3.8461e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9880e+00 3.4400e+07 5.8315e+02 5.8952e+03 1.5000e-08 0.0000e+00 1.0000e+00 5.8952e+03 5.8952e+03 3.0111e+02 3.0111e+02 3.8526e-05 3.8526e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9900e+00 3.4500e+07 5.8315e+02 5.9040e+03 1.4927e-08 0.0000e+00 1.0000e+00 5.9040e+03 5.9040e+03 3.0156e+02 3.0156e+02 3.8591e-05 3.8591e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9920e+00 3.4600e+07 5.8315e+02 5.9128e+03 1.4854e-08 0.0000e+00 1.0000e+00 5.9128e+03 5.9128e+03 3.0201e+02 3.0201e+02 3.8655e-05 3.8655e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9940e+00 3.4700e+07 5.8315e+02 5.9216e+03 1.4782e-08 0.0000e+00 1.0000e+00 5.9216e+03 5.9216e+03 3.0246e+02 3.0246e+02 3.8720e-05 3.8720e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9960e+00 3.4800e+07 5.8315e+02 5.9303e+03 1.4711e-08 0.0000e+00 1.0000e+00 5.9303e+03 5.9303e+03 3.0291e+02 3.0291e+02 3.8784e-05 3.8784e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +1.9980e+00 3.4900e+07 5.8315e+02 5.9390e+03 1.4640e-08 0.0000e+00 1.0000e+00 5.9390e+03 5.9390e+03 3.0335e+02 3.0335e+02 3.8849e-05 3.8849e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 +2.0000e+00 3.5000e+07 5.8315e+02 5.9477e+03 1.4569e-08 0.0000e+00 1.0000e+00 5.9477e+03 5.9477e+03 3.0379e+02 3.0379e+02 3.8913e-05 3.8913e-05 4.9060e-03 2.5695e-03 7.9973e-01 9.1430e-02 4.7818e-02 1.8822e-02 6.9494e-03 4.3126e-03 2.3463e-02 9.0000e-03 3.0000e-03 5.3470e-01 1.1460e-01 8.7900e-02 4.5600e-02 2.0900e-02 1.5100e-02 1.6920e-01 diff --git a/src/docs/sphinx/CompleteXMLSchema.rst b/src/docs/sphinx/CompleteXMLSchema.rst index 73517d48697..90a6a194047 100644 --- a/src/docs/sphinx/CompleteXMLSchema.rst +++ b/src/docs/sphinx/CompleteXMLSchema.rst @@ -227,18 +227,32 @@ Element: CompositionalMultiphaseWell .. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseWell.rst -.. _XML_CompositonalTwoPhaseFluidPengRobinson: +.. _XML_CompositionalTwoPhaseFluidPengRobinson: -Element: CompositonalTwoPhaseFluidPengRobinson -============================================== -.. include:: ../../coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson.rst +Element: CompositionalTwoPhaseFluidPengRobinson +=============================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst -.. _XML_CompositonalTwoPhaseFluidSoaveRedlichKwong: +.. _XML_CompositionalTwoPhaseFluidPengRobinsonLBC: -Element: CompositonalTwoPhaseFluidSoaveRedlichKwong -=================================================== -.. include:: ../../coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong.rst +Element: CompositionalTwoPhaseFluidPengRobinsonLBC +================================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst + + +.. _XML_CompositionalTwoPhaseFluidSoaveRedlichKwong: + +Element: CompositionalTwoPhaseFluidSoaveRedlichKwong +==================================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst + + +.. _XML_CompositionalTwoPhaseFluidSoaveRedlichKwongLBC: + +Element: CompositionalTwoPhaseFluidSoaveRedlichKwongLBC +======================================================= +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst .. _XML_CompressibleSinglePhaseFluid: @@ -1631,18 +1645,32 @@ Datastructure: CompositionalMultiphaseWell .. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst -.. _DATASTRUCTURE_CompositonalTwoPhaseFluidPengRobinson: +.. _DATASTRUCTURE_CompositionalTwoPhaseFluidPengRobinson: -Datastructure: CompositonalTwoPhaseFluidPengRobinson -==================================================== -.. include:: ../../coreComponents/schema/docs/CompositonalTwoPhaseFluidPengRobinson_other.rst +Datastructure: CompositionalTwoPhaseFluidPengRobinson +===================================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson_other.rst -.. _DATASTRUCTURE_CompositonalTwoPhaseFluidSoaveRedlichKwong: +.. _DATASTRUCTURE_CompositionalTwoPhaseFluidPengRobinsonLBC: -Datastructure: CompositonalTwoPhaseFluidSoaveRedlichKwong -========================================================= -.. include:: ../../coreComponents/schema/docs/CompositonalTwoPhaseFluidSoaveRedlichKwong_other.rst +Datastructure: CompositionalTwoPhaseFluidPengRobinsonLBC +======================================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst + + +.. _DATASTRUCTURE_CompositionalTwoPhaseFluidSoaveRedlichKwong: + +Datastructure: CompositionalTwoPhaseFluidSoaveRedlichKwong +========================================================== +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst + + +.. _DATASTRUCTURE_CompositionalTwoPhaseFluidSoaveRedlichKwongLBC: + +Datastructure: CompositionalTwoPhaseFluidSoaveRedlichKwongLBC +============================================================= +.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst .. _DATASTRUCTURE_CompressibleSinglePhaseFluid: From 2a2d045d160f6424d38fd1880533bf19ea456ae9 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" <50467563+victorapm@users.noreply.github.com> Date: Tue, 7 May 2024 10:59:51 -0400 Subject: [PATCH 052/286] Update MultiphasePoromechanics.hpp (#3098) Add missing change from PR #3066 involving the removal of F-relaxation whenever ILU is used as global relaxation --- .../interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp index c8a9c878213..22cda3aa388 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp @@ -87,8 +87,7 @@ class MultiphasePoromechanics : public MGRStrategyBase< 3 > m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // Level 2 - m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[2] = 1; + m_levelFRelaxType[2] = MGRFRelaxationType::none; m_levelInterpType[2] = MGRInterpolationType::injection; m_levelRestrictType[2] = MGRRestrictionType::blockColLumped; // True-IMPES m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkinRAI; From 2d4e867cda393fcf224fe9475c07f98c8a5ed08d Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 7 May 2024 10:01:07 -0500 Subject: [PATCH 053/286] Fix setMGRStrategy logic for SinglePhaseReservoirAndWells (#3111) --- .../CompositionalMultiphaseReservoirAndWells.cpp | 12 ++++++++---- .../multiphysics/SinglePhaseReservoirAndWells.cpp | 10 +++++++--- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index ef75ab18317..6b4f9069c06 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -103,13 +103,15 @@ void CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase >:: setMGRStrategy() { - if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseFVM ) + if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM ) { - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirFVM; + // add Reservoir + m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirHybridFVM; } else { - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirHybridFVM; + // add Reservoir + m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirFVM; } } @@ -118,12 +120,14 @@ void CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics< CompositionalMultiphaseBase > >:: setMGRStrategy() { + // flow solver here is indeed flow solver, not poromechanics solver if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM ) { - GEOS_LOG_RANK_0( "The MGR strategy for hybrid FVM is not implemented" ); + GEOS_LOG_RANK_0( "The poromechanics MGR strategy for hybrid FVM is not implemented" ); } else { + // add Reservoir m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanicsReservoirFVM; } } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index 871982d3787..d3673115083 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -97,12 +97,14 @@ void SinglePhaseReservoirAndWells< SinglePhaseBase >:: setMGRStrategy() { - if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirHybridFVM ) + if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseHybridFVM ) { + // add Reservoir m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirHybridFVM; } else { + // add Reservoir m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirFVM; } } @@ -112,12 +114,14 @@ void SinglePhaseReservoirAndWells< SinglePhasePoromechanics< SinglePhaseBase > >:: setMGRStrategy() { - if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirHybridFVM ) + // flow solver here is indeed flow solver, not poromechanics solver + if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseHybridFVM ) { - GEOS_LOG_RANK_0( "The MGR strategy for hybrid FVM is not implemented" ); + GEOS_LOG_RANK_0( "The poromechanics MGR strategy for hybrid FVM is not implemented" ); } else { + // add Reservoir m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsReservoirFVM; } } From 35aea0e7b5bbcbf3a25e01fecd9eefce4dde97e1 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Tue, 7 May 2024 15:39:14 -0700 Subject: [PATCH 054/286] Update integrated test baseline storage (#3044) --- .github/workflows/build_and_test.yml | 24 +- .github/workflows/ci_tests.yml | 16 + .gitmodules | 3 - .integrated_tests.yaml | 8 + .readthedocs.yml | 1 - BASELINE_NOTES.md | 16 + host-configs/LLNL/quartz-base.cmake | 6 +- inputFiles/solidMechanics/sedov.ats | 4 + integratedTests | 1 - scripts/check_baseline_log.sh | 12 + scripts/ci_build_and_test_in_container.sh | 60 +++- scripts/setupPythonEnvironment.bash | 3 + src/CMakeLists.txt | 4 + .../docs/AcousticFirstOrderSEM_other.rst | 2 +- .../schema/docs/AcousticSEM_other.rst | 2 +- .../schema/docs/AcousticVTISEM_other.rst | 2 +- .../docs/ElasticFirstOrderSEM_other.rst | 2 +- .../schema/docs/ElasticSEM_other.rst | 2 +- .../docs/SolidMechanicsLagrangeContact.rst | 51 +-- .../schema/docs/elementRegionsGroup_other.rst | 12 +- .../docs/particleRegionsGroup_other.rst | 10 +- src/coreComponents/schema/schema.xsd | 2 + src/coreComponents/schema/schema.xsd.other | 296 ++++++++-------- .../Contributing/IntegratedTests.rst | 324 ++++++------------ .../integrated_test_location_pr_a.png | Bin 0 -> 1083078 bytes .../integrated_test_location_pr_b.png | Bin 0 -> 2317536 bytes 26 files changed, 430 insertions(+), 433 deletions(-) create mode 100644 .integrated_tests.yaml create mode 100644 BASELINE_NOTES.md delete mode 160000 integratedTests create mode 100755 scripts/check_baseline_log.sh create mode 100644 src/docs/sphinx/developerGuide/Contributing/integrated_test_location_pr_a.png create mode 100644 src/docs/sphinx/developerGuide/Contributing/integrated_test_location_pr_b.png diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index d7fd4c14cd5..77017f45693 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -43,6 +43,9 @@ on: RUNS_ON: required: true type: string + UPLOAD_BASELINES: + required: false + type: string USE_SCCACHE: required: false type: boolean @@ -200,8 +203,25 @@ jobs: # Send to the bucket and print the download link when it makes sense. if [[ ! -z "${{ inputs.GCP_BUCKET }}" ]]; then if [[ "${{ inputs.BUILD_TYPE }}" = "integrated_tests" || ${EXIT_STATUS} -eq 0 ]]; then - CLOUDSDK_PYTHON=python3 gsutil cp -a public-read ${DATA_EXCHANGE_DIR}/${DATA_BASENAME} gs://${{ inputs.GCP_BUCKET }}/ - echo "Download the bundle at https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/${DATA_BASENAME}" + if [ -f ${DATA_EXCHANGE_DIR}/${DATA_BASENAME} ]; then + CLOUDSDK_PYTHON=python3 gsutil cp -a public-read ${DATA_EXCHANGE_DIR}/${DATA_BASENAME} gs://${{ inputs.GCP_BUCKET }}/ + echo "Download the bundle at https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/${DATA_BASENAME}" + fi + + if [ -f ${DATA_EXCHANGE_DIR}/test_logs_${DATA_BASENAME} ]; then + CLOUDSDK_PYTHON=python3 gsutil cp -a public-read ${DATA_EXCHANGE_DIR}/test_logs_${DATA_BASENAME} gs://${{ inputs.GCP_BUCKET }}/ + echo "Download integrated test logs here: https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/test_logs_${DATA_BASENAME}" + fi + + # if $UPLOAD_BASELINES; then + if [ -f ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} ];then + CLOUDSDK_PYTHON=python3 gsutil cp -a public-read ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} gs://${{ inputs.GCP_BUCKET }}/ + echo "Download test baselines here: https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/baseline_${DATA_BASENAME}" + echo "New baseline ID: baseline_${DATA_BASENAME::-7}" + else + echo "Baselines ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} were not uploaded. Likeyly because no rebaseline was necessary." + fi + # fi fi fi diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 40e4953fa93..b13bf8e5554 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -202,6 +202,22 @@ jobs: RUNS_ON: streak2 DOCKER_RUN_ARGS: "--cpus=32 --memory=384g" REQUIRED_LABEL: "ci: run integrated tests" + UPLOAD_BASELINES: "ci: upload test baselines" + + baseline_log: + needs: [is_not_draft_pull_request] + runs-on: ubuntu-22.04 + steps: + - name: Checkout Repository + uses: actions/checkout@v4.1.1 + with: + submodules: false + lfs: false + fetch-depth: 0 + sparse-checkout: | + scripts + - name: Check that the baseline logs are modified if rebaselines are detected + run: "scripts/check_baseline_log.sh" code_coverage: needs: diff --git a/.gitmodules b/.gitmodules index a2d2fa8ccf5..029ba71a9ab 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,9 +7,6 @@ [submodule "src/coreComponents/constitutive/PVTPackage"] path = src/coreComponents/constitutive/PVTPackage url = ../../GEOS-DEV/PVTPackage.git -[submodule "integratedTests"] - path = integratedTests - url = ../../GEOS-DEV/integratedTests.git [submodule "src/coreComponents/fileIO/coupling/hdf5_interface"] path = src/coreComponents/fileIO/coupling/hdf5_interface url = ../../GEOS-DEV/hdf5_interface.git diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml new file mode 100644 index 00000000000..9bc6d624664 --- /dev/null +++ b/.integrated_tests.yaml @@ -0,0 +1,8 @@ +--- +baselines: + bucket: geosx + baseline: integratedTests/baseline_integratedTests-pr3044-4865-1a337ae + +allow_fail: + all: '' + streak: pennyShapedToughnessDominated_smoke_01,pennyShapedViscosityDominated_smoke_01,pknViscosityDominated_smoke_01 diff --git a/.readthedocs.yml b/.readthedocs.yml index cac04680e9d..55160e32db1 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -33,5 +33,4 @@ formats: all submodules: include: - src/coreComponents/constitutive/PVTPackage - - integratedTests recursive: true diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md new file mode 100644 index 00000000000..d1a701842b9 --- /dev/null +++ b/BASELINE_NOTES.md @@ -0,0 +1,16 @@ + +Notes +========== + +This file is designed to track changes to the integrated test baselines. +Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. +These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). + + + +PR #3044 (2024-05-02) +====================== + +Removed old integratedTests submodule +Implemented new baseline storage +Implemented new CI integrated tests diff --git a/host-configs/LLNL/quartz-base.cmake b/host-configs/LLNL/quartz-base.cmake index 38047f8e0ce..e01eb428fc4 100644 --- a/host-configs/LLNL/quartz-base.cmake +++ b/host-configs/LLNL/quartz-base.cmake @@ -58,9 +58,9 @@ set(MKL_LIBRARIES ${MKL_ROOT}/lib/intel64/libmkl_intel_lp64.so # ATS set(ATS_ARGUMENTS "--machine slurm36" CACHE STRING "") -# set(USER $ENV{USER} CACHE STRING "") -# set(ATS_WORKING_DIR "/p/lustre2/${USER}/integratedTests/${CONFIG_NAME}" CACHE PATH "") -# set(ATS_BASELINE_DIR "/p/lustre2/${USER}/integratedTests/baselines" CACHE PATH "") +set(USER $ENV{USER} CACHE STRING "") +set(ATS_WORKING_DIR "/p/lustre2/${USER}/integratedTestsGEOS/${CONFIG_NAME}" CACHE PATH "") +set(ATS_BASELINE_DIR "/p/lustre2/${USER}/integratedTestsGEOS/baselines" CACHE PATH "") # Temporary argument for python module change testing # set(GEOS_PYTHON_PACKAGES_BRANCH "feature/sherman/outOfPlaceATS" CACHE STRING "" FORCE) diff --git a/inputFiles/solidMechanics/sedov.ats b/inputFiles/solidMechanics/sedov.ats index 07d74a25999..62687c4508a 100644 --- a/inputFiles/solidMechanics/sedov.ats +++ b/inputFiles/solidMechanics/sedov.ats @@ -1,3 +1,4 @@ +# Integrated Test Docs Begin Parameters import geos_ats from geos_ats.test_builder import generate_geos_tests, RestartcheckParameters, TestDeck, CurveCheckParameters @@ -10,7 +11,9 @@ curvecheck_params['filename'] = 'veloc_history.hdf5' curvecheck_params['tolerance'] = 1e-10 curvecheck_params['time_units'] = 'milliseconds' curvecheck_params['curves'] = [['velocity', 'source']] +# Integrated Test Docs End Parameters +# Integrated Test Docs Begin Test Loop partitions = ((1, 1, 1), (2, 2, 2), (3, 3, 3)) decks = [ @@ -25,3 +28,4 @@ decks = [ ] generate_geos_tests(decks) +# Integrated Test Docs End Test Loop \ No newline at end of file diff --git a/integratedTests b/integratedTests deleted file mode 160000 index fafec8f82db..00000000000 --- a/integratedTests +++ /dev/null @@ -1 +0,0 @@ -Subproject commit fafec8f82dbfe76b0653ebf302f914eab5fc3bde diff --git a/scripts/check_baseline_log.sh b/scripts/check_baseline_log.sh new file mode 100755 index 00000000000..85fa5aee8db --- /dev/null +++ b/scripts/check_baseline_log.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +DIFF=$(git diff --name-only origin/develop) + +if [[ $DIFF == *".integrated_tests.yaml"* ]]; then + echo "Changes to the integrated test baseline detected" + if [[ $DIFF != *"BASELINE_NOTES.md"* ]]; then + echo "You need to add a note to the BASELINE_NOTES.md file to justify changes to the test baselines" + exit 1 + fi +fi + diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index 405cb7a46c3..4a73c0adbe4 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -76,6 +76,7 @@ GEOSX_INSTALL_SCHEMA=true HOST_CONFIG="host-configs/environment.cmake" RUN_UNIT_TESTS=true RUN_INTEGRATED_TESTS=false +UPLOAD_TEST_BASELINES=false TEST_CODE_STYLE=false TEST_DOCUMENTATION=false CODE_COVERAGE=false @@ -106,6 +107,7 @@ do --no-run-unit-tests) RUN_UNIT_TESTS=false; shift;; --repository) GEOS_SRC_DIR=$2; shift 2;; --run-integrated-tests) RUN_INTEGRATED_TESTS=true; shift;; + --upload-test-baselines) UPLOAD_TEST_BASELINES=true; shift;; --code-coverage) CODE_COVERAGE=true; shift;; --sccache-credentials) SCCACHE_CREDS=$2; shift 2;; --test-code-style) TEST_CODE_STYLE=true; shift;; @@ -176,8 +178,18 @@ if [[ "${RUN_INTEGRATED_TESTS}" = true ]]; then or_die apt-get install -y virtualenv python3-dev python-is-python3 ATS_PYTHON_HOME=/tmp/run_integrated_tests_virtualenv or_die virtualenv ${ATS_PYTHON_HOME} + + python3 -m pip cache purge + + # Setup a temporary directory to hold tests + tempdir=$(mktemp -d) + echo "Setting up a temporary directory to hold tests and baselines: $tempdir" + trap "rm -rf $tempdir" EXIT + ATS_BASELINE_DIR=$tempdir/GEOS_integratedTests_baselines + ATS_WORKING_DIR=$tempdir/GEOS_integratedTests_working + export ATS_FILTER="np<=32" - ATS_CMAKE_ARGS="-DATS_ARGUMENTS=\"--machine openmpi --ats openmpi_mpirun=/usr/bin/mpirun --ats openmpi_args=--allow-run-as-root --ats openmpi_procspernode=32 --ats openmpi_maxprocs=32\" -DPython3_ROOT_DIR=${ATS_PYTHON_HOME}" + ATS_CMAKE_ARGS="-DATS_ARGUMENTS=\"--machine openmpi --ats openmpi_mpirun=/usr/bin/mpirun --ats openmpi_args=--allow-run-as-root --ats openmpi_procspernode=32 --ats openmpi_maxprocs=32\" -DPython3_ROOT_DIR=${ATS_PYTHON_HOME} -DATS_BASELINE_DIR=${ATS_BASELINE_DIR} -DATS_WORKING_DIR=${ATS_WORKING_DIR}" fi @@ -265,27 +277,39 @@ fi if [[ "${RUN_INTEGRATED_TESTS}" = true ]]; then # We split the process in two steps. First installing the environment, then running the tests. or_die ninja ats_environment + # The tests are not run using ninja (`ninja --verbose ats_run`) because it swallows the output while all the simulations are running. # We directly use the script instead... - # Temporarily, we are not adding the `--failIfTestsFail` options to `geos_ats.sh`. - # Therefore, `ats` will exit with error code 0, even if some tests fail. - # Add `--failIfTestsFail` when you want `failIfTestsFail` to reflect the content of the tests. - integratedTests/geos_ats.sh - # Even (and even moreover) if the integrated tests fail, we want to pack the results for further investigations. - # So we store the status code for further use. - INTEGRATED_TEST_EXIT_STATUS=$? - echo "The return code of the integrated tests is ${INTEGRATED_TEST_EXIT_STATUS}" + # echo "Available baselines:" + # ls -lah ${DATA_EXCHANGE_DIR} | grep baseline + + echo "Running integrated tests..." + integratedTests/geos_ats.sh --baselineCacheDirectory ${DATA_EXCHANGE_DIR} + tar -czf ${DATA_EXCHANGE_DIR}/test_logs_${DATA_BASENAME_WE}.tar.gz integratedTests/TestResults + + echo "Checking results..." + bin/geos_ats_log_check integratedTests/TestResults/test_results.ini -y ${GEOS_SRC_DIR}/.integrated_tests.yaml &> $tempdir/log_check.txt + cat $tempdir/log_check.txt - # Whatever the result of the integrated tests, we want to pack both the logs and the computed results. - # They are not in the same folder, so we do it in 2 steps. - # The `--transform` parameter is here to separate the two informations (originally in a folder with the same name) - # in two different folder with meaningful names when unpacking. - or_die tar cfM ${DATA_EXCHANGE_DIR}/${DATA_BASENAME_WE}.tar --directory ${GEOS_SRC_DIR} --transform "s/^integratedTests/${DATA_BASENAME_WE}\/repo/" integratedTests - or_die tar rfM ${DATA_EXCHANGE_DIR}/${DATA_BASENAME_WE}.tar --directory ${GEOSX_BUILD_DIR} --transform "s/^integratedTests/${DATA_BASENAME_WE}\/logs/" integratedTests - or_die gzip ${DATA_EXCHANGE_DIR}/${DATA_BASENAME_WE}.tar + if grep -q "Overall status: PASSED" "$tempdir/log_check.txt"; then + echo "IntegratedTests passed. No rebaseline required." + INTEGRATED_TEST_EXIT_STATUS=0 + else + echo "IntegratedTests failed. Rebaseline is required." + + # Rebaseline and pack into an archive + echo "Rebaselining..." + integratedTests/geos_ats.sh -a rebaselinefailed + + echo "Packing baselines..." + integratedTests/geos_ats.sh -a pack_baselines --baselineArchiveName ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME_WE}.tar.gz --baselineCacheDirectory ${DATA_EXCHANGE_DIR} + INTEGRATED_TEST_EXIT_STATUS=1 + fi + + echo "Done!" - # want to clean the integrated tests folder to avoid polluting the next build. - or_die integratedTests/geos_ats.sh -a clean + # INTEGRATED_TEST_EXIT_STATUS=$? + echo "The return code of the integrated tests is ${INTEGRATED_TEST_EXIT_STATUS}" fi # Cleaning the build directory. diff --git a/scripts/setupPythonEnvironment.bash b/scripts/setupPythonEnvironment.bash index edd5c91296f..eb1dcfaaaff 100755 --- a/scripts/setupPythonEnvironment.bash +++ b/scripts/setupPythonEnvironment.bash @@ -22,6 +22,9 @@ declare -a LINK_SCRIPTS=("preprocess_xml" "convert_abaqus" "run_geos_ats" "setup_ats_environment" + "geos_ats_log_check" + "geos_ats_restart_check" + "geos_ats_curve_check" "activate" "python") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7fb71e7cbe9..61c5fc427e2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -232,6 +232,10 @@ install( FILES ${CMAKE_BINARY_DIR}/schema.xsd ################################ # Add python environment setup ################################ +# message(WARNING "Temporarily changing the geosPythonBranch to feature/sherman/baselineStorage") +# set(GEOS_PYTHON_PACKAGES_BRANCH "branch name" CACHE STRING "" FORCE) + + if ( Python3_EXECUTABLE ) message(STATUS "Found python version ${Python3_VERSION}") if (${Python3_VERSION} VERSION_LESS "3.6.0") diff --git a/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst b/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst index 44522b87d49..88ca2990ec7 100644 --- a/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst +++ b/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst @@ -10,8 +10,8 @@ linearDASVectorZ real32_array maxStableDt real64 Value of the Maximum Stable Timestep for this solver. meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -rcvElem integer_array Element containing the receivers receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverElem integer_array Element containing the receivers receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point receiverRegion integer_array Region containing the receivers diff --git a/src/coreComponents/schema/docs/AcousticSEM_other.rst b/src/coreComponents/schema/docs/AcousticSEM_other.rst index 80dd4136b81..1ef831de5ac 100644 --- a/src/coreComponents/schema/docs/AcousticSEM_other.rst +++ b/src/coreComponents/schema/docs/AcousticSEM_other.rst @@ -10,8 +10,8 @@ linearDASVectorZ real32_array maxStableDt real64 Value of the Maximum Stable Timestep for this solver. meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -rcvElem integer_array Element containing the receivers receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverElem integer_array Element containing the receivers receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point receiverRegion integer_array Region containing the receivers diff --git a/src/coreComponents/schema/docs/AcousticVTISEM_other.rst b/src/coreComponents/schema/docs/AcousticVTISEM_other.rst index 80dd4136b81..1ef831de5ac 100644 --- a/src/coreComponents/schema/docs/AcousticVTISEM_other.rst +++ b/src/coreComponents/schema/docs/AcousticVTISEM_other.rst @@ -10,8 +10,8 @@ linearDASVectorZ real32_array maxStableDt real64 Value of the Maximum Stable Timestep for this solver. meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -rcvElem integer_array Element containing the receivers receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverElem integer_array Element containing the receivers receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point receiverRegion integer_array Region containing the receivers diff --git a/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst b/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst index 67c4b18bc7c..24ca5ae2f69 100644 --- a/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst +++ b/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst @@ -12,8 +12,8 @@ linearDASVectorY real32_array linearDASVectorZ real32_array Z component of the linear DAS direction vector maxStableDt real64 Value of the Maximum Stable Timestep for this solver. meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -rcvElem integer_array Element containing the receivers receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverElem integer_array Element containing the receivers receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point receiverRegion integer_array Region containing the receivers diff --git a/src/coreComponents/schema/docs/ElasticSEM_other.rst b/src/coreComponents/schema/docs/ElasticSEM_other.rst index dbe0ac40e7a..2e9e89c914f 100644 --- a/src/coreComponents/schema/docs/ElasticSEM_other.rst +++ b/src/coreComponents/schema/docs/ElasticSEM_other.rst @@ -13,8 +13,8 @@ linearDASVectorY real32_array linearDASVectorZ real32_array Z component of the linear DAS direction vector maxStableDt real64 Value of the Maximum Stable Timestep for this solver. meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -rcvElem integer_array Element containing the receivers receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds +receiverElem integer_array Element containing the receivers receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point receiverRegion integer_array Region containing the receivers diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst index dcc17ebc657..9e6224ccea1 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst @@ -1,29 +1,30 @@ -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -massDamping real64 0 Value of mass based damping coefficient. -maxNumResolves integer 10 Value to indicate how many resolves may be executed after some other event is executed. For example, if a SurfaceGenerator is specified, it will be executed after the mechanics solve. However if a new surface is generated, then the mechanics solve must be executed again due to the change in topology. -name groupName required A name is required for any non-unique nodes -newmarkBeta real64 0.25 Value of :math:`\beta` in the Newmark Method for Implicit Dynamic time integration option. This should be pow(newmarkGamma+0.5,2.0)/4.0 unless you know what you are doing. -newmarkGamma real64 0.5 Value of :math:`\gamma` in the Newmark Method for Implicit Dynamic time integration option -stabilizationName groupNameRef required Name of the stabilization to use in the lagrangian contact solver -stiffnessDamping real64 0 Value of stiffness based damping coefficient. -strainTheory integer 0 | Indicates whether or not to use `Infinitesimal Strain Theory `_, or `Finite Strain Theory `_. Valid Inputs are: - | 0 - Infinitesimal Strain - | 1 - Finite Strain -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption ExplicitDynamic | Time integration method. Options are: - | * QuasiStatic - | * ImplicitDynamic - | * ExplicitDynamic -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== +=============================== ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +=============================== ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +logLevel integer 0 Log level +massDamping real64 0 Value of mass based damping coefficient. +maxNumResolves integer 10 Value to indicate how many resolves may be executed after some other event is executed. For example, if a SurfaceGenerator is specified, it will be executed after the mechanics solve. However if a new surface is generated, then the mechanics solve must be executed again due to the change in topology. +name groupName required A name is required for any non-unique nodes +newmarkBeta real64 0.25 Value of :math:`\beta` in the Newmark Method for Implicit Dynamic time integration option. This should be pow(newmarkGamma+0.5,2.0)/4.0 unless you know what you are doing. +newmarkGamma real64 0.5 Value of :math:`\gamma` in the Newmark Method for Implicit Dynamic time integration option +stabilizationName groupNameRef required Name of the stabilization to use in the lagrangian contact solver +stabilizationScalingCoefficient real64 1 It be used to increase the scale of the stabilization entries. A value < 1.0 results in larger entries in the stabilization matrix. +stiffnessDamping real64 0 Value of stiffness based damping coefficient. +strainTheory integer 0 | Indicates whether or not to use `Infinitesimal Strain Theory `_, or `Finite Strain Theory `_. Valid Inputs are: + | 0 - Infinitesimal Strain + | 1 - Finite Strain +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption ExplicitDynamic | Time integration method. Options are: + | * QuasiStatic + | * ImplicitDynamic + | * ExplicitDynamic +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +=============================== ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/elementRegionsGroup_other.rst b/src/coreComponents/schema/docs/elementRegionsGroup_other.rst index 4fd505d0214..adf1c1b8aec 100644 --- a/src/coreComponents/schema/docs/elementRegionsGroup_other.rst +++ b/src/coreComponents/schema/docs/elementRegionsGroup_other.rst @@ -1,11 +1,9 @@ -==================== ==== ========================================= -Name Type Description -==================== ==== ========================================= -CellElementRegion node :ref:`DATASTRUCTURE_CellElementRegion` -SurfaceElementRegion node :ref:`DATASTRUCTURE_SurfaceElementRegion` -WellElementRegion node :ref:`DATASTRUCTURE_WellElementRegion` -==================== ==== ========================================= +==== ==== ============================ +Name Type Description +==== ==== ============================ + (no documentation available) +==== ==== ============================ diff --git a/src/coreComponents/schema/docs/particleRegionsGroup_other.rst b/src/coreComponents/schema/docs/particleRegionsGroup_other.rst index 4a1517c2a56..adf1c1b8aec 100644 --- a/src/coreComponents/schema/docs/particleRegionsGroup_other.rst +++ b/src/coreComponents/schema/docs/particleRegionsGroup_other.rst @@ -1,9 +1,9 @@ -============== ==== =================================== -Name Type Description -============== ==== =================================== -ParticleRegion node :ref:`DATASTRUCTURE_ParticleRegion` -============== ==== =================================== +==== ==== ============================ +Name Type Description +==== ==== ============================ + (no documentation available) +==== ==== ============================ diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 904c4e58302..ce485aacb90 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -3362,6 +3362,8 @@ Local - Add stabilization only to interiors of macro elements.--> + + - - + + @@ -641,10 +641,10 @@ - - + + @@ -682,10 +682,10 @@ - - + + @@ -800,10 +800,10 @@ - - + + @@ -863,10 +863,10 @@ - - + + @@ -2987,18 +2987,18 @@ - - - - - - + + + + + - + - + + @@ -3011,24 +3011,16 @@ - - - - - - - - - - - + + - + + @@ -3037,15 +3029,18 @@ + + - + - + + @@ -3054,24 +3049,24 @@ - - - - + + - + - - - - - - + + + + + + + + @@ -3080,35 +3075,36 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + - - + + + + + + + + + + + + + + + + + @@ -3117,32 +3113,30 @@ - - - - - - - - - - - - - - - - + + + + - + - - + + + + + + + + + + + + @@ -3151,16 +3145,13 @@ + + - - - - - - + + - @@ -3174,16 +3165,19 @@ - - + + + + + + + - - @@ -3192,18 +3186,15 @@ - - - + + - - @@ -3212,24 +3203,24 @@ - - + + + + - + + + - - - - - - - - + + + + @@ -3238,36 +3229,35 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + - + + - - - - - - - - - - - - - - - - @@ -3276,30 +3266,31 @@ - - - - + + + + + + + + + + + + + + + + - + + - - - - - - - - - - - - @@ -3308,7 +3299,6 @@ - - + diff --git a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst index e8a97841ac2..93ad45c3576 100644 --- a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst +++ b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst @@ -6,57 +6,112 @@ Integrated Tests About ================================= -*integratedTests* is a submodule of *GEOS* residing at the top level of the directory structure. -It defines a set of tests that will run *GEOS* with various *.xml* files and partitioning schemes using the `Automated Test System `_ (ATS). -For each scenario, test performance is evaluated by comparing output files to baselines recorded in this repository. +The GEOS integrated test system leverages the `Automated Test System `_ (ATS) and `GEOS ATS `_ packages to run various combinations of input files and machine configurations. +The output of these runs are then compared to baseline files and/or analytic solutions to guarantee the accuracy of the code. Structure ================================= -The *integratedTests* repository includes a python package (*integratedTests/scripts/geos_ats_package*) and a directory containing test definitions (*integratedTests/tests/allTests*). -A typical test directory will include an *.ats* file, which defines the behavior of tests or points to child test directories, symbolic links to any required *.xml* files, and a directory containing baseline files. +GEOS integrated tests are defined in the *GEOS/inputFiles* directory, and are organized into folders based on the physical processes being tested. +A test folder can contain any number of *.ats* configuration files, *.xml* input files, and supporting inputs (tables files, meshes, etc.). .. code-block:: sh - - integratedTests/ - - scripts/ - - geos_ats_package - - tests/ - - allTests/ - - main.ats/ - - sedov/ - - baselines/ - - sedov_XX/ - - - - sedov.ats - - sedov.xml + - inputFiles/ + - main.ats/ + - solidMechanics/ + - sedov.ats + - sedov.xml + - etc. + - .integrated_tests.yaml -High level integrated test results are recorded in the GEOS build directory: */path/to/GEOS/build-xyz/integratedTests/TestsResults*. -These include *.log* and *.err* files for each test and a *test_results.html* summary file, which can be inspected in your browser. +Test baselines are stored as *.tar.gz* archive and share the same directory structure as *GEOS/inputFiles*. +During test execution, the *geos_ats* package will fetch and unpack any necessary baselines described in the top-level *.integrated_tests.yaml* configuration file. + + + +How to Run the Tests +================================= + +GEOS CI Pipeline +--------------------------------- + +In most cases, developers will be able to rely on the integrated tests that are run as part of the GEOS CI Pipeline. +These can be triggered if the **ci: run integrated tests** label is selected for a pull request (this can be added from the right-hand panel on PR page). + +To inspect the results of CI tests, select the *Checks* tab from the top of the pull request and then select *run_integrated_tests/build_test_deploy* from the left-hand panel. + + +.. image:: integrated_test_location_pr_a.png + :width: 400px + + +.. image:: integrated_test_location_pr_b.png + :width: 400px + + +This page will show the full output of GEOS build process and the integrated test suite. +At the bottom of this page, the logs will contain a summary of the test results and a list of any ignored/failed tests. + + +.. code-block:: sh + + ======================= + Integrated test results + ======================= + expected: 0 + created: 0 + batched: 0 + filtered: 104 + skipped: 0 + running: 0 + passed: 215 + timedout: 0 (3 ignored) + halted: 0 + lsferror: 0 + failed: 0 + ======================= + Ignored tests + ======================= + pennyShapedToughnessDominated_smoke_01 + pennyShapedViscosityDominated_smoke_01 + pknViscosityDominated_smoke_01 + ======================= + Overall status: PASSED + ======================= + + +The log will provide instructions on where to download the test results and a baseline ID that can be assigned in the *.integrated_tests.yaml* file. + + + +. code-block:: sh + + Download the bundle at https://storage.googleapis.com/geosx/integratedTests/baseline_integratedTests-pr3044-4400-e6359ca.tar.gz + New baseline ID: baseline_integratedTests-pr3044-4400-e6359ca + .. note:: - Baseline files are stored using the git LFS (large file storage) plugin. - If you followed the suggested commands in the quickstart guide, then your environment is likely already setup. + Integrated tests within GEOS CI pipeline are run on a shared machine, and may take up to 30 minutes to complete. It may take some time for the tests to begin if the machine is in use by other developers. - However, if lfs is not yet activated, then the contents of baseline files may look something like this: - 0to100_restart_000000100/rank_0000003.hdf5 - version https://git-lfs.github.com/spec/v1 - oid sha256:09bbe1e92968852cb915b971af35b0bba519fae7cf5934f3abc7b709ea76308c - size 1761208 +Manual Test Runs +--------------------------------- - If this is the case, try running the following commands: ``git lfs install`` and ``git lfs pull``. +Before running the integrated tests manually, we recommend that you define the following variables in your machine's host configuration file: +* `ATS_WORKING_DIR` : The location where tests should be run (default=*GEOS/[build-dir]/integratedTests/workingDir*) +* `ATS_BASELINE_DIR` : The location where test baselines should be stored (default=*GEOS/integratedTests*) +.. note:: + The `ATS_WORKING_DIR` should be located on a file system that is amenable to parallel file IO. -How to Run the Tests -================================= -In most cases, integrated tests processes can be triggered in the GEOS build directory with the following commands: +After building GEOS, the integrated tests can be triggered in the GEOS build directory with the following commands: * `make ats_environment` : Setup the testing environment (Note: this step is run by default for the other make targets). This process will install packages required for testing into the python environment defined in your current host config file. Depending on how you have built GEOS, you may be prompted to manually run the `make pygeosx` command and then re-run this step. * `make ats_run` : Run all of the available tests (see the below note on testing resources). @@ -66,7 +121,7 @@ In most cases, integrated tests processes can be triggered in the GEOS build dir .. note:: - The `make_ats_environment` step will attempt to collect python packages github and pypi, so it should be run from a machine with internet access. + The `make_ats_environment` and `ats_run` steps may require internet access to collect python packages and baseline files. .. note:: @@ -176,7 +231,7 @@ Otherwise, you will need to track down and potentially fix the issue that trigge Test Output -------------------------------- -Output files from the tests will be stored in the TestResults directory (*/path/to/GEOS/build-xyz/integratedTests/TestsResults*) or in a subdirectory next to their corresponding *.xml* file (*integratedTests/tests/allTests/testGroup/testName_xx*). +Output files from the tests will be stored in the specified working directory (linked here: */path/to/GEOS/build-xyz/integratedTests/TestsResults*). Using the serial beam bending test as an example, key output files include: * *beamBending_01.data* : Contains the standard output for all test steps. @@ -395,10 +450,10 @@ They use a Python 3.x syntax, and have a set of ATS-related methods loaded into The root configuration file (*integratedTests/tests/allTests/main.ats*) finds and includes any test definitions in its subdirectories. The remaining configuration files typically add one or more tests with varying partitioning and input xml files to ATS. -The *integratedTests/tests/allTests/sedov/sedov.ats* file shows how to add three groups of tests. +The *inputFiles/solidMechanics/sedov.ats* file shows how to add three groups of tests. This file begins by defining a set of common parameters, which are used later: -.. literalinclude:: ../../../../../integratedTests/tests/allTests/sedov/sedov.ats +.. literalinclude:: ../../../../../inputFiles/solidMechanics/sedov.ats :language: python :start-after: # Integrated Test Docs Begin Parameters :end-before: # Integrated Test Docs End Parameters @@ -406,216 +461,65 @@ This file begins by defining a set of common parameters, which are used later: It then enters over the requested partitioning schemes: -.. literalinclude:: ../../../../../integratedTests/tests/allTests/sedov/sedov.ats +.. literalinclude:: ../../../../../inputFiles/solidMechanics/sedov.ats :language: python :start-after: # Integrated Test Docs Begin Test Loop :end-before: # Integrated Test Docs End Test Loop -and registers a unique test case with the `TestCase` method, which accepts the following arguments: - -* name : The name of the test. The expected convention for this variable is 'testName_N' (N = number of ranks) or 'testName_X_Y_Z' (X, Y, and Z ranks per dimension) -* desc : A brief description of the test -* label : The test label (typically 'auto') -* owner : The point(s) of contact for the test -* independent : A flag indicating whether the test is dependent on another test (typically True) -* steps: A tuple containing the test steps (minimum length = 1) - - -Test steps are run sequentially, and are created with the `geos` method. -If a given test step fails, then it will produce an error and any subsequent steps will be canceled. -This method accepts the following keyword arguments: +and registers a unique test case with the `TestDeck` method, which accepts the following arguments: -* deck : The name of the input xml file. -* np : The number of parallel processes required to run the step. -* ngpu : The number of GPU devices required to run the step. Note: this argument is typically ignored for geos builds/machines that are not configured to use GPU's. In addition, we typically expect that np=ngpu. -* x_partitions : The number of partitions to use along the x-dimension -* y_partitions : The number of partitions to use along the y-dimension -* z_partitions : The number of partitions to use along the z-dimension -* name : The header to use for output file names -* restartcheck_params : (optional) If this value is defined, run a restart check with these parameters (specified as a dictionary). -* curvecheck_params : (optional) If this value is defined, run a curve check with these parameters (specified as a dictionary). -* restart_file : (optional) The name of a restart file to resume from. To use this option, there must be a previous step that produces the selected restart file. -* baseline_pattern : (optional) The regex for the baseline files to use (required if the name of the step differs from the baseline) -* allow_rebaseline : A flag that indicates whether this step can be rebaselined. This is typically only true for the first step in a test case. +* name : The name of the test +* description : A brief description of the test +* partitions : A list of partition schemes to be tested +* restart_step : The cycle number where GEOS should test its restart capability +* check_step : The cycle number where GEOS should evaluate output files +* restartcheck_params : Parameters to forward to the restart check (tolerance, etc.) +* curvecheck_params: Parameters to forward to the curve check (tolerance, etc.) -Note that a given *.ats* file can create any number of tests and link to any number of input xml files. -For any given test step, we expect that at least one restart or curve check be defined. +.. note:: + An *.ats* file can create any number of tests and link to any number of input xml files. + For any given test step, we expect that at least one restart or curve check be defined. Creating a New Test Directory ------------------------------- -To add a new set of tests, create a new folder in the `integratedTests/tests/allTests*` directory. +To add a new set of tests, create a new folder under the `GEOS/inputFiles` directory. This folder needs to include at least one *.ats* file to be included in the integrated tests. Using the sedov example, after creating *sedov.ats* the directory should look like .. code-block:: sh - - integratedTests/tests/allTests/sedov/ - - sedov.ats - - sedov.xml (this file should be a symbolic link to a GEOS input file located somewhere within */path/to/GEOS/inputFiles*) - -At this point you should run the integrated tests (in the build directory run: `make ats_run`). -Assuming that the new *geos* step for your test case was successful, the subsequent *restartcheck* step will fail because the baselines have not yet been created. -At this point the directory should look like this: - -.. code-block:: sh - - - integratedTests/tests/allTests/sedov/ - - sedov/ - - ... - - ... + - inputFiles/solidMechanics - sedov.ats - sedov.xml - - ... -You can then follow the steps in the next section to record the initial baseline files. +These changes will be reflected in the new baselines after triggering the manual rebaseline step. .. _rebaselining-tests: Rebaselining Tests ----------------------------- +===================== Occasionally you may need to add or update baseline files in the repository (possibly due to feature changes in the code). This process is called rebaselining. We suggest the following workflow: -Step 1 -^^^^^^^^^ - -In the GEOS repository, create or checkout a branch with your modifications: - -.. code-block:: sh - - cd /path/to/GEOS - git checkout -b user/feature/newFeature - - -Add your changes, confirm that they produce the expected results, and get approval for a pull request. -If your branch needs to be rebaselined, make sure to indicate this in your pull request with the appropriate Label. - - -Step 2 -^^^^^^^^^ - -Go to the integratedTests submodule, checkout and pull develop, and create a branch with the same name as the one in the main GEOS repository: - -.. code-block:: sh - - cd /path/to/GEOS/integratedTests - git checkout develop - git pull - git checkout -b user/feature/newFeature - - -Step 3 -^^^^^^^^^ - -Go back to your GEOS build directory and run the integrated tests: - -.. code-block:: sh - - # Note: on shared machines, run these commands in an allocation - cd /path/to/GEOS/build-dir/ - make ats_run - - -Inspect the test results that fail and determine which need to be **legitimately** rebaselined. -Arbitrarily changing baselines defeats the purpose of the integrated tests. -In your PR discussion, please identify which tests will change and any unusual behavior. - - -Step 4 -^^^^^^^^^ - -We can then rebaseline the tests. -In most cases, you will want to rebaseline all of the tests marked as **FAILED**. -To do this you can run this command in the build directory: - -.. code-block:: sh - - make ats_rebaseline_failed - - -Otherwise, you can run the following command, and select whether tests should be rebaselined one at a time via a ``[y/n]`` prompt: - -.. code-block:: sh - - make ats_rebaseline - - -Make sure to only answer ``y`` to the tests that you actually want to rebaseline, otherwise correct baselines for already passing tests will still be updated and bloat your pull request and repository size. - - -Step 5 -^^^^^^^^^ - -Confirm that the new baselines are working as expected. -You can do this by cleaning the test directories and re-running the tests: - -.. code-block:: sh - - # Note: on shared machines, run these commands in an allocation - cd /path/to/GEOS/build-dir/ - make ats_clean - make ats_run - - -At this point you should pass all the integratedTests. - - -Step 6 -^^^^^^^^^ - -Clean out unnecessary files and add new ones to the branch: - -.. code-block:: sh - - cd /path/to/GEOS/build-dir/ - make ats_clean - - # Check for new or modified files - cd /path/to/GEOS/integratedTests - git status - - # Add new or modified files - git add file_a file_b ... - git commit -m "Updating baselines" - git push origin user/feature/newFeature - - -Step 6 -^^^^^^^^^ - -If you haven't already done so, create a merge request for your integratedTests branch. -Once you have received approval for your PR and are ready to continue, you can click merge the branch by clicking the button on github. - -You should then checkout the develop branch of integratedTests and pull the new changes. - -.. code-block:: sh - - cd /path/to/GEOS/integratedTests - git checkout develop - git pull - - -You then need to update the integratedTests 'hash' in your associated GEOS branch. - -.. code-block:: sh - - cd /path/to/GEOS/ - git add integratedTests - git commit -m "Updating the integratedTests hash" - git push origin user/feature/newFeature - +#. Step 1. Open a pull request for your branch on github and select the **ci: run integrated tests** and **ci: upload test baselines** labels +#. Step 2. Wait for the tests to finish +#. Step 3. Download and unpack the new baselines from the link provided at the bottom of the test logs +#. Step 4. Inspect the test results using the *test_results.html* file +#. Step 5. Verify that the changes in the baseline files are desired +#. Step 6. Update the baseline ID in the *GEOS/.integrated_tests.yaml* file +#. Step 7. Add a justification for the baseline changes to the *GEOS/BASELINE_NOTES.md* file +#. Step 8. Commit your changes and push the code +#. Step 9. Wait for the CI tests to re-run and verify that the integrated tests step passed -At this point, you will need to wait for the CI/CD tests to run on github. -After they succeed, you can merge your branch into develop using the button on github. diff --git a/src/docs/sphinx/developerGuide/Contributing/integrated_test_location_pr_a.png b/src/docs/sphinx/developerGuide/Contributing/integrated_test_location_pr_a.png new file mode 100644 index 0000000000000000000000000000000000000000..410939056bdd5e6cdd2b05e33f104b0b252bca95 GIT binary patch literal 1083078 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

2pfO!OXf81Pc-_H)!I!yEJq}ZFaQ1`7oE`2 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%0Ap>%Md}U8`o~BBNo{e?i^DMa*!u?l2;{VfkL?(q0 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

8eTp;S>G3q-lr<;+g!iQw6(+S=h)yVVM4SCH! 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

Of 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­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

;5af=8}Vyb*dXb*KcnAyY`Y# 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 &eLUxaKBOs;REE=Nc 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

  • Y7r#EQtrpqnR-O0SN@d)f*}qdfB<^ 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Ð-MOqbuJ?xm0g|=&y?UP_cJoE(g_J3E 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�G{|WaV;c(m zE5S%)a?_l*v$aX#bS0i#XUnD)%^u?k=a>{r!jCnAlyNO&HE)@h02;)CD3i~ySfg(7 zePZsT`v#Q%-Oc$p0j$Klb=lCc_BCH!_6hOVIfv+Kygp*{4Yo5r>iGp9aK0Z#HiB%h z+Ub_4+9E8a3%&>k=?^xmn^<=oIh702=wi^w9HLuR9jBE&4~bLZbDqSY7{ao1M+xdq zo;^_WWafT%WA%9-PYp%Zu9_K7*597xM!ybLe- zJ>Dy6r{kt;vl{^@!(Df*t$wA+ty5&h(hE@q<{axq>}m^}9E}G~mQ@RWRyZu0?jr(l zJYFVv|A2aAaP`^3TkAzu(z#R)i*-%g&*MK$=6h0#NYzHN(*TzJj?|A6z@bFZM))yJ zy1p<8@vVn6Tn}C=_8~6bg)81&mrowi%~-6%NZ0f+lp&*pE#2I^G~fFpd<}E%K0&B9 zyE%&9Ept0(g!e@kUQ*sjI1}_~kIZ4ya=GWU(fi>&ewp#FgbYQ1j@ZZ9_$He7t~WB3 z`eWp9SW&>v$;E93{)x%&Fcwv;^XN&gzpPtZY`yKn&k5#JnLM;V7{}Ix8 zi&M)c;&q1^(W=&27{;?})5(*DzX7}9Z%xqoJE;&fD%`+)b78jjFKe=Y2yWR%?7g3v z0t`DV-8>4|iCz+hB1?M-aA50)MDi5NY8_mO5FP4*kp=1R39#Zh$mdjoJ5+n-E9n{p zT$O{LI9$$HTCwTC&7C-WW-sNTss|=|f|4>+5XdMfbe+*^q;VZMpE%y*Z< z`MlK{S>gE-YdH()hB{3S?-8Yk5uR~E**;7CEL?|eKlT+^)XQH(7HmThQXSouc(Ob| zq%GLc(* zLv4z=BO6WG7i;ORO9Is+La%>k?SG)rGyjwywGBUB%*@YV&9wEEH@mAQ%!R%CkNP$U zcrb2nFhgEXOk+N3a4*bvq4R@Smk;yX)K;eF(Gx+pFAD1NlE{R7;I|8^j-1*IlFX#n zuE9}lVlS)<64L%c21vCK4wYo}__wx4`J(eKQRkmo&x&Drk}IH)ndf0Qkm2&SmxG?@ z{KY*vT&@jq%bkgR18b|#()6U$^U@SA{s}jiTdL*FH>Sx5Vq&+$^#^jurLZeqE6=9I z;V#(to5>cR)i(Xi%W7kz$;Sg77~vuvbKtR&!OIb4*y_VRdoMdfK*A*;MR97_L+df@ z8vLR#=^3VBnxYY_|U^JZItXP8Ho64_GGlc3tMFz>MZ_3uyW(0|F|3 zQG)$j_~3K^cJj^qUD2?nt5UhMQ)tvxEH-I}RS7ml3l{T-CA!4KdG0CYMDA9iGg8*k zvQ?47cF-SZ>|f)|^!LMVG8+=cd1D79$(~n~_-ogs&%@n46CMPc8!0l^zVa%#5N+&t z_kn~AzytH++^D#y<)o;3d^5Vm&qEIs^U3q%ykhvgV$u%`ZfV@x}vbM$8^A zc6d}T-`-FZ6MR#B;Ce{+Hi%2Q;opQr`Bn337VEQpywNE<^ENOZ-JU&s7GWHl)|m4&@{|euo<( zy;8gjA0eu_+n6r{4&SEotm$gmNka_2hr|Up8@me~df|e7^Z#PDlzH=Zw%O5}9Uxy) zar*q4lRf>naU5~Izhj*)0(xcaS3`bSf70K7>{aPGU}X1bAO7B{KA>F4sRl=NZ4ssZRmZ?trDS&_<^d!g9K`-}LQk!DYfo(+7mlKVdsq6@eGX zp%1*G=X<2Y{-DDFF)DVQ-+TtBCv0%`dLM`yi zQo!l-f|3T-LN8p<(SSX-2D$$x+@4T@G#SZUfu29$QwA0!i|62A%!SL=C}|C{`Ro@C z*E| zD5XA`PxQGVYp#|z8tcH8ZS$(e$& zIJCN!8e?lbl8RSLce@FU*|I5Ph}MrUQ9~)rb6TXR)e)e6C6Ax}vPUKOZ~qA6hDX?PS=k zt^Adn+`}&ZHX+8l95m~N@I=T1T)d-MH=h9pc|c#vrC_u3i)dfn7r?`yH5q`ZV!ZA*p=alJB7VP!#57DutFI7MF;_~lIb5@i(v54d9 zVrEGm&Jk2?Z`t3w?V@HHhzHZ-)6eb^&jl+P*#G&GBo9wAuJ4g1AjmDiADu?vS7#++{Qni(415DkEQ zB3>Gw_KtI`$>}2jo9%H>w=FS#`u0#qkX_d*dY0+TWB|oH%j<;KK18%{I*f&(U8CQR zMY(QO>5m?1rbIiW%7T$q*OQ{lEzc1`Yhr;l%=o|&W!=kZX6pI^C{DpR?UEJ%+0Rww z@KyiH@jF^UH!30PVZZ!spJY^AYKKK3?`gs5SX+MkJ@3;JW98(h+SHqu^CCB-yDvn# ziA5eCFwS&Kmxm7xI{)#MU$sRt_y!M`x zP=elzYS}MFWvtQlKYsLZx+ZfvVQ@N~0*bVFP(2Bu%8!x|_9ADiS%!rvF2%Y2K3 zhkAwQB1qvPa3QwKercaK*8EUUfv>8|EE-lFuZ>hr8&^3w`Cj?!hp z7tA2f-vWPy0i{opd)>C8+OHB~KVD4)U@pZM2OU6U7zPH~MJTZj@#5~IDXzgSSGg)O~&hXvhO zcpO+LfHN2Ni*+u|m32;*oQxBq!ZS>85HHxr#2|78k@#F}_-Rk@WhsKJ_!#9noBa*X z1vwWUC@}1U-GtQ%!3D_=vc7@#zMN}?+uH;qR{LSr3!)QVEeM0ZlqOu%j;-$>9H<&a zQ(|fCUEJz68|Fd;xSq12(sa#z=T&`Kk+BnQ-LKII1W7?bkrD}VHse(~j77$EVt(c5 zN3Nz?UnEi4lL(JLz%Kx$3mvxl(a5f3J<)~Mh_U;EC@&E)#F|}a#_OzK7xgw$K_O&Y zy_gxukYv0t?yvidg4DmXYB;im7X0=&nAeJ1-R$=UL5p4|1ocP4oiqG&ix0@^#}9tR z^~bA6BVF$9K9q9cC2VCVzBmw7{Q=?a?4-hX-sSITp2T^VR!dsUOwwDnK2&M!u8Rib zKsI&2#!Ig#T>~)$RRF++IriY=29nw>;h#JH?M6={DGlzY#0SaCWa}}{Pc6{Z-<2%9 zn&~4Gj|qUV`CRE(lPV&ILO*7?+G6nV7Ti*ti=aNwZ?MC50%d9}wd>pNyz=U7>3F4* zR!O)&W*gH`5k^#X8T=R-_|cSvp8!bIoLEs1L$=~!1tN1w`IovW{=%$pm| zWPd;X^!FJrxhwC6br+kik=%0ctytnLXw}1W7l%f)w@**@J}&ayyqS%(_~Hux8I$Jl zDxRxY**=_dpq*qn2DIu?u^^NaCJsv6BJt~7+BWFCF0NP~6ktrBCDX-b&-5EbV>{F7 z1H2PXg4np`BlJa`!bTX=q^&6HEF?c$aza^63^*?a_P;`X`NVjWTZHCp_Cvmij6}CT z)tk3%FmKr{25>Ok{TiQ>+R=K$aWAO5=|L|>cbQ9cFq=_C`u&EE9^8m8c(vH`^|F}N z?meAMsf8~dGT#sN{QWkU3hhISB5Rk=_3go;@9Vf|`Ry5+4qN;Qy{?QFfWe#P#)2z) zLFrY%SE&upb$Ojr9m~bL{gqjlp&>Rgm?-DkX!)BLkNtyy+;NJZKQ_IA+PS?-aAjax z++vK?$2r`G=SgjI0Wc>PqenNllXVx(YYg)Byy1j|?QactGARrY+oj%C;+6G|MqZw# zJk*bz3?Y*~dPs4%hp(6IDi%~w0hU`JCxhXI?lcWjfdJgd+vA>)DTu?xfIQFB4IQ)O z-Si^Y=rK_0*-@JRGfw;3-g<%2`X~bfyLd-|zZ(4+vt_&DgDC;_jGidDRs%v8FPP!0 zn@(hi@|aQQ=mL+cy+wL&Aj~DymQrsMNdv$eM z95C>07yEj&0oswHF-HtX{rb^g6LFjkXNQ=Kq$=35Yt+%=vnfH-7NxVgRgY}dF)Jq6 zdsGFR>^S6ZcwP0&y{n-Z_SdV};d?PwRpfeLw8PWMQ$e2kY+_f8{!rf;zl;1~8kR9A z;gu#mRmB7&4uQw>*4dTrvMIOP+iTamnYW8P?@)+)xy0`LlCbOy?;fv(-=-~M zvT(fjP$q#_*6%HVz3WI9+30$8G>n zKeOLqX_9v!Nxcl0%jn7-^P2Q0Qqw_!o2~j4`@L0VodlmYm*b?c48v0Wl_0PDw$7~0 zG}e+2J~)^5qM3{JX{@Tg4s=h)dq)3;CJ9(w7|;Bdo@mDWm#)a5g-c{fBA5#AP*!ED z_Pds#w7UQ8V! z>XvmNIJNP#rblq__@yxB=h9bhYtl|bn-tX1qg*UPbz*U=I+1YKwDC+Mvv(F#SR-04 zUaeG?YtjpxPr)Jz247r>D)}r@^1B{Yk3?D(h5z8XVykc& z#>n_p)vuL_AT@3K}}RUjZI?ZHBp@o43~!d8FvPNIYLb1;4&sda$f{*>P8>d1kX;9R?lKxGV^V{$S1IA z>IKa_>ep7UKT6=LyZDR|guUFJov8JyLoB|H#OZ zJdZcmDCV(@LlNHu>8(*=fII+FHaNUn_Mv)M$g9tr>^ z+aUzXriNNn;~Vz2yh-E*)0r}1o)xsEHyXg3GV25+o#PokE}m*!sH)45DG=K*bW_&X zquv|KC8bD+Y%8P7@h0ae4C(E>^F;DQe|T}YkMq8kz-;4kn)2r;iK$kFc6hlQ>K)$; z(+>vUYE^HNvUcM4gj?y1tKKXZ zMe>dB8JhD%^1o&fNA;S_l%)$r0~UVB;aliyymIz{QkH3Qd$Tw3e~di-%Ixx8VS*p; zwxo&zJiA9bo>#mybs#H5|xA`K?jcbP;;%hWuOFQZL+7s;wMcH&Xp$gw9`Qp}j z_n1&*-!8mubUqZ{XgTDTooxNoWF`LQhc})|WQ9meHF}w;QbI1ZjK5=NtpTxd0r&H` zW;xL@#cDQ(-si)K%^Jk=HjEhwOn?!qQ$gaiCEJ&+3CHRs8#RwP=s#PtR zMz&2d9xI+D58#&(-)9D~W;=1BnMa{+I_3EnSEFc1>uNQq>K0$g)*gRqmIczeln2AV zni+e%p56}%Y0b}G-Ok8zxjZoczVJ#MKz2U-0WI3|Rs`=U#g|^y*f#{ki_{SbDr7-a z-W_xNpA^2GZ%JBwhlS^uCfjgfhNWR<9Zceaklj;}v?J{C>f=jG zf2>l+9MRqP8)&rwwYiHiqL?M0=_y$YG0tj}f@k5(ehm$rpUk9km)~ig;~8}5BpoXY z_cSceOq8g&b~iV7NI(tpV>nB%@EY^m1>{vS5|gc*)tJY5O#?^U1r{A^L{@trCLC^5 z(2^SeFftjDNp63k&lFWlr=q>hsO9S+t!}h+ph>XQjN4X_ihgP25}W|)(<;U0%(IMS zoq*)5_{$g^{d(Dq_U4yz6Y5$@xVZoF6q|b|iA-AU$)*rn8M!7m6c!EJ9!vWw&e3E9 zje_l{Fkzs)xEoxo{o;QS8o+0weI#ji|Na#=XT9;!{@UuADl)Qa`}Wt-OPp^91mQD*byX+W_4xcFfK#3EH zCc>v_CpT#;ed(FR7+lH`eM=GrS9iNW*>YsAvd@Ouszb>te8YE?Y`sfc+ir2wt1I=?LkyOHv@2U90}c&+K_P zRx=sY3k%KXo7G<_b@b$y?|kCE2b5mjw8-N`nrm#DfBjO_r2w1S-Qjh8mNx>Lps6<2 z8`W%5yE^7f6mp@;yR!a*b;+J1{tUx7dPUw@tw`W9nbIpn6Q?C7CaQS#{p-u5kdGNI zBKt*^=BehseujMRe1om6GwI(`ab=jM(~Ct`Esp|%bxy(xg8Xa(v**KlcB-9md!@b1 zq`kJ8biU1p8b1uDMS4sH8I10j63kW-SiTOVY>hQBYO$+*`UEamDOD;@_;*;n;GOk8 zgX^czYN5r$%m&Yni7CXgtY;@f-LK}&iBp#4B(GI)s@Ajq-z<|52a}mBy zx|N^7LVsIJ0cF08F?c6}7gOaeoB;a^D_`fCtLt!V3z9cKC*MBHGj&Ef-GpEX>()wsE< zOwp!9mfp^mRk&=VTs#TPxG{I)x<(kX)-$3rEX*QBlKN?7jP{Jj?Xx;9cn<5g5}a?# z^bMEi8Qg!BBoK0C4-88Rq%<-!?A{P3;C2%l%L%z@a63 zbVTK5KI+Ws5v;5+61t$n4Sq$~`fGjlr8GYVp+tl}lwy777h|fyHZH=Hj3g_|1o^J^ zm_#+*0xK9oc_85P>duEJVhJ(gbGa5|0CJboe|}BMO9RpSStiI|>Egi6NFEE{l>()v zD;K=?2JoTx;Zga0-v0qaTPA|O{FTEUwJT#2AUIsIWUx+zl>dd+{m0OY_6iv!xr}GK zVxM5!-jc&_Vn*#8B+@} zMCgki&^uL+I*6~*DU~E%w}^JF?jNI)b4xVv&UN-e?c3>9u4WAjYGlodu1FaG&8@4G z^F^I+rF~@ow+coN%#ub=D(X#Y=}*bg1md%Rrvko$Oc{#ZJddKXJtHw=*X3tKJk> z5qSn=IjMSe|7ba zMF%8Y8t(80S&fhK^=Sej>_gkEX48AKbqwrndmh9ApO`lYgzM~7R6uEh9J76l=b=o= z_q6Aw(5$iqp?40rZ55740cPfClO~a(?z1vTFHglYLzx7OBj&Y;_7wM*724$jtYsMu z=s_mAS1nNo>1(%FbVb9|+AN@M}7Tmus(7xTM_$K{NAT?YAHb@+;rMT0|<=k?>( zNd2k7&V(G)I$K5s3AK28bq22-RjK`GJeBxb7;ZgC*opX4vOWtSgWI4H5>cS zCp(yF83d@ECDZtRyBZO~*}9R}1abPvcNC9UAy(hVmLtbv@%DMlZ1n zhRMbxDSp|FOR?E+l+zF18Bu)GLdKSxNKOe9bNx-usAJ!plboof?-vdNs+h5z2J{F* zZ%VL&(N6snV0O*yZj34!Ke)iP3U&4OW#lOJzcl8}USYklV&#%2soLxhmQkdvQg0d{ zs_;!ac!M_v$;?8#tZi}Kmr32M9m9_hnm8GGeg0a)u=_RM#}=(AcC{jmHK&dE_BX~X zaqTqI1ZFW06hewC>Wz-YE*UR*t0bsIHU98UO*3RURLu`dA>1k*6@&Ma&29go=S80A zW%kv`9Q{Sl#)qvJ^V&5{7n_?=ZDUF5SK=Nr!I2W)y$Z(24x$zLt;3p0Ia(f7+$gx; zx!mrn?^M%`?^L7e^m(P`)s8^`u=t~kG)ydD$!5uLix7F?m-~%rlvnW7_3^oo;^7SJ z2kR@x4H0jd7gd3tRIQP4IwZOBH5h5p5^4Uihv>u!&h{8XWruWGgzS_8bJ7dSEynVd zKKX(@pDu%-)YHpmsa`@=ZUJ2k>|}cYqegu>eLRon@;u;c%Cg0l$l|rCh6_CA6(2u_YoCd>Hb+Yq=0k!2 zyL|5MpYiZf)Y6_B^UYRv8&wV)I=AO4KR>{qry1@OAY)GrR#Y4X$u#2StT%LNc--Ql z3pIx-bF=&!9w4{BKY4ZlWQf)sJ(8ukk@s%3(o`PaozH>y5ae{g!Kl~Z&Kblp`}Jk) z#TF;T`eWVB@O?yk>tme~0_Y$9gF)FoZ;88a7rJIfu<;`FDjcQe-@jgOJ| zkL?q?XZJ714_5;*6*n`r!dIYCz&*-EW>HEkL{fIeGlN<2Nq#0%sPBQ z$}4Cc%LDUlIXR@3_;uo$?T9iqEe5v5el&%(;lCA&N6EiHhJxg`(oxbaKD@#G1*>K> zW-k7cO6eY3a$nD&ohDFB7QXq3&<cc$Xyqb* zw#`5w`rYldl8?S_POq#k%fpj*iwcEucn%TbCCU1^u}sbBIO2VJeTO?r5#`2%C20|3 zmxiU0wRLfp4DPgwu(aM*O1}=W0Tx<1<5>zQ*jC%H?1 zN{s@MvhwLt^Go6(c}=}DzVAONZ`773P55r4^2}BOezYBWvb^g&AmJkMFK_{KOEC~c~-uU zj=6BIwn^ODajDw;??fL&K4YppK}9s%INdU?U?O|Cp0w>`cdd;LI{ zY(e$QCo2f(3{3OXc51dq)Wu`5zs#y8Rdou=sKGE%IOJrDa2e!!lW>1`%=)&d401I< zK4Wx%EvjD(0D(Y8KiGuLoGV4decsUqYHh}5{MzZt!E%@3O~R^jXI#0ndO5LUlCwwL zW&AV3mSlz7`D%KDRWl&MtxspX#c>a9*TvkmcgNok$Z9;2w6vA$v@gF|R$oX~T^7K) zFOC8dluF85|d2xGv0l{v239OivQ| zrT-em(B*UV>A6lnUsa~7r&~I%NfcNa9%oJoNGc)fhwQz!b1ABWC1t}`>Epjp&vzhB z&)3a)%_3iLya@p2G;YO-T{#3`O)+3lC7VLz_O2pO1Eiy#Lb(<=O70x&@%OsT>@*fk z0s~Yv8{F&ON4$C%uUWylNU6un!Ds6Hs(H?4(kmc?8?!Py9FWNF_3i31)}f2F5zK*R zq5jHc$XHaxJs59?tKP-Gly63Grfz~<8t=eWq2ox3JrER4cdg`{?2KY%`xLhRN7=)+ z`l8nj=JoMX-{r!!J%GKb({PIfQ2ur0Hn*>CVgFh^{yFt@k0|fs6LRNPz7D;m<^dT9 zUX`YN=`jMz#=1lb$hJdu9=VWQ-M+*W)0CvP7Yx0C|*6!k|V4}VtGEaSc<7q zEBw7l?tO-2HJjp;$w4&9BtwV*79KdgrS$lVXZ!6w+3c zD9L~E3AoNgfMJ&U8zs)|Y-#$}=~Yw1%b*n1auHBkGOB`)VvifVxz z{|xu$*m9s{ijGybpA)REMW_CEY+m)DFyWM0MR(E;NKgh)F3JzP+$gWJ2HDj2c}>7i z*l6oa5BUIrnPrp$Y`jyc-o(s;m$Q3%qZ}?*a{ynOnk|PL&S7?@xPAq^D>t zti(0x!L$QnMpWAKuTn95_c$8uT<9GwjXtMhL-lTiwwkrLS+KElKv+FqNqAh{N|Ni{M*89cV3+Kg)SL%@zCGgd8oMqRD{6=4L*^}$F$ zMg8$cp@aRUUrYjqj_Cbr924ntsgKm4F6-dkGznDT`+{Z zMVB1YfMp&F&gZF3nl4S3`47HazjjHxvN(Ftf_tgST#O8XpG*As4x4?)4$fna*6B0k`XEJA z{psOQltwBn(hWEae03h)!kFb&0~&&ESI2)a89FC0`dTa74Rob>e;c z*n3(T<)i$pN;vzuMab#OOFGG)MB zT&6gt3fbBB$!&p1EemBW`NOnoEbKa5K6JP!?gnohg8+E^J!akmzy9zq1@E-bS`TdwKYj!y7+* z&c<~W*EGwMq2%#ctnx%W=&sk^^mw=ju8uV!hUP;}X@zU8YCK9s7FfdDD|L&86Eg0$ zXIuB|RPz+b3$ld%pqRmMbYD?fnlvqajJ1(s7S~=ekpU3gAU_z-UA{xgp(X@5!X*s1 z_p*BFS*i6}a3S;(OBt0T<@+(QN)~Qae9Gn0Eviqit-8)RFOzvwyxTpCh2-aLT@JNt z?v5|iuA^Gyr=4av*Wv*6R~cm5FxoKIo*>xM&vT7tGE!9KT&m;vLUqM-X?iQTlBxbRaY?r&=#feO-{qK5hY!yR8_Li ze*;_qMUFg(FbhN5Qk%V4TZD6=&t&$_s=m7Tb9_74@jmu7OBWftoJAx>oAIZ>M-GEeM0AhpP{O27jZX!{4#}>?g!O^Xa|;J|qKoQYD%%DSU&FvI-y(g4Io!=MJHB zgawJL?Ze3h@;&N?=Ze9h6^6WBLnBYe{4zovms&-|G$h0Fk60mA%aUp2&Z|yBQ?;WC zhcn+C^*?k>(i@&OJ*ZR&+0_MF9#)UG(D5bsdFHgb2BpBsushVISO2N-W3`6-o?N_x zy7Tb@F#p|cryxC&P-9nZOm!Ersi<=hN$_qoaiu5<1yG^-DNzlLcROBeEnBI-72t+g zRHJdgUyT0h*G!)kMSCOr-Ib^w#k-ib0VS~bO9P5SpDeB4Z}1YQjF$cr3udu*p`uMi zNvry_ugKUa?UB!da+>S$xVQsH2@f6#Jod?T0Z=^g-f?6u*DKcgihyrdh4%=1FQt#E zZe6xq$2ECAnB^|VZkMG^m+l!?+=1*NbNui>psu8c!oQs* zW39dntYw>H@_M%Y`)mP7*#7iO0qVj@A%p_;P%+;LfA!3T>OPx++Aa;fV7XXW3yma9 zuJta*Dza_oZPPunuGdR30404q*9`1zJ@d!NU{9u$tJMb5WJlM8$kR%>GwdlM&Xa%l zX-p}H!zro~1yj@DSdk_;?(ajwahelU#9eTP0fE?U{e1jaw6PBuJ7RD_qD)DmvQ_$<-Smt}H8CAxLMZx5);{TIX`$K!*>G7)06mbr3C^M>@-4Ue z`=dCMC?{LwZh58<>l{?dp)cNAiTo{+t}oO>eDxoZn1&CD*2)70(^^2kc2-{^;ttP1 zdlcNDnaix@%NM0`Gp<2tIsDcufWo9EU`XQ>kT2LSZ#j%Z&a`NAoC@GNVx6Fm24@y% zd^H^mJdv5lB8(xOU~>o_B?&^K6Ejm29ttdwsSF;DBE(W8#Ka@>1qeoN?ru7Vx=@(| zG27BgoN&8AwWP6i1%gYWMo)Uz&$ABUQ>A~82s!;fH)xmHo8cOXv{C)ngOE#1W$zbS zqflQu{4#^Cw1u0aN!3&yFXa3l2ZsaFv<7>){Bpt0Q}Xi9E4{oL9GNeA)$2d{AMpLS zemCRSq*amPyM&S0$Qr}u7+*O^JJ?CRluvs%PlX1%dL6&m7M=#NTMKf6c{sB7khl}~ zjp_Cl4qg9Fks;x`VXBio4)ZAWpJ)w6hZk|Fs8=O_pP9i>SpT2)0uaY62P_8ByiR+$ zbXZK4&7z^zZeH3304YS4B>F2w_<08|2jy?A#xenpu=y>O(@IM}U-lnswNY-!8_DWQ z{7L-Vsjr{|%e|~_c}I;{OLX~<&PSHOmVJk!=a6NOd2k0lfWMCr-~DxO)|>!v%J%_$Ij+%_N*zazC!ekf2SIHF z{_XtXCT_={uSD@)~uik0IK7_@T;0Jky;uV7$GCq=wOY$%>5JGnT&Lhpm4mXY< zVz|h4oByfBLa(_dB}Y-8Hnn;MdU^!jnU*&TTh>oL3UldiE?LBx2H#?@UhZ~1*X8QVvICf@W;f5E%6ySyz zcU_!f$gEN2n_ked=MTRa$CSs^A$%UFEaW_%?p7x4N@jysm=lQa1IPqwxsMi#xld3p zKR&vxBlEko2Kw6meqJ^hfdBZN!T$Ti%>P#(E+b?3W&SJ|%)Y=u$@+5DmIFUg)8pr? z_`_3)LBo*1>34@KIh*^HfMlA^1s0@qGBSI&x}cae+>+7~L(8lTnkJP6iT@C{Kt&^j zZSH|h>6wf~m*nylSw%H=U1u+8-7JDy=j5S@TFB$}UL%o9nojxPA~?&4p~EdV+F zo9zSm0SCnnO&8C4LTA3Em0_I%$Oqh4vk*I&l-EwzkF9TUQEcxxCE3c3Q|MQu`UTi< zmD-bOQW^fc7jA&aF#6%QBo|0g=ifK9dKCNY7)J@A34ol?u|sp^2cY;YUH(!V6q7st z%#*;v0_mt2K$OT-cVNfp2UxF0RaoP zR3YE`iLfwE{O@-HsLcL)r_-ugy^KepGonPx)(eN|6+)uZG!R!oQdP|L9<_5ZV79!hg-tzXlLc;{KlwAvnG||0+=P zuPOBODtru=ed75&k27xnnz4WHFNg$4?5aky`$Y3+qwM;Gy_LC(NF!i%DuDX_xeoum z%|sudsJd^-2+aFhT2u$K~VdR8V2A4X)KNdEVg^YrX8PXnMP4X3md!gnlvY-tIUS95b~N1gPbrmw@d2_s9HwPY&2*EB$x5%1tvV zX*0y*g5F`iwxUt|tgTn3n(aUBZ{U9qouZb?zz}(JsZCAaw2z#aSh*6IfkCUEpF-u% z;2qPiL+l?Q^JE|)p!ng?MxZt2k??<)B0fx@%)49UrDed>dpRpdI3-7d>dreo@{j3K zgc_qci{?)ilq-9YVPUlnsz1v4kR74FOI>3E%X{7B$F!HL{=Dl!UfzS7A<>;dUPg0& z!v5c-M;g70QX*gO!WiZb`b6jA-pid{?jOHpoFbHadf?I{lfUt`{F6$CyqK7s{9VPn zETQ+Z@GZK6aA^5%9E%U~|I{@8hb;Lm?A!ok;JqKVzn4PS2*Zg-!NN`NIevabD=g3X z_Y6r9tJw3`zOSFKWk^ver>4pl-on2*vsi}GEuXp7vn`ei8IKH%NZj2C)V43|KK%7C zAxm}^mppdi84}LQDE-=*oH%d!f{X#DSe0^Fxe+^##;e>av}s5$*h-&xKk7`C)U+`6 z8l~0;?NAAl&v@rSx@XqQMR4?C5M1o_$*Ba*C>z%E=|LMN?(+z%oVl+3)_AJr1b2DN zeUb0LygU5(g??x}zCPK=(zeh+9pK>BvqalWDd2j;pdWXBpRUw=q+3{}vY;Yp*{0bk z7H9Xp#amQ+`dsCy)!8oO@v)|I@@QgirHI6%ZSR~K;3VpYhBb?RTgMcW~ z>mOwI``qQL5?*W5fE(178?8OsbgtD*p3=g+2FdHR74P;DC;yiDe{KgVm;vkD!z)mM zc5AdwYnDzLQEyDs@3Z((P$g44pe|Y}k^hZLvYVv|Ce}nVM<75KTHNS`XhB}r8`J!x z_c!CkfQVqxcpi#)5{fSS-pUq>hyoscYSJ2P+d2zgwANAPd)%pn$}g$e0Lp^GL3U8C zH5}?~V}O=uVeO@?3TcsdBO;SQvedjq1j+>cEGs8RP@$xy5tUJ~Uz4Ry&k$rVCjiLM z88*>T-nZJ7$8H=Q&#)YpQ6(&5WSUMpyS2-PzJ>JbcrTG~#8q;u8rc=~vI7p`ZiP0v z0Io~W=g((mgSXU08DXm;*oi-2Bt4kSv6tB}nSJg$e$+vX!!eIRi_=)`%4|2tGr9&$iMU575Ifx0?H^8U7FAMr3 zur5!j?m^c0IEr1bT@KBpcm?iJX1=g3@E$wtFdkNm@$FM7sGNFC9drw}_*+T%OE`mq z2@ZTlwY{bqJkJ|YTxf)I{~=5#+v;CB(}z~(2Rzh_G} zAa!~-WlSEbHr>8?w`W$U8$-m|UOUC1>dx$;S)Mg>%j{BcX=H9?xtaTs|AVIfqxOnK z@^@>QnlBaEuubudAImJTw%LrR^ub#C@dT&~ROkD)xnVOmTdawIqHdXNE9u99W9r&7 zrJTJet1ucp;vx3<^B@~g;l-6A%%`AUehjh12Dbxr$MKc_$*;G(9PB( zg;cmtTU(1N$jDrfeEo^4hL` zF<<8zZ1>;8%1UrBTM*L(s^JbV=8i1pjxOeIhrtI}eQzH~{VmTX@m$Whl#p%OU*aOj zm&#C4dAjwscc?ZjbkV#hOMf=dxwL2Jh5%ln`SV!Z%{ditrdQcfHABP(h`rncJKyM{ zc~fyv^YEc$VeMiP{DO0npqWdV|2f!=Vj6gRr$ivdAg{sqbGic`j||KHWDG5%LgPo| zXh?y~JSH6#yD9Ej0f;m-xSv)m@P>LAg1gL&UQt&UfcKp9tNrC>F-!$hzO7vDVTQM( zyA!pJEX!V=98Q>yMQji?p^BQb*Yk7kD8W|=2`V0*_k(VM)p2jEhnWoWI?DsSK2>Ki zcO~vHl4Mq21&p#i=kiIy!XXYSxm}N9lK3e00@ewcL}%uc))<;A+IOCW@ZmD6>8J2W zgYSM$D{YCt$NT#BHI<5Feu`QOT~&(-Zt5vX4C3WVVvOyi_h*Dyx`~QR5e2xYx4*@Zik3ldxF0iP?wBHMV+roQmFn+!)Xe(Q;%(Wl%POh?uf(T!f7LL);rtx&lvz62_@ zla18m*xUUw&qI7|%$Y6R3^xW@K=Fxir-aX=I#!6DjlQj@XP9ivJog^oshU@@*I zaz&M)Aj$!7NXyKKdybZg&d@@C2O3~u|*(r$QS~c2Ig(Di+J=w13M)u~^308^?-nnrGwTzZ0y1qLbvb1skLAXLefY`yKK<$$V6 z?wryt>qWOou)ouuYQ6-U)* zUtyLmiA!fI7|tBs_p9^Jyn4kBpgdzda$TJzQ@3M(YOZY^r>JfEPaTK$@J=1Ed4^aI zS3=zm&~Q4I_>t1vD97aYO$&a@XWB!lvx_I?eCPZhgOa7*fVJjyk?$JR*+rv)>c-!A zEA&L1zIt^1PbKtXwK}jciC0EOW>ei9mq^9;gG3^aSSN!vud$5fxBHh`)PWkC%w6^xKcg+aKP- zV!VkRLpq3708iA6k7}MPhDG>AT47k_xMt&rZ5%{h0~hyAJAV}2w)f?POA~J9*zf4b zB0KBQ`!hLwQ^HDx7V~=5%T)FE@5Nj-=Hfr}W*;gz_1inAvf+?6&5Gna@1Vsu50Rm- zuqy4936Ou;VaqSyK*RMuFaA90oiRUbbTK4=f!p8^Hlk5$iyB|D9K30TZ_oo{VKZ}; zxUf`1lYF+^PX+NrM&+bYt(a8mT@o2#@|Z5XY8WC3m1v?mRH%Unyh~|=@4~a|cuwba z2@Th1G^LI&fqu!gsyCPqw5ut{2XnqUhpF@=gtKR<$>G0f>QAkY@`x?N6d1hxpc4dd zezmD3quD@aHEY)ieVI}z6IboXgvYEIczcd-aJ2}3V|nySCaM0_6nCW(^rHzW!*EKW~iZXT7ly0v%!E z5EIldaTgEgKFTyF&>NBMWc;RzCM1S)-n}d0Z;u=jSx-OJ%=IbpRJ%%}e&zW$hYP5W z=pMfI#4W3fW52NK>ScSji(30(f|+B&eUb=Gs|Ae%U%q=Sn6jmq-l0`-I{qA)Qw z2q=eu&58*x9}#8_DUjmzG*MR`8hf+ZBIk`I`hEi?XM4pNOb?ZbihMzrbKN82+zR|v znHD)*?l<03?`JpDQ2?<+e><%4b=L@Hs4?ViuH8@cW@;bPfW=8PzzVefE4H08n6b}}7-XtX)f%`%but8(xgIVXe^q$NH} zvOZYN;s~f6COjlV(<=#x3CCl?fajcV1VgUI`R3Q&F1 zBz%k+@8|}vk^@Ys^Rm?=;|Ugd$ZSFpDTIarP(Dl9LXR>GhNt#I&Z4a^Noo8C>~Vp1 zxgYxHJ=nA&HG_7gjqP;nv8*5^T~)b5mF@#1j5=)SQ`^_wKUpku6hE8d)KrQ7h+X|Y z$Tu+nn*g8;d~IUyWfii>*Z7#l&K37rO(qaZqN^aKnk**eQB~Vg^XqIzAMDVMbTMSl z&BP6f5ygOLw?FUWz?T}IrwI#R=adS86ULdBNejc`t%g=?u8#;M-yvUJtRO}`RdE_s z#zJ_diC^bK?~J;m^2~MVX{30XDLz6EDK`^~&(M^LL;q81O$s422k<>ew`wjD?5WvN z$=~)m{%MLWt7k3*=L1v)t>C?5$II(R6t`lG&m500#|*CTe*2dGL}KMBs7U5?&ZFPi zqBRCzkNKY{9V%q56HF7mL(d4`^%v?&&e6?Tqs2`_CzLJyRmw3V*T;#Fc|l2wd!o|8 zs+2SBJDsXfBOsB1pfS9IU^f)z1LDDROpmA9ezB!{_ zd;}i%OZ?rqiJ!E>%MCjYR8nr;p4juBquTB3lWBboUQcYcOI{^$pob2YhSL{NhskEp|v!YI%O`@>Oc z9newb$ERxJ%SDf121NDsgO=VoC=EAsmKJ$M=g?5mfF$Hgfsa9aU4a{ z3`p5|b`8qln=d;YIqjT%8Z(C$NaJPIat1HRE03nf8eI0@G9MGLT*r~-FzhMN#h|Cl zS(eNs5<`zjp6kkhcIZdm%d{V}Ic|&IyWbJoW-JDZDq9)aQhU{mP`WhrJB^r(Au~La zPYV6kC7-$9#6Rb-jcYxk75KYV0aGh1u{!AII!_bshsR~UJsIx`VR zF4m!+#Bj|GfXuHAPR=}UGzR$8Xq>GkCqWNW(^kO_Y3|>`?9mG%ybtlRyS5e*?RQ>r z*(C;pa-@t*tLI*#)CQ+@cEira%kzg1#@hYMsu4kyBGr8ZGyKW-SCqK6*r#So->+SBV zRT&$dXs*2YSgh@4ON1sar}CK8y4-iRs@d>ur~8Fm=gdYJE$fRxAjP@|{B-c;cekgO z(c<=lwTrfQrafvot+_8(*Svv>*eHD(bthvtkP!nT%5-n_;paj5Cds`rZj$En^!nrW z^?kec?Vg49vx6n#<;QhAyEfsUxiQL`)3waVqjD;*w(pR_svwZ^3A+H1ECpH|l>hm0 zFLe8)br9cgxl|W%)MUBD8`p&U*Vn*uz4LQmwb94+>>^hN9F!gwd9_X3_Jg7&+l+@a zz0-DyZ%bgZ*tyahT_b}MQI4wj91b6=hyA0KX-C_7keCTRoJz?e+bu`#Nh+K3f2J2T zjWq5YKDyY|N@+5D#F^&q(4D$#nM-T_TyKWVh|1kpZ>dhtxi7hYqxafbo>Hig+drq&s&TllJd=Am$K19XF>?4U_^QOFkjf|W z49_X$&8B1_pTq$==5%Lw5x#13naNtXw)I2CzBMmvI{YCjD}_u>QCeVWRzpPWTbqZ< zmt`Wp&~G&)mC0-=<&`%lpxGl~dDs=GDFnKk;uc*AV(}VFTN_SUNCkT(i8kX^@m10p zNx@G}FQt2%;t_1C*g{HJSxjBQgLQ_oX9ml-eEpL+iYOl8Y`HcGg<&2HqqTpB|w#0mm5evZBOaZ!Pa{vlxbl$~t z`dhJama)FHROzcTCYPbcS9Y7!oE5$gl(>%rdxPV^I{E{bGa!PgGAffZ9)t4oZ6p+5`XESTCriz!5z5c2G3(kFxVq4pL@*y z*Dp%0;6|NxlluOoR;s$Y?t3ySqrMMy)(hQbBOLQ}0s(|@M3eLaU!Q~HLzWPzAeY?) z-EGF^hrWgK$OoNN$h4~AXShR3Oxc)kL?6T+p@vLXpN%Rpi2DU)QtyIDj?1O$<{nnz zvEVDuEyUx57IwjB8H~+OFY_Z7icWmDl77rClqR8i46_=S z3eL8dPeaiC_*KHjddSkILm6kVh-9$^zaeq8+Off1x~Mh3Pg=N{e)awp|Iz(JTWdoU`aj?5cfSP?@*1@t$(|Zlj&Yv^r4Am?GrMhjj`5?NU!B3qDnf7pG`(clWlq7btEexVu|%cehZy6b%kR3Iul#?gV!!guvwa<~?U-tvT=f z&7XU%B=_FezGQEIUOZCXibpGlBpm`9nZ*ZktK}+Ea`0WDGrV)wZYm+O8gY;@pE0G; zmP}?Gqi6CIdXTeG>R%0L{_}?x-IV3JN|e(DtA7~GN%5lZ9R`bxRW~3MpY@AVP~q$F z^j?WyZ$FzTqt;NUUQvX|5hp3Y9oT+p3niY5%Iwt7)N=FS+DfAp5Gslh3sQ&VKqh|-5`ID0l&XDlr$J0Z zT;^7KRFqT>SULwefS(@Suaaj=L$|a&*oRmEsmhDdRmA{Z=b2BZnQa6LJLw1@0L8igc&ageJ zt5TW(JBM1t+J8+|s8$h_FHpxrOs#M=;s|L}QO=<_mcZ)pDpxxqVj|LAtPp}SSjP${ zKA5OA1}V{VHc?GSIGPnN)EY@~J{Tqp4&!`dBT#C6ul;g`P1*<<###9@k6qtx?#ylw zl6WpGB{f$f<7W61+)_TiOT%h=7-}>p*-&3Y>J3~nD zPAP=QvoJX%ye26e6!aoHOCnp*wP9r9 z2mu|#LgTnH=4)2K-AU?jz>2qkGSaTKAo+J>y(=QZ_uj#kx-2|{sV8n z)L}~qH2y9+zEg6*zIGSK@5b{l?24y-Wh$enH-@{eny*iKoi9uK-ez;fgKxKN#o}AP zbaiBB=aNJc+e}K7?P@R@fTFiTN~1A6vLd&4|84Mt)Ld+-MV!L78ueV4zL%)iPTikl zKcC8n`{=$rrF3UgEY~Me1tnyA5%hH`sJ;{#Em}-mR048^5@-l>RvOY3K8jrsz|$Ke zyOM~n@*U3}aCahC>j0iwyMg*=#LRSMGw^c()|T638Wcho6AODSchtfF(0T#1isRNi ziROWRo>=JKG>L<3ftv3f3!ZezZ@x&Im3TBmi}zfY?=Ozn>yS&AjS%+O%?a_QYId4S zIlAg9I~nZ}$ojQc)D*|YJQ<6#q*-?+|nOJ&r^cS}*owz?}5-nZbMCMe)-- zV9#X>iCbMmL9o^GcCXk@L{k@SwikU8N7@t*_rT;hDNmQWAYrA-*Yd+q?dU?Ej=gWu zq>}fuhP=jZz!Git%YDZPZx?^|1Ex567w6L7`^`1~|0PW8I6V-9{h86=$+@MdqPZF^ z6WlC8A^w6Afz$dQbheccgWp!-7I*7S1<#Pudi88T`7dU>SWmeExB9)v@x#dpi6KG) zHDp11qXxLkN1^jz3FwlWTKF1au@}6jg~e8hc{=Ai_0jrc$c*|2Ubla^?0vqr`dA+F zC6rm(Q1=da(wA%S@=0Fd{&ozmxWxn9$wt}^9oFMA86CWb4MsyA)KgQ`eR5A$EY;Z)1P`V>(qenKbNspURie-3vz$qH{4vJv>=bXgqqdDZhv4T zkveZq#<*o44+2%5=hEavgO*^uf|Ww?N#&`wVv!CVB0PnvVq2tX#os6da<7#*2?jnq zGVKno0Ge5{O)(oDLk98cf278a9s4$>g_M{Y*QP%cVZ!Y!&$aEkyn_8l0(Y??i<3+@B62oWNTevFwzvLL_71? z2;9Vq7RI3XI{j)}r-i-G*Pg-SMqqT@uRo1c#4A@Q8?*OtN_aHpYm#MpcBNDvC3-?> z>S4ohU_W!%nj2cGI=xn8cYe%8}& zU1`J5HrB5EJ@)gWWvsHrE%<8PX!{T@o7?7{@4xI>=OAZUI(tn^C07($6<(gy(j;%h z3!}G^mQ@qAer1ZC2iwn4Boh~YPBDg`hCtc}UH7}KbWJH$7$wLPMy8??Wno?R=@8!? z-*@;-@%ZUo)?J&wVs%0#-!EOCqOb2N3K+{(94w$ZDU zRPZX_y+qgaRYy}0a?fo9A>XS7Bk+Fn5o3n&$=>F!uHF7zWHtNvH^PDYcgRWV|2(5H z;zzG%K~G}Ss_?YKP zE5GZ3?f)REXbJwV^hvg)g=E}&*u%e*VDvMva((QT8=x6kQ;KpDR6eD1Sj`}eYG^l} zdHy$C!p^c)_Zr42&f~1Z>@T&lZzu66@`_mFjZ^(tuA#UEFfAvW3!l6s{{`g)hQ81R zcqWWbNjZUJ=o>&)2{Duy2CVnrIwfF`ttMY?ePR^QW&2D@f42eMq%ky{Gm8Zdo!C;l{obJL@j2=~CSAG+M#!P&;J;kMY zP{YtKAhAUvrjc?@nO@!g*7dEOfA{99t#=cBygg#%Yf&P8j)ZGG7LLGGvQ?)cC_eY| z%tel_`@NuLS7*;f+1+BQcSNJDXEN7s5z?hyOSe!|%?>`LILxWo%g9!nM;?g7{q!p? z?Zt&zo_g64eM-de%+NvrTSvdD*?PDG+2VWx*T{6a!~ws3sloT%x_bltIiS5H%Ovv( z5rb~4Xc?x^-6Ejb1U|-_=?7$kpI+Sd+dn=1eOKeavGI3&4dX~XY?^`{aIzz}-~jd3 zEd2uGO`cZe-rXYQUwI&ks79n+Wm&d>oCVA1znKHj9TniwuHuoaEKCBYxJBt_JD2@b zD>(~48ZsZfmJqr3sdD9Fz8u`R_9XrejOQb4X(&!q#z-G&a&Y<#gr{6( ztTvHJ#y>t$4xQE?Cx|Y{1w`8->_E#*8Bn$oCn1l;^@%=Y7UmIbkkFPH=z!7nni`9H zT>bFLF1C+iW0|b#;pLseQT5Ns}9Ll;HLmc zLGMaHeI8gs`w^*ibG@29qmIjW!N4?{d2Vk)*0(F!!E|>vJ3CFE-H~Jsr5mt_B|3?-GSrCkq z){~%!s9AgKsFJYOKNyOxGpswFis*S8_H?@r`UB5T39Y*qFPS`!e!GM3H;y+WDzw)U zo+1tYLo8hkNNJ7Bz}tTy=)V3BhqN_9)#so+(Jnajd$n3u6TEwNtMKxvs|a!`fvs?? z_4t%HCu2S?UofWpJ~qtNJJ@#MtNV9Pq=`zY`-2NIqZ#@Y;Jzq{cU7a^CS%4&i@l&d z!YHkez@OnAQKTz5YIwpk6{eUrukUeK`!{Lh1vCM7fgB!|7yz3Xzw38A1ugnU7^0+r z4_v8lHSRzg^LQTX!ehV^f1Mfj$j|0Vj3>-6y5?Dir{#|l+3q5_U&_?GCIT$-eg8ap zE-ZF<^2XqX5P$7XMEm?A^G!ov+prsnYR8{pk@b}OYYNLIOmkJ^K>FF~UyOUk+L%TH zcR~w82*bTFVq{9K#4ihvCa*X>B|~WETD2F#C-DNLQOYAT zQPr{m^?~fwvumO$ju1m%pg+1H*);})SlqMHmT8o9l->-Y=~FTiy-Mok?n0~|F;^;W z#E=(h^Y=iAG7*&A%Kk<%rc(Tf_IiRmgHGoVvA-@Z-EY`LwUh>ERv{iEATm_iY1wJ_ zJAKUm0{ME{Rak|6xnDMzuc&)nZ~E7B@M5=t?as^j=~>~J9~Y6B-)cUqieqny4i{?u zE4@359c*7MJ_I*(B5i0>9F*{*)Zk8VdbUUYR?n;+flEzfHL=DX%a;_mlP|00UtVG@ zNiHQl7Xq4-$_EK9l)j(0t|THR-17os$ZD*#_uOw|aKxi8WZ~YoLgD;Yo$iyrl?Rx- z8T>uT@4tfJo-`gX2uxxRI`O$*uAl12GnNu^`mDT69q$sDW;>yCOyffSw9Lm?O;w#m z7yRs%>k|7QQyBO*|47!O%k_*SKey(;0hO+|UG>qc)yN$aCc7I!jYR_UD&jAVgN*sN zz(s$viZTTI#g25m$1Rs1L@yHz=+u!jQ9J9i;7T7)&1piP1mcy;e<X_{cMt9_%7M;hlcOpmw(7bgQR>{xos-kt2&TT_gX~3e^pvFTI z8(HMsCG!mxyYL4H)ghbaEf$W|o9*+8^_28i$?gD84knKX1QFoQGD(PImreupwwTkB z;bAAn{}aB6GRoJg2@F6oe2T3J&G5Ikn%FFwfUkFDtKcmPNJNl1DLbU}y@&6BiSuzWQm9(Zm~gW8iljbo5F{%q1ddmE)$<3 zRB(RLb?Q{d$E1AJ2ZFtcpVhTW`%1m^_eDvcP+qkfU z4^fR48fa`t(eL+I@nW%kWvfT@=t720;5B{`{n__#hkpFAC(3)X!j&h6k$dLkwOkor zfY{moz4=rgiU%tFoE0_UTBm~F4rRWshsmV#*5wQcknE4 zOM+h6W-6w^ytmmx-hBauWsUtzKLxm$5Xhz6oVM)j7MI->7zS{*lneti*a{ArY6T>f z7<>3{bb#Uu!3?OFOP>+DJ;@k?4x|*%B43+eaHf8Z2THpy92r`99K9zPu-LtN4$p6s z(aO2hScl@i;t`2uCFg2%=`mP?_xT%j{-YakSerKS>Jo;fqqFqg!6H6tP*XC`j%f)g zn5;wIzH;@&7^~#s=kD)WqA2?^wPW8LiH66X(soas1>?VF;^QK+&jS2h_N=cl&2}d@y~wp>e*jpUgq6285{JY=X^uJZ zpDirX=HmShTvfW*s_a1T2eP9&Nwdu4GbHp(x#@A8$zM$g(4fmInJHDe0+MHdu`wa1 z(o=+5h4~ig#2>PX@?8T?`2#(c>&A|o?4<+k`&=vI*enVs=mBvg(XN;fU}=heU^
  • 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 literal 0 HcmV?d00001 From 7e72289332d94dcff4ddb1c94a9be860f332f026 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 15:51:45 -0700 Subject: [PATCH 055/286] Bump the github-actions group with 3 updates (#3106) Bumps the github-actions group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [google-github-actions/auth](https://github.com/google-github-actions/auth) and [codecov/codecov-action](https://github.com/codecov/codecov-action). Updates `actions/checkout` from 4.1.1 to 4.1.4 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4.1.1...v4.1.4) Updates `google-github-actions/auth` from 2.1.0 to 2.1.2 - [Release notes](https://github.com/google-github-actions/auth/releases) - [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md) - [Commits](https://github.com/google-github-actions/auth/compare/v2.1.0...v2.1.2) Updates `codecov/codecov-action` from 4.0.1 to 4.3.1 - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4.0.1...v4.3.1) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: google-github-actions/auth dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... Co-authored-by: Randolph Settgast --- .github/workflows/build_and_test.yml | 6 +++--- .github/workflows/ci_tests.yml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 77017f45693..f51f235446d 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -81,7 +81,7 @@ jobs: ls -la ./ - name: Checkout Repository - uses: actions/checkout@v4.1.1 + uses: actions/checkout@v4.1.4 with: submodules: true lfs: ${{ inputs.BUILD_TYPE == 'integrated_tests' }} @@ -89,7 +89,7 @@ jobs: - id: 'auth' if: ${{ inputs.GCP_BUCKET || inputs.USE_SCCACHE }} - uses: 'google-github-actions/auth@v2.1.0' + uses: 'google-github-actions/auth@v2.1.2' with: credentials_json: '${{ secrets.GOOGLE_CLOUD_GCP }}' create_credentials_file: true @@ -234,7 +234,7 @@ jobs: - name: Upload coverage to Codecov if: inputs.CODE_COVERAGE - uses: codecov/codecov-action@v4.0.1 + uses: codecov/codecov-action@v4.3.1 with: files: geos_coverage.info.cleaned fail_ci_if_error: true diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index b13bf8e5554..7bc9795044f 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -41,7 +41,7 @@ jobs: # The TPL tag is contained in the codespaces configuration to avoid duplications. - name: Checkout .devcontainer/devcontainer.json - uses: actions/checkout@v4.1.1 + uses: actions/checkout@v4.1.4 with: sparse-checkout: | .devcontainer/devcontainer.json @@ -77,7 +77,7 @@ jobs: # The integrated test submodule repository contains large data (using git lfs). # To save time (and money) we do not let Github Actions automatically clone all our (lfs) subrepositories and do it by hand. - name: Checkout Repository - uses: actions/checkout@v4.1.1 + uses: actions/checkout@v4.1.4 with: # Let script update submodules; Github Actions submodule history causes error submodules: false From 238b8512d807fc56dabcd24778a7ad78b54a18f6 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 7 May 2024 18:30:44 -0700 Subject: [PATCH 056/286] Additional use of streak2 for CI testing (#3103) * add yaml/script variables for certificates and nproc instead of hard coded logic * move CentOS build onto streak2 * attempt to avoid copy of certificates --- .github/workflows/build_and_test.yml | 29 ++++++++++++++++++---- .github/workflows/ci_tests.yml | 27 ++++++++++++++++---- scripts/ci_build_and_test_in_container.sh | 30 ++++++++++++----------- 3 files changed, 62 insertions(+), 24 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index f51f235446d..5b3530e11f8 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -9,6 +9,9 @@ on: required: false type: string default: build + DOCKER_CERTS_UPDATE_COMMAND: + required: false + type: string CMAKE_BUILD_TYPE: required: true type: string @@ -16,6 +19,10 @@ on: required: false type: boolean default: false + DOCKER_CERTS_DIR: + required: false + type: string + default: '' DOCKER_IMAGE_TAG: required: true type: string @@ -40,6 +47,10 @@ on: HOST_CONFIG: required: false type: string + NPROC: + required: false + type: string + default: '' RUNS_ON: required: true type: string @@ -110,7 +121,20 @@ jobs: docker_args=() script_args=() + if [[ -n "${{ inputs.DOCKER_CERTS_DIR }}" ]]; then + DOCKER_CERTS_DIR=${{ inputs.DOCKER_CERTS_DIR }} + docker_args+=(-e DOCKER_CERTS_DIR=${DOCKER_CERTS_DIR}) + fi + if [[ -n "${{ inputs.DOCKER_CERTS_UPDATE_COMMAND }}" ]]; then + DOCKER_CERTS_UPDATE_COMMAND=${{ inputs.DOCKER_CERTS_UPDATE_COMMAND }} + docker_args+=(-e DOCKER_CERTS_UPDATE_COMMAND=${DOCKER_CERTS_UPDATE_COMMAND}) + fi + + if [[ -n "${{ inputs.NPROC }}" ]]; then + NPROC=${{ inputs.NPROC }} + script_args+=(--nproc ${NPROC}) + fi docker_args+=(${{ inputs.DOCKER_RUN_ARGS }}) @@ -145,11 +169,6 @@ jobs: script_args+=(--sccache-credentials $(basename ${GOOGLE_GHA_CREDS_PATH})) fi - if [ ${{ inputs.RUNS_ON }} == 'streak' ] || [ ${{ inputs.RUNS_ON }} == 'streak2' ]; then - RUNNER_CERTIFICATES_DIR=/etc/pki/ca-trust/source/anchors/ - mkdir -p ${GITHUB_WORKSPACE}/certificates - cp ${RUNNER_CERTIFICATES_DIR}/*.crt* ${GITHUB_WORKSPACE}/certificates - fi # We need to know where the code folder is mounted inside the container so we can run the script at the proper location! # Since this information is repeated twice, we use a variable. GITHUB_WORKSPACE_MOUNT_POINT=/tmp/geos diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 7bc9795044f..796334d378c 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -200,7 +200,10 @@ jobs: ENABLE_TRILINOS: OFF GCP_BUCKET: geosx/integratedTests RUNS_ON: streak2 - DOCKER_RUN_ARGS: "--cpus=32 --memory=384g" + NPROC: 32 + DOCKER_RUN_ARGS: "--cpus=32 --memory=384g -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" + DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-certificates" REQUIRED_LABEL: "ci: run integrated tests" UPLOAD_BASELINES: "ci: upload test baselines" @@ -253,8 +256,12 @@ jobs: ENABLE_HYPRE_DEVICE: CUDA ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF - RUNS_ON: Runner_8core_32GB - + RUNS_ON: streak2 + NPROC: 16 + DOCKER_RUN_ARGS: "--cpus=16 --memory=256g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" + DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-certificates" + - name: Ubuntu CUDA (20.04, clang 10.0.0 + gcc 9.4.0, open-mpi 4.0.3, cuda-11.8.89) BUILD_AND_TEST_CLI_ARGS: "--no-install-schema" CMAKE_BUILD_TYPE: Release @@ -263,13 +270,20 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF RUNS_ON: streak - DOCKER_RUN_ARGS: "--cpus=8 --memory=256g --runtime=nvidia --gpus all" + NPROC: 8 + DOCKER_RUN_ARGS: "--cpus=8 --memory=256g --runtime=nvidia --gpus all -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" + DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-certificates" - name: Centos (7.7, gcc 8.3.1, open-mpi 1.10.7, cuda 11.8.89) BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/centos7.7-gcc8.3.1-cuda11.8.89 - RUNS_ON: Runner_4core_16GB + RUNS_ON: streak2 + NPROC: 16 + DOCKER_RUN_ARGS: "--cpus=16 --memory=256g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" + DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" # Below this line, jobs that deploy to Google Cloud. - name: Pecan GPU (centos 7.7, gcc 8.2.0, open-mpi 4.0.1, mkl 2019.5, cuda 11.5.119) @@ -294,6 +308,8 @@ jobs: with: BUILD_AND_TEST_CLI_ARGS: ${{ matrix.BUILD_AND_TEST_CLI_ARGS }} CMAKE_BUILD_TYPE: ${{ matrix.CMAKE_BUILD_TYPE }} + DOCKER_CERTS_DIR: ${{ matrix.DOCKER_CERTS_DIR }} + DOCKER_CERTS_UPDATE_COMMAND: ${{ matrix.DOCKER_CERTS_UPDATE_COMMAND }} DOCKER_IMAGE_TAG: ${{ needs.is_not_draft_pull_request.outputs.DOCKER_IMAGE_TAG }} DOCKER_REPOSITORY: ${{ matrix.DOCKER_REPOSITORY }} DOCKER_RUN_ARGS: ${{ matrix.DOCKER_RUN_ARGS }} @@ -302,6 +318,7 @@ jobs: ENABLE_TRILINOS: ${{ matrix.ENABLE_TRILINOS }} GCP_BUCKET: ${{ matrix.GCP_BUCKET }} HOST_CONFIG: ${{ matrix.HOST_CONFIG }} + NPROC: ${{ matrix.NPROC }} RUNS_ON: ${{ matrix.RUNS_ON }} REQUIRED_LABEL: "ci: ready to be merged" secrets: inherit diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index 4a73c0adbe4..56a0c6b06f3 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -8,14 +8,12 @@ printenv SCRIPT_NAME=$0 echo "Running CLI ${SCRIPT_NAME} $@" -echo "running nproc" -nproc # docs.docker.com/config/containers/resource_constraints # Inside the container, tools like free report the host's available swap, not what's available inside the container. # Don't rely on the output of free or similar tools to determine whether swap is present. -echo "running free -m" -free -m +echo "running free -g" +free -g # The or_die function run the passed command line and # exits the program in case of non zero error code @@ -50,6 +48,8 @@ Usage: $0 Do not install the xsd schema. --no-run-unit-tests Do not run the unit tests (but they will be built). + --nproc N + Number of cores to use for the build. --repository /path/to/repository Internal mountpoint where the geos repository will be available. --run-integrated-tests @@ -80,6 +80,7 @@ UPLOAD_TEST_BASELINES=false TEST_CODE_STYLE=false TEST_DOCUMENTATION=false CODE_COVERAGE=false +NPROC=$(nproc) eval set -- ${args} while : @@ -105,6 +106,7 @@ do --install-dir-basename) GEOSX_DIR=${GEOSX_TPL_DIR}/../$2; shift 2;; --no-install-schema) GEOSX_INSTALL_SCHEMA=false; shift;; --no-run-unit-tests) RUN_UNIT_TESTS=false; shift;; + --nproc) NPROC=$2; shift 2;; --repository) GEOS_SRC_DIR=$2; shift 2;; --run-integrated-tests) RUN_INTEGRATED_TESTS=true; shift;; --upload-test-baselines) UPLOAD_TEST_BASELINES=true; shift;; @@ -147,9 +149,9 @@ EOT # The path to the `sccache` executable is available through the SCCACHE environment variable. SCCACHE_CMAKE_ARGS="-DCMAKE_CXX_COMPILER_LAUNCHER=${SCCACHE} -DCMAKE_CUDA_COMPILER_LAUNCHER=${SCCACHE}" - if [ ${HOSTNAME} == 'streak.llnl.gov' ] || [ ${HOSTNAME} == 'streak2.llnl.gov' ]; then - DOCKER_CERTS_DIR=/usr/local/share/ca-certificates - for file in "${GEOS_SRC_DIR}"/certificates/*.crt.pem; do + if [ -n "${DOCKER_CERTS_DIR}" ] && [ -n "${DOCKER_CERTS_UPDATE_COMMAND}" ]; then + echo "updating certificates." + for file in "${DOCKER_CERTS_DIR}"/llnl/*.crt.pem; do if [ -f "$file" ]; then filename=$(basename -- "$file") filename_no_ext="${filename%.*}" @@ -158,19 +160,19 @@ EOT echo "Copied $filename to $new_filename" fi done - update-ca-certificates - # gcloud config set core/custom_ca_certs_file cert.pem' - - NPROC=8 - else - NPROC=$(nproc) + ${DOCKER_CERTS_UPDATE_COMMAND} fi - echo "Using ${NPROC} cores." echo "sccache initial state" ${SCCACHE} --show-stats fi +if [ -z "${NPROC}" ]; then + NPROC=$(nproc) + echo "NPROC unset, setting to ${NPROC}..." +fi +echo "Using ${NPROC} cores." + if [[ "${RUN_INTEGRATED_TESTS}" = true ]]; then echo "Running the integrated tests has been requested." # We install the python environment required by ATS to run the integrated tests. From fdf6c986c43533c80ed7f02a6092c7f026175539 Mon Sep 17 00:00:00 2001 From: Tom Byer <149726499+tjb-ltk@users.noreply.github.com> Date: Tue, 7 May 2024 21:32:11 -0700 Subject: [PATCH 057/286] Feature/byer3/mass inj const (#2917) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 + .../Class09Pb3/class09_pb3_benchmark_mc.xml | 111 ++++++++++++++++++ .../Class09Pb3/class09_pb3_benchmark_mct.xml | 111 ++++++++++++++++++ ...lass09_pb3_drainageOnly_iterative_base.xml | 34 ++++++ .../wells/CompositionalMultiphaseWell.cpp | 9 +- .../wells/CompositionalMultiphaseWell.hpp | 1 + .../CompositionalMultiphaseWellKernels.cpp | 51 +++++++- .../CompositionalMultiphaseWellKernels.hpp | 32 ++++- .../fluidFlow/wells/WellControls.cpp | 62 +++++++++- .../fluidFlow/wells/WellControls.hpp | 31 +++++ 11 files changed, 435 insertions(+), 14 deletions(-) create mode 100644 inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mc.xml create mode 100644 inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mct.xml diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 9bc6d624664..58a1a93492a 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,7 @@ --- baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3044-4865-1a337ae + baseline: integratedTests/baseline_integratedTests-pr2917-4878-4907334 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index d1a701842b9..201d5af17ee 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -7,6 +7,11 @@ 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 #2917 (2024-05-07) +====================== + +New fields for wellsControls: wellControls1_ConstantMassRate_table, targetMassRate, massDensity, ... + PR #3044 (2024-05-02) ====================== diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mc.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mc.xml new file mode 100644 index 00000000000..b4edabaad3d --- /dev/null +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mc.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mct.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mct.xml new file mode 100644 index 00000000000..14378119874 --- /dev/null +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark_mct.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_iterative_base.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_iterative_base.xml index 54cffee9212..92890413f4a 100644 --- a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_iterative_base.xml +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_iterative_base.xml @@ -54,6 +54,34 @@ targetTotalRateTableName="totalRateTable" injectionTemperature="353.15" injectionStream="{ 1.0, 0.0 }"/> + + @@ -220,6 +248,12 @@ values="{ 8.02849025 , 0, 0}" interpolation="lower"/> + diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 6620d93c277..2c335449b94 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -240,6 +240,7 @@ void CompositionalMultiphaseWell::registerDataOnMesh( Group & meshBodies ) reference().resizeDimension< 0 >( m_numPhases ); wellControls.registerWrapper< real64 >( viewKeyStruct::currentTotalVolRateString() ); + wellControls.registerWrapper< real64 >( viewKeyStruct::massDensityString() ); wellControls.registerWrapper< real64 >( viewKeyStruct::dCurrentTotalVolRate_dPresString() ). setRestartFlags( RestartFlags::NO_WRITE ); wellControls.registerWrapper< array1d< real64 > >( viewKeyStruct::dCurrentTotalVolRate_dCompDensString() ). @@ -687,7 +688,8 @@ void CompositionalMultiphaseWell::updateVolRatesForConstraint( WellElementSubReg wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dCompDensString() ); real64 & dCurrentTotalVolRate_dRate = wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dRateString() ); - + real64 & massDensity = + wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::massDensityString() ); constitutive::constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) { typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); @@ -721,7 +723,8 @@ void CompositionalMultiphaseWell::updateVolRatesForConstraint( WellElementSubReg &iwelemRef, &logLevel, &wellControlsName, - &massUnit] ( localIndex const ) + &massUnit, + &massDensity] ( localIndex const ) { GEOS_UNUSED_VAR( massUnit ); using Deriv = multifluid::DerivativeOffset; @@ -757,7 +760,7 @@ void CompositionalMultiphaseWell::updateVolRatesForConstraint( WellElementSubReg real64 const currentTotalRate = connRate[iwelemRef]; // Step 2.1: compute the inverse of the total density and derivatives - + massDensity =totalDens[iwelemRef][0]; // need to verify this is surface dens real64 const totalDensInv = 1.0 / totalDens[iwelemRef][0]; real64 const dTotalDensInv_dPres = -dTotalDens[iwelemRef][0][Deriv::dP] * totalDensInv * totalDensInv; stackArray1d< real64, maxNumComp > dTotalDensInv_dCompDens( numComp ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp index e0b95e4799b..6d165cb56c7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -293,6 +293,7 @@ class CompositionalMultiphaseWell : public WellSolverBase // control data (not registered on the mesh) + static constexpr char const * massDensityString() { return "massDensity";} static constexpr char const * currentBHPString() { return "currentBHP"; } static constexpr char const * dCurrentBHP_dPresString() { return "dCurrentBHP_dPres"; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp index 74cafe77cc4..d16557c96c6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp @@ -40,6 +40,7 @@ ControlEquationHelper:: real64 const & targetBHP, real64 const & targetPhaseRate, real64 const & targetTotalRate, + real64 const & targetMassRate, real64 const & currentBHP, arrayView1d< real64 const > const & currentPhaseVolRate, real64 const & currentTotalVolRate, @@ -102,9 +103,18 @@ ControlEquationHelper:: } else { - newControl = ( currentControl == WellControls::Control::BHP ) - ? WellControls::Control::TOTALVOLRATE - : WellControls::Control::BHP; + if( isZero( targetMassRate ) ) + { + newControl = ( currentControl == WellControls::Control::BHP ) + ? WellControls::Control::TOTALVOLRATE + : WellControls::Control::BHP; + } + else + { + newControl = ( currentControl == WellControls::Control::BHP ) + ? WellControls::Control::MASSRATE + : WellControls::Control::BHP; + } } } } @@ -120,6 +130,7 @@ ControlEquationHelper:: real64 const & targetBHP, real64 const & targetPhaseRate, real64 const & targetTotalRate, + real64 const & targetMassRate, real64 const & currentBHP, real64 const & dCurrentBHP_dPres, arrayView1d< real64 const > const & dCurrentBHP_dCompDens, @@ -131,6 +142,7 @@ ControlEquationHelper:: real64 const & dCurrentTotalVolRate_dPres, arrayView1d< real64 const > const & dCurrentTotalVolRate_dCompDens, real64 const & dCurrentTotalVolRate_dRate, + real64 const & massDensity, globalIndex const dofNumber, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) @@ -189,6 +201,17 @@ ControlEquationHelper:: dControlEqn_dComp[ic] = dCurrentTotalVolRate_dCompDens[ic]; } } + // Total mass rate control + else if( currentControl == WellControls::Control::MASSRATE ) + { + controlEqn = massDensity*currentTotalVolRate - targetMassRate; + dControlEqn_dPres = massDensity*dCurrentTotalVolRate_dPres; + dControlEqn_dRate = massDensity*dCurrentTotalVolRate_dRate; + for( integer ic = 0; ic < NC; ++ic ) + { + dControlEqn_dComp[ic] = massDensity*dCurrentTotalVolRate_dCompDens[ic]; + } + } else { GEOS_ERROR( "This constraint is not supported in CompositionalMultiphaseWell" ); @@ -610,6 +633,7 @@ PressureRelationKernel:: real64 const targetBHP = wellControls.getTargetBHP( timeAtEndOfStep ); real64 const targetTotalRate = wellControls.getTargetTotalRate( timeAtEndOfStep ); real64 const targetPhaseRate = wellControls.getTargetPhaseRate( timeAtEndOfStep ); + real64 const targetMassRate = wellControls.getTargetMassRate( timeAtEndOfStep ); // dynamic well control data real64 const & currentBHP = @@ -636,6 +660,8 @@ PressureRelationKernel:: wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dCompDensString() ); real64 const & dCurrentTotalVolRate_dRate = wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dRateString() ); + real64 const & massDensity = + wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::massDensityString() ); RAJA::ReduceMax< parallelDeviceReduce, localIndex > switchControl( 0 ); @@ -653,6 +679,7 @@ PressureRelationKernel:: targetBHP, targetPhaseRate, targetTotalRate, + targetMassRate, currentBHP, currentPhaseVolRate, currentTotalVolRate, @@ -668,6 +695,7 @@ PressureRelationKernel:: targetBHP, targetPhaseRate, targetTotalRate, + targetMassRate, currentBHP, dCurrentBHP_dPres, dCurrentBHP_dCompDens, @@ -679,6 +707,7 @@ PressureRelationKernel:: dCurrentTotalVolRate_dPres, dCurrentTotalVolRate_dCompDens, dCurrentTotalVolRate_dRate, + massDensity, wellElemDofNumber[iwelemControl], localMatrix, localRhs ); @@ -1746,6 +1775,7 @@ RateInitializationKernel:: bool const isProducer = wellControls.isProducer(); real64 const targetTotalRate = wellControls.getTargetTotalRate( currentTime ); real64 const targetPhaseRate = wellControls.getTargetPhaseRate( currentTime ); + real64 const targetMassRate = wellControls.getTargetMassRate( currentTime ); // Estimate the connection rates forAll< parallelDevicePolicy<> >( subRegionSize, [=] GEOS_HOST_DEVICE ( localIndex const iwelem ) @@ -1760,9 +1790,22 @@ RateInitializationKernel:: } else { - connRate[iwelem] = LvArray::math::min( 0.1 * targetTotalRate * totalDens[iwelem][0], 1e3 ); + if( isZero( targetMassRate ) ) + { + connRate[iwelem] = LvArray::math::min( 0.1 * targetTotalRate * totalDens[iwelem][0], 1e3 ); + } + else + { + connRate[iwelem] = targetMassRate; + } + } } + else if( control == WellControls::Control::MASSRATE ) + { + connRate[iwelem] = targetMassRate; + connRate[iwelem] = targetMassRate* totalDens[iwelem][0]; + } else { if( isProducer ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp index ea06e3ae2ad..b35d807124d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp @@ -92,6 +92,7 @@ struct ControlEquationHelper real64 const & targetBHP, real64 const & targetPhaseRate, real64 const & targetTotalRate, + real64 const & targetMassRate, real64 const & currentBHP, arrayView1d< real64 const > const & currentPhaseVolRate, real64 const & currentTotalVolRate, @@ -107,6 +108,7 @@ struct ControlEquationHelper real64 const & targetBHP, real64 const & targetPhaseRate, real64 const & targetTotalRate, + real64 const & targetMassRate, real64 const & currentBHP, real64 const & dCurrentBHP_dPres, arrayView1d< real64 const > const & dCurrentBHP_dCompDens, @@ -118,6 +120,7 @@ struct ControlEquationHelper real64 const & dCurrentTotalVolRate_dPres, arrayView1d< real64 const > const & dCurrentTotalVolRate_dCompDens, real64 const & dCurrentTotalVolRate_dRate, + real64 const & massDensity, globalIndex const dofNumber, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ); @@ -692,6 +695,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > m_targetBHP( wellControls.getTargetBHP( timeAtEndOfStep ) ), m_targetTotalRate( wellControls.getTargetTotalRate( timeAtEndOfStep ) ), m_targetPhaseRate( wellControls.getTargetPhaseRate( timeAtEndOfStep ) ), + m_targetMassRate( wellControls.getTargetMassRate( timeAtEndOfStep ) ), m_volume( subRegion.getElementVolume() ), m_phaseDens_n( fluid.phaseDensity_n() ), m_totalDens_n( fluid.totalDensity_n() ) @@ -731,6 +735,11 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > // the residual entry is in volume / time units normalizer = LvArray::math::max( LvArray::math::abs( m_targetPhaseRate ), m_minNormalizer ); } + else if( m_currentControl == WellControls::Control::MASSRATE ) + { + // the residual entry is in volume / time units + normalizer = LvArray::math::max( LvArray::math::abs( m_targetMassRate ), m_minNormalizer ); + } } // for the pressure difference equation, always normalize by the BHP else @@ -748,8 +757,16 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > } else // Type::INJECTOR, only TOTALVOLRATE is supported for now { - // the residual is in mass units - normalizer = m_dt * LvArray::math::abs( m_targetTotalRate ) * m_totalDens_n[iwelem][0]; + if( m_currentControl == WellControls::Control::MASSRATE ) + { + normalizer = m_dt * LvArray::math::abs( m_targetMassRate ); + } + else + { + // the residual is in mass units + normalizer = m_dt * LvArray::math::abs( m_targetTotalRate ) * m_totalDens_n[iwelem][0]; + } + } // to make sure that everything still works well if the rate is zero, we add this check @@ -765,7 +782,15 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > } else // Type::INJECTOR, only TOTALVOLRATE is supported for now { - normalizer = m_dt * LvArray::math::abs( m_targetTotalRate ); + if( m_currentControl == WellControls::Control::MASSRATE ) + { + normalizer = m_dt * LvArray::math::abs( m_targetMassRate/ m_totalDens_n[iwelem][0] ); + } + else + { + normalizer = m_dt * LvArray::math::abs( m_targetTotalRate ); + } + } // to make sure that everything still works well if the rate is zero, we add this check @@ -819,6 +844,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > real64 const m_targetBHP; real64 const m_targetTotalRate; real64 const m_targetPhaseRate; + real64 const m_targetMassRate; /// View on the volume arrayView1d< real64 const > const m_volume; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp index 147f7027661..4d97682591b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp @@ -36,6 +36,7 @@ WellControls::WellControls( string const & name, Group * const parent ) m_targetBHP( 0.0 ), m_targetTotalRate( 0.0 ), m_targetPhaseRate( 0.0 ), + m_targetMassRate( 0.0 ), m_useSurfaceConditions( 0 ), m_surfacePres( 0.0 ), m_surfaceTemp( 0.0 ), @@ -79,6 +80,11 @@ WellControls::WellControls( string const & name, Group * const parent ) setInputFlag( InputFlags::OPTIONAL ). setDescription( "Target phase volumetric rate (if useSurfaceConditions: [surface m^3/s]; else [reservoir m^3/s])" ); + registerWrapper( viewKeyStruct::targetMassRateString(), &m_targetMassRate ). + setDefaultValue( 0.0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Target Mass Rate rate ( [kg^3/s])" ); + registerWrapper( viewKeyStruct::targetPhaseNameString(), &m_targetPhaseName ). setRTTypeName( rtTypes::CustomTypes::groupNameRef ). setDefaultValue( "" ). @@ -146,6 +152,11 @@ WellControls::WellControls( string const & name, Group * const parent ) setInputFlag( InputFlags::OPTIONAL ). setDescription( "Name of the phase rate table when the rate is a time dependent function" ); + registerWrapper( viewKeyStruct::targetMassRateTableNameString(), &m_targetMassRateTableName ). + setRTTypeName( rtTypes::CustomTypes::groupNameRef ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Name of the mass rate table when the rate is a time dependent function" ); + registerWrapper( viewKeyStruct::statusTableNameString(), &m_statusTableName ). setRTTypeName( rtTypes::CustomTypes::groupNameRef ). setInputFlag( InputFlags::OPTIONAL ). @@ -175,6 +186,12 @@ void WellControls::switchToPhaseRateControl( real64 const & val ) m_targetPhaseRate = val; } +void WellControls::switchToMassRateControl( real64 const & val ) +{ + m_currentControl = Control::MASSRATE; + m_targetMassRate = val; +} + namespace { @@ -228,6 +245,10 @@ void WellControls::postProcessInput() getWrapperDataContext( viewKeyStruct::targetPhaseRateString() ) << ": Target oil rate is negative", InputError ); + GEOS_THROW_IF( m_targetMassRate < 0, + getWrapperDataContext( viewKeyStruct::targetMassRateString() ) << ": Target mass rate is negative", + InputError ); + GEOS_THROW_IF( (m_injectionStream.empty() && m_injectionTemperature >= 0) || (!m_injectionStream.empty() && m_injectionTemperature < 0), "WellControls " << getDataContext() << ": Both " @@ -267,14 +288,18 @@ void WellControls::postProcessInput() // 4) check that at least one rate constraint has been defined GEOS_THROW_IF( ((m_targetPhaseRate <= 0.0 && m_targetPhaseRateTableName.empty()) && + (m_targetMassRate <= 0.0 && m_targetMassRateTableName.empty()) && (m_targetTotalRate <= 0.0 && m_targetTotalRateTableName.empty())), - "WellControls " << getDataContext() << ": You need to specify a phase rate constraint or a total rate constraint. \n" << + "WellControls " << getDataContext() << ": You need to specify a phase, mass, or total rate constraint. \n" << "The phase rate constraint can be specified using " << "either " << viewKeyStruct::targetPhaseRateString() << " or " << viewKeyStruct::targetPhaseRateTableNameString() << ".\n" << "The total rate constraint can be specified using " << "either " << viewKeyStruct::targetTotalRateString() << - " or " << viewKeyStruct::targetTotalRateTableNameString(), + " or " << viewKeyStruct::targetTotalRateTableNameString()<< + "The mass rate constraint can be specified using " << + "either " << viewKeyStruct::targetMassRateString() << + " or " << viewKeyStruct::targetMassRateTableNameString(), InputError ); // 5) check whether redundant information has been provided @@ -293,6 +318,15 @@ void WellControls::postProcessInput() " The keywords " << viewKeyStruct::targetBHPString() << " and " << viewKeyStruct::targetBHPTableNameString() << " cannot be specified together", InputError ); + GEOS_THROW_IF( ((m_targetMassRate > 0.0 && !m_targetMassRateTableName.empty())), + "WellControls " << getDataContext() << ": You have provided redundant information for well mass rate." << + " The keywords " << viewKeyStruct::targetMassRateString() << " and " << viewKeyStruct::targetMassRateTableNameString() << " cannot be specified together", + InputError ); + + GEOS_THROW_IF( ((m_targetMassRate > 0.0 && m_useSurfaceConditions==0)), + "WellControls " << getDataContext() << ": Option only valid if useSurfaceConditions set to 1", + InputError ); + // 6.1) If the well is under BHP control then the BHP must be specified. // Otherwise the BHP will be set to a default value. if( m_currentControl == Control::BHP ) @@ -317,6 +351,12 @@ void WellControls::postProcessInput() << EnumStrings< Control >::toString( Control::TOTALVOLRATE ), InputError ); + // An injector must be controlled by TotalVolRate + GEOS_THROW_IF( (isProducer() && (m_inputControl == Control::MASSRATE)), + "WellControls " << getDataContext() << ": You have to control an injector with " + << EnumStrings< Control >::toString( Control::MASSRATE ), + InputError ); + // 7) Make sure that the flag disabling crossflow is not used for producers GEOS_THROW_IF( isProducer() && m_isCrossflowEnabled == 0, getWrapperDataContext( viewKeyStruct::enableCrossflowString() ) << @@ -380,7 +420,22 @@ void WellControls::postProcessInput() << m_targetPhaseRateTable->getName() << " should be TableFunction::InterpolationType::Lower", InputError ); } + // Create time-dependent mass rate table + if( m_targetMassRateTableName.empty() ) + { + m_targetMassRateTableName = getName()+"_ConstantMassRate_table"; + m_targetMassRateTable = createWellTable( m_targetMassRateTableName, m_targetMassRate ); + } + else + { + FunctionManager & functionManager = FunctionManager::getInstance(); + m_targetMassRateTable = &(functionManager.getGroup< TableFunction const >( m_targetMassRateTableName )); + GEOS_THROW_IF( m_targetMassRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent mass rate table " + << m_targetMassRateTable->getName() << " should be TableFunction::InterpolationType::Lower", + InputError ); + } // 12) Create the time-dependent well status table if( m_statusTableName.empty()) { @@ -408,7 +463,8 @@ void WellControls::postProcessInput() bool WellControls::isWellOpen( real64 const & currentTime ) const { bool isOpen = true; - if( isZero( getTargetTotalRate( currentTime ) ) && isZero( getTargetPhaseRate( currentTime ) ) ) + if( isZero( getTargetTotalRate( currentTime ) ) && isZero( getTargetPhaseRate( currentTime ) ) + && isZero( getTargetMassRate( currentTime ) )) { isOpen = false; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp index 78f1524e518..b5a3af4205c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp @@ -61,6 +61,7 @@ class WellControls : public dataRepository::Group BHP, /**< The well operates at a specified bottom hole pressure (BHP) */ PHASEVOLRATE, /**< The well operates at a specified phase volumetric flow rate */ TOTALVOLRATE, /**< The well operates at a specified total volumetric flow rate */ + MASSRATE, /**evaluate( ¤tTime ); + } + + /** * @brief Const accessor for the composition of the injection stream * @return a global component fraction vector @@ -276,6 +293,8 @@ class WellControls : public dataRepository::Group static constexpr char const * targetPhaseRateString() { return "targetPhaseRate"; } /// String key for the well target phase name static constexpr char const * targetPhaseNameString() { return "targetPhaseName"; } + /// String key for the well target phase name + static constexpr char const * targetMassRateString() { return "targetMassRate"; } /// String key for the well injection stream static constexpr char const * injectionStreamString() { return "injectionStream"; } /// String key for the well injection temperature @@ -290,6 +309,8 @@ class WellControls : public dataRepository::Group static constexpr char const * targetTotalRateTableNameString() { return "targetTotalRateTableName"; } /// string key for phase rate table name static constexpr char const * targetPhaseRateTableNameString() { return "targetPhaseRateTableName"; } + /// string key for mass rate table name + static constexpr char const * targetMassRateTableNameString() { return "targetMassRateTableName"; } /// string key for BHP table name static constexpr char const * targetBHPTableNameString() { return "targetBHPTableName"; } /// string key for status table name @@ -336,6 +357,9 @@ class WellControls : public dataRepository::Group /// Name of the targeted phase string m_targetPhaseName; + /// Target MassRate + real64 m_targetMassRate; + /// Vector with global component fractions at the injector array1d< real64 > m_injectionStream; @@ -357,6 +381,9 @@ class WellControls : public dataRepository::Group /// Phase rate table name string m_targetPhaseRateTableName; + /// Mass rate table name + string m_targetMassRateTableName; + /// BHP table name string m_targetBHPTableName; @@ -378,6 +405,9 @@ class WellControls : public dataRepository::Group /// Phase rate table TableFunction const * m_targetPhaseRateTable; + /// Mass rate table + TableFunction const * m_targetMassRateTable; + /// BHP table TableFunction const * m_targetBHPTable; @@ -393,6 +423,7 @@ ENUM_STRINGS( WellControls::Control, "BHP", "phaseVolRate", "totalVolRate", + "massRate", "uninitialized" ); From fec6ac243c536b00e82444168eb0cbfe2459c121 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 8 May 2024 08:42:59 -0700 Subject: [PATCH 058/286] fix bug in ci script (#3115) fix incorrect --nproc option in ci script, and incorrect specification of container name. --- .github/workflows/build_and_test.yml | 11 ++++++++++- scripts/ci_build_and_test_in_container.sh | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 5b3530e11f8..4b57484ceac 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -190,7 +190,8 @@ jobs: script_args+=(--cmake-build-type ${{ inputs.CMAKE_BUILD_TYPE }}) script_args+=(${{ inputs.BUILD_AND_TEST_CLI_ARGS }}) - + + DOCKER_REPOSITORY=${{ inputs.DOCKER_REPOSITORY }} SPLIT_DOCKER_REPOSITORY=(${DOCKER_REPOSITORY//// }) CONTAINER_NAME=geosx_build_${SPLIT_DOCKER_REPOSITORY[1]}_${GITHUB_SHA:0:7} echo "CONTAINER_NAME: ${CONTAINER_NAME}" @@ -204,6 +205,14 @@ jobs: script_args+=(--code-coverage) fi + + echo running "docker run \ + ${docker_args[@]} \ + -h=`hostname` \ + ${{ inputs.DOCKER_REPOSITORY }}:${{ inputs.DOCKER_IMAGE_TAG }} \ + ${GITHUB_WORKSPACE_MOUNT_POINT}/scripts/ci_build_and_test_in_container.sh \ + ${script_args[@]}" + # In case of integrated tests run, we still want to send the results to the cloud for inspection. # While for standard build (if even possible), pushing a failed build would be pointless. # GHA set `-e` to bash scripts by default to fail asap, diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index 56a0c6b06f3..867475b8c84 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -68,7 +68,7 @@ exit 1 or_die cd $(dirname $0)/.. # Parsing using getopt -args=$(or_die getopt -a -o h --long build-exe-only,cmake-build-type:,code-coverage,data-basename:,exchange-dir:,host-config:,install-dir-basename:,no-install-schema,no-run-unit-tests,repository:,run-integrated-tests,sccache-credentials:,test-code-style,test-documentation,help -- "$@") +args=$(or_die getopt -a -o h --long build-exe-only,cmake-build-type:,code-coverage,data-basename:,exchange-dir:,host-config:,install-dir-basename:,no-install-schema,no-run-unit-tests,nproc:,repository:,run-integrated-tests,sccache-credentials:,test-code-style,test-documentation,help -- "$@") # Variables with default values BUILD_EXE_ONLY=false @@ -80,7 +80,7 @@ UPLOAD_TEST_BASELINES=false TEST_CODE_STYLE=false TEST_DOCUMENTATION=false CODE_COVERAGE=false -NPROC=$(nproc) +NPROC="$(nproc)" eval set -- ${args} while : From b8cd27111e1d5490eeb18bd0345773ce9e6f60e2 Mon Sep 17 00:00:00 2001 From: Tom Byer <149726499+tjb-ltk@users.noreply.github.com> Date: Wed, 8 May 2024 10:02:36 -0700 Subject: [PATCH 059/286] Bugfix/byer3/internal energy der 3053 (#3105) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 +++++ .../constitutive/fluid/multifluid/MultiFluidBase.hpp | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 58a1a93492a..23e853a1ca5 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,7 @@ --- baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr2917-4878-4907334 + baseline: integratedTests/baseline_integratedTests-pr3105-4885-a1a85c1 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 201d5af17ee..5dc380ae47a 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3105 (2024-05-08) +====================== + +Added missing derivative for temperature, hence small numerical diffs in thermal tests results and numeracal behavior + PR #2917 (2024-05-07) ====================== diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp index a221fa6ed0b..e31d513cd3b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp @@ -1047,6 +1047,7 @@ MultiFluidBase::KernelWrapper:: { integer const numPhase = numPhases(); integer const numComp = numComponents(); + integer const numDOF = numComp + 2; for( integer ip = 0; ip < numPhase; ++ip ) { @@ -1059,7 +1060,7 @@ MultiFluidBase::KernelWrapper:: real64 const densInv = 1.0 / phaseMassDens.value[ip]; real64 const densInvSquared = densInv * densInv; phaseInternalEnergy.value[ip] = phaseEnthalpy.value[ip] - pressure * densInv; - for( integer idof = 0; idof < numComp; ++idof ) + for( integer idof = 0; idof < numDOF; ++idof ) { phaseInternalEnergy.derivs[ip][idof] = phaseEnthalpy.derivs[ip][idof] + pressure * phaseMassDens.derivs[ip][idof] * densInvSquared; } From b0b67f6fb58541af7e643420e920ee9f7173ec08 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 8 May 2024 12:03:07 -0500 Subject: [PATCH 060/286] Clean up catalogName a bit (#3110) --- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 2 +- .../permeability/PermeabilityBase.cpp | 1 - .../permeability/PermeabilityBase.hpp | 4 -- .../solid/porosity/PorosityBase.hpp | 4 -- src/coreComponents/events/EventBase.hpp | 6 -- src/coreComponents/events/tasks/TaskBase.hpp | 6 -- .../fileIO/Outputs/OutputBase.hpp | 6 -- src/coreComponents/functions/FunctionBase.hpp | 6 -- .../mesh/generators/MeshGeneratorBase.hpp | 6 -- .../mesh/generators/WellGeneratorBase.hpp | 6 -- .../physicsSolvers/SolverBase.hpp | 2 - .../fluidFlow/CompositionalMultiphaseBase.cpp | 6 +- .../fluidFlow/CompositionalMultiphaseBase.hpp | 4 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 4 +- .../fluidFlow/FlowSolverBase.cpp | 2 +- .../ReactiveCompositionalMultiphaseOBL.cpp | 12 ++-- .../fluidFlow/SinglePhaseBase.cpp | 14 ++--- .../fluidFlow/SinglePhaseFVM.cpp | 12 ++-- .../fluidFlow/SinglePhaseFVM.hpp | 26 ++++----- .../fluidFlow/SinglePhaseHybridFVM.cpp | 4 +- ...mpositionalMultiphaseReservoirAndWells.cpp | 57 ++++--------------- ...mpositionalMultiphaseReservoirAndWells.hpp | 20 +++++-- .../multiphysics/CoupledSolver.hpp | 2 +- .../multiphysics/HydrofractureSolver.cpp | 35 +----------- .../multiphysics/HydrofractureSolver.hpp | 14 ++++- .../multiphysics/MultiphasePoromechanics.cpp | 33 +---------- .../multiphysics/MultiphasePoromechanics.hpp | 15 ++++- .../PoromechanicsInitialization.cpp | 9 --- .../PoromechanicsInitialization.hpp | 5 +- .../multiphysics/PoromechanicsSolver.hpp | 2 +- .../multiphysics/SinglePhasePoromechanics.cpp | 34 +---------- .../multiphysics/SinglePhasePoromechanics.hpp | 16 +++++- .../SinglePhaseReservoirAndWells.cpp | 55 ++++-------------- .../SinglePhaseReservoirAndWells.hpp | 20 +++++-- .../schema/docs/Constitutive.rst | 1 - .../schema/docs/Constitutive_other.rst | 1 - .../schema/docs/PermeabilityBase.rst | 9 --- .../schema/docs/PermeabilityBase_other.rst | 10 ---- src/coreComponents/schema/schema.xsd | 9 --- src/coreComponents/schema/schema.xsd.other | 7 --- src/docs/sphinx/CompleteXMLSchema.rst | 14 ----- 41 files changed, 148 insertions(+), 353 deletions(-) delete mode 100644 src/coreComponents/schema/docs/PermeabilityBase.rst delete mode 100644 src/coreComponents/schema/docs/PermeabilityBase_other.rst diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 01e210d20a1..a61f15bbe52 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -194,7 +194,7 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const template< typename PHASE1, typename PHASE2, typename FLASH > void CO2BrineFluid< PHASE1, PHASE2, FLASH >::initializePreSubGroups() { - GEOS_THROW_IF( this->catalogName() == CO2BrineEzrokhiThermalFluid::catalogName(), + GEOS_THROW_IF( this->getCatalogName() == CO2BrineEzrokhiThermalFluid::catalogName(), GEOS_FMT( "The `{}` model is disabled for now. Please use the other thermal CO2-brine model instead: `{}`", CO2BrineEzrokhiThermalFluid::catalogName(), CO2BrinePhillipsThermalFluid::catalogName() ), diff --git a/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp b/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp index b023e926115..8bbdcbdcffd 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp @@ -68,6 +68,5 @@ void PermeabilityBase::allocateConstitutiveData( dataRepository::Group & parent, ConstitutiveBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); } -REGISTER_CATALOG_ENTRY( ConstitutiveBase, PermeabilityBase, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp index ee7c661d600..966b0bf035a 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp @@ -113,10 +113,6 @@ class PermeabilityBase : public ConstitutiveBase virtual void allocateConstitutiveData( dataRepository::Group & parent, localIndex const numConstitutivePointsPerParentIndex ) override; - static string catalogName() { return "PermeabilityBase"; } - - virtual string getCatalogName() const override { return catalogName(); } - /** * @brief Const/non-mutable accessor for permeability. * @return Accessor diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp index 595b8354fe1..395f209e1f7 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp @@ -137,10 +137,6 @@ class PorosityBase : public ConstitutiveBase virtual void allocateConstitutiveData( dataRepository::Group & parent, localIndex const numConstitutivePointsPerParentIndex ) override; - static string catalogName() { return "PorosityBase"; } - - virtual string getCatalogName() const override { return catalogName(); } - struct viewKeyStruct : public ConstitutiveBase::viewKeyStruct { static constexpr char const * defaultReferencePorosityString() { return "defaultReferencePorosity"; } diff --git a/src/coreComponents/events/EventBase.hpp b/src/coreComponents/events/EventBase.hpp index 99aa5b3cfbb..89b1d8f5c22 100644 --- a/src/coreComponents/events/EventBase.hpp +++ b/src/coreComponents/events/EventBase.hpp @@ -44,12 +44,6 @@ class EventBase : public ExecutableGroup /// Destructor virtual ~EventBase() override; - /** - * @brief Catalog name interface. - * @return This type's catalog name. - **/ - static string catalogName() { return "EventBase"; } - /** * @brief If the event forecast is equal to 1, then signal the targets to prepare for execution * during the next cycle. diff --git a/src/coreComponents/events/tasks/TaskBase.hpp b/src/coreComponents/events/tasks/TaskBase.hpp index 94293fa2896..cfe210da0ad 100644 --- a/src/coreComponents/events/tasks/TaskBase.hpp +++ b/src/coreComponents/events/tasks/TaskBase.hpp @@ -39,12 +39,6 @@ class TaskBase : public ExecutableGroup Group * const parent ); virtual ~TaskBase( ) override; - /** - * @brief Catalog name interface - * @return This type's catalog name - */ - static string catalogName() { return "TaskBase"; } - /// The catalog interface type for TaskBase using CatalogInterface = dataRepository::CatalogInterface< TaskBase, string const &, Group * const >; /** diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.hpp b/src/coreComponents/fileIO/Outputs/OutputBase.hpp index 4d41cd8b820..f6348e77df0 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.hpp @@ -39,12 +39,6 @@ class OutputBase : public ExecutableGroup /// Destructor virtual ~OutputBase() override; - /** - * @brief Catalog name interface. - * @return This type's catalog name. - **/ - static string catalogName() { return "OutputBase"; } - /** * @brief Setter for the output directory * @param outputDir The output directory diff --git a/src/coreComponents/functions/FunctionBase.hpp b/src/coreComponents/functions/FunctionBase.hpp index 5c2fb4b6eb1..da135084f3e 100644 --- a/src/coreComponents/functions/FunctionBase.hpp +++ b/src/coreComponents/functions/FunctionBase.hpp @@ -60,12 +60,6 @@ class FunctionBase : public dataRepository::Group */ virtual ~FunctionBase() override = default; - /** - * @brief Static Factory Catalog Functions - * @return the catalog name - */ - static string catalogName() { return "FunctionBase"; } - /** * @brief Function initialization */ diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp index 016e00e1389..48b97d15280 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp @@ -53,12 +53,6 @@ class MeshGeneratorBase : public dataRepository::Group explicit MeshGeneratorBase( string const & name, Group * const parent ); - /** - * @brief Return the name of the MeshGenerator in object catalog. - * @return string that contains the catalog name of the MeshGenerator - */ - static string catalogName() { return "MeshGeneratorBase"; } - /// This function is used to expand any catalogs in the data structure virtual void expandObjectCatalogs() override; diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp index a4c6cb5f577..07f56600536 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp @@ -46,12 +46,6 @@ class WellGeneratorBase : public WellGeneratorABC WellGeneratorBase( const string & name, Group * const parent ); - /** - * @brief Get the catalog name. - * @return the name of this type in the catalog - */ - static string catalogName() { return "WellGeneratorBase"; } - /// This function is used to expand any catalogs in the data structure virtual void expandObjectCatalogs() override; diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index 6e79f0cf05c..3a1610aad53 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -49,8 +49,6 @@ class SolverBase : public ExecutableGroup SolverBase & operator=( SolverBase const & ) = delete; SolverBase & operator=( SolverBase && ) = delete; - static string catalogName() { return "SolverBase"; } - /** * @return Get the final class Catalog name */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 1a322d78e90..3408df3b3b9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -1003,7 +1003,7 @@ void CompositionalMultiphaseBase::computeHydrostaticEquilibrium() getCatalogName() << " " << getDataContext() << ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << ") is not aligned with the z-axis. \n" - "This is incompatible with the " << EquilibriumInitialCondition::catalogName() << " " << bc.getDataContext() << + "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << "used in this simulation. To proceed, you can either: \n" << " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << " - Remove the hydrostatic equilibrium initial condition from the XML file", @@ -1510,8 +1510,8 @@ void CompositionalMultiphaseBase::applySourceFluxBC( real64 const time, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( targetSet.size() ); GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - getName(), time+dt, SourceFluxBoundaryCondition::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + getName(), time+dt, fs.getCatalogName(), fs.getName(), + setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); } if( targetSet.size() == 0 ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index 594b452f270..e387d0eabdb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -532,8 +532,8 @@ void CompositionalMultiphaseBase::applyFieldValue( real64 const & time_n, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( lset.size() ); GEOS_LOG_RANK_0( GEOS_FMT( logMessage, - getName(), time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, targetGroup.getName(), fs.getScale(), numTargetElems ) ); + getName(), time_n+dt, fs.getCatalogName(), fs.getName(), + setName, targetGroup.getName(), fs.getScale(), numTargetElems ) ); } // Specify the bc value of the field diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 2387a59291b..9794bed5cee 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -1054,8 +1054,8 @@ void CompositionalMultiphaseFVM::applyAquiferBC( real64 const time, { globalIndex const numTargetFaces = MpiWrapper::sum< globalIndex >( stencil.size() ); GEOS_LOG_RANK_0( GEOS_FMT( faceBcLogMessage, - getName(), time+dt, AquiferBoundaryCondition::catalogName(), - bc.getName(), setName, faceManager.getName(), bc.getScale(), numTargetFaces ) ); + getName(), time+dt, bc.getCatalogName(), bc.getName(), + setName, faceManager.getName(), bc.getScale(), numTargetFaces ) ); } if( stencil.size() == 0 ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 65e4508e4c7..ad81fc583f2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -736,7 +736,7 @@ void FlowSolverBase::saveAquiferConvergedState( real64 const & time, if( bc.getLogLevel() >= 1 ) { GEOS_LOG_RANK_0( GEOS_FMT( "{} {}: at time {} s, the boundary condition produces a volume of {} m3.", - AquiferBoundaryCondition::catalogName(), bc.getName(), + bc.getCatalogName(), bc.getName(), time + dt, dt * globalSumFluxes[aquiferIndex] ) ); } bc.saveConvergedState( dt * globalSumFluxes[aquiferIndex] ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index 2eb5c29eac4..85f0354c53a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -842,8 +842,8 @@ void ReactiveCompositionalMultiphaseOBL::applySourceFluxBC( real64 const time, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( targetSet.size() ); GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - getName(), time+dt, SourceFluxBoundaryCondition::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + getName(), time+dt, fs.getCatalogName(), fs.getName(), + setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); } if( targetSet.size() == 0 ) @@ -1081,8 +1081,8 @@ void ReactiveCompositionalMultiphaseOBL::applyDirichletBC( real64 const time, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( targetSet.size() ); GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - getName(), time+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + getName(), time+dt, fs.getCatalogName(), fs.getName(), + setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); } fs.applyFieldValue< FieldSpecificationEqual, parallelDevicePolicy<> >( targetSet, @@ -1121,8 +1121,8 @@ void ReactiveCompositionalMultiphaseOBL::applyDirichletBC( real64 const time, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( targetSet.size() ); GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - getName(), time+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + getName(), time+dt, fs.getCatalogName(), fs.getName(), + setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); } fs.applyFieldValue< FieldSpecificationEqual, parallelDevicePolicy<> >( targetSet, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 4c2538c4d67..c53644eb370 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -170,7 +170,7 @@ void SinglePhaseBase::validateConstitutiveModels( DomainPartition & domain ) con constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) { - string const fluidModelName = castedFluid.catalogName(); + string const fluidModelName = castedFluid.getCatalogName(); GEOS_THROW_IF( m_isThermal && (fluidModelName != "ThermalCompressibleSinglePhaseFluid"), GEOS_FMT( "SingleFluidBase {}: the thermal option is enabled in the solver, but the fluid model {} is not for thermal fluid", getDataContext(), fluid.getDataContext() ), @@ -512,7 +512,7 @@ void SinglePhaseBase::computeHydrostaticEquilibrium() getCatalogName() << " " << getDataContext() << ": the gravity vector specified in this simulation (" << gravVector[0] << " " << gravVector[1] << " " << gravVector[2] << ") is not aligned with the z-axis. \n" - "This is incompatible with the " << EquilibriumInitialCondition::catalogName() << " " << bc.getDataContext() << + "This is incompatible with the " << bc.getCatalogName() << " " << bc.getDataContext() << "used in this simulation. To proceed, you can either: \n" << " - Use a gravityVector aligned with the z-axis, such as (0.0,0.0,-9.81)\n" << " - Remove the hydrostatic equilibrium initial condition from the XML file", @@ -914,8 +914,8 @@ void applyAndSpecifyFieldValue( real64 const & time_n, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( lset.size() ); GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - solverName, time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + solverName, time_n+dt, fs.getCatalogName(), fs.getName(), + setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); } // Specify the bc value of the field @@ -1050,8 +1050,8 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, { globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( targetSet.size() ); GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - getName(), time_n+dt, SourceFluxBoundaryCondition::catalogName(), - fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + getName(), time_n+dt, fs.getCatalogName(), fs.getName(), + setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); if( isThermal ) { @@ -1061,7 +1061,7 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, "\n - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. " \ "\n For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced."; GEOS_LOG_RANK_0( GEOS_FMT( msg, - getName(), time_n+dt, SourceFluxBoundaryCondition::catalogName(), fs.getName() ) ); + getName(), time_n+dt, fs.getCatalogName(), fs.getName() ) ); } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index 565a4621fbe..9dee49fe87d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -669,8 +669,8 @@ void SinglePhaseFVM< BASE >::applyFaceDirichletBC( real64 const time_n, { globalIndex const numTargetFaces = MpiWrapper::sum< globalIndex >( stencil.size() ); GEOS_LOG_RANK_0( GEOS_FMT( faceBcLogMessage, - this->getName(), time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, targetGroup.getName(), numTargetFaces ) ); + this->getName(), time_n+dt, fs.getCatalogName(), fs.getName(), + setName, targetGroup.getName(), numTargetFaces ) ); } if( stencil.size() == 0 ) @@ -703,8 +703,8 @@ void SinglePhaseFVM< BASE >::applyFaceDirichletBC( real64 const time_n, { globalIndex const numTargetFaces = MpiWrapper::sum< globalIndex >( stencil.size() ); GEOS_LOG_RANK_0( GEOS_FMT( faceBcLogMessage, - this->getName(), time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, targetGroup.getName(), numTargetFaces ) ); + this->getName(), time_n+dt, fs.getCatalogName(), fs.getName(), + setName, targetGroup.getName(), numTargetFaces ) ); } if( stencil.size() == 0 ) @@ -772,8 +772,8 @@ void SinglePhaseFVM< BASE >::applyFaceDirichletBC( real64 const time_n, { globalIndex const numTargetFaces = MpiWrapper::sum< globalIndex >( stencil.size() ); GEOS_LOG_RANK_0( GEOS_FMT( faceBcLogMessage, - this->getName(), time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, targetGroup.getName(), numTargetFaces ) ); + this->getName(), time_n+dt, fs.getCatalogName(), fs.getName(), + setName, targetGroup.getName(), numTargetFaces ) ); } if( stencil.size() == 0 ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp index ef6705b4f5e..ac57c77afb3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp @@ -96,20 +96,20 @@ class SinglePhaseFVM : public BASE * @brief name of the node manager in the object catalog * @return string that contains the catalog name to generate a new NodeManager object through the object catalog. */ - template< typename _BASE=BASE > - static - typename std::enable_if< std::is_same< _BASE, SinglePhaseBase >::value, string >::type - catalogName() + static string catalogName() { - return "SinglePhaseFVM"; - } - - template< typename _BASE=BASE > - static - typename std::enable_if< std::is_same< _BASE, SinglePhaseProppantBase >::value, string >::type - catalogName() - { - return "SinglePhaseProppantFVM"; + if constexpr ( std::is_same_v< BASE, SinglePhaseBase > ) + { + return "SinglePhaseFVM"; + } + else if constexpr ( std::is_same_v< BASE, SinglePhaseProppantBase > ) + { + return "SinglePhaseProppantFVM"; + } + else + { + return BASE::catalogName(); + } } /** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 1ce44237606..c611af92cff 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -365,8 +365,8 @@ void SinglePhaseHybridFVM::applyFaceDirichletBC( real64 const time_n, { globalIndex const numTargetFaces = MpiWrapper::sum< globalIndex >( targetSet.size() ); GEOS_LOG_RANK_0( GEOS_FMT( faceBcLogMessage, - this->getName(), time_n+dt, FieldSpecificationBase::catalogName(), - fs.getName(), setName, targetGroup.getName(), numTargetFaces ) ); + this->getName(), time_n+dt, fs.getCatalogName(), fs.getName(), + setName, targetGroup.getName(), numTargetFaces ) ); } // next, we use the field specification functions to apply the boundary conditions to the system diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index 6b4f9069c06..33d8a7881cc 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -37,48 +37,15 @@ namespace geos using namespace dataRepository; using namespace constitutive; -namespace -{ - -// This is meant to be specialized to work, see below -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > class - CompositionalCatalogNames {}; - -// Class specialization for a RESERVOIR_SOLVER set to CompositionalMultiphaseFlow -template<> class CompositionalCatalogNames< CompositionalMultiphaseBase > -{ -public: - // TODO: find a way to use the catalog name here - static string name() { return "CompositionalMultiphaseReservoir"; } -}; -// Class specialization for a RESERVOIR_SOLVER set to MultiphasePoromechanics -template<> class CompositionalCatalogNames< MultiphasePoromechanics< CompositionalMultiphaseBase > > -{ -public: - static string name() { return MultiphasePoromechanics< CompositionalMultiphaseBase >::catalogName()+"Reservoir"; } -}; - -} - -// provide a definition for catalogName() -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > -string -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: -catalogName() -{ - return CompositionalCatalogNames< COMPOSITIONAL_RESERVOIR_SOLVER >::name(); -} - - -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +template< typename RESERVOIR_SOLVER > +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: CompositionalMultiphaseReservoirAndWells( const string & name, Group * const parent ) : Base( name, parent ) {} -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +template< typename RESERVOIR_SOLVER > +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: ~CompositionalMultiphaseReservoirAndWells() {} @@ -132,9 +99,9 @@ setMGRStrategy() } } -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: initializePreSubGroups() { Base::initializePreSubGroups(); @@ -151,18 +118,18 @@ initializePreSubGroups() InputError ); } -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: initializePostInitialConditionsPreSubGroups() { Base::initializePostInitialConditionsPreSubGroups(); setMGRStrategy(); } -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: addCouplingSparsityPattern( DomainPartition const & domain, DofManager const & dofManager, SparsityPatternView< globalIndex > const & pattern ) const @@ -267,9 +234,9 @@ addCouplingSparsityPattern( DomainPartition const & domain, } ); } -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -CompositionalMultiphaseReservoirAndWells< COMPOSITIONAL_RESERVOIR_SOLVER >:: +CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: assembleCouplingTerms( real64 const time_n, real64 const dt, DomainPartition const & domain, diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index 3d0ab667ee4..b0d356f2442 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -26,13 +26,14 @@ namespace geos { -template< typename COMPOSITIONAL_RESERVOIR_SOLVER > -class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWellsBase< COMPOSITIONAL_RESERVOIR_SOLVER, +/// @tparam RESERVOIR_SOLVER compositional flow or compositional poromechanics solver +template< typename RESERVOIR_SOLVER > +class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERVOIR_SOLVER, CompositionalMultiphaseWell > { public: - using Base = CoupledReservoirAndWellsBase< COMPOSITIONAL_RESERVOIR_SOLVER, + using Base = CoupledReservoirAndWellsBase< RESERVOIR_SOLVER, CompositionalMultiphaseWell >; using Base::getLogLevel; using Base::m_solvers; @@ -55,7 +56,18 @@ class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWells * @brief name of the node manager in the object catalog * @return string that contains the catalog name to generate a new NodeManager object through the object catalog. */ - static string catalogName(); + static string catalogName() + { + if constexpr (std::is_same_v< RESERVOIR_SOLVER, CompositionalMultiphaseBase > ) // special case + { + return "CompositionalMultiphaseReservoir"; + } + else // default + { + return RESERVOIR_SOLVER::catalogName() + "Reservoir"; + } + } + /** * @copydoc SolverBase::getCatalogName() */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index d51345298cd..d46bbc32def 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -87,7 +87,7 @@ class CoupledSolver : public SolverBase getDataContext(), solverName, solverType ), InputError ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: found {} solver named {}", getName(), solver->catalogName(), solverName ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: found {} solver named {}", getName(), solver->getCatalogName(), solverName ) ); } ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index dfa208b5794..803f72cdc00 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -35,39 +35,6 @@ using namespace constitutive; using namespace dataRepository; using namespace fields; - -namespace -{ - -// This is meant to be specialized to work, see below -template< typename POROMECHANICS_SOLVER > class - HydrofractureSolverCatalogNames {}; - -// Class specialization for a POROMECHANICS_SOLVER set to SinglePhasePoromechanics -template<> class HydrofractureSolverCatalogNames< SinglePhasePoromechanics< SinglePhaseBase > > -{ -public: - static string name() { return "Hydrofracture"; } -}; - -// Class specialization for a POROMECHANICS_SOLVER set to MultiphasePoromechanics -template<> class HydrofractureSolverCatalogNames< MultiphasePoromechanics< CompositionalMultiphaseBase > > -{ -public: - static string name() { return "MultiphaseHydrofracture"; } -}; -} - -// provide a definition for catalogName() -template< typename POROMECHANICS_SOLVER > -string -HydrofractureSolver< POROMECHANICS_SOLVER >:: -catalogName() -{ - return HydrofractureSolverCatalogNames< POROMECHANICS_SOLVER >::name(); -} - - template< typename POROMECHANICS_SOLVER > HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & name, Group * const parent ) @@ -1157,7 +1124,7 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( D namespace { -typedef HydrofractureSolver< SinglePhasePoromechanics< SinglePhaseBase > > SinglePhaseHydrofracture; +typedef HydrofractureSolver<> SinglePhaseHydrofracture; // typedef HydrofractureSolver< MultiphasePoromechanics< CompositionalMultiphaseBase > > MultiphaseHydrofracture; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseHydrofracture, string const &, Group * const ) // REGISTER_CATALOG_ENTRY( SolverBase, MultiphaseHydrofracture, string const &, Group * const ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index 152169f57c9..9d22911a24c 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -68,7 +68,19 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER /// Destructor for the class ~HydrofractureSolver() override {} - static string catalogName(); + static string catalogName() + { + // single phase + if constexpr ( std::is_same_v< POROMECHANICS_SOLVER, SinglePhasePoromechanics< SinglePhaseBase > > ) + { + return "Hydrofracture"; + } +// // multi phase (TODO) +// else if constexpr ( std::is_same_v< POROMECHANICS_SOLVER, MultiphasePoromechanics< CompositionalMultiphaseBase > > ) +// { +// return "MultiphaseHydrofracture"; +// } + } /** * @copydoc SolverBase::getCatalogName() */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 9367234c0ce..c497b8d9480 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -22,9 +22,7 @@ #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/solid/PorousSolid.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" @@ -39,35 +37,6 @@ using namespace constitutive; using namespace fields; using namespace stabilization; -namespace -{ - -// This is meant to be specialized to work, see below -template< typename FLOW_SOLVER > class - MultiphaseCatalogNames {}; -// Class specialization for a FLOW_SOLVER set to CompositionalMultiphaseBase -template<> class MultiphaseCatalogNames< CompositionalMultiphaseBase > -{ -public: - static string name() { return "MultiphasePoromechanics"; } -}; -// Class specialization for a FLOW_SOLVER set to CompositionalMultiphaseReservoirAndWells -template<> class MultiphaseCatalogNames< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > > -{ -public: - static string name() { return CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase >::catalogName() + "Poromechanics"; } -}; -} - -// provide a definition for catalogName() -template< typename FLOW_SOLVER > -string -MultiphasePoromechanics< FLOW_SOLVER >:: -catalogName() -{ - return MultiphaseCatalogNames< FLOW_SOLVER >::name(); -} - template< typename FLOW_SOLVER > MultiphasePoromechanics< FLOW_SOLVER >::MultiphasePoromechanics( const string & name, Group * const parent ) @@ -102,7 +71,7 @@ void MultiphasePoromechanics< FLOW_SOLVER >::postProcessInput() { Base::postProcessInput(); - GEOS_ERROR_IF( this->flowSolver()->catalogName() == "CompositionalMultiphaseReservoir" && + GEOS_ERROR_IF( this->flowSolver()->getCatalogName() == "CompositionalMultiphaseReservoir" && this->getNonlinearSolverParameters().couplingType() != NonlinearSolverParameters::CouplingType::Sequential, GEOS_FMT( "{}: {} solver is only designed to work for {} = {}", this->getDataContext(), catalogName(), NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index 2ba88eba253..2a102fcf3ba 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -21,7 +21,7 @@ #include "physicsSolvers/multiphysics/PoromechanicsSolver.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" - +#include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" namespace geos { @@ -68,7 +68,18 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER > * @brief name of the node manager in the object catalog * @return string that contains the catalog name to generate a new MultiphasePoromechanics object through the object catalog. */ - static string catalogName(); + static string catalogName() + { + if constexpr ( std::is_same_v< FLOW_SOLVER, CompositionalMultiphaseBase > ) // special case + { + return "MultiphasePoromechanics"; + } + else // default + { + return FLOW_SOLVER::catalogName() + "Poromechanics"; + } + } + /** * @copydoc SolverBase::getCatalogName() */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index 350e5994273..b21b1d904f5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -33,15 +33,6 @@ namespace geos using namespace dataRepository; -// provide a definition for catalogName() -template< typename POROMECHANICS_SOLVER > -string -PoromechanicsInitialization< POROMECHANICS_SOLVER >:: -catalogName() -{ - return POROMECHANICS_SOLVER::catalogName() + "Initialization"; -} - template< typename POROMECHANICS_SOLVER > PoromechanicsInitialization< POROMECHANICS_SOLVER >:: PoromechanicsInitialization( const string & name, diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp index 22f86654464..7d3933fdb1a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp @@ -54,7 +54,10 @@ class PoromechanicsInitialization : public TaskBase ~PoromechanicsInitialization() override; /// Accessor for the catalog name - static string catalogName(); + static string catalogName() + { + return POROMECHANICS_SOLVER::catalogName() + "Initialization"; + } /** * @defgroup Tasks Interface Functions diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index 6d85889df85..6d802168333 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -110,7 +110,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER porosityModelName = this->template getConstitutiveName< constitutive::PorosityBase >( subRegion ); GEOS_THROW_IF( porosityModelName.empty(), GEOS_FMT( "{} {} : Porosity model not found on subregion {}", - this->catalogName(), this->getDataContext().toString(), subRegion.getName() ), + this->getCatalogName(), this->getDataContext().toString(), subRegion.getName() ), InputError ); if( subRegion.hasField< fields::poromechanics::bulkDensity >() ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 6c4779fd743..31f03782e5a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -24,8 +24,6 @@ #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "linearAlgebra/solvers/BlockPreconditioner.hpp" #include "linearAlgebra/solvers/SeparateComponentPreconditioner.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" -#include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" @@ -41,36 +39,6 @@ using namespace constitutive; using namespace dataRepository; using namespace fields; -namespace -{ - -// This is meant to be specialized to work, see below -template< typename FLOW_SOLVER > class - SinglePhaseCatalogNames {}; - -// Class specialization for a FLOW_SOLVER set to SinglePhaseFlow -template<> class SinglePhaseCatalogNames< SinglePhaseBase > -{ -public: - static string name() { return "SinglePhasePoromechanics"; } -}; -// Class specialization for a FLOW_SOLVER set to SinglePhaseReservoirAndWells -template<> class SinglePhaseCatalogNames< SinglePhaseReservoirAndWells< SinglePhaseBase > > -{ -public: - static string name() { return SinglePhaseReservoirAndWells< SinglePhaseBase >::catalogName() + "Poromechanics"; } -}; -} - -// provide a definition for catalogName() -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -string -SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >:: -catalogName() -{ - return SinglePhaseCatalogNames< FLOW_SOLVER >::name(); -} - template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::SinglePhasePoromechanics( const string & name, Group * const parent ) @@ -88,7 +56,7 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postProcessInput { Base::postProcessInput(); - GEOS_ERROR_IF( this->flowSolver()->catalogName() == "SinglePhaseReservoir" && + GEOS_ERROR_IF( this->flowSolver()->getCatalogName() == "SinglePhaseReservoir" && this->getNonlinearSolverParameters().couplingType() != NonlinearSolverParameters::CouplingType::Sequential, GEOS_FMT( "{}: {} solver is only designed to work for {} = {}", this->getName(), catalogName(), NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index 58077a81cfe..113d4fc467f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -20,7 +20,8 @@ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_SINGLEPHASEPOROMECHANICS_HPP_ #include "physicsSolvers/multiphysics/PoromechanicsSolver.hpp" - +#include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" +#include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" namespace geos { @@ -52,7 +53,18 @@ class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHAN * @brief name of the node manager in the object catalog * @return string that contains the catalog name to generate a new SinglePhasePoromechanics object through the object catalog. */ - static string catalogName(); + static string catalogName() + { + if constexpr ( std::is_same_v< FLOW_SOLVER, SinglePhaseBase > ) // special case + { + return "SinglePhasePoromechanics"; + } + else // default + { + return FLOW_SOLVER::catalogName() + "Poromechanics"; + } + } + /** * @copydoc SolverBase::getCatalogName() */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index d3673115083..e4de7d21414 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -33,46 +33,15 @@ namespace geos using namespace dataRepository; using namespace constitutive; -namespace -{ - -// This is meant to be specialized to work, see below -template< typename SINGLEPHASE_RESERVOIR_SOLVER > class - SinglePhaseCatalogNames {}; - -// Class specialization for a RESERVOIR_SOLVER set to SinglePhaseFlow -template<> class SinglePhaseCatalogNames< SinglePhaseBase > -{ -public: - // TODO: find a way to use the catalog name here - static string name() { return "SinglePhaseReservoir"; } -}; -// Class specialization for a RESERVOIR_SOLVER set to SinglePhasePoromechanics -template<> class SinglePhaseCatalogNames< SinglePhasePoromechanics< SinglePhaseBase > > -{ -public: - static string name() { return SinglePhasePoromechanics< SinglePhaseBase >::catalogName()+"Reservoir"; } -}; -} - -// provide a definition for catalogName() -template< typename SINGLEPHASE_RESERVOIR_SOLVER > -string -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: -catalogName() -{ - return SinglePhaseCatalogNames< SINGLEPHASE_RESERVOIR_SOLVER >::name(); -} - -template< typename SINGLEPHASE_RESERVOIR_SOLVER > -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +template< typename RESERVOIR_SOLVER > +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: SinglePhaseReservoirAndWells( const string & name, Group * const parent ) : Base( name, parent ) {} -template< typename SINGLEPHASE_RESERVOIR_SOLVER > -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +template< typename RESERVOIR_SOLVER > +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: ~SinglePhaseReservoirAndWells() {} @@ -126,9 +95,9 @@ setMGRStrategy() } } -template< typename SINGLEPHASE_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: initializePreSubGroups() { Base::initializePreSubGroups(); @@ -136,18 +105,18 @@ initializePreSubGroups() Base::wellSolver()->setFlowSolverName( flowSolver->getName() ); } -template< typename SINGLEPHASE_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: initializePostInitialConditionsPreSubGroups() { Base::initializePostInitialConditionsPreSubGroups(); setMGRStrategy(); } -template< typename SINGLEPHASE_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: addCouplingSparsityPattern( DomainPartition const & domain, DofManager const & dofManager, SparsityPatternView< globalIndex > const & pattern ) const @@ -238,9 +207,9 @@ addCouplingSparsityPattern( DomainPartition const & domain, } ); } -template< typename SINGLEPHASE_RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER > void -SinglePhaseReservoirAndWells< SINGLEPHASE_RESERVOIR_SOLVER >:: +SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: assembleCouplingTerms( real64 const time_n, real64 const dt, DomainPartition const & domain, diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 2d1c5057c85..3fddd45a5c5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -26,13 +26,14 @@ namespace geos { -template< typename SINGLEPHASE_RESERVOIR_SOLVER > -class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< SINGLEPHASE_RESERVOIR_SOLVER, +/// @tparam RESERVOIR_SOLVER single-phase flow or single-phase poromechanics solver +template< typename RESERVOIR_SOLVER > +class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERVOIR_SOLVER, SinglePhaseWell > { public: - using Base = CoupledReservoirAndWellsBase< SINGLEPHASE_RESERVOIR_SOLVER, + using Base = CoupledReservoirAndWellsBase< RESERVOIR_SOLVER, SinglePhaseWell >; using Base::m_solvers; using Base::m_linearSolverParameters; @@ -54,7 +55,18 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< SINGLE * @brief name of the node manager in the object catalog * @return string that contains the catalog name to generate a new NodeManager object through the object catalog. */ - static string catalogName(); + static string catalogName() + { + if constexpr (std::is_same_v< RESERVOIR_SOLVER, SinglePhaseBase > ) // special case + { + return "SinglePhaseReservoir"; + } + else // default + { + return RESERVOIR_SOLVER::catalogName() + "Reservoir"; + } + } + /** * @copydoc SolverBase::getCatalogName() */ diff --git a/src/coreComponents/schema/docs/Constitutive.rst b/src/coreComponents/schema/docs/Constitutive.rst index c68ec412fa7..da607951e37 100644 --- a/src/coreComponents/schema/docs/Constitutive.rst +++ b/src/coreComponents/schema/docs/Constitutive.rst @@ -52,7 +52,6 @@ NullModel node :ref:`XML_NullModel` ParallelPlatesPermeability node :ref:`XML_ParallelPlatesPermeability` ParticleFluid node :ref:`XML_ParticleFluid` PerfectlyPlastic node :ref:`XML_PerfectlyPlastic` -PermeabilityBase node :ref:`XML_PermeabilityBase` PorousDamageElasticIsotropic node :ref:`XML_PorousDamageElasticIsotropic` PorousDamageSpectralElasticIsotropic node :ref:`XML_PorousDamageSpectralElasticIsotropic` PorousDamageVolDevElasticIsotropic node :ref:`XML_PorousDamageVolDevElasticIsotropic` diff --git a/src/coreComponents/schema/docs/Constitutive_other.rst b/src/coreComponents/schema/docs/Constitutive_other.rst index ad9b49f53c9..1dda7e77976 100644 --- a/src/coreComponents/schema/docs/Constitutive_other.rst +++ b/src/coreComponents/schema/docs/Constitutive_other.rst @@ -52,7 +52,6 @@ NullModel node :ref:`DATASTRUCTURE_NullMode ParallelPlatesPermeability node :ref:`DATASTRUCTURE_ParallelPlatesPermeability` ParticleFluid node :ref:`DATASTRUCTURE_ParticleFluid` PerfectlyPlastic node :ref:`DATASTRUCTURE_PerfectlyPlastic` -PermeabilityBase node :ref:`DATASTRUCTURE_PermeabilityBase` PorousDamageElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageElasticIsotropic` PorousDamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageSpectralElasticIsotropic` PorousDamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageVolDevElasticIsotropic` diff --git a/src/coreComponents/schema/docs/PermeabilityBase.rst b/src/coreComponents/schema/docs/PermeabilityBase.rst deleted file mode 100644 index f6c735e1d91..00000000000 --- a/src/coreComponents/schema/docs/PermeabilityBase.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ========= ======== =========================================== -Name Type Default Description -==== ========= ======== =========================================== -name groupName required A name is required for any non-unique nodes -==== ========= ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PermeabilityBase_other.rst b/src/coreComponents/schema/docs/PermeabilityBase_other.rst deleted file mode 100644 index fa997a57413..00000000000 --- a/src/coreComponents/schema/docs/PermeabilityBase_other.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -=============== ============== ======================================================== -Name Type Description -=============== ============== ======================================================== -dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure -permeability real64_array3d Rock permeability -=============== ============== ======================================================== - - diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index ce485aacb90..02c64029bf4 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -709,10 +709,6 @@ - - - - @@ -3813,7 +3809,6 @@ Local - Add stabilization only to interiors of macro elements.--> - @@ -4821,10 +4816,6 @@ If you want to do a three-phase simulation, please use instead wettingIntermedia - - - - diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 4aa7137d88d..0095e1586d3 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1394,7 +1394,6 @@ - @@ -2463,12 +2462,6 @@ - - - - - - diff --git a/src/docs/sphinx/CompleteXMLSchema.rst b/src/docs/sphinx/CompleteXMLSchema.rst index 90a6a194047..771b443b132 100644 --- a/src/docs/sphinx/CompleteXMLSchema.rst +++ b/src/docs/sphinx/CompleteXMLSchema.rst @@ -808,13 +808,6 @@ Element: PeriodicEvent .. include:: ../../coreComponents/schema/docs/PeriodicEvent.rst -.. _XML_PermeabilityBase: - -Element: PermeabilityBase -========================= -.. include:: ../../coreComponents/schema/docs/PermeabilityBase.rst - - .. _XML_PhaseFieldDamageFEM: Element: PhaseFieldDamageFEM @@ -2247,13 +2240,6 @@ Datastructure: PeriodicEvent .. include:: ../../coreComponents/schema/docs/PeriodicEvent_other.rst -.. _DATASTRUCTURE_PermeabilityBase: - -Datastructure: PermeabilityBase -=============================== -.. include:: ../../coreComponents/schema/docs/PermeabilityBase_other.rst - - .. _DATASTRUCTURE_PhaseFieldDamageFEM: Datastructure: PhaseFieldDamageFEM From 90feb1057fbbbac11f57c5b08cae777d5eb1fa7d Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 8 May 2024 12:04:58 -0500 Subject: [PATCH 061/286] Small cleanup for flow solvers (#3114) --- .../fluidFlow/CompositionalMultiphaseBase.cpp | 1 - .../fluidFlow/CompositionalMultiphaseBase.hpp | 16 ---------------- .../fluidFlow/FlowSolverBase.cpp | 1 + .../fluidFlow/FlowSolverBase.hpp | 16 ++++++++++++++++ .../fluidFlow/SinglePhaseBase.cpp | 3 +-- .../fluidFlow/SinglePhaseBase.hpp | 18 ------------------ ...ompositionalMultiphaseReservoirAndWells.hpp | 4 ++-- .../multiphysics/PoromechanicsSolver.hpp | 2 +- .../SinglePhaseReservoirAndWells.hpp | 4 ++-- 9 files changed, 23 insertions(+), 42 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 3408df3b3b9..8656844b04c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -62,7 +62,6 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, m_hasCapPressure( 0 ), m_hasDiffusion( 0 ), m_hasDispersion( 0 ), - m_keepFlowVariablesConstantDuringInitStep( 0 ), m_minScalingFactor( 0.01 ), m_allowCompDensChopping( 1 ), m_useTotalMassEquation( 1 ), diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index e387d0eabdb..c80e8aa606e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -235,11 +235,9 @@ class CompositionalMultiphaseBase : public FlowSolverBase // inputs - static constexpr char const * inputTemperatureString() { return "temperature"; } static constexpr char const * useMassFlagString() { return "useMass"; } static constexpr char const * relPermNamesString() { return "relPermNames"; } static constexpr char const * capPressureNamesString() { return "capPressureNames"; } - static constexpr char const * thermalConductivityNamesString() { return "thermalConductivityNames"; } static constexpr char const * diffusionNamesString() { return "diffusionNames"; } static constexpr char const * dispersionNamesString() { return "dispersionNames"; } @@ -329,14 +327,6 @@ class CompositionalMultiphaseBase : public FlowSolverBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) const = 0; - /** - * @brief Utility function to keep the flow variables during a time step (used in poromechanics simulations) - * @param[in] keepFlowVariablesConstantDuringInitStep flag to tell the solver to freeze its primary variables during a time step - * @detail This function is meant to be called by a specific task before/after the initialization step - */ - void keepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { m_keepFlowVariablesConstantDuringInitStep = keepFlowVariablesConstantDuringInitStep; } - /** * @brief Function to fix the initial state during the initialization step in coupled problems * @param[in] time current time @@ -431,9 +421,6 @@ class CompositionalMultiphaseBase : public FlowSolverBase /// the number of fluid components integer m_numComponents; - /// the input temperature - real64 m_inputTemperature; - /// flag indicating whether mass or molar formulation should be used integer m_useMass; @@ -446,9 +433,6 @@ class CompositionalMultiphaseBase : public FlowSolverBase /// flag to determine whether or not to apply dispersion integer m_hasDispersion; - /// flag to freeze the initial state during initialization in coupled problems - integer m_keepFlowVariablesConstantDuringInitStep; - /// maximum (absolute) change in a component fraction in a Newton iteration real64 m_maxCompFracChange; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index ad81fc583f2..756a5d5da06 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -89,6 +89,7 @@ FlowSolverBase::FlowSolverBase( string const & name, SolverBase( name, parent ), m_numDofPerCell( 0 ), m_isThermal( 0 ), + m_keepFlowVariablesConstantDuringInitStep( 0 ), m_isFixedStressPoromechanicsUpdate( false ), m_isJumpStabilized( false ) { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index f917c1673e8..3de1b21e7ea 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -70,7 +70,9 @@ class FlowSolverBase : public SolverBase static constexpr char const * solidNamesString() { return "solidNames"; } static constexpr char const * permeabilityNamesString() { return "permeabilityNames"; } static constexpr char const * isThermalString() { return "isThermal"; } + static constexpr char const * inputTemperatureString() { return "temperature"; } static constexpr char const * solidInternalEnergyNamesString() { return "solidInternalEnergyNames"; } + static constexpr char const * thermalConductivityNamesString() { return "thermalConductivityNames"; } static constexpr char const * allowNegativePressureString() { return "allowNegativePressure"; } static constexpr char const * maxAbsolutePresChangeString() { return "maxAbsolutePressureChange"; } static constexpr char const * maxSequentialPresChangeString() { return "maxSequentialPressureChange"; } @@ -138,6 +140,14 @@ class FlowSolverBase : public SolverBase */ void allowNegativePressure() { m_allowNegativePressure = 1; } + /** + * @brief Utility function to keep the flow variables during a time step (used in poromechanics simulations) + * @param[in] keepFlowVariablesConstantDuringInitStep flag to tell the solver to freeze its primary variables during a time step + * @detail This function is meant to be called by a specific task before/after the initialization step + */ + void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) + { m_keepFlowVariablesConstantDuringInitStep = keepFlowVariablesConstantDuringInitStep; } + virtual bool checkSequentialSolutionIncrements( DomainPartition & domain ) const override; protected: @@ -182,6 +192,12 @@ class FlowSolverBase : public SolverBase /// flag to determine whether or not this is a thermal simulation integer m_isThermal; + /// the input temperature + real64 m_inputTemperature; + + /// flag to freeze the initial state during initialization in coupled problems + integer m_keepFlowVariablesConstantDuringInitStep; + /// enable the fixed stress poromechanics update of porosity bool m_isFixedStressPoromechanicsUpdate; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index c53644eb370..2e0d864eb3f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -51,8 +51,7 @@ using namespace singlePhaseBaseKernels; SinglePhaseBase::SinglePhaseBase( const string & name, Group * const parent ): - FlowSolverBase( name, parent ), - m_keepFlowVariablesConstantDuringInitStep( 0 ) + FlowSolverBase( name, parent ) { this->registerWrapper( viewKeyStruct::inputTemperatureString(), &m_inputTemperature ). setApplyDefaultValue( 0.0 ). diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index 4a61817a2f4..88fc2523de3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -210,10 +210,6 @@ class SinglePhaseBase : public FlowSolverBase struct viewKeyStruct : FlowSolverBase::viewKeyStruct { static constexpr char const * elemDofFieldString() { return "singlePhaseVariables"; } - - // inputs - static constexpr char const * inputTemperatureString() { return "temperature"; } - static constexpr char const * thermalConductivityNamesString() { return "thermalConductivityNames"; } }; /** @@ -327,14 +323,6 @@ class SinglePhaseBase : public FlowSolverBase */ void computeHydrostaticEquilibrium(); - /** - * @brief Utility function to keep the flow variables during a time step (used in poromechanics simulations) - * @param[in] keepFlowVariablesConstantDuringInitStep flag to tell the solver to freeze its primary variables during a time step - * @detail This function is meant to be called by a specific task before/after the initialization step - */ - void keepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { m_keepFlowVariablesConstantDuringInitStep = keepFlowVariablesConstantDuringInitStep; } - /** * @brief Function to fix the initial state during the initialization step in coupled problems * @param[in] time current time @@ -410,12 +398,6 @@ class SinglePhaseBase : public FlowSolverBase virtual ThermalFluidPropViews getThermalFluidProperties( constitutive::ConstitutiveBase const & fluid ) const; - /// the input temperature - real64 m_inputTemperature; - - /// flag to freeze the initial state during initialization in coupled problems - integer m_keepFlowVariablesConstantDuringInitStep; - private: virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const override; diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index b0d356f2442..cc77ff42863 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -99,8 +99,8 @@ class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWells arrayView1d< real64 > const & localRhs ) const { flowSolver()->assembleStabilizedFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } - void keepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { flowSolver()->keepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } + void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) + { flowSolver()->setKeepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } real64 updateFluidState( ElementSubRegionBase & subRegion ) const { return flowSolver()->updateFluidState( subRegion ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index 6d802168333..2445cb9405b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -170,7 +170,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER real64 const & dt, DomainPartition & domain ) override { - flowSolver()->keepFlowVariablesConstantDuringInitStep( m_performStressInitialization ); + flowSolver()->setKeepFlowVariablesConstantDuringInitStep( m_performStressInitialization ); Base::implicitStepSetup( time_n, dt, domain ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 3fddd45a5c5..086a968f49d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -91,8 +91,8 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERV arrayView1d< real64 > const & localRhs ) const { flowSolver()->assembleFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } - void keepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { flowSolver()->keepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } + void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) + { flowSolver()->setKeepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } void updateFluidState( ElementSubRegionBase & subRegion ) const { flowSolver()->updateFluidState( subRegion ); } From 7e5a598e1d30175252d5a510ed6ae7af4e47b6cb Mon Sep 17 00:00:00 2001 From: frankfeifan Date: Thu, 9 May 2024 17:22:49 -0700 Subject: [PATCH 062/286] Add a pressure-dependent permeability model and calculate the transmissibility derivatives (#3086) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 + .../singlePhaseFlow/PressurePerm_1d_base.xml | 69 +++++ .../singlePhaseFlow/PressurePerm_1d_smoke.xml | 75 ++++++ .../singlePhaseFlow/PressurePerm_2d_base.xml | 68 +++++ .../singlePhaseFlow/PressurePerm_2d_smoke.xml | 75 ++++++ .../singlePhaseFlow/singlePhaseFlow.ats | 16 ++ .../constitutive/CMakeLists.txt | 2 + .../constitutive/ConstitutivePassThru.hpp | 5 + .../permeability/CarmanKozenyPermeability.hpp | 9 +- .../permeability/PermeabilityBase.hpp | 9 +- .../permeability/PressurePermeability.cpp | 127 +++++++++ .../permeability/PressurePermeability.hpp | 251 ++++++++++++++++++ .../constitutive/solid/CompressibleSolid.cpp | 3 + .../constitutive/solid/CompressibleSolid.hpp | 2 +- .../finiteVolume/CellElementStencilTPFA.hpp | 27 +- .../CompressibleSolidPressurePermeability.rst | 13 + ...essibleSolidPressurePermeability_other.rst | 9 + .../schema/docs/Constitutive.rst | 2 + .../schema/docs/Constitutive_other.rst | 2 + .../schema/docs/PressurePermeability.rst | 14 + .../docs/PressurePermeability_other.rst | 11 + .../schema/docs/WellControls.rst | 3 + src/coreComponents/schema/schema.xsd | 48 +++- src/coreComponents/schema/schema.xsd.other | 13 +- src/docs/sphinx/CompleteXMLSchema.rst | 28 ++ 26 files changed, 872 insertions(+), 16 deletions(-) create mode 100755 inputFiles/singlePhaseFlow/PressurePerm_1d_base.xml create mode 100755 inputFiles/singlePhaseFlow/PressurePerm_1d_smoke.xml create mode 100755 inputFiles/singlePhaseFlow/PressurePerm_2d_base.xml create mode 100755 inputFiles/singlePhaseFlow/PressurePerm_2d_smoke.xml create mode 100644 src/coreComponents/constitutive/permeability/PressurePermeability.cpp create mode 100644 src/coreComponents/constitutive/permeability/PressurePermeability.hpp create mode 100644 src/coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst create mode 100644 src/coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst create mode 100644 src/coreComponents/schema/docs/PressurePermeability.rst create mode 100644 src/coreComponents/schema/docs/PressurePermeability_other.rst diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 23e853a1ca5..e547b1cf7f5 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,7 @@ --- baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3105-4885-a1a85c1 + baseline: integratedTests/baseline_integratedTests-pr3086-4927-06b70d4 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 5dc380ae47a..d46b083227c 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3086 (2024-05-09) +====================== + +Added a presure-dependent permeability model and the transmissibility calculation in the CellElementStencil + PR #3105 (2024-05-08) ====================== diff --git a/inputFiles/singlePhaseFlow/PressurePerm_1d_base.xml b/inputFiles/singlePhaseFlow/PressurePerm_1d_base.xml new file mode 100755 index 00000000000..73147f4d729 --- /dev/null +++ b/inputFiles/singlePhaseFlow/PressurePerm_1d_base.xml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/PressurePerm_1d_smoke.xml b/inputFiles/singlePhaseFlow/PressurePerm_1d_smoke.xml new file mode 100755 index 00000000000..db98e62b1b3 --- /dev/null +++ b/inputFiles/singlePhaseFlow/PressurePerm_1d_smoke.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/PressurePerm_2d_base.xml b/inputFiles/singlePhaseFlow/PressurePerm_2d_base.xml new file mode 100755 index 00000000000..97ac626c60d --- /dev/null +++ b/inputFiles/singlePhaseFlow/PressurePerm_2d_base.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/PressurePerm_2d_smoke.xml b/inputFiles/singlePhaseFlow/PressurePerm_2d_smoke.xml new file mode 100755 index 00000000000..34dd7411aee --- /dev/null +++ b/inputFiles/singlePhaseFlow/PressurePerm_2d_smoke.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/singlePhaseFlow.ats b/inputFiles/singlePhaseFlow/singlePhaseFlow.ats index 2f0bb232b86..da476381b7e 100644 --- a/inputFiles/singlePhaseFlow/singlePhaseFlow.ats +++ b/inputFiles/singlePhaseFlow/singlePhaseFlow.ats @@ -75,6 +75,22 @@ decks = [ partitions=((1, 1, 1), (2, 2, 2), (3, 3, 3)), restart_step=10, check_step=20, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="PressurePerm_1d_smoke", + description= + 'Single phase flow test (1D, compressible, pressure dependent perm)', + partitions=((1, 1, 1), (2, 1, 1), (3, 1, 1)), + restart_step=10, + check_step=20, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="PressurePerm_2d_smoke", + description= + 'Single phase flow test (2D, compressible, pressure dependent perm)', + partitions=((1, 1, 1), (2, 2, 1), (3, 3, 1)), + restart_step=10, + check_step=20, restartcheck_params=RestartcheckParameters(**restartcheck_params)) ] diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index 7420efea9d3..51cd46fe4d1 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -104,6 +104,7 @@ set( constitutive_headers permeability/ParallelPlatesPermeability.hpp permeability/PermeabilityBase.hpp permeability/PermeabilityFields.hpp + permeability/PressurePermeability.hpp permeability/ProppantPermeability.hpp permeability/SlipDependentPermeability.hpp permeability/WillisRichardsPermeability.hpp @@ -245,6 +246,7 @@ set( constitutive_sources permeability/ExponentialDecayPermeability.cpp permeability/ParallelPlatesPermeability.cpp permeability/PermeabilityBase.cpp + permeability/PressurePermeability.cpp permeability/ProppantPermeability.cpp permeability/SlipDependentPermeability.cpp permeability/WillisRichardsPermeability.cpp diff --git a/src/coreComponents/constitutive/ConstitutivePassThru.hpp b/src/coreComponents/constitutive/ConstitutivePassThru.hpp index 0f97f509309..d2e22316b4a 100644 --- a/src/coreComponents/constitutive/ConstitutivePassThru.hpp +++ b/src/coreComponents/constitutive/ConstitutivePassThru.hpp @@ -44,6 +44,7 @@ #include "permeability/CarmanKozenyPermeability.hpp" #include "permeability/ExponentialDecayPermeability.hpp" #include "permeability/ParallelPlatesPermeability.hpp" +#include "permeability/PressurePermeability.hpp" #include "permeability/ProppantPermeability.hpp" #include "permeability/SlipDependentPermeability.hpp" #include "permeability/WillisRichardsPermeability.hpp" @@ -296,6 +297,7 @@ struct ConstitutivePassThru< CompressibleSolidBase > CompressibleSolid< PressurePorosity, CarmanKozenyPermeability >, CompressibleSolid< PressurePorosity, ExponentialDecayPermeability >, CompressibleSolid< PressurePorosity, ParallelPlatesPermeability >, + CompressibleSolid< PressurePorosity, PressurePermeability >, CompressibleSolid< PressurePorosity, SlipDependentPermeability >, CompressibleSolid< PressurePorosity, WillisRichardsPermeability > >::execute( constitutiveRelation, @@ -309,6 +311,7 @@ struct ConstitutivePassThru< CompressibleSolidBase > CompressibleSolid< PressurePorosity, CarmanKozenyPermeability >, CompressibleSolid< PressurePorosity, ExponentialDecayPermeability >, CompressibleSolid< PressurePorosity, ParallelPlatesPermeability >, + CompressibleSolid< PressurePorosity, PressurePermeability >, CompressibleSolid< PressurePorosity, SlipDependentPermeability >, CompressibleSolid< PressurePorosity, WillisRichardsPermeability > >::execute( constitutiveRelation, @@ -353,6 +356,7 @@ struct ConstitutivePassThru< CoupledSolidBase > CompressibleSolid< PressurePorosity, CarmanKozenyPermeability >, CompressibleSolid< PressurePorosity, ExponentialDecayPermeability >, CompressibleSolid< PressurePorosity, ParallelPlatesPermeability >, + CompressibleSolid< PressurePorosity, PressurePermeability >, CompressibleSolid< PressurePorosity, SlipDependentPermeability >, CompressibleSolid< PressurePorosity, WillisRichardsPermeability >, PorousSolid< DruckerPragerExtended >, @@ -379,6 +383,7 @@ struct ConstitutivePassThru< CoupledSolidBase > CompressibleSolid< PressurePorosity, CarmanKozenyPermeability >, CompressibleSolid< PressurePorosity, ExponentialDecayPermeability >, CompressibleSolid< PressurePorosity, ParallelPlatesPermeability >, + CompressibleSolid< PressurePorosity, PressurePermeability >, CompressibleSolid< PressurePorosity, SlipDependentPermeability >, CompressibleSolid< PressurePorosity, WillisRichardsPermeability >, PorousSolid< DruckerPragerExtended >, diff --git a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp index 56518a12e4a..022c2efcbad 100644 --- a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp @@ -50,10 +50,13 @@ class CarmanKozenyPermeabilityUpdate : public PermeabilityBaseUpdate arraySlice1d< real64 > const & dPerm_dPorosity ) const; GEOS_HOST_DEVICE - virtual void updateFromPorosity( localIndex const k, - localIndex const q, - real64 const & porosity ) const override + virtual void updateFromPressureAndPorosity( localIndex const k, + localIndex const q, + real64 const & pressure, + real64 const & porosity ) const override { + GEOS_UNUSED_VAR( pressure ); + compute( porosity, m_permeability[k][q], m_dPerm_dPorosity[k][q] ); diff --git a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp index 966b0bf035a..343458291e6 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp @@ -47,11 +47,12 @@ class PermeabilityBaseUpdate localIndex numGauss() const { return m_permeability.size( 1 ); } GEOS_HOST_DEVICE - virtual void updateFromPorosity( localIndex const k, - localIndex const q, - real64 const & porosity ) const + virtual void updateFromPressureAndPorosity( localIndex const k, + localIndex const q, + real64 const & pressure, + real64 const & porosity ) const { - GEOS_UNUSED_VAR( k, q, porosity ); + GEOS_UNUSED_VAR( k, q, pressure, porosity ); } GEOS_HOST_DEVICE diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp new file mode 100644 index 00000000000..8e1444c491c --- /dev/null +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp @@ -0,0 +1,127 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file PressurePermeability.cpp + */ + +#include "PressurePermeability.hpp" + +namespace geos +{ + +using namespace dataRepository; + +namespace constitutive +{ + + +PressurePermeability::PressurePermeability( string const & name, Group * const parent ): + PermeabilityBase( name, parent ) +{ + registerWrapper( viewKeyStruct::referencePermeabilityComponentsString(), &m_referencePermeabilityComponents ). + setInputFlag( InputFlags::REQUIRED ). + setRestartFlags( RestartFlags::NO_WRITE ). + setDescription( "Reference xx, yy and zz components of a diagonal permeability tensor." ); + + registerWrapper( viewKeyStruct::pressureDependenceConstantsString(), &m_pressureDependenceConstants ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Pressure dependence coefficients for each permeability component." ); + + registerWrapper( viewKeyStruct::referencePressureString(), &m_referencePressure ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Reference pressure for the pressure permeability model" ); + + registerWrapper( viewKeyStruct::referencePermeabilityString(), &m_referencePermeability ). + setApplyDefaultValue( 0.0 ). + setPlotLevel( PlotLevel::LEVEL_0 ). + setDescription( "Reference permeability field" ); + + registerWrapper( viewKeyStruct::maxPermeabilityString(), &m_maxPermeability ). + setApplyDefaultValue( 1.0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Max. permeability can be reached." ); + + registerWrapper( viewKeyStruct::pressureModelTypeString(), &m_presModelType ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( PressureModelType::Hyperbolic ). + setDescription( "Type of the pressure dependence model. " ); +} + +std::unique_ptr< ConstitutiveBase > +PressurePermeability::deliverClone( string const & name, + Group * const parent ) const +{ + return PermeabilityBase::deliverClone( name, parent ); +} + +void PressurePermeability::postProcessInput() +{ + for( localIndex i=0; i < 3; i++ ) + { + GEOS_ERROR_IF( fabs( m_pressureDependenceConstants[i] ) < 1e-15 && m_presModelType == PressureModelType::Hyperbolic, + getDataContext() << ": the pressure dependent constant at component " << i << " is too close to zero, which is not allowed for the hyperbolic model." ); + } +} + +void PressurePermeability::allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) +{ + m_referencePermeability.resize( 0, 1, 3 ); + + PermeabilityBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); + + integer const numQuad = 1; // NOTE: enforcing 1 quadrature point + + for( localIndex ei = 0; ei < parent.size(); ++ei ) + { + for( localIndex q = 0; q < numQuad; ++q ) + { + m_referencePermeability[ei][q][0] = m_referencePermeabilityComponents[0]; + m_referencePermeability[ei][q][1] = m_referencePermeabilityComponents[1]; + m_referencePermeability[ei][q][2] = m_referencePermeabilityComponents[2]; + } + } +} + +void PressurePermeability::initializeState() const +{ + localIndex const numE = m_permeability.size( 0 ); + integer constexpr numQuad = 1; // NOTE: enforcing 1 quadrature point + + auto permView = m_permeability.toView(); + real64 const permComponents[3] = { m_referencePermeabilityComponents[0], + m_referencePermeabilityComponents[1], + m_referencePermeabilityComponents[2] }; + + forAll< parallelDevicePolicy<> >( numE, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + for( localIndex q = 0; q < numQuad; ++q ) + { + for( integer dim=0; dim < 3; ++dim ) + { + // The default value is -1 so if it still -1 it needs to be set to something physical + if( permView[ei][q][dim] < 0 ) + { + permView[ei][q][dim] = permComponents[dim]; + } + } + } + } ); +} + +REGISTER_CATALOG_ENTRY( ConstitutiveBase, PressurePermeability, string const &, Group * const ) + +} +} /* namespace geos */ diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.hpp b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp new file mode 100644 index 00000000000..8751dd7f247 --- /dev/null +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp @@ -0,0 +1,251 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file PressurePermeability.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_PERMEABILITY_PRESSUREPERMEABILITY_HPP_ +#define GEOS_CONSTITUTIVE_PERMEABILITY_PRESSUREPERMEABILITY_HPP_ + +#include "constitutive/permeability/PermeabilityBase.hpp" + + +namespace geos +{ +namespace constitutive +{ + +enum class PressureModelType : integer +{ + Exponential, + Hyperbolic +}; + +ENUM_STRINGS( PressureModelType, + "Exponential", + "Hyperbolic" ); + +class PressurePermeabilityUpdate : public PermeabilityBaseUpdate +{ +public: + + PressurePermeabilityUpdate( PressureModelType const & presModelType, + R1Tensor const pressureDependenceConstants, + real64 const & referencePressure, + real64 const & maxPermeability, + arrayView3d< real64 > const & referencePermeability, + arrayView3d< real64 > const & permeability, + arrayView3d< real64 > const & dPerm_dPressure ) + : PermeabilityBaseUpdate( permeability, dPerm_dPressure ), + m_presModelType( presModelType ), + m_pressureDependenceConstants( pressureDependenceConstants ), + m_referencePressure( referencePressure ), + m_maxPermeability( maxPermeability ), + m_referencePermeability( referencePermeability ) + {} + + GEOS_HOST_DEVICE + void compute( real64 const & deltaPressure, + R1Tensor const pressureDependenceConstants, + real64 const (&referencePermeability)[3], + arraySlice1d< real64 > const & permeability, + arraySlice1d< real64 > const & dPerm_dPressure ) const; + + GEOS_HOST_DEVICE + void compute( real64 const & deltaPressure, + R1Tensor const pressureDependenceConstants, + real64 const (&referencePermeability)[3], + real64 const maxPermeability, + arraySlice1d< real64 > const & permeability, + arraySlice1d< real64 > const & dPerm_dPressure ) const; + + GEOS_HOST_DEVICE + virtual void updateFromPressureAndPorosity( localIndex const k, + localIndex const q, + real64 const & pressure, + real64 const & porosity ) const override + { + GEOS_UNUSED_VAR( q, porosity ); + + real64 const deltaPressure = pressure - m_referencePressure; + + real64 referencePermeability[3]; + + referencePermeability[0] = m_referencePermeability[k][0][0]; + referencePermeability[1] = m_referencePermeability[k][0][1]; + referencePermeability[2] = m_referencePermeability[k][0][2]; + + switch( m_presModelType ) + { + case PressureModelType::Exponential: + { + compute( deltaPressure, + m_pressureDependenceConstants, + referencePermeability, + m_permeability[k][0], + m_dPerm_dPressure[k][0] ); + + break; + } + case PressureModelType::Hyperbolic: + { + compute( deltaPressure, + m_pressureDependenceConstants, + referencePermeability, + m_maxPermeability, + m_permeability[k][0], + m_dPerm_dPressure[k][0] ); + + break; + } + default: + { + GEOS_ERROR( "PressureModelType is invalid! It should be either Exponential or Hyperbolic" ); + } + } + } + +private: + + /// Pressure dependence model type + PressureModelType m_presModelType; + + /// Pressure dependent coefficients for each permeability component + R1Tensor m_pressureDependenceConstants; + + /// Reference pressure in the model + real64 const m_referencePressure; + + /// Maximum permeability + real64 const m_maxPermeability; + + arrayView3d< real64 > m_referencePermeability; + +}; + + +class PressurePermeability : public PermeabilityBase +{ +public: + + PressurePermeability( string const & name, Group * const parent ); + + std::unique_ptr< ConstitutiveBase > deliverClone( string const & name, + Group * const parent ) const override; + + virtual void allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) override; + + static string catalogName() { return "PressurePermeability"; } + + virtual string getCatalogName() const override { return catalogName(); } + + /// Type of kernel wrapper for in-kernel update + using KernelWrapper = PressurePermeabilityUpdate; + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelWrapper() const + { + return KernelWrapper( m_presModelType, + m_pressureDependenceConstants, + m_referencePressure, + m_maxPermeability, + m_referencePermeability, + m_permeability, + m_dPerm_dPressure ); + } + + struct viewKeyStruct : public PermeabilityBase::viewKeyStruct + { + static constexpr char const * referencePermeabilityComponentsString() { return "referencePermeabilityComponents"; } + static constexpr char const * pressureDependenceConstantsString() { return "pressureDependenceConstants"; } + static constexpr char const * referencePressureString() { return "referencePressure"; } + static constexpr char const * referencePermeabilityString() { return "referencePermeability"; } + static constexpr char const * maxPermeabilityString() { return "maxPermeability"; } + static constexpr char const * pressureModelTypeString() { return "pressureModelType"; } + } viewKeys; + + virtual void initializeState() const override final; + +protected: + + virtual void postProcessInput() override; + +private: + + /// Permeability components at the reference pressure + R1Tensor m_referencePermeabilityComponents; + + /// Pressure dependent coefficients for each permeability component + R1Tensor m_pressureDependenceConstants; + + /// Reference pressure in the model + real64 m_referencePressure; + + /// Maximum permeability + real64 m_maxPermeability; + + array3d< real64 > m_referencePermeability; + + /// Pressure dependence model type + PressureModelType m_presModelType; + +}; + +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +void PressurePermeabilityUpdate::compute( real64 const & deltaPressure, + R1Tensor const pressureDependenceConstants, + real64 const (&referencePermeability)[3], + arraySlice1d< real64 > const & permeability, + arraySlice1d< real64 > const & dPerm_dPressure ) const +{ + for( localIndex i=0; i < permeability.size(); i++ ) + { + real64 const perm = referencePermeability[i] * exp( pressureDependenceConstants[i] * deltaPressure ); + + permeability[i] = perm; + dPerm_dPressure[i] = perm * pressureDependenceConstants[i]; + } +} + +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +void PressurePermeabilityUpdate::compute( real64 const & deltaPressure, + R1Tensor const pressureDependenceConstants, + real64 const (&referencePermeability)[3], + real64 const maxPermeability, + arraySlice1d< real64 > const & permeability, + arraySlice1d< real64 > const & dPerm_dPressure ) const +{ + for( localIndex i=0; i < permeability.size(); i++ ) + { + real64 const pressureOffSet = log( maxPermeability/referencePermeability[i] - 1 )/pressureDependenceConstants[i]; + + real64 const perm = maxPermeability/( 1 + exp( -pressureDependenceConstants[i]*( deltaPressure - pressureOffSet ) ) ); + permeability[i] = perm; + dPerm_dPressure[i] = perm*perm/maxPermeability*pressureDependenceConstants[i]*exp( -pressureDependenceConstants[i]*deltaPressure ); + } +} + +}/* namespace constitutive */ + +} /* namespace geos */ + + +#endif //GEOS_CONSTITUTIVE_PERMEABILITY_PRESSUREPERMEABILITY_HPP_ diff --git a/src/coreComponents/constitutive/solid/CompressibleSolid.cpp b/src/coreComponents/constitutive/solid/CompressibleSolid.cpp index 49043f3c980..3a168585f6a 100644 --- a/src/coreComponents/constitutive/solid/CompressibleSolid.cpp +++ b/src/coreComponents/constitutive/solid/CompressibleSolid.cpp @@ -23,6 +23,7 @@ #include "constitutive/permeability/CarmanKozenyPermeability.hpp" #include "constitutive/permeability/ExponentialDecayPermeability.hpp" #include "constitutive/permeability/ParallelPlatesPermeability.hpp" +#include "constitutive/permeability/PressurePermeability.hpp" #include "constitutive/permeability/SlipDependentPermeability.hpp" #include "constitutive/permeability/WillisRichardsPermeability.hpp" @@ -47,6 +48,7 @@ CompressibleSolid< PORO_TYPE, PERM_TYPE >::~CompressibleSolid() = default; // Register all CompressibleSolid model types. typedef CompressibleSolid< PressurePorosity, ConstantPermeability > CompressibleRockConstant; typedef CompressibleSolid< PressurePorosity, CarmanKozenyPermeability > CompressibleRockCK; +typedef CompressibleSolid< PressurePorosity, PressurePermeability > CompressibleRockPressurePerm; typedef CompressibleSolid< PressurePorosity, ExponentialDecayPermeability > FaultED; typedef CompressibleSolid< PressurePorosity, ParallelPlatesPermeability > FractureRock; typedef CompressibleSolid< PressurePorosity, SlipDependentPermeability > Fault; @@ -54,6 +56,7 @@ typedef CompressibleSolid< PressurePorosity, WillisRichardsPermeability > FaultW REGISTER_CATALOG_ENTRY( ConstitutiveBase, CompressibleRockConstant, string const &, Group * const ) REGISTER_CATALOG_ENTRY( ConstitutiveBase, CompressibleRockCK, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( ConstitutiveBase, CompressibleRockPressurePerm, string const &, Group * const ) REGISTER_CATALOG_ENTRY( ConstitutiveBase, FractureRock, string const &, Group * const ) REGISTER_CATALOG_ENTRY( ConstitutiveBase, FaultED, string const &, Group * const ) REGISTER_CATALOG_ENTRY( ConstitutiveBase, Fault, string const &, Group * const ) diff --git a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp index b8c37b4c07a..79b46f7f98e 100644 --- a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp +++ b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp @@ -62,7 +62,7 @@ class CompressibleSolidUpdates : public CoupledSolidUpdates< NullModel, PORO_TYP { m_porosityUpdate.updateFromPressureAndTemperature( k, q, pressure, temperature ); real64 const porosity = m_porosityUpdate.getPorosity( k, q ); - m_permUpdate.updateFromPorosity( k, q, porosity ); + m_permUpdate.updateFromPressureAndPorosity( k, q, pressure, porosity ); } GEOS_HOST_DEVICE diff --git a/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp b/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp index 0de8fcf2a6f..df572350aba 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp +++ b/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp @@ -219,9 +219,8 @@ CellElementStencilTPFAWrapper:: real64 (& weight)[1][2], real64 (& dWeight_dVar )[1][2] ) const { - GEOS_UNUSED_VAR( dCoeff_dVar ); - real64 halfWeight[2]; + real64 dHalfWeight_dVar[2]; // real64 const tolerance = 1e-30 * lengthTolerance; // TODO: choice of constant based on physics? @@ -232,6 +231,7 @@ CellElementStencilTPFAWrapper:: localIndex const ei = m_elementIndices[iconn][i]; halfWeight[i] = m_weights[iconn][i]; + dHalfWeight_dVar[i] = m_weights[iconn][i]; // Proper computation real64 faceNormal[3]; @@ -242,8 +242,11 @@ CellElementStencilTPFAWrapper:: } real64 faceConormal[3]; + real64 dFaceConormal_dVar[3]; LvArray::tensorOps::hadamardProduct< 3 >( faceConormal, coefficient[er][esr][ei][0], faceNormal ); + LvArray::tensorOps::hadamardProduct< 3 >( dFaceConormal_dVar, dCoeff_dVar[er][esr][ei][0], faceNormal ); halfWeight[i] *= LvArray::tensorOps::AiBi< 3 >( m_cellToFaceVec[iconn][i], faceConormal ); + dHalfWeight_dVar[i] *= LvArray::tensorOps::AiBi< 3 >( m_cellToFaceVec[iconn][i], dFaceConormal_dVar ); // correct negative weight issue arising from non-K-orthogonal grids if( halfWeight[i] < 0.0 ) @@ -251,8 +254,13 @@ CellElementStencilTPFAWrapper:: LvArray::tensorOps::hadamardProduct< 3 >( faceConormal, coefficient[er][esr][ei][0], m_cellToFaceVec[iconn][i] ); + LvArray::tensorOps::hadamardProduct< 3 >( dFaceConormal_dVar, + dCoeff_dVar[er][esr][ei][0], + m_cellToFaceVec[iconn][i] ); halfWeight[i] = m_weights[iconn][i]; + dHalfWeight_dVar[i] = m_weights[iconn][i]; halfWeight[i] *= LvArray::tensorOps::AiBi< 3 >( m_cellToFaceVec[iconn][i], faceConormal ); + dHalfWeight_dVar[i] *= LvArray::tensorOps::AiBi< 3 >( m_cellToFaceVec[iconn][i], dFaceConormal_dVar ); } } @@ -263,16 +271,25 @@ CellElementStencilTPFAWrapper:: real64 const harmonicWeight = sum > 0 ? product / sum : 0.0; real64 const arithmeticWeight = sum / 2; + real64 dHarmonicWeight_dVar[2]; + real64 dArithmeticWeight_dVar[2]; + + dHarmonicWeight_dVar[0] = sum > 0 ? (dHalfWeight_dVar[0]*sum*halfWeight[1] - dHalfWeight_dVar[0]*halfWeight[0]*halfWeight[1]) / ( sum*sum ) : 0.0; + dHarmonicWeight_dVar[1] = sum > 0 ? (dHalfWeight_dVar[1]*sum*halfWeight[0] - dHalfWeight_dVar[1]*halfWeight[1]*halfWeight[0]) / ( sum*sum ) : 0.0; + + dArithmeticWeight_dVar[0] = dHalfWeight_dVar[0] / 2; + dArithmeticWeight_dVar[1] = dHalfWeight_dVar[1] / 2; + real64 const meanPermCoeff = 1.0; //TODO make it a member if it is really necessary real64 const value = meanPermCoeff * harmonicWeight + (1 - meanPermCoeff) * arithmeticWeight; for( localIndex ke = 0; ke < 2; ++ke ) { weight[0][ke] = m_transMultiplier[iconn] * value * (ke == 0 ? 1 : -1); - } - dWeight_dVar[0][0] = 0.0; - dWeight_dVar[0][1] = 0.0; + real64 const dValue_dVar = meanPermCoeff * dHarmonicWeight_dVar[ke] + (1 - meanPermCoeff) * dArithmeticWeight_dVar[ke]; + dWeight_dVar[0][ke] = m_transMultiplier[iconn] * dValue_dVar; + } } GEOS_HOST_DEVICE diff --git a/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst b/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst new file mode 100644 index 00000000000..7d6d29602c1 --- /dev/null +++ b/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst @@ -0,0 +1,13 @@ + + +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +name groupName required A name is required for any non-unique nodes +permeabilityModelName groupNameRef required Name of the permeability model. +porosityModelName groupNameRef required Name of the porosity model. +solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. +solidModelName groupNameRef required Name of the solid model. +============================ ============ ======== =========================================== + + diff --git a/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst b/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst new file mode 100644 index 00000000000..adf1c1b8aec --- /dev/null +++ b/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst @@ -0,0 +1,9 @@ + + +==== ==== ============================ +Name Type Description +==== ==== ============================ + (no documentation available) +==== ==== ============================ + + diff --git a/src/coreComponents/schema/docs/Constitutive.rst b/src/coreComponents/schema/docs/Constitutive.rst index da607951e37..d094325ded1 100644 --- a/src/coreComponents/schema/docs/Constitutive.rst +++ b/src/coreComponents/schema/docs/Constitutive.rst @@ -25,6 +25,7 @@ CompressibleSolidCarmanKozenyPermeability node :ref:`XML_Compressib CompressibleSolidConstantPermeability node :ref:`XML_CompressibleSolidConstantPermeability` CompressibleSolidExponentialDecayPermeability node :ref:`XML_CompressibleSolidExponentialDecayPermeability` CompressibleSolidParallelPlatesPermeability node :ref:`XML_CompressibleSolidParallelPlatesPermeability` +CompressibleSolidPressurePermeability node :ref:`XML_CompressibleSolidPressurePermeability` CompressibleSolidSlipDependentPermeability node :ref:`XML_CompressibleSolidSlipDependentPermeability` CompressibleSolidWillisRichardsPermeability node :ref:`XML_CompressibleSolidWillisRichardsPermeability` ConstantDiffusion node :ref:`XML_ConstantDiffusion` @@ -65,6 +66,7 @@ PorousModifiedCamClay node :ref:`XML_PorousModi PorousViscoDruckerPrager node :ref:`XML_PorousViscoDruckerPrager` PorousViscoExtendedDruckerPrager node :ref:`XML_PorousViscoExtendedDruckerPrager` PorousViscoModifiedCamClay node :ref:`XML_PorousViscoModifiedCamClay` +PressurePermeability node :ref:`XML_PressurePermeability` PressurePorosity node :ref:`XML_PressurePorosity` ProppantPermeability node :ref:`XML_ProppantPermeability` ProppantPorosity node :ref:`XML_ProppantPorosity` diff --git a/src/coreComponents/schema/docs/Constitutive_other.rst b/src/coreComponents/schema/docs/Constitutive_other.rst index 1dda7e77976..93ffa5b4966 100644 --- a/src/coreComponents/schema/docs/Constitutive_other.rst +++ b/src/coreComponents/schema/docs/Constitutive_other.rst @@ -25,6 +25,7 @@ CompressibleSolidCarmanKozenyPermeability node :ref:`DATASTRUCTURE_Compress CompressibleSolidConstantPermeability node :ref:`DATASTRUCTURE_CompressibleSolidConstantPermeability` CompressibleSolidExponentialDecayPermeability node :ref:`DATASTRUCTURE_CompressibleSolidExponentialDecayPermeability` CompressibleSolidParallelPlatesPermeability node :ref:`DATASTRUCTURE_CompressibleSolidParallelPlatesPermeability` +CompressibleSolidPressurePermeability node :ref:`DATASTRUCTURE_CompressibleSolidPressurePermeability` CompressibleSolidSlipDependentPermeability node :ref:`DATASTRUCTURE_CompressibleSolidSlipDependentPermeability` CompressibleSolidWillisRichardsPermeability node :ref:`DATASTRUCTURE_CompressibleSolidWillisRichardsPermeability` ConstantDiffusion node :ref:`DATASTRUCTURE_ConstantDiffusion` @@ -65,6 +66,7 @@ PorousModifiedCamClay node :ref:`DATASTRUCTURE_PorousMo PorousViscoDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoDruckerPrager` PorousViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoExtendedDruckerPrager` PorousViscoModifiedCamClay node :ref:`DATASTRUCTURE_PorousViscoModifiedCamClay` +PressurePermeability node :ref:`DATASTRUCTURE_PressurePermeability` PressurePorosity node :ref:`DATASTRUCTURE_PressurePorosity` ProppantPermeability node :ref:`DATASTRUCTURE_ProppantPermeability` ProppantPorosity node :ref:`DATASTRUCTURE_ProppantPorosity` diff --git a/src/coreComponents/schema/docs/PressurePermeability.rst b/src/coreComponents/schema/docs/PressurePermeability.rst new file mode 100644 index 00000000000..b8f04d3f124 --- /dev/null +++ b/src/coreComponents/schema/docs/PressurePermeability.rst @@ -0,0 +1,14 @@ + + +=============================== =================================== ========== ===================================================================== +Name Type Default Description +=============================== =================================== ========== ===================================================================== +maxPermeability real64 1 Max. permeability can be reached. +name groupName required A name is required for any non-unique nodes +pressureDependenceConstants R1Tensor required Pressure dependence coefficients for each permeability component. +pressureModelType geos_constitutive_PressureModelType Hyperbolic Type of the pressure dependence model. +referencePermeabilityComponents R1Tensor required Reference xx, yy and zz components of a diagonal permeability tensor. +referencePressure real64 required Reference pressure for the pressure permeability model +=============================== =================================== ========== ===================================================================== + + diff --git a/src/coreComponents/schema/docs/PressurePermeability_other.rst b/src/coreComponents/schema/docs/PressurePermeability_other.rst new file mode 100644 index 00000000000..dd549711708 --- /dev/null +++ b/src/coreComponents/schema/docs/PressurePermeability_other.rst @@ -0,0 +1,11 @@ + + +===================== ============== ======================================================== +Name Type Description +===================== ============== ======================================================== +dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure +permeability real64_array3d Rock permeability +referencePermeability real64_array3d Reference permeability field +===================== ============== ======================================================== + + diff --git a/src/coreComponents/schema/docs/WellControls.rst b/src/coreComponents/schema/docs/WellControls.rst index 6560ae29291..c31d40067e7 100644 --- a/src/coreComponents/schema/docs/WellControls.rst +++ b/src/coreComponents/schema/docs/WellControls.rst @@ -7,6 +7,7 @@ control geos_WellControls_Control required | Well control. Va | * BHP | * phaseVolRate | * totalVolRate + | * massRate | * uninitialized enableCrossflow integer 1 | Flag to enable crossflow. Currently only supported for injectors: | - If the flag is set to 1, both reservoir-to-well flow and well-to-reservoir flow are allowed at the perforations. @@ -25,6 +26,8 @@ surfacePressure real64 0 Surface pressure u surfaceTemperature real64 0 Surface temperature used to compute volumetric rates when surface conditions are used [K] targetBHP real64 0 Target bottom-hole pressure [Pa] targetBHPTableName groupNameRef Name of the BHP table when the rate is a time dependent function +targetMassRate real64 0 Target Mass Rate rate ( [kg^3/s]) +targetMassRateTableName groupNameRef Name of the mass rate table when the rate is a time dependent function targetPhaseName groupNameRef Name of the target phase targetPhaseRate real64 0 Target phase volumetric rate (if useSurfaceConditions: [surface m^3/s]; else [reservoir m^3/s]) targetPhaseRateTableName groupNameRef Name of the phase rate table when the rate is a time dependent function diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 02c64029bf4..1ef4208de4a 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -601,6 +601,10 @@ + + + + @@ -761,6 +765,10 @@ + + + + @@ -2576,6 +2584,7 @@ Local - Add stabilization only to interiors of macro elements.--> * BHP * phaseVolRate * totalVolRate +* massRate * uninitialized--> + + + + @@ -2627,7 +2640,7 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - + @@ -3782,6 +3795,7 @@ Local - Add stabilization only to interiors of macro elements.--> + @@ -3822,6 +3836,7 @@ Local - Add stabilization only to interiors of macro elements.--> + @@ -4272,6 +4287,18 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + + + + + + + + + + + @@ -4972,6 +4999,25 @@ If you want to do a three-phase simulation, please use instead wettingIntermedia + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 0095e1586d3..fd1199766b4 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -773,7 +773,7 @@ - + @@ -1367,6 +1367,7 @@ + @@ -1407,6 +1408,7 @@ + @@ -2058,6 +2060,7 @@ + @@ -2475,6 +2478,14 @@ + + + + + + + + diff --git a/src/docs/sphinx/CompleteXMLSchema.rst b/src/docs/sphinx/CompleteXMLSchema.rst index 771b443b132..d26baf2b448 100644 --- a/src/docs/sphinx/CompleteXMLSchema.rst +++ b/src/docs/sphinx/CompleteXMLSchema.rst @@ -290,6 +290,13 @@ Element: CompressibleSolidParallelPlatesPermeability .. include:: ../../coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability.rst +.. _XML_CompressibleSolidPressurePermeability: + +Element: CompressibleSolidPressurePermeability +============================================== +.. include:: ../../coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst + + .. _XML_CompressibleSolidSlipDependentPermeability: Element: CompressibleSolidSlipDependentPermeability @@ -913,6 +920,13 @@ Element: PorousViscoModifiedCamClay .. include:: ../../coreComponents/schema/docs/PorousViscoModifiedCamClay.rst +.. _XML_PressurePermeability: + +Element: PressurePermeability +============================= +.. include:: ../../coreComponents/schema/docs/PressurePermeability.rst + + .. _XML_PressurePorosity: Element: PressurePorosity @@ -1701,6 +1715,13 @@ Datastructure: CompressibleSolidParallelPlatesPermeability .. include:: ../../coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability_other.rst +.. _DATASTRUCTURE_CompressibleSolidPressurePermeability: + +Datastructure: CompressibleSolidPressurePermeability +==================================================== +.. include:: ../../coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst + + .. _DATASTRUCTURE_CompressibleSolidSlipDependentPermeability: Datastructure: CompressibleSolidSlipDependentPermeability @@ -2345,6 +2366,13 @@ Datastructure: PorousViscoModifiedCamClay .. include:: ../../coreComponents/schema/docs/PorousViscoModifiedCamClay_other.rst +.. _DATASTRUCTURE_PressurePermeability: + +Datastructure: PressurePermeability +=================================== +.. include:: ../../coreComponents/schema/docs/PressurePermeability_other.rst + + .. _DATASTRUCTURE_PressurePorosity: Datastructure: PressurePorosity From 33c19621cf1ea95200a101f8fef67a4f10acc343 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Thu, 9 May 2024 19:31:34 -0700 Subject: [PATCH 063/286] Document how to debug CI through ssh. (#2975) --- .../Contributing/WorkInteractivelyOnCI.rst | 97 +++++++++++++++++++ .../Contributing/index_contributing.rst | 2 + 2 files changed, 99 insertions(+) create mode 100644 src/docs/sphinx/developerGuide/Contributing/WorkInteractivelyOnCI.rst diff --git a/src/docs/sphinx/developerGuide/Contributing/WorkInteractivelyOnCI.rst b/src/docs/sphinx/developerGuide/Contributing/WorkInteractivelyOnCI.rst new file mode 100644 index 00000000000..5a15121d48c --- /dev/null +++ b/src/docs/sphinx/developerGuide/Contributing/WorkInteractivelyOnCI.rst @@ -0,0 +1,97 @@ + +.. _WorkingInteractivelyOnCI: + +******************************************** +How to work interactively on the CI Machines +******************************************** + +When developing with GEOS, developers may sometimes face compilation errors or test failures that only manifest in specific Continuous Integration (CI) builds. +To effectively troubleshoot these issues, it's advisable to debug directly in the target environment. The preferred method involves using Docker to locally replicate the problematic image. +However, for those without Docker access on their machines, (or for cases inherently related to the CI configuration), an alternative is to establish a connection to the CI machines. Here are the steps to do so: + +Step 1: Adding a GHA to establish a connection +============================================== + +First, as much as you can, try to reduce the number of jobs you're triggering by commenting out the configurations you do not require for your debugging. +Then in your branch, add the following GHA step to the `.github/build_and_test.yml` (see full documentation of the action `here _`). + +.. code-block:: console + - name: ssh + uses: lhotari/action-upterm@v1 + with: + ## limits ssh access and adds the ssh public key for the user which triggered the workflow + limit-access-to-actor: true + ## limits ssh access and adds the ssh public keys of the listed GitHub users + limit-access-to-users: GitHubLogin + +The action should be added after whichever step triggers an error. In case of a build failure it is best to add the action after the `build, test and deploy` step. +It is also important to prevent the job to exit upon failure. For instance, it is suggested to comment the following lines in the `build, test and deploy` step. + +.. code-block:: console + set -e + +.. code-block:: console + exit ${EXIT_STATUS} + + +You can now commit the changes and push them to your remote branch. + +Step 2: Inspect the CI and grab server address +============================================== + +.. code-block:: console + Run lhotari/action-upterm@v1 + upterm + + Auto-generating ~/.ssh/known_hosts by attempting connection to uptermd.upterm.dev + Pseudo-terminal will not be allocated because stdin is not a terminal. + + Warning: Permanently added 'uptermd.upterm.dev' (ED25519) to the list of known hosts. + + runner@uptermd.upterm.dev: Permission denied (publickey). + + Adding actor "GitHubLogin" to allowed users. + Fetching SSH keys registered with GitHub profiles: GitHubLogin + Fetched 2 ssh public keys + Creating a new session. Connecting to upterm server ssh://uptermd.upterm.dev:22 + Created new session successfully + Entering main loop + === Q16OBOFBLODJVA3TRXPL + Command: tmux new -s upterm -x 132 -y 43 + Force Command: tmux attach -t upterm + + Host: ssh://uptermd.upterm.dev:22 + SSH Session: ssh Q16oBofblOdjVa3TrXPl:ZTc4NGUxMWRiMjI5MDgudm0udXB0ZXJtLmludGVybmFsOjIyMjI=@uptermd.upterm.dev + + +Step 3: Connect to the machine via ssh +====================================== + +You can now open a terminal in your own machine and sshe to the upterm server, e.g., + + +.. code-block:: console + ssh Q16oBofblOdjVa3TrXPl:ZTc4NGUxMWRiMjI5MDgudm0udXB0ZXJtLmludGVybmFsOjIyMjI=@uptermd.upterm.dev + + +Step 4: Run the docker container interactively +============================================== +Once you are connected to the machine it is convenient to follow these steps to interactively run the docker container: + +.. code-block:: console + docker ps -a + + +The id of the existing docker container will be displayed and you can use it to commit the container. + +.. code-block:: console + docker commit debug_image + +and then run it interactively, e.g. + +.. code-block:: console + docker run -it --volume=/home/runner/work/GEOS/GEOS:/tmp/geos -e ENABLE_HYPRE=ON -e ENABLE_HYPRE_DEVICE=CUDA -e ENABLE_TRILINOS=OFF --cap-add=SYS_PTRACE --entrypoint /bin/bash debug_image + +Step 5: Cancel the workflow +============================================== +Once you are done, do not forget to cancel the workflow! \ No newline at end of file diff --git a/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst b/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst index b1649780e84..dd03fc486a3 100644 --- a/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst +++ b/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst @@ -26,3 +26,5 @@ Contributing UsingDocker.rst InstallWin.rst + + WorkingInteractivelyOnCI.rst From 720eb228d7fd6641d6af4235c2bf62f66d9f3e29 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Fri, 10 May 2024 12:41:50 -0700 Subject: [PATCH 064/286] make integratedTests mandatory. (#3118) --- .github/workflows/ci_tests.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 796334d378c..14a7958a75c 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -332,6 +332,7 @@ jobs: - check_code_style_and_documentation - cpu_builds - cuda_builds + - run_integrated_tests if: ${{ always() }} steps: - run: | @@ -340,10 +341,12 @@ jobs: echo "check_code_style_and_documentation: ${{needs.check_code_style_and_documentation.result}}" echo "cpu_builds: ${{needs.cpu_builds.result}}" echo "cuda_builds: ${{needs.cuda_builds.result}}" + echo "run_integrated_tests: ${{needs.run_integrated_tests.result}} " ${{ needs.if_not_unassigned_pull_request.result == 'success' && needs.are_submodules_in_sync.result == 'success' && needs.check_code_style_and_documentation.result == 'success' && needs.cpu_builds.result == 'success' && - needs.cuda_builds.result == 'success' + needs.cuda_builds.result == 'success' && + needs.run_integrated_tests.result == 'success' }} From c29078e13ee04c0213eb958a21210c2a80513245 Mon Sep 17 00:00:00 2001 From: kimtaeho07 <44131732+kimtaeho07@users.noreply.github.com> Date: Sat, 11 May 2024 12:18:30 -0700 Subject: [PATCH 065/286] Feature/seismicity rate solver (#2593) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 + ...cityRate_analytical_verification_smoke.xml | 106 +++++ .../SeismicityRate_poromechanics_1d_smoke.xml | 267 +++++++++++ .../inducedSeismicity/inducedSeismicity.ats | 27 ++ .../scripts/SeismicityRate_curveChecks.py | 120 +++++ .../inducedSeismicity/shearStress_time.csv | 101 +++++ .../inducedSeismicity/shearStress_values.csv | 101 +++++ src/coreComponents/LvArray | 2 +- .../physicsSolvers/CMakeLists.txt | 4 + .../inducedSeismicity/SeismicityRate.cpp | 413 ++++++++++++++++++ .../inducedSeismicity/SeismicityRate.hpp | 161 +++++++ .../SeismicityRateKernels.hpp | 201 +++++++++ .../inducedSeismicityFields.hpp | 104 +++++ .../schema/docs/SeismicityRate.rst | 20 + .../schema/docs/SeismicityRate_other.rst | 14 + src/coreComponents/schema/docs/Solvers.rst | 1 + .../schema/docs/Solvers_other.rst | 1 + src/coreComponents/schema/schema.xsd | 31 ++ src/coreComponents/schema/schema.xsd.other | 14 + src/coreComponents/unitTests/CMakeLists.txt | 2 +- src/docs/doxygen/GeosxConfig.hpp | 10 +- src/docs/sphinx/CompleteXMLSchema.rst | 14 + 23 files changed, 1713 insertions(+), 8 deletions(-) create mode 100644 inputFiles/inducedSeismicity/SeismicityRate_analytical_verification_smoke.xml create mode 100644 inputFiles/inducedSeismicity/SeismicityRate_poromechanics_1d_smoke.xml create mode 100644 inputFiles/inducedSeismicity/inducedSeismicity.ats create mode 100644 inputFiles/inducedSeismicity/scripts/SeismicityRate_curveChecks.py create mode 100644 inputFiles/inducedSeismicity/shearStress_time.csv create mode 100644 inputFiles/inducedSeismicity/shearStress_values.csv create mode 100644 src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp create mode 100644 src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp create mode 100644 src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp create mode 100644 src/coreComponents/schema/docs/SeismicityRate.rst create mode 100644 src/coreComponents/schema/docs/SeismicityRate_other.rst diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index e547b1cf7f5..7a314b07075 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,7 @@ --- baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3086-4927-06b70d4 + baseline: integratedTests/baseline_integratedTests-pr2593-4950-bf205af allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index d46b083227c..e208367cb45 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #4950 (2024-05-10) +====================== + +Added smoke tests for SeismicityRate solver in inducedSeismicity. + PR #3086 (2024-05-09) ====================== diff --git a/inputFiles/inducedSeismicity/SeismicityRate_analytical_verification_smoke.xml b/inputFiles/inducedSeismicity/SeismicityRate_analytical_verification_smoke.xml new file mode 100644 index 00000000000..060fa699b91 --- /dev/null +++ b/inputFiles/inducedSeismicity/SeismicityRate_analytical_verification_smoke.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_1d_smoke.xml b/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_1d_smoke.xml new file mode 100644 index 00000000000..ad846d4cfd4 --- /dev/null +++ b/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_1d_smoke.xml @@ -0,0 +1,267 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/inducedSeismicity/inducedSeismicity.ats b/inputFiles/inducedSeismicity/inducedSeismicity.ats new file mode 100644 index 00000000000..ebc33ea78ae --- /dev/null +++ b/inputFiles/inducedSeismicity/inducedSeismicity.ats @@ -0,0 +1,27 @@ +import os +import geos_ats +from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests, CurveCheckParameters + +curvecheck_params = {} +curvecheck_params["filename"] = "seismicityRate.hdf5" +curvecheck_params["tolerance"] = [1e-3] +curvecheck_params["script_instructions"] = [ ["./scripts/SeismicityRate_curveChecks.py", "curve_check_solution", "seismicityRate"] ] +curvecheck_params["curves"] = "seismicityRate" + +decks = [ + TestDeck( + name="SeismicityRate_poromechanics_1d_smoke", + description="", + partitions=((1, 1, 1), (2, 1, 1)), + restart_step=40, + check_step=90, + restartcheck_params=RestartcheckParameters(atol=1e-4, rtol=1e-3)), + TestDeck( + name="SeismicityRate_analytical_verification_smoke", + description="Prescribed logarithmic stressing history", + partitions=((1, 1, 1), ), + restart_step=0, + check_step=100, + curvecheck_params=CurveCheckParameters(**curvecheck_params)) + ] +generate_geos_tests(decks) diff --git a/inputFiles/inducedSeismicity/scripts/SeismicityRate_curveChecks.py b/inputFiles/inducedSeismicity/scripts/SeismicityRate_curveChecks.py new file mode 100644 index 00000000000..c1e40e9bba6 --- /dev/null +++ b/inputFiles/inducedSeismicity/scripts/SeismicityRate_curveChecks.py @@ -0,0 +1,120 @@ + +import argparse +import numpy as np +import xml.etree.ElementTree as ElementTree +import matplotlib.pyplot as plt + +class analyticalSolution(): + def __init__( self, parameters ): + self.cTau = 1e-3 + self.aSigma = 1e6 + self.t_a = 1e6/parameters['backgroundStressingRate'] + self.initial_normal_traction = parameters['initialFaultNormalTraction'] + self.initial_fault_shear_traction = parameters['initialFaultShearTraction'] + + def compute_shear_stress( self, time_n, dt ): + return self.aSigma * np.log( self.cTau*( time_n + dt ) + 1 ) + self.initial_fault_shear_traction + + def compute_seismic_rate(self, time_n, dt, shear_stress): + K = np.exp( shear_stress / self.aSigma - self.initial_fault_shear_traction / self.aSigma ) + denom = ( self.cTau*(time_n + dt - self.t_a ) + 1) * np.exp( (time_n+dt) / self.t_a ) + self.cTau*self.t_a + return K/denom + +def getParametersFromXML( xmlFilePath ): + tree = ElementTree.parse( xmlFilePath ) + root = tree.getroot() + + parameters = dict.fromkeys(["initialFaultNormalTraction", "initialFaultShearTraction", "backgroundStressingRate"]) + + solver = tree.find('Solvers/SeismicityRate') + parameters["backgroundStressingRate"] = float(solver.get("backgroundStressingRate")) + + for field_spec in root.findall(".//FieldSpecification"): + if field_spec.get('name') == 'initialShearTraction': + parameters["initialFaultShearTraction"] = float(field_spec.get("scale")) + elif field_spec.get('name') == 'initialNormalTraction': + parameters["initialFaultNormalTraction"] = float(field_spec.get("scale")) + + return parameters + +def curve_check_solution(**kwargs): + + xmlFilePath = "./SeismicityRate_analytical_verification_smoke.xml" + parameters = getParametersFromXML( xmlFilePath ) + + analytical_solution = analyticalSolution( parameters ) + + times = np.squeeze(kwargs['seismicityRate Time'][:]) + analytical_rates = [] + dt = 3600.0 + for time in times: + tau = analytical_solution.compute_shear_stress(time, dt) + analytical_rate = analytical_solution.compute_seismic_rate(time, dt, tau) + analytical_rates.append(analytical_rate) + + return np.array(analytical_rates) + + +def debug( xmlFilePath ): + #-------- Extract info from XML + parameters = getParametersFromXML( xmlFilePath ) + + analytical_solution = analyticalSolution( parameters ) + + time = 0.0 + dt = 3600.0 + final_time = 360000.0 + times = [] + analytical_rates = [] + tau_plot = [] + while time < final_time: + tau = analytical_solution.compute_shear_stress(time, dt) + analytical_rate = analytical_solution.compute_seismic_rate(time, dt, tau) + time += dt + times.append(time) + analytical_rates.append(analytical_rate) + tau_plot.append(tau) + + import csv + + # Write times to a CSV file without headers + with open('shearStress_time.csv', 'w', newline='') as file: + writer = csv.writer(file) + for time in times: + writer.writerow([time]) + + # Write tau_plot to a CSV file without headers + with open('shearStress_values.csv', 'w', newline='') as file: + writer = csv.writer(file) + for tau in tau_plot: + writer.writerow([tau]) + + import h5py + file_path = '/usr/workspace/cusini1/geosx/geosx_dev/GEOS_2/build-quartz-gcc-12-release/Output/seismicityRate.hdf5' + with h5py.File(file_path, 'r') as file: + # List all groups + print("Keys: %s" % file.keys()) + + # Get the data + time = np.squeeze(file['seismicityRate Time'][:]) + seismicityRate = np.squeeze(file['seismicityRate'][:]) + print(time) + print(seismicityRate) + + # Plot analytical (continuous line) and numerical (markers) aperture solution + fig, ax = plt.subplots(figsize=(16, 12), nrows=2, ncols=1) + + ax[0].plot(times, tau_plot) + ax[0].set_xlabel('time [s]', weight="bold") + ax[0].set_ylabel('shear stress', weight="bold") + + ax[1].plot(times, analytical_rates) + ax[1].set_xlabel('time [s]', weight="bold") + ax[1].set_ylabel('seismic rate', weight="bold") + plt.savefig("seismicRate.png") + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('-f', '--xml-file', type=str, help='Path to XML file') + args = parser.parse_args() + debug( args.xml_file ) diff --git a/inputFiles/inducedSeismicity/shearStress_time.csv b/inputFiles/inducedSeismicity/shearStress_time.csv new file mode 100644 index 00000000000..c2c5da0c9c3 --- /dev/null +++ b/inputFiles/inducedSeismicity/shearStress_time.csv @@ -0,0 +1,101 @@ +0.0 +3600.0 +7200.0 +10800.0 +14400.0 +18000.0 +21600.0 +25200.0 +28800.0 +32400.0 +36000.0 +39600.0 +43200.0 +46800.0 +50400.0 +54000.0 +57600.0 +61200.0 +64800.0 +68400.0 +72000.0 +75600.0 +79200.0 +82800.0 +86400.0 +90000.0 +93600.0 +97200.0 +100800.0 +104400.0 +108000.0 +111600.0 +115200.0 +118800.0 +122400.0 +126000.0 +129600.0 +133200.0 +136800.0 +140400.0 +144000.0 +147600.0 +151200.0 +154800.0 +158400.0 +162000.0 +165600.0 +169200.0 +172800.0 +176400.0 +180000.0 +183600.0 +187200.0 +190800.0 +194400.0 +198000.0 +201600.0 +205200.0 +208800.0 +212400.0 +216000.0 +219600.0 +223200.0 +226800.0 +230400.0 +234000.0 +237600.0 +241200.0 +244800.0 +248400.0 +252000.0 +255600.0 +259200.0 +262800.0 +266400.0 +270000.0 +273600.0 +277200.0 +280800.0 +284400.0 +288000.0 +291600.0 +295200.0 +298800.0 +302400.0 +306000.0 +309600.0 +313200.0 +316800.0 +320400.0 +324000.0 +327600.0 +331200.0 +334800.0 +338400.0 +342000.0 +345600.0 +349200.0 +352800.0 +356400.0 +360000.0 diff --git a/inputFiles/inducedSeismicity/shearStress_values.csv b/inputFiles/inducedSeismicity/shearStress_values.csv new file mode 100644 index 00000000000..2b9ae809bac --- /dev/null +++ b/inputFiles/inducedSeismicity/shearStress_values.csv @@ -0,0 +1,101 @@ +60.0e6 +61526056.30349505 +62104134.15427021 +62468099.53147162 +62734367.50941958 +62944438.97916644 +63117949.90627824 +63265759.41076705 +63394508.393511355 +63508555.89998265 +63610917.91264422 +63703768.066607684 +63788724.78908365 +63867025.639497414 +63939638.17246112 +64007333.18523247 +64070734.696582966 +64130354.99974513 +64186619.838331275 +64239886.86751276 +64290459.44114839 +64338597.076746546 +64384523.51487247 +64428433.007488035 +64470495.28266149 +64510859.50651685 +64549657.476057835 +64587006.21536042 +64623010.104116425 +64657762.636107266 +64691347.88222914 +64723841.71570559 +64755312.84441781 +64785823.68568135 +64815431.11147129 +64844187.08645859 +64872139.21684233 +64899331.22453758 +64925803.35857956 +64951592.75346247 +64976733.74242058 +65001258.13228366 +65025195.44542758 +65048573.13343665 +65071416.76635611 +65093750.20080676 +65115595.729732744 +65136974.21613927 +65157905.21283129 +65178407.06987548 +65198497.031265825 +65218191.32206875 +65237505.22715128 +65256453.16244934 +65275048.73960868 +65293304.824724495 +65311233.591814585 +65328846.57158286 +65346154.6959622 +65363168.33886765 +65379897.35354046 +65396351.106819406 +65412538.51063806 +65428468.05101308 +65444147.814759575 +65459585.51414416 +65474788.50966381 +65489763.83111899 +65504518.19713193 +65519058.033245936 +65533389.48872752 +65547518.45218153 +65561450.5660784 +65575191.24028321 +65588745.664667845 +65602118.8208797 +65615315.49333387 +65628340.27948934 +65641197.59946458 +65653891.705042735 +65666426.68811243 +65678806.48858602 +65691034.9018337 +65703115.5856685 +65715052.06691443 +65726847.7475872 +65738505.91071459 +65750029.725821525 +65761422.25410262 +65772686.45330341 +65783825.18232974 +65794841.20560317 +65805737.1971792 +65816515.74464344 +65827179.35280012 +65837730.447165936 +65848171.3772815 +65858504.41985175 +65868731.78172568 +65878855.60272533 +65888877.95833288 diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index fb5200d7436..1531241583e 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit fb5200d743621126f2117eaef0dd855792fa0443 +Subproject commit 1531241583eebe21cfcdc0facd16a80f1e03c939 diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index bf0278adf7e..0e3239d7a19 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -63,6 +63,9 @@ set( physicsSolvers_headers fluidFlow/wells/WellControls.hpp fluidFlow/wells/WellSolverBase.hpp fluidFlow/wells/WellSolverBaseFields.hpp + inducedSeismicity/inducedSeismicityFields.hpp + inducedSeismicity/SeismicityRate.hpp + inducedSeismicity/SeismicityRateKernels.hpp multiphysics/CompositionalMultiphaseReservoirAndWells.hpp multiphysics/CoupledReservoirAndWellsBase.hpp multiphysics/CoupledSolver.hpp @@ -186,6 +189,7 @@ set( physicsSolvers_sources fluidFlow/wells/SinglePhaseWellKernels.cpp fluidFlow/wells/WellControls.cpp fluidFlow/wells/WellSolverBase.cpp + inducedSeismicity/SeismicityRate.cpp multiphysics/CompositionalMultiphaseReservoirAndWells.cpp multiphysics/CoupledReservoirAndWellsBase.cpp multiphysics/FlowProppantTransportSolver.cpp diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp new file mode 100644 index 00000000000..9755cca80a3 --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp @@ -0,0 +1,413 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SeismicityRate.cpp + */ + +#include "SeismicityRate.hpp" + +#include "dataRepository/InputFlags.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" +#include "SeismicityRateKernels.hpp" + +namespace geos +{ + +using namespace dataRepository; +using namespace fields; +using namespace constitutive; + +SeismicityRate::SeismicityRate( const string & name, + Group * const parent ): + SolverBase( name, parent ), + m_stressSolver( nullptr ) +{ + this->registerWrapper( viewKeyStruct::directEffectString(), &m_directEffect ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Rate-and-state friction direct effect parameter" ); + + this->registerWrapper( viewKeyStruct::backgroundStressingRateString(), &m_backgroundStressingRate ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Background stressing rate" ); + + this->registerWrapper( viewKeyStruct::stressSolverNameString(), &m_stressSolverName ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Name of solver for computing stress" ); + + this->registerWrapper( viewKeyStruct::faultNormalDirectionString(), &m_faultNormalDirection ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Fault normal direction" ); + + this->registerWrapper( viewKeyStruct::faultShearDirectionString(), &m_faultShearDirection ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Fault shear direction" ); + + this->getWrapper< string >( viewKeyStruct::discretizationString() ). + setInputFlag( InputFlags::FALSE ); +} + +void SeismicityRate::postProcessInput() +{ + // Check orthogonality of user-specified faults + if( std::abs( LvArray::tensorOps::AiBi< 3 >( m_faultNormalDirection, m_faultShearDirection )) > 1e-8 ) + { + GEOS_ERROR( "Fault normal and fault shear directions must be orthogonal" ); + } + // If user has specified faults, normalize them to be unit vectors + else if( LvArray::tensorOps::l2Norm< 3 >( m_faultNormalDirection ) > 1e-8 ) + { + LvArray::tensorOps::normalize< 3 >( m_faultNormalDirection ); + LvArray::tensorOps::normalize< 3 >( m_faultShearDirection ); + } + + // Initialize member stress solver as specified in XML input + if( !m_stressSolverName.empty() ) + { + m_stressSolver = &this->getParent().getGroup< SolverBase >( m_stressSolverName ); + } + + SolverBase::postProcessInput(); +} + +SeismicityRate::~SeismicityRate() +{ + // TODO Auto-generated destructor stub +} + +void SeismicityRate::registerDataOnMesh( Group & meshBodies ) +{ + SolverBase::registerDataOnMesh( meshBodies ); + + forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + + elemManager.forElementSubRegions< ElementSubRegionBase >( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + subRegion.registerField< inducedSeismicity::initialProjectedNormalTraction >( getName() ); + + subRegion.registerField< inducedSeismicity::initialProjectedShearTraction >( getName() ); + + subRegion.registerField< inducedSeismicity::projectedNormalTraction >( getName() ); + + subRegion.registerField< inducedSeismicity::projectedNormalTraction_n >( getName() ); + + subRegion.registerField< inducedSeismicity::projectedShearTraction >( getName() ); + + subRegion.registerField< inducedSeismicity::projectedShearTraction_n >( getName() ); + + subRegion.registerField< inducedSeismicity::seismicityRate >( getName() ); + + subRegion.registerField< inducedSeismicity::logDenom >( getName() ); + } ); + } ); +} + +void SeismicityRate::updateFaultTraction( ElementSubRegionBase & subRegion ) const +{ + // Retrieve field variables + arrayView1d< real64 > const sig = subRegion.getField< inducedSeismicity::projectedNormalTraction >(); + arrayView1d< real64 > const tau = subRegion.getField< inducedSeismicity::projectedShearTraction >(); + + // Retrieve stress state computed by m_stressSolver, called in solverStep + string const & solidModelName = subRegion.getReference< string >( SolidMechanicsLagrangianFEM::viewKeyStruct::solidMaterialNamesString()); + SolidBase const & solidModel = getConstitutiveModel< SolidBase >( subRegion, solidModelName ); + arrayView3d< real64 const, solid::STRESS_USD > const stress = solidModel.getStress(); + + // Construct Voigt notation projection tensor (dyadic product of fault normal and shear vectors) + // for when multiplying in inner dot product with symmetric stress tensor + real64 faultNormalProjectionTensor[6]{}; + real64 faultShearProjectionTensor[6]{}; + constructFaultStressProjectionTensors( faultNormalProjectionTensor, faultShearProjectionTensor ); + + // loop over all elements and compute unweighted average across all nodes + // as average stress state acting over the cell ceneter + // TODO: APPLY WEIGHTS TO AVERAGE TO ACCOUNT FOR ELEMENT SHAPE + forAll< parallelDevicePolicy<> >( sig.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // Compute average stress state + real64 meanStress[ 6 ]{}; + for( int q = 0; q < stress.size( 1 ); q++ ) + { + LvArray::tensorOps::add< 6 >( meanStress, stress[k][q] ); + } + LvArray::tensorOps::scale< 6 >( meanStress, 1./stress.size( 1 )); + + // Project average stress state to fault + sig[k] = LvArray::tensorOps::AiBi< 6 >( meanStress, faultNormalProjectionTensor ); + tau[k] = LvArray::tensorOps::AiBi< 6 >( meanStress, faultShearProjectionTensor ); + } ); + + // For poroelastic models, we must calculate the total stress before computing the effective stresses + // on the fault. This requires retrieving both the pressure field and the Biot coefficient. We first check + // to see if a flow solver exists, retrive the pressure field, then pass the porous model through the lambda + // cast to access the Biot coefficient. Finally, effective stresses on the fault are calculated. + if( subRegion.hasWrapper( FlowSolverBase::viewKeyStruct::fluidNamesString() ) ) + { + arrayView1d< real64 const > const pres = subRegion.getField< flow::pressure >(); + + string const & porousSolidModelName = subRegion.getReference< string >( FlowSolverBase::viewKeyStruct::solidNamesString() ); + CoupledSolidBase & porousSolid = getConstitutiveModel< CoupledSolidBase >( subRegion, porousSolidModelName ); + constitutive::ConstitutivePassThru< CoupledSolidBase >::execute( porousSolid, [&] ( auto & castedPorousSolid ) + { + // Initialize biotCoefficient as const arrayView before passing it through the lambda cast + arrayView1d< real64 const > const biotCoefficient = castedPorousSolid.getBiotCoefficient(); + + // To calculate the action of the total stress on the fault from our previous calculations, + // we need to project the action of the pore pressure on the stress tensor onto the fault + computeTotalStressOnFault( biotCoefficient, + pres, + faultNormalProjectionTensor, + faultShearProjectionTensor, + sig, + tau ); + } ); + } +} + +void SeismicityRate::computeTotalStressOnFault( arrayView1d< real64 const > const biotCoefficient, + arrayView1d< real64 const > const pres, + real64 const (&faultNormalProjectionTensor)[6], + real64 const (&faultShearProjectionTensor)[6], + arrayView1d< real64 > const sig, + arrayView1d< real64 > const tau ) const +{ + // To calculate the action of the total stress on the fault from our previous calculations, + // we need to project the action of the pore pressure on the stress tensor onto the fault + forAll< parallelDevicePolicy<> >( sig.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // Form pressure as tensor + real64 pressureTensor[ 6 ]{}; + LvArray::tensorOps::symAddIdentity< 3 >( pressureTensor, -biotCoefficient[k]*pres[k] ); + + // Project pressure tensor onto fault orientations + real64 const pressureOnFaultNormal = LvArray::tensorOps::AiBi< 6 >( pressureTensor, faultNormalProjectionTensor ); + real64 const pressureOnFaultShear = LvArray::tensorOps::AiBi< 6 >( pressureTensor, faultShearProjectionTensor ); + + // Calculate total stress on the faults + sig[k] += pressureOnFaultNormal; + tau[k] += pressureOnFaultShear; + } ); +} + +void SeismicityRate::initializeFaultTraction( real64 const time_n, integer const cycleNumber, DomainPartition & domain ) const +{ + // Only call initialization step before stress solver has been called for first time step + if( cycleNumber == 0 ) + { + // Call solverStep of stress solver with dt=0 to initialize stresses in the matrix + + updateStresses( time_n, 0.0, cycleNumber, domain ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + + saveOldState( subRegion ); + + // Retrieve field variables + arrayView1d< real64 const > const sig = subRegion.getField< inducedSeismicity::projectedNormalTraction >(); + arrayView1d< real64 const > const tau = subRegion.getField< inducedSeismicity::projectedShearTraction >(); + + arrayView1d< real64 > const sig_i = subRegion.getField< inducedSeismicity::initialProjectedNormalTraction >(); + arrayView1d< real64 > const tau_i = subRegion.getField< inducedSeismicity::initialProjectedShearTraction >(); + + forAll< parallelDevicePolicy<> >( sig.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // Set initial stress conditions on faults + sig_i[k] = sig[k]; + tau_i[k] = tau[k]; + } ); + } ); + } ); + } +} + +void SeismicityRate::constructFaultStressProjectionTensors( real64 (& faultNormalProjectionTensor)[6], + real64 (& faultShearProjectionTensor)[6] ) const +{ + faultNormalProjectionTensor[0] = m_faultNormalDirection[0]*m_faultNormalDirection[0]; + faultNormalProjectionTensor[1] = m_faultNormalDirection[1]*m_faultNormalDirection[1]; + faultNormalProjectionTensor[2] = m_faultNormalDirection[2]*m_faultNormalDirection[2]; + faultNormalProjectionTensor[3] = 2*m_faultNormalDirection[1]*m_faultNormalDirection[2]; + faultNormalProjectionTensor[4] = 2*m_faultNormalDirection[0]*m_faultNormalDirection[2]; + faultNormalProjectionTensor[5] = 2*m_faultNormalDirection[0]*m_faultNormalDirection[1]; + + faultShearProjectionTensor[0] = m_faultShearDirection[0]*m_faultNormalDirection[0]; + faultShearProjectionTensor[1] = m_faultShearDirection[1]*m_faultNormalDirection[1]; + faultShearProjectionTensor[2] = m_faultShearDirection[2]*m_faultNormalDirection[2]; + faultShearProjectionTensor[3] = m_faultShearDirection[1]*m_faultNormalDirection[2] + m_faultShearDirection[2]*m_faultNormalDirection[1]; + faultShearProjectionTensor[4] = m_faultShearDirection[0]*m_faultNormalDirection[2] + m_faultShearDirection[2]*m_faultNormalDirection[0]; + faultShearProjectionTensor[5] = m_faultShearDirection[0]*m_faultNormalDirection[1] + m_faultShearDirection[1]*m_faultNormalDirection[0]; +} + +real64 SeismicityRate::solverStep( real64 const & time_n, + real64 const & dt, + const int cycleNumber, + DomainPartition & domain ) +{ + // Save initial stress state on pre-defined fault orientations to field variables + if( cycleNumber == 0 ) + { + initializeFaultTraction( time_n, cycleNumber, domain ); + } + + real64 const dtStress = updateStresses( time_n, dt, cycleNumber, domain ); + + // Loop over subRegions to solve for seismicity rate + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + // solve for the seismicity rate given new stresses on faults + integralSolverStep( time_n, dtStress, subRegion ); + + // save old state + saveOldState( subRegion ); + } ); + } ); + + // return time step size achieved by stress solver + return dtStress; +} + +real64 SeismicityRate::updateStresses( real64 const & time_n, + real64 const & dt, + const int cycleNumber, + DomainPartition & domain ) const +{ + // Call member variable stress solver to update the stress state + if( m_stressSolver ) + { + + // 1. Solve the momentum balance + real64 const dtStress = m_stressSolver->solverStep( time_n, dt, cycleNumber, domain ); + + // 2. Loop over subRegions to update stress on faults + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + updateFaultTraction( subRegion ); + } ); + } ); + return dtStress; + } + else + { + char const bcLogMessage[] = + "SeismicityRate {}: at time {}s, " + "the <{}> boundary condition '{}' is applied to the element set '{}' in subRegion '{}'. " + "\nThe scale of this boundary condition is {} and multiplies the value of the provided function (if any). " + "\nThe total number of target elements (including ghost elements) is {}. " + "\nNote that if this number is equal to zero for all subRegions, the boundary condition will not be applied on this element set."; + + forDiscretizationOnMeshTargets ( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + + FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); + + std::vector< string > const keys = { inducedSeismicity::projectedNormalTraction::key(), + inducedSeismicity::projectedShearTraction::key() }; + + for( auto const & key : keys ) + { + fsManager.apply< ElementSubRegionBase >( time_n + dt, + mesh, + key, + [&]( FieldSpecificationBase const & fs, + string const & setName, + SortedArrayView< localIndex const > const & lset, + ElementSubRegionBase & subRegion, + string const & ) + { + if( fs.getLogLevel() >= 1 ) + { + globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( lset.size() ); + GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, + this->getName(), time_n+dt, FieldSpecificationBase::catalogName(), + fs.getName(), setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); + } + + // Specify the bc value of the field + fs.applyFieldValue< FieldSpecificationEqual, + parallelDevicePolicy<> >( lset, + time_n + dt, + subRegion, + key ); + } ); + } + } ); + } + return dt; +} + +void SeismicityRate::saveOldState( ElementSubRegionBase & subRegion ) const +{ + // Retrieve field variables + arrayView1d< real64 > const sig = subRegion.getField< inducedSeismicity::projectedNormalTraction >(); + arrayView1d< real64 > const sig_n = subRegion.getField< inducedSeismicity::projectedNormalTraction_n >(); + arrayView1d< real64 > const tau = subRegion.getField< inducedSeismicity::projectedShearTraction >(); + arrayView1d< real64 > const tau_n = subRegion.getField< inducedSeismicity::projectedShearTraction_n >(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // update projected stresses from previou step + sig_n[k] = sig[k]; + tau_n[k] = tau[k]; + } ); +} + +// Solve integral solution to ODE +void SeismicityRate::integralSolverStep( real64 const & time_n, + real64 const & dt, + ElementSubRegionBase & subRegion ) +{ + if( subRegion.hasWrapper( FlowSolverBase::viewKeyStruct::fluidNamesString() ) ) + { + seismicityRateKernels::createAndLaunch< parallelDevicePolicy<>, true >( subRegion, time_n, dt, m_directEffect, m_backgroundStressingRate ); + } + else + { + seismicityRateKernels::createAndLaunch< parallelDevicePolicy<>, false >( subRegion, time_n, dt, m_directEffect, m_backgroundStressingRate ); + } +} + +REGISTER_CATALOG_ENTRY( SolverBase, SeismicityRate, string const &, dataRepository::Group * const ) +} // namespace geos diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp new file mode 100644 index 00000000000..c8985312643 --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp @@ -0,0 +1,161 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#ifndef GEOS_PHYSICSSOLVERS_INDUCED_SEISMICITY_SEISMICITYRATE_HPP +#define GEOS_PHYSICSSOLVERS_INDUCED_SEISMICITY_SEISMICITYRATE_HPP + +#include "codingUtilities/EnumStrings.hpp" // facilities for enum-string conversion (for reading enum values from XML input) +#include "physicsSolvers/SolverBase.hpp" // an abstraction class shared by all physics solvers +#include "fieldSpecification/FieldSpecificationManager.hpp" // a manager that can access and set values on the discretized domain + +#include "physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp" + +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" + +namespace geos +{ + +class SeismicityRate : public SolverBase +{ +public: + /// The default nullary constructor is disabled to avoid compiler auto-generation: + SeismicityRate() = delete; + + /// The constructor needs a user-defined "name" and a parent Group (to place this instance in the tree structure of classes) + SeismicityRate( const string & name, + Group * const parent ); + + /// Destructor + virtual ~SeismicityRate() override; + + static string catalogName() { return "SeismicityRate"; } + + /** + * @return Get the final class Catalog name + */ + virtual string getCatalogName() const override { return catalogName(); } + + /// This method ties properties with their supporting mesh + virtual void registerDataOnMesh( Group & meshBodies ) override; + + struct viewKeyStruct : public SolverBase::viewKeyStruct + { + static constexpr char const * stressSolverNameString() { return "stressSolverName"; } + static constexpr char const * initialFaultNormalTractionString() { return "initialFaultNormalTraction"; } + static constexpr char const * initialFaultShearTractionString() { return "initialFaultShearTraction"; } + static constexpr char const * faultNormalDirectionString() { return "faultNormalDirection"; } + static constexpr char const * faultShearDirectionString() { return "faultShearDirection"; } + static constexpr char const * directEffectString() { return "directEffect"; } + static constexpr char const * backgroundStressingRateString() { return "backgroundStressingRate"; } + }; + + virtual real64 solverStep( real64 const & time_n, + real64 const & dt, + integer const cycleNumber, + DomainPartition & domain ) override final; + + /** + * @brief single step advance in computing the seismicity rate based on + * stress history according to closed form integral solution (Heimisson & Segall, 2018) + * to the ODE formulated by Dieterich, 1994 + * @param time_n time at previous converged step + * @param dt time step size + * @param subRegion ElementSubRegionBase to compute the solution in + */ + void integralSolverStep( real64 const & time_n, + real64 const & dt, + ElementSubRegionBase & subRegion ); + + /** + * @brief called in SolverStep after member stress solver is called to + * project the stress state to pre-defined fault orientations + * @param subRegion The ElementSubRegionBase that will have the stress information + */ + void updateFaultTraction( ElementSubRegionBase & subRegion ) const; + + /** + * @brief save the old state + * @param subRegion + */ + void saveOldState( ElementSubRegionBase & subRegion ) const; + + /** + * @brief + * @param biotCoefficient + * @param pres + * @param sig + * @param tau + */ + void computeTotalStressOnFault( arrayView1d< real64 const > const biotCoefficient, + arrayView1d< real64 const > const pres, + real64 const (&faultNormalProjectionTensor)[6], + real64 const (&faultShearProjectionTensor)[6], + arrayView1d< real64 > const sig, + arrayView1d< real64 > const tau ) const; + + /** + * @brief called in SolverStep before member stress solver is called to + * project the initial stress state to pre-defined fault orientations, + * only when cycleNumber == 0 + * @param cycleNumber current cycle number + * @param domain The DomainPartition of the problem + */ + void initializeFaultTraction( real64 const time_n, + integer const cycleNumber, + DomainPartition & domain ) const; + + +protected: + + /** + * @brief update the stresses either by asking the stressSolver or by applying b.c. + * @param time_n the current time + * @param dt the current time step + * @param cycleNumber the cycle number + * @param domain the DomainPartion group + */ + real64 updateStresses( real64 const & time_n, + real64 const & dt, + const int cycleNumber, + DomainPartition & domain ) const; + + + + void constructFaultStressProjectionTensors( real64 ( &faultNormalProjectionTensor )[6], + real64 ( &faultShearProjectionTensor )[6] ) const; + + virtual void postProcessInput() override; + + /// pointer to stress solver + SolverBase * m_stressSolver; + + /// stress solver name string + string m_stressSolverName; + + /// fault orientation: normal direction + R1Tensor m_faultNormalDirection; + + /// fault orientation: shear direction + R1Tensor m_faultShearDirection; + + /// direct effect coefficient + real64 m_directEffect; + + /// bacground stressing rate + real64 m_backgroundStressingRate; +}; + +} /* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_INDUCED_SEISMICITY_SEISMICITYRATE_HPP */ diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp new file mode 100644 index 00000000000..d708f28f9e5 --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp @@ -0,0 +1,201 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#ifndef GEOS_PHYSICSSOLVERS_SEISMICITYRATEKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_SEISMICITYRATEKERNELS_HPP_ + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" + +namespace geos +{ + +namespace seismicityRateKernels +{ +/** + * @class DieterichSeismicityRate + * + * @brief Solving the ODE for seismicity rate from Dieterich, 1994 + * + * @details This solver finds a solution R(x, t) - the seismicity rate - to the ordinary differential equation (ODE) + * formulated by Dieterich, 1994 given a certain stressing history. The stressing history can consist + * of mechanical stresses and pore pressure. The solver class includes a member variable + * pointing to the stress solver that is specified in the XML file. SolverStep for the + * stress solver is then called in the SolverStep function for the seismicity rate, to take + * the updated stress history as the input. + * + * Solving the ODE is currently implemented by computing the closed-form integral solution + * to the ODE which involves numerical calculation of an integral of a stress functional. + * We initially solve for the log of the seismicity rate in order to avoid overflow that + * typically occurs in the exponential of the stress history. + */ +class SeismicityRateKernel +{ +public: + + SeismicityRateKernel( ElementSubRegionBase & subRegion ): + m_R( subRegion.getField< fields::inducedSeismicity::seismicityRate >() ), + m_logDenom( subRegion.getField< fields::inducedSeismicity::logDenom >() ), + m_sigma_0( subRegion.getField< fields::inducedSeismicity::initialProjectedNormalTraction >() ), + m_sigma_n( subRegion.getField< fields::inducedSeismicity::projectedNormalTraction_n >() ), + m_sigma( subRegion.getField< fields::inducedSeismicity::projectedNormalTraction >() ), + m_tau_0( subRegion.getField< fields::inducedSeismicity::initialProjectedShearTraction >() ), + m_tau_n( subRegion.getField< fields::inducedSeismicity::projectedShearTraction_n >() ), + m_tau( subRegion.getField< fields::inducedSeismicity::projectedShearTraction >() ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables located on the stack + */ + struct StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables( real64 const directEffect, + real64 const backgroundStressingRate ): + directEffectValue( directEffect ), + backgroundStressingRateValue( backgroundStressingRate ), + effectiveNormalTraction_0( 0.0 ), + effectiveNormalTraction_n( 0.0 ), + effectiveNormalTraction( 0.0 ) + {} + + real64 const directEffectValue; + + real64 const backgroundStressingRateValue; + + real64 effectiveNormalTraction_0; + + real64 effectiveNormalTraction_n; + + real64 effectiveNormalTraction; + }; + + GEOS_HOST_DEVICE + void setup( localIndex const k, + StackVariables & stack ) const + { + stack.effectiveNormalTraction_0 = -m_sigma_0[k]; + stack.effectiveNormalTraction_n = -m_sigma_n[k]; + stack.effectiveNormalTraction = -m_sigma[k]; + } + + GEOS_HOST_DEVICE + void computeSeismicityRate( localIndex const k, + real64 const & time_n, + real64 const & dt, + StackVariables & stack ) const + { + + // arguments of stress exponential at current and previous time step + real64 const g = ( m_tau[k] + stack.backgroundStressingRateValue*(time_n+dt))/(stack.directEffectValue*stack.effectiveNormalTraction ) + - m_tau_0[k]/(stack.directEffectValue * stack.effectiveNormalTraction_0 ); + + real64 const g_n = ( m_tau_n[k] + stack.backgroundStressingRateValue*time_n)/(stack.directEffectValue*stack.effectiveNormalTraction_n ) + - m_tau_0[k]/(stack.directEffectValue*stack.effectiveNormalTraction_0); + + // Compute the difference of the log of the denominator of closed for integral solution. + // This avoids directly computing the exponential of the current stress state which is more prone to overflow. + m_logDenom[k] += std::log( 1 + dt/(2*(stack.directEffectValue*stack.effectiveNormalTraction_0/stack.backgroundStressingRateValue)) + *(std::exp( g - m_logDenom[k] ) + std::exp( g_n - m_logDenom[k] ) )); + + // Convert log seismicity rate to raw value + m_R[k] = LvArray::math::exp( g - m_logDenom[k] ); + } + +protected: + + arrayView1d< real64 > m_R; + + arrayView1d< real64 > m_logDenom; + + arrayView1d< real64 const > m_sigma_0; + + arrayView1d< real64 const > m_sigma_n; + + arrayView1d< real64 const > m_sigma; + + arrayView1d< real64 const > m_tau_0; + + arrayView1d< real64 const > m_tau_n; + + arrayView1d< real64 const > m_tau; +}; + + +class SeismicityRateKernelPoroelastic : public SeismicityRateKernel +{ + +public: + + SeismicityRateKernelPoroelastic( ElementSubRegionBase & subRegion ): + SeismicityRateKernel( subRegion ), + m_pressure_0( subRegion.getField< fields::flow::initialPressure >() ), + m_pressure_n( subRegion.getField< fields::flow::pressure_n >() ), + m_pressure( subRegion.getField< fields::flow::pressure >() ) + {} + + GEOS_HOST_DEVICE + void setup( localIndex const k, + StackVariables & stack ) const + { + stack.effectiveNormalTraction_0 = -m_sigma_0[k] - m_pressure_0[k]; + stack.effectiveNormalTraction_n = -m_sigma_n[k] - m_pressure_n[k]; + stack.effectiveNormalTraction = -m_sigma[k] - m_pressure[k]; + } + +private: + + arrayView1d< real64 const > m_pressure_0; + + arrayView1d< real64 const > m_pressure_n; + + arrayView1d< real64 const > m_pressure; +}; + + +/** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + */ +template< typename POLICY, bool ISPORO > +static void +createAndLaunch( ElementSubRegionBase & subRegion, + real64 const time_n, + real64 const dt, + real64 const directEffectValue, + real64 const backgroundStressingRateValue ) +{ + GEOS_MARK_FUNCTION; + + using kernelType = std::conditional_t< ISPORO, SeismicityRateKernelPoroelastic, SeismicityRateKernel >; + kernelType kernel( subRegion ); + + forAll< POLICY >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + typename kernelType::StackVariables stack( directEffectValue, backgroundStressingRateValue ); + kernel.setup( k, stack ); + kernel.computeSeismicityRate( k, time_n, dt, stack ); + } ); +} + +} /* namespace seismicityRateKernels */ + +}/* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_SEISMICITYRATEKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp new file mode 100644 index 00000000000..f993990949a --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp @@ -0,0 +1,104 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file inducedSeismicityFields.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_INDUCEDSEISMICITY_INDUCEDSEISMICITYFIELDS_HPP_ +#define GEOS_PHYSICSSOLVERS_INDUCEDSEISMICITY_INDUCEDSEISMICITYFIELDS_HPP_ + +#include "common/DataLayouts.hpp" +#include "mesh/MeshFields.hpp" + +namespace geos +{ + +namespace fields +{ + +namespace inducedSeismicity +{ + +DECLARE_FIELD( initialProjectedNormalTraction, + "initialProjectedNormalTraction", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Initial meanNormal stress acting on the fault" ); + +DECLARE_FIELD( projectedNormalTraction, + "projectedNormalTraction", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "meanNormal stress acting on the fault" ); + +DECLARE_FIELD( projectedNormalTraction_n, + "projectedNormalTraction_n", + array1d< real64 >, + 0, + LEVEL_1, + WRITE_AND_READ, + "meanNormal stress acting on the fault at the previous converged time step" ); + +DECLARE_FIELD( initialProjectedShearTraction, + "initialProjectedShearTraction", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Initial meanShear stress acting on the fault" ); + +DECLARE_FIELD( projectedShearTraction, + "projectedShearTraction", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "meanShear stress acting on the fault" ); + +DECLARE_FIELD( projectedShearTraction_n, + "projectedShearTraction_n", + array1d< real64 >, + 0, + LEVEL_1, + WRITE_AND_READ, + "meanShear stress acting on the fault at the previous converged time step" ); + +DECLARE_FIELD( seismicityRate, + "seismicityRate", + array1d< real64 >, + 1.0, + LEVEL_0, + WRITE_AND_READ, + "Seismicity rate" ); + +DECLARE_FIELD( logDenom, + "logDenom", + array1d< real64 >, + 0, + LEVEL_2, + WRITE_AND_READ, + "Log of the denominator of the integral form of the seismicity rate" ); + +} + +} + +} + +#endif // GEOS_PHYSICSSOLVERS_INDUCEDSEISMICITY_INDUCEDSEISMICITYFIELDS_HPP_ diff --git a/src/coreComponents/schema/docs/SeismicityRate.rst b/src/coreComponents/schema/docs/SeismicityRate.rst new file mode 100644 index 00000000000..492a69e75e2 --- /dev/null +++ b/src/coreComponents/schema/docs/SeismicityRate.rst @@ -0,0 +1,20 @@ + + +========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== +backgroundStressingRate real64 required Background stressing rate +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +directEffect real64 required Rate-and-state friction direct effect parameter +faultNormalDirection R1Tensor {0,0,0} Fault normal direction +faultShearDirection R1Tensor {0,0,0} Fault shear direction +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +stressSolverName string Name of solver for computing stress +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== + + diff --git a/src/coreComponents/schema/docs/SeismicityRate_other.rst b/src/coreComponents/schema/docs/SeismicityRate_other.rst new file mode 100644 index 00000000000..cccf4603c70 --- /dev/null +++ b/src/coreComponents/schema/docs/SeismicityRate_other.rst @@ -0,0 +1,14 @@ + + +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== + + diff --git a/src/coreComponents/schema/docs/Solvers.rst b/src/coreComponents/schema/docs/Solvers.rst index b592e00dde7..87f18a99508 100644 --- a/src/coreComponents/schema/docs/Solvers.rst +++ b/src/coreComponents/schema/docs/Solvers.rst @@ -25,6 +25,7 @@ PhaseFieldDamageFEM node :ref:`XML_Pha PhaseFieldFracture node :ref:`XML_PhaseFieldFracture` ProppantTransport node :ref:`XML_ProppantTransport` ReactiveCompositionalMultiphaseOBL node :ref:`XML_ReactiveCompositionalMultiphaseOBL` +SeismicityRate node :ref:`XML_SeismicityRate` SinglePhaseFVM node :ref:`XML_SinglePhaseFVM` SinglePhaseHybridFVM node :ref:`XML_SinglePhaseHybridFVM` SinglePhasePoromechanics node :ref:`XML_SinglePhasePoromechanics` diff --git a/src/coreComponents/schema/docs/Solvers_other.rst b/src/coreComponents/schema/docs/Solvers_other.rst index a4b9911d0f2..3eca415d7e0 100644 --- a/src/coreComponents/schema/docs/Solvers_other.rst +++ b/src/coreComponents/schema/docs/Solvers_other.rst @@ -24,6 +24,7 @@ PhaseFieldDamageFEM node :ref:`DATASTRUCTURE_PhaseFiel PhaseFieldFracture node :ref:`DATASTRUCTURE_PhaseFieldFracture` ProppantTransport node :ref:`DATASTRUCTURE_ProppantTransport` ReactiveCompositionalMultiphaseOBL node :ref:`DATASTRUCTURE_ReactiveCompositionalMultiphaseOBL` +SeismicityRate node :ref:`DATASTRUCTURE_SeismicityRate` SinglePhaseFVM node :ref:`DATASTRUCTURE_SinglePhaseFVM` SinglePhaseHybridFVM node :ref:`DATASTRUCTURE_SinglePhaseHybridFVM` SinglePhasePoromechanics node :ref:`DATASTRUCTURE_SinglePhasePoromechanics` diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 1ef4208de4a..b786c16708f 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -393,6 +393,10 @@ + + + + @@ -2144,6 +2148,7 @@ the relative residual norm satisfies: + @@ -3067,6 +3072,32 @@ Local - Add stabilization only to interiors of macro elements.--> + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index fd1199766b4..a96f1c1e5d0 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -523,6 +523,7 @@ + @@ -1008,6 +1009,19 @@ + + + + + + + + + + + + + diff --git a/src/coreComponents/unitTests/CMakeLists.txt b/src/coreComponents/unitTests/CMakeLists.txt index 3d49c154263..a3d92867343 100644 --- a/src/coreComponents/unitTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/CMakeLists.txt @@ -11,4 +11,4 @@ add_subdirectory( finiteVolumeTests ) add_subdirectory( fileIOTests ) add_subdirectory( fluidFlowTests ) add_subdirectory( wellsTests ) -add_subdirectory( wavePropagationTests ) +add_subdirectory( wavePropagationTests ) \ No newline at end of file diff --git a/src/docs/doxygen/GeosxConfig.hpp b/src/docs/doxygen/GeosxConfig.hpp index 4ad4fd61164..e458794d05d 100644 --- a/src/docs/doxygen/GeosxConfig.hpp +++ b/src/docs/doxygen/GeosxConfig.hpp @@ -30,7 +30,7 @@ #define GEOSX_USE_MPI /// Enables use of OpenMP (CMake option ENABLE_OPENMP) -#define GEOSX_USE_OPENMP +/* #undef GEOSX_USE_OPENMP */ /// Enables use of CUDA (CMake option ENABLE_CUDA) /* #undef GEOS_USE_CUDA */ @@ -126,10 +126,10 @@ #define Conduit_VERSION 0.8.2 /// Version information for RAJA -#define RAJA_VERSION 2023.6.1 +#define RAJA_VERSION 2022.10.5 /// Version information for umpire -#define umpire_VERSION 2023.6.0 +#define umpire_VERSION 2022.10.0 /// Version information for chai /* #undef chai_VERSION */ @@ -138,7 +138,7 @@ #define adiak_VERSION .. /// Version information for caliper -#define caliper_VERSION 2.10.0 +#define caliper_VERSION 2.8.0 /// Version information for Metis #define metis_VERSION 5.1.0 @@ -147,7 +147,7 @@ #define parmetis_VERSION 4.0.0 /// Version information for scotch -#define scotch_VERSION 7.0.3 +#define scotch_VERSION 6.0.9 /// Version information for superlu_dist #define superlu_dist_VERSION 6.3.0 diff --git a/src/docs/sphinx/CompleteXMLSchema.rst b/src/docs/sphinx/CompleteXMLSchema.rst index d26baf2b448..7ab5a264d15 100644 --- a/src/docs/sphinx/CompleteXMLSchema.rst +++ b/src/docs/sphinx/CompleteXMLSchema.rst @@ -1039,6 +1039,13 @@ Element: Run .. include:: ../../coreComponents/schema/docs/Run.rst +.. _XML_SeismicityRate: + +Element: SeismicityRate +======================= +.. include:: ../../coreComponents/schema/docs/SeismicityRate.rst + + .. _XML_Silo: Element: Silo @@ -2485,6 +2492,13 @@ Datastructure: Run .. include:: ../../coreComponents/schema/docs/Run_other.rst +.. _DATASTRUCTURE_SeismicityRate: + +Datastructure: SeismicityRate +============================= +.. include:: ../../coreComponents/schema/docs/SeismicityRate_other.rst + + .. _DATASTRUCTURE_Silo: Datastructure: Silo From 44684e108304d0e31fb4048e8a56628a8587fa18 Mon Sep 17 00:00:00 2001 From: acitrain <60715545+acitrain@users.noreply.github.com> Date: Mon, 13 May 2024 18:39:03 +0200 Subject: [PATCH 066/286] Elastic Vertical Transverse Isotropic (VTI) wave solver implementation (#3060) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 + inputFiles/wavePropagation/ElasticVTISEM.ats | 19 ++ .../wavePropagation/elas3D_vti_abc_smoke.xml | 21 ++ .../wavePropagation/elas3D_vti_small_base.xml | 203 ++++++++++++ .../physicsSolvers/CMakeLists.txt | 2 + .../anisotropic/ElasticVTIFields.hpp | 64 ++++ .../ElasticVTIWaveEquationSEMKernel.hpp | 293 ++++++++++++++++++ .../isotropic/ElasticWaveEquationSEM.cpp | 53 +++- .../isotropic/ElasticWaveEquationSEM.hpp | 5 + src/coreComponents/schema/docs/ElasticSEM.rst | 1 + src/coreComponents/schema/schema.xsd | 2 + .../wavePropagationTests/CMakeLists.txt | 1 + .../testWavePropagationElasticVTI.cpp | 248 +++++++++++++++ 14 files changed, 907 insertions(+), 12 deletions(-) create mode 100644 inputFiles/wavePropagation/ElasticVTISEM.ats create mode 100644 inputFiles/wavePropagation/elas3D_vti_abc_smoke.xml create mode 100644 inputFiles/wavePropagation/elas3D_vti_small_base.xml create mode 100644 src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp create mode 100644 src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp create mode 100644 src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 7a314b07075..c2ca9d133b8 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,7 @@ --- baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr2593-4950-bf205af + baseline: integratedTests/baseline_integratedTests-pr3060-4956-54ac336 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index e208367cb45..9e9f73767e9 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3060 (2024-05-13) +====================== + +Rebaselined after addition of elastic VTI wave propagator. + PR #4950 (2024-05-10) ====================== diff --git a/inputFiles/wavePropagation/ElasticVTISEM.ats b/inputFiles/wavePropagation/ElasticVTISEM.ats new file mode 100644 index 00000000000..8be1849a4c3 --- /dev/null +++ b/inputFiles/wavePropagation/ElasticVTISEM.ats @@ -0,0 +1,19 @@ +import os +import geos_ats +from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests + +restartcheck_params = {} +restartcheck_params['atol'] = 0.0001 +restartcheck_params['rtol'] = 2e-05 + +decks = [ + TestDeck( + name="elas3D_vti_abc_smoke", + description='Elastic VTI wave solver, first-order FE, absorbing BC', + partitions=((1, 1, 1), (2, 2, 2)), + restart_step=100, + check_step=200, + restartcheck_params=RestartcheckParameters(**restartcheck_params)) +] + +generate_geos_tests(decks) diff --git a/inputFiles/wavePropagation/elas3D_vti_abc_smoke.xml b/inputFiles/wavePropagation/elas3D_vti_abc_smoke.xml new file mode 100644 index 00000000000..fdee7d173f5 --- /dev/null +++ b/inputFiles/wavePropagation/elas3D_vti_abc_smoke.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/elas3D_vti_small_base.xml b/inputFiles/wavePropagation/elas3D_vti_small_base.xml new file mode 100644 index 00000000000..c4cd9bb5af5 --- /dev/null +++ b/inputFiles/wavePropagation/elas3D_vti_small_base.xml @@ -0,0 +1,203 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index 0e3239d7a19..f73d33a3ab8 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -149,6 +149,8 @@ set( physicsSolvers_headers wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp + wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp + wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp new file mode 100644 index 00000000000..e5834a0a564 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp @@ -0,0 +1,64 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + + +/** + * @file ElasticVTIFields.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICVTIFIELDS_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ELASTICVTIFIELDS_HPP_ + +#include "common/DataLayouts.hpp" +#include "mesh/MeshFields.hpp" + +namespace geos +{ + +namespace fields +{ + +namespace elasticvtifields +{ +DECLARE_FIELD( Delta, + "delta", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Delta thomsen anisotropy parameter" ); + +DECLARE_FIELD( Epsilon, + "epsilon", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Epsilon thomsen anisotropy parameter" ); + +DECLARE_FIELD( Gamma, + "gamma", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Gamma thomsen anisotropy parameter" ); + +} + +} + +} /* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_WAVEPROPAGATION__HPP_ELASTICVTIFIELDS */ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp new file mode 100644 index 00000000000..6fadbf045b7 --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp @@ -0,0 +1,293 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ElasticVTIWaveEquationSEMKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ElasticVTIWaveEquationSEMKERNEL_HPP_ +#define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ElasticVTIWaveEquationSEMKERNEL_HPP_ + +#include "finiteElement/kernelInterface/KernelBase.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp" +#include "ElasticVTIFields.hpp" + +namespace geos +{ +using namespace fields; +/// Namespace to contain the elastic wave kernels. +namespace ElasticVTIWaveEquationSEMKernels +{ + +/** + * @brief Implements kernels for solving the elastic wave equations + * explicit central FD method and SEM in the Vertical Transverse Isotropic (VTI) case + * @copydoc geos::finiteElement::KernelBase + * @tparam SUBREGION_TYPE The type of subregion that the kernel will act on. + * + * ### ElasticVTIWaveEquationSEMKernel Description + * Implements the KernelBase interface functions required for solving + * the acoustic wave equations using the + * "finite element kernel application" functions such as + * geos::finiteElement::RegionBasedKernelApplication. + * + * The number of degrees of freedom per support point for both + * the test and trial spaces are specified as `1`. + */ + + +template< typename SUBREGION_TYPE, + typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +class ExplicitElasticVTISEM : public finiteElement::KernelBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + 1, + 1 > +{ +public: + + /// Alias for the base class; + using Base = finiteElement::KernelBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + 1, + 1 >; + + /// Number of nodes per element...which is equal to the + /// numTestSupportPointPerElem and numTrialSupportPointPerElem by definition. + static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; + + using Base::numDofPerTestSupportPoint; + using Base::numDofPerTrialSupportPoint; + using Base::m_elemsToNodes; + using Base::m_elemGhostRank; + using Base::m_constitutiveUpdate; + using Base::m_finiteElementSpace; + +//***************************************************************************** + /** + * @brief Constructor + * @copydoc geos::finiteElement::KernelBase::KernelBase + * @param nodeManager Reference to the NodeManager object. + * @param edgeManager Reference to the EdgeManager object. + * @param faceManager Reference to the FaceManager object. + * @param targetRegionIndex Index of the region the subregion belongs to. + * @param dt The time interval for the step. + */ + ExplicitElasticVTISEM( NodeManager & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + SUBREGION_TYPE const & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + real64 const dt ): + Base( elementSubRegion, + finiteElementSpace, + inputConstitutiveType ), + m_nodeCoords( nodeManager.getField< fields::referencePosition32 >() ), + m_ux_n( nodeManager.getField< elasticfields::Displacementx_n >() ), + m_uy_n( nodeManager.getField< elasticfields::Displacementy_n >() ), + m_uz_n( nodeManager.getField< elasticfields::Displacementz_n >() ), + m_stiffnessVectorx( nodeManager.getField< elasticfields::StiffnessVectorx >() ), + m_stiffnessVectory( nodeManager.getField< elasticfields::StiffnessVectory >() ), + m_stiffnessVectorz( nodeManager.getField< elasticfields::StiffnessVectorz >() ), + m_density( elementSubRegion.template getField< elasticfields::ElasticDensity >() ), + m_velocityVp( elementSubRegion.template getField< elasticfields::ElasticVelocityVp >() ), + m_velocityVs( elementSubRegion.template getField< elasticfields::ElasticVelocityVs >() ), + m_gamma( elementSubRegion.template getField< elasticvtifields::Gamma >()), + m_epsilon( elementSubRegion.template getField< elasticvtifields::Epsilon >()), + m_delta( elementSubRegion.template getField< elasticvtifields::Delta >()), + m_dt( dt ) + { + GEOS_UNUSED_VAR( edgeManager ); + GEOS_UNUSED_VAR( faceManager ); + GEOS_UNUSED_VAR( targetRegionIndex ); + } + + + + //***************************************************************************** + /** + * @copydoc geos::finiteElement::KernelBase::StackVariables + * + * ### ExplicitElasticVTISEM Description + * Adds a stack arrays for the nodal force, primary displacement variable, etc. + */ + struct StackVariables : Base::StackVariables + { +public: + GEOS_HOST_DEVICE + StackVariables(): + xLocal(), + stiffnessVectorxLocal(), + stiffnessVectoryLocal(), + stiffnessVectorzLocal() + {} + /// C-array stack storage for element local the nodal positions. + real64 xLocal[ 8 ][ 3 ]{}; + real32 stiffnessVectorxLocal[ numNodesPerElem ]; + real32 stiffnessVectoryLocal[ numNodesPerElem ]; + real32 stiffnessVectorzLocal[ numNodesPerElem ]; + real32 Cvti[6]; + + }; + //*************************************************************************** + + + /** + * @copydoc geos::finiteElement::KernelBase::setup + * + * Copies the primary variable, and position into the local stack array. + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const k, + StackVariables & stack ) const + { + for( localIndex a=0; a< 8; a++ ) + { + localIndex const nodeIndex = m_elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( int i=0; i< 3; ++i ) + { + stack.xLocal[ a ][ i ] = m_nodeCoords[ nodeIndex ][ i ]; + } + } + + stack.Cvti[0] = m_density[k] * pow( m_velocityVp[k], 2 ) * (1.0 + 2.0*m_epsilon[k]); + stack.Cvti[1] = m_density[k] * pow( m_velocityVp[k], 2 ); + stack.Cvti[2] = m_density[k] * + sqrt( pow((pow( m_velocityVp[k], + 2 ) - pow( m_velocityVs[k], 2 )), + 2 ) + 2.0 * pow( m_velocityVp[k], 2 ) * m_delta[k] * (pow( m_velocityVp[k], 2 ) - pow( m_velocityVs[k], 2 )) ) - m_density[k] * pow( + m_velocityVs[k], 2 ); + stack.Cvti[3] = m_density[k] * pow( m_velocityVs[k], 2 ); + stack.Cvti[4] = m_density[k] * pow( m_velocityVs[k], 2 )*(1.0 + 2.0 * m_gamma[k]); + stack.Cvti[5] = stack.Cvti[0] - 2.0 * stack.Cvti[4]; + + } + + /** + * @copydoc geos::finiteElement::KernelBase::complete + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + real64 complete( localIndex const k, + StackVariables & stack ) const + { + for( int i=0; i( &m_stiffnessVectorx[ nodeIndex ], stack.stiffnessVectorxLocal[ i ] ); + RAJA::atomicAdd< parallelDeviceAtomic >( &m_stiffnessVectory[ nodeIndex ], stack.stiffnessVectoryLocal[ i ] ); + RAJA::atomicAdd< parallelDeviceAtomic >( &m_stiffnessVectorz[ nodeIndex ], stack.stiffnessVectorzLocal[ i ] ); + } + return 0; + } + + /** + * @copydoc geos::finiteElement::KernelBase::quadraturePointKernel + * + * ### ExplicitElasticVTISEM Description + * Calculates stiffness vector + * + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + void quadraturePointKernel( localIndex const k, + localIndex const q, + StackVariables & stack ) const + { + + m_finiteElementSpace.template computeFirstOrderStiffnessTerm( q, stack.xLocal, [&] ( int i, int j, real64 val, real64 J[3][3], int p, int r ) + { + real32 const Rxx_ij = val*(stack.Cvti[0]*J[p][0]*J[r][0]+stack.Cvti[4]*(J[p][1]*J[r][1])+stack.Cvti[3]*(J[p][2]*J[r][2])); + real32 const Ryy_ij = val*(stack.Cvti[0]*J[p][1]*J[r][1]+stack.Cvti[4]*(J[p][0]*J[r][0])+stack.Cvti[3]*(J[p][2]*J[r][2])); + real32 const Rzz_ij = val*(stack.Cvti[1]*J[p][2]*J[r][2]+stack.Cvti[3]*(J[p][0]*J[r][0]+J[p][1]*J[r][1])); + real32 const Rxy_ij = val*(stack.Cvti[5]*J[p][0]*J[r][1]+stack.Cvti[4]*J[p][1]*J[r][0]); + real32 const Ryx_ij = val*(stack.Cvti[4]*J[p][0]*J[r][1]+stack.Cvti[5]*J[p][1]*J[r][0]); + real32 const Rxz_ij = val*(stack.Cvti[2]*J[p][0]*J[r][2]+stack.Cvti[3]*J[p][2]*J[r][0]); + real32 const Rzx_ij = val*(stack.Cvti[3]*J[p][0]*J[r][2]+stack.Cvti[2]*J[p][2]*J[r][0]); + real32 const Ryz_ij = val*(stack.Cvti[2]*J[p][1]*J[r][2]+stack.Cvti[3]*J[p][2]*J[r][1]); + real32 const Rzy_ij = val*(stack.Cvti[3]*J[p][1]*J[r][2]+stack.Cvti[2]*J[p][2]*J[r][1]); + + real32 const localIncrementx = (Rxx_ij * m_ux_n[m_elemsToNodes( k, j )] + Rxy_ij*m_uy_n[m_elemsToNodes( k, j )] + Rxz_ij*m_uz_n[m_elemsToNodes( k, j )]); + real32 const localIncrementy = (Ryx_ij * m_ux_n[m_elemsToNodes( k, j )] + Ryy_ij*m_uy_n[m_elemsToNodes( k, j )] + Ryz_ij*m_uz_n[m_elemsToNodes( k, j )]); + real32 const localIncrementz = (Rzx_ij * m_ux_n[m_elemsToNodes( k, j )] + Rzy_ij*m_uy_n[m_elemsToNodes( k, j )] + Rzz_ij*m_uz_n[m_elemsToNodes( k, j )]); + + stack.stiffnessVectorxLocal[ i ] += localIncrementx; + stack.stiffnessVectoryLocal[ i ] += localIncrementy; + stack.stiffnessVectorzLocal[ i ] += localIncrementz; + } ); + } + + +protected: + /// The array containing the nodal position array. + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const m_nodeCoords; + + /// The array containing the nodal displacement array in x direction. + arrayView1d< real32 > const m_ux_n; + + /// The array containing the nodal displacement array in y direction. + arrayView1d< real32 > const m_uy_n; + + /// The array containing the nodal displacement array in z direction. + arrayView1d< real32 > const m_uz_n; + + /// The array containing the product of the stiffness matrix and the nodal displacement. + arrayView1d< real32 > const m_stiffnessVectorx; + + /// The array containing the product of the stiffness matrix and the nodal displacement. + arrayView1d< real32 > const m_stiffnessVectory; + + /// The array containing the product of the stiffness matrix and the nodal displacement. + arrayView1d< real32 > const m_stiffnessVectorz; + + /// The array containing the density of the medium + arrayView1d< real32 const > const m_density; + + /// The array containing the P-wavespeed + arrayView1d< real32 const > const m_velocityVp; + + /// The array containing the S-wavespeed + arrayView1d< real32 const > const m_velocityVs; + + ///The array containing the Thomsen constant gamma + arrayView1d< real32 const > const m_gamma; + + ///The array containing the Thomsen constant epsilon + arrayView1d< real32 const > const m_epsilon; + + ///The array containing the Thomsen constant delta + arrayView1d< real32 const > const m_delta; + + /// The time increment for this time integration step. + real64 const m_dt; + + +}; + + +/// The factory used to construct a ExplicitAcousticWaveEquation kernel. +using ExplicitElasticVTISEMFactory = finiteElement::KernelFactory< ExplicitElasticVTISEM, + real64 >; + +} // namespace ElasticVTIWaveEquationSEMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ElasticVTIWaveEquationSEMKERNEL_HPP_ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index a85c110da48..a69eda13635 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -19,6 +19,7 @@ #include "ElasticWaveEquationSEM.hpp" #include "ElasticWaveEquationSEMKernel.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" #include "finiteElement/FiniteElementDiscretization.hpp" @@ -91,6 +92,13 @@ ElasticWaveEquationSEM::ElasticWaveEquationSEM( const std::string & name, setApplyDefaultValue( { 1.0, 1.0, 1.0, 0.0, 0.0, 0.0 } ). setDescription( "Moment of the source: 6 real values describing a symmetric tensor in Voigt notation." "The default value is { 1, 1, 1, 0, 0, 0 } (diagonal moment, corresponding to a pure explosion)." ); + + + registerWrapper( viewKeyStruct::useVtiString(), &m_useVTI ). + setInputFlag( InputFlags::OPTIONAL ). + setSizedFromParent( 0 ). + setApplyDefaultValue( 0 ). + setDescription( "Flag to apply VTI anisotropy. The default is to use isotropic physic." ); } ElasticWaveEquationSEM::~ElasticWaveEquationSEM() @@ -158,6 +166,14 @@ void ElasticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< elasticfields::ElasticVelocityVp >( getName() ); subRegion.registerField< elasticfields::ElasticVelocityVs >( getName() ); subRegion.registerField< elasticfields::ElasticDensity >( getName() ); + + if( m_useVTI ) + { + subRegion.registerField< elasticvtifields::Gamma >( getName() ); + subRegion.registerField< elasticvtifields::Epsilon >( getName() ); + subRegion.registerField< elasticvtifields::Delta >( getName() ); + } + } ); } ); @@ -562,17 +578,32 @@ void ElasticWaveEquationSEM::computeUnknowns( real64 const &, arrayView1d< real32 > const rhsy = nodeManager.getField< elasticfields::ForcingRHSy >(); arrayView1d< real32 > const rhsz = nodeManager.getField< elasticfields::ForcingRHSz >(); - auto kernelFactory = elasticWaveEquationSEMKernels::ExplicitElasticSEMFactory( dt ); - - finiteElement:: - regionBasedKernelApplication< EXEC_POLICY, - constitutive::NullModel, - CellElementSubRegion >( mesh, - regionNames, - getDiscretizationName(), - "", - kernelFactory ); - + if( m_useVTI ) + { + auto kernelFactory = ElasticVTIWaveEquationSEMKernels::ExplicitElasticVTISEMFactory( dt ); + + finiteElement:: + regionBasedKernelApplication< EXEC_POLICY, + constitutive::NullModel, + CellElementSubRegion >( mesh, + regionNames, + getDiscretizationName(), + "", + kernelFactory ); + } + else + { + auto kernelFactory = elasticWaveEquationSEMKernels::ExplicitElasticSEMFactory( dt ); + + finiteElement:: + regionBasedKernelApplication< EXEC_POLICY, + constitutive::NullModel, + CellElementSubRegion >( mesh, + regionNames, + getDiscretizationName(), + "", + kernelFactory ); + } addSourceToRightHandSide( cycleNumber, rhsx, rhsy, rhsz ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp index 834e9783fff..e76302cf908 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp @@ -121,6 +121,8 @@ class ElasticWaveEquationSEM : public WaveSolverBase static constexpr char const * sourceForceString() { return "sourceForce"; } static constexpr char const * sourceMomentString() { return "sourceMoment"; } + static constexpr char const * useVtiString() { return "useVTI"; } + } waveEquationViewKeys; @@ -214,6 +216,9 @@ class ElasticWaveEquationSEM : public WaveSolverBase /// Symmetric tensor describing the moment of the source R2SymTensor m_sourceMoment; + /// Flag to appliy VTI anisotropy + integer m_useVTI; + }; } /* namespace geos */ diff --git a/src/coreComponents/schema/docs/ElasticSEM.rst b/src/coreComponents/schema/docs/ElasticSEM.rst index 6cc28146502..41902f589eb 100644 --- a/src/coreComponents/schema/docs/ElasticSEM.rst +++ b/src/coreComponents/schema/docs/ElasticSEM.rst @@ -28,6 +28,7 @@ targetRegions groupNameRef_array required Allowable r timeSourceDelay real32 -1 Source time delay (1 / f0 by default) timeSourceFrequency real32 0 Central frequency for the time source useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: 1 for strain integration, 2 for displacement difference +useVTI integer 0 Flag to apply VTI anisotropy. The default is to use isotropic physic. LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ============================ ============= ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index b786c16708f..00397845810 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -2758,6 +2758,8 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + diff --git a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt index 18d6ecf1757..aa42e977bfb 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt @@ -4,6 +4,7 @@ set( gtest_geosx_tests testWavePropagationQ2.cpp testWavePropagationElasticFirstOrder.cpp testWavePropagationDAS.cpp + testWavePropagationElasticVTI.cpp testWavePropagationAcousticFirstOrder.cpp ) set( dependencyList ${parallelDeps} gtest ) diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp new file mode 100644 index 00000000000..e6bbf81ce86 --- /dev/null +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp @@ -0,0 +1,248 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2020- GEOSX Contributors + * All right reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// using some utility classes from the following unit test +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" + +#include "common/DataTypes.hpp" +#include "mainInterface/initialization.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" +#include "mainInterface/GeosxState.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp" + +#include + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; + +// This unit test checks the interpolation done to extract seismic traces from a wavefield. +// It computes a seismogram at a receiver co-located with the source and compares it to the surrounding receivers. +char const * xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )xml"; + +class ElasticWaveEquationSEMTest : public ::testing::Test +{ +public: + + ElasticWaveEquationSEMTest(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + +protected: + + void SetUp() override + { + setupProblemFromXML( state.getProblemManager(), xmlInput ); + } + + static real64 constexpr time = 0.0; + static real64 constexpr dt = 1e-1; + static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); + + GeosxState state; + ElasticWaveEquationSEM * propagator; +}; + +real64 constexpr ElasticWaveEquationSEMTest::time; +real64 constexpr ElasticWaveEquationSEMTest::dt; +real64 constexpr ElasticWaveEquationSEMTest::eps; + +TEST_F( ElasticWaveEquationSEMTest, SeismoTrace ) +{ + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + propagator = &state.getProblemManager().getPhysicsSolverManager().getGroup< ElasticWaveEquationSEM >( "elasticSolver" ); + real64 time_n = time; + // run for 1s (10 steps) + for( int i=0; i<10; i++ ) + { + propagator->explicitStepForward( time_n, dt, i, domain, false ); + time_n += dt; + } + // cleanup (triggers calculation of the remaining seismograms data points) + propagator->cleanup( 1.0, 10, 0, 0, domain ); + + // retrieve seismo + arrayView2d< real32 > const dasReceivers = propagator->getReference< array2d< real32 > >( ElasticWaveEquationSEM::viewKeyStruct::dasSignalNp1AtReceiversString() ).toView(); + + // move it to CPU, if needed + dasReceivers.move( hostMemorySpace, false ); + + // check number of seismos and trace length + ASSERT_EQ( dasReceivers.size( 1 ), 10 ); + ASSERT_EQ( dasReceivers.size( 0 ), 11 ); + + // check das content. The signal values cannot be directly checked as the problem is too small. + // Since the basis is linear, check that the seismograms are nonzero (for t>0) and the seismogram at the center is equal + // to the average of the others. + for( int i = 0; i < 11; i++ ) + { + if( i > 0 ) + { + ASSERT_TRUE( std::abs( dasReceivers[i][8] ) > 0 ); + } + double avg = 0; + for( int r=0; r<8; r++ ) + { + avg += dasReceivers[i][r]; + } + avg /= 8.0; + ASSERT_TRUE( std::abs( dasReceivers[i][8] - avg ) < 0.00001 ); + } +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + return result; +} From a1fec52ffe4dfb1c24dab2dc3b93272f211d66f8 Mon Sep 17 00:00:00 2001 From: frankfeifan Date: Mon, 13 May 2024 19:56:08 -0700 Subject: [PATCH 067/286] Add the function to update the pressure gradient in the hybrid solver (#2110) --- .gitmodules | 2 +- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../blaslapack/BlasLapackFunctions.h | 13 ++ .../interfaces/blaslapack/BlasLapackLA.cpp | 61 ++++++++ .../interfaces/blaslapack/BlasLapackLA.hpp | 17 +++ .../unitTests/testBlasLapack.cpp | 47 +++++++ .../fluidFlow/FlowSolverBaseFields.hpp | 8 ++ .../fluidFlow/SinglePhaseBase.cpp | 3 + .../fluidFlow/SinglePhaseBase.hpp | 8 ++ .../fluidFlow/SinglePhaseHybridFVM.cpp | 17 +++ .../fluidFlow/SinglePhaseHybridFVM.hpp | 2 + .../fluidFlow/SinglePhaseHybridFVMKernels.hpp | 130 ++++++++++++++++++ 13 files changed, 312 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index 029ba71a9ab..b3a951ebb50 100644 --- a/.gitmodules +++ b/.gitmodules @@ -12,4 +12,4 @@ url = ../../GEOS-DEV/hdf5_interface.git [submodule "scripts/uberenv"] path = scripts/uberenv - url = ../../LLNL/uberenv.git + url = git@github.com:LLNL/uberenv.git diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index c2ca9d133b8..7756c489c70 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,7 @@ --- baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3060-4956-54ac336 + baseline: integratedTests/baseline_integratedTests-pr2110-4992-9512556 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 9e9f73767e9..311616f1976 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #2110 (2024-05-13) +===================== +new field to store pressure gradient cell-wise. + PR #3060 (2024-05-13) ====================== diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h index 5f61325f69c..fe66dcfc2ce 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h @@ -162,6 +162,19 @@ void GEOS_dgetrs( char const * TRANS, int const * LDB, int * INFO ); +#define GEOS_dgels FORTRAN_MANGLE( dgels ) +void GEOS_dgels( char const * TRANS, + int const * M, + int const * N, + int const * NRHS, + double * A, + int const * LDA, + double * B, + int const * LDB, + double * WORK, + int const * LWORK, + int * INFO ); + } #endif diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp index 31fb564cf89..d05bbf8aef2 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp @@ -349,6 +349,36 @@ void matrixInverse( arraySlice2d< real64 const, USD > const & A, matrixInverse( A, Ainv, detA ); } +template< int USD > +void matrixLeastSquaresSolutionSolve( arraySlice2d< real64, USD > const & A, + arraySlice1d< real64 > const & B, + arraySlice1d< real64 > const & X ) +{ + GEOS_ASSERT_MSG( A.size( 1 ) == X.size() && A.size( 0 ) == B.size(), + "Matrix, unknown vector and rhs vector not compatible" ); + + GEOS_ASSERT_MSG( X.size() <= B.size(), + "Matrix, unknown vector and rhs vector not compatible" ); + + int const M = LvArray::integerConversion< int >( A.size( 0 ) ); + int const N = LvArray::integerConversion< int >( A.size( 1 ) ); + int const NRHS = 1; + + int const LWORK = N + N; + array1d< double > WORK( LWORK ); + + int INFO = 0; + + GEOS_dgels( "N", &M, &N, &NRHS, A.dataIfContiguous(), &M, B.dataIfContiguous(), &M, WORK.data(), &LWORK, &INFO ); + + for( int i = 0; i < N; ++i ) + { + X[i] = B[i]; + } + + GEOS_ERROR_IF( INFO != 0, "The algorithm computing matrix linear system failed to converge." ); +} + } // namespace detail real64 BlasLapackLA::determinant( arraySlice2d< real64 const, MatrixLayout::ROW_MAJOR > const & A ) @@ -911,6 +941,37 @@ void BlasLapackLA::solveLinearSystem( MatRowMajor< real64 const > const & A, solveLinearSystem( AT.toSliceConst(), rhs, solution ); } +void BlasLapackLA::matrixLeastSquaresSolutionSolve( arraySlice2d< real64 const, MatrixLayout::ROW_MAJOR > const & A, + arraySlice1d< real64 const > const & B, + arraySlice1d< real64 > const & X ) +{ + array2d< real64, MatrixLayout::COL_MAJOR_PERM > AT( A.size( 0 ), A.size( 1 ) ); + + // convert A to a row major format + for( int i = 0; i < A.size( 0 ); ++i ) + { + for( int j = 0; j < A.size( 1 ); ++j ) + { + AT( i, j ) = A( i, j ); + } + } + + matrixLeastSquaresSolutionSolve( AT.toSliceConst(), B, X ); +} + +void BlasLapackLA::matrixLeastSquaresSolutionSolve( arraySlice2d< real64 const, MatrixLayout::COL_MAJOR > const & A, + arraySlice1d< real64 const > const & B, + arraySlice1d< real64 > const & X ) +{ + // make a copy of A, since dgels modifies the components in A + array2d< real64, MatrixLayout::COL_MAJOR_PERM > ACOPY( A.size( 0 ), A.size( 1 ) ); + BlasLapackLA::matrixCopy( A, ACOPY ); + + // make a copy of B, since dgels modifies the components in B + array1d< real64 > BCOPY( B.size() ); + BlasLapackLA::vectorCopy( B, BCOPY ); + detail::matrixLeastSquaresSolutionSolve( ACOPY.toSlice(), BCOPY.toSlice(), X ); +} } // end geosx namespace diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp index dbf7eec9f6e..adc72007e49 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp @@ -596,6 +596,23 @@ struct BlasLapackLA static void matrixEigenvalues( MatColMajor< real64 const > const & A, Vec< std::complex< real64 > > const & lambda ); + /** + * @brief Computes the least squares solution of B - AX + * + * @param [in] A GEOSX array2d. + * @param [in] B GEOSX array1d. + * @param [out] X GEOSX array1d. + */ + static void matrixLeastSquaresSolutionSolve( MatRowMajor< real64 const > const & A, + Vec< real64 const > const & B, + Vec< real64 > const & X ); + + /** + * @copydoc matrixLeastSquaresSolutionSolve + */ + static void matrixLeastSquaresSolutionSolve( MatColMajor< real64 const > const & A, + Vec< real64 const > const & B, + Vec< real64 > const & X ); }; } diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp index 8198473c2fc..d819072172a 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp @@ -1139,6 +1139,47 @@ void matrix_svd_test() } } +template< typename LAI > +void matrix_linear_system_least_square_solve_test() +{ + INDEX_TYPE M = 3; + INDEX_TYPE N = 2; + + array2d< real64 > A( M, N ); + array1d< real64 > B( M ); + array1d< real64 > X( N ); + + array1d< real64 > vecResult( N ); + + // Assign component values to A + A( 0, 0 ) = 0.0; + A( 0, 1 ) = 1.0; + A( 1, 0 ) = 1.0; + A( 1, 1 ) = 1.0; + A( 2, 0 ) = 2.0; + A( 2, 1 ) = 1.0; + + // Assign component values to B + B( 0 ) = 6.0; + B( 1 ) = 0.0; + B( 2 ) = 0.0; + + // Compute X + LAI::matrixLeastSquaresSolutionSolve( A, B, X ); + + // Assign component values to the reference solution + vecResult( 0 ) = -3.0; + vecResult( 1 ) = 5.0; + + // Check + for( INDEX_TYPE i = 0; i < N; ++i ) + { + EXPECT_NEAR( vecResult( i ), + X( i ), + machinePrecision ); + } +} + TEST( Array1D, vectorNorm1 ) { vector_norm1_test< BlasLapackLA >(); @@ -1264,6 +1305,12 @@ TEST( DenseLAInterface, matrixSVD ) matrix_svd_test< BlasLapackLA >(); } +TEST( Array2D, matrixLinearSystemSolve ) +{ + matrix_linear_system_least_square_solve_test< BlasLapackLA >(); +} + + int main( int argc, char * * argv ) { ::testing::InitGoogleTest( &argc, argv ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp index 64ca6c6a682..53f7ea8704f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp @@ -88,6 +88,14 @@ DECLARE_FIELD( facePressure_n, NO_WRITE, "Face pressure at the previous converged time step" ); +DECLARE_FIELD( pressureGradient, + "pressureGradient", + array2d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Pressure gradient" ); + DECLARE_FIELD( temperature, "temperature", array1d< real64 >, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 2e0d864eb3f..2a34feff229 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -92,6 +92,9 @@ void SinglePhaseBase::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< dMobility_dTemperature >( getName() ); } + subRegion.registerField< pressureGradient >( getName() ). + reference().resizeDimension< 1 >( 3 ); + } ); FaceManager & faceManager = mesh.getFaceManager(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index 88fc2523de3..3ee103fae33 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -323,6 +323,14 @@ class SinglePhaseBase : public FlowSolverBase */ void computeHydrostaticEquilibrium(); + /** + * @brief Update the cell-wise pressure gradient + */ + virtual void updatePressureGradient( DomainPartition & domain ) + { + GEOS_UNUSED_VAR( domain ); + } + /** * @brief Function to fix the initial state during the initialization step in coupled problems * @param[in] time current time diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index c611af92cff..6215d942f77 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -622,5 +622,22 @@ void SinglePhaseHybridFVM::resetStateToBeginningOfStep( DomainPartition & domain } ); } +void SinglePhaseHybridFVM::updatePressureGradient( DomainPartition & domain ) +{ + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + FaceManager & faceManager = mesh.getFaceManager(); + + mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, + auto & subRegion ) + { + singlePhaseHybridFVMKernels::AveragePressureGradientKernelFactory::createAndLaunch< parallelHostPolicy >( subRegion, + faceManager ); + } ); + } ); +} + REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseHybridFVM, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp index 7ba6c5d6dd6..65ceae5786e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp @@ -156,6 +156,8 @@ class SinglePhaseHybridFVM : public SinglePhaseBase real64 const & dt, DomainPartition & domain ) override; + virtual void updatePressureGradient( DomainPartition & domain ) override final; + /** * @brief Function to perform the application of Dirichlet BCs on faces * @param[in] time_n current time diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp index 4c6bc274f4c..f6c59f63df9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp @@ -30,6 +30,8 @@ #include "finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp" #include "finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp" #include "finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp" +#include "linearAlgebra/interfaces/InterfaceTypes.hpp" +#include "denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp" #include "mesh/MeshLevel.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp" @@ -43,6 +45,7 @@ namespace geos namespace singlePhaseHybridFVMKernels { +/******************************** AssemblerKernelHelper ********************************/ /******************************** Kernel switches ********************************/ namespace internal @@ -81,6 +84,133 @@ void kernelLaunchSelectorFaceSwitch( T value, LAMBDA && lambda ) } // namespace internal +/******************************** AveragePressureGradientKernel ********************************/ + +template< integer NUM_FACES > +class AveragePressureGradientKernel +{ +public: + AveragePressureGradientKernel( CellElementSubRegion & subRegion, + FaceManager const & faceManager ) + : + // get the face-centered pressures + m_facePressure( faceManager.getField< fields::flow::facePressure >() ), + m_faceCenter( faceManager.faceCenter() ), + m_pres( subRegion.template getField< fields::flow::pressure >() ), + m_elemCenter( subRegion.getElementCenter() ), + m_elemsToFaces( subRegion.faceList() ), + m_presGradient( subRegion.template getField< fields::flow::pressureGradient >() ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables + { + + GEOS_HOST_DEVICE + StackVariables(): + coordinates( NUM_FACES+1, 4 ), + pressures( NUM_FACES+1 ), + presGradientLocal( 4 ) + {} + + stackArray2d< real64, (NUM_FACES + 1) * 4 > coordinates; + stackArray1d< real64, NUM_FACES + 1 > pressures; + stackArray1d< real64, 4 > presGradientLocal; + }; + + + inline + void compute( localIndex const elemIndex, + StackVariables stack ) const + { + + for( integer dim=0; dim<3; ++dim ) + { + stack.coordinates( 0, dim ) = m_elemCenter( elemIndex, dim ); + } + stack.coordinates( 0, 3 ) = 1.0; + stack.pressures[0] = m_pres[elemIndex]; + + for( integer fi=0; fi + static void + launch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + + forAll< POLICY >( numElems, [=] ( localIndex const ei ) + { + typename KERNEL_TYPE::StackVariables stack; + kernelComponent.compute( ei, stack ); + } ); + } + +private: + /// face pressure + arrayView1d< real64 const > const m_facePressure; + + /// the face center coordinates + arrayView2d< real64 const > const m_faceCenter; + + /// the cell-centered pressures + arrayView1d< real64 const > const m_pres; + + /// the cell center coordinates + arrayView2d< real64 const > const m_elemCenter; + + /// the elements to faces map + arrayView2d< localIndex const > const m_elemsToFaces; + + /// pressure gradient in the cell + arrayView2d< real64 > const m_presGradient; + +}; + +class AveragePressureGradientKernelFactory +{ +public: + + template< typename POLICY > + static void createAndLaunch( CellElementSubRegion & subRegion, + FaceManager const & faceManager ) + { + internal::kernelLaunchSelectorFaceSwitch( subRegion.numFacesPerElement(), [&] ( auto NUM_FACES ) + { + AveragePressureGradientKernel< NUM_FACES > kernel( subRegion, faceManager ); + AveragePressureGradientKernel< NUM_FACES >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } +}; + + /******************************** ElementBasedAssemblyKernel ********************************/ /** From db7cc5d62fa962a56a0eda5d3d27f8fa5ef36db2 Mon Sep 17 00:00:00 2001 From: TotoGaz <49004943+TotoGaz@users.noreply.github.com> Date: Tue, 14 May 2024 09:48:43 -0700 Subject: [PATCH 068/286] Fix missing const for `int` conversion of `CommID` (#3122) --- src/coreComponents/mesh/mpiCommunications/CommID.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/mesh/mpiCommunications/CommID.hpp b/src/coreComponents/mesh/mpiCommunications/CommID.hpp index 143e55eb18c..7c904234f07 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommID.hpp +++ b/src/coreComponents/mesh/mpiCommunications/CommID.hpp @@ -59,7 +59,7 @@ class CommID CommID & operator=( CommID && ) = delete; /// user defined conversion operator to int - constexpr operator int() + constexpr operator int() const { return m_id; } private: From 728edb976c6d60ed111aa31c0240be737ab1ddfe Mon Sep 17 00:00:00 2001 From: TotoGaz <49004943+TotoGaz@users.noreply.github.com> Date: Tue, 14 May 2024 16:18:54 -0700 Subject: [PATCH 069/286] Upgrade the version of `plantuml` (#3124) - directly use the official binaries instead of the ubuntu package - upgrade the readthedocs ubuntu image to 22.04 --- .readthedocs.yml | 8 ++++++-- src/conf.py | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index 55160e32db1..16bd2dc1fc5 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -4,10 +4,12 @@ version: 2 build: - os: "ubuntu-20.04" + os: "ubuntu-22.04" apt_packages: + - curl + - graphviz - npm - - plantuml + - openjdk-21-jre-headless - texlive tools: nodejs: "16" @@ -16,6 +18,8 @@ build: post_install: - npm install -g npm@9.8.1 - npm install -g @mermaid-js/mermaid-cli@10.3.1 + # If you change the `/tmp/plantuml.jar` path, be sure to also update where this path is used as well (e.g. in `conf.py`). + - curl -fsSL https://github.com/plantuml/plantuml/releases/download/v1.2024.3/plantuml-gplv2-1.2024.3.jar -o /tmp/plantuml.jar # Set requirements to build the docs python: diff --git a/src/conf.py b/src/conf.py index 99989855bd3..f27f7843963 100644 --- a/src/conf.py +++ b/src/conf.py @@ -112,7 +112,7 @@ 'sphinxcontrib.programoutput' ] -plantuml = "/usr/bin/plantuml" +plantuml = "/usr/bin/java -Djava.awt.headless=true -jar /tmp/plantuml.jar" plantuml_output_format = "svg_img" plot_html_show_source_link = True From 7ace2fcd4221d2fb7e1001f3e0886157bca70e95 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 15 May 2024 17:50:27 -0700 Subject: [PATCH 070/286] changed uberenv repo to relative path (#3127) --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index b3a951ebb50..029ba71a9ab 100644 --- a/.gitmodules +++ b/.gitmodules @@ -12,4 +12,4 @@ url = ../../GEOS-DEV/hdf5_interface.git [submodule "scripts/uberenv"] path = scripts/uberenv - url = git@github.com:LLNL/uberenv.git + url = ../../LLNL/uberenv.git From 07d1ce32b44790ac682ea174bd615ecdc81e0a3e Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Fri, 17 May 2024 12:39:03 -0500 Subject: [PATCH 071/286] Register pressureGradient only for hybrid FVM (single phase) (#3125) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 ++++ .../fluidFlow/CompositionalMultiphaseBase.cpp | 2 ++ .../physicsSolvers/fluidFlow/SinglePhaseBase.cpp | 4 ---- .../fluidFlow/SinglePhaseHybridFVM.cpp | 16 ++++++++++++++++ 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 7756c489c70..a84e426153e 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,7 @@ --- baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr2110-4992-9512556 + baseline: integratedTests/baseline_integratedTests-pr3125-5101-7764ffb allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 311616f1976..ba258828e45 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3125 (2024-05-16) +===================== +Remove field to store pressure gradient cell-wise for solvers that don't need it. + PR #2110 (2024-05-13) ===================== new field to store pressure gradient cell-wise. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 8656844b04c..ea290977c92 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -363,8 +363,10 @@ void CompositionalMultiphaseBase::registerDataOnMesh( Group & meshBodies ) reference().resizeDimension< 1 >( m_numPhases ); subRegion.registerField< compAmount >( getName() ). + setDimLabels( 1, fluid.componentNames() ). reference().resizeDimension< 1 >( m_numComponents ); subRegion.registerField< compAmount_n >( getName() ). + setDimLabels( 1, fluid.componentNames() ). reference().resizeDimension< 1 >( m_numComponents ); } ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 2a34feff229..92918f5a010 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -91,10 +91,6 @@ void SinglePhaseBase::registerDataOnMesh( Group & meshBodies ) { subRegion.registerField< dMobility_dTemperature >( getName() ); } - - subRegion.registerField< pressureGradient >( getName() ). - reference().resizeDimension< 1 >( 3 ); - } ); FaceManager & faceManager = mesh.getFaceManager(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 6215d942f77..984fbbc4786 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -56,10 +56,26 @@ SinglePhaseHybridFVM::SinglePhaseHybridFVM( const string & name, void SinglePhaseHybridFVM::registerDataOnMesh( Group & meshBodies ) { + using namespace fields::flow; // 1) Register the cell-centered data SinglePhaseBase::registerDataOnMesh( meshBodies ); + // pressureGradient is specific for HybridFVM + forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + elemManager.forElementSubRegions< ElementSubRegionBase >( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + subRegion.registerField< pressureGradient >( getName() ). + reference().resizeDimension< 1 >( 3 ); + } ); + } ); + // 2) Register the face data meshBodies.forSubGroups< MeshBody >( [&] ( MeshBody & meshBody ) { From d3783ad15edb16510fed6f4eef214e01ff14ffde Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Fri, 17 May 2024 18:00:02 -0700 Subject: [PATCH 072/286] Modified label used to run cuda jobs (#3131) --- .github/workflows/ci_tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 14a7958a75c..386bb1ac00c 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -238,7 +238,7 @@ jobs: GCP_BUCKET: geosx/ubuntu22.04-gcc11 RUNS_ON: Runner_4core_16GB - # If the 'ci: ready to be merged' PR label is found, the cuda jobs run immediately along side linux jobs. + # If the 'ci: run CUDA builds' PR label is found, the cuda jobs run immediately along side linux jobs. # Note: CUDA jobs should only be run if PR is ready to merge. cuda_builds: name: ${{ matrix.name }} @@ -320,7 +320,7 @@ jobs: HOST_CONFIG: ${{ matrix.HOST_CONFIG }} NPROC: ${{ matrix.NPROC }} RUNS_ON: ${{ matrix.RUNS_ON }} - REQUIRED_LABEL: "ci: ready to be merged" + REQUIRED_LABEL: "ci: run CUDA builds" secrets: inherit # Convenience job - passes when all other jobs have passed (must pass the CUDA jobs). From 85f6d0c3defbb552331f658baae8a18c67a9b800 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Wed, 29 May 2024 18:24:00 -0700 Subject: [PATCH 073/286] Store baselines locally on streak2. (#3141) --- .github/workflows/build_and_test.yml | 84 +++++++++++++++---- .github/workflows/ci_tests.yml | 2 +- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../Sneddon_embeddedFrac_base.xml | 3 +- scripts/ci_build_and_test_in_container.sh | 8 +- src/CMakeLists.txt | 4 +- 7 files changed, 81 insertions(+), 26 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 4b57484ceac..4824e37d2a7 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -54,9 +54,6 @@ on: RUNS_ON: required: true type: string - UPLOAD_BASELINES: - required: false - type: string USE_SCCACHE: required: false type: boolean @@ -64,6 +61,9 @@ on: REQUIRED_LABEL: required: false type: string + LOCAL_BASELINE_DIR: + required: false + type: string secrets: GOOGLE_CLOUD_GCP: required: false @@ -142,7 +142,7 @@ jobs: SHORT_COMMIT=${COMMIT:0:7} script_args+=(--install-dir-basename GEOSX-${SHORT_COMMIT}) - # All the data exchanged with the docker container is eventually meant to be send to the cloud. + # All the data exchanged with the docker container is eventually meant to be sent to the cloud. if [[ ! -z "${{ inputs.GCP_BUCKET }}" ]]; then if [ "${{ inputs.BUILD_TYPE }}" = "build" ]; then DATA_BASENAME=GEOSX-and-TPL-${SHORT_COMMIT}.tar.gz @@ -205,6 +205,45 @@ jobs: script_args+=(--code-coverage) fi + if [[ -n "${{ inputs.LOCAL_BASELINE_DIR }}" ]]; then + # Extract the 'baseline' value + + # Define the path to the YAML file + YAML_FILE_PATH="${GITHUB_WORKSPACE}/.integrated_tests.yaml" + + # Verify the YAML file path + if [[ ! -f "${YAML_FILE_PATH}" ]]; then + echo "Error: File $YAML_FILE_PATH does not exist." + else + echo "Found integratedTests file: $YAML_FILE_PATH." + fi + + # Extract the baseline field + BASELINE_FULL_PATH=$(grep -A 2 'baselines:' "${YAML_FILE_PATH}" | grep 'baseline:' | awk '{print $2}') + + # Remove the 'integratedTests/' prefix + BASELINE_TAG=${BASELINE_FULL_PATH#integratedTests/} + echo "Baseline: ${BASELINE_TAG}" + + # Extract the folder name + PR_NUMBER=$(echo "$BASELINE_TAG" | grep -o 'pr[0-9]*') + PR_BASELINE_FOLDER_NAME=baselines_${PR_NUMBER} + echo "Baseline folder name: ${PR_BASELINE_FOLDER_NAME}" + + CURRENT_BASELINE_DIR=${{ inputs.LOCAL_BASELINE_DIR }}/${PR_BASELINE_FOLDER_NAME} + echo "Current baseline dir: ${CURRENT_BASELINE_DIR}" + + if [ -d ${CURRENT_BASELINE_DIR} ];then + echo "Current baseline dir found." + ls -l ${CURRENT_BASELINE_DIR} + + # We defined a mount point and mount it read-only inside the container. + CURRENT_BASELINE_DIR_MOUNT=/tmp/geos/baselines + docker_args+=(--volume=${CURRENT_BASELINE_DIR}:${CURRENT_BASELINE_DIR_MOUNT}:ro) + else + echo "Current baselines directory (${CURRENT_BASELINE_DIR}) not found" + fi + fi echo running "docker run \ ${docker_args[@]} \ @@ -241,22 +280,33 @@ jobs: echo "Download integrated test logs here: https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/test_logs_${DATA_BASENAME}" fi - # if $UPLOAD_BASELINES; then - if [ -f ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} ];then - CLOUDSDK_PYTHON=python3 gsutil cp -a public-read ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} gs://${{ inputs.GCP_BUCKET }}/ - echo "Download test baselines here: https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/baseline_${DATA_BASENAME}" - echo "New baseline ID: baseline_${DATA_BASENAME::-7}" - else - echo "Baselines ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} were not uploaded. Likeyly because no rebaseline was necessary." + if [ -f ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} ];then + + if [[ -n "${{ inputs.LOCAL_BASELINE_DIR }}" ]]; then + # 1. We copy the baselines to a local directory to store them + + # 1.a Create the new target directory to store the new baselines + THIS_PR_NUMBER=pr${{ github.event.number }} + NEW_PR_BASELINE_FOLDER_NAME=baselines_${THIS_PR_NUMBER} + TARGET_DIR="${{ inputs.LOCAL_BASELINE_DIR }}/${NEW_PR_BASELINE_FOLDER_NAME}" + echo "Create folder ${TARGET_DIR}" + mkdir -p "${TARGET_DIR}" + + # 1.b We copy the new baselines to the new target directory + SOURCE_FILE="${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME}" + echo "Copy ${SOURCE_FILE} to ${TARGET_DIR}" + cp "${SOURCE_FILE}" "${TARGET_DIR}" fi - # fi + + # 2. We push the baselines to the cloud + CLOUDSDK_PYTHON=python3 gsutil cp -a public-read ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} gs://${{ inputs.GCP_BUCKET }}/ + echo "Download test baselines here: https://storage.googleapis.com/${{ inputs.GCP_BUCKET }}/baseline_${DATA_BASENAME}" + echo "New baseline ID: baseline_${DATA_BASENAME::-7}" + else + echo "Baselines ${DATA_EXCHANGE_DIR}/baseline_${DATA_BASENAME} were not uploaded. Likeyly because no rebaseline was necessary." + fi fi fi - - # manually remove the workspace to avoid issues with the next job when using self-hosted runners - if [ -d "${GITHUB_WORKSPACE}/integratedTests" ]; then - rm -rf ${GITHUB_WORKSPACE}/integratedTests - fi exit ${EXIT_STATUS} diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 386bb1ac00c..197dcf0f078 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -205,7 +205,7 @@ jobs: DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" DOCKER_CERTS_UPDATE_COMMAND: "update-ca-certificates" REQUIRED_LABEL: "ci: run integrated tests" - UPLOAD_BASELINES: "ci: upload test baselines" + LOCAL_BASELINE_DIR: /data/GEOS/baselines baseline_log: needs: [is_not_draft_pull_request] diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index a84e426153e..0670c7fdaab 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,7 @@ --- baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3125-5101-7764ffb + baseline: integratedTests/baseline_integratedTests-pr3141-5289-995723a allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index ba258828e45..634ef60e147 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3141 (2024-05-28) +===================== +Test cashing baselines locally. + PR #3125 (2024-05-16) ===================== Remove field to store pressure gradient cell-wise for solvers that don't need it. diff --git a/inputFiles/efemFractureMechanics/Sneddon_embeddedFrac_base.xml b/inputFiles/efemFractureMechanics/Sneddon_embeddedFrac_base.xml index 354cc55e5b4..5ff5c97f6fc 100644 --- a/inputFiles/efemFractureMechanics/Sneddon_embeddedFrac_base.xml +++ b/inputFiles/efemFractureMechanics/Sneddon_embeddedFrac_base.xml @@ -105,7 +105,8 @@ + format="binary" + plotFileRoot="sneddon_embFrac"/> Date: Fri, 31 May 2024 13:16:55 -0700 Subject: [PATCH 074/286] Spatially-varying grain bulk modulus within a region. (#3050) --- .integrated_tests.yaml | 3 +- BASELINE_NOTES.md | 4 +++ ...kgdToughnessDominated_poroelastic_base.xml | 2 +- ...kgdViscosityDominated_poroelastic_base.xml | 2 +- ...pedToughnessDominated_poroelastic_base.xml | 2 +- ...pedViscosityDominated_poroelastic_base.xml | 2 +- ...pknViscosityDominated_poroelastic_base.xml | 2 +- .../SeismicityRate_poromechanics_1d_smoke.xml | 2 +- .../PoroDelftEggWellbore_base.xml | 2 +- .../PoroDruckerPragerWellbore_base.xml | 2 +- .../PoroElasticWellbore_base.xml | 2 +- .../poromechanics/PoroElastic_Mandel_base.xml | 2 +- .../PoroElastic_Mandel_prism6_base_hybrid.xml | 2 +- .../PoroElastic_Terzaghi_base_direct.xml | 2 +- .../PoroElastic_Terzaghi_base_iterative.xml | 2 +- .../PoroElastic_deadoil_3ph_baker_2d_base.xml | 2 +- .../poromechanics/PoroElastic_gravity.xml | 2 +- .../PoroElastic_hybridHexPrism_co2_base.xml | 2 +- .../PoroElastic_staircase_co2_3d_base.xml | 4 +-- ...oElastic_staircase_singlephase_3d_base.xml | 4 +-- .../PoroModifiedCamClayWellbore_base.xml | 2 +- .../PoroViscoDruckerPrager_base.xml | 2 +- .../PoroViscoExtendedDruckerPrager_base.xml | 2 +- .../PoroViscoModifiedCamClay_base.xml | 2 +- .../poromechanics/faultPoroelastic_base.xml | 2 +- .../smallEggModel/smallEggModel.xml | 2 +- .../validationCase/validationCase.xml | 4 +-- ...ayPermeability_conformingFracture_base.xml | 2 +- ...ExponentialDecayPermeability_edfm_base.xml | 2 +- ...c_conformingFracture_2d_faultSlip_base.xml | 2 +- ...conformingFracture_2d_openingFrac_base.xml | 2 +- .../PoroElastic_efem-edfm_base.xml | 2 +- .../PoroElastic_efem-edfm_eggModel_large.xml | 2 +- .../PoroElastic_efem-edfm_eggModel_small.xml | 2 +- .../PoroElastic_efem-edfm_pennyCrack_base.xml | 2 +- ...lastic_efem-edfm_pressurizedFrac_smoke.xml | 2 +- .../SlipPermeability_embeddedFrac.xml | 2 +- .../SlipPermeability_pEDFM_base.xml | 2 +- ...lisRichardsPermeability_efem-edfm_base.xml | 2 +- .../ThermoPoroElastic_consolidation_base.xml | 2 +- .../ThermoPoroElastic_staircase_co2_smoke.xml | 4 +-- .../ThermoPoroElastic_base.xml | 2 +- ...moPoroElastic_efem-edfm_eggModel_small.xml | 2 +- ...asticWellbore_ImperfectInterfaces_base.xml | 6 ++-- .../CasedThermoElasticWellbore_base.xml | 6 ++-- ...iatedPoroElasticWellbore_Drilling_base.xml | 2 +- ...atedPoroElasticWellbore_Injection_base.xml | 2 +- .../ThermoPoroElasticWellbore_base.xml | 2 +- .../constitutive/solid/CoupledSolidBase.hpp | 2 +- .../constitutive/solid/PorousSolid.cpp | 6 ++++ .../constitutive/solid/PorousSolid.hpp | 7 +++- .../solid/porosity/BiotPorosity.cpp | 16 +++++++-- .../solid/porosity/BiotPorosity.hpp | 33 ++++++++++++------- .../solid/porosity/PorosityFields.hpp | 10 +++++- .../schema/docs/BiotPorosity.rst | 2 +- .../schema/docs/BiotPorosity_other.rst | 1 + src/coreComponents/schema/schema.xsd | 4 +-- src/coreComponents/schema/schema.xsd.other | 2 ++ .../Contributing/IntegratedTests.rst | 18 +++++----- 59 files changed, 131 insertions(+), 85 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 0670c7fdaab..5c56e1c922f 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,6 @@ ---- baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3141-5289-995723a + baseline: integratedTests/baseline_integratedTests-pr3050-5325-9f50d94 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 634ef60e147..7c366a17b31 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3050 (2024-05-20) +===================== +Spatially varying grain bulk modulus. Rebaseline of all poromechanics cases needed. + PR #3141 (2024-05-28) ===================== Test cashing baselines locally. diff --git a/inputFiles/hydraulicFracturing/kgdToughnessDominated_poroelastic_base.xml b/inputFiles/hydraulicFracturing/kgdToughnessDominated_poroelastic_base.xml index e7296af5629..2aba63788b4 100644 --- a/inputFiles/hydraulicFracturing/kgdToughnessDominated_poroelastic_base.xml +++ b/inputFiles/hydraulicFracturing/kgdToughnessDominated_poroelastic_base.xml @@ -91,7 +91,7 @@ diff --git a/inputFiles/poromechanics/PoroElastic_gravity.xml b/inputFiles/poromechanics/PoroElastic_gravity.xml index 54aacf9ee1f..ce1a82c80c6 100644 --- a/inputFiles/poromechanics/PoroElastic_gravity.xml +++ b/inputFiles/poromechanics/PoroElastic_gravity.xml @@ -110,7 +110,7 @@ diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base.xml index 14f540a6a30..c2aea226cf6 100755 --- a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base.xml @@ -113,7 +113,7 @@ permeabilityComponents="{ 9.8e-13, 9.8e-13, 9.8e-13 }"/> diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base.xml index bea4a79c816..3b25c03e021 100755 --- a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base.xml +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base.xml @@ -110,7 +110,7 @@ permeabilityComponents="{ 9.8e-13, 9.8e-13, 9.8e-13 }"/> diff --git a/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml b/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml index 9f005e4fc44..39e5a33f29a 100644 --- a/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml +++ b/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml @@ -40,7 +40,7 @@ /> diff --git a/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml b/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml index a8259a6e66d..caf219bb716 100755 --- a/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml +++ b/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml @@ -202,7 +202,7 @@ diff --git a/inputFiles/poromechanics/nonlinearAcceleration/validationCase/validationCase.xml b/inputFiles/poromechanics/nonlinearAcceleration/validationCase/validationCase.xml index e307a69edcf..9b460dbba01 100755 --- a/inputFiles/poromechanics/nonlinearAcceleration/validationCase/validationCase.xml +++ b/inputFiles/poromechanics/nonlinearAcceleration/validationCase/validationCase.xml @@ -241,7 +241,7 @@ permeabilityComponents="{ 9.869233e-14, 9.869233e-14, 9.869233e-15 }"/> diff --git a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml index 9f47a0127e8..0a1704fd9c5 100644 --- a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml +++ b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml @@ -120,7 +120,7 @@ diff --git a/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml b/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml index 4a570a3d38f..c292cd722a6 100644 --- a/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml +++ b/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml @@ -161,7 +161,7 @@ permeabilityComponents="{ 9.8e-13, 9.8e-13, 9.8e-13 }"/> @@ -182,7 +182,7 @@ permeabilityComponents="{ 9.8e-16, 9.8e-16, 9.8e-16 }"/> diff --git a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml index dd727469509..c44c9d3baec 100644 --- a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml +++ b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml @@ -43,7 +43,7 @@ + defaultGrainBulkModulus="159.4202899e9"/> + defaultGrainBulkModulus="2.298850575e9"/> + defaultGrainBulkModulus="5.535714286e9"/> diff --git a/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml b/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml index 133d834fdd3..4486857c364 100644 --- a/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml +++ b/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml @@ -94,17 +94,17 @@ + defaultGrainBulkModulus="159.4202899e9"/> + defaultGrainBulkModulus="2.298850575e9"/> + defaultGrainBulkModulus="5.535714286e9"/> diff --git a/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml b/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml index 5d6697daa66..787e7e42b5b 100644 --- a/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml +++ b/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml @@ -75,7 +75,7 @@ diff --git a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp index 35306907a4e..cea3367d3e6 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp +++ b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp @@ -202,7 +202,7 @@ class CoupledSolidBase : public ConstitutiveBase /** * @brief initialize the constitutive models fields. */ - void initializeState() const + virtual void initializeState() const { getBasePorosityModel().initializeState(); getBasePermModel().initializeState(); diff --git a/src/coreComponents/constitutive/solid/PorousSolid.cpp b/src/coreComponents/constitutive/solid/PorousSolid.cpp index ed9cadb7bca..f427e523873 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.cpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.cpp @@ -46,6 +46,12 @@ PorousSolid< SOLID_TYPE >::PorousSolid( string const & name, Group * const paren template< typename SOLID_TYPE > PorousSolid< SOLID_TYPE >::~PorousSolid() = default; +template< typename SOLID_TYPE > +void PorousSolid< SOLID_TYPE >::initializeState() const +{ + CoupledSolid< SOLID_TYPE, BiotPorosity, ConstantPermeability >::initializeState(); +} + // Register all PorousSolid model types. typedef PorousSolid< ElasticIsotropic > PorousElasticIsotropic; typedef PorousSolid< ElasticTransverseIsotropic > PorousElasticTransverseIsotropic; diff --git a/src/coreComponents/constitutive/solid/PorousSolid.hpp b/src/coreComponents/constitutive/solid/PorousSolid.hpp index 078ca36ce7d..154f047692c 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.hpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.hpp @@ -127,7 +127,7 @@ class PorousSolidUpdates : public CoupledSolidUpdates< SOLID_TYPE, BiotPorosity, } // Save the derivative of solid density wrt pressure for the computation of the body force - dSolidDensity_dPressure = m_porosityUpdate.dGrainDensity_dPressure(); + dSolidDensity_dPressure = m_porosityUpdate.dGrainDensity_dPressure( k ); } GEOS_HOST_DEVICE @@ -367,6 +367,11 @@ class PorousSolid : public CoupledSolid< SOLID_TYPE, BiotPorosity, ConstantPerme getPermModel() ); } + /** + * @brief initialize the constitutive models fields. + */ + virtual void initializeState() const override final; + /** * @brief Const/non-mutable accessor for density * @return Accessor diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp index 861bfed8fe5..ec781ad0d8f 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp @@ -18,6 +18,7 @@ #include "BiotPorosity.hpp" #include "PorosityFields.hpp" +#include "constitutive/solid/SolidBase.hpp" namespace geos { @@ -31,8 +32,9 @@ namespace constitutive BiotPorosity::BiotPorosity( string const & name, Group * const parent ): PorosityBase( name, parent ) { - registerWrapper( viewKeyStruct::grainBulkModulusString(), &m_grainBulkModulus ). + registerWrapper( viewKeyStruct::defaultGrainBulkModulusString(), &m_defaultGrainBulkModulus ). setInputFlag( InputFlags::REQUIRED ). + setApplyDefaultValue( -1.0 ). setDescription( "Grain bulk modulus" ); registerWrapper( viewKeyStruct::defaultThermalExpansionCoefficientString(), &m_defaultThermalExpansionCoefficient ). @@ -46,8 +48,12 @@ BiotPorosity::BiotPorosity( string const & name, Group * const parent ): setDescription( "Flag enabling uniaxial approximation in fixed stress update" ); registerField( fields::porosity::biotCoefficient{}, &m_biotCoefficient ). - setApplyDefaultValue( 1.0 ); // this is useful for sequential simulations, for the first flow solve - // ultimately, we want to be able to load the biotCoefficient from input directly, and this won't be necessary anymore + setApplyDefaultValue( 1.0 ). + setDescription( "Biot coefficient" ); + + registerField( fields::porosity::grainBulkModulus{}, &m_grainBulkModulus ). + setApplyDefaultValue( -1.0 ). + setDescription( "Grain Bulk modulus." ); registerField( fields::porosity::thermalExpansionCoefficient{}, &m_thermalExpansionCoefficient ); @@ -78,6 +84,10 @@ void BiotPorosity::postProcessInput() getWrapper< array1d< real64 > >( fields::porosity::thermalExpansionCoefficient::key() ). setApplyDefaultValue( m_defaultThermalExpansionCoefficient ); + + // set results as array default values + getWrapper< array1d< real64 > >( fields::porosity::grainBulkModulus::key() ). + setApplyDefaultValue( m_defaultGrainBulkModulus ); } void BiotPorosity::initializeState() const diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp index 4d64b0d9416..a6ae9e38815 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp @@ -56,7 +56,7 @@ class BiotPorosityUpdates : public PorosityBaseUpdates arrayView1d< real64 > const & averageMeanTotalStressIncrement_k, arrayView1d< real64 > const & bulkModulus, arrayView1d< real64 > const & shearModulus, - real64 const & grainBulkModulus, + arrayView1d< real64 > const & grainBulkModulus, integer const useUniaxialFixedStress ): PorosityBaseUpdates( newPorosity, porosity_n, dPorosity_dPressure, @@ -77,10 +77,10 @@ class BiotPorosityUpdates : public PorosityBaseUpdates real64 getBiotCoefficient( localIndex const k ) const { return m_biotCoefficient[k]; } GEOS_HOST_DEVICE - real64 getGrainBulkModulus() const { return m_grainBulkModulus; } + real64 getGrainBulkModulus( localIndex const k ) const { return m_grainBulkModulus[k]; } GEOS_HOST_DEVICE - real64 dGrainDensity_dPressure() const { return 1.0 / m_grainBulkModulus; } + real64 dGrainDensity_dPressure( localIndex const k ) const { return 1.0 / m_grainBulkModulus[k]; } GEOS_HOST_DEVICE void updateFromPressureTemperatureAndStrain( localIndex const k, @@ -92,7 +92,7 @@ class BiotPorosityUpdates : public PorosityBaseUpdates real64 & dPorosity_dPressure, real64 & dPorosity_dTemperature ) const { - real64 const biotSkeletonModulusInverse = (m_biotCoefficient[k] - m_referencePorosity[k]) / m_grainBulkModulus; + real64 const biotSkeletonModulusInverse = (m_biotCoefficient[k] - m_referencePorosity[k]) / m_grainBulkModulus[k]; real64 const porosityThermalExpansion = 3 * m_thermalExpansionCoefficient[k] * ( m_biotCoefficient[k] - m_referencePorosity[k] ); real64 const porosity = m_porosity_n[k][q] @@ -123,9 +123,10 @@ class BiotPorosityUpdates : public PorosityBaseUpdates real64 const & thermalExpansionCoefficient, real64 const & averageMeanTotalStressIncrement_k, real64 const & bulkModulus, - real64 const & fixedStressModulus ) const + real64 const & fixedStressModulus, + real64 const & grainBulkModulus ) const { - real64 const biotSkeletonModulusInverse = (biotCoefficient - referencePorosity) / m_grainBulkModulus; + real64 const biotSkeletonModulusInverse = (biotCoefficient - referencePorosity) / grainBulkModulus; real64 const porosityThermalExpansion = 3 * thermalExpansionCoefficient * ( biotCoefficient - referencePorosity ); real64 const pressureCoefficient = biotCoefficient * biotCoefficient / bulkModulus; real64 const temperatureCoefficient = 3 * biotCoefficient * thermalExpansionCoefficient; @@ -175,7 +176,8 @@ class BiotPorosityUpdates : public PorosityBaseUpdates m_thermalExpansionCoefficient[k], m_averageMeanTotalStressIncrement_k[k], m_bulkModulus[k], - fixedStressModulus ); + fixedStressModulus, + m_grainBulkModulus[k] ); } GEOS_HOST_DEVICE @@ -184,7 +186,8 @@ class BiotPorosityUpdates : public PorosityBaseUpdates { m_bulkModulus[k] = bulkModulus; m_shearModulus[k] = shearModulus; - m_biotCoefficient[k] = 1 - bulkModulus / m_grainBulkModulus; + + m_biotCoefficient[k] = 1.0 - bulkModulus / m_grainBulkModulus[k]; } GEOS_HOST_DEVICE @@ -198,7 +201,7 @@ class BiotPorosityUpdates : public PorosityBaseUpdates protected: /// Grain bulk modulus (read from XML) - real64 const m_grainBulkModulus; + arrayView1d< real64 > const m_grainBulkModulus; /// View on the thermal expansion coefficients (read from XML) arrayView1d< real64 const > const m_thermalExpansionCoefficient; @@ -236,7 +239,7 @@ class BiotPorosity : public PorosityBase struct viewKeyStruct : public PorosityBase::viewKeyStruct { - static constexpr char const *grainBulkModulusString() { return "grainBulkModulus"; } + static constexpr char const *defaultGrainBulkModulusString() { return "defaultGrainBulkModulus"; } static constexpr char const *meanTotalStressIncrementString() { return "meanTotalStressIncrement"; } @@ -249,6 +252,8 @@ class BiotPorosity : public PorosityBase static constexpr char const *defaultThermalExpansionCoefficientString() { return "defaultPorosityTEC"; } static constexpr char const *useUniaxialFixedStressString() { return "useUniaxialFixedStress"; } + + static constexpr char const *defaultBiotCoefficientString() { return "defaultBiotCoefficient"; } } viewKeys; virtual void initializeState() const override final; @@ -313,6 +318,9 @@ class BiotPorosity : public PorosityBase /// Thermal expansion coefficients (read from XML) array1d< real64 > m_thermalExpansionCoefficient; + /// Default value of the Biot coefficient (read from XML) + real64 m_defaultBiotCoefficient; + /// Biot coefficients (update in the update class, not read in input) array1d< real64 > m_biotCoefficient; @@ -329,7 +337,10 @@ class BiotPorosity : public PorosityBase array1d< real64 > m_averageMeanTotalStressIncrement_k; /// Grain bulk modulus (read from XML) - real64 m_grainBulkModulus; + real64 m_defaultGrainBulkModulus; + + /// Grain bulk modulus (can be specified in XML) + array1d< real64 > m_grainBulkModulus; /// Flag enabling uniaxial approximation in fixed stress update integer m_useUniaxialFixedStress; diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp b/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp index f36a43b440f..98d2a82e339 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp @@ -82,7 +82,7 @@ DECLARE_FIELD( biotCoefficient, "biotCoefficient", array1d< real64 >, 0, - NOPLOT, + LEVEL_0, WRITE_AND_READ, "Biot coefficient" ); @@ -110,6 +110,14 @@ DECLARE_FIELD( averageMeanTotalStressIncrement_k, NO_WRITE, "Mean total stress increment averaged over quadrature points at the previous sequential iteration" ); +DECLARE_FIELD( grainBulkModulus, + "grainBulkModulus", + array1d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Biot coefficient" ); + } diff --git a/src/coreComponents/schema/docs/BiotPorosity.rst b/src/coreComponents/schema/docs/BiotPorosity.rst index 1045d74ae9e..e0098540256 100644 --- a/src/coreComponents/schema/docs/BiotPorosity.rst +++ b/src/coreComponents/schema/docs/BiotPorosity.rst @@ -3,9 +3,9 @@ ======================== ========= ======== =========================================================== Name Type Default Description ======================== ========= ======== =========================================================== +defaultGrainBulkModulus real64 required Grain bulk modulus defaultPorosityTEC real64 0 Default thermal expansion coefficient defaultReferencePorosity real64 required Default value of the reference porosity -grainBulkModulus real64 required Grain bulk modulus name groupName required A name is required for any non-unique nodes useUniaxialFixedStress integer 0 Flag enabling uniaxial approximation in fixed stress update ======================== ========= ======== =========================================================== diff --git a/src/coreComponents/schema/docs/BiotPorosity_other.rst b/src/coreComponents/schema/docs/BiotPorosity_other.rst index d5bd2487301..335965a9ad6 100644 --- a/src/coreComponents/schema/docs/BiotPorosity_other.rst +++ b/src/coreComponents/schema/docs/BiotPorosity_other.rst @@ -7,6 +7,7 @@ averageMeanTotalStressIncrement_k real64_array Mean total stress increment ave biotCoefficient real64_array Biot coefficient dPorosity_dPressure real64_array2d Derivative of rock porosity with respect to pressure dPorosity_dTemperature real64_array2d Derivative of rock porosity with respect to temperature +grainBulkModulus real64_array Grain Bulk modulus. initialPorosity real64_array2d Initial porosity meanTotalStressIncrement_k real64_array2d Mean total stress increment at quadrature points at the previous sequential iteration porosity real64_array2d Rock porosity diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 00397845810..3ee8c96a670 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -3894,12 +3894,12 @@ Local - Add stabilization only to interiors of macro elements.--> + + - - diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index a96f1c1e5d0..b337dd2d503 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1455,6 +1455,8 @@ + + diff --git a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst index 93ad45c3576..3b5c325ce13 100644 --- a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst +++ b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst @@ -510,15 +510,15 @@ This process is called rebaselining. We suggest the following workflow: -#. Step 1. Open a pull request for your branch on github and select the **ci: run integrated tests** and **ci: upload test baselines** labels -#. Step 2. Wait for the tests to finish -#. Step 3. Download and unpack the new baselines from the link provided at the bottom of the test logs -#. Step 4. Inspect the test results using the *test_results.html* file -#. Step 5. Verify that the changes in the baseline files are desired -#. Step 6. Update the baseline ID in the *GEOS/.integrated_tests.yaml* file -#. Step 7. Add a justification for the baseline changes to the *GEOS/BASELINE_NOTES.md* file -#. Step 8. Commit your changes and push the code -#. Step 9. Wait for the CI tests to re-run and verify that the integrated tests step passed +#. Open a pull request for your branch on github and select the **ci: run integrated tests** label +#. Wait for the tests to finish +#. Download and unpack the new baselines from the link provided at the bottom of the test logs +#. Inspect the test results using the *test_results.html* file +#. Verify that the changes in the baseline files are desired +#. Update the baseline ID in the *GEOS/.integrated_tests.yaml* file +#. Add a justification for the baseline changes to the *GEOS/BASELINE_NOTES.md* file +#. Commit your changes and push the code +#. Wait for the CI tests to re-run and verify that the integrated tests step passed From 79856a0e653a508b4fe4dcd8c582fcdc2838b756 Mon Sep 17 00:00:00 2001 From: acitrain <60715545+acitrain@users.noreply.github.com> Date: Tue, 4 Jun 2024 14:29:03 +0200 Subject: [PATCH 075/286] Fix bug when we take minTime < 0 in wave solvers (#3158) * Fix bug when we take minTime < 0 * Remove not necessary test when we compute the source * Fix unused variable --- .../AcousticFirstOrderWaveEquationSEM.cpp | 6 +++- .../isotropic/AcousticWaveEquationSEM.cpp | 2 +- .../ElasticFirstOrderWaveEquationSEM.cpp | 7 +++- .../isotropic/ElasticWaveEquationSEM.cpp | 35 ++++--------------- .../shared/WaveSolverUtils.hpp | 5 --- 5 files changed, 18 insertions(+), 37 deletions(-) diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 4935ac3e1eb..e1311f20a66 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -457,6 +457,10 @@ real64 AcousticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & t { using FE_TYPE = TYPEOFREF( finiteElement ); + //Modification of cycleNember useful when minTime < 0 + EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); + real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); + integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); acousticFirstOrderWaveEquationSEMKernels:: @@ -490,7 +494,7 @@ real64 AcousticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & t sourceElem, sourceRegion, dt, - cycleNumber, + cycleForSource, p_np1 ); } ); arrayView2d< real32 > const uxReceivers = m_uxNp1AtReceivers.toView(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index a6171a8028c..e8452ae08dd 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -955,7 +955,7 @@ void AcousticWaveEquationSEM::computeUnknowns( real64 const & time_n, getDiscretizationName(), "", kernelFactory ); - + //Modification of cycleNember useful when minTime < 0 EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index a546c6b4821..6d72fb55188 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -538,6 +538,11 @@ real64 ElasticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & ti { using FE_TYPE = TYPEOFREF( finiteElement ); + //Modification of cycleNember useful when minTime < 0 + EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); + real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); + integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); + elasticFirstOrderWaveEquationSEMKernels:: StressComputation< FE_TYPE > kernel( finiteElement ); kernel.template launch< EXEC_POLICY, ATOMIC_POLICY > @@ -559,7 +564,7 @@ real64 ElasticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & ti sourceRegion, sourceValue, dt, - cycleNumber, + cycleForSource, stressxx, stressyy, stresszz, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index a69eda13635..4527a134977 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -185,34 +185,6 @@ void ElasticWaveEquationSEM::postProcessInput() { WaveSolverBase::postProcessInput(); - EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); - real64 const & maxTime = event.getReference< real64 >( EventManager::viewKeyStruct::maxTimeString() ); - real64 dt = 0; - for( localIndex numSubEvent = 0; numSubEvent < event.numSubGroups(); ++numSubEvent ) - { - EventBase const * subEvent = static_cast< EventBase const * >( event.getSubGroups()[numSubEvent] ); - if( subEvent->getEventName() == "/Solvers/" + getName() ) - { - dt = subEvent->getReference< real64 >( EventBase::viewKeyStruct::forceDtString() ); - } - } - - GEOS_THROW_IF( dt < epsilonLoc*maxTime, getDataContext() << ": Value for dt: " << dt <<" is smaller than local threshold: " << epsilonLoc, std::runtime_error ); - - if( m_dtSeismoTrace > 0 ) - { - m_nsamplesSeismoTrace = int( maxTime / m_dtSeismoTrace ) + 1; - } - else - { - m_nsamplesSeismoTrace = 0; - } - localIndex const nsamples = int( maxTime / dt ) + 1; - - localIndex const numSourcesGlobal = m_sourceCoordinates.size( 0 ); - m_sourceIsAccessible.resize( numSourcesGlobal ); - m_sourceValue.resize( nsamples, numSourcesGlobal ); - if( m_useDAS == WaveSolverUtils::DASType::none ) { localIndex const numReceiversGlobal = m_receiverCoordinates.size( 0 ); @@ -605,7 +577,12 @@ void ElasticWaveEquationSEM::computeUnknowns( real64 const &, kernelFactory ); } - addSourceToRightHandSide( cycleNumber, rhsx, rhsy, rhsz ); + //Modification of cycleNember useful when minTime < 0 + EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); + real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); + integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); + + addSourceToRightHandSide( cycleForSource, rhsx, rhsy, rhsz ); SortedArrayView< localIndex const > const solverTargetNodesSet = m_solverTargetNodesSet.toViewConst(); ElasticTimeSchemeSEM::LeapFrog( dt, ux_np1, ux_n, ux_nm1, uy_np1, uy_n, uy_nm1, uz_np1, uz_n, uz_nm1, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp index 84875cf7bc7..7d32fc42581 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp @@ -46,11 +46,6 @@ struct WaveSolverUtils { real32 const delay = t0 > 0 ? t0 : 1 / f0; real32 pulse = 0.0; - if( time_n <= -0.9 * delay || time_n >= 2.9 * delay ) - { - return pulse; - } - real32 const alpha = -pow( f0 * M_PI, 2 ); real32 const time_d = time_n - delay; real32 const gaussian = exp( alpha * pow( time_d, 2 )); From ce4e16928ff78d1367e0a24e1c22c0268b7efa59 Mon Sep 17 00:00:00 2001 From: Arnaud DUDES <155963334+arng40@users.noreply.github.com> Date: Tue, 4 Jun 2024 19:57:50 +0200 Subject: [PATCH 076/286] Log refactor - Table logging features (#2984) --- .../codingUtilities/CMakeLists.txt | 3 +- .../codingUtilities/StringUtilities.hpp | 21 + .../codingUtilities/tests/CMakeLists.txt | 1 + src/coreComponents/common/DataTypes.hpp | 34 +- src/coreComponents/common/Format.hpp | 15 +- src/coreComponents/fileIO/CMakeLists.txt | 11 + src/coreComponents/fileIO/Table/TableData.cpp | 91 ++++ src/coreComponents/fileIO/Table/TableData.hpp | 146 +++++++ .../fileIO/Table/TableFormatter.cpp | 401 ++++++++++++++++++ .../fileIO/Table/TableFormatter.hpp | 221 ++++++++++ .../fileIO/Table/TableLayout.cpp | 78 ++++ .../fileIO/Table/TableLayout.hpp | 156 +++++++ .../fileIO/Table/unitTests/CMakeLists.txt | 18 + .../fileIO/Table/unitTests/testTable.cpp | 334 +++++++++++++++ .../mesh/generators/WellGeneratorBase.cpp | 90 ++-- .../mesh/generators/WellGeneratorBase.hpp | 3 +- 16 files changed, 1570 insertions(+), 53 deletions(-) create mode 100644 src/coreComponents/fileIO/Table/TableData.cpp create mode 100644 src/coreComponents/fileIO/Table/TableData.hpp create mode 100644 src/coreComponents/fileIO/Table/TableFormatter.cpp create mode 100644 src/coreComponents/fileIO/Table/TableFormatter.hpp create mode 100644 src/coreComponents/fileIO/Table/TableLayout.cpp create mode 100644 src/coreComponents/fileIO/Table/TableLayout.hpp create mode 100644 src/coreComponents/fileIO/Table/unitTests/CMakeLists.txt create mode 100644 src/coreComponents/fileIO/Table/unitTests/testTable.cpp diff --git a/src/coreComponents/codingUtilities/CMakeLists.txt b/src/coreComponents/codingUtilities/CMakeLists.txt index c51ea1ca849..53ee0981125 100644 --- a/src/coreComponents/codingUtilities/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/CMakeLists.txt @@ -16,7 +16,8 @@ set( codingUtilities_headers # set( codingUtilities_sources Parsing.cpp - StringUtilities.cpp ) + StringUtilities.cpp + ) set( dependencyList ${parallelDeps} common fast_float ) diff --git a/src/coreComponents/codingUtilities/StringUtilities.hpp b/src/coreComponents/codingUtilities/StringUtilities.hpp index db1fac9d409..d3e3e1e71a6 100644 --- a/src/coreComponents/codingUtilities/StringUtilities.hpp +++ b/src/coreComponents/codingUtilities/StringUtilities.hpp @@ -255,6 +255,27 @@ constexpr bool endsWith( std::string_view str, std::string_view suffix ) str.compare( str.size()-suffix.size(), suffix.size(), suffix ) == 0; } +/** + * @brief Overloading operator (<<) for std::optional. + * + * This function displays the value contained in a std::optional object if one exists. + * Otherwise, it produces no output. + * + * @tparam T The type of the value contained std::optional. + * @param os An output stream (for example, std::cout). + * @param optValue std::optional value to display. + * @return The output stream + */ +template< typename T > +std::ostream & operator<<( std::ostream & os, std::optional< T > const & optValue ) +{ + if( optValue ) + { + os << optValue.value(); + } + return os; +} + } // namespace stringutilities } // namespace geos diff --git a/src/coreComponents/codingUtilities/tests/CMakeLists.txt b/src/coreComponents/codingUtilities/tests/CMakeLists.txt index f6009a67062..85042471be1 100644 --- a/src/coreComponents/codingUtilities/tests/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/tests/CMakeLists.txt @@ -9,6 +9,7 @@ set( dependencyList gtest codingUtilities ${parallelDeps} ) # Add gtest C++ based tests foreach( test ${testSources} ) + get_filename_component( test_name ${test} NAME_WE ) blt_add_executable( NAME ${test_name} SOURCES ${test} diff --git a/src/coreComponents/common/DataTypes.hpp b/src/coreComponents/common/DataTypes.hpp index deba16a2f8a..a4371da71b3 100644 --- a/src/coreComponents/common/DataTypes.hpp +++ b/src/coreComponents/common/DataTypes.hpp @@ -53,17 +53,18 @@ //#include #include #include +#include #include +#include +#include +#include +#include #include #include -#include -#include #include #include -#include -#include -/** +/* * top level geosx namespace contains all code that is specific to GEOSX */ namespace geos @@ -670,6 +671,29 @@ struct TypeName } +/** + * @brief Format to be able to directly use a std::optional. + * @param T The type of the value contained std::optional and GEOS_FMT_NS::formatter. + */ +template< typename T > +struct GEOS_FMT_NS::formatter< std::optional< T > > : GEOS_FMT_NS::formatter< T > +{ + /** + * @brief Format the std::optional to a string. + * @param opt The std::optional< T > value to format + * @param ctx formatting state consisting of the formatting arguments and the output iterator + * @return return the corresponding value string. If std::optional is empty retun an empty string + */ + auto format( std::optional< T > const & opt, format_context & ctx ) + { + if( opt ) + { + return GEOS_FMT_NS::formatter< T >::format( *opt, ctx ); + } + return GEOS_FMT_NS::format_to( ctx.out(), "" ); + } +}; + #endif /* GEOS_COMMON_DATATYPES_HPP */ diff --git a/src/coreComponents/common/Format.hpp b/src/coreComponents/common/Format.hpp index e2a73a8789c..a61f88f29cc 100644 --- a/src/coreComponents/common/Format.hpp +++ b/src/coreComponents/common/Format.hpp @@ -101,7 +101,20 @@ constexpr auto GEOS_FMT_NS::detail::has_const_formatter_impl< GEOS_FMT_NS::forma { return true; } +#endif // End of the workaround for fmt compilation issues + +/** + * Evaluates at compile time if a fmt::formatter exists for a given type + */ +#if __cplusplus < 202002L +template< class T > +static constexpr bool has_formatter_v = fmt::has_formatter< fmt::remove_cvref_t< T >, fmt::format_context >(); +#else +template< typename T > +concept has_formatter_v = requires ( T& v, std::format_context ctx ) +{ + std::formatter< std::remove_cvref_t< T > >().format( v, ctx ); +}; #endif -// End of the workaround for fmt compilation issues #endif //GEOS_COMMON_FORMAT_HPP_ diff --git a/src/coreComponents/fileIO/CMakeLists.txt b/src/coreComponents/fileIO/CMakeLists.txt index c479846cc79..a37d8cdfc41 100644 --- a/src/coreComponents/fileIO/CMakeLists.txt +++ b/src/coreComponents/fileIO/CMakeLists.txt @@ -6,6 +6,9 @@ set( fileIO_headers Outputs/OutputUtilities.hpp Outputs/PythonOutput.hpp Outputs/RestartOutput.hpp + Table/TableLayout.hpp + Table/TableFormatter.hpp + Table/TableData.hpp Outputs/TimeHistoryOutput.hpp timeHistory/HDFFile.hpp timeHistory/HistoryCollectionBase.hpp @@ -22,6 +25,9 @@ set( fileIO_sources Outputs/OutputUtilities.cpp Outputs/PythonOutput.cpp Outputs/RestartOutput.cpp + Table/TableLayout.cpp + Table/TableFormatter.cpp + Table/TableData.cpp Outputs/TimeHistoryOutput.cpp timeHistory/HDFFile.cpp timeHistory/HistoryCollectionBase.cpp @@ -88,4 +94,9 @@ blt_add_library( NAME fileIO target_include_directories( fileIO PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +if( GEOS_ENABLE_TESTS ) + add_subdirectory( Table/unitTests ) +endif() + + diff --git a/src/coreComponents/fileIO/Table/TableData.cpp b/src/coreComponents/fileIO/Table/TableData.cpp new file mode 100644 index 00000000000..2dbf7dfbe18 --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableData.cpp @@ -0,0 +1,91 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableData.cpp + */ + +#include "TableData.hpp" + +namespace geos +{ + +void TableData::addRow( std::vector< string > const & row ) +{ + if( m_rows.size() != 0 && row.size() != m_rows[m_rows.size() - 1].size() ) + { + string msg = "Remarks : some cells may be missing"; + if( std::find( m_errorsMsg.begin(), m_errorsMsg.end(), msg ) == m_errorsMsg.end()) + { + m_errorsMsg.push_back( msg ); + } + } + m_rows.push_back( row ); +} + +void TableData::clear() +{ + m_rows.clear(); + m_errorsMsg.clear(); +} + +std::vector< std::vector< string > > const & TableData::getTableDataRows() const +{ + return m_rows; +} + +std::vector< string > const & TableData::getErrorMsgs() const +{ + return m_errorsMsg; +} + +TableData2D::Conversion1D TableData2D::buildTableData( string_view targetUnit, + string_view rowFmt, + string_view columnFmt ) const +{ + TableData2D::Conversion1D tableData1D; + std::vector< size_t > rowsLength; + + tableData1D.headerNames.push_back( string( targetUnit ) ); + + for( auto const & columnValue : m_columnValues ) + { + tableData1D.headerNames.push_back( GEOS_FMT( columnFmt, columnValue ) ); + } + + // insert row value and row cell values + for( auto const & [rowValue, rowMap] : m_data ) + { + std::vector< string > currentRowValues; + currentRowValues.reserve( rowMap.size() ); + currentRowValues.push_back( GEOS_FMT( rowFmt, rowValue ) ); + + std::set< real64 >::const_iterator columnIt = m_columnValues.begin(); + for( auto const & [columnValue, cellValue] : rowMap ) + { + // if a column value(s) is/are missing, insert empty entry(ies) + while( columnValue > *( columnIt++ ) && columnIt != m_columnValues.end() ) + { + currentRowValues.push_back( "" ); + } + currentRowValues.push_back( GEOS_FMT( "{}", cellValue ) ); + } + + tableData1D.tableData.addRow( std::move( currentRowValues ) ); + rowsLength.push_back( currentRowValues.size() ); + } + + return tableData1D; +} +} diff --git a/src/coreComponents/fileIO/Table/TableData.hpp b/src/coreComponents/fileIO/Table/TableData.hpp new file mode 100644 index 00000000000..a3cf6a16d5c --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableData.hpp @@ -0,0 +1,146 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableData.hpp + */ + +#ifndef GEOS_COMMON_TableData_HPP +#define GEOS_COMMON_TableData_HPP + +#include "common/DataTypes.hpp" +#include "common/Format.hpp" + +namespace geos +{ + +/** + * @brief Class for managing table data + */ +class TableData +{ +public: + /** + * @brief Add a row to the table. + * The values passed to addRow (can be any type). + * @param args Cell values to be added to the row. + */ + template< typename ... Args > + void addRow( Args const & ... args ); + + /** + * @brief Add a row to the table + * @param row A vector of string representing a row + */ + void addRow( std::vector< string > const & row ); + + /** + * @brief Reset data in the table + */ + void clear(); + + /** + * @return The rows of the table + */ + std::vector< std::vector< string > > const & getTableDataRows() const; + + /** + * @brief Get all error messages + * @return The vector of error messages + */ + std::vector< string > const & getErrorMsgs() const; + +private: + + /// vector containing all rows with cell values + std::vector< std::vector< string > > m_rows; + + /// store error if there are any inconsistencies related to the table + std::vector< string > m_errorsMsg; + +}; + +/** + * @brief Class for managing 2D table m_data + */ +class TableData2D +{ +public: + + /// Type real64 for a row + using RowType = real64; + /// Type real64 for a column + using ColumnType = real64; + + /// Struct containing conversion informations + struct Conversion1D + { + /// Vector containing all columns names + std::vector< string > headerNames; + /// TableData to be built + TableData tableData; + }; + + /** + * @brief Add a cell to the table. If necessary, create automatically the containing column & row. + * @tparam T The value passed to addCell (can be any type). + * @param value Cell value to be added. + * @param rowValue The value of the row containing the cell. + * @param columnValue The value of the column containing the cell. + */ + template< typename T > + void addCell( RowType rowValue, ColumnType columnValue, T const & value ); + + /** + * @return Convert and return a struct containing a 1D Table, the column names list from a TableData2D and any errors related to the table + * @param dataDescription The table dataDescription shown at the top left side + * @param rowFmt The y axis units of the table. + * @param columnFmt The x axis units of the table. + * @note The rows and columns FMT can be customized. The bracket "{}" will be replaced by the axis value. + * By default it displays the axis value. + * I.E to display a customized axis to show the pressures in y axis, a rowFmt value can be : "pressure [K] = {}" + */ + Conversion1D buildTableData( string_view dataDescription, string_view rowFmt = "{}", string_view columnFmt = "{}" ) const; + +private: + /// @brief all cell values by their [ row ][ column ] + std::map< RowType, std::map< ColumnType, string > > m_data; + + /// @brief Store all column values when adding cell + std::set< real64 > m_columnValues; +}; + +template< typename ... Args > +void TableData::addRow( Args const &... args ) +{ + std::vector< string > m_cellsValue; + ( [&] { + static_assert( has_formatter_v< decltype(args) >, "Argument passed in addRow cannot be converted to string" ); + string const cellValue = GEOS_FMT( "{}", args ); + m_cellsValue.push_back( cellValue ); + } (), ...); + + addRow( m_cellsValue ); +} + +template< typename T > +void TableData2D::addCell( real64 const rowValue, real64 const columnValue, T const & value ) +{ + static_assert( has_formatter_v< decltype(value) >, "Argument passed in addCell cannot be converted to string" ); + m_columnValues.insert( columnValue ); + m_data[rowValue][columnValue] = GEOS_FMT( "{}", value ); +} + +} +#endif diff --git a/src/coreComponents/fileIO/Table/TableFormatter.cpp b/src/coreComponents/fileIO/Table/TableFormatter.cpp new file mode 100644 index 00000000000..d49204653d8 --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableFormatter.cpp @@ -0,0 +1,401 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableFormatter.cpp + */ + +#include +#include "codingUtilities/StringUtilities.hpp" +#include "TableFormatter.hpp" +namespace geos +{ + +TableFormatter::TableFormatter( TableLayout const & tableLayout ): + m_tableLayout( tableLayout ) +{} + +/////////////////////////////////////////////////////////////////////// +////// CSV Formatter implementation +/////////////////////////////////////////////////////////////////////// + +TableCSVFormatter::TableCSVFormatter( TableLayout const & tableLayout ): + TableFormatter( tableLayout ) +{ + m_tableLayout = tableLayout; +} + +string TableCSVFormatter::headerToString() const +{ + std::stringstream oss; + static constexpr string_view separator = ","; + + for( std::size_t idxColumn = 0; idxColumn < m_tableLayout.getColumns().size(); ++idxColumn ) + { + oss << m_tableLayout.getColumns()[idxColumn].m_parameter.columnName; + if( idxColumn < m_tableLayout.getColumns().size() - 1 ) + { + oss << separator; + } + } + oss << "\n"; + return oss.str(); +} + +string TableCSVFormatter::dataToString( TableData const & tableData ) const +{ + std::vector< std::vector< string > > const rowsValues = tableData.getTableDataRows(); + std::ostringstream oss; + + for( const auto & row : rowsValues ) + { + oss << stringutilities::join( row.cbegin(), row.cend(), "," ) << "\n"; + } + + return oss.str(); +} + +string TableCSVFormatter::toString( TableData const & tableData ) const +{ + return headerToString() + dataToString( tableData ); +} + +/////////////////////////////////////////////////////////////////////// +////// Log Formatter implementation +/////////////////////////////////////////////////////////////////////// + +/** + * @brief Build cell given an alignment, a value and spaces + * @param alignment The aligment of cell value + * @param value The cell value + * @param spaces The number of spaces in the cell + * @return A formated cell + */ +string buildCell( TableLayout::Alignment const alignment, string_view value, integer const spaces ) +{ + switch( alignment ) + { + case TableLayout::right: return GEOS_FMT( "{:>{}}", value, spaces ); + case TableLayout::left: return GEOS_FMT( "{:<{}}", value, spaces ); + case TableLayout::center: return GEOS_FMT( "{:^{}}", value, spaces ); + default: return GEOS_FMT( "{:>{}}", value, spaces ); + } +} + +/** + * @brief Detect columns who are not displayed from TableLayout and therefore modify columns / tableDataRows vectors + * @param columns Vector built in TableLayout containing all columns with their parameters + * @param tableDataRows Vector built in TableData containing all rows values + */ +void formatColumnsFromLayout( std::vector< TableLayout::Column > & columns, + std::vector< std::vector< string > > & tableDataRows ) +{ + integer idxColumn = 0; + for( auto & column : columns ) + { + if( !column.m_parameter.enabled ) + { + columns.erase( columns.begin() + idxColumn ); + for( auto & row : tableDataRows ) + { + row.erase( row.begin() + idxColumn ); + } + } + ++idxColumn; + } +} + +TableTextFormatter::TableTextFormatter( TableLayout const & tableLayout ): + TableFormatter( tableLayout ) +{} + +void TableTextFormatter::fillTableColumnsFromRows( std::vector< TableLayout::Column > & columns, + std::vector< std::vector< string > > & rows ) const +{ + for( size_t idxRow = 0; idxRow < rows.size(); idxRow++ ) + { + if( rows[idxRow].size() < columns.size() ) + { + rows[idxRow].resize( columns.size(), " " ); + } + + for( size_t idxColumn = 0; idxColumn < columns.size(); idxColumn++ ) + { + if( m_tableLayout.getColumns()[idxColumn].m_parameter.enabled ) + { + columns[idxColumn].m_columnValues.push_back( rows[idxRow][idxColumn] ); + } + } + } +} + +string TableTextFormatter::layoutToString() const +{ + std::ostringstream tableOutput; + string sectionSeparatingLine; + std::vector< TableLayout::Column > columns = m_tableLayout.getColumns(); + + outputLayout( tableOutput, columns, {}, sectionSeparatingLine ); + return tableOutput.str(); +} + +string TableTextFormatter::toString( TableData const & tableData ) const +{ + std::ostringstream tableOutput; + string sectionSeparatingLine; + std::vector< TableLayout::Column > columns = m_tableLayout.getColumns(); + std::vector< std::vector< string > > tableDataRows = tableData.getTableDataRows(); + std::vector< string > const & msgTableError = tableData.getErrorMsgs(); + integer const nbValuesRows = tableDataRows.size(); + + formatColumnsFromLayout( columns, tableDataRows ); + fillTableColumnsFromRows( columns, tableDataRows ); + + outputLayout( tableOutput, columns, msgTableError, sectionSeparatingLine ); + outputSectionRows( columns, sectionSeparatingLine, tableOutput, nbValuesRows, TableLayout::Section::values ); + tableOutput << '\n'; + + return tableOutput.str(); +} + +void TableTextFormatter::outputLayout( std::ostringstream & tableOutput, + std::vector< TableLayout::Column > & columns, + std::vector< string > const & msgTableError, + string & sectionSeparatingLine ) const +{ + string topSeparator; + size_t nbHeaderRows = 0; + std::vector< std::vector< string > > splitHeaders; + string const tableTitle = string( m_tableLayout.getTitle()); + + splitAndSetColumnNames( columns, nbHeaderRows, splitHeaders ); + findAndSetMaxStringSize( columns ); + + computeTableWidth( columns, msgTableError ); + buildTableSeparators( columns, topSeparator, sectionSeparatingLine ); + + tableOutput << '\n'; + outputTopRows( tableOutput, {tableTitle}, topSeparator, TableLayout::Alignment::center ); + outputTopRows( tableOutput, msgTableError, topSeparator, TableLayout::Alignment::left ); + tableOutput << GEOS_FMT( "{}\n", sectionSeparatingLine ); + + outputSectionRows( columns, sectionSeparatingLine, tableOutput, nbHeaderRows, TableLayout::Section::header ); +} + +void TableTextFormatter::splitAndSetColumnNames( std::vector< TableLayout::Column > & columns, + size_t & nbHeaderRows, + std::vector< std::vector< string > > & splitHeaders ) const +{ + + splitHeaders.reserve( columns.size() ); + for( auto const & column : columns ) + { + std::vector< string > splitHeaderParts; + std::istringstream ss( column.m_parameter.columnName ); + string subColumnNames; + + while( getline( ss, subColumnNames, '\n' )) + { + splitHeaderParts.push_back( subColumnNames ); + } + + splitHeaders.push_back( std::move( splitHeaderParts ) ); + } + + nbHeaderRows = std::max_element( splitHeaders.begin(), splitHeaders.end(), + []( auto const & v1, auto const & v2 ) { return v1.size() < v2.size(); } )->size(); + + for( auto & headerParts : splitHeaders ) + { + if( headerParts.size() < nbHeaderRows ) + { + headerParts.resize( nbHeaderRows, " " ); + } + columns[&headerParts - &splitHeaders[0]].m_parameter.splitColumnNameLines = headerParts; + } + +} + +void TableTextFormatter::findAndSetMaxStringSize( std::vector< TableLayout::Column > & columns ) const +{ + for( auto & column : columns ) + { + auto const maxStringSizeHeader = *std::max_element( column.m_parameter.splitColumnNameLines.begin(), + column.m_parameter.splitColumnNameLines.end(), + []( const auto & a, const auto & b ) {return a.size() < b.size();} ); + column.m_maxStringSize = maxStringSizeHeader; + + for( auto const & cell : column.m_columnValues ) + { + if( column.m_maxStringSize.length() < cell.length()) + { + column.m_maxStringSize = cell; + } + } + } +} + +void TableTextFormatter::increaseColumnsSize( std::vector< TableLayout::Column > & columns, + integer const extraCharacters ) const +{ + integer const extraCharactersPerColumn = std::ceil( extraCharacters / columns.size() ); + for( std::size_t idxColumn = 0; idxColumn < columns.size(); ++idxColumn ) + { + integer newMaxStringSize = extraCharactersPerColumn + columns[idxColumn].m_maxStringSize.size(); + if( idxColumn == columns.size() - 1 ) + { + newMaxStringSize += m_tableLayout.getColumnMargin(); + } + + columns[idxColumn].m_maxStringSize = GEOS_FMT( "{:>{}}", + columns[idxColumn].m_maxStringSize, + newMaxStringSize ); + } +} + +void computeTableErrorLength( std::vector< string > const & msgTableError, string::size_type & msgTableErrorLength ) +{ + if( !msgTableError.empty() ) + { + auto maxStringSize = *(std::max_element( msgTableError.begin(), msgTableError.end(), + []( const auto & a, const auto & b ) { + return a.size() < b.size(); + } )); + + msgTableErrorLength += maxStringSize.size() + 1; // max string size + line return at the end + } +} + +void computeTableSectionLength( std::vector< TableLayout::Column > & columns, string::size_type & sectionlineLength ) +{ + sectionlineLength += std::accumulate( columns.begin(), columns.end(), 0, + []( auto sum, const auto & column ) + { return sum + column.m_maxStringSize.length();} ); +} + +void TableTextFormatter::computeTableWidth( std::vector< TableLayout::Column > & columns, + std::vector< string > const & msgTableError ) const +{ + integer const columnMargin = m_tableLayout.getColumnMargin(); + integer const borderMargin = m_tableLayout.getBorderMargin(); + string const tableTitle = string( m_tableLayout.getTitle() ); + + string::size_type sectionLengthWithSpacing = ( ( columns.size() - 1 ) * columnMargin ) + (borderMargin * 2); + string::size_type sectionlineLength = sectionLengthWithSpacing; + string::size_type maxTopLineLength = tableTitle.length(); + string::size_type msgTableErrorLength = borderMargin; + + computeTableErrorLength( msgTableError, msgTableErrorLength ); + computeTableSectionLength( columns, sectionlineLength ); + + maxTopLineLength = std::max( maxTopLineLength, msgTableErrorLength ); + if( sectionlineLength < maxTopLineLength ) + { + integer const extraCharacters = maxTopLineLength - sectionlineLength; + increaseColumnsSize( columns, extraCharacters ); + } +} + + +void TableTextFormatter::buildTableSeparators( std::vector< TableLayout::Column > const & columns, + string & topSeparator, + string & sectionSeparatingLine ) const +{ + { // section separator line + integer const columnMargin = m_tableLayout.getColumnMargin(); + integer const borderMargin = m_tableLayout.getBorderMargin(); + + std::vector< string > maxStringPerColumn; + for( auto const & column : columns ) + { + maxStringPerColumn.push_back( string( column.m_maxStringSize.length(), m_horizontalLine ) ); + } + + string const patternBetweenColumns = GEOS_FMT( "{:-^{}}", m_horizontalLine, columnMargin ); + + std::string const leftBorder = GEOS_FMT( "{}{:-<{}}", m_horizontalLine, "", borderMargin ); + std::string const rightBorder = GEOS_FMT( "{}{:-<{}}", m_horizontalLine, "", borderMargin ); + std::string const columnJoin = stringutilities::join( maxStringPerColumn, patternBetweenColumns ); + + std::ostringstream oss; + oss << leftBorder << columnJoin << rightBorder; + sectionSeparatingLine = oss.str(); + } + + { // top line separator + // -2 because we can have '+' to the extremity of top separator + integer const topSeparatorLength = sectionSeparatingLine.size() - 2; + topSeparator = GEOS_FMT( "{}{:-<{}}{}", m_horizontalLine, "", topSeparatorLength, m_horizontalLine ); + } +} + +void TableTextFormatter::outputTopRows( std::ostringstream & tableOutput, + std::vector< string > const & msg, + string_view topSeparator, + TableLayout::Alignment alignment ) const +{ + if( msg.size() != 0 && msg[0] != "" ) + { + tableOutput << GEOS_FMT( "{}\n", topSeparator ); + for( std::string const & str : msg ) + { + tableOutput << m_verticalLine << string( m_tableLayout.getBorderMargin(), ' ' ); + tableOutput << buildCell( alignment, str, (topSeparator.length() - 6)); + tableOutput << string( m_tableLayout.getBorderMargin(), ' ' ) << "|\n"; + } + } +} + +void TableTextFormatter::outputSectionRows( std::vector< TableLayout::Column > const & columns, + string_view sectionSeparatingLine, + std::ostringstream & tableOutput, + integer const nbRows, + TableLayout::Section const section ) const +{ + integer const columnMargin = m_tableLayout.getColumnMargin(); + integer const borderMargin = m_tableLayout.getBorderMargin(); + + for( integer idxRow = 0; idxRow< nbRows; ++idxRow ) + { + // Append the left border + tableOutput << GEOS_FMT( "{:<{}}", m_verticalLine, 1 + borderMargin ); + for( std::size_t idxColumn = 0; idxColumn < columns.size(); ++idxColumn ) + { + TableLayout::Column const currentColumn = columns[idxColumn]; + auto const & columnContent = section == TableLayout::Section::header ? + columns[idxColumn].m_parameter.splitColumnNameLines : + columns[idxColumn].m_columnValues; + string cell = columnContent[idxRow]; + integer const cellSize = currentColumn.m_maxStringSize.length(); + + tableOutput << buildCell( currentColumn.m_parameter.alignment, cell, cellSize ); + + // Add space between column + if( idxColumn < columns.size() - 1 ) + { + tableOutput << GEOS_FMT( "{:^{}}", m_verticalLine, columnMargin ); + } + + } + + // Append right border with line return + tableOutput << GEOS_FMT( "{:>{}}\n", m_verticalLine, borderMargin + 1 ); + } + + if( nbRows != 0 ) + { + tableOutput << GEOS_FMT( "{}\n", sectionSeparatingLine ); + } +} +} diff --git a/src/coreComponents/fileIO/Table/TableFormatter.hpp b/src/coreComponents/fileIO/Table/TableFormatter.hpp new file mode 100644 index 00000000000..1e18452b562 --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableFormatter.hpp @@ -0,0 +1,221 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableFormatter.hpp + */ + +#ifndef GEOS_COMMON_TABLEFORMATTER_HPP +#define GEOS_COMMON_TABLEFORMATTER_HPP + +#include "TableData.hpp" +#include "TableLayout.hpp" + +namespace geos +{ + +/** + * @brief abstract class for formatting table data + */ +class TableFormatter +{ + +protected: + + /// Layout for a table + TableLayout m_tableLayout; + + /** + * @brief Construct a new Table Formatter from a tableLayout + * @param tableLayout Contain all column names and optionnaly the table title + */ + TableFormatter( TableLayout const & tableLayout ); + + /** + * @brief Destroy the Table Formatter object + */ + virtual ~TableFormatter() = default; +}; + +/** + * @brief class for CSV formatting + */ +class TableCSVFormatter : public TableFormatter +{ +public: + + /** + * @brief Construct a new Table Formatter from a tableLayout + * @param tableLayout Contain all column names and optionnaly the table title + */ + TableCSVFormatter( TableLayout const & tableLayout ); + + /** + * @brief Destroy the TableCSVFormatter object + */ + virtual ~TableCSVFormatter() = default; + + /** + * @return The string with all column names. + */ + string headerToString() const; + + /** + * @brief Convert the table data to a CSV string. + * @param tableData The 1D table data. + * @return The CSV string representation of the table data. + */ + string dataToString( TableData const & tableData ) const; + + /** + * @brief Convert the TableData to a table string. + * @param tableData The TableData to convert. + * @return The table string representation of the TableData. + */ + string toString( TableData const & tableData ) const; + +}; + +/** + * @brief class for log formatting + */ +class TableTextFormatter : public TableFormatter +{ + +public: + + /** + * @brief Construct a new TableFormatter from a tableLayout + * @param tableLayout Contain all column names and optionnaly the table title + */ + TableTextFormatter( TableLayout const & tableLayout ); + + /** + * @brief Destroy the Table Text Formatter object + */ + virtual ~TableTextFormatter() = default; + + /** + * @return A TableLayout converted into a formatted representation. + */ + string layoutToString() const; + + /** + * @brief Convert the TableData to a table string. + * @param tableData The TableData to convert. + * @return The table string representation of the TableData. + */ + string toString( TableData const & tableData ) const; + +private: + + /// symbol for separator construction + static constexpr char m_verticalLine = '|'; + /// for the extremity of a row + static constexpr char m_horizontalLine = '-'; + + /**F + * @brief Fill the vector (m_column) in tableData with values from rows stored in tableData. + * @param columns Vector of columns to be filled. + * @param tableData Vector containing all rows filled with values + */ + void fillTableColumnsFromRows( std::vector< TableLayout::Column > & columns, + std::vector< std::vector< string > > & tableData ) const; + + /** + * @brief Converts a TableLayout into a formatted representation. + * @param tableOutput The output stream + * @param columns The vector containing all table columns + * @param msgTableError A vector containg all error related to the table + * @param sectionSeparatingLine An empty string for building the section separator + */ + void outputLayout( std::ostringstream & tableOutput, + std::vector< TableLayout::Column > & columns, + std::vector< string > const & msgTableError, + string & sectionSeparatingLine ) const; + + /** + * @brief Split all header names by detecting the newline \\n character. and + * set the same vector size for each split header and merge it into columns + * @param columns The vector containg all columns + * @param largestHeaderVectorSize The largest split header vector size + * @param splitHeaders A empty vector who will contain all split header names + */ + void splitAndSetColumnNames( std::vector< TableLayout::Column > & columns, + size_t & largestHeaderVectorSize, + std::vector< std::vector< string > > & splitHeaders ) const; + + /** + * @brief For each column find and set the column's longest string + * @param columns The vector containg all columns + */ + void findAndSetMaxStringSize( std::vector< TableLayout::Column > & columns ) const; + + /** + * @brief recalculate the largest string size for each columns + * @param columns Vector containing all table columns + * @param extraCharacters Extra characters to be added to \p m_maxStringSize of each columns + */ + void increaseColumnsSize( std::vector< TableLayout::Column > & columns, + integer const extraCharacters ) const; + + /** + * @brief Compute the max table line length, taking into account the length of : title, error, columns header and content + * Increase the size of the columns if necessary + * @param columns Vector of column containing containing the largest string for each column + * @param msgTableError Vector containing all error messages + */ + void computeTableWidth( std::vector< TableLayout::Column > & columns, + std::vector< string > const & msgTableError ) const; + + /** + * @brief Build all separators needed from content length contained in the columns vector + * @param columns Vector containing all table columns + * @param topSeparator Top separator to be built + * @param sectionSeparatingLine Line section separator to be built + */ + void buildTableSeparators( std::vector< TableLayout::Column > const & columns, + string & topSeparator, + string & sectionSeparatingLine ) const; + + /** + * @brief Add a row on top of the table + * @param tableOutput The output stream + * @param msg Vector of string(s) to display + * @param topSeparator The top table separator + * @param alignment The aligment for a row + */ + void outputTopRows( std::ostringstream & tableOutput, + std::vector< string > const & msg, + string_view topSeparator, + TableLayout::Alignment alignment ) const; + + /** + * @brief Output a section by specifying it's type ( header or section ) + * @param columns Vector containing all table columns + * @param sectionSeparatingLine Line separator between sections + * @param rows A section row + * @param nbRows Indicates the number of lines in a section + * @param section The section to be built + * @note Add the ending line if there are one or more rows + */ + void outputSectionRows( std::vector< TableLayout::Column > const & columns, + string_view sectionSeparatingLine, + std::ostringstream & rows, + integer const nbRows, + TableLayout::Section const section ) const; +}; +} + +#endif diff --git a/src/coreComponents/fileIO/Table/TableLayout.cpp b/src/coreComponents/fileIO/Table/TableLayout.cpp new file mode 100644 index 00000000000..726a92eab36 --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableLayout.cpp @@ -0,0 +1,78 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableData.hpp + */ + +#include "TableLayout.hpp" + +namespace geos +{ + +TableLayout::TableLayout( std::vector< string > const & columnNames, string const & title ): + m_tableTitle( title ) +{ + setMargin( MarginValue::medium ); + m_columns.reserve( columnNames.size() ); + for( auto const & name : columnNames ) + { + m_columns.push_back( {TableLayout::ColumnParam{{name}, Alignment::right, true}, {}, ""} ); + } +} + +TableLayout::TableLayout( std::vector< ColumnParam > const & columnParameters, string const & title ): + m_tableTitle( title ) +{ + setMargin( MarginValue::medium ); + m_columns.reserve( columnParameters.size() ); + for( auto const & param : columnParameters ) + { + m_columns.push_back( { param, {}, ""} ); + } +} + +void TableLayout::setMargin( MarginValue marginValue ) +{ + m_borderMargin = marginValue; + m_columnMargin = integer( marginValue ) * 2 + 1; +} + +std::vector< TableLayout::Column > const & TableLayout::getColumns() const +{ + return m_columns; +} + +string_view TableLayout::getTitle() const +{ + return m_tableTitle; +} + + +integer const & TableLayout::getBorderMargin() const +{ + return m_borderMargin; +} + +integer const & TableLayout::getColumnMargin() const +{ + return m_columnMargin; +} + +integer const & TableLayout::getMarginTitle() const +{ + return m_titleMargin; +} + +} diff --git a/src/coreComponents/fileIO/Table/TableLayout.hpp b/src/coreComponents/fileIO/Table/TableLayout.hpp new file mode 100644 index 00000000000..f19759ae453 --- /dev/null +++ b/src/coreComponents/fileIO/Table/TableLayout.hpp @@ -0,0 +1,156 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TableLayout.hpp + */ + +#ifndef GEOS_COMMON_TABLELAYOUT_HPP +#define GEOS_COMMON_TABLELAYOUT_HPP + +#include "common/DataTypes.hpp" + +namespace geos +{ + +/** + * @brief Class for setup the table layout + */ +class TableLayout +{ + +public: + + /// Type of aligment for a column + enum Alignment { right, left, center }; + + /// Space to apply between all data and border + enum MarginValue : integer + { + tiny = 0, + small = 1, + medium = 2, + large = 3 + }; + + /** + * @brief Enumeration for table sections. + */ + enum Section { header, values }; + + /** + * @brief Structure to set up each colum parameters. + */ + struct ColumnParam + { + /// Name for a column + string columnName; + /// Alignment for a column. By default aligned to the right side + Alignment alignment = Alignment::right; + /// A boolean to display a colummn + bool enabled = true; + /// Vector containing substring column name delimited by "\n" + std::vector< string > splitColumnNameLines; + + /** + * @brief Construct a ColumnParam object with the specified name and alignment. + * @param name The name of the column + * @param align The alignment of the column + */ + ColumnParam( std::string const & name, Alignment align ) + : columnName( name ), alignment( align ) + {} + + /** + * @brief Construct a ColumnParam object with the specified name, alignment, and display flag. + * @param name The name of the column + * @param align The alignment of the column + * @param display Flag indicating whether the column is enabled + */ + ColumnParam( std::string const & name, Alignment align, bool display ) + : columnName( name ), alignment( align ), enabled( display ) + {} + }; + + /** + * @brief Struct for a column. + */ + struct Column + { + /// Structure who contains parameters for a column + ColumnParam m_parameter; + /// A vector containing all column values + std::vector< string > m_columnValues; + /// The largest string in the column + string m_maxStringSize; + }; + + /** + * @brief Construct a new Table object, all values in the table are centered by default + * @param columnNames The names of the columns + * @param title The table name + */ + TableLayout( std::vector< string > const & columnNames, string const & title = "" ); + + /** + * @brief Construct a new Table object by specifying value alignment and optionally their displays based to log levels + * level + * @param columnParameters List of structures to set up each colum parameters. + * @param title The table name + */ + TableLayout( std::vector< ColumnParam > const & columnParameters, string const & title = "" ); + + /** + * @return The columns vector + */ + std::vector< Column > const & getColumns() const; + + /** + * @return The table name + */ + string_view getTitle() const; + + /** + * @return The border margin, number of spaces at both left and right table sides + */ + integer const & getBorderMargin() const; + + /** + * @return The column margin, numbers of spaces separating both left and right side from each column content + */ + integer const & getColumnMargin() const; + + /** + * @return The margin title + */ + integer const & getMarginTitle() const; + + /** + * @brief Set the minimal margin width between cell content and borders. + * @param marginValue The margin value + */ + void setMargin( MarginValue marginValue ); + +private: + + std::vector< Column > m_columns; + string m_tableTitle; + integer m_borderMargin; + integer m_columnMargin; + integer m_titleMargin = 2; + +}; +} + +#endif diff --git a/src/coreComponents/fileIO/Table/unitTests/CMakeLists.txt b/src/coreComponents/fileIO/Table/unitTests/CMakeLists.txt new file mode 100644 index 00000000000..4db71486656 --- /dev/null +++ b/src/coreComponents/fileIO/Table/unitTests/CMakeLists.txt @@ -0,0 +1,18 @@ +# Specify list of tests +set( gtest_geosx_tests + testTable.cpp ) + +set( dependencyList gtest fileIO ${parallelDeps} ) + +# Add gtest C++ based tests +foreach(test ${gtest_geosx_tests}) + get_filename_component( test_name ${test} NAME_WE ) + blt_add_executable( NAME ${test_name} + SOURCES ${test} + OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} + DEPENDS_ON ${dependencyList} ) + + geos_add_test( NAME ${test_name} + COMMAND ${test_name} ) + +endforeach() diff --git a/src/coreComponents/fileIO/Table/unitTests/testTable.cpp b/src/coreComponents/fileIO/Table/unitTests/testTable.cpp new file mode 100644 index 00000000000..98dabc25d84 --- /dev/null +++ b/src/coreComponents/fileIO/Table/unitTests/testTable.cpp @@ -0,0 +1,334 @@ + +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "fileIO/Table/TableData.hpp" +#include "fileIO/Table/TableFormatter.hpp" +#include "fileIO/Table/TableLayout.hpp" +#include "dataRepository/Group.hpp" +// TPL includes +#include +#include + +using namespace geos; + +TEST( testTable, tableEmptyRow ) +{ + //table with empty row + TableLayout const tableLayout( {"Well\nelement no.\nPV weighted\nbar", + "CordX", + "CoordZ", + "Prev\nelement", + "Next\nelement"}, + "InternalWellGenerator well_injector1" + ); + + TableData tableData; + tableData.addRow( "value1", "[30.21543]", "3.0", 54, 0 ); + tableData.addRow( "", "", "", "", "" ); + tableData.addRow( "Duis fringilla, ligula sed porta fringilla, ligula wisi commodo felis,ut adipiscing felis dui in enim. Suspendisse malesuada ultrices ante", "[30.21543]", "30.45465142", + 787442, 10 ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( + tableData ), + "\n-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| InternalWellGenerator well_injector1 |\n" + "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| Well | CordX | CoordZ | Prev | Next |\n" + "| element no. | | | element | element |\n" + "| PV weighted | | | | |\n" + "| bar | | | | |\n" + "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| value1 | [30.21543] | 3.0 | 54 | 0 |\n" + "| | | | | |\n" + "| Duis fringilla, ligula sed porta fringilla, ligula wisi commodo felis,ut adipiscing felis dui in enim. Suspendisse malesuada ultrices ante | [30.21543] | 30.45465142 | 787442 | 10 |\n" + "-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n" + ); +} + +TEST( testTable, tableClassic ) +{ + TableLayout const tableLayout( {"Duis fringilla, ligula sed porta fringilla,\nligula wisi commodo felis,ut adipiscing felis dui in enim. Suspendisse malesuada ultrices ante", + "CordX", + "CoordZ", + "Prev\nelement", + "Next\nelement"}, "InternalWellGenerator well_injector1" ); + + TableData tableData; + tableData.addRow( "value1", "[30.21543]", "3.0", 54, 0 ); + tableData.addRow( "", "", "", "", "" ); + tableData.addRow( "value23", "[30.21543]", "30.45465142", 787442, 10 ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( tableData ), + "\n-----------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| InternalWellGenerator well_injector1 |\n" + "-----------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| Duis fringilla, ligula sed porta fringilla, | CordX | CoordZ | Prev | Next |\n" + "| ligula wisi commodo felis,ut adipiscing felis dui in enim. Suspendisse malesuada ultrices ante | | | element | element |\n" + "-----------------------------------------------------------------------------------------------------------------------------------------------------------\n" + "| value1 | [30.21543] | 3.0 | 54 | 0 |\n" + "| | | | | |\n" + "| value23 | [30.21543] | 30.45465142 | 787442 | 10 |\n" + "-----------------------------------------------------------------------------------------------------------------------------------------------------------\n\n" + ); +} + +TEST( testTable, tableColumnParamClassic ) +{ + TableLayout const tableLayout( { + TableLayout::ColumnParam{{"Cras egestas"}, TableLayout::Alignment::center}, + TableLayout::ColumnParam{{"CoordX"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"C"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"CoordZ"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"Prev\nelement"}, TableLayout::Alignment::right}, + TableLayout::ColumnParam{{"Next\nelement"}, TableLayout::Alignment::right} + }, "InternalWellGenerator well_injector1" ); + + TableData tableData; + tableData.addRow( "value1", " ", "3.0", 3.0129877, 2.0f, 1 ); + tableData.addRow( "val1", "v", "[3.045,42.02,89.25]", 3.0, 10.0f, 3 ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( tableData ), + "\n-------------------------------------------------------------------------------------------\n" + "| InternalWellGenerator well_injector1 |\n" + "-------------------------------------------------------------------------------------------\n" + "| Cras egestas | CoordX | C | CoordZ | Prev | Next |\n" + "| | | | | element | element |\n" + "-------------------------------------------------------------------------------------------\n" + "| value1 | | 3.0 | 3.0129877 | 2 | 1 |\n" + "| val1 | v | [3.045,42.02,89.25] | 3 | 10 | 3 |\n" + "-------------------------------------------------------------------------------------------\n\n" + ); +} + +TEST( testTable, tableHiddenColumn ) +{ + TableLayout const tableLayout( { + TableLayout::ColumnParam{{"Cras egestas"}, TableLayout::Alignment::center}, + TableLayout::ColumnParam{{"CoordX"}, TableLayout::Alignment::right}, + TableLayout::ColumnParam{{"C"}, TableLayout::Alignment::center}, + TableLayout::ColumnParam{{"CoordZ"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"Prev\nelement"}, TableLayout::Alignment::left, false}, + TableLayout::ColumnParam{{"Next\nelement"}, TableLayout::Alignment::center, false}, + }, "Cras egestas ipsum a nisl. Vivamus variu dolor utsisicdis parturient montes, nascetur ridiculus mus. Duis" ); + + TableData tableData; + tableData.addRow( "value1", " ", "3.0", 3.0129877, 2.0f, 1 ); + tableData.addRow( "val1", "v", "[3.045,42.02,89.25]", 3.0, 10.0f, 3 ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( tableData ), + "\n----------------------------------------------------------------------------------------------------------------\n" + "| Cras egestas ipsum a nisl. Vivamus variu dolor utsisicdis parturient montes, nascetur ridiculus mus. Duis |\n" + "----------------------------------------------------------------------------------------------------------------\n" + "| Cras egestas | CoordX | C | CoordZ |\n" + "----------------------------------------------------------------------------------------------------------------\n" + "| value1 | | 3.0 | 3.0129877 |\n" + "| val1 | v | [3.045,42.02,89.25] | 3 |\n" + "----------------------------------------------------------------------------------------------------------------\n\n" ); +} + +TEST( testTable, tableUniqueColumn ) +{ + TableLayout const tableLayout( { + TableLayout::ColumnParam{{"Cras egestas"}, TableLayout::Alignment::center}, + }, "Cras egestas ipsu a nisl. Vivamus variu dolor utsisicdis parturient montes, nascetur ridiculus mus. Duis" ); + + TableData tableData; + tableData.addRow( "value1" ); + tableData.addRow( "val1" ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( tableData ), + "\n---------------------------------------------------------------------------------------------------------------\n" + "| Cras egestas ipsu a nisl. Vivamus variu dolor utsisicdis parturient montes, nascetur ridiculus mus. Duis |\n" + "---------------------------------------------------------------------------------------------------------------\n" + "| Cras egestas |\n" + "---------------------------------------------------------------------------------------------------------------\n" + "| value1 |\n" + "| val1 |\n" + "---------------------------------------------------------------------------------------------------------------\n\n" ); +} + +TEST( testTable, tableEmptyTitle ) +{ + TableLayout const tableLayout( { + TableLayout::ColumnParam{{"Cras egestas"}, TableLayout::Alignment::center}, + TableLayout::ColumnParam{{"CoordX"}, TableLayout::Alignment::right}, + TableLayout::ColumnParam{{"C"}, TableLayout::Alignment::center}, + TableLayout::ColumnParam{{"CoordZ"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"Prev\nelement"}, TableLayout::Alignment::left}, + TableLayout::ColumnParam{{"Next\nelement"}, TableLayout::Alignment::center}, + } + ); + + TableData tableData; + tableData.addRow( "value1", " ", "3.0", 3.0129877, 2.0f, 1 ); + tableData.addRow( "val1", "v", "[3.045,42.02,89.25]", 3.0, 10.0f, 3 ); + + TableTextFormatter const tableText( tableLayout ); + EXPECT_EQ( tableText.toString( tableData ), + "\n-------------------------------------------------------------------------------------------\n" + "| Cras egestas | CoordX | C | CoordZ | Prev | Next |\n" + "| | | | | element | element |\n" + "-------------------------------------------------------------------------------------------\n" + "| value1 | | 3.0 | 3.0129877 | 2 | 1 |\n" + "| val1 | v | [3.045,42.02,89.25] | 3 | 10 | 3 |\n" + "-------------------------------------------------------------------------------------------\n\n" + ); +} + +TEST( testTable, table2DTable ) +{ + //collect + TableData2D tableData; + + for( real64 p = 10000; p<20000; p+=5000 ) + { + for( real64 t = 400; t>=270; t+=-50.0 ) + { + real64 value = t/p; + tableData.addCell( t, p, value ); + } + } + + //convert + string const rowFmt = GEOS_FMT( "{} = {{}}", "Temperature" ); + string const columnFmt = GEOS_FMT( "{} = {{}}", "Pression" ); + TableData2D::Conversion1D tableconverted = tableData.buildTableData( "Viscosity kg*s", + rowFmt, + columnFmt ); + + //format + TableLayout const tableLayout( tableconverted.headerNames ); + + //log + TableTextFormatter const tableLog( tableLayout ); + EXPECT_EQ( tableLog.toString( tableconverted.tableData ), + "\n---------------------------------------------------------------------\n" + "| Viscosity kg*s | Pression = 10000 | Pression = 15000 |\n" + "---------------------------------------------------------------------\n" + "| Temperature = 300 | 0.03 | 0.02 |\n" + "| Temperature = 350 | 0.035 | 0.023333333333333334 |\n" + "| Temperature = 400 | 0.04 | 0.02666666666666667 |\n" + "---------------------------------------------------------------------\n\n" + ); +} + + +TEST( testTable, table2DColumnMismatch ) +{ + //test 2D table column mismatch + { + // collect + TableData2D tableData; + + tableData.addCell( 300, 10000, 0.03 ); + tableData.addCell( 300, 15000, 0.02 ); + tableData.addCell( 350, 10000, 0.035 ); + tableData.addCell( 350, 10000, 0.035 ); + tableData.addCell( 400, 10000, 0.04 ); + tableData.addCell( 400, 15000, 0.02666666666666667 ); + + //convert + string const rowFmt = GEOS_FMT( "{} = {{}}", "Temperature" ); + string const columnFmt = GEOS_FMT( "{} = {{}}", "Pression" ); + TableData2D::Conversion1D tableConverted = tableData.buildTableData( "Viscosity kg*s", + rowFmt, + columnFmt ); + + //format + TableLayout const tableLayout( tableConverted.headerNames ); + + //log + TableTextFormatter const tableLog( tableLayout ); + EXPECT_EQ( tableLog.toString( tableConverted.tableData ), + "\n--------------------------------------------------------------------\n" + "| Remarks : some cells may be missing |\n" + "--------------------------------------------------------------------\n" + "| Viscosity kg*s | Pression = 10000 | Pression = 15000 |\n" + "--------------------------------------------------------------------\n" + "| Temperature = 300 | 0.03 | 0.02 |\n" + "| Temperature = 350 | 0.035 | |\n" + "| Temperature = 400 | 0.04 | 0.02666666666666667 |\n" + "--------------------------------------------------------------------\n\n" + ); + } +} + +TEST( testTable, layoutTable ) +{ + string filename = "fluid1_phaseModel1_PhillipsBrineDensity_table"; + //2. format + string log = GEOS_FMT( "The {} PVT table exceeding 500 rows.\nTo visualize the tables, go to the generated csv \n", filename ); + TableLayout const tableLayoutInfos( {TableLayout::ColumnParam{{log}, TableLayout::Alignment::left}}, filename ); + + //3. log + TableTextFormatter const tableLog( tableLayoutInfos ); + EXPECT_EQ( tableLog.layoutToString(), + "\n-------------------------------------------------------------------------------------\n" + "| fluid1_phaseModel1_PhillipsBrineDensity_table |\n" + "-------------------------------------------------------------------------------------\n" + "| The fluid1_phaseModel1_PhillipsBrineDensity_table PVT table exceeding 500 rows. |\n" + "| To visualize the tables, go to the generated csv |\n" + "-------------------------------------------------------------------------------------\n" + ); +} + +TEST( testTable, tableSetMargin ) +{ + //////////// + //////// If setMargin used elsewhere make it public and remove comments for this test + //////////// + //test with tiny margin + // { + // TableLayout tableLayout( { + // TableLayout::ColumnParam{{"Colonne 1"}, TableLayout::Alignment::center}, + // TableLayout::ColumnParam{{"Colonne 2"}, TableLayout::Alignment::center}, + // TableLayout::ColumnParam{{"Colonne 3"}, TableLayout::Alignment::right}, + // TableLayout::ColumnParam{{"Colonne 4"}, TableLayout::Alignment::right}, + // TableLayout::ColumnParam{{"Prev\nelement"}, TableLayout::Alignment::right}, + // TableLayout::ColumnParam{{"Next\nelement"}, TableLayout::Alignment::right}, + // }, "InternalWellGenerator well_injector1" ); + + // //tableLayout.setMargin( TableLayout::MarginValue::tiny ); + + // TableData tableData; + // tableData.addRow( "value 1", "long value 1", "3.0034", 3.0129877, "" , 1 ); + // tableData.addRow( "value 1", "long value 2", "100.45", 4.0129877, 1 , 2 ); + + // TableTextFormatter const tableText( tableLayout ); + // EXPECT_EQ( tableText.toString( tableData ), +// "\n------------------------------------------------------------\n" +// "| InternalWellGenerator well_injector1 |\n" +// "------------------------------------------------------------\n" +// "|Colonne 1| Colonne 2 |Colonne 3|Colonne 4| Prev| Next|\n" +// "| | | | |element|element|\n" +// "------------------------------------------------------------\n" +// "| value 1 |long value 1| 3.0034|3.0129877| | 1|\n" +// "| value 1 |long value 2| 100.45|4.0129877| 1| 2|\n" +// "------------------------------------------------------------\n\n" +// ); +// } +} + +int main( int argc, char * * argv ) +{ + testing::InitGoogleTest( &argc, argv ); + return RUN_ALL_TESTS(); +} diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index 554f4530bf7..dee088ac575 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -17,7 +17,10 @@ #include "mesh/Perforation.hpp" #include "mesh/generators/LineBlockABC.hpp" #include "LvArray/src/genericTensorOps.hpp" - +#include "fileIO/Table/TableLayout.hpp" +#include "fileIO/Table/TableData.hpp" +#include "fileIO/Table/TableFormatter.hpp" +#include "common/Format.hpp" namespace geos { using namespace dataRepository; @@ -141,9 +144,10 @@ void WellGeneratorBase::generateWellGeometry( ) // make sure that the perforation locations are valid checkPerforationLocationsValidity(); - if( getLogLevel() >= 1 ) + if( getLogLevel() >= 1 && MpiWrapper::commRank() == 0 ) { - debugWellGeometry(); + logInternalWell(); + logPerforationTable(); } } @@ -521,62 +525,58 @@ void WellGeneratorBase::mergePerforations( array1d< array1d< localIndex > > cons } } -void WellGeneratorBase::debugWellGeometry() const +void WellGeneratorBase::logInternalWell() const { - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) != 0 ) - { - return; - } - - std::cout << std::endl; - std::cout << "++++++++++++++++++++++++++" << std::endl; - std::cout << "WellGeneratorBase = " << getName() << std::endl; - std::cout << "MPI rank = " << MpiWrapper::commRank( MPI_COMM_GEOSX ) << std::endl << std::endl; - std::cout << "Number of well elements = " << m_numElems << std::endl; - + TableData tableWellData; for( globalIndex iwelem = 0; iwelem < m_numElems; ++iwelem ) { - std::cout << "Well element #" << iwelem << std::endl; - std::cout << "Coordinates of the element center: " << m_elemCenterCoords[iwelem] << std::endl; - if( m_nextElemId[iwelem] < 0 ) - { - std::cout << "No next well element" << std::endl; - } - else - { - std::cout << "Next well element # = " << m_nextElemId[iwelem] << std::endl; - } - if( m_prevElemId[iwelem][0] < 0 ) - { - std::cout << "No previous well element" << std::endl; - } - else + std::optional< globalIndex > nextElement; + std::optional< globalIndex > prevElement; + + if( m_nextElemId[iwelem] >= 0 ) { - std::cout << "Previous well element #" << m_prevElemId[iwelem][0] << std::endl; + nextElement = m_nextElemId[iwelem]; } - for( globalIndex inode = 0; inode < m_numNodesPerElem; ++inode ) + + if( m_prevElemId[iwelem][0] >= 0 ) { - if( inode == 0 ) - { - std::cout << "First well node: #" << m_elemToNodesMap[iwelem][inode] << std::endl; - } - else - { - std::cout << "Second well node: #" << m_elemToNodesMap[iwelem][inode] << std::endl; - } + prevElement = m_prevElemId[iwelem][0]; } + + tableWellData.addRow( iwelem, + m_elemCenterCoords[iwelem][0], + m_elemCenterCoords[iwelem][1], + m_elemCenterCoords[iwelem][2], + prevElement, + nextElement ); } - std::cout << std::endl << "Number of perforations = " << m_numPerforations << std::endl; + string const wellTitle = GEOS_FMT( "Well '{}' Element Table", getName() ); + TableLayout const tableWellLayout = TableLayout( { + TableLayout::ColumnParam{"Element no.", TableLayout::Alignment::right}, + TableLayout::ColumnParam{"CoordX", TableLayout::Alignment::right}, + TableLayout::ColumnParam{"CoordY", TableLayout::Alignment::right}, + TableLayout::ColumnParam{"CoordZ", TableLayout::Alignment::right}, + TableLayout::ColumnParam{"Prev\nElement", TableLayout::Alignment::right}, + TableLayout::ColumnParam{"Next\nElement", TableLayout::Alignment::right}, + }, wellTitle ); + + TableTextFormatter const tableFormatter( tableWellLayout ); + GEOS_LOG_RANK_0( tableFormatter.toString( tableWellData )); +} +void WellGeneratorBase::logPerforationTable() const +{ + TableData tablePerfoData; for( globalIndex iperf = 0; iperf < m_numPerforations; ++iperf ) { - std::cout << "Perforation #" << iperf << std::endl; - std::cout << "Coordinates of the perforation: " << m_perfCoords[iperf] << std::endl; - std::cout << "Is connected to well element #" << m_perfElemId[iperf] << std::endl; + tablePerfoData.addRow( iperf, m_perfCoords[iperf], m_perfElemId[iperf] ); } - std::cout << std::endl; + TableLayout const tableLayoutPerfo ( {"Perforation no.", "Coordinates", "connected to"}, + GEOS_FMT( "Well '{}' Perforation Table", getName() ) ); + TableTextFormatter const tablePerfoLog( tableLayoutPerfo ); + GEOS_LOG_RANK_0( tablePerfoLog.toString( tablePerfoData )); } } diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp index 07f56600536..1f82fc688cb 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp @@ -295,7 +295,8 @@ class WellGeneratorBase : public WellGeneratorABC ///@} /// @cond DO_NOT_DOCUMENT - void debugWellGeometry() const; + void logInternalWell() const; + void logPerforationTable() const; /// @endcond /// Global number of perforations From 0f53ecda83cda4c46974d4f1ce3174bb458d3d91 Mon Sep 17 00:00:00 2001 From: Guotong <133127368+Guotong-Ren@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:03:23 -0500 Subject: [PATCH 077/286] add stress initialization for hydrofracture solver (#3150) --- .../physicsSolvers/multiphysics/HydrofractureSolver.cpp | 2 +- .../multiphysics/PoromechanicsInitialization.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 803f72cdc00..530f813f82b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -203,7 +203,7 @@ real64 HydrofractureSolver< POROMECHANICS_SOLVER >::fullyCoupledSolverStep( real dtReturn = nonlinearImplicitStep( time_n, dt, cycleNumber, domain ); - if( m_surfaceGenerator->solverStep( time_n, dt, cycleNumber, domain ) > 0 ) + if( !this->m_performStressInitialization && m_surfaceGenerator->solverStep( time_n, dt, cycleNumber, domain ) > 0 ) { locallyFractured = 1; } diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index b21b1d904f5..ceadb7519dd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -21,6 +21,7 @@ #include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/multiphysics/MultiphasePoromechanics.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" +#include "physicsSolvers/multiphysics/HydrofractureSolver.hpp" #include "mainInterface/ProblemManager.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" @@ -132,10 +133,12 @@ typedef PoromechanicsInitialization< MultiphasePoromechanics< CompositionalMulti typedef PoromechanicsInitialization< MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > > > MultiphaseReservoirPoromechanicsInitialization; typedef PoromechanicsInitialization< SinglePhasePoromechanics< SinglePhaseBase > > SinglePhasePoromechanicsInitialization; typedef PoromechanicsInitialization< SinglePhasePoromechanics< SinglePhaseReservoirAndWells< SinglePhaseBase > > > SinglePhaseReservoirPoromechanicsInitialization; +typedef PoromechanicsInitialization< HydrofractureSolver< SinglePhasePoromechanics< SinglePhaseBase > > > HydrofractureInitialization; REGISTER_CATALOG_ENTRY( TaskBase, MultiphasePoromechanicsInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, MultiphaseReservoirPoromechanicsInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, SinglePhasePoromechanicsInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, SinglePhaseReservoirPoromechanicsInitialization, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( TaskBase, HydrofractureInitialization, string const &, Group * const ) } } /* namespace geos */ From 5418d08dd1d15795eb714a6c742528e0db5722ea Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Tue, 4 Jun 2024 16:27:23 -0500 Subject: [PATCH 078/286] Activate fluid models (#3123) Co-authored-by: Brian Han --- .../fluid/multifluid/MultiFluidSelector.hpp | 30 ++++++++++--------- .../fluid/multifluid/PVTDriver.cpp | 10 +++++-- .../functions/NegativeTwoPhaseFlash.hpp | 30 ++----------------- .../models/NegativeTwoPhaseFlashModel.hpp | 6 ++-- .../testPVT_Compositional.xml | 8 ++--- 5 files changed, 32 insertions(+), 52 deletions(-) diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index b7a71a3d9ca..83607986b96 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -41,18 +41,19 @@ void constitutiveUpdatePassThru( MultiFluidBase const & fluid, { ConstitutivePassThruHandler< DeadOilFluid, BlackOilFluid, - CompositionalTwoPhasePengRobinsonConstantViscosity, - CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity, -// CompositionalTwoPhasePengRobinsonLBCViscosity, -// CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, #ifdef GEOSX_USE_PVTPackage CompositionalMultiphaseFluidPVTPackage, #endif CO2BrinePhillipsFluid, CO2BrineEzrokhiFluid, - CO2BrinePhillipsThermalFluid -// ,CO2BrineEzrokhiThermalFluid "Uncommenting this will lead to compiler segfault. Need to split compilation -// units for all the options" + CO2BrinePhillipsThermalFluid, +#if !defined(GEOS_DEVICE_COMPILE) + CO2BrineEzrokhiThermalFluid, + CompositionalTwoPhasePengRobinsonLBCViscosity, + CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, +#endif + CompositionalTwoPhasePengRobinsonConstantViscosity, + CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity >::execute( fluid, std::forward< LAMBDA >( lambda ) ); } @@ -62,18 +63,19 @@ void constitutiveUpdatePassThru( MultiFluidBase & fluid, { ConstitutivePassThruHandler< DeadOilFluid, BlackOilFluid, - CompositionalTwoPhasePengRobinsonConstantViscosity, - CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity, -// CompositionalTwoPhasePengRobinsonLBCViscosity, -// CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, #ifdef GEOSX_USE_PVTPackage CompositionalMultiphaseFluidPVTPackage, #endif CO2BrinePhillipsFluid, CO2BrineEzrokhiFluid, - CO2BrinePhillipsThermalFluid - //,CO2BrineEzrokhiThermalFluid "Uncommenting this will lead to compiler segfault. Need to split compilation -// units for all the options" + CO2BrinePhillipsThermalFluid, +#if !defined(GEOS_DEVICE_COMPILE) + CO2BrineEzrokhiThermalFluid, + CompositionalTwoPhasePengRobinsonLBCViscosity, + CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, +#endif + CompositionalTwoPhasePengRobinsonConstantViscosity, + CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity >::execute( fluid, std::forward< LAMBDA >( lambda ) ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp index b77ee54e653..83de5223ad4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp @@ -309,6 +309,10 @@ void PVTDriver::compareWithBaseline() { headerRows++; } + if( m_outputMassDensity ) + { + headerRows++; + } if( m_outputPhaseComposition ) { headerRows += getFluid().numFluidPhases(); @@ -335,9 +339,9 @@ void PVTDriver::compareWithBaseline() real64 const error = fabs( m_table[row][col]-value ) / ( fabs( value )+1 ); GEOS_THROW_IF( error > MultiFluidConstants::baselineTolerance, - "Results do not match baseline at data row " << row+1 - << " (row " << row+headerRows << " with header)" - << " and column " << col+1, std::runtime_error ); + GEOS_FMT( "Results do not match baseline ({} vs {}) at data row {} (row {} with header) and column {}", + m_table[row][col], value, row+1, row+headerRows, col+1 ), + std::runtime_error ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp index 8498deabe1a..1b9a9a5bc57 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -93,27 +93,14 @@ struct NegativeTwoPhaseFlash } bool kValueReset = true; - constexpr real64 boundsTolerance = 1.0e-3; + constexpr real64 boundsTolerance = MultiFluidConstants::SSITolerance; if( needInitialisation ) { KValueInitialization::computeWilsonGasLiquidKvalue( numComps, pressure, temperature, componentProperties, - kVapourLiquid );/** - vapourPhaseMoleFraction = RachfordRice::solve( - kVapourLiquid.toSliceConst(), composition, presentComponents - ); - if( vapourPhaseMoleFraction < -boundsTolerance || - vapourPhaseMoleFraction > 1.0 + boundsTolerance ) - { - kValueReset = true; - KValueInitialization::computeConstantLiquidKvalue( numComps, - pressure, - temperature, - componentProperties, - kVapourLiquid ); - }*/ + kVapourLiquid ); } vapourPhaseMoleFraction = RachfordRice::solve( kVapourLiquid.toSliceConst(), composition, presentComponents ); @@ -164,20 +151,7 @@ struct NegativeTwoPhaseFlash kVapourLiquid[ic] *= exp( fugacityRatios[ic] ); } } -//std::cout -//<< std::setw(3) << iterationCount << " " -//<< std::setw(12) << pressure << " " -//<< std::setw(10) << temperature << " " -//<< std::setw(15) << error << " " -//<< std::setw(15) << vapourPhaseMoleFraction << " "; -//for( integer const ic : {0,1,8} ) -//{ -// std::cout << std::setw(15) << kVapourLiquid[ic] << " "; -//} -//std::cout -//<< "\n"; } -//std::cout << "================================================================================\n"; // Retrieve physical bounds from negative flash values if( vapourPhaseMoleFraction < MultiFluidConstants::epsilon ) diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp index d9a50bb0f9c..db3610276f9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -74,9 +74,9 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate phaseFraction.value[m_vapourIndex], phaseCompFraction.value[m_liquidIndex], phaseCompFraction.value[m_vapourIndex] ); - GEOS_UNUSED_VAR( flashStatus ); - //GEOS_ERROR_IF( !flashStatus, - // GEOS_FMT( "Negative two phase flash failed to converge {:.5e} {:.3f}", pressure, temperature )); + GEOS_ERROR_IF( !flashStatus, + GEOS_FMT( "Negative two phase flash failed to converge at pressure {:.5e} and temperature {:.3f}", + pressure, temperature )); // Calculate derivatives NegativeTwoPhaseFlash::computeDerivatives< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >( diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml index 8a2bab3b501..dc2da325757 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml @@ -12,7 +12,7 @@ outputMassDensity="1" outputCompressibility="1" outputPhaseComposition="1" - output="testPVT_Compositional_liveOilPR.txt" + baseline="testPVT_Compositional_liveOilPR.txt" logLevel="1"/> From 19c3850ddc26e1fc8844ba5d7b06687d2fe4aac6 Mon Sep 17 00:00:00 2001 From: Sy-Tuan Nguyen <45685596+sytuannguyen@users.noreply.github.com> Date: Wed, 5 Jun 2024 06:53:46 +0700 Subject: [PATCH 079/286] Add the command for running uncrustify style to the Doc (#3151) --- .../sphinx/developerGuide/KeyComponents/AddingNewSolver.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst b/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst index d8cb998df21..00bf5cd0a90 100644 --- a/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst +++ b/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst @@ -359,6 +359,6 @@ After assembling both declarations and implementations for our new solver, the f - add declarations to parent CMakeLists.txt (here add to ``physicsSolvers_headers`` ); - add implementations to parent CMakeLists.txt (here add to ``physicsSolvers_sources``); - check that Doxygen comments are properly set in our solver class; - - uncrustify it to match the code style; + - uncrustify it to match the code style by going to the build folder and running the command: make uncrustify_style; - write unit tests for each new features in the solver class; - write an integratedTests for the solver class. From 967b5e45eb36ef9da9abf8e1afe74ad13155e438 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 5 Jun 2024 11:03:02 -0500 Subject: [PATCH 080/286] Fix updateConfiguration (#3113) Co-authored-by: Matteo Cusini Co-authored-by: Jian HUANG --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 18 ++++++---- .../SlipPermeability_pEDFM_base.xml | 2 +- .../multiphysics/CoupledSolver.hpp | 36 +++++++++++++++++++ ...ePhasePoromechanicsConformingFractures.cpp | 16 --------- ...ePhasePoromechanicsConformingFractures.hpp | 6 ---- 6 files changed, 50 insertions(+), 30 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 5c56e1c922f..40892926250 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3050-5325-9f50d94 + baseline: integratedTests/baseline_integratedTests-pr3113-5435-b794227 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 7c366a17b31..0838ee4ec43 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,52 +6,58 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3113 (2024-06-05) +===================== +Add general version updateConfiguration. Rebaseline of some edfm cases is needed. + + PR #3050 (2024-05-20) ===================== Spatially varying grain bulk modulus. Rebaseline of all poromechanics cases needed. + PR #3141 (2024-05-28) ===================== Test cashing baselines locally. + PR #3125 (2024-05-16) ===================== Remove field to store pressure gradient cell-wise for solvers that don't need it. + PR #2110 (2024-05-13) ===================== new field to store pressure gradient cell-wise. + PR #3060 (2024-05-13) ====================== - Rebaselined after addition of elastic VTI wave propagator. + PR #4950 (2024-05-10) ====================== - Added smoke tests for SeismicityRate solver in inducedSeismicity. + PR #3086 (2024-05-09) ====================== - Added a presure-dependent permeability model and the transmissibility calculation in the CellElementStencil + PR #3105 (2024-05-08) ====================== - Added missing derivative for temperature, hence small numerical diffs in thermal tests results and numeracal behavior PR #2917 (2024-05-07) ====================== - New fields for wellsControls: wellControls1_ConstantMassRate_table, targetMassRate, massDensity, ... PR #3044 (2024-05-02) ====================== - Removed old integratedTests submodule Implemented new baseline storage Implemented new CI integrated tests diff --git a/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml b/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml index 0ae1330e427..5d915f898c5 100755 --- a/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml +++ b/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml @@ -12,7 +12,7 @@ logLevel="1"> diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index d46bbc32def..8c0b818f8e3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -355,6 +355,42 @@ class CoupledSolver : public SolverBase return isConverged; } + virtual bool updateConfiguration( DomainPartition & domain ) override + { + bool result = true; + forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) + { + result &= solver->updateConfiguration( domain ); + } ); + return result; + } + + virtual void outputConfigurationStatistics( DomainPartition const & domain ) const override + { + forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) + { + solver->outputConfigurationStatistics( domain ); + } ); + } + + virtual void resetConfigurationToBeginningOfStep( DomainPartition & domain ) override + { + forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) + { + solver->resetConfigurationToBeginningOfStep( domain ); + } ); + } + + virtual bool resetConfigurationToDefault( DomainPartition & domain ) const override + { + bool result = true; + forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) + { + result &= solver->resetConfigurationToDefault( domain ); + } ); + return result; + } + protected: /** diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 0c215c0db50..919b8991a9d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -60,16 +60,6 @@ void SinglePhasePoromechanicsConformingFractures::setupCoupling( DomainPartition DofManager::Connector::Elem ); } -bool SinglePhasePoromechanicsConformingFractures::updateConfiguration( DomainPartition & domain ) -{ - return solidMechanicsSolver()->updateConfiguration( domain ); -} - -bool SinglePhasePoromechanicsConformingFractures::resetConfigurationToDefault( DomainPartition & domain ) const -{ - return solidMechanicsSolver()->resetConfigurationToDefault( domain ); -} - void SinglePhasePoromechanicsConformingFractures::setupSystem( DomainPartition & domain, DofManager & dofManager, CRSMatrix< real64, globalIndex > & localMatrix, @@ -758,12 +748,6 @@ void SinglePhasePoromechanicsConformingFractures::updateHydraulicApertureAndFrac } ); } - -void SinglePhasePoromechanicsConformingFractures::outputConfigurationStatistics( DomainPartition const & domain ) const -{ - solidMechanicsSolver()->outputConfigurationStatistics( domain ); -} - REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsConformingFractures, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp index 06ed8c35d55..57f6a327662 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp @@ -89,12 +89,6 @@ class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechan virtual void updateState( DomainPartition & domain ) override final; - bool resetConfigurationToDefault( DomainPartition & domain ) const override final; - - bool updateConfiguration( DomainPartition & domain ) override final; - - void outputConfigurationStatistics( DomainPartition const & domain ) const override final; - /**@}*/ private: From c8e28b0e0b56bd7abfb0c9d30240dbf282842ff5 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 5 Jun 2024 17:07:26 -0500 Subject: [PATCH 081/286] Add missing tests into ATS and adjust output naming (#3120) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 ++++ ...h_cap_1d_upwind.xml => 2ph_cap_1d_ihu.xml} | 3 ++- .../4comp_2ph_1d.xml | 3 ++- .../co2_flux_3d.xml | 3 ++- .../co2_hybrid_1d.xml | 3 ++- .../compositionalMultiphaseFlow.ats | 24 +++++++++++++++++++ ...l_2ph_staircase_gravity_segregation_3d.xml | 3 ++- .../deadoil_3ph_corey_1d_fractured.xml | 7 +++--- .../deadoil_3ph_staircase_3d.xml | 3 ++- .../deadoil_3ph_staircase_obl_3d.xml | 3 ++- .../singlePhaseFlowFractures.ats | 4 ++-- .../mesh/SurfaceElementRegion.cpp | 6 ++--- .../EmbeddedSurfaceGenerator.hpp | 5 ++++ 14 files changed, 57 insertions(+), 16 deletions(-) rename inputFiles/compositionalMultiphaseFlow/{4comp_2ph_cap_1d_upwind.xml => 2ph_cap_1d_ihu.xml} (98%) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 40892926250..79b4e93f13d 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3113-5435-b794227 + baseline: integratedTests/baseline_integratedTests-pr3120-5441-d1e1daf allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 0838ee4ec43..40c1c70e41f 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3120 (2024-06-05) +===================== +Add missing compositionalMultiphaseFlow tests into ATS and adjust output naming. Rebaseline accordingly. + PR #3113 (2024-06-05) ===================== Add general version updateConfiguration. Rebaseline of some edfm cases is needed. diff --git a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d_upwind.xml b/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml similarity index 98% rename from inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d_upwind.xml rename to inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml index 5d043375c8f..8ca061df0c1 100644 --- a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d_upwind.xml +++ b/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml @@ -188,7 +188,8 @@ + name="vtkOutput" + plotFileRoot="2ph_cap_1d_ihu"/> diff --git a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml b/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml index 556e49fdea4..389f0e2a0af 100644 --- a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml @@ -251,7 +251,8 @@ + name="vtkOutput" + plotFileRoot="4comp_2ph_1d"/> diff --git a/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml b/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml index e0b3cecde11..d693f1542e3 100644 --- a/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml @@ -313,7 +313,8 @@ + name="vtkOutput" + plotFileRoot="co2_flux_3d"/> diff --git a/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml b/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml index 296cd04fbc4..b5ea99f5ff5 100644 --- a/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml @@ -199,7 +199,8 @@ + name="vtkOutput" + plotFileRoot="co2_hybrid_1d"/> diff --git a/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats b/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats index a0072bc2653..20d44298c97 100644 --- a/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats +++ b/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats @@ -30,6 +30,22 @@ decks = [ restart_step=109, check_step=209, restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="deadoil_3ph_stone2_1d", + description= + "Compositional multiphase flow test (1D displacement, 3-phase dead-oil, Stone2 relperm curves)", + partitions=((1, 1, 1), (3, 1, 1)), + restart_step=109, + check_step=209, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="deadoil_3ph_corey_1d_fractured", + description= + "Compositional multiphase flow test with EDFM (1D displacement, 3-phase dead-oil, Brooks-Corey pairwise 2-phase relperm curves)", + partitions=((1, 1, 1), (3, 1, 1)), + restart_step=0, + check_step=209, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( name="co2_hybrid_1d", description= @@ -86,6 +102,14 @@ decks = [ restart_step=28, check_step=38, restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="2ph_cap_1d_ihu", + description= + "Two-phase flow test for IHU (1D displacement, 2-phase, capillary pressure)", + partitions=((1, 1, 1), (3, 1, 1)), + restart_step=34, + check_step=60, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), ] generate_geos_tests(decks) diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml index 0d9e9853828..595620b201c 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_2ph_staircase_gravity_segregation_3d.xml @@ -179,7 +179,8 @@ + name="vtkOutput" + plotFileRoot="deadoil_2ph_staircase_gravity_segregation_3d"/> diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml index 35d52ad08c2..2d0b2693a80 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml @@ -88,11 +88,11 @@ beginTime="1e5" target="/Solvers/compflow"/> - + target="/Outputs/restartOutput"/> @@ -312,7 +312,8 @@ + name="vtkOutput" + plotFileRoot="deadoil_3ph_corey_1d_fractured"/> diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml index fc452b3d6d1..7c97d2eed8d 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d.xml @@ -306,7 +306,8 @@ name="siloOutput" plotLevel="3"/> + name="vtkOutput" + plotFileRoot="deadoil_3ph_staircase_3d"/> diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml index f9722261b2b..545ca4e81f2 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_obl_3d.xml @@ -252,7 +252,8 @@ + name="vtkOutput" + plotFileRoot="deadoil_3ph_staircase_obl_3d"/> diff --git a/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats b/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats index 392c4217da4..e3453332620 100644 --- a/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats +++ b/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats @@ -36,7 +36,7 @@ decks = [ description= 'Single phase flow test (3D, incompressible, fracture/matrix flow, EDFM)', partitions=((1, 1, 1), (2, 2, 1)), - restart_step=1, + restart_step=0, check_step=1, restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( @@ -44,7 +44,7 @@ decks = [ description= 'Single phase flow test (3D, incompressible, fracture/matrix flow, EDFM)', partitions=((1, 1, 1), (2, 2, 1)), - restart_step=1, + restart_step=0, check_step=1, restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( diff --git a/src/coreComponents/mesh/SurfaceElementRegion.cpp b/src/coreComponents/mesh/SurfaceElementRegion.cpp index c9f036a6553..8d5b0b167e3 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.cpp @@ -170,9 +170,9 @@ localIndex SurfaceElementRegion::addToFractureMesh( real64 const time_np1, for( localIndex ke = 0; ke < 2; ++ke ) { - localIndex const & er = faceToElementRegion[faceIndices[ke]][ke]; - localIndex const & esr = faceToElementSubRegion[faceIndices[ke]][ke]; - localIndex const & ei = faceToElementIndex[faceIndices[ke]][ke]; + localIndex const er = faceToElementRegion[faceIndices[ke]][ke]; + localIndex const esr = faceToElementSubRegion[faceIndices[ke]][ke]; + localIndex const ei = faceToElementIndex[faceIndices[ke]][ke]; if( er != -1 && esr != -1 && ei != -1 ) { diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp index 2c2b6dd8ae1..2d8775cb1ab 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp @@ -98,6 +98,11 @@ class EmbeddedSurfaceGenerator : public SolverBase virtual void initializePostInitialConditionsPreSubGroups() override final; + virtual void postRestartInitialization() override final + { + GEOS_ERROR( "Restarting is not supported for cases involving EmbeddedSurfaceGenerator" ); + } + private: void addToFractureStencil( DomainPartition & domain ); From bd75ec8c969b174400f8410a945b4f3ba7d1c701 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 5 Jun 2024 22:36:15 -0500 Subject: [PATCH 082/286] Introduce configuration tolerance (#3075) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 ++++ .../NonlinearSolverParameters.cpp | 5 ++++ .../NonlinearSolverParameters.hpp | 7 +++-- .../contact/SolidMechanicsLagrangeContact.cpp | 28 +++++++++++-------- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 79b4e93f13d..9f1f04b5f96 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3120-5441-d1e1daf + baseline: integratedTests/baseline_integratedTests-pr3075-5458-8cde9da allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 40c1c70e41f..f0c6b8a4b1b 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,10 +6,16 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3075 (2024-06-05) +===================== +Introduce configuration tolerance. Rebaseline because of the new parameter in NonlinearSolverParameters. + + PR #3120 (2024-06-05) ===================== Add missing compositionalMultiphaseFlow tests into ATS and adjust output naming. Rebaseline accordingly. + PR #3113 (2024-06-05) ===================== Add general version updateConfiguration. Rebaseline of some edfm cases is needed. diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp index 9f238c6a9f1..200ffa4e9b4 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp @@ -147,6 +147,11 @@ NonlinearSolverParameters::NonlinearSolverParameters( string const & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Max number of times that the configuration can be changed" ); + registerWrapper( viewKeysStruct::configurationToleranceString(), &m_configurationTolerance ). + setApplyDefaultValue( 0.0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Configuration tolerance" ); + /// GEOS mainly uses FIM coupling so let's define FIM as the default. registerWrapper( viewKeysStruct::couplingTypeString(), &m_couplingType ). setInputFlag( dataRepository::InputFlags::OPTIONAL ). diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp index e5e7a1d1120..097122a84ed 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp @@ -82,6 +82,7 @@ class NonlinearSolverParameters : public dataRepository::Group m_maxTimeStepCuts = params.m_maxTimeStepCuts; m_timeStepCutFactor = params.m_timeStepCutFactor; m_maxNumConfigurationAttempts = params.m_maxNumConfigurationAttempts; + m_configurationTolerance = params.m_configurationTolerance; return *this; } @@ -122,12 +123,11 @@ class NonlinearSolverParameters : public dataRepository::Group static constexpr char const * maxSubStepsString() { return "maxSubSteps"; } static constexpr char const * maxTimeStepCutsString() { return "maxTimeStepCuts"; } - static constexpr char const * minNumNewtonIterationsString() { return "minNumberOfNewtonIterations"; } static constexpr char const * timeStepCutFactorString() { return "timeStepCutFactor"; } static constexpr char const * maxAllowedResidualNormString() { return "maxAllowedResidualNorm"; } - static constexpr char const * numConfigurationAttemptsString() { return "numConfigurationAttempts"; } static constexpr char const * maxNumConfigurationAttemptsString() { return "maxNumConfigurationAttempts"; } + static constexpr char const * configurationToleranceString() { return "configurationTolerance"; } static constexpr char const * couplingTypeString() { return "couplingType"; } static constexpr char const * sequentialConvergenceCriterionString() { return "sequentialConvergenceCriterion"; } @@ -317,6 +317,9 @@ class NonlinearSolverParameters : public dataRepository::Group /// Max number of times that the configuration can be changed integer m_maxNumConfigurationAttempts; + /// Configuration tolerance + double m_configurationTolerance; + /// Type of coupling CouplingType m_couplingType; diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 8c5439511cc..ef3b942a431 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -1857,7 +1857,8 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai using namespace fields::contact; - int hasConfigurationConverged = true; + real64 changedArea = 0; + real64 totalArea = 0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, @@ -1875,13 +1876,15 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai arrayView2d< real64 const > const & traction = subRegion.getField< contact::traction >(); arrayView2d< real64 const > const & dispJump = subRegion.getField< contact::dispJump >(); arrayView1d< integer > const & fractureState = subRegion.getField< contact::fractureState >(); + arrayView1d< real64 const > const & faceArea = subRegion.getElementArea().toViewConst(); arrayView1d< real64 const > const & normalTractionTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ); arrayView1d< real64 const > const & normalDisplacementTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalDisplacementToleranceString() ); - RAJA::ReduceMin< parallelHostReduce, integer > checkActiveSetSub( 1 ); + RAJA::ReduceSum< parallelHostReduce, real64 > changed( 0 ); + RAJA::ReduceSum< parallelHostReduce, real64 > total( 0 ); constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) { @@ -1941,27 +1944,28 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai fractureState[kfe] = contact::FractureState::Stick; } } - checkActiveSetSub.min( compareFractureStates( originalFractureState, fractureState[kfe] ) ); + + changed += faceArea[kfe] * !compareFractureStates( originalFractureState, fractureState[kfe] ); + total += faceArea[kfe]; } } ); } ); - hasConfigurationConverged &= checkActiveSetSub.get(); + changedArea += changed.get(); + totalArea += total.get(); } ); } ); // Need to synchronize the fracture state due to the use will be made of in AssemblyStabilization synchronizeFractureState( domain ); - // Compute if globally the fracture state has changed - int hasConfigurationConvergedGlobally; - MpiWrapper::allReduce( &hasConfigurationConverged, - &hasConfigurationConvergedGlobally, - 1, - MPI_LAND, - MPI_COMM_GEOSX ); + // Compute global area of changed elements + changedArea = MpiWrapper::sum( changedArea ); + // and total area of fracture elements + totalArea = MpiWrapper::sum( totalArea ); - return hasConfigurationConvergedGlobally; + // Assume converged if changed area is below certain fraction of total area + return changedArea <= m_nonlinearSolverParameters.m_configurationTolerance * totalArea; } bool SolidMechanicsLagrangeContact::isFractureAllInStickCondition( DomainPartition const & domain ) const From 7a18ecf27602ee939531f9aca5af65c3b939b18c Mon Sep 17 00:00:00 2001 From: Algiane Froehly Date: Tue, 11 Jun 2024 02:33:21 +0200 Subject: [PATCH 083/286] Compilation failure on pangea-3 if ENABLE_CUDA is OFF (#3129) --- .devcontainer/devcontainer.json | 2 +- src/CMakeLists.txt | 2 +- src/coreComponents/CMakeLists.txt | 2 +- src/coreComponents/common/TimingMacros.hpp | 2 +- src/coreComponents/constitutive/unitTests/CMakeLists.txt | 2 +- src/coreComponents/dataRepository/unitTests/CMakeLists.txt | 2 +- src/coreComponents/fileIO/CMakeLists.txt | 2 +- src/coreComponents/finiteElement/unitTests/CMakeLists.txt | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index dda45adc958..4df342044e9 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "263-252" + "GEOS_TPL_TAG": "264-338" } }, "runArgs": [ diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 91fa8bd7f86..930734a71b1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -127,7 +127,7 @@ if( ENABLE_CUDA ) list( APPEND extraComponentsLinkList cuda ) endif() -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND extraComponentsLinkList CUDA::nvToolsExt ) endif() diff --git a/src/coreComponents/CMakeLists.txt b/src/coreComponents/CMakeLists.txt index 81653fb0b8f..da5b68dbd54 100644 --- a/src/coreComponents/CMakeLists.txt +++ b/src/coreComponents/CMakeLists.txt @@ -28,7 +28,7 @@ if ( ENABLE_CUDA ) list( APPEND parallelDeps cuda ) endif() -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND parallelDeps CUDA::nvToolsExt ) endif() diff --git a/src/coreComponents/common/TimingMacros.hpp b/src/coreComponents/common/TimingMacros.hpp index 297aa49f8f1..d9089fd4d95 100644 --- a/src/coreComponents/common/TimingMacros.hpp +++ b/src/coreComponents/common/TimingMacros.hpp @@ -40,7 +40,7 @@ namespace timingHelpers } -#if defined( GEOS_USE_CUDA_NVTOOLSEXT ) +#if defined( GEOS_USE_CUDA ) && defined( GEOS_USE_CUDA_NVTOOLSEXT ) #include "nvToolsExt.h" diff --git a/src/coreComponents/constitutive/unitTests/CMakeLists.txt b/src/coreComponents/constitutive/unitTests/CMakeLists.txt index 10625ef6df4..2cd470b2e28 100644 --- a/src/coreComponents/constitutive/unitTests/CMakeLists.txt +++ b/src/coreComponents/constitutive/unitTests/CMakeLists.txt @@ -17,7 +17,7 @@ set( gtest_geosx_tests set( dependencyList gtest blas lapack constitutive ${parallelDeps} ) -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND dependencyList CUDA::nvToolsExt ) endif() diff --git a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt index 14386e0b842..f56fdc507c8 100644 --- a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt +++ b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt @@ -7,7 +7,7 @@ set( dataRepository_tests set( dependencyList ${parallelDeps} gtest dataRepository ) -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND dependencyList CUDA::nvToolsExt ) endif() diff --git a/src/coreComponents/fileIO/CMakeLists.txt b/src/coreComponents/fileIO/CMakeLists.txt index a37d8cdfc41..93b1a3d0b5e 100644 --- a/src/coreComponents/fileIO/CMakeLists.txt +++ b/src/coreComponents/fileIO/CMakeLists.txt @@ -81,7 +81,7 @@ if( ENABLE_VTK ) list( APPEND dependencyList VTK::IOLegacy VTK::IOXML ) endif() -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND dependencyList CUDA::nvToolsExt ) endif() diff --git a/src/coreComponents/finiteElement/unitTests/CMakeLists.txt b/src/coreComponents/finiteElement/unitTests/CMakeLists.txt index a8f044271be..0360038c17f 100644 --- a/src/coreComponents/finiteElement/unitTests/CMakeLists.txt +++ b/src/coreComponents/finiteElement/unitTests/CMakeLists.txt @@ -12,7 +12,7 @@ set(testSources set( dependencyList gtest finiteElement ${parallelDeps} ) -if( ENABLE_CUDA_NVTOOLSEXT ) +if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND dependencyList CUDA::nvToolsExt ) endif() From 010fc34a5b9ab64f810c27881fbad575f21fd6ce Mon Sep 17 00:00:00 2001 From: Stefano Frambati Date: Tue, 11 Jun 2024 10:05:17 +0100 Subject: [PATCH 084/286] Viscoelastic wave propagator (#3080) * first version of viscoelastic propagator. Anelasticity coefficient are not automatically calculated. * removed unused variables * added default computation of anelasticity parameter and check on Q vs. y values * added unit test and integrated test. Also added the forgotten DAS integrated test to the ats config file * corrected bug in input string * bugfix * uncrustify + unused var * split unit test for code coverage * getting aroung compilation error in debug mode * typo * change after merge * leftover modifications from merge * switched VTI and isotropic * removed plot of memory variables * Forgotten commas in Elastic ATS file * Update .integrated_tests.yaml * Update BASELINE_NOTES.md * Revert .integrated_tests.yaml to investigate why some (unrelated) integratedTests are failing * Update .integrated_tests.yaml --------- Co-authored-by: acitrain <60715545+acitrain@users.noreply.github.com> Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + inputFiles/wavePropagation/ElasticSEM.ats | 16 ++ .../wavePropagation/elas3D_att_smoke.xml | 185 ++++++++++++++ .../ElasticVTIWaveEquationSEMKernel.hpp | 4 +- .../isotropic/ElasticWaveEquationSEM.cpp | 129 ++++++++-- .../isotropic/ElasticWaveEquationSEM.hpp | 7 + .../ElasticWaveEquationSEMKernel.hpp | 126 +++++++-- .../sem/elastic/shared/ElasticFields.hpp | 64 +++++ .../shared/ElasticTimeSchemeSEMKernel.hpp | 100 ++++++++ .../wavePropagation/shared/WaveSolverBase.cpp | 39 ++- .../wavePropagation/shared/WaveSolverBase.hpp | 15 +- .../shared/WaveSolverUtils.hpp | 11 + .../wavePropagationTests/CMakeLists.txt | 1 + .../testWavePropagationAttenuation.cpp | 240 ++++++++++++++++++ 15 files changed, 899 insertions(+), 44 deletions(-) create mode 100644 inputFiles/wavePropagation/elas3D_att_smoke.xml create mode 100644 src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 9f1f04b5f96..2c2c0912265 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3075-5458-8cde9da + baseline: integratedTests/baseline_integratedTests-pr3080-5511-8210a1a allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index f0c6b8a4b1b..8e8eed2bde5 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3080 (2024-06-07) +===================== +Rebaseline after adding viscoelastic wave propagator. + PR #3075 (2024-06-05) ===================== Introduce configuration tolerance. Rebaseline because of the new parameter in NonlinearSolverParameters. diff --git a/inputFiles/wavePropagation/ElasticSEM.ats b/inputFiles/wavePropagation/ElasticSEM.ats index 7ea1adb9713..093fc9859e2 100644 --- a/inputFiles/wavePropagation/ElasticSEM.ats +++ b/inputFiles/wavePropagation/ElasticSEM.ats @@ -36,6 +36,22 @@ decks = [ partitions=((1, 1, 1), (2, 2, 2)), restart_step=100, check_step=200, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="elas3D_att_smoke", + description= + 'Elastic wave solver, first-order FE, with SLS attenuation mechanism', + partitions=((1, 1, 1), (2, 2, 2)), + restart_step=100, + check_step=200, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="elas3D_DAS_smoke", + description= + 'Elastic wave solver, first-order FE, DAS signal', + partitions=((1, 1, 1), (2, 2, 2)), + restart_step=100, + check_step=200, restartcheck_params=RestartcheckParameters(**restartcheck_params)) ] diff --git a/inputFiles/wavePropagation/elas3D_att_smoke.xml b/inputFiles/wavePropagation/elas3D_att_smoke.xml new file mode 100644 index 00000000000..86e331399f9 --- /dev/null +++ b/inputFiles/wavePropagation/elas3D_att_smoke.xml @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp index 6fadbf045b7..8905493ee58 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp @@ -28,7 +28,7 @@ namespace geos { using namespace fields; /// Namespace to contain the elastic wave kernels. -namespace ElasticVTIWaveEquationSEMKernels +namespace elasticVTIWaveEquationSEMKernels { /** @@ -286,7 +286,7 @@ class ExplicitElasticVTISEM : public finiteElement::KernelBase< SUBREGION_TYPE, using ExplicitElasticVTISEMFactory = finiteElement::KernelFactory< ExplicitElasticVTISEM, real64 >; -} // namespace ElasticVTIWaveEquationSEMKernels +} // namespace elasticVTIWaveEquationSEMKernels } // namespace geos diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 4527a134977..669d9e43184 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -156,6 +156,20 @@ void ElasticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) elasticfields::StiffnessVectorz, elasticfields::ElasticFreeSurfaceNodeIndicator >( getName() ); + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + integer l = m_slsReferenceAngularFrequencies.size( 0 ); + nodeManager.registerField< elasticfields::DivPsix, + elasticfields::DivPsiy, + elasticfields::DivPsiz, + elasticfields::StiffnessVectorAx, + elasticfields::StiffnessVectorAy, + elasticfields::StiffnessVectorAz >( getName() ); + nodeManager.getField< elasticfields::DivPsix >().resizeDimension< 1 >( l ); + nodeManager.getField< elasticfields::DivPsiy >().resizeDimension< 1 >( l ); + nodeManager.getField< elasticfields::DivPsiz >().resizeDimension< 1 >( l ); + } + FaceManager & faceManager = mesh.getFaceManager(); faceManager.registerField< elasticfields::ElasticFreeSurfaceFaceIndicator >( getName() ); @@ -166,6 +180,11 @@ void ElasticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< elasticfields::ElasticVelocityVp >( getName() ); subRegion.registerField< elasticfields::ElasticVelocityVs >( getName() ); subRegion.registerField< elasticfields::ElasticDensity >( getName() ); + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + subRegion.registerField< elasticfields::ElasticQualityFactorP >( getName() ); + subRegion.registerField< elasticfields::ElasticQualityFactorS >( getName() ); + } if( m_useVTI ) { @@ -173,7 +192,6 @@ void ElasticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< elasticvtifields::Epsilon >( getName() ); subRegion.registerField< elasticvtifields::Delta >( getName() ); } - } ); } ); @@ -415,12 +433,53 @@ void ElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() dampingz ); } ); } ); + + // check anelasticity coefficient and/or compute it if needed + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + real32 minQVal = computeGlobalMinQFactor(); + if( m_slsAnelasticityCoefficients.size( 0 ) == 1 && m_slsAnelasticityCoefficients[ 0 ] < 0 ) + { + m_slsAnelasticityCoefficients[ 0 ] = 2.0 * minQVal / ( minQVal - 1.0 ); + } + // test if anelasticity is too high and artifacts could appear + real32 ySum = 0.0; + for( integer l = 0; l < m_slsAnelasticityCoefficients.size( 0 ); l++ ) + { + ySum += m_slsAnelasticityCoefficients[ l ]; + } + GEOS_WARNING_IF( ySum > minQVal, "The anelasticity parameters are too high for the given quality factor. This could lead to solution artifacts such as zero-velocity waves." ); + } + } ); WaveSolverUtils::initTrace( "seismoTraceReceiver", getName(), m_outputSeismoTrace, m_receiverConstants.size( 0 ), m_receiverIsLocal ); WaveSolverUtils::initTrace( "dasTraceReceiver", getName(), m_outputSeismoTrace, m_linearDASGeometry.size( 0 ), m_receiverIsLocal ); } +real32 ElasticWaveEquationSEM::computeGlobalMinQFactor() +{ + RAJA::ReduceMin< ReducePolicy< EXEC_POLICY >, real32 > minQ( LvArray::NumericLimits< real32 >::max ); + DomainPartition & domain = getGroupByPath< DomainPartition >( "/Problem/domain" ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, + CellElementSubRegion & elementSubRegion ) + { + arrayView1d< real32 const > const qp = elementSubRegion.getField< elasticfields::ElasticQualityFactorP >(); + arrayView1d< real32 const > const qs = elementSubRegion.getField< elasticfields::ElasticQualityFactorS >(); + forAll< EXEC_POLICY >( elementSubRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const e ) { + minQ.min( qp[e] ); + minQ.min( qs[e] ); + } ); + } ); + } ); + real32 minQVal = minQ.get(); + return MpiWrapper::min< real32 >( minQVal ); +} void ElasticWaveEquationSEM::applyFreeSurfaceBC( real64 const time, DomainPartition & domain ) { @@ -552,8 +611,7 @@ void ElasticWaveEquationSEM::computeUnknowns( real64 const &, if( m_useVTI ) { - auto kernelFactory = ElasticVTIWaveEquationSEMKernels::ExplicitElasticVTISEMFactory( dt ); - + auto kernelFactory = elasticVTIWaveEquationSEMKernels::ExplicitElasticVTISEMFactory( dt ); finiteElement:: regionBasedKernelApplication< EXEC_POLICY, constitutive::NullModel, @@ -566,7 +624,19 @@ void ElasticWaveEquationSEM::computeUnknowns( real64 const &, else { auto kernelFactory = elasticWaveEquationSEMKernels::ExplicitElasticSEMFactory( dt ); + finiteElement:: + regionBasedKernelApplication< EXEC_POLICY, + constitutive::NullModel, + CellElementSubRegion >( mesh, + regionNames, + getDiscretizationName(), + "", + kernelFactory ); + } + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + auto kernelFactory = elasticWaveEquationSEMKernels::ExplicitElasticAttenuativeSEMFactory( dt ); finiteElement:: regionBasedKernelApplication< EXEC_POLICY, constitutive::NullModel, @@ -585,9 +655,29 @@ void ElasticWaveEquationSEM::computeUnknowns( real64 const &, addSourceToRightHandSide( cycleForSource, rhsx, rhsy, rhsz ); SortedArrayView< localIndex const > const solverTargetNodesSet = m_solverTargetNodesSet.toViewConst(); - ElasticTimeSchemeSEM::LeapFrog( dt, ux_np1, ux_n, ux_nm1, uy_np1, uy_n, uy_nm1, uz_np1, uz_n, uz_nm1, - mass, dampingx, dampingy, dampingz, stiffnessVectorx, stiffnessVectory, - stiffnessVectorz, rhsx, rhsy, rhsz, solverTargetNodesSet ); + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + arrayView1d< real32 > const stiffnessVectorAx = nodeManager.getField< elasticfields::StiffnessVectorAx >(); + arrayView1d< real32 > const stiffnessVectorAy = nodeManager.getField< elasticfields::StiffnessVectorAy >(); + arrayView1d< real32 > const stiffnessVectorAz = nodeManager.getField< elasticfields::StiffnessVectorAz >(); + arrayView2d< real32 > const divpsix = nodeManager.getField< elasticfields::DivPsix >(); + arrayView2d< real32 > const divpsiy = nodeManager.getField< elasticfields::DivPsiy >(); + arrayView2d< real32 > const divpsiz = nodeManager.getField< elasticfields::DivPsiz >(); + arrayView1d< real32 > const referenceFrequencies = m_slsReferenceAngularFrequencies.toView(); + arrayView1d< real32 > const anelasticityCoefficients = m_slsAnelasticityCoefficients.toView(); + ElasticTimeSchemeSEM::AttenuationLeapFrog( dt, ux_np1, ux_n, ux_nm1, uy_np1, uy_n, uy_nm1, uz_np1, uz_n, uz_nm1, + divpsix, divpsiy, divpsiz, + mass, dampingx, dampingy, dampingz, stiffnessVectorx, stiffnessVectory, + stiffnessVectorz, stiffnessVectorAx, stiffnessVectorAy, stiffnessVectorAz, + rhsx, rhsy, rhsz, solverTargetNodesSet, + referenceFrequencies, anelasticityCoefficients ); + } + else + { + ElasticTimeSchemeSEM::LeapFrog( dt, ux_np1, ux_n, ux_nm1, uy_np1, uy_n, uy_nm1, uz_np1, uz_n, uz_nm1, + mass, dampingx, dampingy, dampingz, stiffnessVectorx, stiffnessVectory, + stiffnessVectorz, rhsx, rhsy, rhsz, solverTargetNodesSet ); + } } void ElasticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, @@ -599,13 +689,6 @@ void ElasticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, { NodeManager & nodeManager = mesh.getNodeManager(); - arrayView1d< real32 > const stiffnessVectorx = nodeManager.getField< elasticfields::StiffnessVectorx >(); - arrayView1d< real32 > const stiffnessVectory = nodeManager.getField< elasticfields::StiffnessVectory >(); - arrayView1d< real32 > const stiffnessVectorz = nodeManager.getField< elasticfields::StiffnessVectorz >(); - - arrayView1d< real32 > const ux_nm1 = nodeManager.getField< elasticfields::Displacementx_nm1 >(); - arrayView1d< real32 > const uy_nm1 = nodeManager.getField< elasticfields::Displacementy_nm1 >(); - arrayView1d< real32 > const uz_nm1 = nodeManager.getField< elasticfields::Displacementz_nm1 >(); arrayView1d< real32 > const ux_n = nodeManager.getField< elasticfields::Displacementx_n >(); arrayView1d< real32 > const uy_n = nodeManager.getField< elasticfields::Displacementy_n >(); arrayView1d< real32 > const uz_n = nodeManager.getField< elasticfields::Displacementz_n >(); @@ -613,14 +696,15 @@ void ElasticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, arrayView1d< real32 > const uy_np1 = nodeManager.getField< elasticfields::Displacementy_np1 >(); arrayView1d< real32 > const uz_np1 = nodeManager.getField< elasticfields::Displacementz_np1 >(); - arrayView1d< real32 > const rhsx = nodeManager.getField< elasticfields::ForcingRHSx >(); - arrayView1d< real32 > const rhsy = nodeManager.getField< elasticfields::ForcingRHSy >(); - arrayView1d< real32 > const rhsz = nodeManager.getField< elasticfields::ForcingRHSz >(); - /// synchronize displacement fields FieldIdentifiers fieldsToBeSync; fieldsToBeSync.addFields( FieldLocation::Node, { elasticfields::Displacementx_np1::key(), elasticfields::Displacementy_np1::key(), elasticfields::Displacementz_np1::key() } ); + if( m_slsReferenceAngularFrequencies.size( 0 ) > 0 ) + { + fieldsToBeSync.addFields( FieldLocation::Node, { elasticfields::DivPsix::key(), elasticfields::DivPsiy::key(), elasticfields::DivPsiz::key() } ); + } + CommunicationTools & syncFields = CommunicationTools::getInstance(); syncFields.synchronizeFields( fieldsToBeSync, domain.getMeshBody( 0 ).getMeshLevel( m_discretizationName ), @@ -685,6 +769,17 @@ void ElasticWaveEquationSEM::prepareNextTimestep( MeshLevel & mesh ) stiffnessVectorx[a] = stiffnessVectory[a] = stiffnessVectorz[a] = 0.0; rhsx[a] = rhsy[a] = rhsz[a] = 0.0; } ); + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + arrayView1d< real32 > const stiffnessVectorAx = nodeManager.getField< elasticfields::StiffnessVectorAx >(); + arrayView1d< real32 > const stiffnessVectorAy = nodeManager.getField< elasticfields::StiffnessVectorAy >(); + arrayView1d< real32 > const stiffnessVectorAz = nodeManager.getField< elasticfields::StiffnessVectorAz >(); + forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + { + localIndex const a = solverTargetNodesSet[n]; + stiffnessVectorAx[a] = stiffnessVectorAy[a] = stiffnessVectorAz[a] = 0.0; + } ); + } } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp index e76302cf908..511c6b599ec 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp @@ -154,6 +154,13 @@ class ElasticWaveEquationSEM : public WaveSolverBase arrayView1d< string const > const & regionNames ); void prepareNextTimestep( MeshLevel & mesh ); + + /** + * @brief Computes the minimum attenuation quality factor over all the mesh. This is useful for computing anelasticity coefficients, which + * are usually global parameters + */ + real32 computeGlobalMinQFactor(); + protected: virtual void postProcessInput() override final; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp index b8e69242e9e..c17dc27a5ef 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp @@ -49,12 +49,13 @@ namespace elasticWaveEquationSEMKernels template< typename SUBREGION_TYPE, typename CONSTITUTIVE_TYPE, - typename FE_TYPE > -class ExplicitElasticSEM : public finiteElement::KernelBase< SUBREGION_TYPE, - CONSTITUTIVE_TYPE, - FE_TYPE, - 1, - 1 > + typename FE_TYPE, + typename SX = elasticfields::StiffnessVectorx, typename SY = elasticfields::StiffnessVectory, typename SZ = elasticfields::StiffnessVectorz > +class ExplicitElasticSEMBase : public finiteElement::KernelBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + 1, + 1 > { public: @@ -86,14 +87,14 @@ class ExplicitElasticSEM : public finiteElement::KernelBase< SUBREGION_TYPE, * @param targetRegionIndex Index of the region the subregion belongs to. * @param dt The time interval for the step. */ - ExplicitElasticSEM( NodeManager & nodeManager, - EdgeManager const & edgeManager, - FaceManager const & faceManager, - localIndex const targetRegionIndex, - SUBREGION_TYPE const & elementSubRegion, - FE_TYPE const & finiteElementSpace, - CONSTITUTIVE_TYPE & inputConstitutiveType, - real64 const dt ): + ExplicitElasticSEMBase( NodeManager & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + SUBREGION_TYPE const & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + real64 const dt ): Base( elementSubRegion, finiteElementSpace, inputConstitutiveType ), @@ -101,9 +102,9 @@ class ExplicitElasticSEM : public finiteElement::KernelBase< SUBREGION_TYPE, m_ux_n( nodeManager.getField< elasticfields::Displacementx_n >() ), m_uy_n( nodeManager.getField< elasticfields::Displacementy_n >() ), m_uz_n( nodeManager.getField< elasticfields::Displacementz_n >() ), - m_stiffnessVectorx( nodeManager.getField< elasticfields::StiffnessVectorx >() ), - m_stiffnessVectory( nodeManager.getField< elasticfields::StiffnessVectory >() ), - m_stiffnessVectorz( nodeManager.getField< elasticfields::StiffnessVectorz >() ), + m_stiffnessVectorx( nodeManager.getField< SX >() ), + m_stiffnessVectory( nodeManager.getField< SY >() ), + m_stiffnessVectorz( nodeManager.getField< SZ >() ), m_density( elementSubRegion.template getField< elasticfields::ElasticDensity >() ), m_velocityVp( elementSubRegion.template getField< elasticfields::ElasticVelocityVp >() ), m_velocityVs( elementSubRegion.template getField< elasticfields::ElasticVelocityVs >() ), @@ -115,12 +116,11 @@ class ExplicitElasticSEM : public finiteElement::KernelBase< SUBREGION_TYPE, } - //***************************************************************************** /** * @copydoc geos::finiteElement::KernelBase::StackVariables * - * ### ExplicitElasticSEM Description + * ### ExplicitElasticSEMBase Description * Adds a stack arrays for the nodal force, primary displacement variable, etc. */ struct StackVariables : Base::StackVariables @@ -187,7 +187,7 @@ class ExplicitElasticSEM : public finiteElement::KernelBase< SUBREGION_TYPE, /** * @copydoc geos::finiteElement::KernelBase::quadraturePointKernel * - * ### ExplicitElasticSEM Description + * ### ExplicitElasticSEMBase Description * Calculates stiffness vector * */ @@ -255,13 +255,95 @@ class ExplicitElasticSEM : public finiteElement::KernelBase< SUBREGION_TYPE, /// The time increment for this time integration step. real64 const m_dt; - }; -/// The factory used to construct a ExplicitAcousticWaveEquation kernel. +/// Specialization for standard iso elastic kernel +template< typename SUBREGION_TYPE, + typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +using ExplicitElasticSEM = ExplicitElasticSEMBase< SUBREGION_TYPE, CONSTITUTIVE_TYPE, FE_TYPE >; using ExplicitElasticSEMFactory = finiteElement::KernelFactory< ExplicitElasticSEM, real64 >; +/// Specialization for attenuation kernel +template< typename SUBREGION_TYPE, + typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +class ExplicitElasticAttenuativeSEM : public ExplicitElasticSEMBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + elasticfields::StiffnessVectorAx, + elasticfields::StiffnessVectorAy, + elasticfields::StiffnessVectorAz > +{ +public: + + /// Alias for the base class; + using Base = ExplicitElasticSEMBase< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE, + elasticfields::StiffnessVectorAx, + elasticfields::StiffnessVectorAy, + elasticfields::StiffnessVectorAz >; + +//***************************************************************************** + /** + * @brief Constructor + * @copydoc geos::finiteElement::KernelBase::KernelBase + * @param nodeManager Reference to the NodeManager object. + * @param edgeManager Reference to the EdgeManager object. + * @param faceManager Reference to the FaceManager object. + * @param targetRegionIndex Index of the region the subregion belongs to. + * @param dt The time interval for the step. + */ + ExplicitElasticAttenuativeSEM( NodeManager & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + SUBREGION_TYPE const & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + real64 const dt ): + Base( nodeManager, + edgeManager, + faceManager, + targetRegionIndex, + elementSubRegion, + finiteElementSpace, + inputConstitutiveType, + dt ), + m_qualityFactorP( elementSubRegion.template getField< elasticfields::ElasticQualityFactorP >() ), + m_qualityFactorS( elementSubRegion.template getField< elasticfields::ElasticQualityFactorS >() ) + {} + + /** + * @copydoc geos::finiteElement::KernelBase::setup + * + * Copies the primary variable, and position into the local stack array. + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const k, + typename Base::StackVariables & stack ) const + { + Base::setup( k, stack ); + real64 lambdap2mua= (stack.lambda + 2.0 * stack.mu ) / m_qualityFactorP[ k ]; + stack.mu = stack.mu / m_qualityFactorS[ k ]; + stack.lambda = (lambdap2mua - 2.0 * stack.mu ); + } + +protected: + + /// The array containing the P-wave attenuation quality factor + arrayView1d< real32 const > const m_qualityFactorP; + + /// The array containing the S-wave attenuation quality factor + arrayView1d< real32 const > const m_qualityFactorS; + +}; + +using ExplicitElasticAttenuativeSEMFactory = finiteElement::KernelFactory< ExplicitElasticAttenuativeSEM, + real64 >; } // namespace ElasticWaveEquationSEMKernels diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp index 8669c653534..a7ff2c600ac 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp @@ -104,6 +104,30 @@ DECLARE_FIELD( Displacementz_np1, WRITE_AND_READ, "z-component of displacement at time n+1." ); +DECLARE_FIELD( DivPsix, + "divpsix", + array2d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "x-component of memory variables for attenuation." ); + +DECLARE_FIELD( DivPsiy, + "divpsiy", + array2d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "y-component of memory variables for attenuation." ); + +DECLARE_FIELD( DivPsiz, + "divpsiz", + array2d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "z-component of memory variables for attenuation." ); + DECLARE_FIELD( Stresstensorxx, "stresstensorxx", array2d< real32 >, @@ -216,6 +240,30 @@ DECLARE_FIELD( StiffnessVectorz, WRITE_AND_READ, "z-component of stiffness vector." ); +DECLARE_FIELD( StiffnessVectorAx, + "stiffnessVectorAx", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "x-component of attenuation stiffness vector." ); + +DECLARE_FIELD( StiffnessVectorAy, + "stiffnessVectorAy", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "y-component of attenuation stiffness vector." ); + +DECLARE_FIELD( StiffnessVectorAz, + "stiffnessVectorAz", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "z-component of attenuation stiffness vector." ); + DECLARE_FIELD( DampingVectorx, "dampingVectorx", array1d< real32 >, @@ -264,6 +312,22 @@ DECLARE_FIELD( ElasticDensity, WRITE_AND_READ, "Medium density of the cell" ); +DECLARE_FIELD( ElasticQualityFactorP, + "elasticQualityFactorP", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Quality factor for P-wave attenuation in the cell" ); + +DECLARE_FIELD( ElasticQualityFactorS, + "elasticQualityFactorS", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Quality factor for S-wave attenuation in the cell" ); + DECLARE_FIELD( ElasticFreeSurfaceFaceIndicator, "elasticFreeSurfaceFaceIndicator", array1d< localIndex >, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp index b2df78e5c2d..619815ee653 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp @@ -95,6 +95,106 @@ struct ElasticTimeSchemeSEM }; + /** + * @brief Apply second order Leap-Frog time scheme for isotropic case without PML, but with attenuation + * @param[in] dt time-step + * @param[out] ux_np1 displacement in x-direction array at time n+1 (updated here) + * @param[in] ux_n displacement in x-direction array at time n + * @param[in] ux_nm1 displacement in x-direction array at time n-1 + * @param[out] uy_np1 displacement in y-direction array at time n+1 (updated here) + * @param[in] uy_n displacement in y-direction array at time n + * @param[in] uy_nm1 displacement in y-direction array at time n-1 + * @param[out] uz_np1 displacement in z-direction array at time n+1 (updated here) + * @param[in] uz_n displacement in z-direction array at time n + * @param[in] uz_nm1 displacement in z-direction array at time n-1 + * @param[in] divpsix divergence of the memory variables in the x direction + * @param[in] divpsiy divergence of the memory variables in the y direction + * @param[in] divpsiz divergence of the memory variables in the z direction + * @param[in] mass the mass matrix + * @param[in] dampingx the damping matrix for x-component + * @param[in] dampingy the damping matrix for y-component + * @param[in] dampingz the damping matrix for z-component + * @param[in] stiffnessVectorx array containing the product of the stiffness matrix R and the displacement in x-direction at time n + * @param[in] stiffnessVectory array containing the product of the stiffness matrix R and the displacement in y-direction at time n + * @param[in] stiffnessVectorz array containing the product of the stiffness matrix R and the displacement in z-direction at time n + * @param[in] stiffnessVectorAx array containing the product of the attenuation stiffness matrix R and the displacement in x-direction at + * time n + * @param[in] stiffnessVectorAy array containing the product of the attenuation stiffness matrix R and the displacement in y-direction at + * time n + * @param[in] stiffnessVectorAz array containing the product of the attenuation stiffness matrix R and the displacement in z-direction at + * time n + * @param[in] rhsx the right-hand-side for displacement in x-direction + * @param[in] rhsy the right-hand-side for displacement in y-direction + * @param[in] rhsz the right-hand-side for displacement in z-direction + * @param[in] solverTargetNodesSet the targetted nodeset (useful in particular when we do elasto-acoustic simulation ) + */ + static void AttenuationLeapFrog( real64 const dt, + arrayView1d< real32 > const ux_np1, + arrayView1d< real32 > const ux_n, + arrayView1d< real32 > const ux_nm1, + arrayView1d< real32 > const uy_np1, + arrayView1d< real32 > const uy_n, + arrayView1d< real32 > const uy_nm1, + arrayView1d< real32 > const uz_np1, + arrayView1d< real32 > const uz_n, + arrayView1d< real32 > const uz_nm1, + arrayView2d< real32 > const divpsix, + arrayView2d< real32 > const divpsiy, + arrayView2d< real32 > const divpsiz, + arrayView1d< real32 const > const mass, + arrayView1d< real32 const > const dampingx, + arrayView1d< real32 const > const dampingy, + arrayView1d< real32 const > const dampingz, + arrayView1d< real32 > const stiffnessVectorx, + arrayView1d< real32 > const stiffnessVectory, + arrayView1d< real32 > const stiffnessVectorz, + arrayView1d< real32 > const stiffnessVectorAx, + arrayView1d< real32 > const stiffnessVectorAy, + arrayView1d< real32 > const stiffnessVectorAz, + arrayView1d< real32 > const rhsx, + arrayView1d< real32 > const rhsy, + arrayView1d< real32 > const rhsz, + SortedArrayView< localIndex const > const solverTargetNodesSet, + arrayView1d< real32 > referenceFrequencies, + arrayView1d< real32 > anelasticityCoefficients ) + { + real64 const dt2 = pow( dt, 2 ); + integer nl = referenceFrequencies.size( 0 ); + forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + { + localIndex const a = solverTargetNodesSet[n]; + ux_np1[a] = ux_n[a]; + ux_np1[a] *= 2.0*mass[a]; + ux_np1[a] -= (mass[a]-0.5*dt*dampingx[a])*ux_nm1[a]; + ux_np1[a] += dt2*(rhsx[a]-stiffnessVectorx[a]); + uy_np1[a] = uy_n[a]; + uy_np1[a] *= 2.0*mass[a]; + uy_np1[a] -= (mass[a]-0.5*dt*dampingy[a])*uy_nm1[a]; + uy_np1[a] += dt2*(rhsy[a]-stiffnessVectory[a]); + uz_np1[a] = uz_n[a]; + uz_np1[a] *= 2.0*mass[a]; + uz_np1[a] -= (mass[a]-0.5*dt*dampingz[a])*uz_nm1[a]; + uz_np1[a] += dt2*(rhsz[a]-stiffnessVectorz[a]); + for( integer l = 0; l < nl; l++ ) + { + real32 gammal = ( 2.0 - referenceFrequencies[ l ] * dt )/( 2.0 + referenceFrequencies[ l ] * dt ); + real32 betal = anelasticityCoefficients[ l ] * referenceFrequencies[ l ] * 2.0 * dt /( 2.0 + referenceFrequencies[ l ] * dt ); + real32 gammalp = 0.5 + 0.5 * gammal; + real32 betalp = 0.5 * betal; + ux_np1[a] += dt2 * ( gammalp * divpsix( a, l ) + betalp * stiffnessVectorAx[ a ] ); + uy_np1[a] += dt2 * ( gammalp * divpsiy( a, l ) + betalp * stiffnessVectorAy[ a ] ); + uz_np1[a] += dt2 * ( gammalp * divpsiz( a, l ) + betalp * stiffnessVectorAz[ a ] ); + divpsix( a, l ) = gammal * divpsix( a, l ) + betal * stiffnessVectorAx[ a ]; + divpsiy( a, l ) = gammal * divpsiy( a, l ) + betal * stiffnessVectorAy[ a ]; + divpsiz( a, l ) = gammal * divpsiz( a, l ) + betal * stiffnessVectorAz[ a ]; + } + ux_np1[a] /= mass[a]+0.5*dt*dampingx[a]; + uy_np1[a] /= mass[a]+0.5*dt*dampingy[a]; + uz_np1[a] /= mass[a]+0.5*dt*dampingz[a]; + } ); + + }; + }; } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index 3eb561b2704..0716f971ad4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -131,7 +131,8 @@ WaveSolverBase::WaveSolverBase( const std::string & name, registerWrapper( viewKeyStruct::useDASString(), &m_useDAS ). setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( WaveSolverUtils::DASType::none ). - setDescription( "Flag to indicate if DAS data will be modeled, and which DAS type to use: 1 for strain integration, 2 for displacement difference" ); + setDescription( + "Flag to indicate if DAS data will be modeled, and which DAS type to use: \"none\" to deactivate DAS, \"strainIntegration\" for strain integration, \"dipole\" for displacement difference" ); registerWrapper( viewKeyStruct::linearDASSamplesString(), &m_linearDASSamples ). setInputFlag( InputFlags::OPTIONAL ). @@ -197,6 +198,26 @@ WaveSolverBase::WaveSolverBase( const std::string & name, setInputFlag( InputFlags::FALSE ). setSizedFromParent( 0 ). setDescription( "Element containing the receivers" ); + + registerWrapper( viewKeyStruct::slsReferenceAngularFrequenciesString(), &m_slsReferenceAngularFrequencies ). + setInputFlag( InputFlags::OPTIONAL ). + setSizedFromParent( 0 ). + setApplyDefaultValue( { } ). + setDescription( "Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity." + "The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided." ); + + registerWrapper( viewKeyStruct::slsAnelasticityCoefficientsString(), &m_slsAnelasticityCoefficients ). + setInputFlag( InputFlags::OPTIONAL ). + setSizedFromParent( 0 ). + setApplyDefaultValue( { } ). + setDescription( "Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity." + "The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided." ); + + registerWrapper( viewKeyStruct::attenuationTypeString(), &m_attenuationType ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( WaveSolverUtils::AttenuationType::none ). + setDescription( "Flag to indicate which attenuation model to use: \"none\" for no attenuation, \"sls\\" " for the standard-linear-solid (SLS) model (Fichtner, 2014)." ); + } WaveSolverBase::~WaveSolverBase() @@ -310,6 +331,22 @@ void WaveSolverBase::postProcessInput() } } + if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) + { + GEOS_THROW_IF( m_slsReferenceAngularFrequencies.size( 0 ) != m_slsAnelasticityCoefficients.size( 0 ), + "The number of attenuation anelasticity coefficients for the SLS model must be equal to the number of reference angular frequencies", + InputError ); + if( m_slsReferenceAngularFrequencies.size( 0 ) == 0 || m_slsAnelasticityCoefficients.size( 0 ) == 0 ) + { + m_slsReferenceAngularFrequencies.resize( 1 ); + m_slsReferenceAngularFrequencies[ 0 ] = 2.0 * M_PI * m_timeSourceFrequency; + m_slsAnelasticityCoefficients.resize( 1 ); + // set the coefficient to a negative value, so that it will be recomputed when the quality factor is available + m_slsAnelasticityCoefficients[ 0 ] = -1; + } + } + + GEOS_THROW_IF( m_sourceCoordinates.size( 0 ) > 0 && m_sourceCoordinates.size( 1 ) != 3, "Invalid number of physical coordinates for the sources", InputError ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp index 0271d0382d0..a8868b23992 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp @@ -121,6 +121,10 @@ class WaveSolverBase : public SolverBase static constexpr char const * receiverElemString() { return "receiverElem"; } static constexpr char const * receiverRegionString() { return "receiverRegion"; } static constexpr char const * freeSurfaceString() { return "FreeSurface"; } + + static constexpr char const * attenuationTypeString() { return "attenuationType"; } + static constexpr char const * slsReferenceAngularFrequenciesString() { return "slsReferenceAngularFrequencies"; } + static constexpr char const * slsAnelasticityCoefficientsString() { return "slsAnelasticityCoefficients"; } }; /** @@ -270,7 +274,7 @@ class WaveSolverBase : public SolverBase /// Amount of seismoTrace that will be recorded for each receiver localIndex m_nsamplesSeismoTrace; - /// Flag to indicate which DAS type will be modeled + /// Flag to indicate which DAS type will be modeled WaveSolverUtils::DASType m_useDAS; /// Number of points used for strain integration for dipole DAS @@ -288,6 +292,15 @@ class WaveSolverBase : public SolverBase /// Z component of the linear DAS direction vector array1d< real32 > m_linearDASVectorZ; + /// Flag to indicate which attenuation type will be modeled + WaveSolverUtils::AttenuationType m_attenuationType; + + /// Vector containing the reference frequencies for the standard-linear-solid (SLS) anelasticity model. + array1d< real32 > m_slsReferenceAngularFrequencies; + + /// Vector containing the anelasticity coefficients for the standard-linear-solid (SLS) anelasticity model. + array1d< real32 > m_slsAnelasticityCoefficients; + /// Indicate if we want to compute forward ou backward localIndex m_forward; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp index 7d32fc42581..8447e824b8e 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp @@ -41,6 +41,13 @@ struct WaveSolverUtils strainIntegration, ///< use strain integration for DAS }; + enum class AttenuationType : integer + { + none, ///< deactivate attenuation (default) + sls, ///< istandard-linear-solid description [Fichtner 2014] + }; + + GEOS_HOST_DEVICE static real32 evaluateRicker( real64 const time_n, real32 const f0, real32 const t0, localIndex const order ) { @@ -414,6 +421,10 @@ ENUM_STRINGS( WaveSolverUtils::DASType, "dipole", "strainIntegration" ); +ENUM_STRINGS( WaveSolverUtils::AttenuationType, + "none", + "sls" ); + } /* namespace geos */ #endif /* GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_WAVESOLVERUTILS_HPP_ */ diff --git a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt index aa42e977bfb..c2e2f79bdc1 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt @@ -5,6 +5,7 @@ set( gtest_geosx_tests testWavePropagationElasticFirstOrder.cpp testWavePropagationDAS.cpp testWavePropagationElasticVTI.cpp + testWavePropagationAttenuation.cpp testWavePropagationAcousticFirstOrder.cpp ) set( dependencyList ${parallelDeps} gtest ) diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp new file mode 100644 index 00000000000..009480c9a3a --- /dev/null +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp @@ -0,0 +1,240 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2020- GEOSX Contributors + * All right reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// using some utility classes from the following unit test +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" + +#include "common/DataTypes.hpp" +#include "mainInterface/initialization.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" +#include "mainInterface/GeosxState.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp" + +#include + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; + +// This unit test checks the interpolation done to extract seismic traces from a wavefield. +// It computes a seismogram at a receiver co-located with the source and compares it to the surrounding receivers. +char const * xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )xml"; + +class ElasticWaveEquationSEMTest : public ::testing::Test +{ +public: + + ElasticWaveEquationSEMTest(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + +protected: + + void SetUp() override + { + setupProblemFromXML( state.getProblemManager(), xmlInput ); + } + + static real64 constexpr time = 0.0; + static real64 constexpr dt = 1e-1; + static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); + + GeosxState state; + ElasticWaveEquationSEM * propagator; +}; + +real64 constexpr ElasticWaveEquationSEMTest::time; +real64 constexpr ElasticWaveEquationSEMTest::dt; +real64 constexpr ElasticWaveEquationSEMTest::eps; + +TEST_F( ElasticWaveEquationSEMTest, SeismoTrace ) +{ + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + propagator = &state.getProblemManager().getPhysicsSolverManager().getGroup< ElasticWaveEquationSEM >( "elasticSolver" ); + real64 time_n = time; + // run for 1s (10 steps) + for( int i=0; i<10; i++ ) + { + propagator->explicitStepForward( time_n, dt, i, domain, false ); + time_n += dt; + } + // cleanup (triggers calculation of the remaining seismograms data points) + propagator->cleanup( 1.0, 10, 0, 0, domain ); + + // retrieve seismo + arrayView2d< real32 > const dasReceivers = propagator->getReference< array2d< real32 > >( ElasticWaveEquationSEM::viewKeyStruct::dasSignalNp1AtReceiversString() ).toView(); + + // move it to CPU, if needed + dasReceivers.move( hostMemorySpace, false ); + + // check number of seismos and trace length + ASSERT_EQ( dasReceivers.size( 1 ), 10 ); + ASSERT_EQ( dasReceivers.size( 0 ), 11 ); + + // check das content. The signal values cannot be directly checked as the problem is too small. + // Since the basis is linear, check that the seismograms are nonzero (for t>0) and the seismogram at the center is equal + // to the average of the others. + for( int i = 0; i < 11; i++ ) + { + if( i > 0 ) + { + ASSERT_TRUE( std::abs( dasReceivers[i][8] ) > 0 ); + } + double avg = 0; + for( int r=0; r<8; r++ ) + { + avg += dasReceivers[i][r]; + } + avg /= 8.0; + ASSERT_TRUE( std::abs( dasReceivers[i][8] - avg ) < 0.00001 ); + } +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + return result; +} From 4de1337722b660f1be93e974294f81e970dfd2c5 Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:02:21 -0500 Subject: [PATCH 085/286] Break up multi fluid test (#3140) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../multifluid/CO2Brine/CO2BrineFluid.cpp | 2 + .../functions/EzrokhiBrineDensity.hpp | 42 +- .../fluid/multifluid/MultiFluidSelector.hpp | 4 + .../constitutiveTests/CMakeLists.txt | 6 +- .../constitutiveTests/MultiFluidTest.hpp | 529 ++++++++ .../constitutiveTestHelpers.hpp | 2 +- .../constitutiveTests/testMultiFluid.cpp | 1173 ----------------- .../testMultiFluidCO2Brine.cpp | 373 ++++++ ...FluidCompositionalMultiphasePVTPackage.cpp | 198 +++ .../testMultiFluidDeadOil.cpp | 275 ++++ .../testMultiFluidLiveOil.cpp | 168 +++ .../fluidFlowTests/testCompFlowUtils.hpp | 131 +- .../fluidFlowTests/testFlowUtils.hpp | 160 +++ .../fluidFlowTests/testSingleFlowUtils.hpp | 24 +- 16 files changed, 1746 insertions(+), 1347 deletions(-) create mode 100644 src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp delete mode 100644 src/coreComponents/unitTests/constitutiveTests/testMultiFluid.cpp create mode 100644 src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp create mode 100644 src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp create mode 100644 src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp create mode 100644 src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp create mode 100644 src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 2c2c0912265..0fef4368264 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3080-5511-8210a1a + baseline: integratedTests/baseline_integratedTests-pr3140-5514-fe26f80 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 8e8eed2bde5..eff45f70b87 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3140 (2024-06-11) +====================== +Fixed derivative in EzrokhiBrineDensity + PR #3080 (2024-06-07) ===================== Rebaseline after adding viscoelastic wave propagator. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index a61f15bbe52..907ca230af5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -194,11 +194,13 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::checkTablesParameters( real64 const template< typename PHASE1, typename PHASE2, typename FLASH > void CO2BrineFluid< PHASE1, PHASE2, FLASH >::initializePreSubGroups() { +#if defined(GEOS_DEVICE_COMPILE) GEOS_THROW_IF( this->getCatalogName() == CO2BrineEzrokhiThermalFluid::catalogName(), GEOS_FMT( "The `{}` model is disabled for now. Please use the other thermal CO2-brine model instead: `{}`", CO2BrineEzrokhiThermalFluid::catalogName(), CO2BrinePhillipsThermalFluid::catalogName() ), InputError ); +#endif } template< typename PHASE1, typename PHASE2, typename FLASH > diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp index 0f66d19ba4e..bffb350a4ac 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp @@ -171,6 +171,7 @@ void EzrokhiBrineDensityUpdate::compute( real64 const & pressure, arraySlice1d< real64, USD3 > const & dValue, bool useMass ) const { + constexpr integer numDof = 4; using Deriv = multifluid::DerivativeOffset; real64 waterSatDensity_dTemperature = 0.0; @@ -188,32 +189,39 @@ void EzrokhiBrineDensityUpdate::compute( real64 const & pressure, real64 const coefPhaseComposition = m_coef0 + temperature * ( m_coef1 + m_coef2 * temperature ); + real64 const mw_co2 = m_componentMolarWeight[m_CO2Index]; + real64 const mw_h2o = m_componentMolarWeight[m_waterIndex]; + // we have to convert molar component phase fraction (phaseComposition[m_CO2Index]) to mass fraction - real64 const waterMWInv = 1.0 / (phaseComposition[m_CO2Index] * m_componentMolarWeight[m_CO2Index] - + phaseComposition[m_waterIndex] * m_componentMolarWeight[m_waterIndex]); + real64 const waterMWInv = 1.0 / (phaseComposition[m_CO2Index] * mw_co2 + phaseComposition[m_waterIndex] * mw_h2o); + real64 dWaterMWInv[numDof]{}; + for( integer dof = 0; dof < numDof; ++dof ) + { + dWaterMWInv[dof] = -(dPhaseComposition[m_CO2Index][dof] * mw_co2 + dPhaseComposition[m_waterIndex][dof] * mw_h2o)*waterMWInv*waterMWInv; + } - real64 const massPhaseCompositionCO2 = phaseComposition[m_CO2Index] * m_componentMolarWeight[m_CO2Index] * waterMWInv; + real64 const massPhaseCompositionCO2 = phaseComposition[m_CO2Index] * mw_co2 * waterMWInv; real64 const exponent = coefPhaseComposition * massPhaseCompositionCO2; + real64 dExponent[numDof]{}; + for( integer dof = 0; dof < numDof; ++dof ) + { + dExponent[dof] = coefPhaseComposition * mw_co2 * + (dPhaseComposition[m_CO2Index][dof] * waterMWInv + phaseComposition[m_CO2Index] * dWaterMWInv[dof]); + } + dExponent[Deriv::dT] += ( m_coef1 + 2.0 * m_coef2 * temperature) * massPhaseCompositionCO2; - real64 const exponent_dPressure = coefPhaseComposition * dPhaseComposition[m_CO2Index][Deriv::dP]; - real64 const exponent_dTemperature = coefPhaseComposition * dPhaseComposition[m_CO2Index][Deriv::dT] + - ( m_coef1 + 2 * m_coef2 * temperature) * massPhaseCompositionCO2; - // compute only common part of derivatives w.r.t. CO2 and water phase compositions - // later to be multiplied by (phaseComposition[m_waterIndex]) and ( -phaseComposition[m_CO2Index] ) respectively - real64 const exponent_dPhaseComp = coefPhaseComposition * m_componentMolarWeight[m_CO2Index] * m_componentMolarWeight[m_waterIndex] * waterMWInv * waterMWInv; - real64 exponentPowered = pow( 10, exponent ); + real64 exponentPowered = pow( 10.0, exponent ); value = waterDensity * exponentPowered; - real64 const dValueCoef = LvArray::math::log( 10 ) * value; - dValue[Deriv::dP] = dValueCoef * exponent_dPressure + waterDensity_dPressure * exponentPowered; - dValue[Deriv::dT] = dValueCoef * exponent_dTemperature + waterDensity_dTemperature * exponentPowered; + real64 const dValueCoef = LvArray::math::log( 10.0 ) * value; + + dValue[Deriv::dP] = dValueCoef * dExponent[Deriv::dP] + waterDensity_dPressure * exponentPowered; + dValue[Deriv::dT] = dValueCoef * dExponent[Deriv::dT] + waterDensity_dTemperature * exponentPowered; - // here, we multiply common part of derivatives by specific coefficients - real64 const dValue_dPhaseComp = dValueCoef * exponent_dPhaseComp; - dValue[Deriv::dC+m_CO2Index] = dValue_dPhaseComp * phaseComposition[m_waterIndex] * dPhaseComposition[m_CO2Index][Deriv::dC+m_CO2Index]; - dValue[Deriv::dC+m_waterIndex] = dValue_dPhaseComp * ( -phaseComposition[m_CO2Index] ) * dPhaseComposition[m_waterIndex][Deriv::dC+m_waterIndex]; + dValue[Deriv::dC+m_CO2Index] = dValueCoef * dExponent[Deriv::dC+m_CO2Index]; + dValue[Deriv::dC+m_waterIndex] = dValueCoef * dExponent[Deriv::dC+m_waterIndex]; if( !useMass ) { diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index 83607986b96..79a1682cc1a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -47,6 +47,8 @@ void constitutiveUpdatePassThru( MultiFluidBase const & fluid, CO2BrinePhillipsFluid, CO2BrineEzrokhiFluid, CO2BrinePhillipsThermalFluid, +// Including these in a CUDA build will lead to compiler segfault. +// Need to split compilation units for all the options #if !defined(GEOS_DEVICE_COMPILE) CO2BrineEzrokhiThermalFluid, CompositionalTwoPhasePengRobinsonLBCViscosity, @@ -69,6 +71,8 @@ void constitutiveUpdatePassThru( MultiFluidBase & fluid, CO2BrinePhillipsFluid, CO2BrineEzrokhiFluid, CO2BrinePhillipsThermalFluid, +// Including these in a CUDA build will lead to compiler segfault. +// Need to split compilation units for all the options" #if !defined(GEOS_DEVICE_COMPILE) CO2BrineEzrokhiThermalFluid, CompositionalTwoPhasePengRobinsonLBCViscosity, diff --git a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt index 5f03cf2eaaa..44890ac660a 100644 --- a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt @@ -4,6 +4,9 @@ set( gtest_geosx_tests testCO2BrinePVTModels.cpp testCO2SpycherPruessModels.cpp testDamage.cpp + testMultiFluidCO2Brine.cpp + testMultiFluidDeadOil.cpp + testMultiFluidLiveOil.cpp testRelPerm.cpp testRelPermHysteresis.cpp ) @@ -39,8 +42,7 @@ endif() if( ENABLE_PVTPackage ) list( APPEND gtest_geosx_tests - testMultiFluid.cpp ) - + testMultiFluidCompositionalMultiphasePVTPackage.cpp ) list( APPEND dependencyList PVTPackage ) endif() diff --git a/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp new file mode 100644 index 00000000000..b6f8d7dde47 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp @@ -0,0 +1,529 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file MultiFluidTest.hpp + */ + +#ifndef GEOS_UNITTESTS_CONSTITUTIVETESTS_MULTIFLUIDTEST_HPP_ +#define GEOS_UNITTESTS_CONSTITUTIVETESTS_MULTIFLUIDTEST_HPP_ + +#include "constitutiveTestHelpers.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" +#include "constitutive/fluid/multifluid/MultiFluidSelector.hpp" + +using namespace geos::dataRepository; +using namespace geos::constitutive; +using namespace geos::constitutive::multifluid; + +namespace geos +{ +namespace testing +{ + +template< typename FLUID_TYPE > +struct UsePVTPackage +{ + static constexpr bool value = false; +}; + +template< integer N > +using Feed = std::array< real64, N >; + +template< integer N, typename ARRAY1, typename ARRAY2 > +void copy( ARRAY1 const & inputArray, ARRAY2 & outputArray ) +{ + for( integer i = 0; i < N; ++i ) + { + outputArray[i] = inputArray[i]; + } +} + +template< integer N, typename T > +void fill( array1d< T > & outputArray, std::array< T const, N > const inputArray ) +{ + for( integer i = 0; i < N; ++i ) + { + outputArray.emplace_back( inputArray[i] ); + } +} + +template< integer N, integer U, typename T > +void fill( arraySlice1d< T, U > const & outputArray, std::array< T const, N > const inputArray ) +{ + for( integer i = 0; i < N; ++i ) + { + outputArray[i] = inputArray[i]; + } +} + +template< integer NUM_PHASE, integer NUM_COMP > +struct MultiFluidTestData +{ + MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + Feed< NUM_COMP > && composition_ ); + + MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + arraySlice1d< real64 const > const & composition_ ); + + MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + Feed< NUM_COMP > && composition_, + real64 const totalDensity_, + Feed< NUM_PHASE > && phaseFraction_, + Feed< NUM_PHASE > && phaseDensity_, + Feed< NUM_PHASE > && phaseMassDensity_, + Feed< NUM_PHASE > && phaseViscosity_, + Feed< NUM_PHASE > && phaseEnthalpy_, + Feed< NUM_PHASE > && phaseInternalEnergy_ ); + + real64 const pressure{0.0}; + real64 const temperature{0.0}; + Feed< NUM_COMP > composition{}; + real64 const totalDensity{0.0}; + Feed< NUM_PHASE > phaseFraction{}; + Feed< NUM_PHASE > phaseDensity{}; + Feed< NUM_PHASE > phaseMassDensity{}; + Feed< NUM_PHASE > phaseViscosity{}; + Feed< NUM_PHASE > phaseEnthalpy{}; + Feed< NUM_PHASE > phaseInternalEnergy{}; +}; + +template< typename FLUID_TYPE, integer NUM_PHASE, integer NUM_COMP > +class MultiFluidTest : public ConstitutiveTestBase< MultiFluidBase > +{ +public: + static constexpr integer numPhase = NUM_PHASE; + static constexpr integer numComp = NUM_COMP; + using TestData = MultiFluidTestData< numPhase, numComp >; + +public: + MultiFluidTest() = default; + ~MultiFluidTest() override = default; + + MultiFluidBase & getFluid() const { return *m_model; } + + Group & getParent() { return m_parent; } + + void testValuesAgainstPreviousImplementation( typename FLUID_TYPE::KernelWrapper const & wrapper, + MultiFluidTestData< NUM_PHASE, NUM_COMP > const & testData, + real64 const relTol ) const; + + void testNumericalDerivatives( MultiFluidBase & fluid, + Group * parent, + MultiFluidTestData< NUM_PHASE, NUM_COMP > const & testData, + real64 const perturbParameter, + real64 const relTol, + real64 const absTol = std::numeric_limits< real64 >::max() ); + + +protected: + virtual void resetFluid( MultiFluidBase & fluid ) const + { + GEOS_UNUSED_VAR( fluid ); + } + + static void writeTableToFile( string const & fileName, char const * content ) + { + std::ofstream os( fileName ); + ASSERT_TRUE( os.is_open() ); + os << content; + os.close(); + } + + static void removeFile( string const & fileName ) + { + int const ret = std::remove( fileName.c_str() ); + ASSERT_TRUE( ret == 0 ); + } +}; + +template< typename FLUID_TYPE, integer NUM_PHASE, integer NUM_COMP > +void MultiFluidTest< FLUID_TYPE, NUM_PHASE, NUM_COMP >:: +testNumericalDerivatives( MultiFluidBase & fluid, + Group * parent, + MultiFluidTestData< NUM_PHASE, NUM_COMP > const & testData, + real64 const perturbParameter, + real64 const relTol, + real64 const absTol ) +{ + using Deriv = multifluid::DerivativeOffset; + + integer const NC = fluid.numFluidComponents(); + integer const NP = fluid.numFluidPhases(); + integer const NDOF = NC+2; + + bool const isThermal = fluid.isThermal(); + + // Copy input values into an array with expected layout + array2d< real64, compflow::LAYOUT_COMP > compositionValues( 1, NC ); + for( integer i = 0; i < NC; ++i ) + { + compositionValues[0][i] = testData.composition[i]; + } + arraySlice1d< real64 const, compflow::USD_COMP - 1 > const composition = compositionValues[0]; + + auto const & components = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + auto const & phases = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); + + // create a clone of the fluid to run updates on + string const fluidCopyName = fluid.getName() + "Copy"; + std::unique_ptr< ConstitutiveBase > fluidCopyPtr = fluid.deliverClone( fluidCopyName, parent ); + MultiFluidBase & fluidCopy = dynamicCast< MultiFluidBase & >( *fluidCopyPtr ); + + fluid.allocateConstitutiveData( fluid.getParent(), 1 ); + fluidCopy.allocateConstitutiveData( fluid.getParent(), 1 ); + + // extract data views from both fluids + #define GET_FLUID_DATA( FLUID, TRAIT ) \ + FLUID.getReference< TRAIT::type >( TRAIT::key() )[0][0] + + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseFrac { + GET_FLUID_DATA( fluid, fields::multifluid::phaseFraction ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseFraction ) + }; + + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseDens { + GET_FLUID_DATA( fluid, fields::multifluid::phaseDensity ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseDensity ) + }; + + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseVisc { + GET_FLUID_DATA( fluid, fields::multifluid::phaseViscosity ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseViscosity ) + }; + + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseEnthalpy { + GET_FLUID_DATA( fluid, fields::multifluid::phaseEnthalpy ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseEnthalpy ) + }; + + MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseInternalEnergy { + GET_FLUID_DATA( fluid, fields::multifluid::phaseInternalEnergy ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseInternalEnergy ) + }; + + MultiFluidVarSlice< real64, 2, USD_PHASE_COMP - 2, USD_PHASE_COMP_DC - 2 > phaseCompFrac { + GET_FLUID_DATA( fluid, fields::multifluid::phaseCompFraction ), + GET_FLUID_DATA( fluid, fields::multifluid::dPhaseCompFraction ) + }; + + MultiFluidVarSlice< real64, 0, USD_FLUID - 2, USD_FLUID_DC - 2 > totalDens { + GET_FLUID_DATA( fluid, fields::multifluid::totalDensity ), + GET_FLUID_DATA( fluid, fields::multifluid::dTotalDensity ) + }; + + auto const & phaseFracCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseFraction ); + auto const & phaseDensCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseDensity ); + auto const & phaseViscCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseViscosity ); + auto const & phaseEnthCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseEnthalpy ); + auto const & phaseEnergyCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseInternalEnergy ); + auto const & phaseCompFracCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseCompFraction ); + auto const & totalDensCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::totalDensity ); + +#undef GET_FLUID_DATA + + // Enthalpy and internal energy values can be quite large and prone to round-off errors when + // performing finite difference derivatives. We will therefore scale the values using this + // reference enthalpy value to bring them to a more manageable scale. + real64 constexpr referenceEnthalpy = 5.0584e5; + auto const scaleEnthalpy = []( auto & arraySlice ) + { + LvArray::forValuesInSlice( arraySlice, []( real64 & value ){ value /= referenceEnthalpy; } ); + }; + + real64 const pressure = testData.pressure; + real64 const temperature = testData.temperature; + + // set the original fluid state to current + constitutive::constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) + { + typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); + fluidWrapper.update( 0, 0, pressure, temperature, composition ); + } ); + + if( isThermal ) + { + scaleEnthalpy( phaseEnthalpy.value ); + scaleEnthalpy( phaseEnthalpy.derivs ); + scaleEnthalpy( phaseInternalEnergy.value ); + scaleEnthalpy( phaseInternalEnergy.derivs ); + } + + // now perturb variables and update the copied fluid's state + constitutive::constitutiveUpdatePassThru( fluidCopy, [&] ( auto & castedFluid ) + { + typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); + + // to be able to use the checkDerivative utility function, we have to invert the layout + auto dPhaseFrac = invertLayout( phaseFrac.derivs.toSliceConst(), NP, NDOF ); + auto dPhaseDens = invertLayout( phaseDens.derivs.toSliceConst(), NP, NDOF ); + auto dPhaseVisc = invertLayout( phaseVisc.derivs.toSliceConst(), NP, NDOF ); + auto dPhaseEnth = invertLayout( phaseEnthalpy.derivs.toSliceConst(), NP, NDOF ); + auto dPhaseEnergy = invertLayout( phaseInternalEnergy.derivs.toSliceConst(), NP, NDOF ); + auto dTotalDens = invertLayout( totalDens.derivs.toSliceConst(), NDOF ); + auto dPhaseCompFrac = invertLayout( phaseCompFrac.derivs.toSliceConst(), NP, NC, NDOF ); + + // update pressure and check derivatives + { + real64 const dP = perturbParameter * (pressure + perturbParameter); + resetFluid( fluidCopy ); + fluidWrapper.update( 0, 0, pressure + dP, temperature, composition ); + + checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseFrac", "Pres", phases ); + checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseDens", "Pres", phases ); + checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseVisc", "Pres", phases ); + checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dP], + dP, relTol, absTol, "totalDens", "Pres" ); + checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseCompFrac", "Pres", phases, components ); + if( isThermal ) + { + scaleEnthalpy( phaseEnthCopy ); + scaleEnthalpy( phaseEnergyCopy ); + checkDerivative( phaseEnthCopy.toSliceConst(), phaseEnthalpy.value.toSliceConst(), dPhaseEnth[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseEnth", "Pres", phases ); + checkDerivative( phaseEnergyCopy.toSliceConst(), phaseInternalEnergy.value.toSliceConst(), dPhaseEnergy[Deriv::dP].toSliceConst(), + dP, relTol, absTol, "phaseEnergy", "Pres", phases ); + } + } + + // update temperature and check derivatives + { + real64 const dT = perturbParameter * (temperature + perturbParameter); + resetFluid( fluidCopy ); + fluidWrapper.update( 0, 0, pressure, temperature + dT, composition ); + + checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseFrac", "Temp", phases ); + checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseDens", "Temp", phases ); + checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseVisc", "Temp", phases ); + checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dT], + dT, relTol, absTol, "totalDens", "Temp" ); + checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseCompFrac", "Temp", phases, components ); + if( isThermal ) + { + scaleEnthalpy( phaseEnthCopy ); + scaleEnthalpy( phaseEnergyCopy ); + checkDerivative( phaseEnthCopy.toSliceConst(), phaseEnthalpy.value.toSliceConst(), dPhaseEnth[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseEnth", "Temp", phases ); + checkDerivative( phaseEnergyCopy.toSliceConst(), phaseInternalEnergy.value.toSliceConst(), dPhaseEnergy[Deriv::dT].toSliceConst(), + dT, relTol, absTol, "phaseEnergy", "Temp", phases ); + } + } + + array2d< real64, compflow::LAYOUT_COMP > compNew( 1, NC ); + for( integer jc = 0; jc < NC; ++jc ) + { + real64 const dC = LvArray::math::max( 1.0e-7, perturbParameter * ( composition[jc] + perturbParameter ) ); + for( integer ic = 0; ic < NC; ++ic ) + { + compNew[0][ic] = composition[ic]; + } + compNew[0][jc] += dC; + + // Note: in PVTPackage, derivatives are obtained with finite-difference approx **with normalization of the comp fraction** + // The component fraction is perturbed (just as above), and then all the component fractions are normalized (as below) + // But, in the native DO model and in CO2BrinePhillips, derivatives are computed analytically, which results in different + // derivatives wrt component fractions--although the derivatives wrt component densities obtained with the chain rule + // in the solver will be very similar (see discussion on PR #1325 on GitHub). + // + // Since both approaches--FD approximation of derivatives with normalization, and analytical derivatives--are correct, + // we have to support both when we check the intermediate derivatives wrt component fractions below. Therefore, if the + // PVTPackage is used, then we normalize the perturbed component fractions before taking the FD approx. If the native + // DO or CO2-brine models are used, we skip the normalization below. + if constexpr ( UsePVTPackage< FLUID_TYPE >::value ) + { + // renormalize + real64 sum = 0.0; + for( integer ic = 0; ic < NC; ++ic ) + { + sum += compNew[0][ic]; + } + for( integer ic = 0; ic < NC; ++ic ) + { + compNew[0][ic] /= sum; + } + } + + resetFluid( fluidCopy ); + fluidWrapper.update( 0, 0, pressure, temperature, compNew[0] ); + + string const var = "compFrac[" + components[jc] + "]"; + checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseFrac", var, phases ); + checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseDens", var, phases ); + checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseVisc", var, phases ); + checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dC+jc], + dC, relTol, absTol, "totalDens", var ); + checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseCompFrac", var, phases, components ); + if( isThermal ) + { + scaleEnthalpy( phaseEnthCopy ); + scaleEnthalpy( phaseEnergyCopy ); + checkDerivative( phaseEnthCopy.toSliceConst(), phaseEnthalpy.value.toSliceConst(), dPhaseEnth[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseEnth", var, phases ); + checkDerivative( phaseEnergyCopy.toSliceConst(), phaseInternalEnergy.value.toSliceConst(), dPhaseEnergy[Deriv::dC+jc].toSliceConst(), + dC, relTol, absTol, "phaseEnergy", var, phases ); + } + } + } ); +} + +template< typename FLUID_TYPE, integer NUM_PHASE, integer NUM_COMP > +void MultiFluidTest< FLUID_TYPE, NUM_PHASE, NUM_COMP >::testValuesAgainstPreviousImplementation( typename FLUID_TYPE::KernelWrapper const & wrapper, + MultiFluidTestData< NUM_PHASE, NUM_COMP > const & testData, + real64 const relTol ) const +{ + integer constexpr numDof = numComp + 2; + + // Copy input values into an array with expected layout + array2d< real64, compflow::LAYOUT_COMP > compositionValues( 1, numComp ); + for( integer i = 0; i < numComp; ++i ) + { + compositionValues[0][i] = testData.composition[i]; + } + arraySlice1d< real64 const, compflow::USD_COMP - 1 > const composition = compositionValues[0]; + + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseFraction( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseFraction( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseDensity( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseDensity( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseMassDensity( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseMassDensity( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseViscosity( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseViscosity( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseEnthalpy( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseEnthalpy( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseInternalEnergy( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseInternalEnergy( 1, 1, numPhase, numDof ); + StackArray< real64, 4, numComp *numPhase, LAYOUT_PHASE_COMP > phaseCompFraction( 1, 1, numPhase, numComp ); + StackArray< real64, 5, numDof *numComp *numPhase, LAYOUT_PHASE_COMP_DC > dPhaseCompFraction( 1, 1, numPhase, numComp, numDof ); + StackArray< real64, 2, 1, LAYOUT_FLUID > totalDensity( 1, 1 ); + StackArray< real64, 3, numDof, LAYOUT_FLUID_DC > dTotalDensity( 1, 1, numDof ); + + wrapper.compute( testData.pressure, + testData.temperature, + composition, + { phaseFraction[0][0], dPhaseFraction[0][0] }, + { phaseDensity[0][0], dPhaseDensity[0][0] }, + { phaseMassDensity[0][0], dPhaseMassDensity[0][0] }, + { phaseViscosity[0][0], dPhaseViscosity[0][0] }, + { phaseEnthalpy[0][0], dPhaseEnthalpy[0][0] }, + { phaseInternalEnergy[0][0], dPhaseInternalEnergy[0][0] }, + { phaseCompFraction[0][0], dPhaseCompFraction[0][0] }, + { totalDensity[0][0], dTotalDensity[0][0] } ); + + checkRelativeError( totalDensity[0][0], testData.totalDensity, relTol ); + for( integer ip = 0; ip < numPhase; ++ip ) + { + checkRelativeError( phaseFraction[0][0][ip], testData.phaseFraction[ip], relTol ); + checkRelativeError( phaseDensity[0][0][ip], testData.phaseDensity[ip], relTol ); + checkRelativeError( phaseMassDensity[0][0][ip], testData.phaseMassDensity[ip], relTol ); + checkRelativeError( phaseViscosity[0][0][ip], testData.phaseViscosity[ip], relTol ); + checkRelativeError( phaseEnthalpy[0][0][ip], testData.phaseEnthalpy[ip], relTol ); + checkRelativeError( phaseInternalEnergy[0][0][ip], testData.phaseInternalEnergy[ip], relTol ); + } +} + +template< integer NUM_PHASE, integer NUM_COMP > +MultiFluidTestData< NUM_PHASE, NUM_COMP >::MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + Feed< NUM_COMP > && composition_ ): + pressure( pressure_ ), + temperature( temperature_ ), + composition( composition_ ) +{} + +template< integer NUM_PHASE, integer NUM_COMP > +MultiFluidTestData< NUM_PHASE, NUM_COMP >::MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + arraySlice1d< real64 const > const & composition_ ): + pressure( pressure_ ), + temperature( temperature_ ) +{ + copy< NUM_COMP >( composition_, composition ); +} + +template< integer NUM_PHASE, integer NUM_COMP > +MultiFluidTestData< NUM_PHASE, NUM_COMP >::MultiFluidTestData( real64 const pressure_, + real64 const temperature_, + Feed< NUM_COMP > && composition_, + real64 const totalDensity_, + Feed< NUM_PHASE > && phaseFraction_, + Feed< NUM_PHASE > && phaseDensity_, + Feed< NUM_PHASE > && phaseMassDensity_, + Feed< NUM_PHASE > && phaseViscosity_, + Feed< NUM_PHASE > && phaseEnthalpy_, + Feed< NUM_PHASE > && phaseInternalEnergy_ ): + pressure( pressure_ ), + temperature( temperature_ ), + composition( composition_ ), + totalDensity( totalDensity_ ), + phaseFraction( phaseFraction_ ), + phaseDensity( phaseDensity_ ), + phaseMassDensity( phaseMassDensity_ ), + phaseViscosity( phaseViscosity_ ), + phaseEnthalpy( phaseEnthalpy_ ), + phaseInternalEnergy( phaseInternalEnergy_ ) +{} + +template< integer N > +inline ::std::ostream & PrintTo( string const & name, Feed< N > const & data, ::std::ostream & os ) +{ + os << " \"" << name << "\": [ " << data[0]; + for( integer i = 1; i < N; i++ ) + { + os << ", " << data[i]; + } + os << " ]"; + return os; +} + +template< integer NUM_PHASE, integer NUM_COMP > +inline void PrintTo( MultiFluidTestData< NUM_PHASE, NUM_COMP > const & data, ::std::ostream *s ) +{ + std::ostream & os = *s; + + os << "{\n"; + os << " \"pressure\": " << data.pressure << ",\n"; + os << " \"temperature\": " << data.temperature << ",\n"; + PrintTo< NUM_COMP >( "composition", data.composition, os ) << ",\n"; + os << " \"totalDensity\": " << data.totalDensity << ",\n"; + PrintTo< NUM_PHASE >( "phaseFraction", data.phaseFraction, os ) << ",\n"; + PrintTo< NUM_PHASE >( "phaseDensity", data.phaseDensity, os ) << ",\n"; + PrintTo< NUM_PHASE >( "phaseMassDensity", data.phaseMassDensity, os ) << ",\n"; + PrintTo< NUM_PHASE >( "phaseViscosity", data.phaseViscosity, os ) << ",\n"; + PrintTo< NUM_PHASE >( "phaseEnthalpy", data.phaseEnthalpy, os ) << ",\n"; + PrintTo< NUM_PHASE >( "phaseInternalEnergy", data.phaseInternalEnergy, os ) << "\n"; + os << "}"; +} + +} // namespace testing + +} // namespace geos + +#endif //GEOS_UNITTESTS_CONSTITUTIVETESTS_MULTIFLUIDTEST_HPP_ diff --git a/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp b/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp index 2874dda757f..4b90ca2840a 100644 --- a/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp +++ b/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp @@ -21,7 +21,7 @@ #include "constitutive/capillaryPressure/capillaryPressureSelector.hpp" #include "functions/FunctionManager.hpp" #include "functions/TableFunction.hpp" -#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" +#include "unitTests/fluidFlowTests/testFlowUtils.hpp" // TPL includes #include diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluid.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluid.cpp deleted file mode 100644 index 2297aaba3f3..00000000000 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluid.cpp +++ /dev/null @@ -1,1173 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -// Source includes -#include "common/DataTypes.hpp" -#include "common/TimingMacros.hpp" -#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" -#include "constitutive/fluid/multifluid/MultiFluidSelector.hpp" -#include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" -#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" -#include "mainInterface/initialization.hpp" -#include "functions/FunctionManager.hpp" -#include "mainInterface/GeosxState.hpp" - -// TPL includes -#include -#include - -using namespace geos; -using namespace geos::testing; -using namespace geos::constitutive; -using namespace geos::constitutive::multifluid; -using namespace geos::dataRepository; -using namespace geos::constitutive::PVTProps; - -/// Black-oil tables written into temporary files during testing - -static const char * pvtoTableContent = "# Rs[sm3/sm3]\tPbub[Pa]\tBo[m3/sm3]\tVisc(Pa.s)\n" - "\n" - " 2\t 2000000\t 1.02\t 0.000975\n" - " 5\t 5000000\t 1.03\t 0.00091\n" - " 10\t 10000000\t1.04\t 0.00083\n" - " 15\t 20000000\t1.05\t 0.000695\n" - " 90000000\t1.03\t 0.000985 -- some line comment\n" - " 30\t 30000000\t1.07\t 0.000594\n" - " 40\t 40000000\t1.08\t 0.00051\n" - " 50000000\t1.07\t 0.000549 -- another one\n" - " 90000000\t1.06\t 0.00074\n" - " 50\t 50000000.7\t1.09\t 0.000449\n" - " 90000000.7\t1.08\t 0.000605"; - -static const char * pvtwTableContent = "#\tPref[Pa]\tBw[m3/sm3]\tCp[1/Pa]\t Visc[Pa.s]\n" - "\t30600000.1\t1.03\t\t0.00000000041\t0.0003"; - -/// Dead-oil tables written into temporary files during testing - -static const char * pvdgTableContent = "# Pg(Pa) Bg(m3/sm3) Visc(Pa.s)\n" - "3000000 0.04234 0.00001344\n" - "6000000 0.02046 0.0000142\n" - "9000000 0.01328 0.00001526\n" - "12000000 0.00977 0.0000166\n" - "15000000 0.00773 0.00001818\n" - "18000000 0.006426 0.00001994\n" - "21000000 0.005541 0.00002181\n" - "24000000 0.004919 0.0000237\n" - "27000000 0.004471 0.00002559\n" - "29500000 0.004194 0.00002714\n" - "31000000 0.004031 0.00002806\n" - "33000000 0.00391 0.00002832\n" - "53000000 0.003868 0.00002935"; - -static const char * pvdoTableContent = "#P[Pa] Bo[m3/sm3] Visc(Pa.s)\n" - "10000000.0 1.23331 0.00015674\n" - "12500000.0 1.21987 0.00016570\n" - "15000000.0 1.20802 0.00017445\n" - "20000000.0 1.18791 0.00019143\n" - "25000000.0 1.17137 0.00020779\n" - "30000000.0 1.15742 0.00022361\n" - "33200000.3 1.14946 0.00023359\n" - "35000000.0 1.14543 0.00023894\n" - "40000000.0 1.13498 0.00025383\n" - "50000000.0 1.11753 0.00028237\n" - "60000000.0 1.10346 0.00030941\n" - "70000000.0 1.09180 0.00033506\n" - "80000000.0 1.08194 0.00035945\n" - "90000000.0 1.07347 0.00038266\n" - "95000000.0 1.06966 0.00039384\n" - "100000000.0 1.06610 0.00040476\n" - "110000000.0 1.05961 0.00042584\n" - "112500000.0 1.05811 0.00043096\n" - "115000000.0 1.05665 0.00043602\n" - "117500000.0 1.05523 0.00044102\n" - "120000000.0 1.05385 0.00044596\n"; - -static const char * pvdwTableContent = "# Pref[Pa] Bw[m3/sm3] Cp[1/Pa] Visc[Pa.s]\n" - " 30600000.1 1.03 0.00000000041 0.0003"; - -// CO2-brine model - -static const char * pvtLiquidPhillipsTableContent = "DensityFun PhillipsBrineDensity 1e6 1.5e7 5e4 367.15 369.15 1 0.2\n" - "ViscosityFun PhillipsBrineViscosity 0.1"; - -// the last are set relatively high (1e-4) to increase derivative value and check it properly -static const char * pvtLiquidEzrokhiTableContent = "DensityFun EzrokhiBrineDensity 2.01e-6 -6.34e-7 1e-4\n" - "ViscosityFun EzrokhiBrineViscosity 2.42e-7 0 1e-4"; - -static const char * pvtGasTableContent = "DensityFun SpanWagnerCO2Density 1e6 1.5e7 5e4 367.15 369.15 1\n" - "ViscosityFun FenghourCO2Viscosity 1e6 1.5e7 5e4 367.15 369.15 1"; - -static const char * co2FlashTableContent = "FlashModel CO2Solubility 1e6 1.5e7 5e4 367.15 369.15 1 0.15"; - -void testNumericalDerivatives( MultiFluidBase & fluid, - Group & parent, - real64 const P, - real64 const T, - arraySlice1d< real64 > const & compositionInput, - real64 const perturbParameter, - bool usePVTPackage, - real64 const relTol, - real64 const absTol = std::numeric_limits< real64 >::max() ) -{ - using Deriv = multifluid::DerivativeOffset; - - integer const NC = fluid.numFluidComponents(); - integer const NP = fluid.numFluidPhases(); - integer const NDOF = NC+2; - - // Copy input values into an array with expected layout - array2d< real64, compflow::LAYOUT_COMP > compositionValues( 1, NC ); - for( integer i = 0; i < NC; ++i ) - { - compositionValues[0][i] = compositionInput[i]; - } - arraySlice1d< real64 const, compflow::USD_COMP - 1 > const composition = compositionValues[0]; - - auto const & components = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - auto const & phases = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - - // create a clone of the fluid to run updates on - std::unique_ptr< ConstitutiveBase > fluidCopyPtr = fluid.deliverClone( "fluidCopy", &parent ); - MultiFluidBase & fluidCopy = dynamicCast< MultiFluidBase & >( *fluidCopyPtr ); - - fluid.allocateConstitutiveData( fluid.getParent(), 1 ); - fluidCopy.allocateConstitutiveData( fluid.getParent(), 1 ); - - // extract data views from both fluids - #define GET_FLUID_DATA( FLUID, TRAIT ) \ - FLUID.getReference< TRAIT::type >( TRAIT::key() )[0][0] - - MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseFrac { - GET_FLUID_DATA( fluid, fields::multifluid::phaseFraction ), - GET_FLUID_DATA( fluid, fields::multifluid::dPhaseFraction ) - }; - - MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseDens { - GET_FLUID_DATA( fluid, fields::multifluid::phaseDensity ), - GET_FLUID_DATA( fluid, fields::multifluid::dPhaseDensity ) - }; - - MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseVisc { - GET_FLUID_DATA( fluid, fields::multifluid::phaseViscosity ), - GET_FLUID_DATA( fluid, fields::multifluid::dPhaseViscosity ) - }; - - MultiFluidVarSlice< real64, 2, USD_PHASE_COMP - 2, USD_PHASE_COMP_DC - 2 > phaseCompFrac { - GET_FLUID_DATA( fluid, fields::multifluid::phaseCompFraction ), - GET_FLUID_DATA( fluid, fields::multifluid::dPhaseCompFraction ) - }; - - MultiFluidVarSlice< real64, 0, USD_FLUID - 2, USD_FLUID_DC - 2 > totalDens { - GET_FLUID_DATA( fluid, fields::multifluid::totalDensity ), - GET_FLUID_DATA( fluid, fields::multifluid::dTotalDensity ) - }; - - auto const & phaseFracCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseFraction ); - auto const & phaseDensCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseDensity ); - auto const & phaseViscCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseViscosity ); - auto const & phaseCompFracCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::phaseCompFraction ); - auto const & totalDensCopy = GET_FLUID_DATA( fluidCopy, fields::multifluid::totalDensity ); - -#undef GET_FLUID_DATA - - // set the original fluid state to current - constitutive::constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) - { - typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); - fluidWrapper.update( 0, 0, P, T, composition ); - } ); - - // now perturb variables and update the copied fluid's state - constitutive::constitutiveUpdatePassThru( fluidCopy, [&] ( auto & castedFluid ) - { - typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); - - // to be able to use the checkDerivative utility function, we have to invert the layout - auto dPhaseFrac = invertLayout( phaseFrac.derivs.toSliceConst(), NP, NDOF ); - auto dPhaseDens = invertLayout( phaseDens.derivs.toSliceConst(), NP, NDOF ); - auto dPhaseVisc = invertLayout( phaseVisc.derivs.toSliceConst(), NP, NDOF ); - auto dTotalDens = invertLayout( totalDens.derivs.toSliceConst(), NDOF ); - auto dPhaseCompFrac = invertLayout( phaseCompFrac.derivs.toSliceConst(), NP, NC, NDOF ); - - // update pressure and check derivatives - { - real64 const dP = perturbParameter * (P + perturbParameter); - fluidWrapper.update( 0, 0, P + dP, T, composition ); - - checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dP].toSliceConst(), - dP, relTol, absTol, "phaseFrac", "Pres", phases ); - checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dP].toSliceConst(), - dP, relTol, absTol, "phaseDens", "Pres", phases ); - checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dP].toSliceConst(), - dP, relTol, absTol, "phaseVisc", "Pres", phases ); - checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dP], - dP, relTol, absTol, "totalDens", "Pres" ); - checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dP].toSliceConst(), - dP, relTol, absTol, "phaseCompFrac", "Pres", phases, components ); - } - - // update temperature and check derivatives - { - real64 const dT = perturbParameter * (T + perturbParameter); - fluidWrapper.update( 0, 0, P, T + dT, composition ); - - checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dT].toSliceConst(), - dT, relTol, absTol, "phaseFrac", "Temp", phases ); - checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dT].toSliceConst(), - dT, relTol, absTol, "phaseDens", "Temp", phases ); - checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dT].toSliceConst(), - dT, relTol, absTol, "phaseVisc", "Temp", phases ); - checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dT], - dT, relTol, absTol, "totalDens", "Temp" ); - checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dT].toSliceConst(), - dT, relTol, absTol, "phaseCompFrac", "Temp", phases, components ); - } - - array2d< real64, compflow::LAYOUT_COMP > compNew( 1, NC ); - for( integer jc = 0; jc < NC; ++jc ) - { - real64 const dC = perturbParameter * ( composition[jc] + perturbParameter ); - for( integer ic = 0; ic < NC; ++ic ) - { - compNew[0][ic] = composition[ic]; - } - compNew[0][jc] += dC; - - // Note: in PVTPackage, derivatives are obtained with finite-difference approx **with normalization of the comp fraction** - // The component fraction is perturbed (just as above), and then all the component fractions are normalized (as below) - // But, in the native DO model and in CO2BrinePhillips, derivatives are computed analytically, which results in different - // derivatives wrt component fractions--although the derivatives wrt component densities obtained with the chain rule - // in the solver will be very similar (see discussion on PR #1325 on GitHub). - // - // Since both approaches--FD approximation of derivatives with normalization, and analytical derivatives--are correct, - // we have to support both when we check the intermediate derivatives wrt component fractions below. Therefore, if the - // PVTPackage is used, then we normalize the perturbed component fractions before taking the FD approx. If the native - // DO or CO2-brine models are used, we skip the normalization below. - if( usePVTPackage ) - { - // renormalize - real64 sum = 0.0; - for( integer ic = 0; ic < NC; ++ic ) - { - sum += compNew[0][ic]; - } - for( integer ic = 0; ic < NC; ++ic ) - { - compNew[0][ic] /= sum; - } - } - - fluidWrapper.update( 0, 0, P, T, compNew[0] ); - - string const var = "compFrac[" + components[jc] + "]"; - checkDerivative( phaseFracCopy.toSliceConst(), phaseFrac.value.toSliceConst(), dPhaseFrac[Deriv::dC+jc].toSliceConst(), - dC, relTol, absTol, "phaseFrac", var, phases ); - checkDerivative( phaseDensCopy.toSliceConst(), phaseDens.value.toSliceConst(), dPhaseDens[Deriv::dC+jc].toSliceConst(), - dC, relTol, absTol, "phaseDens", var, phases ); - checkDerivative( phaseViscCopy.toSliceConst(), phaseVisc.value.toSliceConst(), dPhaseVisc[Deriv::dC+jc].toSliceConst(), - dC, relTol, absTol, "phaseVisc", var, phases ); - checkDerivative( totalDensCopy, totalDens.value, dTotalDens[Deriv::dC+jc], - dC, relTol, absTol, "totalDens", var ); - checkDerivative( phaseCompFracCopy.toSliceConst(), phaseCompFrac.value.toSliceConst(), dPhaseCompFrac[Deriv::dC+jc].toSliceConst(), - dC, relTol, absTol, "phaseCompFrac", var, phases, components ); - } - } ); -} - -void testValuesAgainstPreviousImplementation( CO2BrinePhillipsFluid::KernelWrapper const & wrapper, - real64 const P, - real64 const T, - arraySlice1d< real64 const > const & compositionInput, - real64 const & savedTotalDensity, - real64 const & savedGasPhaseFrac, - real64 const & savedWaterDens, - real64 const & savedGasDens, - real64 const & savedWaterMassDens, - real64 const & savedGasMassDens, - real64 const & savedWaterVisc, - real64 const & savedGasVisc, - real64 const & savedWaterPhaseGasComp, - real64 const & savedWaterPhaseWaterComp, - real64 const relTol ) -{ - integer constexpr numPhase = 2; - integer constexpr numComp = 2; - integer constexpr numDof = numComp + 2; - - // Copy input values into an array with expected layout - array2d< real64, compflow::LAYOUT_COMP > compositionValues( 1, numComp ); - for( integer i = 0; i < numComp; ++i ) - { - compositionValues[0][i] = compositionInput[i]; - } - arraySlice1d< real64 const, compflow::USD_COMP - 1 > const composition = compositionValues[0]; - - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseFraction( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseFraction( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseDensity( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseDensity( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseMassDensity( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseMassDensity( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseViscosity( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseViscosity( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseEnthalpy( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseEnthalpy( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseInternalEnergy( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseInternalEnergy( 1, 1, numPhase, numDof ); - StackArray< real64, 4, numComp *numPhase, LAYOUT_PHASE_COMP > phaseCompFraction( 1, 1, numPhase, numComp ); - StackArray< real64, 5, numDof *numComp *numPhase, LAYOUT_PHASE_COMP_DC > dPhaseCompFraction( 1, 1, numPhase, numComp, numDof ); - StackArray< real64, 2, 1, LAYOUT_FLUID > totalDensity( 1, 1 ); - StackArray< real64, 3, numDof, LAYOUT_FLUID_DC > dTotalDensity( 1, 1, numDof ); - - wrapper.compute( P, T, composition, - { - phaseFraction[0][0], - dPhaseFraction[0][0] - }, - { - phaseDensity[0][0], - dPhaseDensity[0][0] - }, - { - phaseMassDensity[0][0], - dPhaseMassDensity[0][0] - }, - { - phaseViscosity[0][0], - dPhaseViscosity[0][0] - }, - { - phaseEnthalpy[0][0], - dPhaseEnthalpy[0][0] - }, - { - phaseInternalEnergy[0][0], - dPhaseInternalEnergy[0][0] - }, - { - phaseCompFraction[0][0], - dPhaseCompFraction[0][0] - }, - { - totalDensity[0][0], - dTotalDensity[0][0] - } ); - - checkRelativeError( totalDensity[0][0], savedTotalDensity, relTol ); - for( integer ip = 0; ip < numPhase; ++ip ) - { - real64 const savedPhaseFrac = ( ip == 0 ) ? savedGasPhaseFrac : 1 - savedGasPhaseFrac; - checkRelativeError( phaseFraction[0][0][ip], savedPhaseFrac, relTol ); - real64 const savedPhaseDens = ( ip == 0 ) ? savedGasDens : savedWaterDens; - checkRelativeError( phaseDensity[0][0][ip], savedPhaseDens, relTol ); - real64 const savedPhaseMassDens = ( ip == 0 ) ? savedGasMassDens : savedWaterMassDens; - checkRelativeError( phaseMassDensity[0][0][ip], savedPhaseMassDens, relTol ); - real64 const savedPhaseVisc = ( ip == 0 ) ? savedGasVisc : savedWaterVisc; - checkRelativeError( phaseViscosity[0][0][ip], savedPhaseVisc, relTol ); - for( integer ic = 0; ic < numComp; ++ic ) - { - real64 savedCompFrac = 0.0; - if( ip == 0 ) - { - savedCompFrac = ( ic == 0 ) ? 1 : 0; - } - else - { - savedCompFrac = ( ic == 0 ) ? savedWaterPhaseGasComp : savedWaterPhaseWaterComp; - } - checkRelativeError( phaseCompFraction[0][0][ip][ic], savedCompFrac, relTol ); - } - } -} - -MultiFluidBase & makeCompositionalFluid( string const & name, Group & parent ) -{ - CompositionalMultiphaseFluidPVTPackage & fluid = parent.registerGroup< CompositionalMultiphaseFluidPVTPackage >( name ); - - // TODO we should actually create a fake XML node with data, but this seemed easier... - - auto & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 4 ); - compNames[0] = "N2"; compNames[1] = "C10"; compNames[2] = "C20"; compNames[3] = "H20"; - - auto & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 4 ); - molarWgt[0] = 28e-3; molarWgt[1] = 134e-3; molarWgt[2] = 275e-3; molarWgt[3] = 18e-3; - - auto & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 2 ); - phaseNames[0] = "oil"; phaseNames[1] = "gas"; - - auto & eqnOfState = fluid.getReference< string_array >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::equationsOfStateString() ); - eqnOfState.resize( 2 ); - eqnOfState[0] = "PR"; eqnOfState[1] = "PR"; - - auto & critPres = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentCriticalPressureString() ); - critPres.resize( 4 ); - critPres[0] = 34e5; critPres[1] = 25.3e5; critPres[2] = 14.6e5; critPres[3] = 220.5e5; - - auto & critTemp = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentCriticalTemperatureString() ); - critTemp.resize( 4 ); - critTemp[0] = 126.2; critTemp[1] = 622.0; critTemp[2] = 782.0; critTemp[3] = 647.0; - - auto & acFactor = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentAcentricFactorString() ); - acFactor.resize( 4 ); - acFactor[0] = 0.04; acFactor[1] = 0.443; acFactor[2] = 0.816; acFactor[3] = 0.344; - - fluid.postProcessInputRecursive(); - return fluid; -} - -class CompositionalFluidTestBase : public ::testing::Test -{ -public: - CompositionalFluidTestBase(): - node(), - parent( "parent", node ) - {} - -protected: - conduit::Node node; - Group parent; - MultiFluidBase * fluid; -}; - -class CompositionalFluidTest : public CompositionalFluidTestBase -{ -public: - CompositionalFluidTest() - { - parent.resize( 1 ); - fluid = &makeCompositionalFluid( "fluid", parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } -}; - -TEST_F( CompositionalFluidTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - // TODO test over a range of values - real64 const P = 5e6; - real64 const T = 297.15; - array1d< real64 > comp( 4 ); - comp[0] = 0.099; comp[1] = 0.3; comp[2] = 0.6; comp[3] = 0.001; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - - testNumericalDerivatives( *fluid, parent, P, T, comp, eps, true, relTol ); -} - -TEST_F( CompositionalFluidTest, numericalDerivativesMass ) -{ - fluid->setMassFlag( true ); - - // TODO test over a range of values - real64 const P = 5e6; - real64 const T = 297.15; - array1d< real64 > comp( 4 ); - comp[0] = 0.099; comp[1] = 0.3; comp[2] = 0.6; comp[3] = 0.001; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-2; - - testNumericalDerivatives( *fluid, parent, P, T, comp, eps, true, relTol ); -} - -MultiFluidBase & makeLiveOilFluid( string const & name, Group * parent ) -{ - BlackOilFluid & fluid = parent->registerGroup< BlackOilFluid >( name ); - - string_array & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 3 ); - compNames[0] = "oil"; compNames[1] = "gas"; compNames[2] = "water"; - - array1d< real64 > & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 3 ); - molarWgt[0] = 114e-3; molarWgt[1] = 16e-3; molarWgt[2] = 18e-3; - - string_array & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 3 ); - phaseNames[0] = "oil"; phaseNames[1] = "gas"; phaseNames[2] = "water"; - - array1d< real64 > & surfaceDens = fluid.getReference< array1d< real64 > >( BlackOilFluidBase::viewKeyStruct::surfacePhaseMassDensitiesString() ); - surfaceDens.resize( 3 ); - surfaceDens[0] = 800.0; surfaceDens[1] = 0.9907; surfaceDens[2] = 1022.0; - - path_array & tableNames = fluid.getReference< path_array >( BlackOilFluidBase::viewKeyStruct::tableFilesString() ); - tableNames.resize( 3 ); - tableNames[0] = "pvto.txt"; tableNames[1] = "pvdg.txt"; tableNames[2] = "pvtw.txt"; - - fluid.postProcessInputRecursive(); - return fluid; -} - -MultiFluidBase & makeDeadOilFluid( string const & name, Group * parent ) -{ - DeadOilFluid & fluid = parent->registerGroup< DeadOilFluid >( name ); - - string_array & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 3 ); - compNames[0] = "oil"; compNames[1] = "water"; compNames[2] = "gas"; - - array1d< real64 > & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 3 ); - molarWgt[0] = 114e-3; molarWgt[1] = 16e-3; molarWgt[2] = 18e-3; - - string_array & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 3 ); - phaseNames[0] = "oil"; phaseNames[1] = "water"; phaseNames[2] = "gas"; - - array1d< real64 > & surfaceDens = fluid.getReference< array1d< real64 > >( BlackOilFluidBase::viewKeyStruct::surfacePhaseMassDensitiesString() ); - surfaceDens.resize( 3 ); - surfaceDens[0] = 800.0; surfaceDens[1] = 1022.0; surfaceDens[2] = 0.9907; - - path_array & tableNames = fluid.getReference< path_array >( BlackOilFluidBase::viewKeyStruct::tableFilesString() ); - tableNames.resize( 3 ); - tableNames[0] = "pvdo.txt"; tableNames[1] = "pvdw.txt"; tableNames[2] = "pvdg.txt"; - - fluid.postProcessInputRecursive(); - return fluid; -} - -MultiFluidBase & makeDeadOilFluidFromTable( string const & name, Group * parent ) -{ - FunctionManager & functionManager = FunctionManager::getInstance(); - - // 1) First, define the tables (PVDO, PVDG) - - // 1D table with linear interpolation - integer const NaxisPVDO = 21; - integer const NaxisPVDG = 13; - - array1d< real64_array > coordinatesPVDO; - real64_array valuesPVDO_Bo( NaxisPVDO ); - real64_array valuesPVDO_visc( NaxisPVDO ); - coordinatesPVDO.resize( 1 ); - coordinatesPVDO[0].resize( NaxisPVDO ); - coordinatesPVDO[0][0] = 10000000.0; valuesPVDO_Bo[0] = 1.23331; valuesPVDO_visc[0] = 0.00015674; - coordinatesPVDO[0][1] = 12500000.0; valuesPVDO_Bo[1] = 1.21987; valuesPVDO_visc[1] = 0.00016570; - coordinatesPVDO[0][2] = 15000000.0; valuesPVDO_Bo[2] = 1.20802; valuesPVDO_visc[2] = 0.00017445; - coordinatesPVDO[0][3] = 20000000.0; valuesPVDO_Bo[3] = 1.18791; valuesPVDO_visc[3] = 0.00019143; - coordinatesPVDO[0][4] = 25000000.0; valuesPVDO_Bo[4] = 1.17137; valuesPVDO_visc[4] = 0.00020779; - coordinatesPVDO[0][5] = 30000000.0; valuesPVDO_Bo[5] = 1.15742; valuesPVDO_visc[5] = 0.00022361; - coordinatesPVDO[0][6] = 33200000.3; valuesPVDO_Bo[6] = 1.14946; valuesPVDO_visc[6] = 0.00023359; - coordinatesPVDO[0][7] = 35000000.0; valuesPVDO_Bo[7] = 1.14543; valuesPVDO_visc[7] = 0.00023894; - coordinatesPVDO[0][8] = 40000000.0; valuesPVDO_Bo[8] = 1.13498; valuesPVDO_visc[8] = 0.00025383; - coordinatesPVDO[0][9] = 50000000.0; valuesPVDO_Bo[9] = 1.11753; valuesPVDO_visc[9] = 0.00028237; - coordinatesPVDO[0][10] = 60000000.0; valuesPVDO_Bo[10] = 1.10346; valuesPVDO_visc[10] = 0.00030941; - coordinatesPVDO[0][11] = 70000000.0; valuesPVDO_Bo[11] = 1.09180; valuesPVDO_visc[11] = 0.00033506; - coordinatesPVDO[0][12] = 80000000.0; valuesPVDO_Bo[12] = 1.08194; valuesPVDO_visc[12] = 0.00035945; - coordinatesPVDO[0][13] = 90000000.0; valuesPVDO_Bo[13] = 1.07347; valuesPVDO_visc[13] = 0.00038266; - coordinatesPVDO[0][14] = 95000000.0; valuesPVDO_Bo[14] = 1.06966; valuesPVDO_visc[14] = 0.00039384; - coordinatesPVDO[0][15] = 100000000.0; valuesPVDO_Bo[15] = 1.06610; valuesPVDO_visc[15] = 0.00040476; - coordinatesPVDO[0][16] = 110000000.0; valuesPVDO_Bo[16] = 1.05961; valuesPVDO_visc[16] = 0.00042584; - coordinatesPVDO[0][17] = 112500000.0; valuesPVDO_Bo[17] = 1.05811; valuesPVDO_visc[17] = 0.00043096; - coordinatesPVDO[0][18] = 115000000.0; valuesPVDO_Bo[18] = 1.05665; valuesPVDO_visc[18] = 0.00043602; - coordinatesPVDO[0][19] = 117500000.0; valuesPVDO_Bo[19] = 1.05523; valuesPVDO_visc[19] = 0.00044102; - coordinatesPVDO[0][20] = 120000000.0; valuesPVDO_Bo[20] = 1.05385; valuesPVDO_visc[20] = 0.00044596; - - array1d< real64_array > coordinatesPVDG; - real64_array valuesPVDG_Bg( NaxisPVDG ); - real64_array valuesPVDG_visc( NaxisPVDG ); - coordinatesPVDG.resize( 1 ); - coordinatesPVDG[0].resize( NaxisPVDG ); - coordinatesPVDG[0][0] = 3000000; valuesPVDG_Bg[0] = 0.04234; valuesPVDG_visc[0] = 0.00001344; - coordinatesPVDG[0][1] = 6000000; valuesPVDG_Bg[1] = 0.02046; valuesPVDG_visc[1] = 0.0000142; - coordinatesPVDG[0][2] = 9000000; valuesPVDG_Bg[2] = 0.01328; valuesPVDG_visc[2] = 0.00001526; - coordinatesPVDG[0][3] = 12000000; valuesPVDG_Bg[3] = 0.00977; valuesPVDG_visc[3] = 0.0000166; - coordinatesPVDG[0][4] = 15000000; valuesPVDG_Bg[4] = 0.00773; valuesPVDG_visc[4] = 0.00001818; - coordinatesPVDG[0][5] = 18000000; valuesPVDG_Bg[5] = 0.006426; valuesPVDG_visc[5] = 0.00001994; - coordinatesPVDG[0][6] = 21000000; valuesPVDG_Bg[6] = 0.005541; valuesPVDG_visc[6] = 0.00002181; - coordinatesPVDG[0][7] = 24000000; valuesPVDG_Bg[7] = 0.004919; valuesPVDG_visc[7] = 0.0000237; - coordinatesPVDG[0][8] = 27000000; valuesPVDG_Bg[8] = 0.004471; valuesPVDG_visc[8] = 0.00002559; - coordinatesPVDG[0][9] = 29500000; valuesPVDG_Bg[9] = 0.004194; valuesPVDG_visc[9] = 0.00002714; - coordinatesPVDG[0][10] = 31000000; valuesPVDG_Bg[10] = 0.004031; valuesPVDG_visc[10] = 0.00002806; - coordinatesPVDG[0][11] = 33000000; valuesPVDG_Bg[11] = 0.00391; valuesPVDG_visc[11] = 0.00002832; - coordinatesPVDG[0][12] = 53000000; valuesPVDG_Bg[12] = 0.003868; valuesPVDG_visc[12] = 0.00002935; - - TableFunction & tablePVDO_Bo = dynamicCast< TableFunction & >( *functionManager.createChild( "TableFunction", "PVDO_Bo" ) ); - tablePVDO_Bo.setTableCoordinates( coordinatesPVDO, { units::Pressure } ); - tablePVDO_Bo.setTableValues( valuesPVDO_Bo, units::Dimensionless ); - tablePVDO_Bo.reInitializeFunction(); - tablePVDO_Bo.setInterpolationMethod( TableFunction::InterpolationType::Linear ); - - TableFunction & tablePVDO_visc = dynamicCast< TableFunction & >( *functionManager.createChild( "TableFunction", "PVDO_visc" ) ); - tablePVDO_visc.setTableCoordinates( coordinatesPVDO, { units::Pressure } ); - tablePVDO_visc.setTableValues( valuesPVDO_visc, units::Viscosity ); - tablePVDO_visc.reInitializeFunction(); - tablePVDO_visc.setInterpolationMethod( TableFunction::InterpolationType::Linear ); - - TableFunction & tablePVDG_Bg = dynamicCast< TableFunction & >( *functionManager.createChild( "TableFunction", "PVDG_Bg" ) ); - tablePVDG_Bg.setTableCoordinates( coordinatesPVDG, { units::Pressure } ); - tablePVDG_Bg.setTableValues( valuesPVDG_Bg, units::Dimensionless ); - tablePVDG_Bg.reInitializeFunction(); - tablePVDG_Bg.setInterpolationMethod( TableFunction::InterpolationType::Linear ); - - TableFunction & tablePVDG_visc = dynamicCast< TableFunction & >( *functionManager.createChild( "TableFunction", "PVDG_visc" ) ); - tablePVDG_visc.setTableCoordinates( coordinatesPVDG, { units::Pressure } ); - tablePVDG_visc.setTableValues( valuesPVDG_visc, units::Viscosity ); - tablePVDG_visc.reInitializeFunction(); - tablePVDG_visc.setInterpolationMethod( TableFunction::InterpolationType::Linear ); - - // 2) Then, define the Dead-Oil constitutive model - - DeadOilFluid & fluid = parent->registerGroup< DeadOilFluid >( name ); - - string_array & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 3 ); - compNames[0] = "gas"; compNames[1] = "water"; compNames[2] = "oil"; - - array1d< real64 > & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 3 ); - molarWgt[0] = 18e-3; molarWgt[1] = 16e-3; molarWgt[2] = 114e-3; - - string_array & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 3 ); - phaseNames[0] = "gas"; phaseNames[1] = "water"; phaseNames[2] = "oil"; - - array1d< real64 > & surfaceDens = fluid.getReference< array1d< real64 > >( DeadOilFluid::viewKeyStruct::surfacePhaseMassDensitiesString() ); - surfaceDens.resize( 3 ); - surfaceDens[0] = 0.9907; surfaceDens[1] = 1022.0; surfaceDens[2] = 800.0; - - string_array & FVFTableNames = fluid.getReference< string_array >( DeadOilFluid::viewKeyStruct::formationVolumeFactorTableNamesString() ); - FVFTableNames.resize( 2 ); - FVFTableNames[0] = "PVDG_Bg"; FVFTableNames[1] = "PVDO_Bo"; - - string_array & viscosityTableNames = fluid.getReference< string_array >( DeadOilFluid::viewKeyStruct::viscosityTableNamesString() ); - viscosityTableNames.resize( 2 ); - viscosityTableNames[0] = "PVDG_visc"; viscosityTableNames[1] = "PVDO_visc"; - - real64 & waterRefPressure = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterRefPressureString() ); - waterRefPressure = 30600000.1; - real64 & waterFormationVolumeFactor = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterFormationVolumeFactorString() ); - waterFormationVolumeFactor = 1.03; - real64 & waterCompressibility = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterCompressibilityString() ); - waterCompressibility = 0.00000000041; - real64 & waterViscosity = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterViscosityString() ); - waterViscosity = 0.0003; - - fluid.postProcessInputRecursive(); - return fluid; -} - -void writeTableToFile( string const & filename, char const * str ) -{ - std::ofstream os( filename ); - ASSERT_TRUE( os.is_open() ); - os << str; - os.close(); -} - -void removeFile( string const & filename ) -{ - int const ret = std::remove( filename.c_str() ); - ASSERT_TRUE( ret == 0 ); -} - -class LiveOilFluidTest : public CompositionalFluidTestBase -{ -public: - LiveOilFluidTest() - { - writeTableToFile( "pvto.txt", pvtoTableContent ); - writeTableToFile( "pvdg.txt", pvdgTableContent ); - writeTableToFile( "pvtw.txt", pvtwTableContent ); - - parent.resize( 1 ); - fluid = &makeLiveOilFluid( "fluid", &parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } - - ~LiveOilFluidTest() - { - removeFile( "pvto.txt" ); - removeFile( "pvdg.txt" ); - removeFile( "pvtw.txt" ); - } -}; - -TEST_F( LiveOilFluidTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - real64 const P[3] = { 5.4e6, 1.24e7, 3.21e7 }; - real64 const T = 297.15; - array1d< real64 > comp( 3 ); - comp[0] = 0.79999; comp[1] = 0.2; comp[2] = 0.00001; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-12; - - for( integer i = 0; i < 3; ++i ) - { - testNumericalDerivatives( *fluid, parent, P[i], T, comp, eps, false, relTol ); - } -} - -TEST_F( LiveOilFluidTest, numericalDerivativesMass ) -{ - fluid->setMassFlag( true ); - - real64 const P[3] = { 5.4e6, 1.24e7, 3.21e7 }; - real64 const T = 297.15; - array1d< real64 > comp( 3 ); - comp[0] = 0.79999; comp[1] = 0.2; comp[2] = 0.00001; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-12; - - for( integer i = 0; i < 3; ++i ) - { - testNumericalDerivatives( *fluid, parent, P[i], T, comp, eps, false, relTol ); - } -} - -class DeadOilFluidTest : public CompositionalFluidTestBase -{ -public: - - DeadOilFluidTest() - { - writeTableToFile( "pvdo.txt", pvdoTableContent ); - writeTableToFile( "pvdg.txt", pvdgTableContent ); - writeTableToFile( "pvdw.txt", pvdwTableContent ); - - parent.resize( 1 ); - fluid = &makeDeadOilFluid( "fluid", &parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } - - ~DeadOilFluidTest() - { - removeFile( "pvdo.txt" ); - removeFile( "pvdg.txt" ); - removeFile( "pvdw.txt" ); - } -}; - -TEST_F( DeadOilFluidTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - real64 const P[3] = { 1.24e7, 3.21e7, 5.01e7 }; - real64 const T = 297.15; - array1d< real64 > comp( 3 ); - comp[0] = 0.1; comp[1] = 0.3; comp[2] = 0.6; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - - for( integer i = 0; i < 3; ++i ) - { - testNumericalDerivatives( *fluid, parent, P[i], T, comp, eps, false, relTol ); - } -} - -TEST_F( DeadOilFluidTest, numericalDerivativesMass ) -{ - fluid->setMassFlag( true ); - - real64 const P[3] = { 5.4e6, 1.24e7, 3.21e7 }; - real64 const T = 297.15; - array1d< real64 > comp( 3 ); - comp[0] = 0.1; comp[1] = 0.3; comp[2] = 0.6; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - real64 const absTol = 1e-14; - - for( integer i = 0; i < 3; ++i ) - { - testNumericalDerivatives( *fluid, parent, P[i], T, comp, eps, false, relTol, absTol ); - } -} - -class DeadOilFluidFromTableTest : public CompositionalFluidTestBase -{ -public: - - DeadOilFluidFromTableTest() - { - parent.resize( 1 ); - fluid = &makeDeadOilFluidFromTable( "fluid", &parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } -}; - -TEST_F( DeadOilFluidFromTableTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - real64 const P[3] = { 5.4e6, 1.24e7, 3.21e7 }; - real64 const T = 297.15; - array1d< real64 > comp( 3 ); - comp[0] = 0.1; comp[1] = 0.3; comp[2] = 0.6; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - - for( integer i = 0; i < 3; ++i ) - { - testNumericalDerivatives( *fluid, parent, P[i], T, comp, eps, false, relTol ); - } -} - -MultiFluidBase & makeCO2BrinePhillipsFluid( string const & name, Group * parent ) -{ - CO2BrinePhillipsFluid & fluid = parent->registerGroup< CO2BrinePhillipsFluid >( name ); - - auto & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 2 ); - compNames[0] = "co2"; compNames[1] = "water"; - - auto & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 2 ); - molarWgt[0] = 44e-3; molarWgt[1] = 18e-3; - - auto & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 2 ); - phaseNames[0] = "gas"; phaseNames[1] = "liquid"; - - auto & phasePVTParaFileNames = fluid.getReference< path_array >( CO2BrinePhillipsFluid::viewKeyStruct::phasePVTParaFilesString() ); - phasePVTParaFileNames.resize( 2 ); - phasePVTParaFileNames[0] = "pvtgas.txt"; phasePVTParaFileNames[1] = "pvtliquid.txt"; - - auto & flashModelParaFileName = fluid.getReference< Path >( CO2BrinePhillipsFluid::viewKeyStruct::flashModelParaFileString() ); - flashModelParaFileName = "co2flash.txt"; - - fluid.postProcessInputRecursive(); - return fluid; -} - -class CO2BrinePhillipsFluidTest : public CompositionalFluidTestBase -{ -protected: - - CO2BrinePhillipsFluidTest() - { - writeTableToFile( "pvtliquid.txt", pvtLiquidPhillipsTableContent ); - writeTableToFile( "pvtgas.txt", pvtGasTableContent ); - writeTableToFile( "co2flash.txt", co2FlashTableContent ); - - parent.resize( 1 ); - fluid = &makeCO2BrinePhillipsFluid( "fluid", &parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } - - ~CO2BrinePhillipsFluidTest() - { - removeFile( "pvtliquid.txt" ); - removeFile( "pvtgas.txt" ); - removeFile( "co2flash.txt" ); - } - -}; - - -TEST_F( CO2BrinePhillipsFluidTest, checkAgainstPreviousImplementationMolar ) -{ - fluid->setMassFlag( false ); - - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const relTol = 1e-10; - - fluid->allocateConstitutiveData( fluid->getParent(), 1 ); - - CO2BrinePhillipsFluid::KernelWrapper wrapper = - dynamicCast< CO2BrinePhillipsFluid * >( fluid )->createKernelWrapper(); - - real64 const savedTotalDens[] = - { 5881.9010529428224, 5869.6094131788523, 5855.0332090690354, 9181.3523596865525, 9157.6071613646127, 9129.5728206336826, 15757.685798517123, 15698.877814368472, - 15630.149353340639 }; - real64 const savedGasPhaseFrac[] = - { 0.29413690046142371148, 0.29415754810481165027, 0.29418169867697463449, 0.29194010802017489326, 0.29196434961986583723, 0.29199266189550621142, 0.2890641335638892695, 0.28908718137828937067, - 0.28911404840933618843 }; - real64 const savedWaterDens[] = - { 53296.719183517576, 53274.578175308554, 53247.856162690216, 53248.577831698305, 53226.801031868054, 53200.505577694363, 53232.959859840405, 53211.345942175059, - 53185.244751356993 }; - real64 const savedGasDens[] = - { 1876.2436091302606656, 1872.184636376355229, 1867.3711104617746059, 3053.1548401973859654, 3044.5748249030266379, 3034.4507978134674886, 5769.0622621289458039, 5742.8476745352018042, - 5712.2837704249559465 }; - real64 const savedWaterMassDens[] = - { 970.85108546544745423, 970.4075834766143771, 969.87385780866463847, 974.23383396044232541, 973.78856424100911227, 973.25280170872576946, 979.48333010951580491, 979.04147229150635212, - 978.50977403260912979 }; - real64 const savedGasMassDens[] = - { 82.554718801731468147, 82.376124000559627802, 82.164328860318079251, 134.33881296868497657, 133.96129229573315911, 133.51583510379256836, 253.83873953367358922, 252.68529767954885301, - 251.34048589869803436 }; - real64 const savedWaterVisc[] = - { 0.0003032144206279845924, 0.00030157070452334377216, 0.00029959815370251820189, 0.0003032144206279845924, 0.00030157070452334377216, 0.00029959815370251820189, 0.0003032144206279845924, - 0.00030157070452334377216, 0.00029959815370251820189 }; - - real64 const savedGasVisc[] = - { 1.9042384704865343673e-05, 1.9062615947696152414e-05, 1.9086923154230274463e-05, 2.0061713844617985449e-05, 2.0075955757102255573e-05, 2.0093249989250199265e-05, 2.3889596884008691474e-05, - 2.3865756080512667728e-05, 2.3839170076324036522e-05 }; - real64 const savedWaterPhaseGasComp[] = - { 0.0083062842389820552153, 0.008277274736736653718, 0.0082433415400525456018, 0.011383065290266058955, 0.011349217198060387521, 0.011309682362800700661, 0.015382352969377973903, - 0.015350431636424789056, 0.015313218057419366105 }; - real64 const savedWaterPhaseWaterComp[] = - { 0.99169371576101794652, 0.9917227252632633272, 0.99175665845994742664, 0.98861693470973388553, 0.98865078280193963156, 0.98869031763719927852, 0.98461764703062204518, 0.98464956836357520054, - 0.98468678194258063563 }; - - integer counter = 0; - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testValuesAgainstPreviousImplementation( wrapper, - P[i], T[j], comp, - savedTotalDens[counter], savedGasPhaseFrac[counter], - savedWaterDens[counter], savedGasDens[counter], - savedWaterMassDens[counter], savedGasMassDens[counter], - savedWaterVisc[counter], savedGasVisc[counter], - savedWaterPhaseGasComp[counter], savedWaterPhaseWaterComp[counter], - relTol ); - counter++; - } - } -} - -TEST_F( CO2BrinePhillipsFluidTest, checkAgainstPreviousImplementationMass ) -{ - fluid->setMassFlag( true ); - - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const relTol = 1e-10; - - fluid->allocateConstitutiveData( fluid->getParent(), 1 ); - - CO2BrinePhillipsFluid::KernelWrapper wrapper = - dynamicCast< CO2BrinePhillipsFluid * >( fluid )->createKernelWrapper(); - - real64 const savedTotalDens[] = - { 238.31504112633914, 237.83897306400553, 237.27445306546298, 353.95258514794097, 353.12773295711992, 352.1532278769692, 549.90502586392017, 548.2725957521294, - 546.35992000222234 }; - real64 const savedGasPhaseFrac[] = - { 0.28566797890570228, 0.28571845092287312, 0.28577748565482669, 0.28029804182709406, 0.28035729907078311, 0.2804265068556816, 0.27326788204506247, 0.27332422114692956, - 0.27338989611171055 }; - real64 const savedWaterDens[] = - { 970.85108546544745423, 970.4075834766143771, 969.87385780866463847, 974.23383396044232541, 973.78856424100911227, 973.25280170872576946, 979.48333010951580491, 979.04147229150635212, - 978.50977403260912979 }; - real64 const savedGasDens[] = - { 82.554718801731468147, 82.376124000559627802, 82.164328860318079251, 134.33881296868497657, 133.96129229573315911, 133.51583510379256836, 253.83873953367358922, 252.68529767954885301, - 251.34048589869803436 }; - real64 const savedWaterMassDens[] = - { 970.85108546544745423, 970.4075834766143771, 969.87385780866463847, 974.23383396044232541, 973.78856424100911227, 973.25280170872576946, 979.48333010951580491, 979.04147229150635212, - 978.50977403260912979 }; - real64 const savedGasMassDens[] = - { 82.554718801731468147, 82.376124000559627802, 82.164328860318079251, 134.33881296868497657, 133.96129229573315911, 133.51583510379256836, 253.83873953367358922, 252.68529767954885301, - 251.34048589869803436 }; - real64 const savedWaterVisc[] = - { 0.0003032144206279845924, 0.00030157070452334377216, 0.00029959815370251820189, 0.0003032144206279845924, 0.00030157070452334377216, 0.00029959815370251820189, 0.0003032144206279845924, - 0.00030157070452334377216, 0.00029959815370251820189 }; - real64 const savedGasVisc[] = - { 1.9042384704865343673e-05, 1.9062615947696152414e-05, 1.9086923154230274463e-05, 2.0061713844617985449e-05, 2.0075955757102255573e-05, 2.0093249989250199265e-05, 2.3889596884008691474e-05, - 2.3865756080512667728e-05, 2.3839170076324036522e-05 }; - real64 const savedWaterPhaseGasComp[] = - { 0.020063528822832473, 0.019994285300494085, 0.019913282008777046, 0.027375162661670061, 0.027295074213708581, 0.02720152052681666, 0.036784005129927563, - 0.036709327088310859, 0.036622259649145526 }; - real64 const savedWaterPhaseWaterComp[] = - { 0.97993647117716742, 0.98000571469950604, 0.98008671799122282, 0.97262483733832983, 0.97270492578629131, 0.97279847947318321, 0.96321599487007259, 0.96329067291168902, - 0.96337774035085455 }; - - integer counter = 0; - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testValuesAgainstPreviousImplementation( wrapper, - P[i], T[j], comp, - savedTotalDens[counter], savedGasPhaseFrac[counter], - savedWaterDens[counter], savedGasDens[counter], - savedWaterMassDens[counter], savedGasMassDens[counter], - savedWaterVisc[counter], savedGasVisc[counter], - savedWaterPhaseGasComp[counter], savedWaterPhaseWaterComp[counter], - relTol ); - counter++; - } - } -} - -TEST_F( CO2BrinePhillipsFluidTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - // TODO test over a range of values - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testNumericalDerivatives( *fluid, parent, P[i], T[j], comp, eps, false, relTol ); - } - } -} - -TEST_F( CO2BrinePhillipsFluidTest, numericalDerivativesMass ) -{ - fluid->setMassFlag( true ); - - // TODO test over a range of values - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-8; - - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testNumericalDerivatives( *fluid, parent, P[i], T[j], comp, eps, false, relTol ); - } - } -} - -MultiFluidBase & makeCO2BrineEzrokhiFluid( string const & name, Group * parent ) -{ - CO2BrineEzrokhiFluid & fluid = parent->registerGroup< CO2BrineEzrokhiFluid >( name ); - - auto & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - compNames.resize( 2 ); - compNames[0] = "co2"; compNames[1] = "water"; - - auto & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); - molarWgt.resize( 2 ); - molarWgt[0] = 44e-3; molarWgt[1] = 18e-3; - - auto & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); - phaseNames.resize( 2 ); - phaseNames[0] = "gas"; phaseNames[1] = "liquid"; - - auto & phasePVTParaFileNames = fluid.getReference< path_array >( CO2BrineEzrokhiFluid::viewKeyStruct::phasePVTParaFilesString() ); - phasePVTParaFileNames.resize( 2 ); - phasePVTParaFileNames[0] = "pvtgas.txt"; phasePVTParaFileNames[1] = "pvtliquid.txt"; - - auto & flashModelParaFileName = fluid.getReference< Path >( CO2BrineEzrokhiFluid::viewKeyStruct::flashModelParaFileString() ); - flashModelParaFileName = "co2flash.txt"; - - fluid.postProcessInputRecursive(); - return fluid; -} - -class CO2BrineEzrokhiFluidTest : public CompositionalFluidTestBase -{ -protected: - - CO2BrineEzrokhiFluidTest() - { - writeTableToFile( "pvtliquid.txt", pvtLiquidEzrokhiTableContent ); - writeTableToFile( "pvtgas.txt", pvtGasTableContent ); - writeTableToFile( "co2flash.txt", co2FlashTableContent ); - - parent.resize( 1 ); - fluid = &makeCO2BrineEzrokhiFluid( "fluid", &parent ); - - parent.initialize(); - parent.initializePostInitialConditions(); - } - - ~CO2BrineEzrokhiFluidTest() - { - removeFile( "pvtliquid.txt" ); - removeFile( "pvtgas.txt" ); - removeFile( "co2flash.txt" ); - } - -}; - -TEST_F( CO2BrineEzrokhiFluidTest, numericalDerivativesMolar ) -{ - fluid->setMassFlag( false ); - - // TODO test over a range of values - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-4; - - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testNumericalDerivatives( *fluid, parent, P[i], T[j], comp, eps, false, relTol ); - } - } -} - -TEST_F( CO2BrineEzrokhiFluidTest, numericalDerivativesMass ) -{ - fluid->setMassFlag( true ); - - // TODO test over a range of values - real64 const P[3] = { 5e6, 7.5e6, 1.2e7 }; - real64 const T[3] = { 367.65, 368.15, 368.75 }; - array1d< real64 > comp( 2 ); - comp[0] = 0.3; comp[1] = 0.7; - - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); - real64 const relTol = 1e-8; - - for( integer i = 0; i < 3; ++i ) - { - for( integer j = 0; j < 3; ++j ) - { - testNumericalDerivatives( *fluid, parent, P[i], T[j], comp, eps, false, relTol ); - } - } -} - -int main( int argc, char * * argv ) -{ - ::testing::InitGoogleTest( &argc, argv ); - - geos::GeosxState state( geos::basicSetup( argc, argv ) ); - - int const result = RUN_ALL_TESTS(); - - geos::basicCleanup(); - - return result; -} diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp new file mode 100644 index 00000000000..d1ddabca7c7 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp @@ -0,0 +1,373 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file testMultiFluidCO2Brine.cpp + */ + +#include "MultiFluidTest.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mainInterface/initialization.hpp" +#include "common/GeosxConfig.hpp" + +using namespace geos; +using namespace geos::testing; +using namespace geos::constitutive; + +enum class BrineModelType : int {Phillips, Ezrokhi}; +enum class FlashType : int {DuanSun, SpycherPruess}; + +ENUM_STRINGS( BrineModelType, "Phillips", "Ezrokhi" ); +ENUM_STRINGS( FlashType, "DuanSun", "SpycherPruess" ); + +template< BrineModelType BRINE, bool THERMAL > +struct FluidType {}; + +template<> +struct FluidType< BrineModelType::Phillips, false > +{ + using type = CO2BrinePhillipsFluid; + static constexpr const char * brineContent = "DensityFun PhillipsBrineDensity 1e6 1.5e7 5e4 367.15 369.15 1 0.2\n" + "ViscosityFun PhillipsBrineViscosity 0.1"; + static constexpr const char * gasContent = "DensityFun SpanWagnerCO2Density 1e6 1.5e7 5e4 367.15 369.15 1\n" + "ViscosityFun FenghourCO2Viscosity 1e6 1.5e7 5e4 367.15 369.15 1"; +}; +template<> +struct FluidType< BrineModelType::Phillips, true > +{ + using type = CO2BrinePhillipsThermalFluid; + static constexpr const char * brineContent = "DensityFun PhillipsBrineDensity 1e6 1.5e7 5e4 367.15 369.15 1 0.2\n" + "ViscosityFun PhillipsBrineViscosity 0.1\n" + "EnthalpyFun BrineEnthalpy 1e6 7.5e7 5e5 299.15 369.15 10 0"; + static constexpr const char * gasContent = "DensityFun SpanWagnerCO2Density 1e6 1.5e7 5e4 367.15 369.15 1\n" + "ViscosityFun FenghourCO2Viscosity 1e6 1.5e7 5e4 367.15 369.15 1\n" + "EnthalpyFun CO2Enthalpy 1e6 1.5e7 5e4 367.15 369.15 1"; +}; +template<> +struct FluidType< BrineModelType::Ezrokhi, false > +{ + using type = CO2BrineEzrokhiFluid; + static constexpr const char * brineContent = "DensityFun EzrokhiBrineDensity 2.01e-6 -6.34e-7 1e-4\n" + "ViscosityFun EzrokhiBrineViscosity 2.42e-7 0 1e-4"; + static constexpr const char * gasContent = "DensityFun SpanWagnerCO2Density 1e6 1.5e7 5e4 367.15 369.15 1\n" + "ViscosityFun FenghourCO2Viscosity 1e6 1.5e7 5e4 367.15 369.15 1"; +}; +template<> +struct FluidType< BrineModelType::Ezrokhi, true > +{ + using type = CO2BrineEzrokhiThermalFluid; + static constexpr const char * brineContent = "DensityFun EzrokhiBrineDensity 2.01e-6 -6.34e-7 1e-4\n" + "ViscosityFun EzrokhiBrineViscosity 2.42e-7 0 1e-4\n" + "EnthalpyFun BrineEnthalpy 1e6 7.5e7 5e5 299.15 369.15 10 0"; + static constexpr const char * gasContent = "DensityFun SpanWagnerCO2Density 1e6 1.5e7 5e4 367.15 369.15 1\n" + "ViscosityFun FenghourCO2Viscosity 1e6 1.5e7 5e4 367.15 369.15 1\n" + "EnthalpyFun CO2Enthalpy 1e6 1.5e7 5e4 367.15 369.15 1"; +}; + +template< FlashType FLASH > +struct FlashModel {}; + +template<> +struct FlashModel< FlashType::DuanSun > +{ + static constexpr const char * flashContent = "FlashModel CO2Solubility 1e6 1.5e7 5e4 367.15 369.15 1 0.15"; +}; +template<> +struct FlashModel< FlashType::SpycherPruess > +{ + static constexpr const char * flashContent = "FlashModel CO2Solubility 1e6 1.5e7 5e4 367.15 369.15 1 0.15 1.0e-10 SpycherPruess"; +}; + +template< BrineModelType BRINE, FlashType FLASH, bool THERMAL > +class MultiFluidCO2BrineTest : public MultiFluidTest< typename FluidType< BRINE, THERMAL >::type, 2, 2 >, + public ::testing::WithParamInterface< typename MultiFluidTest< typename FluidType< BRINE, THERMAL >::type, 2, 2 >::TestData > +{ +public: + using CO2BrineFluid = typename FluidType< BRINE, THERMAL >::type; + using Base = MultiFluidTest< typename FluidType< BRINE, THERMAL >::type, 2, 2 >; + static constexpr real64 relTol = 1.0e-4; + static constexpr real64 absTol = 1.0e-4; + +public: + MultiFluidCO2BrineTest() + { + Base::writeTableToFile( pvtGasFileName, FluidType< BRINE, THERMAL >::gasContent ); + Base::writeTableToFile( pvtLiquidFileName, FluidType< BRINE, THERMAL >::brineContent ); + Base::writeTableToFile( pvtFlashFileName, FlashModel< FLASH >::flashContent ); + + auto & parent = this->m_parent; + parent.resize( 1 ); + string const fluidName = GEOS_FMT( "fluid{}{}{}", + EnumStrings< BrineModelType >::toString( BRINE ), + EnumStrings< FlashType >::toString( FLASH ), + (THERMAL ? "Thermal" : "")); + this->m_model = makeCO2BrineFluid( fluidName, &parent ); + + parent.initialize(); + parent.initializePostInitialConditions(); + } + + ~MultiFluidCO2BrineTest() override + { + Base::removeFile( pvtGasFileName ); + Base::removeFile( pvtLiquidFileName ); + Base::removeFile( pvtFlashFileName ); + } + + // Test numerical derivatives at selected data points + void testNumericalDerivatives( bool const useMass ) + { + auto * parent = &(this->getParent()); + auto & fluid = this->getFluid(); + fluid.setMassFlag( useMass ); + + real64 constexpr eps = 1.0e-5; + + // Some of the functions are simply table lookups. We need to keep the test points away from + // the table nodes because the kink in the linear interpolation might cause numerical derivative + // mismatches. Some of these values have been manually inspected and the differences, although + // not meeting the tolerance here, are small as expected. + constexpr real64 temperatures[] = { 367.65, 368.00, 368.75 }; + constexpr real64 pressures[] = { 5.001e6, 7.501e6, 1.201e7 }; + + for( real64 const pressure : pressures ) + { + for( real64 const temperature : temperatures ) + { + typename Base::TestData data ( pressure, temperature, { 0.3, 0.7 } ); + Base::testNumericalDerivatives( fluid, parent, data, eps, relTol, absTol ); + } + } + } + +private: + static CO2BrineFluid * makeCO2BrineFluid( string const & name, Group * parent ); + static constexpr const char * pvtGasFileName = "pvtgas.txt"; + static constexpr const char * pvtLiquidFileName = "pvtliquid.txt"; + static constexpr const char * pvtFlashFileName = "co2flash.txt"; +}; + +template< BrineModelType BRINE, FlashType FLASH, bool THERMAL > +typename MultiFluidCO2BrineTest< BRINE, FLASH, THERMAL >::CO2BrineFluid * +MultiFluidCO2BrineTest< BRINE, FLASH, THERMAL >::makeCO2BrineFluid( string const & name, Group * parent ) +{ + CO2BrineFluid & co2BrineFluid = parent->registerGroup< CO2BrineFluid >( name ); + + Group & fluid = co2BrineFluid; + + auto & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); + fill< 2 >( phaseNames, {"gas", "liquid"} ); + + auto & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + fill< 2 >( compNames, {"co2", "water"} ); + + auto & molarWeight = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); + fill< 2 >( molarWeight, {44e-3, 18e-3} ); + + auto & phasePVTParaFileNames = fluid.getReference< path_array >( CO2BrineFluid::viewKeyStruct::phasePVTParaFilesString() ); + fill< 2 >( phasePVTParaFileNames, {pvtGasFileName, pvtLiquidFileName} ); + + auto & flashModelParaFileName = fluid.getReference< Path >( CO2BrineFluid::viewKeyStruct::flashModelParaFileString() ); + flashModelParaFileName = pvtFlashFileName; + + co2BrineFluid.postProcessInputRecursive(); + + return &co2BrineFluid; +} + +using MultiFluidCO2BrineBrinePhillipsTest = MultiFluidCO2BrineTest< BrineModelType::Phillips, + FlashType::DuanSun, + false >; +using MultiFluidCO2BrineBrineEzrokhiTest = MultiFluidCO2BrineTest< BrineModelType::Ezrokhi, + FlashType::DuanSun, + false >; +using MultiFluidCO2BrineBrinePhillipsThermalTest = MultiFluidCO2BrineTest< BrineModelType::Phillips, + FlashType::DuanSun, + true >; +using MultiFluidCO2BrineBrinePhillipsSpycherPruessTest = MultiFluidCO2BrineTest< BrineModelType::Phillips, + FlashType::SpycherPruess, + false >; +#if !defined(GEOS_DEVICE_COMPILE) +using MultiFluidCO2BrineBrineEzrokhiThermalTest = MultiFluidCO2BrineTest< BrineModelType::Ezrokhi, + FlashType::DuanSun, + true >; +#endif + +TEST_F( MultiFluidCO2BrineBrinePhillipsTest, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( MultiFluidCO2BrineBrinePhillipsTest, numericalDerivativesMass ) +{ + testNumericalDerivatives( true ); +} + +TEST_F( MultiFluidCO2BrineBrineEzrokhiTest, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( MultiFluidCO2BrineBrineEzrokhiTest, numericalDerivativesMass ) +{ + testNumericalDerivatives( true ); +} + +TEST_F( MultiFluidCO2BrineBrinePhillipsThermalTest, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( MultiFluidCO2BrineBrinePhillipsThermalTest, numericalDerivativesMass ) +{ + testNumericalDerivatives( true ); +} + +#if !defined(GEOS_DEVICE_COMPILE) +TEST_F( MultiFluidCO2BrineBrineEzrokhiThermalTest, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( MultiFluidCO2BrineBrineEzrokhiThermalTest, numericalDerivativesMass ) +{ + testNumericalDerivatives( true ); +} +#endif + +TEST_F( MultiFluidCO2BrineBrinePhillipsSpycherPruessTest, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( MultiFluidCO2BrineBrinePhillipsSpycherPruessTest, numericalDerivativesMass ) +{ + testNumericalDerivatives( true ); +} + +TEST_P( MultiFluidCO2BrineBrinePhillipsTest, checkAgainstPreviousImplementationMass ) +{ + auto & fluid = dynamicCast< CO2BrineFluid & >( this->getFluid()); + auto fluidWrapper = fluid.createKernelWrapper(); + testValuesAgainstPreviousImplementation( fluidWrapper, GetParam(), relTol ); +} + +TEST_P( MultiFluidCO2BrineBrineEzrokhiTest, checkAgainstPreviousImplementationMass ) +{ + auto & fluid = dynamicCast< CO2BrineFluid & >( this->getFluid()); + auto fluidWrapper = fluid.createKernelWrapper(); + testValuesAgainstPreviousImplementation( fluidWrapper, GetParam(), relTol ); +} + +TEST_P( MultiFluidCO2BrineBrinePhillipsThermalTest, checkAgainstPreviousImplementationMass ) +{ + auto & fluid = dynamicCast< CO2BrineFluid & >( this->getFluid()); + auto fluidWrapper = fluid.createKernelWrapper(); + testValuesAgainstPreviousImplementation( fluidWrapper, GetParam(), relTol ); +} + +TEST_P( MultiFluidCO2BrineBrinePhillipsSpycherPruessTest, checkAgainstPreviousImplementationMass ) +{ + auto & fluid = dynamicCast< CO2BrineFluid & >( this->getFluid()); + auto fluidWrapper = fluid.createKernelWrapper(); + testValuesAgainstPreviousImplementation( fluidWrapper, GetParam(), relTol ); +} + +//------------------------------------------------------------------------------- +// Data +//------------------------------------------------------------------------------- + +/* UNCRUSTIFY-OFF */ + +#define D( ... ) MultiFluidCO2BrineBrinePhillipsTest::TestData{ __VA_ARGS__ } +INSTANTIATE_TEST_SUITE_P( + MultiFluidCO2Brine, MultiFluidCO2BrineBrinePhillipsTest, + ::testing::Values( + //| pressure | temp | composition | density | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | + D( 5.00100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 5.88317e+03, {2.94136e-01, 7.05864e-01}, {1.87668e+03, 5.32967e+04}, {8.25738e+01, 9.70853e+02}, {1.90427e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 5.87456e+03, {2.94150e-01, 7.05850e-01}, {1.87383e+03, 5.32812e+04}, {8.24487e+01, 9.70542e+02}, {1.90569e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 5.85630e+03, {2.94181e-01, 7.05819e-01}, {1.86780e+03, 5.32478e+04}, {8.21833e+01, 9.69875e+02}, {1.90872e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 9.18273e+03, {2.91939e-01, 7.08061e-01}, {3.05367e+03, 5.32486e+04}, {1.34361e+02, 9.74235e+02}, {2.00622e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 9.16610e+03, {2.91956e-01, 7.08044e-01}, {3.04766e+03, 5.32333e+04}, {1.34097e+02, 9.73923e+02}, {2.00722e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 9.13094e+03, {2.91992e-01, 7.08008e-01}, {3.03496e+03, 5.32005e+04}, {1.33538e+02, 9.73254e+02}, {2.00938e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 1.57730e+04, {2.89059e-01, 7.10941e-01}, {5.77607e+03, 5.32330e+04}, {2.54147e+02, 9.79494e+02}, {2.39022e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 1.57318e+04, {2.89075e-01, 7.10925e-01}, {5.75768e+03, 5.32179e+04}, {2.53338e+02, 9.79185e+02}, {2.38854e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 1.56452e+04, {2.89109e-01, 7.10891e-01}, {5.71917e+03, 5.31853e+04}, {2.51643e+02, 9.78520e+02}, {2.38514e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ) + ) +); +#undef D + +#define D( ... ) MultiFluidCO2BrineBrineEzrokhiTest::TestData{ __VA_ARGS__ } +INSTANTIATE_TEST_SUITE_P( + MultiFluidCO2Brine, MultiFluidCO2BrineBrineEzrokhiTest, + ::testing::Values( + //| pressure | temp | composition | density | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | + D( 5.00100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 5.89876e+03, {2.94136e-01, 7.05864e-01}, {1.87668e+03, 5.51674e+04}, {8.25738e+01, 1.00493e+03}, {1.90427e-05, 3.12148e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 5.89023e+03, {2.94150e-01, 7.05850e-01}, {1.87383e+03, 5.51663e+04}, {8.24487e+01, 1.00488e+03}, {1.90569e-05, 3.11023e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 5.87213e+03, {2.94181e-01, 7.05819e-01}, {1.86780e+03, 5.51642e+04}, {8.21833e+01, 1.00478e+03}, {1.90872e-05, 3.08611e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 9.23469e+03, {2.91939e-01, 7.08061e-01}, {3.05367e+03, 5.58209e+04}, {1.34361e+02, 1.02130e+03}, {2.00622e-05, 3.16876e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 9.21829e+03, {2.91956e-01, 7.08044e-01}, {3.04766e+03, 5.58254e+04}, {1.34097e+02, 1.02135e+03}, {2.00722e-05, 3.15764e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 9.18360e+03, {2.91992e-01, 7.08008e-01}, {3.03496e+03, 5.58353e+04}, {1.33538e+02, 1.02146e+03}, {2.00938e-05, 3.13381e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 1.59791e+04, {2.89059e-01, 7.10941e-01}, {5.77607e+03, 5.67057e+04}, {2.54147e+02, 1.04339e+03}, {2.39022e-05, 3.23075e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 1.59385e+04, {2.89075e-01, 7.10925e-01}, {5.75768e+03, 5.67188e+04}, {2.53338e+02, 1.04360e+03}, {2.38854e-05, 3.21991e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 1.58533e+04, {2.89109e-01, 7.10891e-01}, {5.71917e+03, 5.67472e+04}, {2.51643e+02, 1.04405e+03}, {2.38514e-05, 3.19665e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ) + ) +); +#undef D + +#define D( ... ) MultiFluidCO2BrineBrinePhillipsThermalTest::TestData{ __VA_ARGS__ } +INSTANTIATE_TEST_SUITE_P( + MultiFluidCO2Brine, MultiFluidCO2BrineBrinePhillipsThermalTest, + ::testing::Values( + //| pressure | temp | composition | density | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | + D( 5.00100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 5.88317e+03, {2.94136e-01, 7.05864e-01}, {1.87668e+03, 5.32967e+04}, {8.25738e+01, 9.70853e+02}, {1.90427e-05, 3.03214e-04}, {1.21447e+07, 2.18796e+07}, {1.20841e+07, 2.18744e+07} ), + D( 5.00100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 5.87456e+03, {2.94150e-01, 7.05850e-01}, {1.87383e+03, 5.32812e+04}, {8.24487e+01, 9.70542e+02}, {1.90569e-05, 3.02064e-04}, {1.21537e+07, 2.19628e+07}, {1.20931e+07, 2.19576e+07} ), + D( 5.00100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 5.85630e+03, {2.94181e-01, 7.05819e-01}, {1.86780e+03, 5.32478e+04}, {8.21833e+01, 9.69875e+02}, {1.90872e-05, 2.99598e-04}, {1.21731e+07, 2.21410e+07}, {1.21123e+07, 2.21359e+07} ), + D( 7.50100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 9.18273e+03, {2.91939e-01, 7.08061e-01}, {3.05367e+03, 5.32486e+04}, {1.34361e+02, 9.74235e+02}, {2.00622e-05, 3.03214e-04}, {1.17163e+07, 2.18445e+07}, {1.16605e+07, 2.18368e+07} ), + D( 7.50100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 9.16610e+03, {2.91956e-01, 7.08044e-01}, {3.04766e+03, 5.32333e+04}, {1.34097e+02, 9.73923e+02}, {2.00722e-05, 3.02064e-04}, {1.17269e+07, 2.19275e+07}, {1.16709e+07, 2.19198e+07} ), + D( 7.50100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 9.13094e+03, {2.91992e-01, 7.08008e-01}, {3.03496e+03, 5.32005e+04}, {1.33538e+02, 9.73254e+02}, {2.00938e-05, 2.99598e-04}, {1.17494e+07, 2.21054e+07}, {1.16932e+07, 2.20977e+07} ), + D( 1.20100e+07, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 1.57730e+04, {2.89059e-01, 7.10941e-01}, {5.77607e+03, 5.32330e+04}, {2.54147e+02, 9.79494e+02}, {2.39022e-05, 3.03214e-04}, {1.08306e+07, 2.17898e+07}, {1.07833e+07, 2.17775e+07} ), + D( 1.20100e+07, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 1.57318e+04, {2.89075e-01, 7.10925e-01}, {5.75768e+03, 5.32179e+04}, {2.53338e+02, 9.79185e+02}, {2.38854e-05, 3.02064e-04}, {1.08453e+07, 2.18726e+07}, {1.07979e+07, 2.18603e+07} ), + D( 1.20100e+07, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 1.56452e+04, {2.89109e-01, 7.10891e-01}, {5.71917e+03, 5.31853e+04}, {2.51643e+02, 9.78520e+02}, {2.38514e-05, 2.99598e-04}, {1.08767e+07, 2.20500e+07}, {1.08290e+07, 2.20378e+07} ) + ) +); +#undef D + +#define D( ... ) MultiFluidCO2BrineBrinePhillipsSpycherPruessTest::TestData{ __VA_ARGS__ } +INSTANTIATE_TEST_SUITE_P( + MultiFluidCO2Brine, MultiFluidCO2BrineBrinePhillipsSpycherPruessTest, + ::testing::Values( + //| pressure | temp | composition | density | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | + D( 5.00100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 5.77217e+03, {3.00488e-01, 6.99512e-01}, {1.87668e+03, 5.32842e+04}, {8.25738e+01, 9.70985e+02}, {1.90427e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 5.76239e+03, {3.00580e-01, 6.99420e-01}, {1.87383e+03, 5.32686e+04}, {8.24487e+01, 9.70677e+02}, {1.90569e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 5.00100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 5.74154e+03, {3.00781e-01, 6.99219e-01}, {1.86780e+03, 5.32348e+04}, {8.21833e+01, 9.70013e+02}, {1.90872e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 9.05928e+03, {2.96731e-01, 7.03269e-01}, {3.05367e+03, 5.32295e+04}, {1.34361e+02, 9.74440e+02}, {2.00622e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 9.04143e+03, {2.96804e-01, 7.03196e-01}, {3.04766e+03, 5.32141e+04}, {1.34097e+02, 9.74130e+02}, {2.00722e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 7.50100e+06, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 9.00358e+03, {2.96962e-01, 7.03038e-01}, {3.03496e+03, 5.31808e+04}, {1.33538e+02, 9.73465e+02}, {2.00938e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.67650e+02, {3.00000e-01, 7.00000e-01}, 1.56195e+04, {2.93050e-01, 7.06950e-01}, {5.77607e+03, 5.32048e+04}, {2.54147e+02, 9.79798e+02}, {2.39022e-05, 3.03214e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68000e+02, {3.00000e-01, 7.00000e-01}, 1.55771e+04, {2.93105e-01, 7.06895e-01}, {5.75768e+03, 5.31894e+04}, {2.53338e+02, 9.79492e+02}, {2.38854e-05, 3.02064e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ), + D( 1.20100e+07, 3.68750e+02, {3.00000e-01, 7.00000e-01}, 1.54878e+04, {2.93225e-01, 7.06775e-01}, {5.71917e+03, 5.31561e+04}, {2.51643e+02, 9.78834e+02}, {2.38514e-05, 2.99598e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00} ) + ) +); +#undef D + +/* UNCRUSTIFY-ON */ + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + + geos::GeosxState state( geos::basicSetup( argc, argv ) ); + + int const result = RUN_ALL_TESTS(); + + geos::basicCleanup(); + + return result; +} diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp new file mode 100644 index 00000000000..45a7651f812 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp @@ -0,0 +1,198 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file testMultiFluidCompositionalMultiphasePVTPackage.cpp + */ + +#include "MultiFluidTest.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mainInterface/initialization.hpp" + +using namespace geos; +using namespace geos::testing; +using namespace geos::constitutive; + +namespace geos +{ +namespace testing +{ + +template< > +struct UsePVTPackage< CompositionalMultiphaseFluidPVTPackage > +{ + static constexpr bool value = true; +}; + +} // namespace testing + +} // namespace geos + +enum class EOS_TYPE : int { PR, SRK }; +ENUM_STRINGS( EOS_TYPE, "PR", "SRK" ); + +template< integer NUM_COMP > +struct Fluid +{}; + +template< EOS_TYPE EOS, integer NUM_COMP > +class MultiFluidCompositionalMultiphasePVTPackageTest : public MultiFluidTest< CompositionalMultiphaseFluidPVTPackage, 2, NUM_COMP > +{ +public: + using Base = MultiFluidTest< CompositionalMultiphaseFluidPVTPackage, 2, NUM_COMP >; + static constexpr real64 relTol = 1.0e-4; +public: + MultiFluidCompositionalMultiphasePVTPackageTest() + { + auto & parent = this->m_parent; + parent.resize( 1 ); + + string fluidName = GEOS_FMT( "fluid{}{}", EnumStrings< EOS_TYPE >::toString( EOS ), NUM_COMP ); + this->m_model = makeFluid( fluidName, &parent ); + + parent.initialize(); + parent.initializePostInitialConditions(); + } + + ~MultiFluidCompositionalMultiphasePVTPackageTest() override = default; + + void testNumericatDerivatives( const bool useMass ) + { + auto & fluid = this->getFluid(); + fluid.setMassFlag( useMass ); + + auto * parent = &(this->getParent()); + + array2d< real64 > samples; + Fluid< Base::numComp >::getSamples( samples ); + integer const sampleCount = samples.size( 0 ); + + real64 constexpr eps = 1.0e-7; + + constexpr real64 pressures[] = { 1.0e5, 50.0e5, 100.0e5, 600.0e5 }; + constexpr real64 temperatures[] = { 15.5, 24.0, 40.0, 80.0 }; + + for( integer sampleIndex = 0; sampleIndex < sampleCount; ++sampleIndex ) + { + for( real64 const pressure : pressures ) + { + for( real64 const temperature : temperatures ) + { + typename Base::TestData data ( pressure, units::convertCToK( temperature ), samples[sampleIndex].toSliceConst() ); + Base::testNumericalDerivatives( fluid, parent, data, eps, relTol ); + } + } + } + } + +private: + static CompositionalMultiphaseFluidPVTPackage * makeFluid( string const & name, Group * parent ); +}; + +template< integer NUM_COMP > +static void fillBinaryCoeffs( array2d< real64 > & binaryCoeff, std::array< real64 const, NUM_COMP *(NUM_COMP-1)/2 > const data ) +{ + auto bic = data.begin(); + binaryCoeff.resize( NUM_COMP, NUM_COMP ); + for( integer i = 0; i < NUM_COMP; ++i ) + { + binaryCoeff( i, i ) = 0.0; + for( integer j = i+1; j < NUM_COMP; ++j ) + { + binaryCoeff( i, j ) = *bic++; + binaryCoeff( j, i ) = binaryCoeff( i, j ); + } + } +} + +template< > +struct Fluid< 4 > +{ + static void fillProperties( Group & fluid ) + { + string_array & componentNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + fill< 4 >( componentNames, {"N2", "C10", "C20", "H20"} ); + + array1d< real64 > & molarWeight = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); + fill< 4 >( molarWeight, {28e-3, 134e-3, 275e-3, 18e-3} ); + + array1d< real64 > & criticalPressure = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentCriticalPressureString() ); + fill< 4 >( criticalPressure, {34e5, 25.3e5, 14.6e5, 220.5e5} ); + array1d< real64 > & criticalTemperature = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentCriticalTemperatureString() ); + fill< 4 >( criticalTemperature, {126.2, 622.0, 782.0, 647.0} ); + array1d< real64 > & acentricFactor = fluid.getReference< array1d< real64 > >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::componentAcentricFactorString() ); + fill< 4 >( acentricFactor, {0.04, 0.443, 0.816, 0.344} ); + } + + static void getSamples( array2d< real64 > & samples ) + { + samples.resize( 2, 4 ); + fill< 4 >( samples[0], {0.099, 0.300, 0.600, 0.001} ); + fill< 4 >( samples[1], {0.000, 0.000, 0.000, 1.000} ); + } +}; + +template< EOS_TYPE EOS, integer NUM_COMP > +CompositionalMultiphaseFluidPVTPackage * +MultiFluidCompositionalMultiphasePVTPackageTest< EOS, NUM_COMP >:: +makeFluid( string const & name, Group * parent ) +{ + CompositionalMultiphaseFluidPVTPackage & fluid = parent->registerGroup< CompositionalMultiphaseFluidPVTPackage >( name ); + + string_array & phaseNames = fluid.getReference< string_array >( string( MultiFluidBase::viewKeyStruct::phaseNamesString()) ); + fill< 2 >( phaseNames, {"oil", "gas"} ); + + string const eosName = EnumStrings< EOS_TYPE >::toString( EOS ); + string_array & equationOfState = fluid.getReference< string_array >( CompositionalMultiphaseFluidPVTPackage::viewKeyStruct::equationsOfStateString() ); + fill< 2 >( equationOfState, {eosName, eosName} ); + + Fluid< NUM_COMP >::fillProperties( fluid ); + + fluid.postProcessInputRecursive(); + return &fluid; +} + +using PengRobinson4Test = MultiFluidCompositionalMultiphasePVTPackageTest< EOS_TYPE::PR, 4 >; +using SoaveRedlichKwong4Test = MultiFluidCompositionalMultiphasePVTPackageTest< EOS_TYPE::SRK, 4 >; + +TEST_F( PengRobinson4Test, numericalDerivativesMolar ) +{ + testNumericatDerivatives( false ); +} +TEST_F( PengRobinson4Test, numericalDerivativesMass ) +{ + testNumericatDerivatives( true ); +} + +TEST_F( SoaveRedlichKwong4Test, numericalDerivativesMolar ) +{ + testNumericatDerivatives( false ); +} +TEST_F( SoaveRedlichKwong4Test, numericalDerivativesMass ) +{ + testNumericatDerivatives( true ); +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + + geos::GeosxState state( geos::basicSetup( argc, argv ) ); + + int const result = RUN_ALL_TESTS(); + + geos::basicCleanup(); + + return result; +} diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp new file mode 100644 index 00000000000..d8356ae9a81 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp @@ -0,0 +1,275 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file testMultiFluidDeadOil.cpp + */ + +#include "MultiFluidTest.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mainInterface/initialization.hpp" + +using namespace geos; +using namespace geos::testing; +using namespace geos::constitutive; + +static constexpr char const * pvdgTableContent = "# Pg(Pa) Bg(m3/sm3) Visc(Pa.s)\n" + "3000000 0.04234 0.00001344\n" + "6000000 0.02046 0.0000142\n" + "9000000 0.01328 0.00001526\n" + "12000000 0.00977 0.0000166\n" + "15000000 0.00773 0.00001818\n" + "18000000 0.006426 0.00001994\n" + "21000000 0.005541 0.00002181\n" + "24000000 0.004919 0.0000237\n" + "27000000 0.004471 0.00002559 -- this is a comment\n" + "29500000 0.004194 0.00002714\n" + "31000000 0.004031 0.00002806\n" + "33000000 0.00391 0.00002832\n" + "53000000 0.003868 0.00002935"; + +static constexpr char const * pvdoTableContent = "#P[Pa] Bo[m3/sm3] Visc(Pa.s)\n" + "10000000.0 1.23331 0.00015674\n" + "12500000.0 1.21987 0.00016570\n" + "15000000.0 1.20802 0.00017445\n" + "20000000.0 1.18791 0.00019143\n" + "25000000.0 1.17137 0.00020779\n" + "30000000.0 1.15742 0.00022361\n" + "33200000.3 1.14946 0.00023359\n" + "35000000.0 1.14543 0.00023894\n" + "40000000.0 1.13498 0.00025383 -- this is a comment\n" + "50000000.0 1.11753 0.00028237\n" + "60000000.0 1.10346 0.00030941\n" + "70000000.0 1.09180 0.00033506\n" + "80000000.0 1.08194 0.00035945\n" + "90000000.0 1.07347 0.00038266\n" + "95000000.0 1.06966 0.00039384\n" + "100000000.0 1.06610 0.00040476\n" + "110000000.0 1.05961 0.00042584\n" + "112500000.0 1.05811 0.00043096\n" + "115000000.0 1.05665 0.00043602\n" + "117500000.0 1.05523 0.00044102\n" + "120000000.0 1.05385 0.00044596\n"; + +static constexpr char const * pvdwTableContent = "# Pref[Pa] Bw[m3/sm3] Cp[1/Pa] Visc[Pa.s]\n" + " 30600000.1 1.03 0.00000000041 0.0003"; + +template< bool FROM_TABLE > +class MultiFluidDeadOilTest : public MultiFluidTest< DeadOilFluid, 3, 3 > +{ +public: + static constexpr real64 relTol = 1.0e-4; + static constexpr real64 absTol = 1.0e-4; +public: + MultiFluidDeadOilTest() + { + if constexpr (!FROM_TABLE) + { + writeTableToFile( "pvdo.txt", pvdoTableContent ); + writeTableToFile( "pvdg.txt", pvdgTableContent ); + writeTableToFile( "pvdw.txt", pvdwTableContent ); + } + + m_parent.resize( 1 ); + string const fluidName = GEOS_FMT( "fluid{}", (FROM_TABLE ? "Tables" : "Files")); + m_model = makeDeadOilFluid( fluidName, &m_parent ); + + m_parent.initialize(); + m_parent.initializePostInitialConditions(); + } + + ~MultiFluidDeadOilTest() override + { + if constexpr (!FROM_TABLE) + { + removeFile( "pvdo.txt" ); + removeFile( "pvdg.txt" ); + removeFile( "pvdw.txt" ); + } + } + +private: + static DeadOilFluid * makeDeadOilFluid( string const & name, Group * parent ); + static void fillPhysicalProperties( DeadOilFluid & fluid ); +}; + +template< bool FROM_TABLE > +void MultiFluidDeadOilTest< FROM_TABLE >::fillPhysicalProperties( DeadOilFluid & fluid ) +{ + string_array & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); + fill< 3 >( phaseNames, {"oil", "water", "gas"} ); + + string_array & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + fill< 3 >( compNames, {"oil", "water", "gas"} ); + + array1d< real64 > & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); + fill< 3 >( molarWgt, {114e-3, 18e-3, 16e-3} ); + + array1d< real64 > & surfaceDens = fluid.getReference< array1d< real64 > >( BlackOilFluidBase::viewKeyStruct::surfacePhaseMassDensitiesString() ); + fill< 3 >( surfaceDens, {800.0, 1022.0, 0.9907} ); +} + +template<> +DeadOilFluid * MultiFluidDeadOilTest< false >::makeDeadOilFluid( string const & name, Group * parent ) +{ + DeadOilFluid & fluid = parent->registerGroup< DeadOilFluid >( name ); + + fillPhysicalProperties( fluid ); + + path_array & tableNames = fluid.getReference< path_array >( BlackOilFluidBase::viewKeyStruct::tableFilesString() ); + fill< 3 >( tableNames, {"pvdo.txt", "pvdw.txt", "pvdg.txt"} ); + + fluid.postProcessInputRecursive(); + return &fluid; +} + +template<> +DeadOilFluid * MultiFluidDeadOilTest< true >::makeDeadOilFluid( string const & name, Group * parent ) +{ + // 1) First, define the tables (PVDO, PVDG) + + // 1D table with linear interpolation + integer constexpr NaxisPVDO = 21; + integer constexpr NaxisPVDG = 13; + + array1d< real64_array > coordinatesPVDO( 1 ); + real64_array valuesPVDO_Bo; + real64_array valuesPVDO_visc; + fill< NaxisPVDO >( coordinatesPVDO[0], { + 1.000e+07, 1.250e+07, 1.500e+07, 2.000e+07, 2.500e+07, 3.000e+07, 3.320e+07, 3.500e+07, + 4.000e+07, 5.000e+07, 6.000e+07, 7.000e+07, 8.000e+07, 9.000e+07, 9.500e+07, 1.000e+08, + 1.100e+08, 1.125e+08, 1.150e+08, 1.175e+08, 1.200e+08 } ); + fill< NaxisPVDO >( valuesPVDO_Bo, { + 1.23331, 1.21987, 1.20802, 1.18791, 1.17137, 1.15742, 1.14946, 1.14543, + 1.13498, 1.11753, 1.10346, 1.09180, 1.08194, 1.07347, 1.06966, 1.06610, + 1.05961, 1.05811, 1.05665, 1.05523, 1.05385 } ); + fill< NaxisPVDO >( valuesPVDO_visc, { + 1.56740e-04, 1.65700e-04, 1.74450e-04, 1.91430e-04, 2.07790e-04, 2.23610e-04, 2.33590e-04, 2.38940e-04, + 2.53830e-04, 2.82370e-04, 3.09410e-04, 3.35060e-04, 3.59450e-04, 3.82660e-04, 3.93840e-04, 4.04760e-04, + 4.25840e-04, 4.30960e-04, 4.36020e-04, 4.41020e-04, 4.45960e-04 } ); + + array1d< real64_array > coordinatesPVDG( 1 ); + real64_array valuesPVDG_Bg; + real64_array valuesPVDG_visc; + fill< NaxisPVDG >( coordinatesPVDG[0], { + 3.000e+06, 6.000e+06, 9.000e+06, 1.200e+07, 1.500e+07, 1.800e+07, 2.100e+07, 2.400e+07, + 2.700e+07, 2.950e+07, 3.100e+07, 3.300e+07, 5.300e+07 } ); + fill< NaxisPVDG >( valuesPVDG_Bg, { + 4.23400e-02, 2.04600e-02, 1.32800e-02, 9.77000e-03, 7.73000e-03, 6.42600e-03, 5.54100e-03, 4.91900e-03, + 4.47100e-03, 4.19400e-03, 4.03100e-03, 3.91000e-03, 3.86800e-03 } ); + fill< NaxisPVDG >( valuesPVDG_visc, { + 1.34400e-05, 1.42000e-05, 1.52600e-05, 1.66000e-05, 1.81800e-05, 1.99400e-05, 2.18100e-05, 2.37000e-05, + 2.55900e-05, 2.71400e-05, 2.80600e-05, 2.83200e-05, 2.93500e-05 } ); + + initializeTable( "PVDO_Bo", coordinatesPVDO, valuesPVDO_Bo ); + initializeTable( "PVDO_visc", coordinatesPVDO, valuesPVDO_visc ); + initializeTable( "PVDG_Bg", coordinatesPVDG, valuesPVDG_Bg ); + initializeTable( "PVDG_visc", coordinatesPVDG, valuesPVDG_visc ); + + // 2) Then, define the Dead-Oil constitutive model + + DeadOilFluid & fluid = parent->registerGroup< DeadOilFluid >( name ); + + fillPhysicalProperties( fluid ); + + string_array & FVFTableNames = fluid.getReference< string_array >( DeadOilFluid::viewKeyStruct::formationVolumeFactorTableNamesString() ); + fill< 2 >( FVFTableNames, {"PVDG_Bg", "PVDO_Bo"} ); + + string_array & viscosityTableNames = fluid.getReference< string_array >( DeadOilFluid::viewKeyStruct::viscosityTableNamesString() ); + fill< 2 >( viscosityTableNames, {"PVDG_visc", "PVDO_visc"} ); + + real64 & waterRefPressure = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterRefPressureString() ); + waterRefPressure = 30600000.1; + real64 & waterFormationVolumeFactor = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterFormationVolumeFactorString() ); + waterFormationVolumeFactor = 1.03; + real64 & waterCompressibility = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterCompressibilityString() ); + waterCompressibility = 0.00000000041; + real64 & waterViscosity = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterViscosityString() ); + waterViscosity = 0.0003; + + fluid.postProcessInputRecursive(); + return &fluid; +} + +using MultiFluidDeadOilTestFromFiles = MultiFluidDeadOilTest< false >; +using MultiFluidDeadOilTestFromTables = MultiFluidDeadOilTest< true >; + +TEST_F( MultiFluidDeadOilTestFromFiles, numericalDerivativesMolar ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( false ); + + real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + TestData data ( pressure, 297.15, { 0.1, 0.3, 0.6 } ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } +} + +TEST_F( MultiFluidDeadOilTestFromFiles, numericalDerivativesMass ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( true ); + + real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + TestData data ( pressure, 297.15, { 0.1, 0.3, 0.6 } ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } +} + +TEST_F( MultiFluidDeadOilTestFromTables, numericalDerivativesMolar ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( false ); + + real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + TestData data ( pressure, 297.15, { 0.1, 0.3, 0.6 } ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } +} + +TEST_F( MultiFluidDeadOilTestFromTables, numericalDerivativesMass ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( true ); + + real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + TestData data ( pressure, 297.15, { 0.1, 0.3, 0.6 } ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + + geos::GeosxState state( geos::basicSetup( argc, argv ) ); + + int const result = RUN_ALL_TESTS(); + + geos::basicCleanup(); + + return result; +} diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp new file mode 100644 index 00000000000..4ea16870680 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp @@ -0,0 +1,168 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file testMultiFluidLiveOil.cpp + */ + +#include "MultiFluidTest.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mainInterface/initialization.hpp" + +using namespace geos; +using namespace geos::testing; +using namespace geos::constitutive; + +static constexpr char const * pvdgTableContent = "# Pg(Pa) Bg(m3/sm3) Visc(Pa.s)\n" + "3000000 0.04234 0.00001344\n" + "6000000 0.02046 0.0000142\n" + "9000000 0.01328 0.00001526\n" + "12000000 0.00977 0.0000166\n" + "15000000 0.00773 0.00001818\n" + "18000000 0.006426 0.00001994\n" + "21000000 0.005541 0.00002181\n" + "24000000 0.004919 0.0000237\n" + "27000000 0.004471 0.00002559 -- this is a comment\n" + "29500000 0.004194 0.00002714\n" + "31000000 0.004031 0.00002806\n" + "33000000 0.00391 0.00002832\n" + "53000000 0.003868 0.00002935"; + +static const char * pvtoTableContent = "# Rs[sm3/sm3]\tPbub[Pa]\tBo[m3/sm3]\tVisc(Pa.s)\n" + "\n" + " 2\t 2000000\t 1.02\t 0.000975\n" + " 5\t 5000000\t 1.03\t 0.00091\n" + " 10\t 10000000\t1.04\t 0.00083\n" + " 15\t 20000000\t1.05\t 0.000695\n" + " 90000000\t1.03\t 0.000985 -- some line comment\n" + " 30\t 30000000\t1.07\t 0.000594\n" + " 40\t 40000000\t1.08\t 0.00051\n" + " 50000000\t1.07\t 0.000549 -- another one\n" + " 90000000\t1.06\t 0.00074\n" + " 50\t 50000000.7\t1.09\t 0.000449\n" + " 90000000.7\t1.08\t 0.000605"; + +static const char * pvtwTableContent = "#\tPref[Pa]\tBw[m3/sm3]\tCp[1/Pa]\t Visc[Pa.s]\n" + "\t30600000.1\t1.03\t\t0.00000000041\t0.0003"; + +class MultiFluidLiveOilTest : public MultiFluidTest< BlackOilFluid, 3, 3 > +{ +public: + static constexpr real64 relTol = 1.0e-4; + static constexpr real64 absTol = 1.0e-4; +public: + MultiFluidLiveOilTest() + { + writeTableToFile( pvtoFileName, pvtoTableContent ); + writeTableToFile( pvdgFileName, pvdgTableContent ); + writeTableToFile( pvtwFileName, pvtwTableContent ); + + m_parent.resize( 1 ); + m_model = makeLiveOilFluid( "fluid", &m_parent ); + + m_parent.initialize(); + m_parent.initializePostInitialConditions(); + } + + ~MultiFluidLiveOilTest() override + { + removeFile( pvtoFileName ); + removeFile( pvdgFileName ); + removeFile( pvtwFileName ); + } + +private: + static BlackOilFluid * makeLiveOilFluid( string const & name, Group * parent ); + static constexpr const char * pvtoFileName = "pvto.txt"; + static constexpr const char * pvdgFileName = "pvdg.txt"; + static constexpr const char * pvtwFileName = "pvtw.txt"; +}; + +BlackOilFluid * MultiFluidLiveOilTest::makeLiveOilFluid( string const & name, Group * parent ) +{ + BlackOilFluid & fluid = parent->registerGroup< BlackOilFluid >( name ); + + string_array & phaseNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); + fill< 3 >( phaseNames, {"oil", "gas", "water"} ); + + string_array & compNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + fill< 3 >( compNames, {"oil", "gas", "water"} ); + + array1d< real64 > & molarWgt = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); + fill< 3 >( molarWgt, {114e-3, 16e-3, 18e-3} ); + + array1d< real64 > & surfaceDens = fluid.getReference< array1d< real64 > >( BlackOilFluidBase::viewKeyStruct::surfacePhaseMassDensitiesString() ); + fill< 3 >( surfaceDens, {800.0, 0.9907, 1022.0} ); + + path_array & tableNames = fluid.getReference< path_array >( BlackOilFluidBase::viewKeyStruct::tableFilesString() ); + fill< 3 >( tableNames, {pvtoFileName, pvdgFileName, pvtwFileName} ); + + fluid.postProcessInputRecursive(); + return &fluid; +} + +TEST_F( MultiFluidLiveOilTest, numericalDerivativesMolar ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( false ); + + real64 constexpr eps = 1.0e-6; + + array2d< real64 > samples( 2, 3 ); + fill< 3 >( samples[0], { 0.10000, 0.3, 0.60000 } ); + fill< 3 >( samples[1], { 0.79999, 0.2, 0.00001 } ); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + for( integer sampleIndex = 0; sampleIndex < samples.size( 0 ); sampleIndex++ ) + { + TestData data ( pressure, 297.15, samples[sampleIndex] ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } + } +} + +TEST_F( MultiFluidLiveOilTest, numericalDerivativesMass ) +{ + auto & fluid = getFluid(); + fluid.setMassFlag( true ); + + real64 constexpr eps = 1.0e-6; + + array2d< real64 > samples( 2, 3 ); + fill< 3 >( samples[0], { 0.10000, 0.3, 0.60000 } ); + fill< 3 >( samples[1], { 0.79999, 0.2, 0.00001 } ); + + for( real64 const pressure : { 1.24e7, 3.21e7, 5.01e7 } ) + { + for( integer sampleIndex = 0; sampleIndex < samples.size( 0 ); sampleIndex++ ) + { + TestData data ( pressure, 297.15, samples[sampleIndex] ); + testNumericalDerivatives( fluid, &getParent(), data, eps, relTol, absTol ); + } + } +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + + geos::GeosxState state( geos::basicSetup( argc, argv ) ); + + int const result = RUN_ALL_TESTS(); + + geos::basicCleanup(); + + return result; +} diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp index 5b336a0481a..07447f822cd 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp @@ -24,6 +24,7 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "testFlowUtils.hpp" namespace geos { @@ -34,136 +35,6 @@ namespace testing using namespace geos::constitutive; using namespace geos::constitutive::multifluid; -void checkDerivative( real64 const valueEps, - real64 const value, - real64 const deriv, - real64 const eps, - real64 const relTol, - real64 const absTol, - string const & name, - string const & var ) -{ - real64 const numDeriv = (valueEps - value) / eps; - checkRelativeError( deriv, numDeriv, relTol, absTol, "d(" + name + ")/d(" + var + ")" ); -} - -void checkDerivative( real64 const valueEps, - real64 const value, - real64 const deriv, - real64 const eps, - real64 const relTol, - string const & name, - string const & var ) -{ return checkDerivative( valueEps, value, deriv, eps, relTol, DEFAULT_ABS_TOL, name, var ); } - -template< int USD1, int USD2, int USD3 > -void checkDerivative( arraySlice1d< real64 const, USD1 > const & valueEps, - arraySlice1d< real64 const, USD2 > const & value, - arraySlice1d< real64 const, USD3 > const & deriv, - real64 const eps, - real64 const relTol, - real64 const absTol, - string const & name, - string const & var, - arrayView1d< string const > const & labels ) -{ - localIndex const size = labels.size( 0 ); - - for( localIndex i = 0; i < size; ++i ) - { - checkDerivative( valueEps[i], value[i], deriv[i], eps, relTol, absTol, - name + "[" + labels[i] + "]", var ); - } -} - -template< int DIM, int USD1, int USD2, int USD3, typename ... Args > -void checkDerivative( ArraySlice< real64 const, DIM, USD1 > const & valueEps, - ArraySlice< real64 const, DIM, USD2 > const & value, - ArraySlice< real64 const, DIM, USD3 > const & deriv, - real64 const eps, - real64 const relTol, - real64 const absTol, - string const & name, - string const & var, - arrayView1d< string const > const & labels, - Args ... label_lists ) -{ - localIndex const size = labels.size( 0 ); - - for( localIndex i = 0; i < size; ++i ) - { - checkDerivative( valueEps[i], value[i], deriv[i], eps, relTol, absTol, - name + "[" + labels[i] + "]", var, label_lists ... ); - } -} - -template< int DIM, int USD1, int USD2, int USD3, typename ... Args > -void checkDerivative( ArraySlice< real64 const, DIM, USD1 > const & valueEps, - ArraySlice< real64 const, DIM, USD2 > const & value, - ArraySlice< real64 const, DIM, USD3 > const & deriv, - real64 const eps, - real64 const relTol, - string const & name, - string const & var, - arrayView1d< string const > const & labels, - Args ... label_lists ) -{ return checkDerivative( valueEps, value, deriv, eps, relTol, DEFAULT_ABS_TOL, name, var, labels, label_lists ... ); } - -// invert compositional derivative array layout to move innermost slice on the top -// (this is needed so we can use checkDerivative() to check derivative w.r.t. for each compositional var) -template< int USD > -array1d< real64 > invertLayout( arraySlice1d< real64 const, USD > const & input, - localIndex N ) -{ - array1d< real64 > output( N ); - for( int i = 0; i < N; ++i ) - { - output[i] = input[i]; - } - - return output; -} - -template< int USD > -array2d< real64 > invertLayout( arraySlice2d< real64 const, USD > const & input, - localIndex N1, - localIndex N2 ) -{ - array2d< real64 > output( N2, N1 ); - - for( localIndex i = 0; i < N1; ++i ) - { - for( localIndex j = 0; j < N2; ++j ) - { - output( j, i ) = input( i, j ); - } - } - - return output; -} - -template< int USD > -array3d< real64 > invertLayout( arraySlice3d< real64 const, USD > const & input, - localIndex N1, - localIndex N2, - localIndex N3 ) -{ - array3d< real64 > output( N3, N1, N2 ); - - for( localIndex i = 0; i < N1; ++i ) - { - for( localIndex j = 0; j < N2; ++j ) - { - for( localIndex k = 0; k < N3; ++k ) - { - output( k, i, j ) = input( i, j, k ); - } - } - } - - return output; -} - void fillNumericalJacobian( arrayView1d< real64 const > const & residual, arrayView1d< real64 const > const & residualOrig, globalIndex const dofIndex, diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp new file mode 100644 index 00000000000..6dd42bda36d --- /dev/null +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp @@ -0,0 +1,160 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#ifndef GEOS_UNITTESTS_FLUIDFLOWTESTS_TESTFLOWUTILS_HPP +#define GEOS_UNITTESTS_FLUIDFLOWTESTS_TESTFLOWUTILS_HPP + +#include "codingUtilities/UnitTestUtilities.hpp" + +namespace geos +{ + +namespace testing +{ + +void checkDerivative( real64 const valueEps, + real64 const value, + real64 const deriv, + real64 const eps, + real64 const relTol, + real64 const absTol, + string const & name, + string const & var ) +{ + real64 const numDeriv = (valueEps - value) / eps; + checkRelativeError( deriv, numDeriv, relTol, absTol, "d(" + name + ")/d(" + var + ")" ); +} + +void checkDerivative( real64 const valueEps, + real64 const value, + real64 const deriv, + real64 const eps, + real64 const relTol, + string const & name, + string const & var ) +{ return checkDerivative( valueEps, value, deriv, eps, relTol, DEFAULT_ABS_TOL, name, var ); } + +template< int USD1, int USD2, int USD3 > +void checkDerivative( arraySlice1d< real64 const, USD1 > const & valueEps, + arraySlice1d< real64 const, USD2 > const & value, + arraySlice1d< real64 const, USD3 > const & deriv, + real64 const eps, + real64 const relTol, + real64 const absTol, + string const & name, + string const & var, + arrayView1d< string const > const & labels ) +{ + localIndex const size = labels.size( 0 ); + + for( localIndex i = 0; i < size; ++i ) + { + checkDerivative( valueEps[i], value[i], deriv[i], eps, relTol, absTol, + name + "[" + labels[i] + "]", var ); + } +} + +template< int DIM, int USD1, int USD2, int USD3, typename ... Args > +void checkDerivative( ArraySlice< real64 const, DIM, USD1 > const & valueEps, + ArraySlice< real64 const, DIM, USD2 > const & value, + ArraySlice< real64 const, DIM, USD3 > const & deriv, + real64 const eps, + real64 const relTol, + real64 const absTol, + string const & name, + string const & var, + arrayView1d< string const > const & labels, + Args ... label_lists ) +{ + localIndex const size = labels.size( 0 ); + + for( localIndex i = 0; i < size; ++i ) + { + checkDerivative( valueEps[i], value[i], deriv[i], eps, relTol, absTol, + name + "[" + labels[i] + "]", var, label_lists ... ); + } +} + +template< int DIM, int USD1, int USD2, int USD3, typename ... Args > +void checkDerivative( ArraySlice< real64 const, DIM, USD1 > const & valueEps, + ArraySlice< real64 const, DIM, USD2 > const & value, + ArraySlice< real64 const, DIM, USD3 > const & deriv, + real64 const eps, + real64 const relTol, + string const & name, + string const & var, + arrayView1d< string const > const & labels, + Args ... label_lists ) +{ return checkDerivative( valueEps, value, deriv, eps, relTol, DEFAULT_ABS_TOL, name, var, labels, label_lists ... ); } + +// invert compositional derivative array layout to move innermost slice on the top +// (this is needed so we can use checkDerivative() to check derivative w.r.t. for each compositional var) +template< int USD > +array1d< real64 > invertLayout( arraySlice1d< real64 const, USD > const & input, + localIndex N ) +{ + array1d< real64 > output( N ); + for( int i = 0; i < N; ++i ) + { + output[i] = input[i]; + } + + return output; +} + +template< int USD > +array2d< real64 > invertLayout( arraySlice2d< real64 const, USD > const & input, + localIndex N1, + localIndex N2 ) +{ + array2d< real64 > output( N2, N1 ); + + for( localIndex i = 0; i < N1; ++i ) + { + for( localIndex j = 0; j < N2; ++j ) + { + output( j, i ) = input( i, j ); + } + } + + return output; +} + +template< int USD > +array3d< real64 > invertLayout( arraySlice3d< real64 const, USD > const & input, + localIndex N1, + localIndex N2, + localIndex N3 ) +{ + array3d< real64 > output( N3, N1, N2 ); + + for( localIndex i = 0; i < N1; ++i ) + { + for( localIndex j = 0; j < N2; ++j ) + { + for( localIndex k = 0; k < N3; ++k ) + { + output( k, i, j ) = input( i, j, k ); + } + } + } + + return output; +} + +} // namespace testing + +} // namespace geos + +#endif //GEOS_UNITTESTS_FLUIDFLOWTESTS_TESTFLOWUTILS_HPP diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp index 2d9a1ee6ea1..0477b968d6a 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp @@ -24,6 +24,7 @@ #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseFVM.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "testFlowUtils.hpp" namespace geos { @@ -33,29 +34,6 @@ namespace testing using namespace geos::constitutive; -void checkDerivative( real64 const valueEps, - real64 const value, - real64 const deriv, - real64 const eps, - real64 const relTol, - real64 const absTol, - string const & name, - string const & var ) -{ - real64 const numDeriv = (valueEps - value) / eps; - checkRelativeError( deriv, numDeriv, relTol, absTol, "d(" + name + ")/d(" + var + ")" ); -} - -void checkDerivative( real64 const valueEps, - real64 const value, - real64 const deriv, - real64 const eps, - real64 const relTol, - string const & name, - string const & var ) -{ return checkDerivative( valueEps, value, deriv, eps, relTol, DEFAULT_ABS_TOL, name, var ); } - - void fillNumericalJacobian( arrayView1d< real64 const > const & residual, arrayView1d< real64 const > const & residualOrig, globalIndex const dofIndex, From ed3cbce0ecb58a497ffb1011eb3788b784ab37f8 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 11 Jun 2024 17:27:59 -0500 Subject: [PATCH 086/286] Properly sync nonlinear solver params for coupled solver (#3138) Co-authored-by: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Co-authored-by: Ryan Aronson --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 7 ++ .../NonlinearSolverParameters.cpp | 67 ++++++++++--------- .../NonlinearSolverParameters.hpp | 4 ++ .../physicsSolvers/SolverBase.cpp | 45 ++++++++++--- .../physicsSolvers/SolverBase.hpp | 4 ++ .../fluidFlow/CompositionalMultiphaseBase.cpp | 16 +++-- .../multiphysics/CoupledSolver.hpp | 29 ++++---- ...ePhasePoromechanicsConformingFractures.cpp | 2 - 9 files changed, 115 insertions(+), 61 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 0fef4368264..a326f5520e0 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3140-5514-fe26f80 + baseline: integratedTests/baseline_integratedTests-pr3138-5526-f053f0a allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index eff45f70b87..6686ac09970 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,14 +6,21 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3138 (2024-06-11) +====================== +Properly sync nonlinear solver params for coupled solver. Baseline update mostly due to number of iterations change in baseline files. + + PR #3140 (2024-06-11) ====================== Fixed derivative in EzrokhiBrineDensity + PR #3080 (2024-06-07) ===================== Rebaseline after adding viscoelastic wave propagator. + PR #3075 (2024-06-05) ===================== Introduce configuration tolerance. Rebaseline because of the new parameter in NonlinearSolverParameters. diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp index 200ffa4e9b4..f3aa75597d2 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp @@ -188,41 +188,44 @@ void NonlinearSolverParameters::postProcessInput() if( getLogLevel() > 0 ) { - GEOS_LOG_RANK_0( "Nonlinear solver parameters:" ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search action = {}", EnumStrings< LineSearchAction >::toString( m_lineSearchAction ) ) ); - if( m_lineSearchAction != LineSearchAction::None ) - { - GEOS_LOG_RANK_0( GEOS_FMT( " Line search interpolation type = {}", EnumStrings< LineSearchInterpolationType >::toString( m_lineSearchInterpType ) ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search maximum number of cuts = {}", m_lineSearchMaxCuts ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search cut factor = {}", m_lineSearchCutFactor ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search starting iteration = {}", m_lineSearchStartingIteration ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search residual increase factor = {}", m_lineSearchResidualFactor ) ); - } - GEOS_LOG_RANK_0( GEOS_FMT( " Norm type (flow solver) = {}", EnumStrings< solverBaseKernels::NormType >::toString( m_normType ) ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Minimum residual normalizer = {}", m_minNormalizer ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Convergence tolerance = {}", m_newtonTol ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum iterations = {}", m_maxIterNewton ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Minimum iterations = {}", m_minIterNewton ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum allowed residual norm = {}", m_maxAllowedResidualNorm ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Allow non-converged = {}", m_allowNonConverged ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step decrease iterations limit = {}", m_timeStepDecreaseIterLimit ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step increase iterations limit = {}", m_timeStepIncreaseIterLimit ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step decrease factor = {}", m_timeStepDecreaseFactor ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step increase factor = {}", m_timeStepDecreaseFactor ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step cut factor = {}", m_timeStepCutFactor ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum time step cuts = {}", m_maxTimeStepCuts ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum sub time steps = {}", m_maxSubSteps ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum number of configuration attempts = {}", m_maxNumConfigurationAttempts ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Coupling type = {}", EnumStrings< CouplingType >::toString( m_couplingType ) ) ); - if( m_couplingType == CouplingType::Sequential ) - { - GEOS_LOG_RANK_0( GEOS_FMT( " Sequential convergence criterion = {}", EnumStrings< SequentialConvergenceCriterion >::toString( m_sequentialConvergenceCriterion ) ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Subcycling = {}", m_subcyclingOption ) ); - } + print(); } } - +void NonlinearSolverParameters::print() const +{ + GEOS_LOG_RANK_0( "Nonlinear solver parameters:" ); + GEOS_LOG_RANK_0( GEOS_FMT( " Line search action = {}", EnumStrings< LineSearchAction >::toString( m_lineSearchAction ) ) ); + if( m_lineSearchAction != LineSearchAction::None ) + { + GEOS_LOG_RANK_0( GEOS_FMT( " Line search interpolation type = {}", EnumStrings< LineSearchInterpolationType >::toString( m_lineSearchInterpType ) ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Line search maximum number of cuts = {}", m_lineSearchMaxCuts ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Line search cut factor = {}", m_lineSearchCutFactor ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Line search starting iteration = {}", m_lineSearchStartingIteration ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Line search residual increase factor = {}", m_lineSearchResidualFactor ) ); + } + GEOS_LOG_RANK_0( GEOS_FMT( " Norm type (flow solver) = {}", EnumStrings< solverBaseKernels::NormType >::toString( m_normType ) ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Minimum residual normalizer = {}", m_minNormalizer ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Convergence tolerance = {}", m_newtonTol ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Maximum iterations = {}", m_maxIterNewton ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Minimum iterations = {}", m_minIterNewton ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Maximum allowed residual norm = {}", m_maxAllowedResidualNorm ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Allow non-converged = {}", m_allowNonConverged ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Time step decrease iterations limit = {}", m_timeStepDecreaseIterLimit ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Time step increase iterations limit = {}", m_timeStepIncreaseIterLimit ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Time step decrease factor = {}", m_timeStepDecreaseFactor ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Time step increase factor = {}", m_timeStepDecreaseFactor ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Time step cut factor = {}", m_timeStepCutFactor ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Maximum time step cuts = {}", m_maxTimeStepCuts ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Maximum sub time steps = {}", m_maxSubSteps ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Maximum number of configuration attempts = {}", m_maxNumConfigurationAttempts ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Coupling type = {}", EnumStrings< CouplingType >::toString( m_couplingType ) ) ); + if( m_couplingType == CouplingType::Sequential ) + { + GEOS_LOG_RANK_0( GEOS_FMT( " Sequential convergence criterion = {}", EnumStrings< SequentialConvergenceCriterion >::toString( m_sequentialConvergenceCriterion ) ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " Subcycling = {}", m_subcyclingOption ) ); + } +} REGISTER_CATALOG_ENTRY( Group, NonlinearSolverParameters, string const &, Group * const ) diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp index 097122a84ed..40dcb370c09 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp @@ -84,6 +84,8 @@ class NonlinearSolverParameters : public dataRepository::Group m_maxNumConfigurationAttempts = params.m_maxNumConfigurationAttempts; m_configurationTolerance = params.m_configurationTolerance; + setLogLevel( params.getLogLevel()); + return *this; } @@ -98,6 +100,8 @@ class NonlinearSolverParameters : public dataRepository::Group virtual void postProcessInput() override; + void print() const; + struct viewKeysStruct { static constexpr char const * lineSearchActionString() { return "lineSearchAction"; } diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index b612e2ed3f9..bc1034d523f 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -271,11 +271,17 @@ bool SolverBase::execute( real64 const time_n, { // better to do two equal steps than one big and one small (even potentially tiny) if( nextDt * 2 > dtRemaining ) + { nextDt = dtRemaining / 2; + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: shortening time step to {} to cover remaining time {} in two steps", getName(), nextDt, dtRemaining )); + } } else { nextDt = dtRemaining; + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: shortening time step to {} to match remaining time", getName(), nextDt )); } } @@ -298,33 +304,45 @@ real64 SolverBase::setNextDt( real64 const & currentDt, DomainPartition & domain ) { real64 const nextDtNewton = setNextDtBasedOnNewtonIter( currentDt ); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on Newton iterations = {}", getName(), nextDtNewton )); real64 const nextDtStateChange = setNextDtBasedOnStateChange( currentDt, domain ); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on state change = {}", getName(), nextDtStateChange )); if( nextDtNewton < nextDtStateChange ) // time step size decided based on convergence { - integer const iterDecreaseLimit = m_nonlinearSolverParameters.timeStepDecreaseIterLimit(); - integer const iterIncreaseLimit = m_nonlinearSolverParameters.timeStepIncreaseIterLimit(); if( nextDtNewton > currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: solver converged in less than {} iterations, time-step required will be increased.", - getName(), iterIncreaseLimit ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be increased based on number of iterations.", + getName() ) ); } else if( nextDtNewton < currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: solver converged in more than {} iterations, time-step required will be decreased.", - getName(), iterDecreaseLimit ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be decreased based on number of iterations.", + getName() ) ); + } + else + { + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be kept the same based on number of iterations.", + getName() ) ); } } else // time step size decided based on state change { if( nextDtStateChange > currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: Time-step required will be increased based on state change.", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be increased based on state change.", getName())); } else if( nextDtStateChange < currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: Time-step required will be decreased based on state change.", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be decreased based on state change.", + getName())); + } + else + { + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be kept the same based on state change.", getName())); } } @@ -350,15 +368,21 @@ real64 SolverBase::setNextDtBasedOnNewtonIter( real64 const & currentDt ) { // Easy convergence, let's increase the time-step. nextDt = currentDt * m_nonlinearSolverParameters.timeStepIncreaseFactor(); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: number of iterations = {} is less than {}, next time step = {} (increase)", getName(), newtonIter, iterIncreaseLimit, nextDt )); } else if( newtonIter > iterDecreaseLimit ) { // Tough convergence let us make the time-step smaller! nextDt = currentDt * m_nonlinearSolverParameters.timeStepDecreaseFactor(); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: number of iterations = {} is more than {}, next time step = {} (decrease)", getName(), newtonIter, iterDecreaseLimit, nextDt )); } else { nextDt = currentDt; + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: number of iterations = {} is between {} and {}, next time step = {} (no change)", getName(), newtonIter, iterIncreaseLimit, iterDecreaseLimit, nextDt )); } return nextDt; } @@ -832,6 +856,11 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, { Timer timer( m_timers["assemble"] ); + // We sync the nonlinear convergence history. The coupled solver parameters are the one being + // used. We want to propagate the info to subsolvers. It can be important for solvers that + // have special treatment for specific iterations. + synchronizeNonlinearSolverParameters(); + // zero out matrix/rhs before assembly m_localMatrix.zero(); m_rhs.zero(); diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index 3a1610aad53..f9e07f2dc6b 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -663,6 +663,10 @@ class SolverBase : public ExecutableGroup return m_nonlinearSolverParameters; } + virtual void + synchronizeNonlinearSolverParameters() + { /* empty here, overriden in CoupledSolver */ } + /** * @brief Get position of a given region within solver's target region list * @param regionName the region name to find diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index ea290977c92..c2a19179d71 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -2115,12 +2115,20 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & real64 const nextDtPressure = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativePresChange / std::max( eps, maxRelativePresChange + m_solutionChangeScalingFactor * m_targetRelativePresChange ); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on pressure change = {}", getName(), nextDtPressure )); real64 const nextDtPhaseVolFrac = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetPhaseVolFracChange / std::max( eps, maxAbsolutePhaseVolFracChange + m_solutionChangeScalingFactor * m_targetPhaseVolFracChange ); - real64 const nextDtTemperature = m_isThermal - ? currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativeTempChange - / std::max( eps, maxRelativeTempChange + m_solutionChangeScalingFactor * m_targetRelativeTempChange ) - : LvArray::NumericLimits< real64 >::max; + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on phase volume fraction change = {}", getName(), nextDtPhaseVolFrac )); + real64 nextDtTemperature = LvArray::NumericLimits< real64 >::max; + if( m_isThermal ) + { + nextDtTemperature = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativeTempChange + / std::max( eps, maxRelativeTempChange + m_solutionChangeScalingFactor * m_targetRelativeTempChange ); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on temperature change = {}", getName(), nextDtPhaseVolFrac )); + } return std::min( std::min( nextDtPressure, nextDtPhaseVolFrac ), nextDtTemperature ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index 8c0b818f8e3..4cf0109a221 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -161,6 +161,7 @@ class CoupledSolver : public SolverBase } ); } + // general version of assembleSystem function, keep in mind many solvers will override it virtual void assembleSystem( real64 const time_n, real64 const dt, @@ -171,18 +172,13 @@ class CoupledSolver : public SolverBase { /// Fully-coupled assembly. - // 1. we sync the nonlinear convergence history. The coupled solver parameters are the one being - // used. We want to propagate the info to subsolvers. It can be important for solvers that - // have special treatment for specific iterations. - synchronizeNonLinearParameters(); - - // 2. Assemble matrix blocks of each individual solver + // 1. Assemble matrix blocks of each individual solver forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) { solver->assembleSystem( time_n, dt, domain, dofManager, localMatrix, localRhs ); } ); - // 3. Assemble coupling blocks + // 2. Assemble coupling blocks assembleCouplingTerms( time_n, dt, domain, dofManager, localMatrix, localRhs ); } @@ -469,9 +465,9 @@ class CoupledSolver : public SolverBase resetStateToBeginningOfStep( domain ); integer & iter = solverParams.m_numNewtonIterations; - iter = 0; + /// Sequential coupling loop - while( iter < solverParams.m_maxIterNewton ) + for( iter = 0; iter < solverParams.m_maxIterNewton; iter++ ) { // Increment the solver statistics for reporting purposes // Pass a "0" as argument (0 linear iteration) to skip the output of linear iteration stats at the end @@ -508,6 +504,8 @@ class CoupledSolver : public SolverBase if( isConverged ) { + // we still want to count current iteration + ++iter; // exit outer loop break; } @@ -515,8 +513,6 @@ class CoupledSolver : public SolverBase { finishSequentialIteration( iter, domain ); } - - ++iter; } if( isConverged ) @@ -679,6 +675,11 @@ class CoupledSolver : public SolverBase EnumStrings< NonlinearSolverParameters::LineSearchAction >::toString( NonlinearSolverParameters::LineSearchAction::None ) ), InputError ); + if( !isSequential ) + { + synchronizeNonlinearSolverParameters(); + } + if( m_nonlinearSolverParameters.m_nonlinearAccelerationType != NonlinearSolverParameters::NonlinearAccelerationType::None ) validateNonlinearAcceleration(); } @@ -692,12 +693,12 @@ class CoupledSolver : public SolverBase InputError ); } - void - synchronizeNonLinearParameters() + virtual void + synchronizeNonlinearSolverParameters() override { forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) { - solver->getNonlinearSolverParameters() = m_nonlinearSolverParameters; + solver->getNonlinearSolverParameters() = getNonlinearSolverParameters(); } ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 919b8991a9d..768891b2282 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -142,8 +142,6 @@ void SinglePhasePoromechanicsConformingFractures::assembleSystem( real64 const t solidMechanicsSolver()->synchronizeFractureState( domain ); - synchronizeNonLinearParameters(); - assembleElementBasedContributions( time_n, dt, domain, From d2225bdb3115dc3cab9848b905bfddb0a7a54616 Mon Sep 17 00:00:00 2001 From: Lionel Untereiner Date: Wed, 12 Jun 2024 23:45:09 +0200 Subject: [PATCH 087/286] remove RESQML support from GEOS (#2969) --- .devcontainer/devcontainer.json | 2 +- host-configs/LLNL/lassen-base.cmake | 1 - host-configs/LLNL/quartz-base.cmake | 2 -- host-configs/tpls.cmake | 4 ---- .../thirdparty/SetupGeosxThirdParty.cmake | 18 ------------------ 5 files changed, 1 insertion(+), 26 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4df342044e9..db4250aeb26 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "264-338" + "GEOS_TPL_TAG": "258-347" } }, "runArgs": [ diff --git a/host-configs/LLNL/lassen-base.cmake b/host-configs/LLNL/lassen-base.cmake index 72747c4f7d8..0aa8696dac3 100644 --- a/host-configs/LLNL/lassen-base.cmake +++ b/host-configs/LLNL/lassen-base.cmake @@ -43,7 +43,6 @@ set(ESSL_LIBRARIES /usr/tcetmp/packages/essl/essl-6.3.0.2/lib64/libesslsmpcuda.s # TPL set(ENABLE_PAPI OFF CACHE BOOL "") set(SILO_BUILD_TYPE powerpc64-unknown-linux-gnu CACHE STRING "") -set(ENABLE_FESAPI OFF CACHE BOOL "" FORCE) # GEOSX specific options set(ENABLE_PVTPackage ON CACHE BOOL "") diff --git a/host-configs/LLNL/quartz-base.cmake b/host-configs/LLNL/quartz-base.cmake index e01eb428fc4..5501677af1c 100644 --- a/host-configs/LLNL/quartz-base.cmake +++ b/host-configs/LLNL/quartz-base.cmake @@ -41,8 +41,6 @@ set(YAPF_EXECUTABLE /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/pyt set(SPHINX_EXECUTABLE /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/python/bin/sphinx-build CACHE PATH "" FORCE) -set(ENABLE_FESAPI OFF CACHE BOOL "" FORCE) - # caliper set(ENABLE_CALIPER ON CACHE BOOL "" FORCE) set(ENABLE_CALIPER_HYPRE ON CACHE BOOL "" FORCE) diff --git a/host-configs/tpls.cmake b/host-configs/tpls.cmake index e0a7b0f1146..239774a66db 100644 --- a/host-configs/tpls.cmake +++ b/host-configs/tpls.cmake @@ -56,10 +56,6 @@ if(EXISTS ${GEOSX_TPL_DIR}/fmt) set(FMT_DIR ${GEOSX_TPL_DIR}/fmt CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/fesapi) - set(FESAPI_DIR ${GEOSX_TPL_DIR}/fesapi CACHE PATH "" FORCE) -endif() - # # Math TPLs # diff --git a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake index 7706da01a5b..9fa1eab84c4 100644 --- a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake +++ b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake @@ -900,24 +900,6 @@ if(NOT ENABLE_${upper_LAI}) endif() option(GEOSX_LA_INTERFACE_${upper_LAI} "${upper_LAI} LA interface is selected" ON) -################################ -# Fesapi -################################ -# if(DEFINED FESAPI_DIR) -# message(STATUS "FESAPI_DIR = ${FESAPI_DIR}") - -# find_and_import(NAME FesapiCpp -# INCLUDE_DIRECTORIES ${FESAPI_DIR}/include -# LIBRARY_DIRECTORIES ${FESAPI_DIR}/lib -# HEADER fesapi/nsDefinitions.h -# LIBRARIES FesapiCpp -# DEPENDS hdf5) - -# set(FESAPI_DIR ON CACHE BOOL "") -# set(thirdPartyLibs ${thirdPartyLibs} FesapiCpp) -# else() - message(STATUS "Not using Fesapi") -# endif() message(STATUS "thirdPartyLibs = ${thirdPartyLibs}") From 81bfb07ba079d023180ba76e5829b505bbdc249c Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 13 Jun 2024 10:27:48 -0500 Subject: [PATCH 088/286] Some random things (#3152) Co-authored-by: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Co-authored-by: MelReyCG --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 ++ src/coreComponents/common/Units.cpp | 34 ++++++++++--- src/coreComponents/common/Units.hpp | 25 ++++++--- .../common/unitTests/testUnits.cpp | 22 +++++++- src/coreComponents/events/EventManager.cpp | 51 +++++++++++++------ .../fluidFlow/CompositionalMultiphaseBase.cpp | 13 ++++- .../fluidFlow/CompositionalMultiphaseBase.hpp | 1 + .../fluidFlow/CompositionalMultiphaseFVM.cpp | 12 ++--- .../fluidFlow/SinglePhaseBase.cpp | 2 +- .../PoromechanicsInitialization.cpp | 3 +- .../docs/CompositionalMultiphaseFVM.rst | 1 + .../docs/CompositionalMultiphaseHybridFVM.rst | 1 + src/coreComponents/schema/docs/Events.rst | 24 ++++----- src/coreComponents/schema/schema.xsd | 8 ++- 15 files changed, 148 insertions(+), 56 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index a326f5520e0..b26a7d326f6 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3138-5526-f053f0a + baseline: integratedTests/baseline_integratedTests-pr3152-5558-5c6e97f allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 6686ac09970..1d66ebd85ee 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3152 (2024-06-13) +====================== +Some random things. Baseline update because of the new parameter (minScalingFactor). + + PR #3138 (2024-06-11) ====================== Properly sync nonlinear solver params for coupled solver. Baseline update mostly due to number of iterations change in baseline files. diff --git a/src/coreComponents/common/Units.cpp b/src/coreComponents/common/Units.cpp index ae2b5541a22..94a3e055099 100644 --- a/src/coreComponents/common/Units.cpp +++ b/src/coreComponents/common/Units.cpp @@ -35,8 +35,16 @@ TimeFormatInfo::TimeFormatInfo( double const totalSeconds, int const years, int {} string TimeFormatInfo::toString() const +{ + return GEOS_FMT( "{} ({})", toUnfoldedString(), toSecondsString() ); +} +string TimeFormatInfo::toUnfoldedString() const { std::ostringstream oss; + if( m_totalSeconds < 0.0 ) + { + oss << "-("; + } if( m_years != 0 ) { oss << m_years << "y, " << m_days << "d, "; @@ -45,10 +53,17 @@ string TimeFormatInfo::toString() const { oss << m_days << "d, "; } - oss << GEOS_FMT( "{:0>2}h{:0>2}m{:0>2}s ({} s)", - m_hours, m_minutes, m_seconds, m_totalSeconds ); + oss << GEOS_FMT( "{:0>2}h{:0>2}m{:0>2}s", m_hours, m_minutes, m_seconds ); + if( m_totalSeconds < 0.0 ) + { + oss << ")"; + } return oss.str(); } +string TimeFormatInfo::toSecondsString() const +{ + return GEOS_FMT( "{} s", m_totalSeconds ); +} std::ostream & operator<<( std::ostream & os, TimeFormatInfo const & info ) { @@ -77,11 +92,16 @@ template TimeFormatInfo TimeFormatInfo::fromDuration< SystemClock::duration >( S TimeFormatInfo TimeFormatInfo::fromSeconds( double const seconds ) { - int totalYears = int( seconds / YearSeconds ); - int daysOut = int( ( seconds - totalYears * YearSeconds ) / DaySeconds ); - int hoursOut = int( ( seconds - totalYears * YearSeconds - daysOut * DaySeconds ) / HourSeconds ); - int minutesOut = int( ( seconds - totalYears * YearSeconds - daysOut * DaySeconds - hoursOut * HourSeconds ) / MinuteSeconds ); - int secondsOut = int( seconds - totalYears * YearSeconds - daysOut * DaySeconds - hoursOut * HourSeconds - minutesOut * MinuteSeconds ); + double remainingSeconds = seconds < 0.0 ? -seconds : seconds; + int const totalYears = int( remainingSeconds / YearSeconds ); + remainingSeconds -= totalYears * YearSeconds; + int const daysOut = int( remainingSeconds / DaySeconds ); + remainingSeconds -= daysOut * DaySeconds; + int const hoursOut = int( remainingSeconds / HourSeconds ); + remainingSeconds -= hoursOut * HourSeconds; + int const minutesOut = int( remainingSeconds / MinuteSeconds ); + remainingSeconds -= minutesOut * MinuteSeconds; + int const secondsOut = int( remainingSeconds ); return TimeFormatInfo( seconds, totalYears, daysOut, hoursOut, minutesOut, secondsOut ); } diff --git a/src/coreComponents/common/Units.hpp b/src/coreComponents/common/Units.hpp index 43e8fc680e3..d760217fbb8 100644 --- a/src/coreComponents/common/Units.hpp +++ b/src/coreComponents/common/Units.hpp @@ -175,18 +175,17 @@ static constexpr double YearSeconds = YearDays * DaySeconds; struct TimeFormatInfo { /// Total time (including the decimal part) this instance represents in seconds - double m_totalSeconds = 0.0; + double const m_totalSeconds = 0.0; /// Number of integral years to show - int m_years = 0; + int const m_years = 0; /// Number of integral days to show - int m_days = 0; + int const m_days = 0; /// Number of integral hours to show - int m_hours = 0; + int const m_hours = 0; /// Number of integral minutes to show - int m_minutes = 0; + int const m_minutes = 0; /// Number of integral seconds to show - int m_seconds = 0; - + int const m_seconds = 0; /** * @brief Construct a TimeFormatInfo from raw data (which must be coherent) @@ -216,9 +215,19 @@ struct TimeFormatInfo friend std::ostream & operator<<( std::ostream & os, TimeFormatInfo const & ctx ); /** - * @return a user friendly string representation of this structure. + * @return a comprehensive string representation of this structure. */ string toString() const; + + /** + * @return a user friendly string representation of this structure (YDHMS format, without subsecond details). + */ + string toUnfoldedString() const; + + /** + * @return a precise string representation of this structure (decimal seconds). + */ + string toSecondsString() const; }; diff --git a/src/coreComponents/common/unitTests/testUnits.cpp b/src/coreComponents/common/unitTests/testUnits.cpp index 2ab6ef2cbc3..57a8ad0588d 100644 --- a/src/coreComponents/common/unitTests/testUnits.cpp +++ b/src/coreComponents/common/unitTests/testUnits.cpp @@ -112,6 +112,26 @@ TEST( Units, SystemDurationFormatTest ) "5500y, 20d, 12h02m25s (173565007345 s)", Years( 5500 ) + Days( 20 ) + hours( 12 ) + seconds( 145 ) ), + DurationCase( + "-(00h00m00s) (-1.11e-07 s)", + -nanoseconds( 111 ) ), + + DurationCase( + "-(00h00m01s) (-1 s)", + -seconds( 1 ) ), + + DurationCase( + "-(00h02m25s) (-145.016 s)", + -seconds( 145 ) - milliseconds( 16 ) ), + + DurationCase( + "-(22h25m45s) (-80745.016 s)", + -hours( 20 ) - minutes( 145 ) - seconds( 45 ) - milliseconds( 16 ) ), + + DurationCase( + "-(5500y, 20d, 12h02m25s) (-173565007345 s)", + -Years( 5500 ) - Days( 20 ) - hours( 12 ) - seconds( 145 ) ), + }; const SystemClock::duration maxDuration = SystemClock::duration::max(); @@ -127,7 +147,7 @@ TEST( Units, SystemDurationFormatTest ) EXPECT_STREQ( durationCase.m_expectedString.c_str(), TimeFormatInfo::fromSeconds( durationCase.m_simDuration ).toString().c_str() ) << errorInfo; - if( durationCase.m_simDuration <= maxSystemTime ) + if( 0.0 < durationCase.m_simDuration && durationCase.m_simDuration <= maxSystemTime ) { EXPECT_STREQ( durationCase.m_expectedString.c_str(), TimeFormatInfo::fromDuration( durationCase.m_systemDuration ).toString().c_str() ) << errorInfo; diff --git a/src/coreComponents/events/EventManager.cpp b/src/coreComponents/events/EventManager.cpp index 3ebb6c2af44..33f02a151c5 100644 --- a/src/coreComponents/events/EventManager.cpp +++ b/src/coreComponents/events/EventManager.cpp @@ -53,14 +53,14 @@ EventManager::EventManager( string const & name, setDescription( "Start simulation time for the global event loop." ); registerWrapper( viewKeyStruct::maxTimeString(), &m_maxTime ). - setApplyDefaultValue( std::numeric_limits< real64 >::max()). + setApplyDefaultValue( std::numeric_limits< real64 >::max() ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Maximum simulation time for the global event loop." ); + setDescription( "Maximum simulation time for the global event loop. Disabled by default." ); registerWrapper( viewKeyStruct::maxCycleString(), &m_maxCycle ). - setApplyDefaultValue( std::numeric_limits< integer >::max()). + setApplyDefaultValue( std::numeric_limits< integer >::max() ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Maximum simulation cycle for the global event loop." ); + setDescription( "Maximum simulation cycle for the global event loop. Disabled by default." ); registerWrapper( viewKeyStruct::timeString(), &m_time ). setRestartFlags( RestartFlags::WRITE_AND_READ ). @@ -226,24 +226,43 @@ bool EventManager::run( DomainPartition & domain ) void EventManager::outputTime() const { + const bool isTimeLimited = m_maxTime < std::numeric_limits< real64 >::max(); + const bool isCycleLimited = m_maxCycle < std::numeric_limits< integer >::max(); + units::TimeFormatInfo const timeInfo = units::TimeFormatInfo::fromSeconds( m_time ); + units::TimeFormatInfo const maxTimeInfo = units::TimeFormatInfo::fromSeconds( m_maxTime ); + + const auto timeCompletionUnfoldedString = [&]() -> std::string { + return GEOS_FMT( " out of {} ({:.0f}% completed)", + maxTimeInfo.toUnfoldedString(), + 100.0 * (m_time - m_minTime) / ( m_maxTime - m_minTime ) ); + }; + const auto timeCompletionSecondsString = [&]() -> std::string { + return GEOS_FMT( " / {}", maxTimeInfo.toSecondsString() ); + }; + const auto cycleCompletionString = [&]() -> std::string { + return GEOS_FMT( " out of {} ({:.0f}% completed)", + m_maxCycle, ( 100.0 * m_cycle ) / m_maxCycle ); + }; + // The formating here is a work in progress. - GEOS_LOG_RANK_0( GEOS_FMT( "\n" - "------------------- TIMESTEP START -------------------\n" - " - Time: {}\n" - " - Delta Time: {}\n" - " - Cycle: {}\n" - "------------------------------------------------------\n\n", - units::TimeFormatInfo::fromSeconds( m_time ), - units::TimeFormatInfo::fromSeconds( m_dt ), - m_cycle )); + GEOS_LOG_RANK_0( "\n------------------------- TIMESTEP START -------------------------" ); + GEOS_LOG_RANK_0( GEOS_FMT( " - Time: {}{}", + timeInfo.toUnfoldedString(), + isTimeLimited ? timeCompletionUnfoldedString() : "" ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " ({}{})", + timeInfo.toSecondsString(), + isTimeLimited ? timeCompletionSecondsString() : "" ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " - Delta Time: {}", units::TimeFormatInfo::fromSeconds( m_dt ) ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " - Cycle: {}{}", + m_cycle, + isCycleLimited ? cycleCompletionString() : "" ) ); + GEOS_LOG_RANK_0( "--------------------------------------------------------------------\n" ); // We are keeping the old outputs to keep compatibility with current log reading scripts. if( m_timeOutputFormat==TimeOutputFormat::full ) { - units::TimeFormatInfo info = units::TimeFormatInfo::fromSeconds( m_time ); - GEOS_LOG_RANK_0( GEOS_FMT( "Time: {} years, {} days, {} hrs, {} min, {} s, dt: {} s, Cycle: {}\n", - info.m_years, info.m_days, info.m_hours, info.m_minutes, info.m_seconds, m_dt, m_cycle ) ); + timeInfo.m_years, timeInfo.m_days, timeInfo.m_hours, timeInfo.m_minutes, timeInfo.m_seconds, m_dt, m_cycle ) ); } else if( m_timeOutputFormat==TimeOutputFormat::years ) { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index c2a19179d71..6129754a029 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -150,6 +150,12 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( 1.0 ). setDescription( "Maximum (absolute) component density change in a sequential iteration, used for outer loop convergence check" ); + + this->registerWrapper( viewKeyStruct::minScalingFactorString(), &m_minScalingFactor ). + setSizedFromParent( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 0.01 ). + setDescription( "Minimum value for solution scaling factor" ); } void CompositionalMultiphaseBase::postProcessInput() @@ -177,13 +183,18 @@ void CompositionalMultiphaseBase::postProcessInput() GEOS_ERROR_IF_LE_MSG( m_targetPhaseVolFracChange, 0.0, getWrapperDataContext( viewKeyStruct::targetPhaseVolFracChangeString() ) << ": The target change in phase volume fraction in a time step must be larger than to 0.0" ); - GEOS_ERROR_IF_LT_MSG( m_solutionChangeScalingFactor, 0.0, getWrapperDataContext( viewKeyStruct::solutionChangeScalingFactorString() ) << ": The solution change scaling factor must be larger or equal to 0.0" ); GEOS_ERROR_IF_GT_MSG( m_solutionChangeScalingFactor, 1.0, getWrapperDataContext( viewKeyStruct::solutionChangeScalingFactorString() ) << ": The solution change scaling factor must be smaller or equal to 1.0" ); + GEOS_ERROR_IF_LE_MSG( m_minScalingFactor, 0.0, + getWrapperDataContext( viewKeyStruct::minScalingFactorString() ) << + ": The minumum scaling factor must be larger than 0.0" ); + GEOS_ERROR_IF_GT_MSG( m_minScalingFactor, 1.0, + getWrapperDataContext( viewKeyStruct::minScalingFactorString() ) << + ": The minumum scaling factor must be smaller or equal to 1.0" ); if( m_isThermal && m_useSimpleAccumulation == 1 ) // useSimpleAccumulation is not yet compatible with thermal { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index c80e8aa606e..870213176a7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -261,6 +261,7 @@ class CompositionalMultiphaseBase : public FlowSolverBase static constexpr char const * useSimpleAccumulationString() { return "useSimpleAccumulation"; } static constexpr char const * minCompDensString() { return "minCompDens"; } static constexpr char const * maxSequentialCompDensChangeString() { return "maxSequentialCompDensChange"; } + static constexpr char const * minScalingFactorString() { return "minScalingFactor"; } }; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 9794bed5cee..5b698da8b2d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -523,26 +523,26 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d minCompDensScalingFactor = MpiWrapper::min( minCompDensScalingFactor ); string const massUnit = m_useMass ? "kg/m3" : "mol/m3"; - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change: {} Pa (before scaling)", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change = {} Pa (before scaling)", getName(), GEOS_FMT( "{:.{}f}", maxDeltaPres, 3 ) ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max component density change: {} {} (before scaling)", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max component density change = {} {} (before scaling)", getName(), GEOS_FMT( "{:.{}f}", maxDeltaCompDens, 3 ), massUnit ) ); if( m_isThermal ) { maxDeltaTemp = MpiWrapper::max( maxDeltaTemp ); minTempScalingFactor = MpiWrapper::min( minTempScalingFactor ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max temperature change: {} K (before scaling)", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max temperature change = {} K (before scaling)", getName(), GEOS_FMT( "{:.{}f}", maxDeltaTemp, 3 ) ) ); } if( m_scalingType == ScalingType::Local ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min pressure scaling factor: {}", getName(), minPresScalingFactor ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min component density scaling factor: {}", getName(), minCompDensScalingFactor ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min pressure scaling factor = {}", getName(), minPresScalingFactor ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min component density scaling factor = {}", getName(), minCompDensScalingFactor ) ); if( m_isThermal ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min temperature scaling factor: {}", getName(), minTempScalingFactor ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min temperature scaling factor = {}", getName(), minTempScalingFactor ) ); } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 92918f5a010..46066692beb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -1342,7 +1342,7 @@ real64 SinglePhaseBase::scalingForSystemSolution( DomainPartition & domain, scalingFactor = MpiWrapper::min( scalingFactor ); maxDeltaPres = MpiWrapper::max( maxDeltaPres ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change: {} Pa (before scaling)", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change = {} Pa (before scaling)", getName(), fmt::format( "{:.{}f}", maxDeltaPres, 3 ) ) ); return scalingFactor; diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index ceadb7519dd..bdfe7cff940 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -69,8 +69,9 @@ postProcessInput() PhysicsSolverManager & physicsSolverManager = problemManager.getPhysicsSolverManager(); GEOS_THROW_IF( !physicsSolverManager.hasGroup( m_poromechanicsSolverName ), - GEOS_FMT( "{}: physics solver named {} not found", + GEOS_FMT( "{}: {} solver named {} not found", getWrapperDataContext( viewKeyStruct::poromechanicsSolverNameString() ), + POROMECHANICS_SOLVER::catalogName(), m_poromechanicsSolverName ), InputError ); diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst index 7202cd18e81..1c47dd14fd5 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst @@ -21,6 +21,7 @@ maxSequentialCompDensChange real64 maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check minCompDens real64 1e-10 Minimum allowed global component density +minScalingFactor real64 0.01 Minimum value for solution scaling factor miscibleDBC integer 0 Flag for enabling DBC formulation with/without miscibility name groupName required A name is required for any non-unique nodes omegaDBC real64 1 Factor by which DBC flux is multiplied diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst index 4cdd10dd766..067a6a06a6a 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst @@ -18,6 +18,7 @@ maxSequentialCompDensChange real64 1 Maximum (a maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check minCompDens real64 1e-10 Minimum allowed global component density +minScalingFactor real64 0.01 Minimum value for solution scaling factor name groupName required A name is required for any non-unique nodes solutionChangeScalingFactor real64 0.5 Damping factor for solution change targets targetFlowCFL real64 -1 Target CFL condition `CFL condition `_when computing the next timestep. diff --git a/src/coreComponents/schema/docs/Events.rst b/src/coreComponents/schema/docs/Events.rst index 4073b6fdc2c..a9963170314 100644 --- a/src/coreComponents/schema/docs/Events.rst +++ b/src/coreComponents/schema/docs/Events.rst @@ -1,16 +1,16 @@ -================ ================================== ============ =================================================== -Name Type Default Description -================ ================================== ============ =================================================== -logLevel integer 0 Log level -maxCycle integer 2147483647 Maximum simulation cycle for the global event loop. -maxTime real64 1.79769e+308 Maximum simulation time for the global event loop. -minTime real64 0 Start simulation time for the global event loop. -timeOutputFormat geos_EventManager_TimeOutputFormat seconds Format of the time in the GEOS log. -HaltEvent node :ref:`XML_HaltEvent` -PeriodicEvent node :ref:`XML_PeriodicEvent` -SoloEvent node :ref:`XML_SoloEvent` -================ ================================== ============ =================================================== +================ ================================== ============ ======================================================================== +Name Type Default Description +================ ================================== ============ ======================================================================== +logLevel integer 0 Log level +maxCycle integer 2147483647 Maximum simulation cycle for the global event loop. Disabled by default. +maxTime real64 1.79769e+308 Maximum simulation time for the global event loop. Disabled by default. +minTime real64 0 Start simulation time for the global event loop. +timeOutputFormat geos_EventManager_TimeOutputFormat seconds Format of the time in the GEOS log. +HaltEvent node :ref:`XML_HaltEvent` +PeriodicEvent node :ref:`XML_PeriodicEvent` +SoloEvent node :ref:`XML_SoloEvent` +================ ================================== ============ ======================================================================== diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 3ee8c96a670..f7b331fabf4 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -922,9 +922,9 @@ - + - + @@ -2398,6 +2398,8 @@ the relative residual norm satisfies: + + @@ -2476,6 +2478,8 @@ the relative residual norm satisfies: + + From b726e1acacdb5978bc2f856b83ddc4f1e703cade Mon Sep 17 00:00:00 2001 From: TotoGaz <49004943+TotoGaz@users.noreply.github.com> Date: Thu, 13 Jun 2024 09:05:47 -0700 Subject: [PATCH 089/286] Only consider 3d cells in fracture to matrix mappings (#2887) --- .../mesh/generators/VTKFaceBlockUtilities.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp index 832b350792f..9b7cddf3c0c 100644 --- a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp @@ -447,12 +447,17 @@ Elem2dTo3dInfo buildElem2dTo3dElemAndFaces( vtkSmartPointer< vtkDataSet > faceMe ng2l[globalPtIds->GetValue( i )] = i; } - // Let's build the elem2d to elem3d mapping. We need to find the 3d elements! + // Let's build the elem2d to elem3d mapping. + // We need to find the 3d elements (and only the 3d elements, so we can safely ignore the others). // First we compute the mapping from all the boundary nodes to the 3d elements that rely on those nodes. std::map< vtkIdType, std::vector< vtkIdType > > nodesToCellsFull; for( vtkIdType i = 0; i < boundary->GetNumberOfCells(); ++i ) { vtkIdType const cellId = boundaryCells->GetValue( i ); + if( mesh->GetCell( cellId )->GetCellDimension() != 3 ) + { + continue; + } vtkIdList * pointIds = boundary->GetCell( i )->GetPointIds(); for( int j = 0; j < pointIds->GetNumberOfIds(); ++j ) { From 236ba640b583a74059fd665f80c38215e5479f5d Mon Sep 17 00:00:00 2001 From: Gaetan <159525405+Bubusch@users.noreply.github.com> Date: Thu, 13 Jun 2024 23:19:47 +0200 Subject: [PATCH 090/286] Add Pangea4 host configs (#3081) --- .devcontainer/devcontainer.json | 2 +- host-configs/TOTAL/pangea4-base.cmake | 65 ++++++++++++ ...cc12.1-hpcxompi2.17.1-onemkl2023.2.0.cmake | 99 +++++++++++++++++++ ...cc12.1-hpcxompi2.17.1-openblas0.3.23.cmake | 94 ++++++++++++++++++ ...-gcc12.1-openmpi4.1.6-onemkl2023.2.0.cmake | 99 +++++++++++++++++++ ...-gcc12.1-openmpi4.1.6-openblas0.3.23.cmake | 94 ++++++++++++++++++ 6 files changed, 452 insertions(+), 1 deletion(-) create mode 100644 host-configs/TOTAL/pangea4-base.cmake create mode 100644 host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-onemkl2023.2.0.cmake create mode 100644 host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-openblas0.3.23.cmake create mode 100644 host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-onemkl2023.2.0.cmake create mode 100644 host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-openblas0.3.23.cmake diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index db4250aeb26..3ca6152d8da 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "258-347" + "GEOS_TPL_TAG": "262-349" } }, "runArgs": [ diff --git a/host-configs/TOTAL/pangea4-base.cmake b/host-configs/TOTAL/pangea4-base.cmake new file mode 100644 index 00000000000..17caf065580 --- /dev/null +++ b/host-configs/TOTAL/pangea4-base.cmake @@ -0,0 +1,65 @@ +####################################### +# +# Pangea4 - base config for CPU cluster +# +# - RAJA CPU +# - CHAI CPU +# - CUDA OFF +# - OPENMP OFF +# - HYPRE ON +# +####################################### + +####################################### +# SCIENTIFIC LIBRARIES +####################################### + +set( ENABLE_HYPRE ON CACHE BOOL "" FORCE ) +set( ENABLE_MATHPRESSO ON CACHE BOOL "" FORCE ) +set( ENABLE_PAMELA ON CACHE BOOL "" FORCE ) +set( ENABLE_PETSC OFF CACHE BOOL "" FORCE ) +set( ENABLE_PVTPackage ON CACHE BOOL "" FORCE ) +set( ENABLE_SCOTCH ON CACHE BOOL "" FORCE ) +set( ENABLE_SUITESPARSE ON CACHE BOOL "" FORCE ) +set( ENABLE_TRILINOS OFF CACHE BOOL "" FORCE ) +set( ENABLE_VTK ON CACHE BOOL "" FORCE ) + +####################################### +# DEVELOPMENT TOOLS +####################################### + +set( ENABLE_DOXYGEN ON CACHE BOOL "" FORCE ) +set( ENABLE_GTEST_DEATH_TESTS ON CACHE BOOL "" FORCE ) +set( ENABLE_SPHINX ON CACHE BOOL "" FORCE ) +set( ENABLE_UNCRUSTIFY ON CACHE BOOL "" FORCE ) +set( ENABLE_XML_UPDATES ON CACHE BOOL "" FORCE ) + +####################################### +# PERFORMANCE TOOLS +####################################### + +set( ENABLE_BENCHMARKS ON CACHE BOOL "" FORCE ) +set( ENABLE_CALIPER ON CACHE BOOL "" FORCE ) + +####################################### +# RAJA/CHAI SETUP +####################################### + +set( ENABLE_OPENMP OFF CACHE BOOL "" FORCE ) +set( ENABLE_CUDA OFF CACHE BOOL "" FORCE ) + +set( ENABLE_CHAI ON CACHE BOOL "" FORCE ) +set( CHAI_BUILD_TYPE "cpu-no-rm" CACHE STRING "" FORCE ) +set( CHAI_ARGS "" CACHE STRING "" FORCE ) + +set( ENABLE_RAJA ON CACHE BOOL "" FORCE ) +set( RAJA_ENABLE_HIP OFF CACHE BOOL "" FORCE ) +set( RAJA_ENABLE_OPENMP OFF CACHE BOOL "" FORCE ) +set( RAJA_ENABLE_TBB OFF CACHE BOOL "" FORCE ) + +####################################### +# PYTHON SETUP +####################################### + +set( ENABLE_PYGEOSX ON CACHE BOOL "" ) +set( ENABLE_VTK_WRAP_PYTHON ON CACHE BOOL "" ) diff --git a/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-onemkl2023.2.0.cmake b/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-onemkl2023.2.0.cmake new file mode 100644 index 00000000000..b84e1040be4 --- /dev/null +++ b/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-onemkl2023.2.0.cmake @@ -0,0 +1,99 @@ +####################################### +# +# Pangea4 - gcc - hpcxompi - onemkl +# +# Uses : +# - cray wrappers for gcc (cc, CC, ftn) +# - oneAPI MKL for BLAS and LAPACK +# - HPC-X OpenMPI for MPI +# +####################################### +# +# Requires modules : +# - PrgEnv-gnu = 8.4.0, which loads : +# . gcc = 12.1 +# . craype = 2.7.23 +# . cray-dsmml = 0.2.2 +# . craype-network-ofi = 1.0 +# . libfabric = 1.13.1 +# - cmake = 3.27.2 +# - cray-python = 3.10.10 +# - craype-x86-milan = 1.0 +# PrgEnv-gnu loads gcc 12 that does not support craype-x86-genoa +# - hpcx = 2.17.1 +# - intel-oneapi-mkl = 2023.2.0 +# +# Load modules this way : +# - module purge +# - module load PrgEnv-gnu/8.4.0 craype-x86-milan cmake/3.27.2 cray-python/3.10.10 +# - module unload cray-libsci/23.09.1.1 cray-mpich/8.1.27 +# - module load hpcx intel-oneapi-mkl/2023.2.0 +# +######################################## + +set( CONFIG_NAME "pangea4-gcc12.1-hpcxompi2.17.1-onemkl2023.2.0" CACHE PATH "" ) + +include(${CMAKE_CURRENT_LIST_DIR}/pangea4-base.cmake) + +####################################### +# COMPILER SETUP +####################################### + +# use : +# - cray wrappers for gnu compilers so that we link properly with infiniband network +# - explicit optimization flags even when using cray wrappers + +if( NOT DEFINED ENV{GCC_PATH} ) + message( FATAL_ERROR "GCC is not loaded. Please load the PrgEnv-gnu/8.4.0 module." ) +endif() + +set( CMAKE_C_COMPILER "cc" CACHE PATH "" ) +set( CMAKE_CXX_COMPILER "CC" CACHE PATH "" ) +set( CMAKE_Fortran_COMPILER "ftn" CACHE PATH "" ) + +set( COMMON_FLAGS "-march=native -mtune=native" ) +set( RELEASE_FLAGS "-O3 -DNDEBUG" ) +set( DEBUG_FLAGS "-O0 -g" ) + +set( CMAKE_C_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) + +####################################### +# MPI SETUP +####################################### + +# use : +# - HPC-X OpenMPI library + +set( ENABLE_MPI ON CACHE BOOL "" ) + +if( NOT DEFINED ENV{HPCX_MPI_DIR} ) + message( FATAL_ERROR "HPC-X OpenMPI is not loaded. Please load the hpcx module." ) +endif() + +####################################### +# BLAS/LAPACK SETUP +####################################### + +# use : +# - intel oneAPI MKL library + +set( ENABLE_MKL ON CACHE BOOL "" FORCE ) + +if( NOT DEFINED ENV{MKLROOT} ) + message( FATAL_ERROR "MKL is not loaded. Please load the intel-oneapi-mkl/2023.2.0 module." ) +endif() + +set( MKL_INCLUDE_DIRS $ENV{MKLROOT}/include CACHE STRING "" ) +set( MKL_LIBRARIES $ENV{MKLROOT}/lib/intel64/libmkl_rt.so + $ENV{GCC_PATH}/lib/gcc/x86_64-redhat-linux/12/libgomp.so + CACHE STRING "" ) + +include( ${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake ) diff --git a/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-openblas0.3.23.cmake b/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-openblas0.3.23.cmake new file mode 100644 index 00000000000..53080a4d708 --- /dev/null +++ b/host-configs/TOTAL/pangea4-gcc12.1-hpcxompi2.17.1-openblas0.3.23.cmake @@ -0,0 +1,94 @@ +####################################### +# +# Pangea4 - gcc - hpcxompi - openblas +# +# Uses : +# - cray wrappers for gcc (cc, CC, ftn) +# - OpenBLAS for BLAS and LAPACK +# - HPC-X OpenMPI for MPI +# +####################################### +# +# Requires modules : +# - PrgEnv-gnu = 8.4.0, which loads : +# . gcc = 12.1 +# . craype = 2.7.23 +# . cray-dsmml = 0.2.2 +# . craype-network-ofi = 1.0 +# . libfabric = 1.13.1 +# - cmake = 3.27.2 +# - cray-python = 3.10.10 +# - craype-x86-milan = 1.0 +# PrgEnv-gnu loads gcc 12 that does not support craype-x86-genoa +# - hpcx = 2.17.1 +# - openblas = 0.3.23 +# +# Load modules this way : +# - module purge +# - module load PrgEnv-gnu/8.4.0 craype-x86-milan cmake/3.27.2 cray-python/3.10.10 +# - module unload cray-libsci/23.09.1.1 cray-mpich/8.1.27 +# - module load hpcx openblas/0.3.23 +# +######################################## + +set( CONFIG_NAME "pangea4-gcc12.1-hpcxompi2.17.1-openblas0.3.23" CACHE PATH "" ) + +include(${CMAKE_CURRENT_LIST_DIR}/pangea4-base.cmake) + +####################################### +# COMPILER SETUP +####################################### + +# use : +# - cray wrappers for gnu compilers so that we link properly with infiniband network +# - explicit optimization flags even when using cray wrappers + +if( NOT DEFINED ENV{GCC_PATH} ) + message( FATAL_ERROR "GCC is not loaded. Please load the PrgEnv-gnu/8.4.0 module." ) +endif() + +set( CMAKE_C_COMPILER "cc" CACHE PATH "" ) +set( CMAKE_CXX_COMPILER "CC" CACHE PATH "" ) +set( CMAKE_Fortran_COMPILER "ftn" CACHE PATH "" ) + +set( COMMON_FLAGS "-march=native -mtune=native" ) +set( RELEASE_FLAGS "-O3 -DNDEBUG" ) +set( DEBUG_FLAGS "-O0 -g" ) + +set( CMAKE_C_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) + +####################################### +# MPI SETUP +####################################### + +# use : +# - HPC-X OpenMPI library + +set( ENABLE_MPI ON CACHE BOOL "" ) + +if( NOT DEFINED ENV{HPCX_MPI_DIR} ) + message( FATAL_ERROR "HPC-X OpenMPI is not loaded. Please load the hpcx module." ) +endif() + +####################################### +# BLAS/LAPACK SETUP +####################################### + +# use : +# - OpenBLAS library + +find_library(OPENBLAS_LIB openblas) + +if(NOT OPENBLAS_LIB) + message(FATAL_ERROR "OpenBLAS is not loaded. Please load the openblas/0.3.23 module.") +endif() + +include( ${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake ) diff --git a/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-onemkl2023.2.0.cmake b/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-onemkl2023.2.0.cmake new file mode 100644 index 00000000000..e4265966ef0 --- /dev/null +++ b/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-onemkl2023.2.0.cmake @@ -0,0 +1,99 @@ +####################################### +# +# Pangea4 - gcc - openmpi - onemkl +# +# Uses : +# - cray wrappers for gcc (cc, CC, ftn) +# - OpenMPI for MPI +# - oneAPI MKL for BLAS and LAPACK +# +####################################### +# +# Requires modules : +# - PrgEnv-gnu = 8.4.0, which loads : +# . gcc = 12.1 +# . craype = 2.7.23 +# . cray-dsmml = 0.2.2 +# . craype-network-ofi = 1.0 +# . libfabric = 1.13.1 +# - cmake = 3.27.2 +# - cray-python = 3.10.10 +# - craype-x86-milan = 1.0 +# PrgEnv-gnu loads gcc 12 that does not support craype-x86-genoa +# - openmpi = 4.1.6 +# - intel-oneapi-mkl = 2023.2.0 +# +# Load modules this way : +# - module purge +# - module load PrgEnv-gnu/8.4.0 craype-x86-milan cmake/3.27.2 cray-python/3.10.10 +# - module unload cray-libsci/23.09.1.1 cray-mpich/8.1.27 +# - module load openmpi/4.1.6 intel-oneapi-mkl/2023.2.0 +# +######################################## + +set( CONFIG_NAME "pangea4-gcc12.1-openmpi4.1.6-onemkl2023.2.0" CACHE PATH "" ) + +include(${CMAKE_CURRENT_LIST_DIR}/pangea4-base.cmake) + +####################################### +# COMPILER SETUP +####################################### + +# use : +# - cray wrappers for gnu compilers so that we link properly with infiniband network +# - explicit optimization flags even when using cray wrappers + +if( NOT DEFINED ENV{GCC_PATH} ) + message( FATAL_ERROR "GCC is not loaded. Please load the PrgEnv-gnu/8.4.0 module." ) +endif() + +set( CMAKE_C_COMPILER "cc" CACHE PATH "" ) +set( CMAKE_CXX_COMPILER "CC" CACHE PATH "" ) +set( CMAKE_Fortran_COMPILER "ftn" CACHE PATH "" ) + +set( COMMON_FLAGS "-march=native -mtune=native" ) +set( RELEASE_FLAGS "-O3 -DNDEBUG" ) +set( DEBUG_FLAGS "-O0 -g" ) + +set( CMAKE_C_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) + +####################################### +# MPI SETUP +####################################### + +# use : +# - OpenMPI library + +set( ENABLE_MPI ON CACHE BOOL "" ) + +if( NOT "$ENV{LMOD_MPI_NAME}" STREQUAL "openmpi" ) + message(FATAL_ERROR "OpenMPI is not loaded. Please load the openmpi/4.1.6 module.") +endif() + +####################################### +# BLAS/LAPACK SETUP +####################################### + +# use : +# - intel oneAPI MKL library + +set( ENABLE_MKL ON CACHE BOOL "" FORCE ) + +if( NOT DEFINED ENV{MKLROOT} ) + message( FATAL_ERROR "MKL is not loaded. Please load the intel-oneapi-mkl/2023.2.0 module." ) +endif() + +set( MKL_INCLUDE_DIRS $ENV{MKLROOT}/include CACHE STRING "" ) +set( MKL_LIBRARIES $ENV{MKLROOT}/lib/intel64/libmkl_rt.so + $ENV{GCC_PATH}/lib/gcc/x86_64-redhat-linux/12/libgomp.so + CACHE STRING "" ) + +include( ${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake ) diff --git a/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-openblas0.3.23.cmake b/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-openblas0.3.23.cmake new file mode 100644 index 00000000000..e3a7c22b0c7 --- /dev/null +++ b/host-configs/TOTAL/pangea4-gcc12.1-openmpi4.1.6-openblas0.3.23.cmake @@ -0,0 +1,94 @@ +####################################### +# +# Pangea4 - gcc - openmpi - onemkl +# +# Uses : +# - cray wrappers for gcc (cc, CC, ftn) +# - OpenMPI for MPI +# - OpenBLAS for BLAS and LAPACK +# +####################################### +# +# Requires modules : +# - PrgEnv-gnu = 8.4.0, which loads : +# . gcc = 12.1 +# . craype = 2.7.23 +# . cray-dsmml = 0.2.2 +# . craype-network-ofi = 1.0 +# . libfabric = 1.13.1 +# - cmake = 3.27.2 +# - cray-python = 3.10.10 +# - craype-x86-milan = 1.0 +# PrgEnv-gnu loads gcc 12 that does not support craype-x86-genoa +# - openmpi = 4.1.6 +# - openbla = 0.3.23 +# +# Load modules this way : +# - module purge +# - module load PrgEnv-gnu/8.4.0 craype-x86-milan cmake/3.27.2 cray-python/3.10.10 +# - module unload cray-libsci/23.09.1.1 cray-mpich/8.1.27 +# - module load openmpi/4.1.6 openblas/0.3.23 +# +######################################## + +set( CONFIG_NAME "pangea4-gcc12.1-openmpi4.1.6-openblas0.3.23" CACHE PATH "" ) + +include(${CMAKE_CURRENT_LIST_DIR}/pangea4-base.cmake) + +####################################### +# COMPILER SETUP +####################################### + +# use : +# - cray wrappers for gnu compilers so that we link properly with infiniband network +# - explicit optimization flags even when using cray wrappers + +if( NOT DEFINED ENV{GCC_PATH} ) + message( FATAL_ERROR "GCC is not loaded. Please load the PrgEnv-gnu/8.4.0 module." ) +endif() + +set( CMAKE_C_COMPILER "cc" CACHE PATH "" ) +set( CMAKE_CXX_COMPILER "CC" CACHE PATH "" ) +set( CMAKE_Fortran_COMPILER "ftn" CACHE PATH "" ) + +set( COMMON_FLAGS "-march=native -mtune=native" ) +set( RELEASE_FLAGS "-O3 -DNDEBUG" ) +set( DEBUG_FLAGS "-O0 -g" ) + +set( CMAKE_C_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS ${COMMON_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_RELEASE ${RELEASE_FLAGS} CACHE STRING "" ) +set( CMAKE_CXX_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_C_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) +set( CMAKE_Fortran_FLAGS_DEBUG ${DEBUG_FLAGS} CACHE STRING "" ) + +####################################### +# MPI SETUP +####################################### + +# use : +# - OpenMPI library + +set( ENABLE_MPI ON CACHE BOOL "" ) + +if( NOT "$ENV{LMOD_MPI_NAME}" STREQUAL "openmpi" ) + message(FATAL_ERROR "OpenMPI is not loaded. Please load the openmpi/4.1.6 module.") +endif() + +####################################### +# BLAS/LAPACK SETUP +####################################### + +# use : +# - OpenBLAS library + +find_library(OPENBLAS_LIB openblas) + +if(NOT OPENBLAS_LIB) + message(FATAL_ERROR "OpenBLAS is not loaded. Please load the openblas/0.3.23 module.") +endif() + +include( ${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake ) From 2306840a3c567ab50c5880b67f1913857dc5e309 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Thu, 13 Jun 2024 22:49:49 +0100 Subject: [PATCH 091/286] run integrated tests on dedicated runner to avoid overloading of streak2 (#3171) --- .github/workflows/ci_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 197dcf0f078..0a44baf6a4d 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -199,7 +199,7 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF GCP_BUCKET: geosx/integratedTests - RUNS_ON: streak2 + RUNS_ON: streak2-32core NPROC: 32 DOCKER_RUN_ARGS: "--cpus=32 --memory=384g -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" From ee751b0d9ff64dc1ec3918d5376bb87969cc9631 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 13 Jun 2024 22:17:09 -0500 Subject: [PATCH 092/286] Preparatory work for fractures + wells (#3021) Co-authored-by: Jian HUANG --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 +- .../DATATABLES/effectiveSigma_xx.csv | 2 + .../DATATABLES/effectiveSigma_yy.csv | 2 + .../DATATABLES/effectiveSigma_zz.csv | 2 + .../DATATABLES/porePressure.csv | 2 + .../poromechanicsFractures/DATATABLES/x.csv | 1 + .../poromechanicsFractures/DATATABLES/y.csv | 1 + .../poromechanicsFractures/DATATABLES/z.csv | 2 + .../Domain_Mesh_FaultModel.vtu | 50 ++++ .../Fault_Mesh_FaultModel.vtu | 52 ++++ .../poromechanicsFractures.ats | 9 +- ...nglePhasePoromechanics_FaultModel_base.xml | 224 ++++++++++++++++++ ...glePhasePoromechanics_FaultModel_smoke.xml | 119 ++++++++++ .../verticalFault_ExternalMesh.vtm | 14 ++ .../fluidFlow/SinglePhaseFVM.cpp | 32 +-- ...mpositionalMultiphaseReservoirAndWells.cpp | 16 +- ...mpositionalMultiphaseReservoirAndWells.hpp | 2 +- .../CoupledReservoirAndWellsBase.hpp | 3 +- .../multiphysics/HydrofractureSolver.cpp | 2 +- .../multiphysics/HydrofractureSolver.hpp | 2 +- .../multiphysics/MultiphasePoromechanics.cpp | 88 +++---- .../multiphysics/MultiphasePoromechanics.hpp | 24 +- .../PoromechanicsInitialization.cpp | 16 +- .../multiphysics/SinglePhasePoromechanics.cpp | 10 +- .../multiphysics/SinglePhasePoromechanics.hpp | 2 +- ...ePhasePoromechanicsConformingFractures.cpp | 218 +++++++++-------- ...ePhasePoromechanicsConformingFractures.hpp | 21 +- .../SinglePhaseReservoirAndWells.cpp | 24 +- .../SinglePhaseReservoirAndWells.hpp | 23 +- .../fluidFlowTests/testSingleFlowUtils.hpp | 2 +- .../testThermalSinglePhaseFlow.cpp | 6 +- ...eservoirCompositionalMultiphaseMSWells.cpp | 6 +- .../testReservoirSinglePhaseMSWells.cpp | 6 +- 34 files changed, 774 insertions(+), 217 deletions(-) create mode 100644 inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_xx.csv create mode 100644 inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_yy.csv create mode 100644 inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_zz.csv create mode 100644 inputFiles/poromechanicsFractures/DATATABLES/porePressure.csv create mode 100644 inputFiles/poromechanicsFractures/DATATABLES/x.csv create mode 100644 inputFiles/poromechanicsFractures/DATATABLES/y.csv create mode 100644 inputFiles/poromechanicsFractures/DATATABLES/z.csv create mode 100644 inputFiles/poromechanicsFractures/Domain_Mesh_FaultModel.vtu create mode 100644 inputFiles/poromechanicsFractures/Fault_Mesh_FaultModel.vtu create mode 100644 inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_base.xml create mode 100644 inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_smoke.xml create mode 100644 inputFiles/poromechanicsFractures/verticalFault_ExternalMesh.vtm diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index b26a7d326f6..08e6f8eebc4 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3152-5558-5c6e97f + baseline: integratedTests/baseline_integratedTests-pr3021-5589-3c278fb allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 1d66ebd85ee..0aa55a0b447 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3021 (2024-06-13) +====================== +Preparatory work for fractures + wells. New test case added. + + PR #3152 (2024-06-13) ====================== Some random things. Baseline update because of the new parameter (minScalingFactor). @@ -40,7 +45,6 @@ PR #3113 (2024-06-05) ===================== Add general version updateConfiguration. Rebaseline of some edfm cases is needed. - PR #3050 (2024-05-20) ===================== Spatially varying grain bulk modulus. Rebaseline of all poromechanics cases needed. diff --git a/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_xx.csv b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_xx.csv new file mode 100644 index 00000000000..14a2427db2d --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_xx.csv @@ -0,0 +1,2 @@ +-27621898.34 +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_yy.csv b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_yy.csv new file mode 100644 index 00000000000..a0a8255c490 --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_yy.csv @@ -0,0 +1,2 @@ +-69831843.20 +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_zz.csv b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_zz.csv new file mode 100644 index 00000000000..83aac38ac24 --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/effectiveSigma_zz.csv @@ -0,0 +1,2 @@ +-57898141.60 +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/porePressure.csv b/inputFiles/poromechanicsFractures/DATATABLES/porePressure.csv new file mode 100644 index 00000000000..3c67d97be4f --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/porePressure.csv @@ -0,0 +1,2 @@ +40444400.00 +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/x.csv b/inputFiles/poromechanicsFractures/DATATABLES/x.csv new file mode 100644 index 00000000000..fb1088c65aa --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/x.csv @@ -0,0 +1 @@ +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/y.csv b/inputFiles/poromechanicsFractures/DATATABLES/y.csv new file mode 100644 index 00000000000..fb1088c65aa --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/y.csv @@ -0,0 +1 @@ +0.00 diff --git a/inputFiles/poromechanicsFractures/DATATABLES/z.csv b/inputFiles/poromechanicsFractures/DATATABLES/z.csv new file mode 100644 index 00000000000..1fc446ae0e8 --- /dev/null +++ b/inputFiles/poromechanicsFractures/DATATABLES/z.csv @@ -0,0 +1,2 @@ +-4000.00 +0.00 diff --git a/inputFiles/poromechanicsFractures/Domain_Mesh_FaultModel.vtu b/inputFiles/poromechanicsFractures/Domain_Mesh_FaultModel.vtu new file mode 100644 index 00000000000..0b851b7cea7 --- /dev/null +++ b/inputFiles/poromechanicsFractures/Domain_Mesh_FaultModel.vtu @@ -0,0 +1,50 @@ + + + + + + + AgAAAACAAADoZwAATBgAAMMTAAA=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 + + + + + AgAAAACAAACAOwAAzgAAAC8AAAA=eJzt0iEKQwEQQ8G29z90xXeFiEDEUuaZcVH5vJ4+JEmSJEmSJEmSJEmSJEmSJEmSJEmSJEky9v7xX/bIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v98jG1JU/r/fIxtSVP6/3yMbUlT+v9/j0BcUYHgl4nO3FMQ0AAAACIGf/0B7WgIfmatu2bdu2bdu2bdu2bdu2bdu2bdu2bTsDGPUO4Q== + + + AgAAAACAAACAOwAAUQAAADUAAAA=eJztxTERADAIBLC/w0PNsmAWHxVCsmT2dSUZ27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27Zt27YP/wFH9JHSeJztxTENAAAIA7AleMAsD2bxgZH26V5PJVnbtm3btm3btm3btm3btm3btm3btm3beaYkrMM= + + + AgAAAACAAACAOwAANAAAACUAAAA=eJztwQEBAAAAgJD+r+4ICgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYgAAAAXic7cExAQAAAMKg9U/tZQugAAAAAAAAAAAAAAAAAACAGzuAAAE= + + + AgAAAACAAACAOwAATBgAAGULAAA=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 + + + 0 + + + 9380.8315196 + + + + + + + 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 + + + AgAAAACAAACAOwAApRMAAC8JAAA=eJw13acDvWAYFuzjxo0bN27cuHHjxn3cuHHj5vtcuIlEIpFIJJ5IJBKJRCKRaDjX7y3X3/A+436C1/eFjBgzYcqMOQu+WbJizYYtO/YcOHLizIUfrty48+DJizcfvn7Cl4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr5/4JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPh6yd9CRgyYsyEKTPmLPhmyYo1G7bs2HPgyIkzF364cuPOgycv3nz4+slfAoaMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLNx++fsqXgCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYevn/olYMiIMROmzJiz4JslK9Zs2LJjz4EjJ85c+OHKjTsPnrx48+Hrp30JGDJizIQpM+Ys+GbJijUbtuzYc+DIiTMXfrhy486DJy/efPgKwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPXT/8SMGTEmAlTZsxZ8M2SFWs2bNmx58CRE2cu/HDlxp0HT168+fD1M74EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz9zC8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD18/60vAkBFjJkyZMWfBN0tWrNmwZceeA0dOnLnww5Ubdx48efHmw9fP/hIwZMSYCVNmzFnwzZIVazZs2bHnwJETZy78cOXGnQdPXrz58PVzvgQMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+fP3cLwFDRoyZMGXGnAXfLFmxZsOWHXsOHDlx5sIPV27cefDkxZsPf3z4A4aMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLN58fhY6f9yVgyIgxE6bMmLPgmyUr1mzYsmPPgSMnzlz44cqNOw+evHjz4evnfwkYMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+PoFXwKGjBgzYcqMOQu+WbJizYYtO/YcOHLizIUfrty48+DJizcfvn7hl4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr1/0JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPh6xd/CRgyYsyEKTPmLPhmyYo1G7bs2HPgyIkzF364cuPOgycv3nz4+iVfAoaMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLNx/+KPQHDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPj8aHL/0S8CQEWMmTJkxZ8E3S1as2bBlx54DR06cufDDlRt3Hjx58ebD1y/7EjBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPnw9cu/BAwZMWbClBlzFnyzZMWaDVt27Dlw5MSZCz9cuXHnwZMXbz58/YovAUNGjJkwZcacBd8sWbFmw5Ydew4cOXHmwg9Xbtx58OTFmw9fv/JLwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPXr/oSMGTEmAlTZsxZ8M2SFWs2bNmx58CRE2cu/HDlxp0HT168+fD1q78EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPvzR4A8YMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+Po1XwKGjBgzYcqMOQu+WbJizYYtO/YcOHLizIUfrty48+DJizcfvn7tl4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr1/3JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPh69d/CRgyYsyEKTPmLPhmyYo1G7bs2HPgyIkzF364cuPOgycv3nz4+g1fAoaMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLNx++fuOXgCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYev3/QlYMiIMROmzJiz4JslK9Zs2LJjz4EjJ85c+OHKjTsPnrx48+GPwb6AISPGTJgyY86Cb5asWLNhy449B46cOHPhhys37jx48uLN58dA42/+EjBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPnw9Vu+BAwZMWbClBlzFnyzZMWaDVt27Dlw5MSZCz9cuXHnwZMXbz58/dYvAUNGjJkwZcacBd8sWbFmw5Ydew4cOXHmwg9Xbtx58OTFmw9fv+1LwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPXb/8SMGTEmAlTZsxZ8M2SFWs2bNmx58CRE2cu/HDlxp0HT168+fD1O74EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz9zi8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD38M9AcMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+PxYZfteXgCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYev3/0lYMiIMROmzJiz4JslK9Zs2LJjz4EjJ85c+OHKjTsPnrx48+Hr93wJGDJizIQpM+Ys+GbJijUbtuzYc+DIiTMXfrhy486DJy/efPj6vV8ChowYM2HKjDkLvlmyYs2GLTv2HDhy4syFH67cuPPgyYs3H75+35eAISPGTJgyY86Cb5asWLNhy449B46cOHPhhys37jx48uLNh6/f/yVgyIgxE6bMmLPgmyUr1mzYsmPPgSMnzlz44cqNOw+evHjz4esPfAkYMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+GORL2DIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePP5scD4B78EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz9oS8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD19/+EvAkBFjJkyZMWfBN0tWrNmwZceeA0dOnLnww5Ubdx48efHmw9cf+RIwZMSYCVNmzFnwzZIVazZs2bHnwJETZy78cOXGnQdPXrz58PVHvwQMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+fP2xLwFDRoyZMGXGnAXfLFmxZsOWHXsOHDlx5sIPV27cefDkxZsPX3/8S8CQEWMmTJkxZ8E3S1as2bBlx54DR06cufDDlRt3Hjx58ebDHwv8AUNGjJkwZcacBd8sWbFmw5Ydew4cOXHmwg9Xbtx58OTFmw9ff+JLwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPXn/wSMGTEmAlTZsxZ8M2SFWs2bNmx58CRE2cu/HDlxp0HT168+fD1p74EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz96S8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD19/5kvAkBFjJkyZMWfBN0tWrNmwZceeA0dOnLnww5Ubdx48efHmw9ef/RIwZMSYCVNmzFnwzZIVazZs2bHnwJETZy78cOXGnQdPXrz58PXnvgQMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+/BHcEzBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPn8CCz6818ChowYM2HKjDkLvlmyYs2GLTv2HDhy4syFH67cuPPgyYs3H77+wpeAISPGTJgyY86Cb5asWLNhy449B46cOHPhhys37jx48uLNh6+/+CVgyIgxE6bMmLPgmyUr1mzYsmPPgSMnzlz44cqNOw+evHjz4esvfQkYMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+PrLXwKGjBgzYcqMOQu+WbJizYYtO/YcOHLizIUfrty48+DJizcfvv7Kl4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr7/6JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPhj8C+gCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizedHUOFf+xIwZMSYCVNmzFnwzZIVazZs2bHnwJETZy78cOXGnQdPXrz58PXXvwQMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+fP2NLwFDRoyZMGXGnAXfLFmxZsOWHXsOHDlx5sIPV27cefDkxZsPX3/zS8CQEWMmTJkxZ8E3S1as2bBlx54DR06cufDDlRt3Hjx58ebD19/6EjBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPnw9be/BAwZMWbClBlzFnyzZMWaDVt27Dlw5MSZCz9cuXHnwZMXbz58/Z0vAUNGjJkwZcacBd8sWbFmw5Ydew4cOXHmwg9Xbtx58OTFmw9/BPUGDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPj8Civ/ul4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr7/3JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPh6+9/CRgyYsyEKTPmLPhmyYo1G7bs2HPgyIkzF364cuPOgycv3nz4+gdfAoaMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLNx++/uGXgCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYevf/QlYMiIMROmzJiz4JslK9Zs2LJjz4EjJ85c+OHKjTsPnrx48+HrH38JGDJizIQpM+Ys+GbJijUbtuzYc+DIiTMXfrhy486DJy/efPgjoD9gyIgxE6bMmLPgmyUr1mzYsmPPgSMnzlz44cqNOw+evHjz4euffAkYMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+PqnXwKGjBgzYcqMOQu+WbJizYYtO/YcOHLizIUfrty48+DJizcfvv7Zl4AhI8ZMmDJjzoJvlqxYs2HLjj0Hjpw4c+GHKzfuPHjy4s2Hr3/+JWDIiDETpsyYs+CbJSvWbNiyY8+BIyfOXPjhyo07D568ePPh6198CRgyYsyEKTPmLPhmyYo1G7bs2HPgyIkzF364cuPOgycv3nz4+pdfAoaMGDNhyow5C75ZsmLNhi079hw4cuLMhR+u3Ljz4MmLNx++/tWXgCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYc/DvMEDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz96y8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD1//5kvAkBFjJkyZMWfBN0tWrNmwZceeA0dOnLnww5Ubdx48efHmw9e//RIwZMSYCVNmzFnwzZIVazZs2bHnwJETZy78cOXGnQdPXrz58PXvvgQMGTFmwpQZcxZ8s2TFmg1bduw5cOTEmQs/XLlx58GTF28+fP37LwFDRoyZMGXGnAXfLFmxZsOWHXsOHDlx5sIPV27cefDkxZsPX//hS8CQEWMmTJkxZ8E3S1as2bBlx54DR06cufDDlRt3Hjx58ebD13/8EjBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPnwx0G+gCEjxkyYMmPOgm+WrFizYcuOPQeOnDhz4YcrN+48ePLizYev/+9LwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPX//8lYMiIMROmzJiz4JslK9Zs2LJjz4EjJ85c+OHKjTsPnrx48+HrP30JGDJizIQpM+Ys+GbJijUbtuzYc+DIiTMXfrhy486DJy/efPj6z18ChowYM2HKjDkLvlmyYs2GLTv2HDhy4syFH67cuPPgyYs3H77+y5eAISPGTJgyY86Cb5asWLNhy449B46cOHPhhys37jx48uLNh6//+iVgyIgxE6bMmLPgmyUr1mzYsmPPgSMnzlz44cqNOw+evHjz4eu/fQkYMmLMhCkz5iz4ZsmKNRu27Nhz4MiJMxd+uHLjzoMnL958+OMQb8CQEWMmTJkxZ8E3S1as2bBlx54DR06cufDDlRt3Hjx58ebD13//EjBkxJgJU2bMWfDNkhVrNmzZsefAkRNnLvxw5cadB09evPnw9T++BAwZMWbClBlzFnyzZMWaDVt27Dlw5MSZCz9cuXHnwZMXbz58/c8vAUNGjJkwZcacBd8sWbFmw5Ydew4cOXHmwg9Xbtx58OTFmw9f/+tLwJARYyZMmTFnwTdLVqzZsGXHngNHTpy58MOVG3cePHnx5sPX//4SMGTEmAlTZsxZ8M2SFWs2bNmx58CRE2cu/HDlxp0HT168+fD1f74EDBkxZsKUGXMWfLNkxZoNW3bsOXDkxJkLP1y5cefBkxdvPnz93y8BQ0aMmTBlxpwF3yxZsWbDlh17Dhw5cebCD1du3Hnw5MWbD1/dl/8HE+m5JnicLcUpGIUAYBBgIpFIJBKJRCKRSCQSiUS8NrxxXnht6KbijdeGWogvvkgkEl8k+n3j/8sfDsFfihw7cerMuQuXrly7cevOvQePnjx78erNuw9//PXpy7d/fhz8lbfQkWMnTp05d+HSlWs3bt259+DRk2cvXr159+GPvz59+fbPj4O/+hY6cuzEqTPnLly6cu3GrTv3Hjx68uzFqzfvPvzx16cv3/75cfDX3kJHjp04debchUtXrt24defeg0dPnr149ebdhz/++vTl2z8/Dv76W+jIsROnzpy7cOnKtRu37tx78OjJsxev3rz78Mdfn758++fHwd94Cx05duLUmXMXLl25duPWnXsPHj159uLVm3cf/vjr05dv//w4+IO30JFjJ06dOXfh0pVrN27duffg0ZNnL169effhj78+ffn2z4+DP3wLHTl24tSZcxcuXbl249adew8ePXn24tWbdx/++OvTl2///DgY30JHjp04debchUtXrt24defeg0dPnr149ebdhz/++vTl2z8/Dv7mW+jIsROnzpy7cOnKtRu37tx78OjJsxev3rz78Mdfn758++fHwd96Cx05duLUmXMXLl25duPWnXsPHj159uLVm3cf/vjr05dv//w4+NtvoSPHTpw6c+7CpSvXbty6c+/BoyfPXrx68+7DH399+vLtnx8Hf+ctdOTYiVNnzl24dOXajVt37j149OTZi1dv3n34469PX7798+Pg776Fjhw7cerMuQuXrly7cevOvQePnjx78erNuw9//PXpy7d/fhz8vbfQkWMnTp05d+HSlWs3bt259+DRk2cvXr159+GPvz59+fbPj4O//xY6cuzEqTPnLly6cu3GrTv3Hjx68uzFqzfvPvzx16cv3/75cTC9hY4cO3HqzLkLl65cu3Hrzr0Hj548e/HqzbsPf/z16cu3f34c/IO30JFjJ06dOXfh0pVrN27duffg0ZNnL169effhj78+ffn2z4+DP3oLHTl24tSZcxcuXbl249adew8ePXn24tWbdx/++OvTl2///Dj4h2+hI8dOnDpz7sKlK9du3Lpz78GjJ89evHrz7sMff3368u2fHwf/6C105NiJU2fOXbh05dqNW3fuPXj05NmLV2/effjjr09fvv3z4+Afv4WOHDtx6sy5C5euXLtx6869B4+ePHvx6s27D3/89enLt39+HPyTt9CRYydOnTl34dKVazdu3bn34NGTZy9evXn34Y+/Pn359s+Pg3/6Fjpy7MSpM+cuXLpy7catO/cePHry7MWrN+8+/PHXpy/f/vlxML+Fjhw7cerMuQuXrly7cevOvQePnjx78erNuw9//PXpy7d/fhz8s7fQkWMnTp05d+HSlWs3bt259+DRk2cvXr159+GPvz59+fbPj4N//hY6cuzEqTPnLly6cu3GrTv3Hjx68uzFqzfvPvzx16cv3/75cfAv3kJHjp04debchUtXrt24defeg0dPnr149ebdhz/++vTl2z8/Dv7lW+jIsROnzpy7cOnKtRu37tx78OjJsxev3rz78Mdfn758++fHwb96Cx05duLUmXMXLl25duPWnXsPHj159uLVm3cf/vjr05dv//w4+OO30JFjJ06dOXfh0pVrN27duffg0ZNnL169effhj78+ffn2z4+DP3kLHTl24tSZcxcuXbl249adew8ePXn24tWbdx/++OvTl2///DhY3kJHjp04debchUtXrt24defeg0dPnr149ebdhz/++vTl2z8/Dv71W+jIsROnzpy7cOnKtRu37tx78OjJsxev3rz78Mdfn758++fHwb95Cx05duLUmXMXLl25duPWnXsPHj159uLVm3cf/vjr05dv//w4+NO30JFjJ06dOXfh0pVrN27duffg0ZNnL169effhj78+ffn2z4+DP3sLHTl24tSZcxcuXbl249adew8ePXn24tWbdx/++OvTl2///Dj4t2+hI8dOnDpz7sKlK9du3Lpz78GjJ89evHrz7sMff3368u2fHwf/7i105NiJU2fOXbh05dqNW3fuPXj05NmLV2/effjjr09fvv3z4+Dfv4WOHDtx6sy5C5euXLtx6869B4+ePHvx6s27D3/89enLt39+HKxvoSPHTpw6c+7CpSvXbty6c+/BoyfPXrx68+7DH399+vLtnx8H/+EtdOTYiVNnzl24dOXajVt37j149OTZi1dv3n34469PX7798+PgP76Fjhw7cerMuQuXrly7cevOvQePnjx78erNuw9//PXpy7d/fhz8p7fQkWMnTp05d+HSlWs3bt259+DRk2cvXr159+GPvz59+fbPj4P//BY6cuzEqTPnLly6cu3GrTv3Hjx68uzFqzfvPvzx16cv3/75cfBf3kJHjp04debchUtXrt24defeg0dPnr149ebdhz/++vTl2z8/Dv7rW+jIsROnzpy7cOnKtRu37tx78OjJsxev3rz78Mdfn758++fHwX97Cx05duLUmXMXLl25duPWnXsPHj159uLVm3cf/vjr05dv//w42N5CR46dOHXm3IVLV67duHXn3oNHT569ePXm3Yc//vr05ds/Pw7++1voyLETp86cu3DpyrUbt+7ce/DoybMXr968+/DHX5++fPvnx8H/eAsdOXbi1JlzFy5duXbj1p17Dx49efbi1Zt3H/7469OXb//8OPifb6Ejx06cOnPuwqUr127cunPvwaMnz168evPuwx9/ffry7Z8fB//rLXTk2IlTZ85duHTl2o1bd+49ePTk2YtXb959+OOvT1++/fPj4H+/hY4cO3HqzLkLl65cu3Hrzr0Hj548e/HqzbsPf/z16cu3f34c/Plb6MixE6fOnLtw6cq1G7fu3Hvw6MmzF6/evPvwx1+fvnz758fBX7yFjhw7cerMuQuXrly7cevOvQePnjx78erNuw9//PXpy7d/fhzsb6Ejx06cOnPuwqUr127cunPvwaMnz168evPuwx9/ffry7Z8fB//nLXTk2IlTZ85duHTl2o1bd+49ePTk2YtXb959+OOvT1++/fPj4P++hY4cO3HqzLkLl65cu3Hrzr0Hj548e/HqzbsPf/z16cu3f34c/L+30JFjJ06dOXfh0pVrN27duffg/w9fWSkE + + + AQAAAACAAABwFwAAHgAAAA==eJztwTEBAAAAwqAC65/XEL5AAQAAAAAArwFLPxlQ + + + + + diff --git a/inputFiles/poromechanicsFractures/Fault_Mesh_FaultModel.vtu b/inputFiles/poromechanicsFractures/Fault_Mesh_FaultModel.vtu new file mode 100644 index 00000000000..25c57076885 --- /dev/null +++ b/inputFiles/poromechanicsFractures/Fault_Mesh_FaultModel.vtu @@ -0,0 +1,52 @@ + + + + + + + AQAAAACAAACABQAAWwEAAA==eJxdi00ow3Ech1dKsTfDhaadRFyUKBellItSykUp5aKUclFKuShSLkRKiUgpERclykUp5aKNMS9jjHkZY8xblP9z+X2+l0/P0/OdzLD93y83L7wivCGcm2my32uxD1/CBvAV0g8LT8AH9IfsLH5J+nS7yR44yN8R68UXSd8nPAQf8xdix/DT0qeE0xwWn/B3yrrweQ6z7xLuhc/4O2cH8CPSx4TD9Em8zWnNBd7uNPs24Uu6TnwPG8H3Sx8SvqKL4hPsNf5H+iaXya1wlP6G7cB3S78nHIRv+YuxEXxc+jq3yY3wHX/3bAu+Xfot4V34gb8A/AiHpa/KMrkWjtM/sQ34ZulXhZ/pN/E7bAK/L32px+QXukp8DfuKr5d+TjhJt4xfZ9/w29IXZJtcDL/Tp9hyfLX048Iz8Ad/n+wifk16d47J+fAXf99sIb5M+kHhUeEp4QXhP65+1tE= + + + 2459.0002033 + + + 8892.4800253 + + + + + AQAAAACAAADAAgAAnAAAAA==eJwtxdciAgAAAMBKympIaNBCyChCZCcRSbL+/0966O7lAoGpoEOecdizjjjqOc97wYtecsxxJ5z0slNecdqrXvO6M84657w3vOmCiy657Iq3vO0dV73rPe+75gMf+sjHrrvhE5+66TOf+8ItX/rKbV/7xre+870f/OiOn9z1s3t+8av7fvO7B/7w0J8e+ctjf/vHv/7zvyfgYw71 + + + + + AQAAAACAAAD4AQAAbQAAAA==eJwtxUOCAwEAALCpbdvmosb/n9VDk0uC4CvksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrHv/7zv08+++Krb7774adffvsDGEMHog== + + + + + AQAAAACAAAAgBAAA4gAAAA==eJxN070JwzAYhOGbIrVGUaFBPIqmcK1RVDitwZDCYLCcTBLJhe9VdXw8HJ/8I81Jer0Vf4vuPC/O/XienLsP8AE+wAd4wQte8IK/vvZP7sfz5Nx9ha/wFb7CF/gCX+ALfIbP8Bk+w0/wE/wEP8FH+Agf4SN8gA/wAT7AC17wghfve+G+l73nyXn0wwte8ILPDf0N/Q39Df3wghe84POJ/hP9J/pP+3jg+R/2nifnsc+OfXbss2Of3b5+8H1+7D1PzmP/Dftv9p4n57H/iv1Xe8+T8/i/Fvsn36/Lvuc/fxk9eg== + + + 1980.0568174 + + + 3236.6803982 + + + + + + + AQAAAACAAADgBwAAPwEAAA==eJxdzNsyAgAURuEQQgghRCGEEEIIIYSQ8/u/iQt73ax988+s+WYnEv/XE9sfm1TvjR2Qo/fFDsol5YdiU+r4YTk6f0fkUvKjsWl1/Jgcnb/jcmn5idiMOn5Sjs7fKbmM/HRsVh0/I0fn76xcVn4uNqeOn5ej83dBLie/GJtXxy/J0flbkMvLL8cW1fErcnT+rsoV5ddiS+r4dTk6fzfkSvKbsWV1/JYcnb/bcmX5ndiKOn5Xjs7fPbmK/H5sVR1/IEfn76FcVf4otqaOP5aj8/dEriZ/GltXx5/J0fl7LleXv4htqOMv5ej8vZJryF/HNtXxN3J0/t7KNeXvYlvq+Hs5On8f5Fryj7FtdfyTHJ2/z3Jt+ZfYjjr+VY7O3ze5jvx7bFcd/yFH5++nXFf+O/ZLHf8jR+fvr9wfDAUq0w== + + + AQAAAACAAAD4AQAAlAAAAA==eJwtxRFgAgAAALAgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCILgcDgcgiAIgiAIgiAI2mTBwFfIYUccdcxxJ5x0ymlnnHXOeRdcdMllV1x1zXU33HTLbXfcdc99Dzz0yGNPPPXMcy+89Mprb7z1znsf/ONf//nfR5989sVX33z3w0+//PYHVzMfgQ== + + + AQAAAACAAAA/AAAADAAAAA==eJxjZ6cIAAA3XwG6 + + + + + diff --git a/inputFiles/poromechanicsFractures/poromechanicsFractures.ats b/inputFiles/poromechanicsFractures/poromechanicsFractures.ats index 5cbe443b5a9..fade17ec165 100644 --- a/inputFiles/poromechanicsFractures/poromechanicsFractures.ats +++ b/inputFiles/poromechanicsFractures/poromechanicsFractures.ats @@ -82,7 +82,14 @@ decks = [ restart_step=0, check_step=12, restartcheck_params=RestartcheckParameters(atol=1e-05, - rtol=4e-04)) + rtol=4e-04)), + TestDeck( + name="singlePhasePoromechanics_FaultModel_smoke", + description='PoroElastic conformingFracture intialization with external mesh', + partitions=((1, 1, 1), (2, 2, 1)), + restart_step=0, + check_step=1, + restartcheck_params=RestartcheckParameters(**restartcheck_params)) ] generate_geos_tests(decks) diff --git a/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_base.xml b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_base.xml new file mode 100644 index 00000000000..bd3bba82795 --- /dev/null +++ b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_base.xml @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_smoke.xml b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_smoke.xml new file mode 100644 index 00000000000..78bb944d446 --- /dev/null +++ b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_smoke.xml @@ -0,0 +1,119 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/verticalFault_ExternalMesh.vtm b/inputFiles/poromechanicsFractures/verticalFault_ExternalMesh.vtm new file mode 100644 index 00000000000..14785b5f2ab --- /dev/null +++ b/inputFiles/poromechanicsFractures/verticalFault_ExternalMesh.vtm @@ -0,0 +1,14 @@ + + + + + + + diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index 9dee49fe87d..0f76ab7b85f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -305,12 +305,12 @@ void SinglePhaseFVM< BASE >::applySystemSolution( DofManager const & dofManager, } ); } -template< > -void SinglePhaseFVM< SinglePhaseBase >::assembleFluxTerms( real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template<> +void SinglePhaseFVM<>::assembleFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; @@ -831,12 +831,12 @@ void SinglePhaseFVM< SinglePhaseProppantBase >::applyAquiferBC( real64 const GEO } template<> -void SinglePhaseFVM< SinglePhaseBase >::applyAquiferBC( real64 const time, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const +void SinglePhaseFVM<>::applyAquiferBC( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) const { GEOS_MARK_FUNCTION; @@ -902,9 +902,9 @@ void SinglePhaseFVM< SinglePhaseBase >::applyAquiferBC( real64 const time, namespace { -typedef SinglePhaseFVM< SinglePhaseBase > NoProppant; -typedef SinglePhaseFVM< SinglePhaseProppantBase > Proppant; -REGISTER_CATALOG_ENTRY( SolverBase, NoProppant, string const &, Group * const ) -REGISTER_CATALOG_ENTRY( SolverBase, Proppant, string const &, Group * const ) +typedef SinglePhaseFVM< SinglePhaseProppantBase > SinglePhaseFVMProppant; +REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseFVMProppant, string const &, Group * const ) +typedef SinglePhaseFVM<> SinglePhaseFVM; +REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseFVM, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index 33d8a7881cc..6cb5b0f5a6d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -51,7 +51,7 @@ CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: template<> CompositionalMultiphaseBase * -CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase >:: +CompositionalMultiphaseReservoirAndWells<>:: flowSolver() const { return this->reservoirSolver(); @@ -59,7 +59,7 @@ flowSolver() const template<> CompositionalMultiphaseBase * -CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics< CompositionalMultiphaseBase > >:: +CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> >:: flowSolver() const { return this->reservoirSolver()->flowSolver(); @@ -67,7 +67,7 @@ flowSolver() const template<> void -CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase >:: +CompositionalMultiphaseReservoirAndWells<>:: setMGRStrategy() { if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM ) @@ -84,7 +84,7 @@ setMGRStrategy() template<> void -CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics< CompositionalMultiphaseBase > >:: +CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> >:: setMGRStrategy() { // flow solver here is indeed flow solver, not poromechanics solver @@ -426,13 +426,13 @@ assembleCouplingTerms( real64 const time_n, } ); } -template class CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase >; -template class CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics< CompositionalMultiphaseBase > >; +template class CompositionalMultiphaseReservoirAndWells<>; +template class CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> >; namespace { -typedef CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > CompositionalMultiphaseFlowAndWells; -typedef CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics< CompositionalMultiphaseBase > > CompositionalMultiphasePoromechanicsAndWells; +typedef CompositionalMultiphaseReservoirAndWells<> CompositionalMultiphaseFlowAndWells; +typedef CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> > CompositionalMultiphasePoromechanicsAndWells; REGISTER_CATALOG_ENTRY( SolverBase, CompositionalMultiphaseFlowAndWells, string const &, Group * const ) REGISTER_CATALOG_ENTRY( SolverBase, CompositionalMultiphasePoromechanicsAndWells, string const &, Group * const ) } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index cc77ff42863..b914a97a273 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -27,7 +27,7 @@ namespace geos { /// @tparam RESERVOIR_SOLVER compositional flow or compositional poromechanics solver -template< typename RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER = CompositionalMultiphaseBase > class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERVOIR_SOLVER, CompositionalMultiphaseWell > { diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index 0a5d2f4eff4..f309a81a8f2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -127,7 +127,8 @@ class CoupledReservoirAndWellsBase : public CoupledSolver< RESERVOIR_SOLVER, WEL { GEOS_MARK_FUNCTION; - GEOS_UNUSED_VAR( setSparsity ); + // call reservoir solver setup (needed in case of SinglePhasePoromechanicsConformingFractures) + reservoirSolver()->setupSystem( domain, dofManager, localMatrix, rhs, solution, setSparsity ); dofManager.setDomain( domain ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 530f813f82b..971b3852b78 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -1125,8 +1125,8 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( D namespace { typedef HydrofractureSolver<> SinglePhaseHydrofracture; -// typedef HydrofractureSolver< MultiphasePoromechanics< CompositionalMultiphaseBase > > MultiphaseHydrofracture; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseHydrofracture, string const &, Group * const ) +// typedef HydrofractureSolver< MultiphasePoromechanics<> > MultiphaseHydrofracture; // REGISTER_CATALOG_ENTRY( SolverBase, MultiphaseHydrofracture, string const &, Group * const ) } diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index 9d22911a24c..803e38153a9 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -29,7 +29,7 @@ namespace geos using dataRepository::Group; -template< typename POROMECHANICS_SOLVER = SinglePhasePoromechanics< SinglePhaseBase > > +template< typename POROMECHANICS_SOLVER = SinglePhasePoromechanics<> > class HydrofractureSolver : public POROMECHANICS_SOLVER { public: diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index c497b8d9480..085e43395b5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -28,6 +28,8 @@ #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp" +//#include "physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp" +//#include "physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp" namespace geos { @@ -37,9 +39,9 @@ using namespace constitutive; using namespace fields; using namespace stabilization; -template< typename FLOW_SOLVER > -MultiphasePoromechanics< FLOW_SOLVER >::MultiphasePoromechanics( const string & name, - Group * const parent ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::MultiphasePoromechanics( const string & name, + Group * const parent ) : Base( name, parent ) { this->registerWrapper( viewKeyStruct::stabilizationTypeString(), &m_stabilizationType ). @@ -66,8 +68,8 @@ MultiphasePoromechanics< FLOW_SOLVER >::MultiphasePoromechanics( const string & linearSolverParameters.dofsPerNode = 3; } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::postProcessInput() +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postProcessInput() { Base::postProcessInput(); @@ -79,8 +81,8 @@ void MultiphasePoromechanics< FLOW_SOLVER >::postProcessInput() )); } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::registerDataOnMesh( Group & meshBodies ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::registerDataOnMesh( Group & meshBodies ) { Base::registerDataOnMesh( meshBodies ); @@ -110,22 +112,22 @@ void MultiphasePoromechanics< FLOW_SOLVER >::registerDataOnMesh( Group & meshBod } } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::setupCoupling( DomainPartition const & GEOS_UNUSED_PARAM( domain ), - DofManager & dofManager ) const +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::setupCoupling( DomainPartition const & GEOS_UNUSED_PARAM( domain ), + DofManager & dofManager ) const { dofManager.addCoupling( solidMechanics::totalDisplacement::key(), CompositionalMultiphaseBase::viewKeyStruct::elemDofFieldString(), DofManager::Connector::Elem ); } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::assembleSystem( real64 const time, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleSystem( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; @@ -158,13 +160,13 @@ void MultiphasePoromechanics< FLOW_SOLVER >::assembleSystem( real64 const time, } } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::assembleElementBasedTerms( real64 const time_n, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementBasedTerms( real64 const time_n, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_UNUSED_VAR( time_n ); GEOS_UNUSED_VAR( dt ); @@ -264,8 +266,8 @@ void MultiphasePoromechanics< FLOW_SOLVER >::assembleElementBasedTerms( real64 c this->solidMechanicsSolver()->getMaxForce() = LvArray::math::max( mechanicsMaxForce, poromechanicsMaxForce ); } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::updateState( DomainPartition & domain ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; @@ -294,8 +296,8 @@ void MultiphasePoromechanics< FLOW_SOLVER >::updateState( DomainPartition & doma this->getName(), GEOS_FMT( "{:.{}f}", maxDeltaPhaseVolFrac, 4 ) ) ); } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::initializePostInitialConditionsPreSubGroups() +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostInitialConditionsPreSubGroups() { Base::initializePostInitialConditionsPreSubGroups(); @@ -327,8 +329,8 @@ void MultiphasePoromechanics< FLOW_SOLVER >::initializePostInitialConditionsPreS } } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::initializePreSubGroups() +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePreSubGroups() { Base::initializePreSubGroups(); @@ -338,10 +340,10 @@ void MultiphasePoromechanics< FLOW_SOLVER >::initializePreSubGroups() InputError ); } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::implicitStepSetup( real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::implicitStepSetup( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) { Base::implicitStepSetup( time_n, dt, domain ); if( this->getNonlinearSolverParameters().m_couplingType == NonlinearSolverParameters::CouplingType::Sequential && @@ -352,8 +354,8 @@ void MultiphasePoromechanics< FLOW_SOLVER >::implicitStepSetup( real64 const & t } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::updateStabilizationParameters( DomainPartition & domain ) const +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateStabilizationParameters( DomainPartition & domain ) const { // Step 1: we loop over the regions where stabilization is active and collect their name @@ -416,8 +418,8 @@ void MultiphasePoromechanics< FLOW_SOLVER >::updateStabilizationParameters( Doma } ); } -template< typename FLOW_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER >::updateBulkDensity( ElementSubRegionBase & subRegion ) +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateBulkDensity( ElementSubRegionBase & subRegion ) { // get the fluid model (to access fluid density) string const fluidName = subRegion.getReference< string >( FlowSolverBase::viewKeyStruct::fluidNamesString() ); @@ -436,14 +438,16 @@ void MultiphasePoromechanics< FLOW_SOLVER >::updateBulkDensity( ElementSubRegion subRegion ); } -template class MultiphasePoromechanics< CompositionalMultiphaseBase >; -template class MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > >; +template class MultiphasePoromechanics<>; +//template class MultiphasePoromechanics< CompositionalMultiphaseBase, SolidMechanicsLagrangeContact >; +//template class MultiphasePoromechanics< CompositionalMultiphaseBase, SolidMechanicsEmbeddedFractures >; +template class MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells<> >; namespace { -typedef MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > > MultiphaseReservoirPoromechanics; +typedef MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells<> > MultiphaseReservoirPoromechanics; REGISTER_CATALOG_ENTRY( SolverBase, MultiphaseReservoirPoromechanics, string const &, Group * const ) -typedef MultiphasePoromechanics< CompositionalMultiphaseBase > MultiphasePoromechanics; +typedef MultiphasePoromechanics<> MultiphasePoromechanics; REGISTER_CATALOG_ENTRY( SolverBase, MultiphasePoromechanics, string const &, Group * const ) } diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index 2a102fcf3ba..22873b8660a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -41,12 +41,12 @@ ENUM_STRINGS( StabilizationType, "Local" ); } -template< typename FLOW_SOLVER > -class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER > +template< typename FLOW_SOLVER = CompositionalMultiphaseBase, typename MECHANICS_SOLVER = SolidMechanicsLagrangianFEM > +class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANICS_SOLVER > { public: - using Base = PoromechanicsSolver< FLOW_SOLVER >; + using Base = PoromechanicsSolver< FLOW_SOLVER, MECHANICS_SOLVER >; using Base::m_solvers; using Base::m_dofManager; using Base::m_localMatrix; @@ -176,18 +176,18 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER > }; -template< typename FLOW_SOLVER > +template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > template< typename CONSTITUTIVE_BASE, typename KERNEL_WRAPPER, typename ... PARAMS > -real64 MultiphasePoromechanics< FLOW_SOLVER >::assemblyLaunch( MeshLevel & mesh, - DofManager const & dofManager, - arrayView1d< string const > const & regionNames, - string const & materialNamesString, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - real64 const dt, - PARAMS && ... params ) +real64 MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assemblyLaunch( MeshLevel & mesh, + DofManager const & dofManager, + arrayView1d< string const > const & regionNames, + string const & materialNamesString, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + real64 const dt, + PARAMS && ... params ) { GEOS_MARK_FUNCTION; diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index bdfe7cff940..5cf7d5d791e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -21,6 +21,8 @@ #include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/multiphysics/MultiphasePoromechanics.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" +#include "physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp" +#include "physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp" #include "physicsSolvers/multiphysics/HydrofractureSolver.hpp" #include "mainInterface/ProblemManager.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" @@ -130,14 +132,18 @@ execute( real64 const time_n, namespace { -typedef PoromechanicsInitialization< MultiphasePoromechanics< CompositionalMultiphaseBase > > MultiphasePoromechanicsInitialization; -typedef PoromechanicsInitialization< MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > > > MultiphaseReservoirPoromechanicsInitialization; -typedef PoromechanicsInitialization< SinglePhasePoromechanics< SinglePhaseBase > > SinglePhasePoromechanicsInitialization; -typedef PoromechanicsInitialization< SinglePhasePoromechanics< SinglePhaseReservoirAndWells< SinglePhaseBase > > > SinglePhaseReservoirPoromechanicsInitialization; -typedef PoromechanicsInitialization< HydrofractureSolver< SinglePhasePoromechanics< SinglePhaseBase > > > HydrofractureInitialization; +typedef PoromechanicsInitialization< MultiphasePoromechanics<> > MultiphasePoromechanicsInitialization; +typedef PoromechanicsInitialization< MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells<> > > MultiphaseReservoirPoromechanicsInitialization; +typedef PoromechanicsInitialization< SinglePhasePoromechanics<> > SinglePhasePoromechanicsInitialization; +typedef PoromechanicsInitialization< SinglePhasePoromechanicsConformingFractures<> > SinglePhasePoromechanicsConformingFracturesInitialization; +typedef PoromechanicsInitialization< SinglePhasePoromechanicsEmbeddedFractures > SinglePhasePoromechanicsEmbeddedFracturesInitialization; +typedef PoromechanicsInitialization< SinglePhasePoromechanics< SinglePhaseReservoirAndWells<> > > SinglePhaseReservoirPoromechanicsInitialization; +typedef PoromechanicsInitialization< HydrofractureSolver< SinglePhasePoromechanics<> > > HydrofractureInitialization; REGISTER_CATALOG_ENTRY( TaskBase, MultiphasePoromechanicsInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, MultiphaseReservoirPoromechanicsInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, SinglePhasePoromechanicsInitialization, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( TaskBase, SinglePhasePoromechanicsConformingFracturesInitialization, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( TaskBase, SinglePhasePoromechanicsEmbeddedFracturesInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, SinglePhaseReservoirPoromechanicsInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, HydrofractureInitialization, string const &, Group * const ) } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 31f03782e5a..db06db07c53 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -322,16 +322,18 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateBulkDensit subRegion ); } -template class SinglePhasePoromechanics< SinglePhaseBase >; +template class SinglePhasePoromechanics<>; template class SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsLagrangeContact >; template class SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsEmbeddedFractures >; -template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells< SinglePhaseBase > >; +template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells<> >; +//template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells<>, SolidMechanicsLagrangeContact >; +//template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells<>, SolidMechanicsEmbeddedFractures >; namespace { -typedef SinglePhasePoromechanics< SinglePhaseReservoirAndWells< SinglePhaseBase > > SinglePhaseReservoirPoromechanics; +typedef SinglePhasePoromechanics< SinglePhaseReservoirAndWells<> > SinglePhaseReservoirPoromechanics; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseReservoirPoromechanics, string const &, Group * const ) -typedef SinglePhasePoromechanics< SinglePhaseBase > SinglePhasePoromechanics; +typedef SinglePhasePoromechanics<> SinglePhasePoromechanics; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanics, string const &, Group * const ) } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index 113d4fc467f..34ebd3ada61 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -26,7 +26,7 @@ namespace geos { -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER = SolidMechanicsLagrangianFEM > +template< typename FLOW_SOLVER = SinglePhaseBase, typename MECHANICS_SOLVER = SolidMechanicsLagrangianFEM > class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANICS_SOLVER > { public: diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 768891b2282..fbec79f454b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -23,6 +23,7 @@ #include "linearAlgebra/solvers/BlockPreconditioner.hpp" #include "linearAlgebra/solvers/SeparateComponentPreconditioner.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" +//#include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp" @@ -36,19 +37,21 @@ using namespace constitutive; using namespace dataRepository; using namespace fields; -SinglePhasePoromechanicsConformingFractures::SinglePhasePoromechanicsConformingFractures( const string & name, - Group * const parent ) +template< typename FLOW_SOLVER > +SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::SinglePhasePoromechanicsConformingFractures( const string & name, + Group * const parent ) : Base( name, parent ) { - LinearSolverParameters & params = m_linearSolverParameters.get(); + LinearSolverParameters & params = this->m_linearSolverParameters.get(); params.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsConformingFractures; params.mgr.separateComponents = false; params.mgr.displacementFieldName = solidMechanics::totalDisplacement::key(); params.dofsPerNode = 3; } -void SinglePhasePoromechanicsConformingFractures::setupCoupling( DomainPartition const & domain, - DofManager & dofManager ) const +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::setupCoupling( DomainPartition const & domain, + DofManager & dofManager ) const { /// We need to add 2 coupling terms: // 1. Poromechanical coupling in the bulk @@ -60,12 +63,13 @@ void SinglePhasePoromechanicsConformingFractures::setupCoupling( DomainPartition DofManager::Connector::Elem ); } -void SinglePhasePoromechanicsConformingFractures::setupSystem( DomainPartition & domain, - DofManager & dofManager, - CRSMatrix< real64, globalIndex > & localMatrix, - ParallelVector & rhs, - ParallelVector & solution, - bool const setSparsity ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::setupSystem( DomainPartition & domain, + DofManager & dofManager, + CRSMatrix< real64, globalIndex > & localMatrix, + ParallelVector & rhs, + ParallelVector & solution, + bool const setSparsity ) { GEOS_MARK_FUNCTION; @@ -73,10 +77,10 @@ void SinglePhasePoromechanicsConformingFractures::setupSystem( DomainPartition & /// 1. Add all coupling terms handled directly by the DofManager dofManager.setDomain( domain ); - setupDofs( domain, dofManager ); + this->setupDofs( domain, dofManager ); dofManager.reorderByRank(); - if( getLogLevel() > 2 ) + if( this->getLogLevel() > 2 ) { dofManager.printFieldInfo(); } @@ -130,17 +134,18 @@ void SinglePhasePoromechanicsConformingFractures::setupSystem( DomainPartition & // } } -void SinglePhasePoromechanicsConformingFractures::assembleSystem( real64 const time_n, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::assembleSystem( real64 const time_n, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; - solidMechanicsSolver()->synchronizeFractureState( domain ); + this->solidMechanicsSolver()->synchronizeFractureState( domain ); assembleElementBasedContributions( time_n, dt, @@ -150,13 +155,13 @@ void SinglePhasePoromechanicsConformingFractures::assembleSystem( real64 const t localRhs ); // Assemble fluxes 3D/2D and get dFluidResidualDAperture - flowSolver()->assembleHydrofracFluxTerms( time_n, - dt, - domain, - dofManager, - localMatrix, - localRhs, - getDerivativeFluxResidual_dNormalJump() ); + this->flowSolver()->assembleHydrofracFluxTerms( time_n, + dt, + domain, + dofManager, + localMatrix, + localRhs, + getDerivativeFluxResidual_dNormalJump() ); // This step must occur after the fluxes are assembled because that's when DerivativeFluxResidual_dAperture is filled. assembleCouplingTerms( time_n, @@ -167,12 +172,13 @@ void SinglePhasePoromechanicsConformingFractures::assembleSystem( real64 const t localRhs ); } -void SinglePhasePoromechanicsConformingFractures::assembleElementBasedContributions( real64 const time_n, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::assembleElementBasedContributions( real64 const time_n, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_UNUSED_VAR( time_n, dt ); @@ -181,32 +187,33 @@ void SinglePhasePoromechanicsConformingFractures::assembleElementBasedContributi Base::assembleElementBasedTerms( time_n, dt, domain, dofManager, localMatrix, localRhs ); // Flow accumulation for fractures - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { mesh.getElemManager().forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, FaceElementSubRegion const & subRegion ) { - flowSolver()->accumulationAssemblyLaunch( dofManager, subRegion, localMatrix, localRhs ); + this->flowSolver()->accumulationAssemblyLaunch( dofManager, subRegion, localMatrix, localRhs ); } ); } ); - solidMechanicsSolver()->assembleContact( domain, dofManager, localMatrix, localRhs ); + this->solidMechanicsSolver()->assembleContact( domain, dofManager, localMatrix, localRhs ); } -void SinglePhasePoromechanicsConformingFractures::assembleCouplingTerms( real64 const time_n, - real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::assembleCouplingTerms( real64 const time_n, + real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_UNUSED_VAR( time_n, dt ); // These 2 steps need to occur after the fluxes are assembled because that's when DerivativeFluxResidual_dAperture is filled. - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & regionNames ) + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) { /// 3. assemble Force Residual w.r.t. pressure and Flow mass residual w.r.t. displacement assembleForceResidualDerivativeWrtPressure( mesh, regionNames, dofManager, localMatrix, localRhs ); @@ -214,14 +221,15 @@ void SinglePhasePoromechanicsConformingFractures::assembleCouplingTerms( real64 } ); } -void SinglePhasePoromechanicsConformingFractures:: - setUpDflux_dApertureMatrix( DomainPartition & domain, - DofManager const & GEOS_UNUSED_PARAM( dofManager ), - CRSMatrix< real64, globalIndex > & localMatrix ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >:: +setUpDflux_dApertureMatrix( DomainPartition & domain, + DofManager const & GEOS_UNUSED_PARAM( dofManager ), + CRSMatrix< real64, globalIndex > & localMatrix ) { - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & regionNames ) + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) { std::unique_ptr< CRSMatrix< real64, localIndex > > & derivativeFluxResidual_dAperture = this->getRefDerivativeFluxResidual_dAperture(); @@ -252,7 +260,7 @@ void SinglePhasePoromechanicsConformingFractures:: NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); - FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( flowSolver()->getDiscretizationName() ); + FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( this->flowSolver()->getDiscretizationName() ); fluxApprox.forStencils< SurfaceElementStencil >( mesh, [&]( SurfaceElementStencil const & stencil ) { @@ -273,16 +281,17 @@ void SinglePhasePoromechanicsConformingFractures:: } ); } -void SinglePhasePoromechanicsConformingFractures:: - addTransmissibilityCouplingNNZ( DomainPartition const & domain, - DofManager const & dofManager, - arrayView1d< localIndex > const & rowLengths ) const +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >:: +addTransmissibilityCouplingNNZ( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< localIndex > const & rowLengths ) const { GEOS_MARK_FUNCTION; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, // meshBodyName, - MeshLevel const & mesh, - arrayView1d< string const > const & ) // regionNames + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, // meshBodyName, + MeshLevel const & mesh, + arrayView1d< string const > const & ) // regionNames { ElementRegionManager const & elemManager = mesh.getElemManager(); @@ -292,7 +301,7 @@ void SinglePhasePoromechanicsConformingFractures:: NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); - FluxApproximationBase const & stabilizationMethod = fvManager.getFluxApproximation( solidMechanicsSolver()->getStabilizationName() ); + FluxApproximationBase const & stabilizationMethod = fvManager.getFluxApproximation( this->solidMechanicsSolver()->getStabilizationName() ); stabilizationMethod.forStencils< SurfaceElementStencil >( mesh, [&]( SurfaceElementStencil const & stencil ) { @@ -335,16 +344,17 @@ void SinglePhasePoromechanicsConformingFractures:: } ); } -void SinglePhasePoromechanicsConformingFractures:: - addTransmissibilityCouplingPattern( DomainPartition const & domain, - DofManager const & dofManager, - SparsityPatternView< globalIndex > const & pattern ) const +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >:: +addTransmissibilityCouplingPattern( DomainPartition const & domain, + DofManager const & dofManager, + SparsityPatternView< globalIndex > const & pattern ) const { GEOS_MARK_FUNCTION; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & ) + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & ) { FaceManager const & faceManager = mesh.getFaceManager(); NodeManager const & nodeManager = mesh.getNodeManager(); @@ -360,15 +370,15 @@ void SinglePhasePoromechanicsConformingFractures:: // Get the finite volume method used to compute the stabilization NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); - FluxApproximationBase const & stabilizationMethod = fvManager.getFluxApproximation( solidMechanicsSolver()->getStabilizationName() ); + FluxApproximationBase const & stabilizationMethod = fvManager.getFluxApproximation( this->solidMechanicsSolver()->getStabilizationName() ); SurfaceElementRegion const & fractureRegion = - elemManager.getRegion< SurfaceElementRegion >( solidMechanicsSolver()->getUniqueFractureRegionName() ); + elemManager.getRegion< SurfaceElementRegion >( this->solidMechanicsSolver()->getUniqueFractureRegionName() ); FaceElementSubRegion const & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); GEOS_ERROR_IF( !fractureSubRegion.hasWrapper( flow::pressure::key() ), - getDataContext() << ": The fracture subregion must contain pressure field." ); + this->getDataContext() << ": The fracture subregion must contain pressure field." ); ArrayOfArraysView< localIndex const > const elem2dToFaces = fractureSubRegion.faceList().toViewConst(); @@ -430,12 +440,13 @@ void SinglePhasePoromechanicsConformingFractures:: } ); } -void SinglePhasePoromechanicsConformingFractures:: - assembleForceResidualDerivativeWrtPressure( MeshLevel const & mesh, - arrayView1d< string const > const & regionNames, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >:: +assembleForceResidualDerivativeWrtPressure( MeshLevel const & mesh, + arrayView1d< string const > const & regionNames, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; @@ -490,7 +501,7 @@ void SinglePhasePoromechanicsConformingFractures:: { // Compute local area contribution for each node array1d< real64 > nodalArea; - solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); + this->solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); real64 const nodalForceMag = -( pressure[kfe] ) * nodalArea[a]; array1d< real64 > globalNodalForce( 3 ); @@ -525,12 +536,13 @@ void SinglePhasePoromechanicsConformingFractures:: } ); } -void SinglePhasePoromechanicsConformingFractures:: - assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, - arrayView1d< string const > const & regionNames, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & GEOS_UNUSED_PARAM( localRhs ) ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >:: +assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, + arrayView1d< string const > const & regionNames, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & GEOS_UNUSED_PARAM( localRhs ) ) { GEOS_MARK_FUNCTION; @@ -560,7 +572,7 @@ void SinglePhasePoromechanicsConformingFractures:: { string const & fluidName = subRegion.getReference< string >( FlowSolverBase::viewKeyStruct::fluidNamesString() ); - SingleFluidBase const & fluid = getConstitutiveModel< SingleFluidBase >( subRegion, fluidName ); + SingleFluidBase const & fluid = this->template getConstitutiveModel< SingleFluidBase >( subRegion, fluidName ); arrayView2d< real64 const > const & density = fluid.density(); arrayView1d< globalIndex const > const & presDofNumber = subRegion.getReference< array1d< globalIndex > >( presDofKey ); @@ -595,7 +607,7 @@ void SinglePhasePoromechanicsConformingFractures:: { // Compute local area contribution for each node array1d< real64 > nodalArea; - solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); + this->solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); // TODO: move to something like this plus a static method. // localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elemsToFaces[kfe][kf] ); @@ -646,7 +658,7 @@ void SinglePhasePoromechanicsConformingFractures:: { // Compute local area contribution for each node array1d< real64 > nodalArea; - solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe2][kf], nodalArea ); + this->solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe2][kf], nodalArea ); for( localIndex a=0; a +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; // call base poromechanics update Base::updateState( domain ); // need to call solid mechanics update separately to compute face displacement jump - solidMechanicsSolver()->updateState( domain ); + this->solidMechanicsSolver()->updateState( domain ); // remove the contribution of the hydraulic aperture from the stencil weights - flowSolver()->prepareStencilWeights( domain ); + this->flowSolver()->prepareStencilWeights( domain ); updateHydraulicApertureAndFracturePermeability( domain ); // update the stencil weights using the updated hydraulic aperture - flowSolver()->updateStencilWeights( domain ); + this->flowSolver()->updateStencilWeights( domain ); } -void SinglePhasePoromechanicsConformingFractures::updateHydraulicApertureAndFracturePermeability( DomainPartition & domain ) +template< typename FLOW_SOLVER > +void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::updateHydraulicApertureAndFracturePermeability( DomainPartition & domain ) { - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + this->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { ElementRegionManager & elemManager = mesh.getElemManager(); @@ -746,6 +760,16 @@ void SinglePhasePoromechanicsConformingFractures::updateHydraulicApertureAndFrac } ); } +template class SinglePhasePoromechanicsConformingFractures<>; +//template class SinglePhasePoromechanicsConformingFractures< SinglePhaseReservoirAndWells<> >; + +namespace +{ +//typedef SinglePhasePoromechanicsConformingFractures< SinglePhaseReservoirAndWells<> > +// SinglePhaseReservoirPoromechanicsConformingFractures; +//REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseReservoirPoromechanicsConformingFractures, string const &, Group * const ) +typedef SinglePhasePoromechanicsConformingFractures<> SinglePhasePoromechanicsConformingFractures; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsConformingFractures, string const &, Group * const ) +} } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp index 57f6a327662..8008e8b5f82 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp @@ -23,15 +23,17 @@ #include "physicsSolvers/multiphysics/CoupledSolver.hpp" #include "physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" +#include "dataRepository/Group.hpp" namespace geos { -class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsLagrangeContact > +template< typename FLOW_SOLVER = SinglePhaseBase > +class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechanics< FLOW_SOLVER, SolidMechanicsLagrangeContact > { public: - using Base = SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsLagrangeContact >; + using Base = SinglePhasePoromechanics< FLOW_SOLVER, SolidMechanicsLagrangeContact >; using Base::m_solvers; using Base::m_dofManager; using Base::m_localMatrix; @@ -47,7 +49,7 @@ class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechan * @param parent the parent group of this instantiation of SinglePhasePoromechanicsConformingFractures */ SinglePhasePoromechanicsConformingFractures( const string & name, - Group * const parent ); + dataRepository::Group * const parent ); /// Destructor for the class ~SinglePhasePoromechanicsConformingFractures() override {} @@ -57,7 +59,18 @@ class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechan * @return string that contains the catalog name to generate a new SinglePhasePoromechanicsConformingFractures object through the object * catalog. */ - static string catalogName() { return "SinglePhasePoromechanicsConformingFractures"; } + static string catalogName() + { + if constexpr ( std::is_same_v< FLOW_SOLVER, SinglePhaseBase > ) + { + return "SinglePhasePoromechanicsConformingFractures"; + } + else + { + return FLOW_SOLVER::catalogName() + "PoromechanicsConformingFractures"; + } + } + /** * @copydoc SolverBase::getCatalogName() */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index e4de7d21414..1fce8ac29e9 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -26,6 +26,7 @@ #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" +#include "physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp" namespace geos { @@ -47,15 +48,15 @@ SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: template<> SinglePhaseBase * -SinglePhaseReservoirAndWells< SinglePhaseBase >:: +SinglePhaseReservoirAndWells<>:: flowSolver() const { return this->reservoirSolver(); } -template<> +template< typename POROMECHANICS_SOLVER > SinglePhaseBase * -SinglePhaseReservoirAndWells< SinglePhasePoromechanics< SinglePhaseBase > >:: +SinglePhaseReservoirAndWells< POROMECHANICS_SOLVER >:: flowSolver() const { return this->reservoirSolver()->flowSolver(); @@ -63,7 +64,7 @@ flowSolver() const template<> void -SinglePhaseReservoirAndWells< SinglePhaseBase >:: +SinglePhaseReservoirAndWells<>:: setMGRStrategy() { if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseHybridFVM ) @@ -78,9 +79,9 @@ setMGRStrategy() } } -template<> +template< typename POROMECHANICS_SOLVER > void -SinglePhaseReservoirAndWells< SinglePhasePoromechanics< SinglePhaseBase > >:: +SinglePhaseReservoirAndWells< POROMECHANICS_SOLVER >:: setMGRStrategy() { // flow solver here is indeed flow solver, not poromechanics solver @@ -340,15 +341,18 @@ assembleCouplingTerms( real64 const time_n, } -template class SinglePhaseReservoirAndWells< SinglePhaseBase >; -template class SinglePhaseReservoirAndWells< SinglePhasePoromechanics< SinglePhaseBase > >; +template class SinglePhaseReservoirAndWells<>; +template class SinglePhaseReservoirAndWells< SinglePhasePoromechanics<> >; +template class SinglePhaseReservoirAndWells< SinglePhasePoromechanicsConformingFractures<> >; namespace { -typedef SinglePhaseReservoirAndWells< SinglePhaseBase > SinglePhaseFlowAndWells; -typedef SinglePhaseReservoirAndWells< SinglePhasePoromechanics< SinglePhaseBase > > SinglePhasePoromechanicsAndWells; +typedef SinglePhaseReservoirAndWells<> SinglePhaseFlowAndWells; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseFlowAndWells, string const &, Group * const ) +typedef SinglePhaseReservoirAndWells< SinglePhasePoromechanics<> > SinglePhasePoromechanicsAndWells; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsAndWells, string const &, Group * const ) +typedef SinglePhaseReservoirAndWells< SinglePhasePoromechanicsConformingFractures<> > SinglePhasePoromechanicsConformingFracturesAndWells; +REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsConformingFracturesAndWells, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 086a968f49d..145d21507c1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -27,7 +27,7 @@ namespace geos { /// @tparam RESERVOIR_SOLVER single-phase flow or single-phase poromechanics solver -template< typename RESERVOIR_SOLVER > +template< typename RESERVOIR_SOLVER = SinglePhaseBase > class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERVOIR_SOLVER, SinglePhaseWell > { @@ -90,6 +90,22 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERV CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) const { flowSolver()->assembleFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } + void + assembleHydrofracFluxTerms( real64 const time_n, + real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + CRSMatrixView< real64, localIndex const > const & dR_dAper ) + { flowSolver()->assembleHydrofracFluxTerms( time_n, dt, domain, dofManager, localMatrix, localRhs, dR_dAper ); } + + template< typename SUBREGION_TYPE > + void accumulationAssemblyLaunch( DofManager const & dofManager, + SUBREGION_TYPE const & subRegion, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { flowSolver()->accumulationAssemblyLaunch( dofManager, subRegion, localMatrix, localRhs ); } void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) { flowSolver()->setKeepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } @@ -107,6 +123,11 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERV virtual void saveSequentialIterationState( DomainPartition & domain ) override { flowSolver()->saveSequentialIterationState( domain ); } + void prepareStencilWeights( DomainPartition & domain ) const + { flowSolver()->prepareStencilWeights( domain ); } + void updateStencilWeights( DomainPartition & domain ) const + { flowSolver()->updateStencilWeights( domain ); } + protected: virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp index 0477b968d6a..beffe24f94d 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp @@ -89,7 +89,7 @@ void setupProblemFromXML( ProblemManager & problemManager, char const * const xm problemManager.applyInitialConditions(); } -void testMobilityNumericalDerivatives( SinglePhaseFVM< SinglePhaseBase > & solver, +void testMobilityNumericalDerivatives( SinglePhaseFVM<> & solver, DomainPartition & domain, bool const isThermal, real64 const perturbParameter, diff --git a/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp index 05a369aa969..033f1952c0a 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp @@ -150,7 +150,7 @@ char const * xmlInput = // Sphinx end before input XML template< typename LAMBDA > -void testNumericalJacobian( SinglePhaseFVM< SinglePhaseBase > & solver, +void testNumericalJacobian( SinglePhaseFVM<> & solver, DomainPartition & domain, real64 const perturbParameter, real64 const relTol, @@ -211,7 +211,7 @@ class ThermalSinglePhaseFlowTest : public ::testing::Test { setupProblemFromXML( state.getProblemManager(), xmlInput ); - solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< SinglePhaseFVM< SinglePhaseBase > >( "singleflow" ); + solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< SinglePhaseFVM<> >( "singleflow" ); DomainPartition & domain = state.getProblemManager().getDomainPartition(); @@ -229,7 +229,7 @@ class ThermalSinglePhaseFlowTest : public ::testing::Test static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); GeosxState state; - SinglePhaseFVM< SinglePhaseBase > * solver; + SinglePhaseFVM<> * solver; }; real64 constexpr ThermalSinglePhaseFlowTest::time; diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp index ecda9cd636d..7154c749706 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp @@ -196,7 +196,7 @@ char const * xmlInput = )xml"; template< typename LAMBDA > -void testNumericalJacobian( CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > & solver, +void testNumericalJacobian( CompositionalMultiphaseReservoirAndWells<> & solver, DomainPartition & domain, real64 const perturbParameter, real64 const relTol, @@ -471,7 +471,7 @@ class CompositionalMultiphaseReservoirSolverTest : public ::testing::Test void SetUp() override { setupProblemFromXML( state.getProblemManager(), xmlInput ); - solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > >( "reservoirSystem" ); + solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< CompositionalMultiphaseReservoirAndWells<> >( "reservoirSystem" ); DomainPartition & domain = state.getProblemManager().getDomainPartition(); @@ -489,7 +489,7 @@ class CompositionalMultiphaseReservoirSolverTest : public ::testing::Test static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); GeosxState state; - CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > * solver; + CompositionalMultiphaseReservoirAndWells<> * solver; }; real64 constexpr CompositionalMultiphaseReservoirSolverTest::time; diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp index 2948d71f72c..78e3ab3997d 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp @@ -136,7 +136,7 @@ char const * PostXmlInput = )xml"; template< typename LAMBDA > -void testNumericalJacobian( SinglePhaseReservoirAndWells< SinglePhaseBase > & solver, +void testNumericalJacobian( SinglePhaseReservoirAndWells<> & solver, DomainPartition & domain, real64 const perturbParameter, real64 const relTol, @@ -345,7 +345,7 @@ class SinglePhaseReservoirSolverTest : public ::testing::Test void SetUp() override { - solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< SinglePhaseReservoirAndWells< SinglePhaseBase > >( "reservoirSystem" ); + solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< SinglePhaseReservoirAndWells<> >( "reservoirSystem" ); DomainPartition & domain = state.getProblemManager().getDomainPartition(); @@ -423,7 +423,7 @@ class SinglePhaseReservoirSolverTest : public ::testing::Test static real64 constexpr EPS = std::numeric_limits< real64 >::epsilon(); GeosxState state; - SinglePhaseReservoirAndWells< SinglePhaseBase > * solver; + SinglePhaseReservoirAndWells<> * solver; }; real64 constexpr SinglePhaseReservoirSolverTest::TIME; From 880d43cedee66a159918a1c3e9e10f991bddd892 Mon Sep 17 00:00:00 2001 From: MelReyCG <122801580+MelReyCG@users.noreply.github.com> Date: Fri, 14 Jun 2024 15:16:14 +0200 Subject: [PATCH 093/286] Adding SourceFluxStatistics (#2954) --- .../codingUtilities/UnitTestUtilities.hpp | 16 +- src/coreComponents/common/DataTypes.cpp | 4 +- src/coreComponents/common/Units.hpp | 32 + src/coreComponents/dataRepository/Group.cpp | 5 +- src/coreComponents/dataRepository/Group.hpp | 9 + src/coreComponents/dataRepository/Wrapper.hpp | 9 + .../dataRepository/WrapperBase.hpp | 11 + .../fieldSpecification/CMakeLists.txt | 2 + .../SourceFluxBoundaryCondition.cpp | 13 + .../SourceFluxStatistics.cpp | 362 ++++++ .../SourceFluxStatistics.hpp | 420 ++++++ src/coreComponents/mesh/ElementRegionBase.hpp | 14 + .../physicsSolvers/SolverBase.hpp | 1 + .../physicsSolvers/SolverStatistics.hpp | 48 + .../fluidFlow/CompositionalMultiphaseBase.cpp | 32 +- .../fluidFlow/CompositionalMultiphaseBase.hpp | 6 + .../CompositionalMultiphaseStatistics.cpp | 8 +- .../fluidFlow/FlowSolverBase.hpp | 7 + .../ReactiveCompositionalMultiphaseOBL.cpp | 19 +- .../fluidFlow/SinglePhaseBase.cpp | 73 +- .../fluidFlow/SinglePhaseStatistics.cpp | 2 +- .../fluidFlow/SinglePhaseStatistics.hpp | 7 +- .../docs/CompositionalMultiphaseFVM.rst | 2 +- .../docs/CompositionalMultiphaseHybridFVM.rst | 2 +- .../schema/docs/SinglePhaseFVM.rst | 40 +- .../schema/docs/SinglePhaseHybridFVM.rst | 40 +- .../schema/docs/SinglePhaseProppantFVM.rst | 40 +- src/coreComponents/schema/docs/SourceFlux.rst | 32 +- .../schema/docs/SourceFluxStatistics.rst | 16 + .../docs/SourceFluxStatistics_other.rst | 9 + src/coreComponents/schema/docs/Tasks.rst | 1 + .../schema/docs/Tasks_other.rst | 1 + src/coreComponents/schema/schema.xsd | 46 +- src/coreComponents/schema/schema.xsd.other | 2 + src/coreComponents/unitTests/CMakeLists.txt | 3 +- .../unitTests/fluidFlowTests/CMakeLists.txt | 12 +- .../fluidFlowTests/testFlowStatistics.cpp | 1146 +++++++++++++++++ .../unitTests/testingUtilities/CMakeLists.txt | 33 + .../testingUtilities/TestingTasks.cpp | 50 + .../testingUtilities/TestingTasks.hpp | 80 ++ src/docs/sphinx/CompleteXMLSchema.rst | 14 + 41 files changed, 2508 insertions(+), 161 deletions(-) create mode 100644 src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp create mode 100644 src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp create mode 100644 src/coreComponents/schema/docs/SourceFluxStatistics.rst create mode 100644 src/coreComponents/schema/docs/SourceFluxStatistics_other.rst create mode 100644 src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp create mode 100644 src/coreComponents/unitTests/testingUtilities/CMakeLists.txt create mode 100644 src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp create mode 100644 src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp diff --git a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp index 3755134d630..6eddbf6e1ce 100644 --- a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp +++ b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp @@ -82,8 +82,8 @@ T expected( T expectedSerial, constexpr real64 DEFAULT_ABS_TOL = 1E-12; constexpr real64 DEFAULT_REL_TOL = std::numeric_limits< real64 >::epsilon(); -::testing::AssertionResult checkRelativeErrorFormat( const char *, const char *, const char *, const char *, - real64 const v1, real64 const v2, real64 const relTol, real64 const absTol ) +inline ::testing::AssertionResult checkRelativeErrorFormat( const char *, const char *, const char *, const char *, + real64 const v1, real64 const v2, real64 const relTol, real64 const absTol ) { real64 const delta = std::abs( v1 - v2 ); real64 const value = std::max( std::abs( v1 ), std::abs( v2 ) ); @@ -99,23 +99,23 @@ ::testing::AssertionResult checkRelativeErrorFormat( const char *, const char *, return ::testing::AssertionSuccess(); } -::testing::AssertionResult checkRelativeErrorFormat( char const * a, char const * b, char const * c, - real64 const v1, real64 const v2, real64 const relTol ) +inline ::testing::AssertionResult checkRelativeErrorFormat( char const * a, char const * b, char const * c, + real64 const v1, real64 const v2, real64 const relTol ) { return checkRelativeErrorFormat( a, b, c, "DEFAULT_ABS_TOL", v1, v2, relTol, DEFAULT_ABS_TOL ); } -void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol ) +inline void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol ) { EXPECT_PRED_FORMAT3( checkRelativeErrorFormat, v1, v2, relTol ); } -void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, real64 const absTol ) +inline void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, real64 const absTol ) { EXPECT_PRED_FORMAT4( checkRelativeErrorFormat, v1, v2, relTol, absTol ); } -void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, string const & name ) +inline void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, string const & name ) { SCOPED_TRACE( name ); EXPECT_PRED_FORMAT3( checkRelativeErrorFormat, v1, v2, relTol ); } -void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, real64 const absTol, string const & name ) +inline void checkRelativeError( real64 const v1, real64 const v2, real64 const relTol, real64 const absTol, string const & name ) { SCOPED_TRACE( name ); EXPECT_PRED_FORMAT4( checkRelativeErrorFormat, v1, v2, relTol, absTol ); diff --git a/src/coreComponents/common/DataTypes.cpp b/src/coreComponents/common/DataTypes.cpp index f2de87138e6..c0231da13d8 100644 --- a/src/coreComponents/common/DataTypes.cpp +++ b/src/coreComponents/common/DataTypes.cpp @@ -185,8 +185,8 @@ rtTypes::RegexMapType rtTypes::createBasicTypesRegexMap() string_view const groupNameDesc = "Input value must be a string that cannot be empty and contains only upper/lower letters, digits, and the characters . - _"; string_view const groupNameRegex = "[a-zA-Z0-9.\\-_]+"; - string_view const groupNameRefDesc = "Input value must be a string that can contain only upper/lower letters, digits, and the characters . - _ /"; - string_view const groupNameRefRegex = "[a-zA-Z0-9.\\-_/]*"; + string_view const groupNameRefDesc = "Input value must be a string that can contain only upper/lower letters, digits, and the characters . - _ / *"; + string_view const groupNameRefRegex = "[a-zA-Z0-9.\\-_/*]*"; // Build master list of regexes diff --git a/src/coreComponents/common/Units.hpp b/src/coreComponents/common/Units.hpp index d760217fbb8..e072dfe460b 100644 --- a/src/coreComponents/common/Units.hpp +++ b/src/coreComponents/common/Units.hpp @@ -82,6 +82,18 @@ enum Unit : integer /// Solubility in g/L Solubility, + + /// Mass in kg + Mass, + + /// Mole in mol + Mole, + + /// Mass rate in kg/s + MassRate, + + /// Mole rate in mol/s + MoleRate, }; @@ -104,6 +116,10 @@ constexpr inline std::string_view getDescription( Unit unit ) case Enthalpy: return "enthalpy [J/kg]"; case Density: return "density [kg/m3]"; case Solubility: return "solubility [g/L]"; + case Mass: return "mass [kg]"; + case Mole: return "mole [mol]"; + case MassRate: return "mass rate [kg/s]"; + case MoleRate: return "mole rate [mol/s]"; } } @@ -122,6 +138,14 @@ constexpr inline std::string_view getSymbol( Unit unit ) case TemperatureInC: return "C"; case Distance: return "m"; case Time: return "s"; + case Viscosity: return "Pa*s"; + case Enthalpy: return "J/kg"; + case Density: return "kg/m3"; + case Solubility: return "g/L"; + case Mass: return "kg"; + case Mole: return "mol"; + case MassRate: return "kg/s"; + case MoleRate: return "mol/s"; } } @@ -143,6 +167,14 @@ inline string formatValue( real64 value, Unit unit ) case TemperatureInC: return GEOS_FMT( "temperature of {} [K]", convertCToK( value ) ); case Distance: return GEOS_FMT( "distance of {} [s]", value ); case Time: return GEOS_FMT( "time of {} [s]", value ); + case Viscosity: return GEOS_FMT( "viscosity of {} [Pa*s]", value ); + case Enthalpy: return GEOS_FMT( "enthalpy of {} [J/kg]", value ); + case Density: return GEOS_FMT( "density of {} [kg/m3]", value ); + case Solubility: return GEOS_FMT( "solubility of {} [g/L]", value ); + case Mass: return GEOS_FMT( "mass of {} [kg]", value ); + case Mole: return GEOS_FMT( "mole of {} [mol]", value ); + case MassRate: return GEOS_FMT( "mass rate of {} [kg/s]", value ); + case MoleRate: return GEOS_FMT( "mole rate of {} [mol/s]", value ); } } diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index 5be399e8449..3958a2313c8 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -644,9 +644,8 @@ void Group::postRestartInitializationRecursive() void Group::enableLogLevelInput() { - string const logLevelString = "logLevel"; - - registerWrapper( logLevelString, &m_logLevel ). + // TODO : Improve the Log Level description to clearly assign a usecase per log level (incoming PR). + registerWrapper( viewKeyStruct::logLevelString(), &m_logLevel ). setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Log level" ); diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index 6192f3cddab..84ad45f1fbe 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -1414,6 +1414,15 @@ class Group */ void setInputFlags( InputFlags flags ) { m_input_flags = flags; } + /** + * @brief Structure to hold scoped key names + */ + struct viewKeyStruct + { + /// @return String for the logLevel wrapper + static constexpr char const * logLevelString() { return "logLevel"; } + }; + ///@} /** diff --git a/src/coreComponents/dataRepository/Wrapper.hpp b/src/coreComponents/dataRepository/Wrapper.hpp index 404225490af..b3193af0ee5 100644 --- a/src/coreComponents/dataRepository/Wrapper.hpp +++ b/src/coreComponents/dataRepository/Wrapper.hpp @@ -893,6 +893,15 @@ class Wrapper final : public WrapperBase return *this; } + /** + * @copydoc WrapperBase::appendDescription(string const &) + */ + Wrapper< T > & appendDescription( string const & description ) + { + WrapperBase::appendDescription( description ); + return *this; + } + /** * @copydoc WrapperBase::setRegisteringObjects(string const &) */ diff --git a/src/coreComponents/dataRepository/WrapperBase.hpp b/src/coreComponents/dataRepository/WrapperBase.hpp index 542863e03b9..d44e24c2e6b 100644 --- a/src/coreComponents/dataRepository/WrapperBase.hpp +++ b/src/coreComponents/dataRepository/WrapperBase.hpp @@ -508,6 +508,17 @@ class WrapperBase return *this; } + /** + * @brief Add up more text to the existing description string of the wrapper. + * @param description the description to add to the end of the previous one. + * @return a pointer to this wrapper + */ + WrapperBase & appendDescription( string const & description ) + { + m_description += description; + return *this; + } + /** * @brief Get the description string of the wrapper. * @return this wrapper's description string diff --git a/src/coreComponents/fieldSpecification/CMakeLists.txt b/src/coreComponents/fieldSpecification/CMakeLists.txt index 10ad2e8ec1a..ae31a4157fc 100644 --- a/src/coreComponents/fieldSpecification/CMakeLists.txt +++ b/src/coreComponents/fieldSpecification/CMakeLists.txt @@ -10,6 +10,7 @@ set( fieldSpecification_headers TractionBoundaryCondition.hpp AquiferBoundaryCondition.hpp PerfectlyMatchedLayer.hpp + SourceFluxStatistics.hpp ) # @@ -24,6 +25,7 @@ set( fieldSpecification_sources TractionBoundaryCondition.cpp AquiferBoundaryCondition.cpp PerfectlyMatchedLayer.cpp + SourceFluxStatistics.cpp ) set( dependencyList ${parallelDeps} functions linearAlgebra ) diff --git a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp index acc3cc39981..53007480a30 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp @@ -18,6 +18,7 @@ */ #include "SourceFluxBoundaryCondition.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" namespace geos { @@ -29,6 +30,18 @@ SourceFluxBoundaryCondition::SourceFluxBoundaryCondition( string const & name, G getWrapper< string >( FieldSpecificationBase::viewKeyStruct::fieldNameString() ). setInputFlag( InputFlags::FALSE ); setFieldName( catalogName() ); + + getWrapper< string >( FieldSpecificationBase::viewKeyStruct::functionNameString() ). + setDescription( GEOS_FMT( "Name of a function that specifies the variation of the production rate variations of this {}." + "Multiplied by {}. If no function is provided, a constant value of 1 is used." + "The producted fluid rate unit is in kg by default, or in mole if the flow solver has a {} of 0.", + catalogName(), + FieldSpecificationBase::viewKeyStruct::scaleString(), + CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString() ) ); + + getWrapper< real64 >( FieldSpecificationBase::viewKeyStruct::scaleString() ). + setDescription( GEOS_FMT( "Multiplier of the {0} value. If no {0} is provided, this value is used directly.", + FieldSpecificationBase::viewKeyStruct::functionNameString() ) ); } REGISTER_CATALOG_ENTRY( FieldSpecificationBase, SourceFluxBoundaryCondition, string const &, Group * const ) diff --git a/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp b/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp new file mode 100644 index 00000000000..273f2945a24 --- /dev/null +++ b/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp @@ -0,0 +1,362 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SourceFluxStatistics.cpp + */ + +#include "SourceFluxStatistics.hpp" + +#include "SourceFluxBoundaryCondition.hpp" +#include "FieldSpecificationManager.hpp" +#include "LvArray/src/tensorOps.hpp" + +namespace geos +{ +using namespace dataRepository; + +SourceFluxStatsAggregator::SourceFluxStatsAggregator( const string & name, + Group * const parent ): + Base( name, parent ) +{ + getWrapper< integer >( Group::viewKeyStruct::logLevelString() ). + appendDescription( GEOS_FMT( "\n- Log Level 1 outputs the sum of all {0}(s) produced rate & mass,\n" + "- Log Level 2 details values for each {0},\n" + "- Log Level 3 details values for each region.", + SourceFluxBoundaryCondition::catalogName() ) ); + + registerWrapper( viewKeyStruct::fluxNamesString().data(), &m_fluxNames ). + setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). + setInputFlag( InputFlags::OPTIONAL ). + setSizedFromParent( 0 ). + setDefaultValue( "*" ). + setDescription( GEOS_FMT( "Name(s) array of the {0}(s) for which we want the statistics. " + "Use \"*\" to target all {0}.", + SourceFluxBoundaryCondition::catalogName() ) ); +} + +void SourceFluxStatsAggregator::postProcessInput() +{ + Base::postProcessInput(); + + FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); + if( m_fluxNames.size() == 1 && m_fluxNames[0] == "*" ) + { + m_fluxNames.clear(); + fsManager.forSubGroups< SourceFluxBoundaryCondition >( [&]( SourceFluxBoundaryCondition & sourceFlux ) + { + m_fluxNames.emplace_back( string( sourceFlux.getName() ) ); + } ); + GEOS_WARNING_IF( m_fluxNames.empty(), + GEOS_FMT( "{}: No {} was found in {}.", + getDataContext(), SourceFluxBoundaryCondition::catalogName(), + fsManager.getDataContext() ) ); + } + else + { + for( string const & fluxName : m_fluxNames ) + { + GEOS_ERROR_IF( !fsManager.hasGroup< SourceFluxBoundaryCondition >( fluxName ), + GEOS_FMT( "{}: No {} named {} was found in {}.", + getDataContext(), SourceFluxBoundaryCondition::catalogName(), + fluxName, fsManager.getDataContext() ) ); + } + } +} + +Wrapper< SourceFluxStatsAggregator::WrappedStats > & +SourceFluxStatsAggregator::registerWrappedStats( Group & group, + string_view fluxName, + string_view elementSetName ) +{ + string const wrapperName = getStatWrapperName( fluxName ); + Wrapper< WrappedStats > & statsWrapper = group.registerWrapper< WrappedStats >( wrapperName ); + statsWrapper.setRestartFlags( RestartFlags::NO_WRITE ); + statsWrapper.reference().setTarget( getName(), fluxName ); + + writeStatsToCSV( elementSetName, statsWrapper.reference(), true ); + + return statsWrapper; +} +void SourceFluxStatsAggregator::registerDataOnMesh( Group & meshBodies ) +{ + if( m_solver == nullptr ) + { + return; + } + + m_solver->forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + registerWrappedStats( mesh, viewKeyStruct::fluxSetWrapperString(), viewKeyStruct::allRegionWrapperString() ); + + for( string const & fluxName : m_fluxNames ) + { + registerWrappedStats( mesh, fluxName, viewKeyStruct::allRegionWrapperString() ); + + mesh.getElemManager().forElementRegions( [&]( ElementRegionBase & region ) + { + Wrapper< WrappedStats > & regionStatsWrapper = + registerWrappedStats( region, fluxName, region.getName() ); + region.excludeWrappersFromPacking( { regionStatsWrapper.getName() } ); + + region.forElementSubRegions( [&]( ElementSubRegionBase & subRegion ) + { + Wrapper< WrappedStats > & subRegionStatsWrapper = + registerWrappedStats( subRegion, fluxName, subRegion.getName() ); + subRegion.excludeWrappersFromPacking( { subRegionStatsWrapper.getName() } ); + } ); + } ); + } + } ); +} + +void SourceFluxStatsAggregator::writeStatsToLog( integer minLogLevel, + string_view elementSetName, + WrappedStats const & wrappedStats ) +{ + if( getLogLevel() >= minLogLevel && logger::internal::rank == 0 ) + { + GEOS_LOG_RANK( GEOS_FMT( "{} {} (of {}, in {}): Producing on {} elements", + catalogName(), getName(), wrappedStats.getFluxName(), elementSetName, + wrappedStats.stats().m_elementCount ) ); + + // we want to format differently if we have got multiple phases or not + string_view massUnit = units::getSymbol( m_solver->getMassUnit() ); + if( wrappedStats.stats().m_producedMass.size() == 1 ) + { + GEOS_LOG_RANK( GEOS_FMT( "{} {} (of {}, in {}): Produced mass = {} {}", + catalogName(), getName(), wrappedStats.getFluxName(), elementSetName, + wrappedStats.stats().m_producedMass[0], massUnit ) ); + GEOS_LOG_RANK( GEOS_FMT( "{} {} (of {}, in {}): Production rate = {} {}/s", + catalogName(), getName(), wrappedStats.getFluxName(), elementSetName, + wrappedStats.stats().m_productionRate[0], massUnit ) ); + } + else + { + GEOS_LOG_RANK( GEOS_FMT( "{} {} (of {}, in {}): Produced mass = {} {}", + catalogName(), getName(), wrappedStats.getFluxName(), elementSetName, + wrappedStats.stats().m_producedMass, massUnit ) ); + GEOS_LOG_RANK( GEOS_FMT( "{} {} (of {}, in {}): Production rate = {} {}/s", + catalogName(), getName(), wrappedStats.getFluxName(), elementSetName, + wrappedStats.stats().m_productionRate, massUnit ) ); + } + } +} + +void SourceFluxStatsAggregator::writeStatsToCSV( string_view elementSetName, WrappedStats const & stats, + bool writeHeader ) +{ + if( m_writeCSV > 0 && MpiWrapper::commRank() == 0 ) + { + string const fileName = GEOS_FMT( "{}/{}_{}_{}.csv", + m_outputDir, + stats.getAggregatorName(), stats.getFluxName(), elementSetName ); + std::ofstream outputFile( fileName, + writeHeader ? std::ios_base::out : std::ios_base::app ); + if( writeHeader ) + { + outputFile << GEOS_FMT( "Time [s],Element Count,Producted Mass [{0}],Production Rate [{0}/s]", + units::getSymbol( m_solver->getMassUnit() ) ) << std::endl; + } + else + { + outputFile << GEOS_FMT( "{},{},{},{}", + stats.getStatsPeriodStart(), stats.stats().m_elementCount, + stats.stats().m_producedMass, stats.stats().m_productionRate ) << std::endl; + } + outputFile.close(); + } +} + +bool SourceFluxStatsAggregator::execute( real64 const GEOS_UNUSED_PARAM( time_n ), + real64 const GEOS_UNUSED_PARAM( dt ), + integer const GEOS_UNUSED_PARAM( cycleNumber ), + integer const GEOS_UNUSED_PARAM( eventCounter ), + real64 const GEOS_UNUSED_PARAM( eventProgress ), + DomainPartition & domain ) +{ + forMeshLevelStatsWrapper( domain, + [&] ( MeshLevel & meshLevel, WrappedStats & meshLevelStats ) + { + meshLevelStats.stats() = StatData(); + + forAllFluxStatsWrappers( meshLevel, + [&] ( MeshLevel &, WrappedStats & fluxStats ) + { + fluxStats.stats() = StatData(); + + forAllRegionStatsWrappers( meshLevel, fluxStats.getFluxName(), + [&] ( ElementRegionBase & region, WrappedStats & regionStats ) + { + regionStats.stats() = StatData(); + + forAllSubRegionStatsWrappers( region, regionStats.getFluxName(), + [&] ( ElementSubRegionBase &, WrappedStats & subRegionStats ) + { + subRegionStats.finalizePeriod(); + regionStats.stats().combine( subRegionStats.stats() ); + } ); + + fluxStats.stats().combine( regionStats.stats() ); + writeStatsToLog( 3, region.getName(), regionStats ); + writeStatsToCSV( region.getName(), regionStats, false ); + } ); + + meshLevelStats.stats().combine( fluxStats.stats() ); + writeStatsToLog( 2, viewKeyStruct::allRegionWrapperString(), fluxStats ); + writeStatsToCSV( viewKeyStruct::allRegionWrapperString(), fluxStats, false ); + } ); + + writeStatsToLog( 1, viewKeyStruct::allRegionWrapperString(), meshLevelStats ); + writeStatsToCSV( viewKeyStruct::allRegionWrapperString(), meshLevelStats, false ); + } ); + + return false; +} + + + +void SourceFluxStatsAggregator::StatData::allocate( integer phaseCount ) +{ + if( m_producedMass.size() != phaseCount ) + { + m_producedMass.resize( phaseCount ); + m_productionRate.resize( phaseCount ); + } +} +void SourceFluxStatsAggregator::StatData::reset() +{ + for( int ip = 0; ip < getPhaseCount(); ++ip ) + { + m_producedMass[ip] = 0.0; + m_productionRate[ip] = 0.0; + } + m_elementCount = 0; +} +void SourceFluxStatsAggregator::StatData::combine( StatData const & other ) +{ + allocate( other.getPhaseCount() ); + + for( int ip = 0; ip < other.getPhaseCount(); ++ip ) + { + m_producedMass[ip] += other.m_producedMass[ip]; + m_productionRate[ip] += other.m_productionRate[ip]; + } + m_elementCount += other.m_elementCount; +} +void SourceFluxStatsAggregator::StatData::mpiReduce() +{ + for( int ip = 0; ip < getPhaseCount(); ++ip ) + { + m_producedMass[ip] = MpiWrapper::sum( m_producedMass[ip] ); + m_productionRate[ip] = MpiWrapper::sum( m_productionRate[ip] ); + } + m_elementCount = MpiWrapper::sum( m_elementCount ); +} + +void SourceFluxStatsAggregator::WrappedStats::setTarget( string_view aggregatorName, + string_view fluxName ) +{ + m_aggregatorName = aggregatorName; + m_fluxName = fluxName; +} +void SourceFluxStatsAggregator::WrappedStats::gatherTimeStepStats( real64 const currentTime, real64 const dt, + arrayView1d< real64 const > const & producedMass, + integer const elementCount ) +{ + m_periodStats.allocate( producedMass.size() ); + + if( !m_periodStats.m_isGathering ) + { + // if beginning a new period, we must initialize constant values over the period + m_periodStats.m_periodStart = currentTime; + m_periodStats.m_elementCount = elementCount; + m_periodStats.m_isGathering = true; + } + else + { + GEOS_WARNING_IF( currentTime< m_periodStats.m_timeStepStart, GEOS_FMT( "{}: Time seems to have rollback, stats will be wrong.", m_aggregatorName ) ); + if( currentTime > m_periodStats.m_timeStepStart ) + { + // if beginning a new timestep, we must accumulate the stats from previous timesteps (mass & dt) before collecting the new ones + for( int ip = 0; ip < m_periodStats.getPhaseCount(); ++ip ) + { + m_periodStats.m_periodPendingMass[ip] += m_periodStats.m_timeStepMass[ip]; + } + m_periodStats.m_periodPendingDeltaTime += m_periodStats.m_timeStepDeltaTime; + } + } + // current timestep stats to take into account (overriding if not begining a new timestep) + m_periodStats.m_timeStepStart = currentTime; + m_periodStats.m_timeStepDeltaTime = dt; + for( int ip = 0; ip < m_periodStats.getPhaseCount(); ++ip ) + { + m_periodStats.m_timeStepMass = producedMass; + } +} +void SourceFluxStatsAggregator::WrappedStats::finalizePeriod() +{ + // init phase data memory allocation if needed + m_stats.allocate( m_periodStats.getPhaseCount() ); + + // produce the period stats of this rank + m_stats.m_elementCount = m_periodStats.m_elementCount; + m_statsPeriodStart = m_periodStats.m_periodStart; + m_statsPeriodDT = m_periodStats.m_timeStepDeltaTime + m_periodStats.m_periodPendingDeltaTime; + + real64 const timeDivisor = m_statsPeriodDT > 0.0 ? 1.0 / m_statsPeriodDT : 0.0; + for( int ip = 0; ip < m_periodStats.getPhaseCount(); ++ip ) + { + real64 periodMass = m_periodStats.m_timeStepMass[ip] + m_periodStats.m_periodPendingMass[ip]; + m_stats.m_producedMass[ip] = periodMass; + m_stats.m_productionRate[ip] = periodMass * timeDivisor; + } + + // combine period results from all MPI ranks + m_stats.mpiReduce(); + + // start a new timestep + m_periodStats.reset(); +} +void SourceFluxStatsAggregator::WrappedStats::PeriodStats::allocate( integer phaseCount ) +{ + if( m_timeStepMass.size() != phaseCount ) + { + m_timeStepMass.resize( phaseCount ); + m_periodPendingMass.resize( phaseCount ); + } +} +void SourceFluxStatsAggregator::WrappedStats::PeriodStats::reset() +{ + for( int ip = 0; ip < getPhaseCount(); ++ip ) + { + m_timeStepMass[ip] = 0.0; + m_periodPendingMass[ip] = 0.0; + } + m_periodPendingDeltaTime = 0.0; + m_elementCount = 0; + m_timeStepStart = 0.0; + m_timeStepDeltaTime = 0.0; + m_isGathering = false; +} + + +REGISTER_CATALOG_ENTRY( TaskBase, + SourceFluxStatsAggregator, + string const &, + dataRepository::Group * const ) + +} /* namespace geos */ diff --git a/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp b/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp new file mode 100644 index 00000000000..e4110c92d36 --- /dev/null +++ b/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp @@ -0,0 +1,420 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SourceFluxStatistics.hpp + */ + +#ifndef SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_SOURCEFLUXSTATISTICS_HPP_ +#define SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_SOURCEFLUXSTATISTICS_HPP_ + +#include "physicsSolvers/FieldStatisticsBase.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBase.hpp" +#include "mesh/DomainPartition.hpp" + + +namespace geos +{ + +/** + * @class SourceFluxStatsAggregator + * + * Task class allowing for the computation of aggregate statistics of SourceFluxBoundaryCondition + */ +class SourceFluxStatsAggregator final : public FieldStatisticsBase< FlowSolverBase > +{ +public: + + /** + * @brief Aggregated flux statistics data. + */ + struct StatData + { + /// Amount of fluid produced by the flux(es). Negative if injecting. One value for each fluid phase. + /// In kg by default, or in mol if useMass = 0 on the solver. + array1d< real64 > m_producedMass; + /// Flux(es) production rate. Negative if injecting. One value for each fluid phase. + /// In kg/s by default, or in mol/s if useMass = 0 on the solver. + array1d< real64 > m_productionRate; + /// Number of elements in which we are producing / injecting + integer m_elementCount = 0; + + /** + * @brief resize the phase data arrays if needed + * @param phaseCount the count of phases + */ + void allocate( integer phaseCount ); + /** + * @brief reset the stats to 0.0 + */ + void reset(); + /** + * @return the phase count for phasic stats + */ + integer getPhaseCount() const + { return m_producedMass.size(); } + /** + * @brief Aggregate the statistics of the instance with those of another one. + * @param other the other stats structure. + */ + void combine( StatData const & other ); + /** + * @brief Aggregate the statistics of the instance with those from all instances from other MPI ranks. + * Must be called only once per timestep. + */ + void mpiReduce(); + }; + /** + * @brief Class that aggregate statistics of a flux over multiple time-steps for a given + * SourceFluxStatsAggregator and a for a given mesh part (i.e. a subregion, a region...). + */ + class WrappedStats + { +public: + /** + * @brief Set the subjects targeted by the stats. + * @param aggregatorName the name of the targeted SourceFluxStatsAggregator + * @param fluxName the name of the targeted SourceFluxBoundaryCondition + */ + void setTarget( string_view aggregatorName, string_view fluxName ); + + /** + * @brief Set the current time step stats. Accumulate the statistics only if the time is strictly + * after the previous time + dt (override the statistics if the current timestep is cut). + * @param currentTime time of the timestep start since simulation starting + * @param dt time delta of the current timestep + * @param producedMass Amount of produced fluid (see StatData::m_producedMass). + * @param elementCount number of cell elements concerned by this instance + */ + void gatherTimeStepStats( real64 currentTime, real64 dt, + arrayView1d< real64 const > const & producedMass, + integer elementCount ); + + /** + * @brief Finalize the period statistics of each timestep gathering and render data over all mpi ranks. + * The result can be read by the data() assessor. + * @note This method must be synchronously called by all MPI ranks. + */ + void finalizePeriod(); + + /** + * @return the reference to the wrapped stats data collected over the last period (one timestep or more), computed by finalizePeriod() + */ + StatData & stats() + { return m_stats; } + + /** + * @return the reference to the wrapped stats data collected over the last period (one timestep or more), computed by finalizePeriod() + */ + StatData const & stats() const + { return m_stats; } + + /** + * @return the start time of the wrapped stats period (in s) + */ + real64 getStatsPeriodStart() const + { return m_statsPeriodStart; } + + /** + * @return the duration of the wrapped stats period (in s) + */ + real64 getStatsPeriodDuration() const + { return m_statsPeriodDT; } + + /** + * @return the name of the SourceFluxStatsAggregator that want to collect data on this instance. + */ + string_view getAggregatorName() const + { return m_aggregatorName; } + + /** + * @return the name of the SourceFluxBoundaryCondition from which we are collecting data on this instance. + */ + string_view getFluxName() const + { return m_fluxName; } +private: + /// stats data collected over the last period (one timestep or more), computed by finalizePeriod() + StatData m_stats; + /// the start time of the wrapped stats period (in s) + real64 m_statsPeriodStart; + /// the duration of the wrapped stats period (in s) + real64 m_statsPeriodDT; + + /** + * @brief This struct is used to accumulate statistics along one or more timesteps. + */ + struct PeriodStats + { + /// Fluid production during current time-step. Same unit as StatData::productedMass. + array1d< real64 > m_timeStepMass; + /// Fluid production during all previous time-step of the current period. Same unit as StatData::productedMass. + array1d< real64 > m_periodPendingMass; + /// time of when the timestep starts (since the simulation start). + real64 m_timeStepStart = 0.0; + /// time that the current timestep is simulating. + real64 m_timeStepDeltaTime = 0.0; + /// start time of the current period. + real64 m_periodStart = 0.0; + /// delta time from all previous time-step of the current period. + real64 m_periodPendingDeltaTime = 0.0; + /// number of cell elements targeted by this instance + integer m_elementCount = 0; + /// Did the period statistics gathering started ? + bool m_isGathering = false; + + /** + * @brief resize the phase data arrays if needed + * @param phaseCount the count of phases + */ + void allocate( integer phaseCount ); + /** + * @brief reset the stats to 0.0 + */ + void reset(); + /** + * @return the phase count for phasic stats + */ + integer getPhaseCount() const + { return m_timeStepMass.size(); } + } m_periodStats; + + /// Name of the SourceFluxStatsAggregator that want to collect data on this instance. + string m_aggregatorName; + /// Name of the SourceFluxBoundaryCondition from which we are collecting data on this instance. + string m_fluxName; + }; + + + /** + * @brief Constructor for the statistics class + * @param[in] name the name of the task coming from the xml + * @param[in] parent the parent group of the task + */ + SourceFluxStatsAggregator( const string & name, + Group * const parent ); + + /** + * @return The catalog name + */ + static string catalogName() { return "SourceFluxStatistics"; } + + /** + * @copydoc ExecutableGroup::execute() + */ + virtual bool execute( real64 const time_n, + real64 const dt, + integer const cycleNumber, + integer const eventCounter, + real64 const eventProgress, + DomainPartition & domain ) override; + + /** + * @brief Apply a functor to WrappedStats that combines all stats for each target solver + * discretization mesh levels. + * @param domain the domain for which we want the statistics + * @param lambda the functor that will be called for each WrappedStats. Takes in parameter the MeshLevel + * reference and the reference to the WrappedStats that combines all stats for the instance. + * @tparam LAMBDA the type of lambda function to call in the function + * @note To be retrieved, the WrappedStats structs must be registered on the container during the + * registerDataOnMesh() call. + */ + template< typename LAMBDA > + void forMeshLevelStatsWrapper( DomainPartition & domain, LAMBDA && lambda ); + /** + * @brief Apply a functor to each WrappedStats that combines the stats over all region for a flux. + * @param meshLevel the mesh level for which we want the statistics. + * @param lambda the functor that will be called for each WrappedStats. Takes in parameter the MeshLevel + * reference and the reference to one of the flux WrappedStats. + * @tparam LAMBDA the type of lambda function to call in the function + * @note To be retrieved, the WrappedStats structs must be registered on the container during the + * registerDataOnMesh() call. + */ + template< typename LAMBDA > + void forAllFluxStatsWrappers( MeshLevel & meshLevel, LAMBDA && lambda ); + /** + * @brief Apply a functor to all simulated region WrappedStats (of the given MeshLevel) that target a + * given flux. + * @param meshLevel the mesh level we want to loop over all its regions. + * @param fluxName the name of the flux from which we want the statistics. + * @param lambda the functor that will be called for each WrappedStats. Takes in parameter the + * ElementRegionBase reference and the reference of its WrappedStats. + * @tparam LAMBDA the type of lambda function to call in the function + * @note To be retrieved, the WrappedStats structs must be registered on the container during the + * registerDataOnMesh() call. + */ + template< typename LAMBDA > + void forAllRegionStatsWrappers( MeshLevel & meshLevel, string_view fluxName, LAMBDA && lambda ); + /** + * @brief Apply a functor to all subregion WrappedStats (of the given region) that target a given flux. + * @param region the region from which we want to execute the lambda for each of its sub-region. + * @param fluxName the name of the flux from which we want the statistics. + * @param lambda the functor that will be called for each WrappedStats. Takes in parameter the + * ElementSubRegionBase reference and the reference of its WrappedStats. + * @tparam LAMBDA the type of lambda function to call in the function + * @note To be retrieved, the WrappedStats structs must be registered on the container during the + * registerDataOnMesh() call. + */ + template< typename LAMBDA > + void forAllSubRegionStatsWrappers( ElementRegionBase & region, string_view fluxName, LAMBDA && lambda ); + + /** + * @brief Apply a functor to all WrappedStats of the given group that target a given flux (and + * potentially multiple SourceFluxStatsAggregator). + * The functor takes in parameter the reference to the currently processed WrappedStats. + * @note To be retrieved, the WrappedStats structs must be registered on the container during the + * registerDataOnMesh() call. + * @tparam LAMBDA the type of lambda function to call in the function + * @param container the container from which we want the statistics. + * @param fluxName the name of the flux from which we want the statistics. + * @param lambda the functor that will be called for each WrappedStats. Takes in parameter the + * reference to the currently processed WrappedStats. + */ + template< typename LAMBDA > + static void forAllFluxStatWrappers( Group & container, string_view fluxName, LAMBDA && lambda ); + + /** + * @return a string used to name the wrapper that is added to each region that is simulated by the solver. + * The string is unique within the region for the SourceFluxBoundaryCondition and the SourceFluxStatsAggregator. + * @param fluxName The name of the flux. For the mesh-level global stats, fluxSetWrapperString() can be used. + */ + inline string getStatWrapperName( string_view fluxName ) const; + + + /** + * @brief View keys + */ + struct viewKeyStruct + { + /// @return The key for setName + constexpr inline static string_view fluxNamesString() { return "fluxNames"; } + /// @return The key for statistics wrapper name that targets all region + constexpr inline static string_view allRegionWrapperString() { return "all_regions"; } + /// @return The key for statistics wrapper name that targets all fluxes of the set + constexpr inline static string_view fluxSetWrapperString() { return "flux_set"; } + }; + + +private: + using Base = FieldStatisticsBase< FlowSolverBase >; + + /// the names of the SourceFlux(s) for which we want the statistics + string_array m_fluxNames; + + /** + * @copydoc Group::registerDataOnMesh(Group &) + */ + void registerDataOnMesh( Group & meshBodies ) override; + + /** + * @copydoc Group::postProcessInput() + */ + void postProcessInput() override; + + dataRepository::Wrapper< WrappedStats > & registerWrappedStats( Group & group, + string_view fluxName, + string_view elementSetName ); + + /** + * @brief If requested, output in the log and CSV the given statistics. + * @param minLogLevel the min log level to output any line. + * @param elementSetName the region / sub-subregion name concerned by the statistics. + * @param stats the statistics that must be output in the log. + */ + void writeStatsToLog( integer minLogLevel, string_view elementSetName, WrappedStats const & stats ); + /** + * @brief If CSV is enabled, create or append a new CSV file. + * @param elementSetName the region / sub-subregion name concerned by the statistics. + * @param stats the statistics that must be output in the log. + * @param writeHeader If true, create the CSV with the header. If false, append it with the statistics. + */ + void writeStatsToCSV( string_view elementSetName, WrappedStats const & stats, bool writeHeader ); + +}; + + +template< typename LAMBDA > +void SourceFluxStatsAggregator::forAllFluxStatWrappers( Group & container, + string_view fluxName, + LAMBDA && lambda ) +{ + container.forWrappers< WrappedStats >( [&]( dataRepository::Wrapper< WrappedStats > & statsWrapper ) + { + if( statsWrapper.referenceAsView().getFluxName() == fluxName ) + { + lambda( statsWrapper.reference() ); + } + } ); +} + +template< typename LAMBDA > +void SourceFluxStatsAggregator::forMeshLevelStatsWrapper( DomainPartition & domain, + LAMBDA && lambda ) +{ + m_solver->forDiscretizationOnMeshTargets( domain.getMeshBodies(), + [&] ( string const &, + MeshLevel & meshLevel, + arrayView1d< string const > const & ) + { + string const wrapperName = getStatWrapperName( viewKeyStruct::fluxSetWrapperString() ); + WrappedStats & stats = meshLevel.getWrapper< WrappedStats >( wrapperName ).reference(); + + lambda( meshLevel, stats ); + } ); +} +template< typename LAMBDA > +void SourceFluxStatsAggregator::forAllFluxStatsWrappers( MeshLevel & meshLevel, + LAMBDA && lambda ) +{ + for( string const & fluxName : m_fluxNames ) + { + string const wrapperName = getStatWrapperName( fluxName ); + WrappedStats & stats = meshLevel.getWrapper< WrappedStats >( wrapperName ).reference(); + + lambda( meshLevel, stats ); + } +} +template< typename LAMBDA > +void SourceFluxStatsAggregator::forAllRegionStatsWrappers( MeshLevel & meshLevel, + string_view fluxName, + LAMBDA && lambda ) +{ + string const wrapperName = getStatWrapperName( fluxName ); + meshLevel.getElemManager().forElementRegions( [&]( ElementRegionBase & region ) + { + WrappedStats & stats = region.getWrapper< WrappedStats >( wrapperName ).reference(); + + lambda( region, stats ); + } ); +} +template< typename LAMBDA > +void SourceFluxStatsAggregator::forAllSubRegionStatsWrappers( ElementRegionBase & region, + string_view fluxName, + LAMBDA && lambda ) +{ + string const wrapperName = getStatWrapperName( fluxName ); + region.forElementSubRegions( [&]( ElementSubRegionBase & subRegion ) + { + WrappedStats & stats = subRegion.getWrapper< WrappedStats >( wrapperName ).reference(); + + lambda( subRegion, stats ); + } ); +} + +inline string SourceFluxStatsAggregator::getStatWrapperName( string_view fluxName ) const +{ return GEOS_FMT( "{}_region_stats_for_{}", fluxName, getName() ); } + + +} /* namespace geos */ + +#endif /* SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_SOURCEFLUXSTATISTICS_HPP_ */ diff --git a/src/coreComponents/mesh/ElementRegionBase.hpp b/src/coreComponents/mesh/ElementRegionBase.hpp index 049173a74e6..15a46e407b9 100644 --- a/src/coreComponents/mesh/ElementRegionBase.hpp +++ b/src/coreComponents/mesh/ElementRegionBase.hpp @@ -214,6 +214,20 @@ class ElementRegionBase : public ObjectManagerBase template< typename CONSTITUTIVE_TYPE > string_array getConstitutiveNames() const; + /** + * @return the parent region of the given sub-region. + * @param subRegion the sub-region that we want the parent. + */ + static ElementRegionBase & getParentRegion( ElementSubRegionBase & subRegion ) + { return dynamicCast< ElementRegionBase & >( subRegion.getParent().getParent() ); } + + /** + * @return the parent region of the given sub-region. + * @param subRegion the sub-region that we want the parent. + */ + static ElementRegionBase const & getParentRegion( ElementSubRegionBase const & subRegion ) + { return dynamicCast< ElementRegionBase const & >( subRegion.getParent().getParent() ); } + ///@} diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index f9e07f2dc6b..7c47c07639d 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -734,6 +734,7 @@ class SolverBase : public ExecutableGroup virtual bool registerCallback( void * func, const std::type_info & funcType ) final override; SolverStatistics & getSolverStatistics() { return m_solverStatistics; } + SolverStatistics const & getSolverStatistics() const { return m_solverStatistics; } /** * @brief Return PySolver type. diff --git a/src/coreComponents/physicsSolvers/SolverStatistics.hpp b/src/coreComponents/physicsSolvers/SolverStatistics.hpp index 7ec3b7cc532..964cbc078ca 100644 --- a/src/coreComponents/physicsSolvers/SolverStatistics.hpp +++ b/src/coreComponents/physicsSolvers/SolverStatistics.hpp @@ -79,6 +79,54 @@ class SolverStatistics : public dataRepository::Group */ void outputStatistics() const; + /** + * @return Number of time steps + */ + integer getNumTimeSteps() const + { return m_numTimeSteps; } + + /** + * @return Number of time step cuts + */ + integer getNumTimeStepCuts() const + { return m_numTimeStepCuts; } + + /** + * @return Cumulative number of successful outer loop iterations + */ + integer getNumSuccessfulOuterLoopIterations() const + { return m_numSuccessfulOuterLoopIterations; } + + /** + * @return Cumulative number of successful nonlinear iterations + */ + integer getNumSuccessfulNonlinearIterations() const + { return m_numSuccessfulNonlinearIterations; } + + /** + * @return Cumulative number of successful linear iterations + */ + integer getNumSuccessfulLinearIterations() const + { return m_numSuccessfulLinearIterations; } + + /** + * @return Cumulative number of discarded outer loop iterations + */ + integer getNumDiscardedOuterLoopIterations() const + { return m_numDiscardedOuterLoopIterations; } + + /** + * @return Cumulative number of discarded nonlinear iterations + */ + integer getNumDiscardedNonlinearIterations() const + { return m_numDiscardedNonlinearIterations; } + + /** + * @return Cumulative number of discarded linear iterations + */ + integer getNumDiscardedLinearIterations() const + { return m_numDiscardedLinearIterations; } + private: /** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 6129754a029..652682cca12 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -35,6 +35,7 @@ #include "fieldSpecification/AquiferBoundaryCondition.hpp" #include "fieldSpecification/EquilibriumInitialCondition.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" +#include "fieldSpecification/SourceFluxStatistics.hpp" #include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" @@ -73,10 +74,13 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, setInputFlag( InputFlags::REQUIRED ). setDescription( "Temperature" ); //END_SPHINX_INCLUDE_00 + + // TODO: add more description on how useMass can alter the simulation (convergence issues?). How does it interact with wells useMass? this->registerWrapper( viewKeyStruct::useMassFlagString(), &m_useMass ). setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Use mass formulation instead of molar" ); + setDescription( GEOS_FMT( "Use mass formulation instead of molar. Warning : Affects {} rates units.", + SourceFluxBoundaryCondition::catalogName() ) ); this->registerWrapper( viewKeyStruct::solutionChangeScalingFactorString(), &m_solutionChangeScalingFactor ). setSizedFromParent( 0 ). @@ -1552,6 +1556,8 @@ void CompositionalMultiphaseBase::applySourceFluxBC( real64 const time, arrayView1d< real64 > rhsContributionArrayView = rhsContributionArray.toView(); localIndex const rankOffset = dofManager.rankOffset(); + RAJA::ReduceSum< parallelDeviceReduce, real64 > massProd( 0.0 ); + // note that the dofArray will not be used after this step (simpler to use dofNumber instead) fs.computeRhsContribution< FieldSpecificationAdd, parallelDevicePolicy<> >( targetSet.toViewConst(), @@ -1585,7 +1591,8 @@ void CompositionalMultiphaseBase::applySourceFluxBC( real64 const time, useTotalMassEquation, dofNumber, rhsContributionArrayView, - localRhs] GEOS_HOST_DEVICE ( localIndex const a ) + localRhs, + massProd] GEOS_HOST_DEVICE ( localIndex const a ) { // we need to filter out ghosts here, because targetSet may contain them localIndex const ei = targetSet[a]; @@ -1594,27 +1601,34 @@ void CompositionalMultiphaseBase::applySourceFluxBC( real64 const time, return; } + real64 const rhsValue = rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the sizeScalingFactor here! + massProd += rhsValue; if( useTotalMassEquation > 0 ) { // for all "fluid components", we add the value to the total mass balance equation globalIndex const totalMassBalanceRow = dofNumber[ei] - rankOffset; - localRhs[totalMassBalanceRow] += rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the - // sizeScalingFactor - // here + localRhs[totalMassBalanceRow] += rhsValue; if( fluidComponentId < numFluidComponents - 1 ) { globalIndex const compMassBalanceRow = totalMassBalanceRow + fluidComponentId + 1; // component mass bal equations are shifted - localRhs[compMassBalanceRow] += rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the - // sizeScalingFactor here + localRhs[compMassBalanceRow] += rhsValue; } } else { globalIndex const compMassBalanceRow = dofNumber[ei] - rankOffset + fluidComponentId; - localRhs[compMassBalanceRow] += rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the - // sizeScalingFactor here + localRhs[compMassBalanceRow] += rhsValue; } } ); + + SourceFluxStatsAggregator::forAllFluxStatWrappers( subRegion, fs.getName(), + [&]( SourceFluxStatsAggregator::WrappedStats & wrapper ) + { + // set the new sub-region statistics for this timestep + array1d< real64 > massProdArr{ m_numComponents }; + massProdArr[fluidComponentId] = massProd.get(); + wrapper.gatherTimeStepStats( time, dt, massProdArr.toViewConst(), targetSet.size() ); + } ); } ); } ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index 870213176a7..0708804af11 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -183,6 +183,12 @@ class CompositionalMultiphaseBase : public FlowSolverBase */ string referenceFluidModelName() const { return m_referenceFluidModelName; } + /** + * @return The unit in which we evaluate the amount of fluid per element (Mass or Mole, depending on useMass). + */ + virtual units::Unit getMassUnit() const override + { return m_useMass ? units::Unit::Mass : units::Unit::Mole; } + /** * @brief assembles the accumulation and volume balance terms for all cells * @param time_n previous time value diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp index 137a760069d..ab5932ce13a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp @@ -115,8 +115,7 @@ void CompositionalMultiphaseStatistics::registerDataOnMesh( Group & meshBodies ) if( m_writeCSV > 0 && MpiWrapper::commRank() == 0 ) { std::ofstream outputFile( m_outputDir + "/" + regionNames[i] + ".csv" ); - integer const useMass = m_solver->getReference< integer >( CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString() ); - string const massUnit = useMass ? "kg" : "mol"; + string_view massUnit = units::getSymbol( m_solver->getMassUnit() ); outputFile << "Time [s],Min pressure [Pa],Average pressure [Pa],Max pressure [Pa],Min delta pressure [Pa],Max delta pressure [Pa]," << "Min temperature [Pa],Average temperature [Pa],Max temperature [Pa],Total dynamic pore volume [rm^3]"; @@ -305,7 +304,7 @@ void CompositionalMultiphaseStatistics::computeRegionStatistics( real64 const ti subRegionImmobilePhaseMass.toView(), subRegionComponentMass.toView() ); - ElementRegionBase & region = elemManager.getRegion( subRegion.getParent().getParent().getName() ); + ElementRegionBase & region = elemManager.getRegion( ElementRegionBase::getParentRegion( subRegion ).getName() ); RegionStatistics & regionStatistics = region.getReference< RegionStatistics >( viewKeyStruct::regionStatisticsString() ); regionStatistics.averagePressure += subRegionAvgPresNumerator; @@ -405,8 +404,7 @@ void CompositionalMultiphaseStatistics::computeRegionStatistics( real64 const ti mobilePhaseMass[ip] = regionStatistics.phaseMass[ip] - regionStatistics.immobilePhaseMass[ip]; } - integer const useMass = m_solver->getReference< integer >( CompositionalMultiphaseBase::viewKeyStruct::useMassFlagString() ); - string const massUnit = useMass ? "kg" : "mol"; + string_view massUnit = units::getSymbol( m_solver->getMassUnit() ); GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Pressure (min, average, max): {}, {}, {} Pa", getName(), regionNames[i], time, regionStatistics.minPressure, regionStatistics.averagePressure, regionStatistics.maxPressure ) ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index 3de1b21e7ea..a7d0f163085 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -20,6 +20,7 @@ #define GEOS_PHYSICSSOLVERS_FINITEVOLUME_FLOWSOLVERBASE_HPP_ #include "physicsSolvers/SolverBase.hpp" +#include "common/Units.hpp" namespace geos { @@ -135,6 +136,12 @@ class FlowSolverBase : public SolverBase integer & isThermal() { return m_isThermal; } + /** + * @return The unit in which we evaluate the amount of fluid per element (Mass or Mole). + */ + virtual units::Unit getMassUnit() const + { return units::Unit::Mass; } + /** * @brief Function to activate the flag allowing negative pressure */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index 85f0354c53a..a08168784b6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -23,6 +23,7 @@ #include "discretizationMethods/NumericalMethodsManager.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" +#include "fieldSpecification/SourceFluxStatistics.hpp" #include "finiteVolume/FiniteVolumeManager.hpp" #include "finiteVolume/FluxApproximationBase.hpp" #include "mesh/DomainPartition.hpp" @@ -861,6 +862,8 @@ void ReactiveCompositionalMultiphaseOBL::applySourceFluxBC( real64 const time, arrayView1d< real64 > rhsContributionArrayView = rhsContributionArray.toView(); localIndex const rankOffset = dofManager.rankOffset(); + RAJA::ReduceSum< parallelDeviceReduce, real64 > massProd( 0.0 ); + // note that the dofArray will not be used after this step (simpler to use dofNumber instead) fs.computeRhsContribution< FieldSpecificationAdd, parallelDevicePolicy<> >( targetSet.toViewConst(), @@ -890,7 +893,8 @@ void ReactiveCompositionalMultiphaseOBL::applySourceFluxBC( real64 const time, fluidComponentId, dofNumber, rhsContributionArrayView, - localRhs] GEOS_HOST_DEVICE ( localIndex const a ) + localRhs, + massProd] GEOS_HOST_DEVICE ( localIndex const a ) { // we need to filter out ghosts here, because targetSet may contain them localIndex const ei = targetSet[a]; @@ -901,7 +905,18 @@ void ReactiveCompositionalMultiphaseOBL::applySourceFluxBC( real64 const time, // for all "fluid components", we add the value to the component mass balance equation globalIndex const compMassBalanceRow = dofNumber[ei] - rankOffset + fluidComponentId; - localRhs[compMassBalanceRow] += rhsContributionArrayView[a] / sizeScalingFactor; + real64 const rhsValue = rhsContributionArrayView[a] / sizeScalingFactor; + localRhs[compMassBalanceRow] += rhsValue; + massProd += rhsValue; + } ); + + SourceFluxStatsAggregator::forAllFluxStatWrappers( subRegion, fs.getName(), + [&]( SourceFluxStatsAggregator::WrappedStats & wrapper ) + { + // set the new sub-region statistics for this timestep + array1d< real64 > massProdArr{ m_numComponents }; + massProdArr[fluidComponentId] = massProd.get(); + wrapper.gatherTimeStepStats( time, dt, massProdArr.toViewConst(), targetSet.size() ); } ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 46066692beb..c342cc8a592 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -31,6 +31,7 @@ #include "fieldSpecification/EquilibriumInitialCondition.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" +#include "fieldSpecification/SourceFluxStatistics.hpp" #include "finiteVolume/FiniteVolumeManager.hpp" #include "functions/TableFunction.hpp" #include "mainInterface/ProblemManager.hpp" @@ -57,6 +58,13 @@ SinglePhaseBase::SinglePhaseBase( const string & name, setApplyDefaultValue( 0.0 ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Temperature" ); + + this->getWrapper< integer >( string( viewKeyStruct::isThermalString() ) ). + appendDescription( GEOS_FMT( "\nSourceFluxes application if {} is enabled :\n" + "- negative value (injection): the mass balance equation is modified to considered the additional source term,\n" + "- positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term.\n" + "For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced.", + viewKeyStruct::isThermalString() ) ); } @@ -877,20 +885,12 @@ void SinglePhaseBase::applyBoundaryConditions( real64 time_n, namespace { -char const bcLogMessage[] = - "SinglePhaseBase {}: at time {}s, " - "the <{}> boundary condition '{}' is applied to the element set '{}' in subRegion '{}'. " - "\nThe scale of this boundary condition is {} and multiplies the value of the provided function (if any). " - "\nThe total number of target elements (including ghost elements) is {}. " - "\nNote that if this number is equal to zero for all subRegions, the boundary condition will not be applied on this element set."; - void applyAndSpecifyFieldValue( real64 const & time_n, real64 const & dt, MeshLevel & mesh, globalIndex const rankOffset, string const dofKey, - bool const isFirstNonlinearIteration, - string const solverName, + bool const, integer const idof, string const fieldKey, string const boundaryFieldKey, @@ -903,19 +903,11 @@ void applyAndSpecifyFieldValue( real64 const & time_n, mesh, fieldKey, [&]( FieldSpecificationBase const & fs, - string const & setName, + string const &, SortedArrayView< localIndex const > const & lset, ElementSubRegionBase & subRegion, string const & ) { - if( fs.getLogLevel() >= 1 && isFirstNonlinearIteration ) - { - globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( lset.size() ); - GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - solverName, time_n+dt, fs.getCatalogName(), fs.getName(), - setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); - } - // Specify the bc value of the field fs.applyFieldValue< FieldSpecificationEqual, parallelDevicePolicy<> >( lset, @@ -974,12 +966,12 @@ void SinglePhaseBase::applyDirichletBC( real64 const time_n, MeshLevel & mesh, arrayView1d< string const > const & ) { - applyAndSpecifyFieldValue( time_n, dt, mesh, rankOffset, dofKey, isFirstNonlinearIteration, getName(), + applyAndSpecifyFieldValue( time_n, dt, mesh, rankOffset, dofKey, isFirstNonlinearIteration, 0, fields::flow::pressure::key(), fields::flow::bcPressure::key(), localMatrix, localRhs ); if( m_isThermal ) { - applyAndSpecifyFieldValue( time_n, dt, mesh, rankOffset, dofKey, isFirstNonlinearIteration, getName(), + applyAndSpecifyFieldValue( time_n, dt, mesh, rankOffset, dofKey, isFirstNonlinearIteration, 1, fields::flow::temperature::key(), fields::flow::bcTemperature::key(), localMatrix, localRhs ); } @@ -1044,25 +1036,6 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, ElementSubRegionBase & subRegion, string const & ) { - if( fs.getLogLevel() >= 1 && m_nonlinearSolverParameters.m_numNewtonIterations == 0 ) - { - globalIndex const numTargetElems = MpiWrapper::sum< globalIndex >( targetSet.size() ); - GEOS_LOG_RANK_0( GEOS_FMT( bcLogMessage, - getName(), time_n+dt, fs.getCatalogName(), fs.getName(), - setName, subRegion.getName(), fs.getScale(), numTargetElems ) ); - - if( isThermal ) - { - char const msg[] = "SinglePhaseBase {} with isThermal = 1. At time {}s, " - "the <{}> source flux boundary condition '{}' will be applied with the following behavior" - "\n - negative value (injection): the mass balance equation is modified to considered the additional source term" - "\n - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. " \ - "\n For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced."; - GEOS_LOG_RANK_0( GEOS_FMT( msg, - getName(), time_n+dt, fs.getCatalogName(), fs.getName() ) ); - } - } - if( targetSet.size() == 0 ) { return; @@ -1087,6 +1060,8 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, arrayView1d< real64 > rhsContributionArrayView = rhsContributionArray.toView(); localIndex const rankOffset = dofManager.rankOffset(); + RAJA::ReduceSum< parallelDeviceReduce, real64 > massProd( 0.0 ); + // note that the dofArray will not be used after this step (simpler to use dofNumber instead) fs.computeRhsContribution< FieldSpecificationAdd, parallelDevicePolicy<> >( targetSet.toViewConst(), @@ -1126,7 +1101,8 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, dEnthalpy_dPressure, rhsContributionArrayView, localRhs, - localMatrix] GEOS_HOST_DEVICE ( localIndex const a ) + localMatrix, + massProd] GEOS_HOST_DEVICE ( localIndex const a ) { // we need to filter out ghosts here, because targetSet may contain them localIndex const ei = targetSet[a]; @@ -1140,6 +1116,7 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, globalIndex const energyRowIndex = massRowIndex + 1; real64 const rhsValue = rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the sizeScalingFactor here! localRhs[massRowIndex] += rhsValue; + massProd += rhsValue; //add the value to the energey balance equation if the flux is positive (i.e., it's a producer) if( rhsContributionArrayView[a] > 0.0 ) { @@ -1166,7 +1143,8 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, ghostRank, dofNumber, rhsContributionArrayView, - localRhs] GEOS_HOST_DEVICE ( localIndex const a ) + localRhs, + massProd] GEOS_HOST_DEVICE ( localIndex const a ) { // we need to filter out ghosts here, because targetSet may contain them localIndex const ei = targetSet[a]; @@ -1177,9 +1155,20 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, // add the value to the mass balance equation globalIndex const rowIndex = dofNumber[ei] - rankOffset; - localRhs[rowIndex] += rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the sizeScalingFactor here! + real64 const rhsValue = rhsContributionArrayView[a] / sizeScalingFactor; + localRhs[rowIndex] += rhsValue; + massProd += rhsValue; } ); } + + SourceFluxStatsAggregator::forAllFluxStatWrappers( subRegion, fs.getName(), + [&]( SourceFluxStatsAggregator::WrappedStats & wrapper ) + { + // set the new sub-region statistics for this timestep + array1d< real64 > massProdArr{ 1 }; + massProdArr[0] = massProd.get(); + wrapper.gatherTimeStepStats( time_n, dt, massProdArr.toViewConst(), targetSet.size() ); + } ); } ); } ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp index c74a9e906b1..73b34b0703b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp @@ -175,7 +175,7 @@ void SinglePhaseStatistics::computeRegionStatistics( real64 const time, subRegionTotalPoreVol, subRegionTotalMass ); - ElementRegionBase & region = elemManager.getRegion( subRegion.getParent().getParent().getName() ); + ElementRegionBase & region = elemManager.getRegion( ElementRegionBase::getParentRegion( subRegion ).getName() ); RegionStatistics & regionStatistics = region.getReference< RegionStatistics >( viewKeyStruct::regionStatisticsString() ); regionStatistics.averagePressure += subRegionAvgPresNumerator; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp index bfd1360fd92..57ac9fc1f64 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp @@ -62,9 +62,6 @@ class SinglePhaseStatistics : public FieldStatisticsBase< SinglePhaseBase > /**@}*/ -private: - - using Base = FieldStatisticsBase< SinglePhaseBase >; /** * @struct viewKeyStruct holds char strings and viewKeys for fast lookup @@ -105,6 +102,10 @@ class SinglePhaseStatistics : public FieldStatisticsBase< SinglePhaseBase > real64 totalUncompactedPoreVolume; }; +private: + + using Base = FieldStatisticsBase< SinglePhaseBase >; + /** * @brief Compute some statistics on the reservoir (average field pressure, etc) * @param[in] mesh the mesh level object diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst index 1c47dd14fd5..33e2a2e5cb5 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst @@ -36,7 +36,7 @@ targetRelativePressureChangeInTimeStep real64 targetRelativeTemperatureChangeInTimeStep real64 0.2 Target (relative) change in temperature in a time step (expected value between 0 and 1) temperature real64 required Temperature useDBC integer 0 Enable Dissipation-based continuation flux -useMass integer 0 Use mass formulation instead of molar +useMass integer 0 Use mass formulation instead of molar. Warning : Affects SourceFlux rates units. useSimpleAccumulation integer 1 Flag indicating whether simple accumulation form is used useTotalMassEquation integer 1 Flag indicating whether total mass equation is used LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst index 067a6a06a6a..1627f7eae15 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst @@ -27,7 +27,7 @@ targetRegions groupNameRef_array required Allowable targetRelativePressureChangeInTimeStep real64 0.2 Target (relative) change in pressure in a time step (expected value between 0 and 1) targetRelativeTemperatureChangeInTimeStep real64 0.2 Target (relative) change in temperature in a time step (expected value between 0 and 1) temperature real64 required Temperature -useMass integer 0 Use mass formulation instead of molar +useMass integer 0 Use mass formulation instead of molar. Warning : Affects SourceFlux rates units. useSimpleAccumulation integer 1 Flag indicating whether simple accumulation form is used useTotalMassEquation integer 1 Flag indicating whether total mass equation is used LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` diff --git a/src/coreComponents/schema/docs/SinglePhaseFVM.rst b/src/coreComponents/schema/docs/SinglePhaseFVM.rst index 6000056c728..f6ffdc9cbfb 100644 --- a/src/coreComponents/schema/docs/SinglePhaseFVM.rst +++ b/src/coreComponents/schema/docs/SinglePhaseFVM.rst @@ -1,22 +1,26 @@ -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -temperature real64 0 Temperature -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +allowNegativePressure integer 1 Flag indicating if negative pressure is allowed +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 | Flag indicating whether the problem is thermal or not. + | SourceFluxes application if isThermal is enabled : + | - negative value (injection): the mass balance equation is modified to considered the additional source term, + | - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. + | For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced. +logLevel integer 0 Log level +maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration +maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check +maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check +name groupName required A name is required for any non-unique nodes +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +temperature real64 0 Temperature +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst b/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst index 6000056c728..f6ffdc9cbfb 100644 --- a/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst +++ b/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst @@ -1,22 +1,26 @@ -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -temperature real64 0 Temperature -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +allowNegativePressure integer 1 Flag indicating if negative pressure is allowed +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 | Flag indicating whether the problem is thermal or not. + | SourceFluxes application if isThermal is enabled : + | - negative value (injection): the mass balance equation is modified to considered the additional source term, + | - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. + | For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced. +logLevel integer 0 Log level +maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration +maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check +maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check +name groupName required A name is required for any non-unique nodes +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +temperature real64 0 Temperature +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst b/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst index 6000056c728..f6ffdc9cbfb 100644 --- a/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst +++ b/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst @@ -1,22 +1,26 @@ -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -temperature real64 0 Temperature -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== +allowNegativePressure integer 1 Flag indicating if negative pressure is allowed +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 | Flag indicating whether the problem is thermal or not. + | SourceFluxes application if isThermal is enabled : + | - negative value (injection): the mass balance equation is modified to considered the additional source term, + | - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. + | For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced. +logLevel integer 0 Log level +maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration +maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check +maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check +name groupName required A name is required for any non-unique nodes +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +temperature real64 0 Temperature +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SourceFlux.rst b/src/coreComponents/schema/docs/SourceFlux.rst index c227dcbd7d8..660880a3b49 100644 --- a/src/coreComponents/schema/docs/SourceFlux.rst +++ b/src/coreComponents/schema/docs/SourceFlux.rst @@ -1,20 +1,20 @@ -====================== ================== ======== ============================================================================== -Name Type Default Description -====================== ================== ======== ============================================================================== -bcApplicationTableName groupNameRef Name of table that specifies the on/off application of the boundary condition. -beginTime real64 -1e+99 Time at which the boundary condition will start being applied. -component integer -1 Component of field (if tensor) to apply boundary condition to. -direction R1Tensor {0,0,0} Direction to apply boundary condition to. -endTime real64 1e+99 Time at which the boundary condition will stop being applied. -functionName groupNameRef Name of function that specifies variation of the boundary condition. -initialCondition integer 0 Boundary condition is applied as an initial condition. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -objectPath groupNameRef Path to the target field -scale real64 0 Scale factor for value of the boundary condition. -setNames groupNameRef_array required Name of sets that boundary condition is applied to. -====================== ================== ======== ============================================================================== +====================== ================== ======== ======================================================================================================================================================================================================================================================================================== +Name Type Default Description +====================== ================== ======== ======================================================================================================================================================================================================================================================================================== +bcApplicationTableName groupNameRef Name of table that specifies the on/off application of the boundary condition. +beginTime real64 -1e+99 Time at which the boundary condition will start being applied. +component integer -1 Component of field (if tensor) to apply boundary condition to. +direction R1Tensor {0,0,0} Direction to apply boundary condition to. +endTime real64 1e+99 Time at which the boundary condition will stop being applied. +functionName groupNameRef Name of a function that specifies the variation of the production rate variations of this SourceFlux.Multiplied by scale. If no function is provided, a constant value of 1 is used.The producted fluid rate unit is in kg by default, or in mole if the flow solver has a useMass of 0. +initialCondition integer 0 Boundary condition is applied as an initial condition. +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +objectPath groupNameRef Path to the target field +scale real64 0 Multiplier of the functionName value. If no functionName is provided, this value is used directly. +setNames groupNameRef_array required Name of sets that boundary condition is applied to. +====================== ================== ======== ======================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SourceFluxStatistics.rst b/src/coreComponents/schema/docs/SourceFluxStatistics.rst new file mode 100644 index 00000000000..a5ef4f42a89 --- /dev/null +++ b/src/coreComponents/schema/docs/SourceFluxStatistics.rst @@ -0,0 +1,16 @@ + + +============== ================== ======== ===================================================================================================================================================================================== +Name Type Default Description +============== ================== ======== ===================================================================================================================================================================================== +flowSolverName groupNameRef required Name of the flow solver +fluxNames groupNameRef_array {*} Name(s) array of the SourceFlux(s) for which we want the statistics. Use "*" to target all SourceFlux. +logLevel integer 0 | Log level + | - Log Level 1 outputs the sum of all SourceFlux(s) produced rate & mass, + | - Log Level 2 details values for each SourceFlux, + | - Log Level 3 details values for each region. +name groupName required A name is required for any non-unique nodes +writeCSV integer 0 Write statistics into a CSV file +============== ================== ======== ===================================================================================================================================================================================== + + diff --git a/src/coreComponents/schema/docs/SourceFluxStatistics_other.rst b/src/coreComponents/schema/docs/SourceFluxStatistics_other.rst new file mode 100644 index 00000000000..adf1c1b8aec --- /dev/null +++ b/src/coreComponents/schema/docs/SourceFluxStatistics_other.rst @@ -0,0 +1,9 @@ + + +==== ==== ============================ +Name Type Description +==== ==== ============================ + (no documentation available) +==== ==== ============================ + + diff --git a/src/coreComponents/schema/docs/Tasks.rst b/src/coreComponents/schema/docs/Tasks.rst index 95301497c5c..3a3a3e06a9f 100644 --- a/src/coreComponents/schema/docs/Tasks.rst +++ b/src/coreComponents/schema/docs/Tasks.rst @@ -15,6 +15,7 @@ SinglePhaseReservoirPoromechanicsInitialization node :ref:`X SinglePhaseStatistics node :ref:`XML_SinglePhaseStatistics` SolidMechanicsStateReset node :ref:`XML_SolidMechanicsStateReset` SolidMechanicsStatistics node :ref:`XML_SolidMechanicsStatistics` +SourceFluxStatistics node :ref:`XML_SourceFluxStatistics` TriaxialDriver node :ref:`XML_TriaxialDriver` =========================================================== ==== ======= ====================================================================== diff --git a/src/coreComponents/schema/docs/Tasks_other.rst b/src/coreComponents/schema/docs/Tasks_other.rst index dca37a26a99..4ee34a22e81 100644 --- a/src/coreComponents/schema/docs/Tasks_other.rst +++ b/src/coreComponents/schema/docs/Tasks_other.rst @@ -15,6 +15,7 @@ SinglePhaseReservoirPoromechanicsInitialization node :ref:`DATASTRUC SinglePhaseStatistics node :ref:`DATASTRUCTURE_SinglePhaseStatistics` SolidMechanicsStateReset node :ref:`DATASTRUCTURE_SolidMechanicsStateReset` SolidMechanicsStatistics node :ref:`DATASTRUCTURE_SolidMechanicsStatistics` +SourceFluxStatistics node :ref:`DATASTRUCTURE_SourceFluxStatistics` TriaxialDriver node :ref:`DATASTRUCTURE_TriaxialDriver` =========================================================== ==== ================================================================================ diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index f7b331fabf4..2180d14bcc5 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -511,6 +511,10 @@ + + + + @@ -1245,7 +1249,7 @@ This keyword is ignored for single-phase flow simulations--> - + @@ -1253,7 +1257,7 @@ This keyword is ignored for single-phase flow simulations--> - + @@ -2424,7 +2428,7 @@ the relative residual norm satisfies: - + @@ -2494,7 +2498,7 @@ the relative residual norm satisfies: - + @@ -3117,7 +3121,11 @@ Local - Add stabilization only to interiors of macro elements.--> - + @@ -3147,7 +3155,11 @@ Local - Add stabilization only to interiors of macro elements.--> - + @@ -3263,7 +3275,11 @@ Local - Add stabilization only to interiors of macro elements.--> - + @@ -3616,6 +3632,7 @@ Local - Add stabilization only to interiors of macro elements.--> + @@ -3781,6 +3798,21 @@ Local - Add stabilization only to interiors of macro elements.--> + + + + + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index b337dd2d503..e903f4ea2fa 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1305,6 +1305,7 @@ + @@ -1320,6 +1321,7 @@ + diff --git a/src/coreComponents/unitTests/CMakeLists.txt b/src/coreComponents/unitTests/CMakeLists.txt index a3d92867343..09542ae3472 100644 --- a/src/coreComponents/unitTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/CMakeLists.txt @@ -10,5 +10,6 @@ add_subdirectory( meshTests ) add_subdirectory( finiteVolumeTests ) add_subdirectory( fileIOTests ) add_subdirectory( fluidFlowTests ) +add_subdirectory( testingUtilities ) add_subdirectory( wellsTests ) -add_subdirectory( wavePropagationTests ) \ No newline at end of file +add_subdirectory( wavePropagationTests ) diff --git a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt index 7abc6ca2de1..2abdc8e16cf 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt @@ -1,10 +1,9 @@ # Specify list of tests - -set(gtest_geosx_tests - testSinglePhaseBaseKernels.cpp - testThermalCompMultiphaseFlow.cpp - testThermalSinglePhaseFlow.cpp - ) +set( gtest_geosx_tests + testSinglePhaseBaseKernels.cpp + testThermalCompMultiphaseFlow.cpp + testThermalSinglePhaseFlow.cpp + testFlowStatistics.cpp ) set( dependencyList ${parallelDeps} gtest ) @@ -14,6 +13,7 @@ else() list( APPEND dependencyList ${geosx_core_libs} ) endif() +set( dependencyList testingUtilities ) if( ENABLE_PVTPackage ) list( APPEND gtest_geosx_tests diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp new file mode 100644 index 00000000000..12de6b8f655 --- /dev/null +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp @@ -0,0 +1,1146 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" +#include "unitTests/testingUtilities/TestingTasks.hpp" +#include "mainInterface/initialization.hpp" +#include "mainInterface/GeosxState.hpp" +#include "fieldSpecification/SourceFluxStatistics.hpp" +#include "physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp" + +#include + + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; + + +//////////////////////////////// Test base utilities //////////////////////////////// + + +/** + * @brief this struct is used to provide the input data of each flow tests + */ +struct TestInputs +{ + string xmlInput; + std::map< string, string > tableFiles; + + string sourceFluxName; + string sinkFluxName; + string timeStepCheckerPath; + string timeStepFluxStatsPath; + string wholeSimFluxStatsPath; + string flowSolverPath; + + // rates for each timesteps, for each phases + array2d< real64 > sourceRates; + array2d< real64 > sinkRates; + + // parameters for precomputing results + real64 dt; + real64 sourceRateFactor; + real64 sinkRateFactor; + integer sourceElementsCount; + integer sinkElementsCount; + + /// In order to be sure that sub-timestepping is supported, requires the test to have at least one sub-timestep. + /// At least one simulation should test the timestep cuts ! + integer requiredSubTimeStep = 0; +}; + +/** + * @brief this struct computes from the test inputs the values to expect from the simulation. + */ +struct TestSet +{ + TestInputs const inputs; + + integer timestepCount; + integer totalElementsCount; + integer phaseCount; + + // stats for each timesteps, for each phases + array2d< real64 > sourceRates; + array2d< real64 > sinkRates; + array2d< real64 > sourceMassProd; + array2d< real64 > sinkMassProd; + array2d< real64 > massDeltas; + + // overall simulation stats for each phases + array1d< real64 > sourceMeanRate; + array1d< real64 > sinkMeanRate; + array1d< real64 > totalSourceMassProd; + array1d< real64 > totalSinkMassProd; + array1d< real64 > totalMassProd; + array1d< real64 > totalMeanRate; + + /** + * @brief Compute the expected statistics set for the tested simulation. + * @param inputParams the test simulation input parameters + */ + TestSet( TestInputs const & inputParams ): + inputs( inputParams ) + { + // tables must provide the same timestep & phase rates + EXPECT_EQ( inputs.sourceRates.size( 0 ), inputs.sinkRates.size( 0 )); + EXPECT_EQ( inputs.sourceRates.size( 1 ), inputs.sinkRates.size( 1 )); + + timestepCount = inputs.sourceRates.size( 0 ); + phaseCount = inputs.sourceRates.size( 1 ); + totalElementsCount = inputs.sourceElementsCount + inputs.sinkElementsCount; + + sourceRates.resize( timestepCount, phaseCount ); + sinkRates.resize( timestepCount, phaseCount ); + sourceMassProd.resize( timestepCount, phaseCount ); + sinkMassProd.resize( timestepCount, phaseCount ); + massDeltas.resize( timestepCount, phaseCount ); + sourceMeanRate.resize( phaseCount ); + sinkMeanRate.resize( phaseCount ); + totalSourceMassProd.resize( phaseCount ); + totalSinkMassProd.resize( phaseCount ); + totalMassProd.resize( phaseCount ); + totalMeanRate.resize( phaseCount ); + + for( integer ip = 0; ip < phaseCount; ++ip ) + { + for( integer timestepId = 0; timestepId < timestepCount; ++timestepId ) + { + // mass production / injection calculation + sourceRates[timestepId][ip] = inputs.sourceRates[timestepId][ip] * inputs.sourceRateFactor; + sourceMassProd[timestepId][ip] = inputs.sourceRates[timestepId][ip] * inputs.dt * inputs.sourceRateFactor; + totalSourceMassProd[ip] += sourceMassProd[timestepId][ip]; + sinkRates[timestepId][ip] = inputs.sinkRates[timestepId][ip] * inputs.sinkRateFactor; + sinkMassProd[timestepId][ip] = inputs.sinkRates[timestepId][ip] * inputs.dt * inputs.sinkRateFactor; + massDeltas[timestepId][ip] = -( sourceMassProd[timestepId][ip] + sinkMassProd[timestepId][ip] ); + totalSinkMassProd[ip] += sinkMassProd[timestepId][ip]; + // rates accumulations + sourceMeanRate[ip] += inputs.sourceRates[timestepId][ip] * inputs.sourceRateFactor; + sinkMeanRate[ip] += inputs.sinkRates[timestepId][ip] * inputs.sinkRateFactor; + } + // mean rates calculation + real64 const ratesMeanDivisor = 1.0 / double( timestepCount - 1 ); + sourceMeanRate[ip] *= ratesMeanDivisor; + sinkMeanRate[ip] *= ratesMeanDivisor; + // totals + totalMassProd[ip] = totalSinkMassProd[ip] + totalSourceMassProd[ip]; + totalMeanRate[ip] = sinkMeanRate[ip] + sourceMeanRate[ip]; + } + } +}; + + +class FlowStatisticsTest : public ::testing::Test +{ +public: + + void writeTableFiles( std::map< string, string > const & files ) + { + for( auto const & [fileName, content] : files ) + { + std::ofstream os( fileName ); + ASSERT_TRUE( os.is_open() ); + os << content; + os.close(); + + m_tableFileNames.push_back( fileName ); + } + } + + void TearDown() override + { + // removing temp table files + for( string const & fileName : m_tableFileNames ) + { + ASSERT_TRUE( std::remove( fileName.c_str() ) == 0 ); + } + m_tableFileNames.clear(); + } + +private: + std::vector< string > m_tableFileNames; +}; + + +void setRateTable( array2d< real64 > & rateTable, std::initializer_list< std::initializer_list< real64 > > timestepPhaseValues ) +{ + rateTable.resize( timestepPhaseValues.size(), timestepPhaseValues.begin()->size() ); + integer timestepId = 0; + for( auto const & phaseValues : timestepPhaseValues ) + { + integer ip = 0; + for( auto const & phaseValue : phaseValues ) + { + rateTable[timestepId][ip++] = phaseValue; + } + ++timestepId; + } +} + +real64 getTotalFluidMass( ProblemManager & problem, string_view flowSolverPath ) +{ + real64 totalMass = 0.0; + SolverBase const & solver = problem.getGroupByPath< SolverBase >( string( flowSolverPath ) ); + solver.forDiscretizationOnMeshTargets( problem.getDomainPartition().getMeshBodies(), + [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + mesh.getElemManager().forElementRegions( [&]( ElementRegionBase & region ) + { + SinglePhaseStatistics::RegionStatistics & regionStats = region.getReference< SinglePhaseStatistics::RegionStatistics >( + SinglePhaseStatistics::viewKeyStruct::regionStatisticsString() ); + + totalMass += regionStats.totalMass; + } ); + } ); + return totalMass; +} + + +/** + * @brief Verification that the source flux statistics are correct for the current timestep + * @param expectedMasses the expected mass values per phase + * @param expectedRates the expected rate values per phase + * @param expectedElementCount the number of expected targeted elements + * @param stats the timestep stats + * @param context a context string to provide in any error message. + */ +void checkFluxStats( arraySlice1d< real64 > const & expectedMasses, + arraySlice1d< real64 > const & expectedRates, + integer const expectedElementCount, + SourceFluxStatsAggregator::WrappedStats const & stats, + string_view context ) +{ + for( int ip = 0; ip < stats.stats().getPhaseCount(); ++ip ) + { + EXPECT_DOUBLE_EQ( stats.stats().m_producedMass[ip], expectedMasses[ip] ) << GEOS_FMT( "The flux named '{}' did not produce the expected mass ({}, phase = {}).", + stats.getFluxName(), context, ip ); + EXPECT_DOUBLE_EQ( stats.stats().m_productionRate[ip], expectedRates[ip] ) << GEOS_FMT( "The flux named '{}' did not produce at the expected rate ({}, phase = {}).", + stats.getFluxName(), context, ip ); + } + EXPECT_DOUBLE_EQ( stats.stats().m_elementCount, expectedElementCount ) << GEOS_FMT( "The flux named '{}' did not produce in the expected elements ({}).", + stats.getFluxName(), context ); +} + +/** + * @brief Verification that the source flux statistics are correct over the whole simulation + * @param problem the simulation ProblemManager + * @param testSet the simulation TestSet + */ +void checkWholeSimFluxStats( ProblemManager & problem, TestSet const & testSet ) +{ + DomainPartition & domain = problem.getDomainPartition(); + SourceFluxStatsAggregator & wholeSimStats = + problem.getGroupByPath< SourceFluxStatsAggregator >( testSet.inputs.wholeSimFluxStatsPath ); + + wholeSimStats.forMeshLevelStatsWrapper( domain, + [&] ( MeshLevel & meshLevel, + SourceFluxStatsAggregator::WrappedStats & meshLevelStats ) + { + wholeSimStats.forAllFluxStatsWrappers( meshLevel, + [&] ( MeshLevel &, + SourceFluxStatsAggregator::WrappedStats & fluxStats ) + { + if( fluxStats.getFluxName() == testSet.inputs.sourceFluxName ) + { + checkFluxStats( testSet.totalSourceMassProd, + testSet.sourceMeanRate, + testSet.inputs.sourceElementsCount, + fluxStats, "over whole simulation" ); + } + else if( fluxStats.getFluxName() == testSet.inputs.sinkFluxName ) + { + checkFluxStats( testSet.totalSinkMassProd, + testSet.sinkMeanRate, + testSet.inputs.sinkElementsCount, + fluxStats, "over whole simulation" ); + } + else + { + FAIL() << "Unexpected SourceFlux found!"; + } + } ); + + for( int ip = 0; ip < meshLevelStats.stats().getPhaseCount(); ++ip ) + { + EXPECT_DOUBLE_EQ( meshLevelStats.stats().m_producedMass[ip], testSet.totalMassProd[ip] ) << "The fluxes did not produce the expected total mass (over whole simulation, phase = " << ip << ")."; + EXPECT_DOUBLE_EQ( meshLevelStats.stats().m_productionRate[ip], testSet.totalMeanRate[ip] ) << "The fluxes did not produce at the expected rate (over whole simulation, phase = " << ip << ")."; + } + } ); +} + +/** + * @brief Verification that the source flux statistics are correct for a given timestep + * @param problem the simulation ProblemManager + * @param testSet the simulation TestSet + * @param time_n the current timestep start + * @param timestepId the current timestep id (= cycle) + */ +void checkTimeStepFluxStats( ProblemManager & problem, TestSet const & testSet, + real64 const time_n, integer const timestepId ) +{ + DomainPartition & domain = problem.getDomainPartition(); + SourceFluxStatsAggregator & timestepStats = + problem.getGroupByPath< SourceFluxStatsAggregator >( testSet.inputs.timeStepFluxStatsPath ); + + timestepStats.forMeshLevelStatsWrapper( domain, + [&] ( MeshLevel & meshLevel, + SourceFluxStatsAggregator::WrappedStats & ) + { + timestepStats.forAllFluxStatsWrappers( meshLevel, + [&] ( MeshLevel &, + SourceFluxStatsAggregator::WrappedStats & fluxStats ) + { + if( fluxStats.getFluxName() == testSet.inputs.sourceFluxName ) + { + checkFluxStats( testSet.sourceMassProd[timestepId], + testSet.sourceRates[timestepId], + testSet.inputs.sourceElementsCount, + fluxStats, GEOS_FMT( "for timestep at t = {} s", time_n ) ); + } + else if( fluxStats.getFluxName() == testSet.inputs.sinkFluxName ) + { + checkFluxStats( testSet.sinkMassProd[timestepId], + testSet.sinkRates[timestepId], + testSet.inputs.sinkElementsCount, + fluxStats, GEOS_FMT( "for timestep at t = {} s", time_n ) ); + } + else + { + FAIL() << "Unexpected SourceFlux found!"; + } + } ); + } ); +} + +void checkTimeStepStats( TestSet const & testSet, + real64 const time_n, + integer const timestepId ) +{ + EXPECT_LT( timestepId, testSet.timestepCount ) << GEOS_FMT( "The tested time-step count were higher than expected (t = {} s).", + time_n ); +} + +void checkWholeSimTimeStepStats( ProblemManager & problem, + TestSet const & testSet, + TimeStepChecker const & timeStepChecker ) +{ + EXPECT_EQ( timeStepChecker.getTestedTimeStepCount(), testSet.timestepCount ) << "The tested time-step were different than expected."; + + SolverBase const & solver = problem.getGroupByPath< SolverBase >( testSet.inputs.flowSolverPath ); + SolverStatistics const & solverStats = solver.getSolverStatistics(); + EXPECT_GE( solverStats.getNumTimeStepCuts(), testSet.inputs.requiredSubTimeStep ) << "The test did not encountered any timestep cut, but were expected to. " + "Consider adapting the simulation so a timestep cut occurs to check they work as expected."; +} + + +//////////////////////////////// SinglePhase Flux Statistics Test //////////////////////////////// +namespace SinglePhaseFluxStatisticsTest +{ + + +TestSet getTestSet() +{ + TestInputs testInputs; + + testInputs.xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +)xml"; + + + testInputs.sourceFluxName = "sourceFlux"; + testInputs.sinkFluxName = "sinkFlux"; + testInputs.timeStepCheckerPath = "/Tasks/timeStepChecker"; + testInputs.timeStepFluxStatsPath = "/Tasks/timeStepFluxStats"; + testInputs.wholeSimFluxStatsPath = "/Tasks/wholeSimFluxStats"; + testInputs.flowSolverPath = "/Solvers/testSolver"; + + testInputs.dt = 500.0; + testInputs.sourceElementsCount = 2; + testInputs.sinkElementsCount = 5; + + // FluxRate table from 0.0s to 5000.0s + setRateTable( testInputs.sourceRates, + { { 0.000 }, + { 0.000 }, + { 0.767 }, + { 0.894 }, + { 0.561 }, + { 0.234 }, + { 0.194 }, + { 0.178 }, + { 0.162 }, + { 0.059 }, + { 0.000 } } ); + testInputs.sinkRates=testInputs.sourceRates; + + // sink is 3x source production + testInputs.sourceRateFactor = -1.0; + testInputs.sinkRateFactor = 3.0; + + return TestSet( testInputs ); +} + +TEST_F( FlowStatisticsTest, checkSinglePhaseFluxStatistics ) +{ + TestSet const testSet = getTestSet(); + + GeosxState state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ); + ProblemManager & problem = state.getProblemManager(); + + setupProblemFromXML( problem, testSet.inputs.xmlInput.data() ); + + real64 firstMass; + + TimeStepChecker & timeStepChecker = problem.getGroupByPath< TimeStepChecker >( testSet.inputs.timeStepCheckerPath ); + timeStepChecker.setTimeStepCheckingFunction( [&]( real64 const time_n ) + { + integer const timestepId = timeStepChecker.getTestedTimeStepCount(); + checkTimeStepStats( testSet, time_n, timestepId ); + checkTimeStepFluxStats( problem, testSet, time_n, timestepId ); + + static bool passedFirstTimeStep = false; + if( !passedFirstTimeStep ) + { + passedFirstTimeStep = true; + firstMass = getTotalFluidMass( problem, testSet.inputs.flowSolverPath ); + } + } ); + + // run simulation + EXPECT_FALSE( problem.runSimulation() ) << "Simulation exited early."; + + checkWholeSimFluxStats( problem, testSet ); + checkWholeSimTimeStepStats( problem, testSet, timeStepChecker ); + + // check singlephasestatistics results + real64 const lastMass = getTotalFluidMass( problem, testSet.inputs.flowSolverPath ); + real64 const massDiffTol = 1e-7; + EXPECT_NEAR( lastMass - firstMass, + -testSet.totalMassProd[0], + massDiffTol * std::abs( testSet.totalMassProd[0] ) ) << GEOS_FMT( "{} total mass difference from start to end is not consistent with fluxes production.", + SinglePhaseStatistics::catalogName() ); +} + + +} /* namespace SinglePhaseFluxStatisticsTest */ + + +//////////////////////////////// Multiphase Flux Statistics Test //////////////////////////////// +namespace MultiPhaseFluxStatisticsTestMass +{ + + +TestSet getTestSet() +{ + TestInputs testInputs; + + testInputs.xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +)xml"; + + testInputs.tableFiles["pvtgas.txt"] = "DensityFun SpanWagnerCO2Density 1.5e7 2.5e7 1e5 370.15 400.15 2\n" + "ViscosityFun FenghourCO2Viscosity 1.5e7 2.5e7 1e5 370.15 400.15 2\n"; + + testInputs.tableFiles["pvtliquid.txt"] = "DensityFun EzrokhiBrineDensity 0.1033 -2.2991e-5 -2.3658e-6\n" + "ViscosityFun EzrokhiBrineViscosity 0 0 0\n"; + + testInputs.tableFiles["co2flash.txt"] = "FlashModel CO2Solubility 1.5e7 2.5e7 1e5 370.15 400.15 2 0\n"; + + + testInputs.sourceFluxName = "sourceFlux"; + testInputs.sinkFluxName = "sinkFlux"; + testInputs.timeStepCheckerPath = "/Tasks/timeStepChecker"; + testInputs.timeStepFluxStatsPath = "/Tasks/timeStepFluxStats"; + testInputs.wholeSimFluxStatsPath = "/Tasks/wholeSimFluxStats"; + testInputs.flowSolverPath = "/Solvers/testSolver"; + + testInputs.dt = 500.0; + testInputs.sourceElementsCount = 1; + testInputs.sinkElementsCount = 1; + + // FluxInjectionRate & FluxProductionRate table from 0.0s to 5000.0s + setRateTable( testInputs.sourceRates, + { { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.267, 0.0 }, + { 0.561, 0.0 }, + { 0.194, 0.0 }, + { 0.102, 0.0 }, + { 0.059, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 } } ); + setRateTable( testInputs.sinkRates, + { { 0.0, 0.000 }, + { 0.0, 0.000 }, + { 0.0, 0.003 }, + { 0.0, 0.062 }, + { 0.0, 0.121 }, + { 0.0, 0.427 }, + { 0.0, 0.502 }, + { 0.0, 0.199 }, + { 0.0, 0.083 }, + { 0.0, 0.027 }, + { 0.0, 0.000 } } ); + + testInputs.sourceRateFactor = -44e-3; + testInputs.sinkRateFactor = 18e-3; + + return TestSet( testInputs ); +} + + +TEST_F( FlowStatisticsTest, checkMultiPhaseFluxStatisticsMass ) +{ + TestSet const testSet = getTestSet(); + writeTableFiles( testSet.inputs.tableFiles ); + + GeosxState state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ); + ProblemManager & problem = state.getProblemManager(); + + setupProblemFromXML( problem, testSet.inputs.xmlInput.data() ); + + TimeStepChecker & timeStepChecker = problem.getGroupByPath< TimeStepChecker >( testSet.inputs.timeStepCheckerPath ); + timeStepChecker.setTimeStepCheckingFunction( [&]( real64 const time_n ) + { + integer const timestepId = timeStepChecker.getTestedTimeStepCount(); + checkTimeStepStats( testSet, time_n, timestepId ); + checkTimeStepFluxStats( problem, testSet, time_n, timestepId ); + } ); + + // run simulation + EXPECT_FALSE( problem.runSimulation() ) << "Simulation exited early."; + + checkWholeSimFluxStats( problem, testSet ); + checkWholeSimTimeStepStats( problem, testSet, timeStepChecker ); +} + + +} /* namespace MultiPhaseFluxStatisticsTest */ + + +//////////////////////////////// Multiphase Flux Statistics Test //////////////////////////////// +namespace MultiPhaseFluxStatisticsTestMol +{ + + +TestSet getTestSet() +{ + TestInputs testInputs; + + testInputs.xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +)xml"; + + testInputs.tableFiles["pvtgas.txt"] = "DensityFun SpanWagnerCO2Density 1.5e7 2.5e7 1e5 370.15 400.15 2\n" + "ViscosityFun FenghourCO2Viscosity 1.5e7 2.5e7 1e5 370.15 400.15 2\n"; + + testInputs.tableFiles["pvtliquid.txt"] = "DensityFun EzrokhiBrineDensity 0.1033 -2.2991e-5 -2.3658e-6\n" + "ViscosityFun EzrokhiBrineViscosity 0 0 0\n"; + + testInputs.tableFiles["co2flash.txt"] = "FlashModel CO2Solubility 1.5e7 2.5e7 1e5 370.15 400.15 2 0\n"; + + + testInputs.sourceFluxName = "sourceFlux"; + testInputs.sinkFluxName = "sinkFlux"; + testInputs.timeStepCheckerPath = "/Tasks/timeStepChecker"; + testInputs.timeStepFluxStatsPath = "/Tasks/timeStepFluxStats"; + testInputs.wholeSimFluxStatsPath = "/Tasks/wholeSimFluxStats"; + testInputs.flowSolverPath = "/Solvers/testSolver"; + + testInputs.dt = 500.0; + testInputs.sourceElementsCount = 1; + testInputs.sinkElementsCount = 1; + + // FluxInjectionRate & FluxProductionRate table from 0.0s to 5000.0s + setRateTable( testInputs.sourceRates, + { { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.267, 0.0 }, + { 0.561, 0.0 }, + { 0.194, 0.0 }, + { 0.102, 0.0 }, + { 0.059, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 }, + { 0.000, 0.0 } } ); + setRateTable( testInputs.sinkRates, + { { 0.0, 0.000 }, + { 0.0, 0.000 }, + { 0.0, 0.003 }, + { 0.0, 0.062 }, + { 0.0, 0.121 }, + { 0.0, 0.427 }, + { 0.0, 0.502 }, + { 0.0, 0.199 }, + { 0.0, 0.083 }, + { 0.0, 0.027 }, + { 0.0, 0.000 } } ); + + // scale is set to high values to make the solver generate timestep cuts + testInputs.sourceRateFactor = -8.0; + testInputs.sinkRateFactor = 8.0; + + // this simulation is set-up to have at least one timestep cut. + testInputs.requiredSubTimeStep = 2; + + return TestSet( testInputs ); +} + + +TEST_F( FlowStatisticsTest, checkMultiPhaseFluxStatisticsMol ) +{ + TestSet const testSet = getTestSet(); + writeTableFiles( testSet.inputs.tableFiles ); + + GeosxState state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ); + ProblemManager & problem = state.getProblemManager(); + + setupProblemFromXML( problem, testSet.inputs.xmlInput.data() ); + + TimeStepChecker & timeStepChecker = problem.getGroupByPath< TimeStepChecker >( testSet.inputs.timeStepCheckerPath ); + timeStepChecker.setTimeStepCheckingFunction( [&]( real64 const time_n ) + { + integer const timestepId = timeStepChecker.getTestedTimeStepCount(); + checkTimeStepStats( testSet, time_n, timestepId ); + checkTimeStepFluxStats( problem, testSet, time_n, timestepId ); + } ); + + // run simulation + EXPECT_FALSE( problem.runSimulation() ) << "Simulation exited early."; + + checkWholeSimFluxStats( problem, testSet ); + checkWholeSimTimeStepStats( problem, testSet, timeStepChecker ); +} + + +} /* namespace MultiPhaseFluxStatisticsTest */ + + +//////////////////////////////// Main //////////////////////////////// + + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + return result; +} diff --git a/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt b/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt new file mode 100644 index 00000000000..f6d8d8632b0 --- /dev/null +++ b/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt @@ -0,0 +1,33 @@ +# +# Specify all headers +# +set( testingUtilities_headers + TestingTasks.hpp + ) + +# +# Specify all sources +# +set( testingUtilities_sources + TestingTasks.cpp + ) + +# +# Specify all dependencies +# +set( dependencyList ${parallelDeps} gtest ) + +if ( GEOSX_BUILD_SHARED_LIBS ) + list( APPEND dependencyList geosx_core ) +else() + list( APPEND dependencyList ${geosx_core_libs} ) +endif() + +blt_add_library( NAME testingUtilities + SOURCES ${testingUtilities_sources} + HEADERS ${testingUtilities_headers} + DEPENDS_ON ${dependencyList} + OBJECT ${GEOSX_BUILD_OBJ_LIBS} + ) + +target_include_directories( testingUtilities PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp b/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp new file mode 100644 index 00000000000..b948a406071 --- /dev/null +++ b/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp @@ -0,0 +1,50 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file TestingTasks.cpp + */ + +#include "TestingTasks.hpp" + +namespace geos +{ +namespace testing +{ + + +TimeStepChecker::TimeStepChecker( string const & name, Group * const parent ): + TaskBase( name, parent ) +{} + +bool TimeStepChecker::execute( real64 const time_n, + real64 const GEOS_UNUSED_PARAM( dt ), + integer const GEOS_UNUSED_PARAM( cycleNumber ), + integer const GEOS_UNUSED_PARAM( eventCounter ), + real64 const GEOS_UNUSED_PARAM( eventProgress ), + DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +{ + EXPECT_TRUE( m_checkTimeStepFunction ); + m_checkTimeStepFunction( time_n ); + + ++m_timestepId; + return false; +} + +REGISTER_CATALOG_ENTRY( TaskBase, TimeStepChecker, string const &, geos::dataRepository::Group * const ) + + +} // namespace testing + +} // namespace geos diff --git a/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp b/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp new file mode 100644 index 00000000000..f52a9e54834 --- /dev/null +++ b/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp @@ -0,0 +1,80 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * @file TestingTasks.hpp + */ + +#ifndef GEOS_EVENTS_TASKS_TESTINGTASKS_HPP_ +#define GEOS_EVENTS_TASKS_TESTINGTASKS_HPP_ + +#include "events/tasks/TaskBase.hpp" +#include "codingUtilities/UnitTestUtilities.hpp" + +namespace geos +{ +namespace testing +{ + + +/** + * @brief This Task allows to do checks each timestep during the simulation by calling a provided functor. + * To be executed, it must be - as every task - declared in the provided xmlInput within the Tasks node and called by an even. + * As this Group is designed for developpers and not user oriented, it should not appear in the documentation nor in the xsd. + * Question: could this task be used in the integratedTests ? + */ +class TimeStepChecker : public TaskBase +{ +public: + /** + * @brief Construct a new TimeStepChecker Task + * @param name name in xsd + * @param parent parent group in hierarchy + */ + TimeStepChecker( string const & name, Group * const parent ); + + /** + * @brief Set the functor that must be called each time this Task is executed. + * @param func the functor to execute + */ + void setTimeStepCheckingFunction( std::function< void(real64) > func ) + { m_checkTimeStepFunction = std::function< void(real64) >( func ); } + + /** + * @return Get the tested time-step count + */ + integer getTestedTimeStepCount() const + { return m_timestepId; } + + /** + * @brief Catalog name interface + * @return This type's catalog name + */ + static string catalogName() { return "TimeStepChecker"; } + + virtual bool execute( real64 time_n, real64 dt, integer cycleNumber, + integer eventCounter, real64 eventProgress, + DomainPartition & domain ); + +private: + std::function< void(real64) > m_checkTimeStepFunction; + int m_timestepId = 0; +}; + + +} // namespace testing + +} // namespace geos + +#endif //GEOS_EVENTS_TASKS_TESTINGTASKS_HPP_ diff --git a/src/docs/sphinx/CompleteXMLSchema.rst b/src/docs/sphinx/CompleteXMLSchema.rst index 7ab5a264d15..46a0ade984c 100644 --- a/src/docs/sphinx/CompleteXMLSchema.rst +++ b/src/docs/sphinx/CompleteXMLSchema.rst @@ -1235,6 +1235,13 @@ Element: SourceFlux .. include:: ../../coreComponents/schema/docs/SourceFlux.rst +.. _XML_SourceFluxStatistics: + +Element: SourceFluxStatistics +============================= +.. include:: ../../coreComponents/schema/docs/SourceFluxStatistics.rst + + .. _XML_SurfaceElementRegion: Element: SurfaceElementRegion @@ -2695,6 +2702,13 @@ Datastructure: SourceFlux .. include:: ../../coreComponents/schema/docs/SourceFlux_other.rst +.. _DATASTRUCTURE_SourceFluxStatistics: + +Datastructure: SourceFluxStatistics +=================================== +.. include:: ../../coreComponents/schema/docs/SourceFluxStatistics_other.rst + + .. _DATASTRUCTURE_SurfaceElementRegion: Datastructure: SurfaceElementRegion From d0a4088666f23ed921a9d671e8f54fa7db9a7773 Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Fri, 14 Jun 2024 10:07:31 -0500 Subject: [PATCH 094/286] Allow extra parameters for fluid models (#3157) --- .../constitutive/CMakeLists.txt | 1 + .../CompositionalMultiphaseFluid.cpp | 110 ++++++++---------- .../CompositionalMultiphaseFluid.hpp | 32 ++--- .../models/ComponentProperties.hpp | 35 ++---- .../models/CompositionalDensity.hpp | 5 +- .../models/ConstantViscosity.cpp | 56 ++++++++- .../models/ConstantViscosity.hpp | 38 +++++- .../compositional/models/FunctionBase.hpp | 9 +- .../models/LohrenzBrayClarkViscosity.cpp | 90 +++++++++++++- .../models/LohrenzBrayClarkViscosity.hpp | 50 +++++++- .../models/LohrenzBrayClarkViscosityImpl.hpp | 2 +- .../compositional/models/ModelParameters.hpp | 92 +++++++++++++++ .../models/NegativeTwoPhaseFlashModel.cpp | 7 +- .../models/NegativeTwoPhaseFlashModel.hpp | 3 +- .../compositional/models/NullModel.hpp | 16 ++- .../compositional/models/PhaseModel.hpp | 29 ++++- .../constitutive/unitTests/TestFluid.hpp | 20 ++-- .../unitTests/testCompositionalDensity.cpp | 4 +- .../unitTests/testKValueInitialization.cpp | 1 - .../testLohrenzBrayClarkViscosity.cpp | 9 +- ...CompositionalTwoPhaseFluidPengRobinson.rst | 2 +- ...positionalTwoPhaseFluidPengRobinsonLBC.rst | 34 +++--- ...sitionalTwoPhaseFluidSoaveRedlichKwong.rst | 2 +- ...ionalTwoPhaseFluidSoaveRedlichKwongLBC.rst | 34 +++--- src/coreComponents/schema/schema.xsd | 22 +++- .../testPVT_Compositional.xml | 2 - 26 files changed, 517 insertions(+), 188 deletions(-) create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index 51cd46fe4d1..f75dd705d84 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -74,6 +74,7 @@ set( constitutive_headers fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp + fluid/multifluid/compositional/models/ModelParameters.hpp fluid/multifluid/compositional/models/NullModel.hpp fluid/multifluid/compositional/models/PhaseModel.hpp fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp index ac083badbd2..0b7d2403e5a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp @@ -45,7 +45,9 @@ namespace constitutive template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >:: CompositionalMultiphaseFluid( string const & name, Group * const parent ) - : MultiFluidBase( name, parent ) + : MultiFluidBase( name, parent ), + m_componentProperties( std::make_unique< compositional::ComponentProperties >( m_componentNames, m_componentMolarWeight ) ), + m_parameters( createModelParameters() ) { using InputFlags = dataRepository::InputFlags; @@ -53,31 +55,30 @@ CompositionalMultiphaseFluid( string const & name, Group * const parent ) getWrapperBase( viewKeyStruct::componentMolarWeightString() ).setInputFlag( InputFlags::REQUIRED ); getWrapperBase( viewKeyStruct::phaseNamesString() ).setInputFlag( InputFlags::REQUIRED ); - registerWrapper( viewKeyStruct::componentCriticalPressureString(), &m_componentCriticalPressure ). + registerWrapper( viewKeyStruct::componentCriticalPressureString(), &m_componentProperties->m_componentCriticalPressure ). setInputFlag( InputFlags::REQUIRED ). setDescription( "Component critical pressures" ); - registerWrapper( viewKeyStruct::componentCriticalTemperatureString(), &m_componentCriticalTemperature ). + registerWrapper( viewKeyStruct::componentCriticalTemperatureString(), &m_componentProperties->m_componentCriticalTemperature ). setInputFlag( InputFlags::REQUIRED ). setDescription( "Component critical temperatures" ); - registerWrapper( viewKeyStruct::componentCriticalVolumeString(), &m_componentCriticalVolume ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Component critical volumnes" ); - - registerWrapper( viewKeyStruct::componentAcentricFactorString(), &m_componentAcentricFactor ). + registerWrapper( viewKeyStruct::componentAcentricFactorString(), &m_componentProperties->m_componentAcentricFactor ). setInputFlag( InputFlags::REQUIRED ). setDescription( "Component acentric factors" ); - registerWrapper( viewKeyStruct::componentVolumeShiftString(), &m_componentVolumeShift ). + registerWrapper( viewKeyStruct::componentVolumeShiftString(), &m_componentProperties->m_componentVolumeShift ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Component volume shifts" ); - registerWrapper( viewKeyStruct::componentBinaryCoeffString(), &m_componentBinaryCoeff ). + registerWrapper( viewKeyStruct::componentBinaryCoeffString(), &m_componentProperties->m_componentBinaryCoeff ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Table of binary interaction coefficients" ); registerField( fields::multifluid::kValues{}, &m_kValues ); + + // Link parameters specific to each model + m_parameters->registerParameters( this ); } template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > @@ -134,56 +135,50 @@ void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::postProcessI InputError ); }; - checkInputSize( m_componentCriticalPressure, NC, viewKeyStruct::componentCriticalPressureString() ); - checkInputSize( m_componentCriticalTemperature, NC, viewKeyStruct::componentCriticalTemperatureString() ); - checkInputSize( m_componentAcentricFactor, NC, viewKeyStruct::componentAcentricFactorString() ); - - if( m_componentCriticalVolume.empty() ) - { - m_componentCriticalVolume.resize( NC ); - calculateCriticalVolume( m_componentCriticalPressure, - m_componentCriticalTemperature, - m_componentCriticalVolume ); - } - checkInputSize( m_componentCriticalVolume, NC, viewKeyStruct::componentCriticalVolumeString() ); + checkInputSize( m_componentProperties->m_componentCriticalPressure, NC, viewKeyStruct::componentCriticalPressureString() ); + checkInputSize( m_componentProperties->m_componentCriticalTemperature, NC, viewKeyStruct::componentCriticalTemperatureString() ); + checkInputSize( m_componentProperties->m_componentAcentricFactor, NC, viewKeyStruct::componentAcentricFactorString() ); - if( m_componentVolumeShift.empty() ) + if( m_componentProperties->m_componentVolumeShift.empty() ) { - m_componentVolumeShift.resize( NC ); - m_componentVolumeShift.zero(); + m_componentProperties->m_componentVolumeShift.resize( NC ); + m_componentProperties->m_componentVolumeShift.zero(); } - checkInputSize( m_componentVolumeShift, NC, viewKeyStruct::componentVolumeShiftString() ); + checkInputSize( m_componentProperties->m_componentVolumeShift, NC, viewKeyStruct::componentVolumeShiftString() ); - if( m_componentBinaryCoeff.empty() ) + array2d< real64 > & componentBinaryCoeff = m_componentProperties->m_componentBinaryCoeff; + if( componentBinaryCoeff.empty() ) { - m_componentBinaryCoeff.resize( NC, NC ); - m_componentBinaryCoeff.zero(); + componentBinaryCoeff.resize( NC, NC ); + componentBinaryCoeff.zero(); } - checkInputSize( m_componentBinaryCoeff, NC * NC, viewKeyStruct::componentBinaryCoeffString() ); + checkInputSize( componentBinaryCoeff, NC * NC, viewKeyStruct::componentBinaryCoeffString() ); // Binary interaction coefficients should be symmetric and have zero diagonal - GEOS_THROW_IF_NE_MSG( m_componentBinaryCoeff.size( 0 ), NC, + GEOS_THROW_IF_NE_MSG( componentBinaryCoeff.size( 0 ), NC, GEOS_FMT( "{}: invalid number of values in attribute '{}'", getFullName(), viewKeyStruct::componentBinaryCoeffString() ), InputError ); - GEOS_THROW_IF_NE_MSG( m_componentBinaryCoeff.size( 1 ), NC, + GEOS_THROW_IF_NE_MSG( componentBinaryCoeff.size( 1 ), NC, GEOS_FMT( "{}: invalid number of values in attribute '{}'", getFullName(), viewKeyStruct::componentBinaryCoeffString() ), InputError ); for( integer ic = 0; ic < NC; ++ic ) { - GEOS_THROW_IF_GT_MSG( LvArray::math::abs( m_componentBinaryCoeff( ic, ic )), MultiFluidConstants::epsilon, + GEOS_THROW_IF_GT_MSG( LvArray::math::abs( componentBinaryCoeff( ic, ic )), MultiFluidConstants::epsilon, GEOS_FMT( "{}: {} entry at ({},{}) is {}: should be zero", getFullName(), viewKeyStruct::componentBinaryCoeffString(), - ic, ic, m_componentBinaryCoeff( ic, ic ) ), + ic, ic, componentBinaryCoeff( ic, ic ) ), InputError ); for( integer jc = ic + 1; jc < NC; ++jc ) { - real64 const difference = LvArray::math::abs( m_componentBinaryCoeff( ic, jc )-m_componentBinaryCoeff( jc, ic )); + real64 const difference = LvArray::math::abs( componentBinaryCoeff( ic, jc )-componentBinaryCoeff( jc, ic )); GEOS_THROW_IF_GT_MSG( difference, MultiFluidConstants::epsilon, GEOS_FMT( "{}: {} entry at ({},{}) is {} and is different from entry at ({},{}) which is {}", getFullName(), viewKeyStruct::componentBinaryCoeffString(), - ic, jc, m_componentBinaryCoeff( ic, jc ), jc, ic, m_componentBinaryCoeff( jc, ic ) ), + ic, jc, componentBinaryCoeff( ic, jc ), jc, ic, componentBinaryCoeff( jc, ic ) ), InputError ); } } + + m_parameters->postProcessInput( this, *m_componentProperties ); } template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > @@ -238,40 +233,37 @@ CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createKernelWrapp template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createModels() { - m_componentProperties = std::make_unique< compositional::ComponentProperties >( - m_componentNames, - m_componentMolarWeight, - m_componentCriticalPressure, - m_componentCriticalTemperature, - m_componentCriticalVolume, - m_componentAcentricFactor, - m_componentVolumeShift, - m_componentBinaryCoeff ); - m_flash = std::make_unique< FLASH >( getName() + '_' + FLASH::catalogName(), - *m_componentProperties ); + *m_componentProperties, + *m_parameters ); m_phase1 = std::make_unique< PHASE1 >( GEOS_FMT( "{}_PhaseModel1", getName() ), - *m_componentProperties ); + *m_componentProperties, + 0, + *m_parameters ); m_phase2 = std::make_unique< PHASE2 >( GEOS_FMT( "{}_PhaseModel2", getName() ), - *m_componentProperties ); + *m_componentProperties, + 1, + *m_parameters ); m_phase3 = std::make_unique< PHASE3 >( GEOS_FMT( "{}_PhaseModel3", getName() ), - *m_componentProperties ); + *m_componentProperties, + 2, + *m_parameters ); } +// Create the fluid models template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > -void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::calculateCriticalVolume( - arrayView1d< const real64 > const criticalPressure, - arrayView1d< const real64 > const criticalTemperature, - arrayView1d< real64 > const criticalVolume ) const +std::unique_ptr< compositional::ModelParameters > +CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createModelParameters() { - integer const numComponents = criticalPressure.size( 0 ); - for( integer ic=0; ic parameters; + parameters = FLASH::createParameters( std::move( parameters )); + parameters = PHASE1::createParameters( std::move( parameters )); + parameters = PHASE2::createParameters( std::move( parameters )); + parameters = PHASE3::createParameters( std::move( parameters )); + return parameters; } // Explicit instantiation of the model template. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp index 57cbe7e7919..6d66c971ece 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp @@ -24,6 +24,7 @@ #include "constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp" #include "constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp" #include "constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp" +#include "constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp" #include "constitutive/fluid/multifluid/compositional/models/NullModel.hpp" #include "constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp" @@ -87,7 +88,6 @@ class CompositionalMultiphaseFluid : public MultiFluidBase { static constexpr char const * componentCriticalPressureString() { return "componentCriticalPressure"; } static constexpr char const * componentCriticalTemperatureString() { return "componentCriticalTemperature"; } - static constexpr char const * componentCriticalVolumeString() { return "componentCriticalVolume"; } static constexpr char const * componentAcentricFactorString() { return "componentAcentricFactor"; } static constexpr char const * componentVolumeShiftString() { return "componentVolumeShift"; } static constexpr char const * componentBinaryCoeffString() { return "componentBinaryCoeff"; } @@ -110,39 +110,25 @@ class CompositionalMultiphaseFluid : public MultiFluidBase virtual void resizeFields( localIndex const size, localIndex const numPts ) override; -private: - /** - * @brief Estimate critical volumes using Ihmels' (2010) correlation - * @details reference: http://dx.doi.org/10.1021/je100167w - * @param[in] criticalPressure The component critical pressures - * @param[in] criticalTemperature The component critical temperatures - * @param[in] criticalVolume The component critical volumes - */ - void calculateCriticalVolume( arrayView1d< const real64 > const criticalPressure, - arrayView1d< const real64 > const criticalTemperature, - arrayView1d< real64 > const criticalVolume ) const; - private: // Create the fluid models void createModels(); + static std::unique_ptr< compositional::ModelParameters > createModelParameters(); + // Flash model std::unique_ptr< FLASH > m_flash{}; // Phase models - std::unique_ptr< PHASE1 > m_phase1; - std::unique_ptr< PHASE2 > m_phase2; - std::unique_ptr< PHASE3 > m_phase3; + std::unique_ptr< PHASE1 > m_phase1{}; + std::unique_ptr< PHASE2 > m_phase2{}; + std::unique_ptr< PHASE3 > m_phase3{}; + // Standard EOS component input std::unique_ptr< compositional::ComponentProperties > m_componentProperties{}; - // standard EOS component input - array1d< real64 > m_componentCriticalPressure; - array1d< real64 > m_componentCriticalTemperature; - array1d< real64 > m_componentCriticalVolume; - array1d< real64 > m_componentAcentricFactor; - array1d< real64 > m_componentVolumeShift; - array2d< real64 > m_componentBinaryCoeff; + // Extra parameters specific to this model + std::unique_ptr< compositional::ModelParameters > m_parameters{}; // backup data PhaseComp::ValueType m_kValues; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp index db04c2cafc4..f5a1e43a2e9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp @@ -37,21 +37,9 @@ class ComponentProperties final { public: ComponentProperties( string_array const & componentNames, - array1d< real64 > const & componentMolarWeight, - array1d< real64 > const & componentCriticalPressure, - array1d< real64 > const & componentCriticalTemperature, - array1d< real64 > const & componentCriticalVolume, - array1d< real64 > const & componentAcentricFactor, - array1d< real64 > const & componentVolumeShift, - array2d< real64 > const & componentBinaryCoeff ): + array1d< real64 > const & componentMolarWeight ): m_componentNames ( componentNames ), - m_componentMolarWeight ( componentMolarWeight ), - m_componentCriticalPressure ( componentCriticalPressure ), - m_componentCriticalTemperature( componentCriticalTemperature ), - m_componentCriticalVolume( componentCriticalVolume ), - m_componentAcentricFactor( componentAcentricFactor ), - m_componentVolumeShift( componentVolumeShift ), - m_componentBinaryCoeff( componentBinaryCoeff ) + m_componentMolarWeight ( componentMolarWeight ) {} ~ComponentProperties() = default; @@ -70,7 +58,6 @@ class ComponentProperties final arrayView1d< real64 > const & getComponentMolarWeight() const { return m_componentMolarWeight; } arrayView1d< real64 > const & getComponentCriticalPressure() const { return m_componentCriticalPressure; } arrayView1d< real64 > const & getComponentCriticalTemperature() const { return m_componentCriticalTemperature; } - arrayView1d< real64 > const & getComponentCriticalVolume() const { return m_componentCriticalVolume; } arrayView1d< real64 > const & getComponentAcentricFactor() const { return m_componentAcentricFactor; } arrayView1d< real64 > const & getComponentVolumeShift() const { return m_componentVolumeShift; } @@ -79,14 +66,12 @@ class ComponentProperties final KernelWrapper( arrayView1d< real64 const > const & componentMolarWeight, arrayView1d< real64 const > const & componentCriticalPressure, arrayView1d< real64 const > const & componentCriticalTemperature, - arrayView1d< real64 const > const & componentCriticalVolume, arrayView1d< real64 const > const & componentAcentricFactor, arrayView1d< real64 const > const & componentVolumeShift, arrayView2d< real64 const > const & componentBinaryCoeff ): m_componentMolarWeight ( componentMolarWeight ), m_componentCriticalPressure ( componentCriticalPressure ), m_componentCriticalTemperature( componentCriticalTemperature ), - m_componentCriticalVolume( componentCriticalVolume ), m_componentAcentricFactor( componentAcentricFactor ), m_componentVolumeShift( componentVolumeShift ), m_componentBinaryCoeff( componentBinaryCoeff ) @@ -104,7 +89,6 @@ class ComponentProperties final m_componentMolarWeight.move( space, touch ); m_componentCriticalPressure.move( space, touch ); m_componentCriticalTemperature.move( space, touch ); - m_componentCriticalVolume.move( space, touch ); m_componentAcentricFactor.move( space, touch ); m_componentVolumeShift.move( space, touch ); m_componentBinaryCoeff.move( space, touch ); @@ -114,7 +98,6 @@ class ComponentProperties final arrayView1d< real64 const > m_componentMolarWeight; arrayView1d< real64 const > m_componentCriticalPressure; arrayView1d< real64 const > m_componentCriticalTemperature; - arrayView1d< real64 const > m_componentCriticalVolume; arrayView1d< real64 const > m_componentAcentricFactor; arrayView1d< real64 const > m_componentVolumeShift; arrayView2d< real64 const > m_componentBinaryCoeff; @@ -129,22 +112,20 @@ class ComponentProperties final return KernelWrapper( m_componentMolarWeight, m_componentCriticalPressure, m_componentCriticalTemperature, - m_componentCriticalVolume, m_componentAcentricFactor, m_componentVolumeShift, m_componentBinaryCoeff ); } -private: +public: // Standard compositional input string_array const & m_componentNames; array1d< real64 > const & m_componentMolarWeight; - array1d< real64 > const & m_componentCriticalPressure; - array1d< real64 > const & m_componentCriticalTemperature; - array1d< real64 > const & m_componentCriticalVolume; - array1d< real64 > const & m_componentAcentricFactor; - array1d< real64 > const & m_componentVolumeShift; - array2d< real64 > const & m_componentBinaryCoeff; + array1d< real64 > m_componentCriticalPressure; + array1d< real64 > m_componentCriticalTemperature; + array1d< real64 > m_componentAcentricFactor; + array1d< real64 > m_componentVolumeShift; + array2d< real64 > m_componentBinaryCoeff; }; } // namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp index ea0a9b27319..7adcd78a3e1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp @@ -63,9 +63,12 @@ class CompositionalDensity : public FunctionBase { public: CompositionalDensity( string const & name, - ComponentProperties const & componentProperties ) + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ) : FunctionBase( name, componentProperties ) { + GEOS_UNUSED_VAR( phaseIndex, modelParameters ); // Calculate the dimensional volume shift m_componentDimensionalVolumeShift.resize( componentProperties.getNumberOfComponents()); EOS_TYPE::calculateDimensionalVolumeShift( componentProperties, diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp index 6ee6094aa06..0879c590adf 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp @@ -17,6 +17,7 @@ */ #include "ConstantViscosity.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" namespace geos { @@ -28,14 +29,65 @@ namespace compositional { ConstantViscosity::ConstantViscosity( string const & name, - ComponentProperties const & componentProperties ): + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ): FunctionBase( name, componentProperties ) +{ + Parameters const * parameters = modelParameters.get< Parameters >(); + m_constantPhaseViscosity = parameters->m_constantPhaseViscosity[phaseIndex]; +} + +ConstantViscosityUpdate::ConstantViscosityUpdate( real64 const constantPhaseViscosity ): + m_constantPhaseViscosity( constantPhaseViscosity ) {} ConstantViscosity::KernelWrapper ConstantViscosity::createKernelWrapper() const { - return KernelWrapper( ); + return KernelWrapper( m_constantPhaseViscosity ); +} + +std::unique_ptr< ModelParameters > +ConstantViscosity::createParameters( std::unique_ptr< ModelParameters > parameters ) +{ + if( parameters && parameters->get< Parameters >() != nullptr ) + { + return parameters; + } + return std::make_unique< Parameters >( std::move( parameters ) ); +} + +ConstantViscosity::Parameters::Parameters( std::unique_ptr< ModelParameters > parameters ): + ModelParameters( std::move( parameters ) ) +{} + +void ConstantViscosity::Parameters::registerParametersImpl( MultiFluidBase * fluid ) +{ + fluid->registerWrapper( viewKeyStruct::constantPhaseViscosityString(), &m_constantPhaseViscosity ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDescription( "Constant phase viscosity" ); +} + +void ConstantViscosity::Parameters::postProcessInputImpl( MultiFluidBase const * fluid, + ComponentProperties const & componentProperties ) +{ + GEOS_UNUSED_VAR( componentProperties ); + + integer const numPhase = fluid->numFluidPhases(); + + if( m_constantPhaseViscosity.empty() ) + { + m_constantPhaseViscosity.resize( numPhase ); + for( integer ip = 0; ip < numPhase; ++ip ) + { + m_constantPhaseViscosity[ip] = ConstantViscosity::defaultViscosity; + } + } + GEOS_THROW_IF_NE_MSG( m_constantPhaseViscosity.size(), numPhase, + GEOS_FMT( "{}: invalid number of values in attribute '{}'", fluid->getFullName(), + viewKeyStruct::constantPhaseViscosityString() ), + InputError ); } } // end namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp index 83948f00cbb..a4f0a733c17 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp @@ -33,7 +33,7 @@ namespace compositional class ConstantViscosityUpdate final : public FunctionBaseUpdate { public: - ConstantViscosityUpdate() = default; + explicit ConstantViscosityUpdate( real64 const constantPhaseViscosity ); template< integer USD1, integer USD2 > GEOS_HOST_DEVICE @@ -46,13 +46,20 @@ class ConstantViscosityUpdate final : public FunctionBaseUpdate real64 & viscosity, arraySlice1d< real64, USD2 > const & dViscosity, bool useMass ) const; + +private: + real64 const m_constantPhaseViscosity; }; class ConstantViscosity : public FunctionBase { +public: + static constexpr real64 defaultViscosity = 0.001; public: ConstantViscosity( string const & name, - ComponentProperties const & componentProperties ); + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ); static string catalogName() { return ""; } @@ -69,6 +76,31 @@ class ConstantViscosity : public FunctionBase * @return the wrapper */ KernelWrapper createKernelWrapper() const; + + // Parameters for constant viscosity model + class Parameters : public ModelParameters + { +public: + Parameters( std::unique_ptr< ModelParameters > parameters ); + ~Parameters() override = default; + + array1d< real64 > m_constantPhaseViscosity; + +private: + void registerParametersImpl( MultiFluidBase * fluid ) override; + void postProcessInputImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) override; + + struct viewKeyStruct + { + static constexpr char const * constantPhaseViscosityString() { return "constantPhaseViscosity"; } + }; + }; + + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ); + +private: + real64 m_constantPhaseViscosity{defaultViscosity}; }; template< integer USD1, integer USD2 > @@ -88,7 +120,7 @@ void ConstantViscosityUpdate::compute( ComponentProperties::KernelWrapper const GEOS_UNUSED_VAR( phaseComposition ); GEOS_UNUSED_VAR( density, dDensity ); - viscosity = 0.001; + viscosity = m_constantPhaseViscosity; LvArray::forValuesInSlice( dViscosity, setZero ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp index 3ccb6c97f8a..7525a48a445 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp @@ -19,9 +19,8 @@ #ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_FUNCTIONBASE_HPP_ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_FUNCTIONBASE_HPP_ -#include "dataRepository/ObjectCatalog.hpp" - #include "ComponentProperties.hpp" +#include "ModelParameters.hpp" namespace geos { @@ -83,6 +82,12 @@ class FunctionBase virtual FunctionType functionType() const = 0; + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ) + { + return parameters; + } + protected: /// Name of the PVT function string m_functionName; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp index e9b3f1b4043..d6ce442163f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp @@ -19,6 +19,7 @@ #include "LohrenzBrayClarkViscosity.hpp" #include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" namespace geos { @@ -29,19 +30,96 @@ namespace constitutive namespace compositional { -LohrenzBrayClarkViscosityUpdate::LohrenzBrayClarkViscosityUpdate( MixingType const mixing_type ) - : m_mixing_type( mixing_type ) +LohrenzBrayClarkViscosityUpdate::LohrenzBrayClarkViscosityUpdate( MixingType const mixing_type, + arrayView1d< real64 const > const & componentCriticalVolume ) + : m_mixing_type( mixing_type ), + m_componentCriticalVolume( componentCriticalVolume ) {} LohrenzBrayClarkViscosity::LohrenzBrayClarkViscosity( string const & name, - ComponentProperties const & componentProperties ): - FunctionBase( name, componentProperties ) -{} + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ): + FunctionBase( name, componentProperties ), + m_parameters( modelParameters.get< Parameters >() ) +{ + GEOS_UNUSED_VAR( phaseIndex ); +} LohrenzBrayClarkViscosity::KernelWrapper LohrenzBrayClarkViscosity::createKernelWrapper() const { - return KernelWrapper( m_mixing_type ); + auto const mixingType = EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::fromString( m_parameters->m_componentMixingType ); + return KernelWrapper( mixingType, m_parameters->m_componentCriticalVolume ); +} + +std::unique_ptr< ModelParameters > +LohrenzBrayClarkViscosity::createParameters( std::unique_ptr< ModelParameters > parameters ) +{ + if( parameters && parameters->get< Parameters >() != nullptr ) + { + return parameters; + } + return std::make_unique< Parameters >( std::move( parameters ) ); +} + +LohrenzBrayClarkViscosity::Parameters::Parameters( std::unique_ptr< ModelParameters > parameters ): + ModelParameters( std::move( parameters ) ) +{ + constexpr LohrenzBrayClarkViscosityUpdate::MixingType defaultMixing = LohrenzBrayClarkViscosityUpdate::MixingType::HERNING_ZIPPERER; + m_componentMixingType = EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::toString( defaultMixing ); +} + +void LohrenzBrayClarkViscosity::Parameters::registerParametersImpl( MultiFluidBase * fluid ) +{ + fluid->registerWrapper( viewKeyStruct::componentCriticalVolumeString(), &m_componentCriticalVolume ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDescription( "Component critical volumes" ); + + fluid->registerWrapper( viewKeyStruct::componentMixingTypeString(), &m_componentMixingType ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setApplyDefaultValue( m_componentMixingType ). + setDescription( "Viscosity mixing rule to be used for Lohrenz-Bray-Clark computation. Valid options:\n* " + + EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::concat( "\n* " ) ); +} + +void LohrenzBrayClarkViscosity::Parameters::postProcessInputImpl( MultiFluidBase const * fluid, + ComponentProperties const & componentProperties ) +{ + integer const numComponents = fluid->numFluidComponents(); + + if( m_componentCriticalVolume.empty() ) + { + m_componentCriticalVolume.resize( numComponents ); + + arrayView1d< real64 > const & componentCriticalPressure = componentProperties.getComponentCriticalPressure(); + arrayView1d< real64 > const & componentCriticalTemperature = componentProperties.getComponentCriticalTemperature(); + + calculateCriticalVolume( numComponents, + componentCriticalPressure, + componentCriticalTemperature, + m_componentCriticalVolume ); + } + + GEOS_THROW_IF_NE_MSG( m_componentCriticalVolume.size(), numComponents, + GEOS_FMT( "{}: invalid number of values in attribute '{}'", fluid->getFullName(), + viewKeyStruct::componentCriticalVolumeString() ), + InputError ); + + // If the value is invalid, this will throw + EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::fromString( m_componentMixingType ); +} + +void LohrenzBrayClarkViscosity::Parameters::calculateCriticalVolume( + integer const numComponents, + arrayView1d< const real64 > const criticalPressure, + arrayView1d< const real64 > const criticalTemperature, + arrayView1d< real64 > const criticalVolume ) +{ + for( integer ic=0; ic const & componentCriticalVolume ); template< integer USD1, integer USD2 > GEOS_HOST_DEVICE @@ -252,6 +254,7 @@ class LohrenzBrayClarkViscosityUpdate final : public FunctionBaseUpdate private: MixingType m_mixing_type; + arrayView1d< real64 const > m_componentCriticalVolume; private: // Conversion factor from cP to Pa.s @@ -264,7 +267,9 @@ class LohrenzBrayClarkViscosity : public FunctionBase { public: LohrenzBrayClarkViscosity( string const & name, - ComponentProperties const & componentProperties ); + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ); static string catalogName() { return "LBC"; } @@ -282,13 +287,50 @@ class LohrenzBrayClarkViscosity : public FunctionBase */ KernelWrapper createKernelWrapper() const; + // Parameters for the LBC viscosity model + class Parameters : public ModelParameters + { +public: + Parameters( std::unique_ptr< ModelParameters > parameters ); + ~Parameters() override = default; + + string m_componentMixingType; + array1d< real64 > m_componentCriticalVolume; + +private: + void registerParametersImpl( MultiFluidBase * fluid ) override; + void postProcessInputImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) override; + + struct viewKeyStruct + { + static constexpr char const * componentCriticalVolumeString() { return "componentCriticalVolume"; } + static constexpr char const * componentMixingTypeString() { return "viscosityMixingRule"; } + }; + + /** + * @brief Estimate critical volumes using Ihmels' (2010) correlation + * @details reference: http://dx.doi.org/10.1021/je100167w + * @param[in] numComponents The number of components + * @param[in] criticalPressure The component critical pressures + * @param[in] criticalTemperature The component critical temperatures + * @param[in] criticalVolume The component critical volumes + */ + static void calculateCriticalVolume( integer const numComponents, + arrayView1d< const real64 > const criticalPressure, + arrayView1d< const real64 > const criticalTemperature, + arrayView1d< real64 > const criticalVolume ); + }; + + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ); + private: - LohrenzBrayClarkViscosityUpdate::MixingType m_mixing_type{LohrenzBrayClarkViscosityUpdate::MixingType::HERNING_ZIPPERER}; + Parameters const * m_parameters{}; }; /// Declare strings associated with enumeration values. ENUM_STRINGS( LohrenzBrayClarkViscosityUpdate::MixingType, - "Herning-Zipperer", + "HerningZipperer", "Wilke", "Brokaw" ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp index 3811c5950d9..eb454179210 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp @@ -332,7 +332,7 @@ void LohrenzBrayClarkViscosityUpdate::computePhaseViscosity_LohrenzBrayClark( in auto const & criticalPressure = componentProperties.m_componentCriticalPressure; auto const & criticalTemperature = componentProperties.m_componentCriticalTemperature; - auto const & criticalVolume = componentProperties.m_componentCriticalVolume; + auto const & criticalVolume = m_componentCriticalVolume; auto const & molarWeight = componentProperties.m_componentMolarWeight; for( integer ic = 0; ic < numComponents; ++ic ) diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp new file mode 100644 index 00000000000..8cb23ff898f --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp @@ -0,0 +1,92 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ModelParameters.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_MODELPARAMETERS_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_MODELPARAMETERS_HPP_ + +namespace geos +{ + +namespace constitutive +{ + +class MultiFluidBase; + +namespace compositional +{ + +class ComponentProperties; + +class ModelParameters +{ +public: + ModelParameters( std::unique_ptr< ModelParameters > parameters = nullptr ): baseParameters( std::move( parameters ) ) {} + virtual ~ModelParameters() = default; + + void registerParameters( MultiFluidBase * fluid ) + { + registerParametersImpl( fluid ); + if( baseParameters ) + { + baseParameters->registerParameters( fluid ); + } + } + + void postProcessInput( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) + { + postProcessInputImpl( fluid, componentProperties ); + if( baseParameters ) + { + baseParameters->postProcessInput( fluid, componentProperties ); + } + } + + template< typename PARAMETERS > + PARAMETERS const * get() const + { + PARAMETERS const * parameters = dynamic_cast< PARAMETERS const * >(this); + if( parameters == nullptr && baseParameters ) + { + return baseParameters->get< PARAMETERS >(); + } + return parameters; + } + +private: + virtual void registerParametersImpl( MultiFluidBase * fluid ) + { + GEOS_UNUSED_VAR( fluid ); + } + + virtual void postProcessInputImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) + { + GEOS_UNUSED_VAR( fluid ); + GEOS_UNUSED_VAR( componentProperties ); + } + +private: + std::unique_ptr< ModelParameters > baseParameters{}; +}; + +} // end namespace compositional + +} // end namespace constitutive + +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_MODELPARAMETERS_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp index 836694ac9fb..6026dd4e213 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp @@ -37,9 +37,12 @@ string NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >::catalogNa template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >:: NegativeTwoPhaseFlashModel( string const & name, - ComponentProperties const & componentProperties ): + ComponentProperties const & componentProperties, + ModelParameters const & modelParameters ): FunctionBase( name, componentProperties ) -{} +{ + GEOS_UNUSED_VAR( modelParameters ); +} template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > typename NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >::KernelWrapper diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp index db3610276f9..1682af63be4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -111,7 +111,8 @@ class NegativeTwoPhaseFlashModel : public FunctionBase { public: NegativeTwoPhaseFlashModel( string const & name, - ComponentProperties const & componentProperties ); + ComponentProperties const & componentProperties, + ModelParameters const & modelParameters ); static string catalogName(); diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp index 46ed03f89b9..05c2b6ef9c2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp @@ -59,9 +59,21 @@ class NullModel : public FunctionBase public: NullModel( string const & name, - ComponentProperties const & componentProperties ): + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ): FunctionBase( name, componentProperties ) - {} + { + GEOS_UNUSED_VAR( phaseIndex, modelParameters ); + } + + NullModel( string const & name, + ComponentProperties const & componentProperties, + ModelParameters const & modelParameters ): + FunctionBase( name, componentProperties ) + { + GEOS_UNUSED_VAR( modelParameters ); + } virtual ~NullModel() override = default; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp index 638b6f9a8eb..ea3fb238325 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp @@ -30,6 +30,8 @@ namespace constitutive namespace compositional { +class ModelParameters; + /** * @brief Struct storing the submodels describing the fluid phase behavior. * @tparam DENSITY Class describing the density model @@ -51,13 +53,21 @@ struct PhaseModel * @param[in] componentProperties EOS parameters for components */ PhaseModel( string const & phaseModelName, - ComponentProperties const & componentProperties ): + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ): density( phaseModelName + "_" + Density::catalogName(), - componentProperties ), + componentProperties, + phaseIndex, + modelParameters ), viscosity( phaseModelName + "_" + Viscosity::catalogName(), - componentProperties ), + componentProperties, + phaseIndex, + modelParameters ), enthalpy( phaseModelName + "_" + Enthalpy::catalogName(), - componentProperties ) + componentProperties, + phaseIndex, + modelParameters ) {} /// The phase density model @@ -122,6 +132,17 @@ struct PhaseModel viscosity, enthalpy ); } + + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ) + { + std::unique_ptr< ModelParameters > phaseParameters = std::move( parameters ); + phaseParameters = Density::createParameters( std::move( phaseParameters ) ); + phaseParameters = Viscosity::createParameters( std::move( phaseParameters ) ); + phaseParameters = Enthalpy::createParameters( std::move( phaseParameters ) ); + return phaseParameters; + } + }; // A no-op phase model diff --git a/src/coreComponents/constitutive/unitTests/TestFluid.hpp b/src/coreComponents/constitutive/unitTests/TestFluid.hpp index c0d8cbb2d1c..90779c04560 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluid.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluid.hpp @@ -101,13 +101,19 @@ class TestFluid { m_component_properties = std::make_unique< constitutive::compositional::ComponentProperties >( componentNames, - molecularWeight, - criticalPressure, - criticalTemperature, - criticalVolume, - acentricFactor, - volumeShift, - binaryCoeff ); + molecularWeight ); + createArray( m_component_properties->m_componentCriticalPressure, criticalPressure ); + createArray( m_component_properties->m_componentCriticalTemperature, criticalTemperature ); + createArray( m_component_properties->m_componentAcentricFactor, acentricFactor ); + createArray( m_component_properties->m_componentVolumeShift, volumeShift ); + m_component_properties->m_componentBinaryCoeff.resize( NC, NC ); + for( integer ic = 0; ic < NC; ++ic ) + { + for( integer jc = 0; jc < NC; ++jc ) + { + m_component_properties->m_componentBinaryCoeff( ic, jc ) = binaryCoeff( ic, jc ); + } + } } return *m_component_properties; } diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp index 08cfdf720c9..2a77b2c1c99 100644 --- a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp +++ b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp @@ -66,7 +66,8 @@ class CompositionalDensityTestFixture : public ::testing::TestWithParam< Densit : m_fluid( FluidData< NC >::createFluid() ) { ComponentProperties const & componentProperties = this->m_fluid->getComponentProperties(); - m_density = std::make_unique< CompositionalDensity< EOS_TYPE > >( "PhaseDensity", componentProperties ); + m_parameters = CompositionalDensity< EOS_TYPE >::createParameters( std::make_unique< ModelParameters >() ); + m_density = std::make_unique< CompositionalDensity< EOS_TYPE > >( "PhaseDensity", componentProperties, 0, *m_parameters ); } ~CompositionalDensityTestFixture() = default; @@ -199,6 +200,7 @@ class CompositionalDensityTestFixture : public ::testing::TestWithParam< Densit protected: std::unique_ptr< CompositionalDensity< EOS_TYPE > > m_density{}; std::unique_ptr< TestFluid< NC > > m_fluid{}; + std::unique_ptr< ModelParameters > m_parameters{}; }; using CompositionalDensity9CompPR = CompositionalDensityTestFixture< 9, CubicEOSPhaseModel< PengRobinsonEOS > >; diff --git a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp index 30719f0eff7..5e044d04ea2 100644 --- a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp +++ b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp @@ -83,7 +83,6 @@ class WilsonKValueInitializationTestFixture : discarded, criticalPressure, criticalTemperature, - discarded, acentricFactor, discarded, discarded2d ); diff --git a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp index d956071bb5b..e90725c0274 100644 --- a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp @@ -67,8 +67,12 @@ class LohrenzBrayClarkViscosityTestFixture : public ::testing::TestWithParam< V : m_fluid( FluidData< NC >::createFluid() ) { ComponentProperties const & componentProperties = this->m_fluid->getComponentProperties(); - m_density = std::make_unique< CompositionalDensity< CubicEOSPhaseModel< PengRobinsonEOS > > >( "PhaseDensity", componentProperties ); - m_viscosity = std::make_unique< LohrenzBrayClarkViscosity >( "PhaseViscosity", componentProperties ); + m_parameters = LohrenzBrayClarkViscosity::createParameters( nullptr ); + auto * parameters = const_cast< LohrenzBrayClarkViscosity::Parameters * >(m_parameters->get< LohrenzBrayClarkViscosity::Parameters >()); + parameters->m_componentCriticalVolume.resize( NC ); + TestFluid< 9 >::populateArray( parameters->m_componentCriticalVolume, this->m_fluid->criticalVolume ); + m_density = std::make_unique< CompositionalDensity< CubicEOSPhaseModel< PengRobinsonEOS > > >( "PhaseDensity", componentProperties, 0, *m_parameters ); + m_viscosity = std::make_unique< LohrenzBrayClarkViscosity >( "PhaseViscosity", componentProperties, 0, *m_parameters ); } ~LohrenzBrayClarkViscosityTestFixture() = default; @@ -212,6 +216,7 @@ class LohrenzBrayClarkViscosityTestFixture : public ::testing::TestWithParam< V std::unique_ptr< TestFluid< NC > > m_fluid{}; std::unique_ptr< CompositionalDensity< CubicEOSPhaseModel< PengRobinsonEOS > > > m_density{}; std::unique_ptr< LohrenzBrayClarkViscosity > m_viscosity{}; + std::unique_ptr< ModelParameters > m_parameters{}; }; using LohrenzBrayClarkViscosity9 = LohrenzBrayClarkViscosityTestFixture< 9 >; diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst index cf67a8118c4..daeebbf1cce 100644 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst @@ -8,10 +8,10 @@ componentAcentricFactor real64_array required Component acentric fact componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients componentCriticalPressure real64_array required Component critical pressures componentCriticalTemperature real64_array required Component critical temperatures -componentCriticalVolume real64_array {0} Component critical volumnes componentMolarWeight real64_array required Component molar weights componentNames string_array required List of component names componentVolumeShift real64_array {0} Component volume shifts +constantPhaseViscosity real64_array {0} Constant phase viscosity name groupName required A name is required for any non-unique nodes phaseNames groupNameRef_array required List of fluid phases ============================ ================== ======== ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst index cf67a8118c4..91834dab00d 100644 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst @@ -1,19 +1,23 @@ -============================ ================== ======== ============================================================================================================ -Name Type Default Description -============================ ================== ======== ============================================================================================================ -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentAcentricFactor real64_array required Component acentric factors -componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients -componentCriticalPressure real64_array required Component critical pressures -componentCriticalTemperature real64_array required Component critical temperatures -componentCriticalVolume real64_array {0} Component critical volumnes -componentMolarWeight real64_array required Component molar weights -componentNames string_array required List of component names -componentVolumeShift real64_array {0} Component volume shifts -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -============================ ================== ======== ============================================================================================================ +============================ ================== =============== ========================================================================================================================= +Name Type Default Description +============================ ================== =============== ========================================================================================================================= +checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. +componentAcentricFactor real64_array required Component acentric factors +componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients +componentCriticalPressure real64_array required Component critical pressures +componentCriticalTemperature real64_array required Component critical temperatures +componentCriticalVolume real64_array {0} Component critical volumes +componentMolarWeight real64_array required Component molar weights +componentNames string_array required List of component names +componentVolumeShift real64_array {0} Component volume shifts +name groupName required A name is required for any non-unique nodes +phaseNames groupNameRef_array required List of fluid phases +viscosityMixingRule string HerningZipperer | Viscosity mixing rule to be used for Lohrenz-Bray-Clark computation. Valid options: + | * HerningZipperer + | * Wilke + | * Brokaw +============================ ================== =============== ========================================================================================================================= diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst index cf67a8118c4..daeebbf1cce 100644 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst @@ -8,10 +8,10 @@ componentAcentricFactor real64_array required Component acentric fact componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients componentCriticalPressure real64_array required Component critical pressures componentCriticalTemperature real64_array required Component critical temperatures -componentCriticalVolume real64_array {0} Component critical volumnes componentMolarWeight real64_array required Component molar weights componentNames string_array required List of component names componentVolumeShift real64_array {0} Component volume shifts +constantPhaseViscosity real64_array {0} Constant phase viscosity name groupName required A name is required for any non-unique nodes phaseNames groupNameRef_array required List of fluid phases ============================ ================== ======== ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst index cf67a8118c4..91834dab00d 100644 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst @@ -1,19 +1,23 @@ -============================ ================== ======== ============================================================================================================ -Name Type Default Description -============================ ================== ======== ============================================================================================================ -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentAcentricFactor real64_array required Component acentric factors -componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients -componentCriticalPressure real64_array required Component critical pressures -componentCriticalTemperature real64_array required Component critical temperatures -componentCriticalVolume real64_array {0} Component critical volumnes -componentMolarWeight real64_array required Component molar weights -componentNames string_array required List of component names -componentVolumeShift real64_array {0} Component volume shifts -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -============================ ================== ======== ============================================================================================================ +============================ ================== =============== ========================================================================================================================= +Name Type Default Description +============================ ================== =============== ========================================================================================================================= +checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. +componentAcentricFactor real64_array required Component acentric factors +componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients +componentCriticalPressure real64_array required Component critical pressures +componentCriticalTemperature real64_array required Component critical temperatures +componentCriticalVolume real64_array {0} Component critical volumes +componentMolarWeight real64_array required Component molar weights +componentNames string_array required List of component names +componentVolumeShift real64_array {0} Component volume shifts +name groupName required A name is required for any non-unique nodes +phaseNames groupNameRef_array required List of fluid phases +viscosityMixingRule string HerningZipperer | Viscosity mixing rule to be used for Lohrenz-Bray-Clark computation. Valid options: + | * HerningZipperer + | * Wilke + | * Brokaw +============================ ================== =============== ========================================================================================================================= diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 2180d14bcc5..ae4d9cdbc54 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -4190,14 +4190,14 @@ The expected format is "{ waterMax, oilMax }", in that order--> - - + + @@ -4214,7 +4214,7 @@ The expected format is "{ waterMax, oilMax }", in that order--> - + @@ -4224,6 +4224,11 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + @@ -4238,14 +4243,14 @@ The expected format is "{ waterMax, oilMax }", in that order--> - - + + @@ -4262,7 +4267,7 @@ The expected format is "{ waterMax, oilMax }", in that order--> - + @@ -4272,6 +4277,11 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml index dc2da325757..20ac42736ec 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml @@ -75,7 +75,6 @@ componentNames="{ CO2, N2, C1, C2, C3, C4, C5, C6, C7+ }" componentCriticalPressure="{ 73.8659e5, 33.9439e5, 46.0421e5, 48.8387e5, 42.4552e5, 37.47e5, 33.5892e5, 30.1037e5, 20.549e5 }" componentCriticalTemperature="{ 304.7, 126.2, 190.6, 305.43, 369.8, 419.5, 465.9, 507.5, 678.8 }" - componentCriticalVolume="{ 9.3999e-05, 9.0001e-05, 9.7999e-05, 1.4800e-04, 2.0000e-04, 2.5800e-04, 3.1000e-04, 3.5100e-04, 6.8243e-04 }" componentAcentricFactor="{ 0.225, 0.04, 0.013, 0.0986, 0.1524, 0.1956, 0.2413, 0.299, 0.5618 }" componentMolarWeight="{ 44.01e-3, 28.01e-3, 16.04e-3, 30.07e-3, 44.1e-3, 58.12e-3, 72.15e-3, 84e-3, 173e-3 }" componentVolumeShift="{ -0.04958, -0.136012, -0.1486264, -0.10863408, -0.08349872, -0.06331568, -0.04196464, -0.0150072, 0.0000 }" @@ -117,7 +116,6 @@ componentNames="{ CO2, N2, C1, C2, C3, C4, C5, C6, C7+ }" componentCriticalPressure="{ 73.8659e5, 33.9439e5, 46.0421e5, 48.8387e5, 42.4552e5, 37.47e5, 33.5892e5, 30.1037e5, 20.549e5 }" componentCriticalTemperature="{ 304.7, 126.2, 190.6, 305.43, 369.8, 419.5, 465.9, 507.5, 678.8 }" - componentCriticalVolume="{ 9.3999e-05, 9.0001e-05, 9.7999e-05, 1.4800e-04, 2.0000e-04, 2.5800e-04, 3.1000e-04, 3.5100e-04, 6.8243e-04 }" componentAcentricFactor="{ 0.225, 0.04, 0.013, 0.0986, 0.1524, 0.1956, 0.2413, 0.299, 0.5618 }" componentMolarWeight="{ 44.01e-3, 28.01e-3, 16.04e-3, 30.07e-3, 44.1e-3, 58.12e-3, 72.15e-3, 84e-3, 173e-3 }" componentVolumeShift="{ -0.04958, -0.136012, -0.1486264, -0.10863408, -0.08349872, -0.06331568, -0.04196464, -0.0150072, 0.0000 }" From f856214de33699c6b3559bdf5f03e025ecd67e46 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Fri, 14 Jun 2024 23:08:37 +0100 Subject: [PATCH 095/286] Force face-based ordering for node list of FaceElements (#3133) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 +++- .../fileIO/Outputs/VTKOutput.cpp | 9 ++++++ .../fileIO/Outputs/VTKOutput.hpp | 4 +++ .../fileIO/vtk/VTKPolyDataWriterInterface.cpp | 30 ++++++++++++++----- .../fileIO/vtk/VTKPolyDataWriterInterface.hpp | 20 +++++++++++-- .../surfaceGeneration/SurfaceGenerator.cpp | 6 ++-- src/coreComponents/schema/docs/VTK.rst | 2 +- src/coreComponents/schema/schema.xsd | 2 +- 9 files changed, 61 insertions(+), 19 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 08e6f8eebc4..1e2dd036d34 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3021-5589-3c278fb + baseline: integratedTests/baseline_integratedTests-pr3133-5610-b42c02a allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 0aa55a0b447..cca19981d9c 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,11 +6,14 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3133 (2024-06-14) +====================== +Fix node ordering for faceElements. + PR #3021 (2024-06-13) ====================== Preparatory work for fractures + wells. New test case added. - PR #3152 (2024-06-13) ====================== Some random things. Baseline update because of the new parameter (minScalingFactor). diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp index b9b6256bc1a..550ed9dc950 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp @@ -60,6 +60,11 @@ VTKOutput::VTKOutput( string const & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Should the vtk files contain the ghost cells or not." ); + registerWrapper( viewKeysStruct::writeFaceElementsAs3D, &m_writeFaceElementsAs3D ). + setApplyDefaultValue( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Should the face elements be written as 3d volumes or not." ); + registerWrapper( viewKeysStruct::onlyPlotSpecifiedFieldNames, &m_onlyPlotSpecifiedFieldNames ). setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ). @@ -116,6 +121,9 @@ void VTKOutput::postProcessInput() "{} `{}`: found {} fields to plot in `{}`, in addition to all fields with `plotLevel` smaller or equal to {}.", catalogName(), getDataContext(), std::to_string( m_fieldNames.size() ), fieldNamesString, m_plotLevel ) ); + + GEOS_ERROR_IF( m_writeFaceElementsAs3D, GEOS_FMT( "{} `{}`: 3D vtk plot of faceElements is not yet supported.", + catalogName(), getDataContext() ) ); } @@ -140,6 +148,7 @@ bool VTKOutput::execute( real64 const time_n, GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: writing {} at time {} s (cycle number {})", getName(), m_fieldNames, time_n + dt, cycleNumber )); m_writer.setWriteGhostCells( m_writeGhostCells ); + m_writer.setWriteFaceElementsAs3D ( m_writeFaceElementsAs3D ); m_writer.setOutputMode( m_writeBinaryData ); m_writer.setOutputRegionType( m_outputRegionType ); m_writer.setPlotLevel( m_plotLevel ); diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp index c87b92a0513..36b75bb9d6f 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp @@ -89,6 +89,7 @@ class VTKOutput : public OutputBase static constexpr auto plotFileRoot = "plotFileRoot"; static constexpr auto writeFEMFaces = "writeFEMFaces"; static constexpr auto writeGhostCells = "writeGhostCells"; + static constexpr auto writeFaceElementsAs3D = "writeFaceElementsAs3D"; static constexpr auto plotLevel = "plotLevel"; static constexpr auto binaryString = "format"; static constexpr auto outputRegionTypeString = "outputRegionType"; @@ -115,6 +116,9 @@ class VTKOutput : public OutputBase /// Should the vtk files contain the ghost cells or not. integer m_writeGhostCells; + /// Should the face elements be written as 3d volumes or not. + integer m_writeFaceElementsAs3D; + /// flag to decide whether we only plot the specified field names integer m_onlyPlotSpecifiedFieldNames; diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp index 7428485e820..0ab56717545 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp @@ -54,7 +54,8 @@ VTKPolyDataWriterInterface::VTKPolyDataWriterInterface( string name ): m_requireFieldRegistrationCheck( true ), m_previousCycle( -1 ), m_outputMode( VTKOutputMode::BINARY ), - m_outputRegionType( VTKRegionTypes::ALL ) + m_outputRegionType( VTKRegionTypes::ALL ), + m_writeFaceElementsAs3D( false ) {} static int @@ -337,15 +338,20 @@ getWell( WellElementSubRegion const & subRegion, * @brief Gets the cell connectivities and the vertices coordinates as VTK objects for a specific FaceElementSubRegion. * @param[in] subRegion the FaceElementSubRegion to be output * @param[in] nodeManager the NodeManager associated with the DomainPartition being written. + * @param[in] faceManager the faceManager associated with the DomainPartition being written. * @return a pair containing a VTKPoints (with the information on the vertices and their coordinates) * and a VTKCellArray (with the cell connectivities). */ static ElementData getSurface( FaceElementSubRegion const & subRegion, - NodeManager const & nodeManager ) + NodeManager const & nodeManager, + FaceManager const & faceManager, + bool const writeFaceElementsAs3D ) { // Get unique node set composing the surface + auto & elemToFaces = subRegion.faceList(); auto & elemToNodes = subRegion.nodeList(); + auto & faceToNodes = faceManager.nodeList(); auto cellArray = vtkSmartPointer< vtkCellArray >::New(); cellArray->SetNumberOfCells( subRegion.size() ); @@ -361,14 +367,15 @@ getSurface( FaceElementSubRegion const & subRegion, for( localIndex ei = 0; ei < subRegion.size(); ei++ ) { - auto const & nodes = elemToNodes[ei]; + // we use the nodes of face 0 + auto const & nodes = !writeFaceElementsAs3D ? faceToNodes[elemToFaces( ei, 0 )] : elemToNodes[ei]; auto const numNodes = nodes.size(); ElementType const elementType = subRegion.getElementType( ei ); std::vector< int > vtkOrdering; - if( elementType == ElementType::Polygon ) + if( elementType == ElementType::Polygon || writeFaceElementsAs3D ) { - vtkOrdering.resize( nodes.size() ); + vtkOrdering.resize( numNodes ); std::iota( vtkOrdering.begin(), vtkOrdering.end(), 0 ); } else @@ -377,11 +384,16 @@ getSurface( FaceElementSubRegion const & subRegion, } connectivity.clear(); - for( int const & ordering: vtkOrdering ) + for( int const & ordering : vtkOrdering ) { auto const & VTKIndexPos = geosx2VTKIndexing.find( nodes[ordering] ); if( VTKIndexPos == geosx2VTKIndexing.end() ) { + /// If the node is not found in the geosx2VTKIndexing map: + /// 1. we assign the current value of nodeIndexInVTK to this node in the map (geosx2VTKIndexing[nodes[ordering]] = + /// nodeIndexInVTK++). + /// 2. we increment nodeIndexInVTK to ensure the next new node gets a unique index. + /// 3. we add this new VTK node index to the connectivity vector (connectivity.push_back). connectivity.push_back( geosx2VTKIndexing[nodes[ordering]] = nodeIndexInVTK++ ); } else @@ -1095,6 +1107,7 @@ void VTKPolyDataWriterInterface::writeSurfaceElementRegions( real64 const time, ElementRegionManager const & elemManager, NodeManager const & nodeManager, EmbeddedSurfaceNodeManager const & embSurfNodeManager, + FaceManager const & faceManager, string const & path ) const { elemManager.forElementRegions< SurfaceElementRegion >( [&]( SurfaceElementRegion const & region ) @@ -1112,7 +1125,7 @@ void VTKPolyDataWriterInterface::writeSurfaceElementRegions( real64 const time, case SurfaceElementRegion::SurfaceSubRegionType::faceElement: { auto const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); - return getSurface( subRegion, nodeManager ); + return getSurface( subRegion, nodeManager, faceManager, m_writeFaceElementsAs3D ); } default: { @@ -1314,6 +1327,7 @@ void VTKPolyDataWriterInterface::write( real64 const time, ElementRegionManager const & elemManager = meshLevel.getElemManager(); ParticleManager const & particleManager = meshLevel.getParticleManager(); NodeManager const & nodeManager = meshLevel.getNodeManager(); + FaceManager const & faceManager = meshLevel.getFaceManager(); EmbeddedSurfaceNodeManager const & embSurfNodeManager = meshLevel.getEmbSurfNodeManager(); string const & meshBodyName = meshBody.getName(); @@ -1339,7 +1353,7 @@ void VTKPolyDataWriterInterface::write( real64 const time, } if( m_outputRegionType == VTKRegionTypes::SURFACE || m_outputRegionType == VTKRegionTypes::ALL ) { - writeSurfaceElementRegions( time, elemManager, nodeManager, embSurfNodeManager, meshDir ); + writeSurfaceElementRegions( time, elemManager, nodeManager, embSurfNodeManager, faceManager, meshDir ); } if( m_outputRegionType == VTKRegionTypes::PARTICLE || m_outputRegionType == VTKRegionTypes::ALL ) { diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp index 1baa383407c..a70107b2699 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp @@ -36,6 +36,7 @@ class EmbeddedSurfaceNodeManager; class ElementRegionManager; class NodeManager; class ParticleManager; +class FaceManager; namespace vtk { @@ -89,6 +90,15 @@ class VTKPolyDataWriterInterface m_writeGhostCells = writeGhostCells; } + /** + * @brief Defines whether in the vtk output facelements should be 2D or 3D + * @param writeFaceElementsAs3D The boolean flag. + */ + void setWriteFaceElementsAs3D( bool writeFaceElementsAs3D ) + { + m_writeFaceElementsAs3D = writeFaceElementsAs3D; + } + /** * @brief Sets the plot level * @details All fields have an associated plot level. If it is <= to \p plotLevel, @@ -244,16 +254,17 @@ class VTKPolyDataWriterInterface * @brief Writes the files containing the faces elements * @details There will be one file written per FaceElementRegion and per rank * @param[in] time the time-step - * @param[in] cycle the current cycle number * @param[in] elemManager the ElementRegionManager containing the FaceElementRegions to be output * @param[in] nodeManager the NodeManager containing the nodes of the domain to be output - * @param[in] meshLevelName the name of the MeshLevel containing the nodes and elements to be output - * @param[in] meshBodyName the name of the MeshBody containing the nodes and elements to be output + * @param[in] embSurfNodeManager the embedded surface node Manager. + * @param[in] faceManager the faceManager. + * @param[in] path the path to the output file. */ void writeSurfaceElementRegions( real64 time, ElementRegionManager const & elemManager, NodeManager const & nodeManager, EmbeddedSurfaceNodeManager const & embSurfNodeManager, + FaceManager const & faceManager, string const & path ) const; /** @@ -337,6 +348,9 @@ class VTKPolyDataWriterInterface /// Region output type, could be CELL, WELL, SURFACE, or ALL VTKRegionTypes m_outputRegionType; + + /// Defines whether to plot a faceElement as a 3D volumetric element or not. + bool m_writeFaceElementsAs3D; }; } // namespace vtk diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index cae283b4241..7ba5b85c955 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -725,13 +725,11 @@ int SurfaceGenerator::separationDriver( DomainPartition & domain, localIndex const numNodesInFace = faceToNodeMap.sizeOfArray( faceMap[ kfe ][ 0 ] ); for( localIndex a = 0; a < numNodesInFace; ++a ) { - localIndex const aa = a < 2 ? a : numNodesInFace - a + 1; - localIndex const bb = aa == 0 ? aa : numNodesInFace - aa; // TODO HACK need to generalize to something other than quads //wu40: I temporarily make it work for tet mesh. Need further check with Randy. - nodeMap[ kfe ][ a ] = faceToNodeMap( faceMap[ kfe ][ 0 ], aa ); - nodeMap[ kfe ][ a + numNodesInFace ] = faceToNodeMap( faceMap[ kfe ][ 1 ], bb ); + nodeMap[ kfe ][ a ] = faceToNodeMap( faceMap[ kfe ][ 0 ], a ); + nodeMap[ kfe ][ a + numNodesInFace ] = faceToNodeMap( faceMap[ kfe ][ 1 ], a ); } if( numNodesInFace == 3 ) diff --git a/src/coreComponents/schema/docs/VTK.rst b/src/coreComponents/schema/docs/VTK.rst index 3a376546ee3..b4e40348cb3 100644 --- a/src/coreComponents/schema/docs/VTK.rst +++ b/src/coreComponents/schema/docs/VTK.rst @@ -15,7 +15,7 @@ parallelThreads integer 1 Number of plot file plotFileRoot string VTK Name of the root file for this output. plotLevel integer 1 Level detail plot. Only fields with lower of equal plot level will be output. writeFEMFaces integer 0 (no description available) -writeGhostCells integer 0 Should the vtk files contain the ghost cells or not. +writeGhostCells integer 0 Should the face elements be written as 3d volumes or not. =========================== ======================= ======== ======================================================================================================================================================================================== diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index ae4d9cdbc54..a708c4afc06 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -2109,7 +2109,7 @@ the relative residual norm satisfies: - + From 00543679693c159314fbf5aa3d8bbf314a37e37d Mon Sep 17 00:00:00 2001 From: Ryan Aronson Date: Sun, 16 Jun 2024 07:47:27 -0700 Subject: [PATCH 096/286] Adding pressure stabilization for single phase poromechanics (#3100) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 7 + ...PoroElastic_staircase_co2_3d_base_stab.xml | 179 ++++++++++ .../PoroElastic_staircase_co2_3d_fim_stab.xml | 113 +++++++ ...astic_staircase_co2_3d_sequential_stab.xml | 121 +++++++ ...tic_staircase_singlephase_3d_base_stab.xml | 141 ++++++++ ...stic_staircase_singlephase_3d_fim_stab.xml | 104 ++++++ ...aircase_singlephase_3d_sequential_stab.xml | 107 ++++++ .../poromechanics/poroElasticCoupling.ats | 37 +++ .../physicsSolvers/CMakeLists.txt | 1 + .../CompositionalMultiphaseHybridFVM.cpp | 3 +- .../fluidFlow/SinglePhaseBase.cpp | 21 +- .../fluidFlow/SinglePhaseBase.hpp | 16 + .../fluidFlow/SinglePhaseFVM.cpp | 51 +++ .../fluidFlow/SinglePhaseFVM.hpp | 6 + .../fluidFlow/SinglePhaseHybridFVM.cpp | 13 + .../fluidFlow/SinglePhaseHybridFVM.hpp | 7 + .../StabilizedSinglePhaseFVMKernels.hpp | 310 ++++++++++++++++++ .../multiphysics/MultiphasePoromechanics.cpp | 143 +------- .../multiphysics/MultiphasePoromechanics.hpp | 50 +-- .../multiphysics/PoromechanicsSolver.hpp | 141 +++++++- .../multiphysics/SinglePhasePoromechanics.cpp | 21 +- .../multiphysics/SinglePhasePoromechanics.hpp | 3 + .../SinglePhaseReservoirAndWells.hpp | 10 + 24 files changed, 1407 insertions(+), 200 deletions(-) create mode 100755 inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base_stab.xml create mode 100644 inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim_stab.xml create mode 100755 inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential_stab.xml create mode 100755 inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base_stab.xml create mode 100644 inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim_stab.xml create mode 100755 inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential_stab.xml create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 1e2dd036d34..0ada21a4b6d 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3133-5610-b42c02a + baseline: integratedTests/baseline_integratedTests-pr3100-5620-afd9708 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index cca19981d9c..669fa733891 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,14 +6,21 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3100 (2024-06-14) +====================== +Adding pressure stabilization for single phase poromechanics. + + PR #3133 (2024-06-14) ====================== Fix node ordering for faceElements. + PR #3021 (2024-06-13) ====================== Preparatory work for fractures + wells. New test case added. + PR #3152 (2024-06-13) ====================== Some random things. Baseline update because of the new parameter (minScalingFactor). diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base_stab.xml new file mode 100755 index 00000000000..a80766e45d7 --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_base_stab.xml @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim_stab.xml new file mode 100644 index 00000000000..2bf5cfbd434 --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_fim_stab.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential_stab.xml new file mode 100755 index 00000000000..1470a078714 --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_co2_3d_sequential_stab.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base_stab.xml new file mode 100755 index 00000000000..9855e123f79 --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_base_stab.xml @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim_stab.xml new file mode 100644 index 00000000000..34f0f9adbe8 --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_fim_stab.xml @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential_stab.xml b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential_stab.xml new file mode 100755 index 00000000000..354bff0f51d --- /dev/null +++ b/inputFiles/poromechanics/PoroElastic_staircase_singlephase_3d_sequential_stab.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanics/poroElasticCoupling.ats b/inputFiles/poromechanics/poroElasticCoupling.ats index 6f3bf4afe32..30c865afc8c 100644 --- a/inputFiles/poromechanics/poroElasticCoupling.ats +++ b/inputFiles/poromechanics/poroElasticCoupling.ats @@ -223,6 +223,43 @@ def _build_PoroStaircaseCO2PeacemanWell_sequential_cases(): ((1, 1, 1), (2, 2, 1)), description, restartcheck_params) +def _build_PoroStaircaseSinglePhaseStabilized_fim_cases(): + description = Description( + "Staircase single-phase poroelastic problem with pressure jump stabilization ", + "auto", "Ryan Aronson", True) + restartcheck_params = {"atol": 1.0e-5, "rtol": 2.0e-7} + return _build_poro_elastic_coupling_case( + "PoroElastic_staircase_singlephase_3d_fim_stab.xml", (4, 7), + ((1, 1, 1), (2, 2, 1)), description, restartcheck_params) + + +def _build_PoroStaircaseSinglePhaseStabilized_seq_cases(): + description = Description( + "Staircase single-phase poroelastic problem with pressure jump stabilization ", + "auto", "Ryan Aronson", True) + restartcheck_params = {"atol": 1.0e-5, "rtol": 2.0e-7} + return _build_poro_elastic_coupling_case( + "PoroElastic_staircase_singlephase_3d_sequential_stab.xml", (4, 7), + ((1, 1, 1), (2, 2, 1)), description, restartcheck_params) + +def _build_PoroStaircaseCO2Stabilized_fim_cases(): + description = Description( + "Staircase CO2 poroelastic problem with pressure jump stabilization ", + "auto", "Ryan Aronson", True) + restartcheck_params = {"atol": 1.0e-5, "rtol": 2.0e-7} + return _build_poro_elastic_coupling_case( + "PoroElastic_staircase_co2_3d_fim_stab.xml", (4, 7), + ((1, 1, 1), (2, 2, 1)), description, restartcheck_params) + +def _build_PoroStaircaseCO2Stabilized_seq_cases(): + description = Description( + "Staircase CO2 poroelastic problem with pressure jump stabilization ", + "auto", "Ryan Aronson", True) + restartcheck_params = {"atol": 1.0e-5, "rtol": 2.0e-7} + return _build_poro_elastic_coupling_case( + "PoroElastic_staircase_co2_3d_sequential_stab.xml", (4, 7), + ((1, 1, 1), (2, 2, 1)), description, restartcheck_params) + def _build_PoroElasticPEBICO2FIM_cases(): description = Description( "CO2 poroelastic problem with VEM-TPFA (FIM) on a PEBI mesh ", "auto", diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index f73d33a3ab8..499615347e7 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -50,6 +50,7 @@ set( physicsSolvers_headers fluidFlow/SinglePhaseProppantBaseKernels.hpp fluidFlow/SinglePhaseProppantFluxKernels.hpp fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp + fluidFlow/StabilizedSinglePhaseFVMKernels.hpp fluidFlow/StencilAccessors.hpp fluidFlow/ThermalSinglePhaseBaseKernels.hpp fluidFlow/ThermalSinglePhaseFVMKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index b83902dcf0b..1231a0d75b5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -423,7 +423,8 @@ void CompositionalMultiphaseHybridFVM::assembleStabilizedFluxTerms( real64 const arrayView1d< real64 > const & localRhs ) const { // stab not implemented - assembleFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); + GEOS_UNUSED_VAR( dt, domain, dofManager, localMatrix, localRhs ); + GEOS_ERROR( "Stabilized flux not available for this flow solver" ); } real64 CompositionalMultiphaseHybridFVM::scalingForSystemSolution( DomainPartition & domain, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index c342cc8a592..8dd5d24686b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -829,11 +829,22 @@ void SinglePhaseBase::assembleSystem( real64 const GEOS_UNUSED_PARAM( time_n ), localMatrix, localRhs ); - assembleFluxTerms( dt, - domain, - dofManager, - localMatrix, - localRhs ); + if( m_isJumpStabilized ) + { + assembleStabilizedFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } + else + { + assembleFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } } void SinglePhaseBase::assembleAccumulationTerms( DomainPartition & domain, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index 3ee103fae33..0ee5d340d92 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -169,6 +169,22 @@ class SinglePhaseBase : public FlowSolverBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) = 0; + /** + * @brief assembles the flux terms for all cells including jump stabilization + * @param time_n previous time value + * @param dt time step + * @param domain the physical domain object + * @param dofManager degree-of-freedom manager associated with the linear system + * @param localMatrix the system matrix + * @param localRhs the system right-hand side vector + */ + virtual void + assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) = 0; + /** * @brief assembles the flux terms for all cells for the poroelastic case * @param time_n previous time value diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index 0f76ab7b85f..35023530b12 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -36,6 +36,7 @@ #include "physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp" #include "physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp" @@ -361,6 +362,46 @@ void SinglePhaseFVM<>::assembleFluxTerms( real64 const dt, } +template< > +void SinglePhaseFVM< SinglePhaseBase >::assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + GEOS_MARK_FUNCTION; + + NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); + FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); + FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( m_discretizationName ); + + string const & dofKey = dofManager.getKey( SinglePhaseBase::viewKeyStruct::elemDofFieldString() ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & ) + { + fluxApprox.forAllStencils( mesh, [&]( auto & stencil ) + { + typename TYPEOFREF( stencil ) ::KernelWrapper stencilWrapper = stencil.createKernelWrapper(); + + // No thermal support yet + stabilizedSinglePhaseFVMKernels::FaceBasedAssemblyKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), + dofKey, + getName(), + mesh.getElemManager(), + stencilWrapper, + dt, + localMatrix.toViewConstSizes(), + localRhs.toView() ); + + } ); + } ); + +} + + + template<> void SinglePhaseFVM< SinglePhaseProppantBase >::assembleFluxTerms( real64 const dt, DomainPartition const & domain, @@ -415,6 +456,16 @@ void SinglePhaseFVM< SinglePhaseProppantBase >::assembleFluxTerms( real64 const } ); } +template< > +void SinglePhaseFVM< SinglePhaseProppantBase >::assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + GEOS_UNUSED_VAR( dt, domain, dofManager, localMatrix, localRhs ); + GEOS_ERROR( "Stabilized flux not available with this flow solver" ); +} template< typename BASE > void SinglePhaseFVM< BASE >::assembleEDFMFluxTerms( real64 const GEOS_UNUSED_PARAM ( time_n ), diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp index ac57c77afb3..b0e60c4dd3b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp @@ -165,6 +165,12 @@ class SinglePhaseFVM : public BASE arrayView1d< real64 > const & localRhs ) override; virtual void + assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) override; + virtual void assembleEDFMFluxTerms( real64 const time_n, real64 const dt, DomainPartition const & domain, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 984fbbc4786..4bf626b5b91 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -276,6 +276,19 @@ void SinglePhaseHybridFVM::assembleFluxTerms( real64 const dt, } + +void SinglePhaseHybridFVM::assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + // pressure stabilization not implemented + GEOS_UNUSED_VAR( dt, domain, dofManager, localMatrix, localRhs ); + GEOS_ERROR( "Stabilized flux not available for this flow solver" ); +} + + void SinglePhaseHybridFVM::assembleEDFMFluxTerms( real64 const GEOS_UNUSED_PARAM( time_n ), real64 const dt, DomainPartition const & domain, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp index 65ceae5786e..64f50465847 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp @@ -125,6 +125,13 @@ class SinglePhaseHybridFVM : public SinglePhaseBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) override; + virtual void + assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) override; + virtual void assembleEDFMFluxTerms( real64 const time_n, real64 const dt, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp new file mode 100644 index 00000000000..e6ca524febc --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp @@ -0,0 +1,310 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file StabilizedSinglePhaseFVMKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDSINGLEPHASEFVMKERNELS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDSINGLEPHASEFVMKERNELS_HPP + +#include "physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp" + +namespace geos +{ + +namespace stabilizedSinglePhaseFVMKernels +{ + +using namespace constitutive; + + +/******************************** FaceBasedAssemblyKernel ********************************/ + +/** + * @class FaceBasedAssemblyKernel + * @tparam NUM_DOF number of degrees of freedom + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @brief Define the interface for the assembly kernel in charge of flux terms + */ +template< integer NUM_EQN, integer NUM_DOF, typename STENCILWRAPPER > +class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER > +{ +public: + + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + using AbstractBase = singlePhaseFVMKernels::FaceBasedAssemblyKernelBase; + using DofNumberAccessor = AbstractBase::DofNumberAccessor; + using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; + using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; + using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; + + using StabSinglePhaseFlowAccessors = + StencilAccessors< fields::flow::macroElementIndex, + fields::flow::elementStabConstant, + fields::flow::pressure_n >; + + using StabSinglePhaseFluidAccessors = + StencilMaterialAccessors< SingleFluidBase, + fields::singlefluid::density_n >; + + using AbstractBase::m_dt; + using AbstractBase::m_rankOffset; + using AbstractBase::m_ghostRank; + using AbstractBase::m_dofNumber; + using AbstractBase::m_gravCoef; + using AbstractBase::m_pres; + + using Base = singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; + using Base::numDof; + using Base::numEqn; + using Base::maxNumElems; + using Base::maxNumConns; + using Base::maxStencilSize; + using Base::m_stencilWrapper; + using Base::m_seri; + using Base::m_sesri; + using Base::m_sei; + + /** + * @brief Constructor for the kernel interface + * @param[in] rankOffset the offset of my MPI rank + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dofNumberAccessor accessor for the dofs numbers + * @param[in] singlePhaseFlowAccessor accessor for wrappers registered by the solver + * @param[in] stabSinglePhaseFlowAccessor accessor for wrappers registered by the solver needed for stabilization + * @param[in] singlePhaseFluidAccessor accessor for wrappers registered by the single fluid model + * @param[in] stabSinglePhaseFluidAccessor accessor for wrappers registered by the single fluid model needed for stabilization + * @param[in] permeabilityAccessors accessor for wrappers registered by the permeability model + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + FaceBasedAssemblyKernel( globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, + StabSinglePhaseFlowAccessors const & stabSinglePhaseFlowAccessors, + SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, + StabSinglePhaseFluidAccessors const & stabSinglePhaseFluidAccessors, + PermeabilityAccessors const & permeabilityAccessors, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + : Base( rankOffset, + stencilWrapper, + dofNumberAccessor, + singlePhaseFlowAccessors, + singlePhaseFluidAccessors, + permeabilityAccessors, + dt, + localMatrix, + localRhs ), + m_pres_n( stabSinglePhaseFlowAccessors.get( fields::flow::pressure_n {} ) ), + m_dens_n( stabSinglePhaseFluidAccessors.get( fields::singlefluid::density_n {} ) ), + m_macroElementIndex( stabSinglePhaseFlowAccessors.get( fields::flow::macroElementIndex {} ) ), + m_elementStabConstant( stabSinglePhaseFlowAccessors.get( fields::flow::elementStabConstant {} ) ) + {} + + struct StackVariables : public Base::StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables( localIndex const size, localIndex numElems ) + : Base::StackVariables( size, numElems ) + {} + + using Base::StackVariables::stencilSize; + using Base::StackVariables::numFluxElems; + using Base::StackVariables::transmissibility; + using Base::StackVariables::dTrans_dPres; + using Base::StackVariables::dofColIndices; + using Base::StackVariables::localFlux; + using Base::StackVariables::localFluxJacobian; + + /// Stabilization transmissibility + real64 stabTransmissibility[maxNumConns][2]{}; + + }; + + /** + * @brief Compute the local flux contributions to the residual and Jacobian, including stabilization + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void computeFlux( localIndex const iconn, + StackVariables & stack ) const + { + + m_stencilWrapper.computeStabilizationWeights( iconn, + stack.stabTransmissibility ); + + // *********************************************** + // We call the base computeFlux, + // + // We use the lambda below to compute stabilization terms + Base::computeFlux( iconn, stack, [&] ( localIndex const (&k)[2], + localIndex const (&seri)[2], + localIndex const (&sesri)[2], + localIndex const (&sei)[2], + localIndex const connectionIndex, + real64 const alpha, + real64 const mobility, + real64 const potGrad, + real64 const fluxVal, + real64 const (&dFlux_dP)[2] ) + { + + GEOS_UNUSED_VAR( alpha, mobility, potGrad, fluxVal, dFlux_dP ); + + /// stabilization flux and derivatives + real64 stabFlux{}; + real64 dStabFlux_dP[2]{}; + + real64 const stabTrans[2] = { stack.stabTransmissibility[connectionIndex][0], + stack.stabTransmissibility[connectionIndex][1] }; + + + real64 dPresGradStab = 0.0; + integer stencilMacroElements[2]{}; + + // Step 1: compute the pressure jump at the interface + for( integer ke = 0; ke < stack.numFluxElems; ++ke ) + { + localIndex const er = seri[ke]; + localIndex const esr = sesri[ke]; + localIndex const ei = sei[ke]; + + stencilMacroElements[ke] = m_macroElementIndex[er][esr][ei]; + + // use the jump in *delta* pressure in the stabilization term + dPresGradStab += m_elementStabConstant[er][esr][ei] * stabTrans[ke] * (m_pres[er][esr][ei] - m_pres_n[er][esr][ei]); + } + + // Step 2: compute the stabilization flux + integer const k_up_stab = (dPresGradStab >= 0) ? 0 : 1; + + localIndex const er_up_stab = seri[k_up_stab]; + localIndex const esr_up_stab = sesri[k_up_stab]; + localIndex const ei_up_stab = sei[k_up_stab]; + + bool const areInSameMacroElement = stencilMacroElements[0] == stencilMacroElements[1]; + bool const isStabilizationActive = stencilMacroElements[0] >= 0 && stencilMacroElements[1] >= 0; + if( isStabilizationActive && areInSameMacroElement ) + { + + real64 const laggedUpwindCoef = m_dens_n[er_up_stab][esr_up_stab][ei_up_stab][0]; + stabFlux += dPresGradStab * laggedUpwindCoef; + + for( integer ke = 0; ke < stack.numFluxElems; ++ke ) + { + real64 const tauStab = m_elementStabConstant[seri[ke]][sesri[ke]][sei[ke]]; + dStabFlux_dP[ke] += tauStab * stabTrans[ke] * laggedUpwindCoef; + } + } + + // Step 3: add the stabilization flux and its derivatives to the residual and Jacobian + integer const eqIndex0 = k[0] * numEqn; + integer const eqIndex1 = k[1] * numEqn; + + stack.localFlux[eqIndex0] += stabFlux; + stack.localFlux[eqIndex1] += -stabFlux; + + for( integer ke = 0; ke < stack.numFluxElems; ++ke ) + { + localIndex const localDofIndexPres = k[ke] * numDof; + stack.localFluxJacobian[eqIndex0][localDofIndexPres] += dStabFlux_dP[ke]; + stack.localFluxJacobian[eqIndex1][localDofIndexPres] += -dStabFlux_dP[ke]; + } + + } ); // end call to Base::computeFlux + + } + +protected: + + /// Views on flow properties at the previous converged time step + ElementViewConst< arrayView1d< real64 const > > const m_pres_n; + ElementViewConst< arrayView2d< real64 const > > const m_dens_n; + + /// Views on the macroelement indices and stab constant + ElementViewConst< arrayView1d< integer const > > const m_macroElementIndex; + ElementViewConst< arrayView1d< real64 const > > const m_elementStabConstant; + +}; + +/** + * @class FaceBasedAssemblyKernelFactory + */ +class FaceBasedAssemblyKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] solverName name of the solver (to name accessors) + * @param[in] elemManager reference to the element region manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY, typename STENCILWRAPPER > + static void + createAndLaunch( globalIndex const rankOffset, + string const & dofKey, + string const & solverName, + ElementRegionManager const & elemManager, + STENCILWRAPPER const & stencilWrapper, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + + integer constexpr NUM_EQN = 1; + integer constexpr NUM_DOF = 1; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + using KERNEL_TYPE = FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; + typename KERNEL_TYPE::SinglePhaseFlowAccessors singlePhaseFlowAccessors( elemManager, solverName ); + typename KERNEL_TYPE::SinglePhaseFluidAccessors singlePhaseFluidAccessors( elemManager, solverName ); + typename KERNEL_TYPE::StabSinglePhaseFlowAccessors stabSinglePhaseFlowAccessors( elemManager, solverName ); + typename KERNEL_TYPE::StabSinglePhaseFluidAccessors stabSinglePhaseFluidAccessors( elemManager, solverName ); + typename KERNEL_TYPE::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); + + KERNEL_TYPE kernel( rankOffset, stencilWrapper, dofNumberAccessor, + singlePhaseFlowAccessors, stabSinglePhaseFlowAccessors, singlePhaseFluidAccessors, stabSinglePhaseFluidAccessors, + permeabilityAccessors, + dt, localMatrix, localRhs ); + KERNEL_TYPE::template launch< POLICY >( stencilWrapper.size(), kernel ); + } +}; + +} // namespace stabilizedSinglePhaseFVMKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDSINGLEPHASEFVMKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 085e43395b5..354519b9f15 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -44,22 +44,6 @@ MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::MultiphasePoromechanic Group * const parent ) : Base( name, parent ) { - this->registerWrapper( viewKeyStruct::stabilizationTypeString(), &m_stabilizationType ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Stabilization type. Options are:\n" + - toString( StabilizationType::None ) + " - Add no stabilization to mass equation,\n" + - toString( StabilizationType::Global ) + " - Add stabilization to all faces,\n" + - toString( StabilizationType::Local ) + " - Add stabilization only to interiors of macro elements." ); - - this->registerWrapper( viewKeyStruct::stabilizationRegionNamesString(), &m_stabilizationRegionNames ). - setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Regions where stabilization is applied." ); - - this->registerWrapper( viewKeyStruct::stabilizationMultiplierString(), &m_stabilizationMultiplier ). - setApplyDefaultValue( 1.0 ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Constant multiplier of stabilization strength." ); LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanics; @@ -81,37 +65,6 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postProcessInput( )); } -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::registerDataOnMesh( Group & meshBodies ) -{ - Base::registerDataOnMesh( meshBodies ); - - if( m_stabilizationType == StabilizationType::Global || - m_stabilizationType == StabilizationType::Local ) - { - - if( this->getNonlinearSolverParameters().m_couplingType == NonlinearSolverParameters::CouplingType::Sequential ) - { - this->flowSolver()->enableJumpStabilization(); - } - - this->template forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) - { - ElementRegionManager & elemManager = mesh.getElemManager(); - - elemManager.forElementSubRegions< ElementSubRegionBase >( regionNames, - [&]( localIndex const, - ElementSubRegionBase & subRegion ) - { - subRegion.registerField< fields::flow::macroElementIndex >( this->getName() ); - subRegion.registerField< fields::flow::elementStabConstant >( this->getName() ); - } ); - } ); - } -} - template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::setupCoupling( DomainPartition const & GEOS_UNUSED_PARAM( domain ), DofManager & dofManager ) const @@ -143,7 +96,6 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleSystem( r if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) { - updateStabilizationParameters( domain ); this->flowSolver()->assembleStabilizedFluxTerms( dt, domain, dofManager, @@ -193,7 +145,7 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementBa thermalPoromechanicsKernels::ThermalMultiphasePoromechanicsKernelFactory >( mesh, dofManager, regionNames, - viewKeyStruct::porousMaterialNamesString(), + Base::viewKeyStruct::porousMaterialNamesString(), localMatrix, localRhs, dt, @@ -211,7 +163,7 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementBa poromechanicsKernels::MultiphasePoromechanicsKernelFactory >( mesh, dofManager, regionNames, - viewKeyStruct::porousMaterialNamesString(), + Base::viewKeyStruct::porousMaterialNamesString(), localMatrix, localRhs, dt, @@ -329,95 +281,6 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIni } } -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePreSubGroups() -{ - Base::initializePreSubGroups(); - - GEOS_THROW_IF( m_stabilizationType == StabilizationType::Local, - this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) << - ": Local stabilization has been disabled temporarily", - InputError ); -} - -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::implicitStepSetup( real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) -{ - Base::implicitStepSetup( time_n, dt, domain ); - if( this->getNonlinearSolverParameters().m_couplingType == NonlinearSolverParameters::CouplingType::Sequential && - (this->m_stabilizationType == StabilizationType::Global || this->m_stabilizationType == StabilizationType::Local)) - { - this->updateStabilizationParameters( domain ); - } - -} - -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateStabilizationParameters( DomainPartition & domain ) const -{ - // Step 1: we loop over the regions where stabilization is active and collect their name - - set< string > regionFilter; - for( string const & regionName : m_stabilizationRegionNames ) - { - regionFilter.insert( regionName ); - } - - // Step 2: loop over the target regions of the solver, and tag the elements belonging to stabilization regions - this->template forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & targetRegionNames ) - { - // keep only the target regions that are in the filter - array1d< string > filteredTargetRegionNames; - filteredTargetRegionNames.reserve( targetRegionNames.size() ); - - for( string const & targetRegionName : targetRegionNames ) - { - if( regionFilter.count( targetRegionName ) ) - { - filteredTargetRegionNames.emplace_back( targetRegionName ); - } - } - - // loop over the elements and update the stabilization constant - mesh.getElemManager().forElementSubRegions( filteredTargetRegionNames.toViewConst(), [&]( localIndex const, - ElementSubRegionBase & subRegion ) - - { - arrayView1d< integer > const macroElementIndex = subRegion.getField< fields::flow::macroElementIndex >(); - arrayView1d< real64 > const elementStabConstant = subRegion.getField< fields::flow::elementStabConstant >(); - - geos::constitutive::CoupledSolidBase const & porousSolid = - this->template getConstitutiveModel< geos::constitutive::CoupledSolidBase >( subRegion, subRegion.getReference< string >( viewKeyStruct::porousMaterialNamesString() ) ); - - arrayView1d< real64 const > const bulkModulus = porousSolid.getBulkModulus(); - arrayView1d< real64 const > const shearModulus = porousSolid.getShearModulus(); - arrayView1d< real64 const > const biotCoefficient = porousSolid.getBiotCoefficient(); - - real64 const stabilizationMultiplier = m_stabilizationMultiplier; - - forAll< parallelDevicePolicy<> >( subRegion.size(), [bulkModulus, - shearModulus, - biotCoefficient, - stabilizationMultiplier, - macroElementIndex, - elementStabConstant] GEOS_HOST_DEVICE ( localIndex const ei ) - { - real64 const bM = bulkModulus[ei]; - real64 const sM = shearModulus[ei]; - real64 const bC = biotCoefficient[ei]; - - macroElementIndex[ei] = 1; - elementStabConstant[ei] = stabilizationMultiplier * 9.0 * (bC * bC) / (32.0 * (10.0 * sM / 3.0 + bM)); - - } ); - } ); - } ); -} - template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateBulkDensity( ElementSubRegionBase & subRegion ) { @@ -426,7 +289,7 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateBulkDensity MultiFluidBase const & fluid = this->template getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); // get the solid model (to access porosity and solid density) - string const solidName = subRegion.getReference< string >( viewKeyStruct::porousMaterialNamesString() ); + string const solidName = subRegion.getReference< string >( Base::viewKeyStruct::porousMaterialNamesString() ); CoupledSolidBase const & solid = this->template getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); // update the bulk density diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index 22873b8660a..c69d3829e54 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -26,21 +26,6 @@ namespace geos { -namespace stabilization -{ -enum class StabilizationType : integer -{ - None, - Global, - Local, -}; - -ENUM_STRINGS( StabilizationType, - "None", - "Global", - "Local" ); -} - template< typename FLOW_SOLVER = CompositionalMultiphaseBase, typename MECHANICS_SOLVER = SolidMechanicsLagrangianFEM > class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANICS_SOLVER > { @@ -52,6 +37,9 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANI using Base::m_localMatrix; using Base::m_rhs; using Base::m_solution; + using Base::m_stabilizationType; + using Base::m_stabilizationRegionNames; + using Base::m_stabilizationMultiplier; /** * @brief main constructor for MultiphasePoromechanics Objects @@ -94,8 +82,6 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANI virtual void postProcessInput() override; - virtual void registerDataOnMesh( dataRepository::Group & meshBodies ) override; - virtual void setupCoupling( DomainPartition const & domain, DofManager & dofManager ) const override; @@ -115,35 +101,13 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANI virtual void updateState( DomainPartition & domain ) override; - virtual void implicitStepSetup( real64 const & time_n, - real64 const & dt, - DomainPartition & domain ) override; - /**@}*/ - /* - * @brief Utility function to update the stabilization parameters at each time step - * @param[in] domain the domain partition - */ - void updateStabilizationParameters( DomainPartition & domain ) const; - protected: virtual void initializePostInitialConditionsPreSubGroups() override; - virtual void initializePreSubGroups() override; - - struct viewKeyStruct : Base::viewKeyStruct - { - /// Type of stabilization used in the simulation - constexpr static char const * stabilizationTypeString() { return "stabilizationType"; } - /// Names of the regions where the stabilization is applied - constexpr static char const * stabilizationRegionNamesString() { return "stabilizationRegionNames"; } - - /// Multiplier on stabilization - constexpr static char const * stabilizationMultiplierString() { return "stabilizationMultiplier"; } - }; private: @@ -165,14 +129,6 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANI real64 const dt, PARAMS && ... params ); - /// Type of stabilization used in the simulation - stabilization::StabilizationType m_stabilizationType; - - /// Names of the regions where the stabilization is applied - array1d< string > m_stabilizationRegionNames; - - /// Multiplier on stabilization constant - real64 m_stabilizationMultiplier; }; diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index 2445cb9405b..5f3c6a913a1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -20,6 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSSOLVER_HPP_ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSSOLVER_HPP_ +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/multiphysics/CoupledSolver.hpp" #include "physicsSolvers/multiphysics/PoromechanicsFields.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" @@ -32,6 +33,26 @@ namespace geos { +namespace stabilization +{ +enum class StabilizationType : integer +{ + None, + Global, + Local, +}; + +ENUM_STRINGS( StabilizationType, + "None", + "Global", + "Local" ); +} + +using namespace stabilization; +using namespace fields; +using namespace constitutive; +using namespace dataRepository; + template< typename FLOW_SOLVER, typename MECHANICS_SOLVER = SolidMechanicsLagrangianFEM > class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER > { @@ -72,6 +93,23 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER setApplyDefaultValue( false ). setInputFlag( dataRepository::InputFlags::FALSE ). setDescription( "Flag to indicate that the solver is going to perform stress initialization" ); + + this->registerWrapper( viewKeyStruct::stabilizationTypeString(), &m_stabilizationType ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDescription( "StabilizationType. Options are:\n" + + toString( StabilizationType::None ) + "- Add no stabilization to mass equation \n" + + toString( StabilizationType::Global ) + "- Add jump stabilization to all faces \n" + + toString( StabilizationType::Local ) + "- Add jump stabilization on interior of macro elements" ); + + this->registerWrapper( viewKeyStruct::stabilizationRegionNamesString(), &m_stabilizationRegionNames ). + setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDescription( "Regions where stabilization is applied." ); + + this->registerWrapper( viewKeyStruct::stabilizationMultiplierString(), &m_stabilizationMultiplier ). + setApplyDefaultValue( 1.0 ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDescription( "Constant multiplier of stabilization strength" ); } virtual void initializePostInitialConditionsPreSubGroups() override @@ -88,6 +126,11 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER { Base::initializePreSubGroups(); + GEOS_THROW_IF( m_stabilizationType == StabilizationType::Local, + this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) << + ": Local stabilization has been temporarily disabled", + InputError ); + DomainPartition & domain = this->template getGroupByPath< DomainPartition >( "/Problem/domain" ); this->template forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -135,6 +178,11 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER flowSolver()->enableFixedStressPoromechanicsUpdate(); } + if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) + { + flowSolver()->enableJumpStabilization(); + } + SolverBase::forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) @@ -162,6 +210,12 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER // ideally we would resize it here as well, but the solid model name is not available yet (see below) subRegion.registerField< fields::poromechanics::bulkDensity >( this->getName() ); } + + if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) + { + subRegion.registerField< fields::flow::macroElementIndex >( this->getName()); + subRegion.registerField< fields::flow::elementStabConstant >( this->getName()); + } } ); } ); } @@ -171,6 +225,12 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER DomainPartition & domain ) override { flowSolver()->setKeepFlowVariablesConstantDuringInitStep( m_performStressInitialization ); + + if( this->m_stabilizationType == StabilizationType::Global || this->m_stabilizationType == StabilizationType::Local ) + { + this->updateStabilizationParameters( domain ); + } + Base::implicitStepSetup( time_n, dt, domain ); } @@ -182,7 +242,6 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER // that's the reason why this function is here and not in CoupledSolvers.hpp solidMechanicsSolver()->setupDofs( domain, dofManager ); flowSolver()->setupDofs( domain, dofManager ); - this->setupCoupling( domain, dofManager ); } @@ -242,8 +301,79 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER /// Flag to indicate that the solver is going to perform stress initialization constexpr static char const * performStressInitializationString() { return "performStressInitialization"; } + + /// Type of pressure stabilization + constexpr static char const * stabilizationTypeString() {return "stabilizationType"; } + + /// Name of regions on which stabilization applied + constexpr static const char * stabilizationRegionNamesString() {return "stabilizationRegionNames"; } + + /// Multiplier on stabilization strength + constexpr static const char * stabilizationMultiplierString() {return "stabilizationMultiplier"; } }; + void updateStabilizationParameters( DomainPartition & domain ) const + { + // Step 1: we loop over the regions where stabilization is active and collect their name + set< string > regionFilter; + for( string const & regionName : m_stabilizationRegionNames ) + { + regionFilter.insert( regionName ); + } + + // Step 2: loop over target regions of solver, and tag the elements belonging to the stabilization regions + this->template forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & targetRegionNames ) + { + //keep only target regions in filter + array1d< string > filteredTargetRegionNames; + filteredTargetRegionNames.reserve( targetRegionNames.size() ); + + for( string const & targetRegionName : targetRegionNames ) + { + if( regionFilter.count( targetRegionName ) ) + { + filteredTargetRegionNames.emplace_back( targetRegionName ); + } + } + + // Loop over elements and update stabilization constant + mesh.getElemManager().forElementSubRegions( filteredTargetRegionNames.toViewConst(), [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + arrayView1d< integer > const macroElementIndex = subRegion.getField< fields::flow::macroElementIndex >(); + arrayView1d< real64 > const elementStabConstant = subRegion.getField< fields::flow::elementStabConstant >(); + + geos::constitutive::CoupledSolidBase const & porousSolid = + this->template getConstitutiveModel< geos::constitutive::CoupledSolidBase >( subRegion, subRegion.getReference< string >( viewKeyStruct::porousMaterialNamesString() ) ); + + arrayView1d< real64 const > const bulkModulus = porousSolid.getBulkModulus(); + arrayView1d< real64 const > const shearModulus = porousSolid.getShearModulus(); + arrayView1d< real64 const > const biotCoefficient = porousSolid.getBiotCoefficient(); + + real64 const stabilizationMultiplier = m_stabilizationMultiplier; + + forAll< parallelDevicePolicy<> >( subRegion.size(), [bulkModulus, + shearModulus, + biotCoefficient, + stabilizationMultiplier, + macroElementIndex, + elementStabConstant] GEOS_HOST_DEVICE ( localIndex const ei ) + + { + real64 const bM = bulkModulus[ei]; + real64 const sM = shearModulus[ei]; + real64 const bC = biotCoefficient[ei]; + + macroElementIndex[ei] = 1; + elementStabConstant[ei] = stabilizationMultiplier * 9.0 * (bC * bC) / (32.0 * (10.0 * sM / 3.0 + bM)); + } ); + } ); + } ); + + } + protected: /* Implementation of Nonlinear Acceleration (Aitken) of averageMeanTotalStressIncrement */ @@ -481,6 +611,15 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER /// Flag to indicate that the solver is going to perform stress initialization integer m_performStressInitialization; + /// Type of stabilization used + stabilization::StabilizationType m_stabilizationType; + + /// Names of regions where stabilization applied + array1d< string > m_stabilizationRegionNames; + + /// Stabilization Multiplier + real64 m_stabilizationMultiplier; + /// Member variables needed for Nonlinear Acceleration ( Aitken ). Naming convention follows ( Jiang & Tchelepi, 2019 ) array1d< real64 > m_s0; // Accelerated averageMeanTotalStresIncrement @ outer iteration v ( two iterations ago ) array1d< real64 > m_s1; // Accelerated averageMeanTotalStresIncrement @ outer iteration v + 1 ( previous iteration ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index db06db07c53..ea86367a721 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -145,11 +145,22 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleSystem( localRhs ); // Step 3: compute the fluxes (face-based contributions) - this->flowSolver()->assembleFluxTerms( dt, - domain, - dofManager, - localMatrix, - localRhs ); + if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) + { + this->flowSolver()->assembleStabilizedFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } + else + { + this->flowSolver()->assembleFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index 34ebd3ada61..21cc282a1dd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -37,6 +37,9 @@ class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHAN using Base::m_localMatrix; using Base::m_rhs; using Base::m_solution; + using Base::m_stabilizationType; + using Base::m_stabilizationRegionNames; + using Base::m_stabilizationMultiplier; /** * @brief main constructor for SinglePhasePoromechanics objects diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 145d21507c1..0db0b36daaf 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -107,6 +107,14 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERV arrayView1d< real64 > const & localRhs ) { flowSolver()->accumulationAssemblyLaunch( dofManager, subRegion, localMatrix, localRhs ); } + void + assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) const + { flowSolver()->assembleStabilizedFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } + void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) { flowSolver()->setKeepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } @@ -121,6 +129,8 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERV void enableFixedStressPoromechanicsUpdate() { flowSolver()->enableFixedStressPoromechanicsUpdate(); } + void enableJumpStabilization() {flowSolver()->enableJumpStabilization();} + virtual void saveSequentialIterationState( DomainPartition & domain ) override { flowSolver()->saveSequentialIterationState( domain ); } void prepareStencilWeights( DomainPartition & domain ) const From 53314c5e73a6f2bdfd12552031e1e2d0dd12805a Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Sun, 16 Jun 2024 09:48:40 -0500 Subject: [PATCH 097/286] Add linear solver params table output (#3164) Co-authored-by: MelReyCG <122801580+MelReyCG@users.noreply.github.com> --- .../physicsSolvers/LinearSolverParameters.cpp | 74 +++++++++++++++++++ .../physicsSolvers/LinearSolverParameters.hpp | 2 + 2 files changed, 76 insertions(+) diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp index 6fa15ae76e4..d9767a84bea 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp @@ -17,6 +17,7 @@ */ #include "LinearSolverParameters.hpp" +#include "fileIO/Table/TableFormatter.hpp" namespace geos { @@ -257,6 +258,79 @@ void LinearSolverParametersInput::postProcessInput() ": Invalid value." ); // TODO input validation for other AMG parameters ? + + if( getLogLevel() > 0 ) + print(); +} + +void LinearSolverParametersInput::print() +{ + TableData tableData; + tableData.addRow( "Log level", getLogLevel()); + tableData.addRow( "Linear solver type", m_parameters.solverType ); + tableData.addRow( "Preconditioner type", m_parameters.preconditionerType ); + tableData.addRow( "Stop if error", m_parameters.stopIfError ); + if( m_parameters.solverType == LinearSolverParameters::SolverType::direct ) + { + tableData.addRow( "Check residual", m_parameters.direct.checkResidual ); + tableData.addRow( "Scale rows and columns", m_parameters.direct.equilibrate ); + tableData.addRow( "Columns permutation", m_parameters.direct.colPerm ); + tableData.addRow( "Rows permutation", m_parameters.direct.rowPerm ); + tableData.addRow( "Replace tiny pivots", m_parameters.direct.replaceTinyPivot ); + tableData.addRow( "Perform iterative refinement", m_parameters.direct.iterativeRefine ); + tableData.addRow( "Use parallel solver", m_parameters.direct.parallel ); + } + else + { + tableData.addRow( "Maximum iterations", m_parameters.krylov.maxIterations ); + if( m_parameters.solverType == LinearSolverParameters::SolverType::gmres || + m_parameters.solverType == LinearSolverParameters::SolverType::fgmres ) + { + tableData.addRow( "Maximum iterations before restart", m_parameters.krylov.maxRestart ); + } + tableData.addRow( "Use adaptive tolerance", m_parameters.krylov.useAdaptiveTol ); + if( m_parameters.krylov.useAdaptiveTol ) + { + tableData.addRow( "Weakest-allowed tolerance", m_parameters.krylov.weakestTol ); + } + else + { + tableData.addRow( "Relative convergence tolerance", m_parameters.krylov.relTolerance ); + } + } + if( m_parameters.preconditionerType == LinearSolverParameters::PreconditionerType::amg ) + { + tableData.addRow( "AMG", "" ); + tableData.addRow( " Smoother sweeps", m_parameters.amg.numSweeps ); + tableData.addRow( " Smoother type", m_parameters.amg.smootherType ); + tableData.addRow( " Relaxation factor for the smoother", m_parameters.amg.relaxWeight ); + tableData.addRow( " Coarsest level solver/smoother type", m_parameters.amg.coarseType ); + tableData.addRow( " Coarsening algorithm", m_parameters.amg.coarseningType ); + tableData.addRow( " Interpolation algorithm", m_parameters.amg.interpolationType ); + tableData.addRow( " Interpolation maximum number of nonzeros per row", m_parameters.amg.interpolationMaxNonZeros ); + tableData.addRow( " Number of functions", m_parameters.amg.numFunctions ); + tableData.addRow( " Number of paths for aggressive coarsening", m_parameters.amg.aggressiveNumPaths ); + tableData.addRow( " Number of levels for aggressive coarsening", m_parameters.amg.aggressiveNumLevels ); + tableData.addRow( " Aggressive interpolation algorithm", m_parameters.amg.aggressiveInterpType ); + tableData.addRow( " Strength-of-connection threshold", m_parameters.amg.threshold ); + tableData.addRow( " Apply separate component filter for multi-variable problems", m_parameters.amg.separateComponents ); + tableData.addRow( " Near null space approximation", m_parameters.amg.nullSpaceType ); + } + else if( m_parameters.preconditionerType == LinearSolverParameters::PreconditionerType::iluk || + m_parameters.preconditionerType == LinearSolverParameters::PreconditionerType::ilut ) + { + tableData.addRow( "ILU(K) fill factor", m_parameters.ifact.fill ); + if( m_parameters.preconditionerType == LinearSolverParameters::PreconditionerType::ilut ) + { + tableData.addRow( "ILU(T) threshold factor", m_parameters.ifact.threshold ); + } + } + TableLayout const tableLayout = TableLayout( { + TableLayout::ColumnParam{"Parameter", TableLayout::Alignment::left}, + TableLayout::ColumnParam{"Value", TableLayout::Alignment::left}, + }, GEOS_FMT( "{}: linear solver", getParent().getName() ) ); + TableTextFormatter const tableFormatter( tableLayout ); + GEOS_LOG_RANK_0( tableFormatter.toString( tableData )); } REGISTER_CATALOG_ENTRY( Group, LinearSolverParametersInput, string const &, Group * const ) diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp index ced2aa2b62a..462203c9b98 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp @@ -59,6 +59,8 @@ class LinearSolverParametersInput : public dataRepository::Group /// Postprocessing of input virtual void postProcessInput() override; + void print(); + LinearSolverParameters const & get() const { return m_parameters; } From 5e5a2511eeb7ec6464eeabb9b3ded28bfd8ece7f Mon Sep 17 00:00:00 2001 From: Sy-Tuan Nguyen <45685596+sytuannguyen@users.noreply.github.com> Date: Tue, 18 Jun 2024 04:53:10 +0700 Subject: [PATCH 098/286] Implement Temperature-dependent Solid Volumetric Heat Capacity (#3088) Co-authored-by: Jian HUANG --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 + .../3D_10x10x10_thermalCompressible_base.xml | 2 +- .../thermalCompressible_2d_base.xml | 31 +- .../thermalCompressible_2d_benchmark.xml | 9 +- .../thermalCompressible_2d_smoke.xml | 9 +- ...malCompressible_nonLinear_2d_benchmark.xml | 50 + ...thermalCompressible_nonLinear_2d_smoke.xml | 50 + .../thermalSinglePhaseFlow.ats | 8 + .../thermalMultiphaseFlow/co2_thermal_2d.xml | 2 +- .../egsCollab_thermalFlow_base.xml | 2 +- .../fractureMatrixThermalFlow_base.xml | 2 +- .../ThermoPoroElastic_consolidation_base.xml | 2 +- .../ThermoPoroElastic_staircase_co2_smoke.xml | 2 +- .../ThermoPoroElastic_base.xml | 2 +- ...moPoroElastic_efem-edfm_eggModel_small.xml | 2 +- ...asticWellbore_ImperfectInterfaces_base.xml | 6 +- .../CasedThermoElasticWellbore_base.xml | 6 +- .../ThermoPoroElasticWellbore_base.xml | 2 +- .../constitutive/docs/Constitutive.rst | 1 + ...reDependentSolidVolumetricHeatCapacity.rst | 55 + .../solid/SolidInternalEnergy.cpp | 12 +- .../solid/SolidInternalEnergy.hpp | 34 +- .../docs/HydrofractureInitialization.rst | 12 + .../HydrofractureInitialization_other.rst | 9 + .../schema/docs/NonlinearSolverParameters.rst | 1 + .../schema/docs/SolidInternalEnergy.rst | 17 +- src/coreComponents/schema/docs/Tasks.rst | 1 + .../schema/docs/Tasks_other.rst | 1 + src/coreComponents/schema/schema.xsd | 23 +- src/coreComponents/schema/schema.xsd.other | 2 + .../testThermalCompMultiphaseFlow.cpp | 2 +- .../testThermalSinglePhaseFlow.cpp | 2 +- src/docs/sphinx/CompleteXMLSchema.rst | 14 + .../wellboreProblems/Index.rst | 2 + .../nonLinearThermalDiffusion/Example.rst | 62 + .../nonLinearThermalDiffusion/data_1.csv | 1002 +++++++++++++++++ .../nonLinearThermalDiffusion/data_10.csv | 1002 +++++++++++++++++ .../nonLinearThermalDiffusion/data_2.csv | 1002 +++++++++++++++++ .../nonLinearThermalDiffusion/data_5.csv | 1002 +++++++++++++++++ ...nonLinearThermalDiffusionAroundWellbore.py | 190 ++++ .../pureThermalDiffusionAroundWellbore.py | 7 +- 42 files changed, 4594 insertions(+), 56 deletions(-) create mode 100644 inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_benchmark.xml create mode 100644 inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_smoke.xml create mode 100644 src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst create mode 100644 src/coreComponents/schema/docs/HydrofractureInitialization.rst create mode 100644 src/coreComponents/schema/docs/HydrofractureInitialization_other.rst create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/Example.rst create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_1.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_10.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_2.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_5.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 0ada21a4b6d..a2d9f7e6608 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3100-5620-afd9708 + baseline: integratedTests/baseline_integratedTests-pr3088-5630-5ecff59 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 669fa733891..eaef1d170e8 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3088 (2024-06-17) +====================== +Adding temperature-dependent Solid Volumetric Heat Capacity. Rebaseline because of the parameter change in SolidInternalEnergy. + + PR #3100 (2024-06-14) ====================== Adding pressure stabilization for single phase poromechanics. @@ -55,6 +60,7 @@ PR #3113 (2024-06-05) ===================== Add general version updateConfiguration. Rebaseline of some edfm cases is needed. + PR #3050 (2024-05-20) ===================== Spatially varying grain bulk modulus. Rebaseline of all poromechanics cases needed. diff --git a/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml b/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml index 33608531c56..942ab9d95c8 100644 --- a/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml +++ b/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml @@ -63,7 +63,7 @@ diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml b/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml index 98db3647020..767e0f4f701 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml @@ -24,21 +24,21 @@ - - - - + + + solidInternalEnergyModelName="rockInternalEnergy_nonLinear"/> @@ -51,12 +51,21 @@ + + + + diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml b/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml index 4c33c44d234..68e33c33f50 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml @@ -5,7 +5,14 @@ - + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_smoke.xml b/inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_smoke.xml new file mode 100644 index 00000000000..e4cfc03c23b --- /dev/null +++ b/inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_smoke.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats b/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats index 532b1b1f989..2fb9d311c88 100644 --- a/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats +++ b/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats @@ -22,6 +22,14 @@ decks = [ partitions=((1, 1, 1), (2, 2, 2)), restart_step=6, check_step=20, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="thermalCompressible_nonLinear_2d_smoke", + description= + 'non-linear thermal diffusion around a wellbore)', + partitions=((1, 1, 1), (2, 2, 1)), + restart_step=1, + check_step=2, restartcheck_params=RestartcheckParameters(**restartcheck_params)) ] diff --git a/inputFiles/thermalMultiphaseFlow/co2_thermal_2d.xml b/inputFiles/thermalMultiphaseFlow/co2_thermal_2d.xml index 19b770ede18..6eb7f504cd4 100644 --- a/inputFiles/thermalMultiphaseFlow/co2_thermal_2d.xml +++ b/inputFiles/thermalMultiphaseFlow/co2_thermal_2d.xml @@ -104,7 +104,7 @@ compressibility="1.0e-9"/> diff --git a/inputFiles/thermalSinglePhaseFlowFractures/fractureMatrixThermalFlow_base.xml b/inputFiles/thermalSinglePhaseFlowFractures/fractureMatrixThermalFlow_base.xml index fa36fd0213d..d0c1646ec04 100644 --- a/inputFiles/thermalSinglePhaseFlowFractures/fractureMatrixThermalFlow_base.xml +++ b/inputFiles/thermalSinglePhaseFlowFractures/fractureMatrixThermalFlow_base.xml @@ -47,7 +47,7 @@ diff --git a/inputFiles/thermoPoromechanics/ThermoPoroElastic_consolidation_base.xml b/inputFiles/thermoPoromechanics/ThermoPoroElastic_consolidation_base.xml index e06d0a6bbfa..9fdb4234c0a 100644 --- a/inputFiles/thermoPoromechanics/ThermoPoroElastic_consolidation_base.xml +++ b/inputFiles/thermoPoromechanics/ThermoPoroElastic_consolidation_base.xml @@ -49,7 +49,7 @@ diff --git a/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml b/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml index c292cd722a6..da964fb4008 100644 --- a/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml +++ b/inputFiles/thermoPoromechanics/ThermoPoroElastic_staircase_co2_smoke.xml @@ -188,7 +188,7 @@ diff --git a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml index c44c9d3baec..cb00829f403 100644 --- a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml +++ b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml @@ -37,7 +37,7 @@ diff --git a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml index 33c9d96c76c..f268a9c3ee1 100644 --- a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml +++ b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml @@ -219,7 +219,7 @@ diff --git a/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml b/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml index 12d87d241cf..17f408759b1 100644 --- a/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml +++ b/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml @@ -168,19 +168,19 @@ diff --git a/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml b/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml index 4486857c364..87e49a84312 100644 --- a/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml +++ b/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml @@ -110,19 +110,19 @@ diff --git a/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml b/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml index 3219e5ab64b..20aaa9ae436 100644 --- a/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml +++ b/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml @@ -73,7 +73,7 @@ diff --git a/src/coreComponents/constitutive/docs/Constitutive.rst b/src/coreComponents/constitutive/docs/Constitutive.rst index e6115637721..68279ea3774 100644 --- a/src/coreComponents/constitutive/docs/Constitutive.rst +++ b/src/coreComponents/constitutive/docs/Constitutive.rst @@ -18,6 +18,7 @@ These models are grouped together based on their input/output interface. PorosityModels PermeabilityModels PorousSolids + TemperatureDependentSolidVolumetricHeatCapacity In an input XML file, constitutive models are listed in the ```` block. diff --git a/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst b/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst new file mode 100644 index 00000000000..22feb9c1b8c --- /dev/null +++ b/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst @@ -0,0 +1,55 @@ +.. _TemperatureDependentSolidVolumetricHeatCapacity: + + +########################################################## +Temperature-dependent Solid Volumetric Heat Capacity Model +########################################################## + + +Overview +====================== + +In this model, solid volumetric specific heat capacity is assumed to be a linear function of temperature: + +.. math:: + C = C_{0} + \frac{ dC }{ dT } (T - T_{0}) + +where + :math:`C` is the solid volumetric heat capacity at temperature T; + :math:`C_{0}` is the reference solid volumetric heat capacity at the reference temperature; + :math:`T_{0}` is the reference temperature; + :math:`\frac{ dC }{ dT }` is the gradient of the volumetric heat capacity with respect to temperature, which equals to zero for the cases with constant solid volumetric heat capacity; + + + +Parameters +====================== + +The temperature-dependent solid volumetric heat capacity model is called in the +```` block of the input XML file. +This model must be assigned a unique name via the +``name`` attribute. +This name is used to attach the model to regions of the physical +domain via a ``solidInternalEnergyModelName`` attribute in the ```` +block. + +The following attributes are supported: + +.. include:: /coreComponents/schema/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst + + +Example +======================= + +.. code-block:: xml + + + ... + + ... + diff --git a/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp b/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp index 1928050957d..30ac96a62d6 100644 --- a/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp +++ b/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp @@ -30,7 +30,8 @@ SolidInternalEnergy::SolidInternalEnergy( string const & name, Group * const par ConstitutiveBase( name, parent ), m_internalEnergy(), m_dInternalEnergy_dTemperature(), - m_volumetricHeatCapacity(), + m_referenceVolumetricHeatCapacity(), + m_dVolumetricHeatCapacity_dTemperature(), m_referenceTemperature(), m_referenceInternalEnergy() { @@ -47,9 +48,14 @@ SolidInternalEnergy::SolidInternalEnergy( string const & name, Group * const par setApplyDefaultValue( 0.0 ). setDescription( "Derivative of the solid internal energy w.r.t. temperature [J/(m^3.K)]" ); - registerWrapper( viewKeyStruct::volumetricHeatCapacityString(), &m_volumetricHeatCapacity ). + registerWrapper( viewKeyStruct::referenceVolumetricHeatCapacityString(), &m_referenceVolumetricHeatCapacity ). setInputFlag( InputFlags::REQUIRED ). - setDescription( "Solid volumetric heat capacity [J/(kg.K)]" ); + setDescription( "Reference solid volumetric heat capacity [J/(kg.K)]" ); + + registerWrapper( viewKeyStruct::dVolumetricHeatCapacity_dTemperatureString(), &m_dVolumetricHeatCapacity_dTemperature ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 0.0 ). + setDescription( "Derivative of the solid volumetric heat capacity w.r.t. temperature [J/(m^3.K^2)]" ); registerWrapper( viewKeyStruct::referenceTemperatureString(), &m_referenceTemperature ). setInputFlag( InputFlags::REQUIRED ). diff --git a/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp b/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp index cd2efaa4024..8457722f19c 100644 --- a/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp +++ b/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp @@ -35,12 +35,14 @@ class SolidInternalEnergyUpdates SolidInternalEnergyUpdates( arrayView2d< real64 > const & internalEnergy, arrayView2d< real64 > const & dInternalEnergy_dTemperature, - real64 const & volumetricHeatCapacity, + real64 const & referenceVolumetricHeatCapacity, + real64 const & dVolumetricHeatCapacity_dTemperature, real64 const & referenceTemperature, real64 const & referenceInternalEnergy ): m_internalEnergy( internalEnergy ), m_dInternalEnergy_dTemperature( dInternalEnergy_dTemperature ), - m_volumetricHeatCapacity( volumetricHeatCapacity ), + m_referenceVolumetricHeatCapacity( referenceVolumetricHeatCapacity ), + m_dVolumetricHeatCapacity_dTemperature( dVolumetricHeatCapacity_dTemperature ), m_referenceTemperature( referenceTemperature ), m_referenceInternalEnergy( referenceInternalEnergy ) {} @@ -59,8 +61,10 @@ class SolidInternalEnergyUpdates real64 & internalEnergy, real64 & dInternalEnergy_dTemperature ) const { - internalEnergy = m_referenceInternalEnergy + m_volumetricHeatCapacity * ( temperature - m_referenceTemperature ); - dInternalEnergy_dTemperature = m_volumetricHeatCapacity; + real64 volumetricHeatCapacity = m_referenceVolumetricHeatCapacity + m_dVolumetricHeatCapacity_dTemperature * ( temperature - m_referenceTemperature ); + + internalEnergy = m_referenceInternalEnergy + volumetricHeatCapacity * ( temperature - m_referenceTemperature ); + dInternalEnergy_dTemperature = volumetricHeatCapacity + m_dVolumetricHeatCapacity_dTemperature * ( temperature - m_referenceTemperature ); } private: @@ -71,13 +75,16 @@ class SolidInternalEnergyUpdates /// Derivative of the solid internal energy w.r.t. the temperature arrayView2d< real64 > m_dInternalEnergy_dTemperature; - /// Solid volumetric heat capacity - real64 m_volumetricHeatCapacity; + /// Solid volumetric heat capacity at the reference tempearture + real64 m_referenceVolumetricHeatCapacity; + + /// Derivative of the solid volumetric heat capacity w.r.t. the temperature + real64 m_dVolumetricHeatCapacity_dTemperature; /// Reference temperature real64 m_referenceTemperature; - /// Reference internal energy + /// Internal energy at the reference temperature real64 m_referenceInternalEnergy; }; @@ -99,7 +106,8 @@ class SolidInternalEnergy : public ConstitutiveBase static constexpr char const * internalEnergyString() { return "internalEnergy"; } static constexpr char const * oldInternalEnergyString() { return "internalEnergy_n"; } static constexpr char const * dInternalEnergy_dTemperatureString() { return "dInternalEnergy_dTemperature"; } - static constexpr char const * volumetricHeatCapacityString() { return "volumetricHeatCapacity"; } + static constexpr char const * referenceVolumetricHeatCapacityString() { return "referenceVolumetricHeatCapacity"; } + static constexpr char const * dVolumetricHeatCapacity_dTemperatureString() { return "dVolumetricHeatCapacity_dTemperature"; } static constexpr char const * referenceTemperatureString() { return "referenceTemperature"; } static constexpr char const * referenceInternalEnergyString() { return "referenceInternalEnergy"; } } viewKeys; @@ -114,7 +122,8 @@ class SolidInternalEnergy : public ConstitutiveBase { return KernelWrapper( m_internalEnergy, m_dInternalEnergy_dTemperature, - m_volumetricHeatCapacity, + m_referenceVolumetricHeatCapacity, + m_dVolumetricHeatCapacity_dTemperature, m_referenceTemperature, m_referenceInternalEnergy ); } @@ -152,8 +161,11 @@ class SolidInternalEnergy : public ConstitutiveBase /// Derivative of the solid internal energy w.r.t. the temperature array2d< real64 > m_dInternalEnergy_dTemperature; - /// Solid volumetric heat capacity - real64 m_volumetricHeatCapacity; + /// Solid volumetric heat capacity at the reference temperature + real64 m_referenceVolumetricHeatCapacity; + + /// Derivative of the solid volumetric heat capacity w.r.t. the temperature + real64 m_dVolumetricHeatCapacity_dTemperature; /// Reference temperature real64 m_referenceTemperature; diff --git a/src/coreComponents/schema/docs/HydrofractureInitialization.rst b/src/coreComponents/schema/docs/HydrofractureInitialization.rst new file mode 100644 index 00000000000..18e3a0dd9e7 --- /dev/null +++ b/src/coreComponents/schema/docs/HydrofractureInitialization.rst @@ -0,0 +1,12 @@ + + +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== + + diff --git a/src/coreComponents/schema/docs/HydrofractureInitialization_other.rst b/src/coreComponents/schema/docs/HydrofractureInitialization_other.rst new file mode 100644 index 00000000000..adf1c1b8aec --- /dev/null +++ b/src/coreComponents/schema/docs/HydrofractureInitialization_other.rst @@ -0,0 +1,9 @@ + + +==== ==== ============================ +Name Type Description +==== ==== ============================ + (no documentation available) +==== ==== ============================ + + diff --git a/src/coreComponents/schema/docs/NonlinearSolverParameters.rst b/src/coreComponents/schema/docs/NonlinearSolverParameters.rst index bf61e0939db..536793a2dea 100644 --- a/src/coreComponents/schema/docs/NonlinearSolverParameters.rst +++ b/src/coreComponents/schema/docs/NonlinearSolverParameters.rst @@ -4,6 +4,7 @@ Name Type Default Description ============================== ============================================================= ============= =================================================================================================================================================================================================================================================================================================================== allowNonConverged integer 0 Allow non-converged solution to be accepted. (i.e. exit from the Newton loop without achieving the desired tolerance) +configurationTolerance real64 0 Configuration tolerance couplingType geos_NonlinearSolverParameters_CouplingType FullyImplicit | Type of coupling. Valid options: | * FullyImplicit | * Sequential diff --git a/src/coreComponents/schema/docs/SolidInternalEnergy.rst b/src/coreComponents/schema/docs/SolidInternalEnergy.rst index 3eea9887790..b4432cbfb54 100644 --- a/src/coreComponents/schema/docs/SolidInternalEnergy.rst +++ b/src/coreComponents/schema/docs/SolidInternalEnergy.rst @@ -1,12 +1,13 @@ -======================= ========= ======== =================================================== -Name Type Default Description -======================= ========= ======== =================================================== -name groupName required A name is required for any non-unique nodes -referenceInternalEnergy real64 required Internal energy at the reference temperature [J/kg] -referenceTemperature real64 required Reference temperature [K] -volumetricHeatCapacity real64 required Solid volumetric heat capacity [J/(kg.K)] -======================= ========= ======== =================================================== +==================================== ========= ======== ================================================================================= +Name Type Default Description +==================================== ========= ======== ================================================================================= +dVolumetricHeatCapacity_dTemperature real64 0 Derivative of the solid volumetric heat capacity w.r.t. temperature [J/(m^3.K^2)] +name groupName required A name is required for any non-unique nodes +referenceInternalEnergy real64 required Internal energy at the reference temperature [J/kg] +referenceTemperature real64 required Reference temperature [K] +referenceVolumetricHeatCapacity real64 required Reference solid volumetric heat capacity [J/(kg.K)] +==================================== ========= ======== ================================================================================= diff --git a/src/coreComponents/schema/docs/Tasks.rst b/src/coreComponents/schema/docs/Tasks.rst index 3a3a3e06a9f..4b2e9649e5a 100644 --- a/src/coreComponents/schema/docs/Tasks.rst +++ b/src/coreComponents/schema/docs/Tasks.rst @@ -5,6 +5,7 @@ Name Type Default Descrip =========================================================== ==== ======= ====================================================================== CompositionalMultiphaseReservoirPoromechanicsInitialization node :ref:`XML_CompositionalMultiphaseReservoirPoromechanicsInitialization` CompositionalMultiphaseStatistics node :ref:`XML_CompositionalMultiphaseStatistics` +HydrofractureInitialization node :ref:`XML_HydrofractureInitialization` MultiphasePoromechanicsInitialization node :ref:`XML_MultiphasePoromechanicsInitialization` PVTDriver node :ref:`XML_PVTDriver` PackCollection node :ref:`XML_PackCollection` diff --git a/src/coreComponents/schema/docs/Tasks_other.rst b/src/coreComponents/schema/docs/Tasks_other.rst index 4ee34a22e81..991b7d3f475 100644 --- a/src/coreComponents/schema/docs/Tasks_other.rst +++ b/src/coreComponents/schema/docs/Tasks_other.rst @@ -5,6 +5,7 @@ Name Type Description =========================================================== ==== ================================================================================ CompositionalMultiphaseReservoirPoromechanicsInitialization node :ref:`DATASTRUCTURE_CompositionalMultiphaseReservoirPoromechanicsInitialization` CompositionalMultiphaseStatistics node :ref:`DATASTRUCTURE_CompositionalMultiphaseStatistics` +HydrofractureInitialization node :ref:`DATASTRUCTURE_HydrofractureInitialization` MultiphasePoromechanicsInitialization node :ref:`DATASTRUCTURE_MultiphasePoromechanicsInitialization` PVTDriver node :ref:`DATASTRUCTURE_PVTDriver` PackCollection node :ref:`DATASTRUCTURE_PackCollection` diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index a708c4afc06..9faa9453548 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -471,6 +471,10 @@ + + + + @@ -1871,6 +1875,8 @@ the relative residual norm satisfies: + + @@ -3622,6 +3628,7 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + @@ -3662,6 +3669,16 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + + + + + + + + + @@ -5208,12 +5225,14 @@ If you want to do a three-phase simulation, please use instead wettingIntermedia + + - - + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index e903f4ea2fa..a0fbfc4a731 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1295,6 +1295,7 @@ + @@ -1311,6 +1312,7 @@ + diff --git a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp index dc8a342ff69..58549f21be8 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp @@ -109,7 +109,7 @@ char const * xmlInput = referencePressure="0.0" compressibility="1.0e-9" /> + :end-before: + + +--------------------------------- +Results and benchmark +--------------------------------- + +A good agreement between the results obtained using GEOS and the analytical results is shown in the figure below: + + +.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py + + +------------------------------------------------------------------ +To go further +------------------------------------------------------------------ + +**Feedback on this example** + +This concludes the example of a non-linear thermal diffusion problem around a wellbore. +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_1.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_1.csv new file mode 100644 index 00000000000..9ccebfe447a --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_1.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,0.10099,0.0009915,0.05,95.827 +10000,0.10099,0.0009915,0.05,95.827 +10000,0.10099,0.0009915,0.05,95.827 +10000,0.10299,0.0010111,0.05,87.738 +10000,0.10299,0.0010111,0.05,87.738 +10000,0.10499,0.0010308,0.05,80.054 +10000,0.10499,0.0010308,0.05,80.054 +10000,0.10734,0.0010538,0.05,71.614 +10000,0.10734,0.0010538,0.05,71.614 +10000,0.11004,0.0010803,0.05,62.937 +10000,0.11004,0.0010803,0.05,62.937 +10000,0.11004,0.0010803,0.05,62.937 +10000,0.11274,0.0011068,0.05,55.295 +10000,0.11274,0.0011068,0.05,55.295 +10000,0.11274,0.0011068,0.05,55.295 +10000,0.11544,0.0011334,0.05,48.633 +10000,0.11544,0.0011334,0.05,48.633 +10000,0.11814,0.0011599,0.05,42.858 +10000,0.11814,0.0011599,0.05,42.858 +10000,0.11814,0.0011599,0.05,42.858 +10000,0.12084,0.0011864,0.05,37.866 +10000,0.12084,0.0011864,0.05,37.866 +10000,0.12084,0.0011864,0.05,37.866 +10000,0.12354,0.0012129,0.05,33.555 +10000,0.12354,0.0012129,0.05,33.555 +10000,0.12624,0.0012394,0.05,29.826 +10000,0.12624,0.0012394,0.05,29.826 +10000,0.12624,0.0012394,0.05,29.826 +10000,0.12894,0.0012659,0.05,26.597 +10000,0.12894,0.0012659,0.05,26.597 +10000,0.12894,0.0012659,0.05,26.597 +10000,0.13164,0.0012924,0.05,23.791 +10000,0.13164,0.0012924,0.05,23.791 +10000,0.13164,0.0012924,0.05,23.791 +10000,0.1343,0.0013185,0.05,21.382 +10000,0.1343,0.0013185,0.05,21.382 +10000,0.13695,0.0013445,0.05,19.278 +10000,0.13695,0.0013445,0.05,19.278 +10000,0.13695,0.0013445,0.05,19.278 +10000,0.13965,0.001371,0.05,17.394 +10000,0.13965,0.001371,0.05,17.394 +10000,0.13965,0.001371,0.05,17.394 +10000,0.1424,0.0013981,0.05,15.705 +10000,0.1424,0.0013981,0.05,15.705 +10000,0.14521,0.0014256,0.05,14.189 +10000,0.14521,0.0014256,0.05,14.189 +10000,0.14521,0.0014256,0.05,14.189 +10000,0.14807,0.0014538,0.05,12.828 +10000,0.14807,0.0014538,0.05,12.828 +10000,0.14807,0.0014538,0.05,12.828 +10000,0.151,0.0014824,0.05,11.603 +10000,0.151,0.0014824,0.05,11.603 +10000,0.151,0.0014824,0.05,11.603 +10000,0.15397,0.0015117,0.05,10.501 +10000,0.15397,0.0015117,0.05,10.501 +10000,0.15397,0.0015117,0.05,10.501 +10000,0.15701,0.0015415,0.05,9.5061 +10000,0.15701,0.0015415,0.05,9.5061 +10000,0.15701,0.0015415,0.05,9.5061 +10000,0.16011,0.0015719,0.05,8.6085 +10000,0.16011,0.0015719,0.05,8.6085 +10000,0.16011,0.0015719,0.05,8.6085 +10000,0.16327,0.001603,0.05,7.7972 +10000,0.16327,0.001603,0.05,7.7972 +10000,0.16327,0.001603,0.05,7.7972 +10000,0.16649,0.0016346,0.05,7.0632 +10000,0.16649,0.0016346,0.05,7.0632 +10000,0.16649,0.0016346,0.05,7.0632 +10000,0.16649,0.0016346,0.05,7.0632 +10000,0.16978,0.0016669,0.05,6.3983 +10000,0.16978,0.0016669,0.05,6.3983 +10000,0.16978,0.0016669,0.05,6.3983 +10000,0.17313,0.0016998,0.05,5.7955 +10000,0.17313,0.0016998,0.05,5.7955 +10000,0.17313,0.0016998,0.05,5.7955 +10000,0.17655,0.0017333,0.05,5.2484 +10000,0.17655,0.0017333,0.05,5.2484 +10000,0.17655,0.0017333,0.05,5.2484 +10000,0.17655,0.0017333,0.05,5.2484 +10000,0.18004,0.0017676,0.05,4.7516 +10000,0.18004,0.0017676,0.05,4.7516 +10000,0.18004,0.0017676,0.05,4.7516 +10000,0.18359,0.0018025,0.05,4.3001 +10000,0.18359,0.0018025,0.05,4.3001 +10000,0.18359,0.0018025,0.05,4.3001 +10000,0.18359,0.0018025,0.05,4.3001 +10000,0.18722,0.001838,0.05,3.8894 +10000,0.18722,0.001838,0.05,3.8894 +10000,0.18722,0.001838,0.05,3.8894 +10000,0.18722,0.001838,0.05,3.8894 +10000,0.19091,0.0018743,0.05,3.5157 +10000,0.19091,0.0018743,0.05,3.5157 +10000,0.19091,0.0018743,0.05,3.5157 +10000,0.19468,0.0019114,0.05,3.1756 +10000,0.19468,0.0019114,0.05,3.1756 +10000,0.19468,0.0019114,0.05,3.1756 +10000,0.19468,0.0019114,0.05,3.1756 +10000,0.19853,0.0019491,0.05,2.8658 +10000,0.19853,0.0019491,0.05,2.8658 +10000,0.19853,0.0019491,0.05,2.8658 +10000,0.19853,0.0019491,0.05,2.8658 +10000,0.20245,0.0019876,0.05,2.5837 +10000,0.20245,0.0019876,0.05,2.5837 +10000,0.20245,0.0019876,0.05,2.5837 +10000,0.20245,0.0019876,0.05,2.5837 +10000,0.20645,0.0020269,0.05,2.3268 +10000,0.20645,0.0020269,0.05,2.3268 +10000,0.20645,0.0020269,0.05,2.3268 +10000,0.20645,0.0020269,0.05,2.3268 +10000,0.21053,0.0020669,0.05,2.0928 +10000,0.21053,0.0020669,0.05,2.0928 +10000,0.21053,0.0020669,0.05,2.0928 +10000,0.21053,0.0020669,0.05,2.0928 +10000,0.21469,0.0021078,0.05,1.8798 +10000,0.21469,0.0021078,0.05,1.8798 +10000,0.21469,0.0021078,0.05,1.8798 +10000,0.21469,0.0021078,0.05,1.8798 +10000,0.21893,0.0021494,0.05,1.6859 +10000,0.21893,0.0021494,0.05,1.6859 +10000,0.21893,0.0021494,0.05,1.6859 +10000,0.21893,0.0021494,0.05,1.6859 +10000,0.21893,0.0021494,0.05,1.6859 +10000,0.22326,0.0021919,0.05,1.5095 +10000,0.22326,0.0021919,0.05,1.5095 +10000,0.22326,0.0021919,0.05,1.5095 +10000,0.22326,0.0021919,0.05,1.5095 +10000,0.22767,0.0022352,0.05,1.3492 +10000,0.22767,0.0022352,0.05,1.3492 +10000,0.22767,0.0022352,0.05,1.3492 +10000,0.22767,0.0022352,0.05,1.3492 +10000,0.23217,0.0022794,0.05,1.2036 +10000,0.23217,0.0022794,0.05,1.2036 +10000,0.23217,0.0022794,0.05,1.2036 +10000,0.23217,0.0022794,0.05,1.2036 +10000,0.23217,0.0022794,0.05,1.2036 +10000,0.23676,0.0023244,0.05,1.0714 +10000,0.23676,0.0023244,0.05,1.0714 +10000,0.23676,0.0023244,0.05,1.0714 +10000,0.23676,0.0023244,0.05,1.0714 +10000,0.23676,0.0023244,0.05,1.0714 +10000,0.24144,0.0023704,0.05,0.95166 +10000,0.24144,0.0023704,0.05,0.95166 +10000,0.24144,0.0023704,0.05,0.95166 +10000,0.24144,0.0023704,0.05,0.95166 +10000,0.24621,0.0024172,0.05,0.84329 +10000,0.24621,0.0024172,0.05,0.84329 +10000,0.24621,0.0024172,0.05,0.84329 +10000,0.24621,0.0024172,0.05,0.84329 +10000,0.24621,0.0024172,0.05,0.84329 +10000,0.25108,0.002465,0.05,0.74536 +10000,0.25108,0.002465,0.05,0.74536 +10000,0.25108,0.002465,0.05,0.74536 +10000,0.25108,0.002465,0.05,0.74536 +10000,0.25108,0.002465,0.05,0.74536 +10000,0.25604,0.0025137,0.05,0.65703 +10000,0.25604,0.0025137,0.05,0.65703 +10000,0.25604,0.0025137,0.05,0.65703 +10000,0.25604,0.0025137,0.05,0.65703 +10000,0.25604,0.0025137,0.05,0.65703 +10000,0.2611,0.0025634,0.05,0.57751 +10000,0.2611,0.0025634,0.05,0.57751 +10000,0.2611,0.0025634,0.05,0.57751 +10000,0.2611,0.0025634,0.05,0.57751 +10000,0.2611,0.0025634,0.05,0.57751 +10000,0.26626,0.0026141,0.05,0.50608 +10000,0.26626,0.0026141,0.05,0.50608 +10000,0.26626,0.0026141,0.05,0.50608 +10000,0.26626,0.0026141,0.05,0.50608 +10000,0.26626,0.0026141,0.05,0.50608 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.27153,0.0026658,0.05,0.44207 +10000,0.2769,0.0027185,0.05,0.38486 +10000,0.2769,0.0027185,0.05,0.38486 +10000,0.2769,0.0027185,0.05,0.38486 +10000,0.2769,0.0027185,0.05,0.38486 +10000,0.2769,0.0027185,0.05,0.38486 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28237,0.0027723,0.05,0.33387 +10000,0.28796,0.0028271,0.05,0.28855 +10000,0.28796,0.0028271,0.05,0.28855 +10000,0.28796,0.0028271,0.05,0.28855 +10000,0.28796,0.0028271,0.05,0.28855 +10000,0.28796,0.0028271,0.05,0.28855 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29365,0.002883,0.05,0.24842 +10000,0.29946,0.00294,0.05,0.213 +10000,0.29946,0.00294,0.05,0.213 +10000,0.29946,0.00294,0.05,0.213 +10000,0.29946,0.00294,0.05,0.213 +10000,0.29946,0.00294,0.05,0.213 +10000,0.29946,0.00294,0.05,0.213 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.30538,0.0029982,0.05,0.18186 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31142,0.0030575,0.05,0.15458 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.31758,0.003118,0.05,0.13079 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.32386,0.0031796,0.05,0.11012 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.33027,0.0032425,0.05,0.092267 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.3368,0.0033067,0.05,0.076906 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.34347,0.0033721,0.05,0.06376 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35026,0.0034388,0.05,0.05257 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.35719,0.0035069,0.05,0.043097 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.36426,0.0035762,0.05,0.035123 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37147,0.003647,0.05,0.028451 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.37882,0.0037192,0.05,0.022902 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.38632,0.0037928,0.05,0.018318 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.39396,0.0038678,0.05,0.014554 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40176,0.0039444,0.05,0.011486 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.40971,0.0040224,0.05,0.009001 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.41782,0.004102,0.05,0.0070035 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.42609,0.0041832,0.05,0.0054095 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.43452,0.004266,0.05,0.004147 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.44312,0.0043505,0.05,0.0031547 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.45189,0.0044366,0.05,0.0023811 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46084,0.0045244,0.05,0.0017827 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.46996,0.004614,0.05,0.0013237 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.47926,0.0047053,0.05,0.00097467 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.48875,0.0047985,0.05,0.00071149 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.49843,0.0048935,0.05,0.00051482 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.5083,0.0049903,0.05,0.00036917 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.51836,0.0050891,0.05,0.00026231 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.52862,0.0051899,0.05,0.00018463 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.53909,0.0052927,0.05,0.00012872 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.54976,0.0053975,0.05,8.8861e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.56065,0.0055043,0.05,6.0736e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.57175,0.0056133,0.05,4.1091e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.58307,0.0057245,0.05,2.7512e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.59462,0.0058378,0.05,1.8226e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.60639,0.0059535,0.05,1.1944e-05 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.6184,0.0060714,0.05,7.7407e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.63065,0.0061916,0.05,4.9605e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.64314,0.0063142,0.05,3.1424e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.65588,0.0064393,0.05,1.9674e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.66887,0.0065668,0.05,1.2171e-06 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.68211,0.0066969,0.05,7.4374e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.69562,0.0068295,0.05,4.4882e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.7094,0.0069648,0.05,2.6739e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.72345,0.0071027,0.05,1.5721e-07 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.73778,0.0072434,0.05,9.117e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7524,0.0073869,0.05,5.2122e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7673,0.0075332,0.05,2.935e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.7825,0.0076824,0.05,1.6256e-08 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.798,0.0078346,0.05,8.8364e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.81381,0.0079898,0.05,4.6971e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.82993,0.0081481,0.05,2.4256e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.84637,0.0083095,0.05,1.2022e-09 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.86314,0.0084741,0.05,5.5787e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.88024,0.008642,0.05,2.2863e-10 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.89767,0.0088132,0.05,6.8108e-11 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.91546,0.0089878,0.05,-3.5322e-12 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.93359,0.0091658,0.05,-2.9158e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.95209,0.0093474,0.05,-3.1439e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.97095,0.0095326,0.05,-2.2242e-11 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 +10000,0.99019,0.0097215,0.05,-7.8581e-12 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_10.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_10.csv new file mode 100644 index 00000000000..6bd17f57f37 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_10.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,0.10099,0.0009915,0.05,98.477 +1e+05,0.10099,0.0009915,0.05,98.477 +1e+05,0.10099,0.0009915,0.05,98.477 +1e+05,0.10299,0.0010111,0.05,95.492 +1e+05,0.10299,0.0010111,0.05,95.492 +1e+05,0.10499,0.0010308,0.05,92.573 +1e+05,0.10499,0.0010308,0.05,92.573 +1e+05,0.10734,0.0010538,0.05,89.221 +1e+05,0.10734,0.0010538,0.05,89.221 +1e+05,0.11004,0.0010803,0.05,85.495 +1e+05,0.11004,0.0010803,0.05,85.495 +1e+05,0.11004,0.0010803,0.05,85.495 +1e+05,0.11274,0.0011068,0.05,81.898 +1e+05,0.11274,0.0011068,0.05,81.898 +1e+05,0.11274,0.0011068,0.05,81.898 +1e+05,0.11544,0.0011334,0.05,78.431 +1e+05,0.11544,0.0011334,0.05,78.431 +1e+05,0.11814,0.0011599,0.05,75.096 +1e+05,0.11814,0.0011599,0.05,75.096 +1e+05,0.11814,0.0011599,0.05,75.096 +1e+05,0.12084,0.0011864,0.05,71.891 +1e+05,0.12084,0.0011864,0.05,71.891 +1e+05,0.12084,0.0011864,0.05,71.891 +1e+05,0.12354,0.0012129,0.05,68.816 +1e+05,0.12354,0.0012129,0.05,68.816 +1e+05,0.12624,0.0012394,0.05,65.869 +1e+05,0.12624,0.0012394,0.05,65.869 +1e+05,0.12624,0.0012394,0.05,65.869 +1e+05,0.12894,0.0012659,0.05,63.049 +1e+05,0.12894,0.0012659,0.05,63.049 +1e+05,0.12894,0.0012659,0.05,63.049 +1e+05,0.13164,0.0012924,0.05,60.352 +1e+05,0.13164,0.0012924,0.05,60.352 +1e+05,0.13164,0.0012924,0.05,60.352 +1e+05,0.1343,0.0013185,0.05,57.811 +1e+05,0.1343,0.0013185,0.05,57.811 +1e+05,0.13695,0.0013445,0.05,55.394 +1e+05,0.13695,0.0013445,0.05,55.394 +1e+05,0.13695,0.0013445,0.05,55.394 +1e+05,0.13965,0.001371,0.05,53.041 +1e+05,0.13965,0.001371,0.05,53.041 +1e+05,0.13965,0.001371,0.05,53.041 +1e+05,0.1424,0.0013981,0.05,50.753 +1e+05,0.1424,0.0013981,0.05,50.753 +1e+05,0.14521,0.0014256,0.05,48.531 +1e+05,0.14521,0.0014256,0.05,48.531 +1e+05,0.14521,0.0014256,0.05,48.531 +1e+05,0.14807,0.0014538,0.05,46.377 +1e+05,0.14807,0.0014538,0.05,46.377 +1e+05,0.14807,0.0014538,0.05,46.377 +1e+05,0.151,0.0014824,0.05,44.292 +1e+05,0.151,0.0014824,0.05,44.292 +1e+05,0.151,0.0014824,0.05,44.292 +1e+05,0.15397,0.0015117,0.05,42.275 +1e+05,0.15397,0.0015117,0.05,42.275 +1e+05,0.15397,0.0015117,0.05,42.275 +1e+05,0.15701,0.0015415,0.05,40.326 +1e+05,0.15701,0.0015415,0.05,40.326 +1e+05,0.15701,0.0015415,0.05,40.326 +1e+05,0.16011,0.0015719,0.05,38.446 +1e+05,0.16011,0.0015719,0.05,38.446 +1e+05,0.16011,0.0015719,0.05,38.446 +1e+05,0.16327,0.001603,0.05,36.635 +1e+05,0.16327,0.001603,0.05,36.635 +1e+05,0.16327,0.001603,0.05,36.635 +1e+05,0.16649,0.0016346,0.05,34.89 +1e+05,0.16649,0.0016346,0.05,34.89 +1e+05,0.16649,0.0016346,0.05,34.89 +1e+05,0.16649,0.0016346,0.05,34.89 +1e+05,0.16978,0.0016669,0.05,33.212 +1e+05,0.16978,0.0016669,0.05,33.212 +1e+05,0.16978,0.0016669,0.05,33.212 +1e+05,0.17313,0.0016998,0.05,31.6 +1e+05,0.17313,0.0016998,0.05,31.6 +1e+05,0.17313,0.0016998,0.05,31.6 +1e+05,0.17655,0.0017333,0.05,30.052 +1e+05,0.17655,0.0017333,0.05,30.052 +1e+05,0.17655,0.0017333,0.05,30.052 +1e+05,0.17655,0.0017333,0.05,30.052 +1e+05,0.18004,0.0017676,0.05,28.568 +1e+05,0.18004,0.0017676,0.05,28.568 +1e+05,0.18004,0.0017676,0.05,28.568 +1e+05,0.18359,0.0018025,0.05,27.145 +1e+05,0.18359,0.0018025,0.05,27.145 +1e+05,0.18359,0.0018025,0.05,27.145 +1e+05,0.18359,0.0018025,0.05,27.145 +1e+05,0.18722,0.001838,0.05,25.782 +1e+05,0.18722,0.001838,0.05,25.782 +1e+05,0.18722,0.001838,0.05,25.782 +1e+05,0.18722,0.001838,0.05,25.782 +1e+05,0.19091,0.0018743,0.05,24.477 +1e+05,0.19091,0.0018743,0.05,24.477 +1e+05,0.19091,0.0018743,0.05,24.477 +1e+05,0.19468,0.0019114,0.05,23.23 +1e+05,0.19468,0.0019114,0.05,23.23 +1e+05,0.19468,0.0019114,0.05,23.23 +1e+05,0.19468,0.0019114,0.05,23.23 +1e+05,0.19853,0.0019491,0.05,22.037 +1e+05,0.19853,0.0019491,0.05,22.037 +1e+05,0.19853,0.0019491,0.05,22.037 +1e+05,0.19853,0.0019491,0.05,22.037 +1e+05,0.20245,0.0019876,0.05,20.898 +1e+05,0.20245,0.0019876,0.05,20.898 +1e+05,0.20245,0.0019876,0.05,20.898 +1e+05,0.20245,0.0019876,0.05,20.898 +1e+05,0.20645,0.0020269,0.05,19.811 +1e+05,0.20645,0.0020269,0.05,19.811 +1e+05,0.20645,0.0020269,0.05,19.811 +1e+05,0.20645,0.0020269,0.05,19.811 +1e+05,0.21053,0.0020669,0.05,18.773 +1e+05,0.21053,0.0020669,0.05,18.773 +1e+05,0.21053,0.0020669,0.05,18.773 +1e+05,0.21053,0.0020669,0.05,18.773 +1e+05,0.21469,0.0021078,0.05,17.784 +1e+05,0.21469,0.0021078,0.05,17.784 +1e+05,0.21469,0.0021078,0.05,17.784 +1e+05,0.21469,0.0021078,0.05,17.784 +1e+05,0.21893,0.0021494,0.05,16.84 +1e+05,0.21893,0.0021494,0.05,16.84 +1e+05,0.21893,0.0021494,0.05,16.84 +1e+05,0.21893,0.0021494,0.05,16.84 +1e+05,0.21893,0.0021494,0.05,16.84 +1e+05,0.22326,0.0021919,0.05,15.941 +1e+05,0.22326,0.0021919,0.05,15.941 +1e+05,0.22326,0.0021919,0.05,15.941 +1e+05,0.22326,0.0021919,0.05,15.941 +1e+05,0.22767,0.0022352,0.05,15.085 +1e+05,0.22767,0.0022352,0.05,15.085 +1e+05,0.22767,0.0022352,0.05,15.085 +1e+05,0.22767,0.0022352,0.05,15.085 +1e+05,0.23217,0.0022794,0.05,14.27 +1e+05,0.23217,0.0022794,0.05,14.27 +1e+05,0.23217,0.0022794,0.05,14.27 +1e+05,0.23217,0.0022794,0.05,14.27 +1e+05,0.23217,0.0022794,0.05,14.27 +1e+05,0.23676,0.0023244,0.05,13.494 +1e+05,0.23676,0.0023244,0.05,13.494 +1e+05,0.23676,0.0023244,0.05,13.494 +1e+05,0.23676,0.0023244,0.05,13.494 +1e+05,0.23676,0.0023244,0.05,13.494 +1e+05,0.24144,0.0023704,0.05,12.756 +1e+05,0.24144,0.0023704,0.05,12.756 +1e+05,0.24144,0.0023704,0.05,12.756 +1e+05,0.24144,0.0023704,0.05,12.756 +1e+05,0.24621,0.0024172,0.05,12.054 +1e+05,0.24621,0.0024172,0.05,12.054 +1e+05,0.24621,0.0024172,0.05,12.054 +1e+05,0.24621,0.0024172,0.05,12.054 +1e+05,0.24621,0.0024172,0.05,12.054 +1e+05,0.25108,0.002465,0.05,11.386 +1e+05,0.25108,0.002465,0.05,11.386 +1e+05,0.25108,0.002465,0.05,11.386 +1e+05,0.25108,0.002465,0.05,11.386 +1e+05,0.25108,0.002465,0.05,11.386 +1e+05,0.25604,0.0025137,0.05,10.752 +1e+05,0.25604,0.0025137,0.05,10.752 +1e+05,0.25604,0.0025137,0.05,10.752 +1e+05,0.25604,0.0025137,0.05,10.752 +1e+05,0.25604,0.0025137,0.05,10.752 +1e+05,0.2611,0.0025634,0.05,10.148 +1e+05,0.2611,0.0025634,0.05,10.148 +1e+05,0.2611,0.0025634,0.05,10.148 +1e+05,0.2611,0.0025634,0.05,10.148 +1e+05,0.2611,0.0025634,0.05,10.148 +1e+05,0.26626,0.0026141,0.05,9.5755 +1e+05,0.26626,0.0026141,0.05,9.5755 +1e+05,0.26626,0.0026141,0.05,9.5755 +1e+05,0.26626,0.0026141,0.05,9.5755 +1e+05,0.26626,0.0026141,0.05,9.5755 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.27153,0.0026658,0.05,9.0312 +1e+05,0.2769,0.0027185,0.05,8.5143 +1e+05,0.2769,0.0027185,0.05,8.5143 +1e+05,0.2769,0.0027185,0.05,8.5143 +1e+05,0.2769,0.0027185,0.05,8.5143 +1e+05,0.2769,0.0027185,0.05,8.5143 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28237,0.0027723,0.05,8.0236 +1e+05,0.28796,0.0028271,0.05,7.5579 +1e+05,0.28796,0.0028271,0.05,7.5579 +1e+05,0.28796,0.0028271,0.05,7.5579 +1e+05,0.28796,0.0028271,0.05,7.5579 +1e+05,0.28796,0.0028271,0.05,7.5579 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29365,0.002883,0.05,7.1159 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.29946,0.00294,0.05,6.6965 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.30538,0.0029982,0.05,6.2987 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31142,0.0030575,0.05,5.9215 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.31758,0.003118,0.05,5.5639 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.32386,0.0031796,0.05,5.2249 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.33027,0.0032425,0.05,4.9037 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.3368,0.0033067,0.05,4.5994 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.34347,0.0033721,0.05,4.3111 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35026,0.0034388,0.05,4.0382 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.35719,0.0035069,0.05,3.7798 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.36426,0.0035762,0.05,3.5354 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37147,0.003647,0.05,3.3041 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.37882,0.0037192,0.05,3.0854 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.38632,0.0037928,0.05,2.8787 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.39396,0.0038678,0.05,2.6834 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40176,0.0039444,0.05,2.499 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.40971,0.0040224,0.05,2.3249 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.41782,0.004102,0.05,2.1607 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.42609,0.0041832,0.05,2.0058 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.43452,0.004266,0.05,1.8599 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.44312,0.0043505,0.05,1.7224 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.45189,0.0044366,0.05,1.5931 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46084,0.0045244,0.05,1.4715 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.46996,0.004614,0.05,1.3573 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.47926,0.0047053,0.05,1.25 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.48875,0.0047985,0.05,1.1495 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.49843,0.0048935,0.05,1.0552 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.5083,0.0049903,0.05,0.96708 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.51836,0.0050891,0.05,0.88468 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.52862,0.0051899,0.05,0.80776 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.53909,0.0052927,0.05,0.73605 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.54976,0.0053975,0.05,0.66931 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.56065,0.0055043,0.05,0.60728 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.57175,0.0056133,0.05,0.54972 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.58307,0.0057245,0.05,0.49642 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.59462,0.0058378,0.05,0.44715 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.60639,0.0059535,0.05,0.40169 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.6184,0.0060714,0.05,0.35985 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.63065,0.0061916,0.05,0.32142 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.64314,0.0063142,0.05,0.28621 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.65588,0.0064393,0.05,0.25404 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.66887,0.0065668,0.05,0.22472 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.68211,0.0066969,0.05,0.19808 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.69562,0.0068295,0.05,0.17395 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.7094,0.0069648,0.05,0.15216 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.72345,0.0071027,0.05,0.13255 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.73778,0.0072434,0.05,0.11496 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7524,0.0073869,0.05,0.099241 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7673,0.0075332,0.05,0.085248 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.7825,0.0076824,0.05,0.072837 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.798,0.0078346,0.05,0.06187 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.81381,0.0079898,0.05,0.052214 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.82993,0.0081481,0.05,0.043741 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.84637,0.0083095,0.05,0.036326 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.86314,0.0084741,0.05,0.029851 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.88024,0.008642,0.05,0.024199 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.89767,0.0088132,0.05,0.019259 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.91546,0.0089878,0.05,0.014921 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.93359,0.0091658,0.05,0.011078 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.95209,0.0093474,0.05,0.0076246 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.97095,0.0095326,0.05,0.0044533 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 +1e+05,0.99019,0.0097215,0.05,0.0014552 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_2.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_2.csv new file mode 100644 index 00000000000..245f1b2f8cf --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_2.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,0.10099,0.0009915,0.05,96.996 +20000,0.10099,0.0009915,0.05,96.996 +20000,0.10099,0.0009915,0.05,96.996 +20000,0.10299,0.0010111,0.05,91.135 +20000,0.10299,0.0010111,0.05,91.135 +20000,0.10499,0.0010308,0.05,85.471 +20000,0.10499,0.0010308,0.05,85.471 +20000,0.10734,0.0010538,0.05,79.09 +20000,0.10734,0.0010538,0.05,79.09 +20000,0.11004,0.0010803,0.05,72.24 +20000,0.11004,0.0010803,0.05,72.24 +20000,0.11004,0.0010803,0.05,72.24 +20000,0.11274,0.0011068,0.05,65.904 +20000,0.11274,0.0011068,0.05,65.904 +20000,0.11274,0.0011068,0.05,65.904 +20000,0.11544,0.0011334,0.05,60.092 +20000,0.11544,0.0011334,0.05,60.092 +20000,0.11814,0.0011599,0.05,54.792 +20000,0.11814,0.0011599,0.05,54.792 +20000,0.11814,0.0011599,0.05,54.792 +20000,0.12084,0.0011864,0.05,49.98 +20000,0.12084,0.0011864,0.05,49.98 +20000,0.12084,0.0011864,0.05,49.98 +20000,0.12354,0.0012129,0.05,45.627 +20000,0.12354,0.0012129,0.05,45.627 +20000,0.12624,0.0012394,0.05,41.695 +20000,0.12624,0.0012394,0.05,41.695 +20000,0.12624,0.0012394,0.05,41.695 +20000,0.12894,0.0012659,0.05,38.149 +20000,0.12894,0.0012659,0.05,38.149 +20000,0.12894,0.0012659,0.05,38.149 +20000,0.13164,0.0012924,0.05,34.952 +20000,0.13164,0.0012924,0.05,34.952 +20000,0.13164,0.0012924,0.05,34.952 +20000,0.1343,0.0013185,0.05,32.111 +20000,0.1343,0.0013185,0.05,32.111 +20000,0.13695,0.0013445,0.05,29.553 +20000,0.13695,0.0013445,0.05,29.553 +20000,0.13695,0.0013445,0.05,29.553 +20000,0.13965,0.001371,0.05,27.195 +20000,0.13965,0.001371,0.05,27.195 +20000,0.13965,0.001371,0.05,27.195 +20000,0.1424,0.0013981,0.05,25.024 +20000,0.1424,0.0013981,0.05,25.024 +20000,0.14521,0.0014256,0.05,23.026 +20000,0.14521,0.0014256,0.05,23.026 +20000,0.14521,0.0014256,0.05,23.026 +20000,0.14807,0.0014538,0.05,21.188 +20000,0.14807,0.0014538,0.05,21.188 +20000,0.14807,0.0014538,0.05,21.188 +20000,0.151,0.0014824,0.05,19.498 +20000,0.151,0.0014824,0.05,19.498 +20000,0.151,0.0014824,0.05,19.498 +20000,0.15397,0.0015117,0.05,17.943 +20000,0.15397,0.0015117,0.05,17.943 +20000,0.15397,0.0015117,0.05,17.943 +20000,0.15701,0.0015415,0.05,16.514 +20000,0.15701,0.0015415,0.05,16.514 +20000,0.15701,0.0015415,0.05,16.514 +20000,0.16011,0.0015719,0.05,15.2 +20000,0.16011,0.0015719,0.05,15.2 +20000,0.16011,0.0015719,0.05,15.2 +20000,0.16327,0.001603,0.05,13.991 +20000,0.16327,0.001603,0.05,13.991 +20000,0.16327,0.001603,0.05,13.991 +20000,0.16649,0.0016346,0.05,12.878 +20000,0.16649,0.0016346,0.05,12.878 +20000,0.16649,0.0016346,0.05,12.878 +20000,0.16649,0.0016346,0.05,12.878 +20000,0.16978,0.0016669,0.05,11.855 +20000,0.16978,0.0016669,0.05,11.855 +20000,0.16978,0.0016669,0.05,11.855 +20000,0.17313,0.0016998,0.05,10.912 +20000,0.17313,0.0016998,0.05,10.912 +20000,0.17313,0.0016998,0.05,10.912 +20000,0.17655,0.0017333,0.05,10.044 +20000,0.17655,0.0017333,0.05,10.044 +20000,0.17655,0.0017333,0.05,10.044 +20000,0.17655,0.0017333,0.05,10.044 +20000,0.18004,0.0017676,0.05,9.2442 +20000,0.18004,0.0017676,0.05,9.2442 +20000,0.18004,0.0017676,0.05,9.2442 +20000,0.18359,0.0018025,0.05,8.507 +20000,0.18359,0.0018025,0.05,8.507 +20000,0.18359,0.0018025,0.05,8.507 +20000,0.18359,0.0018025,0.05,8.507 +20000,0.18722,0.001838,0.05,7.8273 +20000,0.18722,0.001838,0.05,7.8273 +20000,0.18722,0.001838,0.05,7.8273 +20000,0.18722,0.001838,0.05,7.8273 +20000,0.19091,0.0018743,0.05,7.2003 +20000,0.19091,0.0018743,0.05,7.2003 +20000,0.19091,0.0018743,0.05,7.2003 +20000,0.19468,0.0019114,0.05,6.6217 +20000,0.19468,0.0019114,0.05,6.6217 +20000,0.19468,0.0019114,0.05,6.6217 +20000,0.19468,0.0019114,0.05,6.6217 +20000,0.19853,0.0019491,0.05,6.0877 +20000,0.19853,0.0019491,0.05,6.0877 +20000,0.19853,0.0019491,0.05,6.0877 +20000,0.19853,0.0019491,0.05,6.0877 +20000,0.20245,0.0019876,0.05,5.5945 +20000,0.20245,0.0019876,0.05,5.5945 +20000,0.20245,0.0019876,0.05,5.5945 +20000,0.20245,0.0019876,0.05,5.5945 +20000,0.20645,0.0020269,0.05,5.139 +20000,0.20645,0.0020269,0.05,5.139 +20000,0.20645,0.0020269,0.05,5.139 +20000,0.20645,0.0020269,0.05,5.139 +20000,0.21053,0.0020669,0.05,4.7182 +20000,0.21053,0.0020669,0.05,4.7182 +20000,0.21053,0.0020669,0.05,4.7182 +20000,0.21053,0.0020669,0.05,4.7182 +20000,0.21469,0.0021078,0.05,4.3294 +20000,0.21469,0.0021078,0.05,4.3294 +20000,0.21469,0.0021078,0.05,4.3294 +20000,0.21469,0.0021078,0.05,4.3294 +20000,0.21893,0.0021494,0.05,3.97 +20000,0.21893,0.0021494,0.05,3.97 +20000,0.21893,0.0021494,0.05,3.97 +20000,0.21893,0.0021494,0.05,3.97 +20000,0.21893,0.0021494,0.05,3.97 +20000,0.22326,0.0021919,0.05,3.6379 +20000,0.22326,0.0021919,0.05,3.6379 +20000,0.22326,0.0021919,0.05,3.6379 +20000,0.22326,0.0021919,0.05,3.6379 +20000,0.22767,0.0022352,0.05,3.3309 +20000,0.22767,0.0022352,0.05,3.3309 +20000,0.22767,0.0022352,0.05,3.3309 +20000,0.22767,0.0022352,0.05,3.3309 +20000,0.23217,0.0022794,0.05,3.0471 +20000,0.23217,0.0022794,0.05,3.0471 +20000,0.23217,0.0022794,0.05,3.0471 +20000,0.23217,0.0022794,0.05,3.0471 +20000,0.23217,0.0022794,0.05,3.0471 +20000,0.23676,0.0023244,0.05,2.7849 +20000,0.23676,0.0023244,0.05,2.7849 +20000,0.23676,0.0023244,0.05,2.7849 +20000,0.23676,0.0023244,0.05,2.7849 +20000,0.23676,0.0023244,0.05,2.7849 +20000,0.24144,0.0023704,0.05,2.5425 +20000,0.24144,0.0023704,0.05,2.5425 +20000,0.24144,0.0023704,0.05,2.5425 +20000,0.24144,0.0023704,0.05,2.5425 +20000,0.24621,0.0024172,0.05,2.3187 +20000,0.24621,0.0024172,0.05,2.3187 +20000,0.24621,0.0024172,0.05,2.3187 +20000,0.24621,0.0024172,0.05,2.3187 +20000,0.24621,0.0024172,0.05,2.3187 +20000,0.25108,0.002465,0.05,2.112 +20000,0.25108,0.002465,0.05,2.112 +20000,0.25108,0.002465,0.05,2.112 +20000,0.25108,0.002465,0.05,2.112 +20000,0.25108,0.002465,0.05,2.112 +20000,0.25604,0.0025137,0.05,1.9211 +20000,0.25604,0.0025137,0.05,1.9211 +20000,0.25604,0.0025137,0.05,1.9211 +20000,0.25604,0.0025137,0.05,1.9211 +20000,0.25604,0.0025137,0.05,1.9211 +20000,0.2611,0.0025634,0.05,1.7451 +20000,0.2611,0.0025634,0.05,1.7451 +20000,0.2611,0.0025634,0.05,1.7451 +20000,0.2611,0.0025634,0.05,1.7451 +20000,0.2611,0.0025634,0.05,1.7451 +20000,0.26626,0.0026141,0.05,1.5827 +20000,0.26626,0.0026141,0.05,1.5827 +20000,0.26626,0.0026141,0.05,1.5827 +20000,0.26626,0.0026141,0.05,1.5827 +20000,0.26626,0.0026141,0.05,1.5827 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.27153,0.0026658,0.05,1.4332 +20000,0.2769,0.0027185,0.05,1.2955 +20000,0.2769,0.0027185,0.05,1.2955 +20000,0.2769,0.0027185,0.05,1.2955 +20000,0.2769,0.0027185,0.05,1.2955 +20000,0.2769,0.0027185,0.05,1.2955 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28237,0.0027723,0.05,1.1688 +20000,0.28796,0.0028271,0.05,1.0525 +20000,0.28796,0.0028271,0.05,1.0525 +20000,0.28796,0.0028271,0.05,1.0525 +20000,0.28796,0.0028271,0.05,1.0525 +20000,0.28796,0.0028271,0.05,1.0525 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29365,0.002883,0.05,0.94576 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.29946,0.00294,0.05,0.84795 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.30538,0.0029982,0.05,0.75847 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31142,0.0030575,0.05,0.67673 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.31758,0.003118,0.05,0.60221 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.32386,0.0031796,0.05,0.5344 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.33027,0.0032425,0.05,0.47284 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.3368,0.0033067,0.05,0.41707 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.34347,0.0033721,0.05,0.36668 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35026,0.0034388,0.05,0.32128 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.35719,0.0035069,0.05,0.28049 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.36426,0.0035762,0.05,0.24395 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37147,0.003647,0.05,0.21134 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.37882,0.0037192,0.05,0.18234 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.38632,0.0037928,0.05,0.15663 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.39396,0.0038678,0.05,0.13395 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40176,0.0039444,0.05,0.11401 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.40971,0.0040224,0.05,0.096567 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.41782,0.004102,0.05,0.081376 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.42609,0.0041832,0.05,0.068212 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.43452,0.004266,0.05,0.056864 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.44312,0.0043505,0.05,0.047133 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.45189,0.0044366,0.05,0.038837 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46084,0.0045244,0.05,0.031805 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.46996,0.004614,0.05,0.025882 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.47926,0.0047053,0.05,0.020924 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.48875,0.0047985,0.05,0.016801 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.49843,0.0048935,0.05,0.013396 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.5083,0.0049903,0.05,0.010605 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.51836,0.0050891,0.05,0.0083322 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.52862,0.0051899,0.05,0.0064967 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.53909,0.0052927,0.05,0.0050256 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.54976,0.0053975,0.05,0.0038561 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.56065,0.0055043,0.05,0.002934 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.57175,0.0056133,0.05,0.0022133 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.58307,0.0057245,0.05,0.0016549 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.59462,0.0058378,0.05,0.0012262 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.60639,0.0059535,0.05,0.00090008 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.6184,0.0060714,0.05,0.0006544 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.63065,0.0061916,0.05,0.00047112 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.64314,0.0063142,0.05,0.00033577 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.65588,0.0064393,0.05,0.00023684 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.66887,0.0065668,0.05,0.00016529 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.68211,0.0066969,0.05,0.00011412 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.69562,0.0068295,0.05,7.791e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.7094,0.0069648,0.05,5.2588e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.72345,0.0071027,0.05,3.5084e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.73778,0.0072434,0.05,2.3128e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7524,0.0073869,0.05,1.5061e-05 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7673,0.0075332,0.05,9.686e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.7825,0.0076824,0.05,6.1499e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.798,0.0078346,0.05,3.8539e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.81381,0.0079898,0.05,2.383e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.82993,0.0081481,0.05,1.4534e-06 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.84637,0.0083095,0.05,8.7409e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.86314,0.0084741,0.05,5.1819e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.88024,0.008642,0.05,3.0268e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.89767,0.0088132,0.05,1.7406e-07 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.91546,0.0089878,0.05,9.8385e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.93359,0.0091658,0.05,5.4389e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.95209,0.0093474,0.05,2.8923e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.97095,0.0095326,0.05,1.3863e-08 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 +20000,0.99019,0.0097215,0.05,4.0575e-09 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_5.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_5.csv new file mode 100644 index 00000000000..29117bbb056 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_5.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,0.10099,0.0009915,0.05,97.986 +50000,0.10099,0.0009915,0.05,97.986 +50000,0.10099,0.0009915,0.05,97.986 +50000,0.10299,0.0010111,0.05,94.045 +50000,0.10299,0.0010111,0.05,94.045 +50000,0.10499,0.0010308,0.05,90.2 +50000,0.10499,0.0010308,0.05,90.2 +50000,0.10734,0.0010538,0.05,85.805 +50000,0.10734,0.0010538,0.05,85.805 +50000,0.11004,0.0010803,0.05,80.963 +50000,0.11004,0.0010803,0.05,80.963 +50000,0.11004,0.0010803,0.05,80.963 +50000,0.11274,0.0011068,0.05,76.339 +50000,0.11274,0.0011068,0.05,76.339 +50000,0.11274,0.0011068,0.05,76.339 +50000,0.11544,0.0011334,0.05,71.941 +50000,0.11544,0.0011334,0.05,71.941 +50000,0.11814,0.0011599,0.05,67.771 +50000,0.11814,0.0011599,0.05,67.771 +50000,0.11814,0.0011599,0.05,67.771 +50000,0.12084,0.0011864,0.05,63.829 +50000,0.12084,0.0011864,0.05,63.829 +50000,0.12084,0.0011864,0.05,63.829 +50000,0.12354,0.0012129,0.05,60.112 +50000,0.12354,0.0012129,0.05,60.112 +50000,0.12624,0.0012394,0.05,56.614 +50000,0.12624,0.0012394,0.05,56.614 +50000,0.12624,0.0012394,0.05,56.614 +50000,0.12894,0.0012659,0.05,53.328 +50000,0.12894,0.0012659,0.05,53.328 +50000,0.12894,0.0012659,0.05,53.328 +50000,0.13164,0.0012924,0.05,50.245 +50000,0.13164,0.0012924,0.05,50.245 +50000,0.13164,0.0012924,0.05,50.245 +50000,0.1343,0.0013185,0.05,47.397 +50000,0.1343,0.0013185,0.05,47.397 +50000,0.13695,0.0013445,0.05,44.739 +50000,0.13695,0.0013445,0.05,44.739 +50000,0.13695,0.0013445,0.05,44.739 +50000,0.13965,0.001371,0.05,42.199 +50000,0.13965,0.001371,0.05,42.199 +50000,0.13965,0.001371,0.05,42.199 +50000,0.1424,0.0013981,0.05,39.778 +50000,0.1424,0.0013981,0.05,39.778 +50000,0.14521,0.0014256,0.05,37.474 +50000,0.14521,0.0014256,0.05,37.474 +50000,0.14521,0.0014256,0.05,37.474 +50000,0.14807,0.0014538,0.05,35.284 +50000,0.14807,0.0014538,0.05,35.284 +50000,0.14807,0.0014538,0.05,35.284 +50000,0.151,0.0014824,0.05,33.205 +50000,0.151,0.0014824,0.05,33.205 +50000,0.151,0.0014824,0.05,33.205 +50000,0.15397,0.0015117,0.05,31.233 +50000,0.15397,0.0015117,0.05,31.233 +50000,0.15397,0.0015117,0.05,31.233 +50000,0.15701,0.0015415,0.05,29.366 +50000,0.15701,0.0015415,0.05,29.366 +50000,0.15701,0.0015415,0.05,29.366 +50000,0.16011,0.0015719,0.05,27.6 +50000,0.16011,0.0015719,0.05,27.6 +50000,0.16011,0.0015719,0.05,27.6 +50000,0.16327,0.001603,0.05,25.93 +50000,0.16327,0.001603,0.05,25.93 +50000,0.16327,0.001603,0.05,25.93 +50000,0.16649,0.0016346,0.05,24.352 +50000,0.16649,0.0016346,0.05,24.352 +50000,0.16649,0.0016346,0.05,24.352 +50000,0.16649,0.0016346,0.05,24.352 +50000,0.16978,0.0016669,0.05,22.863 +50000,0.16978,0.0016669,0.05,22.863 +50000,0.16978,0.0016669,0.05,22.863 +50000,0.17313,0.0016998,0.05,21.459 +50000,0.17313,0.0016998,0.05,21.459 +50000,0.17313,0.0016998,0.05,21.459 +50000,0.17655,0.0017333,0.05,20.135 +50000,0.17655,0.0017333,0.05,20.135 +50000,0.17655,0.0017333,0.05,20.135 +50000,0.17655,0.0017333,0.05,20.135 +50000,0.18004,0.0017676,0.05,18.887 +50000,0.18004,0.0017676,0.05,18.887 +50000,0.18004,0.0017676,0.05,18.887 +50000,0.18359,0.0018025,0.05,17.712 +50000,0.18359,0.0018025,0.05,17.712 +50000,0.18359,0.0018025,0.05,17.712 +50000,0.18359,0.0018025,0.05,17.712 +50000,0.18722,0.001838,0.05,16.605 +50000,0.18722,0.001838,0.05,16.605 +50000,0.18722,0.001838,0.05,16.605 +50000,0.18722,0.001838,0.05,16.605 +50000,0.19091,0.0018743,0.05,15.564 +50000,0.19091,0.0018743,0.05,15.564 +50000,0.19091,0.0018743,0.05,15.564 +50000,0.19468,0.0019114,0.05,14.584 +50000,0.19468,0.0019114,0.05,14.584 +50000,0.19468,0.0019114,0.05,14.584 +50000,0.19468,0.0019114,0.05,14.584 +50000,0.19853,0.0019491,0.05,13.662 +50000,0.19853,0.0019491,0.05,13.662 +50000,0.19853,0.0019491,0.05,13.662 +50000,0.19853,0.0019491,0.05,13.662 +50000,0.20245,0.0019876,0.05,12.795 +50000,0.20245,0.0019876,0.05,12.795 +50000,0.20245,0.0019876,0.05,12.795 +50000,0.20245,0.0019876,0.05,12.795 +50000,0.20645,0.0020269,0.05,11.979 +50000,0.20645,0.0020269,0.05,11.979 +50000,0.20645,0.0020269,0.05,11.979 +50000,0.20645,0.0020269,0.05,11.979 +50000,0.21053,0.0020669,0.05,11.212 +50000,0.21053,0.0020669,0.05,11.212 +50000,0.21053,0.0020669,0.05,11.212 +50000,0.21053,0.0020669,0.05,11.212 +50000,0.21469,0.0021078,0.05,10.492 +50000,0.21469,0.0021078,0.05,10.492 +50000,0.21469,0.0021078,0.05,10.492 +50000,0.21469,0.0021078,0.05,10.492 +50000,0.21893,0.0021494,0.05,9.8141 +50000,0.21893,0.0021494,0.05,9.8141 +50000,0.21893,0.0021494,0.05,9.8141 +50000,0.21893,0.0021494,0.05,9.8141 +50000,0.21893,0.0021494,0.05,9.8141 +50000,0.22326,0.0021919,0.05,9.1773 +50000,0.22326,0.0021919,0.05,9.1773 +50000,0.22326,0.0021919,0.05,9.1773 +50000,0.22326,0.0021919,0.05,9.1773 +50000,0.22767,0.0022352,0.05,8.5788 +50000,0.22767,0.0022352,0.05,8.5788 +50000,0.22767,0.0022352,0.05,8.5788 +50000,0.22767,0.0022352,0.05,8.5788 +50000,0.23217,0.0022794,0.05,8.0163 +50000,0.23217,0.0022794,0.05,8.0163 +50000,0.23217,0.0022794,0.05,8.0163 +50000,0.23217,0.0022794,0.05,8.0163 +50000,0.23217,0.0022794,0.05,8.0163 +50000,0.23676,0.0023244,0.05,7.4878 +50000,0.23676,0.0023244,0.05,7.4878 +50000,0.23676,0.0023244,0.05,7.4878 +50000,0.23676,0.0023244,0.05,7.4878 +50000,0.23676,0.0023244,0.05,7.4878 +50000,0.24144,0.0023704,0.05,6.9912 +50000,0.24144,0.0023704,0.05,6.9912 +50000,0.24144,0.0023704,0.05,6.9912 +50000,0.24144,0.0023704,0.05,6.9912 +50000,0.24621,0.0024172,0.05,6.5246 +50000,0.24621,0.0024172,0.05,6.5246 +50000,0.24621,0.0024172,0.05,6.5246 +50000,0.24621,0.0024172,0.05,6.5246 +50000,0.24621,0.0024172,0.05,6.5246 +50000,0.25108,0.002465,0.05,6.0863 +50000,0.25108,0.002465,0.05,6.0863 +50000,0.25108,0.002465,0.05,6.0863 +50000,0.25108,0.002465,0.05,6.0863 +50000,0.25108,0.002465,0.05,6.0863 +50000,0.25604,0.0025137,0.05,5.6745 +50000,0.25604,0.0025137,0.05,5.6745 +50000,0.25604,0.0025137,0.05,5.6745 +50000,0.25604,0.0025137,0.05,5.6745 +50000,0.25604,0.0025137,0.05,5.6745 +50000,0.2611,0.0025634,0.05,5.2877 +50000,0.2611,0.0025634,0.05,5.2877 +50000,0.2611,0.0025634,0.05,5.2877 +50000,0.2611,0.0025634,0.05,5.2877 +50000,0.2611,0.0025634,0.05,5.2877 +50000,0.26626,0.0026141,0.05,4.9244 +50000,0.26626,0.0026141,0.05,4.9244 +50000,0.26626,0.0026141,0.05,4.9244 +50000,0.26626,0.0026141,0.05,4.9244 +50000,0.26626,0.0026141,0.05,4.9244 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.27153,0.0026658,0.05,4.5833 +50000,0.2769,0.0027185,0.05,4.263 +50000,0.2769,0.0027185,0.05,4.263 +50000,0.2769,0.0027185,0.05,4.263 +50000,0.2769,0.0027185,0.05,4.263 +50000,0.2769,0.0027185,0.05,4.263 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28237,0.0027723,0.05,3.9624 +50000,0.28796,0.0028271,0.05,3.6802 +50000,0.28796,0.0028271,0.05,3.6802 +50000,0.28796,0.0028271,0.05,3.6802 +50000,0.28796,0.0028271,0.05,3.6802 +50000,0.28796,0.0028271,0.05,3.6802 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29365,0.002883,0.05,3.4154 +50000,0.29946,0.00294,0.05,3.167 +50000,0.29946,0.00294,0.05,3.167 +50000,0.29946,0.00294,0.05,3.167 +50000,0.29946,0.00294,0.05,3.167 +50000,0.29946,0.00294,0.05,3.167 +50000,0.29946,0.00294,0.05,3.167 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.30538,0.0029982,0.05,2.934 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31142,0.0030575,0.05,2.7156 +50000,0.31758,0.003118,0.05,2.511 +50000,0.31758,0.003118,0.05,2.511 +50000,0.31758,0.003118,0.05,2.511 +50000,0.31758,0.003118,0.05,2.511 +50000,0.31758,0.003118,0.05,2.511 +50000,0.31758,0.003118,0.05,2.511 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.32386,0.0031796,0.05,2.3193 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.33027,0.0032425,0.05,2.1398 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.3368,0.0033067,0.05,1.9718 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.34347,0.0033721,0.05,1.8147 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35026,0.0034388,0.05,1.6679 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.35719,0.0035069,0.05,1.5308 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.36426,0.0035762,0.05,1.4029 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37147,0.003647,0.05,1.2836 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.37882,0.0037192,0.05,1.1725 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.38632,0.0037928,0.05,1.0691 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.39396,0.0038678,0.05,0.97306 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40176,0.0039444,0.05,0.88389 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.40971,0.0040224,0.05,0.80124 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.41782,0.004102,0.05,0.72474 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.42609,0.0041832,0.05,0.65404 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.43452,0.004266,0.05,0.58881 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.44312,0.0043505,0.05,0.52875 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.45189,0.0044366,0.05,0.47356 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46084,0.0045244,0.05,0.42294 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.46996,0.004614,0.05,0.37662 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.47926,0.0047053,0.05,0.33434 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.48875,0.0047985,0.05,0.29585 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.49843,0.0048935,0.05,0.2609 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.5083,0.0049903,0.05,0.22927 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.51836,0.0050891,0.05,0.20072 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.52862,0.0051899,0.05,0.17504 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.53909,0.0052927,0.05,0.15203 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.54976,0.0053975,0.05,0.13149 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.56065,0.0055043,0.05,0.11321 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.57175,0.0056133,0.05,0.097023 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.58307,0.0057245,0.05,0.082748 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.59462,0.0058378,0.05,0.070218 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.60639,0.0059535,0.05,0.059272 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.6184,0.0060714,0.05,0.049759 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.63065,0.0061916,0.05,0.041535 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.64314,0.0063142,0.05,0.034465 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.65588,0.0064393,0.05,0.028423 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.66887,0.0065668,0.05,0.02329 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.68211,0.0066969,0.05,0.018957 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.69562,0.0068295,0.05,0.015324 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.7094,0.0069648,0.05,0.012299 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.72345,0.0071027,0.05,0.009798 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.73778,0.0072434,0.05,0.0077457 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7524,0.0073869,0.05,0.0060746 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7673,0.0075332,0.05,0.0047249 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.7825,0.0076824,0.05,0.0036436 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.798,0.0078346,0.05,0.002785 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.81381,0.0079898,0.05,0.0021091 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.82993,0.0081481,0.05,0.0015818 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.84637,0.0083095,0.05,0.0011742 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.86314,0.0084741,0.05,0.00086204 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.88024,0.008642,0.05,0.00062499 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.89767,0.0088132,0.05,0.0004463 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.91546,0.0089878,0.05,0.00031223 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.93359,0.0091658,0.05,0.00021151 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.95209,0.0093474,0.05,0.00013486 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.97095,0.0095326,0.05,7.4494e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 +50000,0.99019,0.0097215,0.05,2.3623e-05 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py new file mode 100644 index 00000000000..39a4c1e8a00 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py @@ -0,0 +1,190 @@ +import os +import sys + +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd +import scipy.linalg +from scipy import special + +from scipy.sparse import diags +from scipy.sparse.linalg import spsolve + +from xml.etree import ElementTree + +# Analytical results for linear thermal behavior +def steadyState(Tin, Tout, Rin, Rout, radialCoordinate): + return Tin + (Tout - Tin) * (np.log(radialCoordinate) - np.log(Rin)) / (np.log(Rout) - np.log(Rin)) + +def diffusionFunction(radialCoordinate, Rin, diffusionCoefficient, diffusionTime): + return special.erfc( (radialCoordinate - Rin) / 2.0 / np.sqrt( diffusionCoefficient * diffusionTime ) ) + +def computeTransientTemperature(Tin, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime): + # Ref. Wang and Papamichos (1994), https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94WR01774 + return Tin * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) + +def computeThermalDiffusionCoefficient(thermalConductivity, volumetricHeatCapacity): + return thermalConductivity / volumetricHeatCapacity + +# Finite difference results for non-linear thermal behavior +def temperatureDependentThermalConductivity(lambda0, lambda_gradient, T, Treference): + return lambda0 + lambda_gradient*(T-Treference) + +def temperatureDependentVolumetricHeat(c0, c_gradient, T, Treference): + return c0 + c_gradient*(T-Treference) + +def coefficientMatrix(thermalConductivity, volumetricHeatCapacity, r, dt, N): + # Coefficients for the matrix + A = np.zeros((N+1, N+1)) + + for i in range(1,N): + dr = r[i] - r[i-1] + r_i = r[i] + A[i, i-1] = - thermalConductivity[i]/volumetricHeatCapacity[i] * (dt/(dr**2) - dt/(2 * r_i * dr)) \ + + (thermalConductivity[i+1] - thermalConductivity[i-1])/volumetricHeatCapacity[i]*dt/4/(dr**2) + A[i, i] = 1 + 2 * thermalConductivity[i]/volumetricHeatCapacity[i] * dt / (dr**2) + A[i, i+1] = - thermalConductivity[i]/volumetricHeatCapacity[i] * (dt/(dr**2) + dt/(2 * r_i * dr)) \ + - (thermalConductivity[i+1] - thermalConductivity[i-1])/volumetricHeatCapacity[i]*dt/4/(dr**2) + + # Boundary conditions + # No-flux at r=0 approximated by setting the flux between the first two cells to zero + A[0, 0] = 1 + A[N, N] = 1 + return A + +def solve_radial_diffusion(r, tmax, dt, Tin, lambda0, lambda_gradient, c0, c_gradient, Treference): + N = len(r)-1 + # Time setup + n_steps = int(tmax / dt) + + # Time-stepping + T = np.zeros(N+1) # initial condition u(r, 0) + T[0] = Tin + for step in range(n_steps): + thermalConductivity = temperatureDependentThermalConductivity(lambda0, lambda_gradient, T, Treference) + volumetricHeatCapacity = temperatureDependentVolumetricHeat(c0, c_gradient, T, Treference) + A = coefficientMatrix(thermalConductivity, volumetricHeatCapacity, r, dt, N) + T = spsolve(A, T) + + return T + + +def extractDataFromXMLList(paramList): + # Extract data from a list in XML such as "{ 1, 2, 3}" + return paramList.replace('{', '').replace('}', '').strip().split(',') + +def getWellboreGeometryFromXML(xmlFilePath): + tree = ElementTree.parse(xmlFilePath) + + meshParam = tree.find('Mesh/InternalWellbore') + radii = extractDataFromXMLList( meshParam.get("radius") ) + + Rin = float(radii[0]) + Rout = float(radii[-1]) + + return [Rin, Rout] + +def getLoadingFromXML(xmlFilePath): + tree = ElementTree.parse(xmlFilePath) + fsParams = tree.findall('FieldSpecifications/FieldSpecification') + + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "pressure") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Pin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Pout = float(fsParam.get('scale')) + + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "temperature") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Tin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Tout = float(fsParam.get('scale')) + + thermalConductivity = float( extractDataFromXMLList( tree.find('Constitutive/SinglePhaseConstantThermalConductivity').get('thermalConductivityComponents') )[0] ) + + tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') + + for tree_SolidInternalEnergy in tree_SolidInternalEnergies: + if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_nonLinear": + referenceVolumetricHeatCapacity = float( tree_SolidInternalEnergy.get('referenceVolumetricHeatCapacity') ) + dVolumetricHeatCapacity_dTemperature = float( tree_SolidInternalEnergy.get('dVolumetricHeatCapacity_dTemperature') ) + referenceTemperature = float( tree_SolidInternalEnergy.get('referenceTemperature') ) + + permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) + + porosity = float( tree.find('Constitutive/PressurePorosity').get('defaultReferencePorosity') ) + + fluidViscosity = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('defaultViscosity') ) + + fluidCompressibility = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('compressibility') ) + + fluidThermalExpansionCoefficient = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('thermalExpansionCoeff') ) + + return [Pin, Pout, Tin, Tout, thermalConductivity, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient] + + +def main(): + + xmlFilePath = "../../../../../../../inputFiles/singlePhaseFlow/" + + Rin, Rout = getWellboreGeometryFromXML(xmlFilePath+"thermalCompressible_nonLinear_2d_benchmark.xml") + + Pin, Pout, Tin, Tout, thermalConductivity, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient = getLoadingFromXML(xmlFilePath+"thermalCompressible_2d_base.xml") + + plt.figure(figsize=(10,7)) + font = {'size' : 16} + plt.rc('font', **font) + + for chart_idx, idx in enumerate([1, 2, 5, 10]): + # Numerical results + data = pd.read_csv(f'data_{idx}.csv') + data.dropna(inplace=True) + data.drop_duplicates(inplace=True) + data.reset_index(drop=True, inplace=True) + + radialCoordinate = data['elementCenter:0'] + temperature = data['temperature'] + #pressure = data['pressure'] + diffusionTime = data['Time'][0] + + # Analytical results for linear thermal behavior, for comparison + thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(thermalConductivity, referenceVolumetricHeatCapacity) + + T_transient_linear = computeTransientTemperature(Tin, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime) + + # Analytical results of the steady state regime for comparison + T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate) + + # Finite different results for non-linear thermal behavior + T_transient_nonLinear = solve_radial_diffusion(radialCoordinate, diffusionTime, diffusionTime/100, Tin, thermalConductivity, 0, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature) + + # Visualization + # Temperature + plt.subplot(2,2,chart_idx+1) + plt.plot( radialCoordinate, temperature, 'k+' , label='GEOS' ) + plt.plot( radialCoordinate, T_transient_nonLinear, 'g-' , label='FDM Non-Linear' ) + plt.plot( radialCoordinate, T_transient_linear, 'r-' , label='Analytic Linear' ) + plt.plot( radialCoordinate, T_steadyState, 'b-' , label='Steady State' ) + + if chart_idx==1: + plt.legend() + + if chart_idx in [2,3]: + plt.xlabel('Radial distance from well center') + + if chart_idx in [0,2]: + plt.ylabel('Temperature (°C)') + + plt.ylim(-10,100) + plt.xlim(0,1.0) + plt.title('t = '+str(diffusionTime)+'(s)') + plt.tight_layout() + + plt.show() + + +if __name__ == "__main__": + main() + diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py index 684854d3b06..7e45aa17ab7 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py @@ -57,7 +57,12 @@ def getLoadingFromXML(xmlFilePath): thermalConductivity = float( extractDataFromXMLList( tree.find('Constitutive/SinglePhaseConstantThermalConductivity').get('thermalConductivityComponents') )[0] ) - volumetricHeatCapacity = float( tree.find('Constitutive/SolidInternalEnergy').get('volumetricHeatCapacity') ) + tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') + + for tree_SolidInternalEnergy in tree_SolidInternalEnergies: + if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_linear": + volumetricHeatCapacity = float( tree_SolidInternalEnergy.get('volumetricHeatCapacity') ) + permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) From 68d14bc2c54427f0b7ae60380d8b091220740be7 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 18 Jun 2024 10:27:13 -0500 Subject: [PATCH 099/286] Small bug fix (#3165) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 ++++ .../fluidFlow/wells/CompositionalMultiphaseWell.cpp | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index a2d9f7e6608..0d6495acc6f 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3088-5630-5ecff59 + baseline: integratedTests/baseline_integratedTests-pr3165-5641-568d6e7 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index eaef1d170e8..eef25f0e718 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3165 (2024-06-18) +====================== +Small bug fix. Rebaseline required due to appearance of useTotalMassEquation in well solver params. No real results change. + PR #3088 (2024-06-17) ====================== Adding temperature-dependent Solid Volumetric Heat Capacity. Rebaseline because of the parameter change in SolidInternalEnergy. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 2c335449b94..b76f74c5a6a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -73,8 +73,8 @@ CompositionalMultiphaseWell::CompositionalMultiphaseWell( const string & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Use mass formulation instead of molar" ); - this->registerWrapper( viewKeyStruct::useMassFlagString(), &m_useTotalMassEquation ). - setApplyDefaultValue( 0 ). + this->registerWrapper( viewKeyStruct::useTotalMassEquationString(), &m_useTotalMassEquation ). + setApplyDefaultValue( 1 ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Use total mass equation" ); From 02f04e379058fc8deaa1183f3593ff8182113c78 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 18 Jun 2024 14:49:03 -0500 Subject: [PATCH 100/286] Code cleanup (#3168) --- .../finiteVolume/StencilBase.hpp | 2 +- .../fluidFlow/SinglePhaseBase.cpp | 3 +- .../fluidFlow/SinglePhaseBase.hpp | 2 +- .../wells/CompositionalMultiphaseWell.cpp | 23 ++---------- .../wells/CompositionalMultiphaseWell.hpp | 9 ++--- .../fluidFlow/wells/SinglePhaseWell.cpp | 37 +++---------------- .../fluidFlow/wells/SinglePhaseWell.hpp | 8 ++-- .../fluidFlow/wells/WellSolverBase.cpp | 24 +++++++++++- .../fluidFlow/wells/WellSolverBase.hpp | 12 ++++++ ...mpositionalMultiphaseReservoirAndWells.hpp | 34 ----------------- .../CoupledReservoirAndWellsBase.hpp | 37 +++++++++++++++++++ .../SinglePhaseReservoirAndWells.hpp | 33 ----------------- 12 files changed, 91 insertions(+), 133 deletions(-) diff --git a/src/coreComponents/finiteVolume/StencilBase.hpp b/src/coreComponents/finiteVolume/StencilBase.hpp index 7113f1d148e..d469f384961 100644 --- a/src/coreComponents/finiteVolume/StencilBase.hpp +++ b/src/coreComponents/finiteVolume/StencilBase.hpp @@ -13,7 +13,7 @@ */ /** - * @file CellElementStencilTPFA.hpp + * @file StencilBase.hpp */ #ifndef GEOS_FINITEVOLUME_STENCILBASE_HPP_ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 8dd5d24686b..2c32fc10229 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -334,11 +334,12 @@ void SinglePhaseBase::updateThermalConductivity( ElementSubRegionBase & subRegio conductivityMaterial.update( porosity ); } -void SinglePhaseBase::updateFluidState( ElementSubRegionBase & subRegion ) const +real64 SinglePhaseBase::updateFluidState( ElementSubRegionBase & subRegion ) const { updateFluidModel( subRegion ); updateMass( subRegion ); updateMobility( subRegion ); + return 0.0; } void SinglePhaseBase::updateMobility( ObjectManagerBase & dataGroup ) const diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index 0ee5d340d92..9853469cd70 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -286,7 +286,7 @@ class SinglePhaseBase : public FlowSolverBase * @brief Function to update all constitutive state and dependent variables * @param subRegion subregion that contains the fields */ - void + real64 updateFluidState( ElementSubRegionBase & subRegion ) const; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index b76f74c5a6a..6872d40322c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -162,15 +162,11 @@ void CompositionalMultiphaseWell::registerDataOnMesh( Group & meshBodies ) WellElementSubRegion & subRegion ) { string const & fluidName = getConstitutiveName< MultiFluidBase >( subRegion ); + GEOS_ERROR_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", + getDataContext(), subRegion.getName() ) ); MultiFluidBase const & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); - subRegion.registerField< fields::well::pressure >( getName() ); - subRegion.registerField< fields::well::pressure_n >( getName() ); - - subRegion.registerField< fields::well::temperature >( getName() ); - subRegion.registerField< fields::well::temperature_n >( getName() ); - // The resizing of the arrays needs to happen here, before the call to initializePreSubGroups, // to make sure that the dimensions are properly set before the timeHistoryOutput starts its initialization. @@ -497,28 +493,17 @@ void CompositionalMultiphaseWell::initializePostSubGroups() MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, WellElementSubRegion & subRegion ) { - string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); - fluidName = getConstitutiveName< MultiFluidBase >( subRegion ); - GEOS_THROW_IF( fluidName.empty(), - GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ), - InputError ); - string & relPermName = subRegion.getReference< string >( viewKeyStruct::relPermNamesString() ); relPermName = getConstitutiveName< RelativePermeabilityBase >( subRegion ); GEOS_THROW_IF( relPermName.empty(), - GEOS_FMT( "{}: Fluid model not found on subregion {}", + GEOS_FMT( "{}: Relative permeability not found on subregion {}", getDataContext(), subRegion.getName() ), InputError ); validateInjectionStreams( subRegion ); - - validateWellConstraints( 0, 0, subRegion ); - } ); } ); } @@ -760,7 +745,7 @@ void CompositionalMultiphaseWell::updateVolRatesForConstraint( WellElementSubReg real64 const currentTotalRate = connRate[iwelemRef]; // Step 2.1: compute the inverse of the total density and derivatives - massDensity =totalDens[iwelemRef][0]; // need to verify this is surface dens + massDensity = totalDens[iwelemRef][0]; // need to verify this is surface dens real64 const totalDensInv = 1.0 / totalDens[iwelemRef][0]; real64 const dTotalDensInv_dPres = -dTotalDens[iwelemRef][0][Deriv::dP] * totalDensInv * totalDensInv; stackArray1d< real64, maxNumComp > dTotalDensInv_dCompDens( numComp ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp index 6d165cb56c7..9bb2d9aa897 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -19,10 +19,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_COMPOSITIONALMULTIPHASEWELL_HPP_ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_COMPOSITIONALMULTIPHASEWELL_HPP_ -#include "constitutive/fluid/multifluid/Layouts.hpp" -#include "constitutive/relativePermeability/layouts.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBase.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" namespace geos @@ -355,9 +352,9 @@ class CompositionalMultiphaseWell : public WellSolverBase * @param dt the time step dt * @param subRegion the well subRegion */ - void validateWellConstraints( real64 const & time_n, - real64 const & dt, - WellElementSubRegion const & subRegion ); + virtual void validateWellConstraints( real64 const & time_n, + real64 const & dt, + WellElementSubRegion const & subRegion ) override; void printRates( real64 const & time_n, real64 const & dt, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index a1f1777c5e3..f495b15a488 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -66,12 +66,10 @@ void SinglePhaseWell::registerDataOnMesh( Group & meshBodies ) [&]( localIndex const, WellElementSubRegion & subRegion ) { - subRegion.registerField< fields::well::pressure_n >( getName() ); - subRegion.registerField< fields::well::pressure >( getName() ). - setRestartFlags( RestartFlags::WRITE_AND_READ ); - - subRegion.registerField< fields::well::temperature_n >( getName() ); - subRegion.registerField< fields::well::temperature >( getName() ); + string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); + fluidName = getConstitutiveName< SingleFluidBase >( subRegion ); + GEOS_ERROR_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", + getDataContext(), subRegion.getName() ) ); subRegion.registerField< fields::well::connectionRate_n >( getName() ); subRegion.registerField< fields::well::connectionRate >( getName() ); @@ -101,31 +99,6 @@ void SinglePhaseWell::registerDataOnMesh( Group & meshBodies ) outputFile << "Time [s],BHP [Pa],Total rate [kg/s],Total " << conditionKey << " volumetric rate ["<( viewKeyStruct::fluidNamesString() ); - fluidName = getConstitutiveName< SingleFluidBase >( subRegion ); - GEOS_ERROR_IF( fluidName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", - getDataContext(), subRegion.getName() ) ); - - } ); - } ); -} - -void SinglePhaseWell::initializePostSubGroups() -{ - - WellSolverBase::initializePostSubGroups(); - DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) - { - ElementRegionManager & elemManager = mesh.getElemManager(); - elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, - [&]( localIndex const, - WellElementSubRegion & subRegion ) - { - validateWellConstraints( 0, 0, subRegion ); } ); } ); } @@ -137,7 +110,7 @@ string SinglePhaseWell::resElementDofName() const void SinglePhaseWell::validateWellConstraints( real64 const & time_n, real64 const & dt, - WellElementSubRegion const & subRegion ) const + WellElementSubRegion const & subRegion ) { WellControls const & wellControls = getWellControls( subRegion ); WellControls::Control const currentControl = wellControls.getControl(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp index 9df8cfcec0f..259db5d692b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp @@ -255,8 +255,6 @@ class SinglePhaseWell : public WellSolverBase protected: - virtual void initializePostSubGroups() override; - void printRates( real64 const & time_n, real64 const & dt, DomainPartition & domain ) override; @@ -275,9 +273,9 @@ class SinglePhaseWell : public WellSolverBase * @param dt the time step dt * @param subRegion the well subRegion */ - void validateWellConstraints( real64 const & time_n, - real64 const & dt, - WellElementSubRegion const & subRegion ) const; + virtual void validateWellConstraints( real64 const & time_n, + real64 const & dt, + WellElementSubRegion const & subRegion ) override; }; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index a25112cd74a..f1c32fc0bd6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -93,7 +93,7 @@ void WellSolverBase::registerDataOnMesh( Group & meshBodies ) { SolverBase::registerDataOnMesh( meshBodies ); - + // loop over the wells forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, MeshLevel & meshLevel, arrayView1d< string const > const & regionNames ) @@ -104,6 +104,11 @@ void WellSolverBase::registerDataOnMesh( Group & meshBodies ) [&]( localIndex const, WellElementSubRegion & subRegion ) { + subRegion.registerField< fields::well::pressure >( getName() ); + subRegion.registerField< fields::well::pressure_n >( getName() ); + + subRegion.registerField< fields::well::temperature >( getName() ); + subRegion.registerField< fields::well::temperature_n >( getName() ); subRegion.registerField< fields::well::gravityCoefficient >( getName() ); @@ -118,6 +123,23 @@ void WellSolverBase::registerDataOnMesh( Group & meshBodies ) } ); } +void WellSolverBase::initializePostSubGroups() +{ + DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, + [&]( localIndex const, + WellElementSubRegion & subRegion ) + { + validateWellConstraints( 0, 0, subRegion ); + } ); + } ); +} + void WellSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const { SolverBase::setConstitutiveNamesCallSuper( subRegion ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp index 6f53122b71e..ea55443dd17 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp @@ -293,12 +293,24 @@ class WellSolverBase : public SolverBase virtual void initializePostInitialConditionsPreSubGroups() override; + virtual void initializePostSubGroups() override; + /** * @brief Initialize all the primary and secondary variables in all the wells * @param domain the domain containing the well manager to access individual wells */ virtual void initializeWells( DomainPartition & domain ) = 0; + /** + * @brief Make sure that the well constraints are compatible + * @param time_n the time at the beginning of the time step + * @param dt the time step dt + * @param subRegion the well subRegion + */ + virtual void validateWellConstraints( real64 const & time_n, + real64 const & dt, + WellElementSubRegion const & subRegion ) = 0; + virtual void printRates( real64 const & time_n, real64 const & dt, DomainPartition & domain ) = 0; diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index b914a97a273..4effbe54621 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -84,45 +84,11 @@ class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWells CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) override; - void - assembleFluxTerms( real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const - { flowSolver()->assembleFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } - void - assembleStabilizedFluxTerms( real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const - { flowSolver()->assembleStabilizedFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } - - void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { flowSolver()->setKeepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } - - real64 updateFluidState( ElementSubRegionBase & subRegion ) const - { return flowSolver()->updateFluidState( subRegion ); } - void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const - { flowSolver()->updatePorosityAndPermeability( subRegion ); } - void updateSolidInternalEnergyModel( ObjectManagerBase & dataGroup ) const - { flowSolver()->updateSolidInternalEnergyModel( dataGroup ); } - - integer & isThermal() { return flowSolver()->isThermal(); } integer useSimpleAccumulation() const { return flowSolver()->useSimpleAccumulation(); } integer useTotalMassEquation() const { return flowSolver()->useTotalMassEquation(); } integer numFluidPhases() { return flowSolver()->numFluidPhases(); } integer numFluidComponents() { return flowSolver()->numFluidComponents(); } - void enableFixedStressPoromechanicsUpdate() - { flowSolver()->enableFixedStressPoromechanicsUpdate(); } - - void enableJumpStabilization() - {flowSolver()->enableJumpStabilization(); } - - virtual void saveSequentialIterationState( DomainPartition & domain ) override final { flowSolver()->saveSequentialIterationState( domain ); } - protected: virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index f309a81a8f2..515d778271e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -222,6 +222,43 @@ class CoupledReservoirAndWellsBase : public CoupledSolver< RESERVOIR_SOLVER, WEL } } + void + assembleFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) const + { reservoirSolver()->assembleFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } + + void + assembleStabilizedFluxTerms( real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) const + { reservoirSolver()->assembleStabilizedFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } + + real64 updateFluidState( ElementSubRegionBase & subRegion ) const + { return reservoirSolver()->updateFluidState( subRegion ); } + void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const + { reservoirSolver()->updatePorosityAndPermeability( subRegion ); } + void updateSolidInternalEnergyModel( ObjectManagerBase & dataGroup ) const + { reservoirSolver()->updateSolidInternalEnergyModel( dataGroup ); } + + integer & isThermal() { return reservoirSolver()->isThermal(); } + + void enableJumpStabilization() + { reservoirSolver()->enableJumpStabilization(); } + + void enableFixedStressPoromechanicsUpdate() + { reservoirSolver()->enableFixedStressPoromechanicsUpdate(); } + + void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) + { reservoirSolver()->setKeepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } + + virtual void saveSequentialIterationState( DomainPartition & domain ) override + { reservoirSolver()->saveSequentialIterationState( domain ); } + protected: /** diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 0db0b36daaf..ca86c257f7b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -83,13 +83,6 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERV CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) override; - void - assembleFluxTerms( real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const - { flowSolver()->assembleFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } void assembleHydrofracFluxTerms( real64 const time_n, real64 const dt, @@ -107,32 +100,6 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERV arrayView1d< real64 > const & localRhs ) { flowSolver()->accumulationAssemblyLaunch( dofManager, subRegion, localMatrix, localRhs ); } - void - assembleStabilizedFluxTerms( real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const - { flowSolver()->assembleStabilizedFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); } - - void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { flowSolver()->setKeepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } - - void updateFluidState( ElementSubRegionBase & subRegion ) const - { flowSolver()->updateFluidState( subRegion ); } - void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const - { flowSolver()->updatePorosityAndPermeability( subRegion ); } - void updateSolidInternalEnergyModel( ObjectManagerBase & dataGroup ) const - { flowSolver()->updateSolidInternalEnergyModel( dataGroup ); } - - integer & isThermal() { return flowSolver()->isThermal(); } - - void enableFixedStressPoromechanicsUpdate() { flowSolver()->enableFixedStressPoromechanicsUpdate(); } - - void enableJumpStabilization() {flowSolver()->enableJumpStabilization();} - - virtual void saveSequentialIterationState( DomainPartition & domain ) override { flowSolver()->saveSequentialIterationState( domain ); } - void prepareStencilWeights( DomainPartition & domain ) const { flowSolver()->prepareStencilWeights( domain ); } void updateStencilWeights( DomainPartition & domain ) const From 9134c422b5adc11e7167d80d55e3547b559f1ec5 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 18 Jun 2024 16:23:23 -0500 Subject: [PATCH 101/286] Two experimental options for compositional flow solver (#3160) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 ++ .../NonlinearSolverParameters.cpp | 59 ++++++++++------- .../fluidFlow/CompositionalMultiphaseBase.cpp | 65 ++++++++++++++++--- .../fluidFlow/CompositionalMultiphaseBase.hpp | 8 +++ .../fluidFlow/CompositionalMultiphaseFVM.cpp | 2 + .../CompositionalMultiphaseHybridFVM.cpp | 1 + ...rmalCompositionalMultiphaseBaseKernels.hpp | 31 +++++++-- ...rmalCompositionalMultiphaseBaseKernels.hpp | 10 ++- .../wells/CompositionalMultiphaseWell.cpp | 10 +++ .../wells/CompositionalMultiphaseWell.hpp | 5 ++ .../CompositionalMultiphaseWellKernels.hpp | 5 +- 12 files changed, 160 insertions(+), 42 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 0d6495acc6f..5014bcd9516 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3165-5641-568d6e7 + baseline: integratedTests/baseline_integratedTests-pr3160-5651-0cad939 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index eef25f0e718..5c9f11ef6d4 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3160 (2024-06-18) +====================== +Two experimental options for compositional flow solver. Rebaseline because of the new input flags. + PR #3165 (2024-06-18) ====================== Small bug fix. Rebaseline required due to appearance of useTotalMassEquation in well solver params. No real results change. diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp index f3aa75597d2..dc4b4620067 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp @@ -14,6 +14,7 @@ #include "NonlinearSolverParameters.hpp" #include "common/Logger.hpp" +#include "fileIO/Table/TableFormatter.hpp" namespace geos { @@ -194,37 +195,45 @@ void NonlinearSolverParameters::postProcessInput() void NonlinearSolverParameters::print() const { - GEOS_LOG_RANK_0( "Nonlinear solver parameters:" ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search action = {}", EnumStrings< LineSearchAction >::toString( m_lineSearchAction ) ) ); + TableData tableData; + tableData.addRow( "Log level", getLogLevel()); + tableData.addRow( "Line search", "" ); + tableData.addRow( " Action", m_lineSearchAction ); if( m_lineSearchAction != LineSearchAction::None ) { - GEOS_LOG_RANK_0( GEOS_FMT( " Line search interpolation type = {}", EnumStrings< LineSearchInterpolationType >::toString( m_lineSearchInterpType ) ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search maximum number of cuts = {}", m_lineSearchMaxCuts ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search cut factor = {}", m_lineSearchCutFactor ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search starting iteration = {}", m_lineSearchStartingIteration ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Line search residual increase factor = {}", m_lineSearchResidualFactor ) ); + tableData.addRow( " Interpolation type", m_lineSearchInterpType ); + tableData.addRow( " Maximum number of cuts", m_lineSearchMaxCuts ); + tableData.addRow( " Cut factor", m_lineSearchCutFactor ); + tableData.addRow( " Starting iteration", m_lineSearchStartingIteration ); + tableData.addRow( " Residual increase factor", m_lineSearchResidualFactor ); } - GEOS_LOG_RANK_0( GEOS_FMT( " Norm type (flow solver) = {}", EnumStrings< solverBaseKernels::NormType >::toString( m_normType ) ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Minimum residual normalizer = {}", m_minNormalizer ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Convergence tolerance = {}", m_newtonTol ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum iterations = {}", m_maxIterNewton ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Minimum iterations = {}", m_minIterNewton ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum allowed residual norm = {}", m_maxAllowedResidualNorm ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Allow non-converged = {}", m_allowNonConverged ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step decrease iterations limit = {}", m_timeStepDecreaseIterLimit ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step increase iterations limit = {}", m_timeStepIncreaseIterLimit ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step decrease factor = {}", m_timeStepDecreaseFactor ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step increase factor = {}", m_timeStepDecreaseFactor ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Time step cut factor = {}", m_timeStepCutFactor ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum time step cuts = {}", m_maxTimeStepCuts ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum sub time steps = {}", m_maxSubSteps ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Maximum number of configuration attempts = {}", m_maxNumConfigurationAttempts ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Coupling type = {}", EnumStrings< CouplingType >::toString( m_couplingType ) ) ); + tableData.addRow( "Norm type (flow solver)", m_normType ); + tableData.addRow( "Minimum residual normalizer", m_minNormalizer ); + tableData.addRow( "Convergence tolerance", m_newtonTol ); + tableData.addRow( "Maximum iterations", m_maxIterNewton ); + tableData.addRow( "Minimum iterations", m_minIterNewton ); + tableData.addRow( "Maximum allowed residual norm", m_maxAllowedResidualNorm ); + tableData.addRow( "Allow non-converged", m_allowNonConverged ); + tableData.addRow( "Time step decrease iterations limit", m_timeStepDecreaseIterLimit ); + tableData.addRow( "Time step increase iterations limit", m_timeStepIncreaseIterLimit ); + tableData.addRow( "Time step decrease factor", m_timeStepDecreaseFactor ); + tableData.addRow( "Time step increase factor", m_timeStepDecreaseFactor ); + tableData.addRow( "Time step cut factor", m_timeStepCutFactor ); + tableData.addRow( "Maximum time step cuts", m_maxTimeStepCuts ); + tableData.addRow( "Maximum sub time steps", m_maxSubSteps ); + tableData.addRow( "Maximum number of configuration attempts", m_maxNumConfigurationAttempts ); + tableData.addRow( "Coupling type", m_couplingType ); if( m_couplingType == CouplingType::Sequential ) { - GEOS_LOG_RANK_0( GEOS_FMT( " Sequential convergence criterion = {}", EnumStrings< SequentialConvergenceCriterion >::toString( m_sequentialConvergenceCriterion ) ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " Subcycling = {}", m_subcyclingOption ) ); + tableData.addRow( "Sequential convergence criterion", m_sequentialConvergenceCriterion ); + tableData.addRow( "Subcycling", m_subcyclingOption ); } + TableLayout const tableLayout = TableLayout( { + TableLayout::ColumnParam{"Parameter", TableLayout::Alignment::left}, + TableLayout::ColumnParam{"Value", TableLayout::Alignment::left}, + }, GEOS_FMT( "{}: nonlinear solver", getParent().getName() ) ); + TableTextFormatter const tableFormatter( tableLayout ); + GEOS_LOG_RANK_0( tableFormatter.toString( tableData )); } REGISTER_CATALOG_ENTRY( Group, NonlinearSolverParameters, string const &, Group * const ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 652682cca12..8b67ebe2b18 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -102,6 +102,11 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( 0.2 ). setDescription( "Target (absolute) change in phase volume fraction in a time step" ); + this->registerWrapper( viewKeyStruct::targetRelativeCompDensChangeString(), &m_targetRelativeCompDensChange ). + setSizedFromParent( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( LvArray::NumericLimits< real64 >::max ). // disabled by default + setDescription( "Target (relative) change in component density in a time step" ); this->registerWrapper( viewKeyStruct::maxCompFracChangeString(), &m_maxCompFracChange ). setSizedFromParent( 0 ). @@ -118,6 +123,11 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( 0.5 ). setDescription( "Maximum (relative) change in temperature in a Newton iteration" ); + this->registerWrapper( viewKeyStruct::maxRelativeCompDensChangeString(), &m_maxRelativeCompDensChange ). + setSizedFromParent( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( LvArray::NumericLimits< real64 >::max ). // disabled by default + setDescription( "Maximum (relative) change in a component density in a Newton iteration" ); this->registerWrapper( viewKeyStruct::allowLocalCompDensChoppingString(), &m_allowCompDensChopping ). setSizedFromParent( 0 ). @@ -178,15 +188,22 @@ void CompositionalMultiphaseBase::postProcessInput() GEOS_ERROR_IF_LE_MSG( m_maxRelativeTempChange, 0.0, getWrapperDataContext( viewKeyStruct::maxRelativeTempChangeString() ) << ": The maximum relative change in temperature in a Newton iteration must be larger than 0.0" ); + GEOS_ERROR_IF_LE_MSG( m_maxRelativeCompDensChange, 0.0, + getWrapperDataContext( viewKeyStruct::maxRelativeCompDensChangeString() ) << + ": The maximum relative change in component density in a Newton iteration must be larger than 0.0" ); GEOS_ERROR_IF_LE_MSG( m_targetRelativePresChange, 0.0, getWrapperDataContext( viewKeyStruct::targetRelativePresChangeString() ) << ": The target relative change in pressure in a time step must be larger than 0.0" ); GEOS_ERROR_IF_LE_MSG( m_targetRelativeTempChange, 0.0, getWrapperDataContext( viewKeyStruct::targetRelativeTempChangeString() ) << - ": The target relative change in temperature in a time step must be larger than to 0.0" ); + ": The target relative change in temperature in a time step must be larger than 0.0" ); GEOS_ERROR_IF_LE_MSG( m_targetPhaseVolFracChange, 0.0, getWrapperDataContext( viewKeyStruct::targetPhaseVolFracChangeString() ) << - ": The target change in phase volume fraction in a time step must be larger than to 0.0" ); + ": The target change in phase volume fraction in a time step must be larger than 0.0" ); + GEOS_ERROR_IF_LE_MSG( m_targetRelativeCompDensChange, 0.0, + getWrapperDataContext( viewKeyStruct::targetPhaseVolFracChangeString() ) << + ": The target change in component density in a time step must be larger than 0.0" ); + GEOS_ERROR_IF_LT_MSG( m_solutionChangeScalingFactor, 0.0, getWrapperDataContext( viewKeyStruct::solutionChangeScalingFactorString() ) << ": The solution change scaling factor must be larger or equal to 0.0" ); @@ -2066,6 +2083,7 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & { if( m_targetRelativePresChange >= 1.0 && m_targetPhaseVolFracChange >= 1.0 && + m_targetRelativeCompDensChange >= 1.0 && ( !m_isThermal || m_targetRelativeTempChange >= 1.0 ) ) { return LvArray::NumericLimits< real64 >::max; @@ -2074,8 +2092,10 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & real64 maxRelativePresChange = 0.0; real64 maxRelativeTempChange = 0.0; real64 maxAbsolutePhaseVolFracChange = 0.0; + real64 maxRelativeCompDensChange = 0.0; - real64 const numPhase = m_numPhases; + integer const numPhase = m_numPhases; + integer const numComp = m_numComponents; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, MeshLevel & mesh, @@ -2095,28 +2115,38 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & subRegion.getField< fields::flow::phaseVolumeFraction >(); arrayView2d< real64 const, compflow::USD_PHASE > const phaseVolFrac_n = subRegion.getField< fields::flow::phaseVolumeFraction_n >(); + arrayView2d< real64 const, compflow::USD_COMP > const compDens = + subRegion.getField< fields::flow::globalCompDensity >(); + arrayView2d< real64, compflow::USD_COMP > const compDens_n = + subRegion.getField< fields::flow::globalCompDensity_n >(); RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxPresChange( 0.0 ); RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxTempChange( 0.0 ); RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxPhaseVolFracChange( 0.0 ); + RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxCompDensChange( 0.0 ); forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) { if( ghostRank[ei] < 0 ) { - // switch from relative to absolute when pressure less than 1 + // switch from relative to absolute when values less than 1 subRegionMaxPresChange.max( LvArray::math::abs( pres[ei] - pres_n[ei] ) / LvArray::math::max( LvArray::math::abs( pres_n[ei] ), 1.0 ) ); subRegionMaxTempChange.max( LvArray::math::abs( temp[ei] - temp_n[ei] ) / LvArray::math::max( LvArray::math::abs( temp_n[ei] ), 1.0 ) ); for( integer ip = 0; ip < numPhase; ++ip ) { subRegionMaxPhaseVolFracChange.max( LvArray::math::abs( phaseVolFrac[ei][ip] - phaseVolFrac_n[ei][ip] ) ); } + for( integer ic = 0; ic < numComp; ++ic ) + { + subRegionMaxCompDensChange.max( LvArray::math::abs( compDens[ei][ic] - compDens_n[ei][ic] ) / LvArray::math::max( LvArray::math::abs( compDens_n[ei][ic] ), 1.0 ) ); + } } } ); maxRelativePresChange = LvArray::math::max( maxRelativePresChange, subRegionMaxPresChange.get() ); maxRelativeTempChange = LvArray::math::max( maxRelativeTempChange, subRegionMaxTempChange.get() ); maxAbsolutePhaseVolFracChange = LvArray::math::max( maxAbsolutePhaseVolFracChange, subRegionMaxPhaseVolFracChange.get() ); + maxRelativeCompDensChange = LvArray::math::max( maxRelativeCompDensChange, subRegionMaxCompDensChange.get() ); } ); } ); @@ -2124,15 +2154,22 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & maxRelativePresChange = MpiWrapper::max( maxRelativePresChange ); maxAbsolutePhaseVolFracChange = MpiWrapper::max( maxAbsolutePhaseVolFracChange ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: Max relative pressure change during time step: {} %", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max relative pressure change during time step = {} %", getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativePresChange, 3 ) ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: Max absolute phase volume fraction change during time step: {}", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max absolute phase volume fraction change during time step = {}", getName(), GEOS_FMT( "{:.{}f}", maxAbsolutePhaseVolFracChange, 3 ) ) ); + if( m_targetRelativeCompDensChange < LvArray::NumericLimits< real64 >::max ) + { + maxRelativeCompDensChange = MpiWrapper::max( maxRelativeCompDensChange ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max relative component density change during time step = {} %", + getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativeCompDensChange, 3 ) ) ); + } + if( m_isThermal ) { maxRelativeTempChange = MpiWrapper::max( maxRelativeTempChange ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: Max relative temperature change during time step: {} %", + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max relative temperature change during time step = {} %", getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativeTempChange, 3 ) ) ); } @@ -2146,6 +2183,14 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & / std::max( eps, maxAbsolutePhaseVolFracChange + m_solutionChangeScalingFactor * m_targetPhaseVolFracChange ); if( m_nonlinearSolverParameters.getLogLevel() > 0 ) GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on phase volume fraction change = {}", getName(), nextDtPhaseVolFrac )); + real64 nextDtCompDens = LvArray::NumericLimits< real64 >::max; + if( m_targetRelativeCompDensChange < LvArray::NumericLimits< real64 >::max ) + { + nextDtCompDens = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativeCompDensChange + / std::max( eps, maxRelativeCompDensChange + m_solutionChangeScalingFactor * m_targetRelativeCompDensChange ); + if( m_nonlinearSolverParameters.getLogLevel() > 0 ) + GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on component density change = {}", getName(), nextDtCompDens )); + } real64 nextDtTemperature = LvArray::NumericLimits< real64 >::max; if( m_isThermal ) { @@ -2155,7 +2200,7 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on temperature change = {}", getName(), nextDtPhaseVolFrac )); } - return std::min( std::min( nextDtPressure, nextDtPhaseVolFrac ), nextDtTemperature ); + return std::min( std::min( nextDtPressure, std::min( nextDtPhaseVolFrac, nextDtCompDens ) ), nextDtTemperature ); } real64 CompositionalMultiphaseBase::setNextDtBasedOnCFL( const geos::real64 & currentDt, geos::DomainPartition & domain ) @@ -2165,8 +2210,8 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnCFL( const geos::real64 & cu computeCFLNumbers( domain, currentDt, maxPhaseCFL, maxCompCFL ); - GEOS_LOG_LEVEL_RANK_0( 1, getName() << ": Max phase CFL number: " << maxPhaseCFL ); - GEOS_LOG_LEVEL_RANK_0( 1, getName() << ": Max component CFL number: " << maxCompCFL ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max phase CFL number = {}", getName(), maxPhaseCFL ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max component CFL number = {} ", getName(), maxCompCFL ) ); return std::min( m_targetFlowCFL*currentDt/maxCompCFL, m_targetFlowCFL*currentDt/maxPhaseCFL ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index 0708804af11..cd4809d2cee 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -254,6 +254,7 @@ class CompositionalMultiphaseBase : public FlowSolverBase static constexpr char const * targetRelativePresChangeString() { return "targetRelativePressureChangeInTimeStep"; } static constexpr char const * targetRelativeTempChangeString() { return "targetRelativeTemperatureChangeInTimeStep"; } static constexpr char const * targetPhaseVolFracChangeString() { return "targetPhaseVolFractionChangeInTimeStep"; } + static constexpr char const * targetRelativeCompDensChangeString() { return "targetRelativeCompDensChangeInTimeStep"; } static constexpr char const * targetFlowCFLString() { return "targetFlowCFL"; } @@ -262,6 +263,7 @@ class CompositionalMultiphaseBase : public FlowSolverBase static constexpr char const * maxCompFracChangeString() { return "maxCompFractionChange"; } static constexpr char const * maxRelativePresChangeString() { return "maxRelativePressureChange"; } static constexpr char const * maxRelativeTempChangeString() { return "maxRelativeTemperatureChange"; } + static constexpr char const * maxRelativeCompDensChangeString() { return "maxRelativeCompDensChange"; } static constexpr char const * allowLocalCompDensChoppingString() { return "allowLocalCompDensityChopping"; } static constexpr char const * useTotalMassEquationString() { return "useTotalMassEquation"; } static constexpr char const * useSimpleAccumulationString() { return "useSimpleAccumulation"; } @@ -449,6 +451,9 @@ class CompositionalMultiphaseBase : public FlowSolverBase /// maximum (relative) change in temperature in a Newton iteration real64 m_maxRelativeTempChange; + /// maximum (relative) change in component density in a Newton iteration + real64 m_maxRelativeCompDensChange; + /// damping factor for solution change targets real64 m_solutionChangeScalingFactor; @@ -461,6 +466,9 @@ class CompositionalMultiphaseBase : public FlowSolverBase /// target (absolute) change in phase volume fraction in a time step real64 m_targetPhaseVolFracChange; + /// target (relative) change in component density in a time step + real64 m_targetRelativeCompDensChange; + /// minimum value of the scaling factor obtained by enforcing maxCompFracChange real64 m_minScalingFactor; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 5b698da8b2d..0cc1c160dfc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -487,6 +487,7 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d m_maxAbsolutePresChange, m_maxRelativeTempChange, m_maxCompFracChange, + m_maxRelativeCompDensChange, dofManager.rankOffset(), m_numComponents, dofKey, @@ -497,6 +498,7 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxCompFracChange, + m_maxRelativeCompDensChange, dofManager.rankOffset(), m_numComponents, dofKey, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index 1231a0d75b5..f7db21f60d6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -450,6 +450,7 @@ real64 CompositionalMultiphaseHybridFVM::scalingForSystemSolution( DomainPartiti createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxCompFracChange, + m_maxRelativeCompDensChange, dofManager.rankOffset(), m_numComponents, dofKey, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp index f0a3c194c5b..0a4e71a1bfc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp @@ -1156,7 +1156,9 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe /** * @brief Create a new kernel instance * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompDensChange the max allowed comp density change * @param[in] rankOffset the rank offset * @param[in] numComp the number of components * @param[in] dofKey the dof key to get dof numbers @@ -1170,6 +1172,7 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe ScalingForSystemSolutionKernel( real64 const maxRelativePresChange, real64 const maxAbsolutePresChange, real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, globalIndex const rankOffset, integer const numComp, string const dofKey, @@ -1190,7 +1193,8 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe compDensScalingFactor ), m_maxRelativePresChange( maxRelativePresChange ), m_maxAbsolutePresChange( maxAbsolutePresChange ), - m_maxCompFracChange( maxCompFracChange ) + m_maxCompFracChange( maxCompFracChange ), + m_maxRelativeCompDensChange( maxRelativeCompDensChange ) {} /** @@ -1379,14 +1383,13 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe stack.localMaxDeltaCompDens = absCompDensChange; } - real64 const maxAbsCompDensChange = m_maxCompFracChange * prevTotalDens; - // This actually checks the change in component fraction, using a lagged total density // Indeed we can rewrite the following check as: // | prevCompDens / prevTotalDens - newCompDens / prevTotalDens | > maxCompFracChange // Note that the total density in the second term is lagged (i.e, we use prevTotalDens) // because I found it more robust than using directly newTotalDens (which can vary also // wildly when the compDens change is large) + real64 const maxAbsCompDensChange = m_maxCompFracChange * prevTotalDens; if( absCompDensChange > maxAbsCompDensChange && absCompDensChange > eps ) { real64 const compScalingFactor = maxAbsCompDensChange / absCompDensChange; @@ -1400,6 +1403,22 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe stack.localMinCompDensScalingFactor = compScalingFactor; } } + + // switch from relative to absolute when value is < 1.0 + real64 const maxRelCompDensChange = m_maxRelativeCompDensChange * LvArray::math::max( m_compDens[ei][ic], 1.0 ); + if( absCompDensChange > maxRelCompDensChange && absCompDensChange > eps ) + { + real64 const compScalingFactor = maxRelCompDensChange / absCompDensChange; + m_compDensScalingFactor[ei] = LvArray::math::min( m_compDensScalingFactor[ei], compScalingFactor ); + if( stack.localMinVal > compScalingFactor ) + { + stack.localMinVal = compScalingFactor; + } + if( stack.localMinCompDensScalingFactor > compScalingFactor ) + { + stack.localMinCompDensScalingFactor = compScalingFactor; + } + } } // compute the scaling factor for other vars, such as temperature @@ -1412,6 +1431,7 @@ class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKe real64 const m_maxRelativePresChange; real64 const m_maxAbsolutePresChange; real64 const m_maxCompFracChange; + real64 const m_maxRelativeCompDensChange; }; @@ -1426,7 +1446,9 @@ class ScalingForSystemSolutionKernelFactory * @brief Create and launch the kernel computing the scaling factor * @tparam POLICY the kernel policy * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompDensChange the max allowed comp density change * @param[in] rankOffset the rank offset * @param[in] numComp the number of components * @param[in] dofKey the dof key to get dof numbers @@ -1439,6 +1461,7 @@ class ScalingForSystemSolutionKernelFactory createAndLaunch( real64 const maxRelativePresChange, real64 const maxAbsolutePresChange, real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, globalIndex const rankOffset, integer const numComp, string const dofKey, @@ -1453,7 +1476,7 @@ class ScalingForSystemSolutionKernelFactory subRegion.getField< fields::flow::pressureScalingFactor >(); arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); - ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, rankOffset, + ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, maxRelativeCompDensChange, rankOffset, numComp, dofKey, subRegion, localSolution, pressure, compDens, pressureScalingFactor, compDensScalingFactor ); return ScalingForSystemSolutionKernel::launch< POLICY >( subRegion.size(), kernel ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp index 8df182ad30e..c79344410e6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -522,8 +522,10 @@ class ScalingForSystemSolutionKernel : public isothermalCompositionalMultiphaseB /** * @brief Create a new kernel instance * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change * @param[in] maxRelativeTempChange the max allowed relative temperature change * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompDensChange the max allowed comp density change * @param[in] rankOffset the rank offset * @param[in] numComp the number of components * @param[in] dofKey the dof key to get dof numbers @@ -540,6 +542,7 @@ class ScalingForSystemSolutionKernel : public isothermalCompositionalMultiphaseB real64 const maxAbsolutePresChange, real64 const maxRelativeTempChange, real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, globalIndex const rankOffset, integer const numComp, string const dofKey, @@ -554,6 +557,7 @@ class ScalingForSystemSolutionKernel : public isothermalCompositionalMultiphaseB : Base( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, + maxRelativeCompDensChange, rankOffset, numComp, dofKey, @@ -646,8 +650,10 @@ class ScalingForSystemSolutionKernelFactory * @brief Create a new kernel and launch * @tparam POLICY the policy used in the RAJA kernel * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change * @param[in] maxRelativeTempChange the max allowed relative temperature change * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompdensChange the max allowed relative component density change * @param[in] rankOffset the rank offset * @param[in] numComp the number of components * @param[in] dofKey the dof key to get dof numbers @@ -660,6 +666,7 @@ class ScalingForSystemSolutionKernelFactory real64 const maxAbsolutePresChange, real64 const maxRelativeTempChange, real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, globalIndex const rankOffset, integer const numComp, string const dofKey, @@ -672,7 +679,8 @@ class ScalingForSystemSolutionKernelFactory arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::flow::pressureScalingFactor >(); arrayView1d< real64 > temperatureScalingFactor = subRegion.getField< fields::flow::temperatureScalingFactor >(); arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); - ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxRelativeTempChange, maxCompFracChange, + ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxRelativeTempChange, + maxCompFracChange, maxRelativeCompDensChange, rankOffset, numComp, dofKey, subRegion, localSolution, pressure, temperature, compDens, pressureScalingFactor, temperatureScalingFactor, compDensScalingFactor ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 6872d40322c..572f6332645 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -84,6 +84,12 @@ CompositionalMultiphaseWell::CompositionalMultiphaseWell( const string & name, setApplyDefaultValue( 1.0 ). setDescription( "Maximum (absolute) change in a component fraction between two Newton iterations" ); + this->registerWrapper( viewKeyStruct::maxRelativeCompDensChangeString(), &m_maxRelativeCompDensChange ). + setSizedFromParent( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( LvArray::NumericLimits< real64 >::max ). // disabled by default + setDescription( "Maximum (relative) change in a component density between two Newton iterations" ); + this->registerWrapper( viewKeyStruct::maxRelativePresChangeString(), &m_maxRelativePresChange ). setSizedFromParent( 0 ). setInputFlag( InputFlags::OPTIONAL ). @@ -114,6 +120,9 @@ void CompositionalMultiphaseWell::postProcessInput() getWrapperDataContext( viewKeyStruct::maxCompFracChangeString() ) << ": The maximum absolute change in component fraction must larger or equal to 0.0" ); + GEOS_ERROR_IF_LE_MSG( m_maxRelativeCompDensChange, 0.0, + getWrapperDataContext( viewKeyStruct::maxRelativeCompDensChangeString() ) << + ": The maximum relative change in component density must be larger than 0.0" ); } void CompositionalMultiphaseWell::registerDataOnMesh( Group & meshBodies ) @@ -1279,6 +1288,7 @@ CompositionalMultiphaseWell::scalingForSystemSolution( DomainPartition & domain, createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxCompFracChange, + m_maxRelativeCompDensChange, dofManager.rankOffset(), m_numComponents, wellDofKey, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp index 9bb2d9aa897..05cffcbff85 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -286,6 +286,8 @@ class CompositionalMultiphaseWell : public WellSolverBase static constexpr char const * maxAbsolutePresChangeString() { return "maxAbsolutePressureChange"; } + static constexpr char const * maxRelativeCompDensChangeString() { return "maxRelativeCompDensChange"; } + static constexpr char const * allowLocalCompDensChoppingString() { return CompositionalMultiphaseBase::viewKeyStruct::allowLocalCompDensChoppingString(); } // control data (not registered on the mesh) @@ -394,6 +396,9 @@ class CompositionalMultiphaseWell : public WellSolverBase /// maximum (absolute) change in pressure between two Newton iterations real64 m_maxAbsolutePresChange; + /// maximum (relative) change in component density between two Newton iterations + real64 m_maxRelativeCompDensChange; + /// minimum value of the scaling factor obtained by enforcing maxCompFracChange real64 m_minScalingFactor; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp index b35d807124d..9f7466b2758 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp @@ -917,7 +917,9 @@ class ScalingForSystemSolutionKernelFactory * @brief Create a new kernel and launch * @tparam POLICY the policy used in the RAJA kernel * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompDensChange the max allowed relative comp density change * @param[in] rankOffset the rank offset * @param[in] numComp the number of components * @param[in] dofKey the dof key to get dof numbers @@ -929,6 +931,7 @@ class ScalingForSystemSolutionKernelFactory createAndLaunch( real64 const maxRelativePresChange, real64 const maxAbsolutePresChange, real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, globalIndex const rankOffset, integer const numComp, string const dofKey, @@ -944,7 +947,7 @@ class ScalingForSystemSolutionKernelFactory arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::well::globalCompDensityScalingFactor >(); isothermalCompositionalMultiphaseBaseKernels:: - ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, rankOffset, + ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, maxRelativeCompDensChange, rankOffset, numComp, dofKey, subRegion, localSolution, pressure, compDens, pressureScalingFactor, compDensScalingFactor ); return isothermalCompositionalMultiphaseBaseKernels:: ScalingForSystemSolutionKernel:: From 949a758cc804b6d567f765f08be78d133ac8b61a Mon Sep 17 00:00:00 2001 From: Matteo Frigo <43966286+matteofrigo5@users.noreply.github.com> Date: Wed, 19 Jun 2024 09:34:56 -0700 Subject: [PATCH 102/286] Augmented Lagrangian (stick mode) - InterfaceKernelBase - Bubble Functions (#3130) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../ALM_stickFault_base.xml | 112 ++ .../ALM_stickFault_vertical_smoke.xml | 110 ++ inputFiles/almContactMechanics/alm.ats | 20 + .../finiteElement/CMakeLists.txt | 1 + .../finiteElement/FiniteElementDispatch.hpp | 4 +- ...H1_Hexahedron_Lagrange1_GaussLegendre2.hpp | 89 ++ .../H1_Pyramid_Lagrange1_Gauss5.hpp | 62 + ...rilateralFace_Lagrange1_GaussLegendre2.hpp | 45 + .../H1_Tetrahedron_Lagrange1_Gauss1.hpp | 120 ++ .../H1_TriangleFace_Lagrange1_Gauss1.hpp | 50 + .../H1_Wedge_Lagrange1_Gauss6.hpp | 62 + .../elementFormulations/LagrangeBasis1.hpp | 119 ++ .../kernelInterface/InterfaceKernelBase.hpp | 305 ++++ .../mesh/CellElementSubRegion.cpp | 4 + .../mesh/CellElementSubRegion.hpp | 38 + .../physicsSolvers/CMakeLists.txt | 8 + .../physicsSolvers/contact/ContactFields.hpp | 16 + .../SolidMechanicsALMBubbleKernels.hpp | 448 ++++++ .../SolidMechanicsALMJumpUpdateKernels.hpp | 275 ++++ .../contact/SolidMechanicsALMKernels.hpp | 430 ++++++ .../contact/SolidMechanicsALMKernelsBase.hpp | 273 ++++ .../SolidMechanicsALMKernelsHelper.hpp | 82 + ...lidMechanicsAugmentedLagrangianContact.cpp | 1344 +++++++++++++++++ ...lidMechanicsAugmentedLagrangianContact.hpp | 174 +++ .../solidMechanics/SolidMechanicsFields.hpp | 16 + 27 files changed, 4211 insertions(+), 2 deletions(-) create mode 100644 inputFiles/almContactMechanics/ALM_stickFault_base.xml create mode 100644 inputFiles/almContactMechanics/ALM_stickFault_vertical_smoke.xml create mode 100644 inputFiles/almContactMechanics/alm.ats create mode 100644 src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 5014bcd9516..7df56f3905f 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3160-5651-0cad939 + baseline: integratedTests/baseline_integratedTests-pr3130-5671-b19ba86 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 5c9f11ef6d4..1de0f14e95a 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3130 (2024-06-19) +====================== +New solver for contact mechanics based on the Augmented Lagrangian Method (ALM). New test case added. + PR #3160 (2024-06-18) ====================== Two experimental options for compositional flow solver. Rebaseline because of the new input flags. diff --git a/inputFiles/almContactMechanics/ALM_stickFault_base.xml b/inputFiles/almContactMechanics/ALM_stickFault_base.xml new file mode 100644 index 00000000000..6f041f35830 --- /dev/null +++ b/inputFiles/almContactMechanics/ALM_stickFault_base.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/almContactMechanics/ALM_stickFault_vertical_smoke.xml b/inputFiles/almContactMechanics/ALM_stickFault_vertical_smoke.xml new file mode 100644 index 00000000000..4eb31ff467b --- /dev/null +++ b/inputFiles/almContactMechanics/ALM_stickFault_vertical_smoke.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/almContactMechanics/alm.ats b/inputFiles/almContactMechanics/alm.ats new file mode 100644 index 00000000000..2ce013a6bd2 --- /dev/null +++ b/inputFiles/almContactMechanics/alm.ats @@ -0,0 +1,20 @@ +import os +import geos_ats +from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests + +restartcheck_params = {} +restartcheck_params["atol"] = 2.0E-4 +restartcheck_params["rtol"] = 1.0E-7 + +decks = [ + TestDeck( + name="ALM_stickFault_vertical_smoke", + description= + "Cube with a vertical fracture (structured grid)", + partitions=((1, 1, 1), (2, 2, 2)), + restart_step=1, + check_step=2, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), +] + +generate_geos_tests(decks) diff --git a/src/coreComponents/finiteElement/CMakeLists.txt b/src/coreComponents/finiteElement/CMakeLists.txt index d8ade51e37e..794f2a0384f 100644 --- a/src/coreComponents/finiteElement/CMakeLists.txt +++ b/src/coreComponents/finiteElement/CMakeLists.txt @@ -22,6 +22,7 @@ set( finiteElement_headers elementFormulations/LagrangeBasis2.hpp elementFormulations/LagrangeBasis3GL.hpp elementFormulations/LagrangeBasis5GL.hpp + kernelInterface/InterfaceKernelBase.hpp kernelInterface/ImplicitKernelBase.hpp kernelInterface/KernelBase.hpp kernelInterface/SparsityKernelBase.hpp diff --git a/src/coreComponents/finiteElement/FiniteElementDispatch.hpp b/src/coreComponents/finiteElement/FiniteElementDispatch.hpp index 01ac7d1f49d..dc144e78e1d 100644 --- a/src/coreComponents/finiteElement/FiniteElementDispatch.hpp +++ b/src/coreComponents/finiteElement/FiniteElementDispatch.hpp @@ -86,9 +86,11 @@ #define FE_TYPES_2D \ - finiteElement::H1_QuadrilateralFace_Lagrange1_GaussLegendre2 \ + finiteElement::H1_QuadrilateralFace_Lagrange1_GaussLegendre2, \ finiteElement::H1_TriangleFace_Lagrange1_Gauss1 +#define BASE_FE_TYPES_2D FE_TYPES_2D + namespace geos { namespace finiteElement diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp index fe93d494822..1475efbbbb6 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp @@ -75,6 +75,10 @@ class H1_Hexahedron_Lagrange1_GaussLegendre2 final : public FiniteElementBase public: /// The number of nodes/support points per element. constexpr static localIndex numNodes = LagrangeBasis1::TensorProduct3D::numSupportPoints; + + /// The number of faces/support points for bubble functions per element. + constexpr static localIndex numFaces = LagrangeBasis1::TensorProduct3D::numSupportFaces; + /// The maximum number of support points per element. constexpr static localIndex maxSupportPoints = numNodes; @@ -209,6 +213,42 @@ class H1_Hexahedron_Lagrange1_GaussLegendre2 final : public FiniteElementBase return calcN( q, N ); } + /** + * @brief Calculate face bubble functions values for each face at a + * given point in the parent space. + * @param pointCoord coordinates of the given point. + * @param N An array to pass back the shape function values for each support + * face. + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void calcFaceBubbleN( real64 const (&pointCoord)[3], + real64 (& N)[numFaces] ) + { + LagrangeBasis1::TensorProduct3D::valueFaceBubble( pointCoord, N ); + } + + /** + * @brief Calculate face bubble functions values for each face at a + * quadrature point. + * @param q Index of the quadrature point. + * @param N An array to pass back the shape function values for each support + * point. + */ + GEOS_HOST_DEVICE + inline + static void calcFaceBubbleN( localIndex const q, + real64 (& N)[numFaces] ) + { + int qa, qb, qc; + LagrangeBasis1::TensorProduct3D::multiIndex( q, qa, qb, qc ); + real64 const qCoords[3] = { quadratureFactor * LagrangeBasis1::parentSupportCoord( qa ), + quadratureFactor * LagrangeBasis1::parentSupportCoord( qb ), + quadratureFactor * LagrangeBasis1::parentSupportCoord( qc ) }; + + calcFaceBubbleN( qCoords, N ); + } + /** * @brief Calculate the shape functions derivatives wrt the physical * coordinates. @@ -240,6 +280,20 @@ class H1_Hexahedron_Lagrange1_GaussLegendre2 final : public FiniteElementBase StackVariables const & stack, real64 ( &gradN )[numNodes][3] ); + /** + * @brief Calculate the bubble function derivatives wrt the physical + * coordinates. + * @param q Index of the quadrature point. + * @param X Array containing the coordinates of the support points. + * @param gradN Array to contain the shape bubble function derivatives for all + * support points at the coordinates of the quadrature point @p q. + * @return The determinant of the parent/physical transformation matrix. + */ + GEOS_HOST_DEVICE + static real64 calcGradFaceBubbleN( localIndex const q, + real64 const (&X)[numNodes][3], + real64 ( &gradN )[numFaces][3] ); + /** * @brief Calculate the integration weights for a quadrature point. * @param q Index of the quadrature point. @@ -573,6 +627,41 @@ real64 H1_Hexahedron_Lagrange1_GaussLegendre2:: return calcGradN( q, X, gradN ); } +GEOS_HOST_DEVICE +inline +real64 +H1_Hexahedron_Lagrange1_GaussLegendre2::calcGradFaceBubbleN( localIndex const q, + real64 const (&X)[numNodes][3], + real64 (& gradN)[numFaces][3] ) +{ + real64 J[3][3] = {{0}}; + + + int qa, qb, qc; + LagrangeBasis1::TensorProduct3D::multiIndex( q, qa, qb, qc ); + + jacobianTransformation( qa, qb, qc, X, J ); + + real64 const detJ = LvArray::tensorOps::invert< 3 >( J ); + + real64 dNdXi[numFaces][3] = {{0}}; + + real64 const qCoords[3] = { quadratureFactor * LagrangeBasis1::parentSupportCoord( qa ), + quadratureFactor * LagrangeBasis1::parentSupportCoord( qb ), + quadratureFactor * LagrangeBasis1::parentSupportCoord( qc ) }; + + LagrangeBasis1::TensorProduct3D::gradientFaceBubble( qCoords, dNdXi ); + + for( int fi=0; fi +class InterfaceKernelBase : public ImplicitKernelBase< FaceElementSubRegion, + CONSTITUTIVE_TYPE, + FE_TYPE, + NUM_DOF_PER_TEST_SP, + NUM_DOF_PER_TRIAL_SP > +{ +public: + + /// Alias for the base class, i.e., geos::finiteElement::ImplicitKernelBase) + using Base = ImplicitKernelBase< FaceElementSubRegion, + CONSTITUTIVE_TYPE, + FE_TYPE, + NUM_DOF_PER_TEST_SP, + NUM_DOF_PER_TRIAL_SP >; + + using Base::m_dofNumber; + using Base::m_dofRankOffset; + using Base::m_matrix; + + /** + * @brief Constructor + * @copydoc geos::finiteElement::ImplicitKernelBase::ImplicitKernelBase + */ + InterfaceKernelBase( NodeManager const & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + FaceElementSubRegion & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + arrayView1d< globalIndex const > const inputDofNumber, + globalIndex const rankOffset, + CRSMatrixView< real64, globalIndex const > const inputMatrix, + arrayView1d< real64 > const inputRhs, + real64 const inputDt ): + Base( nodeManager, + edgeManager, + faceManager, + targetRegionIndex, + elementSubRegion, + finiteElementSpace, + inputConstitutiveType, + inputDofNumber, + rankOffset, + inputMatrix, + inputRhs, + inputDt ) + {} + + //*************************************************************************** + /** + * @copydoc finiteElement::KernelBase::StackVariables + */ + struct StackVariables + {}; + +}; + +/** + * @class InterfaceKernelFactory + * @brief Used to forward arguments to a class that implements the InterfaceKernelBase interface. + * @tparam KERNEL_TYPE The template class to construct, should implement the InterfaceKernelBase interface. + * @tparam ARGS The arguments used to construct a @p KERNEL_TYPE in addition to the standard arguments. + */ +template< template< typename CONSTITUTIVE_TYPE, + typename FE_TYPE > class KERNEL_TYPE, + typename ... ARGS > +class InterfaceKernelFactory +{ +public: + + /** + * @brief Initialize the factory. + * @param args The arguments used to construct a @p KERNEL_TYPE in addition to the standard arguments. + */ + InterfaceKernelFactory( ARGS ... args ): + m_args( args ... ) + {} + + /** + * @brief Create a new kernel with the given standard arguments. + * @tparam CONSTITUTIVE_TYPE The type of @p inputConstitutiveType. + * @tparam FE_TYPE The type of @p finiteElementSpace. + * @param nodeManager The node manager. + * @param edgeManager The edge manager. + * @param faceManager The face manager. + * @param targetRegionIndex The target region index. + * @param elementSubRegion The subregion to execute on. + * @param finiteElementSpace The finite element space. + * @param inputConstitutiveType The constitutive relation. + * @return A new kernel constructed with the given arguments and @c ARGS. + */ + template< typename CONSTITUTIVE_TYPE, typename FE_TYPE > + KERNEL_TYPE< CONSTITUTIVE_TYPE, FE_TYPE > createKernel( + NodeManager & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + FaceElementSubRegion & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType ) + { + camp::tuple< NodeManager &, + EdgeManager const &, + FaceManager const &, + localIndex const, + FaceElementSubRegion &, + FE_TYPE const &, + CONSTITUTIVE_TYPE & > standardArgs { nodeManager, + edgeManager, + faceManager, + targetRegionIndex, + elementSubRegion, + finiteElementSpace, + inputConstitutiveType }; + + auto allArgs = camp::tuple_cat_pair( standardArgs, m_args ); + return camp::make_from_tuple< KERNEL_TYPE< CONSTITUTIVE_TYPE, FE_TYPE > >( allArgs ); + + } + +private: + /// The arguments to append to the standard kernel constructor arguments. + camp::tuple< ARGS ... > m_args; +}; + +//***************************************************************************** + +//START_interfaceBasedKernelApplication +/** + * @brief Performs a loop over FaceElementSubRegion and calls a kernel launch + * with compile time knowledge of sub-loop bounds such as number of nodes and + * quadrature points per element. + * @tparam POLICY The RAJA launch policy to pass to the kernel launch. + * @tparam CONSTITUTIVE_BASE The common base class for constitutive pass-thru/dispatch which gives the kernel + * launch compile time knowledge of the constitutive model. + * @tparam KERNEL_FACTORY The type of @p interfaceKernelFactory, typically an instantiation of @c InterfaceKernelFactory, and + * must adhere to that interface. + * @param mesh The MeshLevel object. + * @param targetRegionName The names of the target regions to apply the @p KERNEL_TEMPLATE. + * @param faceElementList List of element of the same type belongs to FaceElementSubRegion. + * @param subRegionFE Finite element object. + * @param constitutiveStringName Key string used to retrieve the constitutive model. + * @param interfaceKernelFactory The object used to construct the kernel. + * @return The maximum contribution to the residual, which may be used to scale the residual. + * + * @details Loops over all regions Applies/Launches a kernel specified by the @p KERNEL_TEMPLATE through + * #::geos::finiteElement::KernelBase::kernelLaunch(). + */ +template< typename POLICY, + typename CONSTITUTIVE_BASE, + typename KERNEL_FACTORY > +static +real64 interfaceBasedKernelApplication( MeshLevel & mesh, + string const & targetRegionName, + arrayView1d< localIndex const > const & faceElementList, + FiniteElementBase const & subRegionFE, + string const & constitutiveStringName, + KERNEL_FACTORY & interfaceKernelFactory ) +{ + GEOS_MARK_FUNCTION; + + + // save the maximum residual contribution for scaling residuals for convergence criteria. + real64 maxResidualContribution = 0; + + NodeManager & nodeManager = mesh.getNodeManager(); + EdgeManager & edgeManager = mesh.getEdgeManager(); + FaceManager & faceManager = mesh.getFaceManager(); + ElementRegionManager & elementManager = mesh.getElemManager(); + + SurfaceElementRegion & region = elementManager.getRegion< SurfaceElementRegion >( targetRegionName ); + FaceElementSubRegion & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + localIndex const targetRegionIndex = 0; + + // Get the constitutive model...and allocate a null constitutive model if required. + constitutive::ConstitutiveBase * constitutiveRelation = nullptr; + constitutive::NullModel * nullConstitutiveModel = nullptr; + if( subRegion.template hasWrapper< string >( constitutiveStringName ) ) + { + string const & constitutiveName = subRegion.template getReference< string >( constitutiveStringName ); + constitutiveRelation = &subRegion.template getConstitutiveModel( constitutiveName ); + } + else + { + nullConstitutiveModel = &subRegion.template registerGroup< constitutive::NullModel >( "nullModelGroup" ); + constitutiveRelation = nullConstitutiveModel; + } + + localIndex const numElems = faceElementList.size(); + + // Call the constitutive dispatch which converts the type of constitutive model into a compile time constant. + constitutive::ConstitutivePassThru< CONSTITUTIVE_BASE >::execute( *constitutiveRelation, + [&maxResidualContribution, + &nodeManager, + &edgeManager, + &faceManager, + targetRegionIndex, + &interfaceKernelFactory, + &subRegion, + &subRegionFE, + numElems] + ( auto & castedConstitutiveRelation ) + { + + finiteElement::FiniteElementDispatchHandler< SELECTED_FE_TYPES_2D >::dispatch2D( subRegionFE, + [&maxResidualContribution, + &nodeManager, + &edgeManager, + &faceManager, + targetRegionIndex, + &interfaceKernelFactory, + &subRegion, + numElems, + &castedConstitutiveRelation] ( auto const finiteElement ) + + { + auto kernel = interfaceKernelFactory.createKernel( nodeManager, + edgeManager, + faceManager, + targetRegionIndex, + subRegion, + finiteElement, + castedConstitutiveRelation ); + + using KERNEL_TYPE = decltype( kernel ); + + // Call the kernelLaunch function, and store the maximum contribution to the residual. + maxResidualContribution = + std::max( maxResidualContribution, + KERNEL_TYPE::template kernelLaunch< POLICY, KERNEL_TYPE >( numElems, kernel ) ); + + } ); + } ); + + // Remove the null constitutive model (not required, but cleaner) + if( nullConstitutiveModel ) + { + subRegion.deregisterGroup( "nullModelGroup" ); + } + + return maxResidualContribution; +} +//END_interfaceBasedKernelApplication + +} // namespace finiteElement +} // namespace geos + +#endif /* GEOS_FINITEELEMENT_INTERFACEKERNELBASE_HPP_ */ diff --git a/src/coreComponents/mesh/CellElementSubRegion.cpp b/src/coreComponents/mesh/CellElementSubRegion.cpp index 550b3614871..05b0203266d 100644 --- a/src/coreComponents/mesh/CellElementSubRegion.cpp +++ b/src/coreComponents/mesh/CellElementSubRegion.cpp @@ -44,6 +44,10 @@ CellElementSubRegion::CellElementSubRegion( string const & name, Group * const p registerWrapper( viewKeyStruct::fracturedCellsString(), &m_fracturedCells ).setSizedFromParent( 1 ); + registerWrapper( viewKeyStruct::bubbleCellsString(), &m_bubbleCells ).setSizedFromParent( 0 ); + + registerWrapper( viewKeyStruct::toFaceElementsString(), &m_toFaceElements ).setSizedFromParent( 0 ); + excludeWrappersFromPacking( { viewKeyStruct::nodeListString(), viewKeyStruct::edgeListString(), viewKeyStruct::faceListString(), diff --git a/src/coreComponents/mesh/CellElementSubRegion.hpp b/src/coreComponents/mesh/CellElementSubRegion.hpp index 37e6c3537e2..43061e0fe5b 100644 --- a/src/coreComponents/mesh/CellElementSubRegion.hpp +++ b/src/coreComponents/mesh/CellElementSubRegion.hpp @@ -191,6 +191,10 @@ class CellElementSubRegion : public ElementSubRegionBase static constexpr char const * toEmbSurfString() { return "ToEmbeddedSurfaces"; } /// @return String key to fracturedCells static constexpr char const * fracturedCellsString() { return "fracturedCells"; } + /// @return String key to bubbleCells + static constexpr char const * bubbleCellsString() { return "bubbleCells"; } + /// @return String key to toFaceElements + static constexpr char const * toFaceElementsString() { return "toFaceElements"; } /// ViewKey for the constitutive grouping dataRepository::ViewKey constitutiveGrouping = { constitutiveGroupingString() }; @@ -315,6 +319,32 @@ class CellElementSubRegion : public ElementSubRegionBase */ EmbSurfMapType const & embeddedSurfacesList() const { return m_toEmbeddedSurfaces; } + /** + * @brief Set the array of bubble elements. + * @param[in] bubbleCells The array of bubble elements. + */ + void setBubbleElementsList( arrayView1d< localIndex const > const bubbleCells ) + { m_bubbleCells = bubbleCells; } + + /** + * @brief @return The array view of bubble elements. + */ + arrayView1d< localIndex const > const bubbleElementsList() const + { return m_bubbleCells.toViewConst(); } + + /** + * @brief Set the array of neighboring face elements. + * @param[in] faceElemsList The array of neighboring face elements. + */ + void setFaceElementsList( arrayView2d< localIndex const > const faceElemsList ) + { m_toFaceElements = faceElemsList; } + + /** + * @brief @return The array of neighboring face elements. + */ + arrayView2d< localIndex const > const faceElementsList() const + { return m_toFaceElements.toViewConst(); } + /** * @brief Compute the center of each element in the subregion. * @param[in] X an arrayView of (const) node positions @@ -379,6 +409,14 @@ class CellElementSubRegion : public ElementSubRegionBase /// Map from local Cell Elements to Embedded Surfaces EmbSurfMapType m_toEmbeddedSurfaces; + /// List of the elements adjacent to faceElement (useful for bubble elements) + array1d< localIndex > m_bubbleCells; + + /// List of face IDs adjacent to faceElement (useful for bubble elements). + /// A 2D array is needed to store both the face ID in the physical space + /// and the corresponding face ID in the parent element space. + array2d< localIndex > m_toFaceElements; + /** * @brief Pack element-to-node and element-to-face maps * @tparam DO_PACKING the flag for the bufferOps::Pack function diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index 499615347e7..10cc92b20e3 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -15,6 +15,12 @@ set( physicsSolvers_headers contact/SolidMechanicsEFEMKernelsHelper.hpp contact/SolidMechanicsEmbeddedFractures.hpp contact/SolidMechanicsLagrangeContact.hpp + contact/SolidMechanicsAugmentedLagrangianContact.hpp + contact/SolidMechanicsALMKernelsBase.hpp + contact/SolidMechanicsALMKernels.hpp + contact/SolidMechanicsALMKernelsHelper.hpp + contact/SolidMechanicsALMJumpUpdateKernels.hpp + contact/SolidMechanicsALMBubbleKernels.hpp fluidFlow/CompositionalMultiphaseBase.hpp fluidFlow/CompositionalMultiphaseBaseFields.hpp fluidFlow/CompositionalMultiphaseStatistics.hpp @@ -108,6 +114,7 @@ set( physicsSolvers_headers simplePDE/PhaseFieldDamageFEMKernels.hpp solidMechanics/SolidMechanicsFields.hpp solidMechanics/SolidMechanicsLagrangianFEM.hpp + solidMechanics/SolidMechanicsLagrangianFEM.hpp solidMechanics/SolidMechanicsLagrangianSSLE.hpp solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp solidMechanics/SolidMechanicsMPM.hpp @@ -170,6 +177,7 @@ set( physicsSolvers_sources contact/ContactSolverBase.cpp contact/SolidMechanicsEmbeddedFractures.cpp contact/SolidMechanicsLagrangeContact.cpp + contact/SolidMechanicsAugmentedLagrangianContact.cpp fluidFlow/CompositionalMultiphaseBase.cpp fluidFlow/CompositionalMultiphaseFVM.cpp fluidFlow/CompositionalMultiphaseStatistics.cpp diff --git a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp index 32cbfe32d1d..748eb55f1d2 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp @@ -49,6 +49,22 @@ struct FractureState }; }; +DECLARE_FIELD( penalty, + "penalty", + array2d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Penalty coefficients" ); + +DECLARE_FIELD( rotationMatrix, + "rotationMatrix", + array3d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "An array that holds the rotation matrices on the fracture" ); + DECLARE_FIELD( dispJump, "displacementJump", array2d< real64 >, diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp new file mode 100644 index 00000000000..5c3052a8ae7 --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp @@ -0,0 +1,448 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SolidMechanicsALMBubbleKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMBUBBLEKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMBUBBLEKERNELS_HPP_ + +#include "physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp" +#include "SolidMechanicsALMKernelsHelper.hpp" + +// TODO: Use the bilinear form utilities +//#include "finiteElement/BilinearFormUtilities.hpp" + +namespace geos +{ + +namespace solidMechanicsALMKernels +{ + +/** + * @brief Implements kernels for solving quasi-static equilibrium. + * @copydoc geos::finiteElement::ImplicitKernelBase + * + */ +template< typename SUBREGION_TYPE, + typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +class ALMBubbleKernels : + public solidMechanicsLagrangianFEMKernels::ImplicitSmallStrainQuasiStatic< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE > +{ +public: + /// Alias for the base class; + using Base = solidMechanicsLagrangianFEMKernels::ImplicitSmallStrainQuasiStatic< SUBREGION_TYPE, + CONSTITUTIVE_TYPE, + FE_TYPE >; + + /// Number of nodes per element, which is equal to the + /// numTestSupportPointPerElem and numTrialSupportPointPerElem by definition. + static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; + + /// Compile time value for the number of faces per element. + static constexpr int numFacesPerElem = FE_TYPE::numFaces; + + /// Compile time value for the number of quadrature points per element. + static constexpr int numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + + using Base::m_X; + using Base::m_elemsToNodes; + using Base::m_finiteElementSpace; + using Base::m_constitutiveUpdate; + using Base::m_dofNumber; + using Base::m_dofRankOffset; + using Base::m_matrix; + using Base::m_rhs; + using Base::m_disp; + + /** + * @brief Constructor + * @copydoc geos::finiteElement::ImplicitKernelBase::ImplicitKernelBase + */ + ALMBubbleKernels( NodeManager const & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + SUBREGION_TYPE const & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + arrayView1d< globalIndex const > const uDofNumber, + arrayView1d< globalIndex const > const bDofNumber, + globalIndex const rankOffset, + CRSMatrixView< real64, globalIndex const > const inputMatrix, + arrayView1d< real64 > const inputRhs, + real64 const inputDt, + real64 const (&inputGravityVector)[3] ): + Base( nodeManager, + edgeManager, + faceManager, + targetRegionIndex, + elementSubRegion, + finiteElementSpace, + inputConstitutiveType, + uDofNumber, + rankOffset, + inputMatrix, + inputRhs, + inputDt, + inputGravityVector ), + m_bubbleDisp( faceManager.getField< fields::solidMechanics::totalBubbleDisplacement >().toViewConst() ), + m_bDofNumber( bDofNumber ), + m_bubbleElems( elementSubRegion.bubbleElementsList() ), + m_elemsToFaces( elementSubRegion.faceElementsList() ) + {} + + //*************************************************************************** + + /** + * @copydoc finiteElement::ImplicitKernelBase::StackVariables + */ + struct StackVariables + { +public: + /// The number of displacement dofs per element. + static constexpr int numUdofs = numNodesPerElem * 3; + + /// The number of jump dofs per element. + static constexpr int numBubbleUdofs = numFacesPerElem * 3; + + /** + * Default constructor + */ + GEOS_HOST_DEVICE + StackVariables(): + dispEqnRowIndices{}, + dispColIndices{}, + bEqnRowIndices{}, + bColIndices{}, + localRu{}, + localRb{}, + localAbb{ {} }, + localAbu{ {} }, + localAub{ {} }, + bLocal{}, + uLocal{}, + X{ {} }, + constitutiveStiffness{ {} } + {} + + /// C-array storage for the element local row degrees of freedom. + globalIndex dispEqnRowIndices[numUdofs]; + + /// C-array storage for the element local column degrees of freedom. + globalIndex dispColIndices[numUdofs]; + + /// C-array storage for the element local row degrees of freedom. + globalIndex bEqnRowIndices[3]; + + /// C-array storage for the element local column degrees of freedom. + globalIndex bColIndices[3]; + + /// C-array storage for the element local Ru residual vector. + real64 localRu[numUdofs]; + + /// C-array storage for the element local Rb residual vector. + real64 localRb[numBubbleUdofs]; + + /// C-array storage for the element local Abb matrix. + real64 localAbb[numBubbleUdofs][numBubbleUdofs]; + + /// C-array storage for the element local Abu matrix. + real64 localAbu[numBubbleUdofs][numUdofs]; + + /// C-array storage for the element local Aub matrix. + real64 localAub[numUdofs][numBubbleUdofs]; + + /// Stack storage for the element local bubble vector + real64 bLocal[3]; + + /// Stack storage for the element displacement vector. + real64 uLocal[numUdofs]; + + /// local nodal coordinates + real64 X[ numNodesPerElem ][ 3 ]; + + /// Stack storage for the constitutive stiffness at a quadrature point. + real64 constitutiveStiffness[ 6 ][ 6 ]; + + }; + + //*************************************************************************** + + /** + * @copydoc ::geos::finiteElement::KernelBase::kernelLaunch + * + * @detail it uses the kernelLaunch interface of KernelBase but it only launches the kernel + * on the set of elements that have bubble dof within the subregion. + * + */ + //START_kernelLauncher + template< typename POLICY, + typename KERNEL_TYPE > + static + real64 + kernelLaunch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + + GEOS_MARK_FUNCTION; + GEOS_UNUSED_VAR( numElems ); + + // Define a RAJA reduction variable to get the maximum residual contribution. + RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxResidual( 0 ); + + forAll< POLICY >( kernelComponent.m_bubbleElems.size(), + [=] GEOS_HOST_DEVICE ( localIndex const i ) + { + typename KERNEL_TYPE::StackVariables stack; + + kernelComponent.setup( i, stack ); + for( integer q=0; q( dBubbleNdX, 0 ); //make 0 + + real64 detJ = m_finiteElementSpace.calcGradFaceBubbleN( q, stack.X, dBubbleNdX ); + + real64 dNdX[ numNodesPerElem ][ 3 ]; + detJ = m_finiteElementSpace.calcGradN( q, stack.X, dNdX ); + + m_constitutiveUpdate.getElasticStiffness( k, q, stack.constitutiveStiffness ); + + real64 strainMatrix[6][nUdof]; + solidMechanicsALMKernelsHelper::assembleStrainOperator< 6, nUdof, numNodesPerElem >( strainMatrix, dNdX ); + + real64 strainBubbleMatrix[6][nBubbleUdof]; + solidMechanicsALMKernelsHelper::assembleStrainOperator< 6, nBubbleUdof, numFacesPerElem >( strainBubbleMatrix, dBubbleNdX ); + + // TODO: Use the following functions + //using namespace PDEUtilities; + //constexpr FunctionSpace displacementTrialSpace = FE_TYPE::template getFunctionSpace< numDofPerTrialSupportPoint >(); + //constexpr FunctionSpace displacementTestSpace = displacementTrialSpace; + //real64 Abb_bilinear[nBubbleUdof][nBubbleUdof]; + //BilinearFormUtilities::compute< displacementTrialSpace, + // displacementTestSpace, + // DifferentialOperator::SymmetricGradient, + // DifferentialOperator::SymmetricGradient > + //( + // Abb_bilinear, + // dBubbleNdX, + // stack.constitutiveStiffness, // fourth-order tensor handled via DiscretizationOps + // dBubbleNdX, + // -detJ ); + + + //LinearFormUtilities::compute< displacementTestSpace, + // DifferentialOperator::Identity > + //( + //stack.localResidualMomentum, + //N, + //stack.bodyForce, + //detJxW ); + + real64 matBD[nBubbleUdof][6]; + real64 Abb_gauss[nBubbleUdof][nBubbleUdof], Abu_gauss[nBubbleUdof][nUdof], Aub_gauss[nUdof][nBubbleUdof]; + + // transp(Bb)D + LvArray::tensorOps::Rij_eq_AkiBkj< nBubbleUdof, 6, 6 >( matBD, strainBubbleMatrix, stack.constitutiveStiffness ); + + // transp(Bb)DB + LvArray::tensorOps::Rij_eq_AikBkj< nBubbleUdof, nUdof, 6 >( Abu_gauss, matBD, strainMatrix ); + + // transp(Bb)DBb + LvArray::tensorOps::Rij_eq_AikBkj< nBubbleUdof, nBubbleUdof, 6 >( Abb_gauss, matBD, strainBubbleMatrix ); + + // transp(B)DBb + tensorOps::transpose< nUdof, nBubbleUdof >( Aub_gauss, Abu_gauss ); + + // multiply by determinant and add to element matrix + LvArray::tensorOps::scaledAdd< nBubbleUdof, nBubbleUdof >( stack.localAbb, Abb_gauss, -detJ ); + LvArray::tensorOps::scaledAdd< nBubbleUdof, nUdof >( stack.localAbu, Abu_gauss, -detJ ); + LvArray::tensorOps::scaledAdd< nUdof, nBubbleUdof >( stack.localAub, Aub_gauss, -detJ ); + + } + + GEOS_HOST_DEVICE + inline + real64 complete( localIndex const kk, + StackVariables & stack ) const + { + + real64 maxForce = 0; + constexpr int nUdof = numNodesPerElem*3; + + localIndex const parentFaceIndex = m_elemsToFaces[kk][1]; + + // Extract only the submatrix and known term corresponding to the index of the local face + // on which the bubble function was applied. + real64 localAub[nUdof][3]; + real64 localAbu[3][nUdof]; + real64 localAbb[3][3]; + real64 localRb[3]; + for( localIndex i = 0; i < 3; ++i ) + { + for( localIndex j = 0; j < nUdof; ++j ) + { + localAub[j][i] = stack.localAub[j][parentFaceIndex*3+i]; + } + for( localIndex j = 0; j < 3; ++j ) + { + localAbb[j][i] = stack.localAbb[parentFaceIndex*3+j][parentFaceIndex*3+i]; + } + localRb[i] = stack.localRb[parentFaceIndex*3+i]; + } + + for( localIndex j = 0; j < nUdof; ++j ) + { + for( localIndex i = 0; i < 3; ++i ) + { + localAbu[i][j] = stack.localAbu[parentFaceIndex*3+i][j]; + } + } + + // Compute the local residuals + LvArray::tensorOps::Ri_add_AijBj< 3, 3 >( localRb, localAbb, stack.bLocal ); + LvArray::tensorOps::Ri_add_AijBj< 3, nUdof >( localRb, localAbu, stack.uLocal ); + LvArray::tensorOps::Ri_add_AijBj< nUdof, 3 >( stack.localRu, localAub, stack.bLocal ); + + for( localIndex i = 0; i < nUdof; ++i ) + { + localIndex const dof = LvArray::integerConversion< localIndex >( stack.dispEqnRowIndices[ i ] ); + if( dof < 0 || dof >= m_matrix.numRows() ) continue; + + RAJA::atomicAdd< parallelDeviceAtomic >( &m_rhs[dof], stack.localRu[i] ); + + // fill in matrix + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.bColIndices, + localAub[i], + 3 ); + + } + + for( localIndex i=0; i < 3; ++i ) + { + localIndex const dof = LvArray::integerConversion< localIndex >( stack.bEqnRowIndices[ i ] ); + + if( dof < 0 || dof >= m_matrix.numRows() ) continue; + + RAJA::atomicAdd< parallelDeviceAtomic >( &m_rhs[dof], localRb[i] ); + + // fill in matrix + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.bColIndices, + localAbb[i], + 3 ); + + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.dispColIndices, + localAbu[i], + numNodesPerElem*3 ); + } + + return maxForce; + } + +protected: + + /// The array containing the bubble displacement. + arrayView2d< real64 const > const m_bubbleDisp; + + /// The global degree of freedom number of bubble + arrayView1d< globalIndex const > const m_bDofNumber; + + /// The array containing the list of bubble elements. + arrayView1d< localIndex const > const m_bubbleElems; + + /// The array containing the element to bubble face map. + /// The bubble face is the face of the element to which the bubble is applied. + /// Both the local and global face index are stored in this array. + arrayView2d< localIndex const > const m_elemsToFaces; + +}; + +/// The factory used to construct a QuasiStatic kernel. +using ALMBubbleFactory = finiteElement::KernelFactory< ALMBubbleKernels, + arrayView1d< globalIndex const > const, + arrayView1d< globalIndex const > const, + globalIndex const, + CRSMatrixView< real64, globalIndex const > const, + arrayView1d< real64 > const, + real64 const, + real64 const (&) [3] >; + +} // namespace SolidMechanicsALMBubbleKernels + +} // namespace geos + + +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMBUBBLEKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp new file mode 100644 index 00000000000..4c2e84c2a10 --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp @@ -0,0 +1,275 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SolidMechanicsALMUpdateKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMUPDATEKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMUPDATEKERNELS_HPP_ + +#include "SolidMechanicsALMKernelsBase.hpp" + +namespace geos +{ + +namespace solidMechanicsALMKernels +{ + +/** + * @copydoc geos::finiteElement::ImplicitKernelBase + */ +template< typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +class ALMJumpUpdate : + public ALMKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE > +{ +public: + /// Alias for the base class; + using Base = ALMKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE >; + + /// Maximum number of nodes per element, which is equal to the maxNumTestSupportPointPerElem and + /// maxNumTrialSupportPointPerElem by definition. + static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; + + using Base::m_X; + using Base::m_finiteElementSpace; + using Base::m_dofNumber; + using Base::m_dofRankOffset; + using Base::m_elemsToFaces; + using Base::m_faceToNodes; + using Base::m_rotationMatrix; + using Base::m_dispJump; + + /** + * @brief Constructor + * @copydoc geos::finiteElement::InterfaceKernelBase::InterfaceKernelBase + */ + ALMJumpUpdate( NodeManager const & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + FaceElementSubRegion & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + arrayView1d< globalIndex const > const uDofNumber, + arrayView1d< globalIndex const > const bDofNumber, + globalIndex const rankOffset, + CRSMatrixView< real64, globalIndex const > const inputMatrix, + arrayView1d< real64 > const inputRhs, + real64 const inputDt, + arrayView1d< localIndex const > const & faceElementList ): + Base( nodeManager, + edgeManager, + faceManager, + targetRegionIndex, + elementSubRegion, + finiteElementSpace, + inputConstitutiveType, + uDofNumber, + bDofNumber, + rankOffset, + inputMatrix, + inputRhs, + inputDt, + faceElementList ), + m_displacement( nodeManager.getField< fields::solidMechanics::totalDisplacement >()), + m_bubbleDisp( faceManager.getField< fields::solidMechanics::totalBubbleDisplacement >() ), + m_incrDisp( nodeManager.getField< fields::solidMechanics::incrementalDisplacement >() ), + m_incrBubbleDisp( faceManager.getField< fields::solidMechanics::incrementalBubbleDisplacement >() ), + m_deltaDispJump( elementSubRegion.getField< fields::contact::deltaDispJump >().toView() ) + {} + + //*************************************************************************** + + /** + * @copydoc finiteElement::KernelBase::StackVariables + */ + struct StackVariables : public Base::StackVariables + { + + /// The number of displacement dofs per element. + static constexpr int numUdofs = numNodesPerElem * 3 * 2; + + /// The number of bubble dofs per element. + static constexpr int numBdofs = 3 * 2; + + /// The number of lagrange multiplier dofs per element. + static constexpr int numTdofs = 3; + +public: + + GEOS_HOST_DEVICE + StackVariables(): + Base::StackVariables(), + uLocal{}, + bLocal{}, + duLocal{}, + dbLocal{}, + deltaDispJumpLocal{} + {} + + /// Stack storage for the element local displacement vector + real64 uLocal[numUdofs]; + + /// Stack storage for the element local bubble displacement vector + real64 bLocal[numBdofs]; + + /// Stack storage for the element local incremental displacement vector + real64 duLocal[numUdofs]; + + /// Stack storage for the element local incremental bubble displacement vector + real64 dbLocal[numBdofs]; + + /// Stack storage for the element local delta displacement jump vector + real64 deltaDispJumpLocal[numTdofs]; + + }; + + //*************************************************************************** + + //START_kernelLauncher + template< typename POLICY, + typename KERNEL_TYPE > + static + real64 + kernelLaunch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + return Base::template kernelLaunch< POLICY, KERNEL_TYPE >( numElems, kernelComponent ); + } + //END_kernelLauncher + + /** + * @brief Copy global values from primary field to a local stack array. + * @copydoc ::geos::finiteElement::InterfaceKernelBase::setup + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const k, + StackVariables & stack ) const + { + constexpr int shift = numNodesPerElem * 3; + + int permutation[numNodesPerElem]; + m_finiteElementSpace.getPermutation( permutation ); + + localIndex const kf0 = m_elemsToFaces[k][0]; + localIndex const kf1 = m_elemsToFaces[k][1]; + for( localIndex a=0; a( matRtAtu, stack.localRotationMatrix, + stack.localAtu ); + // transp(R) * Atb + LvArray::tensorOps::Rij_eq_AkiBkj< 3, numBdofs, 3 >( matRtAtb, stack.localRotationMatrix, + stack.localAtb ); + + // Compute the node contribute of the displacement and delta displacement jump + LvArray::tensorOps::Ri_eq_AijBj< 3, numUdofs >( stack.dispJumpLocal, matRtAtu, stack.uLocal ); + LvArray::tensorOps::Ri_eq_AijBj< 3, numUdofs >( stack.deltaDispJumpLocal, matRtAtu, stack.duLocal ); + + // Compute the bubble contribute of the displacement and delta displacement jump + LvArray::tensorOps::Ri_add_AijBj< 3, numBdofs >( stack.dispJumpLocal, matRtAtb, stack.bLocal ); + LvArray::tensorOps::Ri_add_AijBj< 3, numBdofs >( stack.deltaDispJumpLocal, matRtAtb, stack.dbLocal ); + + // Store the results + for( int i=0; i<3; ++i ) + { + m_dispJump[ k ][ i ] = stack.dispJumpLocal[ i ]; + m_deltaDispJump[ k ][ i ] = stack.deltaDispJumpLocal[ i ]; + } + + return 0.0; + } + +protected: + + /// The rank-global displacement array. + arrayView2d< real64 const, nodes::TOTAL_DISPLACEMENT_USD > const m_displacement; + + /// The rank-global bubble displacement array. + arrayView2d< real64 const > const m_bubbleDisp; + + /// The rank-global incremental displacement array. + arrayView2d< real64 const, nodes::INCR_DISPLACEMENT_USD > const m_incrDisp; + + /// The rank-global incremental bubble displacement array. + arrayView2d< real64 const > const m_incrBubbleDisp; + + /// The rank-global delta displacement jump array. + arrayView2d< real64 > const m_deltaDispJump; + +}; + +using ALMJumpUpdateFactory = finiteElement::InterfaceKernelFactory< ALMJumpUpdate, + arrayView1d< globalIndex const > const, + arrayView1d< globalIndex const > const, + globalIndex const, + CRSMatrixView< real64, globalIndex const > const, + arrayView1d< real64 > const, + real64 const, + arrayView1d< localIndex const > const >; + +} // namespace SolidMechanicsALMKernels + +} // namespace geos + +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMUPDATEKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp new file mode 100644 index 00000000000..7c291b0f899 --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp @@ -0,0 +1,430 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SolidMechanicsALMKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELS_HPP_ + +#include "SolidMechanicsALMKernelsBase.hpp" + +namespace geos +{ + +namespace solidMechanicsALMKernels +{ + +/** + * @copydoc geos::finiteElement::ImplicitKernelBase + */ +template< typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +class ALM : + public ALMKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE > +{ +public: + /// Alias for the base class. + using Base = ALMKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE >; + + /// Maximum number of nodes per element, which is equal to the maxNumTestSupportPointPerElem and + /// maxNumTrialSupportPointPerElem by definition. + static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; + + /// Compile time value for the number of quadrature points per element. + static constexpr int numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + + using Base::m_elemsToFaces; + using Base::m_faceToNodes; + using Base::m_finiteElementSpace; + using Base::m_dofNumber; + using Base::m_bDofNumber; + using Base::m_dofRankOffset; + using Base::m_X; + using Base::m_rotationMatrix; + using Base::m_penalty; + using Base::m_dispJump; + using Base::m_oldDispJump; + using Base::m_matrix; + using Base::m_rhs; + + /** + * @brief Constructor + * @copydoc geos::finiteElement::InterfaceKernelBase::InterfaceKernelBase + */ + ALM( NodeManager const & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + FaceElementSubRegion & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + arrayView1d< globalIndex const > const uDofNumber, + arrayView1d< globalIndex const > const bDofNumber, + globalIndex const rankOffset, + CRSMatrixView< real64, globalIndex const > const inputMatrix, + arrayView1d< real64 > const inputRhs, + real64 const inputDt, + arrayView1d< localIndex const > const & faceElementList ): + Base( nodeManager, + edgeManager, + faceManager, + targetRegionIndex, + elementSubRegion, + finiteElementSpace, + inputConstitutiveType, + uDofNumber, + bDofNumber, + rankOffset, + inputMatrix, + inputRhs, + inputDt, + faceElementList ), + m_traction( elementSubRegion.getField< fields::contact::traction >().toViewConst()) + {} + + //*************************************************************************** + + /** + * @copydoc finiteElement::KernelBase::StackVariables + */ + struct StackVariables : public Base::StackVariables + { + + /// The number of displacement dofs per element. + static constexpr int numUdofs = numNodesPerElem * 3 * 2; + + /// The number of lagrange multiplier dofs per element. + static constexpr int numTdofs = 3; + + /// The number of bubble dofs per element. + static constexpr int numBdofs = 3*2; + +public: + + GEOS_HOST_DEVICE + StackVariables(): + Base::StackVariables(), + dispEqnRowIndices{}, + dispColIndices{}, + bEqnRowIndices{}, + bColIndices{}, + localRu{}, + localRb{}, + localAutAtu{ {} }, + localAbtAtb{ {} }, + localAbtAtu{ {} }, + localAutAtb{ {} }, + tLocal{} + {} + + /// C-array storage for the element local row degrees of freedom. + globalIndex dispEqnRowIndices[numUdofs]; + + /// C-array storage for the element local column degrees of freedom. + globalIndex dispColIndices[numUdofs]; + + /// C-array storage for the element local row degrees of freedom. + globalIndex bEqnRowIndices[numBdofs]; + + /// C-array storage for the element local column degrees of freedom. + globalIndex bColIndices[numBdofs]; + + /// C-array storage for the element local Ru residual vector. + real64 localRu[numUdofs]; + + /// C-array storage for the element local Rb residual vector. + real64 localRb[numBdofs]; + + /// C-array storage for the element local AutAtu matrix. + real64 localAutAtu[numUdofs][numUdofs]; + + /// C-array storage for the element local AbtAtb matrix. + real64 localAbtAtb[numBdofs][numBdofs]; + + /// C-array storage for the element local AbtAtu matrix. + real64 localAbtAtu[numBdofs][numUdofs]; + + /// C-array storage for the element local AbtAtu matrix. + real64 localAutAtb[numUdofs][numBdofs]; + + /// Stack storage for the element local lagrange multiplier vector + real64 tLocal[numTdofs]; + + }; + + //*************************************************************************** + + //START_kernelLauncher + template< typename POLICY, + typename KERNEL_TYPE > + static + real64 + kernelLaunch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + return Base::template kernelLaunch< POLICY, KERNEL_TYPE >( numElems, kernelComponent ); + } + //END_kernelLauncher + + /** + * @brief Copy global values from primary field to a local stack array. + * @copydoc ::geos::finiteElement::InterfaceKernelBase::setup + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const k, + StackVariables & stack ) const + { + constexpr int shift = numNodesPerElem * 3; + + constexpr int numTdofs = 3; + + int permutation[numNodesPerElem]; + m_finiteElementSpace.getPermutation( permutation ); + + localIndex const kf0 = m_elemsToFaces[k][0]; + localIndex const kf1 = m_elemsToFaces[k][1]; + for( localIndex a=0; a( matRRtAtu, stack.localRotationMatrix, + stack.localAtu ); + // transp(R) * Atb + LvArray::tensorOps::Rij_eq_AkiBkj< 3, numBdofs, 3 >( matRRtAtb, stack.localRotationMatrix, + stack.localAtb ); + + // Compute the traction contribute of the local residuals + LvArray::tensorOps::Ri_eq_AjiBj< numUdofs, 3 >( tractionR, matRRtAtu, stack.tLocal ); + LvArray::tensorOps::Ri_eq_AjiBj< numBdofs, 3 >( tractionRb, matRRtAtb, stack.tLocal ); + + // D*RtAtu + LvArray::tensorOps::Rij_eq_AikBkj< 3, numUdofs, 3 >( matDRtAtu, stack.localPenalty, + matRRtAtu ); + // D*RtAtb + LvArray::tensorOps::Rij_eq_AikBkj< 3, numBdofs, 3 >( matDRtAtb, stack.localPenalty, + matRRtAtb ); + + // R*RtAtu + LvArray::tensorOps::Rij_eq_AikBkj< 3, numUdofs, 3 >( matRRtAtu, stack.localRotationMatrix, + matDRtAtu ); + // R*RtAtb + LvArray::tensorOps::Rij_eq_AikBkj< 3, numBdofs, 3 >( matRRtAtb, stack.localRotationMatrix, + matDRtAtb ); + + // transp(Atu)*RRtAtu + LvArray::tensorOps::Rij_eq_AkiBkj< numUdofs, numUdofs, 3 >( stack.localAutAtu, stack.localAtu, + matRRtAtu ); + // transp(Atb)*RRtAtb + LvArray::tensorOps::Rij_eq_AkiBkj< numBdofs, numBdofs, 3 >( stack.localAbtAtb, stack.localAtb, + matRRtAtb ); + + // transp(Atb)*RRtAtu + LvArray::tensorOps::Rij_eq_AkiBkj< numBdofs, numUdofs, 3 >( stack.localAbtAtu, stack.localAtb, + matRRtAtu ); + + // transp(Atu)*RRtAtb + LvArray::tensorOps::Rij_eq_AkiBkj< numUdofs, numBdofs, 3 >( stack.localAutAtb, stack.localAtu, + matRRtAtb ); + + // Compute the local residuals + LvArray::tensorOps::Ri_eq_AjiBj< numUdofs, 3 >( dispJumpR, matDRtAtu, stack.dispJumpLocal ); + LvArray::tensorOps::Ri_eq_AjiBj< numUdofs, 3 >( oldDispJumpR, matDRtAtu, stack.oldDispJumpLocal ); + LvArray::tensorOps::Ri_eq_AjiBj< numBdofs, 3 >( dispJumpRb, matDRtAtb, stack.dispJumpLocal ); + LvArray::tensorOps::Ri_eq_AjiBj< numBdofs, 3 >( oldDispJumpRb, matDRtAtb, stack.oldDispJumpLocal ); + + LvArray::tensorOps::scaledAdd< numUdofs >( stack.localRu, tractionR, -1 ); + LvArray::tensorOps::scaledAdd< numUdofs >( stack.localRu, dispJumpR, 1 ); + LvArray::tensorOps::scaledAdd< numUdofs >( stack.localRu, oldDispJumpR, -1 ); + + LvArray::tensorOps::scaledAdd< numBdofs >( stack.localRb, tractionRb, -1 ); + LvArray::tensorOps::scaledAdd< numBdofs >( stack.localRb, dispJumpRb, 1 ); + LvArray::tensorOps::scaledAdd< numBdofs >( stack.localRb, oldDispJumpRb, -1 ); + + for( localIndex i=0; i < numUdofs; ++i ) + { + localIndex const dof = LvArray::integerConversion< localIndex >( stack.dispEqnRowIndices[ i ] ); + + if( dof < 0 || dof >= m_matrix.numRows() ) continue; + + // Is it necessary? Each row should be indepenedent + RAJA::atomicAdd< parallelDeviceAtomic >( &m_rhs[dof], stack.localRu[i] ); + + // Fill in matrix + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.dispColIndices, + stack.localAutAtu[i], + numUdofs ); + + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.bColIndices, + stack.localAutAtb[i], + numBdofs ); + } + + for( localIndex i=0; i < numBdofs; ++i ) + { + localIndex const dof = LvArray::integerConversion< localIndex >( stack.bEqnRowIndices[ i ] ); + + if( dof < 0 || dof >= m_matrix.numRows() ) continue; + + // Is it necessary? Each row should be indepenedent + RAJA::atomicAdd< parallelDeviceAtomic >( &m_rhs[dof], stack.localRb[i] ); + + // Fill in matrix + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.bColIndices, + stack.localAbtAtb[i], + numBdofs ); + + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.dispColIndices, + stack.localAbtAtu[i], + numUdofs ); + } + + return 0.0; + } + +protected: + + arrayView2d< real64 const > const m_traction; + +}; + +/// The factory used to construct the kernel. +using ALMFactory = finiteElement::InterfaceKernelFactory< ALM, + arrayView1d< globalIndex const > const, + arrayView1d< globalIndex const > const, + globalIndex const, + CRSMatrixView< real64, globalIndex const > const, + arrayView1d< real64 > const, + real64 const, + arrayView1d< localIndex const > const >; + + +/** + * @brief A struct to compute rotation matrices + */ +struct ComputeRotationMatricesKernel +{ + + /** + * @brief Launch the kernel function to comute rotation matrices + * @tparam POLICY the type of policy used in the kernel launch + * @param[in] size the size of the subregion + * @param[in] faceNormal the array of array containing the face to nodes map + * @param[in] elemsToFaces the array of array containing the element to faces map + * @param[out] rotationMatrix the array containing the rotation matrices + */ + template< typename POLICY > + static void + launch( localIndex const size, + arrayView2d< real64 const > const & faceNormal, + ArrayOfArraysView< localIndex const > const & elemsToFaces, + arrayView3d< real64 > const & rotationMatrix ) + { + + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + + localIndex const & f0 = elemsToFaces[k][0]; + localIndex const & f1 = elemsToFaces[k][1]; + + real64 Nbar[3]; + Nbar[0] = faceNormal[f0][0] - faceNormal[f1][0]; + Nbar[1] = faceNormal[f0][1] - faceNormal[f1][1]; + Nbar[2] = faceNormal[f0][2] - faceNormal[f1][2]; + + LvArray::tensorOps::normalize< 3 >( Nbar ); + computationalGeometry::RotationMatrix_3D( Nbar, rotationMatrix[k] ); + + } ); + } + +}; + +} // namespace SolidMechanicsALMKernels + +} // namespace geos + + +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp new file mode 100644 index 00000000000..ab9c9fab0b9 --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp @@ -0,0 +1,273 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SolidMechanicsALMKernelsBase.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSBASE_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSBASE_HPP_ + +#include "finiteElement/kernelInterface/InterfaceKernelBase.hpp" +#include "SolidMechanicsALMKernelsHelper.hpp" + +namespace geos +{ + +namespace solidMechanicsALMKernels +{ + +/** + * @brief Implements kernels for ALM. + * @copydoc geos::finiteElement::InterfaceKernelBase + * + */ +template< typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +class ALMKernelsBase : + public finiteElement::InterfaceKernelBase< CONSTITUTIVE_TYPE, + FE_TYPE, + 3, 3 > +{ +public: + /// Alias for the base class; + using Base = finiteElement::InterfaceKernelBase< CONSTITUTIVE_TYPE, + FE_TYPE, + 3, 3 >; + + /// Number of nodes per element...which is equal to the + /// numTestSupportPointPerElem and numTrialSupportPointPerElem by definition. + static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; + + /// Compile time value for the number of quadrature points per element. + static constexpr int numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + + using Base::m_dofNumber; + using Base::m_dofRankOffset; + using Base::m_finiteElementSpace; + using Base::m_matrix; + using Base::m_rhs; + + /** + * @brief Constructor + * @copydoc geos::finiteElement::InterfaceKernelBase::InterfaceKernelBase + */ + ALMKernelsBase( NodeManager const & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + FaceElementSubRegion & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + arrayView1d< globalIndex const > const uDofNumber, + arrayView1d< globalIndex const > const bDofNumber, + globalIndex const rankOffset, + CRSMatrixView< real64, globalIndex const > const inputMatrix, + arrayView1d< real64 > const inputRhs, + real64 const inputDt, + arrayView1d< localIndex const > const & faceElementList ): + Base( nodeManager, + edgeManager, + faceManager, + targetRegionIndex, + elementSubRegion, + finiteElementSpace, + inputConstitutiveType, + uDofNumber, + rankOffset, + inputMatrix, + inputRhs, + inputDt ), + m_X( nodeManager.referencePosition()), + m_faceToNodes( faceManager.nodeList().toViewConst()), + m_elemsToFaces( elementSubRegion.faceList().toViewConst()), + m_faceElementList( faceElementList ), + m_bDofNumber( bDofNumber ), + m_rotationMatrix( elementSubRegion.getField< fields::contact::rotationMatrix >().toViewConst()), + m_dispJump( elementSubRegion.getField< fields::contact::dispJump >().toView() ), + m_oldDispJump( elementSubRegion.getField< fields::contact::oldDispJump >().toViewConst() ), + m_penalty( elementSubRegion.getField< fields::contact::penalty >().toViewConst() ) + {} + + //*************************************************************************** + /** + * @copydoc finiteElement::InterfaceKernelBase::StackVariables + */ + struct StackVariables + { + /// The number of displacement dofs per element. + static constexpr int numUdofs = numNodesPerElem * 3 * 2; + + /// The number of lagrange multiplier dofs per element. + static constexpr int numTdofs = 3; + + /// The number of bubble dofs per element. + static constexpr int numBdofs = 3*2; + +public: + + GEOS_HOST_DEVICE + StackVariables(): + localAtu{ {} }, + localAtb{ {} }, + localRotationMatrix{ {} }, + localPenalty{ {} }, + dispJumpLocal{}, + oldDispJumpLocal{}, + X{ {} } + {} + + /// C-array storage for the element local Atu matrix. + real64 localAtu[numTdofs][numUdofs]; + + /// C-array storage for the element local Atb matrix. + real64 localAtb[numTdofs][numBdofs]; + + /// C-array storage for rotation matrix + real64 localRotationMatrix[3][3]; + + /// C-array storage for penalty matrix + real64 localPenalty[3][3]; + + /// Stack storage for the element local displacement jump vector + real64 dispJumpLocal[numTdofs]; + + /// Stack storage for the element local old displacement jump vector + real64 oldDispJumpLocal[numTdofs]; + + /// local nodal coordinates + real64 X[ numNodesPerElem ][ 3 ]; + + }; + + //*************************************************************************** + + /** + * @copydoc ::geos::finiteElement::InterfaceKernelBase::kernelLaunch + * + */ + //START_kernelLauncher + template< typename POLICY, + typename KERNEL_TYPE > + static + real64 + kernelLaunch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + GEOS_UNUSED_VAR( numElems ); + + // Define a RAJA reduction variable to get the maximum residual contribution. + RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxResidual( 0 ); + + forAll< POLICY >( kernelComponent.m_faceElementList.size(), + [=] GEOS_HOST_DEVICE ( localIndex const i ) + { + + localIndex k = kernelComponent.m_faceElementList[i]; + typename KERNEL_TYPE::StackVariables stack; + + kernelComponent.setup( k, stack ); + for( integer q=0; q( stack.localAtu, + N, + permutation, + detJ ); + + solidMechanicsALMKernelsHelper::accumulateAtuLocalOperator< numTdofs, + numBdofs, + 1 >( stack.localAtb, + BubbleN, + bperm, + detJ ); + } + +protected: + + /// The array containing the nodal position array. + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const m_X; + + /// The array of array containing the face to node map. + ArrayOfArraysView< localIndex const > const m_faceToNodes; + + /// The array of array containing the element to face map. + ArrayOfArraysView< localIndex const > const m_elemsToFaces; + + /// The array containing the list of face element of the same type. + arrayView1d< localIndex const > const m_faceElementList; + + /// The global degree of freedom number of bubble. + arrayView1d< globalIndex const > const m_bDofNumber; + + /// The array containing the rotation matrix for each element. + arrayView3d< real64 const > const m_rotationMatrix; + + /// The array containing the displacement jump. + arrayView2d< real64 > const m_dispJump; + + /// The array containing the displacement jump of previus time step. + arrayView2d< real64 const > const m_oldDispJump; + + /// The array containing the penalty coefficients for each element. + arrayView2d< real64 const > const m_penalty; + +}; + +} // namespace SolidMechanicsALMKernels + +} // namespace geos + + +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSBASE_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp new file mode 100644 index 00000000000..70205741edd --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp @@ -0,0 +1,82 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + + +/** + * @file SolidMechanicsALMKernelsHelper.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSHELPER_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSHELPER_HPP_ + +#include "common/GeosxMacros.hpp" + +namespace geos +{ + +namespace solidMechanicsALMKernelsHelper +{ + +template< int I_SIZE, + int J_SIZE, + int NUM_NODES > +GEOS_HOST_DEVICE +inline +void accumulateAtuLocalOperator( real64 ( & matrix )[I_SIZE][J_SIZE], + real64 ( & N )[NUM_NODES], + int const ( &perm )[NUM_NODES], + real64 const detJ ) +{ + for( int a=0; a < NUM_NODES; ++a ) + { + for( int i=0; i < I_SIZE; ++i ) + { + matrix[i][ a*3 + i ] += -N[ perm[ a ] ] * detJ; + matrix[i][ 3*NUM_NODES + a*3 + i ] += N[ perm[ a ] ] * detJ; + } + } +} + +template< int I_SIZE, + int J_SIZE, + int NUM_SUPPORTS > +GEOS_HOST_DEVICE +inline +void assembleStrainOperator( real64 ( & strainMatrix )[I_SIZE][J_SIZE], + real64 ( & dNdX )[NUM_SUPPORTS][3] ) +{ + LvArray::tensorOps::fill< I_SIZE, J_SIZE >( strainMatrix, 0 ); //make 0 + for( int a=0; a < NUM_SUPPORTS; ++a ) + { + + strainMatrix[0][a*3 + 0] = dNdX[a][0]; + strainMatrix[1][a*3 + 1] = dNdX[a][1]; + strainMatrix[2][a*3 + 2] = dNdX[a][2]; + + strainMatrix[3][a*3 + 1] = dNdX[a][2]; + strainMatrix[3][a*3 + 2] = dNdX[a][1]; + + strainMatrix[4][a*3 + 0] = dNdX[a][2]; + strainMatrix[4][a*3 + 2] = dNdX[a][0]; + + strainMatrix[5][a*3 + 0] = dNdX[a][1]; + strainMatrix[5][a*3 + 1] = dNdX[a][0]; + } +} + +} // solidMechanicsALMKernelsHelper + +} // geosx + +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSHELPER_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp new file mode 100644 index 00000000000..7f73a773bda --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -0,0 +1,1344 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * SolidMechanicsAugmentedLagrangianContact.cpp + */ + +#include "mesh/DomainPartition.hpp" +#include "SolidMechanicsAugmentedLagrangianContact.hpp" + +#include "physicsSolvers/contact/SolidMechanicsALMKernels.hpp" +#include "physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp" +#include "physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp" + +namespace geos +{ + +using namespace constitutive; +using namespace dataRepository; +using namespace fields; + +SolidMechanicsAugmentedLagrangianContact::SolidMechanicsAugmentedLagrangianContact( const string & name, + Group * const parent ): + ContactSolverBase( name, parent ) +{ + + m_faceTypeToFiniteElements["Quadrilateral"] = std::make_unique< finiteElement::H1_QuadrilateralFace_Lagrange1_GaussLegendre2 >(); + m_faceTypeToFiniteElements["Triangle"] = std::make_unique< finiteElement::H1_TriangleFace_Lagrange1_Gauss1 >(); + + // TODO Implement the MGR strategy + + // Set the default linear solver parameters + //LinearSolverParameters & linParams = m_linearSolverParameters.get(); + //linParams.dofsPerNode = 3; + //linParams.isSymmetric = true; + //linParams.amg.separateComponents = true; +} + +SolidMechanicsAugmentedLagrangianContact::~SolidMechanicsAugmentedLagrangianContact() +{} + +void SolidMechanicsAugmentedLagrangianContact::registerDataOnMesh( dataRepository::Group & meshBodies ) +{ + + ContactSolverBase::registerDataOnMesh( meshBodies ); + + forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, + MeshLevel & meshLevel, + arrayView1d< string const > const & ) + { + FaceManager & faceManager = meshLevel.getFaceManager(); + + // Register the total bubble displacement + faceManager.registerField< solidMechanics::totalBubbleDisplacement >( this->getName() ). + reference().resizeDimension< 1 >( 3 ); + + // Register the incremental bubble displacement + faceManager.registerField< solidMechanics::incrementalBubbleDisplacement >( this->getName() ). + reference().resizeDimension< 1 >( 3 ); + } ); + + forFractureRegionOnMeshTargets( meshBodies, [&] ( SurfaceElementRegion & fractureRegion ) + { + fractureRegion.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion & subRegion ) + { + // Register the rotation matrix + subRegion.registerField< contact::rotationMatrix >( this->getName() ). + reference().resizeDimension< 1, 2 >( 3, 3 ); + + // Register the traction field + subRegion.registerField< contact::traction >( this->getName() ). + reference().resizeDimension< 1 >( 3 ); + + // Register the displacement jump + subRegion.registerField< contact::dispJump >( this->getName() ). + reference().resizeDimension< 1 >( 3 ); + + // Register the delta displacement jump + subRegion.registerField< contact::deltaDispJump >( this->getName() ). + reference().resizeDimension< 1 >( 3 ); + + // Register the displacement jump old + subRegion.registerField< contact::oldDispJump >( this->getName() ). + reference().resizeDimension< 1 >( 3 ); + + // Register the displacement jump + subRegion.registerField< contact::penalty >( this->getName() ). + reference().resizeDimension< 1 >( 2 ); + + subRegion.registerWrapper< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ). + setPlotLevel( PlotLevel::NOPLOT ). + setRegisteringObjects( this->getName()). + setDescription( "An array that holds the normal traction tolerance." ); + + subRegion.registerWrapper< array1d< real64 > >( viewKeyStruct::normalDisplacementToleranceString() ). + setPlotLevel( PlotLevel::NOPLOT ). + setRegisteringObjects( this->getName()). + setDescription( "An array that holds the normal displacement tolerance." ); + + subRegion.registerWrapper< array1d< real64 > >( viewKeyStruct::slidingToleranceString() ). + setPlotLevel( PlotLevel::NOPLOT ). + setRegisteringObjects( this->getName()). + setDescription( "An array that holds the sliding tolerance." ); + + } ); + } ); + +} + +void SolidMechanicsAugmentedLagrangianContact::setupDofs( DomainPartition const & domain, + DofManager & dofManager ) const +{ + + GEOS_MARK_FUNCTION; + SolidMechanicsLagrangianFEM::setupDofs( domain, dofManager ); + + map< std::pair< string, string >, array1d< string > > meshTargets; + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshBodyName, + MeshLevel const & meshLevel, + arrayView1d< string const > const & ) + { + array1d< string > regions; + regions.emplace_back( getUniqueFractureRegionName() ); + meshTargets[std::make_pair( meshBodyName, meshLevel.getName())] = std::move( regions ); + } ); + + dofManager.addField( solidMechanics::totalBubbleDisplacement::key(), + FieldLocation::Face, + 3, + meshTargets ); + + // Add coupling between bubble + // Useful to create connection between bubble dofs for Augmented Lagrangian formulation + dofManager.addCoupling( solidMechanics::totalBubbleDisplacement::key(), + solidMechanics::totalBubbleDisplacement::key(), + DofManager::Connector::Elem ); + + // The dofManager can not create the connection due to the coupling + // between totalDisplacement and totalBubbleDisplacement + // These connection are created using the two functions + // addCouplingNumNonzeros and addCouplingSparsityPattern + // dofManager.addCoupling( solidMechanics::totalDisplacement::key(), + // solidMechanics::totalBubbleDisplacement::key(), + // DofManager::Connector::Elem); + +} + +void SolidMechanicsAugmentedLagrangianContact::setupSystem( DomainPartition & domain, + DofManager & dofManager, + CRSMatrix< real64, globalIndex > & localMatrix, + ParallelVector & rhs, + ParallelVector & solution, + bool const setSparsity ) +{ + + GEOS_MARK_FUNCTION; + GEOS_UNUSED_VAR( setSparsity ); + + // Create the list of interface elements that have same type. + createFaceTypeList( domain ); + + // Create the list of cell elements that they are enriched with bubble functions. + createBubbleCellList( domain ); + + dofManager.setDomain( domain ); + setupDofs( domain, dofManager ); + dofManager.reorderByRank(); + + // Set the sparsity pattern without the Abu and Aub blocks. + SparsityPattern< globalIndex > patternDiag; + dofManager.setSparsityPattern( patternDiag ); + + // Get the original row lengths (diagonal blocks only) + array1d< localIndex > rowLengths( patternDiag.numRows() ); + for( localIndex localRow = 0; localRow < patternDiag.numRows(); ++localRow ) + { + rowLengths[localRow] = patternDiag.numNonZeros( localRow ); + } + + // Add the number of nonzeros induced by coupling + this->addCouplingNumNonzeros( domain, dofManager, rowLengths.toView() ); + + // Create a new pattern with enough capacity for coupled matrix + SparsityPattern< globalIndex > pattern; + pattern.resizeFromRowCapacities< parallelHostPolicy >( patternDiag.numRows(), patternDiag.numColumns(), rowLengths.data() ); + + // Copy the original nonzeros + for( localIndex localRow = 0; localRow < patternDiag.numRows(); ++localRow ) + { + globalIndex const * cols = patternDiag.getColumns( localRow ).dataIfContiguous(); + pattern.insertNonZeros( localRow, cols, cols + patternDiag.numNonZeros( localRow ) ); + } + + // Add the nonzeros from coupling + this->addCouplingSparsityPattern( domain, dofManager, pattern.toView() ); + + // Finally, steal the pattern into a CRS matrix + localMatrix.assimilate< parallelDevicePolicy<> >( std::move( pattern ) ); + localMatrix.setName( this->getName() + "/localMatrix" ); + + rhs.setName( this->getName() + "/rhs" ); + rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + + solution.setName( this->getName() + "/solution" ); + solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + +} + +void SolidMechanicsAugmentedLagrangianContact::implicitStepSetup( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) +{ + + SolidMechanicsLagrangianFEM::implicitStepSetup( time_n, dt, domain ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + + FaceManager & faceManager = mesh.getFaceManager(); + ElementRegionManager & elemManager = mesh.getElemManager(); + + SurfaceElementRegion & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + + arrayView2d< real64 const > const & faceNormal = faceManager.faceNormal(); + ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + + arrayView3d< real64 > const + rotationMatrix = subRegion.getField< fields::contact::rotationMatrix >().toView(); + + // Compute rotation matrices + solidMechanicsALMKernels::ComputeRotationMatricesKernel:: + launch< parallelDevicePolicy<> >( subRegion.size(), + faceNormal, + elemsToFaces, + rotationMatrix ); + + arrayView2d< real64 > const + penalty = subRegion.getField< fields::contact::penalty >().toView(); + + // Set the penalty coefficients + // TODO: This is only temporary. The setting of penalty will be adaptive in the final version. + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + penalty[k] [0] = 1.e+7; + penalty[k] [1] = 1.e+7; + } ); + + } ); + + // Set the tollerances + computeTolerances( domain ); +} + +void SolidMechanicsAugmentedLagrangianContact::assembleSystem( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + + GEOS_MARK_FUNCTION; + + synchronizeFractureState( domain ); + + SolidMechanicsLagrangianFEM::assembleSystem( time, + dt, + domain, + dofManager, + localMatrix, + localRhs ); + + //ParallelMatrix parallel_matrix; + //parallel_matrix.create( localMatrix.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + //parallel_matrix.write("mech.mtx"); + //abort(); + + // Loop for assembling contributes from interface elements (Aut*eps^-1*Atu and Aub*eps^-1*Abu) + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshName, + MeshLevel & mesh, + arrayView1d< string const > const & ) + + { + + NodeManager const & nodeManager = mesh.getNodeManager(); + FaceManager const & faceManager = mesh.getFaceManager(); + + string const & dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + string const & bubbleDofKey = dofManager.getKey( solidMechanics::totalBubbleDisplacement::key() ); + + arrayView1d< globalIndex const > const dispDofNumber = nodeManager.getReference< globalIndex_array >( dispDofKey ); + arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); + + string const & fractureRegionName = this->getUniqueFractureRegionName(); + + forFiniteElementOnFractureSubRegions( meshName, [&] ( string const & finiteElementName, + arrayView1d< localIndex const > const & faceElementList ) + { + + finiteElement::FiniteElementBase & subRegionFE = *(m_faceTypeToFiniteElements[finiteElementName]); + + solidMechanicsALMKernels::ALMFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + localMatrix, + localRhs, + dt, + faceElementList ); + + real64 maxTraction = finiteElement:: + interfaceBasedKernelApplication + < parallelDevicePolicy< >, + constitutive::NullModel >( mesh, + fractureRegionName, + faceElementList, + subRegionFE, + "", + kernelFactory ); + + GEOS_UNUSED_VAR( maxTraction ); + + } ); + + } ); + + // Loop for assembling contributes of bubble elements (Abb, Abu, Aub) + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + NodeManager const & nodeManager = mesh.getNodeManager(); + FaceManager const & faceManager = mesh.getFaceManager(); + + string const & dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + string const & bubbleDofKey = dofManager.getKey( solidMechanics::totalBubbleDisplacement::key() ); + + arrayView1d< globalIndex const > const dispDofNumber = nodeManager.getReference< globalIndex_array >( dispDofKey ); + arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); + + real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( gravityVector() ); + + + solidMechanicsALMKernels::ALMBubbleFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + localMatrix, + localRhs, + dt, + gravityVectorData ); + + real64 maxTraction = finiteElement:: + regionBasedKernelApplication + < parallelDevicePolicy< >, + constitutive::ElasticIsotropic, + CellElementSubRegion >( mesh, + regionNames, + getDiscretizationName(), + SolidMechanicsLagrangianFEM::viewKeyStruct::solidMaterialNamesString(), + kernelFactory ); + + GEOS_UNUSED_VAR( maxTraction ); + + } ); + +} + +void SolidMechanicsAugmentedLagrangianContact::implicitStepComplete( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) +{ + + + SolidMechanicsLagrangianFEM::implicitStepComplete( time_n, dt, domain ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + SurfaceElementRegion & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + + arrayView2d< real64 const > const dispJump = subRegion.getField< contact::dispJump >(); + arrayView2d< real64 > const oldDispJump = subRegion.getField< contact::oldDispJump >(); + arrayView2d< real64 > const deltaDispJump = subRegion.getField< contact::deltaDispJump >(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + LvArray::tensorOps::fill< 3 >( deltaDispJump[kfe], 0.0 ); + LvArray::tensorOps::copy< 3 >( oldDispJump[kfe], dispJump[kfe] ); + } ); + + } ); + +} + +real64 SolidMechanicsAugmentedLagrangianContact::calculateResidualNorm( real64 const & time, + real64 const & dt, + DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ) +{ + + GEOS_MARK_FUNCTION; + + real64 const solidResidualNorm = SolidMechanicsLagrangianFEM::calculateResidualNorm( time, dt, domain, dofManager, localRhs ); + + string const bubbleDofKey = dofManager.getKey( solidMechanics::totalBubbleDisplacement::key() ); + + globalIndex const rankOffset = dofManager.rankOffset(); + + RAJA::ReduceSum< parallelDeviceReduce, real64 > localSum( 0.0 ); + + // globalResidualNorm[0]: the sum of all the local sum(rhs^2). + // globalResidualNorm[1]: max of max force of each rank. Basically max force globally + real64 globalResidualNorm[2] = {0, 0}; + + // Bubble residual + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const ) + { + FaceManager const & faceManager = mesh.getFaceManager(); + ElementRegionManager const & elemManager = mesh.getElemManager(); + + SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + + arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); + + ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + + arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [ elemsToFaces, localRhs, localSum, bubbleDofNumber, rankOffset, ghostRank] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + + if( ghostRank[kfe] < 0 ) + { + for( int kk=0; kk<2; ++kk ) + { + localIndex const k = elemsToFaces[kfe][kk]; + localIndex const localRow = LvArray::integerConversion< localIndex >( bubbleDofNumber[k] - rankOffset ); + for( localIndex i = 0; i < 3; ++i ) + { + localSum += localRhs[localRow + i] * localRhs[localRow + i]; + } + } + } + + } ); + real64 const localResidualNorm[2] = { localSum.get(), SolidMechanicsLagrangianFEM::getMaxForce() }; + + int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const numRanks = MpiWrapper::commSize( MPI_COMM_GEOSX ); + array1d< real64 > globalValues( numRanks * 2 ); + + // Everything is done on rank 0 + MpiWrapper::gather( localResidualNorm, + 2, + globalValues.data(), + 2, + 0, + MPI_COMM_GEOSX ); + + if( rank==0 ) + { + for( int r=0; r= 1 && logger::internal::rank==0 ) + { + std::cout << GEOS_FMT( " ( RBubbleDisp ) = ( {:4.2e} )", bubbleResidualNorm ); + } + + return sqrt( solidResidualNorm * solidResidualNorm + bubbleResidualNorm * bubbleResidualNorm ); + +} + +void SolidMechanicsAugmentedLagrangianContact::applySystemSolution( DofManager const & dofManager, + arrayView1d< real64 const > const & localSolution, + real64 const scalingFactor, + real64 const dt, + DomainPartition & domain ) +{ + + GEOS_MARK_FUNCTION; + + SolidMechanicsLagrangianFEM::applySystemSolution( dofManager, + localSolution, + scalingFactor, + dt, + domain ); + + dofManager.addVectorToField( localSolution, + solidMechanics::totalBubbleDisplacement::key(), + solidMechanics::totalBubbleDisplacement::key(), + scalingFactor ); + + dofManager.addVectorToField( localSolution, + solidMechanics::totalBubbleDisplacement::key(), + solidMechanics::incrementalBubbleDisplacement::key(), + scalingFactor ); + + + // Loop for updating the displacement jump + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshName, + MeshLevel & mesh, + arrayView1d< string const > const & ) + + { + + NodeManager const & nodeManager = mesh.getNodeManager(); + FaceManager const & faceManager = mesh.getFaceManager(); + + string const & dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + string const & bubbleDofKey = dofManager.getKey( solidMechanics::totalBubbleDisplacement::key() ); + + arrayView1d< globalIndex const > const dispDofNumber = nodeManager.getReference< globalIndex_array >( dispDofKey ); + arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); + + string const & fractureRegionName = this->getUniqueFractureRegionName(); + + CRSMatrix< real64, globalIndex > const voidMatrix; + array1d< real64 > const voidRhs; + + forFiniteElementOnFractureSubRegions( meshName, [&] ( string const & finiteElementName, + arrayView1d< localIndex const > const & faceElementList ) + { + + finiteElement::FiniteElementBase & subRegionFE = *(m_faceTypeToFiniteElements[finiteElementName]); + + solidMechanicsALMKernels::ALMJumpUpdateFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + voidMatrix.toViewConstSizes(), + voidRhs.toView(), + dt, + faceElementList ); + + real64 maxTraction = finiteElement:: + interfaceBasedKernelApplication + < parallelDevicePolicy< >, + constitutive::NullModel >( mesh, + fractureRegionName, + faceElementList, + subRegionFE, + "", + kernelFactory ); + + GEOS_UNUSED_VAR( maxTraction ); + + } ); + } ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + + { + FieldIdentifiers fieldsToBeSync; + + fieldsToBeSync.addFields( FieldLocation::Face, + { solidMechanics::incrementalBubbleDisplacement::key(), + solidMechanics::totalBubbleDisplacement::key() } ); + + fieldsToBeSync.addElementFields( { contact::dispJump::key(), + contact::deltaDispJump::key() }, + { getUniqueFractureRegionName() } ); + + CommunicationTools::getInstance().synchronizeFields( fieldsToBeSync, + mesh, + domain.getNeighbors(), + true ); + } ); + +} + +void SolidMechanicsAugmentedLagrangianContact::updateState( DomainPartition & domain ) +{ + GEOS_UNUSED_VAR( domain ); +} + +bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartition & domain ) +{ + GEOS_MARK_FUNCTION; + + int hasConfigurationConverged = true; + int condConv = true; + // TODO: This function's design is temporary and intended solely for testing the stick mode. + // In the final version the parallelHostPolicy will be substitute with the parallelDevicePolicy<>. + array2d< real64 > traction_new; + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + + elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, + FaceElementSubRegion & subRegion ) + { + + arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); + arrayView2d< real64 const > const traction = subRegion.getField< contact::traction >(); + arrayView2d< real64 const > const dispJump = subRegion.getField< contact::dispJump >(); + + arrayView2d< real64 const > const deltaDispJump = subRegion.getField< contact::deltaDispJump >(); + arrayView2d< real64 const > const penalty = subRegion.getField< contact::penalty >(); + + arrayView1d< real64 const > const normalDisplacementTolerance = + subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalDisplacementToleranceString() ); + arrayView1d< real64 > const & slidingTolerance = + subRegion.getReference< array1d< real64 > >( viewKeyStruct::slidingToleranceString() ); + arrayView1d< real64 const > const & normalTractionTolerance = + subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ); + + std::ptrdiff_t const sizes[ 2 ] = {subRegion.size(), 3}; + traction_new.resize( 2, sizes ); + arrayView2d< real64 > const traction_new_v = traction_new.toView(); + + // TODO: Create a Kernel to update Traction + forAll< parallelHostPolicy >( subRegion.size(), + [ traction_new_v, traction, penalty, dispJump, deltaDispJump ] ( localIndex const kfe ) + { + real64 eps_N = penalty[kfe][0]; + real64 eps_T = penalty[kfe][1]; + traction_new_v[kfe][0] = traction[kfe][0] + eps_N * dispJump[kfe][0]; + traction_new_v[kfe][1] = traction[kfe][1] + eps_T * deltaDispJump[kfe][1]; + traction_new_v[kfe][2] = traction[kfe][2] + eps_T * deltaDispJump[kfe][2]; + } ); + + forAll< parallelHostPolicy >( subRegion.size(), + [ &condConv, ghostRank, traction_new_v, normalTractionTolerance, normalDisplacementTolerance, slidingTolerance, deltaDispJump, dispJump ] ( localIndex const kfe ) + { + if( ghostRank[kfe] < 0 ) + { + if( traction_new_v[kfe][0] >= normalTractionTolerance[kfe] ) + { + GEOS_ERROR( "Unsuported open mode! Only stick mode is supported with ALM" ); + } + else + { + real64 deltaDisp = sqrt( pow( deltaDispJump[kfe][1], 2 ) + pow( deltaDispJump[kfe][2], 2 )); + if( std::abs( dispJump[kfe][0] ) > normalDisplacementTolerance[kfe] ) + { + //GEOS_LOG_LEVEL(2, + //GEOS_FMT( " Element: {}, Stick mode and g_n > tol1 => compenetration, g_n: {:4.2e} tol1: {:4.2e}", + //kfe,std::abs(dispJump[kfe][0]), normalDisplacementTolerance[kfe] )) + condConv = false; + } + if( deltaDisp > slidingTolerance[kfe] ) + { + //GEOS_LOG_LEVEL(2, + //GEOS_FMT( " Element: {}, Stick and dg_t > tol2, dg_t: {:4.2e} tol2: {:4.2e}", + //kfe, deltaDisp, slidingTolerance[kfe] )) + condConv = false; + } + } + } + } ); + + } ); + } ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + + elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, + FaceElementSubRegion & subRegion ) + { + + arrayView2d< real64 > const traction_new_v = traction_new.toView(); + arrayView2d< real64 > const traction = subRegion.getField< contact::traction >(); + forAll< parallelHostPolicy >( subRegion.size(), [ traction, traction_new_v ] ( localIndex const kfe ) + { + traction[kfe][0] = traction_new_v( kfe, 0 ); + traction[kfe][1] = traction_new_v( kfe, 1 ); + traction[kfe][2] = traction_new_v( kfe, 2 ); + } ); + } ); + } ); + + if( !condConv ) + { + hasConfigurationConverged = false; + } + + // Need to synchronize the fracture state due to the use will be made of in AssemblyStabilization + synchronizeFractureState( domain ); + + // Compute if globally the fracture state has changed + int hasConfigurationConvergedGlobally; + MpiWrapper::allReduce( &hasConfigurationConverged, + &hasConfigurationConvergedGlobally, + 1, + MPI_LAND, + MPI_COMM_GEOSX ); + + return hasConfigurationConvergedGlobally; + +} + +void SolidMechanicsAugmentedLagrangianContact::createFaceTypeList( DomainPartition const & domain ) +{ + + // Generate lists containing elements of various face types + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshName, + MeshLevel const & mesh, + arrayView1d< string const > const ) + { + FaceManager const & faceManager = mesh.getFaceManager(); + ElementRegionManager const & elemManager = mesh.getElemManager(); + ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); + + SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + + array1d< localIndex > keys( subRegion.size()); + array1d< localIndex > vals( subRegion.size()); + array1d< localIndex > quadList; + array1d< localIndex > triList; + RAJA::ReduceSum< ReducePolicy< parallelDevicePolicy<> >, localIndex > nTri_r( 0 ); + RAJA::ReduceSum< ReducePolicy< parallelDevicePolicy<> >, localIndex > nQuad_r( 0 ); + + arrayView1d< localIndex > const keys_v = keys.toView(); + arrayView1d< localIndex > const vals_v = vals.toView(); + // Determine the size of the lists and generate the vector keys and vals for parallel indexing into lists. + // (With RAJA, parallelizing this operation seems the most viable approach.) + forAll< parallelDevicePolicy<> >( subRegion.size(), [ nTri_r, nQuad_r, faceToNodeMap, keys_v, vals_v ] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + + localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( kfe ); + if( numNodesPerFace == 3 ) + { + keys_v[kfe]=0; + vals_v[kfe]=kfe; + nTri_r += 1; + } + else if( numNodesPerFace == 4 ) + { + keys_v[kfe]=1; + vals_v[kfe]=kfe; + nQuad_r += 1; + } + else + { + GEOS_ERROR( "SolidMechanicsAugmentedLagrangianContact:: invalid face type" ); + } + } ); + + localIndex nQuad = static_cast< localIndex >(nQuad_r.get()); + localIndex nTri = static_cast< localIndex >(nTri_r.get()); + + // Sort vals according to keys to ensure that + // elements of the same type are adjacent in the vals list. + // This arrangement allows for efficient copying into the container + // by leveraging parallelism. + RAJA::sort_pairs< parallelDevicePolicy<> >( keys_v, vals_v ); + + quadList.resize( nQuad ); + triList.resize( nTri ); + arrayView1d< localIndex > const quadList_v = quadList.toView(); + arrayView1d< localIndex > const triList_v = triList.toView(); + + forAll< parallelDevicePolicy<> >( nTri, [triList_v, vals_v] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + triList_v[kfe] = vals_v[kfe]; + } ); + + forAll< parallelDevicePolicy<> >( nQuad, [quadList_v, vals_v, nTri] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + quadList_v[kfe] = vals_v[nTri+kfe]; + } ); + + this->m_faceTypesToFaceElements[meshName]["Quadrilateral"] = quadList; + this->m_faceTypesToFaceElements[meshName]["Triangle"] = triList; + } ); + +} + +void SolidMechanicsAugmentedLagrangianContact::createBubbleCellList( DomainPartition & domain ) const +{ + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + + SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + array1d< localIndex > tmpSpace( 2*subRegion.size()); + SortedArray< localIndex > faceIdList; + + arrayView1d< localIndex > const tmpSpace_v = tmpSpace.toView(); + // Store indexes of faces in the temporany array. + { + ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [ tmpSpace_v, elemsToFaces ] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + + localIndex const kf0 = elemsToFaces[kfe][0], kf1 = elemsToFaces[kfe][1]; + tmpSpace_v[2*kfe] = kf0, tmpSpace_v[2*kfe+1] = kf1; + + } ); + } + + // Sort indexes to enable efficient searching using binary search. + RAJA::stable_sort< parallelDevicePolicy<> >( tmpSpace_v ); + faceIdList.insert( tmpSpace_v.begin(), tmpSpace_v.end()); + + // Search for bubble element on each CellElementSubRegion and + // store element indexes, global and local face indexes. + elemManager.forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, CellElementSubRegion & cellElementSubRegion ) + { + + arrayView2d< localIndex const > const elemsToFaces = cellElementSubRegion.faceList().toViewConst(); + + RAJA::ReduceSum< ReducePolicy< parallelDevicePolicy<> >, localIndex > nBubElems_r( 0 ); + + localIndex const n_max = cellElementSubRegion.size() * elemsToFaces.size( 1 ); + array1d< localIndex > keys( n_max ); + array1d< localIndex > perms( n_max ); + array1d< localIndex > vals( n_max ); + array1d< localIndex > localFaceIds( n_max ); + + arrayView1d< localIndex > const keys_v = keys.toView(); + arrayView1d< localIndex > const perms_v = perms.toView(); + arrayView1d< localIndex > const vals_v = vals.toView(); + arrayView1d< localIndex > const localFaceIds_v = localFaceIds.toView(); + SortedArrayView< localIndex const > const faceIdList_v = faceIdList.toViewConst(); + + forAll< parallelDevicePolicy<> >( cellElementSubRegion.size(), + [ keys_v, vals_v, perms_v, localFaceIds_v, nBubElems_r, elemsToFaces, faceIdList_v ] + GEOS_HOST_DEVICE ( localIndex const kfe ) + { + for( int i=0; i < elemsToFaces.size( 1 ); ++i ) + { + perms_v[kfe*elemsToFaces.size( 1 )+i] = kfe*elemsToFaces.size( 1 )+i; + if( faceIdList_v.contains( elemsToFaces[kfe][i] )) + { + keys_v[kfe*elemsToFaces.size( 1 )+i] = 0; + vals_v[kfe*elemsToFaces.size( 1 )+i] = kfe; + localFaceIds_v[kfe*elemsToFaces.size( 1 )+i] = i; + nBubElems_r += 1; + } + else + { + keys_v[kfe*elemsToFaces.size( 1 )+i] = 1; + vals_v[kfe*elemsToFaces.size( 1 )+i] = -1; + localFaceIds_v[kfe*elemsToFaces.size( 1 )+i] = -1; + } + } + } ); + + // Sort perms according to keys to ensure that bubble elements are adjacent + // and occupy the first positions of the list. + // This arrangement allows for efficient copying into the container + // by leveraging parallelism. + localIndex nBubElems = static_cast< localIndex >(nBubElems_r.get()); + RAJA::sort_pairs< parallelDevicePolicy<> >( keys_v, perms_v ); + + array1d< localIndex > bubbleElemsList; + bubbleElemsList.resize( nBubElems ); + + arrayView1d< localIndex > const bubbleElemsList_v = bubbleElemsList.toView(); + + forAll< parallelDevicePolicy<> >( n_max, [ keys_v, vals_v, perms_v ] GEOS_HOST_DEVICE ( localIndex const k ) + { + keys_v[k] = vals_v[perms_v[k]]; + } ); + + forAll< parallelDevicePolicy<> >( nBubElems, [ bubbleElemsList_v, keys_v ] GEOS_HOST_DEVICE ( localIndex const k ) + { + bubbleElemsList_v[k] = keys_v[k]; + } ); + cellElementSubRegion.setBubbleElementsList( bubbleElemsList.toViewConst()); + + forAll< parallelDevicePolicy<> >( n_max, [ keys_v, localFaceIds_v, perms_v ] GEOS_HOST_DEVICE ( localIndex const k ) + { + keys_v[k] = localFaceIds_v[perms_v[k]]; + } ); + + array2d< localIndex > faceElemsList; + faceElemsList.resize( nBubElems, 2 ); + + arrayView2d< localIndex > const faceElemsList_v = faceElemsList.toView(); + + forAll< parallelDevicePolicy<> >( nBubElems, + [ faceElemsList_v, keys_v, elemsToFaces, bubbleElemsList_v ] + GEOS_HOST_DEVICE ( localIndex const k ) + { + localIndex const kfe = bubbleElemsList_v[k]; + faceElemsList_v[k][0] = elemsToFaces[kfe][keys_v[k]]; + faceElemsList_v[k][1] = keys_v[k]; + } ); + cellElementSubRegion.setFaceElementsList( faceElemsList.toViewConst()); + + } ); + + } ); + +} + +void SolidMechanicsAugmentedLagrangianContact::addCouplingNumNonzeros( DomainPartition & domain, + DofManager & dofManager, + arrayView1d< localIndex > const & rowLengths ) const +{ + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) + { + + ElementRegionManager const & elemManager = mesh.getElemManager(); + NodeManager const & nodeManager = mesh.getNodeManager(); + FaceManager const & faceManager = mesh.getFaceManager(); + + ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); + + globalIndex const rankOffset = dofManager.rankOffset(); + + string const bubbleDofKey = dofManager.getKey( solidMechanics::totalBubbleDisplacement::key() ); + string const dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + + arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); + arrayView1d< globalIndex const > const dispDofNumber = nodeManager.getReference< globalIndex_array >( dispDofKey ); + + elemManager.forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, CellElementSubRegion const & cellElementSubRegion ) + { + + arrayView1d< localIndex const > const bubbleElemsList = cellElementSubRegion.bubbleElementsList(); + arrayView2d< localIndex const > const faceElemsList = cellElementSubRegion.faceElementsList(); + + localIndex const numDispDof = 3*cellElementSubRegion.numNodesPerElement(); + + for( localIndex bi=0; bi( bubbleDofNumber[k] - rankOffset ); + + if( localRow >= 0 && localRow < rowLengths.size() ) + { + for( localIndex i=0; i<3; ++i ) + { + rowLengths[localRow + i] += numDispDof; + } + } + + for( localIndex a=0; a( dispDofNumber[node] - rankOffset ); + + if( localDispRow >= 0 && localDispRow < rowLengths.size() ) + { + for( int d=0; d<3; ++d ) + { + rowLengths[localDispRow + d] += 3; + } + } + } + } + + } ); + + SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + + for( localIndex kfe=0; kfe( bubbleDofNumber[kf] - rankOffset ); + + if( localRow >= 0 && localRow < rowLengths.size() ) + { + for( localIndex i=0; i<3; ++i ) + { + rowLengths[localRow + i] += numDispDof; + } + } + + for( localIndex a=0; a( dispDofNumber[node] - rankOffset ); + + if( localDispRow >= 0 && localDispRow < rowLengths.size() ) + { + for( int d=0; d<3; ++d ) + { + rowLengths[localDispRow + d] += 3; + } + } + } + } + + } + + } ); +} + +void SolidMechanicsAugmentedLagrangianContact::addCouplingSparsityPattern( DomainPartition const & domain, + DofManager const & dofManager, + SparsityPatternView< globalIndex > const & pattern ) const +{ + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) + { + + ElementRegionManager const & elemManager = mesh.getElemManager(); + NodeManager const & nodeManager = mesh.getNodeManager(); + FaceManager const & faceManager = mesh.getFaceManager(); + + globalIndex const rankOffset = dofManager.rankOffset(); + + string const bubbleDofKey = dofManager.getKey( solidMechanics::totalBubbleDisplacement::key() ); + string const dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + + arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); + arrayView1d< globalIndex const > const dispDofNumber = nodeManager.getReference< globalIndex_array >( dispDofKey ); + + static constexpr int maxNumDispDof = 3 * 8; + + elemManager.forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, CellElementSubRegion const & cellElementSubRegion ) + { + + arrayView1d< localIndex const > const bubbleElemsList = cellElementSubRegion.bubbleElementsList(); + arrayView2d< localIndex const > const faceElemsList = cellElementSubRegion.faceElementsList(); + + localIndex const numDispDof = 3*cellElementSubRegion.numNodesPerElement(); + + for( localIndex bi=0; bi eqnRowIndicesDisp ( numDispDof ); + stackArray1d< globalIndex, 3 > eqnRowIndicesBubble( 3 ); + stackArray1d< globalIndex, maxNumDispDof > dofColIndicesDisp ( numDispDof ); + stackArray1d< globalIndex, 3 > dofColIndicesBubble( 3 ); + + for( localIndex idof = 0; idof < 3; ++idof ) + { + eqnRowIndicesBubble[idof] = bubbleDofNumber[k] + idof - rankOffset; + dofColIndicesBubble[idof] = bubbleDofNumber[k] + idof; + } + + for( localIndex a=0; a= 0 && eqnRowIndicesDisp[i] < pattern.numRows() ) + { + for( localIndex j = 0; j < dofColIndicesBubble.size(); ++j ) + { + pattern.insertNonZero( eqnRowIndicesDisp[i], dofColIndicesBubble[j] ); + } + } + } + + for( localIndex i = 0; i < eqnRowIndicesBubble.size(); ++i ) + { + if( eqnRowIndicesBubble[i] >= 0 && eqnRowIndicesBubble[i] < pattern.numRows() ) + { + for( localIndex j=0; j < dofColIndicesDisp.size(); ++j ) + { + pattern.insertNonZero( eqnRowIndicesBubble[i], dofColIndicesDisp[j] ); + } + } + } + + } + + } ); + + SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); + + static constexpr int maxNumDispFaceDof = 3 * 4; + + for( localIndex kfe=0; kfe eqnRowIndicesDisp ( numDispDof ); + stackArray1d< globalIndex, 3 > eqnRowIndicesBubble( 3 ); + stackArray1d< globalIndex, maxNumDispFaceDof > dofColIndicesDisp ( numDispDof ); + stackArray1d< globalIndex, 3 > dofColIndicesBubble( 3 ); + + for( localIndex idof = 0; idof < 3; ++idof ) + { + eqnRowIndicesBubble[idof] = bubbleDofNumber[kf] + idof - rankOffset; + dofColIndicesBubble[idof] = bubbleDofNumber[kf] + idof; + } + + for( localIndex a=0; a= 0 && eqnRowIndicesDisp[i] < pattern.numRows() ) + { + for( localIndex j = 0; j < dofColIndicesBubble.size(); ++j ) + { + pattern.insertNonZero( eqnRowIndicesDisp[i], dofColIndicesBubble[j] ); + } + } + } + + for( localIndex i = 0; i < eqnRowIndicesBubble.size(); ++i ) + { + if( eqnRowIndicesBubble[i] >= 0 && eqnRowIndicesBubble[i] < pattern.numRows() ) + { + for( localIndex j=0; j < dofColIndicesDisp.size(); ++j ) + { + pattern.insertNonZero( eqnRowIndicesBubble[i], dofColIndicesDisp[j] ); + } + } + } + + } + } + } ); + +} + +// TODO: Is it possible to define this method once? Similar to SolidMechanicsLagrangeContact +void SolidMechanicsAugmentedLagrangianContact::computeTolerances( DomainPartition & domain ) const +{ + GEOS_MARK_FUNCTION; + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + FaceManager const & faceManager = mesh.getFaceManager(); + NodeManager const & nodeManager = mesh.getNodeManager(); + ElementRegionManager & elemManager = mesh.getElemManager(); + + // Get the "face to element" map (valid for the entire mesh) + FaceManager::ElemMapType const & faceToElem = faceManager.toElementRelation(); + arrayView2d< localIndex const > const & faceToElemRegion = faceToElem.m_toElementRegion; + arrayView2d< localIndex const > const & faceToElemSubRegion = faceToElem.m_toElementSubRegion; + arrayView2d< localIndex const > const & faceToElemIndex = faceToElem.m_toElementIndex; + + // Get the volume for all elements + ElementRegionManager::ElementViewAccessor< arrayView1d< real64 const > > const elemVolume = + elemManager.constructViewAccessor< array1d< real64 >, arrayView1d< real64 const > >( ElementSubRegionBase::viewKeyStruct::elementVolumeString() ); + + // Get the coordinates for all nodes + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodePosition = nodeManager.referencePosition(); + + // Bulk modulus accessor + ElementRegionManager::ElementViewAccessor< arrayView1d< real64 const > > const bulkModulus = + elemManager.constructMaterialViewAccessor< ElasticIsotropic, array1d< real64 >, arrayView1d< real64 const > >( ElasticIsotropic::viewKeyStruct::bulkModulusString() ); + // Shear modulus accessor + ElementRegionManager::ElementViewAccessor< arrayView1d< real64 const > > const shearModulus = + elemManager.constructMaterialViewAccessor< ElasticIsotropic, array1d< real64 >, arrayView1d< real64 const > >( ElasticIsotropic::viewKeyStruct::shearModulusString() ); + + using NodeMapViewType = arrayView2d< localIndex const, cells::NODE_MAP_USD >; + ElementRegionManager::ElementViewAccessor< NodeMapViewType > const elemToNode = + elemManager.constructViewAccessor< CellElementSubRegion::NodeMapType, NodeMapViewType >( ElementSubRegionBase::viewKeyStruct::nodeListString() ); + ElementRegionManager::ElementViewConst< NodeMapViewType > const elemToNodeView = elemToNode.toNestedViewConst(); + + elemManager.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) + { + if( subRegion.hasField< contact::traction >() ) + { + arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); + arrayView1d< real64 const > const & faceArea = subRegion.getElementArea().toViewConst(); + arrayView3d< real64 const > const & faceRotationMatrix = subRegion.getField< fields::contact::rotationMatrix >().toView(); + ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + + arrayView1d< real64 > const & normalTractionTolerance = + subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ); + arrayView1d< real64 > const & normalDisplacementTolerance = + subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalDisplacementToleranceString() ); + arrayView1d< real64 > const & slidingTolerance = + subRegion.getReference< array1d< real64 > >( viewKeyStruct::slidingToleranceString() ); + + forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) + { + if( ghostRank[kfe] < 0 ) + { + real64 const area = faceArea[kfe]; + // approximation of the stiffness along coordinate directions + // ( first, second ) index -> ( element index, direction ) + // 1. T -> top (index 0), B -> bottom (index 1) + // 2. the coordinate direction (x, y, z) + real64 stiffDiagApprox[ 2 ][ 3 ]; + real64 averageYoungModulus = 0.0; + real64 averageConstrainedModulus = 0.0; + real64 averageBoxSize0 = 0.0; + + for( localIndex i = 0; i < elemsToFaces.sizeOfArray( kfe ); ++i ) + { + localIndex const faceIndex = elemsToFaces[kfe][i]; + localIndex const er = faceToElemRegion[faceIndex][0]; + localIndex const esr = faceToElemSubRegion[faceIndex][0]; + localIndex const ei = faceToElemIndex[faceIndex][0]; + + real64 const volume = elemVolume[er][esr][ei]; + + // Get the "element to node" map for the specific region/subregion + NodeMapViewType const & cellElemsToNodes = elemToNodeView[er][esr]; + localIndex const numNodesPerElem = cellElemsToNodes.size( 1 ); + + // Compute the box size + real64 maxSize[3]; + real64 minSize[3]; + for( localIndex j = 0; j < 3; ++j ) + { + maxSize[j] = nodePosition[cellElemsToNodes[ei][0]][j]; + minSize[j] = nodePosition[cellElemsToNodes[ei][0]][j]; + } + for( localIndex a = 1; a < numNodesPerElem; ++a ) + { + for( localIndex j = 0; j < 3; ++j ) + { + maxSize[j] = fmax( maxSize[j], nodePosition[cellElemsToNodes[ei][a]][j] ); + minSize[j] = fmin( minSize[j], nodePosition[cellElemsToNodes[ei][a]][j] ); + } + } + + real64 boxSize[3]; + for( localIndex j = 0; j < 3; ++j ) + { + boxSize[j] = maxSize[j] - minSize[j]; + } + + // Get linear elastic isotropic constitutive parameters for the element + real64 const K = bulkModulus[er][esr][ei]; + real64 const G = shearModulus[er][esr][ei]; + real64 const E = 9.0 * K * G / ( 3.0 * K + G ); + real64 const nu = ( 3.0 * K - 2.0 * G ) / ( 2.0 * ( 3.0 * K + G ) ); + real64 const M = K + 4.0 / 3.0 * G; + + // Combine E and nu to obtain a stiffness approximation (like it was an hexahedron) + for( localIndex j = 0; j < 3; ++j ) + { + stiffDiagApprox[ i ][ j ] = E / ( ( 1.0 + nu )*( 1.0 - 2.0*nu ) ) * 4.0 / 9.0 * ( 2.0 - 3.0 * nu ) * volume / ( boxSize[j]*boxSize[j] ); + } + + averageYoungModulus += 0.5*E; + averageConstrainedModulus += 0.5*M; + averageBoxSize0 += 0.5*boxSize[0]; + } + + // Average the stiffness and compute the inverse + real64 invStiffApprox[ 3 ][ 3 ] = { { 0 } }; + for( localIndex j = 0; j < 3; ++j ) + { + invStiffApprox[ j ][ j ] = ( stiffDiagApprox[ 0 ][ j ] + stiffDiagApprox[ 1 ][ j ] ) / ( stiffDiagApprox[ 0 ][ j ] * stiffDiagApprox[ 1 ][ j ] ); + } + + // Rotate in the local reference system, computing R^T * (invK) * R + real64 temp[ 3 ][ 3 ]; + LvArray::tensorOps::Rij_eq_AkiBkj< 3, 3, 3 >( temp, faceRotationMatrix[ kfe ], invStiffApprox ); + real64 rotatedInvStiffApprox[ 3 ][ 3 ]; + LvArray::tensorOps::Rij_eq_AikBkj< 3, 3, 3 >( rotatedInvStiffApprox, temp, faceRotationMatrix[ kfe ] ); + LvArray::tensorOps::scale< 3, 3 >( rotatedInvStiffApprox, area ); + + // Finally, compute tolerances for the given fracture element + normalDisplacementTolerance[kfe] = rotatedInvStiffApprox[ 0 ][ 0 ] * averageYoungModulus / 2.e+8; + slidingTolerance[kfe] = sqrt( rotatedInvStiffApprox[ 1 ][ 1 ] * rotatedInvStiffApprox[ 1 ][ 1 ] + + rotatedInvStiffApprox[ 2 ][ 2 ] * rotatedInvStiffApprox[ 2 ][ 2 ] ) * averageYoungModulus / 2.e+8; + normalTractionTolerance[kfe] = 1.0 / 2.0 * averageConstrainedModulus / averageBoxSize0 * normalDisplacementTolerance[kfe]; + } + } ); + } + } ); + } ); +} + +REGISTER_CATALOG_ENTRY( SolverBase, SolidMechanicsAugmentedLagrangianContact, string const &, Group * const ) +} /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp new file mode 100644 index 00000000000..688837ac9fc --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp @@ -0,0 +1,174 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * SolidMechanicsAugmentedLagrangianContact.hpp + * + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSAUGMENTEDLAGRANGIANCONTACT_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSAUGMENTEDLAGRANGIANCONTACT_HPP_ + +#include "physicsSolvers/contact/ContactSolverBase.hpp" + +namespace geos +{ + +class SolidMechanicsAugmentedLagrangianContact : public ContactSolverBase +{ +public: + SolidMechanicsAugmentedLagrangianContact( const string & name, + Group * const parent ); + + ~SolidMechanicsAugmentedLagrangianContact() override; + + /** + * @brief name of the node manager in the object catalog + * @return string that contains the catalog name to generate a new NodeManager object through the object catalog. + */ + static string catalogName() + { + return "SolidMechanicsAugmentedLagrangianContact"; + } + /** + * @copydoc SolverBase::getCatalogName() + */ + string getCatalogName() const override { return catalogName(); } + + virtual void registerDataOnMesh( dataRepository::Group & meshBodies ) override final; + + virtual void setupDofs( DomainPartition const & domain, + DofManager & dofManager ) const override; + + virtual void setupSystem( DomainPartition & domain, + DofManager & dofManager, + CRSMatrix< real64, globalIndex > & localMatrix, + ParallelVector & rhs, + ParallelVector & solution, + bool const setSparsity = true ) override final; + + virtual void implicitStepSetup( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) override final; + + virtual void implicitStepComplete( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) override final; + + virtual void assembleSystem( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) override; + + virtual real64 calculateResidualNorm( real64 const & time_n, + real64 const & dt, + DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ) override; + + virtual void applySystemSolution( DofManager const & dofManager, + arrayView1d< real64 const > const & localSolution, + real64 const scalingFactor, + real64 const dt, + DomainPartition & domain ) override; + + void updateState( DomainPartition & domain ) override final; + + virtual bool updateConfiguration( DomainPartition & domain ) override final; + + + /** + * @brief Loop over the finite element type on the fracture subregions of meshName and apply callback. + * @tparam LAMBDA The callback function type + * @param meshName The mesh name. + * @param lambda The callback function. Take the finite element type name and + * the list of face element of the same type. + */ + template< typename LAMBDA > + void forFiniteElementOnFractureSubRegions( string const & meshName, LAMBDA && lambda ) const + { + + std::map< string, + array1d< localIndex > > const & faceTypesToFaceElements = m_faceTypesToFaceElements.at( meshName ); + + for( const auto & [finiteElementName, faceElementList] : faceTypesToFaceElements ) + { + arrayView1d< localIndex const > const faceElemList = faceElementList.toViewConst(); + lambda( finiteElementName, faceElemList ); + } + + } + + /** + * @brief Create the list of finite elements of the same type + * for each FaceElementSubRegion (Triangle or Quadrilateral). + * @param domain The physical domain object + */ + void createFaceTypeList( DomainPartition const & domain ); + + /** + * @brief Create the list of elements belonging to CellElementSubRegion + * that are enriched with the bubble basis functions + * @param domain The physical domain object + */ + void createBubbleCellList( DomainPartition & domain ) const; + +private: + + /** + * @brief add the number of non-zero elements induced by the coupling between + * nodal and bubble displacement. + * @param domain the physical domain object + * @param dofManager degree-of-freedom manager associated with the linear system + * @param rowLengths the array containing the number of non-zero elements for each row + */ + void addCouplingNumNonzeros( DomainPartition & domain, + DofManager & dofManager, + arrayView1d< localIndex > const & rowLengths ) const; + + /** + * @Brief add the sparsity pattern induced by the coupling + * @param domain the physical domain object + * @param dofManager degree-of-freedom manager associated with the linear system + * @param pattern the sparsity pattern + */ + void addCouplingSparsityPattern( DomainPartition const & domain, + DofManager const & dofManager, + SparsityPatternView< globalIndex > const & pattern ) const; + + void computeTolerances( DomainPartition & domain ) const; + + /// Finite element type to face element index map + std::map< string, std::map< string, array1d< localIndex > > > m_faceTypesToFaceElements; + + /// Finite element type to finite element object map + std::map< string, std::unique_ptr< geos::finiteElement::FiniteElementBase > > m_faceTypeToFiniteElements; + + struct viewKeyStruct : ContactSolverBase::viewKeyStruct + { + + constexpr static char const * normalDisplacementToleranceString() { return "normalDisplacementTolerance"; } + + constexpr static char const * normalTractionToleranceString() { return "normalTractionTolerance"; } + + constexpr static char const * slidingToleranceString() { return "slidingTolerance"; } + }; + +}; + +} /* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSAUGMENTEDLAGRANGIANCONTACT_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp index 3604c3d82a1..56b6605318b 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp @@ -58,6 +58,14 @@ DECLARE_FIELD( totalDisplacement, WRITE_AND_READ, "Total displacements at the nodes" ); +DECLARE_FIELD( totalBubbleDisplacement, + "totalBubbleDisplacement", + array2d< real64 >, + 0, + LEVEL_0, + WRITE_AND_READ, + "Total bubble displacements at the faces" ); + DECLARE_FIELD( incrementalDisplacement, "incrementalDisplacement", array2dLayoutIncrDisplacement, @@ -66,6 +74,14 @@ DECLARE_FIELD( incrementalDisplacement, WRITE_AND_READ, "Incremental displacements for the current time step on the nodes" ); +DECLARE_FIELD( incrementalBubbleDisplacement, + "incrementalBubbleDisplacement", + array2d< real64 >, + 0, + LEVEL_3, + WRITE_AND_READ, + "Incremental bubble displacements for the current time step on the nodes" ); + DECLARE_FIELD( velocity, "velocity", array2dLayoutVelocity, From 4e0667b9ae7d3a5a3910817284db8fc3f1d9ae7e Mon Sep 17 00:00:00 2001 From: TotoGaz <49004943+TotoGaz@users.noreply.github.com> Date: Wed, 19 Jun 2024 11:40:51 -0700 Subject: [PATCH 103/286] Remove integratedTests as a submodule (#3176) --- .devcontainer/postCreateCommand.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/.devcontainer/postCreateCommand.sh b/.devcontainer/postCreateCommand.sh index 5a7ad497636..b2ad6cbf9e0 100755 --- a/.devcontainer/postCreateCommand.sh +++ b/.devcontainer/postCreateCommand.sh @@ -2,7 +2,6 @@ /usr/bin/ln -s /workspaces/GEOS/.vscode-codespaces /workspaces/GEOS/.vscode # Activate the appropriate submodules git submodule init -git submodule deinit integratedTests git submodule update # Load the pretty printer for LvArray echo "source /workspaces/GEOS/src/coreComponents/LvArray/scripts/gdb-printers-shallow.py" > ~/.gdbinit From 3bf12d213b69652b0e73a135b47d2c23ae05fbf4 Mon Sep 17 00:00:00 2001 From: Jian Huang <53012159+jhuang2601@users.noreply.github.com> Date: Wed, 19 Jun 2024 16:05:58 -0500 Subject: [PATCH 104/286] Fix tutorial example for thermal debonding wellbore problem (#3170) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 8 ++++++++ ...asticWellbore_ImperfectInterfaces_base.xml | 2 +- .../displacement.png | Bin 37271 -> 36806 bytes .../stress.png | Bin 50032 -> 49927 bytes .../temperature.png | Bin 35345 -> 36019 bytes ...astic_casedContactWellbore_displacement.py | 4 ++-- 7 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 7df56f3905f..95c39c2c482 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3130-5671-b19ba86 + baseline: integratedTests/baseline_integratedTests-pr3170-5687-d6e16c7 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 1de0f14e95a..9b300d295ee 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,18 +6,26 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3170 (2024-06-19) +====================== +Fix tutorial example for thermal debonding wellbore problem. Test case modified. + + PR #3130 (2024-06-19) ====================== New solver for contact mechanics based on the Augmented Lagrangian Method (ALM). New test case added. + PR #3160 (2024-06-18) ====================== Two experimental options for compositional flow solver. Rebaseline because of the new input flags. + PR #3165 (2024-06-18) ====================== Small bug fix. Rebaseline required due to appearance of useTotalMassEquation in well solver params. No real results change. + PR #3088 (2024-06-17) ====================== Adding temperature-dependent Solid Volumetric Heat Capacity. Rebaseline because of the parameter change in SolidInternalEnergy. diff --git a/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml b/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml index 17f408759b1..3a6d0653f9e 100644 --- a/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml +++ b/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml @@ -79,7 +79,7 @@ name="Fracture" faceBlock="faceElementSubRegion" materialList="{ fluid, fractureFilling, fractureContact, contactThermalCond }" - defaultAperture="5.e-3"/> + defaultAperture="5.0e-4"/> CSof z=X=hX-#KU2{4-}}tywd!?SjpY_sRRY?(4elH%e1o86Srl2ZA8{$Bz`XAqWKyL9lr& z4DgqGBQwk3hlJ-t15X{77oOhc?$(f+xu>h6i>ITV1>;L=cMm%kXJNj3d_p{oww|7@ z9{2hAo&Mtud@k-b{9K|855bpUyFPm60YQZ3$p5ec*?c<)iWh#YD6jh}V|&);mFmPT z=H98*93|`9M8i8OKlnHm?o}~=9sjC{R#MGNR_<3=^Ic=4iB3Z1e@fTthpcv_PcuE%td^H%Dmg=mP!z#GD^VU* z6Nnl7<1)pAq9P+B`|(iakk5tNp#<=>yI%le1y6;9|Noc&pBolRX~?+VolQzw+T6w_ zV!Xu2a<0WcEH6GLMsaJr1o^iHuPuwQuTOn`I!;xf$I^&}mz3~Qi#f-X7}b(X&SeE$ zV8dWAS2wpHg->#hj*f*pNnkS9ADjPz_8NCv9=N&+yco=gTI!0=)yY?Xwecm*^>}m4 zZ?vncD_1$5e*IS=NgRW0ocEkR#ctCfL5<^7js^)GU2G64CNn1|7KeI{=1fc zbto%~h0bOub8MGJ%$Zg_Lp*4G-4;S1f>0APGvnq0F4eN~d{1`@46C_B zou+lS{rF8=@H8|uXk`Ovd5vm#k}lc7qO5WA_hsQX zc`!(1?X9;r(eLj$ylK%dL!$D^AjT2hrDuo5J-}$V*GL(-xK;8;fsP>l_;yiFLF!q0uVK%#7lHany54 zYieqGb;r;Xklm6qJJO!*dM<=Jl?NYsx_cC&9 zqhN$xU0vaomBP2?_XNiuc6`4m5I3M8ip_Lr4Fl_Ca*-__%|@)Gw$= zztm!;&JD7Po<821C=a-P4Y~i=eM81gbmva+NUk!={rl7o z2LDhQ|BLyxtiVo&z^kC^%To#oQ#qwu{nFp(t`tF8a^$W}60(QH zUFYRyTKs7|R{P}@6j0uaI=%TQ>7Aqg@je6(4Mhv7KL^{b++$5$^}Psomj4OW%-h&8&$tEA+Kfb%tO}96f1^T7*EtflzRSpy1y3bJ%Cx3tMUu>0b%@IX+y9U=@jj}M!eSZf2EFI+j+eQ*sKm|-LQO+IEWnI;Q_psDdL}x5Kp3rqUvQPyKg02)erQX;LGtQT`!l$c) zqA7w1=->~dp_1`mY%JhAslj)$4SzxW^YUj#>LLCoY743`3hm>AwD>3SnI+#+3O z221$pwD}WE=875USZBjaboI<+R7H9jv={wQgC~s7W*X zu}lEbgFRVGX#0oOpoKOv25m4y&`O%?Fu8AytL=OcdN@ck zS#>wzEeakjr!qbVd#Y0+05b=c|Mwhsm-}4|mLoY24azOhEi5duwF~EWcjFtqcd2(# zKXLpnUphF>jkiKO-EIBSkl~!OPACHv7sE@8f;wY^Tw2T>z`mt=Cy-O)^!tt5QYY2+ z;mHa4Xuigf*mafNXlQM1ZCgvZW!D=JRJP_YF)-fj%r??|#>T=T3cTKj54$KN$-1!MNPD}rCmKSQBs zM8cs^Xj#P_i*6#OI6CfwdvOdD--k3>R>^6&L*wI{co-FjG8K#)^-{m^%dTiq=z12% zzX|cua%1J-z=fE3c?W(y6r{?m13I-R0})Dblc!nRv~? z$OwU$9i)^SR9$^9CpTBn?&oJIyHuWM+RJ`ROG}CA>9z@J;Ow}%x&o(k80hM%QA=?# zkCnCc#$0}WJ}LyxF%fDtc?R?p)Y&zc{@26Rz1X`-!(Z>WTkJkJTT%iKThmvt>3OqA z=UFH^m}dNgNFsMwcg5RX z)*-;|n{mDNy!1epEJLNu&|qcYP^L6E^EmgUxMYbN)_bvbW@|B^nTqNT{+rGvZ%BK`7 z@2ykVYpH}^FtV~L-pWWz(^cD#DWvh4%x`ZS&-+;UQO9C{2(x#38c|(ct#xqLAxI6) zgOi3{`hL&H-KLOjZhgj7{)mnSFV_Y))PeD0`O$$7pXh|prrnm79}#|>G%!%ljM)yu z#r=5Ya%4MSIaDF&kcz&zXiRkH03}aj!eUy4*U@oV+dYZH$YSC9HjY??na?kDGPZEK>$3Wqj7n7c@L{j*x1-s?0iPG3U$x(YAY&!Vj7@-0T7Mz{Hrb( zRKZrJ6ifY(i-wVbXeI<(*VB*x_N)Y@bw(x`}gkx@fXKIUsQq!Ws^Ociw$5M z?}W>)7I6&%_QQ;?PD^UxGX8K}3b_BJncD)&-gaf!45omO(B5Vd;)4rH>vbL?Ln8HT zUs=WPoQ;TqKP|1%wJoQtFP*fNf(-YcR;Sa;2C~GV)RdRY1K@oq;-##pm<_PNdFImA z)(4L3Zzheyd1^HN)?~>5B<3t{ZERqtJh4ttD$!#R5~@H{5KE^fkq9``x^9w|*~Di| zfc$K-kpc@3Ez<|%?ButFNrgJy{DkR>-B=N-n;XJo2(~p&wL$N9!YzadDjhQ+yoeasVpYL@-TaL|K8LIhp@NQu}EL-^Dph$f%I`T2Qx zTL>o2Aq$g7wr00p>)^)~T|tjkNcIMcl>=4MyH|vXsRFyy$w-1hm1)S03}?Q20#1Ez zIa%=X1QvM36kqb37c-xe)E)l#p)W1KE@Vksr~uPrE`o@bE^I?^=gytsDm$I+nR*hh z&0jExm6esUe_(B6BMKlgi=Uq#pKVtT&F}2QS@)%W3cS6!5TU#8iC7)@un+Lp!u9E# za`Wrsy;<+MPbQ5o9}ZGLd1@cRV`A`{j>nB2J$@|T`0{U=!vvr1SKXd;2JCkq46EU- zw;0+w_@^9fJ?l=#_Eb~;x6;GqmV+Lvexc#L^Zd2`m+mL$=RKWD0A6%yVYS`0QQ-o6 z=*gEmJv}|NXciV=`v3r~7*8)9GhS<1b!vLHd3AU;9LWD?cC3D#qq7sG;pvN)e^JIu z)6~2sN>OW_S3Vyep@kEm1K@&zkJH@m(%M61%fkbe=&7?_chXdF=X^B5b}5TVRyNTb z`DcGW>~On0ajL7UW8~$R~P#C~rQvyT0A*w8g93b8Ybh$ODKHS?3&3%tdA z}qfKmuj5ka+Tb#9xH`E-bs#(%MLiVmLR+bA|!x#937iu?q3q|X{;A7Db=9h;OIy2yF-eDoX=;4kzqM=@p zf-jjRto^%{a8`43hTlarKfJ|%LAQ~5wac?(BcXbI|H?$lkF$|N)D|i>M9-N15Yt_i zDt@T%{^=PB@yKWxjBzAsu;ZaRTcy(n+PhacnqNz06kR7DhU2N5MEl8U~sQzoqEHDcFiI{zys(I75#XEsR;LFHx; z=e?0hi_OdKgE2Po|7 z$%k#U;_yO#NoMW84hctdJYuS|ix|+}^(IzMaRAzVuebhq(OjZ>1dq;_lNM(H(0>O3 z!1xZ=*EicipXa=ROSGw;f#&%wYWvK07&OHBZ7b>Hu*mle7>Aq2Q^LIy45fIC@oy<4 z`1aN4rnmi6j6&LZEX+ALu`tHOcXkrpG!OJ-BA6T+bAEFl5br53EtcE#(McKY63`=v zD+Ms|_r&zFPTSi{zrzz*0PKR<*wp{(-kx$-SD1CRU}k=ugQT?}xi$T-3&V3`AeOja zJz};uqt(lOR!uWGZi^B6u^I0y;Fb;xKc(ocZV8t@=l*d@do;{odnU?;nI%Z=!?NYV z+c&W(!iH(9)QXD9{9p;cDDFAr+tcaH0Y4zC+BSsTIjQ%QkObmvhED%TQj+ka;p~H> z=}N@G3Sz#^{jI&+H%q_0?2KY+_zH+-1B)GH^fI)sR>-IX*xAWjT^p2pZ3dIa{@x)T z2?X2jU3qFqQ@L2Rb*5IUs3;;78zFlO?Y3|?64FOj$VG@XjRX$8GET47;?t?Mi8n5^ zLO|Is|29$m=;~AMyl3AHV*{J=S7C*Qxu@s3jKYg(X5vJ8Wf+N8Q1X-ccEX_AKX12i zBEn#@*JxK)!U8Yw_S!H%e%hR&f`~2`O0fclh_kNvVT4YDIRL%!XncGdO=4Qd$Wi>K zTE)4(P#3wSi*z50K9D(#F~+45P@Vhycwvi^g55jX;&G|G;+NbHyk;*TzCjF^+#8IkEWVMussR$yOAh!{+QwMdQ*44-;0fTpLQ_s27N_^VEAMmrsCk> z6NE_!AI-NGc(s}A*Xeh{<9glTCzX-TX+&~Z8PGffWk2OMJ9W-}l5$Y@w`+-k?DgAs zi>DL1x5P_<&>_gK6d#U%#@_4WKbRZ2y(Sd*e58I^>&~`k@gYxW1hnOmpwvhk%=WjQ zbN!cm)V0ACv`|b!l(nJ0fG~w+UPQU2`~2e+F89xG@@)q5d`CG>z36?sD=fUyN@z3G%O;qcYu&)# zigvOavA8q)bLEs2ISOn!nvhXVH#qoo@_Af0lLaEB2AL;o6>v#KKR1Tijnlzxzv=YwLG1Y$8{l>!}-Fj8wSncUOheUPdTx{8L8=8Nq)(-J)l(*|Ca2kPvB%aP^{Gq=P=`Wi2}#?hV6 zo5^3Qrs)T0;M0>)VJj*Lox#9q#TCY;;(n8QbtAbqAO_dIn~=(mnm3vsgpO+^E6m{SYdfv)+$#8QmW@d+NWz*L+w6SrJ=wZIS?H=5= zIkv(u{N0c&%a`D6i@!a)ydX1t{_UGCN-sXNY&{wb^M(nrKi!gdWKMTWBOW^r1;yf`o`OS=}OQ96>(RQlON2X2_xtGNwKv` zd#l=GPrr7X|2l8p4AA4UmfKqAtW8L0 zim&e5O!RUr_G2ZWF+e^W5+ZnY*Xe^iJk|yK6aB;VWwg))GgpJO+lna{Ytq&L<}la~v)%5?;S@yKrCg z4hlMKHQmBS{ckDw(8BTL0ggM6^?HHa!YOxgakF*ux6&nR(F4xfs4H#yZs#@LF=NK` zr!!??kx3Boa5s>5yclo~{_#B+ooRV#)u`60$YMu-cBm`9Z(u;}W?-$#12=ax;DI=r$jX3Fx!@ynM;$qFy#fJt;O1)8Z9({DSA`a{yJWGo4 z#Bgz+g*Hg2G#kZ(yBJy4y%+G&a3?n3zJ3z0=nL3(wzo_A5otN z&er)r6=Yi%$KOW{o~@uQii*NZctd0He~#Jfy1NB+CUl&cR?R*{a~>9VF6 z!Qi;L#B8~)!NV~z!7n{k><>OzXCMnxkooE5j$%K~Gh01TiWyFrrm~BUMu`zgMI{lB z!r(7*);%;GgEv#>N44{`=(|Eu3h(oYZ#@L>pFfwYwwEX|BV<^et*Epnx>&~`Z8AMw zpBdM?(U>1ON=>b>);hgdA9^T}`kw3Z)p!Xv2T5(s;8bxj-W)~Et(zSoeRBIOhem49 zvv2Tkh=ER})O}*Yd(_*r^(4}-kKkd>as4x*&dIR(y@eH$gm=uGT#qN>I3)gc0Hxs4 z(3~gl9Zv-9wj>3a8E5#JG*MFCdm^g%tB_?>mNk}dHouI@lX8TImTir zd+&rA?PNcgI5=#>?8FxFoG`8Id=(VK7cb!v!@yHw06RPDmYYfMm1MNkv>LA?7a&gI zc5pcNzWjC9?6;_d9*eNfO>Bv&DMsYl;Jb!oGWbq>rC^S!B_{O>ad)zQnQo^1JHf4t zbz(;tD|1p=8FX<3dwq%l0BgFKM$0!NOuuWdK@oTcdIwg_?12tFugc2U>kd7k*G~ZR z$DE|ixjY#{VVbORO)tyW7-iDT6)$@i*PDn~`Y}KeT4CicOSTUIJLTSyr;_F#H&%ps zw9eGUwk+0&ModgbcZqz@NX3`!AzA;1?capmsq#j@GdfT<$C4_)eg5*Usz6auLj=Gb z-A~Oo4HNlVLwk2k;O5#}g7n*_%ra>EqvObQFMVQt$U!YZyWu}TJ@T$z1b}>m~*@F0fJx3}# zvyeAv#Cp{D=O|i1zhf=|-x_1>o#}gK(<1ZlY~baVK_nciCQq1i-T;J6EKO!?veNrP z|6BKl)%$y>^iojEnSzW`rpV*G%fDjvZzelq{XjOm8jXDK)9vl$?gbJKI61HT$y@`Q zsh3JO0UehzF$wWI7BDnNx?mD205jU{70zIyp#CW#H$3oCjewPjS%@P;BP%k~kk@Dx zE#T?b<*JL15~zxbP~bINZG%@3;FkM7MMrP+swnC{pG0}2_~MHijoAd>{FToXf7uf< ziFZd;cJA&Q3+*7I7S9K5nFW)Y_^eyHTm%9cVKg}mq@NDsP>CVz*)zn&F(4Isdh%q? z(dv9gt5(3EVC161@7}$Og@Y5UT^I^92_WTZdua5g5dJs9mHu57H#avf3A-vBa5l7b zbR&)4F2;>7OD26ZGQ^32+K3b$4P~Y!A|o^JpR4iULj(i}8W%`84vHXvu_$%>0}xe( zbFzgA(4CZ@?JGWxH1-^hlo1pJ;22m$MadTy7O)5jl^q><0MmgZy|xrD+nMt)8cAsU z`0+#Ti+0=G9E11npRs&w0)kGUg_ipq0zA>maJn=50I+X>yfZ0o3L|>86e}j+I*+Jm zc4L0ce3w-2ca59@WkLdDe!Sg;I)?x68d&pdShWMH@CzvLmUn1j`KRL1k2^|46cij# zWC$kV=IKLaWn5@+rrzT`Gk45B3?%Y_F>+dIh@k~H z`C(Yt#NRs}VoeEaIuFV6|ClU4Si`4LHR%nOb~@f?wFKN5ARz#=tD+)|RPH!);kmiF zfc72vW+Hjr0uJK`g}TgKTsZhNqWvD~etuGSNJvIXjKr>GjEs!V&d-^^YnEMc9YAjS zG-8YQv#zl**KRZ~^359sIXStg1HP~SjeR}mm3gwFbb3xxN$(kgQf0`y)kp*w;gy~~ zT!S(wT^Mt+{6Ua)9}f{-3Bok+?%sr{keY1)IR&4sR_!;rrA{9P;SWDY^%yjSfDG7n zU*M;RKvYzetC!b6<=og98TcJN6BPn{E5_yQ%#7e+L)p2h;8 z630(f+N@2r+6>W)i;E|3PV0&SVJPP1U*FRb7zD;-vfd+q)4^=k@7%6v_rYAdC+|;}`qKqbnV6U^PB%6-3Z52`H+XKK*x0OT zn|yepoIAn@G}D`#8?YiopU}68E1^Qh#>T_B${e}N`y!n24FYW5-t*hfre2phq@jyC zSA|AIkc&BUX6tdgZl$tx#vVqLmXe2H;x=7;CC|HBTd*sQ=fK{|S*-KFtSO8(bML@` zy5bq)2f(#s^5p-Xv!E>|-@R-pBuRrc=P$ANKAz62YV zC_Q=dMxNVDTl>y^&-H8#otdWS-tlqrnwlD)6R;!>`;6tmka^w)g2ij*Pti7d(fsP< zSv?H?<%_YQ^Num@(GI@jESEn0R5MLvT#cNk2+I7i}t$*rG9e zMJ1)pA-mazd&MOs_&)*pH-EG-dLhEr^C7aJit8y#IDS%+>g^?end_%*+=3AZFz9%c zP=PLDeZ+lvZz(lviBwq8N>%9{Mjp~o@TXZ)DV{zS?BK=uwh&6`*CMY^w(SJ4+JFD1 z0onvQBg1bDOiar^O+J$iUfk+gGO@%gN{F^L82AJR#F_FWhF0QE5{E`7kXhWW&fM_m z?voC@zxQC`n@M!asqF1l$mFB}D?2+g3kzy_d3j`PY?xt*Xs5D*qQ)m>j}%Qah77}QFiSQbM2zc8uqTPX$+fk$hr#aNo~}j;_CNEVHN6rnE-ogbq>Mxo zoo9>D2DQ#~fJ6sP1Of#S6;)y2?$Q#fT%6L$-X7-%!l1}Z`-Yw`xT95f1p;OE79tQW z{s^%-NcM`+2%CZ@!Kgi4&Me!J&2d^JzY#{9SWd|c73-Byi#kqf+EVX#2l@hX7|3tL z)YOLa5-(rAG-&aYNaZ(u{^Grg>V^2Vw z(lCZ7-^`^%_6Con1_QRItH_v&Qp$i&jDiX~h6WRWD)ROj`*AdCu~Y|A65M?LL}_n^_cYyWW;1-|9my)DXH+&uTXmgYU>SGNSjLw z?BW!YmTtv%k&GMu%><^e&&Y`d1cdoN&B3Ju5*SgDA##At%nr^=FEo7mjZ4UrGa-@5 z=%&Ug3H6cl>|5?c$4O{%x;MK_pC5gD8&6-LSGtQ)nT+He2fz%98l1kq^-ab@neNl+ zA(++zbza;c>vR;nI@agrB!w9?8)kdEoKwEL1{VS#WJCw?^UnIDmNP>j-j9xrV0qp+ z`f54PDwL5C_hVv{+wY|+!^b~EmI`IBglva7R z7lL`<1$4Dvoaf@_WBNg@x1wr3Q3Y4!=n0YQclDcJvx_?Qf(({ivuFi}wb2_@U0ovN zA>VVfrY88s@rvbQnkhzR;PV=SJ0qhJyr3U1vaMCjx{2nGCsr`Jeb9$8(aHJHp8IJH zik%I~A}XxqR&yrWIFxh!d;qm~d_YgOHSf^$LR)rgt8vGVKP^qWp^;B|zXFK?1VLa&pwO&!Hql9o zh>VOW&X&ON(BZUdNaYQ>z1A3%sB_7}!(d^yaxM5Rb4^-S4x<)<-ir=w=+`;u4<3v6 zrWaV0gLB~yFqPPEx)Tv=p}%k;^xR?>gX(;AWcbF>Lnli6lv`{DmoxrhsU)&lg(|N4 z)D+Jv_xAP>heNW2zBRKX#9GAl^&l*vnwz^zH1HZN3wg@OxHm5^a|4__xO3_veA9Q3_j?uzQ&NkOv#>iR(7fcTQO>?yplff$lSO=9n1 z9O?Mt31d>GCP^Vs_6IF|S5cK*3W9l|4ZTcq(88Z)_usXIj~*w&7KUW|s-7102C+7b zsZLiVZc$N$vcyI`i2y5(IHgconab!H%;|Tp({xoZ>i56D!4%Jzs(r|Smp#CovVWv# z9rCX?cEt+uaWc-dnmS_=K#w0E93z4<4yB}nrmI)pumN(zpVm%QR|w$q$nMYXn4wHe z?gZbXDLjJPP%)REu_esAOKYg?mN4FxOc=XB`Cl2f^QebL$EM=&%@=Sa(G*b_mLgnBLO;M$bYdOP>W0yg) zH}M=*gnE9MNrG-*W7K^#R`I1Lnqe)*bamepNMT>M&^jt;a3go*(U0<))KdOd9%X7& zIfY<6G(v{dQb9q)Y$HHDJ!)OEbl}{iqO7rJGkyB?pcRu@#{%ib(a5+O7yhR8V32pR zw$v}{BYuXY4JB#jee{_+b8+<89b*$YgX*t-Ka5M>8?T_vn~}V}K=RQ!9O_!*!ZlUN zZH7tg07ZBEpYHY%cPYpB{+$%0Vr6HABwu#(%GP6kI6Ie?amjfThaBp6_{z!>3!eGv z5|=x3nCcnb*jR+L3AqV}MjwB)$;;?v3czefP=L;CJFUCJUovUHC~iRT(j1qCiUtHZ zW+8{TIQN_l0y_5-YpZUpA6bC}e%JRj^9fw9@9)hA;oXU+>wD~A4im9u43Rg{oXkPj zEJ~#vG1jGZRal8aHeiHh`|nERLf}mzY(9bk1r?+F97`iJnK!&);xj8qTk5a(9t__5 zs+-tmR{7#UuqrJLWn)8>y^$kl24pTE<77NFBcY+0s+h<@Cn8NwT3uD6!dfN30dYfH zhk-805q+Lb^&Ru@XYAoRLCyM#?V_`OVR!lma8&gIzklqhTyk0%AL{C1vkg6J$|b4t z^HC%Ri97Fv<%~1r{F+c6KgMBYgZZ8;2R6^3s!!Kq=H$FN<*YB5TpMnB1_P7ntyQSa z_RmgQFHC5x)>O{*i3A=>IZW295xS#h>4}Ex3?=s8mi?kPr@&Oi3w;`GG}sp-k9Ao zVQG9lT3rox4)jkOYs}5oSJ=`pF5J?KnrxN7kwkd!_{qg)X9|% zQHH!B2#+;)jQ8s`ziWYaZYA$SnPFEi&fZ=^n_2VggX#c(pXMr&DTTr__HbzFaA0Iy=1D^1OTK)Ms6+MXpfq4BZt(uDx zLpBbC9w+?l6_xm()+}Ln3E3xK@X)q?B_^3nd}X_&-3)l?jd`Y7zKG2D6|LAwaS&rq zox$KidnL8*7ql;|Vfx>oH2ywbnLm5St7=mbnqs@=0X#fFk9H4M0PJC_;l26Y)|H`! z1&NKm+&Lx&>9r1|v$-2@Wnyi3TrZCGL91C!7S4s<}wtgB0x!6N5T+vN(MiPAMy z=j#G|nq`b`#NL>`b)R`GHDJM?mhy4*^6|>N9z;?B#EDc~&RGxS1|=s85@!x_$9li) zyJJRxP1_RTz0C4fYHOSh>F4T*DesdSlqSSA-KzP_$|xzhcD9e+48~zDl~FZ*3Ca09DQ>9_ntaa@R9lr zAfvWx@|&=7zKpkTgR`?40SX2WV9sQ^cdvTbBa{dWA3vnovwq%P zI%h6lT)b@gN7M=ar#T34E>o33K#vHxCKG>&_eeE4$%umkSRX2~<_KjWpk9mxv^Fuk+dVS?ypPBTl;vXc?`k6W(}RD#z0uJ*eOs%(h?CxFS%&)@%1 zk^-b+;(<3!0VRv`^JYj3E7G(HjJkq82UbVhQzXFK9JUfD{g5H;6ePo1&9A*2C(B?+ zr;M&HX=e--s)~wA41??+0|p>jCO+eS+}hp+RC8dr)6<+&oXuUk=Kv2v4Z@`md5EKs z^+E|70t`g--kvM1)GMOD)77Yu-}y=!(%pJ~xHeK|-Y&I<#Z+e1bEiK;f~2(R00)}i zDs2t_@PVe~`ot)PPLdpWwhSs?;J2Kw(s=%zCWDUTXON~=I2_Kr0$c(vl*=XnmnbSL zFXd+i{4={pq?HxDcEln!;OhV40ghpmP?gIZJs>Q!w6xAK;9%E2QdLz1Ht3^E;Lu%I zTZyIRHwzf{&Jfy8^f-kgNev>e+f}pr61_Tw++Qu!|&ofYli!ytl`!W40p3 z8dE7r9eXokpG<{JK>T#IaXGlO$koeoT zZ$2lD4GqkKg5?Mg2=O5$jAog>Z311`2bPYd3DZE{ zqn7`g^pn2kONozE)>q_zaJti{-u|DH{(>_D1~Sa8?;`9PgH&<{^KGa)6kW^zHLYK+ zd|O4tJa=6${kn;BP3nD~xKEaZ2L`Y@w_!5)L4kp{3Wx9h!&N;xs#T=N>$&k0eQ3t!4Z3_2eb^0(w#O&bU5b%y0%W^zy=a!J1oV<9KdHyuV z!u(&evb1K}Z)XOmi21*NP1ax7*kA%nH%P@7_7>VNJP7IThk}IDKl_9enCXF+FeJ|n zT)n&d(X|AU(gOxD`S-vRogw3Ih-?LNv`iX2+rWqS7a|zQ*DL|;0W@?fYkCB5Xng_} zePr5AKre;l(JX)mX??0Pzl{;k#l^*Owt)=p=SV|K8{>1hY7Y7@?tdYo6hjHa#Kgp- zm!gESb-4uHmmjHSN>Kp|W#|4r_WZfEEsy=ZDIrq3-CsO`A8L% zApi}?!RfF)gq&yUh(V1)T)+?K-9OFcfHn*f0S0hoL&NtsNIzvlVj>W>U*iJC(-ssX z07v_mEL0+hoc}ogpvF#)G|(=+r4%|a20Y<=b1?0C*M4sDAd7B z^V;eF%Yaz=OAI-rSEL8HHb+j8*x`YqeTFcFpy6Rn;P@tg75DKY9mta7R{GM?#CN+^ zkT(A#5#ecVSMZCXt{{@1|NnM1jT)0E`TESW7NnOwMHmB~=emkVM0M8`S$xz>g(^o9 zc`Zutu^h8Jtth>L6AYSFcrmC^swAf2HoDT*c73sCt(YS`*v}A>TFVR{F9`xZ>{MPg zK;wgPMa6^qR9wsawsFmb12CY1T^pE6YjRg}GazRmZf+_b3`|s&Q~^$;i(IG+D$Dp0 zXA~wJo8%@uK+qcSn;P1yvAB1m>Dh%lZDQ-cLun{#j|OyG1H;uLVk;yBQM8VMnMq(j zUny~be)SQ(Jkx6mciE?w;`zpSlC`QCM;m3Za){MQ&vVW}#;c}nh}*Dr-3Vg*JK5mIE)NNuh1+TcgG)x^XK5PQ=F%u$e=cYQq)utZDK z)earKmw@L*a$TS-!Q8Czk#nW=$?bPH6C*8sQ@1XwyP3=tl!()iRtO%0M7*=0NLxo zE{4Duz+{^PdMYw1DhP0jt*x>>T5t-7y%#xCg-9APJ z2H6@}GLtR-l6=N>aIdZLg?QN;q&uZeHD znScXVa5*WIkmCl4I-w}VqFfxKddl;x5hG{nC(-{HOFw9Y#RT99mpvfsi!W7GR7fCD zlHp!H_`6IVORi;;cJ`H?DqbWBJ)bu^W4zJ)r*->geV#TnH`;-)0^?_q-g9IYE4@t= z0v`XTwElmb2%v_D2Z{v2R)?a)D&{8&B^@397wsqzg*HyB|Mw$1lZ1gG{>KkRP`;$r zIs~ZNfPjDtk2rd1oLD8xgwEMnI#4t-mVfv0A2H_{ga$C^$jY|9o%0kFu|qjK@6rF5 zz~5AUbgERBvHf{2KaA~W_>76NZ}062LtVlSM*oM1$tZ^vso;F^SQaq#WLa7mL4eWx z{&b?AmqK4(AN)@KiU6vsuczAf_V8#2-oqn1P&TFskdc&~=Nbja?!kXxGah?N4i~z+gi}9CSOFQkvz5k|E6<7=m`tMkKGr?cL~pri&g~-FS@0vRJ8lYlsE=`eh zjJ!l>8P{o&HQw^mw9fqv-rYIv^j^n@>aa8nZq9jmZm&q*J^gBS8^N%611v)jmuW-j z3y1OfU)_n1N{woNS^H`$t}{EZ)OpWQLkXaU447J}d9(7v1h<0U#Q#%_rMe5muROls z9x`qS)Uruo;8W|`QWFvqW=Q$m5p(&|@39R|BOk*vPhBoDXewAA5Ixs702f?K0OVj_ zO$`n+j1u_c$B#iJR)~z6)}daZE=ctDPENu>_0@f^&Ct`iz&Xa-nHT-(L7?pF`ts<= z6N%8lF&Cv*5tY}CLkCkh8zF8kZMLxCz=;>^nj0^<*3!wNNjVMDP>KnCBPg8@XjD?4XhV&03C4{rHrFfMLF-9XS7^T#r zfAYVVr`6Wf@Qw0&9IjTxn;ou>51YK)OjA4TXTgHHpi#FI3iSgHu2E80mBLx7x!k#1g*0emrLfK?jW@frA^ey0xcHL-9L1o zY_fB6tOy2KcE-qqqyT{b2mbc~0O|*&0@oMEA)pWwR9ylSa|D>}Y#`{Qi@DI#($WgN z+B1XT+J!$ri6Syh5to$A1;IUC$QlQ@xWj?NoLpiTETKj4(N`x^HVezkp>=iQsvku0 z=_FqQJt;y^=B-nkkxhI zghMK6&wWs^v;oVE&mp>n}`2`7{p;!*f z?GvhJI^#4lJ#g(j@lv$l9o)Xc=fQlIY=)SWlVu0hF%2wl7EDyZhEuwk=`Ad%u^}ruZ3Z z|Hm)#-|4(nJDDfBe!-!a+4-t2meK5kULyx5PKc>@{%8PHWm-7G{0vt%Ic!}BV;Bfu z-Rq$`$z*ecpbvtS5B7P(zqS)y>2PGL)0y>>{>ZFI=o>KkrhQ}00d{q+1@62KS8G6U zUuq9V^S0xBAEArIZCFNBxl>7nR-X*M*p6QK<@Yf0kO`tF7q`_3vTYWCk&cqhp|j*( z7rwTc_(ojiJBkZY_FxA=76CA zeCu?Jf8&iBfbwbvq+I&9(#!!h5!~c1(D(KrZw_g>Z6D0y?;kYfaG^6Ye$<+maJOVY48bp{u=viodt8gNs8}gi@pK-LD^jg ztUcU$3U7R0%r_bLM!>pXkFxqQX0K*~Ar#cbD|R}dJh6XSXahkhB@B#;m5@K*4PJ~R zKJcd|488A0w$#duLGGt;hLTdqoCd7=slBn9C&I6Ya6ZMKn792qFsXtf!UUFZFazsR z?RI9Ifw#xRS7zVvfsdzx-q5^kGE%bH4?v-3D7kM0%dNwGiT!Ik&y)oz(dZaUHz37P0GK) z@3tpJ?g*hyt6+pg@``^@!UML17#Y_y?}j7F+>g2XgVb_XrcsmS#0Pm=i*ZC%{^Cz5cca^LSB7V zs6E_`>Ywhzk?(dbqdoiZ+q9N?f!_}wl)~3i_$qtC0D_Q%`90Y@kQ-W{0{LML+x;oC8u~$;gMktFhwRBowf}^ z@Y*?y?Y|(~;1$?DWmGJUO6q&_Ij>i_jlUVqxFOktSe;P~46-vN^j7Qa0wsc==NzTf z1T{0TnLd?325mpk!`cDxm3`v~bX+Jloa7M+K&L(h(tP)`gsE7k@J^YJ@ZO9EsCIRy z?T#Wj-d`eY9Pzs}uJ7Ih`Ufif?{5!v=bwttk#~IPB{hP2)=6>9zN4AV$z<#CPEAgH zYev};HAFq#fk74{#@`qZt|k8Ihm{rR{!EnvCao-AT0&nx+H+Z1I+p93&X9W_T=S+J z+|h|e5~H$wFepX3tI$EMKGLA}*?naj@9KhEz?%=aXp3Wu<3+OwzK62DI5=du3CWEMP z0V{_2KW_umnAM1BwOS_1Dhz+QDFQ+{>klVwjue>joTnv6ON1d@tgb-K?A&8uq_*LF(FGgN`+dmnjT_BK=1@ppnKlOja1vH6m zHK%JKFHj|<9w+mvL%&gh9CEiMxP z>6Jv((am**yvy}#IjnB$<$yDoL8IQcyN)iUtx9@do^;dS*A-bzUa)f9rkw%Rth6=N9|nu$dTQo-%Eu$-2)#aj8}iV3PIO=Z zwE3wkSPS33>JtKMH7F*4adVsXk=M8ExwNi)j%r?bGdLN-Lela*s@#%kb37%;)Rt4T zQB=TfF>ok>p$$1--7#Qo;0*LWiMtf{#IpVMh=6EgT zw7tC}yZW=Tc*4DTSeYZ0W-Z@vYikCd5|)qo?2(|&VEPHr$0Jq2hLAdXw^g-L^<=(xT-~+`d5;@EHSys`e(c}nyQ#Twcq#~Aq5uQnTa)Maw z0BW=&8PEi##t6X)#G9=xo#a4Hi9Wx}Ukf5U8Mjqd8?b$hugjP9FuATc z_ent@rs>4R!#ARGjpVJ`F{rjTI7w0XTQg$gWw_>l49O&Ml$a7W?FH|A&RFV-gMp&f z5JeNKcSfs$@v*yqc%y#CVb~<>$OIrRE^d9cQ4HW$y~QS%xt3UfW)(hZO4a!3 zx;3A_5Y5w&MH3SXsk_PuVTy7E`c;8cR z>lq)51T(JS#u}J}^f7>{0MM63N{SZn$-v3Tb(8_P2Fhr1-tWk}M*uq)U{nEbI5TkE z%_}ZW35-A;06>=q-UiGxdJ}@&PZ4-pq7LXK+*#j?xjYvYQ(IB54StlX1k}1HakoV# za3-M!%3kY=p3#YGc1Nkb?>+@0`;14$@$RacM2hNM3%t6TR`KAEuLOz8Tnld+*Hm5N zAr>grNqS5vZ)}_aF#s@fN6URRH~?klY0sD~_zJY`O2LGfeLD=g*{DGT_D^Xb>P4 zjEfHowhPDX%bk9Ue$p!nBT~3Jh$h4?q%({Ri$nOozUJ2z*!ex}Pl+4{xZRBnsU^miOKk}6$#?pV&@ zfSB}7xR)^jkRo*r4XabTo11Td9~5N>2K{@fcHP08_H)pVGNhvL_37c~k&mXyO_dcD zd(#f33rQL>@<5Ss+xYo~dG;To!d;CqBQui#0=FpvkB1EyR1rIeLnegk>WIxTghT1w zy>X+|vo!{EP^kF&XgJ4V!Vwzp9vsge{_5~k@iyJya>bgFzWbXg;d{i3dSU)cn%BWA z`V?08|E)^CjNlCw(okqoZOJqq1` ze^ee|iY%e|Wzz}7m4>=H5Mox!H~jql6H`;e!OePdoqpFqa8R1f#LKJ3P$1nqI!Xe# z5WH%a;Z2f&7dX`4q(KM+ZSpU?37D$e(C($}i93I=_F585X*6C>H3)3nvc=Tr81#eT zgONJ)zj_qvG0gVkBMp?O`?c!N+gOOA0GDm-jrv_PUzg`{v}1#>Vsg`npR$CLBrME&MTuIbcR`rGcuA!J6;)8;Wv(eb#Vr za5&f9{NaPm#Lzcr58X3{US}bSx>u`eKWQ0O#yk#PA$s?@DWzuuJMS8i(hu{UIcx%l z_R{C2IGNkHxG?Jc?W_i@|NuE{-j|Jm17omqhuYFsUlVM|lsKlJCjxuQ@)m zU-XJeJGjY=UpZOiMphOx?MaDQT1wvA{2~X#0j1IckD3Apb>XWwZqypG?NLu@D6Xzv z92XY{iIUrEU9s)J&HPG|qPXdllU2n{FXvkR3S6S>CeOyhIPz0sZ03p9O5Fevf3i&V z^!4{zaO4X6`)Z|@!a8cIne*Q5kvj$%w9#4>b$JxTREr}$ekv<7_!fB3sRhQ~K}&fh zD#{?qoz1%Z9zC~U> z_URh+Z<=FMuNAW=?3e^}m-cqyMZLkCjdAR=h1?g3LXaRRL_4uGx*CoIivW{3Jo;Fb z_BqFHp{J*3Xw=p4dAXUP1NLF8yo*p@Q#LEa#Q>LKQxp zr)OfmH#XX2MZ$oytE+mdRy2%n>aY%1xer+soRu|u=s=^XscDd*M-Mo0yeB0h)bKZi zz&BBv2-9*{irsVKPrsVOIvB zIJ_H5{awu-343=|eEQg*oQDf?h|%!ZPxs)aBhD20=PGt|V;DDcP19A4%<@r|4O zouRk;Rh%C&oN_AlUo_dNpSGu@Imd1(guUz{`!J+bM$FfURRiaGqn^er(_99q&)vFj zoN?|bU$j!*nIhLx;4v2NT_-$jw11?!ccjunLJ_W%;8#iw@f+3J8{M$mbqQydtvdlt21I!Ep z=EDRB0+DcDRq~4$FW6jMTqb5Ae)-G4#$m$P^^YL17j#4 zbw$Knx-|S^tXZnen8F~yG5a3usdH?!pr~b<2Vn66lOU@2)A1sw`i%oVb5s1p#msMH z+v$E~!a05^rGI56gx z@34jgx2^}k?N_{34)?41)2G!CjUe43v><3qq^*LTAKU?%W)u?KyW&(MxG{M+MYKAz z)5F>r5ul}@k_&@#n;mQie+>_-fk+}EBF~|hBDXD`Z-#@N!L1`!g%}t7`IBMlo@GI3 zhJJb}QX^Fl?A&u8{bqYyI1nv>eyu3p`ac9t?TC0i;r?Fy!^V0>KBsTnJjW$5wi3w9 zdmh6res-`qtO#DZn)x@Utn)I}p5Z&XDGcx?a+w@CjKYBEU{FL<8C!V;K+R(UCKG`~ z{>)GFm&e6p9N*nZ0wiyLB5S(5qC#-fCU)qI7^dDi$|6`%)TV>4F#3K$5~2-Ti)~O7 zV0AN0!J|*o@vSJypFJNRt!H57@jW}*$9pU1$rCxAaQvyz1cF<$0T0~Ml%1$p3x+}mt}M$wvqtj~J=@v*X}-b7j?wJYau80Nre|h|G-FS! zWKyxWuZFBcy@2@s$IOTkn|XMdDTpoCp*n0R@|mNpJKpkCikgsrbQ=uhr5iV9nq4cs z7r-UZuKDA~4sa}3FEw(tS0(mC+L7eL&(7{A*Xl+Ge!QmfY|QnD2v%&Uq5iRty@`26A?JH+>4qFTO$bF8l9G}fTJyJvi;JUw^h2$Y z1PYs>7u!7yU5K9-(&ugSXVR!SrCd7H_uSaZ2__B&A_P?>flF50ckR^^H+`@G#SAT# zKhbsF`OKLrrj7Z&XnchP1!?ex8d&Y4UOg=Qis2}CY>NJfa202- zU+pTmuYF3prD@nBRK1g3mdA$r=|@1^6&6|{+E|Qf|ME=Jp+_t61k|97vvfOqb}?!e z@K9?I>((oxigcNq_43NYvicf#n%Rf+i1po10Q*t0i6-M>m%P-mUg+q0E>{4Q=#NYjXoKK&I_0Fqne>Z82pw;}U zJ7JC72pb?I_w(uLA_!pD({mN0`9F)cV-az?henH35WNxl5tuY7ZT1? zZftCHu&;jgN*%*_u$dg5Zbe>LK{nRz-D=;eqc0c*hW7VPE+NSJ3AvM9d+?~zch0PW zU0TkGZ(1n~J|k}Zbc7;EO*Rl4{P}!z9lNJw0qSt#)c5vVe8Zzzvkt!ZsaH9LVp&DXBa-`L zH#;q-1aOb(7?^z^8?1K?V0*3my!!Id z(8>O0DMrEeZ{O_iE1{+YvO#@q4<}^@z^9Evr%pvU|LE@@nL-N~NH!bHCQ*!$3JY6f zbo7qh@#7Hyh@(cXzQV|kkkHAm?E?Ed_C%jqN?Ivae#LTZt&}zqf1tOr*o2Tc8P0ek zpUu?eX=1RGi;_fjG(9^t09!_F-6C%uC;Q{^IcnUoTHjlwubE zK-1EFfl0UD161;Lq>X0d=Z}=Z9i+HFBEv_NnplVzj|1jC~Ofh}7MSavSW> zIB@V_X;oEv`PhNiBr53!JhZD~!FyVNeG%#2_09vLvK(|gLJNKIIjSIY^9S~(lBCm) z`l#s%3)exIaY9-w@*p=?%5&V=&kn&<-nEBq18l)jCKy1tT{l6>ar7<#bC26#|D&-b z9TfZriLWxzE&{70mHj#U7aRF4_)A-~rWnT&>BiBUjbMhh6ZKXYDfuDN`!zIFdPz`C z@@TW9xcO5yAP2Bltt5|-;B0uT?vuT%wwzc10k#8*og`9kksLNT!Gbp$gva$wq!dyJ zB9)L%iy2ALUtHifBI~ag2i7HZ4CtzbE{@CS_15^K3rK zvsODH991nD^uR6FIk);sm?M}s{)iU+I{rn z!$r_TZ7?i6xR>W8I)idR-5LmT2DPRI*iV?_?2tsUmZ)5tBH&`X1 zP=PaHGkj@p7eLn}Jc|Wj+r31f?l+U`Uge{ZxmvCvuHHaBt0>Q2{4uFE#j%1aboIG@6MEVag#IV}; zzcO`FQSAW*GY=g0Q4*6804$=lZ5JPHg+6TFXdh(4LV+fQw+=ED(^0p@dlh}&`}O8* z5aY7g9z2)UDOz2;kk+y3p3|=b8RCj^gKd4nd3gezZyX=7sVb*5e2se?IH$;an8Vo? zcD}14%`GfoJ#5mxg=+8WI(WYg)>B2lt!!iQ7QI*y8+b?BeciQS+w1qLukZ2NVEdrfr~|34%$oiK!`p22eVzcWvD!#{cZO zY~&z#2P`Alk2 zi^B~T2z2X+iBs|aI+&uN#I!Xoa7PMe3l^ZSUb5CNb%?C`Kkol@z)8uu2APkQzwKr` zhfto3PB3ET`Hs|>xVS~I(pH$89(MO00PyLQtY^6L-&#yumm6OB{4bA*&&z`V!!qnH zSR*XlTL-URgjDx~KH6GZswi|u4u@WsgF`Qjn>$gL(x>G=jg78@9Jlm_&vsT87MEO1O-z)NbiPgJ6_Ls7>g3XPY6SagZq>i;~ivc{dR7~zAQk|AbzhogJmg#T;@Pb#Z5%GP=m zA>n-6mjiiVph(mL6)eN!{{@X29&QS15@361Xexo<0&1co#<&1E(81C%u<|ieI%3g0 z;EWL+nGv6mah3qVRYATP2|Ld%JYeNLL64h-39tYN9?4-0ahnd=A`MME{)M%&bo*ZL z9W6+dgUIeZn*G0jeqOQOC{uFhNwohnnQfG$(?=PyVzQpJs$ymUDIo|Zw@G+}lQLo4 z8v~=GIZ^0DVyJ~w)EKAP#PenNX?|8#7HJeQCZl}!UGlNddBkUzV4EqPTm)|C3{mZ= zOx4dxO;0CgF;{|wuDi|6jFEFUQoLC}X#__^1f{1RD)dvv^a5#w(HO7DV&?qN zIJyGOtM(1xD0|==gzO%KL7A4877*%nHXv^q8r|L8+{kM9z$I>C?OcEzvm8xKKuXGL zJVk%}U_JnrFRly#03tmfnL$J!339Il2SONRJ^;#$A^G1D4PM+;xaajnK0Y&tFnV`+ znT1GE-EsVki0#Lbqhq(6JQzuvhsF(Rgm$zd61uz@M|plMmBiDzv22;|ySrpc(frD0 zo{H4nF>ncx&vWaRU?^<|Ch%NIT&?i4xqwCHEqquV?@^LyU{aDB?eW zq55=fesPOD4&=v$ROTN*-{kR8UL?FrXo7)z2yNK#`l+0`Dl4CYGFnm6?La4+VbHXg zi3xLWpGODypR}0$Gov1f&OwjZOr+*@=vEth}zmDJcpyD zAw`uMde=CR=`9`~HBGQX5+WJ|^MbR6usKRp z^eP8ls%7{aFyA7I;S;z#+mY1v#gi)^nq`r~&mTMfer_&%?R7bBrRiUOD$Ap+-5tE(1)VR)dXL5&#LGmO!m93pGI4Rw-IywgrYZcKvoISoDUj{U#KQJ z!Rru$1~)Pk6L5a6cuYYsyGlTF3CpLxoSOGwPyQn$@26M-59@Px?;gn*2+@LeCnUHh zXW6o^3{=%c-a^_TU1w7zmRT%c0sj}d-uZZA=}ntxDB!1$Rf_WGW(IuRja)y1_u6{q zXE+-0o2cI)Xn1)g2098PR!q`RRIKcgd9^gQ2sy$9XR(kyYw0y==%pkFJ{ZLD{o)d! z6Z^;@5wLW`NN={C-iR|n#l^*{N)d+=+|%ki1D^TJDRN1e`2&ez$GcFzoJ@8y_DF6!v5U00C+J#D#BqaDqZ~&DwJ>IuUYr(mAxXwOJRLWd%k=M9g~a zy1J_twcV!b&1=>yKwK}CYxDHO^06)UrNQYe2`bBx>F&KeqDt7zo}9{y^saUi7gt>= zX^XL<%`$uGRmsDwhwhHFTPjA_bTluh4qarR+eiV0O~WYs0ZM}O9DYbld+0!GxSQR9 zuq6~7ZO4x%ZIyVrAwypT>_IYckJM+66p;RcK>ToC>w41Wtp+$<%hl_%T??=bS#4$W zW?DuK)3xs)jUv+<9l7QmX8$x}&h=Ap2N=(g3Z zMp-9lmF)md20}|gYE0}kj%L>Tw*hYY!!*DKO(7=7&X?q%bK*eu?P)9WIoFMeAs%1P zcrybqJb+xhk8ZV7qQ%st6lye=(LTeO&emknYUvC#Hxm~x{{GLfxr~F?t)cnhd9h3Y zO@!nJQMCjgqya(!a3%sMXz=*dkd>CaX~S_yq->Z1+M)C8ggsav+m7;(*sZ6;P@b2_ zNaChdTo&G~gQkswv&vW*uz?K30C`EmGyRo>us;b*#fDDewfK)}oF(7&p!o(tF zhWYwZOL=*5C|3v8COhg&4n&L6k`fh=Mh2iQ)E#85sSX$ZUjgS&In37~fQS0kL>Lmf zAYgZi;Y#gcJ!eF1H8Zp2M%k7#%@5Igo(FPy5xQj*^eNFHyGuBK{{M}2R}@wPQUjbm zbQJwzKtjwvW8Fi%n3YCLavzV>HYRe-yn^6M7Uq0lvsjF%LN=v7ce*n6D`vV-j;3wU z%J~eSO~UM9G1QG(URhWnbl{sOe_%LVRAvTTSUbjou)H{XC$Uy}6x<|M->m#voCN?Ifp`z6uT%JX^_M3Kyr6r=IZ`~2c3c7Tl8bZ;SumMaEAKwEhVaDrsGXoiHt%eL+a}-$ z5^2XlI`DgZMpc=FQP9aTAerjmkchPdDIn32WAIFBJQEcz-Gv=~ctA0I39q7~Gnkas z)xQmt&=tRYDdXPue4+eSuI)3RBtci}P&nJ+vkN{qkp2~DGh}y;VZOh#u8x(Ggxnw> z4jM0Bz4Aw?4*ASE6b?O&u$|&2Vp>pnQr^?!3ht+S>S@T$CHWW6l7=GZvY>#KpBXFp z(A-R@6tU<##Sd^>t4O*qx@W%VPg6n24KA(+Ga4BN$-q_V6S57&!lGCy6l4q0RIQVN zl++`siixa80x5yBY_vL59kq`5g_@Y~Al)tm>L+gYkdaKn1q9GPKHhc_1Vaa5Je$6x z0Q8Q$cFj@eF@iqK50W6=AqTh3)1wUCy=DwJPB1h3jM&!sEogH?$%hXWOeGnwrO2`X zW|#vIP=SU#9MsIWb?K-}kW*ouc4D96AivG0`EqBZ ze<5T!o@bchEF{ZBjZ@r-#H0pwU+AgY^LV%rW<4TB4xX_JBMqQ5zZu{k$np#nz$YRU znY4q~mI|6dMG!HxbjqJso1@2{DFjAogBl$WAQ4yQo&FIDC5l%;9|5cZnA@N5nYY%B z>LEp7A%r-_YuvG8Q0kGz0eXd;&IbfmgYVW&!0uL=BdO$Q8q}gm^)e9NK*(`A zV z6A3XIy0ZPp3j*MYqm1K*PHifL3lss@OQhER&o}3MB|}za?~>kH* zg{`1~lMsRei1#_gy$B@$x&uKorXUQF>t|WD^?;`>-{x~HSyOH1xEDs83w{CvrSuXrGl;KN>imzawKn1D3pi7V0OCbLakNKF^o^|v!1 z9~9Dw6A15bhd}yyD;vz>q|7k<7n+!M9EF6=Y`N>h^eXhZG~_5s1R~Y$s`ZQi$PKzb zoj>%GFkTTJ{M|^_u!QFZzYsucZ1M6x%M5C6O=~ZoWx&ACcGbJ@I?x^x{05E`&wd`= zGXC|7_Tp80E`NgO$$jscNok7{buGj-5(aM&U@b=R_BPX$R1S?w4}?2Gv$MbtO6S(Y z2o|oSj?UvUiS3)O~r@Xq4 zE|{?6hmB`?JR2>ViXHH*rM6UEJC-3MrUW()bU1LOc!tX0zo}F&>pr9Bkza zW)eZ)ywT%dpf|y;DzJJr9XzO*i)&N>Ie=r`V-dcX2(2P{QAUyF0}vP%$a^eS=H6;> zfNQbO7eD~rcDq*RK7M?#rp=Dn$w{xq(wZ)F5W*jBp!WOw`!TNfk~fQ;Aaef|7mruG zeliH+|7zm_muR$_L}i3G#r1{e-JYYFv4m|Tpuz#1E)HUSC4Nc{iy zu))5@1+cZn;~*YaMDm6GO#;WH?lFy84`5_Ky4K=|zInYN@;vf{=qLEXLKiLcKW2Lk zojEFk($-c>B5qCnC+q9Jtp;cR;gJFRi++OK|K$X5`7c7{U|(`t- z<<->GhL`xB2nz|J@%8MMU#6;X`X>@8_qTY>MuiQ>k*ZPZq4V$E&rYPPP^kjV=4j@2 z{`)w_-n|+(ww}V_&W5=&^mjzx{BgIMhV}(gHt2ut-XrS#IqS|~CA`Rp_!6IiJeNH= zv;;@D0}39HHVB(i1V|Tr9EB>t%hBlp+M05vcA!rj-`-AYON@%TrKFjvr-Do*EL?Gu zQ*zz9MIbHf)7{Nm^S+}qHu1?vqQjBYCBT)K^5x(|4c%GS2NZo1_V)zDjPJe5yDjif zSJRa*v^(c#3-FTG*4BVy5LE(I*Fakd`CO*b7*Zl4aN|P9h@p`Yf2~wib#;I5M0j5x zIB;t={*Ob%M}fV6raQ8<^`r8EA2U+K9&TQ(NSryKSo;S*AUxs(@4CD*0~ZnCJFywT z@(BQNo5_zU7TkD{l1enCM4=4I?W*N}+G8Td~I3|{=tK^6Yp zCOVsc7ZcHctL@mq(0cZ}1gP_y*fRvO2S|QPI~Qy*p`ieQLWMzcLe8}E(GiOmoS0WizwaJrzvVcf@s zkhdO!v%XA+g~Ikw{rN%&WEQdH1KGe!N-B_`!?!*`$c37V8Oucmi%4n7QqFss-_N&Q zxV(O!1rdgk(jNj-l&FNmK>^mit7<^wWz;E)Umm(ADl)=aSXRoz`)U0{9Ohh?lRoPq zxRX(^9L+-jO5SmJ1ZrSdFIL_q8FK?1u&8?}2eCswQQVg!KS-E8KDuu0zW7)X)CsX< z)9l>2Q?j{dFmyjZ1p6E~STR!GbNv2O=P&0m#uG@+1^_S8m>v=ux(o@#7SMACv=rn| zC_S`b6nH=X*!PeF;d$+6QVxXf=f+pFv< z84vG`T9rJfO32N8xPgIXr6^IMfU(b1pt*^kJI=^+;^i}hqdt*~?|a{8tpEqCbqe16 zKa&7N5EKtS?Bs~~n7*@JH^uwZP;sCWVqo%uV6FSvK^#4h@qPU8!OT2r{Ilr22e-rU zwW}e-CJ>g_v?WJkP9H5i?Vf6xabx8?bsH3d=puT+<>a`fB(;F--~RrifAcI-1ELa= z{T)jHeYOosz~+aC*^y)ke>07hlqxZ#pC#T$#4%3+f|Jr|3dbbW^}%rhYt;f_{5O%6nsIoe8-OgVDD(keLd2maIb0=O1l2%aj~fHdgAe zyJUL^$Krqz4?*<=uZo63FAvx;TFw;`g!J7VPGSg$C>=eX*Oh#0GzWDdyy7~*2?T;R zh%;|&iN<1mu6sf_BMe&xUd$dO^pMnzP22gX$#VTW*^GWH`moFE9W4$VI%J3G7t(#A ztJ%-nk(KsX%xm zV=bi0_3cj+^7jQHiP97}lv{~-A-CrO=Hkjq2FPr7ARd>@;%s?xTKuaaSe>Dw0RbSI zdqnYqmKi@pd8HtjegXULz(~mJlPyh6a&@w2eta}cJ2m}K%E&??wCzIG`nx{q{%rGd zfbKt6GqDPPajwV;1N_qooh;-R?~Y?}t0BUW`UzJ_|cpY zZu1*>tLts^fgigJS|&-;hvSi=$#JF3Y1$ZzewV(*x!w2v!-pIg$zek=#)&`O`T|E+ z_(}DVptbIp1=Oml=uIrp9jTDtnV679$TNikQ$H~f&sb^)30=~{6H_<#d#Cu;e(@-w zBxC9nr-&+8v$?rBn9REnx5ga64x}XV8=;1df`)3~XJujG0&>j->@XSWHW^S2W*hFr z|Ll5c96w2v^G_55S^1AS*Fx2(@)tnNg!!u+EYK5q*G2Z5HjzMJ9G?e@G7jebAtV-| zGUoz60PC}8h-N;uUn2pDd?mNAaZ6F#vv1tg;=vK0jU1|sHs=F1ktT$sm;Q$HHvZi7 zAM?fk>E&c;S=(~PksqIo=KxF-nem393B(sjYn2@x9phqZdC+eVd({~aG|&iwahVDM zrZ^Y@gdoRajhwzUN_l7XL^&8n_o{0%tk>uE4X$n@iw=Yy9R(3H4i~=|W97|@vPKQn zVU0{SCJ`2aI)rKH$p+-v+Jc(w+qf#oT7 z>RIq@Pjc|OK4BlxQxZ8In5+E3$`x1{6`+l(WfDajR$B{gvPapA$_~vqd73;BV`7D;DkVUUhs{XD{KR$_ zf?oLAIXYiJOhk8!6A;CKAyop~{nazn0W+A^`!;j{2Z;b%B~{M`OC6qsVn!eI_4TFD zwjz#}ynfAs$X9_ze5C5h(GTY_J5h}401yw#=cJMeU`2$7xnq>I7^GwV$eZ2cC?rR# znzHs2sf9H%8R^IguY?0#fPN8`FFp%20U|_-n11vbKMfh`!AB>+2RTXwZ-h*SBMTZP zM+gIaB)cFG9~I054FHZ!jHQ~8vSO_hK4b31C;(>47k8BawIDDso~VY?i_lJljhfO9 zN&QAIE(Nh3s27ri#?jole19)N&}@9Q!~0BL&=7k4N7!{MNc-sA`$ibO)(Qpq+CCx~ zt8i}C10z0P{8$x>5i!Gn!dfOCM9wgIep-T{XGFY(1wkZJN$%jArrYLb`1j#FSu8$5 zsGp#+6g^@3$V|fWY_BlsR1lPc!@|lipos9ih$3AJa*q_|U*fl(T8tP&I&e~@&Bzkb zE`|lHk-VTU4P>Jw=a=nBX-Ibm1VD^&vkNB|V=M<`^Lp~Nh-960N^|9y*$E~abe-D` z((yqI45$$!TVIel$^Zn@P-vkYF!fBpN>Z=_vqJ1EMQKV=|5mb%5{DFsD1Ab3K}3W~ zQi8R$b)-^F3!GEK3Hpve=?1f7VrGd?X@e*a$s!LXH6!rPZ;O6~^ehq%e$mg&uV@Z! z;$kFyqVl5{VIh;O5s)wjeP#$y)bDM;Rn>?m!klGFLok8HptkQBo0ymg31JuEa;wEh zz)&Ab2USKvC~8(y!BJ6Bo{gA)9Uwjlq>XCpM2X2YKb4iX?}iu(MsYA*r2$N|zQEyq zXWigzKn6lUffTT*2H(FgNuvw_Utc4>*^**|VEFC8Hjm$#lmI?mX4^t#*wzvi1PVb) zpm4Hp{mdYy_82Kr$W-7?zzK)cB@TCcAV2#y0ju+f$4BhSIvP(zj|jCoo%|}JuJKK&7OR{y*txP z1H&@1va(dh*~UddW#W)wpblI&ygHH*nepmFl)Px}L#jH}g_dFsYrDITU)b1ttEi~$@@7d%WnJB+1bXOoT^3fMH_%*Ct{UzjqqS?-%ZER%Mn$oO zRfsbQ@+o;wS50v;_^ISuZX6vQ#Vp1}H0S%dZWWh198lnUa_iaWV}U_I>%_&&W%kyL zrti-Weo>@Nb2FG?zk3Q(#9PomQ)!2XAc_Jepdqt7H6_I_DM@g5+|{dG)80x5|MmwC zEJ&=Avr~Quc^afITReV?11P~6au=ZOHyzE*%e!{xju`IRE-Nd3*vEbYD%q0n&hGpE zy%7u}_abIAI7C4iJN%}psj9e`irnds8hfy-c16whfPesI7M7v@51T5hs&=he zhJh1b=!Er+jjIq&cvh@f&Bj>Y+$_J&gk$MM9If)wU0X0!iUOb;>jS-KB1nGZVhwlq zEf^9k>mD}!dECj#9=(-}jEs)1t_rpWK!@1Jv(wX_XV0E}3J8B+I(t!@wy|+j=9D{< zB+}we3yW3z(yt(i8`O86e%_1a3BV{SI-2O}kXmd^4+HDyoNKP^g0d;$ zbXniepU0pBQ8{%=7Okv|oLnyEQB23?G*_)!_4M;G1wK}6OmO=L-n?AyyH)+N zGBV&Ig0^@}-w58b*N0t09j8cCMPR3(1ev{^U@aMJ!=ryJP(tWr;tmS0b|BB>drfiq zwzQaYZ7?7IbjoXDC;;n$#+s)xUWry)Jrg?sFhX;9ny&_6kE1)VtnjN=l;Qw_m%~f% zORC7tDU=RgEkF3Tuf|iruj{&$C|`uzU_3kD!j literal 37271 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 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/stress.png b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/stress.png index 56803c8346e281a646309c47c998bf5d0b9eb236..ab374ac46905a8f8de36158403277e82c04cd6e4 100644 GIT binary patch literal 49927 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%0D(;E)3Q) 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 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/temperature.png b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/temperature.png index 4e60f1b8d0eb857380636caa76c9bf5604626418..9ecd9513fd872554e289a7c5d61ad2161ce16434 100644 GIT binary patch literal 36019 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 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_displacement.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_displacement.py index 4dd517042ca..a3fe2be399e 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_displacement.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_displacement.py @@ -49,7 +49,7 @@ def main(): plt.plot( displacement_radial_analytic_1e4s[:,0], displacement_radial_analytic_1e4s[:,1], 'r-', - label='Analytic, no debonding: t = 1e4 (s)') + label='Analytic: t = 1e4 (s)') # Plot radial displacement at 1e5 (s) plt.plot( rCoord, @@ -60,7 +60,7 @@ def main(): plt.plot( displacement_radial_analytic_1e5s[:,0], displacement_radial_analytic_1e5s[:,1], 'b-', - label='Analytic, no debonding: t = 1e5 (s)') + label='Analytic: t = 1e5 (s)') plt.grid() plt.ylabel(r'Displacement [m]') From d6b6e0b6a9baf574956c79cab47c5efa523f4f4a Mon Sep 17 00:00:00 2001 From: Ryan Aronson Date: Thu, 20 Jun 2024 20:36:35 -0700 Subject: [PATCH 105/286] Adding field to output total strain (#3142) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + src/coreComponents/common/DataLayouts.hpp | 9 + .../solidMechanics/SolidMechanicsFields.hpp | 12 + .../SolidMechanicsLagrangianFEM.cpp | 22 ++ .../SolidMechanicsLagrangianFEM.hpp | 1 + .../solidMechanics/kernels/StrainHelper.hpp | 219 ++++++++++++++++++ 7 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 95c39c2c482..acefad5afc8 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3170-5687-d6e16c7 + baseline: integratedTests/baseline_integratedTests-pr3142-5705-ebdd3cb allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 9b300d295ee..520d0c506d7 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3142 (2024-06-20) +====================== +Adding output of total strain. Rebaseline because of new inclusion of strain in output. + PR #3170 (2024-06-19) ====================== Fix tutorial example for thermal debonding wellbore problem. Test case modified. diff --git a/src/coreComponents/common/DataLayouts.hpp b/src/coreComponents/common/DataLayouts.hpp index 077e5aeb305..76995841d45 100644 --- a/src/coreComponents/common/DataLayouts.hpp +++ b/src/coreComponents/common/DataLayouts.hpp @@ -154,16 +154,25 @@ namespace cells /// Cell node map permutation when using cuda. using NODE_MAP_PERMUTATION = RAJA::PERM_JI; +/// Cell strain permutation when using cuda +using STRAIN_PERM = RAJA::PERM_JI; + #else /// Cell node map permutation when not using cuda. using NODE_MAP_PERMUTATION = RAJA::PERM_IJ; +/// Cell strain permutation when not using cuda +using STRAIN_PERM = RAJA::PERM_IJ; + #endif /// Cell node map unit stride dimension. static constexpr int NODE_MAP_USD = LvArray::typeManipulation::getStrideOneDimension( NODE_MAP_PERMUTATION {} ); +/// Cell strain unit stride dimension +static constexpr int STRAIN_USD = LvArray::typeManipulation::getStrideOneDimension( STRAIN_PERM {} ); + } // namespace cells namespace solid diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp index 56b6605318b..cba09330bd4 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp @@ -41,6 +41,10 @@ using array2dLayoutIncrDisplacement = array2d< real64, nodes::INCR_DISPLACEMENT_ using arrayView2dLayoutIncrDisplacement = arrayView2d< real64, nodes::INCR_DISPLACEMENT_USD >; using arrayViewConst2dLayoutIncrDisplacement = arrayView2d< real64 const, nodes::INCR_DISPLACEMENT_USD >; +using array2dLayoutStrain = array2d< real64, cells::STRAIN_PERM >; +using arrayView2dLayoutStrain = arrayView2d< real64, cells::STRAIN_USD >; +using arrayViewConst2dLayoutStrain = arrayView2d< real64 const, cells::STRAIN_USD >; + using array2dLayoutVelocity = array2d< real64, nodes::VELOCITY_PERM >; using arrayView2dLayoutVelocity = arrayView2d< real64, nodes::VELOCITY_USD >; using arrayViewConst2dLayoutVelocity = arrayView2d< real64 const, nodes::VELOCITY_USD >; @@ -74,6 +78,14 @@ DECLARE_FIELD( incrementalDisplacement, WRITE_AND_READ, "Incremental displacements for the current time step on the nodes" ); +DECLARE_FIELD( strain, + "strain", + array2dLayoutStrain, + 0, + LEVEL_0, + WRITE_AND_READ, + "Average strain in cell" ); + DECLARE_FIELD( incrementalBubbleDisplacement, "incrementalBubbleDisplacement", array2d< real64 >, diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index b7e02bf0c41..d712ed90532 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -152,6 +152,8 @@ void SolidMechanicsLagrangianFEM::registerDataOnMesh( Group & meshBodies ) ElementSubRegionBase & subRegion ) { setConstitutiveNamesCallSuper( subRegion ); + + subRegion.registerField< solidMechanics::strain >( getName() ).reference().resizeDimension< 1 >( 6 ); } ); NodeManager & nodes = meshLevel.getNodeManager(); @@ -904,6 +906,9 @@ void SolidMechanicsLagrangianFEM::implicitStepComplete( real64 const & GEOS_UNUS solidMechanics::arrayView2dLayoutIncrDisplacement const uhat = nodeManager.getField< solidMechanics::incrementalDisplacement >(); + solidMechanics::arrayView2dLayoutTotalDisplacement const disp = + nodeManager.getField< solidMechanics::totalDisplacement >(); + if( this->m_timeIntegrationOption == TimeIntegrationOption::ImplicitDynamic ) { solidMechanics::arrayView2dLayoutAcceleration const a_n = nodeManager.getField< solidMechanics::acceleration >(); @@ -933,6 +938,23 @@ void SolidMechanicsLagrangianFEM::implicitStepComplete( real64 const & GEOS_UNUS string const & solidMaterialName = subRegion.template getReference< string >( viewKeyStruct::solidMaterialNamesString() ); SolidBase & constitutiveRelation = getConstitutiveModel< SolidBase >( subRegion, solidMaterialName ); constitutiveRelation.saveConvergedState(); + + solidMechanics::arrayView2dLayoutStrain strain = subRegion.getField< solidMechanics::strain >(); + + finiteElement::FiniteElementBase & subRegionFE = subRegion.template getReference< finiteElement::FiniteElementBase >( this->getDiscretizationName()); + finiteElement::FiniteElementDispatchHandler< BASE_FE_TYPES >::dispatch3D( subRegionFE, [&] ( auto const finiteElement ) + { + using FE_TYPE = decltype( finiteElement ); + AverageStrainOverQuadraturePointsKernelFactory::createAndLaunch< CellElementSubRegion, FE_TYPE, parallelDevicePolicy<> >( nodeManager, + mesh.getEdgeManager(), + mesh.getFaceManager(), + subRegion, + finiteElement, + disp, + strain ); + } ); + + } ); } ); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index dc24a47e941..52752c798ca 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -22,6 +22,7 @@ #include "codingUtilities/EnumStrings.hpp" #include "common/TimingMacros.hpp" #include "kernels/SolidMechanicsLagrangianFEMKernels.hpp" +#include "kernels/StrainHelper.hpp" #include "mesh/MeshForLoopInterface.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "mesh/mpiCommunications/MPI_iCommData.hpp" diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp new file mode 100644 index 00000000000..d2ad3900fde --- /dev/null +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp @@ -0,0 +1,219 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file StrainHelper.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_KERNELS_STRAINHELPER_HPP_ +#define GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_KERNELS_STRAINHELPER_HPP_ + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "finiteElement/FiniteElementDispatch.hpp" +#include "mesh/CellElementSubRegion.hpp" +#include "mesh/utilities/AverageOverQuadraturePointsKernel.hpp" +#include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" + +namespace geos +{ +/** + * @class AverageStrainOverQuadraturePoints + * @tparam SUBREGION_TYPE the subRegion type + * @tparam FE_TYPE the finite element type + */ +template< typename SUBREGION_TYPE, + typename FE_TYPE > +class AverageStrainOverQuadraturePoints : + public AverageOverQuadraturePointsBase< SUBREGION_TYPE, + FE_TYPE > +{ +public: + + /// Alias for the base class; + using Base = AverageOverQuadraturePointsBase< SUBREGION_TYPE, + FE_TYPE >; + + using Base::m_elementVolume; + using Base::m_elemsToNodes; + using Base::m_finiteElementSpace; + + /** + * @brief Constructor for the class + * @param nodeManager the node manager + * @param edgeManager the edge manager + * @param faceManager the face manager + * @param elementSubRegion the element subRegion + * @param finiteElementSpace the finite element space + * @param displacement the displacement solution field + * @param avgStrain the strain averaged over quadrature points + */ + AverageStrainOverQuadraturePoints( NodeManager & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + SUBREGION_TYPE const & elementSubRegion, + FE_TYPE const & finiteElementSpace, + fields::solidMechanics::arrayViewConst2dLayoutTotalDisplacement const displacement, + fields::solidMechanics::arrayView2dLayoutStrain const avgStrain ): + Base( nodeManager, + edgeManager, + faceManager, + elementSubRegion, + finiteElementSpace ), + m_displacement( displacement ), + m_avgStrain( avgStrain ) + {} + + /** + * @copydoc finiteElement::KernelBase::StackVariables + */ + struct StackVariables : Base::StackVariables + {real64 uLocal[FE_TYPE::maxSupportPoints][3]; }; + + /** + * @brief Performs the setup phase for the kernel. + * @param k The element index. + * @param stack The StackVariable object that hold the stack variables. + */ + GEOS_HOST_DEVICE + void setup( localIndex const k, + StackVariables & stack ) const + { + Base::setup( k, stack ); + + for( localIndex a = 0; a < FE_TYPE::maxSupportPoints; ++a ) + { + localIndex const localNodeIndex = m_elemsToNodes( k, a ); + for( int i = 0; i < 3; ++i ) + { + stack.uLocal[a][i] = m_displacement[localNodeIndex][i]; + } + } + + for( int icomp = 0; icomp < 6; ++icomp ) + { + m_avgStrain[k][icomp] = 0.0; + } + } + + /** + * @brief Increment the average property with the contribution of the property at this quadrature point + * @param k The element index + * @param q The quadrature point index + * @param stack The StackVariables object that hold the stack variables. + */ + GEOS_HOST_DEVICE + void quadraturePointKernel( localIndex const k, + localIndex const q, + StackVariables & stack ) const + { + //real64 const weight = FE_TYPE::transformedQuadratureWeight( q, stack.xLocal, stack.feStack ) / m_elementVolume[k]; + + real64 dNdX[ FE_TYPE::maxSupportPoints ][3]; + real64 const detJxW = m_finiteElementSpace.template getGradN< FE_TYPE >( k, q, stack.xLocal, stack.feStack, dNdX ); + real64 strain[6] = {0.0}; + FE_TYPE::symmetricGradient( dNdX, stack.uLocal, strain ); + + for( int icomp = 0; icomp < 6; ++icomp ) + { + m_avgStrain[k][icomp] += detJxW*strain[icomp]/m_elementVolume[k]; + } + } + + /** + * @brief Launch the kernel over the elements in the subRegion + * @tparam POLICY the kernel policy + * @tparam KERNEL_TYPE the type of kernel + * @param numElems the number of elements in the subRegion + * @param kernelComponent the kernel component + */ + template< typename POLICY, + typename KERNEL_TYPE > + static void + kernelLaunch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + forAll< POLICY >( numElems, + [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + typename KERNEL_TYPE::StackVariables stack; + + kernelComponent.setup( k, stack ); + for( integer q = 0; q < FE_TYPE::numQuadraturePoints; ++q ) + { + kernelComponent.quadraturePointKernel( k, q, stack ); + } + } ); + } + +protected: + + /// The displacement solution + fields::solidMechanics::arrayViewConst2dLayoutTotalDisplacement const m_displacement; + + /// The average strain + fields::solidMechanics::arrayView2dLayoutStrain const m_avgStrain; + +}; + + + +/** + * @class AverageStrainOverQuadraturePointsKernelFactory + * @brief Class to create and launch the kernel + */ +class AverageStrainOverQuadraturePointsKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam SUBREGION_TYPE the subRegion type + * @tparam FE_TYPE the finite element type + * @tparam POLICY the kernel policy + * @param nodeManager the node manager + * @param edgeManager the edge manager + * @param faceManager the face manager + * @param elementSubRegion the element subRegion + * @param finiteElementSpace the finite element space + * @param property the property at quadrature points + * @param averageProperty the property averaged over quadrature points + */ + template< typename SUBREGION_TYPE, + typename FE_TYPE, + typename POLICY > + static void + createAndLaunch( NodeManager & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + SUBREGION_TYPE const & elementSubRegion, + FE_TYPE const & finiteElementSpace, + fields::solidMechanics::arrayViewConst2dLayoutTotalDisplacement const displacement, + fields::solidMechanics::arrayView2dLayoutStrain const avgStrain ) + { + AverageStrainOverQuadraturePoints< SUBREGION_TYPE, FE_TYPE > + kernel( nodeManager, edgeManager, faceManager, elementSubRegion, finiteElementSpace, + displacement, avgStrain ); + + AverageStrainOverQuadraturePoints< SUBREGION_TYPE, FE_TYPE >::template + kernelLaunch< POLICY >( elementSubRegion.size(), kernel ); + } +}; + + + +} + + +#endif /* GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_KERNELS_STRAINHELPER_HPP_ */ From f91800bbe1c478c4959d742b16eb20156514def1 Mon Sep 17 00:00:00 2001 From: Lionel Untereiner Date: Fri, 21 Jun 2024 21:43:03 +0200 Subject: [PATCH 106/286] Python Packaging Updates (#3057) Updating geosPythonPackages --------- Co-authored-by: Christopher Sherman --- inputFiles/almContactMechanics/alm.ats | 3 +-- .../benchmarks/SPE10/SPE10.ats | 3 +-- .../buckleyLeverettProblem.ats | 3 +-- .../isothermalLeakyWell/isothermalLeakyWell.ats | 3 +-- .../thermalLeakyWell/thermalLeakyWell.ats | 3 +-- .../c1-ppu/c1_ppu.ats | 3 +-- .../compositionalMultiphaseFlow.ats | 3 +-- .../benchmarks/Class09Pb3/Class09Pb3.ats | 8 +------- .../Egg/compositionalMultiphaseWell_Egg.ats | 8 +------- .../compositionalMultiphaseWell.ats | 8 +------- .../efemFractureMechanics.ats | 4 +--- .../hydraulicFracturing/Hydrofracturing.ats | 3 +-- .../inducedSeismicity/inducedSeismicity.ats | 3 +-- .../contactMechanics.ats | 4 +--- inputFiles/main.ats | 1 - .../solidMechanicsMPM_dfgMovingGrid.ats | 4 +--- .../solidMechanicsMPM_particleRepartition.ats | 4 +--- .../solidMechanicsMPM_singleParticle.ats | 4 +--- .../multiphaseFlowFractures.ats | 4 +--- inputFiles/phaseField/PhaseFieldFracture.ats | 4 +--- .../poroelasticCoupling_validation.ats | 3 +-- inputFiles/poromechanics/poroElasticCoupling.ats | 3 +-- inputFiles/poromechanics/viscoPlastic.ats | 3 +-- .../poromechanicsFractures.ats | 4 +--- inputFiles/proppant/proppantTransport.ats | 4 +--- inputFiles/simplePDE/SimpleSolvers.ats | 4 +--- inputFiles/singlePhaseFlow/singlePhaseFlow.ats | 4 +--- .../singlePhaseFlow/thermalSinglePhaseFlow.ats | 4 +--- .../singlePhaseFlowFractures.ats | 4 +--- inputFiles/singlePhaseWell/singlePhaseWell.ats | 4 +--- inputFiles/solidMechanics/SSLE.ats | 3 +-- inputFiles/solidMechanics/anisotropic.ats | 3 +-- inputFiles/solidMechanics/beamBending.ats | 3 +-- inputFiles/solidMechanics/gravity.ats | 3 +-- inputFiles/solidMechanics/plasticCubeReset.ats | 3 +-- inputFiles/solidMechanics/plasticWellbore.ats | 4 +--- inputFiles/solidMechanics/sedov.ats | 3 +-- inputFiles/solidMechanics/viscoPlastic.ats | 3 +-- inputFiles/solidMechanics/wellbore.ats | 4 +--- .../surfaceGeneration/SurfaceGenerator.ats | 4 +--- .../thermalMultiphaseFlow.ats | 4 +--- .../thermalSinglePhaseFlowFractures.ats | 4 +--- .../thermoPoromechanics/thermoPoromechanics.ats | 4 +--- .../thermoPoromechanicsFractures.ats | 4 +--- .../wavePropagation/AcousticElasticSEM.ats | 4 +--- .../wavePropagation/AcousticFirstOrderSEM.ats | 4 +--- inputFiles/wavePropagation/AcousticSEM.ats | 4 +--- .../wavePropagation/ElasticFirstOrderSEM.ats | 4 +--- inputFiles/wavePropagation/ElasticSEM.ats | 4 +--- inputFiles/wavePropagation/ElasticVTISEM.ats | 3 +-- .../wellbore/thermoPoromechanics_wellbore.ats | 4 +--- inputFiles/wellbore/wellboreMesh.ats | 4 +--- scripts/setupPythonEnvironment.bash | 16 ++++++++++------ src/CMakeLists.txt | 4 ++-- src/conf.py | 10 +++++----- 55 files changed, 68 insertions(+), 159 deletions(-) diff --git a/inputFiles/almContactMechanics/alm.ats b/inputFiles/almContactMechanics/alm.ats index 2ce013a6bd2..dc6417df533 100644 --- a/inputFiles/almContactMechanics/alm.ats +++ b/inputFiles/almContactMechanics/alm.ats @@ -1,6 +1,5 @@ import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 2.0E-4 diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/SPE10.ats b/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/SPE10.ats index 3d37c8e5c7b..de097df9278 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/SPE10.ats +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/SPE10.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 1.0E-6 diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverettProblem.ats b/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverettProblem.ats index 30944577aa4..266e7b25a48 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverettProblem.ats +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverettProblem.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 1.0E-6 diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell.ats b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell.ats index acc7382aa8f..e84fb9ef269 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell.ats +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/isothermalLeakyWell/isothermalLeakyWell.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 1.0E-6 diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell.ats b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell.ats index f0a149ff298..e473d997e2f 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell.ats +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 1.0E-6 diff --git a/inputFiles/compositionalMultiphaseFlow/c1-ppu/c1_ppu.ats b/inputFiles/compositionalMultiphaseFlow/c1-ppu/c1_ppu.ats index 52d47c61ff4..1f524c1ee75 100644 --- a/inputFiles/compositionalMultiphaseFlow/c1-ppu/c1_ppu.ats +++ b/inputFiles/compositionalMultiphaseFlow/c1-ppu/c1_ppu.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 1.0E-6 diff --git a/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats b/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats index 20d44298c97..319422346c8 100644 --- a/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats +++ b/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 1.0E-6 diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/Class09Pb3.ats b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/Class09Pb3.ats index f860f8651da..05561de8351 100644 --- a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/Class09Pb3.ats +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/Class09Pb3.ats @@ -1,15 +1,9 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 1.0E-6 restartcheck_params["rtol"] = 1.0E-5 -# exclude any derivative fields from restart checks -# example field name: dGlobalComponentFraction_dPressure -#restartcheck_params["exclude"] = [r"d[A-Z]\w+_d[A-Z]\w+"] - decks = [ TestDeck( name="class09_pb3_smoke_3d", diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/compositionalMultiphaseWell_Egg.ats b/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/compositionalMultiphaseWell_Egg.ats index 065b75a6645..b36b208a1f1 100644 --- a/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/compositionalMultiphaseWell_Egg.ats +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/compositionalMultiphaseWell_Egg.ats @@ -1,15 +1,9 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 1.0E-6 restartcheck_params["rtol"] = 1.0E-5 -# exclude any derivative fields from restart checks -# example field name: dGlobalComponentFraction_dPressure -#restartcheck_params["exclude"] = [r"d[A-Z]\w+_d[A-Z]\w+"] - decks = [ TestDeck( name="deadOilEgg_smoke_3d", diff --git a/inputFiles/compositionalMultiphaseWell/compositionalMultiphaseWell.ats b/inputFiles/compositionalMultiphaseWell/compositionalMultiphaseWell.ats index 6cfaf320a36..ea1d810c064 100644 --- a/inputFiles/compositionalMultiphaseWell/compositionalMultiphaseWell.ats +++ b/inputFiles/compositionalMultiphaseWell/compositionalMultiphaseWell.ats @@ -1,15 +1,9 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 1.0E-6 restartcheck_params["rtol"] = 1.0E-5 -# exclude any derivative fields from restart checks -# example field name: dGlobalComponentFraction_dPressure -#restartcheck_params["exclude"] = [r"d[A-Z]\w+_d[A-Z]\w+"] - decks = [ TestDeck( name="compositional_multiphase_wells_1d", diff --git a/inputFiles/efemFractureMechanics/efemFractureMechanics.ats b/inputFiles/efemFractureMechanics/efemFractureMechanics.ats index 8242a30cc6c..0d5fd3c4f06 100644 --- a/inputFiles/efemFractureMechanics/efemFractureMechanics.ats +++ b/inputFiles/efemFractureMechanics/efemFractureMechanics.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, CurveCheckParameters, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, CurveCheckParameters, RestartcheckParameters, generate_geos_tests restartcheck_params = {'atol': 1e-08, 'rtol': 4e-07} diff --git a/inputFiles/hydraulicFracturing/Hydrofracturing.ats b/inputFiles/hydraulicFracturing/Hydrofracturing.ats index ab32dc09f55..c3ba4ef2533 100644 --- a/inputFiles/hydraulicFracturing/Hydrofracturing.ats +++ b/inputFiles/hydraulicFracturing/Hydrofracturing.ats @@ -1,6 +1,5 @@ import copy -import geos_ats -from geos_ats.test_builder import generate_geos_tests, RestartcheckParameters, CurveCheckParameters, TestDeck +from geos.ats.test_builder import generate_geos_tests, RestartcheckParameters, CurveCheckParameters, TestDeck # Define cases kgd_viscosity_dominated = { diff --git a/inputFiles/inducedSeismicity/inducedSeismicity.ats b/inputFiles/inducedSeismicity/inducedSeismicity.ats index ebc33ea78ae..ca310081883 100644 --- a/inputFiles/inducedSeismicity/inducedSeismicity.ats +++ b/inputFiles/inducedSeismicity/inducedSeismicity.ats @@ -1,6 +1,5 @@ import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests, CurveCheckParameters +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests, CurveCheckParameters curvecheck_params = {} curvecheck_params["filename"] = "seismicityRate.hdf5" diff --git a/inputFiles/lagrangianContactMechanics/contactMechanics.ats b/inputFiles/lagrangianContactMechanics/contactMechanics.ats index 6b1e224987d..7e21af247b6 100644 --- a/inputFiles/lagrangianContactMechanics/contactMechanics.ats +++ b/inputFiles/lagrangianContactMechanics/contactMechanics.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 2.0E-4 diff --git a/inputFiles/main.ats b/inputFiles/main.ats index a76815a8700..c85f018bb1a 100644 --- a/inputFiles/main.ats +++ b/inputFiles/main.ats @@ -1,7 +1,6 @@ """ Primary ATS script """ -import os import ats from pathlib import Path diff --git a/inputFiles/materialPointMethod/dfgMovingGrid/solidMechanicsMPM_dfgMovingGrid.ats b/inputFiles/materialPointMethod/dfgMovingGrid/solidMechanicsMPM_dfgMovingGrid.ats index 0050fbc9c28..614cec27195 100644 --- a/inputFiles/materialPointMethod/dfgMovingGrid/solidMechanicsMPM_dfgMovingGrid.ats +++ b/inputFiles/materialPointMethod/dfgMovingGrid/solidMechanicsMPM_dfgMovingGrid.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1.0E-8 diff --git a/inputFiles/materialPointMethod/particleRepartition/solidMechanicsMPM_particleRepartition.ats b/inputFiles/materialPointMethod/particleRepartition/solidMechanicsMPM_particleRepartition.ats index 91170fe400d..3fb5432df5e 100644 --- a/inputFiles/materialPointMethod/particleRepartition/solidMechanicsMPM_particleRepartition.ats +++ b/inputFiles/materialPointMethod/particleRepartition/solidMechanicsMPM_particleRepartition.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1.0E-8 diff --git a/inputFiles/materialPointMethod/singleParticle/solidMechanicsMPM_singleParticle.ats b/inputFiles/materialPointMethod/singleParticle/solidMechanicsMPM_singleParticle.ats index 4432464bd90..6860cbe2d56 100644 --- a/inputFiles/materialPointMethod/singleParticle/solidMechanicsMPM_singleParticle.ats +++ b/inputFiles/materialPointMethod/singleParticle/solidMechanicsMPM_singleParticle.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1.0E-8 diff --git a/inputFiles/multiphaseFlowFractures/multiphaseFlowFractures.ats b/inputFiles/multiphaseFlowFractures/multiphaseFlowFractures.ats index 23498785498..e600c44e1a4 100644 --- a/inputFiles/multiphaseFlowFractures/multiphaseFlowFractures.ats +++ b/inputFiles/multiphaseFlowFractures/multiphaseFlowFractures.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1e-10 diff --git a/inputFiles/phaseField/PhaseFieldFracture.ats b/inputFiles/phaseField/PhaseFieldFracture.ats index d8a3db1c465..d0882081552 100644 --- a/inputFiles/phaseField/PhaseFieldFracture.ats +++ b/inputFiles/phaseField/PhaseFieldFracture.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1e-06 diff --git a/inputFiles/poromechanics/nonlinearAcceleration/validationCase/poroelasticCoupling_validation.ats b/inputFiles/poromechanics/nonlinearAcceleration/validationCase/poroelasticCoupling_validation.ats index 1ffd4767566..78c50420484 100644 --- a/inputFiles/poromechanics/nonlinearAcceleration/validationCase/poroelasticCoupling_validation.ats +++ b/inputFiles/poromechanics/nonlinearAcceleration/validationCase/poroelasticCoupling_validation.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests class Description(object): diff --git a/inputFiles/poromechanics/poroElasticCoupling.ats b/inputFiles/poromechanics/poroElasticCoupling.ats index 30c865afc8c..4627c12c41a 100644 --- a/inputFiles/poromechanics/poroElasticCoupling.ats +++ b/inputFiles/poromechanics/poroElasticCoupling.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests class Description(object): diff --git a/inputFiles/poromechanics/viscoPlastic.ats b/inputFiles/poromechanics/viscoPlastic.ats index 1f2a7db87fe..b28ff80a6b9 100644 --- a/inputFiles/poromechanics/viscoPlastic.ats +++ b/inputFiles/poromechanics/viscoPlastic.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import generate_geos_tests, RestartcheckParameters, TestDeck +from geos.ats.test_builder import generate_geos_tests, RestartcheckParameters, TestDeck restartcheck_params = {} restartcheck_params["atol"] = 1.0E-5 diff --git a/inputFiles/poromechanicsFractures/poromechanicsFractures.ats b/inputFiles/poromechanicsFractures/poromechanicsFractures.ats index fade17ec165..9c92fe7f782 100644 --- a/inputFiles/poromechanicsFractures/poromechanicsFractures.ats +++ b/inputFiles/poromechanicsFractures/poromechanicsFractures.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {'atol': 1e-07, 'rtol': 4e-06} diff --git a/inputFiles/proppant/proppantTransport.ats b/inputFiles/proppant/proppantTransport.ats index 9a9a0b99872..8a138d3fa61 100644 --- a/inputFiles/proppant/proppantTransport.ats +++ b/inputFiles/proppant/proppantTransport.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1e-10 diff --git a/inputFiles/simplePDE/SimpleSolvers.ats b/inputFiles/simplePDE/SimpleSolvers.ats index 8e5de718d0d..f164d86ed16 100644 --- a/inputFiles/simplePDE/SimpleSolvers.ats +++ b/inputFiles/simplePDE/SimpleSolvers.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1e-08 diff --git a/inputFiles/singlePhaseFlow/singlePhaseFlow.ats b/inputFiles/singlePhaseFlow/singlePhaseFlow.ats index da476381b7e..e6795bbe42f 100644 --- a/inputFiles/singlePhaseFlow/singlePhaseFlow.ats +++ b/inputFiles/singlePhaseFlow/singlePhaseFlow.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1e-10 diff --git a/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats b/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats index 2fb9d311c88..cd021117e0a 100644 --- a/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats +++ b/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1e-06 diff --git a/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats b/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats index e3453332620..b78b55e7331 100644 --- a/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats +++ b/inputFiles/singlePhaseFlowFractures/singlePhaseFlowFractures.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1e-10 diff --git a/inputFiles/singlePhaseWell/singlePhaseWell.ats b/inputFiles/singlePhaseWell/singlePhaseWell.ats index 45bd8377dc5..3c2294f15e7 100644 --- a/inputFiles/singlePhaseWell/singlePhaseWell.ats +++ b/inputFiles/singlePhaseWell/singlePhaseWell.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1e-09 diff --git a/inputFiles/solidMechanics/SSLE.ats b/inputFiles/solidMechanics/SSLE.ats index 38b590c519d..41213dd2199 100644 --- a/inputFiles/solidMechanics/SSLE.ats +++ b/inputFiles/solidMechanics/SSLE.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import generate_geos_tests, RestartcheckParameters, TestDeck +from geos.ats.test_builder import generate_geos_tests, RestartcheckParameters, TestDeck restartcheck_params = {} restartcheck_params["atol"] = 1.0E-10 diff --git a/inputFiles/solidMechanics/anisotropic.ats b/inputFiles/solidMechanics/anisotropic.ats index a6afc13b144..5a4db820d7a 100644 --- a/inputFiles/solidMechanics/anisotropic.ats +++ b/inputFiles/solidMechanics/anisotropic.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import generate_geos_tests, TestDeck, RestartcheckParameters +from geos.ats.test_builder import generate_geos_tests, TestDeck, RestartcheckParameters restartcheck_params = {} restartcheck_params["atol"] = 1.0E-5 diff --git a/inputFiles/solidMechanics/beamBending.ats b/inputFiles/solidMechanics/beamBending.ats index 352a2ae5d3f..3ca10958216 100644 --- a/inputFiles/solidMechanics/beamBending.ats +++ b/inputFiles/solidMechanics/beamBending.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import RestartcheckParameters, CurveCheckParameters, TestDeck, generate_geos_tests +from geos.ats.test_builder import RestartcheckParameters, CurveCheckParameters, TestDeck, generate_geos_tests restartcheck_params = RestartcheckParameters(atol=1.0E-3, rtol=1.0E-7) diff --git a/inputFiles/solidMechanics/gravity.ats b/inputFiles/solidMechanics/gravity.ats index 0da665c416e..411744dc844 100644 --- a/inputFiles/solidMechanics/gravity.ats +++ b/inputFiles/solidMechanics/gravity.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import generate_geos_tests, TestDeck, RestartcheckParameters +from geos.ats.test_builder import generate_geos_tests, TestDeck, RestartcheckParameters restartcheck_params = {} restartcheck_params["atol"] = 1.0E-5 diff --git a/inputFiles/solidMechanics/plasticCubeReset.ats b/inputFiles/solidMechanics/plasticCubeReset.ats index 9efdc1738c5..1048f140f81 100644 --- a/inputFiles/solidMechanics/plasticCubeReset.ats +++ b/inputFiles/solidMechanics/plasticCubeReset.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import generate_geos_tests, RestartcheckParameters, TestDeck +from geos.ats.test_builder import generate_geos_tests, RestartcheckParameters, TestDeck restartcheck_params = {} restartcheck_params["atol"] = 1.0E-5 diff --git a/inputFiles/solidMechanics/plasticWellbore.ats b/inputFiles/solidMechanics/plasticWellbore.ats index 4c285454533..740b3782d8b 100644 --- a/inputFiles/solidMechanics/plasticWellbore.ats +++ b/inputFiles/solidMechanics/plasticWellbore.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1e-06 diff --git a/inputFiles/solidMechanics/sedov.ats b/inputFiles/solidMechanics/sedov.ats index 62687c4508a..5c353c27462 100644 --- a/inputFiles/solidMechanics/sedov.ats +++ b/inputFiles/solidMechanics/sedov.ats @@ -1,6 +1,5 @@ # Integrated Test Docs Begin Parameters -import geos_ats -from geos_ats.test_builder import generate_geos_tests, RestartcheckParameters, TestDeck, CurveCheckParameters +from geos.ats.test_builder import generate_geos_tests, RestartcheckParameters, TestDeck, CurveCheckParameters restartcheck_params = {} restartcheck_params["atol"] = 2.0E-10 diff --git a/inputFiles/solidMechanics/viscoPlastic.ats b/inputFiles/solidMechanics/viscoPlastic.ats index e61a1ac8a92..1639425c0bc 100644 --- a/inputFiles/solidMechanics/viscoPlastic.ats +++ b/inputFiles/solidMechanics/viscoPlastic.ats @@ -1,5 +1,4 @@ -import geos_ats -from geos_ats.test_builder import generate_geos_tests, RestartcheckParameters, TestDeck +from geos.ats.test_builder import generate_geos_tests, RestartcheckParameters, TestDeck restartcheck_params = {} restartcheck_params["atol"] = 1.0E-5 diff --git a/inputFiles/solidMechanics/wellbore.ats b/inputFiles/solidMechanics/wellbore.ats index f858b683f22..4552e5d8da3 100644 --- a/inputFiles/solidMechanics/wellbore.ats +++ b/inputFiles/solidMechanics/wellbore.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 0.0001 diff --git a/inputFiles/surfaceGeneration/SurfaceGenerator.ats b/inputFiles/surfaceGeneration/SurfaceGenerator.ats index 58a7bdce307..5ce436adadb 100644 --- a/inputFiles/surfaceGeneration/SurfaceGenerator.ats +++ b/inputFiles/surfaceGeneration/SurfaceGenerator.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 1.0E-5 diff --git a/inputFiles/thermalMultiphaseFlow/thermalMultiphaseFlow.ats b/inputFiles/thermalMultiphaseFlow/thermalMultiphaseFlow.ats index 63f0a1eb79e..ea6193427d9 100644 --- a/inputFiles/thermalMultiphaseFlow/thermalMultiphaseFlow.ats +++ b/inputFiles/thermalMultiphaseFlow/thermalMultiphaseFlow.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1e-06 diff --git a/inputFiles/thermalSinglePhaseFlowFractures/thermalSinglePhaseFlowFractures.ats b/inputFiles/thermalSinglePhaseFlowFractures/thermalSinglePhaseFlowFractures.ats index ab39f64db8c..bbbe14a50d9 100644 --- a/inputFiles/thermalSinglePhaseFlowFractures/thermalSinglePhaseFlowFractures.ats +++ b/inputFiles/thermalSinglePhaseFlowFractures/thermalSinglePhaseFlowFractures.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 1e-06 diff --git a/inputFiles/thermoPoromechanics/thermoPoromechanics.ats b/inputFiles/thermoPoromechanics/thermoPoromechanics.ats index 561fe62ba25..7fd79868bbb 100644 --- a/inputFiles/thermoPoromechanics/thermoPoromechanics.ats +++ b/inputFiles/thermoPoromechanics/thermoPoromechanics.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {'atol': 1e-06, 'rtol': 4e-06} diff --git a/inputFiles/thermoPoromechanicsFractures/thermoPoromechanicsFractures.ats b/inputFiles/thermoPoromechanicsFractures/thermoPoromechanicsFractures.ats index cca95c6e68e..a00790e4bf4 100644 --- a/inputFiles/thermoPoromechanicsFractures/thermoPoromechanicsFractures.ats +++ b/inputFiles/thermoPoromechanicsFractures/thermoPoromechanicsFractures.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {'atol': 1e-06, 'rtol': 4e-06} diff --git a/inputFiles/wavePropagation/AcousticElasticSEM.ats b/inputFiles/wavePropagation/AcousticElasticSEM.ats index 642390f5b7d..0af4b2a90a2 100644 --- a/inputFiles/wavePropagation/AcousticElasticSEM.ats +++ b/inputFiles/wavePropagation/AcousticElasticSEM.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 0.0001 diff --git a/inputFiles/wavePropagation/AcousticFirstOrderSEM.ats b/inputFiles/wavePropagation/AcousticFirstOrderSEM.ats index 4eafac6e6bb..3e825f697c7 100644 --- a/inputFiles/wavePropagation/AcousticFirstOrderSEM.ats +++ b/inputFiles/wavePropagation/AcousticFirstOrderSEM.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 0.0001 diff --git a/inputFiles/wavePropagation/AcousticSEM.ats b/inputFiles/wavePropagation/AcousticSEM.ats index 006d7958153..96ddf177bd2 100644 --- a/inputFiles/wavePropagation/AcousticSEM.ats +++ b/inputFiles/wavePropagation/AcousticSEM.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 0.0001 diff --git a/inputFiles/wavePropagation/ElasticFirstOrderSEM.ats b/inputFiles/wavePropagation/ElasticFirstOrderSEM.ats index dfad33d399f..4f94cbb5a91 100644 --- a/inputFiles/wavePropagation/ElasticFirstOrderSEM.ats +++ b/inputFiles/wavePropagation/ElasticFirstOrderSEM.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 0.0001 diff --git a/inputFiles/wavePropagation/ElasticSEM.ats b/inputFiles/wavePropagation/ElasticSEM.ats index 093fc9859e2..363da183eee 100644 --- a/inputFiles/wavePropagation/ElasticSEM.ats +++ b/inputFiles/wavePropagation/ElasticSEM.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 0.0001 diff --git a/inputFiles/wavePropagation/ElasticVTISEM.ats b/inputFiles/wavePropagation/ElasticVTISEM.ats index 8be1849a4c3..ebecafe2783 100644 --- a/inputFiles/wavePropagation/ElasticVTISEM.ats +++ b/inputFiles/wavePropagation/ElasticVTISEM.ats @@ -1,6 +1,5 @@ import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 0.0001 diff --git a/inputFiles/wellbore/thermoPoromechanics_wellbore.ats b/inputFiles/wellbore/thermoPoromechanics_wellbore.ats index 4541246b809..719c6323a94 100644 --- a/inputFiles/wellbore/thermoPoromechanics_wellbore.ats +++ b/inputFiles/wellbore/thermoPoromechanics_wellbore.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {'atol': 1e-06, 'rtol': 4e-06} diff --git a/inputFiles/wellbore/wellboreMesh.ats b/inputFiles/wellbore/wellboreMesh.ats index 23086646dd8..4c4dee8e916 100644 --- a/inputFiles/wellbore/wellboreMesh.ats +++ b/inputFiles/wellbore/wellboreMesh.ats @@ -1,6 +1,4 @@ -import os -import geos_ats -from geos_ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params['atol'] = 0.0001 diff --git a/scripts/setupPythonEnvironment.bash b/scripts/setupPythonEnvironment.bash index eb1dcfaaaff..2faf325275e 100755 --- a/scripts/setupPythonEnvironment.bash +++ b/scripts/setupPythonEnvironment.bash @@ -11,12 +11,12 @@ PIP_CMD="pip --disable-pip-version-check" PACKAGE_BRANCH=main -declare -a TARGET_PACKAGES=("geosx_mesh_tools_package" - "geosx_mesh_doctor" - "geosx_xml_tools_package" - "hdf5_wrapper_package" - "pygeosx_tools_package" - "geos_ats_package") +declare -a TARGET_PACKAGES=("geos-mesh-tools" + "geos-mesh-doctor" + "geos-xml-tools" + "hdf5-wrapper" + "pygeos-tools" + "geos-ats") declare -a LINK_SCRIPTS=("preprocess_xml" "format_xml" "convert_abaqus" @@ -116,6 +116,10 @@ then fi +# Updating pip +echo "Updating pip" +$PYTHON_TARGET -m pip install --upgrade pip + # Install packages echo "Installing python packages..." for p in "${TARGET_PACKAGES[@]}" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 930734a71b1..54b7a3f9bfd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -232,8 +232,8 @@ install( FILES ${CMAKE_BINARY_DIR}/schema.xsd ################################ # Add python environment setup ################################ -# message(WARNING "Temporarily changing the geosPythonBranch to cusini/fix-streak-cert-fail") -# set(GEOS_PYTHON_PACKAGES_BRANCH "cusini/fix-streak-cert-fail" CACHE STRING "" FORCE) +# message(WARNING "Temporarily changing the geosPythonBranch to feature/packaging") +# set(GEOS_PYTHON_PACKAGES_BRANCH "feature/packaging" CACHE STRING "" FORCE) if ( Python3_EXECUTABLE ) diff --git a/src/conf.py b/src/conf.py index f27f7843963..e54573753a0 100644 --- a/src/conf.py +++ b/src/conf.py @@ -18,11 +18,11 @@ # Add python modules to be documented python_root = './coreComponents/python/modules' -python_modules = ('geosx_mesh_tools_package', - 'geosx_xml_tools_package', - 'hdf5_wrapper_package', - 'pygeosx_tools_package', - 'timehistory_package') +python_modules = ('geos-mesh-tools', + 'geos-xml-tools', + 'hdf5-wrapper', + 'pygeos-tools', + 'geos-timehistory') for m in python_modules: sys.path.insert(0, os.path.abspath(os.path.join(python_root, m))) From e8cc1a3e791a3fcbfa4dc3d015f04fa2c8ec2f4a Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 25 Jun 2024 00:06:03 +0100 Subject: [PATCH 107/286] update LvArray for adding freeOnDevice() function (#3183) * update LvArray for adding freeOnDevice() function --- src/coreComponents/LvArray | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 1531241583e..7aace428c3e 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 1531241583eebe21cfcdc0facd16a80f1e03c939 +Subproject commit 7aace428c3ead5df5edbd9980d736fc95ee08da8 From bb72b146a384b7064542fa365714ffba513c65d9 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 25 Jun 2024 04:00:15 +0100 Subject: [PATCH 108/286] Replace paid runners with streak2 (#3184) Replace paid runners with streak2 for all builds except code coverage. --- .github/workflows/build_and_test.yml | 2 +- .github/workflows/ci_tests.yml | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 4824e37d2a7..c345222e11c 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -314,7 +314,7 @@ jobs: if: inputs.CODE_COVERAGE uses: codecov/codecov-action@v4.3.1 with: - files: geos_coverage.info.cleaned + files: ${GITHUB_WORKSPACE}/geos_coverage.info.cleaned fail_ci_if_error: true env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 0a44baf6a4d..d0d60dcde4e 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -257,8 +257,8 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF RUNS_ON: streak2 - NPROC: 16 - DOCKER_RUN_ARGS: "--cpus=16 --memory=256g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" + NPROC: 8 + DOCKER_RUN_ARGS: "--cpus=8 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" DOCKER_CERTS_UPDATE_COMMAND: "update-ca-certificates" @@ -280,8 +280,8 @@ jobs: CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/centos7.7-gcc8.3.1-cuda11.8.89 RUNS_ON: streak2 - NPROC: 16 - DOCKER_RUN_ARGS: "--cpus=16 --memory=256g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" + NPROC: 8 + DOCKER_RUN_ARGS: "--cpus=8 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" @@ -291,7 +291,11 @@ jobs: CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/pecan-gpu-gcc8.2.0-openmpi4.0.1-mkl2019.5-cuda11.5.119 HOST_CONFIG: host-configs/TOTAL/pecan-GPU.cmake - RUNS_ON: Runner_4core_16GB + RUNS_ON: streak2 + NPROC: 8 + DOCKER_RUN_ARGS: "--cpus=8 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" + DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" - name: Sherlock GPU (centos 7.9.2009, gcc 10.1.0, open-mpi 4.1.2, openblas 0.3.10, cuda 11.7.1,) BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" @@ -302,7 +306,11 @@ jobs: ENABLE_TRILINOS: OFF GCP_BUCKET: geosx/Sherlock-GPU HOST_CONFIG: host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10-cuda11.7.1-sm70.cmake - RUNS_ON: Runner_4core_16GB + RUNS_ON: streak2 + NPROC: 8 + DOCKER_RUN_ARGS: "--cpus=8 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" + DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" uses: ./.github/workflows/build_and_test.yml with: From 07e096ece46a7686bd628f059005c0530684f144 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 25 Jun 2024 05:34:40 +0100 Subject: [PATCH 109/286] Fix unit tests on GPU CI platform. (#2985) * re-enable testLifoStorage * adding fix for unit test testLifoStorage Co-authored-by: Jie Meng Co-authored-by: Stefano Frambati Co-authored-by: j0405284 --- scripts/ci_build_and_test_in_container.sh | 2 +- src/coreComponents/common/LifoStorageCuda.hpp | 3 +- .../common/unitTests/testLifoStorage.cpp | 36 ++++++++++--------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index 347ea362660..33faba11f8c 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -270,7 +270,7 @@ fi # Run the unit tests (excluding previously ran checks). if [[ "${RUN_UNIT_TESTS}" = true ]]; then if [ ${HOSTNAME} == 'streak.llnl.gov' ] || [ ${HOSTNAME} == 'streak2.llnl.gov' ]; then - or_die ctest --output-on-failure -E "testUncrustifyCheck|testDoxygenCheck|testLifoStorage|testExternalSolvers" + or_die ctest --output-on-failure -E "testUncrustifyCheck|testDoxygenCheck|testExternalSolvers" else or_die ctest --output-on-failure -E "testUncrustifyCheck|testDoxygenCheck" fi diff --git a/src/coreComponents/common/LifoStorageCuda.hpp b/src/coreComponents/common/LifoStorageCuda.hpp index 9345db2615d..8c8be672aaa 100644 --- a/src/coreComponents/common/LifoStorageCuda.hpp +++ b/src/coreComponents/common/LifoStorageCuda.hpp @@ -132,8 +132,7 @@ class LifoStorageCuda : public LifoStorageCommon< T, INDEX_TYPE > if( baseLifo::m_bufferCount < baseLifo::m_maxNumberOfBuffers ) { int bufferCount = baseLifo::m_bufferCount; - auto cuda_event = m_popFromDeviceEvents[bufferCount].try_get< camp::resources::CudaEvent >(); - if( cuda_event ) cudaEventSynchronize( cuda_event->getCudaEvent_t() ); + m_popFromDeviceEvents[bufferCount].wait(); } } diff --git a/src/coreComponents/common/unitTests/testLifoStorage.cpp b/src/coreComponents/common/unitTests/testLifoStorage.cpp index b2dfced38ff..3890f6bc468 100644 --- a/src/coreComponents/common/unitTests/testLifoStorage.cpp +++ b/src/coreComponents/common/unitTests/testLifoStorage.cpp @@ -29,7 +29,7 @@ template< typename > struct RAJAHelper {}; -using serialPolicy = RAJA::loop_exec; +using serialPolicy = RAJA::seq_exec; template<> struct RAJAHelper< serialPolicy > @@ -153,23 +153,9 @@ void testLifoStorageAsync( int elemCnt, int numberOfElementsOnDevice, int number } -TEST( LifoStorageTest, LifoStorageBufferOnHost ) -{ - testLifoStorage< local::serialPolicy >( 10, 2, 3, 10 ); -} - -TEST( LifoStorageTest, LifoStorageBufferOnHostNoDeviceBuffer ) -{ - testLifoStorage< local::serialPolicy >( 10, 0, 3, 10 ); -} - -TEST( LifoStorageTest, LifoStorageAsyncBufferOnHost ) -{ - testLifoStorageAsync< local::serialPolicy >( 10, 2, 3, 10 ); -} - #ifdef GEOS_USE_CUDA +// running tests on GPUs TEST( LifoStorageTest, LifoStorageBufferOnCUDA ) { testLifoStorage< local::devicePolicy< 32 > >( 10, 2, 3, 10 ); @@ -205,6 +191,24 @@ TEST( LifoStorageTest, LifoStorageAsyncBufferOnCUDA ) { testLifoStorageAsync< local::devicePolicy< 32 > >( 10, 2, 3, 10 ); } + +#else +// running tests on CPUs +TEST( LifoStorageTest, LifoStorageBufferOnHost ) +{ + testLifoStorage< local::serialPolicy >( 10, 2, 3, 10 ); +} + +TEST( LifoStorageTest, LifoStorageBufferOnHostNoDeviceBuffer ) +{ + testLifoStorage< local::serialPolicy >( 10, 0, 3, 10 ); +} + +TEST( LifoStorageTest, LifoStorageAsyncBufferOnHost ) +{ + testLifoStorageAsync< local::serialPolicy >( 10, 2, 3, 10 ); +} + #endif } From 613914920a2e6e7029fce479369f2a3ea1c84c1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Jun 2024 23:46:16 -0700 Subject: [PATCH 110/286] Bump the github-actions group across 1 directory with 3 updates (#3186) Bumps the github-actions group with 3 updates in the / directory: [actions/checkout](https://github.com/actions/checkout), [google-github-actions/auth](https://github.com/google-github-actions/auth) and [codecov/codecov-action](https://github.com/codecov/codecov-action). Updates `actions/checkout` from 4.1.1 to 4.1.7 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4.1.1...v4.1.7) Updates `google-github-actions/auth` from 2.1.2 to 2.1.3 - [Release notes](https://github.com/google-github-actions/auth/releases) - [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md) - [Commits](https://github.com/google-github-actions/auth/compare/v2.1.2...v2.1.3) Updates `codecov/codecov-action` from 4.3.1 to 4.5.0 - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4.3.1...v4.5.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: google-github-actions/auth dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Randolph Settgast --- .github/workflows/build_and_test.yml | 6 +++--- .github/workflows/ci_tests.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index c345222e11c..aee70cdf5da 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -92,7 +92,7 @@ jobs: ls -la ./ - name: Checkout Repository - uses: actions/checkout@v4.1.4 + uses: actions/checkout@v4.1.7 with: submodules: true lfs: ${{ inputs.BUILD_TYPE == 'integrated_tests' }} @@ -100,7 +100,7 @@ jobs: - id: 'auth' if: ${{ inputs.GCP_BUCKET || inputs.USE_SCCACHE }} - uses: 'google-github-actions/auth@v2.1.2' + uses: 'google-github-actions/auth@v2.1.3' with: credentials_json: '${{ secrets.GOOGLE_CLOUD_GCP }}' create_credentials_file: true @@ -312,7 +312,7 @@ jobs: - name: Upload coverage to Codecov if: inputs.CODE_COVERAGE - uses: codecov/codecov-action@v4.3.1 + uses: codecov/codecov-action@v4.5.0 with: files: ${GITHUB_WORKSPACE}/geos_coverage.info.cleaned fail_ci_if_error: true diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index d0d60dcde4e..27517eb59e8 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -41,7 +41,7 @@ jobs: # The TPL tag is contained in the codespaces configuration to avoid duplications. - name: Checkout .devcontainer/devcontainer.json - uses: actions/checkout@v4.1.4 + uses: actions/checkout@v4.1.7 with: sparse-checkout: | .devcontainer/devcontainer.json @@ -77,7 +77,7 @@ jobs: # The integrated test submodule repository contains large data (using git lfs). # To save time (and money) we do not let Github Actions automatically clone all our (lfs) subrepositories and do it by hand. - name: Checkout Repository - uses: actions/checkout@v4.1.4 + uses: actions/checkout@v4.1.7 with: # Let script update submodules; Github Actions submodule history causes error submodules: false @@ -212,7 +212,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout Repository - uses: actions/checkout@v4.1.1 + uses: actions/checkout@v4.1.7 with: submodules: false lfs: false From bfcfe81172e100454e82d55643df461b6f42b0be Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 25 Jun 2024 11:27:53 -0500 Subject: [PATCH 111/286] Decouple debug matrix output from logLevel (#3181) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 ++++ .../physicsSolvers/SolverBase.cpp | 36 +++++++++++++------ .../physicsSolvers/SolverBase.hpp | 5 ++- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index acefad5afc8..be18a2b5b74 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3142-5705-ebdd3cb + baseline: integratedTests/baseline_integratedTests-pr3181-5732-efea721 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 520d0c506d7..b6d0b947336 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,10 +6,16 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3181 (2024-06-25) +====================== +Decouple debug matrix output from logLevel. Rebaseline because of the new input flag. + + PR #3142 (2024-06-20) ====================== Adding output of total strain. Rebaseline because of new inclusion of strain in output. + PR #3170 (2024-06-19) ====================== Fix tutorial example for thermal debonding wellbore problem. Test case modified. diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index bc1034d523f..18fe7b4a680 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -89,6 +89,12 @@ SolverBase::SolverBase( string const & name, setRestartFlags( RestartFlags::WRITE_AND_READ ). setDescription( "Initial time-step value required by the solver to the event manager." ); + registerWrapper( viewKeyStruct::writeLinearSystemString(), &m_writeLinearSystem ). + setApplyDefaultValue( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setRestartFlags( RestartFlags::WRITE_AND_READ ). + setDescription( "Write matrix, rhs, solution to screen ( = 1) or file ( = 2)." ); + registerGroup( groupKeyStruct::linearSolverParametersString(), &m_linearSolverParameters ); registerGroup( groupKeyStruct::nonlinearSolverParametersString(), &m_nonlinearSolverParameters ); registerGroup( groupKeyStruct::solverStatisticsString(), &m_solverStatistics ); @@ -1002,13 +1008,13 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, // Solve the linear system solveLinearSystem( m_dofManager, m_matrix, m_rhs, m_solution ); - } - // Increment the solver statistics for reporting purposes - m_solverStatistics.logNonlinearIteration( m_linearSolverResult.numIterations ); + // Increment the solver statistics for reporting purposes + m_solverStatistics.logNonlinearIteration( m_linearSolverResult.numIterations ); - // Output the linear system solution for debugging purposes - debugOutputSolution( time_n, cycleNumber, newtonIter, m_solution ); + // Output the linear system solution for debugging purposes + debugOutputSolution( time_n, cycleNumber, newtonIter, m_solution ); + } { Timer timer( m_timers["apply solution"] ); @@ -1163,14 +1169,18 @@ void SolverBase::debugOutputSystem( real64 const & time, ParallelMatrix const & matrix, ParallelVector const & rhs ) const { + // special case when flag value > 2 + if( m_writeLinearSystem > 2 && cycleNumber < m_writeLinearSystem ) + return; + debugOutputLAObject( matrix, time, cycleNumber, nonlinearIteration, getName() + "_mat", "System matrix", - getLogLevel() == 2, - getLogLevel() >= 3 ); + m_writeLinearSystem == 1, + m_writeLinearSystem >= 2 ); debugOutputLAObject( rhs, time, @@ -1178,8 +1188,8 @@ void SolverBase::debugOutputSystem( real64 const & time, nonlinearIteration, getName() + "_rhs", "System right-hand side", - getLogLevel() == 2, - getLogLevel() >= 3 ); + m_writeLinearSystem == 1, + m_writeLinearSystem >= 2 ); } void SolverBase::debugOutputSolution( real64 const & time, @@ -1187,14 +1197,18 @@ void SolverBase::debugOutputSolution( real64 const & time, integer const nonlinearIteration, ParallelVector const & solution ) const { + // special case when flag value > 2 + if( m_writeLinearSystem > 2 && cycleNumber < m_writeLinearSystem ) + return; + debugOutputLAObject( solution, time, cycleNumber, nonlinearIteration, getName() + "_sol", "System solution", - getLogLevel() == 2, - getLogLevel() >= 3 ); + m_writeLinearSystem == 1, + m_writeLinearSystem >= 2 ); } real64 diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index 7c47c07639d..b301eea8bd1 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -584,7 +584,7 @@ class SolverBase : public ExecutableGroup static constexpr char const * discretizationString() { return "discretization"; } static constexpr char const * targetRegionsString() { return "targetRegions"; } static constexpr char const * meshTargetsString() { return "meshTargets"; } - + static constexpr char const * writeLinearSystemString() { return "writeLinearSystem"; } }; struct groupKeyStruct @@ -804,6 +804,9 @@ class SolverBase : public ExecutableGroup /// Custom preconditioner for the "native" iterative solver std::unique_ptr< PreconditionerBase< LAInterface > > m_precond; + /// flag for debug output of matrix, rhs, and solution + integer m_writeLinearSystem; + /// Linear solver parameters LinearSolverParametersInput m_linearSolverParameters; From f05008b8564757aefcc19a4307c6edea6b9e7097 Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Wed, 26 Jun 2024 16:37:21 -0500 Subject: [PATCH 112/286] Implement stability test (#3136) --- .../constitutive/CMakeLists.txt | 1 + .../docs/CompositionalMultiphaseFluid.rst | 119 +++- .../compositional/functions/StabilityTest.hpp | 233 +++++++ .../constitutive/unitTests/CMakeLists.txt | 4 +- .../unitTests/testStabilityTest2Comp.cpp | 142 ++++ .../unitTests/testStabilityTest9Comp.cpp | 631 ++++++++++++++++++ 6 files changed, 1127 insertions(+), 3 deletions(-) create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp create mode 100644 src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp create mode 100644 src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index f75dd705d84..fad11918dca 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -67,6 +67,7 @@ set( constitutive_headers fluid/multifluid/compositional/functions/KValueInitialization.hpp fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp fluid/multifluid/compositional/functions/RachfordRice.hpp + fluid/multifluid/compositional/functions/StabilityTest.hpp fluid/multifluid/compositional/models/ComponentProperties.hpp fluid/multifluid/compositional/models/CompositionalDensity.hpp fluid/multifluid/compositional/models/ConstantViscosity.hpp diff --git a/src/coreComponents/constitutive/docs/CompositionalMultiphaseFluid.rst b/src/coreComponents/constitutive/docs/CompositionalMultiphaseFluid.rst index 2f9d456835b..74f1b80ea41 100644 --- a/src/coreComponents/constitutive/docs/CompositionalMultiphaseFluid.rst +++ b/src/coreComponents/constitutive/docs/CompositionalMultiphaseFluid.rst @@ -8,12 +8,117 @@ Overview ========================= This model represents a full composition description of a multiphase multicomponent fluid. -Phase behavior is modeled by an Equation of State (EOS) and partitioning of components into -phases is computed based on instantaneous chemical equilibrium via a two- or three-phase flash. +Phase behavior is modeled by an equation of state (EOS) and partitioning of components into +phases is computed based on instantaneous chemical equilibrium via a two-phase flash. Each component (species) is characterized by molar weight and critical properties that serve as input parameters for the EOS. See `Petrowiki`_ for more information. +In this model the fluid is described by :math:`N_c` components with :math:`z_c` being the total +mole fraction of component :math:`c`. The fluid can partition into a liquid phase, denoted :math:`\ell`, +and a vapor phase denoted by :math:`v`. Therefore, by taking into account the molar phase component +fractions, (which is the fraction of the molar mass of phase :math:`p` represented by component +:math:`c`), the following partition matrix establishes the component distribution within the two +phases: + +.. math:: + \begin{bmatrix} + x_{1} & x_{2} & x_{3} & \cdots & x_{N_c} \\ + y_{1} & y_{2} & y_{3} & \cdots & y_{N_c} \\ + \end{bmatrix} + +where :math:`x_c` is the mole fraction of component :math:`c` in the liquid phase and :math:`y_c` +is the mole fraction of component :math:`c` in the vapor phase. + +The fluid properties are updated through the following steps: + +1) The phase fractions (:math:`\nu_p`) and phase component fractions (:math:`x_c` and :math:`y_c`) are +computed as a function of pressure (:math:`p`), temperature (:math:`T`) and total component fractions +(:math:`z_c`). + +2) The phase densities (:math:`\rho_p`) and phase viscosities (:math:`\mu_p`) are computed as a function +of pressure, temperature and the updated phase component fractions. + +After calculating the phase fractions, phase component fractions, phase densities, phase viscosities, +and their derivatives with respect to pressure, temperature, and component fractions, the +:ref:`CompositionalMultiphaseFlow` then moves on to assembling the accumulation and flux terms. + +Step 1: Computation of the phase fractions and phase component fractions (flash) +================================================================================ +Stability test +------------------------------- +The first step is to determine if the provided mixture with total molar fractions :math:`z_c` is stable +as a single phase at the current pressure :math:`p` and temperature :math:`T`. However, this can only +be confirmed through stability testing. + +The stability of a mixture is traditionally assessed using the Tangent Plane Distance (TPD) criterion +developed by Michelsen (1982a). This criterion states that a phase with composition :math:`z` is stable +at a specified pressure :math:`p` and temperature :math:`T` if and only if + +.. math:: + g(y) = \sum_{i=1}^{N_c}y_i\left(\ln y_i + \ln \phi_i(y) - \ln z_i - \ln \phi_i(z) \right) \geq 0 + +for any permissible trial composition :math:`y`, where :math:`\phi_i` denotes the fugacity +coefficient of component :math:`i`. + +To determine stability of the mixture this testing in initiated from a basic starting point, based on +Wilson K-values, to get both a lighter and a heavier trial mixture. The two trial mixtures are +calculated as :math:`y_i = z_i/K_i` and :math:`y_i = z_iK_i` where :math:`K_i` are defined by + +.. math:: + K_i = \frac{P_{ci}}{p}\exp\left( 5.37( 1 + \omega_i ) \left(1-\frac{T_{ci}}{T}\right)\right) + +where :math:`P_{ci}` and :math:`T_{ci}` are respectively, the critical pressure and temperature of +component :math:`i` and :math:`\omega_i` is the accentric factor of component :math:`i`. + +The stability problem is solved by observing that a necessary condition is that :math:`g(y)` must +be non-negative at all its stationary points. The stationarity criterion can be expressed as + +.. math:: + \ln y_i + \ln \phi_i(y) - h_i = k \hspace{1cm} i=1,2,3,\ldots,N_c + +where :math:`h_i = \ln z_i + \ln \phi_i(z)` is a constant parameter dependent on the feed composition +:math:`z` and :math:`k` is an undetermined constant. This constant can be further incorporated into +the equation by defining the unnormalized trial phase moles :math:`Y_i` as + +.. math:: + Y_i = \exp(-k)y_i + +which reduces the stationarity criterion to + +.. math:: + \ln Y_i + \ln \phi_i(y) - h_i = 0 + +with the mole fractions :math:`y_i` related to the trial phase moles :math:`Y_i` by + +.. math:: + y_i = Y_i/\sum_jY_j + +With the two starting mixtures, the stationarity condition is solved using successive substitution to +determine the stationary points. If both initial states converge to a solution which has :math:`g(y)\geq 0` +then the mixture is deemed to be stable, otherwise it is deemed unstable. + +Phase labeling +---------------------------------------- +Once it is confirmed that the fluid with composition :math:`z` is stable as a single phase at the current +pressure and temperature, it must be labeled as either 'liquid' or 'vapor'. This is necessary only to apply +the correct relative permeability function for calculating the phase's flow properties. The properties of the +fluid (density, viscosity) are unchanged by the assignment of the label. + +Determining the mixture's true critical point is the most rigorous method for labeling. It is however expensive +and may not always be necessary. As such, a simple correlation for pseudo-critical temperature is used and this +is expected to be sufficiently accurate for correct phase labeling, except under some specific conditions. + +The Li-correlation is a weighted average of the component critical temperatures and is used to determine the label +applied to the mixture. The Li pseudo-critical temperature is calcaulated as + +.. math:: + T_{cp} = \frac{\sum_{i=1}^{N_c}T_{ci}V_{ci}z_{i}}{\sum_{i=1}^{N_c}V_{ci}z_{i}} + +where :math:`V_{ci}` and :math:`T_{ci}` are respectively the critical volume and temperature of component +:math:`i`. This is compared to the current temperature :math:`T` such that if :math:`T_{cp} +References +========== + +- M. L. Michelsen, `The Isothermal Flash Problem. Part I. Stability. + `__, Fluid Phase Equilibria, + vol. 9.1, pp. 1-19, 1982a. + +- M. L. Michelsen, `The Isothermal Flash Problem. Part II. Phase-Split Calculation. + `__, Fluid Phase Equilibria, + vol. 9.1, pp. 21-40, 1982b. .. _Petrowiki: https://petrowiki.spe.org/Phase_behavior_in_reservoir_simulation#Equation-of-state_models diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp new file mode 100644 index 00000000000..8ddef572339 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp @@ -0,0 +1,233 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file StabilityTest.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_STABILITYTEST_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_STABILITYTEST_HPP_ + +#include "KValueInitialization.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" +#include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" +#include "constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +struct StabilityTest +{ +private: + static constexpr integer maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; +public: + /** + * @brief Perform a two-phase stability test + * @param[in] numComps number of components + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] composition composition of the mixture + * @param[in] componentProperties The compositional component properties + * @param[out] tangentPlaneDistance the minimum tangent plane distance (TPD) + * @param[out] kValues the k-values estimated from the stationary points + * @return a flag indicating that 2 stationary points have been found + */ + template< typename EOS_TYPE, integer USD1 > + GEOS_HOST_DEVICE + static bool compute( integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + real64 & tangentPlaneDistance, + arraySlice1d< real64 > const & kValues ) + { + constexpr integer numTrials = 2; // Trial compositions + stackArray1d< real64, maxNumComps > logFugacity( numComps ); + stackArray1d< real64, maxNumComps > normalizedComposition( numComps ); + stackArray2d< real64, numTrials *maxNumComps > trialComposition( numTrials, numComps ); + stackArray1d< real64, maxNumComps > logTrialComposition( numComps ); + stackArray1d< real64, maxNumComps > hyperplane( numComps ); // h-parameter + stackArray1d< integer, maxNumComps > availableComponents( numComps ); + + calculatePresentComponents( numComps, composition, availableComponents ); + auto const presentComponents = availableComponents.toSliceConst(); + + // Calculate the hyperplane parameter + // h_i = log( z_i ) + log( phi_i ) + for( integer ic = 0; ic < numComps; ++ic ) + { + hyperplane[ic] = 0.0; + } + EOS_TYPE::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + composition, + componentProperties, + logFugacity ); + for( integer const ic : presentComponents ) + { + hyperplane[ic] = LvArray::math::log( composition[ic] ) + logFugacity[ic]; + } + + // Initialise the trial compositions using Wilson k-Values + KValueInitialization::computeWilsonGasLiquidKvalue( numComps, + pressure, + temperature, + componentProperties, + kValues ); + + for( integer ic = 0; ic < numComps; ++ic ) + { + trialComposition( 0, ic ) = composition[ic] / kValues[ic]; + trialComposition( 1, ic ) = composition[ic] * kValues[ic]; + } + + integer numberOfStationaryPoints = 0; + tangentPlaneDistance = LvArray::NumericLimits< real64 >::max; + for( integer trialIndex = 0; trialIndex < numTrials; ++trialIndex ) + { + for( integer ic = 0; ic < numComps; ++ic ) + { + normalizedComposition[ic] = trialComposition( trialIndex, ic ); + } + normalizeComposition( numComps, normalizedComposition.toSlice() ); + EOS_TYPE::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + normalizedComposition.toSliceConst(), + componentProperties, + logFugacity ); + for( integer const ic : presentComponents ) + { + logTrialComposition[ic] = LvArray::math::log( trialComposition( trialIndex, ic ) ); + } + for( localIndex iterationCount = 0; iterationCount < MultiFluidConstants::maxSSIIterations; ++iterationCount ) + { + for( integer const ic : presentComponents ) + { + logTrialComposition[ic] = hyperplane[ic] - logFugacity[ic]; + trialComposition( trialIndex, ic ) = LvArray::math::exp( logTrialComposition[ic] ); + normalizedComposition[ic] = trialComposition( trialIndex, ic ); + } + normalizeComposition( numComps, normalizedComposition.toSlice() ); + EOS_TYPE::computeLogFugacityCoefficients( numComps, + pressure, + temperature, + normalizedComposition.toSliceConst(), + componentProperties, + logFugacity ); + real64 error = 0.0; + for( integer const ic : presentComponents ) + { + real64 const dG = logTrialComposition[ic] + logFugacity[ic] - hyperplane[ic]; + error += (dG*dG); + } + error = LvArray::math::sqrt( error ); + + if( error < MultiFluidConstants::fugacityTolerance ) + { + // Calculate modified tangent plane distance (Michelsen, 1982b) of trial composition relative to input composition + real64 tpd = 1.0; + for( integer const ic : presentComponents ) + { + tpd += trialComposition( trialIndex, ic ) * (logTrialComposition[ic] + logFugacity[ic] - hyperplane[ic] - 1.0); + } + if( tpd < tangentPlaneDistance ) + { + tangentPlaneDistance = tpd; + } + numberOfStationaryPoints++; + break; + } + } + } + if( numberOfStationaryPoints == numTrials ) + { + for( integer const ic : presentComponents ) + { + kValues[ic] = trialComposition( 1, ic ) / trialComposition( 0, ic ); + } + } + return numberOfStationaryPoints == numTrials; + } + +private: + /** + * @brief Calculate which components are present. + * @details Creates a list of indices whose components have non-zero mole fraction. + * @param[in] numComps number of components + * @param[in] composition the composition of the fluid + * @param[out] presentComponents the list of present components + * @return the number of present components + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static integer calculatePresentComponents( integer const numComps, + arraySlice1d< real64 const > const & composition, + stackArray1d< integer, maxNumComps > & presentComponents ) + { + // Check for machine-zero feed values + integer presentCount = 0; + for( integer ic = 0; ic < numComps; ++ic ) + { + if( MultiFluidConstants::epsilon < composition[ic] ) + { + presentComponents[presentCount++] = ic; + } + } + presentComponents.resize( presentCount ); + return presentCount; + } + + /** + * @brief Normalise a composition in place to ensure that the components add up to unity + * @param[in] numComps number of components + * @param[in/out] composition composition to be normalized + * @return the sum of the given values + */ + template< integer USD > + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static real64 normalizeComposition( integer const numComps, + arraySlice1d< real64, USD > const & composition ) + { + real64 totalMoles = 0.0; + for( integer ic = 0; ic < numComps; ++ic ) + { + totalMoles += composition[ic]; + } + GEOS_ASSERT( MultiFluidConstants::epsilon < totalMoles ); + real64 const oneOverTotalMoles = 1.0 / totalMoles; + for( integer ic = 0; ic < numComps; ++ic ) + { + composition[ic] *= oneOverTotalMoles; + } + return totalMoles; + } +}; + +} // namespace compositional + +} // namespace constitutive + +} // namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_STABILITYTEST_HPP_ diff --git a/src/coreComponents/constitutive/unitTests/CMakeLists.txt b/src/coreComponents/constitutive/unitTests/CMakeLists.txt index 2cd470b2e28..09f808eeb27 100644 --- a/src/coreComponents/constitutive/unitTests/CMakeLists.txt +++ b/src/coreComponents/constitutive/unitTests/CMakeLists.txt @@ -2,6 +2,7 @@ set( gtest_geosx_tests testCompositionalDensity.cpp testCompositionalProperties.cpp + testCubicEOS.cpp testDamageUtilities.cpp testDruckerPrager.cpp testElasticIsotropic.cpp @@ -12,7 +13,8 @@ set( gtest_geosx_tests testNegativeTwoPhaseFlash9Comp.cpp testParticleFluidEnums.cpp testPropertyConversions.cpp - testCubicEOS.cpp + testStabilityTest2Comp.cpp + testStabilityTest9Comp.cpp testRachfordRice.cpp ) set( dependencyList gtest blas lapack constitutive ${parallelDeps} ) diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp new file mode 100644 index 00000000000..ca3ceef354d --- /dev/null +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp @@ -0,0 +1,142 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" +#include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" + +using namespace geos::constitutive; +using namespace geos::constitutive::compositional; + +namespace geos +{ +namespace testing +{ + +static constexpr integer numComps = 2; + +using StabilityData = std::tuple< + real64 const, // pressure + real64 const, // temperature + real64 const, // CH4 mole fraction + real64 const // expected tangent plane distance + >; + +template< typename EOS_TYPE > +class StabilityTestTest2CompFixture : public ::testing::TestWithParam< StabilityData > +{ + static constexpr real64 relTol = 1.0e-5; + static constexpr real64 absTol = 1.0e-7; + +public: + StabilityTestTest2CompFixture() + : m_fluid( createFluid() ) + {} + + ~StabilityTestTest2CompFixture() = default; + + void testStability( StabilityData const & data ) + { + auto componentProperties = this->m_fluid->createKernelWrapper(); + + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + real64 const zCH4 = std::get< 2 >( data ); + real64 const expectedTangentPlaneDistance = std::get< 3 >( data ); + + stackArray1d< real64, numComps > composition( numComps ); + composition[0] = zCH4; + composition[1] = 1.0 - zCH4; + + real64 tangentPlaneDistance = LvArray::NumericLimits< real64 >::max; + stackArray1d< real64, numComps > kValues( numComps ); + + bool const stabilityStatus = StabilityTest::compute< EOS_TYPE >( numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + tangentPlaneDistance, + kValues.toSlice() ); + + // Expect this to succeed + ASSERT_EQ( stabilityStatus, true ); + + // Check the tanget plane distance + checkRelativeError( expectedTangentPlaneDistance, tangentPlaneDistance, relTol, absTol ); + } + +protected: + std::unique_ptr< TestFluid< numComps > > m_fluid{}; + +private: + static std::unique_ptr< TestFluid< numComps > > createFluid() + { + std::unique_ptr< TestFluid< numComps > > fluid = TestFluid< numComps >::create( {Fluid::C1, Fluid::C3} ); + fluid->setBinaryCoefficients( Feed< 1 >{ 0.1 } ); + return fluid; + } +}; + +using PengRobinson = StabilityTestTest2CompFixture< CubicEOSPhaseModel< PengRobinsonEOS > >; +using SoaveRedlichKwong = StabilityTestTest2CompFixture< CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; +TEST_P( PengRobinson, testStabilityTest ) +{ + testStability( GetParam() ); +} +TEST_P( SoaveRedlichKwong, testStabilityTest ) +{ + testStability( GetParam() ); +} + +//------------------------------------------------------------------------------- +// Data +//------------------------------------------------------------------------------- + +/* UNCRUSTIFY-OFF */ + +INSTANTIATE_TEST_SUITE_P( + StabilityTest, PengRobinson, + ::testing::Values( + StabilityData{ 1.00000e+06, 297.15, 0.2, 1.1102230e-16 }, + StabilityData{ 1.00000e+06, 353.15, 0.2, -2.2204460e-16 }, + StabilityData{ 5.00000e+06, 297.15, 0.2, -1.0438517e+00 }, + StabilityData{ 5.00000e+06, 353.15, 0.2, -2.0228439e-03 }, + StabilityData{ 2.00000e+07, 297.15, 0.2, -3.3306691e-16 }, + StabilityData{ 2.00000e+07, 353.15, 0.2, -6.6613381e-16 } + ) +); + +INSTANTIATE_TEST_SUITE_P( + StabilityTest, SoaveRedlichKwong, + ::testing::Values( + StabilityData{ 1.00000e+06, 297.15, 0.2, -2.2204460e-16 }, + StabilityData{ 1.00000e+06, 353.15, 0.2, -3.3306691e-16 }, + StabilityData{ 5.00000e+06, 297.15, 0.2, -1.0966021e+00 }, + StabilityData{ 5.00000e+06, 353.15, 0.2, -3.6652014e-03 }, + StabilityData{ 2.00000e+07, 297.15, 0.2, -2.4424907e-15 }, + StabilityData{ 2.00000e+07, 353.15, 0.2, -7.7715612e-16 } + ) +); + +/* UNCRUSTIFY-ON */ + +} // testing + +} // geos diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp new file mode 100644 index 00000000000..43a0a7f39f5 --- /dev/null +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp @@ -0,0 +1,631 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" +#include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" + +using namespace geos::constitutive; +using namespace geos::constitutive::compositional; + +namespace geos +{ +namespace testing +{ + +static constexpr integer numComps = 9; + +using FlashData = std::tuple< + real64 const, // pressure + real64 const, // temperature + Feed< numComps > const, // total composition + real64 const // expected tangent plane distance + >; + +template< typename EOS_TYPE > +class StabilityTestTest9CompFixture : public ::testing::TestWithParam< FlashData > +{ + static constexpr real64 relTol = 1.0e-5; + static constexpr real64 absTol = 1.0e-7; + static constexpr real64 tpdTol = MultiFluidConstants::fugacityTolerance; +public: + StabilityTestTest9CompFixture() + : m_fluid( createFluid() ) + {} + + ~StabilityTestTest9CompFixture() = default; + + void testStability( FlashData const & data ) + { + auto componentProperties = this->m_fluid->createKernelWrapper(); + + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > composition; + TestFluid< numComps >::createArray( composition, std::get< 2 >( data )); + + real64 const expectedTangentPlaneDistance = std::get< 3 >( data ); + + real64 tangentPlaneDistance = LvArray::NumericLimits< real64 >::max; + stackArray1d< real64, numComps > kValues( numComps ); + + bool const stabilityStatus = StabilityTest::compute< EOS_TYPE >( numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + tangentPlaneDistance, + kValues.toSlice() ); + + // Expect this to succeed + ASSERT_EQ( stabilityStatus, true ); + + // Check the tanget plane distance + checkRelativeError( expectedTangentPlaneDistance, tangentPlaneDistance, relTol, absTol ); + } + + void testFlash( FlashData const & data ) + { + auto componentProperties = this->m_fluid->createKernelWrapper(); + + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > composition; + TestFluid< numComps >::createArray( composition, std::get< 2 >( data )); + + real64 tangentPlaneDistance = LvArray::NumericLimits< real64 >::max; + stackArray2d< real64, numComps > kValues( 1, numComps ); + + StabilityTest::compute< EOS_TYPE >( numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + tangentPlaneDistance, + kValues[0] ); + + // Now perform the nagative flash + real64 vapourFraction = -1.0; + stackArray1d< real64, numComps > liquidComposition( numComps ); + stackArray1d< real64, numComps > vapourComposition( numComps ); + + bool const status = NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + kValues.toSlice(), + vapourFraction, + liquidComposition.toSlice(), + vapourComposition.toSlice() ); + + // Expect this to succeed + ASSERT_EQ( status, true ); + + constexpr real64 epsilon = MultiFluidConstants::epsilon; + real64 const V = vapourFraction; + real64 const L = 1.0 - V; + + // Check stability vs flash + if( tangentPlaneDistance < -tpdTol ) + { + // Unstable mixture: both L and V should be positive + ASSERT_GT( V, epsilon ); + ASSERT_GT( L, epsilon ); + } + else + { + // Stable mixture: one of L or V should be zero + ASSERT_TRUE( V < epsilon || L < epsilon ); + } + } + +protected: + std::unique_ptr< TestFluid< numComps > > m_fluid{}; +private: + static std::unique_ptr< TestFluid< numComps > > createFluid(); +}; + +template< typename EOS_TYPE > +std::unique_ptr< TestFluid< numComps > > StabilityTestTest9CompFixture< EOS_TYPE >::createFluid() +{ + std::unique_ptr< TestFluid< numComps > > fluid = TestFluid< numComps >::create( {0, 0, 0, 0, 0, 0, 0, 0, 0} ); + // Manually populate + TestFluid< numComps >::populateArray( fluid->criticalPressure, Feed< 9 >{73.8659e5, 33.9439e5, 46.0421e5, 48.8387e5, 42.4552e5, 37.47e5, 33.5892e5, 30.1037e5, 20.549e5} ); + TestFluid< numComps >::populateArray( fluid->criticalTemperature, Feed< 9 >{304.7, 126.2, 190.6, 305.43, 369.8, 419.5, 465.9, 507.5, 678.8} ); + TestFluid< numComps >::populateArray( fluid->criticalVolume, Feed< 9 >{9.3999e-05, 9.0001e-05, 9.7999e-05, 1.4800e-04, 2.0000e-04, 2.5800e-04, 3.1000e-04, 3.5100e-04, 6.8243e-04} ); + TestFluid< numComps >::populateArray( fluid->acentricFactor, Feed< 9 >{0.225, 0.04, 0.013, 0.0986, 0.1524, 0.1956, 0.2413, 0.299, 0.5618} ); + TestFluid< numComps >::populateArray( fluid->molecularWeight, Feed< 9 >{44.01e-3, 28.01e-3, 16.04e-3, 30.07e-3, 44.1e-3, 58.12e-3, 72.15e-3, 84e-3, 173e-3} ); + TestFluid< numComps >::populateArray( fluid->volumeShift, Feed< 9 >{ -0.04958, -0.136012, -0.1486264, -0.10863408, -0.08349872, -0.06331568, -0.04196464, -0.0150072, 0.0000 } ); + fluid->setBinaryCoefficients( Feed< 36 >{ + 1.0000e-02, + 0.0000e+00, 3.7320e-03, + 0.0000e+00, 1.0000e-02, 0.0000e+00, + 0.0000e+00, 1.0000e-02, 0.0000e+00, 0.0000e+00, + 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, + 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, + 1.0000e-02, 0.0000e+00, 2.8000e-02, 1.0000e-02, 1.0000e-02, 0.0000e+00, 0.0000e+00, + 1.0000e-02, 0.0000e+00, 4.5320e-02, 1.0000e-02, 1.0000e-02, 0.0000e+00, 0.0000e+00, 0.0000e+00 + } ); + return fluid; +} + +using PengRobinson = StabilityTestTest9CompFixture< CubicEOSPhaseModel< PengRobinsonEOS > >; +using SoaveRedlichKwong = StabilityTestTest9CompFixture< CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; +TEST_P( PengRobinson, testStabilityTest ) +{ + testStability( GetParam() ); +} +TEST_P( SoaveRedlichKwong, testStabilityTest ) +{ + testStability( GetParam() ); +} +TEST_P( PengRobinson, testStabilityWithFlash ) +{ + testFlash( GetParam() ); +} +TEST_P( SoaveRedlichKwong, testStabilityWithFlash ) +{ + testFlash( GetParam() ); +} + +//------------------------------------------------------------------------------- +// Data +//------------------------------------------------------------------------------- + +/* UNCRUSTIFY-OFF */ + +INSTANTIATE_TEST_SUITE_P( + StabilityTest, PengRobinson, + ::testing::Values( + FlashData(1.0e+05, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.668360e+03), + FlashData(1.0e+05, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.245873e+03), + FlashData(1.0e+05, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.881300e+01), + FlashData(1.0e+05, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.448854e+00), + FlashData(1.0e+05, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 0.000000e+00), + FlashData(1.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.507053e+00), + FlashData(1.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.731470e+00), + FlashData(1.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.384422e+02), + FlashData(1.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.459664e+01), + FlashData(1.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.775558e-17), + FlashData(5.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.004630e-01), + FlashData(5.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.575407e-01), + FlashData(5.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.677416e-01), + FlashData(5.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.922930e+00), + FlashData(5.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.455769e-03), + FlashData(1.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.477463e-01), + FlashData(1.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.779360e-01), + FlashData(1.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.512251e-01), + FlashData(1.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.680029e-01), + FlashData(1.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.019289e-02), + FlashData(5.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.304512e-15), + FlashData(5.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -4.440892e-16), + FlashData(5.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.436896e-16), + FlashData(5.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.220446e-16), + FlashData(5.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -4.996004e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.082467e-15), + FlashData(1.0e+08, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.415534e-15), + FlashData(1.0e+08, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.582068e-15), + FlashData(1.0e+08, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 3.608225e-16), + FlashData(1.0e+08, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.942890e-16), + FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.667936e+03), + FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.245689e+03), + FlashData(1.0e+05, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.881008e+01), + FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.448537e+00), + FlashData(1.0e+05, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 0.000000e+00), + FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.445375e+00), + FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.673207e+00), + FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.382509e+02), + FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.457261e+01), + FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 0.000000e+00), + FlashData(5.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -8.873231e-01), + FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.449008e-01), + FlashData(5.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.617734e-01), + FlashData(5.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.846717e+00), + FlashData(5.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -4.736791e-03), + FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.414763e-01), + FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.717543e-01), + FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.468894e-01), + FlashData(1.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.660116e-01), + FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.931470e-02), + FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.359224e-15), + FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 4.996004e-16), + FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.054712e-15), + FlashData(5.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.165734e-15), + FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 8.326673e-17), + FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.913536e-15), + FlashData(1.0e+08, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.137979e-15), + FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 5.273559e-16), + FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.275957e-15), + FlashData(1.0e+08, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 6.383782e-16), + FlashData(1.0e+05, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 3.330669e-16), + FlashData(1.0e+06, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440892e-16), + FlashData(5.0e+06, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+06, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(5.0e+06, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(1.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.332268e-15), + FlashData(1.0e+07, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(5.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.776357e-15), + FlashData(5.0e+07, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+07, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 3.330669e-16), + FlashData(5.0e+07, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(1.0e+08, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 4.440892e-16), + FlashData(1.0e+08, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 4.440892e-16), + FlashData(1.0e+08, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+08, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(1.0e+08, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -5.329071e-15), + FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 7.105427e-15), + FlashData(1.0e+05, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -8.881784e-16), + FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), + FlashData(1.0e+05, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), + FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 3.552714e-15), + FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -3.552714e-15), + FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -8.881784e-16), + FlashData(5.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -5.329071e-15), + FlashData(5.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 3.552714e-15), + FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -5.329071e-15), + FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(1.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.332268e-15), + FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 5.329071e-15), + FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), + FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(5.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 4.440892e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 5.329071e-15), + FlashData(1.0e+08, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(1.0e+08, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+05, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+05, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), + FlashData(1.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(1.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440892e-16), + FlashData(1.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), + FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.775558e-16), + FlashData(5.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.775558e-16), + FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.326673e-16), + FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 3.330669e-16), + FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.881784e-16), + FlashData(1.0e+08, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-16), + FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 7.771561e-16), + FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+05, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.704736e+01), + FlashData(1.0e+05, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.003960e+01), + FlashData(1.0e+05, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.110182e+01), + FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.167750e+01), + FlashData(1.0e+05, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.110223e-16), + FlashData(1.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -9.425147e-01), + FlashData(1.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.253370e+00), + FlashData(1.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.421698e+00), + FlashData(1.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.845663e+00), + FlashData(1.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -5.551115e-17), + FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.332268e-15), + FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.110223e-15), + FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -9.882070e-02), + FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.113573e-01), + FlashData(5.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.077533e-01), + FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.275158e-15), + FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-16), + FlashData(1.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 3.996803e-15), + FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.110223e-16), + FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.205757e-02), + FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 2.609024e-15), + FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.054712e-15), + FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.720046e-15), + FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.554312e-15), + FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.665335e-16), + FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.998401e-15), + FlashData(1.0e+08, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.720046e-15), + FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.276756e-15), + FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-16), + FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -6.661338e-16), + FlashData(1.0e+05, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+05, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(1.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(5.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(5.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(5.0e+06, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(1.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(1.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(1.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -6.661338e-16), + FlashData(5.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.330669e-16), + FlashData(5.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(1.0e+08, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.881784e-16), + FlashData(1.0e+08, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+08, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.330669e-16), + FlashData(1.0e+08, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16) + ) +); + +INSTANTIATE_TEST_SUITE_P( + StabilityTest, SoaveRedlichKwong, + ::testing::Values( + FlashData(1.0e+05, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.340952e+03), + FlashData(1.0e+05, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.523837e+03), + FlashData(1.0e+05, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.181331e+01), + FlashData(1.0e+05, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.678230e+00), + FlashData(1.0e+05, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.775558e-17), + FlashData(1.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.676592e+00), + FlashData(1.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.892215e+00), + FlashData(1.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.543862e+02), + FlashData(1.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.627522e+01), + FlashData(1.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 0.000000e+00), + FlashData(5.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.322679e-01), + FlashData(5.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.886802e-01), + FlashData(5.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.004309e+00), + FlashData(5.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.584734e+00), + FlashData(5.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.238911e-02), + FlashData(1.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.605851e-01), + FlashData(1.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.907913e-01), + FlashData(1.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.671620e-01), + FlashData(1.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.904301e-01), + FlashData(1.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.614633e-02), + FlashData(5.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.273559e-16), + FlashData(5.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.159340e-16), + FlashData(5.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 8.326673e-17), + FlashData(5.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.081668e-15), + FlashData(5.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.159340e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.110223e-15), + FlashData(1.0e+08, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.165734e-15), + FlashData(1.0e+08, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.551115e-16), + FlashData(1.0e+08, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 4.163336e-16), + FlashData(1.0e+08, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.383782e-16), + FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.340423e+03), + FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.523613e+03), + FlashData(1.0e+05, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.181013e+01), + FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.677900e+00), + FlashData(1.0e+05, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -8.326673e-17), + FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.611739e+00), + FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.831153e+00), + FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.541747e+02), + FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.624997e+01), + FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.551115e-17), + FlashData(5.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.183708e-01), + FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.753463e-01), + FlashData(5.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.976633e-01), + FlashData(5.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.515763e+00), + FlashData(5.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.164655e-02), + FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.538864e-01), + FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.842051e-01), + FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.624915e-01), + FlashData(1.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.880849e-01), + FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.514356e-02), + FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.415534e-15), + FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -7.494005e-16), + FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 9.159340e-16), + FlashData(5.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 9.436896e-16), + FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.942890e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -7.771561e-16), + FlashData(1.0e+08, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 1.387779e-16), + FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.828671e-16), + FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 1.193490e-15), + FlashData(1.0e+08, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.942890e-16), + FlashData(1.0e+05, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440892e-16), + FlashData(5.0e+06, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 4.440892e-16), + FlashData(5.0e+06, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+06, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.881784e-16), + FlashData(1.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 8.881784e-16), + FlashData(1.0e+07, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 6.661338e-16), + FlashData(1.0e+07, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(1.0e+07, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-15), + FlashData(5.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 4.440892e-16), + FlashData(5.0e+07, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440892e-16), + FlashData(5.0e+07, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+08, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 8.881784e-16), + FlashData(1.0e+08, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.776357e-15), + FlashData(1.0e+08, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -6.661338e-16), + FlashData(1.0e+08, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+08, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), + FlashData(1.0e+05, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 4.440892e-15), + FlashData(1.0e+05, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -3.552714e-15), + FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -4.440892e-15), + FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 8.881784e-16), + FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -2.664535e-15), + FlashData(5.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.421085e-14), + FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -5.329071e-15), + FlashData(5.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -8.881784e-16), + FlashData(5.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 8.881784e-16), + FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 8.881784e-15), + FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(1.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -8.881784e-16), + FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -8.881784e-16), + FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 8.881784e-15), + FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 3.552714e-15), + FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), + FlashData(5.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), + FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 4.440892e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 5.329071e-15), + FlashData(1.0e+08, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), + FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), + FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 8.881784e-16), + FlashData(1.0e+08, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+05, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), + FlashData(1.0e+05, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 3.330669e-16), + FlashData(1.0e+05, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+05, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.665335e-16), + FlashData(1.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), + FlashData(1.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), + FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), + FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.330669e-16), + FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-16), + FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), + FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440892e-16), + FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.330669e-16), + FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.326673e-16), + FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.885781e-16), + FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), + FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-16), + FlashData(1.0e+08, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-16), + FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.881784e-16), + FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), + FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), + FlashData(1.0e+05, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.685339e+01), + FlashData(1.0e+05, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.983114e+01), + FlashData(1.0e+05, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.069141e+01), + FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.232891e+01), + FlashData(1.0e+05, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.220446e-16), + FlashData(1.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -9.169123e-01), + FlashData(1.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.225912e+00), + FlashData(1.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.372920e+00), + FlashData(1.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.771453e+00), + FlashData(1.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.885781e-16), + FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 2.886580e-15), + FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 8.881784e-16), + FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -8.067043e-02), + FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.893772e-01), + FlashData(5.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.360564e-01), + FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.220446e-15), + FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.554312e-15), + FlashData(1.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-15), + FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 2.220446e-15), + FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.378407e-02), + FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.720046e-15), + FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.220446e-16), + FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.054712e-15), + FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -6.661338e-16), + FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 0.000000e+00), + FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.998401e-15), + FlashData(1.0e+08, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -6.106227e-16), + FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.720846e-15), + FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-16), + FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.330669e-16), + FlashData(1.0e+05, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+06, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(5.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(5.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(5.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(5.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(5.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(5.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -6.661338e-16), + FlashData(1.0e+08, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(1.0e+08, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+08, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+08, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00) + ) +); + +/* UNCRUSTIFY-ON */ + +} // testing + +} // geos From 399ec9d6eb8219e6e465cc5b774b64ac3a6c9900 Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Fri, 28 Jun 2024 11:45:08 -0500 Subject: [PATCH 113/286] Extend BLAS interface (#3173) --- .../interfaces/blaslapack/BlasLapackLA.cpp | 229 +++++++-- .../interfaces/blaslapack/BlasLapackLA.hpp | 79 ++- .../unitTests/CMakeLists.txt | 3 +- .../unitTests/testSolveLinearSystem.cpp | 455 ++++++++++++++++++ 4 files changed, 717 insertions(+), 49 deletions(-) create mode 100644 src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp index d05bbf8aef2..541a802861b 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp @@ -379,6 +379,151 @@ void matrixLeastSquaresSolutionSolve( arraySlice2d< real64, USD > const & A, GEOS_ERROR_IF( INFO != 0, "The algorithm computing matrix linear system failed to converge." ); } +template< int USD1, int USD2 > +GEOS_FORCE_INLINE +void matrixCopy( int const N, + int const M, + arraySlice2d< real64, USD1 > const & A, + arraySlice2d< real64, USD2 > const & B ) +{ + for( int i = 0; i < N; i++ ) + { + for( int j = 0; j < M; j++ ) + { + B( i, j ) = A( i, j ); + } + } +} + +template< int USD > +GEOS_FORCE_INLINE +void matrixTranspose( int const N, + arraySlice2d< real64, USD > const & A ) +{ + for( int i = 0; i < N; i++ ) + { + for( int j = i+1; j < N; j++ ) + { + std::swap( A( i, j ), A( j, i ) ); + } + } +} + +template< typename T, int USD > +void solveLinearSystem( arraySlice2d< T, USD > const & A, + arraySlice2d< real64 const, USD > const & B, + arraySlice2d< real64, USD > const & X ) +{ + // --- Check that source matrix is square + int const N = LvArray::integerConversion< int >( A.size( 0 ) ); + GEOS_ASSERT_MSG( N > 0 && + N == A.size( 1 ), + "Matrix must be square" ); + + // --- Check that rhs B has appropriate dimensions + GEOS_ASSERT_MSG( B.size( 0 ) == N, + "right-hand-side matrix has wrong dimensions" ); + int const M = LvArray::integerConversion< int >( B.size( 1 ) ); + + // --- Check that solution X has appropriate dimensions + GEOS_ASSERT_MSG( X.size( 0 ) == N && + X.size( 1 ) == M, + "solution matrix has wrong dimensions" ); + + // --- Check that everything is contiguous + GEOS_ASSERT_MSG( A.isContiguous(), "Matrix is not contiguous" ); + GEOS_ASSERT_MSG( B.isContiguous(), "right-hand-side matrix is not contiguous" ); + GEOS_ASSERT_MSG( X.isContiguous(), "solution matrix is not contiguous" ); + + real64 * matrixData = nullptr; + array2d< real64 > LU; // Space for LU-factors + if constexpr ( !std::is_const< T >::value ) + { + matrixData = A.dataIfContiguous(); + } + else + { + LU.resize( N, N ); + matrixData = LU.data(); + // Direct copy here ignoring permutation + int const INCX = 1; + int const INCY = 1; + int const K = LvArray::integerConversion< int >( A.size( ) ); + GEOS_dcopy( &K, A.dataIfContiguous(), &INCX, matrixData, &INCY ); + } + + array1d< int > IPIV( N ); + int INFO; + char const TRANS = (USD == MatrixLayout::ROW_MAJOR) ? 'T' : 'N'; + + GEOS_dgetrf( &N, &N, matrixData, &N, IPIV.data(), &INFO ); + + GEOS_ASSERT_MSG( INFO == 0, "LAPACK dgetrf error code: " << INFO ); + + if constexpr ( std::is_const< T >::value ) + { + int const INCX = 1; + int const INCY = 1; + int const K = LvArray::integerConversion< int >( B.size( ) ); + GEOS_dcopy( &K, B.dataIfContiguous(), &INCX, X.dataIfContiguous(), &INCY ); + } + + // For row-major form, we need to reorder into col-major form + // This might require an extra allocation + real64 * solutionData = X.dataIfContiguous(); + array2d< real64, MatrixLayout::COL_MAJOR_PERM > X0; + if constexpr ( USD == MatrixLayout::ROW_MAJOR ) + { + if( 1 < M && M == N ) + { + // Square case: swap in place + matrixTranspose( N, X ); + } + else if( 1 < M ) + { + X0.resize( N, M ); + matrixCopy( N, M, X, X0.toSlice() ); + solutionData = X0.data(); + } + } + + GEOS_dgetrs( &TRANS, &N, &M, matrixData, &N, IPIV.data(), solutionData, &N, &INFO ); + + GEOS_ASSERT_MSG( INFO == 0, "LAPACK dgetrs error code: " << INFO ); + + if constexpr ( USD == MatrixLayout::ROW_MAJOR ) + { + if( 1 < M && M == N ) + { + // Square case: swap in place + matrixTranspose( N, X ); + } + else if( 1 < M ) + { + matrixCopy( N, M, X0.toSlice(), X ); + } + } +} + +template< typename T, int USD > +void solveLinearSystem( arraySlice2d< T, USD > const & A, + arraySlice1d< real64 const > const & b, + arraySlice1d< real64 > const & x ) +{ + // --- Check that b and x have the same size + int const N = LvArray::integerConversion< int >( b.size( 0 ) ); + GEOS_ASSERT_MSG( 0 < N && x.size() == N, + "right-hand-side and/or solution has wrong dimensions" ); + + // Create 2d slices + int const dims[2] = {N, 1}; + int const strides[2] = {1, 1}; + arraySlice2d< real64 const, USD > B( b.dataIfContiguous(), dims, strides ); + arraySlice2d< real64, USD > X( x.dataIfContiguous(), dims, strides ); + + solveLinearSystem( A, B, X ); +} + } // namespace detail real64 BlasLapackLA::determinant( arraySlice2d< real64 const, MatrixLayout::ROW_MAJOR > const & A ) @@ -885,60 +1030,56 @@ void BlasLapackLA::matrixEigenvalues( MatRowMajor< real64 const > const & A, matrixEigenvalues( AT.toSliceConst(), lambda ); } -void BlasLapackLA::solveLinearSystem( MatColMajor< real64 const > const & A, - arraySlice1d< real64 const > const & rhs, - arraySlice1d< real64 > const & solution ) +void BlasLapackLA::solveLinearSystem( MatRowMajor< real64 const > const & A, + Vec< real64 const > const & rhs, + Vec< real64 > const & solution ) { - // --- Check that source matrix is square - int const NN = LvArray::integerConversion< int >( A.size( 0 )); - GEOS_ASSERT_MSG( NN > 0 && - NN == A.size( 1 ), - "Matrix must be square" ); - - // --- Check that rhs and solution have appropriate dimension - GEOS_ASSERT_MSG( rhs.size( 0 ) == NN, - "right-hand-side vector has wrong dimensions" ); - - GEOS_ASSERT_MSG( solution.size( 0 ) == NN, - "solution vector has wrong dimensions" ); - - array1d< int > IPIV; - IPIV.resize( NN ); - int const NRHS = 1; // we only allow for 1 rhs vector. - int INFO; - - // make a copy of A, since dgeev destroys contents - array2d< real64, MatrixLayout::COL_MAJOR_PERM > ACOPY( A.size( 0 ), A.size( 1 ) ); - BlasLapackLA::matrixCopy( A, ACOPY ); - - // copy the rhs in the solution vector - BlasLapackLA::vectorCopy( rhs, solution ); - - GEOS_dgetrf( &NN, &NN, ACOPY.data(), &NN, IPIV.data(), &INFO ); + detail::solveLinearSystem( A, rhs, solution ); +} - GEOS_ASSERT_MSG( INFO == 0, "LAPACK dgetrf error code: " << INFO ); +void BlasLapackLA::solveLinearSystem( MatColMajor< real64 const > const & A, + Vec< real64 const > const & rhs, + Vec< real64 > const & solution ) +{ + detail::solveLinearSystem( A, rhs, solution ); +} - GEOS_dgetrs( "N", &NN, &NRHS, ACOPY.data(), &NN, IPIV.data(), solution.dataIfContiguous(), &NN, &INFO ); +void BlasLapackLA::solveLinearSystem( MatRowMajor< real64 > const & A, + Vec< real64 > const & rhs ) +{ + detail::solveLinearSystem( A, rhs.toSliceConst(), rhs ); +} - GEOS_ASSERT_MSG( INFO == 0, "LAPACK dgetrs error code: " << INFO ); +void BlasLapackLA::solveLinearSystem( MatColMajor< real64 > const & A, + Vec< real64 > const & rhs ) +{ + detail::solveLinearSystem( A, rhs.toSliceConst(), rhs ); } void BlasLapackLA::solveLinearSystem( MatRowMajor< real64 const > const & A, - arraySlice1d< real64 const > const & rhs, - arraySlice1d< real64 > const & solution ) + MatRowMajor< real64 const > const & rhs, + MatRowMajor< real64 > const & solution ) { - array2d< real64, MatrixLayout::COL_MAJOR_PERM > AT( A.size( 0 ), A.size( 1 ) ); + detail::solveLinearSystem( A, rhs, solution ); +} - // convert A to a column major format - for( int i = 0; i < A.size( 0 ); ++i ) - { - for( int j = 0; j < A.size( 1 ); ++j ) - { - AT( i, j ) = A( i, j ); - } - } +void BlasLapackLA::solveLinearSystem( MatColMajor< real64 const > const & A, + MatColMajor< real64 const > const & rhs, + MatColMajor< real64 > const & solution ) +{ + detail::solveLinearSystem( A, rhs, solution ); +} + +void BlasLapackLA::solveLinearSystem( MatRowMajor< real64 > const & A, + MatRowMajor< real64 > const & rhs ) +{ + detail::solveLinearSystem( A, rhs.toSliceConst(), rhs ); +} - solveLinearSystem( AT.toSliceConst(), rhs, solution ); +void BlasLapackLA::solveLinearSystem( MatColMajor< real64 > const & A, + MatColMajor< real64 > const & rhs ) +{ + detail::solveLinearSystem( A, rhs.toSliceConst(), rhs ); } void BlasLapackLA::matrixLeastSquaresSolutionSolve( arraySlice2d< real64 const, MatrixLayout::ROW_MAJOR > const & A, diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp index adc72007e49..488ed59a9b9 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp @@ -30,6 +30,7 @@ namespace geos * \class BlasLapackLA * \brief This class contains a collection of BLAS and LAPACK linear * algebra operations for GEOSX array1d and array2d + * \warning These methods are currently not supported on GPUs */ struct BlasLapackLA { @@ -454,18 +455,88 @@ struct BlasLapackLA * @param [in] rhs GEOSX array1d. * @param [out] solution GEOSX array1d. */ + static void solveLinearSystem( MatColMajor< real64 const > const & A, + Vec< real64 const > const & rhs, + Vec< real64 > const & solution ); + + /** + * @copydoc solveLinearSystem( MatColMajor const &, Vec< real64 const > const &, Vec< real64 const > const & ) + */ static void solveLinearSystem( MatRowMajor< real64 const > const & A, Vec< real64 const > const & rhs, Vec< real64 > const & solution ); /** - * @copydoc solveLinearSystem( MatRowMajor const &, Vec< real64 const > const &, Vec< real64 const > const & ) + * @brief Solves the linear system ; + * \p A \p solution = \p rhs. + * + * @details The method is intended for the solution of a small dense linear system. + * This solves the system in-place without allocating extra memory for the matrix or the solution. This means + * that at on exit the matrix is modified replaced by the LU factors and the right hand side vector is + * replaced by the solution. + * It employs lapack method dgetr. + * + * @param [in/out] A GEOSX array2d. The matrix. On exit this will be replaced by the factorisation of A + * @param [in/out] rhs GEOSX array1d. The right hand side. On exit this will be the solution + */ + static void solveLinearSystem( MatColMajor< real64 > const & A, + Vec< real64 > const & rhs ); + + /** + * @copydoc solveLinearSystem( MatColMajor< real64 > const &, Vec< real64 > const & ) + */ + static void solveLinearSystem( MatRowMajor< real64 > const & A, + Vec< real64 > const & rhs ); + + /** + * @brief Solves the linear system ; + * \p A \p solution = \p rhs. + * + * @details The method is intended for the solution of a small dense linear system in which A is an NxN matrix, the + * right-hand-side and the solution are matrices of size NxM. + * It employs lapack method dgetr. * - * @note this function first applies a matrix permutation and then calls the row major version of the function. + * @param [in] A GEOSX array2d. + * @param [in] rhs GEOSX array2d. + * @param [out] solution GEOSX array2d. */ static void solveLinearSystem( MatColMajor< real64 const > const & A, - Vec< real64 const > const & rhs, - Vec< real64 > const & solution ); + MatColMajor< real64 const > const & rhs, + MatColMajor< real64 > const & solution ); + + /** + * @copydoc solveLinearSystem( MatColMajor< real64 const > const &, MatColMajor< real64 const > const &, MatColMajor< const > const & ) + * + * @note this function will allocate space to reorder the solution into column major form. + */ + static void solveLinearSystem( MatRowMajor< real64 const > const & A, + MatRowMajor< real64 const > const & rhs, + MatRowMajor< real64 > const & solution ); + + /** + * @brief Solves the linear system ; + * \p A \p solution = \p rhs. + * + * @details The method is intended for the solution of a small dense linear system in which A is an NxN matrix, the + * right-hand-side and the solution are matrices of size NxM. + * This solves the system in-place without allocating extra memory for the matrix or the solution. This means + * that at on exit the matrix is modified replaced by the LU factors and the right hand side vector is + * replaced by the solution. + * It employs lapack method dgetr. + * + * @param [in/out] A GEOSX array2d. The matrix. On exit this will be replaced by the factorisation of A + * @param [in/out] rhs GEOSX array1d. The right hand side. On exit this will be the solution + */ + static void solveLinearSystem( MatColMajor< real64 > const & A, + MatColMajor< real64 > const & rhs ); + + /** + * @copydoc solveLinearSystem( MatColMajor< real64 > const &, MatRowMajor< real64 > const & ) + * + * @note this function will allocate space to reorder the solution into column major form. + */ + static void solveLinearSystem( MatRowMajor< real64 > const & A, + MatRowMajor< real64 > const & rhs ); /** * @brief Vector copy; diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/CMakeLists.txt b/src/coreComponents/denseLinearAlgebra/unitTests/CMakeLists.txt index 1b7d0eefb3d..114dee90aac 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/CMakeLists.txt +++ b/src/coreComponents/denseLinearAlgebra/unitTests/CMakeLists.txt @@ -1,5 +1,6 @@ set( serial_tests - testBlasLapack.cpp ) + testBlasLapack.cpp + testSolveLinearSystem.cpp ) set( dependencyList gtest denseLinearAlgebra ) diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp new file mode 100644 index 00000000000..48cf7b65dc8 --- /dev/null +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp @@ -0,0 +1,455 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file testSolveLinearSystem.cpp + */ + +// Source includes +#include "denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp" + +#include "gtest/gtest.h" + +using namespace geos; + +constexpr int MAX_SIZE = 20; +constexpr real64 machinePrecision = 1.0e2 * LvArray::NumericLimits< real64 >::epsilon; + +// Test matrices +enum TestMatrixType +{ + LAPLACE, + SAMPLING, + GRCAR +}; + +template< TestMatrixType MATRIX_TYPE > +struct TestMatrix {}; + +template<> +struct TestMatrix< TestMatrixType::LAPLACE > +{ + template< int USD > + static void create( arraySlice2d< real64, USD > const & A ) + { + int const N = LvArray::integerConversion< int >( A.size( 0 ) ); + GEOS_ASSERT( 2 <= N ); + LvArray::forValuesInSlice( A, []( real64 & a ){ a = 0.0; } ); + for( int i = 0; i < N-1; i++ ) + { + A( i+1, i ) = -1.0; + A( i+1, i+1 ) = 2.0; + A( i, i+1 ) = -1.0; + } + A( 0, 0 ) = 2.0; + } +}; + +template<> +struct TestMatrix< TestMatrixType::SAMPLING > +{ + template< int USD > + static void create( arraySlice2d< real64, USD > const & A ) + { + int const N = LvArray::integerConversion< int >( A.size( 0 ) ); + GEOS_ASSERT( 2 <= N ); + + real64 minajj = LvArray::NumericLimits< real64 >::max; + for( int j = 1; j <= N; j++ ) + { + real64 ajj = 0.0; + for( int i = 1; i <= N; i++ ) + { + if( i != j ) + { + A( i-1, j-1 ) = static_cast< real64 >(i)/static_cast< real64 >(i-j); + ajj += A( i-1, j-1 ); + } + } + A( j-1, j-1 ) = ajj; + minajj = LvArray::math::min( ajj, minajj ); + } + for( int j = 0; j < N; j++ ) + { + A( j, j ) -= minajj; + } + } +}; + +template<> +struct TestMatrix< TestMatrixType::GRCAR > +{ + template< int USD > + static void create( arraySlice2d< real64, USD > const & A ) + { + int const N = LvArray::integerConversion< int >( A.size( 0 ) ); + GEOS_ASSERT( 4 < N ); + LvArray::forValuesInSlice( A, []( real64 & a ){ a = 0.0; } ); + for( int i = 0; i < N-1; i++ ) + { + A( i+1, i ) = -1.0; + } + for( int c = 0; c < 4; c++ ) + { + for( int i = 0; i < N-c; i++ ) + { + A( i, i+c ) = 1.0; + } + } + } +}; + +// Randomly reorder a matrix +template< int USD > +void random_permutation( arraySlice2d< real64, USD > const & A ) +{ + int const N = LvArray::integerConversion< int >( A.size( 0 ) ); + GEOS_ASSERT( 2 <= N ); + + StackArray< real64, 1, MAX_SIZE > ordering( N ); + BlasLapackLA::vectorRand( ordering.toSlice() ); + + for( int j = 0; j < N; j++ ) + { + int const i = static_cast< int >(ordering[j]*N); + if( i != j ) + { + for( int k = 0; k < N; ++k ) + { + std::swap( A( i, k ), A( j, k )); + } + } + } +} + +// Local naive matrix-vector multiply +template< int USD > +void matrix_vector_multiply( arraySlice2d< real64 const, USD > const & A, + arraySlice1d< real64 const > const & x, + arraySlice1d< real64 > const & b ) +{ + int const N = LvArray::integerConversion< int >( A.size( 0 ) ); + for( int i = 0; i < N; ++i ) + { + real64 bi = 0.0; + for( int j = 0; j < N; ++j ) + { + bi += A( i, j )*x( j ); + } + b( i ) = bi; + } +} + +// Local naive matrix-matrix multiply +template< int USD > +void matrix_matrix_multiply( arraySlice2d< real64 const, USD > const & A, + arraySlice2d< real64 const, USD > const & X, + arraySlice2d< real64, USD > const & B ) +{ + int const K = LvArray::integerConversion< int >( A.size( 1 ) ); + int const M = LvArray::integerConversion< int >( X.size( 0 ) ); + int const N = LvArray::integerConversion< int >( X.size( 1 ) ); + for( int i = 0; i < M; ++i ) + { + for( int j = 0; j < N; ++j ) + { + real64 bij = 0.0; + for( int k = 0; k < K; ++k ) + { + bij += A( i, k )*X( k, j ); + } + B( i, j ) = bij; + } + } +} + +template< typename MatrixType > +struct ArrayType {}; + +template<> +struct ArrayType< Array< real64, 2, MatrixLayout::COL_MAJOR_PERM > > +{ + using type = Array< real64, 1 >; +}; +template<> +struct ArrayType< Array< real64, 2, MatrixLayout::ROW_MAJOR_PERM > > +{ + using type = Array< real64, 1 >; +}; +template<> +struct ArrayType< StackArray< real64, 2, MAX_SIZE *MAX_SIZE, MatrixLayout::COL_MAJOR_PERM > > +{ + using type = StackArray< real64, 1, MAX_SIZE >; +}; +template<> +struct ArrayType< StackArray< real64, 2, MAX_SIZE *MAX_SIZE, MatrixLayout::ROW_MAJOR_PERM > > +{ + using type = StackArray< real64, 1, MAX_SIZE >; +}; + +template< typename MatrixType > +class LinearSolveFixture : public ::testing::Test +{ +public: + using VectorType = typename ArrayType< MatrixType >::type; +public: + LinearSolveFixture() = default; + ~LinearSolveFixture() override = default; + + template< TestMatrixType TEST_MATRIX, int N > + void test_matrix_vector_solve() const + { + static_assert( 1 < N && N <= MAX_SIZE ); + + MatrixType A( N, N ); + TestMatrix< TEST_MATRIX >::create( A.toSlice() ); + random_permutation( A.toSlice() ); + + VectorType b ( N ); + VectorType x ( N ); + VectorType x0 ( N ); + + // Save selected values of A to check later + real64 const a00 = A( 0, 0 ); + real64 const a01 = A( 0, 1 ); + real64 const a10 = A( N-1, N-2 ); + real64 const a11 = A( N-1, N-1 ); + + // Create actual solution + LvArray::forValuesInSlice( x0.toSlice(), []( real64 & a ){ a = 1.0; } ); + + // Multiply to get rhs + matrix_vector_multiply( A.toSliceConst(), x0.toSliceConst(), b.toSlice() ); + + // Save selected values of b to check later + real64 const b0 = b( 0 ); + real64 const b1 = b( N-1 ); + + // Solve + BlasLapackLA::solveLinearSystem( A.toSliceConst(), b.toSliceConst(), x.toSlice() ); + + // Check solution + for( int i = 0; i < N; ++i ) + { + EXPECT_NEAR( x( i ), x0( i ), machinePrecision ); + } + + // Check that we have not destroyed A + EXPECT_NEAR( A( 0, 0 ), a00, machinePrecision ); + EXPECT_NEAR( A( 0, 1 ), a01, machinePrecision ); + EXPECT_NEAR( A( N-1, N-2 ), a10, machinePrecision ); + EXPECT_NEAR( A( N-1, N-1 ), a11, machinePrecision ); + + // Check that we have not destroyed b + EXPECT_NEAR( b( 0 ), b0, machinePrecision ); + EXPECT_NEAR( b( N-1 ), b1, machinePrecision ); + } + + template< TestMatrixType TEST_MATRIX, int N > + void test_matrix_vector_solve_inplace( ) const + { + static_assert( 1 < N && N <= MAX_SIZE ); + + MatrixType A( N, N ); + TestMatrix< TEST_MATRIX >::create( A.toSlice() ); + random_permutation( A.toSlice() ); + + VectorType x ( N ); + VectorType x0 ( N ); + + // Create actual solution + LvArray::forValuesInSlice( x0.toSlice(), []( real64 & a ){ a = 1.0; } ); + + // Multiply to get rhs + matrix_vector_multiply( A.toSliceConst(), x0.toSliceConst(), x.toSlice() ); + + // Solve + BlasLapackLA::solveLinearSystem( A, x.toSlice() ); + + // Check in place + for( int i = 0; i < N; ++i ) + { + EXPECT_NEAR( x( i ), x0( i ), machinePrecision ); + } + } + + template< TestMatrixType TEST_MATRIX, int N, int M > + void test_matrix_matrix_solve( ) const + { + static_assert( 1 < N && N <= MAX_SIZE ); + static_assert( 1 <= M && M <= MAX_SIZE ); + + MatrixType A ( N, N ); + TestMatrix< TEST_MATRIX >::create( A.toSlice() ); + random_permutation( A.toSlice() ); + + MatrixType B ( N, M ); + MatrixType X ( N, M ); + MatrixType X0 ( N, M ); + + real64 const a00 = A( 0, 0 ); + real64 const a01 = A( 0, 1 ); + real64 const a10 = A( N-1, N-2 ); + real64 const a11 = A( N-1, N-1 ); + + // Create actual solution + // Populate matrix with random coefficients + BlasLapackLA::matrixRand( X0, + BlasLapackLA::RandomNumberDistribution::UNIFORM_m1p1 ); + + // Multiply to get rhs + matrix_matrix_multiply( A.toSliceConst(), X0.toSliceConst(), B.toSlice() ); + + // Save selected values of B to check later + real64 const b00 = B( 0, 0 ); + real64 const b01 = B( N-1, M-1 ); + + // Solve + BlasLapackLA::solveLinearSystem( A.toSliceConst(), B.toSliceConst(), X.toSlice() ); + + // Check + for( int i = 0; i < N; ++i ) + { + for( int j = 0; j < M; ++j ) + { + EXPECT_NEAR( X( i, j ), X0( i, j ), machinePrecision ); + } + } + + // Check that we have not destroyed A + EXPECT_NEAR( A( 0, 0 ), a00, machinePrecision ); + EXPECT_NEAR( A( 0, 1 ), a01, machinePrecision ); + EXPECT_NEAR( A( N-1, N-2 ), a10, machinePrecision ); + EXPECT_NEAR( A( N-1, N-1 ), a11, machinePrecision ); + + // Check that we have not destroyed b + EXPECT_NEAR( B( 0, 0 ), b00, machinePrecision ); + EXPECT_NEAR( B( N-1, M-1 ), b01, machinePrecision ); + } + + template< TestMatrixType TEST_MATRIX, int N, int M > + void test_matrix_matrix_solve_inplace( ) const + { + static_assert( 1 < N && N <= MAX_SIZE ); + static_assert( 1 <= M && M <= MAX_SIZE ); + + MatrixType A ( N, N ); + TestMatrix< TEST_MATRIX >::create( A.toSlice() ); + random_permutation( A.toSlice() ); + + MatrixType X ( N, M ); + MatrixType X0 ( N, M ); + + // Create actual solution + // Populate matrix with random coefficients + BlasLapackLA::matrixRand( X0, + BlasLapackLA::RandomNumberDistribution::UNIFORM_m1p1 ); + + // Multiply to get rhs + matrix_matrix_multiply( A.toSliceConst(), X0.toSliceConst(), X.toSlice() ); + + // Solve + BlasLapackLA::solveLinearSystem( A.toSlice(), X.toSlice() ); + + // Check + for( int i = 0; i < N; ++i ) + { + for( int j = 0; j < M; ++j ) + { + EXPECT_NEAR( X( i, j ), X0( i, j ), machinePrecision ); + } + } + } +}; + +using LinearSolveTypes = ::testing::Types< + Array< real64, 2, MatrixLayout::COL_MAJOR_PERM >, + Array< real64, 2, MatrixLayout::ROW_MAJOR_PERM >, + StackArray< real64, 2, MAX_SIZE *MAX_SIZE, MatrixLayout::COL_MAJOR_PERM >, + StackArray< real64, 2, MAX_SIZE *MAX_SIZE, MatrixLayout::ROW_MAJOR_PERM > >; + +class NameGenerator +{ +public: + template< typename T > + static std::string GetName( int ) + { + if constexpr (std::is_same_v< T, Array< real64, 2, MatrixLayout::COL_MAJOR_PERM > >) return "col-major-heap-array"; + if constexpr (std::is_same_v< T, Array< real64, 2, MatrixLayout::ROW_MAJOR_PERM > >) return "row-major-heap-array"; + if constexpr (std::is_same_v< T, StackArray< real64, 2, MAX_SIZE *MAX_SIZE, MatrixLayout::COL_MAJOR_PERM > >) return "col-major-stack-array"; + if constexpr (std::is_same_v< T, StackArray< real64, 2, MAX_SIZE *MAX_SIZE, MatrixLayout::ROW_MAJOR_PERM > >) return "row-major-stack-array"; + } +}; + +TYPED_TEST_SUITE( LinearSolveFixture, LinearSolveTypes, NameGenerator ); + +TYPED_TEST( LinearSolveFixture, matrix_vector_solve_laplace ) +{ + this->template test_matrix_vector_solve< TestMatrixType::LAPLACE, 5 >(); + this->template test_matrix_vector_solve_inplace< TestMatrixType::LAPLACE, 5 >(); + this->template test_matrix_vector_solve< TestMatrixType::LAPLACE, 12 >(); + this->template test_matrix_vector_solve_inplace< TestMatrixType::LAPLACE, 12 >(); +} + +TYPED_TEST( LinearSolveFixture, matrix_vector_solve_grcar ) +{ + this->template test_matrix_vector_solve< TestMatrixType::GRCAR, 6 >(); + this->template test_matrix_vector_solve_inplace< TestMatrixType::GRCAR, 6 >(); + this->template test_matrix_vector_solve< TestMatrixType::GRCAR, 10 >(); + this->template test_matrix_vector_solve_inplace< TestMatrixType::GRCAR, 10 >(); +} + +TYPED_TEST( LinearSolveFixture, matrix_vector_solve_sampling ) +{ + this->template test_matrix_vector_solve< TestMatrixType::SAMPLING, 3 >(); + this->template test_matrix_vector_solve_inplace< TestMatrixType::SAMPLING, 3 >(); + this->template test_matrix_vector_solve< TestMatrixType::SAMPLING, 20 >(); + this->template test_matrix_vector_solve_inplace< TestMatrixType::SAMPLING, 20 >(); +} + +TYPED_TEST( LinearSolveFixture, matrix_matrix_solve_laplace ) +{ + this->template test_matrix_matrix_solve< TestMatrixType::LAPLACE, 5, 1 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::LAPLACE, 5, 1 >(); + this->template test_matrix_matrix_solve< TestMatrixType::LAPLACE, 5, 3 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::LAPLACE, 5, 3 >(); + this->template test_matrix_matrix_solve< TestMatrixType::LAPLACE, 5, 5 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::LAPLACE, 5, 5 >(); + this->template test_matrix_matrix_solve< TestMatrixType::LAPLACE, 5, 12 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::LAPLACE, 5, 12 >(); +} + +TYPED_TEST( LinearSolveFixture, matrix_matrix_solve_grcar ) +{ + this->template test_matrix_matrix_solve< TestMatrixType::GRCAR, 5, 1 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::GRCAR, 5, 1 >(); + this->template test_matrix_matrix_solve< TestMatrixType::GRCAR, 5, 3 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::GRCAR, 5, 3 >(); + this->template test_matrix_matrix_solve< TestMatrixType::GRCAR, 5, 5 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::GRCAR, 5, 5 >(); + this->template test_matrix_matrix_solve< TestMatrixType::GRCAR, 5, 12 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::GRCAR, 5, 12 >(); +} + +TYPED_TEST( LinearSolveFixture, matrix_matrix_solve_sampling ) +{ + this->template test_matrix_matrix_solve< TestMatrixType::SAMPLING, 5, 1 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::SAMPLING, 5, 1 >(); + this->template test_matrix_matrix_solve< TestMatrixType::SAMPLING, 12, 3 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::SAMPLING, 5, 3 >(); + this->template test_matrix_matrix_solve< TestMatrixType::SAMPLING, 5, 5 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::SAMPLING, 5, 5 >(); + this->template test_matrix_matrix_solve< TestMatrixType::SAMPLING, 5, 12 >(); + this->template test_matrix_matrix_solve_inplace< TestMatrixType::SAMPLING, 5, 12 >(); +} From e5d8d9232b78577c5da419f251c9855441789922 Mon Sep 17 00:00:00 2001 From: Jacques Franc <49998870+jafranc@users.noreply.github.com> Date: Fri, 28 Jun 2024 22:03:35 +0200 Subject: [PATCH 114/286] Fix #3146 - Error in stat reduction for Function triggered `PeriodicEvent` (#3147) --- src/coreComponents/events/PeriodicEvent.cpp | 24 +++++++++++++++++-- src/coreComponents/functions/FunctionBase.cpp | 2 +- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/events/PeriodicEvent.cpp b/src/coreComponents/events/PeriodicEvent.cpp index 69261113cea..7c857fd79f6 100644 --- a/src/coreComponents/events/PeriodicEvent.cpp +++ b/src/coreComponents/events/PeriodicEvent.cpp @@ -173,8 +173,28 @@ void PeriodicEvent::checkOptionalFunctionThreshold( real64 const time, // (Note: this shouldn't occur very often, since it is only called if the base forecast <= 0) #ifdef GEOSX_USE_MPI real64 result_global; - MPI_Allreduce( &result, &result_global, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD ); - result = result_global; + switch( m_functionStatOption ) + { + case 0: + { + MPI_Allreduce( &result, &result_global, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD ); + result = result_global; + break; + } + case 1: + { + int nprocs; + MPI_Comm_size( MPI_COMM_WORLD, &nprocs ); + MPI_Allreduce( &result, &result_global, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD ); + result = result_global / nprocs; + break; + } + case 2: + { + MPI_Allreduce( &result, &result_global, 1, MPI_DOUBLE, MPI_MAX, MPI_COMM_WORLD ); + result = result_global; + } + } #endif } diff --git a/src/coreComponents/functions/FunctionBase.cpp b/src/coreComponents/functions/FunctionBase.cpp index 60268960f43..ce14852b501 100644 --- a/src/coreComponents/functions/FunctionBase.cpp +++ b/src/coreComponents/functions/FunctionBase.cpp @@ -64,7 +64,7 @@ real64_array FunctionBase::evaluateStats( dataRepository::Group const & group, { result[0] = std::min( result[0], sub[ii] ); result[1] += sub[ii]; - result[2] = std::max( result[0], sub[ii] ); + result[2] = std::max( result[2], sub[ii] ); } result[1] /= N; From 44efb98f522862d5d42234d48007140fd6ac0529 Mon Sep 17 00:00:00 2001 From: William R Tobin <4522899+wrtobin@users.noreply.github.com> Date: Fri, 28 Jun 2024 15:19:52 -0700 Subject: [PATCH 115/286] HDF5 Collective Operations Flags (#3177) * tweaking hdf5 fapl and access flags to use collective operations * hdf5 dataspace mpio collective access fix * barriers to avoid inconsistent file operations that rely too heavily on flocking --------- Co-authored-by: Randolph Settgast --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 8 ++- host-configs/LLNL/quartz-base.cmake | 2 +- .../Egg/deadOilEgg_base_iterative.xml | 20 +++---- .../fileIO/Outputs/TimeHistoryOutput.cpp | 9 ++- .../fileIO/timeHistory/BufferedHistoryIO.hpp | 17 ++++++ .../fileIO/timeHistory/HDFFile.cpp | 9 +-- .../fileIO/timeHistory/HDFHistoryIO.cpp | 58 ++++++++++++------- 8 files changed, 83 insertions(+), 42 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index be18a2b5b74..ca332e1557c 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3181-5732-efea721 + baseline: integratedTests/baseline_integratedTests-pr3177-5828-eabb935 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index b6d0b947336..1ece72c1943 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,11 +6,15 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3177 (2024-06-28) +====================== +Added logLevel to TimeHistoryOutput. Rebaseline because of the new input flag. + PR #3181 (2024-06-25) ====================== Decouple debug matrix output from logLevel. Rebaseline because of the new input flag. - + PR #3142 (2024-06-20) ====================== Adding output of total strain. Rebaseline because of new inclusion of strain in output. @@ -113,7 +117,7 @@ new field to store pressure gradient cell-wise. PR #3060 (2024-05-13) ====================== -Rebaselined after addition of elastic VTI wave propagator. +Rebaselined after addition of elastic VTI wave propagator. PR #4950 (2024-05-10) diff --git a/host-configs/LLNL/quartz-base.cmake b/host-configs/LLNL/quartz-base.cmake index 5501677af1c..25973d661e8 100644 --- a/host-configs/LLNL/quartz-base.cmake +++ b/host-configs/LLNL/quartz-base.cmake @@ -41,7 +41,7 @@ set(YAPF_EXECUTABLE /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/pyt set(SPHINX_EXECUTABLE /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/python/bin/sphinx-build CACHE PATH "" FORCE) -# caliper +# caliper set(ENABLE_CALIPER ON CACHE BOOL "" FORCE) set(ENABLE_CALIPER_HYPRE ON CACHE BOOL "" FORCE) diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_base_iterative.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_base_iterative.xml index c184564c650..56c2ade45d2 100644 --- a/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_base_iterative.xml +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_base_iterative.xml @@ -83,7 +83,7 @@ referenceElevation="20" targetBHP="9e7" targetTotalRate="8e-3" - injectionTemperature="297.15" + injectionTemperature="297.15" injectionStream="{ 0.0, 1.0 }"/> @@ -209,7 +209,7 @@ timeFrequency="7.5e6" targetExactTimestep="0" target="/Outputs/restartOutput"/> - + @@ -374,7 +374,7 @@ - + diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index 33a5d5dc0cc..6f6daec32cd 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -31,6 +31,8 @@ TimeHistoryOutput::TimeHistoryOutput( string const & name, m_recordCount( 0 ), m_io( ) { + enableLogLevelInput(); + registerWrapper( viewKeys::timeHistoryOutputTargetString(), &m_collectorPaths ). setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). setInputFlag( InputFlags::REQUIRED ). @@ -75,6 +77,7 @@ void TimeHistoryOutput::initCollectorParallel( DomainPartition const & domain, H } m_io.emplace_back( std::make_unique< HDFHistoryIO >( outputFile, metadata, m_recordCount ) ); + m_io.back()->setLogLevel( this->getLogLevel() ); hc.registerBufferProvider( collectorIdx, [this, idx = m_io.size() - 1]( localIndex count ) { m_io[idx]->updateCollectingCount( count ); @@ -84,12 +87,13 @@ void TimeHistoryOutput::initCollectorParallel( DomainPartition const & domain, H } }; - // FIXME Why stop (pseudo) recursion at one single level? registerBufferCalls( collector ); + MpiWrapper::barrier( MPI_COMM_GEOSX ); for( localIndex metaIdx = 0; metaIdx < collector.numMetaDataCollectors(); ++metaIdx ) { registerBufferCalls( collector.getMetaDataCollector( metaIdx ), collector.getTargetName() + " " ); + MpiWrapper::barrier( MPI_COMM_GEOSX ); } // Do the time output last so its at the end of the m_io list, since writes are parallel @@ -100,6 +104,7 @@ void TimeHistoryOutput::initCollectorParallel( DomainPartition const & domain, H { HistoryMetadata timeMetadata = collector.getTimeMetaData(); m_io.emplace_back( std::make_unique< HDFHistoryIO >( outputFile, timeMetadata, m_recordCount, 1, 2, MPI_COMM_SELF ) ); + m_io.back()->setLogLevel( this->getLogLevel() ); // We copy the back `idx` not to rely on possible future appends to `m_io`. collector.registerTimeBufferProvider( [this, idx = m_io.size() - 1]() { return m_io[idx]->getBufferHead(); } ); m_io.back()->init( !freshInit ); @@ -123,6 +128,7 @@ void TimeHistoryOutput::initializePostInitialConditionsPostSubGroups() } DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); + GEOS_LOG_LEVEL_BY_RANK( 3, GEOS_FMT( "TimeHistory: '{}' initializing data collectors.", this->getName() ) ); for( auto collectorPath : m_collectorPaths ) { try @@ -175,6 +181,7 @@ void TimeHistoryOutput::cleanup( real64 const time_n, DomainPartition & domain ) { execute( time_n, 0.0, cycleNumber, eventCounter, eventProgress, domain ); + MpiWrapper::barrier( MPI_COMM_GEOSX ); // remove any unused trailing space reserved to write additional histories for( auto & th_io : m_io ) { diff --git a/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp b/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp index e324803f463..0d2d93f2948 100644 --- a/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp +++ b/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp @@ -72,6 +72,23 @@ class BufferedHistoryIO * is a shortcut that should eventually be fixed by keeping this information in the HDF5 buffer. */ virtual localIndex getBufferedCount() = 0; + + /** + * @brief Get the log-level for BufferedHistoryIO classes + * @return the current log-level + */ + int getLogLevel() const { return m_logLevel; } + + /** + * @brief Set the log-level for BufferedHistoryIO classes + * @param[in] logLevel the log-level to set + */ + void setLogLevel( int logLevel ) { m_logLevel = logLevel; } + +private: + + /// the log-level + int m_logLevel = 0; }; } diff --git a/src/coreComponents/fileIO/timeHistory/HDFFile.cpp b/src/coreComponents/fileIO/timeHistory/HDFFile.cpp index eda9360f14c..6e5030aca0a 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFFile.cpp +++ b/src/coreComponents/fileIO/timeHistory/HDFFile.cpp @@ -29,12 +29,13 @@ HDFFile::HDFFile( string const & fnm, bool deleteExisting, bool parallelAccess, m_mpioFapl( parallelAccess ), m_comm( comm ) { - int rnk = MpiWrapper::commRank( comm ); -#ifdef GEOSX_USE_MPI + int rnk = MpiWrapper::commRank( m_comm ); if( m_mpioFapl ) { m_faplId = H5Pcreate( H5P_FILE_ACCESS ); H5Pset_fapl_mpio( m_faplId, m_comm, MPI_INFO_NULL ); + H5Pset_all_coll_metadata_ops( m_faplId, 1 ); + H5Pset_coll_metadata_write( m_faplId, 1 ); m_filename = fnm + ".hdf5"; } else @@ -42,10 +43,6 @@ HDFFile::HDFFile( string const & fnm, bool deleteExisting, bool parallelAccess, m_faplId = H5P_DEFAULT; m_filename = fnm + "." + std::to_string( rnk ) + ".hdf5"; } -#else - m_faplId = H5P_DEFAULT; - m_filename = fnm + ".hdf5"; -#endif // check if file already exists htri_t exists = 0; H5E_BEGIN_TRY diff --git a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp index 80a13dd4aa6..5e9bae2e5a0 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp +++ b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp @@ -197,43 +197,46 @@ void HDFHistoryIO::init( bool existsOkay ) // create a dataset in the file if needed, don't erase file if( subcomm != MPI_COMM_NULL ) { - - std::vector< hsize_t > historyFileDims( m_rank+1 ); - historyFileDims[0] = LvArray::integerConversion< hsize_t >( m_writeLimit ); - - std::vector< hsize_t > dimChunks( m_rank+1 ); - dimChunks[0] = 1; - - for( hsize_t dd = 1; dd < m_rank+1; ++dd ) - { - // hdf5 doesn't like chunk size 0, hence the subcomm - dimChunks[dd] = m_dims[dd-1]; - historyFileDims[dd] = m_dims[dd-1]; - } - dimChunks[1] = m_chunkSize; - historyFileDims[1] = LvArray::integerConversion< hsize_t >( m_globalIdxCount ); - + GEOS_LOG_LEVEL_BY_RANK( 3, GEOS_FMT( "TimeHistory: opening file {}.", m_filename ) ); HDFFile target( m_filename, false, true, subcomm ); + GEOS_LOG_LEVEL_BY_RANK( 3, GEOS_FMT( "TimeHistory: opened file {}.", m_filename ) ); bool inTarget = target.hasDataset( m_name ); if( !inTarget ) { - hid_t dcplId = 0; + std::vector< hsize_t > historyFileDims( m_rank+1 ); + historyFileDims[0] = LvArray::integerConversion< hsize_t >( m_writeLimit ); + std::vector< hsize_t > dimChunks( m_rank+1 ); + dimChunks[0] = 1; + for( hsize_t dd = 1; dd < m_rank+1; ++dd ) + { + // hdf5 doesn't like chunk size 0, hence the subcomm + dimChunks[dd] = m_dims[dd-1]; + historyFileDims[dd] = m_dims[dd-1]; + } + dimChunks[1] = m_chunkSize; + historyFileDims[1] = LvArray::integerConversion< hsize_t >( m_globalIdxCount ); std::vector< hsize_t > maxFileDims( historyFileDims ); // chunking is required to create an extensible dataset - dcplId = H5Pcreate( H5P_DATASET_CREATE ); + hid_t dcplId = H5Pcreate( H5P_DATASET_CREATE ); H5Pset_chunk( dcplId, m_rank + 1, &dimChunks[0] ); maxFileDims[0] = H5S_UNLIMITED; maxFileDims[1] = H5S_UNLIMITED; hid_t space = H5Screate_simple( m_rank+1, &historyFileDims[0], &maxFileDims[0] ); hid_t dataset = H5Dcreate( target, m_name.c_str(), m_hdfType, space, H5P_DEFAULT, dcplId, H5P_DEFAULT ); + GEOS_LOG_LEVEL_BY_RANK( 3, GEOS_FMT( "TimeHistory: {}, created hdf5 dataset {}.", m_filename, m_name ) ); H5Dclose( dataset ); H5Sclose( space ); + H5Pclose( dcplId ); } else if( existsOkay ) { updateDatasetExtent( m_writeLimit ); } - GEOS_ERROR_IF( inTarget && !existsOkay, "Dataset (" + m_name + ") already exists in output file: " + m_filename ); + else + { + GEOS_ERROR( "Dataset (" + m_name + ") already exists in output file: " + m_filename ); + } + GEOS_LOG_LEVEL_BY_RANK( 3, GEOS_FMT( "TimeHistory: closed file {}.", m_filename ) ); } } @@ -267,7 +270,14 @@ void HDFHistoryIO::write() if( m_subcomm != MPI_COMM_NULL ) { + GEOS_LOG_LEVEL_BY_RANK( 3, GEOS_FMT( "TimeHistory: opening file {}.", m_filename ) ); HDFFile target( m_filename, false, true, m_subcomm ); + GEOS_LOG_LEVEL_BY_RANK( 3, GEOS_FMT( "TimeHistory: opened file {}.", m_filename ) ); + + if( !target.hasDataset( m_name ) ) + { + GEOS_ERROR( "Attempted to write to a non-existent dataset: " + m_name ); + } hid_t dataset = H5Dopen( target, m_name.c_str(), H5P_DEFAULT ); hid_t filespace = H5Dget_space( dataset ); @@ -289,7 +299,11 @@ void HDFHistoryIO::write() hid_t fileHyperslab = filespace; H5Sselect_hyperslab( fileHyperslab, H5S_SELECT_SET, &fileOffset[0], nullptr, &bufferedCounts[0], nullptr ); - H5Dwrite( dataset, m_hdfType, memspace, fileHyperslab, H5P_DEFAULT, dataBuffer ); + hid_t dxplId = H5Pcreate( H5P_DATASET_XFER ); + H5Pset_dxpl_mpio( dxplId, H5FD_MPIO_COLLECTIVE ); + H5Dwrite( dataset, m_hdfType, memspace, fileHyperslab, dxplId, dataBuffer ); + GEOS_LOG_LEVEL_BY_RANK( 3, GEOS_FMT( "TimeHistory: wrote row {} of dataset '{}'.", m_writeHead, m_name ) ); + H5Pclose( dxplId ); // forward the data buffer pointer to the start of the next row if( dataBuffer ) @@ -306,14 +320,15 @@ void HDFHistoryIO::write() H5Sclose( memspace ); H5Sclose( filespace ); H5Dclose( dataset ); + GEOS_LOG_LEVEL_BY_RANK( 3, GEOS_FMT( "TimeHistory: closing file {}.", m_filename ) ); } - m_writeHead++; } } m_sizeChanged = false; m_localIdxCounts_buffered.clear( ); emptyBuffer( ); + MpiWrapper::barrier( m_comm ); } void HDFHistoryIO::compressInFile() @@ -351,6 +366,7 @@ void HDFHistoryIO::updateDatasetExtent( hsize_t rowLimit ) H5Dset_extent( dataset, &maxFileDims[0] ); H5Dclose( dataset ); } + MpiWrapper::barrier( m_comm ); } size_t HDFHistoryIO::getRowBytes() From a9a64c6630c8e7c82b1bdae4f5b0b181ad4a73db Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Mon, 1 Jul 2024 06:48:51 +0100 Subject: [PATCH 116/286] Bugfix/fix issue 2853 with flag (#3196) * Added a flag to determine whether or not to apply lagging update for the fracture stencil weights. * update baselines --------- Co-authored-by: liyangrock Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Co-authored-by: Pavel Tomin --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 ++ .../fluidFlow/FlowSolverBase.cpp | 5 ++- .../fluidFlow/FlowSolverBase.hpp | 4 ++ .../multiphysics/HydrofractureSolver.cpp | 41 +++++++++++++++++-- .../multiphysics/HydrofractureSolver.hpp | 9 ++++ 6 files changed, 59 insertions(+), 6 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index ca332e1557c..de96bd4ced6 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3177-5828-eabb935 + baseline: integratedTests/baseline_integratedTests-pr3196-5835-6563552 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 1ece72c1943..90bf00312ea 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3196 (2024-06-28) +====================== +Added isLaggingFractureStencilWeightsUpdate to hydrofracture solve. Rebaseline because of the new input. + PR #3177 (2024-06-28) ====================== Added logLevel to TimeHistoryOutput. Rebaseline because of the new input flag. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 756a5d5da06..3c32bc821e9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -91,7 +91,8 @@ FlowSolverBase::FlowSolverBase( string const & name, m_isThermal( 0 ), m_keepFlowVariablesConstantDuringInitStep( 0 ), m_isFixedStressPoromechanicsUpdate( false ), - m_isJumpStabilized( false ) + m_isJumpStabilized( false ), + m_isLaggingFractureStencilWeightsUpdate( 0 ) { this->registerWrapper( viewKeyStruct::isThermalString(), &m_isThermal ). setApplyDefaultValue( 0 ). @@ -754,6 +755,8 @@ void FlowSolverBase::prepareStencilWeights( DomainPartition & domain ) const FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( getDiscretizationName() ); ElementRegionManager::ElementViewAccessor< arrayView1d< real64 const > > hydraulicAperture = + m_isLaggingFractureStencilWeightsUpdate ? + mesh.getElemManager().constructViewAccessor< array1d< real64 >, arrayView1d< real64 const > >( fields::flow::aperture0::key() ) : mesh.getElemManager().constructViewAccessor< array1d< real64 >, arrayView1d< real64 const > >( fields::flow::hydraulicAperture::key() ); fluxApprox.forStencils< SurfaceElementStencil, FaceElementToCellStencil, EmbeddedSurfaceToCellStencil >( mesh, [&]( auto & stencil ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index a7d0f163085..0d6f795ffc8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -157,6 +157,8 @@ class FlowSolverBase : public SolverBase virtual bool checkSequentialSolutionIncrements( DomainPartition & domain ) const override; + void enableLaggingFractureStencilWeightsUpdate(){ m_isLaggingFractureStencilWeightsUpdate = 1; }; + protected: /** @@ -228,6 +230,8 @@ class FlowSolverBase : public SolverBase private: virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const override; + // flag to determine whether or not to apply lagging update for the fracture stencil weights + integer m_isLaggingFractureStencilWeightsUpdate; }; diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 971b3852b78..d761bd92327 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -75,6 +75,11 @@ HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ); + registerWrapper( viewKeyStruct::isLaggingFractureStencilWeightsUpdateString(), &m_isLaggingFractureStencilWeightsUpdate ). + setApplyDefaultValue( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Flag to determine whether or not to apply lagging update for the fracture stencil weights. " ); + m_numResolves[0] = 0; // This may need to be different depending on whether poroelasticity is on or not. @@ -112,6 +117,11 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::registerDataOnMesh( dataReposi } ); } ); #endif + + if( m_isLaggingFractureStencilWeightsUpdate ) + { + flowSolver()->enableLaggingFractureStencilWeightsUpdate(); + } } template< typename POROMECHANICS_SOLVER > @@ -848,13 +858,19 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::updateState( DomainPartition & Base::updateState( domain ); - // remove the contribution of the hydraulic aperture from the stencil weights - flowSolver()->prepareStencilWeights( domain ); + if( !m_isLaggingFractureStencilWeightsUpdate ) + { + // remove the contribution of the hydraulic aperture from the stencil weights + flowSolver()->prepareStencilWeights( domain ); + } updateHydraulicApertureAndFracturePermeability( domain ); - // update the stencil weights using the updated hydraulic aperture - flowSolver()->updateStencilWeights( domain ); + if( !m_isLaggingFractureStencilWeightsUpdate ) + { + // update the stencil weights using the updated hydraulic aperture + flowSolver()->updateStencilWeights( domain ); + } forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, @@ -872,6 +888,23 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::updateState( DomainPartition & } ); } +template< typename POROMECHANICS_SOLVER > +void HydrofractureSolver< POROMECHANICS_SOLVER >::implicitStepComplete( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) +{ + Base::implicitStepComplete( time_n, dt, domain ); + + if( m_isLaggingFractureStencilWeightsUpdate ) + { + // remove the contribution of the hydraulic aperture from the stencil weights + flowSolver()->prepareStencilWeights( domain ); + + // update the stencil weights using the updated hydraulic aperture + flowSolver()->updateStencilWeights( domain ); + } +} + template< typename POROMECHANICS_SOLVER > real64 HydrofractureSolver< POROMECHANICS_SOLVER >::setNextDt( real64 const & currentDt, DomainPartition & domain ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index 803e38153a9..78ffb35d583 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -124,6 +124,10 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER virtual void updateState( DomainPartition & domain ) override final; + virtual void implicitStepComplete( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) override final; + /**@}*/ void updateHydraulicApertureAndFracturePermeability( DomainPartition & domain ); @@ -170,6 +174,8 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER constexpr static char const * useQuasiNewtonString() { return "useQuasiNewton"; } + static constexpr char const * isLaggingFractureStencilWeightsUpdateString() { return "isLaggingFractureStencilWeightsUpdate"; } + #ifdef GEOSX_USE_SEPARATION_COEFFICIENT constexpr static char const * separationCoeff0String() { return "separationCoeff0"; } constexpr static char const * apertureAtFailureString() { return "apertureAtFailure"; } @@ -243,6 +249,9 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER integer m_useQuasiNewton; // use Quasi-Newton (see https://arxiv.org/abs/2111.00264) + // flag to determine whether or not to apply lagging update for the fracture stencil weights + integer m_isLaggingFractureStencilWeightsUpdate; + }; ENUM_STRINGS( HydrofractureSolver< SinglePhasePoromechanics< SinglePhaseBase > >::InitializationType, From c00c8696c43240cf7f23d43ee08fa021704b0ee2 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Mon, 1 Jul 2024 06:49:14 +0100 Subject: [PATCH 117/286] fix warnings. (#3190) Co-authored-by: Randolph Settgast --- src/coreComponents/mesh/FaceElementSubRegion.cpp | 3 ++- src/coreComponents/physicsSolvers/SolverBase.hpp | 3 --- .../solidMechanics/SolidMechanicsMPM.cpp | 12 ++---------- .../solidMechanics/SolidMechanicsMPM.hpp | 4 +--- 4 files changed, 5 insertions(+), 17 deletions(-) diff --git a/src/coreComponents/mesh/FaceElementSubRegion.cpp b/src/coreComponents/mesh/FaceElementSubRegion.cpp index bcef879113d..5bb44957630 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.cpp @@ -494,7 +494,6 @@ buildCollocatedEdgeBuckets( std::map< globalIndex, globalIndex > const & referen arrayView2d< localIndex const > const edgeToNodes ) { GEOS_ASSERT_EQ( edgeToNodes.size( 1 ), 2 ); - static constexpr std::string_view nodeNotFound = "Internal error when trying to access the reference collocated node for global node {}."; // Checks if the node `gni` is handled as a collocated node on the curren rank. auto hasCollocatedNode = [&]( globalIndex const gni ) -> bool @@ -526,6 +525,8 @@ buildCollocatedEdgeBuckets( std::map< globalIndex, globalIndex > const & referen std::map< std::pair< globalIndex, globalIndex >, std::set< localIndex > > collocatedEdgeBuckets; for( auto const & p: edgesIds ) { + static constexpr std::string_view nodeNotFound = "Internal error when trying to access the reference collocated node for global node {}."; + std::pair< globalIndex, globalIndex > const & nodes = p.first; localIndex const & edge = p.second; diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index b301eea8bd1..0e12ec9dcec 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -774,8 +774,6 @@ class SolverBase : public ExecutableGroup * names set. */ virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const { GEOS_UNUSED_VAR( subRegion ); } - virtual void setConstitutiveNamesCallSuper( ParticleSubRegionBase & subRegion ) const { GEOS_UNUSED_VAR( subRegion ); } // particle - // overload template< typename BASETYPE = constitutive::ConstitutiveBase, typename LOOKUP_TYPE > static BASETYPE const & getConstitutiveModel( dataRepository::Group const & dataGroup, LOOKUP_TYPE const & key ); @@ -840,7 +838,6 @@ class SolverBase : public ExecutableGroup * names set. */ virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const { GEOS_UNUSED_VAR( subRegion ); } - virtual void setConstitutiveNames( ParticleSubRegionBase & subRegion ) const { GEOS_UNUSED_VAR( subRegion ); } // particle overload bool solveNonlinearSystem( real64 const & time_n, real64 const & dt, diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp index 200ec84f454..36d818d1348 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp @@ -342,8 +342,7 @@ void SolidMechanicsMPM::registerDataOnMesh( Group & meshBodies ) [&]( localIndex const, ParticleSubRegionBase & subRegion ) { - setConstitutiveNamesCallSuper( subRegion ); - setConstitutiveNames( subRegion ); + setParticlesConstitutiveNames( subRegion ); } ); } @@ -1966,10 +1965,8 @@ void SolidMechanicsMPM::solverProfilingIf( std::string label, bool condition ) } } -void SolidMechanicsMPM::setConstitutiveNamesCallSuper( ParticleSubRegionBase & subRegion ) const +void SolidMechanicsMPM::setParticlesConstitutiveNames( ParticleSubRegionBase & subRegion ) const { - SolverBase::setConstitutiveNamesCallSuper( subRegion ); - subRegion.registerWrapper< string >( viewKeyStruct::solidMaterialNamesString() ). setPlotLevel( PlotLevel::NOPLOT ). setRestartFlags( RestartFlags::NO_WRITE ). @@ -1980,11 +1977,6 @@ void SolidMechanicsMPM::setConstitutiveNamesCallSuper( ParticleSubRegionBase & s GEOS_ERROR_IF( solidMaterialName.empty(), GEOS_FMT( "SolidBase model not found on subregion {}", subRegion.getName() ) ); } -void SolidMechanicsMPM::setConstitutiveNames( ParticleSubRegionBase & subRegion ) const -{ - GEOS_UNUSED_VAR( subRegion ); -} - real64 SolidMechanicsMPM::computeNeighborList( ParticleManager & particleManager ) { // Time this function diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp index 93dbc93a914..745f27ae723 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp @@ -363,8 +363,6 @@ class SolidMechanicsMPM : public SolverBase protected: virtual void postProcessInput() override final; - virtual void setConstitutiveNamesCallSuper( ParticleSubRegionBase & subRegion ) const override; - std::vector< array2d< localIndex > > m_mappedNodes; // mappedNodes[subregion index][particle index][node index]. dims = {# of subregions, // # of particles, # of nodes a particle on the subregion maps to} std::vector< array2d< real64 > > m_shapeFunctionValues; // mappedNodes[subregion][particle][nodal shape function value]. dims = {# of @@ -457,7 +455,7 @@ class SolidMechanicsMPM : public SolverBase } }; - virtual void setConstitutiveNames( ParticleSubRegionBase & subRegion ) const override; + void setParticlesConstitutiveNames( ParticleSubRegionBase & subRegion ) const; }; ENUM_STRINGS( SolidMechanicsMPM::TimeIntegrationOption, From 32b28b45c6ea0e5fcad1a45332fa1a6d06320571 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Mon, 1 Jul 2024 15:38:00 -0500 Subject: [PATCH 118/286] update rst (#3195) --- .../schema/docs/AcousticElasticSEM.rst | 1 + .../schema/docs/AcousticFirstOrderSEM.rst | 62 ++-- .../schema/docs/AcousticSEM.rst | 62 ++-- .../schema/docs/AcousticVTISEM.rst | 62 ++-- .../docs/CompositionalMultiphaseFVM.rst | 87 ++--- .../docs/CompositionalMultiphaseHybridFVM.rst | 69 ++-- .../docs/CompositionalMultiphaseReservoir.rst | 1 + ...tionalMultiphaseReservoirPoromechanics.rst | 11 +- .../docs/CompositionalMultiphaseWell.rst | 39 ++- .../schema/docs/ElasticFirstOrderSEM.rst | 62 ++-- src/coreComponents/schema/docs/ElasticSEM.rst | 68 ++-- .../schema/docs/EmbeddedSurfaceGenerator.rst | 1 + .../schema/docs/FlowProppantTransport.rst | 1 + .../schema/docs/Hydrofracture.rst | 7 + src/coreComponents/schema/docs/LaplaceFEM.rst | 1 + .../schema/docs/MultiphasePoromechanics.rst | 11 +- .../docs/MultiphasePoromechanicsReservoir.rst | 1 + .../schema/docs/PhaseFieldDamageFEM.rst | 1 + .../schema/docs/PhaseFieldFracture.rst | 1 + .../schema/docs/ProppantTransport.rst | 1 + .../ReactiveCompositionalMultiphaseOBL.rst | 1 + .../schema/docs/SeismicityRate.rst | 1 + .../schema/docs/SinglePhaseFVM.rst | 1 + .../schema/docs/SinglePhaseHybridFVM.rst | 1 + .../schema/docs/SinglePhasePoromechanics.rst | 35 +- ...ePhasePoromechanicsConformingFractures.rst | 35 +- ...glePhasePoromechanicsEmbeddedFractures.rst | 35 +- .../SinglePhasePoromechanicsReservoir.rst | 1 + .../schema/docs/SinglePhaseProppantFVM.rst | 1 + .../schema/docs/SinglePhaseReservoir.rst | 1 + .../SinglePhaseReservoirPoromechanics.rst | 35 +- .../schema/docs/SinglePhaseWell.rst | 1 + .../docs/SolidMechanicsEmbeddedFractures.rst | 1 + .../docs/SolidMechanicsLagrangeContact.rst | 1 + .../docs/SolidMechanicsLagrangianSSLE.rst | 1 + .../docs/SolidMechanics_LagrangianFEM.rst | 1 + .../schema/docs/SolidMechanics_MPM.rst | 1 + src/coreComponents/schema/docs/Solvers.rst | 88 ++--- .../schema/docs/Solvers_other.rst | 86 ++--- .../schema/docs/SurfaceGenerator.rst | 1 + src/coreComponents/schema/docs/Tasks.rst | 2 + .../schema/docs/Tasks_other.rst | 2 + src/coreComponents/schema/docs/VTK.rst | 3 +- src/coreComponents/schema/schema.xsd | 315 ++++++++++++++++-- src/coreComponents/schema/schema.xsd.other | 40 ++- src/docs/sphinx/CompleteXMLSchema.rst | 56 ++++ 46 files changed, 878 insertions(+), 417 deletions(-) diff --git a/src/coreComponents/schema/docs/AcousticElasticSEM.rst b/src/coreComponents/schema/docs/AcousticElasticSEM.rst index 8a99bd42d0f..8dc0c8b4e21 100644 --- a/src/coreComponents/schema/docs/AcousticElasticSEM.rst +++ b/src/coreComponents/schema/docs/AcousticElasticSEM.rst @@ -11,6 +11,7 @@ initialDt real64 1e+99 Initial time-step value re logLevel integer 0 Log level name groupName required A name is required for any non-unique nodes targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ================== ======== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/AcousticFirstOrderSEM.rst b/src/coreComponents/schema/docs/AcousticFirstOrderSEM.rst index 22d9753df98..0d655628fe6 100644 --- a/src/coreComponents/schema/docs/AcousticFirstOrderSEM.rst +++ b/src/coreComponents/schema/docs/AcousticFirstOrderSEM.rst @@ -1,33 +1,37 @@ -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -dtSeismoTrace real64 0 Time step for output pressure at receivers -enableLifo integer 0 Set to 1 to enable LIFO storage feature -forward integer 1 Set to 1 to compute forward propagation -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) -lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) -lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) -linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) -linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise -receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers -rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default -saveFields integer 0 Set to 1 to save fields during forward and restore them during backward -shotIndex integer 0 Set the current shot for temporary files -sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeSourceDelay real32 -1 Source time delay (1 / f0 by default) -timeSourceFrequency real32 0 Central frequency for the time source -useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: 1 for strain integration, 2 for displacement difference -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== +attenuationType geos_WaveSolverUtils_AttenuationType none Flag to indicate which attenuation model to use: "none" for no attenuation, "sls\ for the standard-linear-solid (SLS) model (Fichtner, 2014). +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +dtSeismoTrace real64 0 Time step for output pressure at receivers +enableLifo integer 0 Set to 1 to enable LIFO storage feature +forward integer 1 Set to 1 to compute forward propagation +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) +lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) +lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) +linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) +linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise +receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers +rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default +saveFields integer 0 Set to 1 to save fields during forward and restore them during backward +shotIndex integer 0 Set the current shot for temporary files +slsAnelasticityCoefficients real32_array {0} Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided. +slsReferenceAngularFrequencies real32_array {0} Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided. +sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +timeSourceDelay real32 -1 Source time delay (1 / f0 by default) +timeSourceFrequency real32 0 Central frequency for the time source +useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: "none" to deactivate DAS, "strainIntegration" for strain integration, "dipole" for displacement difference +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/AcousticSEM.rst b/src/coreComponents/schema/docs/AcousticSEM.rst index 22d9753df98..0d655628fe6 100644 --- a/src/coreComponents/schema/docs/AcousticSEM.rst +++ b/src/coreComponents/schema/docs/AcousticSEM.rst @@ -1,33 +1,37 @@ -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -dtSeismoTrace real64 0 Time step for output pressure at receivers -enableLifo integer 0 Set to 1 to enable LIFO storage feature -forward integer 1 Set to 1 to compute forward propagation -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) -lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) -lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) -linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) -linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise -receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers -rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default -saveFields integer 0 Set to 1 to save fields during forward and restore them during backward -shotIndex integer 0 Set the current shot for temporary files -sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeSourceDelay real32 -1 Source time delay (1 / f0 by default) -timeSourceFrequency real32 0 Central frequency for the time source -useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: 1 for strain integration, 2 for displacement difference -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== +attenuationType geos_WaveSolverUtils_AttenuationType none Flag to indicate which attenuation model to use: "none" for no attenuation, "sls\ for the standard-linear-solid (SLS) model (Fichtner, 2014). +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +dtSeismoTrace real64 0 Time step for output pressure at receivers +enableLifo integer 0 Set to 1 to enable LIFO storage feature +forward integer 1 Set to 1 to compute forward propagation +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) +lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) +lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) +linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) +linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise +receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers +rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default +saveFields integer 0 Set to 1 to save fields during forward and restore them during backward +shotIndex integer 0 Set the current shot for temporary files +slsAnelasticityCoefficients real32_array {0} Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided. +slsReferenceAngularFrequencies real32_array {0} Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided. +sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +timeSourceDelay real32 -1 Source time delay (1 / f0 by default) +timeSourceFrequency real32 0 Central frequency for the time source +useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: "none" to deactivate DAS, "strainIntegration" for strain integration, "dipole" for displacement difference +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/AcousticVTISEM.rst b/src/coreComponents/schema/docs/AcousticVTISEM.rst index 22d9753df98..0d655628fe6 100644 --- a/src/coreComponents/schema/docs/AcousticVTISEM.rst +++ b/src/coreComponents/schema/docs/AcousticVTISEM.rst @@ -1,33 +1,37 @@ -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -dtSeismoTrace real64 0 Time step for output pressure at receivers -enableLifo integer 0 Set to 1 to enable LIFO storage feature -forward integer 1 Set to 1 to compute forward propagation -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) -lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) -lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) -linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) -linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise -receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers -rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default -saveFields integer 0 Set to 1 to save fields during forward and restore them during backward -shotIndex integer 0 Set the current shot for temporary files -sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeSourceDelay real32 -1 Source time delay (1 / f0 by default) -timeSourceFrequency real32 0 Central frequency for the time source -useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: 1 for strain integration, 2 for displacement difference -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== +attenuationType geos_WaveSolverUtils_AttenuationType none Flag to indicate which attenuation model to use: "none" for no attenuation, "sls\ for the standard-linear-solid (SLS) model (Fichtner, 2014). +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +dtSeismoTrace real64 0 Time step for output pressure at receivers +enableLifo integer 0 Set to 1 to enable LIFO storage feature +forward integer 1 Set to 1 to compute forward propagation +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) +lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) +lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) +linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) +linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise +receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers +rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default +saveFields integer 0 Set to 1 to save fields during forward and restore them during backward +shotIndex integer 0 Set the current shot for temporary files +slsAnelasticityCoefficients real32_array {0} Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided. +slsReferenceAngularFrequencies real32_array {0} Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided. +sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +timeSourceDelay real32 -1 Source time delay (1 / f0 by default) +timeSourceFrequency real32 0 Central frequency for the time source +useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: "none" to deactivate DAS, "strainIntegration" for strain integration, "dipole" for displacement difference +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst index 33e2a2e5cb5..a2b0c70f5fc 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst @@ -1,46 +1,49 @@ -========================================= =========================================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================================= =========================================== ======== ======================================================================================================================================================================================================================================================================================================================== -allowLocalCompDensityChopping integer 1 Flag indicating whether local (cell-wise) chopping of negative compositions is allowed -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contMultiplierDBC real64 0.5 Factor by which continuation parameter is changed every newton when DBC is used -continuationDBC integer 1 Flag for enabling continuation parameter -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -kappaminDBC real64 1e-20 Factor that controls how much dissipation is kept in the system when continuation is used -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxCompFractionChange real64 0.5 Maximum (absolute) change in a component fraction in a Newton iteration -maxRelativePressureChange real64 0.5 Maximum (relative) change in pressure in a Newton iteration -maxRelativeTemperatureChange real64 0.5 Maximum (relative) change in temperature in a Newton iteration -maxSequentialCompDensChange real64 1 Maximum (absolute) component density change in a sequential iteration, used for outer loop convergence check -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -minCompDens real64 1e-10 Minimum allowed global component density -minScalingFactor real64 0.01 Minimum value for solution scaling factor -miscibleDBC integer 0 Flag for enabling DBC formulation with/without miscibility -name groupName required A name is required for any non-unique nodes -omegaDBC real64 1 Factor by which DBC flux is multiplied -scalingType geos_CompositionalMultiphaseFVM_ScalingType Global | Solution scaling type.Valid options: - | * Global - | * Local -solutionChangeScalingFactor real64 0.5 Damping factor for solution change targets -targetFlowCFL real64 -1 Target CFL condition `CFL condition `_when computing the next timestep. -targetPhaseVolFractionChangeInTimeStep real64 0.2 Target (absolute) change in phase volume fraction in a time step -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -targetRelativePressureChangeInTimeStep real64 0.2 Target (relative) change in pressure in a time step (expected value between 0 and 1) -targetRelativeTemperatureChangeInTimeStep real64 0.2 Target (relative) change in temperature in a time step (expected value between 0 and 1) -temperature real64 required Temperature -useDBC integer 0 Enable Dissipation-based continuation flux -useMass integer 0 Use mass formulation instead of molar. Warning : Affects SourceFlux rates units. -useSimpleAccumulation integer 1 Flag indicating whether simple accumulation form is used -useTotalMassEquation integer 1 Flag indicating whether total mass equation is used -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================================= =========================================== ======== ======================================================================================================================================================================================================================================================================================================================== +========================================= =========================================== ============ ======================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +========================================= =========================================== ============ ======================================================================================================================================================================================================================================================================================================================== +allowLocalCompDensityChopping integer 1 Flag indicating whether local (cell-wise) chopping of negative compositions is allowed +allowNegativePressure integer 1 Flag indicating if negative pressure is allowed +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +contMultiplierDBC real64 0.5 Factor by which continuation parameter is changed every newton when DBC is used +continuationDBC integer 1 Flag for enabling continuation parameter +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 Flag indicating whether the problem is thermal or not. +kappaminDBC real64 1e-20 Factor that controls how much dissipation is kept in the system when continuation is used +logLevel integer 0 Log level +maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration +maxCompFractionChange real64 0.5 Maximum (absolute) change in a component fraction in a Newton iteration +maxRelativeCompDensChange real64 1.79769e+308 Maximum (relative) change in a component density in a Newton iteration +maxRelativePressureChange real64 0.5 Maximum (relative) change in pressure in a Newton iteration +maxRelativeTemperatureChange real64 0.5 Maximum (relative) change in temperature in a Newton iteration +maxSequentialCompDensChange real64 1 Maximum (absolute) component density change in a sequential iteration, used for outer loop convergence check +maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check +maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check +minCompDens real64 1e-10 Minimum allowed global component density +minScalingFactor real64 0.01 Minimum value for solution scaling factor +miscibleDBC integer 0 Flag for enabling DBC formulation with/without miscibility +name groupName required A name is required for any non-unique nodes +omegaDBC real64 1 Factor by which DBC flux is multiplied +scalingType geos_CompositionalMultiphaseFVM_ScalingType Global | Solution scaling type.Valid options: + | * Global + | * Local +solutionChangeScalingFactor real64 0.5 Damping factor for solution change targets +targetFlowCFL real64 -1 Target CFL condition `CFL condition `_when computing the next timestep. +targetPhaseVolFractionChangeInTimeStep real64 0.2 Target (absolute) change in phase volume fraction in a time step +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +targetRelativeCompDensChangeInTimeStep real64 1.79769e+308 Target (relative) change in component density in a time step +targetRelativePressureChangeInTimeStep real64 0.2 Target (relative) change in pressure in a time step (expected value between 0 and 1) +targetRelativeTemperatureChangeInTimeStep real64 0.2 Target (relative) change in temperature in a time step (expected value between 0 and 1) +temperature real64 required Temperature +useDBC integer 0 Enable Dissipation-based continuation flux +useMass integer 0 Use mass formulation instead of molar. Warning : Affects SourceFlux rates units. +useSimpleAccumulation integer 1 Flag indicating whether simple accumulation form is used +useTotalMassEquation integer 1 Flag indicating whether total mass equation is used +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +========================================= =========================================== ============ ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst index 1627f7eae15..2cf53fd6857 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst @@ -1,37 +1,40 @@ -========================================= ================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================================= ================== ======== ======================================================================================================================================================================================================================================================================================================================== -allowLocalCompDensityChopping integer 1 Flag indicating whether local (cell-wise) chopping of negative compositions is allowed -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxCompFractionChange real64 0.5 Maximum (absolute) change in a component fraction in a Newton iteration -maxRelativePressureChange real64 0.5 Maximum (relative) change in pressure in a Newton iteration -maxRelativeTemperatureChange real64 0.5 Maximum (relative) change in temperature in a Newton iteration -maxSequentialCompDensChange real64 1 Maximum (absolute) component density change in a sequential iteration, used for outer loop convergence check -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -minCompDens real64 1e-10 Minimum allowed global component density -minScalingFactor real64 0.01 Minimum value for solution scaling factor -name groupName required A name is required for any non-unique nodes -solutionChangeScalingFactor real64 0.5 Damping factor for solution change targets -targetFlowCFL real64 -1 Target CFL condition `CFL condition `_when computing the next timestep. -targetPhaseVolFractionChangeInTimeStep real64 0.2 Target (absolute) change in phase volume fraction in a time step -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -targetRelativePressureChangeInTimeStep real64 0.2 Target (relative) change in pressure in a time step (expected value between 0 and 1) -targetRelativeTemperatureChangeInTimeStep real64 0.2 Target (relative) change in temperature in a time step (expected value between 0 and 1) -temperature real64 required Temperature -useMass integer 0 Use mass formulation instead of molar. Warning : Affects SourceFlux rates units. -useSimpleAccumulation integer 1 Flag indicating whether simple accumulation form is used -useTotalMassEquation integer 1 Flag indicating whether total mass equation is used -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================================= ================== ======== ======================================================================================================================================================================================================================================================================================================================== +========================================= ================== ============ ======================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +========================================= ================== ============ ======================================================================================================================================================================================================================================================================================================================== +allowLocalCompDensityChopping integer 1 Flag indicating whether local (cell-wise) chopping of negative compositions is allowed +allowNegativePressure integer 1 Flag indicating if negative pressure is allowed +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 Flag indicating whether the problem is thermal or not. +logLevel integer 0 Log level +maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration +maxCompFractionChange real64 0.5 Maximum (absolute) change in a component fraction in a Newton iteration +maxRelativeCompDensChange real64 1.79769e+308 Maximum (relative) change in a component density in a Newton iteration +maxRelativePressureChange real64 0.5 Maximum (relative) change in pressure in a Newton iteration +maxRelativeTemperatureChange real64 0.5 Maximum (relative) change in temperature in a Newton iteration +maxSequentialCompDensChange real64 1 Maximum (absolute) component density change in a sequential iteration, used for outer loop convergence check +maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check +maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check +minCompDens real64 1e-10 Minimum allowed global component density +minScalingFactor real64 0.01 Minimum value for solution scaling factor +name groupName required A name is required for any non-unique nodes +solutionChangeScalingFactor real64 0.5 Damping factor for solution change targets +targetFlowCFL real64 -1 Target CFL condition `CFL condition `_when computing the next timestep. +targetPhaseVolFractionChangeInTimeStep real64 0.2 Target (absolute) change in phase volume fraction in a time step +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +targetRelativeCompDensChangeInTimeStep real64 1.79769e+308 Target (relative) change in component density in a time step +targetRelativePressureChangeInTimeStep real64 0.2 Target (relative) change in pressure in a time step (expected value between 0 and 1) +targetRelativeTemperatureChangeInTimeStep real64 0.2 Target (relative) change in temperature in a time step (expected value between 0 and 1) +temperature real64 required Temperature +useMass integer 0 Use mass formulation instead of molar. Warning : Affects SourceFlux rates units. +useSimpleAccumulation integer 1 Flag indicating whether simple accumulation form is used +useTotalMassEquation integer 1 Flag indicating whether total mass equation is used +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +========================================= ================== ============ ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir.rst index f25a13fb960..9b67dda6230 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir.rst @@ -10,6 +10,7 @@ logLevel integer 0 Log level name groupName required A name is required for any non-unique nodes targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. wellSolverName groupNameRef required Name of the well solver used by the coupled solver +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics.rst index c85eff65ff8..6ec494e2d08 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics.rst @@ -10,13 +10,14 @@ logLevel integer 0 Log le name groupName required A name is required for any non-unique nodes reservoirAndWellsSolverName groupNameRef required Name of the reservoirAndWells solver used by the coupled solver solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -stabilizationMultiplier real64 1 Constant multiplier of stabilization strength. +stabilizationMultiplier real64 1 Constant multiplier of stabilization strength stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. -stabilizationType geos_stabilization_StabilizationType None | Stabilization type. Options are: - | None - Add no stabilization to mass equation, - | Global - Add stabilization to all faces, - | Local - Add stabilization only to interiors of macro elements. +stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: + | None- Add no stabilization to mass equation + | Global- Add jump stabilization to all faces + | Local- Add jump stabilization on interior of macro elements targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` =========================== ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst index b072785ff00..197e006821f 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst @@ -1,22 +1,25 @@ -============================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -allowLocalCompDensityChopping integer 1 Flag indicating whether local (cell-wise) chopping of negative compositions is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxCompFractionChange real64 1 Maximum (absolute) change in a component fraction between two Newton iterations -maxRelativePressureChange real64 1 Maximum (relative) change in pressure between two Newton iterations (recommended with rate control) -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -useMass integer 0 Use total mass equation -writeCSV integer 0 Write rates into a CSV file -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -WellControls node :ref:`XML_WellControls` -============================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== +============================= ================== ============ ====================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================= ================== ============ ====================================================================================================================================================================================================================================================================================================================== +allowLocalCompDensityChopping integer 1 Flag indicating whether local (cell-wise) chopping of negative compositions is allowed +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +logLevel integer 0 Log level +maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration +maxCompFractionChange real64 1 Maximum (absolute) change in a component fraction between two Newton iterations +maxRelativeCompDensChange real64 1.79769e+308 Maximum (relative) change in a component density between two Newton iterations +maxRelativePressureChange real64 1 Maximum (relative) change in pressure between two Newton iterations (recommended with rate control) +name groupName required A name is required for any non-unique nodes +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +useMass integer 0 Use mass formulation instead of molar +useTotalMassEquation integer 1 Use total mass equation +writeCSV integer 0 Write rates into a CSV file +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +WellControls node :ref:`XML_WellControls` +============================= ================== ============ ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/ElasticFirstOrderSEM.rst b/src/coreComponents/schema/docs/ElasticFirstOrderSEM.rst index 22d9753df98..0d655628fe6 100644 --- a/src/coreComponents/schema/docs/ElasticFirstOrderSEM.rst +++ b/src/coreComponents/schema/docs/ElasticFirstOrderSEM.rst @@ -1,33 +1,37 @@ -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -dtSeismoTrace real64 0 Time step for output pressure at receivers -enableLifo integer 0 Set to 1 to enable LIFO storage feature -forward integer 1 Set to 1 to compute forward propagation -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) -lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) -lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) -linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) -linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise -receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers -rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default -saveFields integer 0 Set to 1 to save fields during forward and restore them during backward -shotIndex integer 0 Set the current shot for temporary files -sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeSourceDelay real32 -1 Source time delay (1 / f0 by default) -timeSourceFrequency real32 0 Central frequency for the time source -useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: 1 for strain integration, 2 for displacement difference -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ============================ ========== ======================================================================================================================================================================================================================================================================================================================== +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== +attenuationType geos_WaveSolverUtils_AttenuationType none Flag to indicate which attenuation model to use: "none" for no attenuation, "sls\ for the standard-linear-solid (SLS) model (Fichtner, 2014). +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +dtSeismoTrace real64 0 Time step for output pressure at receivers +enableLifo integer 0 Set to 1 to enable LIFO storage feature +forward integer 1 Set to 1 to compute forward propagation +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) +lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) +lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) +linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) +linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise +receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers +rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default +saveFields integer 0 Set to 1 to save fields during forward and restore them during backward +shotIndex integer 0 Set the current shot for temporary files +slsAnelasticityCoefficients real32_array {0} Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided. +slsReferenceAngularFrequencies real32_array {0} Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided. +sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +timeSourceDelay real32 -1 Source time delay (1 / f0 by default) +timeSourceFrequency real32 0 Central frequency for the time source +useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: "none" to deactivate DAS, "strainIntegration" for strain integration, "dipole" for displacement difference +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/ElasticSEM.rst b/src/coreComponents/schema/docs/ElasticSEM.rst index 41902f589eb..924f4d2c984 100644 --- a/src/coreComponents/schema/docs/ElasticSEM.rst +++ b/src/coreComponents/schema/docs/ElasticSEM.rst @@ -1,36 +1,40 @@ -========================= ============================ ============= ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ============================ ============= ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -dtSeismoTrace real64 0 Time step for output pressure at receivers -enableLifo integer 0 Set to 1 to enable LIFO storage feature -forward integer 1 Set to 1 to compute forward propagation -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) -lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) -lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) -linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) -linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise -receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers -rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default -saveFields integer 0 Set to 1 to save fields during forward and restore them during backward -shotIndex integer 0 Set the current shot for temporary files -sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources -sourceForce R1Tensor {0,0,0} Force of the source: 3 real values for a vector source, and 6 real values for a tensor source (in Voigt notation).The default value is { 0, 0, 0 } (no net force). -sourceMoment R2SymTensor {1,1,1,0,0,0} Moment of the source: 6 real values describing a symmetric tensor in Voigt notation.The default value is { 1, 1, 1, 0, 0, 0 } (diagonal moment, corresponding to a pure explosion). -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeSourceDelay real32 -1 Source time delay (1 / f0 by default) -timeSourceFrequency real32 0 Central frequency for the time source -useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: 1 for strain integration, 2 for displacement difference -useVTI integer 0 Flag to apply VTI anisotropy. The default is to use isotropic physic. -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ============================ ============= ======================================================================================================================================================================================================================================================================================================================== +============================== ==================================== ============= ======================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +============================== ==================================== ============= ======================================================================================================================================================================================================================================================================================================================== +attenuationType geos_WaveSolverUtils_AttenuationType none Flag to indicate which attenuation model to use: "none" for no attenuation, "sls\ for the standard-linear-solid (SLS) model (Fichtner, 2014). +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +dtSeismoTrace real64 0 Time step for output pressure at receivers +enableLifo integer 0 Set to 1 to enable LIFO storage feature +forward integer 1 Set to 1 to compute forward propagation +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) +lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) +lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) +linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) +linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise +receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers +rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default +saveFields integer 0 Set to 1 to save fields during forward and restore them during backward +shotIndex integer 0 Set the current shot for temporary files +slsAnelasticityCoefficients real32_array {0} Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided. +slsReferenceAngularFrequencies real32_array {0} Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided. +sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources +sourceForce R1Tensor {0,0,0} Force of the source: 3 real values for a vector source, and 6 real values for a tensor source (in Voigt notation).The default value is { 0, 0, 0 } (no net force). +sourceMoment R2SymTensor {1,1,1,0,0,0} Moment of the source: 6 real values describing a symmetric tensor in Voigt notation.The default value is { 1, 1, 1, 0, 0, 0 } (diagonal moment, corresponding to a pure explosion). +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +timeSourceDelay real32 -1 Source time delay (1 / f0 by default) +timeSourceFrequency real32 0 Central frequency for the time source +useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: "none" to deactivate DAS, "strainIntegration" for strain integration, "dipole" for displacement difference +useVTI integer 0 Flag to apply VTI anisotropy. The default is to use isotropic physic. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +============================== ==================================== ============= ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator.rst b/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator.rst index 32ce1ed3490..4dc73219d88 100644 --- a/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator.rst +++ b/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator.rst @@ -12,6 +12,7 @@ mpiCommOrder integer 0 Flag to enable MPI c name groupName required A name is required for any non-unique nodes targetObjects groupNameRef_array required List of geometric objects that will be used to initialized the embedded surfaces/fractures. targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ================== ============== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/FlowProppantTransport.rst b/src/coreComponents/schema/docs/FlowProppantTransport.rst index c9f1110c6fa..1444704a5ed 100644 --- a/src/coreComponents/schema/docs/FlowProppantTransport.rst +++ b/src/coreComponents/schema/docs/FlowProppantTransport.rst @@ -10,6 +10,7 @@ logLevel integer 0 Log level name groupName required A name is required for any non-unique nodes proppantSolverName groupNameRef required Name of the proppant solver used by the coupled solver targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/Hydrofracture.rst b/src/coreComponents/schema/docs/Hydrofracture.rst index 2c63529e0c0..486ef16b842 100644 --- a/src/coreComponents/schema/docs/Hydrofracture.rst +++ b/src/coreComponents/schema/docs/Hydrofracture.rst @@ -14,9 +14,16 @@ maxNumResolves integer name groupName required A name is required for any non-unique nodes newFractureInitializationType geos_HydrofractureSolver >_InitializationType Pressure Type of new fracture element initialization. Can be Pressure or Displacement. solidSolverName groupNameRef required Name of the solid solver used by the coupled solver +stabilizationMultiplier real64 1 Constant multiplier of stabilization strength +stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. +stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: + | None- Add no stabilization to mass equation + | Global- Add jump stabilization to all faces + | Local- Add jump stabilization on interior of macro elements surfaceGeneratorName groupNameRef required Name of the surface generator to use in the hydrofracture solver targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. useQuasiNewton integer 0 (no description available) +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/LaplaceFEM.rst b/src/coreComponents/schema/docs/LaplaceFEM.rst index 2353f6bde5f..21ff08859ec 100644 --- a/src/coreComponents/schema/docs/LaplaceFEM.rst +++ b/src/coreComponents/schema/docs/LaplaceFEM.rst @@ -13,6 +13,7 @@ targetRegions groupNameRef_array required Allo timeIntegrationOption geos_LaplaceBaseH1_TimeIntegrationOption required | Time integration method. Options are: | * SteadyState | * ImplicitTransient +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ======================================== ======== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanics.rst b/src/coreComponents/schema/docs/MultiphasePoromechanics.rst index 8ce423105cc..002c98b6c89 100644 --- a/src/coreComponents/schema/docs/MultiphasePoromechanics.rst +++ b/src/coreComponents/schema/docs/MultiphasePoromechanics.rst @@ -10,13 +10,14 @@ isThermal integer 0 Flag ind logLevel integer 0 Log level name groupName required A name is required for any non-unique nodes solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -stabilizationMultiplier real64 1 Constant multiplier of stabilization strength. +stabilizationMultiplier real64 1 Constant multiplier of stabilization strength stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. -stabilizationType geos_stabilization_StabilizationType None | Stabilization type. Options are: - | None - Add no stabilization to mass equation, - | Global - Add stabilization to all faces, - | Local - Add stabilization only to interiors of macro elements. +stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: + | None- Add no stabilization to mass equation + | Global- Add jump stabilization to all faces + | Local- Add jump stabilization on interior of macro elements targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir.rst b/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir.rst index b2ccf01c20b..abe1a84cf22 100644 --- a/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir.rst +++ b/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir.rst @@ -10,6 +10,7 @@ name groupName required A name is required for any poromechanicsSolverName groupNameRef required Name of the poromechanics solver used by the coupled solver targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. wellSolverName groupNameRef required Name of the well solver used by the coupled solver +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/PhaseFieldDamageFEM.rst b/src/coreComponents/schema/docs/PhaseFieldDamageFEM.rst index d0d26cc6fb3..738d26eb91a 100644 --- a/src/coreComponents/schema/docs/PhaseFieldDamageFEM.rst +++ b/src/coreComponents/schema/docs/PhaseFieldDamageFEM.rst @@ -14,6 +14,7 @@ logLevel integer 0 name groupName required A name is required for any non-unique nodes targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. timeIntegrationOption geos_PhaseFieldDamageFEM_TimeIntegrationOption required option for default time integration method +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ============================================== ======== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/PhaseFieldFracture.rst b/src/coreComponents/schema/docs/PhaseFieldFracture.rst index 0c7e530a888..eb49f03806a 100644 --- a/src/coreComponents/schema/docs/PhaseFieldFracture.rst +++ b/src/coreComponents/schema/docs/PhaseFieldFracture.rst @@ -10,6 +10,7 @@ logLevel integer 0 Log level name groupName required A name is required for any non-unique nodes solidSolverName groupNameRef required Name of the solid solver used by the coupled solver targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/ProppantTransport.rst b/src/coreComponents/schema/docs/ProppantTransport.rst index c7b0b39c500..6d381b82584 100644 --- a/src/coreComponents/schema/docs/ProppantTransport.rst +++ b/src/coreComponents/schema/docs/ProppantTransport.rst @@ -21,6 +21,7 @@ proppantDensity real64 2500 Proppant density proppantDiameter real64 0.0004 Proppant diameter targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. updateProppantPacking integer 0 Flag that enables/disables proppant-packing update +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL.rst b/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL.rst index da7fa66a198..c3f5cebfb57 100644 --- a/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL.rst +++ b/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL.rst @@ -24,6 +24,7 @@ phaseNames groupNameRef_array {} List of fluid phases targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. transMultExp real64 1 Exponent of dynamic transmissibility multiplier useDARTSL2Norm integer 1 Use L2 norm calculation similar to one used DARTS +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SeismicityRate.rst b/src/coreComponents/schema/docs/SeismicityRate.rst index 492a69e75e2..a4e6bddb031 100644 --- a/src/coreComponents/schema/docs/SeismicityRate.rst +++ b/src/coreComponents/schema/docs/SeismicityRate.rst @@ -13,6 +13,7 @@ logLevel integer 0 Log level name groupName required A name is required for any non-unique nodes stressSolverName string Name of solver for computing stress targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseFVM.rst b/src/coreComponents/schema/docs/SinglePhaseFVM.rst index f6ffdc9cbfb..f95554a5d12 100644 --- a/src/coreComponents/schema/docs/SinglePhaseFVM.rst +++ b/src/coreComponents/schema/docs/SinglePhaseFVM.rst @@ -19,6 +19,7 @@ maxSequentialTemperatureChange real64 0.1 Maximum (absolute) te name groupName required A name is required for any non-unique nodes targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. temperature real64 0 Temperature +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst b/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst index f6ffdc9cbfb..f95554a5d12 100644 --- a/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst +++ b/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst @@ -19,6 +19,7 @@ maxSequentialTemperatureChange real64 0.1 Maximum (absolute) te name groupName required A name is required for any non-unique nodes targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. temperature real64 0 Temperature +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanics.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanics.rst index 89d7b79139b..002c98b6c89 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanics.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanics.rst @@ -1,18 +1,25 @@ -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== +========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +flowSolverName groupNameRef required Name of the flow solver used by the coupled solver +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +solidSolverName groupNameRef required Name of the solid solver used by the coupled solver +stabilizationMultiplier real64 1 Constant multiplier of stabilization strength +stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. +stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: + | None- Add no stabilization to mass equation + | Global- Add jump stabilization to all faces + | Local- Add jump stabilization on interior of macro elements +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures.rst index 89d7b79139b..002c98b6c89 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures.rst @@ -1,18 +1,25 @@ -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== +========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +flowSolverName groupNameRef required Name of the flow solver used by the coupled solver +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +solidSolverName groupNameRef required Name of the solid solver used by the coupled solver +stabilizationMultiplier real64 1 Constant multiplier of stabilization strength +stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. +stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: + | None- Add no stabilization to mass equation + | Global- Add jump stabilization to all faces + | Local- Add jump stabilization on interior of macro elements +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures.rst index 89d7b79139b..002c98b6c89 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures.rst @@ -1,18 +1,25 @@ -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== +========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +flowSolverName groupNameRef required Name of the flow solver used by the coupled solver +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +solidSolverName groupNameRef required Name of the solid solver used by the coupled solver +stabilizationMultiplier real64 1 Constant multiplier of stabilization strength +stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. +stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: + | None- Add no stabilization to mass equation + | Global- Add jump stabilization to all faces + | Local- Add jump stabilization on interior of macro elements +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir.rst index b2ccf01c20b..abe1a84cf22 100644 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir.rst +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir.rst @@ -10,6 +10,7 @@ name groupName required A name is required for any poromechanicsSolverName groupNameRef required Name of the poromechanics solver used by the coupled solver targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. wellSolverName groupNameRef required Name of the well solver used by the coupled solver +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst b/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst index f6ffdc9cbfb..f95554a5d12 100644 --- a/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst +++ b/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst @@ -19,6 +19,7 @@ maxSequentialTemperatureChange real64 0.1 Maximum (absolute) te name groupName required A name is required for any non-unique nodes targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. temperature real64 0 Temperature +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoir.rst b/src/coreComponents/schema/docs/SinglePhaseReservoir.rst index f25a13fb960..9b67dda6230 100644 --- a/src/coreComponents/schema/docs/SinglePhaseReservoir.rst +++ b/src/coreComponents/schema/docs/SinglePhaseReservoir.rst @@ -10,6 +10,7 @@ logLevel integer 0 Log level name groupName required A name is required for any non-unique nodes targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. wellSolverName groupNameRef required Name of the well solver used by the coupled solver +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics.rst b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics.rst index e19bd9b1ac7..6ec494e2d08 100644 --- a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics.rst +++ b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics.rst @@ -1,18 +1,25 @@ -=========================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -=========================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -reservoirAndWellsSolverName groupNameRef required Name of the reservoirAndWells solver used by the coupled solver -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -=========================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== +=========================== ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +=========================== ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +reservoirAndWellsSolverName groupNameRef required Name of the reservoirAndWells solver used by the coupled solver +solidSolverName groupNameRef required Name of the solid solver used by the coupled solver +stabilizationMultiplier real64 1 Constant multiplier of stabilization strength +stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. +stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: + | None- Add no stabilization to mass equation + | Global- Add jump stabilization to all faces + | Local- Add jump stabilization on interior of macro elements +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +=========================== ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SinglePhaseWell.rst b/src/coreComponents/schema/docs/SinglePhaseWell.rst index ba2a66c6297..0e07797aec9 100644 --- a/src/coreComponents/schema/docs/SinglePhaseWell.rst +++ b/src/coreComponents/schema/docs/SinglePhaseWell.rst @@ -9,6 +9,7 @@ logLevel integer 0 Log level name groupName required A name is required for any non-unique nodes targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. writeCSV integer 0 Write rates into a CSV file +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` WellControls node :ref:`XML_WellControls` diff --git a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst b/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst index c51f1d33c6b..eca5d02f2ed 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst @@ -22,6 +22,7 @@ timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption | * ImplicitDynamic | * ExplicitDynamic useStaticCondensation integer 0 Defines whether to use static condensation or not. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst index 9e6224ccea1..ea949482327 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst @@ -23,6 +23,7 @@ timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegration | * QuasiStatic | * ImplicitDynamic | * ExplicitDynamic +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` =============================== ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst index 21cdc11d22d..bed0562d496 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst @@ -23,6 +23,7 @@ timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption | * QuasiStatic | * ImplicitDynamic | * ExplicitDynamic +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst b/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst index 21cdc11d22d..bed0562d496 100644 --- a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst +++ b/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst @@ -23,6 +23,7 @@ timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption | * QuasiStatic | * ImplicitDynamic | * ExplicitDynamic +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/SolidMechanics_MPM.rst b/src/coreComponents/schema/docs/SolidMechanics_MPM.rst index 2c7d14f5866..35d3b93b477 100644 --- a/src/coreComponents/schema/docs/SolidMechanics_MPM.rst +++ b/src/coreComponents/schema/docs/SolidMechanics_MPM.rst @@ -34,6 +34,7 @@ timeIntegrationOption geos_SolidMechanicsMPM_TimeIntegrationOption Expl | * ExplicitDynamic treatFullyDamagedAsSingleField integer 1 Whether to consolidate fully damaged fields into a single field. Nice for modeling damaged mush. useDamageAsSurfaceFlag integer 0 Indicates whether particle damage at the beginning of the simulation should be interpreted as a surface flag +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ============================== ============================================ =============== ======================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/Solvers.rst b/src/coreComponents/schema/docs/Solvers.rst index 87f18a99508..a8779059e55 100644 --- a/src/coreComponents/schema/docs/Solvers.rst +++ b/src/coreComponents/schema/docs/Solvers.rst @@ -1,47 +1,49 @@ -============================================= ======== =========== ======================================================== -Name Type Default Description -============================================= ======== =========== ======================================================== -gravityVector R1Tensor {0,0,-9.81} Gravity vector used in the physics solvers -AcousticElasticSEM node :ref:`XML_AcousticElasticSEM` -AcousticFirstOrderSEM node :ref:`XML_AcousticFirstOrderSEM` -AcousticSEM node :ref:`XML_AcousticSEM` -AcousticVTISEM node :ref:`XML_AcousticVTISEM` -CompositionalMultiphaseFVM node :ref:`XML_CompositionalMultiphaseFVM` -CompositionalMultiphaseHybridFVM node :ref:`XML_CompositionalMultiphaseHybridFVM` -CompositionalMultiphaseReservoir node :ref:`XML_CompositionalMultiphaseReservoir` -CompositionalMultiphaseReservoirPoromechanics node :ref:`XML_CompositionalMultiphaseReservoirPoromechanics` -CompositionalMultiphaseWell node :ref:`XML_CompositionalMultiphaseWell` -ElasticFirstOrderSEM node :ref:`XML_ElasticFirstOrderSEM` -ElasticSEM node :ref:`XML_ElasticSEM` -EmbeddedSurfaceGenerator node :ref:`XML_EmbeddedSurfaceGenerator` -FlowProppantTransport node :ref:`XML_FlowProppantTransport` -Hydrofracture node :ref:`XML_Hydrofracture` -LaplaceFEM node :ref:`XML_LaplaceFEM` -MultiphasePoromechanics node :ref:`XML_MultiphasePoromechanics` -MultiphasePoromechanicsReservoir node :ref:`XML_MultiphasePoromechanicsReservoir` -PhaseFieldDamageFEM node :ref:`XML_PhaseFieldDamageFEM` -PhaseFieldFracture node :ref:`XML_PhaseFieldFracture` -ProppantTransport node :ref:`XML_ProppantTransport` -ReactiveCompositionalMultiphaseOBL node :ref:`XML_ReactiveCompositionalMultiphaseOBL` -SeismicityRate node :ref:`XML_SeismicityRate` -SinglePhaseFVM node :ref:`XML_SinglePhaseFVM` -SinglePhaseHybridFVM node :ref:`XML_SinglePhaseHybridFVM` -SinglePhasePoromechanics node :ref:`XML_SinglePhasePoromechanics` -SinglePhasePoromechanicsConformingFractures node :ref:`XML_SinglePhasePoromechanicsConformingFractures` -SinglePhasePoromechanicsEmbeddedFractures node :ref:`XML_SinglePhasePoromechanicsEmbeddedFractures` -SinglePhasePoromechanicsReservoir node :ref:`XML_SinglePhasePoromechanicsReservoir` -SinglePhaseProppantFVM node :ref:`XML_SinglePhaseProppantFVM` -SinglePhaseReservoir node :ref:`XML_SinglePhaseReservoir` -SinglePhaseReservoirPoromechanics node :ref:`XML_SinglePhaseReservoirPoromechanics` -SinglePhaseWell node :ref:`XML_SinglePhaseWell` -SolidMechanicsEmbeddedFractures node :ref:`XML_SolidMechanicsEmbeddedFractures` -SolidMechanicsLagrangeContact node :ref:`XML_SolidMechanicsLagrangeContact` -SolidMechanicsLagrangianSSLE node :ref:`XML_SolidMechanicsLagrangianSSLE` -SolidMechanics_LagrangianFEM node :ref:`XML_SolidMechanics_LagrangianFEM` -SolidMechanics_MPM node :ref:`XML_SolidMechanics_MPM` -SurfaceGenerator node :ref:`XML_SurfaceGenerator` -============================================= ======== =========== ======================================================== +==================================================== ======== =========== =============================================================== +Name Type Default Description +==================================================== ======== =========== =============================================================== +gravityVector R1Tensor {0,0,-9.81} Gravity vector used in the physics solvers +AcousticElasticSEM node :ref:`XML_AcousticElasticSEM` +AcousticFirstOrderSEM node :ref:`XML_AcousticFirstOrderSEM` +AcousticSEM node :ref:`XML_AcousticSEM` +AcousticVTISEM node :ref:`XML_AcousticVTISEM` +CompositionalMultiphaseFVM node :ref:`XML_CompositionalMultiphaseFVM` +CompositionalMultiphaseHybridFVM node :ref:`XML_CompositionalMultiphaseHybridFVM` +CompositionalMultiphaseReservoir node :ref:`XML_CompositionalMultiphaseReservoir` +CompositionalMultiphaseReservoirPoromechanics node :ref:`XML_CompositionalMultiphaseReservoirPoromechanics` +CompositionalMultiphaseWell node :ref:`XML_CompositionalMultiphaseWell` +ElasticFirstOrderSEM node :ref:`XML_ElasticFirstOrderSEM` +ElasticSEM node :ref:`XML_ElasticSEM` +EmbeddedSurfaceGenerator node :ref:`XML_EmbeddedSurfaceGenerator` +FlowProppantTransport node :ref:`XML_FlowProppantTransport` +Hydrofracture node :ref:`XML_Hydrofracture` +LaplaceFEM node :ref:`XML_LaplaceFEM` +MultiphasePoromechanics node :ref:`XML_MultiphasePoromechanics` +MultiphasePoromechanicsReservoir node :ref:`XML_MultiphasePoromechanicsReservoir` +PhaseFieldDamageFEM node :ref:`XML_PhaseFieldDamageFEM` +PhaseFieldFracture node :ref:`XML_PhaseFieldFracture` +ProppantTransport node :ref:`XML_ProppantTransport` +ReactiveCompositionalMultiphaseOBL node :ref:`XML_ReactiveCompositionalMultiphaseOBL` +SeismicityRate node :ref:`XML_SeismicityRate` +SinglePhaseFVM node :ref:`XML_SinglePhaseFVM` +SinglePhaseHybridFVM node :ref:`XML_SinglePhaseHybridFVM` +SinglePhasePoromechanics node :ref:`XML_SinglePhasePoromechanics` +SinglePhasePoromechanicsConformingFractures node :ref:`XML_SinglePhasePoromechanicsConformingFractures` +SinglePhasePoromechanicsConformingFracturesReservoir node :ref:`XML_SinglePhasePoromechanicsConformingFracturesReservoir` +SinglePhasePoromechanicsEmbeddedFractures node :ref:`XML_SinglePhasePoromechanicsEmbeddedFractures` +SinglePhasePoromechanicsReservoir node :ref:`XML_SinglePhasePoromechanicsReservoir` +SinglePhaseProppantFVM node :ref:`XML_SinglePhaseProppantFVM` +SinglePhaseReservoir node :ref:`XML_SinglePhaseReservoir` +SinglePhaseReservoirPoromechanics node :ref:`XML_SinglePhaseReservoirPoromechanics` +SinglePhaseWell node :ref:`XML_SinglePhaseWell` +SolidMechanicsAugmentedLagrangianContact node :ref:`XML_SolidMechanicsAugmentedLagrangianContact` +SolidMechanicsEmbeddedFractures node :ref:`XML_SolidMechanicsEmbeddedFractures` +SolidMechanicsLagrangeContact node :ref:`XML_SolidMechanicsLagrangeContact` +SolidMechanicsLagrangianSSLE node :ref:`XML_SolidMechanicsLagrangianSSLE` +SolidMechanics_LagrangianFEM node :ref:`XML_SolidMechanics_LagrangianFEM` +SolidMechanics_MPM node :ref:`XML_SolidMechanics_MPM` +SurfaceGenerator node :ref:`XML_SurfaceGenerator` +==================================================== ======== =========== =============================================================== diff --git a/src/coreComponents/schema/docs/Solvers_other.rst b/src/coreComponents/schema/docs/Solvers_other.rst index 3eca415d7e0..6a42cd06a7c 100644 --- a/src/coreComponents/schema/docs/Solvers_other.rst +++ b/src/coreComponents/schema/docs/Solvers_other.rst @@ -1,46 +1,48 @@ -============================================= ==== ================================================================== -Name Type Description -============================================= ==== ================================================================== -AcousticElasticSEM node :ref:`DATASTRUCTURE_AcousticElasticSEM` -AcousticFirstOrderSEM node :ref:`DATASTRUCTURE_AcousticFirstOrderSEM` -AcousticSEM node :ref:`DATASTRUCTURE_AcousticSEM` -AcousticVTISEM node :ref:`DATASTRUCTURE_AcousticVTISEM` -CompositionalMultiphaseFVM node :ref:`DATASTRUCTURE_CompositionalMultiphaseFVM` -CompositionalMultiphaseHybridFVM node :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM` -CompositionalMultiphaseReservoir node :ref:`DATASTRUCTURE_CompositionalMultiphaseReservoir` -CompositionalMultiphaseReservoirPoromechanics node :ref:`DATASTRUCTURE_CompositionalMultiphaseReservoirPoromechanics` -CompositionalMultiphaseWell node :ref:`DATASTRUCTURE_CompositionalMultiphaseWell` -ElasticFirstOrderSEM node :ref:`DATASTRUCTURE_ElasticFirstOrderSEM` -ElasticSEM node :ref:`DATASTRUCTURE_ElasticSEM` -EmbeddedSurfaceGenerator node :ref:`DATASTRUCTURE_EmbeddedSurfaceGenerator` -FlowProppantTransport node :ref:`DATASTRUCTURE_FlowProppantTransport` -Hydrofracture node :ref:`DATASTRUCTURE_Hydrofracture` -LaplaceFEM node :ref:`DATASTRUCTURE_LaplaceFEM` -MultiphasePoromechanics node :ref:`DATASTRUCTURE_MultiphasePoromechanics` -MultiphasePoromechanicsReservoir node :ref:`DATASTRUCTURE_MultiphasePoromechanicsReservoir` -PhaseFieldDamageFEM node :ref:`DATASTRUCTURE_PhaseFieldDamageFEM` -PhaseFieldFracture node :ref:`DATASTRUCTURE_PhaseFieldFracture` -ProppantTransport node :ref:`DATASTRUCTURE_ProppantTransport` -ReactiveCompositionalMultiphaseOBL node :ref:`DATASTRUCTURE_ReactiveCompositionalMultiphaseOBL` -SeismicityRate node :ref:`DATASTRUCTURE_SeismicityRate` -SinglePhaseFVM node :ref:`DATASTRUCTURE_SinglePhaseFVM` -SinglePhaseHybridFVM node :ref:`DATASTRUCTURE_SinglePhaseHybridFVM` -SinglePhasePoromechanics node :ref:`DATASTRUCTURE_SinglePhasePoromechanics` -SinglePhasePoromechanicsConformingFractures node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsConformingFractures` -SinglePhasePoromechanicsEmbeddedFractures node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsEmbeddedFractures` -SinglePhasePoromechanicsReservoir node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsReservoir` -SinglePhaseProppantFVM node :ref:`DATASTRUCTURE_SinglePhaseProppantFVM` -SinglePhaseReservoir node :ref:`DATASTRUCTURE_SinglePhaseReservoir` -SinglePhaseReservoirPoromechanics node :ref:`DATASTRUCTURE_SinglePhaseReservoirPoromechanics` -SinglePhaseWell node :ref:`DATASTRUCTURE_SinglePhaseWell` -SolidMechanicsEmbeddedFractures node :ref:`DATASTRUCTURE_SolidMechanicsEmbeddedFractures` -SolidMechanicsLagrangeContact node :ref:`DATASTRUCTURE_SolidMechanicsLagrangeContact` -SolidMechanicsLagrangianSSLE node :ref:`DATASTRUCTURE_SolidMechanicsLagrangianSSLE` -SolidMechanics_LagrangianFEM node :ref:`DATASTRUCTURE_SolidMechanics_LagrangianFEM` -SolidMechanics_MPM node :ref:`DATASTRUCTURE_SolidMechanics_MPM` -SurfaceGenerator node :ref:`DATASTRUCTURE_SurfaceGenerator` -============================================= ==== ================================================================== +==================================================== ==== ========================================================================= +Name Type Description +==================================================== ==== ========================================================================= +AcousticElasticSEM node :ref:`DATASTRUCTURE_AcousticElasticSEM` +AcousticFirstOrderSEM node :ref:`DATASTRUCTURE_AcousticFirstOrderSEM` +AcousticSEM node :ref:`DATASTRUCTURE_AcousticSEM` +AcousticVTISEM node :ref:`DATASTRUCTURE_AcousticVTISEM` +CompositionalMultiphaseFVM node :ref:`DATASTRUCTURE_CompositionalMultiphaseFVM` +CompositionalMultiphaseHybridFVM node :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM` +CompositionalMultiphaseReservoir node :ref:`DATASTRUCTURE_CompositionalMultiphaseReservoir` +CompositionalMultiphaseReservoirPoromechanics node :ref:`DATASTRUCTURE_CompositionalMultiphaseReservoirPoromechanics` +CompositionalMultiphaseWell node :ref:`DATASTRUCTURE_CompositionalMultiphaseWell` +ElasticFirstOrderSEM node :ref:`DATASTRUCTURE_ElasticFirstOrderSEM` +ElasticSEM node :ref:`DATASTRUCTURE_ElasticSEM` +EmbeddedSurfaceGenerator node :ref:`DATASTRUCTURE_EmbeddedSurfaceGenerator` +FlowProppantTransport node :ref:`DATASTRUCTURE_FlowProppantTransport` +Hydrofracture node :ref:`DATASTRUCTURE_Hydrofracture` +LaplaceFEM node :ref:`DATASTRUCTURE_LaplaceFEM` +MultiphasePoromechanics node :ref:`DATASTRUCTURE_MultiphasePoromechanics` +MultiphasePoromechanicsReservoir node :ref:`DATASTRUCTURE_MultiphasePoromechanicsReservoir` +PhaseFieldDamageFEM node :ref:`DATASTRUCTURE_PhaseFieldDamageFEM` +PhaseFieldFracture node :ref:`DATASTRUCTURE_PhaseFieldFracture` +ProppantTransport node :ref:`DATASTRUCTURE_ProppantTransport` +ReactiveCompositionalMultiphaseOBL node :ref:`DATASTRUCTURE_ReactiveCompositionalMultiphaseOBL` +SeismicityRate node :ref:`DATASTRUCTURE_SeismicityRate` +SinglePhaseFVM node :ref:`DATASTRUCTURE_SinglePhaseFVM` +SinglePhaseHybridFVM node :ref:`DATASTRUCTURE_SinglePhaseHybridFVM` +SinglePhasePoromechanics node :ref:`DATASTRUCTURE_SinglePhasePoromechanics` +SinglePhasePoromechanicsConformingFractures node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsConformingFractures` +SinglePhasePoromechanicsConformingFracturesReservoir node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsConformingFracturesReservoir` +SinglePhasePoromechanicsEmbeddedFractures node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsEmbeddedFractures` +SinglePhasePoromechanicsReservoir node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsReservoir` +SinglePhaseProppantFVM node :ref:`DATASTRUCTURE_SinglePhaseProppantFVM` +SinglePhaseReservoir node :ref:`DATASTRUCTURE_SinglePhaseReservoir` +SinglePhaseReservoirPoromechanics node :ref:`DATASTRUCTURE_SinglePhaseReservoirPoromechanics` +SinglePhaseWell node :ref:`DATASTRUCTURE_SinglePhaseWell` +SolidMechanicsAugmentedLagrangianContact node :ref:`DATASTRUCTURE_SolidMechanicsAugmentedLagrangianContact` +SolidMechanicsEmbeddedFractures node :ref:`DATASTRUCTURE_SolidMechanicsEmbeddedFractures` +SolidMechanicsLagrangeContact node :ref:`DATASTRUCTURE_SolidMechanicsLagrangeContact` +SolidMechanicsLagrangianSSLE node :ref:`DATASTRUCTURE_SolidMechanicsLagrangianSSLE` +SolidMechanics_LagrangianFEM node :ref:`DATASTRUCTURE_SolidMechanics_LagrangianFEM` +SolidMechanics_MPM node :ref:`DATASTRUCTURE_SolidMechanics_MPM` +SurfaceGenerator node :ref:`DATASTRUCTURE_SurfaceGenerator` +==================================================== ==== ========================================================================= diff --git a/src/coreComponents/schema/docs/SurfaceGenerator.rst b/src/coreComponents/schema/docs/SurfaceGenerator.rst index 36b64dffb8b..4160911ec7b 100644 --- a/src/coreComponents/schema/docs/SurfaceGenerator.rst +++ b/src/coreComponents/schema/docs/SurfaceGenerator.rst @@ -13,6 +13,7 @@ name groupName required A name is required for any nodeBasedSIF integer 0 Flag for choosing between node or edge based criteria: 1 for node based criterion rockToughness real64 required Rock toughness of the solid material targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` ========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== diff --git a/src/coreComponents/schema/docs/Tasks.rst b/src/coreComponents/schema/docs/Tasks.rst index 4b2e9649e5a..7531175fa44 100644 --- a/src/coreComponents/schema/docs/Tasks.rst +++ b/src/coreComponents/schema/docs/Tasks.rst @@ -11,6 +11,8 @@ PVTDriver node :ref:`X PackCollection node :ref:`XML_PackCollection` ReactiveFluidDriver node :ref:`XML_ReactiveFluidDriver` RelpermDriver node :ref:`XML_RelpermDriver` +SinglePhasePoromechanicsConformingFracturesInitialization node :ref:`XML_SinglePhasePoromechanicsConformingFracturesInitialization` +SinglePhasePoromechanicsEmbeddedFracturesInitialization node :ref:`XML_SinglePhasePoromechanicsEmbeddedFracturesInitialization` SinglePhasePoromechanicsInitialization node :ref:`XML_SinglePhasePoromechanicsInitialization` SinglePhaseReservoirPoromechanicsInitialization node :ref:`XML_SinglePhaseReservoirPoromechanicsInitialization` SinglePhaseStatistics node :ref:`XML_SinglePhaseStatistics` diff --git a/src/coreComponents/schema/docs/Tasks_other.rst b/src/coreComponents/schema/docs/Tasks_other.rst index 991b7d3f475..7abafe4b3b2 100644 --- a/src/coreComponents/schema/docs/Tasks_other.rst +++ b/src/coreComponents/schema/docs/Tasks_other.rst @@ -11,6 +11,8 @@ PVTDriver node :ref:`DATASTRUC PackCollection node :ref:`DATASTRUCTURE_PackCollection` ReactiveFluidDriver node :ref:`DATASTRUCTURE_ReactiveFluidDriver` RelpermDriver node :ref:`DATASTRUCTURE_RelpermDriver` +SinglePhasePoromechanicsConformingFracturesInitialization node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsConformingFracturesInitialization` +SinglePhasePoromechanicsEmbeddedFracturesInitialization node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsEmbeddedFracturesInitialization` SinglePhasePoromechanicsInitialization node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsInitialization` SinglePhaseReservoirPoromechanicsInitialization node :ref:`DATASTRUCTURE_SinglePhaseReservoirPoromechanicsInitialization` SinglePhaseStatistics node :ref:`DATASTRUCTURE_SinglePhaseStatistics` diff --git a/src/coreComponents/schema/docs/VTK.rst b/src/coreComponents/schema/docs/VTK.rst index b4e40348cb3..952b60a3267 100644 --- a/src/coreComponents/schema/docs/VTK.rst +++ b/src/coreComponents/schema/docs/VTK.rst @@ -15,7 +15,8 @@ parallelThreads integer 1 Number of plot file plotFileRoot string VTK Name of the root file for this output. plotLevel integer 1 Level detail plot. Only fields with lower of equal plot level will be output. writeFEMFaces integer 0 (no description available) -writeGhostCells integer 0 Should the face elements be written as 3d volumes or not. +writeFaceElementsAs3D integer 0 Should the face elements be written as 3d volumes or not. +writeGhostCells integer 0 Should the vtk files contain the ghost cells or not. =========================== ======================= ======== ======================================================================================================================================================================================== diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 9faa9453548..3dd908c4ea1 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -50,12 +50,12 @@ - + - + @@ -413,6 +413,10 @@ + + + + @@ -437,6 +441,10 @@ + + + + @@ -495,6 +503,14 @@ + + + + + + + + @@ -2115,7 +2131,9 @@ the relative residual norm satisfies: - + + + @@ -2163,6 +2181,7 @@ the relative residual norm satisfies: + @@ -2174,6 +2193,7 @@ the relative residual norm satisfies: + @@ -2203,6 +2223,8 @@ the relative residual norm satisfies: + + @@ -2211,6 +2233,8 @@ the relative residual norm satisfies: + + @@ -2245,6 +2269,10 @@ the relative residual norm satisfies: + + + + @@ -2253,11 +2281,18 @@ the relative residual norm satisfies: - + + + + + + + + @@ -2268,6 +2303,8 @@ the relative residual norm satisfies: + + @@ -2302,6 +2339,10 @@ the relative residual norm satisfies: + + + + @@ -2310,8 +2351,10 @@ the relative residual norm satisfies: - + + + @@ -2320,6 +2363,8 @@ the relative residual norm satisfies: + + @@ -2354,6 +2399,10 @@ the relative residual norm satisfies: + + + + @@ -2362,8 +2411,10 @@ the relative residual norm satisfies: - + + + @@ -2396,6 +2447,8 @@ the relative residual norm satisfies: + + @@ -2426,6 +2479,8 @@ the relative residual norm satisfies: + + @@ -2440,6 +2495,8 @@ the relative residual norm satisfies: + + @@ -2476,6 +2533,8 @@ the relative residual norm satisfies: + + @@ -2498,6 +2557,8 @@ the relative residual norm satisfies: + + @@ -2510,6 +2571,8 @@ the relative residual norm satisfies: + + @@ -2530,6 +2593,8 @@ the relative residual norm satisfies: + + @@ -2550,17 +2615,19 @@ the relative residual norm satisfies: - + - + + + @@ -2587,14 +2654,20 @@ Local - Add stabilization only to interiors of macro elements.--> + + - + + + + + @@ -2672,6 +2745,8 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + @@ -2706,6 +2781,10 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + + + @@ -2714,8 +2793,10 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - + + + @@ -2724,6 +2805,8 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + @@ -2758,6 +2841,10 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + + + @@ -2770,10 +2857,12 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - + + + @@ -2798,6 +2887,8 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + @@ -2818,6 +2909,8 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + @@ -2846,12 +2939,23 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + + + + + + + @@ -2881,6 +2985,8 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> * SteadyState * ImplicitTransient--> + + @@ -2906,17 +3012,19 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - + - + + + @@ -2937,6 +3045,8 @@ Local - Add stabilization only to interiors of macro elements.--> + + @@ -2965,6 +3075,8 @@ Local - Add stabilization only to interiors of macro elements.--> + + @@ -2995,6 +3107,8 @@ Local - Add stabilization only to interiors of macro elements.--> + + @@ -3037,6 +3151,8 @@ Local - Add stabilization only to interiors of macro elements.--> + + @@ -3085,6 +3201,8 @@ Local - Add stabilization only to interiors of macro elements.--> + + @@ -3111,6 +3229,8 @@ Local - Add stabilization only to interiors of macro elements.--> + + @@ -3145,6 +3265,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + @@ -3179,6 +3301,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + @@ -3199,8 +3323,19 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + + + + + + + @@ -3221,8 +3356,41 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3243,8 +3411,19 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + + + + + + + @@ -3265,6 +3444,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + @@ -3299,6 +3480,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + @@ -3319,6 +3502,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + @@ -3339,8 +3524,19 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + + + + + + + @@ -3360,10 +3556,12 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + - + @@ -3397,8 +3595,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t * ImplicitDynamic * ExplicitDynamic--> - - + + @@ -3407,6 +3605,47 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3445,6 +3684,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t * ImplicitDynamic * ExplicitDynamic--> + + @@ -3486,6 +3727,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t * ImplicitDynamic * ExplicitDynamic--> + + @@ -3527,6 +3770,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t * ImplicitDynamic * ExplicitDynamic--> + + @@ -3590,6 +3835,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + @@ -3621,6 +3868,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + @@ -3634,6 +3883,8 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + @@ -3763,6 +4014,26 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index a0fbfc4a731..89d10b3ae4e 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -50,12 +50,12 @@ - + - + @@ -528,12 +528,14 @@ + + @@ -1074,6 +1076,19 @@ + + + + + + + + + + + + + @@ -1155,6 +1170,23 @@ + + + + + + + + + + + + + + + + + @@ -1301,6 +1333,8 @@ + + @@ -1318,6 +1352,8 @@ + + diff --git a/src/docs/sphinx/CompleteXMLSchema.rst b/src/docs/sphinx/CompleteXMLSchema.rst index d15f17166bd..4fa19cfebea 100644 --- a/src/docs/sphinx/CompleteXMLSchema.rst +++ b/src/docs/sphinx/CompleteXMLSchema.rst @@ -1095,6 +1095,20 @@ Element: SinglePhasePoromechanicsConformingFractures .. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures.rst +.. _XML_SinglePhasePoromechanicsConformingFracturesInitialization: + +Element: SinglePhasePoromechanicsConformingFracturesInitialization +================================================================== +.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization.rst + + +.. _XML_SinglePhasePoromechanicsConformingFracturesReservoir: + +Element: SinglePhasePoromechanicsConformingFracturesReservoir +============================================================= +.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir.rst + + .. _XML_SinglePhasePoromechanicsEmbeddedFractures: Element: SinglePhasePoromechanicsEmbeddedFractures @@ -1102,6 +1116,13 @@ Element: SinglePhasePoromechanicsEmbeddedFractures .. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures.rst +.. _XML_SinglePhasePoromechanicsEmbeddedFracturesInitialization: + +Element: SinglePhasePoromechanicsEmbeddedFracturesInitialization +================================================================ +.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization.rst + + .. _XML_SinglePhasePoromechanicsInitialization: Element: SinglePhasePoromechanicsInitialization @@ -1172,6 +1193,13 @@ Element: SolidInternalEnergy .. include:: ../../coreComponents/schema/docs/SolidInternalEnergy.rst +.. _XML_SolidMechanicsAugmentedLagrangianContact: + +Element: SolidMechanicsAugmentedLagrangianContact +================================================= +.. include:: ../../coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst + + .. _XML_SolidMechanicsEmbeddedFractures: Element: SolidMechanicsEmbeddedFractures @@ -2562,6 +2590,20 @@ Datastructure: SinglePhasePoromechanicsConformingFractures .. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst +.. _DATASTRUCTURE_SinglePhasePoromechanicsConformingFracturesInitialization: + +Datastructure: SinglePhasePoromechanicsConformingFracturesInitialization +======================================================================== +.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization_other.rst + + +.. _DATASTRUCTURE_SinglePhasePoromechanicsConformingFracturesReservoir: + +Datastructure: SinglePhasePoromechanicsConformingFracturesReservoir +=================================================================== +.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir_other.rst + + .. _DATASTRUCTURE_SinglePhasePoromechanicsEmbeddedFractures: Datastructure: SinglePhasePoromechanicsEmbeddedFractures @@ -2569,6 +2611,13 @@ Datastructure: SinglePhasePoromechanicsEmbeddedFractures .. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst +.. _DATASTRUCTURE_SinglePhasePoromechanicsEmbeddedFracturesInitialization: + +Datastructure: SinglePhasePoromechanicsEmbeddedFracturesInitialization +====================================================================== +.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization_other.rst + + .. _DATASTRUCTURE_SinglePhasePoromechanicsInitialization: Datastructure: SinglePhasePoromechanicsInitialization @@ -2639,6 +2688,13 @@ Datastructure: SolidInternalEnergy .. include:: ../../coreComponents/schema/docs/SolidInternalEnergy_other.rst +.. _DATASTRUCTURE_SolidMechanicsAugmentedLagrangianContact: + +Datastructure: SolidMechanicsAugmentedLagrangianContact +======================================================= +.. include:: ../../coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact_other.rst + + .. _DATASTRUCTURE_SolidMechanicsEmbeddedFractures: Datastructure: SolidMechanicsEmbeddedFractures From 25a9aab2509df955aaa7c0a5a9d42f002f21191b Mon Sep 17 00:00:00 2001 From: William R Tobin <4522899+wrtobin@users.noreply.github.com> Date: Mon, 1 Jul 2024 17:40:58 -0700 Subject: [PATCH 119/286] style: Rename postProcessInput > postInputInitialization (#3198) * rename Group function postProcessInput > postInputInitialization for clarity --------- Co-authored-by: Randolph Settgast --- .../BrooksCoreyCapillaryPressure.cpp | 4 +-- .../BrooksCoreyCapillaryPressure.hpp | 2 +- .../CapillaryPressureBase.cpp | 4 +-- .../CapillaryPressureBase.hpp | 2 +- .../JFunctionCapillaryPressure.cpp | 4 +-- .../JFunctionCapillaryPressure.hpp | 2 +- .../TableCapillaryPressure.cpp | 4 +-- .../TableCapillaryPressure.hpp | 2 +- .../VanGenuchtenCapillaryPressure.cpp | 4 +-- .../VanGenuchtenCapillaryPressure.hpp | 2 +- .../constitutive/contact/ContactBase.cpp | 2 +- .../constitutive/contact/ContactBase.hpp | 2 +- .../constitutive/contact/CoulombContact.cpp | 2 +- .../constitutive/contact/CoulombContact.hpp | 2 +- .../deprecated/ApertureTableContact.cpp | 2 +- .../deprecated/ApertureTableContact.hpp | 2 +- .../diffusion/ConstantDiffusion.cpp | 2 +- .../diffusion/ConstantDiffusion.hpp | 2 +- .../constitutive/diffusion/DiffusionBase.cpp | 4 +-- .../constitutive/diffusion/DiffusionBase.hpp | 2 +- .../dispersion/DispersionBase.cpp | 4 +-- .../dispersion/DispersionBase.hpp | 2 +- .../dispersion/LinearIsotropicDispersion.cpp | 2 +- .../dispersion/LinearIsotropicDispersion.hpp | 2 +- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 4 +-- .../multifluid/CO2Brine/CO2BrineFluid.hpp | 2 +- .../fluid/multifluid/MultiFluidBase.cpp | 4 +-- .../fluid/multifluid/MultiFluidBase.hpp | 2 +- .../fluid/multifluid/PVTDriver.cpp | 2 +- .../fluid/multifluid/PVTDriver.hpp | 2 +- .../multifluid/blackOil/BlackOilFluid.cpp | 4 +-- .../multifluid/blackOil/BlackOilFluid.hpp | 2 +- .../multifluid/blackOil/BlackOilFluidBase.cpp | 4 +-- .../multifluid/blackOil/BlackOilFluidBase.hpp | 2 +- .../CompositionalMultiphaseFluid.cpp | 6 ++-- .../CompositionalMultiphaseFluid.hpp | 2 +- ...CompositionalMultiphaseFluidPVTPackage.cpp | 4 +-- ...CompositionalMultiphaseFluidPVTPackage.hpp | 2 +- .../models/ConstantViscosity.cpp | 4 +-- .../models/ConstantViscosity.hpp | 2 +- .../models/LohrenzBrayClarkViscosity.cpp | 4 +-- .../models/LohrenzBrayClarkViscosity.hpp | 2 +- .../compositional/models/ModelParameters.hpp | 8 ++--- .../reactive/ReactiveBrineFluid.cpp | 4 +-- .../reactive/ReactiveBrineFluid.hpp | 2 +- .../reactive/ReactiveFluidDriver.cpp | 2 +- .../reactive/ReactiveFluidDriver.hpp | 2 +- .../reactive/ReactiveMultiFluid.cpp | 4 +-- .../reactive/ReactiveMultiFluid.hpp | 2 +- .../CompressibleSinglePhaseFluid.cpp | 4 +-- .../CompressibleSinglePhaseFluid.hpp | 2 +- .../fluid/singlefluid/ParticleFluid.cpp | 4 +-- .../fluid/singlefluid/ParticleFluid.hpp | 2 +- .../fluid/singlefluid/ParticleFluidBase.cpp | 4 +-- .../fluid/singlefluid/ParticleFluidBase.hpp | 2 +- .../fluid/singlefluid/ProppantSlurryFluid.cpp | 4 +-- .../fluid/singlefluid/ProppantSlurryFluid.hpp | 2 +- .../fluid/singlefluid/SingleFluidBase.cpp | 4 +-- .../fluid/singlefluid/SingleFluidBase.hpp | 2 +- .../fluid/singlefluid/SlurryFluidBase.cpp | 4 +-- .../fluid/singlefluid/SlurryFluidBase.hpp | 2 +- .../ThermalCompressibleSinglePhaseFluid.cpp | 4 +-- .../ThermalCompressibleSinglePhaseFluid.hpp | 2 +- .../permeability/ConstantPermeability.cpp | 2 +- .../permeability/ConstantPermeability.hpp | 2 +- .../permeability/PressurePermeability.cpp | 2 +- .../permeability/PressurePermeability.hpp | 2 +- .../permeability/ProppantPermeability.cpp | 2 +- .../permeability/ProppantPermeability.hpp | 2 +- .../BrooksCoreyBakerRelativePermeability.cpp | 4 +-- .../BrooksCoreyBakerRelativePermeability.hpp | 2 +- .../BrooksCoreyRelativePermeability.cpp | 4 +-- .../BrooksCoreyRelativePermeability.hpp | 2 +- .../BrooksCoreyStone2RelativePermeability.cpp | 4 +-- .../BrooksCoreyStone2RelativePermeability.hpp | 2 +- .../RelativePermeabilityBase.cpp | 4 +-- .../RelativePermeabilityBase.hpp | 2 +- .../relativePermeability/RelpermDriver.cpp | 2 +- .../relativePermeability/RelpermDriver.hpp | 2 +- .../TableRelativePermeability.cpp | 4 +-- .../TableRelativePermeability.hpp | 2 +- .../TableRelativePermeabilityHysteresis.cpp | 4 +-- .../TableRelativePermeabilityHysteresis.hpp | 2 +- .../VanGenuchtenBakerRelativePermeability.cpp | 4 +-- .../VanGenuchtenBakerRelativePermeability.hpp | 2 +- ...VanGenuchtenStone2RelativePermeability.cpp | 4 +-- ...VanGenuchtenStone2RelativePermeability.hpp | 2 +- .../constitutive/solid/CeramicDamage.cpp | 4 +-- .../constitutive/solid/CeramicDamage.hpp | 2 +- .../constitutive/solid/Damage.cpp | 4 +-- .../constitutive/solid/Damage.hpp | 2 +- .../constitutive/solid/DelftEgg.cpp | 4 +-- .../constitutive/solid/DelftEgg.hpp | 2 +- .../PoreVolumeCompressibleSolid.cpp | 2 +- .../PoreVolumeCompressibleSolid.hpp | 2 +- .../solid/Deprecated/PoroElastic.cpp | 4 +-- .../solid/Deprecated/PoroElastic.hpp | 2 +- .../constitutive/solid/DruckerPrager.cpp | 4 +-- .../constitutive/solid/DruckerPrager.hpp | 2 +- .../solid/DruckerPragerExtended.cpp | 4 +-- .../solid/DruckerPragerExtended.hpp | 2 +- .../constitutive/solid/DuvautLionsSolid.cpp | 4 +-- .../constitutive/solid/DuvautLionsSolid.hpp | 2 +- .../constitutive/solid/ElasticIsotropic.cpp | 4 +-- .../constitutive/solid/ElasticIsotropic.hpp | 2 +- .../ElasticIsotropicPressureDependent.cpp | 4 +-- .../ElasticIsotropicPressureDependent.hpp | 2 +- .../constitutive/solid/ElasticOrthotropic.cpp | 4 +-- .../constitutive/solid/ElasticOrthotropic.hpp | 2 +- .../solid/ElasticTransverseIsotropic.cpp | 4 +-- .../solid/ElasticTransverseIsotropic.hpp | 2 +- .../constitutive/solid/ModifiedCamClay.cpp | 4 +-- .../constitutive/solid/ModifiedCamClay.hpp | 2 +- .../constitutive/solid/PerfectlyPlastic.cpp | 4 +-- .../constitutive/solid/PerfectlyPlastic.hpp | 2 +- .../constitutive/solid/SolidBase.cpp | 2 +- .../constitutive/solid/SolidBase.hpp | 2 +- .../constitutive/solid/TriaxialDriver.cpp | 2 +- .../constitutive/solid/TriaxialDriver.hpp | 2 +- .../solid/porosity/BiotPorosity.cpp | 4 +-- .../solid/porosity/BiotPorosity.hpp | 2 +- .../solid/porosity/PorosityBase.cpp | 2 +- .../solid/porosity/PorosityBase.hpp | 2 +- .../solid/porosity/PressurePorosity.cpp | 4 +-- .../solid/porosity/PressurePorosity.hpp | 2 +- .../solid/porosity/ProppantPorosity.cpp | 2 +- .../solid/porosity/ProppantPorosity.hpp | 2 +- .../MultiPhaseConstantThermalConductivity.cpp | 2 +- .../MultiPhaseConstantThermalConductivity.hpp | 2 +- .../MultiPhaseThermalConductivityBase.cpp | 4 +-- .../MultiPhaseThermalConductivityBase.hpp | 2 +- ...PhaseVolumeWeightedThermalConductivity.cpp | 2 +- ...PhaseVolumeWeightedThermalConductivity.hpp | 2 +- ...SinglePhaseConstantThermalConductivity.cpp | 2 +- ...SinglePhaseConstantThermalConductivity.hpp | 2 +- .../SinglePhaseThermalConductivityBase.cpp | 4 +-- .../SinglePhaseThermalConductivityBase.hpp | 2 +- .../unitTests/testDruckerPrager.cpp | 4 +-- .../unitTests/testElasticIsotropic.cpp | 2 +- .../unitTests/testModifiedCamClay.cpp | 2 +- src/coreComponents/dataRepository/Group.cpp | 10 ++----- src/coreComponents/dataRepository/Group.hpp | 6 ++-- src/coreComponents/events/EventBase.hpp | 2 +- src/coreComponents/events/tasks/TaskBase.cpp | 2 +- src/coreComponents/events/tasks/TaskBase.hpp | 4 +-- .../AquiferBoundaryCondition.cpp | 2 +- .../AquiferBoundaryCondition.hpp | 2 +- .../EquilibriumInitialCondition.cpp | 2 +- .../EquilibriumInitialCondition.hpp | 2 +- .../PerfectlyMatchedLayer.cpp | 2 +- .../PerfectlyMatchedLayer.hpp | 2 +- .../SourceFluxStatistics.cpp | 4 +-- .../SourceFluxStatistics.hpp | 4 +-- .../TractionBoundaryCondition.cpp | 2 +- .../TractionBoundaryCondition.hpp | 2 +- .../fileIO/Outputs/SiloOutput.cpp | 2 +- .../fileIO/Outputs/SiloOutput.hpp | 2 +- .../fileIO/Outputs/VTKOutput.cpp | 2 +- .../fileIO/Outputs/VTKOutput.hpp | 2 +- .../fileIO/python/PyVTKOutput.cpp | 4 +-- .../FiniteElementDiscretization.cpp | 2 +- .../FiniteElementDiscretization.hpp | 2 +- src/coreComponents/functions/FunctionBase.hpp | 2 +- .../mainInterface/ProblemManager.cpp | 4 +-- .../mainInterface/ProblemManager.hpp | 2 +- src/coreComponents/mesh/Perforation.cpp | 2 +- src/coreComponents/mesh/Perforation.hpp | 2 +- .../generators/ExternalMeshGeneratorBase.cpp | 2 +- .../generators/ExternalMeshGeneratorBase.hpp | 2 +- .../mesh/generators/InternalMeshGenerator.cpp | 2 +- .../mesh/generators/InternalMeshGenerator.hpp | 2 +- .../mesh/generators/InternalWellGenerator.cpp | 2 +- .../mesh/generators/InternalWellGenerator.hpp | 2 +- .../generators/InternalWellboreGenerator.cpp | 4 +-- .../generators/InternalWellboreGenerator.hpp | 2 +- .../mesh/generators/ParticleMeshGenerator.cpp | 4 +-- .../mesh/generators/ParticleMeshGenerator.hpp | 2 +- .../mesh/generators/WellGeneratorBase.cpp | 2 +- .../mesh/generators/WellGeneratorBase.hpp | 2 +- .../mesh/simpleGeometricObjects/Box.cpp | 2 +- .../mesh/simpleGeometricObjects/Box.hpp | 2 +- .../CustomPolarObject.cpp | 2 +- .../CustomPolarObject.hpp | 2 +- .../mesh/simpleGeometricObjects/Disc.cpp | 2 +- .../mesh/simpleGeometricObjects/Disc.hpp | 2 +- .../mesh/simpleGeometricObjects/Rectangle.cpp | 4 +-- .../mesh/simpleGeometricObjects/Rectangle.hpp | 2 +- .../simpleGeometricObjects/ThickPlane.cpp | 2 +- .../simpleGeometricObjects/ThickPlane.hpp | 2 +- .../physicsSolvers/FieldStatisticsBase.hpp | 2 +- .../physicsSolvers/LinearSolverParameters.cpp | 2 +- .../physicsSolvers/LinearSolverParameters.hpp | 2 +- .../NonlinearSolverParameters.cpp | 2 +- .../NonlinearSolverParameters.hpp | 2 +- .../contact/ContactSolverBase.cpp | 4 +-- .../contact/ContactSolverBase.hpp | 2 +- .../SolidMechanicsEmbeddedFractures.cpp | 4 +-- .../SolidMechanicsEmbeddedFractures.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 4 +-- .../fluidFlow/CompositionalMultiphaseBase.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 4 +-- .../fluidFlow/CompositionalMultiphaseFVM.hpp | 2 +- .../CompositionalMultiphaseStatistics.cpp | 4 +-- .../CompositionalMultiphaseStatistics.hpp | 2 +- .../ReactiveCompositionalMultiphaseOBL.cpp | 4 +-- .../ReactiveCompositionalMultiphaseOBL.hpp | 2 +- .../proppantTransport/ProppantTransport.cpp | 4 +-- .../proppantTransport/ProppantTransport.hpp | 2 +- .../wells/CompositionalMultiphaseWell.cpp | 4 +-- .../wells/CompositionalMultiphaseWell.hpp | 2 +- .../fluidFlow/wells/WellControls.cpp | 2 +- .../fluidFlow/wells/WellControls.hpp | 4 +-- .../fluidFlow/wells/WellSolverBase.cpp | 4 +-- .../fluidFlow/wells/WellSolverBase.hpp | 2 +- .../inducedSeismicity/SeismicityRate.cpp | 4 +-- .../inducedSeismicity/SeismicityRate.hpp | 2 +- .../multiphysics/CoupledSolver.hpp | 2 +- .../multiphysics/HydrofractureSolver.cpp | 4 +-- .../multiphysics/HydrofractureSolver.hpp | 2 +- .../multiphysics/MultiphasePoromechanics.cpp | 4 +-- .../multiphysics/MultiphasePoromechanics.hpp | 2 +- .../multiphysics/PhaseFieldFractureSolver.cpp | 4 +-- .../multiphysics/PhaseFieldFractureSolver.hpp | 2 +- .../PoromechanicsInitialization.cpp | 4 +-- .../PoromechanicsInitialization.hpp | 2 +- .../multiphysics/SinglePhasePoromechanics.cpp | 4 +-- .../multiphysics/SinglePhasePoromechanics.hpp | 2 +- ...glePhasePoromechanicsEmbeddedFractures.cpp | 4 +-- ...glePhasePoromechanicsEmbeddedFractures.hpp | 2 +- .../simplePDE/PhaseFieldDamageFEM.cpp | 4 +-- .../simplePDE/PhaseFieldDamageFEM.hpp | 2 +- .../SolidMechanicsLagrangianFEM.cpp | 4 +-- .../SolidMechanicsLagrangianFEM.hpp | 2 +- .../solidMechanics/SolidMechanicsMPM.cpp | 4 +-- .../solidMechanics/SolidMechanicsMPM.hpp | 2 +- .../SolidMechanicsStateReset.cpp | 2 +- .../SolidMechanicsStateReset.hpp | 2 +- .../surfaceGeneration/SurfaceGenerator.cpp | 2 +- .../surfaceGeneration/SurfaceGenerator.hpp | 2 +- .../AcousticFirstOrderWaveEquationSEM.cpp | 4 +-- .../AcousticFirstOrderWaveEquationSEM.hpp | 2 +- .../AcousticVTIWaveEquationSEM.cpp | 4 +-- .../AcousticVTIWaveEquationSEM.hpp | 2 +- .../isotropic/AcousticWaveEquationSEM.cpp | 4 +-- .../isotropic/AcousticWaveEquationSEM.hpp | 2 +- .../AcousticElasticWaveEquationSEM.hpp | 4 +-- .../ElasticFirstOrderWaveEquationSEM.cpp | 4 +-- .../ElasticFirstOrderWaveEquationSEM.hpp | 2 +- .../isotropic/ElasticWaveEquationSEM.cpp | 4 +-- .../isotropic/ElasticWaveEquationSEM.hpp | 2 +- .../wavePropagation/shared/WaveSolverBase.cpp | 6 ++-- .../wavePropagation/shared/WaveSolverBase.hpp | 2 +- .../schema/docs/Hydrofracture.rst | 6 +--- ...anicsConformingFracturesInitialization.rst | 12 ++++++++ ...onformingFracturesInitialization_other.rst | 9 ++++++ ...omechanicsConformingFracturesReservoir.rst | 18 ++++++++++++ ...nicsConformingFracturesReservoir_other.rst | 14 +++++++++ ...chanicsEmbeddedFracturesInitialization.rst | 12 ++++++++ ...sEmbeddedFracturesInitialization_other.rst | 9 ++++++ ...lidMechanicsAugmentedLagrangianContact.rst | 29 +++++++++++++++++++ ...hanicsAugmentedLagrangianContact_other.rst | 16 ++++++++++ .../schema/docs/TimeHistory.rst | 1 + src/coreComponents/schema/schema.xsd | 4 +++ .../testCapillaryPressure.cpp | 16 +++++----- .../constitutiveTests/testDamage.cpp | 2 +- .../testMultiFluidCO2Brine.cpp | 2 +- ...FluidCompositionalMultiphasePVTPackage.cpp | 2 +- .../testMultiFluidDeadOil.cpp | 4 +-- .../testMultiFluidLiveOil.cpp | 2 +- .../constitutiveTests/testRelPerm.cpp | 20 ++++++------- .../testRelPermHysteresis.cpp | 2 +- .../testAquiferBoundaryCondition.cpp | 2 +- .../testDofManagerUtils.hpp | 2 +- .../meshTests/testMeshGeneration.cpp | 2 +- .../unitTests/meshTests/testVTKImport.cpp | 2 +- .../testConformingVirtualElementOrder1.cpp | 4 +-- 276 files changed, 502 insertions(+), 386 deletions(-) create mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization.rst create mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization_other.rst create mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir.rst create mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir_other.rst create mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization.rst create mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization_other.rst create mode 100644 src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst create mode 100644 src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact_other.rst diff --git a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp index 10518b167d8..630dae66ff9 100644 --- a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp @@ -56,9 +56,9 @@ BrooksCoreyCapillaryPressure::BrooksCoreyCapillaryPressure( string const & name, setDescription( "Factor used to scale the phase capillary pressure, defined as: one minus the sum of the phase minimum volume fractions." ); } -void BrooksCoreyCapillaryPressure::postProcessInput() +void BrooksCoreyCapillaryPressure::postInputInitialization() { - CapillaryPressureBase::postProcessInput(); + CapillaryPressureBase::postInputInitialization(); auto const checkInputSize = [&]( auto const & array, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp index 2f00ed8d076..9834b029970 100644 --- a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp @@ -118,7 +118,7 @@ class BrooksCoreyCapillaryPressure : public CapillaryPressureBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; array1d< real64 > m_phaseMinVolumeFraction; array1d< real64 > m_phaseCapPressureExponentInv; diff --git a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp index 22e71e4b4b5..b372188451a 100644 --- a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp @@ -48,9 +48,9 @@ CapillaryPressureBase::CapillaryPressureBase( string const & name, } -void CapillaryPressureBase::postProcessInput() +void CapillaryPressureBase::postInputInitialization() { - ConstitutiveBase::postProcessInput(); + ConstitutiveBase::postInputInitialization(); integer const numPhases = numFluidPhases(); GEOS_THROW_IF_LT_MSG( numPhases, 2, diff --git a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp index 00c980b3de1..e6ff0fb2d23 100644 --- a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp @@ -176,7 +176,7 @@ class CapillaryPressureBase : public ConstitutiveBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; // phase names read from input string_array m_phaseNames; diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp index b0eba72f703..8ed27aba071 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp @@ -120,9 +120,9 @@ JFunctionCapillaryPressure::JFunctionCapillaryPressure( std::string const & name setRestartFlags( RestartFlags::NO_WRITE ); } -void JFunctionCapillaryPressure::postProcessInput() +void JFunctionCapillaryPressure::postInputInitialization() { - CapillaryPressureBase::postProcessInput(); + CapillaryPressureBase::postInputInitialization(); integer const numPhases = m_phaseNames.size(); GEOS_THROW_IF( numPhases != 2 && numPhases != 3, diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp index a72a9cf4348..f61d8edc8ce 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp @@ -128,7 +128,7 @@ class JFunctionCapillaryPressure : public CapillaryPressureBase private: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp index 878ba48e23e..d805c527f33 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp @@ -67,9 +67,9 @@ TableCapillaryPressure::TableCapillaryPressure( std::string const & name, setRestartFlags( RestartFlags::NO_WRITE ); } -void TableCapillaryPressure::postProcessInput() +void TableCapillaryPressure::postInputInitialization() { - CapillaryPressureBase::postProcessInput(); + CapillaryPressureBase::postInputInitialization(); integer const numPhases = m_phaseNames.size(); GEOS_THROW_IF( numPhases != 2 && numPhases != 3, diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp index 53eeba07732..6d50f0a1ea6 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp @@ -95,7 +95,7 @@ class TableCapillaryPressure : public CapillaryPressureBase private: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp index 9aa6213f0ec..39982df95e0 100644 --- a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp @@ -59,9 +59,9 @@ VanGenuchtenCapillaryPressure::VanGenuchtenCapillaryPressure( string const & nam } -void VanGenuchtenCapillaryPressure::postProcessInput() +void VanGenuchtenCapillaryPressure::postInputInitialization() { - CapillaryPressureBase::postProcessInput(); + CapillaryPressureBase::postInputInitialization(); localIndex const NP = numFluidPhases(); diff --git a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp index 9f22ee55f80..027fbb64efc 100644 --- a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp @@ -117,7 +117,7 @@ class VanGenuchtenCapillaryPressure : public CapillaryPressureBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; array1d< real64 > m_phaseMinVolumeFraction; array1d< real64 > m_phaseCapPressureExponentInv; diff --git a/src/coreComponents/constitutive/contact/ContactBase.cpp b/src/coreComponents/constitutive/contact/ContactBase.cpp index 72523513d2b..9c68adfa84d 100644 --- a/src/coreComponents/constitutive/contact/ContactBase.cpp +++ b/src/coreComponents/constitutive/contact/ContactBase.cpp @@ -67,7 +67,7 @@ ContactBase::~ContactBase() {} -void ContactBase::postProcessInput() +void ContactBase::postInputInitialization() { GEOS_THROW_IF( m_apertureTableName.empty(), diff --git a/src/coreComponents/constitutive/contact/ContactBase.hpp b/src/coreComponents/constitutive/contact/ContactBase.hpp index 98dc22b0af2..9d06e65749a 100644 --- a/src/coreComponents/constitutive/contact/ContactBase.hpp +++ b/src/coreComponents/constitutive/contact/ContactBase.hpp @@ -212,7 +212,7 @@ class ContactBase : public ConstitutiveBase }; protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/constitutive/contact/CoulombContact.cpp b/src/coreComponents/constitutive/contact/CoulombContact.cpp index 49d98a9244e..a573684c22e 100644 --- a/src/coreComponents/constitutive/contact/CoulombContact.cpp +++ b/src/coreComponents/constitutive/contact/CoulombContact.cpp @@ -51,7 +51,7 @@ CoulombContact::CoulombContact( string const & name, Group * const parent ): CoulombContact::~CoulombContact() {} -void CoulombContact::postProcessInput() +void CoulombContact::postInputInitialization() { GEOS_THROW_IF( m_frictionCoefficient < 0.0, getFullName() << ": The provided friction coefficient is less than zero. Value: " << m_frictionCoefficient, diff --git a/src/coreComponents/constitutive/contact/CoulombContact.hpp b/src/coreComponents/constitutive/contact/CoulombContact.hpp index 1d49dfa9e4e..115ff0debb5 100644 --- a/src/coreComponents/constitutive/contact/CoulombContact.hpp +++ b/src/coreComponents/constitutive/contact/CoulombContact.hpp @@ -166,7 +166,7 @@ class CoulombContact : public ContactBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp b/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp index 8bcfc1fd689..9313e991f6e 100644 --- a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp +++ b/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp @@ -54,7 +54,7 @@ ApertureTableContact::ApertureTableContact( string const & name, ApertureTableContact::~ApertureTableContact() {} -void ApertureTableContact::postProcessInput() +void ApertureTableContact::postInputInitialization() { FunctionManager const & functionManager = FunctionManager::getInstance(); diff --git a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp b/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp index 9ed749274d5..297a1b2b95c 100644 --- a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp +++ b/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp @@ -141,7 +141,7 @@ class ApertureTableContact : public ContactBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp index 45128b09e6c..62b2f4ff0a2 100644 --- a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp +++ b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp @@ -59,7 +59,7 @@ void ConstantDiffusion::allocateConstitutiveData( dataRepository::Group & parent } } -void ConstantDiffusion::postProcessInput() +void ConstantDiffusion::postInputInitialization() { GEOS_THROW_IF( m_diffusivityComponents.size() != 3, GEOS_FMT( "{}: the size of the diffusivity must be equal to 3", diff --git a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp index f4ae6c98348..71ff2273779 100644 --- a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp +++ b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp @@ -95,7 +95,7 @@ class ConstantDiffusion : public DiffusionBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp index ae0d0aa7542..619e5894afb 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp @@ -44,9 +44,9 @@ DiffusionBase::DiffusionBase( string const & name, Group * const parent ) registerField( fields::diffusion::phaseDiffusivityMultiplier{}, &m_phaseDiffusivityMultiplier ); } -void DiffusionBase::postProcessInput() +void DiffusionBase::postInputInitialization() { - ConstitutiveBase::postProcessInput(); + ConstitutiveBase::postInputInitialization(); integer const numPhases = numFluidPhases(); GEOS_THROW_IF_LT_MSG( numPhases, 2, diff --git a/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp b/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp index d6bd8d831de..724f9e27565 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp @@ -168,7 +168,7 @@ class DiffusionBase : public ConstitutiveBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// phase names read from input string_array m_phaseNames; diff --git a/src/coreComponents/constitutive/dispersion/DispersionBase.cpp b/src/coreComponents/constitutive/dispersion/DispersionBase.cpp index e41084afdd2..93c635e1f29 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionBase.cpp +++ b/src/coreComponents/constitutive/dispersion/DispersionBase.cpp @@ -33,9 +33,9 @@ DispersionBase::DispersionBase( string const & name, Group * const parent ) registerField( fields::dispersion::dispersivity{}, &m_dispersivity ); } -void DispersionBase::postProcessInput() +void DispersionBase::postInputInitialization() { - ConstitutiveBase::postProcessInput(); + ConstitutiveBase::postInputInitialization(); m_dispersivity.resize( 0, 0, 3 ); } diff --git a/src/coreComponents/constitutive/dispersion/DispersionBase.hpp b/src/coreComponents/constitutive/dispersion/DispersionBase.hpp index b2d368322f1..022965353b9 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionBase.hpp +++ b/src/coreComponents/constitutive/dispersion/DispersionBase.hpp @@ -129,7 +129,7 @@ class DispersionBase : public ConstitutiveBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// cell-wise dispersivity in the subregion /// TODO: support full tensor if linear isotropic diffusion is no longer enough diff --git a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp index fab77fad476..2396c8d8985 100644 --- a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp +++ b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp @@ -42,7 +42,7 @@ LinearIsotropicDispersion::deliverClone( string const & name, return DispersionBase::deliverClone( name, parent ); } -void LinearIsotropicDispersion::postProcessInput() +void LinearIsotropicDispersion::postInputInitialization() { GEOS_THROW_IF( m_longitudinalDispersivity < 0, GEOS_FMT( "{}: longitudinal dispersivity must be positive", diff --git a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp index 423ab5766fd..05c67404feb 100644 --- a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp +++ b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp @@ -111,7 +111,7 @@ class LinearIsotropicDispersion : public DispersionBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 907ca230af5..87cbcdcec4c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -204,9 +204,9 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::initializePreSubGroups() } template< typename PHASE1, typename PHASE2, typename FLASH > -void CO2BrineFluid< PHASE1, PHASE2, FLASH >::postProcessInput() +void CO2BrineFluid< PHASE1, PHASE2, FLASH >::postInputInitialization() { - MultiFluidBase::postProcessInput(); + MultiFluidBase::postInputInitialization(); GEOS_THROW_IF_NE_MSG( numFluidPhases(), 2, GEOS_FMT( "{}: invalid number of phases", getFullName() ), diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp index 835a475fec1..612d01e1fc3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp @@ -162,7 +162,7 @@ class CO2BrineFluid : public MultiFluidBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp index 139e8507a01..e00a0e88641 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp @@ -157,9 +157,9 @@ void MultiFluidBase::allocateConstitutiveData( dataRepository::Group & parent, resizeFields( parent.size(), numConstitutivePointsPerParentIndex ); } -void MultiFluidBase::postProcessInput() +void MultiFluidBase::postInputInitialization() { - ConstitutiveBase::postProcessInput(); + ConstitutiveBase::postInputInitialization(); integer const numComp = numFluidComponents(); integer const numPhase = numFluidPhases(); diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp index e31d513cd3b..6dbf9e15438 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp @@ -651,7 +651,7 @@ class MultiFluidBase : public ConstitutiveBase */ virtual void resizeFields( localIndex const size, localIndex const numPts ); - virtual void postProcessInput() override; + virtual void postInputInitialization() override; // flag indicating whether input/output component fractions are treated as mass fractions int m_useMass; diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp index 83de5223ad4..6184280deb1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp @@ -92,7 +92,7 @@ PVTDriver::PVTDriver( const string & name, setDescription( "Baseline file" ); } -void PVTDriver::postProcessInput() +void PVTDriver::postInputInitialization() { // Validate some inputs GEOS_ERROR_IF( m_outputMassDensity != 0 && m_outputMassDensity != 1, diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp index c81814ac5fd..557dc93757e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp @@ -44,7 +44,7 @@ class PVTDriver : public TaskBase static string catalogName() { return "PVTDriver"; } - void postProcessInput() override; + void postInputInitialization() override; virtual bool execute( real64 const GEOS_UNUSED_PARAM( time_n ), real64 const GEOS_UNUSED_PARAM( dt ), diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp index 87b7475167f..ca6d17faa67 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp @@ -37,9 +37,9 @@ BlackOilFluid::BlackOilFluid( string const & name, .setRestartFlags( RestartFlags::NO_WRITE ); } -void BlackOilFluid::postProcessInput() +void BlackOilFluid::postInputInitialization() { - BlackOilFluidBase::postProcessInput(); + BlackOilFluidBase::postInputInitialization(); GEOS_THROW_IF_NE_MSG( numFluidPhases(), 3, GEOS_FMT( "{}: this model only supports three-phase flow", getFullName() ), diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp index 52716ec7a4e..97bbc5003ee 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp @@ -261,7 +261,7 @@ class BlackOilFluid : public BlackOilFluidBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp index dd25bff6eb9..de7ac866c2b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp @@ -160,11 +160,11 @@ integer BlackOilFluidBase::getWaterPhaseIndex() const return PVTProps::PVTFunctionHelpers::findName( m_phaseNames, expectedWaterPhaseNames, viewKeyStruct::phaseNamesString() ); } -void BlackOilFluidBase::postProcessInput() +void BlackOilFluidBase::postInputInitialization() { m_componentNames = m_phaseNames; - MultiFluidBase::postProcessInput(); + MultiFluidBase::postInputInitialization(); m_phaseTypes.resize( numFluidPhases() ); m_phaseOrder.resizeDefault( MAX_NUM_PHASES, -1 ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp index 30e25c4e1cd..96ec825909b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp @@ -128,7 +128,7 @@ class BlackOilFluidBase : public MultiFluidBase virtual integer getWaterPhaseIndex() const override final; - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePostSubGroups() override; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp index 0b7d2403e5a..05fb49acc66 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp @@ -116,9 +116,9 @@ void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::allocateCons } template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > -void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::postProcessInput() +void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::postInputInitialization() { - MultiFluidBase::postProcessInput(); + MultiFluidBase::postInputInitialization(); integer const NC = numFluidComponents(); integer const NP = numFluidPhases(); @@ -178,7 +178,7 @@ void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::postProcessI } } - m_parameters->postProcessInput( this, *m_componentProperties ); + m_parameters->postInputInitialization( this, *m_componentProperties ); } template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp index 6d66c971ece..562b0eecf49 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp @@ -104,7 +104,7 @@ class CompositionalMultiphaseFluid : public MultiFluidBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePostSubGroups() override; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp index 17948157954..0c9e875a536 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp @@ -76,9 +76,9 @@ integer CompositionalMultiphaseFluidPVTPackage::getWaterPhaseIndex() const return PVTProps::PVTFunctionHelpers::findName( m_phaseNames, expectedWaterPhaseNames, viewKeyStruct::phaseNamesString() ); } -void CompositionalMultiphaseFluidPVTPackage::postProcessInput() +void CompositionalMultiphaseFluidPVTPackage::postInputInitialization() { - MultiFluidBase::postProcessInput(); + MultiFluidBase::postInputInitialization(); auto const getPVTPackagePhaseType = [&]( string const & phaseName ) { diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp index 32c4af5957c..34c08cddad6 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp @@ -125,7 +125,7 @@ class CompositionalMultiphaseFluidPVTPackage : public MultiFluidBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePostSubGroups() override; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp index 0879c590adf..08969c8cf75 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp @@ -69,8 +69,8 @@ void ConstantViscosity::Parameters::registerParametersImpl( MultiFluidBase * flu setDescription( "Constant phase viscosity" ); } -void ConstantViscosity::Parameters::postProcessInputImpl( MultiFluidBase const * fluid, - ComponentProperties const & componentProperties ) +void ConstantViscosity::Parameters::postInputInitializationImpl( MultiFluidBase const * fluid, + ComponentProperties const & componentProperties ) { GEOS_UNUSED_VAR( componentProperties ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp index a4f0a733c17..253facef979 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp @@ -88,7 +88,7 @@ class ConstantViscosity : public FunctionBase private: void registerParametersImpl( MultiFluidBase * fluid ) override; - void postProcessInputImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) override; + void postInputInitializationImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) override; struct viewKeyStruct { diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp index d6ce442163f..f159eb9d755 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp @@ -83,8 +83,8 @@ void LohrenzBrayClarkViscosity::Parameters::registerParametersImpl( MultiFluidBa EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::concat( "\n* " ) ); } -void LohrenzBrayClarkViscosity::Parameters::postProcessInputImpl( MultiFluidBase const * fluid, - ComponentProperties const & componentProperties ) +void LohrenzBrayClarkViscosity::Parameters::postInputInitializationImpl( MultiFluidBase const * fluid, + ComponentProperties const & componentProperties ) { integer const numComponents = fluid->numFluidComponents(); diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp index 9319513049d..cdd591d100c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp @@ -299,7 +299,7 @@ class LohrenzBrayClarkViscosity : public FunctionBase private: void registerParametersImpl( MultiFluidBase * fluid ) override; - void postProcessInputImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) override; + void postInputInitializationImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) override; struct viewKeyStruct { diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp index 8cb23ff898f..17afda8e4ba 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp @@ -47,12 +47,12 @@ class ModelParameters } } - void postProcessInput( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) + void postInputInitialization( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) { - postProcessInputImpl( fluid, componentProperties ); + postInputInitializationImpl( fluid, componentProperties ); if( baseParameters ) { - baseParameters->postProcessInput( fluid, componentProperties ); + baseParameters->postInputInitialization( fluid, componentProperties ); } } @@ -73,7 +73,7 @@ class ModelParameters GEOS_UNUSED_VAR( fluid ); } - virtual void postProcessInputImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) + virtual void postInputInitializationImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) { GEOS_UNUSED_VAR( fluid ); GEOS_UNUSED_VAR( componentProperties ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index 93b463ccdd3..dce987363f0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -111,9 +111,9 @@ integer ReactiveBrineFluid< PHASE > ::getWaterPhaseIndex() const template< typename PHASE > -void ReactiveBrineFluid< PHASE > ::postProcessInput() +void ReactiveBrineFluid< PHASE > ::postInputInitialization() { - ReactiveMultiFluid::postProcessInput(); + ReactiveMultiFluid::postInputInitialization(); GEOS_THROW_IF_NE_MSG( numFluidPhases(), 1, GEOS_FMT( "{}: invalid number of phases", getFullName() ), diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp index 0be8a28c8c9..43440de852d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp @@ -155,7 +155,7 @@ class ReactiveBrineFluid : public ReactiveMultiFluid protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.cpp index e0e826b0f2e..48ad15e5730 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.cpp @@ -73,7 +73,7 @@ ReactiveFluidDriver::~ReactiveFluidDriver() {} -void ReactiveFluidDriver::postProcessInput() +void ReactiveFluidDriver::postInputInitialization() { // get number of phases and components diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp index 9982c4db8a1..0866c812ca2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp @@ -49,7 +49,7 @@ class ReactiveFluidDriver : public TaskBase static string catalogName() { return "ReactiveFluidDriver"; } - void postProcessInput() override; + void postInputInitialization() override; virtual bool execute( real64 const GEOS_UNUSED_PARAM( time_n ), real64 const GEOS_UNUSED_PARAM( dt ), diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp index 669cfe5e84d..f7687ab2201 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp @@ -59,9 +59,9 @@ std::unique_ptr< ConstitutiveBase > ReactiveMultiFluid:: return clone; } -void ReactiveMultiFluid::postProcessInput() +void ReactiveMultiFluid::postInputInitialization() { - MultiFluidBase::postProcessInput(); + MultiFluidBase::postInputInitialization(); GEOS_THROW_IF_NE_MSG( numFluidPhases(), 1, GEOS_FMT( "{}: invalid number of phases", getFullName() ), diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp index 959fdf35282..c5f19ff1652 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp @@ -171,7 +171,7 @@ class ReactiveMultiFluid : public MultiFluidBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; void createChemicalReactions(); diff --git a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp index 6c896110e64..d571b77449e 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp @@ -92,9 +92,9 @@ void CompressibleSinglePhaseFluid::allocateConstitutiveData( dataRepository::Gro m_viscosity.setValues< serialPolicy >( m_referenceViscosity ); } -void CompressibleSinglePhaseFluid::postProcessInput() +void CompressibleSinglePhaseFluid::postInputInitialization() { - SingleFluidBase::postProcessInput(); + SingleFluidBase::postInputInitialization(); auto const checkNonnegative = [&]( real64 const value, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp index 7758989391d..b1e41890953 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp @@ -181,7 +181,7 @@ class CompressibleSinglePhaseFluid : public SingleFluidBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// default density value real64 m_defaultDensity; diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp index ee186e16c4f..7de1fd667a6 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp @@ -79,9 +79,9 @@ ParticleFluid::ParticleFluid( string const & name, Group * const parent ): ParticleFluid::~ParticleFluid() = default; -void ParticleFluid::postProcessInput() +void ParticleFluid::postInputInitialization() { - ParticleFluidBase::postProcessInput(); + ParticleFluidBase::postInputInitialization(); GEOS_ERROR_IF( m_proppantDensity < 500.0, "Invalid proppantDensity in ParticleFluid " diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp index 609b6a47d10..5e3b2782b46 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp @@ -225,7 +225,7 @@ class ParticleFluid : public ParticleFluidBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp index eb77cbc78ad..2e9b68b3fcf 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp @@ -54,9 +54,9 @@ ParticleFluidBase::ParticleFluidBase( string const & name, Group * const parent ParticleFluidBase::~ParticleFluidBase() = default; -void ParticleFluidBase::postProcessInput() +void ParticleFluidBase::postInputInitialization() { - ConstitutiveBase::postProcessInput(); + ConstitutiveBase::postInputInitialization(); } void ParticleFluidBase::allocateConstitutiveData( Group & parent, diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp index c027b4110cd..b155f32311d 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp @@ -160,7 +160,7 @@ class ParticleFluidBase : public ConstitutiveBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; array1d< real64 > m_settlingFactor; array1d< real64 > m_dSettlingFactor_dPressure; diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp index 713a0f04b45..11f3bf75a28 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp @@ -73,9 +73,9 @@ void ProppantSlurryFluid::allocateConstitutiveData( dataRepository::Group & pare } -void ProppantSlurryFluid::postProcessInput() +void ProppantSlurryFluid::postInputInitialization() { - SlurryFluidBase::postProcessInput(); + SlurryFluidBase::postInputInitialization(); GEOS_ERROR_IF_LT_MSG( m_compressibility, 0.0, getFullName() << ": invalid value of " << viewKeyStruct::compressibilityString() ); diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp index 2637c19adb2..1c3ebbd335b 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp @@ -334,7 +334,7 @@ class ProppantSlurryFluid : public SlurryFluidBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp index 0f7f6a5cc1c..82c56f8d369 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp @@ -51,9 +51,9 @@ SingleFluidBase::SingleFluidBase( string const & name, Group * const parent ) } -void SingleFluidBase::postProcessInput() +void SingleFluidBase::postInputInitialization() { - ConstitutiveBase::postProcessInput(); + ConstitutiveBase::postInputInitialization(); // for fracture elements, set the default value getField< fields::singlefluid::density_n >(). diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp index 2f04795b81c..f6fcaafd941 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp @@ -277,7 +277,7 @@ class SingleFluidBase : public ConstitutiveBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; //START_SPHINX_INCLUDE_00 array2d< real64 > m_density; diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp index 1c4b6199357..bd7bd573c02 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp @@ -81,9 +81,9 @@ SlurryFluidBase::SlurryFluidBase( string const & name, Group * const parent ): SlurryFluidBase::~SlurryFluidBase() = default; -void SlurryFluidBase::postProcessInput() +void SlurryFluidBase::postInputInitialization() { - SingleFluidBase::postProcessInput(); + SingleFluidBase::postInputInitialization(); localIndex const NC = numFluidComponents(); diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp index 24e0efc989f..fd262767eee 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp @@ -305,7 +305,7 @@ class SlurryFluidBase : public SingleFluidBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; string_array m_componentNames; diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp index 96ffa8bf5f7..16a9cb0737e 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp @@ -71,9 +71,9 @@ void ThermalCompressibleSinglePhaseFluid::allocateConstitutiveData( dataReposito m_internalEnergy.setValues< serialPolicy >( m_referenceInternalEnergy ); } -void ThermalCompressibleSinglePhaseFluid::postProcessInput() +void ThermalCompressibleSinglePhaseFluid::postInputInitialization() { - CompressibleSinglePhaseFluid::postProcessInput(); + CompressibleSinglePhaseFluid::postInputInitialization(); auto const checkNonnegative = [&]( real64 const value, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp index e20130bf9fb..5192f3cdee6 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp @@ -248,7 +248,7 @@ class ThermalCompressibleSinglePhaseFluid : public CompressibleSinglePhaseFluid protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp b/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp index f6c8ec0dc67..d8256300b58 100644 --- a/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp @@ -87,7 +87,7 @@ void ConstantPermeability::initializeState() const } ); } -void ConstantPermeability::postProcessInput() +void ConstantPermeability::postInputInitialization() {} REGISTER_CATALOG_ENTRY( ConstitutiveBase, ConstantPermeability, string const &, Group * const ) diff --git a/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp b/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp index 51a7206d152..4ef6c3d3546 100644 --- a/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp @@ -80,7 +80,7 @@ class ConstantPermeability : public PermeabilityBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp index 8e1444c491c..ac6f10adb95 100644 --- a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp @@ -66,7 +66,7 @@ PressurePermeability::deliverClone( string const & name, return PermeabilityBase::deliverClone( name, parent ); } -void PressurePermeability::postProcessInput() +void PressurePermeability::postInputInitialization() { for( localIndex i=0; i < 3; i++ ) { diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.hpp b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp index 8751dd7f247..1ac6416a907 100644 --- a/src/coreComponents/constitutive/permeability/PressurePermeability.hpp +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp @@ -184,7 +184,7 @@ class PressurePermeability : public PermeabilityBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp b/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp index 77a8b1eb49f..b0de6d15d8f 100644 --- a/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp @@ -60,7 +60,7 @@ ProppantPermeability::deliverClone( string const & name, return ConstitutiveBase::deliverClone( name, parent ); } -void ProppantPermeability::postProcessInput() +void ProppantPermeability::postInputInitialization() { real64 const oneMinusMaxConcentration = ( 1.0 - m_maxProppantConcentration ); m_proppantPackPermeability = m_proppantDiameter * m_proppantDiameter / 180.0; diff --git a/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp b/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp index f1e8e85b596..af82be8becc 100644 --- a/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp @@ -152,7 +152,7 @@ class ProppantPermeability : public PermeabilityBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp index 8dc5da9a18b..62c278374b2 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp @@ -65,9 +65,9 @@ BrooksCoreyBakerRelativePermeability::BrooksCoreyBakerRelativePermeability( stri } -void BrooksCoreyBakerRelativePermeability::postProcessInput() +void BrooksCoreyBakerRelativePermeability::postInputInitialization() { - RelativePermeabilityBase::postProcessInput(); + RelativePermeabilityBase::postInputInitialization(); GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp index a2c748bacb5..635e4098e94 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp @@ -143,7 +143,7 @@ class BrooksCoreyBakerRelativePermeability : public RelativePermeabilityBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; array1d< real64 > m_phaseMinVolumeFraction; diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp index 30f2a310abd..e4df2968770 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp @@ -56,9 +56,9 @@ BrooksCoreyRelativePermeability::BrooksCoreyRelativePermeability( string const & } -void BrooksCoreyRelativePermeability::postProcessInput() +void BrooksCoreyRelativePermeability::postInputInitialization() { - RelativePermeabilityBase::postProcessInput(); + RelativePermeabilityBase::postInputInitialization(); auto const checkInputSize = [&]( auto const & array, auto const & attribute ) { diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp index 5e8890f32f5..e6132c1d2ea 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp @@ -109,7 +109,7 @@ class BrooksCoreyRelativePermeability : public RelativePermeabilityBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; //START_SPHINX_INCLUDE_02 array1d< real64 > m_phaseMinVolumeFraction; diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp index 2ab7a3ff330..b84773fb4b2 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp @@ -65,9 +65,9 @@ BrooksCoreyStone2RelativePermeability::BrooksCoreyStone2RelativePermeability( st } -void BrooksCoreyStone2RelativePermeability::postProcessInput() +void BrooksCoreyStone2RelativePermeability::postInputInitialization() { - RelativePermeabilityBase::postProcessInput(); + RelativePermeabilityBase::postInputInitialization(); GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp index df5b11d80a6..03cf2e8ed97 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp @@ -141,7 +141,7 @@ class BrooksCoreyStone2RelativePermeability : public RelativePermeabilityBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; array1d< real64 > m_phaseMinVolumeFraction; diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp index d72ce6443b6..2b7fb74fe3d 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp @@ -50,9 +50,9 @@ RelativePermeabilityBase::RelativePermeabilityBase( string const & name, Group * } -void RelativePermeabilityBase::postProcessInput() +void RelativePermeabilityBase::postInputInitialization() { - ConstitutiveBase::postProcessInput(); + ConstitutiveBase::postInputInitialization(); integer const numPhases = numFluidPhases(); GEOS_THROW_IF_LT_MSG( numPhases, 2, diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp index e0315f8afa3..a044506ba09 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp @@ -200,7 +200,7 @@ class RelativePermeabilityBase : public ConstitutiveBase */ virtual void resizeFields( localIndex const size, localIndex const numPts ); - virtual void postProcessInput() override; + virtual void postInputInitialization() override; // phase names read from input string_array m_phaseNames; diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriver.cpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriver.cpp index 0689c2b86d8..3d22f910972 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriver.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriver.cpp @@ -86,7 +86,7 @@ void RelpermDriver::outputResults() } -void RelpermDriver::postProcessInput() +void RelpermDriver::postInputInitialization() { constitutive::ConstitutiveManager & constitutiveManager = this->getGroupByPath< constitutive::ConstitutiveManager >( "/Problem/domain/Constitutive" ); diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriver.hpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriver.hpp index cbfa1dc4361..01cbef32c12 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriver.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriver.hpp @@ -31,7 +31,7 @@ class RelpermDriver : public TaskBase static string catalogName() { return "RelpermDriver"; } - void postProcessInput() override; + void postInputInitialization() override; virtual bool execute( real64 const GEOS_UNUSED_PARAM( time_n ), real64 const GEOS_UNUSED_PARAM( dt ), diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp index 74a2dba31af..bdfd705a79b 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp @@ -84,9 +84,9 @@ TableRelativePermeability::TableRelativePermeability( std::string const & name, "Valid options \n* " + EnumStrings< ThreePhaseInterpolator >::concat( "\n* " ) ); } -void TableRelativePermeability::postProcessInput() +void TableRelativePermeability::postInputInitialization() { - RelativePermeabilityBase::postProcessInput(); + RelativePermeabilityBase::postInputInitialization(); integer const numPhases = m_phaseNames.size(); GEOS_THROW_IF( numPhases != 2 && numPhases != 3, diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp index e0dbf5a59e4..54c0e6a8736 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp @@ -145,7 +145,7 @@ class TableRelativePermeability : public RelativePermeabilityBase private: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp index 79ae8653649..9f5c69fff14 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp @@ -161,9 +161,9 @@ TableRelativePermeabilityHysteresis::TableRelativePermeabilityHysteresis( std::s } -void TableRelativePermeabilityHysteresis::postProcessInput() +void TableRelativePermeabilityHysteresis::postInputInitialization() { - RelativePermeabilityBase::postProcessInput(); + RelativePermeabilityBase::postInputInitialization(); using IPT = TableRelativePermeabilityHysteresis::ImbibitionPhasePairPhaseType; diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp index b4275a01594..f71f03217c3 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp @@ -447,7 +447,7 @@ class TableRelativePermeabilityHysteresis : public RelativePermeabilityBase private: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp index ba5b2fb2e97..e412e3addaf 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp @@ -67,9 +67,9 @@ VanGenuchtenBakerRelativePermeability::VanGenuchtenBakerRelativePermeability( st } -void VanGenuchtenBakerRelativePermeability::postProcessInput() +void VanGenuchtenBakerRelativePermeability::postInputInitialization() { - RelativePermeabilityBase::postProcessInput(); + RelativePermeabilityBase::postInputInitialization(); GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp index c38ce75a230..175fd2721f1 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp @@ -141,7 +141,7 @@ class VanGenuchtenBakerRelativePermeability : public RelativePermeabilityBase arrayView1d< real64 const > getPhaseMinVolumeFraction() const override { return m_phaseMinVolumeFraction; }; protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; array1d< real64 > m_phaseMinVolumeFraction; diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp index 020e9c24a9e..30759972158 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp @@ -67,9 +67,9 @@ VanGenuchtenStone2RelativePermeability::VanGenuchtenStone2RelativePermeability( } -void VanGenuchtenStone2RelativePermeability::postProcessInput() +void VanGenuchtenStone2RelativePermeability::postInputInitialization() { - RelativePermeabilityBase::postProcessInput(); + RelativePermeabilityBase::postInputInitialization(); GEOS_THROW_IF( m_phaseOrder[PhaseType::OIL] < 0, GEOS_FMT( "{}: reference oil phase has not been defined and must be included in model", getFullName() ), diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp index 3e93a8264e5..6d34746887d 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp @@ -142,7 +142,7 @@ class VanGenuchtenStone2RelativePermeability : public RelativePermeabilityBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; array1d< real64 > m_phaseMinVolumeFraction; diff --git a/src/coreComponents/constitutive/solid/CeramicDamage.cpp b/src/coreComponents/constitutive/solid/CeramicDamage.cpp index 592fd05ab35..c3975da55cd 100644 --- a/src/coreComponents/constitutive/solid/CeramicDamage.cpp +++ b/src/coreComponents/constitutive/solid/CeramicDamage.cpp @@ -83,9 +83,9 @@ void CeramicDamage::allocateConstitutiveData( dataRepository::Group & parent, } -void CeramicDamage::postProcessInput() +void CeramicDamage::postInputInitialization() { - ElasticIsotropic::postProcessInput(); + ElasticIsotropic::postInputInitialization(); GEOS_THROW_IF( m_tensileStrength < 0.0, "Tensile strength must be a positive number.", InputError ); GEOS_THROW_IF( m_compressiveStrength < m_tensileStrength, "Compressive strength must be greater than tensile strength.", InputError ); diff --git a/src/coreComponents/constitutive/solid/CeramicDamage.hpp b/src/coreComponents/constitutive/solid/CeramicDamage.hpp index 3ff7d16e0a1..be1c0db91d4 100644 --- a/src/coreComponents/constitutive/solid/CeramicDamage.hpp +++ b/src/coreComponents/constitutive/solid/CeramicDamage.hpp @@ -525,7 +525,7 @@ class CeramicDamage : public ElasticIsotropic protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// State variable: The damage values for each quadrature point array2d< real64 > m_damage; diff --git a/src/coreComponents/constitutive/solid/Damage.cpp b/src/coreComponents/constitutive/solid/Damage.cpp index 4812112f17c..baea6072a5e 100644 --- a/src/coreComponents/constitutive/solid/Damage.cpp +++ b/src/coreComponents/constitutive/solid/Damage.cpp @@ -97,9 +97,9 @@ Damage< BASE >::Damage( string const & name, Group * const parent ): template< typename BASE > -void Damage< BASE >::postProcessInput() +void Damage< BASE >::postInputInitialization() { - BASE::postProcessInput(); + BASE::postInputInitialization(); GEOS_ERROR_IF( m_extDrivingForceFlag != 0 && m_extDrivingForceFlag!= 1, BASE::getDataContext() << ": invalid external driving force flag option - must" diff --git a/src/coreComponents/constitutive/solid/Damage.hpp b/src/coreComponents/constitutive/solid/Damage.hpp index 6ad834d7205..8683735f8d8 100644 --- a/src/coreComponents/constitutive/solid/Damage.hpp +++ b/src/coreComponents/constitutive/solid/Damage.hpp @@ -281,7 +281,7 @@ class Damage : public BASE static string catalogName() { return string( "Damage" ) + BASE::m_catalogNameString; } virtual string getCatalogName() const override { return catalogName(); } - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void allocateConstitutiveData( dataRepository::Group & parent, localIndex const numConstitutivePointsPerParentIndex ) override; diff --git a/src/coreComponents/constitutive/solid/DelftEgg.cpp b/src/coreComponents/constitutive/solid/DelftEgg.cpp index 695e6cad813..9089384081f 100644 --- a/src/coreComponents/constitutive/solid/DelftEgg.cpp +++ b/src/coreComponents/constitutive/solid/DelftEgg.cpp @@ -108,9 +108,9 @@ void DelftEgg::allocateConstitutiveData( Group & parent, } -void DelftEgg::postProcessInput() +void DelftEgg::postInputInitialization() { - ElasticIsotropic::postProcessInput(); + ElasticIsotropic::postInputInitialization(); GEOS_THROW_IF( m_defaultCslSlope <= 0, getFullName() << ": Non-positive slope of critical state line detected", InputError ); diff --git a/src/coreComponents/constitutive/solid/DelftEgg.hpp b/src/coreComponents/constitutive/solid/DelftEgg.hpp index 8a318c16b83..6eb44420301 100644 --- a/src/coreComponents/constitutive/solid/DelftEgg.hpp +++ b/src/coreComponents/constitutive/solid/DelftEgg.hpp @@ -583,7 +583,7 @@ class DelftEgg : public ElasticIsotropic protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// Material parameter: The default value of the recompression index real64 m_defaultRecompressionIndex; diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp index 5c87d625358..0f8a5edd306 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp @@ -72,7 +72,7 @@ void PoreVolumeCompressibleSolid::allocateConstitutiveData( dataRepository::Grou m_poreVolumeMultiplier.setValues< serialPolicy >( 1.0 ); } -void PoreVolumeCompressibleSolid::postProcessInput() +void PoreVolumeCompressibleSolid::postInputInitialization() { if( m_compressibility < 0.0 ) { diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp index fc1af76b002..2e398cc4e73 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp @@ -61,7 +61,7 @@ class PoreVolumeCompressibleSolid : public ConstitutiveBase }; protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp index edb54dbfff1..9762dfa0be0 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp @@ -73,9 +73,9 @@ PoroElastic< BASE >::~PoroElastic() {} template< typename BASE > -void PoroElastic< BASE >::postProcessInput() +void PoroElastic< BASE >::postInputInitialization() { - BASE::postProcessInput(); + BASE::postInputInitialization(); m_poreVolumeRelation.setCoefficients( m_referencePressure, 1.0, m_compressibility ); } diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp index 2ea0eb55029..eb65ce71d51 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp @@ -121,7 +121,7 @@ class PoroElastic : public BASE virtual string getCatalogName() const override { return catalogName(); } /// Post-process XML input - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /** * @brief Deliver a clone of this object diff --git a/src/coreComponents/constitutive/solid/DruckerPrager.cpp b/src/coreComponents/constitutive/solid/DruckerPrager.cpp index 37d67fd8be4..cf466aa2103 100644 --- a/src/coreComponents/constitutive/solid/DruckerPrager.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPrager.cpp @@ -97,9 +97,9 @@ void DruckerPrager::allocateConstitutiveData( dataRepository::Group & parent, } -void DruckerPrager::postProcessInput() +void DruckerPrager::postInputInitialization() { - ElasticIsotropic::postProcessInput(); + ElasticIsotropic::postInputInitialization(); GEOS_THROW_IF( m_defaultCohesion < 0, getFullName() << ": Negative cohesion value detected", InputError ); diff --git a/src/coreComponents/constitutive/solid/DruckerPrager.hpp b/src/coreComponents/constitutive/solid/DruckerPrager.hpp index de29b6a4298..5f30cd2c94d 100644 --- a/src/coreComponents/constitutive/solid/DruckerPrager.hpp +++ b/src/coreComponents/constitutive/solid/DruckerPrager.hpp @@ -465,7 +465,7 @@ class DruckerPrager : public ElasticIsotropic protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// Material parameter: The default value of yield surface slope real64 m_defaultFrictionAngle; diff --git a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp index 90e260f77bc..560d69504cf 100644 --- a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp @@ -113,9 +113,9 @@ void DruckerPragerExtended::allocateConstitutiveData( dataRepository::Group & pa } -void DruckerPragerExtended::postProcessInput() +void DruckerPragerExtended::postInputInitialization() { - ElasticIsotropic::postProcessInput(); + ElasticIsotropic::postInputInitialization(); GEOS_THROW_IF( m_defaultCohesion < 0, getFullName() << ": Negative cohesion value detected", InputError ); diff --git a/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp b/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp index 2e3c33cff29..4fc4efa0290 100644 --- a/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp +++ b/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp @@ -504,7 +504,7 @@ class DruckerPragerExtended : public ElasticIsotropic protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// Material parameter: The default value of the initial yield surface slope real64 m_defaultInitialFrictionAngle; diff --git a/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp b/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp index c7e67141dee..0e2a80e0637 100644 --- a/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp +++ b/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp @@ -44,9 +44,9 @@ DuvautLionsSolid< BASE >::DuvautLionsSolid( string const & name, Group * const p template< typename BASE > -void DuvautLionsSolid< BASE >::postProcessInput() +void DuvautLionsSolid< BASE >::postInputInitialization() { - BASE::postProcessInput(); + BASE::postInputInitialization(); } template< typename BASE > diff --git a/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp b/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp index 04091d1790d..70e0290ff64 100644 --- a/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp +++ b/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp @@ -160,7 +160,7 @@ class DuvautLionsSolid : public BASE real64 relaxationTime() const { return m_relaxationTime; } - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void allocateConstitutiveData( dataRepository::Group & parent, localIndex const numConstitutivePointsPerParentIndex ) override; diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp b/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp index 46d9ce7212e..2ed7496e295 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp @@ -63,11 +63,11 @@ ElasticIsotropic::ElasticIsotropic( string const & name, Group * const parent ): ElasticIsotropic::~ElasticIsotropic() {} -void ElasticIsotropic::postProcessInput() +void ElasticIsotropic::postInputInitialization() { // check what constants the user actually input, and do conversions as needed - SolidBase::postProcessInput(); + SolidBase::postInputInitialization(); real64 & nu = getReference< real64 >( viewKeyStruct::defaultPoissonRatioString() ); real64 & E = getReference< real64 >( viewKeyStruct::defaultYoungModulusString() ); diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp b/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp index 26d076ca949..a1443372195 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp @@ -544,7 +544,7 @@ class ElasticIsotropic : public SolidBase protected: /// Post-process XML data - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// The default value of the bulk modulus for any new allocations. real64 m_defaultBulkModulus; diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp index 3e1c565983c..e7fc2d6e237 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp @@ -77,11 +77,11 @@ ElasticIsotropicPressureDependent::~ElasticIsotropicPressureDependent() {} -void ElasticIsotropicPressureDependent::postProcessInput() +void ElasticIsotropicPressureDependent::postInputInitialization() { // check what constants the user actually input, and do conversions as needed - SolidBase::postProcessInput(); + SolidBase::postInputInitialization(); real64 & G = m_defaultShearModulus; real64 & Cr = m_defaultRecompressionIndex; diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp index 823e44e8609..b22f1901525 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp @@ -565,7 +565,7 @@ class ElasticIsotropicPressureDependent : public SolidBase protected: /// Post-process XML data - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// The default value of the bulk modulus for any new allocations. real64 m_defaultRefPressure; diff --git a/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp b/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp index 93c748e3361..d22f3dbd30a 100644 --- a/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp @@ -175,9 +175,9 @@ ElasticOrthotropic::ElasticOrthotropic( string const & name, Group * const paren ElasticOrthotropic::~ElasticOrthotropic() {} -void ElasticOrthotropic::postProcessInput() +void ElasticOrthotropic::postInputInitialization() { - SolidBase::postProcessInput(); + SolidBase::postInputInitialization(); real64 & c11 = getReference< real64 >( viewKeyStruct::defaultC11String() ); real64 & c12 = getReference< real64 >( viewKeyStruct::defaultC12String() ); diff --git a/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp b/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp index 56731703729..b74f040ecb8 100644 --- a/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp @@ -729,7 +729,7 @@ class ElasticOrthotropic : public SolidBase } protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// The default value of the Young's modulus E1 for any new /// allocations. diff --git a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp index 55982285a85..7b40296c091 100644 --- a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp @@ -112,9 +112,9 @@ ElasticTransverseIsotropic::ElasticTransverseIsotropic( string const & name, Gro ElasticTransverseIsotropic::~ElasticTransverseIsotropic() {} -void ElasticTransverseIsotropic::postProcessInput() +void ElasticTransverseIsotropic::postInputInitialization() { - SolidBase::postProcessInput(); + SolidBase::postInputInitialization(); real64 & c11 = getReference< real64 >( viewKeyStruct::defaultC11String() ); real64 & c13 = getReference< real64 >( viewKeyStruct::defaultC13String() ); diff --git a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp index de8833cbcb0..b4aae986e2d 100644 --- a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp @@ -574,7 +574,7 @@ class ElasticTransverseIsotropic : public SolidBase } protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// The default value of the transverse Young's modulus for any new /// allocations. diff --git a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp index 8f7ff754a4e..37368134856 100644 --- a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp +++ b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp @@ -86,9 +86,9 @@ void ModifiedCamClay::allocateConstitutiveData( dataRepository::Group & parent, } -void ModifiedCamClay::postProcessInput() +void ModifiedCamClay::postInputInitialization() { - ElasticIsotropicPressureDependent::postProcessInput(); + ElasticIsotropicPressureDependent::postInputInitialization(); GEOS_THROW_IF( m_defaultCslSlope <= 0, getFullName() << ": Non-positive slope of critical state line detected", InputError ); diff --git a/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp b/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp index 9657578e84a..a440b1ce6d6 100644 --- a/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp +++ b/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp @@ -588,7 +588,7 @@ class ModifiedCamClay : public ElasticIsotropicPressureDependent protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// Material parameter: The default value of the virgin compression index real64 m_defaultVirginCompressionIndex; diff --git a/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp b/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp index f6ff767c937..33ae57cbfeb 100644 --- a/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp +++ b/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp @@ -53,9 +53,9 @@ void PerfectlyPlastic::allocateConstitutiveData( dataRepository::Group & parent, } -void PerfectlyPlastic::postProcessInput() +void PerfectlyPlastic::postInputInitialization() { - ElasticIsotropic::postProcessInput(); + ElasticIsotropic::postInputInitialization(); GEOS_THROW_IF( m_defaultYieldStress < 0.0, "Negative yield stress detected", InputError ); diff --git a/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp b/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp index 5732d9a440d..82b0db7c721 100644 --- a/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp +++ b/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp @@ -324,7 +324,7 @@ class PerfectlyPlastic : public ElasticIsotropic protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// Material parameter: The default value of yield stress real64 m_defaultYieldStress; diff --git a/src/coreComponents/constitutive/solid/SolidBase.cpp b/src/coreComponents/constitutive/solid/SolidBase.cpp index b213b037996..88f8c097741 100644 --- a/src/coreComponents/constitutive/solid/SolidBase.cpp +++ b/src/coreComponents/constitutive/solid/SolidBase.cpp @@ -69,7 +69,7 @@ SolidBase::~SolidBase() {} -void SolidBase::postProcessInput() +void SolidBase::postInputInitialization() { this->getWrapper< array2d< real64 > >( viewKeyStruct::densityString() ). setApplyDefaultValue( m_defaultDensity ); diff --git a/src/coreComponents/constitutive/solid/SolidBase.hpp b/src/coreComponents/constitutive/solid/SolidBase.hpp index 79292fd8bee..59010fd1d51 100644 --- a/src/coreComponents/constitutive/solid/SolidBase.hpp +++ b/src/coreComponents/constitutive/solid/SolidBase.hpp @@ -677,7 +677,7 @@ class SolidBase : public constitutive::ConstitutiveBase protected: /// Post-process XML input - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// The current stress at a quadrature point (i.e. at timestep n, global newton iteration k) array3d< real64, solid::STRESS_PERMUTATION > m_newStress; diff --git a/src/coreComponents/constitutive/solid/TriaxialDriver.cpp b/src/coreComponents/constitutive/solid/TriaxialDriver.cpp index 4a02fe0e9d7..26646693f50 100644 --- a/src/coreComponents/constitutive/solid/TriaxialDriver.cpp +++ b/src/coreComponents/constitutive/solid/TriaxialDriver.cpp @@ -74,7 +74,7 @@ TriaxialDriver::~TriaxialDriver() {} -void TriaxialDriver::postProcessInput() +void TriaxialDriver::postInputInitialization() { // initialize table functions diff --git a/src/coreComponents/constitutive/solid/TriaxialDriver.hpp b/src/coreComponents/constitutive/solid/TriaxialDriver.hpp index ac41efae878..51ef0e19a68 100644 --- a/src/coreComponents/constitutive/solid/TriaxialDriver.hpp +++ b/src/coreComponents/constitutive/solid/TriaxialDriver.hpp @@ -57,7 +57,7 @@ class TriaxialDriver : public TaskBase static string catalogName() { return "TriaxialDriver"; } - void postProcessInput() override; + void postInputInitialization() override; virtual bool execute( real64 const GEOS_UNUSED_PARAM( time_n ), real64 const GEOS_UNUSED_PARAM( dt ), diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp index ec781ad0d8f..293a4d2ec88 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp @@ -78,9 +78,9 @@ void BiotPorosity::allocateConstitutiveData( dataRepository::Group & parent, m_meanTotalStressIncrement_k.resize( 0, numConstitutivePointsPerParentIndex ); } -void BiotPorosity::postProcessInput() +void BiotPorosity::postInputInitialization() { - PorosityBase::postProcessInput(); + PorosityBase::postInputInitialization(); getWrapper< array1d< real64 > >( fields::porosity::thermalExpansionCoefficient::key() ). setApplyDefaultValue( m_defaultThermalExpansionCoefficient ); diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp index a6ae9e38815..dbc0aa3cbe2 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp @@ -309,7 +309,7 @@ class BiotPorosity : public PorosityBase } protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// Default thermal expansion coefficients (read from XML) diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp b/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp index 7bd1990640d..174dddec809 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp @@ -67,7 +67,7 @@ void PorosityBase::allocateConstitutiveData( dataRepository::Group & parent, ConstitutiveBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); } -void PorosityBase::postProcessInput() +void PorosityBase::postInputInitialization() { getField< fields::porosity::referencePorosity >(). setApplyDefaultValue( m_defaultReferencePorosity ); diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp index 395f209e1f7..6bc53305c7f 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp @@ -268,7 +268,7 @@ class PorosityBase : public ConstitutiveBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; array2d< real64 > m_newPorosity; diff --git a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp index 18cc9d31a08..37f50525dcd 100644 --- a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp @@ -46,9 +46,9 @@ void PressurePorosity::allocateConstitutiveData( dataRepository::Group & parent, PorosityBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); } -void PressurePorosity::postProcessInput() +void PressurePorosity::postInputInitialization() { - PorosityBase::postProcessInput(); + PorosityBase::postInputInitialization(); // TODO valdate input } diff --git a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp index bb8663e183b..4dde76aa833 100644 --- a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp @@ -128,7 +128,7 @@ class PressurePorosity : public PorosityBase private: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; real64 m_referencePressure; diff --git a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp index 367f3987b04..378b7e11854 100644 --- a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp @@ -51,7 +51,7 @@ void ProppantPorosity::allocateConstitutiveData( dataRepository::Group & parent, PorosityBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); } -void ProppantPorosity::postProcessInput() +void ProppantPorosity::postInputInitialization() { getField< fields::porosity::referencePorosity >(). setApplyDefaultValue( m_defaultReferencePorosity ); diff --git a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp index ef271b87883..ec39cda56ef 100644 --- a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp @@ -110,7 +110,7 @@ class ProppantPorosity : public PorosityBase private: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; real64 m_maxProppantConcentration; diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp index ae739db7160..d1bfbeafffc 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp @@ -59,7 +59,7 @@ void MultiPhaseConstantThermalConductivity::allocateConstitutiveData( dataReposi } } -void MultiPhaseConstantThermalConductivity::postProcessInput() +void MultiPhaseConstantThermalConductivity::postInputInitialization() { GEOS_THROW_IF( m_thermalConductivityComponents[0] < 0 || m_thermalConductivityComponents[1] < 0 || diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp index b95625ac8d4..8b3dcfe28a7 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp @@ -98,7 +98,7 @@ class MultiPhaseConstantThermalConductivity : public MultiPhaseThermalConductivi protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp index 9b46ce43008..3481de3d8c6 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp @@ -40,9 +40,9 @@ MultiPhaseThermalConductivityBase::MultiPhaseThermalConductivityBase( string con registerField( fields::thermalconductivity::dEffectiveConductivity_dPhaseVolFraction{}, &m_dEffectiveConductivity_dPhaseVolFrac ); } -void MultiPhaseThermalConductivityBase::postProcessInput() +void MultiPhaseThermalConductivityBase::postInputInitialization() { - ConstitutiveBase::postProcessInput(); + ConstitutiveBase::postInputInitialization(); integer const numPhases = numFluidPhases(); GEOS_THROW_IF_LT_MSG( numPhases, 2, diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp index c29f7bac2ba..005b1e16cca 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp @@ -175,7 +175,7 @@ class MultiPhaseThermalConductivityBase : public ConstitutiveBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// phase names read from input string_array m_phaseNames; diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp index 5d8f996c0b5..da016b4a865 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp @@ -71,7 +71,7 @@ void MultiPhaseVolumeWeightedThermalConductivity::allocateConstitutiveData( data } } -void MultiPhaseVolumeWeightedThermalConductivity::postProcessInput() +void MultiPhaseVolumeWeightedThermalConductivity::postInputInitialization() { GEOS_THROW_IF( m_rockThermalConductivityComponents[0] <= 0 || m_rockThermalConductivityComponents[1] <= 0 || diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp index e1000cd6bc6..e240ef2c220 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp @@ -160,7 +160,7 @@ class MultiPhaseVolumeWeightedThermalConductivity : public MultiPhaseThermalCond protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp index 0cd9199bb37..6077290957e 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp @@ -83,7 +83,7 @@ void SinglePhaseConstantThermalConductivity::allocateConstitutiveData( dataRepos SinglePhaseThermalConductivityBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); } -void SinglePhaseConstantThermalConductivity::postProcessInput() +void SinglePhaseConstantThermalConductivity::postInputInitialization() { GEOS_THROW_IF( m_thermalConductivityComponents[0] <= 0 || m_thermalConductivityComponents[1] <= 0 || diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp index ae343d61ed7..be4cd7e4462 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp @@ -100,7 +100,7 @@ class SinglePhaseConstantThermalConductivity : public SinglePhaseThermalConducti protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp index 7bd134e0256..fd1c97d5382 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp @@ -34,9 +34,9 @@ SinglePhaseThermalConductivityBase::SinglePhaseThermalConductivityBase( string c registerField( fields::thermalconductivity::effectiveConductivity{}, &m_effectiveConductivity ); } -void SinglePhaseThermalConductivityBase::postProcessInput() +void SinglePhaseThermalConductivityBase::postInputInitialization() { - ConstitutiveBase::postProcessInput(); + ConstitutiveBase::postInputInitialization(); m_effectiveConductivity.resize( 0, 0, 3 ); } diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp index 612f05623c2..9d58fd04268 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp @@ -141,7 +141,7 @@ class SinglePhaseThermalConductivityBase : public ConstitutiveBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// cell-wise effective conductivities in the subregion array3d< real64 > m_effectiveConductivity; diff --git a/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp b/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp index bf2e24ef63d..694d5fc69b5 100644 --- a/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp +++ b/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp @@ -82,7 +82,7 @@ void testDruckerPragerDriver() xmlWrapper::xmlNode xmlConstitutiveNode = xmlDocument.getChild( "Constitutive" ); constitutiveManager.processInputFileRecursive( xmlDocument, xmlConstitutiveNode ); - constitutiveManager.postProcessInputRecursive(); + constitutiveManager.postInputInitializationRecursive(); localIndex constexpr numElem = 2; localIndex constexpr numQuad = 4; @@ -198,7 +198,7 @@ void testDruckerPragerExtendedDriver() xmlWrapper::xmlNode xmlConstitutiveNode = xmlDocument.getChild( "Constitutive" ); constitutiveManager.processInputFileRecursive( xmlDocument, xmlConstitutiveNode ); - constitutiveManager.postProcessInputRecursive(); + constitutiveManager.postInputInitializationRecursive(); localIndex constexpr numElem = 2; localIndex constexpr numQuad = 4; diff --git a/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp b/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp index 5592872d7e1..aa2d86fe2f4 100644 --- a/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp +++ b/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp @@ -81,7 +81,7 @@ TEST( ElasticIsotropicTests, testStateUpdatePoint ) xmlWrapper::xmlNode xmlConstitutiveNode = xmlDocument.getChild( "Constitutive" ); constitutiveManager.processInputFileRecursive( xmlDocument, xmlConstitutiveNode ); - constitutiveManager.postProcessInputRecursive(); + constitutiveManager.postInputInitializationRecursive(); dataRepository::Group disc( "discretization", &rootGroup ); disc.resize( 2 ); diff --git a/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp b/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp index 253971bccd1..cd32f4f46eb 100644 --- a/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp +++ b/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp @@ -96,7 +96,7 @@ void testModifiedCamClayDriver() xmlWrapper::xmlNode xmlConstitutiveNode = xmlDocument.getChild( "Constitutive" ); constitutiveManager.processInputFileRecursive( xmlDocument, xmlConstitutiveNode ); - constitutiveManager.postProcessInputRecursive(); + constitutiveManager.postInputInitializationRecursive(); localIndex constexpr numElem = 2; localIndex constexpr numQuad = 4; diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index 3958a2313c8..a6cc0126a8e 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -242,17 +242,15 @@ void Group::processInputFile( xmlWrapper::xmlNode const & targetNode, } } -void Group::postProcessInputRecursive() +void Group::postInputInitializationRecursive() { for( auto const & subGroupIter : m_subGroups ) { - subGroupIter.second->postProcessInputRecursive(); + subGroupIter.second->postInputInitializationRecursive(); } - postProcessInput(); + postInputInitialization(); } - - void Group::registerDataOnMeshRecursive( Group & meshBodies ) { registerDataOnMesh( meshBodies ); @@ -262,7 +260,6 @@ void Group::registerDataOnMeshRecursive( Group & meshBodies ) } } - Group * Group::createChild( string const & childKey, string const & childName ) { GEOS_ERROR_IF( !(CatalogInterface::hasKeyName( childKey )), @@ -272,7 +269,6 @@ Group * Group::createChild( string const & childKey, string const & childName ) CatalogInterface::factory( childKey, childName, this ) ); } - void Group::printDataHierarchy( integer const indent ) const { GEOS_LOG( string( indent, '\t' ) << getName() << " : " << LvArray::system::demangleType( *this ) ); diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index 84ad45f1fbe..3361848d7a4 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -779,10 +779,10 @@ class Group xmlWrapper::xmlNodePos const & nodePos ); /** - * @brief Recursively call postProcessInput() to apply post processing after + * @brief Recursively call postInputInitialization() to apply post processing after * reading input values. */ - void postProcessInputRecursive(); + void postInputInitializationRecursive(); ///@} @@ -1509,7 +1509,7 @@ class Group * This function provides capability to post process input values prior to * any other initialization operations. */ - virtual void postProcessInput() {} + virtual void postInputInitialization() {} /** * @brief Called by Initialize() prior to initializing sub-Groups. diff --git a/src/coreComponents/events/EventBase.hpp b/src/coreComponents/events/EventBase.hpp index 89b1d8f5c22..27a29dea5bc 100644 --- a/src/coreComponents/events/EventBase.hpp +++ b/src/coreComponents/events/EventBase.hpp @@ -156,7 +156,7 @@ class EventBase : public ExecutableGroup /** * @brief Helper function to validate the consistency of the event input - * @note We cannot use postProcessInput here because we can perform the validation only after the m_target pointer is set + * @note We cannot use postInputInitialization here because we can perform the validation only after the m_target pointer is set */ virtual void validate() const {}; diff --git a/src/coreComponents/events/tasks/TaskBase.cpp b/src/coreComponents/events/tasks/TaskBase.cpp index 5819a0c70f4..57925adde85 100644 --- a/src/coreComponents/events/tasks/TaskBase.cpp +++ b/src/coreComponents/events/tasks/TaskBase.cpp @@ -39,7 +39,7 @@ TaskBase::CatalogInterface::CatalogType & TaskBase::getCatalog() return catalog; } -void TaskBase::postProcessInput() +void TaskBase::postInputInitialization() { } } /* namespace */ diff --git a/src/coreComponents/events/tasks/TaskBase.hpp b/src/coreComponents/events/tasks/TaskBase.hpp index cfe210da0ad..107c8e35e3b 100644 --- a/src/coreComponents/events/tasks/TaskBase.hpp +++ b/src/coreComponents/events/tasks/TaskBase.hpp @@ -65,8 +65,8 @@ class TaskBase : public ExecutableGroup return false; } - /// @copydoc geos::dataRepository::Group::postProcessInput( ) - void postProcessInput() override; + /// @copydoc geos::dataRepository::Group::postInputInitialization( ) + void postInputInitialization() override; }; } /* namespace */ diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp index f74b40c75a5..678d33eb4de 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp @@ -113,7 +113,7 @@ AquiferBoundaryCondition::AquiferBoundaryCondition( string const & name, Group * } -void AquiferBoundaryCondition::postProcessInput() +void AquiferBoundaryCondition::postInputInitialization() { GEOS_THROW_IF_LE_MSG( m_permeability, 0.0, getCatalogName() << " " << getDataContext() << diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp index 0ecf1dc2793..a091adb10fc 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp @@ -264,7 +264,7 @@ class AquiferBoundaryCondition : public FieldSpecificationBase protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; private: diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp index f5df02ff47c..714c1db4bcf 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp @@ -89,7 +89,7 @@ EquilibriumInitialCondition::EquilibriumInitialCondition( string const & name, G addSetName( "all" ); } -void EquilibriumInitialCondition::postProcessInput() +void EquilibriumInitialCondition::postInputInitialization() { GEOS_THROW_IF( ( m_temperatureVsElevationTableName.empty() != m_componentFractionVsElevationTableNames.empty() ), diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp index ea6834362b4..e39f27dd65e 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp @@ -162,7 +162,7 @@ class EquilibriumInitialCondition : public FieldSpecificationBase protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; virtual void initializePreSubGroups() override final; diff --git a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp index bdc50920a25..b6fcc965f2e 100644 --- a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp +++ b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp @@ -75,7 +75,7 @@ PerfectlyMatchedLayer::PerfectlyMatchedLayer( string const & name, Group * const } -void PerfectlyMatchedLayer::postProcessInput() +void PerfectlyMatchedLayer::postInputInitialization() { GEOS_THROW_IF( (m_xMax[0] & registerWrappedStats( Group & group, string_view fluxName, diff --git a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp index 5bf74b2d2da..4c9e0b17596 100644 --- a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp @@ -60,7 +60,7 @@ TractionBoundaryCondition::TractionBoundaryCondition( string const & name, Group } -void TractionBoundaryCondition::postProcessInput() +void TractionBoundaryCondition::postInputInitialization() { if( m_tractionType == TractionType::vector ) { diff --git a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp index b689bd8a672..3f838c263f0 100644 --- a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp @@ -108,7 +108,7 @@ class TractionBoundaryCondition : public FieldSpecificationBase protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; virtual void initializePreSubGroups() override final; diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp index 2e1fbe74421..6c6983e452b 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp @@ -85,7 +85,7 @@ SiloOutput::SiloOutput( string const & name, SiloOutput::~SiloOutput() {} -void SiloOutput::postProcessInput() +void SiloOutput::postInputInitialization() { string const fieldNamesString = viewKeysStruct::fieldNames; string const onlyPlotSpecifiedFieldNamesString = viewKeysStruct::onlyPlotSpecifiedFieldNames; diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.hpp b/src/coreComponents/fileIO/Outputs/SiloOutput.hpp index b57ee2f01cf..1121c36c49f 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.hpp @@ -86,7 +86,7 @@ class SiloOutput : public OutputBase private: - void postProcessInput() override; + void postInputInitialization() override; string m_plotFileRoot; integer m_writeEdgeMesh; diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp index 550ed9dc950..3ab88e16050 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp @@ -94,7 +94,7 @@ VTKOutput::VTKOutput( string const & name, VTKOutput::~VTKOutput() {} -void VTKOutput::postProcessInput() +void VTKOutput::postInputInitialization() { m_writer.setOutputLocation( getOutputDirectory(), m_plotFileRoot ); m_writer.setFieldNames( m_fieldNames.toViewConst() ); diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp index 36b75bb9d6f..76f31924ceb 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp @@ -45,7 +45,7 @@ class VTKOutput : public OutputBase */ static string catalogName() { return "VTK"; } - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /** * @brief Set the plotFileRoot name for the output diff --git a/src/coreComponents/fileIO/python/PyVTKOutput.cpp b/src/coreComponents/fileIO/python/PyVTKOutput.cpp index 4bc148a5ae6..ed69e2a937f 100644 --- a/src/coreComponents/fileIO/python/PyVTKOutput.cpp +++ b/src/coreComponents/fileIO/python/PyVTKOutput.cpp @@ -118,7 +118,7 @@ static PyObject * setOutputDir( PyVTKOutput * self, PyObject * args ) try { self->group->setOutputDirectory( path ); - self->group->postProcessInput(); + self->group->postInputInitialization(); } catch( std::out_of_range const & e ) { @@ -154,7 +154,7 @@ static PyObject * setOutputFileRootName( PyVTKOutput * self, PyObject * args ) try { self->group->setPlotFileRoot( filename ); - self->group->postProcessInput(); + self->group->postInputInitialization(); } catch( std::out_of_range const & e ) { diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp index bb9da889c27..7f79294b773 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp @@ -54,7 +54,7 @@ FiniteElementDiscretization::~FiniteElementDiscretization() {} -void FiniteElementDiscretization::postProcessInput() +void FiniteElementDiscretization::postInputInitialization() { GEOS_ERROR_IF( m_useVem < 0 || m_useVem > 1, getDataContext() << ": The flag useVirtualElements can be either 0 or 1" ); diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp b/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp index 0d129a5da71..fa76d864779 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp @@ -107,7 +107,7 @@ class FiniteElementDiscretization : public dataRepository::Group /// Optional parameter indicating if the class should use Virtual Elements. int m_useVem; - void postProcessInput() override final; + void postInputInitialization() override final; }; diff --git a/src/coreComponents/functions/FunctionBase.hpp b/src/coreComponents/functions/FunctionBase.hpp index da135084f3e..8ef3b22fcab 100644 --- a/src/coreComponents/functions/FunctionBase.hpp +++ b/src/coreComponents/functions/FunctionBase.hpp @@ -142,7 +142,7 @@ class FunctionBase : public dataRepository::Group SortedArrayView< localIndex const > const & set, arrayView1d< real64 > const & result ) const; - virtual void postProcessInput() override { initializeFunction(); } + virtual void postInputInitialization() override { initializeFunction(); } }; diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 0d86412e41f..0bb27174919 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -150,7 +150,7 @@ Group * ProblemManager::createChild( string const & GEOS_UNUSED_PARAM( childKey void ProblemManager::problemSetup() { GEOS_MARK_FUNCTION; - postProcessInputRecursive(); + postInputInitializationRecursive(); generateMesh(); @@ -490,7 +490,7 @@ void ProblemManager::parseXMLDocument( xmlWrapper::xmlDocument & xmlDocument ) } -void ProblemManager::postProcessInput() +void ProblemManager::postInputInitialization() { DomainPartition & domain = getDomainPartition(); diff --git a/src/coreComponents/mainInterface/ProblemManager.hpp b/src/coreComponents/mainInterface/ProblemManager.hpp index 00a453c34ea..af322747b29 100644 --- a/src/coreComponents/mainInterface/ProblemManager.hpp +++ b/src/coreComponents/mainInterface/ProblemManager.hpp @@ -328,7 +328,7 @@ class ProblemManager : public dataRepository::Group /** * @brief Post process the command line input */ - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; private: diff --git a/src/coreComponents/mesh/Perforation.cpp b/src/coreComponents/mesh/Perforation.cpp index 7a02efbca2d..e644ddf639b 100644 --- a/src/coreComponents/mesh/Perforation.cpp +++ b/src/coreComponents/mesh/Perforation.cpp @@ -48,7 +48,7 @@ Perforation::Perforation( string const & name, Group * const parent ) } -void Perforation::postProcessInput() +void Perforation::postInputInitialization() { GEOS_ERROR_IF( m_distanceFromHead <= 0, getWrapperDataContext( viewKeyStruct::distanceFromHeadString() ) << diff --git a/src/coreComponents/mesh/Perforation.hpp b/src/coreComponents/mesh/Perforation.hpp index f29d306479a..d6780059ae3 100644 --- a/src/coreComponents/mesh/Perforation.hpp +++ b/src/coreComponents/mesh/Perforation.hpp @@ -126,7 +126,7 @@ class Perforation : public dataRepository::Group viewKeysPerforation; protected: - void postProcessInput() override; + void postInputInitialization() override; private: /// Linear distance from well head diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp index a6d86b02ab5..97ef2424bfe 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp @@ -61,7 +61,7 @@ ExternalMeshGeneratorBase::ExternalMeshGeneratorBase( string const & name, setDescription( "Names of the surfacic fields in GEOSX to import into" ); } -void ExternalMeshGeneratorBase::postProcessInput() +void ExternalMeshGeneratorBase::postInputInitialization() { auto const checkSizes = [this]( arrayView1d< string const > from, arrayView1d< string const > to, string const & fromKey, string const & toKey ) diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp index 96833a03066..4e24164f794 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp @@ -54,7 +54,7 @@ class ExternalMeshGeneratorBase : public MeshGeneratorBase }; /// @endcond - void postProcessInput() override; + void postInputInitialization() override; /// Path to the mesh file Path m_filePath; diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index 71410f24651..120d48a888d 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -127,7 +127,7 @@ static int getNumElemPerBox( ElementType const elementType ) } } -void InternalMeshGenerator::postProcessInput() +void InternalMeshGenerator::postInputInitialization() { m_dim = getElementDim( EnumStrings< ElementType >::fromString( m_elementType[0] ) ); diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp index bcb16630c92..26970e8dfbd 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp @@ -162,7 +162,7 @@ class InternalMeshGenerator : public MeshGeneratorBase }; /// @endcond - void postProcessInput() override; + void postInputInitialization() override; /// Mesh number of dimension int m_dim; diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp index 5e5d9211a58..e598ce6d522 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp @@ -39,7 +39,7 @@ InternalWellGenerator::InternalWellGenerator( string const & name, Group * const setDescription( "Connectivity of the polyline segments" ); } -void InternalWellGenerator::postProcessInput() +void InternalWellGenerator::postInputInitialization() { GEOS_THROW_IF( m_polyNodeCoords.size( 1 ) != m_nDims, "InternalWell " << getWrapperDataContext( viewKeyStruct::polylineNodeCoordsString() ) << diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.hpp b/src/coreComponents/mesh/generators/InternalWellGenerator.hpp index 16cdeee3553..0d28d14e7a3 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.hpp @@ -66,7 +66,7 @@ class InternalWellGenerator : public WellGeneratorBase * @brief This function provides capability to post process input values prior to * any other initialization operations. */ - void postProcessInput() override; + void postInputInitialization() override; }; } diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp index 9dbb3ab931a..29b0cdc5a31 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp @@ -111,7 +111,7 @@ InternalWellboreGenerator::InternalWellboreGenerator( string const & name, } -void InternalWellboreGenerator::postProcessInput() +void InternalWellboreGenerator::postInputInitialization() { GEOS_ERROR_IF( m_nElems[1].size() > 1, @@ -298,7 +298,7 @@ void InternalWellboreGenerator::postProcessInput() } } - InternalMeshGenerator::postProcessInput(); + InternalMeshGenerator::postInputInitialization(); } void InternalWellboreGenerator::reduceNumNodesForPeriodicBoundary( SpatialPartition & partition, diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp index ab45284f602..d57b05b96bf 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp @@ -88,7 +88,7 @@ class InternalWellboreGenerator : public InternalMeshGenerator }; /// @endcond - void postProcessInput() override final; + void postInputInitialization() override final; private: diff --git a/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp b/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp index f0a9e219668..8ad68e24666 100644 --- a/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp @@ -326,9 +326,9 @@ void ParticleMeshGenerator::fillParticleBlockManager( ParticleBlockManager & par //GEOS_LOG_RANK( "Total number of particles on this rank: " << particleManager.size() ); } -void ParticleMeshGenerator::postProcessInput() +void ParticleMeshGenerator::postInputInitialization() { - //GEOS_LOG_RANK_0( "Someone called ParticleMeshGenerator::postProcessInput!" ); + //GEOS_LOG_RANK_0( "Someone called ParticleMeshGenerator::postInputInitialization!" ); } void ParticleMeshGenerator::importFieldOnArray( Block block, diff --git a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp index fd2d605bc19..744762aedfa 100644 --- a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp @@ -80,7 +80,7 @@ class ParticleMeshGenerator : public MeshGeneratorBase }; /// @endcond - void postProcessInput() override; + void postInputInitialization() override; /// Mesh number of dimension int m_dim; diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index dee088ac575..896d6d6fa9b 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -152,7 +152,7 @@ void WellGeneratorBase::generateWellGeometry( ) } -void WellGeneratorBase::postProcessInput() +void WellGeneratorBase::postInputInitialization() { GEOS_THROW_IF( m_radius <= 0, "Invalid " << viewKeyStruct::radiusString() << " in well " << getName(), diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp index 1f82fc688cb..b1d1e229784 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp @@ -238,7 +238,7 @@ class WellGeneratorBase : public WellGeneratorABC * @brief This function provides capability to post process input values prior to * any other initialization operations. */ - void postProcessInput() override; + void postInputInitialization() override; /** * @name Helper functions to construct the geometry of the well diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp index fc5aea65a46..7c3a5c6515e 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp @@ -59,7 +59,7 @@ Box::~Box() -void Box::postProcessInput() +void Box::postInputInitialization() { LvArray::tensorOps::copy< 3 >( m_boxCenter, m_min ); LvArray::tensorOps::add< 3 >( m_boxCenter, m_max ); diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp index 48b3e80f44f..f608fa4e594 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp @@ -74,7 +74,7 @@ class Box : public SimpleGeometricObjectBase * @brief This function provides capability to post process input values prior to * any other initialization operations. */ - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; private: diff --git a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp index 22e1bc0c0fc..7bbf1223733 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp @@ -48,7 +48,7 @@ CustomPolarObject::CustomPolarObject( const string & name, Group * const parent CustomPolarObject::~CustomPolarObject() {} -void CustomPolarObject::postProcessInput() +void CustomPolarObject::postInputInitialization() { // Make sure that you have an orthonormal basis. LvArray::tensorOps::normalize< 3 >( m_normal ); diff --git a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp index 99faea5eca8..fa229a8c35b 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp @@ -116,7 +116,7 @@ class CustomPolarObject : public PlanarGeometricObject * @brief This function provides the capability to post process input values prior to * any other initialization operations. */ - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; private: diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp index eedd7bc979d..e30701acf08 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp @@ -48,7 +48,7 @@ Disc::Disc( const string & name, Group * const parent ): Disc::~Disc() {} -void Disc::postProcessInput() +void Disc::postInputInitialization() { // Make sure that you have an orthonormal basis. LvArray::tensorOps::normalize< 3 >( m_normal ); diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp index 0c9b5a5c87b..0ad2e2c7e84 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp @@ -89,7 +89,7 @@ class Disc : public PlanarGeometricObject * @brief This function provides the capability to post process input values prior to * any other initialization operations. */ - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; private: diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp index 71cb893e757..cb0b25f94f8 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp @@ -65,13 +65,13 @@ Rectangle::Rectangle( const real64 oldX, const real64 oldY, m_points.resize( 4, 3 ); //parent->registerGroup< Rectangle >( name, std::move( this ) ); - this->postProcessInput(); + this->postInputInitialization(); } Rectangle::~Rectangle() {} -void Rectangle::postProcessInput() +void Rectangle::postInputInitialization() { // Make sure that you have an orthonormal basis. LvArray::tensorOps::normalize< 3 >( m_normal ); diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp index ef86ffbf390..359eafc16f8 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp @@ -109,7 +109,7 @@ class Rectangle : public PlanarGeometricObject * @brief This function provides the capability to post process input values prior to * any other initialization operations. */ - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; private: diff --git a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp index db9820a8e93..b81e8613d21 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp @@ -46,7 +46,7 @@ ThickPlane::~ThickPlane() {} -void ThickPlane::postProcessInput() +void ThickPlane::postInputInitialization() { m_thickness *= 0.5; // actually store the half-thickness GEOS_ERROR_IF( m_thickness <= 0, diff --git a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp index 6a5f646e7e9..676a4cf4f2c 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp @@ -100,7 +100,7 @@ class ThickPlane : public SimpleGeometricObjectBase * @brief This function provides capability to post process input values prior to * any other initialization operations. */ - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; private: diff --git a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp index fc1f4a2c5a3..ff692298342 100644 --- a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp +++ b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp @@ -81,7 +81,7 @@ class FieldStatisticsBase : public TaskBase protected: - void postProcessInput() override + void postInputInitialization() override { ProblemManager & problemManager = this->getGroupByPath< ProblemManager >( "/Problem" ); PhysicsSolverManager & physicsSolverManager = problemManager.getPhysicsSolverManager(); diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp index d9767a84bea..740c5cb29a0 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp @@ -201,7 +201,7 @@ LinearSolverParametersInput::LinearSolverParametersInput( string const & name, setDescription( "ILU(T) threshold factor" ); } -void LinearSolverParametersInput::postProcessInput() +void LinearSolverParametersInput::postInputInitialization() { m_parameters.logLevel = getLogLevel(); diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp index 462203c9b98..1f182827ec1 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp @@ -57,7 +57,7 @@ class LinearSolverParametersInput : public dataRepository::Group static string catalogName() { return "LinearSolverParameters"; } /// Postprocessing of input - virtual void postProcessInput() override; + virtual void postInputInitialization() override; void print(); diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp index dc4b4620067..9cc659715ca 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp @@ -178,7 +178,7 @@ NonlinearSolverParameters::NonlinearSolverParameters( string const & name, } -void NonlinearSolverParameters::postProcessInput() +void NonlinearSolverParameters::postInputInitialization() { GEOS_ERROR_IF_LE_MSG( m_timeStepDecreaseIterLimit, m_timeStepIncreaseIterLimit, getWrapperDataContext( viewKeysStruct::timeStepIncreaseIterLimString() ) << diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp index 40dcb370c09..85c217a6a8b 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp @@ -98,7 +98,7 @@ class NonlinearSolverParameters : public dataRepository::Group */ static string catalogName() { return "NonlinearSolverParameters"; } - virtual void postProcessInput() override; + virtual void postInputInitialization() override; void print() const; diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index da4433b0989..0ad5e5f865a 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -49,9 +49,9 @@ ContactSolverBase::ContactSolverBase( const string & name, setInputFlag( dataRepository::InputFlags::FALSE ); } -void ContactSolverBase::postProcessInput() +void ContactSolverBase::postInputInitialization() { - SolidMechanicsLagrangianFEM::postProcessInput(); + SolidMechanicsLagrangianFEM::postInputInitialization(); GEOS_THROW_IF( m_timeIntegrationOption != TimeIntegrationOption::QuasiStatic, GEOS_FMT( "{} {}: The attribute `{}` must be `{}`", diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp index b46be82ee5c..16c16403a4c 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp @@ -56,7 +56,7 @@ class ContactSolverBase : public SolidMechanicsLagrangianFEM }; protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override final; diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index 563a07119ed..a86adc24351 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -57,9 +57,9 @@ SolidMechanicsEmbeddedFractures::~SolidMechanicsEmbeddedFractures() // TODO Auto-generated destructor stub } -void SolidMechanicsEmbeddedFractures::postProcessInput() +void SolidMechanicsEmbeddedFractures::postInputInitialization() { - SolidMechanicsLagrangianFEM::postProcessInput(); + SolidMechanicsLagrangianFEM::postInputInitialization(); LinearSolverParameters & linParams = m_linearSolverParameters.get(); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index 0422634b20d..50ffb55af03 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -123,7 +123,7 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase virtual void initializePostInitialConditionsPreSubGroups() override final; - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; private: diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 8b67ebe2b18..81176c2bb18 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -172,9 +172,9 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, setDescription( "Minimum value for solution scaling factor" ); } -void CompositionalMultiphaseBase::postProcessInput() +void CompositionalMultiphaseBase::postInputInitialization() { - FlowSolverBase::postProcessInput(); + FlowSolverBase::postInputInitialization(); GEOS_ERROR_IF_GT_MSG( m_maxCompFracChange, 1.0, getWrapperDataContext( viewKeyStruct::maxCompFracChangeString() ) << diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index cd4809d2cee..b58fd130c88 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -388,7 +388,7 @@ class CompositionalMultiphaseBase : public FlowSolverBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 0cc1c160dfc..3245cb8df57 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -88,9 +88,9 @@ CompositionalMultiphaseFVM::CompositionalMultiphaseFVM( const string & name, "Valid options:\n* " + EnumStrings< ScalingType >::concat( "\n* " ) ); } -void CompositionalMultiphaseFVM::postProcessInput() +void CompositionalMultiphaseFVM::postInputInitialization() { - CompositionalMultiphaseBase::postProcessInput(); + CompositionalMultiphaseBase::postInputInitialization(); if( m_scalingType == ScalingType::Local && m_nonlinearSolverParameters.m_lineSearchAction != NonlinearSolverParameters::LineSearchAction::None ) { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp index 82776f70485..6baa8d22ea6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp @@ -175,7 +175,7 @@ class CompositionalMultiphaseFVM : public CompositionalMultiphaseBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePreSubGroups() override; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp index ab5932ce13a..e2326f63b26 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp @@ -61,9 +61,9 @@ CompositionalMultiphaseStatistics::CompositionalMultiphaseStatistics( const stri setDescription( "Flag to decide whether a phase is considered mobile (when the relperm is above the threshold) or immobile (when the relperm is below the threshold) in metric 2" ); } -void CompositionalMultiphaseStatistics::postProcessInput() +void CompositionalMultiphaseStatistics::postInputInitialization() { - Base::postProcessInput(); + Base::postInputInitialization(); if( dynamicCast< CompositionalMultiphaseHybridFVM * >( m_solver ) && m_computeCFLNumbers != 0 ) { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp index a4a46ad166a..a377ff84686 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp @@ -141,7 +141,7 @@ class CompositionalMultiphaseStatistics : public FieldStatisticsBase< Compositio real64 const dt, DomainPartition & domain ) const; - void postProcessInput() override; + void postInputInitialization() override; void registerDataOnMesh( Group & meshBodies ) override; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index a08168784b6..2d558811898 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -185,10 +185,10 @@ void ReactiveCompositionalMultiphaseOBL::implicitStepComplete( real64 const & ti } ); } -void ReactiveCompositionalMultiphaseOBL::postProcessInput() +void ReactiveCompositionalMultiphaseOBL::postInputInitialization() { // need to override to skip the check for fluidModel, which is enabled in FlowSolverBase - SolverBase::postProcessInput(); + SolverBase::postInputInitialization(); GEOS_THROW_IF_GT_MSG( m_maxCompFracChange, 1.0, GEOS_FMT( "{}: The maximum absolute change in component fraction is set to {}, while it must not be greater than 1.0", diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp index ac2746e8966..60a478513be 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp @@ -310,7 +310,7 @@ class ReactiveCompositionalMultiphaseOBL : public FlowSolverBase private: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// the max number of fluid phases integer m_numPhases; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp index 365c38eda92..f936c32418d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp @@ -82,9 +82,9 @@ ProppantTransport::ProppantTransport( const string & name, } -void ProppantTransport::postProcessInput() +void ProppantTransport::postInputInitialization() { - FlowSolverBase::postProcessInput(); + FlowSolverBase::postInputInitialization(); } void ProppantTransport::registerDataOnMesh( Group & meshBodies ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp index a1386b39381..8b23a9e0540 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp @@ -216,7 +216,7 @@ class ProppantTransport : public FlowSolverBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; private: diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 572f6332645..175e7166bcb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -109,9 +109,9 @@ CompositionalMultiphaseWell::CompositionalMultiphaseWell( const string & name, setDescription( "Flag indicating whether local (cell-wise) chopping of negative compositions is allowed" ); } -void CompositionalMultiphaseWell::postProcessInput() +void CompositionalMultiphaseWell::postInputInitialization() { - WellSolverBase::postProcessInput(); + WellSolverBase::postInputInitialization(); GEOS_ERROR_IF_GT_MSG( m_maxCompFracChange, 1.0, getWrapperDataContext( viewKeyStruct::maxCompFracChangeString() ) << diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp index 05cffcbff85..e483ee1fe4c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -319,7 +319,7 @@ class CompositionalMultiphaseWell : public WellSolverBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePostSubGroups() override; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp index 4d97682591b..06b3b71d924 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp @@ -215,7 +215,7 @@ TableFunction * createWellTable( string const & tableName, } -void WellControls::postProcessInput() +void WellControls::postInputInitialization() { // 0) Assign the value of the current well control // When the simulation starts from a restart file, we don't want to use the inputControl, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp index b5a3af4205c..c77590a4db8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp @@ -62,7 +62,7 @@ class WellControls : public dataRepository::Group PHASEVOLRATE, /**< The well operates at a specified phase volumetric flow rate */ TOTALVOLRATE, /**< The well operates at a specified total volumetric flow rate */ MASSRATE, /** 0 ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp index ea55443dd17..94c97737fe0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp @@ -289,7 +289,7 @@ class WellSolverBase : public SolverBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePostInitialConditionsPreSubGroups() override; diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp index 9755cca80a3..71fa1540cbe 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp @@ -60,7 +60,7 @@ SeismicityRate::SeismicityRate( const string & name, setInputFlag( InputFlags::FALSE ); } -void SeismicityRate::postProcessInput() +void SeismicityRate::postInputInitialization() { // Check orthogonality of user-specified faults if( std::abs( LvArray::tensorOps::AiBi< 3 >( m_faultNormalDirection, m_faultShearDirection )) > 1e-8 ) @@ -80,7 +80,7 @@ void SeismicityRate::postProcessInput() m_stressSolver = &this->getParent().getGroup< SolverBase >( m_stressSolverName ); } - SolverBase::postProcessInput(); + SolverBase::postInputInitialization(); } SeismicityRate::~SeismicityRate() diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp index c8985312643..ba8dfb666e2 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp @@ -135,7 +135,7 @@ class SeismicityRate : public SolverBase void constructFaultStressProjectionTensors( real64 ( &faultNormalProjectionTensor )[6], real64 ( &faultShearProjectionTensor )[6] ) const; - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /// pointer to stress solver SolverBase * m_stressSolver; diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index 4cf0109a221..bdc04aa666a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -660,7 +660,7 @@ class CoupledSolver : public SolverBase } virtual void - postProcessInput() override + postInputInitialization() override { setSubSolvers(); diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index d761bd92327..36ea5524709 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -154,9 +154,9 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::implicitStepSetup( real64 cons } template< typename POROMECHANICS_SOLVER > -void HydrofractureSolver< POROMECHANICS_SOLVER >::postProcessInput() +void HydrofractureSolver< POROMECHANICS_SOLVER >::postInputInitialization() { - Base::postProcessInput(); + Base::postInputInitialization(); static const std::set< integer > binaryOptions = { 0, 1 }; GEOS_ERROR_IF( binaryOptions.count( m_isMatrixPoroelastic ) == 0, viewKeyStruct::isMatrixPoroelasticString() << " option can be either 0 (false) or 1 (true)" ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index 78ffb35d583..96e1d70f0e8 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -184,7 +184,7 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; /** * @Brief add the nnz induced by the flux-aperture coupling diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 354519b9f15..4a154328982 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -53,9 +53,9 @@ MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::MultiphasePoromechanic } template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postProcessInput() +void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postInputInitialization() { - Base::postProcessInput(); + Base::postInputInitialization(); GEOS_ERROR_IF( this->flowSolver()->getCatalogName() == "CompositionalMultiphaseReservoir" && this->getNonlinearSolverParameters().couplingType() != NonlinearSolverParameters::CouplingType::Sequential, diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index c69d3829e54..e393329696e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -80,7 +80,7 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANI */ /**@{*/ - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void setupCoupling( DomainPartition const & domain, DofManager & dofManager ) const override; diff --git a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp index 33eb3bcd9de..a9fbd7bb9b2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp @@ -43,9 +43,9 @@ PhaseFieldFractureSolver::~PhaseFieldFractureSolver() // TODO Auto-generated destructor stub } -void PhaseFieldFractureSolver::postProcessInput() +void PhaseFieldFractureSolver::postInputInitialization() { - Base::postProcessInput(); + Base::postInputInitialization(); GEOS_WARNING_IF( getNonlinearSolverParameters().m_couplingType == NonlinearSolverParameters::CouplingType::FullyImplicit, "FullyImplicit coupling not implemented for this solver. A sequential coupling approach will be used." ); getNonlinearSolverParameters().m_couplingType = NonlinearSolverParameters::CouplingType::Sequential; diff --git a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp index 40e34b47102..9cfcb0f2e61 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp @@ -65,7 +65,7 @@ class PhaseFieldFractureSolver : public CoupledSolver< SolidMechanicsLagrangianF Damage = 1 }; - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; /** * @brief accessor for the pointer to the solid mechanics solver diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index 5cf7d5d791e..fef990acbc0 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -65,7 +65,7 @@ PoromechanicsInitialization< POROMECHANICS_SOLVER >::~PoromechanicsInitializatio template< typename POROMECHANICS_SOLVER > void PoromechanicsInitialization< POROMECHANICS_SOLVER >:: -postProcessInput() +postInputInitialization() { ProblemManager & problemManager = this->getGroupByPath< ProblemManager >( "/Problem" ); PhysicsSolverManager & physicsSolverManager = problemManager.getPhysicsSolverManager(); @@ -94,7 +94,7 @@ postProcessInput() m_solidMechanicsStateResetTask.setLogLevel( getLogLevel()); m_solidMechanicsStateResetTask.m_solidSolverName = m_poromechanicsSolver->solidMechanicsSolver()->getName(); - m_solidMechanicsStateResetTask.postProcessInput(); + m_solidMechanicsStateResetTask.postInputInitialization(); } template< typename POROMECHANICS_SOLVER > diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp index 7d3933fdb1a..24eda5ad402 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp @@ -88,7 +88,7 @@ class PoromechanicsInitialization : public TaskBase constexpr static char const * solidMechanicsStatisticsNameString() { return "solidMechanicsStatisticsName"; } }; - void postProcessInput() override; + void postInputInitialization() override; // void registerDataOnMesh( Group & meshBodies ) override; diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index ea86367a721..d260ac9aade 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -52,9 +52,9 @@ SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::SinglePhasePoromechan } template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postProcessInput() +void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postInputInitialization() { - Base::postProcessInput(); + Base::postInputInitialization(); GEOS_ERROR_IF( this->flowSolver()->getCatalogName() == "SinglePhaseReservoir" && this->getNonlinearSolverParameters().couplingType() != NonlinearSolverParameters::CouplingType::Sequential, diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index 21cc282a1dd..9fec4080fe2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -80,7 +80,7 @@ class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHAN */ /**@{*/ - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void setupCoupling( DomainPartition const & domain, DofManager & dofManager ) const override; diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 74413953f66..0b0f97ef207 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -50,9 +50,9 @@ SinglePhasePoromechanicsEmbeddedFractures::SinglePhasePoromechanicsEmbeddedFract SinglePhasePoromechanicsEmbeddedFractures::~SinglePhasePoromechanicsEmbeddedFractures() {} -void SinglePhasePoromechanicsEmbeddedFractures::postProcessInput() +void SinglePhasePoromechanicsEmbeddedFractures::postInputInitialization() { - Base::postProcessInput(); + Base::postInputInitialization(); GEOS_ERROR_IF( solidMechanicsSolver()->useStaticCondensation(), GEOS_FMT( "{}: {} = 1 in {} solver named {} is not supported for {}", diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp index f33efce4a10..ab7e4183a1a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -100,7 +100,7 @@ class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanic protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; virtual void initializePostInitialConditionsPreSubGroups() override final; diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp index d314092bebc..b8ad1f6eea7 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp @@ -124,9 +124,9 @@ void PhaseFieldDamageFEM::registerDataOnMesh( Group & meshBodies ) } ); } -void PhaseFieldDamageFEM::postProcessInput() +void PhaseFieldDamageFEM::postInputInitialization() { - SolverBase::postProcessInput(); + SolverBase::postInputInitialization(); // Set basic parameters for solver // m_linearSolverParameters.logLevel = 0; diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp index a38c1ad3d79..0384812f9ae 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp @@ -174,7 +174,7 @@ class PhaseFieldDamageFEM : public SolverBase } protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; private: string m_fieldName; diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index d712ed90532..98527ef0164 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -122,9 +122,9 @@ SolidMechanicsLagrangianFEM::SolidMechanicsLagrangianFEM( const string & name, } -void SolidMechanicsLagrangianFEM::postProcessInput() +void SolidMechanicsLagrangianFEM::postInputInitialization() { - SolverBase::postProcessInput(); + SolverBase::postInputInitialization(); LinearSolverParameters & linParams = m_linearSolverParameters.get(); linParams.isSymmetric = true; diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index 52752c798ca..3ea6b67066e 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -276,7 +276,7 @@ class SolidMechanicsLagrangianFEM : public SolverBase } protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; virtual void initializePostInitialConditionsPreSubGroups() override; diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp index 36d818d1348..d1cdf02ab92 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp @@ -289,9 +289,9 @@ SolidMechanicsMPM::SolidMechanicsMPM( const string & name, setDescription( "number of elements along partition directions" ); } -void SolidMechanicsMPM::postProcessInput() +void SolidMechanicsMPM::postInputInitialization() { - SolverBase::postProcessInput(); + SolverBase::postInputInitialization(); // Activate neighbor list if necessary if( m_damageFieldPartitioning == 1 || m_surfaceDetection == 1 /*|| m_directionalOverlapCorrection == 1*/ ) diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp index 745f27ae723..bde0334413c 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp @@ -361,7 +361,7 @@ class SolidMechanicsMPM : public SolverBase NodeManager & nodeManager ); protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; std::vector< array2d< localIndex > > m_mappedNodes; // mappedNodes[subregion index][particle index][node index]. dims = {# of subregions, // # of particles, # of nodes a particle on the subregion maps to} diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index f77dd4fd535..3b2fc88a032 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -56,7 +56,7 @@ SolidMechanicsStateReset::SolidMechanicsStateReset( const string & name, SolidMechanicsStateReset::~SolidMechanicsStateReset() {} -void SolidMechanicsStateReset::postProcessInput() +void SolidMechanicsStateReset::postInputInitialization() { ProblemManager & problemManager = this->getGroupByPath< ProblemManager >( "/Problem" ); PhysicsSolverManager & physicsSolverManager = problemManager.getPhysicsSolverManager(); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp index 0f6986d0285..5210e1e6576 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp @@ -91,7 +91,7 @@ class SolidMechanicsStateReset : public TaskBase }; - void postProcessInput() override; + void postInputInitialization() override; /// Name of the solid mechanics solver string m_solidSolverName; diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index 7ba5b85c955..c7044e4a161 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -221,7 +221,7 @@ SurfaceGenerator::SurfaceGenerator( const string & name, setInputFlag( InputFlags::FALSE ); } -void SurfaceGenerator::postProcessInput() +void SurfaceGenerator::postInputInitialization() { static const std::set< integer > binaryOptions = { 0, 1 }; diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp index b6a1a7eca99..69d0a37c03d 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp @@ -99,7 +99,7 @@ class SurfaceGenerator : public SolverBase inline string const getFractureRegionName() const { return m_fractureRegionName; } - void postProcessInput() override final; + void postInputInitialization() override final; protected: diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index e1311f20a66..3728329a87a 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -136,9 +136,9 @@ void AcousticFirstOrderWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) } -void AcousticFirstOrderWaveEquationSEM::postProcessInput() +void AcousticFirstOrderWaveEquationSEM::postInputInitialization() { - WaveSolverBase::postProcessInput(); + WaveSolverBase::postInputInitialization(); localIndex const numSourcesGlobal = m_sourceCoordinates.size( 0 ); localIndex const numReceiversGlobal = m_receiverCoordinates.size( 0 ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp index eba7dc066c0..445ba94c691 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp @@ -109,7 +109,7 @@ class AcousticFirstOrderWaveEquationSEM : public WaveSolverBase protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; virtual void initializePostInitialConditionsPreSubGroups() override final; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index 5f9497ffc37..6ddb1e50ca0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -101,10 +101,10 @@ void AcousticVTIWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) } -void AcousticVTIWaveEquationSEM::postProcessInput() +void AcousticVTIWaveEquationSEM::postInputInitialization() { - WaveSolverBase::postProcessInput(); + WaveSolverBase::postInputInitialization(); localIndex const numReceiversGlobal = m_receiverCoordinates.size( 0 ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp index 712104350de..487ab246dd7 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp @@ -117,7 +117,7 @@ class AcousticVTIWaveEquationSEM : public WaveSolverBase protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; virtual void initializePostInitialConditionsPreSubGroups() override final; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index e8452ae08dd..8f377e2dce1 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -110,9 +110,9 @@ void AcousticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) } -void AcousticWaveEquationSEM::postProcessInput() +void AcousticWaveEquationSEM::postInputInitialization() { - WaveSolverBase::postProcessInput(); + WaveSolverBase::postInputInitialization(); m_pressureNp1AtReceivers.resize( m_nsamplesSeismoTrace, m_receiverCoordinates.size( 0 ) + 1 ); } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp index d8d7e6fc981..62cb89cedb9 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp @@ -138,7 +138,7 @@ class AcousticWaveEquationSEM : public WaveSolverBase protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; virtual void initializePostInitialConditionsPreSubGroups() override final; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp index 31a5a2d7969..be879a2fba6 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp @@ -68,9 +68,9 @@ class CoupledWaveSolver : public SolverBase CoupledWaveSolver & operator=( CoupledWaveSolver && ) = delete; virtual void - postProcessInput() override final + postInputInitialization() override final { - SolverBase::postProcessInput(); + SolverBase::postInputInitialization(); forEachArgInTuple( m_solvers, [&]( auto & solver, auto idx ) { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index 6d72fb55188..3fc0b84ab59 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -175,10 +175,10 @@ void ElasticFirstOrderWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) -void ElasticFirstOrderWaveEquationSEM::postProcessInput() +void ElasticFirstOrderWaveEquationSEM::postInputInitialization() { - WaveSolverBase::postProcessInput(); + WaveSolverBase::postInputInitialization(); localIndex const numSourcesGlobal = m_sourceCoordinates.size( 0 ); m_sourceElem.resize( numSourcesGlobal ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp index dc9939f117b..bd01d7b7b3e 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp @@ -115,7 +115,7 @@ class ElasticFirstOrderWaveEquationSEM : public WaveSolverBase protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; virtual void initializePostInitialConditionsPreSubGroups() override final; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 669d9e43184..591e2add195 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -199,9 +199,9 @@ void ElasticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) -void ElasticWaveEquationSEM::postProcessInput() +void ElasticWaveEquationSEM::postInputInitialization() { - WaveSolverBase::postProcessInput(); + WaveSolverBase::postInputInitialization(); if( m_useDAS == WaveSolverUtils::DASType::none ) { diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp index 511c6b599ec..1ad1e348cca 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp @@ -163,7 +163,7 @@ class ElasticWaveEquationSEM : public WaveSolverBase protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; virtual void initializePostInitialConditionsPreSubGroups() override final; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index 0716f971ad4..dff7e2d1b6d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -228,7 +228,7 @@ WaveSolverBase::~WaveSolverBase() void WaveSolverBase::reinit() { initializePreSubGroups(); - postProcessInput(); + postInputInitialization(); initializePostInitialConditionsPreSubGroups(); } @@ -273,9 +273,9 @@ void WaveSolverBase::initializePreSubGroups() } -void WaveSolverBase::postProcessInput() +void WaveSolverBase::postInputInitialization() { - SolverBase::postProcessInput(); + SolverBase::postInputInitialization(); /// set flag PML to one if a PML field is specified in the xml /// if counter>1, an error will be thrown as one single PML field is allowed diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp index a8868b23992..33bdbc4b613 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp @@ -140,7 +140,7 @@ class WaveSolverBase : public SolverBase protected: - virtual void postProcessInput() override; + virtual void postInputInitialization() override; /** * @brief Utility function to check if a directory exists diff --git a/src/coreComponents/schema/docs/Hydrofracture.rst b/src/coreComponents/schema/docs/Hydrofracture.rst index 486ef16b842..250756df110 100644 --- a/src/coreComponents/schema/docs/Hydrofracture.rst +++ b/src/coreComponents/schema/docs/Hydrofracture.rst @@ -1,5 +1,3 @@ - - ============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== Name Type Default Description ============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== @@ -26,6 +24,4 @@ useQuasiNewton integer writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== - - +============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== \ No newline at end of file diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization.rst new file mode 100644 index 00000000000..18e3a0dd9e7 --- /dev/null +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization.rst @@ -0,0 +1,12 @@ + + +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== + + diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization_other.rst new file mode 100644 index 00000000000..adf1c1b8aec --- /dev/null +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization_other.rst @@ -0,0 +1,9 @@ + + +==== ==== ============================ +Name Type Description +==== ==== ============================ + (no documentation available) +==== ==== ============================ + + diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir.rst new file mode 100644 index 00000000000..af1c8e817b3 --- /dev/null +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir.rst @@ -0,0 +1,18 @@ + + +========================================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +========================================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsConformingFracturesSolverName groupNameRef required Name of the poromechanicsConformingFractures solver used by the coupled solver +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +wellSolverName groupNameRef required Name of the well solver used by the coupled solver +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +========================================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== + + diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir_other.rst new file mode 100644 index 00000000000..cccf4603c70 --- /dev/null +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir_other.rst @@ -0,0 +1,14 @@ + + +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +Name Type Description +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== +discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== + + diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization.rst new file mode 100644 index 00000000000..18e3a0dd9e7 --- /dev/null +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization.rst @@ -0,0 +1,12 @@ + + +============================ ============ ======== =========================================== +Name Type Default Description +============================ ============ ======== =========================================== +logLevel integer 0 Log level +name groupName required A name is required for any non-unique nodes +poromechanicsSolverName groupNameRef required Name of the poromechanics solver +solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics +============================ ============ ======== =========================================== + + diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization_other.rst new file mode 100644 index 00000000000..adf1c1b8aec --- /dev/null +++ b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization_other.rst @@ -0,0 +1,9 @@ + + +==== ==== ============================ +Name Type Description +==== ==== ============================ + (no documentation available) +==== ==== ============================ + + diff --git a/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst b/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst new file mode 100644 index 00000000000..9b736b1b4d6 --- /dev/null +++ b/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst @@ -0,0 +1,29 @@ + + +========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +logLevel integer 0 Log level +massDamping real64 0 Value of mass based damping coefficient. +maxNumResolves integer 10 Value to indicate how many resolves may be executed after some other event is executed. For example, if a SurfaceGenerator is specified, it will be executed after the mechanics solve. However if a new surface is generated, then the mechanics solve must be executed again due to the change in topology. +name groupName required A name is required for any non-unique nodes +newmarkBeta real64 0.25 Value of :math:`\beta` in the Newmark Method for Implicit Dynamic time integration option. This should be pow(newmarkGamma+0.5,2.0)/4.0 unless you know what you are doing. +newmarkGamma real64 0.5 Value of :math:`\gamma` in the Newmark Method for Implicit Dynamic time integration option +stiffnessDamping real64 0 Value of stiffness based damping coefficient. +strainTheory integer 0 | Indicates whether or not to use `Infinitesimal Strain Theory `_, or `Finite Strain Theory `_. Valid Inputs are: + | 0 - Infinitesimal Strain + | 1 - Finite Strain +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption ExplicitDynamic | Time integration method. Options are: + | * QuasiStatic + | * ImplicitDynamic + | * ExplicitDynamic +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== + + diff --git a/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact_other.rst b/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact_other.rst new file mode 100644 index 00000000000..1a9ad823675 --- /dev/null +++ b/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact_other.rst @@ -0,0 +1,16 @@ + + +========================= ====================================================================================================================================================== ===================================================================== +Name Type Description +========================= ====================================================================================================================================================== ===================================================================== +contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. +maxForce real64 The maximum force contribution in the problem domain. +maxStableDt real64 Value of the Maximum Stable Timestep for this solver. +meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. +surfaceGeneratorName string Name of the surface generator to use +LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` +NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` +SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` +========================= ====================================================================================================================================================== ===================================================================== + + diff --git a/src/coreComponents/schema/docs/TimeHistory.rst b/src/coreComponents/schema/docs/TimeHistory.rst index 8a4f5fe402d..48d9d3cf740 100644 --- a/src/coreComponents/schema/docs/TimeHistory.rst +++ b/src/coreComponents/schema/docs/TimeHistory.rst @@ -6,6 +6,7 @@ Name Type Default Description childDirectory string Child directory path filename string TimeHistory The filename to which to write time history output. format string hdf The output file format for time history output. +logLevel integer 0 Log level name groupName required A name is required for any non-unique nodes parallelThreads integer 1 Number of plot files. sources groupNameRef_array required A list of collectors from which to collect and output time history information. diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 3dd908c4ea1..64b3936663f 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -2101,6 +2101,8 @@ the relative residual norm satisfies: + + @@ -2927,6 +2929,8 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> + + diff --git a/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp b/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp index 01880c05e55..333f7c97ace 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp @@ -49,7 +49,7 @@ CapillaryPressureBase & makeBrooksCoreyCapPressureTwoPhase( string const & name, real64 & capPressureEpsilon = capPressure.getReference< real64 >( BrooksCoreyCapillaryPressure::viewKeyStruct::capPressureEpsilonString() ); capPressureEpsilon = 1e-4; - capPressure.postProcessInputRecursive(); + capPressure.postInputInitializationRecursive(); return capPressure; } @@ -78,7 +78,7 @@ CapillaryPressureBase & makeBrooksCoreyCapPressureThreePhase( string const & nam real64 & capPressureEpsilon = capPressure.getReference< real64 >( BrooksCoreyCapillaryPressure::viewKeyStruct::capPressureEpsilonString() ); capPressureEpsilon = 1e-7; - capPressure.postProcessInputRecursive(); + capPressure.postInputInitializationRecursive(); return capPressure; } @@ -108,7 +108,7 @@ CapillaryPressureBase & makeVanGenuchtenCapPressureTwoPhase( string const & name real64 & capPressureEpsilon = capPressure.getReference< real64 >( VanGenuchtenCapillaryPressure::viewKeyStruct::capPressureEpsilonString() ); capPressureEpsilon = 1e-4; - capPressure.postProcessInputRecursive(); + capPressure.postInputInitializationRecursive(); return capPressure; } @@ -137,7 +137,7 @@ CapillaryPressureBase & makeVanGenuchtenCapPressureThreePhase( string const & na real64 & capPressureEpsilon = capPressure.getReference< real64 >( VanGenuchtenCapillaryPressure::viewKeyStruct::capPressureEpsilonString() ); capPressureEpsilon = 1e-4; - capPressure.postProcessInputRecursive(); + capPressure.postInputInitializationRecursive(); return capPressure; } @@ -187,7 +187,7 @@ CapillaryPressureBase & makeTableCapPressureTwoPhase( string const & name, Group auto & waterTableName = capPressure.getReference< string >( TableCapillaryPressure::viewKeyStruct::wettingNonWettingCapPresTableNameString() ); waterTableName = "water_pc"; - capPressure.postProcessInputRecursive(); + capPressure.postInputInitializationRecursive(); capPressure.initialize(); // to test all the checks return capPressure; } @@ -270,7 +270,7 @@ CapillaryPressureBase & makeTableCapPressureThreePhase( string const & name, Gro auto & gasTableName = capPressure.getReference< string >( TableCapillaryPressure::viewKeyStruct::nonWettingIntermediateCapPresTableNameString() ); gasTableName = "gas_og_pc"; - capPressure.postProcessInputRecursive(); + capPressure.postInputInitializationRecursive(); capPressure.initialize(); // to test all the checks return capPressure; } @@ -338,7 +338,7 @@ CapillaryPressureBase & makeJFunctionCapPressureTwoPhase( string const & name, G capPressure.getReference< JFunctionCapillaryPressure::PermeabilityDirection >( JFunctionCapillaryPressure::viewKeyStruct::permeabilityDirectionString() ); permeabilityDirection = JFunctionCapillaryPressure::PermeabilityDirection::XY; - capPressure.postProcessInputRecursive(); + capPressure.postInputInitializationRecursive(); capPressure.initialize(); // to test all the checks return capPressure; @@ -432,7 +432,7 @@ CapillaryPressureBase & makeJFunctionCapPressureThreePhase( string const & name, capPressure.getReference< JFunctionCapillaryPressure::PermeabilityDirection >( JFunctionCapillaryPressure::viewKeyStruct::permeabilityDirectionString() ); permeabilityDirection = JFunctionCapillaryPressure::PermeabilityDirection::Z; - capPressure.postProcessInputRecursive(); + capPressure.postInputInitializationRecursive(); capPressure.initialize(); // to test all the checks return capPressure; } diff --git a/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp b/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp index 972449c8b96..8a691a11953 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp @@ -56,7 +56,7 @@ TEST( DamageTests, testDamageSpectral ) xmlWrapper::xmlNode xmlConstitutiveNode = xmlDocument.getChild( "Constitutive" ); constitutiveManager.processInputFileRecursive( xmlDocument, xmlConstitutiveNode ); - constitutiveManager.postProcessInputRecursive(); + constitutiveManager.postInputInitializationRecursive(); localIndex constexpr numElem = 2; localIndex constexpr numQuad = 4; diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp index d1ddabca7c7..16e26868abe 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp @@ -181,7 +181,7 @@ MultiFluidCO2BrineTest< BRINE, FLASH, THERMAL >::makeCO2BrineFluid( string const auto & flashModelParaFileName = fluid.getReference< Path >( CO2BrineFluid::viewKeyStruct::flashModelParaFileString() ); flashModelParaFileName = pvtFlashFileName; - co2BrineFluid.postProcessInputRecursive(); + co2BrineFluid.postInputInitializationRecursive(); return &co2BrineFluid; } diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp index 45a7651f812..a78b7f66e69 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp @@ -159,7 +159,7 @@ makeFluid( string const & name, Group * parent ) Fluid< NUM_COMP >::fillProperties( fluid ); - fluid.postProcessInputRecursive(); + fluid.postInputInitializationRecursive(); return &fluid; } diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp index d8356ae9a81..17bfc966b07 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp @@ -130,7 +130,7 @@ DeadOilFluid * MultiFluidDeadOilTest< false >::makeDeadOilFluid( string const & path_array & tableNames = fluid.getReference< path_array >( BlackOilFluidBase::viewKeyStruct::tableFilesString() ); fill< 3 >( tableNames, {"pvdo.txt", "pvdw.txt", "pvdg.txt"} ); - fluid.postProcessInputRecursive(); + fluid.postInputInitializationRecursive(); return &fluid; } @@ -198,7 +198,7 @@ DeadOilFluid * MultiFluidDeadOilTest< true >::makeDeadOilFluid( string const & n real64 & waterViscosity = fluid.getReference< real64 >( DeadOilFluid::viewKeyStruct::waterViscosityString() ); waterViscosity = 0.0003; - fluid.postProcessInputRecursive(); + fluid.postInputInitializationRecursive(); return &fluid; } diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp index 4ea16870680..d78aa9b7392 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp @@ -108,7 +108,7 @@ BlackOilFluid * MultiFluidLiveOilTest::makeLiveOilFluid( string const & name, Gr path_array & tableNames = fluid.getReference< path_array >( BlackOilFluidBase::viewKeyStruct::tableFilesString() ); fill< 3 >( tableNames, {pvtoFileName, pvdgFileName, pvtwFileName} ); - fluid.postProcessInputRecursive(); + fluid.postInputInitializationRecursive(); return &fluid; } diff --git a/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp b/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp index 48e995d367e..b89ee33b2ae 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp @@ -45,7 +45,7 @@ RelativePermeabilityBase & makeBrooksCoreyRelPerm( string const & name, Group & phaseRelPermMaxVal.resize( 2 ); phaseRelPermMaxVal[0] = 0.8; phaseRelPermMaxVal[1] = 0.9; - relPerm.postProcessInputRecursive(); + relPerm.postInputInitializationRecursive(); return relPerm; } @@ -70,7 +70,7 @@ RelativePermeabilityBase & makeBrooksCoreyBakerRelPermTwoPhase( string const & n waterOilRelPermMaxVal.resize( 2 ); waterOilRelPermMaxVal[0] = 0.8; waterOilRelPermMaxVal[1] = 0.75; - relPerm.postProcessInputRecursive(); + relPerm.postInputInitializationRecursive(); return relPerm; } @@ -103,7 +103,7 @@ RelativePermeabilityBase & makeBrooksCoreyBakerRelPermThreePhase( string const & gasOilRelPermMaxVal.resize( 2 ); gasOilRelPermMaxVal[0] = 0.8; gasOilRelPermMaxVal[1] = 0.95; - relPerm.postProcessInputRecursive(); + relPerm.postInputInitializationRecursive(); return relPerm; } @@ -136,7 +136,7 @@ RelativePermeabilityBase & makeBrooksCoreyStone2RelPermThreePhase( string const gasOilRelPermMaxVal.resize( 2 ); gasOilRelPermMaxVal[0] = 0.8; gasOilRelPermMaxVal[1] = 0.95; - relPerm.postProcessInputRecursive(); + relPerm.postInputInitializationRecursive(); return relPerm; } @@ -161,7 +161,7 @@ RelativePermeabilityBase & makeVanGenuchtenBakerRelPermTwoPhase( string const & gasOilRelPermMaxVal.resize( 2 ); gasOilRelPermMaxVal[0] = 0.5; gasOilRelPermMaxVal[1] = 0.75; - relPerm.postProcessInputRecursive(); + relPerm.postInputInitializationRecursive(); return relPerm; } @@ -196,7 +196,7 @@ RelativePermeabilityBase & makeVanGenuchtenBakerRelPermThreePhase( string const gasOilRelPermMaxVal.resize( 2 ); gasOilRelPermMaxVal[0] = 0.8; gasOilRelPermMaxVal[1] = 0.75; - relPerm.postProcessInputRecursive(); + relPerm.postInputInitializationRecursive(); return relPerm; } @@ -231,7 +231,7 @@ RelativePermeabilityBase & makeVanGenuchtenStone2RelPermThreePhase( string const gasOilRelPermMaxVal.resize( 2 ); gasOilRelPermMaxVal[0] = 0.8; gasOilRelPermMaxVal[1] = 0.75; - relPerm.postProcessInputRecursive(); + relPerm.postInputInitializationRecursive(); return relPerm; } @@ -440,7 +440,7 @@ RelativePermeabilityBase & makeTableRelPermTwoPhase( string const & name, Group waterOilTableNames.resize( 2 ); waterOilTableNames[0] = "water_swg"; waterOilTableNames[1] = "gas_swg"; - relPerm.postProcessInputRecursive(); + relPerm.postInputInitializationRecursive(); relPerm.initialize(); // to test all the checks return relPerm; } @@ -750,7 +750,7 @@ RelativePermeabilityBase & makeTableRelPermHysteresisTwoPhase( string const & na auto & imbibitionGasTableName = relPerm.getReference< string >( keys::imbibitionNonWettingRelPermTableNameString() ); imbibitionGasTableName = "imbibitionGas_swg"; - relPerm.postProcessInputRecursive(); + relPerm.postInputInitializationRecursive(); relPerm.initialize(); // to test all the checks return relPerm; } @@ -832,7 +832,7 @@ RelativePermeabilityBase & makeTableRelPermThreePhase( string const & name, Grou gasOilTableNames.resize( 2 ); gasOilTableNames[0] = "gas_sgof"; gasOilTableNames[1] = "oil_sgof"; - relPerm.postProcessInputRecursive(); + relPerm.postInputInitializationRecursive(); relPerm.initialize(); // to test all the checks return relPerm; } diff --git a/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp b/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp index b4b8147c670..49f342cc8ac 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp @@ -229,7 +229,7 @@ TableRelativePermeabilityHysteresis & makeTableRelPermHysteresisTwoPhase( string auto & imbibitionGasTableName = relPerm.getReference< string >( keys::imbibitionNonWettingRelPermTableNameString() ); imbibitionGasTableName = "imbibitionGas_swg"; - relPerm.postProcessInputRecursive(); + relPerm.postInputInitializationRecursive(); relPerm.initialize(); // to test all the checks return relPerm; } diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp index 13b44c36d6a..731efb898b5 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp @@ -68,7 +68,7 @@ TEST( FieldSpecification, Aquifer ) auto & aquiferAngle = aquiferBC.getReference< real64 >( AquiferBoundaryCondition::viewKeyStruct::aquiferAngleString() ); aquiferAngle = 20.0; - aquiferBC.postProcessInputRecursive(); + aquiferBC.postInputInitializationRecursive(); AquiferBoundaryCondition::KernelWrapper aquiferBCWrapper = aquiferBC.createKernelWrapper(); diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp b/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp index e63c90f7631..9afee5f8cc4 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp @@ -63,7 +63,7 @@ void setupProblemFromXML( ProblemManager * const problemManager, char const * co ElementRegionManager & elementManager = domain.getMeshBody( 0 ).getBaseDiscretization().getElemManager(); xmlWrapper::xmlNode topLevelNode = xmlProblemNode.child( elementManager.getName().c_str() ); elementManager.processInputFileRecursive( xmlDocument, topLevelNode ); - elementManager.postProcessInputRecursive(); + elementManager.postInputInitializationRecursive(); problemManager->problemSetup(); problemManager->applyInitialConditions(); diff --git a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp index e2891e9eb96..2db03eea716 100644 --- a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp +++ b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp @@ -117,7 +117,7 @@ class MeshGenerationTest : public ::testing::Test ElementRegionManager & elementManager = domain.getMeshBody( 0 ).getBaseDiscretization().getElemManager(); xmlWrapper::xmlNode topLevelNode = xmlProblemNode.child( elementManager.getName().c_str() ); elementManager.processInputFileRecursive( xmlDocument, topLevelNode ); - elementManager.postProcessInputRecursive(); + elementManager.postInputInitializationRecursive(); problemManager.problemSetup(); problemManager.applyInitialConditions(); diff --git a/src/coreComponents/unitTests/meshTests/testVTKImport.cpp b/src/coreComponents/unitTests/meshTests/testVTKImport.cpp index 39a333b7e84..b47bb6c1742 100644 --- a/src/coreComponents/unitTests/meshTests/testVTKImport.cpp +++ b/src/coreComponents/unitTests/meshTests/testVTKImport.cpp @@ -69,7 +69,7 @@ void TestMeshImport( string const & meshFilePath, V const & validate, string con MeshManager meshManager( "mesh", &root ); meshManager.processInputFileRecursive( xmlDocument, xmlMeshNode ); - meshManager.postProcessInputRecursive(); + meshManager.postInputInitializationRecursive(); DomainPartition domain( "domain", &root ); meshManager.generateMeshes( domain ); diff --git a/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp b/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp index 1120fd74bec..f69f82bd0ad 100644 --- a/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp +++ b/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp @@ -303,7 +303,7 @@ TEST( ConformingVirtualElementOrder1, hexahedra ) ElementRegionManager & elementManager = mesh.getElemManager(); xmlWrapper::xmlNode topLevelNode = xmlProblemNode.child( elementManager.getName().c_str() ); elementManager.processInputFileRecursive( inputFile, topLevelNode ); - elementManager.postProcessInputRecursive(); + elementManager.postInputInitializationRecursive(); problemManager.problemSetup(); // Test computed projectors for all cells in MeshLevel @@ -356,7 +356,7 @@ TEST( ConformingVirtualElementOrder1, wedges ) ElementRegionManager & elementManager = mesh.getElemManager(); xmlWrapper::xmlNode topLevelNode = xmlProblemNode.child( elementManager.getName().c_str() ); elementManager.processInputFileRecursive( inputFile, topLevelNode ); - elementManager.postProcessInputRecursive(); + elementManager.postInputInitializationRecursive(); problemManager.problemSetup(); // Test computed projectors for all cells in MeshLevel From 746c6da201df5a5e2f76e59c92d1f16d5b8df414 Mon Sep 17 00:00:00 2001 From: Isaac Ju <54259248+IsaacJu-debug@users.noreply.github.com> Date: Mon, 1 Jul 2024 21:30:22 -0700 Subject: [PATCH 120/286] Implemented face-based lagrange contact solver with VEM (#3006) * First version that splits and spreads the face blocks meshes. * First version that goes through the FaceBlock init process. * Quick fix for heterogeneous fractures. * Add connections between matrix and fractures in serial * A version that goes through the computation without crashing. * Renaming fields in the FaceElementSubRegion. * Version that works for the t-shaped fracture on 2 ranks. * indent and renaminds. * Little cleaning about duplicated nodes. * Changing some mappings from array 2d to ArrayOfArrays. * Solving the global ids for vtk meshes? * Finish merge * Little cleaning of the vtk parallel split. * Indentation * Exchanging duplicated node information instead of hard coding it * FaceElementSubRegion + MPI (>2) cases improvements. * Fix wrong preallocation. * Improvements (?) in the fracture related information exchange * Mechanical test for Jian. * Temporary save. * Use the cell ids instead of the points ids! * First working version! * Removing useless FaceElementSubRegion::m_2dElemTo2dNodes * remove logs * This really is a first version working. (I had commented a critical part of the code). * Small simplification about the request of nodes. * Removing secondLevelMatches from the NeighborData. * Renaming duplicated into collocated. * Dealing with fracture elements with no boundary nodes. * Comments. * Centralize the collocated nodes key definition. * Adding a `vtk` namespace * Create initial cpp hpp files for implementing face-based contact solver with VEM. * Implement methods for calculating the face integral for a lowest order VEM function over polygonal faces * remove useless boundary markers. * Finish merge * Fixed bugs that cause the wrong output of face integral computations * Cleaning some duplicated code when exchanging boundary objects. * renamings * Misc comments and naming conventions. * Change the AllMeshes struct into a class. * Rewrite assemble force residual derivative wrt traction with the face integral functions * Better management of the missing nodes * Better management of the missing nodes to send. * regroup processes. * Improving some code about sanitizing the node senders. * Comments. * Renamings variables. * Comment the fixSecondaryMapping function. * Comments * Complete the method that compute face integrals and change nodalarea calculation with the newly implemented face integral method * Use as unique source of information about m_2dElemsToCollocatedNodesBuckets * Simplify the collocated nodes buckets management. * Remove split mesh dump * First batch of simple fixes from review. * Simplifying the missing nodes and the element type computation. * Clean a little bit the computation of the 3d elements for the FaceElementSubRegion. * A little doxygen * Testing that a value should always be 2 * Try to support more elements types in the FaceElementSubRegion. * Extend the usage of the CollocatedNodes class. * Use mesh_doctor to import fractured VTK files * It can be != 2 * Split fixSecondatyMappings, first round of fixes. * Simplifications of the fixSecondary mappings + comments. * Move and simplify the pack/unpack functions. * Removing unused functions. * change elemToFaces mapping from 2D array to array of array * Fix the lack of fields for fractures in parallel. * Add comments about the non guaranteed ordering. * Fix the unit tests. * First version of the fracture import test. * Using setup/teardown for better vtk file management in the test. * Change the key from "duplicated_nodes" to "collocated_nodes". * Refactoring the file name * Use vtkfile instead of the folder. * Finish unit test in parallel for the fracture import * Fix unused parameters. * doxygen * uncrustify * Yet another doxygen fix. * Yet another doxygen fix. * Fix ArrayOfArrays in the EDFM * Manage 2d faces vtk writing. * Remove unused file. * Add a link fix for g++ 8. * Differentiate between volumic and well adjacency. Remove useless fields in WESR. * uncrustify * comments. * fix LvArray error on GPUs. * compiles on lassen. * uncrustify * Better constness * Fix some consistency between mappings, * Improve consistency check. * Address some review comments. * fix surface vtk display * rename * Revert xml attempts. * Comments. * Use a static const m_MFN for handling with general-shaped elements * Add a member variable for testing the flexbility of polyhedral mesh on the inf-sup stabilization * Resolve conflicts with the develop branch * minor fix for resolving conflicts * resolved conflicts that have not been picked up by git. Mannually resolved conflicts * Revise code for successfully compiling VEM-based contact solver * minor revisions to allow sensitivity study on stabilization terms * local minor changes to merge with the develop branch * Implement a multiphysics driver for coupling VEM-based contact solver with poromechanics * Use VEM L2 projection for computing gaussian weights * remove unused file * Finish a first version of a coupling driver that enable VEM contact solver to work with poromechanics * minor changes in driver * accommodate changes related to catalogName * Resolve local minor issues * pseudo commit for merging develop branch * modify local schemas * update to the local uberenv branch * add geosx_dispatch_vem to solvers * Migrate L2 projectors functionalities into the refractored lagrange contact solver. Rewrite computeNodalArea member functions to handle with polygons * use a static variable m_MFN to faciliate using the L2 projectors for evaluating contact works * Delete original VEM-based contact implementations * uncrustify styles * Delete src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesVEM.rst * Delete src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesVEM_other.rst * Delete src/coreComponents/schema/docs/SolidMechanicsConformingFracturesVEM.rst * Delete src/coreComponents/schema/docs/SolidMechanicsConformingFracturesVEM_other.rst * regenerate schema and delete mesh_doctor egg files * add two examples for evaluating the validity of VEM-based lagrangian contact solver * Update ContactMechanics_PEBI_patch_test.xml * Update contactMechanics.ats * Update poromechanicsFractures.ats * Update SolidMechanicsLagrangeContact.hpp * Change m_MFN to a self-explanatory name * add comma in ats files * Move the function that computes diameter to the computational geometry hpp * uncrustify style * minor changes to the input file * add input files following the naming conventions. use constexp to avoid hard-coded variable value * uncrustify style * change ats to accommodate new input files * Modify input files for generating restart files properly * updating baseline * Checking new baselines on CI * modify restart step from 0 to 5. Restart from 0 essentially rerun the simulation twice, which does not do restart checking * update integratedTests * Checking integrated tests on CI * use restart=0 to pass the integrated test * pull with the remote branch * lagrange contact solver needs to save traction fields for restart. bug resolved * change ats for testing on poromechanic fracture * removed integratedTests to keep up with latest develop * update xml inpt * tpfa needs to be defined twice, which is a hack for contact solver with poromechanics to work * Update PoroElastic_dfm_PEBICrack_smoke.xml change the input for poromechanics fracture * WIP * Adjusting tols for failing test * Adding new/updates baselines --------- Co-authored-by: Thomas Gazzola Co-authored-by: Matteo Cusini Co-authored-by: Nicola Castelletto Co-authored-by: Nicola Castelletto <38361926+castelletto1@users.noreply.github.com> Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../ContactMechanics_PEBICrack_base.xml | 60 ++ .../ContactMechanics_PEBICrack_smoke.xml | 54 ++ .../contactMechanics.ats | 8 + .../contact_vem.vtm | 8 + .../lagrangianContactMechanics/domain_id.vtu | 148 +++++ .../fracture_id_new.vtu | 52 ++ .../PoroElastic_dfm_PEBICrack_base.xml | 264 +++++++++ .../PoroElastic_dfm_PEBICrack_smoke.xml | 99 ++++ .../poromechanicsFractures/displacedFault.vtm | 7 + .../poromechanicsFractures/domain_res5_id.vtu | 67 +++ .../fracture_res5_id.vtu | 52 ++ .../poromechanicsFractures.ats | 10 +- .../mesh/utilities/ComputationalGeometry.hpp | 34 ++ .../contact/SolidMechanicsLagrangeContact.cpp | 539 ++++++++++++++---- .../contact/SolidMechanicsLagrangeContact.hpp | 26 +- ...ePhasePoromechanicsConformingFractures.cpp | 55 +- ...ePhasePoromechanicsConformingFractures.hpp | 2 + 19 files changed, 1367 insertions(+), 124 deletions(-) create mode 100644 inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml create mode 100644 inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_smoke.xml create mode 100644 inputFiles/lagrangianContactMechanics/contact_vem.vtm create mode 100644 inputFiles/lagrangianContactMechanics/domain_id.vtu create mode 100644 inputFiles/lagrangianContactMechanics/fracture_id_new.vtu create mode 100644 inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_base.xml create mode 100644 inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_smoke.xml create mode 100644 inputFiles/poromechanicsFractures/displacedFault.vtm create mode 100644 inputFiles/poromechanicsFractures/domain_res5_id.vtu create mode 100644 inputFiles/poromechanicsFractures/fracture_res5_id.vtu diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index de96bd4ced6..352b2b972a2 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3196-5835-6563552 + baseline: integratedTests/baseline_integratedTests-pr3006-5860-947a907 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 90bf00312ea..7d44e61640f 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3006 (2024-07-01) +====================== +Added baselines for new tests. Relaxing tolerances for singlePhasePoromechanics_FaultModel_smoke. + PR #3196 (2024-06-28) ====================== Added isLaggingFractureStencilWeightsUpdate to hydrofracture solve. Rebaseline because of the new input. diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml new file mode 100644 index 00000000000..a07550a46b3 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_smoke.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_smoke.xml new file mode 100644 index 00000000000..b1dc79f49b6 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_smoke.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/contactMechanics.ats b/inputFiles/lagrangianContactMechanics/contactMechanics.ats index 7e21af247b6..b522d942a63 100644 --- a/inputFiles/lagrangianContactMechanics/contactMechanics.ats +++ b/inputFiles/lagrangianContactMechanics/contactMechanics.ats @@ -43,6 +43,14 @@ decks = [ partitions=((1, 1, 1), ), restart_step=1, check_step=2, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="ContactMechanics_PEBICrack_smoke", + description= + "Two cubes with a fracture separating them (unstructured PEBI grid)", + partitions=((1, 1, 1), (2, 1, 1)), + restart_step=5, + check_step=10, restartcheck_params=RestartcheckParameters(**restartcheck_params)) ] diff --git a/inputFiles/lagrangianContactMechanics/contact_vem.vtm b/inputFiles/lagrangianContactMechanics/contact_vem.vtm new file mode 100644 index 00000000000..810d9b1390a --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/contact_vem.vtm @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/domain_id.vtu b/inputFiles/lagrangianContactMechanics/domain_id.vtu new file mode 100644 index 00000000000..892ff0397be --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/domain_id.vtu @@ -0,0 +1,148 @@ + + + + + + + 0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 + + + + + AQAAAACAAABQAAAADAAAAA==eJxjYKAuAAAAUAAB + + + AQAAAACAAADwAAAADwAAAA==eJzjsO5T4xhBGAAuETnl + + + 1.7094007438e-15 + + + 1.7094007438e-15 + + + + + AQAAAACAAABQAAAADwAAAA==eJw7e8bH7iwVMQDZKiq9 + + + AQAAAACAAABQAAAAEAAAAA==eJxjZGBgYCQCEwsAArwACw== + + + AQAAAACAAACgAAAAMAAAAA==eJwtxUkCgBAAAECpiKLt/391MHOZEKbF0as3707OPlxcffpyc/ftx68//x4qMAC/ + + + + + AQAAAACAAAAgBAAA5QAAAA==eJzlkrENwlAQQ7MAQkIMQMcEiO6fC2pKkNiAERAUNwIFA7ACEgMgUdKySRZA4XKxE0YglfXj7/O9pKr6z+nuJXXZwfjGv/pVz0p6bo95oYf3Gr1frErq6WEtHs9MO07Oeccu12V7rjNhzIExp/FEznu8sewwem6N/b3XXc+ls/V9ES4cIBwguRAOEA4QDhAOEA4QDhAOEA4QDhAOEA4QDhAOEA6Q/SAcIBwgHKDMuEvo6ODG3SM7NTnEOXXunpnKvdMth9DBodH6rZJDaGZ2c4y7u5HJ7zz294Fn+E/8N4cP++C9cQ== + + + 0 + + + 2.4494897428 + + + + + + + AQAAAACAAABABgAAQAEAAA==eJxdkLVCA0AUBIO7OwSCu1twdw0S+P8/oWCm2WumubVXKPy/RtgE62ENXIVrcB1uwM34r74B1sY/dVtwO/6pa4YtsC7+q9+Bu3AverirFbaFv3n2ct8+LEeOud6tHXZEjrne7QAehr959rFfJ+yC3sEe9jqCx9A72MNePbA7/M2zj/1O4GnkmOvuXtgXOea6+wyeh7959lKvX3/0UKfPBXSPPuoGoHd0h37qL6F3vILX8Abewjs4CItwHI7Cofiv/h4+xD91Y3A4/ql7hE/wOf6rn4AlOBI93PUCX8PfPHu5bxJORY653u0NvkeOud5tGs6Ev3n2sV8FfkDvYA97zcI56B3sYa9P+BX+5tnHfgtwPnLMdfc3rEaOue5ehEvhb5691Ov3Ez3U6bMM3aOPul/oHd2hn/oV6B3/AHIHIeM= + + + AQAAAACAAACgAAAAPgAAAA==eJzjYoAAISgtA6U1oLQRlLaB0h5QOghKR0HpFCidB6XLoHQDlO6B0tOg9AIovQZKb4PS+6D0CSgNAOCvCDU= + + + AQAAAACAAAAUAAAAEwAAAA==eJzj5+EX4AciHn5+OAsADA4BJQ== + + + + + diff --git a/inputFiles/lagrangianContactMechanics/fracture_id_new.vtu b/inputFiles/lagrangianContactMechanics/fracture_id_new.vtu new file mode 100644 index 00000000000..ae71d526125 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/fracture_id_new.vtu @@ -0,0 +1,52 @@ + + + + + + + AQAAAACAAABgAQAAVgAAAA==eJwtxUkCgQAAAEAPolBItpREilD8/ycOZi6Tj/7Gnvrsi+e+eeHSoWeuXHjikwNfHbl27MZLt1458d1rP9w59dMbv73zy1v33nvwwZk/PvrrH4gxC0M= + + + 79.32212806 + + + 108.60018416 + + + + + AQAAAACAAACwAAAAMwAAAA==eJwtxbcBgCAAADCsiApY/3+VgWRJCN3g0ZNnL14dvTl59+HT2cXVl28/fv35dwM4CADo + + + + + AQAAAACAAABQAAAAIgAAAA==eJwtxbcBACAIADAsiP7/sAPJkog2PL28nT4uXz9/BXgALg== + + + + + AQAAAACAAAAIAQAAbQAAAA==eJxjYICBBnsQWbOlwQ7GtotysIexIXSD/enPCnYwNRsPqNsh1IDE4OrsMk1d7GBskUo/JDUNMDPtq4UmwOyyn7LAHCrugGSfgz3CHAd7hDlwO+2v8IfZw9zAezjcHuF+VHcjiyO5GY4B++o2Mg== + + + 1 + + + 1.7320508076 + + + + + + + AQAAAACAAACQAQAAWwAAAA==eJxdjkcShEAQw4AlLHlI//8qB6yL5qIq18jtqvpeHw5hG9YieRc2Ivk/HMOffO5M4SyPHnYt4SqPHjx6tnDXDjx6jrDIo4e7Z3jJo6co59+t3qL80c4XMZ8CDg== + + + AQAAAACAAABQAAAAIwAAAA==eJxjZYAATijNB6VFoLQklJaD0ipQWhNK60JpIygNACJgARQ= + + + AQAAAACAAAAKAAAACwAAAA==eJxjZ4cBAAGLAEc= + + + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_base.xml b/inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_base.xml new file mode 100644 index 00000000000..5f5aa06d519 --- /dev/null +++ b/inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_base.xml @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_smoke.xml b/inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_smoke.xml new file mode 100644 index 00000000000..77ea6c8ca5e --- /dev/null +++ b/inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_smoke.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/displacedFault.vtm b/inputFiles/poromechanicsFractures/displacedFault.vtm new file mode 100644 index 00000000000..2cf49998a4d --- /dev/null +++ b/inputFiles/poromechanicsFractures/displacedFault.vtm @@ -0,0 +1,7 @@ + + + + + + + diff --git a/inputFiles/poromechanicsFractures/domain_res5_id.vtu b/inputFiles/poromechanicsFractures/domain_res5_id.vtu new file mode 100644 index 00000000000..0ecafafb5fd --- /dev/null +++ b/inputFiles/poromechanicsFractures/domain_res5_id.vtu @@ -0,0 +1,67 @@ + + + + + + + AQAAAACAAADgfwAARhgAAA==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 + + + + + AQAAAACAAAAwGwAABAEAAA==eJztlksOxDAIQ9PO/e88mq3lZ6JoVKURC5SGfADjUO4xxv1yuUA+BwjF9k95IkenYNX52CsfapNivWVddTTSWrXf+aO66p50ZsZvnV9wD9msbLk67HCajTt9u7WK34ShyythnHhA8VB8Dh/CM+FGOFexJRySn2rbYULcUl4QpitvKPHW2a14f4p0P9T/36ew6nzslY+Z+ubqp+popLVqv/NHddU96cyM3zrvfoh5QRgnHlA8FF/3Q4zpyhtKvHV2K96fIt0P9f/3Kaw6H3vlY6a+ufqpOhpprdrv/FFddU86M+O3zrsfYl4QxokHFA/F1/0QY7ryhhJvnd2K9z/5Ao84Duw= + + + AQAAAACAAACQUQAAMQAAAA==eJztwzENAAAIA7B3SjCBx2lGCG3SbCeqqqqqqqqqqqqqqqqqqqqqqqqqqo8eaqCtmg== + + + 1.7094007438e-15 + + + 1.7094007438e-15 + + + + + AQAAAACAAAAwGwAAIwAAAA==eJztwwENAAAIA6BmJjC67/QgwkZuJ6qqqqqqqvp0AWlKhrc= + + + AQAAAACAAAAwGwAAPQAAAA==eJzt1rEJADAIRUGH/dl/hbSp0oiFcAci2Nm9VFUG5wxPnp3Pfet/AMC87b2ghwCAru29oIcAgK4L9At6fQ== + + + AQAAAACAAABgNgAAawoAAA==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 + + + + + AgAAAACAAADQPwAAnzAAAG4eAAA=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4q6xxV1ji7umNcq6axpP665pjbXumtYi666xxV1ji7vGFneNLe4aW9w1trhrbHHX2OKuaX2z7prWSeuuscVdY4u7xhZ3TfPfumtpdNfY4q6xxV3T+mbdNV1T666xxV1ji7vGFneNLe4aW9w17ce6a7pe1l1ji7umdcO6a2xx19jirul+t+5aOvzOxu5aOpy37K6l0V2H28i8ZXdN65J119jirrHFXdM8se6a1g3rrrHFXdP9aN01trhrmhvWXWOLu8YWd23XZ3LX0mo9J3ctje463EbOhd01trhrbHHXNFetu6Z737prGnPrrrHFXdN6Zd01trhrbHHX/LnsrqXDY84O9inuWhrdNba4a2xx17QmWHdN18K6a1pPrLum9dm6a1pzrLvGFneNLe4aW9w1trhrbHHX2OKuscVdY4u7xhZ3jS3ums+L3bV0OA7srlXL78zkrrHFXWOLu8YWd40t7ppet+4aW9w1trhrbHHX2OKu6XOtu5YOjtO6a9WuNLprbHHXdC9Yd01zzLprbHHX2OKuscVdY4u7xhZ3jS3umseH3bW0eh6Ru5ZG8xNuEzyPyF1ji7vGFneNLe4aW9w1trhrbHHXPA7srqXDcWN3Ld1Xjse6a2l019jirmkNt+4aW9w1reHWXWOLu8YWd40t7pruI+uu+dzZXUuH48buWrpPMG6JatzYXWOLu8YWd03roXXXtO5Zd01rmnXXfL7srqXDsWJ3LT0iGKskNVbsrulzrbum9cG6a2xx13TvWHeNLe4aW9w1trhrbHHX2OKuscVdY4u7pnXAumtaf6y7xhZ3zePG7lpaPYPIXUujuw63CZ5B5K6xxV1ji7umNdm6a1rHrLvGFneNLe6a1gTrrrHFXdNnWXctHRynddfS6K7DbexxWndNa4t119jirrHFXWOLu8YWd033uHXX2OKuad227prWMeuuscVd8/myu+Z5wu5aOpxj7K6l0V2H28gcY3eNLe4aW9w1trhrbHHXdL7WXdN+rLuWDo7BumtpdNfhNvYYrLvGFneNLe4aW9w1trhrbHHX2OKuscVd87xidy2tvkuo51G6mofsrmm+WXdN64x119jirnk+sLsOOphLGeH+rbuWRndNa75119jirrHFXWOLu8YWd40t7pqvI7tr6XAOZKlnWZa67uyu6Vpbd40t7hpb3DW2uGua29Zd03yw7pqv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 + + + 0 + + + 3221.0246817 + + + + + + + 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 + + + AQAAAACAAABgNgAARQoAAA==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 + + + AQAAAACAAADMBgAAFgAAAA==eJzT0hoFo2AUjIJRMAqGNgAA9C4diA== + + + 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 + + + AQAAAACAAABgNgAAMAwAAA==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 + + + + + diff --git a/inputFiles/poromechanicsFractures/fracture_res5_id.vtu b/inputFiles/poromechanicsFractures/fracture_res5_id.vtu new file mode 100644 index 00000000000..0fba5b6159e --- /dev/null +++ b/inputFiles/poromechanicsFractures/fracture_res5_id.vtu @@ -0,0 +1,52 @@ + + + + + + + AQAAAACAAABADQAABgMAAA==eJwtyMVSFgAAhVFduHDh+Ah2d2GD2I0NdnchJnZiYmCLgYmtKHZid3djgo0dG2f8z918c27B7Jn+LyVzoIX4BBfmk1yET3FRPs3F+AwX57N8Tkv4S+p5fym+wKX5IpfhS1yWL3M5vsJBfJWvaXl/Bb3ur8g3uBLf5Mp8i6vwba7KdziY7/I9DfFX0/v+UH7A1fkh1+BHXJMfcy1+wrX5KT/TOv66muqvx8+5Pr/gBvySG/IrbsSvuTG/4TQN8zfRdH9TfsvN+B035/fcgj9wS/7IrfgTf9Zwf4Rm+FvzF27DX7ktf+N2/J1nZgm0vX8Wd+BY7siddLa/M8/hudrFP4+7chx34/ncnRdwD17IPbmXLvL35sW8RPv4l3JfXsb9OJ7783IewCt4IEfqSv8gXsUJGuVfzYN5DQ/htTyU1/EwXs/DeYRu8EdzIm/Ukf5NPIo382jewmN4K4/lbTyOx+t2/wTewTt1oj+JJ/Eunsy7eQoncwzv4ak8Tff6p/M+3q8z/Ad4Jh/kWXyIY/kwz+YjPIfn6lH/PD7Gcdwya6DzuRUv4HCO0IX+1ryI2/BiXqJt/Uu5HS/j9hzPHXg5d+ROusLfmVdyF17FCdrVv5q78Rruzmu5B6/jntxL1/t78wbuw4m8Ufv6N3E/3sz9eQsP4K08kCN1m38Qb+co3sE7dbA/iYfwLh7Ku3kYJ/NwHqF7/NG8l0fyPt6vo/wHeDQf5DF8iMfyYR7H4/WIfwIf5Yl8jI/rJH8KT+YTPIVPcgyf4qk8TU/7p/MZPqs5sgWaU8/5c/F5vqC5/Xn0ov+S5vVf5nx8hfPzVS7ABfWavxBf5xta2F9Eb/pvaVH/bS7Gd7g43+USXFLv+UvxfX6gpf1l9KH/kZb1P+Zy/ISD+CmX5wr6zF+RU7kSP+fK/IJfahX/K67KrzmY33AIV9M0fyinc3V+yzX4Hb/Xmv4PXIs/cm3+xHW4rn721+MMrs9fuAF/5W/a0P+dG/EPbsw/OYyb6C9/U/7NzfgPN+e//A+qS/z/ + + + 3905.8931117 + + + 5326.4624283 + + + + + AQAAAACAAACgBgAAbgEAAA==eJwtxdciEAAAAEBRUmlpK9q0aEpbey/tTUMb0d57T6VBO+2NSGjvoflDHrp7uYCA/6o40EGu6moOdnWHuIZrupZDXdt1XNf1XN9hbuCGbuTGbuKmbuZwN3cLRzjSLd3Krd3Gbd3O7R3laHdwR3dyZ3dxjGPd1d3c3T3c070c596Odx/3dT/39wAP9CAneLCHeKiHebhHeKRHebTHeKzHebwneKInebITPcVTPc3TPcMzPcuzPcdzPc/zvcBJTvZCL/JiL3GKl3qZl3uFV3qVVzvVaU73Gmc402u9zuu9wRu9yZu9xVu9zdu9wzu9y7u9x3u9z/t9wAd9yId9xEd9zMd9wid9ylk+7TPO9lmf83lfcI5zfdGXfNlXfNXXfN03nOebvuXbvuO7vuf7fuCHfuTHfuKnzneBC/3MRS72c5f4hUtd5nK/9Cu/9hu/9Tu/9wd/9Cd/9hd/9Td/9w9X+Kd/+bf/+K//uRLqf1df + + + + + AQAAAACAAADgBAAAEgEAAA==eJwtxddCCAAAAMAiozSkoaGh0NAeqGhrSNEg7SFkJKFhlIhoaCBUP9tDdy8XEHAo0Ed81EE+5uM+4ZMOdohPOdRhDneETzvSZxzlaMc41mcd53gnONHnnORkpzjV553mdF/wRV9yhjOd5Wxfdo5zned8F7jQRS52iUt9xVd9zWUud4Wv+4YrXeVq17jWda73TTe40U1u9i23+LZb3eY7vut2d7jTXb7n++72A/e4133u94AHPeRhj3jUDz3mR37sJx73Uz/zc7/whF960q885dd+47ee9oxnPed3fu8P/uh5L/iTF/3ZX7zkr/7mZX/3D6941Wte909veNNb3vYv//Yf7/iv//m/d73nfR8ARZMvOw== + + + + + AQAAAACAAADwCQAAXQIAAA==eJxtlaFOK1EQhheFQZCKq1E3+xQN6Zm+QR8ATdKER1iPQVVvVhxxa6rQtNy6DcFhGzwJkhzF9ITO/93kVn3Z7M78Z86XTtP4r7/YN6dfey7enInvvv4Gdx/ih3dx/ybejOKnrfj1UXxYiz97cbMSX96LrzrxzS3yLJBhir4tek1QvzwHXr+IuwG8FDe/wKtd89/faob3E+qAB/H1i7gp4sPEkF/cT8XdQnxzK77qxJf34mYl/uzFh7X49RF9t+LNiAxv4od35PkQ333h27N5cHsu7i/I+/Wf3+nnHbG7F+zuBbt7we5esLunb0exuxfs7gW7e8HuXrC7F+zuBbt7we6e8iyQYYq+LXpNUL88B7t7qjOAl2J3D9l24qbB8xneT6gDHhL6JuRJyGnIbziX4byGORjmY5ibIZthzob5i9093JfY3cP9it09+CB29+DPHF6J3T2wO5bhXoZ7Ge5luJfhXoZ7p29HcXUvw70M9zLcy3Avw70M9zLcO+VZIMMUfVv0mqD+0b0M9051BvBSXN2LbDvx0b14PsP7CXXAQ0LfhDwJOQ35DecynNcwB8N8DHMzZDPM2TB/cXUv7ktc3Yv7FVf3wgdxdS/8mcMrcXUveB//+3XnlnAvuO7cEu4F151bwj19O4rrzi3hXnDduSXc0+5ZievOLeFecN25pzwLZJiib4teE9Q/7twS7qnOAF6K686NbLt/dqSez/B+Qh3wkNA3IU9CTkN+w7kM5zXMwTAfw9wM2QxzFtedG/eCvltx3blxv+K6c8MHcd254c8cXonrzi3pG10/Tpw= + + + 0 + + + 2304.8861143 + + + + + + + AQAAAACAAACAEwAAWQMAAA==eJxd1Vf7CAQYhnEjpKiUWYmiREX29rf33nvvvffee29KoShbpE2plJXxhRy474Oe9+R3Xff1nL/1Cz2/BjgFJ2M9rB99EtaNnX0ifho7+wSsEzv7eKwdO/s4/CR29rH4cezsY/Cj2NlHY63Y2UdhzdjZR+KHsbOPwBqxsw/HD2JnH4bvx84+FKvHzj4Eq8XOPhjfi519EL4bO/tArBo7+wCsEjt7f3wndvZ+WDl29r74duzsffCt2Nl745uxs/fCSrGz98SKsbP3wAqxs3fH8rGzd8NysbN3xbKxs3fBN2Jn74yvx87eCcvEzt4RX4udvQO+Gjt7e3wldvZ2WDp29rZYKnb2Nvhy7Oyt8aXY2QuwZOzsrfDF2NlbYonY2Vtg8djZm2Ox2Nmb4QuxszfForGzN8EisbM3xsKxszcq9P8rHL0h+k/8O5/jZzgpdvbjODF29mM4IXb2ozg+dvYjOC529sM4Nnb2QzgmdvaDODp29gM4Knb2/TgydvZ9OCJ29r04PHb2PTgsdvbdODR29l04JHb2nTg4dvYdOCh29u04MHb2bTggdvat2D929i3YL3b2zdg3dvZN2Cd29o3YO3b2Ddgrdvb12DN29nXYI3b2tdg9dvY12C129tXYNXb2VdgldvaV2Dl29hXYKXb25dgxdvZl2CF29qXYPnb2JdgudvbF2DZ29kXYJnb2hdg6dvYFWBA7+3xsFTv7PGwZO/tcbBE7+xxsHjv7bGwWO/ssbBo7+0xsEjv7DGwcO/t0bBQ7+zRsGDv7VPSf+Hee4hM8Hjv7YzwWO/sjPBo7+394JHb2h3g4dvYHeCh29vt4MHb2e3ggdva7uD929n9xX+zs/+De2Nnv4J7Y2f/G3bGz/4W7Ymf/E3fGzn4bd8TO/gduj539d9wWO/st3Bo7+03cEjv7b7g5dvZfcVPs7L/gxtjZf8YNsbP/hOtjZ/8R18XO/gOujZ39Bq6Jnf17XB07+3VcFTv7NVwZO/t3uCJ29qu4PHb2K7gsdvbLuDR29ku4JHb2i7g4dvYLuCh29vO4MHb2c7ggdvZvcX7s7N/gvNjZz+Lc2NnP4JzY2b/G2bGzf4WzYmc/jTNjZz+FM2JnP4nTY2f/EqfFzv4FTo2d/QQ+A6EeATg= + + + AQAAAACAAADgBAAADgEAAA==eJwtxRFwAgAAAMC2C4IgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCAaDwSAIgiAIgiAIBkEQDPqXDwbeQg474qhjjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrb/87R//eue9Dz765LMvvvrmu//88NMvBz7eBR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898tgTTz3z3AsvvfLaG2/95W//+Nc7733w0SefffHVN9/954effjnw+S7okMOOOOqY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvu+B9fwUXT + + + AQAAAACAAACcAAAADAAAAA==eJxjZx+8AABPhQRF + + + + + diff --git a/inputFiles/poromechanicsFractures/poromechanicsFractures.ats b/inputFiles/poromechanicsFractures/poromechanicsFractures.ats index 9c92fe7f782..4b1a097f90c 100644 --- a/inputFiles/poromechanicsFractures/poromechanicsFractures.ats +++ b/inputFiles/poromechanicsFractures/poromechanicsFractures.ats @@ -81,13 +81,21 @@ decks = [ check_step=12, restartcheck_params=RestartcheckParameters(atol=1e-05, rtol=4e-04)), + TestDeck( + name="PoroElastic_dfm_PEBICrack_smoke", + description='Plane strain poro-elastic problems with conforming vertical fracture (unstructured PEBI grid)', + partitions=((1, 1, 1), (3, 1, 1)), + restart_step=5, + check_step=10, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( name="singlePhasePoromechanics_FaultModel_smoke", description='PoroElastic conformingFracture intialization with external mesh', partitions=((1, 1, 1), (2, 2, 1)), restart_step=0, check_step=1, - restartcheck_params=RestartcheckParameters(**restartcheck_params)) + restartcheck_params=RestartcheckParameters(atol=1e-05, + rtol=1e-04)) ] generate_geos_tests(decks) diff --git a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp index 4b4383f6848..859d7e174f3 100644 --- a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp +++ b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp @@ -179,6 +179,40 @@ real64 ComputeSurfaceArea( arrayView2d< real64 const > const & points, return surfaceArea * 0.5; } +/** + * @brief Calculate the diameter of a set of points in a given dimension. + * @tparam DIMENSION The dimensionality of the points. + * @tparam POINT_COORDS_TYPE The type of the container holding the point coordinates. + * @param[in] points The container holding the coordinates of the points. + * @param[in] numPoints The number of points in the container. + * @return The diameter of the set of points. + */ +template< localIndex DIMENSION, typename POINT_COORDS_TYPE > +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +real64 computeDiameter( POINT_COORDS_TYPE points, + localIndex const & numPoints ) +{ + real64 diameter = 0; + for( localIndex numPoint = 0; numPoint < numPoints; ++numPoint ) + { + for( localIndex numOthPoint = 0; numOthPoint < numPoint; ++numOthPoint ) + { + real64 candidateDiameter = 0.0; + for( localIndex i = 0; i < DIMENSION; ++i ) + { + real64 coordDiff = points[numPoint][i] - points[numOthPoint][i]; + candidateDiameter += coordDiff * coordDiff; + } + if( diameter < candidateDiameter ) + { + diameter = candidateDiameter; + } + } + } + return LvArray::math::sqrt< real64 >( diameter ); +} + /** * @brief Calculate the centroid of a convex 3D polygon as well as the normal and the rotation matrix. * @tparam CENTER_TYPE The type of @p center. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index ef3b942a431..b1f61deccf7 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -16,7 +16,7 @@ * @file SolidMechanicsLagrangeContact.cpp * */ - +#define GEOSX_DISPATCH_VEM #include "SolidMechanicsLagrangeContact.hpp" #include "common/TimingMacros.hpp" @@ -54,6 +54,7 @@ using namespace constitutive; using namespace dataRepository; using namespace fields; using namespace finiteElement; +const localIndex geos::SolidMechanicsLagrangeContact::m_maxFaceNodes = 11; SolidMechanicsLagrangeContact::SolidMechanicsLagrangeContact( const string & name, Group * const parent ): @@ -438,13 +439,18 @@ void SolidMechanicsLagrangeContact::computeFaceDisplacementJump( DomainPartition { NodeManager const & nodeManager = mesh.getNodeManager(); FaceManager & faceManager = mesh.getFaceManager(); + EdgeManager const & edgeManager = mesh.getEdgeManager(); ElementRegionManager & elemManager = mesh.getElemManager(); - // Get the coordinates for all nodes - arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodePosition = nodeManager.referencePosition(); - ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); + ArrayOfArraysView< localIndex const > const faceToEdgeMap = faceManager.edgeList().toViewConst(); + arrayView2d< localIndex const > const & edgeToNodeMap = edgeManager.nodeList().toViewConst(); + arrayView2d< real64 const > faceCenters = faceManager.faceCenter(); + arrayView2d< real64 const > faceNormals = faceManager.faceNormal(); + arrayView1d< real64 const > faceAreas = faceManager.faceArea(); + // Get the coordinates for all nodes + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodePosition = nodeManager.referencePosition(); arrayView2d< real64 const, nodes::TOTAL_DISPLACEMENT_USD > const & u = nodeManager.getField< solidMechanics::totalDisplacement >(); @@ -474,8 +480,25 @@ void SolidMechanicsLagrangeContact::computeFaceDisplacementJump( DomainPartition localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elemsToFaces[kfe][0] ); array1d< real64 > nodalArea0, nodalArea1; - computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][0], nodalArea0 ); - computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][1], nodalArea1 ); + computeFaceNodalArea( elemsToFaces[kfe][0], + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormals, + faceAreas, + nodalArea0 ); + + computeFaceNodalArea( elemsToFaces[kfe][1], + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormals, + faceAreas, + nodalArea1 ); real64 globalJumpTemp[ 3 ] = { 0 }; for( localIndex a = 0; a < numNodesPerFace; ++a ) @@ -603,10 +626,15 @@ void SolidMechanicsLagrangeContact:: FaceManager const & faceManager = mesh.getFaceManager(); NodeManager const & nodeManager = mesh.getNodeManager(); + EdgeManager const & edgeManager = mesh.getEdgeManager(); ElementRegionManager const & elemManager = mesh.getElemManager(); - ArrayOfArraysView< localIndex const > const & faceToNodeMap = faceManager.nodeList().toViewConst(); - arrayView2d< real64 const > const & faceNormal = faceManager.faceNormal(); + ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); + ArrayOfArraysView< localIndex const > const faceToEdgeMap = faceManager.edgeList().toViewConst(); + arrayView2d< localIndex const > const & edgeToNodeMap = edgeManager.nodeList().toViewConst(); + arrayView2d< real64 const > faceCenters = faceManager.faceCenter(); + arrayView2d< real64 const > faceNormal = faceManager.faceNormal(); + arrayView1d< real64 const > faceAreas = faceManager.faceArea(); string const & dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); @@ -635,9 +663,9 @@ void SolidMechanicsLagrangeContact:: Nbar[ 2 ] = faceNormal[elemsToFaces[kfe][0]][2] - faceNormal[elemsToFaces[kfe][1]][2]; LvArray::tensorOps::normalize< 3 >( Nbar ); - globalIndex rowDOF[12]; - real64 nodeRHS[12]; - stackArray1d< real64, 12 > dRdP( 3*numNodesPerFace ); + globalIndex rowDOF[3 * m_maxFaceNodes]; + real64 nodeRHS[3 * m_maxFaceNodes]; + stackArray1d< real64, 3 * m_maxFaceNodes > dRdP( 3*m_maxFaceNodes ); for( localIndex kf=0; kf<2; ++kf ) { @@ -647,7 +675,15 @@ void SolidMechanicsLagrangeContact:: { // Compute local area contribution for each node array1d< real64 > nodalArea; - computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); + computeFaceNodalArea( elemsToFaces[kfe][kf], + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormal, + faceAreas, + nodalArea ); real64 const nodalForceMag = -( pressure[kfe] ) * nodalArea[a]; array1d< real64 > globalNodalForce( 3 ); @@ -913,26 +949,236 @@ void SolidMechanicsLagrangeContact::computeRotationMatrices( DomainPartition & d } ); } -void SolidMechanicsLagrangeContact::computeFaceNodalArea( arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodePosition, - ArrayOfArraysView< localIndex const > const & faceToNodeMap, - localIndex const kf0, - array1d< real64 > & nodalArea ) const +void SolidMechanicsLagrangeContact::computeFaceIntegrals( arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodesCoords, + localIndex const (&faceToNodes)[11], + localIndex const (&faceToEdges)[11], + localIndex const & numFaceVertices, + real64 const & faceArea, + real64 const (&faceCenter)[3], + real64 const (&faceNormal)[3], + arrayView2d< localIndex const > const & edgeToNodes, + real64 const & invCellDiameter, + real64 const (&cellCenter)[3], + array1d< real64 > & basisIntegrals, + real64 (& threeDMonomialIntegrals)[3] ) const { - // I've tried to access the finiteElement::dispatch3D with - // finiteElement::FiniteElementBase const & - // fe = fractureSubRegion->getReference< finiteElement::FiniteElementBase >( surfaceGenerator->getDiscretizationName() ); - // but it's either empty (unknown discretization) or for 3D only (e.g., hexahedra) GEOS_MARK_FUNCTION; + localIndex const MFN = m_maxFaceNodes; // Max number of face vertices. + basisIntegrals.resize( numFaceVertices ); + // Rotate the face. + // - compute rotation matrix. + real64 faceRotationMatrix[ 3 ][ 3 ]; + computationalGeometry::RotationMatrix_3D( faceNormal, faceRotationMatrix ); + // - below we compute the diameter, the rotated vertices and the rotated center. + real64 faceRotatedVertices[ MFN ][ 2 ]; + real64 faceDiameter = 0; + + for( localIndex numVertex = 0; numVertex < numFaceVertices; ++numVertex ) + { + // apply the transpose (that is the inverse) of the rotation matrix to face vertices. + // NOTE: + // the second and third rows of the transpose of the rotation matrix rotate on the 2D face. + faceRotatedVertices[numVertex][0] = + faceRotationMatrix[ 0 ][ 1 ]*nodesCoords( faceToNodes[ numVertex ], 0 ) + + faceRotationMatrix[ 1 ][ 1 ]*nodesCoords( faceToNodes[ numVertex ], 1 ) + + faceRotationMatrix[ 2 ][ 1 ]*nodesCoords( faceToNodes[ numVertex ], 2 ); + faceRotatedVertices[numVertex][1] = + faceRotationMatrix[ 0 ][ 2 ]*nodesCoords( faceToNodes[ numVertex ], 0 ) + + faceRotationMatrix[ 1 ][ 2 ]*nodesCoords( faceToNodes[ numVertex ], 1 ) + + faceRotationMatrix[ 2 ][ 2 ]*nodesCoords( faceToNodes[ numVertex ], 2 ); + } + + faceDiameter = computationalGeometry::computeDiameter< 2 >( faceRotatedVertices, + numFaceVertices ); + real64 const invFaceDiameter = 1.0/faceDiameter; + // - rotate the face centroid as done for the vertices. + real64 faceRotatedCentroid[2]; + faceRotatedCentroid[0] = + faceRotationMatrix[ 0 ][ 1 ]*faceCenter[0] + + faceRotationMatrix[ 1 ][ 1 ]*faceCenter[1] + + faceRotationMatrix[ 2 ][ 1 ]*faceCenter[2]; + faceRotatedCentroid[1] = + faceRotationMatrix[ 0 ][ 2 ]*faceCenter[0] + + faceRotationMatrix[ 1 ][ 2 ]*faceCenter[1] + + faceRotationMatrix[ 2 ][ 2 ]*faceCenter[2]; + // - compute edges' lengths, outward pointing normals and local edge-to-nodes map. + real64 edgeOutwardNormals[ MFN ][ 2 ]; + real64 edgeLengths[ MFN ]; + localIndex localEdgeToNodes[ MFN ][ 2 ]; + + for( localIndex numEdge = 0; numEdge < numFaceVertices; ++numEdge ) + { + if( edgeToNodes( faceToEdges[numEdge], 0 ) == faceToNodes[ numEdge ] ) + { + localEdgeToNodes[ numEdge ][ 0 ] = numEdge; + localEdgeToNodes[ numEdge ][ 1 ] = (numEdge+1)%numFaceVertices; + } + else + { + localEdgeToNodes[ numEdge ][ 0 ] = (numEdge+1)%numFaceVertices; + localEdgeToNodes[ numEdge ][ 1 ] = numEdge; + } + real64 edgeTangent[2]; + edgeTangent[0] = faceRotatedVertices[(numEdge+1)%numFaceVertices][0] - + faceRotatedVertices[numEdge][0]; + edgeTangent[1] = faceRotatedVertices[(numEdge+1)%numFaceVertices][1] - + faceRotatedVertices[numEdge][1]; + edgeOutwardNormals[numEdge][0] = edgeTangent[1]; + edgeOutwardNormals[numEdge][1] = -edgeTangent[0]; + real64 signTestVector[2]; + signTestVector[0] = faceRotatedVertices[numEdge][0] - faceRotatedCentroid[0]; + signTestVector[1] = faceRotatedVertices[numEdge][1] - faceRotatedCentroid[1]; + if( signTestVector[0]*edgeOutwardNormals[numEdge][0] + + signTestVector[1]*edgeOutwardNormals[numEdge][1] < 0 ) + { + edgeOutwardNormals[numEdge][0] = -edgeOutwardNormals[numEdge][0]; + edgeOutwardNormals[numEdge][1] = -edgeOutwardNormals[numEdge][1]; + } + edgeLengths[numEdge] = LvArray::math::sqrt< real64 >( edgeTangent[0]*edgeTangent[0] + + edgeTangent[1]*edgeTangent[1] ); + edgeOutwardNormals[numEdge][0] /= edgeLengths[numEdge]; + edgeOutwardNormals[numEdge][1] /= edgeLengths[numEdge]; + } + + // Compute boundary quadrature weights (also equal to the integrals of basis functions on the + // boundary). + real64 boundaryQuadratureWeights[ MFN ]; + for( localIndex numWeight = 0; numWeight < numFaceVertices; ++numWeight ) + boundaryQuadratureWeights[numWeight] = 0.0; + for( localIndex numEdge = 0; numEdge < numFaceVertices; ++numEdge ) + { + boundaryQuadratureWeights[ localEdgeToNodes[ numEdge ][ 0 ] ] += 0.5*edgeLengths[numEdge]; + boundaryQuadratureWeights[ localEdgeToNodes[ numEdge ][ 1 ] ] += 0.5*edgeLengths[numEdge]; + } + + // Compute scaled monomials' integrals on edges. + real64 monomBoundaryIntegrals[3] = { 0.0 }; + for( localIndex numVertex = 0; numVertex < numFaceVertices; ++numVertex ) + { + monomBoundaryIntegrals[0] += boundaryQuadratureWeights[ numVertex ]; + monomBoundaryIntegrals[1] += (faceRotatedVertices[ numVertex ][ 0 ] - faceRotatedCentroid[0]) * + invFaceDiameter*boundaryQuadratureWeights[ numVertex ]; + monomBoundaryIntegrals[2] += (faceRotatedVertices[ numVertex ][ 1 ] - faceRotatedCentroid[1]) * + invFaceDiameter*boundaryQuadratureWeights[ numVertex ]; + } + + // Compute non constant 2D and 3D scaled monomials' integrals on the face. + real64 monomInternalIntegrals[2] = { 0.0 }; + for( localIndex numSubTriangle = 0; numSubTriangle < numFaceVertices; ++numSubTriangle ) + { + localIndex const nextVertex = (numSubTriangle+1)%numFaceVertices; + // - compute value of 2D monomials at the quadrature point on the sub-triangle (the + // barycenter). + // The result is ((v(0)+v(1)+faceCenter)/3 - faceCenter) / faceDiameter = + // = (v(0) + v(1) - 2*faceCenter)/(3*faceDiameter). + real64 monomialValues[2]; + for( localIndex i = 0; i < 2; ++i ) + { + monomialValues[i] = (faceRotatedVertices[numSubTriangle][i] + + faceRotatedVertices[nextVertex][i] - + 2.0*faceRotatedCentroid[i]) / (3.0*faceDiameter); + } + // compute value of 3D monomials at the quadrature point on the sub-triangle (the + // barycenter). The result is + // ((v(0) + v(1) + faceCenter)/3 - cellCenter)/cellDiameter. + real64 threeDMonomialValues[3]; + for( localIndex i = 0; i < 3; ++i ) + { + threeDMonomialValues[i] = ( (faceCenter[i] + + nodesCoords[faceToNodes[ numSubTriangle ]][i] + + nodesCoords[faceToNodes[ nextVertex ]][i]) / 3.0 - + cellCenter[i] ) * invCellDiameter; + } + // compute quadrature weight associated to the quadrature point (the area of the + // sub-triangle). + real64 edgesTangents[2][2]; // used to compute the area of the sub-triangle + for( localIndex i = 0; i < 2; ++i ) + { + edgesTangents[0][i] = faceRotatedVertices[numSubTriangle][i] - faceRotatedCentroid[i]; + } + for( localIndex i = 0; i < 2; ++i ) + { + edgesTangents[1][i] = faceRotatedVertices[nextVertex][i] - faceRotatedCentroid[i]; + } + real64 subTriangleArea = 0.5*LvArray::math::abs + ( edgesTangents[0][0]*edgesTangents[1][1] - + edgesTangents[0][1]*edgesTangents[1][0] ); + // compute the integrals on the sub-triangle and add it to the global integrals + for( localIndex i = 0; i < 2; ++i ) + { + monomInternalIntegrals[ i ] += monomialValues[ i ]*subTriangleArea; + } + for( localIndex i = 0; i < 3; ++i ) + { + // threeDMonomialIntegrals is assumed to be initialized to 0 by the caller + threeDMonomialIntegrals[ i ] += threeDMonomialValues[ i ]*subTriangleArea; + } + } + + // Compute integral of basis functions times normal derivative of monomials on the boundary. + real64 basisTimesMonomNormalDerBoundaryInt[ MFN ][ 2 ]; + for( localIndex numVertex = 0; numVertex < numFaceVertices; ++numVertex ) + { + for( localIndex i = 0; i < 2; ++i ) + { + basisTimesMonomNormalDerBoundaryInt[ numVertex ][ i ] = 0.0; + } + } + for( localIndex numVertex = 0; numVertex < numFaceVertices; ++numVertex ) + { + for( localIndex i = 0; i < 2; ++i ) + { + real64 thisEdgeIntTimesNormal_i = edgeOutwardNormals[numVertex][i]*edgeLengths[numVertex]; + basisTimesMonomNormalDerBoundaryInt[ localEdgeToNodes[ numVertex ][ 0 ] ][i] += thisEdgeIntTimesNormal_i; + basisTimesMonomNormalDerBoundaryInt[ localEdgeToNodes[ numVertex ][ 1 ] ][i] += thisEdgeIntTimesNormal_i; + } + } + for( localIndex numVertex = 0; numVertex < numFaceVertices; ++numVertex ) + { + for( localIndex i = 0; i < 2; ++i ) + { + basisTimesMonomNormalDerBoundaryInt[ numVertex ][ i ] *= 0.5*invFaceDiameter; + } + } + + // Compute integral mean of basis functions on this face. + real64 const invFaceArea = 1.0/faceArea; + real64 const monomialDerivativeInverse = (faceDiameter*faceDiameter)*invFaceArea; + for( localIndex numVertex = 0; numVertex < numFaceVertices; ++numVertex ) + { + real64 piNablaDofs[ 3 ]; + piNablaDofs[ 1 ] = monomialDerivativeInverse * + basisTimesMonomNormalDerBoundaryInt[ numVertex ][ 0 ]; + piNablaDofs[ 2 ] = monomialDerivativeInverse * + basisTimesMonomNormalDerBoundaryInt[ numVertex ][ 1 ]; + piNablaDofs[ 0 ] = (boundaryQuadratureWeights[ numVertex ] - + piNablaDofs[ 1 ]*monomBoundaryIntegrals[ 1 ] - + piNablaDofs[ 2 ]*monomBoundaryIntegrals[ 2 ])/monomBoundaryIntegrals[ 0 ]; + basisIntegrals[ numVertex ] = piNablaDofs[ 0 ]*faceArea + + (piNablaDofs[ 1 ]*monomInternalIntegrals[ 0 ] + + piNablaDofs[ 2 ]*monomInternalIntegrals[ 1 ]); + } +} +void SolidMechanicsLagrangeContact::computeFaceNodalArea( localIndex const kf0, + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodePosition, + ArrayOfArraysView< localIndex const > const & faceToNodeMap, + ArrayOfArraysView< localIndex const > const & faceToEdgeMap, + arrayView2d< localIndex const > const & edgeToNodeMap, + arrayView2d< real64 const > const faceCenters, + arrayView2d< real64 const > const faceNormals, + arrayView1d< real64 const > const faceAreas, + array1d< real64 > & basisIntegrals ) const +{ + GEOS_MARK_FUNCTION; localIndex const TriangularPermutation[3] = { 0, 1, 2 }; localIndex const QuadrilateralPermutation[4] = { 0, 1, 3, 2 }; - localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( kf0 ); - nodalArea.resize( numNodesPerFace ); + basisIntegrals.resize( numNodesPerFace ); for( localIndex a = 0; a < numNodesPerFace; ++a ) { - nodalArea[a] = 0.0; + basisIntegrals[a] = 0.0; } localIndex const * const permutation = ( numNodesPerFace == 3 ) ? TriangularPermutation : QuadrilateralPermutation; if( numNodesPerFace == 3 ) @@ -952,7 +1198,7 @@ void SolidMechanicsLagrangeContact::computeFaceNodalArea( arrayView2d< real64 co H1_TriangleFace_Lagrange1_Gauss1::calcN( q, N ); for( localIndex a = 0; a < numNodesPerFace; ++a ) { - nodalArea[a] += detJ * N[permutation[a]]; + basisIntegrals[a] += detJ * N[permutation[a]]; } } } @@ -973,14 +1219,56 @@ void SolidMechanicsLagrangeContact::computeFaceNodalArea( arrayView2d< real64 co H1_QuadrilateralFace_Lagrange1_GaussLegendre2::calcN( q, N ); for( localIndex a = 0; a < numNodesPerFace; ++a ) { - nodalArea[a] += detJ * N[permutation[a]]; + basisIntegrals[a] += detJ * N[permutation[a]]; } } } + else if( numNodesPerFace > 4 && numNodesPerFace <= m_maxFaceNodes ) + { + // we need to L2 projector based on VEM to approximate the quadrature weights + // we need to use extra geometry information to computing L2 projector + + localIndex const MFN = m_maxFaceNodes; // Max number of face vertices. + localIndex const faceIndex = kf0; + localIndex const numFaceNodes = faceToNodeMap[ faceIndex ].size(); + + // get the face center and normal. + real64 const faceArea = faceAreas[ faceIndex ]; + localIndex faceToNodes[ MFN ]; + localIndex faceToEdges[ MFN ]; + for( localIndex i = 0; i < numFaceNodes; ++i ) + { + faceToNodes[i] = faceToNodeMap[ faceIndex ][ i ]; + faceToEdges[i] = faceToEdgeMap[ faceIndex ][ i ]; + } + // - get outward face normal and center + real64 faceNormal[3] = { faceNormals[faceIndex][0], + faceNormals[faceIndex][1], + faceNormals[faceIndex][2] }; + real64 const faceCenter[3] { faceCenters[faceIndex][0], + faceCenters[faceIndex][1], + faceCenters[faceIndex][2] }; + // - compute integrals calling auxiliary method + real64 threeDMonomialIntegrals[3] = { 0.0 }; + real64 const invCellDiameter = 0.0; + real64 const cellCenter[3] { 0.0, 0.0, 0.0 }; + computeFaceIntegrals( nodePosition, + faceToNodes, + faceToEdges, + numFaceNodes, + faceArea, + faceCenter, + faceNormal, + edgeToNodeMap, + invCellDiameter, + cellCenter, + basisIntegrals, + threeDMonomialIntegrals ); + } else { GEOS_ERROR( "SolidMechanicsLagrangeContact " << getDataContext() << ": face with " << numNodesPerFace << - " nodes. Only triangles and quadrilaterals are supported." ); + " nodes. Only triangles and quadrilaterals and PEBI prisms up to 11 sides are supported." ); } } @@ -995,9 +1283,15 @@ void SolidMechanicsLagrangeContact:: FaceManager const & faceManager = mesh.getFaceManager(); NodeManager const & nodeManager = mesh.getNodeManager(); + EdgeManager const & edgeManager = mesh.getEdgeManager(); ElementRegionManager const & elemManager = mesh.getElemManager(); ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); + ArrayOfArraysView< localIndex const > const faceToEdgeMap = faceManager.edgeList().toViewConst(); + arrayView2d< localIndex const > const & edgeToNodeMap = edgeManager.nodeList().toViewConst(); + arrayView2d< real64 const > faceCenters = faceManager.faceCenter(); + arrayView2d< real64 const > faceNormals = faceManager.faceNormal(); + arrayView1d< real64 const > faceAreas = faceManager.faceArea(); string const & tracDofKey = dofManager.getKey( contact::traction::key() ); string const & dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); @@ -1017,104 +1311,76 @@ void SolidMechanicsLagrangeContact:: arrayView3d< real64 const > const & rotationMatrix = subRegion.getReference< array3d< real64 > >( viewKeyStruct::rotationMatrixString() ); ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); - constexpr localIndex TriangularPermutation[3] = { 0, 1, 2 }; - constexpr localIndex QuadrilateralPermutation[4] = { 0, 1, 3, 2 }; - forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { if( elemsToFaces.sizeOfArray( kfe ) != 2 ) { return; } - localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elemsToFaces[kfe][0] ); - localIndex const numQuadraturePointsPerElem = numNodesPerFace==3 ? 1 : 4; - globalIndex rowDOF[12]; - real64 nodeRHS[12]; - stackArray2d< real64, 3*4*3 > dRdT( 3*numNodesPerFace, 3 ); + globalIndex rowDOF[3 * m_maxFaceNodes]; // this needs to be changed when dealing with arbitrary element types + real64 nodeRHS[3 * m_maxFaceNodes]; + stackArray2d< real64, 3 * m_maxFaceNodes * 3 > dRdT( 3 * m_maxFaceNodes, 3 ); globalIndex colDOF[3]; for( localIndex i = 0; i < 3; ++i ) { colDOF[i] = tracDofNumber[kfe] + i; } - localIndex const * const permutation = ( numNodesPerFace == 3 ) ? TriangularPermutation : QuadrilateralPermutation; - real64 xLocal[2][4][3]; for( localIndex kf = 0; kf < 2; ++kf ) { + constexpr int normalSign[2] = { 1, -1 }; + // Testing the face integral on polygonal faces + array1d< real64 > nodalArea; localIndex const faceIndex = elemsToFaces[kfe][kf]; + computeFaceNodalArea( faceIndex, + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormals, + faceAreas, + nodalArea ); + for( localIndex a = 0; a < numNodesPerFace; ++a ) { - for( localIndex j = 0; j < 3; ++j ) + real64 const localNodalForce[ 3 ] = { traction( kfe, 0 ) * nodalArea[a], + traction( kfe, 1 ) * nodalArea[a], + traction( kfe, 2 ) * nodalArea[a] }; + real64 globalNodalForce[ 3 ]; + LvArray::tensorOps::Ri_eq_AijBj< 3, 3 >( globalNodalForce, rotationMatrix[ kfe ], localNodalForce ); + + for( localIndex i = 0; i < 3; ++i ) { - xLocal[kf][a][j] = nodePosition[ faceToNodeMap( faceIndex, permutation[a] ) ][j]; + rowDOF[3*a+i] = dispDofNumber[faceToNodeMap( faceIndex, a )] + i; + // Opposite sign w.r.t. to formulation presented in + // Algebraically Stabilized Lagrange Multiplier Method for Frictional Contact Mechanics with + // Hydraulically Active Fractures + // Franceschini, A., Castelletto, N., White, J. A., Tchelepi, H. A. + // Computer Methods in Applied Mechanics and Engineering (2020) 368, 113161 + // doi: 10.1016/j.cma.2020.113161 + nodeRHS[3*a+i] = +globalNodalForce[i] * normalSign[ kf ]; + + // Opposite sign w.r.t. to the same formulation as above + dRdT( 3*a+i, 0 ) = rotationMatrix( kfe, i, 0 ) * normalSign[ kf ] * nodalArea[a]; + dRdT( 3*a+i, 1 ) = rotationMatrix( kfe, i, 1 ) * normalSign[ kf ] * nodalArea[a]; + dRdT( 3*a+i, 2 ) = rotationMatrix( kfe, i, 2 ) * normalSign[ kf ] * nodalArea[a]; } } - } - real64 N[4]; - - for( localIndex q=0; q(N) ); - } - else if( numNodesPerFace==4 ) - { - H1_QuadrilateralFace_Lagrange1_GaussLegendre2::calcN( q, N ); - } - - constexpr int normalSign[2] = { 1, -1 }; - for( localIndex kf = 0; kf < 2; ++kf ) + for( localIndex idof = 0; idof < numNodesPerFace * 3; ++idof ) { - localIndex const faceIndex = elemsToFaces[kfe][kf]; - using xLocalTriangle = real64[3][3]; - real64 const detJxW = numNodesPerFace==3 ? - H1_TriangleFace_Lagrange1_Gauss1::transformedQuadratureWeight( q, reinterpret_cast< xLocalTriangle & >( xLocal[kf] ) ) : - H1_QuadrilateralFace_Lagrange1_GaussLegendre2::transformedQuadratureWeight( q, xLocal[kf] ); - - for( localIndex a = 0; a < numNodesPerFace; ++a ) - { - real64 const NaDetJxQ = N[permutation[a]] * detJxW; - real64 const localNodalForce[ 3 ] = { traction( kfe, 0 ) * NaDetJxQ, - traction( kfe, 1 ) * NaDetJxQ, - traction( kfe, 2 ) * NaDetJxQ }; - real64 globalNodalForce[ 3 ]; - LvArray::tensorOps::Ri_eq_AijBj< 3, 3 >( globalNodalForce, rotationMatrix[ kfe ], localNodalForce ); - - for( localIndex i = 0; i < 3; ++i ) - { - rowDOF[3*a+i] = dispDofNumber[faceToNodeMap( faceIndex, a )] + i; - // Opposite sign w.r.t. to formulation presented in - // Algebraically Stabilized Lagrange Multiplier Method for Frictional Contact Mechanics with - // Hydraulically Active Fractures - // Franceschini, A., Castelletto, N., White, J. A., Tchelepi, H. A. - // Computer Methods in Applied Mechanics and Engineering (2020) 368, 113161 - // doi: 10.1016/j.cma.2020.113161 - nodeRHS[3*a+i] = +globalNodalForce[i] * normalSign[ kf ]; - - // Opposite sign w.r.t. to the same formulation as above - dRdT( 3*a+i, 0 ) = rotationMatrix( kfe, i, 0 ) * normalSign[ kf ] * NaDetJxQ; - dRdT( 3*a+i, 1 ) = rotationMatrix( kfe, i, 1 ) * normalSign[ kf ] * NaDetJxQ; - dRdT( 3*a+i, 2 ) = rotationMatrix( kfe, i, 2 ) * normalSign[ kf ] * NaDetJxQ; - } - } + localIndex const localRow = LvArray::integerConversion< localIndex >( rowDOF[idof] - rankOffset ); - for( localIndex idof = 0; idof < numNodesPerFace * 3; ++idof ) + if( localRow >= 0 && localRow < localMatrix.numRows() ) { - localIndex const localRow = LvArray::integerConversion< localIndex >( rowDOF[idof] - rankOffset ); - - if( localRow >= 0 && localRow < localMatrix.numRows() ) - { - localMatrix.addToRow< parallelHostAtomic >( localRow, - colDOF, - dRdT[idof].dataIfContiguous(), - 3 ); - RAJA::atomicAdd( parallelHostAtomic{}, &localRhs[localRow], nodeRHS[idof] ); - } + localMatrix.addToRow< parallelHostAtomic >( localRow, + colDOF, + dRdT[idof].dataIfContiguous(), + 3 ); + RAJA::atomicAdd( parallelHostAtomic{}, &localRhs[localRow], nodeRHS[idof] ); } } } @@ -1122,6 +1388,7 @@ void SolidMechanicsLagrangeContact:: } ); } + void SolidMechanicsLagrangeContact:: assembleTractionResidualDerivativeWrtDisplacementAndTraction( MeshLevel const & mesh, arrayView1d< string const > const & regionNames, @@ -1132,9 +1399,15 @@ void SolidMechanicsLagrangeContact:: GEOS_MARK_FUNCTION; FaceManager const & faceManager = mesh.getFaceManager(); NodeManager const & nodeManager = mesh.getNodeManager(); + EdgeManager const & edgeManager = mesh.getEdgeManager(); ElementRegionManager const & elemManager = mesh.getElemManager(); ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); + ArrayOfArraysView< localIndex const > const faceToEdgeMap = faceManager.edgeList().toViewConst(); + arrayView2d< localIndex const > const & edgeToNodeMap = edgeManager.nodeList().toViewConst(); + arrayView2d< real64 const > faceCenters = faceManager.faceCenter(); + arrayView2d< real64 const > faceNormals = faceManager.faceNormal(); + arrayView1d< real64 const > faceAreas = faceManager.faceArea(); string const & tracDofKey = dofManager.getKey( contact::traction::key() ); string const & dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); @@ -1179,7 +1452,7 @@ void SolidMechanicsLagrangeContact:: if( ghostRank[kfe] < 0 ) { localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elemsToFaces[kfe][0] ); - globalIndex nodeDOF[24]; + globalIndex nodeDOF[2 * 3 * m_maxFaceNodes]; globalIndex elemDOF[3]; for( localIndex i = 0; i < 3; ++i ) { @@ -1189,7 +1462,7 @@ void SolidMechanicsLagrangeContact:: real64 elemRHS[3] = {0.0, 0.0, 0.0}; real64 const Ja = area[kfe]; - stackArray2d< real64, 2 * 3 * 4 * 3 > dRdU( 3, 2 * 3 * numNodesPerFace ); + stackArray2d< real64, 2 * 3 * m_maxFaceNodes * 3 > dRdU( 3, 2 * 3 * m_maxFaceNodes ); stackArray2d< real64, 3 * 3 > dRdT( 3, 3 ); switch( fractureState[kfe] ) @@ -1212,7 +1485,15 @@ void SolidMechanicsLagrangeContact:: { // Compute local area contribution for each node array1d< real64 > nodalArea; - computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); + computeFaceNodalArea( elemsToFaces[kfe][kf], + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormals, + faceAreas, + nodalArea ); for( localIndex a = 0; a < numNodesPerFace; ++a ) { @@ -1238,7 +1519,15 @@ void SolidMechanicsLagrangeContact:: { // Compute local area contribution for each node array1d< real64 > nodalArea; - computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); + computeFaceNodalArea( elemsToFaces[kfe][kf], + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormals, + faceAreas, + nodalArea ); for( localIndex a = 0; a < numNodesPerFace; ++a ) { @@ -1279,7 +1568,15 @@ void SolidMechanicsLagrangeContact:: { // Compute local area contribution for each node array1d< real64 > nodalArea; - computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); + computeFaceNodalArea( elemsToFaces[kfe][kf], + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormals, + faceAreas, + nodalArea ); for( localIndex a = 0; a < numNodesPerFace; ++a ) { @@ -1372,6 +1669,7 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes FaceManager const & faceManager = mesh.getFaceManager(); NodeManager const & nodeManager = mesh.getNodeManager(); + EdgeManager const & edgeManager = mesh.getEdgeManager(); ElementRegionManager const & elemManager = mesh.getElemManager(); string const & tracDofKey = dofManager.getKey( contact::traction::key() ); @@ -1390,8 +1688,7 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes SurfaceElementRegion const & fractureRegion = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); FaceElementSubRegion const & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); - GEOS_ERROR_IF( !fractureSubRegion.hasField< contact::traction >(), - getDataContext() << ": The fracture subregion must contain traction field." ); + GEOS_ERROR_IF( !fractureSubRegion.hasField< contact::traction >(), "The fracture subregion must contain traction field." ); ArrayOfArraysView< localIndex const > const elem2dToFaces = fractureSubRegion.faceList().toViewConst(); // Get the state of fracture elements @@ -1410,7 +1707,12 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodePosition = nodeManager.referencePosition(); // Get area and rotation matrix for all faces - ArrayOfArraysView< localIndex const > const & faceToNodeMap = faceManager.nodeList().toViewConst(); + ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); + ArrayOfArraysView< localIndex const > const faceToEdgeMap = faceManager.edgeList().toViewConst(); + arrayView2d< localIndex const > const & edgeToNodeMap = edgeManager.nodeList().toViewConst(); + arrayView2d< real64 const > faceCenters = faceManager.faceCenter(); + arrayView2d< real64 const > faceNormals = faceManager.faceNormal(); + arrayView1d< real64 const > const & faceArea = faceManager.faceArea(); arrayView3d< real64 const > const & faceRotationMatrix = fractureSubRegion.getReference< array3d< real64 > >( viewKeyStruct::rotationMatrixString() ); @@ -1510,8 +1812,29 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes } } array1d< real64 > nodalArea0, nodalArea1; - computeFaceNodalArea( nodePosition, faceToNodeMap, elem2dToFaces[sei[iconn][0]][0], nodalArea0 ); - computeFaceNodalArea( nodePosition, faceToNodeMap, elem2dToFaces[sei[iconn][1]][id1], nodalArea1 ); + localIndex const faceIndex0 = elem2dToFaces[sei[iconn][0]][0]; + localIndex const faceIndex1 = elem2dToFaces[sei[iconn][1]][id1]; + + computeFaceNodalArea( faceIndex0, + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormals, + faceArea, + nodalArea0 ); + + computeFaceNodalArea( faceIndex1, + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormals, + faceArea, + nodalArea1 ); + real64 const areafac = nodalArea0[node0index0] * nodalArea1[node0index1] + nodalArea0[node1index0] * nodalArea1[node1index1]; // first index: face, second index: element (T/B), third index: dof (x, y, z) diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index bdb00997153..80201585a4d 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -145,10 +145,28 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase void computeTolerances( DomainPartition & domain ) const; - void computeFaceNodalArea( arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodePosition, + void computeFaceNodalArea( localIndex const kf0, + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodePosition, ArrayOfArraysView< localIndex const > const & faceToNodeMap, - localIndex const kf0, - array1d< real64 > & nodalArea ) const; + ArrayOfArraysView< localIndex const > const & faceToEdgeMap, + arrayView2d< localIndex const > const & edgeToNodeMap, + arrayView2d< real64 const > const faceCenters, + arrayView2d< real64 const > const faceNormals, + arrayView1d< real64 const > const faceAreas, + array1d< real64 > & basisIntegrals ) const; + + void computeFaceIntegrals( arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodesCoords, + localIndex const (&faceToNodes)[11], + localIndex const (&faceToEdges)[11], + localIndex const & numFaceVertices, + real64 const & faceArea, + real64 const (&faceCenter)[3], + real64 const (&faceNormal)[3], + arrayView2d< localIndex const > const & edgeToNodes, + real64 const & invCellDiameter, + real64 const (&cellCenter)[3], + array1d< real64 > & basisIntegrals, + real64 ( &threeDMonomialIntegrals )[3] ) const; real64 const machinePrecision = std::numeric_limits< real64 >::epsilon(); @@ -167,6 +185,8 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase real64 m_stabilitzationScalingCoefficient = 1.0; + static const localIndex m_maxFaceNodes; // Maximum number of nodes on a contact face + void createPreconditioner( DomainPartition const & domain ); void computeFaceDisplacementJump( DomainPartition & domain ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index fbec79f454b..061637d9d28 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -452,10 +452,15 @@ assembleForceResidualDerivativeWrtPressure( MeshLevel const & mesh, FaceManager const & faceManager = mesh.getFaceManager(); NodeManager const & nodeManager = mesh.getNodeManager(); + EdgeManager const & edgeManager = mesh.getEdgeManager(); ElementRegionManager const & elemManager = mesh.getElemManager(); ArrayOfArraysView< localIndex const > const & faceToNodeMap = faceManager.nodeList().toViewConst(); + ArrayOfArraysView< localIndex const > const faceToEdgeMap = faceManager.edgeList().toViewConst(); + arrayView2d< localIndex const > const & edgeToNodeMap = edgeManager.nodeList().toViewConst(); + arrayView2d< real64 const > faceCenters = faceManager.faceCenter(); arrayView2d< real64 const > const & faceNormal = faceManager.faceNormal(); + arrayView1d< real64 const > faceAreas = faceManager.faceArea(); string const & dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); string const & presDofKey = dofManager.getKey( m_pressureKey ); @@ -486,10 +491,9 @@ assembleForceResidualDerivativeWrtPressure( MeshLevel const & mesh, Nbar[ 1 ] = faceNormal[elemsToFaces[kfe][0]][1] - faceNormal[elemsToFaces[kfe][1]][1]; Nbar[ 2 ] = faceNormal[elemsToFaces[kfe][0]][2] - faceNormal[elemsToFaces[kfe][1]][2]; LvArray::tensorOps::normalize< 3 >( Nbar ); - - globalIndex rowDOF[12]; - real64 nodeRHS[12]; - stackArray1d< real64, 12 > dRdP( 3*numNodesPerFace ); + globalIndex rowDOF[3 * m_maxFaceNodes]; // this needs to be changed when dealing with arbitrary element types + real64 nodeRHS[3 * m_maxFaceNodes]; + stackArray1d< real64, 3 * m_maxFaceNodes > dRdP( 3*m_maxFaceNodes ); globalIndex colDOF[1]; colDOF[0] = presDofNumber[kfe]; @@ -501,7 +505,15 @@ assembleForceResidualDerivativeWrtPressure( MeshLevel const & mesh, { // Compute local area contribution for each node array1d< real64 > nodalArea; - this->solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); + this->solidMechanicsSolver()->computeFaceNodalArea( elemsToFaces[kfe][kf], + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormal, + faceAreas, + nodalArea ); real64 const nodalForceMag = -( pressure[kfe] ) * nodalArea[a]; array1d< real64 > globalNodalForce( 3 ); @@ -548,10 +560,15 @@ assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, FaceManager const & faceManager = mesh.getFaceManager(); NodeManager const & nodeManager = mesh.getNodeManager(); + EdgeManager const & edgeManager = mesh.getEdgeManager(); ElementRegionManager const & elemManager = mesh.getElemManager(); - arrayView2d< real64 const > const & faceNormal = faceManager.faceNormal(); ArrayOfArraysView< localIndex const > const & faceToNodeMap = faceManager.nodeList().toViewConst(); + ArrayOfArraysView< localIndex const > const faceToEdgeMap = faceManager.edgeList().toViewConst(); + arrayView2d< localIndex const > const & edgeToNodeMap = edgeManager.nodeList().toViewConst(); + arrayView2d< real64 const > faceCenters = faceManager.faceCenter(); + arrayView2d< real64 const > const & faceNormal = faceManager.faceNormal(); + arrayView1d< real64 const > faceAreas = faceManager.faceArea(); CRSMatrixView< real64 const, localIndex const > const & dFluxResidual_dNormalJump = getDerivativeFluxResidual_dNormalJump().toViewConst(); @@ -586,7 +603,7 @@ assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, { localIndex const kf0 = elemsToFaces[kfe][0], kf1 = elemsToFaces[kfe][1]; localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( kf0 ); - globalIndex nodeDOF[24]; + globalIndex nodeDOF[2*3*m_maxFaceNodes]; globalIndex elemDOF[1]; elemDOF[0] = presDofNumber[kfe]; @@ -596,7 +613,7 @@ assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, Nbar[ 2 ] = faceNormal[kf0][2] - faceNormal[kf1][2]; LvArray::tensorOps::normalize< 3 >( Nbar ); - stackArray1d< real64, 2*3*4 > dRdU( 2*3*numNodesPerFace ); + stackArray1d< real64, 2*3*m_maxFaceNodes > dRdU( 2*3*m_maxFaceNodes ); bool const isFractureOpen = ( fractureState[kfe] == fields::contact::FractureState::Open ); @@ -607,7 +624,15 @@ assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, { // Compute local area contribution for each node array1d< real64 > nodalArea; - this->solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe][kf], nodalArea ); + this->solidMechanicsSolver()->computeFaceNodalArea( elemsToFaces[kfe][kf], + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormal, + faceAreas, + nodalArea ); // TODO: move to something like this plus a static method. // localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elemsToFaces[kfe][kf] ); @@ -656,9 +681,17 @@ assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, for( localIndex kf=0; kf<2; ++kf ) { - // Compute local area contribution for each node + //TODO: We should avoid allocating LvArrays inside kernel array1d< real64 > nodalArea; - this->solidMechanicsSolver()->computeFaceNodalArea( nodePosition, faceToNodeMap, elemsToFaces[kfe2][kf], nodalArea ); + this->solidMechanicsSolver()->computeFaceNodalArea( elemsToFaces[kfe2][kf], + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormal, + faceAreas, + nodalArea ); for( localIndex a=0; a Date: Tue, 2 Jul 2024 20:21:46 +0100 Subject: [PATCH 121/286] Remove array1d inside kernels (#3201) * changed array1d to stackArray1d in some kernels --- host-configs/apple/macOS_base.cmake | 2 +- src/coreComponents/mesh/FaceManager.hpp | 5 ++ .../contact/SolidMechanicsLagrangeContact.cpp | 50 ++++++++++--------- .../contact/SolidMechanicsLagrangeContact.hpp | 4 +- ...ePhasePoromechanicsConformingFractures.cpp | 29 ++++++----- 5 files changed, 48 insertions(+), 42 deletions(-) diff --git a/host-configs/apple/macOS_base.cmake b/host-configs/apple/macOS_base.cmake index 142fbd40d6d..319ab6ea179 100644 --- a/host-configs/apple/macOS_base.cmake +++ b/host-configs/apple/macOS_base.cmake @@ -27,7 +27,7 @@ set( LAPACK_LIBRARIES ${HOMEBREW_DIR}/opt/lapack/lib/liblapack.dylib CACHE PATH set(ENABLE_DOXYGEN OFF CACHE BOOL "" FORCE) set(ENABLE_MATHPRESSO OFF CACHE BOOL "" FORCE ) -set(GEOSX_BUILD_OBJ_LIBS ON CACHE BOOL "" FORCE) +#set(GEOSX_BUILD_OBJ_LIBS ON CACHE BOOL "" FORCE) diff --git a/src/coreComponents/mesh/FaceManager.hpp b/src/coreComponents/mesh/FaceManager.hpp index 2c7948b145f..1f8af884447 100644 --- a/src/coreComponents/mesh/FaceManager.hpp +++ b/src/coreComponents/mesh/FaceManager.hpp @@ -434,6 +434,11 @@ class FaceManager : public ObjectManagerBase ///}@ + /** + * @brief Get the maximum number of nodes per face. + * @return the maximum number of nodes per face + */ + constexpr static int maxFaceNodes() { return MAX_FACE_NODES; } private: /** diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index b1f61deccf7..5418db47259 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -479,7 +479,8 @@ void SolidMechanicsLagrangeContact::computeFaceDisplacementJump( DomainPartition // Contact constraints localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elemsToFaces[kfe][0] ); - array1d< real64 > nodalArea0, nodalArea1; + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea0; + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea1; computeFaceNodalArea( elemsToFaces[kfe][0], nodePosition, faceToNodeMap, @@ -670,23 +671,22 @@ void SolidMechanicsLagrangeContact:: for( localIndex kf=0; kf<2; ++kf ) { localIndex const faceIndex = elemsToFaces[kfe][kf]; + // Compute local area contribution for each node + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea; + computeFaceNodalArea( elemsToFaces[kfe][kf], + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormal, + faceAreas, + nodalArea ); for( localIndex a=0; a nodalArea; - computeFaceNodalArea( elemsToFaces[kfe][kf], - nodePosition, - faceToNodeMap, - faceToEdgeMap, - edgeToNodeMap, - faceCenters, - faceNormal, - faceAreas, - nodalArea ); - real64 const nodalForceMag = -( pressure[kfe] ) * nodalArea[a]; - array1d< real64 > globalNodalForce( 3 ); + real64 globalNodalForce[ 3 ]; LvArray::tensorOps::scaledCopy< 3 >( globalNodalForce, Nbar, nodalForceMag ); for( localIndex i=0; i<3; ++i ) @@ -959,7 +959,7 @@ void SolidMechanicsLagrangeContact::computeFaceIntegrals( arrayView2d< real64 co arrayView2d< localIndex const > const & edgeToNodes, real64 const & invCellDiameter, real64 const (&cellCenter)[3], - array1d< real64 > & basisIntegrals, + stackArray1d< real64, FaceManager::maxFaceNodes() > & basisIntegrals, real64 (& threeDMonomialIntegrals)[3] ) const { GEOS_MARK_FUNCTION; @@ -1168,7 +1168,7 @@ void SolidMechanicsLagrangeContact::computeFaceNodalArea( localIndex const kf0, arrayView2d< real64 const > const faceCenters, arrayView2d< real64 const > const faceNormals, arrayView1d< real64 const > const faceAreas, - array1d< real64 > & basisIntegrals ) const + stackArray1d< real64, FaceManager::maxFaceNodes() > & basisIntegrals ) const { GEOS_MARK_FUNCTION; localIndex const TriangularPermutation[3] = { 0, 1, 2 }; @@ -1332,7 +1332,7 @@ void SolidMechanicsLagrangeContact:: { constexpr int normalSign[2] = { 1, -1 }; // Testing the face integral on polygonal faces - array1d< real64 > nodalArea; + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea; localIndex const faceIndex = elemsToFaces[kfe][kf]; computeFaceNodalArea( faceIndex, nodePosition, @@ -1484,7 +1484,7 @@ void SolidMechanicsLagrangeContact:: for( localIndex kf = 0; kf < 2; ++kf ) { // Compute local area contribution for each node - array1d< real64 > nodalArea; + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea; computeFaceNodalArea( elemsToFaces[kfe][kf], nodePosition, faceToNodeMap, @@ -1518,7 +1518,7 @@ void SolidMechanicsLagrangeContact:: for( localIndex kf = 0; kf < 2; ++kf ) { // Compute local area contribution for each node - array1d< real64 > nodalArea; + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea; computeFaceNodalArea( elemsToFaces[kfe][kf], nodePosition, faceToNodeMap, @@ -1567,7 +1567,7 @@ void SolidMechanicsLagrangeContact:: for( localIndex kf = 0; kf < 2; ++kf ) { // Compute local area contribution for each node - array1d< real64 > nodalArea; + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea; computeFaceNodalArea( elemsToFaces[kfe][kf], nodePosition, faceToNodeMap, @@ -1743,7 +1743,8 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes if( numFluxElems == 2 ) { // Find shared edge (pair of nodes) - array1d< real64 > Nbar0( 3 ), Nbar1( 3 ); + real64 Nbar0[3]; + real64 Nbar1[3]; Nbar0[ 0 ] = faceRotationMatrix[ sei[iconn][0] ][0][0]; Nbar0[ 1 ] = faceRotationMatrix[ sei[iconn][0] ][1][0]; Nbar0[ 2 ] = faceRotationMatrix[ sei[iconn][0] ][2][0]; @@ -1811,7 +1812,8 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes node1index1 = i; } } - array1d< real64 > nodalArea0, nodalArea1; + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea0; + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea1; localIndex const faceIndex0 = elem2dToFaces[sei[iconn][0]][0]; localIndex const faceIndex1 = elem2dToFaces[sei[iconn][1]][id1]; @@ -1921,13 +1923,13 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes // otherwise, compute the average rotation matrix else { - array1d< real64 > avgNbar( 3 ); + real64 avgNbar[3]; avgNbar[ 0 ] = faceArea[elem2dToFaces[ sei[iconn][0] ][0]] * Nbar0[0] + faceArea[elem2dToFaces[ sei[iconn][1] ][0]] * Nbar1[0]; avgNbar[ 1 ] = faceArea[elem2dToFaces[ sei[iconn][0] ][0]] * Nbar0[1] + faceArea[elem2dToFaces[ sei[iconn][1] ][0]] * Nbar1[1]; avgNbar[ 2 ] = faceArea[elem2dToFaces[ sei[iconn][0] ][0]] * Nbar0[2] + faceArea[elem2dToFaces[ sei[iconn][1] ][0]] * Nbar1[2]; LvArray::tensorOps::normalize< 3 >( avgNbar ); - computationalGeometry::RotationMatrix_3D( avgNbar.toSliceConst(), avgRotationMatrix ); + computationalGeometry::RotationMatrix_3D( avgNbar, avgRotationMatrix ); } // Compute R^T * (invK) * R diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index 80201585a4d..626b626703f 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -153,7 +153,7 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase arrayView2d< real64 const > const faceCenters, arrayView2d< real64 const > const faceNormals, arrayView1d< real64 const > const faceAreas, - array1d< real64 > & basisIntegrals ) const; + stackArray1d< real64, FaceManager::maxFaceNodes() > & nodalArea ) const; void computeFaceIntegrals( arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodesCoords, localIndex const (&faceToNodes)[11], @@ -165,7 +165,7 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase arrayView2d< localIndex const > const & edgeToNodes, real64 const & invCellDiameter, real64 const (&cellCenter)[3], - array1d< real64 > & basisIntegrals, + stackArray1d< real64, FaceManager::maxFaceNodes() > & basisIntegrals, real64 ( &threeDMonomialIntegrals )[3] ) const; real64 const machinePrecision = std::numeric_limits< real64 >::epsilon(); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 061637d9d28..661318fdc4d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -501,22 +501,21 @@ assembleForceResidualDerivativeWrtPressure( MeshLevel const & mesh, { localIndex const faceIndex = elemsToFaces[kfe][kf]; + // Compute local area contribution for each node + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea; + this->solidMechanicsSolver()->computeFaceNodalArea( elemsToFaces[kfe][kf], + nodePosition, + faceToNodeMap, + faceToEdgeMap, + edgeToNodeMap, + faceCenters, + faceNormal, + faceAreas, + nodalArea ); for( localIndex a=0; a nodalArea; - this->solidMechanicsSolver()->computeFaceNodalArea( elemsToFaces[kfe][kf], - nodePosition, - faceToNodeMap, - faceToEdgeMap, - edgeToNodeMap, - faceCenters, - faceNormal, - faceAreas, - nodalArea ); - real64 const nodalForceMag = -( pressure[kfe] ) * nodalArea[a]; - array1d< real64 > globalNodalForce( 3 ); + real64 globalNodalForce[ 3 ]; LvArray::tensorOps::scaledCopy< 3 >( globalNodalForce, Nbar, nodalForceMag ); for( localIndex i=0; i<3; ++i ) @@ -623,7 +622,7 @@ assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, for( localIndex kf=0; kf<2; ++kf ) { // Compute local area contribution for each node - array1d< real64 > nodalArea; + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea; this->solidMechanicsSolver()->computeFaceNodalArea( elemsToFaces[kfe][kf], nodePosition, faceToNodeMap, @@ -682,7 +681,7 @@ assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, for( localIndex kf=0; kf<2; ++kf ) { //TODO: We should avoid allocating LvArrays inside kernel - array1d< real64 > nodalArea; + stackArray1d< real64, FaceManager::maxFaceNodes() > nodalArea; this->solidMechanicsSolver()->computeFaceNodalArea( elemsToFaces[kfe2][kf], nodePosition, faceToNodeMap, From c74702a7edec099633af8737d1621e47792dae6b Mon Sep 17 00:00:00 2001 From: Arnaud DUDES <155963334+arng40@users.noreply.github.com> Date: Tue, 2 Jul 2024 22:56:23 +0200 Subject: [PATCH 122/286] Umpire logs refactor - table output + adding percentages (#3052) --- src/coreComponents/common/CMakeLists.txt | 4 + src/coreComponents/common/MemoryInfos.cpp | 68 ++++++++++++++ src/coreComponents/common/MemoryInfos.hpp | 72 +++++++++++++++ .../common/initializeEnvironment.cpp | 91 ++++++++++++++----- 4 files changed, 214 insertions(+), 21 deletions(-) create mode 100644 src/coreComponents/common/MemoryInfos.cpp create mode 100644 src/coreComponents/common/MemoryInfos.hpp diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index 5600a8fae85..1d829c19f2d 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -10,6 +10,7 @@ set( common_headers Format.hpp GEOS_RAJA_Interface.hpp GeosxMacros.hpp + MemoryInfos.hpp Logger.hpp MpiWrapper.hpp Path.hpp @@ -40,6 +41,7 @@ endif( ) set( common_sources BufferAllocator.cpp DataTypes.cpp + MemoryInfos.cpp Logger.cpp MpiWrapper.cpp Path.cpp @@ -93,6 +95,8 @@ if( ENABLE_CALIPER ) endif() endif() +set( dependencyList ${dependencyList} fileIO codingUtilities ) + blt_add_library( NAME common SOURCES ${common_sources} HEADERS ${common_headers} diff --git a/src/coreComponents/common/MemoryInfos.cpp b/src/coreComponents/common/MemoryInfos.cpp new file mode 100644 index 00000000000..98b0093c82f --- /dev/null +++ b/src/coreComponents/common/MemoryInfos.cpp @@ -0,0 +1,68 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-LiCense-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "MemoryInfos.hpp" + +namespace geos +{ +MemoryInfos::MemoryInfos( umpire::MemoryResourceTraits::resource_type resourceType ): + m_totalMemory( 0 ), + m_availableMemory( 0 ), + m_physicalMemoryHandled( 1 ) +{ + switch( resourceType ) + { + case umpire::MemoryResourceTraits::resource_type::host: + case umpire::MemoryResourceTraits::resource_type::pinned: + #if defined( _SC_PHYS_PAGES ) && defined( _SC_PAGESIZE ) + m_totalMemory = sysconf( _SC_PHYS_PAGES ) * sysconf( _SC_PAGESIZE ); + m_availableMemory = sysconf( _SC_AVPHYS_PAGES ) * sysconf( _SC_PAGESIZE ); + #else + GEOS_WARNING( "Unknown device physical memory size getter for this compiler." ); + m_physicalMemoryHandled = 0; + #endif + break; + case umpire::MemoryResourceTraits::resource_type::device: + case umpire::MemoryResourceTraits::resource_type::device_const: + case umpire::MemoryResourceTraits::resource_type::um: + #if defined( GEOS_USE_CUDA ) + cudaMemGetInfo( &m_availableMemory, &m_totalMemory ); + #else + GEOS_WARNING( "Unknown device physical memory size getter for this compiler." ); + m_physicalMemoryHandled = 0; + #endif + break; + default: + GEOS_WARNING( "Physical memory lookup not implemented" ); + m_physicalMemoryHandled = 0; + break; + } +} + +size_t MemoryInfos::getTotalMemory() const +{ + return m_totalMemory; +} + +size_t MemoryInfos::getAvailableMemory() const +{ + return m_availableMemory; +} + +bool MemoryInfos::isPhysicalMemoryHandled() const +{ + return m_physicalMemoryHandled; +} + +} diff --git a/src/coreComponents/common/MemoryInfos.hpp b/src/coreComponents/common/MemoryInfos.hpp new file mode 100644 index 00000000000..b2a22431d09 --- /dev/null +++ b/src/coreComponents/common/MemoryInfos.hpp @@ -0,0 +1,72 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-LiCense-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#ifndef GEOS_COMMON_MemoryInfos_HPP_ +#define GEOS_COMMON_MemoryInfos_HPP_ + +#include "umpire/util/MemoryResourceTraits.hpp" +#include "common/Logger.hpp" +#include +#include +#if defined( GEOS_USE_CUDA ) +#include +#endif + +namespace geos +{ + +/** + * @class MemoryInfos + * @brief Class to fetch and store memory information for different resource types. + */ +class MemoryInfos +{ +public: + + /** + * @brief Constructor for MemoryInfos. + * @param resourceType The type of memory resource. + */ + MemoryInfos( umpire::MemoryResourceTraits::resource_type resourceType ); + + /** + * @brief Get the total memory available for the resource type. + * @return Total memory in bytes. + */ + size_t getTotalMemory() const; + + /** + * @brief Get the available memory for the resource type. + * @return Available memory in bytes. + */ + size_t getAvailableMemory() const; + + /** + * @brief Check if physical memory is handled. + * @return True if physical memory is handled, false otherwise. + */ + bool isPhysicalMemoryHandled() const; +private: + + ///total memory available. + size_t m_totalMemory; + ///Available memory. + size_t m_availableMemory; + ///Flag indicating if physical memory is handled. + bool m_physicalMemoryHandled; +}; + +} + +#endif diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 356b4c112f0..a86cbf15af9 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -17,9 +17,18 @@ #include "TimingMacros.hpp" #include "Path.hpp" #include "LvArray/src/system.hpp" - +#include "fileIO/Table/TableLayout.hpp" +#include "fileIO/Table/TableData.hpp" +#include "fileIO/Table/TableFormatter.hpp" +#include "common/LifoStorageCommon.hpp" +#include "common/MemoryInfos.hpp" +#include // TPL includes #include +#include +#include +#include "umpire/util/MemoryResourceTraits.hpp" +#include "umpire/util/Platform.hpp" #if defined( GEOSX_USE_CALIPER ) #include @@ -46,13 +55,11 @@ #if defined( GEOS_USE_HIP ) #include #endif - #include namespace geos { - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setupLogger() { @@ -248,7 +255,9 @@ void finalizeCaliper() static void addUmpireHighWaterMarks() { umpire::ResourceManager & rm = umpire::ResourceManager::getInstance(); - + integer size; + MPI_Comm_size( MPI_COMM_WORLD, &size ); + size_t nbRank = (std::size_t)size; // Get a list of all the allocators and sort it so that it's in the same order on each rank. std::vector< string > allocatorNames = rm.getAllocatorNames(); std::sort( allocatorNames.begin(), allocatorNames.end() ); @@ -264,9 +273,9 @@ static void addUmpireHighWaterMarks() } // Loop over the allocators. - constexpr int MAX_NAME_LENGTH = 100; - char allocatorNameBuffer[ MAX_NAME_LENGTH + 1 ]; - char allocatorNameMinCharsBuffer[ MAX_NAME_LENGTH + 1 ]; + unsigned MAX_NAME_LENGTH = 100; + + TableData tableData; for( string const & allocatorName : allocatorNames ) { // Skip umpire internal allocators. @@ -274,33 +283,74 @@ static void addUmpireHighWaterMarks() continue; GEOS_ERROR_IF_GT( allocatorName.size(), MAX_NAME_LENGTH ); + string allocatorNameFixedSize = allocatorName; + allocatorNameFixedSize.resize( MAX_NAME_LENGTH, '\0' ); + string allocatorNameMinChars = string( MAX_NAME_LENGTH, '\0' ); - memset( allocatorNameBuffer, '\0', sizeof( allocatorNameBuffer ) ); - memcpy( allocatorNameBuffer, allocatorName.data(), allocatorName.size() ); + // Make sure that each rank is looking at the same allocator. + MpiWrapper::allReduce( allocatorNameFixedSize.c_str(), &allocatorNameMinChars.front(), MAX_NAME_LENGTH, MPI_MIN, MPI_COMM_GEOSX ); + if( allocatorNameFixedSize != allocatorNameMinChars ) + { + GEOS_WARNING( "Not all ranks have an allocator named " << allocatorNameFixedSize << ", cannot compute high water mark." ); + continue; + } - memset( allocatorNameMinCharsBuffer, '\0', sizeof( allocatorNameMinCharsBuffer ) ); + umpire::Allocator allocator = rm.getAllocator( allocatorName ); + umpire::strategy::AllocationStrategy const * allocationStrategy = allocator.getAllocationStrategy(); + umpire::MemoryResourceTraits const traits = allocationStrategy->getTraits(); + umpire::MemoryResourceTraits::resource_type resourceType = traits.resource; + MemoryInfos const memInfos( resourceType ); - // Make sure that each rank is looking at the same allocator. - MpiWrapper::allReduce( allocatorNameBuffer, allocatorNameMinCharsBuffer, MAX_NAME_LENGTH, MPI_MIN, MPI_COMM_GEOSX ); - if( strcmp( allocatorNameBuffer, allocatorNameMinCharsBuffer ) != 0 ) + if( !memInfos.isPhysicalMemoryHandled() ) { - GEOS_WARNING( "Not all ranks have an allocator named " << allocatorNameBuffer << ", cannot compute high water mark." ); continue; } // Get the total number of bytes allocated with this allocator across ranks. // This is a little redundant since - std::size_t const mark = rm.getAllocator( allocatorName ).getHighWatermark(); - std::size_t const totalMark = MpiWrapper::sum( mark ); + std::size_t const mark = allocator.getHighWatermark(); + std::size_t const minMark = MpiWrapper::min( mark ); std::size_t const maxMark = MpiWrapper::max( mark ); - GEOS_LOG_RANK_0( "Umpire " << std::setw( 15 ) << allocatorName << " sum across ranks: " << - std::setw( 9 ) << LvArray::system::calculateSize( totalMark ) ); - GEOS_LOG_RANK_0( "Umpire " << std::setw( 15 ) << allocatorName << " rank max: " << - std::setw( 9 ) << LvArray::system::calculateSize( maxMark ) ); + std::size_t const sumMark = MpiWrapper::sum( mark ); + + string percentage; + if( memInfos.getTotalMemory() == 0 ) + { + percentage = 0.0; + GEOS_WARNING( "umpire memory percentage could not be resolved" ); + } + else + { + percentage = GEOS_FMT( "({:.1f}%)", ( 100.0f * (float)mark ) / (float)memInfos.getTotalMemory() ); + } + + string const minMarkValue = GEOS_FMT( "{} {:>8}", + LvArray::system::calculateSize( minMark ), percentage ); + string const maxMarkValue = GEOS_FMT( "{} {:>8}", + LvArray::system::calculateSize( maxMark ), percentage ); + string const avgMarkValue = GEOS_FMT( "{} {:>8}", + LvArray::system::calculateSize( sumMark / nbRank ), percentage ); + string const sumMarkValue = GEOS_FMT( "{} {:>8}", + LvArray::system::calculateSize( sumMark ), percentage ); + + tableData.addRow( allocatorName, + minMarkValue, + maxMarkValue, + avgMarkValue, + sumMarkValue ); pushStatsIntoAdiak( allocatorName + " sum across ranks", mark ); pushStatsIntoAdiak( allocatorName + " rank max", mark ); } + + TableLayout const memoryStatLayout ( {"Umpire Memory Pool\n(reserved / % over total)", + "Min over ranks", + "Max over ranks", + "Avg over ranks", + "Sum over ranks" } ); + TableTextFormatter const memoryStatLog( memoryStatLayout ); + + GEOS_LOG_RANK_0( memoryStatLog.toString( tableData )); } @@ -324,5 +374,4 @@ void cleanupEnvironment() finalizeMPI(); } - } // namespace geos From 8ef428e9eed65f4455785b194aca7aed707407d7 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" <50467563+victorapm@users.noreply.github.com> Date: Tue, 2 Jul 2024 20:32:21 -0400 Subject: [PATCH 123/286] Host configs for new LLNL machines + cuda12 (#3067) * Add cuda-12 host-config for lassen * Add ESSL_DIR variable * Add dane and ruby host configs * add new cuda12 job. --------- Co-authored-by: Matteo Cusini Co-authored-by: Randolph Settgast --- .devcontainer/devcontainer.json | 2 +- .github/workflows/ci_tests.yml | 11 ++++ host-configs/LLNL/dane-gcc-12.cmake | 9 +++ host-configs/LLNL/lassen-base.cmake | 11 ++-- .../LLNL/lassen-clang-13-cuda-12.cmake | 25 ++++++++ ...{quartz-base.cmake => llnl-cpu-base.cmake} | 37 ++++++------ host-configs/LLNL/quartz-clang-14.cmake | 10 ---- host-configs/LLNL/quartz-gcc-12.cmake | 16 ------ host-configs/LLNL/quartz-icc-19.cmake | 24 -------- host-configs/LLNL/ruby-clang-14.cmake | 6 ++ host-configs/LLNL/ruby-gcc-12.cmake | 9 +++ host-configs/environment.cmake | 8 +++ .../thirdparty/SetupGeosxThirdParty.cmake | 57 +++++++++++-------- 13 files changed, 128 insertions(+), 97 deletions(-) create mode 100644 host-configs/LLNL/dane-gcc-12.cmake create mode 100644 host-configs/LLNL/lassen-clang-13-cuda-12.cmake rename host-configs/LLNL/{quartz-base.cmake => llnl-cpu-base.cmake} (79%) delete mode 100644 host-configs/LLNL/quartz-clang-14.cmake delete mode 100644 host-configs/LLNL/quartz-gcc-12.cmake delete mode 100644 host-configs/LLNL/quartz-icc-19.cmake create mode 100644 host-configs/LLNL/ruby-clang-14.cmake create mode 100644 host-configs/LLNL/ruby-gcc-12.cmake diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 3ca6152d8da..7640cb6bd49 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "262-349" + "GEOS_TPL_TAG": "270-418" } }, "runArgs": [ diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 27517eb59e8..7396cf889b9 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -284,6 +284,17 @@ jobs: DOCKER_RUN_ARGS: "--cpus=8 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" + + # compiler error in ElasticFirstOrderWaveEquationSEMKernel::StressComputation::launch in call to FE_TYPE::computeFirstOrderStiffnessTermX + # - name: Rockylinux (8, clang 17.0.6, cuda 12.5) + # BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" + # CMAKE_BUILD_TYPE: Release + # DOCKER_REPOSITORY: geosx/rockylinux8-clang17-cuda12.5 + # RUNS_ON: streak2 + # NPROC: 2 + # DOCKER_RUN_ARGS: "--cpus=1 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" + # DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" + # DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" # Below this line, jobs that deploy to Google Cloud. - name: Pecan GPU (centos 7.7, gcc 8.2.0, open-mpi 4.0.1, mkl 2019.5, cuda 11.5.119) diff --git a/host-configs/LLNL/dane-gcc-12.cmake b/host-configs/LLNL/dane-gcc-12.cmake new file mode 100644 index 00000000000..c7cd796b8ab --- /dev/null +++ b/host-configs/LLNL/dane-gcc-12.cmake @@ -0,0 +1,9 @@ +include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/LLNL/dane-gcc-12.cmake) + +# MPI +set(MPI_HOME /usr/tce/packages/mvapich2/mvapich2-2.3.7-gcc-12.1.1-magic CACHE PATH "") + +# ATS +set(ATS_ARGUMENTS "--machine slurm112" CACHE STRING "") + +include(${CMAKE_CURRENT_LIST_DIR}/llnl-cpu-base.cmake) diff --git a/host-configs/LLNL/lassen-base.cmake b/host-configs/LLNL/lassen-base.cmake index 0aa8696dac3..79d08057de3 100644 --- a/host-configs/LLNL/lassen-base.cmake +++ b/host-configs/LLNL/lassen-base.cmake @@ -31,15 +31,16 @@ set(ENABLE_CUDA_NVTOOLSEXT OFF CACHE BOOL "") # ESSL set(ENABLE_ESSL ON CACHE BOOL "" FORCE ) -set(ESSL_INCLUDE_DIRS /usr/tcetmp/packages/essl/essl-6.3.0.2/include CACHE STRING "" FORCE ) -set(ESSL_LIBRARIES /usr/tcetmp/packages/essl/essl-6.3.0.2/lib64/libesslsmpcuda.so +set(ESSL_DIR /usr/tcetmp/packages/essl/essl-6.3.0.2 CACHE STRING "" FORCE ) +set(ESSL_INCLUDE_DIRS ${ESSL_DIR}/include CACHE STRING "" FORCE ) +set(ESSL_LIBRARIES ${ESSL_DIR}/lib64/libesslsmpcuda.so ${CUDA_TOOLKIT_ROOT_DIR}/lib64/libcublas.so ${CUDA_TOOLKIT_ROOT_DIR}/lib64/libcublasLt.so ${CUDA_TOOLKIT_ROOT_DIR}/lib64/libcudart.so - /usr/tcetmp/packages/essl/essl-6.3.0.2/lib64/liblapackforessl.so - /usr/tcetmp/packages/essl/essl-6.3.0.2/lib64/liblapackforessl_.so + ${ESSL_DIR}/lib64/liblapackforessl.so + ${ESSL_DIR}/lib64/liblapackforessl_.so CACHE PATH "" FORCE ) - + # TPL set(ENABLE_PAPI OFF CACHE BOOL "") set(SILO_BUILD_TYPE powerpc64-unknown-linux-gnu CACHE STRING "") diff --git a/host-configs/LLNL/lassen-clang-13-cuda-12.cmake b/host-configs/LLNL/lassen-clang-13-cuda-12.cmake new file mode 100644 index 00000000000..14ee23d0c81 --- /dev/null +++ b/host-configs/LLNL/lassen-clang-13-cuda-12.cmake @@ -0,0 +1,25 @@ +include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/LLNL/lassen-clang-13-cuda-12.cmake) + +# Fortran +set(CMAKE_Fortran_COMPILER /usr/tce/packages/gcc/gcc-8.3.1/bin/gfortran CACHE PATH "") +set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -mtune=power9" CACHE STRING "") +set(FORTRAN_MANGLE_NO_UNDERSCORE ON CACHE BOOL "") +set(OpenMP_Fortran_FLAGS "-fopenmp" CACHE STRING "") +set(OpenMP_Fortran_LIB_NAMES "" CACHE STRING "") + +# MPI +set(MPI_HOME /usr/tce/packages/spectrum-mpi/spectrum-mpi-rolling-release-clang-13.0.1-gcc-8.3.1/ CACHE PATH "") +set(MPI_Fortran_COMPILER /usr/tce/packages/spectrum-mpi/spectrum-mpi-rolling-release-gcc-8.3.1/bin/mpifort CACHE PATH "") + +include(${CMAKE_CURRENT_LIST_DIR}/lassen-base.cmake) + +# Overwrite options set on lassen-base.cmake +set(ENABLE_OPENMP OFF CACHE BOOL "" FORCE) +set(ENABLE_CUDA_NVTOOLSEXT ON CACHE BOOL "") + +# Overwrite ESSL defaults from lassen-base.cmake +# Reason: libesslsmpcuda.so depends on cuda-11 +set(ESSL_LIBRARIES ${ESSL_DIR}/lib64/libessl.so + ${ESSL_DIR}/lib64/liblapackforessl.so + ${ESSL_DIR}/lib64/liblapackforessl_.so + CACHE PATH "" FORCE ) diff --git a/host-configs/LLNL/quartz-base.cmake b/host-configs/LLNL/llnl-cpu-base.cmake similarity index 79% rename from host-configs/LLNL/quartz-base.cmake rename to host-configs/LLNL/llnl-cpu-base.cmake index 25973d661e8..58847109bac 100644 --- a/host-configs/LLNL/quartz-base.cmake +++ b/host-configs/LLNL/llnl-cpu-base.cmake @@ -1,6 +1,6 @@ ############################################################################### # -# Base configuration for LC Quartz builds +# Base configuration for LC cpu builds # Calling configuration file must define the following CMAKE variables: # # MPI_HOME @@ -10,6 +10,24 @@ # Fortran set(ENABLE_FORTRAN OFF CACHE BOOL "") +# Fortran +set(CMAKE_Fortran_COMPILER /usr/tce/packages/gcc/gcc-12.1.1-magic/bin/gfortran CACHE PATH "") +set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -march=native -mtune=native" CACHE STRING "") + +# PYGEOSX +set(ENABLE_PYGEOSX ON CACHE BOOL "") +set(Python3_ROOT_DIR /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/python CACHE PATH "") +set(Python3_EXECUTABLE ${Python3_ROOT_DIR}/bin/python3 CACHE PATH "") + +# YAPF python formatting +set(YAPF_EXECUTABLE /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/python/bin/yapf CACHE PATH "" FORCE) + +# Sphinx +set(SPHINX_EXECUTABLE /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/python/bin/sphinx-build CACHE PATH "" FORCE) + +# ATS +set(ATS_ARGUMENTS "--machine slurm56" CACHE STRING "") + # MPI set(ENABLE_MPI ON CACHE BOOL "") set(MPI_C_COMPILER ${MPI_HOME}/bin/mpicc CACHE PATH "") @@ -20,7 +38,7 @@ set(MPIEXEC_NUMPROC_FLAG "-n" CACHE STRING "") # PAPI (For TPL caliper builds) set(ENABLE_PAPI ON CACHE BOOL "") -set(PAPI_PREFIX /usr/tce/packages/papi/papi-5.4.3 CACHE PATH "") +set(PAPI_PREFIX /usr/tce/packages/papi/papi-6.0.0.1/ CACHE PATH "") # OpenMP set(ENABLE_OPENMP ON CACHE BOOL "") @@ -31,16 +49,9 @@ set(ENABLE_PETSC OFF CACHE BOOL "Enables PETSc." FORCE) # PYGEOSX set(ENABLE_PYGEOSX ON CACHE BOOL "") -set(Python3_ROOT_DIR /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/python CACHE PATH "") +set(Python3_ROOT_DIR /usr/apps/python-3.11.5 CACHE PATH "") set(Python3_EXECUTABLE ${Python3_ROOT_DIR}/bin/python3 CACHE PATH "") -# YAPF python formatting -set(YAPF_EXECUTABLE /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/python/bin/yapf CACHE PATH "" FORCE) - -# Sphinx -set(SPHINX_EXECUTABLE /usr/gapps/GEOSX/thirdPartyLibs/python/quartz-gcc-python/python/bin/sphinx-build CACHE PATH "" FORCE) - - # caliper set(ENABLE_CALIPER ON CACHE BOOL "" FORCE) set(ENABLE_CALIPER_HYPRE ON CACHE BOOL "" FORCE) @@ -55,13 +66,7 @@ set(MKL_LIBRARIES ${MKL_ROOT}/lib/intel64/libmkl_intel_lp64.so CACHE STRING "") # ATS -set(ATS_ARGUMENTS "--machine slurm36" CACHE STRING "") set(USER $ENV{USER} CACHE STRING "") set(ATS_WORKING_DIR "/p/lustre2/${USER}/integratedTestsGEOS/${CONFIG_NAME}" CACHE PATH "") set(ATS_BASELINE_DIR "/p/lustre2/${USER}/integratedTestsGEOS/baselines" CACHE PATH "") - -# Temporary argument for python module change testing -# set(GEOS_PYTHON_PACKAGES_BRANCH "feature/sherman/outOfPlaceATS" CACHE STRING "" FORCE) - - include(${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake) diff --git a/host-configs/LLNL/quartz-clang-14.cmake b/host-configs/LLNL/quartz-clang-14.cmake deleted file mode 100644 index 797e6acb2f3..00000000000 --- a/host-configs/LLNL/quartz-clang-14.cmake +++ /dev/null @@ -1,10 +0,0 @@ -include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/LLNL/quartz-clang-14.cmake) - -# Fortran -set(CMAKE_Fortran_COMPILER /usr/tce/packages/gcc/gcc-12.1.1-magic/bin/gfortran CACHE PATH "") -set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -march=native -mtune=native" CACHE STRING "") - -# MPI -set(MPI_HOME /usr/tce/packages/mvapich2/mvapich2-2.3.6-clang-14.0.6-magic CACHE PATH "") - -include(${CMAKE_CURRENT_LIST_DIR}/quartz-base.cmake) diff --git a/host-configs/LLNL/quartz-gcc-12.cmake b/host-configs/LLNL/quartz-gcc-12.cmake deleted file mode 100644 index a4e92537ad6..00000000000 --- a/host-configs/LLNL/quartz-gcc-12.cmake +++ /dev/null @@ -1,16 +0,0 @@ -include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/LLNL/quartz-gcc-12.cmake) - -# C++ -# The "-march=native -mtune=native" which LvArray adds breaks the PVT package. -set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE) - -# Fortran -set(CMAKE_Fortran_COMPILER /usr/tce/packages/gcc/gcc-12.1.1-magic/bin/gfortran CACHE PATH "") -set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -march=native -mtune=native" CACHE STRING "") - -# MPI -set(MPI_HOME /usr/tce/packages/mvapich2/mvapich2-2.3.6-gcc-12.1.1-magic CACHE PATH "") - -set(ENABLE_TRILINOS OFF CACHE BOOL "" FORCE) - -include(${CMAKE_CURRENT_LIST_DIR}/quartz-base.cmake) diff --git a/host-configs/LLNL/quartz-icc-19.cmake b/host-configs/LLNL/quartz-icc-19.cmake deleted file mode 100644 index a18d3f3da03..00000000000 --- a/host-configs/LLNL/quartz-icc-19.cmake +++ /dev/null @@ -1,24 +0,0 @@ -include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/LLNL/quartz-icc-19.cmake) - -# Fortran -set(CMAKE_Fortran_COMPILER ${COMPILER_DIR}/bin/intel64/ifort CACHE PATH "") -set(CMAKE_Fortran_FLAGS_RELEASE "-DNDEBUG -march=native -mtune=native -qoverride-limits" CACHE STRING "") -set(CMAKE_Fortran_FLAGS_RELWITHDEBINFO "-g ${CMAKE_Fortran_FLAGS_RELEASE}" CACHE STRING "") - -# MPI -set(MPI_HOME /usr/tce/packages/mvapich2/mvapich2-2.3-intel-19.0.4 CACHE PATH "") - -# GEOSX specific options -set(ENABLE_XML_UPDATES OFF CACHE BOOL "") - -# MKL -set(ENABLE_MKL ON CACHE BOOL "") -set(MKL_ROOT /usr/tce/packages/mkl/mkl-2019.0) -set(MKL_INCLUDE_DIRS ${MKL_ROOT}/include CACHE STRING "") -set(MKL_LIBRARIES ${MKL_ROOT}/lib/libmkl_intel_lp64.so - ${MKL_ROOT}/lib/libmkl_intel_thread.so - ${MKL_ROOT}/lib/libmkl_core.so - ${COMPILER_DIR}/compiler/lib/intel64/libiomp5.so - CACHE STRING "") - -include(${CMAKE_CURRENT_LIST_DIR}/quartz-base.cmake) diff --git a/host-configs/LLNL/ruby-clang-14.cmake b/host-configs/LLNL/ruby-clang-14.cmake new file mode 100644 index 00000000000..39b8409ba64 --- /dev/null +++ b/host-configs/LLNL/ruby-clang-14.cmake @@ -0,0 +1,6 @@ +include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/LLNL/ruby-clang-14.cmake) + +# MPI +set(MPI_HOME /usr/tce/packages/mvapich2/mvapich2-2.3.7-clang-14.0.6-magic CACHE PATH "") + +include(${CMAKE_CURRENT_LIST_DIR}/llnl-cpu-base.cmake) diff --git a/host-configs/LLNL/ruby-gcc-12.cmake b/host-configs/LLNL/ruby-gcc-12.cmake new file mode 100644 index 00000000000..2c369280809 --- /dev/null +++ b/host-configs/LLNL/ruby-gcc-12.cmake @@ -0,0 +1,9 @@ +include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/LLNL/ruby-gcc-12.cmake) + +# MPI +set(MPI_HOME /usr/tce/packages/mvapich2/mvapich2-2.3.7-gcc-12.1.1-magic CACHE PATH "") + +# ATS +set(ATS_ARGUMENTS "--machine slurm56" CACHE STRING "") + +include(${CMAKE_CURRENT_LIST_DIR}/llnl-cpu-base.cmake) diff --git a/host-configs/environment.cmake b/host-configs/environment.cmake index c4db8c745a2..33a3b52fa6b 100644 --- a/host-configs/environment.cmake +++ b/host-configs/environment.cmake @@ -70,5 +70,13 @@ if(ENABLE_CUDA) endif() +if(DEFINED ENV{BLAS_LIBRARIES}) + set(BLAS_LIBRARIES "$ENV{BLAS_LIBRARIES}" CACHE PATH "" FORCE) +endif() + +if(DEFINED ENV{LAPACK_LIBRARIES}) + set(LAPACK_LIBRARIES "$ENV{LAPACK_LIBRARIES}" CACHE PATH "" FORCE) +endif() + set(GEOSX_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) include(${CMAKE_CURRENT_LIST_DIR}/tpls.cmake) diff --git a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake index 9fa1eab84c4..7fa1e0c194a 100644 --- a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake +++ b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake @@ -285,6 +285,14 @@ else() mandatory_tpl_doesnt_exist("pugixml" PUGIXML_DIR) endif() +################################ +# CUDA +################################ +if ( ENABLE_CUDA) + find_package(CUDAToolkit REQUIRED) + message( " ----> $CUDAToolkit_VERSION = ${CUDAToolkit_VERSION}") +endif() + ################################ # CAMP ( required before raja on crusher / using spack installed tpls ) ################################ @@ -631,41 +639,45 @@ endif() if(DEFINED HYPRE_DIR AND ENABLE_HYPRE) message(STATUS "HYPRE_DIR = ${HYPRE_DIR}") - set( HYPRE_DEPENDS blas lapack umpire) + set( HYPRE_DEPENDS blas lapack umpire ) if( ENABLE_SUPERLU_DIST ) - set( HYPRE_DEPENDS ${HYPRE_DEPENDS} superlu_dist ) + list( APPEND HYPRE_DEPENDS superlu_dist ) endif() if( ${ENABLE_HYPRE_DEVICE} STREQUAL "CUDA" ) - set( EXTRA_LIBS ${CUDA_cusparse_LIBRARY} ${CUDA_cublas_LIBRARY} ${CUDA_curand_LIBRARY} ${CUDA_cusolver_LIBRARY} ) + list( APPEND HYPRE_DEPENDS CUDA::cusparse CUDA::cublas CUDA::curand CUDA::cusolver ) + + # Add libnvJitLink when using CUDA >= 12.2.2. Note: requires cmake >= 3.26 + if( CUDAToolkit_VERSION VERSION_GREATER_EQUAL "12.2.2" ) + list( APPEND HYPRE_DEPENDS CUDA::nvJitLink ) + endif() elseif( ${ENABLE_HYPRE_DEVICE} STREQUAL "HIP" ) find_package( rocblas REQUIRED ) find_package( rocsolver REQUIRED ) find_package( rocsparse REQUIRED ) find_package( rocrand REQUIRED ) - set( HYPRE_DEPENDS ${HYPRE_DEPENDS} roc::rocblas roc::rocsparse roc::rocsolver roc::rocrand ) + append( APPEND HYPRE_DEPENDS roc::rocblas roc::rocsparse roc::rocsolver roc::rocrand ) endif( ) - find_and_import(NAME hypre - INCLUDE_DIRECTORIES ${HYPRE_DIR}/include - LIBRARY_DIRECTORIES ${HYPRE_DIR}/lib - HEADER HYPRE.h - LIBRARIES HYPRE - EXTRA_LIBRARIES ${EXTRA_LIBS} - DEPENDS ${HYPRE_DEPENDS}) + find_and_import( NAME hypre + INCLUDE_DIRECTORIES ${HYPRE_DIR}/include + LIBRARY_DIRECTORIES ${HYPRE_DIR}/lib + HEADER HYPRE.h + LIBRARIES HYPRE + DEPENDS ${HYPRE_DEPENDS} ) extract_version_from_header( NAME hypre HEADER "${HYPRE_DIR}/include/HYPRE_config.h" VERSION_STRING "HYPRE_RELEASE_VERSION" ) # Extract some additional information about development version of hypre - file(READ ${HYPRE_DIR}/include/HYPRE_config.h header_file) - if("${header_file}" MATCHES "HYPRE_DEVELOP_STRING *\"([^\"]*)\"") - set(hypre_dev_string "${CMAKE_MATCH_1}") - if("${header_file}" MATCHES "HYPRE_BRANCH_NAME *\"([^\"]*)\"") - set(hypre_dev_branch "${CMAKE_MATCH_1}") + file( READ ${HYPRE_DIR}/include/HYPRE_config.h header_file ) + if( "${header_file}" MATCHES "HYPRE_DEVELOP_STRING *\"([^\"]*)\"" ) + set( hypre_dev_string "${CMAKE_MATCH_1}" ) + if( "${header_file}" MATCHES "HYPRE_BRANCH_NAME *\"([^\"]*)\"" ) + set( hypre_dev_branch "${CMAKE_MATCH_1}" ) endif() - set(hypre_VERSION "${hypre_dev_string} (${hypre_dev_branch})" CACHE STRING "" FORCE) - message(" ----> hypre_VERSION = ${hypre_VERSION}") + set( hypre_VERSION "${hypre_dev_string} (${hypre_dev_branch})" CACHE STRING "" FORCE ) + message( " ----> hypre_VERSION = ${hypre_VERSION}" ) endif() # Prepend Hypre to link flags, fix for Umpire appearing before Hypre on the link line @@ -682,8 +694,8 @@ if(DEFINED HYPRE_DIR AND ENABLE_HYPRE) # set(ENABLE_HYPRE ON CACHE BOOL "") # endif() - set(ENABLE_HYPRE ON CACHE BOOL "") - set(thirdPartyLibs ${thirdPartyLibs} hypre ${HYPRE_DEPENDS} ) + set( ENABLE_HYPRE ON CACHE BOOL "" ) + set( thirdPartyLibs ${thirdPartyLibs} hypre ${HYPRE_DEPENDS} ) else() if(ENABLE_HYPRE) message(WARNING "ENABLE_HYPRE is ON but HYPRE_DIR isn't defined.") @@ -907,12 +919,7 @@ message(STATUS "thirdPartyLibs = ${thirdPartyLibs}") # NvToolExt ############################### if ( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) - find_package(CUDAToolkit REQUIRED) - - message( " ----> $CUDAToolkit_VERSION = ${CUDAToolkit_VERSION}") - set(thirdPartyLibs ${thirdPartyLibs} CUDA::nvToolsExt) endif() message(STATUS "thirdPartyLibs = ${thirdPartyLibs}") - From 1d43a2bc087b725dfb423a511f237347e965ec7f Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 3 Jul 2024 02:19:09 +0100 Subject: [PATCH 124/286] update LvArray submodule hash (#3208) --- src/coreComponents/LvArray | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 7aace428c3e..1d2490252c5 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 7aace428c3ead5df5edbd9980d736fc95ee08da8 +Subproject commit 1d2490252c5cc97f87c9da0f5dd305e66f62f2c2 From 390b3565713bd6f567e8e6636c06cbd75d9aa8e6 Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Tue, 2 Jul 2024 23:27:57 -0500 Subject: [PATCH 125/286] Remove EOS template parameter from compositional fluid model (#3166) * Add generic parameters * Fix LBC test * Add EOS parameters to flash --------- Co-authored-by: Pavel Tomin --- .../constitutive/CMakeLists.txt | 8 +- .../fluid/multifluid/MultiFluidSelector.hpp | 12 +- .../CompositionalMultiphaseFluid.cpp | 45 +- .../CompositionalMultiphaseFluid.hpp | 27 +- .../PVTDriverRunTestCompositionalSRK.cpp | 26 - .../PVTDriverRunTestCompositionalSRKLBC.cpp | 26 - ...ompositionalTwoPhaseConstantViscosity.cpp} | 6 +- ...onalTwoPhaseLohrenzBrayClarkViscosity.cpp} | 6 +- .../functions/FugacityCalculator.hpp | 154 ++++ .../functions/NegativeTwoPhaseFlash.hpp | 713 ++++++++++-------- .../compositional/functions/StabilityTest.hpp | 47 +- .../models/CompositionalDensity.cpp | 48 +- .../models/CompositionalDensity.hpp | 120 ++- .../compositional/models/EquationOfState.hpp | 105 +++ .../models/LohrenzBrayClarkViscosity.hpp | 2 +- .../models/NegativeTwoPhaseFlashModel.cpp | 49 +- .../models/NegativeTwoPhaseFlashModel.hpp | 77 +- .../unitTests/testCompositionalDensity.cpp | 32 +- .../testLohrenzBrayClarkViscosity.cpp | 16 +- .../unitTests/testNegativeTwoPhaseFlash.cpp | 26 +- .../testNegativeTwoPhaseFlash9Comp.cpp | 38 +- .../unitTests/testStabilityTest2Comp.cpp | 21 +- .../unitTests/testStabilityTest9Comp.cpp | 43 +- ...son.rst => CompositionalTwoPhaseFluid.rst} | 3 + ...sitionalTwoPhaseFluidLohrenzBrayClark.rst} | 3 + ...alTwoPhaseFluidLohrenzBrayClark_other.rst} | 0 ...sitionalTwoPhaseFluidSoaveRedlichKwong.rst | 19 - ...ionalTwoPhaseFluidSoaveRedlichKwongLBC.rst | 23 - ...woPhaseFluidSoaveRedlichKwongLBC_other.rst | 31 - ...alTwoPhaseFluidSoaveRedlichKwong_other.rst | 31 - ...t => CompositionalTwoPhaseFluid_other.rst} | 0 .../schema/docs/Constitutive.rst | 176 +++-- .../schema/docs/Constitutive_other.rst | 176 +++-- src/coreComponents/schema/schema.xsd | 87 +-- src/coreComponents/schema/schema.xsd.other | 106 +-- .../testPVT_Compositional.xml | 12 +- src/docs/sphinx/CompleteXMLSchema.rst | 60 +- 37 files changed, 1251 insertions(+), 1123 deletions(-) delete mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp delete mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp rename src/coreComponents/constitutive/fluid/multifluid/compositional/{PVTDriverRunTestCompositionalPRLBC.cpp => PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp} (83%) rename src/coreComponents/constitutive/fluid/multifluid/compositional/{PVTDriverRunTestCompositionalPR.cpp => PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp} (81%) create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp rename src/coreComponents/schema/docs/{CompositionalTwoPhaseFluidPengRobinson.rst => CompositionalTwoPhaseFluid.rst} (83%) rename src/coreComponents/schema/docs/{CompositionalTwoPhaseFluidPengRobinsonLBC.rst => CompositionalTwoPhaseFluidLohrenzBrayClark.rst} (86%) rename src/coreComponents/schema/docs/{CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst => CompositionalTwoPhaseFluidLohrenzBrayClark_other.rst} (100%) delete mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst rename src/coreComponents/schema/docs/{CompositionalTwoPhaseFluidPengRobinson_other.rst => CompositionalTwoPhaseFluid_other.rst} (100%) diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index fad11918dca..4b9bd811ef6 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -64,6 +64,7 @@ set( constitutive_headers fluid/multifluid/compositional/functions/CompositionalProperties.hpp fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp + fluid/multifluid/compositional/functions/FugacityCalculator.hpp fluid/multifluid/compositional/functions/KValueInitialization.hpp fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp fluid/multifluid/compositional/functions/RachfordRice.hpp @@ -71,6 +72,7 @@ set( constitutive_headers fluid/multifluid/compositional/models/ComponentProperties.hpp fluid/multifluid/compositional/models/CompositionalDensity.hpp fluid/multifluid/compositional/models/ConstantViscosity.hpp + fluid/multifluid/compositional/models/EquationOfState.hpp fluid/multifluid/compositional/models/FunctionBase.hpp fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp @@ -226,10 +228,8 @@ set( constitutive_sources fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp - fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp - fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp - fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp - fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp + fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp fluid/multifluid/reactive/ReactiveBrineFluid.cpp fluid/multifluid/reactive/ReactiveMultiFluid.cpp fluid/multifluid/reactive/ReactiveFluidDriver.cpp diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index 79a1682cc1a..2e1eb17f92b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -51,11 +51,9 @@ void constitutiveUpdatePassThru( MultiFluidBase const & fluid, // Need to split compilation units for all the options #if !defined(GEOS_DEVICE_COMPILE) CO2BrineEzrokhiThermalFluid, - CompositionalTwoPhasePengRobinsonLBCViscosity, - CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, + CompositionalTwoPhaseLohrenzBrayClarkViscosity, #endif - CompositionalTwoPhasePengRobinsonConstantViscosity, - CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity + CompositionalTwoPhaseConstantViscosity >::execute( fluid, std::forward< LAMBDA >( lambda ) ); } @@ -75,11 +73,9 @@ void constitutiveUpdatePassThru( MultiFluidBase & fluid, // Need to split compilation units for all the options" #if !defined(GEOS_DEVICE_COMPILE) CO2BrineEzrokhiThermalFluid, - CompositionalTwoPhasePengRobinsonLBCViscosity, - CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, + CompositionalTwoPhaseLohrenzBrayClarkViscosity, #endif - CompositionalTwoPhasePengRobinsonConstantViscosity, - CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity + CompositionalTwoPhaseConstantViscosity >::execute( fluid, std::forward< LAMBDA >( lambda ) ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp index 05fb49acc66..aecd47507d1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp @@ -88,19 +88,10 @@ integer CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::getWaterP return PVTProps::PVTFunctionHelpers::findName( m_phaseNames, expectedWaterPhaseNames, viewKeyStruct::phaseNamesString() ); } -// Naming conventions -namespace compositional -{ -template< int NP > struct PhaseName {}; -template<> struct PhaseName< 2 > { static constexpr char const * catalogName() { return "TwoPhase"; } }; -template<> struct PhaseName< 3 > { static constexpr char const * catalogName() { return "ThreePhase"; } }; -} - template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > string CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::catalogName() { - return GEOS_FMT( "Compositional{}Fluid{}{}", - compositional::PhaseName< FLASH::KernelWrapper::getNumberOfPhases() >::catalogName(), + return GEOS_FMT( "Compositional{}Fluid{}", FLASH::catalogName(), PHASE1::Viscosity::catalogName() ); } @@ -268,39 +259,21 @@ CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createModelParame // Explicit instantiation of the model template. template class CompositionalMultiphaseFluid< - compositional::NegativeTwoPhaseFlashPRPR, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel > >; -template class CompositionalMultiphaseFluid< - compositional::NegativeTwoPhaseFlashSRKSRK, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel > >; + compositional::NegativeTwoPhaseFlashModel, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel > >; template class CompositionalMultiphaseFluid< - compositional::NegativeTwoPhaseFlashPRPR, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; -template class CompositionalMultiphaseFluid< - compositional::NegativeTwoPhaseFlashSRKSRK, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; - -REGISTER_CATALOG_ENTRY( ConstitutiveBase, - CompositionalTwoPhasePengRobinsonConstantViscosity, - string const &, - dataRepository::Group * const ) - -REGISTER_CATALOG_ENTRY( ConstitutiveBase, - CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity, - string const &, - dataRepository::Group * const ) + compositional::NegativeTwoPhaseFlashModel, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; REGISTER_CATALOG_ENTRY( ConstitutiveBase, - CompositionalTwoPhasePengRobinsonLBCViscosity, + CompositionalTwoPhaseConstantViscosity, string const &, dataRepository::Group * const ) REGISTER_CATALOG_ENTRY( ConstitutiveBase, - CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity, + CompositionalTwoPhaseLohrenzBrayClarkViscosity, string const &, dataRepository::Group * const ) diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp index 562b0eecf49..2c077184450 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp @@ -28,9 +28,6 @@ #include "constitutive/fluid/multifluid/compositional/models/NullModel.hpp" #include "constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp" -#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" -#include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" - namespace geos { namespace constitutive @@ -134,22 +131,14 @@ class CompositionalMultiphaseFluid : public MultiFluidBase PhaseComp::ValueType m_kValues; }; -using CompositionalTwoPhasePengRobinsonConstantViscosity = CompositionalMultiphaseFluid< - compositional::NegativeTwoPhaseFlashPRPR, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::ConstantViscosity, compositional::NullModel > >; -using CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity = CompositionalMultiphaseFluid< - compositional::NegativeTwoPhaseFlashSRKSRK, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::ConstantViscosity, compositional::NullModel > >; -using CompositionalTwoPhasePengRobinsonLBCViscosity = CompositionalMultiphaseFluid< - compositional::NegativeTwoPhaseFlashPRPR, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSPR >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; -using CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity = CompositionalMultiphaseFluid< - compositional::NegativeTwoPhaseFlashSRKSRK, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, - compositional::PhaseModel< compositional::CompositionalDensity< compositional::CubicEOSSRK >, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; +using CompositionalTwoPhaseConstantViscosity = CompositionalMultiphaseFluid< + compositional::NegativeTwoPhaseFlashModel, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::ConstantViscosity, compositional::NullModel > >; +using CompositionalTwoPhaseLohrenzBrayClarkViscosity = CompositionalMultiphaseFluid< + compositional::NegativeTwoPhaseFlashModel, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; } /* namespace constitutive */ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp deleted file mode 100644 index edcfd2af4f5..00000000000 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRK.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -/* - * PVTDriverRunTestCompositionalSRK.cpp - */ - -#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" -#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" - -namespace geos -{ -template void PVTDriver::runTest< constitutive::CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity >( - constitutive::CompositionalTwoPhaseSoaveRedlichKwongConstantViscosity &, arrayView2d< real64 > const & ); -} diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp deleted file mode 100644 index 1ab0ab8b15f..00000000000 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalSRKLBC.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -/* - * PVTDriverRunTestCompositionalSRKLBC.cpp - */ - -#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" -#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" - -namespace geos -{ -template void PVTDriver::runTest< constitutive::CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity >( - constitutive::CompositionalTwoPhaseSoaveRedlichKwongLBCViscosity &, arrayView2d< real64 > const & ); -} diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp similarity index 83% rename from src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp rename to src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp index 449d4459c57..4bdc6b832e4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPRLBC.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp @@ -13,7 +13,7 @@ */ /* - * PVTDriverRunTestCompositionalPRLBC.cpp + * PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp */ #include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" @@ -21,6 +21,6 @@ namespace geos { -template void PVTDriver::runTest< constitutive::CompositionalTwoPhasePengRobinsonLBCViscosity >( - constitutive::CompositionalTwoPhasePengRobinsonLBCViscosity &, arrayView2d< real64 > const & ); +template void PVTDriver::runTest< constitutive::CompositionalTwoPhaseConstantViscosity >( + constitutive::CompositionalTwoPhaseConstantViscosity &, arrayView2d< real64 > const & ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp similarity index 81% rename from src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp rename to src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp index eec79c6c150..df3caa11849 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalPR.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp @@ -13,7 +13,7 @@ */ /* - * PVTDriverRunTestCompositionalPR.cpp + * PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp */ #include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" @@ -21,6 +21,6 @@ namespace geos { -template void PVTDriver::runTest< constitutive::CompositionalTwoPhasePengRobinsonConstantViscosity >( - constitutive::CompositionalTwoPhasePengRobinsonConstantViscosity &, arrayView2d< real64 > const & ); +template void PVTDriver::runTest< constitutive::CompositionalTwoPhaseLohrenzBrayClarkViscosity >( + constitutive::CompositionalTwoPhaseLohrenzBrayClarkViscosity &, arrayView2d< real64 > const & ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp new file mode 100644 index 00000000000..8965a34d42d --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp @@ -0,0 +1,154 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file FugacityCalculator.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_FUGACITYCALCULATOR_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_FUGACITYCALCULATOR_HPP_ + +#include "constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp" +#include "constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +struct FugacityCalculator +{ + /** + * @brief Calculate the log fugacity for a phase + * @param[in] numComps number of components + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] composition composition of the phase + * @param[in] componentProperties The compositional component properties + * @param[in] equationOfState The equation of state + * @param[out] logFugacity the calculated log fugacity + */ + template< int USD > + GEOS_HOST_DEVICE + static void computeLogFugacity( integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + EquationOfStateType const equationOfState, + arraySlice1d< real64 > const & logFugacity ); + + /** + * @brief Calculate the derivatives for the log fugacity for a phase + * @param[in] numComps number of components + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] composition composition of the phase + * @param[in] componentProperties The compositional component properties + * @param[in] equationOfState The equation of state + * @param[in] logFugacity the calculated log fugacity + * @param[out] logFugacityDerivs the calculated derivatives of the log fugacity + */ + template< int USD1, int USD2 > + GEOS_HOST_DEVICE + static void computeLogFugacityDerivatives( integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + EquationOfStateType const equationOfState, + arraySlice1d< real64 const > const & logFugacity, + arraySlice2d< real64, USD2 > const & logFugacityDerivs ); +}; + +template< int USD > +GEOS_HOST_DEVICE +void FugacityCalculator::computeLogFugacity( integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + EquationOfStateType const equationOfState, + arraySlice1d< real64 > const & logFugacity ) +{ + if( equationOfState == EquationOfStateType::PengRobinson ) + { + CubicEOSPhaseModel< PengRobinsonEOS >:: + computeLogFugacityCoefficients( numComps, + pressure, + temperature, + composition, + componentProperties, + logFugacity ); + } + else if( equationOfState == EquationOfStateType::SoaveRedlichKwong ) + { + CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: + computeLogFugacityCoefficients( numComps, + pressure, + temperature, + composition, + componentProperties, + logFugacity ); + } +} + +template< int USD1, int USD2 > +GEOS_HOST_DEVICE +void FugacityCalculator::computeLogFugacityDerivatives( integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const, USD1 > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + EquationOfStateType const equationOfState, + arraySlice1d< real64 const > const & logFugacity, + arraySlice2d< real64, USD2 > const & logFugacityDerivs ) +{ + if( equationOfState == EquationOfStateType::PengRobinson ) + { + CubicEOSPhaseModel< PengRobinsonEOS >:: + computeLogFugacityCoefficients( numComps, + pressure, + temperature, + composition, + componentProperties, + logFugacity, + logFugacityDerivs ); + } + else if( equationOfState == EquationOfStateType::SoaveRedlichKwong ) + { + CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: + computeLogFugacityCoefficients( numComps, + pressure, + temperature, + composition, + componentProperties, + logFugacity, + logFugacityDerivs ); + } +} + +} // namespace compositional + +} // namespace constitutive + +} // namespace geos + + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_FUGACITYCALCULATOR_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp index 1b9a9a5bc57..3042b1a2c94 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -19,9 +19,9 @@ #ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_NEGATIVETWOPHASEFLASH_HPP_ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_NEGATIVETWOPHASEFLASH_HPP_ -#include "common/DataTypes.hpp" #include "RachfordRice.hpp" #include "KValueInitialization.hpp" +#include "FugacityCalculator.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" #include "constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp" #include "denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp" @@ -32,12 +32,15 @@ namespace geos namespace constitutive { +using namespace multifluid; + namespace compositional { struct NegativeTwoPhaseFlash { - using Deriv = geos::constitutive::multifluid::DerivativeOffset; + using Deriv = multifluid::DerivativeOffset; + public: /** * @brief Perform negative two-phase EOS flash @@ -46,135 +49,27 @@ struct NegativeTwoPhaseFlash * @param[in] temperature temperature * @param[in] composition composition of the mixture * @param[in] componentProperties The compositional component properties + * @param[in] liquidEos The equation of state for the liquid phase + * @param[in] vapourEos The equation of state for the vapour phase + * @param[in/out] kValues The phase equilibrium ratios * @param[out] vapourPhaseMoleFraction the calculated vapour (gas) mole fraction * @param[out] liquidComposition the calculated liquid phase composition * @param[out] vapourComposition the calculated vapour phase composition * @return an indicator of success of the flash */ - template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR, integer USD1, integer USD2, integer USD3 > + template< int USD1, int USD2 > GEOS_HOST_DEVICE static bool compute( integer const numComps, real64 const pressure, real64 const temperature, - arraySlice1d< real64 const, USD1 > const & composition, + arraySlice1d< real64 const > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - arraySlice2d< real64, USD3 > const & kValues, + EquationOfStateType const liquidEos, + EquationOfStateType const vapourEos, + arraySlice2d< real64, USD1 > const & kValues, real64 & vapourPhaseMoleFraction, arraySlice1d< real64, USD2 > const & liquidComposition, - arraySlice1d< real64, USD2 > const & vapourComposition ) - { - constexpr integer maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; - stackArray1d< real64, maxNumComps > logLiquidFugacity( numComps ); - stackArray1d< real64, maxNumComps > logVapourFugacity( numComps ); - stackArray1d< real64, maxNumComps > fugacityRatios( numComps ); - stackArray1d< integer, maxNumComps > availableComponents( numComps ); - auto const & kVapourLiquid = kValues[0]; - - calculatePresentComponents( numComps, composition, availableComponents ); - - auto const presentComponents = availableComponents.toSliceConst(); - - // Initialise compositions to feed composition - for( integer ic = 0; ic < numComps; ++ic ) - { - liquidComposition[ic] = composition[ic]; - vapourComposition[ic] = composition[ic]; - } - - // Check if k-Values need to be initialised - bool needInitialisation = true; - for( integer ic = 0; ic < numComps; ++ic ) - { - if( kVapourLiquid[ic] < MultiFluidConstants::epsilon ) - { - needInitialisation = true; - break; - } - } - - bool kValueReset = true; - constexpr real64 boundsTolerance = MultiFluidConstants::SSITolerance; - if( needInitialisation ) - { - KValueInitialization::computeWilsonGasLiquidKvalue( numComps, - pressure, - temperature, - componentProperties, - kVapourLiquid ); - } - - vapourPhaseMoleFraction = RachfordRice::solve( kVapourLiquid.toSliceConst(), composition, presentComponents ); - real64 const initialVapourFraction = vapourPhaseMoleFraction; - - bool converged = false; - for( localIndex iterationCount = 0; iterationCount < MultiFluidConstants::maxSSIIterations; ++iterationCount ) - { - real64 const error = computeFugacityRatio< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >( - numComps, - pressure, - temperature, - composition, - componentProperties, - kVapourLiquid.toSliceConst(), - presentComponents, - vapourPhaseMoleFraction, - liquidComposition, - vapourComposition, - logLiquidFugacity.toSlice(), - logVapourFugacity.toSlice(), - fugacityRatios.toSlice() ); - - // Compute fugacity ratios and check convergence - converged = (error < MultiFluidConstants::fugacityTolerance); - - if( converged ) - { - break; - } - - // Update K-values - if( (vapourPhaseMoleFraction < -boundsTolerance || vapourPhaseMoleFraction > 1.0+boundsTolerance) - && 0.2 < LvArray::math::abs( vapourPhaseMoleFraction-initialVapourFraction ) - && !kValueReset ) - { - KValueInitialization::computeConstantLiquidKvalue( numComps, - pressure, - temperature, - componentProperties, - kVapourLiquid ); - kValueReset = true; - } - else - { - for( integer const ic : presentComponents ) - { - kVapourLiquid[ic] *= exp( fugacityRatios[ic] ); - } - } - } - - // Retrieve physical bounds from negative flash values - if( vapourPhaseMoleFraction < MultiFluidConstants::epsilon ) - { - vapourPhaseMoleFraction = 0.0; - for( integer ic = 0; ic < numComps; ++ic ) - { - liquidComposition[ic] = composition[ic]; - vapourComposition[ic] = composition[ic]; - } - } - else if( 1.0 - vapourPhaseMoleFraction < MultiFluidConstants::epsilon ) - { - vapourPhaseMoleFraction = 1.0; - for( integer ic = 0; ic < numComps; ++ic ) - { - liquidComposition[ic] = composition[ic]; - vapourComposition[ic] = composition[ic]; - } - } - - return converged; - } + arraySlice1d< real64, USD2 > const & vapourComposition ); /** * @brief Calculate derivatives from the two-phase negative flash @@ -183,6 +78,8 @@ struct NegativeTwoPhaseFlash * @param[in] temperature temperature * @param[in] composition composition of the mixture * @param[in] componentProperties The compositional component properties + * @param[in] liquidEos The equation of state for the liquid phase + * @param[in] vapourEos The equation of state for the vapour phase * @param[in] vapourFraction the calculated vapour (gas) mole fraction * @param[in] liquidComposition the calculated liquid phase composition * @param[in] vapourComposition the calculated vapour phase composition @@ -190,163 +87,21 @@ struct NegativeTwoPhaseFlash * @param[out] liquidCompositionDerivs derivatives of the calculated liquid phase composition * @param[out] vapourCompositionDerivs derivatives of the calculated vapour phase composition */ - template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR, integer USD1, integer USD2 > + template< integer USD1, integer USD2, integer USD3 > GEOS_HOST_DEVICE static void computeDerivatives( integer const numComps, real64 const pressure, real64 const temperature, arraySlice1d< real64 const > const & composition, ComponentProperties::KernelWrapper const & componentProperties, - real64 const vapourFraction, + EquationOfStateType const liquidEos, + EquationOfStateType const vapourEos, + real64 const & vapourFraction, arraySlice1d< real64 const, USD1 > const & liquidComposition, arraySlice1d< real64 const, USD1 > const & vapourComposition, - arraySlice1d< real64, USD1 > const & vapourFractionDerivs, - arraySlice2d< real64, USD2 > const & liquidCompositionDerivs, - arraySlice2d< real64, USD2 > const & vapourCompositionDerivs ) - { - constexpr integer maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; - constexpr integer maxNumDofs = MultiFluidConstants::MAX_NUM_COMPONENTS + 2; - - integer const numDofs = numComps + 2; - - auto const setZero = []( real64 & val ) { val = 0.0; }; - LvArray::forValuesInSlice( vapourFractionDerivs, setZero ); - LvArray::forValuesInSlice( liquidCompositionDerivs, setZero ); - LvArray::forValuesInSlice( vapourCompositionDerivs, setZero ); - - // Check if we are single or 2-phase - if( vapourFraction < MultiFluidConstants::epsilon ) - { - for( integer ic = 0; ic < numComps; ++ic ) - { - liquidCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; - vapourCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; - } - } - else if( 1.0 - vapourFraction < MultiFluidConstants::epsilon ) - { - for( integer ic = 0; ic < numComps; ++ic ) - { - liquidCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; - vapourCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; - } - } - else - { - // Calculate the liquid and vapour fugacities and derivatives - stackArray1d< real64, maxNumComps > logLiquidFugacity( numComps ); - stackArray1d< real64, maxNumComps > logVapourFugacity( numComps ); - stackArray2d< real64, maxNumComps * maxNumDofs > logLiquidFugacityDerivs( numComps, numDofs ); - stackArray2d< real64, maxNumComps * maxNumDofs > logVapourFugacityDerivs( numComps, numDofs ); - - EOS_TYPE_LIQUID::computeLogFugacityCoefficients( numComps, - pressure, - temperature, - liquidComposition, - componentProperties, - logLiquidFugacity ); - EOS_TYPE_LIQUID::computeLogFugacityCoefficients( numComps, - pressure, - temperature, - liquidComposition, - componentProperties, - logLiquidFugacity, - logLiquidFugacityDerivs ); - EOS_TYPE_VAPOUR::computeLogFugacityCoefficients( numComps, - pressure, - temperature, - vapourComposition, - componentProperties, - logVapourFugacity ); - EOS_TYPE_VAPOUR::computeLogFugacityCoefficients( numComps, - pressure, - temperature, - vapourComposition, - componentProperties, - logVapourFugacity, - logVapourFugacityDerivs ); - - constexpr integer maxNumVals = 2*MultiFluidConstants::MAX_NUM_COMPONENTS+1; - integer const numVals = 2*numComps; - stackArray1d< real64, maxNumVals > b( numVals + 1 ); - stackArray1d< real64, maxNumVals > x( numVals + 1 ); - stackArray2d< real64, maxNumVals * maxNumVals > A( numVals + 1, numVals + 1 ); - - LvArray::forValuesInSlice( A.toSlice(), setZero ); - LvArray::forValuesInSlice( b.toSlice(), setZero ); - - for( integer ic = 0; ic < numComps; ++ic ) - { - integer const xi = ic; - integer const yi = ic + numComps; - integer const vi = numVals; - - integer e = ic; - A( e, xi ) = 1.0 - vapourFraction; - A( e, yi ) = vapourFraction; - A( e, vi ) = vapourComposition[ic] - liquidComposition[ic]; - - e = ic + numComps; - real64 const phiL = exp( logLiquidFugacity( ic ) ); - real64 const phiV = exp( logVapourFugacity( ic ) ); - for( integer jc = 0; jc < numComps; ++jc ) - { - integer const xj = jc; - integer const yj = jc + numComps; - real64 const dPhiLdx = logLiquidFugacityDerivs( ic, Deriv::dC+jc ); - real64 const dPhiVdy = logVapourFugacityDerivs( ic, Deriv::dC+jc ); - A( e, xj ) = liquidComposition[ic] * phiL * dPhiLdx; - A( e, yj ) = -vapourComposition[ic] * phiV * dPhiVdy; - } - A( e, xi ) += phiL; - A( e, yi ) -= phiV; - - e = numVals; - A( e, xi ) = -1.0; - A( e, yi ) = 1.0; - } - // Pressure and temperature derivatives - for( integer const pc : {Deriv::dP, Deriv::dT} ) - { - for( integer ic = 0; ic < numComps; ++ic ) - { - real64 const phiL = exp( logLiquidFugacity( ic ) ); - real64 const phiV = exp( logVapourFugacity( ic ) ); - b( ic ) = 0.0; - b( ic + numComps ) = -liquidComposition[ic] * phiL * logLiquidFugacityDerivs( ic, pc ) - + vapourComposition[ic] * phiV * logVapourFugacityDerivs( ic, pc ); - } - b( numVals ) = 0.0; - solveLinearSystem( A, b, x ); - for( integer ic = 0; ic < numComps; ++ic ) - { - liquidCompositionDerivs( ic, pc ) = x( ic ); - vapourCompositionDerivs( ic, pc ) = x( ic + numComps ); - } - vapourFractionDerivs( pc ) = x( numVals ); - } - // Composition derivatives - for( integer kc = 0; kc < numComps; ++kc ) - { - integer const pc = Deriv::dC + kc; - - for( integer ic = 0; ic < numComps; ++ic ) - { - b( ic ) = -composition[ic]; - b( ic + numComps ) = 0.0; - } - b( kc ) += 1.0; - b( numVals ) = 0.0; - solveLinearSystem( A, b, x ); - for( integer ic = 0; ic < numComps; ++ic ) - { - liquidCompositionDerivs( ic, pc ) = x( ic ); - vapourCompositionDerivs( ic, pc ) = x( ic + numComps ); - } - vapourFractionDerivs( pc ) = x( numVals ); - } - } - } + arraySlice1d< real64, USD2 > const & vapourFractionDerivs, + arraySlice2d< real64, USD3 > const & liquidCompositionDerivs, + arraySlice2d< real64, USD3 > const & vapourCompositionDerivs ); private: /** @@ -368,7 +123,7 @@ struct NegativeTwoPhaseFlash integer presentCount = 0; for( integer ic = 0; ic < numComps; ++ic ) { - if( MultiFluidConstants::epsilon < composition[ic] ) + if( MultiFluidConstants::minForSpeciesPresence < composition[ic] ) { presentComponents[presentCount++] = ic; } @@ -405,9 +160,23 @@ struct NegativeTwoPhaseFlash /** * @brief Calculate the logarithms of the fugacity ratios * @param[in] numComps number of components - * @param[in] composition composition to be normalized + * @param[in] pressure pressure + * @param[in] temperature temperature + * @param[in] composition composition of the mixture + * @param[in] componentProperties The compositional component properties + * @param[in] liquidEos The equation of state for the liquid phase + * @param[in] vapourEos The equation of state for the vapour phase + * @param[in] kValues The k-values + * @param[in] presentComponents The indices of the present components + * @param[out] vapourPhaseMoleFraction the calculated vapour (gas) mole fraction + * @param[out] liquidComposition the calculated liquid phase composition + * @param[out] vapourComposition the calculated vapour phase composition + * @param[out] logLiquidFugacity the calculated log fugacity ratios for the liquid phase + * @param[out] logVapourFugacity the calculated log fugacity ratios for the vapour phase + * @param[out] fugacityRatios the fugacity rations + * @return The error */ - template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR, integer USD > + template< integer USD > GEOS_HOST_DEVICE static real64 computeFugacityRatio( integer const numComps, @@ -415,6 +184,8 @@ struct NegativeTwoPhaseFlash real64 const temperature, arraySlice1d< real64 const > const & composition, ComponentProperties::KernelWrapper const & componentProperties, + EquationOfStateType const liquidEos, + EquationOfStateType const vapourEos, arraySlice1d< real64 const, USD > const & kValues, arraySlice1d< integer const > const & presentComponents, real64 & vapourPhaseMoleFraction, @@ -422,58 +193,384 @@ struct NegativeTwoPhaseFlash arraySlice1d< real64, USD > const & vapourComposition, arraySlice1d< real64 > const & logLiquidFugacity, arraySlice1d< real64 > const & logVapourFugacity, - arraySlice1d< real64 > const & fugacityRatios ) - { - // Solve Rachford-Rice Equation - vapourPhaseMoleFraction = RachfordRice::solve( kValues, composition, presentComponents ); - - // Assign phase compositions - for( integer const ic : presentComponents ) - { - liquidComposition[ic] = composition[ic] / ( 1.0 + vapourPhaseMoleFraction * ( kValues[ic] - 1.0 ) ); - vapourComposition[ic] = kValues[ic] * liquidComposition[ic]; - } - normalizeComposition( numComps, liquidComposition ); - normalizeComposition( numComps, vapourComposition ); - - // Compute the phase fugacities - EOS_TYPE_LIQUID::computeLogFugacityCoefficients( numComps, - pressure, - temperature, - liquidComposition.toSliceConst(), - componentProperties, - logLiquidFugacity ); - EOS_TYPE_VAPOUR::computeLogFugacityCoefficients( numComps, - pressure, - temperature, - vapourComposition.toSliceConst(), - componentProperties, - logVapourFugacity ); - - // Compute fugacity ratios and calculate the error - real64 error = 0.0; - for( integer const ic : presentComponents ) - { - fugacityRatios[ic] = ( logLiquidFugacity[ic] - logVapourFugacity[ic] ) + log( liquidComposition[ic] ) - log( vapourComposition[ic] ); - error += (fugacityRatios[ic]*fugacityRatios[ic]); - } - return LvArray::math::sqrt( error ); - } + arraySlice1d< real64 > const & fugacityRatios ); + /** + * @brief Solve the lineat system for the derivatives of the flash + * @param[in] A the coefficient matrix + * @param[in] b the rhs + * @param[out] x the solution + * @return @c true if the problem is well solved @c false otherwise + */ GEOS_HOST_DEVICE static bool solveLinearSystem( arraySlice2d< real64 const > const & A, arraySlice1d< real64 const > const & b, arraySlice1d< real64 > const & x ) { #if defined(GEOS_DEVICE_COMPILE) + GEOS_UNUSED_VAR( A ); + GEOS_UNUSED_VAR( b ); + GEOS_UNUSED_VAR( x ); return false; #else BlasLapackLA::solveLinearSystem( A, b, x ); return true; #endif } + }; +template< int USD1, int USD2 > +GEOS_HOST_DEVICE +bool NegativeTwoPhaseFlash::compute( integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + EquationOfStateType const liquidEos, + EquationOfStateType const vapourEos, + arraySlice2d< real64, USD1 > const & kValues, + real64 & vapourPhaseMoleFraction, + arraySlice1d< real64, USD2 > const & liquidComposition, + arraySlice1d< real64, USD2 > const & vapourComposition ) +{ + constexpr integer maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + stackArray1d< real64, maxNumComps > logLiquidFugacity( numComps ); + stackArray1d< real64, maxNumComps > logVapourFugacity( numComps ); + stackArray1d< real64, maxNumComps > fugacityRatios( numComps ); + stackArray1d< integer, maxNumComps > componentIndices( numComps ); + auto const & kVapourLiquid = kValues[0]; + + calculatePresentComponents( numComps, composition, componentIndices ); + + // Initialise compositions to feed composition + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidComposition[ic] = composition[ic]; + vapourComposition[ic] = composition[ic]; + } + + // Check if k-Values need to be initialised + bool needInitialisation = true; + for( integer ic = 0; ic < numComps; ++ic ) + { + if( kVapourLiquid[ic] < MultiFluidConstants::epsilon ) + { + needInitialisation = true; + break; + } + } + + bool kValueReset = true; + constexpr real64 boundsTolerance = 1.0e-3; + + if( needInitialisation ) + { + KValueInitialization::computeWilsonGasLiquidKvalue( numComps, + pressure, + temperature, + componentProperties, + kVapourLiquid ); + } + + auto const presentComponents = componentIndices.toSliceConst(); + + real64 const initialVapourFraction = RachfordRice::solve( kVapourLiquid.toSliceConst(), composition, presentComponents ); + + bool converged = false; + for( localIndex iterationCount = 0; iterationCount < MultiFluidConstants::maxSSIIterations; ++iterationCount ) + { + real64 const error = computeFugacityRatio( numComps, + pressure, + temperature, + composition, + componentProperties, + liquidEos, + vapourEos, + kVapourLiquid.toSliceConst(), + presentComponents, + vapourPhaseMoleFraction, + liquidComposition, + vapourComposition, + logLiquidFugacity.toSlice(), + logVapourFugacity.toSlice(), + fugacityRatios.toSlice() ); + + // Compute fugacity ratios and check convergence + converged = (error < MultiFluidConstants::fugacityTolerance); + + if( converged ) + { + break; + } + + // Update K-values + if( (vapourPhaseMoleFraction < -boundsTolerance || 1.0-vapourPhaseMoleFraction < -boundsTolerance) + && 0.2 < LvArray::math::abs( vapourPhaseMoleFraction-initialVapourFraction ) + && !kValueReset ) + { + KValueInitialization::computeConstantLiquidKvalue( numComps, + pressure, + temperature, + componentProperties, + kVapourLiquid ); + kValueReset = true; + } + else + { + for( integer ic = 0; ic < numComps; ++ic ) + { + kVapourLiquid[ic] *= exp( fugacityRatios[ic] ); + } + } + } + + // Retrieve physical bounds from negative flash values + if( vapourPhaseMoleFraction < MultiFluidConstants::epsilon ) + { + vapourPhaseMoleFraction = 0.0; + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidComposition[ic] = composition[ic]; + vapourComposition[ic] = composition[ic]; + } + } + else if( 1.0 - vapourPhaseMoleFraction < MultiFluidConstants::epsilon ) + { + vapourPhaseMoleFraction = 1.0; + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidComposition[ic] = composition[ic]; + vapourComposition[ic] = composition[ic]; + } + } + + return converged; +} + +template< integer USD1, integer USD2, integer USD3 > +GEOS_HOST_DEVICE +void NegativeTwoPhaseFlash::computeDerivatives( + integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + EquationOfStateType const liquidEos, + EquationOfStateType const vapourEos, + real64 const & vapourFraction, + arraySlice1d< real64 const, USD1 > const & liquidComposition, + arraySlice1d< real64 const, USD1 > const & vapourComposition, + arraySlice1d< real64, USD2 > const & vapourFractionDerivs, + arraySlice2d< real64, USD3 > const & liquidCompositionDerivs, + arraySlice2d< real64, USD3 > const & vapourCompositionDerivs ) +{ + constexpr integer maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; + constexpr integer maxNumDofs = MultiFluidConstants::MAX_NUM_COMPONENTS + 2; + + integer const numDofs = numComps + 2; + + auto const setZero = []( real64 & val ) { val = 0.0; }; + LvArray::forValuesInSlice( vapourFractionDerivs, setZero ); + LvArray::forValuesInSlice( liquidCompositionDerivs, setZero ); + LvArray::forValuesInSlice( vapourCompositionDerivs, setZero ); + + // Check if we are single or 2-phase + if( vapourFraction < MultiFluidConstants::epsilon ) + { + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + vapourCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + } + } + else if( 1.0 - vapourFraction < MultiFluidConstants::epsilon ) + { + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + vapourCompositionDerivs( ic, Deriv::dC + ic ) = 1.0; + } + } + else + { + // Calculate the liquid and vapour fugacities and derivatives + stackArray1d< real64, maxNumComps > logLiquidFugacity( numComps ); + stackArray1d< real64, maxNumComps > logVapourFugacity( numComps ); + stackArray2d< real64, maxNumComps * maxNumDofs > logLiquidFugacityDerivs( numComps, numDofs ); + stackArray2d< real64, maxNumComps * maxNumDofs > logVapourFugacityDerivs( numComps, numDofs ); + + FugacityCalculator::computeLogFugacity( numComps, + pressure, + temperature, + liquidComposition, + componentProperties, + liquidEos, + logLiquidFugacity ); + FugacityCalculator::computeLogFugacity( numComps, + pressure, + temperature, + vapourComposition, + componentProperties, + vapourEos, + logVapourFugacity ); + + FugacityCalculator::computeLogFugacityDerivatives( numComps, + pressure, + temperature, + liquidComposition, + componentProperties, + liquidEos, + logLiquidFugacity.toSliceConst(), + logLiquidFugacityDerivs.toSlice() ); + FugacityCalculator::computeLogFugacityDerivatives( numComps, + pressure, + temperature, + vapourComposition, + componentProperties, + vapourEos, + logVapourFugacity.toSliceConst(), + logVapourFugacityDerivs.toSlice() ); + + constexpr integer maxNumVals = 2*MultiFluidConstants::MAX_NUM_COMPONENTS+1; + integer const numVals = 2*numComps; + stackArray1d< real64, maxNumVals > b( numVals + 1 ); + stackArray1d< real64, maxNumVals > x( numVals + 1 ); + stackArray2d< real64, maxNumVals * maxNumVals > A( numVals + 1, numVals + 1 ); + + LvArray::forValuesInSlice( A.toSlice(), setZero ); + LvArray::forValuesInSlice( b.toSlice(), setZero ); + + for( integer ic = 0; ic < numComps; ++ic ) + { + integer const xi = ic; + integer const yi = ic + numComps; + integer const vi = numVals; + + integer e = ic; + A( e, xi ) = 1.0 - vapourFraction; + A( e, yi ) = vapourFraction; + A( e, vi ) = vapourComposition[ic] - liquidComposition[ic]; + + e = ic + numComps; + real64 const phiL = exp( logLiquidFugacity( ic ) ); + real64 const phiV = exp( logVapourFugacity( ic ) ); + for( integer jc = 0; jc < numComps; ++jc ) + { + integer const xj = jc; + integer const yj = jc + numComps; + real64 const dPhiLdx = logLiquidFugacityDerivs( ic, Deriv::dC+jc ); + real64 const dPhiVdy = logVapourFugacityDerivs( ic, Deriv::dC+jc ); + A( e, xj ) = liquidComposition[ic] * phiL * dPhiLdx; + A( e, yj ) = -vapourComposition[ic] * phiV * dPhiVdy; + } + A( e, xi ) += phiL; + A( e, yi ) -= phiV; + + e = numVals; + A( e, xi ) = -1.0; + A( e, yi ) = 1.0; + } + // Pressure and temperature derivatives + for( integer const pc : {Deriv::dP, Deriv::dT} ) + { + for( integer ic = 0; ic < numComps; ++ic ) + { + real64 const phiL = exp( logLiquidFugacity( ic ) ); + real64 const phiV = exp( logVapourFugacity( ic ) ); + b( ic ) = 0.0; + b( ic + numComps ) = -liquidComposition[ic] * phiL * logLiquidFugacityDerivs( ic, pc ) + + vapourComposition[ic] * phiV * logVapourFugacityDerivs( ic, pc ); + } + b( numVals ) = 0.0; + solveLinearSystem( A, b, x ); + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, pc ) = x( ic ); + vapourCompositionDerivs( ic, pc ) = x( ic + numComps ); + } + vapourFractionDerivs( pc ) = x( numVals ); + } + // Composition derivatives + for( integer kc = 0; kc < numComps; ++kc ) + { + integer const pc = Deriv::dC + kc; + + for( integer ic = 0; ic < numComps; ++ic ) + { + b( ic ) = -composition[ic]; + b( ic + numComps ) = 0.0; + } + b( kc ) += 1.0; + b( numVals ) = 0.0; + solveLinearSystem( A, b, x ); + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidCompositionDerivs( ic, pc ) = x( ic ); + vapourCompositionDerivs( ic, pc ) = x( ic + numComps ); + } + vapourFractionDerivs( pc ) = x( numVals ); + } + } +} + +template< integer USD > +GEOS_HOST_DEVICE +real64 NegativeTwoPhaseFlash::computeFugacityRatio( + integer const numComps, + real64 const pressure, + real64 const temperature, + arraySlice1d< real64 const > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + EquationOfStateType const liquidEos, + EquationOfStateType const vapourEos, + arraySlice1d< real64 const, USD > const & kValues, + arraySlice1d< integer const > const & presentComponents, + real64 & vapourPhaseMoleFraction, + arraySlice1d< real64, USD > const & liquidComposition, + arraySlice1d< real64, USD > const & vapourComposition, + arraySlice1d< real64 > const & logLiquidFugacity, + arraySlice1d< real64 > const & logVapourFugacity, + arraySlice1d< real64 > const & fugacityRatios ) +{ + // Solve Rachford-Rice Equation + vapourPhaseMoleFraction = RachfordRice::solve( kValues, composition, presentComponents ); + + // Assign phase compositions + for( integer ic = 0; ic < numComps; ++ic ) + { + liquidComposition[ic] = composition[ic] / ( 1.0 + vapourPhaseMoleFraction * ( kValues[ic] - 1.0 ) ); + vapourComposition[ic] = kValues[ic] * liquidComposition[ic]; + } + + normalizeComposition( numComps, liquidComposition ); + normalizeComposition( numComps, vapourComposition ); + + FugacityCalculator::computeLogFugacity( numComps, + pressure, + temperature, + liquidComposition.toSliceConst(), + componentProperties, + liquidEos, + logLiquidFugacity ); + FugacityCalculator::computeLogFugacity( numComps, + pressure, + temperature, + vapourComposition.toSliceConst(), + componentProperties, + vapourEos, + logVapourFugacity ); + + // Compute fugacity ratios and calculate the error + real64 error = 0.0; + for( integer const ic : presentComponents ) + { + fugacityRatios[ic] = ( logLiquidFugacity[ic] - logVapourFugacity[ic] ) + log( liquidComposition[ic] ) - log( vapourComposition[ic] ); + error += (fugacityRatios[ic]*fugacityRatios[ic]); + } + return LvArray::math::sqrt( error ); +} + } // namespace compositional } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp index 8ddef572339..4d6740aedc9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp @@ -20,6 +20,7 @@ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_STABILITYTEST_HPP_ #include "KValueInitialization.hpp" +#include "FugacityCalculator.hpp" #include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" #include "constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp" @@ -45,17 +46,19 @@ struct StabilityTest * @param[in] temperature temperature * @param[in] composition composition of the mixture * @param[in] componentProperties The compositional component properties + * @param[in] equationOfState The equation of state * @param[out] tangentPlaneDistance the minimum tangent plane distance (TPD) * @param[out] kValues the k-values estimated from the stationary points * @return a flag indicating that 2 stationary points have been found */ - template< typename EOS_TYPE, integer USD1 > + template< integer USD1 > GEOS_HOST_DEVICE static bool compute( integer const numComps, real64 const pressure, real64 const temperature, arraySlice1d< real64 const, USD1 > const & composition, ComponentProperties::KernelWrapper const & componentProperties, + EquationOfStateType const & equationOfState, real64 & tangentPlaneDistance, arraySlice1d< real64 > const & kValues ) { @@ -76,12 +79,13 @@ struct StabilityTest { hyperplane[ic] = 0.0; } - EOS_TYPE::computeLogFugacityCoefficients( numComps, - pressure, - temperature, - composition, - componentProperties, - logFugacity ); + FugacityCalculator::computeLogFugacity( numComps, + pressure, + temperature, + composition, + componentProperties, + equationOfState, + logFugacity ); for( integer const ic : presentComponents ) { hyperplane[ic] = LvArray::math::log( composition[ic] ) + logFugacity[ic]; @@ -109,12 +113,14 @@ struct StabilityTest normalizedComposition[ic] = trialComposition( trialIndex, ic ); } normalizeComposition( numComps, normalizedComposition.toSlice() ); - EOS_TYPE::computeLogFugacityCoefficients( numComps, - pressure, - temperature, - normalizedComposition.toSliceConst(), - componentProperties, - logFugacity ); + + FugacityCalculator::computeLogFugacity( numComps, + pressure, + temperature, + normalizedComposition.toSliceConst(), + componentProperties, + equationOfState, + logFugacity ); for( integer const ic : presentComponents ) { logTrialComposition[ic] = LvArray::math::log( trialComposition( trialIndex, ic ) ); @@ -128,12 +134,15 @@ struct StabilityTest normalizedComposition[ic] = trialComposition( trialIndex, ic ); } normalizeComposition( numComps, normalizedComposition.toSlice() ); - EOS_TYPE::computeLogFugacityCoefficients( numComps, - pressure, - temperature, - normalizedComposition.toSliceConst(), - componentProperties, - logFugacity ); + + FugacityCalculator::computeLogFugacity( numComps, + pressure, + temperature, + normalizedComposition.toSliceConst(), + componentProperties, + equationOfState, + logFugacity ); + real64 error = 0.0; for( integer const ic : presentComponents ) { diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp index da9ec1e02cc..adbc7263298 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp @@ -25,7 +25,53 @@ namespace constitutive { namespace compositional -{} // namespace compositional +{ +CompositionalDensity::CompositionalDensity( string const & name, + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ) + : FunctionBase( name, componentProperties ) +{ + EquationOfState const * equationOfState = modelParameters.get< EquationOfState >(); + string const eosName = equationOfState->m_equationsOfStateNames[phaseIndex]; + m_equationOfState = EnumStrings< EquationOfStateType >::fromString( eosName ); + + // Calculate the dimensional volume shift + m_componentDimensionalVolumeShift.resize( componentProperties.getNumberOfComponents()); + calculateDimensionalVolumeShift( componentProperties, + m_equationOfState, + m_componentDimensionalVolumeShift ); +} + +CompositionalDensity::KernelWrapper +CompositionalDensity::createKernelWrapper() const +{ + return KernelWrapper( m_componentDimensionalVolumeShift, m_equationOfState ); +} + +std::unique_ptr< ModelParameters > +CompositionalDensity::createParameters( std::unique_ptr< ModelParameters > parameters ) +{ + return EquationOfState::create( std::move( parameters ) ); +} + +void CompositionalDensity::calculateDimensionalVolumeShift( ComponentProperties const & componentProperties, + EquationOfStateType const & equationOfState, + arraySlice1d< real64 > componentDimensionalVolumeShift ) +{ + if( equationOfState == EquationOfStateType::PengRobinson ) + { + CubicEOSPhaseModel< PengRobinsonEOS >::calculateDimensionalVolumeShift( componentProperties, + componentDimensionalVolumeShift ); + } + else if( equationOfState == EquationOfStateType::SoaveRedlichKwong ) + { + CubicEOSPhaseModel< SoaveRedlichKwongEOS >::calculateDimensionalVolumeShift( componentProperties, + componentDimensionalVolumeShift ); + } +} + +} // namespace compositional } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp index 7adcd78a3e1..751732a4711 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp @@ -20,10 +20,12 @@ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_COMPOSITIONALDENSITY_HPP_ #include "FunctionBase.hpp" +#include "EquationOfState.hpp" #include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" #include "constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" namespace geos { @@ -34,12 +36,13 @@ namespace constitutive namespace compositional { -template< typename EOS_TYPE > class CompositionalDensityUpdate final : public FunctionBaseUpdate { public: - explicit CompositionalDensityUpdate( arrayView1d< real64 const > const & volumeShift ) - : m_componentDimensionalVolumeShift( volumeShift ) + CompositionalDensityUpdate( arrayView1d< real64 const > const & volumeShift, + EquationOfStateType const equationOfState ) + : m_componentDimensionalVolumeShift( volumeShift ), + m_equationOfState( equationOfState ) {} template< integer USD1, integer USD2 > @@ -54,26 +57,30 @@ class CompositionalDensityUpdate final : public FunctionBaseUpdate arraySlice1d< real64, USD2 > const & dMassDensity, bool useMass ) const; +private: + template< integer USD > + GEOS_HOST_DEVICE + void computeCompressibilityFactor( integer const numComps, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + EquationOfStateType const equationOfState, + real64 & compressibilityFactor, + arraySlice1d< real64 > const & compressibilityFactorDerivs ) const; + private: arrayView1d< real64 const > m_componentDimensionalVolumeShift; + EquationOfStateType const m_equationOfState; }; -template< typename EOS_TYPE > class CompositionalDensity : public FunctionBase { public: CompositionalDensity( string const & name, ComponentProperties const & componentProperties, integer const phaseIndex, - ModelParameters const & modelParameters ) - : FunctionBase( name, componentProperties ) - { - GEOS_UNUSED_VAR( phaseIndex, modelParameters ); - // Calculate the dimensional volume shift - m_componentDimensionalVolumeShift.resize( componentProperties.getNumberOfComponents()); - EOS_TYPE::calculateDimensionalVolumeShift( componentProperties, - m_componentDimensionalVolumeShift ); - } + ModelParameters const & modelParameters ); static string catalogName() { return "CompositionalDensity"; } @@ -83,34 +90,39 @@ class CompositionalDensity : public FunctionBase } /// Type of kernel wrapper for in-kernel update - using KernelWrapper = CompositionalDensityUpdate< EOS_TYPE >; + using KernelWrapper = CompositionalDensityUpdate; /** * @brief Create an update kernel wrapper. * @return the wrapper */ - KernelWrapper createKernelWrapper() const - { - return KernelWrapper( m_componentDimensionalVolumeShift ); - } + KernelWrapper createKernelWrapper() const; + + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ); + +private: + static void calculateDimensionalVolumeShift( ComponentProperties const & componentProperties, + EquationOfStateType const & equationOfState, + arraySlice1d< real64 > componentDimensionalVolumeShift ); private: array1d< real64 > m_componentDimensionalVolumeShift; + EquationOfStateType m_equationOfState; }; -template< typename EOS_TYPE > template< integer USD1, integer USD2 > GEOS_HOST_DEVICE -void CompositionalDensityUpdate< EOS_TYPE >:: -compute( ComponentProperties::KernelWrapper const & componentProperties, - real64 const & pressure, - real64 const & temperature, - arraySlice1d< real64 const, USD1 > const & phaseComposition, - real64 & molarDensity, - arraySlice1d< real64, USD2 > const & dMolarDensity, - real64 & massDensity, - arraySlice1d< real64, USD2 > const & dMassDensity, - bool useMass ) const +void CompositionalDensityUpdate::compute( + ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 & molarDensity, + arraySlice1d< real64, USD2 > const & dMolarDensity, + real64 & massDensity, + arraySlice1d< real64, USD2 > const & dMassDensity, + bool useMass ) const { GEOS_UNUSED_VAR( useMass ); @@ -120,13 +132,14 @@ compute( ComponentProperties::KernelWrapper const & componentProperties, real64 compressibilityFactor = 0.0; stackArray1d< real64, 2+MultiFluidConstants::MAX_NUM_COMPONENTS > tempDerivs( numDofs ); - EOS_TYPE::computeCompressibilityFactor( numComps, - pressure, - temperature, - phaseComposition, - componentProperties, - compressibilityFactor, - tempDerivs.toSlice() ); + computeCompressibilityFactor( numComps, + pressure, + temperature, + phaseComposition, + componentProperties, + m_equationOfState, + compressibilityFactor, + tempDerivs.toSlice() ); CompositionalProperties::computeMolarDensity( numComps, pressure, @@ -147,6 +160,41 @@ compute( ComponentProperties::KernelWrapper const & componentProperties, dMassDensity ); } +template< integer USD > +GEOS_HOST_DEVICE +void CompositionalDensityUpdate::computeCompressibilityFactor( integer const numComps, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD > const & composition, + ComponentProperties::KernelWrapper const & componentProperties, + EquationOfStateType const equationOfState, + real64 & compressibilityFactor, + arraySlice1d< real64 > const & compressibilityFactorDerivs ) const +{ + if( equationOfState == EquationOfStateType::PengRobinson ) + { + CubicEOSPhaseModel< PengRobinsonEOS >:: + computeCompressibilityFactor( numComps, + pressure, + temperature, + composition, + componentProperties, + compressibilityFactor, + compressibilityFactorDerivs ); + } + else if( equationOfState == EquationOfStateType::SoaveRedlichKwong ) + { + CubicEOSPhaseModel< SoaveRedlichKwongEOS >:: + computeCompressibilityFactor( numComps, + pressure, + temperature, + composition, + componentProperties, + compressibilityFactor, + compressibilityFactorDerivs ); + } +} + } // end namespace compositional } // end namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp new file mode 100644 index 00000000000..567ca46592c --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp @@ -0,0 +1,105 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file EquationOfState.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_EQUATIONOFSTATE_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_EQUATIONOFSTATE_HPP_ + +#include "ModelParameters.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "dataRepository/InputFlags.hpp" +#include "codingUtilities/EnumStrings.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +enum class EquationOfStateType : integer +{ + PengRobinson, + SoaveRedlichKwong +}; + +ENUM_STRINGS( EquationOfStateType, + "pr", + "srk" ); + +class EquationOfState : public ModelParameters +{ +public: + EquationOfState( std::unique_ptr< ModelParameters > parameters ): + ModelParameters( std::move( parameters ) ) + {} + + ~EquationOfState() override = default; + + static std::unique_ptr< ModelParameters > create( std::unique_ptr< ModelParameters > parameters ) + { + if( parameters && parameters->get< EquationOfState >() != nullptr ) + { + return parameters; + } + return std::make_unique< EquationOfState >( std::move( parameters ) ); + } + + string_array m_equationsOfStateNames; + +protected: + void registerParametersImpl( MultiFluidBase * fluid ) override + { + fluid->registerWrapper( viewKeyStruct::equationsOfStateString(), &m_equationsOfStateNames ). + setInputFlag( dataRepository::InputFlags::REQUIRED ). + setDescription( "List of equation of state types for each phase. Valid options:\n* " + + EnumStrings< EquationOfStateType >::concat( "\n* " ) ); + } + + void postInputInitializationImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) override + { + GEOS_UNUSED_VAR( componentProperties ); + + integer const numPhase = fluid->numFluidPhases(); + + GEOS_THROW_IF_NE_MSG( m_equationsOfStateNames.size(), numPhase, + GEOS_FMT( "{}: invalid number of values in attribute '{}'", fluid->getFullName(), + viewKeyStruct::equationsOfStateString() ), + InputError ); + + // If any value is invalid conversion will throw + for( string const & eos : m_equationsOfStateNames ) + { + EnumStrings< EquationOfStateType >::fromString( eos ); + } + } + + struct viewKeyStruct + { + static constexpr char const * equationsOfStateString() { return "equationsOfState"; } + }; +}; + +} // end namespace compositional + +} // end namespace constitutive + +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_EQUATIONOFSTATE_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp index cdd591d100c..a3e4b1aa372 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp @@ -271,7 +271,7 @@ class LohrenzBrayClarkViscosity : public FunctionBase integer const phaseIndex, ModelParameters const & modelParameters ); - static string catalogName() { return "LBC"; } + static string catalogName() { return "LohrenzBrayClark"; } FunctionType functionType() const override { diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp index 6026dd4e213..ff189b2419a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp @@ -28,42 +28,47 @@ namespace compositional { // Naming conventions -template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > -string NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >::catalogName() +string NegativeTwoPhaseFlashModel::catalogName() { - return EOS_TYPE_LIQUID::catalogName(); + return "TwoPhase"; } -template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > -NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >:: -NegativeTwoPhaseFlashModel( string const & name, - ComponentProperties const & componentProperties, - ModelParameters const & modelParameters ): +NegativeTwoPhaseFlashModel::NegativeTwoPhaseFlashModel( string const & name, + ComponentProperties const & componentProperties, + ModelParameters const & modelParameters ): FunctionBase( name, componentProperties ) { - GEOS_UNUSED_VAR( modelParameters ); + m_parameters = modelParameters.get< EquationOfState >(); } -template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > -typename NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >::KernelWrapper -NegativeTwoPhaseFlashModel< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >::createKernelWrapper() const +NegativeTwoPhaseFlashModel::KernelWrapper +NegativeTwoPhaseFlashModel::createKernelWrapper() const { - return KernelWrapper( m_componentProperties.getNumberOfComponents(), 0, 1 ); + constexpr integer liquidIndex = 0; + constexpr integer vapourIndex = 1; + EquationOfStateType const liquidEos = EnumStrings< EquationOfStateType >::fromString( m_parameters->m_equationsOfStateNames[liquidIndex] ); + EquationOfStateType const vapourEos = EnumStrings< EquationOfStateType >::fromString( m_parameters->m_equationsOfStateNames[vapourIndex] ); + return KernelWrapper( m_componentProperties.getNumberOfComponents(), liquidIndex, vapourIndex, liquidEos, vapourEos ); } -template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > -NegativeTwoPhaseFlashModelUpdate< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >:: -NegativeTwoPhaseFlashModelUpdate( integer const numComponents, - integer const liquidIndex, - integer const vapourIndex ): +NegativeTwoPhaseFlashModelUpdate::NegativeTwoPhaseFlashModelUpdate( + integer const numComponents, + integer const liquidIndex, + integer const vapourIndex, + EquationOfStateType const liquidEos, + EquationOfStateType const vapourEos ): m_numComponents( numComponents ), m_liquidIndex( liquidIndex ), - m_vapourIndex( vapourIndex ) + m_vapourIndex( vapourIndex ), + m_liquidEos( liquidEos ), + m_vapourEos( vapourEos ) {} -// Explicit instantiation of the model template. -template class NegativeTwoPhaseFlashModel< CubicEOSPhaseModel< PengRobinsonEOS >, CubicEOSPhaseModel< PengRobinsonEOS > >; -template class NegativeTwoPhaseFlashModel< CubicEOSPhaseModel< SoaveRedlichKwongEOS >, CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; +std::unique_ptr< ModelParameters > +NegativeTwoPhaseFlashModel::createParameters( std::unique_ptr< ModelParameters > parameters ) +{ + return EquationOfState::create( std::move( parameters ) ); +} } // end namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp index 1682af63be4..b42dcf136c8 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -20,10 +20,10 @@ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_NEGATIVETWOPHASEFLASHMODEL_HPP_ #include "FunctionBase.hpp" +#include "EquationOfState.hpp" #include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" -#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" #include "constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp" namespace geos @@ -35,7 +35,8 @@ namespace constitutive namespace compositional { -template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > +class EquationOfState; + class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate { public: @@ -45,7 +46,9 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate NegativeTwoPhaseFlashModelUpdate( integer const numComponents, integer const liquidIndex, - integer const vapourIndex ); + integer const vapourIndex, + EquationOfStateType const liquidEos, + EquationOfStateType const vapourEos ); // Mark as a 2-phase flash GEOS_HOST_DEVICE @@ -64,33 +67,35 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate integer const numDofs = 2 + m_numComponents; // Iterative solve to converge flash - bool const flashStatus = NegativeTwoPhaseFlash::compute< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >( - m_numComponents, - pressure, - temperature, - compFraction, - componentProperties, - kValues, - phaseFraction.value[m_vapourIndex], - phaseCompFraction.value[m_liquidIndex], - phaseCompFraction.value[m_vapourIndex] ); + bool const flashStatus = NegativeTwoPhaseFlash::compute( m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + m_liquidEos, + m_vapourEos, + kValues, + phaseFraction.value[m_vapourIndex], + phaseCompFraction.value[m_liquidIndex], + phaseCompFraction.value[m_vapourIndex] ); GEOS_ERROR_IF( !flashStatus, GEOS_FMT( "Negative two phase flash failed to converge at pressure {:.5e} and temperature {:.3f}", pressure, temperature )); // Calculate derivatives - NegativeTwoPhaseFlash::computeDerivatives< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >( - m_numComponents, - pressure, - temperature, - compFraction, - componentProperties, - phaseFraction.value[m_vapourIndex], - phaseCompFraction.value[m_liquidIndex].toSliceConst(), - phaseCompFraction.value[m_vapourIndex].toSliceConst(), - phaseFraction.derivs[m_vapourIndex], - phaseCompFraction.derivs[m_liquidIndex], - phaseCompFraction.derivs[m_vapourIndex] ); + NegativeTwoPhaseFlash::computeDerivatives( m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + m_liquidEos, + m_vapourEos, + phaseFraction.value[m_vapourIndex], + phaseCompFraction.value[m_liquidIndex].toSliceConst(), + phaseCompFraction.value[m_vapourIndex].toSliceConst(), + phaseFraction.derivs[m_vapourIndex], + phaseCompFraction.derivs[m_liquidIndex], + phaseCompFraction.derivs[m_vapourIndex] ); // Complete by calculating liquid phase fraction phaseFraction.value[m_liquidIndex] = 1.0 - phaseFraction.value[m_vapourIndex]; @@ -102,11 +107,12 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate private: integer const m_numComponents; - integer const m_liquidIndex{0}; - integer const m_vapourIndex{1}; + integer const m_liquidIndex; + integer const m_vapourIndex; + EquationOfStateType const m_liquidEos; + EquationOfStateType const m_vapourEos; }; -template< typename EOS_TYPE_LIQUID, typename EOS_TYPE_VAPOUR > class NegativeTwoPhaseFlashModel : public FunctionBase { public: @@ -122,21 +128,20 @@ class NegativeTwoPhaseFlashModel : public FunctionBase } /// Type of kernel wrapper for in-kernel update - using KernelWrapper = NegativeTwoPhaseFlashModelUpdate< EOS_TYPE_LIQUID, EOS_TYPE_VAPOUR >; + using KernelWrapper = NegativeTwoPhaseFlashModelUpdate; /** * @brief Create an update kernel wrapper. * @return the wrapper */ KernelWrapper createKernelWrapper() const; -}; -using NegativeTwoPhaseFlashPRPR = NegativeTwoPhaseFlashModel< - CubicEOSPhaseModel< PengRobinsonEOS >, - CubicEOSPhaseModel< PengRobinsonEOS > >; -using NegativeTwoPhaseFlashSRKSRK = NegativeTwoPhaseFlashModel< - CubicEOSPhaseModel< SoaveRedlichKwongEOS >, - CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ); + +private: + EquationOfState const * m_parameters{}; +}; } // end namespace compositional diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp index 2a77b2c1c99..6fae07ef3bb 100644 --- a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp +++ b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp @@ -14,7 +14,6 @@ // Source includes #include "codingUtilities/UnitTestUtilities.hpp" -#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" #include "constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp" #include "TestFluid.hpp" #include "TestFluidUtilities.hpp" @@ -53,7 +52,7 @@ struct FluidData< 9 > } }; -template< int NC, typename EOS_TYPE > +template< int NC, EquationOfStateType EOS_TYPE > class CompositionalDensityTestFixture : public ::testing::TestWithParam< DensityData< NC > > { static constexpr real64 relTol = 1.0e-5; @@ -66,8 +65,13 @@ class CompositionalDensityTestFixture : public ::testing::TestWithParam< Densit : m_fluid( FluidData< NC >::createFluid() ) { ComponentProperties const & componentProperties = this->m_fluid->getComponentProperties(); - m_parameters = CompositionalDensity< EOS_TYPE >::createParameters( std::make_unique< ModelParameters >() ); - m_density = std::make_unique< CompositionalDensity< EOS_TYPE > >( "PhaseDensity", componentProperties, 0, *m_parameters ); + m_parameters = CompositionalDensity::createParameters( std::make_unique< ModelParameters >() ); + + auto equationOfState = const_cast< EquationOfState * >(m_parameters->get< EquationOfState >()); + string const eosName = EnumStrings< EquationOfStateType >::toString( EOS_TYPE ); + equationOfState->m_equationsOfStateNames.emplace_back( eosName ); + + m_density = std::make_unique< CompositionalDensity >( "PhaseDensity", componentProperties, 0, *m_parameters ); } ~CompositionalDensityTestFixture() = default; @@ -198,27 +202,28 @@ class CompositionalDensityTestFixture : public ::testing::TestWithParam< Densit } protected: - std::unique_ptr< CompositionalDensity< EOS_TYPE > > m_density{}; + std::unique_ptr< CompositionalDensity > m_density{}; std::unique_ptr< TestFluid< NC > > m_fluid{}; std::unique_ptr< ModelParameters > m_parameters{}; }; -using CompositionalDensity9CompPR = CompositionalDensityTestFixture< 9, CubicEOSPhaseModel< PengRobinsonEOS > >; -using CompositionalDensity9CompSRK = CompositionalDensityTestFixture< 9, CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; +using PengRobinson = CompositionalDensityTestFixture< 9, EquationOfStateType::PengRobinson >; +using SoaveRedlichKwong = CompositionalDensityTestFixture< 9, EquationOfStateType::SoaveRedlichKwong >; -TEST_P( CompositionalDensity9CompPR, testDensityDerivatives ) +TEST_P( PengRobinson, testDensityDerivatives ) { testDensityDerivatives( GetParam() ); } -TEST_P( CompositionalDensity9CompSRK, testDensityDerivatives ) +TEST_P( SoaveRedlichKwong, testDensityDerivatives ) { testDensityDerivatives( GetParam() ); } +/* UNCRUSTIFY-OFF */ + INSTANTIATE_TEST_SUITE_P( - CompositionalDensityTest, - CompositionalDensity9CompPR, + CompositionalDensityTest, PengRobinson, ::testing::ValuesIn( { DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 8.355571e+03, 4.559906e+02 }, DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 7.703898e+02, 2.691914e+01 }, @@ -235,8 +240,7 @@ INSTANTIATE_TEST_SUITE_P( } ) ); INSTANTIATE_TEST_SUITE_P( - CompositionalDensityTest, - CompositionalDensity9CompSRK, + CompositionalDensityTest, SoaveRedlichKwong, ::testing::ValuesIn( { DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 7.433979e+03, 4.056963e+02 }, DensityData< 9 >{1.839590e+06, 2.971500e+02, {0.008260, 0.005440, 0.770320, 0.104560, 0.061770, 0.024590, 0.008840, 0.004720, 0.011490}, 7.629968e+02, 2.666082e+01 }, @@ -253,6 +257,8 @@ INSTANTIATE_TEST_SUITE_P( } ) ); +/* UNCRUSTIFY-ON */ + } // testing } // geos diff --git a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp index e90725c0274..3d878664e63 100644 --- a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp @@ -67,11 +67,19 @@ class LohrenzBrayClarkViscosityTestFixture : public ::testing::TestWithParam< V : m_fluid( FluidData< NC >::createFluid() ) { ComponentProperties const & componentProperties = this->m_fluid->getComponentProperties(); - m_parameters = LohrenzBrayClarkViscosity::createParameters( nullptr ); + + m_parameters = CompositionalDensity::createParameters( std::make_unique< ModelParameters >() ); + m_parameters = LohrenzBrayClarkViscosity::createParameters( std::move( m_parameters ) ); + auto * parameters = const_cast< LohrenzBrayClarkViscosity::Parameters * >(m_parameters->get< LohrenzBrayClarkViscosity::Parameters >()); parameters->m_componentCriticalVolume.resize( NC ); TestFluid< 9 >::populateArray( parameters->m_componentCriticalVolume, this->m_fluid->criticalVolume ); - m_density = std::make_unique< CompositionalDensity< CubicEOSPhaseModel< PengRobinsonEOS > > >( "PhaseDensity", componentProperties, 0, *m_parameters ); + + auto * equationOfState = const_cast< EquationOfState * >(m_parameters->get< EquationOfState >()); + string const eosName = EnumStrings< EquationOfStateType >::toString( EquationOfStateType::PengRobinson ); + equationOfState->m_equationsOfStateNames.emplace_back( eosName ); + + m_density = std::make_unique< CompositionalDensity >( "PhaseDensity", componentProperties, 0, *m_parameters ); m_viscosity = std::make_unique< LohrenzBrayClarkViscosity >( "PhaseViscosity", componentProperties, 0, *m_parameters ); } @@ -214,7 +222,7 @@ class LohrenzBrayClarkViscosityTestFixture : public ::testing::TestWithParam< V protected: std::unique_ptr< TestFluid< NC > > m_fluid{}; - std::unique_ptr< CompositionalDensity< CubicEOSPhaseModel< PengRobinsonEOS > > > m_density{}; + std::unique_ptr< CompositionalDensity > m_density{}; std::unique_ptr< LohrenzBrayClarkViscosity > m_viscosity{}; std::unique_ptr< ModelParameters > m_parameters{}; }; @@ -232,7 +240,7 @@ TEST_P( LohrenzBrayClarkViscosity9, testViscosityDerivatives ) } //------------------------------------------------------------------------------- -// Data generated by PVTPackage +// Data //------------------------------------------------------------------------------- INSTANTIATE_TEST_SUITE_P( LohrenzBrayClarkViscosity, diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp index 6dfc1929eb1..1d99f30cafa 100644 --- a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp @@ -59,7 +59,7 @@ using FlashData = std::tuple< Feed< NC > const // expected vapour composition >; -template< int NC, typename EOS_TYPE > +template< int NC, EquationOfStateType EOS_TYPE > class NegativeTwoPhaseFlashTestFixture : public ::testing::TestWithParam< FlashData< NC > > { static constexpr real64 relTol = 1.0e-5; @@ -97,12 +97,14 @@ class NegativeTwoPhaseFlashTestFixture : public ::testing::TestWithParam< Flash stackArray2d< real64, numComps > kValues( 1, numComps ); kValues.zero(); - bool status = NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + bool status = NegativeTwoPhaseFlash::compute( numComps, pressure, temperature, composition.toSliceConst(), componentProperties, + EOS_TYPE, + EOS_TYPE, kValues.toSlice(), vapourFraction, liquidComposition.toSlice(), @@ -180,12 +182,14 @@ class NegativeTwoPhaseFlashTestFixture : public ::testing::TestWithParam< Flash stackArray1d< real64, numComps > displacedVapourComposition( numComps ); kValues.zero(); - NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + NegativeTwoPhaseFlash::compute( numComps, p, t, zmf.toSliceConst(), componentProperties, + EOS_TYPE, + EOS_TYPE, kValues.toSlice(), values[0], displacedLiquidComposition.toSlice(), @@ -197,23 +201,27 @@ class NegativeTwoPhaseFlashTestFixture : public ::testing::TestWithParam< Flash } }; - NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + NegativeTwoPhaseFlash::compute( numComps, pressure, temperature, composition.toSliceConst(), componentProperties, + EOS_TYPE, + EOS_TYPE, kValues.toSlice(), vapourFraction, liquidComposition.toSlice(), vapourComposition.toSlice() ); - NegativeTwoPhaseFlash::computeDerivatives< EOS_TYPE, EOS_TYPE >( + NegativeTwoPhaseFlash::computeDerivatives( numComps, pressure, temperature, composition.toSliceConst(), componentProperties, + EOS_TYPE, + EOS_TYPE, vapourFraction, liquidComposition.toSliceConst(), vapourComposition.toSliceConst(), @@ -262,10 +270,10 @@ class NegativeTwoPhaseFlashTestFixture : public ::testing::TestWithParam< Flash std::unique_ptr< TestFluid< NC > > m_fluid{}; }; -using NegativeTwoPhaseFlash2CompPR = NegativeTwoPhaseFlashTestFixture< 2, CubicEOSPhaseModel< PengRobinsonEOS > >; -using NegativeTwoPhaseFlash2CompSRK = NegativeTwoPhaseFlashTestFixture< 2, CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; -using NegativeTwoPhaseFlash4CompPR = NegativeTwoPhaseFlashTestFixture< 4, CubicEOSPhaseModel< PengRobinsonEOS > >; -using NegativeTwoPhaseFlash4CompSRK = NegativeTwoPhaseFlashTestFixture< 4, CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; +using NegativeTwoPhaseFlash2CompPR = NegativeTwoPhaseFlashTestFixture< 2, EquationOfStateType::PengRobinson >; +using NegativeTwoPhaseFlash2CompSRK = NegativeTwoPhaseFlashTestFixture< 2, EquationOfStateType::SoaveRedlichKwong >; +using NegativeTwoPhaseFlash4CompPR = NegativeTwoPhaseFlashTestFixture< 4, EquationOfStateType::PengRobinson >; +using NegativeTwoPhaseFlash4CompSRK = NegativeTwoPhaseFlashTestFixture< 4, EquationOfStateType::SoaveRedlichKwong >; TEST_P( NegativeTwoPhaseFlash2CompPR, testNegativeFlash ) { diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp index 9e214b56e5b..5f70782df7f 100644 --- a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp @@ -38,7 +38,7 @@ using FlashData = std::tuple< Feed< 2 > const // expected vapour composition (2 selected components) >; -template< typename EOS_TYPE > +template< EquationOfStateType EOS_TYPE > class NegativeTwoPhaseFlashTest9CompFixture : public ::testing::TestWithParam< FlashData > { static constexpr real64 relTol = 1.0e-5; @@ -78,12 +78,14 @@ class NegativeTwoPhaseFlashTest9CompFixture : public ::testing::TestWithParam< stackArray2d< real64, numComps > kValues( 1, numComps ); kValues.zero(); - bool status = NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + bool status = NegativeTwoPhaseFlash::compute( numComps, pressure, temperature, composition.toSliceConst(), componentProperties, + EOS_TYPE, + EOS_TYPE, kValues.toSlice(), vapourFraction, liquidComposition.toSlice(), @@ -155,12 +157,14 @@ class NegativeTwoPhaseFlashTest9CompFixture : public ::testing::TestWithParam< stackArray1d< real64, numComps > displacedLiquidComposition( numComps ); stackArray1d< real64, numComps > displacedVapourComposition( numComps ); - NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + NegativeTwoPhaseFlash::compute( numComps, p, t, zmf.toSliceConst(), componentProperties, + EOS_TYPE, + EOS_TYPE, kValues.toSlice(), values[0], displacedLiquidComposition.toSlice(), @@ -172,23 +176,27 @@ class NegativeTwoPhaseFlashTest9CompFixture : public ::testing::TestWithParam< } }; - NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + NegativeTwoPhaseFlash::compute( numComps, pressure, temperature, composition.toSliceConst(), componentProperties, + EOS_TYPE, + EOS_TYPE, kValues.toSlice(), vapourFraction, liquidComposition.toSlice(), vapourComposition.toSlice() ); - NegativeTwoPhaseFlash::computeDerivatives< EOS_TYPE, EOS_TYPE >( + NegativeTwoPhaseFlash::computeDerivatives( numComps, pressure, temperature, composition.toSliceConst(), componentProperties, + EOS_TYPE, + EOS_TYPE, vapourFraction, liquidComposition.toSliceConst(), vapourComposition.toSliceConst(), @@ -239,7 +247,7 @@ class NegativeTwoPhaseFlashTest9CompFixture : public ::testing::TestWithParam< static std::unique_ptr< TestFluid< numComps > > createFluid(); }; -template< typename EOS_TYPE > +template< EquationOfStateType EOS_TYPE > std::unique_ptr< TestFluid< numComps > > NegativeTwoPhaseFlashTest9CompFixture< EOS_TYPE >::createFluid() { std::unique_ptr< TestFluid< numComps > > fluid = TestFluid< numComps >::create( {0, 0, 0, 0, 0, 0, 0, 0, 0} ); @@ -263,25 +271,25 @@ std::unique_ptr< TestFluid< numComps > > NegativeTwoPhaseFlashTest9CompFixture< return fluid; } -using NegativeTwoPhaseFlash9CompPR = NegativeTwoPhaseFlashTest9CompFixture< CubicEOSPhaseModel< PengRobinsonEOS > >; -using NegativeTwoPhaseFlash9CompSRK = NegativeTwoPhaseFlashTest9CompFixture< CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; +using PengRobinson = NegativeTwoPhaseFlashTest9CompFixture< EquationOfStateType::PengRobinson >; +using SoaveRedlichKwong = NegativeTwoPhaseFlashTest9CompFixture< EquationOfStateType::SoaveRedlichKwong >; -TEST_P( NegativeTwoPhaseFlash9CompPR, testNegativeFlash ) +TEST_P( PengRobinson, testNegativeFlash ) { testFlash( GetParam() ); } -TEST_P( NegativeTwoPhaseFlash9CompPR, testNegativeFlashDerivatives ) +TEST_P( PengRobinson, testNegativeFlashDerivatives ) { testFlashDerivatives( GetParam() ); } -TEST_P( NegativeTwoPhaseFlash9CompSRK, testNegativeFlash ) +TEST_P( SoaveRedlichKwong, testNegativeFlash ) { testFlash( GetParam() ); } -TEST_P( NegativeTwoPhaseFlash9CompSRK, testNegativeFlashDerivatives ) +TEST_P( SoaveRedlichKwong, testNegativeFlashDerivatives ) { testFlashDerivatives( GetParam() ); } @@ -293,8 +301,7 @@ TEST_P( NegativeTwoPhaseFlash9CompSRK, testNegativeFlashDerivatives ) /* UNCRUSTIFY-OFF */ INSTANTIATE_TEST_SUITE_P( - NegativeTwoPhaseFlash, - NegativeTwoPhaseFlash9CompPR, + NegativeTwoPhaseFlash, PengRobinson, ::testing::Values( FlashData( 1.000000e+05, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000000, {0.000363, 0.839010}, {0.000363, 0.839010} ), FlashData( 1.000000e+05, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.798353, {0.000363, 0.839010}, {0.011181, 0.000020} ), @@ -422,8 +429,7 @@ INSTANTIATE_TEST_SUITE_P( ); INSTANTIATE_TEST_SUITE_P( - NegativeTwoPhaseFlash, - NegativeTwoPhaseFlash9CompSRK, + NegativeTwoPhaseFlash, SoaveRedlichKwong, ::testing::Values( FlashData( 1.000000e+05, 2.781500e+02, {0.000363, 0.000007, 0.003471, 0.006007, 0.018423, 0.034034, 0.042565, 0.056120, 0.839010}, 1, 0.000197, {0.000361, 0.839175}, {0.010852, 0.000016} ), FlashData( 1.000000e+05, 2.781500e+02, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 1, 0.798097, {0.000372, 0.837963}, {0.011183, 0.000016} ), diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp index ca3ceef354d..df5e3d9abeb 100644 --- a/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp @@ -38,7 +38,7 @@ using StabilityData = std::tuple< real64 const // expected tangent plane distance >; -template< typename EOS_TYPE > +template< EquationOfStateType EOS_TYPE > class StabilityTestTest2CompFixture : public ::testing::TestWithParam< StabilityData > { static constexpr real64 relTol = 1.0e-5; @@ -67,13 +67,14 @@ class StabilityTestTest2CompFixture : public ::testing::TestWithParam< Stabilit real64 tangentPlaneDistance = LvArray::NumericLimits< real64 >::max; stackArray1d< real64, numComps > kValues( numComps ); - bool const stabilityStatus = StabilityTest::compute< EOS_TYPE >( numComps, - pressure, - temperature, - composition.toSliceConst(), - componentProperties, - tangentPlaneDistance, - kValues.toSlice() ); + bool const stabilityStatus = StabilityTest::compute( numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + EOS_TYPE, + tangentPlaneDistance, + kValues.toSlice() ); // Expect this to succeed ASSERT_EQ( stabilityStatus, true ); @@ -94,8 +95,8 @@ class StabilityTestTest2CompFixture : public ::testing::TestWithParam< Stabilit } }; -using PengRobinson = StabilityTestTest2CompFixture< CubicEOSPhaseModel< PengRobinsonEOS > >; -using SoaveRedlichKwong = StabilityTestTest2CompFixture< CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; +using PengRobinson = StabilityTestTest2CompFixture< EquationOfStateType::PengRobinson >; +using SoaveRedlichKwong = StabilityTestTest2CompFixture< EquationOfStateType::SoaveRedlichKwong >; TEST_P( PengRobinson, testStabilityTest ) { testStability( GetParam() ); diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp index 43a0a7f39f5..6ccca148aa5 100644 --- a/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp @@ -17,7 +17,6 @@ #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" #include "constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp" #include "constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp" -#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" #include "TestFluid.hpp" #include "TestFluidUtilities.hpp" @@ -38,7 +37,7 @@ using FlashData = std::tuple< real64 const // expected tangent plane distance >; -template< typename EOS_TYPE > +template< EquationOfStateType EOS_TYPE > class StabilityTestTest9CompFixture : public ::testing::TestWithParam< FlashData > { static constexpr real64 relTol = 1.0e-5; @@ -65,13 +64,14 @@ class StabilityTestTest9CompFixture : public ::testing::TestWithParam< FlashDat real64 tangentPlaneDistance = LvArray::NumericLimits< real64 >::max; stackArray1d< real64, numComps > kValues( numComps ); - bool const stabilityStatus = StabilityTest::compute< EOS_TYPE >( numComps, - pressure, - temperature, - composition.toSliceConst(), - componentProperties, - tangentPlaneDistance, - kValues.toSlice() ); + bool const stabilityStatus = StabilityTest::compute( numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + EOS_TYPE, + tangentPlaneDistance, + kValues.toSlice() ); // Expect this to succeed ASSERT_EQ( stabilityStatus, true ); @@ -92,25 +92,28 @@ class StabilityTestTest9CompFixture : public ::testing::TestWithParam< FlashDat real64 tangentPlaneDistance = LvArray::NumericLimits< real64 >::max; stackArray2d< real64, numComps > kValues( 1, numComps ); - StabilityTest::compute< EOS_TYPE >( numComps, - pressure, - temperature, - composition.toSliceConst(), - componentProperties, - tangentPlaneDistance, - kValues[0] ); + StabilityTest::compute( numComps, + pressure, + temperature, + composition.toSliceConst(), + componentProperties, + EOS_TYPE, + tangentPlaneDistance, + kValues[0] ); // Now perform the nagative flash real64 vapourFraction = -1.0; stackArray1d< real64, numComps > liquidComposition( numComps ); stackArray1d< real64, numComps > vapourComposition( numComps ); - bool const status = NegativeTwoPhaseFlash::compute< EOS_TYPE, EOS_TYPE >( + bool const status = NegativeTwoPhaseFlash::compute( numComps, pressure, temperature, composition.toSliceConst(), componentProperties, + EOS_TYPE, + EOS_TYPE, kValues.toSlice(), vapourFraction, liquidComposition.toSlice(), @@ -143,7 +146,7 @@ class StabilityTestTest9CompFixture : public ::testing::TestWithParam< FlashDat static std::unique_ptr< TestFluid< numComps > > createFluid(); }; -template< typename EOS_TYPE > +template< EquationOfStateType EOS_TYPE > std::unique_ptr< TestFluid< numComps > > StabilityTestTest9CompFixture< EOS_TYPE >::createFluid() { std::unique_ptr< TestFluid< numComps > > fluid = TestFluid< numComps >::create( {0, 0, 0, 0, 0, 0, 0, 0, 0} ); @@ -167,8 +170,8 @@ std::unique_ptr< TestFluid< numComps > > StabilityTestTest9CompFixture< EOS_TYPE return fluid; } -using PengRobinson = StabilityTestTest9CompFixture< CubicEOSPhaseModel< PengRobinsonEOS > >; -using SoaveRedlichKwong = StabilityTestTest9CompFixture< CubicEOSPhaseModel< SoaveRedlichKwongEOS > >; +using PengRobinson = StabilityTestTest9CompFixture< EquationOfStateType::PengRobinson >; +using SoaveRedlichKwong = StabilityTestTest9CompFixture< EquationOfStateType::SoaveRedlichKwong >; TEST_P( PengRobinson, testStabilityTest ) { testStability( GetParam() ); diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst similarity index 83% rename from src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst rename to src/coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst index daeebbf1cce..e521b87e413 100644 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson.rst +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst @@ -12,6 +12,9 @@ componentMolarWeight real64_array required Component molar weights componentNames string_array required List of component names componentVolumeShift real64_array {0} Component volume shifts constantPhaseViscosity real64_array {0} Constant phase viscosity +equationsOfState string_array required | List of equation of state types for each phase. Valid options: + | * pr + | * srk name groupName required A name is required for any non-unique nodes phaseNames groupNameRef_array required List of fluid phases ============================ ================== ======== ============================================================================================================ diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark.rst similarity index 86% rename from src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst rename to src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark.rst index 91834dab00d..7e0e2716d63 100644 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC.rst +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark.rst @@ -12,6 +12,9 @@ componentCriticalVolume real64_array {0} Component critic componentMolarWeight real64_array required Component molar weights componentNames string_array required List of component names componentVolumeShift real64_array {0} Component volume shifts +equationsOfState string_array required | List of equation of state types for each phase. Valid options: + | * pr + | * srk name groupName required A name is required for any non-unique nodes phaseNames groupNameRef_array required List of fluid phases viscosityMixingRule string HerningZipperer | Viscosity mixing rule to be used for Lohrenz-Bray-Clark computation. Valid options: diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark_other.rst similarity index 100% rename from src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinsonLBC_other.rst rename to src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark_other.rst diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst deleted file mode 100644 index daeebbf1cce..00000000000 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -============================ ================== ======== ============================================================================================================ -Name Type Default Description -============================ ================== ======== ============================================================================================================ -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentAcentricFactor real64_array required Component acentric factors -componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients -componentCriticalPressure real64_array required Component critical pressures -componentCriticalTemperature real64_array required Component critical temperatures -componentMolarWeight real64_array required Component molar weights -componentNames string_array required List of component names -componentVolumeShift real64_array {0} Component volume shifts -constantPhaseViscosity real64_array {0} Constant phase viscosity -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -============================ ================== ======== ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst deleted file mode 100644 index 91834dab00d..00000000000 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC.rst +++ /dev/null @@ -1,23 +0,0 @@ - - -============================ ================== =============== ========================================================================================================================= -Name Type Default Description -============================ ================== =============== ========================================================================================================================= -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentAcentricFactor real64_array required Component acentric factors -componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients -componentCriticalPressure real64_array required Component critical pressures -componentCriticalTemperature real64_array required Component critical temperatures -componentCriticalVolume real64_array {0} Component critical volumes -componentMolarWeight real64_array required Component molar weights -componentNames string_array required List of component names -componentVolumeShift real64_array {0} Component volume shifts -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -viscosityMixingRule string HerningZipperer | Viscosity mixing rule to be used for Lohrenz-Bray-Clark computation. Valid options: - | * HerningZipperer - | * Wilke - | * Brokaw -============================ ================== =============== ========================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst deleted file mode 100644 index c8f51e2b3c9..00000000000 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwongLBC_other.rst +++ /dev/null @@ -1,31 +0,0 @@ - - -===================== ========================================================================================= ============================================================================================================ -Name Type Description -===================== ========================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -kValues real64_array4d Phase equilibrium ratios -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ========================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst deleted file mode 100644 index c8f51e2b3c9..00000000000 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidSoaveRedlichKwong_other.rst +++ /dev/null @@ -1,31 +0,0 @@ - - -===================== ========================================================================================= ============================================================================================================ -Name Type Description -===================== ========================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -kValues real64_array4d Phase equilibrium ratios -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ========================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid_other.rst similarity index 100% rename from src/coreComponents/schema/docs/CompositionalTwoPhaseFluidPengRobinson_other.rst rename to src/coreComponents/schema/docs/CompositionalTwoPhaseFluid_other.rst diff --git a/src/coreComponents/schema/docs/Constitutive.rst b/src/coreComponents/schema/docs/Constitutive.rst index d094325ded1..09b1aadeaff 100644 --- a/src/coreComponents/schema/docs/Constitutive.rst +++ b/src/coreComponents/schema/docs/Constitutive.rst @@ -1,93 +1,91 @@ -============================================== ==== ======= ========================================================= -Name Type Default Description -============================================== ==== ======= ========================================================= -BiotPorosity node :ref:`XML_BiotPorosity` -BlackOilFluid node :ref:`XML_BlackOilFluid` -BrooksCoreyBakerRelativePermeability node :ref:`XML_BrooksCoreyBakerRelativePermeability` -BrooksCoreyCapillaryPressure node :ref:`XML_BrooksCoreyCapillaryPressure` -BrooksCoreyRelativePermeability node :ref:`XML_BrooksCoreyRelativePermeability` -BrooksCoreyStone2RelativePermeability node :ref:`XML_BrooksCoreyStone2RelativePermeability` -CO2BrineEzrokhiFluid node :ref:`XML_CO2BrineEzrokhiFluid` -CO2BrineEzrokhiThermalFluid node :ref:`XML_CO2BrineEzrokhiThermalFluid` -CO2BrinePhillipsFluid node :ref:`XML_CO2BrinePhillipsFluid` -CO2BrinePhillipsThermalFluid node :ref:`XML_CO2BrinePhillipsThermalFluid` -CarmanKozenyPermeability node :ref:`XML_CarmanKozenyPermeability` -CeramicDamage node :ref:`XML_CeramicDamage` -CompositionalMultiphaseFluid node :ref:`XML_CompositionalMultiphaseFluid` -CompositionalTwoPhaseFluidPengRobinson node :ref:`XML_CompositionalTwoPhaseFluidPengRobinson` -CompositionalTwoPhaseFluidPengRobinsonLBC node :ref:`XML_CompositionalTwoPhaseFluidPengRobinsonLBC` -CompositionalTwoPhaseFluidSoaveRedlichKwong node :ref:`XML_CompositionalTwoPhaseFluidSoaveRedlichKwong` -CompositionalTwoPhaseFluidSoaveRedlichKwongLBC node :ref:`XML_CompositionalTwoPhaseFluidSoaveRedlichKwongLBC` -CompressibleSinglePhaseFluid node :ref:`XML_CompressibleSinglePhaseFluid` -CompressibleSolidCarmanKozenyPermeability node :ref:`XML_CompressibleSolidCarmanKozenyPermeability` -CompressibleSolidConstantPermeability node :ref:`XML_CompressibleSolidConstantPermeability` -CompressibleSolidExponentialDecayPermeability node :ref:`XML_CompressibleSolidExponentialDecayPermeability` -CompressibleSolidParallelPlatesPermeability node :ref:`XML_CompressibleSolidParallelPlatesPermeability` -CompressibleSolidPressurePermeability node :ref:`XML_CompressibleSolidPressurePermeability` -CompressibleSolidSlipDependentPermeability node :ref:`XML_CompressibleSolidSlipDependentPermeability` -CompressibleSolidWillisRichardsPermeability node :ref:`XML_CompressibleSolidWillisRichardsPermeability` -ConstantDiffusion node :ref:`XML_ConstantDiffusion` -ConstantPermeability node :ref:`XML_ConstantPermeability` -Coulomb node :ref:`XML_Coulomb` -DamageElasticIsotropic node :ref:`XML_DamageElasticIsotropic` -DamageSpectralElasticIsotropic node :ref:`XML_DamageSpectralElasticIsotropic` -DamageVolDevElasticIsotropic node :ref:`XML_DamageVolDevElasticIsotropic` -DeadOilFluid node :ref:`XML_DeadOilFluid` -DelftEgg node :ref:`XML_DelftEgg` -DruckerPrager node :ref:`XML_DruckerPrager` -ElasticIsotropic node :ref:`XML_ElasticIsotropic` -ElasticIsotropicPressureDependent node :ref:`XML_ElasticIsotropicPressureDependent` -ElasticOrthotropic node :ref:`XML_ElasticOrthotropic` -ElasticTransverseIsotropic node :ref:`XML_ElasticTransverseIsotropic` -ExponentialDecayPermeability node :ref:`XML_ExponentialDecayPermeability` -ExtendedDruckerPrager node :ref:`XML_ExtendedDruckerPrager` -FrictionlessContact node :ref:`XML_FrictionlessContact` -JFunctionCapillaryPressure node :ref:`XML_JFunctionCapillaryPressure` -LinearIsotropicDispersion node :ref:`XML_LinearIsotropicDispersion` -ModifiedCamClay node :ref:`XML_ModifiedCamClay` -MultiPhaseConstantThermalConductivity node :ref:`XML_MultiPhaseConstantThermalConductivity` -MultiPhaseVolumeWeightedThermalConductivity node :ref:`XML_MultiPhaseVolumeWeightedThermalConductivity` -NullModel node :ref:`XML_NullModel` -ParallelPlatesPermeability node :ref:`XML_ParallelPlatesPermeability` -ParticleFluid node :ref:`XML_ParticleFluid` -PerfectlyPlastic node :ref:`XML_PerfectlyPlastic` -PorousDamageElasticIsotropic node :ref:`XML_PorousDamageElasticIsotropic` -PorousDamageSpectralElasticIsotropic node :ref:`XML_PorousDamageSpectralElasticIsotropic` -PorousDamageVolDevElasticIsotropic node :ref:`XML_PorousDamageVolDevElasticIsotropic` -PorousDelftEgg node :ref:`XML_PorousDelftEgg` -PorousDruckerPrager node :ref:`XML_PorousDruckerPrager` -PorousElasticIsotropic node :ref:`XML_PorousElasticIsotropic` -PorousElasticOrthotropic node :ref:`XML_PorousElasticOrthotropic` -PorousElasticTransverseIsotropic node :ref:`XML_PorousElasticTransverseIsotropic` -PorousExtendedDruckerPrager node :ref:`XML_PorousExtendedDruckerPrager` -PorousModifiedCamClay node :ref:`XML_PorousModifiedCamClay` -PorousViscoDruckerPrager node :ref:`XML_PorousViscoDruckerPrager` -PorousViscoExtendedDruckerPrager node :ref:`XML_PorousViscoExtendedDruckerPrager` -PorousViscoModifiedCamClay node :ref:`XML_PorousViscoModifiedCamClay` -PressurePermeability node :ref:`XML_PressurePermeability` -PressurePorosity node :ref:`XML_PressurePorosity` -ProppantPermeability node :ref:`XML_ProppantPermeability` -ProppantPorosity node :ref:`XML_ProppantPorosity` -ProppantSlurryFluid node :ref:`XML_ProppantSlurryFluid` -ProppantSolidProppantPermeability node :ref:`XML_ProppantSolidProppantPermeability` -ReactiveBrine node :ref:`XML_ReactiveBrine` -ReactiveBrineThermal node :ref:`XML_ReactiveBrineThermal` -SinglePhaseConstantThermalConductivity node :ref:`XML_SinglePhaseConstantThermalConductivity` -SlipDependentPermeability node :ref:`XML_SlipDependentPermeability` -SolidInternalEnergy node :ref:`XML_SolidInternalEnergy` -TableCapillaryPressure node :ref:`XML_TableCapillaryPressure` -TableRelativePermeability node :ref:`XML_TableRelativePermeability` -TableRelativePermeabilityHysteresis node :ref:`XML_TableRelativePermeabilityHysteresis` -ThermalCompressibleSinglePhaseFluid node :ref:`XML_ThermalCompressibleSinglePhaseFluid` -VanGenuchtenBakerRelativePermeability node :ref:`XML_VanGenuchtenBakerRelativePermeability` -VanGenuchtenCapillaryPressure node :ref:`XML_VanGenuchtenCapillaryPressure` -VanGenuchtenStone2RelativePermeability node :ref:`XML_VanGenuchtenStone2RelativePermeability` -ViscoDruckerPrager node :ref:`XML_ViscoDruckerPrager` -ViscoExtendedDruckerPrager node :ref:`XML_ViscoExtendedDruckerPrager` -ViscoModifiedCamClay node :ref:`XML_ViscoModifiedCamClay` -WillisRichardsPermeability node :ref:`XML_WillisRichardsPermeability` -============================================== ==== ======= ========================================================= +============================================= ==== ======= ======================================================== +Name Type Default Description +============================================= ==== ======= ======================================================== +BiotPorosity node :ref:`XML_BiotPorosity` +BlackOilFluid node :ref:`XML_BlackOilFluid` +BrooksCoreyBakerRelativePermeability node :ref:`XML_BrooksCoreyBakerRelativePermeability` +BrooksCoreyCapillaryPressure node :ref:`XML_BrooksCoreyCapillaryPressure` +BrooksCoreyRelativePermeability node :ref:`XML_BrooksCoreyRelativePermeability` +BrooksCoreyStone2RelativePermeability node :ref:`XML_BrooksCoreyStone2RelativePermeability` +CO2BrineEzrokhiFluid node :ref:`XML_CO2BrineEzrokhiFluid` +CO2BrineEzrokhiThermalFluid node :ref:`XML_CO2BrineEzrokhiThermalFluid` +CO2BrinePhillipsFluid node :ref:`XML_CO2BrinePhillipsFluid` +CO2BrinePhillipsThermalFluid node :ref:`XML_CO2BrinePhillipsThermalFluid` +CarmanKozenyPermeability node :ref:`XML_CarmanKozenyPermeability` +CeramicDamage node :ref:`XML_CeramicDamage` +CompositionalMultiphaseFluid node :ref:`XML_CompositionalMultiphaseFluid` +CompositionalTwoPhaseFluid node :ref:`XML_CompositionalTwoPhaseFluid` +CompositionalTwoPhaseFluidLohrenzBrayClark node :ref:`XML_CompositionalTwoPhaseFluidLohrenzBrayClark` +CompressibleSinglePhaseFluid node :ref:`XML_CompressibleSinglePhaseFluid` +CompressibleSolidCarmanKozenyPermeability node :ref:`XML_CompressibleSolidCarmanKozenyPermeability` +CompressibleSolidConstantPermeability node :ref:`XML_CompressibleSolidConstantPermeability` +CompressibleSolidExponentialDecayPermeability node :ref:`XML_CompressibleSolidExponentialDecayPermeability` +CompressibleSolidParallelPlatesPermeability node :ref:`XML_CompressibleSolidParallelPlatesPermeability` +CompressibleSolidPressurePermeability node :ref:`XML_CompressibleSolidPressurePermeability` +CompressibleSolidSlipDependentPermeability node :ref:`XML_CompressibleSolidSlipDependentPermeability` +CompressibleSolidWillisRichardsPermeability node :ref:`XML_CompressibleSolidWillisRichardsPermeability` +ConstantDiffusion node :ref:`XML_ConstantDiffusion` +ConstantPermeability node :ref:`XML_ConstantPermeability` +Coulomb node :ref:`XML_Coulomb` +DamageElasticIsotropic node :ref:`XML_DamageElasticIsotropic` +DamageSpectralElasticIsotropic node :ref:`XML_DamageSpectralElasticIsotropic` +DamageVolDevElasticIsotropic node :ref:`XML_DamageVolDevElasticIsotropic` +DeadOilFluid node :ref:`XML_DeadOilFluid` +DelftEgg node :ref:`XML_DelftEgg` +DruckerPrager node :ref:`XML_DruckerPrager` +ElasticIsotropic node :ref:`XML_ElasticIsotropic` +ElasticIsotropicPressureDependent node :ref:`XML_ElasticIsotropicPressureDependent` +ElasticOrthotropic node :ref:`XML_ElasticOrthotropic` +ElasticTransverseIsotropic node :ref:`XML_ElasticTransverseIsotropic` +ExponentialDecayPermeability node :ref:`XML_ExponentialDecayPermeability` +ExtendedDruckerPrager node :ref:`XML_ExtendedDruckerPrager` +FrictionlessContact node :ref:`XML_FrictionlessContact` +JFunctionCapillaryPressure node :ref:`XML_JFunctionCapillaryPressure` +LinearIsotropicDispersion node :ref:`XML_LinearIsotropicDispersion` +ModifiedCamClay node :ref:`XML_ModifiedCamClay` +MultiPhaseConstantThermalConductivity node :ref:`XML_MultiPhaseConstantThermalConductivity` +MultiPhaseVolumeWeightedThermalConductivity node :ref:`XML_MultiPhaseVolumeWeightedThermalConductivity` +NullModel node :ref:`XML_NullModel` +ParallelPlatesPermeability node :ref:`XML_ParallelPlatesPermeability` +ParticleFluid node :ref:`XML_ParticleFluid` +PerfectlyPlastic node :ref:`XML_PerfectlyPlastic` +PorousDamageElasticIsotropic node :ref:`XML_PorousDamageElasticIsotropic` +PorousDamageSpectralElasticIsotropic node :ref:`XML_PorousDamageSpectralElasticIsotropic` +PorousDamageVolDevElasticIsotropic node :ref:`XML_PorousDamageVolDevElasticIsotropic` +PorousDelftEgg node :ref:`XML_PorousDelftEgg` +PorousDruckerPrager node :ref:`XML_PorousDruckerPrager` +PorousElasticIsotropic node :ref:`XML_PorousElasticIsotropic` +PorousElasticOrthotropic node :ref:`XML_PorousElasticOrthotropic` +PorousElasticTransverseIsotropic node :ref:`XML_PorousElasticTransverseIsotropic` +PorousExtendedDruckerPrager node :ref:`XML_PorousExtendedDruckerPrager` +PorousModifiedCamClay node :ref:`XML_PorousModifiedCamClay` +PorousViscoDruckerPrager node :ref:`XML_PorousViscoDruckerPrager` +PorousViscoExtendedDruckerPrager node :ref:`XML_PorousViscoExtendedDruckerPrager` +PorousViscoModifiedCamClay node :ref:`XML_PorousViscoModifiedCamClay` +PressurePermeability node :ref:`XML_PressurePermeability` +PressurePorosity node :ref:`XML_PressurePorosity` +ProppantPermeability node :ref:`XML_ProppantPermeability` +ProppantPorosity node :ref:`XML_ProppantPorosity` +ProppantSlurryFluid node :ref:`XML_ProppantSlurryFluid` +ProppantSolidProppantPermeability node :ref:`XML_ProppantSolidProppantPermeability` +ReactiveBrine node :ref:`XML_ReactiveBrine` +ReactiveBrineThermal node :ref:`XML_ReactiveBrineThermal` +SinglePhaseConstantThermalConductivity node :ref:`XML_SinglePhaseConstantThermalConductivity` +SlipDependentPermeability node :ref:`XML_SlipDependentPermeability` +SolidInternalEnergy node :ref:`XML_SolidInternalEnergy` +TableCapillaryPressure node :ref:`XML_TableCapillaryPressure` +TableRelativePermeability node :ref:`XML_TableRelativePermeability` +TableRelativePermeabilityHysteresis node :ref:`XML_TableRelativePermeabilityHysteresis` +ThermalCompressibleSinglePhaseFluid node :ref:`XML_ThermalCompressibleSinglePhaseFluid` +VanGenuchtenBakerRelativePermeability node :ref:`XML_VanGenuchtenBakerRelativePermeability` +VanGenuchtenCapillaryPressure node :ref:`XML_VanGenuchtenCapillaryPressure` +VanGenuchtenStone2RelativePermeability node :ref:`XML_VanGenuchtenStone2RelativePermeability` +ViscoDruckerPrager node :ref:`XML_ViscoDruckerPrager` +ViscoExtendedDruckerPrager node :ref:`XML_ViscoExtendedDruckerPrager` +ViscoModifiedCamClay node :ref:`XML_ViscoModifiedCamClay` +WillisRichardsPermeability node :ref:`XML_WillisRichardsPermeability` +============================================= ==== ======= ======================================================== diff --git a/src/coreComponents/schema/docs/Constitutive_other.rst b/src/coreComponents/schema/docs/Constitutive_other.rst index 93ffa5b4966..d95527f1483 100644 --- a/src/coreComponents/schema/docs/Constitutive_other.rst +++ b/src/coreComponents/schema/docs/Constitutive_other.rst @@ -1,93 +1,91 @@ -============================================== ==== =================================================================== -Name Type Description -============================================== ==== =================================================================== -BiotPorosity node :ref:`DATASTRUCTURE_BiotPorosity` -BlackOilFluid node :ref:`DATASTRUCTURE_BlackOilFluid` -BrooksCoreyBakerRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyBakerRelativePermeability` -BrooksCoreyCapillaryPressure node :ref:`DATASTRUCTURE_BrooksCoreyCapillaryPressure` -BrooksCoreyRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyRelativePermeability` -BrooksCoreyStone2RelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyStone2RelativePermeability` -CO2BrineEzrokhiFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiFluid` -CO2BrineEzrokhiThermalFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiThermalFluid` -CO2BrinePhillipsFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsFluid` -CO2BrinePhillipsThermalFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsThermalFluid` -CarmanKozenyPermeability node :ref:`DATASTRUCTURE_CarmanKozenyPermeability` -CeramicDamage node :ref:`DATASTRUCTURE_CeramicDamage` -CompositionalMultiphaseFluid node :ref:`DATASTRUCTURE_CompositionalMultiphaseFluid` -CompositionalTwoPhaseFluidPengRobinson node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidPengRobinson` -CompositionalTwoPhaseFluidPengRobinsonLBC node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidPengRobinsonLBC` -CompositionalTwoPhaseFluidSoaveRedlichKwong node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidSoaveRedlichKwong` -CompositionalTwoPhaseFluidSoaveRedlichKwongLBC node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidSoaveRedlichKwongLBC` -CompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_CompressibleSinglePhaseFluid` -CompressibleSolidCarmanKozenyPermeability node :ref:`DATASTRUCTURE_CompressibleSolidCarmanKozenyPermeability` -CompressibleSolidConstantPermeability node :ref:`DATASTRUCTURE_CompressibleSolidConstantPermeability` -CompressibleSolidExponentialDecayPermeability node :ref:`DATASTRUCTURE_CompressibleSolidExponentialDecayPermeability` -CompressibleSolidParallelPlatesPermeability node :ref:`DATASTRUCTURE_CompressibleSolidParallelPlatesPermeability` -CompressibleSolidPressurePermeability node :ref:`DATASTRUCTURE_CompressibleSolidPressurePermeability` -CompressibleSolidSlipDependentPermeability node :ref:`DATASTRUCTURE_CompressibleSolidSlipDependentPermeability` -CompressibleSolidWillisRichardsPermeability node :ref:`DATASTRUCTURE_CompressibleSolidWillisRichardsPermeability` -ConstantDiffusion node :ref:`DATASTRUCTURE_ConstantDiffusion` -ConstantPermeability node :ref:`DATASTRUCTURE_ConstantPermeability` -Coulomb node :ref:`DATASTRUCTURE_Coulomb` -DamageElasticIsotropic node :ref:`DATASTRUCTURE_DamageElasticIsotropic` -DamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_DamageSpectralElasticIsotropic` -DamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_DamageVolDevElasticIsotropic` -DeadOilFluid node :ref:`DATASTRUCTURE_DeadOilFluid` -DelftEgg node :ref:`DATASTRUCTURE_DelftEgg` -DruckerPrager node :ref:`DATASTRUCTURE_DruckerPrager` -ElasticIsotropic node :ref:`DATASTRUCTURE_ElasticIsotropic` -ElasticIsotropicPressureDependent node :ref:`DATASTRUCTURE_ElasticIsotropicPressureDependent` -ElasticOrthotropic node :ref:`DATASTRUCTURE_ElasticOrthotropic` -ElasticTransverseIsotropic node :ref:`DATASTRUCTURE_ElasticTransverseIsotropic` -ExponentialDecayPermeability node :ref:`DATASTRUCTURE_ExponentialDecayPermeability` -ExtendedDruckerPrager node :ref:`DATASTRUCTURE_ExtendedDruckerPrager` -FrictionlessContact node :ref:`DATASTRUCTURE_FrictionlessContact` -JFunctionCapillaryPressure node :ref:`DATASTRUCTURE_JFunctionCapillaryPressure` -LinearIsotropicDispersion node :ref:`DATASTRUCTURE_LinearIsotropicDispersion` -ModifiedCamClay node :ref:`DATASTRUCTURE_ModifiedCamClay` -MultiPhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseConstantThermalConductivity` -MultiPhaseVolumeWeightedThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseVolumeWeightedThermalConductivity` -NullModel node :ref:`DATASTRUCTURE_NullModel` -ParallelPlatesPermeability node :ref:`DATASTRUCTURE_ParallelPlatesPermeability` -ParticleFluid node :ref:`DATASTRUCTURE_ParticleFluid` -PerfectlyPlastic node :ref:`DATASTRUCTURE_PerfectlyPlastic` -PorousDamageElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageElasticIsotropic` -PorousDamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageSpectralElasticIsotropic` -PorousDamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageVolDevElasticIsotropic` -PorousDelftEgg node :ref:`DATASTRUCTURE_PorousDelftEgg` -PorousDruckerPrager node :ref:`DATASTRUCTURE_PorousDruckerPrager` -PorousElasticIsotropic node :ref:`DATASTRUCTURE_PorousElasticIsotropic` -PorousElasticOrthotropic node :ref:`DATASTRUCTURE_PorousElasticOrthotropic` -PorousElasticTransverseIsotropic node :ref:`DATASTRUCTURE_PorousElasticTransverseIsotropic` -PorousExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousExtendedDruckerPrager` -PorousModifiedCamClay node :ref:`DATASTRUCTURE_PorousModifiedCamClay` -PorousViscoDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoDruckerPrager` -PorousViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoExtendedDruckerPrager` -PorousViscoModifiedCamClay node :ref:`DATASTRUCTURE_PorousViscoModifiedCamClay` -PressurePermeability node :ref:`DATASTRUCTURE_PressurePermeability` -PressurePorosity node :ref:`DATASTRUCTURE_PressurePorosity` -ProppantPermeability node :ref:`DATASTRUCTURE_ProppantPermeability` -ProppantPorosity node :ref:`DATASTRUCTURE_ProppantPorosity` -ProppantSlurryFluid node :ref:`DATASTRUCTURE_ProppantSlurryFluid` -ProppantSolidProppantPermeability node :ref:`DATASTRUCTURE_ProppantSolidProppantPermeability` -ReactiveBrine node :ref:`DATASTRUCTURE_ReactiveBrine` -ReactiveBrineThermal node :ref:`DATASTRUCTURE_ReactiveBrineThermal` -SinglePhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_SinglePhaseConstantThermalConductivity` -SlipDependentPermeability node :ref:`DATASTRUCTURE_SlipDependentPermeability` -SolidInternalEnergy node :ref:`DATASTRUCTURE_SolidInternalEnergy` -TableCapillaryPressure node :ref:`DATASTRUCTURE_TableCapillaryPressure` -TableRelativePermeability node :ref:`DATASTRUCTURE_TableRelativePermeability` -TableRelativePermeabilityHysteresis node :ref:`DATASTRUCTURE_TableRelativePermeabilityHysteresis` -ThermalCompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_ThermalCompressibleSinglePhaseFluid` -VanGenuchtenBakerRelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenBakerRelativePermeability` -VanGenuchtenCapillaryPressure node :ref:`DATASTRUCTURE_VanGenuchtenCapillaryPressure` -VanGenuchtenStone2RelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenStone2RelativePermeability` -ViscoDruckerPrager node :ref:`DATASTRUCTURE_ViscoDruckerPrager` -ViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_ViscoExtendedDruckerPrager` -ViscoModifiedCamClay node :ref:`DATASTRUCTURE_ViscoModifiedCamClay` -WillisRichardsPermeability node :ref:`DATASTRUCTURE_WillisRichardsPermeability` -============================================== ==== =================================================================== +============================================= ==== ================================================================== +Name Type Description +============================================= ==== ================================================================== +BiotPorosity node :ref:`DATASTRUCTURE_BiotPorosity` +BlackOilFluid node :ref:`DATASTRUCTURE_BlackOilFluid` +BrooksCoreyBakerRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyBakerRelativePermeability` +BrooksCoreyCapillaryPressure node :ref:`DATASTRUCTURE_BrooksCoreyCapillaryPressure` +BrooksCoreyRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyRelativePermeability` +BrooksCoreyStone2RelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyStone2RelativePermeability` +CO2BrineEzrokhiFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiFluid` +CO2BrineEzrokhiThermalFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiThermalFluid` +CO2BrinePhillipsFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsFluid` +CO2BrinePhillipsThermalFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsThermalFluid` +CarmanKozenyPermeability node :ref:`DATASTRUCTURE_CarmanKozenyPermeability` +CeramicDamage node :ref:`DATASTRUCTURE_CeramicDamage` +CompositionalMultiphaseFluid node :ref:`DATASTRUCTURE_CompositionalMultiphaseFluid` +CompositionalTwoPhaseFluid node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluid` +CompositionalTwoPhaseFluidLohrenzBrayClark node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidLohrenzBrayClark` +CompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_CompressibleSinglePhaseFluid` +CompressibleSolidCarmanKozenyPermeability node :ref:`DATASTRUCTURE_CompressibleSolidCarmanKozenyPermeability` +CompressibleSolidConstantPermeability node :ref:`DATASTRUCTURE_CompressibleSolidConstantPermeability` +CompressibleSolidExponentialDecayPermeability node :ref:`DATASTRUCTURE_CompressibleSolidExponentialDecayPermeability` +CompressibleSolidParallelPlatesPermeability node :ref:`DATASTRUCTURE_CompressibleSolidParallelPlatesPermeability` +CompressibleSolidPressurePermeability node :ref:`DATASTRUCTURE_CompressibleSolidPressurePermeability` +CompressibleSolidSlipDependentPermeability node :ref:`DATASTRUCTURE_CompressibleSolidSlipDependentPermeability` +CompressibleSolidWillisRichardsPermeability node :ref:`DATASTRUCTURE_CompressibleSolidWillisRichardsPermeability` +ConstantDiffusion node :ref:`DATASTRUCTURE_ConstantDiffusion` +ConstantPermeability node :ref:`DATASTRUCTURE_ConstantPermeability` +Coulomb node :ref:`DATASTRUCTURE_Coulomb` +DamageElasticIsotropic node :ref:`DATASTRUCTURE_DamageElasticIsotropic` +DamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_DamageSpectralElasticIsotropic` +DamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_DamageVolDevElasticIsotropic` +DeadOilFluid node :ref:`DATASTRUCTURE_DeadOilFluid` +DelftEgg node :ref:`DATASTRUCTURE_DelftEgg` +DruckerPrager node :ref:`DATASTRUCTURE_DruckerPrager` +ElasticIsotropic node :ref:`DATASTRUCTURE_ElasticIsotropic` +ElasticIsotropicPressureDependent node :ref:`DATASTRUCTURE_ElasticIsotropicPressureDependent` +ElasticOrthotropic node :ref:`DATASTRUCTURE_ElasticOrthotropic` +ElasticTransverseIsotropic node :ref:`DATASTRUCTURE_ElasticTransverseIsotropic` +ExponentialDecayPermeability node :ref:`DATASTRUCTURE_ExponentialDecayPermeability` +ExtendedDruckerPrager node :ref:`DATASTRUCTURE_ExtendedDruckerPrager` +FrictionlessContact node :ref:`DATASTRUCTURE_FrictionlessContact` +JFunctionCapillaryPressure node :ref:`DATASTRUCTURE_JFunctionCapillaryPressure` +LinearIsotropicDispersion node :ref:`DATASTRUCTURE_LinearIsotropicDispersion` +ModifiedCamClay node :ref:`DATASTRUCTURE_ModifiedCamClay` +MultiPhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseConstantThermalConductivity` +MultiPhaseVolumeWeightedThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseVolumeWeightedThermalConductivity` +NullModel node :ref:`DATASTRUCTURE_NullModel` +ParallelPlatesPermeability node :ref:`DATASTRUCTURE_ParallelPlatesPermeability` +ParticleFluid node :ref:`DATASTRUCTURE_ParticleFluid` +PerfectlyPlastic node :ref:`DATASTRUCTURE_PerfectlyPlastic` +PorousDamageElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageElasticIsotropic` +PorousDamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageSpectralElasticIsotropic` +PorousDamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageVolDevElasticIsotropic` +PorousDelftEgg node :ref:`DATASTRUCTURE_PorousDelftEgg` +PorousDruckerPrager node :ref:`DATASTRUCTURE_PorousDruckerPrager` +PorousElasticIsotropic node :ref:`DATASTRUCTURE_PorousElasticIsotropic` +PorousElasticOrthotropic node :ref:`DATASTRUCTURE_PorousElasticOrthotropic` +PorousElasticTransverseIsotropic node :ref:`DATASTRUCTURE_PorousElasticTransverseIsotropic` +PorousExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousExtendedDruckerPrager` +PorousModifiedCamClay node :ref:`DATASTRUCTURE_PorousModifiedCamClay` +PorousViscoDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoDruckerPrager` +PorousViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoExtendedDruckerPrager` +PorousViscoModifiedCamClay node :ref:`DATASTRUCTURE_PorousViscoModifiedCamClay` +PressurePermeability node :ref:`DATASTRUCTURE_PressurePermeability` +PressurePorosity node :ref:`DATASTRUCTURE_PressurePorosity` +ProppantPermeability node :ref:`DATASTRUCTURE_ProppantPermeability` +ProppantPorosity node :ref:`DATASTRUCTURE_ProppantPorosity` +ProppantSlurryFluid node :ref:`DATASTRUCTURE_ProppantSlurryFluid` +ProppantSolidProppantPermeability node :ref:`DATASTRUCTURE_ProppantSolidProppantPermeability` +ReactiveBrine node :ref:`DATASTRUCTURE_ReactiveBrine` +ReactiveBrineThermal node :ref:`DATASTRUCTURE_ReactiveBrineThermal` +SinglePhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_SinglePhaseConstantThermalConductivity` +SlipDependentPermeability node :ref:`DATASTRUCTURE_SlipDependentPermeability` +SolidInternalEnergy node :ref:`DATASTRUCTURE_SolidInternalEnergy` +TableCapillaryPressure node :ref:`DATASTRUCTURE_TableCapillaryPressure` +TableRelativePermeability node :ref:`DATASTRUCTURE_TableRelativePermeability` +TableRelativePermeabilityHysteresis node :ref:`DATASTRUCTURE_TableRelativePermeabilityHysteresis` +ThermalCompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_ThermalCompressibleSinglePhaseFluid` +VanGenuchtenBakerRelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenBakerRelativePermeability` +VanGenuchtenCapillaryPressure node :ref:`DATASTRUCTURE_VanGenuchtenCapillaryPressure` +VanGenuchtenStone2RelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenStone2RelativePermeability` +ViscoDruckerPrager node :ref:`DATASTRUCTURE_ViscoDruckerPrager` +ViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_ViscoExtendedDruckerPrager` +ViscoModifiedCamClay node :ref:`DATASTRUCTURE_ViscoModifiedCamClay` +WillisRichardsPermeability node :ref:`DATASTRUCTURE_WillisRichardsPermeability` +============================================= ==== ================================================================== diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 64b3936663f..ecbf7a1b217 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -593,20 +593,12 @@ - - + + - - - - - - - - - - + + @@ -4147,10 +4139,8 @@ Local- Add jump stabilization on interior of macro elements--> - - - - + + @@ -4471,60 +4461,7 @@ The expected format is "{ waterMax, oilMax }", in that order--> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -4543,12 +4480,16 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + - + @@ -4567,6 +4508,10 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + - + @@ -1938,103 +1936,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml index 20ac42736ec..2d811787db2 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_Compositional.xml @@ -69,9 +69,10 @@ - - - - Date: Tue, 2 Jul 2024 21:29:14 -0700 Subject: [PATCH 126/286] Disable generation of globalIDs in GEOS for fracture meshes (#3200) * disable generation of globalIDs in GEOS for fracture meshes --------- Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Co-authored-by: TotoGaz <49004943+TotoGaz@users.noreply.github.com> --- src/coreComponents/mesh/ElementType.hpp | 2 +- src/coreComponents/mesh/generators/VTKUtilities.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/mesh/ElementType.hpp b/src/coreComponents/mesh/ElementType.hpp index 8345080149f..512ffea943d 100644 --- a/src/coreComponents/mesh/ElementType.hpp +++ b/src/coreComponents/mesh/ElementType.hpp @@ -111,7 +111,7 @@ ENUM_STRINGS( ElementType, /// String available for mesh errors inline auto constexpr generalMeshErrorAdvice = "Consider checking the validity of your mesh with " - "the `mesh_doctor` GEOS python tools (documentation at" + "the `mesh_doctor` GEOS python tools (documentation at " "https://geosx-geosx.readthedocs-hosted.com/en/latest/docs/sphinx/pythonTools/mesh_doctor.html)."; } // namespace geos diff --git a/src/coreComponents/mesh/generators/VTKUtilities.cpp b/src/coreComponents/mesh/generators/VTKUtilities.cpp index 47bce1e7aa0..5fd230acdf3 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.cpp @@ -734,7 +734,7 @@ findNeighborRanks( std::vector< vtkBoundingBox > boundingBoxes ) } -vtkSmartPointer< vtkDataSet > manageGlobalIds( vtkSmartPointer< vtkDataSet > mesh, int useGlobalIds ) +vtkSmartPointer< vtkDataSet > manageGlobalIds( vtkSmartPointer< vtkDataSet > mesh, int useGlobalIds, bool isFractured ) { auto hasGlobalIds = []( vtkSmartPointer< vtkDataSet > m ) -> bool { @@ -776,6 +776,8 @@ vtkSmartPointer< vtkDataSet > manageGlobalIds( vtkSmartPointer< vtkDataSet > mes } else { + GEOS_ERROR_IF( isFractured, "Automatic generation of global IDs for fractured meshes is disabled. Please split with mesh_doctor. \n" << generalMeshErrorAdvice ); + GEOS_LOG_RANK_0( "Generating global Ids from VTK mesh" ); output = generateGlobalIDs( mesh ); } @@ -910,7 +912,7 @@ redistributeMeshes( integer const logLevel, } // Generate global IDs for vertices and cells, if needed - vtkSmartPointer< vtkDataSet > mesh = manageGlobalIds( loadedMesh, useGlobalIds ); + vtkSmartPointer< vtkDataSet > mesh = manageGlobalIds( loadedMesh, useGlobalIds, !std::empty( fractures ) ); if( MpiWrapper::commRank( comm ) != ( MpiWrapper::commSize( comm ) - 1 ) ) { From 94a0e86aad417bff6d52c082fe1c898647cf8ca2 Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Wed, 3 Jul 2024 09:17:00 -0500 Subject: [PATCH 127/286] Remove unnecessary loop (#3204) --- .../fluidFlow/CompositionalMultiphaseBase.cpp | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 81176c2bb18..f117160c68e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -583,18 +583,15 @@ void CompositionalMultiphaseBase::validateConstitutiveModels( DomainPartition co compareMultiphaseModels( fluid, referenceFluid ); compareMulticomponentModels( fluid, referenceFluid ); - constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) - { - bool const isFluidModelThermal = castedFluid.isThermal(); - GEOS_THROW_IF( m_isThermal && !isFluidModelThermal, - GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in the solver, but the fluid model {} is incompatible with the thermal option", - getDataContext(), fluid.getDataContext() ), - InputError ); - GEOS_THROW_IF( !m_isThermal && isFluidModelThermal, - GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in fluid model {}, but the solver options are incompatible with the thermal option", - getDataContext(), fluid.getDataContext() ), - InputError ); - } ); + bool const isFluidModelThermal = fluid.isThermal(); + GEOS_THROW_IF( m_isThermal && !isFluidModelThermal, + GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in the solver, but the fluid model {} is incompatible with the thermal option", + getDataContext(), fluid.getDataContext() ), + InputError ); + GEOS_THROW_IF( !m_isThermal && isFluidModelThermal, + GEOS_FMT( "CompositionalMultiphaseBase {}: the thermal option is enabled in fluid model {}, but the solver options are incompatible with the thermal option", + getDataContext(), fluid.getDataContext() ), + InputError ); string const & relpermName = subRegion.getReference< string >( viewKeyStruct::relPermNamesString() ); RelativePermeabilityBase const & relPerm = getConstitutiveModel< RelativePermeabilityBase >( subRegion, relpermName ); From aabbe2929e87f4aaccd2c324fa49217f96dffac2 Mon Sep 17 00:00:00 2001 From: Nicola Castelletto <38361926+castelletto1@users.noreply.github.com> Date: Sat, 6 Jul 2024 07:21:55 +0100 Subject: [PATCH 128/286] Fixing python scripts in tutorials (#3211) --- .../validationStudies/poromechanics/mandel/mandelFigure.py | 2 +- .../sphinx/basicExamples/poromechanics/poromechanicsFigure.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/mandelFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/mandelFigure.py index c031d6ab19a..b484b5bda99 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/mandelFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/mandelFigure.py @@ -90,7 +90,7 @@ def getHydromechanicalParametersFromXML(xmlFilePath): G = hydromechanicalParameters["shearModulus"] E = (9.0 * K * G) / (3.0 * K + G) nu = E / (2.0 * G) - 1.0 - Ks = float(param2.get("grainBulkModulus")) + Ks = float(param2.get("defaultGrainBulkModulus")) hydromechanicalParameters["biotCoefficient"] = 1.0 - K / Ks hydromechanicalParameters["porosity"] = float(param2.get("defaultReferencePorosity")) diff --git a/src/docs/sphinx/basicExamples/poromechanics/poromechanicsFigure.py b/src/docs/sphinx/basicExamples/poromechanics/poromechanicsFigure.py index b7eb23d2e91..a1936cfc4ed 100644 --- a/src/docs/sphinx/basicExamples/poromechanics/poromechanicsFigure.py +++ b/src/docs/sphinx/basicExamples/poromechanics/poromechanicsFigure.py @@ -60,7 +60,7 @@ def getHydromechanicalParametersFromXML(xmlFilePath): E = hydromechanicalParameters["youngModulus"] nu = hydromechanicalParameters["poissonRation"] K = E / 3.0 / (1.0 - 2.0 * nu) - Kg = float(param2.get("grainBulkModulus")) + Kg = float(param2.get("defaultGrainBulkModulus")) hydromechanicalParameters["biotCoefficient"] = 1.0 - K / Kg hydromechanicalParameters["porosity"] = float(param2.get("defaultReferencePorosity")) From f8609a44758eb207ef9cf2e3f1cbc98ff71fb220 Mon Sep 17 00:00:00 2001 From: Lionel Untereiner Date: Mon, 8 Jul 2024 23:35:58 +0200 Subject: [PATCH 129/286] ci: Check that PR title follows conventional commit prefix (#3043) * add check conventional semantics * add auth * only for PR --------- Co-authored-by: Randolph Settgast Co-authored-by: Nicola Castelletto <38361926+castelletto1@users.noreply.github.com> Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .github/workflows/ci_tests.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 7396cf889b9..bb3b2b5e905 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -5,6 +5,7 @@ on: branches: - develop pull_request: + types: [opened, synchronize, reopened, edited] workflow_dispatch: # Cancels in-progress workflows for a PR when updated @@ -15,9 +16,29 @@ concurrency: # Please define `build.args.GEOS_TPL_TAG` in `.devcontainer/devcontainer.json` jobs: + # Checks if PR title follows conventional semantics + semantic_pull_request: + permissions: + pull-requests: write # for amannn/action-semantic-pull-request to analyze PRs and + statuses: write # for amannn/action-semantic-pull-request to mark status of analyzed PR + contents: read + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + steps: + - name: Check if the PR name has conventional semantics + uses: amannn/action-semantic-pull-request@e9fabac35e210fea40ca5b14c0da95a099eff26f # v5.4.0 + id: lint_pr_title + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + wip: true + # Configure that a scope doesn't need to be provided. + requireScope: false + # Jobs will be cancelled if PR is a draft. # PR status must be "Open" to run CI. is_not_draft_pull_request: + needs: [semantic_pull_request] # Everywhere in this workflow, we use the most recent ubuntu distribution available in Github Actions # to ensure maximum support of google cloud's sdk. runs-on: ubuntu-22.04 From 180f138b1c14a00a79b725e6fc9989ab562b09f3 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Tue, 9 Jul 2024 00:16:11 +0100 Subject: [PATCH 130/286] fix: Check for existence of_ SC_AVPHYS_PAGES to fix MacOS compilation. (#3207) * check for existence of_ SC_AVPHYS_PAGES --------- Co-authored-by: Randolph Settgast --- .github/workflows/ci_tests.yml | 10 ++++++++++ src/coreComponents/common/MemoryInfos.cpp | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index bb3b2b5e905..20d093a79a4 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -259,6 +259,16 @@ jobs: GCP_BUCKET: geosx/ubuntu22.04-gcc11 RUNS_ON: Runner_4core_16GB + # mac_builds: + # needs: + # - is_not_draft_pull_request + # runs-on: macos-14-xlarge + # steps: + # - run: sysctl -n hw.physicalcpu + # - run: sysctl -h hw.memsize + # - run: sysctl -n machdep.cpu.brand_string + + # If the 'ci: run CUDA builds' PR label is found, the cuda jobs run immediately along side linux jobs. # Note: CUDA jobs should only be run if PR is ready to merge. cuda_builds: diff --git a/src/coreComponents/common/MemoryInfos.cpp b/src/coreComponents/common/MemoryInfos.cpp index 98b0093c82f..145fff87f7a 100644 --- a/src/coreComponents/common/MemoryInfos.cpp +++ b/src/coreComponents/common/MemoryInfos.cpp @@ -27,8 +27,13 @@ MemoryInfos::MemoryInfos( umpire::MemoryResourceTraits::resource_type resourceTy case umpire::MemoryResourceTraits::resource_type::pinned: #if defined( _SC_PHYS_PAGES ) && defined( _SC_PAGESIZE ) m_totalMemory = sysconf( _SC_PHYS_PAGES ) * sysconf( _SC_PAGESIZE ); + #if defined(_SC_AVPHYS_PAGES) m_availableMemory = sysconf( _SC_AVPHYS_PAGES ) * sysconf( _SC_PAGESIZE ); #else + GEOS_WARNING( "Unknown device avaialable memory size getter for this system." ); + m_availableMemory = 0; + #endif + #else GEOS_WARNING( "Unknown device physical memory size getter for this compiler." ); m_physicalMemoryHandled = 0; #endif From a3b438dd4e451a82c24923ebeb58791230a73800 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 9 Jul 2024 19:32:40 +0100 Subject: [PATCH 131/286] feat: enable CODEOWNERS (#3205) * Add CODEOWNERS file Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .github/CODEOWNERS | 134 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000000..962863b1f71 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,134 @@ + + + +# These owners will be the default owners for everything in +# the repo. Unless a later match takes precedence, +# @global-owner1 and @global-owner2 will be requested for +# review when someone opens a pull request. +* @rrsettgast + +/.github/ @rrsettgast + +/inputFiles/ @CusiniM @cssherman @jhuang2601 +/src/coreComponents/LvArray @rrsettgast @wrtobin @corbett5 @CusiniM +/src/coreComponents/codingUtilities @rrsettgast @untereiner @corbett5 +/src/coreComponents/common @rrsettgast @MelReyCG @corbett5 +/src/coreComponents/constitutive @rrsettgast @CusiniM @dkachuma +/src/coreComponents/dataRepository @rrsettgast @wrtobin @corbett5 +/src/coreComponents/denseLinearAlgebra @rrsettgast @CusiniM @castelletto1 +/src/coreComponents/discretizationMethods @rrsettgast @CusiniM @castelletto1 +/src/coreComponents/events @rrsettgast @corbett5 @cssherman +/src/coreComponents/fieldSpecification @rrsettgast @CusiniM @corbett5 +/src/coreComponents/fileIO @rrsettgast @wrtobin @MelReyCG @untereiner +/src/coreComponents/finiteElement @rrsettgast @castelletto1 +/src/coreComponents/finiteVolume @rrsettgast @castelletto1 +/src/coreComponents/functions @cssherman @wrtobin +/src/coreComponents/linearAlgebra @rrsettgast @castelletto1 @victorapm +/src/coreComponents/mainInterface @rrsettgast @corbett5 +/src/coreComponents/math @rrsettgast @corbett5 +/src/coreComponents/mesh @rrsettgast @wrtobin @untereiner @CusiniM +/src/coreComponents/physicsSolvers @rrsettgast +/src/coreComponents/physicsSolvers/contact @CusiniM @rrsettgast +/src/coreComponents/physicsSolvers/fluidFlow @CusiniM @paveltomin @klevzoff @francoishamon +/src/coreComponents/physicsSolvers/inducedSeismicity @CusiniM @rrsettgast +/src/coreComponents/physicsSolvers/multiphysics @CusiniM @paveltomin @castelletto1 +/src/coreComponents/physicsSolvers/python @cssherman @corbett5 +/src/coreComponents/physicsSolvers/simplePDE @castelletto1 @rrsettgast +/src/coreComponents/physicsSolvers/solidMechanics @rrsettgast @castelletto1 @CusiniM +/src/coreComponents/physicsSolvers/surfaceGeneration @rrsettgast @CusiniM @jhuang2601 +/src/coreComponents/physicsSolvers/wavePropagation @sframba @acitrain +!/src/coreComponents/schema +/src/coreComponents/unitTests @rrsettgast @corbett5 @wrtobin + +# Here is a list of GEOS-DEV members as of 2024-07-02 +# username name +# acitrain +# aguitton +# AL0230162 Éric Cassagnard +# Algiane Algiane Froehly +# andrea-borio Andrea Borio +# andrea-francesch Andrea Franceschini +# annavarapusr1 +# AntoineMazuyer Antoine Mazuyer +# arng40 Arnaud DUDES +# Bertbk Bertrand Thierry +# binw1 +# bmhan12 Brian Han +# Bubusch Gaetan +# castelletto1 Nicola Castelletto +# chakshinglee Chak Shing Lee +# cmcrook5 +# cmorency1 Christina Morency +# corbett5 Ben Corbett +# cssherman Christopher Sherman +# CusiniM Matteo Cusini +# dkachuma Dickson Kachuma +# drmichaeltcvx Michael E. Thomadakis +# estelledirand Estelle Dirand +# francoishamon Francois Hamon +# frankfeifan +# fuyuli123456 Fuyu Li +# geosxCI +# Guotong-Ren Guotong +# henricalandra64 +# herve-gross Herve Gross +# homel1 Michael Homel +# IsaacJu-debug Isaac Ju +# jafranc Jacques Franc +# jameshcorbett James Corbett +# Jay-A Jay Appleton +# jeannepellerin Jeanne Pellerin +# jedbrown Jed Brown +# jessielu001 +# jhuang2601 Jian Huang +# jiemeng-total +# jiyer28 +# jkwashbourne John Washbourne +# johnbowen42 John Bowen +# joshua-white Joshua White +# jschen83 Jinsong Chen +# juliat-camargo +# karimifard Mohammad Karimi-Fard +# kimtaeho07 +# klevzoff Sergey Klevtsov +# ktnihei Kurt Nihei +# labesse40 +# matteofrigo5 Matteo Frigo +# MatthiasCremon Matthias Cremon +# MelReyCG +# MichaelSekachev Michael Sekachev +# mndiaye24 Mamadou N'diaye +# npillardou Nicolas Pillardou +# ol-n-ga +# oseikuffuor1 Daniel Osei-Kuffuor +# ouassimkh +# paloma-martinez +# paveltomin Pavel Tomin +# philippeVerney Philippe Verney +# raminammour Rami +# rasimHZ +# rmadec-cs Ronan Madec +# rrsettgast Randolph Settgast +# ryanhaagenson Ryan Haagenson +# ryar9534 Ryan Aronson +# samtkaplan Sam Kaplan +# samuelpmishLLNL +# sframba Stefano Frambati +# shabnamjs +# sohailwaziri +# sytuannguyen Sy-Tuan Nguyen +# tang39 Hewei Tang +# tbeltzun +# TheLastBlockbend Phillip Chacon +# tjb-ltk Tom Byer +# TNemethCVX +# TotoGaz TotoGaz +# txlx +# untereiner Lionel Untereiner +# victorapm Victor A. P. Magri +# VidarStiernstrom Vidar Stiernström +# wcy41gtc Chaoyi Wang +# wrtobin William R Tobin +# yue-2018 Yue Hao +# yylicvx +# zhishuaizhang Zhishuai Zhang From 6c8202128980f7a6c3f24af74e11713e948cf36c Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 10 Jul 2024 16:53:39 -0500 Subject: [PATCH 132/286] fix: Use aperture table in poromechanics with conforming fractures (#3194) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * decouple debug matrix output from logLevel * Update SolidMechanicsLagrangeContact.cpp * Update SinglePhasePoromechanicsConformingFractures.cpp * Update SolidMechanicsLagrangeContact.cpp * Update SurfaceElementSubRegion.hpp * Update SinglePhaseBase.cpp * Update HydrofractureSolver.cpp * Update .integrated_tests.yaml * Update BASELINE_NOTES.md --------- Co-authored-by: Pavel Tomin <“paveltomin@users.noreply.github.com”> --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 8 ++ .../contact/ContactSolverBase.cpp | 32 +++++--- .../contact/ContactSolverBase.hpp | 1 + .../contact/SolidMechanicsALMKernels.hpp | 4 +- .../contact/SolidMechanicsLagrangeContact.cpp | 81 ++++++++++++++----- .../fluidFlow/CompositionalMultiphaseBase.cpp | 3 - .../fluidFlow/FlowSolverBase.cpp | 3 - .../fluidFlow/FlowSolverBaseFields.hpp | 8 -- .../fluidFlow/SinglePhaseBase.cpp | 8 +- ...ePhasePoromechanicsConformingFractures.cpp | 44 +++++----- .../SinglePhasePoromechanicsFractures.hpp | 9 +-- .../schema/docs/Hydrofracture.rst | 59 +++++++------- 13 files changed, 160 insertions(+), 102 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 352b2b972a2..89ea94460ed 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3006-5860-947a907 + baseline: integratedTests/baseline_integratedTests-pr3194-6060-e5ba0ce allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 7d44e61640f..f2b0f19deca 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,18 +6,26 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3194 (2024-07-10) +====================== +Use aperture table in poromechanics with conforming fractures. Rebaseline the corresponding cases. + + PR #3006 (2024-07-01) ====================== Added baselines for new tests. Relaxing tolerances for singlePhasePoromechanics_FaultModel_smoke. + PR #3196 (2024-06-28) ====================== Added isLaggingFractureStencilWeightsUpdate to hydrofracture solve. Rebaseline because of the new input. + PR #3177 (2024-06-28) ====================== Added logLevel to TimeHistoryOutput. Rebaseline because of the new input flag. + PR #3181 (2024-06-25) ====================== Decouple debug matrix output from logLevel. Rebaseline because of the new input flag. diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index 0ad5e5f865a..d45ddd77e9b 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -122,19 +122,20 @@ void ContactSolverBase::setFractureRegions( dataRepository::Group const & meshBo void ContactSolverBase::computeFractureStateStatistics( MeshLevel const & mesh, globalIndex & numStick, + globalIndex & numNewSlip, globalIndex & numSlip, globalIndex & numOpen ) const { ElementRegionManager const & elemManager = mesh.getElemManager(); - array1d< globalIndex > localCounter( 3 ); + array1d< globalIndex > localCounter( 4 ); elemManager.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion const & subRegion ) { arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); arrayView1d< integer const > const & fractureState = subRegion.getField< fields::contact::fractureState >(); - RAJA::ReduceSum< parallelHostReduce, localIndex > stickCount( 0 ), slipCount( 0 ), openCount( 0 ); + RAJA::ReduceSum< parallelHostReduce, localIndex > stickCount( 0 ), newSlipCount( 0 ), slipCount( 0 ), openCount( 0 ); forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { if( ghostRank[kfe] < 0 ) @@ -147,6 +148,10 @@ void ContactSolverBase::computeFractureStateStatistics( MeshLevel const & mesh, break; } case FractureState::NewSlip: + { + newSlipCount += 1; + break; + } case FractureState::Slip: { slipCount += 1; @@ -162,21 +167,23 @@ void ContactSolverBase::computeFractureStateStatistics( MeshLevel const & mesh, } ); localCounter[0] += stickCount.get(); - localCounter[1] += slipCount.get(); - localCounter[2] += openCount.get(); + localCounter[1] += newSlipCount.get(); + localCounter[2] += slipCount.get(); + localCounter[3] += openCount.get(); } ); - array1d< globalIndex > totalCounter( 3 ); + array1d< globalIndex > totalCounter( 4 ); MpiWrapper::allReduce( localCounter.data(), totalCounter.data(), - 3, + 4, MPI_SUM, MPI_COMM_GEOSX ); - numStick = totalCounter[0]; - numSlip = totalCounter[1]; - numOpen = totalCounter[2]; + numStick = totalCounter[0]; + numNewSlip = totalCounter[1]; + numSlip = totalCounter[2]; + numOpen = totalCounter[3]; } void ContactSolverBase::outputConfigurationStatistics( DomainPartition const & domain ) const @@ -184,6 +191,7 @@ void ContactSolverBase::outputConfigurationStatistics( DomainPartition const & d if( getLogLevel() >=1 ) { globalIndex numStick = 0; + globalIndex numNewSlip = 0; globalIndex numSlip = 0; globalIndex numOpen = 0; @@ -191,11 +199,11 @@ void ContactSolverBase::outputConfigurationStatistics( DomainPartition const & d MeshLevel const & mesh, arrayView1d< string const > const & ) { - computeFractureStateStatistics( mesh, numStick, numSlip, numOpen ); + computeFractureStateStatistics( mesh, numStick, numNewSlip, numSlip, numOpen ); GEOS_LOG_RANK_0( GEOS_FMT( " Number of element for each fracture state:" - " stick: {:12} | slip: {:12} | open: {:12}", - numStick, numSlip, numOpen ) ); + " stick: {:12} | new slip: {:12} | slip: {:12} | open: {:12}", + numStick, numNewSlip, numSlip, numOpen ) ); } ); } } diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp index 16c16403a4c..eaf0f35501d 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp @@ -62,6 +62,7 @@ class ContactSolverBase : public SolidMechanicsLagrangianFEM void computeFractureStateStatistics( MeshLevel const & mesh, globalIndex & numStick, + globalIndex & numNewSlip, globalIndex & numSlip, globalIndex & numOpen ) const; diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp index 7c291b0f899..c313ef6570e 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp @@ -406,8 +406,8 @@ struct ComputeRotationMatricesKernel forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) { - localIndex const & f0 = elemsToFaces[k][0]; - localIndex const & f1 = elemsToFaces[k][1]; + localIndex const f0 = elemsToFaces[k][0]; + localIndex const f1 = elemsToFaces[k][1]; real64 Nbar[3]; Nbar[0] = faceNormal[f0][0] - faceNormal[f1][0]; diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 5418db47259..4e5bd37fc44 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -253,6 +253,13 @@ void SolidMechanicsLagrangeContact::computeTolerances( DomainPartition & domain { GEOS_MARK_FUNCTION; + real64 minNormalTractionTolerance( 1e10 ); + real64 maxNormalTractionTolerance( -1e10 ); + real64 minNormalDisplacementTolerance( 1e10 ); + real64 maxNormalDisplacementTolerance( -1e10 ); + real64 minSlidingTolerance( 1e10 ); + real64 maxSlidingTolerance( -1e10 ); + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, arrayView1d< string const > const & ) @@ -302,6 +309,13 @@ void SolidMechanicsLagrangeContact::computeTolerances( DomainPartition & domain arrayView1d< real64 > const & slidingTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::slidingToleranceString() ); + RAJA::ReduceMin< ReducePolicy< parallelHostPolicy >, real64 > minSubRegionNormalTractionTolerance( 1e10 ); + RAJA::ReduceMax< ReducePolicy< parallelHostPolicy >, real64 > maxSubRegionNormalTractionTolerance( -1e10 ); + RAJA::ReduceMin< ReducePolicy< parallelHostPolicy >, real64 > minSubRegionNormalDisplacementTolerance( 1e10 ); + RAJA::ReduceMax< ReducePolicy< parallelHostPolicy >, real64 > maxSubRegionNormalDisplacementTolerance( -1e10 ); + RAJA::ReduceMin< ReducePolicy< parallelHostPolicy >, real64 > minSubRegionSlidingTolerance( 1e10 ); + RAJA::ReduceMax< ReducePolicy< parallelHostPolicy >, real64 > maxSubRegionSlidingTolerance( -1e10 ); + forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { if( ghostRank[kfe] < 0 ) @@ -385,15 +399,36 @@ void SolidMechanicsLagrangeContact::computeTolerances( DomainPartition & domain LvArray::tensorOps::scale< 3, 3 >( rotatedInvStiffApprox, area ); // Finally, compute tolerances for the given fracture element + normalDisplacementTolerance[kfe] = rotatedInvStiffApprox[ 0 ][ 0 ] * averageYoungModulus / 2.e+7; + minSubRegionNormalDisplacementTolerance.min( normalDisplacementTolerance[kfe] ); + maxSubRegionNormalDisplacementTolerance.max( normalDisplacementTolerance[kfe] ); + slidingTolerance[kfe] = sqrt( rotatedInvStiffApprox[ 1 ][ 1 ] * rotatedInvStiffApprox[ 1 ][ 1 ] + rotatedInvStiffApprox[ 2 ][ 2 ] * rotatedInvStiffApprox[ 2 ][ 2 ] ) * averageYoungModulus / 2.e+7; + minSubRegionSlidingTolerance.min( slidingTolerance[kfe] ); + maxSubRegionSlidingTolerance.max( slidingTolerance[kfe] ); + normalTractionTolerance[kfe] = 1.0 / 2.0 * averageConstrainedModulus / averageBoxSize0 * normalDisplacementTolerance[kfe]; + minSubRegionNormalTractionTolerance.min( normalTractionTolerance[kfe] ); + maxSubRegionNormalTractionTolerance.max( normalTractionTolerance[kfe] ); } } ); + + minNormalDisplacementTolerance = std::min( minNormalDisplacementTolerance, minSubRegionNormalDisplacementTolerance.get() ); + maxNormalDisplacementTolerance = std::max( maxNormalDisplacementTolerance, maxSubRegionNormalDisplacementTolerance.get() ); + minSlidingTolerance = std::min( minSlidingTolerance, minSubRegionSlidingTolerance.get() ); + maxSlidingTolerance = std::max( maxSlidingTolerance, maxSubRegionSlidingTolerance.get() ); + minNormalTractionTolerance = std::min( minNormalTractionTolerance, minSubRegionNormalTractionTolerance.get() ); + maxNormalTractionTolerance = std::max( maxNormalTractionTolerance, maxSubRegionNormalTractionTolerance.get() ); } } ); } ); + + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{}: normal displacement tolerance = [{}, {}], sliding tolerance = [{}, {}], normal traction tolerance = [{}, {}]", + this->getName(), minNormalDisplacementTolerance, maxNormalDisplacementTolerance, + minSlidingTolerance, maxSlidingTolerance, + minNormalTractionTolerance, maxNormalTractionTolerance ) ); } void SolidMechanicsLagrangeContact::resetStateToBeginningOfStep( DomainPartition & domain ) @@ -586,7 +621,7 @@ void SolidMechanicsLagrangeContact::assembleSystem( real64 const time, assembleContact( domain, dofManager, localMatrix, localRhs ); - // for sequenatial: add (fixed) pressure force contribution into residual (no derivatives) + // for sequential: add (fixed) pressure force contribution into residual (no derivatives) if( m_isFixedStressPoromechanicsUpdate ) { forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, @@ -2221,20 +2256,24 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai if( ghostRank[kfe] < 0 ) { integer const originalFractureState = fractureState[kfe]; - if( originalFractureState == contact::FractureState::Open ) + if( originalFractureState == FractureState::Open ) { - if( dispJump[kfe][0] > -normalDisplacementTolerance[kfe] ) + if( dispJump[kfe][0] <= -normalDisplacementTolerance[kfe] ) { - fractureState[kfe] = contact::FractureState::Open; - } - else - { - fractureState[kfe] = contact::FractureState::Stick; + fractureState[kfe] = FractureState::Stick; + if( getLogLevel() >= 10 ) + GEOS_LOG( GEOS_FMT( "{}: {} -> {}: dispJump = {}, normalDisplacementTolerance = {}", + kfe, originalFractureState, fractureState[kfe], + dispJump[kfe][0], normalDisplacementTolerance[kfe] ) ); } } else if( traction[kfe][0] > normalTractionTolerance[kfe] ) { - fractureState[kfe] = contact::FractureState::Open; + fractureState[kfe] = FractureState::Open; + if( getLogLevel() >= 10 ) + GEOS_LOG( GEOS_FMT( "{}: {} -> {}: traction = {}, normalTractionTolerance = {}", + kfe, originalFractureState, fractureState[kfe], + traction[kfe][0], normalTractionTolerance[kfe] ) ); } else { @@ -2245,29 +2284,33 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai contactWrapper.computeLimitTangentialTractionNorm( traction[kfe][0], dLimitTangentialTractionNorm_dTraction ); - if( originalFractureState == contact::FractureState::Stick && currentTau >= limitTau ) + if( originalFractureState == FractureState::Stick && currentTau >= limitTau ) { currentTau *= (1.0 - m_slidingCheckTolerance); } - else if( originalFractureState != contact::FractureState::Stick && currentTau <= limitTau ) + else if( originalFractureState != FractureState::Stick && currentTau <= limitTau ) { currentTau *= (1.0 + m_slidingCheckTolerance); } if( currentTau > limitTau ) { - if( originalFractureState == contact::FractureState::Stick ) + if( originalFractureState == FractureState::Stick ) { - fractureState[kfe] = contact::FractureState::NewSlip; + fractureState[kfe] = FractureState::NewSlip; } else { - fractureState[kfe] = contact::FractureState::Slip; + fractureState[kfe] = FractureState::Slip; } } else { - fractureState[kfe] = contact::FractureState::Stick; + fractureState[kfe] = FractureState::Stick; } + if( getLogLevel() >= 10 && fractureState[kfe] != originalFractureState ) + GEOS_LOG( GEOS_FMT( "{}: {} -> {}: currentTau = {}, limitTau = {}", + kfe, originalFractureState, fractureState[kfe], + currentTau, limitTau ) ); } changed += faceArea[kfe] * !compareFractureStates( originalFractureState, fractureState[kfe] ); @@ -2289,21 +2332,23 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai // and total area of fracture elements totalArea = MpiWrapper::sum( totalArea ); + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( " {}: changed area {} out of {}", getName(), changedArea, totalArea ) ); + // Assume converged if changed area is below certain fraction of total area return changedArea <= m_nonlinearSolverParameters.m_configurationTolerance * totalArea; } bool SolidMechanicsLagrangeContact::isFractureAllInStickCondition( DomainPartition const & domain ) const { - globalIndex numStick, numSlip, numOpen; + globalIndex numStick, numNewSlip, numSlip, numOpen; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel const & mesh, arrayView1d< string const > const & ) { - computeFractureStateStatistics( mesh, numStick, numSlip, numOpen ); + computeFractureStateStatistics( mesh, numStick, numNewSlip, numSlip, numOpen ); } ); - return ( ( numSlip + numOpen ) == 0 ); + return ( ( numNewSlip + numSlip + numOpen ) == 0 ); } real64 SolidMechanicsLagrangeContact::setNextDt( real64 const & currentDt, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index f117160c68e..7a3ac6e99f1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -2585,9 +2585,6 @@ void CompositionalMultiphaseBase::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; - if( m_keepFlowVariablesConstantDuringInitStep ) - return; - real64 maxDeltaPhaseVolFrac = 0.0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, MeshLevel & mesh, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 3c32bc821e9..3c8554d6c4d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -185,9 +185,6 @@ void FlowSolverBase::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< fields::flow::hydraulicAperture >( getName() ). setApplyDefaultValue( faceRegion.getDefaultAperture() ); - subRegion.registerField< fields::flow::minimumHydraulicAperture >( getName() ). - setApplyDefaultValue( faceRegion.getDefaultAperture() ); - } ); FaceManager & faceManager = mesh.getFaceManager(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp index 53f7ea8704f..59b9975dde6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp @@ -168,14 +168,6 @@ DECLARE_FIELD( hydraulicAperture, WRITE_AND_READ, "Hydraulic aperture" ); -DECLARE_FIELD( minimumHydraulicAperture, - "minimumHydraulicAperture", - array1d< real64 >, - 0, - LEVEL_0, - WRITE_AND_READ, - "minimum value of the hydraulic aperture" ); - DECLARE_FIELD( gravityCoefficient, "gravityCoefficient", array1d< real64 >, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 2c32fc10229..3fddc4300bc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -750,12 +750,13 @@ void SinglePhaseBase::implicitStepComplete( real64 const & time, singlePhaseBaseKernels::StatisticsKernel:: saveDeltaPressure( subRegion.size(), pres, initPres, deltaPres ); - arrayView1d< real64 const > const dVol = subRegion.getField< fields::flow::deltaVolume >(); + arrayView1d< real64 > const dVol = subRegion.getField< fields::flow::deltaVolume >(); arrayView1d< real64 > const vol = subRegion.getReference< array1d< real64 > >( CellElementSubRegion::viewKeyStruct::elementVolumeString() ); forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) { vol[ei] += dVol[ei]; + dVol[ei] = 0.0; } ); SingleFluidBase const & fluid = @@ -803,7 +804,7 @@ void SinglePhaseBase::implicitStepComplete( real64 const & time, if( volume[ei] * density_n[ei][0] > 1.1 * creationMass[ei] ) { creationMass[ei] *= 0.75; - if( creationMass[ei]<1.0e-20 ) + if( creationMass[ei] < 1.0e-20 ) { creationMass[ei] = 0.0; } @@ -1255,9 +1256,6 @@ void SinglePhaseBase::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; - if( m_keepFlowVariablesConstantDuringInitStep ) - return; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 661318fdc4d..e4591b67a1a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -19,6 +19,7 @@ #include "SinglePhasePoromechanicsConformingFractures.hpp" #include "constitutive/solid/PorousSolid.hpp" +#include "constitutive/contact/ContactSelector.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "linearAlgebra/solvers/BlockPreconditioner.hpp" #include "linearAlgebra/solvers/SeparateComponentPreconditioner.hpp" @@ -759,7 +760,6 @@ void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::updateHydraulic arrayView2d< real64 const > const fractureTraction = subRegion.getField< fields::contact::traction >(); arrayView1d< real64 const > const pressure = subRegion.getField< fields::flow::pressure >(); arrayView1d< real64 const > const oldHydraulicAperture = subRegion.getField< fields::flow::aperture0 >(); - arrayView1d< real64 const > const minimumHydraulicAperture = subRegion.getField< flow::minimumHydraulicAperture >(); arrayView1d< real64 > const aperture = subRegion.getElementAperture(); arrayView1d< real64 > const hydraulicAperture = subRegion.getField< flow::hydraulicAperture >(); @@ -768,25 +768,33 @@ void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::updateHydraulic string const porousSolidName = subRegion.getReference< string >( FlowSolverBase::viewKeyStruct::solidNamesString() ); CoupledSolidBase & porousSolid = subRegion.getConstitutiveModel< CoupledSolidBase >( porousSolidName ); - constitutive::ConstitutivePassThru< CompressibleSolidBase >::execute( porousSolid, [=, &subRegion] ( auto & castedPorousSolid ) - { + string const & contactRelationName = subRegion.template getReference< string >( SolidMechanicsLagrangianFEM::viewKeyStruct::contactRelationNameString() ); + ContactBase const & contact = subRegion.getConstitutiveModel< ContactBase >( contactRelationName ); - typename TYPEOFREF( castedPorousSolid ) ::KernelWrapper porousMaterialWrapper = castedPorousSolid.createKernelUpdates(); - - poromechanicsFracturesKernels::StateUpdateKernel:: - launch< parallelDevicePolicy<> >( subRegion.size(), - porousMaterialWrapper, - dispJump, - pressure, - area, - volume, - deltaVolume, - aperture, - minimumHydraulicAperture, - oldHydraulicAperture, - hydraulicAperture, - fractureTraction ); + constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) + { + using ContactType = TYPEOFREF( castedContact ); + typename ContactType::KernelWrapper contactWrapper = castedContact.createKernelWrapper(); + constitutive::ConstitutivePassThru< CompressibleSolidBase >::execute( porousSolid, [=, &subRegion] ( auto & castedPorousSolid ) + { + typename TYPEOFREF( castedPorousSolid ) ::KernelWrapper porousMaterialWrapper = castedPorousSolid.createKernelUpdates(); + + poromechanicsFracturesKernels::StateUpdateKernel:: + launch< parallelDevicePolicy<> >( subRegion.size(), + porousMaterialWrapper, + contactWrapper, + dispJump, + pressure, + area, + volume, + deltaVolume, + aperture, + oldHydraulicAperture, + hydraulicAperture, + fractureTraction ); + + } ); } ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp index 7c098a010dc..c48eceed316 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp @@ -43,22 +43,21 @@ struct StateUpdateKernel * @param[in] volume the volume * @param[out] deltaVolume the change in volume * @param[out] aperture the aperture - * @param[in] minimumHydraulicAperture the * @param[in] oldHydraulicAperture the old hydraulic aperture * @param[out] hydraulicAperture the effecture aperture * @param[in] fractureTraction the fracture traction */ - template< typename POLICY, typename POROUS_WRAPPER > + template< typename POLICY, typename POROUS_WRAPPER, typename CONTACT_WRAPPER > static void launch( localIndex const size, POROUS_WRAPPER const & porousMaterialWrapper, + CONTACT_WRAPPER const & contactWrapper, arrayView2d< real64 const > const & dispJump, arrayView1d< real64 const > const & pressure, arrayView1d< real64 const > const & area, arrayView1d< real64 const > const & volume, arrayView1d< real64 > const & deltaVolume, arrayView1d< real64 > const & aperture, - arrayView1d< real64 const > const & minimumHydraulicAperture, arrayView1d< real64 const > const & oldHydraulicAperture, arrayView1d< real64 > const & hydraulicAperture, arrayView2d< real64 const > const & fractureTraction ) @@ -69,8 +68,8 @@ struct StateUpdateKernel // update aperture to be equal to the normal displacement jump aperture[k] = dispJump[k][0]; // the first component of the jump is the normal one. - hydraulicAperture[k] = minimumHydraulicAperture[k] + aperture[k]; - real64 const dHydraulicAperture_dNormalJump = 1.0; + real64 dHydraulicAperture_dNormalJump = 0.0; + hydraulicAperture[k] = contactWrapper.computeHydraulicAperture( aperture[k], dHydraulicAperture_dNormalJump ); deltaVolume[k] = hydraulicAperture[k] * area[k] - volume[k]; diff --git a/src/coreComponents/schema/docs/Hydrofracture.rst b/src/coreComponents/schema/docs/Hydrofracture.rst index 250756df110..896a5cb77b0 100644 --- a/src/coreComponents/schema/docs/Hydrofracture.rst +++ b/src/coreComponents/schema/docs/Hydrofracture.rst @@ -1,27 +1,32 @@ -============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contactRelationName groupNameRef required Name of contact relation to enforce constraints on fracture boundary. -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isMatrixPoroelastic integer 0 (no description available) -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -maxNumResolves integer 10 Value to indicate how many resolves may be executed to perform surface generation after the execution of flow and mechanics solver. -name groupName required A name is required for any non-unique nodes -newFractureInitializationType geos_HydrofractureSolver >_InitializationType Pressure Type of new fracture element initialization. Can be Pressure or Displacement. -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -stabilizationMultiplier real64 1 Constant multiplier of stabilization strength -stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. -stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: - | None- Add no stabilization to mass equation - | Global- Add jump stabilization to all faces - | Local- Add jump stabilization on interior of macro elements -surfaceGeneratorName groupNameRef required Name of the surface generator to use in the hydrofracture solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -useQuasiNewton integer 0 (no description available) -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================= =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== \ No newline at end of file + + +===================================== =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== +Name Type Default Description +===================================== =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== +cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +contactRelationName groupNameRef required Name of contact relation to enforce constraints on fracture boundary. +flowSolverName groupNameRef required Name of the flow solver used by the coupled solver +initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. +isLaggingFractureStencilWeightsUpdate integer 0 Flag to determine whether or not to apply lagging update for the fracture stencil weights. +isMatrixPoroelastic integer 0 (no description available) +isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling +logLevel integer 0 Log level +maxNumResolves integer 10 Value to indicate how many resolves may be executed to perform surface generation after the execution of flow and mechanics solver. +name groupName required A name is required for any non-unique nodes +newFractureInitializationType geos_HydrofractureSolver >_InitializationType Pressure Type of new fracture element initialization. Can be Pressure or Displacement. +solidSolverName groupNameRef required Name of the solid solver used by the coupled solver +stabilizationMultiplier real64 1 Constant multiplier of stabilization strength +stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. +stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: + | None- Add no stabilization to mass equation + | Global- Add jump stabilization to all faces + | Local- Add jump stabilization on interior of macro elements +surfaceGeneratorName groupNameRef required Name of the surface generator to use in the hydrofracture solver +targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. +useQuasiNewton integer 0 (no description available) +writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). +LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` +NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` +===================================== =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== + + From 23a33727e3ba80f254060bc7dee8214e1ee75aa0 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Thu, 11 Jul 2024 21:55:00 +0100 Subject: [PATCH 133/286] chore: update trilinos, hypre and fmt. (#3214) Updated tpls: - Trilinos: 15.1.1 - Hypre: hypre-v2.31.0-26-gf6cfb0355. Contains MGR improvements that required GEOS code changes. - fmt 11.01.1 --- .devcontainer/devcontainer.json | 2 +- .github/workflows/ci_tests.yml | 45 ++++------------ .../thirdparty/SetupGeosxThirdParty.cmake | 51 ++++++++++--------- src/coreComponents/LvArray | 2 +- src/coreComponents/common/CMakeLists.txt | 4 +- src/coreComponents/common/DataTypes.hpp | 2 +- src/coreComponents/common/Format.hpp | 4 +- src/coreComponents/common/Units.hpp | 2 +- .../dataRepository/DataContext.hpp | 2 +- .../functions/unitTests/CMakeLists.txt | 4 +- .../interfaces/hypre/HypreMGR.hpp | 28 ++++++---- .../interfaces/hypre/HypreUtils.hpp | 3 +- .../CompositionalMultiphaseFVM.hpp | 2 +- .../CompositionalMultiphaseHybridFVM.hpp | 2 +- .../CompositionalMultiphaseReservoirFVM.hpp | 2 +- ...positionalMultiphaseReservoirHybridFVM.hpp | 2 +- .../mgrStrategies/MultiphasePoromechanics.hpp | 4 +- .../MultiphasePoromechanicsReservoirFVM.hpp | 38 +++++++------- .../SinglePhasePoromechanics.hpp | 2 - ...ePhasePoromechanicsConformingFractures.hpp | 5 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 5 +- .../SinglePhasePoromechanicsReservoirFVM.hpp | 4 +- .../SolidMechanicsEmbeddedFractures.hpp | 3 +- .../ThermalMultiphasePoromechanics.hpp | 2 - .../ThermalSinglePhasePoromechanics.hpp | 2 - .../solidMechanics/kernels/ExplicitMPM.hpp | 4 +- .../constitutiveTests/CMakeLists.txt | 4 +- .../dataRepositoryTests/CMakeLists.txt | 4 +- .../fieldSpecificationTests/CMakeLists.txt | 4 +- .../unitTests/fluidFlowTests/CMakeLists.txt | 4 +- .../linearAlgebraTests/CMakeLists.txt | 4 +- .../unitTests/meshTests/CMakeLists.txt | 4 +- .../virtualElementTests/CMakeLists.txt | 4 +- .../wavePropagationTests/CMakeLists.txt | 4 +- .../unitTests/wellsTests/CMakeLists.txt | 4 +- 35 files changed, 114 insertions(+), 148 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 7640cb6bd49..cd04ad09b4b 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "270-418" + "GEOS_TPL_TAG": "273-460" } }, "runArgs": [ diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 20d093a79a4..4d814993e90 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -170,19 +170,6 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF - - name: Pecan CPU (centos 7.7, gcc 8.2.0, open-mpi 4.0.1, mkl 2019.5) - CMAKE_BUILD_TYPE: Release - DOCKER_REPOSITORY: geosx/pecan-cpu-gcc8.2.0-openmpi4.0.1-mkl2019.5 - HOST_CONFIG: host-configs/TOTAL/pecan-CPU.cmake - GCP_BUCKET: geosx/Pecan-CPU - - - name: Pangea 2 (centos 7.6, gcc 8.3.0, open-mpi 2.1.5, mkl 2019.3) - CMAKE_BUILD_TYPE: Release - DOCKER_REPOSITORY: geosx/pangea2-gcc8.3.0-openmpi2.1.5-mkl2019.3 - ENABLE_HYPRE: ON - ENABLE_TRILINOS: OFF - GCP_BUCKET: geosx/Pangea2 - - name: Sherlock CPU (centos 7.9.2009, gcc 10.1.0, open-mpi 4.1.2, openblas 0.3.10) CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/sherlock-gcc10.1.0-openmpi4.1.2-openblas0.3.10-zlib1.2.11 @@ -305,16 +292,6 @@ jobs: DOCKER_RUN_ARGS: "--cpus=8 --memory=256g --runtime=nvidia --gpus all -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" DOCKER_CERTS_UPDATE_COMMAND: "update-ca-certificates" - - - name: Centos (7.7, gcc 8.3.1, open-mpi 1.10.7, cuda 11.8.89) - BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" - CMAKE_BUILD_TYPE: Release - DOCKER_REPOSITORY: geosx/centos7.7-gcc8.3.1-cuda11.8.89 - RUNS_ON: streak2 - NPROC: 8 - DOCKER_RUN_ARGS: "--cpus=8 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" - DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" - DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" # compiler error in ElasticFirstOrderWaveEquationSEMKernel::StressComputation::launch in call to FE_TYPE::computeFirstOrderStiffnessTermX # - name: Rockylinux (8, clang 17.0.6, cuda 12.5) @@ -325,20 +302,20 @@ jobs: # NPROC: 2 # DOCKER_RUN_ARGS: "--cpus=1 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" # DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" + # DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" + + # compiler error in ElasticFirstOrderWaveEquationSEMKernel::StressComputation::launch in call to FE_TYPE::computeFirstOrderStiffnessTermX + # - name: Rockylinux (8, gcc 8.5, cuda 12.5) + # BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" + # CMAKE_BUILD_TYPE: Release + # DOCKER_REPOSITORY: geosx/rockylinux8-gcc8-cuda12.5 + # RUNS_ON: streak2 + # NPROC: 2 + # DOCKER_RUN_ARGS: "--cpus=1 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" + # DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" # DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" # Below this line, jobs that deploy to Google Cloud. - - name: Pecan GPU (centos 7.7, gcc 8.2.0, open-mpi 4.0.1, mkl 2019.5, cuda 11.5.119) - BUILD_AND_TEST_CLI_ARGS: "--build-exe-only --no-install-schema" - CMAKE_BUILD_TYPE: Release - DOCKER_REPOSITORY: geosx/pecan-gpu-gcc8.2.0-openmpi4.0.1-mkl2019.5-cuda11.5.119 - HOST_CONFIG: host-configs/TOTAL/pecan-GPU.cmake - RUNS_ON: streak2 - NPROC: 8 - DOCKER_RUN_ARGS: "--cpus=8 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" - DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" - DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" - - name: Sherlock GPU (centos 7.9.2009, gcc 10.1.0, open-mpi 4.1.2, openblas 0.3.10, cuda 11.7.1,) BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" CMAKE_BUILD_TYPE: Release diff --git a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake index 7fa1e0c194a..8e15c2960bd 100644 --- a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake +++ b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake @@ -338,6 +338,31 @@ if(DEFINED CAMP_DIR) endif() endif() +################################ +# FMT +################################ +if(DEFINED FMT_DIR) + message(STATUS "FMT_DIR = ${FMT_DIR}") + + find_package(fmt REQUIRED + PATHS ${FMT_DIR} + NO_DEFAULT_PATH) + + message( " ----> fmt_VERSION = ${fmt_VERSION}") + + get_target_property(includeDirs fmt::fmt-header-only INTERFACE_INCLUDE_DIRECTORIES) + + set_property(TARGET fmt::fmt-header-only + APPEND PROPERTY INTERFACE_SYSTEM_INCLUDE_DIRECTORIES + ${includeDirs}) + + set(ENABLE_FMT ON CACHE BOOL "") + + set(thirdPartyLibs ${thirdPartyLibs} fmt::fmt-header-only ) +else() + mandatory_tpl_doesnt_exist("{fmt}" FMT_DIR) +endif() + ################################ # Umpire ################################ @@ -711,7 +736,7 @@ endif() if(DEFINED TRILINOS_DIR AND ENABLE_TRILINOS) message(STATUS "TRILINOS_DIR = ${TRILINOS_DIR}") - include(${TRILINOS_DIR}/lib/cmake/Trilinos/TrilinosConfig.cmake) + include(${TRILINOS_DIR}/lib64/cmake/Trilinos/TrilinosConfig.cmake) list(REMOVE_ITEM Trilinos_LIBRARIES "gtest") list(REMOVE_DUPLICATES Trilinos_LIBRARIES) @@ -813,30 +838,6 @@ else() message(STATUS "Not using VTK") endif() -################################ -# FMT -################################ -if(DEFINED FMT_DIR) - message(STATUS "FMT_DIR = ${FMT_DIR}") - - find_package(fmt REQUIRED - PATHS ${FMT_DIR} - NO_DEFAULT_PATH) - - message( " ----> fmt_VERSION = ${fmt_VERSION}") - - get_target_property(includeDirs fmt::fmt INTERFACE_INCLUDE_DIRECTORIES) - - set_property(TARGET fmt::fmt - APPEND PROPERTY INTERFACE_SYSTEM_INCLUDE_DIRECTORIES - ${includeDirs}) - - set(ENABLE_FMT ON CACHE BOOL "") - - set(thirdPartyLibs ${thirdPartyLibs} fmt::fmt ) -else() - mandatory_tpl_doesnt_exist("{fmt}" FMT_DIR) -endif() ################################ # uncrustify diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 1d2490252c5..8ddb4c9d258 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 1d2490252c5cc97f87c9da0f5dd305e66f62f2c2 +Subproject commit 8ddb4c9d2589187faad1a847719e49e8638d2792 diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index 1d829c19f2d..223c540ac4e 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -59,8 +59,8 @@ if (TARGET conduit) set( dependencyList ${dependencyList} conduit ) endif() -if (TARGET fmt::fmt) - set( dependencyList ${dependencyList} fmt::fmt ) +if (TARGET fmt::fmt-header-only) + set( dependencyList ${dependencyList} fmt::fmt-header-only ) endif() if (TARGET fmt) diff --git a/src/coreComponents/common/DataTypes.hpp b/src/coreComponents/common/DataTypes.hpp index a4371da71b3..0c3856be91b 100644 --- a/src/coreComponents/common/DataTypes.hpp +++ b/src/coreComponents/common/DataTypes.hpp @@ -684,7 +684,7 @@ struct GEOS_FMT_NS::formatter< std::optional< T > > : GEOS_FMT_NS::formatter< T * @param ctx formatting state consisting of the formatting arguments and the output iterator * @return return the corresponding value string. If std::optional is empty retun an empty string */ - auto format( std::optional< T > const & opt, format_context & ctx ) + auto format( std::optional< T > const & opt, format_context & ctx ) const { if( opt ) { diff --git a/src/coreComponents/common/Format.hpp b/src/coreComponents/common/Format.hpp index a61f88f29cc..1765c7796a0 100644 --- a/src/coreComponents/common/Format.hpp +++ b/src/coreComponents/common/Format.hpp @@ -22,7 +22,9 @@ #endif #ifdef GEOSX_USE_FMT +#ifndef FMT_HEADER_ONLY #define FMT_HEADER_ONLY +#endif // Differentiate between standalone fmt path and umpire's fmt path #include "../include/fmt/core.h" #include "../include/fmt/chrono.h" @@ -63,7 +65,7 @@ struct fmt::formatter< T, std::enable_if_t< std::is_enum< T >::value > > * @return An iterator pointing to the end of the formatted string. */ template< typename FormatContext > - auto format( const T & value, FormatContext & ctx ) + auto format( const T & value, FormatContext & ctx ) const { return fmt::format_to( ctx.out(), "{}", static_cast< std::underlying_type_t< T > >( value ) ); } diff --git a/src/coreComponents/common/Units.hpp b/src/coreComponents/common/Units.hpp index e072dfe460b..c1025f3c2e4 100644 --- a/src/coreComponents/common/Units.hpp +++ b/src/coreComponents/common/Units.hpp @@ -280,7 +280,7 @@ struct GEOS_FMT_NS::formatter< geos::units::TimeFormatInfo > : GEOS_FMT_NS::form * @param ctx formatting state consisting of the formatting arguments and the output iterator * @return iterator to the output buffer */ - auto format( geos::units::TimeFormatInfo const & durationData, format_context & ctx ) + auto format( geos::units::TimeFormatInfo const & durationData, format_context & ctx ) const { return GEOS_FMT_NS::formatter< std::string >::format( durationData.toString(), ctx ); } diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index 6b30face341..aaf4f938d85 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -217,7 +217,7 @@ struct GEOS_FMT_NS::formatter< geos::dataRepository::DataContext > : GEOS_FMT_NS * @param ctx formatting state consisting of the formatting arguments and the output iterator * @return iterator to the output buffer */ - auto format( geos::dataRepository::DataContext const & dataContext, format_context & ctx ) + auto format( geos::dataRepository::DataContext const & dataContext, format_context & ctx ) const { return GEOS_FMT_NS::formatter< std::string >::format( dataContext.toString(), ctx ); } diff --git a/src/coreComponents/functions/unitTests/CMakeLists.txt b/src/coreComponents/functions/unitTests/CMakeLists.txt index 84f7539e085..666d52ed234 100644 --- a/src/coreComponents/functions/unitTests/CMakeLists.txt +++ b/src/coreComponents/functions/unitTests/CMakeLists.txt @@ -19,8 +19,8 @@ if (TARGET pugixml) list( APPEND dependencyList pugixml ) endif() -if (TARGET fmt::fmt) - list( APPEND dependencyList fmt::fmt ) +if (TARGET fmt::fmt-header-only) + list( APPEND dependencyList fmt::fmt-header-only ) endif() if (TARGET fmt) diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp index 886d0a8b009..1ee748c1476 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp @@ -73,23 +73,28 @@ class MGRStrategyBase { public: - static constexpr HYPRE_Int numLevels = NLEVEL; ///< Number of levels + static constexpr HYPRE_Int numLevels = NLEVEL; ///< Number of levels protected: - HYPRE_Int m_numBlocks{ 0 }; ///< Number of different matrix blocks treated separately + HYPRE_Int m_numBlocks{ 0 }; ///< Number of different matrix blocks treated separately - std::vector< HYPRE_Int > m_labels[numLevels]{}; ///< Dof labels kept at each level - HYPRE_Int m_numLabels[numLevels]{ -1 }; ///< Number of dof labels kept - HYPRE_Int * m_ptrLabels[numLevels]{ nullptr }; ///< Pointers to each level's labels, as consumed by MGR + std::vector< HYPRE_Int > m_labels[numLevels]{}; ///< Dof labels kept at each level + HYPRE_Int m_numLabels[numLevels]{ -1 }; ///< Number of dof labels kept + HYPRE_Int * m_ptrLabels[numLevels]{ nullptr }; ///< Pointers to each level's labels, as consumed by MGR - MGRFRelaxationType m_levelFRelaxType[numLevels]; ///< F-relaxation type for each level - HYPRE_Int m_levelFRelaxIters[numLevels]{ -1 }; ///< Number of F-relaxation iterations for each level - MGRInterpolationType m_levelInterpType[numLevels]; ///< Interpolation type for each level - MGRRestrictionType m_levelRestrictType[numLevels]; ///< Restriction type for each level - MGRCoarseGridMethod m_levelCoarseGridMethod[numLevels]; ///< Coarse grid method for each level + MGRFRelaxationType m_levelFRelaxType[numLevels]; ///< F-relaxation type for each level + HYPRE_Int m_levelFRelaxIters[numLevels]{ -1 }; ///< Number of F-relaxation iterations for each level + MGRInterpolationType m_levelInterpType[numLevels]; ///< Interpolation type for each level + MGRRestrictionType m_levelRestrictType[numLevels]; ///< Restriction type for each level + MGRCoarseGridMethod m_levelCoarseGridMethod[numLevels]; ///< Coarse grid method for each level MGRGlobalSmootherType m_levelGlobalSmootherType[numLevels]; ///< Global smoother type for each level - HYPRE_Int m_levelGlobalSmootherIters[numLevels]{ -1 }; ///< Number of global smoother iterations for each level + HYPRE_Int m_levelGlobalSmootherIters[numLevels]{ -1 }; ///< Number of global smoother iterations for each level +#if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CPU + HYPRE_Real m_coarseGridThreshold{ 1.0e-20 }; ///< Coarse grid truncation threshold +#else + HYPRE_Real m_coarseGridThreshold{ 0.0 }; ///< Coarse grid truncation threshold +#endif // TODO: the following options are currently commented out in MGR's code. // Let's consider their use when re-enable in hypre @@ -159,6 +164,7 @@ class MGRStrategyBase GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetCoarseGridMethod( precond.ptr, toUnderlyingPtr( m_levelCoarseGridMethod ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetLevelSmoothType( precond.ptr, toUnderlyingPtr( m_levelGlobalSmootherType ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetLevelSmoothIters( precond.ptr, m_levelGlobalSmootherIters ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetTruncateCoarseGridThreshold( precond.ptr, m_coarseGridThreshold ) ); GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetNonCpointsToFpoints( precond.ptr, 1 )); } diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp index 6bf3d1b9631..583c0310107 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp @@ -515,9 +515,8 @@ enum class MGRCoarseGridMethod : HYPRE_Int //!< approximated by its diagonal inverse cprLikeBlockDiag = 3, //!< Non-Galerkin coarse grid computation with dropping strategy: CPR-like approximation with inv(A_FF) //!< approximated by its block diagonal inverse - approximateInverse = 4, //!< Non-Galerkin coarse grid computation with dropping strategy: inv(A_FF) approximated by sparse approximate + approximateInverse = 4 //!< Non-Galerkin coarse grid computation with dropping strategy: inv(A_FF) approximated by sparse approximate //!< inverse - galerkinRAI = 5 //!< Galerkin coarse grid computation with arbitrary classical restriction and injective prolongation }; /** diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp index 241593eed7f..12d52ddb351 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp @@ -73,7 +73,7 @@ class CompositionalMultiphaseFVM : public MGRStrategyBase< 2 > m_levelFRelaxType[1] = MGRFRelaxationType::none; m_levelInterpType[1] = MGRInterpolationType::injection; m_levelRestrictType[1] = MGRRestrictionType::blockColLumped; // True-IMPES - m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkinRAI; + m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkin; m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::ilu0; m_levelGlobalSmootherIters[1] = 1; } diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp index 7c2f53c845a..deb27e02aa7 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp @@ -82,7 +82,7 @@ class CompositionalMultiphaseHybridFVM : public MGRStrategyBase< 3 > m_levelFRelaxType[1] = MGRFRelaxationType::none; m_levelInterpType[1] = MGRInterpolationType::jacobi; m_levelRestrictType[1] = MGRRestrictionType::blockColLumped; // True-IMPES - m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkinRAI; + m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkin; m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // Level 2 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp index 55b8cfef2a0..7b72438df7e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp @@ -94,7 +94,7 @@ class CompositionalMultiphaseReservoirFVM : public MGRStrategyBase< 3 > m_levelFRelaxType[2] = MGRFRelaxationType::none; m_levelInterpType[2] = MGRInterpolationType::injection; m_levelRestrictType[2] = MGRRestrictionType::blockColLumped; // True-IMPES - m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkinRAI; + m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkin; m_levelGlobalSmootherType[2] = MGRGlobalSmootherType::ilu0; m_levelGlobalSmootherIters[2] = 1; } diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp index 37ea6379208..786663ab896 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp @@ -102,7 +102,7 @@ class CompositionalMultiphaseReservoirHybridFVM : public MGRStrategyBase< 4 > m_levelFRelaxType[2] = MGRFRelaxationType::none; m_levelInterpType[2] = MGRInterpolationType::injection; m_levelRestrictType[2] = MGRRestrictionType::blockColLumped; // True-IMPES - m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkinRAI; + m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkin; m_levelGlobalSmootherType[2] = MGRGlobalSmootherType::none; // Level 3 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp index 22cda3aa388..c575661c4a6 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp @@ -90,7 +90,7 @@ class MultiphasePoromechanics : public MGRStrategyBase< 3 > m_levelFRelaxType[2] = MGRFRelaxationType::none; m_levelInterpType[2] = MGRInterpolationType::injection; m_levelRestrictType[2] = MGRRestrictionType::blockColLumped; // True-IMPES - m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkinRAI; + m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkin; m_levelGlobalSmootherType[2] = MGRGlobalSmootherType::ilu0; m_levelGlobalSmootherIters[2] = 1; } @@ -106,8 +106,6 @@ class MultiphasePoromechanics : public MGRStrategyBase< 3 > { setReduction( precond, mgrData ); - GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetPMaxElmts( precond.ptr, 0 )); - // Configure the BoomerAMG solver used as F-relaxation for the first level setMechanicsFSolver( precond, mgrData ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp index 46397b4519f..cebcb8128b3 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp @@ -83,34 +83,34 @@ class MultiphasePoromechanicsReservoirFVM : public MGRStrategyBase< 4 > setupLabels(); // Level 0 - m_levelFRelaxType[0] = MGRFRelaxationType::amgVCycle; - m_levelFRelaxIters[0] = 1; - m_levelInterpType[0] = MGRInterpolationType::jacobi; - m_levelRestrictType[0] = MGRRestrictionType::injection; - m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::nonGalerkin; - m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; + m_levelFRelaxType[0] = MGRFRelaxationType::amgVCycle; + m_levelFRelaxIters[0] = 1; + m_levelInterpType[0] = MGRInterpolationType::jacobi; + m_levelRestrictType[0] = MGRRestrictionType::injection; + m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::nonGalerkin; + m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; // Level 1 m_levelFRelaxType[1] = MGRFRelaxationType::gsElimWInverse; - m_levelFRelaxIters[1] = 1; - m_levelInterpType[1] = MGRInterpolationType::blockJacobi; - m_levelRestrictType[1] = MGRRestrictionType::injection; - m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkin; - m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; + m_levelFRelaxIters[1] = 1; + m_levelInterpType[1] = MGRInterpolationType::blockJacobi; + m_levelRestrictType[1] = MGRRestrictionType::injection; + m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkin; + m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // Level 2 - m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; //default, i.e. Jacobi - m_levelFRelaxIters[2] = 1; - m_levelInterpType[2] = MGRInterpolationType::jacobi; - m_levelRestrictType[2] = MGRRestrictionType::injection; - m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkin; - m_levelGlobalSmootherType[2] = MGRGlobalSmootherType::none; + m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; //default, i.e. Jacobi + m_levelFRelaxIters[2] = 1; + m_levelInterpType[2] = MGRInterpolationType::jacobi; + m_levelRestrictType[2] = MGRRestrictionType::injection; + m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::galerkin; + m_levelGlobalSmootherType[2] = MGRGlobalSmootherType::none; // Level 3 m_levelFRelaxType[3] = MGRFRelaxationType::none; m_levelInterpType[3] = MGRInterpolationType::injection; m_levelRestrictType[3] = MGRRestrictionType::blockColLumped; // True-IMPES - m_levelCoarseGridMethod[3] = MGRCoarseGridMethod::galerkinRAI; + m_levelCoarseGridMethod[3] = MGRCoarseGridMethod::galerkin; m_levelGlobalSmootherType[3] = MGRGlobalSmootherType::ilu0; m_levelGlobalSmootherIters[3] = 1; } @@ -134,8 +134,6 @@ class MultiphasePoromechanicsReservoirFVM : public MGRStrategyBase< 4 > setReduction( precond, mgrData ); - GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetPMaxElmts( precond.ptr, 0 )); - // Configure the BoomerAMG solver used as F-relaxation for the first level setMechanicsFSolver( precond, mgrData ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp index dd1b14b568d..099a3fe1ed8 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp @@ -78,8 +78,6 @@ class SinglePhasePoromechanics : public MGRStrategyBase< 1 > { setReduction( precond, mgrData ); - GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetPMaxElmts( precond.ptr, 0 )); - // Configure the BoomerAMG solver used as F-relaxation for the first level setMechanicsFSolver( precond, mgrData ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp index 65341d2ba90..743d280989c 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp @@ -21,8 +21,6 @@ #include "linearAlgebra/interfaces/hypre/HypreMGR.hpp" -#define BRANCH_MGR_FSOLVER - namespace geos { @@ -103,7 +101,6 @@ class SinglePhasePoromechanicsConformingFractures : public MGRStrategyBase< 2 > HypreMGRData & mgrData ) { setReduction( precond, mgrData ); - GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetPMaxElmts( precond.ptr, 0 )); // Configure the BoomerAMG solver used as F-relaxation for the second level GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGCreate( &mgrData.mechSolver.ptr ) ); @@ -121,7 +118,7 @@ class SinglePhasePoromechanicsConformingFractures : public MGRStrategyBase< 2 > #else GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxOrder( mgrData.mechSolver.ptr, 1 ) ); #endif - GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetFSolverAtLevel( 1, precond.ptr, mgrData.mechSolver.ptr ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetFSolverAtLevel( precond.ptr, mgrData.mechSolver.ptr, 1 ) ); // Configure the BoomerAMG solver used as mgr coarse solver for the pressure reduced system setPressureAMG( mgrData.coarseSolver ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp index 36d8051f1ad..b4e999b71c7 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -82,7 +82,6 @@ class SinglePhasePoromechanicsEmbeddedFractures : public MGRStrategyBase< 2 > m_levelInterpType[1] = MGRInterpolationType::jacobi; m_levelRestrictType[1] = MGRRestrictionType::injection; m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::nonGalerkin; - } /** @@ -96,8 +95,6 @@ class SinglePhasePoromechanicsEmbeddedFractures : public MGRStrategyBase< 2 > { setReduction( precond, mgrData ); - GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetPMaxElmts( precond.ptr, 0 )); - // Configure the BoomerAMG solver used as F-relaxation for the second level GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGCreate( &mgrData.mechSolver.ptr ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetTol( mgrData.mechSolver.ptr, 0.0 ) ); @@ -114,7 +111,7 @@ class SinglePhasePoromechanicsEmbeddedFractures : public MGRStrategyBase< 2 > #else GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxOrder( mgrData.mechSolver.ptr, 1 ) ); #endif - GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetFSolverAtLevel( 1, precond.ptr, mgrData.mechSolver.ptr ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetFSolverAtLevel( precond.ptr, mgrData.mechSolver.ptr, 1 ) ); // Configure the BoomerAMG solver used as mgr coarse solver for the pressure reduced system setPressureAMG( mgrData.coarseSolver ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp index 97ace112cf8..6ae74593e42 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp @@ -74,7 +74,7 @@ class SinglePhasePoromechanicsReservoirFVM : public MGRStrategyBase< 2 > m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; // Level 1 - m_levelFRelaxType[1] = MGRFRelaxationType::gsElimWInverse; + m_levelFRelaxType[1] = MGRFRelaxationType::gsElimWInverse; m_levelFRelaxIters[1] = 1; m_levelInterpType[1] = MGRInterpolationType::blockJacobi; m_levelRestrictType[1] = MGRRestrictionType::injection; @@ -93,8 +93,6 @@ class SinglePhasePoromechanicsReservoirFVM : public MGRStrategyBase< 2 > { setReduction( precond, mgrData ); - GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetPMaxElmts( precond.ptr, 0 )); - // Configure the BoomerAMG solver used as F-relaxation for the first level setMechanicsFSolver( precond, mgrData ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp index 22f11501731..b367a44af14 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp @@ -64,7 +64,7 @@ class SolidMechanicsEmbeddedFractures : public MGRStrategyBase< 1 > setupLabels(); // Level 0 - m_levelFRelaxType[0] = MGRFRelaxationType::gsElimWInverse; + m_levelFRelaxType[0] = MGRFRelaxationType::jacobi; m_levelFRelaxIters[0] = 1; m_levelInterpType[0] = MGRInterpolationType::blockJacobi; m_levelRestrictType[0] = MGRRestrictionType::injection; @@ -82,7 +82,6 @@ class SolidMechanicsEmbeddedFractures : public MGRStrategyBase< 1 > HypreMGRData & mgrData ) { setReduction( precond, mgrData ); - GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetPMaxElmts( precond.ptr, 0 )); // Configure the BoomerAMG solver used as mgr coarse solver for the displacement reduced system setDisplacementAMG( mgrData.coarseSolver ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp index bf12729ff28..07010dcde84 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp @@ -109,8 +109,6 @@ class ThermalMultiphasePoromechanics : public MGRStrategyBase< 3 > { setReduction( precond, mgrData ); - GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetPMaxElmts( precond.ptr, 0 )); - // CHECK: the mechanics solver setup was missing: was there a reason? // Configure the BoomerAMG solver used as F-relaxation for the first level setMechanicsFSolver( precond, mgrData ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp index 69933bab004..0e0c9943242 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp @@ -80,8 +80,6 @@ class ThermalSinglePhasePoromechanics : public MGRStrategyBase< 1 > { setReduction( precond, mgrData ); - GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetPMaxElmts( precond.ptr, 0 )); - // CHECK: the mechanics solver setup was missing: was there a reason? // Configure the BoomerAMG solver used as F-relaxation for the first level setMechanicsFSolver( precond, mgrData ); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp index a7e7ce7eb26..f67aae8b7e4 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp @@ -32,8 +32,8 @@ namespace solidMechanicsMPMKernels // A helper function to calculate polar decomposition. TODO: Previously this was an LvArray method, hopefully it will be again someday. GEOS_HOST_DEVICE -void polarDecomposition( real64 (& R)[3][3], - real64 const (&matrix)[3][3] ) +static inline void polarDecomposition( real64 (& R)[3][3], + real64 const (&matrix)[3][3] ) { // Initialize LvArray::tensorOps::copy< 3, 3 >( R, matrix ); diff --git a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt index 44890ac660a..4cd367870a3 100644 --- a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt @@ -54,8 +54,8 @@ if (TARGET pugixml) list( APPEND dependencyList pugixml ) endif() -if (TARGET fmt::fmt) - list( APPEND dependencyList fmt::fmt ) +if (TARGET fmt::fmt-header-only) + list( APPEND dependencyList fmt::fmt-header-only ) endif() if (TARGET fmt) diff --git a/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt b/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt index 56a290d20b9..d7e95eab658 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt @@ -23,8 +23,8 @@ if (TARGET pugixml) list( APPEND dependencyList pugixml ) endif() -if (TARGET fmt::fmt) - list( APPEND dependencyList fmt::fmt ) +if (TARGET fmt::fmt-header-only) + list( APPEND dependencyList fmt::fmt-header-only ) endif() if (TARGET fmt) diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt b/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt index a49b0723762..2f958adf82e 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt @@ -21,8 +21,8 @@ if (TARGET pugixml) list( APPEND dependencyList pugixml ) endif() -if (TARGET fmt::fmt) - list( APPEND dependencyList fmt::fmt ) +if (TARGET fmt::fmt-header-only) + list( APPEND dependencyList fmt::fmt-header-only ) endif() if (TARGET fmt) diff --git a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt index 2abdc8e16cf..6788feb559a 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt @@ -32,8 +32,8 @@ if (TARGET pugixml) list( APPEND dependencyList pugixml ) endif() -if (TARGET fmt::fmt) - list( APPEND dependencyList fmt::fmt ) +if (TARGET fmt::fmt-header-only) + list( APPEND dependencyList fmt::fmt-header-only ) endif() if (TARGET fmt) diff --git a/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt b/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt index d05530ef8a0..8d6973ba965 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt @@ -22,8 +22,8 @@ if (TARGET pugixml) set( dependencyList ${dependencyList} pugixml ) endif() -if (TARGET fmt::fmt) - set( dependencyList ${dependencyList} fmt::fmt ) +if (TARGET fmt::fmt-header-only) + set( dependencyList ${dependencyList} fmt::fmt-header-only ) endif() if (TARGET fmt) diff --git a/src/coreComponents/unitTests/meshTests/CMakeLists.txt b/src/coreComponents/unitTests/meshTests/CMakeLists.txt index c9903e0e5c6..7e27010add8 100644 --- a/src/coreComponents/unitTests/meshTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/meshTests/CMakeLists.txt @@ -35,8 +35,8 @@ if (TARGET pugixml) list( APPEND dependencyList pugixml ) endif() -if (TARGET fmt::fmt) - list( APPEND dependencyList fmt::fmt ) +if (TARGET fmt::fmt-header-only) + list( APPEND dependencyList fmt::fmt-header-only ) endif() if (TARGET fmt) diff --git a/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt b/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt index ad301d299ba..0ba1fe88d75 100644 --- a/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt @@ -18,8 +18,8 @@ if (TARGET pugixml) list( APPEND dependencyList pugixml ) endif() -if (TARGET fmt::fmt) - list( APPEND dependencyList fmt::fmt ) +if (TARGET fmt::fmt-header-only) + list( APPEND dependencyList fmt::fmt-header-only ) endif() if (TARGET fmt) diff --git a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt index c2e2f79bdc1..5f61293c506 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt @@ -24,8 +24,8 @@ if (TARGET pugixml) list( APPEND dependencyList pugixml ) endif() -if (TARGET fmt::fmt) - list( APPEND dependencyList fmt::fmt ) +if (TARGET fmt::fmt-header-only) + list( APPEND dependencyList fmt::fmt-header-only ) endif() if (TARGET fmt) diff --git a/src/coreComponents/unitTests/wellsTests/CMakeLists.txt b/src/coreComponents/unitTests/wellsTests/CMakeLists.txt index dcf6a699034..4167bd25776 100644 --- a/src/coreComponents/unitTests/wellsTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wellsTests/CMakeLists.txt @@ -26,8 +26,8 @@ if (TARGET pugixml) list( APPEND dependencyList pugixml ) endif() -if (TARGET fmt::fmt) - list( APPEND dependencyList fmt::fmt ) +if (TARGET fmt::fmt-header-only) + list( APPEND dependencyList fmt::fmt-header-only ) endif() if (TARGET fmt) From d5abbd49b8c5c1bf4b29c9a2236255813662b1c2 Mon Sep 17 00:00:00 2001 From: Lionel Untereiner Date: Fri, 12 Jul 2024 07:49:14 +0200 Subject: [PATCH 134/286] Update the documentation with conventional commit prefixes (#3220) --- .../developerGuide/Contributing/GitWorkflow.rst | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/docs/sphinx/developerGuide/Contributing/GitWorkflow.rst b/src/docs/sphinx/developerGuide/Contributing/GitWorkflow.rst index ffc7eb48097..c3cd039dc12 100644 --- a/src/docs/sphinx/developerGuide/Contributing/GitWorkflow.rst +++ b/src/docs/sphinx/developerGuide/Contributing/GitWorkflow.rst @@ -333,6 +333,22 @@ Once you are satisfied with your work on the branch, you may promote the PR out draft status, which will allow our integrated testing suite to execute on the PR branch to ensure all tests are passing prior to merging. +.. note:: + The title of a PR has to follow the `conventional commit specification `_. + The allowed prefixes are: + + - feat: A new feature + - fix: A bug fix, + - docs: Documentation only changes, + - style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc), + - refactor: A code change that neither fixes a bug nor adds a feature, + - perf: A code change that improves performance, + - test: Adding missing tests or correcting existing tests, + - build: Changes that affect the build system or external dependencies (example scopes: cmake), + - ci: Changes to our CI configuration files and scripts (example scopes: github), + - chore: Other changes that don't modify src or test files, + - revert: Reverts a previous commit, + Once the tests are passing -- or in some cases immediately -- add the `flag: ready for review` label to the PR, and be sure to tag any relevant developers to review the PR. The PR *must* be approved by reviewers in order to be merged. From 0d001855e3375162e58b447d63769537a612e491 Mon Sep 17 00:00:00 2001 From: Jian Huang <53012159+jhuang2601@users.noreply.github.com> Date: Fri, 12 Jul 2024 02:22:53 -0500 Subject: [PATCH 135/286] docs: update publications (#3216) * Update Publications.rst * Update Publications.rst --------- Co-authored-by: Ryan Aronson Co-authored-by: Nicola Castelletto <38361926+castelletto1@users.noreply.github.com> Co-authored-by: Randolph Settgast --- src/docs/sphinx/Publications.rst | 70 +++++++++++++++++++++++++++----- 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/src/docs/sphinx/Publications.rst b/src/docs/sphinx/Publications.rst index d550927c21b..e3c1ef438c7 100644 --- a/src/docs/sphinx/Publications.rst +++ b/src/docs/sphinx/Publications.rst @@ -2,18 +2,71 @@ Publications ############################################################################### -Last updated 5-September-2023 +Last updated 9-July-2024 Preprints and Early-Views ========================= +2024 +==== + +.. list-table:: + :widths: 100 + :header-rows: 0 + + * - | **A benchmark study on reactive two-phase flow in porous media: Part II - results and discussion** + | E Ahusborde, B Amaziane, S de Hoop, M El Ossmani, E Flauraud, FP Hamon, M Kern, A Socié, D Su, KU Mayer, M Tóth, D Voskov + | Computational Geosciences + | `doi.org/10.1007/s10596-024-10269-y `_ + + * - | **Pressure-stabilized fixed-stress iterative solutions of compositional poromechanics** + | RM Aronson, N Castelletto, FP Hamon, JA White, HA Tchelepi + | Computer Methods in Applied Mechanics and Engineering + | `doi:10.1016/j.cma.2024.117008 `_ + + * - | **Managing reservoir dynamics when converting natural gas fields to underground hydrogen storage** + | JT Camargo, JA White, FP Hamon, V Fakeye, TA Buscheck, N Huerta + | International Journal of Hydrogen Energy + | `doi.org/10.1016/j.ijhydene.2023.09.165 `_ + + * - | **Constrained pressure-temperature residual (CPTR) preconditioner performance for large-scale thermal CO2 injection simulation** + | MA Cremon, J Franc, FP Hamon + | Computational Geosciences + | `doi.org/10.1007/s10596-024-10292-z `_ + + * - | **Surrogate model for geological CO2 storage and its use in hierarchical MCMC history matching** + | Y Han, FP Hamon, S Jiang, LJ Durlofsky + | Advances in Water Resources + | `doi:10.1016/j.advwatres.2024.104678 `_ + + * - | **Simulation of Multiphase Flow and Poromechanical Effects Around Injection Wells in CO2 Storage Sites** + | J Huang, F Hamon, M Cusini, T Gazzola, RR Settgast, JA White, H Gross + | Rock Mechanics and Rock Engineering + | `doi:10.1007/s00603-024-04051-w `_ + + * - | **Multilevel well modeling in aggregation-based nonlinear multigrid for multiphase flow in porous media** + | CS Lee, FP Hamon, N Castelletto, PS Vassilevski, JA White + | Journal of Computational Physics + | `doi:10.1016/j.jcp.2024.113163 `_ + + 2023 ==== -* - | **A phase-field model for hydraulic fracture nucleation and propagation in porous media** - | F Fei, A Costa, JE Dolbow, R Settgast, M Cusini - | International Journal for Numerical and Analytical Methods in Geomechanics - | `doi.org/10.1002/nag.3612 `_ +.. list-table:: + :widths: 100 + :header-rows: 0 + + * - | **A phase-field model for hydraulic fracture nucleation and propagation in porous media** + | F Fei, A Costa, JE Dolbow, R Settgast, M Cusini + | International Journal for Numerical and Analytical Methods in Geomechanics + | `doi.org/10.1002/nag.3612 `_ + + * - | **Validation and Application of a Three-Dimensional Model for Simulating Proppant Transport and Fracture Conductivity** + | J Huang, Y Hao, RR Settgast, JA White, K Mateen, H Gross + | Rock Mechanics and Rock Engineering + | `doi:10.1007/s00603-022-03092-3 `_ + 2022 ==== @@ -52,13 +105,8 @@ Preprints and Early-Views | Computers & Mathematics with Applications | `doi:10.1016/j.camwa.2021.11.015 `_ - * - | **Validation and Application of a Three-Dimensional Model for Simulating Proppant Transport and Fracture Conductivity** - | J Huang, Y Hao, RR Settgast, JA White, K Mateen, H Gross - | Rock Mechanics and Rock Engineering - | `doi:10.1007/s00603-022-03092-3 `_ - * - | **An aggregation-based nonlinear multigrid solver for two-phase flow and transport in porous media** - | CS Lee, F Hamon, N Castelletto, PS Vassilevski, JA White + | CS Lee, FP Hamon, N Castelletto, PS Vassilevski, JA White | Computers & Mathematics with Applications | `doi:10.1016/j.camwa.2022.03.026 `_ From a7ddc53638bc37ac1927904e0c1d4e4dad754cda Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Fri, 12 Jul 2024 08:23:30 +0100 Subject: [PATCH 136/286] fix: Bugfix/semantic pull request fix (#3221) * fix: do Not require successful conventional semantic job --------- Co-authored-by: Lionel Untereiner --- .github/workflows/ci_tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 4d814993e90..3ff30d80e21 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -26,7 +26,7 @@ jobs: if: github.event_name == 'pull_request' steps: - name: Check if the PR name has conventional semantics - uses: amannn/action-semantic-pull-request@e9fabac35e210fea40ca5b14c0da95a099eff26f # v5.4.0 + uses: amannn/action-semantic-pull-request@v5.5.3 id: lint_pr_title env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -38,6 +38,7 @@ jobs: # Jobs will be cancelled if PR is a draft. # PR status must be "Open" to run CI. is_not_draft_pull_request: + if: ${{ always() }} needs: [semantic_pull_request] # Everywhere in this workflow, we use the most recent ubuntu distribution available in Github Actions # to ensure maximum support of google cloud's sdk. From 9a144b870567192f669eca49ff8606d52d559ffa Mon Sep 17 00:00:00 2001 From: Lionel Untereiner Date: Mon, 15 Jul 2024 09:40:00 +0200 Subject: [PATCH 137/286] fix: another shot to fix workflow (#3225) --- .github/workflows/ci_tests.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 3ff30d80e21..3dbd60a303f 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -23,9 +23,10 @@ jobs: statuses: write # for amannn/action-semantic-pull-request to mark status of analyzed PR contents: read runs-on: ubuntu-latest - if: github.event_name == 'pull_request' + steps: - name: Check if the PR name has conventional semantics + if: github.event_name == 'pull_request' uses: amannn/action-semantic-pull-request@v5.5.3 id: lint_pr_title env: @@ -34,11 +35,16 @@ jobs: wip: true # Configure that a scope doesn't need to be provided. requireScope: false + + - name: Skip the check on develop branch + if: github.ref_name == 'develop' + run: | + echo "This in't a Pull-Request, skipping" # Jobs will be cancelled if PR is a draft. # PR status must be "Open" to run CI. is_not_draft_pull_request: - if: ${{ always() }} + # if: ${{ always() }} needs: [semantic_pull_request] # Everywhere in this workflow, we use the most recent ubuntu distribution available in Github Actions # to ensure maximum support of google cloud's sdk. From 5fe43d6ac955c0ed1b113faf87d828e94ea74a2a Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 17 Jul 2024 21:19:39 +0100 Subject: [PATCH 138/286] chore: Update blt, RAJA, CHAI, Caliper, adiak, conduit (#3218) * update blt to 0.6.2 * update RAJA and CHAI to v2024.02.2 * update Caliper to 2.11.0 *update adiak to 0.4.0 * update conduit to 0.9.2 * change to new HDF import. use umpires fmt and add extra dependency to executable * changes for change in raja interface * move src/coreComponents/unitTests/dataRepository/testPacking.cpp to src/coreComponents/dataRepository/unitTests * switched to syncronous packing/upacking to avoid test failures on CI image running on streak --- .devcontainer/devcontainer.json | 2 +- host-configs/apple/darwin-clang.cmake | 2 +- host-configs/tpls.cmake | 4 +- scripts/ci_build_and_test_in_container.sh | 2 +- src/CMakeLists.txt | 13 +++-- src/cmake/blt | 2 +- src/cmake/thirdparty/FindHDF5.cmake | 27 ---------- .../thirdparty/SetupGeosxThirdParty.cmake | 28 ++++------ src/coreComponents/CMakeLists.txt | 2 +- src/coreComponents/LvArray | 2 +- .../common/GEOS_RAJA_Interface.hpp | 4 +- .../common/unitTests/CMakeLists.txt | 2 +- .../common/unitTests/testLifoStorage.cpp | 4 +- .../dataRepository/BufferOpsDevice.cpp | 18 ++++--- .../dataRepository/unitTests/CMakeLists.txt | 1 + .../unitTests}/testPacking.cpp | 51 ++++++++++++++++--- src/coreComponents/fileIO/CMakeLists.txt | 6 +-- .../fileIO/coupling/hdf5_interface | 2 +- .../constitutiveTests/CMakeLists.txt | 4 +- .../dataRepositoryTests/CMakeLists.txt | 5 +- .../fieldSpecificationTests/CMakeLists.txt | 4 +- .../unitTests/fileIOTests/CMakeLists.txt | 2 +- .../finiteVolumeTests/CMakeLists.txt | 4 +- .../unitTests/fluidFlowTests/CMakeLists.txt | 4 +- .../linearAlgebraTests/CMakeLists.txt | 4 +- .../unitTests/meshTests/CMakeLists.txt | 4 +- .../unitTests/testingUtilities/CMakeLists.txt | 4 +- .../unitTests/toolchain/CMakeLists.txt | 2 +- .../virtualElementTests/CMakeLists.txt | 4 +- .../wavePropagationTests/CMakeLists.txt | 4 +- .../unitTests/wellsTests/CMakeLists.txt | 4 +- .../unitTests/xmlTests/CMakeLists.txt | 6 +-- 32 files changed, 119 insertions(+), 108 deletions(-) delete mode 100644 src/cmake/thirdparty/FindHDF5.cmake rename src/coreComponents/{unitTests/dataRepositoryTests => dataRepository/unitTests}/testPacking.cpp (81%) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index cd04ad09b4b..0709f76979f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "273-460" + "GEOS_TPL_TAG": "275-480" } }, "runArgs": [ diff --git a/host-configs/apple/darwin-clang.cmake b/host-configs/apple/darwin-clang.cmake index adbc7ac1fa7..e2ad859cce1 100644 --- a/host-configs/apple/darwin-clang.cmake +++ b/host-configs/apple/darwin-clang.cmake @@ -20,7 +20,7 @@ set(ENABLE_OPENMP "OFF" CACHE PATH "" FORCE) set(ENABLE_CALIPER "OFF" CACHE PATH "" FORCE ) -set(GEOSX_BUILD_OBJ_LIBS ON CACHE BOOL "" FORCE) +#set(GEOSX_BUILD_OBJ_LIBS ON CACHE BOOL "" FORCE) set( BLAS_LIBRARIES /usr/local/opt/openblas/lib/libblas.dylib CACHE PATH "" FORCE ) set( LAPACK_LIBRARIES /usr/local/opt/openblas/lib/liblapack.dylib CACHE PATH "" FORCE ) diff --git a/host-configs/tpls.cmake b/host-configs/tpls.cmake index 239774a66db..94fdabff495 100644 --- a/host-configs/tpls.cmake +++ b/host-configs/tpls.cmake @@ -53,7 +53,9 @@ if(EXISTS ${GEOSX_TPL_DIR}/vtk) endif() if(EXISTS ${GEOSX_TPL_DIR}/fmt) - set(FMT_DIR ${GEOSX_TPL_DIR}/fmt CACHE PATH "" FORCE) +# set(FMT_DIR ${GEOSX_TPL_DIR}/fmt CACHE PATH "" FORCE) + set(FMT_DIR ${GEOSX_TPL_DIR}/chai CACHE PATH "" FORCE) +# /Users/settgast1/Codes/geos/thirdPartyLibs/install-macOS_arm-release/chai/lib/cmake/fmt/fmt-targets.cmake endif() # diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index 33faba11f8c..73b9f3899ff 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -330,4 +330,4 @@ if [[ ! -z "${INTEGRATED_TEST_EXIT_STATUS+x}" ]]; then else echo "Exiting the build process with exit status 0." exit 0 -fi \ No newline at end of file +fi diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 54b7a3f9bfd..a4992664bb2 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -144,16 +144,21 @@ endif() blt_add_executable( NAME geosx SOURCES main/main.cpp DEPENDS_ON ${extraComponentsLinkList} - ${externalComponentsLinkList} ) + ${externalComponentsLinkList} fmt::fmt-header-only HDF5::HDF5 ) + +# blt_print_target_properties(TARGET geosx +# CHILDREN TRUE +# PROPERTY_NAME_REGEX "LINK_LIBRARIES" +# ) + +# blt_print_target_properties(TARGET HDF5::HDF5 +# CHILDREN TRUE ) # Seems to be required on some CMake versions (e.g. 3.16) to get enforce device linking if( ${ENABLE_HYPRE_DEVICE} STREQUAL "CUDA" ) set_target_properties( geosx PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS TRUE ) endif() -# Removing all transitive link dependencies from geosx_core target to circumvent -# the BLT behavior which imposes all dependencies to be public -#set_target_properties(geosx_core PROPERTIES INTERFACE_LINK_LIBRARIES "") target_include_directories( geosx PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/cmake/blt b/src/cmake/blt index 5a792c1775e..9ff77344f0b 160000 --- a/src/cmake/blt +++ b/src/cmake/blt @@ -1 +1 @@ -Subproject commit 5a792c1775e7a7628d84dcde31652a689f1df7b5 +Subproject commit 9ff77344f0b2a6ee345e452bddd6bfd46cbbfa35 diff --git a/src/cmake/thirdparty/FindHDF5.cmake b/src/cmake/thirdparty/FindHDF5.cmake deleted file mode 100644 index 32b5c363c2e..00000000000 --- a/src/cmake/thirdparty/FindHDF5.cmake +++ /dev/null @@ -1,27 +0,0 @@ -############################################################################### -# Setup HDF5 -# Wrapper around standard CMake' HDF5 Find Logic. -# - -if(NOT HDF5_DIR) - MESSAGE(FATAL_ERROR "Could not find HDF5. HDF5 support needs explicit HDF5_DIR") -endif() - -# CMake's FindHDF5 module uses the HDF5_ROOT env var -set(HDF5_ROOT ${HDF5_DIR}) -set(ENV{HDF5_ROOT} ${HDF5_ROOT}/bin) - -# Use CMake's FindHDF5 module, which uses hdf5's compiler wrappers to extract -# all the info about the hdf5 install -set( HDF5_USE_STATIC_LIBRARIES FALSE ) - -include(FindHDF5) - -message(STATUS "HDF5_INCLUDE_DIRS: ${HDF5_INCLUDE_DIRS}") -message(STATUS "HDF5_LIBRARIES: ${HDF5_LIBRARIES}") - -# FindHDF5 sets HDF5_DIR to it's installed CMake info if it exists -# we want to keep HDF5_DIR as the root dir of the install to be -# consistent with other packages - -set(HDF5_DIR ${HDF5_ROOT} CACHE PATH "" FORCE) diff --git a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake index 8e15c2960bd..4f8394bc5bd 100644 --- a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake +++ b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake @@ -216,27 +216,16 @@ endif() if(DEFINED HDF5_DIR) message(STATUS "HDF5_DIR = ${HDF5_DIR}") - set(HDF5_ROOT ${HDF5_DIR}) - set(HDF5_USE_STATIC_LIBRARIES FALSE) - set(HDF5_NO_FIND_PACKAGE_CONFIG_FILE ON) - include(FindHDF5) - - # On some platforms (Summit) HDF5 lists /usr/include in it's list of include directories. - # When this happens you can get really opaque include errors. - list(REMOVE_ITEM HDF5_INCLUDE_DIRS /usr/include) - - blt_import_library(NAME hdf5 - INCLUDES ${HDF5_INCLUDE_DIRS} - LIBRARIES ${HDF5_LIBRARIES} - TREAT_INCLUDES_AS_SYSTEM ON) + find_package(HDF5 REQUIRED + PATHS ${HDF5_DIR} + NO_DEFAULT_PATH) - file(READ "${HDF5_DIR}/include/H5public.h" header_file ) - string(REGEX MATCH "version: *([0-9]+.[0-9]+.[0-9]+)" _ ${header_file}) - set( HDF5_VERSION "${CMAKE_MATCH_1}" CACHE STRING "" FORCE ) message( " ----> HDF5 version ${HDF5_VERSION}") + blt_convert_to_system_includes(TARGET HDF5::HDF5) + set(ENABLE_HDF5 ON CACHE BOOL "") - set(thirdPartyLibs ${thirdPartyLibs} hdf5) + set(thirdPartyLibs ${thirdPartyLibs} HDF5::HDF5 ) else() mandatory_tpl_doesnt_exist("hdf5" HDF5_DIR) endif() @@ -252,7 +241,7 @@ if(DEFINED SILO_DIR AND ENABLE_SILO) LIBRARY_DIRECTORIES ${SILO_DIR}/lib HEADER silo.h LIBRARIES siloh5 - DEPENDS hdf5) + DEPENDS HDF5::HDF5 ) set(ENABLE_SILO ON CACHE BOOL "") @@ -344,7 +333,7 @@ endif() if(DEFINED FMT_DIR) message(STATUS "FMT_DIR = ${FMT_DIR}") - find_package(fmt REQUIRED + find_package(FMT REQUIRED PATHS ${FMT_DIR} NO_DEFAULT_PATH) @@ -356,6 +345,7 @@ if(DEFINED FMT_DIR) APPEND PROPERTY INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${includeDirs}) + set(ENABLE_FMT ON CACHE BOOL "") set(thirdPartyLibs ${thirdPartyLibs} fmt::fmt-header-only ) diff --git a/src/coreComponents/CMakeLists.txt b/src/coreComponents/CMakeLists.txt index da5b68dbd54..8050c7ba735 100644 --- a/src/coreComponents/CMakeLists.txt +++ b/src/coreComponents/CMakeLists.txt @@ -73,7 +73,7 @@ if( GEOSX_BUILD_SHARED_LIBS AND GEOSX_BUILD_OBJ_LIBS ) message( "Building shared geosx_core library with object coreComponents, executables link to geosx_core" ) blt_add_library ( NAME geosx_core SOURCES dummy.cpp - DEPENDS_ON mainInterface physicsSolvers + DEPENDS_ON mainInterface physicsSolvers HDF5::HDF5 SHARED TRUE ) elseif( GEOSX_BUILD_SHARED_LIBS AND NOT GEOSX_BUILD_OBJ_LIBS ) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 8ddb4c9d258..5082ef8f367 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 8ddb4c9d2589187faad1a847719e49e8638d2792 +Subproject commit 5082ef8f3673fdb7c5f417b8de2589a5c1c42e55 diff --git a/src/coreComponents/common/GEOS_RAJA_Interface.hpp b/src/coreComponents/common/GEOS_RAJA_Interface.hpp index 2aad742dc77..806e022f3f4 100644 --- a/src/coreComponents/common/GEOS_RAJA_Interface.hpp +++ b/src/coreComponents/common/GEOS_RAJA_Interface.hpp @@ -170,8 +170,8 @@ struct PolicyMap< RAJA::omp_parallel_for_exec > #endif #if defined(GEOS_USE_CUDA) -template< typename X, typename Y, size_t BLOCK_SIZE, bool ASYNC > -struct PolicyMap< RAJA::policy::cuda::cuda_exec_explicit< X, Y, BLOCK_SIZE, ASYNC > > +template< typename X, typename Y, typename C, size_t BLOCK_SIZE, bool ASYNC > +struct PolicyMap< RAJA::policy::cuda::cuda_exec_explicit< X, Y, C, BLOCK_SIZE, ASYNC > > { using atomic = RAJA::cuda_atomic; using reduce = RAJA::cuda_reduce; diff --git a/src/coreComponents/common/unitTests/CMakeLists.txt b/src/coreComponents/common/unitTests/CMakeLists.txt index 814fd512cec..1a1c94208d5 100644 --- a/src/coreComponents/common/unitTests/CMakeLists.txt +++ b/src/coreComponents/common/unitTests/CMakeLists.txt @@ -11,7 +11,7 @@ if ( ENABLE_CALIPER ) testCaliperSmoke.cpp ) endif() -set( dependencyList ${parallelDeps} common hdf5 gtest ) +set( dependencyList ${parallelDeps} common HDF5::HDF5 gtest ) # Add gtest C++ based tests foreach(test ${gtest_geosx_tests}) diff --git a/src/coreComponents/common/unitTests/testLifoStorage.cpp b/src/coreComponents/common/unitTests/testLifoStorage.cpp index 3890f6bc468..5a0b5e8b415 100644 --- a/src/coreComponents/common/unitTests/testLifoStorage.cpp +++ b/src/coreComponents/common/unitTests/testLifoStorage.cpp @@ -58,8 +58,8 @@ struct RAJAHelper< parallelHostPolicy > template< unsigned long THREADS_PER_BLOCK > using devicePolicy = RAJA::cuda_exec< THREADS_PER_BLOCK >; -template< typename X, typename Y, size_t BLOCK_SIZE, bool ASYNC > -struct RAJAHelper< RAJA::policy::cuda::cuda_exec_explicit< X, Y, BLOCK_SIZE, ASYNC > > +template< typename X, typename Y, typename C, size_t BLOCK_SIZE, bool ASYNC > +struct RAJAHelper< RAJA::policy::cuda::cuda_exec_explicit< X, Y, C, BLOCK_SIZE, ASYNC > > { using ReducePolicy = RAJA::cuda_reduce; using AtomicPolicy = RAJA::cuda_atomic; diff --git a/src/coreComponents/dataRepository/BufferOpsDevice.cpp b/src/coreComponents/dataRepository/BufferOpsDevice.cpp index 91c40a67bb7..e1e0462f645 100644 --- a/src/coreComponents/dataRepository/BufferOpsDevice.cpp +++ b/src/coreComponents/dataRepository/BufferOpsDevice.cpp @@ -87,15 +87,16 @@ template< bool DO_PACKING, typename T, int NDIM, int USD > typename std::enable_if< can_memcpy< T >, localIndex >::type PackDataDevice( buffer_unit_type * & buffer, ArrayView< T const, NDIM, USD > const & var, - parallelDeviceEvents & events ) + parallelDeviceEvents & GEOS_UNUSED_PARAM( events ) ) { if( DO_PACKING ) { - parallelDeviceStream stream; - events.emplace_back( forAll< parallelDeviceAsyncPolicy<> >( stream, var.size(), [=] GEOS_DEVICE ( localIndex ii ) +// parallelDeviceStream stream; +// events.emplace_back( forAll< parallelDeviceAsyncPolicy<> >( stream, var.size(), [=] GEOS_DEVICE ( localIndex ii ) + forAll< parallelDevicePolicy<> >( var.size(), [=] GEOS_DEVICE ( localIndex ii ) { reinterpret_cast< std::remove_const_t< T > * >( buffer )[ ii ] = var.data()[ ii ]; - } ) ); + } ); } localIndex packedSize = var.size() * sizeof(T); if( DO_PACKING ) @@ -121,13 +122,14 @@ template< typename T, int NDIM, int USD > typename std::enable_if< can_memcpy< T >, localIndex >::type UnpackDataDevice( buffer_unit_type const * & buffer, ArrayView< T, NDIM, USD > const & var, - parallelDeviceEvents & events ) + parallelDeviceEvents & GEOS_UNUSED_PARAM( events ) ) { - parallelDeviceStream stream; - events.emplace_back( forAll< parallelDeviceAsyncPolicy<> >( stream, var.size(), [=] GEOS_DEVICE ( localIndex ii ) + // parallelDeviceStream stream; + // events.emplace_back( forAll< parallelDeviceAsyncPolicy<> >( stream, var.size(), [=] GEOS_DEVICE ( localIndex ii ) + forAll< parallelDevicePolicy<> >( var.size(), [=] GEOS_DEVICE ( localIndex ii ) { var.data()[ ii ] = reinterpret_cast< const T * >( buffer )[ ii ]; - } ) ); + } ); localIndex packedSize = var.size() * sizeof(T); buffer += var.size() * sizeof(T); return packedSize; diff --git a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt index f56fdc507c8..b55a26c7460 100644 --- a/src/coreComponents/dataRepository/unitTests/CMakeLists.txt +++ b/src/coreComponents/dataRepository/unitTests/CMakeLists.txt @@ -1,6 +1,7 @@ # Specify list of tests set( dataRepository_tests testDefaultValue.cpp + testPacking.cpp testWrapper.cpp testXmlWrapper.cpp testBufferOps.cpp ) diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testPacking.cpp b/src/coreComponents/dataRepository/unitTests/testPacking.cpp similarity index 81% rename from src/coreComponents/unitTests/dataRepositoryTests/testPacking.cpp rename to src/coreComponents/dataRepository/unitTests/testPacking.cpp index 1173a76d4d3..fdeafa80c27 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testPacking.cpp +++ b/src/coreComponents/dataRepository/unitTests/testPacking.cpp @@ -17,13 +17,11 @@ #include "LvArray/src/Array.hpp" #include "dataRepository/BufferOps.hpp" #include "dataRepository/BufferOpsDevice.hpp" -#include "mainInterface/initialization.hpp" -#include "mesh/mpiCommunications/CommunicationTools.hpp" - #include "dataRepository/wrapperHelpers.hpp" #include #include +#include using namespace geos; @@ -116,6 +114,32 @@ TEST( testPacking, testTensorPacking ) EXPECT_TRUE( tns[0][ii] = unp[0][ii] ); } +// void printArray( arrayView1d< R1Tensor const > const & arr, +// arrayView1d< R1Tensor const > const & unpackArray ) +// { +// printf( "arr.size() = %d\n", arr.size() ); +// printf( "unpackArray.size() = %d\n", unpackArray.size() ); + +// for( localIndex ii = 0; ii < unpackArray.size(); ++ii ) +// { +// if( !( arr[ii] == unpackArray[ii] ) ) +// { +// printf( "arr[%d] = ( %f, %f, %f )\n", ii, arr[ii][0], arr[ii][1], arr[ii][2] ); +// printf( "unPackarray[%d] = ( %f, %f, %f ) : ", ii, unpackArray[ii][0], unpackArray[ii][1], unpackArray[ii][2] ); + +// forAll< geos::parallelDevicePolicy<1> >( 1, [=] GEOS_DEVICE ( localIndex ) +// { +// printf( "( %f, %f, %f ) : ", unpackArray[ii][0], unpackArray[ii][1], unpackArray[ii][2] ); +// } ); + +// forAll< serialPolicy >( 1, [=]( localIndex ) +// { +// printf( "( %f, %f, %f )\n", unpackArray[ii][0], unpackArray[ii][1], unpackArray[ii][2] ); +// } ); +// } +// } +// } + TEST( testPacking, testPackingDevice ) { std::srand( std::time( nullptr )); @@ -134,15 +158,32 @@ TEST( testPacking, testPackingDevice ) buffer_type buf( calc_size ); buffer_unit_type * buffer = &buf[0]; bufferOps::PackDevice< true >( buffer, veloc.toViewConst(), packEvents ); - waitAllDeviceEvents( packEvents ); + // waitAllDeviceEvents( packEvents ); + + // R1Tensor const * const castedBuffer = reinterpret_cast< R1Tensor const * >( &buf[16] ); + // for( localIndex ii = 0; ii < size; ++ii ) + // { + // printf( " %d = ( %f, %f, %f ) != ( %f, %f, %f )\n", ii, veloc[ii][0], veloc[ii][1], veloc[ii][2], castedBuffer[ii][0], + // castedBuffer[ii][1], castedBuffer[ii][2] ); + // } buffer_unit_type const * cbuffer = &buf[0]; parallelDeviceEvents unpackEvents; bufferOps::UnpackDevice( cbuffer, unpacked.toView(), unpackEvents ); waitAllDeviceEvents( unpackEvents ); unpacked.move( hostMemorySpace ); + +// printArray( veloc, unpacked.toViewConst() ); + for( localIndex ii = 0; ii < size; ++ii ) + { EXPECT_EQ( veloc[ii], unpacked[ii] ); +// if( !(veloc[ii] == unpacked[ii]) ) +// { +// printf( " veloc[%d] = ( %f, %f, %f )\n", ii, veloc[ii][0], veloc[ii][1], veloc[ii][2] ); +// printf( " unpacked[%d] = ( %f, %f, %f )\n", ii, unpacked[ii][0], unpacked[ii][1], unpacked[ii][2] ); +// } + } } TEST( testPacking, testPackingDeviceHelper ) @@ -221,8 +262,6 @@ TEST( testPacking, testPackByIndexDevice ) int main( int ac, char * av[] ) { ::testing::InitGoogleTest( &ac, av ); - geos::basicSetup( ac, av ); int const result = RUN_ALL_TESTS(); - geos::basicCleanup(); return result; } diff --git a/src/coreComponents/fileIO/CMakeLists.txt b/src/coreComponents/fileIO/CMakeLists.txt index 93b1a3d0b5e..0ab719a5749 100644 --- a/src/coreComponents/fileIO/CMakeLists.txt +++ b/src/coreComponents/fileIO/CMakeLists.txt @@ -34,7 +34,7 @@ set( fileIO_sources timeHistory/PackCollection.cpp timeHistory/HDFHistoryIO.cpp ) -set( dependencyList ${parallelDeps} mesh constitutive hdf5 ) +set( dependencyList ${parallelDeps} mesh constitutive HDF5::HDF5 ) if( ENABLE_PYGEOSX ) list( APPEND fileIO_headers python/PyHistoryCollectionType.hpp @@ -50,13 +50,13 @@ endif() if( ENABLE_MPI ) add_subdirectory( coupling/hdf5_interface ) - list( APPEND dependencyList mpi hdf5_interface ) + list( APPEND dependencyList mpi hdf5_interface HDF5::HDF5 ) list( APPEND fileIO_headers coupling/ChomboCoupler.hpp Outputs/ChomboIO.hpp ) list( APPEND fileIO_sources coupling/ChomboCoupler.cpp Outputs/ChomboIO.cpp ) endif() if( ENABLE_SILO ) - list( APPEND dependencyList silo ) + list( APPEND dependencyList silo HDF5::HDF5) list( APPEND fileIO_headers silo/SiloFile.hpp Outputs/SiloOutput.hpp ) diff --git a/src/coreComponents/fileIO/coupling/hdf5_interface b/src/coreComponents/fileIO/coupling/hdf5_interface index 7ee534586a6..9bf87ec0a5d 160000 --- a/src/coreComponents/fileIO/coupling/hdf5_interface +++ b/src/coreComponents/fileIO/coupling/hdf5_interface @@ -1 +1 @@ -Subproject commit 7ee534586a6ea995532eb4e3cfc7da4e5ccff64a +Subproject commit 9bf87ec0a5d532e65a7e3828bd9968cd4380301c diff --git a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt index 4cd367870a3..268960a65ba 100644 --- a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt @@ -35,9 +35,9 @@ set( gtest_reactivefluid_xmls set( dependencyList ${parallelDeps} gtest ) if ( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) + list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if( ENABLE_PVTPackage ) diff --git a/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt b/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt index d7e95eab658..05fe2376a21 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt @@ -3,16 +3,15 @@ set( dataRepository_tests testObjectCatalog.cpp testRestartBasic.cpp testRestartExtended.cpp - testPacking.cpp testWrapperHelpers.cpp testGroupPath.cpp ) set( dependencyList ${parallelDeps} gtest ) if ( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) + list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if (TARGET pugixml::pugixml) diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt b/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt index 2f958adf82e..c8ca0b9e1c8 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt @@ -8,9 +8,9 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest ) if ( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) + list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if (TARGET pugixml::pugixml) diff --git a/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt b/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt index a5caf07fcd7..135887273fb 100644 --- a/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt @@ -1,7 +1,7 @@ # Specify list of tests set( geosx_fileio_tests testHDFFile.cpp ) -set( dependencyList ${parallelDeps} gtest hdf5 ) +set( dependencyList ${parallelDeps} gtest HDF5::HDF5 ) if ( GEOSX_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core ) diff --git a/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt b/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt index e83e9f2cbb1..a53682984bb 100644 --- a/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt @@ -5,9 +5,9 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest ) if ( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) + list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() # Add gtest C++ based tests diff --git a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt index 6788feb559a..56988469033 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt @@ -8,9 +8,9 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest ) if ( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) + list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() set( dependencyList testingUtilities ) diff --git a/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt b/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt index 8d6973ba965..57005022112 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt @@ -9,9 +9,9 @@ set( nranks 2 ) set( dependencyList ${parallelDeps} gtest ) if ( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) + list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if (TARGET pugixml::pugixml) diff --git a/src/coreComponents/unitTests/meshTests/CMakeLists.txt b/src/coreComponents/unitTests/meshTests/CMakeLists.txt index 7e27010add8..c185368d1fb 100644 --- a/src/coreComponents/unitTests/meshTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/meshTests/CMakeLists.txt @@ -22,9 +22,9 @@ endif() set( dependencyList ${parallelDeps} gtest ) if( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) + list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if (TARGET pugixml::pugixml) diff --git a/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt b/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt index f6d8d8632b0..e31ad6d72b2 100644 --- a/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt +++ b/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt @@ -18,9 +18,9 @@ set( testingUtilities_sources set( dependencyList ${parallelDeps} gtest ) if ( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) + list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() blt_add_library( NAME testingUtilities diff --git a/src/coreComponents/unitTests/toolchain/CMakeLists.txt b/src/coreComponents/unitTests/toolchain/CMakeLists.txt index 7a3b6e5c688..f4509635eb7 100644 --- a/src/coreComponents/unitTests/toolchain/CMakeLists.txt +++ b/src/coreComponents/unitTests/toolchain/CMakeLists.txt @@ -2,7 +2,7 @@ set( gtest_geosx_tests testToolchain.cpp ) # NOTE: we explicitly depend on internal libraries in order to check for the spurious addition of -DNDEBUG flag -set( dependencyList ${parallelDeps} gtest physicsSolvers discretizationMethods fieldSpecification linearAlgebra dataRepository events fileIO optionparser ) +set( dependencyList ${parallelDeps} gtest physicsSolvers discretizationMethods fieldSpecification linearAlgebra dataRepository events fileIO optionparser HDF5::HDF5 ) # Add gtest C++ based tests foreach(test ${gtest_geosx_tests}) diff --git a/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt b/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt index 0ba1fe88d75..66da64f7648 100644 --- a/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt @@ -5,9 +5,9 @@ set( testSources set( dependencyList ${parallelDeps} gtest ) if ( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core) + list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if (TARGET pugixml::pugixml) diff --git a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt index 5f61293c506..da9172f7ac4 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt @@ -11,9 +11,9 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest ) if ( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) + list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if (TARGET pugixml::pugixml) diff --git a/src/coreComponents/unitTests/wellsTests/CMakeLists.txt b/src/coreComponents/unitTests/wellsTests/CMakeLists.txt index 4167bd25776..7adb81ed286 100644 --- a/src/coreComponents/unitTests/wellsTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wellsTests/CMakeLists.txt @@ -6,9 +6,9 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest ) if ( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ${parallelDeps} ) + list( APPEND dependencyList geosx_core ${parallelDeps} HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ${parallelDeps} ) + list( APPEND dependencyList ${geosx_core_libs} ${parallelDeps} HDF5::HDF5 ) endif() if( ENABLE_PVTPackage ) diff --git a/src/coreComponents/unitTests/xmlTests/CMakeLists.txt b/src/coreComponents/unitTests/xmlTests/CMakeLists.txt index f2b1c7bb5fc..34646c22392 100644 --- a/src/coreComponents/unitTests/xmlTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/xmlTests/CMakeLists.txt @@ -16,12 +16,12 @@ set( multi_files multifile_input/solver.xml ) # Add gtest C++ based tests -set( dependencyList ${parallelDeps} gtest optionparser ) +set( dependencyList ${parallelDeps} gtest optionparser HDF5::HDF5 ) if ( GEOSX_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) + list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() - list( APPEND dependencyList ${geosx_core_libs} ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if (TARGET pugixml::pugixml) From 18db0140f715e8923f8430b0d718a747fea1c752 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Fri, 19 Jul 2024 17:06:13 +0100 Subject: [PATCH 139/286] chore: Change GEOSX to GEOS in a bunch of places (#3219) * GEOSX_USE to GEOS_USE * GEOSX_ENABLE to GEOS_ENABLE * GEOSX_LA to GEOS_LA * GEOSX_TPL to GEOS_TPL * GEOSX_ to GEOS_ excluding .py and .msub * change version number --- .github/workflows/build_and_test.yml | 4 +- COPYRIGHT | 17 ++-- examples/ObjectCatalog/Base.hpp | 9 +- examples/ObjectCatalog/Derived1.cpp | 9 +- examples/ObjectCatalog/Derived1.hpp | 9 +- examples/ObjectCatalog/Derived2.cpp | 1 + examples/ObjectCatalog/Derived2.hpp | 9 +- examples/ObjectCatalog/main.cpp | 9 +- host-configs/LBL/cori-gcc@8.1.0.cmake | 6 +- host-configs/LBL/cori-intel.cmake | 6 +- host-configs/LLNL/lassen-base.cmake | 6 +- host-configs/LLNL/tioga-base.cmake | 2 +- host-configs/LLNL/tioga-cce-15.cmake | 14 +-- host-configs/ORNL/ascent-gcc@8.1.1.cmake | 2 +- host-configs/ORNL/frontier-base.cmake | 6 +- host-configs/ORNL/frontier-cce@15.0.0.cmake | 12 +-- host-configs/Stanford/sherlock-base.cmake | 4 +- ...4.1.2-openblas0.3.10-cuda11.5.0-sm80.cmake | 2 +- ...4.1.2-openblas0.3.10-cuda11.7.1-sm70.cmake | 2 +- ...rlock-gcc10-ompi4.1.2-openblas0.3.10.cmake | 2 +- .../pangea3-gcc8.4.1-openmpi-4.1.2.cmake | 10 +- host-configs/TOTAL/pecan-CPU.cmake | 4 +- host-configs/apple/darwin-clang.cmake | 8 +- host-configs/apple/macOS_base.cmake | 6 +- host-configs/environment.cmake | 8 +- host-configs/tpls.cmake | 95 +++++++++--------- scripts/automatic_xml_preprocess.sh | 8 +- scripts/ci_build_and_test_in_container.sh | 30 +++--- scripts/copyrightPrepender.py | 76 +++++--------- .../spack_packages/packages/geosx/package.py | 6 +- src/CMakeLists.txt | 14 +-- src/VERSION | 2 +- src/cmake/GeosxConfig.cmake | 14 +-- src/cmake/GeosxOptions.cmake | 98 +++++++++---------- src/cmake/GeosxVersion.cmake | 34 +++---- .../thirdparty/SetupGeosxThirdParty.cmake | 10 +- src/coreComponents/CMakeLists.txt | 16 +-- src/coreComponents/LvArray | 2 +- .../codingUtilities/CMakeLists.txt | 2 +- .../codingUtilities/EnumStrings.hpp | 9 +- .../codingUtilities/Parsing.cpp | 9 +- .../codingUtilities/Parsing.hpp | 9 +- .../codingUtilities/SFINAE_Macros.hpp | 9 +- .../codingUtilities/StringUtilities.cpp | 9 +- .../codingUtilities/StringUtilities.hpp | 9 +- .../codingUtilities/UnitTestUtilities.hpp | 9 +- .../codingUtilities/Utilities.hpp | 9 +- .../codingUtilities/tests/testGeosxTraits.cpp | 9 +- .../tests/testParallelTestUtilities.cpp | 11 ++- .../codingUtilities/tests/testParsing.cpp | 9 +- .../tests/testStringUtilities.cpp | 9 +- .../codingUtilities/tests/testUtilities.cpp | 9 +- src/coreComponents/codingUtilities/traits.hpp | 9 +- src/coreComponents/common/BufferAllocator.cpp | 17 +++- src/coreComponents/common/BufferAllocator.hpp | 11 ++- src/coreComponents/common/CMakeLists.txt | 2 +- src/coreComponents/common/DataLayouts.hpp | 11 ++- src/coreComponents/common/DataTypes.cpp | 11 ++- src/coreComponents/common/DataTypes.hpp | 21 ++-- .../common/FieldSpecificationOps.hpp | 9 +- src/coreComponents/common/FixedSizeDeque.hpp | 10 +- .../common/FixedSizeDequeWithMutexes.hpp | 12 ++- src/coreComponents/common/Format.hpp | 15 +-- .../common/GEOS_RAJA_Interface.hpp | 21 ++-- src/coreComponents/common/GeosxConfig.hpp.in | 77 +++++++++------ src/coreComponents/common/GeosxMacros.hpp | 11 ++- src/coreComponents/common/LifoStorage.hpp | 10 +- .../common/LifoStorageCommon.hpp | 10 +- src/coreComponents/common/LifoStorageCuda.hpp | 14 +-- src/coreComponents/common/LifoStorageHost.hpp | 14 +-- src/coreComponents/common/Logger.cpp | 15 +-- src/coreComponents/common/Logger.hpp | 15 +-- src/coreComponents/common/MemoryInfos.cpp | 11 ++- src/coreComponents/common/MemoryInfos.hpp | 11 ++- src/coreComponents/common/MpiWrapper.cpp | 60 ++++++------ src/coreComponents/common/MpiWrapper.hpp | 50 +++++----- .../common/MultiMutexesLock.hpp | 10 +- src/coreComponents/common/Path.cpp | 9 +- src/coreComponents/common/Path.hpp | 9 +- .../common/PhysicsConstants.hpp | 9 +- src/coreComponents/common/Span.hpp | 9 +- src/coreComponents/common/Stopwatch.hpp | 11 ++- src/coreComponents/common/Tensor.hpp | 9 +- src/coreComponents/common/Timer.hpp | 9 +- src/coreComponents/common/TimingMacros.hpp | 17 ++-- src/coreComponents/common/TypeDispatch.hpp | 9 +- src/coreComponents/common/Units.cpp | 10 +- src/coreComponents/common/Units.hpp | 11 ++- .../common/initializeEnvironment.cpp | 51 +++++----- .../common/initializeEnvironment.hpp | 17 ++-- .../common/unitTests/testCaliperSmoke.cpp | 9 +- .../common/unitTests/testDataTypes.cpp | 9 +- .../common/unitTests/testFixedSizeDeque.cpp | 15 +++ .../common/unitTests/testLifoStorage.cpp | 15 +++ .../common/unitTests/testTypeDispatch.cpp | 9 +- .../common/unitTests/testUnits.cpp | 9 +- .../constitutive/CMakeLists.txt | 2 +- .../constitutive/ConstitutiveBase.cpp | 9 +- .../constitutive/ConstitutiveBase.hpp | 9 +- .../constitutive/ConstitutiveManager.cpp | 9 +- .../constitutive/ConstitutiveManager.hpp | 9 +- .../constitutive/ConstitutivePassThru.hpp | 9 +- .../ConstitutivePassThruHandler.hpp | 9 +- .../constitutive/ExponentialRelation.hpp | 9 +- src/coreComponents/constitutive/NullModel.cpp | 9 +- src/coreComponents/constitutive/NullModel.hpp | 9 +- src/coreComponents/constitutive/PVTPackage | 2 +- .../BrooksCoreyCapillaryPressure.cpp | 9 +- .../BrooksCoreyCapillaryPressure.hpp | 9 +- .../CapillaryPressureBase.cpp | 9 +- .../CapillaryPressureBase.hpp | 9 +- .../CapillaryPressureFields.hpp | 9 +- .../JFunctionCapillaryPressure.cpp | 9 +- .../JFunctionCapillaryPressure.hpp | 9 +- .../TableCapillaryPressure.cpp | 9 +- .../TableCapillaryPressure.hpp | 9 +- .../TableCapillaryPressureHelpers.cpp | 9 +- .../TableCapillaryPressureHelpers.hpp | 9 +- .../VanGenuchtenCapillaryPressure.cpp | 9 +- .../VanGenuchtenCapillaryPressure.hpp | 9 +- .../capillaryPressureSelector.hpp | 9 +- .../capillaryPressure/layouts.hpp | 9 +- .../constitutive/contact/ContactBase.cpp | 9 +- .../constitutive/contact/ContactBase.hpp | 9 +- .../constitutive/contact/ContactSelector.hpp | 9 +- .../constitutive/contact/CoulombContact.cpp | 9 +- .../constitutive/contact/CoulombContact.hpp | 9 +- .../contact/FrictionlessContact.cpp | 9 +- .../contact/FrictionlessContact.hpp | 9 +- .../deprecated/ApertureTableContact.cpp | 9 +- .../deprecated/ApertureTableContact.hpp | 9 +- .../diffusion/ConstantDiffusion.cpp | 9 +- .../diffusion/ConstantDiffusion.hpp | 9 +- .../constitutive/diffusion/DiffusionBase.cpp | 9 +- .../constitutive/diffusion/DiffusionBase.hpp | 9 +- .../diffusion/DiffusionFields.hpp | 9 +- .../diffusion/DiffusionSelector.hpp | 9 +- .../dispersion/DispersionBase.cpp | 9 +- .../dispersion/DispersionBase.hpp | 9 +- .../dispersion/DispersionFields.hpp | 9 +- .../dispersion/DispersionSelector.hpp | 9 +- .../dispersion/LinearIsotropicDispersion.cpp | 9 +- .../dispersion/LinearIsotropicDispersion.hpp | 9 +- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 9 +- .../multifluid/CO2Brine/CO2BrineFluid.hpp | 9 +- .../PVTDriverRunTestCO2BrineEzrokhiFluid.cpp | 9 +- ...iverRunTestCO2BrineEzrokhiThermalFluid.cpp | 9 +- .../PVTDriverRunTestCO2BrinePhillipsFluid.cpp | 9 +- ...verRunTestCO2BrinePhillipsThermalFluid.cpp | 9 +- .../fluid/multifluid/CO2Brine/PhaseModel.hpp | 9 +- .../CO2Brine/functions/BrineEnthalpy.cpp | 9 +- .../CO2Brine/functions/BrineEnthalpy.hpp | 9 +- .../CO2Brine/functions/CO2EOSSolver.cpp | 9 +- .../CO2Brine/functions/CO2EOSSolver.hpp | 9 +- .../CO2Brine/functions/CO2Enthalpy.cpp | 9 +- .../CO2Brine/functions/CO2Enthalpy.hpp | 9 +- .../CO2Brine/functions/CO2Solubility.cpp | 9 +- .../CO2Brine/functions/CO2Solubility.hpp | 9 +- .../functions/CO2SolubilityDuanSun.cpp | 9 +- .../functions/CO2SolubilityDuanSun.hpp | 9 +- .../functions/CO2SolubilitySpycherPruess.cpp | 9 +- .../functions/CO2SolubilitySpycherPruess.hpp | 9 +- .../functions/EzrokhiBrineDensity.cpp | 9 +- .../functions/EzrokhiBrineDensity.hpp | 9 +- .../functions/EzrokhiBrineViscosity.cpp | 9 +- .../functions/EzrokhiBrineViscosity.hpp | 9 +- .../functions/FenghourCO2Viscosity.cpp | 9 +- .../functions/FenghourCO2Viscosity.hpp | 9 +- .../CO2Brine/functions/FlashModelBase.hpp | 9 +- .../CO2Brine/functions/NoOpPVTFunction.hpp | 9 +- .../CO2Brine/functions/PVTFunctionBase.hpp | 9 +- .../CO2Brine/functions/PVTFunctionHelpers.cpp | 9 +- .../CO2Brine/functions/PVTFunctionHelpers.hpp | 9 +- .../functions/PhillipsBrineDensity.cpp | 9 +- .../functions/PhillipsBrineDensity.hpp | 9 +- .../functions/PhillipsBrineViscosity.cpp | 9 +- .../functions/PhillipsBrineViscosity.hpp | 9 +- .../functions/PureWaterProperties.cpp | 9 +- .../functions/PureWaterProperties.hpp | 9 +- .../functions/SpanWagnerCO2Density.cpp | 9 +- .../functions/SpanWagnerCO2Density.hpp | 9 +- .../CO2Brine/functions/WaterDensity.cpp | 9 +- .../CO2Brine/functions/WaterDensity.hpp | 9 +- .../constitutive/fluid/multifluid/Layouts.hpp | 9 +- .../fluid/multifluid/MultiFluidBase.cpp | 9 +- .../fluid/multifluid/MultiFluidBase.hpp | 9 +- .../fluid/multifluid/MultiFluidConstants.hpp | 9 +- .../fluid/multifluid/MultiFluidFields.hpp | 9 +- .../fluid/multifluid/MultiFluidSelector.hpp | 15 +-- .../fluid/multifluid/MultiFluidUtils.hpp | 9 +- .../fluid/multifluid/PVTDriver.cpp | 9 +- .../fluid/multifluid/PVTDriver.hpp | 9 +- .../fluid/multifluid/PVTDriverRunTest.hpp | 9 +- .../multifluid/blackOil/BlackOilFluid.cpp | 9 +- .../multifluid/blackOil/BlackOilFluid.hpp | 9 +- .../multifluid/blackOil/BlackOilFluidBase.cpp | 9 +- .../multifluid/blackOil/BlackOilFluidBase.hpp | 9 +- .../multifluid/blackOil/DeadOilFluid.cpp | 9 +- .../multifluid/blackOil/DeadOilFluid.hpp | 9 +- .../blackOil/PVTDriverRunTestDeadOilFluid.cpp | 9 +- .../fluid/multifluid/blackOil/PVTOData.cpp | 9 +- .../fluid/multifluid/blackOil/PVTOData.hpp | 9 +- .../CompositionalMultiphaseFluid.cpp | 9 +- .../CompositionalMultiphaseFluid.hpp | 9 +- ...CompositionalMultiphaseFluidPVTPackage.cpp | 9 +- ...CompositionalMultiphaseFluidPVTPackage.hpp | 9 +- .../CompositionalMultiphaseFluidUpdates.cpp | 9 +- .../CompositionalMultiphaseFluidUpdates.hpp | 9 +- ...verRunTestCompositionalMultiphaseFluid.cpp | 9 +- ...CompositionalTwoPhaseConstantViscosity.cpp | 9 +- ...ionalTwoPhaseLohrenzBrayClarkViscosity.cpp | 9 +- .../functions/CompositionalProperties.hpp | 9 +- .../functions/CompositionalPropertiesImpl.hpp | 9 +- .../functions/CubicEOSPhaseModel.hpp | 9 +- .../functions/FugacityCalculator.hpp | 9 +- .../functions/KValueInitialization.hpp | 9 +- .../functions/NegativeTwoPhaseFlash.hpp | 9 +- .../compositional/functions/RachfordRice.hpp | 9 +- .../compositional/functions/StabilityTest.hpp | 9 +- .../models/ComponentProperties.hpp | 9 +- .../models/CompositionalDensity.cpp | 9 +- .../models/CompositionalDensity.hpp | 9 +- .../models/ConstantViscosity.cpp | 9 +- .../models/ConstantViscosity.hpp | 9 +- .../compositional/models/EquationOfState.hpp | 9 +- .../compositional/models/FunctionBase.hpp | 9 +- .../models/LohrenzBrayClarkViscosity.cpp | 9 +- .../models/LohrenzBrayClarkViscosity.hpp | 9 +- .../models/LohrenzBrayClarkViscosityImpl.hpp | 9 +- .../compositional/models/ModelParameters.hpp | 9 +- .../models/NegativeTwoPhaseFlashModel.cpp | 9 +- .../models/NegativeTwoPhaseFlashModel.hpp | 9 +- .../compositional/models/NullModel.hpp | 9 +- .../compositional/models/PhaseModel.hpp | 9 +- .../reactive/ReactiveBrineFluid.cpp | 9 +- .../reactive/ReactiveBrineFluid.hpp | 9 +- .../reactive/ReactiveFluidDriver.cpp | 9 +- .../reactive/ReactiveFluidDriver.hpp | 9 +- .../reactive/ReactiveFluidSelector.hpp | 9 +- .../reactive/ReactiveMultiFluid.cpp | 9 +- .../reactive/ReactiveMultiFluid.hpp | 9 +- .../reactive/ReactiveMultiFluidFields.hpp | 9 +- .../EquilibriumReactions.cpp | 9 +- .../EquilibriumReactions.hpp | 9 +- .../chemicalReactions/KineticReactions.cpp | 9 +- .../chemicalReactions/KineticReactions.hpp | 9 +- .../chemicalReactions/ReactionsBase.cpp | 9 +- .../chemicalReactions/ReactionsBase.hpp | 9 +- .../CompressibleSinglePhaseFluid.cpp | 9 +- .../CompressibleSinglePhaseFluid.hpp | 9 +- .../fluid/singlefluid/ParticleFluid.cpp | 9 +- .../fluid/singlefluid/ParticleFluid.hpp | 9 +- .../fluid/singlefluid/ParticleFluidBase.cpp | 9 +- .../fluid/singlefluid/ParticleFluidBase.hpp | 9 +- .../fluid/singlefluid/ParticleFluidFields.hpp | 9 +- .../singlefluid/ParticleFluidSelector.hpp | 9 +- .../fluid/singlefluid/ProppantSlurryFluid.cpp | 9 +- .../fluid/singlefluid/ProppantSlurryFluid.hpp | 9 +- .../fluid/singlefluid/SingleFluidBase.cpp | 9 +- .../fluid/singlefluid/SingleFluidBase.hpp | 9 +- .../fluid/singlefluid/SingleFluidFields.hpp | 9 +- .../fluid/singlefluid/SingleFluidSelector.hpp | 9 +- .../fluid/singlefluid/SlurryFluidBase.cpp | 9 +- .../fluid/singlefluid/SlurryFluidBase.hpp | 9 +- .../fluid/singlefluid/SlurryFluidFields.hpp | 9 +- .../fluid/singlefluid/SlurryFluidSelector.hpp | 9 +- .../ThermalCompressibleSinglePhaseFluid.cpp | 9 +- .../ThermalCompressibleSinglePhaseFluid.hpp | 9 +- .../permeability/CarmanKozenyPermeability.cpp | 9 +- .../permeability/CarmanKozenyPermeability.hpp | 9 +- .../permeability/ConstantPermeability.cpp | 9 +- .../permeability/ConstantPermeability.hpp | 9 +- .../ExponentialDecayPermeability.cpp | 9 +- .../ExponentialDecayPermeability.hpp | 9 +- .../ParallelPlatesPermeability.cpp | 9 +- .../ParallelPlatesPermeability.hpp | 9 +- .../permeability/PermeabilityBase.cpp | 9 +- .../permeability/PermeabilityBase.hpp | 9 +- .../permeability/PermeabilityFields.hpp | 9 +- .../permeability/PressurePermeability.cpp | 9 +- .../permeability/PressurePermeability.hpp | 9 +- .../permeability/ProppantPermeability.cpp | 9 +- .../permeability/ProppantPermeability.hpp | 9 +- .../SlipDependentPermeability.cpp | 9 +- .../SlipDependentPermeability.hpp | 9 +- .../WillisRichardsPermeability.cpp | 9 +- .../WillisRichardsPermeability.hpp | 9 +- .../BrooksCoreyBakerRelativePermeability.cpp | 9 +- .../BrooksCoreyBakerRelativePermeability.hpp | 9 +- .../BrooksCoreyRelativePermeability.cpp | 9 +- .../BrooksCoreyRelativePermeability.hpp | 9 +- .../BrooksCoreyStone2RelativePermeability.cpp | 9 +- .../BrooksCoreyStone2RelativePermeability.hpp | 9 +- .../RelativePermeabilityBase.cpp | 9 +- .../RelativePermeabilityBase.hpp | 9 +- .../RelativePermeabilityFields.hpp | 9 +- .../RelativePermeabilityInterpolators.hpp | 9 +- .../RelativePermeabilitySelector.hpp | 9 +- .../relativePermeability/RelpermDriver.cpp | 9 +- .../relativePermeability/RelpermDriver.hpp | 9 +- .../RelpermDriverBrooksCoreyBakerRunTest.cpp | 9 +- .../RelpermDriverBrooksCoreyRunTest.cpp | 9 +- .../RelpermDriverBrooksCoreyStone2RunTest.cpp | 9 +- .../RelpermDriverRunTest.hpp | 9 +- ...rmDriverTableRelativeHysteresisRunTest.cpp | 9 +- .../RelpermDriverTableRelativeRunTest.cpp | 9 +- .../RelpermDriverVanGenuchtenBakerRunTest.cpp | 10 +- ...RelpermDriverVanGenuchtenStone2RunTest.cpp | 10 +- .../TableRelativePermeability.cpp | 9 +- .../TableRelativePermeability.hpp | 9 +- .../TableRelativePermeabilityHelpers.cpp | 9 +- .../TableRelativePermeabilityHelpers.hpp | 9 +- .../TableRelativePermeabilityHysteresis.cpp | 9 +- .../TableRelativePermeabilityHysteresis.hpp | 9 +- .../VanGenuchtenBakerRelativePermeability.cpp | 9 +- .../VanGenuchtenBakerRelativePermeability.hpp | 9 +- ...VanGenuchtenStone2RelativePermeability.cpp | 9 +- ...VanGenuchtenStone2RelativePermeability.hpp | 9 +- .../relativePermeability/layouts.hpp | 9 +- .../constitutive/solid/CeramicDamage.cpp | 11 ++- .../constitutive/solid/CeramicDamage.hpp | 17 ++-- .../constitutive/solid/CompressibleSolid.cpp | 9 +- .../constitutive/solid/CompressibleSolid.hpp | 9 +- .../constitutive/solid/CoupledSolid.hpp | 9 +- .../constitutive/solid/CoupledSolidBase.cpp | 9 +- .../constitutive/solid/CoupledSolidBase.hpp | 9 +- .../constitutive/solid/Damage.cpp | 10 +- .../constitutive/solid/Damage.hpp | 9 +- .../constitutive/solid/DamageSpectral.cpp | 10 +- .../constitutive/solid/DamageSpectral.hpp | 9 +- .../solid/DamageSpectralUtilities.hpp | 11 ++- .../constitutive/solid/DamageVolDev.cpp | 10 +- .../constitutive/solid/DamageVolDev.hpp | 9 +- .../constitutive/solid/DelftEgg.cpp | 11 ++- .../constitutive/solid/DelftEgg.hpp | 11 ++- .../PoreVolumeCompressibleSolid.cpp | 9 +- .../PoreVolumeCompressibleSolid.hpp | 9 +- .../solid/Deprecated/PoroElastic.cpp | 9 +- .../solid/Deprecated/PoroElastic.hpp | 9 +- .../constitutive/solid/DruckerPrager.cpp | 11 ++- .../constitutive/solid/DruckerPrager.hpp | 11 ++- .../solid/DruckerPragerExtended.cpp | 11 ++- .../solid/DruckerPragerExtended.hpp | 11 ++- .../constitutive/solid/DuvautLionsSolid.cpp | 10 +- .../constitutive/solid/DuvautLionsSolid.hpp | 9 +- .../constitutive/solid/ElasticIsotropic.cpp | 9 +- .../constitutive/solid/ElasticIsotropic.hpp | 11 ++- .../ElasticIsotropicPressureDependent.cpp | 9 +- .../ElasticIsotropicPressureDependent.hpp | 11 ++- .../constitutive/solid/ElasticOrthotropic.cpp | 9 +- .../constitutive/solid/ElasticOrthotropic.hpp | 9 +- .../solid/ElasticTransverseIsotropic.cpp | 9 +- .../solid/ElasticTransverseIsotropic.hpp | 9 +- .../solid/InvariantDecompositions.hpp | 11 ++- .../constitutive/solid/ModifiedCamClay.cpp | 11 ++- .../constitutive/solid/ModifiedCamClay.hpp | 11 ++- .../constitutive/solid/PerfectlyPlastic.cpp | 11 ++- .../constitutive/solid/PerfectlyPlastic.hpp | 17 ++-- .../constitutive/solid/PorousSolid.cpp | 9 +- .../constitutive/solid/PorousSolid.hpp | 9 +- .../solid/PropertyConversions.hpp | 11 ++- .../constitutive/solid/ProppantSolid.cpp | 9 +- .../constitutive/solid/ProppantSolid.hpp | 9 +- .../constitutive/solid/SolidBase.cpp | 9 +- .../constitutive/solid/SolidBase.hpp | 9 +- .../solid/SolidInternalEnergy.cpp | 9 +- .../solid/SolidInternalEnergy.hpp | 9 +- .../solid/SolidModelDiscretizationOps.hpp | 11 ++- ...odelDiscretizationOpsFullyAnisotroipic.hpp | 11 ++- .../SolidModelDiscretizationOpsIsotropic.hpp | 11 ++- ...SolidModelDiscretizationOpsOrthotropic.hpp | 11 ++- ...elDiscretizationOpsTransverseIsotropic.hpp | 11 ++- .../constitutive/solid/SolidUtilities.hpp | 9 +- .../constitutive/solid/TriaxialDriver.cpp | 9 +- .../constitutive/solid/TriaxialDriver.hpp | 9 +- .../solid/porosity/BiotPorosity.cpp | 9 +- .../solid/porosity/BiotPorosity.hpp | 9 +- .../solid/porosity/PorosityBase.cpp | 9 +- .../solid/porosity/PorosityBase.hpp | 9 +- .../solid/porosity/PorosityFields.hpp | 9 +- .../solid/porosity/PressurePorosity.cpp | 9 +- .../solid/porosity/PressurePorosity.hpp | 9 +- .../solid/porosity/ProppantPorosity.cpp | 9 +- .../solid/porosity/ProppantPorosity.hpp | 9 +- .../MultiPhaseConstantThermalConductivity.cpp | 9 +- .../MultiPhaseConstantThermalConductivity.hpp | 9 +- .../MultiPhaseThermalConductivityBase.cpp | 9 +- .../MultiPhaseThermalConductivityBase.hpp | 9 +- .../MultiPhaseThermalConductivityFields.hpp | 9 +- .../MultiPhaseThermalConductivitySelector.hpp | 9 +- ...PhaseVolumeWeightedThermalConductivity.cpp | 9 +- ...PhaseVolumeWeightedThermalConductivity.hpp | 9 +- ...SinglePhaseConstantThermalConductivity.cpp | 9 +- ...SinglePhaseConstantThermalConductivity.hpp | 9 +- .../SinglePhaseThermalConductivityBase.cpp | 9 +- .../SinglePhaseThermalConductivityBase.hpp | 9 +- .../SinglePhaseThermalConductivityFields.hpp | 9 +- ...SinglePhaseThermalConductivitySelector.hpp | 9 +- .../ThermalConductivityFields.hpp | 9 +- .../constitutive/unitTests/TestFluid.hpp | 9 +- .../unitTests/TestFluidUtilities.hpp | 9 +- .../unitTests/testCompositionalDensity.cpp | 9 +- .../unitTests/testCompositionalProperties.cpp | 9 +- .../constitutive/unitTests/testCubicEOS.cpp | 9 +- .../unitTests/testDamageUtilities.cpp | 15 +++ .../unitTests/testDruckerPrager.cpp | 11 ++- .../unitTests/testElasticIsotropic.cpp | 9 +- .../unitTests/testKValueInitialization.cpp | 9 +- .../testLohrenzBrayClarkViscosity.cpp | 9 +- .../unitTests/testModifiedCamClay.cpp | 11 ++- .../unitTests/testNegativeTwoPhaseFlash.cpp | 9 +- .../testNegativeTwoPhaseFlash9Comp.cpp | 9 +- .../unitTests/testParticleFluidEnums.cpp | 11 ++- .../unitTests/testPropertyConversions.cpp | 11 ++- .../unitTests/testRachfordRice.cpp | 9 +- .../unitTests/testStabilityTest2Comp.cpp | 9 +- .../unitTests/testStabilityTest9Comp.cpp | 9 +- .../constitutive/unitTests/testTriaxial.cpp | 11 ++- .../dataRepository/BufferOps.hpp | 13 +-- .../dataRepository/BufferOpsDevice.cpp | 9 +- .../dataRepository/BufferOpsDevice.hpp | 9 +- .../dataRepository/BufferOps_inline.hpp | 13 +-- .../dataRepository/CMakeLists.txt | 2 +- .../dataRepository/ConduitRestart.cpp | 9 +- .../dataRepository/ConduitRestart.hpp | 9 +- .../dataRepository/DataContext.cpp | 9 +- .../dataRepository/DataContext.hpp | 9 +- .../dataRepository/DefaultValue.hpp | 9 +- .../dataRepository/ExecutableGroup.cpp | 9 +- .../dataRepository/ExecutableGroup.hpp | 9 +- src/coreComponents/dataRepository/Group.cpp | 13 +-- src/coreComponents/dataRepository/Group.hpp | 11 ++- .../dataRepository/GroupContext.cpp | 9 +- .../dataRepository/GroupContext.hpp | 9 +- .../dataRepository/HistoryDataSpec.hpp | 11 ++- .../dataRepository/InputFlags.hpp | 9 +- .../dataRepository/KeyIndexT.hpp | 9 +- .../dataRepository/KeyNames.hpp | 9 +- .../dataRepository/MappedVector.hpp | 9 +- .../dataRepository/ObjectCatalog.hpp | 14 +-- .../dataRepository/ReferenceWrapper.hpp | 9 +- .../dataRepository/RestartFlags.hpp | 9 +- .../dataRepository/Utilities.cpp | 9 +- .../dataRepository/Utilities.hpp | 9 +- src/coreComponents/dataRepository/Wrapper.hpp | 11 ++- .../dataRepository/WrapperBase.cpp | 9 +- .../dataRepository/WrapperBase.hpp | 13 +-- .../dataRepository/WrapperContext.cpp | 9 +- .../dataRepository/WrapperContext.hpp | 9 +- .../dataRepository/python/PyGroup.cpp | 11 ++- .../dataRepository/python/PyGroup.hpp | 11 ++- .../dataRepository/python/PyGroupType.hpp | 15 +++ .../dataRepository/python/PyWrapper.cpp | 11 ++- .../dataRepository/python/PyWrapper.hpp | 11 ++- .../unitTests/testBufferOps.cpp | 9 +- .../unitTests/testDefaultValue.cpp | 9 +- .../dataRepository/unitTests/testPacking.cpp | 9 +- .../unitTests/testReferenceWrapper.cpp | 9 +- .../dataRepository/unitTests/testWrapper.cpp | 9 +- .../unitTests/testXmlWrapper.cpp | 9 +- .../dataRepository/wrapperHelpers.hpp | 13 +-- .../dataRepository/xmlWrapper.cpp | 9 +- .../dataRepository/xmlWrapper.hpp | 9 +- .../denseLinearAlgebra/CMakeLists.txt | 2 +- .../denseLinearAlgebra/common/layouts.hpp | 9 +- .../blaslapack/BlasLapackFunctions.h | 9 +- .../interfaces/blaslapack/BlasLapackLA.cpp | 13 +-- .../interfaces/blaslapack/BlasLapackLA.hpp | 9 +- .../unitTests/testBlasLapack.cpp | 9 +- .../unitTests/testSolveLinearSystem.cpp | 9 +- .../discretizationMethods/CMakeLists.txt | 2 +- .../NumericalMethodsManager.cpp | 9 +- .../NumericalMethodsManager.hpp | 9 +- src/coreComponents/dummy.cpp | 9 +- src/coreComponents/events/CMakeLists.txt | 2 +- src/coreComponents/events/EventBase.cpp | 9 +- src/coreComponents/events/EventBase.hpp | 9 +- src/coreComponents/events/EventManager.cpp | 11 ++- src/coreComponents/events/EventManager.hpp | 9 +- src/coreComponents/events/HaltEvent.cpp | 11 ++- src/coreComponents/events/HaltEvent.hpp | 9 +- src/coreComponents/events/PeriodicEvent.cpp | 11 ++- src/coreComponents/events/PeriodicEvent.hpp | 9 +- src/coreComponents/events/SoloEvent.cpp | 9 +- src/coreComponents/events/SoloEvent.hpp | 9 +- src/coreComponents/events/tasks/TaskBase.cpp | 11 ++- src/coreComponents/events/tasks/TaskBase.hpp | 11 ++- .../events/tasks/TasksManager.cpp | 11 ++- .../events/tasks/TasksManager.hpp | 11 ++- .../AquiferBoundaryCondition.cpp | 9 +- .../AquiferBoundaryCondition.hpp | 9 +- .../fieldSpecification/CMakeLists.txt | 2 +- .../DirichletBoundaryCondition.cpp | 9 +- .../DirichletBoundaryCondition.hpp | 9 +- .../EquilibriumInitialCondition.cpp | 9 +- .../EquilibriumInitialCondition.hpp | 9 +- .../FieldSpecificationBase.cpp | 9 +- .../FieldSpecificationBase.hpp | 9 +- .../FieldSpecificationManager.cpp | 9 +- .../FieldSpecificationManager.hpp | 9 +- .../PerfectlyMatchedLayer.cpp | 9 +- .../PerfectlyMatchedLayer.hpp | 9 +- .../SourceFluxBoundaryCondition.cpp | 9 +- .../SourceFluxBoundaryCondition.hpp | 9 +- .../SourceFluxStatistics.cpp | 9 +- .../SourceFluxStatistics.hpp | 9 +- .../TractionBoundaryCondition.cpp | 9 +- .../TractionBoundaryCondition.hpp | 9 +- src/coreComponents/fileIO/CMakeLists.txt | 2 +- .../fileIO/Outputs/BlueprintOutput.cpp | 9 +- .../fileIO/Outputs/BlueprintOutput.hpp | 9 +- .../fileIO/Outputs/ChomboIO.cpp | 17 ++-- .../fileIO/Outputs/ChomboIO.hpp | 9 +- .../fileIO/Outputs/OutputBase.cpp | 9 +- .../fileIO/Outputs/OutputBase.hpp | 9 +- .../fileIO/Outputs/OutputManager.cpp | 9 +- .../fileIO/Outputs/OutputManager.hpp | 9 +- .../fileIO/Outputs/OutputUtilities.cpp | 9 +- .../fileIO/Outputs/OutputUtilities.hpp | 9 +- .../fileIO/Outputs/PythonOutput.cpp | 11 ++- .../fileIO/Outputs/PythonOutput.hpp | 11 ++- .../fileIO/Outputs/RestartOutput.cpp | 9 +- .../fileIO/Outputs/RestartOutput.hpp | 9 +- .../fileIO/Outputs/SiloOutput.cpp | 9 +- .../fileIO/Outputs/SiloOutput.hpp | 9 +- .../fileIO/Outputs/TimeHistoryOutput.cpp | 15 +-- .../fileIO/Outputs/TimeHistoryOutput.hpp | 13 +-- .../fileIO/Outputs/VTKOutput.cpp | 13 +-- .../fileIO/Outputs/VTKOutput.hpp | 11 ++- src/coreComponents/fileIO/Table/TableData.cpp | 9 +- src/coreComponents/fileIO/Table/TableData.hpp | 9 +- .../fileIO/Table/TableFormatter.cpp | 9 +- .../fileIO/Table/TableFormatter.hpp | 9 +- .../fileIO/Table/TableLayout.cpp | 9 +- .../fileIO/Table/TableLayout.hpp | 9 +- .../fileIO/Table/unitTests/testTable.cpp | 10 +- .../fileIO/coupling/ChomboCoupler.cpp | 9 +- .../fileIO/coupling/ChomboCoupler.hpp | 9 +- .../fileIO/python/PyHistoryCollection.cpp | 15 +++ .../fileIO/python/PyHistoryCollectionType.hpp | 15 +++ .../fileIO/python/PyHistoryOutput.cpp | 15 +++ .../fileIO/python/PyHistoryOutputType.hpp | 15 +++ .../fileIO/python/PyVTKOutput.cpp | 15 +++ .../fileIO/python/PyVTKOutputType.hpp | 15 +++ src/coreComponents/fileIO/silo/SiloFile.cpp | 39 ++++---- src/coreComponents/fileIO/silo/SiloFile.hpp | 9 +- .../fileIO/timeHistory/BufferedHistoryIO.hpp | 11 ++- .../fileIO/timeHistory/HDFFile.cpp | 11 ++- .../fileIO/timeHistory/HDFFile.hpp | 11 ++- .../fileIO/timeHistory/HDFHistoryIO.cpp | 15 +++ .../fileIO/timeHistory/HDFHistoryIO.hpp | 11 ++- .../fileIO/timeHistory/HistoryCollection.hpp | 11 ++- .../timeHistory/HistoryCollectionBase.cpp | 9 +- .../timeHistory/HistoryCollectionBase.hpp | 13 +-- .../fileIO/timeHistory/PackCollection.cpp | 15 +++ .../fileIO/timeHistory/PackCollection.hpp | 11 ++- .../fileIO/vtk/VTKPVDWriter.cpp | 9 +- .../fileIO/vtk/VTKPVDWriter.hpp | 9 +- .../fileIO/vtk/VTKPolyDataWriterInterface.cpp | 35 +++---- .../fileIO/vtk/VTKPolyDataWriterInterface.hpp | 9 +- .../fileIO/vtk/VTKVTMWriter.cpp | 9 +- .../fileIO/vtk/VTKVTMWriter.hpp | 9 +- .../finiteElement/BilinearFormUtilities.hpp | 9 +- .../finiteElement/CMakeLists.txt | 2 +- .../UniformStrainHexahedron.cpp | 9 +- .../UniformStrainHexahedron.h | 9 +- .../FiniteElementDiscretization.cpp | 9 +- .../FiniteElementDiscretization.hpp | 9 +- .../FiniteElementDiscretizationManager.cpp | 9 +- .../FiniteElementDiscretizationManager.hpp | 9 +- .../finiteElement/FiniteElementDispatch.hpp | 11 ++- src/coreComponents/finiteElement/Kinematics.h | 9 +- .../finiteElement/LinearFormUtilities.hpp | 9 +- .../finiteElement/PDEUtilities.hpp | 9 +- .../ConformingVirtualElementOrder1.hpp | 11 ++- .../ConformingVirtualElementOrder1_impl.hpp | 10 +- .../elementFormulations/FiniteElementBase.hpp | 11 ++- ...H1_Hexahedron_Lagrange1_GaussLegendre2.hpp | 9 +- .../H1_Pyramid_Lagrange1_Gauss5.hpp | 9 +- ...rilateralFace_Lagrange1_GaussLegendre2.hpp | 9 +- .../H1_Tetrahedron_Lagrange1_Gauss1.hpp | 9 +- .../H1_TriangleFace_Lagrange1_Gauss1.hpp | 9 +- .../H1_Wedge_Lagrange1_Gauss6.hpp | 9 +- .../elementFormulations/LagrangeBasis1.hpp | 9 +- .../elementFormulations/LagrangeBasis2.hpp | 9 +- .../elementFormulations/LagrangeBasis3GL.hpp | 9 +- .../elementFormulations/LagrangeBasis4GL.hpp | 9 +- .../elementFormulations/LagrangeBasis5GL.hpp | 9 +- .../Qk_Hexahedron_Lagrange_GaussLobatto.hpp | 9 +- .../kernelInterface/ImplicitKernelBase.hpp | 9 +- .../kernelInterface/InterfaceKernelBase.hpp | 9 +- .../kernelInterface/KernelBase.hpp | 9 +- .../kernelInterface/SparsityKernelBase.hpp | 9 +- .../unitTests/testFiniteElementBase.cpp | 9 +- .../unitTests/testFiniteElementHelpers.hpp | 15 +++ ...H1_Hexahedron_Lagrange1_GaussLegendre2.cpp | 9 +- .../testH1_Pyramid_Lagrange1_Gauss5.cpp | 9 +- ...rilateralFace_Lagrange1_GaussLegendre2.cpp | 9 +- .../testH1_Tetrahedron_Lagrange1_Gauss1.cpp | 9 +- .../testH1_TriangleFace_Lagrange1_Gauss1.cpp | 9 +- .../testH1_Wedge_Lagrange1_Gauss6.cpp | 9 +- ...estQ3_Hexahedron_Lagrange_GaussLobatto.cpp | 9 +- ...estQ5_Hexahedron_Lagrange_GaussLobatto.cpp | 9 +- .../finiteVolume/BoundaryStencil.cpp | 9 +- .../finiteVolume/BoundaryStencil.hpp | 9 +- .../finiteVolume/CMakeLists.txt | 2 +- .../finiteVolume/CellElementStencilMPFA.cpp | 9 +- .../finiteVolume/CellElementStencilMPFA.hpp | 9 +- .../finiteVolume/CellElementStencilTPFA.cpp | 9 +- .../finiteVolume/CellElementStencilTPFA.hpp | 9 +- .../EmbeddedSurfaceToCellStencil.cpp | 9 +- .../EmbeddedSurfaceToCellStencil.hpp | 9 +- .../finiteVolume/FaceElementToCellStencil.cpp | 9 +- .../finiteVolume/FaceElementToCellStencil.hpp | 9 +- .../finiteVolume/FiniteVolumeManager.cpp | 9 +- .../finiteVolume/FiniteVolumeManager.hpp | 9 +- .../finiteVolume/FluxApproximationBase.cpp | 9 +- .../finiteVolume/FluxApproximationBase.hpp | 9 +- .../HybridMimeticDiscretization.cpp | 9 +- .../HybridMimeticDiscretization.hpp | 9 +- .../MimeticInnerProductDispatch.hpp | 9 +- .../finiteVolume/ProjectionEDFMHelper.cpp | 15 +++ .../finiteVolume/ProjectionEDFMHelper.hpp | 15 +++ .../finiteVolume/StencilBase.hpp | 9 +- .../finiteVolume/SurfaceElementStencil.cpp | 9 +- .../finiteVolume/SurfaceElementStencil.hpp | 9 +- .../TwoPointFluxApproximation.cpp | 9 +- .../TwoPointFluxApproximation.hpp | 9 +- .../BdVLMInnerProduct.hpp | 9 +- .../MimeticInnerProductBase.hpp | 9 +- .../MimeticInnerProductHelpers.hpp | 9 +- .../QuasiRTInnerProduct.hpp | 9 +- .../QuasiTPFAInnerProduct.hpp | 9 +- .../SimpleInnerProduct.hpp | 9 +- .../mimeticInnerProducts/TPFAInnerProduct.hpp | 9 +- src/coreComponents/functions/CMakeLists.txt | 2 +- .../functions/CompositeFunction.cpp | 9 +- .../functions/CompositeFunction.hpp | 9 +- src/coreComponents/functions/FunctionBase.cpp | 9 +- src/coreComponents/functions/FunctionBase.hpp | 9 +- .../functions/FunctionManager.cpp | 9 +- .../functions/FunctionManager.hpp | 9 +- .../functions/MultivariableTableFunction.cpp | 9 +- .../functions/MultivariableTableFunction.hpp | 9 +- .../MultivariableTableFunctionKernels.hpp | 9 +- .../functions/SymbolicFunction.cpp | 9 +- .../functions/SymbolicFunction.hpp | 10 +- .../functions/TableFunction.cpp | 9 +- .../functions/TableFunction.hpp | 9 +- .../functions/unitTests/CMakeLists.txt | 2 +- .../functions/unitTests/testFunctions.cpp | 13 +-- .../linearAlgebra/CMakeLists.txt | 2 +- .../linearAlgebra/DofManager.cpp | 15 +-- .../linearAlgebra/DofManager.hpp | 9 +- .../linearAlgebra/DofManagerHelpers.hpp | 9 +- .../linearAlgebra/common/LinearOperator.hpp | 9 +- .../linearAlgebra/common/LinearSolverBase.hpp | 11 ++- .../common/PreconditionerBase.hpp | 9 +- .../linearAlgebra/common/common.hpp | 9 +- .../linearAlgebra/common/traits.hpp | 11 ++- .../interfaces/InterfaceTypes.hpp | 29 +++--- .../linearAlgebra/interfaces/MatrixBase.hpp | 9 +- .../linearAlgebra/interfaces/VectorBase.hpp | 9 +- .../interfaces/direct/SuiteSparse.cpp | 17 ++-- .../interfaces/direct/SuiteSparse.hpp | 9 +- .../interfaces/direct/SuperLUDist.cpp | 15 +-- .../interfaces/direct/SuperLUDist.hpp | 9 +- .../interfaces/hypre/HypreExport.cpp | 11 ++- .../interfaces/hypre/HypreExport.hpp | 11 ++- .../interfaces/hypre/HypreInterface.cpp | 13 +-- .../interfaces/hypre/HypreInterface.hpp | 9 +- .../interfaces/hypre/HypreKernels.cpp | 9 +- .../interfaces/hypre/HypreKernels.hpp | 9 +- .../interfaces/hypre/HypreMGR.cpp | 9 +- .../interfaces/hypre/HypreMGR.hpp | 9 +- .../interfaces/hypre/HypreMatrix.cpp | 9 +- .../interfaces/hypre/HypreMatrix.hpp | 9 +- .../interfaces/hypre/HyprePreconditioner.cpp | 11 ++- .../interfaces/hypre/HyprePreconditioner.hpp | 9 +- .../interfaces/hypre/HypreSolver.cpp | 11 ++- .../interfaces/hypre/HypreSolver.hpp | 11 ++- .../interfaces/hypre/HypreUtils.cpp | 15 +-- .../interfaces/hypre/HypreUtils.hpp | 11 ++- .../interfaces/hypre/HypreVector.cpp | 9 +- .../interfaces/hypre/HypreVector.hpp | 9 +- .../CompositionalMultiphaseFVM.hpp | 9 +- .../CompositionalMultiphaseHybridFVM.hpp | 9 +- .../CompositionalMultiphaseReservoirFVM.hpp | 9 +- ...positionalMultiphaseReservoirHybridFVM.hpp | 9 +- .../HybridSinglePhasePoromechanics.hpp | 9 +- .../hypre/mgrStrategies/Hydrofracture.hpp | 9 +- .../LagrangianContactMechanics.hpp | 9 +- .../mgrStrategies/MultiphasePoromechanics.hpp | 9 +- .../MultiphasePoromechanicsReservoirFVM.hpp | 9 +- .../ReactiveCompositionalMultiphaseOBL.hpp | 9 +- .../mgrStrategies/SinglePhaseHybridFVM.hpp | 9 +- .../SinglePhasePoromechanics.hpp | 9 +- ...ePhasePoromechanicsConformingFractures.hpp | 9 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 9 +- .../SinglePhasePoromechanicsReservoirFVM.hpp | 9 +- .../mgrStrategies/SinglePhaseReservoirFVM.hpp | 9 +- .../SinglePhaseReservoirHybridFVM.hpp | 9 +- .../SolidMechanicsEmbeddedFractures.hpp | 9 +- .../ThermalCompositionalMultiphaseFVM.hpp | 9 +- .../ThermalMultiphasePoromechanics.hpp | 9 +- .../ThermalSinglePhasePoromechanics.hpp | 9 +- .../interfaces/petsc/PetscExport.cpp | 11 ++- .../interfaces/petsc/PetscExport.hpp | 11 ++- .../interfaces/petsc/PetscInterface.cpp | 9 +- .../interfaces/petsc/PetscInterface.hpp | 9 +- .../interfaces/petsc/PetscMatrix.cpp | 11 ++- .../interfaces/petsc/PetscMatrix.hpp | 9 +- .../interfaces/petsc/PetscPreconditioner.cpp | 9 +- .../interfaces/petsc/PetscPreconditioner.hpp | 9 +- .../interfaces/petsc/PetscSolver.cpp | 13 +-- .../interfaces/petsc/PetscSolver.hpp | 11 ++- .../interfaces/petsc/PetscUtils.hpp | 9 +- .../interfaces/petsc/PetscVector.cpp | 11 ++- .../interfaces/petsc/PetscVector.hpp | 11 ++- .../interfaces/trilinos/EpetraExport.cpp | 11 ++- .../interfaces/trilinos/EpetraExport.hpp | 11 ++- .../interfaces/trilinos/EpetraMatrix.cpp | 13 +-- .../interfaces/trilinos/EpetraMatrix.hpp | 9 +- .../interfaces/trilinos/EpetraUtils.hpp | 13 +-- .../interfaces/trilinos/EpetraVector.cpp | 13 +-- .../interfaces/trilinos/EpetraVector.hpp | 11 ++- .../interfaces/trilinos/TrilinosInterface.cpp | 9 +- .../interfaces/trilinos/TrilinosInterface.hpp | 9 +- .../trilinos/TrilinosPreconditioner.cpp | 9 +- .../trilinos/TrilinosPreconditioner.hpp | 9 +- .../interfaces/trilinos/TrilinosSolver.cpp | 11 ++- .../interfaces/trilinos/TrilinosSolver.hpp | 11 ++- .../linearAlgebra/solvers/BicgstabSolver.cpp | 23 ++--- .../linearAlgebra/solvers/BicgstabSolver.hpp | 9 +- .../solvers/BlockPreconditioner.cpp | 15 +-- .../solvers/BlockPreconditioner.hpp | 9 +- .../linearAlgebra/solvers/CgSolver.cpp | 17 ++-- .../linearAlgebra/solvers/CgSolver.hpp | 9 +- .../linearAlgebra/solvers/GmresSolver.cpp | 17 ++-- .../linearAlgebra/solvers/GmresSolver.hpp | 9 +- .../linearAlgebra/solvers/KrylovSolver.cpp | 15 +-- .../linearAlgebra/solvers/KrylovSolver.hpp | 9 +- .../linearAlgebra/solvers/KrylovUtils.hpp | 11 ++- .../solvers/PreconditionerBlockJacobi.hpp | 11 ++- .../solvers/PreconditionerIdentity.hpp | 9 +- .../solvers/PreconditionerJacobi.hpp | 11 ++- .../SeparateComponentPreconditioner.cpp | 15 +-- .../SeparateComponentPreconditioner.hpp | 9 +- .../unitTests/testComponentMask.cpp | 9 +- .../unitTests/testExternalSolvers.cpp | 23 ++--- .../unitTests/testKrylovSolvers.cpp | 21 ++-- .../unitTests/testLinearAlgebraUtils.hpp | 9 +- .../testLinearSolverParametersEnums.cpp | 11 ++- .../linearAlgebra/unitTests/testMatrices.cpp | 17 ++-- .../testReverseCutHillMcKeeOrdering.cpp | 9 +- .../linearAlgebra/unitTests/testVectors.cpp | 17 ++-- .../linearAlgebra/utilities/Arnoldi.hpp | 9 +- .../linearAlgebra/utilities/BlockOperator.hpp | 9 +- .../utilities/BlockOperatorView.hpp | 11 ++- .../utilities/BlockOperatorWrapper.hpp | 9 +- .../linearAlgebra/utilities/BlockVector.hpp | 9 +- .../utilities/BlockVectorView.hpp | 11 ++- .../utilities/BlockVectorWrapper.hpp | 9 +- .../linearAlgebra/utilities/ComponentMask.hpp | 9 +- .../utilities/InverseNormalOperator.hpp | 11 ++- .../utilities/LAIHelperFunctions.hpp | 11 ++- .../utilities/LinearSolverParameters.hpp | 9 +- .../utilities/LinearSolverResult.hpp | 9 +- .../utilities/NormalOperator.hpp | 11 ++- .../utilities/ReverseCutHillMcKeeOrdering.cpp | 9 +- .../utilities/ReverseCutHillMcKeeOrdering.hpp | 9 +- .../utilities/TransposeOperator.hpp | 11 ++- .../mainInterface/CMakeLists.txt | 2 +- .../mainInterface/GeosxState.cpp | 19 ++-- .../mainInterface/GeosxState.hpp | 15 +-- .../mainInterface/GeosxVersion.hpp.in | 29 ++++-- .../mainInterface/ProblemManager.cpp | 11 ++- .../mainInterface/ProblemManager.hpp | 9 +- .../mainInterface/initialization.cpp | 11 ++- .../mainInterface/initialization.hpp | 9 +- src/coreComponents/mainInterface/version.cpp | 19 ++-- src/coreComponents/mainInterface/version.hpp | 9 +- .../math/extrapolation/Extrapolation.hpp | 9 +- .../math/interpolation/Interpolation.hpp | 9 +- src/coreComponents/mesh/BufferOps.cpp | 9 +- src/coreComponents/mesh/BufferOps.hpp | 9 +- src/coreComponents/mesh/CMakeLists.txt | 2 +- src/coreComponents/mesh/CellElementRegion.cpp | 9 +- src/coreComponents/mesh/CellElementRegion.hpp | 9 +- .../mesh/CellElementSubRegion.cpp | 9 +- .../mesh/CellElementSubRegion.hpp | 9 +- src/coreComponents/mesh/DomainPartition.cpp | 11 ++- src/coreComponents/mesh/DomainPartition.hpp | 9 +- src/coreComponents/mesh/EdgeManager.cpp | 9 +- src/coreComponents/mesh/EdgeManager.hpp | 9 +- src/coreComponents/mesh/ElementRegionBase.cpp | 9 +- src/coreComponents/mesh/ElementRegionBase.hpp | 9 +- .../mesh/ElementRegionManager.cpp | 9 +- .../mesh/ElementRegionManager.hpp | 9 +- .../mesh/ElementSubRegionBase.cpp | 9 +- .../mesh/ElementSubRegionBase.hpp | 9 +- src/coreComponents/mesh/ElementType.hpp | 9 +- .../mesh/EmbeddedSurfaceNodeManager.cpp | 9 +- .../mesh/EmbeddedSurfaceNodeManager.hpp | 9 +- .../mesh/EmbeddedSurfaceSubRegion.cpp | 9 +- .../mesh/EmbeddedSurfaceSubRegion.hpp | 9 +- .../mesh/FaceElementSubRegion.cpp | 11 ++- .../mesh/FaceElementSubRegion.hpp | 15 +-- src/coreComponents/mesh/FaceManager.cpp | 9 +- src/coreComponents/mesh/FaceManager.hpp | 9 +- src/coreComponents/mesh/FieldIdentifiers.hpp | 9 +- .../mesh/InterObjectRelation.hpp | 9 +- src/coreComponents/mesh/MeshBody.cpp | 9 +- src/coreComponents/mesh/MeshBody.hpp | 9 +- src/coreComponents/mesh/MeshFields.hpp | 9 +- .../mesh/MeshForLoopInterface.hpp | 9 +- src/coreComponents/mesh/MeshLevel.cpp | 9 +- src/coreComponents/mesh/MeshLevel.hpp | 9 +- src/coreComponents/mesh/MeshManager.cpp | 25 ++--- src/coreComponents/mesh/MeshManager.hpp | 9 +- src/coreComponents/mesh/MeshObjectPath.cpp | 9 +- src/coreComponents/mesh/MeshObjectPath.hpp | 9 +- src/coreComponents/mesh/NodeManager.cpp | 9 +- src/coreComponents/mesh/NodeManager.hpp | 9 +- src/coreComponents/mesh/ObjectManagerBase.cpp | 9 +- src/coreComponents/mesh/ObjectManagerBase.hpp | 9 +- src/coreComponents/mesh/ParticleManager.cpp | 9 +- src/coreComponents/mesh/ParticleManager.hpp | 15 +-- src/coreComponents/mesh/ParticleRegion.cpp | 9 +- src/coreComponents/mesh/ParticleRegion.hpp | 15 +-- .../mesh/ParticleRegionBase.cpp | 9 +- .../mesh/ParticleRegionBase.hpp | 15 +-- src/coreComponents/mesh/ParticleSubRegion.cpp | 9 +- src/coreComponents/mesh/ParticleSubRegion.hpp | 15 +-- .../mesh/ParticleSubRegionBase.cpp | 9 +- .../mesh/ParticleSubRegionBase.hpp | 15 +-- src/coreComponents/mesh/ParticleType.hpp | 15 +-- src/coreComponents/mesh/Perforation.cpp | 9 +- src/coreComponents/mesh/Perforation.hpp | 9 +- src/coreComponents/mesh/PerforationData.cpp | 9 +- src/coreComponents/mesh/PerforationData.hpp | 9 +- src/coreComponents/mesh/PerforationFields.hpp | 9 +- .../mesh/SurfaceElementRegion.cpp | 9 +- .../mesh/SurfaceElementRegion.hpp | 9 +- .../mesh/SurfaceElementSubRegion.cpp | 9 +- .../mesh/SurfaceElementSubRegion.hpp | 9 +- src/coreComponents/mesh/ToElementRelation.cpp | 9 +- src/coreComponents/mesh/ToElementRelation.hpp | 9 +- .../mesh/ToParticleRelation.cpp | 9 +- .../mesh/ToParticleRelation.hpp | 15 +-- src/coreComponents/mesh/WellElementRegion.cpp | 9 +- src/coreComponents/mesh/WellElementRegion.hpp | 9 +- .../mesh/WellElementSubRegion.cpp | 9 +- .../mesh/WellElementSubRegion.hpp | 9 +- .../mesh/generators/CellBlock.cpp | 9 +- .../mesh/generators/CellBlock.hpp | 9 +- .../mesh/generators/CellBlockABC.hpp | 9 +- .../mesh/generators/CellBlockManager.cpp | 9 +- .../mesh/generators/CellBlockManager.hpp | 9 +- .../mesh/generators/CellBlockManagerABC.hpp | 9 +- .../mesh/generators/CellBlockUtilities.cpp | 9 +- .../mesh/generators/CellBlockUtilities.hpp | 9 +- .../mesh/generators/CollocatedNodes.cpp | 9 +- .../mesh/generators/CollocatedNodes.hpp | 9 +- .../generators/ExternalMeshGeneratorBase.cpp | 9 +- .../generators/ExternalMeshGeneratorBase.hpp | 9 +- .../mesh/generators/FaceBlock.cpp | 9 +- .../mesh/generators/FaceBlock.hpp | 9 +- .../mesh/generators/FaceBlockABC.hpp | 11 ++- .../mesh/generators/InternalMeshGenerator.cpp | 9 +- .../mesh/generators/InternalMeshGenerator.hpp | 9 +- .../mesh/generators/InternalWellGenerator.cpp | 9 +- .../mesh/generators/InternalWellGenerator.hpp | 9 +- .../generators/InternalWellboreGenerator.cpp | 9 +- .../generators/InternalWellboreGenerator.hpp | 9 +- .../mesh/generators/LineBlock.cpp | 9 +- .../mesh/generators/LineBlock.hpp | 13 +-- .../mesh/generators/LineBlockABC.hpp | 15 +-- .../mesh/generators/MeshGeneratorBase.cpp | 9 +- .../mesh/generators/MeshGeneratorBase.hpp | 9 +- .../mesh/generators/PTScotchInterface.cpp | 9 +- .../mesh/generators/PTScotchInterface.hpp | 9 +- .../mesh/generators/ParMETISInterface.cpp | 9 +- .../mesh/generators/ParMETISInterface.hpp | 9 +- .../mesh/generators/ParticleBlock.cpp | 9 +- .../mesh/generators/ParticleBlock.hpp | 15 +-- .../mesh/generators/ParticleBlockABC.hpp | 15 +-- .../mesh/generators/ParticleBlockManager.cpp | 9 +- .../mesh/generators/ParticleBlockManager.hpp | 15 +-- .../generators/ParticleBlockManagerABC.hpp | 13 +-- .../mesh/generators/ParticleMeshGenerator.cpp | 9 +- .../mesh/generators/ParticleMeshGenerator.hpp | 15 +-- .../mesh/generators/PartitionDescriptor.hpp | 15 +-- .../mesh/generators/PrismUtilities.hpp | 9 +- .../mesh/generators/VTKFaceBlockUtilities.cpp | 9 +- .../mesh/generators/VTKFaceBlockUtilities.hpp | 9 +- .../mesh/generators/VTKMeshGenerator.cpp | 9 +- .../mesh/generators/VTKMeshGenerator.hpp | 9 +- .../mesh/generators/VTKMeshGeneratorTools.cpp | 9 +- .../mesh/generators/VTKMeshGeneratorTools.hpp | 9 +- .../mesh/generators/VTKUtilities.cpp | 23 ++--- .../mesh/generators/VTKUtilities.hpp | 9 +- .../mesh/generators/VTKWellGenerator.cpp | 9 +- .../mesh/generators/VTKWellGenerator.hpp | 9 +- .../mesh/generators/WellGeneratorABC.hpp | 9 +- .../mesh/generators/WellGeneratorBase.cpp | 9 +- .../mesh/generators/WellGeneratorBase.hpp | 9 +- .../mesh/mpiCommunications/CommID.cpp | 9 +- .../mesh/mpiCommunications/CommID.hpp | 9 +- .../mpiCommunications/CommunicationTools.cpp | 9 +- .../mpiCommunications/CommunicationTools.hpp | 9 +- .../mesh/mpiCommunications/MPI_iCommData.cpp | 9 +- .../mesh/mpiCommunications/MPI_iCommData.hpp | 9 +- .../NeighborCommunicator.cpp | 9 +- .../NeighborCommunicator.hpp | 9 +- .../mesh/mpiCommunications/NeighborData.hpp | 9 +- .../mesh/mpiCommunications/PartitionBase.cpp | 9 +- .../mesh/mpiCommunications/PartitionBase.hpp | 9 +- .../mpiCommunications/SpatialPartition.cpp | 9 +- .../mpiCommunications/SpatialPartition.hpp | 9 +- .../mesh/simpleGeometricObjects/Box.cpp | 9 +- .../mesh/simpleGeometricObjects/Box.hpp | 9 +- .../CustomPolarObject.cpp | 11 ++- .../CustomPolarObject.hpp | 17 ++-- .../mesh/simpleGeometricObjects/Cylinder.cpp | 9 +- .../mesh/simpleGeometricObjects/Cylinder.hpp | 9 +- .../mesh/simpleGeometricObjects/Disc.cpp | 11 ++- .../mesh/simpleGeometricObjects/Disc.hpp | 17 ++-- .../GeometricObjectManager.cpp | 9 +- .../GeometricObjectManager.hpp | 9 +- .../PlanarGeometricObject.cpp | 11 ++- .../PlanarGeometricObject.hpp | 17 ++-- .../mesh/simpleGeometricObjects/Rectangle.cpp | 11 ++- .../mesh/simpleGeometricObjects/Rectangle.hpp | 17 ++-- .../SimpleGeometricObjectBase.cpp | 9 +- .../SimpleGeometricObjectBase.hpp | 9 +- .../simpleGeometricObjects/ThickPlane.cpp | 9 +- .../simpleGeometricObjects/ThickPlane.hpp | 9 +- .../unitTests/testComputationalGeometry.cpp | 9 +- .../mesh/unitTests/testGeometricObjects.cpp | 9 +- .../mesh/unitTests/testMeshObjectPath.cpp | 9 +- .../AverageOverQuadraturePointsKernel.hpp | 9 +- .../mesh/utilities/CIcomputationKernel.hpp | 9 +- .../mesh/utilities/ComputationalGeometry.cpp | 9 +- .../mesh/utilities/ComputationalGeometry.hpp | 9 +- .../mesh/utilities/MeshMapUtilities.hpp | 11 ++- .../utilities/StructuredGridUtilities.hpp | 9 +- .../physicsSolvers/CMakeLists.txt | 2 +- .../physicsSolvers/FieldStatisticsBase.hpp | 9 +- .../physicsSolvers/LinearSolverParameters.cpp | 9 +- .../physicsSolvers/LinearSolverParameters.hpp | 9 +- .../NonlinearSolverParameters.cpp | 9 +- .../NonlinearSolverParameters.hpp | 9 +- .../physicsSolvers/PhysicsSolverManager.cpp | 9 +- .../physicsSolvers/PhysicsSolverManager.hpp | 9 +- .../physicsSolvers/SolverBase.cpp | 13 +-- .../physicsSolvers/SolverBase.hpp | 11 ++- .../physicsSolvers/SolverBaseKernels.hpp | 9 +- .../physicsSolvers/SolverStatistics.cpp | 9 +- .../physicsSolvers/SolverStatistics.hpp | 9 +- .../physicsSolvers/contact/ContactFields.hpp | 9 +- .../contact/ContactSolverBase.cpp | 9 +- .../contact/ContactSolverBase.hpp | 9 +- .../SolidMechanicsALMBubbleKernels.hpp | 9 +- .../SolidMechanicsALMJumpUpdateKernels.hpp | 9 +- .../contact/SolidMechanicsALMKernels.hpp | 9 +- .../contact/SolidMechanicsALMKernelsBase.hpp | 9 +- .../SolidMechanicsALMKernelsHelper.hpp | 11 ++- ...lidMechanicsAugmentedLagrangianContact.cpp | 9 +- ...lidMechanicsAugmentedLagrangianContact.hpp | 9 +- .../SolidMechanicsEFEMJumpUpdateKernels.hpp | 9 +- .../contact/SolidMechanicsEFEMKernels.hpp | 9 +- .../contact/SolidMechanicsEFEMKernelsBase.hpp | 9 +- .../SolidMechanicsEFEMKernelsHelper.hpp | 11 ++- ...MechanicsEFEMStaticCondensationKernels.hpp | 9 +- .../SolidMechanicsEmbeddedFractures.cpp | 9 +- .../SolidMechanicsEmbeddedFractures.hpp | 9 +- .../contact/SolidMechanicsLagrangeContact.cpp | 11 ++- .../contact/SolidMechanicsLagrangeContact.hpp | 9 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 9 +- .../fluidFlow/CompositionalMultiphaseBase.hpp | 9 +- .../CompositionalMultiphaseBaseFields.hpp | 9 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 9 +- .../fluidFlow/CompositionalMultiphaseFVM.hpp | 9 +- .../CompositionalMultiphaseHybridFVM.cpp | 11 ++- .../CompositionalMultiphaseHybridFVM.hpp | 9 +- ...ompositionalMultiphaseHybridFVMKernels.cpp | 9 +- ...ompositionalMultiphaseHybridFVMKernels.hpp | 9 +- .../CompositionalMultiphaseStatistics.cpp | 9 +- .../CompositionalMultiphaseStatistics.hpp | 9 +- .../CompositionalMultiphaseUtilities.hpp | 9 +- ...ationCompositionalMultiphaseFVMKernels.hpp | 9 +- .../fluidFlow/FlowSolverBase.cpp | 9 +- .../fluidFlow/FlowSolverBase.hpp | 9 +- .../fluidFlow/FlowSolverBaseFields.hpp | 9 +- .../fluidFlow/FlowSolverBaseKernels.hpp | 15 +-- .../fluidFlow/FluxKernelsHelper.hpp | 9 +- .../fluidFlow/HybridFVMHelperKernels.hpp | 9 +- ...rmalCompositionalMultiphaseBaseKernels.hpp | 9 +- ...positionalMultiphaseFVMKernelUtilities.hpp | 17 ++-- ...ermalCompositionalMultiphaseFVMKernels.cpp | 9 +- ...ermalCompositionalMultiphaseFVMKernels.hpp | 9 +- .../ReactiveCompositionalMultiphaseOBL.cpp | 9 +- .../ReactiveCompositionalMultiphaseOBL.hpp | 9 +- ...activeCompositionalMultiphaseOBLFields.hpp | 9 +- ...ctiveCompositionalMultiphaseOBLKernels.hpp | 9 +- .../fluidFlow/SinglePhaseBase.cpp | 9 +- .../fluidFlow/SinglePhaseBase.hpp | 9 +- .../fluidFlow/SinglePhaseBaseFields.hpp | 9 +- .../fluidFlow/SinglePhaseBaseKernels.hpp | 9 +- .../fluidFlow/SinglePhaseFVM.cpp | 11 ++- .../fluidFlow/SinglePhaseFVM.hpp | 9 +- .../fluidFlow/SinglePhaseFVMKernels.hpp | 9 +- .../fluidFlow/SinglePhaseHybridFVM.cpp | 11 ++- .../fluidFlow/SinglePhaseHybridFVM.hpp | 9 +- .../fluidFlow/SinglePhaseHybridFVMKernels.hpp | 9 +- .../fluidFlow/SinglePhaseProppantBase.cpp | 9 +- .../fluidFlow/SinglePhaseProppantBase.hpp | 9 +- .../SinglePhaseProppantBaseKernels.hpp | 9 +- .../SinglePhaseProppantFluxKernels.cpp | 9 +- .../SinglePhaseProppantFluxKernels.hpp | 15 +-- .../fluidFlow/SinglePhaseStatistics.cpp | 9 +- .../fluidFlow/SinglePhaseStatistics.hpp | 9 +- ...lizedCompositionalMultiphaseFVMKernels.hpp | 9 +- .../StabilizedSinglePhaseFVMKernels.hpp | 9 +- .../fluidFlow/StencilAccessors.hpp | 9 +- ...rmalCompositionalMultiphaseBaseKernels.hpp | 9 +- ...ermalCompositionalMultiphaseFVMKernels.hpp | 9 +- .../ThermalSinglePhaseBaseKernels.hpp | 9 +- .../ThermalSinglePhaseFVMKernels.hpp | 9 +- .../proppantTransport/ProppantTransport.cpp | 11 ++- .../proppantTransport/ProppantTransport.hpp | 9 +- .../ProppantTransportFields.hpp | 9 +- .../ProppantTransportKernels.cpp | 9 +- .../ProppantTransportKernels.hpp | 9 +- .../wells/CompositionalMultiphaseWell.cpp | 9 +- .../wells/CompositionalMultiphaseWell.hpp | 9 +- .../CompositionalMultiphaseWellFields.hpp | 9 +- .../CompositionalMultiphaseWellKernels.cpp | 9 +- .../CompositionalMultiphaseWellKernels.hpp | 9 +- .../fluidFlow/wells/SinglePhaseWell.cpp | 9 +- .../fluidFlow/wells/SinglePhaseWell.hpp | 9 +- .../fluidFlow/wells/SinglePhaseWellFields.hpp | 9 +- .../wells/SinglePhaseWellKernels.cpp | 9 +- .../wells/SinglePhaseWellKernels.hpp | 9 +- .../fluidFlow/wells/WellConstants.hpp | 9 +- .../fluidFlow/wells/WellControls.cpp | 9 +- .../fluidFlow/wells/WellControls.hpp | 9 +- .../fluidFlow/wells/WellSolverBase.cpp | 9 +- .../fluidFlow/wells/WellSolverBase.hpp | 9 +- .../fluidFlow/wells/WellSolverBaseFields.hpp | 9 +- .../inducedSeismicity/SeismicityRate.cpp | 9 +- .../inducedSeismicity/SeismicityRate.hpp | 9 +- .../SeismicityRateKernels.hpp | 9 +- .../inducedSeismicityFields.hpp | 9 +- ...mpositionalMultiphaseReservoirAndWells.cpp | 9 +- ...mpositionalMultiphaseReservoirAndWells.hpp | 9 +- .../CoupledReservoirAndWellsBase.cpp | 9 +- .../CoupledReservoirAndWellsBase.hpp | 9 +- .../multiphysics/CoupledSolver.hpp | 9 +- .../FlowProppantTransportSolver.cpp | 9 +- .../FlowProppantTransportSolver.hpp | 9 +- .../multiphysics/HydrofractureSolver.cpp | 21 ++-- .../multiphysics/HydrofractureSolver.hpp | 11 ++- .../HydrofractureSolverKernels.hpp | 13 +-- .../multiphysics/MultiphasePoromechanics.cpp | 11 ++- .../multiphysics/MultiphasePoromechanics.hpp | 9 +- .../multiphysics/PhaseFieldFractureSolver.cpp | 9 +- .../multiphysics/PhaseFieldFractureSolver.hpp | 9 +- .../multiphysics/PoromechanicsFields.hpp | 9 +- .../PoromechanicsInitialization.cpp | 9 +- .../PoromechanicsInitialization.hpp | 9 +- .../multiphysics/PoromechanicsSolver.hpp | 9 +- .../multiphysics/SinglePhasePoromechanics.cpp | 11 ++- .../multiphysics/SinglePhasePoromechanics.hpp | 9 +- ...ePhasePoromechanicsConformingFractures.cpp | 9 +- ...ePhasePoromechanicsConformingFractures.hpp | 9 +- ...glePhasePoromechanicsEmbeddedFractures.cpp | 9 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 9 +- .../SinglePhaseReservoirAndWells.cpp | 9 +- .../SinglePhaseReservoirAndWells.hpp | 9 +- .../MultiphasePoromechanics.hpp | 9 +- .../MultiphasePoromechanics_impl.hpp | 9 +- .../PoromechanicsBase.hpp | 9 +- .../PoromechanicsEFEMKernels.cpp.template | 15 +++ .../PoromechanicsKernels.cmake | 12 +-- .../PoromechanicsKernels.cpp.template | 15 +++ .../SinglePhasePoromechanics.hpp | 9 +- ...ePhasePoromechanicsConformingFractures.hpp | 9 +- .../SinglePhasePoromechanicsEFEM.hpp | 9 +- .../SinglePhasePoromechanicsEFEM_impl.hpp | 9 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 9 +- .../SinglePhasePoromechanicsFractures.hpp | 9 +- .../SinglePhasePoromechanics_impl.hpp | 9 +- .../ThermalMultiphasePoromechanics.hpp | 9 +- .../ThermalMultiphasePoromechanics_impl.hpp | 9 +- .../ThermalSinglePhasePoromechanics.hpp | 9 +- ...ePhasePoromechanicsConformingFractures.hpp | 9 +- .../ThermalSinglePhasePoromechanicsEFEM.hpp | 9 +- ...ermalSinglePhasePoromechanicsEFEM_impl.hpp | 9 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 9 +- .../ThermalSinglePhasePoromechanics_impl.hpp | 9 +- .../ThermoPoromechanicsKernels.cpp.template | 15 +++ .../physicsSolvers/python/PySolver.cpp | 15 +++ .../physicsSolvers/python/PySolver.hpp | 15 +++ .../physicsSolvers/python/PySolverType.hpp | 15 +++ .../simplePDE/LaplaceBaseH1.cpp | 9 +- .../simplePDE/LaplaceBaseH1.hpp | 9 +- .../physicsSolvers/simplePDE/LaplaceFEM.cpp | 9 +- .../physicsSolvers/simplePDE/LaplaceFEM.hpp | 9 +- .../simplePDE/LaplaceFEMKernels.hpp | 11 ++- .../simplePDE/PhaseFieldDamageFEM.cpp | 9 +- .../simplePDE/PhaseFieldDamageFEM.hpp | 9 +- .../simplePDE/PhaseFieldDamageFEMKernels.hpp | 9 +- .../solidMechanics/MPMSolverFields.hpp | 15 +-- .../solidMechanics/SolidMechanicsFields.hpp | 9 +- .../SolidMechanicsLagrangianFEM.cpp | 11 ++- .../SolidMechanicsLagrangianFEM.hpp | 9 +- .../SolidMechanicsLagrangianSSLE.cpp | 9 +- .../SolidMechanicsLagrangianSSLE.hpp | 9 +- .../solidMechanics/SolidMechanicsMPM.cpp | 9 +- .../solidMechanics/SolidMechanicsMPM.hpp | 15 +-- .../SolidMechanicsStateReset.cpp | 9 +- .../SolidMechanicsStateReset.hpp | 9 +- .../SolidMechanicsStatistics.cpp | 9 +- .../SolidMechanicsStatistics.hpp | 9 +- .../kernels/ExplicitFiniteStrain.hpp | 9 +- .../kernels/ExplicitFiniteStrain_impl.hpp | 9 +- .../solidMechanics/kernels/ExplicitMPM.hpp | 17 ++-- .../kernels/ExplicitSmallStrain.hpp | 9 +- .../kernels/ExplicitSmallStrain_impl.hpp | 9 +- .../FixedStressThermoPoromechanics.hpp | 9 +- .../FixedStressThermoPoromechanics_impl.hpp | 9 +- .../kernels/ImplicitSmallStrainNewmark.hpp | 9 +- .../ImplicitSmallStrainNewmark_impl.hpp | 9 +- .../ImplicitSmallStrainQuasiStatic.hpp | 9 +- .../ImplicitSmallStrainQuasiStatic_impl.hpp | 9 +- ...essThermoPoromechanicsKernels.cpp.template | 15 ++- .../kernels/SolidMechanicsKernels.cmake | 10 +- .../SolidMechanicsKernels.cpp.template | 15 ++- .../SolidMechanicsLagrangianFEMKernels.hpp | 9 +- .../solidMechanics/kernels/StrainHelper.hpp | 9 +- .../solidMechanics/kernels/policies.hpp.in | 15 +++ .../EmbeddedSurfaceGenerator.cpp | 9 +- .../EmbeddedSurfaceGenerator.hpp | 9 +- ...mbeddedSurfacesParallelSynchronization.cpp | 9 +- ...mbeddedSurfacesParallelSynchronization.hpp | 9 +- .../ParallelTopologyChange.cpp | 15 +++ .../ParallelTopologyChange.hpp | 15 +++ .../surfaceGeneration/SurfaceGenerator.cpp | 11 ++- .../surfaceGeneration/SurfaceGenerator.hpp | 9 +- .../SurfaceGeneratorFields.hpp | 9 +- .../kernels/surfaceGenerationKernels.hpp | 9 +- .../surfaceGenerationKernelsHelpers.hpp | 9 +- .../AcousticFirstOrderWaveEquationSEM.cpp | 9 +- .../AcousticFirstOrderWaveEquationSEM.hpp | 9 +- ...cousticFirstOrderWaveEquationSEMKernel.hpp | 9 +- .../anisotropic/AcousticVTIFields.hpp | 9 +- .../AcousticVTIWaveEquationSEM.cpp | 9 +- .../AcousticVTIWaveEquationSEM.hpp | 9 +- .../AcousticVTIWaveEquationSEMKernel.hpp | 9 +- .../isotropic/AcousticPMLSEMKernel.hpp | 9 +- .../isotropic/AcousticWaveEquationSEM.cpp | 9 +- .../isotropic/AcousticWaveEquationSEM.hpp | 9 +- .../AcousticWaveEquationSEMKernel.hpp | 9 +- .../sem/acoustic/shared/AcousticFields.hpp | 9 +- .../shared/AcousticMatricesSEMKernel.hpp | 9 +- .../shared/AcousticTimeSchemeSEMKernel.hpp | 9 +- .../AcousticElasticWaveEquationSEM.cpp | 9 +- .../AcousticElasticWaveEquationSEM.hpp | 9 +- .../AcousticElasticWaveEquationSEMKernel.hpp | 9 +- .../isotropic/AcoustoElasticFields.hpp | 9 +- .../AcoustoElasticTimeSchemeSEMKernel.hpp | 9 +- .../ElasticFirstOrderWaveEquationSEM.cpp | 9 +- .../ElasticFirstOrderWaveEquationSEM.hpp | 9 +- ...ElasticFirstOrderWaveEquationSEMKernel.hpp | 9 +- .../anisotropic/ElasticVTIFields.hpp | 9 +- .../ElasticVTIWaveEquationSEMKernel.hpp | 9 +- .../isotropic/ElasticWaveEquationSEM.cpp | 9 +- .../isotropic/ElasticWaveEquationSEM.hpp | 9 +- .../ElasticWaveEquationSEMKernel.hpp | 9 +- .../sem/elastic/shared/ElasticFields.hpp | 9 +- .../shared/ElasticMatricesSEMKernel.hpp | 9 +- .../shared/ElasticTimeSchemeSEMKernel.hpp | 9 +- .../PrecomputeSourcesAndReceiversKernel.hpp | 9 +- .../wavePropagation/shared/WaveSolverBase.cpp | 9 +- .../wavePropagation/shared/WaveSolverBase.hpp | 9 +- .../shared/WaveSolverUtils.hpp | 9 +- src/coreComponents/schema/CMakeLists.txt | 2 +- src/coreComponents/schema/schemaUtilities.cpp | 9 +- src/coreComponents/schema/schemaUtilities.hpp | 9 +- .../constitutiveTests/CMakeLists.txt | 3 +- .../constitutiveTests/MultiFluidTest.hpp | 9 +- .../constitutiveTestHelpers.hpp | 11 ++- .../testCO2BrinePVTModels.cpp | 9 +- .../testCO2SpycherPruessModels.cpp | 9 +- .../testCapillaryPressure.cpp | 9 +- .../constitutiveTests/testDamage.cpp | 11 ++- .../testMultiFluidCO2Brine.cpp | 9 +- ...FluidCompositionalMultiphasePVTPackage.cpp | 9 +- .../testMultiFluidDeadOil.cpp | 9 +- .../testMultiFluidLiveOil.cpp | 9 +- .../unitTests/constitutiveTests/testPVT.cpp | 11 ++- .../constitutiveTests/testReactiveFluid.cpp | 11 ++- .../constitutiveTests/testRelPerm.cpp | 9 +- .../testRelPermHysteresis.cpp | 9 +- .../constitutiveTests/testTriaxial.cpp | 11 ++- .../dataRepositoryTests/CMakeLists.txt | 2 +- .../dataRepositoryTests/testGroupPath.cpp | 9 +- .../dataRepositoryTests/testObjectCatalog.cpp | 9 +- .../dataRepositoryTests/testRestartBasic.cpp | 11 ++- .../testRestartExtended.cpp | 9 +- .../testWrapperHelpers.cpp | 9 +- .../unitTests/dataRepositoryTests/utils.hpp | 17 +++- .../fieldSpecificationTests/CMakeLists.txt | 3 +- .../testAquiferBoundaryCondition.cpp | 9 +- .../testFieldSpecificationsEnums.cpp | 11 ++- .../testRecursiveFieldApplication.cpp | 9 +- .../unitTests/fileIOTests/CMakeLists.txt | 2 +- .../unitTests/fileIOTests/testHDFFile.cpp | 15 +++ .../fileIOTests/testHDFParallelFile.cpp | 15 +++ .../finiteVolumeTests/CMakeLists.txt | 3 +- .../testMimeticInnerProducts.cpp | 9 +- .../unitTests/fluidFlowTests/CMakeLists.txt | 3 +- .../fluidFlowTests/testCompFlowUtils.hpp | 9 +- .../fluidFlowTests/testCompMultiphaseFlow.cpp | 9 +- .../testCompMultiphaseFlowHybrid.cpp | 9 +- .../fluidFlowTests/testFlowKernelHelpers.hpp | 9 +- .../fluidFlowTests/testFlowStatistics.cpp | 9 +- .../fluidFlowTests/testFlowUtils.hpp | 9 +- ...testReactiveCompositionalMultiphaseOBL.cpp | 9 +- .../fluidFlowTests/testSingleFlowUtils.hpp | 9 +- .../testSinglePhaseBaseKernels.cpp | 9 +- .../testSinglePhaseFVMKernels.cpp | 9 +- .../testThermalCompMultiphaseFlow.cpp | 9 +- .../testThermalSinglePhaseFlow.cpp | 9 +- .../linearAlgebraTests/CMakeLists.txt | 2 +- .../linearAlgebraTests/testDofManager.cpp | 21 ++-- .../testDofManagerUtils.hpp | 9 +- .../testLAIHelperFunctions.cpp | 15 +-- .../unitTests/meshTests/CMakeLists.txt | 2 +- .../unitTests/meshTests/meshDirName.hpp.in | 15 +++ .../unitTests/meshTests/testMeshEnums.cpp | 11 ++- .../meshTests/testMeshGeneration.cpp | 9 +- .../meshTests/testNeighborCommunicator.cpp | 9 +- .../unitTests/meshTests/testVTKImport.cpp | 9 +- .../unitTests/testingUtilities/CMakeLists.txt | 4 +- .../testingUtilities/TestingTasks.cpp | 9 +- .../testingUtilities/TestingTasks.hpp | 9 +- .../unitTests/toolchain/testToolchain.cpp | 13 +-- .../virtualElementTests/CMakeLists.txt | 2 +- .../testConformingVirtualElementOrder1.cpp | 9 +- .../wavePropagationTests/CMakeLists.txt | 2 +- .../testWavePropagation.cpp | 11 ++- .../testWavePropagationAcousticFirstOrder.cpp | 11 ++- .../testWavePropagationAttenuation.cpp | 11 ++- .../testWavePropagationDAS.cpp | 11 ++- .../testWavePropagationElasticFirstOrder.cpp | 11 ++- .../testWavePropagationElasticVTI.cpp | 11 ++- .../testWavePropagationQ2.cpp | 11 ++- .../unitTests/wellsTests/CMakeLists.txt | 2 +- ...eservoirCompositionalMultiphaseMSWells.cpp | 9 +- .../testReservoirSinglePhaseMSWells.cpp | 9 +- .../unitTests/wellsTests/testWellEnums.cpp | 11 ++- .../unitTests/xmlTests/CMakeLists.txt | 2 +- .../unitTests/xmlTests/testXML.cpp | 9 +- .../unitTests/xmlTests/testXMLFile.cpp | 9 +- src/docs/doxygen/GeosxConfig.hpp | 62 ++++++------ src/docs/sphinx/QuickStart.rst | 6 +- .../inSituDataMonitor/AdvancedExample.rst | 20 ++-- .../AdvancedExample.rst | 16 +-- .../Dockerfile-remote-dev.example | 2 +- .../newComponentTemplate/src/CMakeLists.txt | 4 +- .../newComponentTemplate/src/NewComponent.cpp | 9 +- .../newComponentTemplate/src/NewComponent.hpp | 9 +- .../newComponentTemplate/tests/CMakeLists.txt | 2 +- .../tests/testNewComponent.cpp | 9 +- src/main/main.cpp | 9 +- src/pygeosx/pygeosx.cpp | 12 +-- src/pygeosx/pygeosx.hpp | 15 +-- 1280 files changed, 7283 insertions(+), 5621 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index aee70cdf5da..8b3405614f7 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -140,12 +140,12 @@ jobs: COMMIT=${{ github.event.pull_request.head.sha }} SHORT_COMMIT=${COMMIT:0:7} - script_args+=(--install-dir-basename GEOSX-${SHORT_COMMIT}) + script_args+=(--install-dir-basename GEOS-${SHORT_COMMIT}) # All the data exchanged with the docker container is eventually meant to be sent to the cloud. if [[ ! -z "${{ inputs.GCP_BUCKET }}" ]]; then if [ "${{ inputs.BUILD_TYPE }}" = "build" ]; then - DATA_BASENAME=GEOSX-and-TPL-${SHORT_COMMIT}.tar.gz + DATA_BASENAME=GEOS-and-TPL-${SHORT_COMMIT}.tar.gz elif [ "${{ inputs.BUILD_TYPE }}" = "integrated_tests" ]; then DATA_BASENAME=integratedTests-pr${{ github.event.number }}-${{ github.run_number }}-${SHORT_COMMIT}.tar.gz script_args+=(--run-integrated-tests) diff --git a/COPYRIGHT b/COPYRIGHT index fa82eaed68c..be5ead6e54e 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,19 +1,20 @@ Intellectual Property Notice ---------------------------- -GEOSX is licensed under the GNU Lesser General Public License, Version 2.1. +GEOS is licensed under the GNU Lesser General Public License, Version 2.1. See the toplevel LICENSE file for details. -Copyrights and patents in the GEOSX project are retained by individual -contributors. The following copyright applies to each file in the GEOSX +Copyrights and patents in the GEOS project are retained by individual +contributors. The following copyright applies to each file in the GEOS distribution, unless otherwise stated in the file: - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved -No copyright assignment is required to contribute to GEOSX. See the +No copyright assignment is required to contribute to GEOS. See the toplevel CONTRIBUTORS file for a list of contributors. diff --git a/examples/ObjectCatalog/Base.hpp b/examples/ObjectCatalog/Base.hpp index 6269bf70b46..ef0af4ad3fe 100644 --- a/examples/ObjectCatalog/Base.hpp +++ b/examples/ObjectCatalog/Base.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/examples/ObjectCatalog/Derived1.cpp b/examples/ObjectCatalog/Derived1.cpp index 0308729cbbf..1fe1dcae7c7 100644 --- a/examples/ObjectCatalog/Derived1.cpp +++ b/examples/ObjectCatalog/Derived1.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/examples/ObjectCatalog/Derived1.hpp b/examples/ObjectCatalog/Derived1.hpp index c7821219a2e..b3d04dc2cb0 100644 --- a/examples/ObjectCatalog/Derived1.hpp +++ b/examples/ObjectCatalog/Derived1.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/examples/ObjectCatalog/Derived2.cpp b/examples/ObjectCatalog/Derived2.cpp index 8c135c22002..3c43129c014 100644 --- a/examples/ObjectCatalog/Derived2.cpp +++ b/examples/ObjectCatalog/Derived2.cpp @@ -11,6 +11,7 @@ * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + #include "Derived2.hpp" diff --git a/examples/ObjectCatalog/Derived2.hpp b/examples/ObjectCatalog/Derived2.hpp index bb299a83603..06894666c02 100644 --- a/examples/ObjectCatalog/Derived2.hpp +++ b/examples/ObjectCatalog/Derived2.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/examples/ObjectCatalog/main.cpp b/examples/ObjectCatalog/main.cpp index 2fa0426759a..2304c252821 100644 --- a/examples/ObjectCatalog/main.cpp +++ b/examples/ObjectCatalog/main.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/host-configs/LBL/cori-gcc@8.1.0.cmake b/host-configs/LBL/cori-gcc@8.1.0.cmake index 8b6f5af6517..57c81ea666d 100644 --- a/host-configs/LBL/cori-gcc@8.1.0.cmake +++ b/host-configs/LBL/cori-gcc@8.1.0.cmake @@ -24,11 +24,11 @@ set(MPI_Fortran_COMPILER ${MPI_HOME}/bin/mpifort CACHE PATH "") set(MPIEXEC /usr/bin/srun CACHE PATH "") set(MPIEXEC_NUMPROC_FLAG "-n" CACHE STRING "") -set(GEOSX_TPL_DIR "/global/project/projectdirs/m1411/GEOSX/tpls/install-cori-gcc\@8.1.0-release-24-07-20" CACHE PATH "" ) +set(GEOS_TPL_DIR "/global/project/projectdirs/m1411/GEOSX/tpls/install-cori-gcc\@8.1.0-release-24-07-20" CACHE PATH "" ) -set(GEOSX_LINK_PREPEND_FLAG "-Wl,--whole-archive" CACHE STRING "" FORCE) -set(GEOSX_LINK_POSTPEND_FLAG "-Wl,--no-whole-archive" CACHE STRING "" FORCE) +set(GEOS_LINK_PREPEND_FLAG "-Wl,--whole-archive" CACHE STRING "" FORCE) +set(GEOS_LINK_POSTPEND_FLAG "-Wl,--no-whole-archive" CACHE STRING "" FORCE) set(ENABLE_SPHINX_EXECUTABLE OFF CACHE BOOL "") set(ENABLE_UNCRUSTIFY OFF CACHE BOOL "") diff --git a/host-configs/LBL/cori-intel.cmake b/host-configs/LBL/cori-intel.cmake index 85044651337..52387bd7ece 100644 --- a/host-configs/LBL/cori-intel.cmake +++ b/host-configs/LBL/cori-intel.cmake @@ -24,10 +24,10 @@ set(MPI_Fortran_COMPILER "ftn" CACHE PATH "" FORCE) set(MPIEXEC "/usr/bin/srun" CACHE PATH "") set(MPIEXEC_NUMPROC_FLAG "-n" CACHE STRING "") -set(GEOSX_TPL_DIR "/global/project/projectdirs/m1411/GEOSX/tpls/install-cori-intel-release-22-07-20" CACHE PATH "" ) +set(GEOS_TPL_DIR "/global/project/projectdirs/m1411/GEOSX/tpls/install-cori-intel-release-22-07-20" CACHE PATH "" ) -set(GEOSX_LINK_PREPEND_FLAG "-Wl,--whole-archive" CACHE STRING "" FORCE) -set(GEOSX_LINK_POSTPEND_FLAG "-Wl,--no-whole-archive" CACHE STRING "" FORCE) +set(GEOS_LINK_PREPEND_FLAG "-Wl,--whole-archive" CACHE STRING "" FORCE) +set(GEOS_LINK_POSTPEND_FLAG "-Wl,--no-whole-archive" CACHE STRING "" FORCE) set(ENABLE_SPHINX_EXECUTABLE OFF CACHE BOOL "") set(ENABLE_UNCRUSTIFY OFF CACHE BOOL "") diff --git a/host-configs/LLNL/lassen-base.cmake b/host-configs/LLNL/lassen-base.cmake index 79d08057de3..283755be313 100644 --- a/host-configs/LLNL/lassen-base.cmake +++ b/host-configs/LLNL/lassen-base.cmake @@ -7,8 +7,8 @@ # ############################################################################### -set( GEOSX_BUILD_SHARED_LIBS ON CACHE BOOL "" ) -set( GEOSX_BUILD_OBJ_LIBS OFF CACHE BOOL "" ) +set( GEOS_BUILD_SHARED_LIBS ON CACHE BOOL "" ) +set( GEOS_BUILD_OBJ_LIBS OFF CACHE BOOL "" ) # Fortran set(ENABLE_FORTRAN OFF CACHE BOOL "") @@ -54,7 +54,7 @@ if( ${ENABLE_HYPRE_DEVICE} STREQUAL "HIP" OR ${ENABLE_HYPRE_DEVICE} STREQUAL "CU set(ENABLE_TRILINOS OFF CACHE BOOL "" FORCE ) else() set(ENABLE_HYPRE OFF CACHE BOOL "" FORCE ) - set(GEOSX_LA_INTERFACE "Trilinos" CACHE STRING "" FORCE ) + set(GEOS_LA_INTERFACE "Trilinos" CACHE STRING "" FORCE ) endif() # Documentation diff --git a/host-configs/LLNL/tioga-base.cmake b/host-configs/LLNL/tioga-base.cmake index 7f87bf40bc4..02a9317b688 100644 --- a/host-configs/LLNL/tioga-base.cmake +++ b/host-configs/LLNL/tioga-base.cmake @@ -19,7 +19,7 @@ set( CAMP_STANDALONE TRUE CACHE BOOL "" ) set( ENABLE_ROCM ON CACHE BOOL "" FORCE ) set( ROCM_ROOT "${HIP_ROOT}" CACHE PATH "" ) -set( GEOSX_BUILD_OBJ_LIBS OFF CACHE BOOL "" FORCE ) +set( GEOS_BUILD_OBJ_LIBS OFF CACHE BOOL "" FORCE ) set( ENABLE_GTEST_DEATH_TESTS OFF CACHE BOOL "" ) set( gtest_disable_pthreads ON CACHE BOOL "" ) diff --git a/host-configs/LLNL/tioga-cce-15.cmake b/host-configs/LLNL/tioga-cce-15.cmake index c832a481ebf..1d63b429c2b 100644 --- a/host-configs/LLNL/tioga-cce-15.cmake +++ b/host-configs/LLNL/tioga-cce-15.cmake @@ -1,22 +1,22 @@ include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/LLNL/tioga-cce-15.cmake) include(${CMAKE_CURRENT_LIST_DIR}/tioga-base.cmake) -set( CONDUIT_DIR "${GEOSX_TPL_DIR}/conduit-0.8.7" CACHE PATH "" ) -set( HDF5_DIR "${GEOSX_TPL_DIR}/hdf5-1.14.1-2" CACHE PATH "" ) +set( CONDUIT_DIR "${GEOS_TPL_DIR}/conduit-0.8.7" CACHE PATH "" ) +set( HDF5_DIR "${GEOS_TPL_DIR}/hdf5-1.14.1-2" CACHE PATH "" ) set( BLAS_DIR "/opt/rocm-5.4.3/" CACHE PATH "" ) -set( PUGIXML_DIR "${GEOSX_TPL_DIR}/pugixml-1.13" CACHE PATH "" ) -set( FMT_DIR "${GEOSX_TPL_DIR}/fmt-10.0.0" CACHE PATH "" ) -set( SUITESPARSE_DIR "${GEOSX_TPL_DIR}/suite-sparse-5.10.1" CACHE PATH "" ) +set( PUGIXML_DIR "${GEOS_TPL_DIR}/pugixml-1.13" CACHE PATH "" ) +set( FMT_DIR "${GEOS_TPL_DIR}/fmt-10.0.0" CACHE PATH "" ) +set( SUITESPARSE_DIR "${GEOS_TPL_DIR}/suite-sparse-5.10.1" CACHE PATH "" ) # HYPRE options set( ENABLE_HYPRE_DEVICE "HIP" CACHE STRING "" ) set( ENABLE_HYPRE_MIXINT FALSE CACHE STRING "" ) -set( HYPRE_DIR "${GEOSX_TPL_DIR}/hypre-develop" CACHE PATH "" ) +set( HYPRE_DIR "${GEOS_TPL_DIR}/hypre-develop" CACHE PATH "" ) set( ENABLE_CALIPER ON CACHE BOOL "" FORCE ) -set( CALIPER_DIR "${GEOSX_TPL_DIR}/caliper-2.8.0" CACHE PATH "" ) +set( CALIPER_DIR "${GEOS_TPL_DIR}/caliper-2.8.0" CACHE PATH "" ) # haven't build I/O TPLs on tioga yet set( ENABLE_SILO OFF CACHE BOOL "" FORCE ) \ No newline at end of file diff --git a/host-configs/ORNL/ascent-gcc@8.1.1.cmake b/host-configs/ORNL/ascent-gcc@8.1.1.cmake index 10c24638537..dcbdf329c40 100644 --- a/host-configs/ORNL/ascent-gcc@8.1.1.cmake +++ b/host-configs/ORNL/ascent-gcc@8.1.1.cmake @@ -21,7 +21,7 @@ set(ESSL_LIBRARIES /sw/ascent/essl/6.2.0-20190419/essl/6.2/lib64/libesslsmpcuda. /sw/ascent/xl/16.1.1-3/lib/libxlf90_r.so.1 ${CUDA_TOOLKIT_ROOT_DIR}/lib64/libcublas.so ${CUDA_TOOLKIT_ROOT_DIR}/lib64/libcudart.so - ${GEOSX_TPL_ROOT_DIR}/liblapackforessl.a + ${GEOS_TPL_ROOT_DIR}/liblapackforessl.a /sw/ascent/xl/16.1.1-3/xlC/16.1.1/lib/libxl.a CACHE PATH "") diff --git a/host-configs/ORNL/frontier-base.cmake b/host-configs/ORNL/frontier-base.cmake index 63555a10201..c33d1fc25ba 100644 --- a/host-configs/ORNL/frontier-base.cmake +++ b/host-configs/ORNL/frontier-base.cmake @@ -18,7 +18,7 @@ set( CAMP_STANDALONE TRUE CACHE BOOL "" ) set( ENABLE_ROCM ON CACHE BOOL "" FORCE ) set( ROCM_ROOT "${HIP_ROOT}" CACHE PATH "" ) -set( GEOSX_BUILD_OBJ_LIBS OFF CACHE BOOL "" FORCE ) +set( GEOS_BUILD_OBJ_LIBS OFF CACHE BOOL "" FORCE ) set( ENABLE_GTEST_DEATH_TESTS OFF CACHE BOOL "" ) set( gtest_disable_pthreads ON CACHE BOOL "" ) @@ -31,8 +31,8 @@ set( ENABLE_DOCS OFF CACHE BOOL "" FORCE ) set( ENABLE_SCOTCH OFF CACHE BOOL "" FORCE ) set( ENABLE_SUPERLU_DIST OFF CACHE BOOL "" FORCE ) -set( GEOSX_BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE ) -set( GEOSX_BUILD_OBJ_LIBS OFF CACHE BOOL "" FORCE ) +set( GEOS_BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE ) +set( GEOS_BUILD_OBJ_LIBS OFF CACHE BOOL "" FORCE ) set( CMAKE_CXX_STANDARD 17 CACHE STRING "" ) set( BLT_CXX_STD c++17 CACHE STRING "" ) diff --git a/host-configs/ORNL/frontier-cce@15.0.0.cmake b/host-configs/ORNL/frontier-cce@15.0.0.cmake index d4aa1182b9b..f72fce7c636 100644 --- a/host-configs/ORNL/frontier-cce@15.0.0.cmake +++ b/host-configs/ORNL/frontier-cce@15.0.0.cmake @@ -3,17 +3,17 @@ set(CCE_VERSION 15.0.0) include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/ORNL/frontier-cce@${CCE_VERSION}.cmake) include(${CMAKE_CURRENT_LIST_DIR}/frontier-base.cmake) -set( CONDUIT_DIR "${GEOSX_TPL_DIR}/conduit-0.8.7" CACHE PATH "" ) -set( HDF5_DIR "${GEOSX_TPL_DIR}/hdf5-1.12.2" CACHE PATH "" ) +set( CONDUIT_DIR "${GEOS_TPL_DIR}/conduit-0.8.7" CACHE PATH "" ) +set( HDF5_DIR "${GEOS_TPL_DIR}/hdf5-1.12.2" CACHE PATH "" ) set( ENABLE_SILO FALSE CACHE BOOL "" ) set( ENABLE_VTK FALSE CACHE BOOL "" ) set( BLAS_DIR "/opt/rocm-${ROCM_VERSION}/" CACHE PATH "" ) -set( PUGIXML_DIR "${GEOSX_TPL_DIR}/pugixml-1.11.4" CACHE PATH "" ) -set( FMT_DIR "${GEOSX_TPL_DIR}/fmt-8.0.1" CACHE PATH "" ) -set( SUITESPARSE_DIR "${GEOSX_TPL_DIR}/suite-sparse-5.10.1" CACHE PATH "" ) +set( PUGIXML_DIR "${GEOS_TPL_DIR}/pugixml-1.11.4" CACHE PATH "" ) +set( FMT_DIR "${GEOS_TPL_DIR}/fmt-8.0.1" CACHE PATH "" ) +set( SUITESPARSE_DIR "${GEOS_TPL_DIR}/suite-sparse-5.10.1" CACHE PATH "" ) # HYPRE options set( ENABLE_HYPRE_DEVICE "HIP" CACHE STRING "" ) @@ -22,4 +22,4 @@ set( ENABLE_HYPRE_MIXINT TRUE CACHE STRING "" ) set( HYPRE_DIR "/lustre/orion/geo127/world-shared/hypre/hypre_v2.27.0-218-ge2806c33d_cce-15.0.0_rocm-5.4.3_mixint_umpire-2022.03.0_caliper-2.8.0_rel/" CACHE PATH "" ) set( ENABLE_CALIPER ON CACHE BOOL "" FORCE ) -set( CALIPER_DIR "${GEOSX_TPL_DIR}/caliper-2.8.0" CACHE PATH "" ) +set( CALIPER_DIR "${GEOS_TPL_DIR}/caliper-2.8.0" CACHE PATH "" ) diff --git a/host-configs/Stanford/sherlock-base.cmake b/host-configs/Stanford/sherlock-base.cmake index 2e45c12491c..e7e0e0ee83a 100644 --- a/host-configs/Stanford/sherlock-base.cmake +++ b/host-configs/Stanford/sherlock-base.cmake @@ -43,8 +43,8 @@ set(ENABLE_CALIPER ON CACHE BOOL "") if( ${ENABLE_HYPRE_DEVICE} STREQUAL "CUDA" ) set(ENABLE_PETSC OFF CACHE BOOL "") set(ENABLE_TRILINOS OFF CACHE BOOL "") - set(GEOSX_LA_INTERFACE "Hypre" CACHE STRING "") + set(GEOS_LA_INTERFACE "Hypre" CACHE STRING "") endif() -set(GEOSX_TPL_DIR /home/groups/tchelepi/geosx/thirdPartyLibs/install-${CONFIG_NAME}-release CACHE PATH "") +set(GEOS_TPL_DIR /home/groups/tchelepi/geosx/thirdPartyLibs/install-${CONFIG_NAME}-release CACHE PATH "") include(/home/groups/tchelepi/geosx/GEOSX/host-configs/tpls.cmake) diff --git a/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10-cuda11.5.0-sm80.cmake b/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10-cuda11.5.0-sm80.cmake index c87eee9c96e..4d33559f0ad 100644 --- a/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10-cuda11.5.0-sm80.cmake +++ b/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10-cuda11.5.0-sm80.cmake @@ -21,7 +21,7 @@ set(CMAKE_CUDA_FLAGS_RELWITHDEBINFO "-g -lineinfo ${CMAKE_CUDA_FLAGS_RELEASE}" C set(CMAKE_CUDA_FLAGS_DEBUG "-g -G -O0 -Xcompiler -O0" CACHE STRING "") # LAI options -set(GEOSX_LA_INTERFACE "Hypre" CACHE STRING "" FORCE) +set(GEOS_LA_INTERFACE "Hypre" CACHE STRING "" FORCE) set(ENABLE_HYPRE ON CACHE BOOL "" FORCE) set(ENABLE_HYPRE_DEVICE "CUDA" CACHE STRING "" FORCE) set(ENABLE_PETSC OFF CACHE BOOL "" FORCE) diff --git a/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10-cuda11.7.1-sm70.cmake b/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10-cuda11.7.1-sm70.cmake index 51031871d6b..0fd52e8d3bf 100644 --- a/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10-cuda11.7.1-sm70.cmake +++ b/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10-cuda11.7.1-sm70.cmake @@ -21,7 +21,7 @@ set(CMAKE_CUDA_FLAGS_RELWITHDEBINFO "-g -lineinfo ${CMAKE_CUDA_FLAGS_RELEASE}" C set(CMAKE_CUDA_FLAGS_DEBUG "-g -G -O0 -Xcompiler -O0" CACHE STRING "") # LAI options -set(GEOSX_LA_INTERFACE "Hypre" CACHE STRING "" FORCE) +set(GEOS_LA_INTERFACE "Hypre" CACHE STRING "" FORCE) set(ENABLE_HYPRE ON CACHE BOOL "" FORCE) set(ENABLE_HYPRE_DEVICE "CUDA" CACHE STRING "" FORCE) set(ENABLE_PETSC OFF CACHE BOOL "" FORCE) diff --git a/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10.cmake b/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10.cmake index 2fb9add4657..86013187457 100644 --- a/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10.cmake +++ b/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10.cmake @@ -40,5 +40,5 @@ set(LAPACK_LIBRARIES "${OPENBLAS_ROOT}/lib/libopenblas.so" CACHE STRING "") set(ENABLE_VALGRIND OFF CACHE BOOL "") set(ENABLE_CALIPER ON CACHE BOOL "") -set(GEOSX_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) +set(GEOS_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) include(${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake) diff --git a/host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2.cmake b/host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2.cmake index c2b8e96c328..b62c1c45f74 100644 --- a/host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2.cmake +++ b/host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2.cmake @@ -4,9 +4,9 @@ set(CONFIG_NAME "pangea3-gcc8.4.1-ompi-4.1.2" CACHE PATH "") # Set up the tpls -set(GEOSX_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) -if (NOT DEFINED GEOSX_TPL_DIR) - message(FATAL_ERROR "You must set GEOSX_TPL_DIR with -D GEOSX_TPL_DIR=") +set(GEOS_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) +if (NOT DEFINED GEOS_TPL_DIR) + message(FATAL_ERROR "You must set GEOS_TPL_DIR with -D GEOS_TPL_DIR=") endif () @@ -77,7 +77,7 @@ set(ENABLE_MATHPRESSO OFF CACHE BOOL "") # Silo configure script doesn't recognize systype set(SILO_BUILD_TYPE powerpc64-unknown-linux-gnu CACHE STRING "") -set(GEOSX_BUILD_SHARED_LIBS OFF CACHE BOOL "") +set(GEOS_BUILD_SHARED_LIBS OFF CACHE BOOL "") set(ENABLE_PVTPackage ON CACHE BOOL "") set(ENABLE_CALIPER ON CACHE BOOL "") @@ -98,7 +98,7 @@ endif() set(ENABLE_DOXYGEN OFF CACHE PATH "") -set(PETSC_OMP_DIR ${GEOSX_TPL_ROOT_DIR}/omp-links-for-petsc CACHE STRING "") +set(PETSC_OMP_DIR ${GEOS_TPL_ROOT_DIR}/omp-links-for-petsc CACHE STRING "") # PETSc doesn't seem to work correctly with clang. set(ENABLE_PETSC OFF CACHE BOOL "") diff --git a/host-configs/TOTAL/pecan-CPU.cmake b/host-configs/TOTAL/pecan-CPU.cmake index 09d6bc79b94..a68d14fbc62 100644 --- a/host-configs/TOTAL/pecan-CPU.cmake +++ b/host-configs/TOTAL/pecan-CPU.cmake @@ -21,7 +21,7 @@ set(ENABLE_HYPRE ON CACHE BOOL "" FORCE ) set(ENABLE_GTEST_DEATH_TESTS ON CACHE BOOL "" FORCE) set(ENABLE_CALIPER ON CACHE BOOL "") -set(ENABLE_GEOSX_PTP ON CACHE BOOL "" FORCE) +set(ENABLE_GEOS_PTP ON CACHE BOOL "" FORCE) set(ENABLE_MKL ON CACHE BOOL "") set(INTEL_ROOT "/apps/intel/2019/u5/compilers_and_libraries_2019.5.281/linux" ) @@ -33,5 +33,5 @@ set(MKL_LIBRARIES ${MKL_ROOT}/lib/intel64/libmkl_intel_lp64.so ${INTEL_ROOT}/compiler/lib/intel64_lin/libiomp5.so CACHE STRING "") -set(GEOSX_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) +set(GEOS_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) include(${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake) diff --git a/host-configs/apple/darwin-clang.cmake b/host-configs/apple/darwin-clang.cmake index e2ad859cce1..cdf690c0e5a 100644 --- a/host-configs/apple/darwin-clang.cmake +++ b/host-configs/apple/darwin-clang.cmake @@ -20,7 +20,7 @@ set(ENABLE_OPENMP "OFF" CACHE PATH "" FORCE) set(ENABLE_CALIPER "OFF" CACHE PATH "" FORCE ) -#set(GEOSX_BUILD_OBJ_LIBS ON CACHE BOOL "" FORCE) +#set(GEOS_BUILD_OBJ_LIBS ON CACHE BOOL "" FORCE) set( BLAS_LIBRARIES /usr/local/opt/openblas/lib/libblas.dylib CACHE PATH "" FORCE ) set( LAPACK_LIBRARIES /usr/local/opt/openblas/lib/liblapack.dylib CACHE PATH "" FORCE ) @@ -30,9 +30,9 @@ set(ENABLE_DOXYGEN OFF CACHE BOOL "" FORCE) #set( DOXYGEN_EXECUTABLE /usr/local/bin/doxygen CACHE PATH "" FORCE ) #set( SPHINX_EXECUTABLE /usr/local/bin/sphinx-build CACHE PATH "" FORCE ) -set(GEOSX_TPL_DIR "/usr/local/GEOSX/GEOSX_TPL" CACHE PATH "" FORCE ) -if(NOT ( EXISTS "${GEOSX_TPL_DIR}" AND IS_DIRECTORY "${GEOSX_TPL_DIR}" ) ) - set(GEOSX_TPL_DIR "${CMAKE_SOURCE_DIR}/../../thirdPartyLibs/install-darwin-clang-release" CACHE PATH "" FORCE ) +set(GEOS_TPL_DIR "/usr/local/GEOSX/GEOS_TPL" CACHE PATH "" FORCE ) +if(NOT ( EXISTS "${GEOS_TPL_DIR}" AND IS_DIRECTORY "${GEOS_TPL_DIR}" ) ) + set(GEOS_TPL_DIR "${CMAKE_SOURCE_DIR}/../../thirdPartyLibs/install-darwin-clang-release" CACHE PATH "" FORCE ) endif() include(${CMAKE_CURRENT_LIST_DIR}/tpls.cmake) diff --git a/host-configs/apple/macOS_base.cmake b/host-configs/apple/macOS_base.cmake index 319ab6ea179..e300aca41a7 100644 --- a/host-configs/apple/macOS_base.cmake +++ b/host-configs/apple/macOS_base.cmake @@ -27,15 +27,15 @@ set( LAPACK_LIBRARIES ${HOMEBREW_DIR}/opt/lapack/lib/liblapack.dylib CACHE PATH set(ENABLE_DOXYGEN OFF CACHE BOOL "" FORCE) set(ENABLE_MATHPRESSO OFF CACHE BOOL "" FORCE ) -#set(GEOSX_BUILD_OBJ_LIBS ON CACHE BOOL "" FORCE) +#set(GEOS_BUILD_OBJ_LIBS ON CACHE BOOL "" FORCE) #set( DOXYGEN_EXECUTABLE /usr/local/bin/doxygen CACHE PATH "" FORCE ) #set( SPHINX_EXECUTABLE /usr/local/bin/sphinx-build CACHE PATH "" FORCE ) -if(NOT ( EXISTS "${GEOSX_TPL_DIR}" AND IS_DIRECTORY "${GEOSX_TPL_DIR}" ) ) - set(GEOSX_TPL_DIR "${CMAKE_SOURCE_DIR}/../../thirdPartyLibs/install-${CONFIG_NAME}-release" CACHE PATH "" FORCE ) +if(NOT ( EXISTS "${GEOS_TPL_DIR}" AND IS_DIRECTORY "${GEOS_TPL_DIR}" ) ) + set(GEOS_TPL_DIR "${CMAKE_SOURCE_DIR}/../../thirdPartyLibs/install-${CONFIG_NAME}-release" CACHE PATH "" FORCE ) endif() # ATS diff --git a/host-configs/environment.cmake b/host-configs/environment.cmake index 33a3b52fa6b..b843c4ce9b7 100644 --- a/host-configs/environment.cmake +++ b/host-configs/environment.cmake @@ -19,7 +19,7 @@ if(NOT DEFINED ENABLE_HYPRE) endif() # ... and then check the value. if(ENABLE_HYPRE) - set(GEOSX_LA_INTERFACE "Hypre" CACHE STRING "" FORCE) + set(GEOS_LA_INTERFACE "Hypre" CACHE STRING "" FORCE) else() set(ENABLE_HYPRE OFF CACHE BOOL "" FORCE) endif() @@ -29,7 +29,7 @@ if(NOT DEFINED ENABLE_TRILINOS) set(ENABLE_TRILINOS "$ENV{ENABLE_TRILINOS}" CACHE BOOL "" FORCE) endif() if(ENABLE_TRILINOS) - set(GEOSX_LA_INTERFACE "Trilinos" CACHE STRING "" FORCE) + set(GEOS_LA_INTERFACE "Trilinos" CACHE STRING "" FORCE) else() set(ENABLE_TRILINOS FALSE CACHE BOOL "" FORCE) endif() @@ -40,7 +40,7 @@ if( (ENABLE_HYPRE AND ENABLE_TRILINOS) OR (NOT ENABLE_TRILINOS AND NOT ENABLE_HY MESSAGE(SEND_ERROR "ENABLE_TRILINOS = ${ENABLE_TRILINOS}.") endif() -MESSAGE(STATUS "GEOSX_LA_INTERFACE = ${GEOSX_LA_INTERFACE}") +MESSAGE(STATUS "GEOS_LA_INTERFACE = ${GEOS_LA_INTERFACE}") set(ENABLE_CUDA "$ENV{ENABLE_CUDA}" CACHE BOOL "" FORCE) if(ENABLE_CUDA) @@ -78,5 +78,5 @@ if(DEFINED ENV{LAPACK_LIBRARIES}) set(LAPACK_LIBRARIES "$ENV{LAPACK_LIBRARIES}" CACHE PATH "" FORCE) endif() -set(GEOSX_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) +set(GEOS_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) include(${CMAKE_CURRENT_LIST_DIR}/tpls.cmake) diff --git a/host-configs/tpls.cmake b/host-configs/tpls.cmake index 94fdabff495..1a4ab1701e6 100644 --- a/host-configs/tpls.cmake +++ b/host-configs/tpls.cmake @@ -1,112 +1,111 @@ # # Performance portability # -message("in tpls.cmake GEOSX_TPL_DIR=${GEOSX_TPL_DIR}") +message("in tpls.cmake GEOS_TPL_DIR=${GEOS_TPL_DIR}") # # General TPL Folder verifications # -if(NOT EXISTS ${GEOSX_TPL_DIR}) - message(WARNING "'GEOSX_TPL_DIR' does not exist.\n") +if(NOT EXISTS ${GEOS_TPL_DIR}) + message(WARNING "'GEOS_TPL_DIR' does not exist.\n") endif() -if(EXISTS ${GEOSX_TPL_DIR}/raja) - set(RAJA_DIR ${GEOSX_TPL_DIR}/raja CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/raja) + set(RAJA_DIR ${GEOS_TPL_DIR}/raja CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/chai) - set(UMPIRE_DIR ${GEOSX_TPL_DIR}/chai CACHE PATH "" FORCE) - set(CHAI_DIR ${GEOSX_TPL_DIR}/chai CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/chai) + set(UMPIRE_DIR ${GEOS_TPL_DIR}/chai CACHE PATH "" FORCE) + set(CHAI_DIR ${GEOS_TPL_DIR}/chai CACHE PATH "" FORCE) endif() # # IO TPLs # -if(EXISTS ${GEOSX_TPL_DIR}/hdf5) - set(HDF5_DIR ${GEOSX_TPL_DIR}/hdf5 CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/hdf5) + set(HDF5_DIR ${GEOS_TPL_DIR}/hdf5 CACHE PATH "" FORCE) message(STATUS "HDF5_DIR = ${HDF5_DIR}") endif() -if(EXISTS ${GEOSX_TPL_DIR}/conduit) - set(CONDUIT_DIR ${GEOSX_TPL_DIR}/conduit CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/conduit) + set(CONDUIT_DIR ${GEOS_TPL_DIR}/conduit CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/silo) - set(SILO_DIR ${GEOSX_TPL_DIR}/silo CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/silo) + set(SILO_DIR ${GEOS_TPL_DIR}/silo CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/adiak) - set(ADIAK_DIR ${GEOSX_TPL_DIR}/adiak CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/adiak) + set(ADIAK_DIR ${GEOS_TPL_DIR}/adiak CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/caliper) - set(CALIPER_DIR ${GEOSX_TPL_DIR}/caliper CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/caliper) + set(CALIPER_DIR ${GEOS_TPL_DIR}/caliper CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/pugixml) - set(PUGIXML_DIR ${GEOSX_TPL_DIR}/pugixml CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/pugixml) + set(PUGIXML_DIR ${GEOS_TPL_DIR}/pugixml CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/vtk) - set(VTK_DIR ${GEOSX_TPL_DIR}/vtk CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/vtk) + set(VTK_DIR ${GEOS_TPL_DIR}/vtk CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/fmt) -# set(FMT_DIR ${GEOSX_TPL_DIR}/fmt CACHE PATH "" FORCE) - set(FMT_DIR ${GEOSX_TPL_DIR}/chai CACHE PATH "" FORCE) -# /Users/settgast1/Codes/geos/thirdPartyLibs/install-macOS_arm-release/chai/lib/cmake/fmt/fmt-targets.cmake +if(EXISTS ${GEOS_TPL_DIR}/fmt) +# set(FMT_DIR ${GEOS_TPL_DIR}/fmt CACHE PATH "" FORCE) + set(FMT_DIR ${GEOS_TPL_DIR}/chai CACHE PATH "" FORCE) endif() # # Math TPLs # -if(EXISTS ${GEOSX_TPL_DIR}/metis) - set(METIS_DIR ${GEOSX_TPL_DIR}/metis CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/metis) + set(METIS_DIR ${GEOS_TPL_DIR}/metis CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/parmetis) - set(PARMETIS_DIR ${GEOSX_TPL_DIR}/parmetis CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/parmetis) + set(PARMETIS_DIR ${GEOS_TPL_DIR}/parmetis CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/superlu_dist) - set(SUPERLU_DIST_DIR ${GEOSX_TPL_DIR}/superlu_dist CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/superlu_dist) + set(SUPERLU_DIST_DIR ${GEOS_TPL_DIR}/superlu_dist CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/suitesparse) - set(SUITESPARSE_DIR ${GEOSX_TPL_DIR}/suitesparse CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/suitesparse) + set(SUITESPARSE_DIR ${GEOS_TPL_DIR}/suitesparse CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/trilinos) - set(TRILINOS_DIR ${GEOSX_TPL_DIR}/trilinos CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/trilinos) + set(TRILINOS_DIR ${GEOS_TPL_DIR}/trilinos CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/hypre) - set(HYPRE_DIR ${GEOSX_TPL_DIR}/hypre CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/hypre) + set(HYPRE_DIR ${GEOS_TPL_DIR}/hypre CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/scotch) - set(SCOTCH_DIR ${GEOSX_TPL_DIR}/scotch CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/scotch) + set(SCOTCH_DIR ${GEOS_TPL_DIR}/scotch CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/petsc AND (NOT DEFINED ENABLE_PETSC OR ENABLE_PETSC)) - set(PETSC_DIR ${GEOSX_TPL_DIR}/petsc CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/petsc AND (NOT DEFINED ENABLE_PETSC OR ENABLE_PETSC)) + set(PETSC_DIR ${GEOS_TPL_DIR}/petsc CACHE PATH "" FORCE) endif() # # Development tools # -if(EXISTS ${GEOSX_TPL_DIR}/uncrustify/bin/uncrustify) - set(UNCRUSTIFY_EXECUTABLE ${GEOSX_TPL_DIR}/uncrustify/bin/uncrustify CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/uncrustify/bin/uncrustify) + set(UNCRUSTIFY_EXECUTABLE ${GEOS_TPL_DIR}/uncrustify/bin/uncrustify CACHE PATH "" FORCE) endif() -if(EXISTS ${GEOSX_TPL_DIR}/doxygen/bin/doxygen) - set(DOXYGEN_EXECUTABLE ${GEOSX_TPL_DIR}/doxygen/bin/doxygen CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/doxygen/bin/doxygen) + set(DOXYGEN_EXECUTABLE ${GEOS_TPL_DIR}/doxygen/bin/doxygen CACHE PATH "" FORCE) endif() # # Other # -if(EXISTS ${GEOSX_TPL_DIR}/mathpresso) - set(MATHPRESSO_DIR ${GEOSX_TPL_DIR}/mathpresso CACHE PATH "" FORCE) +if(EXISTS ${GEOS_TPL_DIR}/mathpresso) + set(MATHPRESSO_DIR ${GEOS_TPL_DIR}/mathpresso CACHE PATH "" FORCE) endif() diff --git a/scripts/automatic_xml_preprocess.sh b/scripts/automatic_xml_preprocess.sh index df7fb7a3be1..b1cf109b943 100755 --- a/scripts/automatic_xml_preprocess.sh +++ b/scripts/automatic_xml_preprocess.sh @@ -9,7 +9,7 @@ COMPILED_XML_NAME_OVERRIDE="" PARAMETER_ARGS="" NEW_ARGS="" USE_PYGEOSX=1 -PYGEOSX_WARNINGS=0 +PYGEOS_WARNINGS=0 SCRIPT_DIR=$(dirname "$0") PYGEOSX=$SCRIPT_DIR/../lib/PYGEOSX/bin/python @@ -37,7 +37,7 @@ do shift ;; -w|--pygeosx-warnings) - PYGEOSX_WARNINGS=$2 + PYGEOS_WARNINGS=$2 shift ;; -h|--help) @@ -75,12 +75,12 @@ if [ "$USE_PYGEOSX" -eq "1" ] then if [ -f $PYGEOSX ] then - if [ "$PYGEOSX_WARNINGS" -eq "1" ] + if [ "$PYGEOS_WARNINGS" -eq "1" ] then echo "Using pygeosx to preprocess the xml file" fi else - if [ "$PYGEOSX_WARNINGS" -eq "1" ] + if [ "$PYGEOS_WARNINGS" -eq "1" ] then echo "Pygeosx installation not found... reverting to non-pygeosx version" fi diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index 73b9f3899ff..fbb33b328f9 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -72,7 +72,7 @@ args=$(or_die getopt -a -o h --long build-exe-only,cmake-build-type:,code-covera # Variables with default values BUILD_EXE_ONLY=false -GEOSX_INSTALL_SCHEMA=true +GEOS_INSTALL_SCHEMA=true HOST_CONFIG="host-configs/environment.cmake" RUN_UNIT_TESTS=true RUN_INTEGRATED_TESTS=false @@ -103,8 +103,8 @@ do shift 2;; --exchange-dir) DATA_EXCHANGE_DIR=$2; shift 2;; --host-config) HOST_CONFIG=$2; shift 2;; - --install-dir-basename) GEOSX_DIR=${GEOSX_TPL_DIR}/../$2; shift 2;; - --no-install-schema) GEOSX_INSTALL_SCHEMA=false; shift;; + --install-dir-basename) GEOS_DIR=${GEOSX_TPL_DIR}/../$2; shift 2;; + --no-install-schema) GEOS_INSTALL_SCHEMA=false; shift;; --no-run-unit-tests) RUN_UNIT_TESTS=false; shift;; --nproc) NPROC=$2; shift 2;; --repository) GEOS_SRC_DIR=$2; shift 2;; @@ -127,9 +127,9 @@ if [[ -z "${GEOS_SRC_DIR}" ]]; then exit 1 fi -if [[ -z "${GEOSX_DIR}" ]]; then +if [[ -z "${GEOS_DIR}" ]]; then echo "Installation folder undefined. Set to default value '/dev/null'. You can define it using '--install-dir-basename'." - GEOSX_DIR=/dev/null + GEOS_DIR=/dev/null fi if [[ ! -z "${SCCACHE_CREDS}" ]]; then @@ -215,21 +215,21 @@ fi # In case we have more powerful nodes, consider removing `--oversubscribe` and use `--use-hwthread-cpus` instead. # This will tells OpenMPI to discover the number of hardware threads on the node, # and use that as the number of slots available. (There is a distinction between threads and cores). -GEOSX_BUILD_DIR=/tmp/geos-build +GEOS_BUILD_DIR=/tmp/geos-build or_die python3 scripts/config-build.py \ -hc ${HOST_CONFIG} \ -bt ${CMAKE_BUILD_TYPE} \ - -bp ${GEOSX_BUILD_DIR} \ - -ip ${GEOSX_DIR} \ + -bp ${GEOS_BUILD_DIR} \ + -ip ${GEOS_DIR} \ --ninja \ -DBLT_MPI_COMMAND_APPEND='"--allow-run-as-root;--oversubscribe"' \ - -DGEOSX_INSTALL_SCHEMA=${GEOSX_INSTALL_SCHEMA} \ + -DGEOS_INSTALL_SCHEMA=${GEOS_INSTALL_SCHEMA} \ -DENABLE_COVERAGE=$([[ "${CODE_COVERAGE}" = true ]] && echo 1 || echo 0) \ ${SCCACHE_CMAKE_ARGS} \ ${ATS_CMAKE_ARGS} # The configuration step is now over, we can now move to the build directory for the build! -or_die cd ${GEOSX_BUILD_DIR} +or_die cd ${GEOS_BUILD_DIR} # Code style check if [[ "${TEST_CODE_STYLE}" = true ]]; then @@ -253,7 +253,13 @@ else if [[ ! -z "${DATA_BASENAME_WE}" ]]; then # Here we pack the installation. # The `--transform` parameter provides consistency between the tarball name and the unpacked folder. - or_die tar czf ${DATA_EXCHANGE_DIR}/${DATA_BASENAME_WE}.tar.gz --directory=${GEOSX_TPL_DIR}/.. --transform "s|^./|${DATA_BASENAME_WE}/|" . + echo "DATA_EXCHANGE_DIR=${DATA_EXCHANGE_DIR}" + echo "DATA_BASENAME_WE=${DATA_BASENAME_WE}" + echo "GEOS_TPL_DIR=${GEOS_TPL_DIR}" + echo "GEOSX_TPL_DIR=${GEOSX_TPL_DIR}" + GEOS_TPL_DIR=${GEOSX_TPL_DIR} + echo tar czf ${DATA_EXCHANGE_DIR}/${DATA_BASENAME_WE}.tar.gz --directory=${GEOS_TPL_DIR}/.. --transform "s|^./|${DATA_BASENAME_WE}/|" . + or_die tar czf ${DATA_EXCHANGE_DIR}/${DATA_BASENAME_WE}.tar.gz --directory=${GEOS_TPL_DIR}/.. --transform "s|^./|${DATA_BASENAME_WE}/|" . fi fi @@ -264,7 +270,7 @@ fi if [[ "${CODE_COVERAGE}" = true ]]; then or_die ninja coreComponents_coverage - cp -r ${GEOSX_BUILD_DIR}/coreComponents_coverage.info.cleaned ${GEOS_SRC_DIR}/geos_coverage.info.cleaned + cp -r ${GEOS_BUILD_DIR}/coreComponents_coverage.info.cleaned ${GEOS_SRC_DIR}/geos_coverage.info.cleaned fi # Run the unit tests (excluding previously ran checks). diff --git a/scripts/copyrightPrepender.py b/scripts/copyrightPrepender.py index 9ddd06aa943..2155567e3e4 100644 --- a/scripts/copyrightPrepender.py +++ b/scripts/copyrightPrepender.py @@ -23,70 +23,48 @@ # # Modified from an initial script by P. Sinha +# this is a handy command to check if there are any files that have not be changed from HEAD +# git ls-files --full-name | grep -v "$(git diff --name-only HEAD)" + import os import sys import argparse copyright_str = \ - """/* +"""/* * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ - """ old_copyright_str = \ -"""/* - *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - * Copyright (c) 2019, Lawrence Livermore National Security, LLC. - * - * Produced at the Lawrence Livermore National Laboratory - * - * LLNL-CODE-746361 - * - * All rights reserved. See COPYRIGHT for details. +""" +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only * - * This file is part of the GEOSX Simulation Framework. + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved * - * GEOSX is a free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License (as published by the - * Free Software Foundation) version 2.1 dated February 1999. - *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ */ - """ -# old_copyright_str = \ -# """/* -# *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# * Copyright (c) 2018, Lawrence Livermore National Security, LLC. -# * -# * Produced at the Lawrence Livermore National Laboratory -# * -# * LLNL-CODE-746361 -# * -# * All rights reserved. See COPYRIGHT for details. -# * -# * This file is part of the GEOSX Simulation Framework. -# * -# * GEOSX is a free software; you can redistribute it and/or modify it under -# * the terms of the GNU Lesser General Public License (as published by the -# * Free Software Foundation) version 2.1 dated February 1999. -# *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# */ -# -# """ - copyright_str_arr = copyright_str.split("\n")[:-1] old_copyright_str_arr = old_copyright_str.split("\n")[:-1] @@ -114,10 +92,10 @@ def getLineToBeginAt(lines): # If the file has the copyright header check if it needs to be updated. if copyright_match: if lines[1][:-1] == copyright_str_arr[1]: - print "\t Already has copyright statement." + print( "\t Already has copyright statement." ) return -1 - print "\t Need to update copyright statement." + print( "\t Need to update copyright statement." ) return len(copyright_str_arr) # Check if the file has the old header. @@ -131,10 +109,10 @@ def getLineToBeginAt(lines): break if old_copyright_match: - print "\t Has old copyright statement." + print( "\t Has old copyright statement." ) return len(old_copyright_str_arr) - print "\t Missing copyright statement." + print( "\t Missing copyright statement." ) return -2 @@ -143,7 +121,7 @@ def checkAndAddCopyrightHeader(filename, testOnly=False): """ with open(filename, "r+") as f: - # print " Processing file {}:".format(filename) + # print( " Processing file {}:".format(filename) ) lines = [] for i in range(max_copyright_lines): @@ -163,7 +141,7 @@ def checkAndAddCopyrightHeader(filename, testOnly=False): f.seek(0) f.write(copyright_str) f.writelines(lines[line_to_begin_at:]) - print "\t Prepended copyright statement." + print ( "\t Prepended copyright statement." ) def fileNameGenerator(rootDir, validExtensions, isRecursive=False): @@ -215,6 +193,6 @@ def fileNameGenerator(rootDir, validExtensions, isRecursive=False): args = parser.parse_args() ## Iterate through files, check for and add copyright notice - print "Looking at directory {}".format(args.dir) + print( "Looking at directory {}".format(args.dir) ) for fullFileName in fileNameGenerator(args.dir, valid_extensions, args.isRecursive): checkAndAddCopyrightHeader(fullFileName, args.test) diff --git a/scripts/spack_packages/packages/geosx/package.py b/scripts/spack_packages/packages/geosx/package.py index 85548940940..0fafded6d37 100644 --- a/scripts/spack_packages/packages/geosx/package.py +++ b/scripts/spack_packages/packages/geosx/package.py @@ -458,11 +458,11 @@ def geos_hostconfig(self, spec, prefix, py_site_pkgs_dir=None): cfg.write(cmake_cache_option('ENABLE_CALIPER_HYPRE', True)) if 'lai=trilinos' in spec: - cfg.write(cmake_cache_entry('GEOSX_LA_INTERFACE', 'Trilinos')) + cfg.write(cmake_cache_entry('GEOS_LA_INTERFACE', 'Trilinos')) if 'lai=hypre' in spec: - cfg.write(cmake_cache_entry('GEOSX_LA_INTERFACE', 'Hypre')) + cfg.write(cmake_cache_entry('GEOS_LA_INTERFACE', 'Hypre')) if 'lai=petsc' in spec: - cfg.write(cmake_cache_entry('GEOSX_LA_INTERFACE', 'Petsc')) + cfg.write(cmake_cache_entry('GEOS_LA_INTERFACE', 'Petsc')) cfg.write('#{0}\n'.format('-' * 80)) cfg.write('# Python\n') diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a4992664bb2..99b32fb3ab1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -106,7 +106,7 @@ install( DIRECTORY ${PROJECT_BINARY_DIR}/include DESTINATION . ) # Generate version information ################################ include( cmake/GeosxVersion.cmake ) -message( STATUS "Configuring GEOSX version ${GEOSX_VERSION_FULL}" ) +message( STATUS "Configuring GEOSX version ${GEOS_VERSION_FULL}" ) ################################ @@ -135,7 +135,7 @@ if( ENABLE_HIP ) list( APPEND extraComponentsLinkList blt::hip ) endif() -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND extraComponentsLinkList geosx_core ) else() list( APPEND extraComponentsLinkList ${geosx_core_libs} ) @@ -226,7 +226,7 @@ add_custom_target( geosx_generate_install_schema COMMENT "Generating XML schema to install" ) -if( NOT GEOSX_INSTALL_SCHEMA ) +if( NOT GEOS_INSTALL_SCHEMA ) set_target_properties(geosx_generate_install_schema PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) endif() @@ -270,19 +270,19 @@ if ( Python3_EXECUTABLE ) set(GEOS_PYTHON_PACKAGES_BRANCH "main" CACHE STRING "" FORCE) endif() - set( GEOSX_PYTHON_TOOLS_BINS + set( GEOS_PYTHON_TOOLS_BINS "${CMAKE_BINARY_DIR}/bin/preprocess_xml" "${CMAKE_BINARY_DIR}/bin/format_xml" ) - add_custom_command( OUTPUT ${GEOSX_PYTHON_TOOLS_BINS} + add_custom_command( OUTPUT ${GEOS_PYTHON_TOOLS_BINS} COMMAND bash ${CMAKE_SOURCE_DIR}/../scripts/setupPythonEnvironment.bash -p ${PYTHON_POST_EXECUTABLE} -b ${CMAKE_BINARY_DIR}/bin --python-pkg-branch ${GEOS_PYTHON_PACKAGES_BRANCH} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) add_custom_target( geosx_python_tools - DEPENDS ${GEOSX_PYTHON_TOOLS_BINS} ) + DEPENDS ${GEOS_PYTHON_TOOLS_BINS} ) add_custom_target( geosx_python_tools_clean - COMMAND rm ${GEOSX_PYTHON_TOOLS_BINS} ) + COMMAND rm ${GEOS_PYTHON_TOOLS_BINS} ) add_custom_target( geosx_python_tools_test COMMAND ${CMAKE_BINARY_DIR}/python/geosx/bin/test_geosx_xml_tools diff --git a/src/VERSION b/src/VERSION index cab8585a7df..6103e22aefe 100644 --- a/src/VERSION +++ b/src/VERSION @@ -1 +1 @@ -VERSION_ID = v0.2.0 +VERSION_ID = v1.0.1 diff --git a/src/cmake/GeosxConfig.cmake b/src/cmake/GeosxConfig.cmake index 237781d89aa..0289a5d209d 100644 --- a/src/cmake/GeosxConfig.cmake +++ b/src/cmake/GeosxConfig.cmake @@ -28,11 +28,11 @@ set( PREPROCESSOR_DEFINES ARRAY_BOUNDS_CHECK ${externalComponentsList} ) foreach( DEP in ${PREPROCESSOR_DEFINES} ) - if( ${DEP}_FOUND OR ENABLE_${DEP} OR GEOSX_ENABLE_${DEP} ) + if( ${DEP}_FOUND OR ENABLE_${DEP} OR GEOS_ENABLE_${DEP} ) set( USE_${DEP} TRUE ) - set( GEOSX_USE_${DEP} TRUE ) set( GEOS_USE_${DEP} TRUE ) - message(STATUS "GEOSX_USE_${DEP} = ${GEOSX_USE_${DEP}}") + set( GEOS_USE_${DEP} TRUE ) + message(STATUS "GEOS_USE_${DEP} = ${GEOS_USE_${DEP}}") endif() endforeach() @@ -40,18 +40,18 @@ set( STRICT_PPD OPENMP ) # only activate these options if they are ENABLED AND FOUND, not if either foreach( DEP in ${STRICT_PPD} ) - if( ${DEP}_FOUND AND ( ENABLE_${DEP} OR GEOSX_ENABLE_${DEP} ) ) + if( ${DEP}_FOUND AND ( ENABLE_${DEP} OR GEOS_ENABLE_${DEP} ) ) set( USE_${DEP} TRUE ) - set( GEOSX_USE_${DEP} TRUE ) set( GEOS_USE_${DEP} TRUE ) - message(STATUS "GEOSX_USE_${DEP} = ${GEOSX_USE_${DEP}}") + set( GEOS_USE_${DEP} TRUE ) + message(STATUS "GEOS_USE_${DEP} = ${GEOS_USE_${DEP}}") endif() endforeach( ) set( GEOS_USE_HYPRE_DEVICE "GEOS_USE_HYPRE_${ENABLE_HYPRE_DEVICE}" ) message( STATUS "GEOS_USE_HYPRE_DEVICE = ${GEOS_USE_HYPRE_DEVICE}") -set( GEOSX_CMAKE_BUILD_TYPE "\"${CMAKE_BUILD_TYPE}\"" ) +set( GEOS_CMAKE_BUILD_TYPE "\"${CMAKE_BUILD_TYPE}\"" ) configure_file( ${CMAKE_SOURCE_DIR}/coreComponents/common/GeosxConfig.hpp.in ${CMAKE_BINARY_DIR}/include/common/GeosxConfig.hpp ) diff --git a/src/cmake/GeosxOptions.cmake b/src/cmake/GeosxOptions.cmake index c0dd7d5075d..3a39f49670a 100644 --- a/src/cmake/GeosxOptions.cmake +++ b/src/cmake/GeosxOptions.cmake @@ -62,11 +62,11 @@ endif() ### LAI SETUP ### set( supported_LAI Trilinos Hypre Petsc ) -set( GEOSX_LA_INTERFACE "Hypre" CACHE STRING "Linear algebra interface to use in solvers" ) -message( STATUS "GEOSX_LA_INTERFACE = ${GEOSX_LA_INTERFACE}" ) +set( GEOS_LA_INTERFACE "Hypre" CACHE STRING "Linear algebra interface to use in solvers" ) +message( STATUS "GEOS_LA_INTERFACE = ${GEOS_LA_INTERFACE}" ) -if( NOT ( GEOSX_LA_INTERFACE IN_LIST supported_LAI ) ) - message( FATAL_ERROR "GEOSX_LA_INTERFACE must be one of: ${supported_LAI}" ) +if( NOT ( GEOS_LA_INTERFACE IN_LIST supported_LAI ) ) + message( FATAL_ERROR "GEOS_LA_INTERFACE must be one of: ${supported_LAI}" ) endif() ### MPI/OMP/CUDA/HIP SETUP ### @@ -85,21 +85,21 @@ endif() ### BUILD & BLT SETUP ### -option( GEOSX_INSTALL_SCHEMA "Enables schema generation and installation" ON ) +option( GEOS_INSTALL_SCHEMA "Enables schema generation and installation" ON ) -option( GEOSX_BUILD_OBJ_LIBS "Builds coreComponent modules as object libraries" OFF ) +option( GEOS_BUILD_OBJ_LIBS "Builds coreComponent modules as object libraries" OFF ) -option( GEOSX_BUILD_SHARED_LIBS "Builds geosx_core as a shared library " ON ) +option( GEOS_BUILD_SHARED_LIBS "Builds geosx_core as a shared library " ON ) -set( GEOSX_PARALLEL_COMPILE_JOBS "" CACHE STRING "Maximum number of concurrent compilation jobs" ) -if( GEOSX_PARALLEL_COMPILE_JOBS ) - set_property( GLOBAL APPEND PROPERTY JOB_POOLS compile_job_pool=${GEOSX_PARALLEL_COMPILE_JOBS} ) +set( GEOS_PARALLEL_COMPILE_JOBS "" CACHE STRING "Maximum number of concurrent compilation jobs" ) +if( GEOS_PARALLEL_COMPILE_JOBS ) + set_property( GLOBAL APPEND PROPERTY JOB_POOLS compile_job_pool=${GEOS_PARALLEL_COMPILE_JOBS} ) set( CMAKE_JOB_POOL_COMPILE compile_job_pool ) endif() -set( GEOSX_PARALLEL_LINK_JOBS "" CACHE STRING "Maximum number of concurrent link jobs" ) -if( GEOSX_PARALLEL_LINK_JOBS ) - set_property( GLOBAL APPEND PROPERTY JOB_POOLS link_job_pool=${GEOSX_PARALLEL_LINK_JOBS} ) +set( GEOS_PARALLEL_LINK_JOBS "" CACHE STRING "Maximum number of concurrent link jobs" ) +if( GEOS_PARALLEL_LINK_JOBS ) + set_property( GLOBAL APPEND PROPERTY JOB_POOLS link_job_pool=${GEOS_PARALLEL_LINK_JOBS} ) set( CMAKE_JOB_POOL_LINK link_job_pool ) endif() @@ -129,7 +129,7 @@ blt_append_custom_compiler_flag( FLAGS_VAR CMAKE_CXX_FLAGS_DEBUG CLANG "-Wno-unused-parameter -Wno-unused-variable -fstandalone-debug" ) -blt_append_custom_compiler_flag( FLAGS_VAR GEOSX_NINJA_FLAGS +blt_append_custom_compiler_flag( FLAGS_VAR GEOS_NINJA_FLAGS DEFAULT " " GNU "-fdiagnostics-color=always" CLANG "-fcolor-diagnostics" @@ -145,67 +145,67 @@ if (ENABLE_GBENCHMARK) endif() if( ${CMAKE_MAKE_PROGRAM} STREQUAL "ninja" OR ${CMAKE_MAKE_PROGRAM} MATCHES ".*/ninja$" ) - set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GEOSX_NINJA_FLAGS}" ) + set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GEOS_NINJA_FLAGS}" ) endif() if( CMAKE_HOST_APPLE ) -# set(GEOSX_LINK_PREPEND_FLAG "-Wl,-force_load" CACHE STRING "") -# set(GEOSX_LINK_POSTPEND_FLAG "" CACHE STRING "") +# set(GEOS_LINK_PREPEND_FLAG "-Wl,-force_load" CACHE STRING "") +# set(GEOS_LINK_POSTPEND_FLAG "" CACHE STRING "") # elseif( ENABLE_CUDA ) -# set( GEOSX_LINK_PREPEND_FLAG "-Xcompiler \\\\\"-Wl,--whole-archive\\\\\"" CACHE STRING "" ) -# set( GEOSX_LINK_POSTPEND_FLAG "-Xcompiler \\\\\"-Wl,--no-whole-archive\\\\\"" CACHE STRING "" ) +# set( GEOS_LINK_PREPEND_FLAG "-Xcompiler \\\\\"-Wl,--whole-archive\\\\\"" CACHE STRING "" ) +# set( GEOS_LINK_POSTPEND_FLAG "-Xcompiler \\\\\"-Wl,--no-whole-archive\\\\\"" CACHE STRING "" ) else() - set( GEOSX_LINK_PREPEND_FLAG "-Wl,--whole-archive" CACHE STRING "" ) - set( GEOSX_LINK_POSTPEND_FLAG "-Wl,--no-whole-archive" CACHE STRING "" ) + set( GEOS_LINK_PREPEND_FLAG "-Wl,--whole-archive" CACHE STRING "" ) + set( GEOS_LINK_POSTPEND_FLAG "-Wl,--no-whole-archive" CACHE STRING "" ) endif() -set( GEOSX_LOCALINDEX_TYPE "int" CACHE STRING "" ) +set( GEOS_LOCALINDEX_TYPE "int" CACHE STRING "" ) if( ENABLE_HYPRE_MIXINT ) - set( GEOSX_GLOBALINDEX_TYPE "long long int" CACHE STRING "" ) + set( GEOS_GLOBALINDEX_TYPE "long long int" CACHE STRING "" ) else() - set( GEOSX_GLOBALINDEX_TYPE "int" CACHE STRING "" ) + set( GEOS_GLOBALINDEX_TYPE "int" CACHE STRING "" ) endif() -if( GEOSX_LOCALINDEX_TYPE STREQUAL "int" ) - set( GEOSX_LOCALINDEX_TYPE_FLAG "0" CACHE STRING "" FORCE ) -elseif( GEOSX_LOCALINDEX_TYPE STREQUAL "long int" ) - set( GEOSX_LOCALINDEX_TYPE_FLAG "1" CACHE STRING "" FORCE ) -elseif( GEOSX_LOCALINDEX_TYPE STREQUAL "long long int" ) - set( GEOSX_LOCALINDEX_TYPE_FLAG "2" CACHE STRING "" FORCE ) -elseif( GEOSX_LOCALINDEX_TYPE STREQUAL "std::ptrdiff_t" ) - set( GEOSX_LOCALINDEX_TYPE_FLAG "3" CACHE STRING "" FORCE ) +if( GEOS_LOCALINDEX_TYPE STREQUAL "int" ) + set( GEOS_LOCALINDEX_TYPE_FLAG "0" CACHE STRING "" FORCE ) +elseif( GEOS_LOCALINDEX_TYPE STREQUAL "long int" ) + set( GEOS_LOCALINDEX_TYPE_FLAG "1" CACHE STRING "" FORCE ) +elseif( GEOS_LOCALINDEX_TYPE STREQUAL "long long int" ) + set( GEOS_LOCALINDEX_TYPE_FLAG "2" CACHE STRING "" FORCE ) +elseif( GEOS_LOCALINDEX_TYPE STREQUAL "std::ptrdiff_t" ) + set( GEOS_LOCALINDEX_TYPE_FLAG "3" CACHE STRING "" FORCE ) else( TRUE ) - message( FATAL_ERROR "GEOSX_LOCALINDEX_TYPE_FLAG not set for ${GEOSX_LOCALINDEX_TYPE}" ) + message( FATAL_ERROR "GEOS_LOCALINDEX_TYPE_FLAG not set for ${GEOS_LOCALINDEX_TYPE}" ) endif() -if( GEOSX_GLOBALINDEX_TYPE STREQUAL "int" ) - set( GEOSX_GLOBALINDEX_TYPE_FLAG "0" CACHE STRING "" FORCE ) -elseif( GEOSX_GLOBALINDEX_TYPE STREQUAL "long int" ) - set( GEOSX_GLOBALINDEX_TYPE_FLAG "1" CACHE STRING "" FORCE ) -elseif( GEOSX_GLOBALINDEX_TYPE STREQUAL "long long int" ) - set( GEOSX_GLOBALINDEX_TYPE_FLAG "2" CACHE STRING "" FORCE ) +if( GEOS_GLOBALINDEX_TYPE STREQUAL "int" ) + set( GEOS_GLOBALINDEX_TYPE_FLAG "0" CACHE STRING "" FORCE ) +elseif( GEOS_GLOBALINDEX_TYPE STREQUAL "long int" ) + set( GEOS_GLOBALINDEX_TYPE_FLAG "1" CACHE STRING "" FORCE ) +elseif( GEOS_GLOBALINDEX_TYPE STREQUAL "long long int" ) + set( GEOS_GLOBALINDEX_TYPE_FLAG "2" CACHE STRING "" FORCE ) else( TRUE ) - message( FATAL_ERROR "GEOSX_GLOBALINDEX_TYPE_FLAG not set for ${GEOSX_GLOBALINDEX_TYPE}" ) + message( FATAL_ERROR "GEOS_GLOBALINDEX_TYPE_FLAG not set for ${GEOS_GLOBALINDEX_TYPE}" ) endif() -set( GEOSX_BLOCK_SIZE 32 ) +set( GEOS_BLOCK_SIZE 32 ) if( ENABLE_CUDA ) - set( GEOSX_BLOCK_SIZE 32 ) + set( GEOS_BLOCK_SIZE 32 ) endif() if( ENABLE_HIP ) - set( GEOSX_BLOCK_SIZE 64 ) + set( GEOS_BLOCK_SIZE 64 ) endif() -message( "localIndex is an alias for ${GEOSX_LOCALINDEX_TYPE}" ) -message( "globalIndex is an alias for ${GEOSX_GLOBALINDEX_TYPE}" ) -message( "GEOSX_LOCALINDEX_TYPE_FLAG = ${GEOSX_LOCALINDEX_TYPE_FLAG}" ) -message( "GEOSX_GLOBALINDEX_TYPE_FLAG = ${GEOSX_GLOBALINDEX_TYPE_FLAG}" ) +message( "localIndex is an alias for ${GEOS_LOCALINDEX_TYPE}" ) +message( "globalIndex is an alias for ${GEOS_GLOBALINDEX_TYPE}" ) +message( "GEOS_LOCALINDEX_TYPE_FLAG = ${GEOS_LOCALINDEX_TYPE_FLAG}" ) +message( "GEOS_GLOBALINDEX_TYPE_FLAG = ${GEOS_GLOBALINDEX_TYPE_FLAG}" ) message( "CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}" ) -message( "GEOSX_LINK_PREPEND_FLAG=${GEOSX_LINK_PREPEND_FLAG}" ) -message( "GEOSX_LINK_POSTPEND_FLAG=${GEOSX_LINK_POSTPEND_FLAG}" ) +message( "GEOS_LINK_PREPEND_FLAG=${GEOS_LINK_PREPEND_FLAG}" ) +message( "GEOS_LINK_POSTPEND_FLAG=${GEOS_LINK_POSTPEND_FLAG}" ) message( "Leaving GeosxOptions.cmake\n" ) diff --git a/src/cmake/GeosxVersion.cmake b/src/cmake/GeosxVersion.cmake index 5b178cc379b..d34a3391d11 100644 --- a/src/cmake/GeosxVersion.cmake +++ b/src/cmake/GeosxVersion.cmake @@ -19,18 +19,18 @@ endif() # Inputs: # -- SOURCE_DIR # Outputs: -# -- GEOSX_VERSION_FULL -# -- GEOSX_VERSION_LIST -# -- GEOSX_VERSION_MAJOR -# -- GEOSX_VERSION_MINOR -# -- GEOSX_VERSION_PATCH +# -- GEOS_VERSION_FULL +# -- GEOS_VERSION_LIST +# -- GEOS_VERSION_MAJOR +# -- GEOS_VERSION_MINOR +# -- GEOS_VERSION_PATCH macro(geosx_get_file_version) - file ( STRINGS "${SOURCE_DIR}/VERSION" GEOSX_VERSION_FULL ) - string( REGEX REPLACE "VERSION_ID = v" "" GEOSX_VERSION_FULL "${GEOSX_VERSION_FULL}" ) - string( REPLACE "." ";" GEOSX_VERSION_LIST ${GEOSX_VERSION_FULL} ) - list( GET GEOSX_VERSION_LIST 0 GEOSX_VERSION_MAJOR ) - list( GET GEOSX_VERSION_LIST 1 GEOSX_VERSION_MINOR ) - list( GET GEOSX_VERSION_LIST 2 GEOSX_VERSION_PATCH ) + file ( STRINGS "${SOURCE_DIR}/VERSION" GEOS_VERSION_FULL ) + string( REGEX REPLACE "VERSION_ID = v" "" GEOS_VERSION_FULL "${GEOS_VERSION_FULL}" ) + string( REPLACE "." ";" GEOS_VERSION_LIST ${GEOS_VERSION_FULL} ) + list( GET GEOS_VERSION_LIST 0 GEOS_VERSION_MAJOR ) + list( GET GEOS_VERSION_LIST 1 GEOS_VERSION_MINOR ) + list( GET GEOS_VERSION_LIST 2 GEOS_VERSION_PATCH ) endmacro() # Get GEOSX development version from git @@ -39,9 +39,9 @@ endmacro() # -- GIT_FOUND # -- GIT_EXECUTABLE (only when GIT_FOUND=TRUE ) # Outputs (if GIT_FOUND=TRUE and inside git repo): -# -- GEOSX_GIT_BRANCH -# -- GEOSX_GIT_HASH -# -- GEOSX_GIT_TAG +# -- GEOS_GIT_BRANCH +# -- GEOS_GIT_HASH +# -- GEOS_GIT_TAG macro(geosx_get_git_version) if( GIT_FOUND ) # Use BLT Git macros for convenience @@ -49,13 +49,13 @@ macro(geosx_get_git_version) blt_is_git_repo( OUTPUT_STATE is_git_repo SOURCE_DIR ${SOURCE_DIR} ) if( is_git_repo ) - blt_git_branch( BRANCH_NAME GEOSX_GIT_BRANCH + blt_git_branch( BRANCH_NAME GEOS_GIT_BRANCH RETURN_CODE _git_rc SOURCE_DIR ${SOURCE_DIR} ) - blt_git_hashcode( HASHCODE GEOSX_GIT_HASH + blt_git_hashcode( HASHCODE GEOS_GIT_HASH RETURN_CODE _git_rc SOURCE_DIR ${SOURCE_DIR} ) - blt_git_tag( OUTPUT_TAG GEOSX_GIT_TAG + blt_git_tag( OUTPUT_TAG GEOS_GIT_TAG RETURN_CODE _git_rc SOURCE_DIR ${SOURCE_DIR} ) endif() diff --git a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake index 4f8394bc5bd..e30dbd937bc 100644 --- a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake +++ b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake @@ -117,7 +117,7 @@ macro(mandatory_tpl_doesnt_exist message(FATAL_ERROR "GEOSX requires ${CURRENT_TPL_NAME}, either :\n" - " - Verify that you provided a valid TPL installation directory (GEOSX_TPL_DIR = \"${GEOSX_TPL_DIR}\"),\n" + " - Verify that you provided a valid TPL installation directory (GEOS_TPL_DIR = \"${GEOS_TPL_DIR}\"),\n" " - Or set ${CURRENT_TPL_DIR_VAR} to the ${CURRENT_TPL_NAME} installation directory (${CURRENT_TPL_DIR_VAR} = \"${${CURRENT_TPL_DIR_VAR}}\").\n") endmacro(mandatory_tpl_doesnt_exist) @@ -702,7 +702,7 @@ if(DEFINED HYPRE_DIR AND ENABLE_HYPRE) # if( ENABLE_CUDA AND ( NOT ${ENABLE_HYPRE_DEVICE} STREQUAL "CUDA" ) ) # set(ENABLE_HYPRE OFF CACHE BOOL "" FORCE) - # if( GEOSX_LA_INTERFACE STREQUAL "Hypre") + # if( GEOS_LA_INTERFACE STREQUAL "Hypre") # message( FATAL_ERROR "Hypre LAI selected, but ENABLE_HYPRE_DEVICE not 'CUDA' while ENABLE_CUDA is ON.") # endif() # else() @@ -897,11 +897,11 @@ endif() ################################ # LAI ################################ -string(TOUPPER "${GEOSX_LA_INTERFACE}" upper_LAI) +string(TOUPPER "${GEOS_LA_INTERFACE}" upper_LAI) if(NOT ENABLE_${upper_LAI}) - message(FATAL_ERROR "${GEOSX_LA_INTERFACE} LA interface is selected, but ENABLE_${upper_LAI} is OFF") + message(FATAL_ERROR "${GEOS_LA_INTERFACE} LA interface is selected, but ENABLE_${upper_LAI} is OFF") endif() -option(GEOSX_LA_INTERFACE_${upper_LAI} "${upper_LAI} LA interface is selected" ON) +option(GEOS_LA_INTERFACE_${upper_LAI} "${upper_LAI} LA interface is selected" ON) message(STATUS "thirdPartyLibs = ${thirdPartyLibs}") diff --git a/src/coreComponents/CMakeLists.txt b/src/coreComponents/CMakeLists.txt index 8050c7ba735..a58be4cdaab 100644 --- a/src/coreComponents/CMakeLists.txt +++ b/src/coreComponents/CMakeLists.txt @@ -40,7 +40,7 @@ if( ENABLE_MPI ) list( APPEND parallelDeps mpi ) endif() -if ( GEOSX_BUILD_OBJ_LIBS ) +if ( GEOS_BUILD_OBJ_LIBS ) set( LVARRAY_BUILD_OBJ_LIBS TRUE CACHE BOOL "" FORCE ) endif() @@ -57,10 +57,10 @@ foreach( lib ${subdirs} ) endforeach() # if we're building full static libs and not obj_libs -if( NOT GEOSX_BUILD_SHARED_LIBS ) +if( NOT GEOS_BUILD_SHARED_LIBS ) set( geosx_core_list "" ) foreach( lib ${coreLibs} ) - list( APPEND geosx_core_list ${GEOSX_LINK_PREPEND_FLAG} ${lib} ${GEOSX_LINK_POSTPEND_FLAG} ) + list( APPEND geosx_core_list ${GEOS_LINK_PREPEND_FLAG} ${lib} ${GEOS_LINK_POSTPEND_FLAG} ) endforeach() set ( geosx_core_libs "${geosx_core_list}" CACHE INTERNAL "" ) endif( ) @@ -69,22 +69,22 @@ foreach( lib ${subdirs} ) add_subdirectory( ${lib} ) endforeach() -if( GEOSX_BUILD_SHARED_LIBS AND GEOSX_BUILD_OBJ_LIBS ) +if( GEOS_BUILD_SHARED_LIBS AND GEOS_BUILD_OBJ_LIBS ) message( "Building shared geosx_core library with object coreComponents, executables link to geosx_core" ) blt_add_library ( NAME geosx_core SOURCES dummy.cpp DEPENDS_ON mainInterface physicsSolvers HDF5::HDF5 SHARED TRUE ) -elseif( GEOSX_BUILD_SHARED_LIBS AND NOT GEOSX_BUILD_OBJ_LIBS ) +elseif( GEOS_BUILD_SHARED_LIBS AND NOT GEOS_BUILD_OBJ_LIBS ) message( "Building shared geosx_core library with static coreComponents, executables link to geosx_core" ) blt_combine_static_libraries( NAME geosx_core SOURCE_LIBS ${coreLibs} LIB_TYPE SHARED - LINK_PREPEND ${GEOSX_LINK_PREPEND_FLAG} - LINK_POSTPEND ${GEOSX_LINK_POSTPEND_FLAG} ) + LINK_PREPEND ${GEOS_LINK_PREPEND_FLAG} + LINK_POSTPEND ${GEOS_LINK_POSTPEND_FLAG} ) -elseif( NOT GEOSX_BUILD_SHARED_LIBS AND GEOSX_BUILD_OBJ_LIBS ) +elseif( NOT GEOS_BUILD_SHARED_LIBS AND GEOS_BUILD_OBJ_LIBS ) message( "Building object coreComponents, executables link to coreComponents" ) else() message( "Building static coreComponents, executables link to coreComponents" ) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 5082ef8f367..e7bf1096d57 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 5082ef8f3673fdb7c5f417b8de2589a5c1c42e55 +Subproject commit e7bf1096d57558be720f177141c40e4ab69b3f5e diff --git a/src/coreComponents/codingUtilities/CMakeLists.txt b/src/coreComponents/codingUtilities/CMakeLists.txt index 53ee0981125..080d9b8d262 100644 --- a/src/coreComponents/codingUtilities/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/CMakeLists.txt @@ -25,7 +25,7 @@ blt_add_library( NAME codingUtilities SOURCES ${codingUtilities_sources} HEADERS ${codingUtilities_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) # Avoid compiling with nvcc which sometimes crashes on fast_float diff --git a/src/coreComponents/codingUtilities/EnumStrings.hpp b/src/coreComponents/codingUtilities/EnumStrings.hpp index 8de1f96107c..557562c1e3c 100644 --- a/src/coreComponents/codingUtilities/EnumStrings.hpp +++ b/src/coreComponents/codingUtilities/EnumStrings.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/Parsing.cpp b/src/coreComponents/codingUtilities/Parsing.cpp index e483ba2c313..91e577b3c60 100644 --- a/src/coreComponents/codingUtilities/Parsing.cpp +++ b/src/coreComponents/codingUtilities/Parsing.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/Parsing.hpp b/src/coreComponents/codingUtilities/Parsing.hpp index af36d23a831..e99f751bbc4 100644 --- a/src/coreComponents/codingUtilities/Parsing.hpp +++ b/src/coreComponents/codingUtilities/Parsing.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/SFINAE_Macros.hpp b/src/coreComponents/codingUtilities/SFINAE_Macros.hpp index c1fcb9b4236..4032db8cd5f 100644 --- a/src/coreComponents/codingUtilities/SFINAE_Macros.hpp +++ b/src/coreComponents/codingUtilities/SFINAE_Macros.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/StringUtilities.cpp b/src/coreComponents/codingUtilities/StringUtilities.cpp index b2e19c062c9..2a1face950c 100644 --- a/src/coreComponents/codingUtilities/StringUtilities.cpp +++ b/src/coreComponents/codingUtilities/StringUtilities.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/StringUtilities.hpp b/src/coreComponents/codingUtilities/StringUtilities.hpp index d3e3e1e71a6..7f339d49fec 100644 --- a/src/coreComponents/codingUtilities/StringUtilities.hpp +++ b/src/coreComponents/codingUtilities/StringUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp index 6eddbf6e1ce..a947b37ac58 100644 --- a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp +++ b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/Utilities.hpp b/src/coreComponents/codingUtilities/Utilities.hpp index 7555c6bbfbc..3c4d79ec2ae 100644 --- a/src/coreComponents/codingUtilities/Utilities.hpp +++ b/src/coreComponents/codingUtilities/Utilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp b/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp index dec8e43fa8d..412aee960ea 100644 --- a/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp +++ b/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp b/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp index 1276006b8d3..21a6a8d1903 100644 --- a/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp +++ b/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/codingUtilities/tests/testParsing.cpp b/src/coreComponents/codingUtilities/tests/testParsing.cpp index 3a591cea3ed..33f3d0231d8 100644 --- a/src/coreComponents/codingUtilities/tests/testParsing.cpp +++ b/src/coreComponents/codingUtilities/tests/testParsing.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/tests/testStringUtilities.cpp b/src/coreComponents/codingUtilities/tests/testStringUtilities.cpp index de83594fd94..bbf682de8e9 100644 --- a/src/coreComponents/codingUtilities/tests/testStringUtilities.cpp +++ b/src/coreComponents/codingUtilities/tests/testStringUtilities.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/tests/testUtilities.cpp b/src/coreComponents/codingUtilities/tests/testUtilities.cpp index 94a3147a245..f063d471b92 100644 --- a/src/coreComponents/codingUtilities/tests/testUtilities.cpp +++ b/src/coreComponents/codingUtilities/tests/testUtilities.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/traits.hpp b/src/coreComponents/codingUtilities/traits.hpp index 1e05ef8af52..a5c8d4aa187 100644 --- a/src/coreComponents/codingUtilities/traits.hpp +++ b/src/coreComponents/codingUtilities/traits.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/BufferAllocator.cpp b/src/coreComponents/common/BufferAllocator.cpp index 898aa82c011..4df6745f937 100644 --- a/src/coreComponents/common/BufferAllocator.cpp +++ b/src/coreComponents/common/BufferAllocator.cpp @@ -1,7 +1,22 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "BufferAllocator.hpp" #include "DataTypes.hpp" -#ifdef GEOSX_USE_CHAI +#ifdef GEOS_USE_CHAI namespace geos { diff --git a/src/coreComponents/common/BufferAllocator.hpp b/src/coreComponents/common/BufferAllocator.hpp index 72ccc92fdc9..46421189866 100644 --- a/src/coreComponents/common/BufferAllocator.hpp +++ b/src/coreComponents/common/BufferAllocator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -21,7 +22,7 @@ #include "common/GeosxConfig.hpp" -#ifdef GEOSX_USE_CHAI +#ifdef GEOS_USE_CHAI #include #include diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index 223c540ac4e..ea5e2409bf3 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -101,7 +101,7 @@ blt_add_library( NAME common SOURCES ${common_sources} HEADERS ${common_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( common PUBLIC ${CMAKE_BINARY_DIR}/include ) diff --git a/src/coreComponents/common/DataLayouts.hpp b/src/coreComponents/common/DataLayouts.hpp index 76995841d45..38d149a1938 100644 --- a/src/coreComponents/common/DataLayouts.hpp +++ b/src/coreComponents/common/DataLayouts.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -102,7 +103,7 @@ static constexpr int ACCELERATION_USD = LvArray::typeManipulation::getStrideOneD namespace particles { -#if defined( GEOSX_USE_CUDA ) +#if defined( GEOS_USE_CUDA ) /// Particle reference position permutation when using cuda. using REFERENCE_POSITION_PERM = RAJA::PERM_JI; diff --git a/src/coreComponents/common/DataTypes.cpp b/src/coreComponents/common/DataTypes.cpp index c0231da13d8..4672907c1ad 100644 --- a/src/coreComponents/common/DataTypes.cpp +++ b/src/coreComponents/common/DataTypes.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -24,7 +25,7 @@ namespace geos { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm MPI_COMM_GEOSX; #else int MPI_COMM_GEOSX = 0; diff --git a/src/coreComponents/common/DataTypes.hpp b/src/coreComponents/common/DataTypes.hpp index 0c3856be91b..f6f19ad383f 100644 --- a/src/coreComponents/common/DataTypes.hpp +++ b/src/coreComponents/common/DataTypes.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -45,7 +46,7 @@ #include // System includes -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI #include #endif @@ -65,7 +66,7 @@ #include /* - * top level geosx namespace contains all code that is specific to GEOSX + * top level geos namespace contains all code that is specific to GEOSX */ namespace geos { @@ -105,7 +106,7 @@ NEW_TYPE dynamicCast( EXISTING_TYPE & val ) } /// Global MPI communicator used by GEOSX. -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI extern MPI_Comm MPI_COMM_GEOSX; #else extern int MPI_COMM_GEOSX; @@ -123,10 +124,10 @@ using size_t = std::size_t; using integer = std::int32_t; /// Local index type (for indexing objects within an MPI partition). -using localIndex = GEOSX_LOCALINDEX_TYPE; +using localIndex = GEOS_LOCALINDEX_TYPE; /// Global index type (for indexing objects across MPI partitions). -using globalIndex = GEOSX_GLOBALINDEX_TYPE; +using globalIndex = GEOS_GLOBALINDEX_TYPE; /// String type. using string = std::string; @@ -149,7 +150,7 @@ using real64 = double; /// Type stored in communication buffers. using buffer_unit_type = signed char; -#ifdef GEOSX_USE_CHAI +#ifdef GEOS_USE_CHAI /// Type of storage for communication buffers. using buffer_type = std::vector< buffer_unit_type, BufferAllocator< buffer_unit_type > >; #else diff --git a/src/coreComponents/common/FieldSpecificationOps.hpp b/src/coreComponents/common/FieldSpecificationOps.hpp index 83f21027d6c..684b90af9e5 100644 --- a/src/coreComponents/common/FieldSpecificationOps.hpp +++ b/src/coreComponents/common/FieldSpecificationOps.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/FixedSizeDeque.hpp b/src/coreComponents/common/FixedSizeDeque.hpp index ea61af49a44..11b0a58fc17 100644 --- a/src/coreComponents/common/FixedSizeDeque.hpp +++ b/src/coreComponents/common/FixedSizeDeque.hpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + #ifndef FIXEDSIZEDEQUE_HPP #define FIXEDSIZEDEQUE_HPP diff --git a/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp b/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp index e6532dc1392..15c0b129776 100644 --- a/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp +++ b/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + #ifndef FIXEDSIZEDEQUEWITHMUTEXES_HPP #define FIXEDSIZEDEQUEWITHMUTEXES_HPP @@ -50,7 +52,7 @@ class FixedSizeDequeWithMutexes : public FixedSizeDeque< T, INDEX_TYPE > * @param space Space used to store que queue. */ FixedSizeDequeWithMutexes( int maxEntries, int valuesPerEntry, LvArray::MemorySpace space ): FixedSizeDeque< T, INDEX_TYPE >( maxEntries, valuesPerEntry, space, -#ifdef GEOSX_USE_CUDA +#ifdef GEOS_USE_CUDA camp::resources::Resource{ camp::resources::Cuda{} } #else camp::resources::Resource{ camp::resources::Host{} } diff --git a/src/coreComponents/common/Format.hpp b/src/coreComponents/common/Format.hpp index 1765c7796a0..58bf6843c39 100644 --- a/src/coreComponents/common/Format.hpp +++ b/src/coreComponents/common/Format.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -18,10 +19,10 @@ #include #if __cplusplus < 202002L -#define GEOSX_USE_FMT +#define GEOS_USE_FMT #endif -#ifdef GEOSX_USE_FMT +#ifdef GEOS_USE_FMT #ifndef FMT_HEADER_ONLY #define FMT_HEADER_ONLY #endif @@ -36,7 +37,7 @@ #define GEOS_FMT_NS std #endif -#ifdef GEOSX_USE_FMT +#ifdef GEOS_USE_FMT /** * @brief fmtlib formatter for enum classes. * @tparam T The type of the object being formatted. This should be an diff --git a/src/coreComponents/common/GEOS_RAJA_Interface.hpp b/src/coreComponents/common/GEOS_RAJA_Interface.hpp index 806e022f3f4..9f7d0bde21a 100644 --- a/src/coreComponents/common/GEOS_RAJA_Interface.hpp +++ b/src/coreComponents/common/GEOS_RAJA_Interface.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -39,7 +40,7 @@ using serialReduce = RAJA::seq_reduce; using serialStream = RAJA::resources::Host; using serialEvent = RAJA::resources::HostEvent; -#if defined( GEOSX_USE_OPENMP ) +#if defined( GEOS_USE_OPENMP ) auto const parallelHostMemorySpace = hostMemorySpace; @@ -70,10 +71,10 @@ void RAJA_INLINE parallelHostSync() { } #if defined( GEOS_USE_CUDA ) auto const parallelDeviceMemorySpace = LvArray::MemorySpace::cuda; -template< size_t BLOCK_SIZE = GEOSX_BLOCK_SIZE > +template< size_t BLOCK_SIZE = GEOS_BLOCK_SIZE > using parallelDevicePolicy = RAJA::cuda_exec< BLOCK_SIZE >; -template< size_t BLOCK_SIZE = GEOSX_BLOCK_SIZE > +template< size_t BLOCK_SIZE = GEOS_BLOCK_SIZE > using parallelDeviceAsyncPolicy = RAJA::cuda_exec_async< BLOCK_SIZE >; using parallelDeviceStream = RAJA::resources::Cuda; @@ -96,7 +97,7 @@ RAJA_INLINE parallelDeviceEvent forAll( RESOURCE && stream, const localIndex end auto const parallelDeviceMemorySpace = LvArray::MemorySpace::hip; -template< size_t BLOCK_SIZE = GEOSX_BLOCK_SIZE > +template< size_t BLOCK_SIZE = GEOS_BLOCK_SIZE > using parallelDevicePolicy = RAJA::hip_exec< BLOCK_SIZE >; @@ -109,7 +110,7 @@ using parallelDeviceAtomic = RAJA::hip_atomic; void RAJA_INLINE parallelDeviceSync() { RAJA::synchronize< RAJA::hip_synchronize >( ); } // the async dispatch policy caused runtime issues as of rocm@4.5.2, hasn't been checked in rocm@5: -template< size_t BLOCK_SIZE = GEOSX_BLOCK_SIZE > +template< size_t BLOCK_SIZE = GEOS_BLOCK_SIZE > using parallelDeviceAsyncPolicy = parallelDevicePolicy< BLOCK_SIZE >; // RAJA::hip_exec_async< BLOCK_SIZE >; template< typename POLICY, typename RESOURCE, typename LAMBDA > @@ -160,7 +161,7 @@ struct PolicyMap< serialPolicy > using reduce = serialReduce; }; -#if defined(GEOSX_USE_OPENMP) +#if defined(GEOS_USE_OPENMP) template<> struct PolicyMap< RAJA::omp_parallel_for_exec > { diff --git a/src/coreComponents/common/GeosxConfig.hpp.in b/src/coreComponents/common/GeosxConfig.hpp.in index 4b69fa93652..6942640552d 100644 --- a/src/coreComponents/common/GeosxConfig.hpp.in +++ b/src/coreComponents/common/GeosxConfig.hpp.in @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + /** * @file GeosxConfig.hpp * @@ -9,28 +24,28 @@ #define GEOS_COMMON_CONFIG_HPP /// Enables floating point exceptions -#cmakedefine GEOSX_USE_FPE +#cmakedefine GEOS_USE_FPE /// Enables bounds check in LvArray classes (CMake option ARRAY_BOUNDS_CHECK) -#cmakedefine GEOSX_USE_ARRAY_BOUNDS_CHECK +#cmakedefine GEOS_USE_ARRAY_BOUNDS_CHECK /// Enables use of Caliper (CMake option ENABLE_CALIPER) -#cmakedefine GEOSX_USE_CALIPER +#cmakedefine GEOS_USE_CALIPER /// Enables use of Caliper (CMake option ENABLE_ADIAK) -#cmakedefine GEOSX_USE_ADIAK +#cmakedefine GEOS_USE_ADIAK /// Enables use of CHAI (CMake option ENABLE_CHAI) -#cmakedefine GEOSX_USE_CHAI +#cmakedefine GEOS_USE_CHAI /// Enables use of Mathpresso library (CMake option ENABLE_MATHPRESSO) -#cmakedefine GEOSX_USE_MATHPRESSO +#cmakedefine GEOS_USE_MATHPRESSO /// Enables use of MPI (CMake option ENABLE_MPI) -#cmakedefine GEOSX_USE_MPI +#cmakedefine GEOS_USE_MPI /// Enables use of OpenMP (CMake option ENABLE_OPENMP) -#cmakedefine GEOSX_USE_OPENMP +#cmakedefine GEOS_USE_OPENMP /// Enables use of CUDA (CMake option ENABLE_CUDA) #cmakedefine GEOS_USE_CUDA @@ -45,28 +60,28 @@ #cmakedefine GEOS_USE_FMT_CONST_FORMATTER_WORKAROUND /// Enables use of PVTPackage (CMake option ENABLE_PVTPackage) -#cmakedefine GEOSX_USE_PVTPackage +#cmakedefine GEOS_USE_PVTPackage /// Enables use of Python (CMake option ENABLE_PYTHON) -#cmakedefine GEOSX_USE_PYGEOSX +#cmakedefine GEOS_USE_PYGEOSX /// Enables use of RAJA (CMake option ENABLE_RAJA) -#cmakedefine GEOSX_USE_RAJA +#cmakedefine GEOS_USE_RAJA /// Enables use of sys/time.h based timers (CMake option ENABLE_TIMERS) -#cmakedefine GEOSX_USE_TIMERS +#cmakedefine GEOS_USE_TIMERS /// Enables use of additional debugging interface for TotalView (Cmake option ENABLE_TOTALVIEW_OUTPUT) -#cmakedefine GEOSX_USE_TOTALVIEW_OUTPUT +#cmakedefine GEOS_USE_TOTALVIEW_OUTPUT /// Enables use of Intel MKL (CMake option ENABLE_MKL) -#cmakedefine GEOSX_USE_MKL +#cmakedefine GEOS_USE_MKL /// Enables use of Trilinos library (CMake option ENABLE_TRILINOS) -#cmakedefine GEOSX_USE_TRILINOS +#cmakedefine GEOS_USE_TRILINOS /// Enables use of Hypre library (CMake option ENABLE_HYPRE) -#cmakedefine GEOSX_USE_HYPRE +#cmakedefine GEOS_USE_HYPRE /// Denotes HYPRE using CPU #define GEOS_USE_HYPRE_CPU 0 @@ -78,46 +93,46 @@ #cmakedefine GEOS_USE_HYPRE_DEVICE @GEOS_USE_HYPRE_DEVICE@ /// Enables use of SuperLU_dist library through HYPRE (CMake option ENABLE_SUPERLU_DIST) -#cmakedefine GEOSX_USE_SUPERLU_DIST +#cmakedefine GEOS_USE_SUPERLU_DIST /// Enables use of PETSc library (CMake option ENABLE_PETSC) -#cmakedefine GEOSX_USE_PETSC +#cmakedefine GEOS_USE_PETSC /// Enables use of Scotch library (CMake option ENABLE_SCOTCH) -#cmakedefine GEOSX_USE_SCOTCH +#cmakedefine GEOS_USE_SCOTCH -/// Choice of global linear algebra interface (CMake option GEOSX_LA_INTERFACE) -#cmakedefine GEOSX_LA_INTERFACE @GEOSX_LA_INTERFACE@ +/// Choice of global linear algebra interface (CMake option GEOS_LA_INTERFACE) +#cmakedefine GEOS_LA_INTERFACE @GEOS_LA_INTERFACE@ /// Macro defined when Trilinos interface is selected -#cmakedefine GEOSX_LA_INTERFACE_TRILINOS +#cmakedefine GEOS_LA_INTERFACE_TRILINOS /// Macro defined when Hypre interface is selected -#cmakedefine GEOSX_LA_INTERFACE_HYPRE +#cmakedefine GEOS_LA_INTERFACE_HYPRE /// Macro defined when PETSc interface is selected -#cmakedefine GEOSX_LA_INTERFACE_PETSC +#cmakedefine GEOS_LA_INTERFACE_PETSC /// Platform-dependent mangling of fortran function names (CMake option FORTRAN_MANGLE_NO_UNDERSCORE) #cmakedefine FORTRAN_MANGLE_NO_UNDERSCORE /// USE OF SEPARATION COEFFICIENT IN FRACTURE FLOW -#cmakedefine GEOSX_USE_SEPARATION_COEFFICIENT +#cmakedefine GEOS_USE_SEPARATION_COEFFICIENT /// CMake option CMAKE_BUILD_TYPE -#cmakedefine GEOSX_CMAKE_BUILD_TYPE @GEOSX_CMAKE_BUILD_TYPE@ +#cmakedefine GEOS_CMAKE_BUILD_TYPE @GEOS_CMAKE_BUILD_TYPE@ /// The type that localIndex will be aliased to. -#define GEOSX_LOCALINDEX_TYPE @GEOSX_LOCALINDEX_TYPE@ +#define GEOS_LOCALINDEX_TYPE @GEOS_LOCALINDEX_TYPE@ /// An integer flag representing the type that localIndex will be aliased to. -#define GEOSX_LOCALINDEX_TYPE_FLAG @GEOSX_LOCALINDEX_TYPE_FLAG@ +#define GEOS_LOCALINDEX_TYPE_FLAG @GEOS_LOCALINDEX_TYPE_FLAG@ /// The type that globalIndex will be aliased to. -#define GEOSX_GLOBALINDEX_TYPE @GEOSX_GLOBALINDEX_TYPE@ +#define GEOS_GLOBALINDEX_TYPE @GEOS_GLOBALINDEX_TYPE@ /// An integer flag representing the type that globalIndex will be aliased to. -#define GEOSX_GLOBALINDEX_TYPE_FLAG @GEOSX_GLOBALINDEX_TYPE_FLAG@ +#define GEOS_GLOBALINDEX_TYPE_FLAG @GEOS_GLOBALINDEX_TYPE_FLAG@ /// The default block size for GEOSX on this platform -#cmakedefine GEOSX_BLOCK_SIZE @GEOSX_BLOCK_SIZE@ +#cmakedefine GEOS_BLOCK_SIZE @GEOS_BLOCK_SIZE@ /// Version information for HDF5 #cmakedefine HDF5_VERSION @HDF5_VERSION@ diff --git a/src/coreComponents/common/GeosxMacros.hpp b/src/coreComponents/common/GeosxMacros.hpp index 357b64bbfdb..7396a6cf006 100644 --- a/src/coreComponents/common/GeosxMacros.hpp +++ b/src/coreComponents/common/GeosxMacros.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -87,7 +88,7 @@ void i_g_n_o_r_e( ARGS const & ... ) {} ///@} -#if defined(GEOSX_USE_OPENMP) +#if defined(GEOS_USE_OPENMP) /// Wrap a pragma clause in the _Pragma statement. We seek to make this include the omp portion of the clause. #define PRAGMA_OMP( clause ) _Pragma( clause ) // #define PRAGMA_OMP( clause ) _Pragma( STRINGIZE( omp clause ) ) diff --git a/src/coreComponents/common/LifoStorage.hpp b/src/coreComponents/common/LifoStorage.hpp index 821d28d4377..6bc25ec8bbb 100644 --- a/src/coreComponents/common/LifoStorage.hpp +++ b/src/coreComponents/common/LifoStorage.hpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + #ifndef LIFOSTORAGE_HPP #define LIFOSTORAGE_HPP diff --git a/src/coreComponents/common/LifoStorageCommon.hpp b/src/coreComponents/common/LifoStorageCommon.hpp index 615597e089c..ff31b170a7a 100644 --- a/src/coreComponents/common/LifoStorageCommon.hpp +++ b/src/coreComponents/common/LifoStorageCommon.hpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + #ifndef LIFOSTORAGECOMMON_HPP #define LIFOSTORAGECOMMON_HPP diff --git a/src/coreComponents/common/LifoStorageCuda.hpp b/src/coreComponents/common/LifoStorageCuda.hpp index 8c8be672aaa..0afb560fe2a 100644 --- a/src/coreComponents/common/LifoStorageCuda.hpp +++ b/src/coreComponents/common/LifoStorageCuda.hpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + #ifndef LIFOSTORAGECUDA_HPP #define LIFOSTORAGECUDA_HPP @@ -78,7 +80,7 @@ class LifoStorageCuda : public LifoStorageCommon< T, INDEX_TYPE > if( baseLifo::m_maxNumberOfBuffers - id > (int)m_deviceDeque.capacity() ) { - LIFO_MARK_SCOPE( geosx::lifoStorage::pushAddTasks ); + LIFO_MARK_SCOPE( geos::lifoStorage::pushAddTasks ); // This buffer will go to host memory, and maybe on disk std::packaged_task< void() > task( std::bind( &LifoStorageCuda< T, INDEX_TYPE >::deviceToHost, this, baseLifo::m_bufferToHostCount++ ) ); { @@ -112,7 +114,7 @@ class LifoStorageCuda : public LifoStorageCommon< T, INDEX_TYPE > if( baseLifo::m_bufferToHostCount > 0 ) { - LIFO_MARK_SCOPE( geosx::LifoStorageCuda::popAddTasks ); + LIFO_MARK_SCOPE( geos::LifoStorageCuda::popAddTasks ); // Trigger pull one buffer from host, and maybe from disk std::packaged_task< void() > task( std::bind( &LifoStorageCuda< T, INDEX_TYPE >::hostToDevice, this, --baseLifo::m_bufferToHostCount, id ) ); { diff --git a/src/coreComponents/common/LifoStorageHost.hpp b/src/coreComponents/common/LifoStorageHost.hpp index c11999de0cd..3ffb202db74 100644 --- a/src/coreComponents/common/LifoStorageHost.hpp +++ b/src/coreComponents/common/LifoStorageHost.hpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + #ifndef LIFOSTORAGEHOST_HPP #define LIFOSTORAGEHOST_HPP @@ -74,7 +76,7 @@ class LifoStorageHost : public LifoStorageCommon< T, INDEX_TYPE > if( baseLifo::m_maxNumberOfBuffers - pushId > (int)baseLifo::m_hostDeque.capacity() ) { - LIFO_MARK_SCOPE( geosx::lifoStorage::pushAddTasks ); + LIFO_MARK_SCOPE( geos::lifoStorage::pushAddTasks ); // This buffer will go to host memory, and maybe on disk std::packaged_task< void() > t2( std::bind( &LifoStorageHost< T, INDEX_TYPE >::hostToDisk, this, baseLifo::m_bufferToDiskCount++ ) ); { @@ -117,7 +119,7 @@ class LifoStorageHost : public LifoStorageCommon< T, INDEX_TYPE > if( baseLifo::m_bufferToDiskCount > 0 ) { - LIFO_MARK_SCOPE( geosx::LifoStorageHost::popAddTasks ); + LIFO_MARK_SCOPE( geos::LifoStorageHost::popAddTasks ); // Trigger pull one buffer from host, and maybe from disk std::packaged_task< void() > task2( std::bind( &LifoStorageHost< T, INDEX_TYPE >::diskToHost, this, --baseLifo::m_bufferToDiskCount ) ); { diff --git a/src/coreComponents/common/Logger.cpp b/src/coreComponents/common/Logger.cpp index 8b5e410cdf4..77a8946b000 100644 --- a/src/coreComponents/common/Logger.cpp +++ b/src/coreComponents/common/Logger.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -26,7 +27,7 @@ namespace geos /** * @brief Insert an exception message in another one. - * @param originalMsg original exception message (i.e. thrown from LVARRAY_THROW or GEOSX_THROW) + * @param originalMsg original exception message (i.e. thrown from LVARRAY_THROW or GEOS_THROW) * @param msgToInsert message to insert at the top of the originalMsg */ std::string insertExMsg( std::string const & originalMsg, std::string const & msgToInsert ) @@ -75,13 +76,13 @@ int n_ranks = 1; std::ostream * rankStream = nullptr; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm comm; #endif } // namespace internal -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI void InitializeLogger( MPI_Comm mpi_comm, const std::string & rankOutputDir ) { diff --git a/src/coreComponents/common/Logger.hpp b/src/coreComponents/common/Logger.hpp index f07c5376bd6..7246173f496 100644 --- a/src/coreComponents/common/Logger.hpp +++ b/src/coreComponents/common/Logger.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -28,7 +29,7 @@ // System includes #include -#if defined(GEOSX_USE_MPI) +#if defined(GEOS_USE_MPI) #include #endif @@ -536,12 +537,12 @@ extern int n_ranks; extern std::ostream * rankStream; -#if defined(GEOSX_USE_MPI) +#if defined(GEOS_USE_MPI) extern MPI_Comm comm; #endif } // namespace internal -#if defined(GEOSX_USE_MPI) +#if defined(GEOS_USE_MPI) /** * @brief Initialize the logger in a parallel build. * @param comm global MPI communicator diff --git a/src/coreComponents/common/MemoryInfos.cpp b/src/coreComponents/common/MemoryInfos.cpp index 145fff87f7a..51213c5cfec 100644 --- a/src/coreComponents/common/MemoryInfos.cpp +++ b/src/coreComponents/common/MemoryInfos.cpp @@ -1,11 +1,12 @@ /* * ------------------------------------------------------------------------------------------------------------ - * SPDX-LiCense-Identifier: LGPL-2.1-only + * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/MemoryInfos.hpp b/src/coreComponents/common/MemoryInfos.hpp index b2a22431d09..3f048d5ac8a 100644 --- a/src/coreComponents/common/MemoryInfos.hpp +++ b/src/coreComponents/common/MemoryInfos.hpp @@ -1,11 +1,12 @@ /* * ------------------------------------------------------------------------------------------------------------ - * SPDX-LiCense-Identifier: LGPL-2.1-only + * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/MpiWrapper.cpp b/src/coreComponents/common/MpiWrapper.cpp index e93e0e2c873..521f54fd210 100644 --- a/src/coreComponents/common/MpiWrapper.cpp +++ b/src/coreComponents/common/MpiWrapper.cpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + /** * @file MpiWrapper.cpp */ @@ -32,14 +34,14 @@ namespace geos void MpiWrapper::barrier( MPI_Comm const & MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Barrier( comm ); #endif } int MpiWrapper::cartCoords( MPI_Comm comm, int rank, int maxdims, int coords[] ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Cart_coords( comm, rank, maxdims, coords ); #else return 0; @@ -49,7 +51,7 @@ int MpiWrapper::cartCoords( MPI_Comm comm, int rank, int maxdims, int coords[] ) int MpiWrapper::cartCreate( MPI_Comm comm_old, int ndims, const int dims[], const int periods[], int reorder, MPI_Comm * comm_cart ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Cart_create( comm_old, ndims, dims, periods, reorder, comm_cart ); #else return 0; @@ -59,7 +61,7 @@ int MpiWrapper::cartCreate( MPI_Comm comm_old, int ndims, const int dims[], cons int MpiWrapper::cartRank( MPI_Comm comm, const int coords[] ) { int rank = 0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Cart_rank( comm, coords, &rank ); #endif return rank; @@ -67,7 +69,7 @@ int MpiWrapper::cartRank( MPI_Comm comm, const int coords[] ) void MpiWrapper::commFree( MPI_Comm & comm ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_CHECK_ERROR( MPI_Comm_free( &comm ) ); #else // comm = MPI_COMM_NULL; @@ -77,7 +79,7 @@ void MpiWrapper::commFree( MPI_Comm & comm ) int MpiWrapper::commRank( MPI_Comm const & MPI_PARAM( comm ) ) { int rank = 0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_rank( comm, &rank ); #endif return rank; @@ -86,7 +88,7 @@ int MpiWrapper::commRank( MPI_Comm const & MPI_PARAM( comm ) ) int MpiWrapper::commSize( MPI_Comm const & MPI_PARAM( comm ) ) { int size = 1; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_size( comm, &size ); #endif return size; @@ -94,7 +96,7 @@ int MpiWrapper::commSize( MPI_Comm const & MPI_PARAM( comm ) ) bool MpiWrapper::commCompare( MPI_Comm const & comm1, MPI_Comm const & comm2 ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI int result; MPI_Comm_compare( comm1, comm2, &result ); return result == MPI_IDENT || result == MPI_CONGRUENT; @@ -105,7 +107,7 @@ bool MpiWrapper::commCompare( MPI_Comm const & comm1, MPI_Comm const & comm2 ) bool MpiWrapper::initialized() { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI int ret = false; MPI_CHECK_ERROR( MPI_Initialized( &ret ) ); return ret; @@ -116,7 +118,7 @@ bool MpiWrapper::initialized() int MpiWrapper::init( int * argc, char * * * argv ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Init( argc, argv ); #else return 0; @@ -125,7 +127,7 @@ int MpiWrapper::init( int * argc, char * * * argv ) void MpiWrapper::finalize() { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_CHECK_ERROR( MPI_Finalize() ); #endif } @@ -133,7 +135,7 @@ void MpiWrapper::finalize() MPI_Comm MpiWrapper::commDup( MPI_Comm const comm ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm duplicate; MPI_CHECK_ERROR( MPI_Comm_dup( comm, &duplicate ) ); return duplicate; @@ -144,7 +146,7 @@ MPI_Comm MpiWrapper::commDup( MPI_Comm const comm ) MPI_Comm MpiWrapper::commSplit( MPI_Comm const comm, int color, int key ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm scomm; MPI_CHECK_ERROR( MPI_Comm_split( comm, color, key, &scomm ) ); return scomm; @@ -155,7 +157,7 @@ MPI_Comm MpiWrapper::commSplit( MPI_Comm const comm, int color, int key ) int MpiWrapper::test( MPI_Request * request, int * flag, MPI_Status * status ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Test( request, flag, status ); #else *flag = 0; @@ -165,7 +167,7 @@ int MpiWrapper::test( MPI_Request * request, int * flag, MPI_Status * status ) int MpiWrapper::testAny( int count, MPI_Request array_of_requests[], int * idx, int * flag, MPI_Status array_of_statuses[] ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Testany( count, array_of_requests, idx, flag, array_of_statuses ); #else *flag = 0; @@ -175,7 +177,7 @@ int MpiWrapper::testAny( int count, MPI_Request array_of_requests[], int * idx, int MpiWrapper::testSome( int count, MPI_Request array_of_requests[], int * outcount, int array_of_indices[], MPI_Status array_of_statuses[] ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Testsome( count, array_of_requests, outcount, array_of_indices, array_of_statuses ); #else *outcount = 0; @@ -185,7 +187,7 @@ int MpiWrapper::testSome( int count, MPI_Request array_of_requests[], int * outc int MpiWrapper::testAll( int count, MPI_Request array_of_requests[], int * flag, MPI_Status array_of_statuses[] ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Testall( count, array_of_requests, flag, array_of_statuses ); #else *flag = 0; @@ -195,7 +197,7 @@ int MpiWrapper::testAll( int count, MPI_Request array_of_requests[], int * flag, int MpiWrapper::check( MPI_Request * request, int * flag, MPI_Status * status ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Request_get_status( *request, flag, status ); #else *flag = 0; @@ -205,7 +207,7 @@ int MpiWrapper::check( MPI_Request * request, int * flag, MPI_Status * status ) int MpiWrapper::checkAny( int count, MPI_Request array_of_requests[], int * idx, int * flag, MPI_Status array_of_statuses[] ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI bool found = false; int flagCache = -1; int rval = MPI_SUCCESS; @@ -237,7 +239,7 @@ int MpiWrapper::checkAny( int count, MPI_Request array_of_requests[], int * idx, int MpiWrapper::checkAll( int count, MPI_Request array_of_requests[], int * flag, MPI_Status array_of_statuses[] ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI // assume all passing, any that don't pass set the flag to false *flag = 1; int rval = MPI_SUCCESS; @@ -264,7 +266,7 @@ int MpiWrapper::checkAll( int count, MPI_Request array_of_requests[], int * flag int MpiWrapper::wait( MPI_Request * request, MPI_Status * status ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Wait( request, status ); #else return 0; @@ -273,7 +275,7 @@ int MpiWrapper::wait( MPI_Request * request, MPI_Status * status ) int MpiWrapper::waitAny( int count, MPI_Request array_of_requests[], int * indx, MPI_Status array_of_statuses[] ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Waitany( count, array_of_requests, indx, array_of_statuses ); #else return 0; @@ -282,7 +284,7 @@ int MpiWrapper::waitAny( int count, MPI_Request array_of_requests[], int * indx, int MpiWrapper::waitSome( int count, MPI_Request array_of_requests[], int * outcount, int array_of_indices[], MPI_Status array_of_statuses[] ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Waitsome( count, array_of_requests, outcount, array_of_indices, array_of_statuses ); #else // *outcount = 0; @@ -292,7 +294,7 @@ int MpiWrapper::waitSome( int count, MPI_Request array_of_requests[], int * outc int MpiWrapper::waitAll( int count, MPI_Request array_of_requests[], MPI_Status array_of_statuses[] ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Waitall( count, array_of_requests, array_of_statuses ); #else return 0; @@ -301,7 +303,7 @@ int MpiWrapper::waitAll( int count, MPI_Request array_of_requests[], MPI_Status double MpiWrapper::wtime( void ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Wtime( ); #else return 0; diff --git a/src/coreComponents/common/MpiWrapper.hpp b/src/coreComponents/common/MpiWrapper.hpp index 3c8c97a3dce..d0ae08dc1af 100644 --- a/src/coreComponents/common/MpiWrapper.hpp +++ b/src/coreComponents/common/MpiWrapper.hpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + /** * @file MpiWrapper.hpp */ @@ -21,7 +23,7 @@ #include "common/DataTypes.hpp" #include "common/Span.hpp" -#if defined(GEOSX_USE_MPI) +#if defined(GEOS_USE_MPI) #include #define MPI_PARAM( x ) x #else @@ -276,7 +278,7 @@ struct MpiWrapper std::vector< std::tuple< MPI_Request *, MPI_Status *, std::function< MPI_Request ( int ) > > > const & phases ); ///@} -#if !defined(GEOSX_USE_MPI) +#if !defined(GEOS_USE_MPI) static std::map< int, std::pair< int, void * > > & getTagToPointersMap() { static std::map< int, std::pair< int, void * > > tagToPointers; @@ -674,7 +676,7 @@ int MpiWrapper::allgather( T_SEND const * const sendbuf, int recvcount, MPI_Comm MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Allgather( sendbuf, sendcount, internal::getMpiType< T_SEND >(), recvbuf, recvcount, internal::getMpiType< T_RECV >(), comm ); @@ -695,7 +697,7 @@ int MpiWrapper::allgatherv( T_SEND const * const sendbuf, int * displacements, MPI_Comm MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Allgatherv( sendbuf, sendcount, internal::getMpiType< T_SEND >(), recvbuf, recvcounts, displacements, internal::getMpiType< T_RECV >(), comm ); @@ -712,7 +714,7 @@ int MpiWrapper::allgatherv( T_SEND const * const sendbuf, template< typename T > void MpiWrapper::allGather( T const myValue, array1d< T > & allValues, MPI_Comm MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI int const mpiSize = commSize( comm ); allValues.resize( mpiSize ); @@ -732,7 +734,7 @@ int MpiWrapper::allGather( arrayView1d< T const > const & sendValues, MPI_Comm MPI_PARAM( comm ) ) { int const sendSize = LvArray::integerConversion< int >( sendValues.size() ); -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI int const mpiSize = commSize( comm ); allValues.resize( mpiSize * sendSize ); return MPI_Allgather( sendValues.data(), @@ -760,7 +762,7 @@ int MpiWrapper::allReduce( T const * const sendbuf, MPI_Op const MPI_PARAM( op ), MPI_Comm const MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Datatype const mpiType = internal::getMpiType< T >(); return MPI_Allreduce( sendbuf == recvbuf ? MPI_IN_PLACE : sendbuf, recvbuf, count, mpiType, op, comm ); #else @@ -780,7 +782,7 @@ int MpiWrapper::reduce( T const * const sendbuf, int root, MPI_Comm const MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Datatype const mpiType = internal::getMpiType< T >(); return MPI_Reduce( sendbuf == recvbuf ? MPI_IN_PLACE : sendbuf, recvbuf, count, mpiType, op, root, comm ); #else @@ -799,7 +801,7 @@ int MpiWrapper::scan( T const * const sendbuf, MPI_Op MPI_PARAM( op ), MPI_Comm MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Scan( sendbuf, recvbuf, count, internal::getMpiType< T >(), op, comm ); #else memcpy( recvbuf, sendbuf, count*sizeof(T) ); @@ -814,7 +816,7 @@ int MpiWrapper::exscan( T const * const MPI_PARAM( sendbuf ), MPI_Op MPI_PARAM( op ), MPI_Comm MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Exscan( sendbuf, recvbuf, count, internal::getMpiType< T >(), op, comm ); #else memset( recvbuf, 0, count*sizeof(T) ); @@ -828,7 +830,7 @@ int MpiWrapper::bcast( T * const MPI_PARAM( buffer ), int MPI_PARAM( root ), MPI_Comm MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Bcast( buffer, count, internal::getMpiType< T >(), root, comm ); #else return 0; @@ -839,7 +841,7 @@ int MpiWrapper::bcast( T * const MPI_PARAM( buffer ), template< typename T > void MpiWrapper::broadcast( T & MPI_PARAM( value ), int MPI_PARAM( srcRank ), MPI_Comm MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Bcast( &value, 1, internal::getMpiType< T >(), srcRank, comm ); #endif } @@ -850,7 +852,7 @@ void MpiWrapper::broadcast< string >( string & MPI_PARAM( value ), int MPI_PARAM( srcRank ), MPI_Comm MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI int size = LvArray::integerConversion< int >( value.size() ); broadcast( size, srcRank, comm ); value.resize( size ); @@ -866,7 +868,7 @@ int MpiWrapper::gather( TS const * const sendbuf, int MPI_PARAM( root ), MPI_Comm MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Gather( sendbuf, sendcount, internal::getMpiType< TS >(), recvbuf, recvcount, internal::getMpiType< TR >(), root, comm ); @@ -890,7 +892,7 @@ int MpiWrapper::gatherv( TS const * const sendbuf, int MPI_PARAM( root ), MPI_Comm MPI_PARAM( comm ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return MPI_Gatherv( sendbuf, sendcount, internal::getMpiType< TS >(), recvbuf, recvcounts, displs, internal::getMpiType< TR >(), root, comm ); @@ -913,7 +915,7 @@ int MpiWrapper::iRecv( T * const buf, MPI_Comm MPI_PARAM( comm ), MPI_Request * MPI_PARAM( request ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI GEOS_ERROR_IF( (*request)!=MPI_REQUEST_NULL, "Attempting to use an MPI_Request that is still in use." ); return MPI_Irecv( buf, count, internal::getMpiType< T >(), source, tag, comm, request ); @@ -943,7 +945,7 @@ int MpiWrapper::recv( array1d< T > & buf, MPI_Comm MPI_PARAM( comm ), MPI_Status * MPI_PARAM( request ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Status status; int count; MPI_Probe( source, tag, comm, &status ); @@ -972,7 +974,7 @@ int MpiWrapper::iSend( arrayView1d< T > const & buf, MPI_Comm MPI_PARAM( comm ), MPI_Request * MPI_PARAM( request ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI GEOS_ERROR_IF( (*request)!=MPI_REQUEST_NULL, "Attempting to use an MPI_Request that is still in use." ); return MPI_Isend( reinterpret_cast< void const * >( buf.data() ), @@ -996,7 +998,7 @@ int MpiWrapper::iSend( T const * const buf, MPI_Comm MPI_PARAM( comm ), MPI_Request * MPI_PARAM( request ) ) { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI GEOS_ERROR_IF( (*request)!=MPI_REQUEST_NULL, "Attempting to use an MPI_Request that is still in use." ); return MPI_Isend( buf, count, internal::getMpiType< T >(), dest, tag, comm, request ); @@ -1025,7 +1027,7 @@ U MpiWrapper::prefixSum( T const value, MPI_Comm comm ) { U localResult; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI U const convertedValue = value; int const error = MPI_Exscan( &convertedValue, &localResult, 1, internal::getMpiType< U >(), MPI_SUM, comm ); MPI_CHECK_ERROR( error ); diff --git a/src/coreComponents/common/MultiMutexesLock.hpp b/src/coreComponents/common/MultiMutexesLock.hpp index 2bfd9ac83d4..f338fea4478 100644 --- a/src/coreComponents/common/MultiMutexesLock.hpp +++ b/src/coreComponents/common/MultiMutexesLock.hpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + #ifndef MULTIMUTEXESLOCK_HPP #define MULTIMUTEXESLOCK_HPP diff --git a/src/coreComponents/common/Path.cpp b/src/coreComponents/common/Path.cpp index 65f11b660e9..50993a1a2da 100644 --- a/src/coreComponents/common/Path.cpp +++ b/src/coreComponents/common/Path.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/Path.hpp b/src/coreComponents/common/Path.hpp index 80c52b9abe1..27e54f3cf03 100644 --- a/src/coreComponents/common/Path.hpp +++ b/src/coreComponents/common/Path.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/PhysicsConstants.hpp b/src/coreComponents/common/PhysicsConstants.hpp index 410e45fbc16..8bc35c1b1fd 100644 --- a/src/coreComponents/common/PhysicsConstants.hpp +++ b/src/coreComponents/common/PhysicsConstants.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/Span.hpp b/src/coreComponents/common/Span.hpp index ca9330d084a..40c6c180576 100644 --- a/src/coreComponents/common/Span.hpp +++ b/src/coreComponents/common/Span.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/Stopwatch.hpp b/src/coreComponents/common/Stopwatch.hpp index 6fb3c0e23a6..c506f5190ab 100644 --- a/src/coreComponents/common/Stopwatch.hpp +++ b/src/coreComponents/common/Stopwatch.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -89,6 +90,6 @@ class Stopwatch real64 * m_result{}; }; -} // end geosx +} // end geos #endif diff --git a/src/coreComponents/common/Tensor.hpp b/src/coreComponents/common/Tensor.hpp index 9b81af36c01..0a13e98cdcc 100644 --- a/src/coreComponents/common/Tensor.hpp +++ b/src/coreComponents/common/Tensor.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/Timer.hpp b/src/coreComponents/common/Timer.hpp index 909340b7e5e..8deac3d3cc7 100644 --- a/src/coreComponents/common/Timer.hpp +++ b/src/coreComponents/common/Timer.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/TimingMacros.hpp b/src/coreComponents/common/TimingMacros.hpp index d9089fd4d95..01dc0a7f880 100644 --- a/src/coreComponents/common/TimingMacros.hpp +++ b/src/coreComponents/common/TimingMacros.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -88,7 +89,7 @@ namespace timingHelpers #endif /* USE_CUDA */ -#ifdef GEOSX_USE_CALIPER +#ifdef GEOS_USE_CALIPER #include #include #include @@ -112,7 +113,7 @@ namespace timingHelpers /// Mark the end of function, only useful when you don't want to or can't mark the whole function. #define GEOS_CALIPER_MARK_FUNCTION_END CALI_MARK_FUNCTION_END -#else // GEOSX_USE_CALIPER +#else // GEOS_USE_CALIPER /// @cond DO_NOT_DOCUMENT #define GEOS_CALIPER_MARK_SCOPE(name) @@ -125,7 +126,7 @@ namespace timingHelpers #define GEOS_CALIPER_MARK_FUNCTION_END /// @endcond -#endif // GEOSX_USE_CALIPER +#endif // GEOS_USE_CALIPER /// Mark scope with both Caliper and NVTX if enabled #define GEOS_MARK_SCOPE(name) GEOS_CALIPER_MARK_SCOPE(name); GEOS_NVTX_MARK_SCOPE(name) @@ -141,7 +142,7 @@ namespace timingHelpers #define GEOS_MARK_END(name) GEOS_CALIPER_MARK_END(name) /// Get current time of day as a floating point number of seconds in a variable @p time. -#ifdef GEOSX_USE_TIMERS +#ifdef GEOS_USE_TIMERS #define GEOS_GET_TIME( time ) \ real64 time; \ do \ diff --git a/src/coreComponents/common/TypeDispatch.hpp b/src/coreComponents/common/TypeDispatch.hpp index c7f30afdf1e..0a845210a22 100644 --- a/src/coreComponents/common/TypeDispatch.hpp +++ b/src/coreComponents/common/TypeDispatch.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/Units.cpp b/src/coreComponents/common/Units.cpp index 94a3e055099..7b2e21ca3cc 100644 --- a/src/coreComponents/common/Units.cpp +++ b/src/coreComponents/common/Units.cpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + /** * @file Units.cpp */ diff --git a/src/coreComponents/common/Units.hpp b/src/coreComponents/common/Units.hpp index c1025f3c2e4..80b94a94d8d 100644 --- a/src/coreComponents/common/Units.hpp +++ b/src/coreComponents/common/Units.hpp @@ -1,11 +1,12 @@ /* - * ------------------------------------------------------------------------------------- + * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index a86cbf15af9..4d69cc878fa 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -1,11 +1,12 @@ /* * ------------------------------------------------------------------------------------------------------------ - * SPDX-LiCense-Identifier: LGPL-2.1-only + * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -30,9 +31,9 @@ #include "umpire/util/MemoryResourceTraits.hpp" #include "umpire/util/Platform.hpp" -#if defined( GEOSX_USE_CALIPER ) +#if defined( GEOS_USE_CALIPER ) #include -#if defined( GEOSX_USE_ADIAK ) +#if defined( GEOS_USE_ADIAK ) #include #endif #endif @@ -40,11 +41,11 @@ // System includes #include -#if defined( GEOSX_USE_MKL ) +#if defined( GEOS_USE_MKL ) #include #endif -#if defined( GEOSX_USE_OPENMP ) +#if defined( GEOS_USE_OPENMP ) #include #endif @@ -63,7 +64,7 @@ namespace geos /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setupLogger() { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI logger::InitializeLogger( MPI_COMM_GEOSX ); #else logger::InitializeLogger(); @@ -81,7 +82,7 @@ void setupLvArray() { LvArray::system::setErrorHandler( []() { - #if defined( GEOSX_USE_MPI ) + #if defined( GEOS_USE_MPI ) int mpi = 0; MPI_Initialized( &mpi ); if( mpi ) @@ -94,7 +95,7 @@ void setupLvArray() LvArray::system::setSignalHandling( []( int const signal ) { LvArray::system::stackTraceHandler( signal, true ); } ); -#if defined(GEOSX_USE_FPE) +#if defined(GEOS_USE_FPE) LvArray::system::setFPE(); #else LvArray::system::disableFloatingPointExceptions( FE_ALL_EXCEPT ); @@ -104,7 +105,7 @@ void setupLvArray() /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setupMKL() { -#ifdef GEOSX_USE_MKL +#ifdef GEOS_USE_MKL GEOS_LOG_RANK_0( "MKL max threads: " << mkl_get_max_threads() ); #endif } @@ -112,7 +113,7 @@ void setupMKL() /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setupOpenMP() { -#ifdef GEOSX_USE_OPENMP +#ifdef GEOS_USE_OPENMP GEOS_LOG_RANK_0( "Max threads: " << omp_get_max_threads() ); #endif } @@ -141,7 +142,7 @@ void finalizeMPI() MpiWrapper::finalize(); } -#if defined( GEOSX_USE_CALIPER ) +#if defined( GEOS_USE_CALIPER ) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setupCaliper( cali::ConfigManager & caliperManager, @@ -151,8 +152,8 @@ void setupCaliper( cali::ConfigManager & caliperManager, GEOS_ERROR_IF( caliperManager.error(), "Caliper config error: " << caliperManager.error_msg() ); caliperManager.start(); -#if defined( GEOSX_USE_ADIAK ) -#if defined( GEOSX_USE_MPI ) +#if defined( GEOS_USE_ADIAK ) +#if defined( GEOS_USE_MPI ) adiak::init( &MPI_COMM_GEOSX ); #else adiak::init( nullptr ); @@ -173,7 +174,7 @@ void setupCaliper( cali::ConfigManager & caliperManager, adiak::value( "Problem name", commandLineOptions.problemName ); // MPI info -#if defined( GEOSX_USE_MPI ) +#if defined( GEOS_USE_MPI ) adiak::value( "MPI", "On" ); adiak::value( "mpi ranks", MpiWrapper::commSize() ); #else @@ -196,11 +197,11 @@ void setupCaliper( cali::ConfigManager & caliperManager, adiak::value ( "compiler version", "unknown" ); #endif - adiak::value( "build type", GEOSX_CMAKE_BUILD_TYPE ); + adiak::value( "build type", GEOS_CMAKE_BUILD_TYPE ); adiak::value( "compilation date", __DATE__ ); // OpenMP info -#if defined( GEOSX_USE_OPENMP ) +#if defined( GEOS_USE_OPENMP ) std::int64_t const numThreads = omp_get_max_threads(); adiak::value( "OpenMP", "On" ); #else @@ -227,21 +228,21 @@ void setupCaliper( cali::ConfigManager & caliperManager, int hipDriverVersion = 0; #if defined( GESOX_USE_HIP ) adiak::value( "HIP", "On" ) - GEOSX_ERROR_IF_NE( hipSuccess, hipRuntimeGetVersion( &hipRuntimeVersion ) ); - GEOSX_ERROR_IF_NE( hipSuccess, hipDriverGetVersion( &hipDriverVersion ) ); + GEOS_ERROR_IF_NE( hipSuccess, hipRuntimeGetVersion( &hipRuntimeVersion ) ); + GEOS_ERROR_IF_NE( hipSuccess, hipDriverGetVersion( &hipDriverVersion ) ); #else adiak::value( "HIP", "Off" ); #endif adiak::value( "HIP runtime version", hipRuntimeVersion ); adiak::value( "HIP driver version", hipDriverVersion ); -#endif // defined( GEOSX_USE ADIAK ) +#endif // defined( GEOS_USE ADIAK ) } -#endif // defined( GEOSX_USE_CALIPER ) +#endif // defined( GEOS_USE_CALIPER ) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void finalizeCaliper() { -#if defined( GEOSX_USE_CALIPER )and defined( GEOSX_USE_ADIAK ) +#if defined( GEOS_USE_CALIPER )and defined( GEOS_USE_ADIAK ) adiak::fini(); #endif } diff --git a/src/coreComponents/common/initializeEnvironment.hpp b/src/coreComponents/common/initializeEnvironment.hpp index 044b1977294..70e2b4b720b 100644 --- a/src/coreComponents/common/initializeEnvironment.hpp +++ b/src/coreComponents/common/initializeEnvironment.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -20,9 +21,9 @@ #include "MpiWrapper.hpp" // TPL includes -#ifdef GEOSX_USE_CALIPER +#ifdef GEOS_USE_CALIPER -#ifdef GEOSX_USE_ADIAK +#ifdef GEOS_USE_ADIAK #include #endif @@ -146,7 +147,7 @@ void setupEnvironment( int argc, char * argv[] ); */ void cleanupEnvironment(); -#if defined( GEOSX_USE_CALIPER ) +#if defined( GEOS_USE_CALIPER ) /** * @brief Setup Caliper and Adiak. @@ -169,7 +170,7 @@ void setupCaliper( cali::ConfigManager & caliperManager, template< typename T > void pushStatsIntoAdiak( string const & name, T const value ) { -#if defined( GEOSX_USE_CALIPER ) && defined( GEOSX_USE_ADIAK ) && !defined(__APPLE__) +#if defined( GEOS_USE_CALIPER ) && defined( GEOS_USE_ADIAK ) && !defined(__APPLE__) // Apple clang doesn't like adiak. T const total = MpiWrapper::sum( value ); adiak::value( name + " sum", total ); diff --git a/src/coreComponents/common/unitTests/testCaliperSmoke.cpp b/src/coreComponents/common/unitTests/testCaliperSmoke.cpp index b2e4e0685a6..77771355819 100644 --- a/src/coreComponents/common/unitTests/testCaliperSmoke.cpp +++ b/src/coreComponents/common/unitTests/testCaliperSmoke.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2022 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2022 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2022 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/unitTests/testDataTypes.cpp b/src/coreComponents/common/unitTests/testDataTypes.cpp index ba76eabbd0b..bd875e8d70b 100644 --- a/src/coreComponents/common/unitTests/testDataTypes.cpp +++ b/src/coreComponents/common/unitTests/testDataTypes.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp b/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp index 605892b7b54..b9a2489b181 100644 --- a/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp +++ b/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "common/DataTypes.hpp" #include "common/FixedSizeDeque.hpp" #include "LvArray/src/Array.hpp" diff --git a/src/coreComponents/common/unitTests/testLifoStorage.cpp b/src/coreComponents/common/unitTests/testLifoStorage.cpp index 5a0b5e8b415..1432137b545 100644 --- a/src/coreComponents/common/unitTests/testLifoStorage.cpp +++ b/src/coreComponents/common/unitTests/testLifoStorage.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "mainInterface/initialization.hpp" #define LIFO_DISABLE_CALIPER #include "common/LifoStorage.hpp" diff --git a/src/coreComponents/common/unitTests/testTypeDispatch.cpp b/src/coreComponents/common/unitTests/testTypeDispatch.cpp index 837f09b7ce8..4b0b19db0ab 100644 --- a/src/coreComponents/common/unitTests/testTypeDispatch.cpp +++ b/src/coreComponents/common/unitTests/testTypeDispatch.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/common/unitTests/testUnits.cpp b/src/coreComponents/common/unitTests/testUnits.cpp index 57a8ad0588d..a27d979c1a2 100644 --- a/src/coreComponents/common/unitTests/testUnits.cpp +++ b/src/coreComponents/common/unitTests/testUnits.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index 4b9bd811ef6..cae2dbc2e7f 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -322,7 +322,7 @@ blt_add_library( NAME constitutive SOURCES ${constitutive_sources} HEADERS ${constitutive_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( constitutive PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/constitutive/ConstitutiveBase.cpp b/src/coreComponents/constitutive/ConstitutiveBase.cpp index e55cb851a69..5912c5036ae 100644 --- a/src/coreComponents/constitutive/ConstitutiveBase.cpp +++ b/src/coreComponents/constitutive/ConstitutiveBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/ConstitutiveBase.hpp b/src/coreComponents/constitutive/ConstitutiveBase.hpp index b0f9adbf148..1c876768381 100644 --- a/src/coreComponents/constitutive/ConstitutiveBase.hpp +++ b/src/coreComponents/constitutive/ConstitutiveBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/ConstitutiveManager.cpp b/src/coreComponents/constitutive/ConstitutiveManager.cpp index f1e587822ab..5328aaf10c3 100644 --- a/src/coreComponents/constitutive/ConstitutiveManager.cpp +++ b/src/coreComponents/constitutive/ConstitutiveManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/ConstitutiveManager.hpp b/src/coreComponents/constitutive/ConstitutiveManager.hpp index 85c5da0f143..3962a4bbe75 100644 --- a/src/coreComponents/constitutive/ConstitutiveManager.hpp +++ b/src/coreComponents/constitutive/ConstitutiveManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/ConstitutivePassThru.hpp b/src/coreComponents/constitutive/ConstitutivePassThru.hpp index d2e22316b4a..a74a7f4dc87 100644 --- a/src/coreComponents/constitutive/ConstitutivePassThru.hpp +++ b/src/coreComponents/constitutive/ConstitutivePassThru.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp b/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp index 14013dd6ddb..6430e1dfa78 100644 --- a/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp +++ b/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/ExponentialRelation.hpp b/src/coreComponents/constitutive/ExponentialRelation.hpp index 398ba112b56..ff0f197872a 100644 --- a/src/coreComponents/constitutive/ExponentialRelation.hpp +++ b/src/coreComponents/constitutive/ExponentialRelation.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/NullModel.cpp b/src/coreComponents/constitutive/NullModel.cpp index 139715f74e3..732a47c53b9 100644 --- a/src/coreComponents/constitutive/NullModel.cpp +++ b/src/coreComponents/constitutive/NullModel.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/NullModel.hpp b/src/coreComponents/constitutive/NullModel.hpp index 962232e00ab..0a0635da757 100644 --- a/src/coreComponents/constitutive/NullModel.hpp +++ b/src/coreComponents/constitutive/NullModel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/PVTPackage b/src/coreComponents/constitutive/PVTPackage index a92dd22bf4e..59d81b149e3 160000 --- a/src/coreComponents/constitutive/PVTPackage +++ b/src/coreComponents/constitutive/PVTPackage @@ -1 +1 @@ -Subproject commit a92dd22bf4e2ddd16d3253613ca40a8fb769827a +Subproject commit 59d81b149e35ea5db0d715e608217d8bd56e9291 diff --git a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp index 630dae66ff9..6e34b636749 100644 --- a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp index 9834b029970..48d53d7e6a2 100644 --- a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp index b372188451a..b097576cc1a 100644 --- a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp index e6ff0fb2d23..efe78bdd908 100644 --- a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp index ef5f41b4299..74b5c13998f 100644 --- a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp index 8ed27aba071..de1a06ddf1b 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp index f61d8edc8ce..33395544d0c 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp index d805c527f33..a5354d499a8 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp index 6d50f0a1ea6..35afce50906 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp index 2f8cbbada24..f6ee1174791 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp index aeae952cb4f..b55e4858e36 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp index 39982df95e0..a7822804573 100644 --- a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp index 027fbb64efc..f7512bfbc9b 100644 --- a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp b/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp index a38ef270c1c..987ec59bc60 100644 --- a/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/capillaryPressure/layouts.hpp b/src/coreComponents/constitutive/capillaryPressure/layouts.hpp index 7459fcdc23f..802c932fcc7 100644 --- a/src/coreComponents/constitutive/capillaryPressure/layouts.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/layouts.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/contact/ContactBase.cpp b/src/coreComponents/constitutive/contact/ContactBase.cpp index 9c68adfa84d..fa4de0fb776 100644 --- a/src/coreComponents/constitutive/contact/ContactBase.cpp +++ b/src/coreComponents/constitutive/contact/ContactBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/contact/ContactBase.hpp b/src/coreComponents/constitutive/contact/ContactBase.hpp index 9d06e65749a..7b088ed5e17 100644 --- a/src/coreComponents/constitutive/contact/ContactBase.hpp +++ b/src/coreComponents/constitutive/contact/ContactBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/contact/ContactSelector.hpp b/src/coreComponents/constitutive/contact/ContactSelector.hpp index 409928de82c..e067ddfc90b 100644 --- a/src/coreComponents/constitutive/contact/ContactSelector.hpp +++ b/src/coreComponents/constitutive/contact/ContactSelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/contact/CoulombContact.cpp b/src/coreComponents/constitutive/contact/CoulombContact.cpp index a573684c22e..95ef7d5f8ea 100644 --- a/src/coreComponents/constitutive/contact/CoulombContact.cpp +++ b/src/coreComponents/constitutive/contact/CoulombContact.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/contact/CoulombContact.hpp b/src/coreComponents/constitutive/contact/CoulombContact.hpp index 115ff0debb5..89b39211b0d 100644 --- a/src/coreComponents/constitutive/contact/CoulombContact.hpp +++ b/src/coreComponents/constitutive/contact/CoulombContact.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.cpp b/src/coreComponents/constitutive/contact/FrictionlessContact.cpp index 3e16b4e3e77..5a30413f633 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.cpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp index 62e9a908402..2b99908609e 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp b/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp index 9313e991f6e..3f6c6ba15a5 100644 --- a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp +++ b/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp b/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp index 297a1b2b95c..5f82cdf00d2 100644 --- a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp +++ b/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp index 62b2f4ff0a2..0ea578e7f32 100644 --- a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp +++ b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp index 71ff2273779..ae25a77d2ac 100644 --- a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp +++ b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp index 619e5894afb..e87a50d5426 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp b/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp index 724f9e27565..a80b749242f 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp b/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp index 2087f2b8fa6..052a4d907d5 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp b/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp index 612bd8ef5ed..42634f06f40 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/dispersion/DispersionBase.cpp b/src/coreComponents/constitutive/dispersion/DispersionBase.cpp index 93c635e1f29..416904148f4 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionBase.cpp +++ b/src/coreComponents/constitutive/dispersion/DispersionBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/dispersion/DispersionBase.hpp b/src/coreComponents/constitutive/dispersion/DispersionBase.hpp index 022965353b9..99587459115 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionBase.hpp +++ b/src/coreComponents/constitutive/dispersion/DispersionBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/dispersion/DispersionFields.hpp b/src/coreComponents/constitutive/dispersion/DispersionFields.hpp index 00901dce438..66f85fc2781 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionFields.hpp +++ b/src/coreComponents/constitutive/dispersion/DispersionFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp b/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp index 4372d726a41..f0e5f146fef 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp +++ b/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp index 2396c8d8985..57cf6b28e4b 100644 --- a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp +++ b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp index 05c67404feb..4ac27a5d81c 100644 --- a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp +++ b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 87cbcdcec4c..9267c9a3309 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp index 612d01e1fc3..968adbf775f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp index bb19077f9e3..37e0092277e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp index a5d6c9c776e..a42c0773420 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp index 6d98a575881..a7fe70a0b0d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp index b8b347702b6..4536efa96f5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp index 9b8d794ee58..d3bdc762b0e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp index f7856a1696d..9be9db8ac8a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp index 1017ed50fea..cc0978206c0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp index 4867a1754c9..1e314cbe6ee 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp index 4af2beb32aa..32936f78fc4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp index da8b829f702..2bb308086e6 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp index 5ce85a9645d..41aaa3ea1d5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp index 4f2a140f99d..77d27b1a883 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp index 9221c48503b..d69edc81041 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp index cc7b5f3bab2..4546e1381ae 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp index f0db58369b3..677f6c61450 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp index 70c4425a9b3..dfd7ed7add3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp index 01c71019b86..6310bf49224 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp index ec24045a0fa..8713454505c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp index bffb350a4ac..17a084355c2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp index ec63aa192a9..6b7ac1ed990 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp index f007f573f83..6a8c66be0c3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp index 741ab11f3c0..f79cd790427 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp index e8205e8745b..3f9dd756f00 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp index 314f7498dde..afa90c08979 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp index 47721c43539..688fe9ae3e8 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp index 7bfea2c71a8..783e3976405 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp index f71c6ed46dd..dd445557884 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp index 5f0e3f39276..346d520acd3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp index 6f57a276661..6122bc4ef61 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp index 85208dd7e70..8d5dbe22103 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp index 0c8c8466256..c8836f67143 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp index 8edc4419d64..14dd9c2c65c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp index 5fd11ddc4c0..e6f0364e012 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp index fa20fc692bd..bd7f990b215 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp index 16a4a497ee7..e8787ccd427 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp index 181559cd7bd..e68d2ea01d2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp index 244bdcd73c5..4c0d3dada34 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp index e1bb09c0276..96e1eecf0e0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp b/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp index 894fa58d041..76716182c59 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp index e00a0e88641..16cb5903adc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp index 6dbf9e15438..2e570e58dab 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp index 24055925e16..6d94ba2c422 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp index 66ef6fee67f..d73639350a0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index 2e1eb17f92b..9934a77c5ca 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -24,7 +25,7 @@ #include "constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp" #include "common/GeosxConfig.hpp" -#ifdef GEOSX_USE_PVTPackage +#ifdef GEOS_USE_PVTPackage #include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp" #endif #include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" @@ -41,7 +42,7 @@ void constitutiveUpdatePassThru( MultiFluidBase const & fluid, { ConstitutivePassThruHandler< DeadOilFluid, BlackOilFluid, -#ifdef GEOSX_USE_PVTPackage +#ifdef GEOS_USE_PVTPackage CompositionalMultiphaseFluidPVTPackage, #endif CO2BrinePhillipsFluid, @@ -63,7 +64,7 @@ void constitutiveUpdatePassThru( MultiFluidBase & fluid, { ConstitutivePassThruHandler< DeadOilFluid, BlackOilFluid, -#ifdef GEOSX_USE_PVTPackage +#ifdef GEOS_USE_PVTPackage CompositionalMultiphaseFluidPVTPackage, #endif CO2BrinePhillipsFluid, diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp index e911cc5260e..3bccb811d38 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp index 6184280deb1..21cc399b274 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp index 557dc93757e..958c9fdfac3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp index 8035817461c..5a8594a34cc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp index ca6d17faa67..5daaa66f6d9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp index 97bbc5003ee..0527fe51d75 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp index de7ac866c2b..39b44a8112f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp index 96ec825909b..03a6aadba67 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp index 6973c413204..6739765da10 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp index c651f9baf5e..9982eed41ae 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp index e6bf84094f9..86ae569e672 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp index 8436f16bef8..eee1929c68e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp index f2c8442a944..bcc002ff0f7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp index aecd47507d1..c90f0fe9366 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp index 2c077184450..9646ba94ad0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp index 0c9e875a536..176d051f0f3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp index 34c08cddad6..f5206116040 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp index 8c4007e1660..40002e84e48 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp index 73f2d4495a8..bcf0e5c482e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp index 5f48a008cfc..95d7805133b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp index 4bdc6b832e4..5e3a7da05d5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp index df3caa11849..f1c85834b70 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp index 3f2d3d45c88..ccf48b312b9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp index f602cd70308..dfe817fc894 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp index d1a53eeb39e..7b3a860bf37 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp index 8965a34d42d..3ef3cf25b5f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp index 69e9d330496..59d50b60eba 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp index 3042b1a2c94..be61c18688d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp index e166ad1157b..aaf71b93089 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp index 4d6740aedc9..d322a3a993d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp index f5a1e43a2e9..e11290a280b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp index adbc7263298..227ff77ffff 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp index 751732a4711..4851da980fd 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp index 08969c8cf75..2b6f05510bf 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp index 253facef979..236f430b9a1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp index 567ca46592c..40ba0fb80a3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp index 7525a48a445..f32e388c9ad 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp index f159eb9d755..ff353033d20 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp index a3e4b1aa372..3767a0d049e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp index eb454179210..77b624b50a2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp index 17afda8e4ba..498f35810a2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp index ff189b2419a..0ba841e2e44 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp index b42dcf136c8..32300637aea 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp index 05c2b6ef9c2..1a619cfcf88 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp index ea3fb238325..4b3213d84a2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index dce987363f0..1cb850d3b40 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp index 43440de852d..bf7040d8cb4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.cpp index 48ad15e5730..7c95359f28a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp index 0866c812ca2..5f8ff2f2597 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp index 6d69b0805f1..307d7a6dab0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp index f7687ab2201..fcb3a6e61c5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp index c5f19ff1652..4fd8f6c9fb3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp index 8531ecb7383..65b609f1e7e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp index 4cc3eef7114..d98b9b7c1dc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp index 08cd8287776..dfb3f4fcbea 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp index fa2c6643bd1..8b21bd86df6 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp index 9b470dff5c0..22f0ef1b0fa 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp index bc9c3f4ccee..899c4322778 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp index c7c78367b77..ed5f67b8154 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp index d571b77449e..353fa69abcd 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp index b1e41890953..6155265b287 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp index 7de1fd667a6..b0f9fc5b2dd 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp index 5e3b2782b46..76579665d1f 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp index 2e9b68b3fcf..fa7a07322ad 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp index b155f32311d..5356b3d5910 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp index 7eab5fa5ed8..82981ebece3 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp index 8fd597199f3..92aa8bc821c 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp index 11f3bf75a28..35892c14bad 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp index 1c3ebbd335b..22ac6bed8d5 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp index 82c56f8d369..170e7800a47 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp index f6fcaafd941..0ad291f6971 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp index 0f15bb504d2..7a0dc182027 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp index d71dc3641f4..5b33c887c63 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp index bd7bd573c02..284692521c9 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp index fd262767eee..fcc24a0f7fb 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp index b3ccad93a01..ec918c41e5a 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp index 864b1540368..be026cb79c2 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp index 16a9cb0737e..5815c2f7a47 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp index 5192f3cdee6..59f65081225 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp index 511402d34db..189fffb985d 100644 --- a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp index 022c2efcbad..a0e583a308f 100644 --- a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp b/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp index d8256300b58..c0653de3d5b 100644 --- a/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp b/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp index 4ef6c3d3546..48e62f39982 100644 --- a/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp index 3a6fb77d9a6..e4559758a0a 100644 --- a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp index 5f7e7cc0589..b51d42f51e4 100644 --- a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp index ca57f7d4863..afe5ba8e927 100644 --- a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp index 5a3c01af8f1..b96ab7c6632 100644 --- a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp b/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp index 8bbdcbdcffd..c85c2efb10c 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp index 343458291e6..1ba7774c1c5 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp b/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp index 45bc12ca6fe..863b108592e 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp index ac6f10adb95..b10676acb64 100644 --- a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.hpp b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp index 1ac6416a907..d2ae5db4231 100644 --- a/src/coreComponents/constitutive/permeability/PressurePermeability.hpp +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp b/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp index b0de6d15d8f..fa9b1b5d49c 100644 --- a/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp b/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp index af82be8becc..4d5ac39eb82 100644 --- a/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp index 7873db48ef7..0daa99a4a77 100644 --- a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp index 9c6d6a325a8..2a4e6e6b19b 100644 --- a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp index 7edcbc1b550..35bf742fc14 100644 --- a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp index f92ea293117..a524ca5cc8c 100644 --- a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp index 62c278374b2..c15cc574149 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp index 635e4098e94..584dffca25a 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp index e4df2968770..aecdbe4abcb 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp index e6132c1d2ea..38908ea028a 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp index b84773fb4b2..94af64dd9af 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp index 03cf2e8ed97..a73d7894d54 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp index 2b7fb74fe3d..6918a3de6d9 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp index a044506ba09..00f8f9a5be1 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp index edaf4a48a5c..5944dfa453a 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp index 9db8b526d05..2b91a498afb 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp index 3663125c744..4f4f1622661 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriver.cpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriver.cpp index 3d22f910972..e2d684d74ca 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriver.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriver.hpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriver.hpp index 01cbef32c12..890d453dc9f 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriver.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp index 02bc968c4f8..c46982327aa 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp index 74a4c4e0e4c..6fb6f873dbc 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp index 38cbc3e527e..57efb4ff67a 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverRunTest.hpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriverRunTest.hpp index 38a9b67fc3f..a6fe4f06212 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverRunTest.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriverRunTest.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp index 674eab909f8..b3572d74fe3 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeRunTest.cpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeRunTest.cpp index 6ad567b039b..bfa0ad9c510 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeRunTest.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeRunTest.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp index 361be63b991..3de1845934b 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + #include "RelpermDriverRunTest.hpp" #include "VanGenuchtenBakerRelativePermeability.hpp" diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp index a9bd123e879..4e3ef1fc796 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + #include "RelpermDriverRunTest.hpp" #include "VanGenuchtenStone2RelativePermeability.hpp" diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp index bdfd705a79b..131d71c2baa 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp index 54c0e6a8736..81ebbe2d5a0 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp index ea15c74924e..fbe56c0138c 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp index 1b6ca0123b8..362f687c681 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp index 9f5c69fff14..e55d7886024 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp index f71f03217c3..9b50ca2fdf4 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp index e412e3addaf..2a769a7dbd5 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp index 175fd2721f1..2ac9e4ce0b6 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp index 30759972158..0f61f3528ad 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp index 6d34746887d..2753175bfd7 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/relativePermeability/layouts.hpp b/src/coreComponents/constitutive/relativePermeability/layouts.hpp index 26313873498..16a8c6c2a97 100644 --- a/src/coreComponents/constitutive/relativePermeability/layouts.hpp +++ b/src/coreComponents/constitutive/relativePermeability/layouts.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/CeramicDamage.cpp b/src/coreComponents/constitutive/solid/CeramicDamage.cpp index c3975da55cd..5cb32401d0c 100644 --- a/src/coreComponents/constitutive/solid/CeramicDamage.cpp +++ b/src/coreComponents/constitutive/solid/CeramicDamage.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/CeramicDamage.hpp b/src/coreComponents/constitutive/solid/CeramicDamage.hpp index be1c0db91d4..660360e458f 100644 --- a/src/coreComponents/constitutive/solid/CeramicDamage.hpp +++ b/src/coreComponents/constitutive/solid/CeramicDamage.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ @@ -29,8 +30,8 @@ * integrated and tracked by this model. */ -#ifndef GEOSX_CONSTITUTIVE_SOLID_KINEMATICDAMAGE_HPP -#define GEOSX_CONSTITUTIVE_SOLID_KINEMATICDAMAGE_HPP +#ifndef GEOS_CONSTITUTIVE_SOLID_KINEMATICDAMAGE_HPP +#define GEOS_CONSTITUTIVE_SOLID_KINEMATICDAMAGE_HPP #include "ElasticIsotropic.hpp" #include "InvariantDecompositions.hpp" @@ -553,4 +554,4 @@ class CeramicDamage : public ElasticIsotropic } /* namespace geos */ -#endif /* GEOSX_CONSTITUTIVE_SOLID_KINEMATICDAMAGE_HPP_ */ +#endif /* GEOS_CONSTITUTIVE_SOLID_KINEMATICDAMAGE_HPP_ */ diff --git a/src/coreComponents/constitutive/solid/CompressibleSolid.cpp b/src/coreComponents/constitutive/solid/CompressibleSolid.cpp index 3a168585f6a..efcad2165f7 100644 --- a/src/coreComponents/constitutive/solid/CompressibleSolid.cpp +++ b/src/coreComponents/constitutive/solid/CompressibleSolid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp index 79b46f7f98e..8a6620186ae 100644 --- a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp +++ b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/CoupledSolid.hpp b/src/coreComponents/constitutive/solid/CoupledSolid.hpp index e871f07e219..84ee74fb11b 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolid.hpp +++ b/src/coreComponents/constitutive/solid/CoupledSolid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp b/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp index a0f970711dd..bc3ae992802 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp +++ b/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp index cea3367d3e6..4b7656e8daa 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp +++ b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/Damage.cpp b/src/coreComponents/constitutive/solid/Damage.cpp index baea6072a5e..cee1a0260e7 100644 --- a/src/coreComponents/constitutive/solid/Damage.cpp +++ b/src/coreComponents/constitutive/solid/Damage.cpp @@ -1,12 +1,12 @@ - /* * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/Damage.hpp b/src/coreComponents/constitutive/solid/Damage.hpp index 8683735f8d8..d8fd9b3cac3 100644 --- a/src/coreComponents/constitutive/solid/Damage.hpp +++ b/src/coreComponents/constitutive/solid/Damage.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/DamageSpectral.cpp b/src/coreComponents/constitutive/solid/DamageSpectral.cpp index f53a857f170..3cf1ca7c7b8 100644 --- a/src/coreComponents/constitutive/solid/DamageSpectral.cpp +++ b/src/coreComponents/constitutive/solid/DamageSpectral.cpp @@ -1,12 +1,12 @@ - /* * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/DamageSpectral.hpp b/src/coreComponents/constitutive/solid/DamageSpectral.hpp index 2f919ac0580..10439797fed 100644 --- a/src/coreComponents/constitutive/solid/DamageSpectral.hpp +++ b/src/coreComponents/constitutive/solid/DamageSpectral.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp b/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp index d7859a0ac57..eb8a32de7a9 100644 --- a/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp +++ b/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -413,6 +414,6 @@ void getTestStress( real64 (& strain)[6], real64 (& stress)[6] ) LvArray::tensorOps::scaledAdd< 6 >( stress, positiveStress, damageFactor ); } -} //namespacegeosx +} //namespacegeos #endif /* GEOS_CONSTITUTIVE_SOLID_DAMAGESPECTRALUTILITIES_HPP_ */ diff --git a/src/coreComponents/constitutive/solid/DamageVolDev.cpp b/src/coreComponents/constitutive/solid/DamageVolDev.cpp index 23035f85f21..eb123a7a73c 100644 --- a/src/coreComponents/constitutive/solid/DamageVolDev.cpp +++ b/src/coreComponents/constitutive/solid/DamageVolDev.cpp @@ -1,12 +1,12 @@ - /* * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/DamageVolDev.hpp b/src/coreComponents/constitutive/solid/DamageVolDev.hpp index 3639b2ccc1f..3db1120707a 100644 --- a/src/coreComponents/constitutive/solid/DamageVolDev.hpp +++ b/src/coreComponents/constitutive/solid/DamageVolDev.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/DelftEgg.cpp b/src/coreComponents/constitutive/solid/DelftEgg.cpp index 9089384081f..5797ca7c1db 100644 --- a/src/coreComponents/constitutive/solid/DelftEgg.cpp +++ b/src/coreComponents/constitutive/solid/DelftEgg.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/DelftEgg.hpp b/src/coreComponents/constitutive/solid/DelftEgg.hpp index 6eb44420301..978933ce0d9 100644 --- a/src/coreComponents/constitutive/solid/DelftEgg.hpp +++ b/src/coreComponents/constitutive/solid/DelftEgg.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp index 0f8a5edd306..fe42be1bb1e 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp index 2e398cc4e73..a69d0b113a0 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp index 9762dfa0be0..0674e48d5ce 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp index eb65ce71d51..98c25a52e48 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/DruckerPrager.cpp b/src/coreComponents/constitutive/solid/DruckerPrager.cpp index cf466aa2103..02c9ca51f7b 100644 --- a/src/coreComponents/constitutive/solid/DruckerPrager.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPrager.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/DruckerPrager.hpp b/src/coreComponents/constitutive/solid/DruckerPrager.hpp index 5f30cd2c94d..2551c3b679c 100644 --- a/src/coreComponents/constitutive/solid/DruckerPrager.hpp +++ b/src/coreComponents/constitutive/solid/DruckerPrager.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp index 560d69504cf..601f4add769 100644 --- a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp b/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp index 4fc4efa0290..465fc8fd262 100644 --- a/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp +++ b/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp b/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp index 0e2a80e0637..c419186830e 100644 --- a/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp +++ b/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp @@ -1,12 +1,12 @@ - /* * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp b/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp index 70e0290ff64..6f2a392191a 100644 --- a/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp +++ b/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp b/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp index 2ed7496e295..eb6ee291755 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp b/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp index a1443372195..bfac7f8c2dd 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp index e7fc2d6e237..120b3018002 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp index b22f1901525..1b911e37f85 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 Total, S.A - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp b/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp index d22f3dbd30a..c1e6572d7f4 100644 --- a/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp b/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp index b74f040ecb8..9197da0d1db 100644 --- a/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp index 7b40296c091..2aacdfd5f49 100644 --- a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp index b4aae986e2d..87e55a0acb9 100644 --- a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp b/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp index 6e578c9f83c..0d833f0e514 100644 --- a/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp +++ b/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp index 37368134856..7e1f8d8495f 100644 --- a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp +++ b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp b/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp index a440b1ce6d6..1d537829c7c 100644 --- a/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp +++ b/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp b/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp index 33ae57cbfeb..e37da9ce328 100644 --- a/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp +++ b/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp b/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp index 82b0db7c721..ecd19e68df1 100644 --- a/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp +++ b/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ @@ -16,8 +17,8 @@ * @file PerfectlyPlastic.hpp */ -#ifndef GEOSX_CONSTITUTIVE_SOLID_PERFECTLYPLASTIC_HPP -#define GEOSX_CONSTITUTIVE_SOLID_PERFECTLYPLASTIC_HPP +#ifndef GEOS_CONSTITUTIVE_SOLID_PERFECTLYPLASTIC_HPP +#define GEOS_CONSTITUTIVE_SOLID_PERFECTLYPLASTIC_HPP #include "ElasticIsotropic.hpp" #include "InvariantDecompositions.hpp" @@ -337,4 +338,4 @@ class PerfectlyPlastic : public ElasticIsotropic } /* namespace geos */ -#endif /* GEOSX_CONSTITUTIVE_SOLID_PERFECTLYPLASTIC_HPP_ */ +#endif /* GEOS_CONSTITUTIVE_SOLID_PERFECTLYPLASTIC_HPP_ */ diff --git a/src/coreComponents/constitutive/solid/PorousSolid.cpp b/src/coreComponents/constitutive/solid/PorousSolid.cpp index f427e523873..45527e04213 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.cpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/PorousSolid.hpp b/src/coreComponents/constitutive/solid/PorousSolid.hpp index 154f047692c..0d7567bf019 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.hpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/PropertyConversions.hpp b/src/coreComponents/constitutive/solid/PropertyConversions.hpp index 02be2f01bc0..6119995d621 100644 --- a/src/coreComponents/constitutive/solid/PropertyConversions.hpp +++ b/src/coreComponents/constitutive/solid/PropertyConversions.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/ProppantSolid.cpp b/src/coreComponents/constitutive/solid/ProppantSolid.cpp index 8a1905da4d2..975da1852d5 100644 --- a/src/coreComponents/constitutive/solid/ProppantSolid.cpp +++ b/src/coreComponents/constitutive/solid/ProppantSolid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/ProppantSolid.hpp b/src/coreComponents/constitutive/solid/ProppantSolid.hpp index 345cd0a6b03..394ecd9083b 100644 --- a/src/coreComponents/constitutive/solid/ProppantSolid.hpp +++ b/src/coreComponents/constitutive/solid/ProppantSolid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/SolidBase.cpp b/src/coreComponents/constitutive/solid/SolidBase.cpp index 88f8c097741..41ac8776c4b 100644 --- a/src/coreComponents/constitutive/solid/SolidBase.cpp +++ b/src/coreComponents/constitutive/solid/SolidBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/SolidBase.hpp b/src/coreComponents/constitutive/solid/SolidBase.hpp index 59010fd1d51..54c281731f4 100644 --- a/src/coreComponents/constitutive/solid/SolidBase.hpp +++ b/src/coreComponents/constitutive/solid/SolidBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp b/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp index 30ac96a62d6..da98b275657 100644 --- a/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp +++ b/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp b/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp index 8457722f19c..e257cdb6ff2 100644 --- a/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp +++ b/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp index 3a889e5aa48..47be2037a9f 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp index 05121655899..dbf1ca64346 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp index 16c5f7d0253..8532358c494 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp index 7929df465de..9b117a096c2 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp index f9a3eb655d7..9424a68460d 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/solid/SolidUtilities.hpp b/src/coreComponents/constitutive/solid/SolidUtilities.hpp index c7b79e8d121..045e1b92269 100644 --- a/src/coreComponents/constitutive/solid/SolidUtilities.hpp +++ b/src/coreComponents/constitutive/solid/SolidUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/TriaxialDriver.cpp b/src/coreComponents/constitutive/solid/TriaxialDriver.cpp index 26646693f50..5d345e6986f 100644 --- a/src/coreComponents/constitutive/solid/TriaxialDriver.cpp +++ b/src/coreComponents/constitutive/solid/TriaxialDriver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/TriaxialDriver.hpp b/src/coreComponents/constitutive/solid/TriaxialDriver.hpp index 51ef0e19a68..73e4957a13a 100644 --- a/src/coreComponents/constitutive/solid/TriaxialDriver.hpp +++ b/src/coreComponents/constitutive/solid/TriaxialDriver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp index 293a4d2ec88..d949fa07e8c 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp index dbc0aa3cbe2..39f04818ef9 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp b/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp index 174dddec809..f700fa7c4f3 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp index 6bc53305c7f..2fff8f32b8f 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp b/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp index 98d2a82e339..84509da2768 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp index 37f50525dcd..5626e2dccc6 100644 --- a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp index 4dde76aa833..e526543a72b 100644 --- a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp index 378b7e11854..48e9875761f 100644 --- a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp index ec39cda56ef..a9114db79d1 100644 --- a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp index d1bfbeafffc..cb0f118fe49 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp index 8b3dcfe28a7..1ece6881d5b 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp index 3481de3d8c6..1e99c0a29b1 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp index 005b1e16cca..77b7543c810 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp index eeec60a2797..eddb8f90168 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp index 98dbfb63bae..28e9fd85607 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp index da016b4a865..a4cfebf897e 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp index e240ef2c220..5a03ec9165e 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp index 6077290957e..235e7bf528f 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp index be4cd7e4462..214e386db88 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp index fd1c97d5382..1a2b3db708d 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp index 9d58fd04268..cccc537dc99 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp index e996e05b5b0..b785e73e331 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp index 4373503be8c..7131e53bf94 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp b/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp index 661a3ad7f37..23772a447f6 100644 --- a/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/TestFluid.hpp b/src/coreComponents/constitutive/unitTests/TestFluid.hpp index 90779c04560..5713310cbec 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluid.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluid.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp b/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp index c608334e028..822a8a25070 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp index 6fae07ef3bb..9c3c2fbcfc4 100644 --- a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp +++ b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp index 320e1a4b085..386d015f5d1 100644 --- a/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp +++ b/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp b/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp index 82309e58aec..405e6bcf22e 100644 --- a/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp +++ b/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp b/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp index 4e955ca3d7d..34b8ffe29e9 100644 --- a/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp +++ b/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include #include #include diff --git a/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp b/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp index 694d5fc69b5..bb7fdc39241 100644 --- a/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp +++ b/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp b/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp index aa2d86fe2f4..667c8ddd66c 100644 --- a/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp +++ b/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp index 5e044d04ea2..f9de4dbf948 100644 --- a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp +++ b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp index 3d878664e63..1d332dd2e62 100644 --- a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp b/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp index cd32f4f46eb..8aceabd8b9b 100644 --- a/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp +++ b/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 Total, S.A - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp index 1d99f30cafa..28ac0c4714b 100644 --- a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp index 5f70782df7f..bbf24832e94 100644 --- a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp b/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp index 629646c45e0..140c71e6745 100644 --- a/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp +++ b/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp b/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp index 1f5447e66f3..817b541d970 100644 --- a/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp +++ b/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp b/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp index 0b7f3230735..7a58389669d 100644 --- a/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp +++ b/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp index df5e3d9abeb..f0d0d6c2161 100644 --- a/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp index 6ccca148aa5..b36366f9261 100644 --- a/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/constitutive/unitTests/testTriaxial.cpp b/src/coreComponents/constitutive/unitTests/testTriaxial.cpp index 22aa43009b3..6cdc9f64237 100644 --- a/src/coreComponents/constitutive/unitTests/testTriaxial.cpp +++ b/src/coreComponents/constitutive/unitTests/testTriaxial.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 Total, S.A - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/dataRepository/BufferOps.hpp b/src/coreComponents/dataRepository/BufferOps.hpp index 041b97cc687..5b460851747 100644 --- a/src/coreComponents/dataRepository/BufferOps.hpp +++ b/src/coreComponents/dataRepository/BufferOps.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -625,7 +626,7 @@ PackSize( VARPACK && ... pack ) return Pack< false >( junk, pack ... ); } -#ifdef GEOSX_USE_ARRAY_BOUNDS_CHECK +#ifdef GEOS_USE_ARRAY_BOUNDS_CHECK //------------------------------------------------------------------------------ template< bool DO_PACKING, typename T, typename T_INDICES > typename std::enable_if< !is_packable_by_index< T > && @@ -662,7 +663,7 @@ Unpack( buffer_unit_type const * & buffer, arraySlice1d< INDEX_TYPE > const & indices, INDEX_TYPE & length ); -#endif /* GEOSX_USE_ARRAY_BOUNDS_CHECK */ +#endif /* GEOS_USE_ARRAY_BOUNDS_CHECK */ } /* namespace bufferOps */ } /* namespace geos */ diff --git a/src/coreComponents/dataRepository/BufferOpsDevice.cpp b/src/coreComponents/dataRepository/BufferOpsDevice.cpp index e1e0462f645..b6215d3ea62 100644 --- a/src/coreComponents/dataRepository/BufferOpsDevice.cpp +++ b/src/coreComponents/dataRepository/BufferOpsDevice.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/BufferOpsDevice.hpp b/src/coreComponents/dataRepository/BufferOpsDevice.hpp index 8d647ca8322..12abafac593 100644 --- a/src/coreComponents/dataRepository/BufferOpsDevice.hpp +++ b/src/coreComponents/dataRepository/BufferOpsDevice.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/BufferOps_inline.hpp b/src/coreComponents/dataRepository/BufferOps_inline.hpp index f1f0553823b..961d3173f38 100644 --- a/src/coreComponents/dataRepository/BufferOps_inline.hpp +++ b/src/coreComponents/dataRepository/BufferOps_inline.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -642,7 +643,7 @@ localIndex Unpack( buffer_unit_type const * & buffer, return sizeOfUnpackedChars; } -#ifdef GEOSX_USE_ARRAY_BOUNDS_CHECK +#ifdef GEOS_USE_ARRAY_BOUNDS_CHECK template< bool DO_PACKING, typename T, typename INDEX_TYPE > typename std::enable_if< !std::is_trivial< T >::value, localIndex >::type @@ -741,7 +742,7 @@ Unpack( buffer_unit_type const * & buffer, return sizeOfUnpackedChars; } -#endif /* GEOSX_USE_ARRAY_BOUNDS_CHECK */ +#endif /* GEOS_USE_ARRAY_BOUNDS_CHECK */ template< bool DO_PACKING, int USD > localIndex Pack( buffer_unit_type * & buffer, diff --git a/src/coreComponents/dataRepository/CMakeLists.txt b/src/coreComponents/dataRepository/CMakeLists.txt index 1b882eb42e5..bfaecd6d778 100644 --- a/src/coreComponents/dataRepository/CMakeLists.txt +++ b/src/coreComponents/dataRepository/CMakeLists.txt @@ -55,7 +55,7 @@ blt_add_library( NAME dataRepository SOURCES ${dataRepository_sources} HEADERS ${dataRepository_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} ) + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( dataRepository PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/dataRepository/ConduitRestart.cpp b/src/coreComponents/dataRepository/ConduitRestart.cpp index c569afd80cd..64e5e9e2bb3 100644 --- a/src/coreComponents/dataRepository/ConduitRestart.cpp +++ b/src/coreComponents/dataRepository/ConduitRestart.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/ConduitRestart.hpp b/src/coreComponents/dataRepository/ConduitRestart.hpp index feb6ab216ca..d853c84a2df 100644 --- a/src/coreComponents/dataRepository/ConduitRestart.hpp +++ b/src/coreComponents/dataRepository/ConduitRestart.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/DataContext.cpp b/src/coreComponents/dataRepository/DataContext.cpp index 8ddf77b3e94..fc8ebe9d9ee 100644 --- a/src/coreComponents/dataRepository/DataContext.cpp +++ b/src/coreComponents/dataRepository/DataContext.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index aaf4f938d85..99893bc77f7 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/DefaultValue.hpp b/src/coreComponents/dataRepository/DefaultValue.hpp index c0d94c182c0..c5d5f3d21f4 100644 --- a/src/coreComponents/dataRepository/DefaultValue.hpp +++ b/src/coreComponents/dataRepository/DefaultValue.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/ExecutableGroup.cpp b/src/coreComponents/dataRepository/ExecutableGroup.cpp index 22658578d44..a43b45a4280 100644 --- a/src/coreComponents/dataRepository/ExecutableGroup.cpp +++ b/src/coreComponents/dataRepository/ExecutableGroup.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/ExecutableGroup.hpp b/src/coreComponents/dataRepository/ExecutableGroup.hpp index 69fa86db55b..ae183dd5d80 100644 --- a/src/coreComponents/dataRepository/ExecutableGroup.hpp +++ b/src/coreComponents/dataRepository/ExecutableGroup.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index a6cc0126a8e..dccbc2441f8 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -19,7 +20,7 @@ #include "codingUtilities/Utilities.hpp" #include "common/TimingMacros.hpp" #include "GroupContext.hpp" -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) #include "python/PyGroupType.hpp" #endif @@ -705,7 +706,7 @@ localIndex Group::getSubGroupIndex( keyType const & key ) const return getSubGroups().getIndex( key ); } -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) PyTypeObject * Group::getPythonType() const { return geos::python::getPyGroupType(); } #endif diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index 3361848d7a4..b6d6ff08cfd 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -1491,7 +1492,7 @@ class Group * @brief Return PyGroup type. * @return Return PyGroup type. */ -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) virtual PyTypeObject * getPythonType() const; #endif diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index 3f63d2d92aa..1312cab5f32 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/GroupContext.hpp b/src/coreComponents/dataRepository/GroupContext.hpp index 327f00f5251..f29238660e0 100644 --- a/src/coreComponents/dataRepository/GroupContext.hpp +++ b/src/coreComponents/dataRepository/GroupContext.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/HistoryDataSpec.hpp b/src/coreComponents/dataRepository/HistoryDataSpec.hpp index 098f5c24fce..01930b3e935 100644 --- a/src/coreComponents/dataRepository/HistoryDataSpec.hpp +++ b/src/coreComponents/dataRepository/HistoryDataSpec.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/dataRepository/InputFlags.hpp b/src/coreComponents/dataRepository/InputFlags.hpp index c48d0162c65..f40d868a278 100644 --- a/src/coreComponents/dataRepository/InputFlags.hpp +++ b/src/coreComponents/dataRepository/InputFlags.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/KeyIndexT.hpp b/src/coreComponents/dataRepository/KeyIndexT.hpp index 6d56de608af..b5dbb501bc2 100644 --- a/src/coreComponents/dataRepository/KeyIndexT.hpp +++ b/src/coreComponents/dataRepository/KeyIndexT.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/KeyNames.hpp b/src/coreComponents/dataRepository/KeyNames.hpp index 082b6db81fc..78efdd84762 100644 --- a/src/coreComponents/dataRepository/KeyNames.hpp +++ b/src/coreComponents/dataRepository/KeyNames.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/MappedVector.hpp b/src/coreComponents/dataRepository/MappedVector.hpp index 0de9284e815..a10c1d93870 100644 --- a/src/coreComponents/dataRepository/MappedVector.hpp +++ b/src/coreComponents/dataRepository/MappedVector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/ObjectCatalog.hpp b/src/coreComponents/dataRepository/ObjectCatalog.hpp index bc74ffd9b72..399f4270a4a 100644 --- a/src/coreComponents/dataRepository/ObjectCatalog.hpp +++ b/src/coreComponents/dataRepository/ObjectCatalog.hpp @@ -1,19 +1,21 @@ -#ifndef GEOS_DATAREPOSITORY_OBJECTCATALOG_HPP_ -#define GEOS_DATAREPOSITORY_OBJECTCATALOG_HPP_ /* * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ +#ifndef GEOS_DATAREPOSITORY_OBJECTCATALOG_HPP_ +#define GEOS_DATAREPOSITORY_OBJECTCATALOG_HPP_ + /** * @file ObjectCatalog.hpp * The ObjectCatalog acts as a statically initialized factory. It functions in diff --git a/src/coreComponents/dataRepository/ReferenceWrapper.hpp b/src/coreComponents/dataRepository/ReferenceWrapper.hpp index 76fedb42f2a..930710ef6d1 100644 --- a/src/coreComponents/dataRepository/ReferenceWrapper.hpp +++ b/src/coreComponents/dataRepository/ReferenceWrapper.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/RestartFlags.hpp b/src/coreComponents/dataRepository/RestartFlags.hpp index caea13b7c5b..a37b98f038f 100644 --- a/src/coreComponents/dataRepository/RestartFlags.hpp +++ b/src/coreComponents/dataRepository/RestartFlags.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/Utilities.cpp b/src/coreComponents/dataRepository/Utilities.cpp index 2794be33c2f..6908a4b4525 100644 --- a/src/coreComponents/dataRepository/Utilities.cpp +++ b/src/coreComponents/dataRepository/Utilities.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/Utilities.hpp b/src/coreComponents/dataRepository/Utilities.hpp index bb7bdc766b9..18ab6cc9c0c 100644 --- a/src/coreComponents/dataRepository/Utilities.hpp +++ b/src/coreComponents/dataRepository/Utilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/Wrapper.hpp b/src/coreComponents/dataRepository/Wrapper.hpp index b3193af0ee5..d3a5255a4d1 100644 --- a/src/coreComponents/dataRepository/Wrapper.hpp +++ b/src/coreComponents/dataRepository/Wrapper.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -940,7 +941,7 @@ class Wrapper final : public WrapperBase // void tvTemplateInstantiation(); #endif -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) virtual PyObject * createPythonObject( ) override { return wrapperHelpers::createPythonObject( reference() ); } #endif diff --git a/src/coreComponents/dataRepository/WrapperBase.cpp b/src/coreComponents/dataRepository/WrapperBase.cpp index d1d660754d0..0c1aa286d06 100644 --- a/src/coreComponents/dataRepository/WrapperBase.cpp +++ b/src/coreComponents/dataRepository/WrapperBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/WrapperBase.hpp b/src/coreComponents/dataRepository/WrapperBase.hpp index d44e24c2e6b..dfc4baa69a1 100644 --- a/src/coreComponents/dataRepository/WrapperBase.hpp +++ b/src/coreComponents/dataRepository/WrapperBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -26,7 +27,7 @@ #include "HistoryDataSpec.hpp" #include "DataContext.hpp" -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) #include "LvArray/src/python/python.hpp" #endif @@ -653,7 +654,7 @@ class WrapperBase // static int TV_ttf_display_type( const WrapperBase * wrapper); #endif -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) /** * @brief Return a Python object representing the wrapped object. * @return A Python object representing the wrapped object. diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index b9aa00ff731..71a2d5259da 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/WrapperContext.hpp b/src/coreComponents/dataRepository/WrapperContext.hpp index d948a0334b9..cf12d1ba166 100644 --- a/src/coreComponents/dataRepository/WrapperContext.hpp +++ b/src/coreComponents/dataRepository/WrapperContext.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/python/PyGroup.cpp b/src/coreComponents/dataRepository/python/PyGroup.cpp index aa84c8e4019..2a822d7d303 100644 --- a/src/coreComponents/dataRepository/python/PyGroup.cpp +++ b/src/coreComponents/dataRepository/python/PyGroup.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/dataRepository/python/PyGroup.hpp b/src/coreComponents/dataRepository/python/PyGroup.hpp index f93efe62800..57b51ffef9f 100644 --- a/src/coreComponents/dataRepository/python/PyGroup.hpp +++ b/src/coreComponents/dataRepository/python/PyGroup.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/dataRepository/python/PyGroupType.hpp b/src/coreComponents/dataRepository/python/PyGroupType.hpp index b620ed71673..ce19e5be4f0 100644 --- a/src/coreComponents/dataRepository/python/PyGroupType.hpp +++ b/src/coreComponents/dataRepository/python/PyGroupType.hpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #ifndef GEOS_PYTHON_PYGROUPTYPE_HPP_ #define GEOS_PYTHON_PYGROUPTYPE_HPP_ diff --git a/src/coreComponents/dataRepository/python/PyWrapper.cpp b/src/coreComponents/dataRepository/python/PyWrapper.cpp index d6537e095b7..0e986d3814b 100644 --- a/src/coreComponents/dataRepository/python/PyWrapper.cpp +++ b/src/coreComponents/dataRepository/python/PyWrapper.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/dataRepository/python/PyWrapper.hpp b/src/coreComponents/dataRepository/python/PyWrapper.hpp index 2e9dc9bdb8c..8350df82bc5 100644 --- a/src/coreComponents/dataRepository/python/PyWrapper.hpp +++ b/src/coreComponents/dataRepository/python/PyWrapper.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp index f84b83bc709..434124f1c79 100644 --- a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp +++ b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp b/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp index 345a6da8b2e..0befe6db35b 100644 --- a/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp +++ b/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/unitTests/testPacking.cpp b/src/coreComponents/dataRepository/unitTests/testPacking.cpp index fdeafa80c27..890d6a7e60f 100644 --- a/src/coreComponents/dataRepository/unitTests/testPacking.cpp +++ b/src/coreComponents/dataRepository/unitTests/testPacking.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp b/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp index 451ce094d49..718cf1a5de4 100644 --- a/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp +++ b/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/unitTests/testWrapper.cpp b/src/coreComponents/dataRepository/unitTests/testWrapper.cpp index 517615afe2d..6384491af9e 100644 --- a/src/coreComponents/dataRepository/unitTests/testWrapper.cpp +++ b/src/coreComponents/dataRepository/unitTests/testWrapper.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp b/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp index 87ac3a888d6..105c4bccac9 100644 --- a/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp +++ b/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/wrapperHelpers.hpp b/src/coreComponents/dataRepository/wrapperHelpers.hpp index b5a0c385050..70af42750e0 100644 --- a/src/coreComponents/dataRepository/wrapperHelpers.hpp +++ b/src/coreComponents/dataRepository/wrapperHelpers.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -33,7 +34,7 @@ #include "common/Span.hpp" #include "codingUtilities/traits.hpp" -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) #include "LvArray/src/python/python.hpp" #endif @@ -825,7 +826,7 @@ UnpackDataByIndexDevice( buffer_unit_type const * &, T const &, IDX &, parallelD return 0; } -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) template< typename T > inline std::enable_if_t< LvArray::python::CanCreate< T >, PyObject * > diff --git a/src/coreComponents/dataRepository/xmlWrapper.cpp b/src/coreComponents/dataRepository/xmlWrapper.cpp index 29f80e4bf43..73fc7ad410b 100644 --- a/src/coreComponents/dataRepository/xmlWrapper.cpp +++ b/src/coreComponents/dataRepository/xmlWrapper.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dataRepository/xmlWrapper.hpp b/src/coreComponents/dataRepository/xmlWrapper.hpp index 1e5961c1ae5..04a27502343 100644 --- a/src/coreComponents/dataRepository/xmlWrapper.hpp +++ b/src/coreComponents/dataRepository/xmlWrapper.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt index 3edb50f95d5..791767bc5c6 100644 --- a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt +++ b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt @@ -14,7 +14,7 @@ blt_add_library( NAME denseLinearAlgebra SOURCES ${denseLinearAlgebra_sources} HEADERS ${denseLinearAlgebra_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} ) + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( denseLinearAlgebra PUBLIC ${CMAKE_CURRENT_LIST_DIR} ) diff --git a/src/coreComponents/denseLinearAlgebra/common/layouts.hpp b/src/coreComponents/denseLinearAlgebra/common/layouts.hpp index 193a9183b78..b5c6ce39eef 100644 --- a/src/coreComponents/denseLinearAlgebra/common/layouts.hpp +++ b/src/coreComponents/denseLinearAlgebra/common/layouts.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h index fe66dcfc2ce..d427d81e238 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp index 541a802861b..4f5f5dc9001 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -24,7 +25,7 @@ #include -// Put everything under the geosx namespace. +// Put everything under the geos namespace. namespace geos { @@ -1115,4 +1116,4 @@ void BlasLapackLA::matrixLeastSquaresSolutionSolve( arraySlice2d< real64 const, detail::matrixLeastSquaresSolutionSolve( ACOPY.toSlice(), BCOPY.toSlice(), X ); } -} // end geosx namespace +} // end geos namespace diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp index 488ed59a9b9..3e626119a13 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp index d819072172a..42f98d6c2a0 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp index 48cf7b65dc8..343bb7e2d5d 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/discretizationMethods/CMakeLists.txt b/src/coreComponents/discretizationMethods/CMakeLists.txt index e038df90710..220d535ab28 100644 --- a/src/coreComponents/discretizationMethods/CMakeLists.txt +++ b/src/coreComponents/discretizationMethods/CMakeLists.txt @@ -17,7 +17,7 @@ blt_add_library( NAME discretizationMethods SOURCES ${mainInterface_sources} HEADERS ${mainInterface_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( discretizationMethods PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp b/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp index 3de9232d7f0..9a14cced080 100644 --- a/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp +++ b/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp b/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp index 7022ea36110..311358874ff 100644 --- a/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp +++ b/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/dummy.cpp b/src/coreComponents/dummy.cpp index abf992adfe6..6bd5eb6f17d 100644 --- a/src/coreComponents/dummy.cpp +++ b/src/coreComponents/dummy.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/events/CMakeLists.txt b/src/coreComponents/events/CMakeLists.txt index 8e87a2f62c6..59217e42f7d 100644 --- a/src/coreComponents/events/CMakeLists.txt +++ b/src/coreComponents/events/CMakeLists.txt @@ -30,7 +30,7 @@ blt_add_library( NAME events SOURCES ${events_sources} HEADERS ${events_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( events PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/events/EventBase.cpp b/src/coreComponents/events/EventBase.cpp index 93059a355a4..a6ca2e8f004 100644 --- a/src/coreComponents/events/EventBase.cpp +++ b/src/coreComponents/events/EventBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/events/EventBase.hpp b/src/coreComponents/events/EventBase.hpp index 27a29dea5bc..fdcd3c72a08 100644 --- a/src/coreComponents/events/EventBase.hpp +++ b/src/coreComponents/events/EventBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/events/EventManager.cpp b/src/coreComponents/events/EventManager.cpp index 33f02a151c5..5eb161801ca 100644 --- a/src/coreComponents/events/EventManager.cpp +++ b/src/coreComponents/events/EventManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -162,7 +163,7 @@ bool EventManager::run( DomainPartition & domain ) } m_currentSubEvent = 0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI // Find the min dt across processes real64 dt_global; MPI_Allreduce( &m_dt, &dt_global, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_GEOSX ); diff --git a/src/coreComponents/events/EventManager.hpp b/src/coreComponents/events/EventManager.hpp index c839346d19a..b541efe6b58 100644 --- a/src/coreComponents/events/EventManager.hpp +++ b/src/coreComponents/events/EventManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/events/HaltEvent.cpp b/src/coreComponents/events/HaltEvent.cpp index a604b59c159..5286740d90f 100644 --- a/src/coreComponents/events/HaltEvent.cpp +++ b/src/coreComponents/events/HaltEvent.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -65,7 +66,7 @@ void HaltEvent::estimateEventTiming( real64 const GEOS_UNUSED_PARAM( time ), // The timing for the ranks may differ slightly, so synchronize // TODO: Only do the communication when you are close to the end? -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI integer forecast_global; MPI_Allreduce( &forecast, &forecast_global, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD ); forecast = forecast_global; diff --git a/src/coreComponents/events/HaltEvent.hpp b/src/coreComponents/events/HaltEvent.hpp index b9c05281ac3..98ae88e3540 100644 --- a/src/coreComponents/events/HaltEvent.hpp +++ b/src/coreComponents/events/HaltEvent.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/events/PeriodicEvent.cpp b/src/coreComponents/events/PeriodicEvent.cpp index 7c857fd79f6..2ead548c7aa 100644 --- a/src/coreComponents/events/PeriodicEvent.cpp +++ b/src/coreComponents/events/PeriodicEvent.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -171,7 +172,7 @@ void PeriodicEvent::checkOptionalFunctionThreshold( real64 const time, // Because the function applied to an object may differ by rank, synchronize // (Note: this shouldn't occur very often, since it is only called if the base forecast <= 0) -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI real64 result_global; switch( m_functionStatOption ) { diff --git a/src/coreComponents/events/PeriodicEvent.hpp b/src/coreComponents/events/PeriodicEvent.hpp index e6db372eb35..d7d2f996838 100644 --- a/src/coreComponents/events/PeriodicEvent.hpp +++ b/src/coreComponents/events/PeriodicEvent.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/events/SoloEvent.cpp b/src/coreComponents/events/SoloEvent.cpp index 3894ff6447f..e7ef26e0771 100644 --- a/src/coreComponents/events/SoloEvent.cpp +++ b/src/coreComponents/events/SoloEvent.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/events/SoloEvent.hpp b/src/coreComponents/events/SoloEvent.hpp index b636df1eba6..8fb67c00966 100644 --- a/src/coreComponents/events/SoloEvent.hpp +++ b/src/coreComponents/events/SoloEvent.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/events/tasks/TaskBase.cpp b/src/coreComponents/events/tasks/TaskBase.cpp index 57925adde85..fa81594d6e3 100644 --- a/src/coreComponents/events/tasks/TaskBase.cpp +++ b/src/coreComponents/events/tasks/TaskBase.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/events/tasks/TaskBase.hpp b/src/coreComponents/events/tasks/TaskBase.hpp index 107c8e35e3b..7e4f4d5b02f 100644 --- a/src/coreComponents/events/tasks/TaskBase.hpp +++ b/src/coreComponents/events/tasks/TaskBase.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/events/tasks/TasksManager.cpp b/src/coreComponents/events/tasks/TasksManager.cpp index 133e5bc9987..851a6fc8e7a 100644 --- a/src/coreComponents/events/tasks/TasksManager.cpp +++ b/src/coreComponents/events/tasks/TasksManager.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/events/tasks/TasksManager.hpp b/src/coreComponents/events/tasks/TasksManager.hpp index d47237b40cc..8b052585e72 100644 --- a/src/coreComponents/events/tasks/TasksManager.hpp +++ b/src/coreComponents/events/tasks/TasksManager.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp index 678d33eb4de..5eeccb0f095 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp index a091adb10fc..0e7a21f9603 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/CMakeLists.txt b/src/coreComponents/fieldSpecification/CMakeLists.txt index ae31a4157fc..e88c53b708a 100644 --- a/src/coreComponents/fieldSpecification/CMakeLists.txt +++ b/src/coreComponents/fieldSpecification/CMakeLists.txt @@ -34,7 +34,7 @@ blt_add_library( NAME fieldSpecification SOURCES ${fieldSpecification_sources} HEADERS ${fieldSpecification_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( fieldSpecification PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp index 81fd8b4f32c..4aaaf2c83c4 100644 --- a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp index b838fcaa171..0884672d294 100644 --- a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp index 714c1db4bcf..5a08bfa5347 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp index e39f27dd65e..f9e53715558 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp index 09f92109054..dd6444dcddd 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp index 49a49f0a081..b76ec17f808 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp index f1b8d2df8d1..e284099013e 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp index 65f95ec70ce..9e1fcc59390 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp index b6fcc965f2e..193fb636d17 100644 --- a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp +++ b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp index 738037bdf5f..f0f67dd00d3 100644 --- a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp +++ b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp index 53007480a30..720e015ea1d 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp index 804b14f8559..bb1cbeaa899 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp b/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp index 2589337fea6..fd9826952a5 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp +++ b/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp b/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp index f46c9d1587c..e8ccc6d44f4 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp +++ b/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp index 4c9e0b17596..ac644adbc79 100644 --- a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp index 3f838c263f0..e1ba3890d7c 100644 --- a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/CMakeLists.txt b/src/coreComponents/fileIO/CMakeLists.txt index 0ab719a5749..41467c67358 100644 --- a/src/coreComponents/fileIO/CMakeLists.txt +++ b/src/coreComponents/fileIO/CMakeLists.txt @@ -89,7 +89,7 @@ blt_add_library( NAME fileIO SOURCES ${fileIO_sources} HEADERS ${fileIO_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} ) + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( fileIO PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp b/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp index fce0d9f4eab..aecbf821a58 100644 --- a/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp b/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp index 4c4a26c52fd..d45c7c638d0 100644 --- a/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/ChomboIO.cpp b/src/coreComponents/fileIO/Outputs/ChomboIO.cpp index ffabfe63b05..bc3de58385f 100644 --- a/src/coreComponents/fileIO/Outputs/ChomboIO.cpp +++ b/src/coreComponents/fileIO/Outputs/ChomboIO.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -40,7 +41,7 @@ ChomboIO::ChomboIO( string const & name, Group * const parent ): { registerWrapper( viewKeyStruct::outputPathString(), &m_outputPath ). setInputFlag( InputFlags::REQUIRED ). - setDescription( "Path at which the geosx to chombo file will be written." ); + setDescription( "Path at which the geos to chombo file will be written." ); registerWrapper( viewKeyStruct::beginCycleString(), &m_beginCycle ). setInputFlag( InputFlags::REQUIRED ). @@ -49,17 +50,17 @@ ChomboIO::ChomboIO( string const & name, Group * const parent ): registerWrapper( viewKeyStruct::inputPathString(), &m_inputPath ). setInputFlag( InputFlags::OPTIONAL ). setDefaultValue( "/INVALID_INPUT_PATH" ). - setDescription( "Path at which the chombo to geosx file will be written." ); + setDescription( "Path at which the chombo to geos file will be written." ); registerWrapper( viewKeyStruct::waitForInputString(), &m_waitForInput ). setInputFlag( InputFlags::REQUIRED ). setDefaultValue( 0 ). - setDescription( "True iff geosx should wait for chombo to write out a file. When true the inputPath must be set." ); + setDescription( "True iff geos should wait for chombo to write out a file. When true the inputPath must be set." ); registerWrapper( viewKeyStruct::useChomboPressuresString(), &m_useChomboPressures ). setInputFlag( InputFlags::OPTIONAL ). setDefaultValue( 0 ). - setDescription( "True iff geosx should use the pressures chombo writes out." ); + setDescription( "True iff geos should use the pressures chombo writes out." ); } ChomboIO::~ChomboIO() diff --git a/src/coreComponents/fileIO/Outputs/ChomboIO.hpp b/src/coreComponents/fileIO/Outputs/ChomboIO.hpp index 8af35769f34..d816f2094b1 100644 --- a/src/coreComponents/fileIO/Outputs/ChomboIO.hpp +++ b/src/coreComponents/fileIO/Outputs/ChomboIO.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.cpp b/src/coreComponents/fileIO/Outputs/OutputBase.cpp index 59b3cbb4398..15f170e4fca 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.hpp b/src/coreComponents/fileIO/Outputs/OutputBase.hpp index f6348e77df0..6be32f38d2e 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/OutputManager.cpp b/src/coreComponents/fileIO/Outputs/OutputManager.cpp index bc3fd08d32d..daf034aed81 100644 --- a/src/coreComponents/fileIO/Outputs/OutputManager.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/OutputManager.hpp b/src/coreComponents/fileIO/Outputs/OutputManager.hpp index da03cc8037c..5c0ac6c56b2 100644 --- a/src/coreComponents/fileIO/Outputs/OutputManager.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp b/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp index 96dfea5eea9..71814f162c3 100644 --- a/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp b/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp index 118ef469f94..b7484fc6310 100644 --- a/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/PythonOutput.cpp b/src/coreComponents/fileIO/Outputs/PythonOutput.cpp index 2e3775823c7..cb528036998 100644 --- a/src/coreComponents/fileIO/Outputs/PythonOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/PythonOutput.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/fileIO/Outputs/PythonOutput.hpp b/src/coreComponents/fileIO/Outputs/PythonOutput.hpp index 880deb331ce..c5326f8a044 100644 --- a/src/coreComponents/fileIO/Outputs/PythonOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/PythonOutput.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/fileIO/Outputs/RestartOutput.cpp b/src/coreComponents/fileIO/Outputs/RestartOutput.cpp index 3fa21e052d3..1704ec320bd 100644 --- a/src/coreComponents/fileIO/Outputs/RestartOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/RestartOutput.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/RestartOutput.hpp b/src/coreComponents/fileIO/Outputs/RestartOutput.hpp index e925f10c763..5a728e1b7d6 100644 --- a/src/coreComponents/fileIO/Outputs/RestartOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/RestartOutput.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp index 6c6983e452b..4d257cedf6a 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.hpp b/src/coreComponents/fileIO/Outputs/SiloOutput.hpp index 1121c36c49f..1d736d14af4 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index 6f6daec32cd..ecbd5a3ad8f 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ @@ -16,7 +17,7 @@ #include "fileIO/timeHistory/HDFFile.hpp" -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) #include "fileIO/python/PyHistoryOutputType.hpp" #endif @@ -189,7 +190,7 @@ void TimeHistoryOutput::cleanup( real64 const time_n, } } -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) PyTypeObject * TimeHistoryOutput::getPythonType() const { return python::getPyHistoryOutputType(); } #endif diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp index b5a798d5025..759719bc0d4 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ @@ -109,7 +110,7 @@ class TimeHistoryOutput : public OutputBase * @brief Return PyHistoryOutput type. * @return Return PyHistoryOutput type. */ -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) virtual PyTypeObject * getPythonType() const override; #endif diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp index 3ab88e16050..397e8c9e7d4 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -19,7 +20,7 @@ #include "VTKOutput.hpp" -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) #include "fileIO/python/PyVTKOutputType.hpp" #endif @@ -157,7 +158,7 @@ bool VTKOutput::execute( real64 const time_n, return false; } -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) PyTypeObject * VTKOutput::getPythonType() const { return python::getPyVTKOutputType(); diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp index 76f31924ceb..afc490548fd 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -103,7 +104,7 @@ class VTKOutput : public OutputBase * @brief Return PyVTKOutput type. * @return Return PyVTKOutput type. */ -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) virtual PyTypeObject * getPythonType() const override; #endif diff --git a/src/coreComponents/fileIO/Table/TableData.cpp b/src/coreComponents/fileIO/Table/TableData.cpp index 2dbf7dfbe18..c4af2bce74a 100644 --- a/src/coreComponents/fileIO/Table/TableData.cpp +++ b/src/coreComponents/fileIO/Table/TableData.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Table/TableData.hpp b/src/coreComponents/fileIO/Table/TableData.hpp index a3cf6a16d5c..67ce37cafb3 100644 --- a/src/coreComponents/fileIO/Table/TableData.hpp +++ b/src/coreComponents/fileIO/Table/TableData.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Table/TableFormatter.cpp b/src/coreComponents/fileIO/Table/TableFormatter.cpp index d49204653d8..8d564e83ce5 100644 --- a/src/coreComponents/fileIO/Table/TableFormatter.cpp +++ b/src/coreComponents/fileIO/Table/TableFormatter.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Table/TableFormatter.hpp b/src/coreComponents/fileIO/Table/TableFormatter.hpp index 1e18452b562..b06a136e687 100644 --- a/src/coreComponents/fileIO/Table/TableFormatter.hpp +++ b/src/coreComponents/fileIO/Table/TableFormatter.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Table/TableLayout.cpp b/src/coreComponents/fileIO/Table/TableLayout.cpp index 726a92eab36..b3de6f6b917 100644 --- a/src/coreComponents/fileIO/Table/TableLayout.cpp +++ b/src/coreComponents/fileIO/Table/TableLayout.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Table/TableLayout.hpp b/src/coreComponents/fileIO/Table/TableLayout.hpp index f19759ae453..9c45c727b22 100644 --- a/src/coreComponents/fileIO/Table/TableLayout.hpp +++ b/src/coreComponents/fileIO/Table/TableLayout.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/Table/unitTests/testTable.cpp b/src/coreComponents/fileIO/Table/unitTests/testTable.cpp index 98dabc25d84..0a5f0194680 100644 --- a/src/coreComponents/fileIO/Table/unitTests/testTable.cpp +++ b/src/coreComponents/fileIO/Table/unitTests/testTable.cpp @@ -1,12 +1,12 @@ - /* * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp b/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp index c4eabd3aa55..9abfa94d556 100644 --- a/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp +++ b/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp b/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp index 68087f8f4fa..248744ece01 100644 --- a/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp +++ b/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/python/PyHistoryCollection.cpp b/src/coreComponents/fileIO/python/PyHistoryCollection.cpp index 67a467bbb46..c4cbaf17c0b 100644 --- a/src/coreComponents/fileIO/python/PyHistoryCollection.cpp +++ b/src/coreComponents/fileIO/python/PyHistoryCollection.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #define PY_SSIZE_T_CLEAN #include diff --git a/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp b/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp index a028282d6a0..92e98d01036 100644 --- a/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp +++ b/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #ifndef GEOS_PYTHON_PYHISTORYCOLLECTIONTYPE_HPP_ #define GEOS_PYTHON_PYHISTORYCOLLECTIONTYPE_HPP_ diff --git a/src/coreComponents/fileIO/python/PyHistoryOutput.cpp b/src/coreComponents/fileIO/python/PyHistoryOutput.cpp index 06c1bbbf167..64d1fdbf5e7 100644 --- a/src/coreComponents/fileIO/python/PyHistoryOutput.cpp +++ b/src/coreComponents/fileIO/python/PyHistoryOutput.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #define PY_SSIZE_T_CLEAN #include diff --git a/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp b/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp index 39f67d8fa44..43f59c56692 100644 --- a/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp +++ b/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #ifndef GEOS_PYTHON_PYHISTORYOUTPUTTYPE_HPP_ #define GEOS_PYTHON_PYHISTORYOUTPUTTYPE_HPP_ diff --git a/src/coreComponents/fileIO/python/PyVTKOutput.cpp b/src/coreComponents/fileIO/python/PyVTKOutput.cpp index ed69e2a937f..03ce7d33a56 100644 --- a/src/coreComponents/fileIO/python/PyVTKOutput.cpp +++ b/src/coreComponents/fileIO/python/PyVTKOutput.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #define PY_SSIZE_T_CLEAN #include diff --git a/src/coreComponents/fileIO/python/PyVTKOutputType.hpp b/src/coreComponents/fileIO/python/PyVTKOutputType.hpp index cc008817a42..274ac593ebc 100644 --- a/src/coreComponents/fileIO/python/PyVTKOutputType.hpp +++ b/src/coreComponents/fileIO/python/PyVTKOutputType.hpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #ifndef GEOS_PYTHON_PYVTKOUTPUTTYPE_HPP_ #define GEOS_PYTHON_PYVTKOUTPUTTYPE_HPP_ diff --git a/src/coreComponents/fileIO/silo/SiloFile.cpp b/src/coreComponents/fileIO/silo/SiloFile.cpp index 85d6eb85542..cb2882bb36f 100644 --- a/src/coreComponents/fileIO/silo/SiloFile.cpp +++ b/src/coreComponents/fileIO/silo/SiloFile.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -46,7 +47,7 @@ -#if !defined(GEOSX_USE_MPI) +#if !defined(GEOS_USE_MPI) int MPI_Comm_size( MPI_Comm, int * size ) { *size=1; return 0; } int MPI_Comm_rank( MPI_Comm, int * rank ) { *rank=1; return 0; } @@ -281,7 +282,7 @@ void SiloFile::makeSiloDirectories() { int rank=0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); #endif @@ -298,7 +299,7 @@ void SiloFile::initialize( int const MPI_PARAM( numGroups ) ) { makeSiloDirectories(); -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI // Ensure all procs agree on numGroups, driver and file_ext m_numGroups = numGroups; #else @@ -346,7 +347,7 @@ void SiloFile::waitForBatonWrite( int const domainNumber, { int rank = 0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); #endif int const groupRank = PMPIO_GroupRank( m_baton, rank ); @@ -380,7 +381,7 @@ void SiloFile::waitForBaton( int const domainNumber, string const & restartFileN { int rank = 0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); #endif int const groupRank = PMPIO_GroupRank( m_baton, rank ); @@ -414,7 +415,7 @@ void SiloFile::handOffBaton() PMPIO_HandOffBaton( m_baton, m_dbFilePtr ); int rank = 0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); #endif if( rank==0 ) @@ -576,7 +577,7 @@ void SiloFile::writeMeshObject( string const & meshName, // write multimesh object int rank = 0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); #endif if( rank == 0 ) @@ -651,7 +652,7 @@ void SiloFile::writeBeamMesh( string const & meshName, //----write multimesh object { int rank = 0; - #ifdef GEOSX_USE_MPI + #ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); #endif if( rank == 0 ) @@ -684,7 +685,7 @@ void SiloFile::writePointMesh( string const & meshName, //----write multimesh object { int rank = 0; - #ifdef GEOSX_USE_MPI + #ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); #endif if( rank == 0 ) @@ -812,7 +813,7 @@ void SiloFile::writeMaterialMapsFullStorage( ElementRegionBase const & elemRegio } // write multimesh object int rank = 0; - #ifdef GEOSX_USE_MPI + #ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); #endif if( rank == 0 ) @@ -1969,7 +1970,7 @@ void SiloFile::writePolygonMeshObject( const string & meshName, // write multimesh object int rank = 0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_WORLD, &rank ); #endif if( rank == 0 ) @@ -2110,7 +2111,7 @@ void SiloFile::writeMultiXXXX( const DBObjectType type, (void)centering; int size = 1; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_size( MPI_COMM_GEOSX, &size ); #endif @@ -2258,7 +2259,7 @@ void SiloFile::writeDataField( string const & meshName, // write multimesh object int rank = 0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); #endif if( rank == 0 ) @@ -2527,7 +2528,7 @@ void SiloFile::writeDataField( string const & meshName, // write multimesh object int rank = 0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); #endif if( rank == 0 ) @@ -2815,7 +2816,7 @@ void SiloFile::writeMaterialDataField( string const & meshName, // write multimesh object int rank = 0; -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); #endif if( rank == 0 ) diff --git a/src/coreComponents/fileIO/silo/SiloFile.hpp b/src/coreComponents/fileIO/silo/SiloFile.hpp index 827cb809511..bd85ff8462a 100644 --- a/src/coreComponents/fileIO/silo/SiloFile.hpp +++ b/src/coreComponents/fileIO/silo/SiloFile.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp b/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp index 0d2d93f2948..d9bcadb79e1 100644 --- a/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp +++ b/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/fileIO/timeHistory/HDFFile.cpp b/src/coreComponents/fileIO/timeHistory/HDFFile.cpp index 6e5030aca0a..dcca4065a8d 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFFile.cpp +++ b/src/coreComponents/fileIO/timeHistory/HDFFile.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/fileIO/timeHistory/HDFFile.hpp b/src/coreComponents/fileIO/timeHistory/HDFFile.hpp index 161db0246b0..d0f16620040 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFFile.hpp +++ b/src/coreComponents/fileIO/timeHistory/HDFFile.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp index 5e9bae2e5a0..0cdcee895ad 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp +++ b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "HDFHistoryIO.hpp" #include "HDFFile.hpp" diff --git a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp index b9bcb7dd7d4..6b873f20427 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp +++ b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp b/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp index 8119db9051b..67264b16051 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp index c5ad121dcc5..9dd9abb200b 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp index b38fc9c4f10..88b910cd6d3 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -17,7 +18,7 @@ #include "HistoryCollection.hpp" -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) #include "fileIO/python/PyHistoryCollectionType.hpp" #endif @@ -60,7 +61,7 @@ class HistoryCollectionBase : public HistoryCollection HistoryCollection & getMetaDataCollector( localIndex metaIdx ) override; -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) /** * @brief Return PyHistoryCollection type. * @return Return PyHistoryCollection type. diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp index 971765e0505..d2302b5a949 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "PackCollection.hpp" namespace geos diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.hpp b/src/coreComponents/fileIO/timeHistory/PackCollection.hpp index 03f3a0cee8a..748dd6876e6 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.hpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp b/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp index a98d2391735..7d0414f2b37 100644 --- a/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp b/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp index b70910af08b..8cf6cf4affe 100644 --- a/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp +++ b/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp index 0ab56717545..f4c8b0ff21d 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -122,11 +123,11 @@ getVtkToGeosxNodeOrdering( ParticleType const particleType ) /** * @brief Provide the local list of nodes or face streams for the corresponding VTK element * - * @param elementType geosx element type + * @param elementType geos element type * @return list of nodes or face streams * - * For geosx element with existing standard VTK element the corresponding list of nodes is provided. - * For Prism7+, the geosx element is converted to VTK_POLYHEDRON. The vtkUnstructuredGrid + * For geos element with existing standard VTK element the corresponding list of nodes is provided. + * For Prism7+, the geos element is converted to VTK_POLYHEDRON. The vtkUnstructuredGrid * stores polyhedron cells as face streams of the following format: * [numberOfCellFaces, * (numberOfPointsOfFace0, pointId0, pointId1, ... ), @@ -358,8 +359,8 @@ getSurface( FaceElementSubRegion const & subRegion, std::vector< int > cellTypes; cellTypes.reserve( subRegion.size() ); - std::unordered_map< localIndex, localIndex > geosx2VTKIndexing; - geosx2VTKIndexing.reserve( subRegion.size() * subRegion.numNodesPerElement() ); + std::unordered_map< localIndex, localIndex > geos2VTKIndexing; + geos2VTKIndexing.reserve( subRegion.size() * subRegion.numNodesPerElement() ); localIndex nodeIndexInVTK = 0; // FaceElementSubRegion being heterogeneous, the size of the connectivity vector may vary for each element. // In order not to allocate a new vector every time, we combine the usage of `clear` and `push_back`. @@ -386,15 +387,15 @@ getSurface( FaceElementSubRegion const & subRegion, connectivity.clear(); for( int const & ordering : vtkOrdering ) { - auto const & VTKIndexPos = geosx2VTKIndexing.find( nodes[ordering] ); - if( VTKIndexPos == geosx2VTKIndexing.end() ) + auto const & VTKIndexPos = geos2VTKIndexing.find( nodes[ordering] ); + if( VTKIndexPos == geos2VTKIndexing.end() ) { - /// If the node is not found in the geosx2VTKIndexing map: - /// 1. we assign the current value of nodeIndexInVTK to this node in the map (geosx2VTKIndexing[nodes[ordering]] = + /// If the node is not found in the geos2VTKIndexing map: + /// 1. we assign the current value of nodeIndexInVTK to this node in the map (geos2VTKIndexing[nodes[ordering]] = /// nodeIndexInVTK++). /// 2. we increment nodeIndexInVTK to ensure the next new node gets a unique index. /// 3. we add this new VTK node index to the connectivity vector (connectivity.push_back). - connectivity.push_back( geosx2VTKIndexing[nodes[ordering]] = nodeIndexInVTK++ ); + connectivity.push_back( geos2VTKIndexing[nodes[ordering]] = nodeIndexInVTK++ ); } else { @@ -407,10 +408,10 @@ getSurface( FaceElementSubRegion const & subRegion, } auto points = vtkSmartPointer< vtkPoints >::New(); - points->SetNumberOfPoints( geosx2VTKIndexing.size() ); + points->SetNumberOfPoints( geos2VTKIndexing.size() ); arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const referencePosition = nodeManager.referencePosition(); - for( auto nodeIndex: geosx2VTKIndexing ) + for( auto nodeIndex: geos2VTKIndexing ) { auto point = referencePosition[nodeIndex.first]; points->SetPoint( nodeIndex.second, point[0], point[1], point[2] ); @@ -547,7 +548,7 @@ getVtkCells( CellElementRegion const & region, std::vector< int > const vtkOrdering = getVtkConnectivity( subRegion.getElementType(), subRegionNumNodes ); localIndex const numVtkData = vtkOrdering.size(); - // For all geosx element, the corresponding VTK data are copied in "connectivity". + // For all geos element, the corresponding VTK data are copied in "connectivity". // Local nodes are mapped to global indices. Any negative value in "vtkOrdering" // corresponds to the number of faces or the number of nodes per faces, and they // are copied as positive values. diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp index a70107b2699..7ddc67d730c 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp b/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp index b37ad3d79e1..6ccbfd3f3e2 100644 --- a/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp +++ b/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp b/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp index 3eede3f1cfe..46d0a7862c7 100644 --- a/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp +++ b/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/BilinearFormUtilities.hpp b/src/coreComponents/finiteElement/BilinearFormUtilities.hpp index a236b4a54df..b613ee9b88a 100644 --- a/src/coreComponents/finiteElement/BilinearFormUtilities.hpp +++ b/src/coreComponents/finiteElement/BilinearFormUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/CMakeLists.txt b/src/coreComponents/finiteElement/CMakeLists.txt index 794f2a0384f..a1e5b0b4ad4 100644 --- a/src/coreComponents/finiteElement/CMakeLists.txt +++ b/src/coreComponents/finiteElement/CMakeLists.txt @@ -46,7 +46,7 @@ blt_add_library( NAME finiteElement SOURCES ${finiteElement_sources} HEADERS ${finiteElement_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( finiteElement PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp index d73f4719752..d7f8a4cfccd 100644 --- a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp +++ b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h index 9c38cde0d64..de21c56be10 100644 --- a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h +++ b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp index 7f79294b773..3f40d4fc8c2 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp b/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp index fa76d864779..d70d0a34be4 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp index 413670a3c27..ca84c5b01bb 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp index 1d25381b478..32fb2500ed7 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/FiniteElementDispatch.hpp b/src/coreComponents/finiteElement/FiniteElementDispatch.hpp index dc144e78e1d..205595ff042 100644 --- a/src/coreComponents/finiteElement/FiniteElementDispatch.hpp +++ b/src/coreComponents/finiteElement/FiniteElementDispatch.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -45,7 +46,7 @@ finiteElement::Q4_Hexahedron_Lagrange_GaussLobatto, \ finiteElement::Q5_Hexahedron_Lagrange_GaussLobatto -#if defined( GEOSX_DISPATCH_VEM ) +#if defined( GEOS_DISPATCH_VEM ) #define VEM_1_TYPES \ finiteElement::H1_Tetrahedron_VEM_Gauss1, \ diff --git a/src/coreComponents/finiteElement/Kinematics.h b/src/coreComponents/finiteElement/Kinematics.h index 688aaccf5e7..3dd5d47f48c 100644 --- a/src/coreComponents/finiteElement/Kinematics.h +++ b/src/coreComponents/finiteElement/Kinematics.h @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/LinearFormUtilities.hpp b/src/coreComponents/finiteElement/LinearFormUtilities.hpp index 2b6475743cf..374155c6a7c 100644 --- a/src/coreComponents/finiteElement/LinearFormUtilities.hpp +++ b/src/coreComponents/finiteElement/LinearFormUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/PDEUtilities.hpp b/src/coreComponents/finiteElement/PDEUtilities.hpp index 716e31b89e2..a834df8048b 100644 --- a/src/coreComponents/finiteElement/PDEUtilities.hpp +++ b/src/coreComponents/finiteElement/PDEUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp index eea219c69b9..fdba77ade2a 100644 --- a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp index 1f02b577f1e..49d54710d43 100644 --- a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + /** * @file ConformingVirtualElementOrder1_impl.hpp */ diff --git a/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp b/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp index de0d1e45155..352dfe93ee2 100644 --- a/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp index 1475efbbbb6..4cad29f1025 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp index 83e8cbbc4cd..890d7223a9b 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp index 95dc87d6cf9..9e96f90d535 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp index 38426302f6f..790798adc18 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp index c6e42b2599a..b2e8aaf6da1 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp index aa0db8add80..dd767ed0f68 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp index 73871c9b511..75dfcac2b0a 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp index b8a310fb997..390b3cf0dc0 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp index 3b4aa33fa58..f1d2f2dc086 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp index 26ceb280c3e..02f694ed362 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp index 12c3d3d9008..623a7c2a638 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp b/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp index 8b1c73c1b85..f7f384241be 100644 --- a/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp index 681ec678ecb..41ddc090fdf 100644 --- a/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp index 9f6b1932851..0c806f5b50f 100644 --- a/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp index ac5068fb0fe..4ec0ea972dd 100644 --- a/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp index a107ff4f38f..60eb3a0fcec 100644 --- a/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp b/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp index 835d8778f6c..833503b4789 100644 --- a/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp +++ b/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp b/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp index 3148edb9f14..0b5698f6a2a 100644 --- a/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp +++ b/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #ifndef GEOS_FINITEELEMENT_UNITTESTS_TESTFINITEELEMENTHELPERS_HPP_ #define GEOS_FINITEELEMENT_UNITTESTS_TESTFINITEELEMENTHELPERS_HPP_ diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp index 2a73fc1b357..600f7a07b4e 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp index fa0acd770a3..6070b87d454 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp b/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp index 7a48db8231c..6b8879eca9c 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp index 1d6302f5526..4bb8378d7d4 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp b/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp index e4c038fa08d..4cbf0d27496 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp index dfcb9373c08..2ba1414859f 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp b/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp index 6d353392f52..b28dced29d9 100644 --- a/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp +++ b/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp b/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp index c78f7714db0..38e173e0795 100644 --- a/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp +++ b/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/BoundaryStencil.cpp b/src/coreComponents/finiteVolume/BoundaryStencil.cpp index 913a57704be..dfa11702af5 100644 --- a/src/coreComponents/finiteVolume/BoundaryStencil.cpp +++ b/src/coreComponents/finiteVolume/BoundaryStencil.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/BoundaryStencil.hpp b/src/coreComponents/finiteVolume/BoundaryStencil.hpp index 2b27d35872c..5cfa6957124 100644 --- a/src/coreComponents/finiteVolume/BoundaryStencil.hpp +++ b/src/coreComponents/finiteVolume/BoundaryStencil.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/CMakeLists.txt b/src/coreComponents/finiteVolume/CMakeLists.txt index 9fc47c9411b..46b200344fa 100644 --- a/src/coreComponents/finiteVolume/CMakeLists.txt +++ b/src/coreComponents/finiteVolume/CMakeLists.txt @@ -46,7 +46,7 @@ blt_add_library( NAME finiteVolume SOURCES ${finiteVolume_sources} HEADERS ${finiteVolume_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( finiteVolume PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp b/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp index 9ed1ef71bbc..d04dcb8464c 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp +++ b/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp b/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp index 35afb9c0c80..c730b22795b 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp +++ b/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp b/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp index 6cdc2bb7065..b9bf2b3e1a8 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp +++ b/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp b/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp index df572350aba..0994b727abf 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp +++ b/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp index 6a2d4e3abb4..514f34b6db2 100644 --- a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp +++ b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp index d110ef18081..0e752f83c55 100644 --- a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp +++ b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp b/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp index d4af43bf652..3a388ee3262 100644 --- a/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp +++ b/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp b/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp index bd212d5607f..72edefcab25 100644 --- a/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp +++ b/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp b/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp index 89289e5f32b..0879befa229 100644 --- a/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp +++ b/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp b/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp index 2fe3be2527d..89a8bf0b8f2 100644 --- a/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp +++ b/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/FluxApproximationBase.cpp b/src/coreComponents/finiteVolume/FluxApproximationBase.cpp index 259006f3d56..e1ce126d105 100644 --- a/src/coreComponents/finiteVolume/FluxApproximationBase.cpp +++ b/src/coreComponents/finiteVolume/FluxApproximationBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp index 3830cf52cc1..0a71f3a3c26 100644 --- a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp +++ b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp index 35d2149a50a..7d1f8acfe68 100644 --- a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp +++ b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp index 3aa80049dd1..54db1dbcee3 100644 --- a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp +++ b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp b/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp index 136637b7534..153f695a93d 100644 --- a/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp +++ b/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp index c9e9769125b..44934c17693 100644 --- a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp +++ b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "ProjectionEDFMHelper.hpp" #include "mesh/MeshLevel.hpp" #include "finiteVolume/CellElementStencilTPFA.hpp" diff --git a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp index 54c72bfb18c..3d929069ac5 100644 --- a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp +++ b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #ifndef GEOS_FINITEVOLUME_PROJECTIONEDFMHELPER_HPP_ #define GEOS_FINITEVOLUME_PROJECTIONEDFMHELPER_HPP_ diff --git a/src/coreComponents/finiteVolume/StencilBase.hpp b/src/coreComponents/finiteVolume/StencilBase.hpp index d469f384961..f0feae5e544 100644 --- a/src/coreComponents/finiteVolume/StencilBase.hpp +++ b/src/coreComponents/finiteVolume/StencilBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp b/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp index 8b3d3c56be2..91e128584b0 100644 --- a/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp +++ b/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp b/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp index 714ac59115d..816aed1dde5 100644 --- a/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp +++ b/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp index d4d2ce4c3cf..1b85d4f67a9 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp index 1cbd8453763..af85a416699 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp index 5315503aef3..d06bbd1bda9 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp index ac2971725d6..09d2c67e3ad 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp index 527bd134136..7dff4358bd5 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp index 4987e0d768f..323c5b2afdd 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp index 701529a924c..858e6c17153 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp index 8b6c8089ab1..3a3cd5db06b 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp index d15dab34478..5846178b101 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/CMakeLists.txt b/src/coreComponents/functions/CMakeLists.txt index 01f8d6fed86..5a3804dbc24 100644 --- a/src/coreComponents/functions/CMakeLists.txt +++ b/src/coreComponents/functions/CMakeLists.txt @@ -37,7 +37,7 @@ blt_add_library( NAME functions SOURCES ${functions_sources} HEADERS ${functions_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( functions PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/functions/CompositeFunction.cpp b/src/coreComponents/functions/CompositeFunction.cpp index b47db537e68..e45fc8b747f 100644 --- a/src/coreComponents/functions/CompositeFunction.cpp +++ b/src/coreComponents/functions/CompositeFunction.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/CompositeFunction.hpp b/src/coreComponents/functions/CompositeFunction.hpp index b483c2e63eb..cfcbc5bf174 100644 --- a/src/coreComponents/functions/CompositeFunction.hpp +++ b/src/coreComponents/functions/CompositeFunction.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/FunctionBase.cpp b/src/coreComponents/functions/FunctionBase.cpp index ce14852b501..dbc6279c727 100644 --- a/src/coreComponents/functions/FunctionBase.cpp +++ b/src/coreComponents/functions/FunctionBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/FunctionBase.hpp b/src/coreComponents/functions/FunctionBase.hpp index 8ef3b22fcab..4d37ebf089c 100644 --- a/src/coreComponents/functions/FunctionBase.hpp +++ b/src/coreComponents/functions/FunctionBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/FunctionManager.cpp b/src/coreComponents/functions/FunctionManager.cpp index 2e532d784f8..f0e938782ed 100644 --- a/src/coreComponents/functions/FunctionManager.cpp +++ b/src/coreComponents/functions/FunctionManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/FunctionManager.hpp b/src/coreComponents/functions/FunctionManager.hpp index 659dea61c38..3880bbef159 100644 --- a/src/coreComponents/functions/FunctionManager.hpp +++ b/src/coreComponents/functions/FunctionManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/MultivariableTableFunction.cpp b/src/coreComponents/functions/MultivariableTableFunction.cpp index 97136c32f21..ee6f5b7ef06 100644 --- a/src/coreComponents/functions/MultivariableTableFunction.cpp +++ b/src/coreComponents/functions/MultivariableTableFunction.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/MultivariableTableFunction.hpp b/src/coreComponents/functions/MultivariableTableFunction.hpp index 6d77961aa45..37660da0751 100644 --- a/src/coreComponents/functions/MultivariableTableFunction.hpp +++ b/src/coreComponents/functions/MultivariableTableFunction.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp b/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp index 53a8163725d..9be5df924f5 100644 --- a/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp +++ b/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/SymbolicFunction.cpp b/src/coreComponents/functions/SymbolicFunction.cpp index 53e9879af12..3088c781093 100644 --- a/src/coreComponents/functions/SymbolicFunction.cpp +++ b/src/coreComponents/functions/SymbolicFunction.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/SymbolicFunction.hpp b/src/coreComponents/functions/SymbolicFunction.hpp index c8548edf40b..d58a9f157c5 100644 --- a/src/coreComponents/functions/SymbolicFunction.hpp +++ b/src/coreComponents/functions/SymbolicFunction.hpp @@ -2,15 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ + #ifndef GEOS_FUNCTIONS_SYMBOLICFUNCTION_HPP_ #define GEOS_FUNCTIONS_SYMBOLICFUNCTION_HPP_ diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index 3fa60e36e92..9b71eee3805 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/TableFunction.hpp b/src/coreComponents/functions/TableFunction.hpp index 216fd08ca51..94c4b25f777 100644 --- a/src/coreComponents/functions/TableFunction.hpp +++ b/src/coreComponents/functions/TableFunction.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/functions/unitTests/CMakeLists.txt b/src/coreComponents/functions/unitTests/CMakeLists.txt index 666d52ed234..5aa938d9ce4 100644 --- a/src/coreComponents/functions/unitTests/CMakeLists.txt +++ b/src/coreComponents/functions/unitTests/CMakeLists.txt @@ -5,7 +5,7 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest functions ) -# if ( GEOSX_BUILD_SHARED_LIBS ) +# if ( GEOS_BUILD_SHARED_LIBS ) # list( APPEND dependencyList geosx_core ) # else() # list( APPEND dependencyList ${geosx_core_libs} ) diff --git a/src/coreComponents/functions/unitTests/testFunctions.cpp b/src/coreComponents/functions/unitTests/testFunctions.cpp index c9353b8c82f..034ed353e34 100644 --- a/src/coreComponents/functions/unitTests/testFunctions.cpp +++ b/src/coreComponents/functions/unitTests/testFunctions.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -22,7 +23,7 @@ #include "functions/MultivariableTableFunctionKernels.hpp" //#include "mainInterface/GeosxState.hpp" -#ifdef GEOSX_USE_MATHPRESSO +#ifdef GEOS_USE_MATHPRESSO #include "functions/SymbolicFunction.hpp" #endif @@ -539,7 +540,7 @@ TEST( FunctionTests, 4DTable_derivatives ) } } -#ifdef GEOSX_USE_MATHPRESSO +#ifdef GEOS_USE_MATHPRESSO TEST( FunctionTests, 4DTable_symbolic ) { diff --git a/src/coreComponents/linearAlgebra/CMakeLists.txt b/src/coreComponents/linearAlgebra/CMakeLists.txt index 3ae8298a43d..07c823d8300 100644 --- a/src/coreComponents/linearAlgebra/CMakeLists.txt +++ b/src/coreComponents/linearAlgebra/CMakeLists.txt @@ -153,7 +153,7 @@ blt_add_library( NAME linearAlgebra SOURCES ${linearAlgebra_sources} HEADERS ${linearAlgebra_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( linearAlgebra PUBLIC ${CMAKE_CURRENT_LIST_DIR} ) diff --git a/src/coreComponents/linearAlgebra/DofManager.cpp b/src/coreComponents/linearAlgebra/DofManager.cpp index 12380d90a59..34b0855bf88 100644 --- a/src/coreComponents/linearAlgebra/DofManager.cpp +++ b/src/coreComponents/linearAlgebra/DofManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -1877,15 +1878,15 @@ void DofManager::printFieldInfo( std::ostream & os ) const bool const transpose, \ LAI::ParallelMatrix & restrictor ) const; -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS MAKE_DOFMANAGER_METHOD_INST( TrilinosInterface ) #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE MAKE_DOFMANAGER_METHOD_INST( HypreInterface ) #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC MAKE_DOFMANAGER_METHOD_INST( PetscInterface ) #endif diff --git a/src/coreComponents/linearAlgebra/DofManager.hpp b/src/coreComponents/linearAlgebra/DofManager.hpp index db8b7a01c8d..f140313cd37 100644 --- a/src/coreComponents/linearAlgebra/DofManager.hpp +++ b/src/coreComponents/linearAlgebra/DofManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp b/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp index 186c2f7d2bc..45ee6abc2e5 100644 --- a/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp +++ b/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/common/LinearOperator.hpp b/src/coreComponents/linearAlgebra/common/LinearOperator.hpp index 995ef2b6936..fbe52f11f58 100644 --- a/src/coreComponents/linearAlgebra/common/LinearOperator.hpp +++ b/src/coreComponents/linearAlgebra/common/LinearOperator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp b/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp index f20b2a1501b..058ac6b280a 100644 --- a/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp +++ b/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp b/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp index d8869c7eb2e..171487e2419 100644 --- a/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp +++ b/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/common/common.hpp b/src/coreComponents/linearAlgebra/common/common.hpp index f729fafe3fc..236e7811eba 100644 --- a/src/coreComponents/linearAlgebra/common/common.hpp +++ b/src/coreComponents/linearAlgebra/common/common.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/common/traits.hpp b/src/coreComponents/linearAlgebra/common/traits.hpp index 546307b670d..8c271e25404 100644 --- a/src/coreComponents/linearAlgebra/common/traits.hpp +++ b/src/coreComponents/linearAlgebra/common/traits.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp b/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp index 0566bd819df..5721eac261c 100644 --- a/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -21,15 +22,15 @@ #include "common/GeosxConfig.hpp" -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS #include "linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp" #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE #include "linearAlgebra/interfaces/hypre/HypreInterface.hpp" #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC #include "linearAlgebra/interfaces/petsc/PetscInterface.hpp" #endif @@ -37,7 +38,7 @@ namespace geos { /// Alias for current interface -using LAInterface = GEOS_CONCAT( GEOSX_LA_INTERFACE, Interface ); +using LAInterface = GEOS_CONCAT( GEOS_LA_INTERFACE, Interface ); /// Alias for ParallelMatrix using ParallelMatrix = LAInterface::ParallelMatrix; @@ -50,13 +51,13 @@ using ParallelVector = LAInterface::ParallelVector; */ inline void setupLAI() { -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS TrilinosInterface::initialize(); #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE HypreInterface::initialize(); #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC PetscInterface::initialize(); #endif } @@ -66,13 +67,13 @@ inline void setupLAI() */ inline void finalizeLAI() { -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS TrilinosInterface::finalize(); #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE HypreInterface::finalize(); #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC PetscInterface::finalize(); #endif } diff --git a/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp b/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp index 65a9df9b176..353d91e9270 100644 --- a/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp b/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp index 6c2a8fb555e..508d8ddbee2 100644 --- a/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp index d0a4d678beb..8f76476af91 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -29,7 +30,7 @@ // Pre-define some suitesparse variables since they are not properly defined // in the header for alternate index types. -//#if GEOSX_GLOBALINDEX_TYPE_FLAG==0 +//#if GEOS_GLOBALINDEX_TYPE_FLAG==0 #if 0 /// Set alias for SuiteSparse_long #define SuiteSparse_long int @@ -370,15 +371,15 @@ real64 SuiteSparse< LAI >::estimateConditionNumberAdvanced() const // ----------------------- // Explicit Instantiations // ----------------------- -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS template class SuiteSparse< TrilinosInterface >; #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE template class SuiteSparse< HypreInterface >; #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC template class SuiteSparse< PetscInterface >; #endif diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp index c506917c773..b592ec833db 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp index 52a62dfa2b3..0a8995f8728 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -436,15 +437,15 @@ real64 SuperLUDist< LAI >::estimateConditionNumberAdvanced() const // ----------------------- // Explicit Instantiations // ----------------------- -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS template class SuperLUDist< TrilinosInterface >; #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE template class SuperLUDist< HypreInterface >; #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC template class SuperLUDist< PetscInterface >; #endif diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp index 20f3fd742ae..fb3aefa6f8a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp index 7e335a47e1c..8f2707fe448 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp index 2e9e03e02a5..78658416ac0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp index d5b231ad971..37acb60d6d5 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -24,7 +25,7 @@ #include "linearAlgebra/interfaces/hypre/HypreSolver.hpp" #include "linearAlgebra/interfaces/hypre/HypreUtils.hpp" -#if defined(GEOSX_USE_SUPERLU_DIST) +#if defined(GEOS_USE_SUPERLU_DIST) #include "linearAlgebra/interfaces/direct/SuperLUDist.hpp" #endif @@ -61,7 +62,7 @@ HypreInterface::createSolver( LinearSolverParameters params ) { if( params.direct.parallel ) { -#if defined(GEOSX_USE_SUPERLU_DIST) +#if defined(GEOS_USE_SUPERLU_DIST) return std::make_unique< SuperLUDist< HypreInterface > >( std::move( params ) ); #else GEOS_ERROR( "GEOSX is configured without support for SuperLU_dist." ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp index d4a8eb1ef45..91eae0ca9e0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp index 0ebfc519d66..eab9d2e46df 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp index eac1f2c468d..3069b3f50d2 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp index aa85b90b68a..da1112148d6 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp index 1ee748c1476..d4f04bfd315 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp index c45c30a10b5..f6607a1d76a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp index 41a7610c31c..9617dfe5576 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp index ca99a2e832f..45193c13e47 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -415,7 +416,7 @@ void HyprePreconditioner::setup( Matrix const & mat ) { m_precond->destroy( m_precond->ptr ); } -#if defined(GEOSX_USE_SUPERLU_DIST) +#if defined(GEOS_USE_SUPERLU_DIST) hypre_SLUDistSetup( &m_precond->ptr, precondMat.unwrapped(), 0 ); #endif } diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp index 57828e65a7a..e2028e5edd6 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp index 3a54f603c3c..8ea007028a0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -297,4 +298,4 @@ void HypreSolver::clear() m_solver.reset(); } -} // end geosx namespace +} // end geos namespace diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp index ff1162c8a33..e34d64b63da 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -99,6 +100,6 @@ class HypreSolver final : public LinearSolverBase< HypreInterface > real64 m_computeAuuTime; }; -} // end geosx namespace +} // end geos namespace #endif /* HYPRESOLVER_HPP_ */ diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp index cd20aa4a653..c96ec6a80d7 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 Total, S.A - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ @@ -59,7 +60,7 @@ HYPRE_Int SuperLUDistSolve( HYPRE_Solver solver, HYPRE_ParVector x ) { GEOS_UNUSED_VAR( A ); -#if defined(GEOSX_USE_SUPERLU_DIST) +#if defined(GEOS_USE_SUPERLU_DIST) return hypre_SLUDistSolve( solver, b, x ); #else GEOS_UNUSED_VAR( solver ); @@ -72,7 +73,7 @@ HYPRE_Int SuperLUDistSolve( HYPRE_Solver solver, HYPRE_Int SuperLUDistDestroy( HYPRE_Solver solver ) { -#if defined(GEOSX_USE_SUPERLU_DIST) +#if defined(GEOS_USE_SUPERLU_DIST) return hypre_SLUDistDestroy( solver ); #else GEOS_UNUSED_VAR( solver ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp index 583c0310107..ef95bc80191 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -157,7 +158,7 @@ inline void checkDeviceErrors( char const * msg, char const * file, int const li GEOS_ERROR_IF( err != cudaSuccess, GEOS_FMT( "Previous CUDA errors found: {} ({} at {}:{})", msg, cudaGetErrorString( err ), file, line ) ); #elif GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP hipError_t const err = hipGetLastError(); - GEOS_UNUSED_VAR( msg, file, line ); // on crusher geosx_error_if ultimately resolves to an assert, which drops the content on release + GEOS_UNUSED_VAR( msg, file, line ); // on crusher geos_error_if ultimately resolves to an assert, which drops the content on release // builds GEOS_ERROR_IF( err != hipSuccess, GEOS_FMT( "Previous HIP errors found: {} ({} at {}:{})", msg, hipGetErrorString( err ), file, line ) ); #else diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp index 7353fc698ce..56ea2db6ecc 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp index 4f345531ad1..fcaf13c188e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp index 12d52ddb351..c0b9c834bbc 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp index deb27e02aa7..0261cdb6331 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp index 7b72438df7e..d4fa88273fa 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp index 786663ab896..ddad8ab0c3b 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp index 1621c9c2c45..97fced479f3 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp index 1e5b07c1fa6..ad39e9ae024 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp index 09955322284..c2c07c82929 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp index c575661c4a6..7000b0b1856 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp index cebcb8128b3..789028ad930 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp index 03eec16db7e..b43cb73f60c 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp index f740db535e9..1388e01fb42 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp index 099a3fe1ed8..d2edc99aef0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp index 743d280989c..c2b74b44aac 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp index b4e999b71c7..9b392860d5c 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp index 6ae74593e42..822cfba7717 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp index d72c64c5c3a..5c835572754 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp index e8ef8c7900b..b98937f8888 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp index b367a44af14..3db816c7143 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp index 5870bb0cc37..6a177da7950 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp index 07010dcde84..557b3c3d454 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp index 0e0c9943242..2ae18ae01bf 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp index 4316315e80d..8a89da7efe3 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp index 685e3650f66..df6b1e08aef 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp index b57a3e6a553..baceac5a6fc 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp index a5c98a456d2..a69dbd6d1bb 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp index 3d2341cfab7..09830dfa800 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -1287,4 +1288,4 @@ void PetscMatrix::write( string const & filename, GEOS_LAI_CHECK_ERROR( PetscViewerDestroy( &viewer ) ); } -} // end geosx namespace +} // end geos namespace diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp index 1ebad306c2c..c1f78539ba0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp index 3ea2a64e951..ec8e588a3bb 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp index 3b8a49c2f7b..d6d11f939a8 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp index 19e5b1a4eae..524cbace836 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -24,7 +25,7 @@ #include #include -// Put everything under the geosx namespace. +// Put everything under the geos namespace. namespace geos { @@ -165,4 +166,4 @@ void PetscSolver::clear() } } -} // end geosx namespace +} // end geos namespace diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp index 6415901b18e..361176e5d10 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -86,6 +87,6 @@ class PetscSolver final : public LinearSolverBase< PetscInterface > KSP m_solver{}; }; -} // end geosx namespace +} // end geos namespace #endif /* PETSCSOLVER_HPP_ */ diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp index 18a51c3a3c1..6af980baf9d 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp index 6e38d1b1471..e509f633d73 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -385,4 +386,4 @@ MPI_Comm PetscVector::comm() const return comm; } -} // end geosx +} // end geos diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp index e561331b6e4..31cb22ad096 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -210,6 +211,6 @@ class PetscVector final : private VectorBase< PetscVector > Vec m_vec; }; -} // end geosx namespace +} // end geos namespace #endif /*GEOS_LINEARALGEBRA_INTERFACES_PETSCVECTOR_HPP_*/ diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp index 85a9ad5ed42..0406edde736 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp index 139d1a74968..89b8c5664e5 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp index 46dc04a9cf1..6b5b5fd68ec 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -1038,7 +1039,7 @@ localIndex EpetraMatrix::numLocalRows() const MPI_Comm EpetraMatrix::comm() const { GEOS_LAI_ASSERT( created() ); -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return dynamicCast< Epetra_MpiComm const & >( m_matrix->RowMap().Comm() ).Comm(); #else return MPI_COMM_GEOSX; @@ -1100,4 +1101,4 @@ void EpetraMatrix::multiply( bool const transA, C.m_assembled = true; } -} // end geosx namespace +} // end geos namespace diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp index 44d907d37d5..288de24899a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp index 980d0e52810..7c02134b8a0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -20,7 +21,7 @@ #include "common/DataTypes.hpp" -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI #include #else #include @@ -43,7 +44,7 @@ static_assert( std::is_signed< long long >::value == std::is_signed< geos::globa static_assert( std::is_same< double, geos::real64 >::value, "double and geos::real64 must be the same type" ); -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI /// Alias for Epetra communicator using EpetraComm = Epetra_MpiComm; #else diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp index a94b11b8c45..2993d566997 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -289,11 +290,11 @@ globalIndex EpetraVector::iupper() const MPI_Comm EpetraVector::comm() const { GEOS_LAI_ASSERT( created() ); -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI return dynamicCast< Epetra_MpiComm const & >( m_vec->Map().Comm() ).Comm(); #else return MPI_COMM_GEOSX; #endif } -} // end geosx +} // end geos diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp index 917bd365b1a..6ba5ccb8a63 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -190,6 +191,6 @@ class EpetraVector final : private VectorBase< EpetraVector > std::unique_ptr< Epetra_Vector > m_vec; }; -} // end geosx namespace +} // end geos namespace #endif /*GEOS_LINEARALGEBRA_INTERFACES_EPETRAVECTOR_HPP_*/ diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp index 1c2d4d3fce2..fb028e9084c 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp index d2fba7c2bc5..a4cc280066e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp index 94963add498..c3fa4f8c267 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp index 3219767b841..1064406fd4f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp index 01b97d058c3..9072827ce05 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -164,4 +165,4 @@ void TrilinosSolver::solve( EpetraVector const & rhs, } } -} // end geosx namespace +} // end geos namespace diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp index d0bb2e7038b..922292371f6 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -88,6 +89,6 @@ class TrilinosSolver final : public LinearSolverBase< TrilinosInterface > std::unique_ptr< AztecOO > m_solver; }; -} // end geosx namespace +} // end geos namespace #endif /* TRILINOSSOLVER_HPP_ */ diff --git a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp index 8ba335f54dd..159c0ee98fe 100644 --- a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -91,8 +92,8 @@ void BicgstabSolver< VECTOR >::solve( Vector const & b, // Compute r0.rk real64 const rho = r.dot( r0 ); - GEOSX_KRYLOV_BREAKDOWN_IF_ZERO( rho_old ) - GEOSX_KRYLOV_BREAKDOWN_IF_ZERO( omega ) + GEOS_KRYLOV_BREAKDOWN_IF_ZERO( rho_old ) + GEOS_KRYLOV_BREAKDOWN_IF_ZERO( omega ) // Compute beta real64 const beta = rho / rho_old * alpha / omega; @@ -107,7 +108,7 @@ void BicgstabSolver< VECTOR >::solve( Vector const & b, // Compute alpha real64 const vr0 = v.dot( r0 ); - GEOSX_KRYLOV_BREAKDOWN_IF_ZERO( vr0 ) + GEOS_KRYLOV_BREAKDOWN_IF_ZERO( vr0 ) alpha = rho / vr0; // compute x = x + alpha*y @@ -125,7 +126,7 @@ void BicgstabSolver< VECTOR >::solve( Vector const & b, // Update omega real64 const t2 = t.dot( t ); - GEOSX_KRYLOV_BREAKDOWN_IF_ZERO( t2 ) + GEOS_KRYLOV_BREAKDOWN_IF_ZERO( t2 ) omega = t.dot( s ) / t2; // Update x = x + omega*z @@ -147,17 +148,17 @@ void BicgstabSolver< VECTOR >::solve( Vector const & b, // ----------------------- // Explicit Instantiations // ----------------------- -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS template class BicgstabSolver< TrilinosInterface::ParallelVector >; template class BicgstabSolver< BlockVectorView< TrilinosInterface::ParallelVector > >; #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE template class BicgstabSolver< HypreInterface::ParallelVector >; template class BicgstabSolver< BlockVectorView< HypreInterface::ParallelVector > >; #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC template class BicgstabSolver< PetscInterface::ParallelVector >; template class BicgstabSolver< BlockVectorView< PetscInterface::ParallelVector > >; #endif diff --git a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp index 0c940c7edfe..96e5bf7fdc8 100644 --- a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp index 15840c09da6..5b60faab13a 100644 --- a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -247,15 +248,15 @@ void BlockPreconditioner< LAI >::clear() // ----------------------- // Explicit Instantiations // ----------------------- -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS template class BlockPreconditioner< TrilinosInterface >; #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE template class BlockPreconditioner< HypreInterface >; #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC template class BlockPreconditioner< PetscInterface >; #endif diff --git a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp index f6ea90dd635..ef3e8ebe98c 100644 --- a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp b/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp index bceaa44c1da..c9e19604c02 100644 --- a/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -113,7 +114,7 @@ void CgSolver< VECTOR >::solve( Vector const & b, Vector & x ) const // compute alpha real64 const pAp = p.dot( Ap ); - GEOSX_KRYLOV_BREAKDOWN_IF_ZERO( pAp ) + GEOS_KRYLOV_BREAKDOWN_IF_ZERO( pAp ) real64 const alpha = tau / pAp; // Update x = x + alpha*p @@ -136,17 +137,17 @@ void CgSolver< VECTOR >::solve( Vector const & b, Vector & x ) const // ----------------------- // Explicit Instantiations // ----------------------- -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS template class CgSolver< TrilinosInterface::ParallelVector >; template class CgSolver< BlockVectorView< TrilinosInterface::ParallelVector > >; #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE template class CgSolver< HypreInterface::ParallelVector >; template class CgSolver< BlockVectorView< HypreInterface::ParallelVector > >; #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC template class CgSolver< PetscInterface::ParallelVector >; template class CgSolver< BlockVectorView< PetscInterface::ParallelVector > >; #endif diff --git a/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp b/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp index f5d6b821bb0..6db6fa7c12d 100644 --- a/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp b/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp index 4274c50f294..dea30200688 100644 --- a/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -165,7 +166,7 @@ void GmresSolver< VECTOR >::solve( Vector const & b, } H( j+1, j ) = w.norm2(); - GEOSX_KRYLOV_BREAKDOWN_IF_ZERO( H( j+1, j ) ) + GEOS_KRYLOV_BREAKDOWN_IF_ZERO( H( j+1, j ) ) m_kspace[j+1].axpby( 1.0 / H( j+1, j ), w, 0.0 ); // Apply all previous rotations to the new column @@ -202,17 +203,17 @@ void GmresSolver< VECTOR >::solve( Vector const & b, // ----------------------- // Explicit Instantiations // ----------------------- -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS template class GmresSolver< TrilinosInterface::ParallelVector >; template class GmresSolver< BlockVectorView< TrilinosInterface::ParallelVector > >; #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE template class GmresSolver< HypreInterface::ParallelVector >; template class GmresSolver< BlockVectorView< HypreInterface::ParallelVector > >; #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC template class GmresSolver< PetscInterface::ParallelVector >; template class GmresSolver< BlockVectorView< PetscInterface::ParallelVector > >; #endif diff --git a/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp b/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp index 15edabbe0a4..de7f2139eab 100644 --- a/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp index d3c461ba08b..e8f775d9c11 100644 --- a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -100,17 +101,17 @@ void KrylovSolver< VECTOR >::logResult() const // ----------------------- // Explicit Instantiations // ----------------------- -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS template class KrylovSolver< TrilinosInterface::ParallelVector >; template class KrylovSolver< BlockVectorView< TrilinosInterface::ParallelVector > >; #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE template class KrylovSolver< HypreInterface::ParallelVector >; template class KrylovSolver< BlockVectorView< HypreInterface::ParallelVector > >; #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC template class KrylovSolver< PetscInterface::ParallelVector >; template class KrylovSolver< BlockVectorView< PetscInterface::ParallelVector > >; #endif diff --git a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp index 33504c4b105..f70961bd228 100644 --- a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp b/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp index 01bf8aef804..30f1b68eb74 100644 --- a/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp +++ b/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -24,7 +25,7 @@ * @brief Exit solver iteration and report a breakdown if value too close to zero. * @param VAR the variable or expression */ -#define GEOSX_KRYLOV_BREAKDOWN_IF_ZERO( VAR ) \ +#define GEOS_KRYLOV_BREAKDOWN_IF_ZERO( VAR ) \ if( isZero( VAR, 0.0 ) ) \ { \ if( m_params.logLevel >= 1 ) \ diff --git a/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp b/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp index 086f826e30b..d90c8e78dde 100644 --- a/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp +++ b/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp b/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp index 1d3a9e133c4..843c6e45588 100644 --- a/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp +++ b/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp b/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp index cdf5b7a1a14..0a9e8acc36d 100644 --- a/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp +++ b/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp index 1859c5ce354..1ea01663098 100644 --- a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -66,15 +67,15 @@ void SeparateComponentPreconditioner< LAI >::clear() // ----------------------- // Explicit Instantiations // ----------------------- -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS template class SeparateComponentPreconditioner< TrilinosInterface >; #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE template class SeparateComponentPreconditioner< HypreInterface >; #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC template class SeparateComponentPreconditioner< PetscInterface >; #endif diff --git a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp index 15cd81e6e54..e1360573162 100644 --- a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp b/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp index 15dd95ce5f2..3b24dfc4dad 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp b/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp index c9a2807677f..0f8b959c1a4 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ @@ -203,15 +204,15 @@ REGISTER_TYPED_TEST_SUITE_P( SolverTestLaplace2D, CG_AMG ); #endif -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS INSTANTIATE_TYPED_TEST_SUITE_P( Trilinos, SolverTestLaplace2D, TrilinosInterface, ); #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE INSTANTIATE_TYPED_TEST_SUITE_P( Hypre, SolverTestLaplace2D, HypreInterface, ); #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC INSTANTIATE_TYPED_TEST_SUITE_P( Petsc, SolverTestLaplace2D, PetscInterface, ); #endif @@ -269,15 +270,15 @@ REGISTER_TYPED_TEST_SUITE_P( SolverTestElasticity2D, GMRES_AMG ); #endif -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS INSTANTIATE_TYPED_TEST_SUITE_P( Trilinos, SolverTestElasticity2D, TrilinosInterface, ); #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE INSTANTIATE_TYPED_TEST_SUITE_P( Hypre, SolverTestElasticity2D, HypreInterface, ); #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC INSTANTIATE_TYPED_TEST_SUITE_P( Petsc, SolverTestElasticity2D, PetscInterface, ); #endif diff --git a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp index 63d8dbe2f8d..be7045939b9 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -159,15 +160,15 @@ REGISTER_TYPED_TEST_SUITE_P( KrylovSolverTest, BiCGSTAB, GMRES ); -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS INSTANTIATE_TYPED_TEST_SUITE_P( Trilinos, KrylovSolverTest, TrilinosInterface, ); #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE INSTANTIATE_TYPED_TEST_SUITE_P( Hypre, KrylovSolverTest, HypreInterface, ); #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC INSTANTIATE_TYPED_TEST_SUITE_P( Petsc, KrylovSolverTest, PetscInterface, ); #endif @@ -249,15 +250,15 @@ REGISTER_TYPED_TEST_SUITE_P( KrylovSolverBlockTest, BiCGSTAB, GMRES ); -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS INSTANTIATE_TYPED_TEST_SUITE_P( Trilinos, KrylovSolverBlockTest, TrilinosInterface, ); #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE INSTANTIATE_TYPED_TEST_SUITE_P( Hypre, KrylovSolverBlockTest, HypreInterface, ); #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC INSTANTIATE_TYPED_TEST_SUITE_P( Petsc, KrylovSolverBlockTest, PetscInterface, ); #endif diff --git a/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp b/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp index a2ba329510a..0c3a1877743 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp +++ b/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp b/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp index c136a58229c..c75ca45ba9f 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp b/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp index a4cdfd40a2b..d9345d44d3a 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ @@ -282,15 +283,15 @@ REGISTER_TYPED_TEST_SUITE_P( MatrixTest, MatrixMatrixOperations, RectangularMatrixOperations ); -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS INSTANTIATE_TYPED_TEST_SUITE_P( Trilinos, MatrixTest, TrilinosInterface, ); #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE INSTANTIATE_TYPED_TEST_SUITE_P( Hypre, MatrixTest, HypreInterface, ); #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC INSTANTIATE_TYPED_TEST_SUITE_P( Petsc, MatrixTest, PetscInterface, ); #endif diff --git a/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp b/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp index d79d9631f7d..3c3aad02f90 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp b/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp index 632abbe61b2..c0eee9a66a3 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ @@ -364,15 +365,15 @@ REGISTER_TYPED_TEST_SUITE_P( VectorTest, norm2, normInf ); -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS INSTANTIATE_TYPED_TEST_SUITE_P( Trilinos, VectorTest, TrilinosInterface, ); #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE INSTANTIATE_TYPED_TEST_SUITE_P( Hypre, VectorTest, HypreInterface, ); #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC INSTANTIATE_TYPED_TEST_SUITE_P( Petsc, VectorTest, PetscInterface, ); #endif diff --git a/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp b/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp index 33c8fe80f9b..bc95c622f41 100644 --- a/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp +++ b/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp b/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp index 3d91ea20501..491795b484f 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp b/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp index 82b69dc0dbc..ec48edc7270 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -339,7 +340,7 @@ auto BlockOperatorView< VECTOR, OPERATOR >::computeColSize( FUNC func ) const -> return colSize; } -}// end geosx namespace +}// end geos namespace #endif /*GEOS_LINEARALGEBRA_UTILITIES_BLOCKOPERATORVIEW_HPP_*/ diff --git a/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp b/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp index 7b3964e7e59..9da3c73836f 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp b/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp index 5fa88df0d97..1cf7f609a6e 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp b/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp index 447b9f2e47e..fba0c778e07 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -405,7 +406,7 @@ std::ostream & operator<<( std::ostream & os, return os; } -} // end geosx namespace +} // end geos namespace #endif /* GEOS_LINEARALGEBRA_UTILITIES_BLOCKVECTORVIEW_HPP_ */ diff --git a/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp b/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp index cc84cd1018b..51f6d8ccdbf 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp b/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp index 1e0130b97f5..820a119692e 100644 --- a/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp +++ b/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp b/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp index 3ab698cefe8..558070d8667 100644 --- a/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp b/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp index f92fa2ccfec..a8c29320c28 100644 --- a/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -347,6 +348,6 @@ void computeRigidBodyModes( MeshLevel const & mesh, } // LAIHelperFunctions namespace -} // geosx namespace +} // geos namespace #endif /*GEOS_LINEARALGEBRA_UTILITIES_LAIHELPERFUNCTIONS_HPP_*/ diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp index bdcf1de4eb2..722b6b4d3e1 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp index 6a6c5281802..8c2c55ee9b3 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp b/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp index 39b22017893..7b8323d1de9 100644 --- a/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp index 89b18650cd8..fc7aaa43337 100644 --- a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp +++ b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp index fa74a5c5ce4..21663573370 100644 --- a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp +++ b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp b/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp index 8e5ce025f9b..1d284df3daa 100644 --- a/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/mainInterface/CMakeLists.txt b/src/coreComponents/mainInterface/CMakeLists.txt index 70cbacd9e61..4b141ea8b7f 100644 --- a/src/coreComponents/mainInterface/CMakeLists.txt +++ b/src/coreComponents/mainInterface/CMakeLists.txt @@ -24,7 +24,7 @@ blt_add_library( NAME mainInterface SOURCES ${mainInterface_sources} HEADERS ${mainInterface_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) add_dependencies( mainInterface generate_version ) diff --git a/src/coreComponents/mainInterface/GeosxState.cpp b/src/coreComponents/mainInterface/GeosxState.cpp index e965076b89c..6339221e4b7 100644 --- a/src/coreComponents/mainInterface/GeosxState.cpp +++ b/src/coreComponents/mainInterface/GeosxState.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ @@ -23,7 +24,7 @@ // TPL includes #include -#if defined( GEOSX_USE_CALIPER ) +#if defined( GEOS_USE_CALIPER ) #include #endif @@ -83,7 +84,7 @@ GeosxState::GeosxState( std::unique_ptr< CommandLineOptions > && commandLineOpti m_rootNode( std::make_unique< conduit::Node >() ), m_problemManager( nullptr ), m_commTools( std::make_unique< CommunicationTools >() ), -#if defined( GEOSX_USE_CALIPER ) +#if defined( GEOS_USE_CALIPER ) m_caliperManager( std::make_unique< cali::ConfigManager >() ), #endif m_initTime(), @@ -91,7 +92,7 @@ GeosxState::GeosxState( std::unique_ptr< CommandLineOptions > && commandLineOpti { Timer timer( m_initTime ); -#if defined( GEOSX_USE_CALIPER ) +#if defined( GEOS_USE_CALIPER ) setupCaliper( *m_caliperManager, getCommandLineOptions() ); #endif @@ -111,7 +112,7 @@ GeosxState::GeosxState( std::unique_ptr< CommandLineOptions > && commandLineOpti ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// GeosxState::~GeosxState() { -#if defined( GEOSX_USE_CALIPER ) +#if defined( GEOS_USE_CALIPER ) m_caliperManager->flush(); #endif diff --git a/src/coreComponents/mainInterface/GeosxState.hpp b/src/coreComponents/mainInterface/GeosxState.hpp index 8f3bb7402f5..ecefd151fa4 100644 --- a/src/coreComponents/mainInterface/GeosxState.hpp +++ b/src/coreComponents/mainInterface/GeosxState.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ @@ -32,7 +33,7 @@ namespace conduit class Node; } -#if defined( GEOSX_USE_CALIPER ) +#if defined( GEOS_USE_CALIPER ) //Forward declaration of cali::ConfigManager. namespace cali { @@ -234,7 +235,7 @@ class GeosxState /// The CommunicationTools. std::unique_ptr< CommunicationTools > m_commTools; -#if defined( GEOSX_USE_CALIPER ) +#if defined( GEOS_USE_CALIPER ) /// The Caliper ConfigManager. std::unique_ptr< cali::ConfigManager > m_caliperManager; #endif diff --git a/src/coreComponents/mainInterface/GeosxVersion.hpp.in b/src/coreComponents/mainInterface/GeosxVersion.hpp.in index 4e5793e5ed9..822244b3984 100644 --- a/src/coreComponents/mainInterface/GeosxVersion.hpp.in +++ b/src/coreComponents/mainInterface/GeosxVersion.hpp.in @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + /** * @file GeosxVersion.hpp * @@ -9,25 +24,25 @@ #define GEOS_MAININTERFACE_VERSION_HPP_ /// GEOS major version number -#define GEOSX_VERSION_MAJOR @GEOSX_VERSION_MAJOR@ +#define GEOS_VERSION_MAJOR @GEOS_VERSION_MAJOR@ /// GEOS minor version number -#define GEOSX_VERSION_MINOR @GEOSX_VERSION_MINOR@ +#define GEOS_VERSION_MINOR @GEOS_VERSION_MINOR@ /// GEOS patch version number -#define GEOSX_VERSION_PATCH @GEOSX_VERSION_PATCH@ +#define GEOS_VERSION_PATCH @GEOS_VERSION_PATCH@ /// GEOS full version number string -#define GEOSX_VERSION_FULL "@GEOSX_VERSION_FULL@" +#define GEOS_VERSION_FULL "@GEOS_VERSION_FULL@" /// GEOS development branch string -#cmakedefine GEOSX_GIT_BRANCH "@GEOSX_GIT_BRANCH@" +#cmakedefine GEOS_GIT_BRANCH "@GEOS_GIT_BRANCH@" /// GEOS development branch string -#cmakedefine GEOSX_GIT_HASH "@GEOSX_GIT_HASH@" +#cmakedefine GEOS_GIT_HASH "@GEOS_GIT_HASH@" /// GEOS development branch string -#cmakedefine GEOSX_GIT_TAG "@GEOSX_GIT_TAG@" +#cmakedefine GEOS_GIT_TAG "@GEOS_GIT_TAG@" #endif /* GEOS_MAININTERFACE_VERSION_HPP_ */ diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 0bb27174919..88b92fa57d1 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -2,17 +2,18 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ -#define GEOSX_DISPATCH_VEM /// enables VEM in FiniteElementDispatch +#define GEOS_DISPATCH_VEM /// enables VEM in FiniteElementDispatch // Source includes #include "ProblemManager.hpp" diff --git a/src/coreComponents/mainInterface/ProblemManager.hpp b/src/coreComponents/mainInterface/ProblemManager.hpp index af322747b29..9a3d0314142 100644 --- a/src/coreComponents/mainInterface/ProblemManager.hpp +++ b/src/coreComponents/mainInterface/ProblemManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mainInterface/initialization.cpp b/src/coreComponents/mainInterface/initialization.cpp index 75ea5de3b61..0650f9b796c 100644 --- a/src/coreComponents/mainInterface/initialization.cpp +++ b/src/coreComponents/mainInterface/initialization.cpp @@ -1,11 +1,12 @@ /* * ------------------------------------------------------------------------------------------------------------ - * SPDX-LiCense-Identifier: LGPL-2.1-only + * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mainInterface/initialization.hpp b/src/coreComponents/mainInterface/initialization.hpp index 6a33a4580e0..841d5c2e3ae 100644 --- a/src/coreComponents/mainInterface/initialization.hpp +++ b/src/coreComponents/mainInterface/initialization.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mainInterface/version.cpp b/src/coreComponents/mainInterface/version.cpp index 4c285e327c0..196fef6739d 100644 --- a/src/coreComponents/mainInterface/version.cpp +++ b/src/coreComponents/mainInterface/version.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -21,10 +22,10 @@ namespace geos std::string getVersion() { -#if defined(GEOSX_GIT_BRANCH) && defined(GEOSX_GIT_HASH) - return GEOSX_VERSION_FULL " (" GEOSX_GIT_BRANCH ", sha1: " GEOSX_GIT_HASH ")"; +#if defined(GEOS_GIT_BRANCH) && defined(GEOS_GIT_HASH) + return GEOS_VERSION_FULL " (" GEOS_GIT_BRANCH ", sha1: " GEOS_GIT_HASH ")"; #else - return GEOSX_VERSION_FULL; + return GEOS_VERSION_FULL; #endif } @@ -80,7 +81,7 @@ void outputVersionInfo() GEOS_LOG_RANK_0( " - openmp version: " << _OPENMP ); #endif -#if defined(GEOSX_USE_MPI) +#if defined(GEOS_USE_MPI) { char version[MPI_MAX_LIBRARY_VERSION_STRING]; int len; @@ -163,7 +164,7 @@ void outputVersionInfo() #if \ defined(GEOS_USE_DEVICE) && \ - defined(GEOSX_USE_HYPRE) && \ + defined(GEOS_USE_HYPRE) && \ ( GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CPU ) GEOS_LOG_RANK_0( "" ); GEOS_LOG_RANK_0( "**************************************************" ); diff --git a/src/coreComponents/mainInterface/version.hpp b/src/coreComponents/mainInterface/version.hpp index 9f063922769..5aaec16e3b2 100644 --- a/src/coreComponents/mainInterface/version.hpp +++ b/src/coreComponents/mainInterface/version.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/math/extrapolation/Extrapolation.hpp b/src/coreComponents/math/extrapolation/Extrapolation.hpp index af79fb69f1c..87cf06f829a 100644 --- a/src/coreComponents/math/extrapolation/Extrapolation.hpp +++ b/src/coreComponents/math/extrapolation/Extrapolation.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/math/interpolation/Interpolation.hpp b/src/coreComponents/math/interpolation/Interpolation.hpp index 0ba6b6f7ddb..edaf2360399 100644 --- a/src/coreComponents/math/interpolation/Interpolation.hpp +++ b/src/coreComponents/math/interpolation/Interpolation.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/BufferOps.cpp b/src/coreComponents/mesh/BufferOps.cpp index a81b84e8518..575b6ea7bde 100644 --- a/src/coreComponents/mesh/BufferOps.cpp +++ b/src/coreComponents/mesh/BufferOps.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/BufferOps.hpp b/src/coreComponents/mesh/BufferOps.hpp index 8070854d4c4..69bfa27463e 100644 --- a/src/coreComponents/mesh/BufferOps.hpp +++ b/src/coreComponents/mesh/BufferOps.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/CMakeLists.txt b/src/coreComponents/mesh/CMakeLists.txt index 6065ef14dae..7548a76d8f6 100644 --- a/src/coreComponents/mesh/CMakeLists.txt +++ b/src/coreComponents/mesh/CMakeLists.txt @@ -184,7 +184,7 @@ blt_add_library( NAME mesh SOURCES ${mesh_sources} HEADERS ${mesh_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} ) + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( mesh PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/mesh/CellElementRegion.cpp b/src/coreComponents/mesh/CellElementRegion.cpp index 3d614db6606..5f0b1c873de 100644 --- a/src/coreComponents/mesh/CellElementRegion.cpp +++ b/src/coreComponents/mesh/CellElementRegion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/CellElementRegion.hpp b/src/coreComponents/mesh/CellElementRegion.hpp index 130423b42bc..874f33bc490 100644 --- a/src/coreComponents/mesh/CellElementRegion.hpp +++ b/src/coreComponents/mesh/CellElementRegion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/CellElementSubRegion.cpp b/src/coreComponents/mesh/CellElementSubRegion.cpp index 05b0203266d..995d2a0c2c2 100644 --- a/src/coreComponents/mesh/CellElementSubRegion.cpp +++ b/src/coreComponents/mesh/CellElementSubRegion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/CellElementSubRegion.hpp b/src/coreComponents/mesh/CellElementSubRegion.hpp index 43061e0fe5b..349a1b34e23 100644 --- a/src/coreComponents/mesh/CellElementSubRegion.hpp +++ b/src/coreComponents/mesh/CellElementSubRegion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/DomainPartition.cpp b/src/coreComponents/mesh/DomainPartition.cpp index 50cecbc24d9..68811964e66 100644 --- a/src/coreComponents/mesh/DomainPartition.cpp +++ b/src/coreComponents/mesh/DomainPartition.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -78,7 +79,7 @@ void DomainPartition::setupBaseLevelMeshGlobalInfo() { GEOS_MARK_FUNCTION; -#if defined(GEOSX_USE_MPI) +#if defined(GEOS_USE_MPI) PartitionBase & partition1 = getReference< PartitionBase >( keys::partitionManager ); SpatialPartition & partition = dynamic_cast< SpatialPartition & >(partition1); diff --git a/src/coreComponents/mesh/DomainPartition.hpp b/src/coreComponents/mesh/DomainPartition.hpp index 7a41174df1c..27cea17a2f4 100644 --- a/src/coreComponents/mesh/DomainPartition.hpp +++ b/src/coreComponents/mesh/DomainPartition.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/EdgeManager.cpp b/src/coreComponents/mesh/EdgeManager.cpp index 108676e1f25..9f3ed4fc3ca 100644 --- a/src/coreComponents/mesh/EdgeManager.cpp +++ b/src/coreComponents/mesh/EdgeManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/EdgeManager.hpp b/src/coreComponents/mesh/EdgeManager.hpp index 0eedb9a0870..26fc31f4108 100644 --- a/src/coreComponents/mesh/EdgeManager.hpp +++ b/src/coreComponents/mesh/EdgeManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ElementRegionBase.cpp b/src/coreComponents/mesh/ElementRegionBase.cpp index 305c111c59b..f28f8a3e6d3 100644 --- a/src/coreComponents/mesh/ElementRegionBase.cpp +++ b/src/coreComponents/mesh/ElementRegionBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ElementRegionBase.hpp b/src/coreComponents/mesh/ElementRegionBase.hpp index 15a46e407b9..b0dbe221b20 100644 --- a/src/coreComponents/mesh/ElementRegionBase.hpp +++ b/src/coreComponents/mesh/ElementRegionBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index b967a2b9e76..e4d3e9479c4 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ElementRegionManager.hpp b/src/coreComponents/mesh/ElementRegionManager.hpp index 9a75cbc164b..19ffdee08ad 100644 --- a/src/coreComponents/mesh/ElementRegionManager.hpp +++ b/src/coreComponents/mesh/ElementRegionManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ElementSubRegionBase.cpp b/src/coreComponents/mesh/ElementSubRegionBase.cpp index 41f236ef4f0..adf2a7b629d 100644 --- a/src/coreComponents/mesh/ElementSubRegionBase.cpp +++ b/src/coreComponents/mesh/ElementSubRegionBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ElementSubRegionBase.hpp b/src/coreComponents/mesh/ElementSubRegionBase.hpp index 1a77a06b5db..f4bd68e14f4 100644 --- a/src/coreComponents/mesh/ElementSubRegionBase.hpp +++ b/src/coreComponents/mesh/ElementSubRegionBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ElementType.hpp b/src/coreComponents/mesh/ElementType.hpp index 512ffea943d..5db51d7e319 100644 --- a/src/coreComponents/mesh/ElementType.hpp +++ b/src/coreComponents/mesh/ElementType.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp index 928cc8078f3..e1604631a07 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp index 636bb0e2824..ffdbd89f211 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp index d7101bfa3b8..055af644a79 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp index a0bf416d2a1..f9cf8d175f9 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/FaceElementSubRegion.cpp b/src/coreComponents/mesh/FaceElementSubRegion.cpp index 5bb44957630..90d2d7d4e49 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -64,7 +65,7 @@ FaceElementSubRegion::FaceElementSubRegion( string const & name, setDescription( "A map eventually containing all the collocated nodes." ). setSizedFromParent( 1 ); -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT +#ifdef GEOS_USE_SEPARATION_COEFFICIENT registerWrapper( viewKeyStruct::separationCoeffString(), &m_separationCoefficient ). setApplyDefaultValue( 0.0 ). setPlotLevel( dataRepository::PlotLevel::LEVEL_1 ). diff --git a/src/coreComponents/mesh/FaceElementSubRegion.hpp b/src/coreComponents/mesh/FaceElementSubRegion.hpp index 4823f96ce8b..709098260e5 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -176,7 +177,7 @@ class FaceElementSubRegion : public SurfaceElementSubRegion /// @return String key to collocated nodes buckets. static constexpr char const * elem2dToCollocatedNodesBucketsString() { return "elem2dToCollocatedNodesBuckets"; } -#if GEOSX_USE_SEPARATION_COEFFICIENT +#if GEOS_USE_SEPARATION_COEFFICIENT /// Separation coefficient string. constexpr static char const * separationCoeffString() { return "separationCoeff"; } /// dSepCoeffdAper string. @@ -224,7 +225,7 @@ class FaceElementSubRegion : public SurfaceElementSubRegion */ //virtual localIndex numNodesPerElement( localIndex const k ) const override { return m_toNodesRelation[k].size(); } -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT +#ifdef GEOS_USE_SEPARATION_COEFFICIENT /** * @brief Get separation coefficient. * @return the separation coefficient @@ -338,7 +339,7 @@ class FaceElementSubRegion : public SurfaceElementSubRegion */ ArrayOfArrays< array1d< globalIndex > > m_2dElemToCollocatedNodesBuckets; -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT +#ifdef GEOS_USE_SEPARATION_COEFFICIENT /// Separation coefficient array1d< real64 > m_separationCoefficient; #endif diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index 93ab06f4c64..a397986186c 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/FaceManager.hpp b/src/coreComponents/mesh/FaceManager.hpp index 1f8af884447..f20e0a068cf 100644 --- a/src/coreComponents/mesh/FaceManager.hpp +++ b/src/coreComponents/mesh/FaceManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/FieldIdentifiers.hpp b/src/coreComponents/mesh/FieldIdentifiers.hpp index b7a8fb6312b..77348072190 100644 --- a/src/coreComponents/mesh/FieldIdentifiers.hpp +++ b/src/coreComponents/mesh/FieldIdentifiers.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/InterObjectRelation.hpp b/src/coreComponents/mesh/InterObjectRelation.hpp index 08a4b1c126e..960b2b115ee 100644 --- a/src/coreComponents/mesh/InterObjectRelation.hpp +++ b/src/coreComponents/mesh/InterObjectRelation.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/MeshBody.cpp b/src/coreComponents/mesh/MeshBody.cpp index df7a3279116..a85c53b9559 100644 --- a/src/coreComponents/mesh/MeshBody.cpp +++ b/src/coreComponents/mesh/MeshBody.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/MeshBody.hpp b/src/coreComponents/mesh/MeshBody.hpp index be1992183ce..cb8d14242d6 100644 --- a/src/coreComponents/mesh/MeshBody.hpp +++ b/src/coreComponents/mesh/MeshBody.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/MeshFields.hpp b/src/coreComponents/mesh/MeshFields.hpp index f6b46623836..e7a2173f89b 100644 --- a/src/coreComponents/mesh/MeshFields.hpp +++ b/src/coreComponents/mesh/MeshFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/MeshForLoopInterface.hpp b/src/coreComponents/mesh/MeshForLoopInterface.hpp index 28df35fce77..8908f5fb65f 100644 --- a/src/coreComponents/mesh/MeshForLoopInterface.hpp +++ b/src/coreComponents/mesh/MeshForLoopInterface.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/MeshLevel.cpp b/src/coreComponents/mesh/MeshLevel.cpp index 6097bd0067e..2d64b919390 100644 --- a/src/coreComponents/mesh/MeshLevel.cpp +++ b/src/coreComponents/mesh/MeshLevel.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/MeshLevel.hpp b/src/coreComponents/mesh/MeshLevel.hpp index 727a9514cb0..88d6d9c505b 100644 --- a/src/coreComponents/mesh/MeshLevel.hpp +++ b/src/coreComponents/mesh/MeshLevel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/MeshManager.cpp b/src/coreComponents/mesh/MeshManager.cpp index d1e48b4f419..32c34f2216e 100644 --- a/src/coreComponents/mesh/MeshManager.cpp +++ b/src/coreComponents/mesh/MeshManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -137,14 +138,14 @@ void MeshManager::importFields( DomainPartition & domain ) for( auto const & pair : fieldsMapping ) { string const & meshFieldName = pair.first; - string const & geosxFieldName = pair.second; + string const & geosFieldName = pair.second; // Find destination - if( !subRegion.hasWrapper( geosxFieldName ) ) + if( !subRegion.hasWrapper( geosFieldName ) ) { // Skip - the user may have not enabled a particular physics model/solver on this destination region. if( generator.getLogLevel() >= 1 ) { - GEOS_LOG_RANK_0( "Skipping import of " << meshFieldName << " -> " << geosxFieldName << + GEOS_LOG_RANK_0( "Skipping import of " << meshFieldName << " -> " << geosFieldName << " on " << region.getName() << "/" << subRegion.getName() << " (field not found)" ); } @@ -152,16 +153,16 @@ void MeshManager::importFields( DomainPartition & domain ) } // Now that we know that the subRegion has this wrapper, - // we can add the geosxFieldName to the list of fields to synchronize - fieldsToBeSync.addElementFields( { geosxFieldName }, { region.getName() } ); - WrapperBase & wrapper = subRegion.getWrapperBase( geosxFieldName ); + // we can add the geosFieldName to the list of fields to synchronize + fieldsToBeSync.addElementFields( { geosFieldName }, { region.getName() } ); + WrapperBase & wrapper = subRegion.getWrapperBase( geosFieldName ); if( generator.getLogLevel() >= 1 ) { - GEOS_LOG_RANK_0( "Importing field " << meshFieldName << " into " << geosxFieldName << + GEOS_LOG_RANK_0( "Importing field " << meshFieldName << " into " << geosFieldName << " on " << region.getName() << "/" << subRegion.getName() ); } - bool const isMaterialField = materialWrapperNames.count( geosxFieldName ) > 0 && wrapper.numArrayDims() > 1; + bool const isMaterialField = materialWrapperNames.count( geosFieldName ) > 0 && wrapper.numArrayDims() > 1; generator.importFieldOnArray( block, subRegion.getName(), meshFieldName, isMaterialField, wrapper ); } }; diff --git a/src/coreComponents/mesh/MeshManager.hpp b/src/coreComponents/mesh/MeshManager.hpp index b7aac9276bc..889434fd70f 100644 --- a/src/coreComponents/mesh/MeshManager.hpp +++ b/src/coreComponents/mesh/MeshManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/MeshObjectPath.cpp b/src/coreComponents/mesh/MeshObjectPath.cpp index 992cc4755a3..2937097715c 100644 --- a/src/coreComponents/mesh/MeshObjectPath.cpp +++ b/src/coreComponents/mesh/MeshObjectPath.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/MeshObjectPath.hpp b/src/coreComponents/mesh/MeshObjectPath.hpp index 983fb822fc0..0586e47821f 100644 --- a/src/coreComponents/mesh/MeshObjectPath.hpp +++ b/src/coreComponents/mesh/MeshObjectPath.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/NodeManager.cpp b/src/coreComponents/mesh/NodeManager.cpp index 2bc39dc498f..a5d9ac2859e 100644 --- a/src/coreComponents/mesh/NodeManager.cpp +++ b/src/coreComponents/mesh/NodeManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/NodeManager.hpp b/src/coreComponents/mesh/NodeManager.hpp index 71c7439fca0..3393d99a583 100644 --- a/src/coreComponents/mesh/NodeManager.hpp +++ b/src/coreComponents/mesh/NodeManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ObjectManagerBase.cpp b/src/coreComponents/mesh/ObjectManagerBase.cpp index 074176c75fa..8cd4a22441c 100644 --- a/src/coreComponents/mesh/ObjectManagerBase.cpp +++ b/src/coreComponents/mesh/ObjectManagerBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ObjectManagerBase.hpp b/src/coreComponents/mesh/ObjectManagerBase.hpp index a85e87afa3f..e6002425699 100644 --- a/src/coreComponents/mesh/ObjectManagerBase.hpp +++ b/src/coreComponents/mesh/ObjectManagerBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ParticleManager.cpp b/src/coreComponents/mesh/ParticleManager.cpp index 0bbf3919cf1..6b7aa2c1705 100644 --- a/src/coreComponents/mesh/ParticleManager.cpp +++ b/src/coreComponents/mesh/ParticleManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ParticleManager.hpp b/src/coreComponents/mesh/ParticleManager.hpp index 0a6a8b58ddd..7cc967c1e83 100644 --- a/src/coreComponents/mesh/ParticleManager.hpp +++ b/src/coreComponents/mesh/ParticleManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file ParticleManager.hpp */ -#ifndef GEOSX_MESH_PARTICLEREGIONMANAGER_HPP -#define GEOSX_MESH_PARTICLEREGIONMANAGER_HPP +#ifndef GEOS_MESH_PARTICLEREGIONMANAGER_HPP +#define GEOS_MESH_PARTICLEREGIONMANAGER_HPP #include "generators/ParticleBlock.hpp" #include "generators/ParticleBlockManager.hpp" @@ -1518,4 +1519,4 @@ ParticleManager::constructFullConstitutiveAccessor( constitutive::ConstitutiveMa } } -#endif /* GEOSX_MESH_PARTICLEREGIONMANAGER_HPP */ +#endif /* GEOS_MESH_PARTICLEREGIONMANAGER_HPP */ diff --git a/src/coreComponents/mesh/ParticleRegion.cpp b/src/coreComponents/mesh/ParticleRegion.cpp index 1204ee5295c..cd15eba6388 100644 --- a/src/coreComponents/mesh/ParticleRegion.cpp +++ b/src/coreComponents/mesh/ParticleRegion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ParticleRegion.hpp b/src/coreComponents/mesh/ParticleRegion.hpp index 8d1f6df1736..22001a9afd9 100644 --- a/src/coreComponents/mesh/ParticleRegion.hpp +++ b/src/coreComponents/mesh/ParticleRegion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -17,8 +18,8 @@ * */ -#ifndef GEOSX_MESH_PARTICLEREGION_HPP_ -#define GEOSX_MESH_PARTICLEREGION_HPP_ +#ifndef GEOS_MESH_PARTICLEREGION_HPP_ +#define GEOS_MESH_PARTICLEREGION_HPP_ #include "ParticleRegionBase.hpp" @@ -132,4 +133,4 @@ class ParticleRegion : public ParticleRegionBase } /* namespace geos */ -#endif /* GEOSX_MESH_PARTICLEREGION_HPP_ */ +#endif /* GEOS_MESH_PARTICLEREGION_HPP_ */ diff --git a/src/coreComponents/mesh/ParticleRegionBase.cpp b/src/coreComponents/mesh/ParticleRegionBase.cpp index 3138b93d58d..90e3e8899bb 100644 --- a/src/coreComponents/mesh/ParticleRegionBase.cpp +++ b/src/coreComponents/mesh/ParticleRegionBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ParticleRegionBase.hpp b/src/coreComponents/mesh/ParticleRegionBase.hpp index 817327eaffd..5cea7fc28bc 100644 --- a/src/coreComponents/mesh/ParticleRegionBase.hpp +++ b/src/coreComponents/mesh/ParticleRegionBase.hpp @@ -2,18 +2,19 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ -#ifndef GEOSX_MESH_PARTICLEREGIONBASE_HPP -#define GEOSX_MESH_PARTICLEREGIONBASE_HPP +#ifndef GEOS_MESH_PARTICLEREGIONBASE_HPP +#define GEOS_MESH_PARTICLEREGIONBASE_HPP #include "ParticleSubRegion.hpp" #include "mesh/ObjectManagerBase.hpp" @@ -350,4 +351,4 @@ string_array ParticleRegionBase::getConstitutiveNames() const -#endif /* GEOSX_MESH_PARTICLEREGIONBASE_HPP */ +#endif /* GEOS_MESH_PARTICLEREGIONBASE_HPP */ diff --git a/src/coreComponents/mesh/ParticleSubRegion.cpp b/src/coreComponents/mesh/ParticleSubRegion.cpp index 738dcc9b392..ac4c54ba13e 100644 --- a/src/coreComponents/mesh/ParticleSubRegion.cpp +++ b/src/coreComponents/mesh/ParticleSubRegion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ParticleSubRegion.hpp b/src/coreComponents/mesh/ParticleSubRegion.hpp index ccd113ad299..816d35fc1bb 100644 --- a/src/coreComponents/mesh/ParticleSubRegion.hpp +++ b/src/coreComponents/mesh/ParticleSubRegion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -13,8 +14,8 @@ */ -#ifndef GEOSX_MESH_PARTICLEELEMENTSUBREGION_HPP_ -#define GEOSX_MESH_PARTICLEELEMENTSUBREGION_HPP_ +#ifndef GEOS_MESH_PARTICLEELEMENTSUBREGION_HPP_ +#define GEOS_MESH_PARTICLEELEMENTSUBREGION_HPP_ #include "mesh/generators/ParticleBlockABC.hpp" #include "mesh/utilities/ComputationalGeometry.hpp" @@ -141,4 +142,4 @@ class ParticleSubRegion : public ParticleSubRegionBase } /* namespace geos */ -#endif /* GEOSX_MESH_CELLELEMENTSUBREGION_HPP_ */ +#endif /* GEOS_MESH_CELLELEMENTSUBREGION_HPP_ */ diff --git a/src/coreComponents/mesh/ParticleSubRegionBase.cpp b/src/coreComponents/mesh/ParticleSubRegionBase.cpp index 6021839456c..8df97780b93 100644 --- a/src/coreComponents/mesh/ParticleSubRegionBase.cpp +++ b/src/coreComponents/mesh/ParticleSubRegionBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ParticleSubRegionBase.hpp b/src/coreComponents/mesh/ParticleSubRegionBase.hpp index 4db23951f57..81f35d638fd 100644 --- a/src/coreComponents/mesh/ParticleSubRegionBase.hpp +++ b/src/coreComponents/mesh/ParticleSubRegionBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file ParticleSubRegionBase.hpp */ -#ifndef GEOSX_MESH_PARTICLESUBREGIONBASE_HPP_ -#define GEOSX_MESH_PARTICLESUBREGIONBASE_HPP_ +#ifndef GEOS_MESH_PARTICLESUBREGIONBASE_HPP_ +#define GEOS_MESH_PARTICLESUBREGIONBASE_HPP_ #include "mesh/ParticleType.hpp" #include "mesh/ObjectManagerBase.hpp" @@ -483,4 +484,4 @@ class ParticleSubRegionBase : public ObjectManagerBase } /* namespace geos */ -#endif /* GEOSX_MESH_PARTICLESUBREGIONBASE_HPP_ */ +#endif /* GEOS_MESH_PARTICLESUBREGIONBASE_HPP_ */ diff --git a/src/coreComponents/mesh/ParticleType.hpp b/src/coreComponents/mesh/ParticleType.hpp index f39a6dd2559..da32741848e 100644 --- a/src/coreComponents/mesh/ParticleType.hpp +++ b/src/coreComponents/mesh/ParticleType.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file ParticleType.hpp */ -#ifndef GEOSX_MESH_PARTICLETYPE_HPP -#define GEOSX_MESH_PARTICLETYPE_HPP +#ifndef GEOS_MESH_PARTICLETYPE_HPP +#define GEOS_MESH_PARTICLETYPE_HPP #include "codingUtilities/EnumStrings.hpp" @@ -44,4 +45,4 @@ ENUM_STRINGS( ParticleType, } // namespace geos -#endif //GEOSX_MESH_PARTICLETYPE_HPP +#endif //GEOS_MESH_PARTICLETYPE_HPP diff --git a/src/coreComponents/mesh/Perforation.cpp b/src/coreComponents/mesh/Perforation.cpp index e644ddf639b..2d642976d0b 100644 --- a/src/coreComponents/mesh/Perforation.cpp +++ b/src/coreComponents/mesh/Perforation.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/Perforation.hpp b/src/coreComponents/mesh/Perforation.hpp index d6780059ae3..f9508bd7d3b 100644 --- a/src/coreComponents/mesh/Perforation.hpp +++ b/src/coreComponents/mesh/Perforation.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/PerforationData.cpp b/src/coreComponents/mesh/PerforationData.cpp index e7453add682..46dc019226d 100644 --- a/src/coreComponents/mesh/PerforationData.cpp +++ b/src/coreComponents/mesh/PerforationData.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/PerforationData.hpp b/src/coreComponents/mesh/PerforationData.hpp index 0c3a4828e03..e380bfbc09d 100644 --- a/src/coreComponents/mesh/PerforationData.hpp +++ b/src/coreComponents/mesh/PerforationData.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/PerforationFields.hpp b/src/coreComponents/mesh/PerforationFields.hpp index 43451e8ec04..d0bf35bf469 100644 --- a/src/coreComponents/mesh/PerforationFields.hpp +++ b/src/coreComponents/mesh/PerforationFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/SurfaceElementRegion.cpp b/src/coreComponents/mesh/SurfaceElementRegion.cpp index 8d5b0b167e3..f9cc97e0b98 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/SurfaceElementRegion.hpp b/src/coreComponents/mesh/SurfaceElementRegion.hpp index c00ea71af46..f011e6ebf45 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp index 23c7e59eee6..920f7389502 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp index 1462a12aa83..208ea2ff90b 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ToElementRelation.cpp b/src/coreComponents/mesh/ToElementRelation.cpp index dda022be675..ef7125eb430 100644 --- a/src/coreComponents/mesh/ToElementRelation.cpp +++ b/src/coreComponents/mesh/ToElementRelation.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ToElementRelation.hpp b/src/coreComponents/mesh/ToElementRelation.hpp index 458b681c66e..aa13e898aa0 100644 --- a/src/coreComponents/mesh/ToElementRelation.hpp +++ b/src/coreComponents/mesh/ToElementRelation.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ToParticleRelation.cpp b/src/coreComponents/mesh/ToParticleRelation.cpp index 4d402251253..e2d927911ca 100644 --- a/src/coreComponents/mesh/ToParticleRelation.cpp +++ b/src/coreComponents/mesh/ToParticleRelation.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/ToParticleRelation.hpp b/src/coreComponents/mesh/ToParticleRelation.hpp index 6e32a26dd88..015b41a3605 100644 --- a/src/coreComponents/mesh/ToParticleRelation.hpp +++ b/src/coreComponents/mesh/ToParticleRelation.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file ToParticleRelation.hpp */ -#ifndef GEOSX_MESH_TOPARTICLERELATION_HPP_ -#define GEOSX_MESH_TOPARTICLERELATION_HPP_ +#ifndef GEOS_MESH_TOPARTICLERELATION_HPP_ +#define GEOS_MESH_TOPARTICLERELATION_HPP_ #include "InterObjectRelation.hpp" @@ -185,4 +186,4 @@ void reserveNeighbors( OrderedVariableToManyParticleRelation & relation, } /* namespace geos */ -#endif /* GEOSX_MESH_TOPARTICLERELATION_HPP_ */ +#endif /* GEOS_MESH_TOPARTICLERELATION_HPP_ */ diff --git a/src/coreComponents/mesh/WellElementRegion.cpp b/src/coreComponents/mesh/WellElementRegion.cpp index 00e53298651..f0781163c2d 100644 --- a/src/coreComponents/mesh/WellElementRegion.cpp +++ b/src/coreComponents/mesh/WellElementRegion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/WellElementRegion.hpp b/src/coreComponents/mesh/WellElementRegion.hpp index c3416030931..1ca22d96a78 100644 --- a/src/coreComponents/mesh/WellElementRegion.hpp +++ b/src/coreComponents/mesh/WellElementRegion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/WellElementSubRegion.cpp b/src/coreComponents/mesh/WellElementSubRegion.cpp index f6046b802c4..5dd03f5d1c5 100644 --- a/src/coreComponents/mesh/WellElementSubRegion.cpp +++ b/src/coreComponents/mesh/WellElementSubRegion.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/WellElementSubRegion.hpp b/src/coreComponents/mesh/WellElementSubRegion.hpp index 9155ed79139..da1049fdffe 100644 --- a/src/coreComponents/mesh/WellElementSubRegion.hpp +++ b/src/coreComponents/mesh/WellElementSubRegion.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/CellBlock.cpp b/src/coreComponents/mesh/generators/CellBlock.cpp index 91aea8b2c2f..53ec1898ff8 100644 --- a/src/coreComponents/mesh/generators/CellBlock.cpp +++ b/src/coreComponents/mesh/generators/CellBlock.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/CellBlock.hpp b/src/coreComponents/mesh/generators/CellBlock.hpp index 01fa2124bd8..6d48327aaf0 100644 --- a/src/coreComponents/mesh/generators/CellBlock.hpp +++ b/src/coreComponents/mesh/generators/CellBlock.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/CellBlockABC.hpp b/src/coreComponents/mesh/generators/CellBlockABC.hpp index fadde416894..4f39058122f 100644 --- a/src/coreComponents/mesh/generators/CellBlockABC.hpp +++ b/src/coreComponents/mesh/generators/CellBlockABC.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/CellBlockManager.cpp b/src/coreComponents/mesh/generators/CellBlockManager.cpp index 4c18351d70b..f18d3546793 100644 --- a/src/coreComponents/mesh/generators/CellBlockManager.cpp +++ b/src/coreComponents/mesh/generators/CellBlockManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/CellBlockManager.hpp b/src/coreComponents/mesh/generators/CellBlockManager.hpp index 517e7f61f0f..028a15c1711 100644 --- a/src/coreComponents/mesh/generators/CellBlockManager.hpp +++ b/src/coreComponents/mesh/generators/CellBlockManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp b/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp index d32f994a52e..b6317eef2da 100644 --- a/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp +++ b/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/CellBlockUtilities.cpp b/src/coreComponents/mesh/generators/CellBlockUtilities.cpp index d29fadbc5ef..a58ef5a40b8 100644 --- a/src/coreComponents/mesh/generators/CellBlockUtilities.cpp +++ b/src/coreComponents/mesh/generators/CellBlockUtilities.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/CellBlockUtilities.hpp b/src/coreComponents/mesh/generators/CellBlockUtilities.hpp index 3db5a67d4ed..e8e3ea9a43d 100644 --- a/src/coreComponents/mesh/generators/CellBlockUtilities.hpp +++ b/src/coreComponents/mesh/generators/CellBlockUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/CollocatedNodes.cpp b/src/coreComponents/mesh/generators/CollocatedNodes.cpp index 4351294fee2..797ba1f4477 100644 --- a/src/coreComponents/mesh/generators/CollocatedNodes.cpp +++ b/src/coreComponents/mesh/generators/CollocatedNodes.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/CollocatedNodes.hpp b/src/coreComponents/mesh/generators/CollocatedNodes.hpp index e028569b054..4356057fee4 100644 --- a/src/coreComponents/mesh/generators/CollocatedNodes.hpp +++ b/src/coreComponents/mesh/generators/CollocatedNodes.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp index 97ef2424bfe..b28cbdd405b 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp index 4e24164f794..fe918574461 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/FaceBlock.cpp b/src/coreComponents/mesh/generators/FaceBlock.cpp index b7b701479d3..ecd7cb3505c 100644 --- a/src/coreComponents/mesh/generators/FaceBlock.cpp +++ b/src/coreComponents/mesh/generators/FaceBlock.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/FaceBlock.hpp b/src/coreComponents/mesh/generators/FaceBlock.hpp index 5788cf0d154..060e8d4888f 100644 --- a/src/coreComponents/mesh/generators/FaceBlock.hpp +++ b/src/coreComponents/mesh/generators/FaceBlock.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/FaceBlockABC.hpp b/src/coreComponents/mesh/generators/FaceBlockABC.hpp index fb4bc201e07..b5679f29aa2 100644 --- a/src/coreComponents/mesh/generators/FaceBlockABC.hpp +++ b/src/coreComponents/mesh/generators/FaceBlockABC.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index 120d48a888d..d8340b7b94b 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp index 26970e8dfbd..50b23142d8f 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp index e598ce6d522..0fb5ef5e009 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.hpp b/src/coreComponents/mesh/generators/InternalWellGenerator.hpp index 0d28d14e7a3..18db52fac66 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp index 29b0cdc5a31..641dfbf9835 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp index d57b05b96bf..22061da1536 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/LineBlock.cpp b/src/coreComponents/mesh/generators/LineBlock.cpp index 05b655657b6..38c678f0d7d 100644 --- a/src/coreComponents/mesh/generators/LineBlock.cpp +++ b/src/coreComponents/mesh/generators/LineBlock.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/LineBlock.hpp b/src/coreComponents/mesh/generators/LineBlock.hpp index d81463dd4a3..67d265cf02c 100644 --- a/src/coreComponents/mesh/generators/LineBlock.hpp +++ b/src/coreComponents/mesh/generators/LineBlock.hpp @@ -2,18 +2,19 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ -#ifndef GEOSX_WELLBLOCK_HPP -#define GEOSX_WELLBLOCK_HPP +#ifndef GEOS_WELLBLOCK_HPP +#define GEOS_WELLBLOCK_HPP #include "mesh/generators/LineBlockABC.hpp" diff --git a/src/coreComponents/mesh/generators/LineBlockABC.hpp b/src/coreComponents/mesh/generators/LineBlockABC.hpp index 723aaa69f7e..35e4b5dd9a8 100644 --- a/src/coreComponents/mesh/generators/LineBlockABC.hpp +++ b/src/coreComponents/mesh/generators/LineBlockABC.hpp @@ -2,18 +2,19 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ -#ifndef GEOSX_WELLBLOCKABC_HPP -#define GEOSX_WELLBLOCKABC_HPP +#ifndef GEOS_WELLBLOCKABC_HPP +#define GEOS_WELLBLOCKABC_HPP #include "dataRepository/Group.hpp" #include "common/DataTypes.hpp" @@ -165,4 +166,4 @@ class LineBlockABC : public dataRepository::Group } -#endif //GEOSX_WELLBLOCKABC_HPP +#endif //GEOS_WELLBLOCKABC_HPP diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp index e085887ef3f..853ef2dc54e 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp index 48b97d15280..b7f8fbf2e2b 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/PTScotchInterface.cpp b/src/coreComponents/mesh/generators/PTScotchInterface.cpp index 72e64b0aa95..4ca55bca819 100644 --- a/src/coreComponents/mesh/generators/PTScotchInterface.cpp +++ b/src/coreComponents/mesh/generators/PTScotchInterface.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/PTScotchInterface.hpp b/src/coreComponents/mesh/generators/PTScotchInterface.hpp index 23999876031..a9d96589975 100644 --- a/src/coreComponents/mesh/generators/PTScotchInterface.hpp +++ b/src/coreComponents/mesh/generators/PTScotchInterface.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/ParMETISInterface.cpp b/src/coreComponents/mesh/generators/ParMETISInterface.cpp index 25a30543296..fb1baca35a4 100644 --- a/src/coreComponents/mesh/generators/ParMETISInterface.cpp +++ b/src/coreComponents/mesh/generators/ParMETISInterface.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/ParMETISInterface.hpp b/src/coreComponents/mesh/generators/ParMETISInterface.hpp index 533f78c5cea..fa23df5834b 100644 --- a/src/coreComponents/mesh/generators/ParMETISInterface.hpp +++ b/src/coreComponents/mesh/generators/ParMETISInterface.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/ParticleBlock.cpp b/src/coreComponents/mesh/generators/ParticleBlock.cpp index 2d3b605ad9e..f16c6b984ac 100644 --- a/src/coreComponents/mesh/generators/ParticleBlock.cpp +++ b/src/coreComponents/mesh/generators/ParticleBlock.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/ParticleBlock.hpp b/src/coreComponents/mesh/generators/ParticleBlock.hpp index 333fb196ae3..bbe69fce018 100644 --- a/src/coreComponents/mesh/generators/ParticleBlock.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlock.hpp @@ -2,18 +2,19 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ -#ifndef GEOSX_MESH_PARTICLEBLOCK_HPP_ -#define GEOSX_MESH_PARTICLEBLOCK_HPP_ +#ifndef GEOS_MESH_PARTICLEBLOCK_HPP_ +#define GEOS_MESH_PARTICLEBLOCK_HPP_ #include "mesh/generators/ParticleBlockABC.hpp" #include "mesh/ParticleType.hpp" @@ -271,4 +272,4 @@ class ParticleBlock : public ParticleBlockABC } -#endif /* GEOSX_MESH_CELLBLOCK_HPP_ */ +#endif /* GEOS_MESH_CELLBLOCK_HPP_ */ diff --git a/src/coreComponents/mesh/generators/ParticleBlockABC.hpp b/src/coreComponents/mesh/generators/ParticleBlockABC.hpp index 17c232b1d60..d2e68d4ae4c 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockABC.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockABC.hpp @@ -2,18 +2,19 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ -#ifndef GEOSX_PARTICLEBLOCKABC_HPP -#define GEOSX_PARTICLEBLOCKABC_HPP +#ifndef GEOS_PARTICLEBLOCKABC_HPP +#define GEOS_PARTICLEBLOCKABC_HPP #include "mesh/ParticleType.hpp" @@ -169,4 +170,4 @@ class ParticleBlockABC : public dataRepository::Group } -#endif //GEOSX_CELLBLOCKABC_HPP +#endif //GEOS_CELLBLOCKABC_HPP diff --git a/src/coreComponents/mesh/generators/ParticleBlockManager.cpp b/src/coreComponents/mesh/generators/ParticleBlockManager.cpp index d5c4beeddb3..a7e954ec3bf 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManager.cpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/ParticleBlockManager.hpp b/src/coreComponents/mesh/generators/ParticleBlockManager.hpp index c47bafb048f..f3e349cc20b 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManager.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file ParticleBlockManager.hpp */ -#ifndef GEOSX_MESH_PARTICLEBLOCKMANAGER_H_ -#define GEOSX_MESH_PARTICLEBLOCKMANAGER_H_ +#ifndef GEOS_MESH_PARTICLEBLOCKMANAGER_H_ +#define GEOS_MESH_PARTICLEBLOCKMANAGER_H_ #include "mesh/generators/ParticleBlock.hpp" #include "mesh/generators/ParticleBlockManagerABC.hpp" @@ -110,4 +111,4 @@ class ParticleBlockManager : public ParticleBlockManagerABC }; } -#endif /* GEOSX_MESH_PARTICLEBLOCKMANAGER_H_ */ +#endif /* GEOS_MESH_PARTICLEBLOCKMANAGER_H_ */ diff --git a/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp b/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp index 4f6f5579bf6..6675d340a30 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp @@ -2,18 +2,19 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ -#ifndef GEOSX_PARTICLEBLOCKMANAGERABC_HPP -#define GEOSX_PARTICLEBLOCKMANAGERABC_HPP +#ifndef GEOS_PARTICLEBLOCKMANAGERABC_HPP +#define GEOS_PARTICLEBLOCKMANAGERABC_HPP #include "dataRepository/Group.hpp" #include "common/DataTypes.hpp" diff --git a/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp b/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp index 8ad68e24666..c1ed1be5f13 100644 --- a/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp index 744762aedfa..9d9209de82e 100644 --- a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file ParticleMeshGenerator.hpp */ -#ifndef GEOSX_MESH_GENERATORS_PARTICLEMESHGENERATOR_HPP -#define GEOSX_MESH_GENERATORS_PARTICLEMESHGENERATOR_HPP +#ifndef GEOS_MESH_GENERATORS_PARTICLEMESHGENERATOR_HPP +#define GEOS_MESH_GENERATORS_PARTICLEMESHGENERATOR_HPP #include "mesh/generators/MeshGeneratorBase.hpp" @@ -111,4 +112,4 @@ class ParticleMeshGenerator : public MeshGeneratorBase } /* namespace geos */ -#endif /* GEOSX_MESH_GENERATORS_PARTICLEMESHGENERATOR_HPP */ +#endif /* GEOS_MESH_GENERATORS_PARTICLEMESHGENERATOR_HPP */ diff --git a/src/coreComponents/mesh/generators/PartitionDescriptor.hpp b/src/coreComponents/mesh/generators/PartitionDescriptor.hpp index 5e4ad6b782f..8ed58ea17e1 100644 --- a/src/coreComponents/mesh/generators/PartitionDescriptor.hpp +++ b/src/coreComponents/mesh/generators/PartitionDescriptor.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file PartitionDescriptor.hpp */ -#ifndef GEOSX_MESH_PARTITIONDESCRIPTOR_H_ -#define GEOSX_MESH_PARTITIONDESCRIPTOR_H_ +#ifndef GEOS_MESH_PARTITIONDESCRIPTOR_H_ +#define GEOS_MESH_PARTITIONDESCRIPTOR_H_ #include "mesh/mpiCommunications/SpatialPartition.hpp" @@ -94,4 +95,4 @@ class PartitionDescriptor }; } -#endif /* GEOSX_MESH_PARTITIONDESCRIPTOR_H_ */ +#endif /* GEOS_MESH_PARTITIONDESCRIPTOR_H_ */ diff --git a/src/coreComponents/mesh/generators/PrismUtilities.hpp b/src/coreComponents/mesh/generators/PrismUtilities.hpp index d6a4a359f98..2b1568070ac 100644 --- a/src/coreComponents/mesh/generators/PrismUtilities.hpp +++ b/src/coreComponents/mesh/generators/PrismUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp index 9b7cddf3c0c..d9d32c22a21 100644 --- a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp index f812949c117..8168f31631f 100644 --- a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp +++ b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2020- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp index b45ed3f9e30..1fe06c4aebc 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp index 3fae5d6d343..46e5fc54ecb 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp index c7d067777bd..ece2aade3d5 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp index 04ca9af0ee3..8d368dd0d67 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp +++ b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/VTKUtilities.cpp b/src/coreComponents/mesh/generators/VTKUtilities.cpp index 5fd230acdf3..757e9d92518 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -18,7 +19,7 @@ #include "mesh/generators/VTKUtilities.hpp" #include "mesh/generators/ParMETISInterface.hpp" -#ifdef GEOSX_USE_SCOTCH +#ifdef GEOS_USE_SCOTCH #include "mesh/generators/PTScotchInterface.hpp" #endif @@ -60,7 +61,7 @@ #include #include -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI #include #include #else @@ -401,7 +402,7 @@ splitMeshByPartition( vtkSmartPointer< vtkDataSet > mesh, vtkSmartPointer< vtkMultiProcessController > getController() { -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI vtkNew< vtkMPIController > controller; vtkMPICommunicatorOpaqueComm vtkGeosxComm( &MPI_COMM_GEOSX ); vtkNew< vtkMPICommunicator > communicator; @@ -641,7 +642,7 @@ AllMeshes redistributeByCellGraph( AllMeshes & input, } case PartitionMethod::ptscotch: { -#ifdef GEOSX_USE_SCOTCH +#ifdef GEOS_USE_SCOTCH GEOS_WARNING_IF( numRefinements > 0, "Partition refinement is not supported by 'ptscotch' partitioning method" ); return ptscotch::partition( graph.toViewConst(), numRanks, comm ); #else @@ -973,7 +974,7 @@ redistributeMeshes( integer const logLevel, * @brief Identify the GEOSX type of the polyhedron * * @param cell The vtk cell VTK_POLYHEDRON - * @return The geosx element type associated to VTK_POLYHEDRON + * @return The geos element type associated to VTK_POLYHEDRON */ geos::ElementType buildGeosxPolyhedronType( vtkCell * const cell ) { @@ -1698,7 +1699,7 @@ std::vector< int > getVtkToGeosxNodeOrdering( ElementType const elemType ) case ElementType::Prism6: return { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; default: { - GEOS_ERROR( "Cannot get vtk to geosx node ordering based on geosx element type " << elemType ); + GEOS_ERROR( "Cannot get vtk to geos node ordering based on geos element type " << elemType ); break; } } @@ -1722,7 +1723,7 @@ std::vector< int > getVtkToGeosxNodeOrdering( VTKCellType const vtkType ) case VTK_HEXAGONAL_PRISM: return getVtkToGeosxNodeOrdering( ElementType::Prism6 ); default: { - GEOS_ERROR( "Cannot get vtk to geosx node ordering based on vtk cell type " << vtkType ); + GEOS_ERROR( "Cannot get vtk to geos node ordering based on vtk cell type " << vtkType ); break; } } diff --git a/src/coreComponents/mesh/generators/VTKUtilities.hpp b/src/coreComponents/mesh/generators/VTKUtilities.hpp index 6f8e97a2180..fc05b8fb6ae 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.hpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/VTKWellGenerator.cpp b/src/coreComponents/mesh/generators/VTKWellGenerator.cpp index 3ea92f78551..37555ecb5c3 100644 --- a/src/coreComponents/mesh/generators/VTKWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKWellGenerator.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/VTKWellGenerator.hpp b/src/coreComponents/mesh/generators/VTKWellGenerator.hpp index 2c9b265143e..04781491ed5 100644 --- a/src/coreComponents/mesh/generators/VTKWellGenerator.hpp +++ b/src/coreComponents/mesh/generators/VTKWellGenerator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/WellGeneratorABC.hpp b/src/coreComponents/mesh/generators/WellGeneratorABC.hpp index e1b879de296..e5a0d1d661d 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorABC.hpp +++ b/src/coreComponents/mesh/generators/WellGeneratorABC.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index 896d6d6fa9b..55613fc29a2 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp index b1d1e229784..a2c05b5c280 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/CommID.cpp b/src/coreComponents/mesh/mpiCommunications/CommID.cpp index 0976c0e7950..b7150525b3d 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommID.cpp +++ b/src/coreComponents/mesh/mpiCommunications/CommID.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/CommID.hpp b/src/coreComponents/mesh/mpiCommunications/CommID.hpp index 7c904234f07..9caf6a0dfeb 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommID.hpp +++ b/src/coreComponents/mesh/mpiCommunications/CommID.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp index 6562b8ffa07..28fb16dcd67 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp +++ b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp index 508291b5466..70542051f38 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp +++ b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp index bce3d4ba45e..d6333d80c34 100644 --- a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp +++ b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp index 06c29dec8f9..f9928a41fcc 100644 --- a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp +++ b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp index 883105a2645..a645d8e6a1b 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp index 6a32bca6835..dc4b021066f 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp b/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp index f0727d92744..89eab298f6b 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp b/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp index 3b93ce43722..0452392ba1d 100644 --- a/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp +++ b/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp b/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp index 1e78e0af01d..4193244d8a0 100644 --- a/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp +++ b/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp index 4fc9a7ff672..4d39a84b76c 100644 --- a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp +++ b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp index 2f0a12622e6..ac097bd7aa5 100644 --- a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp +++ b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp index 7c3a5c6515e..66936e9a260 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp index f608fa4e594..b587777bdd4 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp index 7bbf1223733..77391c498e2 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -85,4 +86,4 @@ bool CustomPolarObject::isCoordInObject( real64 const ( &coord ) [3] ) const REGISTER_CATALOG_ENTRY( SimpleGeometricObjectBase, CustomPolarObject, string const &, Group * const ) -} /* namespace geosx */ +} /* namespace geos */ diff --git a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp index fa229a8c35b..ffa3f11225c 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file CustomPolarObject.hpp */ -#ifndef GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_CUSTOMPOLAROBJECT_HPP_ -#define GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_CUSTOMPOLAROBJECT_HPP_ +#ifndef GEOS_MESH_SIMPLEGEOMETRICOBJECTS_CUSTOMPOLAROBJECT_HPP_ +#define GEOS_MESH_SIMPLEGEOMETRICOBJECTS_CUSTOMPOLAROBJECT_HPP_ #include "PlanarGeometricObject.hpp" @@ -139,6 +140,6 @@ class CustomPolarObject : public PlanarGeometricObject /// @endcond }; -} /* namespace geosx */ +} /* namespace geos */ -#endif /* GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_CustomPolarObject_HPP_*/ +#endif /* GEOS_MESH_SIMPLEGEOMETRICOBJECTS_CustomPolarObject_HPP_*/ diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp index ff344c6901a..616311f1fc9 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp index 5fb15c5ef7d..d90b0a48ca9 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp index e30701acf08..c2dd3e56300 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -81,4 +82,4 @@ bool Disc::isCoordInObject( real64 const ( &coord ) [3] ) const REGISTER_CATALOG_ENTRY( SimpleGeometricObjectBase, Disc, string const &, Group * const ) -} /* namespace geosx */ +} /* namespace geos */ diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp index 0ad2e2c7e84..6cb684237e9 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file Disc.hpp */ -#ifndef GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_DISC_HPP_ -#define GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_DISC_HPP_ +#ifndef GEOS_MESH_SIMPLEGEOMETRICOBJECTS_DISC_HPP_ +#define GEOS_MESH_SIMPLEGEOMETRICOBJECTS_DISC_HPP_ #include "PlanarGeometricObject.hpp" @@ -112,6 +113,6 @@ class Disc : public PlanarGeometricObject /// @endcond }; -} /* namespace geosx */ +} /* namespace geos */ -#endif /* GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_DISC_HPP_*/ +#endif /* GEOS_MESH_SIMPLEGEOMETRICOBJECTS_DISC_HPP_*/ diff --git a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp index 4eda186c373..444ce7c003d 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp index bb02a280045..7dad76f3e8e 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp index 857cccc2a78..ef377d81b1d 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -47,4 +48,4 @@ PlanarGeometricObject::~PlanarGeometricObject() //REGISTER_CATALOG_ENTRY( SimpleGeometricObjectBase, PlanarGeometricObject, string const &, Group * const ) -} /* namespace geosx */ +} /* namespace geos */ diff --git a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp index 417f3da27b5..49c7a18f05c 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file PlanarGeometricObject.hpp */ -#ifndef GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_PLANARGEOMETRICOBJECT_HPP_ -#define GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_PLANARGEOMETRICOBJECT_HPP_ +#ifndef GEOS_MESH_SIMPLEGEOMETRICOBJECTS_PLANARGEOMETRICOBJECT_HPP_ +#define GEOS_MESH_SIMPLEGEOMETRICOBJECTS_PLANARGEOMETRICOBJECT_HPP_ #include "SimpleGeometricObjectBase.hpp" @@ -147,6 +148,6 @@ class PlanarGeometricObject : public SimpleGeometricObjectBase /// @endcond }; -} /* namespace geosx */ +} /* namespace geos */ -#endif /* GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_PLANARGEOMETRICOBJECT_HPP_*/ +#endif /* GEOS_MESH_SIMPLEGEOMETRICOBJECTS_PLANARGEOMETRICOBJECT_HPP_*/ diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp index cb0b25f94f8..2346b764dff 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -170,4 +171,4 @@ bool Rectangle::isCoordInObject( real64 const ( &coord ) [3] ) const REGISTER_CATALOG_ENTRY( SimpleGeometricObjectBase, Rectangle, string const &, Group * const ) -} /* namespace geosx */ +} /* namespace geos */ diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp index 359eafc16f8..102b84881a2 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file Rectangle.hpp */ -#ifndef GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_RECTANGLE_HPP_ -#define GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_RECTANGLE_HPP_ +#ifndef GEOS_MESH_SIMPLEGEOMETRICOBJECTS_RECTANGLE_HPP_ +#define GEOS_MESH_SIMPLEGEOMETRICOBJECTS_RECTANGLE_HPP_ #include "PlanarGeometricObject.hpp" @@ -134,6 +135,6 @@ class Rectangle : public PlanarGeometricObject /// @endcond }; -} /* namespace geosx */ +} /* namespace geos */ -#endif /* GEOSX_MESH_SIMPLEGEOMETRICOBJECTS_RECTANGLE_HPP_*/ +#endif /* GEOS_MESH_SIMPLEGEOMETRICOBJECTS_RECTANGLE_HPP_*/ diff --git a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp index 937852766bc..fc4a73fe74c 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp index 099e3d7d3da..af81576df1e 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp index b81e8613d21..7e7d355d07b 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp index 676a4cf4f2c..1d991ad35de 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp b/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp index fe47cc598e4..1c832828d1d 100644 --- a/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp +++ b/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp b/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp index e9aeac97e9f..a3c275ced62 100644 --- a/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp +++ b/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp b/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp index 5a20bb6e2a0..dc0458c1452 100644 --- a/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp +++ b/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp b/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp index 3530d3eb590..4d723e1b7af 100644 --- a/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp +++ b/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp b/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp index 1a5d56ac8a5..06534e34387 100644 --- a/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp +++ b/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp b/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp index c1e76c69d9c..512a2dcf596 100644 --- a/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp +++ b/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp index 859d7e174f3..0227bd7d28b 100644 --- a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp +++ b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp b/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp index dabfb7cd03b..477ec52accc 100644 --- a/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp +++ b/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp b/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp index 02f530b2d0e..71fc7a0ee1d 100644 --- a/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp +++ b/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index 10cc92b20e3..d383138e147 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -249,7 +249,7 @@ blt_add_library( NAME physicsSolvers SOURCES ${physicsSolvers_sources} HEADERS ${physicsSolvers_headers} DEPENDS_ON ${dependencyList} ${externalComponentDeps} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} ) + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( physicsSolvers PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) if( externalComponentDeps ) diff --git a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp index ff692298342..5edf76ab710 100644 --- a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp +++ b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp index 740c5cb29a0..61895d45695 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp index 1f182827ec1..9b86f6c14f1 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp index 9cc659715ca..b7878d79081 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp index 85c217a6a8b..98bdcce95a8 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp index 8ae4e8d8145..dbe465b4709 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp b/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp index 7b8f5b99cd2..bbe9f3dfad9 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index 18fe7b4a680..b082c20140f 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -21,7 +22,7 @@ #include "math/interpolation/Interpolation.hpp" #include "common/Timer.hpp" -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) #include "python/PySolverType.hpp" #endif @@ -1402,7 +1403,7 @@ void SolverBase::saveSequentialIterationState( DomainPartition & GEOS_UNUSED_PAR GEOS_ERROR( "Call to SolverBase::saveSequentialIterationState. Method should be overloaded by the solver" ); } -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) PyTypeObject * SolverBase::getPythonType() const { return python::getPySolverType(); } #endif diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index 0e12ec9dcec..b2f9b45d815 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -740,7 +741,7 @@ class SolverBase : public ExecutableGroup * @brief Return PySolver type. * @return Return PySolver type. */ -#if defined(GEOSX_USE_PYGEOSX) +#if defined(GEOS_USE_PYGEOSX) virtual PyTypeObject * getPythonType() const override; #endif diff --git a/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp b/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp index 6e635ca3ed7..fe51db4f353 100644 --- a/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/SolverStatistics.cpp b/src/coreComponents/physicsSolvers/SolverStatistics.cpp index f3687b46042..faacc8c446c 100644 --- a/src/coreComponents/physicsSolvers/SolverStatistics.cpp +++ b/src/coreComponents/physicsSolvers/SolverStatistics.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/SolverStatistics.hpp b/src/coreComponents/physicsSolvers/SolverStatistics.hpp index 964cbc078ca..647bb40756c 100644 --- a/src/coreComponents/physicsSolvers/SolverStatistics.hpp +++ b/src/coreComponents/physicsSolvers/SolverStatistics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp index 748eb55f1d2..f0d57887244 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index d45ddd77e9b..bdf4ce38be4 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp index eaf0f35501d..1c4cf695ae6 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp index 5c3052a8ae7..3235bca00c6 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp index 4c2e84c2a10..66916182df5 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp index c313ef6570e..60263a49390 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp index ab9c9fab0b9..8fe9bdd0122 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp index 70205741edd..e737731a093 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -77,6 +78,6 @@ void assembleStrainOperator( real64 ( & strainMatrix )[I_SIZE][J_SIZE], } // solidMechanicsALMKernelsHelper -} // geosx +} // geos #endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSHELPER_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp index 7f73a773bda..0da8a5c9a5a 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp index 688837ac9fc..5a6ac7c2fec 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp index 6d50dde371f..d22bd0a1fb7 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp index 9bb7a3702dd..9be74bf112f 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp index 0697e48fe4a..1664089d4c4 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp index 3045af31adf..acb25833db1 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -148,7 +149,7 @@ void assembleEquilibriumOperator( real64 ( & eqMatrix )[3][6], } } -} // geosx +} // geos #endif /* SRC_CORECOMPONENTS_PHYSICSSOLVERS_CONTACT_EFEMKERNELSHELPER_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp index 0223c214d8b..4203daaf701 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index a86adc24351..db31219f1aa 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index 50ffb55af03..e4cf9d874b5 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 4e5bd37fc44..d4d537ab405 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,7 +17,7 @@ * @file SolidMechanicsLagrangeContact.cpp * */ -#define GEOSX_DISPATCH_VEM +#define GEOS_DISPATCH_VEM #include "SolidMechanicsLagrangeContact.hpp" #include "common/TimingMacros.hpp" diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index 626b626703f..5a73c99c679 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 7a3ac6e99f1..5510d1b2c98 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index b58fd130c88..036a32095e8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp index 2c687f7dfb8..8e57ab8f617 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 3245cb8df57..423619e2ad4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp index 6baa8d22ea6..f29bfcf464f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index f7db21f60d6..a7e7fe25fd5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -33,7 +34,7 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp" /** - * @namespace the geosx namespace that encapsulates the majority of the code + * @namespace the geos namespace that encapsulates the majority of the code */ namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp index 428fc115a06..5d1a749c72f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp index 3405e5cdd6d..fe0b452865e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp index 3c07c9a99bf..b0a12568c7a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp index e2326f63b26..0573858876d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp index a377ff84686..51bac86d928 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp index 12aca3a1227..8803d2fc966 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp index 54cf3fb9ed9..10b42f0e79a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 3c8554d6c4d..5d78d6ceae5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index 0d6f795ffc8..ef97e9a7fb8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp index 59b9975dde6..a7abfd841af 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp index 98ade87b7e7..3935cbfeb69 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file FlowSolverBaseKernels.hpp */ -#ifndef GEOSX_PHYSICSSOLVERS_FLUIDFLOW_FLOWSOLVERBASEKERNELS_HPP -#define GEOSX_PHYSICSSOLVERS_FLUIDFLOW_FLOWSOLVERBASEKERNELS_HPP +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_FLOWSOLVERBASEKERNELS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_FLOWSOLVERBASEKERNELS_HPP #include "common/DataTypes.hpp" #include "common/GEOS_RAJA_Interface.hpp" @@ -148,4 +149,4 @@ struct stencilWeightsUpdateKernel } // namespace geos -#endif //GEOSX_PHYSICSSOLVERS_FLUIDFLOW_FLOWSOLVERBASEKERNELS_HPP +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_FLOWSOLVERBASEKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FluxKernelsHelper.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FluxKernelsHelper.hpp index 684ba86a658..0d11dbe9ff2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FluxKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FluxKernelsHelper.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp index 17a6a3765fb..89db8fc596b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp index 0a4e71a1bfc..108e5a9261a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp index 9824d8a17e4..a8bfa806c77 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp */ -#ifndef GEOSX_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELUTILITIES_HPP_ -#define GEOSX_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELUTILITIES_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELUTILITIES_HPP_ +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELUTILITIES_HPP_ #include "common/DataLayouts.hpp" #include "common/DataTypes.hpp" @@ -2480,7 +2481,7 @@ struct IHUPhaseFlux } // namespace isothermalCompositionalMultiPhaseFVMKernelUtilities -} // namespace geosx +} // namespace geos -#endif // GEOSX_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELUTILITIES_HPP_ +#endif // GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELUTILITIES_HPP_ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp index e6636d930fa..53e0e77be7a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp index 7efdb9aa8d3..6e2ca6a3edf 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index 2d558811898..b117d5dbde5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp index 60a478513be..7f2fee4d3bd 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp index 64419e20e78..303e86655d2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp index 2933bbf9faf..6cb7be8bd40 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 3fddc4300bc..8718bffadd5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index 9853469cd70..cc7f9bb3a03 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp index 6e0bf66f91a..9728e612ce9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp index 2d908b6dc10..79507cb39ed 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index 35023530b12..a0f4c85bffe 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -45,7 +46,7 @@ #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp" /** - * @namespace the geosx namespace that encapsulates the majority of the code + * @namespace the geos namespace that encapsulates the majority of the code */ namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp index b0e60c4dd3b..c219295ae99 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp index c3742dfa748..fe0474e4cfd 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 4bf626b5b91..8688597c4b9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -31,7 +32,7 @@ /** - * @namespace the geosx namespace that encapsulates the majority of the code + * @namespace the geos namespace that encapsulates the majority of the code */ namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp index 64f50465847..cb5b55395e4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp index f6c59f63df9..c5088a91bdd 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp index 6ad40238385..362b6ac137a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp index 9249d00f4ed..9ee6e763ba8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp index 82fd60fd88a..e1845cd7e1b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp index 119f5cb3060..71aa6ea3050 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp index 94d4e3e37e6..2a37b5ffcc4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file SinglePhaseProppantFluxKernels.hpp */ -#ifndef GEOSX_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEPROPPANTFLUXKERNELS_HPP -#define GEOSX_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEPROPPANTFLUXKERNELS_HPP +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEPROPPANTFLUXKERNELS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEPROPPANTFLUXKERNELS_HPP #include "common/DataTypes.hpp" #include "finiteVolume/BoundaryStencil.hpp" @@ -120,4 +121,4 @@ struct FaceElementFluxKernel } // namespace geos -#endif //GEOSX_PHYSICSSOLVERS_MULTIPHYSICS_SINGLEPHASEPROPPANTFLUXKERNELS_HPP +#endif //GEOS_PHYSICSSOLVERS_MULTIPHYSICS_SINGLEPHASEPROPPANTFLUXKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp index 73b34b0703b..9d16ac881fd 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp index 57ac9fc1f64..a6e364d9ea7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp index b0d6328732f..0e484bf1902 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp index e6ca524febc..272b27d8227 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp index 55821d790bc..53869fade9d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp index c79344410e6..9f67629fb94 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp index 28bd1d26eb6..1fc4920902e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp index bc006a230c6..ca4e963d62a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp index 4f994baa255..d1759b86120 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp index f936c32418d..ec5d7a531a6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -39,7 +40,7 @@ /** - * @namespace the geosx namespace that encapsulates the majority of the code + * @namespace the geos namespace that encapsulates the majority of the code */ namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp index 8b23a9e0540..89dd25c6021 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp index ad416b39534..9ca730e1ad8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp index 2c21074f9d0..3f72a80296a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp index c1da68e00a0..7ff85e5ac44 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 175e7166bcb..ef18ccf02a4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp index e483ee1fe4c..85fe50e90c1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp index 4caa44d670b..8acb0bb4c0f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp index d16557c96c6..809751a6b8c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp index 9f7466b2758..9b00a436c37 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index f495b15a488..33f97007224 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp index 259db5d692b..5dfd9e122c7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp index e3c2063e21a..0c157158908 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp index 68c108e9d6a..41039c2542b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp index f54b0bfd8bd..12767869b48 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp index 410a1439d5a..3d7cc6dfec5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp index 06b3b71d924..11a170abcbe 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp index c77590a4db8..2089d45ddbb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index 5d7c057e41a..1e3b718f01d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp index 94c97737fe0..50789e04806 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp index ad9a099508e..22a29ddf357 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp index 71fa1540cbe..14ae9707b43 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp index ba8dfb666e2..eb49f9270a7 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp index d708f28f9e5..9dfcd31d210 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp index f993990949a..1b6433bc1b4 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index 6cb5b0f5a6d..032fd3d2cad 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index 4effbe54621..37af042cd80 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp index 1ca8d0b1385..d59063ad3f1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index 515d778271e..0a7cefde0ae 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index bdc04aa666a..cd70c11b165 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp index 17ee134ba24..551b8684b70 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp index 91539a4b814..98cf52302a9 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 36ea5524709..456a01909c7 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -95,7 +96,7 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::registerDataOnMesh( dataReposi { Base::registerDataOnMesh( meshBodies ); -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT +#ifdef GEOS_USE_SEPARATION_COEFFICIENT meshBodies.forSubGroups< MeshBody >( [&] ( MeshBody & meshBody ) { MeshLevel & meshLevel = *meshBody.getBaseDiscretization(); @@ -132,7 +133,7 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::implicitStepSetup( real64 cons Base::implicitStepSetup( time_n, dt, domain ); updateHydraulicApertureAndFracturePermeability( domain ); -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT +#ifdef GEOS_USE_SEPARATION_COEFFICIENT MeshLevel & mesh = domain.getMeshBody( 0 ).getBaseDiscretization(); mesh.getElemManager().forElementRegions< SurfaceElementRegion >( [&]( SurfaceElementRegion & faceElemRegion ) @@ -298,7 +299,7 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::updateHydraulicApertureAndFrac string const porousSolidName = subRegion.template getReference< string >( FlowSolverBase::viewKeyStruct::solidNamesString() ); CoupledSolidBase const & porousSolid = subRegion.template getConstitutiveModel< CoupledSolidBase >( porousSolidName ); -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT +#ifdef GEOS_USE_SEPARATION_COEFFICIENT arrayView1d< real64 const > const & apertureF = subRegion.getReference< array1d< real64 > >( viewKeyStruct::apertureAtFailureString() ); @@ -332,7 +333,7 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::updateHydraulicApertureAndFrac deltaVolume, aperture, hydraulicAperture -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT +#ifdef GEOS_USE_SEPARATION_COEFFICIENT , apertureF, separationCoeff, @@ -1026,7 +1027,7 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( D // Get the list of newFractureElements SortedArrayView< localIndex const > const newFractureElements = subRegion.m_newFaceElements.toViewConst(); - #ifdef GEOSX_USE_SEPARATION_COEFFICIENT + #ifdef GEOS_USE_SEPARATION_COEFFICIENT arrayView1d< real64 > const apertureF = subRegion.getReference< array1d< real64 > >( "apertureAtFailure" ); #endif @@ -1038,7 +1039,7 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( D localIndex const newElemIndex = newFractureElements[k]; real64 initialPressure = 1.0e99; real64 initialAperture = 1.0e99; - #ifdef GEOSX_USE_SEPARATION_COEFFICIENT + #ifdef GEOS_USE_SEPARATION_COEFFICIENT apertureF[newElemIndex] = aperture[newElemIndex]; #endif if( m_newFractureInitializationType == InitializationType::Displacement ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index 96e1d70f0e8..9df2e20b199 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -176,7 +177,7 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER static constexpr char const * isLaggingFractureStencilWeightsUpdateString() { return "isLaggingFractureStencilWeightsUpdate"; } -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT +#ifdef GEOS_USE_SEPARATION_COEFFICIENT constexpr static char const * separationCoeff0String() { return "separationCoeff0"; } constexpr static char const * apertureAtFailureString() { return "apertureAtFailure"; } #endif diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp index fe23b8b491f..cd193042239 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -45,7 +46,7 @@ struct DeformationUpdateKernel arrayView1d< real64 > const & deltaVolume, arrayView1d< real64 > const & aperture, arrayView1d< real64 > const & hydraulicAperture -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT +#ifdef GEOS_USE_SEPARATION_COEFFICIENT , arrayView1d< real64 const > const & apertureAtFailure, arrayView1d< real64 > const & separationCoeff, @@ -101,7 +102,7 @@ struct DeformationUpdateKernel dHydraulicAperture_dNormalJump, jump, traction ); -#ifdef GEOSX_USE_SEPARATION_COEFFICIENT +#ifdef GEOS_USE_SEPARATION_COEFFICIENT real64 const s = aperture[kfe] / apertureAtFailure[kfe]; if( separationCoeff0[kfe]<1.0 && s>separationCoeff0[kfe] ) { diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 4a154328982..7f17bbfb419 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,7 +17,7 @@ * @file MultiphasePoromechanics.cpp */ -#define GEOSX_DISPATCH_VEM /// enables VEM in FiniteElementDispatch +#define GEOS_DISPATCH_VEM /// enables VEM in FiniteElementDispatch #include "MultiphasePoromechanics.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index e393329696e..0874c1237ec 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp index a9fbd7bb9b2..3073b63dfbf 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp index 9cfcb0f2e61..f0c8b9edacd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp index d6f02ff4d06..7e5eb557f23 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index fef990acbc0..9505e80bfb3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp index 24eda5ad402..c76494e31c5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index 5f3c6a913a1..77eb3415787 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index d260ac9aade..c11d8bab189 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,7 +17,7 @@ * @file SinglePhasePoromechanics.cpp */ -#define GEOSX_DISPATCH_VEM /// enables VEM in FiniteElementDispatch +#define GEOS_DISPATCH_VEM /// enables VEM in FiniteElementDispatch #include "SinglePhasePoromechanics.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index 9fec4080fe2..76cd2a1120d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index e4591b67a1a..7c495e62787 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp index f8f18091132..124c2c261dd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 0b0f97ef207..31ee97bdae4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp index ab7e4183a1a..ce82208f461 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index 1fce8ac29e9..6b9a74412c5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index ca86c257f7b..06b434b8c32 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp index c6dabc3a35a..95c18014e58 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp index b7104c38fb8..a654610a7c2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp index 722a7fdf6d3..55cf183c2fc 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template index 302c8546551..f04afd07e4c 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp" #include "policies.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake index ff5ee1f49eb..422e50380c3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake @@ -1,11 +1,11 @@ set( kernelPath "coreComponents/physicsSolvers/multiphysics/poromechanicsKernels" ) -set( SinglePhasePoromechanicsPolicy "geos::parallelDevicePolicy< ${GEOSX_BLOCK_SIZE} >" ) -set( SinglePhasePoromechanicsEFEMPolicy "geos::parallelDevicePolicy< ${GEOSX_BLOCK_SIZE} >" ) -set( MultiphasePoromechanicsPolicy "geos::parallelDevicePolicy< ${GEOSX_BLOCK_SIZE} >" ) -set( ThermalMultiphasePoromechanicsPolicy "geos::parallelDevicePolicy< ${GEOSX_BLOCK_SIZE} >" ) -set( ThermalSinglePhasePoromechanicsPolicy "geos::parallelDevicePolicy< ${GEOSX_BLOCK_SIZE} >" ) -set( ThermalSinglePhasePoromechanicsEFEMPolicy "geos::parallelDevicePolicy< ${GEOSX_BLOCK_SIZE} >" ) +set( SinglePhasePoromechanicsPolicy "geos::parallelDevicePolicy< ${GEOS_BLOCK_SIZE} >" ) +set( SinglePhasePoromechanicsEFEMPolicy "geos::parallelDevicePolicy< ${GEOS_BLOCK_SIZE} >" ) +set( MultiphasePoromechanicsPolicy "geos::parallelDevicePolicy< ${GEOS_BLOCK_SIZE} >" ) +set( ThermalMultiphasePoromechanicsPolicy "geos::parallelDevicePolicy< ${GEOS_BLOCK_SIZE} >" ) +set( ThermalSinglePhasePoromechanicsPolicy "geos::parallelDevicePolicy< ${GEOS_BLOCK_SIZE} >" ) +set( ThermalSinglePhasePoromechanicsEFEMPolicy "geos::parallelDevicePolicy< ${GEOS_BLOCK_SIZE} >" ) configure_file( ${CMAKE_SOURCE_DIR}/${kernelPath}/policies.hpp.in diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template index ca5e412efaa..8b6b5bb9b1e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp index f8902f25f4e..accc4eb9bb1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp index fc69cd60364..11cc0032051 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOS Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp index 939d0eac8dd..3afa2f8e64d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp index c4beadfe5aa..69df32a8637 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp index 2edc90377d1..421fbb99ea9 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOS Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp index c48eceed316..58b6ab6d141 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp index e76c112220a..9200f625fa5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp index 62833506841..9526b15094e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp index fe18bd5f75c..2a88711c247 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp index 178da2ea3bc..7d6405cb269 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp index cb5492687ed..99d5dca2107 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOS Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp index a8a44801952..433a78136d0 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp index 12c7f05dc3e..8e40377cee1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp index 5df71d3b640..645e03b8088 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOS Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp index 76584fb52dd..ca04f71d515 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template index 41201ad1c40..ce1c4465517 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp" diff --git a/src/coreComponents/physicsSolvers/python/PySolver.cpp b/src/coreComponents/physicsSolvers/python/PySolver.cpp index 8e9cdf0438d..ff03c1f06a0 100644 --- a/src/coreComponents/physicsSolvers/python/PySolver.cpp +++ b/src/coreComponents/physicsSolvers/python/PySolver.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #define PY_SSIZE_T_CLEAN #include diff --git a/src/coreComponents/physicsSolvers/python/PySolver.hpp b/src/coreComponents/physicsSolvers/python/PySolver.hpp index 17134398300..c58be28eaf2 100644 --- a/src/coreComponents/physicsSolvers/python/PySolver.hpp +++ b/src/coreComponents/physicsSolvers/python/PySolver.hpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #ifndef GEOS_PYTHON_PYSOLVER_HPP_ #define GEOS_PYTHON_PYSOLVER_HPP_ diff --git a/src/coreComponents/physicsSolvers/python/PySolverType.hpp b/src/coreComponents/physicsSolvers/python/PySolverType.hpp index eda3df1f223..bb0f3232562 100644 --- a/src/coreComponents/physicsSolvers/python/PySolverType.hpp +++ b/src/coreComponents/physicsSolvers/python/PySolverType.hpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #ifndef GEOS_PYTHON_PYSOLVERTYPE_HPP_ #define GEOS_PYTHON_PYSOLVERTYPE_HPP_ diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp index 448ec383e76..5ddb2dfa45e 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp index e1c10bd008f..9b3b6b20735 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp index 67750038218..e689c896b99 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp index 74a83834a19..565233bb099 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp index 2c9023a79d4..1c1e90c2db5 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -20,7 +21,7 @@ #ifndef GEOS_PHYSICSSOLVERS_SIMPLEPDE_LAPLACEFEMKERNELS_HPP_ #define GEOS_PHYSICSSOLVERS_SIMPLEPDE_LAPLACEFEMKERNELS_HPP_ -#define GEOSX_DISPATCH_VEM /// enables VEM in FiniteElementDispatch +#define GEOS_DISPATCH_VEM /// enables VEM in FiniteElementDispatch #include "finiteElement/kernelInterface/ImplicitKernelBase.hpp" diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp index b8ad1f6eea7..76075fa4591 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp index 0384812f9ae..0ea2099e1f8 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp index c991e076398..b252c8bc224 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp b/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp index d83751c0c99..337e44d5f04 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file MPMSolverBaseFields.hpp */ -#ifndef GEOSX_PHYSICSSOLVERS_SOLIDMECHANICS_MPMSOLVERBASEFIELDS_HPP_ -#define GEOSX_PHYSICSSOLVERS_SOLIDMECHANICS_MPMSOLVERBASEFIELDS_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_MPMSOLVERBASEFIELDS_HPP_ +#define GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_MPMSOLVERBASEFIELDS_HPP_ #include "mesh/MeshFields.hpp" @@ -149,4 +150,4 @@ DECLARE_FIELD( particleReferencePosition, } -#endif // GEOSX_PHYSICSSOLVERS_SOLIDMECHANICS_MPMSOLVERBASEFIELDS_HPP_ +#endif // GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_MPMSOLVERBASEFIELDS_HPP_ diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp index cba09330bd4..9b89e2acad4 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 98527ef0164..8d10d11a3f5 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,7 +17,7 @@ * @file SolidMechanicsLagrangianFEM.cpp */ -#define GEOSX_DISPATCH_VEM /// enables VEM in FiniteElementDispatch +#define GEOS_DISPATCH_VEM /// enables VEM in FiniteElementDispatch #include "SolidMechanicsLagrangianFEM.hpp" #include "kernels/ImplicitSmallStrainNewmark.hpp" diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index 3ea6b67066e..9deae4f3272 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp index eb4ed9bc931..d1284bfd922 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp index 7d090131ff6..3e61d0c8886 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp index d1cdf02ab92..13d29a203e1 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp index bde0334413c..51de54a2d30 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -16,8 +17,8 @@ * @file SolidMechanicsMPM.hpp */ -#ifndef GEOSX_PHYSICSSOLVERS_SOLIDMECHANICS_MPM_HPP_ -#define GEOSX_PHYSICSSOLVERS_SOLIDMECHANICS_MPM_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_MPM_HPP_ +#define GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_MPM_HPP_ #include "codingUtilities/EnumStrings.hpp" #include "common/TimingMacros.hpp" @@ -474,4 +475,4 @@ ENUM_STRINGS( SolidMechanicsMPM::BoundaryConditionOption, } /* namespace geos */ -#endif /* GEOSX_PHYSICSSOLVERS_SOLIDMECHANICS_SOLIDMECHANICSLAGRANGIANFEM_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_SOLIDMECHANICSLAGRANGIANFEM_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index 3b2fc88a032..ceca67b46c2 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp index 5210e1e6576..fc1900451a9 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp index 855fb547a3f..3c1de5dc61a 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp index 77c32e85e6b..0aa1b5faa95 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp index 14d26c2e1bd..3dea71ade09 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp index f0b1ec984b5..22515acc710 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp index f67aae8b7e4..495872c8038 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -17,8 +18,8 @@ * @file ExplicitMPM.hpp */ -#ifndef GEOSX_PHYSICSSOLVERS_CONTACT_EXPLICITMPM_HPP_ -#define GEOSX_PHYSICSSOLVERS_CONTACT_EXPLICITMPM_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_EXPLICITMPM_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_EXPLICITMPM_HPP_ #include "constitutive/solid/SolidUtilities.hpp" #include "physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp" @@ -111,7 +112,7 @@ struct StateUpdateKernel // Copy the beginning-of-step particle stress into the constitutive model's m_oldStress - this fixes the MPI sync issue on Lassen for // some reason - #if defined(GEOSX_USE_CUDA) + #if defined(GEOS_USE_CUDA) LvArray::tensorOps::copy< 6 >( oldStress[p][0], particleStress[p] ); #endif @@ -162,4 +163,4 @@ struct StateUpdateKernel } // namespace geos -#endif /* GEOSX_PHYSICSSOLVERS_CONTACT_EXPLICITMPM_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_EXPLICITMPM_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp index 8f5fb41a9e8..94a576b37e7 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp index 9e97f77db0a..bf46c0b27e1 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp index 2153171412c..3036f9b26db 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp index 52d876b2af0..73b1d60ec7d 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp index d426fa6e77d..5dac893e596 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp index 5f036f6b75e..c651e779f4c 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp index 34d17a2b2f5..f3a43d0d67f 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp index b191586c6a7..81ea813640f 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template index 704c6b84648..9f54e9b6981 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template @@ -1,4 +1,17 @@ - +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ #include "physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp" #include "policies.hpp" diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cmake b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cmake index 4d7058f9553..c71c31bacd2 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cmake +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cmake @@ -4,11 +4,11 @@ set( kernelPath "coreComponents/physicsSolvers/solidMechanics/kernels" ) -set( ExplicitSmallStrainPolicy "geos::parallelDevicePolicy< ${GEOSX_BLOCK_SIZE} >" ) -set( ExplicitFiniteStrainPolicy "geos::parallelDevicePolicy< ${GEOSX_BLOCK_SIZE} >" ) -set( FixedStressThermoPoromechanicsPolicy "geos::parallelDevicePolicy< ${GEOSX_BLOCK_SIZE} >" ) -set( ImplicitSmallStrainNewmarkPolicy "geos::parallelDevicePolicy< ${GEOSX_BLOCK_SIZE} >" ) -set( ImplicitSmallStrainQuasiStaticPolicy "geos::parallelDevicePolicy< ${GEOSX_BLOCK_SIZE} >" ) +set( ExplicitSmallStrainPolicy "geos::parallelDevicePolicy< ${GEOS_BLOCK_SIZE} >" ) +set( ExplicitFiniteStrainPolicy "geos::parallelDevicePolicy< ${GEOS_BLOCK_SIZE} >" ) +set( FixedStressThermoPoromechanicsPolicy "geos::parallelDevicePolicy< ${GEOS_BLOCK_SIZE} >" ) +set( ImplicitSmallStrainNewmarkPolicy "geos::parallelDevicePolicy< ${GEOS_BLOCK_SIZE} >" ) +set( ImplicitSmallStrainQuasiStaticPolicy "geos::parallelDevicePolicy< ${GEOS_BLOCK_SIZE} >" ) configure_file( ${CMAKE_SOURCE_DIR}/${kernelPath}/policies.hpp.in diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template index 140bfc9beb2..d89e243f313 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template @@ -1,4 +1,17 @@ - +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ #include "physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp" #include "physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp" diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp index a0c3ffce1cb..0764ec73c61 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp index d2ad3900fde..3a431e83d3c 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in b/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in index b27c8c027bf..3ce454c8c2a 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #ifndef GEOS_CORECOMPONENTS_PHYSICSSOLVERSE_SOLIDMECHANICS_KERNELS_CONFIG_HPP #define GEOS_CORECOMPONENTS_PHYSICSSOLVERSE_SOLIDMECHANICS_KERNELS_CONFIG_HPP diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp index 85d2fbc2aa9..1406f2db933 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp index 2d8775cb1ab..714ab835bbd 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp index f36df20f2e1..a22cb5ca657 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp index 1f4384eab61..cc835b15956 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp index ef572d8400f..70756adb587 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + /** * @file ParallelTopologyChange.cpp */ diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp index ba1527f8add..9d8791d66d0 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + /** * @file ParallelTopologyChange.hpp */ diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index c7044e4a161..45e37634fe4 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -663,7 +664,7 @@ int SurfaceGenerator::separationDriver( DomainPartition & domain, } } -#ifdef GEOSX_USE_MPI +#ifdef GEOS_USE_MPI modifiedObjects.clearNewFromModified(); diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp index 69d0a37c03d..15a9627781c 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp index b62bbb23ef0..b45f7530f99 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp index d20f120a289..ce08a428544 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp index 917ce1f1a8a..341780c2ed3 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 3728329a87a..32755474615 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp index 445ba94c691..423dc8ae5ba 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp index 744e288fd87..3a85644fdcd 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp index a361d77e55c..254ec561f03 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index 6ddb1e50ca0..23cd9ba2db4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOS Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp index 487ab246dd7..889cb424261 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOS Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp index 1f9f15608a1..1acd21ac28b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOS Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp index c6f2f54586c..8e8bfe4a808 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 8f377e2dce1..7243647cb26 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp index 62cb89cedb9..da36ea8dcbb 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp index 60b3bfe56c1..2b877c499eb 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp index 8901bea6a47..5599ca8b635 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp index 811fcef0f3f..52376985d09 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp index d656fbaa803..16eeaf02ced 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp index 3686bc52d71..43d7d36be4e 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp index be879a2fba6..0cad8653579 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp index 8a9db1426a4..93fab00021d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp index bdc80bea84f..65d96541df8 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp index 4676d6174b9..382161128ba 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index 3fc0b84ab59..07eb4802edd 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOS Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp index bd01d7b7b3e..4ab8c383b0b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOS Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp index e831ecf902b..5403e975c10 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOS Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp index e5834a0a564..45ae775ef32 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp index 8905493ee58..21faecddff0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 591e2add195..1da70c10a3b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp index 1ad1e348cca..bdb15dcff18 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp index c17dc27a5ef..a919d84f8c6 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp index a7ff2c600ac..15770d50a5c 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp index 575602a53c8..81d4b1c9700 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp index 619815ee653..9dcad646fa7 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp index 51e9cbfd04c..c688e457c6d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index dff7e2d1b6d..d8e1af99dbc 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp index 33bdbc4b613..6cb5a459a0d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp index 8447e824b8e..b4087dcb2fb 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/schema/CMakeLists.txt b/src/coreComponents/schema/CMakeLists.txt index ccee0a436dd..ecae0b5dd75 100644 --- a/src/coreComponents/schema/CMakeLists.txt +++ b/src/coreComponents/schema/CMakeLists.txt @@ -18,7 +18,7 @@ blt_add_library( NAME schema SOURCES ${schema_sources} HEADERS ${schema_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) diff --git a/src/coreComponents/schema/schemaUtilities.cpp b/src/coreComponents/schema/schemaUtilities.cpp index 4bf19a4541d..80a657db4a2 100644 --- a/src/coreComponents/schema/schemaUtilities.cpp +++ b/src/coreComponents/schema/schemaUtilities.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/schema/schemaUtilities.hpp b/src/coreComponents/schema/schemaUtilities.hpp index f81df636bf5..d100fba856f 100644 --- a/src/coreComponents/schema/schemaUtilities.hpp +++ b/src/coreComponents/schema/schemaUtilities.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt index 268960a65ba..ebe6fde062f 100644 --- a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt @@ -34,10 +34,11 @@ set( gtest_reactivefluid_xmls set( dependencyList ${parallelDeps} gtest ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if( ENABLE_PVTPackage ) diff --git a/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp index b6f8d7dde47..5817d6ea7be 100644 --- a/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp +++ b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp b/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp index 4b90ca2840a..1cd08a8bc27 100644 --- a/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp +++ b/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp b/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp index 723a30af1da..5739f312236 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp b/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp index 7a248a4007b..2c33a9c1412 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp b/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp index 333f7c97ace..62598e18258 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp b/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp index 8a691a11953..3e11e580a7e 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp index 16e26868abe..5df07a14155 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp index a78b7f66e69..fe6c9453352 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp index 17bfc966b07..7921e3ec313 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp index d78aa9b7392..f62078f4d39 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp b/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp index 16cd497b723..5709e50346a 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -21,7 +22,7 @@ #include #include -// this unit test basically launches a full geosx instance, and then uses the +// this unit test basically launches a full geos instance, and then uses the // input xml to launch a PVTDriver task TEST( testPVT, testPVT ) diff --git a/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp b/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp index 009380c05d8..47a3d690b1a 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -21,7 +22,7 @@ #include #include -// this unit test basically launches a full geosx instance, and then uses the +// this unit test basically launches a full geos instance, and then uses the // input xml to launch a ReactiveFluidDriver task TEST( testReactiveFluid, testReactiveFluid ) diff --git a/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp b/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp index b89ee33b2ae..4947a54b4b6 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp b/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp index 49f342cc8ac..0885ef245ca 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp b/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp index 55d13951802..2ccd1d7a8ab 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -21,7 +22,7 @@ #include #include -// this unit test basically launches a full geosx instance, and then uses the +// this unit test basically launches a full geos instance, and then uses the // input xml to drive a triaxial (or similar) loading test TEST( testTriaxial, testTriaxial ) diff --git a/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt b/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt index 05fe2376a21..d8e7129a73e 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt @@ -8,7 +8,7 @@ set( dataRepository_tests set( dependencyList ${parallelDeps} gtest ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp index 71db7a13ddd..1b7ad5cb828 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp index 1fef5477fa4..2d7f0631b71 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp index 829a0abff95..e71259ce9cc 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -67,7 +68,7 @@ class SingleWrapperTest : public ::testing::Test writeTree( m_fileName, *m_node ); m_group->finishWriting(); - // Delete geosx tree and reset the conduit tree. + // Delete geos tree and reset the conduit tree. m_group = nullptr; m_node = std::make_unique< conduit::Node >(); diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp index 8a44b9f6db6..c6fb25aa69e 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp index 47d24fb9fea..ce73fb0f095 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp b/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp index a2618342263..6aa1b76f2ef 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + /// Source includes #include "common/DataTypes.hpp" @@ -131,4 +146,4 @@ void compare( SortedArray< T > const & val, } // namespace testing } // namespace dataRepository -} // namesapce geosx +} // namespace geos diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt b/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt index c8ca0b9e1c8..2c3f10df6a1 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt @@ -7,10 +7,11 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if (TARGET pugixml::pugixml) diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp index 731efb898b5..96686031ffc 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp index 7ca39a7fbcd..ca33e6ceddc 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp index b6fb7916eee..6ceb929e8c6 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt b/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt index 135887273fb..16aec0c79db 100644 --- a/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt @@ -3,7 +3,7 @@ set( geosx_fileio_tests testHDFFile.cpp ) set( dependencyList ${parallelDeps} gtest HDF5::HDF5 ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core ) else() list( APPEND dependencyList ${geosx_core_libs} ) diff --git a/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp b/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp index d5339326b22..f9c43b2748d 100644 --- a/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp +++ b/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "fileIO/timeHistory/HDFHistoryIO.hpp" #include "fileIO/timeHistory/HDFFile.hpp" #include "mainInterface/initialization.hpp" diff --git a/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp b/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp index 151b7ff5372..0b65e47b2b3 100644 --- a/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp +++ b/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "fileIO/timeHistory/HDFHistoryIO.hpp" #include "common/TimingMacros.hpp" #include "mainInterface/initialization.hpp" diff --git a/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt b/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt index a53682984bb..e057fe04a37 100644 --- a/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt @@ -4,10 +4,11 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() # Add gtest C++ based tests diff --git a/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp b/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp index 3e9c1830ae0..aa5fd0b8b5a 100644 --- a/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp +++ b/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt index 56988469033..ae0c0cfaa00 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt @@ -7,10 +7,11 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) + list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() set( dependencyList testingUtilities ) diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp index 07447f822cd..3a31e9e554d 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp index ebac3870bb1..f294bfc327c 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp index 55f1a4c5d90..467dc6b4b31 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp index 29c088a25ec..e93bd189d67 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp index 12de6b8f655..93e67906eb2 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp index 6dd42bda36d..5d37fc2150d 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp index 05cdad5d2b4..5e2ce087acd 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp index beffe24f94d..1d4cc06ffd0 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp index 163da585aaa..cf40a3ef249 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp index 898f0db4e08..9f284792cf8 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp index 58549f21be8..f9143d3ff7b 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp index a07ed6cd61a..1916a92b527 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt b/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt index 57005022112..deb3d57d163 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt @@ -8,7 +8,7 @@ set( nranks 2 ) # Add gtest C++ based tests set( dependencyList ${parallelDeps} gtest ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp b/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp index bc8359844a7..d0a6deb12ac 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -823,15 +824,15 @@ REGISTER_TYPED_TEST_SUITE_P( DofManagerSparsityTest, FEM_TPFA_Full, FEM_TPFA_Partial ); -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS INSTANTIATE_TYPED_TEST_SUITE_P( Trilinos, DofManagerSparsityTest, TrilinosInterface, ); #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE INSTANTIATE_TYPED_TEST_SUITE_P( Hypre, DofManagerSparsityTest, HypreInterface, ); #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC INSTANTIATE_TYPED_TEST_SUITE_P( Petsc, DofManagerSparsityTest, PetscInterface, ); #endif @@ -1061,15 +1062,15 @@ REGISTER_TYPED_TEST_SUITE_P( DofManagerRestrictorTest, MultiBlock_Second, MultiBlock_Both ); -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS INSTANTIATE_TYPED_TEST_SUITE_P( Trilinos, DofManagerRestrictorTest, TrilinosInterface, ); #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE INSTANTIATE_TYPED_TEST_SUITE_P( Hypre, DofManagerRestrictorTest, HypreInterface, ); #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC INSTANTIATE_TYPED_TEST_SUITE_P( Petsc, DofManagerRestrictorTest, PetscInterface, ); #endif diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp b/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp index 9afee5f8cc4..81432c7dc07 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp b/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp index a7d6ebaada5..a6f4dbe0364 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -200,15 +201,15 @@ REGISTER_TYPED_TEST_SUITE_P( LAIHelperFunctionsTest, nodalVectorPermutation, cellCenteredVectorPermutation ); -#ifdef GEOSX_USE_TRILINOS +#ifdef GEOS_USE_TRILINOS INSTANTIATE_TYPED_TEST_SUITE_P( Trilinos, LAIHelperFunctionsTest, TrilinosInterface, ); #endif -#ifdef GEOSX_USE_HYPRE +#ifdef GEOS_USE_HYPRE INSTANTIATE_TYPED_TEST_SUITE_P( Hypre, LAIHelperFunctionsTest, HypreInterface, ); #endif -#ifdef GEOSX_USE_PETSC +#ifdef GEOS_USE_PETSC INSTANTIATE_TYPED_TEST_SUITE_P( Petsc, LAIHelperFunctionsTest, PetscInterface, ); #endif diff --git a/src/coreComponents/unitTests/meshTests/CMakeLists.txt b/src/coreComponents/unitTests/meshTests/CMakeLists.txt index c185368d1fb..acd69ee16c0 100644 --- a/src/coreComponents/unitTests/meshTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/meshTests/CMakeLists.txt @@ -21,7 +21,7 @@ endif() set( dependencyList ${parallelDeps} gtest ) -if( GEOSX_BUILD_SHARED_LIBS ) +if( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) diff --git a/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in b/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in index ba5be88b45c..c892217a6b0 100644 --- a/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in +++ b/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in @@ -1,3 +1,18 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + #include "common/DataTypes.hpp" namespace geos diff --git a/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp b/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp index ca3645a2be6..eb5bf5c5f6c 100644 --- a/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp +++ b/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp index 2db03eea716..bad8b501521 100644 --- a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp +++ b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp b/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp index 54555a26309..55997a55102 100644 --- a/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp +++ b/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/meshTests/testVTKImport.cpp b/src/coreComponents/unitTests/meshTests/testVTKImport.cpp index b47bb6c1742..5a81e5d8cda 100644 --- a/src/coreComponents/unitTests/meshTests/testVTKImport.cpp +++ b/src/coreComponents/unitTests/meshTests/testVTKImport.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt b/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt index e31ad6d72b2..b89d54ba0f5 100644 --- a/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt +++ b/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt @@ -17,7 +17,7 @@ set( testingUtilities_sources # set( dependencyList ${parallelDeps} gtest ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) @@ -27,7 +27,7 @@ blt_add_library( NAME testingUtilities SOURCES ${testingUtilities_sources} HEADERS ${testingUtilities_headers} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( testingUtilities PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp b/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp index b948a406071..ef9459bfc26 100644 --- a/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp +++ b/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp b/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp index f52a9e54834..456c2bce29a 100644 --- a/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp +++ b/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/toolchain/testToolchain.cpp b/src/coreComponents/unitTests/toolchain/testToolchain.cpp index ec81e510ff9..e83cb5dcbf2 100644 --- a/src/coreComponents/unitTests/toolchain/testToolchain.cpp +++ b/src/coreComponents/unitTests/toolchain/testToolchain.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOS Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ @@ -23,7 +24,7 @@ TEST( Toolchain, NDEBUGfromTPls ) * we check that we are in RelWithDebInfo or Release build type when NDEBUG is defined and in Debug * configuration when NDEBUG is not defined: thus, LvArray assertions remain in Debug builds. */ - bool constexpr isDebug = std::string_view( GEOSX_CMAKE_BUILD_TYPE ) == std::string_view( "Debug" ); + bool constexpr isDebug = std::string_view( GEOS_CMAKE_BUILD_TYPE ) == std::string_view( "Debug" ); #ifdef NDEBUG ASSERT_FALSE( isDebug ); // RelWithDebInfo or Release builds only diff --git a/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt b/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt index 66da64f7648..c10c31f429f 100644 --- a/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt @@ -4,7 +4,7 @@ set( testSources set( dependencyList ${parallelDeps} gtest ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) diff --git a/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp b/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp index f69f82bd0ad..acb1a734678 100644 --- a/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp +++ b/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt index da9172f7ac4..de07f14b079 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt @@ -10,7 +10,7 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp index 493dc54a71f..a5f972cb437 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp index 0b37a9d382e..ef1b90414e9 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp index 009480c9a3a..2b48e1a6214 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp index c5c6243d013..bfda1e3036c 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp index b36915027a9..e809afa0746 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp index e6bbf81ce86..31bf7a4d154 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp index 3f74d76d860..42dd003a8e8 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/wellsTests/CMakeLists.txt b/src/coreComponents/unitTests/wellsTests/CMakeLists.txt index 7adb81ed286..efdf46e9779 100644 --- a/src/coreComponents/unitTests/wellsTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wellsTests/CMakeLists.txt @@ -5,7 +5,7 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core ${parallelDeps} HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} ${parallelDeps} HDF5::HDF5 ) diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp index 7154c749706..739d55f96fa 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp index 78e3ab3997d..6b103800b02 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp b/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp index 21b046363c0..c012d99cd38 100644 --- a/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp +++ b/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp @@ -2,11 +2,12 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2020- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ diff --git a/src/coreComponents/unitTests/xmlTests/CMakeLists.txt b/src/coreComponents/unitTests/xmlTests/CMakeLists.txt index 34646c22392..0a5a81b1d57 100644 --- a/src/coreComponents/unitTests/xmlTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/xmlTests/CMakeLists.txt @@ -18,7 +18,7 @@ set( multi_files # Add gtest C++ based tests set( dependencyList ${parallelDeps} gtest optionparser HDF5::HDF5 ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) diff --git a/src/coreComponents/unitTests/xmlTests/testXML.cpp b/src/coreComponents/unitTests/xmlTests/testXML.cpp index 4e9f3ebc31d..d0e6df69ad5 100644 --- a/src/coreComponents/unitTests/xmlTests/testXML.cpp +++ b/src/coreComponents/unitTests/xmlTests/testXML.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp b/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp index 88fed5c4a7e..09608d1e877 100644 --- a/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp +++ b/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/docs/doxygen/GeosxConfig.hpp b/src/docs/doxygen/GeosxConfig.hpp index e458794d05d..44a7b9be831 100644 --- a/src/docs/doxygen/GeosxConfig.hpp +++ b/src/docs/doxygen/GeosxConfig.hpp @@ -9,28 +9,28 @@ #define GEOS_COMMON_CONFIG_HPP /// Enables floating point exceptions -#define GEOSX_USE_FPE +#define GEOS_USE_FPE /// Enables bounds check in LvArray classes (CMake option ARRAY_BOUNDS_CHECK) -/* #undef GEOSX_USE_ARRAY_BOUNDS_CHECK */ +/* #undef GEOS_USE_ARRAY_BOUNDS_CHECK */ /// Enables use of Caliper (CMake option ENABLE_CALIPER) -#define GEOSX_USE_CALIPER +#define GEOS_USE_CALIPER /// Enables use of Caliper (CMake option ENABLE_ADIAK) -/* #undef GEOSX_USE_ADIAK */ +/* #undef GEOS_USE_ADIAK */ /// Enables use of CHAI (CMake option ENABLE_CHAI) -#define GEOSX_USE_CHAI +#define GEOS_USE_CHAI /// Enables use of Mathpresso library (CMake option ENABLE_MATHPRESSO) -#define GEOSX_USE_MATHPRESSO +#define GEOS_USE_MATHPRESSO /// Enables use of MPI (CMake option ENABLE_MPI) -#define GEOSX_USE_MPI +#define GEOS_USE_MPI /// Enables use of OpenMP (CMake option ENABLE_OPENMP) -/* #undef GEOSX_USE_OPENMP */ +/* #undef GEOS_USE_OPENMP */ /// Enables use of CUDA (CMake option ENABLE_CUDA) /* #undef GEOS_USE_CUDA */ @@ -45,28 +45,28 @@ /* #undef GEOS_USE_FMT_CONST_FORMATTER_WORKAROUND */ /// Enables use of PVTPackage (CMake option ENABLE_PVTPackage) -#define GEOSX_USE_PVTPackage +#define GEOS_USE_PVTPackage /// Enables use of Python (CMake option ENABLE_PYTHON) -/* #undef GEOSX_USE_PYGEOSX */ +/* #undef GEOS_USE_PYGEOSX */ /// Enables use of RAJA (CMake option ENABLE_RAJA) -#define GEOSX_USE_RAJA +#define GEOS_USE_RAJA /// Enables use of sys/time.h based timers (CMake option ENABLE_TIMERS) -/* #undef GEOSX_USE_TIMERS */ +/* #undef GEOS_USE_TIMERS */ /// Enables use of additional debugging interface for TotalView (Cmake option ENABLE_TOTALVIEW_OUTPUT) -/* #undef GEOSX_USE_TOTALVIEW_OUTPUT */ +/* #undef GEOS_USE_TOTALVIEW_OUTPUT */ /// Enables use of Intel MKL (CMake option ENABLE_MKL) -/* #undef GEOSX_USE_MKL */ +/* #undef GEOS_USE_MKL */ /// Enables use of Trilinos library (CMake option ENABLE_TRILINOS) -#define GEOSX_USE_TRILINOS +#define GEOS_USE_TRILINOS /// Enables use of Hypre library (CMake option ENABLE_HYPRE) -#define GEOSX_USE_HYPRE +#define GEOS_USE_HYPRE /// Denotes HYPRE using CPU #define GEOS_USE_HYPRE_CPU 0 @@ -78,46 +78,46 @@ #define GEOS_USE_HYPRE_DEVICE GEOS_USE_HYPRE_CPU /// Enables use of SuperLU_dist library through HYPRE (CMake option ENABLE_SUPERLU_DIST) -#define GEOSX_USE_SUPERLU_DIST +#define GEOS_USE_SUPERLU_DIST /// Enables use of PETSc library (CMake option ENABLE_PETSC) -#define GEOSX_USE_PETSC +#define GEOS_USE_PETSC /// Enables use of Scotch library (CMake option ENABLE_SCOTCH) -#define GEOSX_USE_SCOTCH +#define GEOS_USE_SCOTCH -/// Choice of global linear algebra interface (CMake option GEOSX_LA_INTERFACE) -#define GEOSX_LA_INTERFACE Hypre +/// Choice of global linear algebra interface (CMake option GEOS_LA_INTERFACE) +#define GEOS_LA_INTERFACE Hypre /// Macro defined when Trilinos interface is selected -/* #undef GEOSX_LA_INTERFACE_TRILINOS */ +/* #undef GEOS_LA_INTERFACE_TRILINOS */ /// Macro defined when Hypre interface is selected -#define GEOSX_LA_INTERFACE_HYPRE +#define GEOS_LA_INTERFACE_HYPRE /// Macro defined when PETSc interface is selected -/* #undef GEOSX_LA_INTERFACE_PETSC */ +/* #undef GEOS_LA_INTERFACE_PETSC */ /// Platform-dependent mangling of fortran function names (CMake option FORTRAN_MANGLE_NO_UNDERSCORE) /* #undef FORTRAN_MANGLE_NO_UNDERSCORE */ /// USE OF SEPARATION COEFFICIENT IN FRACTURE FLOW -/* #undef GEOSX_USE_SEPARATION_COEFFICIENT */ +/* #undef GEOS_USE_SEPARATION_COEFFICIENT */ /// CMake option CMAKE_BUILD_TYPE -#define GEOSX_CMAKE_BUILD_TYPE "Release" +#define GEOS_CMAKE_BUILD_TYPE "Release" /// The type that localIndex will be aliased to. -#define GEOSX_LOCALINDEX_TYPE int +#define GEOS_LOCALINDEX_TYPE int /// An integer flag representing the type that localIndex will be aliased to. -#define GEOSX_LOCALINDEX_TYPE_FLAG 0 +#define GEOS_LOCALINDEX_TYPE_FLAG 0 /// The type that globalIndex will be aliased to. -#define GEOSX_GLOBALINDEX_TYPE long long int +#define GEOS_GLOBALINDEX_TYPE long long int /// An integer flag representing the type that globalIndex will be aliased to. -#define GEOSX_GLOBALINDEX_TYPE_FLAG 2 +#define GEOS_GLOBALINDEX_TYPE_FLAG 2 /// The default block size for GEOSX on this platform -#define GEOSX_BLOCK_SIZE 32 +#define GEOS_BLOCK_SIZE 32 /// Version information for HDF5 #define HDF5_VERSION 1.12.1 diff --git a/src/docs/sphinx/QuickStart.rst b/src/docs/sphinx/QuickStart.rst index 111918a8aa8..71b94c08e02 100644 --- a/src/docs/sphinx/QuickStart.rst +++ b/src/docs/sphinx/QuickStart.rst @@ -286,7 +286,7 @@ A typical one may look like: set(ENABLE_GTEST_DEATH_TESTS ON CACHE BOOL "" FORCE ) # define the path to your compiled installation directory - set(GEOSX_TPL_DIR "/path/to/your/TPL/installation/dir" CACHE PATH "") + set(GEOS_TPL_DIR "/path/to/your/TPL/installation/dir" CACHE PATH "") # let GEOS define some third party libraries information for you include(${CMAKE_CURRENT_LIST_DIR}/tpls.cmake) @@ -337,11 +337,11 @@ Again, the ``config-build.py`` sets up cmake for you, so the process is very sim The host-config file is the place to set all relevant configuration options. Note that the path to the previously installed third party libraries is typically specified within this file. -An alternative is to set the path ``GEOSX_TPL_DIR`` via a cmake command line option, e.g. +An alternative is to set the path ``GEOS_TPL_DIR`` via a cmake command line option, e.g. .. code-block:: sh - python scripts/config-build.py -hc host-configs/your-platform.cmake -bt Release -D GEOSX_TPL_DIR=/full/path/to/thirdPartyLibs + python scripts/config-build.py -hc host-configs/your-platform.cmake -bt Release -D GEOS_TPL_DIR=/full/path/to/thirdPartyLibs We highly recommend using full paths, rather than relative paths, whenever possible. The parallel ``make -j 4`` will use four processes for compilation, which can substantially speed up the build if you have a multi-processor machine. diff --git a/src/docs/sphinx/advancedExamples/pygeosxExamples/inSituDataMonitor/AdvancedExample.rst b/src/docs/sphinx/advancedExamples/pygeosxExamples/inSituDataMonitor/AdvancedExample.rst index 2d9d42bad7b..918ec1422d1 100644 --- a/src/docs/sphinx/advancedExamples/pygeosxExamples/inSituDataMonitor/AdvancedExample.rst +++ b/src/docs/sphinx/advancedExamples/pygeosxExamples/inSituDataMonitor/AdvancedExample.rst @@ -63,8 +63,8 @@ The custom packages include pygeosx, which provides an interface to GEOS, and py .. literalinclude:: ../../../../../../examples/pygeosxExamples/hydraulicFractureWithMonitor/hydraulicFractureWithMonitor.py :language: python - :start-after: # PYGEOSX_SETUP - :end-before: # PYGEOSX_SETUP_END + :start-after: # PYGEOS_SETUP + :end-before: # PYGEOS_SETUP_END In the next step, we apply the xml preprocessor to resolve the advanced xml features. Note that this step will modify the input arguments to reflect the location of the compiled xml file, which is processed directly by GEOS. @@ -73,8 +73,8 @@ There is an opportunity to interact with the GEOS before the initial conditions .. literalinclude:: ../../../../../../examples/pygeosxExamples/hydraulicFractureWithMonitor/hydraulicFractureWithMonitor.py :language: python - :start-after: # PYGEOSX_INITIALIZATION - :end-before: # PYGEOSX_INITIALIZATION_END + :start-after: # PYGEOS_INITIALIZATION + :end-before: # PYGEOS_INITIALIZATION_END To extract information from the problem, you need to know the full path (or 'key') to the target object. These keys can be quite long, and can change depending on the xml input. @@ -84,8 +84,8 @@ Note that these functions will throw an error if they do not find a matching key .. literalinclude:: ../../../../../../examples/pygeosxExamples/hydraulicFractureWithMonitor/hydraulicFractureWithMonitor.py :language: python - :start-after: # PYGEOSX_KEY_SEARCH - :end-before: # PYGEOSX_KEY_SEARCH_END + :start-after: # PYGEOS_KEY_SEARCH + :end-before: # PYGEOS_KEY_SEARCH_END Next, we setup a dictionary that will allow us to use pygeosx_tools to automatically query the problem. The root level of this dictionary contains the target keys (fracture location and aperture) and the required `time` key. @@ -94,8 +94,8 @@ The target dictionaries also hold an entry `fhandle`, which contains a matplotli .. literalinclude:: ../../../../../../examples/pygeosxExamples/hydraulicFractureWithMonitor/hydraulicFractureWithMonitor.py :language: python - :start-after: # PYGEOSX_QUERY_SETUP - :end-before: # PYGEOSX_QUERY_SETUP_END + :start-after: # PYGEOS_QUERY_SETUP + :end-before: # PYGEOS_QUERY_SETUP_END After setting up the problem, we enter the main problem loop. Upon calling `pygeosx.run()`, the code will execute until a Python event is triggered in the Event loop. @@ -104,8 +104,8 @@ Here, we use pygeosx_tools to query the datastructure and occasionaly plot the r .. literalinclude:: ../../../../../../examples/pygeosxExamples/hydraulicFractureWithMonitor/hydraulicFractureWithMonitor.py :language: python - :start-after: # PYGEOSX_QUERY_SETUP - :end-before: # PYGEOSX_QUERY_SETUP_END + :start-after: # PYGEOS_QUERY_SETUP + :end-before: # PYGEOS_QUERY_SETUP_END --------------------------------- diff --git a/src/docs/sphinx/advancedExamples/pygeosxExamples/initialConditionModification/AdvancedExample.rst b/src/docs/sphinx/advancedExamples/pygeosxExamples/initialConditionModification/AdvancedExample.rst index 614d3d6fb64..7c32edc5c86 100644 --- a/src/docs/sphinx/advancedExamples/pygeosxExamples/initialConditionModification/AdvancedExample.rst +++ b/src/docs/sphinx/advancedExamples/pygeosxExamples/initialConditionModification/AdvancedExample.rst @@ -59,32 +59,32 @@ Similar to the previous example, the python script begins by importing the requi .. literalinclude:: ../../../../../../examples/pygeosxExamples/sedovWithStressFunction/run_sedov_problem.py :language: python - :start-after: # PYGEOSX_INITIALIZATION - :end-before: # PYGEOSX_INITIALIZATION_END + :start-after: # PYGEOS_INITIALIZATION + :end-before: # PYGEOS_INITIALIZATION_END The next steps rely on a python function that we use to set stress. The argument to this function, x, is assumed to be a numpy array of element centers: .. literalinclude:: ../../../../../../examples/pygeosxExamples/sedovWithStressFunction/run_sedov_problem.py :language: python - :start-after: # PYGEOSX_STRESS_FN - :end-before: # PYGEOSX_STRESS_FN_END + :start-after: # PYGEOS_STRESS_FN + :end-before: # PYGEOS_STRESS_FN_END In the following section, we zero out the initial stress and then set it based on `stress_fn`. While doing this, we use `wrapper.print_global_value_range` to check on the process. .. literalinclude:: ../../../../../../examples/pygeosxExamples/sedovWithStressFunction/run_sedov_problem.py :language: python - :start-after: # PYGEOSX_STRESS_IC - :end-before: # PYGEOSX_STRESS_IC_END + :start-after: # PYGEOS_STRESS_IC + :end-before: # PYGEOS_STRESS_IC_END Finally, we run the simulation. As an optional step, we extract numpy arrays from the datastructure using different parallel approaches: .. literalinclude:: ../../../../../../examples/pygeosxExamples/sedovWithStressFunction/run_sedov_problem.py :language: python - :start-after: # PYGEOSX_MAIN_LOOP - :end-before: # PYGEOSX_MAIN_LOOP_END + :start-after: # PYGEOS_MAIN_LOOP + :end-before: # PYGEOS_MAIN_LOOP_END --------------------------------- diff --git a/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example b/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example index edf71ed717f..1c5f4b9628d 100644 --- a/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example +++ b/src/docs/sphinx/developerGuide/Contributing/Dockerfile-remote-dev.example @@ -47,7 +47,7 @@ RUN touch /root/.ssh/environment &&\ echo "MPIEXEC=${MPIEXEC}" >> /root/.ssh/environment &&\ echo "OMPI_CC=${CC}" >> /root/.ssh/environment &&\ echo "OMPI_CXX=${CXX}" >> /root/.ssh/environment &&\ - echo "GEOSX_TPL_DIR=${GEOSX_TPL_DIR}" >> /root/.ssh/environment + echo "GEOS_TPL_DIR=${GEOS_TPL_DIR}" >> /root/.ssh/environment # If you decide to work as root in your container, you may consider adding # `OMPI_ALLOW_RUN_AS_ROOT=1` and `OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1` # to your environment. This will prevent you from adding the `--allow-run-as-root` option diff --git a/src/externalComponents/newComponentTemplate/src/CMakeLists.txt b/src/externalComponents/newComponentTemplate/src/CMakeLists.txt index 2ee1663ec90..ffc7fbb9552 100644 --- a/src/externalComponents/newComponentTemplate/src/CMakeLists.txt +++ b/src/externalComponents/newComponentTemplate/src/CMakeLists.txt @@ -9,7 +9,7 @@ set( componentSources NewComponent.cpp ) unset( dependencyList ) # Specify dependencies -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core) else() list( APPEND dependencyList ${geosx_core_libs} ) @@ -21,6 +21,6 @@ blt_add_library( NAME newComponentTemplate SOURCES ${componentSources} HEADERS ${componentHeaders} DEPENDS_ON ${dependencyList} - OBJECT ${GEOSX_BUILD_OBJ_LIBS} ) + OBJECT ${GEOS_BUILD_OBJ_LIBS} ) target_include_directories( newComponentTemplate PUBLIC ${CMAKE_CURRENT_LIST_DIR} ) diff --git a/src/externalComponents/newComponentTemplate/src/NewComponent.cpp b/src/externalComponents/newComponentTemplate/src/NewComponent.cpp index 446e163ec6f..9a736691569 100644 --- a/src/externalComponents/newComponentTemplate/src/NewComponent.cpp +++ b/src/externalComponents/newComponentTemplate/src/NewComponent.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/externalComponents/newComponentTemplate/src/NewComponent.hpp b/src/externalComponents/newComponentTemplate/src/NewComponent.hpp index 3352899d2a4..788bf745527 100644 --- a/src/externalComponents/newComponentTemplate/src/NewComponent.hpp +++ b/src/externalComponents/newComponentTemplate/src/NewComponent.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/externalComponents/newComponentTemplate/tests/CMakeLists.txt b/src/externalComponents/newComponentTemplate/tests/CMakeLists.txt index 272d3f6a8a4..b64bfbfe5b7 100644 --- a/src/externalComponents/newComponentTemplate/tests/CMakeLists.txt +++ b/src/externalComponents/newComponentTemplate/tests/CMakeLists.txt @@ -1,7 +1,7 @@ # Specify list of tests set( dependencyList gtest ) -if ( GEOSX_BUILD_SHARED_LIBS ) +if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core ) else() list( APPEND dependencyList ${geosx_core_libs} ) diff --git a/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp b/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp index 69911571f0a..bfb46c966b1 100644 --- a/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp +++ b/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/main/main.cpp b/src/main/main.cpp index 795228f32e3..731496fb5b0 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/pygeosx/pygeosx.cpp b/src/pygeosx/pygeosx.cpp index 3210a2365ea..8567043a8ca 100644 --- a/src/pygeosx/pygeosx.cpp +++ b/src/pygeosx/pygeosx.cpp @@ -2,17 +2,17 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ - // Python.h must be included first. #define PY_SSIZE_T_CLEAN #include diff --git a/src/pygeosx/pygeosx.hpp b/src/pygeosx/pygeosx.hpp index 26195ddf02f..92a44fcc60f 100644 --- a/src/pygeosx/pygeosx.hpp +++ b/src/pygeosx/pygeosx.hpp @@ -2,19 +2,20 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2019 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2019 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2019 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors - * All right reserved + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. * ------------------------------------------------------------------------------------------------------------ */ // Source includes -#ifndef GEOS_PYGEOSX_PYGEOSX_HPP_ -#define GEOS_PYGEOSX_PYGEOSX_HPP_ +#ifndef GEOS_PYGEOS_PYGEOS_HPP_ +#define GEOS_PYGEOS_PYGEOS_HPP_ #include "LvArray/src/python/pythonForwardDeclarations.hpp" #include "mainInterface/GeosxState.hpp" From 692dd5096f14b73bde86e6b0267bd9815180d73f Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Wed, 24 Jul 2024 02:03:29 -0500 Subject: [PATCH 140/286] refactor: Add component selector for fluid models (#3213) * Add component selector * Add test cases * Fix integrated tests * Remove thermal test * Use integer sequence generator * Use constexpr if * thermal -> isThermalType --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 + .../co2_flux_dirichlet.xml | 227 ++++++++++++++++++ .../compositionalMultiphaseFlow.ats | 8 + src/coreComponents/common/TypeDispatch.hpp | 10 +- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 8 - .../multifluid/CO2Brine/CO2BrineFluid.hpp | 14 +- .../fluid/multifluid/MultiFluidBase.hpp | 14 ++ .../fluid/multifluid/MultiFluidSelector.hpp | 60 ++++- .../multifluid/blackOil/BlackOilFluid.hpp | 5 + .../multifluid/blackOil/BlackOilFluidBase.cpp | 7 + .../multifluid/blackOil/DeadOilFluid.cpp | 10 + .../multifluid/blackOil/DeadOilFluid.hpp | 9 + .../CompositionalMultiphaseFluid.hpp | 2 + ...CompositionalMultiphaseFluidPVTPackage.hpp | 2 + .../constitutive/unitTests/CMakeLists.txt | 1 + .../unitTests/testMultiFluidSelector.cpp | 158 ++++++++++++ ...ermalCompositionalMultiphaseFVMKernels.hpp | 49 ++-- ...ermalCompositionalMultiphaseFVMKernels.hpp | 58 +++-- 19 files changed, 579 insertions(+), 70 deletions(-) create mode 100644 inputFiles/compositionalMultiphaseFlow/co2_flux_dirichlet.xml create mode 100644 src/coreComponents/constitutive/unitTests/testMultiFluidSelector.cpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 89ea94460ed..faf2510c6d0 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3194-6060-e5ba0ce + baseline: integratedTests/baseline_integratedTests-pr3213-6170-5c2c0bf allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index f2b0f19deca..311eef501c0 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3213 (2024-07-12) +====================== +Added baselines for new tests on Dirichlet boundary conditions for multiphase flow. + + PR #3194 (2024-07-10) ====================== Use aperture table in poromechanics with conforming fractures. Rebaseline the corresponding cases. diff --git a/inputFiles/compositionalMultiphaseFlow/co2_flux_dirichlet.xml b/inputFiles/compositionalMultiphaseFlow/co2_flux_dirichlet.xml new file mode 100644 index 00000000000..00f64a5babe --- /dev/null +++ b/inputFiles/compositionalMultiphaseFlow/co2_flux_dirichlet.xml @@ -0,0 +1,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats b/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats index 319422346c8..39689e8798a 100644 --- a/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats +++ b/inputFiles/compositionalMultiphaseFlow/compositionalMultiphaseFlow.ats @@ -93,6 +93,14 @@ decks = [ restart_step=10, check_step=20, restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="co2_flux_dirichlet", + description= + "Compositional co2-brine flow test (2D co2 injection, 2-phase co2-brine, Table 2-phase relperm curves, Dirichlet boundary)", + partitions=((1, 1, 1), (2, 1, 3)), + restart_step=23, + check_step=46, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( name="deadoil_3ph_staircase_obl_3d", description= diff --git a/src/coreComponents/common/TypeDispatch.hpp b/src/coreComponents/common/TypeDispatch.hpp index 0a845210a22..0d4f1a8d761 100644 --- a/src/coreComponents/common/TypeDispatch.hpp +++ b/src/coreComponents/common/TypeDispatch.hpp @@ -154,6 +154,12 @@ using Increment = typename IncrementImpl< T, N >::type; } // namespace internal +/** + * @brief Generate a sequence of integers from @p Begin up to (and including) @p End. + */ +template< integer Begin, integer End > +using IntegerSequence = internal::Increment< camp::make_idx_seq_t< End - Begin + 1 >, Begin >; + /** * @brief Construct a list of types. */ @@ -190,10 +196,10 @@ using IntegralTypes = TypeList< integer, localIndex, globalIndex >; using RealTypes = TypeList< real32, real64 >; /** - * @brief Generate a list of types representing array dimensionalities from M up to (and including) @p N. + * @brief Generate a list of types representing array dimensionalities from @p M up to (and including) @p N. */ template< int M, int N > -using DimsRange = camp::as_list< internal::Increment< camp::make_idx_seq_t< N - M + 1 >, M > >; +using DimsRange = camp::as_list< IntegerSequence< M, N > >; /** * @brief Generate a list of types representing array dimensionality exactly @p N. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 9267c9a3309..67454b13c51 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -115,14 +115,6 @@ CO2BrineFluid( string const & name, Group * const parent ): } } -template< typename PHASE1, typename PHASE2, typename FLASH > -bool CO2BrineFluid< PHASE1, PHASE2, FLASH >::isThermal() const -{ - return ( PHASE1::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() && - PHASE2::Enthalpy::catalogName() != PVTProps::NoOpPVTFunction::catalogName() ); -} - - template< typename PHASE1, typename PHASE2, typename FLASH > std::unique_ptr< ConstitutiveBase > CO2BrineFluid< PHASE1, PHASE2, FLASH >:: diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp index 968adbf775f..2eec3526e92 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp @@ -63,7 +63,19 @@ class CO2BrineFluid : public MultiFluidBase virtual string getCatalogName() const override { return catalogName(); } - virtual bool isThermal() const override; + static constexpr bool isThermalType() + { + return !( std::is_same_v< typename PHASE1::Enthalpy, PVTProps::NoOpPVTFunction > || + std::is_same_v< typename PHASE2::Enthalpy, PVTProps::NoOpPVTFunction > ); + } + + static constexpr integer min_n_components = 2; + static constexpr integer max_n_components = 2; + + virtual bool isThermal() const override + { + return isThermalType(); + } /** * @brief Kernel wrapper class for CO2BrineFluid. diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp index 2e570e58dab..825fac729af 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp @@ -57,6 +57,20 @@ class MultiFluidBase : public ConstitutiveBase */ static constexpr integer MAX_NUM_PHASES = MultiFluidConstants::MAX_NUM_PHASES; + /** + * @brief Minimum supported number of fluid components (species) for dispatch + * @note This is the mininum number of components that can be used for dispatch in a kernel launch specific for + * this fluid type. + */ + static constexpr integer min_n_components = 2; + + /** + * @brief Maximum supported number of fluid components (species) for dispatch + * @note This is the maxinum number of components that can be used for dispatch in a kernel launch specific for + * this fluid type. + */ + static constexpr integer max_n_components = 5; + /** * @return number of fluid components (species) in the model */ diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index 9934a77c5ca..470720f3617 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -24,7 +24,7 @@ #include "constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp" #include "constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp" -#include "common/GeosxConfig.hpp" +#include "common/TypeDispatch.hpp" #ifdef GEOS_USE_PVTPackage #include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp" #endif @@ -80,6 +80,64 @@ void constitutiveUpdatePassThru( MultiFluidBase & fluid, >::execute( fluid, std::forward< LAMBDA >( lambda ) ); } +namespace detail +{ +/** + * @brief Structure to execute a lambda on a fluid model depending on the number of components + * @tparam COMPONENT_LIST Type listing the components to expand over + */ +template< typename COMPONENT_LIST > +struct ComponentSelector; + +template< camp::idx_t ... Is > +struct ComponentSelector< camp::idx_seq< Is ... > > +{ + template< typename FluidType, typename LAMBDA > + static void execute( int numComps, FluidType & fluid, LAMBDA && lambda ) + { +// With gcc8, the fold expression below issues a spurious warning +// warning: suggest parentheses around '&&' within '||' [-Wparentheses] +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94505 +#if (defined(__GNUC__) && (__GNUC__ < 10)) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wparentheses" +#endif + + bool const supported = ( ((numComps == Is) && (lambda( fluid, std::integral_constant< integer, Is >() ), true)) || ...); + +#if (defined(__GNUC__) && (__GNUC__ < 10)) +#pragma GCC diagnostic pop +#endif + GEOS_THROW_IF( !supported, + "Unsupported number of components: " << numComps << " for fluid " << FluidType::catalogName(), + InputError ); + } +}; + +} + +template< bool THERMAL = false, typename LAMBDA = NoOpFunc > +void constitutiveComponentUpdatePassThru( MultiFluidBase & fluidBase, + integer const numComps, + LAMBDA && lambda ) +{ + constitutiveUpdatePassThru( fluidBase, [&]( auto & fluid ) + { + using FluidType = TYPEOFREF( fluid ); + static_assert( FluidType::min_n_components <= FluidType::max_n_components ); + using Components = typename types::IntegerSequence< FluidType::min_n_components, FluidType::max_n_components >::type; + if constexpr (!THERMAL || FluidType::isThermalType()) + { + detail::ComponentSelector< Components >::execute( numComps, fluid, std::forward< LAMBDA >( lambda )); + } + else + { + GEOS_THROW( "Unsupported thermal call for fluid " << FluidType::catalogName(), + InputError ); + } + } ); +} + } // namespace constitutive } // namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp index 0527fe51d75..29ff379ea41 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp @@ -52,6 +52,11 @@ class BlackOilFluid : public BlackOilFluidBase virtual string getCatalogName() const override { return catalogName(); } + static constexpr bool isThermalType(){ return false; } + + static constexpr integer min_n_components = 3; + static constexpr integer max_n_components = 3; + /** * @brief Kernel wrapper class for BlackOilFluid * This kernel can be called on the GPU diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp index 39b44a8112f..e31fa7bb339 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp @@ -187,6 +187,13 @@ void BlackOilFluidBase::postInputInitialization() m_phaseOrder[m_phaseTypes[ip]] = ip; } + // Number of components should be at least equal to number of phases + GEOS_THROW_IF_LT_MSG( numFluidComponents(), numFluidPhases(), + GEOS_FMT( "{}: {} number of components ({}) must be at least number of phases ({})", + getFullName(), viewKeyStruct::componentNamesString(), + numFluidComponents(), numFluidPhases() ), + InputError ); + auto const checkInputSize = [&]( auto const & array, auto const & attribute ) { GEOS_THROW_IF_NE_MSG( array.size(), m_phaseNames.size(), diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp index 6739765da10..390e756f5fd 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp @@ -33,6 +33,16 @@ DeadOilFluid::DeadOilFluid( string const & name, BlackOilFluidBase( name, parent ) {} +void DeadOilFluid::postInputInitialization() +{ + BlackOilFluidBase::postInputInitialization(); + + integer const numComps = numFluidComponents(); + GEOS_THROW_IF( numComps != 2 && numComps != 3, + GEOS_FMT( "{}: this model only supports 2 or 3 components", getFullName() ), + InputError ); +} + void DeadOilFluid::readInputDataFromPVTFiles() { GEOS_THROW_IF_NE_MSG( m_tableFiles.size(), numFluidPhases(), diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp index 9982eed41ae..361f15aa343 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp @@ -38,6 +38,11 @@ class DeadOilFluid : public BlackOilFluidBase virtual string getCatalogName() const override { return catalogName(); } + static constexpr bool isThermalType(){ return false; } + + static constexpr integer min_n_components = 2; + static constexpr integer max_n_components = 3; + /** * @brief Kernel wrapper class for DeadOilFluid * This kernel can be called on the GPU @@ -131,6 +136,10 @@ class DeadOilFluid : public BlackOilFluidBase */ KernelWrapper createKernelWrapper(); +protected: + + virtual void postInputInitialization() override; + private: /** diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp index 9646ba94ad0..5e37c4ab479 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp @@ -68,6 +68,8 @@ class CompositionalMultiphaseFluid : public MultiFluidBase virtual string getCatalogName() const override { return catalogName(); } + static constexpr bool isThermalType(){ return false; } + // TODO: This method should be implemented if an incorrect extrapolation of the pressure and temperature is encountered in the kernel /** * @copydoc MultiFluidBase::checkTablesParameters( real64 pressure, real64 temperature ) diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp index f5206116040..85bb218a6f3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp @@ -46,6 +46,8 @@ class CompositionalMultiphaseFluidPVTPackage : public MultiFluidBase virtual string getCatalogName() const override { return catalogName(); } + static constexpr bool isThermalType(){ return false; } + // TODO: This method should be implemented if an incorrect extrapolation of the pressure and temperature is encountered in the kernel /** * @copydoc MultiFluidBase::checkTablesParameters( real64 pressure, real64 temperature ) diff --git a/src/coreComponents/constitutive/unitTests/CMakeLists.txt b/src/coreComponents/constitutive/unitTests/CMakeLists.txt index 09f808eeb27..a4d541ee37b 100644 --- a/src/coreComponents/constitutive/unitTests/CMakeLists.txt +++ b/src/coreComponents/constitutive/unitTests/CMakeLists.txt @@ -9,6 +9,7 @@ set( gtest_geosx_tests testKValueInitialization.cpp testLohrenzBrayClarkViscosity.cpp testModifiedCamClay.cpp + testMultiFluidSelector.cpp testNegativeTwoPhaseFlash.cpp testNegativeTwoPhaseFlash9Comp.cpp testParticleFluidEnums.cpp diff --git a/src/coreComponents/constitutive/unitTests/testMultiFluidSelector.cpp b/src/coreComponents/constitutive/unitTests/testMultiFluidSelector.cpp new file mode 100644 index 00000000000..12d05d769bd --- /dev/null +++ b/src/coreComponents/constitutive/unitTests/testMultiFluidSelector.cpp @@ -0,0 +1,158 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/MultiFluidSelector.hpp" + +using namespace geos; +using namespace geos::testing; +using namespace geos::constitutive; + +template< typename FluidType > +class MultiFluidSelectorTest : public ::testing::Test +{ +public: + MultiFluidSelectorTest(): + m_node(), + m_parent( "parent", m_node ) + { + m_model = &m_parent.registerGroup< FluidType >( "fluid" ); + } + ~MultiFluidSelectorTest() override = default; + + MultiFluidBase & getFluid() const { return *m_model; } + +protected: + conduit::Node m_node; + dataRepository::Group m_parent; + FluidType * m_model{}; +}; + +using MultiFluidSelectorTestDeadOilFluid = MultiFluidSelectorTest< DeadOilFluid >; +using MultiFluidSelectorTestCO2BrinePhillipsThermalFluid = MultiFluidSelectorTest< CO2BrinePhillipsThermalFluid >; +using MultiFluidSelectorTestCompositionalTwoPhaseConstantViscosity = MultiFluidSelectorTest< CompositionalTwoPhaseConstantViscosity >; + +TEST_F( MultiFluidSelectorTestDeadOilFluid, testValidComponents ) +{ + bool isExecuted = false; + constitutiveComponentUpdatePassThru( getFluid(), 2, [&]( auto &, auto NC ) + { + integer constexpr numComps = NC(); + EXPECT_EQ( numComps, 2 ); + isExecuted = true; + } ); + EXPECT_TRUE( isExecuted ); + + isExecuted = false; + constitutiveComponentUpdatePassThru( getFluid(), 3, [&]( auto &, auto NC ) + { + integer constexpr numComps = NC(); + EXPECT_EQ( numComps, 3 ); + isExecuted = true; + } ); + EXPECT_TRUE( isExecuted ); +} + +TEST_F( MultiFluidSelectorTestDeadOilFluid, testInvalidComponents ) +{ + EXPECT_THROW( constitutiveComponentUpdatePassThru( getFluid(), 1, []( auto &, auto ) + { + FAIL(); // Shouldn't be called + } ), InputError ); + + EXPECT_THROW( constitutiveComponentUpdatePassThru( getFluid(), 4, []( auto &, auto ) + { + FAIL(); // Shouldn't be called + } ), InputError ); +} + +TEST_F( MultiFluidSelectorTestDeadOilFluid, testThermal ) +{ + EXPECT_THROW( constitutiveComponentUpdatePassThru< true >( getFluid(), 2, []( auto &, auto ) + { + FAIL(); // Shouldn't be called + } ), InputError ); +} + +TEST_F( MultiFluidSelectorTestCO2BrinePhillipsThermalFluid, testValidComponents ) +{ + bool isExecuted = false; + constitutiveComponentUpdatePassThru( getFluid(), 2, [&]( auto &, auto NC ) + { + integer constexpr numComps = NC(); + EXPECT_EQ( numComps, 2 ); + isExecuted = true; + } ); + EXPECT_TRUE( isExecuted ); +} + +TEST_F( MultiFluidSelectorTestCO2BrinePhillipsThermalFluid, testInvalidComponents ) +{ + EXPECT_THROW( constitutiveComponentUpdatePassThru( getFluid(), 1, []( auto &, auto ) + { + FAIL(); // Shouldn't be called + } ), InputError ); + + EXPECT_THROW( constitutiveComponentUpdatePassThru( getFluid(), 3, []( auto &, auto ) + { + FAIL(); // Shouldn't be called + } ), InputError ); +} + +TEST_F( MultiFluidSelectorTestCO2BrinePhillipsThermalFluid, testThermal ) +{ + bool isExecuted = false; + constitutiveComponentUpdatePassThru< true >( getFluid(), 2, [&]( auto &, auto ) + { + isExecuted = true; + } ); + EXPECT_TRUE( isExecuted ); +} + +TEST_F( MultiFluidSelectorTestCompositionalTwoPhaseConstantViscosity, testValidComponents ) +{ + for( integer nc = 2; nc <= 5; nc++ ) + { + bool isExecuted = false; + constitutiveComponentUpdatePassThru( getFluid(), nc, [&]( auto &, auto NC ) + { + integer constexpr numComps = NC(); + EXPECT_EQ( numComps, nc ); + isExecuted = true; + } ); + EXPECT_TRUE( isExecuted ); + } +} + +TEST_F( MultiFluidSelectorTestCompositionalTwoPhaseConstantViscosity, testInvalidComponents ) +{ + EXPECT_THROW( constitutiveComponentUpdatePassThru( getFluid(), 1, []( auto &, auto ) + { + FAIL(); // Shouldn't be called + } ), InputError ); + + EXPECT_THROW( constitutiveComponentUpdatePassThru( getFluid(), 6, []( auto &, auto ) + { + FAIL(); // Shouldn't be called + } ), InputError ); +} + +TEST_F( MultiFluidSelectorTestCompositionalTwoPhaseConstantViscosity, testThermal ) +{ + EXPECT_THROW( constitutiveComponentUpdatePassThru< true >( getFluid(), 2, [&]( auto &, auto ) + { + FAIL(); // Shouldn't be called + } ), InputError ); +} diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp index 6e2ca6a3edf..e873db36651 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp @@ -2125,36 +2125,33 @@ class DirichletFaceBasedAssemblyKernelFactory CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { - constitutive::constitutiveUpdatePassThru( fluidBase, [&]( auto & fluid ) + constitutive::constitutiveComponentUpdatePassThru( fluidBase, numComps, [&]( auto & fluid, auto NC ) { using FluidType = TYPEOFREF( fluid ); typename FluidType::KernelWrapper const fluidWrapper = fluid.createKernelWrapper(); - isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) - { - integer constexpr NUM_COMP = NC(); - integer constexpr NUM_DOF = NC() + 1; - - ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = - elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); - dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - - // for now, we neglect capillary pressure in the kernel - BitFlags< FaceBasedAssemblyKernelFlags > kernelFlags; - if( useTotalMassEquation ) - kernelFlags.set( FaceBasedAssemblyKernelFlags::TotalMassEquation ); - - using kernelType = DirichletFaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, typename FluidType::KernelWrapper >; - typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); - typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); - typename kernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); - typename kernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); - - kernelType kernel( numPhases, rankOffset, faceManager, stencilWrapper, fluidWrapper, - dofNumberAccessor, compFlowAccessors, multiFluidAccessors, capPressureAccessors, permeabilityAccessors, - dt, localMatrix, localRhs, kernelFlags ); - kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); - } ); + integer constexpr NUM_COMP = NC(); + integer constexpr NUM_DOF = NC() + 1; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + // for now, we neglect capillary pressure in the kernel + BitFlags< FaceBasedAssemblyKernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( FaceBasedAssemblyKernelFlags::TotalMassEquation ); + + using kernelType = DirichletFaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, typename FluidType::KernelWrapper >; + typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); + typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); + typename kernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); + typename kernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); + + kernelType kernel( numPhases, rankOffset, faceManager, stencilWrapper, fluidWrapper, + dofNumberAccessor, compFlowAccessors, multiFluidAccessors, capPressureAccessors, permeabilityAccessors, + dt, localMatrix, localRhs, kernelFlags ); + kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); } ); } }; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp index 1fc4920902e..8b9de7e2650 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp @@ -1395,41 +1395,37 @@ class DirichletFaceBasedAssemblyKernelFactory CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { - constitutive::constitutiveUpdatePassThru( fluidBase, [&]( auto & fluid ) + constitutive::constitutiveComponentUpdatePassThru< true >( fluidBase, numComps, [&]( auto & fluid, auto NC ) { using FluidType = TYPEOFREF( fluid ); typename FluidType::KernelWrapper const fluidWrapper = fluid.createKernelWrapper(); - isothermalCompositionalMultiphaseBaseKernels:: - internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) - { - integer constexpr NUM_COMP = NC(); - integer constexpr NUM_DOF = NC() + 2; - - ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = - elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); - dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - - // for now, we neglect capillary pressure in the kernel - BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags; - if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags::TotalMassEquation ); - - using KernelType = DirichletFaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, typename FluidType::KernelWrapper >; - typename KernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); - typename KernelType::ThermalCompFlowAccessors thermalCompFlowAccessors( elemManager, solverName ); - typename KernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); - typename KernelType::ThermalMultiFluidAccessors thermalMultiFluidAccessors( elemManager, solverName ); - typename KernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); - typename KernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); - typename KernelType::ThermalConductivityAccessors thermalConductivityAccessors( elemManager, solverName ); - - KernelType kernel( numPhases, rankOffset, faceManager, stencilWrapper, fluidWrapper, - dofNumberAccessor, compFlowAccessors, thermalCompFlowAccessors, multiFluidAccessors, thermalMultiFluidAccessors, - capPressureAccessors, permeabilityAccessors, thermalConductivityAccessors, - dt, localMatrix, localRhs, kernelFlags ); - KernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); - } ); + integer constexpr NUM_COMP = NC(); + integer constexpr NUM_DOF = NC() + 2; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + // for now, we neglect capillary pressure in the kernel + BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags::TotalMassEquation ); + + using KernelType = DirichletFaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, typename FluidType::KernelWrapper >; + typename KernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); + typename KernelType::ThermalCompFlowAccessors thermalCompFlowAccessors( elemManager, solverName ); + typename KernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); + typename KernelType::ThermalMultiFluidAccessors thermalMultiFluidAccessors( elemManager, solverName ); + typename KernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); + typename KernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); + typename KernelType::ThermalConductivityAccessors thermalConductivityAccessors( elemManager, solverName ); + + KernelType kernel( numPhases, rankOffset, faceManager, stencilWrapper, fluidWrapper, + dofNumberAccessor, compFlowAccessors, thermalCompFlowAccessors, multiFluidAccessors, thermalMultiFluidAccessors, + capPressureAccessors, permeabilityAccessors, thermalConductivityAccessors, + dt, localMatrix, localRhs, kernelFlags ); + KernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); } ); } }; From 3d05d390f289f12e4a6af7c37c1a3b345b78d48e Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 24 Jul 2024 19:12:58 +0100 Subject: [PATCH 141/286] ci: Update CODEOWNERS (#3240) * added multiple CODEOWNERS. * exclusion for /src/schema and /BASELINE_NOTES.md --- .github/CODEOWNERS | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 962863b1f71..7fa9879c5a0 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -9,35 +9,36 @@ /.github/ @rrsettgast -/inputFiles/ @CusiniM @cssherman @jhuang2601 +/BASELINE_NOTES.md +/inputFiles/ @CusiniM @cssherman @jhuang2601 @rrsettgast /src/coreComponents/LvArray @rrsettgast @wrtobin @corbett5 @CusiniM /src/coreComponents/codingUtilities @rrsettgast @untereiner @corbett5 /src/coreComponents/common @rrsettgast @MelReyCG @corbett5 -/src/coreComponents/constitutive @rrsettgast @CusiniM @dkachuma +/src/coreComponents/constitutive @rrsettgast @CusiniM @dkachuma @joshua-white /src/coreComponents/dataRepository @rrsettgast @wrtobin @corbett5 /src/coreComponents/denseLinearAlgebra @rrsettgast @CusiniM @castelletto1 /src/coreComponents/discretizationMethods @rrsettgast @CusiniM @castelletto1 /src/coreComponents/events @rrsettgast @corbett5 @cssherman -/src/coreComponents/fieldSpecification @rrsettgast @CusiniM @corbett5 +/src/coreComponents/fieldSpecification @rrsettgast @CusiniM @corbett5 @cssherman /src/coreComponents/fileIO @rrsettgast @wrtobin @MelReyCG @untereiner -/src/coreComponents/finiteElement @rrsettgast @castelletto1 -/src/coreComponents/finiteVolume @rrsettgast @castelletto1 -/src/coreComponents/functions @cssherman @wrtobin +/src/coreComponents/finiteElement @rrsettgast @castelletto1 @andrea-borio @CusiniM +/src/coreComponents/finiteVolume @rrsettgast @castelletto1 @CusiniM @paveltomin +/src/coreComponents/functions @cssherman @wrtobin @rrsettgast /src/coreComponents/linearAlgebra @rrsettgast @castelletto1 @victorapm -/src/coreComponents/mainInterface @rrsettgast @corbett5 -/src/coreComponents/math @rrsettgast @corbett5 +/src/coreComponents/mainInterface @rrsettgast @corbett5 @wrtobin +/src/coreComponents/math @rrsettgast @corbett5 @wrtobin /src/coreComponents/mesh @rrsettgast @wrtobin @untereiner @CusiniM -/src/coreComponents/physicsSolvers @rrsettgast -/src/coreComponents/physicsSolvers/contact @CusiniM @rrsettgast +/src/coreComponents/physicsSolvers @rrsettgast @CusiniM +/src/coreComponents/physicsSolvers/contact @CusiniM @rrsettgast @matteofrigo5 /src/coreComponents/physicsSolvers/fluidFlow @CusiniM @paveltomin @klevzoff @francoishamon /src/coreComponents/physicsSolvers/inducedSeismicity @CusiniM @rrsettgast -/src/coreComponents/physicsSolvers/multiphysics @CusiniM @paveltomin @castelletto1 +/src/coreComponents/physicsSolvers/multiphysics @CusiniM @paveltomin @castelletto1 @rrsettgast /src/coreComponents/physicsSolvers/python @cssherman @corbett5 -/src/coreComponents/physicsSolvers/simplePDE @castelletto1 @rrsettgast +/src/coreComponents/physicsSolvers/simplePDE @castelletto1 @rrsettgast @CusiniM /src/coreComponents/physicsSolvers/solidMechanics @rrsettgast @castelletto1 @CusiniM /src/coreComponents/physicsSolvers/surfaceGeneration @rrsettgast @CusiniM @jhuang2601 /src/coreComponents/physicsSolvers/wavePropagation @sframba @acitrain -!/src/coreComponents/schema +/src/coreComponents/schema /src/coreComponents/unitTests @rrsettgast @corbett5 @wrtobin # Here is a list of GEOS-DEV members as of 2024-07-02 From 4bef600a0dfdf8e8a9bf5ad868a131164d84f39b Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 24 Jul 2024 19:14:38 +0100 Subject: [PATCH 142/286] refactor: Towards modularization of physicsSolver (#3239) * partial breakup of physics packages. Add cmake options for inclusion of each package * move SourceFluxStatistics.xpp out of fieldSpecificaiton to physicsSolvers/fluidFlow --- src/cmake/GeosxOptions.cmake | 10 + .../fieldSpecification/CMakeLists.txt | 2 - .../physicsSolvers/CMakeLists.txt | 252 +++--------------- .../physicsSolvers/contact/CMakeLists.txt | 28 ++ .../physicsSolvers/fluidFlow/CMakeLists.txt | 84 ++++++ .../fluidFlow/CompositionalMultiphaseBase.cpp | 2 +- .../ReactiveCompositionalMultiphaseOBL.cpp | 2 +- .../fluidFlow/SinglePhaseBase.cpp | 2 +- .../fluidFlow}/SourceFluxStatistics.cpp | 4 +- .../fluidFlow}/SourceFluxStatistics.hpp | 4 +- .../inducedSeismicity/CMakeLists.txt | 13 + .../multiphysics/CMakeLists.txt | 56 ++++ .../physicsSolvers/python/CMakeLists.txt | 15 ++ .../physicsSolvers/simplePDE/CMakeLists.txt | 17 ++ .../solidMechanics/CMakeLists.txt | 36 +++ .../surfaceGeneration/CMakeLists.txt | 20 ++ .../wavePropagation/CMakeLists.txt | 43 +++ src/coreComponents/schema/docs/ChomboIO.rst | 24 +- src/coreComponents/schema/schema.xsd | 8 +- src/coreComponents/unitTests/CMakeLists.txt | 5 +- .../fluidFlowTests/testCompFlowUtils.hpp | 24 +- .../fluidFlowTests/testFlowStatistics.cpp | 2 +- src/pygeosx/pygeosx.cpp | 2 +- src/pygeosx/pygeosx.hpp | 2 +- 24 files changed, 400 insertions(+), 257 deletions(-) create mode 100644 src/coreComponents/physicsSolvers/contact/CMakeLists.txt create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt rename src/coreComponents/{fieldSpecification => physicsSolvers/fluidFlow}/SourceFluxStatistics.cpp (99%) rename src/coreComponents/{fieldSpecification => physicsSolvers/fluidFlow}/SourceFluxStatistics.hpp (99%) create mode 100644 src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt create mode 100644 src/coreComponents/physicsSolvers/multiphysics/CMakeLists.txt create mode 100644 src/coreComponents/physicsSolvers/python/CMakeLists.txt create mode 100644 src/coreComponents/physicsSolvers/simplePDE/CMakeLists.txt create mode 100644 src/coreComponents/physicsSolvers/solidMechanics/CMakeLists.txt create mode 100644 src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt create mode 100644 src/coreComponents/physicsSolvers/wavePropagation/CMakeLists.txt diff --git a/src/cmake/GeosxOptions.cmake b/src/cmake/GeosxOptions.cmake index 3a39f49670a..debe45fdf62 100644 --- a/src/cmake/GeosxOptions.cmake +++ b/src/cmake/GeosxOptions.cmake @@ -103,6 +103,16 @@ if( GEOS_PARALLEL_LINK_JOBS ) set( CMAKE_JOB_POOL_LINK link_job_pool ) endif() +# Physics packages +option( GEOS_ENABLE_CONTACT "Enables contact physics package" ON ) +option( GEOS_ENABLE_FLUIDFLOW "Enables fluid flow physics package" ON ) +option( GEOS_ENABLE_INDUCEDSEISMICITY "Enables induced seismicity physics package" ON ) +option( GEOS_ENABLE_MULTIPHYSICS "Enables multiphysics physics package" ON ) +option( GEOS_ENABLE_SIMPLEPDE "Enables simple PDE physics package" ON ) +option( GEOS_ENABLE_SOLIDMECHANICS "Enables solid mechanics physics package" ON ) +option( GEOS_ENABLE_SURFACEGENERATION "Enables surface generation physics package" ON ) +option( GEOS_ENABLE_WAVEPROPAGATION "Enables wave propagation physics package" ON ) + #set(CMAKE_POSITION_INDEPENDENT_CODE ON CACHE BOOL "" FORCE) #blt_append_custom_compiler_flag(FLAGS_VAR CMAKE_CXX_FLAGS DEFAULT -rdynamic) #set(CMAKE_EXE_LINKER_FLAGS "-rdynamic") diff --git a/src/coreComponents/fieldSpecification/CMakeLists.txt b/src/coreComponents/fieldSpecification/CMakeLists.txt index e88c53b708a..d13d6a6c795 100644 --- a/src/coreComponents/fieldSpecification/CMakeLists.txt +++ b/src/coreComponents/fieldSpecification/CMakeLists.txt @@ -10,7 +10,6 @@ set( fieldSpecification_headers TractionBoundaryCondition.hpp AquiferBoundaryCondition.hpp PerfectlyMatchedLayer.hpp - SourceFluxStatistics.hpp ) # @@ -25,7 +24,6 @@ set( fieldSpecification_sources TractionBoundaryCondition.cpp AquiferBoundaryCondition.cpp PerfectlyMatchedLayer.cpp - SourceFluxStatistics.cpp ) set( dependencyList ${parallelDeps} functions linearAlgebra ) diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index d383138e147..cfcdce65e78 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -7,165 +7,7 @@ set( physicsSolvers_headers SolverBaseKernels.hpp SolverStatistics.hpp FieldStatisticsBase.hpp - contact/ContactSolverBase.hpp - contact/ContactFields.hpp - contact/SolidMechanicsEFEMKernelsBase.hpp - contact/SolidMechanicsEFEMKernels.hpp - contact/SolidMechanicsEFEMStaticCondensationKernels.hpp - contact/SolidMechanicsEFEMKernelsHelper.hpp - contact/SolidMechanicsEmbeddedFractures.hpp - contact/SolidMechanicsLagrangeContact.hpp - contact/SolidMechanicsAugmentedLagrangianContact.hpp - contact/SolidMechanicsALMKernelsBase.hpp - contact/SolidMechanicsALMKernels.hpp - contact/SolidMechanicsALMKernelsHelper.hpp - contact/SolidMechanicsALMJumpUpdateKernels.hpp - contact/SolidMechanicsALMBubbleKernels.hpp - fluidFlow/CompositionalMultiphaseBase.hpp - fluidFlow/CompositionalMultiphaseBaseFields.hpp - fluidFlow/CompositionalMultiphaseStatistics.hpp - fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp - fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp - fluidFlow/CompositionalMultiphaseFVM.hpp - fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp - fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp - fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp - fluidFlow/CompositionalMultiphaseHybridFVM.hpp - fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp - fluidFlow/CompositionalMultiphaseUtilities.hpp - fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp - fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp - fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp - fluidFlow/FlowSolverBase.hpp - fluidFlow/FlowSolverBaseFields.hpp - fluidFlow/FlowSolverBaseKernels.hpp - fluidFlow/FluxKernelsHelper.hpp - fluidFlow/HybridFVMHelperKernels.hpp - fluidFlow/proppantTransport/ProppantTransport.hpp - fluidFlow/proppantTransport/ProppantTransportFields.hpp - fluidFlow/proppantTransport/ProppantTransportKernels.hpp - fluidFlow/SinglePhaseBase.hpp - fluidFlow/SinglePhaseBaseFields.hpp - fluidFlow/SinglePhaseBaseKernels.hpp - fluidFlow/SinglePhaseStatistics.hpp - fluidFlow/SinglePhaseFVM.hpp - fluidFlow/SinglePhaseFVMKernels.hpp - fluidFlow/SinglePhaseHybridFVM.hpp - fluidFlow/SinglePhaseHybridFVMKernels.hpp - fluidFlow/SinglePhaseProppantBase.hpp - fluidFlow/SinglePhaseProppantBaseKernels.hpp - fluidFlow/SinglePhaseProppantFluxKernels.hpp - fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp - fluidFlow/StabilizedSinglePhaseFVMKernels.hpp - fluidFlow/StencilAccessors.hpp - fluidFlow/ThermalSinglePhaseBaseKernels.hpp - fluidFlow/ThermalSinglePhaseFVMKernels.hpp - fluidFlow/wells/CompositionalMultiphaseWell.hpp - fluidFlow/wells/CompositionalMultiphaseWellFields.hpp - fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp - fluidFlow/wells/SinglePhaseWell.hpp - fluidFlow/wells/SinglePhaseWellFields.hpp - fluidFlow/wells/SinglePhaseWellKernels.hpp - fluidFlow/wells/WellConstants.hpp - fluidFlow/wells/WellControls.hpp - fluidFlow/wells/WellSolverBase.hpp - fluidFlow/wells/WellSolverBaseFields.hpp - inducedSeismicity/inducedSeismicityFields.hpp - inducedSeismicity/SeismicityRate.hpp - inducedSeismicity/SeismicityRateKernels.hpp - multiphysics/CompositionalMultiphaseReservoirAndWells.hpp - multiphysics/CoupledReservoirAndWellsBase.hpp - multiphysics/CoupledSolver.hpp - multiphysics/PoromechanicsSolver.hpp - multiphysics/FlowProppantTransportSolver.hpp - multiphysics/HydrofractureSolver.hpp - multiphysics/HydrofractureSolverKernels.hpp - multiphysics/MultiphasePoromechanics.hpp - multiphysics/PhaseFieldFractureSolver.hpp - multiphysics/PoromechanicsInitialization.hpp - multiphysics/PoromechanicsFields.hpp - multiphysics/PoromechanicsInitialization.hpp - multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp - multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp - multiphysics/poromechanicsKernels/PoromechanicsBase.hpp - multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp - multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp - multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp - multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp - multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp - multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp - multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp - multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp - multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp - multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp - multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp - multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp - multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp - multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp - multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp - multiphysics/SinglePhasePoromechanics.hpp - multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp - multiphysics/SinglePhasePoromechanicsConformingFractures.hpp - multiphysics/SinglePhaseReservoirAndWells.hpp - simplePDE/LaplaceBaseH1.hpp - simplePDE/LaplaceFEM.hpp - simplePDE/LaplaceFEMKernels.hpp - simplePDE/PhaseFieldDamageFEM.hpp - simplePDE/PhaseFieldDamageFEMKernels.hpp - solidMechanics/SolidMechanicsFields.hpp - solidMechanics/SolidMechanicsLagrangianFEM.hpp - solidMechanics/SolidMechanicsLagrangianFEM.hpp - solidMechanics/SolidMechanicsLagrangianSSLE.hpp - solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp - solidMechanics/SolidMechanicsMPM.hpp - solidMechanics/MPMSolverFields.hpp - solidMechanics/kernels/ExplicitFiniteStrain.hpp - solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp - solidMechanics/kernels/ExplicitMPM.hpp - solidMechanics/kernels/ExplicitSmallStrain.hpp - solidMechanics/kernels/ExplicitSmallStrain_impl.hpp - solidMechanics/kernels/FixedStressThermoPoromechanics.hpp - solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp - solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp - solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp - solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp - solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp - solidMechanics/SolidMechanicsStateReset.hpp - solidMechanics/SolidMechanicsStatistics.hpp - surfaceGeneration/EmbeddedSurfaceGenerator.hpp - surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp - surfaceGeneration/ParallelTopologyChange.hpp - surfaceGeneration/SurfaceGenerator.hpp - surfaceGeneration/SurfaceGeneratorFields.hpp - surfaceGeneration/kernels/surfaceGenerationKernels.hpp - surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp - wavePropagation/shared/WaveSolverBase.hpp - wavePropagation/shared/WaveSolverUtils.hpp - wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp - wavePropagation/sem/acoustic/shared/AcousticFields.hpp - wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp - wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp - wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp - wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp - wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp - wavePropagation/sem/elastic/shared/ElasticFields.hpp - wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp - wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp - wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp - wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp - wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp - wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp - wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp - wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp - wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp - wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp - wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp - wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp - wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp - wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp - wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp - wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp - wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp ) + ) # Specify solver sources set( physicsSolvers_sources @@ -173,67 +15,41 @@ set( physicsSolvers_sources NonlinearSolverParameters.cpp PhysicsSolverManager.cpp SolverBase.cpp - SolverStatistics.cpp - contact/ContactSolverBase.cpp - contact/SolidMechanicsEmbeddedFractures.cpp - contact/SolidMechanicsLagrangeContact.cpp - contact/SolidMechanicsAugmentedLagrangianContact.cpp - fluidFlow/CompositionalMultiphaseBase.cpp - fluidFlow/CompositionalMultiphaseFVM.cpp - fluidFlow/CompositionalMultiphaseStatistics.cpp - fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp - fluidFlow/CompositionalMultiphaseHybridFVM.cpp - fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp - fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp - fluidFlow/FlowSolverBase.cpp - fluidFlow/proppantTransport/ProppantTransport.cpp - fluidFlow/proppantTransport/ProppantTransportKernels.cpp - fluidFlow/SinglePhaseBase.cpp - fluidFlow/SinglePhaseStatistics.cpp - fluidFlow/SinglePhaseFVM.cpp - fluidFlow/SinglePhaseHybridFVM.cpp - fluidFlow/SinglePhaseProppantBase.cpp - fluidFlow/SinglePhaseProppantFluxKernels.cpp - fluidFlow/wells/CompositionalMultiphaseWell.cpp - fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp - fluidFlow/wells/SinglePhaseWell.cpp - fluidFlow/wells/SinglePhaseWellKernels.cpp - fluidFlow/wells/WellControls.cpp - fluidFlow/wells/WellSolverBase.cpp - inducedSeismicity/SeismicityRate.cpp - multiphysics/CompositionalMultiphaseReservoirAndWells.cpp - multiphysics/CoupledReservoirAndWellsBase.cpp - multiphysics/FlowProppantTransportSolver.cpp - multiphysics/HydrofractureSolver.cpp - multiphysics/MultiphasePoromechanics.cpp - multiphysics/PhaseFieldFractureSolver.cpp - multiphysics/PoromechanicsInitialization.cpp - multiphysics/SinglePhasePoromechanics.cpp - multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp - multiphysics/SinglePhasePoromechanicsConformingFractures.cpp - multiphysics/SinglePhaseReservoirAndWells.cpp - simplePDE/LaplaceBaseH1.cpp - simplePDE/LaplaceFEM.cpp - simplePDE/PhaseFieldDamageFEM.cpp - solidMechanics/SolidMechanicsLagrangianFEM.cpp - solidMechanics/SolidMechanicsLagrangianSSLE.cpp - solidMechanics/SolidMechanicsMPM.cpp - solidMechanics/SolidMechanicsStateReset.cpp - solidMechanics/SolidMechanicsStatistics.cpp - surfaceGeneration/EmbeddedSurfaceGenerator.cpp - surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp - surfaceGeneration/ParallelTopologyChange.cpp - surfaceGeneration/SurfaceGenerator.cpp - wavePropagation/shared/WaveSolverBase.cpp - wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp - wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp - wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp - wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp - wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp - wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp ) + SolverStatistics.cpp ) - include( solidMechanics/kernels/SolidMechanicsKernels.cmake) +if( GEOS_ENABLE_CONTACT ) + add_subdirectory( contact ) +endif() + +if( GEOS_ENABLE_FLUIDFLOW ) + add_subdirectory( fluidFlow ) +endif() + +if( GEOS_ENABLE_INDUCEDSEISMICITY ) + add_subdirectory( inducedSeismicity ) +endif() + +if( GEOS_ENABLE_MULTIPHYSICS ) + add_subdirectory( multiphysics ) include( multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake) +endif() + +if( GEOS_ENABLE_SIMPLEPDE ) + add_subdirectory( simplePDE ) +endif() + +if( GEOS_ENABLE_SOLIDMECHANICS ) + add_subdirectory( solidMechanics ) + include( solidMechanics/kernels/SolidMechanicsKernels.cmake) +endif() + +if( GEOS_ENABLE_SURFACEGENERATION ) + add_subdirectory( surfaceGeneration ) +endif() + +if( GEOS_ENABLE_WAVEPROPAGATION ) + add_subdirectory( wavePropagation ) +endif() set( dependencyList ${parallelDeps} constitutive mesh linearAlgebra discretizationMethods events ) if( ENABLE_PYGEOSX ) diff --git a/src/coreComponents/physicsSolvers/contact/CMakeLists.txt b/src/coreComponents/physicsSolvers/contact/CMakeLists.txt new file mode 100644 index 00000000000..23c4693cedd --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/CMakeLists.txt @@ -0,0 +1,28 @@ +# Specify solver headers +set( physicsSolvers_headers + ${physicsSolvers_headers} + contact/ContactSolverBase.hpp + contact/ContactFields.hpp + contact/SolidMechanicsEFEMKernelsBase.hpp + contact/SolidMechanicsEFEMKernels.hpp + contact/SolidMechanicsEFEMStaticCondensationKernels.hpp + contact/SolidMechanicsEFEMKernelsHelper.hpp + contact/SolidMechanicsEmbeddedFractures.hpp + contact/SolidMechanicsLagrangeContact.hpp + contact/SolidMechanicsAugmentedLagrangianContact.hpp + contact/SolidMechanicsALMKernelsBase.hpp + contact/SolidMechanicsALMKernels.hpp + contact/SolidMechanicsALMKernelsHelper.hpp + contact/SolidMechanicsALMJumpUpdateKernels.hpp + contact/SolidMechanicsALMBubbleKernels.hpp + PARENT_SCOPE ) + + +# Specify solver sources +set( physicsSolvers_sources + ${physicsSolvers_sources} + contact/ContactSolverBase.cpp + contact/SolidMechanicsEmbeddedFractures.cpp + contact/SolidMechanicsLagrangeContact.cpp + contact/SolidMechanicsAugmentedLagrangianContact.cpp + PARENT_SCOPE ) \ No newline at end of file diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt new file mode 100644 index 00000000000..ee3263c50b2 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt @@ -0,0 +1,84 @@ +# Specify solver headers +set( physicsSolvers_headers + ${physicsSolvers_headers} + fluidFlow/CompositionalMultiphaseBase.hpp + fluidFlow/CompositionalMultiphaseBaseFields.hpp + fluidFlow/CompositionalMultiphaseStatistics.hpp + fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp + fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp + fluidFlow/CompositionalMultiphaseFVM.hpp + fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp + fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp + fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp + fluidFlow/CompositionalMultiphaseHybridFVM.hpp + fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp + fluidFlow/CompositionalMultiphaseUtilities.hpp + fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp + fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp + fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp + fluidFlow/FlowSolverBase.hpp + fluidFlow/FlowSolverBaseFields.hpp + fluidFlow/FlowSolverBaseKernels.hpp + fluidFlow/FluxKernelsHelper.hpp + fluidFlow/HybridFVMHelperKernels.hpp + fluidFlow/SourceFluxStatistics.hpp + fluidFlow/proppantTransport/ProppantTransport.hpp + fluidFlow/proppantTransport/ProppantTransportFields.hpp + fluidFlow/proppantTransport/ProppantTransportKernels.hpp + fluidFlow/SinglePhaseBase.hpp + fluidFlow/SinglePhaseBaseFields.hpp + fluidFlow/SinglePhaseBaseKernels.hpp + fluidFlow/SinglePhaseStatistics.hpp + fluidFlow/SinglePhaseFVM.hpp + fluidFlow/SinglePhaseFVMKernels.hpp + fluidFlow/SinglePhaseHybridFVM.hpp + fluidFlow/SinglePhaseHybridFVMKernels.hpp + fluidFlow/SinglePhaseProppantBase.hpp + fluidFlow/SinglePhaseProppantBaseKernels.hpp + fluidFlow/SinglePhaseProppantFluxKernels.hpp + fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp + fluidFlow/StabilizedSinglePhaseFVMKernels.hpp + fluidFlow/StencilAccessors.hpp + fluidFlow/ThermalSinglePhaseBaseKernels.hpp + fluidFlow/ThermalSinglePhaseFVMKernels.hpp + fluidFlow/wells/CompositionalMultiphaseWell.hpp + fluidFlow/wells/CompositionalMultiphaseWellFields.hpp + fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp + fluidFlow/wells/SinglePhaseWell.hpp + fluidFlow/wells/SinglePhaseWellFields.hpp + fluidFlow/wells/SinglePhaseWellKernels.hpp + fluidFlow/wells/WellConstants.hpp + fluidFlow/wells/WellControls.hpp + fluidFlow/wells/WellSolverBase.hpp + fluidFlow/wells/WellSolverBaseFields.hpp + PARENT_SCOPE ) + +# Specify solver sources +set( physicsSolvers_sources + ${physicsSolvers_sources} + fluidFlow/CompositionalMultiphaseBase.cpp + fluidFlow/CompositionalMultiphaseFVM.cpp + fluidFlow/CompositionalMultiphaseStatistics.cpp + fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp + fluidFlow/CompositionalMultiphaseHybridFVM.cpp + fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp + fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp + fluidFlow/FlowSolverBase.cpp + fluidFlow/proppantTransport/ProppantTransport.cpp + fluidFlow/proppantTransport/ProppantTransportKernels.cpp + fluidFlow/SinglePhaseBase.cpp + fluidFlow/SinglePhaseStatistics.cpp + fluidFlow/SinglePhaseFVM.cpp + fluidFlow/SinglePhaseHybridFVM.cpp + fluidFlow/SinglePhaseProppantBase.cpp + fluidFlow/SinglePhaseProppantFluxKernels.cpp + fluidFlow/SourceFluxStatistics.cpp + fluidFlow/wells/CompositionalMultiphaseWell.cpp + fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp + fluidFlow/wells/SinglePhaseWell.cpp + fluidFlow/wells/SinglePhaseWellKernels.cpp + fluidFlow/wells/WellControls.cpp + fluidFlow/wells/WellSolverBase.cpp + PARENT_SCOPE ) + + diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 5510d1b2c98..77bba20f3f6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -36,7 +36,7 @@ #include "fieldSpecification/AquiferBoundaryCondition.hpp" #include "fieldSpecification/EquilibriumInitialCondition.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" -#include "fieldSpecification/SourceFluxStatistics.hpp" +#include "physicsSolvers/fluidFlow/SourceFluxStatistics.hpp" #include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index b117d5dbde5..f73e75e4a0b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -24,7 +24,7 @@ #include "discretizationMethods/NumericalMethodsManager.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" -#include "fieldSpecification/SourceFluxStatistics.hpp" +#include "physicsSolvers/fluidFlow/SourceFluxStatistics.hpp" #include "finiteVolume/FiniteVolumeManager.hpp" #include "finiteVolume/FluxApproximationBase.hpp" #include "mesh/DomainPartition.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 8718bffadd5..9ae62701043 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -32,7 +32,7 @@ #include "fieldSpecification/EquilibriumInitialCondition.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" -#include "fieldSpecification/SourceFluxStatistics.hpp" +#include "physicsSolvers/fluidFlow/SourceFluxStatistics.hpp" #include "finiteVolume/FiniteVolumeManager.hpp" #include "functions/TableFunction.hpp" #include "mainInterface/ProblemManager.hpp" diff --git a/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp similarity index 99% rename from src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp rename to src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp index fd9826952a5..85c552fe3fa 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp @@ -19,8 +19,8 @@ #include "SourceFluxStatistics.hpp" -#include "SourceFluxBoundaryCondition.hpp" -#include "FieldSpecificationManager.hpp" +#include "fieldSpecification/SourceFluxBoundaryCondition.hpp" +#include "fieldSpecification/FieldSpecificationManager.hpp" #include "LvArray/src/tensorOps.hpp" namespace geos diff --git a/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.hpp similarity index 99% rename from src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.hpp index e8ccc6d44f4..b4aee90b0a6 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.hpp @@ -20,8 +20,8 @@ #ifndef SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_SOURCEFLUXSTATISTICS_HPP_ #define SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_SOURCEFLUXSTATISTICS_HPP_ -#include "physicsSolvers/FieldStatisticsBase.hpp" -#include "physicsSolvers/fluidFlow/FlowSolverBase.hpp" +#include "../FieldStatisticsBase.hpp" +#include "FlowSolverBase.hpp" #include "mesh/DomainPartition.hpp" diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt b/src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt new file mode 100644 index 00000000000..e4a805314ac --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt @@ -0,0 +1,13 @@ +# Specify solver headers +set( physicsSolvers_headers + ${physicsSolvers_headers} + inducedSeismicity/inducedSeismicityFields.hpp + inducedSeismicity/SeismicityRate.hpp + inducedSeismicity/SeismicityRateKernels.hpp + PARENT_SCOPE ) + +# Specify solver sources +set( physicsSolvers_sources + ${physicsSolvers_sources} + inducedSeismicity/SeismicityRate.cpp + PARENT_SCOPE ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/CMakeLists.txt b/src/coreComponents/physicsSolvers/multiphysics/CMakeLists.txt new file mode 100644 index 00000000000..60408e700ec --- /dev/null +++ b/src/coreComponents/physicsSolvers/multiphysics/CMakeLists.txt @@ -0,0 +1,56 @@ +# Specify solver headers +set( physicsSolvers_headers + ${physicsSolvers_headers} + multiphysics/CompositionalMultiphaseReservoirAndWells.hpp + multiphysics/CoupledReservoirAndWellsBase.hpp + multiphysics/CoupledSolver.hpp + multiphysics/PoromechanicsSolver.hpp + multiphysics/FlowProppantTransportSolver.hpp + multiphysics/HydrofractureSolver.hpp + multiphysics/HydrofractureSolverKernels.hpp + multiphysics/MultiphasePoromechanics.hpp + multiphysics/PhaseFieldFractureSolver.hpp + multiphysics/PoromechanicsInitialization.hpp + multiphysics/PoromechanicsFields.hpp + multiphysics/PoromechanicsInitialization.hpp + multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp + multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp + multiphysics/poromechanicsKernels/PoromechanicsBase.hpp + multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp + multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp + multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp + multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp + multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp + multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp + multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp + multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp + multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp + multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp + multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp + multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp + multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp + multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp + multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp + multiphysics/SinglePhasePoromechanics.hpp + multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp + multiphysics/SinglePhasePoromechanicsConformingFractures.hpp + multiphysics/SinglePhaseReservoirAndWells.hpp + PARENT_SCOPE ) + +# Specify solver sources +set( physicsSolvers_sources + ${physicsSolvers_sources} + multiphysics/CompositionalMultiphaseReservoirAndWells.cpp + multiphysics/CoupledReservoirAndWellsBase.cpp + multiphysics/FlowProppantTransportSolver.cpp + multiphysics/HydrofractureSolver.cpp + multiphysics/MultiphasePoromechanics.cpp + multiphysics/PhaseFieldFractureSolver.cpp + multiphysics/PoromechanicsInitialization.cpp + multiphysics/SinglePhasePoromechanics.cpp + multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp + multiphysics/SinglePhasePoromechanicsConformingFractures.cpp + multiphysics/SinglePhaseReservoirAndWells.cpp + PARENT_SCOPE ) + +#include( multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake) diff --git a/src/coreComponents/physicsSolvers/python/CMakeLists.txt b/src/coreComponents/physicsSolvers/python/CMakeLists.txt new file mode 100644 index 00000000000..218447f9231 --- /dev/null +++ b/src/coreComponents/physicsSolvers/python/CMakeLists.txt @@ -0,0 +1,15 @@ + +if( ENABLE_PYGEOSX ) + set( physicsSolvers_headers + ${physicsSolvers_headers} + python/PySolver.hpp + python/PySolverType.hpp + PARENT_SCOPE ) + set( physicsSolvers_sources + ${physicsSolvers_sources} + python/PySolver.cpp + PARENT_SCOPE ) + + set( dependencyList ${dependencyList} Python3::Python pylvarray PARENT_SCOPE) +endif() + diff --git a/src/coreComponents/physicsSolvers/simplePDE/CMakeLists.txt b/src/coreComponents/physicsSolvers/simplePDE/CMakeLists.txt new file mode 100644 index 00000000000..66521ed88ce --- /dev/null +++ b/src/coreComponents/physicsSolvers/simplePDE/CMakeLists.txt @@ -0,0 +1,17 @@ +# Specify solver headers +set( physicsSolvers_headers + ${physicsSolvers_headers} + simplePDE/LaplaceBaseH1.hpp + simplePDE/LaplaceFEM.hpp + simplePDE/LaplaceFEMKernels.hpp + simplePDE/PhaseFieldDamageFEM.hpp + simplePDE/PhaseFieldDamageFEMKernels.hpp + PARENT_SCOPE ) + +# Specify solver sources +set( physicsSolvers_sources + ${physicsSolvers_sources} + simplePDE/LaplaceBaseH1.cpp + simplePDE/LaplaceFEM.cpp + simplePDE/PhaseFieldDamageFEM.cpp + PARENT_SCOPE ) diff --git a/src/coreComponents/physicsSolvers/solidMechanics/CMakeLists.txt b/src/coreComponents/physicsSolvers/solidMechanics/CMakeLists.txt new file mode 100644 index 00000000000..ba9d4709fb5 --- /dev/null +++ b/src/coreComponents/physicsSolvers/solidMechanics/CMakeLists.txt @@ -0,0 +1,36 @@ +# Specify solver headers +set( physicsSolvers_headers + ${physicsSolvers_headers} + solidMechanics/SolidMechanicsFields.hpp + solidMechanics/SolidMechanicsLagrangianFEM.hpp + solidMechanics/SolidMechanicsLagrangianFEM.hpp + solidMechanics/SolidMechanicsLagrangianSSLE.hpp + solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp + solidMechanics/SolidMechanicsMPM.hpp + solidMechanics/MPMSolverFields.hpp + solidMechanics/kernels/ExplicitFiniteStrain.hpp + solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp + solidMechanics/kernels/ExplicitMPM.hpp + solidMechanics/kernels/ExplicitSmallStrain.hpp + solidMechanics/kernels/ExplicitSmallStrain_impl.hpp + solidMechanics/kernels/FixedStressThermoPoromechanics.hpp + solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp + solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp + solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp + solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp + solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp + solidMechanics/SolidMechanicsStateReset.hpp + solidMechanics/SolidMechanicsStatistics.hpp + PARENT_SCOPE ) + +# Specify solver sources +set( physicsSolvers_sources + ${physicsSolvers_sources} + solidMechanics/SolidMechanicsLagrangianFEM.cpp + solidMechanics/SolidMechanicsLagrangianSSLE.cpp + solidMechanics/SolidMechanicsMPM.cpp + solidMechanics/SolidMechanicsStateReset.cpp + solidMechanics/SolidMechanicsStatistics.cpp + PARENT_SCOPE ) + +#include( solidMechanics/kernels/SolidMechanicsKernels.cmake) \ No newline at end of file diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt b/src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt new file mode 100644 index 00000000000..ede9eacf734 --- /dev/null +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt @@ -0,0 +1,20 @@ +# Specify solver headers +set( physicsSolvers_headers + ${physicsSolvers_headers} + surfaceGeneration/EmbeddedSurfaceGenerator.hpp + surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp + surfaceGeneration/ParallelTopologyChange.hpp + surfaceGeneration/SurfaceGenerator.hpp + surfaceGeneration/SurfaceGeneratorFields.hpp + surfaceGeneration/kernels/surfaceGenerationKernels.hpp + surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp + PARENT_SCOPE ) + +# Specify solver sources +set( physicsSolvers_sources + ${physicsSolvers_sources} + surfaceGeneration/EmbeddedSurfaceGenerator.cpp + surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp + surfaceGeneration/ParallelTopologyChange.cpp + surfaceGeneration/SurfaceGenerator.cpp + PARENT_SCOPE ) \ No newline at end of file diff --git a/src/coreComponents/physicsSolvers/wavePropagation/CMakeLists.txt b/src/coreComponents/physicsSolvers/wavePropagation/CMakeLists.txt new file mode 100644 index 00000000000..54fe46da9fa --- /dev/null +++ b/src/coreComponents/physicsSolvers/wavePropagation/CMakeLists.txt @@ -0,0 +1,43 @@ +# Specify solver headers +set( physicsSolvers_headers + ${physicsSolvers_headers} + wavePropagation/shared/WaveSolverBase.hpp + wavePropagation/shared/WaveSolverUtils.hpp + wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp + wavePropagation/sem/acoustic/shared/AcousticFields.hpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp + wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp + wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp + wavePropagation/sem/elastic/shared/ElasticFields.hpp + wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp + wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp + wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp + wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp + wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp + wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp + wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp + wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp + wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp + wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp + PARENT_SCOPE ) + +# Specify solver sources +set( physicsSolvers_sources + ${physicsSolvers_sources} + wavePropagation/shared/WaveSolverBase.cpp + wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp + wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp + wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp + wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp + wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp + wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp + PARENT_SCOPE) diff --git a/src/coreComponents/schema/docs/ChomboIO.rst b/src/coreComponents/schema/docs/ChomboIO.rst index 300787a76c2..4bce4a9f5f9 100644 --- a/src/coreComponents/schema/docs/ChomboIO.rst +++ b/src/coreComponents/schema/docs/ChomboIO.rst @@ -1,16 +1,16 @@ -================== ========= =================== =============================================================================================== -Name Type Default Description -================== ========= =================== =============================================================================================== -beginCycle real64 required Cycle at which the coupling will commence. -childDirectory string Child directory path -inputPath string /INVALID_INPUT_PATH Path at which the chombo to geosx file will be written. -name groupName required A name is required for any non-unique nodes -outputPath string required Path at which the geosx to chombo file will be written. -parallelThreads integer 1 Number of plot files. -useChomboPressures integer 0 True iff geosx should use the pressures chombo writes out. -waitForInput integer required True iff geosx should wait for chombo to write out a file. When true the inputPath must be set. -================== ========= =================== =============================================================================================== +================== ========= =================== ============================================================================================== +Name Type Default Description +================== ========= =================== ============================================================================================== +beginCycle real64 required Cycle at which the coupling will commence. +childDirectory string Child directory path +inputPath string /INVALID_INPUT_PATH Path at which the chombo to geos file will be written. +name groupName required A name is required for any non-unique nodes +outputPath string required Path at which the geos to chombo file will be written. +parallelThreads integer 1 Number of plot files. +useChomboPressures integer 0 True iff geos should use the pressures chombo writes out. +waitForInput integer required True iff geos should wait for chombo to write out a file. When true the inputPath must be set. +================== ========= =================== ============================================================================================== diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index ecbf7a1b217..52e7878e80d 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -2033,15 +2033,15 @@ the relative residual norm satisfies: - + - + - + - + diff --git a/src/coreComponents/unitTests/CMakeLists.txt b/src/coreComponents/unitTests/CMakeLists.txt index 09542ae3472..9e087f54b56 100644 --- a/src/coreComponents/unitTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/CMakeLists.txt @@ -3,13 +3,14 @@ add_subdirectory( xmlTests ) add_subdirectory( virtualElementTests ) add_subdirectory( linearAlgebraTests ) add_subdirectory( dataRepositoryTests ) -#add_subdirectory( functionsTests ) add_subdirectory( fieldSpecificationTests ) add_subdirectory( constitutiveTests ) add_subdirectory( meshTests ) add_subdirectory( finiteVolumeTests ) add_subdirectory( fileIOTests ) -add_subdirectory( fluidFlowTests ) +if( GEOS_ENABLE_FLUIDFLOW ) + add_subdirectory( fluidFlowTests ) +endif() add_subdirectory( testingUtilities ) add_subdirectory( wellsTests ) add_subdirectory( wavePropagationTests ) diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp index 3a31e9e554d..1cb32b3a79b 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp @@ -36,6 +36,7 @@ namespace testing using namespace geos::constitutive; using namespace geos::constitutive::multifluid; +inline void fillNumericalJacobian( arrayView1d< real64 const > const & residual, arrayView1d< real64 const > const & residualOrig, globalIndex const dofIndex, @@ -52,6 +53,7 @@ void fillNumericalJacobian( arrayView1d< real64 const > const & residual, } ); } +inline void setupProblemFromXML( ProblemManager & problemManager, char const * const xmlInput ) { xmlWrapper::xmlDocument xmlDocument; @@ -91,6 +93,7 @@ void setupProblemFromXML( ProblemManager & problemManager, char const * const xm problemManager.applyInitialConditions(); } +inline void testCompositionNumericalDerivatives( CompositionalMultiphaseFVM & solver, DomainPartition & domain, real64 const perturbParameter, @@ -171,6 +174,7 @@ void testCompositionNumericalDerivatives( CompositionalMultiphaseFVM & solver, } ); } +inline void testPhaseVolumeFractionNumericalDerivatives( CompositionalMultiphaseFVM & solver, DomainPartition & domain, bool const isThermal, @@ -335,6 +339,7 @@ void testPhaseVolumeFractionNumericalDerivatives( CompositionalMultiphaseFVM & s } ); } +inline void testPhaseMobilityNumericalDerivatives( CompositionalMultiphaseFVM & solver, DomainPartition & domain, bool const isThermal, @@ -500,16 +505,17 @@ void testPhaseMobilityNumericalDerivatives( CompositionalMultiphaseFVM & solver, } ); } + template< typename COMPOSITIONAL_SOLVER, typename LAMBDA > -void fillCellCenteredNumericalJacobian( COMPOSITIONAL_SOLVER & solver, - DomainPartition & domain, - bool const isThermal, - real64 const perturbParameter, - arrayView1d< real64 > residual, - arrayView1d< real64 > residualOrig, - CRSMatrixView< real64, globalIndex > jacobian, - CRSMatrixView< real64, globalIndex > jacobianFD, - LAMBDA assembleFunction ) +inline void fillCellCenteredNumericalJacobian( COMPOSITIONAL_SOLVER & solver, + DomainPartition & domain, + bool const isThermal, + real64 const perturbParameter, + arrayView1d< real64 > residual, + arrayView1d< real64 > residualOrig, + CRSMatrixView< real64, globalIndex > jacobian, + CRSMatrixView< real64, globalIndex > jacobianFD, + LAMBDA assembleFunction ) { integer const numComp = solver.numFluidComponents(); diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp index 93e67906eb2..a54853726db 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp @@ -17,7 +17,7 @@ #include "unitTests/testingUtilities/TestingTasks.hpp" #include "mainInterface/initialization.hpp" #include "mainInterface/GeosxState.hpp" -#include "fieldSpecification/SourceFluxStatistics.hpp" +#include "physicsSolvers/fluidFlow/SourceFluxStatistics.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp" #include diff --git a/src/pygeosx/pygeosx.cpp b/src/pygeosx/pygeosx.cpp index 8567043a8ca..c16b6b2b268 100644 --- a/src/pygeosx/pygeosx.cpp +++ b/src/pygeosx/pygeosx.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2018-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/pygeosx/pygeosx.hpp b/src/pygeosx/pygeosx.hpp index 92a44fcc60f..644be973b9b 100644 --- a/src/pygeosx/pygeosx.hpp +++ b/src/pygeosx/pygeosx.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2018-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * From b7e96d12f82cdcbffe79e2ba860117b3c37a80c7 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 24 Jul 2024 17:13:55 -0500 Subject: [PATCH 143/286] feat: Check pore volume for all element types (#3233) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 ++++ inputFiles/almContactMechanics/ALM_stickFault_base.xml | 2 +- .../ContactMechanics_PEBICrack_base.xml | 2 +- .../ContactMechanics_PassingCrack_base.xml | 2 +- .../ContactMechanics_SimpleCubes_base.xml | 2 +- .../ContactMechanics_SingleFracCompression_base.xml | 2 +- .../ContactMechanics_TFrac_base.xml | 2 +- .../ContactMechanics_UnstructuredCrack_base.xml | 2 +- .../ContactMechanics_slippingFault_base.xml | 2 +- .../Sneddon_contactMechanics_base.xml | 2 +- .../CasedElasticWellbore_ImperfectInterfaces_base.xml | 2 +- src/coreComponents/mesh/SurfaceElementRegion.cpp | 4 ++++ .../physicsSolvers/fluidFlow/FlowSolverBase.cpp | 4 ++-- 14 files changed, 21 insertions(+), 13 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index faf2510c6d0..df64c11563a 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3213-6170-5c2c0bf + baseline: integratedTests/baseline_integratedTests-pr3233-6393-534ac25 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 311eef501c0..7f2e9b789f9 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3194 (2024-07-22) +====================== +Check pore volume for all element types, also check that default aperture > 0. Rebaseline for modified tests. No real results change. + PR #3213 (2024-07-12) ====================== Added baselines for new tests on Dirichlet boundary conditions for multiphase flow. diff --git a/inputFiles/almContactMechanics/ALM_stickFault_base.xml b/inputFiles/almContactMechanics/ALM_stickFault_base.xml index 6f041f35830..444c2cee4c7 100644 --- a/inputFiles/almContactMechanics/ALM_stickFault_base.xml +++ b/inputFiles/almContactMechanics/ALM_stickFault_base.xml @@ -77,7 +77,7 @@ diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml index a07550a46b3..c08000ed8c1 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml @@ -13,7 +13,7 @@ - + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_base.xml index 31654d1bb44..58afadaed04 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_base.xml @@ -48,7 +48,7 @@ diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml index 0c293f01565..f9123864c00 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml @@ -50,7 +50,7 @@ diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml index fbb3658cc30..fa6999ef17a 100755 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml @@ -57,7 +57,7 @@ diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml index 524da88f684..792d55000a7 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml @@ -59,7 +59,7 @@ diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_base.xml index 2cf096e346f..c47369c9a73 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_base.xml @@ -48,7 +48,7 @@ diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml index 2137d612521..7abd1e6c74b 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml @@ -82,7 +82,7 @@ diff --git a/inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_base.xml b/inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_base.xml index b7bced7dede..9f1cd70297f 100755 --- a/inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_base.xml +++ b/inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_base.xml @@ -44,7 +44,7 @@ diff --git a/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml b/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml index 06384dcce1c..afb8cd86e99 100644 --- a/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml +++ b/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml @@ -48,7 +48,7 @@ diff --git a/src/coreComponents/mesh/SurfaceElementRegion.cpp b/src/coreComponents/mesh/SurfaceElementRegion.cpp index f9cc97e0b98..709aa167458 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.cpp @@ -75,6 +75,10 @@ void SurfaceElementRegion::generateMesh( Group const & faceBlocks ) void SurfaceElementRegion::initializePreSubGroups() { + GEOS_ERROR_IF_LE_MSG( m_defaultAperture, 0.0, + getWrapperDataContext( viewKeyStruct::defaultApertureString() ) << + ": default aperture must be larger than 0.0" ); + this->forElementSubRegions< SurfaceElementSubRegion >( [&] ( SurfaceElementSubRegion & subRegion ) { subRegion.getWrapper< array1d< real64 > >( fields::elementAperture::key() ). diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 5d78d6ceae5..af11dbf16ff 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -387,8 +387,8 @@ void FlowSolverBase::validatePoreVolumes( DomainPartition const & domain ) const MeshLevel const & mesh, arrayView1d< string const > const & regionNames ) { - mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, - CellElementSubRegion const & subRegion ) + mesh.getElemManager().forElementSubRegions< ElementSubRegionBase >( regionNames, [&]( localIndex const, + ElementSubRegionBase const & subRegion ) { string const & solidName = subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ); From 9cf5ab5540ea296194363713f1bb3972dc618d53 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Thu, 25 Jul 2024 06:32:35 +0100 Subject: [PATCH 144/286] refactor: fix creation of mass handling. (#3215) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 + .../mesh/SurfaceElementRegion.cpp | 5 - .../mesh/SurfaceElementSubRegion.cpp | 5 - .../mesh/SurfaceElementSubRegion.hpp | 3 - .../fluidFlow/FlowSolverBaseFields.hpp | 8 + .../fluidFlow/SinglePhaseBase.cpp | 16 +- .../fluidFlow/SinglePhaseBaseKernels.hpp | 2 +- .../ThermalSinglePhaseBaseKernels.hpp | 2 +- .../multiphysics/HydrofractureSolver.cpp | 222 +++++++++--------- 10 files changed, 143 insertions(+), 128 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index df64c11563a..ed7b9c4e39e 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3233-6393-534ac25 + baseline: integratedTests/baseline_integratedTests-pr3215-6396-9b43cc8 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 7f2e9b789f9..fff3d8f8311 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,10 +6,16 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3215 (2024-07-23) +====================== +Changed the default value for massCreation and name of the wrapper. + + PR #3194 (2024-07-22) ====================== Check pore volume for all element types, also check that default aperture > 0. Rebaseline for modified tests. No real results change. + PR #3213 (2024-07-12) ====================== Added baselines for new tests on Dirichlet boundary conditions for multiphase flow. diff --git a/src/coreComponents/mesh/SurfaceElementRegion.cpp b/src/coreComponents/mesh/SurfaceElementRegion.cpp index 709aa167458..797a27f012e 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.cpp @@ -106,11 +106,8 @@ localIndex SurfaceElementRegion::addToFractureMesh( real64 const time_np1, arrayView1d< real64 > const ruptureTime = subRegion.getField< fields::ruptureTime >(); - arrayView1d< real64 > const creationMass = subRegion.getReference< real64_array >( FaceElementSubRegion::viewKeyStruct::creationMassString() ); - arrayView2d< real64 const > const faceCenter = faceManager->faceCenter(); arrayView2d< real64 > const elemCenter = subRegion.getElementCenter(); - arrayView1d< real64 const > const elemArea = subRegion.getElementArea().toViewConst(); arrayView1d< integer > const subRegionGhostRank = subRegion.ghostRank(); @@ -212,8 +209,6 @@ localIndex SurfaceElementRegion::addToFractureMesh( real64 const time_np1, subRegion.calculateSingleElementGeometricQuantities( kfe, faceManager->faceArea() ); - creationMass[kfe] *= elemArea[kfe]; - // update the sets for( auto const & setIter : faceManager->sets().wrappers() ) { diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp index 920f7389502..296163a80f5 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp @@ -59,11 +59,6 @@ SurfaceElementSubRegion::SurfaceElementSubRegion( string const & name, setPlotLevel( PlotLevel::NOPLOT ). setDescription( "A map of face element local indices to the cell local indices" ); - registerWrapper< real64_array >( viewKeyStruct::creationMassString() ). - setApplyDefaultValue( 0.0 ). - setPlotLevel( dataRepository::PlotLevel::LEVEL_1 ). - setDescription( "The amount of remaining mass that was introduced when the SurfaceElement was created." ); - registerField( fields::elementAperture{}, &m_elementAperture ); registerField( fields::elementArea{}, &m_elementArea ); diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp index 208ea2ff90b..2fc5b84f532 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp @@ -277,9 +277,6 @@ class SurfaceElementSubRegion : public ElementSubRegionBase /// @return Face element to cell indices map string. static constexpr char const * surfaceElementsToCellIndexString() { return "fractureElementsToCellIndices"; } - /// @return Mass creation string. - constexpr static char const * creationMassString() { return "creationMass"; } - /// @return surface element to parent plane string. constexpr static char const * surfaceElementToParentPlaneString() { return "surfaceElementToParentPlane"; } }; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp index a7abfd841af..14206735dc0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp @@ -273,6 +273,14 @@ DECLARE_FIELD( energy_n, WRITE_AND_READ, "Energy at the previous converged time step" ); +DECLARE_FIELD( massCreated, + "massCreated", + array1d< real64 >, + 0, + LEVEL_1, + WRITE_AND_READ, + "The amount of remaining mass that was introduced when the SurfaceElement was created." ); + } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 9ae62701043..5edba2269c7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -96,12 +96,20 @@ void SinglePhaseBase::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< fields::flow::mass >( getName() ); subRegion.registerField< fields::flow::mass_n >( getName() ); + if( m_isThermal ) { subRegion.registerField< dMobility_dTemperature >( getName() ); } } ); + elemManager.forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) + { + subRegion.registerField< fields::flow::massCreated >( getName() ); + } ); + FaceManager & faceManager = mesh.getFaceManager(); { faceManager.registerField< facePressure >( getName() ); @@ -463,14 +471,8 @@ void SinglePhaseBase::initializePostInitialConditionsPreSubGroups() { region.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) { - ConstitutiveBase & fluid = getConstitutiveModel( subRegion, subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ) ); - real64 const defaultDensity = getFluidProperties( fluid ).defaultDensity; - subRegion.getWrapper< real64_array >( fields::flow::hydraulicAperture::key() ). setApplyDefaultValue( region.getDefaultAperture() ); - - subRegion.getWrapper< real64_array >( FaceElementSubRegion::viewKeyStruct::creationMassString() ). - setApplyDefaultValue( defaultDensity * region.getDefaultAperture() ); } ); } ); @@ -792,7 +794,7 @@ void SinglePhaseBase::implicitStepComplete( real64 const & time, { arrayView1d< integer const > const elemGhostRank = subRegion.ghostRank(); arrayView1d< real64 const > const volume = subRegion.getElementVolume(); - arrayView1d< real64 > const creationMass = subRegion.getReference< real64_array >( FaceElementSubRegion::viewKeyStruct::creationMassString() ); + arrayView1d< real64 > const creationMass = subRegion.getField< fields::flow::massCreated >(); SingleFluidBase const & fluid = getConstitutiveModel< SingleFluidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::fluidNamesString() ) ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp index 79507cb39ed..dbb2d46ffd6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp @@ -356,7 +356,7 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ) - , m_creationMass( subRegion.getReference< array1d< real64 > >( SurfaceElementSubRegion::viewKeyStruct::creationMassString() ) ) + , m_creationMass( subRegion.getField< fields::flow::massCreated >() ) {} /** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp index ca4e963d62a..65966a54695 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp @@ -332,7 +332,7 @@ class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< Sur CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ), - m_creationMass( subRegion.getReference< array1d< real64 > >( SurfaceElementSubRegion::viewKeyStruct::creationMassString() ) ) + m_creationMass( subRegion.getField< fields::flow::massCreated >() ) {} /** diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 456a01909c7..1a450a63c52 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -28,6 +28,7 @@ #include "physicsSolvers/multiphysics/MultiphasePoromechanics.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "mesh/MeshFields.hpp" +#include "constitutive/fluid/singlefluid/SingleFluidFields.hpp" namespace geos { @@ -1009,149 +1010,160 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( D solidMechanics::arrayView2dLayoutTotalDisplacement const totalDisplacement = nodeManager.getField< fields::solidMechanics::totalDisplacement >(); - elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, - [=]( localIndex const, - FaceElementSubRegion & subRegion ) + elemManager.forElementRegions< SurfaceElementRegion >( regionNames, + [=] ( localIndex const, + SurfaceElementRegion & region ) { - ArrayOfArraysView< localIndex const > const facesToEdges = subRegion.edgeList().toViewConst(); - ArrayOfArraysView< localIndex const > const & fractureConnectorsToFaceElements = subRegion.m_2dFaceTo2dElems.toViewConst(); - map< localIndex, localIndex > const & edgesToConnectorEdges = subRegion.m_edgesTo2dFaces; + real64 const defaultAperture = region.getDefaultAperture(); + region.forElementSubRegions< FaceElementSubRegion >( [=]( FaceElementSubRegion & subRegion ) + { + ArrayOfArraysView< localIndex const > const facesToEdges = subRegion.edgeList().toViewConst(); + ArrayOfArraysView< localIndex const > const & fractureConnectorsToFaceElements = subRegion.m_2dFaceTo2dElems.toViewConst(); + map< localIndex, localIndex > const & edgesToConnectorEdges = subRegion.m_edgesTo2dFaces; - ArrayOfArraysView< localIndex const > const faceMap = subRegion.faceList().toViewConst(); + ArrayOfArraysView< localIndex const > const faceMap = subRegion.faceList().toViewConst(); - arrayView1d< real64 > const fluidPressure_n = subRegion.getField< fields::flow::pressure_n >(); - arrayView1d< real64 > const fluidPressure = subRegion.getField< fields::flow::pressure >(); + arrayView1d< real64 > const fluidPressure_n = subRegion.getField< fields::flow::pressure_n >(); + arrayView1d< real64 > const fluidPressure = subRegion.getField< fields::flow::pressure >(); + string const & fluidName = subRegion.getReference< string >( FlowSolverBase::viewKeyStruct::fluidNamesString() ); + SingleFluidBase const & fluid = subRegion.getConstitutiveModel< SingleFluidBase >( fluidName ); + real64 const defaultDensity = fluid.defaultDensity(); + arrayView1d< real64 > const massCreated = subRegion.getField< fields::flow::massCreated >(); - arrayView1d< real64 > const aperture = subRegion.getField< fields::elementAperture >(); - // Get the list of newFractureElements - SortedArrayView< localIndex const > const newFractureElements = subRegion.m_newFaceElements.toViewConst(); + arrayView1d< real64 > const aperture = subRegion.getField< fields::elementAperture >(); + arrayView1d< real64 > const elementArea = subRegion.getElementArea(); - #ifdef GEOS_USE_SEPARATION_COEFFICIENT - arrayView1d< real64 > const apertureF = subRegion.getReference< array1d< real64 > >( "apertureAtFailure" ); - #endif - - // arrayView1d< real64 > const dens = subRegion.getReference< array1d< real64 > >( "density_n" ); // change it to make aperture - // zero + // Get the list of newFractureElements + SortedArrayView< localIndex const > const newFractureElements = subRegion.m_newFaceElements.toViewConst(); - forAll< serialPolicy >( newFractureElements.size(), [&] ( localIndex const k ) - { - localIndex const newElemIndex = newFractureElements[k]; - real64 initialPressure = 1.0e99; - real64 initialAperture = 1.0e99; #ifdef GEOS_USE_SEPARATION_COEFFICIENT - apertureF[newElemIndex] = aperture[newElemIndex]; + arrayView1d< real64 > const apertureF = subRegion.getReference< array1d< real64 > >( "apertureAtFailure" ); #endif - if( m_newFractureInitializationType == InitializationType::Displacement ) - { - aperture[newElemIndex] = 1.0e99; - } - arraySlice1d< localIndex const > const faceToEdges = facesToEdges[newElemIndex]; - for( localIndex ke=0; ke const dens = subRegion.getReference< array1d< real64 > >( "density_n" ); // change it to make aperture + // zero - auto connIter = edgesToConnectorEdges.find( edgeIndex ); - if( connIter == edgesToConnectorEdges.end() ) + forAll< serialPolicy >( newFractureElements.size(), [&] ( localIndex const k ) + { + localIndex const newElemIndex = newFractureElements[k]; + real64 initialPressure = 1.0e99; + real64 initialAperture = 1.0e99; + #ifdef GEOSX_USE_SEPARATION_COEFFICIENT + apertureF[newElemIndex] = aperture[newElemIndex]; + #endif + if( m_newFractureInitializationType == InitializationType::Displacement ) { - return; + aperture[newElemIndex] = 1.0e99; } - localIndex const connectorIndex = edgesToConnectorEdges.at( edgeIndex ); - localIndex const numElems = fractureConnectorsToFaceElements.sizeOfArray( connectorIndex ); + arraySlice1d< localIndex const > const faceToEdges = facesToEdges[newElemIndex]; - for( localIndex kfe=0; kfe 1.0e98? 0.0:initialPressure; - fluidPressure_n[newElemIndex] = fluidPressure[newElemIndex]; - } - else if( m_newFractureInitializationType == InitializationType::Displacement ) - { - // Set the aperture/fluid pressure for the new face element to be the minimum - // of the existing value, smallest aperture/pressure from a connected face element. - // aperture[newElemIndex] = std::min(aperture[newElemIndex], initialAperture); - - localIndex const faceIndex0 = faceMap[newElemIndex][0]; - localIndex const faceIndex1 = faceMap[newElemIndex][1]; - - localIndex const numNodesPerFace = faceToNodesMap.sizeOfArray( faceIndex0 ); + localIndex const connectorIndex = edgesToConnectorEdges.at( edgeIndex ); + localIndex const numElems = fractureConnectorsToFaceElements.sizeOfArray( connectorIndex ); - bool zeroDisp = true; - - for( localIndex a=0; a( totalDisplacement[node0] ) ) > 1.0e-99 && - LvArray::math::abs( LvArray::tensorOps::l2Norm< 3 >( totalDisplacement[node1] ) ) > 1.0e-99 ) + for( localIndex kfe=0; kfe 1.0e98? 0.0:initialPressure; + fluidPressure_n[newElemIndex] = fluidPressure[newElemIndex]; + massCreated[newElemIndex] = defaultDensity * defaultAperture * elementArea[newElemIndex]; } - } - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "New elem index = {:4d} , init aper = {:4.2e}, init press = {:4.2e} ", - newElemIndex, aperture[newElemIndex], fluidPressure[newElemIndex] ) ); - } ); + else if( m_newFractureInitializationType == InitializationType::Displacement ) + { + // Set the aperture/fluid pressure for the new face element to be the minimum + // of the existing value, smallest aperture/pressure from a connected face element. + // aperture[newElemIndex] = std::min(aperture[newElemIndex], initialAperture); - if( m_newFractureInitializationType == InitializationType::Displacement ) - { - SortedArray< localIndex > touchedNodes; - forAll< serialPolicy >( newFractureElements.size(), [ newFractureElements - , aperture - , faceMap - , faceNormal - , faceToNodesMap - , &touchedNodes - , incrementalDisplacement - , totalDisplacement ]( localIndex const k ) - { - localIndex const newElemIndex = newFractureElements[k]; + localIndex const faceIndex0 = faceMap[newElemIndex][0]; + localIndex const faceIndex1 = faceMap[newElemIndex][1]; - if( aperture[newElemIndex] < 1e98 ) - { - localIndex const faceIndex0 = faceMap( newElemIndex, 0 ); - localIndex const faceIndex1 = faceMap( newElemIndex, 1 ); localIndex const numNodesPerFace = faceToNodesMap.sizeOfArray( faceIndex0 ); - real64 newDisp[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceNormal[ faceIndex0 ] ); - LvArray::tensorOps::scale< 3 >( newDisp, -aperture[newElemIndex] ); + bool zeroDisp = true; + for( localIndex a=0; a( totalDisplacement[node0] ) ) > 1.0e-99 && + LvArray::math::abs( LvArray::tensorOps::l2Norm< 3 >( totalDisplacement[node1] ) ) > 1.0e-99 ) { - LvArray::tensorOps::add< 3 >( incrementalDisplacement[node0], newDisp ); - LvArray::tensorOps::add< 3 >( totalDisplacement[node0], newDisp ); - LvArray::tensorOps::subtract< 3 >( incrementalDisplacement[node1], newDisp ); - LvArray::tensorOps::subtract< 3 >( totalDisplacement[node1], newDisp ); + zeroDisp = false; } } + if( zeroDisp ) + { + aperture[newElemIndex] = 0; + } } + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "New elem index = {:4d} , init aper = {:4.2e}, init press = {:4.2e} ", + newElemIndex, aperture[newElemIndex], fluidPressure[newElemIndex] ) ); } ); - } - subRegion.m_recalculateConnectionsFor2dFaces.clear(); - subRegion.m_newFaceElements.clear(); + if( m_newFractureInitializationType == InitializationType::Displacement ) + { + SortedArray< localIndex > touchedNodes; + forAll< serialPolicy >( newFractureElements.size(), [ newFractureElements + , aperture + , faceMap + , faceNormal + , faceToNodesMap + , &touchedNodes + , incrementalDisplacement + , totalDisplacement ]( localIndex const k ) + { + localIndex const newElemIndex = newFractureElements[k]; + + if( aperture[newElemIndex] < 1e98 ) + { + localIndex const faceIndex0 = faceMap( newElemIndex, 0 ); + localIndex const faceIndex1 = faceMap( newElemIndex, 1 ); + localIndex const numNodesPerFace = faceToNodesMap.sizeOfArray( faceIndex0 ); + + real64 newDisp[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceNormal[ faceIndex0 ] ); + LvArray::tensorOps::scale< 3 >( newDisp, -aperture[newElemIndex] ); + for( localIndex a=0; a( incrementalDisplacement[node0], newDisp ); + LvArray::tensorOps::add< 3 >( totalDisplacement[node0], newDisp ); + LvArray::tensorOps::subtract< 3 >( incrementalDisplacement[node1], newDisp ); + LvArray::tensorOps::subtract< 3 >( totalDisplacement[node1], newDisp ); + } + } + } + } ); + } + + subRegion.m_recalculateConnectionsFor2dFaces.clear(); + subRegion.m_newFaceElements.clear(); + } ); } ); } ); } From 52d15b87f8199954bcf37773223b8841f85cf71d Mon Sep 17 00:00:00 2001 From: Algiane Froehly Date: Fri, 26 Jul 2024 17:38:38 +0200 Subject: [PATCH 145/286] docs: Fix wrong variable names in doc after PR #3219 (GEOSX_ -> GEOS_). (#3242) --- src/docs/sphinx/buildGuide/BuildProcess.rst | 12 ++++++------ src/docs/sphinx/buildGuide/ContinuousIntegration.rst | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/docs/sphinx/buildGuide/BuildProcess.rst b/src/docs/sphinx/buildGuide/BuildProcess.rst index 37a5d66d9d3..8860a9d1486 100644 --- a/src/docs/sphinx/buildGuide/BuildProcess.rst +++ b/src/docs/sphinx/buildGuide/BuildProcess.rst @@ -75,10 +75,10 @@ Option Default Explanation ``ENABLE_TOTALVIEW_OUTPUT`` ``OFF`` Enables TotalView debugger custom view of GEOS data structures ``ENABLE_COV`` ``OFF`` Enables code coverage ``GEOS_ENABLE_TESTS`` ``ON`` Enables unit testing targets -``GEOSX_LA_INTERFACE`` ``Hypre`` Choiсe of Linear Algebra backend (Hypre/Petsc/Trilinos) -``GEOSX_BUILD_OBJ_LIBS`` ``ON`` Use CMake Object Libraries build -``GEOSX_BUILD_SHARED_LIBS`` ``OFF`` Build ``geosx_core`` as a shared library instead of static -``GEOSX_PARALLEL_COMPILE_JOBS`` Max. number of compile jobs (when using Ninja), in addition to ``-j`` flag -``GEOSX_PARALLEL_LINK_JOBS`` Max. number of link jobs (when using Ninja), in addition to ``-j`` flag -``GEOSX_INSTALL_SCHEMA`` ``ON`` Enables schema generation and installation +``GEOS_LA_INTERFACE`` ``Hypre`` Choiсe of Linear Algebra backend (Hypre/Petsc/Trilinos) +``GEOS_BUILD_OBJ_LIBS`` ``ON`` Use CMake Object Libraries build +``GEOS_BUILD_SHARED_LIBS`` ``OFF`` Build ``geosx_core`` as a shared library instead of static +``GEOS_PARALLEL_COMPILE_JOBS`` Max. number of compile jobs (when using Ninja), in addition to ``-j`` flag +``GEOS_PARALLEL_LINK_JOBS`` Max. number of link jobs (when using Ninja), in addition to ``-j`` flag +``GEOS_INSTALL_SCHEMA`` ``ON`` Enables schema generation and installation =============================== ========= ============================================================================== diff --git a/src/docs/sphinx/buildGuide/ContinuousIntegration.rst b/src/docs/sphinx/buildGuide/ContinuousIntegration.rst index 3dd72e595d2..3740fe464a3 100644 --- a/src/docs/sphinx/buildGuide/ContinuousIntegration.rst +++ b/src/docs/sphinx/buildGuide/ContinuousIntegration.rst @@ -41,7 +41,7 @@ The .. code-block:: sh - GEOSX_TPL_DIR + GEOS_TPL_DIR variable contains the absolute path of the installation root directory of the third party libraries. GEOS must use it when building. From 31fd66e28c53fb0c6e63e5b41ae17308e1b71004 Mon Sep 17 00:00:00 2001 From: Algiane Froehly Date: Sat, 27 Jul 2024 10:44:47 +0200 Subject: [PATCH 146/286] fix: Fix link flags after pr#3219 (#3244) * bug: fix wrong CMake variable name leading to missing linker flags. * Fix double dependency error Remove double link of statics libs when building some of the unit tests. This error creates 'multiple definition' error at link edition on Pangea3. --- src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt | 1 - .../unitTests/fieldSpecificationTests/CMakeLists.txt | 1 - src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt | 1 - src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt | 1 - src/externalComponents/CMakeLists.txt | 2 +- 5 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt index ebe6fde062f..24fb4d17cef 100644 --- a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt @@ -38,7 +38,6 @@ if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if( ENABLE_PVTPackage ) diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt b/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt index 2c3f10df6a1..978a41e3a99 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt @@ -11,7 +11,6 @@ if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() if (TARGET pugixml::pugixml) diff --git a/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt b/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt index e057fe04a37..9837bc2a1ff 100644 --- a/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt @@ -8,7 +8,6 @@ if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() # Add gtest C++ based tests diff --git a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt index ae0c0cfaa00..3d91645c2e5 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt @@ -11,7 +11,6 @@ if ( GEOS_BUILD_SHARED_LIBS ) list( APPEND dependencyList geosx_core HDF5::HDF5 ) else() list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) endif() set( dependencyList testingUtilities ) diff --git a/src/externalComponents/CMakeLists.txt b/src/externalComponents/CMakeLists.txt index 8ac2e8281cd..cd4e91f1352 100644 --- a/src/externalComponents/CMakeLists.txt +++ b/src/externalComponents/CMakeLists.txt @@ -25,7 +25,7 @@ if( ${BUILD_SHARED_LIBS} ) set( externalComponentsLinkList ${externalComponentsList} ) else() foreach(component ${externalComponentsList}) - set( externalComponentsLinkList ${externalComponentsLinkList} ${GEOSX_LINK_PREPEND_FLAG} ${component} ${GEOSX_LINK_POSTPEND_FLAG} ) + set( externalComponentsLinkList ${externalComponentsLinkList} ${GEOS_LINK_PREPEND_FLAG} ${component} ${GEOS_LINK_POSTPEND_FLAG} ) endforeach() endif() From 2175cc40086917322d1d2944bff5c467e70e8785 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Sat, 27 Jul 2024 03:46:15 -0500 Subject: [PATCH 147/286] changes to CODEOWNERS (#3238) --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7fa9879c5a0..8cd6d89343a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -14,7 +14,7 @@ /src/coreComponents/LvArray @rrsettgast @wrtobin @corbett5 @CusiniM /src/coreComponents/codingUtilities @rrsettgast @untereiner @corbett5 /src/coreComponents/common @rrsettgast @MelReyCG @corbett5 -/src/coreComponents/constitutive @rrsettgast @CusiniM @dkachuma @joshua-white +/src/coreComponents/constitutive @rrsettgast @CusiniM @dkachuma @paveltomin @joshua-white /src/coreComponents/dataRepository @rrsettgast @wrtobin @corbett5 /src/coreComponents/denseLinearAlgebra @rrsettgast @CusiniM @castelletto1 /src/coreComponents/discretizationMethods @rrsettgast @CusiniM @castelletto1 From c2fe0d3de90d3fc3db884ea4d60af23d2df4831b Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 30 Jul 2024 21:55:58 -0700 Subject: [PATCH 148/286] feat: Add partition information to terminal output (#3246) * add function to output partition information * add to CODEOWNERS file --- .github/CODEOWNERS | 4 +- src/coreComponents/common/Logger.hpp | 21 ++- .../mainInterface/ProblemManager.cpp | 1 + src/coreComponents/mesh/DomainPartition.cpp | 158 +++++++++++++++++- src/coreComponents/mesh/DomainPartition.hpp | 6 + 5 files changed, 186 insertions(+), 4 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8cd6d89343a..b23f7e229c6 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -12,8 +12,8 @@ /BASELINE_NOTES.md /inputFiles/ @CusiniM @cssherman @jhuang2601 @rrsettgast /src/coreComponents/LvArray @rrsettgast @wrtobin @corbett5 @CusiniM -/src/coreComponents/codingUtilities @rrsettgast @untereiner @corbett5 -/src/coreComponents/common @rrsettgast @MelReyCG @corbett5 +/src/coreComponents/codingUtilities @rrsettgast @untereiner @corbett5 @wrtobin +/src/coreComponents/common @rrsettgast @MelReyCG @corbett5 @wrtobin /src/coreComponents/constitutive @rrsettgast @CusiniM @dkachuma @paveltomin @joshua-white /src/coreComponents/dataRepository @rrsettgast @wrtobin @corbett5 /src/coreComponents/denseLinearAlgebra @rrsettgast @CusiniM @castelletto1 diff --git a/src/coreComponents/common/Logger.hpp b/src/coreComponents/common/Logger.hpp index 7246173f496..75ac08d2375 100644 --- a/src/coreComponents/common/Logger.hpp +++ b/src/coreComponents/common/Logger.hpp @@ -45,6 +45,25 @@ */ #define GEOS_LOG_VAR( ... ) LVARRAY_LOG_VAR( __VA_ARGS__ ) + +/** + * @brief Conditionally log a message. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + */ +#if defined(GEOS_DEVICE_COMPILE) +#define GEOS_LOG_IF( EXP, msg ) +#else +#define GEOS_LOG_IF( EXP, msg ) \ + do { \ + if( EXP ) \ + { \ + std::cout<< msg << std::endl; \ + } \ + } while( false ) +#endif + + /** * @brief Conditionally log a message on screen on rank 0. * @param EXP an expression that will be evaluated as a predicate @@ -438,7 +457,7 @@ * @param[in] minLevel minimum log level * @param[in] msg a message to log (any expression that can be stream inserted) */ -#define GEOS_LOG_LEVEL( minLevel, msg ) GEOS_INFO_IF( this->getLogLevel() >= minLevel, msg ); +#define GEOS_LOG_LEVEL( minLevel, msg ) GEOS_LOG_IF( this->getLogLevel() >= minLevel, msg ); /** * @brief Output messages (only on rank 0) based on current Group's log level. diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 88b92fa57d1..bd6852fafaf 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -666,6 +666,7 @@ void ProblemManager::generateMesh() } domain.setupCommunications( useNonblockingMPI ); + domain.outputPartitionInformation(); domain.forMeshBodies( [&]( MeshBody & meshBody ) { diff --git a/src/coreComponents/mesh/DomainPartition.cpp b/src/coreComponents/mesh/DomainPartition.cpp index 68811964e66..9016bbd2b5f 100644 --- a/src/coreComponents/mesh/DomainPartition.cpp +++ b/src/coreComponents/mesh/DomainPartition.cpp @@ -27,7 +27,6 @@ #include "mesh/mpiCommunications/SpatialPartition.hpp" - namespace geos { using namespace dataRepository; @@ -321,4 +320,161 @@ void DomainPartition::addNeighbors( const unsigned int idim, } } +void DomainPartition::outputPartitionInformation() const +{ + + auto numberOfEntities = []( ObjectManagerBase const & objectManager ) + { + return std::make_pair( objectManager.getNumberOfLocalIndices(), objectManager.getNumberOfGhosts() ); + }; + + auto addCommaSeparators = []( localIndex const num ) + { + std::string const numStr = std::to_string( num ); + std::string result; + for( std::size_t i = 0; i < numStr.size(); ++i ) + { + result += numStr[i]; + if( ( numStr.size() - i - 1 ) % 3 == 0 && i != numStr.size() - 1 ) + { + result += ","; + } + } + return result; + }; + + GEOS_LOG_RANK_0( "MPI Partition information:" ); + + + forMeshBodies( [&]( MeshBody const & meshBody ) + { + meshBody.getMeshLevels().forSubGroupsIndex< MeshLevel >( [&]( int const level, MeshLevel const & meshLevel ) + { + if( level!=0 ) + { + + // get the number of local and ghost entities for each type + auto const [ numLocalNodes, numGhostNodes ] = numberOfEntities( meshLevel.getNodeManager() ); + real64 const nodeRatio = ( numLocalNodes + numGhostNodes ) > 0 ? real64( numLocalNodes ) / real64( numLocalNodes + numGhostNodes ) : -1.0; + auto const [ numLocalEdges, numGhostEdges ] = numberOfEntities( meshLevel.getEdgeManager() ); + real64 const edgeRatio = ( numLocalEdges + numGhostEdges ) > 0 ? real64( numLocalEdges ) / real64( numLocalEdges + numGhostEdges ) : -1.0; + auto const [ numLocalFaces, numGhostFaces ] = numberOfEntities( meshLevel.getFaceManager() ); + real64 const faceRatio = ( numLocalFaces + numGhostFaces ) > 0 ? real64( numLocalFaces ) / real64( numLocalFaces + numGhostFaces ) : -1.0; + + localIndex numLocalElems = 0; + localIndex numGhostElems = 0; + meshLevel.getElemManager().forElementSubRegions< CellElementSubRegion >( [&]( CellElementSubRegion const & subRegion ) + { + auto [ numLocalElemsInSubRegion, numGhostElemsInSubRegion ] = numberOfEntities( subRegion ); + numLocalElems += numLocalElemsInSubRegion; + numGhostElems += numGhostElemsInSubRegion; + } ); + real64 const elemRatio = ( numLocalElems + numGhostElems ) > 0 ? real64( numLocalElems ) / real64( numLocalElems + numGhostElems ) : -1.0; + + localIndex const values[8] = { numLocalNodes, numGhostNodes, numLocalEdges, numGhostEdges, numLocalFaces, numGhostFaces, numLocalElems, numGhostElems }; + localIndex minValues[8] = {0}; + localIndex maxValues[8] = {0}; + MpiWrapper::allReduce( values, minValues, 8, MPI_MIN, MPI_COMM_WORLD ); + MpiWrapper::allReduce( values, maxValues, 8, MPI_MAX, MPI_COMM_WORLD ); + localIndex const minNumLocalNodes = minValues[0]; + localIndex const maxNumLocalNodes = maxValues[0]; + localIndex const minNumGhostNodes = minValues[1]; + localIndex const maxNumGhostNodes = maxValues[1]; + localIndex const minNumLocalEdges = minValues[2]; + localIndex const maxNumLocalEdges = maxValues[2]; + localIndex const minNumGhostEdges = minValues[3]; + localIndex const maxNumGhostEdges = maxValues[3]; + localIndex const minNumLocalFaces = minValues[4]; + localIndex const maxNumLocalFaces = maxValues[4]; + localIndex const minNumGhostFaces = minValues[5]; + localIndex const maxNumGhostFaces = maxValues[5]; + localIndex const minNumLocalElems = minValues[6]; + localIndex const maxNumLocalElems = maxValues[6]; + localIndex const minNumGhostElems = minValues[7]; + localIndex const maxNumGhostElems = maxValues[7]; + + real64 const ratios[4] = { nodeRatio, edgeRatio, faceRatio, elemRatio }; + real64 minRatios[4] = {0}; + real64 maxRatios[4] = {0}; + MpiWrapper::allReduce( ratios, minRatios, 4, MPI_MIN, MPI_COMM_WORLD ); + MpiWrapper::allReduce( ratios, maxRatios, 4, MPI_MAX, MPI_COMM_WORLD ); + real64 const minNodeRatio = minRatios[0]; + real64 const maxNodeRatio = maxRatios[0]; + real64 const minEdgeRatio = minRatios[1]; + real64 const maxEdgeRatio = maxRatios[1]; + real64 const minFaceRatio = minRatios[2]; + real64 const maxFaceRatio = maxRatios[2]; + real64 const minElemRatio = minRatios[3]; + real64 const maxElemRatio = maxRatios[3]; + + GEOS_LOG_RANK_0( " MeshBody: " + meshBody.getName() + " MeshLevel: " + meshLevel.getName() + "\n" ); + GEOS_LOG_RANK_0( " |------------------------------------------------------------------------------------------------------------------------------------------------|" ); + GEOS_LOG_RANK_0( " | | Nodes | Edges | Faces | Elems |" ); + GEOS_LOG_RANK_0( " |------------------------------------------------------------------------------------------------------------------------------------------------|" ); + GEOS_LOG_RANK_0( GEOS_FMT( " |min(local/total)| {:4.2f} | {:4.2f} | {:4.2f} | {:4.2f} | ", + minNodeRatio, + minEdgeRatio, + minFaceRatio, + minElemRatio ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " |max(local/total)| {:4.2f} | {:4.2f} | {:4.2f} | {:4.2f} | ", + maxNodeRatio, + maxEdgeRatio, + maxFaceRatio, + maxElemRatio ) ); + GEOS_LOG_RANK_0( " |------------------------------------------------------------------------------------------------------------------------------------------------|" ); + GEOS_LOG_RANK_0( " | Rank | local | ghost | local | ghost | local | ghost | local | ghost |" ); + GEOS_LOG_RANK_0( " |----------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|---------------|" ); + + + GEOS_LOG_RANK_0( GEOS_FMT( " | min | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} |", + addCommaSeparators( minNumLocalNodes ), + addCommaSeparators( minNumGhostNodes ), + addCommaSeparators( minNumLocalEdges ), + addCommaSeparators( minNumGhostEdges ), + addCommaSeparators( minNumLocalFaces ), + addCommaSeparators( minNumGhostFaces ), + addCommaSeparators( minNumLocalElems ), + addCommaSeparators( minNumGhostElems ) ) ); + + GEOS_LOG_RANK_0( GEOS_FMT( " | max | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} |", + addCommaSeparators( maxNumLocalNodes ), + addCommaSeparators( maxNumGhostNodes ), + addCommaSeparators( maxNumLocalEdges ), + addCommaSeparators( maxNumGhostEdges ), + addCommaSeparators( maxNumLocalFaces ), + addCommaSeparators( maxNumGhostFaces ), + addCommaSeparators( maxNumLocalElems ), + addCommaSeparators( maxNumGhostElems ) ) ); + + GEOS_LOG_RANK_0( " |------------------------------------------------------------------------------------------------------------------------------------------------|" ); + + // output in rank order + int const thisRank = MpiWrapper::commRank(); + for( int rank=0; rank13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | ", + rank, + addCommaSeparators( numLocalNodes ), + addCommaSeparators( numGhostNodes ), + addCommaSeparators( numLocalEdges ), + addCommaSeparators( numGhostEdges ), + addCommaSeparators( numLocalFaces ), + addCommaSeparators( numGhostFaces ), + addCommaSeparators( numLocalElems ), + addCommaSeparators( numGhostElems ) ) ); + } + MpiWrapper::barrier(); + } + MpiWrapper::barrier(); + GEOS_LOG_RANK_0( " |------------------------------------------------------------------------------------------------------------------------------------------------|" ); + } + } ); + } + + ); + +} + } /* namespace geos */ diff --git a/src/coreComponents/mesh/DomainPartition.hpp b/src/coreComponents/mesh/DomainPartition.hpp index 27cea17a2f4..61a70ee0cba 100644 --- a/src/coreComponents/mesh/DomainPartition.hpp +++ b/src/coreComponents/mesh/DomainPartition.hpp @@ -116,6 +116,12 @@ class DomainPartition : public dataRepository::Group void addNeighbors( const unsigned int idim, MPI_Comm & cartcomm, int * ncoords ); + + /** + * @brief Outputs information about the partitioning of the domain. + */ + void outputPartitionInformation() const; + ///@} From fcc3389c00ea05a89db238e7fb74a6434aad8c3e Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Thu, 1 Aug 2024 15:37:54 -0700 Subject: [PATCH 149/286] change MPI_COMM_GEOSX to MPI_COMM_GEOS everywhere (#3259) --- .../codingUtilities/UnitTestUtilities.hpp | 2 +- src/coreComponents/common/DataTypes.cpp | 4 +- src/coreComponents/common/DataTypes.hpp | 4 +- src/coreComponents/common/MpiWrapper.hpp | 38 +++++++------- .../common/initializeEnvironment.cpp | 14 ++--- .../dataRepository/ConduitRestart.cpp | 2 +- .../dataRepository/Utilities.cpp | 2 +- src/coreComponents/events/EventManager.cpp | 2 +- .../fileIO/Outputs/ChomboIO.cpp | 2 +- .../fileIO/Outputs/OutputBase.cpp | 2 +- .../fileIO/Outputs/SiloOutput.cpp | 6 +-- .../fileIO/Outputs/TimeHistoryOutput.cpp | 14 ++--- src/coreComponents/fileIO/silo/SiloFile.cpp | 46 ++++++++-------- src/coreComponents/fileIO/silo/SiloFile.hpp | 2 +- .../fileIO/timeHistory/HDFHistoryIO.hpp | 4 +- .../fileIO/vtk/VTKPolyDataWriterInterface.cpp | 2 +- .../TwoPointFluxApproximation.cpp | 2 +- .../linearAlgebra/DofManager.cpp | 2 +- .../interfaces/petsc/PetscInterface.cpp | 2 +- .../interfaces/petsc/PetscMatrix.cpp | 2 +- .../interfaces/petsc/PetscPreconditioner.cpp | 4 +- .../interfaces/trilinos/EpetraMatrix.cpp | 4 +- .../interfaces/trilinos/EpetraVector.cpp | 2 +- .../unitTests/testExternalSolvers.cpp | 4 +- .../unitTests/testKrylovSolvers.cpp | 16 +++--- .../linearAlgebra/unitTests/testMatrices.cpp | 28 +++++----- .../linearAlgebra/unitTests/testVectors.cpp | 10 ++-- .../utilities/LAIHelperFunctions.hpp | 14 ++--- .../mainInterface/GeosxState.cpp | 2 +- .../mainInterface/ProblemManager.cpp | 2 +- src/coreComponents/mesh/DomainPartition.cpp | 8 +-- .../mesh/ElementRegionManager.cpp | 2 +- .../mesh/EmbeddedSurfaceNodeManager.cpp | 4 +- src/coreComponents/mesh/ObjectManagerBase.cpp | 8 +-- src/coreComponents/mesh/ParticleManager.cpp | 2 +- src/coreComponents/mesh/ParticleRegion.cpp | 2 +- .../mesh/ParticleSubRegionBase.cpp | 2 +- .../mesh/WellElementSubRegion.cpp | 8 +-- .../mesh/generators/InternalMeshGenerator.cpp | 2 +- .../mesh/generators/VTKMeshGenerator.cpp | 2 +- .../mesh/generators/VTKUtilities.cpp | 18 +++---- .../mesh/generators/WellGeneratorBase.cpp | 2 +- .../mpiCommunications/CommunicationTools.cpp | 20 +++---- .../NeighborCommunicator.cpp | 8 +-- .../NeighborCommunicator.hpp | 2 +- .../mpiCommunications/SpatialPartition.cpp | 16 +++--- .../physicsSolvers/SolverBase.cpp | 8 +-- .../physicsSolvers/SolverBaseKernels.hpp | 6 +-- .../contact/ContactSolverBase.cpp | 2 +- ...lidMechanicsAugmentedLagrangianContact.cpp | 16 +++--- .../SolidMechanicsEmbeddedFractures.cpp | 14 ++--- .../fluidFlow/FlowSolverBase.cpp | 8 +-- .../ReactiveCompositionalMultiphaseOBL.cpp | 4 +- .../CoupledReservoirAndWellsBase.hpp | 4 +- .../multiphysics/HydrofractureSolver.cpp | 6 +-- .../multiphysics/PoromechanicsSolver.hpp | 2 +- ...ePhasePoromechanicsConformingFractures.cpp | 4 +- ...glePhasePoromechanicsEmbeddedFractures.cpp | 4 +- .../simplePDE/PhaseFieldDamageFEM.cpp | 8 +-- .../SolidMechanicsLagrangianFEM.cpp | 12 ++--- .../solidMechanics/SolidMechanicsMPM.cpp | 52 +++++++++---------- .../SolidMechanicsStatistics.cpp | 4 +- .../EmbeddedSurfaceGenerator.cpp | 4 +- ...mbeddedSurfacesParallelSynchronization.cpp | 12 ++--- .../ParallelTopologyChange.cpp | 8 +-- .../surfaceGeneration/SurfaceGenerator.cpp | 2 +- .../isotropic/AcousticWaveEquationSEM.cpp | 6 +-- .../isotropic/ElasticWaveEquationSEM.cpp | 2 +- .../unitTests/fileIOTests/testHDFFile.cpp | 2 +- .../fluidFlowTests/testCompFlowUtils.hpp | 2 +- .../fluidFlowTests/testSingleFlowUtils.hpp | 2 +- .../linearAlgebraTests/testDofManager.cpp | 8 +-- .../testDofManagerUtils.hpp | 2 +- .../testLAIHelperFunctions.cpp | 4 +- .../meshTests/testNeighborCommunicator.cpp | 6 +-- 75 files changed, 280 insertions(+), 280 deletions(-) diff --git a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp index a947b37ac58..3b82f6b0f34 100644 --- a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp +++ b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp @@ -64,7 +64,7 @@ namespace testing template< typename T > T expected( T expectedSerial, std::initializer_list< T > expectedParallel, - MPI_Comm const & comm = MPI_COMM_GEOSX ) + MPI_Comm const & comm = MPI_COMM_GEOS ) { int const mpiSize = MpiWrapper::commSize( comm ); if( mpiSize == 1 ) diff --git a/src/coreComponents/common/DataTypes.cpp b/src/coreComponents/common/DataTypes.cpp index 4672907c1ad..d4b86ea96a7 100644 --- a/src/coreComponents/common/DataTypes.cpp +++ b/src/coreComponents/common/DataTypes.cpp @@ -26,9 +26,9 @@ namespace geos { #ifdef GEOS_USE_MPI -MPI_Comm MPI_COMM_GEOSX; +MPI_Comm MPI_COMM_GEOS; #else -int MPI_COMM_GEOSX = 0; +int MPI_COMM_GEOS = 0; #endif diff --git a/src/coreComponents/common/DataTypes.hpp b/src/coreComponents/common/DataTypes.hpp index f6f19ad383f..70758781410 100644 --- a/src/coreComponents/common/DataTypes.hpp +++ b/src/coreComponents/common/DataTypes.hpp @@ -107,9 +107,9 @@ NEW_TYPE dynamicCast( EXISTING_TYPE & val ) /// Global MPI communicator used by GEOSX. #ifdef GEOS_USE_MPI -extern MPI_Comm MPI_COMM_GEOSX; +extern MPI_Comm MPI_COMM_GEOS; #else -extern int MPI_COMM_GEOSX; +extern int MPI_COMM_GEOS; #endif /** diff --git a/src/coreComponents/common/MpiWrapper.hpp b/src/coreComponents/common/MpiWrapper.hpp index d0ae08dc1af..12633b63632 100644 --- a/src/coreComponents/common/MpiWrapper.hpp +++ b/src/coreComponents/common/MpiWrapper.hpp @@ -139,7 +139,7 @@ struct MpiWrapper */ ///@{ - static void barrier( MPI_Comm const & MPI_PARAM( comm )=MPI_COMM_GEOSX ); + static void barrier( MPI_Comm const & MPI_PARAM( comm )=MPI_COMM_GEOS ); static int cartCoords( MPI_Comm comm, int rank, int maxdims, int coords[] ); @@ -150,9 +150,9 @@ struct MpiWrapper static void commFree( MPI_Comm & comm ); - static int commRank( MPI_Comm const & MPI_PARAM( comm )=MPI_COMM_GEOSX ); + static int commRank( MPI_Comm const & MPI_PARAM( comm )=MPI_COMM_GEOS ); - static int commSize( MPI_Comm const & MPI_PARAM( comm )=MPI_COMM_GEOSX ); + static int commSize( MPI_Comm const & MPI_PARAM( comm )=MPI_COMM_GEOS ); static bool commCompare( MPI_Comm const & comm1, MPI_Comm const & comm2 ); @@ -337,12 +337,12 @@ struct MpiWrapper * @param[out] allValues The values recived from each rank. */ template< typename T > - static void allGather( T const myValue, array1d< T > & allValues, MPI_Comm comm = MPI_COMM_GEOSX ); + static void allGather( T const myValue, array1d< T > & allValues, MPI_Comm comm = MPI_COMM_GEOS ); template< typename T > static int allGather( arrayView1d< T const > const & sendbuf, array1d< T > & recvbuf, - MPI_Comm comm = MPI_COMM_GEOSX ); + MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Strongly typed wrapper around MPI_Allreduce. @@ -354,7 +354,7 @@ struct MpiWrapper * @return The return value of the underlying call to MPI_Allreduce(). */ template< typename T > - static int allReduce( T const * sendbuf, T * recvbuf, int count, MPI_Op op, MPI_Comm comm = MPI_COMM_GEOSX ); + static int allReduce( T const * sendbuf, T * recvbuf, int count, MPI_Op op, MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Convenience wrapper for the MPI_Allreduce function. @@ -365,7 +365,7 @@ struct MpiWrapper * @return The value of reduction across all ranks */ template< typename T > - static T allReduce( T const & value, Reduction const op, MPI_Comm comm = MPI_COMM_GEOSX ); + static T allReduce( T const & value, Reduction const op, MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Convenience wrapper for the MPI_Allreduce function. Version for sequences. @@ -376,7 +376,7 @@ struct MpiWrapper * @param comm The communicator. */ template< typename T > - static void allReduce( Span< T const > src, Span< T > dst, Reduction const op, MPI_Comm comm = MPI_COMM_GEOSX ); + static void allReduce( Span< T const > src, Span< T > dst, Reduction const op, MPI_Comm comm = MPI_COMM_GEOS ); /** @@ -389,7 +389,7 @@ struct MpiWrapper * @return The return value of the underlying call to MPI_Reduce(). */ template< typename T > - static int reduce( T const * sendbuf, T * recvbuf, int count, MPI_Op op, int root, MPI_Comm comm = MPI_COMM_GEOSX ); + static int reduce( T const * sendbuf, T * recvbuf, int count, MPI_Op op, int root, MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Convenience wrapper for the MPI_Reduce function. @@ -400,7 +400,7 @@ struct MpiWrapper * @return The value of reduction (only significant at root) */ template< typename T > - static T reduce( T const & value, Reduction const op, int root, MPI_Comm comm = MPI_COMM_GEOSX ); + static T reduce( T const & value, Reduction const op, int root, MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Convenience wrapper for the MPI_Reduce function. Version for sequences. @@ -411,7 +411,7 @@ struct MpiWrapper * @param comm The communicator. */ template< typename T > - static void reduce( Span< T const > src, Span< T > dst, Reduction const op, int root, MPI_Comm comm = MPI_COMM_GEOSX ); + static void reduce( Span< T const > src, Span< T > dst, Reduction const op, int root, MPI_Comm comm = MPI_COMM_GEOS ); template< typename T > @@ -439,7 +439,7 @@ struct MpiWrapper * @param srcRank The rank that is sending the \p value. */ template< typename T > - static void broadcast( T & value, int srcRank = 0, MPI_Comm comm = MPI_COMM_GEOSX ); + static void broadcast( T & value, int srcRank = 0, MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Strongly typed wrapper around MPI_Gather(). @@ -549,7 +549,7 @@ struct MpiWrapper * @return a pair where first is the prefix sum, second is the full sum */ template< typename U, typename T > - static U prefixSum( T const value, MPI_Comm comm = MPI_COMM_GEOSX ); + static U prefixSum( T const value, MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Convenience function for a MPI_Allreduce using a MPI_SUM operation. @@ -557,7 +557,7 @@ struct MpiWrapper * @return The sum of all \p value across the ranks. */ template< typename T > - static T sum( T const & value, MPI_Comm comm = MPI_COMM_GEOSX ); + static T sum( T const & value, MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Convenience function for a MPI_Allreduce using a MPI_SUM operation. @@ -566,7 +566,7 @@ struct MpiWrapper * @return The sum of all \p value across the ranks. */ template< typename T > - static void sum( Span< T const > src, Span< T > dst, MPI_Comm comm = MPI_COMM_GEOSX ); + static void sum( Span< T const > src, Span< T > dst, MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Convenience function for a MPI_Allreduce using a MPI_MIN operation. @@ -574,7 +574,7 @@ struct MpiWrapper * @return The minimum of all \p value across the ranks. */ template< typename T > - static T min( T const & value, MPI_Comm comm = MPI_COMM_GEOSX ); + static T min( T const & value, MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Convenience function for a MPI_Allreduce using a MPI_MIN operation. @@ -583,7 +583,7 @@ struct MpiWrapper * @return The minimum of all \p value across the ranks. */ template< typename T > - static void min( Span< T const > src, Span< T > dst, MPI_Comm comm = MPI_COMM_GEOSX ); + static void min( Span< T const > src, Span< T > dst, MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Convenience function for a MPI_Allreduce using a MPI_MAX operation. @@ -591,7 +591,7 @@ struct MpiWrapper * @return The maximum of all \p value across the ranks. */ template< typename T > - static T max( T const & value, MPI_Comm comm = MPI_COMM_GEOSX ); + static T max( T const & value, MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Convenience function for a MPI_Allreduce using a MPI_MAX operation. @@ -600,7 +600,7 @@ struct MpiWrapper * @return The maximum of all \p value across the ranks. */ template< typename T > - static void max( Span< T const > src, Span< T > dst, MPI_Comm comm = MPI_COMM_GEOSX ); + static void max( Span< T const > src, Span< T > dst, MPI_Comm comm = MPI_COMM_GEOS ); }; namespace internal diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 4d69cc878fa..61624d55420 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -65,7 +65,7 @@ namespace geos void setupLogger() { #ifdef GEOS_USE_MPI - logger::InitializeLogger( MPI_COMM_GEOSX ); + logger::InitializeLogger( MPI_COMM_GEOS ); #else logger::InitializeLogger(); #endif @@ -126,19 +126,19 @@ void setupMPI( int argc, char * argv[] ) MpiWrapper::init( &argc, &argv ); } - MPI_COMM_GEOSX = MpiWrapper::commDup( MPI_COMM_WORLD ); + MPI_COMM_GEOS = MpiWrapper::commDup( MPI_COMM_WORLD ); - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) == 0 ) + if( MpiWrapper::commRank( MPI_COMM_GEOS ) == 0 ) { // Can't use logging macros prior to logger init - std::cout << "Num ranks: " << MpiWrapper::commSize( MPI_COMM_GEOSX ) << std::endl; + std::cout << "Num ranks: " << MpiWrapper::commSize( MPI_COMM_GEOS ) << std::endl; } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void finalizeMPI() { - MpiWrapper::commFree( MPI_COMM_GEOSX ); + MpiWrapper::commFree( MPI_COMM_GEOS ); MpiWrapper::finalize(); } @@ -154,7 +154,7 @@ void setupCaliper( cali::ConfigManager & caliperManager, #if defined( GEOS_USE_ADIAK ) #if defined( GEOS_USE_MPI ) - adiak::init( &MPI_COMM_GEOSX ); + adiak::init( &MPI_COMM_GEOS ); #else adiak::init( nullptr ); #endif @@ -289,7 +289,7 @@ static void addUmpireHighWaterMarks() string allocatorNameMinChars = string( MAX_NAME_LENGTH, '\0' ); // Make sure that each rank is looking at the same allocator. - MpiWrapper::allReduce( allocatorNameFixedSize.c_str(), &allocatorNameMinChars.front(), MAX_NAME_LENGTH, MPI_MIN, MPI_COMM_GEOSX ); + MpiWrapper::allReduce( allocatorNameFixedSize.c_str(), &allocatorNameMinChars.front(), MAX_NAME_LENGTH, MPI_MIN, MPI_COMM_GEOS ); if( allocatorNameFixedSize != allocatorNameMinChars ) { GEOS_WARNING( "Not all ranks have an allocator named " << allocatorNameFixedSize << ", cannot compute high water mark." ); diff --git a/src/coreComponents/dataRepository/ConduitRestart.cpp b/src/coreComponents/dataRepository/ConduitRestart.cpp index 64e5e9e2bb3..c94a1724e52 100644 --- a/src/coreComponents/dataRepository/ConduitRestart.cpp +++ b/src/coreComponents/dataRepository/ConduitRestart.cpp @@ -52,7 +52,7 @@ string writeRootFile( conduit::Node & root, string const & rootPath ) conduit::relay::io::save( root, completeRootPath + ".root", "hdf5" ); } - MpiWrapper::barrier( MPI_COMM_GEOSX ); + MpiWrapper::barrier( MPI_COMM_GEOS ); return GEOS_FMT( "{}/rank_{:07}.hdf5", completeRootPath.data(), MpiWrapper::commRank() ); } diff --git a/src/coreComponents/dataRepository/Utilities.cpp b/src/coreComponents/dataRepository/Utilities.cpp index 6908a4b4525..d8c6d9e1c34 100644 --- a/src/coreComponents/dataRepository/Utilities.cpp +++ b/src/coreComponents/dataRepository/Utilities.cpp @@ -77,7 +77,7 @@ void printMemoryAllocation( Group const & group, integer const indent, real64 co globalAllocations.data(), numValues, 0, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); // reduce data across ranks (min, max, sum) if( MpiWrapper::commRank()==0 ) diff --git a/src/coreComponents/events/EventManager.cpp b/src/coreComponents/events/EventManager.cpp index 5eb161801ca..6dc12b5624d 100644 --- a/src/coreComponents/events/EventManager.cpp +++ b/src/coreComponents/events/EventManager.cpp @@ -166,7 +166,7 @@ bool EventManager::run( DomainPartition & domain ) #ifdef GEOS_USE_MPI // Find the min dt across processes real64 dt_global; - MPI_Allreduce( &m_dt, &dt_global, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_GEOSX ); + MPI_Allreduce( &m_dt, &dt_global, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_GEOS ); m_dt = dt_global; #endif } diff --git a/src/coreComponents/fileIO/Outputs/ChomboIO.cpp b/src/coreComponents/fileIO/Outputs/ChomboIO.cpp index bc3de58385f..0923d603e4c 100644 --- a/src/coreComponents/fileIO/Outputs/ChomboIO.cpp +++ b/src/coreComponents/fileIO/Outputs/ChomboIO.cpp @@ -88,7 +88,7 @@ bool ChomboIO::execute( real64 const GEOS_UNUSED_PARAM( time_n ), GEOS_LOG_LEVEL_RANK_0( 1, "Initializing chombo coupling" ); - m_coupler = new ChomboCoupler( MPI_COMM_GEOSX, m_outputPath, m_inputPath, domain.getMeshBody( 0 ).getBaseDiscretization() ); + m_coupler = new ChomboCoupler( MPI_COMM_GEOS, m_outputPath, m_inputPath, domain.getMeshBody( 0 ).getBaseDiscretization() ); } diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.cpp b/src/coreComponents/fileIO/Outputs/OutputBase.cpp index 15f170e4fca..a09086396f4 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.cpp @@ -79,7 +79,7 @@ void OutputBase::setupDirectoryStructure() { string childDirectory = m_childDirectory; - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); if( rank == 0 ) { if( !childDirectory.empty()) diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp index 4d257cedf6a..1ade6b9955c 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp @@ -124,9 +124,9 @@ bool SiloOutput::execute( real64 const time_n, SiloFile silo; - int const size = MpiWrapper::commSize( MPI_COMM_GEOSX ); - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); - MpiWrapper::barrier( MPI_COMM_GEOSX ); + int const size = MpiWrapper::commSize( MPI_COMM_GEOS ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); + MpiWrapper::barrier( MPI_COMM_GEOS ); integer const numFiles = parallelThreads() == 0 ? size : parallelThreads(); diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index ecbd5a3ad8f..a99528b0057 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -89,12 +89,12 @@ void TimeHistoryOutput::initCollectorParallel( DomainPartition const & domain, H }; registerBufferCalls( collector ); - MpiWrapper::barrier( MPI_COMM_GEOSX ); + MpiWrapper::barrier( MPI_COMM_GEOS ); for( localIndex metaIdx = 0; metaIdx < collector.numMetaDataCollectors(); ++metaIdx ) { registerBufferCalls( collector.getMetaDataCollector( metaIdx ), collector.getTargetName() + " " ); - MpiWrapper::barrier( MPI_COMM_GEOSX ); + MpiWrapper::barrier( MPI_COMM_GEOS ); } // Do the time output last so its at the end of the m_io list, since writes are parallel @@ -111,7 +111,7 @@ void TimeHistoryOutput::initCollectorParallel( DomainPartition const & domain, H m_io.back()->init( !freshInit ); } - MpiWrapper::barrier( MPI_COMM_GEOSX ); + MpiWrapper::barrier( MPI_COMM_GEOS ); } void TimeHistoryOutput::initializePostInitialConditionsPostSubGroups() @@ -119,13 +119,13 @@ void TimeHistoryOutput::initializePostInitialConditionsPostSubGroups() { // check whether to truncate or append to the file up front so we don't have to bother during later accesses string const outputDirectory = getOutputDirectory(); - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) == 0 ) + if( MpiWrapper::commRank( MPI_COMM_GEOS ) == 0 ) { makeDirsForPath( outputDirectory ); } - MpiWrapper::barrier( MPI_COMM_GEOSX ); + MpiWrapper::barrier( MPI_COMM_GEOS ); string const outputFile = joinPath( outputDirectory, m_filename ); - HDFFile( outputFile, (m_recordCount == 0), true, MPI_COMM_GEOSX ); + HDFFile( outputFile, (m_recordCount == 0), true, MPI_COMM_GEOS ); } DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); @@ -182,7 +182,7 @@ void TimeHistoryOutput::cleanup( real64 const time_n, DomainPartition & domain ) { execute( time_n, 0.0, cycleNumber, eventCounter, eventProgress, domain ); - MpiWrapper::barrier( MPI_COMM_GEOSX ); + MpiWrapper::barrier( MPI_COMM_GEOS ); // remove any unused trailing space reserved to write additional histories for( auto & th_io : m_io ) { diff --git a/src/coreComponents/fileIO/silo/SiloFile.cpp b/src/coreComponents/fileIO/silo/SiloFile.cpp index cb2882bb36f..73c5533c44e 100644 --- a/src/coreComponents/fileIO/silo/SiloFile.cpp +++ b/src/coreComponents/fileIO/silo/SiloFile.cpp @@ -283,7 +283,7 @@ void SiloFile::makeSiloDirectories() int rank=0; #ifdef GEOS_USE_MPI - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); #endif if( rank==0 ) @@ -305,12 +305,12 @@ void SiloFile::initialize( int const MPI_PARAM( numGroups ) ) #else m_numGroups = 1; #endif - MpiWrapper::bcast( &m_numGroups, 1, 0, MPI_COMM_GEOSX ); -// MPI_Bcast( const_cast(&m_driver), 1, MPI_INT, 0, MPI_COMM_GEOSX); + MpiWrapper::bcast( &m_numGroups, 1, 0, MPI_COMM_GEOS ); +// MPI_Bcast( const_cast(&m_driver), 1, MPI_INT, 0, MPI_COMM_GEOS); // Initialize PMPIO, pass a pointer to the driver type as the user data. m_baton = PMPIO_Init( m_numGroups, PMPIO_WRITE, - MPI_COMM_GEOSX, + MPI_COMM_GEOS, 1, PMPIO_DefaultCreate, PMPIO_DefaultOpen, @@ -348,7 +348,7 @@ void SiloFile::waitForBatonWrite( int const domainNumber, int rank = 0; #ifdef GEOS_USE_MPI - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); #endif int const groupRank = PMPIO_GroupRank( m_baton, rank ); @@ -382,7 +382,7 @@ void SiloFile::waitForBaton( int const domainNumber, string const & restartFileN int rank = 0; #ifdef GEOS_USE_MPI - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); #endif int const groupRank = PMPIO_GroupRank( m_baton, rank ); @@ -416,7 +416,7 @@ void SiloFile::handOffBaton() int rank = 0; #ifdef GEOS_USE_MPI - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); #endif if( rank==0 ) { @@ -578,7 +578,7 @@ void SiloFile::writeMeshObject( string const & meshName, // write multimesh object int rank = 0; #ifdef GEOS_USE_MPI - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); #endif if( rank == 0 ) { @@ -653,7 +653,7 @@ void SiloFile::writeBeamMesh( string const & meshName, { int rank = 0; #ifdef GEOS_USE_MPI - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); #endif if( rank == 0 ) { @@ -686,7 +686,7 @@ void SiloFile::writePointMesh( string const & meshName, { int rank = 0; #ifdef GEOS_USE_MPI - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); #endif if( rank == 0 ) { @@ -814,12 +814,12 @@ void SiloFile::writeMaterialMapsFullStorage( ElementRegionBase const & elemRegio // write multimesh object int rank = 0; #ifdef GEOS_USE_MPI - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); #endif if( rank == 0 ) { - int const size = MpiWrapper::commSize( MPI_COMM_GEOSX ); + int const size = MpiWrapper::commSize( MPI_COMM_GEOS ); array1d< string > vBlockNames( size ); std::vector< char * > BlockNames( size ); @@ -983,8 +983,8 @@ void SiloFile::writeMaterialVarDefinition( string const & subDir, void SiloFile::clearEmptiesFromMultiObjects( int const cycleNum ) { - int const size = MpiWrapper::commSize( MPI_COMM_GEOSX ); - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const size = MpiWrapper::commSize( MPI_COMM_GEOS ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); string sendbufferVars; string sendbufferMesh; @@ -1015,7 +1015,7 @@ void SiloFile::clearEmptiesFromMultiObjects( int const cycleNum ) integer_array rcounts( size ); integer_array displs( size ); - MpiWrapper::gather( &sizeOfSendBufferVars, 1, rcounts.data(), 1, 0, MPI_COMM_GEOSX ); + MpiWrapper::gather( &sizeOfSendBufferVars, 1, rcounts.data(), 1, 0, MPI_COMM_GEOS ); int sizeOfReceiveBuffer = 0; displs[0] = 0; @@ -1032,10 +1032,10 @@ void SiloFile::clearEmptiesFromMultiObjects( int const cycleNum ) rcounts.data(), displs.data(), 0, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); - MpiWrapper::gather( &sizeOfSendBufferMesh, 1, rcounts.data(), 1, 0, MPI_COMM_GEOSX ); + MpiWrapper::gather( &sizeOfSendBufferMesh, 1, rcounts.data(), 1, 0, MPI_COMM_GEOS ); int sizeOfReceiveBufferMesh = 0; displs[0] = 0; @@ -1052,7 +1052,7 @@ void SiloFile::clearEmptiesFromMultiObjects( int const cycleNum ) rcounts.data(), displs.data(), 0, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); @@ -2112,7 +2112,7 @@ void SiloFile::writeMultiXXXX( const DBObjectType type, int size = 1; #ifdef GEOS_USE_MPI - MPI_Comm_size( MPI_COMM_GEOSX, &size ); + MPI_Comm_size( MPI_COMM_GEOS, &size ); #endif string_array vBlockNames( size ); @@ -2260,7 +2260,7 @@ void SiloFile::writeDataField( string const & meshName, // write multimesh object int rank = 0; #ifdef GEOS_USE_MPI - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); #endif if( rank == 0 ) { @@ -2529,7 +2529,7 @@ void SiloFile::writeDataField( string const & meshName, // write multimesh object int rank = 0; #ifdef GEOS_USE_MPI - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); #endif if( rank == 0 ) { @@ -2817,7 +2817,7 @@ void SiloFile::writeMaterialDataField( string const & meshName, // write multimesh object int rank = 0; #ifdef GEOS_USE_MPI - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); #endif if( rank == 0 ) { @@ -3127,7 +3127,7 @@ void SiloFile::writeStressVarDefinition( string const & MatDir ) void SiloFile::writeVectorVarDefinition( string const & fieldName, string const & subDirectory ) { - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) == 0 ) + if( MpiWrapper::commRank( MPI_COMM_GEOS ) == 0 ) { DBSetDir( m_dbBaseFilePtr, subDirectory.c_str() ); DBtoc * const siloTOC = DBGetToc ( m_dbBaseFilePtr ); diff --git a/src/coreComponents/fileIO/silo/SiloFile.hpp b/src/coreComponents/fileIO/silo/SiloFile.hpp index bd85ff8462a..21b7c40d916 100644 --- a/src/coreComponents/fileIO/silo/SiloFile.hpp +++ b/src/coreComponents/fileIO/silo/SiloFile.hpp @@ -122,7 +122,7 @@ class SiloFile */ void makeSubDirectory( string const & subdir, string const & rootdir ) { - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); // char dirname[100]; if( rank == 0 ) diff --git a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp index 6b873f20427..9a2b70c2def 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp +++ b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp @@ -53,7 +53,7 @@ class HDFHistoryIO : public BufferedHistoryIO localIndex writeHead = 0, localIndex initAlloc = 1, localIndex overallocMultiple = 2, - MPI_Comm comm = MPI_COMM_GEOSX ); + MPI_Comm comm = MPI_COMM_GEOS ); /** * @brief Constructor @@ -69,7 +69,7 @@ class HDFHistoryIO : public BufferedHistoryIO localIndex writeHead = 0, localIndex initAlloc = 1, localIndex overallocMultiple = 2, - MPI_Comm comm = MPI_COMM_GEOSX ): + MPI_Comm comm = MPI_COMM_GEOS ): HDFHistoryIO( filename, spec.getRank(), spec.getDims(), diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp index f4c8b0ff21d..29df130fb63 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp @@ -1306,7 +1306,7 @@ void VTKPolyDataWriterInterface::write( real64 const time, { makeDirsForPath( stepSubDirFull ); } - MpiWrapper::barrier( MPI_COMM_GEOSX ); + MpiWrapper::barrier( MPI_COMM_GEOS ); // loop over all mesh levels and mesh bodies domain.forMeshBodies( [&]( MeshBody const & meshBody ) diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp index 1b85d4f67a9..d2a03d3c0f7 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp @@ -955,7 +955,7 @@ void TwoPointFluxApproximation::computeAquiferStencil( DomainPartition & domain, globalSumFaceAreas.data(), localSumFaceAreas.size(), MpiWrapper::getMpiOp( MpiWrapper::Reduction::Sum ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); // Step 3: compute the face area fraction for each connection, and insert into boundary stencil diff --git a/src/coreComponents/linearAlgebra/DofManager.cpp b/src/coreComponents/linearAlgebra/DofManager.cpp index 34b0855bf88..9e0cbe78f8d 100644 --- a/src/coreComponents/linearAlgebra/DofManager.cpp +++ b/src/coreComponents/linearAlgebra/DofManager.cpp @@ -1790,7 +1790,7 @@ void DofManager::makeRestrictor( std::vector< SubComponent > const & selection, void DofManager::printFieldInfo( std::ostream & os ) const { - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) == 0 ) + if( MpiWrapper::commRank( MPI_COMM_GEOS ) == 0 ) { localIndex const numFields = LvArray::integerConversion< localIndex >( m_fields.size() ); diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp index baceac5a6fc..f851ffdc48c 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp @@ -33,7 +33,7 @@ void PetscInterface::initialize() { PetscOptionsSetValue( nullptr, "-no_signal_handler", "" ); PetscOptionsSetValue( nullptr, "-on_error_abort", "" ); - PETSC_COMM_WORLD = MPI_COMM_GEOSX; + PETSC_COMM_WORLD = MPI_COMM_GEOS; PetscInitializeNoArguments(); } diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp index 09830dfa800..7844bd4e849 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp @@ -734,7 +734,7 @@ void PetscMatrix::separateComponentFilter( PetscMatrix & dst, GEOS_LAI_CHECK_ERROR( MatRestoreRow( m_mat, row, &numEntries, nullptr, &vals ) ); } - dst.create( tempMatView.toViewConst(), numLocalCols(), MPI_COMM_GEOSX ); + dst.create( tempMatView.toViewConst(), numLocalCols(), MPI_COMM_GEOS ); dst.setDofManager( dofManager() ); } diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp index ec8e588a3bb..21aa5df6e77 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp @@ -49,7 +49,7 @@ void convertRigidBodyModes( LinearSolverParameters const & params, GEOS_LAI_CHECK_ERROR( VecSetBlockSize( nullvecs[i], params.dofsPerNode ) ); GEOS_LAI_CHECK_ERROR( VecSetUp( nullvecs[i] ) ); } - GEOS_LAI_CHECK_ERROR( MatNullSpaceCreate( MPI_COMM_GEOSX, PETSC_FALSE, numRBM, nullvecs.data(), &nullsp ) ); + GEOS_LAI_CHECK_ERROR( MatNullSpaceCreate( MPI_COMM_GEOS, PETSC_FALSE, numRBM, nullvecs.data(), &nullsp ) ); for( localIndex i = 0; i < numRBM; ++i ) { GEOS_LAI_CHECK_ERROR( VecDestroy( &nullvecs[i] ) ); @@ -222,7 +222,7 @@ void createPetscAMG( LinearSolverParameters const & params, // Sanity checks GEOS_LAI_ASSERT_EQ( n_local, 1 ); - GEOS_LAI_ASSERT_EQ( first_local, MpiWrapper::commRank( MPI_COMM_GEOSX ) ); + GEOS_LAI_ASSERT_EQ( first_local, MpiWrapper::commRank( MPI_COMM_GEOS ) ); // Set up local block ILU preconditioner PC prec_local; diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp index 6b5b5fd68ec..bca0578a432 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp @@ -575,7 +575,7 @@ void EpetraMatrix::separateComponentFilter( EpetraMatrix & dst, } } ); - dst.create( tempMatView.toViewConst(), numLocalCols(), MPI_COMM_GEOSX ); + dst.create( tempMatView.toViewConst(), numLocalCols(), MPI_COMM_GEOS ); dst.setDofManager( dofManager() ); } @@ -1042,7 +1042,7 @@ MPI_Comm EpetraMatrix::comm() const #ifdef GEOS_USE_MPI return dynamicCast< Epetra_MpiComm const & >( m_matrix->RowMap().Comm() ).Comm(); #else - return MPI_COMM_GEOSX; + return MPI_COMM_GEOS; #endif } diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp index 2993d566997..02016e5ffd0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp @@ -293,7 +293,7 @@ MPI_Comm EpetraVector::comm() const #ifdef GEOS_USE_MPI return dynamicCast< Epetra_MpiComm const & >( m_vec->Map().Comm() ).Comm(); #else - return MPI_COMM_GEOSX; + return MPI_COMM_GEOS; #endif } diff --git a/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp b/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp index 0f8b959c1a4..6ea6b405c09 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp @@ -151,7 +151,7 @@ class SolverTestLaplace2D : public SolverTestBase< LAI > void SetUp() override { globalIndex constexpr n = 100; - geos::testing::compute2DLaplaceOperator( MPI_COMM_GEOSX, n, this->matrix ); + geos::testing::compute2DLaplaceOperator( MPI_COMM_GEOS, n, this->matrix ); // Condition number for the Laplacian matrix estimate: 4 * n^2 / pi^2 this->cond_est = 4.0 * n * n / std::pow( M_PI, 2 ); @@ -232,7 +232,7 @@ class SolverTestElasticity2D : public SolverTestBase< LAI > void SetUp() override { globalIndex constexpr n = 100; - geos::testing::compute2DElasticityOperator( MPI_COMM_GEOSX, 1.0, 1.0, n, n, 10000., 0.2, this->matrix ); + geos::testing::compute2DElasticityOperator( MPI_COMM_GEOS, 1.0, 1.0, n, n, 10000., 0.2, this->matrix ); this->cond_est = 1e4; // not a true condition number estimate, but enough to pass tests } }; diff --git a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp index be7045939b9..2ec7b8f0e8d 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp @@ -125,13 +125,13 @@ class KrylovSolverTest : public KrylovSolverTestBase< typename LAI::ParallelMatr { // Compute matrix and preconditioner globalIndex constexpr n = 100; - geos::testing::compute2DLaplaceOperator( MPI_COMM_GEOSX, n, this->matrix ); + geos::testing::compute2DLaplaceOperator( MPI_COMM_GEOS, n, this->matrix ); this->precond.setup( this->matrix ); // Set up vectors - this->sol_true.create( this->matrix.numLocalCols(), MPI_COMM_GEOSX ); - this->sol_comp.create( this->matrix.numLocalCols(), MPI_COMM_GEOSX ); - this->rhs_true.create( this->matrix.numLocalRows(), MPI_COMM_GEOSX ); + this->sol_true.create( this->matrix.numLocalCols(), MPI_COMM_GEOS ); + this->sol_comp.create( this->matrix.numLocalCols(), MPI_COMM_GEOS ); + this->rhs_true.create( this->matrix.numLocalRows(), MPI_COMM_GEOS ); // Condition number for the Laplacian matrix estimate: 4 * n^2 / pi^2 this->cond_est = 1.5 * 4.0 * n * n / std::pow( M_PI, 2 ); @@ -198,7 +198,7 @@ class KrylovSolverBlockTest : public KrylovSolverTestBase< BlockOperatorWrapper< void SetUp() override { globalIndex constexpr n = 100; - geos::testing::compute2DLaplaceOperator( MPI_COMM_GEOSX, n, laplace2D ); + geos::testing::compute2DLaplaceOperator( MPI_COMM_GEOS, n, laplace2D ); // We are going to assembly the following dummy system // [L 0] [x_true] = [b_0] @@ -218,9 +218,9 @@ class KrylovSolverBlockTest : public KrylovSolverTestBase< BlockOperatorWrapper< for( localIndex i = 0; i < 2; ++i ) { - this->sol_true.block( i ).create( laplace2D.numLocalCols(), MPI_COMM_GEOSX ); - this->sol_comp.block( i ).create( laplace2D.numLocalCols(), MPI_COMM_GEOSX ); - this->rhs_true.block( i ).create( laplace2D.numLocalRows(), MPI_COMM_GEOSX ); + this->sol_true.block( i ).create( laplace2D.numLocalCols(), MPI_COMM_GEOS ); + this->sol_comp.block( i ).create( laplace2D.numLocalCols(), MPI_COMM_GEOS ); + this->rhs_true.block( i ).create( laplace2D.numLocalRows(), MPI_COMM_GEOS ); } // Condition number for the Laplacian matrix estimate: 4 * n^2 / pi^2 diff --git a/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp b/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp index d9345d44d3a..16df69c7dae 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp @@ -37,8 +37,8 @@ TYPED_TEST_P( MatrixTest, MatrixFunctions ) using Matrix = typename TypeParam::ParallelMatrix; // Get the MPI rank - int numranks = MpiWrapper::commSize( MPI_COMM_GEOSX ); - int rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int numranks = MpiWrapper::commSize( MPI_COMM_GEOS ); + int rank = MpiWrapper::commRank( MPI_COMM_GEOS ); std::cout << "*** Rank: " << rank << std::endl; @@ -48,7 +48,7 @@ TYPED_TEST_P( MatrixTest, MatrixFunctions ) { // Test matrix-matrix product: C = A*B Matrix A; - geos::testing::compute2DLaplaceOperator( MPI_COMM_GEOSX, 2 * numranks, A ); + geos::testing::compute2DLaplaceOperator( MPI_COMM_GEOS, 2 * numranks, A ); Matrix B( A ); A.multiply( B, C ); @@ -58,10 +58,10 @@ TYPED_TEST_P( MatrixTest, MatrixFunctions ) // Define some vectors, matrices Vector vec1, vec2, vec3; Matrix mat1, mat2, mat3, mat4; - mat1.createWithLocalSize( 2, 2, MPI_COMM_GEOSX ); // 2*numranks x 2*numranks - mat2.createWithGlobalSize( 2, 2, MPI_COMM_GEOSX ); // 2x2 - mat3.createWithLocalSize( 2, 3, 3, MPI_COMM_GEOSX ); // 2*numranks x 3*numranks - mat4.createWithGlobalSize( 3, 4, 3, MPI_COMM_GEOSX ); // 3x4 + mat1.createWithLocalSize( 2, 2, MPI_COMM_GEOS ); // 2*numranks x 2*numranks + mat2.createWithGlobalSize( 2, 2, MPI_COMM_GEOS ); // 2x2 + mat3.createWithLocalSize( 2, 3, 3, MPI_COMM_GEOS ); // 2*numranks x 3*numranks + mat4.createWithGlobalSize( 3, 4, 3, MPI_COMM_GEOS ); // 3x4 // Testing create, globalRows, globalCols EXPECT_EQ( mat1.numGlobalRows(), 2 * numranks ); @@ -125,7 +125,7 @@ TYPED_TEST_P( MatrixTest, MatrixFunctions ) } // Testing add/set/insert array1d Matrix mat6; - mat6.createWithGlobalSize( 4, 4, MPI_COMM_GEOSX ); + mat6.createWithGlobalSize( 4, 4, MPI_COMM_GEOS ); array1d< real64 > vals6( 3 ); array1d< real64 > vals7( 3 ); array1d< globalIndex > inds6( 3 ); @@ -152,7 +152,7 @@ TYPED_TEST_P( MatrixTest, MatrixFunctions ) // Testing add/set/insert array2d Matrix mat7; - mat7.createWithGlobalSize( 4, 4, MPI_COMM_GEOSX ); + mat7.createWithGlobalSize( 4, 4, MPI_COMM_GEOS ); array1d< globalIndex > rows( 2 ); array1d< globalIndex > cols( 2 ); array2d< real64 > vals8( 2, 2 ); @@ -184,8 +184,8 @@ TYPED_TEST_P( MatrixTest, MatrixFunctions ) mat1.close(); // Testing vector multiply, matrix multiply, MatrixMatrixMultiply - vec1.createWithGlobalSize( 2, MPI_COMM_GEOSX ); - vec2.createWithGlobalSize( 2, MPI_COMM_GEOSX ); + vec1.createWithGlobalSize( 2, MPI_COMM_GEOS ); + vec2.createWithGlobalSize( 2, MPI_COMM_GEOS ); vec1.set( 1 ); vec1.close(); globalIndex inds4[2] = { 0, 1 }; @@ -230,7 +230,7 @@ TYPED_TEST_P( MatrixTest, MatrixMatrixOperations ) globalIndex const n = 100; Matrix A; - geos::testing::compute2DLaplaceOperator( MPI_COMM_GEOSX, n, A ); + geos::testing::compute2DLaplaceOperator( MPI_COMM_GEOS, n, A ); Matrix A_squared; A.multiply( A, A_squared ); @@ -246,14 +246,14 @@ TYPED_TEST_P( MatrixTest, RectangularMatrixOperations ) { using Matrix = typename TypeParam::ParallelMatrix; - int const mpiSize = MpiWrapper::commSize( MPI_COMM_GEOSX ); + int const mpiSize = MpiWrapper::commSize( MPI_COMM_GEOS ); // Set a size that allows to run with arbitrary number of processes globalIndex const nRows = std::max( 100, mpiSize ); globalIndex const nCols = 2 * nRows; Matrix A; - A.createWithGlobalSize( nRows, nCols, 2, MPI_COMM_GEOSX ); + A.createWithGlobalSize( nRows, nCols, 2, MPI_COMM_GEOS ); A.open(); for( globalIndex i = A.ilower(); i < A.iupper(); ++i ) diff --git a/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp b/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp index c0eee9a66a3..4ee83088342 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp @@ -34,11 +34,11 @@ void createAndAssemble( localIndex const startSize, VEC & x ) // - startSize on rank 0; // - startSize + 1 on rank 1; // - etc. - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); localIndex const localSize = rank + startSize; globalIndex const rankOffset = rank * ( rank - 1 ) / 2 + rank * startSize; - x.create( localSize, MPI_COMM_GEOSX ); + x.create( localSize, MPI_COMM_GEOS ); arrayView1d< real64 > const values = x.open(); forAll< POLICY >( localSize, [=] GEOS_HOST_DEVICE ( localIndex const i ) { @@ -127,7 +127,7 @@ TYPED_TEST_P( VectorTest, create ) { using Vector = typename TypeParam::ParallelVector; - MPI_Comm const comm = MPI_COMM_GEOSX; + MPI_Comm const comm = MPI_COMM_GEOS; int const rank = MpiWrapper::commRank( comm ); int const nproc = MpiWrapper::commSize( comm ); @@ -179,7 +179,7 @@ TYPED_TEST_P( VectorTest, moveConstruction ) Vector y( std::move( x ) ); EXPECT_TRUE( y.ready() ); - EXPECT_TRUE( MpiWrapper::commCompare( y.comm(), MPI_COMM_GEOSX ) ); + EXPECT_TRUE( MpiWrapper::commCompare( y.comm(), MPI_COMM_GEOS ) ); EXPECT_EQ( y.localSize(), localSize ); EXPECT_EQ( y.globalSize(), globalSize ); compareValues( y.values(), values ); @@ -207,7 +207,7 @@ TYPED_TEST_P( VectorTest, setAllValues ) real64 const value = 1.23; Vector x; - x.create( localSize, MPI_COMM_GEOSX ); + x.create( localSize, MPI_COMM_GEOS ); x.set( value ); arrayView1d< real64 const > const values = x.values(); diff --git a/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp b/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp index a8c29320c28..9c1d67aa20b 100644 --- a/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp @@ -75,7 +75,7 @@ void createPermutationMatrix( NodeManager const & nodeManager, */ localIndex const numLocalRows = nodeManager.getNumberOfLocalIndices() * nDofPerNode; - permutationMatrix.createWithLocalSize( numLocalRows, numLocalRows, 1, MPI_COMM_GEOSX ); + permutationMatrix.createWithLocalSize( numLocalRows, numLocalRows, 1, MPI_COMM_GEOS ); arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey ); arrayView1d< globalIndex const > const & localToGlobal = nodeManager.localToGlobalMap(); @@ -127,7 +127,7 @@ void createPermutationMatrix( ElementRegionManager const & elemManager, numLocalRows += elementSubRegion.getNumberOfLocalIndices() * nDofPerCell; } } ); - permutationMatrix.createWithLocalSize( numLocalRows, numLocalRows, 1, MPI_COMM_GEOSX ); + permutationMatrix.createWithLocalSize( numLocalRows, numLocalRows, 1, MPI_COMM_GEOS ); permutationMatrix.open(); elemManager.forElementSubRegions< ElementSubRegionBase >( [&]( ElementSubRegionBase const & elementSubRegion ) @@ -250,7 +250,7 @@ void computeRigidBodyModes( MeshLevel const & mesh, rigidBodyModes.resize( numRidigBodyModes ); for( localIndex k = 0; k < numComponents; ++k ) { - rigidBodyModes[k].create( numNodes * numComponents, MPI_COMM_GEOSX ); + rigidBodyModes[k].create( numNodes * numComponents, MPI_COMM_GEOS ); arrayView1d< real64 > const values = rigidBodyModes[k].open(); forAll< parallelHostPolicy >( numNodes, [=]( localIndex const i ) { @@ -264,7 +264,7 @@ void computeRigidBodyModes( MeshLevel const & mesh, case 2: { localIndex const k = 2; - rigidBodyModes[k].create( numNodes*numComponents, MPI_COMM_GEOSX ); + rigidBodyModes[k].create( numNodes*numComponents, MPI_COMM_GEOS ); { arrayView1d< real64 > const values = rigidBodyModes[k].open(); forAll< parallelHostPolicy >( numNodes, [=]( localIndex const i ) @@ -285,7 +285,7 @@ void computeRigidBodyModes( MeshLevel const & mesh, case 3: { localIndex k = 3; - rigidBodyModes[k].create( numNodes*numComponents, MPI_COMM_GEOSX ); + rigidBodyModes[k].create( numNodes*numComponents, MPI_COMM_GEOS ); { arrayView1d< real64 > const values = rigidBodyModes[k].open(); forAll< parallelHostPolicy >( numNodes, [=]( localIndex const i ) @@ -303,7 +303,7 @@ void computeRigidBodyModes( MeshLevel const & mesh, rigidBodyModes[k].scale( 1.0 / rigidBodyModes[k].norm2() ); ++k; - rigidBodyModes[k].create( numNodes*numComponents, MPI_COMM_GEOSX ); + rigidBodyModes[k].create( numNodes*numComponents, MPI_COMM_GEOS ); { arrayView1d< real64 > const values = rigidBodyModes[k].open(); forAll< parallelHostPolicy >( numNodes, [=]( localIndex const i ) @@ -321,7 +321,7 @@ void computeRigidBodyModes( MeshLevel const & mesh, rigidBodyModes[k].scale( 1.0 / rigidBodyModes[k].norm2() ); ++k; - rigidBodyModes[k].create( numNodes*numComponents, MPI_COMM_GEOSX ); + rigidBodyModes[k].create( numNodes*numComponents, MPI_COMM_GEOS ); { arrayView1d< real64 > const values = rigidBodyModes[k].open(); forAll< parallelHostPolicy >( numNodes, [=]( localIndex const i ) diff --git a/src/coreComponents/mainInterface/GeosxState.cpp b/src/coreComponents/mainInterface/GeosxState.cpp index 6339221e4b7..ba5c54a1a16 100644 --- a/src/coreComponents/mainInterface/GeosxState.cpp +++ b/src/coreComponents/mainInterface/GeosxState.cpp @@ -166,7 +166,7 @@ void GeosxState::applyInitialConditions() } m_state = State::READY_TO_RUN; - MpiWrapper::barrier( MPI_COMM_GEOSX ); + MpiWrapper::barrier( MPI_COMM_GEOS ); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index bd6852fafaf..90a57dcb56e 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -526,7 +526,7 @@ void ProblemManager::postInputInitialization() if( repartition ) { partition.setPartitions( xpar, ypar, zpar ); - int const mpiSize = MpiWrapper::commSize( MPI_COMM_GEOSX ); + int const mpiSize = MpiWrapper::commSize( MPI_COMM_GEOS ); // Case : Using MPI domain decomposition and partition are not defined (mainly for external mesh readers) if( mpiSize > 1 && xpar == 1 && ypar == 1 && zpar == 1 ) { diff --git a/src/coreComponents/mesh/DomainPartition.cpp b/src/coreComponents/mesh/DomainPartition.cpp index 9016bbd2b5f..381e5d2f1bd 100644 --- a/src/coreComponents/mesh/DomainPartition.cpp +++ b/src/coreComponents/mesh/DomainPartition.cpp @@ -90,10 +90,10 @@ void DomainPartition::setupBaseLevelMeshGlobalInfo() MPI_Comm cartcomm; { int reorder = 0; - MpiWrapper::cartCreate( MPI_COMM_GEOSX, 3, partition.getPartitions().data(), partition.m_Periodic.data(), reorder, &cartcomm ); + MpiWrapper::cartCreate( MPI_COMM_GEOS, 3, partition.getPartitions().data(), partition.m_Periodic.data(), reorder, &cartcomm ); GEOS_ERROR_IF( cartcomm == MPI_COMM_NULL, "Fail to run MPI_Cart_create and establish communications" ); } - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); int nsdof = 3; MpiWrapper::cartCoords( cartcomm, rank, nsdof, partition.m_coords.data() ); @@ -125,7 +125,7 @@ void DomainPartition::setupBaseLevelMeshGlobalInfo() for( std::size_t i = 0; i < m_neighbors.size(); ++i ) { - MpiWrapper::iSend( firstNeighborRanks.toView(), m_neighbors[ i ].neighborRank(), neighborsTag, MPI_COMM_GEOSX, &requests[ i ] ); + MpiWrapper::iSend( firstNeighborRanks.toView(), m_neighbors[ i ].neighborRank(), neighborsTag, MPI_COMM_GEOS, &requests[ i ] ); } // This set will contain the second (neighbor of) neighbors ranks. @@ -134,7 +134,7 @@ void DomainPartition::setupBaseLevelMeshGlobalInfo() array1d< int > neighborOfNeighborRanks; for( std::size_t i = 0; i < m_neighbors.size(); ++i ) { - MpiWrapper::recv( neighborOfNeighborRanks, m_neighbors[ i ].neighborRank(), neighborsTag, MPI_COMM_GEOSX, MPI_STATUS_IGNORE ); + MpiWrapper::recv( neighborOfNeighborRanks, m_neighbors[ i ].neighborRank(), neighborsTag, MPI_COMM_GEOS, MPI_STATUS_IGNORE ); // Insert the neighbors of the current neighbor into the set of second neighbors. secondNeighborRanks.insert( neighborOfNeighborRanks.begin(), neighborOfNeighborRanks.end() ); diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index e4d3e9479c4..2259ae3bb6c 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -63,7 +63,7 @@ void ElementRegionManager::setMaxGlobalIndex() m_localMaxGlobalIndex = std::max( m_localMaxGlobalIndex, subRegion.maxGlobalIndex() ); } ); - m_maxGlobalIndex = MpiWrapper::max( m_localMaxGlobalIndex, MPI_COMM_GEOSX ); + m_maxGlobalIndex = MpiWrapper::max( m_localMaxGlobalIndex, MPI_COMM_GEOS ); } diff --git a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp index e1604631a07..67c8085469a 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp @@ -203,7 +203,7 @@ localIndex EmbeddedSurfaceNodeManager::packNewNodesGlobalMapsImpl( buffer_unit_t // this doesn't link without the string()...no idea why. packedSize += bufferOps::Pack< DO_PACKING >( buffer, string( viewKeyStruct::localToGlobalMapString() ) ); - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); packedSize += bufferOps::Pack< DO_PACKING >( buffer, rank ); localIndex const numPackedIndices = packList.size(); @@ -250,7 +250,7 @@ localIndex EmbeddedSurfaceNodeManager::unpackNewNodesGlobalMaps( buffer_unit_typ unpackedSize += bufferOps::Unpack( buffer, localToGlobalString ); GEOS_ERROR_IF( localToGlobalString != viewKeyStruct::localToGlobalMapString(), "ObjectManagerBase::unpack(): label incorrect" ); - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); int sendingRank; unpackedSize += bufferOps::Unpack( buffer, sendingRank ); diff --git a/src/coreComponents/mesh/ObjectManagerBase.cpp b/src/coreComponents/mesh/ObjectManagerBase.cpp index 8cd4a22441c..bfb00223f7d 100644 --- a/src/coreComponents/mesh/ObjectManagerBase.cpp +++ b/src/coreComponents/mesh/ObjectManagerBase.cpp @@ -240,7 +240,7 @@ localIndex ObjectManagerBase::packImpl( buffer_unit_type * & buffer, localIndex packedSize = 0; packedSize += bufferOps::Pack< DO_PACKING >( buffer, this->getName() ); - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); packedSize += bufferOps::Pack< DO_PACKING >( buffer, rank ); localIndex const numPackedIndices = packList.size(); @@ -523,7 +523,7 @@ localIndex ObjectManagerBase::packGlobalMapsImpl( buffer_unit_type * & buffer, arrayView1d< localIndex const > const & packList, integer const recursive ) const { - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); localIndex packedSize = bufferOps::Pack< DO_PACKING >( buffer, this->getName() ); @@ -585,7 +585,7 @@ localIndex ObjectManagerBase::unpackGlobalMaps( buffer_unit_type const * & buffe integer const recursive ) { GEOS_MARK_FUNCTION; - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); localIndex unpackedSize = 0; string groupName; @@ -858,7 +858,7 @@ void ObjectManagerBase::eraseObject( std::set< localIndex > const & indicesToEra void ObjectManagerBase::setMaxGlobalIndex() { - m_maxGlobalIndex = MpiWrapper::max( m_localMaxGlobalIndex, MPI_COMM_GEOSX ); + m_maxGlobalIndex = MpiWrapper::max( m_localMaxGlobalIndex, MPI_COMM_GEOS ); } void ObjectManagerBase::cleanUpMap( std::set< localIndex > const & targetIndices, diff --git a/src/coreComponents/mesh/ParticleManager.cpp b/src/coreComponents/mesh/ParticleManager.cpp index 6b7aa2c1705..7a168d02168 100644 --- a/src/coreComponents/mesh/ParticleManager.cpp +++ b/src/coreComponents/mesh/ParticleManager.cpp @@ -81,7 +81,7 @@ void ParticleManager::setMaxGlobalIndex() &m_maxGlobalIndex, 1, MPI_MAX, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } Group * ParticleManager::createChild( string const & childKey, string const & childName ) diff --git a/src/coreComponents/mesh/ParticleRegion.cpp b/src/coreComponents/mesh/ParticleRegion.cpp index cd15eba6388..c7c1fac268e 100644 --- a/src/coreComponents/mesh/ParticleRegion.cpp +++ b/src/coreComponents/mesh/ParticleRegion.cpp @@ -49,7 +49,7 @@ void ParticleRegion::generateMesh( Group & particleBlocks ) subRegion.copyFromParticleBlock( source ); // Set the rank of particles on each subregion - int const mpiRank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const mpiRank = MpiWrapper::commRank( MPI_COMM_GEOS ); subRegion.setParticleRank( mpiRank ); // Set the number of vertices of the particles on each subregion diff --git a/src/coreComponents/mesh/ParticleSubRegionBase.cpp b/src/coreComponents/mesh/ParticleSubRegionBase.cpp index 8df97780b93..1e0a5d0b5aa 100644 --- a/src/coreComponents/mesh/ParticleSubRegionBase.cpp +++ b/src/coreComponents/mesh/ParticleSubRegionBase.cpp @@ -155,7 +155,7 @@ void ParticleSubRegionBase::setActiveParticleIndices() forAll< serialPolicy >( this->size(), [&, particleRank] GEOS_HOST ( localIndex const p ) // This must be on host since we're dealing with // a sorted array. Parallelize with atomics? { - if( particleRank[p] == MpiWrapper::commRank( MPI_COMM_GEOSX ) ) + if( particleRank[p] == MpiWrapper::commRank( MPI_COMM_GEOS ) ) { m_activeParticleIndices.insert( p ); } diff --git a/src/coreComponents/mesh/WellElementSubRegion.cpp b/src/coreComponents/mesh/WellElementSubRegion.cpp index 5dd03f5d1c5..4f0f5eb9695 100644 --- a/src/coreComponents/mesh/WellElementSubRegion.cpp +++ b/src/coreComponents/mesh/WellElementSubRegion.cpp @@ -545,7 +545,7 @@ void WellElementSubRegion::checkPartitioningValidity( LineBlockABC const & lineB for( globalIndex iownerRank : rankSetsByStatus[WellElemStatus::LOCAL] ) { - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) != iownerRank ) + if( MpiWrapper::commRank( MPI_COMM_GEOS ) != iownerRank ) { elemStatusGlobal[iwelemGlobal] = WellElemStatus::REMOTE; } @@ -563,7 +563,7 @@ void WellElementSubRegion::checkPartitioningValidity( LineBlockABC const & lineB if( rankCount == 0 ) { // update the elemStatusGlobal array for all ranks - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) != iownerRank ) + if( MpiWrapper::commRank( MPI_COMM_GEOS ) != iownerRank ) { elemStatusGlobal[iwelemGlobal] = WellElemStatus::REMOTE; } @@ -571,7 +571,7 @@ void WellElementSubRegion::checkPartitioningValidity( LineBlockABC const & lineB else // (rankCount > 0) { // remove the duplicate elements - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) == iownerRank ) + if( MpiWrapper::commRank( MPI_COMM_GEOS ) == iownerRank ) { localElems.remove( iwelemGlobal ); } @@ -846,7 +846,7 @@ void WellElementSubRegion::reconstructLocalConnectivity() bool WellElementSubRegion::isLocallyOwned() const { - return m_topRank == MpiWrapper::commRank( MPI_COMM_GEOSX ); + return m_topRank == MpiWrapper::commRank( MPI_COMM_GEOS ); } diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index d8340b7b94b..2069984feec 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -606,7 +606,7 @@ void InternalMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockMa elemCenterCoords[dim].data(), m_numElemsTotal[dim], MPI_MAX, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } // Find starting/ending index diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp index 1fe06c4aebc..ddcae6a3198 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp @@ -82,7 +82,7 @@ void VTKMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockManager // TODO refactor void MeshGeneratorBase::generateMesh( DomainPartition & domain ) GEOS_MARK_FUNCTION; - MPI_Comm const comm = MPI_COMM_GEOSX; + MPI_Comm const comm = MPI_COMM_GEOS; vtkSmartPointer< vtkMultiProcessController > controller = vtk::getController(); vtkMultiProcessController::SetGlobalController( controller ); diff --git a/src/coreComponents/mesh/generators/VTKUtilities.cpp b/src/coreComponents/mesh/generators/VTKUtilities.cpp index 757e9d92518..a2cfae5da17 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.cpp @@ -142,7 +142,7 @@ std::vector< T > collectUniqueValues( std::vector< T > const & data ) { // Exchange the sizes of the data across all ranks. array1d< int > dataSizes( MpiWrapper::commSize() ); - MpiWrapper::allGather( LvArray::integerConversion< int >( data.size() ), dataSizes, MPI_COMM_GEOSX ); + MpiWrapper::allGather( LvArray::integerConversion< int >( data.size() ), dataSizes, MPI_COMM_GEOS ); // `totalDataSize` contains the total data size across all the MPI ranks. int const totalDataSize = std::accumulate( dataSizes.begin(), dataSizes.end(), 0 ); @@ -153,7 +153,7 @@ std::vector< T > collectUniqueValues( std::vector< T > const & data ) // `displacements` is the offset (relative to the receive buffer) to store the data for each rank. std::vector< int > displacements( MpiWrapper::commSize(), 0 ); std::partial_sum( dataSizes.begin(), dataSizes.end() - 1, displacements.begin() + 1 ); - MpiWrapper::allgatherv( data.data(), data.size(), allData.data(), dataSizes.data(), displacements.data(), MPI_COMM_GEOSX ); + MpiWrapper::allgatherv( data.data(), data.size(), allData.data(), dataSizes.data(), displacements.data(), MPI_COMM_GEOS ); // Finalizing by sorting, removing duplicates and trimming the result vector at the proper size. std::sort( allData.begin(), allData.end() ); @@ -404,7 +404,7 @@ vtkSmartPointer< vtkMultiProcessController > getController() { #ifdef GEOS_USE_MPI vtkNew< vtkMPIController > controller; - vtkMPICommunicatorOpaqueComm vtkGeosxComm( &MPI_COMM_GEOSX ); + vtkMPICommunicatorOpaqueComm vtkGeosxComm( &MPI_COMM_GEOS ); vtkNew< vtkMPICommunicator > communicator; communicator->InitializeExternal( &vtkGeosxComm ); controller->SetCommunicator( communicator ); @@ -677,13 +677,13 @@ AllMeshes redistributeByCellGraph( AllMeshes & input, // First for the main 3d mesh... vtkSmartPointer< vtkPartitionedDataSet > const splitMesh = splitMeshByPartition( input.getMainMesh(), numRanks, newPartitions.toViewConst() ); - vtkSmartPointer< vtkUnstructuredGrid > finalMesh = vtk::redistribute( *splitMesh, MPI_COMM_GEOSX ); + vtkSmartPointer< vtkUnstructuredGrid > finalMesh = vtk::redistribute( *splitMesh, MPI_COMM_GEOS ); // ... and then for the fractures. std::map< string, vtkSmartPointer< vtkDataSet > > finalFractures; for( auto const & [fractureName, fracture]: input.getFaceBlocks() ) { vtkSmartPointer< vtkPartitionedDataSet > const splitFracMesh = splitMeshByPartition( fracture, numRanks, newFracturePartitions[fractureName].toViewConst() ); - vtkSmartPointer< vtkUnstructuredGrid > const finalFracMesh = vtk::redistribute( *splitFracMesh, MPI_COMM_GEOSX ); + vtkSmartPointer< vtkUnstructuredGrid > const finalFracMesh = vtk::redistribute( *splitFracMesh, MPI_COMM_GEOS ); finalFractures[fractureName] = finalFracMesh; } @@ -746,7 +746,7 @@ vtkSmartPointer< vtkDataSet > manageGlobalIds( vtkSmartPointer< vtkDataSet > mes // Add global ids on the fly if needed int const me = hasGlobalIds( mesh ); int everyone; - MpiWrapper::allReduce( &me, &everyone, 1, MPI_MAX, MPI_COMM_GEOSX ); + MpiWrapper::allReduce( &me, &everyone, 1, MPI_MAX, MPI_COMM_GEOS ); if( everyone and not me ) { @@ -891,7 +891,7 @@ ensureNoEmptyRank( vtkSmartPointer< vtkDataSet > mesh, "\nWarning! We strongly encourage the use of partitionRefinement > 5 for this number of MPI ranks \n" ); vtkSmartPointer< vtkPartitionedDataSet > const splitMesh = splitMeshByPartition( mesh, numProcs, newParts.toViewConst() ); - return vtk::redistribute( *splitMesh, MPI_COMM_GEOSX ); + return vtk::redistribute( *splitMesh, MPI_COMM_GEOS ); } @@ -2113,8 +2113,8 @@ real64 writeNodes( integer const logLevel, bb.GetMaxPoint( xMax ); } - MpiWrapper::min< real64 >( xMin, xMin, MPI_COMM_GEOSX ); - MpiWrapper::max< real64 >( xMax, xMax, MPI_COMM_GEOSX ); + MpiWrapper::min< real64 >( xMin, xMin, MPI_COMM_GEOS ); + MpiWrapper::max< real64 >( xMax, xMax, MPI_COMM_GEOS ); LvArray::tensorOps::subtract< 3 >( xMax, xMin ); return LvArray::tensorOps::l2Norm< 3 >( xMax ); } diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index 55613fc29a2..2266865df4d 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -458,7 +458,7 @@ void WellGeneratorBase::checkPerforationLocationsValidity() // merge perforations to make sure that no well element is shared between two MPI domains // TODO: instead of merging perforations, split the well elements and do not change the physical location of the // perforation - int const mpiSize = MpiWrapper::commSize( MPI_COMM_GEOSX ); + int const mpiSize = MpiWrapper::commSize( MPI_COMM_GEOS ); if( mpiSize > 1 ) { mergePerforations( elemToPerfMap ); diff --git a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp index 28fb16dcd67..18572879521 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp +++ b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp @@ -139,7 +139,7 @@ void CommunicationTools::assignGlobalIndices( ObjectManagerBase & manager, 1, commData.mpiRecvBufferSizeRequest( neighborIndex ), commData.commID(), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } for( std::size_t count=0; counttempNeighborData.neighborNumbers[DomainPartition::FiniteElementNodeManager] to @@ -271,7 +271,7 @@ void CommunicationTools::assignGlobalIndices( ObjectManagerBase & manager, void CommunicationTools::assignNewGlobalIndices( ObjectManagerBase & manager, std::set< localIndex > const & indexList ) { - globalIndex const glocalIndexOffset = MpiWrapper::prefixSum< globalIndex >( indexList.size(), MPI_COMM_GEOSX ); + globalIndex const glocalIndexOffset = MpiWrapper::prefixSum< globalIndex >( indexList.size(), MPI_COMM_GEOS ); arrayView1d< globalIndex > const & localToGlobal = manager.localToGlobalMap(); @@ -301,7 +301,7 @@ CommunicationTools::assignNewGlobalIndices( ElementRegionManager & elementManage numberOfNewObjectsHere += LvArray::integerConversion< localIndex >( iter.second.size() ); } - globalIndex const glocalIndexOffset = MpiWrapper::prefixSum< globalIndex >( numberOfNewObjectsHere, MPI_COMM_GEOSX ); + globalIndex const glocalIndexOffset = MpiWrapper::prefixSum< globalIndex >( numberOfNewObjectsHere, MPI_COMM_GEOS ); localIndex nIndicesAssigned = 0; for( auto const & iter : newElems ) @@ -353,7 +353,7 @@ array1d< array1d< globalIndex > > exchange( int commId, commData.mpiSendBufferSizeRequest( i ), commData.mpiRecvBufferSizeRequest( i ), commId, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } MpiWrapper::waitAll( numNeighbors, commData.mpiSendBufferSizeRequest(), commData.mpiSendBufferSizeStatus() ); @@ -368,7 +368,7 @@ array1d< array1d< globalIndex > > exchange( int commId, output[i], commData.mpiRecvBufferRequest( i ), commId, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } MpiWrapper::waitAll( numNeighbors, commData.mpiSendBufferRequest(), commData.mpiSendBufferStatus() ); MpiWrapper::waitAll( numNeighbors, commData.mpiRecvBufferRequest(), commData.mpiRecvBufferStatus() ); @@ -680,7 +680,7 @@ void fixReceiveLists( ObjectManagerBase & objectManager, MpiWrapper::iSend( objectManager.getNeighborData( neighborRank ).nonLocalGhosts().toView(), neighborRank, nonLocalGhostsTag, - MPI_COMM_GEOSX, + MPI_COMM_GEOS, &nonLocalGhostsRequests[ i ] ); } @@ -693,7 +693,7 @@ void fixReceiveLists( ObjectManagerBase & objectManager, MpiWrapper::recv( ghostsFromSecondNeighbor, neighborRank, nonLocalGhostsTag, - MPI_COMM_GEOSX, + MPI_COMM_GEOS, MPI_STATUS_IGNORE ); /// Array of ghosts to fix. @@ -942,7 +942,7 @@ void CommunicationTools::synchronizePackSendRecvSizes( FieldIdentifiers const & neighbor.mpiISendReceiveBufferSizes( icomm.commID(), icomm.mpiSendBufferSizeRequest( neighborIndex ), icomm.mpiRecvBufferSizeRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); neighbor.resizeSendBuffer( icomm.commID(), bufferSize ); } @@ -992,7 +992,7 @@ void CommunicationTools::asyncSendRecv( std::vector< NeighborCommunicator > & ne neighbor.mpiISendReceiveBuffers( icomm.commID(), icomm.mpiSendBufferRequest( neighborIndex ), icomm.mpiRecvBufferRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } } diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp index a645d8e6a1b..4a1fcab1464 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp @@ -139,7 +139,7 @@ int NeighborCommunicator::postSizeRecv( int const commID, 1, m_neighborRank, recvTag, - MPI_COMM_GEOSX, + MPI_COMM_GEOS, &mpiRecvSizeRequest ); } @@ -151,7 +151,7 @@ int NeighborCommunicator::postSizeSend( int const commID, 1, m_neighborRank, sendTag, - MPI_COMM_GEOSX, + MPI_COMM_GEOS, &mpiSendSizeRequest ); } @@ -164,7 +164,7 @@ int NeighborCommunicator::postRecv( int const commID, m_receiveBufferSize[commID], m_neighborRank, recvTag, - MPI_COMM_GEOSX, + MPI_COMM_GEOS, &mpRecvRequest ); } @@ -176,7 +176,7 @@ int NeighborCommunicator::postSend( int const commID, m_sendBufferSize[commID], m_neighborRank, sendTag, - MPI_COMM_GEOSX, + MPI_COMM_GEOS, &mpiSendRequest ); } diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp index dc4b021066f..beaabedea68 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp @@ -30,7 +30,7 @@ inline int CommTag( int const GEOS_UNUSED_PARAM( senderRank ), int const comm ) { // int m_size; -// MPI_Comm_size( MPI_COMM_GEOSX, &m_size ); +// MPI_Comm_size( MPI_COMM_GEOS, &m_size ); // return senderRank * m_size + receiverRank + m_size * m_size * comm; return comm; } diff --git a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp index 4d39a84b76c..7ba9a85f6d4 100644 --- a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp +++ b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp @@ -181,7 +181,7 @@ void SpatialPartition::setSizes( real64 const ( &min )[ 3 ], { //get size of problem and decomposition - m_size = MpiWrapper::commSize( MPI_COMM_GEOSX ); + m_size = MpiWrapper::commSize( MPI_COMM_GEOS ); //check to make sure our dimensions agree { @@ -197,7 +197,7 @@ void SpatialPartition::setSizes( real64 const ( &min )[ 3 ], MPI_Comm cartcomm; { int reorder = 0; - MpiWrapper::cartCreate( MPI_COMM_GEOSX, nsdof, m_Partitions.data(), m_Periodic.data(), reorder, &cartcomm ); + MpiWrapper::cartCreate( MPI_COMM_GEOS, nsdof, m_Partitions.data(), m_Periodic.data(), reorder, &cartcomm ); } m_rank = MpiWrapper::commRank( cartcomm ); MpiWrapper::cartCoords( cartcomm, m_rank, nsdof, m_coords.data()); @@ -795,7 +795,7 @@ void SpatialPartition::sendCoordinateListToNeighbors( arrayView1d< R1Tensor > co 1, receiveRequest[n], commData.commID(), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } MPI_Waitall( nn, sendRequest.data(), sendStatus.data()); MPI_Waitall( nn, receiveRequest.data(), receiveStatus.data()); @@ -824,7 +824,7 @@ void SpatialPartition::sendCoordinateListToNeighbors( arrayView1d< R1Tensor > co sizeOfReceived[n], receiveRequest[n], commData.commID(), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } MPI_Waitall( nn, sendRequest.data(), sendStatus.data()); MPI_Waitall( nn, receiveRequest.data(), receiveStatus.data()); @@ -894,7 +894,7 @@ void SpatialPartition::sendListOfIndicesToNeighbors( std::vector< array1d< index 1, receiveRequest[n], commData.commID(), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } MPI_Waitall( nn, sendRequest.data(), sendStatus.data()); MPI_Waitall( nn, receiveRequest.data(), receiveStatus.data()); @@ -923,7 +923,7 @@ void SpatialPartition::sendListOfIndicesToNeighbors( std::vector< array1d< index sizeOfReceived[n], receiveRequest[n], commData.commID(), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } MPI_Waitall( nn, sendRequest.data(), sendStatus.data()); MPI_Waitall( nn, receiveRequest.data(), receiveStatus.data()); @@ -984,7 +984,7 @@ void SpatialPartition::sendParticlesToNeighbor( ParticleSubRegionBase & subRegio 1, receiveRequest[n], commData.commID(), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } MPI_Waitall( nn, sendRequest.data(), sendStatus.data() ); MPI_Waitall( nn, receiveRequest.data(), receiveStatus.data() ); @@ -1012,7 +1012,7 @@ void SpatialPartition::sendParticlesToNeighbor( ParticleSubRegionBase & subRegio sizeOfReceived[n], receiveRequest[n], commData.commID(), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } MPI_Waitall( nn, sendRequest.data(), sendStatus.data()); MPI_Waitall( nn, receiveRequest.data(), receiveStatus.data()); diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index b082c20140f..e970c3a76eb 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -461,7 +461,7 @@ real64 SolverBase::linearImplicitStep( real64 const & time_n, Timer timer_create( m_timers["linear solver create"] ); // Compose parallel LA matrix out of local matrix - m_matrix.create( m_localMatrix.toViewConst(), m_dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + m_matrix.create( m_localMatrix.toViewConst(), m_dofManager.numLocalDofs(), MPI_COMM_GEOS ); } // Output the linear system matrix/rhs for debugging purposes @@ -1001,7 +1001,7 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, // Compose parallel LA matrix/rhs out of local LA matrix/rhs // - m_matrix.create( m_localMatrix.toViewConst(), m_dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + m_matrix.create( m_localMatrix.toViewConst(), m_dofManager.numLocalDofs(), MPI_COMM_GEOS ); } // Output the linear system matrix/rhs for debugging purposes @@ -1097,10 +1097,10 @@ void SolverBase::setupSystem( DomainPartition & domain, localMatrix.setName( this->getName() + "/matrix" ); rhs.setName( this->getName() + "/rhs" ); - rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); solution.setName( this->getName() + "/solution" ); - solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); } void SolverBase::assembleSystem( real64 const GEOS_UNUSED_PARAM( time ), diff --git a/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp b/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp index fe51db4f353..7b12943aaca 100644 --- a/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp @@ -271,7 +271,7 @@ class LinfResidualNormHelper globalResidualNorm.data(), localResidualNorm.size(), MpiWrapper::getMpiOp( MpiWrapper::Reduction::Max ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } }; @@ -313,12 +313,12 @@ class L2ResidualNormHelper sumLocalResidualNorm.data(), localResidualNorm.size(), MpiWrapper::getMpiOp( MpiWrapper::Reduction::Sum ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); MpiWrapper::allReduce( localResidualNormalizer.data(), sumLocalResidualNormalizer.data(), localResidualNormalizer.size(), MpiWrapper::getMpiOp( MpiWrapper::Reduction::Sum ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); for( integer i = 0; i < localResidualNorm.size(); ++i ) { globalResidualNorm[i] = sqrt( sumLocalResidualNorm[i] ) / sqrt( sumLocalResidualNormalizer[i] ); diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index bdf4ce38be4..2cef13dd221 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -179,7 +179,7 @@ void ContactSolverBase::computeFractureStateStatistics( MeshLevel const & mesh, totalCounter.data(), 4, MPI_SUM, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); numStick = totalCounter[0]; numNewSlip = totalCounter[1]; diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp index 0da8a5c9a5a..5d7ba39a73b 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -211,10 +211,10 @@ void SolidMechanicsAugmentedLagrangianContact::setupSystem( DomainPartition & do localMatrix.setName( this->getName() + "/localMatrix" ); rhs.setName( this->getName() + "/rhs" ); - rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); solution.setName( this->getName() + "/solution" ); - solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); } @@ -286,7 +286,7 @@ void SolidMechanicsAugmentedLagrangianContact::assembleSystem( real64 const time localRhs ); //ParallelMatrix parallel_matrix; - //parallel_matrix.create( localMatrix.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + //parallel_matrix.create( localMatrix.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOS ); //parallel_matrix.write("mech.mtx"); //abort(); @@ -466,8 +466,8 @@ real64 SolidMechanicsAugmentedLagrangianContact::calculateResidualNorm( real64 c } ); real64 const localResidualNorm[2] = { localSum.get(), SolidMechanicsLagrangianFEM::getMaxForce() }; - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); - int const numRanks = MpiWrapper::commSize( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); + int const numRanks = MpiWrapper::commSize( MPI_COMM_GEOS ); array1d< real64 > globalValues( numRanks * 2 ); // Everything is done on rank 0 @@ -476,7 +476,7 @@ real64 SolidMechanicsAugmentedLagrangianContact::calculateResidualNorm( real64 c globalValues.data(), 2, 0, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); if( rank==0 ) { @@ -488,7 +488,7 @@ real64 SolidMechanicsAugmentedLagrangianContact::calculateResidualNorm( real64 c } } - MpiWrapper::bcast( globalResidualNorm, 2, 0, MPI_COMM_GEOSX ); + MpiWrapper::bcast( globalResidualNorm, 2, 0, MPI_COMM_GEOS ); } ); real64 const bubbleResidualNorm = sqrt( globalResidualNorm[0] )/(globalResidualNorm[1]+1); // the + 1 is for the first @@ -724,7 +724,7 @@ bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartit &hasConfigurationConvergedGlobally, 1, MPI_LAND, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); return hasConfigurationConvergedGlobally; diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index db31219f1aa..6e1653861c2 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -237,10 +237,10 @@ void SolidMechanicsEmbeddedFractures::setupSystem( DomainPartition & domain, localMatrix.setName( this->getName() + "/localMatrix" ); rhs.setName( this->getName() + "/rhs" ); - rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); solution.setName( this->getName() + "/solution" ); - solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); } else { @@ -588,8 +588,8 @@ real64 SolidMechanicsEmbeddedFractures::calculateFractureResidualNorm( DomainPar real64 const localResidualNorm[2] = { localSum.get(), SolidMechanicsLagrangianFEM::getMaxForce() }; - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); - int const numRanks = MpiWrapper::commSize( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); + int const numRanks = MpiWrapper::commSize( MPI_COMM_GEOS ); array1d< real64 > globalValues( numRanks * 2 ); // Everything is done on rank 0 @@ -598,7 +598,7 @@ real64 SolidMechanicsEmbeddedFractures::calculateFractureResidualNorm( DomainPar globalValues.data(), 2, 0, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); if( rank==0 ) { @@ -610,7 +610,7 @@ real64 SolidMechanicsEmbeddedFractures::calculateFractureResidualNorm( DomainPar } } - MpiWrapper::bcast( globalResidualNorm, 2, 0, MPI_COMM_GEOSX ); + MpiWrapper::bcast( globalResidualNorm, 2, 0, MPI_COMM_GEOS ); } ); real64 const fractureResidualNorm = sqrt( globalResidualNorm[0] )/(globalResidualNorm[1]+1); // the + 1 is for the first @@ -798,7 +798,7 @@ bool SolidMechanicsEmbeddedFractures::updateConfiguration( DomainPartition & dom &hasConfigurationConvergedGlobally, 1, MPI_LAND, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); // for this solver it makes sense to reset the state. // if( !hasConfigurationConvergedGlobally ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index af11dbf16ff..8c8acc2ebcb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -586,12 +586,12 @@ void FlowSolverBase::findMinMaxElevationInEquilibriumTarget( DomainPartition & d maxElevation.data(), localMaxElevation.size(), MpiWrapper::getMpiOp( MpiWrapper::Reduction::Max ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); MpiWrapper::allReduce( localMinElevation.data(), minElevation.data(), localMinElevation.size(), MpiWrapper::getMpiOp( MpiWrapper::Reduction::Min ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } void FlowSolverBase::computeSourceFluxSizeScalingFactor( real64 const & time, @@ -641,7 +641,7 @@ void FlowSolverBase::computeSourceFluxSizeScalingFactor( real64 const & time, bcAllSetsSize.data(), bcAllSetsSize.size(), MpiWrapper::getMpiOp( MpiWrapper::Reduction::Sum ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } void FlowSolverBase::saveAquiferConvergedState( real64 const & time, @@ -725,7 +725,7 @@ void FlowSolverBase::saveAquiferConvergedState( real64 const & time, globalSumFluxes.data(), localSumFluxes.size(), MpiWrapper::getMpiOp( MpiWrapper::Reduction::Sum ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); // Step 3: we are ready to save the summed fluxes for each individual aquifer diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index f73e75e4a0b..b4c23209be8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -446,7 +446,7 @@ real64 ReactiveCompositionalMultiphaseOBL::scalingForSystemSolution( DomainParti } ); } ); - return LvArray::math::max( MpiWrapper::min( scalingFactor, MPI_COMM_GEOSX ), m_minScalingFactor ); + return LvArray::math::max( MpiWrapper::min( scalingFactor, MPI_COMM_GEOS ), m_minScalingFactor ); } bool ReactiveCompositionalMultiphaseOBL::checkSystemSolution( DomainPartition & domain, @@ -494,7 +494,7 @@ bool ReactiveCompositionalMultiphaseOBL::checkSystemSolution( DomainPartition & } ); } ); - return MpiWrapper::min( localCheck, MPI_COMM_GEOSX ); + return MpiWrapper::min( localCheck, MPI_COMM_GEOS ); } void ReactiveCompositionalMultiphaseOBL::applySystemSolution( DofManager const & dofManager, diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index 0a7cefde0ae..405c2d6421e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -169,10 +169,10 @@ class CoupledReservoirAndWellsBase : public CoupledSolver< RESERVOIR_SOLVER, WEL localMatrix.setName( this->getName() + "/localMatrix" ); rhs.setName( this->getName() + "/rhs" ); - rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); solution.setName( this->getName() + "/solution" ); - solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); } /**@}*/ diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 1a450a63c52..5743772a144 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -223,7 +223,7 @@ real64 HydrofractureSolver< POROMECHANICS_SOLVER >::fullyCoupledSolverStep( real &globallyFractured, 1, MPI_MAX, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); if( globallyFractured == 0 ) { @@ -470,10 +470,10 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::setupSystem( DomainPartition & localMatrix.setName( this->getName() + "/matrix" ); rhs.setName( this->getName() + "/rhs" ); - rhs.create( numLocalRows, MPI_COMM_GEOSX ); + rhs.create( numLocalRows, MPI_COMM_GEOS ); solution.setName( this->getName() + "/solution" ); - solution.create( numLocalRows, MPI_COMM_GEOSX ); + solution.create( numLocalRows, MPI_COMM_GEOS ); setUpDflux_dApertureMatrix( domain, dofManager, localMatrix ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index 77eb3415787..9030f995508 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -600,7 +600,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER virtual void validateNonlinearAcceleration() override { - if( MpiWrapper::commSize( MPI_COMM_GEOSX ) > 1 ) + if( MpiWrapper::commSize( MPI_COMM_GEOS ) > 1 ) { GEOS_ERROR( "Nonlinear acceleration is not implemented for MPI runs" ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 7c495e62787..abd76e855ad 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -123,10 +123,10 @@ void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::setupSystem( Do localMatrix.assimilate< parallelDevicePolicy<> >( std::move( pattern ) ); rhs.setName( this->getName() + "/rhs" ); - rhs.create( numLocalRows, MPI_COMM_GEOSX ); + rhs.create( numLocalRows, MPI_COMM_GEOS ); solution.setName( this->getName() + "/solution" ); - solution.create( numLocalRows, MPI_COMM_GEOSX ); + solution.create( numLocalRows, MPI_COMM_GEOS ); setUpDflux_dApertureMatrix( domain, dofManager, localMatrix ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 31ee97bdae4..deb60634c18 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -169,10 +169,10 @@ void SinglePhasePoromechanicsEmbeddedFractures::setupSystem( DomainPartition & d localMatrix.assimilate< parallelDevicePolicy<> >( std::move( pattern ) ); rhs.setName( this->getName() + "/rhs" ); - rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); solution.setName( this->getName() + "/solution" ); - solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); } void SinglePhasePoromechanicsEmbeddedFractures::addCouplingNumNonzeros( DomainPartition & domain, diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp index 76075fa4591..a0098010c18 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp @@ -520,8 +520,8 @@ PhaseFieldDamageFEM::calculateResidualNorm( real64 const & GEOS_UNUSED_PARAM( ti // globalResidualNorm[1]: max of max force of each rank. Basically max force globally real64 globalResidualNorm[2] = {0, 0}; - const int rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); - const int size = MpiWrapper::commSize( MPI_COMM_GEOSX ); + const int rank = MpiWrapper::commRank( MPI_COMM_GEOS ); + const int size = MpiWrapper::commSize( MPI_COMM_GEOS ); array1d< real64 > globalValues( size * 2 ); // Everything is done on rank 0 @@ -530,7 +530,7 @@ PhaseFieldDamageFEM::calculateResidualNorm( real64 const & GEOS_UNUSED_PARAM( ti globalValues.data(), 2, 0, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); if( rank==0 ) { @@ -542,7 +542,7 @@ PhaseFieldDamageFEM::calculateResidualNorm( real64 const & GEOS_UNUSED_PARAM( ti } } - MpiWrapper::bcast( globalResidualNorm, 2, 0, MPI_COMM_GEOSX ); + MpiWrapper::bcast( globalResidualNorm, 2, 0, MPI_COMM_GEOS ); const real64 residual = sqrt( globalResidualNorm[0] ) / ( globalResidualNorm[1] ); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 8d10d11a3f5..23477cbf51c 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -507,7 +507,7 @@ real64 SolidMechanicsLagrangianFEM::solverStep( real64 const & time_n, &globallyFractured, 1, MPI_MAX, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } if( globallyFractured == 0 ) { @@ -718,7 +718,7 @@ void SolidMechanicsLagrangianFEM::applyDisplacementBCImplicit( real64 const time 3, MpiWrapper::getMpiOp( MpiWrapper::Reduction::Max ), 0, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); if( MpiWrapper::commRank() == 0 ) { @@ -1241,8 +1241,8 @@ SolidMechanicsLagrangianFEM:: // globalResidualNorm[1]: max of max force of each rank. Basically max force globally real64 globalResidualNorm[2] = {0, 0}; - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); - int const size = MpiWrapper::commSize( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); + int const size = MpiWrapper::commSize( MPI_COMM_GEOS ); array1d< real64 > globalValues( size * 2 ); // Everything is done on rank 0 @@ -1251,7 +1251,7 @@ SolidMechanicsLagrangianFEM:: globalValues.data(), 2, 0, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); if( rank==0 ) { @@ -1263,7 +1263,7 @@ SolidMechanicsLagrangianFEM:: } } - MpiWrapper::bcast( globalResidualNorm, 2, 0, MPI_COMM_GEOSX ); + MpiWrapper::bcast( globalResidualNorm, 2, 0, MPI_COMM_GEOS ); real64 const residual = sqrt( globalResidualNorm[0] ) / ( globalResidualNorm[1] + 1 ); // the + 1 is for the first diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp index 13d29a203e1..08640b56332 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp @@ -561,7 +561,7 @@ void SolidMechanicsMPM::initialize( NodeManager & nodeManager, // Read and distribute BC table if( m_prescribedBcTable == 1 ) { - int rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int rank = MpiWrapper::commRank( MPI_COMM_GEOS ); int BCTableSize; std::vector< double > BCTable1D; // Need 1D version of BC table for MPI broadcast @@ -576,12 +576,12 @@ void SolidMechanicsMPM::initialize( NodeManager & nodeManager, BCTableSize = BCTable1D.size(); } - MPI_Bcast( &BCTableSize, 1, MPI_INT, 0, MPI_COMM_GEOSX ); // Broadcast the size of BCTable1D to other processes + MPI_Bcast( &BCTableSize, 1, MPI_INT, 0, MPI_COMM_GEOS ); // Broadcast the size of BCTable1D to other processes if( rank != 0 ) // All processes except for root resize their versions of BCTable1D { BCTable1D.resize( BCTableSize ); } - MPI_Bcast( BCTable1D.data(), BCTableSize, MPI_DOUBLE, 0, MPI_COMM_GEOSX ); // Broadcast BCTable1D to other processes + MPI_Bcast( BCTable1D.data(), BCTableSize, MPI_DOUBLE, 0, MPI_COMM_GEOS ); // Broadcast BCTable1D to other processes // Technically don't need to reshape BCTable1D into a 2D array, but it makes things more readable and should have little runtime penalty m_bcTable.resize( BCTableSize / 7, 7 ); // Initialize size of m_BCTable @@ -599,7 +599,7 @@ void SolidMechanicsMPM::initialize( NodeManager & nodeManager, if( m_prescribedBoundaryFTable == 1 ) { - int rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int rank = MpiWrapper::commRank( MPI_COMM_GEOS ); int FTableSize; std::vector< double > FTable1D; // Need 1D version of F table for MPI broadcast @@ -617,12 +617,12 @@ void SolidMechanicsMPM::initialize( NodeManager & nodeManager, FTableSize = FTable1D.size(); } - MPI_Bcast( &FTableSize, 1, MPI_INT, 0, MPI_COMM_GEOSX ); // Broadcast the size of FTable1D to other processes + MPI_Bcast( &FTableSize, 1, MPI_INT, 0, MPI_COMM_GEOS ); // Broadcast the size of FTable1D to other processes if( rank != 0 ) // All processes except for root resize their versions of FTable1D { FTable1D.resize( FTableSize ); } - MPI_Bcast( FTable1D.data(), FTableSize, MPI_DOUBLE, 0, MPI_COMM_GEOSX ); // Broadcast FTable1D to other processes + MPI_Bcast( FTable1D.data(), FTableSize, MPI_DOUBLE, 0, MPI_COMM_GEOS ); // Broadcast FTable1D to other processes // Techinically don't need to reshape FTable1D into a 2D array, but it makes things more readable and should have little runtime penalty m_fTable.resize( FTableSize / 4, 4 ); // Initialize size of m_fTable @@ -757,7 +757,7 @@ void SolidMechanicsMPM::initialize( NodeManager & nodeManager, } // Initialize reaction force history file and write its header - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) == 0 && m_reactionHistory == 1 ) + if( MpiWrapper::commRank( MPI_COMM_GEOS ) == 0 && m_reactionHistory == 1 ) { std::ofstream file; file.open( "reactionHistory.csv", std::ios::out | std::ios::app ); @@ -827,7 +827,7 @@ void SolidMechanicsMPM::initialize( NodeManager & nodeManager, 1, MPI_DOUBLE, MPI_MIN, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); m_smallMass = fmin( globalMinMass * 1.0e-12, m_smallMass ); // Initialize deformation gradient and velocity gradient @@ -854,7 +854,7 @@ void SolidMechanicsMPM::initialize( NodeManager & nodeManager, } ); if( m_boxAverageHistory == 1 ) { - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) == 0 ) + if( MpiWrapper::commRank( MPI_COMM_GEOS ) == 0 ) { std::ofstream file; file.open( "boxAverageHistory.csv", std::ios::out | std::ios::app ); @@ -865,7 +865,7 @@ void SolidMechanicsMPM::initialize( NodeManager & nodeManager, file.exceptions( file.exceptions() | std::ios::failbit | std::ifstream::badbit ); file << "Time, Sxx, Syy, Szz, Sxy, Syz, Sxz, Density, Damage" << std::endl; } - MpiWrapper::barrier( MPI_COMM_GEOSX ); // wait for the header to be written + MpiWrapper::barrier( MPI_COMM_GEOS ); // wait for the header to be written computeAndWriteBoxAverage( 0.0, 0.0, particleManager ); } @@ -888,7 +888,7 @@ void SolidMechanicsMPM::initialize( NodeManager & nodeManager, 1, MPI_INT, MPI_MAX, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); // Number of contact groups m_numContactGroups = maxGlobalGroupNumber + 1; @@ -973,9 +973,9 @@ real64 SolidMechanicsMPM::explicitStep( real64 const & time_n, //####################################################################################### - solverProfilingIf( "Perform particle ghosting", MpiWrapper::commSize( MPI_COMM_GEOSX ) > 1 && m_needsNeighborList == 1 ); + solverProfilingIf( "Perform particle ghosting", MpiWrapper::commSize( MPI_COMM_GEOS ) > 1 && m_needsNeighborList == 1 ); //####################################################################################### - if( MpiWrapper::commSize( MPI_COMM_GEOSX ) > 1 && m_needsNeighborList == 1 ) + if( MpiWrapper::commSize( MPI_COMM_GEOS ) > 1 && m_needsNeighborList == 1 ) { // Move everything into host memory space particleManager.forParticleSubRegions( [&]( ParticleSubRegion & subRegion ) @@ -1204,9 +1204,9 @@ real64 SolidMechanicsMPM::explicitStep( real64 const & time_n, //####################################################################################### - solverProfilingIf( "Particle repartitioning", MpiWrapper::commSize( MPI_COMM_GEOSX ) > 1 ); + solverProfilingIf( "Particle repartitioning", MpiWrapper::commSize( MPI_COMM_GEOS ) > 1 ); //####################################################################################### - if( MpiWrapper::commSize( MPI_COMM_GEOSX ) > 1 ) + if( MpiWrapper::commSize( MPI_COMM_GEOS ) > 1 ) { particleManager.forParticleSubRegions( [&]( ParticleSubRegion & subRegion ) { @@ -1465,7 +1465,7 @@ void SolidMechanicsMPM::applyEssentialBCs( const real64 dt, 1, MPI_DOUBLE, MPI_SUM, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } // Get end-of-step domain dimensions - note that m_domainExtent is updated later @@ -1475,7 +1475,7 @@ void SolidMechanicsMPM::applyEssentialBCs( const real64 dt, height = m_domainExtent[2] * (1.0 + m_domainL[2] * dt); // Write global reactions to file - if( MpiWrapper::commRank( MPI_COMM_GEOSX ) == 0 && m_reactionHistory == 1 ) + if( MpiWrapper::commRank( MPI_COMM_GEOS ) == 0 && m_reactionHistory == 1 ) { std::ofstream file; // can't enable exception now because of gcc bug that raises ios_base::failure with useless message @@ -1951,7 +1951,7 @@ void SolidMechanicsMPM::solverProfiling( std::string label ) { if( m_solverProfiling >= 1 ) { - MPI_Barrier( MPI_COMM_GEOSX ); + MPI_Barrier( MPI_COMM_GEOS ); GEOS_LOG_RANK_IF( m_solverProfiling == 2, label ); m_profilingTimes.push_back( MPI_Wtime() ); m_profilingLabels.push_back( label ); @@ -2195,13 +2195,13 @@ void SolidMechanicsMPM::optimizeBinSort( ParticleManager & particleManager ) 1, MPI_DOUBLE, MPI_SUM, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); MPI_Allreduce( &localNumberOfParticles, &globalNumberOfParticles, 1, MPI_INT, MPI_SUM, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); // Set bin size multiplier m_binSizeMultiplier = std::max( (int) std::round( globalWeightedMultiplier / globalNumberOfParticles ), 1 ); @@ -2754,12 +2754,12 @@ void SolidMechanicsMPM::computeAndWriteBoxAverage( const real64 dt, 1, MPI_DOUBLE, MPI_SUM, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); boxSums[i] = globalSum; } int rank; - MPI_Comm_rank( MPI_COMM_GEOSX, &rank ); + MPI_Comm_rank( MPI_COMM_GEOS, &rank ); if( rank == 0 ) { // Calculate the box volume @@ -3303,7 +3303,7 @@ void SolidMechanicsMPM::deleteBadParticles( ParticleManager & particleManager ) void SolidMechanicsMPM::printProfilingResults() { // Use MPI reduction to get the average elapsed time for each step on all partitions - int rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int rank = MpiWrapper::commRank( MPI_COMM_GEOS ); unsigned int numIntervals = m_profilingTimes.size() - 1; std::vector< real64 > timeIntervalsAllRanks( numIntervals ); @@ -3314,7 +3314,7 @@ void SolidMechanicsMPM::printProfilingResults() &totalStepTimeAllRanks, 1, MPI_SUM, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); // Get total CPU times for each queried time interval for( unsigned int i = 0; i < numIntervals; i++ ) @@ -3325,7 +3325,7 @@ void SolidMechanicsMPM::printProfilingResults() &timeIntervalAllRanks, 1, MPI_SUM, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); if( rank == 0 ) { timeIntervalsAllRanks[i] = timeIntervalAllRanks; @@ -3333,7 +3333,7 @@ void SolidMechanicsMPM::printProfilingResults() } // Print out solver profiling - MPI_Barrier( MPI_COMM_GEOSX ); + MPI_Barrier( MPI_COMM_GEOS ); if( rank == 0 ) { std::cout << "---------------------------------------------" << std::endl; diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp index 3c1de5dc61a..ebcf06f5b0c 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp @@ -144,13 +144,13 @@ void SolidMechanicsStatistics::computeNodeStatistics( MeshLevel & mesh, real64 c nodeStatistics.maxDisplacement.data(), 3, MpiWrapper::getMpiOp( MpiWrapper::Reduction::Max ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); MpiWrapper::allReduce( nodeStatistics.minDisplacement.data(), nodeStatistics.minDisplacement.data(), 3, MpiWrapper::getMpiOp( MpiWrapper::Reduction::Min ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{} (time {} s): Min displacement (X, Y, Z): {}, {}, {} m", getName(), time, nodeStatistics.minDisplacement[0], diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp index 1406f2db933..c82afa916c3 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp @@ -338,8 +338,8 @@ void EmbeddedSurfaceGenerator::setGlobalIndices( ElementRegionManager & elemMana EmbeddedSurfaceSubRegion & embeddedSurfaceSubRegion ) { // Add new globalIndices - int const thisRank = MpiWrapper::commRank( MPI_COMM_GEOSX ); - int const commSize = MpiWrapper::commSize( MPI_COMM_GEOSX ); + int const thisRank = MpiWrapper::commRank( MPI_COMM_GEOS ); + int const commSize = MpiWrapper::commSize( MPI_COMM_GEOS ); localIndex_array numberOfSurfaceElemsPerRank( commSize ); localIndex_array globalIndexOffset( commSize ); diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp index a22cb5ca657..e382fd1495e 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp @@ -397,7 +397,7 @@ void synchronizeNewNodes( MeshLevel & mesh, neighbor.mpiISendReceiveBufferSizes( commData.commID(), commData.mpiSendBufferSizeRequest( neighborIndex ), commData.mpiRecvBufferSizeRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } @@ -414,7 +414,7 @@ void synchronizeNewNodes( MeshLevel & mesh, neighbor.mpiISendReceiveBuffers( commData.commID(), commData.mpiSendBufferRequest( neighborIndex ), commData.mpiRecvBufferRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } @@ -472,7 +472,7 @@ void synchronizeNewSurfaces( MeshLevel & mesh, neighbor.mpiISendReceiveBufferSizes( commData.commID(), commData.mpiSendBufferSizeRequest( neighborIndex ), commData.mpiRecvBufferSizeRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } @@ -489,7 +489,7 @@ void synchronizeNewSurfaces( MeshLevel & mesh, neighbor.mpiISendReceiveBuffers( commData.commID(), commData.mpiSendBufferRequest( neighborIndex ), commData.mpiRecvBufferRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } @@ -543,7 +543,7 @@ void synchronizeFracturedElements( MeshLevel & mesh, neighbor.mpiISendReceiveBufferSizes( commData.commID(), commData.mpiSendBufferSizeRequest( neighborIndex ), commData.mpiRecvBufferSizeRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } @@ -560,7 +560,7 @@ void synchronizeFracturedElements( MeshLevel & mesh, neighbor.mpiISendReceiveBuffers( commData.commID(), commData.mpiSendBufferRequest( neighborIndex ), commData.mpiRecvBufferRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp index 70756adb587..22c2c3e792a 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp @@ -827,7 +827,7 @@ void parallelTopologyChange::synchronizeTopologyChange( MeshLevel * const mesh, neighbor.mpiISendReceiveBufferSizes( commData.commID(), commData.mpiSendBufferSizeRequest( neighborIndex ), commData.mpiRecvBufferSizeRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } @@ -845,7 +845,7 @@ void parallelTopologyChange::synchronizeTopologyChange( MeshLevel * const mesh, neighbor.mpiISendReceiveBuffers( commData.commID(), commData.mpiSendBufferRequest( neighborIndex ), commData.mpiRecvBufferRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } // unpack the buffers and get lists of the new objects. @@ -919,7 +919,7 @@ void parallelTopologyChange::synchronizeTopologyChange( MeshLevel * const mesh, neighbor.mpiISendReceiveBufferSizes( commData2.commID(), commData2.mpiSendBufferSizeRequest( neighborIndex ), commData2.mpiRecvBufferSizeRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } @@ -936,7 +936,7 @@ void parallelTopologyChange::synchronizeTopologyChange( MeshLevel * const mesh, neighbor.mpiISendReceiveBuffers( commData2.commID(), commData2.mpiSendBufferRequest( neighborIndex ), commData2.mpiRecvBufferRequest( neighborIndex ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); } diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index 45e37634fe4..839c31a7a48 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -4568,7 +4568,7 @@ SurfaceGenerator::calculateRuptureRate( SurfaceElementRegion & faceElementRegion &globalMaxRuptureRate, 1, MPI_MAX, - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); return globalMaxRuptureRate; } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 7243647cb26..0d5c2a7a354 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -770,7 +770,7 @@ real64 AcousticWaveEquationSEM::explicitStepForward( real64 const & time_n, { if( !m_lifo ) { - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); std::string lifoPrefix = GEOS_FMT( "lifo/rank_{:05}/pdt2_shot{:06}", rank, m_shotIndex ); m_lifo = std::make_unique< LifoStorage< real32, localIndex > >( lifoPrefix, p_dt2, m_lifoOnDevice, m_lifoOnHost, m_lifoSize ); } @@ -792,7 +792,7 @@ real64 AcousticWaveEquationSEM::explicitStepForward( real64 const & time_n, { GEOS_MARK_SCOPE ( DirectWrite ); p_dt2.move( MemorySpace::host, false ); - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); std::string fileName = GEOS_FMT( "lifo/rank_{:05}/pressuredt2_{:06}_{:08}.dat", rank, m_shotIndex, cycleNumber ); int lastDirSeparator = fileName.find_last_of( "/\\" ); std::string dirName = fileName.substr( 0, lastDirSeparator ); @@ -861,7 +861,7 @@ real64 AcousticWaveEquationSEM::explicitStepBackward( real64 const & time_n, { GEOS_MARK_SCOPE ( DirectRead ); - int const rank = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); std::string fileName = GEOS_FMT( "lifo/rank_{:05}/pressuredt2_{:06}_{:08}.dat", rank, m_shotIndex, cycleNumber ); std::ifstream wf( fileName, std::ios::in | std::ios::binary ); GEOS_THROW_IF( !wf, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 1da70c10a3b..6a2d0d0d7d4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -849,7 +849,7 @@ void ElasticWaveEquationSEM::cleanup( real64 const time_n, dasReceivers.data(), m_linearDASGeometry.size( 0 ), MpiWrapper::getMpiOp( MpiWrapper::Reduction::Sum ), - MPI_COMM_GEOSX ); + MPI_COMM_GEOS ); WaveSolverUtils::writeSeismoTrace( "dasTraceReceiver", getName(), m_outputSeismoTrace, m_linearDASGeometry.size( 0 ), m_receiverIsLocal, m_nsamplesSeismoTrace, dasReceivers ); } diff --git a/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp b/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp index f9c43b2748d..7b28a1973f5 100644 --- a/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp +++ b/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp @@ -25,7 +25,7 @@ using namespace geos; TEST( testHDFIO, HDFFile ) { GEOS_MARK_FUNCTION; - HDFFile file( "empty", true, false, MPI_COMM_GEOSX ); + HDFFile file( "empty", true, false, MPI_COMM_GEOS ); hid_t file_id = H5Fcreate( "empty", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT ); H5Fclose( file_id ); } diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp index 1cb32b3a79b..595420857a2 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp @@ -65,7 +65,7 @@ void setupProblemFromXML( ProblemManager & problemManager, char const * const xm GEOS_LOG_RANK_0( "Error offset: " << xmlResult.offset ); } - int mpiSize = MpiWrapper::commSize( MPI_COMM_GEOSX ); + int mpiSize = MpiWrapper::commSize( MPI_COMM_GEOS ); dataRepository::Group & commandLine = problemManager.getGroup< dataRepository::Group >( problemManager.groupKeys.commandLine ); diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp index 1d4cc06ffd0..115e6ef2d2a 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp @@ -62,7 +62,7 @@ void setupProblemFromXML( ProblemManager & problemManager, char const * const xm GEOS_LOG_RANK_0( "Error offset: " << xmlResult.offset ); } - int mpiSize = MpiWrapper::commSize( MPI_COMM_GEOSX ); + int mpiSize = MpiWrapper::commSize( MPI_COMM_GEOS ); dataRepository::Group & commandLine = problemManager.getGroup< dataRepository::Group >( problemManager.groupKeys.commandLine ); diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp b/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp index d0a6deb12ac..0e5d60d5f49 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp @@ -588,7 +588,7 @@ void DofManagerSparsityTest< LAI >::test( std::vector< FieldDesc > fields, dofManager.setSparsityPattern( localPattern ); CRSMatrix< real64, globalIndex > localMatrix; localMatrix.assimilate< parallelHostPolicy >( std::move( localPattern ) ); - pattern.create( localMatrix.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + pattern.create( localMatrix.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOS ); pattern.set( 1.0 ); } @@ -626,7 +626,7 @@ void DofManagerSparsityTest< LAI >::test( std::vector< FieldDesc > fields, f2.components, localPatternExpected ); } - patternExpected.create( localPatternExpected.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + patternExpected.create( localPatternExpected.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOS ); // Compare the sparsity patterns pattern.set( 1.0 ); @@ -873,7 +873,7 @@ void DofManagerRestrictorTest< LAI >::test( std::vector< FieldDesc > fields, dofManager.setSparsityPattern( localPattern ); CRSMatrix< real64, globalIndex > localMatrix; localMatrix.assimilate< parallelHostPolicy >( std::move( localPattern ) ); - A.create( localMatrix.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + A.create( localMatrix.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOS ); A.set( 1.0 ); } @@ -925,7 +925,7 @@ void DofManagerRestrictorTest< LAI >::test( std::vector< FieldDesc > fields, dofManager.setSparsityPattern( localPattern ); CRSMatrix< real64, globalIndex > localMatrix; localMatrix.assimilate< parallelHostPolicy >( std::move( localPattern ) ); - B.create( localMatrix.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + B.create( localMatrix.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOS ); B.set( 1.0 ); } diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp b/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp index 81432c7dc07..8183cd11111 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp @@ -47,7 +47,7 @@ void setupProblemFromXML( ProblemManager * const problemManager, char const * co GEOS_LOG_RANK_0( "Error offset: " << xmlResult.offset ); } - int mpiSize = MpiWrapper::commSize( MPI_COMM_GEOSX ); + int mpiSize = MpiWrapper::commSize( MPI_COMM_GEOS ); dataRepository::Group & commandLine = problemManager->getGroup< dataRepository::Group >( problemManager->groupKeys.commandLine ); commandLine.registerWrapper< integer >( problemManager->viewKeys.xPartitionsOverride.key() ). diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp b/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp index a6f4dbe0364..38a1d84de3b 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp @@ -116,7 +116,7 @@ TYPED_TEST_P( LAIHelperFunctionsTest, nodalVectorPermutation ) dofManager.reorderByRank(); Vector nodalVariable; - nodalVariable.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + nodalVariable.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); globalIndex const rankOffset = dofManager.rankOffset(); arrayView1d< real64 > const nodalVariableView = nodalVariable.open(); @@ -167,7 +167,7 @@ TYPED_TEST_P( LAIHelperFunctionsTest, cellCenteredVectorPermutation ) dofManager.reorderByRank(); Vector cellCenteredVariable; - cellCenteredVariable.create( dofManager.numLocalDofs(), MPI_COMM_GEOSX ); + cellCenteredVariable.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); globalIndex const rankOffset = dofManager.rankOffset(); arrayView1d< real64 > const cellCenteredVariableView = cellCenteredVariable.open(); diff --git a/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp b/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp index 55997a55102..3302fd488ab 100644 --- a/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp +++ b/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp @@ -85,7 +85,7 @@ TEST( TestNeighborComms, testMPICommunication_fromPinnedSetOnDevice ) { SKIP_TEST_IN_SERIAL( "Parallel test" ); { - int rnk = MpiWrapper::commRank( MPI_COMM_GEOSX ); + int rnk = MpiWrapper::commRank( MPI_COMM_GEOS ); constexpr localIndex size = 1000; constexpr localIndex byte_size = 1000 * sizeof(int); @@ -104,11 +104,11 @@ TEST( TestNeighborComms, testMPICommunication_fromPinnedSetOnDevice ) veloc.move( parallelDeviceMemorySpace ); auto veloc_view = veloc.toViewConst(); pack( buf, veloc_view, size ); - MpiWrapper::iSend( buf, byte_size, 1, 0, MPI_COMM_GEOSX, &request ); + MpiWrapper::iSend( buf, byte_size, 1, 0, MPI_COMM_GEOS, &request ); } else { - int err = MpiWrapper::iRecv( buf, byte_size, 0, 0, MPI_COMM_GEOSX, &request ); + int err = MpiWrapper::iRecv( buf, byte_size, 0, 0, MPI_COMM_GEOS, &request ); EXPECT_EQ( err, MPI_SUCCESS ); MPI_Status status; err = MpiWrapper::Wait( &request, &status ); From 41b10186ebc34c7d67237c85d93757b05d9edc7a Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Fri, 2 Aug 2024 22:21:56 +0100 Subject: [PATCH 150/286] chore: Update hypre (#3261) --- .devcontainer/devcontainer.json | 2 +- .github/workflows/ci_tests.yml | 22 ------------------- src/coreComponents/LvArray | 2 +- .../interfaces/hypre/HypreMatrix.cpp | 4 +++- 4 files changed, 5 insertions(+), 25 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 0709f76979f..d40722ebd77 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "275-480" + "GEOS_TPL_TAG": "278-500" } }, "runArgs": [ diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 3dbd60a303f..4d860f4c80c 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -177,14 +177,6 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF - - name: Sherlock CPU (centos 7.9.2009, gcc 10.1.0, open-mpi 4.1.2, openblas 0.3.10) - CMAKE_BUILD_TYPE: Release - DOCKER_REPOSITORY: geosx/sherlock-gcc10.1.0-openmpi4.1.2-openblas0.3.10-zlib1.2.11 - ENABLE_HYPRE: ON - ENABLE_TRILINOS: OFF - GCP_BUCKET: geosx/Sherlock-CPU - HOST_CONFIG: host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10.cmake - uses: ./.github/workflows/build_and_test.yml with: CMAKE_BUILD_TYPE: ${{ matrix.CMAKE_BUILD_TYPE }} @@ -323,20 +315,6 @@ jobs: # DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" # Below this line, jobs that deploy to Google Cloud. - - name: Sherlock GPU (centos 7.9.2009, gcc 10.1.0, open-mpi 4.1.2, openblas 0.3.10, cuda 11.7.1,) - BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" - CMAKE_BUILD_TYPE: Release - DOCKER_REPOSITORY: geosx/sherlock-gcc10.1.0-openmpi4.1.2-cuda11.7.1-openblas0.3.10-zlib1.2.11 - ENABLE_HYPRE_DEVICE: CUDA - ENABLE_HYPRE: ON - ENABLE_TRILINOS: OFF - GCP_BUCKET: geosx/Sherlock-GPU - HOST_CONFIG: host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10-cuda11.7.1-sm70.cmake - RUNS_ON: streak2 - NPROC: 8 - DOCKER_RUN_ARGS: "--cpus=8 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" - DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" - DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" uses: ./.github/workflows/build_and_test.yml with: diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index e7bf1096d57..02ce362c009 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit e7bf1096d57558be720f177141c40e4ab69b3f5e +Subproject commit 02ce362c009f11ddb2ade0286df23408d7334c4f diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp index f6607a1d76a..5791fe129cd 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp @@ -1053,8 +1053,10 @@ void HypreMatrix::getRowCopy( globalIndex const globalRowIndex, -1, &numEntries, &row, + nullptr, hypre::toHypreBigInt( colIndices ), - values ) ); + values, + 0 ) ); } void HypreMatrix::extractDiagonal( HypreVector & dst ) const From b31d792bbf70f9859c44fd6e2c95558d2832c2d3 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Sat, 3 Aug 2024 17:58:36 -1000 Subject: [PATCH 151/286] fix: Fix segfault in table (#3268) * change a range based loop that modifies the ranged container to a standard iterator loop. Isolate busted range bound in std::vector usage --- src/coreComponents/LvArray | 2 +- src/coreComponents/fileIO/Table/TableFormatter.cpp | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 02ce362c009..e7bf1096d57 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 02ce362c009f11ddb2ade0286df23408d7334c4f +Subproject commit e7bf1096d57558be720f177141c40e4ab69b3f5e diff --git a/src/coreComponents/fileIO/Table/TableFormatter.cpp b/src/coreComponents/fileIO/Table/TableFormatter.cpp index 8d564e83ce5..d6e145b6a9c 100644 --- a/src/coreComponents/fileIO/Table/TableFormatter.cpp +++ b/src/coreComponents/fileIO/Table/TableFormatter.cpp @@ -103,17 +103,21 @@ void formatColumnsFromLayout( std::vector< TableLayout::Column > & columns, std::vector< std::vector< string > > & tableDataRows ) { integer idxColumn = 0; - for( auto & column : columns ) + for( auto iterColumn = columns.begin(); iterColumn!=columns.end(); ) { - if( !column.m_parameter.enabled ) + if( !iterColumn->m_parameter.enabled ) { - columns.erase( columns.begin() + idxColumn ); + iterColumn = columns.erase( iterColumn ); for( auto & row : tableDataRows ) { row.erase( row.begin() + idxColumn ); } } - ++idxColumn; + else + { + ++iterColumn; + ++idxColumn; + } } } @@ -377,7 +381,7 @@ void TableTextFormatter::outputSectionRows( std::vector< TableLayout::Column > c auto const & columnContent = section == TableLayout::Section::header ? columns[idxColumn].m_parameter.splitColumnNameLines : columns[idxColumn].m_columnValues; - string cell = columnContent[idxRow]; + string cell = columnContent.at( idxRow ); integer const cellSize = currentColumn.m_maxStringSize.length(); tableOutput << buildCell( currentColumn.m_parameter.alignment, cell, cellSize ); From 23acc39e9cd6bcb1593c5828750ea8390b82bdb4 Mon Sep 17 00:00:00 2001 From: Stefano Frambati Date: Mon, 5 Aug 2024 08:25:42 +0200 Subject: [PATCH 152/286] fix: robust point location for degenerate configurations (#3202) * implemented method based on winding number * using element global index for element choice in degenerate cases * added global id criterion for points coincident with vertices, as well * using base discretization for precomputing src/rcv * enabled for high orders. Also removed extra high-order nodes where not needed --------- Co-authored-by: Aurelien Co-authored-by: acitrain <60715545+acitrain@users.noreply.github.com> --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../mesh/utilities/ComputationalGeometry.hpp | 397 +++++++++++++++++- .../AcousticFirstOrderWaveEquationSEM.cpp | 45 +- .../AcousticFirstOrderWaveEquationSEM.hpp | 3 +- .../AcousticVTIWaveEquationSEM.cpp | 44 +- .../AcousticVTIWaveEquationSEM.hpp | 3 +- .../AcousticVTIWaveEquationSEMKernel.hpp | 73 ++-- .../isotropic/AcousticWaveEquationSEM.cpp | 43 +- .../isotropic/AcousticWaveEquationSEM.hpp | 3 +- .../ElasticFirstOrderWaveEquationSEM.cpp | 44 +- .../ElasticFirstOrderWaveEquationSEM.hpp | 3 +- .../isotropic/ElasticWaveEquationSEM.cpp | 38 +- .../isotropic/ElasticWaveEquationSEM.hpp | 4 +- .../PrecomputeSourcesAndReceiversKernel.hpp | 195 +++++---- .../wavePropagation/shared/WaveSolverBase.hpp | 3 +- .../shared/WaveSolverUtils.hpp | 8 +- 17 files changed, 692 insertions(+), 220 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index ed7b9c4e39e..440853cc61d 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3215-6396-9b43cc8 + baseline: integratedTests/baseline_integratedTests-pr3202-6636-2821c93 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index fff3d8f8311..dd686fc7877 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3202 (2024-08-03) +====================== +Acoustic VTI tests needed rebaselining after update in source and receiver location algorithm. + PR #3215 (2024-07-23) ====================== Changed the default value for massCreation and name of the wrapper. diff --git a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp index 0227bd7d28b..63c33ffd332 100644 --- a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp +++ b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp @@ -381,7 +381,6 @@ int sign( T const val ) return (T( 0 ) < val) - (val < T( 0 )); } - /** * @brief Check if a point is inside a convex polyhedron (3D polygon) * @tparam POINT_TYPE type of @p point @@ -435,6 +434,402 @@ bool isPointInsidePolyhedron( arrayView2d< real64 const, nodes::REFERENCE_POSITI } +/** + * @brief Method to perform lexicographic comparison of two nodes based on coordinates. + * @tparam COORD_TYPE type of coordinate + * @tparam POINT_TYPE type of point + * @param[in] ax x-coordinate of the first vertex + * @param[in] ay y-coordinate of the first vertex + * @param[in] az z-coordinate of the first vertex + * @param[in] bx x-coordinate of the second vertex + * @param[in] by y-coordinate of the second vertex + * @param[in] bz z-coordinate of the second vertex + * @return 0 if the vertices coincide, +1 if a > b and -1 if b > a + */ +template< typename COORD_TYPE, typename POINT_TYPE > +GEOS_HOST_DEVICE +int lexicographicalCompareVertex( POINT_TYPE const ax, POINT_TYPE const ay, POINT_TYPE const az, + COORD_TYPE const bx, COORD_TYPE const by, COORD_TYPE const bz ) +{ + if( ax < bx ) + return -1; + else if( ax > bx ) + return 1; + if( ay < by ) + return -1; + else if( ay > by ) + return 1; + if( az < bz ) + return -1; + else if( az > bz ) + return 1; + return 0; +} + +/** + * @brief Method to perform lexicographic comparison of a node and an edge based on coordinates. + * @tparam COORD_TYPE type of coordinate + * @tparam POINT_TYPE type of point + * @param[in] ax x-coordinate of the first vertex + * @param[in] ay y-coordinate of the first vertex + * @param[in] az z-coordinate of the first vertex + * @param[in] e1x x-coordinate of the first edge vertex + * @param[in] e1y y-coordinate of the first edge vertex + * @param[in] e1z z-coordinate of the first edge vertex + * @param[in] e2x x-coordinate of the second edge vertex + * @param[in] e2y y-coordinate of the second edge vertex + * @param[in] e2z z-coordinate of the second edge vertex + * @return 0 if the vertices lies on the edge, +1 if e > a and -1 if a > e + */ +template< typename COORD_TYPE, typename POINT_TYPE > +GEOS_HOST_DEVICE +int lexicographicalCompareEdge( POINT_TYPE const ax, POINT_TYPE const ay, POINT_TYPE const az, + COORD_TYPE const e1x, COORD_TYPE const e1y, COORD_TYPE const e1z, + COORD_TYPE const e2x, COORD_TYPE const e2y, COORD_TYPE const e2z ) +{ + return lexicographicalCompareVertex( ( e1y - ay ) * ( e2x - ax ), + ( e1z - az ) * ( e2x - ax ), + ( e1z - az ) * ( e2y - ay ), + ( e1x - ax ) * ( e2y - ay ), + ( e1x - ax ) * ( e2z - az ), + ( e1y - ay ) * ( e2z - az ) ); +} + +/** + * @brief Method to perform lexicographic comparison of a node and a triangle based on coordinates. + * @tparam COORD_TYPE type of coordinate + * @tparam POINT_TYPE type of point + * @param[in] ax x-coordinate of the first vertex + * @param[in] ay y-coordinate of the first vertex + * @param[in] az z-coordinate of the first vertex + * @param[in] t1x x-coordinate of the first triangle vertex + * @param[in] t1y y-coordinate of the first triangle vertex + * @param[in] t1z z-coordinate of the first triangle vertex + * @param[in] t2x x-coordinate of the second triangle vertex + * @param[in] t2y y-coordinate of the second triangle vertex + * @param[in] t2z z-coordinate of the second triangle vertex + * @param[in] t3x x-coordinate of the third triangle vertex + * @param[in] t3y y-coordinate of the third triangle vertex + * @param[in] t3z z-coordinate of the third triangle vertex + * @return 0 if the vertices lies on the triangle, +1 if t > a and -1 if t > e + */ +template< typename COORD_TYPE, typename POINT_TYPE > +GEOS_HOST_DEVICE +int lexicographicalCompareTriangle( POINT_TYPE const ax, POINT_TYPE const ay, POINT_TYPE const az, + COORD_TYPE const t1x, COORD_TYPE const t1y, COORD_TYPE const t1z, + COORD_TYPE const t2x, COORD_TYPE const t2y, COORD_TYPE const t2z, + COORD_TYPE const t3x, COORD_TYPE const t3y, COORD_TYPE const t3z ) +{ + COORD_TYPE v1x = t1x - ax; + COORD_TYPE v1y = t1y - ay; + COORD_TYPE v1z = t1z - az; + COORD_TYPE v2x = t2x - ax; + COORD_TYPE v2y = t2y - ay; + COORD_TYPE v2z = t2z - az; + COORD_TYPE v3x = t3x - ax; + COORD_TYPE v3y = t3y - ay; + COORD_TYPE v3z = t3z - az; + COORD_TYPE sign = ( v1x * v2y - v1y * v2x ) * v3z + + ( v2x * v3y - v2y * v3x ) * v1z + + ( v3x * v1y - v3y * v1x ) * v2z; + if( sign > 0 ) + return 1; + else if( sign < 0 ) + return -1; + return 0; +} +/** + * @brief Method to find the reference element touching a vertex. The element with the lowest global ID is chosen + * from the list. + * @param[in] nodeElements the list of elements adjacent to the vertex + * @param[in] elementGlobalIndex the global IDs for elements + * @return element touching the vertex with the least global index + */ +template< typename ... LIST_TYPE > +GEOS_HOST_DEVICE +int findVertexRefElement( arraySlice1d< localIndex const > const & nodeElements, + arrayView1d< globalIndex const > const & elementGlobalIndex ) +{ + localIndex minElement = -1; + globalIndex minElementGID = std::numeric_limits< globalIndex >::max(); + for( int i = 0; i < nodeElements.size(); i++ ) + { + localIndex e = nodeElements( i ); + if( elementGlobalIndex[ e ] < minElementGID ) + { + minElementGID = elementGlobalIndex[ e ]; + minElement = e; + } + } + return minElement; +} + +/** + * @brief Method to find the reference element for an edge. The element with the lowest global ID is chosen + * from the list. + * @param[in] nodeElements1 the list of elements adjacent to the first node + * @param[in] nodeElements2 the list of elements adjacent to the second node + * @param[in] elementGlobalIndex the global IDs for elements + * @return the element shared by the two nodes, with the minimal global index + */ +template< typename ... LIST_TYPE > +GEOS_HOST_DEVICE +int findEdgeRefElement( arraySlice1d< localIndex const > const & nodeElements1, + arraySlice1d< localIndex const > const & nodeElements2, + arrayView1d< globalIndex const > const & elementGlobalIndex ) +{ + localIndex minElement = -1; + globalIndex minElementGID = std::numeric_limits< globalIndex >::max(); + for( int i = 0; i < nodeElements1.size(); i++ ) + { + localIndex e1 = nodeElements1( i ); + for( int j = 0; j < nodeElements2.size(); j++ ) + { + localIndex e2 = nodeElements2( j ); + if( e1 == e2 ) + { + if( elementGlobalIndex[ e1 ] < minElementGID ) + { + minElementGID = elementGlobalIndex[ e1 ]; + minElement = e1; + } + } + } + } + return minElement; +} + +/** + * @brief Method to find the reference element for a triangle. The element with the lowest global ID is chosen + * from the list. + * @param[in] nodeElements1 the list of elements adjacent to the first node + * @param[in] nodeElements2 the list of elements adjacent to the second node + * @param[in] nodeElements3 the list of elements adjacent to the third node + * @param[in] elementGlobalIndex the global IDs for elements + * @return the element shared by the three nodes, with the minimal global index + */ +template< typename ... LIST_TYPE > +GEOS_HOST_DEVICE +int findTriangleRefElement( arraySlice1d< localIndex const > const & nodeElements1, + arraySlice1d< localIndex const > const & nodeElements2, + arraySlice1d< localIndex const > const & nodeElements3, + arrayView1d< globalIndex const > const & elementGlobalIndex ) +{ + localIndex minElement = -1; + globalIndex minElementGID = std::numeric_limits< globalIndex >::max(); + for( int i = 0; i < nodeElements1.size(); i++ ) + { + localIndex e1 = nodeElements1( i ); + for( int j = 0; j < nodeElements2.size(); j++ ) + { + localIndex e2 = nodeElements2( j ); + for( int k = 0; k < nodeElements3.size(); k++ ) + { + localIndex e3 = nodeElements3( k ); + if( e1 == e2 && e2 == e3 ) + { + if( elementGlobalIndex[ e1 ] < minElementGID ) + { + minElementGID = elementGlobalIndex[ e1 ]; + minElement = e1; + } + } + } + } + } + return minElement; +} + +/** + * @brief Computes the winding number of a point with respecto to a mesh element. + * @tparam POINT_TYPE type of @p point + * @param[in] element the element to be checked + * @param[in] nodeCoordinates a global array of nodal coordinates + * @param[in] elementsToFaces map from elements to faces + * @param[in] facesToNodes map from faces to nodes + * @param[in] nodesToElements map from nodes to elements + * @param[in] nodeLocalToGlobal global indices of nodes + * @param[in] elementLocalToGlobal global indices of elements + * @param[in] elemCenter coordinates of the element centroid + * @param[in] point coordinates of the query point + * @return the signed winding number, which is positive if and only if the point is inside the mesh element. + */ +template< typename COORD_TYPE, typename POINT_TYPE > +GEOS_HOST_DEVICE +bool computeWindingNumber( localIndex element, + arrayView2d< COORD_TYPE const, nodes::REFERENCE_POSITION_USD > const & nodeCoordinates, + arrayView2d< localIndex const > const & elementsToFaces, + ArrayOfArraysView< localIndex const > const & facesToNodes, + ArrayOfArraysView< localIndex const > const & nodesToElements, + arrayView1d< globalIndex const > const & nodeLocalToGlobal, + arrayView1d< globalIndex const > const & elementLocalToGlobal, + POINT_TYPE const & elemCenter, + POINT_TYPE const & point ) +{ + arraySlice1d< localIndex const > const & faceIndices = elementsToFaces[ element ]; + localIndex const numFaces = faceIndices.size(); + int omega = 0; + for( localIndex kf = 0; kf < numFaces; ++kf ) + { + // triangulate the face. The triangulation must be done in a consistent way across ranks. + // This can be achieved by always picking the vertex with the lowest global index as root. + localIndex const faceIndex = faceIndices[kf]; + globalIndex minGlobalId = std::numeric_limits< globalIndex >::max(); + localIndex minVertex = -1; + localIndex numFaceVertices = facesToNodes[faceIndex].size(); + for( localIndex v = 0; v < numFaceVertices; v++ ) + { + localIndex vIndex = facesToNodes( faceIndex, v ); + globalIndex globalId = nodeLocalToGlobal[ vIndex ]; + if( globalId < minGlobalId ) + { + minGlobalId = globalId; + minVertex = vIndex; + } + } + // triangulate the face using the minimum-id vertex as root + localIndex vi[ 3 ] = { minVertex, -1, -1 }; + for( localIndex v = 0; v < numFaceVertices; v++ ) + { + vi[ 1 ] = facesToNodes( faceIndex, v ); + vi[ 2 ] = facesToNodes( faceIndex, (v + 1) % numFaceVertices ); + if( vi[ 1 ] != minVertex && vi[ 2 ] != minVertex ) + { + // To make the algorithm independent of rank, always take the two additional vertices in increasing global ID + if( nodeLocalToGlobal[ vi[ 1 ] ] > nodeLocalToGlobal[ vi[ 2 ] ] ) + { + localIndex temp = vi[ 1 ]; + vi[ 1 ] = vi[ 2 ]; + vi[ 2 ] = temp; + } + COORD_TYPE v1x = nodeCoordinates( vi[ 0 ], 0 ); + COORD_TYPE v1y = nodeCoordinates( vi[ 0 ], 1 ); + COORD_TYPE v1z = nodeCoordinates( vi[ 0 ], 2 ); + COORD_TYPE v2x = nodeCoordinates( vi[ 1 ], 0 ); + COORD_TYPE v2y = nodeCoordinates( vi[ 1 ], 1 ); + COORD_TYPE v2z = nodeCoordinates( vi[ 1 ], 2 ); + COORD_TYPE v3x = nodeCoordinates( vi[ 2 ], 0 ); + COORD_TYPE v3y = nodeCoordinates( vi[ 2 ], 1 ); + COORD_TYPE v3z = nodeCoordinates( vi[ 2 ], 2 ); + // check the orientation of this triangle + R1Tensor vv1 = { v2x - v1x, v2y - v1y, v2z - v1z }; + R1Tensor vv2 = { v3x - v1x, v3y - v1y, v3z - v1z }; + R1Tensor dist = { elemCenter[ 0 ] - ( v1x + v2x + v3x )/3.0, + elemCenter[ 1 ] - ( v1y + v2y + v3y )/3.0, + elemCenter[ 2 ] - ( v1z + v2z + v3z )/3.0 }; + R1Tensor norm = { }; + LvArray::tensorOps::crossProduct( norm, vv1, vv2 ); + // check if face is oriented coherently, and change sign otherwise + int sign = LvArray::tensorOps::AiBi< 3 >( norm, dist ) > 0 ? -1 : +1; + // Compute the winding number contributed by this triangle + int cmp1 = lexicographicalCompareVertex( point[ 0 ], point[ 1 ], point[ 2 ], v1x, v1y, v1z ); + if( cmp1 == 0 ) + { + return findVertexRefElement( nodesToElements[ vi[ 0 ] ], elementLocalToGlobal ) == element; + } + int cmp2 = lexicographicalCompareVertex( point[ 0 ], point[ 1 ], point[ 2 ], v2x, v2y, v2z ); + if( cmp2 == 0 ) + { + return findVertexRefElement( nodesToElements[ vi[ 1 ] ], elementLocalToGlobal ) == element; + } + int cmp3 = lexicographicalCompareVertex( point[ 0 ], point[ 1 ], point[ 2 ], v3x, v3y, v3z ); + if( cmp3 == 0 ) + { + return findVertexRefElement( nodesToElements[ vi[ 2 ] ], elementLocalToGlobal ) == element; + } + int facecmp = 0; + int edgecmp = 0; + if( cmp1 != cmp2 ) + { + edgecmp = lexicographicalCompareEdge( point[ 0 ], point[ 1 ], point[ 2 ], + v1x, v1y, v1z, + v2x, v2y, v2z ); + if( edgecmp == 0 ) + { + return findEdgeRefElement( nodesToElements[ vi[ 0 ] ], nodesToElements[ vi[ 1 ] ], elementLocalToGlobal ) == element; + } + facecmp += sign * edgecmp; + } + if( cmp2 != cmp3 ) + { + edgecmp = lexicographicalCompareEdge( point[ 0 ], point[ 1 ], point[ 2 ], + v2x, v2y, v2z, + v3x, v3y, v3z ); + if( edgecmp == 0 ) + { + return findEdgeRefElement( nodesToElements[ vi[ 1 ] ], nodesToElements[ vi[ 2 ] ], elementLocalToGlobal ) == element; + } + facecmp += sign * edgecmp; + } + if( cmp3 != cmp1 ) + { + edgecmp = lexicographicalCompareEdge( point[ 0 ], point[ 1 ], point[ 2 ], + v3x, v3y, v3z, + v1x, v1y, v1z ); + if( edgecmp == 0 ) + { + return findEdgeRefElement( nodesToElements[ vi[ 0 ] ], nodesToElements[ vi[ 2 ] ], elementLocalToGlobal ) == element; + } + facecmp += sign * edgecmp; + } + // if all edges are on the same side, this triangle does not contribute to the winding number + if( facecmp == 0 ) + continue; + facecmp = lexicographicalCompareTriangle( point[ 0 ], point[ 1 ], point[ 2 ], + v1x, v1y, v1z, + v2x, v2y, v2z, + v3x, v3y, v3z ); + + if( facecmp == 0 ) + { + return findTriangleRefElement( nodesToElements[ vi[ 0 ] ], nodesToElements[ vi[ 1 ] ], nodesToElements[ vi[ 2 ] ], elementLocalToGlobal ) == element; + } + omega += sign * facecmp; + } + } + } + + return omega; +} + +/** + * @brief Check if a point is inside a convex polyhedron (3D polygon), using a robust method + * to avoid ambiguity when the point lies on an interface. + * This method is based on the following method: + * - the winding number omega of the point with respect to the cell is used to determine if the point is inside (omega=1) or not (omega=0) + * - corner cases (point lying on a face, edge or vertex of the cell) are detected using a robust method based on lexicographical + * comparisons + * - these comparisons are made consistent across MPI ranks by consistently arranging items based on global indices (GIDs). In particular: + * - Faces are triangulated using the vertex with the smallest GID as root; + * - Edges and faces are described by vertices in increasing GID order + * - Finally, if the point lies on a (vertex, edge, face), it is assigned to the first shared element with the least global index + * @tparam POINT_TYPE type of @p point + * @param[in] element the element to be checked + * @param[in] nodeCoordinates a global array of nodal coordinates + * @param[in] elementsToFaces map from elements to faces + * @param[in] facesToNodes map from faces to nodes + * @param[in] nodesToElements map from nodes to elements + * @param[in] nodeLocalToGlobal global indices of nodes + * @param[in] elementLocalToGlobal global indices of elements + * @param[in] elemCenter coordinates of the element centroid + * @param[in] point coordinates of the query point + * @return whether the point is inside + */ +template< typename COORD_TYPE, typename POINT_TYPE > +GEOS_HOST_DEVICE +bool isPointInsideConvexPolyhedronRobust( localIndex element, + arrayView2d< COORD_TYPE const, nodes::REFERENCE_POSITION_USD > const & nodeCoordinates, + arrayView2d< localIndex const > const & elementsToFaces, + ArrayOfArraysView< localIndex const > const & facesToNodes, + ArrayOfArraysView< localIndex const > const & nodesToElements, + arrayView1d< globalIndex const > const & nodeLocalToGlobal, + arrayView1d< globalIndex const > const & elementLocalToGlobal, + POINT_TYPE const & elemCenter, + POINT_TYPE const & point ) +{ + return computeWindingNumber( element, nodeCoordinates, elementsToFaces, facesToNodes, nodesToElements, nodeLocalToGlobal, elementLocalToGlobal, elemCenter, point ) > 0; +} + /** * @brief Compute the dimensions of the bounding box containing the element * defined here by the coordinates of its vertices. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 32755474615..e9db0ca9617 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -153,15 +153,14 @@ void AcousticFirstOrderWaveEquationSEM::postInputInitialization() m_receiverRegion.resize( numReceiversGlobal ); } -void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) +void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMesh, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - NodeManager const & nodeManager = mesh.getNodeManager(); - FaceManager const & faceManager = mesh.getFaceManager(); + GEOS_MARK_FUNCTION; - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const - X = nodeManager.getField< fields::referencePosition32 >().toViewConst(); - arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); - arrayView2d< real64 const > const faceCenter = faceManager.faceCenter(); + arrayView1d< globalIndex const > const nodeLocalToGlobal = baseMesh.getNodeManager().localToGlobalMap().toViewConst(); + ArrayOfArraysView< localIndex const > const nodesToElements = baseMesh.getNodeManager().elementList().toViewConst(); + ArrayOfArraysView< localIndex const > const facesToNodes = baseMesh.getFaceManager().nodeList().toViewConst(); + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const nodeCoords = baseMesh.getNodeManager().referencePosition(); arrayView2d< real64 const > const sourceCoordinates = m_sourceCoordinates.toViewConst(); arrayView2d< localIndex > const sourceNodeIds = m_sourceNodeIds.toView(); @@ -195,8 +194,11 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev } } - mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const regionIndex, - CellElementSubRegion & elementSubRegion ) + mesh.getElemManager().forElementSubRegionsComplete< CellElementSubRegion >( regionNames, [&]( localIndex const, + localIndex const regionIndex, + localIndex const esr, + ElementRegionBase &, + CellElementSubRegion & elementSubRegion ) { GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8) ", @@ -204,8 +206,10 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & baseElemsToNodes = baseMesh.getElemManager().getRegion( regionIndex ).getSubRegion< CellElementSubRegion >( esr ).nodeList(); arrayView2d< real64 const > const elemCenter = elementSubRegion.getElementCenter(); arrayView1d< integer const > const elemGhostRank = elementSubRegion.ghostRank(); + arrayView1d< globalIndex const > const elemLocalToGlobal = elementSubRegion.localToGlobalMap().toViewConst(); finiteElement::FiniteElementBase const & fe = elementSubRegion.getReference< finiteElement::FiniteElementBase >( getDiscretizationName() ); @@ -213,21 +217,21 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev { using FE_TYPE = TYPEOFREF( finiteElement ); - localIndex const numFacesPerElem = elementSubRegion.numFacesPerElement(); - PreComputeSourcesAndReceivers:: Compute1DSourceAndReceiverConstantsWithElementsAndRegionStorage < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), regionIndex, - numFacesPerElem, - X, + facesToNodes, + nodeCoords, + nodeLocalToGlobal, + elemLocalToGlobal, + nodesToElements, + baseElemsToNodes, elemGhostRank, elemsToNodes, elemsToFaces, elemCenter, - faceNormal, - faceCenter, sourceCoordinates, sourceIsAccessible, sourceElem, @@ -258,11 +262,12 @@ void AcousticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGro applyFreeSurfaceBC( 0.0, domain ); - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshBodyName, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - precomputeSourceAndReceiverTerm( mesh, regionNames ); + MeshLevel & baseMesh = domain.getMeshBodies().getGroup< MeshBody >( meshBodyName ).getBaseDiscretization(); + precomputeSourceAndReceiverTerm( baseMesh, mesh, regionNames ); NodeManager & nodeManager = mesh.getNodeManager(); FaceManager & faceManager = mesh.getFaceManager(); @@ -435,7 +440,7 @@ real64 AcousticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & t { NodeManager & nodeManager = mesh.getNodeManager(); - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const X = nodeManager.getField< fields::referencePosition32 >().toViewConst(); + arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords = nodeManager.getField< fields::referencePosition32 >().toViewConst(); arrayView1d< real32 const > const mass = nodeManager.getField< acousticfields::AcousticMassVector >(); arrayView1d< real32 const > const damping = nodeManager.getField< acousticfields::DampingVector >(); @@ -468,7 +473,7 @@ real64 AcousticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & t VelocityComputation< FE_TYPE > kernel( finiteElement ); kernel.template launch< EXEC_POLICY, ATOMIC_POLICY > ( elementSubRegion.size(), - X, + nodeCoords, elemsToNodes, p_np1, density, @@ -482,7 +487,7 @@ real64 AcousticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & t ( elementSubRegion.size(), regionIndex, nodeManager.size(), - X, + nodeCoords, elemsToNodes, velocity_x, velocity_y, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp index 423dc8ae5ba..52e72af8d91 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp @@ -119,9 +119,10 @@ class AcousticFirstOrderWaveEquationSEM : public WaveSolverBase /** * @brief Locate sources and receivers position in the mesh elements, evaluate the basis functions at each point and save them to the * corresponding elements nodes. + * @param baseMesh the level-0 mesh * @param mesh mesh of the computational domain */ - virtual void precomputeSourceAndReceiverTerm( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; + virtual void precomputeSourceAndReceiverTerm( MeshLevel & baseMesh, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; /** * @brief Apply free surface condition to the face define in the geometry box from the xml diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index 23cd9ba2db4..1bfe1f970d8 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -112,18 +112,15 @@ void AcousticVTIWaveEquationSEM::postInputInitialization() m_pressureNp1AtReceivers.resize( m_nsamplesSeismoTrace, numReceiversGlobal + 1 ); } -void AcousticVTIWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, +void AcousticVTIWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMesh, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - NodeManager const & nodeManager = mesh.getNodeManager(); - FaceManager const & faceManager = mesh.getFaceManager(); - - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords32 = - nodeManager.getField< fields::referencePosition32 >().toViewConst(); - - arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); - arrayView2d< real64 const > const faceCenter = faceManager.faceCenter(); + GEOS_MARK_FUNCTION; + arrayView1d< globalIndex const > const nodeLocalToGlobal = baseMesh.getNodeManager().localToGlobalMap().toViewConst(); + ArrayOfArraysView< localIndex const > const nodesToElements = baseMesh.getNodeManager().elementList().toViewConst(); + ArrayOfArraysView< localIndex const > const facesToNodes = baseMesh.getFaceManager().nodeList().toViewConst(); + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const nodeCoords = baseMesh.getNodeManager().referencePosition().toViewConst(); arrayView2d< real64 const > const sourceCoordinates = m_sourceCoordinates.toViewConst(); arrayView2d< localIndex > const sourceNodeIds = m_sourceNodeIds.toView(); @@ -153,8 +150,11 @@ void AcousticVTIWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & me } } - mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, - CellElementSubRegion & elementSubRegion ) + mesh.getElemManager().forElementSubRegionsComplete< CellElementSubRegion >( regionNames, [&]( localIndex const, + localIndex const er, + localIndex const esr, + ElementRegionBase &, + CellElementSubRegion & elementSubRegion ) { GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, "Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8), using the SEM formulation", @@ -162,8 +162,10 @@ void AcousticVTIWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & me arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & baseElemsToNodes = baseMesh.getElemManager().getRegion( er ).getSubRegion< CellElementSubRegion >( esr ).nodeList(); arrayView2d< real64 const > const elemCenter = elementSubRegion.getElementCenter(); arrayView1d< integer const > const elemGhostRank = elementSubRegion.ghostRank(); + arrayView1d< globalIndex const > const elemLocalToGlobal = elementSubRegion.localToGlobalMap().toViewConst(); finiteElement::FiniteElementBase const & fe = elementSubRegion.getReference< finiteElement::FiniteElementBase >( getDiscretizationName() ); @@ -171,20 +173,20 @@ void AcousticVTIWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & me { using FE_TYPE = TYPEOFREF( finiteElement ); - localIndex const numFacesPerElem = elementSubRegion.numFacesPerElement(); - acousticVTIWaveEquationSEMKernels:: PrecomputeSourceAndReceiverKernel:: launch< EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), - numFacesPerElem, - nodeCoords32, + facesToNodes, + nodeCoords, + nodeLocalToGlobal, + elemLocalToGlobal, + nodesToElements, + baseElemsToNodes, elemGhostRank, elemsToNodes, elemsToFaces, elemCenter, - faceNormal, - faceCenter, sourceCoordinates, sourceIsAccessible, sourceNodeIds, @@ -233,19 +235,19 @@ void AcousticVTIWaveEquationSEM::initializePostInitialConditionsPreSubGroups() applyFreeSurfaceBC( 0.0, domain ); precomputeSurfaceFieldIndicator( domain ); - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshBodyName, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - precomputeSourceAndReceiverTerm( mesh, regionNames ); + MeshLevel & baseMesh = domain.getMeshBodies().getGroup< MeshBody >( meshBodyName ).getBaseDiscretization(); + precomputeSourceAndReceiverTerm( baseMesh, mesh, regionNames ); NodeManager & nodeManager = mesh.getNodeManager(); FaceManager & faceManager = mesh.getFaceManager(); /// get the array of indicators: 1 if the face is on the boundary; 0 otherwise arrayView1d< integer > const & facesDomainBoundaryIndicator = faceManager.getDomainBoundaryIndicator(); - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords = - nodeManager.getField< fields::referencePosition32 >().toViewConst(); + arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords = nodeManager.getField< fields::referencePosition32 >().toViewConst(); /// get face to node map ArrayOfArraysView< localIndex const > const facesToNodes = faceManager.nodeList().toViewConst(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp index 889cb424261..d672c398387 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp @@ -127,9 +127,10 @@ class AcousticVTIWaveEquationSEM : public WaveSolverBase /** * @brief Locate sources and receivers position in the mesh elements, evaluate the basis functions at each point and save them to the * corresponding elements nodes. + * @param baseMesh the level-0 mesh * @param mesh mesh of the computational domain */ - virtual void precomputeSourceAndReceiverTerm( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; + virtual void precomputeSourceAndReceiverTerm( MeshLevel & baseMesh, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; /** * @brief Compute the lateral and bottom surface Field indicators of the boxed domain diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp index 1acd21ac28b..e4de8b7d4ed 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp @@ -40,38 +40,43 @@ struct PrecomputeSourceAndReceiverKernel * @tparam EXEC_POLICY execution policy * @tparam FE_TYPE finite element type * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of faces per element - * @param[in] nodeCoords coordinates of the nodes - * @param[in] elemGhostRank the ghost ranks + * @param[in] baseFacesToNodes face to node map + * @param[in] baseNodeCoords coordinates of the nodes + * @param[in] baseNodeLocalToGlobal local to global index map for nodes + * @param[in] elementLocalToGlobal local to global index map for elements + * @param[in] baseNodesToElements node to element map for the base mesh + * @param[in] baseElemsToNodes element to node map for the base mesh + * @param[in] elemGhostRank rank of the ghost element * @param[in] elemsToNodes map from element to nodes * @param[in] elemsToFaces map from element to faces - * @param[in] facesToNodes map from faces to nodes * @param[in] elemCenter coordinates of the element centers * @param[in] sourceCoordinates coordinates of the source terms * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not * @param[out] sourceNodeIds indices of the nodes of the element where the source is located - * @param[out] sourceNodeConstants constant part of the source terms + * @param[out] sourceConstants constant part of the source terms * @param[in] receiverCoordinates coordinates of the receiver terms * @param[out] receiverIsLocal flag indicating whether the receiver is local or not * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located - * @param[out] receiverNodeConstants constant part of the receiver term - * @param[out] sourceValue the value of the source - * @param[in] dt the time step size - * @param[in] timeSourceFrequency the time frequency of the source + * @param[out] receiverConstants constant part of the receiver term + * @param[out] sourceValue value of the temporal source (eg. Ricker) + * @param[in] dt time-step + * @param[in] timeSourceFrequency the central frequency of the source * @param[in] timeSourceDelay the time delay of the source - * @param[in] rickerOrder the order of the ricker + * @param[in] rickerOrder order of the Ricker wavelet */ template< typename EXEC_POLICY, typename FE_TYPE > static void launch( localIndex const size, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + ArrayOfArraysView< localIndex const > const baseFacesToNodes, + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const baseNodeCoords, + arrayView1d< globalIndex const > const baseNodeLocalToGlobal, + arrayView1d< globalIndex const > const elementLocalToGlobal, + ArrayOfArraysView< localIndex const > const baseNodesToElements, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & baseElemsToNodes, arrayView1d< integer const > const elemGhostRank, arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, arrayView2d< localIndex const > const elemsToFaces, arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, arrayView2d< real64 const > const sourceCoordinates, arrayView1d< localIndex > const sourceIsAccessible, arrayView2d< localIndex > const sourceNodeIds, @@ -106,20 +111,23 @@ struct PrecomputeSourceAndReceiverKernel sourceCoordinates[isrc][2] }; bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); + computationalGeometry::isPointInsideConvexPolyhedronRobust( k, + baseNodeCoords, + elemsToFaces, + baseFacesToNodes, + baseNodesToElements, + baseNodeLocalToGlobal, + elementLocalToGlobal, + center, + coords ); if( sourceFound ) { real64 coordsOnRefElem[3]{}; WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, + baseElemsToNodes[k], + baseNodeCoords, coordsOnRefElem ); sourceIsAccessible[isrc] = 1; @@ -153,19 +161,22 @@ struct PrecomputeSourceAndReceiverKernel receiverCoordinates[ircv][2] }; real64 coordsOnRefElem[3]{}; - bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); + bool const receiverFound = + computationalGeometry::isPointInsideConvexPolyhedronRobust( k, + baseNodeCoords, + elemsToFaces, + baseFacesToNodes, + baseNodesToElements, + baseNodeLocalToGlobal, + elementLocalToGlobal, + center, + coords ); if( receiverFound && elemGhostRank[k] < 0 ) { WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, + baseElemsToNodes[k], + baseNodeCoords, coordsOnRefElem ); receiverIsLocal[ircv] = 1; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 0d5c2a7a354..77e3c55098a 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -118,18 +118,15 @@ void AcousticWaveEquationSEM::postInputInitialization() m_pressureNp1AtReceivers.resize( m_nsamplesSeismoTrace, m_receiverCoordinates.size( 0 ) + 1 ); } -void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, +void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMesh, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { GEOS_MARK_FUNCTION; - NodeManager const & nodeManager = mesh.getNodeManager(); - FaceManager const & faceManager = mesh.getFaceManager(); - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const - nodeCoords32 = nodeManager.getField< fields::referencePosition32 >().toViewConst(); - - arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); - arrayView2d< real64 const > const faceCenter = faceManager.faceCenter(); + arrayView1d< globalIndex const > const nodeLocalToGlobalMap = baseMesh.getNodeManager().localToGlobalMap().toViewConst(); + ArrayOfArraysView< localIndex const > const nodesToElements = baseMesh.getNodeManager().elementList().toViewConst(); + ArrayOfArraysView< localIndex const > const facesToNodes = baseMesh.getFaceManager().nodeList().toViewConst(); + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const nodeCoords = baseMesh.getNodeManager().referencePosition(); arrayView2d< real64 const > const sourceCoordinates = m_sourceCoordinates.toViewConst(); arrayView2d< localIndex > const sourceNodeIds = m_sourceNodeIds.toView(); @@ -159,8 +156,11 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, } } - mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, - CellElementSubRegion & elementSubRegion ) + mesh.getElemManager().forElementSubRegionsComplete< CellElementSubRegion >( regionNames, [&]( localIndex const, + localIndex const er, + localIndex const esr, + ElementRegionBase &, + CellElementSubRegion & elementSubRegion ) { GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, getDataContext() << ": Invalid type of element, the acoustic solver is designed for hexahedral meshes only (C3D8), using the SEM formulation", @@ -168,8 +168,10 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & baseElemsToNodes = baseMesh.getElemManager().getRegion( er ).getSubRegion< CellElementSubRegion >( esr ).nodeList(); arrayView2d< real64 const > const elemCenter = elementSubRegion.getElementCenter(); arrayView1d< integer const > const elemGhostRank = elementSubRegion.ghostRank(); + arrayView1d< globalIndex const > const elemLocalToGlobalMap = elementSubRegion.localToGlobalMap().toViewConst(); finiteElement::FiniteElementBase const & fe = elementSubRegion.getReference< finiteElement::FiniteElementBase >( getDiscretizationName() ); @@ -177,22 +179,22 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, { using FE_TYPE = TYPEOFREF( finiteElement ); - localIndex const numFacesPerElem = elementSubRegion.numFacesPerElement(); - { GEOS_MARK_SCOPE( acousticWaveEquationSEMKernels::PrecomputeSourceAndReceiverKernel ); PreComputeSourcesAndReceivers:: Compute1DSourceAndReceiverConstants < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), - numFacesPerElem, - nodeCoords32, + facesToNodes, + nodeCoords, + nodeLocalToGlobalMap, + elemLocalToGlobalMap, + nodesToElements, + baseElemsToNodes, elemGhostRank, elemsToNodes, elemsToFaces, elemCenter, - faceNormal, - faceCenter, sourceCoordinates, sourceIsAccessible, sourceNodeIds, @@ -250,11 +252,14 @@ void AcousticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() applyFreeSurfaceBC( 0.0, domain ); - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshBodyName, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - precomputeSourceAndReceiverTerm( mesh, regionNames ); + MeshLevel & baseMesh = domain.getMeshBodies().getGroup< MeshBody >( meshBodyName ).getBaseDiscretization(); + precomputeSourceAndReceiverTerm( baseMesh, mesh, regionNames ); NodeManager & nodeManager = mesh.getNodeManager(); FaceManager & faceManager = mesh.getFaceManager(); @@ -430,7 +435,7 @@ void AcousticWaveEquationSEM::initializePML() NodeManager & nodeManager = mesh.getNodeManager(); /// WARNING: the array below is one of the PML auxiliary variables arrayView1d< real32 > const indicatorPML = nodeManager.getField< acousticfields::AuxiliaryVar4PML >(); - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords32 = nodeManager.getField< fields::referencePosition32 >().toViewConst(); + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords32 = nodeManager.getField< fields::referencePosition32 >().toViewConst(); indicatorPML.zero(); real32 xInteriorMin[3]{}; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp index da36ea8dcbb..0e0729bfbd9 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp @@ -148,9 +148,10 @@ class AcousticWaveEquationSEM : public WaveSolverBase /** * @brief Locate sources and receivers position in the mesh elements, evaluate the basis functions at each point and save them to the * corresponding elements nodes. + * @param baseMesh the level-0 mesh * @param mesh mesh of the computational domain */ - virtual void precomputeSourceAndReceiverTerm( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; + virtual void precomputeSourceAndReceiverTerm( MeshLevel & baseMesh, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; /** * @brief Apply free surface condition to the face define in the geometry box from the xml diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index 07eb4802edd..98d04bc3b7a 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -202,14 +202,14 @@ void ElasticFirstOrderWaveEquationSEM::postInputInitialization() } -void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) +void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMesh, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - NodeManager const & nodeManager = mesh.getNodeManager(); - FaceManager const & faceManager = mesh.getFaceManager(); + GEOS_MARK_FUNCTION; - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const X = nodeManager.getField< fields::referencePosition32 >().toViewConst(); - arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); - arrayView2d< real64 const > const faceCenter = faceManager.faceCenter(); + arrayView1d< globalIndex const > const nodeLocalToGlobal = baseMesh.getNodeManager().localToGlobalMap().toViewConst(); + ArrayOfArraysView< localIndex const > const nodesToElements = baseMesh.getNodeManager().elementList().toViewConst(); + ArrayOfArraysView< localIndex const > const facesToNodes = baseMesh.getFaceManager().nodeList().toViewConst(); + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const nodeCoords = baseMesh.getNodeManager().referencePosition(); arrayView2d< real64 const > const sourceCoordinates = m_sourceCoordinates.toViewConst(); arrayView2d< localIndex > const sourceNodeIds = m_sourceNodeIds.toView(); @@ -245,8 +245,11 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve } } - mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const regionIndex, - CellElementSubRegion & elementSubRegion ) + mesh.getElemManager().forElementSubRegionsComplete< CellElementSubRegion >( regionNames, [&]( localIndex const, + localIndex const regionIndex, + localIndex const esr, + ElementRegionBase &, + CellElementSubRegion & elementSubRegion ) { GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, @@ -255,8 +258,10 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & baseElemsToNodes = baseMesh.getElemManager().getRegion( regionIndex ).getSubRegion< CellElementSubRegion >( esr ).nodeList(); arrayView2d< real64 const > const elemCenter = elementSubRegion.getElementCenter(); arrayView1d< integer const > const elemGhostRank = elementSubRegion.ghostRank(); + arrayView1d< globalIndex const > const elemLocalToGlobal = elementSubRegion.localToGlobalMap().toViewConst(); finiteElement::FiniteElementBase const & fe = elementSubRegion.getReference< finiteElement::FiniteElementBase >( getDiscretizationName() ); @@ -264,21 +269,21 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve { using FE_TYPE = TYPEOFREF( finiteElement ); - localIndex const numFacesPerElem = elementSubRegion.numFacesPerElement(); - PreComputeSourcesAndReceivers:: Compute1DSourceAndReceiverConstantsWithElementsAndRegionStorage < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), regionIndex, - numFacesPerElem, - X, + facesToNodes, + nodeCoords, + nodeLocalToGlobal, + elemLocalToGlobal, + nodesToElements, + baseElemsToNodes, elemGhostRank, elemsToNodes, elemsToFaces, elemCenter, - faceNormal, - faceCenter, sourceCoordinates, sourceIsAccessible, sourceElem, @@ -310,11 +315,12 @@ void ElasticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGrou real64 const time = 0.0; applyFreeSurfaceBC( time, domain ); - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshBodyName, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - precomputeSourceAndReceiverTerm( mesh, regionNames ); + MeshLevel & baseMesh = domain.getMeshBodies().getGroup< MeshBody >( meshBodyName ).getBaseDiscretization(); + precomputeSourceAndReceiverTerm( baseMesh, mesh, regionNames ); NodeManager & nodeManager = mesh.getNodeManager(); FaceManager & faceManager = mesh.getFaceManager(); @@ -500,7 +506,7 @@ real64 ElasticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & ti NodeManager & nodeManager = mesh.getNodeManager(); - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const X = nodeManager.getField< fields::referencePosition32 >().toViewConst(); + arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords = nodeManager.getField< fields::referencePosition32 >().toViewConst(); arrayView1d< real32 const > const mass = nodeManager.getField< elasticfields::ElasticMassVector >(); arrayView1d< real32 > const dampingx = nodeManager.getField< elasticfields::DampingVectorx >(); @@ -549,7 +555,7 @@ real64 ElasticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & ti kernel.template launch< EXEC_POLICY, ATOMIC_POLICY > ( elementSubRegion.size(), regionIndex, - X, + nodeCoords, elemsToNodes, ux_np1, uy_np1, @@ -578,7 +584,7 @@ real64 ElasticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & ti kernel2.template launch< EXEC_POLICY, ATOMIC_POLICY > ( elementSubRegion.size(), nodeManager.size(), - X, + nodeCoords, elemsToNodes, stressxx, stressyy, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp index 4ab8c383b0b..575226716f9 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp @@ -125,10 +125,11 @@ class ElasticFirstOrderWaveEquationSEM : public WaveSolverBase /** * @brief Locate sources and receivers position in the mesh elements, evaluate the basis functions at each point and save them to the * corresponding elements nodes. + * @param baseMesh the level-0 mesh * @param mesh mesh of the computational domain * @param regionNames name of the region you are currently on */ - virtual void precomputeSourceAndReceiverTerm( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; + virtual void precomputeSourceAndReceiverTerm( MeshLevel & baseMesh, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; /** * @brief Apply free surface condition to the face define in the geometry box from the xml diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 6a2d0d0d7d4..234915bc7f0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -223,15 +223,14 @@ void ElasticWaveEquationSEM::postInputInitialization() } -void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) +void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMesh, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - NodeManager const & nodeManager = mesh.getNodeManager(); - FaceManager const & faceManager = mesh.getFaceManager(); + GEOS_MARK_FUNCTION; - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const X = - nodeManager.getField< fields::referencePosition32 >().toViewConst(); - arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); - arrayView2d< real64 const > const faceCenter = faceManager.faceCenter(); + arrayView1d< globalIndex const > const nodeLocalToGlobal = baseMesh.getNodeManager().localToGlobalMap().toViewConst(); + ArrayOfArraysView< localIndex const > const nodesToElements = baseMesh.getNodeManager().elementList().toViewConst(); + ArrayOfArraysView< localIndex const > const facesToNodes = baseMesh.getFaceManager().nodeList().toViewConst(); + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const nodeCoords = baseMesh.getNodeManager().referencePosition(); arrayView2d< real64 const > const sourceCoordinates = m_sourceCoordinates.toViewConst(); arrayView2d< localIndex > const sourceNodeIds = m_sourceNodeIds.toView(); @@ -267,8 +266,11 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, } } - mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, - CellElementSubRegion & elementSubRegion ) + mesh.getElemManager().forElementSubRegionsComplete< CellElementSubRegion >( regionNames, [&]( localIndex const, + localIndex const er, + localIndex const esr, + ElementRegionBase &, + CellElementSubRegion & elementSubRegion ) { GEOS_THROW_IF( elementSubRegion.getElementType() != ElementType::Hexahedron, @@ -277,8 +279,10 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & baseElemsToNodes = baseMesh.getElemManager().getRegion( er ).getSubRegion< CellElementSubRegion >( esr ).nodeList(); arrayView2d< real64 const > const elemCenter = elementSubRegion.getElementCenter(); arrayView1d< integer const > const elemGhostRank = elementSubRegion.ghostRank(); + arrayView1d< globalIndex const > const elemLocalToGlobal = elementSubRegion.localToGlobalMap().toViewConst(); finiteElement::FiniteElementBase const & fe = elementSubRegion.getReference< finiteElement::FiniteElementBase >( getDiscretizationName() ); @@ -286,19 +290,20 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & mesh, { using FE_TYPE = TYPEOFREF( finiteElement ); - localIndex const numFacesPerElem = elementSubRegion.numFacesPerElement(); PreComputeSourcesAndReceivers:: Compute3DSourceAndReceiverConstantsWithDAS < EXEC_POLICY, FE_TYPE > ( elementSubRegion.size(), - numFacesPerElem, - X, + facesToNodes, + nodeCoords, + nodeLocalToGlobal, + elemLocalToGlobal, + nodesToElements, + baseElemsToNodes, elemGhostRank, elemsToNodes, elemsToFaces, elemCenter, - faceNormal, - faceCenter, sourceCoordinates, sourceIsAccessible, sourceNodeIds, @@ -363,11 +368,12 @@ void ElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() applyFreeSurfaceBC( 0.0, domain ); - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshBodyName, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - precomputeSourceAndReceiverTerm( mesh, regionNames ); + MeshLevel & baseMesh = domain.getMeshBodies().getGroup< MeshBody >( meshBodyName ).getBaseDiscretization(); + precomputeSourceAndReceiverTerm( baseMesh, mesh, regionNames ); NodeManager & nodeManager = mesh.getNodeManager(); FaceManager & faceManager = mesh.getFaceManager(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp index bdb15dcff18..2c9ec3c37ee 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp @@ -132,6 +132,7 @@ class ElasticWaveEquationSEM : public WaveSolverBase * @param time_n time at the beginning of the step * @param dt the perscribed timestep * @param cycleNumber the current cycle number + * @param meshBodyName the name of the mesh body * @param domain the domain object * @return return the timestep that was achieved during the step. */ @@ -173,10 +174,11 @@ class ElasticWaveEquationSEM : public WaveSolverBase /** * @brief Locate sources and receivers position in the mesh elements, evaluate the basis functions at each point and save them to the * corresponding elements nodes. + * @param baseMesh the level-0 mesh * @param mesh mesh of the computational domain * @param regionNames the names of the region you loop on */ - virtual void precomputeSourceAndReceiverTerm( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; + virtual void precomputeSourceAndReceiverTerm( MeshLevel & baseMesh, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; /** * @brief Apply free surface condition to the face define in the geometry box from the xml diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp index c688e457c6d..c6fbf016edd 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp @@ -33,14 +33,16 @@ struct PreComputeSourcesAndReceivers * @tparam EXEC_POLICY execution policy * @tparam FE_TYPE finite element type * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of faces per element - * @param[in] nodeCoords coordinates of the nodes + * @param[in] baseFacesToNodes face to node map + * @param[in] baseNodeCoords coordinates of the nodes + * @param[in] baseNodeLocalToGlobal local to global index map for nodes + * @param[in] elementLocalToGlobal local to global index map for elements + * @param[in] baseNodesToElements node to element map for the base mesh + * @param[in] baseElemsToNodes element to node map for the base mesh * @param[in] elemGhostRank rank of the ghost element * @param[in] elemsToNodes map from element to nodes * @param[in] elemsToFaces map from element to faces * @param[in] elemCenter coordinates of the element centers - * @param[in] faceNormal normal of each faces - * @param[in] faceCenter coordinates of the center of a face * @param[in] sourceCoordinates coordinates of the source terms * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not * @param[out] sourceNodeIds indices of the nodes of the element where the source is located @@ -58,14 +60,16 @@ struct PreComputeSourcesAndReceivers template< typename EXEC_POLICY, typename FE_TYPE > static void Compute1DSourceAndReceiverConstants( localIndex const size, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + ArrayOfArraysView< localIndex const > const baseFacesToNodes, + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const baseNodeCoords, + arrayView1d< globalIndex const > const baseNodeLocalToGlobal, + arrayView1d< globalIndex const > const elementLocalToGlobal, + ArrayOfArraysView< localIndex const > const baseNodesToElements, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & baseElemsToNodes, arrayView1d< integer const > const elemGhostRank, arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, arrayView2d< localIndex const > const elemsToFaces, arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, arrayView2d< real64 const > const sourceCoordinates, arrayView1d< localIndex > const sourceIsAccessible, arrayView2d< localIndex > const sourceNodeIds, @@ -98,22 +102,24 @@ struct PreComputeSourcesAndReceivers real64 const coords[3] = { sourceCoordinates[isrc][0], sourceCoordinates[isrc][1], sourceCoordinates[isrc][2] }; - bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); + computationalGeometry::isPointInsideConvexPolyhedronRobust( k, + baseNodeCoords, + elemsToFaces, + baseFacesToNodes, + baseNodesToElements, + baseNodeLocalToGlobal, + elementLocalToGlobal, + center, + coords ); if( sourceFound ) { real64 coordsOnRefElem[3]{}; WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, + baseElemsToNodes[k], + baseNodeCoords, coordsOnRefElem ); sourceIsAccessible[isrc] = 1; @@ -148,18 +154,21 @@ struct PreComputeSourcesAndReceivers real64 coordsOnRefElem[3]{}; bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); + computationalGeometry::isPointInsideConvexPolyhedronRobust( k, + baseNodeCoords, + elemsToFaces, + baseFacesToNodes, + baseNodesToElements, + baseNodeLocalToGlobal, + elementLocalToGlobal, + center, + coords ); if( receiverFound && elemGhostRank[k] < 0 ) { WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, + baseElemsToNodes[k], + baseNodeCoords, coordsOnRefElem ); receiverIsLocal[ircv] = 1; @@ -187,14 +196,16 @@ struct PreComputeSourcesAndReceivers * @tparam EXEC_POLICY execution policy * @tparam FE_TYPE finite element type * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of faces per element - * @param[in] nodeCoords coordinates of the nodes + * @param[in] baseFacesToNodes face to node map of the base mesh + * @param[in] baseNodeCoords coordinates of the nodes of the base mesh + * @param[in] baseNodeLocalToGlobal local to global index map for nodes of the base mesh + * @param[in] elementLocalToGlobal local to global index map for elements (for the base or high order mesh) + * @param[in] baseNodesToElements local node to element map for the base mesh + * @param[in] baseElemsToNodes element to node map for the base mesh * @param[in] elemGhostRank rank of the ghost element * @param[in] elemsToNodes map from element to nodes * @param[in] elemsToFaces map from element to faces * @param[in] elemCenter coordinates of the element centers - * @param[in] faceNormal normal of each faces - * @param[in] faceCenter coordinates of the center of a face * @param[in] sourceCoordinates coordinates of the source terms * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not * @param[out] sourceElem element where a source is located @@ -215,14 +226,16 @@ struct PreComputeSourcesAndReceivers static void Compute1DSourceAndReceiverConstantsWithElementsAndRegionStorage( localIndex const size, localIndex const regionIndex, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + ArrayOfArraysView< localIndex const > const baseFacesToNodes, + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const baseNodeCoords, + arrayView1d< globalIndex const > const baseNodeLocalToGlobal, + arrayView1d< globalIndex const > const elementLocalToGlobal, + ArrayOfArraysView< localIndex const > const baseNodesToElements, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & baseElemsToNodes, arrayView1d< integer const > const elemGhostRank, arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, arrayView2d< localIndex const > const elemsToFaces, arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, arrayView2d< real64 const > const sourceCoordinates, arrayView1d< localIndex > const sourceIsAccessible, arrayView1d< localIndex > const sourceElem, @@ -261,20 +274,22 @@ struct PreComputeSourcesAndReceivers sourceCoordinates[isrc][2] }; bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); - + computationalGeometry::isPointInsideConvexPolyhedronRobust( k, + baseNodeCoords, + elemsToFaces, + baseFacesToNodes, + baseNodesToElements, + baseNodeLocalToGlobal, + elementLocalToGlobal, + center, + coords ); if( sourceFound ) { real64 coordsOnRefElem[3]{}; WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, + baseElemsToNodes[k], + baseNodeCoords, coordsOnRefElem ); sourceIsAccessible[isrc] = 1; @@ -311,18 +326,21 @@ struct PreComputeSourcesAndReceivers real64 coordsOnRefElem[3]{}; bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); + computationalGeometry::isPointInsideConvexPolyhedronRobust( k, + baseNodeCoords, + elemsToFaces, + baseFacesToNodes, + baseNodesToElements, + baseNodeLocalToGlobal, + elementLocalToGlobal, + center, + coords ); if( receiverFound && elemGhostRank[k] < 0 ) { WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, + baseElemsToNodes[k], + baseNodeCoords, coordsOnRefElem ); receiverIsLocal[ircv] = 1; receiverElem[ircv] = k; @@ -352,14 +370,16 @@ struct PreComputeSourcesAndReceivers * @tparam EXEC_POLICY execution policy * @tparam FE_TYPE finite element type * @param[in] size the number of cells in the subRegion - * @param[in] numFacesPerElem number of face on an element - * @param[in] nodeCoords coordinates of the nodes + * @param[in] baseFacesToNodes face to node map + * @param[in] baseNodeCoords coordinates of the nodes + * @param[in] baseNodeLocalToGlobal local to global index map for nodes + * @param[in] elementLocalToGlobal local to global index map for elements + * @param[in] baseNodesToElements node to element map for the base mesh + * @param[in] baseElemsToNodes element to node map for the base mesh * @param[in] elemGhostRank array containing the ghost rank * @param[in] elemsToNodes map from element to nodes * @param[in] elemsToFaces map from element to faces * @param[in] elemCenter coordinates of the element centers - * @param[in] faceNormal array containing the normal of all faces - * @param[in] faceCenter array containing the center of all faces * @param[in] sourceCoordinates coordinates of the source terms * @param[out] sourceIsAccessible flag indicating whether the source is accessible or not * @param[out] sourceNodeIds indices of the nodes of the element where the source is located @@ -385,14 +405,16 @@ struct PreComputeSourcesAndReceivers template< typename EXEC_POLICY, typename FE_TYPE > static void Compute3DSourceAndReceiverConstantsWithDAS( localIndex const size, - localIndex const numFacesPerElem, - arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + ArrayOfArraysView< localIndex const > const baseFacesToNodes, + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const baseNodeCoords, + arrayView1d< globalIndex const > const baseNodeLocalToGlobal, + arrayView1d< globalIndex const > const elementLocalToGlobal, + ArrayOfArraysView< localIndex const > const baseNodesToElements, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & baseElemsToNodes, arrayView1d< integer const > const elemGhostRank, arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, arrayView2d< localIndex const > const elemsToFaces, arrayView2d< real64 const > const & elemCenter, - arrayView2d< real64 const > const faceNormal, - arrayView2d< real64 const > const faceCenter, arrayView2d< real64 const > const sourceCoordinates, arrayView1d< localIndex > const sourceIsAccessible, arrayView2d< localIndex > const sourceNodeIds, @@ -444,18 +466,21 @@ struct PreComputeSourcesAndReceivers { for( localIndex i=0; i<3; ++i ) { - xLocal[a][i] = nodeCoords( elemsToNodes( k, a ), i ); + xLocal[a][i] = baseNodeCoords( elemsToNodes( k, a ), i ); } } bool const sourceFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); + computationalGeometry::isPointInsideConvexPolyhedronRobust( k, + baseNodeCoords, + elemsToFaces, + baseFacesToNodes, + baseNodesToElements, + baseNodeLocalToGlobal, + elementLocalToGlobal, + center, + coords ); if( sourceFound ) { @@ -463,8 +488,8 @@ struct PreComputeSourcesAndReceivers WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, + baseElemsToNodes[k], + baseNodeCoords, coordsOnRefElem ); sourceIsAccessible[isrc] = 1; @@ -556,12 +581,15 @@ struct PreComputeSourcesAndReceivers receiverCenter[ 1 ] + receiverVector[ 1 ] * receiverLength * samplePointLocations[ iSample ], receiverCenter[ 2 ] + receiverVector[ 2 ] * receiverLength * samplePointLocations[ iSample ] }; bool const sampleFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); + computationalGeometry::isPointInsideConvexPolyhedronRobust( k, + baseNodeCoords, + elemsToFaces, + baseFacesToNodes, + baseNodesToElements, + baseNodeLocalToGlobal, + elementLocalToGlobal, + center, + coords ); if( sampleFound && elemGhostRank[k] < 0 ) { real64 coordsOnRefElem[3]{}; @@ -571,13 +599,13 @@ struct PreComputeSourcesAndReceivers { for( localIndex i=0; i<3; ++i ) { - xLocal[a][i] = nodeCoords( elemsToNodes( k, a ), i ); + xLocal[a][i] = baseNodeCoords( elemsToNodes( k, a ), i ); } } WaveSolverUtils::computeCoordinatesOnReferenceElement< FE_TYPE >( coords, - elemsToNodes[k], - nodeCoords, + baseElemsToNodes[k], + baseNodeCoords, coordsOnRefElem ); real64 N[numNodesPerElem]; real64 gradN[numNodesPerElem][3]; @@ -603,12 +631,15 @@ struct PreComputeSourcesAndReceivers // determine if the current rank is the owner of this receiver real64 const coords[3] = { receiverCenter[ 0 ], receiverCenter[ 1 ], receiverCenter[ 2 ] }; bool const receiverFound = - WaveSolverUtils::locateSourceElement( numFacesPerElem, - center, - faceNormal, - faceCenter, - elemsToFaces[k], - coords ); + computationalGeometry::isPointInsideConvexPolyhedronRobust( k, + baseNodeCoords, + elemsToFaces, + baseFacesToNodes, + baseNodesToElements, + baseNodeLocalToGlobal, + elementLocalToGlobal, + center, + coords ); if( receiverFound && elemGhostRank[k] < 0 ) { receiverIsLocal[ ircv ] = 1; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp index 6cb5a459a0d..fe17f6d6a9d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp @@ -207,9 +207,10 @@ class WaveSolverBase : public SolverBase /** * @brief Locate sources and receivers positions in the mesh elements, evaluate the basis functions at each point and save them to the * corresponding elements nodes. + * @param baseMesh the level-0 mesh * @param mesh mesh of the computational domain */ - virtual void precomputeSourceAndReceiverTerm( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) = 0; + virtual void precomputeSourceAndReceiverTerm( MeshLevel & baseMesh, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) = 0; /** * @brief Perform forward explicit step diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp index b4087dcb2fb..962337e6b40 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp @@ -364,8 +364,8 @@ struct WaveSolverUtils * @brief Convert a mesh element point coordinate into a coordinate on the reference element * @tparam FE_TYPE finite element type * @param[in] coords coordinate of the point - * @param[in] elemsToNodes map to obtaint global nodes from element index - * @param[in] nodeCoords array of mesh nodes coordinates + * @param[in] elemsToNodes element to node map for the base mesh + * @param[in] nodeCoords array of base mesh nodes coordinates * @param[out] coordsOnRefElem to contain the coordinate computed in the reference element */ template< typename FE_TYPE > @@ -373,14 +373,14 @@ struct WaveSolverUtils static void computeCoordinatesOnReferenceElement( real64 const (&coords)[3], arraySlice1d< localIndex const, cells::NODE_MAP_USD - 1 > const elemsToNodes, - arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const nodeCoords, real64 (& coordsOnRefElem)[3] ) { // only the eight corners of the mesh cell are needed to compute the Jacobian real64 xLocal[8][3]{}; for( localIndex a = 0; a < 8; ++a ) { - LvArray::tensorOps::copy< 3 >( xLocal[a], nodeCoords[ elemsToNodes[ FE_TYPE::meshIndexToLinearIndex3D( a )] ] ); + LvArray::tensorOps::copy< 3 >( xLocal[a], nodeCoords[ elemsToNodes[ a ] ] ); } // coordsOnRefElem = invJ*(coords-coordsNode_0) real64 invJ[3][3]{}; From 0cbc589d85d431bdbf8bbee8cf54f11e8226f354 Mon Sep 17 00:00:00 2001 From: MelReyCG <122801580+MelReyCG@users.noreply.github.com> Date: Mon, 5 Aug 2024 18:24:26 +0200 Subject: [PATCH 153/286] refactor: Remove circular dependencies from fileIO/common/codingutilities (#3247) * DataTypes.hpp now only manage static types - no runtime types nor Mpi constants - DataTypes.cpp is not useful anymore. * removing common -> fileIO * removing common->codingUtilities * logger has now a dedicated folder for upcoming files (future PRs) --------- --- examples/ObjectCatalog/main.cpp | 2 +- .../codingUtilities/CMakeLists.txt | 6 +- .../codingUtilities/EnumStrings.hpp | 7 +- .../codingUtilities/Parsing.hpp | 1 + .../RTTypes.cpp} | 13 +- .../codingUtilities/RTTypes.hpp | 238 +++++++++++++++++ .../codingUtilities/Utilities.hpp | 3 +- .../codingUtilities/tests/CMakeLists.txt | 1 - src/coreComponents/common/CMakeLists.txt | 19 +- src/coreComponents/common/DataTypes.hpp | 240 +----------------- src/coreComponents/common/FixedSizeDeque.hpp | 2 +- src/coreComponents/common/MemoryInfos.hpp | 2 +- src/coreComponents/common/MpiWrapper.cpp | 6 + src/coreComponents/common/MpiWrapper.hpp | 7 + src/coreComponents/common/Path.cpp | 2 +- src/coreComponents/common/Span.hpp | 2 +- src/coreComponents/common/TypeDispatch.hpp | 1 + src/coreComponents/common/Units.hpp | 1 + .../common/{ => format}/Format.hpp | 31 +++ .../format}/StringUtilities.cpp | 1 + .../format}/StringUtilities.hpp | 15 +- .../format/table}/TableData.cpp | 0 .../format/table}/TableData.hpp | 8 +- .../format/table}/TableFormatter.cpp | 2 +- .../format/table}/TableFormatter.hpp | 6 +- .../format/table}/TableLayout.cpp | 0 .../format/table}/TableLayout.hpp | 6 +- .../format/table}/unitTests/CMakeLists.txt | 2 +- .../format/table}/unitTests/testTable.cpp | 6 +- .../common/format/unitTests/CMakeLists.txt | 19 ++ .../format/unitTests}/testStringUtilities.cpp | 0 .../common/initializeEnvironment.cpp | 4 +- .../common/{ => logger}/Logger.cpp | 4 +- .../common/{ => logger}/Logger.hpp | 2 +- .../ConstitutivePassThruHandler.hpp | 1 + .../CO2Brine/functions/CO2EOSSolver.cpp | 1 + .../CO2Brine/functions/PVTFunctionHelpers.hpp | 4 +- .../fluid/multifluid/PVTDriver.cpp | 2 +- .../functions/CubicEOSPhaseModel.hpp | 1 + .../solid/DamageSpectralUtilities.hpp | 4 + .../dataRepository/BufferOps.hpp | 1 + .../dataRepository/DataContext.hpp | 4 +- src/coreComponents/dataRepository/Group.cpp | 2 +- .../dataRepository/HistoryDataSpec.hpp | 1 + .../dataRepository/InputFlags.hpp | 2 +- .../dataRepository/MappedVector.hpp | 2 +- .../dataRepository/ObjectCatalog.hpp | 4 +- .../dataRepository/RestartFlags.hpp | 8 +- .../dataRepository/xmlWrapper.cpp | 2 +- .../dataRepository/xmlWrapper.hpp | 3 +- .../interfaces/blaslapack/BlasLapackLA.cpp | 2 + .../unitTests/testSolveLinearSystem.cpp | 1 + src/coreComponents/events/PeriodicEvent.cpp | 2 +- .../FieldSpecificationManager.cpp | 2 +- .../FieldSpecificationManager.hpp | 2 +- src/coreComponents/fileIO/CMakeLists.txt | 9 - .../fileIO/Outputs/OutputUtilities.cpp | 2 +- src/coreComponents/fileIO/silo/SiloFile.cpp | 2 +- .../fileIO/timeHistory/HDFHistoryIO.hpp | 1 + .../fileIO/vtk/VTKPolyDataWriterInterface.cpp | 2 +- .../linearAlgebra/common/common.hpp | 1 + .../interfaces/trilinos/EpetraMatrix.cpp | 1 + .../interfaces/trilinos/EpetraVector.cpp | 1 + .../linearAlgebra/utilities/ComponentMask.hpp | 2 +- .../mainInterface/GeosxState.hpp | 1 + .../mainInterface/ProblemManager.cpp | 2 +- src/coreComponents/mainInterface/version.cpp | 2 +- src/coreComponents/mesh/FaceManager.cpp | 2 +- src/coreComponents/mesh/FieldIdentifiers.hpp | 3 +- .../mesh/generators/VTKMeshGeneratorTools.hpp | 2 +- .../mesh/generators/WellGeneratorBase.cpp | 6 +- .../mesh/mpiCommunications/CommID.cpp | 2 +- .../SimpleGeometricObjectBase.hpp | 2 +- .../physicsSolvers/LinearSolverParameters.cpp | 2 +- .../NonlinearSolverParameters.cpp | 4 +- src/coreComponents/schema/schemaUtilities.cpp | 2 +- .../dataRepositoryTests/testObjectCatalog.cpp | 2 +- .../testMimeticInnerProducts.cpp | 2 +- src/main/main.cpp | 2 +- 79 files changed, 424 insertions(+), 343 deletions(-) rename src/coreComponents/{common/DataTypes.cpp => codingUtilities/RTTypes.cpp} (98%) create mode 100644 src/coreComponents/codingUtilities/RTTypes.hpp rename src/coreComponents/common/{ => format}/Format.hpp (83%) rename src/coreComponents/{codingUtilities => common/format}/StringUtilities.cpp (98%) rename src/coreComponents/{codingUtilities => common/format}/StringUtilities.hpp (94%) rename src/coreComponents/{fileIO/Table => common/format/table}/TableData.cpp (100%) rename src/coreComponents/{fileIO/Table => common/format/table}/TableData.hpp (95%) rename src/coreComponents/{fileIO/Table => common/format/table}/TableFormatter.cpp (99%) rename src/coreComponents/{fileIO/Table => common/format/table}/TableFormatter.hpp (97%) rename src/coreComponents/{fileIO/Table => common/format/table}/TableLayout.cpp (100%) rename src/coreComponents/{fileIO/Table => common/format/table}/TableLayout.hpp (96%) rename src/coreComponents/{fileIO/Table => common/format/table}/unitTests/CMakeLists.txt (90%) rename src/coreComponents/{fileIO/Table => common/format/table}/unitTests/testTable.cpp (99%) create mode 100644 src/coreComponents/common/format/unitTests/CMakeLists.txt rename src/coreComponents/{codingUtilities/tests => common/format/unitTests}/testStringUtilities.cpp (100%) rename src/coreComponents/common/{ => logger}/Logger.cpp (98%) rename src/coreComponents/common/{ => logger}/Logger.hpp (99%) diff --git a/examples/ObjectCatalog/main.cpp b/examples/ObjectCatalog/main.cpp index 2304c252821..c2fd08113d5 100644 --- a/examples/ObjectCatalog/main.cpp +++ b/examples/ObjectCatalog/main.cpp @@ -17,7 +17,7 @@ #include -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include "Base.hpp" #include "Derived1.hpp" diff --git a/src/coreComponents/codingUtilities/CMakeLists.txt b/src/coreComponents/codingUtilities/CMakeLists.txt index 080d9b8d262..a85e4046907 100644 --- a/src/coreComponents/codingUtilities/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/CMakeLists.txt @@ -3,9 +3,9 @@ # set( codingUtilities_headers EnumStrings.hpp + RTTypes.hpp Parsing.hpp SFINAE_Macros.hpp - StringUtilities.hpp UnitTestUtilities.hpp Utilities.hpp traits.hpp @@ -16,8 +16,8 @@ set( codingUtilities_headers # set( codingUtilities_sources Parsing.cpp - StringUtilities.cpp - ) + RTTypes.cpp + ) set( dependencyList ${parallelDeps} common fast_float ) diff --git a/src/coreComponents/codingUtilities/EnumStrings.hpp b/src/coreComponents/codingUtilities/EnumStrings.hpp index 557562c1e3c..40930b1b222 100644 --- a/src/coreComponents/codingUtilities/EnumStrings.hpp +++ b/src/coreComponents/codingUtilities/EnumStrings.hpp @@ -25,10 +25,11 @@ #ifndef GEOS_CODINGUTILITIES_ENUMSTRINGS_HPP #define GEOS_CODINGUTILITIES_ENUMSTRINGS_HPP -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" +#include "codingUtilities/RTTypes.hpp" #include "common/DataTypes.hpp" -#include "common/Logger.hpp" -#include "common/Format.hpp" +#include "common/logger/Logger.hpp" +#include "common/format/Format.hpp" #include #include diff --git a/src/coreComponents/codingUtilities/Parsing.hpp b/src/coreComponents/codingUtilities/Parsing.hpp index e99f751bbc4..1f6dcf36c57 100644 --- a/src/coreComponents/codingUtilities/Parsing.hpp +++ b/src/coreComponents/codingUtilities/Parsing.hpp @@ -21,6 +21,7 @@ #define GEOS_CODINGUTILITIES_PARSING_HPP_ #include "common/DataTypes.hpp" +#include "common/logger/Logger.hpp" #include diff --git a/src/coreComponents/common/DataTypes.cpp b/src/coreComponents/codingUtilities/RTTypes.cpp similarity index 98% rename from src/coreComponents/common/DataTypes.cpp rename to src/coreComponents/codingUtilities/RTTypes.cpp index d4b86ea96a7..52d51964af1 100644 --- a/src/coreComponents/common/DataTypes.cpp +++ b/src/coreComponents/codingUtilities/RTTypes.cpp @@ -14,23 +14,16 @@ */ /** - * @file DataTypes.cpp + * @file RTTypes.cpp */ -#include "DataTypes.hpp" -#include "Logger.hpp" +#include "RTTypes.hpp" #include "LvArray/src/system.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" namespace geos { -#ifdef GEOS_USE_MPI -MPI_Comm MPI_COMM_GEOS; -#else -int MPI_COMM_GEOS = 0; -#endif - Regex::Regex( string_view regexStr, string_view formatDescription ): m_regexStr( regexStr ), diff --git a/src/coreComponents/codingUtilities/RTTypes.hpp b/src/coreComponents/codingUtilities/RTTypes.hpp new file mode 100644 index 00000000000..a94c6cb8236 --- /dev/null +++ b/src/coreComponents/codingUtilities/RTTypes.hpp @@ -0,0 +1,238 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file RTTypes.hpp + * + * This file contains various aliases and functions that provide operations regarding the + * use of the runtime types. + */ + +#ifndef GEOS_CODINGUTILITIES_RTTYPES_HPP +#define GEOS_CODINGUTILITIES_RTTYPES_HPP + +#include "common/DataTypes.hpp" +#include "common/format/Format.hpp" +#include "common/logger/Logger.hpp" + +namespace geos +{ + +/** + * @brief Perform a type cast of base to derived pointer. + * @tparam NEW_TYPE derived pointer type + * @tparam EXISTING_TYPE base type + * @param val base pointer to cast + * @return pointer cast to derived type or @p nullptr + */ +template< typename NEW_TYPE, typename EXISTING_TYPE > +NEW_TYPE dynamicCast( EXISTING_TYPE * const val ) +{ + static_assert( std::is_pointer< NEW_TYPE >::value, "NEW_TYPE must be a pointer." ); + return dynamic_cast< NEW_TYPE >( val ); +} + +/** + * @brief Perform a type cast of base to derived reference. + * @tparam NEW_TYPE derived reference type + * @tparam EXISTING_TYPE base type + * @param val base reference to cast + * @return reference cast to derived type or @p nullptr + */ +template< typename NEW_TYPE, typename EXISTING_TYPE > +NEW_TYPE dynamicCast( EXISTING_TYPE & val ) +{ + static_assert( std::is_reference< NEW_TYPE >::value, "NEW_TYPE must be a reference." ); + + using POINTER_TO_NEW_TYPE = std::remove_reference_t< NEW_TYPE > *; + POINTER_TO_NEW_TYPE ptr = dynamicCast< POINTER_TO_NEW_TYPE >( &val ); + GEOS_ERROR_IF( ptr == nullptr, "Cast from " << LvArray::system::demangleType( val ) << " to " << + LvArray::system::demangleType< NEW_TYPE >() << " failed." ); + + return *ptr; +} + +/** + * @brief Print a short summary of a few select type aliases. + */ +void printTypeSummary(); + +/** + * @brief The regular expression data for validating inputs. Use rtTypes to get the regex of a + * type, and TypeRegex< T > to define a type regex. + */ +struct Regex +{ + /** + * @brief the regular expression string. + */ + string m_regexStr; + /** + * @brief the description of the expected format of the regular expression. + */ + string m_formatDescription; + /** + * @brief Default constructor + */ + Regex() {} + /** + * @param regexStr the regex string for validation (eg. "[\\d]+") + * @param formatDescription the description of the expected format to be validated (eg. "Input value must be an integer."). + */ + Regex( string_view regexStr, string_view formatDescription ); +}; + +/** + * @brief Extension point for custom types to provide a validation regexp to schema. + * Do not use directly to obtain a type regex, rtTypes::getTypeRegex< T >() should be used instead. + * @tparam T the type for which the regex is defined + * @tparam ENABLE used to conditionally enable partial specializations + * + * Specializations should define the following method: + * \code{cpp} + * static string get(); + * \endcode + */ +template< typename T, typename ENABLE = void > +struct TypeRegex +{ + /** + * @brief Get the type's regex (default implementation returns nothing). + * @return The Regex associated with T. + */ + static Regex get() { return {}; } +}; + +/** + * @brief Static class to manage the type selection of types at runtime and obtain the + * regexes of these types. Typically, these types are 'xsd:simpleType' in the XSD. + */ +class rtTypes +{ +public: + + /** + * @brief the regex map type to store and find the regexes by the associated rtTypeName. + */ + using RegexMapType = std::map< string, Regex >; + + /** + * @brief Custom types are useful to customize the regexes of an existing type. The type name + * can be one of the existing ones, or a totally new one (which can then be used in Wrapper::setRTTypename). + */ + struct CustomTypes + { + /// @cond DO_NOT_DOCUMENT + static constexpr string_view mapPair = "mapPair"; + static constexpr string_view plotLevel = "geos_dataRepository_PlotLevel"; + static constexpr string_view groupName = "groupName"; + static constexpr string_view groupNameRef = "groupNameRef"; + static constexpr string_view groupNameRefArray = "groupNameRef_array"; + /// @endcond + }; + + /** + * @brief Convert a @p std::type_index to a string. + * @param key the std::type_index of the type + * @return a hard coded string that is related to the std::type_index + */ + static string getTypeName( std::type_index const key ); + + /** + * @tparam T type we want the regex + * @return the regex string for the default rtType of T to validate input values to this type. + */ + template< typename T > + static Regex const & getTypeRegex() + { return getTypeRegex< T >( getTypeName( typeid( T ) ) ); } + + /** + * @param typeName The rtType name of the type we want the regex (can be a CustomTypes). + * @tparam T the type we want the regex. If none are available in createBasicTypesRegexMap(), one is + * generated from TypeRegex< T >::get(). + * @return a regex string validating the type T. + */ + template< typename T > + static Regex const & getTypeRegex( string_view typeName ) + { + RegexMapType & map = getTypeRegexMap(); + auto const it = map.find( string( typeName ) ); + if( it != map.end() ) + { + return it->second; + } + else + { + return map.emplace( typeName, TypeRegex< T >::get() ).first->second; + } + } + + /** + * @brief Construct the regexMap for all basic types (TypeRegex< T > extented types are not mentionned) + * @return RegexMapType + */ + static RegexMapType createBasicTypesRegexMap(); + +private: + + /** + * @return A reference to the types regexes map + */ + static RegexMapType & getTypeRegexMap() + { + static RegexMapType m = createBasicTypesRegexMap(); + return m; + } + + /** + * @brief Private constructor because of static class + */ + rtTypes() {} + +}; + +/** + * @brief Utility class for querying type names at runtime. + * @tparam T the target type + * + * This relies on LvArray's demangling facilities and simply + * adds some convenience methods like getting the brief name. + */ +template< typename T > +struct TypeName +{ + /** + * @brief @return Full name of the type. + */ + static string full() + { + return ::LvArray::system::demangle( typeid( T ).name() ); + } + + /** + * @brief @return brief name of the type (ignoring namespaces). + */ + static string brief() + { + string const full_name = full(); + string::size_type const pos = full_name.find_last_of( "::" ); + return ( pos == string::npos ) ? full_name : full_name.substr( pos ); + } +}; + +} + + +#endif /* GEOS_CODINGUTILITIES_RTTYPES_HPP */ diff --git a/src/coreComponents/codingUtilities/Utilities.hpp b/src/coreComponents/codingUtilities/Utilities.hpp index 3c4d79ec2ae..41fdc9c8e46 100644 --- a/src/coreComponents/codingUtilities/Utilities.hpp +++ b/src/coreComponents/codingUtilities/Utilities.hpp @@ -20,7 +20,8 @@ #ifndef GEOS_CODINGUTILITIES_UTILITIES_H_ #define GEOS_CODINGUTILITIES_UTILITIES_H_ -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" +#include "common/logger/Logger.hpp" #include "common/DataTypes.hpp" #include "LvArray/src/limits.hpp" #include "common/GEOS_RAJA_Interface.hpp" diff --git a/src/coreComponents/codingUtilities/tests/CMakeLists.txt b/src/coreComponents/codingUtilities/tests/CMakeLists.txt index 85042471be1..33f4168e86e 100644 --- a/src/coreComponents/codingUtilities/tests/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/tests/CMakeLists.txt @@ -1,7 +1,6 @@ # Specify list of tests set( testSources testGeosxTraits.cpp - testStringUtilities.cpp testParsing.cpp testUtilities.cpp ) diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index ea5e2409bf3..2a5f70ff960 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -3,15 +3,19 @@ # set( common_headers ${CMAKE_BINARY_DIR}/include/common/GeosxConfig.hpp + format/table/TableLayout.hpp + format/table/TableFormatter.hpp + format/table/TableData.hpp + format/Format.hpp + format/StringUtilities.hpp + logger/Logger.hpp BufferAllocator.hpp DataLayouts.hpp DataTypes.hpp FieldSpecificationOps.hpp - Format.hpp GEOS_RAJA_Interface.hpp GeosxMacros.hpp MemoryInfos.hpp - Logger.hpp MpiWrapper.hpp Path.hpp Span.hpp @@ -39,10 +43,13 @@ endif( ) # Specify all sources # set( common_sources + format/table/TableLayout.cpp + format/table/TableFormatter.cpp + format/table/TableData.cpp + format/StringUtilities.cpp + logger/Logger.cpp BufferAllocator.cpp - DataTypes.cpp MemoryInfos.cpp - Logger.cpp MpiWrapper.cpp Path.cpp initializeEnvironment.cpp @@ -95,7 +102,7 @@ if( ENABLE_CALIPER ) endif() endif() -set( dependencyList ${dependencyList} fileIO codingUtilities ) +set( dependencyList ${dependencyList} ) blt_add_library( NAME common SOURCES ${common_sources} @@ -109,4 +116,6 @@ target_include_directories( common PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) if( GEOS_ENABLE_TESTS ) add_subdirectory( unitTests ) + add_subdirectory( format/table/unitTests ) + add_subdirectory( format/unitTests ) endif() diff --git a/src/coreComponents/common/DataTypes.hpp b/src/coreComponents/common/DataTypes.hpp index 70758781410..9f4c8608ff7 100644 --- a/src/coreComponents/common/DataTypes.hpp +++ b/src/coreComponents/common/DataTypes.hpp @@ -17,7 +17,7 @@ * @file DataTypes.hpp * * This file contains various aliases and functions that provide operations regarding the - * use of the data types. + * use of the static types. */ #ifndef GEOS_COMMON_DATATYPES_HPP @@ -29,7 +29,6 @@ #include "BufferAllocator.hpp" #include "DataLayouts.hpp" #include "Tensor.hpp" -#include "Logger.hpp" #include "LvArray/src/Macros.hpp" #include "LvArray/src/Array.hpp" #include "LvArray/src/ArrayOfArrays.hpp" @@ -71,47 +70,6 @@ namespace geos { -/** - * @brief Perform a type cast of base to derived pointer. - * @tparam NEW_TYPE derived pointer type - * @tparam EXISTING_TYPE base type - * @param val base pointer to cast - * @return pointer cast to derived type or @p nullptr - */ -template< typename NEW_TYPE, typename EXISTING_TYPE > -NEW_TYPE dynamicCast( EXISTING_TYPE * const val ) -{ - static_assert( std::is_pointer< NEW_TYPE >::value, "NEW_TYPE must be a pointer." ); - return dynamic_cast< NEW_TYPE >( val ); -} - -/** - * @brief Perform a type cast of base to derived reference. - * @tparam NEW_TYPE derived reference type - * @tparam EXISTING_TYPE base type - * @param val base reference to cast - * @return reference cast to derived type or @p nullptr - */ -template< typename NEW_TYPE, typename EXISTING_TYPE > -NEW_TYPE dynamicCast( EXISTING_TYPE & val ) -{ - static_assert( std::is_reference< NEW_TYPE >::value, "NEW_TYPE must be a reference." ); - - using POINTER_TO_NEW_TYPE = std::remove_reference_t< NEW_TYPE > *; - POINTER_TO_NEW_TYPE ptr = dynamicCast< POINTER_TO_NEW_TYPE >( &val ); - GEOS_ERROR_IF( ptr == nullptr, "Cast from " << LvArray::system::demangleType( val ) << " to " << - LvArray::system::demangleType< NEW_TYPE >() << " failed." ); - - return *ptr; -} - -/// Global MPI communicator used by GEOSX. -#ifdef GEOS_USE_MPI -extern MPI_Comm MPI_COMM_GEOS; -#else -extern int MPI_COMM_GEOS; -#endif - /** * @name Basic data types used in GEOSX. */ @@ -501,200 +459,6 @@ constexpr static auto LOCALINDEX_MAX = std::numeric_limits< localIndex >::max(); /// A global variable for the value of a object that has not been assigned a geos::globalIndex. constexpr static localIndex unmappedLocalIndexValue = -1; - -/** - * @brief Print a short summary of a few select type aliases. - */ -void printTypeSummary(); - -/** - * @brief The regular expression data for validating inputs. Use rtTypes to get the regex of a - * type, and TypeRegex< T > to define a type regex. - */ -struct Regex -{ - /** - * @brief the regular expression string. - */ - string m_regexStr; - /** - * @brief the description of the expected format of the regular expression. - */ - string m_formatDescription; - /** - * @brief Default constructor - */ - Regex() {} - /** - * @param regexStr the regex string for validation (eg. "[\\d]+") - * @param formatDescription the description of the expected format to be validated (eg. "Input value must be an integer."). - */ - Regex( string_view regexStr, string_view formatDescription ); -}; - -/** - * @brief Extension point for custom types to provide a validation regexp to schema. - * Do not use directly to obtain a type regex, rtTypes::getTypeRegex< T >() should be used instead. - * @tparam T the type for which the regex is defined - * @tparam ENABLE used to conditionally enable partial specializations - * - * Specializations should define the following method: - * \code{cpp} - * static string get(); - * \endcode - */ -template< typename T, typename ENABLE = void > -struct TypeRegex -{ - /** - * @brief Get the type's regex (default implementation returns nothing). - * @return The Regex associated with T. - */ - static Regex get() { return {}; } -}; - -/** - * @brief Static class to manage the type selection of types at runtime and obtain the - * regexes of these types. Typically, these types are 'xsd:simpleType' in the XSD. - */ -class rtTypes -{ -public: - - /** - * @brief the regex map type to store and find the regexes by the associated rtTypeName. - */ - using RegexMapType = std::map< string, Regex >; - - /** - * @brief Custom types are useful to customize the regexes of an existing type. The type name - * can be one of the existing ones, or a totally new one (which can then be used in Wrapper::setRTTypename). - */ - struct CustomTypes - { - /// @cond DO_NOT_DOCUMENT - static constexpr string_view mapPair = "mapPair"; - static constexpr string_view plotLevel = "geos_dataRepository_PlotLevel"; - static constexpr string_view groupName = "groupName"; - static constexpr string_view groupNameRef = "groupNameRef"; - static constexpr string_view groupNameRefArray = "groupNameRef_array"; - /// @endcond - }; - - /** - * @brief Convert a @p std::type_index to a string. - * @param key the std::type_index of the type - * @return a hard coded string that is related to the std::type_index - */ - static string getTypeName( std::type_index const key ); - - /** - * @tparam T type we want the regex - * @return the regex string for the default rtType of T to validate input values to this type. - */ - template< typename T > - static Regex const & getTypeRegex() - { return getTypeRegex< T >( getTypeName( typeid( T ) ) ); } - - /** - * @param typeName The rtType name of the type we want the regex (can be a CustomTypes). - * @tparam T the type we want the regex. If none are available in createBasicTypesRegexMap(), one is - * generated from TypeRegex< T >::get(). - * @return a regex string validating the type T. - */ - template< typename T > - static Regex const & getTypeRegex( string_view typeName ) - { - RegexMapType & map = getTypeRegexMap(); - auto const it = map.find( string( typeName ) ); - if( it != map.end() ) - { - return it->second; - } - else - { - return map.emplace( typeName, TypeRegex< T >::get() ).first->second; - } - } - - /** - * @brief Construct the regexMap for all basic types (TypeRegex< T > extented types are not mentionned) - * @return RegexMapType - */ - static RegexMapType createBasicTypesRegexMap(); - -private: - - /** - * @return A reference to the types regexes map - */ - static RegexMapType & getTypeRegexMap() - { - static RegexMapType m = createBasicTypesRegexMap(); - return m; - } - - /** - * @brief Private constructor because of static class - */ - rtTypes() {} - -}; - -/** - * @brief Utility class for querying type names at runtime. - * @tparam T the target type - * - * This relies on LvArray's demangling facilities and simply - * adds some convenience methods like getting the brief name. - */ -template< typename T > -struct TypeName -{ - /** - * @brief @return Full name of the type. - */ - static string full() - { - return ::LvArray::system::demangle( typeid( T ).name() ); - } - - /** - * @brief @return brief name of the type (ignoring namespaces). - */ - static string brief() - { - string const full_name = full(); - string::size_type const pos = full_name.find_last_of( "::" ); - return ( pos == string::npos ) ? full_name : full_name.substr( pos ); - } -}; - -} - -/** - * @brief Format to be able to directly use a std::optional. - * @param T The type of the value contained std::optional and GEOS_FMT_NS::formatter. - */ -template< typename T > -struct GEOS_FMT_NS::formatter< std::optional< T > > : GEOS_FMT_NS::formatter< T > -{ - /** - * @brief Format the std::optional to a string. - * @param opt The std::optional< T > value to format - * @param ctx formatting state consisting of the formatting arguments and the output iterator - * @return return the corresponding value string. If std::optional is empty retun an empty string - */ - auto format( std::optional< T > const & opt, format_context & ctx ) const - { - if( opt ) - { - return GEOS_FMT_NS::formatter< T >::format( *opt, ctx ); - } - return GEOS_FMT_NS::format_to( ctx.out(), "" ); - } -}; - - +} /* namespace geos */ #endif /* GEOS_COMMON_DATATYPES_HPP */ diff --git a/src/coreComponents/common/FixedSizeDeque.hpp b/src/coreComponents/common/FixedSizeDeque.hpp index 11b0a58fc17..629f1d8f42e 100644 --- a/src/coreComponents/common/FixedSizeDeque.hpp +++ b/src/coreComponents/common/FixedSizeDeque.hpp @@ -19,7 +19,7 @@ #include "LvArray/src/Array.hpp" #include "LvArray/src/memcpy.hpp" #include "LvArray/src/ChaiBuffer.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" /// Get the positive value of a module b #define POSITIVE_MODULO( a, b ) ( ( ( a ) % ( b ) ) + b ) % ( b ) diff --git a/src/coreComponents/common/MemoryInfos.hpp b/src/coreComponents/common/MemoryInfos.hpp index 3f048d5ac8a..90763a7f18d 100644 --- a/src/coreComponents/common/MemoryInfos.hpp +++ b/src/coreComponents/common/MemoryInfos.hpp @@ -17,7 +17,7 @@ #define GEOS_COMMON_MemoryInfos_HPP_ #include "umpire/util/MemoryResourceTraits.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include #include #if defined( GEOS_USE_CUDA ) diff --git a/src/coreComponents/common/MpiWrapper.cpp b/src/coreComponents/common/MpiWrapper.cpp index 521f54fd210..8b8a0afc6a2 100644 --- a/src/coreComponents/common/MpiWrapper.cpp +++ b/src/coreComponents/common/MpiWrapper.cpp @@ -32,6 +32,12 @@ namespace geos { +#ifdef GEOS_USE_MPI +MPI_Comm MPI_COMM_GEOS; +#else +int MPI_COMM_GEOS = 0; +#endif + void MpiWrapper::barrier( MPI_Comm const & MPI_PARAM( comm ) ) { #ifdef GEOS_USE_MPI diff --git a/src/coreComponents/common/MpiWrapper.hpp b/src/coreComponents/common/MpiWrapper.hpp index 12633b63632..9f165e682d3 100644 --- a/src/coreComponents/common/MpiWrapper.hpp +++ b/src/coreComponents/common/MpiWrapper.hpp @@ -98,6 +98,13 @@ struct MPI_Status namespace geos { +/// Global MPI communicator used by GEOSX. +#ifdef GEOS_USE_MPI +extern MPI_Comm MPI_COMM_GEOS; +#else +extern int MPI_COMM_GEOS; +#endif + /** * @struct MpiWrapper * This struct is a wrapper for all mpi.h functions that are used in GEOSX, and provides a collection of diff --git a/src/coreComponents/common/Path.cpp b/src/coreComponents/common/Path.cpp index 50993a1a2da..853f4557904 100644 --- a/src/coreComponents/common/Path.cpp +++ b/src/coreComponents/common/Path.cpp @@ -14,7 +14,7 @@ */ #include "Path.hpp" -#include "Logger.hpp" +#include "logger/Logger.hpp" #include #include diff --git a/src/coreComponents/common/Span.hpp b/src/coreComponents/common/Span.hpp index 40c6c180576..4623fdcdf5f 100644 --- a/src/coreComponents/common/Span.hpp +++ b/src/coreComponents/common/Span.hpp @@ -21,7 +21,7 @@ #define GEOS_COMMON_SPAN_HPP #include "codingUtilities/traits.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include #include diff --git a/src/coreComponents/common/TypeDispatch.hpp b/src/coreComponents/common/TypeDispatch.hpp index 0d4f1a8d761..d01ddf58637 100644 --- a/src/coreComponents/common/TypeDispatch.hpp +++ b/src/coreComponents/common/TypeDispatch.hpp @@ -23,6 +23,7 @@ #define GEOS_COMMON_TYPEDISPATCH_HPP #include "common/DataTypes.hpp" +#include "common/logger/Logger.hpp" #include diff --git a/src/coreComponents/common/Units.hpp b/src/coreComponents/common/Units.hpp index 80b94a94d8d..4749c89ad4a 100644 --- a/src/coreComponents/common/Units.hpp +++ b/src/coreComponents/common/Units.hpp @@ -22,6 +22,7 @@ #include "common/DataTypes.hpp" #include "common/PhysicsConstants.hpp" +#include "common/format/Format.hpp" namespace geos { diff --git a/src/coreComponents/common/Format.hpp b/src/coreComponents/common/format/Format.hpp similarity index 83% rename from src/coreComponents/common/Format.hpp rename to src/coreComponents/common/format/Format.hpp index 58bf6843c39..d8dcb832cf0 100644 --- a/src/coreComponents/common/Format.hpp +++ b/src/coreComponents/common/format/Format.hpp @@ -17,6 +17,7 @@ #define GEOS_COMMON_FORMAT_HPP_ #include +#include #if __cplusplus < 202002L #define GEOS_USE_FMT @@ -88,6 +89,36 @@ struct fmt::formatter< T, std::enable_if_t< std::is_enum< T >::value > > */ #define GEOS_FMT_TO( iter, size, msg, ... ) *GEOS_FMT_NS::format_to_n( iter, size - 1, msg, __VA_ARGS__ ).out = '\0' +/** + * @name Custom formatters + */ +///@{ + +/** + * @brief Format to be able to directly use a std::optional. + * @param T The type of the value contained std::optional and GEOS_FMT_NS::formatter. + */ +template< typename T > +struct GEOS_FMT_NS::formatter< std::optional< T > > : GEOS_FMT_NS::formatter< T > +{ + /** + * @brief Format the std::optional to a string. + * @param opt The std::optional< T > value to format + * @param ctx formatting state consisting of the formatting arguments and the output iterator + * @return return the corresponding value string. If std::optional is empty retun an empty string + */ + auto format( std::optional< T > const & opt, format_context & ctx ) const + { + if( opt ) + { + return GEOS_FMT_NS::formatter< T >::format( *opt, ctx ); + } + return GEOS_FMT_NS::format_to( ctx.out(), "" ); + } +}; + +///@} + // The following workaround is needed to fix compilation with NVCC on some PowerPC machines. // The issue causes the following assertion error message: // "Cannot format an argument. To make type T formattable provide a formatter specialization" diff --git a/src/coreComponents/codingUtilities/StringUtilities.cpp b/src/coreComponents/common/format/StringUtilities.cpp similarity index 98% rename from src/coreComponents/codingUtilities/StringUtilities.cpp rename to src/coreComponents/common/format/StringUtilities.cpp index 2a1face950c..0c692f6a17d 100644 --- a/src/coreComponents/codingUtilities/StringUtilities.cpp +++ b/src/coreComponents/common/format/StringUtilities.cpp @@ -18,6 +18,7 @@ */ #include "StringUtilities.hpp" +#include "common/logger/Logger.hpp" #include "limits.h" #include diff --git a/src/coreComponents/codingUtilities/StringUtilities.hpp b/src/coreComponents/common/format/StringUtilities.hpp similarity index 94% rename from src/coreComponents/codingUtilities/StringUtilities.hpp rename to src/coreComponents/common/format/StringUtilities.hpp index 7f339d49fec..a03e44ac8ea 100644 --- a/src/coreComponents/codingUtilities/StringUtilities.hpp +++ b/src/coreComponents/common/format/StringUtilities.hpp @@ -17,8 +17,8 @@ * @file StringUtilities.hpp */ -#ifndef GEOS_CODINGUTILITIES_STRINGUTILITIES_HPP_ -#define GEOS_CODINGUTILITIES_STRINGUTILITIES_HPP_ +#ifndef GEOS_COMMON_FORMAT_STRINGUTILITIES_HPP_ +#define GEOS_COMMON_FORMAT_STRINGUTILITIES_HPP_ #include "common/DataTypes.hpp" @@ -65,8 +65,8 @@ string join( IT first, IT last, S const & delim = S() ) /** * @brief Join strings or other printable objects with a delimiter. * @tparam CONTAINER type of container to join - * @tparam S type of delimiter, usually char, char const * or string - * @param container container to join + * @tparam S the type of delimiter, usually char, char const * or string + * @param cont the container to join * @param delim delimiter used to glue together strings * @return a string containing input values concatenated with a delimiter */ @@ -216,9 +216,10 @@ template< typename T > string toMetricPrefixString( T const & value ); /** - * @brief Compute the length of a constant string at compile-time. + * @return The length of a constant string computed at compile-time. + * @param str The null-character terminated constant string + * @todo c++17: this function is to remove in favor of std::string_view */ -// TODO c++17: this function is to remove in favor of std::string_view constexpr size_t cstrlen( char const * const str ) { if( str ) @@ -280,4 +281,4 @@ std::ostream & operator<<( std::ostream & os, std::optional< T > const & optValu } // namespace stringutilities } // namespace geos -#endif /* GEOS_CODINGUTILITIES_STRINGUTILITIES_HPP_ */ +#endif /* GEOS_COMMON_FORMAT_STRINGUTILITIES_HPP_ */ diff --git a/src/coreComponents/fileIO/Table/TableData.cpp b/src/coreComponents/common/format/table/TableData.cpp similarity index 100% rename from src/coreComponents/fileIO/Table/TableData.cpp rename to src/coreComponents/common/format/table/TableData.cpp diff --git a/src/coreComponents/fileIO/Table/TableData.hpp b/src/coreComponents/common/format/table/TableData.hpp similarity index 95% rename from src/coreComponents/fileIO/Table/TableData.hpp rename to src/coreComponents/common/format/table/TableData.hpp index 67ce37cafb3..005e3dda7bc 100644 --- a/src/coreComponents/fileIO/Table/TableData.hpp +++ b/src/coreComponents/common/format/table/TableData.hpp @@ -17,11 +17,11 @@ * @file TableData.hpp */ -#ifndef GEOS_COMMON_TableData_HPP -#define GEOS_COMMON_TableData_HPP +#ifndef GEOS_COMMON_FORMAT_TABLE_TABLEDATA_HPP +#define GEOS_COMMON_FORMAT_TABLE_TABLEDATA_HPP #include "common/DataTypes.hpp" -#include "common/Format.hpp" +#include "common/format/Format.hpp" namespace geos { @@ -144,4 +144,4 @@ void TableData2D::addCell( real64 const rowValue, real64 const columnValue, T co } } -#endif +#endif /* GEOS_COMMON_FORMAT_TABLE_TABLEDATA_HPP */ diff --git a/src/coreComponents/fileIO/Table/TableFormatter.cpp b/src/coreComponents/common/format/table/TableFormatter.cpp similarity index 99% rename from src/coreComponents/fileIO/Table/TableFormatter.cpp rename to src/coreComponents/common/format/table/TableFormatter.cpp index d6e145b6a9c..13956a41cd0 100644 --- a/src/coreComponents/fileIO/Table/TableFormatter.cpp +++ b/src/coreComponents/common/format/table/TableFormatter.cpp @@ -18,7 +18,7 @@ */ #include -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" #include "TableFormatter.hpp" namespace geos { diff --git a/src/coreComponents/fileIO/Table/TableFormatter.hpp b/src/coreComponents/common/format/table/TableFormatter.hpp similarity index 97% rename from src/coreComponents/fileIO/Table/TableFormatter.hpp rename to src/coreComponents/common/format/table/TableFormatter.hpp index b06a136e687..21ddc8c5b11 100644 --- a/src/coreComponents/fileIO/Table/TableFormatter.hpp +++ b/src/coreComponents/common/format/table/TableFormatter.hpp @@ -17,8 +17,8 @@ * @file TableFormatter.hpp */ -#ifndef GEOS_COMMON_TABLEFORMATTER_HPP -#define GEOS_COMMON_TABLEFORMATTER_HPP +#ifndef GEOS_COMMON_FORMAT_TABLE_TABLEFORMATTER_HPP +#define GEOS_COMMON_FORMAT_TABLE_TABLEFORMATTER_HPP #include "TableData.hpp" #include "TableLayout.hpp" @@ -219,4 +219,4 @@ class TableTextFormatter : public TableFormatter }; } -#endif +#endif /* GEOS_COMMON_FORMAT_TABLE_TABLEFORMATTER_HPP */ diff --git a/src/coreComponents/fileIO/Table/TableLayout.cpp b/src/coreComponents/common/format/table/TableLayout.cpp similarity index 100% rename from src/coreComponents/fileIO/Table/TableLayout.cpp rename to src/coreComponents/common/format/table/TableLayout.cpp diff --git a/src/coreComponents/fileIO/Table/TableLayout.hpp b/src/coreComponents/common/format/table/TableLayout.hpp similarity index 96% rename from src/coreComponents/fileIO/Table/TableLayout.hpp rename to src/coreComponents/common/format/table/TableLayout.hpp index 9c45c727b22..1c4608e3ea5 100644 --- a/src/coreComponents/fileIO/Table/TableLayout.hpp +++ b/src/coreComponents/common/format/table/TableLayout.hpp @@ -17,8 +17,8 @@ * @file TableLayout.hpp */ -#ifndef GEOS_COMMON_TABLELAYOUT_HPP -#define GEOS_COMMON_TABLELAYOUT_HPP +#ifndef GEOS_COMMON_FORMAT_TABLE_TABLELAYOUT_HPP +#define GEOS_COMMON_FORMAT_TABLE_TABLELAYOUT_HPP #include "common/DataTypes.hpp" @@ -154,4 +154,4 @@ class TableLayout }; } -#endif +#endif /* GEOS_COMMON_FORMAT_TABLE_TABLELAYOUT_HPP */ diff --git a/src/coreComponents/fileIO/Table/unitTests/CMakeLists.txt b/src/coreComponents/common/format/table/unitTests/CMakeLists.txt similarity index 90% rename from src/coreComponents/fileIO/Table/unitTests/CMakeLists.txt rename to src/coreComponents/common/format/table/unitTests/CMakeLists.txt index 4db71486656..f5a4a358e97 100644 --- a/src/coreComponents/fileIO/Table/unitTests/CMakeLists.txt +++ b/src/coreComponents/common/format/table/unitTests/CMakeLists.txt @@ -2,7 +2,7 @@ set( gtest_geosx_tests testTable.cpp ) -set( dependencyList gtest fileIO ${parallelDeps} ) +set( dependencyList gtest common ${parallelDeps} ) # Add gtest C++ based tests foreach(test ${gtest_geosx_tests}) diff --git a/src/coreComponents/fileIO/Table/unitTests/testTable.cpp b/src/coreComponents/common/format/table/unitTests/testTable.cpp similarity index 99% rename from src/coreComponents/fileIO/Table/unitTests/testTable.cpp rename to src/coreComponents/common/format/table/unitTests/testTable.cpp index 0a5f0194680..37c78d01db6 100644 --- a/src/coreComponents/fileIO/Table/unitTests/testTable.cpp +++ b/src/coreComponents/common/format/table/unitTests/testTable.cpp @@ -14,9 +14,9 @@ */ // Source includes -#include "fileIO/Table/TableData.hpp" -#include "fileIO/Table/TableFormatter.hpp" -#include "fileIO/Table/TableLayout.hpp" +#include "common/format/table/TableData.hpp" +#include "common/format/table/TableFormatter.hpp" +#include "common/format/table/TableLayout.hpp" #include "dataRepository/Group.hpp" // TPL includes #include diff --git a/src/coreComponents/common/format/unitTests/CMakeLists.txt b/src/coreComponents/common/format/unitTests/CMakeLists.txt new file mode 100644 index 00000000000..1684cd24bee --- /dev/null +++ b/src/coreComponents/common/format/unitTests/CMakeLists.txt @@ -0,0 +1,19 @@ +# Specify list of tests +set( testSources + testStringUtilities.cpp ) + +set( dependencyList gtest common ${parallelDeps} ) + +# Add gtest C++ based tests +foreach( test ${testSources} ) + + get_filename_component( test_name ${test} NAME_WE ) + blt_add_executable( NAME ${test_name} + SOURCES ${test} + OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} + DEPENDS_ON ${dependencyList} ) + + geos_add_test( NAME ${test_name} + COMMAND ${test_name} ) + +endforeach() diff --git a/src/coreComponents/codingUtilities/tests/testStringUtilities.cpp b/src/coreComponents/common/format/unitTests/testStringUtilities.cpp similarity index 100% rename from src/coreComponents/codingUtilities/tests/testStringUtilities.cpp rename to src/coreComponents/common/format/unitTests/testStringUtilities.cpp diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 61624d55420..03bf8bfcea0 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -18,9 +18,7 @@ #include "TimingMacros.hpp" #include "Path.hpp" #include "LvArray/src/system.hpp" -#include "fileIO/Table/TableLayout.hpp" -#include "fileIO/Table/TableData.hpp" -#include "fileIO/Table/TableFormatter.hpp" +#include "common/format/table/TableFormatter.hpp" #include "common/LifoStorageCommon.hpp" #include "common/MemoryInfos.hpp" #include diff --git a/src/coreComponents/common/Logger.cpp b/src/coreComponents/common/logger/Logger.cpp similarity index 98% rename from src/coreComponents/common/Logger.cpp rename to src/coreComponents/common/logger/Logger.cpp index 77a8946b000..c730e8168ad 100644 --- a/src/coreComponents/common/Logger.cpp +++ b/src/coreComponents/common/logger/Logger.cpp @@ -19,8 +19,8 @@ // Source includes #include "Logger.hpp" -#include "Path.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/Path.hpp" +#include "common/format/StringUtilities.hpp" namespace geos { diff --git a/src/coreComponents/common/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp similarity index 99% rename from src/coreComponents/common/Logger.hpp rename to src/coreComponents/common/logger/Logger.hpp index 75ac08d2375..017a6599a88 100644 --- a/src/coreComponents/common/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -23,7 +23,7 @@ // Source incldes #include "common/GeosxConfig.hpp" #include "common/GeosxMacros.hpp" -#include "common/Format.hpp" +#include "common/format/Format.hpp" #include "LvArray/src/Macros.hpp" // System includes diff --git a/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp b/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp index 6430e1dfa78..631b32d6b2f 100644 --- a/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp +++ b/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp @@ -20,6 +20,7 @@ #define GEOS_CONSTITUTIVEPASSTHRUHANDLER_HPP #include "codingUtilities/traits.hpp" +#include "codingUtilities/RTTypes.hpp" #include "common/DataTypes.hpp" namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp index 1e314cbe6ee..8bae9da6bd3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp @@ -20,6 +20,7 @@ #include "constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp" #include "common/Units.hpp" +#include "common/logger/Logger.hpp" namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp index 346d520acd3..1d93b628265 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp @@ -19,8 +19,8 @@ #include "common/DataTypes.hpp" #include "common/Units.hpp" - -#include "codingUtilities/StringUtilities.hpp" +#include "common/logger/Logger.hpp" +#include "common/format/StringUtilities.hpp" #ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_FUNCTIONS_PVTFUNCTIONHELPERS_HPP_ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_FUNCTIONS_PVTFUNCTIONHELPERS_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp index 21cc399b274..8a987d2168b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp @@ -27,7 +27,7 @@ #include "fileIO/Outputs/OutputBase.hpp" #include "functions/FunctionManager.hpp" #include "functions/TableFunction.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" #include diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp index 7b3a860bf37..d992157f521 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp @@ -21,6 +21,7 @@ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_FUNCTIONS_CUBICEOSPHASEMODEL_HPP_ #include "common/DataTypes.hpp" +#include "common/logger/Logger.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" #include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp" diff --git a/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp b/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp index eb8a32de7a9..bd0584af82c 100644 --- a/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp +++ b/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp @@ -26,11 +26,15 @@ #ifndef GEOS_CONSTITUTIVE_SOLID_DAMAGESPECTRALUTILITIES_HPP_ #define GEOS_CONSTITUTIVE_SOLID_DAMAGESPECTRALUTILITIES_HPP_ + #include #include #include #include "LvArray/src/output.hpp" #include "LvArray/src/tensorOps.hpp" +#include "common/DataTypes.hpp" +#include "common/logger/Logger.hpp" + namespace geos { diff --git a/src/coreComponents/dataRepository/BufferOps.hpp b/src/coreComponents/dataRepository/BufferOps.hpp index 5b460851747..65ff284d676 100644 --- a/src/coreComponents/dataRepository/BufferOps.hpp +++ b/src/coreComponents/dataRepository/BufferOps.hpp @@ -19,6 +19,7 @@ #define GEOS_DATAREPOSITORY_BUFFEROPS_HPP_ #include "common/DataTypes.hpp" +#include "common/logger/Logger.hpp" #include "codingUtilities/Utilities.hpp" #include "codingUtilities/traits.hpp" #include "LvArray/src/limits.hpp" diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index 99893bc77f7..403b2fb5e55 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -21,9 +21,9 @@ #define GEOS_DATAREPOSITORY_DATACONTEXT_HPP_ #include "common/DataTypes.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include "xmlWrapper.hpp" -#include "common/Format.hpp" +#include "common/format/Format.hpp" namespace geos { diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index dccbc2441f8..e420631f5ff 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -16,7 +16,7 @@ // Source includes #include "Group.hpp" #include "ConduitRestart.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" #include "codingUtilities/Utilities.hpp" #include "common/TimingMacros.hpp" #include "GroupContext.hpp" diff --git a/src/coreComponents/dataRepository/HistoryDataSpec.hpp b/src/coreComponents/dataRepository/HistoryDataSpec.hpp index 01930b3e935..3fd0d56b3a5 100644 --- a/src/coreComponents/dataRepository/HistoryDataSpec.hpp +++ b/src/coreComponents/dataRepository/HistoryDataSpec.hpp @@ -22,6 +22,7 @@ #include "codingUtilities/traits.hpp" #include "common/DataTypes.hpp" +#include "common/logger/Logger.hpp" #include "LvArray/src/Array.hpp" namespace geos diff --git a/src/coreComponents/dataRepository/InputFlags.hpp b/src/coreComponents/dataRepository/InputFlags.hpp index f40d868a278..72dc4d862b2 100644 --- a/src/coreComponents/dataRepository/InputFlags.hpp +++ b/src/coreComponents/dataRepository/InputFlags.hpp @@ -21,7 +21,7 @@ #define GEOS_DATAREPOSITORY_INPUTFLAGS_HPP_ #include "common/DataTypes.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" namespace geos { diff --git a/src/coreComponents/dataRepository/MappedVector.hpp b/src/coreComponents/dataRepository/MappedVector.hpp index a10c1d93870..82fd0d6f3b3 100644 --- a/src/coreComponents/dataRepository/MappedVector.hpp +++ b/src/coreComponents/dataRepository/MappedVector.hpp @@ -23,7 +23,7 @@ // Source includes #include "KeyIndexT.hpp" #include "common/GeosxMacros.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include "LvArray/src/limits.hpp" // System includes diff --git a/src/coreComponents/dataRepository/ObjectCatalog.hpp b/src/coreComponents/dataRepository/ObjectCatalog.hpp index 399f4270a4a..71c7d7a2f84 100644 --- a/src/coreComponents/dataRepository/ObjectCatalog.hpp +++ b/src/coreComponents/dataRepository/ObjectCatalog.hpp @@ -27,8 +27,8 @@ * of a */ -#include "common/Logger.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/logger/Logger.hpp" +#include "common/format/StringUtilities.hpp" #include "LvArray/src/system.hpp" #include diff --git a/src/coreComponents/dataRepository/RestartFlags.hpp b/src/coreComponents/dataRepository/RestartFlags.hpp index a37b98f038f..c827ee4d0bb 100644 --- a/src/coreComponents/dataRepository/RestartFlags.hpp +++ b/src/coreComponents/dataRepository/RestartFlags.hpp @@ -13,13 +13,15 @@ * ------------------------------------------------------------------------------------------------------------ */ -#ifndef GEOS_DATAREPOSITORY_RESTARTFLAGS_HPP_ -#define GEOS_DATAREPOSITORY_RESTARTFLAGS_HPP_ - /** * @file RestartFlags.hpp */ +#ifndef GEOS_DATAREPOSITORY_RESTARTFLAGS_HPP_ +#define GEOS_DATAREPOSITORY_RESTARTFLAGS_HPP_ + +#include "common/logger/Logger.hpp" + namespace geos { namespace dataRepository diff --git a/src/coreComponents/dataRepository/xmlWrapper.cpp b/src/coreComponents/dataRepository/xmlWrapper.cpp index 73fc7ad410b..4b4759980a0 100644 --- a/src/coreComponents/dataRepository/xmlWrapper.cpp +++ b/src/coreComponents/dataRepository/xmlWrapper.cpp @@ -21,7 +21,7 @@ #include "xmlWrapper.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" #include "common/MpiWrapper.hpp" #include "dataRepository/KeyNames.hpp" diff --git a/src/coreComponents/dataRepository/xmlWrapper.hpp b/src/coreComponents/dataRepository/xmlWrapper.hpp index 04a27502343..f73f3ecaa7e 100644 --- a/src/coreComponents/dataRepository/xmlWrapper.hpp +++ b/src/coreComponents/dataRepository/xmlWrapper.hpp @@ -26,7 +26,8 @@ #include "common/GEOS_RAJA_Interface.hpp" #include "LvArray/src/output.hpp" #include "LvArray/src/input.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" +#include "codingUtilities/RTTypes.hpp" // TPL includes #include diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp index 4f5f5dc9001..e9831519596 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp @@ -23,6 +23,8 @@ // BLAS and LAPACK function declaration #include "denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h" +#include "common/logger/Logger.hpp" + #include // Put everything under the geos namespace. diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp index 343bb7e2d5d..5fc85de2864 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp @@ -19,6 +19,7 @@ // Source includes #include "denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp" +#include "common/logger/Logger.hpp" #include "gtest/gtest.h" diff --git a/src/coreComponents/events/PeriodicEvent.cpp b/src/coreComponents/events/PeriodicEvent.cpp index 2ead548c7aa..88d24228199 100644 --- a/src/coreComponents/events/PeriodicEvent.cpp +++ b/src/coreComponents/events/PeriodicEvent.cpp @@ -19,7 +19,7 @@ #include "PeriodicEvent.hpp" -#include "common/Format.hpp" +#include "common/format/Format.hpp" #include "functions/FunctionManager.hpp" namespace geos diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp index e284099013e..b24582179e4 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp @@ -15,7 +15,7 @@ #include "FieldSpecificationManager.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" #include "constitutive/ConstitutiveManager.hpp" namespace geos diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp index 9e1fcc59390..5ce5f1f9e01 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp @@ -22,7 +22,7 @@ #include "FieldSpecificationBase.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" #include "common/DataTypes.hpp" #include "common/TimingMacros.hpp" #include "mesh/ObjectManagerBase.hpp" diff --git a/src/coreComponents/fileIO/CMakeLists.txt b/src/coreComponents/fileIO/CMakeLists.txt index 41467c67358..84c758fa2b2 100644 --- a/src/coreComponents/fileIO/CMakeLists.txt +++ b/src/coreComponents/fileIO/CMakeLists.txt @@ -6,9 +6,6 @@ set( fileIO_headers Outputs/OutputUtilities.hpp Outputs/PythonOutput.hpp Outputs/RestartOutput.hpp - Table/TableLayout.hpp - Table/TableFormatter.hpp - Table/TableData.hpp Outputs/TimeHistoryOutput.hpp timeHistory/HDFFile.hpp timeHistory/HistoryCollectionBase.hpp @@ -25,9 +22,6 @@ set( fileIO_sources Outputs/OutputUtilities.cpp Outputs/PythonOutput.cpp Outputs/RestartOutput.cpp - Table/TableLayout.cpp - Table/TableFormatter.cpp - Table/TableData.cpp Outputs/TimeHistoryOutput.cpp timeHistory/HDFFile.cpp timeHistory/HistoryCollectionBase.cpp @@ -94,9 +88,6 @@ blt_add_library( NAME fileIO target_include_directories( fileIO PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) -if( GEOS_ENABLE_TESTS ) - add_subdirectory( Table/unitTests ) -endif() diff --git a/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp b/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp index 71814f162c3..a52c011ff57 100644 --- a/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp @@ -19,7 +19,7 @@ #include "OutputUtilities.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include "mesh/ElementRegionManager.hpp" #include "mesh/NodeManager.hpp" diff --git a/src/coreComponents/fileIO/silo/SiloFile.cpp b/src/coreComponents/fileIO/silo/SiloFile.cpp index 73c5533c44e..4abcb5894d4 100644 --- a/src/coreComponents/fileIO/silo/SiloFile.cpp +++ b/src/coreComponents/fileIO/silo/SiloFile.cpp @@ -25,7 +25,7 @@ #include "codingUtilities/Utilities.hpp" #include "common/DataTypes.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include "common/MpiWrapper.hpp" #include "common/TypeDispatch.hpp" #include "constitutive/ConstitutiveManager.hpp" diff --git a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp index 9a2b70c2def..8d76f38e243 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp +++ b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp @@ -20,6 +20,7 @@ #include "dataRepository/HistoryDataSpec.hpp" #include "BufferedHistoryIO.hpp" #include "common/DataTypes.hpp" +#include "common/MpiWrapper.hpp" #include diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp index 29df130fb63..81b2ee70fd4 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp @@ -16,7 +16,7 @@ // Source includes #include "VTKPolyDataWriterInterface.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include "common/TypeDispatch.hpp" #include "dataRepository/Group.hpp" #include "mesh/DomainPartition.hpp" diff --git a/src/coreComponents/linearAlgebra/common/common.hpp b/src/coreComponents/linearAlgebra/common/common.hpp index 236e7811eba..214441231c3 100644 --- a/src/coreComponents/linearAlgebra/common/common.hpp +++ b/src/coreComponents/linearAlgebra/common/common.hpp @@ -20,6 +20,7 @@ #define GEOS_LINEARALGEBRA_INTERFACES_COMMON_HPP_ #include "common/DataTypes.hpp" +#include "common/logger/Logger.hpp" /** * Whether to check preconditions at runtime in LAI functions diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp index bca0578a432..874a84a4475 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp @@ -19,6 +19,7 @@ #include "EpetraMatrix.hpp" +#include "codingUtilities/RTTypes.hpp" #include "codingUtilities/Utilities.hpp" #include "linearAlgebra/interfaces/trilinos/EpetraUtils.hpp" diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp index 02016e5ffd0..27e891d88c9 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp @@ -19,6 +19,7 @@ #include "EpetraVector.hpp" +#include "codingUtilities/RTTypes.hpp" #include "codingUtilities/Utilities.hpp" #include "linearAlgebra/interfaces/trilinos/EpetraUtils.hpp" diff --git a/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp b/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp index 820a119692e..c7aa5f5ad4a 100644 --- a/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp +++ b/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp @@ -21,7 +21,7 @@ #define GEOS_LINEARALGEBRA_UTILITIES_COMPONENTMASK_HPP_ #include "common/GeosxMacros.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include diff --git a/src/coreComponents/mainInterface/GeosxState.hpp b/src/coreComponents/mainInterface/GeosxState.hpp index ecefd151fa4..8d6866827d7 100644 --- a/src/coreComponents/mainInterface/GeosxState.hpp +++ b/src/coreComponents/mainInterface/GeosxState.hpp @@ -22,6 +22,7 @@ // Source includes #include "common/DataTypes.hpp" +#include "common/logger/Logger.hpp" // System includes #include diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 90a57dcb56e..ff063aa555a 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -20,7 +20,7 @@ #include "GeosxState.hpp" #include "initialization.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" #include "common/Path.hpp" #include "common/TimingMacros.hpp" #include "constitutive/ConstitutiveManager.hpp" diff --git a/src/coreComponents/mainInterface/version.cpp b/src/coreComponents/mainInterface/version.cpp index 196fef6739d..eb74e831080 100644 --- a/src/coreComponents/mainInterface/version.cpp +++ b/src/coreComponents/mainInterface/version.cpp @@ -14,7 +14,7 @@ */ #include "common/GeosxConfig.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include "mainInterface/GeosxVersion.hpp" namespace geos diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index a397986186c..7942f825f29 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -20,7 +20,7 @@ #include "FaceManager.hpp" #include "common/GEOS_RAJA_Interface.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include "common/TimingMacros.hpp" #include "LvArray/src/tensorOps.hpp" #include "mesh/BufferOps.hpp" diff --git a/src/coreComponents/mesh/FieldIdentifiers.hpp b/src/coreComponents/mesh/FieldIdentifiers.hpp index 77348072190..9d78e471933 100644 --- a/src/coreComponents/mesh/FieldIdentifiers.hpp +++ b/src/coreComponents/mesh/FieldIdentifiers.hpp @@ -21,7 +21,8 @@ #define GEOS_MESH_MPICOMMUNICATIONS_FIELDIDENTIFIERS_HPP_ #include "common/DataTypes.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" +#include "common/logger/Logger.hpp" namespace geos { diff --git a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp index 8d368dd0d67..d38d25db874 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp +++ b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp @@ -27,7 +27,7 @@ #include // NOTE: do NOT include anything from GEOS here. -// In particular, nothing that directly or transitively includes "common/Format.hpp". +// In particular, nothing that directly or transitively includes "common/format/Format.hpp". // The reason is "diy2" library includes an older version of {fmt} than the one used by GEOS. // Collision of includes leads to all kinds of impossible to fix compilation errors. // Thankfully, no link errors, owing to namespace versioning employed by {fmt}. diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index 2266865df4d..2b96c0755d3 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -18,10 +18,8 @@ #include "mesh/Perforation.hpp" #include "mesh/generators/LineBlockABC.hpp" #include "LvArray/src/genericTensorOps.hpp" -#include "fileIO/Table/TableLayout.hpp" -#include "fileIO/Table/TableData.hpp" -#include "fileIO/Table/TableFormatter.hpp" -#include "common/Format.hpp" +#include "common/format/table/TableFormatter.hpp" +#include "common/format/Format.hpp" namespace geos { using namespace dataRepository; diff --git a/src/coreComponents/mesh/mpiCommunications/CommID.cpp b/src/coreComponents/mesh/mpiCommunications/CommID.cpp index b7150525b3d..b4310c23fb8 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommID.cpp +++ b/src/coreComponents/mesh/mpiCommunications/CommID.cpp @@ -15,7 +15,7 @@ #include "CommID.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include diff --git a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp index af81576df1e..a4b2665b9c3 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp @@ -21,7 +21,7 @@ #define GEOS_MESH_SIMPLEGEOMETRICOBJECTS_SIMPLEGEOMETRICOBJECTBASE_HPP_ #include "dataRepository/Group.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" #include "dataRepository/ObjectCatalog.hpp" class Function; diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp index 61895d45695..153703c0eb0 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp @@ -18,7 +18,7 @@ */ #include "LinearSolverParameters.hpp" -#include "fileIO/Table/TableFormatter.hpp" +#include "common/format/table/TableFormatter.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp index b7878d79081..8316485d56f 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp @@ -14,8 +14,8 @@ */ #include "NonlinearSolverParameters.hpp" -#include "common/Logger.hpp" -#include "fileIO/Table/TableFormatter.hpp" +#include "common/logger/Logger.hpp" +#include "common/format/table/TableFormatter.hpp" namespace geos { diff --git a/src/coreComponents/schema/schemaUtilities.cpp b/src/coreComponents/schema/schemaUtilities.cpp index 80a657db4a2..4be8a32ab5d 100644 --- a/src/coreComponents/schema/schemaUtilities.cpp +++ b/src/coreComponents/schema/schemaUtilities.cpp @@ -20,7 +20,7 @@ /// Source includes #include "schemaUtilities.hpp" -#include "codingUtilities/StringUtilities.hpp" +#include "common/format/StringUtilities.hpp" #include "common/DataTypes.hpp" #include "dataRepository/Group.hpp" #include "dataRepository/InputFlags.hpp" diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp index 2d7f0631b71..365e1c1124b 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp @@ -17,7 +17,7 @@ // Source includes #include "dataRepository/ObjectCatalog.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include "mainInterface/initialization.hpp" // TPL includes diff --git a/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp b/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp index aa5fd0b8b5a..fa265348074 100644 --- a/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp +++ b/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp @@ -15,7 +15,7 @@ // Source includes #include "codingUtilities/UnitTestUtilities.hpp" -#include "common/Logger.hpp" +#include "common/logger/Logger.hpp" #include "finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp" #include "finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp" #include "finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp" diff --git a/src/main/main.cpp b/src/main/main.cpp index 731496fb5b0..375b456aadf 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -15,7 +15,7 @@ // Source includes #include "common/DataTypes.hpp" -#include "common/Format.hpp" +#include "common/format/Format.hpp" #include "common/TimingMacros.hpp" #include "common/Units.hpp" #include "mainInterface/initialization.hpp" From 159830248639976e2191081bcaa8b11ad826097f Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Mon, 5 Aug 2024 16:20:05 -1000 Subject: [PATCH 154/286] fix: testUnits failure on MacOS (#3269) * change the SystemClock from std::chrono::system_clock to std::chrono::high_resolution_clock to avoid truncation problems on MacOS --- src/coreComponents/common/Units.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/common/Units.hpp b/src/coreComponents/common/Units.hpp index 4749c89ad4a..ad49a1d30ce 100644 --- a/src/coreComponents/common/Units.hpp +++ b/src/coreComponents/common/Units.hpp @@ -182,7 +182,7 @@ inline string formatValue( real64 value, Unit unit ) /// Clock in use in GEOS to manipulate system times. -using SystemClock = std::chrono::system_clock; +using SystemClock = std::chrono::high_resolution_clock; /// One year = 365.2425 days (= 146097 / 400) following the Gregorian calendar and the C++ convention. using YearDaysRatio = std::ratio< 146097, 400 >; From 69727912de203077e83ba20a0cd724f785e7136d Mon Sep 17 00:00:00 2001 From: MelReyCG <122801580+MelReyCG@users.noreply.github.com> Date: Tue, 6 Aug 2024 04:33:50 +0200 Subject: [PATCH 155/286] feat: Transmissibility output (#3091) * added transmissibility unit * Added Cell-To-Cell output * Add the logLevel viewkey & description (cherrypick from feature/rey/sourceflux-stats) * Refactor the StencilOutput so the PackCollection can read it. Point is to allow to do an HDF output, and remove the CSV one. * Changing the Problem sub-groups init order so the outputs are at the end. Point is to solve a bug where the StencilDataCollection buffer size are not known for the HDF chunk sizes. * freeOnDevice fix test --- ...eadoil_3ph_staircase_3d_transmi_output.xml | 81 ++++ src/coreComponents/common/Units.hpp | 96 ++--- src/coreComponents/common/logger/Logger.hpp | 17 + src/coreComponents/dataRepository/Group.hpp | 16 +- .../fileIO/timeHistory/PackCollection.cpp | 3 +- .../finiteVolume/docs/StencilModel.plantuml | 362 ++++++++++++++++++ .../mainInterface/ProblemManager.cpp | 27 +- .../physicsSolvers/fluidFlow/CMakeLists.txt | 2 + .../fluidFlow/StencilDataCollection.cpp | 296 ++++++++++++++ .../fluidFlow/StencilDataCollection.hpp | 178 +++++++++ .../CoupledReservoirAndWellsBase.hpp | 4 +- .../schema/docs/CellToCellDataCollection.rst | 12 + .../docs/CellToCellDataCollection_other.rst | 12 + src/coreComponents/schema/docs/Tasks.rst | 1 + .../schema/docs/Tasks_other.rst | 1 + src/coreComponents/schema/schema.xsd | 15 + src/coreComponents/schema/schema.xsd.other | 11 + .../unitTests/fluidFlowTests/CMakeLists.txt | 3 +- .../fluidFlowTests/testTransmissibility.cpp | 332 ++++++++++++++++ src/docs/sphinx/CompleteXMLSchema.rst | 14 + 20 files changed, 1418 insertions(+), 65 deletions(-) create mode 100644 inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d_transmi_output.xml create mode 100644 src/coreComponents/finiteVolume/docs/StencilModel.plantuml create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.hpp create mode 100644 src/coreComponents/schema/docs/CellToCellDataCollection.rst create mode 100644 src/coreComponents/schema/docs/CellToCellDataCollection_other.rst create mode 100644 src/coreComponents/unitTests/fluidFlowTests/testTransmissibility.cpp diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d_transmi_output.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d_transmi_output.xml new file mode 100644 index 00000000000..121881e8650 --- /dev/null +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_staircase_3d_transmi_output.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/common/Units.hpp b/src/coreComponents/common/Units.hpp index ad49a1d30ce..9b28532f0eb 100644 --- a/src/coreComponents/common/Units.hpp +++ b/src/coreComponents/common/Units.hpp @@ -96,6 +96,9 @@ enum Unit : integer /// Mole rate in mol/s MoleRate, + + /// Transmissibility in m2/s + Transmissibility, }; @@ -107,21 +110,22 @@ constexpr inline std::string_view getDescription( Unit unit ) { switch( unit ) { - default: return "unknown [?]"; - case Dimensionless: return "dimensionless [1]"; - case Pressure: return "pressure [Pa]"; - case Temperature: return "temperature [K]"; - case TemperatureInC: return "temperature [C]"; - case Distance: return "distance [m]"; - case Time: return "time [s]"; - case Viscosity: return "viscosity [Pa*s]"; - case Enthalpy: return "enthalpy [J/kg]"; - case Density: return "density [kg/m3]"; - case Solubility: return "solubility [g/L]"; - case Mass: return "mass [kg]"; - case Mole: return "mole [mol]"; - case MassRate: return "mass rate [kg/s]"; - case MoleRate: return "mole rate [mol/s]"; + default: return "unknown [?]"; + case Dimensionless: return "dimensionless [1]"; + case Pressure: return "pressure [Pa]"; + case Temperature: return "temperature [K]"; + case TemperatureInC: return "temperature [C]"; + case Distance: return "distance [m]"; + case Time: return "time [s]"; + case Viscosity: return "viscosity [Pa*s]"; + case Enthalpy: return "enthalpy [J/kg]"; + case Density: return "density [kg/m3]"; + case Solubility: return "solubility [g/L]"; + case Mass: return "mass [kg]"; + case Mole: return "mole [mol]"; + case MassRate: return "mass rate [kg/s]"; + case MoleRate: return "mole rate [mol/s]"; + case Transmissibility: return "transmissibility [(Pa*s*rm3/s)/Pa]"; } } @@ -133,21 +137,22 @@ constexpr inline std::string_view getSymbol( Unit unit ) { switch( unit ) { - default: return "?"; - case Dimensionless: return "1"; - case Pressure: return "Pa"; - case Temperature: return "K"; - case TemperatureInC: return "C"; - case Distance: return "m"; - case Time: return "s"; - case Viscosity: return "Pa*s"; - case Enthalpy: return "J/kg"; - case Density: return "kg/m3"; - case Solubility: return "g/L"; - case Mass: return "kg"; - case Mole: return "mol"; - case MassRate: return "kg/s"; - case MoleRate: return "mol/s"; + default: return "?"; + case Dimensionless: return "1"; + case Pressure: return "Pa"; + case Temperature: return "K"; + case TemperatureInC: return "C"; + case Distance: return "m"; + case Time: return "s"; + case Viscosity: return "Pa*s"; + case Enthalpy: return "J/kg"; + case Density: return "kg/m3"; + case Solubility: return "g/L"; + case Mass: return "kg"; + case Mole: return "mol"; + case MassRate: return "kg/s"; + case MoleRate: return "mol/s"; + case Transmissibility: return "(Pa*s*rm3/s)/Pa"; } } @@ -162,21 +167,22 @@ inline string formatValue( real64 value, Unit unit ) { switch( unit ) { - default: return GEOS_FMT( "value of {} [?]", value ); - case Dimensionless: return GEOS_FMT( "value of {} [1]", value ); - case Pressure: return GEOS_FMT( "pressure of {} [Pa]", value ); - case Temperature: return GEOS_FMT( "temperature of {} [K]", value ); - case TemperatureInC: return GEOS_FMT( "temperature of {} [K]", convertCToK( value ) ); - case Distance: return GEOS_FMT( "distance of {} [s]", value ); - case Time: return GEOS_FMT( "time of {} [s]", value ); - case Viscosity: return GEOS_FMT( "viscosity of {} [Pa*s]", value ); - case Enthalpy: return GEOS_FMT( "enthalpy of {} [J/kg]", value ); - case Density: return GEOS_FMT( "density of {} [kg/m3]", value ); - case Solubility: return GEOS_FMT( "solubility of {} [g/L]", value ); - case Mass: return GEOS_FMT( "mass of {} [kg]", value ); - case Mole: return GEOS_FMT( "mole of {} [mol]", value ); - case MassRate: return GEOS_FMT( "mass rate of {} [kg/s]", value ); - case MoleRate: return GEOS_FMT( "mole rate of {} [mol/s]", value ); + default: return GEOS_FMT( "value of {} [?]", value ); + case Dimensionless: return GEOS_FMT( "value of {} [1]", value ); + case Pressure: return GEOS_FMT( "pressure of {} [Pa]", value ); + case Temperature: return GEOS_FMT( "temperature of {} [K]", value ); + case TemperatureInC: return GEOS_FMT( "temperature of {} [K]", convertCToK( value ) ); + case Distance: return GEOS_FMT( "distance of {} [s]", value ); + case Time: return GEOS_FMT( "time of {} [s]", value ); + case Viscosity: return GEOS_FMT( "viscosity of {} [Pa*s]", value ); + case Enthalpy: return GEOS_FMT( "enthalpy of {} [J/kg]", value ); + case Density: return GEOS_FMT( "density of {} [kg/m3]", value ); + case Solubility: return GEOS_FMT( "solubility of {} [g/L]", value ); + case Mass: return GEOS_FMT( "mass of {} [kg]", value ); + case Mole: return GEOS_FMT( "mole of {} [mol]", value ); + case MassRate: return GEOS_FMT( "mass rate of {} [kg/s]", value ); + case MoleRate: return GEOS_FMT( "mole rate of {} [mol/s]", value ); + case Transmissibility: return GEOS_FMT( "transmissibility of {} [(Pa*s*rm3/s)/Pa]", value ); } } diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 017a6599a88..2988677aaa8 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -536,6 +536,23 @@ struct SimulationError : public std::runtime_error SimulationError( std::exception const & subException, std::string const & msgToInsert ); }; +/** + * @brief Exception class used to report errors from type conversion + * @todo (ErrorManager EPIC #2940) Consider adding a way to precise custom exception parameters, to add + * expected & encountered typeid for this one (in order to manage the exception output more precisely). + * We could also manage this by having: BadTypeErrorABC <|--- BadTypeError< T > /!\ compilation time + */ +struct BadTypeError : public std::runtime_error +{ + /** + * @brief Constructor + * @param what the error message + */ + BadTypeError( std::string const & what ): + std::runtime_error( what ) + {} +}; + /** * @brief Exception class used for special control flow. */ diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index b6d6ff08cfd..afae64bde36 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -338,8 +338,12 @@ class Group "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), std::domain_error ); - - return dynamicCast< T & >( *child ); + T * const castedChild = dynamicCast< T * >( child ); + GEOS_THROW_IF( castedChild == nullptr, + GEOS_FMT( "{} was expected to be a '{}'.", + child->getDataContext(), LvArray::system::demangleType< T >() ), + BadTypeError ); + return *castedChild; } /** @@ -353,8 +357,12 @@ class Group "Group " << getDataContext() << " has no child named " << key << std::endl << dumpSubGroupsNames(), std::domain_error ); - - return dynamicCast< T const & >( *child ); + T const * const castedChild = dynamicCast< T const * >( child ); + GEOS_THROW_IF( castedChild == nullptr, + GEOS_FMT( "{} was expected to be a '{}'.", + child->getDataContext(), LvArray::system::demangleType< T >() ), + BadTypeError ); + return *castedChild; } /** diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp index d2302b5a949..14b06f61a0b 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp @@ -72,6 +72,7 @@ void PackCollection::initializePostSubGroups( ) { // coord meta collectors should have m_disableCoordCollection == true to avoid // infinite recursive init calls here + // (side note: should we create a m_isMetaCollector field to prevent any confusion?) metaCollector->initializePostSubGroups(); } m_initialized = true; @@ -255,7 +256,7 @@ localIndex PackCollection::numMetaDataCollectors() const void PackCollection::buildMetaDataCollectors() { - if( !m_disableCoordCollection ) + if( !m_disableCoordCollection && m_targetIsMeshObject ) { char const * coordField = nullptr; if( m_objectPath.find( "nodeManager" ) != string::npos ) diff --git a/src/coreComponents/finiteVolume/docs/StencilModel.plantuml b/src/coreComponents/finiteVolume/docs/StencilModel.plantuml new file mode 100644 index 00000000000..fa7b49c49b4 --- /dev/null +++ b/src/coreComponents/finiteVolume/docs/StencilModel.plantuml @@ -0,0 +1,362 @@ +@startuml StencilModel + +' left to right direction + +skinparam classAttributeIconSize 0 +skinparam groupInheritance 0 + + + + +' ############################# +' # external classes +' ############################# +class array2d +hide array2d + + + +' ############################# +' # Stencil traits templates +' ############################# + + +package "Stencil traits" <> { + class StencilTraits << template >> { + CONTAINER : class + MAX_NUM_POINTS_IN_FLUX : localIndex + MAX_STENCIL_SIZE : localIndex + MAX_NUM_CONNECTIONS : localIndex + } + + map TwoPointStencilTraits { + CONTAINER => array2d + MAX_NUM_POINTS_IN_FLUX => 2 + MAX_STENCIL_SIZE => 2 + MAX_NUM_CONNECTIONS => 1 + } + map CellElementStencilMPFATraits { + CONTAINER => ArrayOfArrays + MAX_NUM_POINTS_IN_FLUX => 2 + MAX_STENCIL_SIZE => 18 + MAX_NUM_CONNECTIONS => 1 + } + map SurfaceElementStencilTraits { + CONTAINER => ArrayOfArrays + MAX_NUM_POINTS_IN_FLUX => 6 + MAX_STENCIL_SIZE => 6 + MAX_NUM_CONNECTIONS => 15 + } + + StencilTraits <|--u TwoPointStencilTraits : << template instance >> + StencilTraits <|--u CellElementStencilMPFATraits : << template instance >> + StencilTraits <|--u SurfaceElementStencilTraits : << template instance >> +} + + +' ############################# +' # Stencil classes +' ############################# +class StencilBase< TRAITS > { + - m_elementRegionIndices : IndexContainerView + - m_elementSubRegionIndices : IndexContainerView + - m_elementIndices : IndexContainerView + - m_weights : WeightContainerView + - m_connectorIndices + + getElementRegionIndices() : IndexContainerView + getElementSubRegionIndices() : IndexContainerView + getElementIndices() : IndexContainerView + getWeights() : WeightContainerView + + {abstract} reserve() : void + {abstract} add(N, elemRegionIds[N], elemSubRegionIds[N], elemIds[N], weights[N], connIndex) : void + {abstract} move() : void + {abstract} zero() : bool + {abstract} size() : localIndex + setName() : void +} +note right : Provides management of the interior stencil points +StencilTraits <|-d- StencilBase : TRAITS : StencilTraits + + +class CellElementStencilTPFA { + createKernelWrapper() : CellElementStencilTPFAWrapper + addVectors( transMultipler, geomStabilizationCoef faceNormal[3], cellToFace[2][3] ) +} +note left : Provides management of the interior stencil points when using Two-Point flux approximation. +StencilBase <|-- CellElementStencilTPFA : << TRAITS : TwoPointStencilTraits >> + + +class BoundaryStencil { + createKernelWrapper() : BoundaryStencilWrapper + addVectors( transMultipler, faceNormal[3], cellToFace[2][3] ) +} +note right : Provides management of the boundary stencil points(stencils used to prescribe boundary conditions on domain boundaries, i.e. faces) +StencilBase <|-- BoundaryStencil : << TRAITS : TwoPointStencilTraits >> + + +class CellElementStencilMPFA { +} +note right : Provides management of the interior stencil points when using a Multi-point flux approximation. +StencilBase <|-- CellElementStencilMPFA : << TRAITS : CellElementStencilMPFATraits >> + + +class FaceElementToCellStencil { + createKernelWrapper() : FaceElementToCellStencilWrapper + addVectors( transMultipler, faceNormal[3], cellToFace[2][3] ) +} +note right : Provides management of the interior stencil points for a face elements when using Two-Point flux approximation. +StencilBase <|-- FaceElementToCellStencil : << TRAITS : TwoPointStencilTraits >> + + +class EmbeddedSurfaceToCellStencil { + createKernelWrapper() : EmbeddedSurfaceToCellStencilWrapper +} +note right : Provides management of the interior stencil points for a face elements when using Two-Point flux approximation. +StencilBase <|-- EmbeddedSurfaceToCellStencil : << TRAITS : TwoPointStencilTraits >> + + +class SurfaceElementStencil { + createKernelWrapper() : SurfaceElementStencilWrapper +} +note right : Provides management of the interior stencil points for a face elements when using Two-Point flux approximation. +StencilBase <|-- SurfaceElementStencil : << TRAITS : SurfaceElementStencilTraits >> + + +CellElementStencilTPFA -[hidden]u- BoundaryStencil +BoundaryStencil -[hidden]u- CellElementStencilMPFA +CellElementStencilMPFA -[hidden]u- FaceElementToCellStencil +FaceElementToCellStencil -[hidden]u- EmbeddedSurfaceToCellStencil +EmbeddedSurfaceToCellStencil -[hidden]u- SurfaceElementStencil + + +' ############################# +' # Stencil Wrapper classes +' ############################# +class StencilWrapperBase< TRAITS > { + - m_elementRegionIndices : IndexContainerView + - m_elementSubRegionIndices : IndexContainerView + - m_elementIndices : IndexContainerView + - m_weights : WeightContainerView + + getElementRegionIndices() : IndexContainerView + getElementSubRegionIndices() : IndexContainerView + getElementIndices() : IndexContainerView + getWeights() : WeightContainerView + + void {abstract} computeWeights(iconn, coefficient, weight) +} +note right of StencilWrapperBase + Class to provide access to the computation of stencil weights that may be called from a kernel function. +end note +note left of StencilWrapperBase::"computeWeights(iconn, coefficient, weight, [...])" + Present in the inheriting classes with different signatures. + Compute transmissibility for the "iconn" cell-cell connection taking the "coefficient" (= permeability) and the stencil value into account to compute "weight": + transmissibility = stencilWeight * permeability +end note +StencilTraits <|-d- StencilWrapperBase : TRAITS : StencilTraits + + +class BoundaryStencilWrapper { + - m_faceNormal : arrayView2D< real64 > + - m_cellToFaceVec : arrayView2D< real64 > + - m_weightMultiplier : arrayView2D< real64 > + + void computeWeights( iconn, coefficient, &weight, ... ) +} +note right : Provides access to the boundary stencil that may be called from a kernel function. +StencilWrapperBase <|-- BoundaryStencilWrapper : << TRAITS : TwoPointStencilTraits >> + + +class CellElementStencilTPFAWrapper { + m_faceNormal : arrayView2d< real64 > + m_cellToFaceVec : arrayView3d< real64 > + m_transMultiplier : arrayView1d< real64 > + m_geometricStabilizationCoef : arrayView1d< real64 > + + void computeWeights( iconn, coefficient, &weight[1][2], ... ) +} +note right : Provides access to the cellElement stencil that may be called from a kernel function. +StencilWrapperBase <|-- CellElementStencilTPFAWrapper : << TRAITS : TwoPointStencilTraits >> + + +class FaceElementToCellStencilWrapper { + m_faceNormal : arrayView2d< real64 > + m_cellToFaceVec : arrayView3d< real64 > + m_transMultiplier : arrayView1d< real64 > + + void computeWeights( iconn, coefficient, &weight[1][2], ... ) +} +note right : Provides access to the FaceElementToCellStencil that may be called from a kernel function. +StencilWrapperBase <|-- FaceElementToCellStencilWrapper : << TRAITS : TwoPointStencilTraits >> + + +class SurfaceElementStencilWrapper { + m_cellCenterToEdgeCenters ArrayOfArraysView + m_meanPermCoefficient real64 + + void computeWeights( iconn, coefficient, &weight[1][2], ... ) +} +note right : Provides access to the SurfaceElementStencil that may be called from a kernel function. +StencilWrapperBase <|-- SurfaceElementStencilWrapper : << TRAITS : SurfaceElementStencilTraits >> + + +class EmbeddedSurfaceToCellStencilWrapper { + void computeWeights( iconn, coefficient, &weight[1][2], ... ) +} +note right : Provide access to the EmbeddedSurfaceToCellStencil that may be called from a kernel function. +StencilWrapperBase <|-- EmbeddedSurfaceToCellStencilWrapper : << TRAITS : TwoPointStencilTraits >> + + +BoundaryStencilWrapper -[hidden]down- CellElementStencilTPFAWrapper +CellElementStencilTPFAWrapper -[hidden]down- FaceElementToCellStencilWrapper +FaceElementToCellStencilWrapper -[hidden]down- SurfaceElementStencilWrapper +SurfaceElementStencilWrapper -[hidden]down- EmbeddedSurfaceToCellStencilWrapper + + +' ############################# +' # Physics solver classes +' ############################# + + +class SinglePhaseFVM { + assembleFluxTerms( dt, domain ) +} + +package singlePhaseFVMKernels { + + class FaceBasedAssemblyKernelBase { + - m_rankOffset : globalIndex + - m_dt : real64 + - m_permeability : arrayView3d< real64 > + - m_pres : arrayView1d< real64 > + - m_dens : arrayView2d< real64 > + - ... + } + + class FaceBasedAssemblyKernel< STENCIL_WRAPPER > { + {static} launch(int numConnections, FaceBasedAssemblyKernel kernel) + setup(localIndex iconn, StackVariables & stack) + computeFlux(localIndex iconn, StackVariables & stack) + complete(localIndex iconn, StackVariables & stack) + } + note left: Define the interface for the assembly kernel in charge of flux terms (there are more classes of this type) + note right of FaceBasedAssemblyKernel::launch + Performs the kernel launch: setup(), computeFlux(), complete() + end note + note right of FaceBasedAssemblyKernel::computeFlux + Compute the local flux contributions. + - Depends on StencilWrapperBase::computeWeights() to compute the transmissibility for the current timestep (because permeability can change) + end note + FaceBasedAssemblyKernelBase <|-- FaceBasedAssemblyKernel + FaceBasedAssemblyKernel *-- StencilWrapperBase : contains a << STENCIL_WRAPPER : StencilWrapperBase >> + + class StackVariables { + - stencilSize : localIndex + - numFluxElems : localIndex + - transmissibility : real64[][2] + - dTrans_dPres : real64[][2] + - dofColIndices : stackArray1d< globalIndex > + - localFlux : stackArray1d< real64 > + - localFluxJacobian : stackArray2d< real64 > + } + FaceBasedAssemblyKernel ..> StackVariables : depends on + + class FaceBasedAssemblyKernelFactory< STENCIL_WRAPPER > { + {static} createAndLaunch([...], STENCIL_WRAPPER stencilWrapper, [...]) + } + note right of FaceBasedAssemblyKernelFactory::createAndLaunch + Create and call a FaceBasedAssemblyKernel after the StencilWrapperBase + end note + FaceBasedAssemblyKernelFactory ..> FaceBasedAssemblyKernel : creates a + FaceBasedAssemblyKernelFactory ..> StencilWrapperBase : depends on << STENCIL_WRAPPER : StencilWrapperBase >> + SinglePhaseFVM::assembleFluxTerms ..> FaceBasedAssemblyKernelFactory : launches + +} +note top of singlePhaseFVMKernels: Namespace that groups device kernel classes for the SinglePhaseFVM physics solver + + +' ############################# +' # FIELDS +' ############################# + + +package fields { + +' class ghostRank +' class elementVolume + + package permeability { + class permeability + class permeabilityMultiplier +' class dPerm_dPressure + } + note "constitutive/permeability/PermeabilityFields.hpp" as permeabilityN + permeabilityN .. permeability + + package flow { + class pressure +' class initialPressure +' class deltaPressure + class temperature +' class netToGross +' class deltaVolume +' class gravityCoefficient + + class transMultiplier + note right of transMultiplier : Permeability multiplier in transmissibility calculation + } + note "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" as flowN + flowN .. flow +} +note top of fields : mesh/MeshFields.hpp + + +' ############################# +' # Flux classes +' ############################# + + +class FluxApproximationBase { + initializePostInitialConditionsPreSubGroups() + {abstract} computeCellStencil( mesh ) + {abstract} computeBoundaryStencil( mesh ) + {abstract} computeAquiferStencil( domain, mesh ) + [...] +} +note top of FluxApproximationBase + Base class for various flux approximation classes. + Stores the main and boundary stencils, construction is implemented in derived classes. +end note +note right of FluxApproximationBase::initializePostInitialConditionsPreSubGroups + Call : + - computeCellStencil() + - computeBoundaryStencil() + - computeAquiferStencil() +end note +note right of FluxApproximationBase::computeCellStencil + Compute the "Main stencil" **(=CellElementStencilXPFA)** for cell-cell fluxes. +end note +note right of FluxApproximationBase::computeBoundaryStencil + Boundary stencils are for Dirichlet boundary conditions +end note +note right of FluxApproximationBase::computeAquiferStencil + Called for each "Aquifer" +end note + +class TwoPointFluxApproximation { + computeCellStencil( mesh ) + computeBoundaryStencil( mesh ) + computeAquiferStencil( domain, mesh ) + [...] +} +FluxApproximationBase <|-- TwoPointFluxApproximation : creates a +CellElementStencilTPFA <..r... TwoPointFluxApproximation::computeCellStencil : computeCellStencil()\nwrites in + + +@enduml \ No newline at end of file diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index ff063aa555a..23ca5862dc0 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -541,22 +541,22 @@ void ProblemManager::initializationOrder( string_array & order ) { SortedArray< string > usedNames; + // first, numerical methods + order.emplace_back( groupKeys.numericalMethodsManager.key() ); + usedNames.insert( groupKeys.numericalMethodsManager.key() ); - { - order.emplace_back( groupKeys.numericalMethodsManager.key() ); - usedNames.insert( groupKeys.numericalMethodsManager.key() ); - } + // next, domain + order.emplace_back( groupKeys.domain.key() ); + usedNames.insert( groupKeys.domain.key() ); - { - order.emplace_back( groupKeys.domain.key() ); - usedNames.insert( groupKeys.domain.key() ); - } + // next, events + order.emplace_back( groupKeys.eventManager.key() ); + usedNames.insert( groupKeys.eventManager.key() ); - { - order.emplace_back( groupKeys.eventManager.key() ); - usedNames.insert( groupKeys.eventManager.key() ); - } + // (keeping outputs for the end) + usedNames.insert( groupKeys.outputManager.key() ); + // next, everything... for( auto const & subGroup : this->getSubGroups() ) { if( usedNames.count( subGroup.first ) == 0 ) @@ -564,6 +564,9 @@ void ProblemManager::initializationOrder( string_array & order ) order.emplace_back( subGroup.first ); } } + + // end with outputs (in order to define the chunk sizes after any data source) + order.emplace_back( groupKeys.outputManager.key() ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt index ee3263c50b2..37b41360330 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt @@ -39,6 +39,7 @@ set( physicsSolvers_headers fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp fluidFlow/StabilizedSinglePhaseFVMKernels.hpp fluidFlow/StencilAccessors.hpp + fluidFlow/StencilDataCollection.hpp fluidFlow/ThermalSinglePhaseBaseKernels.hpp fluidFlow/ThermalSinglePhaseFVMKernels.hpp fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -73,6 +74,7 @@ set( physicsSolvers_sources fluidFlow/SinglePhaseProppantBase.cpp fluidFlow/SinglePhaseProppantFluxKernels.cpp fluidFlow/SourceFluxStatistics.cpp + fluidFlow/StencilDataCollection.cpp fluidFlow/wells/CompositionalMultiphaseWell.cpp fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp fluidFlow/wells/SinglePhaseWell.cpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp new file mode 100644 index 00000000000..9a4a4dc06aa --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp @@ -0,0 +1,296 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file StencilDataCollection.cpp + */ + +#include "StencilDataCollection.hpp" + +#include "common/Units.hpp" +#include "finiteVolume/FluxApproximationBase.hpp" +#include "finiteVolume/TwoPointFluxApproximation.hpp" +#include "constitutive/permeability/PermeabilityBase.hpp" +#include "constitutive/permeability/PermeabilityFields.hpp" +#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "common/format/table/TableFormatter.hpp" + +namespace geos +{ + +using namespace constitutive; +using namespace dataRepository; + + +StencilDataCollection::StencilDataCollection( const string & name, + Group * const parent ): + Base( name, parent ) +{ + enableLogLevelInput(); + getWrapperBase( Group::viewKeyStruct::logLevelString() ). + setDescription( "When higher than 1: Display store events details." ); + + registerWrapper( viewKeyStruct::solverNameString(), &m_solverName ). + setRTTypeName( rtTypes::CustomTypes::groupNameRef ). + setInputFlag( dataRepository::InputFlags::REQUIRED ). + setDescription( "Name of the flow solver, to get the permeabilities." ); + registerWrapper( viewKeyStruct::meshNameString(), &m_meshName ). + setRTTypeName( rtTypes::CustomTypes::groupNameRef ). + setInputFlag( dataRepository::InputFlags::REQUIRED ). + setDescription( "Name of the target " ); + + // registerWrapper( viewKeyStruct::connectionDataString(), &m_currentConnData ); + registerWrapper( viewKeyStruct::cellAGlobalIdString(), &m_cellAGlobalId ); + registerWrapper( viewKeyStruct::cellBGlobalIdString(), &m_cellBGlobalId ); + registerWrapper( viewKeyStruct::transmissibilityABString(), &m_transmissibilityAB ); + registerWrapper( viewKeyStruct::transmissibilityBAString(), &m_transmissibilityBA ); +} + +void StencilDataCollection::postInputInitialization() +{ + ProblemManager & problemManager = this->getGroupByPath< ProblemManager >( "/Problem" ); + + { // find targeted solver + PhysicsSolverManager & physicsSolverManager = problemManager.getPhysicsSolverManager(); + + m_solver = physicsSolverManager.getGroupPointer< FlowSolverBase >( m_solverName ); + GEOS_THROW_IF( m_solver == nullptr, + GEOS_FMT( "{}: Could not find flow solver named '{}'.", + getDataContext(), + m_solverName ), + InputError ); + } + + { // find mesh & discretization + DomainPartition & domain = problemManager.getDomainPartition(); + + MeshBody const & meshBody = domain.getMeshBody( m_meshName ); + m_meshLevel = &meshBody.getBaseDiscretization(); + + NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); + FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); + try + { + string const discretizationName = m_solver->getDiscretizationName(); + m_discretization = &fvManager.getFluxApproximation( discretizationName ); + } catch( BadTypeError const & e ) + { + // only TPFA is supported for now + GEOS_ERROR( GEOS_FMT( "{}: target discretization is not supported by {} (for now, only '{}' is).", + getDataContext(), catalogName(), TwoPointFluxApproximation::catalogName() ) ); + } + } +} + +void StencilDataCollection::initializePostInitialConditionsPostSubGroups() +{ + // asserting that there is exactly one supported stencil + integer supportedStencilCount = 0; + m_discretization->forStencils< CellElementStencilTPFA >( *m_meshLevel, [&]( auto const & stencil ) + { + globalIndex connCount = stencil.size(); + m_cellAGlobalId.resize( connCount ); + m_cellBGlobalId.resize( connCount ); + m_transmissibilityAB.resize( connCount ); + m_transmissibilityBA.resize( connCount ); + GEOS_LOG_LEVEL_BY_RANK( 1, GEOS_FMT( "{}: initialized {} connection buffer for '{}'.", + getName(), connCount, m_discretization->getName() ) ); + ++supportedStencilCount; + } ); + GEOS_ERROR_IF( supportedStencilCount == 0, GEOS_FMT( "{}: No compatible discretization was found.", getDataContext() ) ); + GEOS_ERROR_IF( supportedStencilCount > 1, GEOS_FMT( "{}: Multiple discretization was found.", getDataContext() ) ); +} + + +bool StencilDataCollection::execute( real64 const GEOS_UNUSED_PARAM( time_n ), + real64 const GEOS_UNUSED_PARAM( dt ), + integer const GEOS_UNUSED_PARAM( cycleNumber ), + integer const GEOS_UNUSED_PARAM( eventCounter ), + real64 const GEOS_UNUSED_PARAM( eventProgress ), + DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +{ + m_discretization->forStencils< CellElementStencilTPFA >( *m_meshLevel, [&]( auto const & stencil ) + { + // gather + auto const stencilWrapper = stencil.createKernelWrapper(); + array1d< KernelConnectionData > const kernelData = gatherConnectionData( stencilWrapper ); + // output + storeConnectionData( m_discretization->getName(), kernelData.toView() ); + } ); + + return false; +} + + +string showKernelDataExtract( arrayView1d< StencilDataCollection::KernelConnectionData > const & kernelData, + globalIndex maxLines = std::numeric_limits< globalIndex >::max() ); + +class StencilDataCollection::Kernel +{ +public: + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + using PermeabilityAccessors = StencilMaterialAccessors< PermeabilityBase, + fields::permeability::permeability >; + + + /** + * @brief launch a kernel to compute the element-element connection data using a given StencilWrapper. + * @tparam POLICY the Raja host / device launching policy + * @tparam STENCILWRAPPER_T + * @param connData The buffer where the connection data will be written + * @param stencilWrapper the StencilWrapper to use to compute the element-element connection data + * @param permeability the permeability data that will be used to compute the transmissibility + */ + template< typename POLICY, typename STENCILWRAPPER_T > + static void launch( arrayView1d< StencilDataCollection::KernelConnectionData > const & connData, + STENCILWRAPPER_T const & stencilWrapper, + ElementViewConst< arrayView3d< real64 const > > const & permeability ) + { + using IndexContainerType = typename STENCILWRAPPER_T::IndexContainerViewConstType; + IndexContainerType const & elemRegionIndices = stencilWrapper.getElementRegionIndices(); + IndexContainerType const & elemSubRegionIndices = stencilWrapper.getElementSubRegionIndices(); + IndexContainerType const & elementIndices = stencilWrapper.getElementIndices(); + + forAll< POLICY >( stencilWrapper.size(), [=] GEOS_HOST_DEVICE ( localIndex const iConn ) + { + real64 transmissibility[1][2]; + real64 dummy[1][2]; + + stencilWrapper.computeWeights( iConn, + permeability, + permeability, // we don't need derivatives + transmissibility, + dummy ); // we don't need derivatives + + for( localIndex i = 0; i < 2; ++i ) + { + connData[iConn].m_transmissibility[i] = transmissibility[0][i]; + connData[iConn].m_regionId[i] = elemRegionIndices( iConn, i ); + connData[iConn].m_subRegionId[i] = elemSubRegionIndices( iConn, i ); + connData[iConn].m_elementId[i] = elementIndices( iConn, i ); + } + } ); + connData.move( LvArray::MemorySpace::host ); + } + +private: + Kernel() = delete; +}; + +template< typename STENCILWRAPPER_T > +array1d< StencilDataCollection::KernelConnectionData > +StencilDataCollection::gatherConnectionData( STENCILWRAPPER_T const & stencilWrapper ) const +{ + ElementRegionManager const & elemManager = m_meshLevel->getElemManager(); + + // allocate a large enough buffer to store all connection data + array1d< KernelConnectionData > kernelData{ stencilWrapper.size() }; + typename Kernel::PermeabilityAccessors accessor( elemManager, m_solver->getName() ); + + Kernel::launch< parallelDevicePolicy<> >( kernelData.toView(), stencilWrapper, + accessor.get< fields::permeability::permeability >() ); + + return kernelData; +} + + +StencilDataCollection::ConnectionData +StencilDataCollection::ConnectionData::fromKernel( KernelConnectionData const & kernelData, + LocalToGlobalMap const & localToGlobalMap ) +{ + ConnectionData conn; + for( localIndex i = 0; i < 2; ++i ) + { + conn.m_transmissibility[i] = kernelData.m_transmissibility[i]; + conn.m_globalId[i] = localToGlobalMap[kernelData.m_regionId[i]][kernelData.m_subRegionId[i]][kernelData.m_elementId[i]]; + } + return conn; +} + + +string formatKernelDataExtract( arrayView1d< StencilDataCollection::KernelConnectionData > const & kernelData, + globalIndex maxLines ) +{ + TableData tableData; + auto kernelIterator = kernelData.begin(); + for( int iConn=0; iConn < maxLines && kernelIterator != kernelData.end(); ++iConn, ++kernelIterator ) + { + tableData.addRow( GEOS_FMT( "{} / {}", kernelIterator->m_regionId[0], kernelIterator->m_regionId[1] ), + GEOS_FMT( "{} / {}", kernelIterator->m_subRegionId[0], kernelIterator->m_subRegionId[1] ), + GEOS_FMT( "{} / {}", kernelIterator->m_elementId[0], kernelIterator->m_elementId[1] ), + kernelIterator->m_transmissibility[0], + kernelIterator->m_transmissibility[1] ); + } + TableLayout const tableLayout{ + { "regionId A/B", "subRegionId A/B", "elementId A/B", "transmissibilityAB", "transmissibilityBA" }, + GEOS_FMT( "Kernel data (real row count = {})", kernelData.size() ) + }; + TableTextFormatter const tableFormatter{ tableLayout }; + return tableFormatter.toString( tableData ); +} + +void StencilDataCollection::storeConnectionData( string_view stencilName, + arrayView1d< KernelConnectionData > const & kernelData ) +{ + std::set< ConnectionData > sortedData; + + { // data extraction + ElementRegionManager const & elemManager = m_meshLevel->getElemManager(); + string const & mapVKStr = ObjectManagerBase::viewKeyStruct::localToGlobalMapString(); + LocalToGlobalMap localToGlobalMap = elemManager.constructArrayViewAccessor< globalIndex, 1 >( mapVKStr ); + + std::transform( kernelData.begin(), kernelData.end(), + std::inserter( sortedData, sortedData.end() ), + [&]( auto const & kernelConn ) + { + return ConnectionData::fromKernel( kernelConn, localToGlobalMap ); + } ); + } + + { // data storing + GEOS_ERROR_IF_NE_MSG( size_t( m_cellAGlobalId.size() ), size_t( sortedData.size() ), + GEOS_FMT( "{}: Unexpected stencil size!\n{}", + getDataContext(), formatKernelDataExtract( kernelData, 8 ) ) ); + globalIndex i = 0; + for( ConnectionData const & conn : sortedData ) + { + m_cellAGlobalId[i] = conn.m_globalId[0]; + m_cellBGlobalId[i] = conn.m_globalId[1]; + m_transmissibilityAB[i] = conn.m_transmissibility[0]; + m_transmissibilityBA[i] = conn.m_transmissibility[1]; + ++i; + } + } + + logStoredConnections( stencilName ); +} + +void StencilDataCollection::logStoredConnections( string_view stencilName ) +{ + integer const connCount = MpiWrapper::sum( m_cellAGlobalId.size() ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: {} connections stored for '{}'.", + getName(), connCount, stencilName ) ); +} + + +REGISTER_CATALOG_ENTRY( TaskBase, + StencilDataCollection, + string const &, dataRepository::Group * const ) + + +} /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.hpp new file mode 100644 index 00000000000..c7685f8706c --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.hpp @@ -0,0 +1,178 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file StencilDataCollection.hpp + */ + +#ifndef SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_CELLTOCELLDATACOLLECTOR_HPP_ +#define SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_CELLTOCELLDATACOLLECTOR_HPP_ + +#include "events/tasks/TaskBase.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBase.hpp" + +namespace geos +{ + +/** + * @class StencilDataCollection + * Task class allowing the ouput of communicating elements data. + * Only current usage is to output the cell-cell transmissibility (= "CellToCellDataCollection"), but we could add more + * implementations to output the transmissibility of boundary or surface connections (or everything that is managed + * by the stencils). + */ +class StencilDataCollection : public TaskBase +{ +public: + + /** + * @brief Constructor for the statistics class + * @param[in] name the name of the task coming from the xml + * @param[in] parent the parent group of the task + */ + StencilDataCollection( const string & name, + dataRepository::Group * const parent ); + + /// Accessor for the catalog name + static string catalogName() { return "CellToCellDataCollection"; } + + /** + * @defgroup Tasks Interface Functions + * + * This function implements the interface defined by the abstract TaskBase class + */ + /**@{*/ + + virtual bool execute( real64 const time_n, + real64 const dt, + integer const cycleNumber, + integer const eventCounter, + real64 const eventProgress, + DomainPartition & domain ) override; + + /**@}*/ + + struct viewKeyStruct + { + static constexpr char const * solverNameString() { return "flowSolverName"; } + static constexpr char const * meshNameString() { return "meshBody"; } + static constexpr char const * cellAGlobalIdString() { return "cellAGlobalId"; } + static constexpr char const * cellBGlobalIdString() { return "cellBGlobalId"; } + static constexpr char const * transmissibilityABString() { return "transmissibilityAB"; } + static constexpr char const * transmissibilityBAString() { return "transmissibilityBA"; } + }; + + class Kernel; + + /** + * @brief Element-element connection data extracted from the kernel. + */ + struct KernelConnectionData + { + real64 m_transmissibility[2]; + localIndex m_regionId[2]; + localIndex m_subRegionId[2]; + localIndex m_elementId[2]; + }; + +private: + + using Base = TaskBase; + using LocalToGlobalMap = ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > >; + + /** + * @brief Element-element connection data to be output by the class. + */ + struct ConnectionData + { + real64 m_transmissibility[2]; + globalIndex m_globalId[2]; + + + /** + * @return Construct a ConnectionData from the given kernel data. + * @param kernelData the kernel extracted data to be converted. + * @param localToGlobalMap the local to global id map, useful to convert the kernel extracted ids of the elements. + */ + static ConnectionData fromKernel( KernelConnectionData const & kernelData, + LocalToGlobalMap const & localToGlobalMap ); + + /** + * @brief minus operator to be able to sort instances before outputing them. + * The sorting is done by the first global id, then by the second global id. + * @param other compared instance + * @return true if this instance is to sort before the other instance. + */ + bool operator<( ConnectionData const & other ) const + { + return m_globalId[0] != other.m_globalId[0] ? + m_globalId[0] < other.m_globalId[0] : + m_globalId[1] < other.m_globalId[1]; + } + }; + + array1d< globalIndex > m_cellAGlobalId; + array1d< globalIndex > m_cellBGlobalId; + array1d< real64 > m_transmissibilityAB; + array1d< real64 > m_transmissibilityBA; + + /// Name of the target mesh body + string m_meshName; + /// Name of the target discretization + string m_solverName; + + /// Pointer to the target flow solver + FlowSolverBase const * m_solver = nullptr; + /// Pointer to the target mesh body + MeshLevel const * m_meshLevel = nullptr; + /// Pointer to the target discretization + FluxApproximationBase const * m_discretization = nullptr; + + + + void postInputInitialization() override; + + /** + * @brief Initialization of the internal buffers, must happen: + * - after FluxApproximationBase::computeCellStencil() + * - before TimeHistoryOutput::initializePostInitialConditionsPostSubGroups() + */ + void initializePostInitialConditionsPostSubGroups() override; + + /** + * @brief gather the element-element connection data of the current timestep using a given StencilWrapper. + * @tparam STENCILWRAPPER_T the type of the StencilWrapper + * @param mesh the mesh for which we want the data + * @param stencilWrapper the StencilWrapper to use to compute the element-element connection data + * @return Return the gathered data in an LvArray + */ + template< typename STENCILWRAPPER_T > + array1d< KernelConnectionData > gatherConnectionData( STENCILWRAPPER_T const & stencilWrapper ) const; + + /** + * @brief Output the element-element connection data of the current timestep. + * @param mesh the specific mesh for which we output the data. We will also need it to convert the ids to global ids. + * @param stencil the specific mesh for which we output the data. + * @param kernelData the connection data, gathered by a kernel. + */ + void storeConnectionData( string_view stencilName, + arrayView1d< KernelConnectionData > const & kernelData ); + + void logStoredConnections( string_view stencilName ); +}; + + +} /* namespace geos */ + +#endif /* SRC_CORECOMPONENTS_PHYSICSSOLVERS_FLUIDFLOW_CELLTOCELLDATACOLLECTOR_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index 405c2d6421e..665d3bee319 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -364,12 +364,12 @@ class CoupledReservoirAndWellsBase : public CoupledSolver< RESERVOIR_SOLVER, WEL forAll< serialPolicy >( perforationData.size(), [=] ( localIndex const iperf ) { GEOS_UNUSED_VAR( iperf ); // unused if geos_error_if is nulld - GEOS_LOG_RANK( GEOS_FMT( "Perforation at ({},{},{}); perforated element center: ({},{},{}); transmissibility: {} Pa.s.rm^3/s/Pa", + GEOS_LOG_RANK( GEOS_FMT( "Perforation at ({},{},{}); perforated element center: ({},{},{}); transmissibility: {} [{}]", perfLocation[iperf][0], perfLocation[iperf][1], perfLocation[iperf][2], elemCenter[resElemRegion[iperf]][resElemSubRegion[iperf]][resElemIndex[iperf]][0], elemCenter[resElemRegion[iperf]][resElemSubRegion[iperf]][resElemIndex[iperf]][1], elemCenter[resElemRegion[iperf]][resElemSubRegion[iperf]][resElemIndex[iperf]][2], - perfTrans[iperf] ) ); + perfTrans[iperf], getSymbol( units::Transmissibility ) ) ); } ); } } ); diff --git a/src/coreComponents/schema/docs/CellToCellDataCollection.rst b/src/coreComponents/schema/docs/CellToCellDataCollection.rst new file mode 100644 index 00000000000..90337122674 --- /dev/null +++ b/src/coreComponents/schema/docs/CellToCellDataCollection.rst @@ -0,0 +1,12 @@ + + +============== ============ ======== =================================================== +Name Type Default Description +============== ============ ======== =================================================== +flowSolverName groupNameRef required Name of the flow solver, to get the permeabilities. +logLevel integer 0 When higher than 1: Display store events details. +meshBody groupNameRef required Name of the target +name groupName required A name is required for any non-unique nodes +============== ============ ======== =================================================== + + diff --git a/src/coreComponents/schema/docs/CellToCellDataCollection_other.rst b/src/coreComponents/schema/docs/CellToCellDataCollection_other.rst new file mode 100644 index 00000000000..4b1a6106d81 --- /dev/null +++ b/src/coreComponents/schema/docs/CellToCellDataCollection_other.rst @@ -0,0 +1,12 @@ + + +================== ================= ========================== +Name Type Description +================== ================= ========================== +cellAGlobalId globalIndex_array (no description available) +cellBGlobalId globalIndex_array (no description available) +transmissibilityAB real64_array (no description available) +transmissibilityBA real64_array (no description available) +================== ================= ========================== + + diff --git a/src/coreComponents/schema/docs/Tasks.rst b/src/coreComponents/schema/docs/Tasks.rst index 7531175fa44..261764bbeaa 100644 --- a/src/coreComponents/schema/docs/Tasks.rst +++ b/src/coreComponents/schema/docs/Tasks.rst @@ -3,6 +3,7 @@ =========================================================== ==== ======= ====================================================================== Name Type Default Description =========================================================== ==== ======= ====================================================================== +CellToCellDataCollection node :ref:`XML_CellToCellDataCollection` CompositionalMultiphaseReservoirPoromechanicsInitialization node :ref:`XML_CompositionalMultiphaseReservoirPoromechanicsInitialization` CompositionalMultiphaseStatistics node :ref:`XML_CompositionalMultiphaseStatistics` HydrofractureInitialization node :ref:`XML_HydrofractureInitialization` diff --git a/src/coreComponents/schema/docs/Tasks_other.rst b/src/coreComponents/schema/docs/Tasks_other.rst index 7abafe4b3b2..bcde01875c0 100644 --- a/src/coreComponents/schema/docs/Tasks_other.rst +++ b/src/coreComponents/schema/docs/Tasks_other.rst @@ -3,6 +3,7 @@ =========================================================== ==== ================================================================================ Name Type Description =========================================================== ==== ================================================================================ +CellToCellDataCollection node :ref:`DATASTRUCTURE_CellToCellDataCollection` CompositionalMultiphaseReservoirPoromechanicsInitialization node :ref:`DATASTRUCTURE_CompositionalMultiphaseReservoirPoromechanicsInitialization` CompositionalMultiphaseStatistics node :ref:`DATASTRUCTURE_CompositionalMultiphaseStatistics` HydrofractureInitialization node :ref:`DATASTRUCTURE_HydrofractureInitialization` diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 52e7878e80d..d02adab186c 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -471,6 +471,10 @@ + + + + @@ -3871,6 +3875,7 @@ Local- Add jump stabilization on interior of macro elements--> + @@ -3890,6 +3895,16 @@ Local- Add jump stabilization on interior of macro elements--> + + + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 7c377e44c69..73552a29993 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1325,6 +1325,7 @@ + @@ -1344,6 +1345,16 @@ + + + + + + + + + + diff --git a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt index 3d91645c2e5..23399171ff5 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt @@ -3,7 +3,8 @@ set( gtest_geosx_tests testSinglePhaseBaseKernels.cpp testThermalCompMultiphaseFlow.cpp testThermalSinglePhaseFlow.cpp - testFlowStatistics.cpp ) + testFlowStatistics.cpp + testTransmissibility.cpp ) set( dependencyList ${parallelDeps} gtest ) diff --git a/src/coreComponents/unitTests/fluidFlowTests/testTransmissibility.cpp b/src/coreComponents/unitTests/fluidFlowTests/testTransmissibility.cpp new file mode 100644 index 00000000000..b35b824f62b --- /dev/null +++ b/src/coreComponents/unitTests/fluidFlowTests/testTransmissibility.cpp @@ -0,0 +1,332 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + + +#include "mainInterface/initialization.hpp" +#include "mainInterface/GeosxState.hpp" +#include "codingUtilities/UnitTestUtilities.hpp" +#include "unitTests/fluidFlowTests/testSingleFlowUtils.hpp" +#include "physicsSolvers/fluidFlow/StencilDataCollection.hpp" +#include "mainInterface/ProblemManager.hpp" + + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::testing; + + +CommandLineOptions g_commandLineOptions; + + +/// Provide every common xml input for the transmissibility tests +constexpr string_view xmlInputCommon = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +)xml"; + +/// Provide the ending of the xml input for the transmissibility tests +static string_view constexpr xmlInputEnd = + R"xml( + +)xml"; + +/// Path of the StencilDataCollection in the hierarchy +static string_view constexpr stencilDataCollectionPath = "/Tasks/cellToCellDataCollection"; + + +/// a "stack" array to represent 3d floating point data (ie. coords) +using Float3 = std::array< real64, 3 >; +/// a "stack" array to represent 3d integer data (ie. cell count / axis) +using Int3 = std::array< integer, 3 >; + +/// Enumeration of the 3D axis to take into account for a structured mesh. +enum class Axis : integer { X = 0, Y = 1, Z = 2 }; + +/** + * @brief a map of the half transmissibilities, from the first to the second cell identified by the + * key global id. + */ +using TransmissibilityMap = std::map< std::pair< globalIndex, globalIndex >, real64 >; + +/** + * @brief the parameters for a given test instance. + */ +struct TestParams +{ + Int3 m_cellCount; + Float3 m_meshSize; + Float3 m_cellDistance; + + constexpr TestParams( Int3 cellCount, Float3 meshSize ): + m_cellCount( cellCount ), + m_meshSize( meshSize ), + m_cellDistance( { meshSize[0] / real64( cellCount[0] ), + meshSize[1] / real64( cellCount[1] ), + meshSize[2] / real64( cellCount[2] ) } ) + {} +}; + +static real64 constexpr g_transmissibilityTolerance = 1.0e-11; +static Float3 constexpr g_testPermeability = { 2.0e-16, 2.0e-16, 2.0e-16 }; +static real64 constexpr g_testNetToGross = 1.0; + + +void verifyStencilOutputStructured( string_view xmlInput, TestParams const & params ); + + +TEST( TransmissibilityTest, stencilOutputVerificationIso ) +{ + static string_view constexpr meshInput = + R"xml( + + + + +)xml"; + std::ostringstream xmlInput; + xmlInput << xmlInputCommon << meshInput << xmlInputEnd; + + static TestParams constexpr params { + { 3, 3, 3 }, // cellCount + { 30.0, 30.0, 30.0 }, // meshSize + }; + + verifyStencilOutputStructured( xmlInput.str(), params ); +} + +TEST( TransmissibilityTest, StencilOutputVerificationAniso ) +{ + static string_view constexpr meshInput = + R"xml( + + + + +)xml"; + std::ostringstream xmlInput; + xmlInput << xmlInputCommon << meshInput << xmlInputEnd; + + static TestParams constexpr params { + { 3, 4, 5 }, // cellCount + { 70.0, 10.0, 54.321 }, // meshSize + }; + + verifyStencilOutputStructured( xmlInput.str(), params ); +} + + + +/** + * @return The theorical half transmissiblity (from A to B or B to A) within a structured mesh. + * @param params The test parameters + * @param axis The axis in which we want to compute the transmissibility (structured mesh). + */ +real64 computeTransmissiblityStructured( TestParams const & params, Axis axis ) +{ + real64 const faceArea = axis == Axis::X ? params.m_cellDistance[1]*params.m_cellDistance[2]: + axis == Axis::Y ? params.m_cellDistance[0]*params.m_cellDistance[2]: + params.m_cellDistance[0]*params.m_cellDistance[1]; + real64 const halfDistance = 0.5 * params.m_cellDistance[integer( axis )]; + + real64 const transmissibility = g_testPermeability[integer( axis )] * g_testNetToGross * ( faceArea / halfDistance ); + // return half transmissibility + return g_testNetToGross * transmissibility * 0.5; +} + +/** + * @brief Verify the transmissibility data from the StencilDataCollection for each connection + * within a structured mesh. + * @param transmissibilities The transmissibility map + * @param axis The axis in which we want to verify the transmissibility (structured mesh). + * @param params The test parameters + */ +void verifyTransmissibilityDataStructured( TransmissibilityMap transmissibilities, Axis axis, + TestParams const & params ) +{ + integer const cellBIdOffset = axis == Axis::X ? 1: + axis == Axis::Y ? params.m_cellCount[0]: + params.m_cellCount[0]*params.m_cellCount[1]; + integer const endX = axis == Axis::X ? params.m_cellCount[0] - 1 : params.m_cellCount[0]; + integer const endY = axis == Axis::Y ? params.m_cellCount[1] - 1 : params.m_cellCount[1]; + integer const endZ = axis == Axis::Z ? params.m_cellCount[2] - 1 : params.m_cellCount[2]; + real64 const expectedAxisTransmissibility = computeTransmissiblityStructured( params, axis ); + + for( integer z = 0; z < endZ; ++z ) + { + for( integer y = 0; y < endY; ++y ) + { + for( integer x = 0; x < endX; ++x ) + { + integer const cellAId = x + params.m_cellCount[0] * (y + z * params.m_cellCount[1]); + integer const cellBId = cellAId + cellBIdOffset; + real64 const transmissibilityOutput = transmissibilities[std::make_pair( cellAId, cellBId )]; + real64 const transmissibilityTolerance = g_transmissibilityTolerance * std::abs( transmissibilityOutput ); + EXPECT_NEAR( transmissibilityOutput, expectedAxisTransmissibility, + transmissibilityTolerance )<< GEOS_FMT( "Transmissibility data from {} does not match with expectation.", + StencilDataCollection::catalogName() ); + } + } + } +} + +/** + * @brief Verify the source data consistency and return a transmissibility map for easy further data access. + * @param stencilData A StencilDataCollection object which contains the data gathered for the stencil. + * @param params The test parameters + * @return a TransmissibilityMap object containing the stencil data. + */ +TransmissibilityMap getTransmissibilityMap( StencilDataCollection const & stencilData, + TestParams const & params ) +{ + using VK = StencilDataCollection::viewKeyStruct; + auto const & cellAGlobalId = stencilData.getReference< array1d< globalIndex > >( VK::cellAGlobalIdString() ); + auto const & cellBGlobalId = stencilData.getReference< array1d< globalIndex > >( VK::cellBGlobalIdString() ); + auto const & transmissibilityAB = stencilData.getReference< array1d< real64 > >( VK::transmissibilityABString() ); + auto const & transmissibilityBA = stencilData.getReference< array1d< real64 > >( VK::transmissibilityBAString() ); + + // verify data size + integer const nx = params.m_cellCount[0]; + integer const ny = params.m_cellCount[1]; + integer const nz = params.m_cellCount[2]; + integer const arraySize = transmissibilityAB.size(); + EXPECT_EQ( arraySize, 3*nx*ny*nz - nx*ny - ny*nz - nx*nz ); + // verify that array size is always equal for all buffers + EXPECT_EQ( cellAGlobalId.size(), arraySize ); + EXPECT_EQ( cellBGlobalId.size(), arraySize ); + EXPECT_EQ( transmissibilityBA.size(), arraySize ); + + TransmissibilityMap transmissibilities; + for( int i = 0; i < arraySize; ++i ) + { + transmissibilities[std::make_pair( cellAGlobalId[i], cellBGlobalId[i] )] = transmissibilityAB[i]; + } + return transmissibilities; +} + + +/** + * @brief Launch a test to verify if: + * - data of the output of the stencil is consistent, + * - output transmissiblity values are conform to computed expectations. + * @param xmlInput The XML input to launch the test on. + * @param params The test parameters. + */ +void verifyStencilOutputStructured( string_view xmlInput, TestParams const & params ) +{ + GeosxState state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ); + ProblemManager & problem = state.getProblemManager(); + setupProblemFromXML( problem, xmlInput.data() ); + + EXPECT_FALSE( problem.runSimulation() ) << "Simulation exited early."; + + { // checking results + StencilDataCollection const & stencilData = + problem.getGroupByPath< StencilDataCollection >( string( stencilDataCollectionPath ) ); + TransmissibilityMap const transmissibilities = getTransmissibilityMap( stencilData, params ); + + // let's check each couple of cell in the x direction + verifyTransmissibilityDataStructured( transmissibilities, Axis::X, params ); + verifyTransmissibilityDataStructured( transmissibilities, Axis::Y, params ); + verifyTransmissibilityDataStructured( transmissibilities, Axis::Z, params ); + } +} + + + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + return result; +} diff --git a/src/docs/sphinx/CompleteXMLSchema.rst b/src/docs/sphinx/CompleteXMLSchema.rst index db8541a9036..93fd92c0af4 100644 --- a/src/docs/sphinx/CompleteXMLSchema.rst +++ b/src/docs/sphinx/CompleteXMLSchema.rst @@ -150,6 +150,13 @@ Element: CellElementRegion .. include:: ../../coreComponents/schema/docs/CellElementRegion.rst +.. _XML_CellToCellDataCollection: + +Element: CellToCellDataCollection +================================= +.. include:: ../../coreComponents/schema/docs/CellToCellDataCollection.rst + + .. _XML_CeramicDamage: Element: CeramicDamage @@ -1610,6 +1617,13 @@ Datastructure: CellElementRegion .. include:: ../../coreComponents/schema/docs/CellElementRegion_other.rst +.. _DATASTRUCTURE_CellToCellDataCollection: + +Datastructure: CellToCellDataCollection +======================================= +.. include:: ../../coreComponents/schema/docs/CellToCellDataCollection_other.rst + + .. _DATASTRUCTURE_CeramicDamage: Datastructure: CeramicDamage From c9142836b596d3ce606e5b6df38baa837956f54c Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 6 Aug 2024 18:01:29 -1000 Subject: [PATCH 156/286] fix: fix linking error on mac (#3270) * Move the definition of fromDuration from Units.cpp to Units.hpp --- src/coreComponents/common/Units.cpp | 19 ------------------- src/coreComponents/common/Units.hpp | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/coreComponents/common/Units.cpp b/src/coreComponents/common/Units.cpp index 7b2e21ca3cc..b5a53033c71 100644 --- a/src/coreComponents/common/Units.cpp +++ b/src/coreComponents/common/Units.cpp @@ -73,25 +73,6 @@ std::ostream & operator<<( std::ostream & os, TimeFormatInfo const & info ) return os; } - -template< typename DURATION > -TimeFormatInfo TimeFormatInfo::fromDuration( DURATION const value ) -{ - using namespace std::chrono; - - auto const totalYears = duration_cast< units::Years >( value ); - auto const daysOut = duration_cast< units::Days >( value - totalYears ); - auto const hoursOut = duration_cast< hours >( value - totalYears - daysOut ); - auto const minutesOut = duration_cast< minutes >( value - totalYears - daysOut - hoursOut ); - auto const secondsOut = duration_cast< seconds >( value - totalYears - daysOut - hoursOut - minutesOut ); - - return TimeFormatInfo( duration< double >( value ).count(), int( totalYears.count() ), - int( daysOut.count() ), int( hoursOut.count() ), - int( minutesOut.count() ), int( secondsOut.count() ) ); -} -// available specializations -template TimeFormatInfo TimeFormatInfo::fromDuration< SystemClock::duration >( SystemClock::duration duration ); - TimeFormatInfo TimeFormatInfo::fromSeconds( double const seconds ) { double remainingSeconds = seconds < 0.0 ? -seconds : seconds; diff --git a/src/coreComponents/common/Units.hpp b/src/coreComponents/common/Units.hpp index 9b28532f0eb..26b19eef555 100644 --- a/src/coreComponents/common/Units.hpp +++ b/src/coreComponents/common/Units.hpp @@ -270,6 +270,21 @@ struct TimeFormatInfo string toSecondsString() const; }; +template< typename DURATION > +TimeFormatInfo TimeFormatInfo::fromDuration( DURATION const value ) +{ + using namespace std::chrono; + + auto const totalYears = duration_cast< units::Years >( value ); + auto const daysOut = duration_cast< units::Days >( value - totalYears ); + auto const hoursOut = duration_cast< hours >( value - totalYears - daysOut ); + auto const minutesOut = duration_cast< minutes >( value - totalYears - daysOut - hoursOut ); + auto const secondsOut = duration_cast< seconds >( value - totalYears - daysOut - hoursOut - minutesOut ); + + return TimeFormatInfo( duration< double >( value ).count(), int( totalYears.count() ), + int( daysOut.count() ), int( hoursOut.count() ), + int( minutesOut.count() ), int( secondsOut.count() ) ); +} } // end namespace units From 7cce9a0f64c8ae893a50bcf3dce7d5d9e39c389a Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Wed, 7 Aug 2024 12:58:36 -0400 Subject: [PATCH 157/286] refactor: separate friction and hydraulic aperture - stress relation. (#3197) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../modifyBoundaryCondition/pkn_example.xml | 15 +- host-configs/apple/macOS_customized.cmake | 7 - .../ALM_stickFault_base.xml | 7 +- ...bFrac_Compression_CoulombFriction_base.xml | 18 +- .../EmbFrac_Compression_Frictionless_base.xml | 16 +- .../SneddonRotated_benchmark.xml | 3 +- .../SneddonRotated_benchmark2.xml | 3 +- .../SneddonRotated_smoke.xml | 3 +- .../Sneddon_embeddedFracShapes_base.xml | 16 +- .../Sneddon_embeddedFrac_base.xml | 13 +- .../Sneddon_embeddedFrac_benchmark.xml | 3 +- .../Sneddon_embeddedFrac_smoke.xml | 3 +- ...eddedFrac_staticCondensation_benchmark.xml | 3 +- ..._embeddedFrac_staticCondensation_smoke.xml | 3 +- .../Sneddon_embeddedFrac_verification.xml | 3 +- .../Sneddon_hydroFrac_base.xml | 14 +- .../heterogeneousInSitu_base.xml | 14 +- .../heterogeneousInSitu_smoke.xml | 14 +- .../hydrofractureSinglePhase2d.xml | 16 +- .../hydraulicFracturing/kgdBase_C3D6_base.xml | 9 +- .../kgdEdgeBased_C3D6_base.xml | 6 +- .../kgdNodeBased_C3D6_base.xml | 6 +- .../kgdToughnessDominated_base.xml | 14 +- ...kgdToughnessDominated_poroelastic_base.xml | 14 +- .../kgdValidation_base.xml | 14 +- .../kgdViscosityDominated_base.xml | 14 +- ...kgdViscosityDominated_poroelastic_base.xml | 14 +- .../pennyShapedToughnessDominated_base.xml | 11 +- ...ennyShapedToughnessDominated_benchmark.xml | 4 +- ...pedToughnessDominated_poroelastic_base.xml | 13 +- ...ughnessDominated_poroelastic_benchmark.xml | 4 +- ...edToughnessDominated_poroelastic_smoke.xml | 4 +- .../pennyShapedToughnessDominated_smoke.xml | 1 - .../pennyShapedViscosityDominated_base.xml | 10 +- ...ennyShapedViscosityDominated_benchmark.xml | 4 +- ...pedViscosityDominated_poroelastic_base.xml | 10 +- ...scosityDominated_poroelastic_benchmark.xml | 4 +- ...edViscosityDominated_poroelastic_smoke.xml | 4 +- .../pennyShapedViscosityDominated_smoke.xml | 4 +- .../pknViscosityDominated_base.xml | 11 +- .../pknViscosityDominated_benchmark.xml | 4 +- ...pknViscosityDominated_poroelastic_base.xml | 10 +- ...scosityDominated_poroelastic_benchmark.xml | 4 +- ...knViscosityDominated_poroelastic_smoke.xml | 4 +- .../pknViscosityDominated_smoke.xml | 4 +- .../walshQuarterNoChombo_base.xml | 10 +- .../walshQuarterNoChombo_benchmark.xml | 1 - .../walshQuarterNoChombo_smoke.xml | 1 - .../ContactMechanics_PEBICrack_base.xml | 2 +- .../ContactMechanics_PassingCrack_base.xml | 14 +- .../ContactMechanics_SimpleCubes_base.xml | 13 +- ...ctMechanics_SingleFracCompression_base.xml | 17 +- .../ContactMechanics_TFrac_base.xml | 14 +- ...ontactMechanics_UnstructuredCrack_base.xml | 16 +- .../ContactMechanics_slippingFault_base.xml | 14 +- .../Sneddon_contactMechanics_base.xml | 16 +- ...ayPermeability_conformingFracture_base.xml | 9 +- ...ExponentialDecayPermeability_edfm_base.xml | 16 +- ...c_conformingFracture_2d_faultSlip_base.xml | 9 +- ...conformingFracture_2d_openingFrac_base.xml | 11 +- .../PoroElastic_dfm_PEBICrack_base.xml | 11 +- .../PoroElastic_efem-edfm_base.xml | 15 +- .../PoroElastic_efem-edfm_eggModel_large.xml | 13 +- .../PoroElastic_efem-edfm_eggModel_small.xml | 13 +- .../PoroElastic_efem-edfm_pennyCrack_base.xml | 10 +- ...Elastic_efem-edfm_pennyCrack_benchmark.xml | 3 +- ...PoroElastic_efem-edfm_pennyCrack_smoke.xml | 3 +- ...lastic_efem-edfm_pressurizedFrac_smoke.xml | 13 +- .../SlipPermeability_embeddedFrac.xml | 13 +- .../SlipPermeability_pEDFM_base.xml | 16 +- ...lisRichardsPermeability_efem-edfm_base.xml | 13 +- ...nglePhasePoromechanics_FaultModel_base.xml | 9 +- .../ThermoPoroElastic_base.xml | 8 +- .../ThermoPoroElastic_conforming_base.xml | 2 +- .../ThermoPoroElastic_efem-edfm_base.xml | 5 +- ...moPoroElastic_efem-edfm_eggModel_small.xml | 11 +- ...asticWellbore_ImperfectInterfaces_base.xml | 8 +- ...asticWellbore_ImperfectInterfaces_base.xml | 12 +- .../constitutive/CMakeLists.txt | 17 +- .../constitutive/contact/BartonBandis.cpp | 50 +++ .../constitutive/contact/BartonBandis.hpp | 143 ++++++++ .../constitutive/contact/ContactBase.hpp | 269 -------------- .../constitutive/contact/CoulombContact.hpp | 328 ------------------ ...CoulombContact.cpp => CoulombFriction.cpp} | 38 +- .../constitutive/contact/CoulombFriction.hpp | 309 +++++++++++++++++ .../constitutive/contact/FrictionBase.cpp | 51 +++ .../constitutive/contact/FrictionBase.hpp | 167 +++++++++ ...ntactSelector.hpp => FrictionSelector.hpp} | 18 +- .../contact/FrictionlessContact.cpp | 13 +- .../contact/FrictionlessContact.hpp | 45 +-- .../contact/HydraulicApertureBase.cpp | 48 +++ .../contact/HydraulicApertureBase.hpp | 73 ++++ .../HydraulicApertureRelationSelector.hpp | 52 +++ ...actBase.cpp => HydraulicApertureTable.cpp} | 47 +-- .../contact/HydraulicApertureTable.hpp | 170 +++++++++ .../deprecated/ApertureTableContact.cpp | 132 ------- .../deprecated/ApertureTableContact.hpp | 178 ---------- src/coreComponents/fileIO/silo/SiloFile.cpp | 4 +- .../contact/ContactSolverBase.cpp | 18 +- .../contact/ContactSolverBase.hpp | 3 + .../contact/SolidMechanicsEFEMKernels.hpp | 33 +- .../SolidMechanicsEmbeddedFractures.cpp | 31 +- .../SolidMechanicsEmbeddedFractures.hpp | 5 + .../contact/SolidMechanicsLagrangeContact.cpp | 30 +- .../contact/SolidMechanicsPenaltyContact.cpp | 235 +++++++++++++ .../contact/SolidMechanicsPenaltyContact.hpp | 92 +++++ .../fluidFlow/FlowSolverBase.cpp | 1 + .../multiphysics/HydrofractureSolver.cpp | 35 +- .../multiphysics/HydrofractureSolver.hpp | 4 +- .../HydrofractureSolverKernels.hpp | 33 +- .../multiphysics/PoromechanicsSolver.hpp | 22 ++ ...ePhasePoromechanicsConformingFractures.cpp | 15 +- ...ePhasePoromechanicsConformingFractures.hpp | 3 + ...glePhasePoromechanicsEmbeddedFractures.cpp | 45 +-- .../SinglePhasePoromechanicsEFEM.hpp | 17 +- .../SinglePhasePoromechanicsFractures.hpp | 18 +- .../SolidMechanicsLagrangianFEM.cpp | 10 +- .../SolidMechanicsLagrangianFEM.hpp | 5 + .../solidMechanics/SolidMechanicsMPM.cpp | 2 +- .../solidMechanics/kernels/ExplicitMPM.hpp | 2 +- .../schema/docs/Constitutive.rst | 1 + .../schema/docs/Constitutive_other.rst | 1 + src/coreComponents/schema/docs/Coulomb.rst | 21 +- .../schema/docs/FrictionlessContact.rst | 16 +- .../schema/docs/Hydrofracture.rst | 1 - ...lidMechanicsAugmentedLagrangianContact.rst | 1 + .../docs/SolidMechanicsEmbeddedFractures.rst | 1 + .../docs/SolidMechanicsLagrangeContact.rst | 1 + .../docs/SolidMechanicsLagrangianSSLE.rst | 1 + .../docs/SolidMechanics_LagrangianFEM.rst | 1 + src/coreComponents/schema/schema.xsd | 37 +- src/coreComponents/schema/schema.xsd.other | 2 + src/docs/sphinx/CompleteXMLSchema.rst | 14 + .../KeyComponents/AddingNewSolver.rst | 14 +- 136 files changed, 2088 insertions(+), 1557 deletions(-) delete mode 100644 host-configs/apple/macOS_customized.cmake create mode 100644 src/coreComponents/constitutive/contact/BartonBandis.cpp create mode 100644 src/coreComponents/constitutive/contact/BartonBandis.hpp delete mode 100644 src/coreComponents/constitutive/contact/ContactBase.hpp delete mode 100644 src/coreComponents/constitutive/contact/CoulombContact.hpp rename src/coreComponents/constitutive/contact/{CoulombContact.cpp => CoulombFriction.cpp} (59%) create mode 100644 src/coreComponents/constitutive/contact/CoulombFriction.hpp create mode 100644 src/coreComponents/constitutive/contact/FrictionBase.cpp create mode 100644 src/coreComponents/constitutive/contact/FrictionBase.hpp rename src/coreComponents/constitutive/contact/{ContactSelector.hpp => FrictionSelector.hpp} (68%) create mode 100644 src/coreComponents/constitutive/contact/HydraulicApertureBase.cpp create mode 100644 src/coreComponents/constitutive/contact/HydraulicApertureBase.hpp create mode 100644 src/coreComponents/constitutive/contact/HydraulicApertureRelationSelector.hpp rename src/coreComponents/constitutive/contact/{ContactBase.cpp => HydraulicApertureTable.cpp} (78%) create mode 100644 src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp delete mode 100644 src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp delete mode 100644 src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 440853cc61d..14a5dd73076 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3202-6636-2821c93 + baseline: integratedTests/baseline_integratedTests-pr3197-6679-a003f43 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index dd686fc7877..be5e9d7d934 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR 3197 (2024-08-07) +==================== +Separation of contact and friction laws. + PR #3202 (2024-08-03) ====================== Acoustic VTI tests needed rebaselining after update in source and receiver location algorithm. diff --git a/examples/pygeosxExamples/modifyBoundaryCondition/pkn_example.xml b/examples/pygeosxExamples/modifyBoundaryCondition/pkn_example.xml index 18702b7b27f..57f6d330ce2 100644 --- a/examples/pygeosxExamples/modifyBoundaryCondition/pkn_example.xml +++ b/examples/pygeosxExamples/modifyBoundaryCondition/pkn_example.xml @@ -22,7 +22,6 @@ name="hydrofracture" solidSolverName="lagsolve" logLevel="1" - contactRelationName="fractureContact" flowSolverName="SinglePhaseFlow" surfaceGeneratorName="SurfaceGen" targetRegions="{ Domain, Fracture }"> @@ -39,8 +38,8 @@ timeIntegrationOption="QuasiStatic" discretization="FE1" name="lagsolve" - contactRelationName="fractureContact" - targetRegions="{ Domain, Fracture }"> + targetRegions="{ Domain, Fracture }" + contactPenaltyStiffness="1.0e0"> + materialList="{ water, rock, fractureFilling, fracturePorosity, fracturePerm, nullSolid, hApertureTable }"/> @@ -112,9 +111,11 @@ compressibility="0.0"/> + name="fractureContact"/> + + diff --git a/host-configs/apple/macOS_customized.cmake b/host-configs/apple/macOS_customized.cmake deleted file mode 100644 index c1707a0b945..00000000000 --- a/host-configs/apple/macOS_customized.cmake +++ /dev/null @@ -1,7 +0,0 @@ -set( HOMEBREW_DIR $ENV{HOMEBREW_DIR} ) -set( CONFIG_NAME $ENV{GEOS_CONFIG_NAME} ) - -set(Python3_ROOT_DIR $ENV{GEOS_PYTHON_DIR} CACHE PATH "") -set(Python3_EXECUTABLE ${Python3_ROOT_DIR}/bin/python3 CACHE PATH "") - -include(${CMAKE_CURRENT_LIST_DIR}/macOS_base.cmake) diff --git a/inputFiles/almContactMechanics/ALM_stickFault_base.xml b/inputFiles/almContactMechanics/ALM_stickFault_base.xml index 444c2cee4c7..7a8c79aa7d8 100644 --- a/inputFiles/almContactMechanics/ALM_stickFault_base.xml +++ b/inputFiles/almContactMechanics/ALM_stickFault_base.xml @@ -92,8 +92,11 @@ + frictionCoefficient="0.1"/> + + diff --git a/inputFiles/efemFractureMechanics/EmbFrac_Compression_CoulombFriction_base.xml b/inputFiles/efemFractureMechanics/EmbFrac_Compression_CoulombFriction_base.xml index b6e12ad2dd5..2e2568a0250 100644 --- a/inputFiles/efemFractureMechanics/EmbFrac_Compression_CoulombFriction_base.xml +++ b/inputFiles/efemFractureMechanics/EmbFrac_Compression_CoulombFriction_base.xml @@ -9,7 +9,8 @@ initialDt="10" discretization="FE1" timeIntegrationOption="QuasiStatic" - logLevel="1"> + logLevel="1" + contactPenaltyStiffness="1.0e12"> @@ -60,12 +61,10 @@ defaultShearModulus="1.0e10"/> + frictionCoefficient = "0.8"/> @@ -116,13 +115,6 @@ scale="0.0" setNames="{ zneg, zpos }"/> - - - - + logLevel="1" + contactPenaltyStiffness="1.0e8"> @@ -60,18 +61,9 @@ defaultShearModulus="1.0e10"/> + name="frictionLaw"/> - - - - + useStaticCondensation="1" + contactPenaltyStiffness="0.0e8"> + useStaticCondensation="1" + contactPenaltyStiffness="0.0e8"> + useStaticCondensation="1" + contactPenaltyStiffness="0.0e8"> + logLevel="1" + contactPenaltyStiffness="0.0e8"> @@ -85,19 +86,10 @@ defaultShearModulus="1.0e10"/> + name="frictionLaw"/> - - - - @@ -35,19 +35,10 @@ defaultShearModulus="1.0e10"/> + name="frictionLaw"/> - - - - + logLevel="1" + contactPenaltyStiffness="0.0e8"> + logLevel="1" + contactPenaltyStiffness="0.0e8"> + useStaticCondensation="1" + contactPenaltyStiffness="0.0e8"> + useStaticCondensation="1" + contactPenaltyStiffness="0.0e8"> + logLevel="1" + contactPenaltyStiffness="0.0e8"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"/> + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -126,9 +126,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/heterogeneousInSitu_base.xml b/inputFiles/hydraulicFracturing/heterogeneousInSitu_base.xml index bbf01a6a976..8c55433af13 100644 --- a/inputFiles/hydraulicFracturing/heterogeneousInSitu_base.xml +++ b/inputFiles/hydraulicFracturing/heterogeneousInSitu_base.xml @@ -11,7 +11,6 @@ surfaceGeneratorName="SurfaceGen" logLevel="1" targetRegions="{ Fracture }" - contactRelationName="fractureContact" maxNumResolves="2"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1e12"> + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -157,9 +157,11 @@ compressibility="0.0"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/heterogeneousInSitu_smoke.xml b/inputFiles/hydraulicFracturing/heterogeneousInSitu_smoke.xml index b75048cd2c2..10a8b07477f 100644 --- a/inputFiles/hydraulicFracturing/heterogeneousInSitu_smoke.xml +++ b/inputFiles/hydraulicFracturing/heterogeneousInSitu_smoke.xml @@ -44,7 +44,6 @@ surfaceGeneratorName="SurfaceGen" logLevel="1" targetRegions="{ Fracture }" - contactRelationName="fractureContact" maxNumResolves="2"> + contactRelationName="fractureContact" + contactPenaltyStiffness="0.0e12"> + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -167,9 +167,11 @@ compressibility="0.0"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/hydrofractureSinglePhase2d.xml b/inputFiles/hydraulicFracturing/hydrofractureSinglePhase2d.xml index 5d1e865b642..40cb8c20c2c 100644 --- a/inputFiles/hydraulicFracturing/hydrofractureSinglePhase2d.xml +++ b/inputFiles/hydraulicFracturing/hydrofractureSinglePhase2d.xml @@ -9,8 +9,7 @@ solidSolverName="lagsolve" flowSolverName="SinglePhaseFlow" surfaceGeneratorName="SurfaceGen" - targetRegions="{ Fracture }" - contactRelationName="fractureContact"> + targetRegions="{ Fracture }"> + contactRelationName="fractureContact" + contactPenaltyStiffness="0.0e12"/> @@ -160,9 +160,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/kgdBase_C3D6_base.xml b/inputFiles/hydraulicFracturing/kgdBase_C3D6_base.xml index 19f102b76c5..3efb892cf10 100644 --- a/inputFiles/hydraulicFracturing/kgdBase_C3D6_base.xml +++ b/inputFiles/hydraulicFracturing/kgdBase_C3D6_base.xml @@ -24,7 +24,7 @@ + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -62,10 +62,11 @@ name="fracturePerm"/> + name="fractureContact"/> + diff --git a/inputFiles/hydraulicFracturing/kgdEdgeBased_C3D6_base.xml b/inputFiles/hydraulicFracturing/kgdEdgeBased_C3D6_base.xml index 298684e5927..c775276de50 100644 --- a/inputFiles/hydraulicFracturing/kgdEdgeBased_C3D6_base.xml +++ b/inputFiles/hydraulicFracturing/kgdEdgeBased_C3D6_base.xml @@ -13,8 +13,7 @@ solidSolverName="lagsolve" flowSolverName="SinglePhaseFlow" surfaceGeneratorName="SurfaceGen" - targetRegions="{ Fracture }" - contactRelationName="fractureContact"> + targetRegions="{ Fracture }"> + contactRelationName="fractureContact" + contactPenaltyStiffness="0.0e8"> + targetRegions="{ Fracture }"> + contactRelationName="fractureContact" + contactPenaltyStiffness="0.0e8"/> @@ -30,7 +29,8 @@ timeIntegrationOption="QuasiStatic" discretization="FE1" targetRegions="{ Domain, Fracture }" - contactRelationName="fractureContact"/> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0"/> @@ -72,7 +72,7 @@ + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -114,9 +114,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/kgdToughnessDominated_poroelastic_base.xml b/inputFiles/hydraulicFracturing/kgdToughnessDominated_poroelastic_base.xml index 2aba63788b4..9624bd12259 100644 --- a/inputFiles/hydraulicFracturing/kgdToughnessDominated_poroelastic_base.xml +++ b/inputFiles/hydraulicFracturing/kgdToughnessDominated_poroelastic_base.xml @@ -11,7 +11,6 @@ logLevel="1" targetRegions="{ Domain, Fracture }" isMatrixPoroelastic="1" - contactRelationName="fractureContact" maxNumResolves="2"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0"/> + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -117,9 +117,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/kgdValidation_base.xml b/inputFiles/hydraulicFracturing/kgdValidation_base.xml index 59c48a60734..1cb74613cac 100644 --- a/inputFiles/hydraulicFracturing/kgdValidation_base.xml +++ b/inputFiles/hydraulicFracturing/kgdValidation_base.xml @@ -11,7 +11,6 @@ surfaceGeneratorName="SurfaceGen" logLevel="1" targetRegions="{ Fracture }" - contactRelationName="fractureContact" maxNumResolves="2"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0"/> @@ -75,7 +75,7 @@ + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -115,9 +115,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/kgdViscosityDominated_base.xml b/inputFiles/hydraulicFracturing/kgdViscosityDominated_base.xml index 28cb49e72b3..8bc09cdc194 100644 --- a/inputFiles/hydraulicFracturing/kgdViscosityDominated_base.xml +++ b/inputFiles/hydraulicFracturing/kgdViscosityDominated_base.xml @@ -12,7 +12,6 @@ logLevel="1" initialDt="0.1" targetRegions="{ Fracture }" - contactRelationName="fractureContact" maxNumResolves="2"> @@ -30,7 +29,8 @@ timeIntegrationOption="QuasiStatic" discretization="FE1" targetRegions="{ Domain, Fracture }" - contactRelationName="fractureContact"/> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"/> @@ -73,7 +73,7 @@ + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -115,9 +115,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/kgdViscosityDominated_poroelastic_base.xml b/inputFiles/hydraulicFracturing/kgdViscosityDominated_poroelastic_base.xml index 8161813edac..c369c1c522f 100644 --- a/inputFiles/hydraulicFracturing/kgdViscosityDominated_poroelastic_base.xml +++ b/inputFiles/hydraulicFracturing/kgdViscosityDominated_poroelastic_base.xml @@ -11,7 +11,6 @@ logLevel="1" targetRegions="{ Domain, Fracture }" isMatrixPoroelastic="1" - contactRelationName="fractureContact" maxNumResolves="2"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"/> + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -118,9 +118,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_base.xml b/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_base.xml index bf1560af82a..726c70762b7 100644 --- a/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_base.xml +++ b/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_base.xml @@ -11,7 +11,7 @@ + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -51,9 +51,12 @@ name="fracturePerm"/> + name="fractureContact"/> + + + diff --git a/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_benchmark.xml b/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_benchmark.xml index be67d03b8e2..59abb35871a 100644 --- a/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_benchmark.xml +++ b/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_benchmark.xml @@ -16,7 +16,6 @@ surfaceGeneratorName="SurfaceGen" logLevel="1" targetRegions="{ Fracture }" - contactRelationName="fractureContact" maxNumResolves="5" initialDt="0.1"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"> + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -66,9 +66,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + @@ -82,8 +84,7 @@ + name="singlePhaseTPFA"/> diff --git a/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_poroelastic_benchmark.xml b/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_poroelastic_benchmark.xml index dff5dd1605c..e830a52c5fd 100644 --- a/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_poroelastic_benchmark.xml +++ b/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_poroelastic_benchmark.xml @@ -17,7 +17,6 @@ logLevel="1" targetRegions="{ Domain, Fracture }" isMatrixPoroelastic="1" - contactRelationName="fractureContact" maxNumResolves="5" initialDt="0.1"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"> + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -51,9 +51,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_benchmark.xml b/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_benchmark.xml index 06b52ff40af..a8f78adf606 100644 --- a/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_benchmark.xml +++ b/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_benchmark.xml @@ -16,7 +16,6 @@ surfaceGeneratorName="SurfaceGen" logLevel="1" targetRegions="{ Fracture }" - contactRelationName="fractureContact" maxNumResolves="1" initialDt="0.1"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"> + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -66,9 +66,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_poroelastic_benchmark.xml b/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_poroelastic_benchmark.xml index cf731e4fe59..0d1b9485772 100644 --- a/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_poroelastic_benchmark.xml +++ b/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_poroelastic_benchmark.xml @@ -17,7 +17,6 @@ logLevel="1" targetRegions="{ Domain, Fracture }" isMatrixPoroelastic="1" - contactRelationName="fractureContact" maxNumResolves="1" initialDt="0.1"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"> + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -51,9 +51,12 @@ name="fracturePerm"/> + name="fractureContact"/> + + + diff --git a/inputFiles/hydraulicFracturing/pknViscosityDominated_benchmark.xml b/inputFiles/hydraulicFracturing/pknViscosityDominated_benchmark.xml index 9b4d96a8d12..2b8dce7a719 100644 --- a/inputFiles/hydraulicFracturing/pknViscosityDominated_benchmark.xml +++ b/inputFiles/hydraulicFracturing/pknViscosityDominated_benchmark.xml @@ -16,7 +16,6 @@ surfaceGeneratorName="SurfaceGen" logLevel="1" targetRegions="{ Fracture }" - contactRelationName="fractureContact" maxNumResolves="5" initialDt="0.1"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"> + materialList="{ water, fractureFilling, fractureContact, hApertureModel }"/> @@ -66,9 +66,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/pknViscosityDominated_poroelastic_benchmark.xml b/inputFiles/hydraulicFracturing/pknViscosityDominated_poroelastic_benchmark.xml index 4dde5d644d2..72b1be2f4d8 100644 --- a/inputFiles/hydraulicFracturing/pknViscosityDominated_poroelastic_benchmark.xml +++ b/inputFiles/hydraulicFracturing/pknViscosityDominated_poroelastic_benchmark.xml @@ -17,7 +17,6 @@ logLevel="1" targetRegions="{ Domain, Fracture }" isMatrixPoroelastic="1" - contactRelationName="fractureContact" maxNumResolves="5" initialDt="0.1"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"> + contactRelationName="fractureContact" + contactPenaltyStiffness="1.0e0"> + materialList="{water, rock, fractureFilling, fractureContact, hApertureModel}"/> @@ -74,9 +74,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/hydraulicFracturing/walshQuarterNoChombo_benchmark.xml b/inputFiles/hydraulicFracturing/walshQuarterNoChombo_benchmark.xml index 0a715d4089a..957b63bd278 100644 --- a/inputFiles/hydraulicFracturing/walshQuarterNoChombo_benchmark.xml +++ b/inputFiles/hydraulicFracturing/walshQuarterNoChombo_benchmark.xml @@ -28,7 +28,6 @@ surfaceGeneratorName="SurfaceGen" logLevel="1" targetRegions="{Fracture}" - contactRelationName="fractureContact" maxNumResolves="5" initialDt="0.1"> diff --git a/inputFiles/hydraulicFracturing/walshQuarterNoChombo_smoke.xml b/inputFiles/hydraulicFracturing/walshQuarterNoChombo_smoke.xml index 3d0d8a5c3e8..9990dd5c291 100644 --- a/inputFiles/hydraulicFracturing/walshQuarterNoChombo_smoke.xml +++ b/inputFiles/hydraulicFracturing/walshQuarterNoChombo_smoke.xml @@ -29,7 +29,6 @@ surfaceGeneratorName="SurfaceGen" logLevel="1" targetRegions="{Fracture}" - contactRelationName="fractureContact" maxNumResolves="5" initialDt="0.1"> diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml index c08000ed8c1..09667b5e88f 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_PEBICrack_base.xml @@ -26,7 +26,7 @@ - + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_base.xml index 58afadaed04..c309080025d 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_base.xml @@ -48,8 +48,8 @@ + defaultAperture="1.0e-6" + materialList="{ frictionLaw, rock }"/> @@ -60,9 +60,8 @@ defaultShearModulus="1.0e4"/> @@ -123,13 +122,6 @@ scale="0.0" setNames="{ rear }"/> - - - - + defaultAperture="1.0e-6" + materialList="{ frictionLaw }"/> @@ -62,10 +62,9 @@ defaultShearModulus="2.0e3"/> + frictionCoefficient="0.577350269"/> @@ -156,10 +155,6 @@ inputVarNames="{ time }" coordinates="{ 0.0, 5.0, 10.0 }" values="{ 0.0, 5.e0, -5.e0 }"/> - diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml index fa6999ef17a..28b80df0368 100755 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml @@ -57,8 +57,8 @@ + defaultAperture="1.0e-6" + materialList="{ frictionLaw }"/> @@ -70,21 +70,12 @@ defaultShearModulus="1.0e10"/> + frictionCoefficient="0.577350269"/> - - - - - + defaultAperture="1.0e-6" + materialList="{ frictionLaw }"/> @@ -72,10 +72,9 @@ defaultShearModulus="29.17e9"/> + frictionCoefficient="0.577350269"/> @@ -160,11 +159,6 @@ inputVarNames="{ time }" coordinates="{ 0.0, 1.0 }" values="{ 0.0, 1.e0 }"/> - - diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_base.xml index c47369c9a73..4c4c2bb1379 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_base.xml @@ -48,8 +48,8 @@ + defaultAperture="1.0e-6" + materialList="{ frictionLaw }"/> @@ -60,10 +60,9 @@ defaultShearModulus="1.0e4"/> + frictionCoefficient="0.577350269"/> @@ -137,12 +136,7 @@ name="ForceTimeFunction" inputVarNames="{ time }" coordinates="{ 0.0, 2.0 }" - values="{ 0.0, 2.e0 }"/> - - + values="{ 0.0, 2.e0 }"/> diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml index 7abd1e6c74b..0c5350192c1 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml @@ -82,8 +82,8 @@ + defaultAperture="1.0e-6" + materialList="{ frictionLaw, rock }"/> @@ -95,18 +95,12 @@ defaultShearModulus="9e9"/> + frictionCoefficient="0.1"/> - - + defaultAperture="1.0e-6" + materialList="{ frictionLaw }"/> @@ -58,10 +58,9 @@ defaultShearModulus="1.0e10"/> + frictionCoefficient="0.577350269"/> @@ -115,13 +114,6 @@ setNames="{ core }"/> - - - - diff --git a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml index 0a1704fd9c5..7c53d0d4981 100644 --- a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml +++ b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml @@ -88,7 +88,7 @@ @@ -146,8 +146,11 @@ + frictionCoefficient="0.01"/> + + diff --git a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_edfm_base.xml b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_edfm_base.xml index f43116ee181..480796bc952 100755 --- a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_edfm_base.xml +++ b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_edfm_base.xml @@ -22,13 +22,13 @@ name="fractureMechSolver" targetRegions="{ Domain, Fracture }" timeIntegrationOption="QuasiStatic" - discretization="FE1"/> + discretization="FE1" + contactPenaltyStiffness="2.0e11"/> + targetRegions="{ Domain, Fracture }"/> @@ -120,9 +120,11 @@ initialPermeability="{1.0e-12, 1.0e-12, 1.0e-12}"/> + name="frictionLaw"/> + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml index 4c674d7bacc..390f1cec5a2 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_faultSlip_base.xml @@ -31,7 +31,7 @@ @@ -87,8 +87,11 @@ + frictionCoefficient="0.1"/> + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_base.xml b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_base.xml index 9aa53c702f6..29509e3a858 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_base.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_conformingFracture_2d_openingFrac_base.xml @@ -24,7 +24,7 @@ @@ -78,10 +78,13 @@ name="fracturePerm"/> + frictionCoefficient="0.577350269"/> + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_base.xml b/inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_base.xml index 5f5aa06d519..1aa468ae144 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_base.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_dfm_PEBICrack_base.xml @@ -11,7 +11,7 @@ @@ -118,10 +118,13 @@ name="fracturePerm"/> + frictionCoefficient="0.01"/> + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_base.xml b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_base.xml index 8242a94caed..3d8a8b10309 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_base.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_base.xml @@ -23,7 +23,8 @@ name="fractureMechSolver" targetRegions="{ Domain, Fracture }" timeIntegrationOption="QuasiStatic" - discretization="FE1"/> + discretization="FE1" + contactPenaltyStiffness="4.0e9"/> @@ -120,11 +121,15 @@ name="fracturePerm"/> + name="fractureContact"/> + + + + + discretization="FE1" + contactPenaltyStiffness="1e12"> @@ -247,9 +248,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_small.xml b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_small.xml index a758775ec56..074d11adb4e 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_small.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_small.xml @@ -25,7 +25,8 @@ name="fractureMechSolver" targetRegions="{ Reservoir, Overburden, Underburden, Sideburden, Fracture }" timeIntegrationOption="QuasiStatic" - discretization="FE1"> + discretization="FE1" + contactPenaltyStiffness="1e12"> @@ -247,9 +248,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_pennyCrack_base.xml b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_pennyCrack_base.xml index c17733c43ed..7e4c4ad9393 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_pennyCrack_base.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_pennyCrack_base.xml @@ -38,7 +38,7 @@ name="Fracture" faceBlock="embeddedSurfaceSubRegion" subRegionType="embeddedElement" - materialList="{ water, fractureFilling, fractureContact }" + materialList="{ water, fractureFilling, fractureContact, hApertureModel }" defaultAperture="1e-3"/> @@ -92,9 +92,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_pennyCrack_benchmark.xml b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_pennyCrack_benchmark.xml index a2979a5b39a..3ca8d754e85 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_pennyCrack_benchmark.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_pennyCrack_benchmark.xml @@ -28,7 +28,8 @@ name="fractureMechSolver" targetRegions="{ Domain, Fracture }" timeIntegrationOption="QuasiStatic" - discretization="FE1"/> + discretization="FE1" + contactPenaltyStiffness="1e12"/> + discretization="FE1" + contactPenaltyStiffness="1e12"/> + discretization="FE1" + contactPenaltyStiffness="0.0e8"/> @@ -163,9 +164,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/poromechanicsFractures/SlipPermeability_embeddedFrac.xml b/inputFiles/poromechanicsFractures/SlipPermeability_embeddedFrac.xml index 81aa4adae38..ce28512cb48 100755 --- a/inputFiles/poromechanicsFractures/SlipPermeability_embeddedFrac.xml +++ b/inputFiles/poromechanicsFractures/SlipPermeability_embeddedFrac.xml @@ -22,7 +22,8 @@ name="fractureMechSolver" targetRegions="{ Domain, Fracture }" timeIntegrationOption="QuasiStatic" - discretization="FE1"/> + discretization="FE1" + contactPenaltyStiffness="2.0e11"/> @@ -237,9 +238,11 @@ name="fracturePerm2"/> + name="fractureContact"/> + + diff --git a/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml b/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml index 5d915f898c5..8be34031377 100755 --- a/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml +++ b/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml @@ -22,7 +22,8 @@ name="fractureMechSolver" targetRegions="{ Domain, Fracture }" timeIntegrationOption="QuasiStatic" - discretization="FE1"/> + discretization="FE1" + contactPenaltyStiffness="2.0e11"/> + usePEDFM="1"/> @@ -64,7 +64,7 @@ name="Fracture" faceBlock="embeddedSurfaceSubRegion" subRegionType="embeddedElement" - materialList="{ water, fractureFilling, fractureContact }" + materialList="{ water, fractureFilling, fractureContact, hApertureModel}" defaultAperture="1e-3"/> @@ -121,9 +121,11 @@ initialPermeability="{1e-15, 1e-15, 1e-15}"/> + name="fractureContact"/> + + diff --git a/inputFiles/poromechanicsFractures/WillisRichardsPermeability_efem-edfm_base.xml b/inputFiles/poromechanicsFractures/WillisRichardsPermeability_efem-edfm_base.xml index 826edbe9e27..f5fee5d296b 100755 --- a/inputFiles/poromechanicsFractures/WillisRichardsPermeability_efem-edfm_base.xml +++ b/inputFiles/poromechanicsFractures/WillisRichardsPermeability_efem-edfm_base.xml @@ -22,7 +22,8 @@ name="fractureMechSolver" targetRegions="{ Domain, Fracture }" timeIntegrationOption="QuasiStatic" - discretization="FE1"/> + discretization="FE1" + contactPenaltyStiffness="2.0e11"/> @@ -123,9 +124,11 @@ refClosureStress="1.0e7"/> + name="fractureContact"/> + + diff --git a/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_base.xml b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_base.xml index bd3bba82795..0623d767f54 100644 --- a/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_base.xml +++ b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_base.xml @@ -49,8 +49,11 @@ + frictionCoefficient="0.01"/> + + @@ -147,7 +150,7 @@ diff --git a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml index cb00829f403..1ba0e49f27f 100644 --- a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml +++ b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml @@ -66,9 +66,11 @@ name="fracturePerm"/> + name="fractureContact"/> + + diff --git a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_conforming_base.xml b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_conforming_base.xml index e8ca36eaade..6f855810a38 100644 --- a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_conforming_base.xml +++ b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_conforming_base.xml @@ -74,7 +74,7 @@ diff --git a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_base.xml b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_base.xml index 3d8cf3e4a03..47df41a1533 100644 --- a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_base.xml +++ b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_base.xml @@ -29,7 +29,8 @@ name="fractureMechSolver" targetRegions="{ RockMatrix, Fracture }" timeIntegrationOption="QuasiStatic" - discretization="FE1"/> + discretization="FE1" + contactPenaltyStiffness="4.0e9"/> diff --git a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml index f268a9c3ee1..d2b84ef7de2 100644 --- a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml +++ b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml @@ -27,7 +27,8 @@ name="fractureMechSolver" targetRegions="{ Reservoir, Overburden, Underburden, Sideburden, Fracture }" timeIntegrationOption="QuasiStatic" - discretization="FE1"> + discretization="FE1" + contactPenaltyStiffness="0.0e8"> + name="fractureContact"/> + + diff --git a/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml b/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml index afb8cd86e99..0f782918ec9 100644 --- a/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml +++ b/inputFiles/wellbore/CasedElasticWellbore_ImperfectInterfaces_base.xml @@ -74,9 +74,7 @@ + frictionCoefficient="0.5"/> - diff --git a/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml b/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml index 3a6d0653f9e..4cc92cc6c6c 100644 --- a/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml +++ b/inputFiles/wellbore/CasedThermoElasticWellbore_ImperfectInterfaces_base.xml @@ -78,7 +78,7 @@ @@ -100,11 +100,13 @@ + frictionCoefficient="0.5"/> + + 0 + */ + GEOS_HOST_DEVICE + real64 computeHydraulicAperture( real64 const aperture, + real64 const normalTraction, + real64 & dHydraulicAperture_aperture, + real64 & dHydraulicAperture_dNormalStress ) const; + +private: + real64 m_aperture0; + + real64 m_referenceNormalStress; +}; + + +/** + * @class BartonBandis + * + * This class serves as the interface for implementing contact enforcement constitutive relations. + * This does not include the actual enforcement algorithm, but only the constitutive relations that + * govern the behavior of the contact. So things like penalty, or friction, or kinematic constraint. + */ +class BartonBandis : public HydraulicApertureBase +{ +public: + + /** + * @brief The standard data repository constructor + * @param name The name of the relation in the data repository + * @param parent The name of the parent Group that holds this relation object. + */ + BartonBandis( string const & name, + Group * const parent ); + + /** + * @brief default destructor + */ + virtual ~BartonBandis() override; + + + /// Type of kernel wrapper for in-kernel update + using KernelWrapper = BartonBandisUpdates; + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelWrapper() const; + +private: + + struct viewKeyStruct : public HydraulicApertureBase::viewKeyStruct + { + /// string/key for reference normal stress + static constexpr char const * referenceNormalStressString() { return "referenceNormalStress"; } + }; + /// Reference normal stress + real64 m_referenceNormalStress; +}; + +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +real64 BartonBandisUpdates::computeHydraulicAperture( real64 const aperture, + real64 const normalTraction, + real64 & dHydraulicAperture_aperture, + real64 & dHydraulicAperture_dNormalStress ) const +{ + real64 const hydraulicAperture = ( aperture >= 0.0 ) ? (aperture + m_aperture0) : m_aperture0 / ( 1 + 9*normalTraction/m_referenceNormalStress ); + dHydraulicAperture_dNormalStress = ( aperture >= 0.0 ) ? 0.0 : -hydraulicAperture / ( 1 + 9*normalTraction/m_referenceNormalStress ) * 9/m_referenceNormalStress; + dHydraulicAperture_aperture = ( aperture >= 0.0 ) ? 1.0 : 0.0; + + return hydraulicAperture; ///It would be nice to change this to return a tuple. +} + +} /* namespace constitutive */ + +} /* namespace geos */ + +#endif /* GEOS_CONSTITUTIVE_CONTACT_HYDRAULICAPERTURETABLE_HPP_ */ diff --git a/src/coreComponents/constitutive/contact/ContactBase.hpp b/src/coreComponents/constitutive/contact/ContactBase.hpp deleted file mode 100644 index 7b088ed5e17..00000000000 --- a/src/coreComponents/constitutive/contact/ContactBase.hpp +++ /dev/null @@ -1,269 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -/** - * @file ContactBase.hpp - */ - -#ifndef GEOS_CONSTITUTIVE_CONTACT_CONTACTBASE_HPP_ -#define GEOS_CONSTITUTIVE_CONTACT_CONTACTBASE_HPP_ - -#include "constitutive/ConstitutiveBase.hpp" -#include "functions/TableFunction.hpp" -#include "physicsSolvers/contact/ContactFields.hpp" - - -namespace geos -{ - -namespace constitutive -{ - -/** - * @class ContactBaseUpdates - * - * This class is used for in-kernel contact relation updates - */ -class ContactBaseUpdates -{ -public: - - ContactBaseUpdates( real64 const & penaltyStiffness, - real64 const & shearStiffness, - real64 const & displacementJumpThreshold, - TableFunction const & apertureTable ) - : m_penaltyStiffness( penaltyStiffness ), - m_shearStiffness( shearStiffness ), - m_displacementJumpThreshold( displacementJumpThreshold ), - m_apertureTable( apertureTable.createKernelWrapper() ) - {} - - /// Default copy constructor - ContactBaseUpdates( ContactBaseUpdates const & ) = default; - - /// Default move constructor - ContactBaseUpdates( ContactBaseUpdates && ) = default; - - /// Deleted default constructor - ContactBaseUpdates() = default; - - /// Deleted copy assignment operator - ContactBaseUpdates & operator=( ContactBaseUpdates const & ) = delete; - - /// Deleted move assignment operator - ContactBaseUpdates & operator=( ContactBaseUpdates && ) = delete; - - /** - * @brief Evaluate the effective aperture, and its derivative wrt aperture - * @param[in] aperture the model aperture/gap - * @param[out] dHydraulicAperture_dAperture the derivative of the effective aperture wrt aperture - * @return The hydraulic aperture that is always > 0 - */ - GEOS_HOST_DEVICE - virtual real64 computeHydraulicAperture( real64 const aperture, - real64 & dHydraulicAperture_dAperture ) const; - - - /** - * @brief Evaluate the traction vector and its derivatives wrt to pressure and jump - * @param[in] dispJump the displacement jump - * @param[in] fractureState the fracture state - * @param[out] tractionVector the traction vector - * @param[out] dTractionVector_dJump the derivative of the traction vector wrt displacement jump - */ - GEOS_HOST_DEVICE - inline - virtual void computeTraction( localIndex const k, - arraySlice1d< real64 const > const & oldDispJump, - arraySlice1d< real64 const > const & dispJump, - integer const & fractureState, - arraySlice1d< real64 > const & tractionVector, - arraySlice2d< real64 > const & dTractionVector_dJump ) const - {GEOS_UNUSED_VAR( k, oldDispJump, dispJump, tractionVector, dTractionVector_dJump, fractureState );} - - /** - * @brief Evaluate the traction vector and its derivatives wrt to pressure and jump - * @param[in] dispJump the displacement jump - * @param[in] tractionVector the traction vector - * @param[out] fractureState the fracture state - */ - GEOS_HOST_DEVICE - inline - virtual void updateFractureState( localIndex const k, - arraySlice1d< real64 const > const & dispJump, - arraySlice1d< real64 const > const & tractionVector, - integer & fractureState ) const - { GEOS_UNUSED_VAR( k, dispJump, tractionVector, fractureState ); } - - /** - * @brief Update the traction with the pressure term - * @param[in] pressure the pressure term - * @param[in] isOpen a flag specifying whether the fracture is open or closed - * @param[inout] traction the current tractionVector - * @param[out] dTraction_dPressure the derivative of the fist component of traction wrt pressure - * @return the updated traction - */ - GEOS_HOST_DEVICE - virtual void addPressureToTraction( real64 const & pressure, - arraySlice1d< real64 >const & tractionVector, - real64 & dTraction_dPressure ) const; - - /** - * @brief Evaluate the limit tangential traction norm and return the derivative wrt normal traction - * @param[in] normalTraction the normal traction - * @param[out] dLimitTangentialTractionNorm_dTraction the derivative of the limit tangential traction norm wrt normal traction - * @return the limit tangential traction norm - */ - GEOS_HOST_DEVICE - inline - virtual real64 computeLimitTangentialTractionNorm( real64 const & normalTraction, - real64 & dLimitTangentialTractionNorm_dTraction ) const - { GEOS_UNUSED_VAR( normalTraction, dLimitTangentialTractionNorm_dTraction ); return 0; }; - -protected: - - /// The penalty stiffness - real64 m_penaltyStiffness; - - /// The shear stiffness - real64 m_shearStiffness; - - /// A threshold valued to determine whether a fracture is open or not. - real64 m_displacementJumpThreshold; - - /// The aperture table function wrapper - TableFunction::KernelWrapper m_apertureTable; -}; - - -/** - * @class ContactBase - * - * This class serves as the interface for implementing contact enforcement constitutive relations. - * This does not include the actual enforcement algorithm, but only the constitutive relations that - * govern the behavior of the contact. So things like penalty, or friction, or kinematic constraint. - */ -class ContactBase : public ConstitutiveBase -{ -public: - - /** - * @brief The standard data repository constructor - * @param name The name of the relation in the data repository - * @param parent The name of the parent Group that holds this relation object. - */ - ContactBase( string const & name, - Group * const parent ); - - /** - * @brief default destructor - */ - virtual ~ContactBase() override; - - virtual void allocateConstitutiveData( dataRepository::Group & parent, - localIndex const numConstitutivePointsPerParentIndex ) override; - - /** - * @brief accessor for penalty stiffness - * @return the stiffness - */ - real64 stiffness() const { return m_penaltyStiffness; } - - - /// Type of kernel wrapper for in-kernel update - using KernelWrapper = ContactBaseUpdates; - - /** - * @brief Create an update kernel wrapper. - * @return the wrapper - */ - KernelWrapper createKernelWrapper() const; - - /** - * @struct Structure to hold scoped key names - */ - struct viewKeyStruct : public ConstitutiveBase::viewKeyStruct - { - /// string/key for penalty stiffness - static constexpr char const * penaltyStiffnessString() { return "penaltyStiffness"; } - - /// string/key for shear stiffness - static constexpr char const * shearStiffnessString() { return "shearStiffness"; } - - /// string/key for the displacement jump threshold value - static constexpr char const * displacementJumpThresholdString() { return "displacementJumpThreshold"; } - - /// string/key for aperture tolerance - static constexpr char const * apertureToleranceString() { return "apertureTolerance"; } - - /// string/key for aperture table name - static constexpr char const * apertureTableNameString() { return "apertureTableName"; } - }; - -protected: - virtual void postInputInitialization() override; - - virtual void initializePreSubGroups() override; - - /** - * @brief Validate the values provided in the aperture table - * @param[in] apertureTable the effective aperture vs aperture table - */ - void validateApertureTable( TableFunction const & apertureTable ) const; - - - /// The value of penalty to penetration - real64 m_penaltyStiffness; - - /// The value of the shear stiffness - real64 m_shearStiffness; - - /// The aperture tolerance to avoid floating point errors in expressions involving aperture - real64 m_apertureTolerance; - - /// The name of the aperture table, if any - string m_apertureTableName; - - /// A threshold valued to determine whether a fracture is open or not. - real64 m_displacementJumpThreshold; - - /// Pointer to the function that limits the model aperture to a physically admissible value. - TableFunction const * m_apertureTable; -}; - -GEOS_HOST_DEVICE -GEOS_FORCE_INLINE -real64 ContactBaseUpdates::computeHydraulicAperture( real64 const aperture, - real64 & dHydraulicAperture_dAperture ) const -{ - return m_apertureTable.compute( &aperture, &dHydraulicAperture_dAperture ); -} - -GEOS_HOST_DEVICE -GEOS_FORCE_INLINE -void ContactBaseUpdates::addPressureToTraction( real64 const & pressure, - arraySlice1d< real64 > const & tractionVector, - real64 & dTraction_dPressure ) const -{ - tractionVector[0] -= pressure; - dTraction_dPressure = -1.0; -} - - -} /* namespace constitutive */ - -} /* namespace geos */ - -#endif /* GEOS_CONSTITUTIVE_CONTACT_CONTACTBASE_HPP_ */ diff --git a/src/coreComponents/constitutive/contact/CoulombContact.hpp b/src/coreComponents/constitutive/contact/CoulombContact.hpp deleted file mode 100644 index 89b39211b0d..00000000000 --- a/src/coreComponents/constitutive/contact/CoulombContact.hpp +++ /dev/null @@ -1,328 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -/** - * @file CoulombContact.hpp - */ - -#ifndef GEOS_CONSTITUTIVE_CONTACT_COULOMBCONTACT_HPP_ -#define GEOS_CONSTITUTIVE_CONTACT_COULOMBCONTACT_HPP_ - -#include "ContactBase.hpp" - -namespace geos -{ - -namespace constitutive -{ - -/** - * @class CoulombContactUpdates - * - * This class is used for in-kernel contact relation updates - */ -class CoulombContactUpdates : public ContactBaseUpdates -{ -public: - - CoulombContactUpdates( real64 const & penaltyStiffness, - real64 const & shearStiffness, - real64 const & displacementJumpThreshold, - TableFunction const & apertureTable, - real64 const & cohesion, - real64 const & frictionCoefficient, - arrayView2d< real64 > const & elasticSlip ) - : ContactBaseUpdates( penaltyStiffness, shearStiffness, displacementJumpThreshold, apertureTable ), - m_cohesion( cohesion ), - m_frictionCoefficient( frictionCoefficient ), - m_elasticSlip( elasticSlip ) - {} - - /// Default copy constructor - CoulombContactUpdates( CoulombContactUpdates const & ) = default; - - /// Default move constructor - CoulombContactUpdates( CoulombContactUpdates && ) = default; - - /// Deleted default constructor - CoulombContactUpdates() = delete; - - /// Deleted copy assignment operator - CoulombContactUpdates & operator=( CoulombContactUpdates const & ) = delete; - - /// Deleted move assignment operator - CoulombContactUpdates & operator=( CoulombContactUpdates && ) = delete; - - /** - * @brief Evaluate the limit tangential traction norm and return the derivative wrt normal traction - * @param[in] normalTraction the normal traction - * @param[out] dLimitTangentialTractionNorm_dTraction the derivative of the limit tangential traction norm wrt normal traction - * @return the limit tangential traction norm - */ - GEOS_HOST_DEVICE - inline - virtual real64 computeLimitTangentialTractionNorm( real64 const & normalTraction, - real64 & dLimitTangentialTractionNorm_dTraction ) const override final; - - GEOS_HOST_DEVICE - inline - virtual void computeTraction( localIndex const k, - arraySlice1d< real64 const > const & oldDispJump, - arraySlice1d< real64 const > const & dispJump, - integer const & fractureState, - arraySlice1d< real64 > const & tractionVector, - arraySlice2d< real64 > const & dTractionVector_dJump ) const override final; - - GEOS_HOST_DEVICE - inline - virtual void updateFractureState( localIndex const k, - arraySlice1d< real64 const > const & dispJump, - arraySlice1d< real64 const > const & tractionVector, - integer & fractureState ) const override final; - -private: - - /// The cohesion for each upper level dimension (i.e. cell) of *this - real64 m_cohesion; - - /// The friction coefficient for each upper level dimension (i.e. cell) of *this - real64 m_frictionCoefficient; - - arrayView2d< real64 > m_elasticSlip; -}; - - -/** - * @class CoulombContact - * - * Class to provide a CoulombContact friction model. - */ -class CoulombContact : public ContactBase -{ -public: - - /** - * constructor - * @param[in] name name of the instance in the catalog - * @param[in] parent the group which contains this instance - */ - CoulombContact( string const & name, Group * const parent ); - - /** - * Default Destructor - */ - virtual ~CoulombContact() override; - - /** - * @name Static Factory Catalog members and functions - */ - ///@{ - - /** - * @return A string that is used to register/lookup this class in the registry - */ - static string catalogName() { return "Coulomb"; } - - virtual string getCatalogName() const override { return catalogName(); } - - ///@} - - virtual void allocateConstitutiveData( dataRepository::Group & parent, - localIndex const numConstitutivePointsPerParentIndex ) override final; - - /** - * @brief Const accessor for cohesion - * @return A const reference to arrayView1d containing the - * cohesions (at every element). - */ - real64 const & cohesion() const { return m_cohesion; } - - /** - * @brief Const accessor for friction angle - * @return A const reference to arrayView1d containing the - * friction coefficient (at every element). - */ - real64 const & frictionCoefficient() const { return m_frictionCoefficient; } - - /// Type of kernel wrapper for in-kernel update - using KernelWrapper = CoulombContactUpdates; - - /** - * @brief Create an update kernel wrapper. - * @return the wrapper - */ - KernelWrapper createKernelWrapper() const; - -protected: - - virtual void postInputInitialization() override; - -private: - - /// The cohesion for each upper level dimension (i.e. cell) of *this - real64 m_cohesion; - - /// The friction coefficient for each upper level dimension (i.e. cell) of *this - real64 m_frictionCoefficient; - - /// Elastic slip - array2d< real64 > m_elasticSlip; - -/** - * @struct Set of "char const *" and keys for data specified in this class. - */ - struct viewKeyStruct : public ContactBase::viewKeyStruct - { - /// string/key for cohesion - static constexpr char const * cohesionString() { return "cohesion"; } - - /// string/key for friction coefficient - static constexpr char const * frictionCoefficientString() { return "frictionCoefficient"; } - - /// string/key for the elastic slip - static constexpr char const * elasticSlipString() { return "elasticSlip"; } - }; - -}; - - -GEOS_HOST_DEVICE -real64 CoulombContactUpdates::computeLimitTangentialTractionNorm( real64 const & normalTraction, - real64 & dLimitTangentialTractionNorm_dTraction ) const -{ - dLimitTangentialTractionNorm_dTraction = m_frictionCoefficient; - return ( m_cohesion - normalTraction * m_frictionCoefficient ); -} - - -GEOS_HOST_DEVICE -inline void CoulombContactUpdates::computeTraction( localIndex const k, - arraySlice1d< real64 const > const & oldDispJump, - arraySlice1d< real64 const > const & dispJump, - integer const & fractureState, - arraySlice1d< real64 > const & tractionVector, - arraySlice2d< real64 > const & dTractionVector_dJump ) const -{ - - bool const isOpen = fractureState == fields::contact::FractureState::Open; - - // Initialize everyting to 0 - tractionVector[0] = 0.0; - tractionVector[1] = 0.0; - tractionVector[2] = 0.0; - LvArray::forValuesInSlice( dTractionVector_dJump, []( real64 & val ){ val = 0.0; } ); - // If the fracture is open the traction is 0 and so are its derivatives so there is nothing to do - if( !isOpen ) - { - // normal component of the traction - tractionVector[0] = m_penaltyStiffness * dispJump[0]; - // derivative of the normal component w.r.t. to the nomral dispJump - dTractionVector_dJump[0][0] = m_penaltyStiffness; - - // Compute the slip - real64 const slip[2] = { dispJump[1] - oldDispJump[1], - dispJump[2] - oldDispJump[2] }; - - - real64 const tau[2] = { m_shearStiffness * ( slip[0] + m_elasticSlip[k][0] ), - m_shearStiffness * ( slip[1] + m_elasticSlip[k][1] ) }; - - switch( fractureState ) - { - case fields::contact::FractureState::Stick: - { - // Elastic slip case - // Tangential components of the traction are equal to tau - tractionVector[1] = tau[0]; - tractionVector[2] = tau[1]; - - dTractionVector_dJump[1][1] = m_shearStiffness; - dTractionVector_dJump[2][2] = m_shearStiffness; - - // The slip is only elastic: we add the full slip to the elastic one - LvArray::tensorOps::add< 2 >( m_elasticSlip[k], slip ); - - break; - } - case fields::contact::FractureState::Slip: - { - // Plastic slip case - real64 dLimitTau_dNormalTraction; - real64 const limitTau = computeLimitTangentialTractionNorm( tractionVector[0], - dLimitTau_dNormalTraction ); - - real64 const slipNorm = LvArray::tensorOps::l2Norm< 2 >( slip ); - - // Tangential components of the traction computed based on the limitTau - tractionVector[1] = limitTau * slip[0] / slipNorm; - tractionVector[2] = limitTau * slip[1] / slipNorm; - - dTractionVector_dJump[1][0] = m_penaltyStiffness * dLimitTau_dNormalTraction * slip[0] / slipNorm; - dTractionVector_dJump[1][1] = limitTau * pow( slip[1], 2 ) / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); - dTractionVector_dJump[1][2] = limitTau * slip[0] * slip[1] / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); - - dTractionVector_dJump[2][0] = m_penaltyStiffness * dLimitTau_dNormalTraction * slip[1] / slipNorm; - dTractionVector_dJump[2][1] = limitTau * slip[0] * slip[1] / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); - dTractionVector_dJump[2][2] = limitTau * pow( slip[0], 2 ) / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); - - // Compute elastic component of the slip for this case - real64 const plasticSlip[2] = { tractionVector[1] / m_shearStiffness, - tractionVector[2] / m_shearStiffness }; - - LvArray::tensorOps::copy< 2 >( m_elasticSlip[k], slip ); - LvArray::tensorOps::subtract< 2 >( m_elasticSlip[k], plasticSlip ); - - break; - } - } - } -} - -GEOS_HOST_DEVICE -inline void CoulombContactUpdates::updateFractureState( localIndex const k, - arraySlice1d< real64 const > const & dispJump, - arraySlice1d< real64 const > const & tractionVector, - integer & fractureState ) const -{ - using namespace fields::contact; - - if( dispJump[0] > -m_displacementJumpThreshold ) - { - fractureState = FractureState::Open; - m_elasticSlip[k][0] = 0.0; - m_elasticSlip[k][1] = 0.0; - } - else - { - real64 const tau[2] = { tractionVector[1], - tractionVector[2] }; - real64 const tauNorm = LvArray::tensorOps::l2Norm< 2 >( tau ); - - real64 dLimitTau_dNormalTraction; - real64 const limitTau = computeLimitTangentialTractionNorm( tractionVector[0], - dLimitTau_dNormalTraction ); - - // Yield function (not necessary but makes it clearer) - real64 const yield = tauNorm - limitTau; - - fractureState = yield < 0 ? FractureState::Stick : FractureState::Slip; - } -} - -} /* namespace constitutive */ - -} /* namespace geos */ - -#endif /* GEOS_CONSTITUTIVE_CONTACT_COULOMBCONTACT_HPP_ */ diff --git a/src/coreComponents/constitutive/contact/CoulombContact.cpp b/src/coreComponents/constitutive/contact/CoulombFriction.cpp similarity index 59% rename from src/coreComponents/constitutive/contact/CoulombContact.cpp rename to src/coreComponents/constitutive/contact/CoulombFriction.cpp index 95ef7d5f8ea..bf9d89cb073 100644 --- a/src/coreComponents/constitutive/contact/CoulombContact.cpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.cpp @@ -14,10 +14,10 @@ */ /** - * @file CoulombContact.cpp + * @file CoulombFriction.cpp */ -#include "CoulombContact.hpp" +#include "CoulombFriction.hpp" namespace geos { @@ -27,12 +27,16 @@ using namespace dataRepository; namespace constitutive { -CoulombContact::CoulombContact( string const & name, Group * const parent ): - ContactBase( name, parent ), +CoulombFriction::CoulombFriction( string const & name, Group * const parent ): + FrictionBase( name, parent ), m_cohesion(), m_frictionCoefficient(), m_elasticSlip() { + registerWrapper( viewKeyStruct::shearStiffnessString(), &m_shearStiffness ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Value of the shear elastic stiffness. Units of Pressure/length" ); + registerWrapper( viewKeyStruct::cohesionString(), &m_cohesion ). setApplyDefaultValue( -1 ). setInputFlag( InputFlags::REQUIRED ). @@ -49,10 +53,10 @@ CoulombContact::CoulombContact( string const & name, Group * const parent ): } -CoulombContact::~CoulombContact() +CoulombFriction::~CoulombFriction() {} -void CoulombContact::postInputInitialization() +void CoulombFriction::postInputInitialization() { GEOS_THROW_IF( m_frictionCoefficient < 0.0, getFullName() << ": The provided friction coefficient is less than zero. Value: " << m_frictionCoefficient, @@ -60,27 +64,25 @@ void CoulombContact::postInputInitialization() } -void CoulombContact::allocateConstitutiveData( Group & parent, - localIndex const numConstitutivePointsPerParentIndex ) +void CoulombFriction::allocateConstitutiveData( Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) { m_elasticSlip.resize( 0, 2 ); - ContactBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); + FrictionBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); } -CoulombContactUpdates CoulombContact::createKernelWrapper() const +CoulombFrictionUpdates CoulombFriction::createKernelWrapper() const { - return CoulombContactUpdates( m_penaltyStiffness, - m_shearStiffness, - m_displacementJumpThreshold, - *m_apertureTable, - m_cohesion, - m_frictionCoefficient, - m_elasticSlip ); + return CoulombFrictionUpdates( m_displacementJumpThreshold, + m_shearStiffness, + m_cohesion, + m_frictionCoefficient, + m_elasticSlip ); } -REGISTER_CATALOG_ENTRY( ConstitutiveBase, CoulombContact, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( ConstitutiveBase, CoulombFriction, string const &, Group * const ) } /* namespace constitutive */ diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.hpp b/src/coreComponents/constitutive/contact/CoulombFriction.hpp new file mode 100644 index 00000000000..e2cd87f024f --- /dev/null +++ b/src/coreComponents/constitutive/contact/CoulombFriction.hpp @@ -0,0 +1,309 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file CoulombFriction.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_CONTACT_COULOMBFRICTION_HPP_ +#define GEOS_CONSTITUTIVE_CONTACT_COULOMBFRICTION_HPP_ + +#include "FrictionBase.hpp" + +namespace geos +{ + +namespace constitutive +{ + +/** + * @class CoulombFrictionUpdates + * + * This class is used for in-kernel contact relation updates + */ +class CoulombFrictionUpdates : public FrictionBaseUpdates +{ +public: + CoulombFrictionUpdates( real64 const & displacementJumpThreshold, + real64 const & shearStiffness, + real64 const & cohesion, + real64 const & frictionCoefficient, + arrayView2d< real64 > const & elasticSlip ) + : FrictionBaseUpdates( displacementJumpThreshold ), + m_shearStiffness( shearStiffness ), + m_cohesion( cohesion ), + m_frictionCoefficient( frictionCoefficient ), + m_elasticSlip( elasticSlip ) + {} + + /// Default copy constructor + CoulombFrictionUpdates( CoulombFrictionUpdates const & ) = default; + + /// Default move constructor + CoulombFrictionUpdates( CoulombFrictionUpdates && ) = default; + + /// Deleted default constructor + CoulombFrictionUpdates() = delete; + + /// Deleted copy assignment operator + CoulombFrictionUpdates & operator=( CoulombFrictionUpdates const & ) = delete; + + /// Deleted move assignment operator + CoulombFrictionUpdates & operator=( CoulombFrictionUpdates && ) = delete; + + /** + * @brief Evaluate the limit tangential traction norm and return the derivative wrt normal traction + * @param[in] normalTraction the normal traction + * @param[out] dLimitTangentialTractionNorm_dTraction the derivative of the limit tangential traction norm wrt normal traction + * @return the limit tangential traction norm + */ + GEOS_HOST_DEVICE + inline + virtual real64 computeLimitTangentialTractionNorm( real64 const & normalTraction, + real64 & dLimitTangentialTractionNorm_dTraction ) const override final; + + GEOS_HOST_DEVICE + inline + virtual void computeShearTraction( localIndex const k, + arraySlice1d< real64 const > const & oldDispJump, + arraySlice1d< real64 const > const & dispJump, + integer const & fractureState, + arraySlice1d< real64 > const & tractionVector, + arraySlice2d< real64 > const & dTractionVector_dJump ) const override final; + + GEOS_HOST_DEVICE + inline + virtual void updateFractureState( localIndex const k, + arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & tractionVector, + integer & fractureState ) const override final; + +private: + /// The shear stiffness + real64 m_shearStiffness; + + /// The cohesion for each upper level dimension (i.e. cell) of *this + real64 m_cohesion; + + /// The friction coefficient for each upper level dimension (i.e. cell) of *this + real64 m_frictionCoefficient; + + arrayView2d< real64 > m_elasticSlip; +}; + + +/** + * @class CoulombFriction + * + * Class to provide a CoulombFriction friction model. + */ +class CoulombFriction : public FrictionBase +{ +public: + + /** + * constructor + * @param[in] name name of the instance in the catalog + * @param[in] parent the group which contains this instance + */ + CoulombFriction( string const & name, Group * const parent ); + + /** + * Default Destructor + */ + virtual ~CoulombFriction() override; + + static string catalogName() { return "Coulomb"; } + + virtual string getCatalogName() const override { return catalogName(); } + + ///@} + + virtual void allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) override final; + + /** + * @brief Const accessor for cohesion + * @return A const reference to arrayView1d containing the + * cohesions (at every element). + */ + real64 const & cohesion() const { return m_cohesion; } + + /** + * @brief Const accessor for friction angle + * @return A const reference to arrayView1d containing the + * friction coefficient (at every element). + */ + real64 const & frictionCoefficient() const { return m_frictionCoefficient; } + + /// Type of kernel wrapper for in-kernel update + using KernelWrapper = CoulombFrictionUpdates; + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelWrapper() const; + +protected: + + virtual void postInputInitialization() override; + +private: + + /// The shear stiffness + real64 m_shearStiffness; + + /// The cohesion for each upper level dimension (i.e. cell) of *this + real64 m_cohesion; + + /// The friction coefficient for each upper level dimension (i.e. cell) of *this + real64 m_frictionCoefficient; + + /// Elastic slip + array2d< real64 > m_elasticSlip; + +/** + * @struct Set of "char const *" and keys for data specified in this class. + */ + struct viewKeyStruct : public FrictionBase::viewKeyStruct + { + /// string/key for shear stiffness + static constexpr char const * shearStiffnessString() { return "shearStiffness"; } + + /// string/key for cohesion + static constexpr char const * cohesionString() { return "cohesion"; } + + /// string/key for friction coefficient + static constexpr char const * frictionCoefficientString() { return "frictionCoefficient"; } + + /// string/key for the elastic slip + static constexpr char const * elasticSlipString() { return "elasticSlip"; } + }; + +}; + + +GEOS_HOST_DEVICE +real64 CoulombFrictionUpdates::computeLimitTangentialTractionNorm( real64 const & normalTraction, + real64 & dLimitTangentialTractionNorm_dTraction ) const +{ + dLimitTangentialTractionNorm_dTraction = m_frictionCoefficient; + return ( m_cohesion - normalTraction * m_frictionCoefficient ); +} + + +GEOS_HOST_DEVICE +inline void CoulombFrictionUpdates::computeShearTraction( localIndex const k, + arraySlice1d< real64 const > const & oldDispJump, + arraySlice1d< real64 const > const & dispJump, + integer const & fractureState, + arraySlice1d< real64 > const & tractionVector, + arraySlice2d< real64 > const & dTractionVector_dJump ) const +{ + // Compute the slip + real64 const slip[2] = { dispJump[1] - oldDispJump[1], + dispJump[2] - oldDispJump[2] }; + + + real64 const tau[2] = { m_shearStiffness * ( slip[0] + m_elasticSlip[k][0] ), + m_shearStiffness * ( slip[1] + m_elasticSlip[k][1] ) }; + + switch( fractureState ) + { + case fields::contact::FractureState::Stick: + { + // Elastic slip case + // Tangential components of the traction are equal to tau + tractionVector[1] = tau[0]; + tractionVector[2] = tau[1]; + + dTractionVector_dJump[1][1] = m_shearStiffness; + dTractionVector_dJump[2][2] = m_shearStiffness; + + // The slip is only elastic: we add the full slip to the elastic one + LvArray::tensorOps::add< 2 >( m_elasticSlip[k], slip ); + + break; + } + case fields::contact::FractureState::Slip: + { + // Plastic slip case + real64 dLimitTau_dNormalTraction; + real64 const limitTau = computeLimitTangentialTractionNorm( tractionVector[0], + dLimitTau_dNormalTraction ); + + real64 const slipNorm = LvArray::tensorOps::l2Norm< 2 >( slip ); + + // Tangential components of the traction computed based on the limitTau + tractionVector[1] = limitTau * slip[0] / slipNorm; + tractionVector[2] = limitTau * slip[1] / slipNorm; + + dTractionVector_dJump[1][0] = dTractionVector_dJump[0][0] * dLimitTau_dNormalTraction * slip[0] / slipNorm; + dTractionVector_dJump[1][1] = limitTau * pow( slip[1], 2 ) / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); + dTractionVector_dJump[1][2] = limitTau * slip[0] * slip[1] / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); + + dTractionVector_dJump[2][0] = dTractionVector_dJump[0][0] * dLimitTau_dNormalTraction * slip[1] / slipNorm; + dTractionVector_dJump[2][1] = limitTau * slip[0] * slip[1] / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); + dTractionVector_dJump[2][2] = limitTau * pow( slip[0], 2 ) / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); + + // Compute elastic component of the slip for this case + real64 const plasticSlip[2] = { tractionVector[1] / m_shearStiffness, + tractionVector[2] / m_shearStiffness }; + + LvArray::tensorOps::copy< 2 >( m_elasticSlip[k], slip ); + LvArray::tensorOps::subtract< 2 >( m_elasticSlip[k], plasticSlip ); + + break; + } + } +} + +GEOS_HOST_DEVICE +inline void CoulombFrictionUpdates::updateFractureState( localIndex const k, + arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & tractionVector, + integer & fractureState ) const +{ + using namespace fields::contact; + + if( dispJump[0] > -m_displacementJumpThreshold ) + { + fractureState = FractureState::Open; + m_elasticSlip[k][0] = 0.0; + m_elasticSlip[k][1] = 0.0; + } + else + { + real64 const tau[2] = { tractionVector[1], + tractionVector[2] }; + real64 const tauNorm = LvArray::tensorOps::l2Norm< 2 >( tau ); + + real64 dLimitTau_dNormalTraction; + real64 const limitTau = computeLimitTangentialTractionNorm( tractionVector[0], + dLimitTau_dNormalTraction ); + + // Yield function (not necessary but makes it clearer) + real64 const yield = tauNorm - limitTau; + + fractureState = yield < 0 ? FractureState::Stick : FractureState::Slip; + } +} + +} /* namespace constitutive */ + +} /* namespace geos */ + +#endif /* GEOS_CONSTITUTIVE_CONTACT_COULOMBFRICTION_HPP_ */ diff --git a/src/coreComponents/constitutive/contact/FrictionBase.cpp b/src/coreComponents/constitutive/contact/FrictionBase.cpp new file mode 100644 index 00000000000..a4443bcf335 --- /dev/null +++ b/src/coreComponents/constitutive/contact/FrictionBase.cpp @@ -0,0 +1,51 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file FrictionBase.cpp + */ + +#include "FrictionBase.hpp" +#include "functions/FunctionManager.hpp" +#include "functions/TableFunction.hpp" + +namespace geos +{ + +using namespace dataRepository; + +namespace constitutive +{ + +FrictionBase::FrictionBase( string const & name, + Group * const parent ): + ConstitutiveBase( name, parent ) +{ + registerWrapper( viewKeyStruct::displacementJumpThresholdString(), &m_displacementJumpThreshold ). + setApplyDefaultValue( std::numeric_limits< real64 >::epsilon() ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "A threshold valued to determine whether a fracture is open or not." ); +} + +FrictionBase::~FrictionBase() +{} + +FrictionBaseUpdates FrictionBase::createKernelWrapper() const +{ + return FrictionBaseUpdates( m_displacementJumpThreshold ); +} + +} /* end namespace constitutive */ + +} /* end namespace geos */ diff --git a/src/coreComponents/constitutive/contact/FrictionBase.hpp b/src/coreComponents/constitutive/contact/FrictionBase.hpp new file mode 100644 index 00000000000..13186378e42 --- /dev/null +++ b/src/coreComponents/constitutive/contact/FrictionBase.hpp @@ -0,0 +1,167 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file FrictionBase.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_CONTACT_FRICTIONBASE_HPP_ +#define GEOS_CONSTITUTIVE_CONTACT_FRICTIONBASE_HPP_ + +#include "constitutive/ConstitutiveBase.hpp" +#include "functions/TableFunction.hpp" +#include "physicsSolvers/contact/ContactFields.hpp" + + +namespace geos +{ + +namespace constitutive +{ + +/** + * @class FrictionBaseUpdates + * + * This class is used for in-kernel contact relation updates + */ +class FrictionBaseUpdates +{ +public: + + FrictionBaseUpdates( real64 const & displacementJumpThreshold ) + : m_displacementJumpThreshold( displacementJumpThreshold ) + {} + + /// Default copy constructor + FrictionBaseUpdates( FrictionBaseUpdates const & ) = default; + + /// Default move constructor + FrictionBaseUpdates( FrictionBaseUpdates && ) = default; + + /// Deleted default constructor + FrictionBaseUpdates() = default; + + /// Deleted copy assignment operator + FrictionBaseUpdates & operator=( FrictionBaseUpdates const & ) = delete; + + /// Deleted move assignment operator + FrictionBaseUpdates & operator=( FrictionBaseUpdates && ) = delete; + + /** + * @brief Evaluate the traction vector and its derivatives wrt to pressure and jump + * @param[in] dispJump the displacement jump + * @param[in] fractureState the fracture state + * @param[out] tractionVector the traction vector + * @param[out] dTractionVector_dJump the derivative of the traction vector wrt displacement jump + */ + GEOS_HOST_DEVICE + inline + virtual void computeShearTraction( localIndex const k, + arraySlice1d< real64 const > const & oldDispJump, + arraySlice1d< real64 const > const & dispJump, + integer const & fractureState, + arraySlice1d< real64 > const & tractionVector, + arraySlice2d< real64 > const & dTractionVector_dJump ) const + {GEOS_UNUSED_VAR( k, oldDispJump, dispJump, tractionVector, dTractionVector_dJump, fractureState );} + + /** + * @brief Evaluate the traction vector and its derivatives wrt to pressure and jump + * @param[in] dispJump the displacement jump + * @param[in] tractionVector the traction vector + * @param[out] fractureState the fracture state + */ + GEOS_HOST_DEVICE + inline + virtual void updateFractureState( localIndex const k, + arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & tractionVector, + integer & fractureState ) const + { GEOS_UNUSED_VAR( k, dispJump, tractionVector, fractureState ); } + + + + /** + * @brief Evaluate the limit tangential traction norm and return the derivative wrt normal traction + * @param[in] normalTraction the normal traction + * @param[out] dLimitTangentialTractionNorm_dTraction the derivative of the limit tangential traction norm wrt normal traction + * @return the limit tangential traction norm + */ + GEOS_HOST_DEVICE + inline + virtual real64 computeLimitTangentialTractionNorm( real64 const & normalTraction, + real64 & dLimitTangentialTractionNorm_dTraction ) const + { GEOS_UNUSED_VAR( normalTraction, dLimitTangentialTractionNorm_dTraction ); return 0; }; + +protected: + + /// A threshold valued to determine whether a fracture is open or not. + real64 m_displacementJumpThreshold; + +}; + + +/** + * @class FrictionBase + * + * This class serves as the interface for implementing contact enforcement constitutive relations. + * This does not include the actual enforcement algorithm, but only the constitutive relations that + * govern the behavior of the contact. So things like penalty, or friction, or kinematic constraint. + */ +class FrictionBase : public ConstitutiveBase +{ +public: + + /** + * @brief The standard data repository constructor + * @param name The name of the relation in the data repository + * @param parent The name of the parent Group that holds this relation object. + */ + FrictionBase( string const & name, + Group * const parent ); + + /** + * @brief default destructor + */ + virtual ~FrictionBase() override; + + /// Type of kernel wrapper for in-kernel update + using KernelWrapper = FrictionBaseUpdates; + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelWrapper() const; + + /** + * @struct Structure to hold scoped key names + */ + struct viewKeyStruct : public ConstitutiveBase::viewKeyStruct + { + /// string/key for the displacement jump threshold value + static constexpr char const * displacementJumpThresholdString() { return "displacementJumpThreshold"; } + }; + +protected: + + /// A threshold valued to determine whether a fracture is open or not. + real64 m_displacementJumpThreshold; + +}; + +} /* namespace constitutive */ + +} /* namespace geos */ + +#endif /* GEOS_CONSTITUTIVE_CONTACT_FRICTIONBASE_HPP_ */ diff --git a/src/coreComponents/constitutive/contact/ContactSelector.hpp b/src/coreComponents/constitutive/contact/FrictionSelector.hpp similarity index 68% rename from src/coreComponents/constitutive/contact/ContactSelector.hpp rename to src/coreComponents/constitutive/contact/FrictionSelector.hpp index e067ddfc90b..70f510eb0a7 100644 --- a/src/coreComponents/constitutive/contact/ContactSelector.hpp +++ b/src/coreComponents/constitutive/contact/FrictionSelector.hpp @@ -6,7 +6,7 @@ * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University * Copyright (c) 2018-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors + * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -14,14 +14,14 @@ */ /** - * @file ContactSelector.hpp + * @file FrictionSelector.hpp */ #ifndef GEOS_CONSTITUTIVE_CONTACT_CONTACTSELECTOR_HPP_ #define GEOS_CONSTITUTIVE_CONTACT_CONTACTSELECTOR_HPP_ #include "constitutive/ConstitutivePassThruHandler.hpp" -#include "constitutive/contact/CoulombContact.hpp" +#include "constitutive/contact/CoulombFriction.hpp" #include "constitutive/contact/FrictionlessContact.hpp" namespace geos @@ -31,19 +31,19 @@ namespace constitutive { template< typename LAMBDA > -void constitutiveUpdatePassThru( ContactBase const & contact, +void constitutiveUpdatePassThru( FrictionBase const & contact, LAMBDA && lambda ) { - ConstitutivePassThruHandler< CoulombContact, - FrictionlessContact >::execute( contact, std::forward< LAMBDA >( lambda ) ); + ConstitutivePassThruHandler< FrictionlessContact, + CoulombFriction >::execute( contact, std::forward< LAMBDA >( lambda ) ); } template< typename LAMBDA > -void constitutiveUpdatePassThru( ContactBase & contact, +void constitutiveUpdatePassThru( FrictionBase & contact, LAMBDA && lambda ) { - ConstitutivePassThruHandler< CoulombContact, - FrictionlessContact >::execute( contact, std::forward< LAMBDA >( lambda ) ); + ConstitutivePassThruHandler< FrictionlessContact, + CoulombFriction >::execute( contact, std::forward< LAMBDA >( lambda ) ); } } /* namespace constitutive */ diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.cpp b/src/coreComponents/constitutive/contact/FrictionlessContact.cpp index 5a30413f633..a74b36a76fb 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.cpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.cpp @@ -29,24 +29,15 @@ namespace constitutive FrictionlessContact::FrictionlessContact( string const & name, Group * const parent ): - ContactBase( name, parent ) + FrictionBase( name, parent ) {} FrictionlessContact::~FrictionlessContact() {} -void FrictionlessContact::allocateConstitutiveData( Group & parent, - localIndex const numConstitutivePointsPerParentIndex ) -{ - ContactBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); -} - FrictionlessContactUpdates FrictionlessContact::createKernelWrapper() const { - return FrictionlessContactUpdates( m_penaltyStiffness, - m_shearStiffness, - m_displacementJumpThreshold, - *m_apertureTable ); + return FrictionlessContactUpdates( m_displacementJumpThreshold ); } REGISTER_CATALOG_ENTRY( ConstitutiveBase, FrictionlessContact, string const &, Group * const ) diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp index 2b99908609e..81aeea036d3 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_CONSTITUTIVE_CONTACT_FRICTIONLESSCONTACT_HPP_ #define GEOS_CONSTITUTIVE_CONTACT_FRICTIONLESSCONTACT_HPP_ -#include "constitutive/contact/ContactBase.hpp" +#include "constitutive/contact/FrictionBase.hpp" namespace geos { @@ -33,15 +33,12 @@ namespace constitutive * * This class is used for in-kernel contact relation updates */ -class FrictionlessContactUpdates : public ContactBaseUpdates +class FrictionlessContactUpdates : public FrictionBaseUpdates { public: - FrictionlessContactUpdates( real64 const & penaltyStiffness, - real64 const & shearStiffness, - real64 const & displacementJumpThreshold, - TableFunction const & apertureTable ) - : ContactBaseUpdates( penaltyStiffness, shearStiffness, displacementJumpThreshold, apertureTable ) + FrictionlessContactUpdates( real64 const & displacementJumpThreshold ) + : FrictionBaseUpdates( displacementJumpThreshold ) {} /// Default copy constructor @@ -59,16 +56,6 @@ class FrictionlessContactUpdates : public ContactBaseUpdates /// Deleted move assignment operator FrictionlessContactUpdates & operator=( FrictionlessContactUpdates && ) = delete; - GEOS_HOST_DEVICE - inline - virtual void computeTraction( localIndex const k, - arraySlice1d< real64 const > const & oldDispJump, - arraySlice1d< real64 const > const & dispJump, - integer const & fractureState, - arraySlice1d< real64 > const & tractionVector, - arraySlice2d< real64 > const & dTractionVector_dJump ) const override final; - - GEOS_HOST_DEVICE inline virtual void updateFractureState( localIndex const k, @@ -100,7 +87,7 @@ class FrictionlessContactUpdates : public ContactBaseUpdates * This does not include the actual enforcement algorithm, but only the constitutive relations that * govern the behavior of the contact. So things like penalty, or friction, or kinematic constraint. */ -class FrictionlessContact : public ContactBase +class FrictionlessContact : public FrictionBase { public: @@ -124,9 +111,6 @@ class FrictionlessContact : public ContactBase virtual string getCatalogName() const override { return catalogName(); } - virtual void allocateConstitutiveData( dataRepository::Group & parent, - localIndex const numConstitutivePointsPerParentIndex ) override; - /// Type of kernel wrapper for in-kernel update using KernelWrapper = FrictionlessContactUpdates; @@ -146,25 +130,6 @@ class FrictionlessContact : public ContactBase }; -GEOS_HOST_DEVICE -inline void FrictionlessContactUpdates::computeTraction( localIndex const k, - arraySlice1d< real64 const > const & oldDispJump, - arraySlice1d< real64 const > const & dispJump, - integer const & fractureState, - arraySlice1d< real64 > const & tractionVector, - arraySlice2d< real64 > const & dTractionVector_dJump ) const -{ - GEOS_UNUSED_VAR( k, oldDispJump ); - - bool const isOpen = fractureState == fields::contact::FractureState::Open; - - tractionVector[0] = isOpen ? 0.0 : m_penaltyStiffness * dispJump[0]; - tractionVector[1] = 0.0; - tractionVector[2] = 0.0; - - LvArray::forValuesInSlice( dTractionVector_dJump, []( real64 & val ){ val = 0.0; } ); - dTractionVector_dJump( 0, 0 ) = isOpen ? 0.0 : m_penaltyStiffness; -} GEOS_HOST_DEVICE inline void FrictionlessContactUpdates::updateFractureState( localIndex const k, diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureBase.cpp b/src/coreComponents/constitutive/contact/HydraulicApertureBase.cpp new file mode 100644 index 00000000000..81ca7a55097 --- /dev/null +++ b/src/coreComponents/constitutive/contact/HydraulicApertureBase.cpp @@ -0,0 +1,48 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file HydraulicApertureBase.cpp + */ + + +#include "HydraulicApertureBase.hpp" + + +namespace geos +{ + +namespace constitutive +{ + +HydraulicApertureBase::HydraulicApertureBase( string const & name, + Group * const parent ): + ConstitutiveBase( name, parent ), + m_aperture0( 0.0 ) +{ + /// TODO: must become a required parameter. + registerWrapper( viewKeyStruct::apertureZeroString(), &m_aperture0 ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setApplyDefaultValue( 1e-6 ). + setDescription( "Reference hydraulic aperture. It is the aperture at zero normal stress." ); +} + +HydraulicApertureBase::~HydraulicApertureBase() +{} + + + +} /* namespace constitutive */ + +} /* namespace geos */ diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureBase.hpp b/src/coreComponents/constitutive/contact/HydraulicApertureBase.hpp new file mode 100644 index 00000000000..dab7b35957d --- /dev/null +++ b/src/coreComponents/constitutive/contact/HydraulicApertureBase.hpp @@ -0,0 +1,73 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file HydraulicApertureBase.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_CONTACT_HYDRAULICAPERTUREBASE_HPP_ +#define GEOS_CONSTITUTIVE_CONTACT_HYDRAULICAPERTUREBASE_HPP_ + +#include "constitutive/ConstitutiveBase.hpp" +#include "functions/TableFunction.hpp" +#include "physicsSolvers/contact/ContactFields.hpp" + + +namespace geos +{ + +namespace constitutive +{ + +/** + * @class HydraulicApertureBase + * + * This class serves as the interface for implementing contact enforcement constitutive relations. + * This does not include the actual enforcement algorithm, but only the constitutive relations that + * govern the behavior of the contact. So things like penalty, or friction, or kinematic constraint. + */ +class HydraulicApertureBase : public ConstitutiveBase +{ +public: + + /** + * @brief The standard data repository constructor + * @param name The name of the relation in the data repository + * @param parent The name of the parent Group that holds this relation object. + */ + HydraulicApertureBase( string const & name, + Group * const parent ); + + /** + * @brief default destructor + */ + virtual ~HydraulicApertureBase() override; + +protected: + + struct viewKeyStruct : public ConstitutiveBase::viewKeyStruct + { + /// string/key for aperture under zero normal stress + static constexpr char const * apertureZeroString() { return "referenceAperture"; } + }; + + /// Reference hydraulic aperture. Aperture at zero normal stress + real64 m_aperture0; /// TODO: this will replace what is currently called defaultAperture. +}; + +} /* namespace constitutive */ + +} /* namespace geos */ + +#endif /* GEOS_CONSTITUTIVE_CONTACT_HYDRAULICAPERTURETABLE_HPP_ */ diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureRelationSelector.hpp b/src/coreComponents/constitutive/contact/HydraulicApertureRelationSelector.hpp new file mode 100644 index 00000000000..0d32794c1eb --- /dev/null +++ b/src/coreComponents/constitutive/contact/HydraulicApertureRelationSelector.hpp @@ -0,0 +1,52 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file FrictionSelector.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_CONTACT_CONTACTSELECTOR_HPP_ +#define GEOS_CONSTITUTIVE_CONTACT_CONTACTSELECTOR_HPP_ + +#include "constitutive/ConstitutivePassThruHandler.hpp" +#include "constitutive/contact/HydraulicApertureTable.hpp" +#include "constitutive/contact/BartonBandis.hpp" + +namespace geos +{ + +namespace constitutive +{ + +template< typename LAMBDA > +void constitutiveUpdatePassThru( HydraulicApertureBase const & contact, + LAMBDA && lambda ) +{ + ConstitutivePassThruHandler< HydraulicApertureTable, + BartonBandis >::execute( contact, std::forward< LAMBDA >( lambda ) ); +} + +template< typename LAMBDA > +void constitutiveUpdatePassThru( HydraulicApertureBase & contact, + LAMBDA && lambda ) +{ + ConstitutivePassThruHandler< HydraulicApertureTable, + BartonBandis >::execute( contact, std::forward< LAMBDA >( lambda ) ); +} + +} /* namespace constitutive */ + +} /* namespace geos */ + +#endif // GEOS_CONSTITUTIVE_CONTACT_CONTACTSELECTOR_HPP_ diff --git a/src/coreComponents/constitutive/contact/ContactBase.cpp b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp similarity index 78% rename from src/coreComponents/constitutive/contact/ContactBase.cpp rename to src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp index fa4de0fb776..60c3f0ab807 100644 --- a/src/coreComponents/constitutive/contact/ContactBase.cpp +++ b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp @@ -14,10 +14,10 @@ */ /** - * @file ContactBase.cpp + * @file HydraulicApertureTable.cpp */ -#include "ContactBase.hpp" +#include "HydraulicApertureTable.hpp" #include "functions/FunctionManager.hpp" #include "functions/TableFunction.hpp" @@ -29,19 +29,11 @@ using namespace dataRepository; namespace constitutive { -ContactBase::ContactBase( string const & name, - Group * const parent ): - ConstitutiveBase( name, parent ), +HydraulicApertureTable::HydraulicApertureTable( string const & name, + Group * const parent ): + HydraulicApertureBase( name, parent ), m_apertureTable( nullptr ) { - registerWrapper( viewKeyStruct::penaltyStiffnessString(), &m_penaltyStiffness ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Value of the penetration penalty stiffness. Units of Pressure/length" ); - - registerWrapper( viewKeyStruct::shearStiffnessString(), &m_shearStiffness ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Value of the shear elastic stiffness. Units of Pressure/length" ); - registerWrapper( viewKeyStruct::apertureToleranceString(), &m_apertureTolerance ). setApplyDefaultValue( 1.0e-9 ). setInputFlag( InputFlags::OPTIONAL ). @@ -52,23 +44,18 @@ ContactBase::ContactBase( string const & name, "to smooth out highly nonlinear behavior associated with 1/0 in addition to avoiding the " "1/0 error." ); - registerWrapper( viewKeyStruct::displacementJumpThresholdString(), &m_displacementJumpThreshold ). - setApplyDefaultValue( std::numeric_limits< real64 >::epsilon() ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "A threshold valued to determine whether a fracture is open or not." ); - - registerWrapper( viewKeyStruct::apertureTableNameString(), &m_apertureTableName ). setRTTypeName( rtTypes::CustomTypes::groupNameRef ). setInputFlag( InputFlags::REQUIRED ). setDescription( "Name of the aperture table" ); } -ContactBase::~ContactBase() +HydraulicApertureTable::~HydraulicApertureTable() {} -void ContactBase::postInputInitialization() + +void HydraulicApertureTable::postInputInitialization() { GEOS_THROW_IF( m_apertureTableName.empty(), @@ -76,12 +63,9 @@ void ContactBase::postInputInitialization() } -void ContactBase::initializePreSubGroups() -{} - -void ContactBase::allocateConstitutiveData( Group & parent, - localIndex const numConstitutivePointsPerParentIndex ) +void HydraulicApertureTable::allocateConstitutiveData( Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) { ConstitutiveBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); @@ -133,7 +117,7 @@ void ContactBase::allocateConstitutiveData( Group & parent, } -void ContactBase::validateApertureTable( TableFunction const & apertureTable ) const +void HydraulicApertureTable::validateApertureTable( TableFunction const & apertureTable ) const { ArrayOfArraysView< real64 const > const coords = apertureTable.getCoordinates(); arrayView1d< real64 const > const & hydraulicApertureValues = apertureTable.getValues(); @@ -163,14 +147,13 @@ void ContactBase::validateApertureTable( TableFunction const & apertureTable ) c -ContactBaseUpdates ContactBase::createKernelWrapper() const +HydraulicApertureTableUpdates HydraulicApertureTable::createKernelWrapper() const { - return ContactBaseUpdates( m_penaltyStiffness, - m_shearStiffness, - m_displacementJumpThreshold, - *m_apertureTable ); + return HydraulicApertureTableUpdates( *m_apertureTable ); } +REGISTER_CATALOG_ENTRY( ConstitutiveBase, HydraulicApertureTable, string const &, Group * const ) + } /* end namespace constitutive */ } /* end namespace geos */ diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp b/src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp new file mode 100644 index 00000000000..c1e9c47c1ce --- /dev/null +++ b/src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp @@ -0,0 +1,170 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file HydraulicApertureTable.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_CONTACT_HYDRAULICAPERTURETABLE_HPP_ +#define GEOS_CONSTITUTIVE_CONTACT_HYDRAULICAPERTURETABLE_HPP_ + +#include "constitutive/contact/HydraulicApertureBase.hpp" +#include "functions/TableFunction.hpp" + + +namespace geos +{ + +namespace constitutive +{ + +/** + * @class HydraulicApertureTableUpdates + * + * This class is used for in-kernel contact relation updates + */ +class HydraulicApertureTableUpdates +{ +public: + + HydraulicApertureTableUpdates( TableFunction const & apertureTable ) + : m_apertureTable( apertureTable.createKernelWrapper() ) + {} + + /// Default copy constructor + HydraulicApertureTableUpdates( HydraulicApertureTableUpdates const & ) = default; + + /// Default move constructor + HydraulicApertureTableUpdates( HydraulicApertureTableUpdates && ) = default; + + /// Deleted default constructor + HydraulicApertureTableUpdates() = default; + + /// Deleted copy assignment operator + HydraulicApertureTableUpdates & operator=( HydraulicApertureTableUpdates const & ) = delete; + + /// Deleted move assignment operator + HydraulicApertureTableUpdates & operator=( HydraulicApertureTableUpdates && ) = delete; + + /** + * @brief Evaluate the effective aperture, and its derivative wrt aperture + * @param[in] aperture the model aperture/gap + * @param[out] dHydraulicAperture_dAperture the derivative of the effective aperture wrt aperture + * @return The hydraulic aperture that is always > 0 + */ + GEOS_HOST_DEVICE + real64 computeHydraulicAperture( real64 const aperture, + real64 const normalTraction, + real64 & dHydraulicAperture_daperture, + real64 & dHydraulicAperture_dNormalStress ) const; + +protected: + + /// The aperture table function wrapper + TableFunction::KernelWrapper m_apertureTable; +}; + + +/** + * @class HydraulicApertureTable + * + * This class serves as the interface for implementing contact enforcement constitutive relations. + * This does not include the actual enforcement algorithm, but only the constitutive relations that + * govern the behavior of the contact. So things like penalty, or friction, or kinematic constraint. + */ +class HydraulicApertureTable : public HydraulicApertureBase +{ +public: + + /** + * @brief The standard data repository constructor + * @param name The name of the relation in the data repository + * @param parent The name of the parent Group that holds this relation object. + */ + HydraulicApertureTable( string const & name, + Group * const parent ); + + /** + * @brief default destructor + */ + virtual ~HydraulicApertureTable() override; + + static string catalogName() { return "HydraulicApertureTable"; } + + virtual string getCatalogName() const override { return catalogName(); } + + virtual void allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) override final; + + + + /// Type of kernel wrapper for in-kernel update + using KernelWrapper = HydraulicApertureTableUpdates; + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelWrapper() const; + + /** + * @struct Structure to hold scoped key names + */ + struct viewKeyStruct : public ConstitutiveBase::viewKeyStruct + { + /// string/key for aperture tolerance + static constexpr char const * apertureToleranceString() { return "apertureTolerance"; } + + /// string/key for aperture table name + static constexpr char const * apertureTableNameString() { return "apertureTableName"; } + }; + + +protected: + + virtual void postInputInitialization() override; + + /** + * @brief Validate the values provided in the aperture table + * @param[in] apertureTable the effective aperture vs aperture table + */ + void validateApertureTable( TableFunction const & apertureTable ) const; + + /// The aperture tolerance to avoid floating point errors in expressions involving aperture + real64 m_apertureTolerance; + + /// The name of the aperture table, if any + string m_apertureTableName; + + /// Pointer to the function that limits the model aperture to a physically admissible value. + TableFunction const * m_apertureTable; +}; + +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +real64 HydraulicApertureTableUpdates::computeHydraulicAperture( real64 const aperture, + real64 const normalTraction, + real64 & dHydraulicAperture_dAperture, + real64 & dHydraulicAperture_dNormalStress ) const +{ + GEOS_UNUSED_VAR( normalTraction, dHydraulicAperture_dNormalStress ); + return m_apertureTable.compute( &aperture, &dHydraulicAperture_dAperture ); +} + +} /* namespace constitutive */ + +} /* namespace geos */ + +#endif /* GEOS_CONSTITUTIVE_CONTACT_HYDRAULICAPERTURETABLE_HPP_ */ diff --git a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp b/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp deleted file mode 100644 index 3f6c6ba15a5..00000000000 --- a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -/** - * @file ApertureTableContact.cpp - */ - -#include "../deprecated/ApertureTableContact.hpp" - -#include "functions/FunctionManager.hpp" -#include "functions/TableFunction.hpp" - -namespace geos -{ - -using namespace dataRepository; - -namespace constitutive -{ - -ApertureTableContact::ApertureTableContact( string const & name, - Group * const parent ) - : ContactBase( name, parent ), - m_apertureTolerance( 1.0e-99 ), - m_apertureTable( nullptr ) -{ - registerWrapper( viewKeyStruct::apertureToleranceString(), &m_apertureTolerance ). - setApplyDefaultValue( 1.0e-9 ). - setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Value to be used to avoid floating point errors in expressions involving aperture. " - "For example in the case of dividing by the actual aperture (not the effective aperture " - "that results from the aperture function) this value may be used to avoid the 1/0 error. " - "Note that this value may have some physical significance in its usage, as it may be used " - "to smooth out highly nonlinear behavior associated with 1/0 in addition to avoiding the " - "1/0 error." ); - - registerWrapper( viewKeyStruct::apertureTableNameString(), &m_apertureTableName ). - setRTTypeName( rtTypes::CustomTypes::groupNameRef ). - setInputFlag( InputFlags::REQUIRED ). - setDescription( "Name of the aperture table" ); -} - -ApertureTableContact::~ApertureTableContact() -{} - -void ApertureTableContact::postInputInitialization() -{ - FunctionManager const & functionManager = FunctionManager::getInstance(); - - GEOS_THROW_IF( m_apertureTableName.empty(), - getFullName() << ": the aperture table name " << m_apertureTableName << " is empty", - InputError ); - - GEOS_THROW_IF( !functionManager.hasGroup( m_apertureTableName ), - getFullName() << ": the aperture table named " << m_apertureTableName << " could not be found", - InputError ); -} - -void ApertureTableContact::initializePreSubGroups() -{ - FunctionManager & functionManager = FunctionManager::getInstance(); - TableFunction & apertureTable = functionManager.getGroup< TableFunction >( m_apertureTableName ); - validateApertureTable( apertureTable ); - - ArrayOfArraysView< real64 > coords = apertureTable.getCoordinates(); - arraySlice1d< real64 const > apertureValues = coords[0]; - array1d< real64 > & effectiveApertureValues = apertureTable.getValues(); - - localIndex const n = apertureValues.size()-1; - real64 const slope = ( effectiveApertureValues[n] - effectiveApertureValues[n-1] ) / ( apertureValues[n] - apertureValues[n-1] ); - real64 const apertureTransition = ( effectiveApertureValues[n] - slope * apertureValues[n] ) / ( 1.0 - slope ); - - coords.emplaceBack( 0, apertureTransition ); - effectiveApertureValues.emplace_back( apertureTransition ); - coords.emplaceBack( 0, apertureTransition*10e9 ); - effectiveApertureValues.emplace_back( apertureTransition*10e9 ); - apertureTable.reInitializeFunction(); - - m_apertureTable = &apertureTable; -} - -void ApertureTableContact::validateApertureTable( TableFunction const & apertureTable ) const -{ - ArrayOfArraysView< real64 const > const coords = apertureTable.getCoordinates(); - arrayView1d< real64 const > const & effectiveApertureValues = apertureTable.getValues(); - - GEOS_THROW_IF( coords.size() > 1, - getFullName() << ": Aperture limiter table cannot be greater than a 1D table.", - InputError ); - - arraySlice1d< real64 const > apertureValues = coords[0]; - localIndex const size = apertureValues.size(); - - GEOS_THROW_IF( coords( 0, size-1 ) > 0.0 || coords( 0, size-1 ) < 0.0, - getFullName() << ": Invalid aperture limiter table. Last coordinate must be zero!", - InputError ); - - GEOS_THROW_IF( apertureValues.size() < 2, - getFullName() << ": Invalid aperture limiter table. Must have more than two points specified", - InputError ); - - localIndex const n = apertureValues.size()-1; - real64 const slope = ( effectiveApertureValues[n] - effectiveApertureValues[n-1] ) / ( apertureValues[n] - apertureValues[n-1] ); - - GEOS_THROW_IF( slope >= 1.0, - getFullName() << ": Invalid aperture table. The slope of the last two points >= 1 is invalid.", - InputError ); -} - -ApertureTableContactUpdates ApertureTableContact::createKernelWrapper() const -{ - return ApertureTableContactUpdates( m_penaltyStiffness, - *m_apertureTable ); -} - -REGISTER_CATALOG_ENTRY( ConstitutiveBase, ApertureTableContact, string const &, Group * const ) - -} /* namespace constitutive */ - -} /* namespace geos */ diff --git a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp b/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp deleted file mode 100644 index 5f82cdf00d2..00000000000 --- a/src/coreComponents/constitutive/contact/deprecated/ApertureTableContact.hpp +++ /dev/null @@ -1,178 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors - * All rights reserved - * - * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. - * ------------------------------------------------------------------------------------------------------------ - */ - -/** - * @file ApertureTableContact.hpp - */ - -#ifndef GEOS_CONSTITUTIVE_CONTACT_APERTURETABLECONTACT_HPP_ -#define GEOS_CONSTITUTIVE_CONTACT_APERTURETABLECONTACT_HPP_ - -#include "constitutive/contact/ContactBase.hpp" -#include "functions/TableFunction.hpp" - -namespace geos -{ - -namespace constitutive -{ - -/** - * @class ApertureTableContactUpdates - * - * This class is used for in-kernel contact relation updates - */ -class ApertureTableContactUpdates : public ContactBaseUpdates -{ -public: - - ApertureTableContactUpdates( real64 const & penaltyStiffness, - TableFunction const & apertureTable ) - : ContactBaseUpdates( penaltyStiffness ), - m_apertureTable( apertureTable.createKernelWrapper() ) - {} - - /// Default copy constructor - ApertureTableContactUpdates( ApertureTableContactUpdates const & ) = default; - - /// Default move constructor - ApertureTableContactUpdates( ApertureTableContactUpdates && ) = default; - - /// Deleted default constructor - ApertureTableContactUpdates() = delete; - - /// Deleted copy assignment operator - ApertureTableContactUpdates & operator=( ApertureTableContactUpdates const & ) = delete; - - /// Deleted move assignment operator - ApertureTableContactUpdates & operator=( ApertureTableContactUpdates && ) = delete; - - GEOS_HOST_DEVICE - inline - virtual real64 computeEffectiveAperture( real64 const aperture, - real64 & dEffectiveAperture_dAperture ) const; - - GEOS_HOST_DEVICE - inline - virtual void computeTraction( arraySlice1d< real64 const > const & dispJump, - arraySlice1d< real64 > const & tractionVector, - arraySlice2d< real64 > const & dTractionVector_dJump ) const; - - GEOS_HOST_DEVICE - inline - void addPressureToTraction( real64 const & pressure, - bool const isOpen, - arraySlice1d< real64 >const & tractionVector, - real64 & dTraction_dPressure ) const; - -private: - - /// The aperture table function wrapper - TableFunction::KernelWrapper m_apertureTable; - -}; - - -/** - * @class ApertureTableContact - */ -class ApertureTableContact : public ContactBase -{ -public: - - /** - * @brief The standard data repository constructor - * @param name The name of the relation in the data repository - * @param parent The name of the parent Group that holds this relation object. - */ - ApertureTableContact( string const & name, - Group * const parent ); - - /** - * @brief default destructor - */ - virtual ~ApertureTableContact() override; - - /** - * @brief Name that is used to register this a type of "ApertureTableContact" in the object catalog - * @return See description - */ - static string catalogName() { return "Contact"; } - - virtual string getCatalogName() const override { return catalogName(); } - - /** - * @brief accessor for aperture tolerance - * @return the aperture tolerance - */ - real64 apertureTolerance() const { return m_apertureTolerance; } - - /// Type of kernel wrapper for in-kernel update - using KernelWrapper = ApertureTableContactUpdates; - - /** - * @brief Create an update kernel wrapper. - * @return the wrapper - */ - KernelWrapper createKernelWrapper() const; - - /** - * @struct Structure to hold scoped key names - */ - struct viewKeyStruct : public ConstitutiveBase::viewKeyStruct - { - /// string/key for aperture tolerance - static constexpr char const * apertureToleranceString() { return "apertureTolerance"; } - - /// string/key for aperture table name - static constexpr char const * apertureTableNameString() { return "apertureTableName"; } - }; - -protected: - - virtual void postInputInitialization() override; - - virtual void initializePreSubGroups() override; - - /** - * @brief Validate the values provided in the aperture table - * @param[in] apertureTable the effective aperture vs aperture table - */ - void validateApertureTable( TableFunction const & apertureTable ) const; - - /// The aperture tolerance to avoid floating point errors in expressions involving aperture - real64 m_apertureTolerance; - - /// The name of the aperture table, if any - string m_apertureTableName; - - /// Pointer to the function that limits the model aperture to a physically admissible value. - TableFunction const * m_apertureTable; - -}; - -GEOS_HOST_DEVICE -real64 ApertureTableContactUpdates::computeEffectiveAperture( real64 const aperture, - real64 & dEffectiveAperture_dAperture ) const -{ - return m_apertureTable.compute( &aperture, &dEffectiveAperture_dAperture ); -} - - -} /* namespace constitutive */ - -} /* namespace geos */ - -#endif /* GEOS_CONSTITUTIVE_CONTACT_APERTURETABLECONTACT_HPP_ */ diff --git a/src/coreComponents/fileIO/silo/SiloFile.cpp b/src/coreComponents/fileIO/silo/SiloFile.cpp index 4abcb5894d4..68f3d7289eb 100644 --- a/src/coreComponents/fileIO/silo/SiloFile.cpp +++ b/src/coreComponents/fileIO/silo/SiloFile.cpp @@ -31,7 +31,7 @@ #include "constitutive/ConstitutiveManager.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" -#include "constitutive/contact/ContactBase.hpp" +#include "constitutive/contact/FrictionBase.hpp" #include "constitutive/NullModel.hpp" #include "fileIO/Outputs/OutputUtilities.hpp" #include "mesh/DomainPartition.hpp" @@ -1468,7 +1468,7 @@ void SiloFile::writeElementMesh( ElementRegionBase const & elementRegion, localIndex const numFluids = regionFluidMaterialList.size(); string_array - fractureContactMaterialList = elementRegion.getConstitutiveNames< constitutive::ContactBase >(); + fractureContactMaterialList = elementRegion.getConstitutiveNames< constitutive::FrictionBase >(); localIndex const numContacts = fractureContactMaterialList.size(); diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index 2cef13dd221..7851dbdaa4d 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -20,14 +20,8 @@ #include "ContactSolverBase.hpp" #include "common/TimingMacros.hpp" -#include "constitutive/ConstitutiveManager.hpp" -#include "constitutive/contact/ContactSelector.hpp" -#include "constitutive/solid/ElasticIsotropic.hpp" -#include "finiteElement/elementFormulations/FiniteElementBase.hpp" -#include "linearAlgebra/utilities/LAIHelperFunctions.hpp" +#include "constitutive/contact/FrictionBase.hpp" #include "mesh/DomainPartition.hpp" -#include "fieldSpecification/FieldSpecificationManager.hpp" -#include "mesh/NodeManager.hpp" #include "mesh/SurfaceElementRegion.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "common/GEOS_RAJA_Interface.hpp" @@ -244,15 +238,15 @@ void ContactSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & su } else if( dynamic_cast< SurfaceElementSubRegion * >( &subRegion ) ) { - subRegion.registerWrapper< string >( viewKeyStruct::contactRelationNameString() ). + subRegion.registerWrapper< string >( viewKeyStruct::frictionLawNameString() ). setPlotLevel( PlotLevel::NOPLOT ). setRestartFlags( RestartFlags::NO_WRITE ). setSizedFromParent( 0 ); - string & contactRelationName = subRegion.getReference< string >( viewKeyStruct::contactRelationNameString() ); - contactRelationName = SolverBase::getConstitutiveName< ContactBase >( subRegion ); - GEOS_ERROR_IF( contactRelationName.empty(), GEOS_FMT( "{}: ContactBase model not found on subregion {}", - getDataContext(), subRegion.getDataContext() ) ); + string & frictionLawName = subRegion.getReference< string >( viewKeyStruct::frictionLawNameString() ); + frictionLawName = SolverBase::getConstitutiveName< FrictionBase >( subRegion ); + GEOS_ERROR_IF( frictionLawName.empty(), GEOS_FMT( "{}: FrictionBase model not found on subregion {}", + getDataContext(), subRegion.getDataContext() ) ); } } diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp index 1c4cf695ae6..d0d1b471ef3 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp @@ -54,6 +54,9 @@ class ContactSolverBase : public SolidMechanicsLagrangianFEM constexpr static char const * fractureStateString() { return "fractureState"; } constexpr static char const * oldFractureStateString() { return "oldFractureState"; } + + constexpr static char const * frictionLawNameString() { return "frictionLawName"; } + }; protected: diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp index 9be74bf112f..b5e530db12f 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp @@ -291,17 +291,18 @@ struct StateUpdateKernel /** * @brief Launch the kernel function doing fracture traction updates * @tparam POLICY the type of policy used in the kernel launch - * @tparam CONTACT_WRAPPER the type of contact wrapper doing the fracture traction updates + * @tparam FRICTION_WRAPPER the type of contact wrapper doing the fracture traction updates * @param[in] size the size of the subregion - * @param[in] contactWrapper the wrapper implementing the contact relationship + * @param[in] frictionWrapper the wrapper implementing the contact relationship * @param[in] jump the displacement jump * @param[out] fractureTraction the fracture traction * @param[out] dFractureTraction_dJump the derivative of the fracture traction wrt displacement jump */ - template< typename POLICY, typename CONTACT_WRAPPER > + template< typename POLICY, typename FRICTION_WRAPPER > static void launch( localIndex const size, - CONTACT_WRAPPER const & contactWrapper, + FRICTION_WRAPPER const & frictionWrapper, + real64 const contactPenaltyStiffness, arrayView2d< real64 const > const & oldJump, arrayView2d< real64 const > const & jump, arrayView2d< real64 > const & fractureTraction, @@ -311,10 +312,26 @@ struct StateUpdateKernel { forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) { - contactWrapper.computeTraction( k, oldJump[k], jump[k], - fractureState[k], - fractureTraction[k], - dFractureTraction_dJump[k] ); + // Initialize traction and derivatives to 0 + LvArray::forValuesInSlice( fractureTraction[k], []( real64 & val ){ val = 0.0; } ); + LvArray::forValuesInSlice( dFractureTraction_dJump[k], []( real64 & val ){ val = 0.0; } ); + + // If the fracture is open the traction is 0 and so are its derivatives so there is nothing to do + bool const isOpen = fractureState[k] == fields::contact::FractureState::Open; + + if( !isOpen ) + { + // normal component of the traction + fractureTraction[k][0] = contactPenaltyStiffness * jump[k][0]; + + // derivative of the normal component w.r.t. to the normal dispJump + dFractureTraction_dJump[k][0][0] = contactPenaltyStiffness; + + frictionWrapper.computeShearTraction( k, oldJump[k], jump[k], + fractureState[k], + fractureTraction[k], + dFractureTraction_dJump[k] ); + } slip[ k ] = LvArray::math::sqrt( LvArray::math::square( jump( k, 1 ) ) + LvArray::math::square( jump( k, 2 ) ) ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index 6e1653861c2..0d6af0ee41e 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -22,7 +22,7 @@ #include "common/TimingMacros.hpp" #include "common/GEOS_RAJA_Interface.hpp" #include "constitutive/ConstitutiveManager.hpp" -#include "constitutive/contact/ContactSelector.hpp" +#include "constitutive/contact/FrictionSelector.hpp" #include "constitutive/solid/ElasticIsotropic.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" #include "finiteElement/elementFormulations/FiniteElementBase.hpp" @@ -51,6 +51,10 @@ SolidMechanicsEmbeddedFractures::SolidMechanicsEmbeddedFractures( const string & setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( 0 ). setDescription( "Defines whether to use static condensation or not." ); + + getWrapperBase( viewKeyStruct::contactPenaltyStiffnessString() ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Value of the penetration penalty stiffness. Units of Pressure/length" ); } SolidMechanicsEmbeddedFractures::~SolidMechanicsEmbeddedFractures() @@ -718,8 +722,8 @@ void SolidMechanicsEmbeddedFractures::updateState( DomainPartition & domain ) { fractureRegion.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion & subRegion ) { - string const & contactRelationName = subRegion.template getReference< string >( viewKeyStruct::contactRelationNameString() ); - ContactBase const & contact = getConstitutiveModel< ContactBase >( subRegion, contactRelationName ); + string const & frictionLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + FrictionBase const & frictionLaw = getConstitutiveModel< FrictionBase >( subRegion, frictionLawName ); arrayView2d< real64 const > const & jump = subRegion.getField< contact::dispJump >(); @@ -733,14 +737,15 @@ void SolidMechanicsEmbeddedFractures::updateState( DomainPartition & domain ) arrayView1d< real64 > const & slip = subRegion.getField< fields::contact::slip >(); - constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) + constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) { - using ContactType = TYPEOFREF( castedContact ); - typename ContactType::KernelWrapper contactWrapper = castedContact.createKernelWrapper(); + using FrictionType = TYPEOFREF( castedFrictionLaw ); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelWrapper(); solidMechanicsEFEMKernels::StateUpdateKernel:: launch< parallelDevicePolicy<> >( subRegion.size(), - contactWrapper, + frictionWrapper, + m_contactPenaltyStiffness, oldJump, jump, fractureTraction, @@ -765,13 +770,13 @@ bool SolidMechanicsEmbeddedFractures::updateConfiguration( DomainPartition & dom arrayView2d< real64 const > const & traction = subRegion.getField< fields::contact::traction >(); arrayView1d< integer > const & fractureState = subRegion.getField< fields::contact::fractureState >(); - string const & contactRelationName = subRegion.template getReference< string >( viewKeyStruct::contactRelationNameString() ); - ContactBase const & contact = getConstitutiveModel< ContactBase >( subRegion, contactRelationName ); + string const & frictionLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + FrictionBase const & frictionLaw = getConstitutiveModel< FrictionBase >( subRegion, frictionLawName ); - constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) + constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) { - using ContactType = TYPEOFREF( castedContact ); - typename ContactType::KernelWrapper contactWrapper = castedContact.createKernelWrapper(); + using FrictionType = TYPEOFREF( castedFrictionLaw ); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelWrapper(); RAJA::ReduceMin< parallelHostReduce, integer > checkActiveSetSub( 1 ); @@ -780,7 +785,7 @@ bool SolidMechanicsEmbeddedFractures::updateConfiguration( DomainPartition & dom if( ghostRank[kfe] < 0 ) { integer const originalFractureState = fractureState[kfe]; - contactWrapper.updateFractureState( kfe, dispJump[kfe], traction[kfe], fractureState[kfe] ); + frictionWrapper.updateFractureState( kfe, dispJump[kfe], traction[kfe], fractureState[kfe] ); checkActiveSetSub.min( compareFractureStates( originalFractureState, fractureState[kfe] ) ); } } ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index e4cf9d874b5..d601ccdf50d 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -118,6 +118,8 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase struct viewKeyStruct : ContactSolverBase::viewKeyStruct { constexpr static char const * useStaticCondensationString() { return "useStaticCondensation"; } + + constexpr static char const * contactPenaltyStiffnessString() { return "contactPenaltyStiffness"; } }; protected: @@ -135,6 +137,9 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase /// decide whether to use static condensation or not integer m_useStaticCondensation; + // TODO: activate when solidMechanicsPenalty contact is used and this is removed from base solver. + // real64 m_contactPenaltyStiffness; + }; diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index d4d537ab405..75ac7e16f0e 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -22,7 +22,7 @@ #include "common/TimingMacros.hpp" #include "constitutive/ConstitutiveManager.hpp" -#include "constitutive/contact/ContactSelector.hpp" +#include "constitutive/contact/FrictionSelector.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "finiteVolume/FiniteVolumeManager.hpp" #include "finiteVolume/FluxApproximationBase.hpp" @@ -1458,8 +1458,8 @@ void SolidMechanicsLagrangeContact:: [&]( localIndex const, FaceElementSubRegion const & subRegion ) { - string const & contactRelationName = subRegion.template getReference< string >( viewKeyStruct::contactRelationNameString() ); - ContactBase const & contact = getConstitutiveModel< ContactBase >( subRegion, contactRelationName ); + string const & frictionLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + FrictionBase const & frictionLaw = getConstitutiveModel< FrictionBase >( subRegion, frictionLawName ); arrayView1d< globalIndex const > const & tracDofNumber = subRegion.getReference< globalIndex_array >( tracDofKey ); arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); @@ -1473,10 +1473,10 @@ void SolidMechanicsLagrangeContact:: arrayView2d< real64 const > const & previousDispJump = subRegion.getField< contact::oldDispJump >(); arrayView1d< real64 const > const & slidingTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::slidingToleranceString() ); - constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) + constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) { - using ContactType = TYPEOFREF( castedContact ); - typename ContactType::KernelWrapper contactWrapper = castedContact.createKernelWrapper(); + using FrictionType = TYPEOFREF( castedFrictionLaw ); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelWrapper(); forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { @@ -1577,8 +1577,8 @@ void SolidMechanicsLagrangeContact:: } real64 dLimitTau_dNormalTraction = 0; - real64 const limitTau = contactWrapper.computeLimitTangentialTractionNorm( traction[kfe][0], - dLimitTau_dNormalTraction ); + real64 const limitTau = frictionWrapper.computeLimitTangentialTractionNorm( traction[kfe][0], + dLimitTau_dNormalTraction ); real64 sliding[ 2 ] = { dispJump[kfe][1] - previousDispJump[kfe][1], dispJump[kfe][2] - previousDispJump[kfe][2] }; real64 slidingNorm = sqrt( sliding[ 0 ]*sliding[ 0 ] + sliding[ 1 ]*sliding[ 1 ] ); @@ -2230,8 +2230,8 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, FaceElementSubRegion & subRegion ) { - string const & contactRelationName = subRegion.template getReference< string >( viewKeyStruct::contactRelationNameString() ); - ContactBase const & contact = getConstitutiveModel< ContactBase >( subRegion, contactRelationName ); + string const & fricitonLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + FrictionBase const & frictionLaw = getConstitutiveModel< FrictionBase >( subRegion, fricitonLawName ); arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); arrayView2d< real64 const > const & traction = subRegion.getField< contact::traction >(); @@ -2247,10 +2247,10 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai RAJA::ReduceSum< parallelHostReduce, real64 > changed( 0 ); RAJA::ReduceSum< parallelHostReduce, real64 > total( 0 ); - constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) + constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) { - using ContactType = TYPEOFREF( castedContact ); - typename ContactType::KernelWrapper contactWrapper = castedContact.createKernelWrapper(); + using FrictionType = TYPEOFREF( castedFrictionLaw ); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelWrapper(); forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { @@ -2282,8 +2282,8 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai real64 dLimitTangentialTractionNorm_dTraction = 0.0; real64 const limitTau = - contactWrapper.computeLimitTangentialTractionNorm( traction[kfe][0], - dLimitTangentialTractionNorm_dTraction ); + frictionWrapper.computeLimitTangentialTractionNorm( traction[kfe][0], + dLimitTangentialTractionNorm_dTraction ); if( originalFractureState == FractureState::Stick && currentTau >= limitTau ) { diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp new file mode 100644 index 00000000000..b635abb1b52 --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp @@ -0,0 +1,235 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SolidMechanicsPenaltyContact.cpp + * + */ + +#include "SolidMechanicsPenaltyContact.hpp" + +#include "common/TimingMacros.hpp" +#include "constitutive/ConstitutiveManager.hpp" +#include "constitutive/contact/FrictionSelector.hpp" + + +#if defined( __INTEL_COMPILER ) +#pragma GCC optimize "O0" +#endif + +namespace geos +{ + +using namespace constitutive; +using namespace dataRepository; +using namespace fields; +using namespace finiteElement; + +SolidMechanicsPenaltyContact::SolidMechanicsPenaltyContact( const string & name, + Group * const parent ): + ContactSolverBase( name, parent ) +{ + registerWrapper( viewKeyStruct::contactPenaltyStiffnessString(), &m_contactPenaltyStiffness ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Value of the penetration penalty stiffness. Units of Pressure/length" ); +} + +SolidMechanicsPenaltyContact::~SolidMechanicsPenaltyContact() +{ + // TODO Auto-generated destructor stub +} + +void SolidMechanicsPenaltyContact::setupSystem( DomainPartition & domain, + DofManager & dofManager, + CRSMatrix< real64, globalIndex > & localMatrix, + ParallelVector & rhs, + ParallelVector & solution, + bool const setSparsity ) +{ + GEOS_MARK_FUNCTION; + SolverBase::setupSystem( domain, dofManager, localMatrix, rhs, solution, false ); + + SparsityPattern< globalIndex > sparsityPattern( dofManager.numLocalDofs(), + dofManager.numGlobalDofs(), + 8*8*3*1.2 ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + NodeManager const & nodeManager = mesh.getNodeManager(); + arrayView1d< globalIndex const > const + dofNumber = nodeManager.getReference< globalIndex_array >( dofManager.getKey( solidMechanics::totalDisplacement::key() ) ); + + + ElementRegionManager const & elemManager = mesh.getElemManager(); + array1d< string > allFaceElementRegions; + elemManager.forElementRegions< SurfaceElementRegion >( [&]( SurfaceElementRegion const & elemRegion ) + { + allFaceElementRegions.emplace_back( elemRegion.getName() ); + } ); + + finiteElement:: + fillSparsity< FaceElementSubRegion, + solidMechanicsLagrangianFEMKernels::ImplicitSmallStrainQuasiStatic >( mesh, + allFaceElementRegions, + this->getDiscretizationName(), + dofNumber, + dofManager.rankOffset(), + sparsityPattern ); + + finiteElement::fillSparsity< CellElementSubRegion, + solidMechanicsLagrangianFEMKernels::ImplicitSmallStrainQuasiStatic >( mesh, + regionNames, + this->getDiscretizationName(), + dofNumber, + dofManager.rankOffset(), + sparsityPattern ); + + + } ); + + sparsityPattern.compress(); + localMatrix.assimilate< parallelDevicePolicy<> >( std::move( sparsityPattern ) ); +} + +void SolidMechanicsPenaltyContact::assembleSystem( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + GEOS_MARK_FUNCTION; + + synchronizeFractureState( domain ); + + SolidMechanicsLagrangianFEM::assembleSystem( time, + dt, + domain, + dofManager, + localMatrix, + localRhs ); + + assembleContact( domain, dofManager, localMatrix, localRhs ); +} + +void SolidMechanicsPenaltyContact::assembleContact( DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + FaceManager const & faceManager = mesh.getFaceManager(); + NodeManager & nodeManager = mesh.getNodeManager(); + ElementRegionManager & elemManager = mesh.getElemManager(); + + solidMechanics::arrayViewConst2dLayoutTotalDisplacement const u = + nodeManager.getField< solidMechanics::totalDisplacement >(); + arrayView2d< real64 > const fc = nodeManager.getField< solidMechanics::contactForce >(); + fc.zero(); + + arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); + ArrayOfArraysView< localIndex const > const facesToNodes = faceManager.nodeList().toViewConst(); + + string const dofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + arrayView1d< globalIndex > const nodeDofNumber = nodeManager.getReference< globalIndex_array >( dofKey ); + globalIndex const rankOffset = dofManager.rankOffset(); + + // TODO: this bound may need to change + constexpr localIndex maxNodexPerFace = 4; + constexpr localIndex maxDofPerElem = maxNodexPerFace * 3 * 2; + + elemManager.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) + { + real64 const contactStiffness = m_contactPenaltyStiffness; + + arrayView1d< real64 > const area = subRegion.getElementArea(); + ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + + // TODO: use parallel policy? + forAll< serialPolicy >( subRegion.size(), [=] ( localIndex const kfe ) + { + localIndex const kf0 = elemsToFaces[kfe][0], kf1 = elemsToFaces[kfe][1]; + real64 Nbar[ 3 ] = { faceNormal[kf0][0] - faceNormal[kf1][0], + faceNormal[kf0][1] - faceNormal[kf1][1], + faceNormal[kf0][2] - faceNormal[kf1][2] }; + + LvArray::tensorOps::normalize< 3 >( Nbar ); + + localIndex const numNodesPerFace=facesToNodes.sizeOfArray( kf0 ); + real64 const Ja = area[kfe] / numNodesPerFace; + + stackArray1d< globalIndex, maxDofPerElem > rowDOF( numNodesPerFace*3*2 ); + stackArray1d< real64, maxDofPerElem > nodeRHS( numNodesPerFace*3*2 ); + stackArray2d< real64, maxDofPerElem *maxDofPerElem > dRdP( numNodesPerFace*3*2, numNodesPerFace*3*2 ); + + for( localIndex a=0; a( gap, u[node0] ); + real64 const gapNormal = LvArray::tensorOps::AiBi< 3 >( gap, Nbar ); + + for( int i=0; i<3; ++i ) + { + rowDOF[3*a+i] = nodeDofNumber[node0]+i; + rowDOF[3*(numNodesPerFace + a)+i] = nodeDofNumber[node1]+i; + } + + if( gapNormal < 0 ) + { + LvArray::tensorOps::scale< 3 >( penaltyForce, -contactStiffness * gapNormal * Ja ); + for( int i=0; i<3; ++i ) + { + LvArray::tensorOps::subtract< 3 >( fc[node0], penaltyForce ); + LvArray::tensorOps::add< 3 >( fc[node1], penaltyForce ); + nodeRHS[3*a+i] -= penaltyForce[i]; + nodeRHS[3*(numNodesPerFace + a)+i] += penaltyForce[i]; + + dRdP( 3*a+i, 3*a+i ) -= contactStiffness * Ja * Nbar[i] * Nbar[i]; + dRdP( 3*a+i, 3*(numNodesPerFace + a)+i ) += contactStiffness * Ja * Nbar[i] * Nbar[i]; + dRdP( 3*(numNodesPerFace + a)+i, 3*a+i ) += contactStiffness * Ja * Nbar[i] * Nbar[i]; + dRdP( 3*(numNodesPerFace + a)+i, 3*(numNodesPerFace + a)+i ) -= contactStiffness * Ja * Nbar[i] * Nbar[i]; + } + } + } + + for( localIndex idof = 0; idof < numNodesPerFace*3*2; ++idof ) + { + localIndex const localRow = LvArray::integerConversion< localIndex >( rowDOF[idof] - rankOffset ); + + if( localRow >= 0 && localRow < localMatrix.numRows() ) + { + localMatrix.addToRowBinarySearchUnsorted< serialAtomic >( localRow, + rowDOF.data(), + dRdP[idof].dataIfContiguous(), + numNodesPerFace*3*2 ); + RAJA::atomicAdd( serialAtomic{}, &localRhs[localRow], nodeRHS[idof] ); + } + } + } ); + } ); + } ); +} + + +REGISTER_CATALOG_ENTRY( SolverBase, SolidMechanicsPenaltyContact, string const &, Group * const ) + +} /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp new file mode 100644 index 00000000000..d368fc15ebc --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp @@ -0,0 +1,92 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SolidMechanicsPenaltyContact.hpp + * + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSPENALTYCONTACT_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSPENALTYCONTACT_HPP_ + +#include "physicsSolvers/contact/ContactSolverBase.hpp" +#include "../../linearAlgebra/DofManager.hpp" +#include "../../common/DataTypes.hpp" + +namespace geos +{ + +class SolidMechanicsLagrangianFEM; + +class SolidMechanicsPenaltyContact : public ContactSolverBase +{ +public: + + SolidMechanicsPenaltyContact( const string & name, + Group * const parent ); + + ~SolidMechanicsPenaltyContact() override; + + /** + * @brief name of the node manager in the object catalog + * @return string that contains the catalog name to generate a new NodeManager object through the object catalog. + */ + static string catalogName() + { + return "SolidMechanicsPenaltyContact"; + } + /** + * @copydoc SolverBase::getCatalogName() + */ + string getCatalogName() const override { return catalogName(); } + + /// String used to form the solverName used to register single-physics solvers in CoupledSolver + static string coupledSolverAttributePrefix() { return "PenaltyContact"; } + + virtual void + setupSystem( DomainPartition & domain, + DofManager & dofManager, + CRSMatrix< real64, globalIndex > & localMatrix, + ParallelVector & rhs, + ParallelVector & solution, + bool const setSparsity = true ) override final; + + virtual void + assembleSystem( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) override; + + void assembleContact( DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ); + +protected: + +private: + + struct viewKeyStruct : ContactSolverBase::viewKeyStruct + { + constexpr static char const * contactPenaltyStiffnessString() { return "contactPenaltyStiffness"; } + }; + + real64 m_contactPenaltyStiffness; +}; + +} /* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSPENALTYCONTACT_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 8c8acc2ebcb..3e63e5e00c2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -22,6 +22,7 @@ #include "constitutive/ConstitutivePassThru.hpp" #include "constitutive/permeability/PermeabilityFields.hpp" #include "constitutive/solid/SolidInternalEnergy.hpp" +#include "constitutive/contact/HydraulicApertureBase.hpp" #include "discretizationMethods/NumericalMethodsManager.hpp" #include "fieldSpecification/AquiferBoundaryCondition.hpp" #include "fieldSpecification/EquilibriumInitialCondition.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 5743772a144..3c108c21daa 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -6,7 +6,7 @@ * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University * Copyright (c) 2018-2024 Chevron - * Copyright (c) 2019- GEOS/GEOSX Contributors + * Copyright (c) 2019- GEOS/GEOS Contributors * All rights reserved * * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. @@ -17,10 +17,9 @@ * @file HydrofractureSolver.cpp */ - #include "HydrofractureSolver.hpp" -#include "constitutive/contact/ContactSelector.hpp" +#include "constitutive/contact/HydraulicApertureRelationSelector.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" @@ -41,7 +40,6 @@ template< typename POROMECHANICS_SOLVER > HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & name, Group * const parent ) : Base( name, parent ), - m_contactRelationName(), m_surfaceGeneratorName(), m_surfaceGenerator( nullptr ), m_maxNumResolves( 10 ), @@ -53,11 +51,6 @@ HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & setInputFlag( InputFlags::REQUIRED ). setDescription( "Name of the surface generator to use in the hydrofracture solver" ); - registerWrapper( viewKeyStruct::contactRelationNameString(), &m_contactRelationName ). - setRTTypeName( rtTypes::CustomTypes::groupNameRef ). - setInputFlag( InputFlags::REQUIRED ). - setDescription( "Name of contact relation to enforce constraints on fracture boundary." ); - registerWrapper( viewKeyStruct::maxNumResolvesString(), &m_maxNumResolves ). setApplyDefaultValue( 10 ). setInputFlag( InputFlags::OPTIONAL ). @@ -288,7 +281,8 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::updateHydraulicApertureAndFrac elemManager.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) { - ContactBase const & contact = this->template getConstitutiveModel< ContactBase >( subRegion, m_contactRelationName ); + string const & hydraulicApertureRelationName = subRegion.template getReference< string >( viewKeyStruct::hydraulicApertureRelationNameString() ); + HydraulicApertureBase const & hydraulicApertureModel = this->template getConstitutiveModel< HydraulicApertureBase >( subRegion, hydraulicApertureRelationName ); arrayView1d< real64 > const aperture = subRegion.getElementAperture(); arrayView1d< real64 > const hydraulicAperture = subRegion.getField< flow::hydraulicAperture >(); @@ -316,14 +310,14 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::updateHydraulicApertureAndFrac { typename TYPEOFREF( castedPorousSolid ) ::KernelWrapper porousMaterialWrapper = castedPorousSolid.createKernelUpdates(); - constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) + constitutiveUpdatePassThru( hydraulicApertureModel, [&] ( auto & castedHydraulicApertureModel ) { - using ContactType = TYPEOFREF( castedContact ); - typename ContactType::KernelWrapper contactWrapper = castedContact.createKernelWrapper(); + using HydraulicApertureModelType = TYPEOFREF( castedHydraulicApertureModel ); + typename HydraulicApertureModelType::KernelWrapper hydraulicApertureWrapper = castedHydraulicApertureModel.createKernelWrapper(); auto const statistics = hydrofractureSolverKernels::DeformationUpdateKernel ::launch< parallelDevicePolicy<> >( subRegion.size(), - contactWrapper, + hydraulicApertureWrapper, porousMaterialWrapper, u, faceNormal, @@ -809,7 +803,8 @@ assembleFluidMassResidualDerivativeWrtDisplacement( DomainPartition const & doma [&]( localIndex const, FaceElementSubRegion const & subRegion ) { - ContactBase const & contact = this->template getConstitutiveModel< ContactBase >( subRegion, m_contactRelationName ); + string const & hydraulicApertureRelationName = subRegion.template getReference< string >( viewKeyStruct::hydraulicApertureRelationNameString() ); + HydraulicApertureBase const & hydraulicApertureModel = this->template getConstitutiveModel< HydraulicApertureBase >( subRegion, hydraulicApertureRelationName ); string const & fluidName = subRegion.getReference< string >( FlowSolverBase::viewKeyStruct::fluidNamesString() ); SingleFluidBase const & fluid = this->template getConstitutiveModel< SingleFluidBase >( subRegion, fluidName ); @@ -827,15 +822,15 @@ assembleFluidMassResidualDerivativeWrtDisplacement( DomainPartition const & doma arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); - constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) + constitutiveUpdatePassThru( hydraulicApertureModel, [&] ( auto & castedHydraulicApertureModel ) { - using ContactType = TYPEOFREF( castedContact ); - typename ContactType::KernelWrapper contactWrapper = castedContact.createKernelWrapper(); + using HydraulicApertureModelType = TYPEOFREF( castedHydraulicApertureModel ); + typename HydraulicApertureModelType::KernelWrapper hydraulicApertureWrapper = castedHydraulicApertureModel.createKernelWrapper(); hydrofractureSolverKernels::FluidMassResidualDerivativeAssemblyKernel:: launch< parallelDevicePolicy<> >( subRegion.size(), rankOffset, - contactWrapper, + hydraulicApertureWrapper, m_useQuasiNewton, elemsToFaces, faceToNodeMap, @@ -1049,7 +1044,7 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( D localIndex const newElemIndex = newFractureElements[k]; real64 initialPressure = 1.0e99; real64 initialAperture = 1.0e99; - #ifdef GEOSX_USE_SEPARATION_COEFFICIENT + #ifdef GEOS_USE_SEPARATION_COEFFICIENT apertureF[newElemIndex] = aperture[newElemIndex]; #endif if( m_newFractureInitializationType == InitializationType::Displacement ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index 9df2e20b199..c9598839401 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -163,8 +163,6 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER struct viewKeyStruct : Base::viewKeyStruct { - constexpr static char const * contactRelationNameString() { return "contactRelationName"; } - constexpr static char const * surfaceGeneratorNameString() { return "surfaceGeneratorName"; } constexpr static char const * maxNumResolvesString() { return "maxNumResolves"; } @@ -175,7 +173,7 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER constexpr static char const * useQuasiNewtonString() { return "useQuasiNewton"; } - static constexpr char const * isLaggingFractureStencilWeightsUpdateString() { return "isLaggingFractureStencilWeightsUpdate"; } + constexpr static char const * isLaggingFractureStencilWeightsUpdateString() { return "isLaggingFractureStencilWeightsUpdate"; } #ifdef GEOS_USE_SEPARATION_COEFFICIENT constexpr static char const * separationCoeff0String() { return "separationCoeff0"; } diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp index cd193042239..e555a51d551 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp @@ -32,10 +32,10 @@ namespace hydrofractureSolverKernels struct DeformationUpdateKernel { - template< typename POLICY, typename CONTACT_WRAPPER, typename POROUS_WRAPPER > + template< typename POLICY, typename HYDRAULICAPERTURE_WRAPPER, typename POROUS_WRAPPER > static std::tuple< double, double, double, double, double, double > launch( localIndex const size, - CONTACT_WRAPPER const & contactWrapper, + HYDRAULICAPERTURE_WRAPPER const & hydraulicApertureWrapper, POROUS_WRAPPER const & porousMaterialWrapper, arrayView2d< real64 const, nodes::TOTAL_DISPLACEMENT_USD > const & u, arrayView2d< real64 const > const & faceNormal, @@ -86,8 +86,14 @@ struct DeformationUpdateKernel minAperture.min( aperture[kfe] ); maxAperture.max( aperture[kfe] ); - real64 dHydraulicAperture_dNormalJump = 0; - real64 const newHydraulicAperture = contactWrapper.computeHydraulicAperture( aperture[kfe], dHydraulicAperture_dNormalJump ); + real64 normalTraction = 0.0; /// TODO: must be changed to use actual traction + real64 dHydraulicAperture_dNormalTraction = 0.0; + real64 dHydraulicAperture_dNormalJump = 0.0; + real64 const newHydraulicAperture = hydraulicApertureWrapper.computeHydraulicAperture( aperture[kfe], + normalTraction, + dHydraulicAperture_dNormalJump, + dHydraulicAperture_dNormalTraction ); + maxHydraulicApertureChange.max( std::fabs( newHydraulicAperture - hydraulicAperture[kfe] )); real64 const oldHydraulicAperture = hydraulicAperture[kfe]; hydraulicAperture[kfe] = newHydraulicAperture; @@ -127,11 +133,11 @@ struct DeformationUpdateKernel struct FluidMassResidualDerivativeAssemblyKernel { - template< typename CONTACT_WRAPPER > + template< typename HYDRAULICAPERTURE_WRAPPER > GEOS_HOST_DEVICE inline static void - computeAccumulationDerivative( CONTACT_WRAPPER const & contactWrapper, + computeAccumulationDerivative( HYDRAULICAPERTURE_WRAPPER const & hydraulicApertureWrapper, localIndex const numNodesPerFace, arraySlice1d< localIndex const > const elemsToFaces, ArrayOfArraysView< localIndex const > const faceToNodeMap, @@ -143,8 +149,13 @@ struct FluidMassResidualDerivativeAssemblyKernel globalIndex (& nodeDOF)[8 * 3], arraySlice1d< real64 > const dRdU ) { - real64 dHydraulicAperture_dNormalJump = 0; - real64 const hydraulicAperture = contactWrapper.computeHydraulicAperture( aperture, dHydraulicAperture_dNormalJump ); + real64 dHydraulicAperture_dNormalJump = 0.0; + real64 dHydraulicAperture_dTraction = 0.0; + real64 fractureTraction = 0.0; + real64 const hydraulicAperture = hydraulicApertureWrapper.computeHydraulicAperture( aperture, + fractureTraction, + dHydraulicAperture_dNormalJump, + dHydraulicAperture_dTraction ); GEOS_UNUSED_VAR( hydraulicAperture ); constexpr integer kfSign[2] = { -1, 1 }; @@ -201,11 +212,11 @@ struct FluidMassResidualDerivativeAssemblyKernel } } - template< typename POLICY, typename CONTACT_WRAPPER > + template< typename POLICY, typename HYDRAULICAPERTURE_WRAPPER > static void launch( localIndex const size, globalIndex const rankOffset, - CONTACT_WRAPPER const & contactWrapper, + HYDRAULICAPERTURE_WRAPPER const & hydraulicApertureWrapper, integer const useQuasiNewton, ArrayOfArraysView< localIndex const > const elemsToFaces, ArrayOfArraysView< localIndex const > const faceToNodeMap, @@ -230,7 +241,7 @@ struct FluidMassResidualDerivativeAssemblyKernel globalIndex nodeDOF[8 * 3]; stackArray1d< real64, 24 > dRdU( 2 * numNodesPerFace * 3 ); // - computeAccumulationDerivative( contactWrapper, + computeAccumulationDerivative( hydraulicApertureWrapper, numNodesPerFace, elemsToFaces[ei], faceToNodeMap, diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index 9030f995508..bf6446aa0a6 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -27,6 +27,7 @@ #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "constitutive/solid/CoupledSolidBase.hpp" #include "constitutive/solid/PorousSolid.hpp" +#include "constitutive/contact/HydraulicApertureBase.hpp" #include "mesh/DomainPartition.hpp" #include "mesh/utilities/AverageOverQuadraturePointsKernel.hpp" #include "codingUtilities/Utilities.hpp" @@ -123,6 +124,23 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER InputError ); } + virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override final + { + if( dynamic_cast< SurfaceElementSubRegion * >( &subRegion ) ) + { + subRegion.registerWrapper< string >( viewKeyStruct::hydraulicApertureRelationNameString() ). + setPlotLevel( PlotLevel::NOPLOT ). + setRestartFlags( RestartFlags::NO_WRITE ). + setSizedFromParent( 0 ); + + string & hydraulicApertureModelName = subRegion.getReference< string >( viewKeyStruct::hydraulicApertureRelationNameString() ); + hydraulicApertureModelName = SolverBase::getConstitutiveName< HydraulicApertureBase >( subRegion ); + GEOS_ERROR_IF( hydraulicApertureModelName.empty(), GEOS_FMT( "{}: HydraulicApertureBase model not found on subregion {}", + this->getDataContext(), subRegion.getDataContext() ) ); + } + + } + virtual void initializePreSubGroups() override { Base::initializePreSubGroups(); @@ -311,6 +329,10 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER /// Multiplier on stabilization strength constexpr static const char * stabilizationMultiplierString() {return "stabilizationMultiplier"; } + + /// Name of the hydraulicApertureRelationName + static constexpr char const * hydraulicApertureRelationNameString() {return "hydraulicApertureRelationName"; } + }; void updateStabilizationParameters( DomainPartition & domain ) const diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index abd76e855ad..2f0a16dc9ef 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -20,12 +20,11 @@ #include "SinglePhasePoromechanicsConformingFractures.hpp" #include "constitutive/solid/PorousSolid.hpp" -#include "constitutive/contact/ContactSelector.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "linearAlgebra/solvers/BlockPreconditioner.hpp" #include "linearAlgebra/solvers/SeparateComponentPreconditioner.hpp" +#include "constitutive/contact/HydraulicApertureRelationSelector.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" -//#include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp" @@ -769,13 +768,13 @@ void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::updateHydraulic string const porousSolidName = subRegion.getReference< string >( FlowSolverBase::viewKeyStruct::solidNamesString() ); CoupledSolidBase & porousSolid = subRegion.getConstitutiveModel< CoupledSolidBase >( porousSolidName ); - string const & contactRelationName = subRegion.template getReference< string >( SolidMechanicsLagrangianFEM::viewKeyStruct::contactRelationNameString() ); - ContactBase const & contact = subRegion.getConstitutiveModel< ContactBase >( contactRelationName ); + string const & hydraulicApertureRelationName = subRegion.template getReference< string >( viewKeyStruct::hydraulicApertureRelationNameString() ); + HydraulicApertureBase const & hydraulicApertureModel = this->template getConstitutiveModel< HydraulicApertureBase >( subRegion, hydraulicApertureRelationName ); - constitutiveUpdatePassThru( contact, [&] ( auto & castedContact ) + constitutiveUpdatePassThru( hydraulicApertureModel, [&] ( auto & castedHydraulicAperture ) { - using ContactType = TYPEOFREF( castedContact ); - typename ContactType::KernelWrapper contactWrapper = castedContact.createKernelWrapper(); + using HydraulicApertureType = TYPEOFREF( castedHydraulicAperture ); + typename HydraulicApertureType::KernelWrapper hydraulicApertureWrapper = castedHydraulicAperture.createKernelWrapper(); constitutive::ConstitutivePassThru< CompressibleSolidBase >::execute( porousSolid, [=, &subRegion] ( auto & castedPorousSolid ) { @@ -784,7 +783,7 @@ void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::updateHydraulic poromechanicsFracturesKernels::StateUpdateKernel:: launch< parallelDevicePolicy<> >( subRegion.size(), porousMaterialWrapper, - contactWrapper, + hydraulicApertureWrapper, dispJump, pressure, area, diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp index 124c2c261dd..72cfd3d68ca 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp @@ -107,6 +107,9 @@ class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechan private: + struct viewKeyStruct : public Base::viewKeyStruct + {}; + static const localIndex m_maxFaceNodes=11; // Maximum number of nodes on a contact face void assembleElementBasedContributions( real64 const time_n, diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index deb60634c18..79dba986aa4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -18,7 +18,7 @@ */ #include "SinglePhasePoromechanicsEmbeddedFractures.hpp" -#include "constitutive/contact/ContactSelector.hpp" +#include "constitutive/contact/HydraulicApertureRelationSelector.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" @@ -496,33 +496,38 @@ void SinglePhasePoromechanicsEmbeddedFractures::updateState( DomainPartition & d arrayView1d< real64 const > const & pressure = subRegion.template getField< fields::flow::pressure >(); - string const & contactRelationName = subRegion.template getReference< string >( ContactSolverBase::viewKeyStruct::contactRelationNameString() ); - ContactBase const & contact = getConstitutiveModel< ContactBase >( subRegion, contactRelationName ); - - ContactBase::KernelWrapper contactWrapper = contact.createKernelWrapper(); + string const & hydraulicApertureRelationName = subRegion.template getReference< string >( viewKeyStruct::hydraulicApertureRelationNameString() ); + HydraulicApertureBase const & hydraulicApertureModel = this->template getConstitutiveModel< HydraulicApertureBase >( subRegion, hydraulicApertureRelationName ); string const porousSolidName = subRegion.template getReference< string >( FlowSolverBase::viewKeyStruct::solidNamesString() ); CoupledSolidBase & porousSolid = subRegion.template getConstitutiveModel< CoupledSolidBase >( porousSolidName ); - constitutive::ConstitutivePassThru< CompressibleSolidBase >::execute( porousSolid, [=, &subRegion] ( auto & castedPorousSolid ) + constitutive::ConstitutivePassThru< CompressibleSolidBase >::execute( porousSolid, [=, &subRegion, &hydraulicApertureModel] ( auto & castedPorousSolid ) { typename TYPEOFREF( castedPorousSolid ) ::KernelWrapper porousMaterialWrapper = castedPorousSolid.createKernelUpdates(); - poromechanicsEFEMKernels::StateUpdateKernel:: - launch< parallelDevicePolicy<> >( subRegion.size(), - contactWrapper, - porousMaterialWrapper, - dispJump, - pressure, - area, - volume, - deltaVolume, - aperture, - oldHydraulicAperture, - hydraulicAperture, - fractureTraction, - dTdpf ); + constitutiveUpdatePassThru( hydraulicApertureModel, [=, &subRegion] ( auto & castedHydraulicApertureModel ) + { + using HydraulicApertureModelType = TYPEOFREF( castedHydraulicApertureModel ); + typename HydraulicApertureModelType::KernelWrapper hydraulicApertureModelWrapper = castedHydraulicApertureModel.createKernelWrapper(); + + poromechanicsEFEMKernels::StateUpdateKernel:: + launch< parallelDevicePolicy<> >( subRegion.size(), + hydraulicApertureModelWrapper, + porousMaterialWrapper, + dispJump, + pressure, + area, + volume, + deltaVolume, + aperture, + oldHydraulicAperture, + hydraulicAperture, + fractureTraction, + dTdpf ); + + } ); } ); // update the stencil weights using the updated hydraulic aperture diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp index 3afa2f8e64d..ed4f3c07813 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp @@ -20,7 +20,6 @@ #ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_SINGLEPHASEPOROMECHANICSEFEM_HPP_ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_SINGLEPHASEPOROMECHANICSEFEM_HPP_ -#include "constitutive/contact/ContactBase.hpp" #include "finiteElement/kernelInterface/ImplicitKernelBase.hpp" namespace geos @@ -331,10 +330,10 @@ struct StateUpdateKernel * @param[out] fractureTraction the fracture traction * @param[out] dFractureTraction_dPressure the derivative of the fracture traction wrt pressure */ - template< typename POLICY, typename POROUS_WRAPPER > + template< typename POLICY, typename POROUS_WRAPPER, typename CONTACT_WRAPPER > static void launch( localIndex const size, - constitutive::ContactBase::KernelWrapper const & contactWrapper, + CONTACT_WRAPPER const & contactWrapper, POROUS_WRAPPER const & porousMaterialWrapper, arrayView2d< real64 const > const & dispJump, arrayView1d< real64 const > const & pressure, @@ -352,16 +351,18 @@ struct StateUpdateKernel // update aperture to be equal to the normal displacement jump aperture[k] = dispJump[k][0]; // the first component of the jump is the normal one. - real64 dHydraulicAperture_dNormalJump = 0; + real64 dHydraulicAperture_dNormalJump = 0.0; + real64 dHydraulicAperture_dNormalTraction = 0.0; hydraulicAperture[k] = contactWrapper.computeHydraulicAperture( aperture[k], - dHydraulicAperture_dNormalJump ); + fractureTraction[k][0], + dHydraulicAperture_dNormalJump, + dHydraulicAperture_dNormalTraction ); deltaVolume[k] = hydraulicAperture[k] * area[k] - volume[k]; // traction on the fracture to include the pressure contribution - contactWrapper.addPressureToTraction( pressure[k], - fractureTraction[k], - dFractureTraction_dPressure[k] ); + fractureTraction[k][0] -= pressure[k]; + dFractureTraction_dPressure[k] = -1.0; real64 const jump[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3 ( dispJump[k] ); real64 const traction[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3 ( fractureTraction[k] ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp index 58b6ab6d141..82bfd7a76b6 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp @@ -35,7 +35,7 @@ struct StateUpdateKernel /** * @brief Launch the kernel function doing volume, aperture and fracture traction updates * @tparam POLICY the type of policy used in the kernel launch - * @tparam CONTACT_WRAPPER the type of contact wrapper doing the fracture traction updates + * @tparam HYDRAULIC_APERTURE_WRAPPER the type of hydraulic aperture model wrapper doing the fracture traction updates * @param[in] size the size of the subregion * @param[in] contactWrapper the wrapper implementing the contact relationship * @param[in] dispJump the displacement jump @@ -48,11 +48,11 @@ struct StateUpdateKernel * @param[out] hydraulicAperture the effecture aperture * @param[in] fractureTraction the fracture traction */ - template< typename POLICY, typename POROUS_WRAPPER, typename CONTACT_WRAPPER > + template< typename POLICY, typename POROUS_WRAPPER, typename HYDRAULIC_APERTURE_WRAPPER > static void launch( localIndex const size, POROUS_WRAPPER const & porousMaterialWrapper, - CONTACT_WRAPPER const & contactWrapper, + HYDRAULIC_APERTURE_WRAPPER const & contactWrapper, arrayView2d< real64 const > const & dispJump, arrayView1d< real64 const > const & pressure, arrayView1d< real64 const > const & area, @@ -70,7 +70,11 @@ struct StateUpdateKernel aperture[k] = dispJump[k][0]; // the first component of the jump is the normal one. real64 dHydraulicAperture_dNormalJump = 0.0; - hydraulicAperture[k] = contactWrapper.computeHydraulicAperture( aperture[k], dHydraulicAperture_dNormalJump ); + real64 dHydraulicAperture_dNormalTraction = 0.0; + hydraulicAperture[k] = contactWrapper.computeHydraulicAperture( aperture[k], + fractureTraction[k][0], + dHydraulicAperture_dNormalJump, + dHydraulicAperture_dNormalTraction ); deltaVolume[k] = hydraulicAperture[k] * area[k] - volume[k]; @@ -78,9 +82,11 @@ struct StateUpdateKernel real64 const traction[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3 ( fractureTraction[k] ); porousMaterialWrapper.updateStateFromPressureApertureJumpAndTraction( k, 0, pressure[k], - oldHydraulicAperture[k], hydraulicAperture[k], + oldHydraulicAperture[k], + hydraulicAperture[k], dHydraulicAperture_dNormalJump, - jump, traction ); + jump, + traction ); } ); } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 23477cbf51c..70756a953d7 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -28,7 +28,6 @@ #include "codingUtilities/Utilities.hpp" #include "constitutive/ConstitutiveManager.hpp" -#include "constitutive/contact/ContactBase.hpp" #include "common/GEOS_RAJA_Interface.hpp" #include "discretizationMethods/NumericalMethodsManager.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" @@ -117,6 +116,11 @@ SolidMechanicsLagrangianFEM::SolidMechanicsLagrangianFEM( const string & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Name of contact relation to enforce constraints on fracture boundary." ); + registerWrapper( viewKeyStruct::contactPenaltyStiffnessString(), &m_contactPenaltyStiffness ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 0.0 ). + setDescription( "Value of the penetration penalty stiffness. Units of Pressure/length" ); + registerWrapper( viewKeyStruct::maxForceString(), &m_maxForce ). setInputFlag( InputFlags::FALSE ). setDescription( "The maximum force contribution in the problem domain." ); @@ -1378,9 +1382,7 @@ void SolidMechanicsLagrangianFEM::applyContactConstraint( DofManager const & dof elemManager.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) { - ContactBase const & contact = getConstitutiveModel< ContactBase >( subRegion, m_contactRelationName ); - - real64 const contactStiffness = contact.stiffness(); + real64 const contactStiffness = m_contactPenaltyStiffness; arrayView1d< real64 > const area = subRegion.getElementArea(); ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index 9deae4f3272..9417db2282f 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -251,6 +251,9 @@ class SolidMechanicsLagrangianFEM : public SolverBase static constexpr char const * nonSendOrReceiveNodesString() { return "nonSendOrReceiveNodes";} static constexpr char const * targetNodesString() { return "targetNodes";} static constexpr char const * forceString() { return "Force";} + + static constexpr char const * contactPenaltyStiffnessString() { return "contactPenaltyStiffness"; } + }; SortedArray< localIndex > & getElemsAttachedToSendOrReceiveNodes( ElementSubRegionBase & subRegion ) @@ -297,6 +300,8 @@ class SolidMechanicsLagrangianFEM : public SolverBase /// Rigid body modes array1d< ParallelVector > m_rigidBodyModes; + real64 m_contactPenaltyStiffness; + private: string m_contactRelationName; diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp index 08640b56332..16e8377c0f1 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp @@ -29,7 +29,7 @@ #include "codingUtilities/Utilities.hpp" #include "common/TimingMacros.hpp" #include "constitutive/ConstitutiveManager.hpp" -#include "constitutive/contact/ContactBase.hpp" +#include "constitutive/contact/FrictionBase.hpp" #include "finiteElement/FiniteElementDiscretizationManager.hpp" #include "finiteElement/Kinematics.h" #include "LvArray/src/output.hpp" diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp index 495872c8038..05f39528d30 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp @@ -85,7 +85,7 @@ struct StateUpdateKernel /** * @brief Launch the kernel function doing constitutive updates * @tparam POLICY the type of policy used in the kernel launch - * @tparam CONTACT_WRAPPER the type of contact wrapper doing the constitutive updates + * @tparam CONSTITUTIVE_WRAPPER the type of consitutive wrapper doing the constitutive updates * @param[in] size the size of the subregion * @param[in] constitutiveWrapper the wrapper implementing the constitutive model * @param[in] deformationGradient the deformation gradient diff --git a/src/coreComponents/schema/docs/Constitutive.rst b/src/coreComponents/schema/docs/Constitutive.rst index 09b1aadeaff..c62cb08d281 100644 --- a/src/coreComponents/schema/docs/Constitutive.rst +++ b/src/coreComponents/schema/docs/Constitutive.rst @@ -42,6 +42,7 @@ ElasticTransverseIsotropic node :ref:`XML_ElasticTran ExponentialDecayPermeability node :ref:`XML_ExponentialDecayPermeability` ExtendedDruckerPrager node :ref:`XML_ExtendedDruckerPrager` FrictionlessContact node :ref:`XML_FrictionlessContact` +HydraulicApertureTable node :ref:`XML_HydraulicApertureTable` JFunctionCapillaryPressure node :ref:`XML_JFunctionCapillaryPressure` LinearIsotropicDispersion node :ref:`XML_LinearIsotropicDispersion` ModifiedCamClay node :ref:`XML_ModifiedCamClay` diff --git a/src/coreComponents/schema/docs/Constitutive_other.rst b/src/coreComponents/schema/docs/Constitutive_other.rst index d95527f1483..1195cddf026 100644 --- a/src/coreComponents/schema/docs/Constitutive_other.rst +++ b/src/coreComponents/schema/docs/Constitutive_other.rst @@ -42,6 +42,7 @@ ElasticTransverseIsotropic node :ref:`DATASTRUCTURE_ElasticTr ExponentialDecayPermeability node :ref:`DATASTRUCTURE_ExponentialDecayPermeability` ExtendedDruckerPrager node :ref:`DATASTRUCTURE_ExtendedDruckerPrager` FrictionlessContact node :ref:`DATASTRUCTURE_FrictionlessContact` +HydraulicApertureTable node :ref:`DATASTRUCTURE_HydraulicApertureTable` JFunctionCapillaryPressure node :ref:`DATASTRUCTURE_JFunctionCapillaryPressure` LinearIsotropicDispersion node :ref:`DATASTRUCTURE_LinearIsotropicDispersion` ModifiedCamClay node :ref:`DATASTRUCTURE_ModifiedCamClay` diff --git a/src/coreComponents/schema/docs/Coulomb.rst b/src/coreComponents/schema/docs/Coulomb.rst index 7b1a581e860..2cbf7fdeffc 100644 --- a/src/coreComponents/schema/docs/Coulomb.rst +++ b/src/coreComponents/schema/docs/Coulomb.rst @@ -1,16 +1,13 @@ -========================= ============ =========== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= -Name Type Default Description -========================= ============ =========== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= -apertureTableName groupNameRef required Name of the aperture table -apertureTolerance real64 1e-09 Value to be used to avoid floating point errors in expressions involving aperture. For example in the case of dividing by the actual aperture (not the effective aperture that results from the aperture function) this value may be used to avoid the 1/0 error. Note that this value may have some physical significance in its usage, as it may be used to smooth out highly nonlinear behavior associated with 1/0 in addition to avoiding the 1/0 error. -cohesion real64 required Cohesion -displacementJumpThreshold real64 2.22045e-16 A threshold valued to determine whether a fracture is open or not. -frictionCoefficient real64 required Friction coefficient -name groupName required A name is required for any non-unique nodes -penaltyStiffness real64 0 Value of the penetration penalty stiffness. Units of Pressure/length -shearStiffness real64 0 Value of the shear elastic stiffness. Units of Pressure/length -========================= ============ =========== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= +========================= ========= =========== ================================================================== +Name Type Default Description +========================= ========= =========== ================================================================== +cohesion real64 required Cohesion +displacementJumpThreshold real64 2.22045e-16 A threshold valued to determine whether a fracture is open or not. +frictionCoefficient real64 required Friction coefficient +name groupName required A name is required for any non-unique nodes +shearStiffness real64 0 Value of the shear elastic stiffness. Units of Pressure/length +========================= ========= =========== ================================================================== diff --git a/src/coreComponents/schema/docs/FrictionlessContact.rst b/src/coreComponents/schema/docs/FrictionlessContact.rst index 385d3738b2a..e150b24c06a 100644 --- a/src/coreComponents/schema/docs/FrictionlessContact.rst +++ b/src/coreComponents/schema/docs/FrictionlessContact.rst @@ -1,14 +1,10 @@ -========================= ============ =========== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= -Name Type Default Description -========================= ============ =========== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= -apertureTableName groupNameRef required Name of the aperture table -apertureTolerance real64 1e-09 Value to be used to avoid floating point errors in expressions involving aperture. For example in the case of dividing by the actual aperture (not the effective aperture that results from the aperture function) this value may be used to avoid the 1/0 error. Note that this value may have some physical significance in its usage, as it may be used to smooth out highly nonlinear behavior associated with 1/0 in addition to avoiding the 1/0 error. -displacementJumpThreshold real64 2.22045e-16 A threshold valued to determine whether a fracture is open or not. -name groupName required A name is required for any non-unique nodes -penaltyStiffness real64 0 Value of the penetration penalty stiffness. Units of Pressure/length -shearStiffness real64 0 Value of the shear elastic stiffness. Units of Pressure/length -========================= ============ =========== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= +========================= ========= =========== ================================================================== +Name Type Default Description +========================= ========= =========== ================================================================== +displacementJumpThreshold real64 2.22045e-16 A threshold valued to determine whether a fracture is open or not. +name groupName required A name is required for any non-unique nodes +========================= ========= =========== ================================================================== diff --git a/src/coreComponents/schema/docs/Hydrofracture.rst b/src/coreComponents/schema/docs/Hydrofracture.rst index 896a5cb77b0..d36978900e6 100644 --- a/src/coreComponents/schema/docs/Hydrofracture.rst +++ b/src/coreComponents/schema/docs/Hydrofracture.rst @@ -4,7 +4,6 @@ Name Type Default Description ===================================== =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contactRelationName groupNameRef required Name of contact relation to enforce constraints on fracture boundary. flowSolverName groupNameRef required Name of the flow solver used by the coupled solver initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. isLaggingFractureStencilWeightsUpdate integer 0 Flag to determine whether or not to apply lagging update for the fracture stencil weights. diff --git a/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst b/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst index 9b736b1b4d6..4ea2de12d3a 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst @@ -4,6 +4,7 @@ Name Type Default Description ========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +contactPenaltyStiffness real64 0 Value of the penetration penalty stiffness. Units of Pressure/length discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. logLevel integer 0 Log level diff --git a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst b/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst index eca5d02f2ed..f1eeeefdbf1 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst @@ -4,6 +4,7 @@ Name Type Default Description ========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +contactPenaltyStiffness real64 required Value of the penetration penalty stiffness. Units of Pressure/length discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. logLevel integer 0 Log level diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst index ea949482327..e801acd20e0 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst @@ -4,6 +4,7 @@ Name Type Default Description =============================== ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +contactPenaltyStiffness real64 0 Value of the penetration penalty stiffness. Units of Pressure/length discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. logLevel integer 0 Log level diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst index bed0562d496..1bccbf3c052 100644 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst +++ b/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst @@ -4,6 +4,7 @@ Name Type Default Description ========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +contactPenaltyStiffness real64 0 Value of the penetration penalty stiffness. Units of Pressure/length contactRelationName groupNameRef NOCONTACT Name of contact relation to enforce constraints on fracture boundary. discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. diff --git a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst b/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst index bed0562d496..1bccbf3c052 100644 --- a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst +++ b/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst @@ -4,6 +4,7 @@ Name Type Default Description ========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] +contactPenaltyStiffness real64 0 Value of the penetration penalty stiffness. Units of Pressure/length contactRelationName groupNameRef NOCONTACT Name of contact relation to enforce constraints on fracture boundary. discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index d02adab186c..2fe20af996e 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -701,6 +701,10 @@ + + + + @@ -2919,8 +2923,6 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - - @@ -3568,6 +3570,8 @@ Local- Add jump stabilization on interior of macro elements--> + + @@ -3612,6 +3616,8 @@ Local- Add jump stabilization on interior of macro elements--> + + @@ -3653,6 +3659,8 @@ Local- Add jump stabilization on interior of macro elements--> + + @@ -3696,6 +3704,8 @@ Local- Add jump stabilization on interior of macro elements--> + + @@ -3739,6 +3749,8 @@ Local- Add jump stabilization on interior of macro elements--> + + @@ -4180,6 +4192,7 @@ Local- Add jump stabilization on interior of macro elements--> + @@ -4671,18 +4684,12 @@ The expected format is "{ waterMax, oilMax }", in that order--> - - - - - - @@ -5005,16 +5012,18 @@ For instance, if "oil" is before "gas" in "phaseNames", the table order should b + + + + + + - - - - - - + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 73552a29993..fac7e939187 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1449,6 +1449,7 @@ + @@ -2335,6 +2336,7 @@ + diff --git a/src/docs/sphinx/CompleteXMLSchema.rst b/src/docs/sphinx/CompleteXMLSchema.rst index 93fd92c0af4..92595791056 100644 --- a/src/docs/sphinx/CompleteXMLSchema.rst +++ b/src/docs/sphinx/CompleteXMLSchema.rst @@ -563,6 +563,13 @@ Element: HybridMimeticDiscretization .. include:: ../../coreComponents/schema/docs/HybridMimeticDiscretization.rst +.. _XML_HydraulicApertureTable: + +Element: HydraulicApertureTable +=============================== +.. include:: ../../coreComponents/schema/docs/HydraulicApertureTable.rst + + .. _XML_Hydrofracture: Element: Hydrofracture @@ -2037,6 +2044,13 @@ Datastructure: HybridMimeticDiscretization .. include:: ../../coreComponents/schema/docs/HybridMimeticDiscretization_other.rst +.. _DATASTRUCTURE_HydraulicApertureTable: + +Datastructure: HydraulicApertureTable +===================================== +.. include:: ../../coreComponents/schema/docs/HydraulicApertureTable_other.rst + + .. _DATASTRUCTURE_Hydrofracture: Datastructure: Hydrofracture diff --git a/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst b/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst index 00bf5cd0a90..38c122242b0 100644 --- a/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst +++ b/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst @@ -117,7 +117,7 @@ when ``applyBoundaryConditions()`` is called in this particular class override. Browsing the base class ``SolverBase``, it can be noted that most of the solver interface functions are called during either ``SolverBase::linearImplicitStep()`` or ``SolverBase::nonlinearImplicitStep()`` depending on the solver strategy chosen. -Switching to protected members, ``postProcessInput()`` is a central member function and +Switching to protected members, ``postInputInitialization()`` is a central member function and will be called by ``Group`` object after input is read from XML entry file. It will set and dispatch solver variables from the base class ``SolverBase`` to the most derived class. For ``LaplaceFEM``, it will allow us to set the right time integration scheme based on the XML value @@ -202,7 +202,7 @@ to writing our new *LaplaceDiffFEM* solver. .. note:: - We might want to remove final keyword from ``postProcessInput()`` as it will prevent you from overriding it. + We might want to remove final keyword from ``postInputInitialization()`` as it will prevent you from overriding it. Start doing your own Physic solver ================================== @@ -249,7 +249,7 @@ commented afterwards. } laplaceDiffFEMViewKeys; protected: - virtual void postProcessInput() override final; + virtual void postInputInitialization() override final; private: real64 m_diffusion; @@ -268,7 +268,7 @@ Then as mentioned in :ref:`Implementation`, the diffusion coefficient is used wh we will have to override the ``assembleSystem()`` function as detailed below. Moreover, if we want to introduce a new binding between the input XML and the code we will have to work on the three -``struct viewKeyStruct`` , ``postProcessInput()`` and the constructor. +``struct viewKeyStruct`` , ``postInputInitialization()`` and the constructor. Our new solver ``viewKeyStruct`` will have its own structure inheriting from the *LaplaceFEM* one to have the ``timeIntegrationOption`` and ``fieldName`` field. It will also create a ``diffusionCoeff`` field to be bound to the user defined homogeneous coefficient on one hand @@ -293,13 +293,13 @@ an "input uniform diffusion coefficient for the Laplace equation". setDescription("input uniform diffusion coeff for the laplace equation"); } -Another important spot for binding the value of the XML read parameter to our ``m_diffusion`` is in ``postProcessInput()``. +Another important spot for binding the value of the XML read parameter to our ``m_diffusion`` is in ``postInputInitialization()``. .. code-block:: c++ - void LaplaceDiffFEM::postProcessInput() + void LaplaceDiffFEM::postInputInitialization() { - LaplaceFEM::postProcessInput(); + LaplaceFEM::postInputInitialization(); string sDiffCoeff = this->getReference(laplaceDiffFEMViewKeys.diffusionCoeff); this->m_diffusion = std::stof(sDiffCoeff); From e5032697380ca6687bcb51e81883efebbf0dd8c6 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Fri, 9 Aug 2024 16:40:30 -0400 Subject: [PATCH 158/286] Update README.md (#3265) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ee7671ba61e..000d3b45c7d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ [![DOI](https://zenodo.org/badge/131810578.svg)](https://zenodo.org/badge/latestdoi/131810578) [![codecov](https://codecov.io/github/GEOS-DEV/GEOS/graph/badge.svg?token=0VTEHPQG58)](https://codecov.io/github/GEOS-DEV/GEOS) -![CI](https://github.com/GEOS-DEV/GEOS/actions/workflows/ci_tests.yml/badge.svg) +[![CI](https://github.com/GEOS-DEV/GEOS/actions/workflows/ci_tests.yml/badge.svg)](https://github.com/GEOS-DEV/GEOS/actions?query=branch%3Adevelop) [![docs](https://readthedocs.com/projects/geosx-geosx/badge/?version=latest)](https://geosx-geosx.readthedocs-hosted.com/en/latest/) Welcome to the GEOS project! From b4b1a3ad46678dc17df8470d17e652b0139399b6 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Fri, 9 Aug 2024 16:40:44 -0400 Subject: [PATCH 159/286] update LvArray submodule (#3277) --- src/coreComponents/LvArray | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index e7bf1096d57..02ce362c009 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit e7bf1096d57558be720f177141c40e4ab69b3f5e +Subproject commit 02ce362c009f11ddb2ade0286df23408d7334c4f From 93b3a72a965fad4cc349674286bafb08761dac86 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Mon, 12 Aug 2024 10:22:42 -1000 Subject: [PATCH 160/286] refactor: Remove "using namespace" in header files (#3255) * remove using namespace dataRepository from headers files * remove using namespace multifluid from NegativeTwoPhaseFlash.hpp * removed using namespace constitutive from headers files * removed using namespace fields from headers files * removed using namespace stabilization from headers files * removed using namespace fluxKernelsHelper from headers files * remove using namespace surfaceGenerationKernelsHelpers from header files --- .../CO2Brine/functions/BrineEnthalpy.hpp | 2 +- .../CO2Brine/functions/CO2Enthalpy.hpp | 2 +- .../CO2Brine/functions/CO2Solubility.hpp | 6 +- .../functions/EzrokhiBrineDensity.hpp | 2 +- .../functions/EzrokhiBrineViscosity.hpp | 2 +- .../functions/FenghourCO2Viscosity.hpp | 2 +- .../functions/PhillipsBrineDensity.hpp | 2 +- .../functions/PhillipsBrineViscosity.hpp | 2 +- .../functions/SpanWagnerCO2Density.hpp | 2 +- .../CO2Brine/functions/WaterDensity.hpp | 2 +- .../fluid/multifluid/MultiFluidBase.hpp | 182 +++++++++--------- .../fluid/multifluid/MultiFluidSelector.hpp | 6 +- .../multifluid/blackOil/BlackOilFluid.hpp | 14 +- .../multifluid/blackOil/DeadOilFluid.hpp | 6 +- ...CompositionalMultiphaseFluidPVTPackage.hpp | 2 +- .../CompositionalMultiphaseFluidUpdates.hpp | 2 +- .../functions/NegativeTwoPhaseFlash.hpp | 5 +- .../models/LohrenzBrayClarkViscosityImpl.hpp | 8 +- .../models/NegativeTwoPhaseFlashModel.hpp | 4 +- .../reactive/ReactiveFluidDriver.hpp | 5 +- .../reactive/ReactiveMultiFluid.hpp | 8 +- .../BrooksCoreyBakerRelativePermeability.hpp | 18 +- .../BrooksCoreyRelativePermeability.hpp | 18 +- .../BrooksCoreyStone2RelativePermeability.hpp | 18 +- .../RelativePermeabilityBase.hpp | 28 +-- .../RelativePermeabilityInterpolators.hpp | 4 +- .../RelativePermeabilitySelector.hpp | 4 +- .../RelpermDriverRunTest.hpp | 15 +- .../TableRelativePermeability.hpp | 34 ++-- .../TableRelativePermeabilityHysteresis.hpp | 50 ++--- .../VanGenuchtenBakerRelativePermeability.hpp | 18 +- ...VanGenuchtenStone2RelativePermeability.hpp | 18 +- .../constitutive/solid/DamageSpectral.hpp | 2 - .../constitutive/solid/TriaxialDriver.hpp | 2 - .../AquiferBoundaryCondition.hpp | 2 +- .../EquilibriumInitialCondition.hpp | 2 +- .../TractionBoundaryCondition.hpp | 2 +- .../fileIO/Outputs/TimeHistoryOutput.cpp | 2 + .../fileIO/timeHistory/HistoryCollection.hpp | 2 - .../fileIO/timeHistory/PackCollection.cpp | 3 + .../mesh/generators/VTKUtilities.cpp | 1 + .../mesh/generators/VTKUtilities.hpp | 9 +- .../SolidMechanicsALMBubbleKernels.hpp | 2 +- .../SolidMechanicsEmbeddedFractures.hpp | 1 - ...ompositionalMultiphaseHybridFVMKernels.cpp | 1 + ...ompositionalMultiphaseHybridFVMKernels.hpp | 97 +++++----- ...ationCompositionalMultiphaseFVMKernels.hpp | 6 +- ...rmalCompositionalMultiphaseBaseKernels.hpp | 170 ++++++++-------- ...ermalCompositionalMultiphaseFVMKernels.cpp | 1 + ...ermalCompositionalMultiphaseFVMKernels.hpp | 172 ++++++++--------- ...ctiveCompositionalMultiphaseOBLKernels.hpp | 4 +- .../fluidFlow/SinglePhaseBase.hpp | 2 +- .../fluidFlow/SinglePhaseFVMKernels.hpp | 13 +- ...lizedCompositionalMultiphaseFVMKernels.hpp | 13 +- .../StabilizedSinglePhaseFVMKernels.hpp | 4 +- ...rmalCompositionalMultiphaseBaseKernels.hpp | 58 +++--- ...ermalCompositionalMultiphaseFVMKernels.hpp | 60 +++--- .../ThermalSinglePhaseFVMKernels.hpp | 12 +- .../ProppantTransportKernels.hpp | 14 +- .../CompositionalMultiphaseWellKernels.cpp | 1 + .../CompositionalMultiphaseWellKernels.hpp | 94 +++++---- .../multiphysics/PoromechanicsSolver.hpp | 24 +-- .../multiphysics/SinglePhasePoromechanics.cpp | 1 + ...ePhasePoromechanicsConformingFractures.hpp | 35 ++-- ...glePhasePoromechanicsEmbeddedFractures.hpp | 35 ++-- ...ePhasePoromechanicsConformingFractures.hpp | 49 +++-- ...glePhasePoromechanicsEmbeddedFractures.hpp | 49 +++-- .../kernels/surfaceGenerationKernels.hpp | 10 +- .../AcousticVTIWaveEquationSEMKernel.hpp | 15 +- .../isotropic/AcousticWaveEquationSEM.cpp | 6 +- .../AcousticWaveEquationSEMKernel.hpp | 8 +- .../ElasticVTIWaveEquationSEMKernel.hpp | 26 +-- .../ElasticWaveEquationSEMKernel.hpp | 32 +-- .../constitutiveTests/MultiFluidTest.hpp | 75 ++++---- .../testMultiFluidCO2Brine.cpp | 1 + ...FluidCompositionalMultiphasePVTPackage.cpp | 1 + .../testMultiFluidDeadOil.cpp | 1 + .../testMultiFluidLiveOil.cpp | 1 + .../fluidFlowTests/testCompFlowUtils.hpp | 13 +- .../fluidFlowTests/testSingleFlowUtils.hpp | 2 - 80 files changed, 785 insertions(+), 842 deletions(-) diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp index cc0978206c0..b29592473a1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp @@ -144,7 +144,7 @@ void BrineEnthalpyUpdate::compute( real64 const & pressure, arraySlice1d< real64, USD3 > const & dValue, bool useMass ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; real64 const input[2] = { pressure, temperature }; real64 brineEnthalpy_dTemperature = 0.0; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp index 41aaa3ea1d5..6f00ccc7a53 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp @@ -131,7 +131,7 @@ void CO2EnthalpyUpdate::compute( real64 const & pressure, { GEOS_UNUSED_VAR( phaseComposition, dPhaseComposition ); - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; real64 const input[2] = { pressure, temperature }; real64 CO2EnthalpyDeriv[2]{}; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp index d69edc81041..269528420fc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp @@ -42,8 +42,8 @@ class CO2SolubilityUpdate final : public FlashModelBaseUpdate { public: - using PhaseProp = MultiFluidVar< real64, 3, multifluid::LAYOUT_PHASE, multifluid::LAYOUT_PHASE_DC >; - using PhaseComp = MultiFluidVar< real64, 4, multifluid::LAYOUT_PHASE_COMP, multifluid::LAYOUT_PHASE_COMP_DC >; + using PhaseProp = MultiFluidVar< real64, 3, constitutive::multifluid::LAYOUT_PHASE, constitutive::multifluid::LAYOUT_PHASE_DC >; + using PhaseComp = MultiFluidVar< real64, 4, constitutive::multifluid::LAYOUT_PHASE_COMP, constitutive::multifluid::LAYOUT_PHASE_COMP_DC >; CO2SolubilityUpdate( arrayView1d< real64 const > const & componentMolarWeight, TableFunction const & CO2SolubilityTable, @@ -167,7 +167,7 @@ CO2SolubilityUpdate::compute( real64 const & pressure, PhaseProp::SliceType const phaseFraction, PhaseComp::SliceType const phaseCompFraction ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // Solubility of CO2 is read from the tables in the form of moles of CO2 per kg of water // Solubility of water is read from the tables in the form of moles of water per kg of CO2 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp index 17a084355c2..892baf5751f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp @@ -173,7 +173,7 @@ void EzrokhiBrineDensityUpdate::compute( real64 const & pressure, bool useMass ) const { constexpr integer numDof = 4; - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; real64 waterSatDensity_dTemperature = 0.0; real64 waterSatPressure_dTemperature = 0.0; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp index 6a8c66be0c3..19db851b67f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp @@ -158,7 +158,7 @@ void EzrokhiBrineViscosityUpdate::compute( real64 const & pressure, { GEOS_UNUSED_VAR( pressure, useMass ); - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; real64 waterVisc_dTemperature = 0.0; real64 const waterVisc = m_waterViscosityTable.compute( &temperature, &waterVisc_dTemperature ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp index 3f9dd756f00..23803a777f9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp @@ -125,7 +125,7 @@ void FenghourCO2ViscosityUpdate::compute( real64 const & pressure, dPhaseComposition, useMass ); - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; real64 const input[2] = { pressure, temperature }; real64 densityDeriv[2]{}; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp index 8d5dbe22103..9033b586fa7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp @@ -136,7 +136,7 @@ void PhillipsBrineDensityUpdate::compute( real64 const & pressure, arraySlice1d< real64, USD3 > const & dValue, bool useMass ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // this method implements the method proposed by E. Garcia (2001) diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp index 14dd9c2c65c..e3776fe90cc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp @@ -140,7 +140,7 @@ void PhillipsBrineViscosityUpdate::compute( real64 const & pressure, dPhaseComposition, useMass ); - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // compute the viscosity of pure water as a function of temperature real64 dPureWaterVisc_dTemperature; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp index e68d2ea01d2..c706cd95264 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp @@ -135,7 +135,7 @@ void SpanWagnerCO2DensityUpdate::compute( real64 const & pressure, { GEOS_UNUSED_VAR( phaseComposition, dPhaseComposition ); - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; real64 const input[2] = { pressure, temperature }; real64 densityDeriv[2]{}; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp index 96e1eecf0e0..ad3e8dd5c11 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp @@ -118,7 +118,7 @@ void WaterDensityUpdate::compute( real64 const & pressure, { GEOS_UNUSED_VAR( phaseComposition, dPhaseComposition, useMass ); - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; real64 const input[2] = { pressure, temperature }; real64 densityDeriv[2]{}; diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp index 825fac729af..b7b9a387b94 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp @@ -128,67 +128,67 @@ class MultiFluidBase : public ConstitutiveBase */ void setMassFlag( bool const flag ) { m_useMass = flag; } - arrayView3d< real64 const, multifluid::USD_PHASE > phaseFraction() const + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseFraction() const { return m_phaseFraction.value; } - arrayView4d< real64 const, multifluid::USD_PHASE_DC > dPhaseFraction() const + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > dPhaseFraction() const { return m_phaseFraction.derivs; } - arrayView3d< real64 const, multifluid::USD_PHASE > phaseDensity() const + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseDensity() const { return m_phaseDensity.value; } - arrayView3d< real64 const, multifluid::USD_PHASE > phaseDensity_n() const + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseDensity_n() const { return m_phaseDensity_n; } - arrayView4d< real64 const, multifluid::USD_PHASE_DC > dPhaseDensity() const + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > dPhaseDensity() const { return m_phaseDensity.derivs; } - arrayView3d< real64 const, multifluid::USD_PHASE > phaseMassDensity() const + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseMassDensity() const { return m_phaseMassDensity.value; } - arrayView4d< real64 const, multifluid::USD_PHASE_DC > dPhaseMassDensity() const + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > dPhaseMassDensity() const { return m_phaseMassDensity.derivs; } - arrayView3d< real64 const, multifluid::USD_PHASE > phaseViscosity() const + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseViscosity() const { return m_phaseViscosity.value; } - arrayView4d< real64 const, multifluid::USD_PHASE_DC > dPhaseViscosity() const + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > dPhaseViscosity() const { return m_phaseViscosity.derivs; } - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > phaseCompFraction() const + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > phaseCompFraction() const { return m_phaseCompFraction.value; } - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > phaseCompFraction_n() const + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > phaseCompFraction_n() const { return m_phaseCompFraction_n; } - arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > dPhaseCompFraction() const + arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > dPhaseCompFraction() const { return m_phaseCompFraction.derivs; } - arrayView2d< real64 const, multifluid::USD_FLUID > totalDensity() const + arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > totalDensity() const { return m_totalDensity.value; } - arrayView2d< real64 const, multifluid::USD_FLUID > totalDensity_n() const + arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > totalDensity_n() const { return m_totalDensity_n; } - arrayView3d< real64 const, multifluid::USD_FLUID_DC > dTotalDensity() const + arrayView3d< real64 const, constitutive::multifluid::USD_FLUID_DC > dTotalDensity() const { return m_totalDensity.derivs; } - arrayView3d< real64 const, multifluid::USD_PHASE > phaseEnthalpy() const + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseEnthalpy() const { return m_phaseEnthalpy.value; } - arrayView3d< real64 const, multifluid::USD_PHASE > phaseEnthalpy_n() const + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseEnthalpy_n() const { return m_phaseEnthalpy_n; } - arrayView4d< real64 const, multifluid::USD_PHASE_DC > dPhaseEnthalpy() const + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > dPhaseEnthalpy() const { return m_phaseEnthalpy.derivs; } - arrayView3d< real64 const, multifluid::USD_PHASE > phaseInternalEnergy() const + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseInternalEnergy() const { return m_phaseInternalEnergy.value; } - arrayView3d< real64 const, multifluid::USD_PHASE > phaseInternalEnergy_n() const + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseInternalEnergy_n() const { return m_phaseInternalEnergy_n; } - arrayView4d< real64 const, multifluid::USD_PHASE_DC > dPhaseInternalEnergy() const + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > dPhaseInternalEnergy() const { return m_phaseInternalEnergy.derivs; } /** @@ -222,9 +222,9 @@ class MultiFluidBase : public ConstitutiveBase public: - using PhaseProp = MultiFluidVar< real64, 3, multifluid::LAYOUT_PHASE, multifluid::LAYOUT_PHASE_DC >; - using PhaseComp = MultiFluidVar< real64, 4, multifluid::LAYOUT_PHASE_COMP, multifluid::LAYOUT_PHASE_COMP_DC >; - using FluidProp = MultiFluidVar< real64, 2, multifluid::LAYOUT_FLUID, multifluid::LAYOUT_FLUID_DC >; + using PhaseProp = MultiFluidVar< real64, 3, constitutive::multifluid::LAYOUT_PHASE, constitutive::multifluid::LAYOUT_PHASE_DC >; + using PhaseComp = MultiFluidVar< real64, 4, constitutive::multifluid::LAYOUT_PHASE_COMP, constitutive::multifluid::LAYOUT_PHASE_COMP_DC >; + using FluidProp = MultiFluidVar< real64, 2, constitutive::multifluid::LAYOUT_FLUID, constitutive::multifluid::LAYOUT_FLUID_DC >; public: class KernelWrapper @@ -271,28 +271,28 @@ class MultiFluidBase : public ConstitutiveBase GEOS_FORCE_INLINE integer numPhases() const { return LvArray::integerConversion< integer >( m_phaseFraction.value.size( 2 ) ); } - GEOS_HOST_DEVICE arrayView3d< real64 const, multifluid::USD_PHASE > phaseFraction() const + GEOS_HOST_DEVICE arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseFraction() const { return m_phaseFraction.value; } - GEOS_HOST_DEVICE arrayView3d< real64 const, multifluid::USD_PHASE > phaseDensity() const + GEOS_HOST_DEVICE arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseDensity() const { return m_phaseDensity.value; } - GEOS_HOST_DEVICE arrayView3d< real64 const, multifluid::USD_PHASE > phaseMassDensity() const + GEOS_HOST_DEVICE arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseMassDensity() const { return m_phaseMassDensity.value; } - GEOS_HOST_DEVICE arrayView3d< real64 const, multifluid::USD_PHASE > phaseViscosity() const + GEOS_HOST_DEVICE arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseViscosity() const { return m_phaseViscosity.value; } - GEOS_HOST_DEVICE arrayView4d< real64 const, multifluid::USD_PHASE_COMP > phaseCompFraction() const + GEOS_HOST_DEVICE arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > phaseCompFraction() const { return m_phaseCompFraction.value; } - GEOS_HOST_DEVICE arrayView2d< real64 const, multifluid::USD_FLUID > totalDensity() const + GEOS_HOST_DEVICE arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > totalDensity() const { return m_totalDensity.value; } - GEOS_HOST_DEVICE arrayView3d< real64 const, multifluid::USD_PHASE > phaseEnthalpy() const + GEOS_HOST_DEVICE arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseEnthalpy() const { return m_phaseEnthalpy.value; } - GEOS_HOST_DEVICE arrayView3d< real64 const, multifluid::USD_PHASE > phaseInternalEnergy() const + GEOS_HOST_DEVICE arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > phaseInternalEnergy() const { return m_phaseInternalEnergy.value; } /** @@ -318,13 +318,13 @@ class MultiFluidBase : public ConstitutiveBase real64 const pressure, real64 const temperature, arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & composition, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseFraction, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseDensity, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseMassDensity, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseViscosity, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseEnthalpy, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseInternalEnergy, - arraySlice2d< real64, multifluid::USD_PHASE_COMP-2 > const & phaseCompFraction, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseFraction, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseDensity, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseMassDensity, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseViscosity, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseEnthalpy, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseInternalEnergy, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_COMP-2 > const & phaseCompFraction, real64 & totalDensity ); protected: @@ -404,8 +404,8 @@ class MultiFluidBase : public ConstitutiveBase template< integer maxNumComp, integer maxNumPhase > GEOS_HOST_DEVICE void convertToMassFractions( real64 const (&phaseMolecularWeight)[maxNumPhase], - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseFrac, - arraySlice2d< real64, multifluid::USD_PHASE_COMP - 2 > const phaseCompFrac ) const; + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseFrac, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_COMP - 2 > const phaseCompFrac ) const; /** * @brief Utility function to convert mole fractions to mass fractions and keep derivatives @@ -432,10 +432,10 @@ class MultiFluidBase : public ConstitutiveBase real64 const (&dPhaseMolecularWeight)[maxNumPhase][maxNumComp+2], PhaseProp::SliceType const phaseFrac, PhaseComp::SliceType const phaseCompFrac, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseDens, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseVisc, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseEnthalpy, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseInternalEnergy ) const; + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseVisc, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseEnthalpy, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseInternalEnergy ) const; /** * @brief Utility function to compute the internal energy from pressure, enthalpy, and density @@ -450,10 +450,10 @@ class MultiFluidBase : public ConstitutiveBase template< integer maxNumComp, integer maxNumPhase > GEOS_HOST_DEVICE void computeInternalEnergy( real64 const & pressure, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseFrac, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseMassDens, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseEnthalpy, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseInternalEnergy ) const; + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseFrac, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseMassDens, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseEnthalpy, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseInternalEnergy ) const; /** * @brief Utility function to compute the internal energy from pressure, enthalpy, and density and keep derivatives @@ -480,8 +480,8 @@ class MultiFluidBase : public ConstitutiveBase */ template< integer maxNumComp, integer maxNumPhase > GEOS_HOST_DEVICE - void computeTotalDensity( arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseFrac, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseDens, + void computeTotalDensity( arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseFrac, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseDens, real64 & totalDens ) const; /** @@ -523,7 +523,7 @@ class MultiFluidBase : public ConstitutiveBase real64 totalCompressibility( integer const i, integer const q ) const { real64 const totalFluidDensity = totalDensity()( i, q ); - real64 const dTotalFluidDensity_dP = m_totalDensity.derivs( i, q, multifluid::DerivativeOffset::dP ); + real64 const dTotalFluidDensity_dP = m_totalDensity.derivs( i, q, constitutive::multifluid::DerivativeOffset::dP ); return 0.0 < totalFluidDensity ? dTotalFluidDensity_dP / totalFluidDensity : 0.0; } @@ -600,10 +600,10 @@ class MultiFluidBase : public ConstitutiveBase void computeDerivativesWrtMassFractions( real64 const (&dCompMoleFrac_dCompMassFrac)[maxNumComp][maxNumComp], PhaseProp::SliceType const phaseFrac, PhaseComp::SliceType const phaseCompFrac, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseDens, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseVisc, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseEnthalpy, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseInternalEnergy ) const; + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseVisc, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseEnthalpy, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseInternalEnergy ) const; /** * @brief Main compute function to update properties in a cell with derivatives (used in Newton iterations) @@ -693,11 +693,11 @@ class MultiFluidBase : public ConstitutiveBase // backup data - array3d< real64, multifluid::LAYOUT_PHASE > m_phaseDensity_n; - array3d< real64, multifluid::LAYOUT_PHASE > m_phaseEnthalpy_n; - array3d< real64, multifluid::LAYOUT_PHASE > m_phaseInternalEnergy_n; - array4d< real64, multifluid::LAYOUT_PHASE_COMP > m_phaseCompFraction_n; - array2d< real64, multifluid::LAYOUT_FLUID > m_totalDensity_n; + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > m_phaseDensity_n; + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > m_phaseEnthalpy_n; + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > m_phaseInternalEnergy_n; + array4d< real64, constitutive::multifluid::LAYOUT_PHASE_COMP > m_phaseCompFraction_n; + array2d< real64, constitutive::multifluid::LAYOUT_FLUID > m_totalDensity_n; }; @@ -708,13 +708,13 @@ MultiFluidBase::KernelWrapper::computeValues( FLUIDWRAPPER const fluidWrapper, real64 const pressure, real64 const temperature, arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & composition, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseFraction, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseDensity, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseMassDensity, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseViscosity, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseEnthalpy, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const & phaseInternalEnergy, - arraySlice2d< real64, multifluid::USD_PHASE_COMP-2 > const & phaseCompFraction, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseFraction, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseDensity, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseMassDensity, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseViscosity, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseEnthalpy, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const & phaseInternalEnergy, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_COMP-2 > const & phaseCompFraction, real64 & totalDensity ) { integer constexpr maxNumPhase = MAX_NUM_PHASES; @@ -726,9 +726,9 @@ MultiFluidBase::KernelWrapper::computeValues( FLUIDWRAPPER const fluidWrapper, // Allocate data for derivatives. All properties of the same type will use the same memory // space for the derivatives. The derivatives returned will clearly be garbage but the values // should be correct. - StackArray< real64, 4, maxNumDof * maxNumPhase, multifluid::LAYOUT_PHASE_DC > dPhaseProp( 1, 1, numPhase, numComp+2 ); - StackArray< real64, 5, maxNumDof * maxNumComp * maxNumPhase, multifluid::LAYOUT_PHASE_COMP_DC > dPhaseComp( 1, 1, numPhase, numComp, numComp+2 ); - StackArray< real64, 3, maxNumDof, multifluid::LAYOUT_FLUID_DC > dFluidProp( 1, 1, numComp+2 ); + StackArray< real64, 4, maxNumDof * maxNumPhase, constitutive::multifluid::LAYOUT_PHASE_DC > dPhaseProp( 1, 1, numPhase, numComp+2 ); + StackArray< real64, 5, maxNumDof * maxNumComp * maxNumPhase, constitutive::multifluid::LAYOUT_PHASE_COMP_DC > dPhaseComp( 1, 1, numPhase, numComp, numComp+2 ); + StackArray< real64, 3, maxNumDof, constitutive::multifluid::LAYOUT_FLUID_DC > dFluidProp( 1, 1, numComp+2 ); // Wrap the output in multi variable objects PhaseProp::SliceType phaseFractionWrapper { phaseFraction, dPhaseProp[0][0] }; @@ -808,8 +808,8 @@ GEOS_FORCE_INLINE void MultiFluidBase::KernelWrapper:: convertToMassFractions( real64 const (&phaseMolecularWeight)[maxNumPhase], - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseFrac, - arraySlice2d< real64, multifluid::USD_PHASE_COMP - 2 > const phaseCompFrac ) const + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseFrac, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_COMP - 2 > const phaseCompFrac ) const { using namespace multifluid; @@ -854,10 +854,10 @@ MultiFluidBase::KernelWrapper:: real64 const (&dPhaseMolecularWeight)[maxNumPhase][maxNumComp+2], PhaseProp::SliceType const phaseFrac, PhaseComp::SliceType const phaseCompFrac, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseDens, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseVisc, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseEnthalpy, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseInternalEnergy ) const + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseVisc, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseEnthalpy, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseInternalEnergy ) const { convertToPhaseMassFractions( phaseMolecularWeight, dPhaseMolecularWeight, @@ -884,7 +884,7 @@ MultiFluidBase::KernelWrapper:: real64 const (&dPhaseMolecularWeight)[maxNumPhase][maxNumDof], PhaseProp::SliceType const phaseFrac ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; integer const numPhase = numPhases(); integer const numComp = numComponents(); @@ -939,7 +939,7 @@ MultiFluidBase::KernelWrapper:: PhaseProp::SliceType const phaseFrac, PhaseComp::SliceType const phaseCompFrac ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; integer const numPhase = numPhases(); integer const numComp = numComponents(); @@ -985,12 +985,12 @@ MultiFluidBase::KernelWrapper:: computeDerivativesWrtMassFractions( real64 const (&dCompMoleFrac_dCompMassFrac)[maxNumComp][maxNumComp], PhaseProp::SliceType const phaseFrac, PhaseComp::SliceType const phaseCompFrac, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseDens, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseVisc, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseEnthalpy, - arraySlice2d< real64, multifluid::USD_PHASE_DC - 2 > const dPhaseInternalEnergy ) const + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseVisc, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseEnthalpy, + arraySlice2d< real64, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseInternalEnergy ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; integer const numPhase = numPhases(); integer const numComp = numComponents(); @@ -1017,10 +1017,10 @@ GEOS_FORCE_INLINE void MultiFluidBase::KernelWrapper:: computeInternalEnergy( real64 const & pressure, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseFrac, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseMassDens, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseEnthalpy, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseInternalEnergy ) const + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseFrac, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseMassDens, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseEnthalpy, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseInternalEnergy ) const { using namespace multifluid; @@ -1087,8 +1087,8 @@ template< integer maxNumComp, integer maxNumPhase > GEOS_HOST_DEVICE inline void MultiFluidBase::KernelWrapper:: - computeTotalDensity( arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseFrac, - arraySlice1d< real64, multifluid::USD_PHASE - 2 > const phaseDens, + computeTotalDensity( arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseFrac, + arraySlice1d< real64, constitutive::multifluid::USD_PHASE - 2 > const phaseDens, real64 & totalDens ) const { using namespace multifluid; @@ -1119,7 +1119,7 @@ MultiFluidBase::KernelWrapper:: PhaseProp::SliceType const phaseDensity, FluidProp::SliceType const totalDensity ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; integer const numComp = numComponents(); integer const numPhase = numPhases(); diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index 470720f3617..8391c62965f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -37,7 +37,7 @@ namespace constitutive { template< typename LAMBDA > -void constitutiveUpdatePassThru( MultiFluidBase const & fluid, +void constitutiveUpdatePassThru( constitutive::MultiFluidBase const & fluid, LAMBDA && lambda ) { ConstitutivePassThruHandler< DeadOilFluid, @@ -59,7 +59,7 @@ void constitutiveUpdatePassThru( MultiFluidBase const & fluid, } template< typename LAMBDA > -void constitutiveUpdatePassThru( MultiFluidBase & fluid, +void constitutiveUpdatePassThru( constitutive::MultiFluidBase & fluid, LAMBDA && lambda ) { ConstitutivePassThruHandler< DeadOilFluid, @@ -117,7 +117,7 @@ struct ComponentSelector< camp::idx_seq< Is ... > > } template< bool THERMAL = false, typename LAMBDA = NoOpFunc > -void constitutiveComponentUpdatePassThru( MultiFluidBase & fluidBase, +void constitutiveComponentUpdatePassThru( constitutive::MultiFluidBase & fluidBase, integer const numComps, LAMBDA && lambda ) { diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp index 29ff379ea41..832ea0904e8 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp @@ -142,7 +142,7 @@ class BlackOilFluid : public BlackOilFluidBase void computeDensitiesViscosities( bool const needDerivs, real64 const pressure, real64 const composition[NC_BO], - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const & phaseFrac, + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const & phaseFrac, PhaseProp::SliceType const & phaseDens, PhaseProp::SliceType const & phaseMassDens, PhaseProp::SliceType const & phaseVisc, @@ -253,7 +253,7 @@ class BlackOilFluid : public BlackOilFluidBase real64 const dBo_dPres, real64 const dBo_dComp[HNC_BO], real64 & dens, - arraySlice1d< real64, multifluid::USD_PHASE_DC - 3 > const & dDens ) const; + arraySlice1d< real64, constitutive::multifluid::USD_PHASE_DC - 3 > const & dDens ) const; /// Data needed to update the oil phase properties PVTOData::KernelWrapper m_PVTOView; @@ -415,7 +415,7 @@ BlackOilFluid::KernelWrapper:: PhaseProp::SliceType const & phaseFraction, PhaseComp::SliceType const & phaseCompFraction ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; using PT = BlackOilFluid::PhaseType; integer const ipOil = m_phaseOrder[PT::OIL]; @@ -563,14 +563,14 @@ BlackOilFluid::KernelWrapper:: computeDensitiesViscosities( bool const needDerivs, real64 const pressure, real64 const composition[NC_BO], - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const & phaseFrac, + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const & phaseFrac, PhaseProp::SliceType const & phaseDens, PhaseProp::SliceType const & phaseMassDens, PhaseProp::SliceType const & phaseVisc, real64 phaseMolecularWeight[NP_BO], real64 dPhaseMolecularWeight[NP_BO][NC_BO+2] ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; using PT = BlackOilFluid::PhaseType; integer const ipOil = m_phaseOrder[PT::OIL]; @@ -905,9 +905,9 @@ BlackOilFluid::KernelWrapper:: real64 const dBo_dPres, real64 const dBo_dComp[HNC_BO], real64 & dens, - arraySlice1d< real64, multifluid::USD_PHASE_DC - 3 > const & dDens ) const + arraySlice1d< real64, constitutive::multifluid::USD_PHASE_DC - 3 > const & dDens ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; using PT = BlackOilFluid::PhaseType; real64 const oilDens = (useMass)? m_PVTOView.m_surfaceMassDensity[PT::OIL]: diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp index 361f15aa343..e0405f17f20 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp @@ -161,7 +161,7 @@ DeadOilFluid::KernelWrapper:: computeDensities( real64 const pressure, PhaseProp::SliceType const & phaseMassDens ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; LvArray::forValuesInSlice( phaseMassDens.derivs, []( real64 & val ){ val = 0.0; } ); @@ -207,7 +207,7 @@ DeadOilFluid::KernelWrapper:: computeViscosities( real64 const pressure, PhaseProp::SliceType const & phaseVisc ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; LvArray::forValuesInSlice( phaseVisc.derivs, []( real64 & val ){ val = 0.0; } ); @@ -255,7 +255,7 @@ DeadOilFluid::KernelWrapper:: { GEOS_UNUSED_VAR( temperature, phaseEnthalpy, phaseInternalEnergy ); - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; integer const nComps = numComponents(); integer const nPhases = numPhases(); diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp index 85bb218a6f3..3df983ad857 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp @@ -188,7 +188,7 @@ CompositionalMultiphaseFluidPVTPackage::KernelWrapper:: GEOS_UNUSED_VAR( totalDensity ); #else - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; integer constexpr maxNumComp = MultiFluidBase::MAX_NUM_COMPONENTS; integer constexpr maxNumPhase = MultiFluidBase::MAX_NUM_PHASES; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp index bcf0e5c482e..7b37415f954 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp @@ -421,7 +421,7 @@ convertDerivativesToTotalMoleFraction( integer const numComps, arraySlice1d< real64, USD2 > const & dProperty, arraySlice1d< real64 > const & workSpace ) { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; integer const numDofs = numComps + 2; for( integer kc = 0; kc < numDofs; ++kc ) { diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp index be61c18688d..96b2bdf5de4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -32,15 +32,12 @@ namespace geos namespace constitutive { - -using namespace multifluid; - namespace compositional { struct NegativeTwoPhaseFlash { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; public: /** diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp index 77b624b50a2..cb87558e693 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp @@ -136,7 +136,7 @@ void LohrenzBrayClarkViscosityUpdate::computePhaseDiluteViscosity_HerningZippere real64 & phaseViscosity, arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; GEOS_UNUSED_VAR( temperature ); real64 A = 0.0; @@ -175,7 +175,7 @@ void LohrenzBrayClarkViscosityUpdate::computePhaseDiluteViscosity_Wilke( integer real64 & phaseViscosity, arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; GEOS_UNUSED_VAR( temperature ); // compute the "phi" interaction matrix (and its temperature derivatives) @@ -256,7 +256,7 @@ void LohrenzBrayClarkViscosityUpdate::computePhaseDiluteViscosity_Brokaw( intege real64 & phaseViscosity, arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; GEOS_UNUSED_VAR( temperature ); // Compute the "phi" interaction matrix (constant, as only function of molecular weights) @@ -324,7 +324,7 @@ void LohrenzBrayClarkViscosityUpdate::computePhaseViscosity_LohrenzBrayClark( in real64 & phaseViscosity, arraySlice1d< real64, USD2 > const & dPhaseViscosity ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // Compute phase pseudo properties via Kay's mixing rule real64 phaseCriticalPressure = 0.0; real64 phaseCriticalTemperature = 0.0; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp index 32300637aea..ec5c1423f4d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -42,8 +42,8 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate { public: - using PhaseProp = MultiFluidVar< real64, 3, multifluid::LAYOUT_PHASE, multifluid::LAYOUT_PHASE_DC >; - using PhaseComp = MultiFluidVar< real64, 4, multifluid::LAYOUT_PHASE_COMP, multifluid::LAYOUT_PHASE_COMP_DC >; + using PhaseProp = MultiFluidVar< real64, 3, constitutive::multifluid::LAYOUT_PHASE, constitutive::multifluid::LAYOUT_PHASE_DC >; + using PhaseComp = MultiFluidVar< real64, 4, constitutive::multifluid::LAYOUT_PHASE_COMP, constitutive::multifluid::LAYOUT_PHASE_COMP_DC >; NegativeTwoPhaseFlashModelUpdate( integer const numComponents, integer const liquidIndex, diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp index 5f8ff2f2597..4c36e18cdb1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp @@ -32,8 +32,6 @@ namespace geos { -using namespace constitutive; - /** * @class ReactiveFluidDriver * @@ -114,7 +112,8 @@ class ReactiveFluidDriver : public TaskBase enum columnKeys { TIME, PRES, TEMP }; ///< Enumeration of "input" column keys for readability - static constexpr real64 m_baselineTol = MultiFluidConstants::baselineTolerance; ///< Comparison tolerance for baseline results + static constexpr real64 m_baselineTol = constitutive::MultiFluidConstants::baselineTolerance; ///< Comparison tolerance for baseline + ///< results }; } /* namespace geos */ diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp index 4fd8f6c9fb3..35c629ef71d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp @@ -189,13 +189,13 @@ class ReactiveMultiFluid : public MultiFluidBase std::unique_ptr< chemicalReactions::KineticReactions > m_kineticReactions; - array2d< real64, multifluid::LAYOUT_FLUID > m_primarySpeciesConcentration; + array2d< real64, constitutive::multifluid::LAYOUT_FLUID > m_primarySpeciesConcentration; - array2d< real64, multifluid::LAYOUT_FLUID > m_secondarySpeciesConcentration; + array2d< real64, constitutive::multifluid::LAYOUT_FLUID > m_secondarySpeciesConcentration; - array2d< real64, multifluid::LAYOUT_FLUID > m_primarySpeciesTotalConcentration; + array2d< real64, constitutive::multifluid::LAYOUT_FLUID > m_primarySpeciesTotalConcentration; - array2d< real64, multifluid::LAYOUT_FLUID > m_kineticReactionRates; + array2d< real64, constitutive::multifluid::LAYOUT_FLUID > m_kineticReactionRates; }; inline void diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp index 584dffca25a..210a1f8b9e8 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp @@ -40,9 +40,9 @@ class BrooksCoreyBakerRelativePermeabilityUpdate final : public RelativePermeabi real64 const volFracScale, arrayView1d< integer const > const & phaseTypes, arrayView1d< integer const > const & phaseOrder, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseRelPerm, - arrayView4d< real64, relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseTrappedVolFrac ) + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseRelPerm, + arrayView4d< real64, constitutive::relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseTrappedVolFrac ) : RelativePermeabilityBaseUpdate( phaseTypes, phaseOrder, phaseRelPerm, @@ -58,9 +58,9 @@ class BrooksCoreyBakerRelativePermeabilityUpdate final : public RelativePermeabi GEOS_HOST_DEVICE void compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; GEOS_HOST_DEVICE virtual void update( localIndex const k, @@ -164,9 +164,9 @@ GEOS_HOST_DEVICE inline void BrooksCoreyBakerRelativePermeabilityUpdate:: compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const { LvArray::forValuesInSlice( dPhaseRelPerm_dPhaseVolFrac, []( real64 & val ){ val = 0.0; } ); diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp index 38908ea028a..f1b382deeeb 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp @@ -37,9 +37,9 @@ class BrooksCoreyRelativePermeabilityUpdate final : public RelativePermeabilityB real64 const volFracScale, arrayView1d< integer const > const & phaseTypes, arrayView1d< integer const > const & phaseOrder, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseRelPerm, - arrayView4d< real64, relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseTrappedVolFrac ) + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseRelPerm, + arrayView4d< real64, constitutive::relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseTrappedVolFrac ) : RelativePermeabilityBaseUpdate( phaseTypes, phaseOrder, phaseRelPerm, @@ -53,9 +53,9 @@ class BrooksCoreyRelativePermeabilityUpdate final : public RelativePermeabilityB GEOS_HOST_DEVICE void compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; GEOS_HOST_DEVICE virtual void update( localIndex const k, @@ -125,9 +125,9 @@ GEOS_HOST_DEVICE inline void BrooksCoreyRelativePermeabilityUpdate:: compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const { LvArray::forValuesInSlice( dPhaseRelPerm_dPhaseVolFrac, []( real64 & val ){ val = 0.0; } ); diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp index a73d7894d54..6f60e69fcbe 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp @@ -40,9 +40,9 @@ class BrooksCoreyStone2RelativePermeabilityUpdate final : public RelativePermeab real64 const volFracScale, arrayView1d< integer const > const & phaseTypes, arrayView1d< integer const > const & phaseOrder, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseRelPerm, - arrayView4d< real64, relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseTrappedVolFrac ) + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseRelPerm, + arrayView4d< real64, constitutive::relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseTrappedVolFrac ) : RelativePermeabilityBaseUpdate( phaseTypes, phaseOrder, phaseRelPerm, @@ -58,9 +58,9 @@ class BrooksCoreyStone2RelativePermeabilityUpdate final : public RelativePermeab GEOS_HOST_DEVICE void compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; GEOS_HOST_DEVICE virtual void update( localIndex const k, @@ -162,9 +162,9 @@ GEOS_HOST_DEVICE inline void BrooksCoreyStone2RelativePermeabilityUpdate:: compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const { LvArray::forValuesInSlice( dPhaseRelPerm_dPhaseVolFrac, []( real64 & val ){ val = 0.0; } ); diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp index 00f8f9a5be1..86bf7c44e58 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp @@ -58,7 +58,7 @@ class RelativePermeabilityBaseUpdate */ GEOS_HOST_DEVICE - arrayView3d< real64 const, relperm::USD_RELPERM > relperm() const + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > relperm() const { return m_phaseRelPerm; } /** @@ -87,9 +87,9 @@ class RelativePermeabilityBaseUpdate RelativePermeabilityBaseUpdate( arrayView1d< integer const > const & phaseTypes, arrayView1d< integer const > const & phaseOrder, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseRelPerm, - arrayView4d< real64, relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseTrappedVolFrac ) + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseRelPerm, + arrayView4d< real64, constitutive::relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseTrappedVolFrac ) : m_phaseTypes( phaseTypes ), m_phaseOrder( phaseOrder ), m_phaseRelPerm( phaseRelPerm ), @@ -99,10 +99,10 @@ class RelativePermeabilityBaseUpdate arrayView1d< integer const > m_phaseTypes; arrayView1d< integer const > m_phaseOrder; - arrayView3d< real64, relperm::USD_RELPERM > m_phaseRelPerm; - arrayView4d< real64, relperm::USD_RELPERM_DS > m_dPhaseRelPerm_dPhaseVolFrac; + arrayView3d< real64, constitutive::relperm::USD_RELPERM > m_phaseRelPerm; + arrayView4d< real64, constitutive::relperm::USD_RELPERM_DS > m_dPhaseRelPerm_dPhaseVolFrac; - arrayView3d< real64, relperm::USD_RELPERM > m_phaseTrappedVolFrac; + arrayView3d< real64, constitutive::relperm::USD_RELPERM > m_phaseTrappedVolFrac; private: GEOS_HOST_DEVICE @@ -157,10 +157,10 @@ class RelativePermeabilityBase : public ConstitutiveBase arrayView1d< string const > phaseNames() const { return m_phaseNames; } - arrayView3d< real64 const, relperm::USD_RELPERM > phaseTrappedVolFraction() const { return m_phaseTrappedVolFrac; } + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > phaseTrappedVolFraction() const { return m_phaseTrappedVolFrac; } - arrayView3d< real64 const, relperm::USD_RELPERM > phaseRelPerm() const { return m_phaseRelPerm; } - arrayView4d< real64 const, relperm::USD_RELPERM_DS > dPhaseRelPerm_dPhaseVolFraction() const { return m_dPhaseRelPerm_dPhaseVolFrac; } + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > phaseRelPerm() const { return m_phaseRelPerm; } + arrayView4d< real64 const, constitutive::relperm::USD_RELPERM_DS > dPhaseRelPerm_dPhaseVolFraction() const { return m_dPhaseRelPerm_dPhaseVolFrac; } arrayView1d< integer const > getPhaseOrder() const { return m_phaseOrder; } virtual arrayView1d< real64 const > getPhaseMinVolumeFraction() const = 0; @@ -213,10 +213,10 @@ class RelativePermeabilityBase : public ConstitutiveBase protected: // output quantities - array3d< real64, relperm::LAYOUT_RELPERM > m_phaseRelPerm; - array3d< real64, relperm::LAYOUT_RELPERM > m_phaseRelPerm_n; - array4d< real64, relperm::LAYOUT_RELPERM_DS > m_dPhaseRelPerm_dPhaseVolFrac; - array3d< real64, relperm::LAYOUT_RELPERM > m_phaseTrappedVolFrac; + array3d< real64, constitutive::relperm::LAYOUT_RELPERM > m_phaseRelPerm; + array3d< real64, constitutive::relperm::LAYOUT_RELPERM > m_phaseRelPerm_n; + array4d< real64, constitutive::relperm::LAYOUT_RELPERM_DS > m_dPhaseRelPerm_dPhaseVolFrac; + array3d< real64, constitutive::relperm::LAYOUT_RELPERM > m_phaseTrappedVolFrac; }; diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp index 2b91a498afb..0b4f49bb9f1 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp @@ -60,7 +60,7 @@ struct Baker real64 const & goRelPerm, real64 const & dGoRelPerm_dOilVolFrac, real64 & threePhaseRelPerm, - arraySlice1d< real64, relperm::USD_RELPERM_DS - 3 > const & dThreePhaseRelPerm_dVolFrac ) + arraySlice1d< real64, constitutive::relperm::USD_RELPERM_DS - 3 > const & dThreePhaseRelPerm_dVolFrac ) { using PT = RelativePermeabilityBase::PhaseType; integer const ipWater = phaseOrder[PT::WATER]; @@ -148,7 +148,7 @@ struct Stone2 real64 const & gRelPerm, real64 const & dGRelPerm_dGasVolFrac, real64 & threePhaseRelPerm, - arraySlice1d< real64, relperm::USD_RELPERM_DS - 3 > const & dThreePhaseRelPerm_dVolFrac ) + arraySlice1d< real64, constitutive::relperm::USD_RELPERM_DS - 3 > const & dThreePhaseRelPerm_dVolFrac ) { using PT = RelativePermeabilityBase::PhaseType; diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp index 4f4f1622661..6329538cda5 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp @@ -51,7 +51,7 @@ void constitutiveUpdatePassThru( RelativePermeabilityBase const & relPerm, BrooksCoreyBakerRelativePermeability, BrooksCoreyStone2RelativePermeability, TableRelativePermeability, - TableRelativePermeabilityHysteresis, + constitutive::TableRelativePermeabilityHysteresis, VanGenuchtenBakerRelativePermeability, VanGenuchtenStone2RelativePermeability >::execute( relPerm, std::forward< LAMBDA >( lambda ) ); } @@ -64,7 +64,7 @@ void constitutiveUpdatePassThru( RelativePermeabilityBase & relPerm, BrooksCoreyBakerRelativePermeability, BrooksCoreyStone2RelativePermeability, TableRelativePermeability, - TableRelativePermeabilityHysteresis, + constitutive::TableRelativePermeabilityHysteresis, VanGenuchtenBakerRelativePermeability, VanGenuchtenStone2RelativePermeability >::execute( relPerm, std::forward< LAMBDA >( lambda ) ); } diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverRunTest.hpp b/src/coreComponents/constitutive/relativePermeability/RelpermDriverRunTest.hpp index a6fe4f06212..f361beaf00c 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverRunTest.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelpermDriverRunTest.hpp @@ -24,11 +24,10 @@ namespace geos { -using namespace constitutive; - //specific to Hysteresis template< typename RELPERM_TYPE > -std::enable_if_t< std::is_same< TableRelativePermeabilityHysteresis, RELPERM_TYPE >::value, void > +std::enable_if_t< std::is_same< constitutive::TableRelativePermeabilityHysteresis, + RELPERM_TYPE >::value, void > RelpermDriver::runTest( RELPERM_TYPE & relperm, const arrayView2d< real64 > & table ) { @@ -37,7 +36,7 @@ RelpermDriver::runTest( RELPERM_TYPE & relperm, // create kernel wrapper - typename TableRelativePermeabilityHysteresis::KernelWrapper const kernelWrapper = relperm.createKernelWrapper(); + typename constitutive::TableRelativePermeabilityHysteresis::KernelWrapper const kernelWrapper = relperm.createKernelWrapper(); // set saturation to user specified feed // it is more convenient to provide input in molar, so perform molar to mass conversion here @@ -91,15 +90,15 @@ RelpermDriver::runTest( RELPERM_TYPE & relperm, arrayView2d< real64 const, compflow::USD_PHASE > const saturation = saturationValues.toViewConst(); - auto const & phaseHasHysteresis = relperm.template getReference< array1d< integer > >( TableRelativePermeabilityHysteresis::viewKeyStruct::phaseHasHysteresisString()); + auto const & phaseHasHysteresis = relperm.template getReference< array1d< integer > >( constitutive::TableRelativePermeabilityHysteresis::viewKeyStruct::phaseHasHysteresisString()); arrayView2d< real64, compflow::USD_PHASE > phaseMaxHistoricalVolFraction = relperm.template getField< fields::relperm::phaseMaxHistoricalVolFraction >().reference(); arrayView2d< real64, compflow::USD_PHASE > phaseMinHistoricalVolFraction = relperm.template getField< fields::relperm::phaseMinHistoricalVolFraction >().reference(); arrayView1d< real64 > const drainagePhaseMinVolFraction = relperm.template getReference< array1d< real64 > >( - TableRelativePermeabilityHysteresis::viewKeyStruct::drainagePhaseMinVolumeFractionString()); + constitutive::TableRelativePermeabilityHysteresis::viewKeyStruct::drainagePhaseMinVolumeFractionString()); arrayView1d< real64 > const drainagePhaseMaxVolFraction = relperm.template getReference< array1d< real64 > >( - TableRelativePermeabilityHysteresis::viewKeyStruct::drainagePhaseMaxVolumeFractionString()); + constitutive::TableRelativePermeabilityHysteresis::viewKeyStruct::drainagePhaseMaxVolumeFractionString()); //setting for drainage { @@ -165,7 +164,7 @@ RelpermDriver::runTest( RELPERM_TYPE & relperm, } template< typename RELPERM_TYPE > -std::enable_if_t< !std::is_same< TableRelativePermeabilityHysteresis, RELPERM_TYPE >::value, void > +std::enable_if_t< !std::is_same< constitutive::TableRelativePermeabilityHysteresis, RELPERM_TYPE >::value, void > RelpermDriver::runTest( RELPERM_TYPE & relperm, const arrayView2d< real64 > & table ) { diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp index 81ebbe2d5a0..7d7be256a4a 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp @@ -73,31 +73,31 @@ class TableRelativePermeability : public RelativePermeabilityBase arrayView1d< integer const > const & phaseTypes, arrayView1d< integer const > const & phaseOrder, ThreePhaseInterpolator const & threePhaseInterpolator, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseRelPerm, - arrayView4d< real64, relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseTrappedVolFrac ); + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseRelPerm, + arrayView4d< real64, constitutive::relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseTrappedVolFrac ); GEOS_HOST_DEVICE void computeTwoPhase( integer const ipWetting, integer const ipNonWetting, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; GEOS_HOST_DEVICE void computeThreePhase( integer const ipWetting, integer const ipInter, integer const ipNonWetting, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; GEOS_HOST_DEVICE void compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; GEOS_HOST_DEVICE virtual void update( localIndex const k, @@ -190,8 +190,8 @@ TableRelativePermeability::KernelWrapper:: computeTwoPhase( integer const ipWetting, integer const ipNonWetting, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const { using TPT = TableRelativePermeability::TwoPhasePairPhaseType; @@ -216,8 +216,8 @@ TableRelativePermeability::KernelWrapper:: integer const ipInter, integer const ipNonWetting, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const { real64 interRelPerm_wi = 0; // oil rel perm using two-phase gas-oil data real64 dInterRelPerm_wi_dInterVolFrac = 0; // derivative w.r.t to So @@ -295,9 +295,9 @@ GEOS_HOST_DEVICE inline void TableRelativePermeability::KernelWrapper:: compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const { LvArray::forValuesInSlice( dPhaseRelPerm_dPhaseVolFrac, []( real64 & val ){ val = 0.0; } ); diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp index 9b50ca2fdf4..97a50d598b9 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp @@ -135,9 +135,9 @@ class TableRelativePermeabilityHysteresis : public RelativePermeabilityBase real64 const & waterOilRelPermMaxValue, arrayView2d< real64 const, compflow::USD_PHASE > const & phaseMinHistoricalVolFraction, arrayView2d< real64 const, compflow::USD_PHASE > const & phaseMaxHistoricalVolFraction, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseTrappedVolFrac, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseRelPerm, - arrayView4d< real64, relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac ); + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseTrappedVolFrac, + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseRelPerm, + arrayView4d< real64, constitutive::relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac ); /** * @brief Function updating the relperm (and derivative) for a phase using the drainage table @@ -256,10 +256,10 @@ class TableRelativePermeabilityHysteresis : public RelativePermeabilityBase arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMaxHistoricalVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMinHistoricalVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, arraySlice2d< real64, - relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; + constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; /** * @brief Function updating all the phase relperms (and derivatives) for three-phase flow @@ -281,10 +281,10 @@ class TableRelativePermeabilityHysteresis : public RelativePermeabilityBase arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMaxHistoricalVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMinHistoricalVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, arraySlice2d< real64, - relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; + constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; /** * @brief Main function updating all the phase relperms (and derivatives) @@ -298,9 +298,9 @@ class TableRelativePermeabilityHysteresis : public RelativePermeabilityBase void compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMaxHistoricalVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMinHistoricalVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; GEOS_HOST_DEVICE virtual void update( localIndex const k, @@ -780,12 +780,12 @@ TableRelativePermeabilityHysteresis::KernelWrapper:: arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMaxHistoricalVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMinHistoricalVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const { - using TPT = TableRelativePermeabilityHysteresis::TwoPhasePairPhaseType; - using IPT = TableRelativePermeabilityHysteresis::ImbibitionPhasePairPhaseType; + using TPT = constitutive::TableRelativePermeabilityHysteresis::TwoPhasePairPhaseType; + using IPT = constitutive::TableRelativePermeabilityHysteresis::ImbibitionPhasePairPhaseType; // ---------- wetting rel perm if( !m_phaseHasHysteresis[IPT::WETTING] || @@ -870,17 +870,17 @@ TableRelativePermeabilityHysteresis::KernelWrapper:: arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMaxHistoricalVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMinHistoricalVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const { real64 interRelPerm_wi = 0; // oil rel perm using two-phase gas-oil data real64 dInterRelPerm_wi_dInterVolFrac = 0; // derivative w.r.t to So real64 interRelPerm_nwi = 0; // oil rel perm using two-phase gas-oil data real64 dInterRelPerm_nwi_dInterVolFrac = 0; // derivative w.r.t to So - using TPT = TableRelativePermeabilityHysteresis::ThreePhasePairPhaseType; - using IPT = TableRelativePermeabilityHysteresis::ImbibitionPhasePairPhaseType; + using TPT = constitutive::TableRelativePermeabilityHysteresis::ThreePhasePairPhaseType; + using IPT = constitutive::TableRelativePermeabilityHysteresis::ImbibitionPhasePairPhaseType; // 1) Wetting and intermediate phase relative permeabilities using two-phase wetting-intermediate data @@ -1013,9 +1013,9 @@ TableRelativePermeabilityHysteresis::KernelWrapper:: compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMaxHistoricalVolFraction, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseMinHistoricalVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const { LvArray::forValuesInSlice( dPhaseRelPerm_dPhaseVolFrac, []( real64 & val ) { val = 0.0; } ); diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp index 2ac9e4ce0b6..18c30499a01 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp @@ -40,9 +40,9 @@ class VanGenuchtenBakerRelativePermeabilityUpdate final : public RelativePermeab real64 const volFracScale, arrayView1d< integer const > const & phaseTypes, arrayView1d< integer const > const & phaseOrder, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseRelPerm, - arrayView4d< real64, relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseTrappedVolFrac ) + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseRelPerm, + arrayView4d< real64, constitutive::relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseTrappedVolFrac ) : RelativePermeabilityBaseUpdate( phaseTypes, phaseOrder, phaseRelPerm, @@ -58,9 +58,9 @@ class VanGenuchtenBakerRelativePermeabilityUpdate final : public RelativePermeab GEOS_HOST_DEVICE void compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; GEOS_HOST_DEVICE virtual void update( localIndex const k, @@ -162,9 +162,9 @@ GEOS_HOST_DEVICE inline void VanGenuchtenBakerRelativePermeabilityUpdate:: compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const { LvArray::forValuesInSlice( dPhaseRelPerm_dPhaseVolFrac, []( real64 & val ){ val = 0.0; } ); diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp index 2753175bfd7..46a95e5b212 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp @@ -40,9 +40,9 @@ class VanGenuchtenStone2RelativePermeabilityUpdate final : public RelativePermea real64 const volFracScale, arrayView1d< integer const > const & phaseTypes, arrayView1d< integer const > const & phaseOrder, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseRelPerm, - arrayView4d< real64, relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, - arrayView3d< real64, relperm::USD_RELPERM > const & phaseTrappedVolFrac ) + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseRelPerm, + arrayView4d< real64, constitutive::relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, + arrayView3d< real64, constitutive::relperm::USD_RELPERM > const & phaseTrappedVolFrac ) : RelativePermeabilityBaseUpdate( phaseTypes, phaseOrder, phaseRelPerm, @@ -58,9 +58,9 @@ class VanGenuchtenStone2RelativePermeabilityUpdate final : public RelativePermea GEOS_HOST_DEVICE void compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const; GEOS_HOST_DEVICE virtual void update( localIndex const k, @@ -163,9 +163,9 @@ GEOS_HOST_DEVICE inline void VanGenuchtenStone2RelativePermeabilityUpdate:: compute( arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFraction, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, - arraySlice1d< real64, relperm::USD_RELPERM - 2 > const & phaseRelPerm, - arraySlice2d< real64, relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseTrappedVolFrac, + arraySlice1d< real64, constitutive::relperm::USD_RELPERM - 2 > const & phaseRelPerm, + arraySlice2d< real64, constitutive::relperm::USD_RELPERM_DS - 2 > const & dPhaseRelPerm_dPhaseVolFrac ) const { LvArray::forValuesInSlice( dPhaseRelPerm_dPhaseVolFrac, []( real64 & val ){ val = 0.0; } ); diff --git a/src/coreComponents/constitutive/solid/DamageSpectral.hpp b/src/coreComponents/constitutive/solid/DamageSpectral.hpp index 10439797fed..1bd6c35d30e 100644 --- a/src/coreComponents/constitutive/solid/DamageSpectral.hpp +++ b/src/coreComponents/constitutive/solid/DamageSpectral.hpp @@ -29,8 +29,6 @@ #define QUADRATIC_DISSIPATION 0 -using namespace LvArray; - namespace geos { namespace constitutive diff --git a/src/coreComponents/constitutive/solid/TriaxialDriver.hpp b/src/coreComponents/constitutive/solid/TriaxialDriver.hpp index 73e4957a13a..4ebe6251dbd 100644 --- a/src/coreComponents/constitutive/solid/TriaxialDriver.hpp +++ b/src/coreComponents/constitutive/solid/TriaxialDriver.hpp @@ -32,8 +32,6 @@ namespace geos { -using namespace constitutive; - /** * @class TriaxialDriver * diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp index 0e7a21f9603..ea0186e7082 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp @@ -118,7 +118,7 @@ class AquiferBoundaryCondition : public FieldSpecificationBase }; - /// @copydoc FieldSpecificationBase(string const &, Group *) + /// @copydoc FieldSpecificationBase(string const &, dataRepository::Group *) AquiferBoundaryCondition( string const & name, Group * parent ); /// deleted default constructor diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp index f9e53715558..d91baca73ae 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp @@ -34,7 +34,7 @@ class EquilibriumInitialCondition : public FieldSpecificationBase { public: - /// @copydoc FieldSpecificationBase(string const &, Group *) + /// @copydoc FieldSpecificationBase(string const &, dataRepository::Group *) EquilibriumInitialCondition( string const & name, Group * parent ); /// deleted default constructor diff --git a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp index e1ba3890d7c..605b9666c5c 100644 --- a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp @@ -36,7 +36,7 @@ class TableFunction; class TractionBoundaryCondition : public FieldSpecificationBase { public: - /// @copydoc FieldSpecificationBase(string const &, Group *) + /// @copydoc FieldSpecificationBase(string const &, dataRepository::Group *) TractionBoundaryCondition( string const & name, Group * parent ); /// deleted default constructor diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index a99528b0057..cc913d66d56 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -23,6 +23,8 @@ namespace geos { +using namespace dataRepository; + TimeHistoryOutput::TimeHistoryOutput( string const & name, Group * const parent ): OutputBase( name, parent ), diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp b/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp index 67264b16051..1de883c9176 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp @@ -26,8 +26,6 @@ namespace geos { -using namespace dataRepository; - /** * @class HistoryCollection * diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp index 14b06f61a0b..383a3d223a0 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp @@ -17,6 +17,9 @@ namespace geos { + +using namespace dataRepository; + PackCollection::PackCollection ( string const & name, Group * parent ) : HistoryCollectionBase( name, parent ) , m_setsIndices( ) diff --git a/src/coreComponents/mesh/generators/VTKUtilities.cpp b/src/coreComponents/mesh/generators/VTKUtilities.cpp index a2cfae5da17..ac36adf2c21 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.cpp @@ -72,6 +72,7 @@ namespace geos { +using namespace dataRepository; namespace vtk { diff --git a/src/coreComponents/mesh/generators/VTKUtilities.hpp b/src/coreComponents/mesh/generators/VTKUtilities.hpp index fc05b8fb6ae..ecab1c26c5d 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.hpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.hpp @@ -33,9 +33,6 @@ namespace geos { - -using namespace dataRepository; - namespace vtk { @@ -222,7 +219,7 @@ string buildCellBlockName( ElementType const type, int const regionId ); */ void importMaterialField( std::vector< vtkIdType > const & cellIds, vtkDataArray * vtkArray, - WrapperBase & wrapper ); + dataRepository::WrapperBase & wrapper ); /** * @brief Imports 1d and 2d arrays from @p vtkArray to @p wrapper, only for @p cellIds @@ -232,7 +229,7 @@ void importMaterialField( std::vector< vtkIdType > const & cellIds, */ void importRegularField( std::vector< vtkIdType > const & cellIds, vtkDataArray * vtkArray, - WrapperBase & wrapper ); + dataRepository::WrapperBase & wrapper ); /** * @brief Imports 1d and 2d arrays from @p vtkArray to @p wrapper, for all the elements/cells of the provided wrapper. @@ -240,7 +237,7 @@ void importRegularField( std::vector< vtkIdType > const & cellIds, * @param wrapper The destination. */ void importRegularField( vtkDataArray * vtkArray, - WrapperBase & wrapper ); + dataRepository::WrapperBase & wrapper ); } // namespace vtk diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp index 3235bca00c6..9dc020a428a 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp @@ -323,7 +323,7 @@ class ALMBubbleKernels : LvArray::tensorOps::Rij_eq_AikBkj< nBubbleUdof, nBubbleUdof, 6 >( Abb_gauss, matBD, strainBubbleMatrix ); // transp(B)DBb - tensorOps::transpose< nUdof, nBubbleUdof >( Aub_gauss, Abu_gauss ); + LvArray::tensorOps::transpose< nUdof, nBubbleUdof >( Aub_gauss, Abu_gauss ); // multiply by determinant and add to element matrix LvArray::tensorOps::scaledAdd< nBubbleUdof, nBubbleUdof >( stack.localAbb, Abb_gauss, -detJ ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index d601ccdf50d..b04c2037384 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -25,7 +25,6 @@ namespace geos { -using namespace constitutive; class SolidMechanicsEmbeddedFractures : public ContactSolverBase { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp index fe0b452865e..ca60225e582 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp @@ -29,6 +29,7 @@ namespace geos { +using namespace constitutive; namespace compositionalMultiphaseHybridFVMKernels { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp index b0a12568c7a..e043807a798 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp @@ -41,9 +41,6 @@ namespace geos namespace compositionalMultiphaseHybridFVMKernels { -using namespace constitutive; - - // struct to specify local and neighbor derivatives struct Pos { @@ -90,13 +87,13 @@ struct UpwindingHelper static void upwindViscousCoefficient( localIndex const (&localIds)[ 3 ], localIndex const (&neighborIds)[ 3 ], - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseDens, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, ElementViewConst< arrayView1d< globalIndex const > > const & elemDofNumber, real64 const & oneSidedVolFlux, real64 ( &upwPhaseViscCoef )[ NP ][ NC ], @@ -134,15 +131,15 @@ struct UpwindingHelper upwindBuoyancyCoefficient( localIndex const (&localIds)[ 3 ], localIndex const (&neighborIds)[ 3 ], real64 const & transGravCoef, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, real64 ( &phaseGravTerm )[ NP ][ NP-1 ], real64 ( &dPhaseGravTerm_dPres )[ NP ][ NP-1 ][ 2 ], real64 ( &dPhaseGravTerm_dCompDens )[ NP ][ NP-1 ][ 2 ][ NC ], @@ -170,8 +167,8 @@ struct UpwindingHelper computePhaseGravTerm( localIndex const (&localIds)[ 3 ], localIndex const (&neighborIds)[ 3 ], real64 const & transGravCoef, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, real64 ( &phaseGravTerm )[ NP ][ NP-1 ], real64 ( &dPhaseGravTerm_dPres )[ NP ][ NP-1 ][ 2 ], @@ -286,8 +283,8 @@ struct AssemblerKernelHelper arraySlice1d< localIndex const > const & elemToFaces, real64 const & elemPres, real64 const & elemGravCoef, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const & elemPhaseMassDens, - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const & dElemPhaseMassDens, + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const & elemPhaseMassDens, + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const & dElemPhaseMassDens, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & elemPhaseMob, arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const & dElemPhaseMob, arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const & dElemCompFrac_dCompDens, @@ -337,15 +334,15 @@ struct AssemblerKernelHelper arraySlice1d< localIndex const > const & elemToFaces, real64 const & elemGravCoef, integer const useTotalMassEquation, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, ElementViewConst< arrayView1d< globalIndex const > > const & elemDofNumber, arraySlice2d< real64 const > const & transMatrixGrav, real64 const (&oneSidedVolFlux)[ NF ], @@ -525,15 +522,15 @@ struct AssemblerKernel real64 const & elemPres, real64 const & elemGravCoef, const integer useTotalMassEquation, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, ElementViewConst< arrayView1d< globalIndex const > > const & elemDofNumber, integer const elemGhostRank, globalIndex const rankOffset, @@ -566,7 +563,7 @@ struct FluxKernel fields::flow::dGlobalCompFraction_dGlobalCompDensity >; using MultiFluidAccessors = - StencilMaterialAccessors< MultiFluidBase, + StencilMaterialAccessors< constitutive::MultiFluidBase, fields::multifluid::phaseDensity, fields::multifluid::dPhaseDensity, fields::multifluid::phaseMassDensity, @@ -629,12 +626,12 @@ struct FluxKernel ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseMassDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, ElementViewConst< arrayView1d< globalIndex const > > const & elemDofNumber, globalIndex const rankOffset, real64 const lengthTolerance, @@ -672,8 +669,8 @@ class PhaseMobilityKernel : public isothermalCompositionalMultiphaseBaseKernels: * @param[in] relperm the relperm model */ PhaseMobilityKernel( ObjectManagerBase & subRegion, - MultiFluidBase const & fluid, - RelativePermeabilityBase const & relperm ) + constitutive::MultiFluidBase const & fluid, + constitutive::RelativePermeabilityBase const & relperm ) : Base(), m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), @@ -697,13 +694,13 @@ class PhaseMobilityKernel : public isothermalCompositionalMultiphaseBaseKernels: void compute( localIndex const ei, FUNC && phaseMobilityKernelOp = NoOpFunc{} ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const phaseVisc = m_phaseVisc[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const dPhaseVisc = m_dPhaseVisc[ei][0]; - arraySlice1d< real64 const, relperm::USD_RELPERM - 2 > const phaseRelPerm = m_phaseRelPerm[ei][0]; - arraySlice2d< real64 const, relperm::USD_RELPERM_DS - 2 > const dPhaseRelPerm_dPhaseVolFrac = m_dPhaseRelPerm_dPhaseVolFrac[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseVisc = m_phaseVisc[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseVisc = m_dPhaseVisc[ei][0]; + arraySlice1d< real64 const, constitutive::relperm::USD_RELPERM - 2 > const phaseRelPerm = m_phaseRelPerm[ei][0]; + arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > const dPhaseRelPerm_dPhaseVolFrac = m_dPhaseRelPerm_dPhaseVolFrac[ei][0]; arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const phaseVolFrac = m_phaseVolFrac[ei]; arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; arraySlice1d< real64, compflow::USD_PHASE - 1 > const phaseMob = m_phaseMob[ei]; @@ -778,12 +775,12 @@ class PhaseMobilityKernel : public isothermalCompositionalMultiphaseBaseKernels: arrayView3d< real64 const, compflow::USD_COMP_DC > m_dCompFrac_dCompDens; /// Views on the phase viscosities - arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseVisc; - arrayView4d< real64 const, multifluid::USD_PHASE_DC > m_dPhaseVisc; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseVisc; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseVisc; /// Views on the phase relative permeabilities - arrayView3d< real64 const, relperm::USD_RELPERM > m_phaseRelPerm; - arrayView4d< real64 const, relperm::USD_RELPERM_DS > m_dPhaseRelPerm_dPhaseVolFrac; + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > m_phaseRelPerm; + arrayView4d< real64 const, constitutive::relperm::USD_RELPERM_DS > m_dPhaseRelPerm_dPhaseVolFrac; // outputs @@ -814,8 +811,8 @@ class PhaseMobilityKernelFactory createAndLaunch( integer const numComp, integer const numPhase, ObjectManagerBase & subRegion, - MultiFluidBase const & fluid, - RelativePermeabilityBase const & relperm ) + constitutive::MultiFluidBase const & fluid, + constitutive::RelativePermeabilityBase const & relperm ) { if( numPhase == 2 ) { @@ -976,7 +973,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > ElementViewConst< arrayView2d< real64 const > > const m_porosity_n; /// View on total mass/molar density at the previous converged time step - ElementViewConst< arrayView2d< real64 const, multifluid::USD_FLUID > > const m_totalDens_n; + ElementViewConst< arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > > const m_totalDens_n; }; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp index 10b42f0e79a..3453ec47f30 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp @@ -30,8 +30,6 @@ namespace geos namespace dissipationCompositionalMultiphaseFVMKernels { -using namespace constitutive; - static constexpr integer newtonContinuationCutoffIteration = 5; static constexpr real64 initialDirectionalCoef = 100; static constexpr real64 multiplierDirectionalCoef = 1000; @@ -85,9 +83,9 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne fields::elementVolume >; using PorosityAccessors = - StencilMaterialAccessors< PorosityBase, fields::porosity::porosity_n >; + StencilMaterialAccessors< constitutive::PorosityBase, fields::porosity::porosity_n >; - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; /** * @brief Constructor for the kernel interface diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp index 108e5a9261a..02b8c7f6bf7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp @@ -41,8 +41,6 @@ namespace geos namespace isothermalCompositionalMultiphaseBaseKernels { -using namespace constitutive; - static constexpr real64 minDensForDivision = 1e-10; enum class ElementBasedAssemblyKernelFlags @@ -273,7 +271,7 @@ class PhaseVolumeFractionKernel : public PropertyKernelBase< NUM_COMP > * @param[in] fluid the fluid model */ PhaseVolumeFractionKernel( ObjectManagerBase & subRegion, - MultiFluidBase const & fluid ) + constitutive::MultiFluidBase const & fluid ) : Base(), m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), @@ -296,14 +294,14 @@ class PhaseVolumeFractionKernel : public PropertyKernelBase< NUM_COMP > real64 compute( localIndex const ei, FUNC && phaseVolFractionKernelOp = NoOpFunc{} ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; arraySlice1d< real64 const, compflow::USD_COMP - 1 > const compDens = m_compDens[ei]; arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const phaseFrac = m_phaseFrac[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const dPhaseFrac = m_dPhaseFrac[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseFrac = m_phaseFrac[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseFrac = m_dPhaseFrac[ei][0]; arraySlice1d< real64, compflow::USD_PHASE - 1 > const phaseVolFrac = m_phaseVolFrac[ei]; arraySlice2d< real64, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; @@ -414,12 +412,12 @@ class PhaseVolumeFractionKernel : public PropertyKernelBase< NUM_COMP > arrayView3d< real64 const, compflow::USD_COMP_DC > m_dCompFrac_dCompDens; /// Views on phase fractions - arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseFrac; - arrayView4d< real64 const, multifluid::USD_PHASE_DC > m_dPhaseFrac; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseFrac; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseFrac; /// Views on phase densities - arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseDens; - arrayView4d< real64 const, multifluid::USD_PHASE_DC > m_dPhaseDens; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseDens; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseDens; }; @@ -443,7 +441,7 @@ class PhaseVolumeFractionKernelFactory createAndLaunch( integer const numComp, integer const numPhase, ObjectManagerBase & subRegion, - MultiFluidBase const & fluid ) + constitutive::MultiFluidBase const & fluid ) { real64 maxDeltaPhaseVolFrac = 0.0; if( numPhase == 2 ) @@ -578,8 +576,8 @@ class ElementBasedAssemblyKernel globalIndex const rankOffset, string const dofKey, ElementSubRegionBase const & subRegion, - MultiFluidBase const & fluid, - CoupledSolidBase const & solid, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs, BitFlags< ElementBasedAssemblyKernelFlags > const kernelFlags ) @@ -702,7 +700,7 @@ class ElementBasedAssemblyKernel } else { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // construct the slices for variables accessed multiple times arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; @@ -710,11 +708,11 @@ class ElementBasedAssemblyKernel arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseDens = m_phaseDens[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseDens = m_phaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; - arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; + arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; // temporary work arrays real64 dPhaseAmount_dC[numComp]{}; @@ -791,7 +789,7 @@ class ElementBasedAssemblyKernel StackVariables & stack, FUNC && phaseVolFractionSumKernelOp = NoOpFunc{} ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; @@ -916,12 +914,12 @@ class ElementBasedAssemblyKernel arrayView3d< real64 const, compflow::USD_PHASE_DC > const m_dPhaseVolFrac; /// Views on the phase densities - arrayView3d< real64 const, multifluid::USD_PHASE > const m_phaseDens; - arrayView4d< real64 const, multifluid::USD_PHASE_DC > const m_dPhaseDens; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseDens; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > const m_dPhaseDens; /// Views on the phase component fraction - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const m_phaseCompFrac; - arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > const m_dPhaseCompFrac; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const m_phaseCompFrac; + arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > const m_dPhaseCompFrac; // View on component densities arrayView2d< real64 const, compflow::USD_COMP > m_compDens; @@ -966,8 +964,8 @@ class ElementBasedAssemblyKernelFactory integer const useSimpleAccumulation, string const dofKey, ElementSubRegionBase const & subRegion, - MultiFluidBase const & fluid, - CoupledSolidBase const & solid, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { @@ -1805,8 +1803,8 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > arrayView1d< localIndex const > const & ghostRank, integer const numComponents, ElementSubRegionBase const & subRegion, - MultiFluidBase const & fluid, - CoupledSolidBase const & solid, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, real64 const minNormalizer ) : Base( rankOffset, localResidual, @@ -1884,7 +1882,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > arrayView2d< real64 const > const m_porosity_n; /// View on total mass/molar density at the previous converged time step - arrayView2d< real64 const, multifluid::USD_FLUID > const m_totalDens_n; + arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > const m_totalDens_n; }; @@ -1917,8 +1915,8 @@ class ResidualNormKernelFactory string const dofKey, arrayView1d< real64 const > const & localResidual, ElementSubRegionBase const & subRegion, - MultiFluidBase const & fluid, - CoupledSolidBase const & solid, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, real64 const minNormalizer, real64 (& residualNorm)[1], real64 (& residualNormalizer)[1] ) @@ -1969,11 +1967,11 @@ struct StatisticsKernel arrayView1d< real64 const > const & temp, arrayView1d< real64 const > const & refPorosity, arrayView2d< real64 const > const & porosity, - arrayView3d< real64 const, multifluid::USD_PHASE > const & phaseDensity, - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const & phaseCompFraction, + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const & phaseDensity, + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const & phaseCompFraction, arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac, - arrayView3d< real64 const, relperm::USD_RELPERM > const & phaseTrappedVolFrac, - arrayView3d< real64 const, relperm::USD_RELPERM > const & phaseRelperm, + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > const & phaseTrappedVolFrac, + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > const & phaseRelperm, real64 & minPres, real64 & avgPresNumerator, real64 & maxPres, @@ -2128,14 +2126,14 @@ struct HydrostaticPressureKernel { // fluid properties at this elevation StackArray< real64, 2, constitutive::MultiFluidBase::MAX_NUM_COMPONENTS, compflow::LAYOUT_COMP > compFrac( 1, numComps ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > phaseFrac( 1, 1, numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > phaseDens( 1, 1, numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > phaseMassDens( 1, 1, numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > phaseVisc( 1, 1, numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > phaseEnthalpy( 1, 1, numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > phaseInternalEnergy( 1, 1, numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseFrac( 1, 1, numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseDens( 1, 1, numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseMassDens( 1, 1, numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseVisc( 1, 1, numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseEnthalpy( 1, 1, numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseInternalEnergy( 1, 1, numPhases ); StackArray< real64, 4, constitutive::MultiFluidBase::MAX_NUM_PHASES *constitutive::MultiFluidBase::MAX_NUM_COMPONENTS, - multifluid::LAYOUT_PHASE_COMP > phaseCompFrac( 1, 1, numPhases, numComps ); + constitutive::multifluid::LAYOUT_PHASE_COMP > phaseCompFrac( 1, 1, numPhases, numComps ); real64 totalDens = 0.0; bool isSinglePhaseFlow = true; @@ -2156,18 +2154,18 @@ struct HydrostaticPressureKernel // Step 3: compute the mass density at this elevation using the guess, and update pressure - MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, - pres0, - temp, - compFrac[0], - phaseFrac[0][0], - phaseDens[0][0], - phaseMassDens[0][0], - phaseVisc[0][0], - phaseEnthalpy[0][0], - phaseInternalEnergy[0][0], - phaseCompFrac[0][0], - totalDens ); + constitutive::MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, + pres0, + temp, + compFrac[0], + phaseFrac[0][0], + phaseDens[0][0], + phaseMassDens[0][0], + phaseVisc[0][0], + phaseEnthalpy[0][0], + phaseInternalEnergy[0][0], + phaseCompFrac[0][0], + totalDens ); pres1 = refPres - 0.5 * ( refPhaseMassDens[ipInit] + phaseMassDens[0][0][ipInit] ) * gravCoef; // Step 4: fixed-point iteration until convergence @@ -2202,18 +2200,18 @@ struct HydrostaticPressureKernel } // compute the mass density at this elevation using the previous pressure, and compute the new pressure - MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, - pres0, - temp, - compFrac[0], - phaseFrac[0][0], - phaseDens[0][0], - phaseMassDens[0][0], - phaseVisc[0][0], - phaseEnthalpy[0][0], - phaseInternalEnergy[0][0], - phaseCompFrac[0][0], - totalDens ); + constitutive::MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, + pres0, + temp, + compFrac[0], + phaseFrac[0][0], + phaseDens[0][0], + phaseMassDens[0][0], + phaseVisc[0][0], + phaseEnthalpy[0][0], + phaseInternalEnergy[0][0], + phaseCompFrac[0][0], + totalDens ); pres1 = refPres - 0.5 * ( refPhaseMassDens[ipInit] + phaseMassDens[0][0][ipInit] ) * gravCoef; } @@ -2265,13 +2263,13 @@ struct HydrostaticPressureKernel // datum fluid properties array2d< real64, compflow::LAYOUT_COMP > datumCompFrac( 1, numComps ); - array3d< real64, multifluid::LAYOUT_PHASE > datumPhaseFrac( 1, 1, numPhases ); - array3d< real64, multifluid::LAYOUT_PHASE > datumPhaseDens( 1, 1, numPhases ); - array3d< real64, multifluid::LAYOUT_PHASE > datumPhaseMassDens( 1, 1, numPhases ); - array3d< real64, multifluid::LAYOUT_PHASE > datumPhaseVisc( 1, 1, numPhases ); - array3d< real64, multifluid::LAYOUT_PHASE > datumPhaseEnthalpy( 1, 1, numPhases ); - array3d< real64, multifluid::LAYOUT_PHASE > datumPhaseInternalEnergy( 1, 1, numPhases ); - array4d< real64, multifluid::LAYOUT_PHASE_COMP > datumPhaseCompFrac( 1, 1, numPhases, numComps ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseFrac( 1, 1, numPhases ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseDens( 1, 1, numPhases ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseMassDens( 1, 1, numPhases ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseVisc( 1, 1, numPhases ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseEnthalpy( 1, 1, numPhases ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseInternalEnergy( 1, 1, numPhases ); + array4d< real64, constitutive::multifluid::LAYOUT_PHASE_COMP > datumPhaseCompFrac( 1, 1, numPhases, numComps ); real64 datumTotalDens = 0.0; real64 const datumTemp = tempTableWrapper.compute( &datumElevation ); @@ -2279,18 +2277,18 @@ struct HydrostaticPressureKernel { datumCompFrac[0][ic] = compFracTableWrappers[ic].compute( &datumElevation ); } - MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, - datumPres, - datumTemp, - datumCompFrac[0], - datumPhaseFrac[0][0], - datumPhaseDens[0][0], - datumPhaseMassDens[0][0], - datumPhaseVisc[0][0], - datumPhaseEnthalpy[0][0], - datumPhaseInternalEnergy[0][0], - datumPhaseCompFrac[0][0], - datumTotalDens ); + constitutive::MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, + datumPres, + datumTemp, + datumCompFrac[0], + datumPhaseFrac[0][0], + datumPhaseDens[0][0], + datumPhaseMassDens[0][0], + datumPhaseVisc[0][0], + datumPhaseEnthalpy[0][0], + datumPhaseInternalEnergy[0][0], + datumPhaseCompFrac[0][0], + datumTotalDens ); // Step 2: find the closest elevation to datumElevation diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp index 53e0e77be7a..c26187ed8ae 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp @@ -28,6 +28,7 @@ namespace geos { +using namespace constitutive; namespace isothermalCompositionalMultiphaseFVMKernels { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp index e873db36651..43b6ca1c277 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp @@ -56,8 +56,6 @@ namespace geos namespace isothermalCompositionalMultiphaseFVMKernels { -using namespace constitutive; - enum class FaceBasedAssemblyKernelFlags { /// Flag to specify whether capillary pressure is used or not @@ -101,8 +99,8 @@ class PhaseMobilityKernel : public isothermalCompositionalMultiphaseBaseKernels: * @param[in] relperm the relperm model */ PhaseMobilityKernel( ObjectManagerBase & subRegion, - MultiFluidBase const & fluid, - RelativePermeabilityBase const & relperm ) + constitutive::MultiFluidBase const & fluid, + constitutive::RelativePermeabilityBase const & relperm ) : Base(), m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), @@ -128,15 +126,15 @@ class PhaseMobilityKernel : public isothermalCompositionalMultiphaseBaseKernels: void compute( localIndex const ei, FUNC && phaseMobilityKernelOp = NoOpFunc{} ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const phaseVisc = m_phaseVisc[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const dPhaseVisc = m_dPhaseVisc[ei][0]; - arraySlice1d< real64 const, relperm::USD_RELPERM - 2 > const phaseRelPerm = m_phaseRelPerm[ei][0]; - arraySlice2d< real64 const, relperm::USD_RELPERM_DS - 2 > const dPhaseRelPerm_dPhaseVolFrac = m_dPhaseRelPerm_dPhaseVolFrac[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseVisc = m_phaseVisc[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseVisc = m_dPhaseVisc[ei][0]; + arraySlice1d< real64 const, constitutive::relperm::USD_RELPERM - 2 > const phaseRelPerm = m_phaseRelPerm[ei][0]; + arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > const dPhaseRelPerm_dPhaseVolFrac = m_dPhaseRelPerm_dPhaseVolFrac[ei][0]; arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const phaseVolFrac = m_phaseVolFrac[ei]; arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; arraySlice1d< real64, compflow::USD_PHASE - 1 > const phaseMob = m_phaseMob[ei]; @@ -216,16 +214,16 @@ class PhaseMobilityKernel : public isothermalCompositionalMultiphaseBaseKernels: arrayView3d< real64 const, compflow::USD_COMP_DC > m_dCompFrac_dCompDens; /// Views on the phase densities - arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseDens; - arrayView4d< real64 const, multifluid::USD_PHASE_DC > m_dPhaseDens; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseDens; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseDens; /// Views on the phase viscosities - arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseVisc; - arrayView4d< real64 const, multifluid::USD_PHASE_DC > m_dPhaseVisc; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseVisc; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseVisc; /// Views on the phase relative permeabilities - arrayView3d< real64 const, relperm::USD_RELPERM > m_phaseRelPerm; - arrayView4d< real64 const, relperm::USD_RELPERM_DS > m_dPhaseRelPerm_dPhaseVolFrac; + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > m_phaseRelPerm; + arrayView4d< real64 const, constitutive::relperm::USD_RELPERM_DS > m_dPhaseRelPerm_dPhaseVolFrac; // outputs @@ -256,8 +254,8 @@ class PhaseMobilityKernelFactory createAndLaunch( integer const numComp, integer const numPhase, ObjectManagerBase & subRegion, - MultiFluidBase const & fluid, - RelativePermeabilityBase const & relperm ) + constitutive::MultiFluidBase const & fluid, + constitutive::RelativePermeabilityBase const & relperm ) { if( numPhase == 2 ) { @@ -312,7 +310,7 @@ class FaceBasedAssemblyKernelBase fields::flow::phaseMobility, fields::flow::dPhaseMobility >; using MultiFluidAccessors = - StencilMaterialAccessors< MultiFluidBase, + StencilMaterialAccessors< constitutive::MultiFluidBase, fields::multifluid::phaseDensity, fields::multifluid::dPhaseDensity, fields::multifluid::phaseMassDensity, @@ -321,12 +319,12 @@ class FaceBasedAssemblyKernelBase fields::multifluid::dPhaseCompFraction >; using CapPressureAccessors = - StencilMaterialAccessors< CapillaryPressureBase, + StencilMaterialAccessors< constitutive::CapillaryPressureBase, fields::cappres::phaseCapPressure, fields::cappres::dPhaseCapPressure_dPhaseVolFraction >; using PermeabilityAccessors = - StencilMaterialAccessors< PermeabilityBase, + StencilMaterialAccessors< constitutive::PermeabilityBase, fields::permeability::permeability, fields::permeability::dPerm_dPressure >; @@ -380,8 +378,8 @@ class FaceBasedAssemblyKernelBase ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const m_dPhaseVolFrac; /// Views on phase component fractions - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const m_phaseCompFrac; - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const m_dPhaseCompFrac; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const m_phaseCompFrac; + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const m_dPhaseCompFrac; // Residual and jacobian @@ -826,12 +824,12 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const m_dPhaseMob; /// Views on phase mass densities - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const m_phaseMassDens; - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const m_dPhaseMassDens; + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseMassDens; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseMassDens; /// Views on phase capillary pressure - ElementViewConst< arrayView3d< real64 const, cappres::USD_CAPPRES > > const m_phaseCapPressure; - ElementViewConst< arrayView4d< real64 const, cappres::USD_CAPPRES_DS > > const m_dPhaseCapPressure_dPhaseVolFrac; + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const m_phaseCapPressure; + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const m_dPhaseCapPressure_dPhaseVolFrac; // Stencil information @@ -959,17 +957,17 @@ class DiffusionDispersionFaceBasedAssemblyKernel : public FaceBasedAssemblyKerne using AbstractBase::m_kernelFlags; using DiffusionAccessors = - StencilMaterialAccessors< DiffusionBase, + StencilMaterialAccessors< constitutive::DiffusionBase, fields::diffusion::diffusivity, fields::diffusion::dDiffusivity_dTemperature, fields::diffusion::phaseDiffusivityMultiplier >; using DispersionAccessors = - StencilMaterialAccessors< DispersionBase, + StencilMaterialAccessors< constitutive::DispersionBase, fields::dispersion::dispersivity >; using PorosityAccessors = - StencilMaterialAccessors< PorosityBase, + StencilMaterialAccessors< constitutive::PorosityBase, fields::porosity::referencePorosity >; /** @@ -1127,7 +1125,7 @@ class DiffusionDispersionFaceBasedAssemblyKernel : public FaceBasedAssemblyKerne StackVariables & stack, FUNC && diffusionFluxKernelOp = NoOpFunc{} ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // first, compute the transmissibilities at this face m_stencilWrapper.computeWeights( iconn, @@ -1260,7 +1258,7 @@ class DiffusionDispersionFaceBasedAssemblyKernel : public FaceBasedAssemblyKerne StackVariables & stack, FUNC && dispersionFluxKernelOp = NoOpFunc{} ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // first, compute the transmissibilities at this face // note that the dispersion tensor is lagged in iteration @@ -1389,7 +1387,7 @@ class DiffusionDispersionFaceBasedAssemblyKernel : public FaceBasedAssemblyKerne real64 (& dCompFracGrad_dP)[numFluxSupportPoints], real64 (& dCompFracGrad_dC)[numFluxSupportPoints][numComp] ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; real64 dCompFrac_dC[numComp]{}; @@ -1548,8 +1546,8 @@ class DiffusionDispersionFaceBasedAssemblyKernel : public FaceBasedAssemblyKerne ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const m_phaseVolFrac; /// Views on phase densities - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const m_phaseDens; - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const m_dPhaseDens; + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseDens; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseDens; /// Views on diffusivity ElementViewConst< arrayView3d< real64 const > > const m_diffusivity; @@ -1831,7 +1829,7 @@ class DirichletFaceBasedAssemblyKernel : public FaceBasedAssemblyKernel< NUM_COM StackVariables & stack, FUNC && compFluxKernelOp = NoOpFunc{} ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; using Order = BoundaryStencil::Order; localIndex const er = m_seri( iconn, Order::ELEM ); @@ -1852,28 +1850,28 @@ class DirichletFaceBasedAssemblyKernel : public FaceBasedAssemblyKernel< NUM_COM // This is needed to get the phase mass density and the phase comp fraction at the face // Because we approximate the face mobility using the total element mobility - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > facePhaseFrac( 1, 1, m_numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > facePhaseDens( 1, 1, m_numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > facePhaseMassDens( 1, 1, m_numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > facePhaseVisc( 1, 1, m_numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > facePhaseEnthalpy( 1, 1, m_numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, multifluid::LAYOUT_PHASE > facePhaseInternalEnergy( 1, 1, m_numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseFrac( 1, 1, m_numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseDens( 1, 1, m_numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseMassDens( 1, 1, m_numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseVisc( 1, 1, m_numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseEnthalpy( 1, 1, m_numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseInternalEnergy( 1, 1, m_numPhases ); StackArray< real64, 4, constitutive::MultiFluidBase::MAX_NUM_PHASES * NUM_COMP, - multifluid::LAYOUT_PHASE_COMP > facePhaseCompFrac( 1, 1, m_numPhases, NUM_COMP ); + constitutive::multifluid::LAYOUT_PHASE_COMP > facePhaseCompFrac( 1, 1, m_numPhases, NUM_COMP ); real64 faceTotalDens = 0.0; - MultiFluidBase::KernelWrapper::computeValues( m_fluidWrapper, - m_facePres[kf], - m_faceTemp[kf], - m_faceCompFrac[kf], - facePhaseFrac[0][0], - facePhaseDens[0][0], - facePhaseMassDens[0][0], - facePhaseVisc[0][0], - facePhaseEnthalpy[0][0], - facePhaseInternalEnergy[0][0], - facePhaseCompFrac[0][0], - faceTotalDens ); + constitutive::MultiFluidBase::KernelWrapper::computeValues( m_fluidWrapper, + m_facePres[kf], + m_faceTemp[kf], + m_faceCompFrac[kf], + facePhaseFrac[0][0], + facePhaseDens[0][0], + facePhaseMassDens[0][0], + facePhaseVisc[0][0], + facePhaseEnthalpy[0][0], + facePhaseInternalEnergy[0][0], + facePhaseCompFrac[0][0], + faceTotalDens ); // Step 3: loop over phases, compute and upwind phase flux and sum contributions to each component's flux @@ -1952,9 +1950,9 @@ class DirichletFaceBasedAssemblyKernel : public FaceBasedAssemblyKernel< NUM_COM } // slice some constitutive arrays to avoid too much indexing in component loop - arraySlice1d< real64 const, multifluid::USD_PHASE_COMP-3 > phaseCompFracSub = + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP-3 > phaseCompFracSub = m_phaseCompFrac[er][esr][ei][0][ip]; - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP_DC-3 > dPhaseCompFracSub = + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC-3 > dPhaseCompFracSub = m_dPhaseCompFrac[er][esr][ei][0][ip]; // compute component fluxes and derivatives using element composition @@ -2120,7 +2118,7 @@ class DirichletFaceBasedAssemblyKernelFactory FaceManager const & faceManager, ElementRegionManager const & elemManager, BoundaryStencilWrapper const & stencilWrapper, - MultiFluidBase & fluidBase, + constitutive::MultiFluidBase & fluidBase, real64 const dt, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) @@ -2185,20 +2183,20 @@ struct CFLFluxKernel fields::flow::componentOutflux >; using MultiFluidAccessors = - StencilMaterialAccessors< MultiFluidBase, + StencilMaterialAccessors< constitutive::MultiFluidBase, fields::multifluid::phaseViscosity, fields::multifluid::phaseDensity, fields::multifluid::phaseMassDensity, fields::multifluid::phaseCompFraction >; using PermeabilityAccessors = - StencilMaterialAccessors< PermeabilityBase, + StencilMaterialAccessors< constitutive::PermeabilityBase, fields::permeability::permeability, fields::permeability::dPerm_dPressure >; using RelPermAccessors = - StencilMaterialAccessors< RelativePermeabilityBase, fields::relperm::phaseRelPerm >; + StencilMaterialAccessors< constitutive::RelativePermeabilityBase, fields::relperm::phaseRelPerm >; template< integer NC, localIndex NUM_ELEMS, localIndex maxStencilSize > GEOS_HOST_DEVICE @@ -2214,11 +2212,11 @@ struct CFLFluxKernel ElementViewConst< arrayView1d< real64 const > > const & pres, ElementViewConst< arrayView1d< real64 const > > const & gravCoef, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, - ElementViewConst< arrayView3d< real64 const, relperm::USD_RELPERM > > const & phaseRelPerm, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseVisc, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > > const & phaseRelPerm, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseVisc, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, ElementView< arrayView2d< real64, compflow::USD_PHASE > > const & phaseOutflux, ElementView< arrayView2d< real64, compflow::USD_COMP > > const & compOutflux ); @@ -2232,11 +2230,11 @@ struct CFLFluxKernel ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const > > const & permeability, ElementViewConst< arrayView3d< real64 const > > const & dPerm_dPres, - ElementViewConst< arrayView3d< real64 const, relperm::USD_RELPERM > > const & phaseRelPerm, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseVisc, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > > const & phaseRelPerm, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseVisc, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, ElementView< arrayView2d< real64, compflow::USD_PHASE > > const & phaseOutflux, ElementView< arrayView2d< real64, compflow::USD_COMP > > const & compOutflux ); }; @@ -2258,9 +2256,9 @@ struct CFLKernel static void computePhaseCFL( real64 const poreVol, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac, - arraySlice1d< real64 const, relperm::USD_RELPERM - 2 > phaseRelPerm, - arraySlice2d< real64 const, relperm::USD_RELPERM_DS - 2 > dPhaseRelPerm_dPhaseVolFrac, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseVisc, + arraySlice1d< real64 const, constitutive::relperm::USD_RELPERM - 2 > phaseRelPerm, + arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > dPhaseRelPerm_dPhaseVolFrac, + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseVisc, arraySlice1d< real64 const, compflow::USD_PHASE- 1 > phaseOutflux, real64 & phaseCFLNumber ); @@ -2282,9 +2280,9 @@ struct CFLKernel arrayView2d< real64 const, compflow::USD_COMP > const & compDens, arrayView2d< real64 const, compflow::USD_COMP > const & compFrac, arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac, - arrayView3d< real64 const, relperm::USD_RELPERM > const & phaseRelPerm, - arrayView4d< real64 const, relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, - arrayView3d< real64 const, multifluid::USD_PHASE > const & phaseVisc, + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > const & phaseRelPerm, + arrayView4d< real64 const, constitutive::relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const & phaseVisc, arrayView2d< real64 const, compflow::USD_PHASE > const & phaseOutflux, arrayView2d< real64 const, compflow::USD_COMP > const & compOutflux, arrayView1d< real64 > const & phaseCFLNumber, @@ -2321,7 +2319,7 @@ struct AquiferBCKernel fields::flow::dGlobalCompFraction_dGlobalCompDensity >; using MultiFluidAccessors = - StencilMaterialAccessors< MultiFluidBase, + StencilMaterialAccessors< constitutive::MultiFluidBase, fields::multifluid::phaseDensity, fields::multifluid::dPhaseDensity, fields::multifluid::phaseCompFraction, @@ -2338,12 +2336,12 @@ struct AquiferBCKernel real64 const dAquiferVolFlux_dPres, real64 const aquiferWaterPhaseDens, arrayView1d< real64 const > const & aquiferWaterPhaseCompFrac, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseDens, - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseDens, + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseDens, + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseDens, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac, arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac, - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > phaseCompFrac, - arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac, + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > phaseCompFrac, + arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac, arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens, real64 const dt, real64 ( &localFlux )[NC], @@ -2368,10 +2366,10 @@ struct AquiferBCKernel ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, real64 const timeAtBeginningOfStep, real64 const dt, CRSMatrixView< real64, globalIndex const > const & localMatrix, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp index 6cb7be8bd40..ac7d0e583b6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp @@ -40,8 +40,6 @@ namespace geos namespace reactiveCompositionalMultiphaseOBLKernels { -using namespace constitutive; - static constexpr real64 minValueForDivision = 1e-10; @@ -643,7 +641,7 @@ class FaceBasedAssemblyKernelBase fields::flow::OBLOperatorDerivatives >; using PermeabilityAccessors = - StencilMaterialAccessors< PermeabilityBase, + StencilMaterialAccessors< constitutive::PermeabilityBase, fields::permeability::permeability, fields::permeability::dPerm_dPressure >; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index cc7f9bb3a03..6a726ed5757 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -416,7 +416,7 @@ class SinglePhaseBase : public FlowSolverBase * * This function enables derived solvers to substitute SingleFluidBase for a different, * unrelated fluid class, and customize property extraction. For example, it is used by - * SinglePhaseProppantBase to allow using SlurryFluidBase, which does not inherit from + * SinglePhaseProppantBase to allow using constitutive::SlurryFluidBase, which does not inherit from * SingleFluidBase currently (but this design may need to be revised). */ virtual FluidPropViews getFluidProperties( constitutive::ConstitutiveBase const & fluid ) const; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp index fe0474e4cfd..d2b6f0db263 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp @@ -43,7 +43,6 @@ namespace geos namespace singlePhaseFVMKernels { -using namespace constitutive; /******************************** FaceBasedAssemblyKernelBase ********************************/ @@ -75,22 +74,22 @@ class FaceBasedAssemblyKernelBase fields::flow::dMobility_dPressure >; using SinglePhaseFluidAccessors = - StencilMaterialAccessors< SingleFluidBase, + StencilMaterialAccessors< constitutive::SingleFluidBase, fields::singlefluid::density, fields::singlefluid::dDensity_dPressure >; using SlurryFluidAccessors = - StencilMaterialAccessors< SlurryFluidBase, + StencilMaterialAccessors< constitutive::SlurryFluidBase, fields::singlefluid::density, fields::singlefluid::dDensity_dPressure >; using PermeabilityAccessors = - StencilMaterialAccessors< PermeabilityBase, + StencilMaterialAccessors< constitutive::PermeabilityBase, fields::permeability::permeability, fields::permeability::dPerm_dPressure >; using ProppantPermeabilityAccessors = - StencilMaterialAccessors< PermeabilityBase, + StencilMaterialAccessors< constitutive::PermeabilityBase, fields::permeability::permeability, fields::permeability::dPerm_dPressure, fields::permeability::dPerm_dDispJump, @@ -779,7 +778,7 @@ class DirichletFaceBasedAssemblyKernel : public FaceBasedAssemblyKernel< NUM_EQN // Get flow quantities on the elem/face real64 faceDens, faceVisc; - SingleFluidBaseUpdate::computeValues( m_fluidWrapper, m_facePres[kf], faceDens, faceVisc ); + constitutive::SingleFluidBaseUpdate::computeValues( m_fluidWrapper, m_facePres[kf], faceDens, faceVisc ); mobility[Order::ELEM] = m_mob[er][esr][ei]; singlePhaseBaseKernels::MobilityKernel::compute( faceDens, faceVisc, mobility[Order::FACE] ); @@ -899,7 +898,7 @@ class DirichletFaceBasedAssemblyKernelFactory FaceManager const & faceManager, ElementRegionManager const & elemManager, BoundaryStencilWrapper const & stencilWrapper, - SingleFluidBase & fluidBase, + constitutive::SingleFluidBase & fluidBase, real64 const & dt, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp index 0e484bf1902..30b8b288c56 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp @@ -28,9 +28,6 @@ namespace geos namespace stabilizedCompositionalMultiphaseFVMKernels { -using namespace constitutive; - - /******************************** FaceBasedAssemblyKernel ********************************/ /** @@ -67,12 +64,12 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne fields::flow::pressure_n >; using StabMultiFluidAccessors = - StencilMaterialAccessors< MultiFluidBase, + StencilMaterialAccessors< constitutive::MultiFluidBase, fields::multifluid::phaseDensity_n, fields::multifluid::phaseCompFraction_n >; using RelPermAccessors = - StencilMaterialAccessors< RelativePermeabilityBase, fields::relperm::phaseRelPerm_n >; + StencilMaterialAccessors< constitutive::RelativePermeabilityBase, fields::relperm::phaseRelPerm_n >; using AbstractBase::m_dt; using AbstractBase::m_numPhases; @@ -288,9 +285,9 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne /// Views on flow properties at the previous converged time step ElementViewConst< arrayView1d< real64 const > > const m_pres_n; - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const m_phaseDens_n; - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const m_phaseCompFrac_n; - ElementViewConst< arrayView3d< real64 const, relperm::USD_RELPERM > > const m_phaseRelPerm_n; + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseDens_n; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const m_phaseCompFrac_n; + ElementViewConst< arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > > const m_phaseRelPerm_n; /// Views on the macroelement indices and stab constant ElementViewConst< arrayView1d< integer const > > const m_macroElementIndex; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp index 272b27d8227..c2be6462655 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp @@ -28,8 +28,6 @@ namespace geos namespace stabilizedSinglePhaseFVMKernels { -using namespace constitutive; - /******************************** FaceBasedAssemblyKernel ********************************/ @@ -59,7 +57,7 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK fields::flow::pressure_n >; using StabSinglePhaseFluidAccessors = - StencilMaterialAccessors< SingleFluidBase, + StencilMaterialAccessors< constitutive::SingleFluidBase, fields::singlefluid::density_n >; using AbstractBase::m_dt; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp index 9f67629fb94..5bf8be65aaf 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -30,8 +30,6 @@ namespace geos namespace thermalCompositionalMultiphaseBaseKernels { -using namespace constitutive; - /******************************** PhaseVolumeFractionKernel ********************************/ @@ -57,7 +55,7 @@ class PhaseVolumeFractionKernel : public isothermalCompositionalMultiphaseBaseKe * @param[in] fluid the fluid model */ PhaseVolumeFractionKernel( ObjectManagerBase & subRegion, - MultiFluidBase const & fluid ) + constitutive::MultiFluidBase const & fluid ) : Base( subRegion, fluid ) {} @@ -68,10 +66,10 @@ class PhaseVolumeFractionKernel : public isothermalCompositionalMultiphaseBaseKe GEOS_HOST_DEVICE real64 compute( localIndex const ei ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const dPhaseFrac = m_dPhaseFrac[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseFrac = m_dPhaseFrac[ei][0]; arraySlice2d< real64, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; @@ -110,7 +108,7 @@ class PhaseVolumeFractionKernelFactory createAndLaunch( integer const numComp, integer const numPhase, ObjectManagerBase & subRegion, - MultiFluidBase const & fluid ) + constitutive::MultiFluidBase const & fluid ) { real64 maxDeltaPhaseVolFrac = 0.0; if( numPhase == 2 ) @@ -187,8 +185,8 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK globalIndex const rankOffset, string const dofKey, ElementSubRegionBase const & subRegion, - MultiFluidBase const & fluid, - CoupledSolidBase const & solid, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs, BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > const kernelFlags ) @@ -267,7 +265,7 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK void computeAccumulation( localIndex const ei, StackVariables & stack ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // start with old time step value stack.localResidual[numEqn-1] = -m_energy_n[ei]; @@ -288,12 +286,12 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseDens = m_phaseDens[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; - arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseInternalEnergy = m_phaseInternalEnergy[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseInternalEnergy = m_dPhaseInternalEnergy[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseDens = m_phaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; + arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseInternalEnergy = m_phaseInternalEnergy[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseInternalEnergy = m_dPhaseInternalEnergy[ei][0]; // Step 1: assemble the derivatives of the component mass balance equations with respect to temperature @@ -348,7 +346,7 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK void computeVolumeBalance( localIndex const ei, StackVariables & stack ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; Base::computeVolumeBalance( ei, stack, [&] ( real64 const & oneMinusPhaseVolFraction ) { @@ -384,8 +382,8 @@ class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseK arrayView2d< real64 const > const m_dPoro_dTemp; /// Views on phase internal energy - arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseInternalEnergy; - arrayView4d< real64 const, multifluid::USD_PHASE_DC > m_dPhaseInternalEnergy; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseInternalEnergy; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseInternalEnergy; /// Views on rock internal energy arrayView2d< real64 const > m_rockInternalEnergy; @@ -424,8 +422,8 @@ class ElementBasedAssemblyKernelFactory integer const useTotalMassEquation, string const dofKey, ElementSubRegionBase const & subRegion, - MultiFluidBase const & fluid, - CoupledSolidBase const & solid, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { @@ -855,9 +853,9 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > integer const numComponents, integer const numPhases, ElementSubRegionBase const & subRegion, - MultiFluidBase const & fluid, - CoupledSolidBase const & solid, - SolidInternalEnergy const & solidInternalEnergy, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + constitutive::SolidInternalEnergy const & solidInternalEnergy, real64 const minNormalizer ) : Base( rankOffset, localResidual, @@ -972,9 +970,9 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > /// View on phase properties at the previous converged time step arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFrac_n; - arrayView2d< real64 const, multifluid::USD_FLUID > const m_totalDens_n; - arrayView3d< real64 const, multifluid::USD_PHASE > const m_phaseDens_n; - arrayView3d< real64 const, multifluid::USD_PHASE > const m_phaseInternalEnergy_n; + arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > const m_totalDens_n; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseDens_n; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseInternalEnergy_n; /// View on solid properties at the previous converged time step arrayView2d< real64 const > const m_solidInternalEnergy_n; @@ -1013,9 +1011,9 @@ class ResidualNormKernelFactory string const & dofKey, arrayView1d< real64 const > const & localResidual, ElementSubRegionBase const & subRegion, - MultiFluidBase const & fluid, - CoupledSolidBase const & solid, - SolidInternalEnergy const & solidInternalEnergy, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + constitutive::SolidInternalEnergy const & solidInternalEnergy, real64 const minNormalizer, real64 (& residualNorm)[2], real64 (& residualNormalizer)[2] ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp index 8b9de7e2650..795aaad63cb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp @@ -31,8 +31,6 @@ namespace geos namespace thermalCompositionalMultiphaseFVMKernels { -using namespace constitutive; - /******************************** PhaseMobilityKernel ********************************/ /** @@ -63,8 +61,8 @@ class PhaseMobilityKernel : public isothermalCompositionalMultiphaseFVMKernels:: * @param[in] relperm the relperm model */ PhaseMobilityKernel( ObjectManagerBase & subRegion, - MultiFluidBase const & fluid, - RelativePermeabilityBase const & relperm ) + constitutive::MultiFluidBase const & fluid, + constitutive::RelativePermeabilityBase const & relperm ) : Base( subRegion, fluid, relperm ) {} @@ -76,13 +74,13 @@ class PhaseMobilityKernel : public isothermalCompositionalMultiphaseFVMKernels:: inline void compute( localIndex const ei ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const phaseVisc = m_phaseVisc[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const dPhaseVisc = m_dPhaseVisc[ei][0]; - arraySlice2d< real64 const, relperm::USD_RELPERM_DS - 2 > const dPhaseRelPerm_dPhaseVolFrac = m_dPhaseRelPerm_dPhaseVolFrac[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseVisc = m_phaseVisc[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseVisc = m_dPhaseVisc[ei][0]; + arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > const dPhaseRelPerm_dPhaseVolFrac = m_dPhaseRelPerm_dPhaseVolFrac[ei][0]; arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; Base::compute( ei, [&] ( localIndex const ip, @@ -125,8 +123,8 @@ class PhaseMobilityKernelFactory createAndLaunch( integer const numComp, integer const numPhase, ObjectManagerBase & subRegion, - MultiFluidBase const & fluid, - RelativePermeabilityBase const & relperm ) + constitutive::MultiFluidBase const & fluid, + constitutive::RelativePermeabilityBase const & relperm ) { if( numPhase == 2 ) { @@ -213,12 +211,12 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne StencilAccessors< fields::flow::temperature >; using ThermalMultiFluidAccessors = - StencilMaterialAccessors< MultiFluidBase, + StencilMaterialAccessors< constitutive::MultiFluidBase, fields::multifluid::phaseEnthalpy, fields::multifluid::dPhaseEnthalpy >; using ThermalConductivityAccessors = - StencilMaterialAccessors< MultiPhaseThermalConductivityBase, + StencilMaterialAccessors< constitutive::MultiPhaseThermalConductivityBase, fields::thermalconductivity::effectiveConductivity >; // for now, we treat thermal conductivity explicitly @@ -305,7 +303,7 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne void computeFlux( localIndex const iconn, StackVariables & stack ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // *********************************************** // First, we call the base computeFlux to compute: @@ -416,9 +414,9 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne // Step 3.2: compute the derivative of component flux wrt temperature // slice some constitutive arrays to avoid too much indexing in component loop - arraySlice1d< real64 const, multifluid::USD_PHASE_COMP - 3 > phaseCompFracSub = + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 3 > phaseCompFracSub = m_phaseCompFrac[er_up][esr_up][ei_up][0][ip]; - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP_DC - 3 > dPhaseCompFracSub = + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 3 > dPhaseCompFracSub = m_dPhaseCompFrac[er_up][esr_up][ei_up][0][ip]; for( integer ic = 0; ic < numComp; ++ic ) @@ -588,8 +586,8 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne ElementViewConst< arrayView1d< real64 const > > const m_temp; /// Views on phase enthalpies - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const m_phaseEnthalpy; - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const m_dPhaseEnthalpy; + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseEnthalpy; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseEnthalpy; /// View on thermal conductivity ElementViewConst< arrayView3d< real64 const > > const m_thermalConductivity; @@ -784,7 +782,7 @@ class DiffusionDispersionFaceBasedAssemblyKernel : void computeDiffusionFlux( localIndex const iconn, StackVariables & stack ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // *********************************************** // First, we call the base computeFlux to compute the diffusionFlux and its derivatives (including derivatives wrt temperature), @@ -856,7 +854,7 @@ class DiffusionDispersionFaceBasedAssemblyKernel : void computeDispersionFlux( localIndex const iconn, StackVariables & stack ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // *********************************************** // First, we call the base computeFlux to compute the dispersionFlux and its derivatives (including derivatives wrt temperature), @@ -1046,12 +1044,12 @@ class DirichletFaceBasedAssemblyKernel : public isothermalCompositionalMultiphas StencilAccessors< fields::flow::temperature >; using ThermalMultiFluidAccessors = - StencilMaterialAccessors< MultiFluidBase, + StencilMaterialAccessors< constitutive::MultiFluidBase, fields::multifluid::phaseEnthalpy, fields::multifluid::dPhaseEnthalpy >; using ThermalConductivityAccessors = - StencilMaterialAccessors< MultiPhaseThermalConductivityBase, + StencilMaterialAccessors< constitutive::MultiPhaseThermalConductivityBase, fields::thermalconductivity::effectiveConductivity >; // for now, we treat thermal conductivity explicitly @@ -1160,7 +1158,7 @@ class DirichletFaceBasedAssemblyKernel : public isothermalCompositionalMultiphas StackVariables & stack ) const { using Order = BoundaryStencil::Order; - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; // *********************************************** // First, we call the base computeFlux to compute: @@ -1177,8 +1175,8 @@ class DirichletFaceBasedAssemblyKernel : public isothermalCompositionalMultiphas localIndex const kf, real64 const f, // potGrad times trans real64 const facePhaseMob, - arraySlice1d< const real64, multifluid::USD_PHASE - 2 > const & facePhaseEnthalpy, - arraySlice2d< const real64, multifluid::USD_PHASE_COMP-2 > const & facePhaseCompFrac, + arraySlice1d< const real64, constitutive::multifluid::USD_PHASE - 2 > const & facePhaseEnthalpy, + arraySlice2d< const real64, constitutive::multifluid::USD_PHASE_COMP-2 > const & facePhaseCompFrac, real64 const phaseFlux, real64 const dPhaseFlux_dP, real64 const (&dPhaseFlux_dC)[numComp] ) @@ -1211,9 +1209,9 @@ class DirichletFaceBasedAssemblyKernel : public isothermalCompositionalMultiphas // Step 3.2.a: compute the derivative of component flux wrt temperature // slice some constitutive arrays to avoid too much indexing in component loop - arraySlice1d< real64 const, multifluid::USD_PHASE_COMP - 3 > phaseCompFracSub = + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 3 > phaseCompFracSub = m_phaseCompFrac[er][esr][ei][0][ip]; - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP_DC - 3 > dPhaseCompFracSub = + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 3 > dPhaseCompFracSub = m_dPhaseCompFrac[er][esr][ei][0][ip]; for( integer ic = 0; ic < numComp; ++ic ) @@ -1346,8 +1344,8 @@ class DirichletFaceBasedAssemblyKernel : public isothermalCompositionalMultiphas ElementViewConst< arrayView1d< real64 const > > const m_temp; /// Views on phase enthalpies - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const m_phaseEnthalpy; - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const m_dPhaseEnthalpy; + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseEnthalpy; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseEnthalpy; /// View on thermal conductivity ElementViewConst< arrayView3d< real64 const > > const m_thermalConductivity; @@ -1390,7 +1388,7 @@ class DirichletFaceBasedAssemblyKernelFactory FaceManager const & faceManager, ElementRegionManager const & elemManager, STENCILWRAPPER const & stencilWrapper, - MultiFluidBase & fluidBase, + constitutive::MultiFluidBase & fluidBase, real64 const dt, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp index d1759b86120..0ccb49617ac 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp @@ -30,8 +30,6 @@ namespace geos namespace thermalSinglePhaseFVMKernels { -using namespace constitutive; - /******************************** FaceBasedAssemblyKernel ********************************/ /** @@ -83,14 +81,14 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK fields::flow::dMobility_dTemperature >; using ThermalSinglePhaseFluidAccessors = - StencilMaterialAccessors< SingleFluidBase, + StencilMaterialAccessors< constitutive::SingleFluidBase, fields::singlefluid::dDensity_dTemperature, fields::singlefluid::enthalpy, fields::singlefluid::dEnthalpy_dPressure, fields::singlefluid::dEnthalpy_dTemperature >; using ThermalConductivityAccessors = - StencilMaterialAccessors< SinglePhaseThermalConductivityBase, + StencilMaterialAccessors< constitutive::SinglePhaseThermalConductivityBase, fields::thermalconductivity::effectiveConductivity >; /** @@ -533,14 +531,14 @@ class DirichletFaceBasedAssemblyKernel : public singlePhaseFVMKernels::Dirichlet fields::flow::dMobility_dTemperature >; using ThermalSinglePhaseFluidAccessors = - StencilMaterialAccessors< SingleFluidBase, + StencilMaterialAccessors< constitutive::SingleFluidBase, fields::singlefluid::dDensity_dTemperature, fields::singlefluid::enthalpy, fields::singlefluid::dEnthalpy_dPressure, fields::singlefluid::dEnthalpy_dTemperature >; using ThermalConductivityAccessors = - StencilMaterialAccessors< SinglePhaseThermalConductivityBase, + StencilMaterialAccessors< constitutive::SinglePhaseThermalConductivityBase, fields::thermalconductivity::effectiveConductivity >; /** @@ -778,7 +776,7 @@ class DirichletFaceBasedAssemblyKernelFactory FaceManager const & faceManager, ElementRegionManager const & elemManager, BoundaryStencilWrapper const & stencilWrapper, - SingleFluidBase & fluidBase, + constitutive::SingleFluidBase & fluidBase, real64 const & dt, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp index 7ff85e5ac44..75769763fed 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp @@ -40,8 +40,6 @@ namespace geos namespace proppantTransportKernels { -using namespace constitutive; - /******************************** FluidUpdateKernel ********************************/ struct FluidUpdateKernel @@ -191,7 +189,7 @@ struct FluxKernel fields::elementAperture >; using ParticleFluidAccessors = - StencilMaterialAccessors< ParticleFluidBase, + StencilMaterialAccessors< constitutive::ParticleFluidBase, fields::particlefluid::settlingFactor, fields::particlefluid::dSettlingFactor_dPressure, fields::particlefluid::dSettlingFactor_dProppantConcentration, @@ -200,7 +198,7 @@ struct FluxKernel fields::particlefluid::dCollisionFactor_dProppantConcentration >; using SlurryFluidAccessors = - StencilMaterialAccessors< SlurryFluidBase, + StencilMaterialAccessors< constitutive::SlurryFluidBase, fields::singlefluid::density, fields::singlefluid::dDensity_dPressure, fields::slurryfluid::dDensity_dProppantConcentration, @@ -217,12 +215,12 @@ struct FluxKernel fields::slurryfluid::dFluidDensity_dComponentConcentration >; using CellBasedFluxSlurryFluidAccessors = - StencilMaterialAccessors< SlurryFluidBase, + StencilMaterialAccessors< constitutive::SlurryFluidBase, fields::singlefluid::density, fields::singlefluid::viscosity >; using PermeabilityAccessors = - StencilMaterialAccessors< PermeabilityBase, + StencilMaterialAccessors< constitutive::PermeabilityBase, fields::permeability::permeability, fields::permeability::permeabilityMultiplier >; @@ -362,10 +360,10 @@ struct ProppantPackVolumeKernel fields::proppant::isProppantBoundary >; using ParticleFluidAccessors = - StencilMaterialAccessors< ParticleFluidBase, fields::particlefluid::settlingFactor >; + StencilMaterialAccessors< constitutive::ParticleFluidBase, fields::particlefluid::settlingFactor >; using SlurryFluidAccessors = - StencilMaterialAccessors< SlurryFluidBase, + StencilMaterialAccessors< constitutive::SlurryFluidBase, fields::singlefluid::density, fields::slurryfluid::fluidDensity, fields::slurryfluid::fluidViscosity >; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp index 809751a6b8c..5f25f370274 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp @@ -26,6 +26,7 @@ namespace geos { +using namespace constitutive; namespace compositionalMultiphaseWellKernels { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp index 9b00a436c37..48de11b7987 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp @@ -43,8 +43,6 @@ namespace geos namespace compositionalMultiphaseWellKernels { -using namespace constitutive; - static constexpr real64 minDensForDivision = 1e-10; // tag to access well and reservoir elements in perforation rates computation @@ -242,7 +240,7 @@ struct PerforationKernel fields::flow::dGlobalCompFraction_dGlobalCompDensity >; using MultiFluidAccessors = - StencilMaterialAccessors< MultiFluidBase, + StencilMaterialAccessors< constitutive::MultiFluidBase, fields::multifluid::phaseDensity, fields::multifluid::dPhaseDensity, fields::multifluid::phaseViscosity, @@ -251,7 +249,7 @@ struct PerforationKernel fields::multifluid::dPhaseCompFraction >; using RelPermAccessors = - StencilMaterialAccessors< RelativePermeabilityBase, + StencilMaterialAccessors< constitutive::RelativePermeabilityBase, fields::relperm::phaseRelPerm, fields::relperm::dPhaseRelPerm_dPhaseVolFraction >; @@ -276,14 +274,14 @@ struct PerforationKernel arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & resPhaseVolFrac, arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const & dResPhaseVolFrac, arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const & dResCompFrac_dCompDens, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const & resPhaseDens, - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const & dResPhaseDens, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const & resPhaseVisc, - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const & dResPhaseVisc, - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > const & resPhaseCompFrac, - arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > const & dResPhaseCompFrac, - arraySlice1d< real64 const, relperm::USD_RELPERM - 2 > const & resPhaseRelPerm, - arraySlice2d< real64 const, relperm::USD_RELPERM_DS - 2 > const & dResPhaseRelPerm_dPhaseVolFrac, + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const & resPhaseDens, + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const & dResPhaseDens, + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const & resPhaseVisc, + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const & dResPhaseVisc, + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > const & resPhaseCompFrac, + arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > const & dResPhaseCompFrac, + arraySlice1d< real64 const, constitutive::relperm::USD_RELPERM - 2 > const & resPhaseRelPerm, + arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > const & dResPhaseRelPerm_dPhaseVolFrac, real64 const & wellElemGravCoef, real64 const & wellElemPres, arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & wellElemCompDens, @@ -306,14 +304,14 @@ struct PerforationKernel ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & resPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dResPhaseVolFrac_dComp, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dResCompFrac_dCompDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & resPhaseDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dResPhaseDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & resPhaseVisc, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dResPhaseVisc, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & resPhaseCompFrac, - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dResPhaseCompFrac, - ElementViewConst< arrayView3d< real64 const, relperm::USD_RELPERM > > const & resPhaseRelPerm, - ElementViewConst< arrayView4d< real64 const, relperm::USD_RELPERM_DS > > const & dResPhaseRelPerm_dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & resPhaseDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dResPhaseDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & resPhaseVisc, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dResPhaseVisc, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & resPhaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dResPhaseCompFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > > const & resPhaseRelPerm, + ElementViewConst< arrayView4d< real64 const, constitutive::relperm::USD_RELPERM_DS > > const & dResPhaseRelPerm_dPhaseVolFrac, arrayView1d< real64 const > const & wellElemGravCoef, arrayView1d< real64 const > const & wellElemPres, arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompDens, @@ -351,13 +349,13 @@ struct AccumulationKernel arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFrac, arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const & dPhaseVolFrac, arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const & dCompFrac_dCompDens, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const & phaseDens, - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const & dPhaseDens, - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > const & phaseCompFrac, - arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > const & dPhaseCompFrac, + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const & phaseDens, + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const & dPhaseDens, + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > const & phaseCompFrac, + arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > const & dPhaseCompFrac, arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFrac_n, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const & phaseDens_n, - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > const & phaseCompFrac_n, + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const & phaseDens_n, + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > const & phaseCompFrac_n, real64 ( &localAccum )[NC], real64 ( &localAccumJacobian )[NC][NC + 1] ); @@ -373,13 +371,13 @@ struct AccumulationKernel arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac, arrayView3d< real64 const, compflow::USD_PHASE_DC > const & dWellElemPhaseVolFrac, arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens, - arrayView3d< real64 const, multifluid::USD_PHASE > const & wellElemPhaseDens, - arrayView4d< real64 const, multifluid::USD_PHASE_DC > const & dWellElemPhaseDens, - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac, - arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > const & dWellElemPhaseCompFrac, + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const & wellElemPhaseDens, + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > const & dWellElemPhaseDens, + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac, + arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > const & dWellElemPhaseCompFrac, arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac_n, - arrayView3d< real64 const, multifluid::USD_PHASE > const & wellElemPhaseDens_n, - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac_n, + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const & wellElemPhaseDens_n, + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac_n, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ); @@ -431,7 +429,7 @@ struct PresTempCompFracInitializationKernel fields::flow::phaseVolumeFraction >; using MultiFluidAccessors = - StencilMaterialAccessors< MultiFluidBase, + StencilMaterialAccessors< constitutive::MultiFluidBase, fields::multifluid::phaseMassDensity >; @@ -457,7 +455,7 @@ struct PresTempCompFracInitializationKernel ElementViewConst< arrayView1d< real64 const > > const & resTemp, ElementViewConst< arrayView2d< real64 const, compflow::USD_COMP > > const & resCompDens, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & resPhaseVolFrac, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & resPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & resPhaseMassDens, arrayView1d< localIndex const > const & resElementRegion, arrayView1d< localIndex const > const & resElementSubRegion, arrayView1d< localIndex const > const & resElementIndex, @@ -478,7 +476,7 @@ struct CompDensInitializationKernel launch( localIndex const subRegionSize, integer const numComponents, arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompFrac, - arrayView2d< real64 const, multifluid::USD_FLUID > const & wellElemTotalDens, + arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > const & wellElemTotalDens, arrayView2d< real64, compflow::USD_COMP > const & wellElemCompDens ); }; @@ -493,8 +491,8 @@ struct RateInitializationKernel integer const targetPhaseIndex, WellControls const & wellControls, real64 const & currentTime, - arrayView3d< real64 const, multifluid::USD_PHASE > const & phaseDens, - arrayView2d< real64 const, multifluid::USD_FLUID > const & totalDens, + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const & phaseDens, + arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > const & totalDens, arrayView1d< real64 > const & connRate ); }; @@ -525,7 +523,7 @@ class TotalMassDensityKernel : public isothermalCompositionalMultiphaseBaseKerne * @param[in] fluid the fluid model */ TotalMassDensityKernel( ObjectManagerBase & subRegion, - MultiFluidBase const & fluid ) + constitutive::MultiFluidBase const & fluid ) : Base(), m_phaseVolFrac( subRegion.getField< fields::well::phaseVolumeFraction >() ), m_dPhaseVolFrac( subRegion.getField< fields::well::dPhaseVolumeFraction >() ), @@ -549,13 +547,13 @@ class TotalMassDensityKernel : public isothermalCompositionalMultiphaseBaseKerne void compute( localIndex const ei, FUNC && totalMassDensityKernelOp = NoOpFunc{} ) const { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseMassDens = m_phaseMassDens[ei][0]; - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseMassDens = m_dPhaseMassDens[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseMassDens = m_phaseMassDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseMassDens = m_dPhaseMassDens[ei][0]; real64 & totalMassDens = m_totalMassDens[ei]; real64 & dTotalMassDens_dPres = m_dTotalMassDens_dPres[ei]; arraySlice1d< real64, compflow::USD_FLUID_DC - 1 > dTotalMassDens_dCompDens = m_dTotalMassDens_dCompDens[ei]; @@ -596,8 +594,8 @@ class TotalMassDensityKernel : public isothermalCompositionalMultiphaseBaseKerne arrayView3d< real64 const, compflow::USD_COMP_DC > m_dCompFrac_dCompDens; /// Views on phase mass densities - arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseMassDens; - arrayView4d< real64 const, multifluid::USD_PHASE_DC > m_dPhaseMassDens; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseMassDens; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseMassDens; // outputs @@ -628,7 +626,7 @@ class TotalMassDensityKernelFactory createAndLaunch( integer const numComp, integer const numPhase, ObjectManagerBase & subRegion, - MultiFluidBase const & fluid ) + constitutive::MultiFluidBase const & fluid ) { if( numPhase == 2 ) { @@ -675,7 +673,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > integer const numDof, integer const targetPhaseIndex, WellElementSubRegion const & subRegion, - MultiFluidBase const & fluid, + constitutive::MultiFluidBase const & fluid, WellControls const & wellControls, real64 const timeAtEndOfStep, real64 const dt, @@ -851,8 +849,8 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > arrayView1d< real64 const > const m_volume; /// View on phase/total density at the previous converged time step - arrayView3d< real64 const, multifluid::USD_PHASE > const m_phaseDens_n; - arrayView2d< real64 const, multifluid::USD_FLUID > const m_totalDens_n; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseDens_n; + arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > const m_totalDens_n; }; @@ -888,7 +886,7 @@ class ResidualNormKernelFactory string const & dofKey, arrayView1d< real64 const > const & localResidual, WellElementSubRegion const & subRegion, - MultiFluidBase const & fluid, + constitutive::MultiFluidBase const & fluid, WellControls const & wellControls, real64 const timeAtEndOfStep, real64 const dt, diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index bf6446aa0a6..0197591a1c8 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -50,10 +50,6 @@ ENUM_STRINGS( StabilizationType, "Local" ); } -using namespace stabilization; -using namespace fields; -using namespace constitutive; -using namespace dataRepository; template< typename FLOW_SOLVER, typename MECHANICS_SOLVER = SolidMechanicsLagrangianFEM > class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER > @@ -99,9 +95,9 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER this->registerWrapper( viewKeyStruct::stabilizationTypeString(), &m_stabilizationType ). setInputFlag( dataRepository::InputFlags::OPTIONAL ). setDescription( "StabilizationType. Options are:\n" + - toString( StabilizationType::None ) + "- Add no stabilization to mass equation \n" + - toString( StabilizationType::Global ) + "- Add jump stabilization to all faces \n" + - toString( StabilizationType::Local ) + "- Add jump stabilization on interior of macro elements" ); + toString( stabilization::StabilizationType::None ) + "- Add no stabilization to mass equation \n" + + toString( stabilization::StabilizationType::Global ) + "- Add jump stabilization to all faces \n" + + toString( stabilization::StabilizationType::Local ) + "- Add jump stabilization on interior of macro elements" ); this->registerWrapper( viewKeyStruct::stabilizationRegionNamesString(), &m_stabilizationRegionNames ). setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). @@ -129,12 +125,12 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER if( dynamic_cast< SurfaceElementSubRegion * >( &subRegion ) ) { subRegion.registerWrapper< string >( viewKeyStruct::hydraulicApertureRelationNameString() ). - setPlotLevel( PlotLevel::NOPLOT ). - setRestartFlags( RestartFlags::NO_WRITE ). + setPlotLevel( dataRepository::PlotLevel::NOPLOT ). + setRestartFlags( dataRepository::RestartFlags::NO_WRITE ). setSizedFromParent( 0 ); string & hydraulicApertureModelName = subRegion.getReference< string >( viewKeyStruct::hydraulicApertureRelationNameString() ); - hydraulicApertureModelName = SolverBase::getConstitutiveName< HydraulicApertureBase >( subRegion ); + hydraulicApertureModelName = SolverBase::getConstitutiveName< constitutive::HydraulicApertureBase >( subRegion ); GEOS_ERROR_IF( hydraulicApertureModelName.empty(), GEOS_FMT( "{}: HydraulicApertureBase model not found on subregion {}", this->getDataContext(), subRegion.getDataContext() ) ); } @@ -145,7 +141,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER { Base::initializePreSubGroups(); - GEOS_THROW_IF( m_stabilizationType == StabilizationType::Local, + GEOS_THROW_IF( m_stabilizationType == stabilization::StabilizationType::Local, this->getWrapperDataContext( viewKeyStruct::stabilizationTypeString() ) << ": Local stabilization has been temporarily disabled", InputError ); @@ -197,7 +193,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER flowSolver()->enableFixedStressPoromechanicsUpdate(); } - if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) + if( m_stabilizationType == stabilization::StabilizationType::Global || m_stabilizationType == stabilization::StabilizationType::Local ) { flowSolver()->enableJumpStabilization(); } @@ -230,7 +226,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER subRegion.registerField< fields::poromechanics::bulkDensity >( this->getName() ); } - if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) + if( m_stabilizationType == stabilization::StabilizationType::Global || m_stabilizationType == stabilization::StabilizationType::Local ) { subRegion.registerField< fields::flow::macroElementIndex >( this->getName()); subRegion.registerField< fields::flow::elementStabConstant >( this->getName()); @@ -245,7 +241,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER { flowSolver()->setKeepFlowVariablesConstantDuringInitStep( m_performStressInitialization ); - if( this->m_stabilizationType == StabilizationType::Global || this->m_stabilizationType == StabilizationType::Local ) + if( this->m_stabilizationType == stabilization::StabilizationType::Global || this->m_stabilizationType == stabilization::StabilizationType::Local ) { this->updateStabilizationParameters( domain ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index c11d8bab189..d2c9d984348 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -39,6 +39,7 @@ namespace geos using namespace constitutive; using namespace dataRepository; using namespace fields; +using namespace stabilization; template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::SinglePhasePoromechanics( const string & name, diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp index 11cc0032051..5b1ecfc36f4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp @@ -29,9 +29,6 @@ namespace geos namespace singlePhasePoromechanicsConformingFracturesKernels { -using namespace fluxKernelsHelper; -using namespace constitutive; - template< integer NUM_EQN, integer NUM_DOF > class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper > { @@ -51,7 +48,7 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; - using FracturePermeabilityAccessors = StencilMaterialAccessors< PermeabilityBase, + using FracturePermeabilityAccessors = StencilMaterialAccessors< constitutive::PermeabilityBase, fields::permeability::dPerm_dDispJump >; using AbstractBase::m_dt; @@ -193,21 +190,21 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse 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]* numDof] += m_dt * fluxVal; diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp index 421fbb99ea9..40067909e6b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -29,9 +29,6 @@ namespace geos namespace singlePhasePoromechanicsEmbeddedFracturesKernels { -using namespace fluxKernelsHelper; -using namespace constitutive; - template< integer NUM_EQN, integer NUM_DOF > class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper > { @@ -51,7 +48,7 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; - using FracturePermeabilityAccessors = StencilMaterialAccessors< PermeabilityBase, + using FracturePermeabilityAccessors = StencilMaterialAccessors< constitutive::PermeabilityBase, fields::permeability::dPerm_dDispJump >; using AbstractBase::m_dt; using AbstractBase::m_rankOffset; @@ -183,21 +180,21 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse real64 mobility = 0.0; real64 potGrad = 0.0; - 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 ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp index 99d5dca2107..3cf7cb0a08d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp @@ -28,9 +28,6 @@ namespace geos namespace thermalSinglePhasePoromechanicsConformingFracturesKernels { -using namespace fluxKernelsHelper; -using namespace constitutive; - template< integer NUM_EQN, integer NUM_DOF > class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsConformingFracturesKernels::ConnectorBasedAssemblyKernel< NUM_EQN, NUM_DOF > { @@ -50,7 +47,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsConformingFr using SinglePhaseFlowAccessors = SinglePhaseFVMAbstractBase::SinglePhaseFlowAccessors; using SinglePhaseFluidAccessors = SinglePhaseFVMAbstractBase::SinglePhaseFluidAccessors; using PermeabilityAccessors = SinglePhaseFVMAbstractBase::PermeabilityAccessors; - using FracturePermeabilityAccessors = StencilMaterialAccessors< PermeabilityBase, + using FracturePermeabilityAccessors = StencilMaterialAccessors< constitutive::PermeabilityBase, fields::permeability::dPerm_dDispJump >; using SinglePhaseFVMAbstractBase::m_dt; using SinglePhaseFVMAbstractBase::m_rankOffset; @@ -78,14 +75,14 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsConformingFr fields::flow::dMobility_dTemperature >; using ThermalSinglePhaseFluidAccessors = - StencilMaterialAccessors< SingleFluidBase, + StencilMaterialAccessors< constitutive::SingleFluidBase, fields::singlefluid::dDensity_dTemperature, fields::singlefluid::enthalpy, fields::singlefluid::dEnthalpy_dPressure, fields::singlefluid::dEnthalpy_dTemperature >; using ThermalConductivityAccessors = - StencilMaterialAccessors< SinglePhaseThermalConductivityBase, + StencilMaterialAccessors< constitutive::SinglePhaseThermalConductivityBase, fields::thermalconductivity::effectiveConductivity >; @@ -208,25 +205,25 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsConformingFr real64 trans[2] = {stack.transmissibility[0][0], stack.transmissibility[0][1]}; real64 dMassFlux_dT[2]{}; - computeEnthalpyFlux( seri, sesri, sei, - trans, - m_enthalpy, - m_dEnthalpy_dPres, - m_dEnthalpy_dTemp, - m_gravCoef, - m_dDens_dTemp, - m_dMob_dTemp, - alpha, - mobility, - potGrad, - massFlux, - dMassFlux_dTrans, - dMassFlux_dP, - dMassFlux_dT, - stack.energyFlux, - stack.dEnergyFlux_dTrans, - stack.dEnergyFlux_dP, - stack.dEnergyFlux_dT ); + fluxKernelsHelper::computeEnthalpyFlux( seri, sesri, sei, + trans, + m_enthalpy, + m_dEnthalpy_dPres, + m_dEnthalpy_dTemp, + m_gravCoef, + m_dDens_dTemp, + m_dMob_dTemp, + alpha, + mobility, + potGrad, + massFlux, + dMassFlux_dTrans, + dMassFlux_dP, + dMassFlux_dT, + stack.energyFlux, + stack.dEnergyFlux_dTrans, + stack.dEnergyFlux_dP, + stack.dEnergyFlux_dT ); // add dMassFlux_dT to localFluxJacobian for( integer ke = 0; ke < 2; ++ke ) @@ -263,7 +260,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsConformingFr localIndex const sei[2] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; // Step 2: compute temperature difference at the interface - computeConductiveFlux( seri, sesri, sei, m_temp, thermalTrans, stack.energyFlux, stack.dEnergyFlux_dT ); + fluxKernelsHelper::computeConductiveFlux( seri, sesri, sei, m_temp, thermalTrans, stack.energyFlux, stack.dEnergyFlux_dT ); // add energyFlux and its derivatives to localFlux and localFluxJacobian stack.localFlux[k[0]*numEqn + numEqn - 1] += m_dt * stack.energyFlux; diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp index 645e03b8088..1f099e4aac4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp @@ -28,9 +28,6 @@ namespace geos namespace thermalSinglePhasePoromechanicsEmbeddedFracturesKernels { -using namespace fluxKernelsHelper; -using namespace constitutive; - template< integer NUM_EQN, integer NUM_DOF > class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsEmbeddedFracturesKernels::ConnectorBasedAssemblyKernel< NUM_EQN, NUM_DOF > { @@ -50,7 +47,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsEmbeddedFrac using SinglePhaseFlowAccessors = SinglePhaseFVMAbstractBase::SinglePhaseFlowAccessors; using SinglePhaseFluidAccessors = SinglePhaseFVMAbstractBase::SinglePhaseFluidAccessors; using PermeabilityAccessors = SinglePhaseFVMAbstractBase::PermeabilityAccessors; - using FracturePermeabilityAccessors = StencilMaterialAccessors< PermeabilityBase, + using FracturePermeabilityAccessors = StencilMaterialAccessors< constitutive::PermeabilityBase, fields::permeability::dPerm_dDispJump >; using SinglePhaseFVMAbstractBase::m_dt; using SinglePhaseFVMAbstractBase::m_rankOffset; @@ -78,14 +75,14 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsEmbeddedFrac fields::flow::dMobility_dTemperature >; using ThermalSinglePhaseFluidAccessors = - StencilMaterialAccessors< SingleFluidBase, + StencilMaterialAccessors< constitutive::SingleFluidBase, fields::singlefluid::dDensity_dTemperature, fields::singlefluid::enthalpy, fields::singlefluid::dEnthalpy_dPressure, fields::singlefluid::dEnthalpy_dTemperature >; using ThermalConductivityAccessors = - StencilMaterialAccessors< SinglePhaseThermalConductivityBase, + StencilMaterialAccessors< constitutive::SinglePhaseThermalConductivityBase, fields::thermalconductivity::effectiveConductivity >; @@ -207,25 +204,25 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsEmbeddedFrac real64 trans[2] = {stack.transmissibility[0][0], stack.transmissibility[0][1]}; real64 dMassFlux_dT[2]{}; - computeEnthalpyFlux( seri, sesri, sei, - trans, - m_enthalpy, - m_dEnthalpy_dPres, - m_dEnthalpy_dTemp, - m_gravCoef, - m_dDens_dTemp, - m_dMob_dTemp, - alpha, - mobility, - potGrad, - massFlux, - dMassFlux_dTrans, - dMassFlux_dP, - dMassFlux_dT, - stack.energyFlux, - stack.dEnergyFlux_dTrans, - stack.dEnergyFlux_dP, - stack.dEnergyFlux_dT ); + fluxKernelsHelper::computeEnthalpyFlux( seri, sesri, sei, + trans, + m_enthalpy, + m_dEnthalpy_dPres, + m_dEnthalpy_dTemp, + m_gravCoef, + m_dDens_dTemp, + m_dMob_dTemp, + alpha, + mobility, + potGrad, + massFlux, + dMassFlux_dTrans, + dMassFlux_dP, + dMassFlux_dT, + stack.energyFlux, + stack.dEnergyFlux_dTrans, + stack.dEnergyFlux_dP, + stack.dEnergyFlux_dT ); for( localIndex i=0; i < 3; i++ ) { @@ -274,7 +271,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsEmbeddedFrac localIndex const sei[2] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; // Step 2: compute temperature difference at the interface - computeConductiveFlux( seri, sesri, sei, m_temp, thermalTrans, stack.energyFlux, stack.dEnergyFlux_dT ); + fluxKernelsHelper::computeConductiveFlux( seri, sesri, sei, m_temp, thermalTrans, stack.energyFlux, stack.dEnergyFlux_dT ); // add energyFlux and its derivatives to localFlux and localFluxJacobian stack.localFlux[k[0]*numEqn + numEqn - 1] += m_dt * stack.energyFlux; diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp index ce08a428544..161dec93ac1 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp @@ -32,8 +32,6 @@ namespace geos namespace surfaceGenerationKernels { -using namespace surfaceGenerationKernelsHelpers; - class NodalForceKernel { @@ -76,11 +74,11 @@ class NodalForceKernel { real64 const quadratureStress[6] = LVARRAY_TENSOROPS_INIT_LOCAL_6 ( m_stress[er][esr][m_solidMaterialFullIndex[er]][ei][q] ); real64 const dNdX[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3 ( m_dNdX[er][esr][ei][q][targetNode] ); - computeNodalForce( quadratureStress, dNdX, m_detJ[er][esr][ei][q], force ); + surfaceGenerationKernelsHelpers::computeNodalForce( quadratureStress, dNdX, m_detJ[er][esr][ei][q], force ); } //wu40: the nodal force need to be weighted by Young's modulus and possion's ratio. - scaleNodalForce( m_bulkModulus[er][esr][m_solidMaterialFullIndex[er]][ei], m_shearModulus[er][esr][m_solidMaterialFullIndex[er]][ei], force ); + surfaceGenerationKernelsHelpers::scaleNodalForce( m_bulkModulus[er][esr][m_solidMaterialFullIndex[er]][ei], m_shearModulus[er][esr][m_solidMaterialFullIndex[er]][ei], force ); } protected: @@ -142,11 +140,11 @@ class PoroElasticNodalForceKernel : public NodalForceKernel /// TODO: make it work for the thermal case as well LvArray::tensorOps::symAddIdentity< 3 >( totalStress, -m_biotCoefficient[er][esr][m_porosityMaterialFullIndex[er]][ei] * m_pressure[er][esr][ei] ); - computeNodalForce( totalStress, dNdX, m_detJ[er][esr][ei][q], force ); + surfaceGenerationKernelsHelpers::computeNodalForce( totalStress, dNdX, m_detJ[er][esr][ei][q], force ); } //wu40: the nodal force need to be weighted by Young's modulus and possion's ratio. - scaleNodalForce( m_bulkModulus[er][esr][m_solidMaterialFullIndex[er]][ei], m_shearModulus[er][esr][m_solidMaterialFullIndex[er]][ei], force ); + surfaceGenerationKernelsHelpers::scaleNodalForce( m_bulkModulus[er][esr][m_solidMaterialFullIndex[er]][ei], m_shearModulus[er][esr][m_solidMaterialFullIndex[er]][ei], force ); } private: diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp index e4de8b7d4ed..48f446f5fb9 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp @@ -27,7 +27,6 @@ namespace geos { -using namespace fields; /// Namespace to contain the acoustic wave kernels. namespace acousticVTIWaveEquationSEMKernels @@ -442,13 +441,13 @@ class ExplicitAcousticVTISEM : public finiteElement::KernelBase< SUBREGION_TYPE, finiteElementSpace, inputConstitutiveType ), m_nodeCoords( nodeManager.getField< fields::referencePosition32 >() ), - m_p_n( nodeManager.getField< acousticvtifields::Pressure_p_n >() ), - m_q_n( nodeManager.getField< acousticvtifields::Pressure_q_n >() ), - m_stiffnessVector_p( nodeManager.getField< acousticvtifields::StiffnessVector_p >() ), - m_stiffnessVector_q( nodeManager.getField< acousticvtifields::StiffnessVector_q >() ), - m_epsilon( elementSubRegion.template getField< acousticvtifields::Epsilon >() ), - m_delta( elementSubRegion.template getField< acousticvtifields::Delta >() ), - m_vti_f( elementSubRegion.template getField< acousticvtifields::F >() ), + m_p_n( nodeManager.getField< fields::acousticvtifields::Pressure_p_n >() ), + m_q_n( nodeManager.getField< fields::acousticvtifields::Pressure_q_n >() ), + m_stiffnessVector_p( nodeManager.getField< fields::acousticvtifields::StiffnessVector_p >() ), + m_stiffnessVector_q( nodeManager.getField< fields::acousticvtifields::StiffnessVector_q >() ), + m_epsilon( elementSubRegion.template getField< fields::acousticvtifields::Epsilon >() ), + m_delta( elementSubRegion.template getField< fields::acousticvtifields::Delta >() ), + m_vti_f( elementSubRegion.template getField< fields::acousticvtifields::F >() ), m_dt( dt ) { GEOS_UNUSED_VAR( edgeManager ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 77e3c55098a..d9eab26fe72 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -790,13 +790,13 @@ real64 AcousticWaveEquationSEM::explicitStepForward( real64 const & time_n, if( m_enableLifo ) { // Need to tell LvArray data is on GPU to avoir HtoD copy - p_dt2.move( MemorySpace::cuda, false ); + p_dt2.move( LvArray::MemorySpace::cuda, false ); m_lifo->pushAsync( p_dt2 ); } else { GEOS_MARK_SCOPE ( DirectWrite ); - p_dt2.move( MemorySpace::host, false ); + p_dt2.move( LvArray::MemorySpace::host, false ); int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); std::string fileName = GEOS_FMT( "lifo/rank_{:05}/pressuredt2_{:06}_{:08}.dat", rank, m_shotIndex, cycleNumber ); int lastDirSeparator = fileName.find_last_of( "/\\" ); @@ -873,7 +873,7 @@ real64 AcousticWaveEquationSEM::explicitStepBackward( real64 const & time_n, getDataContext() << ": Could not open file "<< fileName << " for reading", InputError ); - p_dt2.move( MemorySpace::host, true ); + p_dt2.move( LvArray::MemorySpace::host, true ); wf.read( (char *)&p_dt2[0], p_dt2.size()*sizeof( real32 ) ); wf.close( ); remove( fileName.c_str() ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp index 2b877c499eb..773df753ca0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp @@ -30,8 +30,6 @@ namespace geos { -using namespace fields; - /// Namespace to contain the acoustic wave kernels. namespace acousticWaveEquationSEMKernels { @@ -106,9 +104,9 @@ class ExplicitAcousticSEM : public finiteElement::KernelBase< SUBREGION_TYPE, finiteElementSpace, inputConstitutiveType ), m_nodeCoords( nodeManager.getField< fields::referencePosition32 >() ), - m_p_n( nodeManager.getField< acousticfields::Pressure_n >() ), - m_stiffnessVector( nodeManager.getField< acousticfields::StiffnessVector >() ), - m_density( elementSubRegion.template getField< acousticfields::AcousticDensity >() ), + m_p_n( nodeManager.getField< fields::acousticfields::Pressure_n >() ), + m_stiffnessVector( nodeManager.getField< fields::acousticfields::StiffnessVector >() ), + m_density( elementSubRegion.template getField< fields::acousticfields::AcousticDensity >() ), m_dt( dt ) { GEOS_UNUSED_VAR( edgeManager ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp index 21faecddff0..106afa53d02 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp @@ -27,7 +27,7 @@ namespace geos { -using namespace fields; + /// Namespace to contain the elastic wave kernels. namespace elasticVTIWaveEquationSEMKernels { @@ -100,18 +100,18 @@ class ExplicitElasticVTISEM : public finiteElement::KernelBase< SUBREGION_TYPE, finiteElementSpace, inputConstitutiveType ), m_nodeCoords( nodeManager.getField< fields::referencePosition32 >() ), - m_ux_n( nodeManager.getField< elasticfields::Displacementx_n >() ), - m_uy_n( nodeManager.getField< elasticfields::Displacementy_n >() ), - m_uz_n( nodeManager.getField< elasticfields::Displacementz_n >() ), - m_stiffnessVectorx( nodeManager.getField< elasticfields::StiffnessVectorx >() ), - m_stiffnessVectory( nodeManager.getField< elasticfields::StiffnessVectory >() ), - m_stiffnessVectorz( nodeManager.getField< elasticfields::StiffnessVectorz >() ), - m_density( elementSubRegion.template getField< elasticfields::ElasticDensity >() ), - m_velocityVp( elementSubRegion.template getField< elasticfields::ElasticVelocityVp >() ), - m_velocityVs( elementSubRegion.template getField< elasticfields::ElasticVelocityVs >() ), - m_gamma( elementSubRegion.template getField< elasticvtifields::Gamma >()), - m_epsilon( elementSubRegion.template getField< elasticvtifields::Epsilon >()), - m_delta( elementSubRegion.template getField< elasticvtifields::Delta >()), + m_ux_n( nodeManager.getField< fields::elasticfields::Displacementx_n >() ), + m_uy_n( nodeManager.getField< fields::elasticfields::Displacementy_n >() ), + m_uz_n( nodeManager.getField< fields::elasticfields::Displacementz_n >() ), + m_stiffnessVectorx( nodeManager.getField< fields::elasticfields::StiffnessVectorx >() ), + m_stiffnessVectory( nodeManager.getField< fields::elasticfields::StiffnessVectory >() ), + m_stiffnessVectorz( nodeManager.getField< fields::elasticfields::StiffnessVectorz >() ), + m_density( elementSubRegion.template getField< fields::elasticfields::ElasticDensity >() ), + m_velocityVp( elementSubRegion.template getField< fields::elasticfields::ElasticVelocityVp >() ), + m_velocityVs( elementSubRegion.template getField< fields::elasticfields::ElasticVelocityVs >() ), + m_gamma( elementSubRegion.template getField< fields::elasticvtifields::Gamma >()), + m_epsilon( elementSubRegion.template getField< fields::elasticvtifields::Epsilon >()), + m_delta( elementSubRegion.template getField< fields::elasticvtifields::Delta >()), m_dt( dt ) { GEOS_UNUSED_VAR( edgeManager ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp index a919d84f8c6..bdfe2482575 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp @@ -26,7 +26,7 @@ namespace geos { -using namespace fields; + /// Namespace to contain the elastic wave kernels. namespace elasticWaveEquationSEMKernels { @@ -51,7 +51,7 @@ namespace elasticWaveEquationSEMKernels template< typename SUBREGION_TYPE, typename CONSTITUTIVE_TYPE, typename FE_TYPE, - typename SX = elasticfields::StiffnessVectorx, typename SY = elasticfields::StiffnessVectory, typename SZ = elasticfields::StiffnessVectorz > + typename SX = fields::elasticfields::StiffnessVectorx, typename SY = fields::elasticfields::StiffnessVectory, typename SZ = fields::elasticfields::StiffnessVectorz > class ExplicitElasticSEMBase : public finiteElement::KernelBase< SUBREGION_TYPE, CONSTITUTIVE_TYPE, FE_TYPE, @@ -100,15 +100,15 @@ class ExplicitElasticSEMBase : public finiteElement::KernelBase< SUBREGION_TYPE, finiteElementSpace, inputConstitutiveType ), m_nodeCoords( nodeManager.getField< fields::referencePosition32 >() ), - m_ux_n( nodeManager.getField< elasticfields::Displacementx_n >() ), - m_uy_n( nodeManager.getField< elasticfields::Displacementy_n >() ), - m_uz_n( nodeManager.getField< elasticfields::Displacementz_n >() ), + m_ux_n( nodeManager.getField< fields::elasticfields::Displacementx_n >() ), + m_uy_n( nodeManager.getField< fields::elasticfields::Displacementy_n >() ), + m_uz_n( nodeManager.getField< fields::elasticfields::Displacementz_n >() ), m_stiffnessVectorx( nodeManager.getField< SX >() ), m_stiffnessVectory( nodeManager.getField< SY >() ), m_stiffnessVectorz( nodeManager.getField< SZ >() ), - m_density( elementSubRegion.template getField< elasticfields::ElasticDensity >() ), - m_velocityVp( elementSubRegion.template getField< elasticfields::ElasticVelocityVp >() ), - m_velocityVs( elementSubRegion.template getField< elasticfields::ElasticVelocityVs >() ), + m_density( elementSubRegion.template getField< fields::elasticfields::ElasticDensity >() ), + m_velocityVp( elementSubRegion.template getField< fields::elasticfields::ElasticVelocityVp >() ), + m_velocityVs( elementSubRegion.template getField< fields::elasticfields::ElasticVelocityVs >() ), m_dt( dt ) { GEOS_UNUSED_VAR( edgeManager ); @@ -273,9 +273,9 @@ template< typename SUBREGION_TYPE, class ExplicitElasticAttenuativeSEM : public ExplicitElasticSEMBase< SUBREGION_TYPE, CONSTITUTIVE_TYPE, FE_TYPE, - elasticfields::StiffnessVectorAx, - elasticfields::StiffnessVectorAy, - elasticfields::StiffnessVectorAz > + fields::elasticfields::StiffnessVectorAx, + fields::elasticfields::StiffnessVectorAy, + fields::elasticfields::StiffnessVectorAz > { public: @@ -283,9 +283,9 @@ class ExplicitElasticAttenuativeSEM : public ExplicitElasticSEMBase< SUBREGION_T using Base = ExplicitElasticSEMBase< SUBREGION_TYPE, CONSTITUTIVE_TYPE, FE_TYPE, - elasticfields::StiffnessVectorAx, - elasticfields::StiffnessVectorAy, - elasticfields::StiffnessVectorAz >; + fields::elasticfields::StiffnessVectorAx, + fields::elasticfields::StiffnessVectorAy, + fields::elasticfields::StiffnessVectorAz >; //***************************************************************************** /** @@ -313,8 +313,8 @@ class ExplicitElasticAttenuativeSEM : public ExplicitElasticSEMBase< SUBREGION_T finiteElementSpace, inputConstitutiveType, dt ), - m_qualityFactorP( elementSubRegion.template getField< elasticfields::ElasticQualityFactorP >() ), - m_qualityFactorS( elementSubRegion.template getField< elasticfields::ElasticQualityFactorS >() ) + m_qualityFactorP( elementSubRegion.template getField< fields::elasticfields::ElasticQualityFactorP >() ), + m_qualityFactorS( elementSubRegion.template getField< fields::elasticfields::ElasticQualityFactorS >() ) {} /** diff --git a/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp index 5817d6ea7be..943e5d5b985 100644 --- a/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp +++ b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp @@ -25,9 +25,6 @@ #include "constitutive/fluid/multifluid/MultiFluidFields.hpp" #include "constitutive/fluid/multifluid/MultiFluidSelector.hpp" -using namespace geos::dataRepository; -using namespace geos::constitutive; -using namespace geos::constitutive::multifluid; namespace geos { @@ -105,7 +102,7 @@ struct MultiFluidTestData }; template< typename FLUID_TYPE, integer NUM_PHASE, integer NUM_COMP > -class MultiFluidTest : public ConstitutiveTestBase< MultiFluidBase > +class MultiFluidTest : public ConstitutiveTestBase< constitutive::MultiFluidBase > { public: static constexpr integer numPhase = NUM_PHASE; @@ -116,16 +113,16 @@ class MultiFluidTest : public ConstitutiveTestBase< MultiFluidBase > MultiFluidTest() = default; ~MultiFluidTest() override = default; - MultiFluidBase & getFluid() const { return *m_model; } + constitutive::MultiFluidBase & getFluid() const { return *m_model; } - Group & getParent() { return m_parent; } + dataRepository::Group & getParent() { return m_parent; } void testValuesAgainstPreviousImplementation( typename FLUID_TYPE::KernelWrapper const & wrapper, MultiFluidTestData< NUM_PHASE, NUM_COMP > const & testData, real64 const relTol ) const; - void testNumericalDerivatives( MultiFluidBase & fluid, - Group * parent, + void testNumericalDerivatives( constitutive::MultiFluidBase & fluid, + dataRepository::Group * parent, MultiFluidTestData< NUM_PHASE, NUM_COMP > const & testData, real64 const perturbParameter, real64 const relTol, @@ -133,7 +130,7 @@ class MultiFluidTest : public ConstitutiveTestBase< MultiFluidBase > protected: - virtual void resetFluid( MultiFluidBase & fluid ) const + virtual void resetFluid( constitutive::MultiFluidBase & fluid ) const { GEOS_UNUSED_VAR( fluid ); } @@ -155,14 +152,14 @@ class MultiFluidTest : public ConstitutiveTestBase< MultiFluidBase > template< typename FLUID_TYPE, integer NUM_PHASE, integer NUM_COMP > void MultiFluidTest< FLUID_TYPE, NUM_PHASE, NUM_COMP >:: -testNumericalDerivatives( MultiFluidBase & fluid, - Group * parent, +testNumericalDerivatives( constitutive::MultiFluidBase & fluid, + dataRepository::Group * parent, MultiFluidTestData< NUM_PHASE, NUM_COMP > const & testData, real64 const perturbParameter, real64 const relTol, real64 const absTol ) { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; integer const NC = fluid.numFluidComponents(); integer const NP = fluid.numFluidPhases(); @@ -178,13 +175,13 @@ testNumericalDerivatives( MultiFluidBase & fluid, } arraySlice1d< real64 const, compflow::USD_COMP - 1 > const composition = compositionValues[0]; - auto const & components = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); - auto const & phases = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); + auto const & components = fluid.getReference< string_array >( constitutive::MultiFluidBase::viewKeyStruct::componentNamesString() ); + auto const & phases = fluid.getReference< string_array >( constitutive::MultiFluidBase::viewKeyStruct::phaseNamesString() ); // create a clone of the fluid to run updates on string const fluidCopyName = fluid.getName() + "Copy"; - std::unique_ptr< ConstitutiveBase > fluidCopyPtr = fluid.deliverClone( fluidCopyName, parent ); - MultiFluidBase & fluidCopy = dynamicCast< MultiFluidBase & >( *fluidCopyPtr ); + std::unique_ptr< constitutive::ConstitutiveBase > fluidCopyPtr = fluid.deliverClone( fluidCopyName, parent ); + constitutive::MultiFluidBase & fluidCopy = dynamicCast< constitutive::MultiFluidBase & >( *fluidCopyPtr ); fluid.allocateConstitutiveData( fluid.getParent(), 1 ); fluidCopy.allocateConstitutiveData( fluid.getParent(), 1 ); @@ -193,37 +190,37 @@ testNumericalDerivatives( MultiFluidBase & fluid, #define GET_FLUID_DATA( FLUID, TRAIT ) \ FLUID.getReference< TRAIT::type >( TRAIT::key() )[0][0] - MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseFrac { + constitutive::MultiFluidVarSlice< real64, 1, constitutive::multifluid::USD_PHASE - 2, constitutive::multifluid::USD_PHASE_DC - 2 > phaseFrac { GET_FLUID_DATA( fluid, fields::multifluid::phaseFraction ), GET_FLUID_DATA( fluid, fields::multifluid::dPhaseFraction ) }; - MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseDens { + constitutive::MultiFluidVarSlice< real64, 1, constitutive::multifluid::USD_PHASE - 2, constitutive::multifluid::USD_PHASE_DC - 2 > phaseDens { GET_FLUID_DATA( fluid, fields::multifluid::phaseDensity ), GET_FLUID_DATA( fluid, fields::multifluid::dPhaseDensity ) }; - MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseVisc { + constitutive::MultiFluidVarSlice< real64, 1, constitutive::multifluid::USD_PHASE - 2, constitutive::multifluid::USD_PHASE_DC - 2 > phaseVisc { GET_FLUID_DATA( fluid, fields::multifluid::phaseViscosity ), GET_FLUID_DATA( fluid, fields::multifluid::dPhaseViscosity ) }; - MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseEnthalpy { + constitutive::MultiFluidVarSlice< real64, 1, constitutive::multifluid::USD_PHASE - 2, constitutive::multifluid::USD_PHASE_DC - 2 > phaseEnthalpy { GET_FLUID_DATA( fluid, fields::multifluid::phaseEnthalpy ), GET_FLUID_DATA( fluid, fields::multifluid::dPhaseEnthalpy ) }; - MultiFluidVarSlice< real64, 1, USD_PHASE - 2, USD_PHASE_DC - 2 > phaseInternalEnergy { + constitutive::MultiFluidVarSlice< real64, 1, constitutive::multifluid::USD_PHASE - 2, constitutive::multifluid::USD_PHASE_DC - 2 > phaseInternalEnergy { GET_FLUID_DATA( fluid, fields::multifluid::phaseInternalEnergy ), GET_FLUID_DATA( fluid, fields::multifluid::dPhaseInternalEnergy ) }; - MultiFluidVarSlice< real64, 2, USD_PHASE_COMP - 2, USD_PHASE_COMP_DC - 2 > phaseCompFrac { + constitutive::MultiFluidVarSlice< real64, 2, constitutive::multifluid::USD_PHASE_COMP - 2, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > phaseCompFrac { GET_FLUID_DATA( fluid, fields::multifluid::phaseCompFraction ), GET_FLUID_DATA( fluid, fields::multifluid::dPhaseCompFraction ) }; - MultiFluidVarSlice< real64, 0, USD_FLUID - 2, USD_FLUID_DC - 2 > totalDens { + constitutive::MultiFluidVarSlice< real64, 0, constitutive::multifluid::USD_FLUID - 2, constitutive::multifluid::USD_FLUID_DC - 2 > totalDens { GET_FLUID_DATA( fluid, fields::multifluid::totalDensity ), GET_FLUID_DATA( fluid, fields::multifluid::dTotalDensity ) }; @@ -409,22 +406,22 @@ void MultiFluidTest< FLUID_TYPE, NUM_PHASE, NUM_COMP >::testValuesAgainstPreviou } arraySlice1d< real64 const, compflow::USD_COMP - 1 > const composition = compositionValues[0]; - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseFraction( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseFraction( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseDensity( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseDensity( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseMassDensity( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseMassDensity( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseViscosity( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseViscosity( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseEnthalpy( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseEnthalpy( 1, 1, numPhase, numDof ); - StackArray< real64, 3, numPhase, LAYOUT_PHASE > phaseInternalEnergy( 1, 1, numPhase ); - StackArray< real64, 4, numDof *numPhase, LAYOUT_PHASE_DC > dPhaseInternalEnergy( 1, 1, numPhase, numDof ); - StackArray< real64, 4, numComp *numPhase, LAYOUT_PHASE_COMP > phaseCompFraction( 1, 1, numPhase, numComp ); - StackArray< real64, 5, numDof *numComp *numPhase, LAYOUT_PHASE_COMP_DC > dPhaseCompFraction( 1, 1, numPhase, numComp, numDof ); - StackArray< real64, 2, 1, LAYOUT_FLUID > totalDensity( 1, 1 ); - StackArray< real64, 3, numDof, LAYOUT_FLUID_DC > dTotalDensity( 1, 1, numDof ); + StackArray< real64, 3, numPhase, constitutive::multifluid::LAYOUT_PHASE > phaseFraction( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, constitutive::multifluid::LAYOUT_PHASE_DC > dPhaseFraction( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, constitutive::multifluid::LAYOUT_PHASE > phaseDensity( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, constitutive::multifluid::LAYOUT_PHASE_DC > dPhaseDensity( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, constitutive::multifluid::LAYOUT_PHASE > phaseMassDensity( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, constitutive::multifluid::LAYOUT_PHASE_DC > dPhaseMassDensity( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, constitutive::multifluid::LAYOUT_PHASE > phaseViscosity( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, constitutive::multifluid::LAYOUT_PHASE_DC > dPhaseViscosity( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, constitutive::multifluid::LAYOUT_PHASE > phaseEnthalpy( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, constitutive::multifluid::LAYOUT_PHASE_DC > dPhaseEnthalpy( 1, 1, numPhase, numDof ); + StackArray< real64, 3, numPhase, constitutive::multifluid::LAYOUT_PHASE > phaseInternalEnergy( 1, 1, numPhase ); + StackArray< real64, 4, numDof *numPhase, constitutive::multifluid::LAYOUT_PHASE_DC > dPhaseInternalEnergy( 1, 1, numPhase, numDof ); + StackArray< real64, 4, numComp *numPhase, constitutive::multifluid::LAYOUT_PHASE_COMP > phaseCompFraction( 1, 1, numPhase, numComp ); + StackArray< real64, 5, numDof *numComp *numPhase, constitutive::multifluid::LAYOUT_PHASE_COMP_DC > dPhaseCompFraction( 1, 1, numPhase, numComp, numDof ); + StackArray< real64, 2, 1, constitutive::multifluid::LAYOUT_FLUID > totalDensity( 1, 1 ); + StackArray< real64, 3, numDof, constitutive::multifluid::LAYOUT_FLUID_DC > dTotalDensity( 1, 1, numDof ); wrapper.compute( testData.pressure, testData.temperature, diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp index 5df07a14155..bc017852419 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp @@ -24,6 +24,7 @@ using namespace geos; using namespace geos::testing; +using namespace geos::dataRepository; using namespace geos::constitutive; enum class BrineModelType : int {Phillips, Ezrokhi}; diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp index fe6c9453352..76c0ebd5b1e 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp @@ -23,6 +23,7 @@ using namespace geos; using namespace geos::testing; +using namespace geos::dataRepository; using namespace geos::constitutive; namespace geos diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp index 7921e3ec313..3b1059e79cd 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp @@ -23,6 +23,7 @@ using namespace geos; using namespace geos::testing; +using namespace geos::dataRepository; using namespace geos::constitutive; static constexpr char const * pvdgTableContent = "# Pg(Pa) Bg(m3/sm3) Visc(Pa.s)\n" diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp index f62078f4d39..c8896524a14 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp @@ -23,6 +23,7 @@ using namespace geos; using namespace geos::testing; +using namespace geos::dataRepository; using namespace geos::constitutive; static constexpr char const * pvdgTableContent = "# Pg(Pa) Bg(m3/sm3) Visc(Pa.s)\n" diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp index 595420857a2..4759403391b 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp @@ -33,9 +33,6 @@ namespace geos namespace testing { -using namespace geos::constitutive; -using namespace geos::constitutive::multifluid; - inline void fillNumericalJacobian( arrayView1d< real64 const > const & residual, arrayView1d< real64 const > const & residualOrig, @@ -114,7 +111,7 @@ void testCompositionNumericalDerivatives( CompositionalMultiphaseFVM & solver, SCOPED_TRACE( subRegion.getParent().getParent().getName() + "/" + subRegion.getName() ); string const & fluidName = subRegion.getReference< string >( CompositionalMultiphaseBase::viewKeyStruct::fluidNamesString() ); - MultiFluidBase const & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); + constitutive::MultiFluidBase const & fluid = subRegion.getConstitutiveModel< constitutive::MultiFluidBase >( fluidName ); arrayView1d< string const > const & components = fluid.componentNames(); arrayView2d< real64, compflow::USD_COMP > const compDens = @@ -181,7 +178,7 @@ void testPhaseVolumeFractionNumericalDerivatives( CompositionalMultiphaseFVM & s real64 const perturbParameter, real64 const relTol ) { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; integer const numComp = solver.numFluidComponents(); integer const numPhase = solver.numFluidPhases(); @@ -199,7 +196,7 @@ void testPhaseVolumeFractionNumericalDerivatives( CompositionalMultiphaseFVM & s SCOPED_TRACE( subRegion.getParent().getParent().getName() + "/" + subRegion.getName() ); string const & fluidName = subRegion.getReference< string >( CompositionalMultiphaseFVM::viewKeyStruct::fluidNamesString() ); - MultiFluidBase const & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); + constitutive::MultiFluidBase const & fluid = subRegion.getConstitutiveModel< constitutive::MultiFluidBase >( fluidName ); arrayView1d< string const > const & components = fluid.componentNames(); arrayView1d< string const > const & phases = fluid.phaseNames(); @@ -346,7 +343,7 @@ void testPhaseMobilityNumericalDerivatives( CompositionalMultiphaseFVM & solver, real64 const perturbParameter, real64 const relTol ) { - using Deriv = multifluid::DerivativeOffset; + using Deriv = constitutive::multifluid::DerivativeOffset; integer const numComp = solver.numFluidComponents(); integer const numPhase = solver.numFluidPhases(); @@ -364,7 +361,7 @@ void testPhaseMobilityNumericalDerivatives( CompositionalMultiphaseFVM & solver, SCOPED_TRACE( subRegion.getParent().getParent().getName() + "/" + subRegion.getName() ); string const & fluidName = subRegion.getReference< string >( CompositionalMultiphaseFVM::viewKeyStruct::fluidNamesString() ); - MultiFluidBase const & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); + constitutive::MultiFluidBase const & fluid = subRegion.getConstitutiveModel< constitutive::MultiFluidBase >( fluidName ); arrayView1d< string const > const & components = fluid.componentNames(); arrayView1d< string const > const & phases = fluid.phaseNames(); diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp index 115e6ef2d2a..fc0c28d223e 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp @@ -33,8 +33,6 @@ namespace geos namespace testing { -using namespace geos::constitutive; - void fillNumericalJacobian( arrayView1d< real64 const > const & residual, arrayView1d< real64 const > const & residualOrig, globalIndex const dofIndex, From ae4dde72e9900a377f41a28284fd1e9d1327f331 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 13 Aug 2024 06:57:03 -1000 Subject: [PATCH 161/286] docs: change GEOSX to GEOS in documentation (#3275) * replace GEOSX with GEOS in conf.py file * update http address for opening new issues --------- Co-authored-by: Matteo Cusini --- .github/ISSUE_TEMPLATE/bug-report.md | 2 +- src/conf.py | 16 ++++++++-------- src/coreComponents/LvArray | 2 +- .../viscoplasticity/DruckerPrager/Example.rst | 2 +- .../ExtendedDruckerPrager/Example.rst | 2 +- .../viscoplasticity/ModifiedCamClay/Example.rst | 2 +- .../ViscoDruckerPrager/Example.rst | 2 +- .../ViscoExtendedDruckerPrager/Example.rst | 2 +- .../ViscoModifiedCamClay/Example.rst | 2 +- .../casedContactElasticWellbore/Example.rst | 2 +- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index ab76d9288e3..b34012e1d8d 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -27,7 +27,7 @@ If applicable, add screenshots to help explain your problem. **Platform (please complete the following information):** - Machine [e.g. LLNL/Quartz] - Compiler: [e.g. gcc 8.1.0] -- GEOSX Version [e.g. 0.2] +- GEOS Version [e.g. 0.2] **Additional context** Add any other context about the problem here. diff --git a/src/conf.py b/src/conf.py index e54573753a0..bcc5a918a58 100644 --- a/src/conf.py +++ b/src/conf.py @@ -79,9 +79,9 @@ # -- Project information ----------------------------------------------------- -project = u'GEOSX' -copyright = u'2018-2021 Lawrence Livermore National Security, The Board of Trustees of the Leland Stanford Junior University, TotalEnergies, and GEOSX Contributors.' -author = u'GEOSX Contributors' +project = u'GEOS' +copyright = u'2016-2024 Lawrence Livermore National Security LLC, 2018-2024 Total, S.A, The Board of Trustees of the Leland Stanford Junior University, 2023-2024 Chevron, 2019- GEOS/GEOSX Contributors' +author = u'GEOS/GEOSX Contributors' # The short X.Y version version = u'' @@ -220,8 +220,8 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'GEOSX.tex', u'GEOSX Documentation', - u'Randolph Settgast', 'manual'), + (master_doc, 'GEOS.tex', u'GEOS Documentation', + u'GEOS/GEOSX Developers', 'manual'), ] @@ -230,7 +230,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'geosx', u'GEOSX Documentation', + (master_doc, 'geos', u'GEOS Documentation', [author], 1) ] @@ -241,8 +241,8 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'GEOSX', u'GEOSX Documentation', - author, 'GEOSX', 'One line description of project.', + (master_doc, 'GEOS', u'GEOS Documentation', + author, 'GEOS', 'GEOS simulation framework.', 'Miscellaneous'), ] diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 02ce362c009..69948929ca4 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 02ce362c009f11ddb2ade0286df23408d7334c4f +Subproject commit 69948929ca40acf490143fc020f72cd12d331f37 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/DruckerPrager/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/DruckerPrager/Example.rst index 7eec2c3f25c..e02f57bc2b7 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/DruckerPrager/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/DruckerPrager/Example.rst @@ -121,4 +121,4 @@ To go further **Feedback on this example** -For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ExtendedDruckerPrager/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ExtendedDruckerPrager/Example.rst index ceaf5963b8d..4c51b85d703 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ExtendedDruckerPrager/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ExtendedDruckerPrager/Example.rst @@ -126,4 +126,4 @@ To go further **Feedback on this example** -For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ModifiedCamClay/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ModifiedCamClay/Example.rst index b9c3d9a3a09..48760a4f70d 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ModifiedCamClay/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ModifiedCamClay/Example.rst @@ -97,4 +97,4 @@ To go further **Feedback on this example** -For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoDruckerPrager/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoDruckerPrager/Example.rst index ed576585670..323cef2e2fd 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoDruckerPrager/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoDruckerPrager/Example.rst @@ -112,4 +112,4 @@ To go further **Feedback on this example** -For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoExtendedDruckerPrager/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoExtendedDruckerPrager/Example.rst index 35c9cef1313..88fba339887 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoExtendedDruckerPrager/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoExtendedDruckerPrager/Example.rst @@ -112,4 +112,4 @@ To go further **Feedback on this example** -For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoModifiedCamClay/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoModifiedCamClay/Example.rst index 8972eed2f22..964ffbcbb2c 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoModifiedCamClay/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoModifiedCamClay/Example.rst @@ -103,4 +103,4 @@ To go further **Feedback on this example** -For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/Example.rst index 0fa899e49b3..7db478cad33 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/Example.rst @@ -149,4 +149,4 @@ To go further **Feedback on this example** This concludes the cased wellbore example. -For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. From f3eb4dccc4f27988adaffb6025460e9fc4ae883e Mon Sep 17 00:00:00 2001 From: Ryan Aronson Date: Tue, 13 Aug 2024 09:57:44 -0700 Subject: [PATCH 162/286] chore: Changing GEOSX to GEOS in external mesh import (#3278) * Changing GEOSX to GEOS in external mesh import * Update .integrated_tests.yaml * Update BASELINE_NOTES.md --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 ++++-- .../Class09Pb3/class09_pb3_benchmark.xml | 2 +- .../Class09Pb3/class09_pb3_benchmark_mc.xml | 2 +- .../Class09Pb3/class09_pb3_benchmark_mct.xml | 2 +- .../Egg/deadOilEggVTK_benchmark.xml | 2 +- .../benchmarks/Egg/deadOilEgg_benchmark.xml | 2 +- .../staircase_co2_wells_hybrid_3d.xml | 2 +- .../PoroElastic_hybridHexPrism_co2_base.xml | 2 +- .../smallEggModel/smallEggModel.xml | 2 +- .../PoroElastic_efem-edfm_eggModel_large.xml | 2 +- .../PoroElastic_efem-edfm_eggModel_small.xml | 2 +- .../verticalFault_ExternalMesh.vtm | 2 +- .../singlePhaseFlow/incompressible_pebi3d.xml | 2 +- ...moPoroElastic_efem-edfm_eggModel_small.xml | 2 +- .../generators/ExternalMeshGeneratorBase.cpp | 20 +++++++++---------- .../generators/ExternalMeshGeneratorBase.hpp | 16 +++++++-------- .../mesh/generators/MeshGeneratorBase.hpp | 8 ++++---- src/coreComponents/schema/docs/VTKMesh.rst | 4 ++-- 19 files changed, 42 insertions(+), 40 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 14a5dd73076..9b8f7b83af5 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3197-6679-a003f43 + baseline: integratedTests/baseline_integratedTests-pr3278-6753-f7f9add allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index be5e9d7d934..4eea0a9bfc9 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,9 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). -PR 3197 (2024-08-07) + + +PR 3278 (2024-08-12) ==================== -Separation of contact and friction laws. +Renamed GEOSX to GEOS in enternal mesh import, so rebaseline to change these names is the baselines. PR #3202 (2024-08-03) ====================== diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark.xml index d0c07591e87..dbc28b749b6 100644 --- a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark.xml +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_benchmark.xml @@ -16,7 +16,7 @@ logLevel="5" file="../../../../../GEOSDATA/DataSets/Class09_p3/Johansen_faces.vtu" fieldsToImport="{ perm, poro }" - fieldNamesInGEOSX="{ rockPerm_permeability, rockPorosity_referencePorosity }" > + fieldNamesInGEOS="{ rockPerm_permeability, rockPorosity_referencePorosity }" > + fieldNamesInGEOS="{ rockPerm_permeability, rockPorosity_referencePorosity }" > + fieldNamesInGEOS="{ rockPerm_permeability, rockPorosity_referencePorosity }" > + fieldNamesInGEOS="{ rockPerm_permeability }"> + fieldNamesInGEOS="{ rockPerm_permeability }"> diff --git a/inputFiles/poromechanics/PoroElastic_hybridHexPrism_co2_base.xml b/inputFiles/poromechanics/PoroElastic_hybridHexPrism_co2_base.xml index 865a4850f1a..26c4b973932 100644 --- a/inputFiles/poromechanics/PoroElastic_hybridHexPrism_co2_base.xml +++ b/inputFiles/poromechanics/PoroElastic_hybridHexPrism_co2_base.xml @@ -10,7 +10,7 @@ partitionMethod="ptscotch" scale="{ 50, 50, 50 }" fieldsToImport="{ PORO, NTG, DENSITY, BULKMOD }" - fieldNamesInGEOSX="{ rockPorosity_referencePorosity, netToGross, skeleton_density, skeleton_bulkModulus }" + fieldNamesInGEOS="{ rockPorosity_referencePorosity, netToGross, skeleton_density, skeleton_bulkModulus }" file="../singlePhaseFlow/pebi3d_with_properties.vtu"/> diff --git a/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml b/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml index caf219bb716..0ab2e1e9527 100755 --- a/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml +++ b/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml @@ -69,7 +69,7 @@ file="../../../GEOSDATA/DataSets/Egg/egg_withBurdens_small.vts" regionAttribute="elementRegionMarker" fieldsToImport="{ PERM }" - fieldNamesInGEOSX="{ rockPermeability_permeability }"/> + fieldNamesInGEOS="{ rockPermeability_permeability }"/> diff --git a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_large.xml b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_large.xml index 20566c84bac..506201fab18 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_large.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_large.xml @@ -63,7 +63,7 @@ file="../../../GEOSDATA/DataSets/Egg/egg_withBurdens_large.vts" regionAttribute="regionAttribute" fieldsToImport="{ PERM }" - fieldNamesInGEOSX="{ rockPermeability_permeability }"/> + fieldNamesInGEOS="{ rockPermeability_permeability }"/> diff --git a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_small.xml b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_small.xml index 074d11adb4e..3a8e2c869ad 100644 --- a/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_small.xml +++ b/inputFiles/poromechanicsFractures/PoroElastic_efem-edfm_eggModel_small.xml @@ -63,7 +63,7 @@ file="../../../GEOSDATA/DataSets/Egg/egg_withBurdens_small.vts" regionAttribute="elementRegionMarker" fieldsToImport="{ PERM }" - fieldNamesInGEOSX="{ rockPermeability_permeability }"/> + fieldNamesInGEOS="{ rockPermeability_permeability }"/> diff --git a/inputFiles/poromechanicsFractures/verticalFault_ExternalMesh.vtm b/inputFiles/poromechanicsFractures/verticalFault_ExternalMesh.vtm index 14785b5f2ab..abb0265a6ca 100644 --- a/inputFiles/poromechanicsFractures/verticalFault_ExternalMesh.vtm +++ b/inputFiles/poromechanicsFractures/verticalFault_ExternalMesh.vtm @@ -5,7 +5,7 @@ name="main" file="Domain_Mesh_FaultModel.vtu" fieldsToImport="{ YoungModulus, PoissonRatio }" - fieldNamesInGEOSX="{ rock_youngModulus, rock_poissonRatio }" + fieldNamesInGEOS="{ rock_youngModulus, rock_poissonRatio }" /> diff --git a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml index d2b84ef7de2..7b3d9723f66 100644 --- a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml +++ b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_efem-edfm_eggModel_small.xml @@ -66,7 +66,7 @@ file="../../../GEOSDATA/DataSets/Egg/egg_withBurdens_small.vts" regionAttribute="elementRegionMarker" fieldsToImport="{ PERM }" - fieldNamesInGEOSX="{ rockPermeability_permeability }"/> + fieldNamesInGEOS="{ rockPermeability_permeability }"/> diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp index b28cbdd405b..2392a89874b 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp @@ -46,20 +46,20 @@ ExternalMeshGeneratorBase::ExternalMeshGeneratorBase( string const & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Volumic fields to be imported from the external mesh file" ); - registerWrapper( viewKeyStruct::volumicFieldsInGEOSXString(), &m_volumicFieldsInGEOSX ). + registerWrapper( viewKeyStruct::volumicFieldsInGEOSString(), &m_volumicFieldsInGEOS ). setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Names of the volumic fields in GEOSX to import into" ); + setDescription( "Names of the volumic fields in GEOS to import into" ); registerWrapper( viewKeyStruct::surfacicFieldsToImportString(), &m_surfacicFieldsToImport ). setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Surfacic fields to be imported from the external mesh file" ); - registerWrapper( viewKeyStruct::surfacicFieldsInGEOSXString(), &m_surfacicFieldsInGEOSX ). + registerWrapper( viewKeyStruct::surfacicFieldsInGEOSString(), &m_surfacicFieldsInGEOS ). setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Names of the surfacic fields in GEOSX to import into" ); + setDescription( "Names of the surfacic fields in GEOS to import into" ); } void ExternalMeshGeneratorBase::postInputInitialization() @@ -73,8 +73,8 @@ void ExternalMeshGeneratorBase::postInputInitialization() " must contain the same number of values.", InputError ); }; - checkSizes( m_volumicFieldsToImport, m_volumicFieldsInGEOSX, viewKeyStruct::volumicFieldsToImportString(), viewKeyStruct::volumicFieldsInGEOSXString() ); - checkSizes( m_surfacicFieldsToImport, m_surfacicFieldsInGEOSX, viewKeyStruct::surfacicFieldsToImportString(), viewKeyStruct::surfacicFieldsInGEOSXString() ); + checkSizes( m_volumicFieldsToImport, m_volumicFieldsInGEOS, viewKeyStruct::volumicFieldsToImportString(), viewKeyStruct::volumicFieldsInGEOSString() ); + checkSizes( m_surfacicFieldsToImport, m_surfacicFieldsInGEOS, viewKeyStruct::surfacicFieldsToImportString(), viewKeyStruct::surfacicFieldsInGEOSString() ); auto const checkDuplicates = [this]( arrayView1d< string const > v, string const & key ) { @@ -86,8 +86,8 @@ void ExternalMeshGeneratorBase::postInputInitialization() "' already present in list of fields to import.", InputError ); }; - checkDuplicates( m_volumicFieldsInGEOSX, viewKeyStruct::volumicFieldsInGEOSXString() ); - checkDuplicates( m_surfacicFieldsInGEOSX, viewKeyStruct::surfacicFieldsInGEOSXString() ); + checkDuplicates( m_volumicFieldsInGEOS, viewKeyStruct::volumicFieldsInGEOSString() ); + checkDuplicates( m_surfacicFieldsInGEOS, viewKeyStruct::surfacicFieldsInGEOSString() ); // Building the fields mapping from the two separated input/output vectors. auto const buildMapping = [&]( arrayView1d< string const > from, @@ -101,8 +101,8 @@ void ExternalMeshGeneratorBase::postInputInitialization() return mapping; }; - MeshGeneratorBase::m_volumicFields = buildMapping( m_volumicFieldsToImport.toViewConst(), m_volumicFieldsInGEOSX.toViewConst() ); - MeshGeneratorBase::m_surfacicFields = buildMapping( m_surfacicFieldsToImport.toViewConst(), m_surfacicFieldsInGEOSX.toViewConst() ); + MeshGeneratorBase::m_volumicFields = buildMapping( m_volumicFieldsToImport.toViewConst(), m_volumicFieldsInGEOS.toViewConst() ); + MeshGeneratorBase::m_surfacicFields = buildMapping( m_surfacicFieldsToImport.toViewConst(), m_surfacicFieldsInGEOS.toViewConst() ); } } // namespace geos diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp index fe918574461..84ccc63eb69 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp @@ -49,9 +49,9 @@ class ExternalMeshGeneratorBase : public MeshGeneratorBase constexpr static char const * scaleString() { return "scale"; } constexpr static char const * translateString() { return "translate"; } constexpr static char const * volumicFieldsToImportString() { return "fieldsToImport"; } - constexpr static char const * volumicFieldsInGEOSXString() { return "fieldNamesInGEOSX"; } + constexpr static char const * volumicFieldsInGEOSString() { return "fieldNamesInGEOS"; } constexpr static char const * surfacicFieldsToImportString() { return "surfacicFieldsToImport"; } - constexpr static char const * surfacicFieldsInGEOSXString() { return "surfacicFieldsInGEOSX"; } + constexpr static char const * surfacicFieldsInGEOSString() { return "surfacicFieldsInGEOS"; } }; /// @endcond @@ -66,17 +66,17 @@ class ExternalMeshGeneratorBase : public MeshGeneratorBase /// Scale factor that will be applied to the point coordinates (after translation) R1Tensor m_scale; - /// Names of the fields to be copied from an external reader into GEOSX data structure + /// Names of the fields to be copied from an external reader into GEOS data structure array1d< string > m_volumicFieldsToImport; - /// String array of the GEOSX user declared volumic fields - array1d< string > m_volumicFieldsInGEOSX; + /// String array of the GEOS user declared volumic fields + array1d< string > m_volumicFieldsInGEOS; - /// Names of the surfacic fields to be copied from an external reader into GEOSX data structure + /// Names of the surfacic fields to be copied from an external reader into GEOS data structure array1d< string > m_surfacicFieldsToImport; - /// String array of the GEOSX user declared surfacic fields - array1d< string > m_surfacicFieldsInGEOSX; + /// String array of the GEOS user declared surfacic fields + array1d< string > m_surfacicFieldsInGEOS; }; } // namespace geos diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp index b7f8fbf2e2b..2c802fb332d 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp @@ -114,22 +114,22 @@ class MeshGeneratorBase : public dataRepository::Group virtual void freeResources() {} /** - * @brief Get the name mapping between mesh volumic field names and internal GEOSX volumic field names. + * @brief Get the name mapping between mesh volumic field names and internal GEOS volumic field names. * @return The string to string mapping of field names. */ std::map< string, string > const & getVolumicFieldsMapping() const { return m_volumicFields; } /** - * @brief Get the name mapping between mesh surfacic field names and internal GEOSX surfacic field names. + * @brief Get the name mapping between mesh surfacic field names and internal GEOS surfacic field names. * @return The string to string mapping of field names. */ std::map< string, string > const & getSurfacicFieldsMapping() const { return m_surfacicFields; } protected: - /// Mapping from volumic field source to GEOSX field. + /// Mapping from volumic field source to GEOS field. std::map< string, string > m_volumicFields; - /// Mapping from surfacic field source to GEOSX field. + /// Mapping from surfacic field source to GEOS field. std::map< string, string > m_surfacicFields; private: diff --git a/src/coreComponents/schema/docs/VTKMesh.rst b/src/coreComponents/schema/docs/VTKMesh.rst index 688b0d98319..3c6616c3087 100644 --- a/src/coreComponents/schema/docs/VTKMesh.rst +++ b/src/coreComponents/schema/docs/VTKMesh.rst @@ -4,7 +4,7 @@ Name Type Default Description ====================== ======================== ========= ============================================================================================================================================================================================================================================================================================================================================================================================================================================================================ faceBlocks groupNameRef_array {} For multi-block files, names of the face mesh block. -fieldNamesInGEOSX groupNameRef_array {} Names of the volumic fields in GEOSX to import into +fieldNamesInGEOS groupNameRef_array {} Names of the volumic fields in GEOS to import into fieldsToImport groupNameRef_array {} Volumic fields to be imported from the external mesh file file path required Path to the mesh file logLevel integer 0 Log level @@ -15,7 +15,7 @@ partitionMethod geos_vtk_PartitionMethod parmetis Method (library) used partitionRefinement integer 1 Number of partitioning refinement iterations (defaults to 1, recommended value).A value of 0 disables graph partitioning and keeps simple kd-tree partitions (not recommended). Values higher than 1 may lead to slightly improved partitioning, but yield diminishing returns. regionAttribute groupNameRef attribute Name of the VTK cell attribute to use as region marker scale R1Tensor {1,1,1} Scale the coordinates of the vertices by given scale factors (after translation) -surfacicFieldsInGEOSX groupNameRef_array {} Names of the surfacic fields in GEOSX to import into +surfacicFieldsInGEOS groupNameRef_array {} Names of the surfacic fields in GEOS to import into surfacicFieldsToImport groupNameRef_array {} Surfacic fields to be imported from the external mesh file translate R1Tensor {0,0,0} Translate the coordinates of the vertices by a given vector (prior to scaling) useGlobalIds integer 0 Controls the use of global IDs in the input file for cells and points. If set to 0 (default value), the GlobalId arrays in the input mesh are used if available, and generated otherwise. If set to a negative value, the GlobalId arrays in the input mesh are not used, and generated global Ids are automatically generated. If set to a positive value, the GlobalId arrays in the input mesh are used and required, and the simulation aborts if they are not available From c29c4ec474bc557282f69372f2518e833325f7d0 Mon Sep 17 00:00:00 2001 From: Oluwatobi-PM <72420996+Oluwatobi-PM@users.noreply.github.com> Date: Wed, 14 Aug 2024 10:12:47 -0700 Subject: [PATCH 163/286] docs: stress_and_pressure_initialization (#3249) * Updates to Gravity-Only Case * User-defined Initialization Case * Restructure examples into 2 folders * update python scripts * fix sphinx links * update xml files and add smoke tests * update rst file for gravity based model * Clean Up Figures --------- Co-authored-by: Oluwatobi Quadri Raji Co-authored-by: Jian HUANG Co-authored-by: Herve Gross <40979822+herve-gross@users.noreply.github.com> Co-authored-by: Oluwatobi Quadri Raji Co-authored-by: Randolph Settgast --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 11 +- ...avityInducedStress_initialization_base.xml | 155 +++ ...InducedStress_initialization_benchmark.xml | 47 + ...vityInducedStress_initialization_smoke.xml | 53 + inputFiles/initialization/initialization.ats | 27 + .../userTables/effectiveSigma_xx.csv | 2 + .../userTables/effectiveSigma_yy.csv | 2 + .../userTables/effectiveSigma_zz.csv | 2 + .../userTables/porePressure.csv | 2 + inputFiles/initialization/userTables/x.csv | 1 + inputFiles/initialization/userTables/y.csv | 1 + inputFiles/initialization/userTables/z.csv | 2 + .../userdefinedStress_initialization_base.xml | 228 ++++ ...definedStress_initialization_benchmark.xml | 47 + ...userdefinedStress_initialization_smoke.xml | 53 + .../multiphysics/docs/Initialization.rst | 14 + .../Example.rst | 232 ++++ .../effective_SZZ.png | Bin 0 -> 124426 bytes .../gravityInitializationFigure.py | 146 +++ .../mesh.png | Bin 0 -> 243009 bytes .../pressure_field.png | Bin 0 -> 453500 bytes .../simulation_result_0.csv | 1002 +++++++++++++++++ .../sketch_of_problem.png | Bin 0 -> 103181 bytes .../userTableStressInitialization/Example.rst | 116 ++ .../generateTable.py | 49 + .../pressure_field.png | Bin 0 -> 429924 bytes .../simulation_result_0.csv | 1002 +++++++++++++++++ .../stressZZ_field.png | Bin 0 -> 406723 bytes .../tableInitializationFigure.py | 153 +++ src/docs/sphinx/basicExamples/Index.rst | 1 + src/docs/sphinx/userGuide/Index.rst | 2 + 32 files changed, 3349 insertions(+), 3 deletions(-) create mode 100644 inputFiles/initialization/gravityInducedStress_initialization_base.xml create mode 100644 inputFiles/initialization/gravityInducedStress_initialization_benchmark.xml create mode 100644 inputFiles/initialization/gravityInducedStress_initialization_smoke.xml create mode 100644 inputFiles/initialization/initialization.ats create mode 100644 inputFiles/initialization/userTables/effectiveSigma_xx.csv create mode 100644 inputFiles/initialization/userTables/effectiveSigma_yy.csv create mode 100644 inputFiles/initialization/userTables/effectiveSigma_zz.csv create mode 100644 inputFiles/initialization/userTables/porePressure.csv create mode 100644 inputFiles/initialization/userTables/x.csv create mode 100644 inputFiles/initialization/userTables/y.csv create mode 100644 inputFiles/initialization/userTables/z.csv create mode 100644 inputFiles/initialization/userdefinedStress_initialization_base.xml create mode 100644 inputFiles/initialization/userdefinedStress_initialization_benchmark.xml create mode 100644 inputFiles/initialization/userdefinedStress_initialization_smoke.xml create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/Initialization.rst create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/Example.rst create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/effective_SZZ.png create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/mesh.png create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/pressure_field.png create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/simulation_result_0.csv create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/sketch_of_problem.png create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/Example.rst create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/generateTable.py create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/pressure_field.png create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/simulation_result_0.csv create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/stressZZ_field.png create mode 100644 src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/tableInitializationFigure.py diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 9b8f7b83af5..aa92ea9845d 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3278-6753-f7f9add + baseline: integratedTests/baseline_integratedTests-pr3249-6781-4998bc8 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 4eea0a9bfc9..ec3a090f405 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -8,14 +8,21 @@ These notes should be in reverse-chronological order, and use the following time -PR 3278 (2024-08-12) -==================== +PR #3249 (2024-08-14) +====================== +Two initialization options for poromechanical models. Rebaseline the corresponding cases. + + +PR #3278 (2024-08-12) +====================== Renamed GEOSX to GEOS in enternal mesh import, so rebaseline to change these names is the baselines. + PR #3202 (2024-08-03) ====================== Acoustic VTI tests needed rebaselining after update in source and receiver location algorithm. + PR #3215 (2024-07-23) ====================== Changed the default value for massCreation and name of the wrapper. diff --git a/inputFiles/initialization/gravityInducedStress_initialization_base.xml b/inputFiles/initialization/gravityInducedStress_initialization_base.xml new file mode 100644 index 00000000000..7a9ce532b27 --- /dev/null +++ b/inputFiles/initialization/gravityInducedStress_initialization_base.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/initialization/gravityInducedStress_initialization_benchmark.xml b/inputFiles/initialization/gravityInducedStress_initialization_benchmark.xml new file mode 100644 index 00000000000..921334e6944 --- /dev/null +++ b/inputFiles/initialization/gravityInducedStress_initialization_benchmark.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/initialization/gravityInducedStress_initialization_smoke.xml b/inputFiles/initialization/gravityInducedStress_initialization_smoke.xml new file mode 100644 index 00000000000..53dfbba70e7 --- /dev/null +++ b/inputFiles/initialization/gravityInducedStress_initialization_smoke.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/initialization/initialization.ats b/inputFiles/initialization/initialization.ats new file mode 100644 index 00000000000..3bb7cf04cab --- /dev/null +++ b/inputFiles/initialization/initialization.ats @@ -0,0 +1,27 @@ +import os +from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests + +restartcheck_params = {} +restartcheck_params["atol"] = 2.0E-4 +restartcheck_params["rtol"] = 1.0E-7 + +decks = [ + TestDeck( + name="gravityInducedStress_initialization_smoke", + description= + "model intialization with gravity induced stress", + partitions=((1, 1, 1), (2, 2, 1)), + restart_step=1, + check_step=2, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="userdefinedStress_initialization_smoke", + description= + "model intialization with user defined tables", + partitions=((1, 1, 1), (2, 2, 1)), + restart_step=1, + check_step=2, + restartcheck_params=RestartcheckParameters(**restartcheck_params)) +] + +generate_geos_tests(decks) diff --git a/inputFiles/initialization/userTables/effectiveSigma_xx.csv b/inputFiles/initialization/userTables/effectiveSigma_xx.csv new file mode 100644 index 00000000000..a1dca328d57 --- /dev/null +++ b/inputFiles/initialization/userTables/effectiveSigma_xx.csv @@ -0,0 +1,2 @@ +-7000000.00 +0.00 diff --git a/inputFiles/initialization/userTables/effectiveSigma_yy.csv b/inputFiles/initialization/userTables/effectiveSigma_yy.csv new file mode 100644 index 00000000000..d1f4f182344 --- /dev/null +++ b/inputFiles/initialization/userTables/effectiveSigma_yy.csv @@ -0,0 +1,2 @@ +-17000000.00 +0.00 diff --git a/inputFiles/initialization/userTables/effectiveSigma_zz.csv b/inputFiles/initialization/userTables/effectiveSigma_zz.csv new file mode 100644 index 00000000000..53910c07f32 --- /dev/null +++ b/inputFiles/initialization/userTables/effectiveSigma_zz.csv @@ -0,0 +1,2 @@ +-14000000.00 +0.00 diff --git a/inputFiles/initialization/userTables/porePressure.csv b/inputFiles/initialization/userTables/porePressure.csv new file mode 100644 index 00000000000..5e92619dc6a --- /dev/null +++ b/inputFiles/initialization/userTables/porePressure.csv @@ -0,0 +1,2 @@ +10000000.00 +0.00 diff --git a/inputFiles/initialization/userTables/x.csv b/inputFiles/initialization/userTables/x.csv new file mode 100644 index 00000000000..fb1088c65aa --- /dev/null +++ b/inputFiles/initialization/userTables/x.csv @@ -0,0 +1 @@ +0.00 diff --git a/inputFiles/initialization/userTables/y.csv b/inputFiles/initialization/userTables/y.csv new file mode 100644 index 00000000000..fb1088c65aa --- /dev/null +++ b/inputFiles/initialization/userTables/y.csv @@ -0,0 +1 @@ +0.00 diff --git a/inputFiles/initialization/userTables/z.csv b/inputFiles/initialization/userTables/z.csv new file mode 100644 index 00000000000..eb40c4056f7 --- /dev/null +++ b/inputFiles/initialization/userTables/z.csv @@ -0,0 +1,2 @@ +-1000.00 +0.00 diff --git a/inputFiles/initialization/userdefinedStress_initialization_base.xml b/inputFiles/initialization/userdefinedStress_initialization_base.xml new file mode 100644 index 00000000000..7d216b2786a --- /dev/null +++ b/inputFiles/initialization/userdefinedStress_initialization_base.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/initialization/userdefinedStress_initialization_benchmark.xml b/inputFiles/initialization/userdefinedStress_initialization_benchmark.xml new file mode 100644 index 00000000000..518b4a925a5 --- /dev/null +++ b/inputFiles/initialization/userdefinedStress_initialization_benchmark.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/initialization/userdefinedStress_initialization_smoke.xml b/inputFiles/initialization/userdefinedStress_initialization_smoke.xml new file mode 100644 index 00000000000..7dd0a6a9f76 --- /dev/null +++ b/inputFiles/initialization/userdefinedStress_initialization_smoke.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/Initialization.rst b/src/coreComponents/physicsSolvers/multiphysics/docs/Initialization.rst new file mode 100644 index 00000000000..a80e5152f58 --- /dev/null +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/Initialization.rst @@ -0,0 +1,14 @@ +.. _PoromechanicalInitialization: + +Poromechanical Models Intialization +=========================================== + +This section demonstrates the intializaton of poromechanical models in GEOS. + + +.. toctree:: + :maxdepth: 1 + + gravityInducedStressInitialization/Example + + userTableStressInitialization/Example diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/Example.rst b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/Example.rst new file mode 100644 index 00000000000..912f18a8828 --- /dev/null +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/Example.rst @@ -0,0 +1,232 @@ +.. _gravityinducedhydrostaticinitialization: + + +################################################################################# + Model Initialization: Hydrostatic and Mechanical Equilibrium +################################################################################# + + +**Context** + +Prior to simulating underground operations, it is necessary to run a few steps of a fully coupled geomechanical simulation to reach the equilibrium state. In this example, we perform a gravity-only stress initialization for a reservoir with a hydrostatic in-situ pressure. The problem is solved using a single-phase poromechanics solver (see :ref:`PoroelasticSolver`) and the HydrostaticEquilibrium initialization procedure (see :ref:`EquilibriumInitialCondition`) in GEOS to predict the initial state of stress with depth in the reservoir, subject to the reservoir rock properties and the prevailing hydrostatic pressure condition. This way, the poromechanical model is initialized at mechanical equilibrium and all displacements are set to zero after initialization. We verify numerical results obtained by GEOS against an analytical equation (Eaton's equation). + + +**Input file** + +The xml input files for the test case are located at: + +.. code-block:: console + + inputFiles/initialization/gravityInducedStress_initialization_base.xml + inputFiles/initialization/gravityInducedStress_initialization_benchmark.xml + + +A Python script for post-processing the simulation results is provided: + +.. code-block:: console + + src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py + + +------------------------------------------------------------------ +Description of the Case +------------------------------------------------------------------ + +We model the in-situ state of stress of a subsurface reservoir subject to a gravity-only induced stress and hydrostatic in-situ pressure condition. The domain is homogenous, isotropic and isothermal. The domain is subject to roller boundary conditions on lateral surfaces and at the base of the model, while the top of the model is a free surface. + +.. _problemSketch1InitializationTest: +.. figure:: sketch_of_problem.png + :align: center + :width: 300 + :figclass: align-center + + Sketch of the problem + + +We set up and solve a PoroMechanics model to obtain the gradient of total stresses (principal stress components) across the domain due to gravity effects and hydrostatic pressure only. These numerical predictions are compared with the analytical solutions derived from `Eaton et al. (1969, 1975) `__ + + + +For this example, we focus on the ``Mesh``, +the ``Constitutive``, and the ``FieldSpecifications`` tags. + + +------------------------------------------------------------------ +Mesh +------------------------------------------------------------------ + +The following figure shows the mesh used for solving this poromechanical problem: + +.. _problemSketch2InitializationTest: +.. figure:: mesh.png + :align: center + :width: 500 + :figclass: align-center + + Generated mesh + + +The mesh was created with the internal mesh generator and parametrized in the ``InternalMesh`` XML tag. +It contains 20x20x40 eight-node brick elements in the x, y, and z directions respectively. +Such eight-node hexahedral elements are defined as ``C3D8`` elementTypes, and their collection forms a mesh +with one group of cell blocks named here ``cellBlockNames``. + + +.. literalinclude:: ../../../../../../inputFiles/initialization/gravityInducedStress_initialization_benchmark.xml + :language: xml + :start-after: + :end-before: + + +------------------------ +Poro-Mechanics Solver +------------------------ + +For the initialization test, a hydrostatic pore pressure is imposed on the system. This is done using the Hydrostatic Equilibrium tag under Field Specifications. We then define a poro-mechanics solver called here poroSolve. +This solid mechanics solver (see :ref:`SolidMechanicsLagrangianFEM`) called ``lagSolve`` is based on the Lagrangian finite element formulation. +The problem is run as ``QuasiStatic`` without considering inertial effects. +The computational domain is discretized by ``FE1``, defined in the ``NumericalMethods`` section. +We use the ``targetRegions`` attribute to define the regions where the poromechanics solver is applied. +Since we only have one cellBlockName type called ``Domain``, the poromechanics solver is applied to every element of the model. +The flow solver for this problem (see :ref:`SinglePhaseFlow`) called ``SinglePhaseFlow`` is discretized by ``fluidTPFA``, defined in the ``NumericalMethods`` section. + +.. literalinclude:: ../../../../../../inputFiles/initialization/gravityInducedStress_initialization_base.xml + :language: xml + :start-after: + :end-before: + +.. literalinclude:: ../../../../../../inputFiles/initialization/gravityInducedStress_initialization_base.xml + :language: xml + :start-after: + :end-before: + + +------------------------------ +Constitutive Laws +------------------------------ + +A homogeneous domain with one solid material is assumed, and its mechanical and fluid properties are specified in the ``Constitutive`` section: + +.. literalinclude:: ../../../../../../inputFiles/initialization/gravityInducedStress_initialization_base.xml + :language: xml + :start-after: + :end-before: + + +As shown above, in the ``CellElementRegion`` section, +``rock`` is the solid material in the computational domain and ``water`` is the fluid material. +Here, Porous Elastic Isotropic model ``PorousElasticIsotropic`` is used to simulate the elastic behavior of ``rock``. +As for the solid material parameters, ``defaultDensity``, ``defaultPoissonRatio``, ``defaultYoungModulus``, ``grainBulkModulus``, ``defaultReferencePorosity``, and ``permeabilityComponents`` denote the rock density, Poisson ratio, Young modulus, grain bulk modulus, porosity, and permeability components respectively. In additon, the fluid property (``water``) of density, viscosity, compressibility and viscosibility are specified with ``defaultDensity``, ``defaultViscosity``, ``compressibility``, and ``viscosibility``. +All properties are specified in the International System of Units. + + +------------------------------ +Stress Initialization Function +------------------------------ + +In the ``Tasks`` section, ``SinglePhasePoromechanicsInitialization`` tasks are defined to initialize the model by calling the poro-mechanics solver ``poroSolve``. This task is used to determine stress gradients through designated densities and established constitutive relationships to maintain mechanical equilibrium and reset all initial displacements to zero following the initialization process. + +.. literalinclude:: ../../../../../../inputFiles/initialization/gravityInducedStress_initialization_base.xml + :language: xml + :start-after: + :end-before: + +The initialization is triggered into action using the ``Event`` management section, where the ``soloEvent`` function calls the task at the target time (in this case -1e10s). + +.. literalinclude:: ../../../../../../inputFiles/initialization/gravityInducedStress_initialization_benchmark.xml + :language: xml + :start-after: + :end-before: + +The ``PeriodicEvent`` function is used here to define recurring tasks that progress for a stipulated time during the simuation. We also use it in this example to save the vtkOuput results. + +.. literalinclude:: ../../../../../../inputFiles/initialization/gravityInducedStress_initialization_base.xml + :language: xml + :start-after: + :end-before: + +We use Paraview to extract the data from the vtkOutput files at the initialization time, and then use a Python script to read and plot the stress and pressure gradients for verification and visualization. + + + +----------------------------------- +Initial and Boundary Conditions +----------------------------------- + +The next step is to specify fields, including: + + - The initial value (hydrostatic equilibrium), + - The boundary conditions (the displacement control of the outer boundaries have to be set). + +In this problem, all outer boundaries of the domain are subject to roller constraints except the top of the model, left as a free surface. + +These boundary conditions are set up through the ``FieldSpecifications`` section. + +.. literalinclude:: ../../../../../../inputFiles/initialization/gravityInducedStress_initialization_base.xml + :language: xml + :start-after: + :end-before: + + +The parameters used in the simulation are summarized in the following table. + ++------------------+-------------------------+------------------+--------------------+ +| Symbol | Parameter | Unit | Value | ++==================+=========================+==================+====================+ +| :math:`E` | Young Modulus | [MPa] | 100 | ++------------------+-------------------------+------------------+--------------------+ +| :math:`v` | Poisson Ratio | [-] | 0.25 | ++------------------+-------------------------+------------------+--------------------+ +| :math:`\rho_b` | Bulk Density | [kg/m\ :sup:`3`] | 2500 | ++------------------+-------------------------+------------------+--------------------+ +| :math:`\phi` | Porosity | [-] | 0.375 | ++------------------+-------------------------+------------------+--------------------+ +| :math:`K_s` | Grain Bulk Modulus | [Pa] | 10\ :sup:`27` | ++------------------+-------------------------+------------------+--------------------+ +| :math:`\kappa` | Permeability | [m\ :sup:`2`] | 10\ :sup:`-12` | ++------------------+-------------------------+------------------+--------------------+ +| :math:`\rho_f` | Fluid Density | [kg/m\ :sup:`3`] | 1000 | ++------------------+-------------------------+------------------+--------------------+ +| :math:`c_f` | Fluid compressibility | [Pa\ :sup:`-1`] | 4.4x10\ :sup:`-10` | ++------------------+-------------------------+------------------+--------------------+ +| :math:`\mu` | Fluid viscosity | [Pa s] | 10\ :sup:`-3` | ++------------------+-------------------------+------------------+--------------------+ + + +--------------------------------- +Inspecting Results +--------------------------------- + +In the example, we request vtk output files for time-series (time history). We use paraview to visualize the outcome at the time 0s. +The following figure shows the final gradient of pressure and of the effective vertical stress after initialization is completed. + +.. _problemInitializationPres: +.. figure:: pressure_field.png + :align: center + :width: 500 + :figclass: align-center + + Simulation result of pressure + +.. _problemInitializationSZZ: +.. figure:: effective_SZZ.png + :align: center + :width: 500 + :figclass: align-center + + Simulation result of effective vertical stress + + +The figure below shows the comparison between the total stress computed by GEOS(marks) and with an analytical solutions (solid lines). Note that, because of the use of an isotropic model, the minimum and maximul horizontal stresses are equal. + +.. plot:: coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py + + +------------------------------------------------------------------ +To go further +------------------------------------------------------------------ + + +**Feedback on this example** + +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/effective_SZZ.png b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/effective_SZZ.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd5ed57fe6128715fac23bcd30322505f701ce5 GIT binary patch literal 124426 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 literal 0 HcmV?d00001 diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py new file mode 100644 index 00000000000..f6381a56e08 --- /dev/null +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py @@ -0,0 +1,146 @@ +import matplotlib +import matplotlib.pyplot as plt +import numpy as np +import h5py +import xml.etree.ElementTree as ElementTree +import math +from math import sin,cos,tan,exp,atan,asin +import csv + + +def getHydromechanicalParametersFromXML(xmlFilePath): + tree = ElementTree.parse(xmlFilePath) + + param1 = tree.find('Constitutive/ElasticIsotropic') + param2 = tree.find('Constitutive/BiotPorosity') + param3 = tree.find('Constitutive/CompressibleSinglePhaseFluid') + + hydromechanicalParameters = dict.fromkeys([ + "bulkModulus", "shearModulus", "youngModulus", "poissonRatio", "rockDensity", "poissonRatio", "biotCoefficient", "porosity", "fluidDensity", "traction"]) + + hydromechanicalParameters["rockDensity"] = float(param1.get("defaultDensity")) + hydromechanicalParameters["poissonRatio"] = float(param1.get("defaultPoissonRatio")) + hydromechanicalParameters["youngModulus"] = float(param1.get("defaultYoungModulus")) + + E = hydromechanicalParameters["youngModulus"] + nu = hydromechanicalParameters["poissonRatio"] + K = E / (3 * (1 - 2 * nu)) + G = E / (2 * (1 + nu)) + + hydromechanicalParameters["poissonRatio"] = nu + hydromechanicalParameters["bulkModulus"] = K + hydromechanicalParameters["shearModulus"] = G + + Ks = float(param2.get("defaultGrainBulkModulus")) + hydromechanicalParameters["biotCoefficient"] = 1.0 - K / Ks + + hydromechanicalParameters["porosity"] = float(param2.get("defaultReferencePorosity")) + + hydromechanicalParameters["fluidDensity"] = float(param3.get("defaultDensity")) + + param4 = tree.findall('FieldSpecifications/Traction') + found_stress = False + for elem in param4: + if elem.get("name") == "tractionTop" and elem.get("tractionType") == "normal": + traction = float(elem.get("scale")) * (-1) + found_stress = True + if found_stress: break + + return hydromechanicalParameters + + +def main(): + # File path + xmlFile1Path = "../../../../../../inputFiles/initialization/gravityInducedStress_initialization_base.xml" + xmlFile2Path = "../../../../../../inputFiles/initialization/gravityInducedStress_initialization_benchmark.xml" + + hydromechanicalParameters = getHydromechanicalParametersFromXML(xmlFile1Path) + + BiotCoefficient = hydromechanicalParameters["biotCoefficient"] + nu = hydromechanicalParameters["poissonRatio"] + rhoF = hydromechanicalParameters["fluidDensity"] + rhoR = hydromechanicalParameters["rockDensity"] + phi = hydromechanicalParameters["porosity"] + rhoB = (1-phi)*rhoR + phi*rhoF + + traction = hydromechanicalParameters["traction"] + gravity = 9.81 + + # rename this file to the name of your Paraview output file + file = open("simulation_result_0.csv") + csvreader = csv.reader(file) + header = next(csvreader) + header_index = {column_name: index for index, column_name in enumerate(header)} + + rows = [] + for row in csvreader: + rows.append(row) + file.close() + + zloc_index = header_index["elementCenter:2"] + pressure_index = header_index["pressure"] + tsxx_index = header_index["rockSolid_stress:0"] # the solidModelName="rockSolid" has been defined in the gravityInducedStress_initialization_base.xml file, please change if you have a different solidModelName + tsyy_index = header_index["rockSolid_stress:1"] + tszz_index = header_index["rockSolid_stress:2"] + + + rows = np.array(rows) + zloc_0 = np.empty(len(rows[:,1])) + pressure_0 = np.empty(len(rows[:,1])) + tsxx_0 = np.empty(len(rows[:,1])) + tsyy_0 = np.empty(len(rows[:,1])) + tszz_0 = np.empty(len(rows[:,1])) + for i in range(0,len(rows[:,1])): + zloc_0[i]=-(float(rows[i,zloc_index])) + pressure_0[i]=float(rows[i,pressure_index]) + tsxx_0[i]=-(float(rows[i,tsxx_index])-BiotCoefficient*pressure_0[i])/1.0e6 + tsyy_0[i]=-(float(rows[i,tsyy_index])-BiotCoefficient*pressure_0[i])/1.0e6 + tszz_0[i]=-(float(rows[i,tszz_index])-BiotCoefficient*pressure_0[i])/1.0e6 + + + z_analytical= np.linspace(0, 1000, 100) + pp_analytical= rhoF*gravity*z_analytical/1.0e6 + szz_analtyical= rhoB*gravity*z_analytical/1.0e6 + + sxx_analtyical=nu/(1-nu)*(szz_analtyical-BiotCoefficient*pp_analytical)+BiotCoefficient*pp_analytical + + fsize = 20 + msize = 12 + lw = 6 + mew = 2 + malpha = 0.6 + lalpha = 0.8 + N1=1 + + fig = plt.figure(figsize=(10,8)) + cmap = plt.get_cmap("tab10") + + + plt.plot(tsxx_0[::N1], zloc_0[::N1], 'o', color=cmap(0), markersize=msize, alpha=malpha, mec=cmap(0), fillstyle='none', mew=mew, label= 'Sxx_Total_GEOS') + plt.plot(sxx_analtyical, z_analytical, lw=lw, alpha=0.8, color='orange', linestyle= ':', label='Sxx_Total_Analytical') + plt.plot(tsyy_0[::N1], zloc_0[::N1], 's', color=cmap(1), markersize=msize, alpha=malpha, mec=cmap(1), fillstyle='none', mew=mew, label= 'Syy_Total_GEOS') + plt.plot(tszz_0[::N1], zloc_0[::N1], 'd', color=cmap(2), markersize=msize, alpha=malpha, mec=cmap(2), fillstyle='none', mew=mew, label= 'Szz_Total_GEOS') + plt.plot(szz_analtyical, z_analytical, lw=lw, alpha=0.8, color='g', linestyle= ':', label='Szz_Total_Analytical') + plt.plot(pressure_0[::N1]/1.0e6, zloc_0[::N1], 'x', color=cmap(3), markersize=msize, alpha=malpha, mec=cmap(3), fillstyle='none', mew=mew, label= 'Pore Pressure_GEOS') + plt.plot(pp_analytical, z_analytical, lw=lw, alpha=0.8, color='r', linestyle= ':', label='Pore Pressure_Analytical') + plt.xlabel('Total Stresses [MPa]', size=fsize, weight="bold") + plt.ylabel('Depth [m]', size=fsize, weight="bold") + plt.legend(loc='upper right',fontsize=fsize*0.5) + plt.grid(True) + ax = plt.gca() + ax.xaxis.set_tick_params(labelsize=fsize) + ax.yaxis.set_tick_params(labelsize=fsize) + ax.invert_yaxis() + + plt.show() + + +if __name__ == "__main__": + main() + + + + + + + diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/mesh.png b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/mesh.png new file mode 100644 index 0000000000000000000000000000000000000000..16e043636c36db0dcaf38a2fc0cd2bbd1e0e811d GIT binary patch literal 243009 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

    sg4;uPO?V2-o8bj3L9qAn(x)c+%TK!AT)c8!4 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�d|m(mnD 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 literal 0 HcmV?d00001 diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/Example.rst b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/Example.rst new file mode 100644 index 00000000000..b60009c1b27 --- /dev/null +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/Example.rst @@ -0,0 +1,116 @@ +.. _userdefinedstressinitialization: + + +################################################################################# + Model Initialization: User Defined Tables +################################################################################# + + +**Context** + +This example uses the same reservoir model as the gravity-induced hydrostatic stress initialization case (see :ref:`gravityinducedhydrostaticinitialization`). Instead of using the gravity based equilibrium initialization procedure, we collect the interpretated stress and pore pressure gradients for a reservoir and then request the simulator to perform an initialization with the provided pressure and stresses in every element in the model. The problem is solved by using the single-phase poromechanics solver (see :ref:`PoroelasticSolver`) in GEOS. + +**Input file** + +The xml input files for the test case are located at: + +.. code-block:: console + + inputFiles/initialization/userdefinedStress_initialization_base.xml + inputFiles/initialization/userdefinedStress_initialization_benchmark.xml + + +This example also uses a set of table files located at: + +.. code-block:: console + + inputFiles/initialization/userTables/ + + +Last, a Python script for post-processing the results is provided: + +.. code-block:: console + + src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/tableInitializationFigure.py + + +------------------------------------- +Stress Initialization Table Functions +------------------------------------- + +The major distinction between this "user-defined" initialization and the "gravity-based" initialization is that in the user-defined case, the user provides the following additional information: + + - The distribution of effective stresses and pore pressure across the domain, with their gradients assumed constant along the depth in this example. We use a table function (see :ref:`FunctionManager`) to specify pressure and stress conditions throughout the area. + + +This is shown in the following tags under the ``FieldSpecifications`` section below + +.. literalinclude:: ../../../../../../inputFiles/initialization/userdefinedStress_initialization_base.xml + :language: xml + :start-after: + :end-before: + +The tables for ``sigma_xx``, ``sigma_yy``, ``sigma_zz`` and ``init_pressure`` are listed under the ``Functions`` section as shown below. + +.. literalinclude:: ../../../../../../inputFiles/initialization/userdefinedStress_initialization_base.xml + :language: xml + :start-after: + :end-before: + +The required input files: x.csv, y.csv, z.csv, effectiveSigma_xx.csv, effectiveSigma_yy.csv, effectiveSigma_zz.csv, and porePressure.csv are generated based on the expected stress-gradients in the model. + +A Python script to generate these files is provided: + +.. code-block:: console + + src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/genetrateTable.py + +In addition to generating the files listed above, the script prints out the corresponding fluid density and rock density based on the model parameters provided. These values are then input into the ``defaultDensity`` parameter of the ``CompressibleSinglePhaseFluid`` and ``ElasticIsotropic`` tags respectively, as shown below: + +.. literalinclude:: ../../../../../../inputFiles/initialization/userdefinedStress_initialization_base.xml + :language: xml + :start-after: + :end-before: + +.. literalinclude:: ../../../../../../inputFiles/initialization/userdefinedStress_initialization_base.xml + :language: xml + :start-after: + :end-before: + + +--------------------------------- +Inspecting Results +--------------------------------- + +In the example, we request vtk output files for time-series (time history). We use paraview to visualize the outcome at the time 0s. +The following figure shows the final gradient of pressure and of the effective vertical stress after initialization is completed. + +.. _problemInitializationPres: +.. figure:: pressure_field.png + :align: center + :width: 500 + :figclass: align-center + + Simulation result of pressure + +.. _problemInitializationSZZ: +.. figure:: stressZZ_field.png + :align: center + :width: 500 + :figclass: align-center + + Simulation result of effective vertical stress + +The figure below shows the comparisons between the numerical predictions (marks) and the corresponding user-provided stress gradients. Note that anisotropic horizontal stresses are obtained through this intialization procedure; however, mechanical equilibrium might not be guaranteed, especially for the heterogeneous models. + +.. plot:: coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/tableInitializationFigure.py + + +------------------------------------------------------------------ +To go further +------------------------------------------------------------------ + + +**Feedback on this example** + +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/generateTable.py b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/generateTable.py new file mode 100644 index 00000000000..c8e8eb08ff2 --- /dev/null +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/generateTable.py @@ -0,0 +1,49 @@ +import math +import numpy as np + + +model_top = 0.0 # in m +model_base = -1000.0 # in m +num_Points = 2 +z_table = np.linspace(model_base, model_top, num_Points) +pp_gradient = 0.1 # in MPa/m +sigma_xx_gradient = 0.17 # in MPa/m +sigma_yy_gradient = 0.27 # in MPa/m +sigma_zz_gradient = 0.24 # in MPa/m + + + +PoissonRatio = 0.25 +YoungModulus = 100e6 # in Pa +grainBulkModulus = 1e27 # in #Pa +bulkModulus = YoungModulus/3.0/(1.0-2.0*PoissonRatio) # in Pa +BiotCoefficient = 1.0-bulkModulus/grainBulkModulus +porosity = 0.375 +Gravity = 9.81 + + +pp_table = abs(z_table)*pp_gradient*100000 +fluidDensity = pp_gradient*100000/Gravity +effectiveSigma_xx_table = z_table*sigma_xx_gradient*100000 + BiotCoefficient*pp_table +effectiveSigma_yy_table = z_table*sigma_yy_gradient*100000 + BiotCoefficient*pp_table +effectiveSigma_zz_table = z_table*sigma_zz_gradient*100000 + BiotCoefficient*pp_table + +bulkDensity = sigma_zz_gradient*100000/Gravity +rockDensity = (bulkDensity - porosity*fluidDensity)/(1.0-porosity) +print(f'Fluid Density = {fluidDensity} kg/m3, Rock Density = {rockDensity} kg/m3') + +np.savetxt('porePressure.csv', pp_table, fmt='%1.2f', delimiter=',') + +np.savetxt('effectiveSigma_xx.csv', effectiveSigma_xx_table, fmt='%1.2f', delimiter=',') + +np.savetxt('effectiveSigma_yy.csv', effectiveSigma_yy_table, fmt='%1.2f', delimiter=',') + +np.savetxt('effectiveSigma_zz.csv', effectiveSigma_zz_table, fmt='%1.2f', delimiter=',') + +x_table = np.linspace(0.0, 0.0, 1) +np.savetxt('x.csv', x_table, fmt='%1.2f', delimiter=',') + +y_table = np.linspace(0.0, 0.0, 1) +np.savetxt('y.csv', x_table, fmt='%1.2f', delimiter=',') + +np.savetxt('z.csv', z_table, fmt='%1.2f', delimiter=',') diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/pressure_field.png b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/pressure_field.png new file mode 100644 index 0000000000000000000000000000000000000000..9145f77b8973156fe0bc24d6dd0060d4d92de9f8 GIT binary patch literal 429924 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%0D4MFL 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 z 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 S+8^Z5Q%y-rG4IB2zyCipi?Ue& literal 0 HcmV?d00001 diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/simulation_result_0.csv b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/simulation_result_0.csv new file mode 100644 index 00000000000..837edf3cc67 --- /dev/null +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/simulation_result_0.csv @@ -0,0 +1,1002 @@ +"elementCenter:0","elementCenter:1","elementCenter:2","pressure","rockSolid_stress:0","rockSolid_stress:1","rockSolid_stress:2","rockSolid_stress:3","rockSolid_stress:4","rockSolid_stress:5","Points:0","Points:1","Points:2" +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-1000 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-999 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-998 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-997 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-996 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-995 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-994 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-993 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-992 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-991 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-990 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-989 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-988 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-987 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-986 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-985 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-984 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-983 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-982 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-981 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-980 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-979 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-978 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-977 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-976 +525,525,-987.5,9.875e+06,-6.8917e+06,-1.6767e+07,-1.3763e+07,2.231e-09,-1.1239e-09,4.8216e-09,500,500,-975 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-974 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-973 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-972 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-971 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-970 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-969 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-968 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-967 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-966 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-965 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-964 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-963 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-962 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-961 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-960 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-959 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-958 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-957 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-956 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-955 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-954 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-953 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-952 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-951 +525,525,-962.5,9.625e+06,-6.7171e+06,-1.6342e+07,-1.3414e+07,-1.4554e-08,4.3977e-09,4.9082e-09,500,500,-950 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-949 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-948 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-947 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-946 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-945 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-944 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-943 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-942 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-941 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-940 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-939 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-938 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-937 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-936 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-935 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-934 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-933 +525,525,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,8.0922e-09,2.9974e-08,5.203e-09,500,500,-932 +525,475,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,7.4834e-09,3.0448e-08,3.7313e-09,500,500,-931 +525,475,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,7.4834e-09,3.0448e-08,3.7313e-09,500,500,-930 +525,475,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,7.4834e-09,3.0448e-08,3.7313e-09,500,500,-929 +525,475,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,7.4834e-09,3.0448e-08,3.7313e-09,500,500,-928 +525,475,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,7.4834e-09,3.0448e-08,3.7313e-09,500,500,-927 +525,475,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,7.4834e-09,3.0448e-08,3.7313e-09,500,500,-926 +525,475,-937.5,9.375e+06,-6.5426e+06,-1.5918e+07,-1.3065e+07,7.4834e-09,3.0448e-08,3.7313e-09,500,500,-925 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-924 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-923 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-922 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-921 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-920 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-919 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-918 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-917 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-916 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-915 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-914 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-913 +525,475,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,2.3555e-09,4.198e-09,3.9418e-09,500,500,-912 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-911 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-910 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-909 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-908 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-907 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-906 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-905 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-904 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-903 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-902 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-901 +525,525,-912.5,9.125e+06,-6.3681e+06,-1.5493e+07,-1.2717e+07,1.7691e-09,3.352e-09,5.2129e-09,500,500,-900 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-899 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-898 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-897 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-896 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-895 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-894 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-893 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-892 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-891 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-890 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-889 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-888 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-887 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-886 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-885 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-884 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-883 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-882 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-881 +525,525,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6027e-08,6.0936e-09,4.9075e-09,500,500,-880 +525,475,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6876e-08,6.3486e-09,3.6317e-09,500,500,-879 +525,475,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6876e-08,6.3486e-09,3.6317e-09,500,500,-878 +525,475,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6876e-08,6.3486e-09,3.6317e-09,500,500,-877 +525,475,-887.5,8.875e+06,-6.1935e+06,-1.5069e+07,-1.2368e+07,1.6876e-08,6.3486e-09,3.6317e-09,500,500,-876 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-875 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-874 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-873 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-872 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-871 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-870 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-869 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-868 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-867 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-866 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-865 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-864 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-863 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-862 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-861 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-860 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-859 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-858 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-857 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-856 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-855 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-854 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-853 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-852 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-851 +525,525,-862.5,8.625e+06,-6.019e+06,-1.4644e+07,-1.202e+07,-2.2885e-08,-2.095e-08,4.3994e-09,500,500,-850 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-849 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-848 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-847 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-846 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-845 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-844 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-843 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-842 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-841 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-840 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-839 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-838 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-837 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-836 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-835 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-834 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-833 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-832 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-831 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-830 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-829 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-828 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-827 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-826 +525,525,-837.5,8.375e+06,-5.8445e+06,-1.422e+07,-1.1671e+07,2.533e-10,-2.026e-09,3.9873e-09,500,500,-825 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-824 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-823 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-822 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-821 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-820 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-819 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-818 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-817 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-816 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-815 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-814 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-813 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-812 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-811 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-810 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-809 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-808 +525,525,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,1.4824e-09,1.3732e-09,3.8487e-09,500,500,-807 +525,475,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,2.5881e-09,1.2905e-09,3.5733e-09,500,500,-806 +525,475,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,2.5881e-09,1.2905e-09,3.5733e-09,500,500,-805 +525,475,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,2.5881e-09,1.2905e-09,3.5733e-09,500,500,-804 +525,475,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,2.5881e-09,1.2905e-09,3.5733e-09,500,500,-803 +525,475,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,2.5881e-09,1.2905e-09,3.5733e-09,500,500,-802 +525,475,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,2.5881e-09,1.2905e-09,3.5733e-09,500,500,-801 +525,475,-812.5,8.125e+06,-5.67e+06,-1.3795e+07,-1.1322e+07,2.5881e-09,1.2905e-09,3.5733e-09,500,500,-800 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-799 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-798 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-797 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-796 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-795 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-794 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-793 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-792 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-791 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-790 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-789 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-788 +525,475,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.2955e-09,1.8767e-08,3.2627e-09,500,500,-787 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-786 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-785 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-784 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-783 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-782 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-781 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-780 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-779 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-778 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-777 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-776 +525,525,-787.5,7.875e+06,-5.4955e+06,-1.337e+07,-1.0974e+07,9.1293e-09,1.8739e-08,3.8989e-09,500,500,-775 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-774 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-773 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-772 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-771 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-770 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-769 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-768 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-767 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-766 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-765 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-764 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-763 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-762 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-761 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-760 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-759 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-758 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-757 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-756 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-755 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-754 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-753 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-752 +525,525,-762.5,7.625e+06,-5.321e+06,-1.2946e+07,-1.0625e+07,-7.4289e-09,-7.4071e-09,3.9814e-09,500,500,-751 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-750 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-749 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-748 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-747 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-746 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-745 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-744 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-743 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-742 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-741 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-740 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-739 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-738 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-737 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-736 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-735 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-734 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-733 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-732 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-731 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-730 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-729 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-728 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-727 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-726 +525,525,-737.5,7.375e+06,-5.1465e+06,-1.2521e+07,-1.0277e+07,-5.2577e-09,-3.0772e-09,3.7433e-09,500,500,-725 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-724 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-723 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-722 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-721 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-720 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-719 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-718 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-717 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-716 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-715 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-714 +525,525,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2317e-08,6.709e-09,3.617e-09,500,500,-713 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-712 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-711 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-710 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-709 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-708 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-707 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-706 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-705 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-704 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-703 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-702 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-701 +525,475,-712.5,7.125e+06,-4.9719e+06,-1.2097e+07,-9.9283e+06,-1.2673e-08,8.1302e-09,2.7197e-09,500,500,-700 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-699 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-698 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-697 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-696 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-695 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-694 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-693 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-692 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-691 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-690 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-689 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-688 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-687 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-686 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-685 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-684 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-683 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-682 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-681 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-680 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-679 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-678 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-677 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-676 +525,475,-687.5,6.875e+06,-4.7974e+06,-1.1672e+07,-9.5798e+06,-7.8735e-09,-2.8248e-09,2.8188e-09,500,500,-675 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-674 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-673 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-672 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-671 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-670 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-669 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-668 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-667 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-666 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-665 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-664 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-663 +525,475,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,3.2449e-09,7.996e-11,2.6142e-09,500,500,-662 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-661 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-660 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-659 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-658 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-657 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-656 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-655 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-654 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-653 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-652 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-651 +525,525,-662.5,6.625e+06,-4.623e+06,-1.1248e+07,-9.2314e+06,2.8008e-09,-1.5585e-11,3.0555e-09,500,500,-650 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-649 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-648 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-647 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-646 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-645 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-644 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-643 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-642 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-641 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-640 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-639 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-638 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-637 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-636 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-635 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-634 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-633 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-632 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-631 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-630 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-629 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-628 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-627 +525,525,-637.5,6.375e+06,-4.4485e+06,-1.0823e+07,-8.8829e+06,8.6973e-09,1.137e-08,2.5422e-09,500,500,-626 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-625 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-624 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-623 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-622 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-621 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-620 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-619 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-618 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-617 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-616 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-615 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-614 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-613 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-612 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-611 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-610 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-609 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-608 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-607 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-606 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-605 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-604 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-603 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-602 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-601 +525,525,-612.5,6.125e+06,-4.274e+06,-1.0399e+07,-8.5344e+06,-7.1658e-09,1.2119e-09,2.4478e-09,500,500,-600 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-599 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-598 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-597 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-596 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-595 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-594 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-593 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-592 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-591 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-590 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-589 +525,525,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,5.7147e-09,5.744e-09,2.6549e-09,500,500,-588 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-587 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-586 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-585 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-584 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-583 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-582 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-581 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-580 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-579 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-578 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-577 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-576 +525,475,-587.5,5.875e+06,-4.0995e+06,-9.9745e+06,-8.1859e+06,6.0238e-09,5.5572e-09,1.1504e-09,500,500,-575 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-574 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-573 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-572 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-571 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-570 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-569 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-568 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-567 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-566 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-565 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-564 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-563 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-562 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-561 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-560 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-559 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-558 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-557 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-556 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-555 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-554 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-553 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-552 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-551 +525,475,-562.5,5.625e+06,-3.925e+06,-9.55e+06,-7.8375e+06,5.6524e-09,-2.5183e-09,1.1073e-09,500,500,-550 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-549 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-548 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-547 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-546 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-545 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-544 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-543 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-542 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-541 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-540 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-539 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-538 +525,475,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2223e-09,-4.6824e-09,1.507e-09,500,500,-537 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-536 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-535 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-534 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-533 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-532 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-531 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-530 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-529 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-528 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-527 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-526 +525,525,-537.5,5.375e+06,-3.7505e+06,-9.1255e+06,-7.489e+06,2.2087e-09,-4.6421e-09,2.4099e-09,500,500,-525 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-524 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-523 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-522 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-521 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-520 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-519 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-518 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-517 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-516 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-515 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-514 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-513 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-512 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-511 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-510 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-509 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-508 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-507 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-506 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-505 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-504 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-503 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-502 +525,525,-512.5,5.125e+06,-3.576e+06,-8.701e+06,-7.1406e+06,4.5432e-09,1.9792e-09,2.5512e-09,500,500,-501 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-500 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-499 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-498 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-497 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-496 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-495 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-494 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-493 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-492 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-491 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-490 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-489 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-488 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-487 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-486 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-485 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-484 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-483 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-482 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-481 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-480 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-479 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-478 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-477 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-476 +525,525,-487.5,4.875e+06,-3.4016e+06,-8.2766e+06,-6.7922e+06,5.7245e-09,1.9448e-09,2.7185e-09,500,500,-475 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-474 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-473 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-472 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-471 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-470 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-469 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-468 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-467 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-466 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-465 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-464 +525,525,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.4137e-09,-2.4198e-09,2.5927e-09,500,500,-463 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-462 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-461 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-460 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-459 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-458 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-457 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-456 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-455 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-454 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-453 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-452 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-451 +525,475,-462.5,4.625e+06,-3.2271e+06,-7.8521e+06,-6.4438e+06,2.3894e-09,-2.4077e-09,1.2297e-09,500,500,-450 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-449 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-448 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-447 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-446 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-445 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-444 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-443 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-442 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-441 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-440 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-439 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-438 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-437 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-436 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-435 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-434 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-433 +525,475,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,3.2504e-09,2.9329e-09,1.2885e-09,500,500,-432 +525,525,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,2.8413e-09,2.4755e-09,2.6738e-09,500,500,-431 +525,525,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,2.8413e-09,2.4755e-09,2.6738e-09,500,500,-430 +525,525,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,2.8413e-09,2.4755e-09,2.6738e-09,500,500,-429 +525,525,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,2.8413e-09,2.4755e-09,2.6738e-09,500,500,-428 +525,525,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,2.8413e-09,2.4755e-09,2.6738e-09,500,500,-427 +525,525,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,2.8413e-09,2.4755e-09,2.6738e-09,500,500,-426 +525,525,-437.5,4.375e+06,-3.0526e+06,-7.4276e+06,-6.0954e+06,2.8413e-09,2.4755e-09,2.6738e-09,500,500,-425 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-424 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-423 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-422 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-421 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-420 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-419 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-418 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-417 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-416 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-415 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-414 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-413 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-412 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-411 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-410 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-409 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-408 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-407 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-406 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-405 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-404 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-403 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-402 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-401 +525,525,-412.5,4.125e+06,-2.8782e+06,-7.0032e+06,-5.747e+06,-4.8032e-09,1.1377e-09,2.5232e-09,500,500,-400 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-399 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-398 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-397 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-396 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-395 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-394 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-393 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-392 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-391 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-390 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-389 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-388 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-387 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-386 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-385 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-384 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-383 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-382 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-381 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-380 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-379 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-378 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-377 +525,525,-387.5,3.875e+06,-2.7037e+06,-6.5787e+06,-5.3986e+06,4.6369e-09,-3.2797e-11,2.1925e-09,500,500,-376 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-375 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-374 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-373 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-372 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-371 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-370 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-369 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-368 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-367 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-366 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-365 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-364 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-363 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-362 +525,525,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,9.6765e-10,1.6844e-09,1.9055e-09,500,500,-361 +525,475,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,1.1919e-09,1.9178e-09,1.1725e-09,500,500,-360 +525,475,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,1.1919e-09,1.9178e-09,1.1725e-09,500,500,-359 +525,475,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,1.1919e-09,1.9178e-09,1.1725e-09,500,500,-358 +525,475,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,1.1919e-09,1.9178e-09,1.1725e-09,500,500,-357 +525,475,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,1.1919e-09,1.9178e-09,1.1725e-09,500,500,-356 +525,475,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,1.1919e-09,1.9178e-09,1.1725e-09,500,500,-355 +525,475,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,1.1919e-09,1.9178e-09,1.1725e-09,500,500,-354 +525,475,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,1.1919e-09,1.9178e-09,1.1725e-09,500,500,-353 +525,475,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,1.1919e-09,1.9178e-09,1.1725e-09,500,500,-352 +525,475,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,1.1919e-09,1.9178e-09,1.1725e-09,500,500,-351 +525,475,-362.5,3.625e+06,-2.5292e+06,-6.1542e+06,-5.0502e+06,1.1919e-09,1.9178e-09,1.1725e-09,500,500,-350 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-349 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-348 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-347 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-346 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-345 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-344 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-343 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-342 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-341 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-340 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-339 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-338 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-337 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-336 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-335 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-334 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-333 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-332 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-331 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-330 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-329 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-328 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-327 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-326 +525,475,-337.5,3.375e+06,-2.3548e+06,-5.7298e+06,-4.7019e+06,2.6102e-10,-4.9738e-10,1.173e-09,500,500,-325 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-324 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-323 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-322 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-321 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-320 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-319 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-318 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-317 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-316 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-315 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-314 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-313 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-312 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-311 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-310 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-309 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-308 +525,475,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,2.0344e-09,3.0247e-09,1.2099e-09,500,500,-307 +525,525,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,1.5852e-09,2.9935e-09,1.6606e-09,500,500,-306 +525,525,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,1.5852e-09,2.9935e-09,1.6606e-09,500,500,-305 +525,525,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,1.5852e-09,2.9935e-09,1.6606e-09,500,500,-304 +525,525,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,1.5852e-09,2.9935e-09,1.6606e-09,500,500,-303 +525,525,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,1.5852e-09,2.9935e-09,1.6606e-09,500,500,-302 +525,525,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,1.5852e-09,2.9935e-09,1.6606e-09,500,500,-301 +525,525,-312.5,3.125e+06,-2.1803e+06,-5.3053e+06,-4.3535e+06,1.5852e-09,2.9935e-09,1.6606e-09,500,500,-300 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-299 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-298 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-297 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-296 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-295 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-294 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-293 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-292 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-291 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-290 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-289 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-288 +525,525,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,2.5181e-10,2.8519e-09,1.5497e-09,500,500,-287 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-286 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-285 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-284 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-283 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-282 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-281 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-280 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-279 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-278 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-277 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-276 +525,475,-287.5,2.875e+06,-2.0059e+06,-4.8809e+06,-4.0052e+06,9.0531e-10,2.5587e-09,1.1061e-09,500,500,-275 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-274 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-273 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-272 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-271 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-270 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-269 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-268 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-267 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-266 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-265 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-264 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-263 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-262 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-261 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-260 +525,475,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.7614e-09,1.7419e-09,1.03e-09,500,500,-259 +525,525,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.6197e-09,2.0688e-09,1.59e-09,500,500,-258 +525,525,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.6197e-09,2.0688e-09,1.59e-09,500,500,-257 +525,525,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.6197e-09,2.0688e-09,1.59e-09,500,500,-256 +525,525,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.6197e-09,2.0688e-09,1.59e-09,500,500,-255 +525,525,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.6197e-09,2.0688e-09,1.59e-09,500,500,-254 +525,525,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.6197e-09,2.0688e-09,1.59e-09,500,500,-253 +525,525,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.6197e-09,2.0688e-09,1.59e-09,500,500,-252 +525,525,-262.5,2.625e+06,-1.8315e+06,-4.4565e+06,-3.6569e+06,1.6197e-09,2.0688e-09,1.59e-09,500,500,-251 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-250 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-249 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-248 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-247 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-246 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-245 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-244 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-243 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-242 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-241 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-240 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-239 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-238 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-237 +525,525,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.7162e-09,1.1193e-09,1.3168e-09,500,500,-236 +525,475,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.6792e-09,7.0582e-10,8.0772e-10,500,500,-235 +525,475,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.6792e-09,7.0582e-10,8.0772e-10,500,500,-234 +525,475,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.6792e-09,7.0582e-10,8.0772e-10,500,500,-233 +525,475,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.6792e-09,7.0582e-10,8.0772e-10,500,500,-232 +525,475,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.6792e-09,7.0582e-10,8.0772e-10,500,500,-231 +525,475,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.6792e-09,7.0582e-10,8.0772e-10,500,500,-230 +525,475,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.6792e-09,7.0582e-10,8.0772e-10,500,500,-229 +525,475,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.6792e-09,7.0582e-10,8.0772e-10,500,500,-228 +525,475,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.6792e-09,7.0582e-10,8.0772e-10,500,500,-227 +525,475,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.6792e-09,7.0582e-10,8.0772e-10,500,500,-226 +525,475,-237.5,2.375e+06,-1.657e+06,-4.032e+06,-3.3085e+06,1.6792e-09,7.0582e-10,8.0772e-10,500,500,-225 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-224 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-223 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-222 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-221 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-220 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-219 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-218 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-217 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-216 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-215 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-214 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-213 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-212 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-211 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-210 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-209 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-208 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-207 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-206 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-205 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-204 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-203 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-202 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-201 +525,475,-212.5,2.125e+06,-1.4826e+06,-3.6076e+06,-2.9602e+06,3.0572e-09,1.9361e-09,6.0434e-10,500,500,-200 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-199 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-198 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-197 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-196 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-195 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-194 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-193 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-192 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-191 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-190 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-189 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-188 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-187 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-186 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-185 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-184 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-183 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-182 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-181 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-180 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-179 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-178 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-177 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-176 +525,475,-187.5,1.875e+06,-1.3081e+06,-3.1831e+06,-2.6119e+06,3.0927e-10,9.9923e-10,4.4779e-10,500,500,-175 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-174 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-173 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-172 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-171 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-170 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-169 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-168 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-167 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-166 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-165 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-164 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-163 +525,475,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,5.9889e-10,5.2977e-10,3.3278e-10,500,500,-162 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-161 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-160 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-159 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-158 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-157 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-156 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-155 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-154 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-153 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-152 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-151 +525,525,-162.5,1.625e+06,-1.1337e+06,-2.7587e+06,-2.2636e+06,7.1002e-10,8.5869e-10,7.5644e-10,500,500,-150 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-149 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-148 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-147 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-146 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-145 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-144 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-143 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-142 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-141 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-140 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-139 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-138 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-137 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-136 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-135 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-134 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-133 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-132 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-131 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-130 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-129 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-128 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-127 +525,525,-137.5,1.375e+06,-9.5929e+05,-2.3343e+06,-1.9154e+06,1.4539e-09,1.0711e-09,5.463e-10,500,500,-126 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-125 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-124 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-123 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-122 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-121 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-120 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-119 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-118 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-117 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-116 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-115 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-114 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-113 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-112 +525,525,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,1.0895e-09,6.821e-10,3.7359e-10,500,500,-111 +525,475,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,9.0843e-10,4.9507e-10,1.8174e-10,500,500,-110 +525,475,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,9.0843e-10,4.9507e-10,1.8174e-10,500,500,-109 +525,475,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,9.0843e-10,4.9507e-10,1.8174e-10,500,500,-108 +525,475,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,9.0843e-10,4.9507e-10,1.8174e-10,500,500,-107 +525,475,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,9.0843e-10,4.9507e-10,1.8174e-10,500,500,-106 +525,475,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,9.0843e-10,4.9507e-10,1.8174e-10,500,500,-105 +525,475,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,9.0843e-10,4.9507e-10,1.8174e-10,500,500,-104 +525,475,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,9.0843e-10,4.9507e-10,1.8174e-10,500,500,-103 +525,475,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,9.0843e-10,4.9507e-10,1.8174e-10,500,500,-102 +525,475,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,9.0843e-10,4.9507e-10,1.8174e-10,500,500,-101 +525,475,-112.5,1.125e+06,-7.8486e+05,-1.9099e+06,-1.5671e+06,9.0843e-10,4.9507e-10,1.8174e-10,500,500,-100 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-99 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-98 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-97 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-96 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-95 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-94 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-93 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-92 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-91 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-90 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-89 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-88 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-87 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-86 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-85 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-84 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-83 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-82 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-81 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-80 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-79 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-78 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-77 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-76 +525,475,-87.5,8.75e+05,-6.1044e+05,-1.4854e+06,-1.2188e+06,1.0079e-09,4.7515e-10,1.6434e-10,500,500,-75 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-74 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-73 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-72 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-71 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-70 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-69 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-68 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-67 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-66 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-65 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-64 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-63 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-62 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-61 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-60 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-59 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-58 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-57 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-56 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-55 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-54 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-53 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-52 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-51 +525,475,-62.5,6.25e+05,-4.3603e+05,-1.061e+06,-8.7058e+05,7.3943e-10,3.2228e-10,1.1758e-10,500,500,-50 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-49 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-48 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-47 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-46 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-45 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-44 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-43 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-42 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-41 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-40 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-39 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-38 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-37 +525,475,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.9873e-10,2.556e-10,9.2379e-12,500,500,-36 +525,525,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.3531e-10,3.5968e-10,1.4975e-10,500,500,-35 +525,525,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.3531e-10,3.5968e-10,1.4975e-10,500,500,-34 +525,525,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.3531e-10,3.5968e-10,1.4975e-10,500,500,-33 +525,525,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.3531e-10,3.5968e-10,1.4975e-10,500,500,-32 +525,525,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.3531e-10,3.5968e-10,1.4975e-10,500,500,-31 +525,525,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.3531e-10,3.5968e-10,1.4975e-10,500,500,-30 +525,525,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.3531e-10,3.5968e-10,1.4975e-10,500,500,-29 +525,525,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.3531e-10,3.5968e-10,1.4975e-10,500,500,-28 +525,525,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.3531e-10,3.5968e-10,1.4975e-10,500,500,-27 +525,525,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.3531e-10,3.5968e-10,1.4975e-10,500,500,-26 +525,525,-37.5,3.75e+05,-2.6161e+05,-6.3661e+05,-5.2234e+05,4.3531e-10,3.5968e-10,1.4975e-10,500,500,-25 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-24 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-23 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-22 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-21 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-20 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-19 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-18 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-17 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-16 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-15 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-14 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-13 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-12 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-11 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-10 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-9 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-8 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-7 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-6 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-5 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-4 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-3 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-2 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,-1 +525,525,-12.5,1.25e+05,-87204,-2.122e+05,-1.7411e+05,9.3783e-11,1.7537e-10,1.3591e-10,500,500,0 diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/stressZZ_field.png b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/stressZZ_field.png new file mode 100644 index 0000000000000000000000000000000000000000..8c02e28c42816e646d166e8faa998c76cf7f7179 GIT binary patch literal 406723 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ÎSGVEtoj)vEkw1ft}6| zD*zKg8R|T+$sl;5jy|H;tQ>{Z_ZB_@SDm8qB9BAJh$ zhUmMmV&grpu7GWx4DXbB9x?%7E((F&whDM8GthUi4XjmKO60zjSf zTo|O{6rKQG9heD~PYrdRvR6$F@oZ2H=&ROkeIZu8HRs^}?kE%M18+Yzn^_rK@R^Fa zR_5i%dwsM$9ookU_p>}hg8mbLJTf;l6HB{G?a#-u1`Zv=F0oW5VEdk&MbozKUaAX=_LOLh#MetyBzMEZrUM^#6j`0G{C>9R*+QGd=AxqCQ-ut|M zW;>7&I9d>=^Pkcn{#R*Oxo3-nyD~x>} zAdgX!LJxy4k>fFLXk=1OLePb)zoU=}Bq-Y=8E4~JDcBNeboqF4ZAE!e%X6uF0~yh( z?G7VVtp8H@jr+j-@T%_0BzuK>>q*Vgcg`gDTcu`Us>q`XJ|SA3;N%jQTC2lI z`Nse2L+2ZYEIU_RIi_Q$?xcQ7@WXjk@B0%!Eq7!<;m*Gd1w^p*{N`e`d{!B~EFlKNZ3Kbim|eFgz;VZf#) z!#tnssh$N~LVoW$fc*6kcdMt4^O)nBy~6wXXslZPINv7b;^WY|o=JenqwZN0@o+&l zDEFD6&fAysLu#Ns3EbdbpsW7}LFM}gg31UQ1E68xwQjz!wOpQuxv2ifNbA<`;#K#x zpbx23JH=elYgwV`!b-FpyaVnPYf2^2OEYnz9X>w3@yGq@^z9COZ8?Pty2q&uQ~s7A zPcRB{OJHutyZ+Ah2KNPs1#uN8Bj$vwx$*kt=W-z^3@FC1S|`MD#zeS4AsQuPaBGAh z2yoVja&;m`yx9-J7C`QioMZ8WLW*PFtI{T8VDPyT_F8S=j%^4<*X~|2T)wiK1XU~_ z;(vSplV2(&5um63qU$~9?ZU{v^U?@ocXU5pEIgT{wg5#Y`uRRmF+d^P%zNnWVgsWM ztS2D;hEqpa$*E@(kjg*?SgIxg%eRuappZr}u$WtL zxQ^Kd2WfQIG#|ZYhe;)1V6~#_oa(U zgz`|IzBQ=MvA{wATc?Y_LaRJ}2E=V2hGWUIuj7t8f$}tBb#x^6b(a7}@rAAnF1!V1 z5u%EI1j^6H?QY+GSh;?xJK*zeE_1N9ax|A0F#!coIy&kf6B8=Ti_8PQ&OB_}s&*@X zG|Qi0HyMlfX)0bW^EcZ1p}5+=pEp^J_vg*flh-59D6@Q6WeANO#Vh%u_OPzlS=g2H z=t)aGN?__ATT4FPqw8V&m8{GHDNK^tRL5vg`N<7`YIT4?#y}=tgdMRPWcpb8|@fTLYJdDh>E;}!JCil zLEj@RY#f%BL&>MZjVo@K`05?(zxJ6Qp=P^_ff>FHH#QN7HTSYTajjIujO;0ld3!nh zmDwSn2h4|+5r_v6pWlFfj6CntQ{tuB7Qmp+@&-R8TCUTGY#X>>60yx9U_b>4Bkiuw zN|M}uzE>W&;H}oi>icQ!zc!i(0@xl}5gX$B`+QN0YBecIWn|5=J6pU;e{nj@-!#2H9g;EPRMkx8wz6!dsZP zpCfyb({w0GFw0NtQ^1dP(ejjTQHi>@kxPyvrN^gMhUZ<@&1~I;%rYmM%o>ch^qVbj zn|54IY1T@A+o+qQpj*Tco#p!%P$#ioX0*z5rD9Z}qW9y5*4Ql@+V;6*kvEtN6-v=x z!-3@{@lNw`TnZ<11J_D<AvaV&F7P-xgiSRb4H~Jz(DSLO(&S&)CxgrIlWn_kU=g0yU5@?5N9LvCZpm1+?Y?*%w{A-c$6d(zvj89PsWH!nJRZ`Xg&d&Pftc5{78zJui)qgQq9zNo?nEu1)r zFJK=&qxc$E5lilF;b$-_lwfCwyD^CPV|6_P$IJv2VbpLJ0bOEt>4_?Wq8CE7*Nz~* zKV*noSHq{NqEnHa0kA9}u7dSmmz9mwoqBfHxU%0NTRxnXJE*;4Wp%s<+`wyL5Ob@|dih@WwwNM` zg0_?*31;fW8JCT7G$mvqnISKZZ$imZSIS>?8~Ey za4**4kj2~rNqVHQe(@JSpaR!gv0Fjh@?KDwL5NV%vm~sUKB)4Os5o`X7!>RnDw6bl zc(Y1Vx&hC`s!lda&8g>#6#dyfc}CCPKl~K*KS`hoKZk_xZ4mX38mSzq^zm*#SaIz0 z;N(p{gF)f3iMN0}h|WSJ?7d<(>lisO-3kt_a;*mv#4;cE7#4^J+IPB*dYTsR&4v1qBLT|4{O z%z%b!z-Sd4`btCuK{J9toLnnDY5y#e=c&Txcb0=BlTo74?t+=MCU5#P7cTp%-b;G_ z>3uwtedJ^J)W_E&rAN0FR&{nYqtdfGsM2q)xtd_EZo+qMf0-GJkvt)Itz|*@EBkY! z9^PkZ`euxt=RJ$z+Tsy7J)?rWPy)04W``>ZMpF| zQ2%?3*yh`3kINw@ypSPimj*lPH%A(mS9Oh{p77yMRP42aFsk!I_jZ^ zMIJ$}qdEF}bN_Xoyi!qFC;1B-B)>R{@hY{v3k@FEmi{!MMY0=DlgH@La^v;+vFGko zfkx6fP4C_Y+0# zq}TbWE`rkI`Eds#o$BhJP4xFM-tk% z#Jn|P)Jf)ZxAv;<;p&gCW)lTgs_3O#>>=_P`_;sl&58N}>tBmkMF(EOPM+Px$PEhE zP2Bj7od@%L)WhjM&T&T+CWJtd|9oq|zDZxQQ!=*xXM~DD zo=C&#(wwR4NVD8!^^zOMcd!2;vo5~zNjZE2u=t6wmL!VOY3(%K6a6WaXQz!<>NEv9yonlLC%#(#04f;L?+XJ(&mTz_`6~o0hgv)?l4uXo*;EIR=w} zq08QW%{UWXQ(n#nV*9z{Jj$1gq zMLgmV?}Nx#yt}jH>NduTr#F=*`tyv}_k1lsN^Z?+t8C#j5yhGk$>B7w_xGYsMNo|8 zIU^|Dd;HrZ(Q&f|0%Y!}(@|)9_^?u4&sfyz60macB*z8E=u&veM^UV273*?k;g8{p ze{SW%pa~R9eHGxj(bMd;0tEcx_Ad z_{sbX6OzCot@GSl%o$-_kv3dil3cX{oUG2FnWr#wZ?K&8m^FuF(oJPq?Knytm06HC z^RC3;^NqOMWKl&a`r~cy-lf8cbbvr%i6gOK(3RA%{j|jL0*{8STX|$nqHrz^g{BNX zZo7R_$NB(qW5AA3a9r_CK#i04VKL7nr9R}7QU0h7Ir(eH&1lhbJ(3TyDE@+bH=rpy zeGf1hDkHfp82a^*uVH%KE~!|>JZ7{J?jki_z-0~Q=CJYcOm_IKjk=87YdLZ~7FNbA z)%@r`uj!}1Ueim_8@_eaF5M0MwE4h9t=XLGkqcU#k5W>w**FtSM7-P!9lgAhAyZQ? zW|SJVVuE)(-fn2vwJs}K40$WX)i`q?w-)ed$7EW+7kfNU%qg#pz1(%~q%g9j=Iu%O zq~=O8s^pYX6BDE%DkEf0Ogx7VD=l?5dy1B&X`GBFAA1&=7^a1@-W|7TtVIv_FFZFQ z`LQJnzyFGmzvH2ROIXD^as%s>HWo7<5@(Jn)N1J>niGwZutQc*WTij$r8SWvYCMAUUyLt3UB zF6!NQA)X6PS z4L1bn1)z%*aj5&JzQ`0<@9ynBoQ3QvLoY{n4hHk{<{s$GSwH5TW6sV!2$lMzh+CsF z!h{n*2us91O*WC?p1oqbW>FHoom>4J%Z~k4G&na!EP2%nSfc%c-BPhFiajzs>PjOo zRLze^$lx9ODAAe}Np#n(Q7Z!N4LQDND_6mjM-H5rSh^AB(Z)0a?L9fZ80dx4$ykBN z2FsA;IhXR&-!2@g@G%aVACxKg{6f#t4Yj8Y>n_jcAA0P!Tfw1PuJe}NtI2acH>_`8 z@4v6>^2p{kezfUh?HN@qVVuL?71n8 zvh1x{{S}x0+Wq@_g$L)7UVIyC^7xjy)BD>*Lw?`f_cOtS+Lk@ZSgg3Dt#bqB`4m3D z2P4F3^fu4H+eR$4sh^Ki-GCI`$|Z@s1e{Gc)-rqn|EsG)ob&umR}OL#ISWommOkVq zi-!4G$`#4t$T&|E)?FQE-3XL!Pav>qS=Ni}c8rz9My7BCNpNS~B@<8HrDRYYfqV@0 z?VAXJ#?RJOYOrw@dJs2IkMVA2v`Va*Orty6jFT;CD1n&+GjO>jkZ*yyt^dG#M zdgN`%f$^zMhgUEe?#S~z_Wh$r%_VDx;C7q!J;?I>017G zKj_}BS*~bIS2o;#>yT{a*`JB+MeU(+o`EOpQR+Hl8X1aC^ba$$B9DTzJwLWw(SLJB z#55;(Iz7Pd{MwCs5?T4w|9YpDt2vkb=95J}R+(1YRTzEOR@rawioY#Mr|gu)wd6B(|*Ry{w`O1^%&Wm-X=M92T7ZHaGWPWErcuJW21j@C1HKD zD51SBo0}!Lx6AIkPwq*^=v~RgE=tlZfs%N|^8^WNu>Yc>Q75&>DGT{)N$gp(rkIgl zZse`z3n?wF^y)Q`TH`a+Vf->he#^|~z}t&cw?i-0tSpU=k3HcvWe}tayn3G>cM>46 zG$}MU22Hja?#VacDet|wqc1LWF@JH`VI?tiWuco=K76aPFFSA~fkQ0FQZ#sScSDYD zO~*}J>#DeX!?+>CYHj+?<$X8yH*jrzOsoo=Nr~hUHklj$Cgt(@@p!#NT)lIgw)D;m z>k`t^1i-?tiom6_IHvy|oOd+EpPG}@y}m|hE&RB*=hh*RA=u=IJ#22*U753(d*!g4 zH?qa9qReOXvz>k5PZcRbE)R`Up$%x-^IQ`eG!nLsnQeuxf}5uk`uMnXKY1QTkwFfD(^?jpBb&}!E5?k2(`|G zAF*p7`zTMtOg6XRxhyv(|A_mb?FZE+;<}@+O^q-rx7;eEe|#glVSgslB#L`03Uiz9W017iypL{CI!QFkouv zY9H!EXs>s8bNIvrE52{0W~Hj4#_!kHwyUNa(v_SeOB`yl36v;-g-cF%4JVaeDVhn) z&3)KcKH1Br5j>k4RCDZ{T)?uiztWv*b5i}K5U16br1nm1g21)sMt!MYj*@j^r<5AZ zA}=+iN)tR!K8=0yfVdON;sS0jspU1Rj(@JvS}9yHp4|l7qP~+wjmVoz%k{Cpca9lN zMbXF}pbjXF)vS-F=Jv5{$0e)UVjsf{2u}Ojlj5b%*J1P3_TNjBE8p+$P{s8oCm4;K9lC>$Qe#Atojl%3NFZHt#Rl#Ky(Hm#fVt&As#1<)Fo1 zFVYq8CqI-KUmpCNZ^%3N;r@-u!FI#>>7T=E>_0MTtWp{p2QD9o>pU+_hgUdsNagS% z`uc>&c}L0Gk^}dSJdMJ)74MdiwJMA`PBbzyvRvShM`;I6??s~&?&NltxmjJ?bM?Y} zm$a1BwL2WIQny+!$i*9#9(~0>Rlf3RG^7ZF*5VN2RSd`rU0Dvv5$n3x|EwRE&r96w z7=*rf2mZpa;gPPxx0<$@sYd(W-ZOV}U(WEq+IN+$e* zmI)&a&Z7oy#kZ(!EDb&-c)}x{E>+FLQHj`1gf84ku0628cX^+Xje7$Ny);T)70y$~ z(kedRiUZa3Gst5{TAoV81-v(tQ%g-(MH1LaaIrW0fn zGW&(&eO2H?%?WK>+EUyprTmp^McIjOZ`zvPJa}JHQ}bYknuo&e$Kx-d$3*4aEBEfd zKFuOG)L);VpY8XR^S&5V#=;L9i5%n>=A$(+SD5sW&K^Z@QUuu$9bOoGF1_4 z;@Fn=&kOI?=W1_GSl_CTbBXcDwpD9Ly=`_W^`j(Ee%2Fczqmpx&LN#yM7&Y0hGyMo z15^i=Gx3|vLMAk!4=CW(8;{+SOdX4Wn*yHwAokHMJo~o^;dMrkGW+CRbrk4UQD+jx_6YPd5sL*>NvXV74rzj1D=y~tzfcChQ(G|e;D zkFR6a=?DpqY3Nx!fiiV;`0dTpi?d!xKZhP?i$DkM`sH7;_gdmQ`Gb4mn7o0Z`F{2{ zl%KV&rR(Z6<5)^9gw@K-@WT1`8SNMk*{WV6tYh~ilc3>?c?BG8FDZSpl@hTnA-Kiwa_ z=j0|hqfY7vFqo}W%N|Whbc}XOK5v^O9sOAfUC;V_<}4Pov}OIcG@dL9UAsydZrzLm ze&A;dHC`H@YzlGorT5qSUBZ5)eQvrzg&P_VT)LxvA%DD-3qz4Y2j^J8-3Lb{xw>?@ zaAGL7SWlqzv>bYc27>T=OZcxy?tweY_X=lYO!194D#LMM`e)lsTQ!y8n!VTd9DmAk zkl-08`B=y0arQZ}`!#n=`aR09Fs68AJF`5fvy_-?D z^l!leotFb@J~Ry)QtUn5{SD5GBFZPzf@VJX&L3#(r2VX!`!1ZW;aw<{I)-#3-(FsN zgJqMR_(wmyE&fL8)`mNux*NtH+9wPen+FkU;}bRB$o2b#mdPN81B2X=7JgdtRc**y z^%q8I`I6)DCCqm(0Gc=uA%$P3Hd15HAUCkAJ;3B~7WR&y8Tyl*FDhd7MNw~{y^SAo zOQue;H6!@s7I}Z``ilBaiXz@;a}%WBI*H&OWZb;-(i%SLi!WcT71{1?;0e^ACG= zmTOqGEAGY9Y5SvLWQbnLkBgppc%oBb%0EnfY&3MmRs|m;q+)WPCt^)@|JP^HCJ)Fb zYPDy&@~6e0?E{#?z-1c#m23+d{00!om)r0gY+o$VSsPt_Yl?d?fq-=Q4;^B^r&B_bg@S~Tz z3xb_uMz?fo*Absfukm~8kwuevsR3BW_9)nXv$2Y+I0k6|%esMZxtAN=BkTn4INJH5 zGFBR&rv5@OXeZLD3}e54FwCHaojbL6Lf_MG;pamsX=wxbJj0zkulcXIG-toDjcmGV zn%WU~2#&-cXv&99E(j_gD`xY?atf?hgiig;j;5~e$Nu+3bb{VJtj}&0QTHTQFOHke z4dlli`TW@bZot%WDYl-H(5)mEgLNeb@0(P;l{U|)hgQ`=c7I9Qr7P9C!bx7bc>OJZ(%U^G{VB`Dz^G9F* zcz6_2jiz4obmYaoY-uY$y7#Ic`?-6%6+>xA>3pbOt;8XDLMh}y-O)MvHng*(;@jN4 z_IxKASsD(t%=U%|O69w?1X;Rzy8%w+jC09c418T+^>@^J(fgN-OG#%q1M5IcRh z*j^=DtPpz=*0Zvjmq1ZA!URxhnShWYwScH(&xM(ix_=7G$i3;y04T@g{4w^|N6F{; zZ+%4#q-MFc91M_FNo``p0y#PhISo742lBD-$4gL1%=Zh$T`%gU;UXmkr`o<>4^O_| zlcHdE{o!~DwEQn!a)PCwoaaqNPQKR}Dp!35+Y;40?ERsQd6R~bYwDf8WmmcRiX&VC zPLK6a?!z+nD7B!%excsw*wnw!dA2Z4!uQOHi)q1i@c0+8e37qTzjkb5jl$c9tD+wl z!5eTxi4FeCFq#auu3nn9JtJn%)yFQvDzKjBOjK3fAN$azCZsB4owV{lOGX-3(XN*j zaotJQJ09){#fk3yp(MCpH7-UqL{QA`YB77~J+65b!}QyMd%x9v7puJU$g&#sV*Bbz zc!Y4gjODpV@@tQ;BBA7M=e`_O*Zf-O^ut@vU8T(!bIyzbaM8|e%W<-YN(xgPi>Z5X zs(X*BKNAFBr)&X?*>qmr@r5}g8l#F7d+1WU#Y*h>{wG?HUAw|eeiy~B_ z>}!cp*&?)9LMWs{wz4nJ>+N$tzq{}Ky`SIj`5n*m*XKAoIzC79zOL(aov-seU*~m< zsON5Hzn6gJ!N0HH?iYtQqB9a%aM?KYJTH*EfeAK-1Bcxo96DD0tG;^csiFGlgfjPDgJ=QeEuk!&$#OPj-=CschA>_@b>8u9^0wKn1r2(%o#r{& zad=gq;aC|b-hH4MiZifa1OYX$XJ`6WCil&;n}~PE2Wsq_ z_#Yj9zjonk>+aid&4j+9-CKLrSt~Pk%T#5Kjbt)Yp+ynQQC;XbQ(SP*% zAA%^6l0l)3)_t0>n#!}SEV|t`@cg2u|Lohn&XfHwF6A=lv*Z#(MN}ObdYE`%(!rr1%7Xr3>TTkSl*#Xr7cyF zy%=M4dRM)~L!f;(QI^{xWlEkn7Ujk8V~Gl5d|d}H>C|#_*U##o9l0`JP;J)&Lv=$= zytwpu%)O^1Zg|+qw|BTHp~E#INyc*L<3VWOmiXVA?!^DqKqu592u9`Ys#X7Z$BB9i z8F_8P(Ri+{GtcE4T?C`%?T`}>M3&({J#@uH)WEv;NUZ8tuODxDl z%esObGLIV$0YST0Hzd{u9~?n^RD*o~-*r|Y@hV4%eBFmxv92QRX!^7-`w;8<2sE8W zrUq#I@LcKtWepgGy3(4)ZKtLN3TGmo$l}`fnu(c$!2tf8#xjhzqo&Ko3`p4$p@L^@ z>zIs(Ttj~`ST^riWfnx?`Wx{~Oz+>=eR?vv3kM4R0Ki5@Kd|a5jk9x9yRDny( z4e7_u4RJ?s*8*GQ^d?cdx|3${^mtPg|8A#0KRbM8hV@^VFHvi^%i(&O}G; zU7mbl$;K<2&HKBMxc)OYe`hT!Caie+ogZ!YFMGc)%;LO*s_%}{!h-eiRwWIe=D(bRrWRi7wIXXvVt z2R;vEgmbC%{0MRcz(YK4m?=t8>TcH-yjqN6J73qbB|ue?Nind|jzh6dr|tywGbp{?r?Jdz)+*9}wT&Dp=Yib(;zl&D~TVuCZul<{)4 z(6Qlnu^)TAR66s0r>6L$xfXK1bLw-mxq9omivPbS6eUKs@hv{$0*O{h_1POR=og~Nyue7hG|a6 zUrRR1Q9A-_A;`px-dMCJ531@X)Z-sVDF&78IDvB%oB0{$A;^!w108Ci(Oi-iaWuN;w^YD?3w*GIwCRCByhNF%7~*+Da}xwY9g z4TXu`a!Z%>p|k!i3y1!!UEeD6(UH7|v8=VK&ig#ywld@1w%u!cJ^N+PeQP-)hj-;- z+*)>ilXxT=JJywN`IX+Ki!RyGEsoaX;xj?1G7JHt=*s>6{tljpWtzhr#}W0dxS7P* z#xYUu4E(j{lhroADuy;!PF61`nzmQ@pW|0@3hxo_&PT0Z=q_-0e_xv=;`;TYZ#NYd z7Al>5jbDVe!0|dLe0IY!GUhX5)N=%w6mf&V%)w<3NCu*bJP1bgKn4v=#8pE z0FoC~u!BaSNuc$Z9Q1$+%(mXofq*qLjHay)I51-I2-Qf;CR5XY?Jl^DPb5Nz1+u-G zA*h3jcm!FK^>ok|yf*}l*jOt(hKp?B@t<+iKJAZe!ok^FWI*xKI~{UP(K^@5(+yC;r}#W4G( z(qp)otxU`3r0?;tFY$Ix5O@o2_Gjp@OP{E!5O~y%fRvFW%a0YzXT&hPQxog`^4pxs zDD4Ff+TvX4b|@bP;O>r~+A}AfUwA4okE%tTAL}%pIB@pd_jZw*Ip(T*(L*<+J~{SP zc>lavJIeZ&xg*!oGIP`1ug|&Vr~3ZlpOkJIZj*1Edk{ICuq$+Uk=I+P@Pa?T<%_KS zANpwUXF_xR}uQ*e8k7`k&C53*E!R#9oSiaj(Z`RX+HO^HvA2t;#! zBkkoaU*&zF{|#-ey_YLXVELK-w5@@V={{#V8M3Mo-l=}HI=D`87&t*LzLfe&qi_2# zpiFQ5-?7Iy7yzqJC(qEB#nD$Q@A9}!51c7VpwNo@3r$ayx|xe((#=tk^S~Xk`_HMj z1~t6YXk9rZuEDz|B1{d?tf*Cgh2DRHy|p0UzNVU6&~!8=jwP0bka{B4-D_xpN z2^BKhP{9(;$@i)N>3Gi%25S0w32DcQc?r)k3kgncdb){IZHk8A%IF~csB*u@U+ffr z%L8GB#vA!5jgNS)HaEKqyh-p*G8beL3prxW1_afxZm0xd&q1;nS(K?kz)9#vF*_?# z%o>fgR*kN{48`1c3Y;%2Ik<%v5i1jsLfuD=pXGFnrBskcj3n7xNiT)(UZG}K&$WgvoEwI5r6Wn z;Q$_^hh|+;!hX>MlMwNUJx(+ZI?=xRT9V?BX<&P+?*4K%emdZ zApY6+egYw0*@~MEP6tY&p6O%7CXT55)9O(%PyHJ@t-XG%K|=&9iMCVZj_YnAML~qG~*~OVjvJ+fP z#G88QJ!~A~+)Tr$!9<+wlQM9Xv|9}&;MML3 z(JzT4%>zT#7owf0+;}mr!3(qM`P`Zsa-28Onu0$*+~Q_Rhz<$UmKTC20`J{zQYw*ICYX&GrMqv7CSeTn^(9r71FX|@u)U2}1UFx(^j9b&)mOx^% z>w~`gvD(PM;3&5?kVPZ!4hbi1SM|}mrR4lEF!>|gV`-7y-BzV?J#0ias_@s+%&+TT zt_ddxuM7$MOum@UX^;Z?DPFLk{YEm{_M}aFk+UKH!Am7)y9+eszB+oZby(V)e?^tm zUH;MkV%b+83+;9ML*qL+7g#Ry)c(O5GrQ6ljtHQ)XlMiFTMk-p^S2y{`1cLAcb#vZ zB_O6fXxPBtwCK^%RWx{OdggeF#f(v=fLj(5_%KMQ5-zeB@fJ>3H+!tUtL#XUYy@qH zgeDXIu5F=&{h|;RL1!Gg7K3Zu+)3#umsGOYdb?1FJ^;xkvg~ zq-m>fo0RUje(NaBl8(xrh&FsqA+YIT;Tc1aR!|Yd{)*o{6e>6lXJ{Ac3`tJ7;@Y(c zrX;U$3~x>#Jbgj^5{v)157USS^MxVuZXRzU{^nUO+3h~lid3*nnVwnycE{5o|HO+d ztuQvX`*R>{mhSIeL*(cE%ggKVSc_!v+HBegFr?4bKuUJ2eUvzNhAY zRPG+9po$S9t}KpftUu=c^OV_FtbOezNrkts23SMoE@Ad{t0i>zp>B;Y)QMx`j%qmh z$!BBo(#K1(dlb?FW+L1;{J!0C$pStksO?Yi`h4)ub9BRil{*6~x~rFIV>PQ2o*jXm zs|$R+>ud8hmT6tkOuR`|J!d9^$zluW7r9C%G5m0PqOp8{7*4&t{opo7dpIfrWsG%Y zC!eePgG<{s&XcQ&F2V?iOf8Z>(7P-`d!_5AUn+hQ-LR~MR<3-AnOVI(QuKYXY35YS z1*Ou{?zhYyg(TzIq~jRA-U*1Gs|?&3fwQIHDL@v~M^G_`Bqb&q1?$)&7V=f~paIrD zE8hfPppO=s7IYz8fAj5u=M|>cG`>4xgGpXuXm&$V!Esy_42iMIgBvSK(e*kPj(~Mr zZiZf*LNF8Zs`X6OBp@asM+2+{k0!B&7o8hOgA-{tJNuy7XPUvK`rP|Y>WNbQ!}*_N zT{;8LX{$a`edbYo*8aJs#Zx<(=FYshtvH#jXN)`f%AX#WZnk`4TD-VB5=g7#z#i^A z6Ftf}S)OtMb=gZoy;V#Y5c+Yw)+Cvf{l%+rH(I(p)A-%4Ju?`}`3C8AOHnbq7Yk7_ zi*uheN#y7?Ah?EK%=aI2S<2K$O*#%T=x!zCY{aA^XW^)Z62pS=1bwgvZ(6+G?HJPp ztEFK=)zEs)01^B^c~2Ukm6X@7Dg4l-EZKVWmKjG2FeVn%250HPp`BiVera>mK7fEYw$yhqTzF8cF3@zt+SHf9^@oc21OIqK z(99F@?*MJx0^v!(g*Hzgt^Lk~XRZkP@{)N~;RQ=f7%y)8^7c&E7KZ!f`CktxgWTtQ zlO2jQH^gupCSvfKugpkfN?LOHvP3hxT(oDrugon_>mm;#CM!7%7JbGRhF5Z|GD%VS zzHH}!X~s&qAp1c~)XGs*FPWb90p2Oo`?S&zJA(M=+2##1RU+1wewKzq52-E-wjE6O z`SKf#2pbl^M7lON9y`orT3nKqvx`~2h?dapgBx)+wZmh#enu*NMJSGd&v_P!VGB&N zBSBP*0!ecpx8})IX+lY!_^89aR@Ed5JXDy2J!XHNDu_u%e22YwLR8?_17dwcF^%bE9e3j*;{h0)wuKAB5LUmU?a z?#RCX(JeJS`xB$$>0$TBygTGNaxBbe$9H2s_Biq${MO@mgfH^jmtipR6gf6*78fN; zFtX99%#R+U}aP;5C2$>AGzrrCleEx#VhZo+_eUE*3}2+GZ*|`!|~y^JA3o@Hw(Lbc2r{=n5@cd{oas`9Zxf*KL7FIQSS9M z>*7<7Pobg+ATlU8tuFmBup*y(xpyESlXtXmU|O|c{XoDC#j7Y$0$dT^J6>u6YE1f0 z8$}EdMt4+<-Px!7U(Igce_roJ{_664Gr*DDIrbYnR+fRt%_&}c(I{f!#nFpIF z+|(cs1K;rM%<0}z z6|9)UL;_hTJU3equU0|;W7w-4cm!xHC~EfPD=A=y2Ih5!9LNdu(tslmU7B;x zUcCftpLYVjo5FA!SScB$ogF)1@og&HJ&=QH0ke5hFWw72WH< zBgG3AUu_)}p^vjC?+f}ahvGIJW$z zx!NSOp(^vYBt>d8^&5{3kL^8?Y^}Z2xMyfvgY=)AH{EXHPEHR(LgH|Fk)Cj&>!F?` zvy^MtZgfqtcN(PL`bO`T$`nV(fP#R>UeIT-dkk@?fdPU@sAxjd!{t2LupZ#;`-l&v z&d_$iZ4d*jw@UWo)jj{5&Cbbh;$xtw8Z7nhR@5+hNHDJO`bw=w`!I& z{MRjmlQ@HXyEYAJhqeX##(WL4U)8=Xm@hJ!A0*BxsOAydOuQzM?`Tv+ zcekUeIoHi{%ziwRwl2!biEA*rl=>iOZru9C#gK-|?9_KxE~P$!>EDAIt-mJUKZq1? zG%Y)8Z9WjQdvw=VV(REMFPe^bi8^9NJF0}P*LT|ED#*aI$zFB*A}s7U-9I+!3}E~{ zc**|U^SZDGe!Y=UPW35e5K_yumzj=BO!?PZuK@v`3_e0-DAvmacUD&sMmRH&EoxSk zJ`dcK$(hXR1Fp1e^W0=NGjefg7vk_N+wY z#s`WtEvja70`@8CoY40WF;NarE_^56lJm+S7JvPr4Uq(kwPKn{;)oi{iAz_apl6Nt z#%rEk_7uw=tmY#lhwf_Joo-) zxKPwd8n!}6=573?n8eD9-;zGnEIkkSoqO52)pPx__TqT?`mw6@JJ&`Q2l^BogU-c7 zE&Tbc^rm9FyX}pIjvdz}*N>T=x?mEg@J%7sS+KLoQYN_>?9u+8sr9Qb!`Pkcu5bN$ z)<2bBNWT(dgwn&DU||OaWiOPl3_b~ra${s1Q5MZ)}~;B4nB=b}wk@ zbg9*^2k#g{XEmTVK#VhR!WzLOYF^9$=}|2v)2hfRqU7`kT_8-vOV4yACnjzwt+>%J z#a$H~zJ;)J%D)nvq2eyBsY*aP7TiX+2kg2qZsk8!%hI8KwVM`L1Zvl(3hzvTxVY3* z*%wyl?u0Th~85F%OM(C z>GLCFd-pSIi<7FXfz5m}vy*bN!mB?$ z7Kit8Hn{}*e|zXZ_SgPX4*I2`q|gaJTVrNdvYS5 zLYoiaU)?9VgMHj;1-DR6@0Z;9D|lu4kol*W3ples>t8s7O;d_by`8Bto#fzc0FU95 z9^svqc~AOTct6*yEu9(o^vBP*vx0>kTmHqrkalB^zP7rYt8*C$N(+qax1sS%W8PZK z>_4FP!HxRu@mJwxPWIoirUg^MZ3pKY5m3hu;#$0H!Fs^}=Eb(Y;NRbml$u=n{r!IZ z=@sa`lJ6b7oYO^{zqByr(9ub22>2Qy`SJ2Z`~A>M>#?XQ)lx%+&Y__{nMa1M2?v?x z=bNOd8;}`8L!}vZr1ws@^!`hE*xplZ-WmA&UQ3`)N!6#_`uE&zkLhDYcW#M|LoD4_ zV(+kBi8_+R{-~78l!*9-^l+>;h(-U0TK@>s0hI`1pEpjrzK!eyP*2plkm!|K)%p>SjNwf#Y*ky-IJ2n^tDo`1OF#oA(ENnk;b@wo6^9MGKak zZ!%yh$09!_e((&)w)gL>uO7TyeC`D|Q`x7Q;2NZ}Rb~Rao6OH?ux@Aa-v1oJ{0*U3 zj<3dv9?J1w<aASuOxWlDwD+*SiWjyv2*X;t0`MpaToo8Oo`Pq)o0)g2GYH7!J zOe4WhVWFHacbE59iv0&v{{aEkDb-gMoA8{jVT_tv>VePP+GwuS7cOcnLc*E61sV?z z-_6O|q{rk2Fk`R4f*8H$dBVOm2WOK{fU6_*Cf1K2quPb1> zVG8p=&v9{?!y73A?xv>p@kW_iOFF!O--j(;!~1r9IwUE3#%pQze>`@@k@*qCElK~l zj_Eg#{s4>4$|1hQ*=@{P^ogAHo%|HI0(K4cH?LrkFi%OTJ>&48GZbnh)Qj~oY!xOwC%IEdfdgb6pI zl2bQWP{cFxY1+9t+598}WTX7n)Pc%#kB$diGon3P2Q}w#6MObZ!vZ=r2{>`6=5BE- zaKoFre7nX|brss}$92B4U$4nU@XeaXOLKCft7+h5-A5@=U~nq*u#|t zX?6NU!v76BvrafKx{n1s9;dW{R+2ct%w0RD>F8YhN@sXzpid@k?T5py<+klyuSVA! zMb51aU}l=u4-yR{b(;H6dp5OgdvW)4P%f66$!!kW+^4*E&vfL7>+9?PYzc&aGw)E% z!dLdv!9H*+m!j+osG7dI`>~jEYTV-6y#r?KLr0DrabtQ0Qyp$`J6!7RP1=2EyT24R zM%OL(Ri4XbKHu_lvh(R3qkC%B{Xxs_;`-ED!4y{o#@IDKQy3s9{eGhGq)zE7T>XjN zwBor}tXWt!p%WMZ-m9F#^01xq+<5VaNQ|;GU3un_D^G38Ewr$_6JTt7@|rUoD;%_N z|B?ctNWO%zswhQ98FKSqT3<+2pKaNlBk~o*tEG2u$yzkq>E9nrWa6+BtYBxeNaHEl zG`LG+_4hI6`u&66L}#k~m+8X%qeqV>rqhnFp6C_u==v9DOHWd>kI(vvPn9c%)~d7S zi>@EZ{*QeF`M22}1^@ITT>;QF;5NWl77i}MtlMvOWg8*3JCQOQmqy=L+Y~UdqW}V4 z6(>mfGjw?IV3XF1038MVUss{`E)_%P!%d#4M!k;>0lXguk(2fOerHKjka$EVW~mJ_ zUhNCr(m^I%xnMek0hFeq+8J;A0IIQS(ag`{`F0te1~+OeMGe{nQw z`>!|Bu>P8hzhgKXEyZ)2tACWIQ3}AxSZaEM*%K~cqw}dF2w$sgsbQvgF&GFDWV)w= zOe@4%RS54s6}7*4KyKfiz{Xe+gM9_{eAF+3E)^`?oG)3wt>)X5AMRKj@-LvBs0j+} zP@?S~_r@K}gO;6~%9!w5B}glF1+OejyS>{U`ITR_SZEUyLHgN+i5vmmf*8c_)PK1m zQ?@{OuSZ`t?++FZK6rR?7;F3W&sSf^7N&l7`Dy>xd@KR-)BTG5OzRiG75K9-l^esm zx(m(p6hpwaThSU`It~`;Mhmb7a7^9o4)(kE?d_fBa4u1&UwxGZdYX=!`#`DZ``cn+ z``kz8u<(B3^RB$aQsLG_6G@JQlxTa226F}RSIwgdTwB?120NASO!{2FyLY3-E@JO& zQ#_*c_5#ZdZLgshBR7wakgYxC<(E6YAQo9DkJwyiA* zFODm4zUgvyYpmukzsSRM8(V;n);XVVjLlv|>@bN~+U}9aEz%jSrVZ8;blw3G`9UN9 zD1nOgwdD@}b;JR&9n_n*eKq~mxHYylkKm<};{m}i>XoH^ZL`~#9r>ItZ3Ey(n*rw6 z{8!cNVgEroi`iu~?+}pjIjvO#1rDK0^Zc81#aiwiw3*lz6?s!5xcZWus|VhaR1gvt zv}bdAM>RhIv9|C-RzNtj^z6^l4`^tUJNG>_+%JDxp1+a#HmT}C%m4PL7f zaHn-~EHcS)@mWr_1+N`jTN%}WS)-Y4r2{@AZywBvt6x*7St$xw{nPa`a997o=$dCN z^BZr0J#_M6Y0;NrPN!dq@04CR9^}E z#_C}+NoPq}o@Q8GL90PWpTO)uYbj$XYBLo2zVjgl*t#7vG;d*SNVW5feoYZ@aXjI; z<0>$KN5E%Xf7XmXOyuMnND(1qQMS!XaKWM9f?zK#)p&<2Gvm!>6N_L5Ew9LSrRX|Kx+;hrXR=m z=ugV)<0c-Qxz_n!GiIX@TuP)Uo=uev%E%5_dbB(;8%()L@v=X>IDTWj(Iq(0v|9f1 zWdrOrPGO57yrKd1>+1+5pJ6?7hnV8`FFw8>YB|@kn6}sR-u}oP#p_4hW84B|4W2Xa zo1y!yxE8Z(Gm|J^L4IM{^fM8S!9cTI z3*%Bux_$0^l-<`mm7#RAmC;gH+GVHQk^GWK?Xj|N3n{h1vU7I&o_K!GGMzoZ2+_?D9tQ=Ku zT?p$-y7^wIbD{3wT?!#=OicSb^Cn~$^bw=d>=dgboP??ak5}p)Z^ks}Afl^e1%-M; zL9v%*#?_w~g+oJZ@4x!iGqLEljUxWPWmli_#+_P5VPS-zmO12vU5{aY-i|E829@{s zjoI%|3iMjR^iSHOj(Eel1XH1^^c9B3)O~{~3*8I9`X0MYzL5Ps6csG{(Q%rez0V5V z-Sbvf)tCO{^uN)FWp3A{)w#jdc+S4UOY@-pDFyYRKlkOB+RDLy<@@kpR*1M^a`rBc z$ZZPAa5e5cjh+l#Ut9gTYFiy(t)W$qX2KYA#IhDBOyBeypwC5gk+m4rb))!Y{(QlF z;YrLS%X>8M+`BAV8%tT(_bJ|W38AA$OeZv0S@TP;uxd>wJtKIMU>oxx74>pG6yq2=IFM3=% zyMC!q_TF4nRcB_jQMQeyE(pIS0tLr9vGe>jC7IDE5>wOm@vY5gB{y2hGPFiR_wgJv zaQeAZPe$(tYfJ}Z--`%M%W@^Yo@%$nop=4RbMwucK6J434NGqBuI0lRV2v)o zBnqqZa|lt-c`3cmV}y` zl;)-cEvP>8{?`rAmDd#Ga=5wh;6PJrlA&``)Z>{;Z5JL=OdpsIN}wePtnGSar6_?- z^f6@)BKLQVsz>w~eXq02Z>n!|6%v%Z_KI^{3EgzdWcC3}J$(!p+tRh~T z3k9Y{|7ft$Wx!*MYJ;U=(2Uch2u~u&@JR9nnBWA88(fcyg7_*tmI04&L%7&y;ln)i z(z}uoNWHe{>e_^@#fFsZVmX00z!gX6Oa|QePOU)+F6>of_!QCc_^UA~3O>9EZR?k6 zT9)TUi>7M(xL$>@oNMZ<(GWW~xe_C*V6Qz_v!rqd8CHM)H>|{Q*VdhL8F{^SaAvh< zYtirMZ6neB`fjP<`-n4-Y_tOW-K0izGE?|*5tlX_Grh6vuSms#q?=_g3j^em_mKPq zzWL|SL6Tu2LC8OuC6%vcen}sDqOoxwrh|+^KqabOYw+|H`i@Z~SRfA1JtVeu6IP^` z<*eU!7oe#ICon%)VTkKw0=@^)fDXwE?UOoiC@Mv~GO}s(q8f2_@)CttJ@J6gf{Dki z<(O+uzXsMtn`K@%u61ps5|sYyqH5SD7;bBA{_%>%sja@WXnf+w%&D}^r+73+LcSPc zgG4#QFaGw!A0%lhbDMQJZX)lQ4)NTMRWB3c*tmLaSjR@ShxQAw>YA%G2*et_6nO4n zJ720s@L}gNMJ`HKY`r^7_uMbou;7WbYtddxvtiL-R#uj)TR7NS3_M+H>hTZhV8=uC z@_{KaN)qMq6%}4?XUVOp%-?4p(XR`K@~VO(Iq^vc>g zKjA^`A1a^yE3nP2^nbG^noeLIs>Qmk{2H$eL-kts_S``bNxe$vg*k~38jQOmt~s?0 z>%bWi(|P`d+jt@?7=?+P5EluM zpI_0k+7PO=-hasX-TDk=^ZHx4*|pUI_(a-889q_t!FQ3t7Hh%30Xvygap_0A?LOb5 zn1+HNg z@em}3sdFxwLTKFwuFd+%vtJ-=<53`EbJ<1k(8lFO5MTc<9khkmkl!!KRM_aBlpj(Q zHLF|fwZ5&+YFc}(XBI8QRdHb`A&VE+Ex!%?DR`27^w?%3=0+m&Z%5=!K-M~Wc9o=U zZFiG02PUEMcp)>Hb$*w4hyk;clNngr#4gh$u2Drr8vhKSm5XYQqmBEBG4z8-?FNwHR zaNIi4tfJFo3D_v5a5;t0A&>`oU1ePPj7S9nZ1ALtt7dvxy~w705T)!$_bz+pJ(9R&i-DK2^QMUL|NPuIfPcHKQjs;H+y}8|)VE zy4D|K&=@Z7uyzDa$A&p*TY$!VtdZvAG5cl=Z<#b#pDFm)HO0};f8zD9TVHK=KqXSB zwgL?ys;vwWjtU2N$SA7{!J+d-Ib?x;{)oo_!O#ePU#MVLVQfBIjmq_qGI&N9FUDzw zjmM)M*|4W)Pzam!?Q5;J0cjz}RNC4LPU&}znC5LUqmfd){qy16tQO|Eax4Q#IFeDP z?tikYwl0v#ay#|l1&WHoP0`6szaEQ)IBcD5#sf>zSH17fj+_)DjZTy>PfYimAo7zM zC-6ZMFP+Vf@Q3N5|DQHnJ}UulFcPOOeojB_C~OHN)1gBPmLr_0ess@WSwcu+&PEg& zIY9uPmaDIdl5@GCXc|J^8m%qhbuwC!Cf439{l5qw+Xq;TsP{3YR*wVjzQ>37kOe#g z3wR+Tz`P<+wqn%5`gc1|(Qw2H7e(FLZym07^*a==h>a4p?XMEWTIuyOE1-DcoPV&Z zr*bQx3v)Kev-p(OBVQiZ4w$b$I42tAD3X&>K#z&oJ1#2HqH(YIEqw#SZX)b_nij?p zkV%3t9<*@6nD#`o)@dzz=7@+fNs6fbW+a8ldB$Miy?>U;>7k;t)rcKr!_v3&h14MC zEvC~K+~>TdtsI$Zy|2gz=o9c(4R&x+CI0kp=Z=57nV`Du1wA#TmMqp-EFIZwYbX^h{#D0*FoQ++49uph-jrz<(s6Lcs(i8Ftn zc@d4f2V{DyZHdKK{{W;_M?4ODrbs>tJIFPYwz36QR7Hj zP~wEWLNd6?HiY)%B#h^=1+KZ}J4y;WrAALYK_oXL4EFW!~5xaOdByX4Xod#rSdCwFd!; zJ9Q-LER(+^u{AbkzeGsSHL7N+-)jL@2kQ8N0lo0=++sX@Ja&Ea4L&M7$i5#g!)4@n zo=^4=ZO`0f)N+I+Q&}{+_o{`g6lOPx3xYtjG=JC^njU{emV%^#DwP^8Tzy+TWGZqF zjh?avd|Np3-VjY^lokH}_CI~(gR~=8w*=A$TZ#%GB*=ca>E3C{2qXbfH2vx zFP>#>!^680fxXG^#Z~nsZV1C?Rg?_oLKOy0UBImtlKc%`-eF)f+x=T zabALef}^kaPc$007mUSv@vyw7k=xnPbVCeXXY|H|*kkvM^9H|&Lk%$r;)c}-?R-{# z$9}Qrl856*9=vJX#<^}%9Y9J6NUEVy3Wwh{j6@z1N+>OL9BDtW@jZI}g1ttKZP575 zpGj_(9JI!yUGnfBrM=}-VfTTM?2ZH&YyNZLa{LY>^pohH&p(zne55zhaZYgvusJ5H) zdVSsdk_;(gn?YQ>@b%9FI}-U7Ee&Mn3gO;8kH3I9umaPbahR|{2mn}s2QU}FSvn=f zl^(`8%cu7doPz20J{jEjr3-GN_iy7Np7+!NB!|HW&cOnuielQHh(`iI?KU8d|6h*!paAgTK|{?u1eKY7{J~o;=2E*WOpf95WRZI9$Ys(9re(;<$Wt+Vn-%Fbu*zjW6ggpV`e*tpKyplj)b>Lh7 z`;Y*(esQPsO~|NZQ^{syr=n^0-wQxps)1u(iO(wwfr9aG3w5$(?(R^UM&^EKE0>}&8K6Zz**QXUz;B15?#y=Cr5r$~y$ ?eTO=t+ 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

    b+{*UtL|p1P@cms! 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 z zeV=L3j^#9%1j-TfHAqg7HO<*``T8v7@?IAFi(#^H=5NLqKbC@k4r}3KVHYoItCl^O)fZ%93 z6ugGjTKME$m@ktIMo6c7LX#nu^c;ii564S&x64`;ambm^CQ9cw<{bYM9lTx` zv^0CUt-N*)qb3@0>HuNvAcA)2{)2WXT|E(&IQ~jCf_$gzNVf0H*@luk6lt+3{EI^@ zHtShUNvZdT*3#18nwe4CQL&W$G|i)|VAyw7z09hA5f}LFOpsR3^DkKi4|7D){{F1_ zYVfmW@(mSaCp;5*BEoBY{y0;p2_GAsnYxpfnPk!-MLGJp9r>n*;@qTN{LX32x@8P4 zigA02dUcBjcNsqR6rjTdN@Zt19V{tV=n}TO)-(N}nQ0kpt}$9om%{-NWlt`(!$T5S z+&8G1e_PTVs3!?Yd}te+1_nM00$x3frY~s9GZn6E!fr0o*@f?d5vY<9@YxhkV${jM z@f8^j>rG1}m$*opmC&lmruWTAc)AssM$?@v@pPl2NPWEGN8}WWObaj{v}}R5z0S>- zWP!eX?U2ET-R&U1P(UCCuO+i`|KmMpeYR-?-ifDiYsH>^5+1)M5_ArVF9Rbml)5{I z`FjZ2|2c%WzPyjXC{+LA-5B|U5q{XNV>gajdZ*b^huX&mBwX&cs+{mL zo3iaUyORg!v|ZgX&iiASJXHLb#a*Cg<4t*8oRMO_8{IZ-Ps)P!;ikFHMSFr znq+WAnBl`lctOX(*O8Ny*PPG|)R0YY+6bk-jnpS#o5I&YOtTX_li@eJxDYzx&9~i? zlp^ijpu*~}!|50d+2Pq#r;g|*?;h?f|0swNTN4xyTV^`{yI1bZy8!IXVAhoSrKVZH z?bgQvSz!OB{I`F@SreSzYwo}MC)Kq}IY4|I=bB@-EUG-G*1^}N(WbZ3zCtB34zoNE z4@eiQ2zege9njABp7kO#~na5WiYwoJ3ZHWTt5q2DTGT z*@tfy{tjf(ut`hwl47)uCcS2~q>#iP%At;K#RFEX1%jotqDT`wT$($Uci`$czYk1Q z4Dy;iJ{xq;KZDkE<3i-e9V$+vza_!APpiQ0d-wS!C|%&y_^|vYcr5yg;P2F>M}L-% zgu$vGShreil==x)E3x%#ew#;L)TDK?Hk&v2*Ts`c{%;St^?GL0bvxf(V?8UyNKJq= z`&=GVkBjZ(7?uzdebsihVPW>766!+8c>%w>M~f}dBjuO_!_&oHfi@kF=o9J9Gr@$O z;O7qpONQeLPgTcU_ByZDJioU$#KbS7z4DfVS(8Tc^^m?o%b~ay_P*Jv#tm!RL*|l- zZ~?@td|vsLmIQCE<0%mdTx!SZwCJzmQ$?;|>L(AAJuWhg#0<($qi>*( zZnTnPGr0lQcP^gOVDPMn)0=H~+CyWKJF4g=q)Tvt!O#9`aedpskW>;q5rdWYwn z&s>`)S@WV-`0m9G+fm1k5y{^wED^t3U`ZwYzVzH#Ulhp@FsYvW8oIuA%+?cSk`ene1!r&NW;AcEwztD1Cxy zlNwLEy1JNa&=6G9v!a^kGz|1rEn^2mOq|l&q22KEt&9mszdY#cWxDyC^QHH}x9CzR z^LC4N@E!u*O>1@fyueCBEnj^D()re2*6IQyS!|+sU4-|8=}sNcpjxT&3B|O8C7DiI zJTf#lcA(W#^$F9Oyhha+8a{g#bqtG^;7Lu)CNdhS4G2v)FkCmC!$5P)TZ-sVdszlv zGo|3Jd)f$MbqR`@gC%>Cc46*m;h~QhEh~X=mBMq{o!-rQ>*IMA<-toS-{qmnFas3i zQHKbwjxHsjIKSOnhmj(|V+U9S0I%AAfma!qb7PA}RVytAhxSic5ZA2Z_%o*NT0g`T zN{m_+?@bjcHd-(u_ePPzkdq1(a4Ad9*$OcePu`wVc9RMJ=_xDK?H7GVIx%A|=^Bk1 znzh`r8^Cc2Xf9LHR4cK!F{L`EYkbld=BUV+Y~3L&2bc^ znc3@dMAN;DCHa(^UL9q#`B=x)JdW=g52uK@;^VnI*rGO_9y1kA;5Vli7`0P|NPKKP zr7Rg$QGi%wvU;z^@|0xMMTQuD*5oj%ejriUw3Xei35m_i5z=eUTo*tkn{1WchMTBnO0(q2r>i}x6oC8H|{5x#e$ z>oQ(xuuX^T8=Z&;8s+f!tESnZ5plxbh!^Z%be)fdJHd(<>PUxocLfw@*nSye=ENTEC21iT-=>sEE-(FnEVQP@=Ec$8)$M^bo&8)YU?|( z4!HxfQLWD6hvozuR^<7UNw!iFD={uEt0H&m=uVF(z9iUoym!oSGBBBNVW zTb-tH;MM0UjZrU*qu9goz;uzG5`cuCUG5H5ua2oGMLw5dJDQU8NL1zh&ZBsJY9o9?k!;O|bw5kDYfYSmN9pZ_r$DZI0C+PtbtrXth#3<;sdZrA1#zdF z_KREVw`nFiCT1EmdI&5@Zjybi|6UbW^$bkL>lOMO&NbRj?{;RxRVXl8NM^OIrzWG7 zlMKhy-+p2PsL%MaC5KHie(Nn&?LBuB3KO1bdTF~t$t9+q;iRuRa(Phw-wUHjJp-YB zd^OuSXKbK5u$C(8KW5f%*%jZLo#r7GoZwc7w|};xhYj|e!o-$b|Di-?^t)^J9&BAc z&FB`}F5*6ECmWC5L~oL3{F9^19Xj7!Mz+yVl=$Cc@qdP*`c#OF6`!<5*IXqZeZvqR z?2n8pxN2-xYfk`FI>aC>gf#wS-Yl}(Y0s& zK%WRNrn@6)nRKglIWlTMXi~w^93-}5Utd1TxvrCa^n_W(Iqx1XWzjR*pB$DZ7958+ z#6D^6gxLwOMi}|?9Vfj%j6sk8PSd5PcBj^>BOiWCP5F*WvaHxwM{bL7{l7^bxND}H zx1aynYh!G?E+2}qy&R~$P51mwX1BM#;==b^Y1XvbLzmdu$TD|zb*D>NvY(EA!8Cfs zb)N?e=>K!2lnd#p#UI;*Jj%tUSORwO4ZnMwGC2E)?t#?3ooyvKX);~$GX73})L#Qd z2RC^Sf8agXSbGlY=cmABCYu%m-Iu+=ue8&il~}K78!=XA{QU({;#%e{BZAv$86H_i z9o{Qyc;CU7r04;m9*@}v8Fg+!bC}zo2Zg{vnjOVA4&`g3?_EZU3AFmq64G%)?f7Tp zB(G-1`xW1tcVe-drLB#u{w36_*MSBBqt((6_C@kI-5k4r{Kd-~`@jCPZGnUC1`z0z z7R&zgT=m=bs?1lvblavUAkrEZy;;Kj{;!1laQETjXVn^~zWRl`9dy^u?2c2#GZmz> z=T#48UToaSGl_ZDMy=_EJ-qqqM-F9q+0UTQx@cS-Ub6Ie%JA9KaVGqsUyA9J)QnBv zQlDSnibm0Hm8~;2fUFItqNi}|#u1s)Hm6O9RFfu|3@ z#-h*WVU<z-oJFI6*0pnwei zB1J8Vf%Nk&JVfj@r2!E-!eEx)Clz7Y4i0tm#@i<7)JSkU{=VovHgP24Rl#sy7$H&2mZ_fqDf-^P8#+_BTWpc1YYGz3VpY=}00NI@0i}X0{@e zahNtGvA~J*O&_ZP3>j6zu}wA-uOIO?a#K;dn5Zt%6sxOx9N@Tep^2#O^Qu#io90aW zk9Ngh2gELL;&Ib(4wTMbnPL^+qc*Q;T|itW{XGL-K;I%)q3+dOW%;R;)hqeQ+7RJs zDLtuE@4cI{Dqbk&`9{(%F5KO?D((;kq{0&{Yp&t>KgsfxUL@`v!7h{3pvu?cB^FJLOnxQ<*yi*H`9Wch!eJ6&Ae z@%>)4FQx7{G&cxzo*8p;>kbFtMYxEZ1>nocaj3S;e+z% zeEP7jOpiKTqqyPVmuJ$~;63|pGW`j*Cwvo9JX92_OFZ<*Tglk`$}?TB$F3(NRh0_B zRd%yMd)s`FlZZ3bXB>_JiMg?|(acrK*Xk)k;ndFJxqY0T6`(HTb9e0=x`s~o*}nVRw!*q2%Z*=(RMG!E@F-(k$kxH&bNktWW0cce}0Hk|95T9 zt*)Orzp^5&wYusmxNq&WztA!Y7n+LG!5u;!-wQC~d-po}0Y&a57Z0YT>E`pivr22T zkFi?Ei>>h2mgoB7Uw`qwq|wG5U>DTR1t5UeW3pyiJfKOK;fL^A>kQI$h-QOMEoCQoS-zqeFO%AI zbn&t$!tnQenBiAzVaa*5gOx&~g=5(au*cGD=kvB9_{93FY~wa=-n;H0|yv z@O;c$tB?G_4;9*rrcb-Ve7>xou`Bm!`CFXJnoxfvRwI8$8in!OgCi`i38W=|2Zq382gu&T&CtNDH_1GKLpX{ic4vFJn~E5yd3;=1N%zT?uvKF2hP413wk*xS~jt}^EI??oA|2& zDd*xqpoIQ=XQ;&F?*Gxfw{AGEx@|73?SO9CqgzDAT-~wKjmU$_141CCLPX zA0rO{*jEvj0?LWZb_|cF3scT|c2@ZTFw@TY{+73pf{lDCAFkDs!(4*$`o2iojhP1z zF3(qKJZz zbV-N5h`5_4mFN~DK!b!E|x61y?(tBH-1IBjD&nVmRpjY!T^k|*viUWuUS=|kDTs*G0CXE9H6o_+!<8m0zJhK9of@UjBKrQiSV6r2{@5Y=1g#?v;04|rF!`9cw;*Ea*nkw_< z6CKzl;OSmQckk^*v<6+Ipp#KvXJ!3ootcMkXZuvfbPGQ8^J@Nle#cB`;OtD}v|{72 zFeXB9{No(kljF)J+O9u;A%YBfWY#W(BecyxWbFd(x+P4`C>qO;d%HfxH_c&&%(vl% zi5hR1aNDr}vh06A!sbQ;z+wVu;a?Ir2kbw1OkYv(G*X=iLDV*;GW9g82L}__^)CTR_Mr` z`rDk9OO3HLj&;0u#$L22NIoBxg#W!brassiu-iQFHsV%nUKEG1PYCPH*c8`hG~0Ne zoXM?f(r=FRI{Hk*;XFV$b>?5?^Y@5(IVX(toX;g5u2}SxJO;8ir@e)9$WAZ9B)s}) zG%EK%R_R{TLw5`~KVA@wc^;bGUva+e7<}Cj`MRxGFx#I`JL?-59h1=hA0^tgk;CefpF=^#BWW`I<#_+AwI6n*H^uDwu~;|du{iB_^3>|;@h;z5rxj&)RNQEoQ`^xOqW-FFV`F7WdbR5Mdzb9PSdN`m9kWl{3-wf0 zBWv2IiKzRCn)SF0F#RWw?PUaR(=YX#KBA1m>wER=jyqnMjJCOj)0r*y)g?B=ckSW; z9GciKMSZ{kMI*oSAp-r5H33mH(=|YdQELRwC!~)rK)`EHSj>iCgJ__eu1&+D4zk}L zi#b0RZD=|_^1^NOjIi|KFmZ*QKX5e#@8X=AOm6*sQ-Z5A>J|;kGmz)w?0?Tk>wAuO zMZfSb*1ecAFMQNAPF<0H%c3n$q=wG9W=nuTi5Ftdva zcz|G_>0gpE);3FS;5DCQKC9ONiE9A*p|7<%blNX2Z=Or6SCe&N`x`c|{y)_k0LAX(yj?PF--_TGPEK7mU(*506Ua3jJMBCeeeVKjift5{+iYT%2=9~7 zw*dvF4IV@R2Le5`nG~a@vlL_59EJ)kUOYL8HgNHmCl{h9!@g@_!nwPerVa=tDQ4yA zg7o|-tm-7?&(H`LLL7axVd`@2ycoRvK5?n-n@6E%(}nbXe(mRv12m@w#rsb6*xxH1 z4vQCEmBx7%K-V1Ys^suNs5SKO8Y&>Sfy+04{e~ zL*`-miT*R`!|H40mo*vz%7^<-uvv}`?ntkzU~wS*md?iuT&Q4U_cW2(?xM*gfs0$w z?idC^_;#M2=3TVfd%7oBX{4imiU<1zFCG1>f#$T%(uJdm0|QU9ToHEJISg5fsyQeL zxEX!Wnb>G@fo0qIBGI(cFLhl`4`GUMVfQ&TFKEy-M^84qlXC4+n82_oXk7VlrTSGQ zvnvW|Q_>Cp8S`y0ZqKN>gfPZae1nSvVKt`)a)P=}FXFlyvrGnsa)cS!m`$3C<}vkT zp-mh@*Cwk(ru@yH~%zuz)*f$jF&EzDo5O-{J3DR&QT_Vw-FEuWBRRw_ih|yp75= zEV}K*k0d@EfIQqeZIq8z%1dP@6i@zu0tSw%$J3!&=a&SY;yLjo^f+@2sZ%RJ^!Aws zhV9(Y{hF~>tC5=hdS+^?$%-~G)sGa-<&eoUAcE2VUa@Zmqw{xgsfey(i_4`Zp^G*MYL;`K!yUIUm7i^y~ zc}Em8?%5W)4HUdQd}#O5TL~3&bm2NtTVd%AeMx;{(*2%`Dk?%TGRtw+piJJsbvfl4Rp0KsiIqzVg-pr}VP6Bi#E6XKALMS<7KOCXeQI%sJe1hGf$ z6W&ETD&%?PCkt zIwwn{>fW!&B1iipJbWmZRiwa;aEe$Z*X@OSP<)pqLqG+r^$}QWyI_`j@vmIpzE9VT zVK&-YPm)R+DKj2?XpjX&<>H-34w?J^8&4s;w?v+OploHOoO zP;BA>6E|UodPNhM;kMwh*#Ir1$jvA%adt%RH=NU6mLsx_eOLqP7|WKqHR4PK;A?*Y zi_LrW4Oib<(dEICp@d_!Mua)-^Yil2JSpZ10FVTZxT)RNVxge`&S{CtAVY3&p$$;R zL@L;#ULQK^YN{CMmX6OVE)*tqoo>E*$z#7rFH8-l(n9B^vg}zo z{99R#P@o#lr8EAoS3EK5hcg7p<2bRi}n%YdkszZQj0?lfC`aZ;pU6grw;5y zKi4TcV}$ays?aOr$`(oEI~S(SH#-2g0w5UxV3?}49q%~JIvZ;JYR(3zda@I!9@J*l zRm(G;Bs`N;+*jVK8)F?`OE+}Ta=A_lS^e@vg6(nl0jyfVAPjR$2f@@+&il~1(q7$@ zdeT`<^qe7%H=Jg=*U_P~QjA>%wFGVe$Rp)2R?!T68Vbye)}DCY`~?HCZ4k-e{u$4s zd>lo6AnE%g9?|R?;^{*^YI1$tyLhfWI+M&w-_7875CvBRpB{fRWN{>J@uFAN!EIKMQ^ zveRmrt%55Y=SzELmj6+?=O7xg!#zF6*iwwocNj@05hy$JyoRS?Rd!!0WjT|A;Q#Xn=F6VSZBE1ms6Y`u3lmH!_<9u6I39V2DyNEt=Sp2sm#R-q6n z%2u+n9eZR~lyy*%LRLmLp71r8J4X_HQEulkhj(co9j3xYF~&k;e@{u$tk z9L*pU^Kr=K>5QZa0{-Kg>zlj;{d*OUyS%cT_PN#n^TH#tpqAFzY+LdkTTN!hFXeME zqINceV3FJ(ongR>HkTp8pvN%D#;h$=s5~RqL?A0TV z6)v3u4OA(UdJ||MKme;0(a9=z!Pae}gK~==vK=;H*IPojm0$$B{>tpi4JOltEp;T1mQ}L2jr=!r*9~F4|7;;2n zatiokax{NfEj_vFh-p19J?j*y@F9W5BZ%sx4I*-MUrcg8d?|{4{z?jQi9F06pmV!2 zlL^&vF?ch?4O%Ne&x*Q$k{J9-vR9s)a(_tnMrAf`agJ{GjnkS^va}0J!l~=xf4}`> ze5AU-uIlqHKE^A?;1&1jA6|yPTN0yKxz`3&TXL1(&OvRnjhVUozc%t?4a zN;`nCrx&(J3Q|4k)G6tb_pSC>4tl_da3kZ;d2oAV!WkJui8EI}xH;}RrI+0FWD1`Y zO0h7-r zX>!3kuff4oh*;y+*+&dnv+6qbrl7^11;|Wby(XPHZR+goN6uMnk$arNAKatx`gKJU zt&Uob{bnm}*NJWW~Nb57D zaTsyZOc_BkzEXUn`WMp}FcC#^!S9%*UWRh#Wxg>ki4sJ3-C5CKA>_V!%dftzRr&kxPKbobVIx(54%0ynj!@ z%@wwf_zG%`?}Hl-Es^Jb-8H%*mvxgP0W@fqDiYdbuGd`ezI!_;`3|&Z0!dMeMMYDFY_^=#YLEpn-(A84Wy3xtFc0>NoJ45FWncn|+Sx1npvu$KQGD_=T zr`pZqSMs)hZY7KhLi#DY&v5Z!?V8_m9+79T{+`Cy^YNo&Eb8_BfV@!SCmDO?K2%v&#wd5S~rBd)8z5=;JfNyr5_xTU|~2 zCfMPsG5D{yr|}|U;Jvn_BupcIN5*f;bdSMXRlydD zzI5aH{Mm1SnByF2Q3-)R#-7D1o0mjiWATm^$g>TFZqn%^MsJ+*IJReerq`g`UEoRc zrGE0I%7~MUiEMGgJNlT{Y>y3<@@{}6N<~5~gY8a8m+WeCxJxqIJ#!kFE8UBo`V~J|uKg9bVpuYIJxj~xtls-?kl>r-=6!gH8m%?*mD${Px44DQVb^xJ-U@CgRF;j)h>con)OCgzS zAR32RtnFP_O#W4V-AL}51$WS$>NKo*A9}Y(>9w(H(@7fFFlwQorgg23?KucXp<(aJmDAladQ8<``<@!3YozEn1n2SF;>W2*lFiE<;ao)m8&dx zWAf-ukq`8gjlsA08Ozhbm*N}??Zch2@LmGS$MzZ-q#6kS0HCl541=OFOKL`ndA4i- z?p_`v;3nCi947qKo3r9I3chPWw}G& zwP(wNU{{qh2HY+_*0sD0E#e1r@bp-E2x8eLRa$Dx*gQ~js;o*~0Kt$kYb*GYG9Igh z%>ysm4THISjG`kdlUhb6P5^Mc+i~7G&4;wgGOgC{K|E(YJ^G6!E2gej@bnwJ8Kw7u zNXC@FWy|)O-syd{L&IpJsn_1n8_QwQ%HQ+%R@jzhXFyGx%;*1#Lzk~^?OW|ZeZG;m z&|MRVvoBHnO7*}7RndBWwamDC189)Z+MgBsRx9IyywTea{`)HmR=5L?48LW0(4Y&V zpZfPT1qGlS=aI2iH4G(4&mGM7;TKei(X@TBQO5_;Hdc&M|H^l(@9tDjgP_dnYdz8B z&Atx*FLJtADq{7}kP}v4m645nle$Q zMOtRHvUg(T$0a@16AM?m^#vIwEE*Cek}?@L%R`KLM~3a4{~f)~9HdKYWaHWn-Zf8C z8+0wwDc@k~wvsb>xAA%6Q0HXrJ)tjGjfFvU_YXQEGUR6(F}7+|eO%=nsf}mHdx#}q z9t-0xucMi{o#U{4w%fhb!i7TuEVz>`<_6uOqc}GcIGDp7qG$&P1{&v&YV{f{v|C?u zxKWilcy2H%f)h*M(klWsL1Q-bL@#M6qdK)nB>`h@Ar)AQo5Xb{2#WaqfpdwN0Ka{q83mqd=h z$g4W~Wl$%p^RDx33gM@dX%pKW-)PMwxA8B}KTXOU2eG-#2O$RbUWW-a5UgCRso*1} zvS+wA$JyNuVmh*q*B0ph+xT;iY1|9~{7h*Pv)nf5yIVJJgIsZ!s;W^+S^iO$X7g_BDM`b4h!#m z&c8NlAlLb?h35mij1R>f-%1QwQ=6GsiNT^Ndpp48(>k0>Xxeynyy;>2oFcKVyVQHnunt?8ba zeeW1(O%MS}){>!#piGPH)%;s-vP@dzMHL1PF-g4-Z4G-b!*ugQT&wr4ll_j@hBR$c z-#sM&H92}V{(!UPb1RVTi(D^$Y4tQC0sZv( z(dh0r?mvPIhe~qs+);=bH&79*!8V3O26T1_Nr}h_-XDZBb-xvPE}sBJvh>*G_W808 zY7E2cK)>9WDC1vRSxy`4U+BHDmfBF}`~+@9e*PO_wKC~6>rk&U0-^PdMeXtt2RZK_ zfT(T!!cbLbjju06Xp?rm&}@JLhbTJv^#hQ}TKD`y`Eo;t{Wh2Eefpa1-_%1Mv%*kX z$qLO4b=kU^B6icT{mhrH zuFfJ$?WHX$@*RheLq~Xh@}V-MW_{z7VIc~Fh+om4k?f@Y#|ZKvS=O6&!KZ>MpsD6W z-w_bm9Dlm6SJ{Vu3Q5CI!qS$+=l17F%XObHJI@BrG+7fKt+2(+CO%&uo5{b?^^{$UwgE$M!=-KS&6N%>E;i6*Lf~lG zRI2BG`C{)iCz{>g2{j`Xvw6xN;`llXZ(Vr6CP91MYl$4*e9N}B!Hy=$L263s;?BWh z>&p)X^r@h@Q^uikNp;}fC*c!U-*D&Xz4U+f4Ey=%IchGSbslm1KCJxtv;>?!TD=hI z?N~Qq*jw}6v;4HTyRf&Jwg-8O%}5>CfY);C34_qN9N&yLu$WMeB7-%6oxR!?4)Ow2DfTr}xY>yd!^RLDqyFANXD zQLvPZmq&KFB)9$4X*Qnv#zDtFbIxhJLd*6?&p8~!%%;{FG0O3%<@-7Ieg8^bOU=oZ zYX--F?kpBZ^XmMO71J6|ZhL9LiGWR|?1l0X2F@y`KdEYDW!@gGpG|k*FuZLk*`Z z5BzV4Yyz9L+yFth^YTEB>Z1wCb%hG;V zv)m>l>G|iil#Ck=DC|>L3vQC9di_4XGTTchY*efW{VF;Y&ejE;nrqI`B1-*|c<;wY zt1r(eD_rNop*D8xN5b`{3YXc&Ch7C0?xT0ko@dmHOowVF+?%qWFOraM7GZKKCi>sx za`2(<}eDp=M|9&e+<8GfI$`8&sym%<-Sk6vP{y3AUoY30FE_cX@T&iIKVVwH>mX z5lE^$#CRTWOlDIM!>;mq_LV+^#ZPCKWAQgw?{N1WefB*zmIl6BUXe5-vCyfM010kN zmw+#vgTYxK(ds~Sf3wIpdri(#E|p{8nwpzdi1d(j^L&{{n}=)`@*%G}Ipq#CwN||} z2Z@WLjM_dvEQZ5Q%MXj`xS%}jz% zG#{wJeOMi~P!187om8mjwukUPZOC+UW)9dh!>+ApPYupx8%MKb>Kwez$4lNsiz~VW zZV*_Jo@ChGdi%EQ&kOMrmnzsiR+6Gihqo9)XqP9cLgJ0Vf#3oG@QS?$qtd57k54P~ z%B(DRdP_SVicfopsryr3OJ-kZ*!q48dwOz%0ju&|~b zaoBUAYI>ktEY*GT$ZL~#ENW5g3^yCUa&B@$%<9Pry3KNiBS(%HO}3{+hj4nRZ<{th zI11`cE{Q*2T&0pUdkLv%{jUlWbOB=ad@x+E_Y{ zJ5>ECBJXK63I1Rk)1jzO*?9bUmGw-yF~4gv7M{;8$Y z+ZtK2|Mcdn$`L7klyn>IU}ZA#9mVL`rk}}p4s#AmcH6nF{(9sQ21pi*Sv|$Xpa+UY zbgV}jiXNfa`;Gvh)B>8L@FZ6X?BQ=EVjxT~;L_niatyYYAES`)9YO;OqCLE~NjuMhVG|FJ`9=f~Sw?NYX?6e$Ty? zY278UbPY0SOA~`m4BWWqZ2D1)KvK|NCCMJSv%ZU3zfaXFy@@v?aiVCK5ALEs6@$Cq>qPnx^4Du zDr4o5mvQdqXQrkK!@G>&j%;azKM~uc!|RkJ+aKZ%3$1WFN;q|kf`D%lRoeSTCabN8 zjgd90`o*nR-4Nh7?zLyy`HXUGd|cG3gIo8xAD(t|<6g$$e_+XYI1WB7NSMv|yTuNy>7JcS z195bl#f>PdT(bw6 zIq0SrnYt7yXgh;G`>WD7QWjt|HRQ{hEi31eFdxXsdp>ry&12rC`KRaGt@7!pSIxiP zQv&poQ~(Mz(wq~ZM-#Z61Ovc_viBMMy^_d8D%i-5XFgdO1aa``5PuGHMnf#f{%T92;mP zLTylb8EFEvF)fN|sacNQu1dJHoZ(_?MpK`STMsy7Sdc7oeae~M{AlPXxdGGdq<$r1 zDKw|t3V<&YgH+9>xDAC-&>RglI5_OJOamnt!ai-u|68*yz%R4e9GSQ@vZcMW{Q;@zJPC$5)p9W5^7lG_xn9lxN^ zxJe_^>ZT5=eh1jXd#mC3P)B7hPh?Ju&SifqTch&6&7s`;QjMH3O){3B&p+3=G#Eb2 z)Lp&XzVE}Caj2Gr(_Fht(Z1YravZM=a;eInXr(>9UgIM-bbp*?$$AsRrvVh-d_4>} z{HRbJo+G1B6qgaG5Jsg}{Thn-^)DU&W%CB+jhQtzJR&Z27s?^uh2SxccHGsC?G{Olc+-tt&gT zRWN~n3^)GJ{iai)!#hKt*xKuTCd%IRg#`dKtwYqp*y@z$!(0~d%oRTH&=Xkzi@+V8 z>zOObcz>3Zmq(S%$U0ua;nRI?fM|S-OqlW$#WT5iagjO4|KHOD%&)%W)M&A5_PB%N z(*%BBD!@+r!Bv$dn9BoFBZ)U;`_!+|dTEg*Wp``mk zbBC>ND1M~?c~qm-jeiIh({dhtZV_YVb&!HX-s4OnsgfpRgrXuKsp2|G0b`H0`Yxbu zb?sy*@&NnN;slW!$3Tb7i}%0z!-HrLa6|p4G~@Vjg@7x=>ny%@{g&0rV359d4DhEj zd#qoMb11DHjLK;LY@V9F_Bk^HhfDaNCOW#rxc*xr4<7@mJ@!L)hANN1{J{w|3IWD< zs+fCC+&F@1IRtVT%P7yIp~a;6+4*>#vb#45M2DcIndfj|_(OX6?L}qTtzShM&-S29 zve8Iy-nTxGGEv^ULUQ+`VE#xmmoL+r3aO$N?p~A3Lgld>VI97pc7;85s9s?Cf-B3R z*9jttJEs1P_>m0i*P8812ZOazq(`9vmiZw zeQ9Tg>?yB7YXVzDEhmQN(0A@-(ZTX$v$uxCsa*qVc~Dp%TMZm)bZ%<(k}$`m=f!e> z;E-3M=gqNevzYHD#wk-2@5*QXra;^caNzhWuEV7p^E1s)0zDF4c$6dzHEK>Et26&9 zPHq1M$sPURa!(2TfXe4lg*e19?0hX%On~8=I;wiyAdL7xi#OX|_VG*We_}wxubd(G z4+p+hFzjy}kse`WlJqd@Pr?RSia0r*@;WXb8D$hTh;(w3b*oNl(k+1FT zH+7msos;jQOtLtY@{g#=sZ4!P3mg&IEvP)nko^dK>GEY{-qc=?KcL9AuIEj>zciNd zv=-LEf;-o(93$kzGd`yXY6g z1of`0Z#52J?Y5ziaLiKk(NUzK7fQe)76v2l)`eaC_e+O@GA^GTGU~@(;qsZOD*Y=V zARH*26Y91*M|RG*ot~EEQi%y+bQ$9lgvbkSaq+BZzOUgkKHsVu*9|?rG#Ln}mU?CzJrG%;T zCTO6Jehi93=d4KN(CN)&<|=Z>{uTM<;$y&+4lj=*~JOHZ2H~J-kNaFl6Z8sHwh&b0?V8j z*VaF1<<$^O^FC`?P%qo>-9oi-C<^MOm@YL`tqn!62pfgkQ0l$(%RzUX`)L`I@{wer zW>3Da^iDL?#8WB}j6`LZ8X2z^-PZgD7t*)I9^*SqnZ_NXxdFf0byH3>)=k7(_SF0Dh9n9<8E^_8~^;mh<+S5RA z6|dm2j%AATx6hHbzTkt(6_yK+KQpGkkv>Md9qUoWUh0E&XkB`!#KsgjZr!h z3GV4P7FTMJXhesWUQUT0+PICJotU9JB#-5{M18j1y3LX*0VT8-y4hP(|Yv<<{30hNEfN#6#mYi$7@E=9|1Tu=^7d zF4U=wtA(0tM>ws+G*D13Rj}hMS8|9r3#ExDxWZYIey*s`9nF?LP$J4*;Mc<@<0=$P z!*+avr0;HYLP-Qky&bnJg#qWf64 ztzZZz>46Rie3Eew4oA~~zB3?7oM3LeUH#)~*;1*&;sumbhsbw&5a$YfqB%6K0&y84 zc+z}^g@%*?GnLXO00G)o)Xi=Gy2g(@)p(a5-cmOtwB3^5w3RAL^gL;5S|_A`<4aCb%V}~NPDS~Xm+}7vaCBs@Jb$&zv7cKx9-AR zP4wFMjpOEa^fRK`ULTLf(Gp#(g-TA}pL}8&cv0uM26N{a5gH#^#cn^ywon`&K-1aC zZ%i;c&-F3Gg3QcJJ3V!wmpB`IftLu>Aj2{Ir-N~ar?=A6*gmkVI8EFKSwDylkq!3G zfXa4-hs@*3bsE)+-sCA1vV_SL7AP}03X+o?4Tz2GY;xm59Gkq+Ub*KkJ{2U+pnhL1 zCT@+ue#FSu(ra0CR>Hz6$}nBjb(}rQjn}Ka)zf;&&_S9)BlDp6i4^ou)RlI8ipz+tkQr<$`df!3f0YkP3z~!S5+q%B7DX$zqhJ><581^QO`>Q6phi zw$1??o?tkvUqUsy()cq`9OvC*^o@Mqs8RTo9ujw;To-xT`ysOI=n>&VIDKyVuLoyn znW3`t3NavuZv6)V=q-?_jDTt`>WVW`)M56K3=_BS5kt}geFvZVdFHG&Cx&T{PW@nW z+{OLbGIf$<-^#`)eJoRkbhNopOZ7GAp=+iL5&08qF2oS1#EXVb@?;Cr90A2#@}_96 z)ANzy&DQ2VP#E~F%Cl7JBRX;iI*Z;|e8A|wBtqRbV7iG`f+BZ@WD96Z6p0_v#V@sn zx%7{GD|h1e+1;=#_@I3cS9H4-zv>5djp0pu`ucsO z)3^BUn^&nZgDq(s-lvCs_o~*b?^JKx?kv2~mMoR=yRN{zInb>JUnxsm3314STvx~Xid5uT z;;Ilu{sea{QB%6qDAe5!ORCJxn#p`n?!h@%WMI@d6{m^{FQ*;TYb%8b}0YB(w%2w?BzYyNa=)a7X0^m zed08A`sUY#cZ=Jz3OC0FNc?W>GF0|KyOF+3^cn~3zYhybD?4Vt58KqeR#k-PGy9k@a&d6rTG+D>s*RYQP5SYG^A*0sUEnELBvg2b zHe?21zIjC-a{|JSW-u%SKgjT&X%(X;6L3z2o!IuM5u}?~!bX9yF^9+gk2sZJm_jUm z2--;IgT;`F1Zt}ZLdK8t+|yz8w>$y=e~m$6PI#_&YE?I%T~g;onCZ^qRY@VEZSl7Y zl4jL{$VMgO17j4!vj=j4ZH!fX3@eLDNInM(_(Pe2f>k66kQ5)$PRl#3Lp-37a7y@@ zA2drwgp+kwD7N-q_Z2omKNL1LC_Xmbo6p7RKEd$XsN^F%gEaQAUH@AevD=>&!!Uez z$0H?pPoAXw^jMfN7j4yGN;8;+51!ux#*Ws;Qsmx*y6nzM7w$IEwk3O6S^ri?&}8RA zOpZ{DU1yo2x$i1@PH^p#>3=@Z5;j-!@BKAqef4V{mfb~GU2{CjyjG$#U&jYa#1_wV z_xV+)S@9YPu8UX%*9PDAt{+$gS?o4AY(F?lGs2ECW^^E24k3eRU+ZHpDA}sA)Z^1!3s8w;Eyidl6kXdtBCvW5+a96Ht@(G~s=eRsS!#>}!^a=v>kO@Y)jUn91L{4GB7(26KqeTW$f?tPyg$9x~8;Fxgd&8Fb@7b$$qEPHQMD4gv zmc6&O|JP3oViQxGTRYyh>1W%8Zbu3nR(;BVI`6J-SZ&xfd&m^14kBpem59N|X~WZZ zWc|$}^v5;Keq0EA#~5_><^g@4GH4Fsp@-&}BgdMA>SphFhsb%-B`t&_c(0a@3|TaY zp|A2TCgT;;{`mfUo`5$d-NY(DGKOv@Mev~`{xG^~cwR@kann}vua%$4tNLS9u%w;V zSZW}6m$7eP59yL_e+Emd`o)V(3h_bIhpA2y+AfnHu(|WbbIqYHRnGJ7NG*wDRh8#j z_|`&4IvD~Fclr}@cw-JM0h1QKbk=QecjqRjk`pbLyij%N>+SiU^6II?G-mzl#9^+% zHK%sD5MkrDiJ6k7|7IM1fSgy#q_^|Uo?xKJ;8$pP^WjrRb?>oYe8)CP=a-S3Saimc z_j=xuZqvH!`+9xunkd=TR^)^YbnXxZDI z2Nmk3A~n?po4~#x`ch3o`=*4J9H(&imScbejf90I4J7lx$HwxmB)7RJ0N7QXsauvl zXYYEpmy2n6Yko4IPB-Skr(I0iWKe_Fi_VIEyJGdE@E0e?J0-(0byZk~v%H4fMT#-6 zFiM&>P9mV{rGpHE4n<*F4ZZo0u}8nK{)*HA{?9AY=^-?#QA&lktm>|SLt7e_^TL&x z$m6-q8N)FlB75l)OB+{S-CgW(TsC2#1zr@&rM_onsqpzv6dcS1Rf$r&wOXgs<`Vap z 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

    aMaL4cfv(z^e|%^?-xkY05PFLK!Cx)} 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�E&f@#I-(CuewKU%r>R$?v3y}9Z6 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

    tlQ)tvnO}liFsq&+(UGQIvb*=CB1CZspIv6O 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 uj1B*dJV Date: Fri, 16 Aug 2024 12:25:31 -0700 Subject: [PATCH 164/286] chore: add a few comments and small code fixes in addTransmissibilityCouplingPattern for poromechanics with conforming fractures (#3250) --------- Co-authored-by: Ryan ARONSON (X) --- .../SinglePhasePoromechanicsConformingFractures.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 2f0a16dc9ef..5d84d5f205d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -371,7 +371,7 @@ addTransmissibilityCouplingPattern( DomainPartition const & domain, // Get the finite volume method used to compute the stabilization NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager(); FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager(); - FluxApproximationBase const & stabilizationMethod = fvManager.getFluxApproximation( this->solidMechanicsSolver()->getStabilizationName() ); + FluxApproximationBase const & fvDiscretization = fvManager.getFluxApproximation( this->flowSolver()->getDiscretizationName() ); SurfaceElementRegion const & fractureRegion = elemManager.getRegion< SurfaceElementRegion >( this->solidMechanicsSolver()->getUniqueFractureRegionName() ); @@ -390,7 +390,7 @@ addTransmissibilityCouplingPattern( DomainPartition const & domain, ArrayOfArraysView< localIndex const > const & elemsToFaces = fractureSubRegion.faceList().toViewConst(); - stabilizationMethod.forStencils< SurfaceElementStencil >( mesh, [&]( SurfaceElementStencil const & stencil ) + fvDiscretization.forStencils< SurfaceElementStencil >( mesh, [&]( SurfaceElementStencil const & stencil ) { forAll< serialPolicy >( stencil.size(), [=] ( localIndex const iconn ) { @@ -405,13 +405,15 @@ addTransmissibilityCouplingPattern( DomainPartition const & domain, for( localIndex kf = 0; kf < 2; ++kf ) { // Set row DOF index - globalIndex const rowIndex = presDofNumber[sei[iconn][1-kf]] - rankOffset; + // Note that the 1-kf index is intentional, as this is coupling the pressure of one face cell + // to the nodes of the adjacent cell + localIndex const rowIndex = presDofNumber[sei[iconn][1-kf]] - rankOffset; if( rowIndex > 0 && rowIndex < pattern.numRows() ) { // Get fracture, face and region/subregion/element indices (for elements on both sides) - localIndex fractureIndex = sei[iconn][kf]; + localIndex const fractureIndex = sei[iconn][kf]; // Get the number of nodes localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elemsToFaces[fractureIndex][0] ); From d8c3166239894d6c06f4881d5fdac549758757e8 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 21 Aug 2024 12:51:28 -1000 Subject: [PATCH 165/286] build: Remove remaining circular link dependencies (#3282) * remove events from constitutive dependency list * remove a bunch of redundant direct dependencies * re-introduce options for dynamic libraries for each component * move constitutive drivers outside of constitutive to resolve circular dependencies * remove the use of blt_combine_static_libraries * shared libs on by default in CI * drop dependency of events on mesh. create temporary TriaxialDriver object in ~ProblemManager() to avoid constitutiveDrivers from being dropped by the linker * add an outputDirectory in FunctionBase instead of grabbing from OutputBase. Also remove static data members in OutputBase. Also reenable TableFunction::print * add WHOLE_ARCHIVE cmake decorations to linking for static libs. Lots of CMakeLists.txt cleanup * cleanup unit test cmake files * move constitutive driver documentation out on its own --- .github/workflows/build_and_test.yml | 5 ++ .github/workflows/ci_tests.yml | 10 +++- host-configs/LBL/cori-gcc@8.1.0.cmake | 4 -- host-configs/LBL/cori-intel.cmake | 3 - host-configs/LLNL/lassen-base.cmake | 1 - host-configs/ORNL/frontier-base.cmake | 1 - .../pangea3-gcc8.4.1-openmpi-4.1.2.cmake | 1 - host-configs/apple/macOS_base.cmake | 3 +- host-configs/environment.cmake | 4 ++ .../fractureFlow_conforming_2d_vtk_input.xml | 2 +- src/CMakeGraphVizOptions.cmake | 6 +- src/CMakeLists.txt | 21 +------ src/cmake/GeosxMacros.cmake | 36 ++++++++++++ src/cmake/GeosxOptions.cmake | 15 +---- src/coreComponents/CMakeLists.txt | 55 +++--------------- .../codingUtilities/CMakeLists.txt | 5 +- .../codingUtilities/tests/CMakeLists.txt | 6 +- src/coreComponents/common/CMakeLists.txt | 3 +- .../constitutive/CMakeLists.txt | 35 +++--------- .../constitutive/docs/FluidModels.rst | 4 +- .../constitutive/docs/solid/SolidModels.rst | 1 - .../TableRelativePermeabilityHysteresis.cpp | 1 - .../constitutiveDrivers/CMakeLists.txt | 56 +++++++++++++++++++ .../docs/ConstitutiveDrivers.rst | 13 +++++ .../docs/PVTDriver.rst | 0 .../docs}/TriaxialDriver.rst | 0 .../docs}/TriaxialDriver.svg | 0 .../PVTDriverRunTestCO2BrineEzrokhiFluid.cpp | 2 +- ...iverRunTestCO2BrineEzrokhiThermalFluid.cpp | 2 +- .../PVTDriverRunTestCO2BrinePhillipsFluid.cpp | 2 +- ...verRunTestCO2BrinePhillipsThermalFluid.cpp | 2 +- .../fluid/multiFluid}/PVTDriver.cpp | 2 +- .../fluid/multiFluid}/PVTDriver.hpp | 0 .../fluid/multiFluid}/PVTDriverRunTest.hpp | 0 .../blackOil/PVTDriverRunTestDeadOilFluid.cpp | 2 +- ...verRunTestCompositionalMultiphaseFluid.cpp | 2 +- ...CompositionalTwoPhaseConstantViscosity.cpp | 2 +- ...ionalTwoPhaseLohrenzBrayClarkViscosity.cpp | 2 +- .../reactive/ReactiveFluidDriver.cpp | 1 - .../reactive/ReactiveFluidDriver.hpp | 0 .../relativePermeability/RelpermDriver.cpp | 0 .../relativePermeability/RelpermDriver.hpp | 0 .../RelpermDriverBrooksCoreyBakerRunTest.cpp | 2 +- .../RelpermDriverBrooksCoreyRunTest.cpp | 2 +- .../RelpermDriverBrooksCoreyStone2RunTest.cpp | 2 +- .../RelpermDriverRunTest.hpp | 4 +- ...rmDriverTableRelativeHysteresisRunTest.cpp | 2 +- .../RelpermDriverTableRelativeRunTest.cpp | 2 +- .../RelpermDriverVanGenuchtenBakerRunTest.cpp | 2 +- ...RelpermDriverVanGenuchtenStone2RunTest.cpp | 2 +- .../solid/TriaxialDriver.cpp | 1 - .../solid/TriaxialDriver.hpp | 0 .../dataRepository/CMakeLists.txt | 8 ++- .../denseLinearAlgebra/CMakeLists.txt | 9 ++- .../discretizationMethods/CMakeLists.txt | 6 +- src/coreComponents/events/CMakeLists.txt | 8 ++- src/coreComponents/events/EventManager.cpp | 2 +- .../fieldSpecification/CMakeLists.txt | 8 ++- src/coreComponents/fileIO/CMakeLists.txt | 11 +++- .../fileIO/Outputs/OutputBase.cpp | 27 +++++++-- .../fileIO/Outputs/OutputBase.hpp | 9 ++- .../finiteElement/CMakeLists.txt | 6 +- .../finiteVolume/CMakeLists.txt | 8 ++- src/coreComponents/functions/CMakeLists.txt | 8 ++- src/coreComponents/functions/FunctionBase.cpp | 11 ++++ src/coreComponents/functions/FunctionBase.hpp | 11 ++++ .../functions/TableFunction.cpp | 3 +- .../functions/unitTests/CMakeLists.txt | 6 -- .../linearAlgebra/CMakeLists.txt | 17 ++++-- .../mainInterface/CMakeLists.txt | 8 ++- .../mainInterface/ProblemManager.cpp | 14 ++++- src/coreComponents/mesh/CMakeLists.txt | 11 +++- .../physicsSolvers/CMakeLists.txt | 12 +++- .../physicsSolvers/FieldStatisticsBase.hpp | 5 +- .../fluidFlow/StencilDataCollection.cpp | 8 +-- .../PoromechanicsInitialization.cpp | 7 +-- .../SolidMechanicsStateReset.cpp | 5 +- src/coreComponents/schema/CMakeLists.txt | 6 +- .../schema/docs/HydraulicApertureTable.rst | 12 ++++ .../docs/HydraulicApertureTable_other.rst | 9 +++ src/coreComponents/schema/docs/VTKMesh.rst | 4 +- src/coreComponents/schema/schema.xsd | 8 +-- src/coreComponents/unitTests/CMakeLists.txt | 2 +- .../constitutiveTests/CMakeLists.txt | 35 +++--------- .../dataRepositoryTests/CMakeLists.txt | 27 ++------- .../fieldSpecificationTests/CMakeLists.txt | 29 ++-------- .../unitTests/fileIOTests/CMakeLists.txt | 15 +++-- .../finiteVolumeTests/CMakeLists.txt | 15 +++-- .../unitTests/fluidFlowTests/CMakeLists.txt | 31 ++-------- .../linearAlgebraTests/CMakeLists.txt | 26 ++------- .../unitTests/meshTests/CMakeLists.txt | 28 ++-------- .../unitTests/testingUtilities/CMakeLists.txt | 16 +++--- .../unitTests/toolchain/CMakeLists.txt | 7 ++- .../virtualElementTests/CMakeLists.txt | 26 ++------- .../wavePropagationTests/CMakeLists.txt | 27 ++------- .../unitTests/wellsTests/CMakeLists.txt | 30 ++-------- .../unitTests/xmlTests/CMakeLists.txt | 20 ++----- src/docs/sphinx/userGuide/Index.rst | 2 + .../newComponentTemplate/src/CMakeLists.txt | 6 +- .../newComponentTemplate/tests/CMakeLists.txt | 6 +- src/pygeosx/CMakeLists.txt | 3 +- 101 files changed, 461 insertions(+), 486 deletions(-) create mode 100644 src/coreComponents/constitutiveDrivers/CMakeLists.txt create mode 100644 src/coreComponents/constitutiveDrivers/docs/ConstitutiveDrivers.rst rename src/coreComponents/{constitutive => constitutiveDrivers}/docs/PVTDriver.rst (100%) rename src/coreComponents/{constitutive/docs/solid => constitutiveDrivers/docs}/TriaxialDriver.rst (100%) rename src/coreComponents/{constitutive/docs/solid => constitutiveDrivers/docs}/TriaxialDriver.svg (100%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp (92%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp (93%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp (93%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp (93%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/PVTDriver.cpp (99%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/PVTDriver.hpp (100%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/PVTDriverRunTest.hpp (100%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/blackOil/PVTDriverRunTestDeadOilFluid.cpp (94%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp (93%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp (93%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp (93%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/reactive/ReactiveFluidDriver.cpp (99%) rename src/coreComponents/{constitutive/fluid/multifluid => constitutiveDrivers/fluid/multiFluid}/reactive/ReactiveFluidDriver.hpp (100%) rename src/coreComponents/{constitutive => constitutiveDrivers}/relativePermeability/RelpermDriver.cpp (100%) rename src/coreComponents/{constitutive => constitutiveDrivers}/relativePermeability/RelpermDriver.hpp (100%) rename src/coreComponents/{constitutive => constitutiveDrivers}/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp (91%) rename src/coreComponents/{constitutive => constitutiveDrivers}/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp (91%) rename src/coreComponents/{constitutive => constitutiveDrivers}/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp (91%) rename src/coreComponents/{constitutive => constitutiveDrivers}/relativePermeability/RelpermDriverRunTest.hpp (98%) rename src/coreComponents/{constitutive => constitutiveDrivers}/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp (91%) rename src/coreComponents/{constitutive => constitutiveDrivers}/relativePermeability/RelpermDriverTableRelativeRunTest.cpp (92%) rename src/coreComponents/{constitutive => constitutiveDrivers}/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp (91%) rename src/coreComponents/{constitutive => constitutiveDrivers}/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp (91%) rename src/coreComponents/{constitutive => constitutiveDrivers}/solid/TriaxialDriver.cpp (99%) rename src/coreComponents/{constitutive => constitutiveDrivers}/solid/TriaxialDriver.hpp (100%) create mode 100644 src/coreComponents/schema/docs/HydraulicApertureTable.rst create mode 100644 src/coreComponents/schema/docs/HydraulicApertureTable_other.rst diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 8b3405614f7..11d2761b90f 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -5,6 +5,10 @@ on: BUILD_AND_TEST_CLI_ARGS: required: false type: string + BUILD_SHARED_LIBS: + required: false + type: string + default: 'ON' BUILD_TYPE: required: false type: string @@ -184,6 +188,7 @@ jobs: docker_args+=(-e ENABLE_HYPRE=${ENABLE_HYPRE:-OFF}) docker_args+=(-e ENABLE_HYPRE_DEVICE=${ENABLE_HYPRE_DEVICE:-CPU}) docker_args+=(-e ENABLE_TRILINOS=${ENABLE_TRILINOS:-ON}) + docker_args+=(-e GEOS_BUILD_SHARED_LIBS=${{ inputs.BUILD_SHARED_LIBS }}) docker_args+=(--cap-add=SYS_PTRACE --rm) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 4d860f4c80c..54b0c791efa 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -149,14 +149,17 @@ jobs: - name: Ubuntu (20.04, gcc 9.4.0, open-mpi 4.0.3) CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/ubuntu20.04-gcc9 + BUILD_SHARED_LIBS: ON - name: Ubuntu debug (20.04, gcc 10.5.0, open-mpi 4.0.3) - github codespaces CMAKE_BUILD_TYPE: Debug DOCKER_REPOSITORY: geosx/ubuntu20.04-gcc10 + BUILD_SHARED_LIBS: ON - name: Ubuntu (20.04, gcc 10.5.0, open-mpi 4.0.3) - github codespaces CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/ubuntu20.04-gcc10 + BUILD_SHARED_LIBS: ON - name: Ubuntu (22.04, gcc 11.4.0, open-mpi 4.1.2) CMAKE_BUILD_TYPE: Release @@ -164,28 +167,31 @@ jobs: ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF GCP_BUCKET: geosx/ubuntu22.04-gcc11 + BUILD_SHARED_LIBS: ON - name: Ubuntu (22.04, gcc 12.3.0, open-mpi 4.1.2) CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/ubuntu22.04-gcc12 ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF + BUILD_SHARED_LIBS: ON - name: Ubuntu (22.04, clang 15.0.7, open-mpi 4.1.2) CMAKE_BUILD_TYPE: Release DOCKER_REPOSITORY: geosx/ubuntu22.04-clang15 ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF + BUILD_SHARED_LIBS: ON uses: ./.github/workflows/build_and_test.yml with: + BUILD_SHARED_LIBS: ${{ matrix.BUILD_SHARED_LIBS }} CMAKE_BUILD_TYPE: ${{ matrix.CMAKE_BUILD_TYPE }} DOCKER_IMAGE_TAG: ${{ needs.is_not_draft_pull_request.outputs.DOCKER_IMAGE_TAG }} DOCKER_REPOSITORY: ${{ matrix.DOCKER_REPOSITORY }} ENABLE_HYPRE: ${{ matrix.ENABLE_HYPRE }} ENABLE_TRILINOS: ${{ matrix.ENABLE_TRILINOS }} GCP_BUCKET: ${{ matrix.GCP_BUCKET }} - HOST_CONFIG: ${{ matrix.HOST_CONFIG }} RUNS_ON: ubuntu-22.04 secrets: inherit @@ -328,8 +334,6 @@ jobs: ENABLE_HYPRE_DEVICE: ${{ matrix.ENABLE_HYPRE_DEVICE }} ENABLE_HYPRE: ${{ matrix.ENABLE_HYPRE }} ENABLE_TRILINOS: ${{ matrix.ENABLE_TRILINOS }} - GCP_BUCKET: ${{ matrix.GCP_BUCKET }} - HOST_CONFIG: ${{ matrix.HOST_CONFIG }} NPROC: ${{ matrix.NPROC }} RUNS_ON: ${{ matrix.RUNS_ON }} REQUIRED_LABEL: "ci: run CUDA builds" diff --git a/host-configs/LBL/cori-gcc@8.1.0.cmake b/host-configs/LBL/cori-gcc@8.1.0.cmake index 57c81ea666d..b0a50872aa3 100644 --- a/host-configs/LBL/cori-gcc@8.1.0.cmake +++ b/host-configs/LBL/cori-gcc@8.1.0.cmake @@ -26,10 +26,6 @@ set(MPIEXEC_NUMPROC_FLAG "-n" CACHE STRING "") set(GEOS_TPL_DIR "/global/project/projectdirs/m1411/GEOSX/tpls/install-cori-gcc\@8.1.0-release-24-07-20" CACHE PATH "" ) - -set(GEOS_LINK_PREPEND_FLAG "-Wl,--whole-archive" CACHE STRING "" FORCE) -set(GEOS_LINK_POSTPEND_FLAG "-Wl,--no-whole-archive" CACHE STRING "" FORCE) - set(ENABLE_SPHINX_EXECUTABLE OFF CACHE BOOL "") set(ENABLE_UNCRUSTIFY OFF CACHE BOOL "") set(ENABLE_DOXYGEN OFF CACHE BOOL "") diff --git a/host-configs/LBL/cori-intel.cmake b/host-configs/LBL/cori-intel.cmake index 52387bd7ece..f9ff8ec447c 100644 --- a/host-configs/LBL/cori-intel.cmake +++ b/host-configs/LBL/cori-intel.cmake @@ -26,9 +26,6 @@ set(MPIEXEC_NUMPROC_FLAG "-n" CACHE STRING "") set(GEOS_TPL_DIR "/global/project/projectdirs/m1411/GEOSX/tpls/install-cori-intel-release-22-07-20" CACHE PATH "" ) -set(GEOS_LINK_PREPEND_FLAG "-Wl,--whole-archive" CACHE STRING "" FORCE) -set(GEOS_LINK_POSTPEND_FLAG "-Wl,--no-whole-archive" CACHE STRING "" FORCE) - set(ENABLE_SPHINX_EXECUTABLE OFF CACHE BOOL "") set(ENABLE_UNCRUSTIFY OFF CACHE BOOL "") set(ENABLE_DOXYGEN OFF CACHE BOOL "") diff --git a/host-configs/LLNL/lassen-base.cmake b/host-configs/LLNL/lassen-base.cmake index 283755be313..b8014d6410b 100644 --- a/host-configs/LLNL/lassen-base.cmake +++ b/host-configs/LLNL/lassen-base.cmake @@ -7,7 +7,6 @@ # ############################################################################### -set( GEOS_BUILD_SHARED_LIBS ON CACHE BOOL "" ) set( GEOS_BUILD_OBJ_LIBS OFF CACHE BOOL "" ) # Fortran set(ENABLE_FORTRAN OFF CACHE BOOL "") diff --git a/host-configs/ORNL/frontier-base.cmake b/host-configs/ORNL/frontier-base.cmake index c33d1fc25ba..7337dbf387b 100644 --- a/host-configs/ORNL/frontier-base.cmake +++ b/host-configs/ORNL/frontier-base.cmake @@ -31,7 +31,6 @@ set( ENABLE_DOCS OFF CACHE BOOL "" FORCE ) set( ENABLE_SCOTCH OFF CACHE BOOL "" FORCE ) set( ENABLE_SUPERLU_DIST OFF CACHE BOOL "" FORCE ) -set( GEOS_BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE ) set( GEOS_BUILD_OBJ_LIBS OFF CACHE BOOL "" FORCE ) set( CMAKE_CXX_STANDARD 17 CACHE STRING "" ) diff --git a/host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2.cmake b/host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2.cmake index b62c1c45f74..320a7842279 100644 --- a/host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2.cmake +++ b/host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2.cmake @@ -77,7 +77,6 @@ set(ENABLE_MATHPRESSO OFF CACHE BOOL "") # Silo configure script doesn't recognize systype set(SILO_BUILD_TYPE powerpc64-unknown-linux-gnu CACHE STRING "") -set(GEOS_BUILD_SHARED_LIBS OFF CACHE BOOL "") set(ENABLE_PVTPackage ON CACHE BOOL "") set(ENABLE_CALIPER ON CACHE BOOL "") diff --git a/host-configs/apple/macOS_base.cmake b/host-configs/apple/macOS_base.cmake index e300aca41a7..c9cf2efc8df 100644 --- a/host-configs/apple/macOS_base.cmake +++ b/host-configs/apple/macOS_base.cmake @@ -27,7 +27,8 @@ set( LAPACK_LIBRARIES ${HOMEBREW_DIR}/opt/lapack/lib/liblapack.dylib CACHE PATH set(ENABLE_DOXYGEN OFF CACHE BOOL "" FORCE) set(ENABLE_MATHPRESSO OFF CACHE BOOL "" FORCE ) -#set(GEOS_BUILD_OBJ_LIBS ON CACHE BOOL "" FORCE) + +set(GEOS_BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE) diff --git a/host-configs/environment.cmake b/host-configs/environment.cmake index b843c4ce9b7..001d28cb425 100644 --- a/host-configs/environment.cmake +++ b/host-configs/environment.cmake @@ -78,5 +78,9 @@ if(DEFINED ENV{LAPACK_LIBRARIES}) set(LAPACK_LIBRARIES "$ENV{LAPACK_LIBRARIES}" CACHE PATH "" FORCE) endif() +if(DEFINED ENV{GEOS_BUILD_SHARED_LIBS}) + set(GEOS_BUILD_SHARED_LIBS "$ENV{GEOS_BUILD_SHARED_LIBS}" CACHE BOOL "" FORCE) +endif() + set(GEOS_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) include(${CMAKE_CURRENT_LIST_DIR}/tpls.cmake) diff --git a/inputFiles/singlePhaseFlowFractures/fractureFlow_conforming_2d_vtk_input.xml b/inputFiles/singlePhaseFlowFractures/fractureFlow_conforming_2d_vtk_input.xml index 4b77e706571..a6f20653665 100644 --- a/inputFiles/singlePhaseFlowFractures/fractureFlow_conforming_2d_vtk_input.xml +++ b/inputFiles/singlePhaseFlowFractures/fractureFlow_conforming_2d_vtk_input.xml @@ -19,7 +19,7 @@ " ${otherLibs} ) + +endmacro( geos_decorate_link_dependencies ) \ No newline at end of file diff --git a/src/cmake/GeosxOptions.cmake b/src/cmake/GeosxOptions.cmake index debe45fdf62..cce8877cb28 100644 --- a/src/cmake/GeosxOptions.cmake +++ b/src/cmake/GeosxOptions.cmake @@ -158,18 +158,6 @@ if( ${CMAKE_MAKE_PROGRAM} STREQUAL "ninja" OR ${CMAKE_MAKE_PROGRAM} MATCHES ".*/ set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GEOS_NINJA_FLAGS}" ) endif() - -if( CMAKE_HOST_APPLE ) -# set(GEOS_LINK_PREPEND_FLAG "-Wl,-force_load" CACHE STRING "") -# set(GEOS_LINK_POSTPEND_FLAG "" CACHE STRING "") -# elseif( ENABLE_CUDA ) -# set( GEOS_LINK_PREPEND_FLAG "-Xcompiler \\\\\"-Wl,--whole-archive\\\\\"" CACHE STRING "" ) -# set( GEOS_LINK_POSTPEND_FLAG "-Xcompiler \\\\\"-Wl,--no-whole-archive\\\\\"" CACHE STRING "" ) -else() - set( GEOS_LINK_PREPEND_FLAG "-Wl,--whole-archive" CACHE STRING "" ) - set( GEOS_LINK_POSTPEND_FLAG "-Wl,--no-whole-archive" CACHE STRING "" ) -endif() - set( GEOS_LOCALINDEX_TYPE "int" CACHE STRING "" ) if( ENABLE_HYPRE_MIXINT ) set( GEOS_GLOBALINDEX_TYPE "long long int" CACHE STRING "" ) @@ -216,6 +204,5 @@ message( "GEOS_GLOBALINDEX_TYPE_FLAG = ${GEOS_GLOBALINDEX_TYPE_FLAG}" ) message( "CMAKE_CXX_FLAGS = ${CMAKE_CXX_FLAGS}" ) -message( "GEOS_LINK_PREPEND_FLAG=${GEOS_LINK_PREPEND_FLAG}" ) -message( "GEOS_LINK_POSTPEND_FLAG=${GEOS_LINK_POSTPEND_FLAG}" ) + message( "Leaving GeosxOptions.cmake\n" ) diff --git a/src/coreComponents/CMakeLists.txt b/src/coreComponents/CMakeLists.txt index a58be4cdaab..014eea9d9b0 100644 --- a/src/coreComponents/CMakeLists.txt +++ b/src/coreComponents/CMakeLists.txt @@ -3,19 +3,20 @@ set( subdirs common codingUtilities dataRepository - schema + denseLinearAlgebra functions constitutive + schema + finiteElement mesh - denseLinearAlgebra linearAlgebra fieldSpecification - finiteElement finiteVolume discretizationMethods + events + constitutiveDrivers fileIO physicsSolvers - events mainInterface ) unset( parallelDeps ) @@ -56,53 +57,15 @@ foreach( lib ${subdirs} ) endif() endforeach() -# if we're building full static libs and not obj_libs -if( NOT GEOS_BUILD_SHARED_LIBS ) - set( geosx_core_list "" ) - foreach( lib ${coreLibs} ) - list( APPEND geosx_core_list ${GEOS_LINK_PREPEND_FLAG} ${lib} ${GEOS_LINK_POSTPEND_FLAG} ) - endforeach() - set ( geosx_core_libs "${geosx_core_list}" CACHE INTERNAL "" ) -endif( ) - foreach( lib ${subdirs} ) add_subdirectory( ${lib} ) endforeach() -if( GEOS_BUILD_SHARED_LIBS AND GEOS_BUILD_OBJ_LIBS ) - message( "Building shared geosx_core library with object coreComponents, executables link to geosx_core" ) - blt_add_library ( NAME geosx_core - SOURCES dummy.cpp - DEPENDS_ON mainInterface physicsSolvers HDF5::HDF5 - SHARED TRUE ) - -elseif( GEOS_BUILD_SHARED_LIBS AND NOT GEOS_BUILD_OBJ_LIBS ) - message( "Building shared geosx_core library with static coreComponents, executables link to geosx_core" ) - blt_combine_static_libraries( NAME geosx_core - SOURCE_LIBS ${coreLibs} - LIB_TYPE SHARED - LINK_PREPEND ${GEOS_LINK_PREPEND_FLAG} - LINK_POSTPEND ${GEOS_LINK_POSTPEND_FLAG} ) - -elseif( NOT GEOS_BUILD_SHARED_LIBS AND GEOS_BUILD_OBJ_LIBS ) - message( "Building object coreComponents, executables link to coreComponents" ) +add_library(geosx_core INTERFACE) +if( GEOS_BUILD_SHARED_LIBS) + target_link_libraries(geosx_core INTERFACE mainInterface ) else() - message( "Building static coreComponents, executables link to coreComponents" ) -endif() - -if ( TARGET geosx_core ) - # Seems to be required on some CMake versions (e.g. 3.16) to get enforce device linking - if( ${ENABLE_HYPRE_DEVICE} STREQUAL "CUDA" ) - set_target_properties( geosx_core PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS TRUE ) - endif() - - # To install the library with the runtime path used during the building - set_target_properties( geosx_core PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE ) - - # To install the shared library - install( TARGETS geosx_core LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) - - target_include_directories( geosx_core PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) + target_link_libraries(geosx_core INTERFACE $ ) endif() geosx_add_code_checks( PREFIX coreComponents diff --git a/src/coreComponents/codingUtilities/CMakeLists.txt b/src/coreComponents/codingUtilities/CMakeLists.txt index a85e4046907..f936fc4135e 100644 --- a/src/coreComponents/codingUtilities/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/CMakeLists.txt @@ -20,12 +20,15 @@ set( codingUtilities_sources ) set( dependencyList ${parallelDeps} common fast_float ) +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) blt_add_library( NAME codingUtilities SOURCES ${codingUtilities_sources} HEADERS ${codingUtilities_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) # Avoid compiling with nvcc which sometimes crashes on fast_float diff --git a/src/coreComponents/codingUtilities/tests/CMakeLists.txt b/src/coreComponents/codingUtilities/tests/CMakeLists.txt index 33f4168e86e..1fe1863459d 100644 --- a/src/coreComponents/codingUtilities/tests/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/tests/CMakeLists.txt @@ -4,8 +4,10 @@ set( testSources testParsing.cpp testUtilities.cpp ) -set( dependencyList gtest codingUtilities ${parallelDeps} ) +set( dependencyList codingUtilities ${parallelDeps} ) +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) # Add gtest C++ based tests foreach( test ${testSources} ) @@ -13,7 +15,7 @@ foreach( test ${testSources} ) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} gtest ) geos_add_test( NAME ${test_name} COMMAND ${test_name} ) diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index 2a5f70ff960..3733bafb7f7 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -102,13 +102,12 @@ if( ENABLE_CALIPER ) endif() endif() -set( dependencyList ${dependencyList} ) - blt_add_library( NAME common SOURCES ${common_sources} HEADERS ${common_headers} DEPENDS_ON ${dependencyList} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) target_include_directories( common PUBLIC ${CMAKE_BINARY_DIR}/include ) diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index 38304adc24c..ce9e3c62778 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -39,8 +39,6 @@ set( constitutive_headers fluid/multifluid/MultiFluidConstants.hpp fluid/multifluid/MultiFluidUtils.hpp fluid/multifluid/MultiFluidFields.hpp - fluid/multifluid/PVTDriver.hpp - fluid/multifluid/PVTDriverRunTest.hpp fluid/multifluid/blackOil/BlackOilFluidBase.hpp fluid/multifluid/blackOil/BlackOilFluid.hpp fluid/multifluid/blackOil/DeadOilFluid.hpp @@ -89,8 +87,6 @@ set( constitutive_headers fluid/multifluid/reactive/ReactiveBrineFluid.hpp fluid/multifluid/reactive/ReactiveMultiFluid.hpp fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp - fluid/multifluid/reactive/ReactiveFluidDriver.hpp - fluid/multifluid/reactive/ReactiveFluidSelector.hpp fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp @@ -116,8 +112,6 @@ set( constitutive_headers permeability/ProppantPermeability.hpp permeability/SlipDependentPermeability.hpp permeability/WillisRichardsPermeability.hpp - relativePermeability/RelpermDriver.hpp - relativePermeability/RelpermDriverRunTest.hpp relativePermeability/BrooksCoreyBakerRelativePermeability.hpp relativePermeability/BrooksCoreyStone2RelativePermeability.hpp relativePermeability/BrooksCoreyRelativePermeability.hpp @@ -161,7 +155,6 @@ set( constitutive_headers solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp solid/SolidModelDiscretizationOpsOrthotropic.hpp solid/CeramicDamage.hpp - solid/TriaxialDriver.hpp solid/porosity/PorosityFields.hpp solid/porosity/BiotPorosity.hpp solid/porosity/PorosityBase.hpp @@ -203,17 +196,11 @@ set( constitutive_sources dispersion/DispersionBase.cpp dispersion/LinearIsotropicDispersion.cpp fluid/multifluid/MultiFluidBase.cpp - fluid/multifluid/PVTDriver.cpp fluid/multifluid/blackOil/BlackOilFluidBase.cpp fluid/multifluid/blackOil/BlackOilFluid.cpp fluid/multifluid/blackOil/DeadOilFluid.cpp - fluid/multifluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp fluid/multifluid/blackOil/PVTOData.cpp fluid/multifluid/CO2Brine/CO2BrineFluid.cpp - fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp - fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp - fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp - fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp @@ -235,11 +222,8 @@ set( constitutive_sources fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp - fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp - fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp fluid/multifluid/reactive/ReactiveBrineFluid.cpp fluid/multifluid/reactive/ReactiveMultiFluid.cpp - fluid/multifluid/reactive/ReactiveFluidDriver.cpp fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp @@ -268,14 +252,6 @@ set( constitutive_sources relativePermeability/TableRelativePermeabilityHysteresis.cpp relativePermeability/VanGenuchtenBakerRelativePermeability.cpp relativePermeability/VanGenuchtenStone2RelativePermeability.cpp - relativePermeability/RelpermDriver.cpp - relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp - relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp - relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp - relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp - relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp - relativePermeability/RelpermDriverTableRelativeRunTest.cpp - relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp solid/CompressibleSolid.cpp solid/CoupledSolidBase.cpp solid/ProppantSolid.cpp @@ -296,7 +272,6 @@ set( constitutive_sources solid/SolidBase.cpp solid/SolidInternalEnergy.cpp solid/CeramicDamage.cpp - solid/TriaxialDriver.cpp solid/porosity/BiotPorosity.cpp solid/porosity/PorosityBase.cpp solid/porosity/PressurePorosity.cpp @@ -308,7 +283,7 @@ set( constitutive_sources thermalConductivity/SinglePhaseThermalConductivityBase.cpp ) -set( dependencyList ${parallelDeps} events dataRepository functions denseLinearAlgebra ) +set( dependencyList ${parallelDeps} functions denseLinearAlgebra ) if( ENABLE_PVTPackage ) set( constitutive_headers @@ -318,18 +293,22 @@ if( ENABLE_PVTPackage ) set( constitutive_sources ${constitutive_sources} fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp - fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp ) + ) add_subdirectory( PVTPackage ) list( APPEND dependencyList PVTPackage ) endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + blt_add_library( NAME constitutive SOURCES ${constitutive_sources} HEADERS ${constitutive_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) target_include_directories( constitutive PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/constitutive/docs/FluidModels.rst b/src/coreComponents/constitutive/docs/FluidModels.rst index 3b7beb6c902..445f8a82f0b 100644 --- a/src/coreComponents/constitutive/docs/FluidModels.rst +++ b/src/coreComponents/constitutive/docs/FluidModels.rst @@ -15,6 +15,4 @@ single fluids and fluid mixtures. CompositionalMultiphaseFluid - CO2BrineFluid - - PVTDriver + CO2BrineFluid \ No newline at end of file diff --git a/src/coreComponents/constitutive/docs/solid/SolidModels.rst b/src/coreComponents/constitutive/docs/solid/SolidModels.rst index a62f1ce024e..de494d86bf0 100644 --- a/src/coreComponents/constitutive/docs/solid/SolidModels.rst +++ b/src/coreComponents/constitutive/docs/solid/SolidModels.rst @@ -12,7 +12,6 @@ known models. Theory Voight Plasticity - TriaxialDriver ElasticIsotropic ElasticIsotropicPressureDependent ElasticTransverseIsotropic diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp index e55d7886024..f537f73722d 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp @@ -22,7 +22,6 @@ #include "constitutive/relativePermeability/RelativePermeabilityFields.hpp" #include "constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp" #include "functions/FunctionManager.hpp" -#include "constitutive/relativePermeability/RelpermDriver.hpp" namespace geos { diff --git a/src/coreComponents/constitutiveDrivers/CMakeLists.txt b/src/coreComponents/constitutiveDrivers/CMakeLists.txt new file mode 100644 index 00000000000..24570963e67 --- /dev/null +++ b/src/coreComponents/constitutiveDrivers/CMakeLists.txt @@ -0,0 +1,56 @@ +# +# Specify all headers +# +set( constitutiveDrivers_headers + fluid/multiFluid/PVTDriver.hpp + fluid/multiFluid/PVTDriverRunTest.hpp + fluid/multiFluid/reactive/ReactiveFluidDriver.hpp + relativePermeability/RelpermDriver.hpp + relativePermeability/RelpermDriverRunTest.hpp + solid/TriaxialDriver.hpp + ) +# +# Specify all sources +# +set( constitutiveDrivers_sources + fluid/multiFluid/PVTDriver.cpp + fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp + fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp + fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp + fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp + fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp + fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp + fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp + fluid/multiFluid/reactive/ReactiveFluidDriver.cpp + relativePermeability/RelpermDriver.cpp + relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp + relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp + relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp + relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp + relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp + relativePermeability/RelpermDriverTableRelativeRunTest.cpp + relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp + solid/TriaxialDriver.cpp + ) + +set( dependencyList ${parallelDeps} constitutive events ) + +if( ENABLE_PVTPackage ) + set( constitutiveDrivers_sources + ${constitutiveDrivers_sources} + fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp + ) +endif() + +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + +blt_add_library( NAME constitutiveDrivers + SOURCES ${constitutiveDrivers_sources} + HEADERS ${constitutiveDrivers_headers} + DEPENDS_ON ${decoratedDependencies} + OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} + ) + +target_include_directories( constitutiveDrivers PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/constitutiveDrivers/docs/ConstitutiveDrivers.rst b/src/coreComponents/constitutiveDrivers/docs/ConstitutiveDrivers.rst new file mode 100644 index 00000000000..dd1b29d36d3 --- /dev/null +++ b/src/coreComponents/constitutiveDrivers/docs/ConstitutiveDrivers.rst @@ -0,0 +1,13 @@ +.. _ConstitutiveDrivers: + +Constitutive Drivers +============================================ +To test and calibrate constitutive models, GEOS provides a set of drivers that can be used to run simulations with specific input parameters. +These drivers are designed to facilitate the exploration of various constitutive behaviors and to validate the models against known benchmarks. + +.. toctree:: + :maxdepth: 1 + + SolidModels + + PVTDriver diff --git a/src/coreComponents/constitutive/docs/PVTDriver.rst b/src/coreComponents/constitutiveDrivers/docs/PVTDriver.rst similarity index 100% rename from src/coreComponents/constitutive/docs/PVTDriver.rst rename to src/coreComponents/constitutiveDrivers/docs/PVTDriver.rst diff --git a/src/coreComponents/constitutive/docs/solid/TriaxialDriver.rst b/src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.rst similarity index 100% rename from src/coreComponents/constitutive/docs/solid/TriaxialDriver.rst rename to src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.rst diff --git a/src/coreComponents/constitutive/docs/solid/TriaxialDriver.svg b/src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.svg similarity index 100% rename from src/coreComponents/constitutive/docs/solid/TriaxialDriver.svg rename to src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.svg diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp similarity index 92% rename from src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp index 37e0092277e..4df6aae9cd4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp @@ -13,7 +13,7 @@ * ------------------------------------------------------------------------------------------------------------ */ -#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp" #include "constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp" namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp similarity index 93% rename from src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp index a42c0773420..2e91dd5c8be 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp @@ -13,7 +13,7 @@ * ------------------------------------------------------------------------------------------------------------ */ -#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp" #include "constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp" namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp similarity index 93% rename from src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp index a7fe70a0b0d..a36fc8c0cbd 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp @@ -13,7 +13,7 @@ * ------------------------------------------------------------------------------------------------------------ */ -#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp" #include "constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp" namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp similarity index 93% rename from src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp index 4536efa96f5..12c1472d97a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp @@ -13,7 +13,7 @@ * ------------------------------------------------------------------------------------------------------------ */ -#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp" #include "constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp" namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp similarity index 99% rename from src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp index 8a987d2168b..aa20b9f12a7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp @@ -24,7 +24,7 @@ #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/fluid/multifluid/MultiFluidSelector.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" -#include "fileIO/Outputs/OutputBase.hpp" +//#include "fileIO/Outputs/OutputBase.hpp" #include "functions/FunctionManager.hpp" #include "functions/TableFunction.hpp" #include "common/format/StringUtilities.hpp" diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.hpp similarity index 100% rename from src/coreComponents/constitutive/fluid/multifluid/PVTDriver.hpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.hpp diff --git a/src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp similarity index 100% rename from src/coreComponents/constitutive/fluid/multifluid/PVTDriverRunTest.hpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp similarity index 94% rename from src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp index 86ae569e672..4d47ced92ab 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp @@ -17,7 +17,7 @@ * PVTDriverRunTestDeadOilFluid.cpp */ -#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp" #include "constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp" #include "constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp" diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp similarity index 93% rename from src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp index 95d7805133b..f93d5039c64 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp @@ -17,7 +17,7 @@ * PVTDriverRunTestCompositionalMultiphaseFluid.cpp */ -#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp" #include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp" namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp similarity index 93% rename from src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp index 5e3a7da05d5..f3968bef2ad 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp @@ -17,7 +17,7 @@ * PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp */ -#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp" #include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp similarity index 93% rename from src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp index f1c85834b70..afcfd267f63 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp @@ -17,7 +17,7 @@ * PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp */ -#include "constitutive/fluid/multifluid/PVTDriverRunTest.hpp" +#include "constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp" #include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp similarity index 99% rename from src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.cpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp index 7c95359f28a..73625f11864 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp @@ -18,7 +18,6 @@ */ #include "ReactiveFluidDriver.hpp" -#include "fileIO/Outputs/OutputBase.hpp" #include "constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp" #include "functions/TableFunction.hpp" #include "functions/FunctionManager.hpp" diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.hpp similarity index 100% rename from src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidDriver.hpp rename to src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.hpp diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriver.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp similarity index 100% rename from src/coreComponents/constitutive/relativePermeability/RelpermDriver.cpp rename to src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriver.hpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.hpp similarity index 100% rename from src/coreComponents/constitutive/relativePermeability/RelpermDriver.hpp rename to src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.hpp diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp similarity index 91% rename from src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp rename to src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp index c46982327aa..20601bcc9b8 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp @@ -14,7 +14,7 @@ */ #include "RelpermDriverRunTest.hpp" -#include "BrooksCoreyBakerRelativePermeability.hpp" +#include "constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp" namespace geos diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp similarity index 91% rename from src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp rename to src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp index 6fb6f873dbc..b49a329e467 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp @@ -14,7 +14,7 @@ */ #include "RelpermDriverRunTest.hpp" -#include "BrooksCoreyRelativePermeability.hpp" +#include "constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp" namespace geos diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp similarity index 91% rename from src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp rename to src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp index 57efb4ff67a..1884ff3491d 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp @@ -14,7 +14,7 @@ */ #include "RelpermDriverRunTest.hpp" -#include "BrooksCoreyStone2RelativePermeability.hpp" +#include "constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp" namespace geos diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverRunTest.hpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverRunTest.hpp similarity index 98% rename from src/coreComponents/constitutive/relativePermeability/RelpermDriverRunTest.hpp rename to src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverRunTest.hpp index f361beaf00c..75315d66fb4 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverRunTest.hpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverRunTest.hpp @@ -16,9 +16,9 @@ #ifndef GEOS_RELPERMDRIVERRUNTEST_HPP_ #define GEOS_RELPERMDRIVERRUNTEST_HPP_ -#include "constitutive/relativePermeability/RelpermDriver.hpp" +#include "constitutiveDrivers/relativePermeability/RelpermDriver.hpp" #include "constitutive/relativePermeability/RelativePermeabilityFields.hpp" -#include "layouts.hpp" +#include "constitutive/relativePermeability/layouts.hpp" namespace geos diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp similarity index 91% rename from src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp rename to src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp index b3572d74fe3..3e62792b0d7 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp @@ -14,7 +14,7 @@ */ #include "RelpermDriverRunTest.hpp" -#include "TableRelativePermeabilityHysteresis.hpp" +#include "constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp" namespace geos diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeRunTest.cpp similarity index 92% rename from src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeRunTest.cpp rename to src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeRunTest.cpp index bfa0ad9c510..faf74231723 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverTableRelativeRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeRunTest.cpp @@ -14,7 +14,7 @@ */ #include "RelpermDriverRunTest.hpp" -#include "TableRelativePermeability.hpp" +#include "constitutive/relativePermeability/TableRelativePermeability.hpp" namespace geos diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp similarity index 91% rename from src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp rename to src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp index 3de1845934b..2513e100131 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp @@ -14,7 +14,7 @@ */ #include "RelpermDriverRunTest.hpp" -#include "VanGenuchtenBakerRelativePermeability.hpp" +#include "constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp" namespace geos diff --git a/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp similarity index 91% rename from src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp rename to src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp index 4e3ef1fc796..c17b1646d3f 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp @@ -14,7 +14,7 @@ */ #include "RelpermDriverRunTest.hpp" -#include "VanGenuchtenStone2RelativePermeability.hpp" +#include "constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp" namespace geos diff --git a/src/coreComponents/constitutive/solid/TriaxialDriver.cpp b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp similarity index 99% rename from src/coreComponents/constitutive/solid/TriaxialDriver.cpp rename to src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp index 5d345e6986f..c0e2a8ecdeb 100644 --- a/src/coreComponents/constitutive/solid/TriaxialDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp @@ -18,7 +18,6 @@ */ #include "TriaxialDriver.hpp" -#include "fileIO/Outputs/OutputBase.hpp" namespace geos { diff --git a/src/coreComponents/constitutive/solid/TriaxialDriver.hpp b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.hpp similarity index 100% rename from src/coreComponents/constitutive/solid/TriaxialDriver.hpp rename to src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.hpp diff --git a/src/coreComponents/dataRepository/CMakeLists.txt b/src/coreComponents/dataRepository/CMakeLists.txt index bfaecd6d778..1d97ce8d11e 100644 --- a/src/coreComponents/dataRepository/CMakeLists.txt +++ b/src/coreComponents/dataRepository/CMakeLists.txt @@ -50,12 +50,16 @@ if( ENABLE_PYGEOSX ) list( APPEND dependencyList Python3::Python pylvarray ) endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) blt_add_library( NAME dataRepository SOURCES ${dataRepository_sources} HEADERS ${dataRepository_headers} - DEPENDS_ON ${dependencyList} - OBJECT ${GEOS_BUILD_OBJ_LIBS} ) + DEPENDS_ON ${decoratedDependencies} + OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} + ) target_include_directories( dataRepository PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt index 791767bc5c6..64a91cf1c70 100644 --- a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt +++ b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt @@ -10,11 +10,16 @@ set( denseLinearAlgebra_sources set( dependencyList codingUtilities blas lapack ${parallelDeps} ) +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + blt_add_library( NAME denseLinearAlgebra SOURCES ${denseLinearAlgebra_sources} HEADERS ${denseLinearAlgebra_headers} - DEPENDS_ON ${dependencyList} - OBJECT ${GEOS_BUILD_OBJ_LIBS} ) + DEPENDS_ON ${decoratedDependencies} + OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} + ) target_include_directories( denseLinearAlgebra PUBLIC ${CMAKE_CURRENT_LIST_DIR} ) diff --git a/src/coreComponents/discretizationMethods/CMakeLists.txt b/src/coreComponents/discretizationMethods/CMakeLists.txt index 220d535ab28..191f8dd12c9 100644 --- a/src/coreComponents/discretizationMethods/CMakeLists.txt +++ b/src/coreComponents/discretizationMethods/CMakeLists.txt @@ -13,11 +13,15 @@ set( dependencyList ${parallelDeps} finiteVolume ) set( mainInterface_sources NumericalMethodsManager.cpp ) +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + blt_add_library( NAME discretizationMethods SOURCES ${mainInterface_sources} HEADERS ${mainInterface_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) target_include_directories( discretizationMethods PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/events/CMakeLists.txt b/src/coreComponents/events/CMakeLists.txt index 59217e42f7d..184dea2f0c1 100644 --- a/src/coreComponents/events/CMakeLists.txt +++ b/src/coreComponents/events/CMakeLists.txt @@ -24,13 +24,17 @@ set( events_sources tasks/TasksManager.cpp ) -set( dependencyList ${parallelDeps} common fileIO dataRepository ) +set( dependencyList ${parallelDeps} functions ) + +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) blt_add_library( NAME events SOURCES ${events_sources} HEADERS ${events_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) target_include_directories( events PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/events/EventManager.cpp b/src/coreComponents/events/EventManager.cpp index 6dc12b5624d..cdb4c239a56 100644 --- a/src/coreComponents/events/EventManager.cpp +++ b/src/coreComponents/events/EventManager.cpp @@ -21,7 +21,7 @@ #include "common/TimingMacros.hpp" #include "events/EventBase.hpp" -#include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "common/MpiWrapper.hpp" #include "common/Units.hpp" namespace geos diff --git a/src/coreComponents/fieldSpecification/CMakeLists.txt b/src/coreComponents/fieldSpecification/CMakeLists.txt index d13d6a6c795..f7b68eaaa1e 100644 --- a/src/coreComponents/fieldSpecification/CMakeLists.txt +++ b/src/coreComponents/fieldSpecification/CMakeLists.txt @@ -26,13 +26,17 @@ set( fieldSpecification_sources PerfectlyMatchedLayer.cpp ) -set( dependencyList ${parallelDeps} functions linearAlgebra ) +set( dependencyList ${parallelDeps} linearAlgebra ) + +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) blt_add_library( NAME fieldSpecification SOURCES ${fieldSpecification_sources} HEADERS ${fieldSpecification_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) target_include_directories( fieldSpecification PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/fileIO/CMakeLists.txt b/src/coreComponents/fileIO/CMakeLists.txt index 84c758fa2b2..714ea11808c 100644 --- a/src/coreComponents/fileIO/CMakeLists.txt +++ b/src/coreComponents/fileIO/CMakeLists.txt @@ -28,7 +28,7 @@ set( fileIO_sources timeHistory/PackCollection.cpp timeHistory/HDFHistoryIO.cpp ) -set( dependencyList ${parallelDeps} mesh constitutive HDF5::HDF5 ) +set( dependencyList ${parallelDeps} events mesh HDF5::HDF5 ) if( ENABLE_PYGEOSX ) list( APPEND fileIO_headers python/PyHistoryCollectionType.hpp @@ -79,11 +79,16 @@ if( ENABLE_CUDA AND ENABLE_CUDA_NVTOOLSEXT ) list( APPEND dependencyList CUDA::nvToolsExt ) endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + blt_add_library( NAME fileIO SOURCES ${fileIO_sources} HEADERS ${fileIO_headers} - DEPENDS_ON ${dependencyList} - OBJECT ${GEOS_BUILD_OBJ_LIBS} ) + DEPENDS_ON ${decoratedDependencies} + OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} + ) target_include_directories( fileIO PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.cpp b/src/coreComponents/fileIO/Outputs/OutputBase.cpp index a09086396f4..88f8f9c8f29 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.cpp @@ -19,13 +19,11 @@ #include "OutputBase.hpp" #include "common/MpiWrapper.hpp" +#include "functions/FunctionBase.hpp" namespace geos { -string OutputBase::m_outputDirectory; -string OutputBase::m_fileNameRoot; - using namespace dataRepository; OutputBase::OutputBase( string const & name, @@ -64,14 +62,33 @@ void OutputBase::initializePreSubGroups() // SetupDirectoryStructure(); } + + +string const & OutputBase::getOutputDirectory() +{ + static string m_outputDirectory; + return m_outputDirectory; +} + void OutputBase::setOutputDirectory( string const & outputDir ) { - m_outputDirectory = outputDir; + string & outputDirectory = const_cast< string & >( getOutputDirectory() ); + outputDirectory = outputDir; + FunctionBase::setOutputDirectory( outputDirectory ); +} + + + +string const & OutputBase::getFileNameRoot() +{ + static string m_fileNameRoot; + return m_fileNameRoot; } void OutputBase::setFileNameRoot( string const & root ) { - m_fileNameRoot = root; + string & fileRootName = const_cast< string & >( getFileNameRoot() ); + fileRootName = root; } diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.hpp b/src/coreComponents/fileIO/Outputs/OutputBase.hpp index 6be32f38d2e..0f90ba1b12e 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.hpp @@ -50,7 +50,7 @@ class OutputBase : public ExecutableGroup * @brief Getter for the output directory * @return The output directory **/ - static string getOutputDirectory() {return m_outputDirectory;} + static string const & getOutputDirectory(); /** * @brief Setter for the file name root @@ -62,7 +62,7 @@ class OutputBase : public ExecutableGroup * @brief Getter for the file name root * @return The file name root **/ - static string getFileNameRoot() { return m_fileNameRoot; } + static string const & getFileNameRoot(); /// Method for setting up output directories. virtual void setupDirectoryStructure(); @@ -92,6 +92,8 @@ class OutputBase : public ExecutableGroup **/ integer parallelThreads() const { return m_parallelThreads; } + + protected: /** * @brief Do initialization prior to calling initialization operations @@ -104,9 +106,6 @@ class OutputBase : public ExecutableGroup string m_childDirectory; integer m_parallelThreads; - static string m_outputDirectory; - static string m_fileNameRoot; - }; diff --git a/src/coreComponents/finiteElement/CMakeLists.txt b/src/coreComponents/finiteElement/CMakeLists.txt index a1e5b0b4ad4..aa3740ddd04 100644 --- a/src/coreComponents/finiteElement/CMakeLists.txt +++ b/src/coreComponents/finiteElement/CMakeLists.txt @@ -42,11 +42,15 @@ set( finiteElement_sources set( dependencyList ${parallelDeps} dataRepository ) +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + blt_add_library( NAME finiteElement SOURCES ${finiteElement_sources} HEADERS ${finiteElement_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) target_include_directories( finiteElement PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/finiteVolume/CMakeLists.txt b/src/coreComponents/finiteVolume/CMakeLists.txt index 46b200344fa..9f855fc79db 100644 --- a/src/coreComponents/finiteVolume/CMakeLists.txt +++ b/src/coreComponents/finiteVolume/CMakeLists.txt @@ -40,13 +40,17 @@ set( finiteVolume_sources HybridMimeticDiscretization.cpp ) -set( dependencyList ${parallelDeps} mesh codingUtilities fieldSpecification ) +set( dependencyList ${parallelDeps} mesh fieldSpecification ) + +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) blt_add_library( NAME finiteVolume SOURCES ${finiteVolume_sources} HEADERS ${finiteVolume_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) target_include_directories( finiteVolume PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/functions/CMakeLists.txt b/src/coreComponents/functions/CMakeLists.txt index 5a3804dbc24..ec6542660da 100644 --- a/src/coreComponents/functions/CMakeLists.txt +++ b/src/coreComponents/functions/CMakeLists.txt @@ -27,17 +27,21 @@ if( ENABLE_MATHPRESSO ) endif() -set( dependencyList ${parallelDeps} codingUtilities dataRepository fileIO ) +set( dependencyList ${parallelDeps} dataRepository ) if( ENABLE_MATHPRESSO ) list( APPEND dependencyList mathpresso ) endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + blt_add_library( NAME functions SOURCES ${functions_sources} HEADERS ${functions_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) target_include_directories( functions PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/functions/FunctionBase.cpp b/src/coreComponents/functions/FunctionBase.cpp index dbc6279c727..3899ef1b3e6 100644 --- a/src/coreComponents/functions/FunctionBase.cpp +++ b/src/coreComponents/functions/FunctionBase.cpp @@ -72,5 +72,16 @@ real64_array FunctionBase::evaluateStats( dataRepository::Group const & group, return result; } +string const & FunctionBase::getOutputDirectory() +{ + static string outputDirectory; + return outputDirectory; +} +void FunctionBase::setOutputDirectory( string const & dir ) +{ + string & outputDirectory = const_cast< string & >( getOutputDirectory() ); + outputDirectory = dir; +} + } // end of namespace geos diff --git a/src/coreComponents/functions/FunctionBase.hpp b/src/coreComponents/functions/FunctionBase.hpp index 4d37ebf089c..3b160059743 100644 --- a/src/coreComponents/functions/FunctionBase.hpp +++ b/src/coreComponents/functions/FunctionBase.hpp @@ -124,6 +124,17 @@ class FunctionBase : public dataRepository::Group */ void setInputVarNames( string_array inputVarNames ) { m_inputVarNames = std::move( inputVarNames ); } + /** + * @brief Get the output directory for function output + * @return a string containing the output directory + */ + static string const & getOutputDirectory(); + + /** + * @brief Set the output directory for function output + * @param outputDir The output directory + */ + static void setOutputDirectory( string const & outputDir ); protected: /// names for the input variables diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index 9b71eee3805..dcd9099f7a6 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -20,7 +20,6 @@ #include "TableFunction.hpp" #include "codingUtilities/Parsing.hpp" #include "common/DataTypes.hpp" -#include "fileIO/Outputs/OutputBase.hpp" #include @@ -187,7 +186,7 @@ void TableFunction::checkCoord( real64 const coord, localIndex const dim ) const void TableFunction::print( std::string const & filename ) const { - std::ofstream os( joinPath( OutputBase::getOutputDirectory(), filename + ".csv" ) ); + std::ofstream os( joinPath( FunctionBase::getOutputDirectory(), filename + ".csv" ) ); integer const numDimensions = LvArray::integerConversion< integer >( m_coordinates.size() ); diff --git a/src/coreComponents/functions/unitTests/CMakeLists.txt b/src/coreComponents/functions/unitTests/CMakeLists.txt index 5aa938d9ce4..825cfe81687 100644 --- a/src/coreComponents/functions/unitTests/CMakeLists.txt +++ b/src/coreComponents/functions/unitTests/CMakeLists.txt @@ -5,12 +5,6 @@ set( gtest_geosx_tests set( dependencyList ${parallelDeps} gtest functions ) -# if ( GEOS_BUILD_SHARED_LIBS ) -# list( APPEND dependencyList geosx_core ) -# else() -# list( APPEND dependencyList ${geosx_core_libs} ) -# endif() - if (TARGET pugixml::pugixml) list( APPEND dependencyList pugixml::pugixml ) endif() diff --git a/src/coreComponents/linearAlgebra/CMakeLists.txt b/src/coreComponents/linearAlgebra/CMakeLists.txt index 07c823d8300..abbfcdf8bb2 100644 --- a/src/coreComponents/linearAlgebra/CMakeLists.txt +++ b/src/coreComponents/linearAlgebra/CMakeLists.txt @@ -48,15 +48,16 @@ set( linearAlgebra_sources utilities/ReverseCutHillMcKeeOrdering.cpp ) set( dependencyList ${parallelDeps} mesh denseLinearAlgebra ) +set( tplDependencyList "" ) list( APPEND linearAlgebra_headers interfaces/direct/SuiteSparse.hpp ) list( APPEND linearAlgebra_sources interfaces/direct/SuiteSparse.cpp ) -list( APPEND dependencyList suitesparse ) +list( APPEND tplDependencyList suitesparse ) if( ENABLE_SUPERLU_DIST ) list( APPEND linearAlgebra_headers interfaces/direct/SuperLUDist.hpp ) list( APPEND linearAlgebra_sources interfaces/direct/SuperLUDist.cpp ) - list( APPEND dependencyList superlu_dist ) + list( APPEND tplDependencyList superlu_dist ) endif( ) if( ENABLE_TRILINOS ) @@ -78,7 +79,7 @@ if( ENABLE_TRILINOS ) interfaces/trilinos/TrilinosPreconditioner.cpp interfaces/trilinos/TrilinosSolver.cpp ) - list( APPEND dependencyList trilinos ) + list( APPEND tplDependencyList trilinos ) endif() @@ -122,7 +123,7 @@ if( ENABLE_HYPRE ) interfaces/hypre/HypreUtils.cpp interfaces/hypre/HypreVector.cpp ) - list( APPEND dependencyList hypre umpire ) + list( APPEND tplDependencyList hypre umpire ) endif() @@ -145,15 +146,19 @@ if( ENABLE_PETSC ) interfaces/petsc/PetscSolver.cpp interfaces/petsc/PetscVector.cpp ) - list( APPEND dependencyList petsc ) + list( APPEND tplDependencyList petsc ) endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + blt_add_library( NAME linearAlgebra SOURCES ${linearAlgebra_sources} HEADERS ${linearAlgebra_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) target_include_directories( linearAlgebra PUBLIC ${CMAKE_CURRENT_LIST_DIR} ) diff --git a/src/coreComponents/mainInterface/CMakeLists.txt b/src/coreComponents/mainInterface/CMakeLists.txt index 4b141ea8b7f..fb96f9ed6c5 100644 --- a/src/coreComponents/mainInterface/CMakeLists.txt +++ b/src/coreComponents/mainInterface/CMakeLists.txt @@ -18,13 +18,17 @@ set( mainInterface_sources version.cpp ) -set( dependencyList ${parallelDeps} physicsSolvers discretizationMethods fieldSpecification linearAlgebra dataRepository events fileIO optionparser ) +set( dependencyList ${parallelDeps} physicsSolvers constitutiveDrivers optionparser ) + +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) blt_add_library( NAME mainInterface SOURCES ${mainInterface_sources} HEADERS ${mainInterface_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) add_dependencies( mainInterface generate_version ) diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 23ca5862dc0..2319c40ee4d 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -24,6 +24,7 @@ #include "common/Path.hpp" #include "common/TimingMacros.hpp" #include "constitutive/ConstitutiveManager.hpp" +#include "constitutiveDrivers/solid/TriaxialDriver.hpp" #include "dataRepository/ConduitRestart.hpp" #include "dataRepository/RestartFlags.hpp" #include "dataRepository/KeyNames.hpp" @@ -141,7 +142,18 @@ ProblemManager::ProblemManager( conduit::Node & root ): } ProblemManager::~ProblemManager() -{} +{ + { + // This is a dummy to force the inclusion of constitutiveDrivers in the linking process for systems that have "--no-as-needed" as a + // default. + // The "correct" way to do this is in cmake using: + // target_link_options(constitutiveDrivers INTERFACE "SHELL:LINKER:--no-as-needed") + // but this applies "--no-as-needed" to all targets that link to constitutiveDrivers, which is not what we want. + // Also "--no-as-needed" is not supported on all platforms, so we have to guard the use of it. + // This is a workaround until we can figure out in cmake without too much trouble. + TriaxialDriver dummy( "dummy", this ); + } +} Group * ProblemManager::createChild( string const & GEOS_UNUSED_PARAM( childKey ), string const & GEOS_UNUSED_PARAM( childName ) ) diff --git a/src/coreComponents/mesh/CMakeLists.txt b/src/coreComponents/mesh/CMakeLists.txt index 7548a76d8f6..5eeb7f1a900 100644 --- a/src/coreComponents/mesh/CMakeLists.txt +++ b/src/coreComponents/mesh/CMakeLists.txt @@ -148,7 +148,7 @@ set( mesh_sources simpleGeometricObjects/ThickPlane.cpp utilities/ComputationalGeometry.cpp ) -set( dependencyList ${parallelDeps} schema dataRepository constitutive finiteElement parmetis metis ) +set( dependencyList ${parallelDeps} schema constitutive finiteElement parmetis metis ) if( ENABLE_VTK ) message(STATUS "Adding VTK readers") @@ -180,11 +180,16 @@ if( ENABLE_SCOTCH ) list( APPEND dependencyList ptscotch ) endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + blt_add_library( NAME mesh SOURCES ${mesh_sources} HEADERS ${mesh_headers} - DEPENDS_ON ${dependencyList} - OBJECT ${GEOS_BUILD_OBJ_LIBS} ) + DEPENDS_ON ${decoratedDependencies} + OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} + ) target_include_directories( mesh PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index cfcdce65e78..c8a6f1a002e 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -51,7 +51,8 @@ if( GEOS_ENABLE_WAVEPROPAGATION ) add_subdirectory( wavePropagation ) endif() -set( dependencyList ${parallelDeps} constitutive mesh linearAlgebra discretizationMethods events ) +set( dependencyList ${parallelDeps} fileIO discretizationMethods events ) + if( ENABLE_PYGEOSX ) list( APPEND physicsSolvers_headers python/PySolver.hpp @@ -61,11 +62,16 @@ if( ENABLE_PYGEOSX ) list( APPEND dependencyList Python3::Python pylvarray ) endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + blt_add_library( NAME physicsSolvers SOURCES ${physicsSolvers_sources} HEADERS ${physicsSolvers_headers} - DEPENDS_ON ${dependencyList} ${externalComponentDeps} - OBJECT ${GEOS_BUILD_OBJ_LIBS} ) + DEPENDS_ON ${decoratedDependencies} ${externalComponentDeps} + OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} + ) target_include_directories( physicsSolvers PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) if( externalComponentDeps ) diff --git a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp index 5edf76ab710..2afecdd6d66 100644 --- a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp +++ b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp @@ -22,7 +22,6 @@ #include "events/tasks/TaskBase.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" -#include "mainInterface/ProblemManager.hpp" #include "mesh/MeshLevel.hpp" #include "fileIO/Outputs/OutputBase.hpp" @@ -84,8 +83,8 @@ class FieldStatisticsBase : public TaskBase void postInputInitialization() override { - ProblemManager & problemManager = this->getGroupByPath< ProblemManager >( "/Problem" ); - PhysicsSolverManager & physicsSolverManager = problemManager.getPhysicsSolverManager(); + Group & problemManager = this->getGroupByPath( "/Problem" ); + Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); m_solver = physicsSolverManager.getGroupPointer< SOLVER >( m_solverName ); GEOS_THROW_IF( m_solver == nullptr, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp index 9a4a4dc06aa..dcd795ec3ed 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp @@ -24,7 +24,6 @@ #include "constitutive/permeability/PermeabilityBase.hpp" #include "constitutive/permeability/PermeabilityFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "mainInterface/ProblemManager.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" #include "common/format/table/TableFormatter.hpp" @@ -61,10 +60,10 @@ StencilDataCollection::StencilDataCollection( const string & name, void StencilDataCollection::postInputInitialization() { - ProblemManager & problemManager = this->getGroupByPath< ProblemManager >( "/Problem" ); + Group & problemManager = this->getGroupByPath( "/Problem" ); { // find targeted solver - PhysicsSolverManager & physicsSolverManager = problemManager.getPhysicsSolverManager(); + Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); m_solver = physicsSolverManager.getGroupPointer< FlowSolverBase >( m_solverName ); GEOS_THROW_IF( m_solver == nullptr, @@ -75,7 +74,8 @@ void StencilDataCollection::postInputInitialization() } { // find mesh & discretization - DomainPartition & domain = problemManager.getDomainPartition(); +// DomainPartition & domain = problemManager.getDomainPartition(); + DomainPartition & domain = problemManager.getGroup< DomainPartition >( "domain" ); MeshBody const & meshBody = domain.getMeshBody( m_meshName ); m_meshLevel = &meshBody.getBaseDiscretization(); diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index 9505e80bfb3..e431cf1ac06 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -25,7 +25,6 @@ #include "physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp" #include "physicsSolvers/multiphysics/HydrofractureSolver.hpp" -#include "mainInterface/ProblemManager.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" #include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" @@ -68,8 +67,8 @@ void PoromechanicsInitialization< POROMECHANICS_SOLVER >:: postInputInitialization() { - ProblemManager & problemManager = this->getGroupByPath< ProblemManager >( "/Problem" ); - PhysicsSolverManager & physicsSolverManager = problemManager.getPhysicsSolverManager(); + Group & problemManager = this->getGroupByPath( "/Problem" ); + Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); GEOS_THROW_IF( !physicsSolverManager.hasGroup( m_poromechanicsSolverName ), GEOS_FMT( "{}: {} solver named {} not found", @@ -82,7 +81,7 @@ postInputInitialization() if( !m_solidMechanicsStatisticsName.empty()) { - TasksManager & tasksManager = problemManager.getTasksManager(); + TasksManager & tasksManager = problemManager.getGroup< TasksManager >( "Tasks" ); GEOS_THROW_IF( !tasksManager.hasGroup( m_solidMechanicsStatisticsName ), GEOS_FMT( "{}: statistics task named {} not found", diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index ceca67b46c2..b5642b135e9 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -21,7 +21,6 @@ #include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" -#include "mainInterface/ProblemManager.hpp" #include "mesh/DomainPartition.hpp" namespace geos @@ -59,8 +58,8 @@ SolidMechanicsStateReset::~SolidMechanicsStateReset() void SolidMechanicsStateReset::postInputInitialization() { - ProblemManager & problemManager = this->getGroupByPath< ProblemManager >( "/Problem" ); - PhysicsSolverManager & physicsSolverManager = problemManager.getPhysicsSolverManager(); + Group & problemManager = this->getGroupByPath( "/Problem" ); + Group & physicsSolverManager = problemManager.getGroup( "Solvers" ); GEOS_THROW_IF( !physicsSolverManager.hasGroup( m_solidSolverName ), GEOS_FMT( "Task {}: physics solver named {} not found", diff --git a/src/coreComponents/schema/CMakeLists.txt b/src/coreComponents/schema/CMakeLists.txt index ecae0b5dd75..a6e7369b14b 100644 --- a/src/coreComponents/schema/CMakeLists.txt +++ b/src/coreComponents/schema/CMakeLists.txt @@ -14,11 +14,15 @@ set( schema_sources set( dependencyList ${parallelDeps} dataRepository ) +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + blt_add_library( NAME schema SOURCES ${schema_sources} HEADERS ${schema_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) diff --git a/src/coreComponents/schema/docs/HydraulicApertureTable.rst b/src/coreComponents/schema/docs/HydraulicApertureTable.rst new file mode 100644 index 00000000000..396fc421971 --- /dev/null +++ b/src/coreComponents/schema/docs/HydraulicApertureTable.rst @@ -0,0 +1,12 @@ + + +================= ============ ======== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= +Name Type Default Description +================= ============ ======== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= +apertureTableName groupNameRef required Name of the aperture table +apertureTolerance real64 1e-09 Value to be used to avoid floating point errors in expressions involving aperture. For example in the case of dividing by the actual aperture (not the effective aperture that results from the aperture function) this value may be used to avoid the 1/0 error. Note that this value may have some physical significance in its usage, as it may be used to smooth out highly nonlinear behavior associated with 1/0 in addition to avoiding the 1/0 error. +name groupName required A name is required for any non-unique nodes +referenceAperture real64 1e-06 Reference hydraulic aperture. It is the aperture at zero normal stress. +================= ============ ======== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= + + diff --git a/src/coreComponents/schema/docs/HydraulicApertureTable_other.rst b/src/coreComponents/schema/docs/HydraulicApertureTable_other.rst new file mode 100644 index 00000000000..adf1c1b8aec --- /dev/null +++ b/src/coreComponents/schema/docs/HydraulicApertureTable_other.rst @@ -0,0 +1,9 @@ + + +==== ==== ============================ +Name Type Description +==== ==== ============================ + (no documentation available) +==== ==== ============================ + + diff --git a/src/coreComponents/schema/docs/VTKMesh.rst b/src/coreComponents/schema/docs/VTKMesh.rst index 3c6616c3087..f8365fa847f 100644 --- a/src/coreComponents/schema/docs/VTKMesh.rst +++ b/src/coreComponents/schema/docs/VTKMesh.rst @@ -4,7 +4,7 @@ Name Type Default Description ====================== ======================== ========= ============================================================================================================================================================================================================================================================================================================================================================================================================================================================================ faceBlocks groupNameRef_array {} For multi-block files, names of the face mesh block. -fieldNamesInGEOS groupNameRef_array {} Names of the volumic fields in GEOS to import into +fieldNamesInGEOS groupNameRef_array {} Names of the volumic fields in GEOS to import into fieldsToImport groupNameRef_array {} Volumic fields to be imported from the external mesh file file path required Path to the mesh file logLevel integer 0 Log level @@ -15,7 +15,7 @@ partitionMethod geos_vtk_PartitionMethod parmetis Method (library) used partitionRefinement integer 1 Number of partitioning refinement iterations (defaults to 1, recommended value).A value of 0 disables graph partitioning and keeps simple kd-tree partitions (not recommended). Values higher than 1 may lead to slightly improved partitioning, but yield diminishing returns. regionAttribute groupNameRef attribute Name of the VTK cell attribute to use as region marker scale R1Tensor {1,1,1} Scale the coordinates of the vertices by given scale factors (after translation) -surfacicFieldsInGEOS groupNameRef_array {} Names of the surfacic fields in GEOS to import into +surfacicFieldsInGEOS groupNameRef_array {} Names of the surfacic fields in GEOS to import into surfacicFieldsToImport groupNameRef_array {} Surfacic fields to be imported from the external mesh file translate R1Tensor {0,0,0} Translate the coordinates of the vertices by a given vector (prior to scaling) useGlobalIds integer 0 Controls the use of global IDs in the input file for cells and points. If set to 0 (default value), the GlobalId arrays in the input mesh are used if available, and generated otherwise. If set to a negative value, the GlobalId arrays in the input mesh are not used, and generated global Ids are automatically generated. If set to a positive value, the GlobalId arrays in the input mesh are used and required, and the simulation aborts if they are not available diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 2fe20af996e..f6bb47873ec 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -1691,8 +1691,8 @@ stress - traction is applied to the faces as specified by the inner product of i - - + + @@ -1711,8 +1711,8 @@ stress - traction is applied to the faces as specified by the inner product of i - - + + diff --git a/src/coreComponents/unitTests/CMakeLists.txt b/src/coreComponents/unitTests/CMakeLists.txt index 9e087f54b56..e9072bbbc1e 100644 --- a/src/coreComponents/unitTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/CMakeLists.txt @@ -1,4 +1,5 @@ add_subdirectory( toolchain ) +add_subdirectory( testingUtilities ) add_subdirectory( xmlTests ) add_subdirectory( virtualElementTests ) add_subdirectory( linearAlgebraTests ) @@ -11,6 +12,5 @@ add_subdirectory( fileIOTests ) if( GEOS_ENABLE_FLUIDFLOW ) add_subdirectory( fluidFlowTests ) endif() -add_subdirectory( testingUtilities ) add_subdirectory( wellsTests ) add_subdirectory( wavePropagationTests ) diff --git a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt index 24fb4d17cef..b30a378c542 100644 --- a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt @@ -32,35 +32,17 @@ set( gtest_pvt_xmls set( gtest_reactivefluid_xmls testReactiveFluid.xml ) -set( dependencyList ${parallelDeps} gtest ) +set( tplDependencyList ${parallelDeps} gtest ) -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) -endif() +set( dependencyList mainInterface ) if( ENABLE_PVTPackage ) list( APPEND gtest_geosx_tests testMultiFluidCompositionalMultiphasePVTPackage.cpp ) - list( APPEND dependencyList PVTPackage ) -endif() - -if (TARGET pugixml::pugixml) - list( APPEND dependencyList pugixml::pugixml ) -endif() - -if (TARGET pugixml) - list( APPEND dependencyList pugixml ) -endif() - -if (TARGET fmt::fmt-header-only) - list( APPEND dependencyList fmt::fmt-header-only ) endif() -if (TARGET fmt) - list( APPEND dependencyList fmt ) -endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) # Add gtest C++ based tests foreach(test ${gtest_geosx_tests}) @@ -68,8 +50,9 @@ foreach(test ${gtest_geosx_tests}) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) + blt_print_target_properties( TARGET ${test_name} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} ) @@ -79,7 +62,7 @@ endforeach() blt_add_executable( NAME testTriaxial SOURCES testTriaxial.cpp OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} "-lz" ) + DEPENDS_ON ${dependencyList} "-lz" ${tplDependencyList}) foreach(test ${gtest_triaxial_xmls}) get_filename_component( test_name ${test} NAME_WE ) @@ -91,7 +74,7 @@ endforeach() blt_add_executable( NAME testPVT SOURCES testPVT.cpp OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} "-lz" ) + DEPENDS_ON ${dependencyList} "-lz" ${tplDependencyList} ) foreach(test ${gtest_pvt_xmls}) get_filename_component( test_name ${test} NAME_WE ) @@ -104,7 +87,7 @@ endforeach() blt_add_executable( NAME testReactiveFluid SOURCES testReactiveFluid.cpp OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} "-lz" ) + DEPENDS_ON ${dependencyList} "-lz" ${tplDependencyList} ) foreach(test ${gtest_reactivefluid_xmls}) get_filename_component( test_name ${test} NAME_WE ) diff --git a/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt b/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt index d8e7129a73e..47b3b63d0a0 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/dataRepositoryTests/CMakeLists.txt @@ -6,29 +6,12 @@ set( dataRepository_tests testWrapperHelpers.cpp testGroupPath.cpp ) -set( dependencyList ${parallelDeps} gtest ) +set( tplDependencyList ${parallelDeps} gtest ) -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) -endif() +set( dependencyList mainInterface ) -if (TARGET pugixml::pugixml) - list( APPEND dependencyList pugixml::pugixml ) -endif() - -if (TARGET pugixml) - list( APPEND dependencyList pugixml ) -endif() - -if (TARGET fmt::fmt-header-only) - list( APPEND dependencyList fmt::fmt-header-only ) -endif() - -if (TARGET fmt) - list( APPEND dependencyList fmt ) -endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) # Add gtest C++ based tests foreach(test ${dataRepository_tests}) @@ -36,7 +19,7 @@ foreach(test ${dataRepository_tests}) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} ) diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt b/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt index 978a41e3a99..d66f6661e22 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fieldSpecificationTests/CMakeLists.txt @@ -5,37 +5,20 @@ set( gtest_geosx_tests testRecursiveFieldApplication.cpp ) -set( dependencyList ${parallelDeps} gtest ) +set( tplDependencyList ${parallelDeps} gtest ) -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) -endif() - -if (TARGET pugixml::pugixml) - list( APPEND dependencyList pugixml::pugixml ) -endif() - -if (TARGET pugixml) - list( APPEND dependencyList pugixml ) -endif() - -if (TARGET fmt::fmt-header-only) - list( APPEND dependencyList fmt::fmt-header-only ) -endif() - -if (TARGET fmt) - list( APPEND dependencyList fmt ) -endif() +set( dependencyList mainInterface ) +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + # Add gtest C++ based tests foreach(test ${gtest_geosx_tests}) get_filename_component( test_name ${test} NAME_WE ) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} ) diff --git a/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt b/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt index 16aec0c79db..7bf5498da5b 100644 --- a/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fileIOTests/CMakeLists.txt @@ -1,13 +1,12 @@ # Specify list of tests set( geosx_fileio_tests testHDFFile.cpp ) -set( dependencyList ${parallelDeps} gtest HDF5::HDF5 ) +set( tplDependencyList ${parallelDeps} gtest ) -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) -else() - list( APPEND dependencyList ${geosx_core_libs} ) -endif() +set( dependencyList mainInterface ) + +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) # Add gtest C++ based tests foreach(test ${geosx_fileio_tests}) @@ -15,7 +14,7 @@ foreach(test ${geosx_fileio_tests}) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} ) @@ -32,7 +31,7 @@ if ( ENABLE_MPI ) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} diff --git a/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt b/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt index 9837bc2a1ff..d809c09d7c3 100644 --- a/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/finiteVolumeTests/CMakeLists.txt @@ -2,21 +2,20 @@ set( gtest_geosx_tests testMimeticInnerProducts.cpp ) -set( dependencyList ${parallelDeps} gtest ) - -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) -endif() +set( tplDependencyList ${parallelDeps} gtest ) +set( dependencyList mainInterface ) + +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) + # Add gtest C++ based tests foreach(test ${gtest_geosx_tests}) get_filename_component( test_name ${test} NAME_WE ) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) # Guard to prevent GCC (version 8) from giving warnings due # to some sort of possible conversion from int to long unsigned. diff --git a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt index 23399171ff5..c21190560cf 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt @@ -6,40 +6,19 @@ set( gtest_geosx_tests testFlowStatistics.cpp testTransmissibility.cpp ) -set( dependencyList ${parallelDeps} gtest ) - -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) -endif() - -set( dependencyList testingUtilities ) - if( ENABLE_PVTPackage ) list( APPEND gtest_geosx_tests testCompMultiphaseFlow.cpp testCompMultiphaseFlowHybrid.cpp testReactiveCompositionalMultiphaseOBL.cpp ) - - list( APPEND dependencyList PVTPackage ) endif() -if (TARGET pugixml::pugixml) - list( APPEND dependencyList pugixml::pugixml ) -endif() +set( tplDependencyList ${parallelDeps} gtest ) -if (TARGET pugixml) - list( APPEND dependencyList pugixml ) -endif() +set( dependencyList mainInterface testingUtilities ) -if (TARGET fmt::fmt-header-only) - list( APPEND dependencyList fmt::fmt-header-only ) -endif() - -if (TARGET fmt) - list( APPEND dependencyList fmt ) -endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) # Add gtest C++ based tests foreach(test ${gtest_geosx_tests}) @@ -48,7 +27,7 @@ foreach(test ${gtest_geosx_tests}) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} ) diff --git a/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt b/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt index deb3d57d163..f14fe910eac 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/linearAlgebraTests/CMakeLists.txt @@ -6,29 +6,13 @@ set( LAI_tests set( nranks 2 ) # Add gtest C++ based tests -set( dependencyList ${parallelDeps} gtest ) +set( tplDependencyList ${parallelDeps} gtest ) -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) -endif() - -if (TARGET pugixml::pugixml) - set( dependencyList ${dependencyList} pugixml::pugixml ) -endif() +set( dependencyList mainInterface ) -if (TARGET pugixml) - set( dependencyList ${dependencyList} pugixml ) -endif() - -if (TARGET fmt::fmt-header-only) - set( dependencyList ${dependencyList} fmt::fmt-header-only ) -endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) -if (TARGET fmt) - set( dependencyList ${dependencyList} fmt ) -endif() foreach(test ${LAI_tests}) get_filename_component( test_name ${test} NAME_WE ) @@ -36,7 +20,7 @@ foreach(test ${LAI_tests}) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) if ( ENABLE_MPI ) diff --git a/src/coreComponents/unitTests/meshTests/CMakeLists.txt b/src/coreComponents/unitTests/meshTests/CMakeLists.txt index acd69ee16c0..fe8cca29817 100644 --- a/src/coreComponents/unitTests/meshTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/meshTests/CMakeLists.txt @@ -19,29 +19,13 @@ if( ENABLE_VTK ) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/meshDirName.hpp.in ${CMAKE_BINARY_DIR}/include/tests/meshDirName.hpp ) endif() -set( dependencyList ${parallelDeps} gtest ) +set( tplDependencyList ${parallelDeps} gtest ) -if( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) -endif() - -if (TARGET pugixml::pugixml) - list( APPEND dependencyList pugixml::pugixml ) -endif() +set( dependencyList mainInterface ) -if (TARGET pugixml) - list( APPEND dependencyList pugixml ) -endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) -if (TARGET fmt::fmt-header-only) - list( APPEND dependencyList fmt::fmt-header-only ) -endif() - -if (TARGET fmt) - list( APPEND dependencyList fmt ) -endif() # Add gtest C++ based tests foreach( test ${gtest_geosx_tests} ) @@ -49,7 +33,7 @@ foreach( test ${gtest_geosx_tests} ) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} ${CMAKE_CURRENT_LIST_DIR} ) @@ -75,7 +59,7 @@ if( ENABLE_MPI ) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} -x ${nranks} diff --git a/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt b/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt index b89d54ba0f5..7534c11b82d 100644 --- a/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt +++ b/src/coreComponents/unitTests/testingUtilities/CMakeLists.txt @@ -15,19 +15,19 @@ set( testingUtilities_sources # # Specify all dependencies # -set( dependencyList ${parallelDeps} gtest ) +set( tplDependencyList ${parallelDeps} gtest ) + +set( dependencyList events ) +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) -endif() - blt_add_library( NAME testingUtilities SOURCES ${testingUtilities_sources} HEADERS ${testingUtilities_headers} - DEPENDS_ON ${dependencyList} + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} OBJECT ${GEOS_BUILD_OBJ_LIBS} + SHARED ${GEOS_BUILD_SHARED_LIBS} ) target_include_directories( testingUtilities PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +target_include_directories( testingUtilities PUBLIC ${CMAKE_BINARY_DIR}/include ) diff --git a/src/coreComponents/unitTests/toolchain/CMakeLists.txt b/src/coreComponents/unitTests/toolchain/CMakeLists.txt index f4509635eb7..e8b25319ad9 100644 --- a/src/coreComponents/unitTests/toolchain/CMakeLists.txt +++ b/src/coreComponents/unitTests/toolchain/CMakeLists.txt @@ -2,7 +2,10 @@ set( gtest_geosx_tests testToolchain.cpp ) # NOTE: we explicitly depend on internal libraries in order to check for the spurious addition of -DNDEBUG flag -set( dependencyList ${parallelDeps} gtest physicsSolvers discretizationMethods fieldSpecification linearAlgebra dataRepository events fileIO optionparser HDF5::HDF5 ) +set( dependencyList ${parallelDeps} physicsSolvers ) +set( tplDependencyList ${parallelDeps} gtest HDF5::HDF5 optionparser ) +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) # Add gtest C++ based tests foreach(test ${gtest_geosx_tests}) @@ -11,7 +14,7 @@ foreach(test ${gtest_geosx_tests}) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} ) diff --git a/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt b/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt index c10c31f429f..0d99a9b63ca 100644 --- a/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/virtualElementTests/CMakeLists.txt @@ -2,29 +2,13 @@ set( testSources testConformingVirtualElementOrder1.cpp ) -set( dependencyList ${parallelDeps} gtest ) +set( tplDependencyList ${parallelDeps} gtest ) -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) -endif() - -if (TARGET pugixml::pugixml) - list( APPEND dependencyList pugixml::pugixml ) -endif() +set( dependencyList mainInterface ) -if (TARGET pugixml) - list( APPEND dependencyList pugixml ) -endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) -if (TARGET fmt::fmt-header-only) - list( APPEND dependencyList fmt::fmt-header-only ) -endif() - -if (TARGET fmt) - list( APPEND dependencyList fmt ) -endif() # Add gtest C++ based tests foreach(test ${testSources}) @@ -32,7 +16,7 @@ foreach(test ${testSources}) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} ) diff --git a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt index de07f14b079..fab0a741e73 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt @@ -8,29 +8,12 @@ set( gtest_geosx_tests testWavePropagationAttenuation.cpp testWavePropagationAcousticFirstOrder.cpp ) -set( dependencyList ${parallelDeps} gtest ) +set( tplDependencyList ${parallelDeps} gtest ) -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) -endif() - -if (TARGET pugixml::pugixml) - list( APPEND dependencyList pugixml::pugixml ) -endif() - -if (TARGET pugixml) - list( APPEND dependencyList pugixml ) -endif() - -if (TARGET fmt::fmt-header-only) - list( APPEND dependencyList fmt::fmt-header-only ) -endif() +set( dependencyList mainInterface ) -if (TARGET fmt) - list( APPEND dependencyList fmt ) -endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) # Add gtest C++ based tests foreach(test ${gtest_geosx_tests}) @@ -38,7 +21,7 @@ foreach(test ${gtest_geosx_tests}) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) # Guard to prevent GCC (version 8) from giving warnings due # to some sort of possible conversion from int to long unsigned. diff --git a/src/coreComponents/unitTests/wellsTests/CMakeLists.txt b/src/coreComponents/unitTests/wellsTests/CMakeLists.txt index efdf46e9779..988582e06a6 100644 --- a/src/coreComponents/unitTests/wellsTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wellsTests/CMakeLists.txt @@ -3,37 +3,17 @@ set( gtest_geosx_tests testReservoirSinglePhaseMSWells.cpp testWellEnums.cpp ) -set( dependencyList ${parallelDeps} gtest ) +set( tplDependencyList ${parallelDeps} gtest ) -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ${parallelDeps} HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} ${parallelDeps} HDF5::HDF5 ) -endif() +set( dependencyList mainInterface ) if( ENABLE_PVTPackage ) list( APPEND gtest_geosx_tests testReservoirCompositionalMultiphaseMSWells.cpp ) - - list( APPEND dependencyList PVTPackage ) -endif() - -if (TARGET pugixml::pugixml) - list( APPEND dependencyList pugixml::pugixml ) -endif() - -if (TARGET pugixml) - list( APPEND dependencyList pugixml ) -endif() - -if (TARGET fmt::fmt-header-only) - list( APPEND dependencyList fmt::fmt-header-only ) -endif() - -if (TARGET fmt) - list( APPEND dependencyList fmt ) endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) # Add gtest C++ based tests foreach(test ${gtest_geosx_tests}) get_filename_component( test_name ${test} NAME_WE ) @@ -41,7 +21,7 @@ foreach(test ${gtest_geosx_tests}) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} ) diff --git a/src/coreComponents/unitTests/xmlTests/CMakeLists.txt b/src/coreComponents/unitTests/xmlTests/CMakeLists.txt index 0a5a81b1d57..28d5cc772ae 100644 --- a/src/coreComponents/unitTests/xmlTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/xmlTests/CMakeLists.txt @@ -15,22 +15,12 @@ set( multi_files multifile_input/outputs.xml multifile_input/solver.xml ) -# Add gtest C++ based tests -set( dependencyList ${parallelDeps} gtest optionparser HDF5::HDF5 ) +set( tplDependencyList ${parallelDeps} gtest ) -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core HDF5::HDF5 ) -else() - list( APPEND dependencyList ${geosx_core_libs} HDF5::HDF5 ) -endif() +set( dependencyList mainInterface ) -if (TARGET pugixml::pugixml) - set( dependencyList ${dependencyList} pugixml::pugixml ) -endif() - -if (TARGET pugixml) - set( dependencyList ${dependencyList} pugixml ) -endif() +geos_decorate_link_dependencies( LIST decoratedDependencies + DEPENDENCIES ${dependencyList} ) # create test executables foreach(test ${gtest_geosx_tests} ${gtest_tests_with_input}) @@ -38,7 +28,7 @@ foreach(test ${gtest_geosx_tests} ${gtest_tests_with_input}) blt_add_executable( NAME ${test_name} SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} - DEPENDS_ON ${dependencyList} "-lz" ) + DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} "-lz" ) endforeach() # add tests that don't require input files diff --git a/src/docs/sphinx/userGuide/Index.rst b/src/docs/sphinx/userGuide/Index.rst index 12ee30367f1..66a3c60cf52 100644 --- a/src/docs/sphinx/userGuide/Index.rst +++ b/src/docs/sphinx/userGuide/Index.rst @@ -17,6 +17,8 @@ Welcome to the GEOS user guide. /coreComponents/constitutive/docs/Constitutive + /coreComponents/constitutiveDrivers/docs/ConstitutiveDrivers + /coreComponents/fieldSpecification/docs/FieldSpecification /coreComponents/events/docs/EventManager diff --git a/src/externalComponents/newComponentTemplate/src/CMakeLists.txt b/src/externalComponents/newComponentTemplate/src/CMakeLists.txt index ffc7fbb9552..e79d970d05c 100644 --- a/src/externalComponents/newComponentTemplate/src/CMakeLists.txt +++ b/src/externalComponents/newComponentTemplate/src/CMakeLists.txt @@ -9,11 +9,7 @@ set( componentSources NewComponent.cpp ) unset( dependencyList ) # Specify dependencies -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core) -else() - list( APPEND dependencyList ${geosx_core_libs} ) -endif() +list( APPEND dependencyList geosx_core) message("adding newComponentTemplate library") diff --git a/src/externalComponents/newComponentTemplate/tests/CMakeLists.txt b/src/externalComponents/newComponentTemplate/tests/CMakeLists.txt index b64bfbfe5b7..737c1fccebc 100644 --- a/src/externalComponents/newComponentTemplate/tests/CMakeLists.txt +++ b/src/externalComponents/newComponentTemplate/tests/CMakeLists.txt @@ -1,11 +1,7 @@ # Specify list of tests set( dependencyList gtest ) -if ( GEOS_BUILD_SHARED_LIBS ) - list( APPEND dependencyList geosx_core ) -else() - list( APPEND dependencyList ${geosx_core_libs} ) -endif() +list( APPEND dependencyList geosx_core ) set( newComponentTests testNewComponent.cpp ) diff --git a/src/pygeosx/CMakeLists.txt b/src/pygeosx/CMakeLists.txt index 9f03409ef48..74cd9dc4ba7 100644 --- a/src/pygeosx/CMakeLists.txt +++ b/src/pygeosx/CMakeLists.txt @@ -3,7 +3,7 @@ set( python_headers pygeosx.hpp ) set( python_sources pygeosx.cpp ) -set( dependencyList ${extraComponentsLinkList} ${externalComponentsLinkList} Python3::Python ) +set( dependencyList ${extraComponentsLinkList} ${externalComponentsLinkList} mainInterface Python3::Python ) blt_add_library( NAME pygeosx SOURCES ${python_sources} @@ -26,6 +26,7 @@ add_custom_command( TARGET pygeosx COMMAND ln -sf ${CMAKE_BINARY_DIR}/lib/pylvarray.so ${CMAKE_BINARY_DIR}/lib/PYGEOSX/lib/python${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR}/site-packages/ ) target_include_directories( pygeosx PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +target_include_directories( pygeosx PUBLIC ${CMAKE_BINARY_DIR}/include ) geosx_add_code_checks( PREFIX pygeosx ) From 540f60616e621625bc54b8bccf970494249c5c70 Mon Sep 17 00:00:00 2001 From: Jian Huang <53012159+jhuang2601@users.noreply.github.com> Date: Wed, 21 Aug 2024 17:54:38 -0500 Subject: [PATCH 166/286] fix pythons script for a tutorial example (#3284) --- .../faultMechanics/faultVerification/faultVerificationFigure.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/faultVerification/faultVerificationFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/faultVerification/faultVerificationFigure.py index 09e5db15f3d..03bd050a39f 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/faultVerification/faultVerificationFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/faultVerification/faultVerificationFigure.py @@ -25,7 +25,7 @@ def getHydromechanicalParametersFromXML(xmlFilePath): G = E / 2.0 / (1.0 + nu) hydromechanicalParameters["bulkModulus"] = K hydromechanicalParameters["shearModulus"] = G - Ks = float(param2.get("grainBulkModulus")) + Ks = float(param2.get("defaultGrainBulkModulus")) hydromechanicalParameters["biotCoefficient"] = 1.0 - K / Ks hydromechanicalParameters["porosity"] = float(param2.get("defaultReferencePorosity")) From ececf78bd7c5c395910530359dc27f3abf78ffbd Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 22 Aug 2024 11:19:29 -0500 Subject: [PATCH 167/286] refactor: Reuse computeSinglePhaseFlux (#3283) * Reuse computeSinglePhaseFlux * Update SinglePhaseFVMKernels.hpp --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../fluidFlow/SinglePhaseFVMKernels.hpp | 157 ++++-------------- 3 files changed, 33 insertions(+), 130 deletions(-) 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: '' 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) ====================== diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp index d2b6f0db263..5b6e76ef2d6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp @@ -37,6 +37,7 @@ #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "physicsSolvers/fluidFlow/FluxKernelsHelper.hpp" namespace geos { @@ -345,135 +346,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] )}; + + 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; @@ -487,7 +386,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 f6caac761d47035c575ecf4c41822ab21a6a523e Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:19:34 -0500 Subject: [PATCH 168/286] refactor: Use matrix-matrix interface in LAPACK solve (#3234) * Use matrix interface * uncrustify * Remove unrelated changes * Remove unncessesary assignment --------- Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .../functions/NegativeTwoPhaseFlash.hpp | 72 +++++++++---------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp index 96b2bdf5de4..83ba326ddfd 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -195,23 +195,21 @@ struct NegativeTwoPhaseFlash /** * @brief Solve the lineat system for the derivatives of the flash - * @param[in] A the coefficient matrix - * @param[in] b the rhs - * @param[out] x the solution + * @param[in/out] A the coefficient matrix. Destroyed after call + * @param[in/out] X the rhs and solution * @return @c true if the problem is well solved @c false otherwise */ + template< int USD > GEOS_HOST_DEVICE - static bool solveLinearSystem( arraySlice2d< real64 const > const & A, - arraySlice1d< real64 const > const & b, - arraySlice1d< real64 > const & x ) + static bool solveLinearSystem( arraySlice2d< real64, USD > const & A, + arraySlice2d< real64, USD > const & X ) { #if defined(GEOS_DEVICE_COMPILE) GEOS_UNUSED_VAR( A ); - GEOS_UNUSED_VAR( b ); - GEOS_UNUSED_VAR( x ); + GEOS_UNUSED_VAR( X ); return false; #else - BlasLapackLA::solveLinearSystem( A, b, x ); + BlasLapackLA::solveLinearSystem( A, X ); return true; #endif } @@ -432,12 +430,11 @@ void NegativeTwoPhaseFlash::computeDerivatives( constexpr integer maxNumVals = 2*MultiFluidConstants::MAX_NUM_COMPONENTS+1; integer const numVals = 2*numComps; - stackArray1d< real64, maxNumVals > b( numVals + 1 ); - stackArray1d< real64, maxNumVals > x( numVals + 1 ); - stackArray2d< real64, maxNumVals * maxNumVals > A( numVals + 1, numVals + 1 ); + StackArray< real64, 2, maxNumVals * maxNumVals, MatrixLayout::COL_MAJOR_PERM > A( numVals + 1, numVals + 1 ); + StackArray< real64, 2, maxNumVals * maxNumVals, MatrixLayout::COL_MAJOR_PERM > X( numVals + 1, numVals + 1 ); LvArray::forValuesInSlice( A.toSlice(), setZero ); - LvArray::forValuesInSlice( b.toSlice(), setZero ); + LvArray::forValuesInSlice( X.toSlice(), setZero ); for( integer ic = 0; ic < numComps; ++ic ) { @@ -469,45 +466,42 @@ void NegativeTwoPhaseFlash::computeDerivatives( A( e, xi ) = -1.0; A( e, yi ) = 1.0; } + // Pressure and temperature derivatives - for( integer const pc : {Deriv::dP, Deriv::dT} ) + for( integer ic = 0; ic < numComps; ++ic ) { - for( integer ic = 0; ic < numComps; ++ic ) - { - real64 const phiL = exp( logLiquidFugacity( ic ) ); - real64 const phiV = exp( logVapourFugacity( ic ) ); - b( ic ) = 0.0; - b( ic + numComps ) = -liquidComposition[ic] * phiL * logLiquidFugacityDerivs( ic, pc ) - + vapourComposition[ic] * phiV * logVapourFugacityDerivs( ic, pc ); - } - b( numVals ) = 0.0; - solveLinearSystem( A, b, x ); - for( integer ic = 0; ic < numComps; ++ic ) - { - liquidCompositionDerivs( ic, pc ) = x( ic ); - vapourCompositionDerivs( ic, pc ) = x( ic + numComps ); - } - vapourFractionDerivs( pc ) = x( numVals ); + real64 const phiL = -liquidComposition[ic] * exp( logLiquidFugacity( ic ) ); + real64 const phiV = vapourComposition[ic] * exp( logVapourFugacity( ic ) ); + X( ic + numComps, Deriv::dP ) = phiL * logLiquidFugacityDerivs( ic, Deriv::dP ) + + phiV * logVapourFugacityDerivs( ic, Deriv::dP ); + X( ic + numComps, Deriv::dT ) = phiL * logLiquidFugacityDerivs( ic, Deriv::dT ) + + phiV * logVapourFugacityDerivs( ic, Deriv::dT ); } + // Composition derivatives for( integer kc = 0; kc < numComps; ++kc ) { - integer const pc = Deriv::dC + kc; + integer const idof = Deriv::dC + kc; for( integer ic = 0; ic < numComps; ++ic ) { - b( ic ) = -composition[ic]; - b( ic + numComps ) = 0.0; + X( ic, idof ) = -composition[ic]; } - b( kc ) += 1.0; - b( numVals ) = 0.0; - solveLinearSystem( A, b, x ); + X( kc, idof ) += 1.0; + } + + // Solve linear system + solveLinearSystem( A.toSlice(), X.toSlice() ); + + // Fill in the derivatives + for( integer idof = 0; idof < numDofs; ++idof ) + { for( integer ic = 0; ic < numComps; ++ic ) { - liquidCompositionDerivs( ic, pc ) = x( ic ); - vapourCompositionDerivs( ic, pc ) = x( ic + numComps ); + liquidCompositionDerivs( ic, idof ) = X( ic, idof ); + vapourCompositionDerivs( ic, idof ) = X( ic + numComps, idof ); } - vapourFractionDerivs( pc ) = x( numVals ); + vapourFractionDerivs( idof ) = X( numVals, idof ); } } } From a3e4a5138257d97c9a10d117e67a77654ab14f1d Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Mon, 26 Aug 2024 13:07:35 -0500 Subject: [PATCH 169/286] feat: Use stability test in flash (#3206) --- .../constitutive/CMakeLists.txt | 2 + .../docs/CompositionalMultiphaseFluid.rst | 71 ++ .../CompositionalMultiphaseFluid.cpp | 2 + .../functions/KValueInitialization.hpp | 33 - .../functions/NegativeTwoPhaseFlash.hpp | 23 +- .../compositional/functions/StabilityTest.hpp | 100 +-- .../compositional/models/CriticalVolume.cpp | 92 +++ .../compositional/models/CriticalVolume.hpp | 74 ++ .../compositional/models/EquationOfState.hpp | 10 +- .../models/LohrenzBrayClarkViscosity.cpp | 48 +- .../models/LohrenzBrayClarkViscosity.hpp | 19 +- .../compositional/models/ModelParameters.hpp | 2 + .../models/NegativeTwoPhaseFlashModel.cpp | 34 +- .../models/NegativeTwoPhaseFlashModel.hpp | 137 +++- .../testLohrenzBrayClarkViscosity.cpp | 4 +- .../unitTests/testStabilityTest2Comp.cpp | 8 +- .../unitTests/testStabilityTest9Comp.cpp | 720 +++++++++--------- .../docs/CompositionalTwoPhaseFluid.rst | 1 + src/coreComponents/schema/schema.xsd | 2 + .../constitutiveTests/CMakeLists.txt | 1 + .../testMultiFluidCompositionalMultiphase.cpp | 249 ++++++ 21 files changed, 1049 insertions(+), 583 deletions(-) create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.cpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.hpp create mode 100644 src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphase.cpp diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index ce9e3c62778..c4defea6888 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -74,6 +74,7 @@ set( constitutive_headers fluid/multifluid/compositional/models/ComponentProperties.hpp fluid/multifluid/compositional/models/CompositionalDensity.hpp fluid/multifluid/compositional/models/ConstantViscosity.hpp + fluid/multifluid/compositional/models/CriticalVolume.hpp fluid/multifluid/compositional/models/EquationOfState.hpp fluid/multifluid/compositional/models/FunctionBase.hpp fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp @@ -218,6 +219,7 @@ set( constitutive_sources fluid/multifluid/CO2Brine/functions/WaterDensity.cpp fluid/multifluid/compositional/models/CompositionalDensity.cpp fluid/multifluid/compositional/models/ConstantViscosity.cpp + fluid/multifluid/compositional/models/CriticalVolume.cpp fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp diff --git a/src/coreComponents/constitutive/docs/CompositionalMultiphaseFluid.rst b/src/coreComponents/constitutive/docs/CompositionalMultiphaseFluid.rst index 74f1b80ea41..bd6874e7066 100644 --- a/src/coreComponents/constitutive/docs/CompositionalMultiphaseFluid.rst +++ b/src/coreComponents/constitutive/docs/CompositionalMultiphaseFluid.rst @@ -119,6 +119,77 @@ where :math:`V_{ci}` and :math:`T_{ci}` are respectively the critical volume and :math:`i`. This is compared to the current temperature :math:`T` such that if :math:`T_{cp}::deliverClone( str Group * const parent ) const { std::unique_ptr< ConstitutiveBase > clone = MultiFluidBase::deliverClone( name, parent ); + CompositionalMultiphaseFluid & newFluid = dynamicCast< CompositionalMultiphaseFluid & >( *clone ); + newFluid.createModels(); return clone; } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp index 59d50b60eba..c2d8d0bde19 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp @@ -64,39 +64,6 @@ struct KValueInitialization } } - /** - * @brief Calculate gas-liquid k-values near the convergence pressure - * @param[in] numComps number of components - * @param[in] pressure pressure - * @param[in] temperature temperature - * @param[in] componentProperties The compositional component properties - * @param[out] kValues the calculated k-values - **/ - template< integer USD > - GEOS_HOST_DEVICE - GEOS_FORCE_INLINE - static void - computeConstantLiquidKvalue( integer const numComps, - real64 const pressure, - real64 const temperature, - ComponentProperties::KernelWrapper const & componentProperties, - arraySlice1d< real64, USD > const & kValues ) - { - GEOS_UNUSED_VAR( pressure, temperature ); - arrayView1d< real64 const > const & criticalPressure = componentProperties.m_componentCriticalPressure; - real64 averagePressure = 0.0; // Average pressure - for( integer ic = 0; ic < numComps; ++ic ) - { - averagePressure += criticalPressure[ic]; - } - averagePressure /= numComps; - constexpr real64 kValueGap = 0.01; - for( integer ic = 0; ic < numComps; ++ic ) - { - kValues[ic] = criticalPressure[ic] < averagePressure ? 1.0/(1.0 + kValueGap) : 1.0/(1.0 - kValueGap); - } - } - /** * @brief Calculate water-gas k-value * @param[in] pressure pressure diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp index 83ba326ddfd..4dc15279c60 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -257,9 +257,6 @@ bool NegativeTwoPhaseFlash::compute( integer const numComps, } } - bool kValueReset = true; - constexpr real64 boundsTolerance = 1.0e-3; - if( needInitialisation ) { KValueInitialization::computeWilsonGasLiquidKvalue( numComps, @@ -271,8 +268,6 @@ bool NegativeTwoPhaseFlash::compute( integer const numComps, auto const presentComponents = componentIndices.toSliceConst(); - real64 const initialVapourFraction = RachfordRice::solve( kVapourLiquid.toSliceConst(), composition, presentComponents ); - bool converged = false; for( localIndex iterationCount = 0; iterationCount < MultiFluidConstants::maxSSIIterations; ++iterationCount ) { @@ -301,23 +296,9 @@ bool NegativeTwoPhaseFlash::compute( integer const numComps, } // Update K-values - if( (vapourPhaseMoleFraction < -boundsTolerance || 1.0-vapourPhaseMoleFraction < -boundsTolerance) - && 0.2 < LvArray::math::abs( vapourPhaseMoleFraction-initialVapourFraction ) - && !kValueReset ) - { - KValueInitialization::computeConstantLiquidKvalue( numComps, - pressure, - temperature, - componentProperties, - kVapourLiquid ); - kValueReset = true; - } - else + for( integer ic = 0; ic < numComps; ++ic ) { - for( integer ic = 0; ic < numComps; ++ic ) - { - kVapourLiquid[ic] *= exp( fugacityRatios[ic] ); - } + kVapourLiquid[ic] *= exp( fugacityRatios[ic] ); } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp index d322a3a993d..22a1485f5f7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp @@ -52,7 +52,7 @@ struct StabilityTest * @param[out] kValues the k-values estimated from the stationary points * @return a flag indicating that 2 stationary points have been found */ - template< integer USD1 > + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE static bool compute( integer const numComps, real64 const pressure, @@ -61,25 +61,23 @@ struct StabilityTest ComponentProperties::KernelWrapper const & componentProperties, EquationOfStateType const & equationOfState, real64 & tangentPlaneDistance, - arraySlice1d< real64 > const & kValues ) + arraySlice1d< real64, USD2 > const & kValues ) { constexpr integer numTrials = 2; // Trial compositions - stackArray1d< real64, maxNumComps > logFugacity( numComps ); - stackArray1d< real64, maxNumComps > normalizedComposition( numComps ); - stackArray2d< real64, numTrials *maxNumComps > trialComposition( numTrials, numComps ); - stackArray1d< real64, maxNumComps > logTrialComposition( numComps ); - stackArray1d< real64, maxNumComps > hyperplane( numComps ); // h-parameter + stackArray2d< real64, 4*maxNumComps > workSpace( 4, numComps ); + arraySlice1d< real64 > logFugacity = workSpace[0]; + arraySlice1d< real64 > normalizedComposition = workSpace[1]; + arraySlice1d< real64 > logTrialComposition = workSpace[2]; + arraySlice1d< real64 > hyperplane = workSpace[3]; // h-parameter stackArray1d< integer, maxNumComps > availableComponents( numComps ); calculatePresentComponents( numComps, composition, availableComponents ); auto const presentComponents = availableComponents.toSliceConst(); + LvArray::forValuesInSlice( workSpace.toSlice(), []( real64 & a ){ a = 0.0; } ); + // Calculate the hyperplane parameter // h_i = log( z_i ) + log( phi_i ) - for( integer ic = 0; ic < numComps; ++ic ) - { - hyperplane[ic] = 0.0; - } FugacityCalculator::computeLogFugacity( numComps, pressure, temperature, @@ -99,43 +97,21 @@ struct StabilityTest componentProperties, kValues ); - for( integer ic = 0; ic < numComps; ++ic ) - { - trialComposition( 0, ic ) = composition[ic] / kValues[ic]; - trialComposition( 1, ic ) = composition[ic] * kValues[ic]; - } - - integer numberOfStationaryPoints = 0; tangentPlaneDistance = LvArray::NumericLimits< real64 >::max; for( integer trialIndex = 0; trialIndex < numTrials; ++trialIndex ) { - for( integer ic = 0; ic < numComps; ++ic ) - { - normalizedComposition[ic] = trialComposition( trialIndex, ic ); - } - normalizeComposition( numComps, normalizedComposition.toSlice() ); - - FugacityCalculator::computeLogFugacity( numComps, - pressure, - temperature, - normalizedComposition.toSliceConst(), - componentProperties, - equationOfState, - logFugacity ); + // Initialise next sample + real64 const alpha = static_cast< real64 >(trialIndex)/(numTrials-1); for( integer const ic : presentComponents ) { - logTrialComposition[ic] = LvArray::math::log( trialComposition( trialIndex, ic ) ); + normalizedComposition[ic] = composition[ic]*(alpha * kValues[ic] + (1.0 - alpha) / kValues[ic]); + logTrialComposition[ic] = LvArray::math::log( normalizedComposition[ic] ); } + for( localIndex iterationCount = 0; iterationCount < MultiFluidConstants::maxSSIIterations; ++iterationCount ) { - for( integer const ic : presentComponents ) - { - logTrialComposition[ic] = hyperplane[ic] - logFugacity[ic]; - trialComposition( trialIndex, ic ) = LvArray::math::exp( logTrialComposition[ic] ); - normalizedComposition[ic] = trialComposition( trialIndex, ic ); - } - normalizeComposition( numComps, normalizedComposition.toSlice() ); - + // Normalise the composition and calculate the fugacity + real64 const totalMoles = normalizeComposition( numComps, normalizedComposition ); FugacityCalculator::computeLogFugacity( numComps, pressure, temperature, @@ -144,6 +120,22 @@ struct StabilityTest equationOfState, logFugacity ); + // Calculate the TPD + real64 tpd = 0.0; + for( integer const ic : presentComponents ) + { + tpd += composition[ic] + totalMoles * normalizedComposition[ic] * (logTrialComposition[ic] + logFugacity[ic] - hyperplane[ic] - 1.0); + } + if( tpd < tangentPlaneDistance ) + { + tangentPlaneDistance = tpd; + } + if( tangentPlaneDistance < -MultiFluidConstants::fugacityTolerance ) + { + break; + } + + // Check stationarity real64 error = 0.0; for( integer const ic : presentComponents ) { @@ -151,32 +143,24 @@ struct StabilityTest error += (dG*dG); } error = LvArray::math::sqrt( error ); - if( error < MultiFluidConstants::fugacityTolerance ) { - // Calculate modified tangent plane distance (Michelsen, 1982b) of trial composition relative to input composition - real64 tpd = 1.0; - for( integer const ic : presentComponents ) - { - tpd += trialComposition( trialIndex, ic ) * (logTrialComposition[ic] + logFugacity[ic] - hyperplane[ic] - 1.0); - } - if( tpd < tangentPlaneDistance ) - { - tangentPlaneDistance = tpd; - } - numberOfStationaryPoints++; break; } + + // Update to next step + for( integer const ic : presentComponents ) + { + logTrialComposition[ic] = hyperplane[ic] - logFugacity[ic]; + normalizedComposition[ic] = LvArray::math::exp( logTrialComposition[ic] ); + } } - } - if( numberOfStationaryPoints == numTrials ) - { - for( integer const ic : presentComponents ) + if( tangentPlaneDistance < -MultiFluidConstants::fugacityTolerance ) { - kValues[ic] = trialComposition( 1, ic ) / trialComposition( 0, ic ); + break; } } - return numberOfStationaryPoints == numTrials; + return true; } private: diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.cpp new file mode 100644 index 00000000000..e62ddefe077 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.cpp @@ -0,0 +1,92 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file CriticalVolume.cpp + */ + +#include "CriticalVolume.hpp" +#include "ComponentProperties.hpp" + +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +CriticalVolume::CriticalVolume( std::unique_ptr< ModelParameters > parameters ): + ModelParameters( std::move( parameters ) ) +{} + +std::unique_ptr< ModelParameters > CriticalVolume::create( std::unique_ptr< ModelParameters > parameters ) +{ + if( parameters && parameters->get< CriticalVolume >() != nullptr ) + { + return parameters; + } + return std::make_unique< CriticalVolume >( std::move( parameters ) ); +} + +void CriticalVolume::registerParametersImpl( MultiFluidBase * fluid ) +{ + fluid->registerWrapper( viewKeyStruct::componentCriticalVolumeString(), &m_componentCriticalVolume ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDescription( "Component critical volumes" ); +} + +void CriticalVolume::postInputInitializationImpl( MultiFluidBase const * fluid, + ComponentProperties const & componentProperties ) +{ + integer const numComponents = fluid->numFluidComponents(); + + if( m_componentCriticalVolume.empty() ) + { + m_componentCriticalVolume.resize( numComponents ); + + arrayView1d< real64 > const & componentCriticalPressure = componentProperties.getComponentCriticalPressure(); + arrayView1d< real64 > const & componentCriticalTemperature = componentProperties.getComponentCriticalTemperature(); + + calculateCriticalVolume( numComponents, + componentCriticalPressure, + componentCriticalTemperature, + m_componentCriticalVolume ); + } + + GEOS_THROW_IF_NE_MSG( m_componentCriticalVolume.size(), numComponents, + GEOS_FMT( "{}: invalid number of values in attribute '{}'", fluid->getFullName(), + viewKeyStruct::componentCriticalVolumeString() ), + InputError ); +} + +void CriticalVolume::calculateCriticalVolume( integer const numComponents, + arrayView1d< const real64 > const criticalPressure, + arrayView1d< const real64 > const criticalTemperature, + arrayView1d< real64 > const criticalVolume ) +{ + for( integer ic=0; ic parameters ); + ~CriticalVolume() override = default; + + static std::unique_ptr< ModelParameters > create( std::unique_ptr< ModelParameters > parameters ); + + array1d< real64 > m_componentCriticalVolume; + +protected: + void registerParametersImpl( MultiFluidBase * fluid ) override; + + void postInputInitializationImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) override; + + struct viewKeyStruct + { + static constexpr char const * componentCriticalVolumeString() { return "componentCriticalVolume"; } + }; + + /** + * @brief Estimate critical volumes using Ihmels' (2010) correlation + * @details reference: http://dx.doi.org/10.1021/je100167w + * @param[in] numComponents The number of components + * @param[in] criticalPressure The component critical pressures + * @param[in] criticalTemperature The component critical temperatures + * @param[in] criticalVolume The component critical volumes + */ + static void calculateCriticalVolume( integer const numComponents, + arrayView1d< const real64 > const criticalPressure, + arrayView1d< const real64 > const criticalTemperature, + arrayView1d< real64 > const criticalVolume ); +}; + +} // end namespace compositional + +} // end namespace constitutive + +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_CRITICALVOLUME_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp index 40ba0fb80a3..f9a08804ba7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp @@ -62,6 +62,11 @@ class EquationOfState : public ModelParameters return std::make_unique< EquationOfState >( std::move( parameters ) ); } + struct viewKeyStruct + { + static constexpr char const * equationsOfStateString() { return "equationsOfState"; } + }; + string_array m_equationsOfStateNames; protected: @@ -90,11 +95,6 @@ class EquationOfState : public ModelParameters EnumStrings< EquationOfStateType >::fromString( eos ); } } - - struct viewKeyStruct - { - static constexpr char const * equationsOfStateString() { return "equationsOfState"; } - }; }; } // end namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp index ff353033d20..39583fc6e36 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp @@ -18,6 +18,7 @@ */ #include "LohrenzBrayClarkViscosity.hpp" +#include "CriticalVolume.hpp" #include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/MultiFluidConstants.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" @@ -42,7 +43,7 @@ LohrenzBrayClarkViscosity::LohrenzBrayClarkViscosity( string const & name, integer const phaseIndex, ModelParameters const & modelParameters ): FunctionBase( name, componentProperties ), - m_parameters( modelParameters.get< Parameters >() ) + m_parameters( modelParameters ) { GEOS_UNUSED_VAR( phaseIndex ); } @@ -50,8 +51,10 @@ LohrenzBrayClarkViscosity::LohrenzBrayClarkViscosity( string const & name, LohrenzBrayClarkViscosity::KernelWrapper LohrenzBrayClarkViscosity::createKernelWrapper() const { - auto const mixingType = EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::fromString( m_parameters->m_componentMixingType ); - return KernelWrapper( mixingType, m_parameters->m_componentCriticalVolume ); + Parameters const * parameters = m_parameters.get< Parameters >(); + CriticalVolume const * criticalVolume = m_parameters.get< CriticalVolume >(); + auto const mixingType = EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::fromString( parameters->m_componentMixingType ); + return KernelWrapper( mixingType, criticalVolume->m_componentCriticalVolume ); } std::unique_ptr< ModelParameters > @@ -61,7 +64,7 @@ LohrenzBrayClarkViscosity::createParameters( std::unique_ptr< ModelParameters > { return parameters; } - return std::make_unique< Parameters >( std::move( parameters ) ); + return std::make_unique< Parameters >( CriticalVolume::create( std::move( parameters )) ); } LohrenzBrayClarkViscosity::Parameters::Parameters( std::unique_ptr< ModelParameters > parameters ): @@ -73,10 +76,6 @@ LohrenzBrayClarkViscosity::Parameters::Parameters( std::unique_ptr< ModelParamet void LohrenzBrayClarkViscosity::Parameters::registerParametersImpl( MultiFluidBase * fluid ) { - fluid->registerWrapper( viewKeyStruct::componentCriticalVolumeString(), &m_componentCriticalVolume ). - setInputFlag( dataRepository::InputFlags::OPTIONAL ). - setDescription( "Component critical volumes" ); - fluid->registerWrapper( viewKeyStruct::componentMixingTypeString(), &m_componentMixingType ). setInputFlag( dataRepository::InputFlags::OPTIONAL ). setApplyDefaultValue( m_componentMixingType ). @@ -87,42 +86,11 @@ void LohrenzBrayClarkViscosity::Parameters::registerParametersImpl( MultiFluidBa void LohrenzBrayClarkViscosity::Parameters::postInputInitializationImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) { - integer const numComponents = fluid->numFluidComponents(); - - if( m_componentCriticalVolume.empty() ) - { - m_componentCriticalVolume.resize( numComponents ); - - arrayView1d< real64 > const & componentCriticalPressure = componentProperties.getComponentCriticalPressure(); - arrayView1d< real64 > const & componentCriticalTemperature = componentProperties.getComponentCriticalTemperature(); - - calculateCriticalVolume( numComponents, - componentCriticalPressure, - componentCriticalTemperature, - m_componentCriticalVolume ); - } - - GEOS_THROW_IF_NE_MSG( m_componentCriticalVolume.size(), numComponents, - GEOS_FMT( "{}: invalid number of values in attribute '{}'", fluid->getFullName(), - viewKeyStruct::componentCriticalVolumeString() ), - InputError ); - + GEOS_UNUSED_VAR( fluid, componentProperties ); // If the value is invalid, this will throw EnumStrings< LohrenzBrayClarkViscosityUpdate::MixingType >::fromString( m_componentMixingType ); } -void LohrenzBrayClarkViscosity::Parameters::calculateCriticalVolume( - integer const numComponents, - arrayView1d< const real64 > const criticalPressure, - arrayView1d< const real64 > const criticalTemperature, - arrayView1d< real64 > const criticalVolume ) -{ - for( integer ic=0; ic m_componentCriticalVolume; private: void registerParametersImpl( MultiFluidBase * fluid ) override; @@ -304,29 +305,15 @@ class LohrenzBrayClarkViscosity : public FunctionBase struct viewKeyStruct { - static constexpr char const * componentCriticalVolumeString() { return "componentCriticalVolume"; } static constexpr char const * componentMixingTypeString() { return "viscosityMixingRule"; } }; - - /** - * @brief Estimate critical volumes using Ihmels' (2010) correlation - * @details reference: http://dx.doi.org/10.1021/je100167w - * @param[in] numComponents The number of components - * @param[in] criticalPressure The component critical pressures - * @param[in] criticalTemperature The component critical temperatures - * @param[in] criticalVolume The component critical volumes - */ - static void calculateCriticalVolume( integer const numComponents, - arrayView1d< const real64 > const criticalPressure, - arrayView1d< const real64 > const criticalTemperature, - arrayView1d< real64 > const criticalVolume ); }; // Create parameters unique to this model static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ); private: - Parameters const * m_parameters{}; + ModelParameters const & m_parameters; }; /// Declare strings associated with enumeration values. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp index 498f35810a2..268b7ec250a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp @@ -20,6 +20,8 @@ #ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_MODELPARAMETERS_HPP_ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_MODELPARAMETERS_HPP_ +#include "common/GeosxMacros.hpp" + namespace geos { diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp index 0ba841e2e44..8959823b9a4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp @@ -18,6 +18,8 @@ */ #include "NegativeTwoPhaseFlashModel.hpp" +#include "EquationOfState.hpp" +#include "CriticalVolume.hpp" namespace geos { @@ -37,19 +39,27 @@ string NegativeTwoPhaseFlashModel::catalogName() NegativeTwoPhaseFlashModel::NegativeTwoPhaseFlashModel( string const & name, ComponentProperties const & componentProperties, ModelParameters const & modelParameters ): - FunctionBase( name, componentProperties ) -{ - m_parameters = modelParameters.get< EquationOfState >(); -} + FunctionBase( name, componentProperties ), + m_parameters( modelParameters ) +{} NegativeTwoPhaseFlashModel::KernelWrapper NegativeTwoPhaseFlashModel::createKernelWrapper() const { constexpr integer liquidIndex = 0; constexpr integer vapourIndex = 1; - EquationOfStateType const liquidEos = EnumStrings< EquationOfStateType >::fromString( m_parameters->m_equationsOfStateNames[liquidIndex] ); - EquationOfStateType const vapourEos = EnumStrings< EquationOfStateType >::fromString( m_parameters->m_equationsOfStateNames[vapourIndex] ); - return KernelWrapper( m_componentProperties.getNumberOfComponents(), liquidIndex, vapourIndex, liquidEos, vapourEos ); + EquationOfState const * equationOfState = m_parameters.get< EquationOfState >(); + EquationOfStateType const liquidEos = EnumStrings< EquationOfStateType >::fromString( equationOfState->m_equationsOfStateNames[liquidIndex] ); + EquationOfStateType const vapourEos = EnumStrings< EquationOfStateType >::fromString( equationOfState->m_equationsOfStateNames[vapourIndex] ); + + CriticalVolume const * criticalVolume = m_parameters.get< CriticalVolume >(); + + return KernelWrapper( m_componentProperties.getNumberOfComponents(), + liquidIndex, + vapourIndex, + liquidEos, + vapourEos, + criticalVolume->m_componentCriticalVolume ); } NegativeTwoPhaseFlashModelUpdate::NegativeTwoPhaseFlashModelUpdate( @@ -57,18 +67,22 @@ NegativeTwoPhaseFlashModelUpdate::NegativeTwoPhaseFlashModelUpdate( integer const liquidIndex, integer const vapourIndex, EquationOfStateType const liquidEos, - EquationOfStateType const vapourEos ): + EquationOfStateType const vapourEos, + arrayView1d< real64 const > const componentCriticalVolume ): m_numComponents( numComponents ), m_liquidIndex( liquidIndex ), m_vapourIndex( vapourIndex ), m_liquidEos( liquidEos ), - m_vapourEos( vapourEos ) + m_vapourEos( vapourEos ), + m_componentCriticalVolume( componentCriticalVolume ) {} std::unique_ptr< ModelParameters > NegativeTwoPhaseFlashModel::createParameters( std::unique_ptr< ModelParameters > parameters ) { - return EquationOfState::create( std::move( parameters ) ); + std::unique_ptr< ModelParameters > params = EquationOfState::create( std::move( parameters ) ); + params = CriticalVolume::create( std::move( params ) ); + return params; } } // end namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp index ec5c1423f4d..3ebb34c0a86 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -25,6 +25,7 @@ #include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" +#include "constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp" #include "constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp" namespace geos @@ -36,20 +37,23 @@ namespace constitutive namespace compositional { -class EquationOfState; +class ModelParameters; class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate { public: - using PhaseProp = MultiFluidVar< real64, 3, constitutive::multifluid::LAYOUT_PHASE, constitutive::multifluid::LAYOUT_PHASE_DC >; using PhaseComp = MultiFluidVar< real64, 4, constitutive::multifluid::LAYOUT_PHASE_COMP, constitutive::multifluid::LAYOUT_PHASE_COMP_DC >; + using Deriv = constitutive::multifluid::DerivativeOffset; + + static constexpr real64 stabilityTolerance = MultiFluidConstants::fugacityTolerance; NegativeTwoPhaseFlashModelUpdate( integer const numComponents, integer const liquidIndex, integer const vapourIndex, EquationOfStateType const liquidEos, - EquationOfStateType const vapourEos ); + EquationOfStateType const vapourEos, + arrayView1d< real64 const > const componentCriticalVolume ); // Mark as a 2-phase flash GEOS_HOST_DEVICE @@ -67,36 +71,73 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate { integer const numDofs = 2 + m_numComponents; - // Iterative solve to converge flash - bool const flashStatus = NegativeTwoPhaseFlash::compute( m_numComponents, - pressure, - temperature, - compFraction, - componentProperties, - m_liquidEos, - m_vapourEos, - kValues, - phaseFraction.value[m_vapourIndex], - phaseCompFraction.value[m_liquidIndex], - phaseCompFraction.value[m_vapourIndex] ); - GEOS_ERROR_IF( !flashStatus, - GEOS_FMT( "Negative two phase flash failed to converge at pressure {:.5e} and temperature {:.3f}", - pressure, temperature )); - - // Calculate derivatives - NegativeTwoPhaseFlash::computeDerivatives( m_numComponents, - pressure, - temperature, - compFraction, - componentProperties, - m_liquidEos, - m_vapourEos, - phaseFraction.value[m_vapourIndex], - phaseCompFraction.value[m_liquidIndex].toSliceConst(), - phaseCompFraction.value[m_vapourIndex].toSliceConst(), - phaseFraction.derivs[m_vapourIndex], - phaseCompFraction.derivs[m_liquidIndex], - phaseCompFraction.derivs[m_vapourIndex] ); + // Perform stability test to check that we have 2 phases + real64 tangentPlaneDistance = 0.0; + bool const stabilityStatus = StabilityTest::compute( m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + m_liquidEos, + tangentPlaneDistance, + kValues[0] ); + GEOS_ERROR_IF( !stabilityStatus, + GEOS_FMT( "Stability test failed at pressure {:.5e} and temperature {:.3f}", pressure, temperature )); + + if( tangentPlaneDistance < -stabilityTolerance ) + { + // Unstable mixture + // Iterative solve to converge flash + bool const flashStatus = NegativeTwoPhaseFlash::compute( m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + m_liquidEos, + m_vapourEos, + kValues, + phaseFraction.value[m_vapourIndex], + phaseCompFraction.value[m_liquidIndex], + phaseCompFraction.value[m_vapourIndex] ); + + GEOS_ERROR_IF( !flashStatus, + GEOS_FMT( "Negative two phase flash failed to converge at pressure {:.5e} and temperature {:.3f}", + pressure, temperature )); + + // Calculate derivatives + NegativeTwoPhaseFlash::computeDerivatives( m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + m_liquidEos, + m_vapourEos, + phaseFraction.value[m_vapourIndex], + phaseCompFraction.value[m_liquidIndex].toSliceConst(), + phaseCompFraction.value[m_vapourIndex].toSliceConst(), + phaseFraction.derivs[m_vapourIndex], + phaseCompFraction.derivs[m_liquidIndex], + phaseCompFraction.derivs[m_vapourIndex] ); + } + else + { + // Stable mixture - simply label + calculateLiCorrelation( componentProperties, + temperature, + compFraction, + phaseFraction.value[m_vapourIndex] ); + + LvArray::forValuesInSlice( phaseFraction.derivs[m_vapourIndex], setZero ); + LvArray::forValuesInSlice( phaseCompFraction.derivs[m_liquidIndex], setZero ); + LvArray::forValuesInSlice( phaseCompFraction.derivs[m_vapourIndex], setZero ); + for( integer ic = 0; ic < m_numComponents; ++ic ) + { + phaseCompFraction.value( m_vapourIndex, ic ) = compFraction[ic]; + phaseCompFraction.value( m_liquidIndex, ic ) = compFraction[ic]; + phaseCompFraction.derivs( m_vapourIndex, ic, Deriv::dC + ic ) = 1.0; + phaseCompFraction.derivs( m_liquidIndex, ic, Deriv::dC + ic ) = 1.0; + } + } // Complete by calculating liquid phase fraction phaseFraction.value[m_liquidIndex] = 1.0 - phaseFraction.value[m_vapourIndex]; @@ -106,12 +147,40 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate } } + template< int USD > + GEOS_HOST_DEVICE + void calculateLiCorrelation( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & temperature, + arraySlice1d< real64 const, USD > const & composition, + real64 & vapourFraction ) const + { + real64 sumVz = 0.0; + real64 sumVzt = 0.0; + arrayView1d< real64 const > const & criticalTemperature = componentProperties.m_componentCriticalTemperature; + for( integer ic = 0; ic < m_numComponents; ++ic ) + { + real64 const Vz = m_componentCriticalVolume[ic] * composition[ic]; + sumVz += Vz; + sumVzt += Vz * criticalTemperature[ic]; + } + real64 const pseudoCritTemperature = sumVzt / sumVz; + if( pseudoCritTemperature < temperature ) + { + vapourFraction = 1.0; + } + else + { + vapourFraction = 0.0; + } + } + private: integer const m_numComponents; integer const m_liquidIndex; integer const m_vapourIndex; EquationOfStateType const m_liquidEos; EquationOfStateType const m_vapourEos; + arrayView1d< real64 const > const m_componentCriticalVolume; }; class NegativeTwoPhaseFlashModel : public FunctionBase @@ -141,7 +210,7 @@ class NegativeTwoPhaseFlashModel : public FunctionBase static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ); private: - EquationOfState const * m_parameters{}; + ModelParameters const & m_parameters; }; } // end namespace compositional diff --git a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp index 1d332dd2e62..1f0ae08873b 100644 --- a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp @@ -15,8 +15,8 @@ // Source includes #include "codingUtilities/UnitTestUtilities.hpp" -#include "constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp" #include "constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp" +#include "constitutive/fluid/multifluid/compositional/models/CriticalVolume.hpp" #include "constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp" #include "TestFluid.hpp" #include "TestFluidUtilities.hpp" @@ -72,7 +72,7 @@ class LohrenzBrayClarkViscosityTestFixture : public ::testing::TestWithParam< V m_parameters = CompositionalDensity::createParameters( std::make_unique< ModelParameters >() ); m_parameters = LohrenzBrayClarkViscosity::createParameters( std::move( m_parameters ) ); - auto * parameters = const_cast< LohrenzBrayClarkViscosity::Parameters * >(m_parameters->get< LohrenzBrayClarkViscosity::Parameters >()); + auto * parameters = const_cast< CriticalVolume * >(m_parameters->get< CriticalVolume >()); parameters->m_componentCriticalVolume.resize( NC ); TestFluid< 9 >::populateArray( parameters->m_componentCriticalVolume, this->m_fluid->criticalVolume ); diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp index f0d0d6c2161..839e7181859 100644 --- a/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp @@ -118,8 +118,8 @@ INSTANTIATE_TEST_SUITE_P( ::testing::Values( StabilityData{ 1.00000e+06, 297.15, 0.2, 1.1102230e-16 }, StabilityData{ 1.00000e+06, 353.15, 0.2, -2.2204460e-16 }, - StabilityData{ 5.00000e+06, 297.15, 0.2, -1.0438517e+00 }, - StabilityData{ 5.00000e+06, 353.15, 0.2, -2.0228439e-03 }, + StabilityData{ 5.00000e+06, 297.15, 0.2, -1.0160710e+00 }, + StabilityData{ 5.00000e+06, 353.15, 0.2, -1.4627298e-03 }, StabilityData{ 2.00000e+07, 297.15, 0.2, -3.3306691e-16 }, StabilityData{ 2.00000e+07, 353.15, 0.2, -6.6613381e-16 } ) @@ -130,8 +130,8 @@ INSTANTIATE_TEST_SUITE_P( ::testing::Values( StabilityData{ 1.00000e+06, 297.15, 0.2, -2.2204460e-16 }, StabilityData{ 1.00000e+06, 353.15, 0.2, -3.3306691e-16 }, - StabilityData{ 5.00000e+06, 297.15, 0.2, -1.0966021e+00 }, - StabilityData{ 5.00000e+06, 353.15, 0.2, -3.6652014e-03 }, + StabilityData{ 5.00000e+06, 297.15, 0.2, -1.0780446e+00 }, + StabilityData{ 5.00000e+06, 353.15, 0.2, -3.1421339e-03 }, StabilityData{ 2.00000e+07, 297.15, 0.2, -2.4424907e-15 }, StabilityData{ 2.00000e+07, 353.15, 0.2, -7.7715612e-16 } ) diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp index b36366f9261..e312ac186b9 100644 --- a/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp @@ -199,66 +199,66 @@ TEST_P( SoaveRedlichKwong, testStabilityWithFlash ) INSTANTIATE_TEST_SUITE_P( StabilityTest, PengRobinson, ::testing::Values( - FlashData(1.0e+05, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.668360e+03), - FlashData(1.0e+05, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.245873e+03), - FlashData(1.0e+05, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.881300e+01), - FlashData(1.0e+05, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.448854e+00), - FlashData(1.0e+05, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 0.000000e+00), - FlashData(1.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.507053e+00), - FlashData(1.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.731470e+00), - FlashData(1.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.384422e+02), - FlashData(1.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.459664e+01), - FlashData(1.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.775558e-17), - FlashData(5.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.004630e-01), - FlashData(5.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.575407e-01), - FlashData(5.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.677416e-01), - FlashData(5.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.922930e+00), - FlashData(5.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.455769e-03), - FlashData(1.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.477463e-01), - FlashData(1.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.779360e-01), - FlashData(1.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.512251e-01), - FlashData(1.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.680029e-01), - FlashData(1.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.019289e-02), - FlashData(5.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.304512e-15), - FlashData(5.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -4.440892e-16), - FlashData(5.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.436896e-16), - FlashData(5.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.220446e-16), - FlashData(5.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -4.996004e-16), - FlashData(1.0e+08, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.082467e-15), - FlashData(1.0e+08, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.415534e-15), - FlashData(1.0e+08, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.582068e-15), - FlashData(1.0e+08, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 3.608225e-16), - FlashData(1.0e+08, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.942890e-16), - FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.667936e+03), - FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.245689e+03), - FlashData(1.0e+05, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.881008e+01), - FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.448537e+00), - FlashData(1.0e+05, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 0.000000e+00), - FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.445375e+00), - FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.673207e+00), - FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.382509e+02), - FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.457261e+01), - FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 0.000000e+00), - FlashData(5.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -8.873231e-01), - FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.449008e-01), - FlashData(5.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.617734e-01), - FlashData(5.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.846717e+00), - FlashData(5.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -4.736791e-03), - FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.414763e-01), - FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.717543e-01), - FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.468894e-01), - FlashData(1.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.660116e-01), - FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.931470e-02), - FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.359224e-15), - FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 4.996004e-16), - FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.054712e-15), - FlashData(5.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.165734e-15), - FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 8.326673e-17), - FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.913536e-15), - FlashData(1.0e+08, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.137979e-15), - FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 5.273559e-16), - FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.275957e-15), - FlashData(1.0e+08, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 6.383782e-16), + FlashData(1.0e+05, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.654557e+03), + FlashData(1.0e+05, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -8.451746e+02), + FlashData(1.0e+05, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.648191e+01), + FlashData(1.0e+05, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.373702e+00), + FlashData(1.0e+05, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.862294e-16), + FlashData(1.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.805742e-04), + FlashData(1.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.731794e-03), + FlashData(1.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.307138e+02), + FlashData(1.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.249650e+01), + FlashData(1.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.695692e-16), + FlashData(5.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -7.864345e-06), + FlashData(5.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.661303e-05), + FlashData(5.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -7.751816e-02), + FlashData(5.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.922828e+00), + FlashData(5.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.133069e-03), + FlashData(1.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.468194e-01), + FlashData(1.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.220020e-01), + FlashData(1.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.940155e-03), + FlashData(1.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.633758e-02), + FlashData(1.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.432557e-03), + FlashData(5.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.555613e-15), + FlashData(5.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.189698e-16), + FlashData(5.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.824334e-16), + FlashData(5.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.014082e-16), + FlashData(5.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -7.242471e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.409965e-15), + FlashData(1.0e+08, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.459838e-15), + FlashData(1.0e+08, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.031795e-15), + FlashData(1.0e+08, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -4.224052e-16), + FlashData(1.0e+08, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.127570e-17), + FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.654444e+03), + FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -8.451167e+02), + FlashData(1.0e+05, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.648008e+01), + FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.373450e+00), + FlashData(1.0e+05, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.353084e-16), + FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.937707e-04), + FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.529252e-03), + FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.304552e+02), + FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.246200e+01), + FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.498002e-16), + FlashData(5.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.584882e-05), + FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.710689e-05), + FlashData(5.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -7.513597e-02), + FlashData(5.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.846606e+00), + FlashData(5.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.388927e-03), + FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.436556e-01), + FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.200479e-01), + FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.516862e-03), + FlashData(1.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.407883e-02), + FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -8.400914e-03), + FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.453834e-15), + FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 1.543904e-16), + FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.550044e-16), + FlashData(5.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.092077e-15), + FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.786765e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -4.206704e-15), + FlashData(1.0e+08, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.204834e-15), + FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 4.354156e-16), + FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.236059e-15), + FlashData(1.0e+08, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.765422e-17), FlashData(1.0e+05, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+05, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+05, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), @@ -266,215 +266,215 @@ INSTANTIATE_TEST_SUITE_P( FlashData(1.0e+05, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+06, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+06, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+06, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 3.330669e-16), + FlashData(1.0e+06, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+06, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+06, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+06, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440892e-16), + FlashData(5.0e+06, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(5.0e+06, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+06, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), - FlashData(5.0e+06, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(5.0e+06, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(5.0e+06, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), - FlashData(1.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.332268e-15), + FlashData(1.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+07, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+07, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+07, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), - FlashData(5.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), - FlashData(5.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.776357e-15), - FlashData(5.0e+07, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), - FlashData(5.0e+07, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 3.330669e-16), - FlashData(5.0e+07, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), - FlashData(1.0e+08, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 4.440892e-16), - FlashData(1.0e+08, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 4.440892e-16), - FlashData(1.0e+08, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(1.0e+08, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(1.0e+07, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+08, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+08, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+08, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+08, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+08, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -5.329071e-15), - FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 7.105427e-15), - FlashData(1.0e+05, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -8.881784e-16), - FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), + FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(1.0e+05, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), - FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), - FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 3.552714e-15), - FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -3.552714e-15), - FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), - FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -8.881784e-16), + FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(5.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), - FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -5.329071e-15), + FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(5.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(5.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(5.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), - FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 3.552714e-15), - FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -5.329071e-15), - FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(1.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), - FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.332268e-15), - FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 5.329071e-15), - FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), - FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(5.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), - FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 4.440892e-16), - FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 5.329071e-15), + FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(1.0e+08, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), - FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), - FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), + FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(1.0e+08, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), - FlashData(1.0e+05, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+05, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), FlashData(1.0e+05, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+05, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), FlashData(1.0e+05, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), FlashData(1.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), FlashData(1.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(1.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440892e-16), - FlashData(1.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), - FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), - FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.775558e-16), - FlashData(5.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.775558e-16), - FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(1.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), - FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.326673e-16), - FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 3.330669e-16), - FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), - FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.881784e-16), - FlashData(1.0e+08, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-16), - FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 7.771561e-16), - FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+05, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.704736e+01), - FlashData(1.0e+05, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.003960e+01), - FlashData(1.0e+05, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.110182e+01), - FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.167750e+01), - FlashData(1.0e+05, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.110223e-16), - FlashData(1.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -9.425147e-01), - FlashData(1.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.253370e+00), - FlashData(1.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.421698e+00), + FlashData(1.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.775558e-16), + FlashData(1.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.996004e-16), + FlashData(1.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), + FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.775558e-16), + FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.330669e-16), + FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), + FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), + FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.996004e-16), + FlashData(1.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), + FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), + FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.165734e-15), + FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), + FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), + FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), + FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.054712e-15), + FlashData(1.0e+08, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.665335e-16), + FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-16), + FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), + FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), + FlashData(1.0e+05, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.574938e+01), + FlashData(1.0e+05, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.788764e+01), + FlashData(1.0e+05, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.980440e+01), + FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.152737e+01), + FlashData(1.0e+05, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 5.551115e-17), + FlashData(1.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -8.611610e-01), + FlashData(1.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.103151e+00), + FlashData(1.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.526750e+00), FlashData(1.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.845663e+00), FlashData(1.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -5.551115e-17), - FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.332268e-15), - FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.110223e-15), - FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -9.882070e-02), - FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.113573e-01), - FlashData(5.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.077533e-01), - FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.275158e-15), - FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-16), - FlashData(1.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 3.996803e-15), - FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.110223e-16), - FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.205757e-02), - FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 2.609024e-15), - FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.054712e-15), - FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.720046e-15), - FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.554312e-15), - FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.665335e-16), - FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.998401e-15), - FlashData(1.0e+08, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.720046e-15), - FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.276756e-15), - FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-16), - FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -6.661338e-16), - FlashData(1.0e+05, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+05, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+05, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+05, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+05, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), - FlashData(1.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 0.000000e+00), + FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.996004e-16), + FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -9.882069e-02), + FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.113572e-01), + FlashData(5.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -6.662307e-02), + FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.609024e-15), + FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.831069e-15), + FlashData(1.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 8.881784e-16), + FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.776357e-15), + FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.536058e-02), + FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.665335e-16), + FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 9.436896e-16), + FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.609024e-15), + FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -5.551115e-17), + FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-16), + FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.831868e-15), + FlashData(1.0e+08, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.608225e-15), + FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-16), + FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 2.164935e-15), + FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -9.992007e-16), + FlashData(1.0e+05, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110206e-16), + FlashData(1.0e+05, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110206e-16), + FlashData(1.0e+05, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 3.388132e-21), + FlashData(1.0e+05, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 3.388132e-21), + FlashData(1.0e+05, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110189e-16), + FlashData(1.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.098348e-16), + FlashData(1.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.103430e-16), + FlashData(1.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.694066e-21), + FlashData(1.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.330449e-16), FlashData(1.0e+06, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(5.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), - FlashData(5.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(5.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(5.0e+06, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(1.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), - FlashData(1.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), - FlashData(1.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), - FlashData(1.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -6.661338e-16), - FlashData(5.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), - FlashData(5.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.330669e-16), - FlashData(5.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+08, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), - FlashData(1.0e+08, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.881784e-16), - FlashData(1.0e+08, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(1.0e+08, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.330669e-16), - FlashData(1.0e+08, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16) + FlashData(5.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110189e-16), + FlashData(5.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.254148e-16), + FlashData(5.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.218888e-16), + FlashData(5.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220412e-16), + FlashData(5.0e+06, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110189e-16), + FlashData(1.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.259383e-17), + FlashData(1.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.032879e-20), + FlashData(1.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110189e-16), + FlashData(1.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.694066e-21), + FlashData(1.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220429e-16), + FlashData(5.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220599e-16), + FlashData(5.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.266076e-16), + FlashData(5.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220463e-16), + FlashData(5.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440858e-16), + FlashData(5.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.111900e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220463e-16), + FlashData(1.0e+08, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.925937e-16), + FlashData(1.0e+08, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.198447e-16), + FlashData(1.0e+08, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.541336e-16), + FlashData(1.0e+08, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.223851e-16) ) ); INSTANTIATE_TEST_SUITE_P( StabilityTest, SoaveRedlichKwong, ::testing::Values( - FlashData(1.0e+05, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.340952e+03), - FlashData(1.0e+05, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.523837e+03), - FlashData(1.0e+05, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.181331e+01), - FlashData(1.0e+05, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.678230e+00), - FlashData(1.0e+05, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.775558e-17), - FlashData(1.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.676592e+00), - FlashData(1.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.892215e+00), - FlashData(1.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.543862e+02), - FlashData(1.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.627522e+01), - FlashData(1.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 0.000000e+00), - FlashData(5.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.322679e-01), - FlashData(5.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.886802e-01), - FlashData(5.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.004309e+00), - FlashData(5.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.584734e+00), - FlashData(5.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.238911e-02), - FlashData(1.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.605851e-01), - FlashData(1.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.907913e-01), - FlashData(1.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.671620e-01), - FlashData(1.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.904301e-01), - FlashData(1.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.614633e-02), - FlashData(5.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.273559e-16), - FlashData(5.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.159340e-16), - FlashData(5.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 8.326673e-17), - FlashData(5.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.081668e-15), - FlashData(5.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.159340e-16), - FlashData(1.0e+08, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.110223e-15), - FlashData(1.0e+08, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.165734e-15), - FlashData(1.0e+08, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.551115e-16), - FlashData(1.0e+08, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 4.163336e-16), - FlashData(1.0e+08, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.383782e-16), - FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.340423e+03), - FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.523613e+03), - FlashData(1.0e+05, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.181013e+01), - FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.677900e+00), - FlashData(1.0e+05, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -8.326673e-17), - FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.611739e+00), - FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.831153e+00), - FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.541747e+02), - FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.624997e+01), - FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.551115e-17), - FlashData(5.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.183708e-01), - FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.753463e-01), - FlashData(5.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.976633e-01), - FlashData(5.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.515763e+00), - FlashData(5.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.164655e-02), - FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.538864e-01), - FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.842051e-01), - FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.624915e-01), - FlashData(1.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.880849e-01), - FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.514356e-02), - FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.415534e-15), - FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -7.494005e-16), - FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 9.159340e-16), - FlashData(5.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 9.436896e-16), - FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.942890e-16), - FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -7.771561e-16), - FlashData(1.0e+08, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 1.387779e-16), - FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.828671e-16), - FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 1.193490e-15), - FlashData(1.0e+08, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.942890e-16), + FlashData(1.0e+05, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.814994e+03), + FlashData(1.0e+05, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.241583e+02), + FlashData(1.0e+05, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.828694e+01), + FlashData(1.0e+05, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.557644e+00), + FlashData(1.0e+05, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.736526e-16), + FlashData(1.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.257797e-03), + FlashData(1.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.641615e-03), + FlashData(1.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.511074e+02), + FlashData(1.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.482449e+01), + FlashData(1.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.509209e-16), + FlashData(5.0e+06, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.708694e-05), + FlashData(5.0e+06, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.932987e-04), + FlashData(5.0e+06, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.840385e-02), + FlashData(5.0e+06, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.584587e+00), + FlashData(5.0e+06, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.029479e-02), + FlashData(1.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.674182e-01), + FlashData(1.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.444982e-01), + FlashData(1.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.201703e-03), + FlashData(1.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.402326e-02), + FlashData(1.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.715992e-02), + FlashData(5.0e+07, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.502339e-15), + FlashData(5.0e+07, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -8.907805e-16), + FlashData(5.0e+07, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.071532e-16), + FlashData(5.0e+07, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.840219e-16), + FlashData(5.0e+07, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.379446e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.673141e-15), + FlashData(1.0e+08, 2.9715e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -8.729996e-16), + FlashData(1.0e+08, 3.5315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 5.551115e-17), + FlashData(1.0e+08, 3.9315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 6.977925e-16), + FlashData(1.0e+08, 5.7315e+02, {0.00900, 0.00300, 0.53470, 0.11460, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.179612e-15), + FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.814881e+03), + FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -9.241007e+02), + FlashData(1.0e+05, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.828513e+01), + FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.557396e+00), + FlashData(1.0e+05, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.769418e-16), + FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.170713e-03), + FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.444682e-03), + FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.508509e+02), + FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.479052e+01), + FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.179612e-16), + FlashData(5.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.705802e-05), + FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.542653e-04), + FlashData(5.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.637320e-02), + FlashData(5.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.515601e+00), + FlashData(5.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.953021e-02), + FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.633584e-01), + FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.416234e-01), + FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -4.840113e-03), + FlashData(1.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -5.210515e-02), + FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.603198e-02), + FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -2.909131e-15), + FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.826664e-15), + FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 3.972517e-16), + FlashData(5.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -8.812395e-16), + FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -6.002143e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -3.093012e-15), + FlashData(1.0e+08, 2.9715e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -1.975850e-15), + FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 9.055257e-16), + FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, 8.396062e-16), + FlashData(1.0e+08, 5.7315e+02, {0.00000, 0.00000, 0.53770, 0.12360, 0.08790, 0.04560, 0.02090, 0.01510, 0.16920}, -4.961309e-16), FlashData(1.0e+05, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+05, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+05, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), @@ -485,146 +485,146 @@ INSTANTIATE_TEST_SUITE_P( FlashData(1.0e+06, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+06, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+06, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+06, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440892e-16), - FlashData(5.0e+06, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 4.440892e-16), + FlashData(5.0e+06, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(5.0e+06, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+06, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(5.0e+06, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(5.0e+06, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.881784e-16), - FlashData(1.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 8.881784e-16), - FlashData(1.0e+07, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 6.661338e-16), - FlashData(1.0e+07, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), + FlashData(1.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+07, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-15), - FlashData(5.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 4.440892e-16), - FlashData(5.0e+07, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440892e-16), + FlashData(5.0e+07, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+07, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(5.0e+07, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(5.0e+07, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+08, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 8.881784e-16), - FlashData(1.0e+08, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.776357e-15), - FlashData(1.0e+08, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -6.661338e-16), - FlashData(1.0e+08, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(1.0e+08, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), - FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), + FlashData(1.0e+08, 2.8815e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+08, 2.9715e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+08, 3.5315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+08, 3.9315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+08, 5.7315e+02, {1.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+05, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+05, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(1.0e+05, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), - FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 4.440892e-15), + FlashData(1.0e+05, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(1.0e+05, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), - FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -3.552714e-15), - FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), - FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -4.440892e-15), - FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 8.881784e-16), - FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -2.664535e-15), - FlashData(5.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.421085e-14), - FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -5.329071e-15), + FlashData(1.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+06, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+06, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(5.0e+06, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), - FlashData(5.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -8.881784e-16), - FlashData(5.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 8.881784e-16), - FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 8.881784e-15), - FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), - FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -1.776357e-15), - FlashData(1.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -8.881784e-16), - FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, -8.881784e-16), - FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 8.881784e-15), - FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 3.552714e-15), - FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), - FlashData(5.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), - FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 4.440892e-16), - FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 5.329071e-15), - FlashData(1.0e+08, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), - FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 1.776357e-15), - FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 8.881784e-16), + FlashData(5.0e+06, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+06, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+07, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+07, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+07, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(5.0e+07, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+08, 2.8815e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+08, 2.9715e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+08, 3.5315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), + FlashData(1.0e+08, 3.9315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(1.0e+08, 5.7315e+02, {0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 1.00000}, 0.000000e+00), FlashData(1.0e+05, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), - FlashData(1.0e+05, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 3.330669e-16), - FlashData(1.0e+05, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), + FlashData(1.0e+05, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.775558e-16), + FlashData(1.0e+05, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), + FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.775558e-16), FlashData(1.0e+05, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(1.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.665335e-16), FlashData(1.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), - FlashData(1.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), - FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), - FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.330669e-16), - FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110223e-16), + FlashData(1.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), + FlashData(1.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), + FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.775558e-16), + FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440892e-16), + FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), FlashData(5.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-16), - FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), + FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -6.106227e-16), + FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.885781e-16), FlashData(1.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), - FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -4.440892e-16), - FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.330669e-16), - FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.326673e-16), - FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.885781e-16), - FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), - FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-16), + FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.885781e-16), + FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), + FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -6.106227e-16), + FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -9.436896e-16), + FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -3.885781e-16), + FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), + FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), + FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 5.551115e-17), FlashData(1.0e+08, 2.9715e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-16), - FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.881784e-16), - FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), - FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -5.551115e-17), - FlashData(1.0e+05, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.685339e+01), - FlashData(1.0e+05, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.983114e+01), - FlashData(1.0e+05, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.069141e+01), - FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.232891e+01), + FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -9.436896e-16), + FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.665335e-16), + FlashData(1.0e+05, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.547585e+01), + FlashData(1.0e+05, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.757647e+01), + FlashData(1.0e+05, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.891242e+01), + FlashData(1.0e+05, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.206762e+01), FlashData(1.0e+05, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.220446e-16), - FlashData(1.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -9.169123e-01), - FlashData(1.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.225912e+00), - FlashData(1.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.372920e+00), + FlashData(1.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -8.275766e-01), + FlashData(1.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.064839e+00), + FlashData(1.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.425766e+00), FlashData(1.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.771453e+00), - FlashData(1.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.885781e-16), - FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 2.886580e-15), - FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 8.881784e-16), - FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -8.067043e-02), - FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.893772e-01), - FlashData(5.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.360564e-01), - FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.220446e-15), - FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.554312e-15), - FlashData(1.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-15), - FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 2.220446e-15), - FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.378407e-02), - FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.720046e-15), - FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.220446e-16), - FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.054712e-15), - FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -6.661338e-16), - FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 0.000000e+00), - FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.998401e-15), - FlashData(1.0e+08, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -6.106227e-16), - FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.720846e-15), - FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-16), - FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.330669e-16), - FlashData(1.0e+05, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+05, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+05, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+05, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+05, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+06, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(5.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(5.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+06, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(1.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(1.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(5.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(5.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220446e-16), - FlashData(5.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), - FlashData(5.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(5.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+08, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -6.661338e-16), - FlashData(1.0e+08, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 2.220446e-16), - FlashData(1.0e+08, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), - FlashData(1.0e+08, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00), - FlashData(1.0e+08, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 0.000000e+00) + FlashData(1.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.330669e-16), + FlashData(5.0e+06, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.052314e-15), + FlashData(5.0e+06, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.554312e-15), + FlashData(5.0e+06, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -8.067042e-02), + FlashData(5.0e+06, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.893771e-01), + FlashData(5.0e+06, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.938871e-02), + FlashData(1.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.552714e-15), + FlashData(1.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 1.831868e-15), + FlashData(1.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-16), + FlashData(1.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.110223e-16), + FlashData(1.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -3.809697e-02), + FlashData(5.0e+07, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.498801e-15), + FlashData(5.0e+07, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 3.608225e-15), + FlashData(5.0e+07, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, 3.053113e-15), + FlashData(5.0e+07, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.609823e-15), + FlashData(5.0e+07, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -5.551115e-17), + FlashData(1.0e+08, 2.8815e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.276756e-15), + FlashData(1.0e+08, 2.9715e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -2.886580e-15), + FlashData(1.0e+08, 3.5315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -8.326673e-16), + FlashData(1.0e+08, 3.9315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -1.720846e-15), + FlashData(1.0e+08, 5.7315e+02, {0.50000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.50000}, -4.440892e-16), + FlashData(1.0e+05, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220395e-16), + FlashData(1.0e+05, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110071e-16), + FlashData(1.0e+05, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110206e-16), + FlashData(1.0e+05, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110189e-16), + FlashData(1.0e+05, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110189e-16), + FlashData(1.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.206961e-16), + FlashData(1.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.108224e-16), + FlashData(1.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110240e-16), + FlashData(1.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -8.470329e-21), + FlashData(1.0e+06, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110223e-16), + FlashData(5.0e+06, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.706067e-16), + FlashData(5.0e+06, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110189e-16), + FlashData(5.0e+06, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110206e-16), + FlashData(5.0e+06, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.113577e-16), + FlashData(5.0e+06, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 3.388132e-21), + FlashData(1.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220412e-16), + FlashData(1.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.694066e-21), + FlashData(1.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110189e-16), + FlashData(1.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.192985e-16), + FlashData(1.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220429e-16), + FlashData(5.0e+07, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220243e-16), + FlashData(5.0e+07, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.524659e-20), + FlashData(5.0e+07, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110206e-16), + FlashData(5.0e+07, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.220260e-16), + FlashData(5.0e+07, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.108190e-16), + FlashData(1.0e+08, 2.8815e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -6.661135e-16), + FlashData(1.0e+08, 2.9715e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.110375e-16), + FlashData(1.0e+08, 3.5315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -2.995007e-16), + FlashData(1.0e+08, 3.9315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, 1.110240e-16), + FlashData(1.0e+08, 5.7315e+02, {0.00001, 0.00000, 0.99999, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000}, -1.105768e-16) ) ); diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst index e521b87e413..c4f2fe1194c 100644 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst +++ b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst @@ -8,6 +8,7 @@ componentAcentricFactor real64_array required Component acentric fact componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients componentCriticalPressure real64_array required Component critical pressures componentCriticalTemperature real64_array required Component critical temperatures +componentCriticalVolume real64_array {0} Component critical volumes componentMolarWeight real64_array required Component molar weights componentNames string_array required List of component names componentVolumeShift real64_array {0} Component volume shifts diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index f6bb47873ec..c8ffa3d8173 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -4500,6 +4500,8 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + diff --git a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt index b30a378c542..58336654eef 100644 --- a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt @@ -5,6 +5,7 @@ set( gtest_geosx_tests testCO2SpycherPruessModels.cpp testDamage.cpp testMultiFluidCO2Brine.cpp + testMultiFluidCompositionalMultiphase.cpp testMultiFluidDeadOil.cpp testMultiFluidLiveOil.cpp testRelPerm.cpp diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphase.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphase.cpp new file mode 100644 index 00000000000..3aa633cd190 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphase.cpp @@ -0,0 +1,249 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file testMultiFluidCompositionalMultiphase.cpp + */ + +#include "MultiFluidTest.hpp" +#include "constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp" +#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mainInterface/initialization.hpp" + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::testing; +using namespace geos::constitutive; +using namespace geos::constitutive::compositional; + +enum class VISCOSITY_TYPE : int { CONSTANT, LBC }; +ENUM_STRINGS( VISCOSITY_TYPE, "Constant", "LohrenzBrayClark" ); + +template< VISCOSITY_TYPE VISCOSITY > +struct Viscosity {}; + +template<> +struct Viscosity< VISCOSITY_TYPE::CONSTANT > +{ + using FluidType = CompositionalTwoPhaseConstantViscosity; +}; +template<> +struct Viscosity< VISCOSITY_TYPE::LBC > +{ + using FluidType = CompositionalTwoPhaseLohrenzBrayClarkViscosity; +}; + +template< typename FluidModel, integer NUM_COMP > +struct Fluid +{}; + +template< EquationOfStateType EOS, VISCOSITY_TYPE VISCOSITY, integer NUM_COMP > +class MultiFluidCompositionalMultiphaseTest : public MultiFluidTest< typename Viscosity< VISCOSITY >::FluidType, 2, NUM_COMP > +{ +public: + using FluidModel = typename Viscosity< VISCOSITY >::FluidType; + using Base = MultiFluidTest< FluidModel, 2, NUM_COMP >; + static constexpr real64 relTol = 1.0e-4; + static constexpr real64 absTol = 1.0e-4; +public: + MultiFluidCompositionalMultiphaseTest() + { + auto & parent = this->m_parent; + parent.resize( 1 ); + + string fluidName = GEOS_FMT( "fluid{}{}{}", + NUM_COMP, + EnumStrings< EquationOfStateType >::toString( EOS ), + EnumStrings< VISCOSITY_TYPE >::toString( VISCOSITY ) ); + this->m_model = makeFluid( fluidName, &parent ); + + parent.initialize(); + parent.initializePostInitialConditions(); + } + + ~MultiFluidCompositionalMultiphaseTest() override = default; + + void testNumericalDerivatives( const bool useMass ) + { + auto & fluid = this->getFluid(); + fluid.setMassFlag( useMass ); + + auto * parent = &(this->getParent()); + + array2d< real64 > samples; + Fluid< FluidModel, Base::numComp >::getSamples( samples ); + integer const sampleCount = samples.size( 0 ); + + real64 constexpr eps = 1.0e-6; + + constexpr real64 pressures[] = { 1.0e5, 50.0e5, 100.0e5, 600.0e5 }; + constexpr real64 temperatures[] = { 15.5, 24.0, 40.0, 80.0 }; + + for( integer sampleIndex = 0; sampleIndex < sampleCount; ++sampleIndex ) + { + for( real64 const pressure : pressures ) + { + for( real64 const temperature : temperatures ) + { + typename Base::TestData data ( pressure, units::convertCToK( temperature ), samples[sampleIndex].toSliceConst() ); + Base::testNumericalDerivatives( fluid, parent, data, eps, relTol, absTol ); + } + } + } + } + +private: + static FluidModel * makeFluid( string const & name, Group * parent ); +}; + +template< integer NUM_COMP > +static void fillBinaryCoeffs( array2d< real64 > & binaryCoeff, std::array< real64 const, NUM_COMP *(NUM_COMP-1)/2 > const data ) +{ + auto bic = data.begin(); + binaryCoeff.resize( NUM_COMP, NUM_COMP ); + for( integer i = 0; i < NUM_COMP; ++i ) + { + binaryCoeff( i, i ) = 0.0; + for( integer j = i+1; j < NUM_COMP; ++j ) + { + binaryCoeff( i, j ) = *bic++; + binaryCoeff( j, i ) = binaryCoeff( i, j ); + } + } +} + +template< typename FluidModel > +struct Fluid< FluidModel, 4 > +{ + static void fillProperties( Group & fluid ) + { + string_array & componentNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + fill< 4 >( componentNames, {"N2", "C10", "C20", "H20"} ); + + array1d< real64 > & molarWeight = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); + fill< 4 >( molarWeight, {28e-3, 134e-3, 275e-3, 18e-3} ); + + array1d< real64 > & criticalPressure = fluid.getReference< array1d< real64 > >( FluidModel::viewKeyStruct::componentCriticalPressureString() ); + fill< 4 >( criticalPressure, {34e5, 25.3e5, 14.6e5, 220.5e5} ); + array1d< real64 > & criticalTemperature = fluid.getReference< array1d< real64 > >( FluidModel::viewKeyStruct::componentCriticalTemperatureString() ); + fill< 4 >( criticalTemperature, {126.2, 622.0, 782.0, 647.0} ); + array1d< real64 > & acentricFactor = fluid.getReference< array1d< real64 > >( FluidModel::viewKeyStruct::componentAcentricFactorString() ); + fill< 4 >( acentricFactor, {0.04, 0.443, 0.816, 0.344} ); + array2d< real64 > & binaryCoeff = fluid.getReference< array2d< real64 > >( FluidModel::viewKeyStruct::componentBinaryCoeffString() ); + fillBinaryCoeffs< 4 >( binaryCoeff, {0.0, 0.1, 0.0, 0.0, 0.0, 0.0} ); + } + + static void getSamples( array2d< real64 > & samples ) + { + samples.resize( 3, 4 ); + fill< 4 >( samples[0], {0.099, 0.300, 0.600, 0.001} ); + fill< 4 >( samples[1], {0.350, 0.350, 0.200, 0.100} ); + fill< 4 >( samples[2], {0.000, 0.000, 0.000, 1.000} ); + } +}; + +template< typename FluidModel > +struct Fluid< FluidModel, 5 > +{ + static void fillProperties( Group & fluid ) + { + string_array & componentNames = fluid.getReference< string_array >( MultiFluidBase::viewKeyStruct::componentNamesString() ); + fill< 5 >( componentNames, {"CO2", "N2", "C1", "C2", "C4"} ); + + array1d< real64 > & molarWeight = fluid.getReference< array1d< real64 > >( MultiFluidBase::viewKeyStruct::componentMolarWeightString() ); + fill< 5 >( molarWeight, {44.0098e-3, 28.0135e-3, 16.0428e-3, 30.0700e-3, 82.4191e-3} ); + + array1d< real64 > & criticalPressure = fluid.getReference< array1d< real64 > >( FluidModel::viewKeyStruct::componentCriticalPressureString() ); + fill< 5 >( criticalPressure, {73.77300e5, 33.95800e5, 45.99200e5, 48.71800e5, 33.20710e5} ); + array1d< real64 > & criticalTemperature = fluid.getReference< array1d< real64 > >( FluidModel::viewKeyStruct::componentCriticalTemperatureString() ); + fill< 5 >( criticalTemperature, {304.1280, 126.1920, 190.5640, 305.3300, 504.2160} ); + array1d< real64 > & acentricFactor = fluid.getReference< array1d< real64 > >( FluidModel::viewKeyStruct::componentAcentricFactorString() ); + fill< 5 >( acentricFactor, {0.223000, 0.037200, 0.010400, 0.099100, 0.250274} ); + array1d< real64 > & volumeShift = fluid.getReference< array1d< real64 > >( FluidModel::viewKeyStruct::componentVolumeShiftString() ); + fill< 5 >( volumeShift, {1.845465e-01, -1.283880e-01, 9.225800e-02, 6.458060e-02, 0.000000e+00} ); + array2d< real64 > & binaryCoeff = fluid.getReference< array2d< real64 > >( FluidModel::viewKeyStruct::componentBinaryCoeffString() ); + fillBinaryCoeffs< 5 >( binaryCoeff, {0.0, 0.1, 0.03, 0.139, 0.032, 0.0, 0.12, 0.03, 0.0, 0.0} ); + } + + static void getSamples( array2d< real64 > & samples ) + { + samples.resize( 1, 5 ); + fill< 5 >( samples[0], {0.050, 0.150, 0.550, 0.150, 0.100} ); + } +}; +template< EquationOfStateType EOS, VISCOSITY_TYPE VISCOSITY, integer NUM_COMP > +typename MultiFluidCompositionalMultiphaseTest< EOS, VISCOSITY, NUM_COMP >::FluidModel * +MultiFluidCompositionalMultiphaseTest< EOS, VISCOSITY, NUM_COMP >:: +makeFluid( string const & name, Group * parent ) +{ + FluidModel & fluid = parent->registerGroup< FluidModel >( name ); + + string_array & phaseNames = fluid.template getReference< string_array >( MultiFluidBase::viewKeyStruct::phaseNamesString() ); + fill< 2 >( phaseNames, {"oil", "gas"} ); + + string const eosName = EnumStrings< EquationOfStateType >::toString( EOS ); + string_array & equationOfState = fluid.template getReference< string_array >( EquationOfState::viewKeyStruct::equationsOfStateString() ); + fill< 2 >( equationOfState, {eosName, eosName} ); + + Fluid< FluidModel, NUM_COMP >::fillProperties( fluid ); + + fluid.postInputInitializationRecursive(); + return &fluid; +} + +using PengRobinson4Test = MultiFluidCompositionalMultiphaseTest< EquationOfStateType::PengRobinson, VISCOSITY_TYPE::CONSTANT, 4 >; +using PengRobinsonLBC4Test = MultiFluidCompositionalMultiphaseTest< EquationOfStateType::PengRobinson, VISCOSITY_TYPE::LBC, 4 >; +using SoaveRedlichKwong4Test = MultiFluidCompositionalMultiphaseTest< EquationOfStateType::SoaveRedlichKwong, VISCOSITY_TYPE::CONSTANT, 4 >; +using SoaveRedlichKwongLBC4Test = MultiFluidCompositionalMultiphaseTest< EquationOfStateType::SoaveRedlichKwong, VISCOSITY_TYPE::LBC, 4 >; +TEST_F( PengRobinson4Test, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( PengRobinsonLBC4Test, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( SoaveRedlichKwong4Test, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( SoaveRedlichKwongLBC4Test, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} + +using PengRobinsonLBC5Test = MultiFluidCompositionalMultiphaseTest< EquationOfStateType::PengRobinson, VISCOSITY_TYPE::LBC, 5 >; +using SoaveRedlichKwongLBC5Test = MultiFluidCompositionalMultiphaseTest< EquationOfStateType::SoaveRedlichKwong, VISCOSITY_TYPE::LBC, 5 >; +TEST_F( PengRobinsonLBC5Test, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} +TEST_F( SoaveRedlichKwongLBC5Test, numericalDerivativesMolar ) +{ + testNumericalDerivatives( false ); +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + + geos::GeosxState state( geos::basicSetup( argc, argv ) ); + + int const result = RUN_ALL_TESTS(); + + geos::basicCleanup(); + + return result; +} From cbe9c5d77de926006a7c2f549b8911375af0d1d0 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:14:30 -0700 Subject: [PATCH 170/286] feat: Add kernel callable dense LA solvers for small systems. (#3287) --- .../denseLinearAlgebra/CMakeLists.txt | 1 + .../denseLinearAlgebra/denseLASolvers.hpp | 319 ++++++++++++++++++ .../unitTests/CMakeLists.txt | 3 +- .../unitTests/testDenseLASolvers.cpp | 219 ++++++++++++ .../unitTests/testUtils.hpp | 34 ++ 5 files changed, 575 insertions(+), 1 deletion(-) create mode 100644 src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp create mode 100644 src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp create mode 100644 src/coreComponents/denseLinearAlgebra/unitTests/testUtils.hpp diff --git a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt index 64a91cf1c70..5af9fc56f52 100644 --- a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt +++ b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt @@ -1,6 +1,7 @@ # Specify all headers set( denseLinearAlgebra_headers common/layouts.hpp + denseLASolvers.hpp interfaces/blaslapack/BlasLapackFunctions.h interfaces/blaslapack/BlasLapackLA.hpp ) diff --git a/src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp b/src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp new file mode 100644 index 00000000000..d45ae76accb --- /dev/null +++ b/src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp @@ -0,0 +1,319 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file denseLASolvers.hpp + */ +#ifndef GEOS_DENSELINEARALGEBRA_DENSELASOLVERS_HPP_ +#define GEOS_DENSELINEARALGEBRA_DENSELASOLVERS_HPP_ + +#include "common/DataTypes.hpp" +#include "denseLinearAlgebra/common/layouts.hpp" +#include "LvArray/src/tensorOps.hpp" +#include "common/logger/Logger.hpp" + +#include + +namespace geos +{ + +namespace denseLinearAlgebra +{ + +namespace details +{ + +constexpr real64 singularMatrixTolerance = 1e2*LvArray::NumericLimits< real64 >::epsilon; + +/** + * @brief Solves a 2x2 linear system A * x = b. + * + * This function solves a linear system of the form A * x = b, where A is a 2x2 matrix, + * b is a 2x1 vector, and x is the solution vector. The function checks the sizes + * of the inputs to ensure they conform to the expected dimensions. It also checks that + * the determinant of matrix A is not near zero to avoid solving a singular system. + * + * @tparam MATRIX_TYPE The type of the matrix A. Must support indexing with `A[i][j]`. + * @tparam RHS_TYPE The type of the right-hand side vector b. Must support indexing with `b[i]`. + * @tparam SOL_TYPE The type of the solution vector x. Must support indexing with `x[i]`. + * + * @param[in] A The 2x2 matrix representing the system of equations. Must have size 2x2. + * @param[in] b The 2-element vector representing the right-hand side of the equation. + * @param[out] x The 2-element vector that will store the solution to the system. + * @return bool that sepcifies whether the solve succeeded (1) or not (0). + */ +template< typename MATRIX_TYPE, + typename RHS_TYPE, + typename SOL_TYPE > +GEOS_HOST_DEVICE +inline +bool solveTwoByTwoSystem( MATRIX_TYPE const & A, RHS_TYPE const & b, SOL_TYPE && x ) +{ + LvArray::tensorOps::internal::checkSizes< 2, 2 >( A ); + LvArray::tensorOps::internal::checkSizes< 2 >( b ); + LvArray::tensorOps::internal::checkSizes< 2 >( x ); + + real64 const detA = LvArray::tensorOps::determinant< 2 >( A ); + + if( LvArray::math::abs( detA ) < singularMatrixTolerance ) + return false; + + real64 const invA = 1.0 / detA; + + x[0] = ( A[1][1] * b[0] - A[0][1] * b[1] ) * invA; + x[1] = ( A[0][0] * b[1] - A[1][0] * b[0] ) * invA; + + return true; +} + +/** + * @brief Solves a 3x3 linear system A * x = b. + * + * This function solves a linear system of the form A * x = b, where A is a 3x3 matrix, + * b is a 3x1 vector, and x is the solution vector. The function checks the sizes + * of the inputs to ensure they conform to the expected dimensions. It also checks that + * the determinant of matrix A is not near zero to avoid solving a singular system. + * + * @tparam MATRIX_TYPE The type of the matrix A. Must support indexing with `A[i][j]`. + * @tparam RHS_TYPE The type of the right-hand side vector b. Must support indexing with `b[i]`. + * @tparam SOL_TYPE The type of the solution vector x. Must support indexing with `x[i]`. + * + * @param[in] A The 3x3 matrix representing the system of equations. Must have size 3x3. + * @param[in] b The 3-element vector representing the right-hand side of the equation. + * @param[out] x The 3-element vector that will store the solution to the system. + * @return bool that sepcifies whether the solve succeeded (1) or not (0). + */ +template< typename MATRIX_TYPE, + typename RHS_TYPE, + typename SOL_TYPE > +GEOS_HOST_DEVICE +inline +bool solveThreeByThreeSystem( MATRIX_TYPE const & A, RHS_TYPE const & b, SOL_TYPE && x ) +{ + LvArray::tensorOps::internal::checkSizes< 3, 3 >( A ); + LvArray::tensorOps::internal::checkSizes< 3 >( b ); + LvArray::tensorOps::internal::checkSizes< 3 >( x ); + + real64 const detA = LvArray::tensorOps::determinant< 3 >( A ); + + if( LvArray::math::abs( detA ) < singularMatrixTolerance ) + return false; + + real64 const invA = 1.0 / detA; + + real64 const detX0 = b[0] * ( A[1][1] * A[2][2] - A[2][1] * A[1][2] ) - + b[1] * ( A[0][1] * A[2][2] - A[0][2] * A[2][1] ) + + b[2] * ( A[0][1] * A[1][2] - A[0][2] * A[1][1] ); + + real64 const detX1 = A[0][0] * ( b[1] * A[2][2] - b[2] * A[1][2] ) - + A[1][0] * ( b[0] * A[2][2] - b[2] * A[0][2] ) + + A[2][0] * ( b[0] * A[1][2] - b[1] * A[0][2] ); + + real64 const detX2 = A[0][0] * ( A[1][1] * b[2] - A[2][1] * b[1] ) - + A[1][0] * ( A[0][1] * b[2] - A[2][1] * b[0] ) + + A[2][0] * ( A[0][1] * b[1] - A[1][1] * b[0] ); + + x[0] = detX0 * invA; + x[1] = detX1 * invA; + x[2] = detX2 * invA; + + return true; +} + +/** + * @brief Solves a linear system where the matrix is upper triangular using back substitution. + * + * This function solves the linear system `Ax = b`, where `A` is an upper triangular matrix, using + * back substitution. The solution `x` is computed and stored in the provided output vector. + * + * @tparam N The size of the square matrix `A`. + * @tparam MATRIX_TYPE The type of the matrix `A`. + * @tparam RHS_TYPE The type of the right-hand side vector `b`. + * @tparam SOL_TYPE The type of the solution vector `x`. + * @param[in] A The upper triangular matrix representing the coefficients of the system. + * @param[in] b The right-hand side vector. It is used to compute the solution. + * @param[out] x The solution vector. The result of solving the system `Ax = b` using back substitution. + */ +template< std::ptrdiff_t N, + typename MATRIX_TYPE, + typename RHS_TYPE, + typename SOL_TYPE > +GEOS_HOST_DEVICE +inline +void solveUpperTriangularSystem( MATRIX_TYPE const & A, RHS_TYPE const & b, SOL_TYPE && x ) +{ + for( std::ptrdiff_t i = N - 1; i >= 0; --i ) + { + real64 sum = b[i]; + for( std::ptrdiff_t j = i + 1; j < N; ++j ) + { + sum -= A[i][j] * x[j]; + } + x[i] = sum / A[i][i]; + } +} + +/** + * @brief Solves a linear system using Gaussian elimination. + * + * This function performs Gaussian elimination on the given matrix `A` and right-hand side vector `b`. + * It transforms the matrix `A` boolo an upper triangular matrix and then solves for the solution `x` + * using back substitution. + * + * @tparam N The size of the square matrix `A`. + * @tparam MATRIX_TYPE The type of the matrix `A`. + * @tparam RHS_TYPE The type of the right-hand side vector `b`. + * @tparam SOL_TYPE The type of the solution vector `x`. + * @param[in,out] A The matrix to be transformed boolo an upper triangular matrix. Modified in place. + * @param[in,out] b The right-hand side vector. Modified in place to reflect the transformed system. + * @param[out] x The solution vector. The result of solving the system `Ax = b`. + * @return bool that sepcifies whether the solve succeeded (1) or not (0). + */ +template< std::ptrdiff_t N, + typename MATRIX_TYPE, + typename RHS_TYPE, + typename SOL_TYPE > +GEOS_HOST_DEVICE +inline +bool solveGaussianElimination( MATRIX_TYPE & A, RHS_TYPE & b, SOL_TYPE && x ) +{ + static_assert( N > 0, "N must be greater than 0." ); + LvArray::tensorOps::internal::checkSizes< N, N >( A ); + LvArray::tensorOps::internal::checkSizes< N >( b ); + LvArray::tensorOps::internal::checkSizes< N >( x ); + + // Step 1: Transform boolo an upper triangular matrix + + // 1.a. Find the pivot + for( std::ptrdiff_t i = 0; i < N; ++i ) + { + std::ptrdiff_t max_row = i; + for( std::ptrdiff_t k = i + 1; k < N; ++k ) + { + if( LvArray::math::abs( A[k][i] ) > LvArray::math::abs( A[max_row][i] )) + { + max_row = k; + } + } + + // 1.b. Swap rows + for( std::ptrdiff_t k = i; k < N; ++k ) + { + // std::swap( A[i][k], A[max_row][k] ); + real64 const temp = A[max_row][k]; + A[max_row][k] = A[i][k]; + A[i][k] = temp; + } + // std::swap( b[i], b[max_row] ); cannot be done on device + real64 const temp = b[i]; + b[i] = b[max_row]; + b[max_row] = temp; + + + if( LvArray::math::abs( A[i][i] ) < singularMatrixTolerance ) + return false; + + // 1.c Eliminate entries below the pivot + for( std::ptrdiff_t k = i + 1; k < N; ++k ) + { + real64 const scaling = A[k][i] / A[i][i]; + for( std::ptrdiff_t j = i; j < N; ++j ) + { + A[k][j] -= scaling * A[i][j]; + } + b[k] -= scaling * b[i]; + } + } + + // Step 2: Backward substitution + solveUpperTriangularSystem< N >( A, b, std::forward< SOL_TYPE >( x ) ); + + return true; +} + +} // details namespace + +/** + * @brief Solves a linear system using the most appropriate method based on the size of the system. + * + * This function determines the appropriate method for solving a linear system `Ax = b` based on + * the size of the matrix `A`. For 2x2 and 3x3 systems, specialized solvers are used. For larger systems, + * Gaussian elimination is employed. The matrix and the rhs are modified by the function. + * + * @tparam N The size of the square matrix `A`. + * @tparam MATRIX_TYPE The type of the matrix `A`. + * @tparam RHS_TYPE The type of the right-hand side vector `b`. + * @tparam SOL_TYPE The type of the solution vector `x`. + * @tparam MODIFY_MATRIX boolean flag indicating whether the input matrix `A` and vector `b` should be modified. + * If `1`, the matrix `A` and vector `b` are modified in place. If `0`, copies of + * `A` and `b` are made, and the original data is left unchanged. + * @param[in] A The matrix representing the coefficients of the system. + * @param[in] b The right-hand side vector. + * @param[out] x The solution vector. The result of solving the system `Ax = b`. + * @return bool that sepcifies whether the solve succeeded (1) or not (0). + */ +template< std::ptrdiff_t N, + typename MATRIX_TYPE, + typename RHS_TYPE, + typename SOL_TYPE, + bool MODIFY_MATRIX = 1 > +GEOS_HOST_DEVICE +inline +bool solve( MATRIX_TYPE & A, RHS_TYPE & b, SOL_TYPE && x ) +{ + static_assert( N > 0, "N must be greater than 0." ); + static_assert( N < 10, "N cannot be larger than 9" ); + LvArray::tensorOps::internal::checkSizes< N, N >( A ); + LvArray::tensorOps::internal::checkSizes< N >( b ); + LvArray::tensorOps::internal::checkSizes< N >( x ); + + if constexpr ( N == 2 ) + { + return details::solveTwoByTwoSystem( A, b, std::forward< SOL_TYPE >( x ) ); + } + else if constexpr ( N == 3 ) + { + return details::solveThreeByThreeSystem( A, b, std::forward< SOL_TYPE >( x ) ); + } + else + { + if constexpr ( MODIFY_MATRIX ) + { + return details::solveGaussianElimination< N >( A, b, std::forward< SOL_TYPE >( x ) ); + } + else + { + real64 A_copy[N][N]{}; + real64 b_copy[N]{}; + + for( std::ptrdiff_t i=0; i < N; ++i ) + { + b_copy[i] = b[i]; + for( std::ptrdiff_t j=0; j < N; ++j ) + { + A_copy[i][j] = A[i][j]; + } + } + return details::solveGaussianElimination< N >( A_copy, b_copy, std::forward< SOL_TYPE >( x ) ); + } + } +} + +} // denseLinearAlgebra + +} // geos + + +#endif /*GEOS_DENSELINEARALGEBRA_DENSELASOLVERS_HPP_*/ diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/CMakeLists.txt b/src/coreComponents/denseLinearAlgebra/unitTests/CMakeLists.txt index 114dee90aac..5334abc1acb 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/CMakeLists.txt +++ b/src/coreComponents/denseLinearAlgebra/unitTests/CMakeLists.txt @@ -1,6 +1,7 @@ set( serial_tests testBlasLapack.cpp - testSolveLinearSystem.cpp ) + testSolveLinearSystem.cpp + testDenseLASolvers.cpp ) set( dependencyList gtest denseLinearAlgebra ) diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp new file mode 100644 index 00000000000..6f8bbd08bbd --- /dev/null +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp @@ -0,0 +1,219 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "denseLinearAlgebra/denseLASolvers.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "testUtils.hpp" + +// TPL includes +#include + +#include + +namespace geos +{ +namespace denseLinearAlgebra +{ +namespace testing +{ + +constexpr real64 machinePrecision = 1.0e3 * LvArray::NumericLimits< real64 >::epsilon; + +template< std::ptrdiff_t N > +class LinearSystem +{ +public: + real64 matrix[N][N]; + real64 solution[N]; + real64 rhs[N]; +}; + +template< std::ptrdiff_t N > +class InvertibleLinearSystem : public LinearSystem< N > +{ +public: + using LinearSystem< N >::matrix; + using LinearSystem< N >::solution; + using LinearSystem< N >::rhs; + + InvertibleLinearSystem( short int seed ) + { + std::mt19937 generator( seed ); + std::uniform_real_distribution< real64 > distribution( -10.0, 10.0 ); + std::uniform_real_distribution< real64 > perturbation( -20.0, 20.0 ); + for( ptrdiff_t i=0; i +class SingularLinearSystem : public LinearSystem< N > +{ +public: + using LinearSystem< N >::matrix; + using LinearSystem< N >::solution; + using LinearSystem< N >::rhs; + + SingularLinearSystem( short int seed ) + { + std::mt19937 generator( seed ); + std::uniform_real_distribution< real64 > distribution( -10.0, 10.0 ); + for( ptrdiff_t i=0; i +class DenseLinearSolverTest : public ::testing::Test +{ +public: + + static constexpr std::ptrdiff_t size = N::value; + + DenseLinearSolverTest() = default; + ~DenseLinearSolverTest() override = default; + + void test_solve() + { + InvertibleLinearSystem< size > LS( 2024 ); + + // GEOS_UNUSED_VAR(LS); + + forAll< parallelDevicePolicy<> >( 1, [=] GEOS_HOST_DEVICE ( int ) + { + real64 sol[size]{}; + real64 matrix[size][size]{}; + real64 rhs[size]{}; + + LvArray::tensorOps::copy< size, size >( matrix, LS.matrix ); + LvArray::tensorOps::copy< size >( rhs, LS.rhs ); + bool const success = denseLinearAlgebra::solve< size >( matrix, rhs, sol ); + + PORTABLE_EXPECT_TRUE( success ); + + for( std::ptrdiff_t i = 0; i < size; ++i ) + { + PORTABLE_EXPECT_NEAR( sol[i], + LS.solution[i], + machinePrecision ); + } + } ); + } + void test_singularSystem() + { + SingularLinearSystem< size > LS( 2024 ); + + forAll< parallelDevicePolicy<> >( 1, [=] GEOS_HOST_DEVICE ( int ) + { + + real64 sol[size]{}; + real64 matrix[size][size]{}; + real64 rhs[size]{}; + + LvArray::tensorOps::copy< size, size >( matrix, LS.matrix ); + LvArray::tensorOps::copy< size >( rhs, LS.rhs ); + bool const success = denseLinearAlgebra::solve< size >( matrix, rhs, sol ); + + PORTABLE_EXPECT_FALSE( success ); + } ); + } + +}; + +using Dimensions = ::testing::Types< std::integral_constant< std::ptrdiff_t, 2 >, + std::integral_constant< std::ptrdiff_t, 3 >, + std::integral_constant< std::ptrdiff_t, 4 >, + std::integral_constant< std::ptrdiff_t, 5 >, + std::integral_constant< std::ptrdiff_t, 6 >, + std::integral_constant< std::ptrdiff_t, 7 >, + std::integral_constant< std::ptrdiff_t, 8 >, + std::integral_constant< std::ptrdiff_t, 9 > >; + + +class NameGenerator +{ +public: + template< typename T > + static std::string GetName( int ) + { + if constexpr (T::value == 2) return "TwoByTwo"; + if constexpr (T::value == 3) return "ThreeByThree"; + if constexpr (T::value == 4) return "FourByFour"; + if constexpr (T::value == 5) return "FiveByFive"; + if constexpr (T::value == 6) return "SixBySix"; + if constexpr (T::value == 7) return "SevenBySeven"; + if constexpr (T::value == 8) return "EightByEight"; + if constexpr (T::value == 9) return "NineByNine"; + } +}; + +TYPED_TEST_SUITE( DenseLinearSolverTest, Dimensions, NameGenerator ); + +TYPED_TEST( DenseLinearSolverTest, testDenseLA ) +{ + this->test_solve(); + this->test_singularSystem(); +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + int const result = RUN_ALL_TESTS(); + return result; +} + +} // testing + +} // denseLinearAlgebra + +} // namespace geos diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testUtils.hpp b/src/coreComponents/denseLinearAlgebra/unitTests/testUtils.hpp new file mode 100644 index 00000000000..17f093a569b --- /dev/null +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testUtils.hpp @@ -0,0 +1,34 @@ + +#include "common/GeosxMacros.hpp" + +// TPL includes +#include + + +namespace geos +{ +namespace denseLinearAlgebra +{ +namespace testing +{ + + +#if defined(GEOS_DEVICE_COMPILE) +#define PORTABLE_EXPECT_EQ( L, R ) GEOS_ERROR_IF_NE( L, R ) +#define PORTABLE_EXPECT_NEAR( L, R, EPSILON ) LVARRAY_ERROR_IF_GE_MSG( LvArray::math::abs( ( L ) -( R ) ), EPSILON, \ + STRINGIZE( L ) " = " << ( L ) << "\n" << STRINGIZE( R ) " = " << ( R ) ); +#define PORTABLE_EXPECT_TRUE( value ) GEOS_ERROR_IF( !value, "should be true" ) +#define PORTABLE_EXPECT_FALSE( value ) GEOS_ERROR_IF( value, "should be false" ) +#else +#define PORTABLE_EXPECT_EQ( L, R ) EXPECT_EQ( L, R ) +#define PORTABLE_EXPECT_NEAR( L, R, EPSILON ) EXPECT_LE( LvArray::math::abs( ( L ) -( R ) ), EPSILON ) << \ + STRINGIZE( L ) " = " << ( L ) << "\n" << STRINGIZE( R ) " = " << ( R ); +#define PORTABLE_EXPECT_TRUE( value ) EXPECT_TRUE( value ) +#define PORTABLE_EXPECT_FALSE( value ) EXPECT_FALSE( value ) +#endif + +} //namespace testing + +} // namespace denseLinearAlgebra + +} // namespace geos From 42966e92f3cea9933dd6f02c427fc3e05413e80c Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Mon, 26 Aug 2024 17:48:11 -0700 Subject: [PATCH 171/286] feat: add log at the end of the timestep with substeps info. (#3303) --- .../physicsSolvers/SolverBase.cpp | 27 +++++++++++++++++++ .../physicsSolvers/SolverBase.hpp | 4 +++ 2 files changed, 31 insertions(+) diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index e970c3a76eb..1f943674963 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -21,6 +21,7 @@ #include "mesh/DomainPartition.hpp" #include "math/interpolation/Interpolation.hpp" #include "common/Timer.hpp" +#include "common/Units.hpp" #if defined(GEOS_USE_PYGEOSX) #include "python/PySolverType.hpp" @@ -251,6 +252,10 @@ bool SolverBase::execute( real64 const time_n, integer const maxSubSteps = m_nonlinearSolverParameters.m_maxSubSteps; + // Keep track of substeps. It is useful to output these. + std::vector< real64 > subStepDt( maxSubSteps, 0.0 ); + integer numOfSubSteps = 0; + for( integer subStep = 0; subStep < maxSubSteps && dtRemaining > 0.0; ++subStep ) { // reset number of nonlinear and linear iterations @@ -260,6 +265,8 @@ bool SolverBase::execute( real64 const time_n, nextDt, cycleNumber, domain ); + numOfSubSteps++; + subStepDt[subStep] = dtAccepted; // increment the cumulative number of nonlinear and linear iterations m_solverStatistics.saveTimeStepStatistics(); @@ -304,9 +311,29 @@ bool SolverBase::execute( real64 const time_n, // Decide what to do with the next Dt for the event running the solver. m_nextDt = setNextDt( nextDt, domain ); + logEndOfCycleInformation( cycleNumber, numOfSubSteps, subStepDt ); + return false; } +void SolverBase::logEndOfCycleInformation( integer const cycleNumber, + integer const numOfSubSteps, + std::vector< real64 > const & subStepDt ) const +{ + // The formating here is a work in progress. + GEOS_LOG_RANK_0( "\n------------------------- TIMESTEP END -------------------------" ); + GEOS_LOG_RANK_0( GEOS_FMT( " - Cycle: {}", cycleNumber ) ); + GEOS_LOG_RANK_0( GEOS_FMT( " - N substeps: {}", numOfSubSteps ) ); + std::string logMessage = " - dt:"; + for( integer i = 0; i < numOfSubSteps; ++i ) + { + logMessage += " " + units::TimeFormatInfo::fromSeconds( subStepDt[i] ).toString(); + } + // Log the complete message once + GEOS_LOG_RANK_0( logMessage ); + GEOS_LOG_RANK_0( "------------------------------------------------------------------\n" ); +} + real64 SolverBase::setNextDt( real64 const & currentDt, DomainPartition & domain ) { diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index b2f9b45d815..c135f3fda81 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -845,6 +845,10 @@ class SolverBase : public ExecutableGroup integer const cycleNumber, DomainPartition & domain ); + void logEndOfCycleInformation( integer const cycleNumber, + integer const numOfSubSteps, + std::vector< real64 > const & subStepDt ) const; + }; template< typename CONSTITUTIVE_BASE_TYPE > From 9019f15017e1e2cd0dd01bdce5367310555b9038 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 27 Aug 2024 12:37:44 -1000 Subject: [PATCH 172/286] add cmake install commands for component libraries (#3307) --- src/coreComponents/codingUtilities/CMakeLists.txt | 2 ++ src/coreComponents/common/CMakeLists.txt | 2 ++ src/coreComponents/constitutive/CMakeLists.txt | 2 ++ src/coreComponents/constitutiveDrivers/CMakeLists.txt | 1 + src/coreComponents/dataRepository/CMakeLists.txt | 1 + src/coreComponents/denseLinearAlgebra/CMakeLists.txt | 2 ++ src/coreComponents/discretizationMethods/CMakeLists.txt | 1 + src/coreComponents/events/CMakeLists.txt | 1 + src/coreComponents/fieldSpecification/CMakeLists.txt | 1 + src/coreComponents/fileIO/CMakeLists.txt | 1 + src/coreComponents/finiteElement/CMakeLists.txt | 1 + src/coreComponents/finiteVolume/CMakeLists.txt | 1 + src/coreComponents/functions/CMakeLists.txt | 2 ++ src/coreComponents/linearAlgebra/CMakeLists.txt | 1 + src/coreComponents/mainInterface/CMakeLists.txt | 1 + src/coreComponents/math/CMakeLists.txt | 1 + src/coreComponents/mesh/CMakeLists.txt | 2 ++ src/coreComponents/physicsSolvers/CMakeLists.txt | 3 +++ src/coreComponents/schema/CMakeLists.txt | 1 + 19 files changed, 27 insertions(+) diff --git a/src/coreComponents/codingUtilities/CMakeLists.txt b/src/coreComponents/codingUtilities/CMakeLists.txt index f936fc4135e..fdccb254f5e 100644 --- a/src/coreComponents/codingUtilities/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/CMakeLists.txt @@ -36,6 +36,8 @@ set_source_files_properties( Parsing.cpp PROPERTIES LANGUAGE CXX ) target_include_directories( codingUtilities PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS codingUtilities LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) + if( GEOS_ENABLE_TESTS ) add_subdirectory(tests) diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index 3733bafb7f7..e384c1d0e5c 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -113,6 +113,8 @@ blt_add_library( NAME common target_include_directories( common PUBLIC ${CMAKE_BINARY_DIR}/include ) target_include_directories( common PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS common LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) + if( GEOS_ENABLE_TESTS ) add_subdirectory( unitTests ) add_subdirectory( format/table/unitTests ) diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index c4defea6888..7a4fd542b9b 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -315,6 +315,8 @@ blt_add_library( NAME constitutive target_include_directories( constitutive PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS constitutive LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) + if( GEOS_ENABLE_TESTS ) add_subdirectory( unitTests ) endif( ) diff --git a/src/coreComponents/constitutiveDrivers/CMakeLists.txt b/src/coreComponents/constitutiveDrivers/CMakeLists.txt index 24570963e67..41e4a946d28 100644 --- a/src/coreComponents/constitutiveDrivers/CMakeLists.txt +++ b/src/coreComponents/constitutiveDrivers/CMakeLists.txt @@ -54,3 +54,4 @@ blt_add_library( NAME constitutiveDrivers ) target_include_directories( constitutiveDrivers PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS constitutiveDrivers LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) diff --git a/src/coreComponents/dataRepository/CMakeLists.txt b/src/coreComponents/dataRepository/CMakeLists.txt index 1d97ce8d11e..70c8a9bf97e 100644 --- a/src/coreComponents/dataRepository/CMakeLists.txt +++ b/src/coreComponents/dataRepository/CMakeLists.txt @@ -62,6 +62,7 @@ blt_add_library( NAME dataRepository ) target_include_directories( dataRepository PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS dataRepository LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) if( GEOS_ENABLE_TESTS ) diff --git a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt index 5af9fc56f52..1d15320355c 100644 --- a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt +++ b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt @@ -24,6 +24,8 @@ blt_add_library( NAME denseLinearAlgebra target_include_directories( denseLinearAlgebra PUBLIC ${CMAKE_CURRENT_LIST_DIR} ) +install( TARGETS denseLinearAlgebra LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) + if( GEOS_ENABLE_TESTS ) add_subdirectory( unitTests ) endif( ) diff --git a/src/coreComponents/discretizationMethods/CMakeLists.txt b/src/coreComponents/discretizationMethods/CMakeLists.txt index 191f8dd12c9..06d03ca8fa9 100644 --- a/src/coreComponents/discretizationMethods/CMakeLists.txt +++ b/src/coreComponents/discretizationMethods/CMakeLists.txt @@ -26,3 +26,4 @@ blt_add_library( NAME discretizationMethods target_include_directories( discretizationMethods PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS discretizationMethods LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) diff --git a/src/coreComponents/events/CMakeLists.txt b/src/coreComponents/events/CMakeLists.txt index 184dea2f0c1..3a7fe6a7a92 100644 --- a/src/coreComponents/events/CMakeLists.txt +++ b/src/coreComponents/events/CMakeLists.txt @@ -39,3 +39,4 @@ blt_add_library( NAME events target_include_directories( events PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS events LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) diff --git a/src/coreComponents/fieldSpecification/CMakeLists.txt b/src/coreComponents/fieldSpecification/CMakeLists.txt index f7b68eaaa1e..5e67ea51812 100644 --- a/src/coreComponents/fieldSpecification/CMakeLists.txt +++ b/src/coreComponents/fieldSpecification/CMakeLists.txt @@ -41,3 +41,4 @@ blt_add_library( NAME fieldSpecification target_include_directories( fieldSpecification PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS fieldSpecification LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) diff --git a/src/coreComponents/fileIO/CMakeLists.txt b/src/coreComponents/fileIO/CMakeLists.txt index 714ea11808c..3b70d456190 100644 --- a/src/coreComponents/fileIO/CMakeLists.txt +++ b/src/coreComponents/fileIO/CMakeLists.txt @@ -93,6 +93,7 @@ blt_add_library( NAME fileIO target_include_directories( fileIO PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS fileIO LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) diff --git a/src/coreComponents/finiteElement/CMakeLists.txt b/src/coreComponents/finiteElement/CMakeLists.txt index aa3740ddd04..3343eb53258 100644 --- a/src/coreComponents/finiteElement/CMakeLists.txt +++ b/src/coreComponents/finiteElement/CMakeLists.txt @@ -55,6 +55,7 @@ blt_add_library( NAME finiteElement target_include_directories( finiteElement PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS finiteElement LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) if( GEOS_ENABLE_TESTS ) add_subdirectory( unitTests ) diff --git a/src/coreComponents/finiteVolume/CMakeLists.txt b/src/coreComponents/finiteVolume/CMakeLists.txt index 9f855fc79db..39dd4450445 100644 --- a/src/coreComponents/finiteVolume/CMakeLists.txt +++ b/src/coreComponents/finiteVolume/CMakeLists.txt @@ -55,3 +55,4 @@ blt_add_library( NAME finiteVolume target_include_directories( finiteVolume PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS finiteVolume LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) diff --git a/src/coreComponents/functions/CMakeLists.txt b/src/coreComponents/functions/CMakeLists.txt index ec6542660da..8e73070438c 100644 --- a/src/coreComponents/functions/CMakeLists.txt +++ b/src/coreComponents/functions/CMakeLists.txt @@ -46,6 +46,8 @@ blt_add_library( NAME functions target_include_directories( functions PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS functions LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) + if( GEOS_ENABLE_TESTS ) add_subdirectory( unitTests ) endif() diff --git a/src/coreComponents/linearAlgebra/CMakeLists.txt b/src/coreComponents/linearAlgebra/CMakeLists.txt index abbfcdf8bb2..d19283bb37f 100644 --- a/src/coreComponents/linearAlgebra/CMakeLists.txt +++ b/src/coreComponents/linearAlgebra/CMakeLists.txt @@ -163,6 +163,7 @@ blt_add_library( NAME linearAlgebra target_include_directories( linearAlgebra PUBLIC ${CMAKE_CURRENT_LIST_DIR} ) +install( TARGETS linearAlgebra LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) if( GEOS_ENABLE_TESTS ) add_subdirectory( unitTests ) diff --git a/src/coreComponents/mainInterface/CMakeLists.txt b/src/coreComponents/mainInterface/CMakeLists.txt index fb96f9ed6c5..af6b85e76cf 100644 --- a/src/coreComponents/mainInterface/CMakeLists.txt +++ b/src/coreComponents/mainInterface/CMakeLists.txt @@ -35,3 +35,4 @@ add_dependencies( mainInterface generate_version ) target_include_directories( mainInterface PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS mainInterface LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) diff --git a/src/coreComponents/math/CMakeLists.txt b/src/coreComponents/math/CMakeLists.txt index 290f23808db..53c52e1abdb 100644 --- a/src/coreComponents/math/CMakeLists.txt +++ b/src/coreComponents/math/CMakeLists.txt @@ -14,3 +14,4 @@ blt_add_library( NAME math target_include_directories( math INTERFACE ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS math LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) diff --git a/src/coreComponents/mesh/CMakeLists.txt b/src/coreComponents/mesh/CMakeLists.txt index 5eeb7f1a900..481ef6f243e 100644 --- a/src/coreComponents/mesh/CMakeLists.txt +++ b/src/coreComponents/mesh/CMakeLists.txt @@ -193,6 +193,8 @@ blt_add_library( NAME mesh target_include_directories( mesh PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) +install( TARGETS mesh LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) + if( ENABLE_VTK ) # Avoid compiling with nvcc which sometimes segfaults in debug set_source_files_properties( generators/VTKMeshGeneratorTools.cpp PROPERTIES LANGUAGE CXX ) diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index c8a6f1a002e..b9bc68e85e3 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -74,6 +74,9 @@ blt_add_library( NAME physicsSolvers ) target_include_directories( physicsSolvers PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents ) + +install( TARGETS physicsSolvers LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) + if( externalComponentDeps ) target_include_directories( physicsSolvers PUBLIC ${CMAKE_SOURCE_DIR}/externalComponents ) endif() diff --git a/src/coreComponents/schema/CMakeLists.txt b/src/coreComponents/schema/CMakeLists.txt index a6e7369b14b..c62fba76b07 100644 --- a/src/coreComponents/schema/CMakeLists.txt +++ b/src/coreComponents/schema/CMakeLists.txt @@ -28,3 +28,4 @@ blt_add_library( NAME schema target_include_directories( schema PUBLIC ${CMAKE_SOURCE_DIR}/coreComponents) +install( TARGETS schema LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) From 773fcff1b5a51ace652962c8787d565ee1f570e8 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 28 Aug 2024 15:07:39 -1000 Subject: [PATCH 173/286] fix: reenable floating point exceptions (#3300) * reintroduce GEOS_ENABLE_FPE to GeosxOptions.cmake * give Compositional[/Well]MultiphaseBase::m_maxRelativeCompDensChange a usable default value * some modifications for fpe on testFlowStatistics * update TPL paths. more fixes for CO2SolubilityDuanSun.cpp * just disable FPE for testVTKImport * allow failure of SeismicityRate_poromechanics_1d_smoke_01,SeismicityRate_poromechanics_1d_smoke_02,elas3D_Q3_abc_smoke_01,elas3D_Q3_abc_smoke_08,elas3D_Q3_abc_fs_smoke_01,elas3D_Q3_abc_fs_smoke_08 which all generate FPE's --- .devcontainer/devcontainer.json | 2 +- .integrated_tests.yaml | 4 +- BASELINE_NOTES.md | 4 ++ host-configs/LLNL/dane-gcc-12.cmake | 3 ++ host-configs/LLNL/ruby-clang-14.cmake | 4 ++ src/cmake/GeosxOptions.cmake | 3 +- src/coreComponents/LvArray | 2 +- .../functions/CO2SolubilityDuanSun.cpp | 50 +++++++++++++------ .../interfaces/hypre/HypreInterface.cpp | 5 ++ .../mainInterface/ProblemManager.cpp | 2 + .../fluidFlow/CompositionalMultiphaseBase.cpp | 2 +- .../wells/CompositionalMultiphaseWell.cpp | 2 +- .../docs/CompositionalMultiphaseFVM.rst | 2 +- .../docs/CompositionalMultiphaseHybridFVM.rst | 2 +- src/coreComponents/schema/schema.xsd | 4 +- .../constitutiveTests/CMakeLists.txt | 2 - .../unitTests/meshTests/testVTKImport.cpp | 6 +++ 17 files changed, 70 insertions(+), 29 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index d40722ebd77..853e17d5191 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "278-500" + "GEOS_TPL_TAG": "280-510" } }, "runArgs": [ diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 46dda511783..a00377b2bbc 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,7 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3283-6949-4ee437f + baseline: integratedTests/baseline_integratedTests-pr3300-7077-1277f18 allow_fail: all: '' - streak: pennyShapedToughnessDominated_smoke_01,pennyShapedViscosityDominated_smoke_01,pknViscosityDominated_smoke_01 + streak: pennyShapedToughnessDominated_smoke_01,pennyShapedViscosityDominated_smoke_01,pknViscosityDominated_smoke_01,SeismicityRate_poromechanics_1d_smoke_01,SeismicityRate_poromechanics_1d_smoke_02,elas3D_Q3_abc_smoke_01,elas3D_Q3_abc_smoke_08,elas3D_Q3_abc_fs_smoke_01,elas3D_Q3_abc_fs_smoke_08 diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 22a4daed414..d1d315d5658 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3300 (2024-08-28) +====================== +Re-enable floating point exceptions. Rebaseline due to minor changing default value of maxRelativeCompDensChange from 1.7976931348623157e+308 to 1.7976931348623157e+208. + PR #3283 (2024-08-22) ====================== diff --git a/host-configs/LLNL/dane-gcc-12.cmake b/host-configs/LLNL/dane-gcc-12.cmake index c7cd796b8ab..b45d2dba68a 100644 --- a/host-configs/LLNL/dane-gcc-12.cmake +++ b/host-configs/LLNL/dane-gcc-12.cmake @@ -6,4 +6,7 @@ set(MPI_HOME /usr/tce/packages/mvapich2/mvapich2-2.3.7-gcc-12.1.1-magic CACHE PA # ATS set(ATS_ARGUMENTS "--machine slurm112" CACHE STRING "") +# This is here to note the required flags for using valgrind. These will have to be propagated to the TPL's +#set( CMAKE_CXX_FLAGS "-march=x86-64-v2 -mno-avx512f" CACHE STRING "" FORCE) + include(${CMAKE_CURRENT_LIST_DIR}/llnl-cpu-base.cmake) diff --git a/host-configs/LLNL/ruby-clang-14.cmake b/host-configs/LLNL/ruby-clang-14.cmake index 39b8409ba64..c9d928a1d37 100644 --- a/host-configs/LLNL/ruby-clang-14.cmake +++ b/host-configs/LLNL/ruby-clang-14.cmake @@ -2,5 +2,9 @@ include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/ # MPI set(MPI_HOME /usr/tce/packages/mvapich2/mvapich2-2.3.7-clang-14.0.6-magic CACHE PATH "") +# This is here to note the required flags for using valgrind. These will have to be propagated to the TPL's +#set( CMAKE_CXX_FLAGS "-march=x86-64-v2 -mno-avx512f" CACHE STRING "" FORCE) +# This is what is required for using address sanitizer. This should be put into GeosxOptions.cmake when it is incorporated into the build options. +#set( CMAKE_CXX_FLAGS "-g -O2 -fno-omit-frame-pointer -fsanitize=address" CACHE STRING "" FORCE) include(${CMAKE_CURRENT_LIST_DIR}/llnl-cpu-base.cmake) diff --git a/src/cmake/GeosxOptions.cmake b/src/cmake/GeosxOptions.cmake index cce8877cb28..468e6490f57 100644 --- a/src/cmake/GeosxOptions.cmake +++ b/src/cmake/GeosxOptions.cmake @@ -4,7 +4,8 @@ message( "CMAKE_SYSTEM_NAME = ${CMAKE_SYSTEM_NAME}" ) message( "CMAKE_HOST_APPLE = ${CMAKE_HOST_APPLE}" ) ### OPTIONS ### -option( GEOS_ENABLE_TESTS "" ON ) +option( GEOS_ENABLE_FPE "Enables floating point exceptions" ON ) +option( GEOS_ENABLE_TESTS "Enables unit tests" ON ) option( ENABLE_CALIPER "Enables Caliper instrumentation" OFF ) option( ENABLE_MATHPRESSO "" ON ) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 69948929ca4..ec26694afbc 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 69948929ca40acf490143fc020f72cd12d331f37 +Subproject commit ec26694afbcdd137533b6f04ce8f8c264ff8c1fb diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp index 4546e1381ae..ce92e600ff8 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp @@ -32,14 +32,14 @@ namespace PVTProps namespace { -constexpr real64 P_Pa_f = 1e+5; -constexpr real64 P_c = 73.773 * P_Pa_f; -constexpr real64 T_c = 304.1282; -constexpr real64 Rgas = constants::gasConstant; -constexpr real64 V_c = Rgas*T_c/P_c; +inline constexpr real64 P_Pa_f = 1e+5; +inline constexpr real64 P_c = 73.773 * P_Pa_f; +inline constexpr real64 T_c = 304.1282; +inline constexpr real64 Rgas = constants::gasConstant; +inline constexpr real64 V_c = Rgas*T_c/P_c; // these coefficients are in Table (A1) of Duan and Sun (2003) -constexpr real64 acoef[] = +inline constexpr real64 acoef[15] = { 8.99288497e-2, -4.94783127e-1, 4.77922245e-2, 1.03808883e-2, -2.82516861e-2, 9.49887563e-2, 5.20600880e-4, -2.93540971e-4, -1.77265112e-3, -2.51101973e-5, 8.93353441e-5, 7.88998563e-5, -1.66727022e-2, 1.398, 2.96e-2 }; @@ -65,7 +65,7 @@ real64 co2EOS( real64 const & T, real64 const & P, real64 const & V_r ) real64 PWater( real64 const & T ) { // these coefficients are defined in Table (B1) of Duan and Sun (2003) - constexpr real64 ccoef[] = { -38.640844, 5.8948420, 59.876516, 26.654627, 10.637097 }; + static constexpr real64 ccoef[5] = { -38.640844, 5.8948420, 59.876516, 26.654627, 10.637097 }; // H2O critical pressure (bars) real64 const P_c_w = 220.85; @@ -92,18 +92,36 @@ real64 logF( real64 const & T, real64 const & P, real64 const & V_r ) real64 const T_r = units::convertCToK( T ) / T_c; real64 const Z = P_r * V_r/T_r; + real64 const inv_T_r = 1.0/T_r; + real64 const inv_T_r2 = inv_T_r*inv_T_r; + real64 const inv_T_r3 = inv_T_r2*inv_T_r; + real64 const inv_V_r = 1.0/V_r; + real64 const inv_V_r2 = inv_V_r*inv_V_r; + real64 const inv_V_r3 = inv_V_r2*inv_V_r; + real64 const inv_V_r4 = inv_V_r3*inv_V_r; + real64 const inv_V_r5 = inv_V_r4*inv_V_r; + // fugacity coefficient of CO2, equation (A6) of Duan and Sun (2003) real64 const log_f = Z - 1 - log( Z ) + - ( acoef[0] + acoef[1]/T_r/T_r + acoef[2]/T_r/T_r/T_r )/V_r - + ( acoef[3] + acoef[4]/T_r/T_r + acoef[5]/T_r/T_r/T_r )/2.0/V_r/V_r - + ( acoef[6] + acoef[7]/T_r/T_r + acoef[8]/T_r/T_r/T_r )/4.0/V_r/V_r/V_r/V_r - + ( acoef[9] + acoef[10]/T_r/T_r + acoef[11]/T_r/T_r/T_r )/5.0/V_r/V_r/V_r/V_r/V_r - + acoef[12]/2.0/T_r/T_r/T_r/acoef[14] * ( acoef[13] + 1.0 - (acoef[13] + 1.0 + acoef[14]/V_r/V_r) * exp( -acoef[14]/V_r/V_r ) ); + ( acoef[0] + acoef[1]*inv_T_r2 + acoef[2]*inv_T_r3 )*inv_V_r + + ( acoef[3] + acoef[4]*inv_T_r2 + acoef[5]*inv_T_r3 )*0.5*inv_V_r2 + + ( acoef[6] + acoef[7]*inv_T_r2 + acoef[8]*inv_T_r3 )*0.25*inv_V_r4 + + ( acoef[9] + acoef[10]*inv_T_r2 + acoef[11]*inv_T_r3 )*0.2*inv_V_r5 + + acoef[12]*0.5*inv_T_r3/acoef[14] * ( acoef[13] + 1.0 - (acoef[13] + 1.0 + acoef[14]*inv_V_r2) * exp( -acoef[14]*inv_V_r2 ) ); + //This causes a divide by zero FPE when using clang14 on ruby + // real64 const log_f = Z - 1 - log( Z ) + + // ( acoef[0] + acoef[1]/T_r/T_r + acoef[2]/T_r/T_r/T_r )/V_r + // + ( acoef[3] + acoef[4]/T_r/T_r + acoef[5]/T_r/T_r/T_r )/2.0/V_r/V_r + // + ( acoef[6] + acoef[7]/T_r/T_r + acoef[8]/T_r/T_r/T_r )/4.0/V_r/V_r/V_r/V_r + // + ( acoef[9] + acoef[10]/T_r/T_r + acoef[11]/T_r/T_r/T_r )/5.0/V_r/V_r/V_r/V_r/V_r + // + acoef[12]/2.0/T_r/T_r/T_r/acoef[14] * ( acoef[13] + 1.0 - (acoef[13] + 1.0 + acoef[14]/V_r/V_r) * exp( + // -acoef[14]/V_r/V_r ) ); + return log_f; } -real64 Par( real64 const & T, real64 const & P, real64 const * cc ) +real64 Par( real64 const & T, real64 const & P, real64 const (&cc)[11] ) { // "equation for the parameters", see equation (7) of Duan and Sun (2003) real64 x = cc[0] @@ -162,11 +180,11 @@ void calculateCO2Solubility( string const & functionName, array1d< real64 > const & values ) { // Interaction parameters, see Table 2 of Duan and Sun (2003) - constexpr real64 mu[] = + static constexpr real64 mu[11] = { 28.9447706, -0.0354581768, -4770.67077, 1.02782768e-5, 33.8126098, 9.04037140e-3, -1.14934031e-3, -0.307405726, -0.0907301486, 9.32713393e-4, 0 }; - constexpr real64 lambda[] = { -0.411370585, 6.07632013e-4, 97.5347708, 0, 0, 0, 0, -0.0237622469, 0.0170656236, 0, 1.41335834e-5 }; - constexpr real64 zeta[] = { 3.36389723e-4, -1.98298980e-5, 0, 0, 0, 0, 0, 2.12220830e-3, -5.24873303e-3, 0, 0 }; + static constexpr real64 lambda[11] = { -0.411370585, 6.07632013e-4, 97.5347708, 0, 0, 0, 0, -0.0237622469, 0.0170656236, 0, 1.41335834e-5 }; + static constexpr real64 zeta[11] = { 3.36389723e-4, -1.98298980e-5, 0, 0, 0, 0, 0, 2.12220830e-3, -5.24873303e-3, 0, 0 }; localIndex const nPressures = tableCoords.nPressures(); localIndex const nTemperatures = tableCoords.nTemperatures(); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp index 37acb60d6d5..5f8fd14be98 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp @@ -40,6 +40,11 @@ namespace geos void HypreInterface::initialize() { +#ifdef GEOS_USE_OPENMP + GEOS_LOG_RANK_0_IF( omp_get_max_threads()>1, + "OMP_NUM_THREADS > 1 may not be optimal for certain hypre preconditioning options. " ); +#endif + HYPRE_Init(); #if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP HYPRE_SetExecutionPolicy( HYPRE_EXEC_DEVICE ); diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 2319c40ee4d..072fd55c822 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -139,6 +139,8 @@ ProblemManager::ProblemManager( conduit::Node & root ): setRestartFlags( RestartFlags::WRITE ). setDescription( "Whether to disallow using pinned memory allocations for MPI communication buffers." ); + chai::ArrayManager::getInstance()->disableCallbacks(); + } ProblemManager::~ProblemManager() diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 77bba20f3f6..e80d9a8612c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -127,7 +127,7 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, this->registerWrapper( viewKeyStruct::maxRelativeCompDensChangeString(), &m_maxRelativeCompDensChange ). setSizedFromParent( 0 ). setInputFlag( InputFlags::OPTIONAL ). - setApplyDefaultValue( LvArray::NumericLimits< real64 >::max ). // disabled by default + setApplyDefaultValue( LvArray::NumericLimits< real64 >::max/1.0e100 ). // disabled by default setDescription( "Maximum (relative) change in a component density in a Newton iteration" ); this->registerWrapper( viewKeyStruct::allowLocalCompDensChoppingString(), &m_allowCompDensChopping ). diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index ef18ccf02a4..4cdc58d9509 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -88,7 +88,7 @@ CompositionalMultiphaseWell::CompositionalMultiphaseWell( const string & name, this->registerWrapper( viewKeyStruct::maxRelativeCompDensChangeString(), &m_maxRelativeCompDensChange ). setSizedFromParent( 0 ). setInputFlag( InputFlags::OPTIONAL ). - setApplyDefaultValue( LvArray::NumericLimits< real64 >::max ). // disabled by default + setApplyDefaultValue( LvArray::NumericLimits< real64 >::max/1.0e100 ). // disabled by default setDescription( "Maximum (relative) change in a component density between two Newton iterations" ); this->registerWrapper( viewKeyStruct::maxRelativePresChangeString(), &m_maxRelativePresChange ). diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst index a2b0c70f5fc..44d96c03c57 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst @@ -15,7 +15,7 @@ kappaminDBC real64 logLevel integer 0 Log level maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration maxCompFractionChange real64 0.5 Maximum (absolute) change in a component fraction in a Newton iteration -maxRelativeCompDensChange real64 1.79769e+308 Maximum (relative) change in a component density in a Newton iteration +maxRelativeCompDensChange real64 1.79769e+208 Maximum (relative) change in a component density in a Newton iteration maxRelativePressureChange real64 0.5 Maximum (relative) change in pressure in a Newton iteration maxRelativeTemperatureChange real64 0.5 Maximum (relative) change in temperature in a Newton iteration maxSequentialCompDensChange real64 1 Maximum (absolute) component density change in a sequential iteration, used for outer loop convergence check diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst index 2cf53fd6857..cd57d7e4ef8 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst @@ -12,7 +12,7 @@ isThermal integer 0 Flag i logLevel integer 0 Log level maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration maxCompFractionChange real64 0.5 Maximum (absolute) change in a component fraction in a Newton iteration -maxRelativeCompDensChange real64 1.79769e+308 Maximum (relative) change in a component density in a Newton iteration +maxRelativeCompDensChange real64 1.79769e+208 Maximum (relative) change in a component density in a Newton iteration maxRelativePressureChange real64 0.5 Maximum (relative) change in pressure in a Newton iteration maxRelativeTemperatureChange real64 0.5 Maximum (relative) change in temperature in a Newton iteration maxSequentialCompDensChange real64 1 Maximum (absolute) component density change in a sequential iteration, used for outer loop convergence check diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index c8ffa3d8173..9f99b83e2c6 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -2450,7 +2450,7 @@ the relative residual norm satisfies: - + @@ -2536,7 +2536,7 @@ the relative residual norm satisfies: - + diff --git a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt index 58336654eef..523c6c89500 100644 --- a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt @@ -52,8 +52,6 @@ foreach(test ${gtest_geosx_tests}) SOURCES ${test} OUTPUT_DIR ${TEST_OUTPUT_DIRECTORY} DEPENDS_ON ${decoratedDependencies} ${tplDependencyList} ) - - blt_print_target_properties( TARGET ${test_name} ) geos_add_test( NAME ${test_name} COMMAND ${test_name} ) diff --git a/src/coreComponents/unitTests/meshTests/testVTKImport.cpp b/src/coreComponents/unitTests/meshTests/testVTKImport.cpp index 5a81e5d8cda..2f6db5820ee 100644 --- a/src/coreComponents/unitTests/meshTests/testVTKImport.cpp +++ b/src/coreComponents/unitTests/meshTests/testVTKImport.cpp @@ -17,6 +17,7 @@ // Source includes #include "codingUtilities/UnitTestUtilities.hpp" #include "dataRepository/xmlWrapper.hpp" +#include "LvArray/src/system.hpp" #include "mainInterface/GeosxState.hpp" #include "mainInterface/initialization.hpp" #include "mesh/MeshManager.hpp" @@ -41,6 +42,8 @@ #include +#include + using namespace geos; using namespace geos::testing; @@ -97,6 +100,9 @@ class TestFractureImport : public ::testing::Test void SetUp() override { + // Disable floating point exceptions for the tests. + // clang15 on x86_64 does throws an FPE. + LvArray::system::disableFloatingPointExceptions( FE_ALL_EXCEPT ); if( MpiWrapper::commRank() == 0 ) { namespace fs = std::filesystem; From 1b250bb65cbf6c3c7a960499548b26e3a7591af9 Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Thu, 29 Aug 2024 00:00:44 -0500 Subject: [PATCH 174/286] feat: Add immiscible water flash model (#3237) * Add immiscible water flash model --- .../constitutive/CMakeLists.txt | 4 + .../functions/NegativeTwoPhaseFlash.hpp | 16 +- .../models/ComponentProperties.hpp | 1 + .../models/ImmiscibleWaterFlashModel.cpp | 104 +++++ .../models/ImmiscibleWaterFlashModel.hpp | 212 ++++++++++ .../models/ImmiscibleWaterParameters.cpp | 89 +++++ .../models/ImmiscibleWaterParameters.hpp | 59 +++ .../compositional/models/ModelParameters.hpp | 1 + .../constitutive/unitTests/CMakeLists.txt | 1 + .../constitutive/unitTests/TestFluid.hpp | 9 +- .../testImmiscibleWaterFlashModel.cpp | 376 ++++++++++++++++++ 11 files changed, 862 insertions(+), 10 deletions(-) create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp create mode 100644 src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index 7a4fd542b9b..3a01edc6e7c 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -77,6 +77,8 @@ set( constitutive_headers fluid/multifluid/compositional/models/CriticalVolume.hpp fluid/multifluid/compositional/models/EquationOfState.hpp fluid/multifluid/compositional/models/FunctionBase.hpp + fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp + fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -220,6 +222,8 @@ set( constitutive_sources fluid/multifluid/compositional/models/CompositionalDensity.cpp fluid/multifluid/compositional/models/ConstantViscosity.cpp fluid/multifluid/compositional/models/CriticalVolume.cpp + fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp + fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp index 4dc15279c60..c0cf7c7f30c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -174,7 +174,7 @@ struct NegativeTwoPhaseFlash * @param[out] fugacityRatios the fugacity rations * @return The error */ - template< integer USD > + template< integer USD1, integer USD2 > GEOS_HOST_DEVICE static real64 computeFugacityRatio( integer const numComps, @@ -184,11 +184,11 @@ struct NegativeTwoPhaseFlash ComponentProperties::KernelWrapper const & componentProperties, EquationOfStateType const liquidEos, EquationOfStateType const vapourEos, - arraySlice1d< real64 const, USD > const & kValues, + arraySlice1d< real64 const, USD1 > const & kValues, arraySlice1d< integer const > const & presentComponents, real64 & vapourPhaseMoleFraction, - arraySlice1d< real64, USD > const & liquidComposition, - arraySlice1d< real64, USD > const & vapourComposition, + arraySlice1d< real64, USD2 > const & liquidComposition, + arraySlice1d< real64, USD2 > const & vapourComposition, arraySlice1d< real64 > const & logLiquidFugacity, arraySlice1d< real64 > const & logVapourFugacity, arraySlice1d< real64 > const & fugacityRatios ); @@ -487,7 +487,7 @@ void NegativeTwoPhaseFlash::computeDerivatives( } } -template< integer USD > +template< integer USD1, integer USD2 > GEOS_HOST_DEVICE real64 NegativeTwoPhaseFlash::computeFugacityRatio( integer const numComps, @@ -497,11 +497,11 @@ real64 NegativeTwoPhaseFlash::computeFugacityRatio( ComponentProperties::KernelWrapper const & componentProperties, EquationOfStateType const liquidEos, EquationOfStateType const vapourEos, - arraySlice1d< real64 const, USD > const & kValues, + arraySlice1d< real64 const, USD1 > const & kValues, arraySlice1d< integer const > const & presentComponents, real64 & vapourPhaseMoleFraction, - arraySlice1d< real64, USD > const & liquidComposition, - arraySlice1d< real64, USD > const & vapourComposition, + arraySlice1d< real64, USD2 > const & liquidComposition, + arraySlice1d< real64, USD2 > const & vapourComposition, arraySlice1d< real64 > const & logLiquidFugacity, arraySlice1d< real64 > const & logVapourFugacity, arraySlice1d< real64 > const & fugacityRatios ) diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp index e11290a280b..250b4d7a60c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp @@ -56,6 +56,7 @@ class ComponentProperties final /** * Data accessors */ + arrayView1d< string > const & getComponentName() const { return m_componentNames; } arrayView1d< real64 > const & getComponentMolarWeight() const { return m_componentMolarWeight; } arrayView1d< real64 > const & getComponentCriticalPressure() const { return m_componentCriticalPressure; } arrayView1d< real64 > const & getComponentCriticalTemperature() const { return m_componentCriticalTemperature; } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp new file mode 100644 index 00000000000..9ffa7d2f418 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp @@ -0,0 +1,104 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ImmiscibleWaterFlashModel.cpp + */ + +#include "ImmiscibleWaterFlashModel.hpp" +#include "ImmiscibleWaterParameters.hpp" +#include "EquationOfState.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +// Naming conventions +string ImmiscibleWaterFlashModel::catalogName() +{ + return "ThreePhase"; +} + +ImmiscibleWaterFlashModel::ImmiscibleWaterFlashModel( string const & name, + ComponentProperties const & componentProperties, + ModelParameters const & modelParameters ): + FunctionBase( name, componentProperties ), + m_parameters( modelParameters ) +{ + m_waterComponentIndex = ImmiscibleWaterParameters::getWaterComponentIndex( componentProperties ); +} + +ImmiscibleWaterFlashModel::KernelWrapper +ImmiscibleWaterFlashModel::createKernelWrapper() const +{ + constexpr integer liquidIndex = 0; + constexpr integer vapourIndex = 1; + constexpr integer aqueousIndex = 2; + EquationOfState const * equationOfState = m_parameters.get< EquationOfState >(); + EquationOfStateType const liquidEos = EnumStrings< EquationOfStateType >::fromString( equationOfState->m_equationsOfStateNames[liquidIndex] ); + EquationOfStateType const vapourEos = EnumStrings< EquationOfStateType >::fromString( equationOfState->m_equationsOfStateNames[vapourIndex] ); + + array1d< real64 > componentCriticalVolume( m_componentProperties.getNumberOfComponents()); + + return KernelWrapper( m_componentProperties.getNumberOfComponents(), + liquidIndex, + vapourIndex, + aqueousIndex, + m_waterComponentIndex, + liquidEos, + vapourEos, + componentCriticalVolume ); +} + +ImmiscibleWaterFlashModelUpdate::ImmiscibleWaterFlashModelUpdate( + integer const numComponents, + integer const liquidIndex, + integer const vapourIndex, + integer const aqueousIndex, + integer const waterComponentIndex, + EquationOfStateType const liquidEos, + EquationOfStateType const vapourEos, + arrayView1d< real64 const > const componentCriticalVolume ): + m_twoPhaseModel( numComponents, + liquidIndex, + vapourIndex, + liquidEos, + vapourEos, + componentCriticalVolume ), + m_numComponents( numComponents ), + m_liquidIndex( liquidIndex ), + m_vapourIndex( vapourIndex ), + m_aquoesIndex( aqueousIndex ), + m_waterComponentIndex( waterComponentIndex ) +{} + +std::unique_ptr< ModelParameters > +ImmiscibleWaterFlashModel::createParameters( std::unique_ptr< ModelParameters > parameters ) +{ + auto params = NegativeTwoPhaseFlashModel::createParameters( std::move( parameters ) ); + params = ImmiscibleWaterParameters::create( std::move( params ) ); + return params; +} + +} // end namespace compositional + +} // namespace constitutive + +} // end namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp new file mode 100644 index 00000000000..42c8c18706b --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp @@ -0,0 +1,212 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ImmiscibleWaterFlashModel.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERFLASHMODEL_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERFLASHMODEL_HPP_ + +#include "FunctionBase.hpp" +#include "EquationOfState.hpp" + +#include "constitutive/fluid/multifluid/Layouts.hpp" +#include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" +#include "NegativeTwoPhaseFlashModel.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +class ModelParameters; + +class ImmiscibleWaterFlashModelUpdate final : public FunctionBaseUpdate +{ +private: + static constexpr integer maxNumComps = MultiFluidConstants::MAX_NUM_COMPONENTS; +public: + + using PhaseProp = NegativeTwoPhaseFlashModelUpdate::PhaseProp; + using PhaseComp = NegativeTwoPhaseFlashModelUpdate::PhaseComp; + using Deriv = multifluid::DerivativeOffset; + + ImmiscibleWaterFlashModelUpdate( integer const numComponents, + integer const liquidIndex, + integer const vapourIndex, + integer const aqueousIndex, + integer const waterComponentIndex, + EquationOfStateType const liquidEos, + EquationOfStateType const vapourEos, + arrayView1d< real64 const > const componentCriticalVolume ); + + // Mark as a 3-phase flash + GEOS_HOST_DEVICE + static constexpr integer getNumberOfPhases() { return 3; } + + template< int USD1, int USD2 > + GEOS_HOST_DEVICE + void compute( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & compFraction, + arraySlice2d< real64, USD2 > const & kValues, + PhaseProp::SliceType const phaseFraction, + PhaseComp::SliceType const phaseCompFraction ) const; + +private: + template< int USD > + GEOS_FORCE_INLINE + GEOS_HOST_DEVICE + void convertCompositionDerivatives( real64 const hcMoleFraction, + arraySlice1d< real64 const > const & composition, + arraySlice1d< real64, USD > const & derivatives ) const + { + real64 dvdzi = 0.0; + for( integer ic = 0; ic < m_numComponents; ++ic ) + { + dvdzi += derivatives[Deriv::dC+ic] * composition[ic]; + } + for( integer ic = 0; ic < m_numComponents; ++ic ) + { + derivatives[Deriv::dC+ic] /= hcMoleFraction; + } + derivatives[Deriv::dC+m_waterComponentIndex] = dvdzi / hcMoleFraction; + } + +private: + NegativeTwoPhaseFlashModel::KernelWrapper const m_twoPhaseModel; + integer const m_numComponents; + integer const m_liquidIndex; + integer const m_vapourIndex; + integer const m_aquoesIndex; + integer const m_waterComponentIndex; +}; + +class ImmiscibleWaterFlashModel : public FunctionBase +{ +public: + ImmiscibleWaterFlashModel( string const & name, + ComponentProperties const & componentProperties, + ModelParameters const & modelParameters ); + + static string catalogName(); + + FunctionType functionType() const override + { + return FunctionType::FLASH; + } + + /// Type of kernel wrapper for in-kernel update + using KernelWrapper = ImmiscibleWaterFlashModelUpdate; + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelWrapper() const; + + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ); + +private: + ModelParameters const & m_parameters; + integer m_waterComponentIndex{-1}; +}; + +template< int USD1, int USD2 > +GEOS_HOST_DEVICE +void ImmiscibleWaterFlashModelUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & compFraction, + arraySlice2d< real64, USD2 > const & kValues, + PhaseProp::SliceType const phaseFraction, + PhaseComp::SliceType const phaseCompFraction ) const +{ + LvArray::forValuesInSlice( phaseFraction.value, setZero ); + LvArray::forValuesInSlice( phaseFraction.derivs, setZero ); + LvArray::forValuesInSlice( phaseCompFraction.value, setZero ); + LvArray::forValuesInSlice( phaseCompFraction.derivs, setZero ); + + // Water phase + phaseFraction.value[m_aquoesIndex] = compFraction[m_waterComponentIndex]; + phaseFraction.derivs( m_aquoesIndex, Deriv::dC + m_waterComponentIndex ) = 1.0; + phaseCompFraction.value( m_aquoesIndex, m_waterComponentIndex ) = 1.0; + + // Total hydrocarbon mole fraction + real64 const z_hc = 1.0 - compFraction[m_waterComponentIndex]; + + if( z_hc < MultiFluidConstants::minForSpeciesPresence ) + { + // Single phase water + real64 const constantComposition = 1.0 / (m_numComponents - 1); + for( integer ic = 0; ic < m_numComponents; ++ic ) + { + phaseCompFraction.value( m_liquidIndex, ic ) = constantComposition; + phaseCompFraction.value( m_vapourIndex, ic ) = constantComposition; + } + phaseCompFraction.value( m_liquidIndex, m_waterComponentIndex ) = 0.0; + phaseCompFraction.value( m_vapourIndex, m_waterComponentIndex ) = 0.0; + } + else + { + // Hydrocarbon phases + + // Calculate normalised hyrdocarbon composition + stackArray1d< real64, maxNumComps > composition( m_numComponents ); + for( integer ic = 0; ic < m_numComponents; ++ic ) + { + composition[ic] = compFraction[ic] / z_hc; + } + composition[m_waterComponentIndex] = 0.0; + + // Perform negative two-phase flash + m_twoPhaseModel.compute( componentProperties, + pressure, + temperature, + composition.toSliceConst(), + kValues, + phaseFraction, + phaseCompFraction ); + + for( integer const phaseIndex : {m_liquidIndex, m_vapourIndex} ) + { + real64 const v = phaseFraction.value[phaseIndex]; + phaseFraction.value[phaseIndex] *= z_hc; + LvArray::forValuesInSlice( phaseFraction.derivs[phaseIndex], [&]( real64 & a ){ a *= z_hc; } ); + convertCompositionDerivatives( z_hc, composition.toSliceConst(), phaseFraction.derivs[phaseIndex] ); + phaseFraction.derivs( phaseIndex, Deriv::dC+m_waterComponentIndex ) = -v; + + for( integer ic = 0; ic < m_numComponents; ++ic ) + { + convertCompositionDerivatives( z_hc, composition.toSliceConst(), phaseCompFraction.derivs[phaseIndex][ic] ); + } + } + } +} + +} // end namespace compositional + +} // end namespace constitutive + +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERFLASHMODEL_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp new file mode 100644 index 00000000000..ac8c8da3749 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp @@ -0,0 +1,89 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ImmiscibleWaterParameters.cpp + */ + +#include "ImmiscibleWaterParameters.hpp" +#include "ComponentProperties.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "dataRepository/InputFlags.hpp" +#include "common/format/StringUtilities.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +ImmiscibleWaterParameters::ImmiscibleWaterParameters( std::unique_ptr< ModelParameters > parameters ): + ModelParameters( std::move( parameters ) ) +{} + +std::unique_ptr< ModelParameters > +ImmiscibleWaterParameters::create( std::unique_ptr< ModelParameters > parameters ) +{ + if( parameters && parameters->get< ImmiscibleWaterParameters >() != nullptr ) + { + return parameters; + } + return std::make_unique< ImmiscibleWaterParameters >( std::move( parameters ) ); +} + +integer ImmiscibleWaterParameters::getWaterComponentIndex( ComponentProperties const & componentProperties ) +{ + auto componentNames = componentProperties.getComponentName(); + integer const numComps = componentNames.size(); + for( integer ic = 0; ic < numComps; ++ic ) + { + string const compName = stringutilities::toLower( componentNames[ic] ); + if( compName == waterComponentName ) + { + return ic; + } + } + return -1; +} + +void ImmiscibleWaterParameters::registerParametersImpl( MultiFluidBase * fluid ) +{ + GEOS_UNUSED_VAR( fluid ); +} + +void ImmiscibleWaterParameters::postInputInitializationImpl( MultiFluidBase const * fluid, + ComponentProperties const & componentProperties ) +{ + integer const waterIndex = fluid->getWaterPhaseIndex(); + GEOS_THROW_IF_LT_MSG( waterIndex, 0, + GEOS_FMT( "{}: water phase not found '{}'", fluid->getFullName(), + MultiFluidBase::viewKeyStruct::phaseNamesString() ), + InputError ); + + integer const h2oIndex = getWaterComponentIndex( componentProperties ); + GEOS_THROW_IF_LT_MSG( h2oIndex, 0, + GEOS_FMT( "{}: water component not found '{}'", fluid->getFullName(), + MultiFluidBase::viewKeyStruct::componentNamesString() ), + InputError ); +} + +} // end namespace compositional + +} // end namespace constitutive + +} // end namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp new file mode 100644 index 00000000000..2cca343202e --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp @@ -0,0 +1,59 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ImmiscibleWaterParameters.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERPARAMETERS_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERPARAMETERS_HPP_ + +#include "ModelParameters.hpp" +#include "common/DataTypes.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +class ImmiscibleWaterParameters : public ModelParameters +{ + static constexpr char const * waterComponentName = "h2o"; + +public: + ImmiscibleWaterParameters( std::unique_ptr< ModelParameters > parameters ); + ~ImmiscibleWaterParameters() override = default; + + static std::unique_ptr< ModelParameters > create( std::unique_ptr< ModelParameters > parameters ); + + static integer getWaterComponentIndex( ComponentProperties const & componentProperties ); + +protected: + void registerParametersImpl( MultiFluidBase * fluid ) override; + + void postInputInitializationImpl( MultiFluidBase const * fluid, ComponentProperties const & componentProperties ) override; +}; + +} // end namespace compositional + +} // end namespace constitutive + +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERPARAMETERS_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp index 268b7ec250a..d84d770c39e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp @@ -20,6 +20,7 @@ #ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_MODELPARAMETERS_HPP_ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_MODELPARAMETERS_HPP_ +#include #include "common/GeosxMacros.hpp" namespace geos diff --git a/src/coreComponents/constitutive/unitTests/CMakeLists.txt b/src/coreComponents/constitutive/unitTests/CMakeLists.txt index a4d541ee37b..d357ad9290c 100644 --- a/src/coreComponents/constitutive/unitTests/CMakeLists.txt +++ b/src/coreComponents/constitutive/unitTests/CMakeLists.txt @@ -7,6 +7,7 @@ set( gtest_geosx_tests testDruckerPrager.cpp testElasticIsotropic.cpp testKValueInitialization.cpp + testImmiscibleWaterFlashModel.cpp testLohrenzBrayClarkViscosity.cpp testModifiedCamClay.cpp testMultiFluidSelector.cpp diff --git a/src/coreComponents/constitutive/unitTests/TestFluid.hpp b/src/coreComponents/constitutive/unitTests/TestFluid.hpp index 5713310cbec..1245cbe3218 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluid.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluid.hpp @@ -67,9 +67,14 @@ class TestFluid static std::unique_ptr< TestFluid< NC > > create( std::array< integer, NC > const & components ) { std::unique_ptr< TestFluid< NC > > testFluid( new TestFluid() ); - for( integer ic = 0; ic < NC; ++ic ) + const std::unordered_map< integer, string > componentNames = { + {Fluid::H2O, "H2O"}, {Fluid::CO2, "CO2"}, {Fluid::N2, "N2"}, {Fluid::H2S, "H2S"}, + {Fluid::C1, "CH4"}, {Fluid::C2, "C2H6"}, {Fluid::C3, "C3H8"}, {Fluid::C4, "C4H10"}, + {Fluid::C5, "C5H12"}, {Fluid::C8, "C8H18"}, {Fluid::C10, "C10+"}, + }; + for( integer const ic : components ) { - testFluid->componentNames.emplace_back( GEOS_FMT( "COMP{}", ic+1 )); + testFluid->componentNames.emplace_back( componentNames.at( ic ) ); } createArray( testFluid->criticalPressure, components, Fluid::Pc, Fluid::data ); createArray( testFluid->criticalTemperature, components, Fluid::Tc, Fluid::data ); diff --git a/src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp b/src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp new file mode 100644 index 00000000000..7149906eb24 --- /dev/null +++ b/src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp @@ -0,0 +1,376 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" +#include "constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp" +#include "constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp" +#include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" + +using namespace geos::constitutive; +using namespace geos::constitutive::compositional; + +namespace geos +{ +namespace testing +{ + +constexpr integer numTestComps = 3; + +template< integer NC > +using FlashData = std::tuple< + real64 const, // pressure + real64 const, // temperature + Feed< NC > const, // phase composition + real64 const, // expected liquid fraction + real64 const, // expected vapour fraction + real64 const, // expected aqueous fraction + Feed< numTestComps > const, // expected liquid mole fractions + Feed< numTestComps > const, // expected vapour mole fractions + Feed< numTestComps > const // expected aqueous mole fractions + >; + +template< integer NC > +struct FluidData {}; + +template<> +struct FluidData< 3 > +{ + static constexpr integer testComponents[numTestComps] = {0, 1, 2}; + static std::unique_ptr< TestFluid< 3 > > createFluid() + { + auto fluid = TestFluid< 3 >::create( {Fluid::C1, Fluid::C10, Fluid::H2O} ); + const std::array< real64 const, 3 > bics = { 0.25, 0.0, 0.0 }; + fluid->setBinaryCoefficients( bics ); + return fluid; + } +}; + +template<> +struct FluidData< 9 > +{ + static constexpr integer testComponents[numTestComps] = {0, 2, 8}; + static std::unique_ptr< TestFluid< 9 > > createFluid() + { + auto fluid = TestFluid< 9 >::create( {Fluid::H2O, Fluid::CO2, Fluid::N2, Fluid::C5, Fluid::C2, Fluid::C3, Fluid::C4, Fluid::C5, Fluid::C10} ); + const std::array< real64 const, 36 > bics = { + 0.01, 0, 0.003732, 0, 0.01, 0, 0, 0.01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0.01, 0, 0.028, 0.01, 0.01, 0, 0, 0.01, 0, 0.04532, 0.01, 0.01, 0, 0, 0 + }; + fluid->setBinaryCoefficients( bics ); + return fluid; + } +}; + +template< integer NC > +class ImmiscibleWaterFlashModelTestFixture : public ::testing::TestWithParam< FlashData< NC > > +{ + static constexpr real64 relTol = 1.0e-5; + static constexpr real64 absTol = 1.0e-7; + static constexpr integer numPhases = 3; + static constexpr integer numComps = NC; + static constexpr integer numDofs = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; + using PhasePropSlice = ImmiscibleWaterFlashModelUpdate::PhaseProp::SliceType; + using PhaseCompSlice = ImmiscibleWaterFlashModelUpdate::PhaseComp::SliceType; + +public: + ImmiscibleWaterFlashModelTestFixture() + : m_fluid( FluidData< NC >::createFluid() ) + { + ComponentProperties const & componentProperties = this->m_fluid->getComponentProperties(); + + m_parameters = ImmiscibleWaterFlashModel::createParameters( std::move( m_parameters ) ); + + auto * equationOfState = const_cast< EquationOfState * >(m_parameters->get< EquationOfState >()); + string const eosName = EnumStrings< EquationOfStateType >::toString( EquationOfStateType::PengRobinson ); + equationOfState->m_equationsOfStateNames.emplace_back( eosName ); + equationOfState->m_equationsOfStateNames.emplace_back( eosName ); + equationOfState->m_equationsOfStateNames.emplace_back( eosName ); + + m_flash = std::make_unique< ImmiscibleWaterFlashModel >( "FlashModel", componentProperties, *m_parameters ); + } + + ~ImmiscibleWaterFlashModelTestFixture() = default; + + void testFlash( FlashData< NC > const & data ) + { + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > composition; + TestFluid< NC >::createArray( composition, std::get< 2 >( data )); + + real64 const expectedPhaseFraction[numPhases] = {std::get< 3 >( data ), std::get< 4 >( data ), std::get< 5 >( data )}; + Feed< numTestComps > const expectedPhaseComponentFraction[numPhases] = {std::get< 6 >( data ), std::get< 7 >( data ), std::get< 8 >( data ) }; + + stackArray2d< real64, (numPhases-1)*numComps > kValues( numPhases-1, numComps ); + LvArray::forValuesInSlice( kValues.toSlice(), []( real64 & v ){ v = 0.0; } ); + + StackArray< real64, 3, numPhases, multifluid::LAYOUT_PHASE > phaseFractionData( 1, 1, numPhases ); + StackArray< real64, 4, numPhases *numDofs, multifluid::LAYOUT_PHASE_DC > dPhaseFractionData( 1, 1, numPhases, numDofs ); + StackArray< real64, 4, numPhases *numComps, multifluid::LAYOUT_PHASE_COMP > phaseComponentFractionData( 1, 1, numPhases, numComps ); + StackArray< real64, 5, numPhases *numComps *numDofs, multifluid::LAYOUT_PHASE_COMP_DC > dPhaseComponentFractionData( 1, 1, numPhases, numComps, numDofs ); + + auto phaseFraction = phaseFractionData[0][0]; + auto dPhaseFraction = dPhaseFractionData[0][0]; + auto phaseComponentFraction = phaseComponentFractionData[0][0]; + auto dPhaseComponentFraction = dPhaseComponentFractionData[0][0]; + + auto componentProperties = m_fluid->createKernelWrapper(); + auto flashKernelWrapper = m_flash->createKernelWrapper(); + + flashKernelWrapper.compute( componentProperties, + pressure, + temperature, + composition.toSliceConst(), + kValues.toSlice(), + PhasePropSlice( phaseFraction, dPhaseFraction ), + PhaseCompSlice( phaseComponentFraction, dPhaseComponentFraction ) ); + + for( integer ip = 0; ip < numPhases; ip++ ) + { + checkRelativeError( phaseFraction[ip], expectedPhaseFraction[ip], relTol, absTol ); + for( integer i = 0; i < numTestComps; ++i ) + { + integer const ic = FluidData< numComps >::testComponents[i]; + checkRelativeError( phaseComponentFraction[ip][ic], expectedPhaseComponentFraction[ip][i], relTol, absTol ); + } + } + } + + void testFlashDerivatives( FlashData< NC > const & data ) + { + // Number of output values from each flash calculation + constexpr integer numValues = numPhases * (1 + numComps); + + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > composition; + TestFluid< NC >::createArray( composition, std::get< 2 >( data )); + + stackArray2d< real64, (numPhases-1)*numComps > kValues( numPhases-1, numComps ); + LvArray::forValuesInSlice( kValues.toSlice(), []( real64 & v ){ v = 0.0; } ); + + StackArray< real64, 3, numPhases, multifluid::LAYOUT_PHASE > phaseFractionData( 1, 1, numPhases ); + StackArray< real64, 4, numPhases *numDofs, multifluid::LAYOUT_PHASE_DC > dPhaseFractionData( 1, 1, numPhases, numDofs ); + StackArray< real64, 4, numPhases *numComps, multifluid::LAYOUT_PHASE_COMP > phaseComponentFractionData( 1, 1, numPhases, numComps ); + StackArray< real64, 5, numPhases *numComps *numDofs, multifluid::LAYOUT_PHASE_COMP_DC > dPhaseComponentFractionData( 1, 1, numPhases, numComps, numDofs ); + + auto phaseFraction = phaseFractionData[0][0]; + auto dPhaseFraction = dPhaseFractionData[0][0]; + auto phaseComponentFraction = phaseComponentFractionData[0][0]; + auto dPhaseComponentFraction = dPhaseComponentFractionData[0][0]; + + stackArray1d< real64, numValues > derivatives( numValues ); + + auto componentProperties = m_fluid->createKernelWrapper(); + auto flashKernelWrapper = m_flash->createKernelWrapper(); + + flashKernelWrapper.compute( componentProperties, + pressure, + temperature, + composition.toSliceConst(), + kValues.toSlice(), + PhasePropSlice( phaseFraction, dPhaseFraction ), + PhaseCompSlice( phaseComponentFraction, dPhaseComponentFraction ) ); + + // Combine derivatives into a single output + auto const concatDerivatives = []( integer const kc, auto & derivs, auto const & phaseFractionDerivs, auto const & phaseComponentFractionDerivs ){ + integer j = 0; + for( integer ip = 0; ip < numPhases; ++ip ) + { + derivs[j++] = phaseFractionDerivs( ip, kc ); + for( integer ic = 0; ic < numComps; ++ic ) + { + derivs[j++] = phaseComponentFractionDerivs( ip, ic, kc ); + } + } + }; + + auto const evaluateFlash = [&]( real64 const p, real64 const t, auto const & zmf, auto & values ){ + StackArray< real64, 3, numPhases, multifluid::LAYOUT_PHASE > displacedPhaseFractionData( 1, 1, numPhases ); + StackArray< real64, 4, numPhases *numDofs, multifluid::LAYOUT_PHASE_DC > displacedPhaseFractionDerivsData( 1, 1, numPhases, numDofs ); + StackArray< real64, 4, numPhases *numComps, multifluid::LAYOUT_PHASE_COMP > displacedPhaseComponentFractionData( 1, 1, numPhases, numComps ); + StackArray< real64, 5, numPhases *numComps *numDofs, multifluid::LAYOUT_PHASE_COMP_DC > displacedPhaseComponentFractionDerivsData( 1, 1, numPhases, numComps, numDofs ); + + auto displacedPhaseFraction = displacedPhaseFractionData[0][0]; + auto displacedPhaseFractionDerivs = displacedPhaseFractionDerivsData[0][0]; + auto displacedPhaseComponentFraction = displacedPhaseComponentFractionData[0][0]; + auto displacedPhaseComponentFractionDerivs = displacedPhaseComponentFractionDerivsData[0][0]; + + flashKernelWrapper.compute( componentProperties, + p, + t, + zmf, + kValues.toSlice(), + PhasePropSlice( displacedPhaseFraction, displacedPhaseFractionDerivs ), + PhaseCompSlice( displacedPhaseComponentFraction, displacedPhaseComponentFractionDerivs ) ); + integer j = 0; + for( integer ip = 0; ip < numPhases; ++ip ) + { + values[j++] = displacedPhaseFraction[ip]; + for( integer ic = 0; ic < numComps; ++ic ) + { + values[j++] = displacedPhaseComponentFraction( ip, ic ); + } + } + }; + + // Test against numerically calculated values + // --- Pressure derivatives --- + concatDerivatives( Deriv::dP, derivatives, dPhaseFraction, dPhaseComponentFraction ); + real64 const dp = 1.0e-4 * pressure; + geos::testing::internal::testNumericalDerivative< numValues >( + pressure, dp, derivatives, + [&]( real64 const p, auto & values ) { + evaluateFlash( p, temperature, composition.toSliceConst(), values ); + } ); + + // -- Temperature derivative + concatDerivatives( Deriv::dT, derivatives, dPhaseFraction, dPhaseComponentFraction ); + real64 const dT = 1.0e-6 * temperature; + geos::testing::internal::testNumericalDerivative< numValues >( + temperature, dT, derivatives, + [&]( real64 const t, auto & values ) { + evaluateFlash( pressure, t, composition.toSliceConst(), values ); + } ); + + // -- Composition derivatives derivative + real64 const dz = 1.0e-7; + for( integer const ic : FluidData< numComps >::testComponents ) + { + real64 sumZ = 0.0; + for( integer jc = 0; jc < numComps; ++jc ) + { + sumZ += composition[jc]; + } + sumZ -= composition[ic]; + if( sumZ < absTol ) + { + continue; + } + concatDerivatives( Deriv::dC+ic, derivatives, dPhaseFraction, dPhaseComponentFraction ); + geos::testing::internal::testNumericalDerivative< numValues >( + 0.0, dz, derivatives, + [&]( real64 const z, auto & values ) { + stackArray1d< real64, numComps > zmf( numComps ); + for( integer jc = 0; jc < numComps; ++jc ) + { + zmf[jc] = composition[jc]; + } + zmf[ic] += z; + evaluateFlash( pressure, temperature, zmf.toSliceConst(), values ); + } ); + } + } + +protected: + std::unique_ptr< TestFluid< NC > > m_fluid{}; + std::unique_ptr< ImmiscibleWaterFlashModel > m_flash{}; + std::unique_ptr< ModelParameters > m_parameters{}; +}; + +using ImmiscibleWaterFlashModel3 = ImmiscibleWaterFlashModelTestFixture< 3 >; +using ImmiscibleWaterFlashModel9 = ImmiscibleWaterFlashModelTestFixture< 9 >; + +TEST_P( ImmiscibleWaterFlashModel3, testFlash ) +{ + testFlash( GetParam() ); +} +TEST_P( ImmiscibleWaterFlashModel3, testFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +TEST_P( ImmiscibleWaterFlashModel9, testFlash ) +{ + testFlash( GetParam() ); +} +TEST_P( ImmiscibleWaterFlashModel9, testFlashDerivatives ) +{ + testFlashDerivatives( GetParam() ); +} + +//------------------------------------------------------------------------------- +// Data +//------------------------------------------------------------------------------- +/* UNCRUSTIFY-OFF */ + +INSTANTIATE_TEST_SUITE_P( + ImmiscibleWaterFlashModel, ImmiscibleWaterFlashModel3, + ::testing::Values( + FlashData<3>{1.0e+05, 293.15, {0.000000, 0.000000, 1.000000}, 0.000000, 0.000000, 1.000000, {0.500000, 0.500000, 0.000000}, {0.500000, 0.500000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+06, 293.15, {0.000000, 0.000000, 1.000000}, 0.000000, 0.000000, 1.000000, {0.500000, 0.500000, 0.000000}, {0.500000, 0.500000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+07, 293.15, {0.000000, 0.000000, 1.000000}, 0.000000, 0.000000, 1.000000, {0.500000, 0.500000, 0.000000}, {0.500000, 0.500000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+05, 313.15, {0.000000, 0.000000, 1.000000}, 0.000000, 0.000000, 1.000000, {0.500000, 0.500000, 0.000000}, {0.500000, 0.500000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+06, 313.15, {0.000000, 0.000000, 1.000000}, 0.000000, 0.000000, 1.000000, {0.500000, 0.500000, 0.000000}, {0.500000, 0.500000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+07, 313.15, {0.000000, 0.000000, 1.000000}, 0.000000, 0.000000, 1.000000, {0.500000, 0.500000, 0.000000}, {0.500000, 0.500000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+05, 353.15, {0.000000, 0.000000, 1.000000}, 0.000000, 0.000000, 1.000000, {0.500000, 0.500000, 0.000000}, {0.500000, 0.500000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+06, 353.15, {0.000000, 0.000000, 1.000000}, 0.000000, 0.000000, 1.000000, {0.500000, 0.500000, 0.000000}, {0.500000, 0.500000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+07, 353.15, {0.000000, 0.000000, 1.000000}, 0.000000, 0.000000, 1.000000, {0.500000, 0.500000, 0.000000}, {0.500000, 0.500000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+05, 293.15, {0.300000, 0.300000, 0.400000}, 0.300217, 0.299783, 0.400000, {0.000723, 0.999277, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+06, 293.15, {0.300000, 0.300000, 0.400000}, 0.302162, 0.297838, 0.400000, {0.007157, 0.992843, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+07, 293.15, {0.300000, 0.300000, 0.400000}, 0.320811, 0.279189, 0.400000, {0.064871, 0.935129, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+05, 313.15, {0.300000, 0.300000, 0.400000}, 0.300236, 0.299764, 0.400000, {0.000787, 0.999213, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+06, 313.15, {0.300000, 0.300000, 0.400000}, 0.302354, 0.297646, 0.400000, {0.007785, 0.992215, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+07, 313.15, {0.300000, 0.300000, 0.400000}, 0.322797, 0.277203, 0.400000, {0.070623, 0.929377, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+05, 353.15, {0.300000, 0.300000, 0.400000}, 0.300271, 0.299729, 0.400000, {0.000919, 0.999081, 0.000000}, {0.999982, 0.000018, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+06, 353.15, {0.300000, 0.300000, 0.400000}, 0.302753, 0.297247, 0.400000, {0.009094, 0.990906, 0.000000}, {0.999998, 0.000002, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+07, 353.15, {0.300000, 0.300000, 0.400000}, 0.326941, 0.273059, 0.400000, {0.082404, 0.917596, 0.000000}, {0.999999, 0.000001, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+05, 293.15, {0.200000, 0.800000, 0.000000}, 0.800579, 0.199421, 0.000000, {0.000723, 0.999277, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+06, 293.15, {0.200000, 0.800000, 0.000000}, 0.805767, 0.194233, 0.000000, {0.007157, 0.992843, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+07, 293.15, {0.200000, 0.800000, 0.000000}, 0.855497, 0.144503, 0.000000, {0.064871, 0.935129, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+05, 313.15, {0.200000, 0.800000, 0.000000}, 0.800630, 0.199370, 0.000000, {0.000787, 0.999213, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+06, 313.15, {0.200000, 0.800000, 0.000000}, 0.806277, 0.193723, 0.000000, {0.007785, 0.992215, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+07, 313.15, {0.200000, 0.800000, 0.000000}, 0.860791, 0.139209, 0.000000, {0.070623, 0.929377, 0.000000}, {1.000000, 0.000000, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+05, 353.15, {0.200000, 0.800000, 0.000000}, 0.800732, 0.199268, 0.000000, {0.000919, 0.999081, 0.000000}, {0.999982, 0.000018, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+06, 353.15, {0.200000, 0.800000, 0.000000}, 0.807341, 0.192659, 0.000000, {0.009094, 0.990906, 0.000000}, {0.999998, 0.000002, 0.000000}, {0.000000, 0.000000, 1.000000}}, + FlashData<3>{1.0e+07, 353.15, {0.200000, 0.800000, 0.000000}, 0.871843, 0.128157, 0.000000, {0.082404, 0.917596, 0.000000}, {0.999999, 0.000001, 0.000000}, {0.000000, 0.000000, 1.000000}} + ) +); + +INSTANTIATE_TEST_SUITE_P( + ImmiscibleWaterFlashModel, ImmiscibleWaterFlashModel9, + ::testing::Values( + FlashData<9>{1.0e+06, 293.15, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 0.198828, 0.792172, 0.009000, {0.000000, 0.011551, 0.850986}, {0.000000, 0.672081, 0.000000}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+07, 293.15, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 0.307007, 0.683993, 0.009000, {0.000000, 0.111647, 0.551128}, {0.000000, 0.731621, 0.000000}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+08, 293.15, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 0.991000, 0.000000, 0.009000, {0.000000, 0.539556, 0.170737}, {0.000000, 0.539556, 0.170737}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+06, 313.15, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 0.190493, 0.800507, 0.009000, {0.000000, 0.010985, 0.888223}, {0.000000, 0.665337, 0.000000}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+07, 313.15, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 0.288620, 0.702380, 0.009000, {0.000000, 0.106713, 0.586237}, {0.000000, 0.717418, 0.000001}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+08, 313.15, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 0.991000, 0.000000, 0.009000, {0.000000, 0.539556, 0.170737}, {0.000000, 0.539556, 0.170737}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+06, 353.15, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 0.181787, 0.809213, 0.009000, {0.000000, 0.010453, 0.930750}, {0.000000, 0.658417, 0.000003}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+07, 353.15, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 0.261660, 0.729340, 0.009000, {0.000000, 0.101277, 0.646622}, {0.000000, 0.696794, 0.000007}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+08, 353.15, {0.009000, 0.003000, 0.534700, 0.114600, 0.087900, 0.045600, 0.020900, 0.015100, 0.169200}, 0.947424, 0.043576, 0.009000, {0.000000, 0.529993, 0.178339}, {0.000000, 0.747468, 0.005438}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+06, 293.15, {0.400000, 0.001820, 0.323730, 0.069380, 0.053220, 0.027610, 0.012650, 0.009140, 0.102450}, 0.120388, 0.479612, 0.400000, {0.000000, 0.011551, 0.850996}, {0.000000, 0.672084, 0.000000}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+07, 293.15, {0.400000, 0.001820, 0.323730, 0.069380, 0.053220, 0.027610, 0.012650, 0.009140, 0.102450}, 0.185888, 0.414112, 0.400000, {0.000000, 0.111648, 0.551139}, {0.000000, 0.731628, 0.000000}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+08, 293.15, {0.400000, 0.001820, 0.323730, 0.069380, 0.053220, 0.027610, 0.012650, 0.009140, 0.102450}, 0.600000, 0.000000, 0.400000, {0.000000, 0.539550, 0.170750}, {0.000000, 0.539550, 0.170750}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+06, 313.15, {0.400000, 0.001820, 0.323730, 0.069380, 0.053220, 0.027610, 0.012650, 0.009140, 0.102450}, 0.115342, 0.484658, 0.400000, {0.000000, 0.010985, 0.888229}, {0.000000, 0.665341, 0.000000}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+07, 313.15, {0.400000, 0.001820, 0.323730, 0.069380, 0.053220, 0.027610, 0.012650, 0.009140, 0.102450}, 0.174755, 0.425245, 0.400000, {0.000000, 0.106714, 0.586247}, {0.000000, 0.717425, 0.000001}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+08, 313.15, {0.400000, 0.001820, 0.323730, 0.069380, 0.053220, 0.027610, 0.012650, 0.009140, 0.102450}, 0.600000, 0.000000, 0.400000, {0.000000, 0.539550, 0.170750}, {0.000000, 0.539550, 0.170750}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+06, 353.15, {0.400000, 0.001820, 0.323730, 0.069380, 0.053220, 0.027610, 0.012650, 0.009140, 0.102450}, 0.110071, 0.489929, 0.400000, {0.000000, 0.010453, 0.930753}, {0.000000, 0.658421, 0.000003}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+07, 353.15, {0.400000, 0.001820, 0.323730, 0.069380, 0.053220, 0.027610, 0.012650, 0.009140, 0.102450}, 0.158432, 0.441568, 0.400000, {0.000000, 0.101278, 0.646630}, {0.000000, 0.696800, 0.000007}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+08, 353.15, {0.400000, 0.001820, 0.323730, 0.069380, 0.053220, 0.027610, 0.012650, 0.009140, 0.102450}, 0.573644, 0.026356, 0.400000, {0.000000, 0.529997, 0.178345}, {0.000000, 0.747479, 0.005437}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+06, 313.15, {1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000}, 0.000000, 0.000000, 1.000000, {0.000000, 0.125000, 0.125000}, {0.000000, 0.125000, 0.125000}, {1.000000, 0.000000, 0.000000}}, + FlashData<9>{1.0e+08, 353.15, {1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000}, 0.000000, 0.000000, 1.000000, {0.000000, 0.125000, 0.125000}, {0.000000, 0.125000, 0.125000}, {1.000000, 0.000000, 0.000000}} + ) +); + +/* UNCRUSTIFY-ON */ + +} // testing + +} // geos From 7ee7110c2dc75e7f646cdcc77e14afab5edbdb21 Mon Sep 17 00:00:00 2001 From: Herve Gross <40979822+herve-gross@users.noreply.github.com> Date: Fri, 30 Aug 2024 09:57:36 -0700 Subject: [PATCH 175/286] docs: Update COPYRIGHT (#3317) * Correct error in COPYRIGHT statement --------- Co-authored-by: Randolph Settgast --- COPYRIGHT | 2 +- examples/ObjectCatalog/Base.hpp | 2 +- examples/ObjectCatalog/Derived1.cpp | 2 +- examples/ObjectCatalog/Derived1.hpp | 2 +- examples/ObjectCatalog/Derived2.hpp | 2 +- examples/ObjectCatalog/main.cpp | 2 +- scripts/copyrightPrepender.py | 2 +- src/coreComponents/codingUtilities/EnumStrings.hpp | 2 +- src/coreComponents/codingUtilities/Parsing.cpp | 2 +- src/coreComponents/codingUtilities/Parsing.hpp | 2 +- src/coreComponents/codingUtilities/RTTypes.cpp | 2 +- src/coreComponents/codingUtilities/RTTypes.hpp | 2 +- src/coreComponents/codingUtilities/SFINAE_Macros.hpp | 2 +- src/coreComponents/codingUtilities/UnitTestUtilities.hpp | 2 +- src/coreComponents/codingUtilities/Utilities.hpp | 2 +- src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp | 2 +- .../codingUtilities/tests/testParallelTestUtilities.cpp | 2 +- src/coreComponents/codingUtilities/tests/testParsing.cpp | 2 +- src/coreComponents/codingUtilities/tests/testUtilities.cpp | 2 +- src/coreComponents/codingUtilities/traits.hpp | 2 +- src/coreComponents/common/BufferAllocator.cpp | 2 +- src/coreComponents/common/BufferAllocator.hpp | 2 +- src/coreComponents/common/DataLayouts.hpp | 2 +- src/coreComponents/common/DataTypes.hpp | 2 +- src/coreComponents/common/FieldSpecificationOps.hpp | 2 +- src/coreComponents/common/FixedSizeDeque.hpp | 2 +- src/coreComponents/common/FixedSizeDequeWithMutexes.hpp | 2 +- src/coreComponents/common/GEOS_RAJA_Interface.hpp | 2 +- src/coreComponents/common/GeosxConfig.hpp.in | 2 +- src/coreComponents/common/GeosxMacros.hpp | 2 +- src/coreComponents/common/LifoStorage.hpp | 2 +- src/coreComponents/common/LifoStorageCommon.hpp | 2 +- src/coreComponents/common/LifoStorageCuda.hpp | 2 +- src/coreComponents/common/LifoStorageHost.hpp | 2 +- src/coreComponents/common/MemoryInfos.cpp | 2 +- src/coreComponents/common/MemoryInfos.hpp | 2 +- src/coreComponents/common/MpiWrapper.cpp | 2 +- src/coreComponents/common/MpiWrapper.hpp | 2 +- src/coreComponents/common/MultiMutexesLock.hpp | 2 +- src/coreComponents/common/Path.cpp | 2 +- src/coreComponents/common/Path.hpp | 2 +- src/coreComponents/common/PhysicsConstants.hpp | 2 +- src/coreComponents/common/Span.hpp | 2 +- src/coreComponents/common/Stopwatch.hpp | 2 +- src/coreComponents/common/Tensor.hpp | 2 +- src/coreComponents/common/Timer.hpp | 2 +- src/coreComponents/common/TimingMacros.hpp | 2 +- src/coreComponents/common/TypeDispatch.hpp | 2 +- src/coreComponents/common/Units.cpp | 2 +- src/coreComponents/common/Units.hpp | 2 +- src/coreComponents/common/format/Format.hpp | 2 +- src/coreComponents/common/format/StringUtilities.cpp | 2 +- src/coreComponents/common/format/StringUtilities.hpp | 2 +- src/coreComponents/common/format/table/TableData.cpp | 2 +- src/coreComponents/common/format/table/TableData.hpp | 2 +- src/coreComponents/common/format/table/TableFormatter.cpp | 2 +- src/coreComponents/common/format/table/TableFormatter.hpp | 2 +- src/coreComponents/common/format/table/TableLayout.cpp | 2 +- src/coreComponents/common/format/table/TableLayout.hpp | 2 +- src/coreComponents/common/format/table/unitTests/testTable.cpp | 2 +- .../common/format/unitTests/testStringUtilities.cpp | 2 +- src/coreComponents/common/initializeEnvironment.cpp | 2 +- src/coreComponents/common/initializeEnvironment.hpp | 2 +- src/coreComponents/common/logger/Logger.cpp | 2 +- src/coreComponents/common/logger/Logger.hpp | 2 +- src/coreComponents/common/unitTests/testCaliperSmoke.cpp | 2 +- src/coreComponents/common/unitTests/testDataTypes.cpp | 2 +- src/coreComponents/common/unitTests/testFixedSizeDeque.cpp | 2 +- src/coreComponents/common/unitTests/testLifoStorage.cpp | 2 +- src/coreComponents/common/unitTests/testTypeDispatch.cpp | 2 +- src/coreComponents/common/unitTests/testUnits.cpp | 2 +- src/coreComponents/constitutive/ConstitutiveBase.cpp | 2 +- src/coreComponents/constitutive/ConstitutiveBase.hpp | 2 +- src/coreComponents/constitutive/ConstitutiveManager.cpp | 2 +- src/coreComponents/constitutive/ConstitutiveManager.hpp | 2 +- src/coreComponents/constitutive/ConstitutivePassThru.hpp | 2 +- src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp | 2 +- src/coreComponents/constitutive/ExponentialRelation.hpp | 2 +- src/coreComponents/constitutive/NullModel.cpp | 2 +- src/coreComponents/constitutive/NullModel.hpp | 2 +- .../capillaryPressure/BrooksCoreyCapillaryPressure.cpp | 2 +- .../capillaryPressure/BrooksCoreyCapillaryPressure.hpp | 2 +- .../constitutive/capillaryPressure/CapillaryPressureBase.cpp | 2 +- .../constitutive/capillaryPressure/CapillaryPressureBase.hpp | 2 +- .../constitutive/capillaryPressure/CapillaryPressureFields.hpp | 2 +- .../capillaryPressure/JFunctionCapillaryPressure.cpp | 2 +- .../capillaryPressure/JFunctionCapillaryPressure.hpp | 2 +- .../constitutive/capillaryPressure/TableCapillaryPressure.cpp | 2 +- .../constitutive/capillaryPressure/TableCapillaryPressure.hpp | 2 +- .../capillaryPressure/TableCapillaryPressureHelpers.cpp | 2 +- .../capillaryPressure/TableCapillaryPressureHelpers.hpp | 2 +- .../capillaryPressure/VanGenuchtenCapillaryPressure.cpp | 2 +- .../capillaryPressure/VanGenuchtenCapillaryPressure.hpp | 2 +- .../capillaryPressure/capillaryPressureSelector.hpp | 2 +- src/coreComponents/constitutive/capillaryPressure/layouts.hpp | 2 +- src/coreComponents/constitutive/contact/CoulombFriction.cpp | 2 +- src/coreComponents/constitutive/contact/CoulombFriction.hpp | 2 +- src/coreComponents/constitutive/contact/FrictionSelector.hpp | 2 +- src/coreComponents/constitutive/contact/FrictionlessContact.cpp | 2 +- src/coreComponents/constitutive/contact/FrictionlessContact.hpp | 2 +- .../constitutive/contact/HydraulicApertureTable.cpp | 2 +- .../constitutive/contact/HydraulicApertureTable.hpp | 2 +- src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp | 2 +- src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp | 2 +- src/coreComponents/constitutive/diffusion/DiffusionBase.cpp | 2 +- src/coreComponents/constitutive/diffusion/DiffusionBase.hpp | 2 +- src/coreComponents/constitutive/diffusion/DiffusionFields.hpp | 2 +- src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp | 2 +- src/coreComponents/constitutive/dispersion/DispersionBase.cpp | 2 +- src/coreComponents/constitutive/dispersion/DispersionBase.hpp | 2 +- src/coreComponents/constitutive/dispersion/DispersionFields.hpp | 2 +- .../constitutive/dispersion/DispersionSelector.hpp | 2 +- .../constitutive/dispersion/LinearIsotropicDispersion.cpp | 2 +- .../constitutive/dispersion/LinearIsotropicDispersion.hpp | 2 +- .../constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp | 2 +- .../constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp | 2 +- .../constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp | 2 +- .../fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp | 2 +- .../fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp | 2 +- .../fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp | 2 +- .../fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp | 2 +- .../fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp | 2 +- .../fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp | 2 +- .../fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp | 2 +- .../fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp | 2 +- .../multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp | 2 +- .../multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp | 2 +- .../CO2Brine/functions/CO2SolubilitySpycherPruess.cpp | 2 +- .../CO2Brine/functions/CO2SolubilitySpycherPruess.hpp | 2 +- .../fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp | 2 +- .../fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp | 2 +- .../multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp | 2 +- .../multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp | 2 +- .../multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp | 2 +- .../multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp | 2 +- .../fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp | 2 +- .../fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp | 2 +- .../fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp | 2 +- .../fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp | 2 +- .../fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp | 2 +- .../multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp | 2 +- .../multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp | 2 +- .../multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp | 2 +- .../multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp | 2 +- .../fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp | 2 +- .../fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp | 2 +- .../multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp | 2 +- .../multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp | 2 +- .../fluid/multifluid/CO2Brine/functions/WaterDensity.cpp | 2 +- .../fluid/multifluid/CO2Brine/functions/WaterDensity.hpp | 2 +- src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp | 2 +- .../constitutive/fluid/multifluid/MultiFluidBase.cpp | 2 +- .../constitutive/fluid/multifluid/MultiFluidBase.hpp | 2 +- .../constitutive/fluid/multifluid/MultiFluidConstants.hpp | 2 +- .../constitutive/fluid/multifluid/MultiFluidFields.hpp | 2 +- .../constitutive/fluid/multifluid/MultiFluidSelector.hpp | 2 +- .../constitutive/fluid/multifluid/MultiFluidUtils.hpp | 2 +- .../constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp | 2 +- .../constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp | 2 +- .../fluid/multifluid/blackOil/BlackOilFluidBase.cpp | 2 +- .../fluid/multifluid/blackOil/BlackOilFluidBase.hpp | 2 +- .../constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp | 2 +- .../constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp | 2 +- .../constitutive/fluid/multifluid/blackOil/PVTOData.cpp | 2 +- .../constitutive/fluid/multifluid/blackOil/PVTOData.hpp | 2 +- .../multifluid/compositional/CompositionalMultiphaseFluid.cpp | 2 +- .../multifluid/compositional/CompositionalMultiphaseFluid.hpp | 2 +- .../compositional/CompositionalMultiphaseFluidPVTPackage.cpp | 2 +- .../compositional/CompositionalMultiphaseFluidPVTPackage.hpp | 2 +- .../compositional/CompositionalMultiphaseFluidUpdates.cpp | 2 +- .../compositional/CompositionalMultiphaseFluidUpdates.hpp | 2 +- .../compositional/functions/CompositionalProperties.hpp | 2 +- .../compositional/functions/CompositionalPropertiesImpl.hpp | 2 +- .../multifluid/compositional/functions/CubicEOSPhaseModel.hpp | 2 +- .../multifluid/compositional/functions/FugacityCalculator.hpp | 2 +- .../multifluid/compositional/functions/KValueInitialization.hpp | 2 +- .../compositional/functions/NegativeTwoPhaseFlash.hpp | 2 +- .../fluid/multifluid/compositional/functions/RachfordRice.hpp | 2 +- .../fluid/multifluid/compositional/functions/StabilityTest.hpp | 2 +- .../multifluid/compositional/models/ComponentProperties.hpp | 2 +- .../multifluid/compositional/models/CompositionalDensity.cpp | 2 +- .../multifluid/compositional/models/CompositionalDensity.hpp | 2 +- .../fluid/multifluid/compositional/models/ConstantViscosity.cpp | 2 +- .../fluid/multifluid/compositional/models/ConstantViscosity.hpp | 2 +- .../fluid/multifluid/compositional/models/EquationOfState.hpp | 2 +- .../fluid/multifluid/compositional/models/FunctionBase.hpp | 2 +- .../compositional/models/ImmiscibleWaterFlashModel.cpp | 2 +- .../compositional/models/ImmiscibleWaterFlashModel.hpp | 2 +- .../compositional/models/ImmiscibleWaterParameters.cpp | 2 +- .../compositional/models/ImmiscibleWaterParameters.hpp | 2 +- .../compositional/models/LohrenzBrayClarkViscosity.cpp | 2 +- .../compositional/models/LohrenzBrayClarkViscosity.hpp | 2 +- .../compositional/models/LohrenzBrayClarkViscosityImpl.hpp | 2 +- .../fluid/multifluid/compositional/models/ModelParameters.hpp | 2 +- .../compositional/models/NegativeTwoPhaseFlashModel.cpp | 2 +- .../compositional/models/NegativeTwoPhaseFlashModel.hpp | 2 +- .../fluid/multifluid/compositional/models/NullModel.hpp | 2 +- .../fluid/multifluid/compositional/models/PhaseModel.hpp | 2 +- .../fluid/multifluid/reactive/ReactiveBrineFluid.cpp | 2 +- .../fluid/multifluid/reactive/ReactiveBrineFluid.hpp | 2 +- .../fluid/multifluid/reactive/ReactiveFluidSelector.hpp | 2 +- .../fluid/multifluid/reactive/ReactiveMultiFluid.cpp | 2 +- .../fluid/multifluid/reactive/ReactiveMultiFluid.hpp | 2 +- .../fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp | 2 +- .../reactive/chemicalReactions/EquilibriumReactions.cpp | 2 +- .../reactive/chemicalReactions/EquilibriumReactions.hpp | 2 +- .../multifluid/reactive/chemicalReactions/KineticReactions.cpp | 2 +- .../multifluid/reactive/chemicalReactions/KineticReactions.hpp | 2 +- .../multifluid/reactive/chemicalReactions/ReactionsBase.cpp | 2 +- .../multifluid/reactive/chemicalReactions/ReactionsBase.hpp | 2 +- .../fluid/singlefluid/CompressibleSinglePhaseFluid.cpp | 2 +- .../fluid/singlefluid/CompressibleSinglePhaseFluid.hpp | 2 +- .../constitutive/fluid/singlefluid/ParticleFluid.cpp | 2 +- .../constitutive/fluid/singlefluid/ParticleFluid.hpp | 2 +- .../constitutive/fluid/singlefluid/ParticleFluidBase.cpp | 2 +- .../constitutive/fluid/singlefluid/ParticleFluidBase.hpp | 2 +- .../constitutive/fluid/singlefluid/ParticleFluidFields.hpp | 2 +- .../constitutive/fluid/singlefluid/ParticleFluidSelector.hpp | 2 +- .../constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp | 2 +- .../constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp | 2 +- .../constitutive/fluid/singlefluid/SingleFluidBase.cpp | 2 +- .../constitutive/fluid/singlefluid/SingleFluidBase.hpp | 2 +- .../constitutive/fluid/singlefluid/SingleFluidFields.hpp | 2 +- .../constitutive/fluid/singlefluid/SingleFluidSelector.hpp | 2 +- .../constitutive/fluid/singlefluid/SlurryFluidBase.cpp | 2 +- .../constitutive/fluid/singlefluid/SlurryFluidBase.hpp | 2 +- .../constitutive/fluid/singlefluid/SlurryFluidFields.hpp | 2 +- .../constitutive/fluid/singlefluid/SlurryFluidSelector.hpp | 2 +- .../fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp | 2 +- .../fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp | 2 +- .../constitutive/permeability/CarmanKozenyPermeability.cpp | 2 +- .../constitutive/permeability/CarmanKozenyPermeability.hpp | 2 +- .../constitutive/permeability/ConstantPermeability.cpp | 2 +- .../constitutive/permeability/ConstantPermeability.hpp | 2 +- .../constitutive/permeability/ExponentialDecayPermeability.cpp | 2 +- .../constitutive/permeability/ExponentialDecayPermeability.hpp | 2 +- .../constitutive/permeability/ParallelPlatesPermeability.cpp | 2 +- .../constitutive/permeability/ParallelPlatesPermeability.hpp | 2 +- .../constitutive/permeability/PermeabilityBase.cpp | 2 +- .../constitutive/permeability/PermeabilityBase.hpp | 2 +- .../constitutive/permeability/PermeabilityFields.hpp | 2 +- .../constitutive/permeability/PressurePermeability.cpp | 2 +- .../constitutive/permeability/PressurePermeability.hpp | 2 +- .../constitutive/permeability/ProppantPermeability.cpp | 2 +- .../constitutive/permeability/ProppantPermeability.hpp | 2 +- .../constitutive/permeability/SlipDependentPermeability.cpp | 2 +- .../constitutive/permeability/SlipDependentPermeability.hpp | 2 +- .../constitutive/permeability/WillisRichardsPermeability.cpp | 2 +- .../constitutive/permeability/WillisRichardsPermeability.hpp | 2 +- .../BrooksCoreyBakerRelativePermeability.cpp | 2 +- .../BrooksCoreyBakerRelativePermeability.hpp | 2 +- .../relativePermeability/BrooksCoreyRelativePermeability.cpp | 2 +- .../relativePermeability/BrooksCoreyRelativePermeability.hpp | 2 +- .../BrooksCoreyStone2RelativePermeability.cpp | 2 +- .../BrooksCoreyStone2RelativePermeability.hpp | 2 +- .../relativePermeability/RelativePermeabilityBase.cpp | 2 +- .../relativePermeability/RelativePermeabilityBase.hpp | 2 +- .../relativePermeability/RelativePermeabilityFields.hpp | 2 +- .../relativePermeability/RelativePermeabilityInterpolators.hpp | 2 +- .../relativePermeability/RelativePermeabilitySelector.hpp | 2 +- .../relativePermeability/TableRelativePermeability.cpp | 2 +- .../relativePermeability/TableRelativePermeability.hpp | 2 +- .../relativePermeability/TableRelativePermeabilityHelpers.cpp | 2 +- .../relativePermeability/TableRelativePermeabilityHelpers.hpp | 2 +- .../TableRelativePermeabilityHysteresis.cpp | 2 +- .../TableRelativePermeabilityHysteresis.hpp | 2 +- .../VanGenuchtenBakerRelativePermeability.cpp | 2 +- .../VanGenuchtenBakerRelativePermeability.hpp | 2 +- .../VanGenuchtenStone2RelativePermeability.cpp | 2 +- .../VanGenuchtenStone2RelativePermeability.hpp | 2 +- .../constitutive/relativePermeability/layouts.hpp | 2 +- src/coreComponents/constitutive/solid/CeramicDamage.cpp | 2 +- src/coreComponents/constitutive/solid/CeramicDamage.hpp | 2 +- src/coreComponents/constitutive/solid/CompressibleSolid.cpp | 2 +- src/coreComponents/constitutive/solid/CompressibleSolid.hpp | 2 +- src/coreComponents/constitutive/solid/CoupledSolid.hpp | 2 +- src/coreComponents/constitutive/solid/CoupledSolidBase.cpp | 2 +- src/coreComponents/constitutive/solid/CoupledSolidBase.hpp | 2 +- src/coreComponents/constitutive/solid/Damage.cpp | 2 +- src/coreComponents/constitutive/solid/Damage.hpp | 2 +- src/coreComponents/constitutive/solid/DamageSpectral.cpp | 2 +- src/coreComponents/constitutive/solid/DamageSpectral.hpp | 2 +- .../constitutive/solid/DamageSpectralUtilities.hpp | 2 +- src/coreComponents/constitutive/solid/DamageVolDev.cpp | 2 +- src/coreComponents/constitutive/solid/DamageVolDev.hpp | 2 +- src/coreComponents/constitutive/solid/DelftEgg.cpp | 2 +- src/coreComponents/constitutive/solid/DelftEgg.hpp | 2 +- .../solid/Deprecated/PoreVolumeCompressibleSolid.cpp | 2 +- .../solid/Deprecated/PoreVolumeCompressibleSolid.hpp | 2 +- .../constitutive/solid/Deprecated/PoroElastic.cpp | 2 +- .../constitutive/solid/Deprecated/PoroElastic.hpp | 2 +- src/coreComponents/constitutive/solid/DruckerPrager.cpp | 2 +- src/coreComponents/constitutive/solid/DruckerPrager.hpp | 2 +- src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp | 2 +- src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp | 2 +- src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp | 2 +- src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp | 2 +- src/coreComponents/constitutive/solid/ElasticIsotropic.cpp | 2 +- src/coreComponents/constitutive/solid/ElasticIsotropic.hpp | 2 +- .../constitutive/solid/ElasticIsotropicPressureDependent.cpp | 2 +- .../constitutive/solid/ElasticIsotropicPressureDependent.hpp | 2 +- src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp | 2 +- src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp | 2 +- .../constitutive/solid/ElasticTransverseIsotropic.cpp | 2 +- .../constitutive/solid/ElasticTransverseIsotropic.hpp | 2 +- .../constitutive/solid/InvariantDecompositions.hpp | 2 +- src/coreComponents/constitutive/solid/ModifiedCamClay.cpp | 2 +- src/coreComponents/constitutive/solid/ModifiedCamClay.hpp | 2 +- src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp | 2 +- src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp | 2 +- src/coreComponents/constitutive/solid/PorousSolid.cpp | 2 +- src/coreComponents/constitutive/solid/PorousSolid.hpp | 2 +- src/coreComponents/constitutive/solid/PropertyConversions.hpp | 2 +- src/coreComponents/constitutive/solid/ProppantSolid.cpp | 2 +- src/coreComponents/constitutive/solid/ProppantSolid.hpp | 2 +- src/coreComponents/constitutive/solid/SolidBase.cpp | 2 +- src/coreComponents/constitutive/solid/SolidBase.hpp | 2 +- src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp | 2 +- src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp | 2 +- .../constitutive/solid/SolidModelDiscretizationOps.hpp | 2 +- .../solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp | 2 +- .../constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp | 2 +- .../solid/SolidModelDiscretizationOpsOrthotropic.hpp | 2 +- .../solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp | 2 +- src/coreComponents/constitutive/solid/SolidUtilities.hpp | 2 +- src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp | 2 +- src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp | 2 +- src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp | 2 +- src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp | 2 +- .../constitutive/solid/porosity/PorosityFields.hpp | 2 +- .../constitutive/solid/porosity/PressurePorosity.cpp | 2 +- .../constitutive/solid/porosity/PressurePorosity.hpp | 2 +- .../constitutive/solid/porosity/ProppantPorosity.cpp | 2 +- .../constitutive/solid/porosity/ProppantPorosity.hpp | 2 +- .../MultiPhaseConstantThermalConductivity.cpp | 2 +- .../MultiPhaseConstantThermalConductivity.hpp | 2 +- .../thermalConductivity/MultiPhaseThermalConductivityBase.cpp | 2 +- .../thermalConductivity/MultiPhaseThermalConductivityBase.hpp | 2 +- .../thermalConductivity/MultiPhaseThermalConductivityFields.hpp | 2 +- .../MultiPhaseThermalConductivitySelector.hpp | 2 +- .../MultiPhaseVolumeWeightedThermalConductivity.cpp | 2 +- .../MultiPhaseVolumeWeightedThermalConductivity.hpp | 2 +- .../SinglePhaseConstantThermalConductivity.cpp | 2 +- .../SinglePhaseConstantThermalConductivity.hpp | 2 +- .../thermalConductivity/SinglePhaseThermalConductivityBase.cpp | 2 +- .../thermalConductivity/SinglePhaseThermalConductivityBase.hpp | 2 +- .../SinglePhaseThermalConductivityFields.hpp | 2 +- .../SinglePhaseThermalConductivitySelector.hpp | 2 +- .../thermalConductivity/ThermalConductivityFields.hpp | 2 +- src/coreComponents/constitutive/unitTests/TestFluid.hpp | 2 +- .../constitutive/unitTests/TestFluidUtilities.hpp | 2 +- .../constitutive/unitTests/testCompositionalDensity.cpp | 2 +- .../constitutive/unitTests/testCompositionalProperties.cpp | 2 +- src/coreComponents/constitutive/unitTests/testCubicEOS.cpp | 2 +- .../constitutive/unitTests/testDamageUtilities.cpp | 2 +- src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp | 2 +- .../constitutive/unitTests/testElasticIsotropic.cpp | 2 +- .../constitutive/unitTests/testImmiscibleWaterFlashModel.cpp | 2 +- .../constitutive/unitTests/testKValueInitialization.cpp | 2 +- .../constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp | 2 +- .../constitutive/unitTests/testModifiedCamClay.cpp | 2 +- .../constitutive/unitTests/testNegativeTwoPhaseFlash.cpp | 2 +- .../constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp | 2 +- .../constitutive/unitTests/testParticleFluidEnums.cpp | 2 +- .../constitutive/unitTests/testPropertyConversions.cpp | 2 +- src/coreComponents/constitutive/unitTests/testRachfordRice.cpp | 2 +- .../constitutive/unitTests/testStabilityTest2Comp.cpp | 2 +- .../constitutive/unitTests/testStabilityTest9Comp.cpp | 2 +- src/coreComponents/constitutive/unitTests/testTriaxial.cpp | 2 +- .../CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp | 2 +- .../CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp | 2 +- .../CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp | 2 +- .../CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp | 2 +- .../constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp | 2 +- .../constitutiveDrivers/fluid/multiFluid/PVTDriver.hpp | 2 +- .../constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp | 2 +- .../fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp | 2 +- .../PVTDriverRunTestCompositionalMultiphaseFluid.cpp | 2 +- .../PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp | 2 +- ...verRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp | 2 +- .../fluid/multiFluid/reactive/ReactiveFluidDriver.cpp | 2 +- .../fluid/multiFluid/reactive/ReactiveFluidDriver.hpp | 2 +- .../constitutiveDrivers/relativePermeability/RelpermDriver.cpp | 2 +- .../constitutiveDrivers/relativePermeability/RelpermDriver.hpp | 2 +- .../RelpermDriverBrooksCoreyBakerRunTest.cpp | 2 +- .../relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp | 2 +- .../RelpermDriverBrooksCoreyStone2RunTest.cpp | 2 +- .../relativePermeability/RelpermDriverRunTest.hpp | 2 +- .../RelpermDriverTableRelativeHysteresisRunTest.cpp | 2 +- .../relativePermeability/RelpermDriverTableRelativeRunTest.cpp | 2 +- .../RelpermDriverVanGenuchtenBakerRunTest.cpp | 2 +- .../RelpermDriverVanGenuchtenStone2RunTest.cpp | 2 +- src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp | 2 +- src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.hpp | 2 +- src/coreComponents/dataRepository/BufferOps.hpp | 2 +- src/coreComponents/dataRepository/BufferOpsDevice.cpp | 2 +- src/coreComponents/dataRepository/BufferOpsDevice.hpp | 2 +- src/coreComponents/dataRepository/BufferOps_inline.hpp | 2 +- src/coreComponents/dataRepository/ConduitRestart.cpp | 2 +- src/coreComponents/dataRepository/ConduitRestart.hpp | 2 +- src/coreComponents/dataRepository/DataContext.cpp | 2 +- src/coreComponents/dataRepository/DataContext.hpp | 2 +- src/coreComponents/dataRepository/DefaultValue.hpp | 2 +- src/coreComponents/dataRepository/ExecutableGroup.cpp | 2 +- src/coreComponents/dataRepository/ExecutableGroup.hpp | 2 +- src/coreComponents/dataRepository/Group.cpp | 2 +- src/coreComponents/dataRepository/Group.hpp | 2 +- src/coreComponents/dataRepository/GroupContext.cpp | 2 +- src/coreComponents/dataRepository/GroupContext.hpp | 2 +- src/coreComponents/dataRepository/HistoryDataSpec.hpp | 2 +- src/coreComponents/dataRepository/InputFlags.hpp | 2 +- src/coreComponents/dataRepository/KeyIndexT.hpp | 2 +- src/coreComponents/dataRepository/KeyNames.hpp | 2 +- src/coreComponents/dataRepository/MappedVector.hpp | 2 +- src/coreComponents/dataRepository/ObjectCatalog.hpp | 2 +- src/coreComponents/dataRepository/ReferenceWrapper.hpp | 2 +- src/coreComponents/dataRepository/RestartFlags.hpp | 2 +- src/coreComponents/dataRepository/Utilities.cpp | 2 +- src/coreComponents/dataRepository/Utilities.hpp | 2 +- src/coreComponents/dataRepository/Wrapper.hpp | 2 +- src/coreComponents/dataRepository/WrapperBase.cpp | 2 +- src/coreComponents/dataRepository/WrapperBase.hpp | 2 +- src/coreComponents/dataRepository/WrapperContext.cpp | 2 +- src/coreComponents/dataRepository/WrapperContext.hpp | 2 +- src/coreComponents/dataRepository/python/PyGroup.cpp | 2 +- src/coreComponents/dataRepository/python/PyGroup.hpp | 2 +- src/coreComponents/dataRepository/python/PyGroupType.hpp | 2 +- src/coreComponents/dataRepository/python/PyWrapper.cpp | 2 +- src/coreComponents/dataRepository/python/PyWrapper.hpp | 2 +- src/coreComponents/dataRepository/unitTests/testBufferOps.cpp | 2 +- .../dataRepository/unitTests/testDefaultValue.cpp | 2 +- src/coreComponents/dataRepository/unitTests/testPacking.cpp | 2 +- .../dataRepository/unitTests/testReferenceWrapper.cpp | 2 +- src/coreComponents/dataRepository/unitTests/testWrapper.cpp | 2 +- src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp | 2 +- src/coreComponents/dataRepository/wrapperHelpers.hpp | 2 +- src/coreComponents/dataRepository/xmlWrapper.cpp | 2 +- src/coreComponents/dataRepository/xmlWrapper.hpp | 2 +- src/coreComponents/denseLinearAlgebra/common/layouts.hpp | 2 +- src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp | 2 +- .../interfaces/blaslapack/BlasLapackFunctions.h | 2 +- .../denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp | 2 +- .../denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp | 2 +- .../denseLinearAlgebra/unitTests/testBlasLapack.cpp | 2 +- .../denseLinearAlgebra/unitTests/testDenseLASolvers.cpp | 2 +- .../denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp | 2 +- .../discretizationMethods/NumericalMethodsManager.cpp | 2 +- .../discretizationMethods/NumericalMethodsManager.hpp | 2 +- src/coreComponents/dummy.cpp | 2 +- src/coreComponents/events/EventBase.cpp | 2 +- src/coreComponents/events/EventBase.hpp | 2 +- src/coreComponents/events/EventManager.cpp | 2 +- src/coreComponents/events/EventManager.hpp | 2 +- src/coreComponents/events/HaltEvent.cpp | 2 +- src/coreComponents/events/HaltEvent.hpp | 2 +- src/coreComponents/events/PeriodicEvent.cpp | 2 +- src/coreComponents/events/PeriodicEvent.hpp | 2 +- src/coreComponents/events/SoloEvent.cpp | 2 +- src/coreComponents/events/SoloEvent.hpp | 2 +- src/coreComponents/events/tasks/TaskBase.cpp | 2 +- src/coreComponents/events/tasks/TaskBase.hpp | 2 +- src/coreComponents/events/tasks/TasksManager.cpp | 2 +- src/coreComponents/events/tasks/TasksManager.hpp | 2 +- .../fieldSpecification/AquiferBoundaryCondition.cpp | 2 +- .../fieldSpecification/AquiferBoundaryCondition.hpp | 2 +- .../fieldSpecification/DirichletBoundaryCondition.cpp | 2 +- .../fieldSpecification/DirichletBoundaryCondition.hpp | 2 +- .../fieldSpecification/EquilibriumInitialCondition.cpp | 2 +- .../fieldSpecification/EquilibriumInitialCondition.hpp | 2 +- .../fieldSpecification/FieldSpecificationBase.cpp | 2 +- .../fieldSpecification/FieldSpecificationBase.hpp | 2 +- .../fieldSpecification/FieldSpecificationManager.cpp | 2 +- .../fieldSpecification/FieldSpecificationManager.hpp | 2 +- src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp | 2 +- src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp | 2 +- .../fieldSpecification/SourceFluxBoundaryCondition.cpp | 2 +- .../fieldSpecification/SourceFluxBoundaryCondition.hpp | 2 +- .../fieldSpecification/TractionBoundaryCondition.cpp | 2 +- .../fieldSpecification/TractionBoundaryCondition.hpp | 2 +- src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp | 2 +- src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp | 2 +- src/coreComponents/fileIO/Outputs/ChomboIO.cpp | 2 +- src/coreComponents/fileIO/Outputs/ChomboIO.hpp | 2 +- src/coreComponents/fileIO/Outputs/OutputBase.cpp | 2 +- src/coreComponents/fileIO/Outputs/OutputBase.hpp | 2 +- src/coreComponents/fileIO/Outputs/OutputManager.cpp | 2 +- src/coreComponents/fileIO/Outputs/OutputManager.hpp | 2 +- src/coreComponents/fileIO/Outputs/OutputUtilities.cpp | 2 +- src/coreComponents/fileIO/Outputs/OutputUtilities.hpp | 2 +- src/coreComponents/fileIO/Outputs/PythonOutput.cpp | 2 +- src/coreComponents/fileIO/Outputs/PythonOutput.hpp | 2 +- src/coreComponents/fileIO/Outputs/RestartOutput.cpp | 2 +- src/coreComponents/fileIO/Outputs/RestartOutput.hpp | 2 +- src/coreComponents/fileIO/Outputs/SiloOutput.cpp | 2 +- src/coreComponents/fileIO/Outputs/SiloOutput.hpp | 2 +- src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp | 2 +- src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp | 2 +- src/coreComponents/fileIO/Outputs/VTKOutput.cpp | 2 +- src/coreComponents/fileIO/Outputs/VTKOutput.hpp | 2 +- src/coreComponents/fileIO/coupling/ChomboCoupler.cpp | 2 +- src/coreComponents/fileIO/coupling/ChomboCoupler.hpp | 2 +- src/coreComponents/fileIO/python/PyHistoryCollection.cpp | 2 +- src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp | 2 +- src/coreComponents/fileIO/python/PyHistoryOutput.cpp | 2 +- src/coreComponents/fileIO/python/PyHistoryOutputType.hpp | 2 +- src/coreComponents/fileIO/python/PyVTKOutput.cpp | 2 +- src/coreComponents/fileIO/python/PyVTKOutputType.hpp | 2 +- src/coreComponents/fileIO/silo/SiloFile.cpp | 2 +- src/coreComponents/fileIO/silo/SiloFile.hpp | 2 +- src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp | 2 +- src/coreComponents/fileIO/timeHistory/HDFFile.cpp | 2 +- src/coreComponents/fileIO/timeHistory/HDFFile.hpp | 2 +- src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp | 2 +- src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp | 2 +- src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp | 2 +- src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp | 2 +- src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp | 2 +- src/coreComponents/fileIO/timeHistory/PackCollection.cpp | 2 +- src/coreComponents/fileIO/timeHistory/PackCollection.hpp | 2 +- src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp | 2 +- src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp | 2 +- src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp | 2 +- src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp | 2 +- src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp | 2 +- src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp | 2 +- src/coreComponents/finiteElement/BilinearFormUtilities.hpp | 2 +- .../SpecializedFormulations/UniformStrainHexahedron.cpp | 2 +- .../SpecializedFormulations/UniformStrainHexahedron.h | 2 +- .../finiteElement/FiniteElementDiscretization.cpp | 2 +- .../finiteElement/FiniteElementDiscretization.hpp | 2 +- .../finiteElement/FiniteElementDiscretizationManager.cpp | 2 +- .../finiteElement/FiniteElementDiscretizationManager.hpp | 2 +- src/coreComponents/finiteElement/FiniteElementDispatch.hpp | 2 +- src/coreComponents/finiteElement/Kinematics.h | 2 +- src/coreComponents/finiteElement/LinearFormUtilities.hpp | 2 +- src/coreComponents/finiteElement/PDEUtilities.hpp | 2 +- .../elementFormulations/ConformingVirtualElementOrder1.hpp | 2 +- .../elementFormulations/ConformingVirtualElementOrder1_impl.hpp | 2 +- .../finiteElement/elementFormulations/FiniteElementBase.hpp | 2 +- .../H1_Hexahedron_Lagrange1_GaussLegendre2.hpp | 2 +- .../elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp | 2 +- .../H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp | 2 +- .../elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp | 2 +- .../elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp | 2 +- .../elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp | 2 +- .../finiteElement/elementFormulations/LagrangeBasis1.hpp | 2 +- .../finiteElement/elementFormulations/LagrangeBasis2.hpp | 2 +- .../finiteElement/elementFormulations/LagrangeBasis3GL.hpp | 2 +- .../finiteElement/elementFormulations/LagrangeBasis4GL.hpp | 2 +- .../finiteElement/elementFormulations/LagrangeBasis5GL.hpp | 2 +- .../elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp | 2 +- .../finiteElement/kernelInterface/ImplicitKernelBase.hpp | 2 +- .../finiteElement/kernelInterface/InterfaceKernelBase.hpp | 2 +- src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp | 2 +- .../finiteElement/kernelInterface/SparsityKernelBase.hpp | 2 +- .../finiteElement/unitTests/testFiniteElementBase.cpp | 2 +- .../finiteElement/unitTests/testFiniteElementHelpers.hpp | 2 +- .../unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp | 2 +- .../finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp | 2 +- .../testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp | 2 +- .../unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp | 2 +- .../unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp | 2 +- .../finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp | 2 +- .../unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp | 2 +- .../unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp | 2 +- src/coreComponents/finiteVolume/BoundaryStencil.cpp | 2 +- src/coreComponents/finiteVolume/BoundaryStencil.hpp | 2 +- src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp | 2 +- src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp | 2 +- src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp | 2 +- src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp | 2 +- .../finiteVolume/EmbeddedSurfaceToCellStencil.cpp | 2 +- .../finiteVolume/EmbeddedSurfaceToCellStencil.hpp | 2 +- src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp | 2 +- src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp | 2 +- src/coreComponents/finiteVolume/FiniteVolumeManager.cpp | 2 +- src/coreComponents/finiteVolume/FiniteVolumeManager.hpp | 2 +- src/coreComponents/finiteVolume/FluxApproximationBase.cpp | 2 +- src/coreComponents/finiteVolume/FluxApproximationBase.hpp | 2 +- src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp | 2 +- src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp | 2 +- src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp | 2 +- src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp | 2 +- src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp | 2 +- src/coreComponents/finiteVolume/StencilBase.hpp | 2 +- src/coreComponents/finiteVolume/SurfaceElementStencil.cpp | 2 +- src/coreComponents/finiteVolume/SurfaceElementStencil.hpp | 2 +- src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp | 2 +- src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp | 2 +- .../finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp | 2 +- .../mimeticInnerProducts/MimeticInnerProductBase.hpp | 2 +- .../mimeticInnerProducts/MimeticInnerProductHelpers.hpp | 2 +- .../finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp | 2 +- .../finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp | 2 +- .../finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp | 2 +- .../finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp | 2 +- src/coreComponents/functions/CompositeFunction.cpp | 2 +- src/coreComponents/functions/CompositeFunction.hpp | 2 +- src/coreComponents/functions/FunctionBase.cpp | 2 +- src/coreComponents/functions/FunctionBase.hpp | 2 +- src/coreComponents/functions/FunctionManager.cpp | 2 +- src/coreComponents/functions/FunctionManager.hpp | 2 +- src/coreComponents/functions/MultivariableTableFunction.cpp | 2 +- src/coreComponents/functions/MultivariableTableFunction.hpp | 2 +- .../functions/MultivariableTableFunctionKernels.hpp | 2 +- src/coreComponents/functions/SymbolicFunction.cpp | 2 +- src/coreComponents/functions/SymbolicFunction.hpp | 2 +- src/coreComponents/functions/TableFunction.cpp | 2 +- src/coreComponents/functions/TableFunction.hpp | 2 +- src/coreComponents/functions/unitTests/testFunctions.cpp | 2 +- src/coreComponents/linearAlgebra/DofManager.cpp | 2 +- src/coreComponents/linearAlgebra/DofManager.hpp | 2 +- src/coreComponents/linearAlgebra/DofManagerHelpers.hpp | 2 +- src/coreComponents/linearAlgebra/common/LinearOperator.hpp | 2 +- src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp | 2 +- src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp | 2 +- src/coreComponents/linearAlgebra/common/common.hpp | 2 +- src/coreComponents/linearAlgebra/common/traits.hpp | 2 +- src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp | 2 +- src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp | 2 +- src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp | 2 +- .../linearAlgebra/interfaces/direct/SuiteSparse.cpp | 2 +- .../linearAlgebra/interfaces/direct/SuiteSparse.hpp | 2 +- .../linearAlgebra/interfaces/direct/SuperLUDist.cpp | 2 +- .../linearAlgebra/interfaces/direct/SuperLUDist.hpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreExport.cpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreExport.hpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreInterface.cpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreInterface.hpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreKernels.cpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreKernels.hpp | 2 +- src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp | 2 +- src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreMatrix.cpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreMatrix.hpp | 2 +- .../linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp | 2 +- .../linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreSolver.cpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreSolver.hpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreUtils.cpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreUtils.hpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreVector.cpp | 2 +- .../linearAlgebra/interfaces/hypre/HypreVector.hpp | 2 +- .../hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp | 2 +- .../hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp | 2 +- .../hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp | 2 +- .../mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp | 2 +- .../hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp | 2 +- .../interfaces/hypre/mgrStrategies/Hydrofracture.hpp | 2 +- .../hypre/mgrStrategies/LagrangianContactMechanics.hpp | 2 +- .../interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp | 2 +- .../hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp | 2 +- .../hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp | 2 +- .../interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp | 2 +- .../interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp | 2 +- .../SinglePhasePoromechanicsConformingFractures.hpp | 2 +- .../mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp | 2 +- .../mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp | 2 +- .../interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp | 2 +- .../hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp | 2 +- .../hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp | 2 +- .../hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp | 2 +- .../hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp | 2 +- .../hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscExport.cpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscExport.hpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscInterface.cpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscInterface.hpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscMatrix.cpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscMatrix.hpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscSolver.cpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscSolver.hpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscUtils.hpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscVector.cpp | 2 +- .../linearAlgebra/interfaces/petsc/PetscVector.hpp | 2 +- .../linearAlgebra/interfaces/trilinos/EpetraExport.cpp | 2 +- .../linearAlgebra/interfaces/trilinos/EpetraExport.hpp | 2 +- .../linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp | 2 +- .../linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp | 2 +- .../linearAlgebra/interfaces/trilinos/EpetraUtils.hpp | 2 +- .../linearAlgebra/interfaces/trilinos/EpetraVector.cpp | 2 +- .../linearAlgebra/interfaces/trilinos/EpetraVector.hpp | 2 +- .../linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp | 2 +- .../linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp | 2 +- .../interfaces/trilinos/TrilinosPreconditioner.cpp | 2 +- .../interfaces/trilinos/TrilinosPreconditioner.hpp | 2 +- .../linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp | 2 +- .../linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp | 2 +- src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp | 2 +- src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp | 2 +- .../linearAlgebra/solvers/BlockPreconditioner.cpp | 2 +- .../linearAlgebra/solvers/BlockPreconditioner.hpp | 2 +- src/coreComponents/linearAlgebra/solvers/CgSolver.cpp | 2 +- src/coreComponents/linearAlgebra/solvers/CgSolver.hpp | 2 +- src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp | 2 +- src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp | 2 +- src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp | 2 +- src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp | 2 +- src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp | 2 +- .../linearAlgebra/solvers/PreconditionerBlockJacobi.hpp | 2 +- .../linearAlgebra/solvers/PreconditionerIdentity.hpp | 2 +- .../linearAlgebra/solvers/PreconditionerJacobi.hpp | 2 +- .../linearAlgebra/solvers/SeparateComponentPreconditioner.cpp | 2 +- .../linearAlgebra/solvers/SeparateComponentPreconditioner.hpp | 2 +- .../linearAlgebra/unitTests/testComponentMask.cpp | 2 +- .../linearAlgebra/unitTests/testExternalSolvers.cpp | 2 +- .../linearAlgebra/unitTests/testKrylovSolvers.cpp | 2 +- .../linearAlgebra/unitTests/testLinearAlgebraUtils.hpp | 2 +- .../linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp | 2 +- src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp | 2 +- .../linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp | 2 +- src/coreComponents/linearAlgebra/unitTests/testVectors.cpp | 2 +- src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp | 2 +- src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp | 2 +- .../linearAlgebra/utilities/BlockOperatorView.hpp | 2 +- .../linearAlgebra/utilities/BlockOperatorWrapper.hpp | 2 +- src/coreComponents/linearAlgebra/utilities/BlockVector.hpp | 2 +- src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp | 2 +- .../linearAlgebra/utilities/BlockVectorWrapper.hpp | 2 +- src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp | 2 +- .../linearAlgebra/utilities/InverseNormalOperator.hpp | 2 +- .../linearAlgebra/utilities/LAIHelperFunctions.hpp | 2 +- .../linearAlgebra/utilities/LinearSolverParameters.hpp | 2 +- .../linearAlgebra/utilities/LinearSolverResult.hpp | 2 +- src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp | 2 +- .../linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp | 2 +- .../linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp | 2 +- .../linearAlgebra/utilities/TransposeOperator.hpp | 2 +- src/coreComponents/mainInterface/GeosxState.cpp | 2 +- src/coreComponents/mainInterface/GeosxState.hpp | 2 +- src/coreComponents/mainInterface/GeosxVersion.hpp.in | 2 +- src/coreComponents/mainInterface/ProblemManager.cpp | 2 +- src/coreComponents/mainInterface/ProblemManager.hpp | 2 +- src/coreComponents/mainInterface/initialization.cpp | 2 +- src/coreComponents/mainInterface/initialization.hpp | 2 +- src/coreComponents/mainInterface/version.cpp | 2 +- src/coreComponents/mainInterface/version.hpp | 2 +- src/coreComponents/math/extrapolation/Extrapolation.hpp | 2 +- src/coreComponents/math/interpolation/Interpolation.hpp | 2 +- src/coreComponents/mesh/BufferOps.cpp | 2 +- src/coreComponents/mesh/BufferOps.hpp | 2 +- src/coreComponents/mesh/CellElementRegion.cpp | 2 +- src/coreComponents/mesh/CellElementRegion.hpp | 2 +- src/coreComponents/mesh/CellElementSubRegion.cpp | 2 +- src/coreComponents/mesh/CellElementSubRegion.hpp | 2 +- src/coreComponents/mesh/DomainPartition.cpp | 2 +- src/coreComponents/mesh/DomainPartition.hpp | 2 +- src/coreComponents/mesh/EdgeManager.cpp | 2 +- src/coreComponents/mesh/EdgeManager.hpp | 2 +- src/coreComponents/mesh/ElementRegionBase.cpp | 2 +- src/coreComponents/mesh/ElementRegionBase.hpp | 2 +- src/coreComponents/mesh/ElementRegionManager.cpp | 2 +- src/coreComponents/mesh/ElementRegionManager.hpp | 2 +- src/coreComponents/mesh/ElementSubRegionBase.cpp | 2 +- src/coreComponents/mesh/ElementSubRegionBase.hpp | 2 +- src/coreComponents/mesh/ElementType.hpp | 2 +- src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp | 2 +- src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp | 2 +- src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp | 2 +- src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp | 2 +- src/coreComponents/mesh/FaceElementSubRegion.cpp | 2 +- src/coreComponents/mesh/FaceElementSubRegion.hpp | 2 +- src/coreComponents/mesh/FaceManager.cpp | 2 +- src/coreComponents/mesh/FaceManager.hpp | 2 +- src/coreComponents/mesh/FieldIdentifiers.hpp | 2 +- src/coreComponents/mesh/InterObjectRelation.hpp | 2 +- src/coreComponents/mesh/MeshBody.cpp | 2 +- src/coreComponents/mesh/MeshBody.hpp | 2 +- src/coreComponents/mesh/MeshFields.hpp | 2 +- src/coreComponents/mesh/MeshForLoopInterface.hpp | 2 +- src/coreComponents/mesh/MeshLevel.cpp | 2 +- src/coreComponents/mesh/MeshLevel.hpp | 2 +- src/coreComponents/mesh/MeshManager.cpp | 2 +- src/coreComponents/mesh/MeshManager.hpp | 2 +- src/coreComponents/mesh/MeshObjectPath.cpp | 2 +- src/coreComponents/mesh/MeshObjectPath.hpp | 2 +- src/coreComponents/mesh/NodeManager.cpp | 2 +- src/coreComponents/mesh/NodeManager.hpp | 2 +- src/coreComponents/mesh/ObjectManagerBase.cpp | 2 +- src/coreComponents/mesh/ObjectManagerBase.hpp | 2 +- src/coreComponents/mesh/ParticleManager.cpp | 2 +- src/coreComponents/mesh/ParticleManager.hpp | 2 +- src/coreComponents/mesh/ParticleRegion.cpp | 2 +- src/coreComponents/mesh/ParticleRegion.hpp | 2 +- src/coreComponents/mesh/ParticleRegionBase.cpp | 2 +- src/coreComponents/mesh/ParticleRegionBase.hpp | 2 +- src/coreComponents/mesh/ParticleSubRegion.cpp | 2 +- src/coreComponents/mesh/ParticleSubRegion.hpp | 2 +- src/coreComponents/mesh/ParticleSubRegionBase.cpp | 2 +- src/coreComponents/mesh/ParticleSubRegionBase.hpp | 2 +- src/coreComponents/mesh/ParticleType.hpp | 2 +- src/coreComponents/mesh/Perforation.cpp | 2 +- src/coreComponents/mesh/Perforation.hpp | 2 +- src/coreComponents/mesh/PerforationData.cpp | 2 +- src/coreComponents/mesh/PerforationData.hpp | 2 +- src/coreComponents/mesh/PerforationFields.hpp | 2 +- src/coreComponents/mesh/SurfaceElementRegion.cpp | 2 +- src/coreComponents/mesh/SurfaceElementRegion.hpp | 2 +- src/coreComponents/mesh/SurfaceElementSubRegion.cpp | 2 +- src/coreComponents/mesh/SurfaceElementSubRegion.hpp | 2 +- src/coreComponents/mesh/ToElementRelation.cpp | 2 +- src/coreComponents/mesh/ToElementRelation.hpp | 2 +- src/coreComponents/mesh/ToParticleRelation.cpp | 2 +- src/coreComponents/mesh/ToParticleRelation.hpp | 2 +- src/coreComponents/mesh/WellElementRegion.cpp | 2 +- src/coreComponents/mesh/WellElementRegion.hpp | 2 +- src/coreComponents/mesh/WellElementSubRegion.cpp | 2 +- src/coreComponents/mesh/WellElementSubRegion.hpp | 2 +- src/coreComponents/mesh/generators/CellBlock.cpp | 2 +- src/coreComponents/mesh/generators/CellBlock.hpp | 2 +- src/coreComponents/mesh/generators/CellBlockABC.hpp | 2 +- src/coreComponents/mesh/generators/CellBlockManager.cpp | 2 +- src/coreComponents/mesh/generators/CellBlockManager.hpp | 2 +- src/coreComponents/mesh/generators/CellBlockManagerABC.hpp | 2 +- src/coreComponents/mesh/generators/CellBlockUtilities.cpp | 2 +- src/coreComponents/mesh/generators/CellBlockUtilities.hpp | 2 +- src/coreComponents/mesh/generators/CollocatedNodes.cpp | 2 +- src/coreComponents/mesh/generators/CollocatedNodes.hpp | 2 +- .../mesh/generators/ExternalMeshGeneratorBase.cpp | 2 +- .../mesh/generators/ExternalMeshGeneratorBase.hpp | 2 +- src/coreComponents/mesh/generators/FaceBlock.cpp | 2 +- src/coreComponents/mesh/generators/FaceBlock.hpp | 2 +- src/coreComponents/mesh/generators/FaceBlockABC.hpp | 2 +- src/coreComponents/mesh/generators/InternalMeshGenerator.cpp | 2 +- src/coreComponents/mesh/generators/InternalMeshGenerator.hpp | 2 +- src/coreComponents/mesh/generators/InternalWellGenerator.cpp | 2 +- src/coreComponents/mesh/generators/InternalWellGenerator.hpp | 2 +- .../mesh/generators/InternalWellboreGenerator.cpp | 2 +- .../mesh/generators/InternalWellboreGenerator.hpp | 2 +- src/coreComponents/mesh/generators/LineBlock.cpp | 2 +- src/coreComponents/mesh/generators/LineBlock.hpp | 2 +- src/coreComponents/mesh/generators/LineBlockABC.hpp | 2 +- src/coreComponents/mesh/generators/MeshGeneratorBase.cpp | 2 +- src/coreComponents/mesh/generators/MeshGeneratorBase.hpp | 2 +- src/coreComponents/mesh/generators/PTScotchInterface.cpp | 2 +- src/coreComponents/mesh/generators/PTScotchInterface.hpp | 2 +- src/coreComponents/mesh/generators/ParMETISInterface.cpp | 2 +- src/coreComponents/mesh/generators/ParMETISInterface.hpp | 2 +- src/coreComponents/mesh/generators/ParticleBlock.cpp | 2 +- src/coreComponents/mesh/generators/ParticleBlock.hpp | 2 +- src/coreComponents/mesh/generators/ParticleBlockABC.hpp | 2 +- src/coreComponents/mesh/generators/ParticleBlockManager.cpp | 2 +- src/coreComponents/mesh/generators/ParticleBlockManager.hpp | 2 +- src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp | 2 +- src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp | 2 +- src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp | 2 +- src/coreComponents/mesh/generators/PartitionDescriptor.hpp | 2 +- src/coreComponents/mesh/generators/PrismUtilities.hpp | 2 +- src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp | 2 +- src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp | 2 +- src/coreComponents/mesh/generators/VTKMeshGenerator.cpp | 2 +- src/coreComponents/mesh/generators/VTKMeshGenerator.hpp | 2 +- src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp | 2 +- src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp | 2 +- src/coreComponents/mesh/generators/VTKUtilities.cpp | 2 +- src/coreComponents/mesh/generators/VTKUtilities.hpp | 2 +- src/coreComponents/mesh/generators/VTKWellGenerator.cpp | 2 +- src/coreComponents/mesh/generators/VTKWellGenerator.hpp | 2 +- src/coreComponents/mesh/generators/WellGeneratorABC.hpp | 2 +- src/coreComponents/mesh/generators/WellGeneratorBase.cpp | 2 +- src/coreComponents/mesh/generators/WellGeneratorBase.hpp | 2 +- src/coreComponents/mesh/mpiCommunications/CommID.cpp | 2 +- src/coreComponents/mesh/mpiCommunications/CommID.hpp | 2 +- .../mesh/mpiCommunications/CommunicationTools.cpp | 2 +- .../mesh/mpiCommunications/CommunicationTools.hpp | 2 +- src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp | 2 +- src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp | 2 +- .../mesh/mpiCommunications/NeighborCommunicator.cpp | 2 +- .../mesh/mpiCommunications/NeighborCommunicator.hpp | 2 +- src/coreComponents/mesh/mpiCommunications/NeighborData.hpp | 2 +- src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp | 2 +- src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp | 2 +- src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp | 2 +- src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp | 2 +- src/coreComponents/mesh/simpleGeometricObjects/Box.cpp | 2 +- src/coreComponents/mesh/simpleGeometricObjects/Box.hpp | 2 +- .../mesh/simpleGeometricObjects/CustomPolarObject.cpp | 2 +- .../mesh/simpleGeometricObjects/CustomPolarObject.hpp | 2 +- src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp | 2 +- src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp | 2 +- src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp | 2 +- src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp | 2 +- .../mesh/simpleGeometricObjects/GeometricObjectManager.cpp | 2 +- .../mesh/simpleGeometricObjects/GeometricObjectManager.hpp | 2 +- .../mesh/simpleGeometricObjects/PlanarGeometricObject.cpp | 2 +- .../mesh/simpleGeometricObjects/PlanarGeometricObject.hpp | 2 +- src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp | 2 +- src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp | 2 +- .../mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp | 2 +- .../mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp | 2 +- src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp | 2 +- src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp | 2 +- src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp | 2 +- src/coreComponents/mesh/unitTests/testGeometricObjects.cpp | 2 +- src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp | 2 +- .../mesh/utilities/AverageOverQuadraturePointsKernel.hpp | 2 +- src/coreComponents/mesh/utilities/CIcomputationKernel.hpp | 2 +- src/coreComponents/mesh/utilities/ComputationalGeometry.cpp | 2 +- src/coreComponents/mesh/utilities/ComputationalGeometry.hpp | 2 +- src/coreComponents/mesh/utilities/MeshMapUtilities.hpp | 2 +- src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp | 2 +- src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp | 2 +- src/coreComponents/physicsSolvers/LinearSolverParameters.cpp | 2 +- src/coreComponents/physicsSolvers/LinearSolverParameters.hpp | 2 +- src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp | 2 +- src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp | 2 +- src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp | 2 +- src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp | 2 +- src/coreComponents/physicsSolvers/SolverBase.cpp | 2 +- src/coreComponents/physicsSolvers/SolverBase.hpp | 2 +- src/coreComponents/physicsSolvers/SolverBaseKernels.hpp | 2 +- src/coreComponents/physicsSolvers/SolverStatistics.cpp | 2 +- src/coreComponents/physicsSolvers/SolverStatistics.hpp | 2 +- src/coreComponents/physicsSolvers/contact/ContactFields.hpp | 2 +- src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp | 2 +- src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp | 2 +- .../physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp | 2 +- .../contact/SolidMechanicsALMJumpUpdateKernels.hpp | 2 +- .../physicsSolvers/contact/SolidMechanicsALMKernels.hpp | 2 +- .../physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp | 2 +- .../physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp | 2 +- .../contact/SolidMechanicsAugmentedLagrangianContact.cpp | 2 +- .../contact/SolidMechanicsAugmentedLagrangianContact.hpp | 2 +- .../contact/SolidMechanicsEFEMJumpUpdateKernels.hpp | 2 +- .../physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp | 2 +- .../physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp | 2 +- .../physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp | 2 +- .../contact/SolidMechanicsEFEMStaticCondensationKernels.hpp | 2 +- .../physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp | 2 +- .../physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp | 2 +- .../physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp | 2 +- .../physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp | 2 +- .../physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp | 2 +- .../physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseBaseFields.hpp | 2 +- .../physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp | 2 +- .../physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseHybridFVM.cpp | 2 +- .../fluidFlow/CompositionalMultiphaseHybridFVM.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp | 2 +- .../fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseStatistics.cpp | 2 +- .../fluidFlow/CompositionalMultiphaseStatistics.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseUtilities.hpp | 2 +- .../fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp | 2 +- src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp | 2 +- src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp | 2 +- .../physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp | 2 +- .../physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp | 2 +- .../physicsSolvers/fluidFlow/FluxKernelsHelper.hpp | 2 +- .../physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp | 2 +- .../fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp | 2 +- .../IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp | 2 +- .../fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp | 2 +- .../fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp | 2 +- .../fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp | 2 +- .../fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp | 2 +- .../fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp | 2 +- .../fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp | 2 +- src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp | 2 +- src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp | 2 +- src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp | 2 +- src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp | 2 +- .../physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp | 2 +- .../physicsSolvers/fluidFlow/SourceFluxStatistics.cpp | 2 +- .../physicsSolvers/fluidFlow/SourceFluxStatistics.hpp | 2 +- .../fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp | 2 +- .../fluidFlow/StabilizedSinglePhaseFVMKernels.hpp | 2 +- .../physicsSolvers/fluidFlow/StencilAccessors.hpp | 2 +- .../fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp | 2 +- .../fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp | 2 +- .../physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp | 2 +- .../physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp | 2 +- .../fluidFlow/proppantTransport/ProppantTransport.cpp | 2 +- .../fluidFlow/proppantTransport/ProppantTransport.hpp | 2 +- .../fluidFlow/proppantTransport/ProppantTransportFields.hpp | 2 +- .../fluidFlow/proppantTransport/ProppantTransportKernels.cpp | 2 +- .../fluidFlow/proppantTransport/ProppantTransportKernels.hpp | 2 +- .../fluidFlow/wells/CompositionalMultiphaseWell.cpp | 2 +- .../fluidFlow/wells/CompositionalMultiphaseWell.hpp | 2 +- .../fluidFlow/wells/CompositionalMultiphaseWellFields.hpp | 2 +- .../fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp | 2 +- .../fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp | 2 +- .../physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp | 2 +- .../physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp | 2 +- .../physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp | 2 +- .../physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp | 2 +- .../physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp | 2 +- .../physicsSolvers/fluidFlow/wells/WellConstants.hpp | 2 +- .../physicsSolvers/fluidFlow/wells/WellControls.cpp | 2 +- .../physicsSolvers/fluidFlow/wells/WellControls.hpp | 2 +- .../physicsSolvers/fluidFlow/wells/WellSolverBase.cpp | 2 +- .../physicsSolvers/fluidFlow/wells/WellSolverBase.hpp | 2 +- .../physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp | 2 +- .../physicsSolvers/inducedSeismicity/SeismicityRate.cpp | 2 +- .../physicsSolvers/inducedSeismicity/SeismicityRate.hpp | 2 +- .../physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp | 2 +- .../inducedSeismicity/inducedSeismicityFields.hpp | 2 +- .../multiphysics/CompositionalMultiphaseReservoirAndWells.cpp | 2 +- .../multiphysics/CompositionalMultiphaseReservoirAndWells.hpp | 2 +- .../multiphysics/CoupledReservoirAndWellsBase.cpp | 2 +- .../multiphysics/CoupledReservoirAndWellsBase.hpp | 2 +- .../physicsSolvers/multiphysics/CoupledSolver.hpp | 2 +- .../physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp | 2 +- .../physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp | 2 +- .../physicsSolvers/multiphysics/HydrofractureSolver.cpp | 2 +- .../physicsSolvers/multiphysics/HydrofractureSolver.hpp | 2 +- .../physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp | 2 +- .../physicsSolvers/multiphysics/MultiphasePoromechanics.cpp | 2 +- .../physicsSolvers/multiphysics/MultiphasePoromechanics.hpp | 2 +- .../physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp | 2 +- .../physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp | 2 +- .../physicsSolvers/multiphysics/PoromechanicsFields.hpp | 2 +- .../physicsSolvers/multiphysics/PoromechanicsInitialization.cpp | 2 +- .../physicsSolvers/multiphysics/PoromechanicsInitialization.hpp | 2 +- .../physicsSolvers/multiphysics/PoromechanicsSolver.hpp | 2 +- .../physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp | 2 +- .../physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp | 2 +- .../SinglePhasePoromechanicsConformingFractures.cpp | 2 +- .../SinglePhasePoromechanicsConformingFractures.hpp | 2 +- .../multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp | 2 +- .../multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp | 2 +- .../multiphysics/SinglePhaseReservoirAndWells.cpp | 2 +- .../multiphysics/SinglePhaseReservoirAndWells.hpp | 2 +- .../poromechanicsKernels/MultiphasePoromechanics.hpp | 2 +- .../poromechanicsKernels/MultiphasePoromechanics_impl.hpp | 2 +- .../multiphysics/poromechanicsKernels/PoromechanicsBase.hpp | 2 +- .../poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template | 2 +- .../poromechanicsKernels/PoromechanicsKernels.cpp.template | 2 +- .../poromechanicsKernels/SinglePhasePoromechanics.hpp | 2 +- .../SinglePhasePoromechanicsConformingFractures.hpp | 2 +- .../poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp | 2 +- .../poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp | 2 +- .../SinglePhasePoromechanicsEmbeddedFractures.hpp | 2 +- .../poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp | 2 +- .../poromechanicsKernels/SinglePhasePoromechanics_impl.hpp | 2 +- .../poromechanicsKernels/ThermalMultiphasePoromechanics.hpp | 2 +- .../ThermalMultiphasePoromechanics_impl.hpp | 2 +- .../poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp | 2 +- .../ThermalSinglePhasePoromechanicsConformingFractures.hpp | 2 +- .../ThermalSinglePhasePoromechanicsEFEM.hpp | 2 +- .../ThermalSinglePhasePoromechanicsEFEM_impl.hpp | 2 +- .../ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp | 2 +- .../ThermalSinglePhasePoromechanics_impl.hpp | 2 +- .../ThermoPoromechanicsKernels.cpp.template | 2 +- src/coreComponents/physicsSolvers/python/PySolver.cpp | 2 +- src/coreComponents/physicsSolvers/python/PySolver.hpp | 2 +- src/coreComponents/physicsSolvers/python/PySolverType.hpp | 2 +- src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp | 2 +- src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp | 2 +- src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp | 2 +- src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp | 2 +- .../physicsSolvers/simplePDE/LaplaceFEMKernels.hpp | 2 +- .../physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp | 2 +- .../physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp | 2 +- .../physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp | 2 +- .../physicsSolvers/solidMechanics/MPMSolverFields.hpp | 2 +- .../physicsSolvers/solidMechanics/SolidMechanicsFields.hpp | 2 +- .../solidMechanics/SolidMechanicsLagrangianFEM.cpp | 2 +- .../solidMechanics/SolidMechanicsLagrangianFEM.hpp | 2 +- .../solidMechanics/SolidMechanicsLagrangianSSLE.cpp | 2 +- .../solidMechanics/SolidMechanicsLagrangianSSLE.hpp | 2 +- .../physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp | 2 +- .../physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp | 2 +- .../physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp | 2 +- .../physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp | 2 +- .../physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp | 2 +- .../physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp | 2 +- .../solidMechanics/kernels/ExplicitFiniteStrain.hpp | 2 +- .../solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp | 2 +- .../physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp | 2 +- .../solidMechanics/kernels/ExplicitSmallStrain.hpp | 2 +- .../solidMechanics/kernels/ExplicitSmallStrain_impl.hpp | 2 +- .../solidMechanics/kernels/FixedStressThermoPoromechanics.hpp | 2 +- .../kernels/FixedStressThermoPoromechanics_impl.hpp | 2 +- .../solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp | 2 +- .../solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp | 2 +- .../solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp | 2 +- .../kernels/ImplicitSmallStrainQuasiStatic_impl.hpp | 2 +- ...dMechanicsFixedStressThermoPoromechanicsKernels.cpp.template | 2 +- .../solidMechanics/kernels/SolidMechanicsKernels.cpp.template | 2 +- .../kernels/SolidMechanicsLagrangianFEMKernels.hpp | 2 +- .../physicsSolvers/solidMechanics/kernels/StrainHelper.hpp | 2 +- .../physicsSolvers/solidMechanics/kernels/policies.hpp.in | 2 +- .../surfaceGeneration/EmbeddedSurfaceGenerator.cpp | 2 +- .../surfaceGeneration/EmbeddedSurfaceGenerator.hpp | 2 +- .../EmbeddedSurfacesParallelSynchronization.cpp | 2 +- .../EmbeddedSurfacesParallelSynchronization.hpp | 2 +- .../physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp | 2 +- .../physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp | 2 +- .../physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp | 2 +- .../physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp | 2 +- .../physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp | 2 +- .../surfaceGeneration/kernels/surfaceGenerationKernels.hpp | 2 +- .../kernels/surfaceGenerationKernelsHelpers.hpp | 2 +- .../isotropic/AcousticFirstOrderWaveEquationSEM.cpp | 2 +- .../isotropic/AcousticFirstOrderWaveEquationSEM.hpp | 2 +- .../isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp | 2 +- .../acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp | 2 +- .../secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp | 2 +- .../secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp | 2 +- .../anisotropic/AcousticVTIWaveEquationSEMKernel.hpp | 2 +- .../acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp | 2 +- .../secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp | 2 +- .../secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp | 2 +- .../secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp | 2 +- .../wavePropagation/sem/acoustic/shared/AcousticFields.hpp | 2 +- .../sem/acoustic/shared/AcousticMatricesSEMKernel.hpp | 2 +- .../sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp | 2 +- .../secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp | 2 +- .../secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp | 2 +- .../isotropic/AcousticElasticWaveEquationSEMKernel.hpp | 2 +- .../secondOrderEqn/isotropic/AcoustoElasticFields.hpp | 2 +- .../isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp | 2 +- .../isotropic/ElasticFirstOrderWaveEquationSEM.cpp | 2 +- .../isotropic/ElasticFirstOrderWaveEquationSEM.hpp | 2 +- .../isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp | 2 +- .../sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp | 2 +- .../anisotropic/ElasticVTIWaveEquationSEMKernel.hpp | 2 +- .../elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp | 2 +- .../elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp | 2 +- .../secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp | 2 +- .../wavePropagation/sem/elastic/shared/ElasticFields.hpp | 2 +- .../sem/elastic/shared/ElasticMatricesSEMKernel.hpp | 2 +- .../sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp | 2 +- .../shared/PrecomputeSourcesAndReceiversKernel.hpp | 2 +- .../physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp | 2 +- .../physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp | 2 +- .../physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp | 2 +- src/coreComponents/schema/schemaUtilities.cpp | 2 +- src/coreComponents/schema/schemaUtilities.hpp | 2 +- .../unitTests/constitutiveTests/MultiFluidTest.hpp | 2 +- .../unitTests/constitutiveTests/constitutiveTestHelpers.hpp | 2 +- .../unitTests/constitutiveTests/testCO2BrinePVTModels.cpp | 2 +- .../unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp | 2 +- .../unitTests/constitutiveTests/testCapillaryPressure.cpp | 2 +- src/coreComponents/unitTests/constitutiveTests/testDamage.cpp | 2 +- .../unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp | 2 +- .../testMultiFluidCompositionalMultiphasePVTPackage.cpp | 2 +- .../unitTests/constitutiveTests/testMultiFluidDeadOil.cpp | 2 +- .../unitTests/constitutiveTests/testMultiFluidLiveOil.cpp | 2 +- src/coreComponents/unitTests/constitutiveTests/testPVT.cpp | 2 +- .../unitTests/constitutiveTests/testReactiveFluid.cpp | 2 +- src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp | 2 +- .../unitTests/constitutiveTests/testRelPermHysteresis.cpp | 2 +- src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp | 2 +- .../unitTests/dataRepositoryTests/testGroupPath.cpp | 2 +- .../unitTests/dataRepositoryTests/testObjectCatalog.cpp | 2 +- .../unitTests/dataRepositoryTests/testRestartBasic.cpp | 2 +- .../unitTests/dataRepositoryTests/testRestartExtended.cpp | 2 +- .../unitTests/dataRepositoryTests/testWrapperHelpers.cpp | 2 +- src/coreComponents/unitTests/dataRepositoryTests/utils.hpp | 2 +- .../fieldSpecificationTests/testAquiferBoundaryCondition.cpp | 2 +- .../fieldSpecificationTests/testFieldSpecificationsEnums.cpp | 2 +- .../fieldSpecificationTests/testRecursiveFieldApplication.cpp | 2 +- src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp | 2 +- .../unitTests/fileIOTests/testHDFParallelFile.cpp | 2 +- .../unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp | 2 +- .../unitTests/fluidFlowTests/testCompFlowUtils.hpp | 2 +- .../unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp | 2 +- .../unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp | 2 +- .../unitTests/fluidFlowTests/testFlowKernelHelpers.hpp | 2 +- .../unitTests/fluidFlowTests/testFlowStatistics.cpp | 2 +- src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp | 2 +- .../fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp | 2 +- .../unitTests/fluidFlowTests/testSingleFlowUtils.hpp | 2 +- .../unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp | 2 +- .../unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp | 2 +- .../unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp | 2 +- .../unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp | 2 +- .../unitTests/linearAlgebraTests/testDofManager.cpp | 2 +- .../unitTests/linearAlgebraTests/testDofManagerUtils.hpp | 2 +- .../unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp | 2 +- src/coreComponents/unitTests/meshTests/meshDirName.hpp.in | 2 +- src/coreComponents/unitTests/meshTests/testMeshEnums.cpp | 2 +- src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp | 2 +- .../unitTests/meshTests/testNeighborCommunicator.cpp | 2 +- src/coreComponents/unitTests/meshTests/testVTKImport.cpp | 2 +- src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp | 2 +- src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp | 2 +- src/coreComponents/unitTests/toolchain/testToolchain.cpp | 2 +- .../virtualElementTests/testConformingVirtualElementOrder1.cpp | 2 +- .../unitTests/wavePropagationTests/testWavePropagation.cpp | 2 +- .../testWavePropagationAcousticFirstOrder.cpp | 2 +- .../wavePropagationTests/testWavePropagationAttenuation.cpp | 2 +- .../unitTests/wavePropagationTests/testWavePropagationDAS.cpp | 2 +- .../testWavePropagationElasticFirstOrder.cpp | 2 +- .../wavePropagationTests/testWavePropagationElasticVTI.cpp | 2 +- .../unitTests/wavePropagationTests/testWavePropagationQ2.cpp | 2 +- .../wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp | 2 +- .../unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp | 2 +- src/coreComponents/unitTests/wellsTests/testWellEnums.cpp | 2 +- src/coreComponents/unitTests/xmlTests/testXML.cpp | 2 +- src/coreComponents/unitTests/xmlTests/testXMLFile.cpp | 2 +- .../newComponentTemplate/src/NewComponent.cpp | 2 +- .../newComponentTemplate/src/NewComponent.hpp | 2 +- .../newComponentTemplate/tests/testNewComponent.cpp | 2 +- src/main/main.cpp | 2 +- src/pygeosx/pygeosx.cpp | 2 +- src/pygeosx/pygeosx.hpp | 2 +- 1214 files changed, 1214 insertions(+), 1214 deletions(-) diff --git a/COPYRIGHT b/COPYRIGHT index be5ead6e54e..75b72981c2d 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -10,7 +10,7 @@ distribution, unless otherwise stated in the file: * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved diff --git a/examples/ObjectCatalog/Base.hpp b/examples/ObjectCatalog/Base.hpp index ef0af4ad3fe..19ba0cb73e8 100644 --- a/examples/ObjectCatalog/Base.hpp +++ b/examples/ObjectCatalog/Base.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/examples/ObjectCatalog/Derived1.cpp b/examples/ObjectCatalog/Derived1.cpp index 1fe1dcae7c7..8f688f3d486 100644 --- a/examples/ObjectCatalog/Derived1.cpp +++ b/examples/ObjectCatalog/Derived1.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/examples/ObjectCatalog/Derived1.hpp b/examples/ObjectCatalog/Derived1.hpp index b3d04dc2cb0..49ec9755ea2 100644 --- a/examples/ObjectCatalog/Derived1.hpp +++ b/examples/ObjectCatalog/Derived1.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/examples/ObjectCatalog/Derived2.hpp b/examples/ObjectCatalog/Derived2.hpp index 06894666c02..bb06254d07e 100644 --- a/examples/ObjectCatalog/Derived2.hpp +++ b/examples/ObjectCatalog/Derived2.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/examples/ObjectCatalog/main.cpp b/examples/ObjectCatalog/main.cpp index c2fd08113d5..11452b82e93 100644 --- a/examples/ObjectCatalog/main.cpp +++ b/examples/ObjectCatalog/main.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/scripts/copyrightPrepender.py b/scripts/copyrightPrepender.py index 2155567e3e4..216f3528260 100644 --- a/scripts/copyrightPrepender.py +++ b/scripts/copyrightPrepender.py @@ -39,7 +39,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/EnumStrings.hpp b/src/coreComponents/codingUtilities/EnumStrings.hpp index 40930b1b222..d975e7cbc3e 100644 --- a/src/coreComponents/codingUtilities/EnumStrings.hpp +++ b/src/coreComponents/codingUtilities/EnumStrings.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/Parsing.cpp b/src/coreComponents/codingUtilities/Parsing.cpp index 91e577b3c60..3e8c970ea9f 100644 --- a/src/coreComponents/codingUtilities/Parsing.cpp +++ b/src/coreComponents/codingUtilities/Parsing.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/Parsing.hpp b/src/coreComponents/codingUtilities/Parsing.hpp index 1f6dcf36c57..645e9615198 100644 --- a/src/coreComponents/codingUtilities/Parsing.hpp +++ b/src/coreComponents/codingUtilities/Parsing.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/RTTypes.cpp b/src/coreComponents/codingUtilities/RTTypes.cpp index 52d51964af1..f84818cb937 100644 --- a/src/coreComponents/codingUtilities/RTTypes.cpp +++ b/src/coreComponents/codingUtilities/RTTypes.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/RTTypes.hpp b/src/coreComponents/codingUtilities/RTTypes.hpp index a94c6cb8236..ea1bed2bdc6 100644 --- a/src/coreComponents/codingUtilities/RTTypes.hpp +++ b/src/coreComponents/codingUtilities/RTTypes.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/SFINAE_Macros.hpp b/src/coreComponents/codingUtilities/SFINAE_Macros.hpp index 4032db8cd5f..9dfc0a9ed2a 100644 --- a/src/coreComponents/codingUtilities/SFINAE_Macros.hpp +++ b/src/coreComponents/codingUtilities/SFINAE_Macros.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp index 3b82f6b0f34..7e251ffbf0a 100644 --- a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp +++ b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/Utilities.hpp b/src/coreComponents/codingUtilities/Utilities.hpp index 41fdc9c8e46..d4951f7185b 100644 --- a/src/coreComponents/codingUtilities/Utilities.hpp +++ b/src/coreComponents/codingUtilities/Utilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp b/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp index 412aee960ea..4c3820cc249 100644 --- a/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp +++ b/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp b/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp index 21a6a8d1903..5dfc65c1a8c 100644 --- a/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp +++ b/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/tests/testParsing.cpp b/src/coreComponents/codingUtilities/tests/testParsing.cpp index 33f3d0231d8..586697330ac 100644 --- a/src/coreComponents/codingUtilities/tests/testParsing.cpp +++ b/src/coreComponents/codingUtilities/tests/testParsing.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/tests/testUtilities.cpp b/src/coreComponents/codingUtilities/tests/testUtilities.cpp index f063d471b92..cb481fccd0e 100644 --- a/src/coreComponents/codingUtilities/tests/testUtilities.cpp +++ b/src/coreComponents/codingUtilities/tests/testUtilities.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/codingUtilities/traits.hpp b/src/coreComponents/codingUtilities/traits.hpp index a5c8d4aa187..8ab60cddd52 100644 --- a/src/coreComponents/codingUtilities/traits.hpp +++ b/src/coreComponents/codingUtilities/traits.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/BufferAllocator.cpp b/src/coreComponents/common/BufferAllocator.cpp index 4df6745f937..26d432c28c7 100644 --- a/src/coreComponents/common/BufferAllocator.cpp +++ b/src/coreComponents/common/BufferAllocator.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/BufferAllocator.hpp b/src/coreComponents/common/BufferAllocator.hpp index 46421189866..7fa789efd9b 100644 --- a/src/coreComponents/common/BufferAllocator.hpp +++ b/src/coreComponents/common/BufferAllocator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/DataLayouts.hpp b/src/coreComponents/common/DataLayouts.hpp index 38d149a1938..2f6c53af4fc 100644 --- a/src/coreComponents/common/DataLayouts.hpp +++ b/src/coreComponents/common/DataLayouts.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/DataTypes.hpp b/src/coreComponents/common/DataTypes.hpp index 9f4c8608ff7..c458412540a 100644 --- a/src/coreComponents/common/DataTypes.hpp +++ b/src/coreComponents/common/DataTypes.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/FieldSpecificationOps.hpp b/src/coreComponents/common/FieldSpecificationOps.hpp index 684b90af9e5..534768330fd 100644 --- a/src/coreComponents/common/FieldSpecificationOps.hpp +++ b/src/coreComponents/common/FieldSpecificationOps.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/FixedSizeDeque.hpp b/src/coreComponents/common/FixedSizeDeque.hpp index 629f1d8f42e..5746419ca71 100644 --- a/src/coreComponents/common/FixedSizeDeque.hpp +++ b/src/coreComponents/common/FixedSizeDeque.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp b/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp index 15c0b129776..800e1e1806f 100644 --- a/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp +++ b/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/GEOS_RAJA_Interface.hpp b/src/coreComponents/common/GEOS_RAJA_Interface.hpp index 9f7d0bde21a..3b651c9e5c6 100644 --- a/src/coreComponents/common/GEOS_RAJA_Interface.hpp +++ b/src/coreComponents/common/GEOS_RAJA_Interface.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/GeosxConfig.hpp.in b/src/coreComponents/common/GeosxConfig.hpp.in index 6942640552d..704a9ebd0ac 100644 --- a/src/coreComponents/common/GeosxConfig.hpp.in +++ b/src/coreComponents/common/GeosxConfig.hpp.in @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/GeosxMacros.hpp b/src/coreComponents/common/GeosxMacros.hpp index 7396a6cf006..f73cb2740a3 100644 --- a/src/coreComponents/common/GeosxMacros.hpp +++ b/src/coreComponents/common/GeosxMacros.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/LifoStorage.hpp b/src/coreComponents/common/LifoStorage.hpp index 6bc25ec8bbb..16ce24f0e13 100644 --- a/src/coreComponents/common/LifoStorage.hpp +++ b/src/coreComponents/common/LifoStorage.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/LifoStorageCommon.hpp b/src/coreComponents/common/LifoStorageCommon.hpp index ff31b170a7a..08c1144e9fe 100644 --- a/src/coreComponents/common/LifoStorageCommon.hpp +++ b/src/coreComponents/common/LifoStorageCommon.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/LifoStorageCuda.hpp b/src/coreComponents/common/LifoStorageCuda.hpp index 0afb560fe2a..bb03115f011 100644 --- a/src/coreComponents/common/LifoStorageCuda.hpp +++ b/src/coreComponents/common/LifoStorageCuda.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/LifoStorageHost.hpp b/src/coreComponents/common/LifoStorageHost.hpp index 3ffb202db74..f787f10a17f 100644 --- a/src/coreComponents/common/LifoStorageHost.hpp +++ b/src/coreComponents/common/LifoStorageHost.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/MemoryInfos.cpp b/src/coreComponents/common/MemoryInfos.cpp index 51213c5cfec..4ad404188e3 100644 --- a/src/coreComponents/common/MemoryInfos.cpp +++ b/src/coreComponents/common/MemoryInfos.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/MemoryInfos.hpp b/src/coreComponents/common/MemoryInfos.hpp index 90763a7f18d..a3dcc024359 100644 --- a/src/coreComponents/common/MemoryInfos.hpp +++ b/src/coreComponents/common/MemoryInfos.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/MpiWrapper.cpp b/src/coreComponents/common/MpiWrapper.cpp index 8b8a0afc6a2..f2b830e734e 100644 --- a/src/coreComponents/common/MpiWrapper.cpp +++ b/src/coreComponents/common/MpiWrapper.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/MpiWrapper.hpp b/src/coreComponents/common/MpiWrapper.hpp index 9f165e682d3..998524d3b13 100644 --- a/src/coreComponents/common/MpiWrapper.hpp +++ b/src/coreComponents/common/MpiWrapper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/MultiMutexesLock.hpp b/src/coreComponents/common/MultiMutexesLock.hpp index f338fea4478..e3142abbadc 100644 --- a/src/coreComponents/common/MultiMutexesLock.hpp +++ b/src/coreComponents/common/MultiMutexesLock.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/Path.cpp b/src/coreComponents/common/Path.cpp index 853f4557904..a983e5af3cc 100644 --- a/src/coreComponents/common/Path.cpp +++ b/src/coreComponents/common/Path.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/Path.hpp b/src/coreComponents/common/Path.hpp index 27e54f3cf03..9f768838e31 100644 --- a/src/coreComponents/common/Path.hpp +++ b/src/coreComponents/common/Path.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/PhysicsConstants.hpp b/src/coreComponents/common/PhysicsConstants.hpp index 8bc35c1b1fd..50a2384ef8c 100644 --- a/src/coreComponents/common/PhysicsConstants.hpp +++ b/src/coreComponents/common/PhysicsConstants.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/Span.hpp b/src/coreComponents/common/Span.hpp index 4623fdcdf5f..49469bf968e 100644 --- a/src/coreComponents/common/Span.hpp +++ b/src/coreComponents/common/Span.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/Stopwatch.hpp b/src/coreComponents/common/Stopwatch.hpp index c506f5190ab..9aec6f65f66 100644 --- a/src/coreComponents/common/Stopwatch.hpp +++ b/src/coreComponents/common/Stopwatch.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/Tensor.hpp b/src/coreComponents/common/Tensor.hpp index 0a13e98cdcc..602f21794e1 100644 --- a/src/coreComponents/common/Tensor.hpp +++ b/src/coreComponents/common/Tensor.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/Timer.hpp b/src/coreComponents/common/Timer.hpp index 8deac3d3cc7..f7a4b342dcc 100644 --- a/src/coreComponents/common/Timer.hpp +++ b/src/coreComponents/common/Timer.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/TimingMacros.hpp b/src/coreComponents/common/TimingMacros.hpp index 01dc0a7f880..c9935cbd1b6 100644 --- a/src/coreComponents/common/TimingMacros.hpp +++ b/src/coreComponents/common/TimingMacros.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/TypeDispatch.hpp b/src/coreComponents/common/TypeDispatch.hpp index d01ddf58637..282c9421589 100644 --- a/src/coreComponents/common/TypeDispatch.hpp +++ b/src/coreComponents/common/TypeDispatch.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/Units.cpp b/src/coreComponents/common/Units.cpp index b5a53033c71..746cd866a7c 100644 --- a/src/coreComponents/common/Units.cpp +++ b/src/coreComponents/common/Units.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/Units.hpp b/src/coreComponents/common/Units.hpp index 26b19eef555..ba35f3fb8d6 100644 --- a/src/coreComponents/common/Units.hpp +++ b/src/coreComponents/common/Units.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/format/Format.hpp b/src/coreComponents/common/format/Format.hpp index d8dcb832cf0..de5954dcc37 100644 --- a/src/coreComponents/common/format/Format.hpp +++ b/src/coreComponents/common/format/Format.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/format/StringUtilities.cpp b/src/coreComponents/common/format/StringUtilities.cpp index 0c692f6a17d..e9bffe8c0f8 100644 --- a/src/coreComponents/common/format/StringUtilities.cpp +++ b/src/coreComponents/common/format/StringUtilities.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/format/StringUtilities.hpp b/src/coreComponents/common/format/StringUtilities.hpp index a03e44ac8ea..d8a2ace618a 100644 --- a/src/coreComponents/common/format/StringUtilities.hpp +++ b/src/coreComponents/common/format/StringUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/format/table/TableData.cpp b/src/coreComponents/common/format/table/TableData.cpp index c4af2bce74a..4ff32559385 100644 --- a/src/coreComponents/common/format/table/TableData.cpp +++ b/src/coreComponents/common/format/table/TableData.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/format/table/TableData.hpp b/src/coreComponents/common/format/table/TableData.hpp index 005e3dda7bc..316adeda8a3 100644 --- a/src/coreComponents/common/format/table/TableData.hpp +++ b/src/coreComponents/common/format/table/TableData.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/format/table/TableFormatter.cpp b/src/coreComponents/common/format/table/TableFormatter.cpp index 13956a41cd0..da1f90df986 100644 --- a/src/coreComponents/common/format/table/TableFormatter.cpp +++ b/src/coreComponents/common/format/table/TableFormatter.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/format/table/TableFormatter.hpp b/src/coreComponents/common/format/table/TableFormatter.hpp index 21ddc8c5b11..35410506e07 100644 --- a/src/coreComponents/common/format/table/TableFormatter.hpp +++ b/src/coreComponents/common/format/table/TableFormatter.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/format/table/TableLayout.cpp b/src/coreComponents/common/format/table/TableLayout.cpp index b3de6f6b917..7912baa9211 100644 --- a/src/coreComponents/common/format/table/TableLayout.cpp +++ b/src/coreComponents/common/format/table/TableLayout.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/format/table/TableLayout.hpp b/src/coreComponents/common/format/table/TableLayout.hpp index 1c4608e3ea5..99354e85417 100644 --- a/src/coreComponents/common/format/table/TableLayout.hpp +++ b/src/coreComponents/common/format/table/TableLayout.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/format/table/unitTests/testTable.cpp b/src/coreComponents/common/format/table/unitTests/testTable.cpp index 37c78d01db6..35507b94c03 100644 --- a/src/coreComponents/common/format/table/unitTests/testTable.cpp +++ b/src/coreComponents/common/format/table/unitTests/testTable.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/format/unitTests/testStringUtilities.cpp b/src/coreComponents/common/format/unitTests/testStringUtilities.cpp index bbf682de8e9..94ca8bc039e 100644 --- a/src/coreComponents/common/format/unitTests/testStringUtilities.cpp +++ b/src/coreComponents/common/format/unitTests/testStringUtilities.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 03bf8bfcea0..78e9a0db602 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/initializeEnvironment.hpp b/src/coreComponents/common/initializeEnvironment.hpp index 70e2b4b720b..d6364028799 100644 --- a/src/coreComponents/common/initializeEnvironment.hpp +++ b/src/coreComponents/common/initializeEnvironment.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/logger/Logger.cpp b/src/coreComponents/common/logger/Logger.cpp index c730e8168ad..bd800697524 100644 --- a/src/coreComponents/common/logger/Logger.cpp +++ b/src/coreComponents/common/logger/Logger.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index 2988677aaa8..e966df9e9f8 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/unitTests/testCaliperSmoke.cpp b/src/coreComponents/common/unitTests/testCaliperSmoke.cpp index 77771355819..2c3b5fa8cde 100644 --- a/src/coreComponents/common/unitTests/testCaliperSmoke.cpp +++ b/src/coreComponents/common/unitTests/testCaliperSmoke.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/unitTests/testDataTypes.cpp b/src/coreComponents/common/unitTests/testDataTypes.cpp index bd875e8d70b..b5c2a1f87ee 100644 --- a/src/coreComponents/common/unitTests/testDataTypes.cpp +++ b/src/coreComponents/common/unitTests/testDataTypes.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp b/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp index b9a2489b181..e5f64662e64 100644 --- a/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp +++ b/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/unitTests/testLifoStorage.cpp b/src/coreComponents/common/unitTests/testLifoStorage.cpp index 1432137b545..80414e5ce04 100644 --- a/src/coreComponents/common/unitTests/testLifoStorage.cpp +++ b/src/coreComponents/common/unitTests/testLifoStorage.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/unitTests/testTypeDispatch.cpp b/src/coreComponents/common/unitTests/testTypeDispatch.cpp index 4b0b19db0ab..414436cd46d 100644 --- a/src/coreComponents/common/unitTests/testTypeDispatch.cpp +++ b/src/coreComponents/common/unitTests/testTypeDispatch.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/common/unitTests/testUnits.cpp b/src/coreComponents/common/unitTests/testUnits.cpp index a27d979c1a2..f94a3616b5e 100644 --- a/src/coreComponents/common/unitTests/testUnits.cpp +++ b/src/coreComponents/common/unitTests/testUnits.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/ConstitutiveBase.cpp b/src/coreComponents/constitutive/ConstitutiveBase.cpp index 5912c5036ae..f18138b0e87 100644 --- a/src/coreComponents/constitutive/ConstitutiveBase.cpp +++ b/src/coreComponents/constitutive/ConstitutiveBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/ConstitutiveBase.hpp b/src/coreComponents/constitutive/ConstitutiveBase.hpp index 1c876768381..9f39fbbd314 100644 --- a/src/coreComponents/constitutive/ConstitutiveBase.hpp +++ b/src/coreComponents/constitutive/ConstitutiveBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/ConstitutiveManager.cpp b/src/coreComponents/constitutive/ConstitutiveManager.cpp index 5328aaf10c3..38d47321344 100644 --- a/src/coreComponents/constitutive/ConstitutiveManager.cpp +++ b/src/coreComponents/constitutive/ConstitutiveManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/ConstitutiveManager.hpp b/src/coreComponents/constitutive/ConstitutiveManager.hpp index 3962a4bbe75..fbea4c187ed 100644 --- a/src/coreComponents/constitutive/ConstitutiveManager.hpp +++ b/src/coreComponents/constitutive/ConstitutiveManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/ConstitutivePassThru.hpp b/src/coreComponents/constitutive/ConstitutivePassThru.hpp index a74a7f4dc87..bef43e6e7ce 100644 --- a/src/coreComponents/constitutive/ConstitutivePassThru.hpp +++ b/src/coreComponents/constitutive/ConstitutivePassThru.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp b/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp index 631b32d6b2f..54dc51b24cc 100644 --- a/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp +++ b/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/ExponentialRelation.hpp b/src/coreComponents/constitutive/ExponentialRelation.hpp index ff0f197872a..64866627cbd 100644 --- a/src/coreComponents/constitutive/ExponentialRelation.hpp +++ b/src/coreComponents/constitutive/ExponentialRelation.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/NullModel.cpp b/src/coreComponents/constitutive/NullModel.cpp index 732a47c53b9..7ec9e6f19c0 100644 --- a/src/coreComponents/constitutive/NullModel.cpp +++ b/src/coreComponents/constitutive/NullModel.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/NullModel.hpp b/src/coreComponents/constitutive/NullModel.hpp index 0a0635da757..e26a34b525b 100644 --- a/src/coreComponents/constitutive/NullModel.hpp +++ b/src/coreComponents/constitutive/NullModel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp index 6e34b636749..eab49c34049 100644 --- a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp index 48d53d7e6a2..67f4195d31b 100644 --- a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp index b097576cc1a..b3d7e2bba0b 100644 --- a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp index efe78bdd908..b63aea24aac 100644 --- a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp index 74b5c13998f..b9836e21f11 100644 --- a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp index de1a06ddf1b..305abff3455 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp index 33395544d0c..270adb15902 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp index a5354d499a8..13d9926f49a 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp index 35afce50906..170055d19bb 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp index f6ee1174791..818f869f2b4 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp index b55e4858e36..3e66d868928 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp index a7822804573..d739e9e2d5b 100644 --- a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp index f7512bfbc9b..17e58221279 100644 --- a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp b/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp index 987ec59bc60..ad6b69b9082 100644 --- a/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/capillaryPressure/layouts.hpp b/src/coreComponents/constitutive/capillaryPressure/layouts.hpp index 802c932fcc7..e66655c18b9 100644 --- a/src/coreComponents/constitutive/capillaryPressure/layouts.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/layouts.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.cpp b/src/coreComponents/constitutive/contact/CoulombFriction.cpp index bf9d89cb073..32a5ee4f765 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.cpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.hpp b/src/coreComponents/constitutive/contact/CoulombFriction.hpp index e2cd87f024f..02c56ed0926 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.hpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/contact/FrictionSelector.hpp b/src/coreComponents/constitutive/contact/FrictionSelector.hpp index 70f510eb0a7..8eab7ff72dd 100644 --- a/src/coreComponents/constitutive/contact/FrictionSelector.hpp +++ b/src/coreComponents/constitutive/contact/FrictionSelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.cpp b/src/coreComponents/constitutive/contact/FrictionlessContact.cpp index a74b36a76fb..557bdd81a0d 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.cpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp index 81aeea036d3..b4ce8dba853 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp index 60c3f0ab807..b57d9e3e58e 100644 --- a/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp +++ b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp b/src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp index c1e9c47c1ce..2022e6cec5c 100644 --- a/src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp +++ b/src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp index 0ea578e7f32..d53096ba4ff 100644 --- a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp +++ b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp index ae25a77d2ac..c482781b8bb 100644 --- a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp +++ b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp index e87a50d5426..8bacdb7dfb5 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp b/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp index a80b749242f..7bc5daed75b 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp b/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp index 052a4d907d5..397f6214553 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp b/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp index 42634f06f40..fe077fef543 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/dispersion/DispersionBase.cpp b/src/coreComponents/constitutive/dispersion/DispersionBase.cpp index 416904148f4..8e15b45fe77 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionBase.cpp +++ b/src/coreComponents/constitutive/dispersion/DispersionBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/dispersion/DispersionBase.hpp b/src/coreComponents/constitutive/dispersion/DispersionBase.hpp index 99587459115..6ced3ca28b8 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionBase.hpp +++ b/src/coreComponents/constitutive/dispersion/DispersionBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/dispersion/DispersionFields.hpp b/src/coreComponents/constitutive/dispersion/DispersionFields.hpp index 66f85fc2781..0baca85dca8 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionFields.hpp +++ b/src/coreComponents/constitutive/dispersion/DispersionFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp b/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp index f0e5f146fef..3dda4ba2ab1 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp +++ b/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp index 57cf6b28e4b..5f49d1a66fd 100644 --- a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp +++ b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp index 4ac27a5d81c..949f72e51d6 100644 --- a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp +++ b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 67454b13c51..7125e3fe6a0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp index 2eec3526e92..fed8e2c8c67 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp index d3bdc762b0e..596d6332457 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp index 9be9db8ac8a..5d8abb34def 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp index b29592473a1..8a5b6020592 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp index 8bae9da6bd3..227f5a93912 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp index 32936f78fc4..534c9d1f1d2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp index 2bb308086e6..6734098364f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp index 6f00ccc7a53..1c476e09085 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp index 77d27b1a883..226357aed9c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp index 269528420fc..ea7143a4443 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp index ce92e600ff8..7defd458bd4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp index 677f6c61450..9b918c8be5f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp index dfd7ed7add3..f9ce8006fc9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp index 6310bf49224..1f612890a9a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp index 8713454505c..a35551945e1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp index 892baf5751f..8d69675aae6 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp index 6b7ac1ed990..b8aeccec02a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp index 19db851b67f..dd3202d5ecf 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp index f79cd790427..62d055f1add 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp index 23803a777f9..e45d04f312f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp index afa90c08979..d6b81cca1fa 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp index 688fe9ae3e8..7a6af6b075f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp index 783e3976405..2778347dd78 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp index dd445557884..a05497483eb 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp index 1d93b628265..9dde0d4cf39 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp index 6122bc4ef61..129e723a205 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp index 9033b586fa7..f22a8e945e5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp index c8836f67143..7107cb15056 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp index e3776fe90cc..1ff04c0bd91 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp index e6f0364e012..a3cb6458b94 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp index bd7f990b215..872983ce8b8 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp index e8787ccd427..ceefb08daf2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp index c706cd95264..1167d615994 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp index 4c0d3dada34..5b3ba0f5a30 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp index ad3e8dd5c11..fc963e7811a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp b/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp index 76716182c59..302b8fd9eb0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp index 16cb5903adc..a0d1157a022 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp index b7b9a387b94..802f9a921bf 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp index 6d94ba2c422..191d49a90bb 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp index d73639350a0..4983406b17a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index 8391c62965f..7d54ed3e3c4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp index 3bccb811d38..68283ef38c5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp index 5daaa66f6d9..4a4118c1cbf 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp index 832ea0904e8..112c677bad3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp index e31fa7bb339..0e86a3e7777 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp index 03a6aadba67..dbca6083fca 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp index 390e756f5fd..91162808882 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp index e0405f17f20..69311e692f2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp index eee1929c68e..1a36a2e124b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp index bcc002ff0f7..cec6671cb93 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp index c7d079dcb0b..aa91a802388 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp index 5e37c4ab479..a8f846aac39 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp index 176d051f0f3..0edd0113625 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp index 3df983ad857..e6fa1574e55 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp index 40002e84e48..1ef2d44b8f7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp index 7b37415f954..1567f4b4c46 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp index ccf48b312b9..d58252d405f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp index dfe817fc894..d7ac72c2912 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp index d992157f521..ac6d7efc240 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp index 3ef3cf25b5f..758a4e8ec89 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp index c2d8d0bde19..7135d944906 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp index c0cf7c7f30c..f492995b1ad 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp index aaf71b93089..f12b715cbe7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp index 22a1485f5f7..95577d6a2c4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp index 250b4d7a60c..2d92185454f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp index 227ff77ffff..6fe6b1a11e7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp index 4851da980fd..9fce5bdd029 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp index 2b6f05510bf..76c565f51a7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp index 236f430b9a1..d7fabd362d6 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp index f9a08804ba7..dd6b3d294c7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp index f32e388c9ad..60d15385144 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp index 9ffa7d2f418..62fafd82953 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp index 42c8c18706b..96b213940c1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp index ac8c8da3749..87c1d659435 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp index 2cca343202e..9404e565f83 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp index 39583fc6e36..615e24ab9c1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp index 3dc51eaee87..e87373c09a6 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp index cb87558e693..1a1999e78ba 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp index d84d770c39e..922e1ef877c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp index 8959823b9a4..12d0e5ba541 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp index 3ebb34c0a86..c1696c2a635 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp index 1a619cfcf88..9226dda9343 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp index 4b3213d84a2..bf13c8d01ab 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index 1cb850d3b40..708d4f42d31 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp index bf7040d8cb4..0ff1ba70c0b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp index 307d7a6dab0..c322d6a3fb5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp index fcb3a6e61c5..7e66577b671 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp index 35c629ef71d..460f45c2c35 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp index 65b609f1e7e..83fda798442 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp index d98b9b7c1dc..7c5bc5b162b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp index dfb3f4fcbea..ecd3a28633d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp index 8b21bd86df6..7a17afc8666 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp index 22f0ef1b0fa..05f82ae4d64 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp index 899c4322778..3b8f8a6db28 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp index ed5f67b8154..35c084290c1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp index 353fa69abcd..28550afbfc6 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp index 6155265b287..d4c545b002e 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp index b0f9fc5b2dd..38f067be667 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp index 76579665d1f..3d621f888d0 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp index fa7a07322ad..778d9a752ab 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp index 5356b3d5910..761e0c63a28 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp index 82981ebece3..fd8a69196fd 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp index 92aa8bc821c..f7e39e26b73 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp index 35892c14bad..4c59aeb37ba 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp index 22ac6bed8d5..0a9c1610635 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp index 170e7800a47..e9870a759a4 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp index 0ad291f6971..5b1c159f01f 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp index 7a0dc182027..61949828116 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp index 5b33c887c63..cdb7103fd1a 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp index 284692521c9..c51906552a5 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp index fcc24a0f7fb..2ab967932c9 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp index ec918c41e5a..fe45d82982f 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp index be026cb79c2..731c0856eec 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp index 5815c2f7a47..181af8bcba2 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp index 59f65081225..01d7a802e6d 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp index 189fffb985d..598f0851e5a 100644 --- a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp index a0e583a308f..56215dd6df5 100644 --- a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp b/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp index c0653de3d5b..798bc79bb9a 100644 --- a/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp b/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp index 48e62f39982..70954cf1e22 100644 --- a/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp index e4559758a0a..31ecf701137 100644 --- a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp index b51d42f51e4..df2136e18dd 100644 --- a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp index afe5ba8e927..65b42bb0103 100644 --- a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp index b96ab7c6632..0f42a319307 100644 --- a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp b/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp index c85c2efb10c..949adb86f97 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp index 1ba7774c1c5..6c7cb62bdd9 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp b/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp index 863b108592e..cafb94fb3ee 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp index b10676acb64..625b4af4c38 100644 --- a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.hpp b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp index d2ae5db4231..28ad3559670 100644 --- a/src/coreComponents/constitutive/permeability/PressurePermeability.hpp +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp b/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp index fa9b1b5d49c..b9a72df93bc 100644 --- a/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp b/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp index 4d5ac39eb82..3c81228d217 100644 --- a/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp index 0daa99a4a77..ca69e02561e 100644 --- a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp index 2a4e6e6b19b..b7d52617a64 100644 --- a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp index 35bf742fc14..9be8d42e3b2 100644 --- a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp index a524ca5cc8c..d1d6a846745 100644 --- a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp index c15cc574149..b43afd85521 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp index 210a1f8b9e8..57181e7f726 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp index aecdbe4abcb..458a0fc23b1 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp index f1b382deeeb..e4fc6195e7e 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp index 94af64dd9af..f7bf08c0f4f 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp index 6f60e69fcbe..99e6caff614 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp index 6918a3de6d9..093dd9a52fd 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp index 86bf7c44e58..da634a6ac48 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp index 5944dfa453a..d4aad3b60e0 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp index 0b4f49bb9f1..eae8eb8b394 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp index 6329538cda5..6ee5cd3d31d 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp index 131d71c2baa..26bd464c4ac 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp index 7d7be256a4a..89ad0cc0460 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp index fbe56c0138c..ab8fa7e3749 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp index 362f687c681..bb220ab6bdc 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp index f537f73722d..4eb224bb5e2 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp index 97a50d598b9..1ecd09e95f7 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp index 2a769a7dbd5..b690d9abcfe 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp index 18c30499a01..88ac8c2eafc 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp index 0f61f3528ad..816b4639ace 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp index 46a95e5b212..9896b892950 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/relativePermeability/layouts.hpp b/src/coreComponents/constitutive/relativePermeability/layouts.hpp index 16a8c6c2a97..54c2e307a30 100644 --- a/src/coreComponents/constitutive/relativePermeability/layouts.hpp +++ b/src/coreComponents/constitutive/relativePermeability/layouts.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/CeramicDamage.cpp b/src/coreComponents/constitutive/solid/CeramicDamage.cpp index 5cb32401d0c..77cc069f45b 100644 --- a/src/coreComponents/constitutive/solid/CeramicDamage.cpp +++ b/src/coreComponents/constitutive/solid/CeramicDamage.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/CeramicDamage.hpp b/src/coreComponents/constitutive/solid/CeramicDamage.hpp index 660360e458f..e53fb9c4eb7 100644 --- a/src/coreComponents/constitutive/solid/CeramicDamage.hpp +++ b/src/coreComponents/constitutive/solid/CeramicDamage.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/CompressibleSolid.cpp b/src/coreComponents/constitutive/solid/CompressibleSolid.cpp index efcad2165f7..2366d66654b 100644 --- a/src/coreComponents/constitutive/solid/CompressibleSolid.cpp +++ b/src/coreComponents/constitutive/solid/CompressibleSolid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp index 8a6620186ae..0fc8464a260 100644 --- a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp +++ b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/CoupledSolid.hpp b/src/coreComponents/constitutive/solid/CoupledSolid.hpp index 84ee74fb11b..e255738fd22 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolid.hpp +++ b/src/coreComponents/constitutive/solid/CoupledSolid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp b/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp index bc3ae992802..70cdb0f1a3c 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp +++ b/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp index 4b7656e8daa..0facab675ca 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp +++ b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/Damage.cpp b/src/coreComponents/constitutive/solid/Damage.cpp index cee1a0260e7..46f64f49621 100644 --- a/src/coreComponents/constitutive/solid/Damage.cpp +++ b/src/coreComponents/constitutive/solid/Damage.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/Damage.hpp b/src/coreComponents/constitutive/solid/Damage.hpp index d8fd9b3cac3..53eb7b6b1b4 100644 --- a/src/coreComponents/constitutive/solid/Damage.hpp +++ b/src/coreComponents/constitutive/solid/Damage.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DamageSpectral.cpp b/src/coreComponents/constitutive/solid/DamageSpectral.cpp index 3cf1ca7c7b8..995870109c1 100644 --- a/src/coreComponents/constitutive/solid/DamageSpectral.cpp +++ b/src/coreComponents/constitutive/solid/DamageSpectral.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DamageSpectral.hpp b/src/coreComponents/constitutive/solid/DamageSpectral.hpp index 1bd6c35d30e..6e2fe29a2b2 100644 --- a/src/coreComponents/constitutive/solid/DamageSpectral.hpp +++ b/src/coreComponents/constitutive/solid/DamageSpectral.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp b/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp index bd0584af82c..ebd09c0defe 100644 --- a/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp +++ b/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DamageVolDev.cpp b/src/coreComponents/constitutive/solid/DamageVolDev.cpp index eb123a7a73c..5b739797f08 100644 --- a/src/coreComponents/constitutive/solid/DamageVolDev.cpp +++ b/src/coreComponents/constitutive/solid/DamageVolDev.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DamageVolDev.hpp b/src/coreComponents/constitutive/solid/DamageVolDev.hpp index 3db1120707a..5121efd3264 100644 --- a/src/coreComponents/constitutive/solid/DamageVolDev.hpp +++ b/src/coreComponents/constitutive/solid/DamageVolDev.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DelftEgg.cpp b/src/coreComponents/constitutive/solid/DelftEgg.cpp index 5797ca7c1db..c0067b98c74 100644 --- a/src/coreComponents/constitutive/solid/DelftEgg.cpp +++ b/src/coreComponents/constitutive/solid/DelftEgg.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DelftEgg.hpp b/src/coreComponents/constitutive/solid/DelftEgg.hpp index 978933ce0d9..aa0d523b96e 100644 --- a/src/coreComponents/constitutive/solid/DelftEgg.hpp +++ b/src/coreComponents/constitutive/solid/DelftEgg.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp index fe42be1bb1e..d5dd8ae8571 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp index a69d0b113a0..41fea87e3a0 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp index 0674e48d5ce..45e3b5d0163 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp index 98c25a52e48..730c7366741 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DruckerPrager.cpp b/src/coreComponents/constitutive/solid/DruckerPrager.cpp index 02c9ca51f7b..31f5eadde37 100644 --- a/src/coreComponents/constitutive/solid/DruckerPrager.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPrager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DruckerPrager.hpp b/src/coreComponents/constitutive/solid/DruckerPrager.hpp index 2551c3b679c..559b2574a6f 100644 --- a/src/coreComponents/constitutive/solid/DruckerPrager.hpp +++ b/src/coreComponents/constitutive/solid/DruckerPrager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp index 601f4add769..589017c137b 100644 --- a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp b/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp index 465fc8fd262..3ee5589a467 100644 --- a/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp +++ b/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp b/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp index c419186830e..e6de4db060a 100644 --- a/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp +++ b/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp b/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp index 6f2a392191a..aea9de6e248 100644 --- a/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp +++ b/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp b/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp index eb6ee291755..0567a493b3f 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp b/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp index bfac7f8c2dd..b6388f8e907 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp index 120b3018002..fc6221a64fa 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp index 1b911e37f85..3718765d3b2 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp b/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp index c1e6572d7f4..53ec491e631 100644 --- a/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp b/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp index 9197da0d1db..8b2de4284a5 100644 --- a/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp index 2aacdfd5f49..5e96b28a251 100644 --- a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp index 87e55a0acb9..0e5f53fe2b3 100644 --- a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp b/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp index 0d833f0e514..fed49ad74f7 100644 --- a/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp +++ b/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp index 7e1f8d8495f..f5dfae8f624 100644 --- a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp +++ b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp b/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp index 1d537829c7c..8098ed1a851 100644 --- a/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp +++ b/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp b/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp index e37da9ce328..e7425e97c0c 100644 --- a/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp +++ b/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp b/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp index ecd19e68df1..58531b5fa8b 100644 --- a/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp +++ b/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/PorousSolid.cpp b/src/coreComponents/constitutive/solid/PorousSolid.cpp index 45527e04213..b4641e0b863 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.cpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/PorousSolid.hpp b/src/coreComponents/constitutive/solid/PorousSolid.hpp index 0d7567bf019..92502fd947c 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.hpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/PropertyConversions.hpp b/src/coreComponents/constitutive/solid/PropertyConversions.hpp index 6119995d621..232004c7388 100644 --- a/src/coreComponents/constitutive/solid/PropertyConversions.hpp +++ b/src/coreComponents/constitutive/solid/PropertyConversions.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ProppantSolid.cpp b/src/coreComponents/constitutive/solid/ProppantSolid.cpp index 975da1852d5..60fae0f7796 100644 --- a/src/coreComponents/constitutive/solid/ProppantSolid.cpp +++ b/src/coreComponents/constitutive/solid/ProppantSolid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/ProppantSolid.hpp b/src/coreComponents/constitutive/solid/ProppantSolid.hpp index 394ecd9083b..ef3f596fb39 100644 --- a/src/coreComponents/constitutive/solid/ProppantSolid.hpp +++ b/src/coreComponents/constitutive/solid/ProppantSolid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/SolidBase.cpp b/src/coreComponents/constitutive/solid/SolidBase.cpp index 41ac8776c4b..88985c4c710 100644 --- a/src/coreComponents/constitutive/solid/SolidBase.cpp +++ b/src/coreComponents/constitutive/solid/SolidBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/SolidBase.hpp b/src/coreComponents/constitutive/solid/SolidBase.hpp index 54c281731f4..cbcf7ffaca8 100644 --- a/src/coreComponents/constitutive/solid/SolidBase.hpp +++ b/src/coreComponents/constitutive/solid/SolidBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp b/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp index da98b275657..ccd670cd40c 100644 --- a/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp +++ b/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp b/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp index e257cdb6ff2..49dde48bb02 100644 --- a/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp +++ b/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp index 47be2037a9f..710449b0a19 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp index dbf1ca64346..a3e3ccb715e 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp index 8532358c494..27cdf14073b 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp index 9b117a096c2..435802503b9 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp index 9424a68460d..e4a6f6d75b9 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/SolidUtilities.hpp b/src/coreComponents/constitutive/solid/SolidUtilities.hpp index 045e1b92269..59cd1c79a91 100644 --- a/src/coreComponents/constitutive/solid/SolidUtilities.hpp +++ b/src/coreComponents/constitutive/solid/SolidUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp index d949fa07e8c..ca0bcfc2a2e 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp index 39f04818ef9..1e7087744f7 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp b/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp index f700fa7c4f3..4665e9a78be 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp index 2fff8f32b8f..2f5486e73a0 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp b/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp index 84509da2768..835a15ec859 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp index 5626e2dccc6..37b79e20fdf 100644 --- a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp index e526543a72b..10b896a40ef 100644 --- a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp index 48e9875761f..cf6f62a5059 100644 --- a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp index a9114db79d1..49256bbfd80 100644 --- a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp index cb0f118fe49..b7a78462ce5 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp index 1ece6881d5b..e819bd9a5dd 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp index 1e99c0a29b1..5754a2960ce 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp index 77b7543c810..96c70739b2f 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp index eddb8f90168..98107f4f134 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp index 28e9fd85607..c1036ea94ce 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp index a4cfebf897e..f88f92a932c 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp index 5a03ec9165e..5e0844f1178 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp index 235e7bf528f..96398d60a59 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp index 214e386db88..7e069bd0bd2 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp index 1a2b3db708d..245cf2800d5 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp index cccc537dc99..16bdf302ec0 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp index b785e73e331..267183f85c3 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp index 7131e53bf94..1fe3bc24a21 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp b/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp index 23772a447f6..fc259f25e29 100644 --- a/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/TestFluid.hpp b/src/coreComponents/constitutive/unitTests/TestFluid.hpp index 1245cbe3218..18f8393ec14 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluid.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluid.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp b/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp index 822a8a25070..d9824534902 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp index 9c3c2fbcfc4..5c787084189 100644 --- a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp +++ b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp index 386d015f5d1..b4f0ff4e4d4 100644 --- a/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp +++ b/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp b/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp index 405e6bcf22e..8a0c0de0d44 100644 --- a/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp +++ b/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp b/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp index 34b8ffe29e9..ee8eee252b9 100644 --- a/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp +++ b/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp b/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp index bb7fdc39241..06d8292f9a7 100644 --- a/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp +++ b/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp b/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp index 667c8ddd66c..b514a16eca2 100644 --- a/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp +++ b/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp b/src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp index 7149906eb24..36716b44831 100644 --- a/src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp +++ b/src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp index f9de4dbf948..7fde1b28d6d 100644 --- a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp +++ b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp index 1f0ae08873b..f74d3c78a26 100644 --- a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp b/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp index 8aceabd8b9b..7507a986d2c 100644 --- a/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp +++ b/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp index 28ac0c4714b..05db5efdac7 100644 --- a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp index bbf24832e94..afb9644ba24 100644 --- a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp b/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp index 140c71e6745..48ea052e2cc 100644 --- a/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp +++ b/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp b/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp index 817b541d970..86cb9470651 100644 --- a/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp +++ b/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp b/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp index 7a58389669d..8b771529ac6 100644 --- a/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp +++ b/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp index 839e7181859..a3f200202e8 100644 --- a/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp index e312ac186b9..0a1289223ab 100644 --- a/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutive/unitTests/testTriaxial.cpp b/src/coreComponents/constitutive/unitTests/testTriaxial.cpp index 6cdc9f64237..009d7727d9a 100644 --- a/src/coreComponents/constitutive/unitTests/testTriaxial.cpp +++ b/src/coreComponents/constitutive/unitTests/testTriaxial.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp index 4df6aae9cd4..fb0ab379189 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp index 2e91dd5c8be..a27cfb29699 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp index a36fc8c0cbd..145b2faae17 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp index 12c1472d97a..d6f41b1bf52 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp index aa20b9f12a7..47150da347f 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.hpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.hpp index 958c9fdfac3..dda67dac39c 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.hpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp index 5a8594a34cc..0a0254b196f 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp index 4d47ced92ab..829f310e773 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp index f93d5039c64..dbf4cf32eef 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp index f3968bef2ad..821b98d216e 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp index afcfd267f63..ba69e1f711d 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp index 73625f11864..8c2cc1f083f 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.hpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.hpp index 4c36e18cdb1..57f273e3b1e 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.hpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp index e2d684d74ca..75c701977d9 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.hpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.hpp index 890d453dc9f..b2516879f99 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.hpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp index 20601bcc9b8..578a3d59522 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp index b49a329e467..7e492550302 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp index 1884ff3491d..c1ca451cdc2 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverRunTest.hpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverRunTest.hpp index 75315d66fb4..7187ae8feb9 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverRunTest.hpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverRunTest.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp index 3e62792b0d7..cad00bfc8a1 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeRunTest.cpp index faf74231723..22b21ea79d8 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeRunTest.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp index 2513e100131..45b9400a33e 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp index c17b1646d3f..caac2444ec7 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp index c0e2a8ecdeb..49158cbc925 100644 --- a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.hpp b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.hpp index 4ebe6251dbd..1072d924818 100644 --- a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.hpp +++ b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/BufferOps.hpp b/src/coreComponents/dataRepository/BufferOps.hpp index 65ff284d676..c76bcee136e 100644 --- a/src/coreComponents/dataRepository/BufferOps.hpp +++ b/src/coreComponents/dataRepository/BufferOps.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/BufferOpsDevice.cpp b/src/coreComponents/dataRepository/BufferOpsDevice.cpp index b6215d3ea62..cf9c562a634 100644 --- a/src/coreComponents/dataRepository/BufferOpsDevice.cpp +++ b/src/coreComponents/dataRepository/BufferOpsDevice.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/BufferOpsDevice.hpp b/src/coreComponents/dataRepository/BufferOpsDevice.hpp index 12abafac593..0fec5bbf5a7 100644 --- a/src/coreComponents/dataRepository/BufferOpsDevice.hpp +++ b/src/coreComponents/dataRepository/BufferOpsDevice.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/BufferOps_inline.hpp b/src/coreComponents/dataRepository/BufferOps_inline.hpp index 961d3173f38..cd87b74e7eb 100644 --- a/src/coreComponents/dataRepository/BufferOps_inline.hpp +++ b/src/coreComponents/dataRepository/BufferOps_inline.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/ConduitRestart.cpp b/src/coreComponents/dataRepository/ConduitRestart.cpp index c94a1724e52..e0c18bc1b24 100644 --- a/src/coreComponents/dataRepository/ConduitRestart.cpp +++ b/src/coreComponents/dataRepository/ConduitRestart.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/ConduitRestart.hpp b/src/coreComponents/dataRepository/ConduitRestart.hpp index d853c84a2df..2fe3c07c98e 100644 --- a/src/coreComponents/dataRepository/ConduitRestart.hpp +++ b/src/coreComponents/dataRepository/ConduitRestart.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/DataContext.cpp b/src/coreComponents/dataRepository/DataContext.cpp index fc8ebe9d9ee..e20eab50e60 100644 --- a/src/coreComponents/dataRepository/DataContext.cpp +++ b/src/coreComponents/dataRepository/DataContext.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index 403b2fb5e55..16600e02f1b 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/DefaultValue.hpp b/src/coreComponents/dataRepository/DefaultValue.hpp index c5d5f3d21f4..dd2fed96a7d 100644 --- a/src/coreComponents/dataRepository/DefaultValue.hpp +++ b/src/coreComponents/dataRepository/DefaultValue.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/ExecutableGroup.cpp b/src/coreComponents/dataRepository/ExecutableGroup.cpp index a43b45a4280..4552db2d3d4 100644 --- a/src/coreComponents/dataRepository/ExecutableGroup.cpp +++ b/src/coreComponents/dataRepository/ExecutableGroup.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/ExecutableGroup.hpp b/src/coreComponents/dataRepository/ExecutableGroup.hpp index ae183dd5d80..dd3da89af5b 100644 --- a/src/coreComponents/dataRepository/ExecutableGroup.hpp +++ b/src/coreComponents/dataRepository/ExecutableGroup.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index e420631f5ff..c45758eb659 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index afae64bde36..b9ece0eba53 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index 1312cab5f32..e19a7358fa1 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/GroupContext.hpp b/src/coreComponents/dataRepository/GroupContext.hpp index f29238660e0..d361bd26e58 100644 --- a/src/coreComponents/dataRepository/GroupContext.hpp +++ b/src/coreComponents/dataRepository/GroupContext.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/HistoryDataSpec.hpp b/src/coreComponents/dataRepository/HistoryDataSpec.hpp index 3fd0d56b3a5..5ffbc3eb343 100644 --- a/src/coreComponents/dataRepository/HistoryDataSpec.hpp +++ b/src/coreComponents/dataRepository/HistoryDataSpec.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/InputFlags.hpp b/src/coreComponents/dataRepository/InputFlags.hpp index 72dc4d862b2..d761ad85f28 100644 --- a/src/coreComponents/dataRepository/InputFlags.hpp +++ b/src/coreComponents/dataRepository/InputFlags.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/KeyIndexT.hpp b/src/coreComponents/dataRepository/KeyIndexT.hpp index b5dbb501bc2..6a6b2ff32a3 100644 --- a/src/coreComponents/dataRepository/KeyIndexT.hpp +++ b/src/coreComponents/dataRepository/KeyIndexT.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/KeyNames.hpp b/src/coreComponents/dataRepository/KeyNames.hpp index 78efdd84762..30842d4c719 100644 --- a/src/coreComponents/dataRepository/KeyNames.hpp +++ b/src/coreComponents/dataRepository/KeyNames.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/MappedVector.hpp b/src/coreComponents/dataRepository/MappedVector.hpp index 82fd0d6f3b3..4fe016be1c1 100644 --- a/src/coreComponents/dataRepository/MappedVector.hpp +++ b/src/coreComponents/dataRepository/MappedVector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/ObjectCatalog.hpp b/src/coreComponents/dataRepository/ObjectCatalog.hpp index 71c7d7a2f84..c03715e09df 100644 --- a/src/coreComponents/dataRepository/ObjectCatalog.hpp +++ b/src/coreComponents/dataRepository/ObjectCatalog.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/ReferenceWrapper.hpp b/src/coreComponents/dataRepository/ReferenceWrapper.hpp index 930710ef6d1..0bd8b374b5e 100644 --- a/src/coreComponents/dataRepository/ReferenceWrapper.hpp +++ b/src/coreComponents/dataRepository/ReferenceWrapper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/RestartFlags.hpp b/src/coreComponents/dataRepository/RestartFlags.hpp index c827ee4d0bb..3188c7ad601 100644 --- a/src/coreComponents/dataRepository/RestartFlags.hpp +++ b/src/coreComponents/dataRepository/RestartFlags.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/Utilities.cpp b/src/coreComponents/dataRepository/Utilities.cpp index d8c6d9e1c34..37180553677 100644 --- a/src/coreComponents/dataRepository/Utilities.cpp +++ b/src/coreComponents/dataRepository/Utilities.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/Utilities.hpp b/src/coreComponents/dataRepository/Utilities.hpp index 18ab6cc9c0c..c88cc3290e7 100644 --- a/src/coreComponents/dataRepository/Utilities.hpp +++ b/src/coreComponents/dataRepository/Utilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/Wrapper.hpp b/src/coreComponents/dataRepository/Wrapper.hpp index d3a5255a4d1..881d9df2a6c 100644 --- a/src/coreComponents/dataRepository/Wrapper.hpp +++ b/src/coreComponents/dataRepository/Wrapper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/WrapperBase.cpp b/src/coreComponents/dataRepository/WrapperBase.cpp index 0c1aa286d06..518bf4dfed2 100644 --- a/src/coreComponents/dataRepository/WrapperBase.cpp +++ b/src/coreComponents/dataRepository/WrapperBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/WrapperBase.hpp b/src/coreComponents/dataRepository/WrapperBase.hpp index dfc4baa69a1..8737beb8473 100644 --- a/src/coreComponents/dataRepository/WrapperBase.hpp +++ b/src/coreComponents/dataRepository/WrapperBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index 71a2d5259da..253a2d9c053 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/WrapperContext.hpp b/src/coreComponents/dataRepository/WrapperContext.hpp index cf12d1ba166..7c1b059919d 100644 --- a/src/coreComponents/dataRepository/WrapperContext.hpp +++ b/src/coreComponents/dataRepository/WrapperContext.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/python/PyGroup.cpp b/src/coreComponents/dataRepository/python/PyGroup.cpp index 2a822d7d303..a9dbe024844 100644 --- a/src/coreComponents/dataRepository/python/PyGroup.cpp +++ b/src/coreComponents/dataRepository/python/PyGroup.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/python/PyGroup.hpp b/src/coreComponents/dataRepository/python/PyGroup.hpp index 57b51ffef9f..fc5d70ea934 100644 --- a/src/coreComponents/dataRepository/python/PyGroup.hpp +++ b/src/coreComponents/dataRepository/python/PyGroup.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/python/PyGroupType.hpp b/src/coreComponents/dataRepository/python/PyGroupType.hpp index ce19e5be4f0..042442a9f36 100644 --- a/src/coreComponents/dataRepository/python/PyGroupType.hpp +++ b/src/coreComponents/dataRepository/python/PyGroupType.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/python/PyWrapper.cpp b/src/coreComponents/dataRepository/python/PyWrapper.cpp index 0e986d3814b..cff2b890e95 100644 --- a/src/coreComponents/dataRepository/python/PyWrapper.cpp +++ b/src/coreComponents/dataRepository/python/PyWrapper.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/python/PyWrapper.hpp b/src/coreComponents/dataRepository/python/PyWrapper.hpp index 8350df82bc5..b6bb4400a07 100644 --- a/src/coreComponents/dataRepository/python/PyWrapper.hpp +++ b/src/coreComponents/dataRepository/python/PyWrapper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp index 434124f1c79..0f3c469f345 100644 --- a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp +++ b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp b/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp index 0befe6db35b..92f5861fa7d 100644 --- a/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp +++ b/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/unitTests/testPacking.cpp b/src/coreComponents/dataRepository/unitTests/testPacking.cpp index 890d6a7e60f..4befe364d83 100644 --- a/src/coreComponents/dataRepository/unitTests/testPacking.cpp +++ b/src/coreComponents/dataRepository/unitTests/testPacking.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp b/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp index 718cf1a5de4..15db54edc25 100644 --- a/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp +++ b/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/unitTests/testWrapper.cpp b/src/coreComponents/dataRepository/unitTests/testWrapper.cpp index 6384491af9e..6982cec6560 100644 --- a/src/coreComponents/dataRepository/unitTests/testWrapper.cpp +++ b/src/coreComponents/dataRepository/unitTests/testWrapper.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp b/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp index 105c4bccac9..ea1676cb17d 100644 --- a/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp +++ b/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/wrapperHelpers.hpp b/src/coreComponents/dataRepository/wrapperHelpers.hpp index 70af42750e0..021dbf018e3 100644 --- a/src/coreComponents/dataRepository/wrapperHelpers.hpp +++ b/src/coreComponents/dataRepository/wrapperHelpers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/xmlWrapper.cpp b/src/coreComponents/dataRepository/xmlWrapper.cpp index 4b4759980a0..ddca0c0e8eb 100644 --- a/src/coreComponents/dataRepository/xmlWrapper.cpp +++ b/src/coreComponents/dataRepository/xmlWrapper.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dataRepository/xmlWrapper.hpp b/src/coreComponents/dataRepository/xmlWrapper.hpp index f73f3ecaa7e..3909184a5be 100644 --- a/src/coreComponents/dataRepository/xmlWrapper.hpp +++ b/src/coreComponents/dataRepository/xmlWrapper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/denseLinearAlgebra/common/layouts.hpp b/src/coreComponents/denseLinearAlgebra/common/layouts.hpp index b5c6ce39eef..9e9415afa2b 100644 --- a/src/coreComponents/denseLinearAlgebra/common/layouts.hpp +++ b/src/coreComponents/denseLinearAlgebra/common/layouts.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp b/src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp index d45ae76accb..bdc2b22614f 100644 --- a/src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp +++ b/src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h index d427d81e238..c3716c8a870 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp index e9831519596..d9f1405cec4 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp index 3e626119a13..370c4c4ee5d 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp index 42f98d6c2a0..51abc10565e 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp index 6f8bbd08bbd..220e6fdb77f 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp index 5fc85de2864..678332963a0 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp b/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp index 9a14cced080..b57a2fe5192 100644 --- a/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp +++ b/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp b/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp index 311358874ff..3db8a3e6a7b 100644 --- a/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp +++ b/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/dummy.cpp b/src/coreComponents/dummy.cpp index 6bd5eb6f17d..e64d16594db 100644 --- a/src/coreComponents/dummy.cpp +++ b/src/coreComponents/dummy.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/EventBase.cpp b/src/coreComponents/events/EventBase.cpp index a6ca2e8f004..5a185d1c719 100644 --- a/src/coreComponents/events/EventBase.cpp +++ b/src/coreComponents/events/EventBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/EventBase.hpp b/src/coreComponents/events/EventBase.hpp index fdcd3c72a08..25a13175ffc 100644 --- a/src/coreComponents/events/EventBase.hpp +++ b/src/coreComponents/events/EventBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/EventManager.cpp b/src/coreComponents/events/EventManager.cpp index cdb4c239a56..11515e27574 100644 --- a/src/coreComponents/events/EventManager.cpp +++ b/src/coreComponents/events/EventManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/EventManager.hpp b/src/coreComponents/events/EventManager.hpp index b541efe6b58..f60c004fbf2 100644 --- a/src/coreComponents/events/EventManager.hpp +++ b/src/coreComponents/events/EventManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/HaltEvent.cpp b/src/coreComponents/events/HaltEvent.cpp index 5286740d90f..f4381f0b0fb 100644 --- a/src/coreComponents/events/HaltEvent.cpp +++ b/src/coreComponents/events/HaltEvent.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/HaltEvent.hpp b/src/coreComponents/events/HaltEvent.hpp index 98ae88e3540..5614484e54a 100644 --- a/src/coreComponents/events/HaltEvent.hpp +++ b/src/coreComponents/events/HaltEvent.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/PeriodicEvent.cpp b/src/coreComponents/events/PeriodicEvent.cpp index 88d24228199..bb55daa3b19 100644 --- a/src/coreComponents/events/PeriodicEvent.cpp +++ b/src/coreComponents/events/PeriodicEvent.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/PeriodicEvent.hpp b/src/coreComponents/events/PeriodicEvent.hpp index d7d2f996838..a737400358a 100644 --- a/src/coreComponents/events/PeriodicEvent.hpp +++ b/src/coreComponents/events/PeriodicEvent.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/SoloEvent.cpp b/src/coreComponents/events/SoloEvent.cpp index e7ef26e0771..5f3b1e87738 100644 --- a/src/coreComponents/events/SoloEvent.cpp +++ b/src/coreComponents/events/SoloEvent.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/SoloEvent.hpp b/src/coreComponents/events/SoloEvent.hpp index 8fb67c00966..ce53eba8f5f 100644 --- a/src/coreComponents/events/SoloEvent.hpp +++ b/src/coreComponents/events/SoloEvent.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/tasks/TaskBase.cpp b/src/coreComponents/events/tasks/TaskBase.cpp index fa81594d6e3..1a885b95ec2 100644 --- a/src/coreComponents/events/tasks/TaskBase.cpp +++ b/src/coreComponents/events/tasks/TaskBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/tasks/TaskBase.hpp b/src/coreComponents/events/tasks/TaskBase.hpp index 7e4f4d5b02f..c8744e18e15 100644 --- a/src/coreComponents/events/tasks/TaskBase.hpp +++ b/src/coreComponents/events/tasks/TaskBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/tasks/TasksManager.cpp b/src/coreComponents/events/tasks/TasksManager.cpp index 851a6fc8e7a..ad23ae788b1 100644 --- a/src/coreComponents/events/tasks/TasksManager.cpp +++ b/src/coreComponents/events/tasks/TasksManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/events/tasks/TasksManager.hpp b/src/coreComponents/events/tasks/TasksManager.hpp index 8b052585e72..79117b59437 100644 --- a/src/coreComponents/events/tasks/TasksManager.hpp +++ b/src/coreComponents/events/tasks/TasksManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp index 5eeccb0f095..69d0fe96041 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp index ea0186e7082..9ee270df074 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp index 4aaaf2c83c4..69229b5814f 100644 --- a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp index 0884672d294..589171fcd4e 100644 --- a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp index 5a08bfa5347..14a4f0cf60d 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp index d91baca73ae..9cff7dd6a93 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp index dd6444dcddd..3880a96d904 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp index b76ec17f808..953e2bee600 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp index b24582179e4..6edc963b457 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp index 5ce5f1f9e01..43175c82119 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp index 193fb636d17..42a360dff3a 100644 --- a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp +++ b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp index f0f67dd00d3..ae0eb160f99 100644 --- a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp +++ b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp index 720e015ea1d..c3d68b14bf7 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp index bb1cbeaa899..e04aa99b9d0 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp index ac644adbc79..9feb2731c58 100644 --- a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp index 605b9666c5c..a64404f40de 100644 --- a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp b/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp index aecbf821a58..21457e7796e 100644 --- a/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp b/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp index d45c7c638d0..7d17570d47d 100644 --- a/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/ChomboIO.cpp b/src/coreComponents/fileIO/Outputs/ChomboIO.cpp index 0923d603e4c..674f1e4eace 100644 --- a/src/coreComponents/fileIO/Outputs/ChomboIO.cpp +++ b/src/coreComponents/fileIO/Outputs/ChomboIO.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/ChomboIO.hpp b/src/coreComponents/fileIO/Outputs/ChomboIO.hpp index d816f2094b1..c483f066968 100644 --- a/src/coreComponents/fileIO/Outputs/ChomboIO.hpp +++ b/src/coreComponents/fileIO/Outputs/ChomboIO.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.cpp b/src/coreComponents/fileIO/Outputs/OutputBase.cpp index 88f8f9c8f29..0733dd38cc5 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.hpp b/src/coreComponents/fileIO/Outputs/OutputBase.hpp index 0f90ba1b12e..f4129433f7d 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/OutputManager.cpp b/src/coreComponents/fileIO/Outputs/OutputManager.cpp index daf034aed81..19034f1326b 100644 --- a/src/coreComponents/fileIO/Outputs/OutputManager.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/OutputManager.hpp b/src/coreComponents/fileIO/Outputs/OutputManager.hpp index 5c0ac6c56b2..399b5fd21b0 100644 --- a/src/coreComponents/fileIO/Outputs/OutputManager.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp b/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp index a52c011ff57..dceca432602 100644 --- a/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp b/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp index b7484fc6310..1aa69d07527 100644 --- a/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/PythonOutput.cpp b/src/coreComponents/fileIO/Outputs/PythonOutput.cpp index cb528036998..e78f8835a06 100644 --- a/src/coreComponents/fileIO/Outputs/PythonOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/PythonOutput.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/PythonOutput.hpp b/src/coreComponents/fileIO/Outputs/PythonOutput.hpp index c5326f8a044..0e6c3cebb85 100644 --- a/src/coreComponents/fileIO/Outputs/PythonOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/PythonOutput.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/RestartOutput.cpp b/src/coreComponents/fileIO/Outputs/RestartOutput.cpp index 1704ec320bd..6fb7a2c6b19 100644 --- a/src/coreComponents/fileIO/Outputs/RestartOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/RestartOutput.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/RestartOutput.hpp b/src/coreComponents/fileIO/Outputs/RestartOutput.hpp index 5a728e1b7d6..a2a12be781c 100644 --- a/src/coreComponents/fileIO/Outputs/RestartOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/RestartOutput.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp index 1ade6b9955c..756facc2da1 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.hpp b/src/coreComponents/fileIO/Outputs/SiloOutput.hpp index 1d736d14af4..bb3574f3745 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index cc913d66d56..1eec41fff7c 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp index 759719bc0d4..d7793943d9c 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp index 397e8c9e7d4..da364d0e4db 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp index afc490548fd..871a6497569 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp b/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp index 9abfa94d556..34761acb4a1 100644 --- a/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp +++ b/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp b/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp index 248744ece01..357ca59f8da 100644 --- a/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp +++ b/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/python/PyHistoryCollection.cpp b/src/coreComponents/fileIO/python/PyHistoryCollection.cpp index c4cbaf17c0b..6c844ad87dd 100644 --- a/src/coreComponents/fileIO/python/PyHistoryCollection.cpp +++ b/src/coreComponents/fileIO/python/PyHistoryCollection.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp b/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp index 92e98d01036..6d8f4c5abe7 100644 --- a/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp +++ b/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/python/PyHistoryOutput.cpp b/src/coreComponents/fileIO/python/PyHistoryOutput.cpp index 64d1fdbf5e7..689aaf7517a 100644 --- a/src/coreComponents/fileIO/python/PyHistoryOutput.cpp +++ b/src/coreComponents/fileIO/python/PyHistoryOutput.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp b/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp index 43f59c56692..9b1ba1fd947 100644 --- a/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp +++ b/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/python/PyVTKOutput.cpp b/src/coreComponents/fileIO/python/PyVTKOutput.cpp index 03ce7d33a56..cfdc269be0d 100644 --- a/src/coreComponents/fileIO/python/PyVTKOutput.cpp +++ b/src/coreComponents/fileIO/python/PyVTKOutput.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/python/PyVTKOutputType.hpp b/src/coreComponents/fileIO/python/PyVTKOutputType.hpp index 274ac593ebc..10ea1e1bcfb 100644 --- a/src/coreComponents/fileIO/python/PyVTKOutputType.hpp +++ b/src/coreComponents/fileIO/python/PyVTKOutputType.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/silo/SiloFile.cpp b/src/coreComponents/fileIO/silo/SiloFile.cpp index 68f3d7289eb..861839fe578 100644 --- a/src/coreComponents/fileIO/silo/SiloFile.cpp +++ b/src/coreComponents/fileIO/silo/SiloFile.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/silo/SiloFile.hpp b/src/coreComponents/fileIO/silo/SiloFile.hpp index 21b7c40d916..5f7e0dd9460 100644 --- a/src/coreComponents/fileIO/silo/SiloFile.hpp +++ b/src/coreComponents/fileIO/silo/SiloFile.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp b/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp index d9bcadb79e1..3207f296ae5 100644 --- a/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp +++ b/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/timeHistory/HDFFile.cpp b/src/coreComponents/fileIO/timeHistory/HDFFile.cpp index dcca4065a8d..1ed8e6be170 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFFile.cpp +++ b/src/coreComponents/fileIO/timeHistory/HDFFile.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/timeHistory/HDFFile.hpp b/src/coreComponents/fileIO/timeHistory/HDFFile.hpp index d0f16620040..7e428c4ce7d 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFFile.hpp +++ b/src/coreComponents/fileIO/timeHistory/HDFFile.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp index 0cdcee895ad..813ea0ad335 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp +++ b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp index 8d76f38e243..043d0658300 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp +++ b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp b/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp index 1de883c9176..2965e631b14 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp index 9dd9abb200b..b08471a6940 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp index 88b910cd6d3..cc367e8fa5f 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp index 383a3d223a0..ee2822d3f66 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.hpp b/src/coreComponents/fileIO/timeHistory/PackCollection.hpp index 748dd6876e6..a39b2d2fac9 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.hpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp b/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp index 7d0414f2b37..1efb816a350 100644 --- a/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp b/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp index 8cf6cf4affe..e0a43121be8 100644 --- a/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp +++ b/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp index 81b2ee70fd4..be65508921b 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp index 7ddc67d730c..526c8e3fb77 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp b/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp index 6ccbfd3f3e2..8e9b86eff92 100644 --- a/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp +++ b/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp b/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp index 46d0a7862c7..23199ab7b9c 100644 --- a/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp +++ b/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/BilinearFormUtilities.hpp b/src/coreComponents/finiteElement/BilinearFormUtilities.hpp index b613ee9b88a..28128c26be4 100644 --- a/src/coreComponents/finiteElement/BilinearFormUtilities.hpp +++ b/src/coreComponents/finiteElement/BilinearFormUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp index d7f8a4cfccd..87611b8ce0c 100644 --- a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp +++ b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h index de21c56be10..5e31aea441c 100644 --- a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h +++ b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp index 3f40d4fc8c2..92e13064399 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp b/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp index d70d0a34be4..55f3e7f7447 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp index ca84c5b01bb..fe7a1d668c8 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp index 32fb2500ed7..0f4b49edf4c 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/FiniteElementDispatch.hpp b/src/coreComponents/finiteElement/FiniteElementDispatch.hpp index 205595ff042..7190acbfd47 100644 --- a/src/coreComponents/finiteElement/FiniteElementDispatch.hpp +++ b/src/coreComponents/finiteElement/FiniteElementDispatch.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/Kinematics.h b/src/coreComponents/finiteElement/Kinematics.h index 3dd5d47f48c..c4350cb9cd3 100644 --- a/src/coreComponents/finiteElement/Kinematics.h +++ b/src/coreComponents/finiteElement/Kinematics.h @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/LinearFormUtilities.hpp b/src/coreComponents/finiteElement/LinearFormUtilities.hpp index 374155c6a7c..90153e86578 100644 --- a/src/coreComponents/finiteElement/LinearFormUtilities.hpp +++ b/src/coreComponents/finiteElement/LinearFormUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/PDEUtilities.hpp b/src/coreComponents/finiteElement/PDEUtilities.hpp index a834df8048b..015a68f92f1 100644 --- a/src/coreComponents/finiteElement/PDEUtilities.hpp +++ b/src/coreComponents/finiteElement/PDEUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp index fdba77ade2a..8577e059ade 100644 --- a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp index 49d54710d43..976858220d0 100644 --- a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp b/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp index 352dfe93ee2..7dffa992c05 100644 --- a/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp index 4cad29f1025..45f6bea55bb 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp index 890d7223a9b..eec58087f6f 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp index 9e96f90d535..9151e61bde3 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp index 790798adc18..92d7019857c 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp index b2e8aaf6da1..6a48e79e7bd 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp index dd767ed0f68..fe349c4c393 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp index 75dfcac2b0a..81d1762bcdb 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp index 390b3cf0dc0..24e04d4f774 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp index f1d2f2dc086..b3022db5c37 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp index 02f694ed362..2562fdb1693 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp index 623a7c2a638..fa3fd99be08 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp b/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp index f7f384241be..6ec0c1eaa57 100644 --- a/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp index 41ddc090fdf..05aff84961b 100644 --- a/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp index 0c806f5b50f..2d7799380ca 100644 --- a/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp index 4ec0ea972dd..5670dcffa1f 100644 --- a/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp index 60eb3a0fcec..cf16647a23b 100644 --- a/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp b/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp index 833503b4789..463c1a10ea4 100644 --- a/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp +++ b/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp b/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp index 0b5698f6a2a..c996e7d2d53 100644 --- a/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp +++ b/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp index 600f7a07b4e..fcee7b20126 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp index 6070b87d454..dd0312ffb6d 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp b/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp index 6b8879eca9c..59a7381d164 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp index 4bb8378d7d4..17def32ab98 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp b/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp index 4cbf0d27496..b30208893be 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp index 2ba1414859f..cacbd995848 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp b/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp index b28dced29d9..74ce89005b2 100644 --- a/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp +++ b/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp b/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp index 38e173e0795..11da6407f41 100644 --- a/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp +++ b/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/BoundaryStencil.cpp b/src/coreComponents/finiteVolume/BoundaryStencil.cpp index dfa11702af5..5d08b265115 100644 --- a/src/coreComponents/finiteVolume/BoundaryStencil.cpp +++ b/src/coreComponents/finiteVolume/BoundaryStencil.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/BoundaryStencil.hpp b/src/coreComponents/finiteVolume/BoundaryStencil.hpp index 5cfa6957124..f6f1a40b969 100644 --- a/src/coreComponents/finiteVolume/BoundaryStencil.hpp +++ b/src/coreComponents/finiteVolume/BoundaryStencil.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp b/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp index d04dcb8464c..7bc34a70fb6 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp +++ b/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp b/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp index c730b22795b..7a68580460a 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp +++ b/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp b/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp index b9bf2b3e1a8..5464447494a 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp +++ b/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp b/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp index 0994b727abf..dcbe5850cea 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp +++ b/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp index 514f34b6db2..199767e948c 100644 --- a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp +++ b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp index 0e752f83c55..511d4601a17 100644 --- a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp +++ b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp b/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp index 3a388ee3262..a032dcb9c6b 100644 --- a/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp +++ b/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp b/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp index 72edefcab25..2654d3d9f90 100644 --- a/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp +++ b/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp b/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp index 0879befa229..7c1bb141182 100644 --- a/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp +++ b/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp b/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp index 89a8bf0b8f2..8e1fc606b1d 100644 --- a/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp +++ b/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/FluxApproximationBase.cpp b/src/coreComponents/finiteVolume/FluxApproximationBase.cpp index e1ce126d105..9cca35ac2ef 100644 --- a/src/coreComponents/finiteVolume/FluxApproximationBase.cpp +++ b/src/coreComponents/finiteVolume/FluxApproximationBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp index 0a71f3a3c26..873fa531b3b 100644 --- a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp +++ b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp index 7d1f8acfe68..267a5d7905f 100644 --- a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp +++ b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp index 54db1dbcee3..3d39e41b3d2 100644 --- a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp +++ b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp b/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp index 153f695a93d..37a1b28c5f9 100644 --- a/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp +++ b/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp index 44934c17693..080375a17cc 100644 --- a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp +++ b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp index 3d929069ac5..d2f83e54d45 100644 --- a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp +++ b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/StencilBase.hpp b/src/coreComponents/finiteVolume/StencilBase.hpp index f0feae5e544..abd2ce0a1d2 100644 --- a/src/coreComponents/finiteVolume/StencilBase.hpp +++ b/src/coreComponents/finiteVolume/StencilBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp b/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp index 91e128584b0..21ac95e9129 100644 --- a/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp +++ b/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp b/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp index 816aed1dde5..5639a109b71 100644 --- a/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp +++ b/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp index d2a03d3c0f7..7ce80ad8d6d 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp index af85a416699..498e6b77213 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp index d06bbd1bda9..98587eedb75 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp index 09d2c67e3ad..f96ac38c88b 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp index 7dff4358bd5..83d62e2ace9 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp index 323c5b2afdd..7d0606e990c 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp index 858e6c17153..61c5f07a078 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp index 3a3cd5db06b..19282b23568 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp index 5846178b101..6264135df16 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/CompositeFunction.cpp b/src/coreComponents/functions/CompositeFunction.cpp index e45fc8b747f..2bd9885ba88 100644 --- a/src/coreComponents/functions/CompositeFunction.cpp +++ b/src/coreComponents/functions/CompositeFunction.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/CompositeFunction.hpp b/src/coreComponents/functions/CompositeFunction.hpp index cfcbc5bf174..1ba6c8d9407 100644 --- a/src/coreComponents/functions/CompositeFunction.hpp +++ b/src/coreComponents/functions/CompositeFunction.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/FunctionBase.cpp b/src/coreComponents/functions/FunctionBase.cpp index 3899ef1b3e6..9b4ae666e51 100644 --- a/src/coreComponents/functions/FunctionBase.cpp +++ b/src/coreComponents/functions/FunctionBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/FunctionBase.hpp b/src/coreComponents/functions/FunctionBase.hpp index 3b160059743..44f9c30bf47 100644 --- a/src/coreComponents/functions/FunctionBase.hpp +++ b/src/coreComponents/functions/FunctionBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/FunctionManager.cpp b/src/coreComponents/functions/FunctionManager.cpp index f0e938782ed..5cf652a8593 100644 --- a/src/coreComponents/functions/FunctionManager.cpp +++ b/src/coreComponents/functions/FunctionManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/FunctionManager.hpp b/src/coreComponents/functions/FunctionManager.hpp index 3880bbef159..9c5359fb622 100644 --- a/src/coreComponents/functions/FunctionManager.hpp +++ b/src/coreComponents/functions/FunctionManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/MultivariableTableFunction.cpp b/src/coreComponents/functions/MultivariableTableFunction.cpp index ee6f5b7ef06..9200e188076 100644 --- a/src/coreComponents/functions/MultivariableTableFunction.cpp +++ b/src/coreComponents/functions/MultivariableTableFunction.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/MultivariableTableFunction.hpp b/src/coreComponents/functions/MultivariableTableFunction.hpp index 37660da0751..fd6e99c891d 100644 --- a/src/coreComponents/functions/MultivariableTableFunction.hpp +++ b/src/coreComponents/functions/MultivariableTableFunction.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp b/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp index 9be5df924f5..0647536f524 100644 --- a/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp +++ b/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/SymbolicFunction.cpp b/src/coreComponents/functions/SymbolicFunction.cpp index 3088c781093..52187b1af13 100644 --- a/src/coreComponents/functions/SymbolicFunction.cpp +++ b/src/coreComponents/functions/SymbolicFunction.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/SymbolicFunction.hpp b/src/coreComponents/functions/SymbolicFunction.hpp index d58a9f157c5..f05e5d22336 100644 --- a/src/coreComponents/functions/SymbolicFunction.hpp +++ b/src/coreComponents/functions/SymbolicFunction.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index dcd9099f7a6..d9f804241fb 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/TableFunction.hpp b/src/coreComponents/functions/TableFunction.hpp index 94c4b25f777..216b29ad91b 100644 --- a/src/coreComponents/functions/TableFunction.hpp +++ b/src/coreComponents/functions/TableFunction.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/functions/unitTests/testFunctions.cpp b/src/coreComponents/functions/unitTests/testFunctions.cpp index 034ed353e34..33050f651ef 100644 --- a/src/coreComponents/functions/unitTests/testFunctions.cpp +++ b/src/coreComponents/functions/unitTests/testFunctions.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/DofManager.cpp b/src/coreComponents/linearAlgebra/DofManager.cpp index 9e0cbe78f8d..173c9cc3e09 100644 --- a/src/coreComponents/linearAlgebra/DofManager.cpp +++ b/src/coreComponents/linearAlgebra/DofManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/DofManager.hpp b/src/coreComponents/linearAlgebra/DofManager.hpp index f140313cd37..82fea749d25 100644 --- a/src/coreComponents/linearAlgebra/DofManager.hpp +++ b/src/coreComponents/linearAlgebra/DofManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp b/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp index 45ee6abc2e5..a1b700679d5 100644 --- a/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp +++ b/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/common/LinearOperator.hpp b/src/coreComponents/linearAlgebra/common/LinearOperator.hpp index fbe52f11f58..59b2a31b677 100644 --- a/src/coreComponents/linearAlgebra/common/LinearOperator.hpp +++ b/src/coreComponents/linearAlgebra/common/LinearOperator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp b/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp index 058ac6b280a..e1d881b75fc 100644 --- a/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp +++ b/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp b/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp index 171487e2419..f07d7c02850 100644 --- a/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp +++ b/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/common/common.hpp b/src/coreComponents/linearAlgebra/common/common.hpp index 214441231c3..8619e89785e 100644 --- a/src/coreComponents/linearAlgebra/common/common.hpp +++ b/src/coreComponents/linearAlgebra/common/common.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/common/traits.hpp b/src/coreComponents/linearAlgebra/common/traits.hpp index 8c271e25404..87e2af5f3c4 100644 --- a/src/coreComponents/linearAlgebra/common/traits.hpp +++ b/src/coreComponents/linearAlgebra/common/traits.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp b/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp index 5721eac261c..ab2821460dc 100644 --- a/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp b/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp index 353d91e9270..f82018d393e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp b/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp index 508d8ddbee2..5e9a30cd929 100644 --- a/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp index 8f76476af91..75c060fd30f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp index b592ec833db..38339ef0ab5 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp index 0a8995f8728..de01e815ba3 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp index fb3aefa6f8a..c0aa351aab9 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp index 8f2707fe448..db21e94af02 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp index 78658416ac0..e1f4e711274 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp index 5f8fd14be98..f13477eecc5 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp index 91eae0ca9e0..7ad3b790246 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp index eab9d2e46df..36a577c530a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp index 3069b3f50d2..93eba297723 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp index da1112148d6..a14f0ac6b5b 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp index d4f04bfd315..eef5b70b45b 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp index 5791fe129cd..0f94f9c1b51 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp index 9617dfe5576..b44c3caca9a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp index 45193c13e47..cd4bc6321e9 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp index e2028e5edd6..1f13028f4e1 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp index 8ea007028a0..e882d55faba 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp index e34d64b63da..40364992a06 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp index c96ec6a80d7..5916fedbb4e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp index ef95bc80191..a205fe074c7 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp index 56ea2db6ecc..7e9b7ecf5b3 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp index fcaf13c188e..086589275b4 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp index c0b9c834bbc..fc54f4bd24d 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp index 0261cdb6331..897d3e1b9d4 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp index d4fa88273fa..709b9422f92 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp index ddad8ab0c3b..0498e304a56 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp index 97fced479f3..f79ad85fb27 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp index ad39e9ae024..faf44e8adaf 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp index c2c07c82929..2ad38a87132 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp index 7000b0b1856..dcbe732e90e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp index 789028ad930..69038faa599 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp index b43cb73f60c..2285670a5b9 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp index 1388e01fb42..a0f4a101049 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp index d2edc99aef0..6a4994b90a7 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp index c2b74b44aac..e3b2dbb37d1 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp index 9b392860d5c..26383837143 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp index 822cfba7717..26b054f9a2d 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp index 5c835572754..a2f1bb749b7 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp index b98937f8888..b86937c3ba4 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp index 3db816c7143..7da6fb6229f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp index 6a177da7950..f88dffdf738 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp index 557b3c3d454..129e2b4abd0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp index 2ae18ae01bf..af5889fc7cd 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp index 8a89da7efe3..d6e9091dc27 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp index df6b1e08aef..34dd1a6919a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp index f851ffdc48c..81334efeda6 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp index a69dbd6d1bb..0a9fa8021f8 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp index 7844bd4e849..a3a49238d04 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp index c1f78539ba0..ea8ab63286a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp index 21aa5df6e77..0083c360aa0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp index d6d11f939a8..d291dfffd1f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp index 524cbace836..026e047d811 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp index 361176e5d10..9f036afd0df 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp index 6af980baf9d..b97e623d911 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp index e509f633d73..9e923c7245a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp index 31cb22ad096..77e06e73242 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp index 0406edde736..bb48bc8433d 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp index 89b8c5664e5..5d2b440b953 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp index 874a84a4475..d6da38b3639 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp index 288de24899a..8866ab1f312 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp index 7c02134b8a0..1d6900dab4a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp index 27e891d88c9..78df1acee35 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp index 6ba5ccb8a63..6605102fa53 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp index fb028e9084c..2a3b7bd2b8b 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp index a4cc280066e..4a63c4ce138 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp index c3fa4f8c267..a49a8b03f88 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp index 1064406fd4f..9db8a0c50dc 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp index 9072827ce05..df8fed1921a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp index 922292371f6..8e73c1c37e0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp index 159c0ee98fe..089ebfceb50 100644 --- a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp index 96e5bf7fdc8..82602e2942d 100644 --- a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp index 5b60faab13a..4e708f936a9 100644 --- a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp index ef3e8ebe98c..390d7549d32 100644 --- a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp b/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp index c9e19604c02..dfb58db5a9d 100644 --- a/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp b/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp index 6db6fa7c12d..28d36c7dce1 100644 --- a/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp b/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp index dea30200688..5c1e7eb1bc9 100644 --- a/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp b/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp index de7f2139eab..4b11df1b441 100644 --- a/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp index e8f775d9c11..25dfbbae30b 100644 --- a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp index f70961bd228..8f0381c391e 100644 --- a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp b/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp index 30f1b68eb74..5a65b48670a 100644 --- a/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp +++ b/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp b/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp index d90c8e78dde..6685ba45be2 100644 --- a/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp +++ b/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp b/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp index 843c6e45588..006b9bfa413 100644 --- a/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp +++ b/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp b/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp index 0a9e8acc36d..fcd4f0490f1 100644 --- a/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp +++ b/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp index 1ea01663098..735c44ec3ce 100644 --- a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp index e1360573162..4c65ef51894 100644 --- a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp b/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp index 3b24dfc4dad..c5fe76ede5b 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp b/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp index 6ea6b405c09..7c8cebb3627 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp index 2ec7b8f0e8d..f3d59a84963 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp b/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp index 0c3a1877743..b230f7a8394 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp +++ b/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp b/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp index c75ca45ba9f..5194fab06bd 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp b/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp index 16df69c7dae..e5219b37bd9 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp b/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp index 3c3aad02f90..9e5890f9899 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp b/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp index 4ee83088342..a90bb2ecb97 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp b/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp index bc95c622f41..cd9b427ba65 100644 --- a/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp +++ b/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp b/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp index 491795b484f..8b49577ce63 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp b/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp index ec48edc7270..26daf4818c4 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp b/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp index 9da3c73836f..b0ac936e2bf 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp b/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp index 1cf7f609a6e..ea78c17e96d 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp b/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp index fba0c778e07..bfedf07dc24 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp b/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp index 51f6d8ccdbf..d1dcbddb107 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp b/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp index c7aa5f5ad4a..7d7a0b019ad 100644 --- a/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp +++ b/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp b/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp index 558070d8667..f5f70510185 100644 --- a/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp b/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp index 9c1d67aa20b..477e5485c7f 100644 --- a/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp index 722b6b4d3e1..51c2239c0a6 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp index 8c2c55ee9b3..90d6365f229 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp b/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp index 7b8323d1de9..466808c0170 100644 --- a/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp index fc7aaa43337..4631d42f70e 100644 --- a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp +++ b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp index 21663573370..bed455a783f 100644 --- a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp +++ b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp b/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp index 1d284df3daa..cd623bddf78 100644 --- a/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mainInterface/GeosxState.cpp b/src/coreComponents/mainInterface/GeosxState.cpp index ba5c54a1a16..8aceec88991 100644 --- a/src/coreComponents/mainInterface/GeosxState.cpp +++ b/src/coreComponents/mainInterface/GeosxState.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mainInterface/GeosxState.hpp b/src/coreComponents/mainInterface/GeosxState.hpp index 8d6866827d7..888bef6d7dd 100644 --- a/src/coreComponents/mainInterface/GeosxState.hpp +++ b/src/coreComponents/mainInterface/GeosxState.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mainInterface/GeosxVersion.hpp.in b/src/coreComponents/mainInterface/GeosxVersion.hpp.in index 822244b3984..4d523fbf5b8 100644 --- a/src/coreComponents/mainInterface/GeosxVersion.hpp.in +++ b/src/coreComponents/mainInterface/GeosxVersion.hpp.in @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 072fd55c822..f5b074425c3 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mainInterface/ProblemManager.hpp b/src/coreComponents/mainInterface/ProblemManager.hpp index 9a3d0314142..7787b31bffd 100644 --- a/src/coreComponents/mainInterface/ProblemManager.hpp +++ b/src/coreComponents/mainInterface/ProblemManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mainInterface/initialization.cpp b/src/coreComponents/mainInterface/initialization.cpp index 0650f9b796c..71388045b03 100644 --- a/src/coreComponents/mainInterface/initialization.cpp +++ b/src/coreComponents/mainInterface/initialization.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mainInterface/initialization.hpp b/src/coreComponents/mainInterface/initialization.hpp index 841d5c2e3ae..8f8eb32ad24 100644 --- a/src/coreComponents/mainInterface/initialization.hpp +++ b/src/coreComponents/mainInterface/initialization.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mainInterface/version.cpp b/src/coreComponents/mainInterface/version.cpp index eb74e831080..e478d0cf1fd 100644 --- a/src/coreComponents/mainInterface/version.cpp +++ b/src/coreComponents/mainInterface/version.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mainInterface/version.hpp b/src/coreComponents/mainInterface/version.hpp index 5aaec16e3b2..4187c7d032b 100644 --- a/src/coreComponents/mainInterface/version.hpp +++ b/src/coreComponents/mainInterface/version.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/math/extrapolation/Extrapolation.hpp b/src/coreComponents/math/extrapolation/Extrapolation.hpp index 87cf06f829a..fe79a94913e 100644 --- a/src/coreComponents/math/extrapolation/Extrapolation.hpp +++ b/src/coreComponents/math/extrapolation/Extrapolation.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/math/interpolation/Interpolation.hpp b/src/coreComponents/math/interpolation/Interpolation.hpp index edaf2360399..5a20e9ec7a9 100644 --- a/src/coreComponents/math/interpolation/Interpolation.hpp +++ b/src/coreComponents/math/interpolation/Interpolation.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/BufferOps.cpp b/src/coreComponents/mesh/BufferOps.cpp index 575b6ea7bde..7225ad52847 100644 --- a/src/coreComponents/mesh/BufferOps.cpp +++ b/src/coreComponents/mesh/BufferOps.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/BufferOps.hpp b/src/coreComponents/mesh/BufferOps.hpp index 69bfa27463e..1d18096a120 100644 --- a/src/coreComponents/mesh/BufferOps.hpp +++ b/src/coreComponents/mesh/BufferOps.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/CellElementRegion.cpp b/src/coreComponents/mesh/CellElementRegion.cpp index 5f0b1c873de..e72550b1fc1 100644 --- a/src/coreComponents/mesh/CellElementRegion.cpp +++ b/src/coreComponents/mesh/CellElementRegion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/CellElementRegion.hpp b/src/coreComponents/mesh/CellElementRegion.hpp index 874f33bc490..8316e9e3b67 100644 --- a/src/coreComponents/mesh/CellElementRegion.hpp +++ b/src/coreComponents/mesh/CellElementRegion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/CellElementSubRegion.cpp b/src/coreComponents/mesh/CellElementSubRegion.cpp index 995d2a0c2c2..0b13ba2dea2 100644 --- a/src/coreComponents/mesh/CellElementSubRegion.cpp +++ b/src/coreComponents/mesh/CellElementSubRegion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/CellElementSubRegion.hpp b/src/coreComponents/mesh/CellElementSubRegion.hpp index 349a1b34e23..b230a64bdb1 100644 --- a/src/coreComponents/mesh/CellElementSubRegion.hpp +++ b/src/coreComponents/mesh/CellElementSubRegion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/DomainPartition.cpp b/src/coreComponents/mesh/DomainPartition.cpp index 381e5d2f1bd..0dd8a8a3623 100644 --- a/src/coreComponents/mesh/DomainPartition.cpp +++ b/src/coreComponents/mesh/DomainPartition.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/DomainPartition.hpp b/src/coreComponents/mesh/DomainPartition.hpp index 61a70ee0cba..c15eb224100 100644 --- a/src/coreComponents/mesh/DomainPartition.hpp +++ b/src/coreComponents/mesh/DomainPartition.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/EdgeManager.cpp b/src/coreComponents/mesh/EdgeManager.cpp index 9f3ed4fc3ca..6ef8d9daf97 100644 --- a/src/coreComponents/mesh/EdgeManager.cpp +++ b/src/coreComponents/mesh/EdgeManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/EdgeManager.hpp b/src/coreComponents/mesh/EdgeManager.hpp index 26fc31f4108..eedcc23a4d4 100644 --- a/src/coreComponents/mesh/EdgeManager.hpp +++ b/src/coreComponents/mesh/EdgeManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ElementRegionBase.cpp b/src/coreComponents/mesh/ElementRegionBase.cpp index f28f8a3e6d3..844827c28bf 100644 --- a/src/coreComponents/mesh/ElementRegionBase.cpp +++ b/src/coreComponents/mesh/ElementRegionBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ElementRegionBase.hpp b/src/coreComponents/mesh/ElementRegionBase.hpp index b0dbe221b20..f2050f351bd 100644 --- a/src/coreComponents/mesh/ElementRegionBase.hpp +++ b/src/coreComponents/mesh/ElementRegionBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index 2259ae3bb6c..a03a70a4075 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ElementRegionManager.hpp b/src/coreComponents/mesh/ElementRegionManager.hpp index 19ffdee08ad..573749ada07 100644 --- a/src/coreComponents/mesh/ElementRegionManager.hpp +++ b/src/coreComponents/mesh/ElementRegionManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ElementSubRegionBase.cpp b/src/coreComponents/mesh/ElementSubRegionBase.cpp index adf2a7b629d..f3dc3a23745 100644 --- a/src/coreComponents/mesh/ElementSubRegionBase.cpp +++ b/src/coreComponents/mesh/ElementSubRegionBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ElementSubRegionBase.hpp b/src/coreComponents/mesh/ElementSubRegionBase.hpp index f4bd68e14f4..74bd710a310 100644 --- a/src/coreComponents/mesh/ElementSubRegionBase.hpp +++ b/src/coreComponents/mesh/ElementSubRegionBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ElementType.hpp b/src/coreComponents/mesh/ElementType.hpp index 5db51d7e319..24665ebe987 100644 --- a/src/coreComponents/mesh/ElementType.hpp +++ b/src/coreComponents/mesh/ElementType.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp index 67c8085469a..dd18ab4439b 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp index ffdbd89f211..fdb11f62c98 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp index 055af644a79..83f603d9992 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp index f9cf8d175f9..311b8aec610 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/FaceElementSubRegion.cpp b/src/coreComponents/mesh/FaceElementSubRegion.cpp index 90d2d7d4e49..31c0dcce7c0 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/FaceElementSubRegion.hpp b/src/coreComponents/mesh/FaceElementSubRegion.hpp index 709098260e5..88edf84dec2 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index 7942f825f29..9a3923ed358 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/FaceManager.hpp b/src/coreComponents/mesh/FaceManager.hpp index f20e0a068cf..7d7693ab4d6 100644 --- a/src/coreComponents/mesh/FaceManager.hpp +++ b/src/coreComponents/mesh/FaceManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/FieldIdentifiers.hpp b/src/coreComponents/mesh/FieldIdentifiers.hpp index 9d78e471933..677106340e6 100644 --- a/src/coreComponents/mesh/FieldIdentifiers.hpp +++ b/src/coreComponents/mesh/FieldIdentifiers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/InterObjectRelation.hpp b/src/coreComponents/mesh/InterObjectRelation.hpp index 960b2b115ee..33e39155e52 100644 --- a/src/coreComponents/mesh/InterObjectRelation.hpp +++ b/src/coreComponents/mesh/InterObjectRelation.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/MeshBody.cpp b/src/coreComponents/mesh/MeshBody.cpp index a85c53b9559..80696370fb3 100644 --- a/src/coreComponents/mesh/MeshBody.cpp +++ b/src/coreComponents/mesh/MeshBody.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/MeshBody.hpp b/src/coreComponents/mesh/MeshBody.hpp index cb8d14242d6..ca614f8f18f 100644 --- a/src/coreComponents/mesh/MeshBody.hpp +++ b/src/coreComponents/mesh/MeshBody.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/MeshFields.hpp b/src/coreComponents/mesh/MeshFields.hpp index e7a2173f89b..e2afe94e100 100644 --- a/src/coreComponents/mesh/MeshFields.hpp +++ b/src/coreComponents/mesh/MeshFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/MeshForLoopInterface.hpp b/src/coreComponents/mesh/MeshForLoopInterface.hpp index 8908f5fb65f..d069fbc5fc1 100644 --- a/src/coreComponents/mesh/MeshForLoopInterface.hpp +++ b/src/coreComponents/mesh/MeshForLoopInterface.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/MeshLevel.cpp b/src/coreComponents/mesh/MeshLevel.cpp index 2d64b919390..5ed92c326d7 100644 --- a/src/coreComponents/mesh/MeshLevel.cpp +++ b/src/coreComponents/mesh/MeshLevel.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/MeshLevel.hpp b/src/coreComponents/mesh/MeshLevel.hpp index 88d6d9c505b..dee7e31bd1e 100644 --- a/src/coreComponents/mesh/MeshLevel.hpp +++ b/src/coreComponents/mesh/MeshLevel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/MeshManager.cpp b/src/coreComponents/mesh/MeshManager.cpp index 32c34f2216e..3fa5ab4825a 100644 --- a/src/coreComponents/mesh/MeshManager.cpp +++ b/src/coreComponents/mesh/MeshManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/MeshManager.hpp b/src/coreComponents/mesh/MeshManager.hpp index 889434fd70f..793eaee775d 100644 --- a/src/coreComponents/mesh/MeshManager.hpp +++ b/src/coreComponents/mesh/MeshManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/MeshObjectPath.cpp b/src/coreComponents/mesh/MeshObjectPath.cpp index 2937097715c..4607ad0416e 100644 --- a/src/coreComponents/mesh/MeshObjectPath.cpp +++ b/src/coreComponents/mesh/MeshObjectPath.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/MeshObjectPath.hpp b/src/coreComponents/mesh/MeshObjectPath.hpp index 0586e47821f..b6cb34adb75 100644 --- a/src/coreComponents/mesh/MeshObjectPath.hpp +++ b/src/coreComponents/mesh/MeshObjectPath.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/NodeManager.cpp b/src/coreComponents/mesh/NodeManager.cpp index a5d9ac2859e..d59752f09da 100644 --- a/src/coreComponents/mesh/NodeManager.cpp +++ b/src/coreComponents/mesh/NodeManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/NodeManager.hpp b/src/coreComponents/mesh/NodeManager.hpp index 3393d99a583..0c9a39a13e1 100644 --- a/src/coreComponents/mesh/NodeManager.hpp +++ b/src/coreComponents/mesh/NodeManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ObjectManagerBase.cpp b/src/coreComponents/mesh/ObjectManagerBase.cpp index bfb00223f7d..f2933ccd0b9 100644 --- a/src/coreComponents/mesh/ObjectManagerBase.cpp +++ b/src/coreComponents/mesh/ObjectManagerBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ObjectManagerBase.hpp b/src/coreComponents/mesh/ObjectManagerBase.hpp index e6002425699..a6550a53eed 100644 --- a/src/coreComponents/mesh/ObjectManagerBase.hpp +++ b/src/coreComponents/mesh/ObjectManagerBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ParticleManager.cpp b/src/coreComponents/mesh/ParticleManager.cpp index 7a168d02168..af1096d02c2 100644 --- a/src/coreComponents/mesh/ParticleManager.cpp +++ b/src/coreComponents/mesh/ParticleManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ParticleManager.hpp b/src/coreComponents/mesh/ParticleManager.hpp index 7cc967c1e83..f123471b9c3 100644 --- a/src/coreComponents/mesh/ParticleManager.hpp +++ b/src/coreComponents/mesh/ParticleManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ParticleRegion.cpp b/src/coreComponents/mesh/ParticleRegion.cpp index c7c1fac268e..a18cb3e32dc 100644 --- a/src/coreComponents/mesh/ParticleRegion.cpp +++ b/src/coreComponents/mesh/ParticleRegion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ParticleRegion.hpp b/src/coreComponents/mesh/ParticleRegion.hpp index 22001a9afd9..7295fb8c029 100644 --- a/src/coreComponents/mesh/ParticleRegion.hpp +++ b/src/coreComponents/mesh/ParticleRegion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ParticleRegionBase.cpp b/src/coreComponents/mesh/ParticleRegionBase.cpp index 90e3e8899bb..1503dcf6947 100644 --- a/src/coreComponents/mesh/ParticleRegionBase.cpp +++ b/src/coreComponents/mesh/ParticleRegionBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ParticleRegionBase.hpp b/src/coreComponents/mesh/ParticleRegionBase.hpp index 5cea7fc28bc..7989c1392f1 100644 --- a/src/coreComponents/mesh/ParticleRegionBase.hpp +++ b/src/coreComponents/mesh/ParticleRegionBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ParticleSubRegion.cpp b/src/coreComponents/mesh/ParticleSubRegion.cpp index ac4c54ba13e..4f1380347af 100644 --- a/src/coreComponents/mesh/ParticleSubRegion.cpp +++ b/src/coreComponents/mesh/ParticleSubRegion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ParticleSubRegion.hpp b/src/coreComponents/mesh/ParticleSubRegion.hpp index 816d35fc1bb..6fef225e1e4 100644 --- a/src/coreComponents/mesh/ParticleSubRegion.hpp +++ b/src/coreComponents/mesh/ParticleSubRegion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ParticleSubRegionBase.cpp b/src/coreComponents/mesh/ParticleSubRegionBase.cpp index 1e0a5d0b5aa..78b7fb20560 100644 --- a/src/coreComponents/mesh/ParticleSubRegionBase.cpp +++ b/src/coreComponents/mesh/ParticleSubRegionBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ParticleSubRegionBase.hpp b/src/coreComponents/mesh/ParticleSubRegionBase.hpp index 81f35d638fd..deb99881a86 100644 --- a/src/coreComponents/mesh/ParticleSubRegionBase.hpp +++ b/src/coreComponents/mesh/ParticleSubRegionBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ParticleType.hpp b/src/coreComponents/mesh/ParticleType.hpp index da32741848e..000546a381d 100644 --- a/src/coreComponents/mesh/ParticleType.hpp +++ b/src/coreComponents/mesh/ParticleType.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/Perforation.cpp b/src/coreComponents/mesh/Perforation.cpp index 2d642976d0b..fdfa6170d0f 100644 --- a/src/coreComponents/mesh/Perforation.cpp +++ b/src/coreComponents/mesh/Perforation.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/Perforation.hpp b/src/coreComponents/mesh/Perforation.hpp index f9508bd7d3b..e225b2d53c1 100644 --- a/src/coreComponents/mesh/Perforation.hpp +++ b/src/coreComponents/mesh/Perforation.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/PerforationData.cpp b/src/coreComponents/mesh/PerforationData.cpp index 46dc019226d..e91970382c4 100644 --- a/src/coreComponents/mesh/PerforationData.cpp +++ b/src/coreComponents/mesh/PerforationData.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/PerforationData.hpp b/src/coreComponents/mesh/PerforationData.hpp index e380bfbc09d..1071d357d77 100644 --- a/src/coreComponents/mesh/PerforationData.hpp +++ b/src/coreComponents/mesh/PerforationData.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/PerforationFields.hpp b/src/coreComponents/mesh/PerforationFields.hpp index d0bf35bf469..8d376689a30 100644 --- a/src/coreComponents/mesh/PerforationFields.hpp +++ b/src/coreComponents/mesh/PerforationFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/SurfaceElementRegion.cpp b/src/coreComponents/mesh/SurfaceElementRegion.cpp index 797a27f012e..78233703bd1 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/SurfaceElementRegion.hpp b/src/coreComponents/mesh/SurfaceElementRegion.hpp index f011e6ebf45..182d4f730b0 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp index 296163a80f5..d763dfe41ba 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp index 2fc5b84f532..0860c98d574 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ToElementRelation.cpp b/src/coreComponents/mesh/ToElementRelation.cpp index ef7125eb430..6f3bfb37b7e 100644 --- a/src/coreComponents/mesh/ToElementRelation.cpp +++ b/src/coreComponents/mesh/ToElementRelation.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ToElementRelation.hpp b/src/coreComponents/mesh/ToElementRelation.hpp index aa13e898aa0..b596b273fa3 100644 --- a/src/coreComponents/mesh/ToElementRelation.hpp +++ b/src/coreComponents/mesh/ToElementRelation.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ToParticleRelation.cpp b/src/coreComponents/mesh/ToParticleRelation.cpp index e2d927911ca..8b39e66e06d 100644 --- a/src/coreComponents/mesh/ToParticleRelation.cpp +++ b/src/coreComponents/mesh/ToParticleRelation.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/ToParticleRelation.hpp b/src/coreComponents/mesh/ToParticleRelation.hpp index 015b41a3605..fc539e24f71 100644 --- a/src/coreComponents/mesh/ToParticleRelation.hpp +++ b/src/coreComponents/mesh/ToParticleRelation.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/WellElementRegion.cpp b/src/coreComponents/mesh/WellElementRegion.cpp index f0781163c2d..a9093f7679e 100644 --- a/src/coreComponents/mesh/WellElementRegion.cpp +++ b/src/coreComponents/mesh/WellElementRegion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/WellElementRegion.hpp b/src/coreComponents/mesh/WellElementRegion.hpp index 1ca22d96a78..b4abdd08027 100644 --- a/src/coreComponents/mesh/WellElementRegion.hpp +++ b/src/coreComponents/mesh/WellElementRegion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/WellElementSubRegion.cpp b/src/coreComponents/mesh/WellElementSubRegion.cpp index 4f0f5eb9695..107dcfe80fc 100644 --- a/src/coreComponents/mesh/WellElementSubRegion.cpp +++ b/src/coreComponents/mesh/WellElementSubRegion.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/WellElementSubRegion.hpp b/src/coreComponents/mesh/WellElementSubRegion.hpp index da1049fdffe..cf1828a6d24 100644 --- a/src/coreComponents/mesh/WellElementSubRegion.hpp +++ b/src/coreComponents/mesh/WellElementSubRegion.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/CellBlock.cpp b/src/coreComponents/mesh/generators/CellBlock.cpp index 53ec1898ff8..97ce7e08a74 100644 --- a/src/coreComponents/mesh/generators/CellBlock.cpp +++ b/src/coreComponents/mesh/generators/CellBlock.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/CellBlock.hpp b/src/coreComponents/mesh/generators/CellBlock.hpp index 6d48327aaf0..4d704b62a8e 100644 --- a/src/coreComponents/mesh/generators/CellBlock.hpp +++ b/src/coreComponents/mesh/generators/CellBlock.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/CellBlockABC.hpp b/src/coreComponents/mesh/generators/CellBlockABC.hpp index 4f39058122f..6ff5d08ca47 100644 --- a/src/coreComponents/mesh/generators/CellBlockABC.hpp +++ b/src/coreComponents/mesh/generators/CellBlockABC.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/CellBlockManager.cpp b/src/coreComponents/mesh/generators/CellBlockManager.cpp index f18d3546793..8b8b7653b03 100644 --- a/src/coreComponents/mesh/generators/CellBlockManager.cpp +++ b/src/coreComponents/mesh/generators/CellBlockManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/CellBlockManager.hpp b/src/coreComponents/mesh/generators/CellBlockManager.hpp index 028a15c1711..8664399b9a4 100644 --- a/src/coreComponents/mesh/generators/CellBlockManager.hpp +++ b/src/coreComponents/mesh/generators/CellBlockManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp b/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp index b6317eef2da..4dc7c5e048d 100644 --- a/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp +++ b/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/CellBlockUtilities.cpp b/src/coreComponents/mesh/generators/CellBlockUtilities.cpp index a58ef5a40b8..bbb246700de 100644 --- a/src/coreComponents/mesh/generators/CellBlockUtilities.cpp +++ b/src/coreComponents/mesh/generators/CellBlockUtilities.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/CellBlockUtilities.hpp b/src/coreComponents/mesh/generators/CellBlockUtilities.hpp index e8e3ea9a43d..dcfdc1d5dd2 100644 --- a/src/coreComponents/mesh/generators/CellBlockUtilities.hpp +++ b/src/coreComponents/mesh/generators/CellBlockUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/CollocatedNodes.cpp b/src/coreComponents/mesh/generators/CollocatedNodes.cpp index 797ba1f4477..149c49b93dd 100644 --- a/src/coreComponents/mesh/generators/CollocatedNodes.cpp +++ b/src/coreComponents/mesh/generators/CollocatedNodes.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/CollocatedNodes.hpp b/src/coreComponents/mesh/generators/CollocatedNodes.hpp index 4356057fee4..73f00f8d6b3 100644 --- a/src/coreComponents/mesh/generators/CollocatedNodes.hpp +++ b/src/coreComponents/mesh/generators/CollocatedNodes.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp index 2392a89874b..d05abf7a680 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp index 84ccc63eb69..fd1a006c192 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/FaceBlock.cpp b/src/coreComponents/mesh/generators/FaceBlock.cpp index ecd7cb3505c..478a33ae05f 100644 --- a/src/coreComponents/mesh/generators/FaceBlock.cpp +++ b/src/coreComponents/mesh/generators/FaceBlock.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/FaceBlock.hpp b/src/coreComponents/mesh/generators/FaceBlock.hpp index 060e8d4888f..be458a85067 100644 --- a/src/coreComponents/mesh/generators/FaceBlock.hpp +++ b/src/coreComponents/mesh/generators/FaceBlock.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/FaceBlockABC.hpp b/src/coreComponents/mesh/generators/FaceBlockABC.hpp index b5679f29aa2..98fdbcfe856 100644 --- a/src/coreComponents/mesh/generators/FaceBlockABC.hpp +++ b/src/coreComponents/mesh/generators/FaceBlockABC.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index 2069984feec..5d98c6449c3 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp index 50b23142d8f..e358b6c2aff 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp index 0fb5ef5e009..ae15917ebc1 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.hpp b/src/coreComponents/mesh/generators/InternalWellGenerator.hpp index 18db52fac66..ff937a3d000 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp index 641dfbf9835..78a2ab785df 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp index 22061da1536..e9d86c930e6 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/LineBlock.cpp b/src/coreComponents/mesh/generators/LineBlock.cpp index 38c678f0d7d..72fd83d301d 100644 --- a/src/coreComponents/mesh/generators/LineBlock.cpp +++ b/src/coreComponents/mesh/generators/LineBlock.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/LineBlock.hpp b/src/coreComponents/mesh/generators/LineBlock.hpp index 67d265cf02c..137af0bca80 100644 --- a/src/coreComponents/mesh/generators/LineBlock.hpp +++ b/src/coreComponents/mesh/generators/LineBlock.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/LineBlockABC.hpp b/src/coreComponents/mesh/generators/LineBlockABC.hpp index 35e4b5dd9a8..ca64400d1e1 100644 --- a/src/coreComponents/mesh/generators/LineBlockABC.hpp +++ b/src/coreComponents/mesh/generators/LineBlockABC.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp index 853ef2dc54e..b4de9e8fc33 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp index 2c802fb332d..0a0ba34ba81 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/PTScotchInterface.cpp b/src/coreComponents/mesh/generators/PTScotchInterface.cpp index 4ca55bca819..270615f1869 100644 --- a/src/coreComponents/mesh/generators/PTScotchInterface.cpp +++ b/src/coreComponents/mesh/generators/PTScotchInterface.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/PTScotchInterface.hpp b/src/coreComponents/mesh/generators/PTScotchInterface.hpp index a9d96589975..bdd7cf6ff1e 100644 --- a/src/coreComponents/mesh/generators/PTScotchInterface.hpp +++ b/src/coreComponents/mesh/generators/PTScotchInterface.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ParMETISInterface.cpp b/src/coreComponents/mesh/generators/ParMETISInterface.cpp index fb1baca35a4..9f9d574b945 100644 --- a/src/coreComponents/mesh/generators/ParMETISInterface.cpp +++ b/src/coreComponents/mesh/generators/ParMETISInterface.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ParMETISInterface.hpp b/src/coreComponents/mesh/generators/ParMETISInterface.hpp index fa23df5834b..f9dc2af71ac 100644 --- a/src/coreComponents/mesh/generators/ParMETISInterface.hpp +++ b/src/coreComponents/mesh/generators/ParMETISInterface.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ParticleBlock.cpp b/src/coreComponents/mesh/generators/ParticleBlock.cpp index f16c6b984ac..1981cb89a0e 100644 --- a/src/coreComponents/mesh/generators/ParticleBlock.cpp +++ b/src/coreComponents/mesh/generators/ParticleBlock.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ParticleBlock.hpp b/src/coreComponents/mesh/generators/ParticleBlock.hpp index bbe69fce018..01b22edf7a1 100644 --- a/src/coreComponents/mesh/generators/ParticleBlock.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlock.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ParticleBlockABC.hpp b/src/coreComponents/mesh/generators/ParticleBlockABC.hpp index d2e68d4ae4c..966c188d6c3 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockABC.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockABC.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ParticleBlockManager.cpp b/src/coreComponents/mesh/generators/ParticleBlockManager.cpp index a7e954ec3bf..b9645f04fd2 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManager.cpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ParticleBlockManager.hpp b/src/coreComponents/mesh/generators/ParticleBlockManager.hpp index f3e349cc20b..8db63988897 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManager.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp b/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp index 6675d340a30..fc2decfd008 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp b/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp index c1ed1be5f13..436a41a81a4 100644 --- a/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp index 9d9209de82e..0306f1931bd 100644 --- a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/PartitionDescriptor.hpp b/src/coreComponents/mesh/generators/PartitionDescriptor.hpp index 8ed58ea17e1..2527ec16984 100644 --- a/src/coreComponents/mesh/generators/PartitionDescriptor.hpp +++ b/src/coreComponents/mesh/generators/PartitionDescriptor.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/PrismUtilities.hpp b/src/coreComponents/mesh/generators/PrismUtilities.hpp index 2b1568070ac..483f97d3d28 100644 --- a/src/coreComponents/mesh/generators/PrismUtilities.hpp +++ b/src/coreComponents/mesh/generators/PrismUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp index d9d32c22a21..05df2e0a99f 100644 --- a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp index 8168f31631f..243cceedc94 100644 --- a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp +++ b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp index ddcae6a3198..d1402d21821 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp index 46e5fc54ecb..6d2eabe911f 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp index ece2aade3d5..6261c76a150 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp index d38d25db874..9bd1a89118f 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp +++ b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/VTKUtilities.cpp b/src/coreComponents/mesh/generators/VTKUtilities.cpp index ac36adf2c21..81533728d32 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/VTKUtilities.hpp b/src/coreComponents/mesh/generators/VTKUtilities.hpp index ecab1c26c5d..6ebf4e6e89d 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.hpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/VTKWellGenerator.cpp b/src/coreComponents/mesh/generators/VTKWellGenerator.cpp index 37555ecb5c3..c6294c35683 100644 --- a/src/coreComponents/mesh/generators/VTKWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKWellGenerator.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/VTKWellGenerator.hpp b/src/coreComponents/mesh/generators/VTKWellGenerator.hpp index 04781491ed5..df4e92b3c87 100644 --- a/src/coreComponents/mesh/generators/VTKWellGenerator.hpp +++ b/src/coreComponents/mesh/generators/VTKWellGenerator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/WellGeneratorABC.hpp b/src/coreComponents/mesh/generators/WellGeneratorABC.hpp index e5a0d1d661d..c1719d5badf 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorABC.hpp +++ b/src/coreComponents/mesh/generators/WellGeneratorABC.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index 2b96c0755d3..594b0eaf012 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp index a2c05b5c280..99f1af95924 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/CommID.cpp b/src/coreComponents/mesh/mpiCommunications/CommID.cpp index b4310c23fb8..5a93eaee64e 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommID.cpp +++ b/src/coreComponents/mesh/mpiCommunications/CommID.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/CommID.hpp b/src/coreComponents/mesh/mpiCommunications/CommID.hpp index 9caf6a0dfeb..df56b0ca610 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommID.hpp +++ b/src/coreComponents/mesh/mpiCommunications/CommID.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp index 18572879521..fdb2ac41709 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp +++ b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp index 70542051f38..1261f70a964 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp +++ b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp index d6333d80c34..55609a0e0f5 100644 --- a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp +++ b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp index f9928a41fcc..e749a818725 100644 --- a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp +++ b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp index 4a1fcab1464..e4fbdbc2664 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp index beaabedea68..43314f693a6 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp b/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp index 89eab298f6b..c35eb3cc615 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp b/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp index 0452392ba1d..fdd1db1cfec 100644 --- a/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp +++ b/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp b/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp index 4193244d8a0..09605d6e0c2 100644 --- a/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp +++ b/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp index 7ba9a85f6d4..dda0542444e 100644 --- a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp +++ b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp index ac097bd7aa5..0328b4611a3 100644 --- a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp +++ b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp index 66936e9a260..852aa3b3e79 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp index b587777bdd4..fd0262a22cc 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp index 77391c498e2..c5e06695806 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp index ffa3f11225c..0edc644df7d 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp index 616311f1fc9..bc848f317b3 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp index d90b0a48ca9..b3b880e851f 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp index c2dd3e56300..31e0bfd5e50 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp index 6cb684237e9..8a0cd4ebe75 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp index 444ce7c003d..a6824ff7fa8 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp index 7dad76f3e8e..499dddddcba 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp index ef377d81b1d..470040f682e 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp index 49c7a18f05c..47483f4f233 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp index 2346b764dff..fa8639eb5d0 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp index 102b84881a2..4e23c3b06c8 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp index fc4a73fe74c..932bdf78758 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp index a4b2665b9c3..dc7ddf71925 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp index 7e7d355d07b..919881583d3 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp index 1d991ad35de..9d46881108b 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp b/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp index 1c832828d1d..21b68839d4a 100644 --- a/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp +++ b/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp b/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp index a3c275ced62..32c2181f58a 100644 --- a/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp +++ b/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp b/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp index dc0458c1452..1b222308603 100644 --- a/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp +++ b/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp b/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp index 4d723e1b7af..6f2d4840b41 100644 --- a/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp +++ b/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp b/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp index 06534e34387..d76f0ec131d 100644 --- a/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp +++ b/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp b/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp index 512a2dcf596..91bbeb087eb 100644 --- a/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp +++ b/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp index 63c33ffd332..1670a351364 100644 --- a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp +++ b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp b/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp index 477ec52accc..8eadb77b594 100644 --- a/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp +++ b/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp b/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp index 71fc7a0ee1d..305696161c6 100644 --- a/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp +++ b/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp index 2afecdd6d66..512edb7af7e 100644 --- a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp +++ b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp index 153703c0eb0..fd7ba60c1f4 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp index 9b86f6c14f1..55bcfe82763 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp index 8316485d56f..e958a2a054b 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp index 98bdcce95a8..e8f9eb1d5d4 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp index dbe465b4709..6820cffbe84 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp b/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp index bbe9f3dfad9..ed1234b5d35 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index 1f943674963..a235d1230bf 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index c135f3fda81..5b88227ed2a 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp b/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp index 7b12943aaca..6f48675d698 100644 --- a/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/SolverStatistics.cpp b/src/coreComponents/physicsSolvers/SolverStatistics.cpp index faacc8c446c..4fce578ebc0 100644 --- a/src/coreComponents/physicsSolvers/SolverStatistics.cpp +++ b/src/coreComponents/physicsSolvers/SolverStatistics.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/SolverStatistics.hpp b/src/coreComponents/physicsSolvers/SolverStatistics.hpp index 647bb40756c..64a173a0395 100644 --- a/src/coreComponents/physicsSolvers/SolverStatistics.hpp +++ b/src/coreComponents/physicsSolvers/SolverStatistics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp index f0d57887244..1ee3cb73aeb 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index 7851dbdaa4d..185a4c798c9 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp index d0d1b471ef3..829c4761ef1 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp index 9dc020a428a..7764d9e0a50 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp index 66916182df5..1f434b3a13e 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp index 60263a49390..7c63181a6c9 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp index 8fe9bdd0122..d1debe35a5d 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp index e737731a093..02250a60170 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp index 5d7ba39a73b..f37d5e8d05d 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp index 5a6ac7c2fec..c11bd493159 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp index d22bd0a1fb7..26e6ea5abe0 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp index b5e530db12f..236637a6e35 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp index 1664089d4c4..f04b533fb39 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp index acb25833db1..3018fb975c7 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp index 4203daaf701..83dfa5fd884 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index 0d6af0ee41e..df8976ed422 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index b04c2037384..669d9ce541b 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 75ac7e16f0e..e943728e7f0 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index 5a73c99c679..1e7483cd6c3 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index e80d9a8612c..2ce27d7e4f8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index 036a32095e8..55dcb3460b6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp index 8e57ab8f617..eb00898d8df 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 423619e2ad4..3df15307e80 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp index f29bfcf464f..93b54d898a7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index a7e7fe25fd5..084bd670f83 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp index 5d1a749c72f..5562f6202c9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp index ca60225e582..5ad239a5a1b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp index e043807a798..6953bfb7be2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp index 0573858876d..8240c9b3eaf 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp index 51bac86d928..ad81a74f521 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp index 8803d2fc966..ea13aa7ec05 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp index 3453ec47f30..7a316a92355 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 3e63e5e00c2..5c54deae9b5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index ef97e9a7fb8..883661f25a0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp index 14206735dc0..d9f01e908b9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp index 3935cbfeb69..4c3b0f0df36 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FluxKernelsHelper.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FluxKernelsHelper.hpp index 0d11dbe9ff2..5a61816e13c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FluxKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FluxKernelsHelper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp index 89db8fc596b..8aff3af7d74 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp index 02b8c7f6bf7..0128341058f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp index a8bfa806c77..7284f48d985 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp index c26187ed8ae..6670a649a03 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp index 43b6ca1c277..08359bc0d6a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index b4c23209be8..9442496dc2c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp index 7f2fee4d3bd..8e12090e9aa 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp index 303e86655d2..84d9f0e5f54 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp index ac7d0e583b6..168bb83da93 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 5edba2269c7..4468100083c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index 6a726ed5757..59ad25124b4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp index 9728e612ce9..8b3f80b95c9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp index dbb2d46ffd6..ddbf08c4080 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index a0f4c85bffe..d76de134fd8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp index c219295ae99..882ae4c7e8b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp index 5b6e76ef2d6..0a04b330ae9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 8688597c4b9..6cbabf723f7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp index cb5b55395e4..21c1bcaf09d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp index c5088a91bdd..2d05cc82c43 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp index 362b6ac137a..38d95f212e5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp index 9ee6e763ba8..ab07e60f9aa 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp index e1845cd7e1b..6f3395bad2e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp index 71aa6ea3050..63f3f538b8e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp index 2a37b5ffcc4..d64e374f9d2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp index 9d16ac881fd..4a54f7f3ab1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp index a6e364d9ea7..99d5c57f9d3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp index 85c552fe3fa..42ed3028feb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.hpp index b4aee90b0a6..2be2995f0aa 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp index 30b8b288c56..7da02f8d6e2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp index c2be6462655..23dcfafea9d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp index 53869fade9d..59f0215a0d4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp index 5bf8be65aaf..8f1881d41c2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp index 795aaad63cb..98d4be4d813 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp index 65966a54695..d3d678d6239 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp index 0ccb49617ac..5c4973d94b8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp index ec5d7a531a6..57ea2675a45 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp index 89dd25c6021..dc352b9cef0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp index 9ca730e1ad8..7c324a399a8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp index 3f72a80296a..c0c1b3b02ed 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp index 75769763fed..35baef938f0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 4cdc58d9509..2ad8b918fd7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp index 85fe50e90c1..c524575b860 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp index 8acb0bb4c0f..88d502f7941 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp index 5f25f370274..4e0d72499a4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp index 48de11b7987..f06b27ac202 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index 33f97007224..59c73f57eb9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp index 5dfd9e122c7..57dc1d9feff 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp index 0c157158908..3d733dde731 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp index 41039c2542b..f006802654c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp index 12767869b48..ec21ac00522 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp index 3d7cc6dfec5..9b24c9f61df 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp index 11a170abcbe..a71969ca029 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp index 2089d45ddbb..107c013cfd3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index 1e3b718f01d..e600b55eb35 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp index 50789e04806..1397512189e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp index 22a29ddf357..244b24d4ec4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp index 14ae9707b43..16618193b6a 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp index eb49f9270a7..30124cb34fa 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp index 9dfcd31d210..62344ce70e7 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp index 1b6433bc1b4..756f0d09e5d 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index 032fd3d2cad..c01984e2908 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index 37af042cd80..4904148cef4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp index d59063ad3f1..4314a716444 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index 665d3bee319..af10776cdf4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index cd70c11b165..93a5d49c243 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp index 551b8684b70..6102c209659 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp index 98cf52302a9..3f81dceeeb2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 3c108c21daa..301eb93de28 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOS Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index c9598839401..fd850f65b5f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp index e555a51d551..18416ef2083 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 7f17bbfb419..f1833a12b7e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index 0874c1237ec..faba8e1b6b0 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp index 3073b63dfbf..0057e882ca2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp index f0c8b9edacd..68ff98950c2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp index 7e5eb557f23..1d38ccf74e4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index e431cf1ac06..e86c9553544 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp index c76494e31c5..aa13564261b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index 0197591a1c8..b2fd6d4a603 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index d2c9d984348..a8899c78569 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index 76cd2a1120d..ed8cf47b964 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 5d84d5f205d..97bfe909e3a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp index 72cfd3d68ca..a522d389b86 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 79dba986aa4..d2c1c2ddecb 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp index ce82208f461..1094ae5f678 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index 6b9a74412c5..34932b61aba 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 06b434b8c32..3ad673bbb21 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp index 95c18014e58..af42e77b4d4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp index a654610a7c2..856ee6eccdf 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp index 55cf183c2fc..75c78e1c1aa 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template index f04afd07e4c..09802963fca 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template index 8b6b5bb9b1e..f2c44120f13 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp index accc4eb9bb1..711adb82808 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp index 5b1ecfc36f4..d7e85611e44 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp index ed4f3c07813..3f614829d9a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp index 69df32a8637..6904a047202 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp index 40067909e6b..4597b737554 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp index 82bfd7a76b6..b2073b58f95 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp index 9200f625fa5..bb79e9e66b4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp index 9526b15094e..faea5ade235 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp index 2a88711c247..33287b890ee 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp index 7d6405cb269..378285326bd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp index 3cf7cb0a08d..0621ec04d46 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp index 433a78136d0..e3b5b803d89 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp index 8e40377cee1..35e5ef0e1a9 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp index 1f099e4aac4..d62a283e364 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp index ca04f71d515..3f20f8f7618 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template index ce1c4465517..ff083ddc02a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/python/PySolver.cpp b/src/coreComponents/physicsSolvers/python/PySolver.cpp index ff03c1f06a0..e65db753aa2 100644 --- a/src/coreComponents/physicsSolvers/python/PySolver.cpp +++ b/src/coreComponents/physicsSolvers/python/PySolver.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/python/PySolver.hpp b/src/coreComponents/physicsSolvers/python/PySolver.hpp index c58be28eaf2..1b922e108f5 100644 --- a/src/coreComponents/physicsSolvers/python/PySolver.hpp +++ b/src/coreComponents/physicsSolvers/python/PySolver.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/python/PySolverType.hpp b/src/coreComponents/physicsSolvers/python/PySolverType.hpp index bb0f3232562..0d975291ea2 100644 --- a/src/coreComponents/physicsSolvers/python/PySolverType.hpp +++ b/src/coreComponents/physicsSolvers/python/PySolverType.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp index 5ddb2dfa45e..c55602a67ef 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp index 9b3b6b20735..164b54ee5d9 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp index e689c896b99..4b887570af9 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp index 565233bb099..054ba3e2a72 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp index 1c1e90c2db5..23b5e2cae9c 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp index a0098010c18..a3d41bbef67 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp index 0ea2099e1f8..01aed10c16f 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp index b252c8bc224..177373a5176 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp b/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp index 337e44d5f04..024caaa22ba 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp index 9b89e2acad4..d12b9b4e243 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 70756a953d7..5794878d59e 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index 9417db2282f..c59227142b1 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp index d1284bfd922..841ef5f448b 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp index 3e61d0c8886..464bbea3300 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp index 16e8377c0f1..b0cb8c16a2c 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp index 51de54a2d30..728fa5e9828 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index b5642b135e9..8df7ee28d80 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp index fc1900451a9..73d3772be1a 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp index ebcf06f5b0c..578c9c82ee6 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp index 0aa1b5faa95..64ec6a97721 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp index 3dea71ade09..e232b156156 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp index 22515acc710..30f42a86fb5 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp index 05f39528d30..d610b0331f4 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp index 94a576b37e7..f2dbcb00e2f 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp index bf46c0b27e1..6f12850a63d 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp index 3036f9b26db..ed39ff7e78f 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp index 73b1d60ec7d..72700e67ebc 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp index 5dac893e596..c0866309721 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp index c651e779f4c..3f4b3a7e17a 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp index f3a43d0d67f..304183a9192 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp index 81ea813640f..dc3508c1ab9 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template index 9f54e9b6981..eb4d851b027 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template index d89e243f313..d6014e31c30 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp index 0764ec73c61..fac98f550b5 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp index 3a431e83d3c..d77b1cb1e26 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in b/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in index 3ce454c8c2a..2cbf4ce9a1c 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp index c82afa916c3..0bc16f129e0 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp index 714ab835bbd..d8377b89dc6 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp index e382fd1495e..df8d00264e5 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp index cc835b15956..02714f610e8 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp index 22c2c3e792a..8d55db4becc 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp index 9d8791d66d0..901a12b30af 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index 839c31a7a48..9bcce6125f0 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp index 15a9627781c..09e37170f2e 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp index b45f7530f99..2217165e789 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp index 161dec93ac1..beeea1533c5 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp index 341780c2ed3..926e6bde6b3 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index e9db0ca9617..441be568741 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp index 52e72af8d91..eb6e72d1212 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp index 3a85644fdcd..2fb89ae9908 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp index 254ec561f03..1069ee8ae31 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index 1bfe1f970d8..da5199d7d9a 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp index d672c398387..373ace7cb4c 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp index 48f446f5fb9..3a711540091 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp index 8e8bfe4a808..6cb55e191a3 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index d9eab26fe72..4dabc899a92 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp index 0e0729bfbd9..57134c292a9 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp index 773df753ca0..f582a027f97 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp index 5599ca8b635..dd067a11a1f 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp index 52376985d09..b311d04d45d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp index 16eeaf02ced..20b838f6d62 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp index 43d7d36be4e..605a30383b4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp index 0cad8653579..ca9325909c4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp index 93fab00021d..7352b5fc42b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp index 65d96541df8..89341e561a1 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp index 382161128ba..c806342cfd6 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index 98d04bc3b7a..e64bc4b6c12 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp index 575226716f9..f6164876340 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp index 5403e975c10..a76cb4ed6fe 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp index 45ae775ef32..7e17769a02c 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp index 106afa53d02..68d105e6292 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 234915bc7f0..1e984673d0a 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp index 2c9ec3c37ee..f3c0b14396f 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp index bdfe2482575..c9d78fe64c6 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp index 15770d50a5c..5b98c51e0be 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp index 81d4b1c9700..f699039e9c9 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp index 9dcad646fa7..55f7dcc163d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp index c6fbf016edd..a5d98c5d970 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index d8e1af99dbc..26f157062ec 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp index fe17f6d6a9d..6c6ce292243 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp index 962337e6b40..0e43aa4a69f 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/schema/schemaUtilities.cpp b/src/coreComponents/schema/schemaUtilities.cpp index 4be8a32ab5d..e9d69702d33 100644 --- a/src/coreComponents/schema/schemaUtilities.cpp +++ b/src/coreComponents/schema/schemaUtilities.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/schema/schemaUtilities.hpp b/src/coreComponents/schema/schemaUtilities.hpp index d100fba856f..3152eeec60d 100644 --- a/src/coreComponents/schema/schemaUtilities.hpp +++ b/src/coreComponents/schema/schemaUtilities.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp index 943e5d5b985..cb3902d198d 100644 --- a/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp +++ b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp b/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp index 1cd08a8bc27..14a9032a1ca 100644 --- a/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp +++ b/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp b/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp index 5739f312236..9b8a69cf84d 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp b/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp index 2c33a9c1412..e7cf917857e 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp b/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp index 62598e18258..5c13f68c5cf 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp b/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp index 3e11e580a7e..29e6f6992f1 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp index bc017852419..80f88fb53f4 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp index 76c0ebd5b1e..367c8bbd724 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp index 3b1059e79cd..9b4b515ac7d 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp index c8896524a14..659fd8b3d18 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp b/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp index 5709e50346a..7c2208cdce9 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp b/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp index 47a3d690b1a..18bac11d647 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp b/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp index 4947a54b4b6..d2526d367c2 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp b/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp index 0885ef245ca..292957072bf 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp b/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp index 2ccd1d7a8ab..e208b9720aa 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp index 1b7ad5cb828..d27adf38c87 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp index 365e1c1124b..e511c09a0e0 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp index e71259ce9cc..e77aae20bff 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp index c6fb25aa69e..48d30aa4750 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp index ce73fb0f095..2d06ad0fcca 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp b/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp index 6aa1b76f2ef..79b749fa981 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp index 96686031ffc..05de91b1a60 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp index ca33e6ceddc..0a4cd2d67de 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp index 6ceb929e8c6..18bcdb53c8e 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp b/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp index 7b28a1973f5..dc759b01c77 100644 --- a/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp +++ b/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp b/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp index 0b65e47b2b3..1a8e7ca4609 100644 --- a/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp +++ b/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp b/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp index fa265348074..df8f7af001c 100644 --- a/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp +++ b/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp index 4759403391b..a69995c1166 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp index f294bfc327c..13b6f4acf2d 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp index 467dc6b4b31..9ff42295c6f 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp index e93bd189d67..cecdd689fe6 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp index a54853726db..4d7c67bb7bf 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp index 5d37fc2150d..7e04abc48c2 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp index 5e2ce087acd..6a5ba7c2679 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp index fc0c28d223e..d42ca9877ce 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp index cf40a3ef249..03f0b903e14 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp index 9f284792cf8..31ec3c9951a 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp index f9143d3ff7b..6ff832d9036 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp index 1916a92b527..29330b90c07 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp b/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp index 0e5d60d5f49..306653cc7fd 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp b/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp index 8183cd11111..6f4cb6d5026 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp b/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp index 38a1d84de3b..a6ba2385b95 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in b/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in index c892217a6b0..c244f79e62c 100644 --- a/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in +++ b/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp b/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp index eb5bf5c5f6c..3dad8b16738 100644 --- a/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp +++ b/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp index bad8b501521..cb0bc13651b 100644 --- a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp +++ b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp b/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp index 3302fd488ab..31fa9918fe7 100644 --- a/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp +++ b/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/meshTests/testVTKImport.cpp b/src/coreComponents/unitTests/meshTests/testVTKImport.cpp index 2f6db5820ee..38dbd02ced9 100644 --- a/src/coreComponents/unitTests/meshTests/testVTKImport.cpp +++ b/src/coreComponents/unitTests/meshTests/testVTKImport.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp b/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp index ef9459bfc26..1a0cdda6e2f 100644 --- a/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp +++ b/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp b/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp index 456c2bce29a..0080b79c749 100644 --- a/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp +++ b/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/toolchain/testToolchain.cpp b/src/coreComponents/unitTests/toolchain/testToolchain.cpp index e83cb5dcbf2..8c5ff278d92 100644 --- a/src/coreComponents/unitTests/toolchain/testToolchain.cpp +++ b/src/coreComponents/unitTests/toolchain/testToolchain.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp b/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp index acb1a734678..0344a73c899 100644 --- a/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp +++ b/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp index a5f972cb437..96f14de0bfe 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp index ef1b90414e9..983b1c2e1c3 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp index 2b48e1a6214..fed816e5022 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp index bfda1e3036c..3c9eeb20659 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp index e809afa0746..c5884ee9fd1 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp index 31bf7a4d154..136e7ab17fa 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp index 42dd003a8e8..ad2e70b9b5c 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp index 739d55f96fa..4d3b4e775ba 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp index 6b103800b02..3401166c3ae 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp b/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp index c012d99cd38..192f3e50f71 100644 --- a/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp +++ b/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/xmlTests/testXML.cpp b/src/coreComponents/unitTests/xmlTests/testXML.cpp index d0e6df69ad5..5d010686ac1 100644 --- a/src/coreComponents/unitTests/xmlTests/testXML.cpp +++ b/src/coreComponents/unitTests/xmlTests/testXML.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp b/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp index 09608d1e877..8d2231cc216 100644 --- a/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp +++ b/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/externalComponents/newComponentTemplate/src/NewComponent.cpp b/src/externalComponents/newComponentTemplate/src/NewComponent.cpp index 9a736691569..f9ec9069792 100644 --- a/src/externalComponents/newComponentTemplate/src/NewComponent.cpp +++ b/src/externalComponents/newComponentTemplate/src/NewComponent.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/externalComponents/newComponentTemplate/src/NewComponent.hpp b/src/externalComponents/newComponentTemplate/src/NewComponent.hpp index 788bf745527..41af5f7503b 100644 --- a/src/externalComponents/newComponentTemplate/src/NewComponent.hpp +++ b/src/externalComponents/newComponentTemplate/src/NewComponent.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp b/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp index bfb46c966b1..9a9a521007c 100644 --- a/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp +++ b/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/main/main.cpp b/src/main/main.cpp index 375b456aadf..66233a7b02a 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/pygeosx/pygeosx.cpp b/src/pygeosx/pygeosx.cpp index c16b6b2b268..75879623f5c 100644 --- a/src/pygeosx/pygeosx.cpp +++ b/src/pygeosx/pygeosx.cpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * diff --git a/src/pygeosx/pygeosx.hpp b/src/pygeosx/pygeosx.hpp index 644be973b9b..f90f6502f85 100644 --- a/src/pygeosx/pygeosx.hpp +++ b/src/pygeosx/pygeosx.hpp @@ -5,7 +5,7 @@ * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC * Copyright (c) 2018-2024 Total, S.A * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2023-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors * All rights reserved * From b70af6805273854901d116d06ca72258a32b672a Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Sun, 1 Sep 2024 12:23:39 -0700 Subject: [PATCH 176/286] docs: apply suggestions from joss review (#3296) * Modify build documents for problems from JOSS reviewers (#3258) * add Apple MacOS build doc * quick-start-template.cmake * Update host-configs/quick-start-template.cmake * add CODE_OF_CONDUCT and CONTRIBUTING file * fix doxygen links in sphinx docs * Update src/docs/sphinx/QuickStart.rst * Doxygen for SolverBase * Update Example.rst (#3315) * add frontier scaling to documentation * add the entire physicsSolver directory to the readthedocs doxygen * add card on main documentation page for submitting issues * fix a couple of typos * Add instructions, postprocess script, and figures to WellboreECP problem --------- Co-authored-by: Randolph Settgast Co-authored-by: Gerasimos Chourdakis Co-authored-by: Victor A. P. Magri --- CODE_OF_CONDUCT.md | 133 ++++++++ CONTRIBUTING.md | 3 + README.md | 7 +- host-configs/apple/macOS_base.cmake | 7 +- host-configs/quick-start-template.cmake | 32 ++ .../Egg/deadOilEgg_base_iterative.xml | 3 +- .../wellboreECP/ECP_Wellbore_geom01.xml | 32 ++ .../wellboreECP/ECP_Wellbore_geom02.xml | 32 ++ .../wellboreECP/ECP_Wellbore_geom03.xml | 32 ++ .../wellboreECP/ECP_Wellbore_geom04.xml | 32 ++ .../wellboreECP/ECP_Wellbore_geom05.xml | 32 ++ .../wellboreECP/ECP_Wellbore_geom06.xml | 32 ++ .../ECP_Wellbore_probdef.xml | 210 ++++++++++++ .../compositionalMultiphaseFlow/co2flash.txt | 1 + .../level01/ECP_Wellbore_gpu.xml | 78 +++++ .../level01/launch_frontier | 13 + .../level02/ECP_Wellbore_gpu.xml | 78 +++++ .../level02/launch_frontier | 18 + .../level03/ECP_Wellbore_gpu.xml | 78 +++++ .../level03/launch_frontier | 18 + .../level04/ECP_Wellbore_gpu.xml | 78 +++++ .../level04/launch_frontier | 18 + .../level05/ECP_Wellbore_gpu.xml | 78 +++++ .../level05/launch_frontier | 18 + .../level06/ECP_Wellbore_gpu.xml | 78 +++++ .../level06/launch_frontier | 18 + .../compositionalMultiphaseFlow/pvtgas.txt | 2 + .../compositionalMultiphaseFlow/pvtliquid.txt | 2 + inputFiles/wellboreECP/dispatch.py | 52 +++ .../mechanics/ECP_Wellbore_probdef.xml | 91 ++++++ .../mechanics/level01/ECP_Wellbore_cpu.xml | 81 +++++ .../mechanics/level01/ECP_Wellbore_gpu.xml | 87 +++++ .../mechanics/level01/launch_frontier | 13 + .../mechanics/level02/ECP_Wellbore_cpu.xml | 81 +++++ .../mechanics/level02/ECP_Wellbore_gpu.xml | 87 +++++ .../mechanics/level02/launch_frontier | 18 + .../mechanics/level03/ECP_Wellbore_cpu.xml | 81 +++++ .../mechanics/level03/ECP_Wellbore_gpu.xml | 87 +++++ .../mechanics/level03/launch_frontier | 18 + .../mechanics/level04/ECP_Wellbore_cpu.xml | 81 +++++ .../mechanics/level04/ECP_Wellbore_gpu.xml | 87 +++++ .../mechanics/level04/launch_frontier | 18 + .../mechanics/level05/ECP_Wellbore_cpu.xml | 81 +++++ .../mechanics/level05/ECP_Wellbore_gpu.xml | 87 +++++ .../mechanics/level05/launch_frontier | 18 + .../mechanics/level06/ECP_Wellbore_cpu.xml | 81 +++++ .../mechanics/level06/ECP_Wellbore_gpu.xml | 87 +++++ .../mechanics/level06/launch_frontier | 18 + inputFiles/wellboreECP/postprocess.py | 241 ++++++++++++++ .../singlePhaseFlow/ECP_Wellbore_probdef.xml | 124 +++++++ .../level01/ECP_Wellbore_cpu.xml | 60 ++++ .../level01/ECP_Wellbore_gpu.xml | 64 ++++ .../singlePhaseFlow/level01/launch_frontier | 13 + .../level02/ECP_Wellbore_cpu.xml | 60 ++++ .../level02/ECP_Wellbore_gpu.xml | 64 ++++ .../singlePhaseFlow/level02/launch_frontier | 18 + .../level03/ECP_Wellbore_cpu.xml | 60 ++++ .../level03/ECP_Wellbore_gpu.xml | 65 ++++ .../singlePhaseFlow/level03/launch_frontier | 18 + .../level04/ECP_Wellbore_cpu.xml | 60 ++++ .../level04/ECP_Wellbore_gpu.xml | 66 ++++ .../singlePhaseFlow/level04/launch_frontier | 18 + .../level05/ECP_Wellbore_cpu.xml | 60 ++++ .../level05/ECP_Wellbore_gpu.xml | 65 ++++ .../singlePhaseFlow/level05/launch_frontier | 18 + .../level06/ECP_Wellbore_gpu.xml | 65 ++++ .../singlePhaseFlow/level06/launch_frontier | 18 + src/conf.py | 29 +- src/coreComponents/dataRepository/Group.hpp | 2 +- .../dataRepository/docs/Group.rst | 6 + .../dataRepository/docs/MappedVector.rst | 6 +- .../dataRepository/docs/Wrapper.rst | 6 +- .../dataRepository/docs/dataRepository.rst | 8 +- .../mesh/docs/meshDeveloperGuide.rst | 10 + .../physicsSolvers/SolverBase.cpp | 26 +- .../physicsSolvers/SolverBase.hpp | 309 +++++++++++++++--- src/docs/doxygen/Doxyfile.in | 3 +- src/docs/sphinx/Doxygen.rst | 16 +- src/docs/sphinx/QuickStart.rst | 159 ++++----- .../performanceBenchmarks/Index.rst | 151 +++++++++ ...l_frontier_compositionalMultiphaseFlow.png | Bin 0 -> 397686 bytes .../weakscal_frontier_mechanics.png | Bin 0 -> 419739 bytes .../weakscal_frontier_singlePhaseFlow.png | Bin 0 -> 458909 bytes .../basicExamples/co2Injection/Example.rst | 4 +- src/docs/sphinx/buildGuide/AppleMacOS.rst | 93 ++++++ src/docs/sphinx/buildGuide/Index.rst | 2 + src/docs/sphinx/buildGuide/Prerequisites.rst | 6 +- .../developerGuide/Contributing/Doxygen.rst | 16 +- .../Contributing/index_contributing.rst | 1 + src/docs/sphinx/developerGuide/Index.rst | 5 +- .../KeyComponents/index_KeyComponents.rst | 2 + src/index.rst | 16 + 92 files changed, 4256 insertions(+), 194 deletions(-) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 host-configs/quick-start-template.cmake create mode 100644 inputFiles/wellboreECP/ECP_Wellbore_geom01.xml create mode 100644 inputFiles/wellboreECP/ECP_Wellbore_geom02.xml create mode 100644 inputFiles/wellboreECP/ECP_Wellbore_geom03.xml create mode 100644 inputFiles/wellboreECP/ECP_Wellbore_geom04.xml create mode 100644 inputFiles/wellboreECP/ECP_Wellbore_geom05.xml create mode 100644 inputFiles/wellboreECP/ECP_Wellbore_geom06.xml create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/ECP_Wellbore_probdef.xml create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/co2flash.txt create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level01/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level01/launch_frontier create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level02/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level02/launch_frontier create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level03/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level03/launch_frontier create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level04/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level04/launch_frontier create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level05/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level05/launch_frontier create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level06/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/level06/launch_frontier create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/pvtgas.txt create mode 100644 inputFiles/wellboreECP/compositionalMultiphaseFlow/pvtliquid.txt create mode 100755 inputFiles/wellboreECP/dispatch.py create mode 100644 inputFiles/wellboreECP/mechanics/ECP_Wellbore_probdef.xml create mode 100644 inputFiles/wellboreECP/mechanics/level01/ECP_Wellbore_cpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level01/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level01/launch_frontier create mode 100644 inputFiles/wellboreECP/mechanics/level02/ECP_Wellbore_cpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level02/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level02/launch_frontier create mode 100644 inputFiles/wellboreECP/mechanics/level03/ECP_Wellbore_cpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level03/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level03/launch_frontier create mode 100644 inputFiles/wellboreECP/mechanics/level04/ECP_Wellbore_cpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level04/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level04/launch_frontier create mode 100644 inputFiles/wellboreECP/mechanics/level05/ECP_Wellbore_cpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level05/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level05/launch_frontier create mode 100644 inputFiles/wellboreECP/mechanics/level06/ECP_Wellbore_cpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level06/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/mechanics/level06/launch_frontier create mode 100755 inputFiles/wellboreECP/postprocess.py create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/ECP_Wellbore_probdef.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level01/ECP_Wellbore_cpu.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level01/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level01/launch_frontier create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level02/ECP_Wellbore_cpu.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level02/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level02/launch_frontier create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level03/ECP_Wellbore_cpu.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level03/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level03/launch_frontier create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level04/ECP_Wellbore_cpu.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level04/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level04/launch_frontier create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level05/ECP_Wellbore_cpu.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level05/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level05/launch_frontier create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level06/ECP_Wellbore_gpu.xml create mode 100644 inputFiles/wellboreECP/singlePhaseFlow/level06/launch_frontier create mode 100644 src/docs/sphinx/advancedExamples/performanceBenchmarks/weakscal_frontier_compositionalMultiphaseFlow.png create mode 100644 src/docs/sphinx/advancedExamples/performanceBenchmarks/weakscal_frontier_mechanics.png create mode 100644 src/docs/sphinx/advancedExamples/performanceBenchmarks/weakscal_frontier_singlePhaseFlow.png create mode 100644 src/docs/sphinx/buildGuide/AppleMacOS.rst diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..51b8667db23 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,133 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official email address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +settgast1@llnl.gov. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000000..5d9b612c2fd --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,3 @@ +To contribute to GEOS, please refer to the [Contributing](https://geosx-geosx.readthedocs-hosted.com/en/latest/docs/sphinx/developerGuide/Contributing/index_contributing.html) section in the [GEOS developer guide](https://geosx-geosx.readthedocs-hosted.com/en/latest/docs/sphinx/developerGuide/Index.html#). + +To report a bug please open an [issue](https://github.com/GEOS-DEV/GEOS/issues) \ No newline at end of file diff --git a/README.md b/README.md index 000d3b45c7d..6d4cfee25ff 100644 --- a/README.md +++ b/README.md @@ -21,10 +21,13 @@ page for more details on the HPC, numerics, and applied engineering components of this effort. Documentation ---------------------- +------------- -Our documentation is hosted [here](https://geosx-geosx.readthedocs-hosted.com/en/latest/?). +Please visit the [Main documentation for GEOS](https://geosx-geosx.readthedocs-hosted.com/en/latest/?). +If you would like to contribute to GEOS, please see the [developer guide](https://geosx-geosx.readthedocs-hosted.com/en/latest/docs/sphinx/developerGuide/Index.html) + +If you would like to report a bug, please submit an [issue](https://github.com/GEOS-DEV/GEOS/issues/new/choose). Who develops GEOS? ------------------- diff --git a/host-configs/apple/macOS_base.cmake b/host-configs/apple/macOS_base.cmake index c9cf2efc8df..1e5e06c80aa 100644 --- a/host-configs/apple/macOS_base.cmake +++ b/host-configs/apple/macOS_base.cmake @@ -25,15 +25,16 @@ set(ENABLE_CALIPER "OFF" CACHE PATH "" FORCE ) set( BLAS_LIBRARIES ${HOMEBREW_DIR}/opt/lapack/lib/libblas.dylib CACHE PATH "" FORCE ) set( LAPACK_LIBRARIES ${HOMEBREW_DIR}/opt/lapack/lib/liblapack.dylib CACHE PATH "" FORCE ) -set(ENABLE_DOXYGEN OFF CACHE BOOL "" FORCE) +set(ENABLE_DOXYGEN ON CACHE BOOL "" FORCE) +set(ENABLE_SPHINX ON CACHE BOOL "" FORCE) set(ENABLE_MATHPRESSO OFF CACHE BOOL "" FORCE ) set(GEOS_BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE) -#set( DOXYGEN_EXECUTABLE /usr/local/bin/doxygen CACHE PATH "" FORCE ) -#set( SPHINX_EXECUTABLE /usr/local/bin/sphinx-build CACHE PATH "" FORCE ) +set( DOXYGEN_EXECUTABLE ${HOMEBREW_DIR}/bin/doxygen CACHE PATH "" FORCE ) +set( SPHINX_EXECUTABLE ${HOMEBREW_DIR}/opt/sphinx-doc/bin/sphinx-build CACHE PATH "" FORCE ) if(NOT ( EXISTS "${GEOS_TPL_DIR}" AND IS_DIRECTORY "${GEOS_TPL_DIR}" ) ) set(GEOS_TPL_DIR "${CMAKE_SOURCE_DIR}/../../thirdPartyLibs/install-${CONFIG_NAME}-release" CACHE PATH "" FORCE ) diff --git a/host-configs/quick-start-template.cmake b/host-configs/quick-start-template.cmake new file mode 100644 index 00000000000..7170d002b23 --- /dev/null +++ b/host-configs/quick-start-template.cmake @@ -0,0 +1,32 @@ +set( CONFIG_NAME "quick-start" ) + +# Set compilers path +set(CMAKE_C_COMPILER "path-to-gcc/bin/gcc" CACHE PATH "") # This is typically something like /usr/bin/gcc ... or clang +set(CMAKE_CXX_COMPILER "path-to-gcc/bin/g++" CACHE PATH "") # This is typically something like /usr/bin/g++ ... or clang++ +set(ENABLE_FORTRAN OFF CACHE BOOL "" FORCE) + +# Set paths to mpi +set(ENABLE_MPI ON CACHE PATH "") +set(MPI_C_COMPILER "path-to-mpi/bin/mpicc" CACHE PATH "") # This is typically something like /usr/bin/mpicc +set(MPI_CXX_COMPILER "path-to-mpi/bin/mpicxx" CACHE PATH "") # This is typically something like /usr/bin/mpicxx +set(MPIEXEC "path-to-mpi/bin/mpirun" CACHE PATH "") # This is typically something like /usr/bin/mpirun + +# Set paths to blas and lapack +set( BLAS_LIBRARIES "path-to-blas" CACHE PATH "" FORCE ) # This is typically something like /usr/lib64/libblas.so +set( LAPACK_LIBRARIES CACHE PATH "path-to-lapack" FORCE ) # This is typically something like /usr/lib64/liblapack.so + +# Cuda and openMP +set( ENABLE_CUDA OFF CACHE PATH "" FORCE ) +set( ENABLE_OPENMP OFF CACHE PATH "" FORCE ) + +# TPLs +set( ENABLE_TRILINOS OFF CACHE PATH "" FORCE ) +set( ENABLE_CALIPER OFF CACHE PATH "" FORCE ) +set( ENABLE_DOXYGEN OFF CACHE BOOL "" FORCE) +set( ENABLE_MATHPRESSO OFF CACHE BOOL "" FORCE ) + +if(NOT ( EXISTS "${GEOS_TPL_DIR}" AND IS_DIRECTORY "${GEOS_TPL_DIR}" ) ) + set(GEOS_TPL_DIR "${CMAKE_SOURCE_DIR}/../../thirdPartyLibs/install-${CONFIG_NAME}-release" CACHE PATH "" FORCE ) +endif() + +include(${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake) diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_base_iterative.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_base_iterative.xml index 56c2ade45d2..b0c99c23121 100644 --- a/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_base_iterative.xml +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Egg/deadOilEgg_base_iterative.xml @@ -23,7 +23,8 @@ preconditionerType="mgr" krylovTol="1e-4" krylovAdaptiveTol="1" - krylovWeakestTol="1e-2"/> + krylovWeakestTol="1e-2" + logLevel="1"/> + + + + + + + + + + diff --git a/inputFiles/wellboreECP/ECP_Wellbore_geom02.xml b/inputFiles/wellboreECP/ECP_Wellbore_geom02.xml new file mode 100644 index 00000000000..dcd2f82f4d2 --- /dev/null +++ b/inputFiles/wellboreECP/ECP_Wellbore_geom02.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/ECP_Wellbore_geom03.xml b/inputFiles/wellboreECP/ECP_Wellbore_geom03.xml new file mode 100644 index 00000000000..d9e0265862c --- /dev/null +++ b/inputFiles/wellboreECP/ECP_Wellbore_geom03.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/ECP_Wellbore_geom04.xml b/inputFiles/wellboreECP/ECP_Wellbore_geom04.xml new file mode 100644 index 00000000000..f89b5a7df8c --- /dev/null +++ b/inputFiles/wellboreECP/ECP_Wellbore_geom04.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/ECP_Wellbore_geom05.xml b/inputFiles/wellboreECP/ECP_Wellbore_geom05.xml new file mode 100644 index 00000000000..b6ff8b22bfc --- /dev/null +++ b/inputFiles/wellboreECP/ECP_Wellbore_geom05.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/ECP_Wellbore_geom06.xml b/inputFiles/wellboreECP/ECP_Wellbore_geom06.xml new file mode 100644 index 00000000000..46653587fab --- /dev/null +++ b/inputFiles/wellboreECP/ECP_Wellbore_geom06.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/ECP_Wellbore_probdef.xml b/inputFiles/wellboreECP/compositionalMultiphaseFlow/ECP_Wellbore_probdef.xml new file mode 100644 index 00000000000..4b426eae484 --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/ECP_Wellbore_probdef.xml @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/co2flash.txt b/inputFiles/wellboreECP/compositionalMultiphaseFlow/co2flash.txt new file mode 100644 index 00000000000..ec46548d345 --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/co2flash.txt @@ -0,0 +1 @@ +FlashModel CO2Solubility 1e6 5e7 5e5 367.15 369.15 1 0 diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level01/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level01/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..d7f365e4ac3 --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level01/ECP_Wellbore_gpu.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level01/launch_frontier b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level01/launch_frontier new file mode 100644 index 00000000000..550f5402193 --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level01/launch_frontier @@ -0,0 +1,13 @@ +#!/bin/bash +#SBATCH -N 1 +#SBATCH -n 1 +#SBATCH -t 1:00:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-compflow-geom01.out + +echo `date` +cmd="srun -N 1 -n 1 -c 1 --gpus-per-node=1 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 1 -y 1 -z 1 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level02/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level02/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..968c53afb99 --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level02/ECP_Wellbore_gpu.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level02/launch_frontier b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level02/launch_frontier new file mode 100644 index 00000000000..15379ad037a --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level02/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 1 +#SBATCH -n 4 +#SBATCH -t 2:00:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-compflow-geom02.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 1 -n 4 -c 1 --gpus-per-node=4 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 1 -y 1 -z 4 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level03/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level03/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..299faa6e0d5 --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level03/ECP_Wellbore_gpu.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level03/launch_frontier b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level03/launch_frontier new file mode 100644 index 00000000000..b64624e817e --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level03/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 4 +#SBATCH -n 32 +#SBATCH -t 2:00:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-compflow-geom03.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 4 -n 32 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 2 -y 2 -z 8 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level04/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level04/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..75790211238 --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level04/ECP_Wellbore_gpu.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level04/launch_frontier b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level04/launch_frontier new file mode 100644 index 00000000000..8068a2eafb8 --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level04/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 32 +#SBATCH -n 256 +#SBATCH -t 2:00:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-compflow-geom04.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 32 -n 256 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 4 -y 4 -z 16 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level05/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level05/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..bb2a7a50ffe --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level05/ECP_Wellbore_gpu.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level05/launch_frontier b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level05/launch_frontier new file mode 100644 index 00000000000..7b26b022959 --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level05/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 256 +#SBATCH -n 2048 +#SBATCH -t 4:00:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-compflow-geom05.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 256 -n 2048 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 8 -y 8 -z 32 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level06/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level06/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..bdfaaf7384b --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level06/ECP_Wellbore_gpu.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/level06/launch_frontier b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level06/launch_frontier new file mode 100644 index 00000000000..e8f3c24bf51 --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/level06/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 2048 +#SBATCH -n 16384 +#SBATCH -t 4:00:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-compflow-geom06.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 2048 -n 16384 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 16 -y 16 -z 64 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/pvtgas.txt b/inputFiles/wellboreECP/compositionalMultiphaseFlow/pvtgas.txt new file mode 100644 index 00000000000..6442bd866a3 --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/pvtgas.txt @@ -0,0 +1,2 @@ +DensityFun SpanWagnerCO2Density 1e6 5e7 5e5 367.15 369.15 1 +ViscosityFun FenghourCO2Viscosity 1e6 5e7 5e5 367.15 369.15 1 diff --git a/inputFiles/wellboreECP/compositionalMultiphaseFlow/pvtliquid.txt b/inputFiles/wellboreECP/compositionalMultiphaseFlow/pvtliquid.txt new file mode 100644 index 00000000000..a4b549a84ca --- /dev/null +++ b/inputFiles/wellboreECP/compositionalMultiphaseFlow/pvtliquid.txt @@ -0,0 +1,2 @@ +DensityFun PhillipsBrineDensity 1e6 5e7 5e5 367.15 369.15 1 0 +ViscosityFun PhillipsBrineViscosity 0 diff --git a/inputFiles/wellboreECP/dispatch.py b/inputFiles/wellboreECP/dispatch.py new file mode 100755 index 00000000000..63249ecf0e2 --- /dev/null +++ b/inputFiles/wellboreECP/dispatch.py @@ -0,0 +1,52 @@ +#!/opt/cray/pe/python/3.11.5/bin/python + +import argparse +import os +import sys + +def main(args): + parser = argparse.ArgumentParser() + parser.add_argument('-a','--account',required=True) + parser.add_argument('-b','--binary',required=True) + parser.add_argument('-c','--caliper',default="") + parser.add_argument('-p','--problem',required=True) + parser.add_argument('-s','--script',default="launch_frontier") + parser.add_argument('-d','--dispatch',default="sbatch") + parser.add_argument('-v','--verbosity',type=int,default=0) + parser.add_argument('-l','--levels',nargs='+') + args = parser.parse_args(args) + + if args.caliper in ("default", "def", "standard", "std"): + profiling="\"-t runtime-report,max_column_width=200,calc.inclusive,output=stdout,mpi-report\"" + else: + profiling=args.caliper + + avail_problems = [ d for d in os.listdir(os.getcwd()) if os.path.isdir(d) ] + + if args.problem not in avail_problems: + print(f"Unkown problem {args.problem}") + raise SystemExit(1) + + os.chdir(os.path.join(os.getcwd(),args.problem)) + prob_dir = os.getcwd() + + levels = list( sorted( ( d for d in os.listdir(prob_dir) if os.path.isdir(d) and d.startswith("level") ), key=lambda v: int(v[5:]) ) ) + if args.levels is not None: + args.levels = [ int(l) for l in args.levels ] + levels = [ l for l in levels if int(l[5:]) in args.levels ] + + if args.verbosity: + print(f"{levels = }") + + launch = ' '.join([args.dispatch, "-A", args.account, args.script, args.binary, profiling]) + if args.verbosity: + print(f"{launch = }") + + for level in levels: + os.chdir(level) + print(os.getcwd()) + os.system(launch) + os.chdir(prob_dir) + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/inputFiles/wellboreECP/mechanics/ECP_Wellbore_probdef.xml b/inputFiles/wellboreECP/mechanics/ECP_Wellbore_probdef.xml new file mode 100644 index 00000000000..03565ea7c62 --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/ECP_Wellbore_probdef.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level01/ECP_Wellbore_cpu.xml b/inputFiles/wellboreECP/mechanics/level01/ECP_Wellbore_cpu.xml new file mode 100644 index 00000000000..ff1e6e2786b --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level01/ECP_Wellbore_cpu.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level01/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/mechanics/level01/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..955caa1251f --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level01/ECP_Wellbore_gpu.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level01/launch_frontier b/inputFiles/wellboreECP/mechanics/level01/launch_frontier new file mode 100644 index 00000000000..1e292da4fa3 --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level01/launch_frontier @@ -0,0 +1,13 @@ +#!/bin/bash +#SBATCH -N 1 +#SBATCH -n 1 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-mechanics-geom01.out + +echo `date` +cmd="srun -N 1 -n 1 -c 1 --gpus-per-node=1 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 1 -y 1 -z 1 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/mechanics/level02/ECP_Wellbore_cpu.xml b/inputFiles/wellboreECP/mechanics/level02/ECP_Wellbore_cpu.xml new file mode 100644 index 00000000000..0ce1e921b86 --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level02/ECP_Wellbore_cpu.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level02/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/mechanics/level02/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..42b793fd141 --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level02/ECP_Wellbore_gpu.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level02/launch_frontier b/inputFiles/wellboreECP/mechanics/level02/launch_frontier new file mode 100644 index 00000000000..dc892143c51 --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level02/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 1 +#SBATCH -n 8 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-mechanics-geom02.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1; +ldd ${1} +cmd="srun -N 1 -n 8 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 1 -y 1 -z 8 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/mechanics/level03/ECP_Wellbore_cpu.xml b/inputFiles/wellboreECP/mechanics/level03/ECP_Wellbore_cpu.xml new file mode 100644 index 00000000000..f293dbac569 --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level03/ECP_Wellbore_cpu.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level03/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/mechanics/level03/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..2f45ff7d84a --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level03/ECP_Wellbore_gpu.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level03/launch_frontier b/inputFiles/wellboreECP/mechanics/level03/launch_frontier new file mode 100644 index 00000000000..ec1946ef77f --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level03/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 8 +#SBATCH -n 64 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-mechanics-geom03.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 8 -n 64 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 2 -y 2 -z 16 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/mechanics/level04/ECP_Wellbore_cpu.xml b/inputFiles/wellboreECP/mechanics/level04/ECP_Wellbore_cpu.xml new file mode 100644 index 00000000000..0275158d56e --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level04/ECP_Wellbore_cpu.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level04/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/mechanics/level04/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..0daa1f3b2e1 --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level04/ECP_Wellbore_gpu.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level04/launch_frontier b/inputFiles/wellboreECP/mechanics/level04/launch_frontier new file mode 100644 index 00000000000..30504f5a86b --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level04/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 64 +#SBATCH -n 512 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-mechanics-geom04.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 64 -n 512 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 4 -y 4 -z 32 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/mechanics/level05/ECP_Wellbore_cpu.xml b/inputFiles/wellboreECP/mechanics/level05/ECP_Wellbore_cpu.xml new file mode 100644 index 00000000000..e175ad452cc --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level05/ECP_Wellbore_cpu.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level05/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/mechanics/level05/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..35793297b48 --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level05/ECP_Wellbore_gpu.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level05/launch_frontier b/inputFiles/wellboreECP/mechanics/level05/launch_frontier new file mode 100644 index 00000000000..d69845ff39a --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level05/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 512 +#SBATCH -n 4096 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-mechanics-geom05.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 512 -n 4096 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 8 -y 8 -z 64 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/mechanics/level06/ECP_Wellbore_cpu.xml b/inputFiles/wellboreECP/mechanics/level06/ECP_Wellbore_cpu.xml new file mode 100644 index 00000000000..d1901ff9371 --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level06/ECP_Wellbore_cpu.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level06/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/mechanics/level06/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..8ebe7b9238e --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level06/ECP_Wellbore_gpu.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/mechanics/level06/launch_frontier b/inputFiles/wellboreECP/mechanics/level06/launch_frontier new file mode 100644 index 00000000000..2fd2ad14edc --- /dev/null +++ b/inputFiles/wellboreECP/mechanics/level06/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 4096 +#SBATCH -n 32768 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-mechanics-geom06.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 4096 -n 32768 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 16 -y 16 -z 128 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/postprocess.py b/inputFiles/wellboreECP/postprocess.py new file mode 100755 index 00000000000..914c1abd038 --- /dev/null +++ b/inputFiles/wellboreECP/postprocess.py @@ -0,0 +1,241 @@ +#!/opt/cray/pe/python/3.11.5/bin/python + +import matplotlib.pyplot as plt +import argparse +import glob +import sys +import re +import os + +def parse_log_file(file_path): + """Parse the log file from GEOS and extract required statistics.""" + try: + print(f"Parsing {file_path = }") + with open(file_path, 'r') as file: + data = file.read() + + except FileNotFoundError: + print(f"Error: File not found - {file_path}", file=sys.stderr) + + except Exception as e: + print(f"Error processing file {file_path}: {str(e)}", file=sys.stderr) + + # Regex patterns to extract the required information + patterns = { + 'non_linear_iters': re.compile(r'number of successful nonlinear iterations: (\d+).*number of discarded nonlinear iterations: (\d+)', re.S), + 'linear_iters': re.compile(r'number of successful linear iterations: (\d+).*number of discarded linear iterations: (\d+)', re.S), + 'applysol_time': re.compile(r'apply solution time = (\d+\.\d+) s'), + 'assemble_time': re.compile(r'assemble time = (\d+\.\d+) s'), + 'convcheck_time': re.compile(r'convergence check time = (\d+\.\d+) s'), + 'update_state_time': re.compile(r'update state time = (\d+\.\d+) s'), + 'ls_create_time': re.compile(r'linear solver create time = (\d+.\d+) s'), + 'ls_setup_time': re.compile(r'linear solver setup time = (\d+.\d+) s'), + 'ls_solve_time': re.compile(r'linear solver solve time = (\d+.\d+) s'), + 'run_time': re.compile(r'run time\s+.*\((\d+\.\d+) s\)') + } + + # Dictionary to hold the results + stats = {} + + # Extract and process all patterns + for key, pattern in patterns.items(): + if key in ['non_linear_iters', 'linear_iters']: + xmatch = pattern.search(data) + stats[key] = int(xmatch.group(1)) + int(xmatch.group(2)) if xmatch else 0 + + else: + xmatch = pattern.search(data) + stats[key] = float(xmatch.group(1)) if xmatch else 0 + + # Calculate GEOS time (run time excluding hypre time) + stats['geos_time'] = stats['run_time'] - (stats['ls_create_time'] + stats['ls_setup_time'] + stats['ls_solve_time']) + + # Calculate averages + averages = { + 'avg_geos_time': 'geos_time', + 'avg_ls_create_time': 'ls_create_time', + 'avg_ls_setup_time': 'ls_setup_time', + 'avg_ls_solve_time': 'ls_solve_time', + 'avg_ls_iters': 'linear_iters', + 'avg_run_time': 'run_time' + } + + if stats['non_linear_iters'] <= 0: + print(f"Invalid number of non-linear iterations!", file=sys.stderr) + return None + + for avg_key, total_key in averages.items(): + stats[avg_key] = stats[total_key] / stats['non_linear_iters'] + + # Store level + xmatch = re.search(r'level(\d+)', file_path) + stats['level'] = int(xmatch.group(1)) if xmatch else -1 + + return stats + +def print_results(model, results): + """Print results in markdown table format""" + if not results or not all(results): + print(f"Invalid results!", file=sys.stderr) + return + + # Setup header + headers = ["Level", "GEOS (s)", "Matrix creation (s)", "Hypre setup (s)", "Hypre solve (s)", "Total (s)", "Hypre iters"] + + # Gather all rows data including headers + data_rows = [ + headers, + *[ + [ + "{:02d}".format(result['level']), + "{:.4f}".format(result['avg_geos_time']), + "{:.4f}".format(result['avg_ls_create_time']), + "{:.4f}".format(result['avg_ls_setup_time']), + "{:.4f}".format(result['avg_ls_solve_time']), + "{:.4f}".format(result['avg_run_time']), + "{:.1f}".format(result['avg_ls_iters']), + ] + for result in results + ] + ] + + # Calculate maximum column widths + max_widths = [max(len(row[i]) for row in data_rows) for i in range(len(headers))] + + # Print header row with adjusted widths + header_row = "| " + " | ".join(header.ljust(max_widths[i]) for i, header in enumerate(headers)) + " |" + print(f"\nSummary table for {model}:\n") + print(header_row) + + # Adjust the divider line based on maximum widths + divider_line = "|" + "|".join(["-" * (max_widths[i] + 2) for i in range(len(headers))]) + "|" + print(divider_line) + + # Print each data row with adjusted widths + for row in data_rows[1:]: # Skip the header in data_rows for output + formatted_row = "| " + " | ".join(item.ljust(max_widths[i]) for i, item in enumerate(row)) + " |" + print(formatted_row) + +def plot_results(model, model_data, results, fs=16, ms=10): + if not results: + return + + plt.rcParams.update({'font.size': fs}) + fig, ax = plt.subplots(figsize=(10, 6)) + + # Extracting ranks and global DOFs + levels = [result['level'] for result in results] + ranks = [entry['ranks'] for entry in model_data if entry['level'] in levels] + global_dofs = [entry['global_dofs'] for entry in model_data if entry['level'] in levels] + + # Setting up data for plotting + geos_times = [result['avg_geos_time'] for result in results] + ls_create_times = [result['avg_ls_create_time'] for result in results] + ls_setup_times = [result['avg_ls_setup_time'] for result in results] + ls_solve_times = [result['avg_ls_solve_time'] for result in results] + total_times = [result['avg_run_time'] for result in results] + + # Plotting each metric + ax.plot(ranks, geos_times, 'o-', markersize=ms, label='GEOS') + ax.plot(ranks, ls_create_times, 's-', markersize=ms, label='Matrix Creation') + ax.plot(ranks, ls_setup_times, '^-', markersize=ms, label='Hypre Setup') + ax.plot(ranks, ls_solve_times, 'v-', markersize=ms, label='Hypre Solve') + ax.plot(ranks, total_times, 'd-', markersize=ms, label='Total') + + # Adding labels and legend + ax.set_title(f"Weak scaling - {model}", fontsize=fs+4) + ax.set_xlabel('Number of GPUs (Global DOFs)', labelpad=18, fontsize=fs+1) + ax.set_ylabel('Time (s)', labelpad=18, fontsize=fs+1) + ax.set_xscale('log', base=2) + ax.set_xticks(ranks) + ax.set_xticklabels([f"{r:,} ({d})" for r, d in zip(ranks, global_dofs)]) + ax.legend(fontsize=fs) + + # Show grid lines + ax.grid(True, which='both', linestyle='--', linewidth=0.5, color='gray') # Add gridlines with custom settings + + # Update margins + plt.tight_layout() + + # Save figure to file + figname = f"weakscal_{model}.png" + print(f"Saving figure to file {figname}...") + plt.savefig(figname, format='png', dpi=450) + + # Show the plot + plt.show() + +def find_newest_file(model, level): + """Finds the newest output file under the directory relative to a physics model and for certain problem level (mesh refinement).""" + target_dir = os.path.join(model, f"level{level:02d}") + files = glob.glob(os.path.join(target_dir, '*.out')) + if not files: + return target_dir, None + + # Extract the job ID numbers and sort the files by these IDs + suffixes = {'mechanics': 'mechanics', + 'singlePhaseFlow': 'singlePhaseFlow', + 'compositionalMultiphaseFlow': 'compflow'} + files_with_ids = [(file, int(re.search(rf"(\d+)-{suffixes[model]}", file).group(1))) for file in files] + + # Sort by the job ID number + return target_dir, max(files_with_ids, key=lambda x: x[1])[0] + +def main(): + """Process multiple input files and store results using command line arguments.""" + valid_models = ['mechanics', 'singlePhaseFlow', 'compositionalMultiphaseFlow'] + + parser = argparse.ArgumentParser() + parser.add_argument('-m', '--model', required=True, choices=valid_models, help="Physics model") + parser.add_argument('-l', '--levels', nargs='+', type=int, help="Levels to process") + args = parser.parse_args() + + # Setup problem info + problems = { + "mechanics": [ + {"level": 2, "ranks": 8, "global_dofs": "20.7M"}, + {"level": 3, "ranks": 64, "global_dofs": "162M"}, + {"level": 4, "ranks": 512, "global_dofs": "1.3B"}, + {"level": 5, "ranks": 4096, "global_dofs": "10.2B"}, + {"level": 6, "ranks": 32768, "global_dofs": "81.3B"} + ], + "singlePhaseFlow": [ + {"level": 2, "ranks": 4, "global_dofs": "6.6M"}, + {"level": 3, "ranks": 32, "global_dofs": "52.8M"}, + {"level": 4, "ranks": 256, "global_dofs": "422M"}, + {"level": 5, "ranks": 2048, "global_dofs": "3.4B"}, + {"level": 6, "ranks": 16384, "global_dofs": "27B"} + ], + "compositionalMultiphaseFlow": [ + {"level": 2, "ranks": 4, "global_dofs": "19.8M"}, + {"level": 3, "ranks": 32, "global_dofs": "153M"}, + {"level": 4, "ranks": 256, "global_dofs": "1.2B"}, + {"level": 5, "ranks": 2048, "global_dofs": "9.8B"} + ] + } + + # Set default levels if not passed in + if args.levels is None: + args.levels = [entry['level'] for entry in problems[args.model]] + + # Read log files + results = [] + file_paths = [] + for level in args.levels: + target_dir, file_path = find_newest_file(args.model, level) + if file_path: + file_paths.append(file_path) + else: + print(f"No suitable files found in {target_dir}") + + # Parse statistics + results = [parse_log_file(fp) for fp in file_paths] + + # Print summary table + print_results(args.model, results) + + # Plot results + plot_results(args.model, problems[args.model], results) + +if __name__ == "__main__": + main() diff --git a/inputFiles/wellboreECP/singlePhaseFlow/ECP_Wellbore_probdef.xml b/inputFiles/wellboreECP/singlePhaseFlow/ECP_Wellbore_probdef.xml new file mode 100644 index 00000000000..73411abc18e --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/ECP_Wellbore_probdef.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level01/ECP_Wellbore_cpu.xml b/inputFiles/wellboreECP/singlePhaseFlow/level01/ECP_Wellbore_cpu.xml new file mode 100644 index 00000000000..56163cee621 --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level01/ECP_Wellbore_cpu.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level01/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/singlePhaseFlow/level01/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..81a0b3b84b6 --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level01/ECP_Wellbore_gpu.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level01/launch_frontier b/inputFiles/wellboreECP/singlePhaseFlow/level01/launch_frontier new file mode 100644 index 00000000000..d31e8dd39c3 --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level01/launch_frontier @@ -0,0 +1,13 @@ +#!/bin/bash +#SBATCH -N 1 +#SBATCH -n 1 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-singlePhaseFlow-geom01.out + +echo `date` +cmd="srun -N 1 -n 1 -c 1 --gpus-per-node=1 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 1 -y 1 -z 1 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level02/ECP_Wellbore_cpu.xml b/inputFiles/wellboreECP/singlePhaseFlow/level02/ECP_Wellbore_cpu.xml new file mode 100644 index 00000000000..dffc9e5be37 --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level02/ECP_Wellbore_cpu.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level02/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/singlePhaseFlow/level02/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..e784ec8cf0a --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level02/ECP_Wellbore_gpu.xml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level02/launch_frontier b/inputFiles/wellboreECP/singlePhaseFlow/level02/launch_frontier new file mode 100644 index 00000000000..2741050a32c --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level02/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 1 +#SBATCH -n 4 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-singlePhaseFlow-geom02.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 1 -n 4 -c 1 --gpus-per-node=4 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 1 -y 1 -z 4 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level03/ECP_Wellbore_cpu.xml b/inputFiles/wellboreECP/singlePhaseFlow/level03/ECP_Wellbore_cpu.xml new file mode 100644 index 00000000000..0f58cf96b36 --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level03/ECP_Wellbore_cpu.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level03/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/singlePhaseFlow/level03/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..33bc77be4fc --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level03/ECP_Wellbore_gpu.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level03/launch_frontier b/inputFiles/wellboreECP/singlePhaseFlow/level03/launch_frontier new file mode 100644 index 00000000000..b549f4c4ff5 --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level03/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 4 +#SBATCH -n 32 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-singlePhaseFlow-geom03.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 4 -n 32 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 2 -y 2 -z 8 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level04/ECP_Wellbore_cpu.xml b/inputFiles/wellboreECP/singlePhaseFlow/level04/ECP_Wellbore_cpu.xml new file mode 100644 index 00000000000..caf966a8b6e --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level04/ECP_Wellbore_cpu.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level04/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/singlePhaseFlow/level04/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..69294a7faca --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level04/ECP_Wellbore_gpu.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level04/launch_frontier b/inputFiles/wellboreECP/singlePhaseFlow/level04/launch_frontier new file mode 100644 index 00000000000..80748a5e6d7 --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level04/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 32 +#SBATCH -n 256 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-singlePhaseFlow-geom04.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 32 -n 256 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 4 -y 4 -z 16 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level05/ECP_Wellbore_cpu.xml b/inputFiles/wellboreECP/singlePhaseFlow/level05/ECP_Wellbore_cpu.xml new file mode 100644 index 00000000000..2b784e869dd --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level05/ECP_Wellbore_cpu.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level05/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/singlePhaseFlow/level05/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..4bfc1ff0df2 --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level05/ECP_Wellbore_gpu.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level05/launch_frontier b/inputFiles/wellboreECP/singlePhaseFlow/level05/launch_frontier new file mode 100644 index 00000000000..88572e1e96d --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level05/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 256 +#SBATCH -n 2048 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-singlePhaseFlow-geom05.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 256 -n 2048 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 8 -y 8 -z 32 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level06/ECP_Wellbore_gpu.xml b/inputFiles/wellboreECP/singlePhaseFlow/level06/ECP_Wellbore_gpu.xml new file mode 100644 index 00000000000..2cfaca7d3d5 --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level06/ECP_Wellbore_gpu.xml @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wellboreECP/singlePhaseFlow/level06/launch_frontier b/inputFiles/wellboreECP/singlePhaseFlow/level06/launch_frontier new file mode 100644 index 00000000000..3791ac44860 --- /dev/null +++ b/inputFiles/wellboreECP/singlePhaseFlow/level06/launch_frontier @@ -0,0 +1,18 @@ +#!/bin/bash +#SBATCH -N 2048 +#SBATCH -n 16384 +#SBATCH -t 0:30:00 +#SBATCH -J geos +#SBATCH -o frontier-%j-singlePhaseFlow-geom06.out + +echo `date` +module load cpe/23.12 +module load craype-accel-amd-gfx90a +module load rocm/5.4.3 +export MPICH_GPU_SUPPORT_ENABLED=1 +ldd ${1} +cmd="srun -N 2048 -n 16384 -c 1 --gpus-per-node=8 --ntasks-per-gpu=1 --gpu-bind=closest ${1} -i ECP_Wellbore_gpu.xml -x 16 -y 16 -z 64 ${2}" +echo "${cmd}" +${cmd} +echo `date` +echo 'Done' diff --git a/src/conf.py b/src/conf.py index bcc5a918a58..fe9c2002d28 100644 --- a/src/conf.py +++ b/src/conf.py @@ -49,17 +49,24 @@ config_src = os.path.join(docs_path, "GeosxConfig.hpp") config_dst = os.path.join(common_path, "GeosxConfig.hpp") - input_dirs = ["coreComponents/common", - "coreComponents/dataRepository", - "coreComponents/fileIO", - "coreComponents/linearAlgebra", - "coreComponents/mesh", - "coreComponents/managers", - "coreComponents/finiteElement/kernelInterface", - "coreComponents/mesh/MeshFields.hpp", - "coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp", - "coreComponents/physicsSolvers/solidMechanics", - "coreComponents/finiteVolume"] + input_dirs = [ + "coreComponents/common", + "coreComponents/dataRepository", + "coreComponents/fileIO", + "coreComponents/linearAlgebra", + "coreComponents/mesh", + "coreComponents/finiteElement/elementFormulations", + "coreComponents/finiteElement/kernelInterface", + "coreComponents/mesh/MeshFields.hpp", + "coreComponents/physicsSolvers", + "coreComponents/finiteVolume", + "coreComponents/functions", + "coreComponents/fieldSpecification", + "coreComponents/discretizationMethods", + "coreComponents/events", + "coreComponents/mainInterface" + ] + # Write correct ReadtheDocs path and input directories shutil.copy(doxyfile_src, doxyfile_dst) diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index b9ece0eba53..1a8cb2358cc 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -143,7 +143,7 @@ class Group using CatalogInterface = dataRepository::CatalogInterface< Group, string const &, Group * const >; /** - * @brief Get the singleton catalog for this class. + * @brief Get the singleton catalog for this Group. * @return reference to the catalog object */ static CatalogInterface::CatalogType & getCatalog(); diff --git a/src/coreComponents/dataRepository/docs/Group.rst b/src/coreComponents/dataRepository/docs/Group.rst index 39547980be3..370ac8937b9 100644 --- a/src/coreComponents/dataRepository/docs/Group.rst +++ b/src/coreComponents/dataRepository/docs/Group.rst @@ -119,3 +119,9 @@ Looping Interface :language: c++ :start-after: //START_SPHINX_INCLUDE_LOOP_INTERFACE :end-before: //END_SPHINX_INCLUDE_LOOP_INTERFACE + + +Doxygen API documentation +------------------------- + +`Group API <../../../doxygen_output/html/classgeos_1_1data_repository_1_1_group.html>`_ diff --git a/src/coreComponents/dataRepository/docs/MappedVector.rst b/src/coreComponents/dataRepository/docs/MappedVector.rst index 260c448d376..22cb211d39b 100644 --- a/src/coreComponents/dataRepository/docs/MappedVector.rst +++ b/src/coreComponents/dataRepository/docs/MappedVector.rst @@ -41,7 +41,7 @@ Element access In addition to these, an STL-conformant iterator interface is available via ``begin()`` and ``end()`` methods. The type iterated over is a key-pointer pair (provided as `value_type` alias). -API documentation ------------------ +Doxygen API documentation +------------------------- -`MappedVector <../../../doxygen_output/html/classgeos_1_1_mapped_vector.html>`_ +`MappedVector API <../../../doxygen_output/html/classgeos_1_1_mapped_vector.html>`_ diff --git a/src/coreComponents/dataRepository/docs/Wrapper.rst b/src/coreComponents/dataRepository/docs/Wrapper.rst index 27f4b8815d9..e7f44040f38 100644 --- a/src/coreComponents/dataRepository/docs/Wrapper.rst +++ b/src/coreComponents/dataRepository/docs/Wrapper.rst @@ -124,7 +124,7 @@ The type ``DefaultValue`` is used to store the default value for the wrapper. ``DefaultValue`` is actually not a type but an alias for another internal struct. As such, it cannot currently be specialized for a user's custom type. -API documentation ------------------ +Doxygen API documentation +------------------------- -`Wrapper <../../../doxygen_output/html/classgeos_1_1data_repository_1_1_wrapper.html>`_ +`Wrapper API <../../../doxygen_output/html/classgeos_1_1data_repository_1_1_wrapper.html>`_ diff --git a/src/coreComponents/dataRepository/docs/dataRepository.rst b/src/coreComponents/dataRepository/docs/dataRepository.rst index 16b82289bba..221cb8823cf 100644 --- a/src/coreComponents/dataRepository/docs/dataRepository.rst +++ b/src/coreComponents/dataRepository/docs/dataRepository.rst @@ -6,14 +6,16 @@ Data Repository The GEOS "Data Repository" is intended to provide the building blocks for the code structure within GEOS. The "Data Repository" provides a general capability to store arbitrary data and objects in a hierarchical -structure, similar to a standard file system. +structure, similar to a standard file system. The "Wrapper" object is a generic container for any object, +and provides a standard interface for accessing an object and performing standard operations. +The "Group" object is a container for "Wrapper" and other "Group" objects. -The components/classes of the data structure that a developer will require some knowledge of are: +The components/classes of the data structure that a developer should have some knowledge of are: .. toctree:: :maxdepth: 2 - /coreComponents/dataRepository/docs/MappedVector /coreComponents/dataRepository/docs/Group /coreComponents/dataRepository/docs/Wrapper /coreComponents/dataRepository/docs/ObjectCatalog + /coreComponents/dataRepository/docs/MappedVector diff --git a/src/coreComponents/mesh/docs/meshDeveloperGuide.rst b/src/coreComponents/mesh/docs/meshDeveloperGuide.rst index c0ba2ca9598..8800dd7d139 100644 --- a/src/coreComponents/mesh/docs/meshDeveloperGuide.rst +++ b/src/coreComponents/mesh/docs/meshDeveloperGuide.rst @@ -135,3 +135,13 @@ tetrahedra, one for all hexahedra, one for all wedges and one for all the pyrami Now that all the classes of the mesh hierarchy has been described, we propose to adapt the diagram presented in :numref:`diagMeshDevFig` to match with the example presented in :numref:`modelMeshDevFig`. + +Direct links to some useful class documentation: + +`ObjectManagerBase API <../../../doxygen_output/html/classgeos_1_1_object_manager_base.html>`_ + +`MeshLevel API <../../../doxygen_output/html/classgeos_1_1_mesh_level.html>`_ + +`NodeManager API <../../../doxygen_output/html/classgeos_1_1_node_manager.html>`_ + +`FaceManager API <../../../doxygen_output/html/classgeos_1_1_face_manager.html>`_ diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index a235d1230bf..2ebb1671baf 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -703,31 +703,7 @@ bool SolverBase::lineSearchWithParabolicInterpolation( real64 const & time_n, return lineSearchSuccess; } -/** - * @brief Eisenstat-Walker adaptive tolerance - * - * This method enables an inexact-Newton method is which the linear solver - * tolerance is chosen based on the nonlinear solver convergence behavior. - * In early Newton iterations, the search direction is usually imprecise, and - * therefore a weak linear convergence tolerance can be chosen to minimize - * computational cost. As the search gets closer to the true solution, however, - * more stringent linear tolerances are necessary to maintain quadratic convergence - * behavior. - * - * The user can set the weakest tolerance allowed, with a default of 1e-3. - * Even weaker values (e.g. 1e-2,1e-1) can be used for further speedup, but may - * occasionally cause convergence problems. Use this parameter with caution. The - * most stringent tolerance is hardcoded to 1e-8, which is sufficient for - * most problems. - * - * See Eisenstat, S.C. and Walker, H.F., 1996. Choosing the forcing terms in an - * inexact Newton method. SIAM Journal on Scientific Computing, 17(1), pp.16-32. - * - * @param newNewtonNorm Residual norm at current iteration - * @param oldNewtonNorm Residual norm at previous iteration - * @param weakestTol Weakest tolerance allowed (default 1e-3). - * @return Adaptive tolerance recommendation - */ + real64 SolverBase::eisenstatWalker( real64 const newNewtonNorm, real64 const oldNewtonNorm, real64 const weakestTol ) diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index 5b88227ed2a..702fa445b03 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -13,6 +13,10 @@ * ------------------------------------------------------------------------------------------------------------ */ +/** + * @file SolverBase.hpp + */ + #ifndef GEOS_PHYSICSSOLVERS_SOLVERBASE_HPP_ #define GEOS_PHYSICSSOLVERS_SOLVERBASE_HPP_ @@ -34,20 +38,54 @@ namespace geos class DomainPartition; +/** + * @class SolverBase + * @brief Base class for all physics solvers + * + * This class provides the base interface for all physics solvers. It provides the basic + * functionality for setting up and solving a linear system, as well as the interface for + * performing a timestep. + */ class SolverBase : public ExecutableGroup { public: + /** + * @brief Constructor for SolverBase + * @param name the name of this instantiation of SolverBase + * @param parent the parent group of this instantiation of SolverBase + */ explicit SolverBase( string const & name, Group * const parent ); + /** + * @brief Move constructor for SolverBase + */ SolverBase( SolverBase && ) = default; + /** + * @brief Destructor for SolverBase + */ virtual ~SolverBase() override; + /** + * @brief Deleted constructor + */ SolverBase() = delete; + + /** + * @brief Deleted copy constructor + */ SolverBase( SolverBase const & ) = delete; + + /** + * @brief Deleted copy assignment operator + */ SolverBase & operator=( SolverBase const & ) = delete; + + /** + * @brief Deleted move assignment operator + */ SolverBase & operator=( SolverBase && ) = delete; /** @@ -56,12 +94,26 @@ class SolverBase : public ExecutableGroup virtual string getCatalogName() const = 0; + /** + * @brief Register wrappers that contain data on the mesh objects + * @param MeshBodies the group of mesh bodies + */ virtual void registerDataOnMesh( Group & MeshBodies ) override; + /** + * @brief Initialization tasks after mesh generation is completed. + */ virtual void initialize_postMeshGeneration() override; + /** + * @brief Generate mesh targets from target regions + * @param meshBodies the group of mesh bodies + */ void generateMeshTargetsFromTargetRegions( Group const & meshBodies ); + /** + * @copydoc ExecutableGroup::cleanup + */ virtual void cleanup( real64 const time_n, integer const cycleNumber, integer const eventCounter, @@ -69,7 +121,7 @@ class SolverBase : public ExecutableGroup DomainPartition & domain ) override; /** - * This method is called when its host event is triggered + * @copydoc ExecutableGroup::execute */ virtual bool execute( real64 const time_n, real64 const dt, @@ -83,6 +135,11 @@ class SolverBase : public ExecutableGroup * @return a reference to linear system matrix of this solver */ ParallelMatrix & getSystemMatrix() { return m_matrix; } + + /** + * @brief Getter for system rhs vector + * @return a reference to linear system right-hand side of this solver + */ ParallelMatrix const & getSystemMatrix() const { return m_matrix; } /** @@ -90,6 +147,11 @@ class SolverBase : public ExecutableGroup * @return a reference to linear system right-hand side of this solver */ ParallelVector & getSystemRhs() { return m_rhs; } + + /** + * @brief Getter for system rhs vector + * @return a reference to linear system right-hand side of this solver + */ ParallelVector const & getSystemRhs() const { return m_rhs; } /** @@ -97,6 +159,11 @@ class SolverBase : public ExecutableGroup * @return a reference to solution vector of this solver */ ParallelVector & getSystemSolution() { return m_solution; } + + /** + * @brief Getter for system solution vector + * @return a reference to solution vector of this solver + */ ParallelVector const & getSystemSolution() const { return m_solution; } /** @@ -104,6 +171,11 @@ class SolverBase : public ExecutableGroup * @return a reference to degree-of-freedom manager of this solver */ DofManager & getDofManager() { return m_dofManager; } + + /** + * @brief Getter for degree-of-freedom manager + * @return a reference to degree-of-freedom manager of this solver + */ DofManager const & getDofManager() const { return m_dofManager; } /** @@ -111,6 +183,11 @@ class SolverBase : public ExecutableGroup * @return a reference to linear system matrix of this solver */ CRSMatrix< real64, globalIndex > & getLocalMatrix() { return m_localMatrix; } + + /** + * @brief Getter for local matrix + * @return a reference to linear system matrix of this solver + */ CRSMatrixView< real64 const, globalIndex const > getLocalMatrix() const { return m_localMatrix.toViewConst(); } /** @@ -213,6 +290,7 @@ class SolverBase : public ExecutableGroup * @param localMatrix the system matrix * @param rhs the system right-hand side vector * @param solution the solution vector + * @param scaleFactor the scaling factor to apply to the solution * @param lastResidual (in) target value below which to reduce residual norm, (out) achieved residual norm * @return return true if line search succeeded, false otherwise * @@ -236,14 +314,16 @@ class SolverBase : public ExecutableGroup /** * @brief Function to perform line search using a parabolic interpolation to find the scaling factor. * @param time_n time at the beginning of the step - * @param dt the perscribed timestep + * @param dt the prescribed timestep * @param cycleNumber the current cycle number * @param domain the domain object * @param dofManager degree-of-freedom manager associated with the linear system * @param localMatrix the system matrix * @param rhs the system right-hand side vector * @param solution the solution vector + * @param scaleFactor the scaling factor to apply to the solution * @param lastResidual (in) target value below which to reduce residual norm, (out) achieved residual norm + * @param residualNormT the residual norm at the end of the line search * @return return true if line search succeeded, false otherwise * */ @@ -298,6 +378,7 @@ class SolverBase : public ExecutableGroup /** * @brief Populate degree-of-freedom manager with fields relevant to this solver + * @param domain the domain containing the mesh and fields * @param dofManager degree-of-freedom manager associated with the linear system */ virtual void @@ -311,6 +392,7 @@ class SolverBase : public ExecutableGroup * @param localMatrix the system matrix * @param rhs the system right-hand side vector * @param solution the solution vector + * @param setSparsity flag to indicate if the sparsity pattern should be set * * @note While the function is virtual, the base class implementation should be * sufficient for most single-physics solvers. @@ -330,8 +412,7 @@ class SolverBase : public ExecutableGroup * @param domain the domain partition * @param dofManager degree-of-freedom manager associated with the linear system * @param localMatrix the system matrix - * @param rhs the system right-hand side vector - * @return the residual for convergence evaluation + * @param localRhs the system right-hand side vector * * This function assembles the residual and the jacobian of the residual wrt the primary * variables. In a stand alone physics solver, this function will fill a single block in the @@ -357,7 +438,7 @@ class SolverBase : public ExecutableGroup * @param domain the domain partition * @param dofManager degree-of-freedom manager associated with the linear system * @param localMatrix the system matrix - * @param rhs the system right-hand side vector + * @param localRhs the system right-hand side vector * * This function applies all boundary conditions to the linear system. This is essentially a * completion of the system assembly, but is separated for use in coupled solvers. @@ -438,12 +519,10 @@ class SolverBase : public ExecutableGroup /** * @brief Function to check system solution for physical consistency and constraint violation - * @param matrix the system matrix - * @param rhs the system right-hand side vector - * @param solution the solution vector + * @param domain the domain partition * @param dofManager degree-of-freedom manager associated with the linear system + * @param localSolution the solution vector * @param scalingFactor factor to scale the solution prior to application - * @param objectManager the object manager that holds the fields we wish to apply the solution to * @return true if solution can be safely applied without violating physical constraints, false otherwise * * @note This function must be overridden in the derived physics solver in order to use an implict @@ -460,7 +539,7 @@ class SolverBase : public ExecutableGroup * @brief Function to determine if the solution vector should be scaled back in order to maintain a known constraint. * @param[in] domain The domain partition. * @param[in] dofManager degree-of-freedom manager associated with the linear system - * @param[in] solution the solution vector + * @param[in] localSolution the solution vector * @return The factor that should be used to scale the solution vector values when they are being applied. */ virtual real64 @@ -470,12 +549,11 @@ class SolverBase : public ExecutableGroup /** * @brief Function to apply the solution vector to the state - * @param matrix the system matrix - * @param rhs the system right-hand side vector - * @param solution the solution vector * @param dofManager degree-of-freedom manager associated with the linear system + * @param localSolution the solution vector * @param scalingFactor factor to scale the solution prior to application - * @param objectManager the object manager that holds the fields we wish to apply the solution to + * @param dt the timestep + * @param domain the domain partition * * This function performs 2 operations: * 1) extract the solution vector for the "blockSystem" parameter, and applies the @@ -517,8 +595,9 @@ class SolverBase : public ExecutableGroup virtual void resetConfigurationToBeginningOfStep( DomainPartition & domain ); /** - * @brief set the simplest configuration state. + * @brief resets the configuration to the default value. * @param domain the domain containing the mesh and fields + * @return a bool that states whether the configuration was reset or not. */ virtual bool resetConfigurationToDefault( DomainPartition & domain ) const; @@ -545,7 +624,7 @@ class SolverBase : public ExecutableGroup /** * @brief perform cleanup for implicit timestep - * @param time_n the time at the beginning of the step + * @param time the time at the beginning of the step * @param dt the desired timestep * @param domain the domain partition * @@ -562,36 +641,79 @@ class SolverBase : public ExecutableGroup DomainPartition & domain ); - /* - * Returns the requirement for the next time-step to the event executing the solver. + /** + * @brief getter for the next timestep size + * @return the next timestep size m_nextDt */ - virtual real64 getTimestepRequest( real64 const GEOS_UNUSED_PARAM( time ) ) override + virtual real64 getTimestepRequest( real64 const ) override {return m_nextDt;}; /**@}*/ + /** + * @brief getter for the next timestep size + * @return the next timestep size m_nextDt + */ real64 getTimestepRequest() {return m_nextDt;}; + /** + * @brief creates a child group of of this SolverBase instantiation + * @param childKey the key of the child type + * @param childName the name of the child + * @return a pointer to the child group + */ virtual Group * createChild( string const & childKey, string const & childName ) override; + /** + * @brief Type alias for catalog interface used by this class. See CatalogInterface. + */ using CatalogInterface = dataRepository::CatalogInterface< SolverBase, string const &, Group * const >; + + /** + * @brief Get the singleton catalog for SolverBase. + * @return reference to the catalog object + */ static CatalogInterface::CatalogType & getCatalog(); + /** + * @brief Structure to hold scoped key names + */ struct viewKeyStruct { + /// @return string for the cflFactor wrapper static constexpr char const * cflFactorString() { return "cflFactor"; } + + /// @return string for the initialDt wrapper static constexpr char const * initialDtString() { return "initialDt"; } + + /// @return string for the maxStableDt wrapper static constexpr char const * maxStableDtString() { return "maxStableDt"; } + + /// @return string for the discretization wrapper static constexpr char const * discretizationString() { return "discretization"; } + + /// @return string for the nextDt targetRegions wrapper static constexpr char const * targetRegionsString() { return "targetRegions"; } + + /// @return string for the meshTargets wrapper static constexpr char const * meshTargetsString() { return "meshTargets"; } + + /// @return string for the writeLinearSystem wrapper static constexpr char const * writeLinearSystemString() { return "writeLinearSystem"; } }; + /** + * @brief Structure to hold scoped key names + */ struct groupKeyStruct { + /// @return string for the linearSolverParameters wrapper static constexpr char const * linearSolverParametersString() { return "LinearSolverParameters"; } + + /// @return string for the nonlinearSolverParameters wrapper static constexpr char const * nonlinearSolverParametersString() { return "NonlinearSolverParameters"; } + + /// @return string for the solverStatistics wrapper static constexpr char const * solverStatisticsString() { return "SolverStatistics"; } }; @@ -624,8 +746,17 @@ class SolverBase : public ExecutableGroup */ R1Tensor const gravityVector() const; + /** + * @brief Check if the solution increments are ok to use + * @param domain the domain partition + * @return true if the solution increments are ok to use, false otherwise + */ virtual bool checkSequentialSolutionIncrements( DomainPartition & domain ) const; + /** + * @brief Save the state of the solver for sequential iteration + * @param domain the domain partition + */ virtual void saveSequentialIterationState( DomainPartition & domain ); /** @@ -664,6 +795,9 @@ class SolverBase : public ExecutableGroup return m_nonlinearSolverParameters; } + /** + * @brief syncronize the nonlinear solver parameters. + */ virtual void synchronizeNonlinearSolverParameters() { /* empty here, overriden in CoupledSolver */ } @@ -729,28 +863,77 @@ class SolverBase : public ExecutableGroup } } - + /** + * @brief return the name of the discretization object + * @return the name of the discretization object + */ string getDiscretizationName() const {return m_discretizationName;} + /** + * @brief function to set the value of m_assemblyCallback + * @param func the function to set m_assemblyCallback to + * @param funcType the type of the function + * @return true if the function was successfully set, false otherwise + * + * This is used to provide a callback function for to be called in the assembly step. + */ virtual bool registerCallback( void * func, const std::type_info & funcType ) final override; + /** + * @brief accessor for the solver statistics. + * @return reference to m_solverStatistics + */ SolverStatistics & getSolverStatistics() { return m_solverStatistics; } + + /** + * @brief const accessor for the solver statistics. + * @return reference to m_solverStatistics + */ SolverStatistics const & getSolverStatistics() const { return m_solverStatistics; } +#if defined(GEOS_USE_PYGEOSX) /** * @brief Return PySolver type. * @return Return PySolver type. */ -#if defined(GEOS_USE_PYGEOSX) virtual PyTypeObject * getPythonType() const override; #endif + /** + * @brief accessor for m_meshTargets + * @return reference to m_meshTargets + */ map< std::pair< string, string >, array1d< string > > const & getMeshTargets() const { return m_meshTargets; } protected: + /** + * @brief Eisenstat-Walker adaptive tolerance + * + * This method enables an inexact-Newton method is which the linear solver + * tolerance is chosen based on the nonlinear solver convergence behavior. + * In early Newton iterations, the search direction is usually imprecise, and + * therefore a weak linear convergence tolerance can be chosen to minimize + * computational cost. As the search gets closer to the true solution, however, + * more stringent linear tolerances are necessary to maintain quadratic convergence + * behavior. + * + * The user can set the weakest tolerance allowed, with a default of 1e-3. + * Even weaker values (e.g. 1e-2,1e-1) can be used for further speedup, but may + * occasionally cause convergence problems. Use this parameter with caution. The + * most stringent tolerance is hardcoded to 1e-8, which is sufficient for + * most problems. + * + * See Eisenstat, S.C. and Walker, H.F., 1996. Choosing the forcing terms in an + * inexact Newton method. SIAM Journal on Scientific Computing, 17(1), pp.16-32. + * + * @param newNewtonNorm Residual norm at current iteration + * @param oldNewtonNorm Residual norm at previous iteration + * @param weakestTol Weakest tolerance allowed (default 1e-3). + * @return Adaptive tolerance recommendation + */ static real64 eisenstatWalker( real64 const newNewtonNorm, real64 const oldNewtonNorm, real64 const weakestTol ); @@ -759,12 +942,19 @@ class SolverBase : public ExecutableGroup * @brief Get the Constitutive Name object * * @tparam CONSTITUTIVE_BASE_TYPE the base type of the constitutive model. - * @param subregion the element subregion on which the constitutive model is registered - * @return the name name of the constitutive model of type @p CONSTITUTIVE_BASE_TYPE registered on the @p subregion. + * @param subRegion the element subregion on which the constitutive model is registered + * @return the name name of the constitutive model of type CONSTITUTIVE_BASE_TYPE registered on the subregion. */ template< typename CONSTITUTIVE_BASE_TYPE > static string getConstitutiveName( ElementSubRegionBase const & subRegion ); + /** + * @brief Get the Constitutive Name object + * + * @tparam CONSTITUTIVE_BASE_TYPE the base type of the constitutive model. + * @param subRegion the particle subregion on which the constitutive model is registered + * @return the name name of the constitutive model of type CONSTITUTIVE_BASE_TYPE registered on the subregion. + */ template< typename CONSTITUTIVE_BASE_TYPE > static string getConstitutiveName( ParticleSubRegionBase const & subRegion ); // particle overload @@ -776,14 +966,46 @@ class SolverBase : public ExecutableGroup */ virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const { GEOS_UNUSED_VAR( subRegion ); } + + /** + * @brief Get the Constitutive Model object + * @tparam BASETYPE the base type of the constitutive model. + * @tparam LOOKUP_TYPE the type of the key used to look up the constitutive model. + * @param dataGroup the data group containing the constitutive models. + * @param key the key used to look up the constitutive model. + * @return the constitutive model of type @p BASETYPE registered on the @p dataGroup with the key @p key. + */ template< typename BASETYPE = constitutive::ConstitutiveBase, typename LOOKUP_TYPE > - static BASETYPE const & getConstitutiveModel( dataRepository::Group const & dataGroup, LOOKUP_TYPE const & key ); + static BASETYPE const & getConstitutiveModel( dataRepository::Group const & dataGroup, LOOKUP_TYPE const & key ) + { + dataRepository::Group const & constitutiveModels = dataGroup.getGroup( ElementSubRegionBase::groupKeyStruct::constitutiveModelsString() ); + return constitutiveModels.getGroup< BASETYPE >( key ); + } + /** + * @brief Get the Constitutive Model object + * @tparam BASETYPE the base type of the constitutive model. + * @tparam LOOKUP_TYPE the type of the key used to look up the constitutive model. + * @param dataGroup the data group containing the constitutive models. + * @param key the key used to look up the constitutive model. + * @return the constitutive model of type @p BASETYPE registered on the @p dataGroup with the key @p key. + */ template< typename BASETYPE = constitutive::ConstitutiveBase, typename LOOKUP_TYPE > - static BASETYPE & getConstitutiveModel( dataRepository::Group & dataGroup, LOOKUP_TYPE const & key ); + static BASETYPE & getConstitutiveModel( dataRepository::Group & dataGroup, LOOKUP_TYPE const & key ) + { + dataRepository::Group & constitutiveModels = dataGroup.getGroup( ElementSubRegionBase::groupKeyStruct::constitutiveModelsString() ); + return constitutiveModels.getGroup< BASETYPE >( key ); + } + + + /// Courant–Friedrichs–Lewy factor for the timestep real64 m_cflFactor; + + /// maximum stable time step real64 m_maxStableDt; + + /// timestep of the next cycle real64 m_nextDt; /// name of the FV discretization object in the data repository @@ -792,9 +1014,13 @@ class SolverBase : public ExecutableGroup /// Data structure to handle degrees of freedom DofManager m_dofManager; - /// System matrix, rhs and solution + /// System matrix ParallelMatrix m_matrix; + + /// System right-hand side vector ParallelVector m_rhs; + + /// System solution vector ParallelVector m_solution; /// Local system matrix and rhs @@ -821,8 +1047,10 @@ class SolverBase : public ExecutableGroup /// Timestamp of the last call to setup system Timestamp m_systemSetupTimestamp; + /// Callback function for assembly step std::function< void( CRSMatrix< real64, globalIndex >, array1d< real64 > ) > m_assemblyCallback; + /// Timers for the aggregate profiling of the solver std::map< std::string, std::chrono::system_clock::duration > m_timers; private: @@ -840,11 +1068,25 @@ class SolverBase : public ExecutableGroup */ virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const { GEOS_UNUSED_VAR( subRegion ); } + /** + * @brief Solve a nonlinear system using a Newton method + * @param time_n the time at the beginning of the step + * @param dt the desired timestep + * @param cycleNumber the current cycle number + * @param domain the domain partition + * @return true if the nonlinear system was solved, false otherwise + */ bool solveNonlinearSystem( real64 const & time_n, real64 const & dt, integer const cycleNumber, DomainPartition & domain ); + /** + * @brief output information about the cycle to the log + * @param cycleNumber the current cycle number + * @param numOfSubSteps the number of substeps taken + * @param subStepDt the time step size for each substep + */ void logEndOfCycleInformation( integer const cycleNumber, integer const numOfSubSteps, std::vector< real64 > const & subStepDt ) const; @@ -879,21 +1121,6 @@ string SolverBase::getConstitutiveName( ParticleSubRegionBase const & subRegion return validName; } -template< typename BASETYPE, typename LOOKUP_TYPE > -BASETYPE const & SolverBase::getConstitutiveModel( dataRepository::Group const & dataGroup, LOOKUP_TYPE const & key ) -{ - dataRepository::Group const & constitutiveModels = dataGroup.getGroup( ElementSubRegionBase::groupKeyStruct::constitutiveModelsString() ); - - return constitutiveModels.getGroup< BASETYPE >( key ); -} - -template< typename BASETYPE, typename LOOKUP_TYPE > -BASETYPE & SolverBase::getConstitutiveModel( dataRepository::Group & dataGroup, LOOKUP_TYPE const & key ) -{ - Group & constitutiveModels = dataGroup.getGroup( ElementSubRegionBase::groupKeyStruct::constitutiveModelsString() ); - - return constitutiveModels.getGroup< BASETYPE >( key ); -} } // namespace geos diff --git a/src/docs/doxygen/Doxyfile.in b/src/docs/doxygen/Doxyfile.in index f872f18f60c..7038c667890 100644 --- a/src/docs/doxygen/Doxyfile.in +++ b/src/docs/doxygen/Doxyfile.in @@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = "GEOSX" +PROJECT_NAME = "GEOS" # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version @@ -767,6 +767,7 @@ INPUT = @PROJECT_SOURCE_DIR@/coreComponents/common \ @PROJECT_SOURCE_DIR@/coreComponents/finiteElement/elementFormulations \ @PROJECT_SOURCE_DIR@/coreComponents/finiteElement/kernelInterface \ @PROJECT_SOURCE_DIR@/coreComponents/mesh/MeshFields.hpp \ + @PROJECT_SOURCE_DIR@/coreComponents/physicsSolvers/SolverBase.hpp \ @PROJECT_SOURCE_DIR@/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp \ @PROJECT_SOURCE_DIR@/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp \ @PROJECT_SOURCE_DIR@/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp \ diff --git a/src/docs/sphinx/Doxygen.rst b/src/docs/sphinx/Doxygen.rst index 6e541b988e0..217411e6083 100644 --- a/src/docs/sphinx/Doxygen.rst +++ b/src/docs/sphinx/Doxygen.rst @@ -2,11 +2,17 @@ Doxygen ############################################################################### -The c++ source in GEOS is annotated using doxygen. Our doxygen pages are -linked below. +The GEOS c++ API in is documented using doxygen. +The doxygen `class list pages <../../doxygen_output/html/classes.html>`_ -.. raw:: html +Developers may find it helpful to review the :ref:`KeyComponents` described in the Developer Guide before diving into the doxygen. - GEOS Doxygen Pages +Some key doxygen pages are linked below: -Developers may find it helpful to review the key code components described in the Developer Guide before diving into the doxygen. +`Group API <../../doxygen_output/html/classgeos_1_1data_repository_1_1_group.html>`_ + +`Wrapper API <../../doxygen_output/html/classgeos_1_1data_repository_1_1_wrapper.html>`_ + +`ObjectManagerBase API <../../doxygen_output/html/classgeos_1_1_object_manager_base.html>`_ + +`SolverBase API <../../doxygen_output/html/classgeos_1_1_solver_base.html>`_ \ No newline at end of file diff --git a/src/docs/sphinx/QuickStart.rst b/src/docs/sphinx/QuickStart.rst index 71b94c08e02..0ad5e2acab9 100644 --- a/src/docs/sphinx/QuickStart.rst +++ b/src/docs/sphinx/QuickStart.rst @@ -164,8 +164,6 @@ First, using a terminal, create the ``codes`` directory wherever you like. Inside this directory, we can clone the GEOS repository. We will also use some Git commands to initialize and download the submodules (e.g. ``LvArray``). -Note that most users will not have access to our integrated tests repository, and so we "deinit" (deactivate) this submodule. -Developers who will be working with the integratedTests repository should skip this line. .. code-block:: sh @@ -173,7 +171,6 @@ Developers who will be working with the integratedTests repository should skip t cd GEOS git lfs install git submodule init - git submodule deinit integratedTests git submodule update cd .. @@ -181,10 +178,10 @@ If all goes well, you should have a complete copy of the GEOS source at this poi The most common errors people encounter here have to do with Github not recognizing their authentication settings and/or repository permissions. See the previous section for tips on ensuring your SSH is working properly. -*Note*: The integratedTests submodule is not publicly available, with access limited to the core development team. -This may cause the ``git submodule update`` command to fail -if you forget the ``git submodule deinit integratedTests`` step above. -This submodule is not required for building GEOS. If you see an error message here, however, you may need to initialize and update the submodules manually: +*Note*: Previous versions of GEOS also imported the integratedTests submodule, which is not publicly available (access is limited to the core development team). +This may cause the ``git submodule update`` command to fail. +In that case, run ``git submodule deinit integratedTests`` before ``git submodule update``. +This submodule is not required for building GEOS. .. code-block:: sh @@ -218,11 +215,10 @@ If you are using an older version, you may need to add ``git lfs pull`` after `` The clone ``https://github.com/GEOS-DEV/GEOS.git`` becomes ``git clone git@github.com:GEOS-DEV/GEOS.git``. You may also be willing to insert your credentials in the command line (less secure) ``git clone https://${USER}:${TOKEN}@github.com/GEOS-DEV/GEOS.git``. -Configuration -================ +Configuration +============= -At a minimum, you will need a relatively recent compiler suite installed on your system (e.g. `GCC `_, `Clang `_) as well as `CMake `_. -If you want to run jobs using MPI-based parallelism, you will also need an MPI implementation (e.g. `OpenMPI `_, `MVAPICH `_). +Before proceeding, make sure to have installed all the minimal prerequisites as described in :ref:`Prerequisites` Note that GEOS supports a variety of parallel computing models, depending on the hardware and software environment. Advanced users are referred to the :ref:`BuildGuide` for a discussion of the available configuration options. @@ -237,120 +233,107 @@ If something goes wrong, the first thing the support team will ask you for is th Here, you may need to replace ``cpp`` with the full path to the C++ compiler you would like to use, depending on how your path and any aliases are configured. -GEOS compilations are driven by a cmake ``host-config`` file, which tells the build system about the compilers you are using, where various packages reside, and what options you want to enable. -We have created a number of default hostconfig files for common systems. -You should browse them to see if any are close to your needs: +Defining a Host-Config File +--------------------------- -.. code-block:: sh +GEOS compilations are driven by a CMake ``host-config`` file, which informs the build system about the compilers you are using, where various packages reside, and what options you want to enable. - cd GEOS/host-configs +A template for creating a simple ``host-config`` is provided in ``host-configs/quick-start-template.cmake``. -We maintain host configs (ending in ``.cmake``) for HPC systems at various institutions, as well as ones for common personal systems. -If you cannot find one that matches your needs, we suggest beginning with one of the shorter ones and modifying as needed. -A typical one may look like: +.. literalinclude:: ../../../host-configs/quick-start-template.cmake + :language: sh -.. code-block:: sh +The various ``set()`` commands are used to set variables that control the build. To begin, make a copy of the template file and modify the paths according to the installation locations on your system. - # file: your-platform.cmake - - # detect host and name the configuration file - site_name(HOST_NAME) - set(CONFIG_NAME "your-platform" CACHE PATH "") - message("CONFIG_NAME = ${CONFIG_NAME}") - - # set paths to C, C++, and Fortran compilers. Note that while GEOS does not contain any Fortran code, - # some of the third-party libraries do contain Fortran code. Thus a Fortran compiler must be specified. - set(CMAKE_C_COMPILER "/usr/bin/clang" CACHE PATH "") - set(CMAKE_CXX_COMPILER "/usr/bin/clang++" CACHE PATH "") - set(CMAKE_Fortran_COMPILER "/usr/local/bin/gfortran" CACHE PATH "") - set(ENABLE_FORTRAN OFF CACHE BOOL "" FORCE) - - # enable MPI and set paths to compilers and executable. - # Note that the MPI compilers are wrappers around standard serial compilers. - # Therefore, the MPI compilers must wrap the appropriate serial compilers specified - # in CMAKE_C_COMPILER, CMAKE_CXX_COMPILER, and CMAKE_Fortran_COMPILER. - set(ENABLE_MPI ON CACHE BOOL "") - set(MPI_C_COMPILER "/usr/local/bin/mpicc" CACHE PATH "") - set(MPI_CXX_COMPILER "/usr/local/bin/mpicxx" CACHE PATH "") - set(MPI_Fortran_COMPILER "/usr/local/bin/mpifort" CACHE PATH "") - set(MPIEXEC "/usr/local/bin/mpirun" CACHE PATH "") - - # disable CUDA and OpenMP - set(ENABLE_CUDA OFF CACHE BOOL "" FORCE) - set(ENABLE_OPENMP OFF CACHE BOOL "" FORCE) - - # enable PVTPackage - set(ENABLE_PVTPackage ON CACHE BOOL "" FORCE) - - # enable tests - set(ENABLE_GTEST_DEATH_TESTS ON CACHE BOOL "" FORCE ) - - # define the path to your compiled installation directory - set(GEOS_TPL_DIR "/path/to/your/TPL/installation/dir" CACHE PATH "") - # let GEOS define some third party libraries information for you - include(${CMAKE_CURRENT_LIST_DIR}/tpls.cmake) - -The various ``set()`` commands are used to set environment variables that control the build. -You will see in the above example that we set the C++ compiler to ``/user/bin/clang++`` and so forth. -We also disable CUDA and OpenMP, but enable PVTPackage. -The final line is related to our unit test suite. See the :ref:`BuildGuide` for more details on available options. +We have created a number of default host-config files for common systems. You should browse them to see if any are close to your needs: +We maintain host configuration files (ending in ``.cmake``) for HPC systems at various institutions, as well as for common personal systems. +If you cannot find one that matches your needs, we suggest starting with one of the shorter ones and modifying it as needed. .. note:: If you develop a new ``host-config`` for a particular platform that may be useful for other users, please consider sharing it with the developer team. Compilation -================== +=========== + +The configuration process for both the third-party libraries (TPLs) and GEOS is managed through a Python script called ``config-build.py``. This script simplifies and automates the setup by configuring the build and install directories and by running CMake based on the options set in the host-config file +which is passed as a command-lne argument. The ``config-build.py`` script has several command-line options. Here, we will only use some basic options and rely on default values for many others. During this build process there wil be automatically generated build and install directories for both the TPLs and the main code, +with names consistent with the name specified in the host-config by the variable ``CONFIG_NAME``, i.e. ``build-your-platform-release`` and ``install-your-platform-release``. + +All options can be visualized by running + +.. code-block:: sh + + cd thirdPartyLibs + python scripts/config-build.py -h + +.. note:: + + It is strongly recommended that GEOS and TPLs be configured using the same host configuration file. Below, we assume that you keep this file in, for example, ``GEOS/host-configs/your-platform.cmake``, but the exact location is up to you. -We will begin by compiling the TPLs, followed by the main code. -If you work on an HPC system with other GEOS developers, check with them to see if the TPLs have already been compiled in a shared directory. -If this is the case, you can skip ahead to just compiling the main code. -If you are working on your own machine, you will need to compile both. +Compiling the TPLs +------------------- -We strongly suggest that GEOS and TPLs be built with the same hostconfig file. -Below, we assume that you keep it in, say, ``GEOS/host-configs/your-platform.cmake``, but this is up to you. +.. note:: -We begin with the third-party libraries, and use a python ``config-build.py`` script to configure and build all of the TPLs. -Note that we will request a Release build type, which will enable various optimizations. -The other option is a Debug build, which allows for debugging but will be much slower in production mode. -The TPLS will then be built in a build directory named consistently with your hostconfig file. + If you are working on an HPC system with other GEOS developers, check with them to see if the TPLs have already been compiled in a shared directory. If this is the case, you can skip ahead to just compiling the main code. + If you are working on your own machine, you will need to configure and compile both the TPLs and the main code. + +We begin by configuring the third-party libraries (TPLs) using the ``config-build.py`` script. This script sets up the build directory and runs CMake to generate the necessary build files. .. code-block:: sh cd thirdPartyLibs python scripts/config-build.py -hc ../GEOS/host-configs/your-platform.cmake -bt Release + +The TPLs will be configured in a build directory named consistently with your host configuration file, i.e., ``build-your-platform-release``. + +.. code-block:: sh + cd build-your-platform-release make -Note that building all of the TPLs can take quite a while, so you may want to go get a cup of coffee at this point. -Also note that you should *not* use a parallel ``make -j N`` command to try and speed up the build time. +.. note:: + + Building all of the TPLs can take quite a while, so you may want to go get a cup of coffee at this point. + Also note that you should *not* use a parallel ``make -j N`` command to try and speed up the build time. + +Compiling GEOS +------------------- + +Once the TPLs have been compiler, the next step is to compile the main code. The ``config-build.py`` script is used to configure the build directory. Before running the configuration script, ensure that the path to the TPLs is correctly set in the host configuration file by setting + +.. code-block:: sh + set(GEOS_TPL_DIR "/path/to/your/TPL/installation/dir" CACHE PATH "") -The next step is to compile the main code. -Again, the ``config-build.py`` sets up cmake for you, so the process is very similar. +If you have followed these instructions, the TPLs are installed at the default location, i.e. ``/path/to/your/TPL/thirdPartyLibs/install-your-platform-release``. .. code-block:: sh cd ../../GEOS python scripts/config-build.py -hc host-configs/your-platform.cmake -bt Release - cd build-your-platform-release - make -j4 - make install -The host-config file is the place to set all relevant configuration options. -Note that the path to the previously installed third party libraries is typically specified within this file. An alternative is to set the path ``GEOS_TPL_DIR`` via a cmake command line option, e.g. - .. code-block:: sh python scripts/config-build.py -hc host-configs/your-platform.cmake -bt Release -D GEOS_TPL_DIR=/full/path/to/thirdPartyLibs -We highly recommend using full paths, rather than relative paths, whenever possible. +.. note:: + + We highly recommend using full paths, rather than relative paths, whenever possible. + +Once the configuration process is completed, we proceed with the compilation of the main code and the instalation of geos. + +.. code-block:: sh + + cd build-your-platform-release + make -j4 + make install + The parallel ``make -j 4`` will use four processes for compilation, which can substantially speed up the build if you have a multi-processor machine. You can adjust this value to match the number of processors available on your machine. The ``make install`` command then installs GEOS to a default location unless otherwise specified. - - -If all goes well, a ``geosx`` executable should now be available: +If all goes well, a ``geosx`` executable should now be available .. code-block:: sh diff --git a/src/docs/sphinx/advancedExamples/performanceBenchmarks/Index.rst b/src/docs/sphinx/advancedExamples/performanceBenchmarks/Index.rst index ed9671bbc64..bbca61572c6 100644 --- a/src/docs/sphinx/advancedExamples/performanceBenchmarks/Index.rst +++ b/src/docs/sphinx/advancedExamples/performanceBenchmarks/Index.rst @@ -4,4 +4,155 @@ Performance Benchmarks ######################## +==================================== +Wellbore problem scaling on Frontier +==================================== +.. _wellboreProblemScaling: +The wellbore problem described here was used to test the weak scaling of GEOS on the +`Frontier supercomputer ` at Oak Ridge National +Laboratory. The hardware details of the Frontier system are described in the `Frontier +User Guide `_. + +The wellbore problem consists of a single wellbore with an internal radius of 0.057m, a +casing thickness of 0.006m, with varying length and number elements depending level in the +scaling study. There are 6 levels of scaling summarized in the table below. The number of +ranks used for each level is dependent on the physics solver applied, as the number of +degrees of freedom in the problem changes. + ++-------+------+------+-------+----------------+ +| Level | nr | nt | nz | nelem | ++=======+======+======+=======+================+ +| 1 | 33 | 64 | 391 | 825,792 | ++-------+------+------+-------+----------------+ +| 2 | 33 | 64 | 3125 | 6,600,000 | ++-------+------+------+-------+----------------+ +| 3 | 66 | 128 | 6250 | 52,800,000 | ++-------+------+------+-------+----------------+ +| 4 | 132 | 256 | 12500 | 422,400,000 | ++-------+------+------+-------+----------------+ +| 5 | 264 | 512 | 25000 | 3,379,200,000 | ++-------+------+------+-------+----------------+ +| 6 | 528 | 1024 | 50000 | 27,033,600,000 | ++-------+------+------+-------+----------------+ + +An image of the wellbore geometry is give below: + +.. .. figure:: /coreComponents/physics/docs/Wellbore.png +.. :align: center +.. :width: 500 +.. :figclass: align-center + + +The scaling results for the wellbore problem applied to different physics models on the +Frontier supercomputer are shown below: + +Mechanics +--------- + +.. figure:: weakscal_frontier_mechanics.png + :align: center + :width: 500 + :figclass: align-center + + Weak scaling results for the mechanics model on Frontier. + +Single Phase Flow +----------------- + +.. figure:: weakscal_frontier_singlePhaseFlow.png + :align: center + :width: 500 + :figclass: align-center + + Weak scaling results for the single phase flow model on Frontier. + +Compositional Multiphase Flow +----------------------------- + +.. figure:: weakscal_frontier_compositionalMultiphaseFlow.png + :align: center + :width: 500 + :figclass: align-center + + Weak scaling results for the compositional multiphase flow model on Frontier. + +.. _wellboreRunning: +Running the Performance Study +----------------------------- + +To execute a performance study across different GPU configurations and problem levels for +the wellbore problem on the Frontier supercomputer, follow these steps: + +Prerequisites +~~~~~~~~~~~~~ +Ensure you have access to the Frontier system and that you have access to a valid job +allocation account. For detailed instructions on system access and environment setup, +refer to the `Frontier User Guide +`_. + +Directory Structure +~~~~~~~~~~~~~~~~~~~ +The input files for different problem levels and configurations are organized under +``${GEOS_DIR}/inputFiles/wellboreECP/``. Each physical problem (e.g., +``mechanics``, ``compositionalMultiphaseFlow``, ``singlePhaseFlow``) has its own directory +containing multiple levels of problem refinement as described in the table above. + +Dispatching Jobs +~~~~~~~~~~~~~~~~ +Use the ``dispatch.py`` script to automate the setup and submission of jobs for different +levels of problem refinement and physics models. + +**Usage:** + +.. code-block:: bash + + python3 dispatch.py --acount [account_id] --binary [path_to_binary] --model [model_type] --levels + [specific_levels_to_run] --caliper [def] + +- **--account**: Account name for running jobs on compute nodes. +- **--binary**: Path to the geos executable. +- **--model**: Physics model type, such as ``mechanics``, ``singlePhaseFlow`` or ``compositionalMultiphaseFlow``. +- **--levels**: (optional) Specific levels to run, e.g., ``1 3 5``. If omitted, all levels + are run. +- **--caliper**: (optional) Turn on profiling with `caliper `_. + +**Example:** + +.. code-block:: bash + + python3 dispatch.py --binary /path/to/geos --model mechanics --levels 1 2 3 + +This command launches jobs for levels 1, 2, and 3 under the mechanics problem configuration. + +Analyzing Output +~~~~~~~~~~~~~~~~ +After job completion, utilize the ``postprocess.py`` script to extract and plot performance metrics from the output files. + +**Usage:** + +.. code-block:: bash + + python3 postprocess.py --model [model_type] --levels [specific_levels_to_plot] + +- **--model**: Physics model type, such as ``mechanics``, ``singlePhaseFlow`` or ``compositionalMultiphaseFlow``. +- **--levels**: (optional) Specific levels to plot, e.g., ``2 3 4 5``. If omitted, results + for all available levels are plotted. + +**Example:** + +.. code-block:: bash + + python3 postprocess.py --model mechanics --levels 2 3 4 5 + +This command parses the latest output files in the mechanics directory, selected by the +highest ``[jobID]``. It matches files with the pattern +``[machine_name]-[jobID]-[model_type]-geom[level].out``, extracting average +execution times per non-linear step for the following phases: GEOS, matrix creation, Hypre +setup, and Hypre solve. + +Note +~~~~ +The job scripts designed for Frontier are likely compatible with other Slurm-based +systems, making them reusable across different high-performance computing environments +with minimal adjustments. diff --git a/src/docs/sphinx/advancedExamples/performanceBenchmarks/weakscal_frontier_compositionalMultiphaseFlow.png b/src/docs/sphinx/advancedExamples/performanceBenchmarks/weakscal_frontier_compositionalMultiphaseFlow.png new file mode 100644 index 0000000000000000000000000000000000000000..ae2442bcf5c4bfe53fbb73cadbb3236348da8733 GIT binary patch literal 397686 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

    CsVr!40B-at1&j$QuMegAm#%Y|PWe`L{_hjZ zwD`h*7~Ow&a)-v})~Kdv1il}Pj?;dnQ2t=&PJ{lfyBQsPwv0Ci^o>de^dk#~iz+f~ zFI0xFkOMjR@8yVVA$#m#GKrv3P@*}7B%}Jnn77m*(J%tNnr?AtU5em*nZN^R@rgD@ zR*OoTzW=d);G@F0*U}Ivw^;e)4u6_HT>kJ@LZ| zI^AM6fZouQFS2@gX`Bs3CV@I$W^gQ;e}I)q!pcL-XWsvQO5gp!Z!ze87)171tVt&f zFIyiD5jmu2dR>%w(>n3E*N~v@#Dj*9@Emvaa?cU(7%I`}>J`6ZaQ(o~yLX zXKtRrG~5>Emr586?)m=D9|WO5uP(^gj{S~^vM!j=o-*hHyt*pQV2>umP6y0@1i~0~ z{N;eH6^1{6ztam-f%V~n<-t?Ozt9V3tqleIyaV1PLL(n4K|t9O9Pz#?R?EoXE2`)P zCa!xs@T*W+pen?9W4u2Xc60OXdgE#heZLj)0~6e0VyT5*(b3UcHcn%5XZ{sYQ@j

    R!JE&u&!I^_7>hmin1JUl{xKdBVU`-(oR*o_z- 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ⅈ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 J{p+lC{|8gTJ4yfm literal 0 HcmV?d00001 diff --git a/src/docs/sphinx/advancedExamples/performanceBenchmarks/weakscal_frontier_mechanics.png b/src/docs/sphinx/advancedExamples/performanceBenchmarks/weakscal_frontier_mechanics.png new file mode 100644 index 0000000000000000000000000000000000000000..b797b43a440bccf8e7a500a149ad354d5a8c09ac GIT binary patch literal 419739 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
    QZ1!{L=kqp6@GpgGOP8wwLbk$ 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

      <*?xA_7lzskf|ooO4E#|ndVFdzF5^F`Bi-K+ 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 literal 0 HcmV?d00001 diff --git a/src/docs/sphinx/advancedExamples/performanceBenchmarks/weakscal_frontier_singlePhaseFlow.png b/src/docs/sphinx/advancedExamples/performanceBenchmarks/weakscal_frontier_singlePhaseFlow.png new file mode 100644 index 0000000000000000000000000000000000000000..7944cbba173faf48ab8d1ebd9c3fa3928b146fb8 GIT binary patch literal 458909 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

      k(CXDXa1o%E4) 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 z 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 z zm7trBVGvZ~U+8Gbr+HU&5l`0jgc=v&L<9A5=|nmvX}u&5F|`lJHXQvf(8@AE1mR7x z+efT)pq+kg$BKMI5mVYQ^|l;ENy|fCwR)v~|rmgfvy z&iBzTexpg#vTIRj5TotWB1@7`l35K+_VV)cW0v{SamL9KwGgGX{`&EH)#g>IZ3}qI zMT1tZS>7}hr&Z*$Ep4!0chQ%<(=TZKZ0RUZpE}+!ksWi*)uBTLif1^HrNV}ghN#eu zLDw+^cTvb)r%g-i7A>SZ9|;W;*`^Z2*>;`CUdfxR>|;sDbjvx@PNIq@VM0Y3Zu%B7 zLq|715~eRS;uenn1obIzw1$bji9EmvkPGKGX%aSA1fWCHd5kIQ$H#Z zwO>-2bqfvMl8nxJVE^IHF_3`nL6DgufBq1Zm~gfU!HBsEAljIZtPa?s0vI$ErLwXt zm!EFq$)o$pL=S=-8DJOH_-d(8?lw3z(>PDGkyOyyjWiNNralFk|EFLi~8Ogc)&d$zM9)mCx&FX-oGP})i=HpUu z84nPNefo6v5{|n-5qQ9FYEsH}fMuj6O*E_3g`c5zTaoc2>?4|mMjiq5&EO-jL{2WN zjrAZbtQGXLGW4WKUhH?#cT@*+QizuA$0kL7-9Tzv7N|ZjZPIbD=~iuvTb>$tLu{;7 zc8z+)BJWe|Opt5ypI?tPIrmZr6M}JNsshP47?qI-;4VxDpl44&8B&c~fq}7z^=;tl z<8gW@J7|ZiZ3DOP6~GcB9)h-M^;uASOlRYlecau1+UfXbETC$ZZs5%58$Qr5z9S!QNr7w zQFq`v)Iu{ER&6JBtvYHX*eTp6D~o)s%KJpUId8Ijw*k$#T1(q7f5 zhSHgYI7kOqqaTZU0@sih^t5moJ5gzIAMCa^oF=t9Vi_syf@oqJWWPauF}8pB0d*8J zc&iOmKWDWjhKIi#xVU!7>mj#IbQf6geoaz#z+Hd@cj%-X>RsGB4)KEyK#?_?tG02|_m&}_) z1-JuH2*bA7x+TDfv<=k6H*o5!_%Tiy(s`Kw-W^idwTnc0UdhRJcl+aYaKq3jOEyZV zH{{?;Oc9U=Xwdw$k<7j5SwoPd^)WAD97Er{$U%nu$d(R&ds8+%6H`y#1n-5-KmbV1vp10o#|#e%aXuF#FsbQ}v$CSZGp4s1mFaq-3J+f(^Z%L4{X z)Wya+=>#VRmEt+`=7l1m{41;qhrB zNsm{G;gAnb8j6SzY8HVunqrRPJR6~h zT+HyV9oOG&AoV1!Mw*o((pihUg6G;U(xr%WvMZj61yJ*N-*h|iZTj}1LC+nbhD9P@ zrc8<0S&YlLuxJfq_4Do@Xs5is`gI|mgQm>(E1)1|8UzW!o?RhSpo$Ko9DaBb0 zC;14qFYNqhi;9S-(2$Xetq8fmhANlltUj>;^hbhDO&OqakRX?dvdpkIlg zP8P0$^y;a}J9h4DK?Pg^Zj<<_cRRpRNfCEXCr|>Bn)s>j+uPfdc#ppDD#4WnJ{nu6_KfWCGdf46VD0|C5PGQ`5Ze@)Fj=QG>*>xY% zccQk6v@!1fHkta2lvLnQ&Z4>-#%{I;TvUk%h4h?I9jdAIB^>Xcc$0uh+c$tP2IEc; z0%H|#+3IuQ>_gX$z#2y5J5-&9z4t9p39Cv} zsQoZ+)8|}PB)`G4r!DkZuL}kRmQG`T{@7h~93k?o{QZ|Xl*=%ofh0(W;cyGZ2J);@ zYz9#7n;n_UmoM)FQ@cs8EX{_QZaMe&4Hb$jbh zH_o74LQD!=fi^9rf^MG#a1o<)C3B5dR*WAK8xc{_%0h1Qs>e9yeL673P$7CZAaXJw ztu!Ee8RAy}`lUY3APYL%?YP5VCa(lHK9+a#uh`*v{0@7m{DQqG1q_mVl3oY0C<-tw zSdSMd*{~j<(v@v&S_Kk8iwq5BhkunW?MxEZlBo*v$7BaNWG>{~g**K=RcJmlj0x;k zbHqi6X2OU-B?Xk=74K-2UXSNZ-F5i5=LUdGE9E4!joBLb1a@>RYKVlY8l)mO-p_pQ_!1u63c2igktO zf4aODdO9o!>2%pcRy{n()t;~yKp*ffqEz)aOlk$rcL8oiC~T=GfEzjI##Ank`>1zE zQM}N0N9?hItOe~heRO(tI1VdV;H4<;k(JS0aCiekowkqE(P(W_YKfwiN@yC7;pBOF zGCq|ojFv9lhRzlQvbRauM`sQB9JJ^t$2{WV;;4UuCxX%~;&AR|81RJQIY+^3h(^1s zUdoksDI%1VvNuZl$h$snaS0IUIWS;Vu_?T<|vZP8%;R! z`=kNgKu_*rv#-HV2fs;dAvgH5Gy@IkY8Zh2HCPR5YhWu-?uLFqr+l z*uP|_iujd2wyZJ;kh^)fawvGcoQ(ia#G+r1a@u9CAsaYsg8zO6=TE`6VGCT9+$1?+B>V+ZBr6!uBW5HiR4js<9DfB_RCg)7evOy>=5iB=kmw zFC|*buv4q**1B|-PZa+>exrMuNlFjTd;Z|s#yLaW9PhM$uYu6Y9?K%7FN5Jpaa%+V ze5!5?>ku!Gb&;_jJ|jtUHsP^!kb|lJ`zz%)STvnT(^jbtvC7lG|U^D}C=r{)x1`|K!$?zUebpZ(ds*D`UEO^@G@)<#QLdHaCz1Aea8NiDcv7KXj+2 zvF>$Np=9v=_U2Ezo$YO*dL5B*&jKRz53b+B)~|Efeed=DYCZJoXpDc7PK3`RG!J5R zAEIR(YN@rIm)%u$mHOT``8mH}W5Jh#eWOo4r5uSjcMoGkvG4fqKHC#C8kWl}Z=%@z z*UNQXwrtRmmMH3xLR?j%?D}$@+Fd&$wHqyG(kN1{Y>kP2&A+~mD?0~wA>Zr6rD^t4 zZ+YH2R>?0O@*<)d46a)}Rvg?a@M~iF@2}-ww^l}hnI###z53;w#JcLdJ?)*54^{?5 z75u$KsyYAr^>WR!8S0uBMKml(g?SdjAmwzHw--uYLY95%J+Guo%JJl%tmjdFgF|25~E z#ua_z8>m;)jp$vuDl|+SukM~6bp)eYK6U`8xlX5QXJy579$m?k?t2wtIcv*sQwX>9 z?4j4Xb58SeE_uc8zRyz!qZFCV{Aw!3fs8ihE^n>MUw@r8vk``o_^}?Bzq9+yyl>r% zvay==@!+2a(pe6J3(KA5oy6PK8B;{hb4V3JN)xU5e?OImUB^5;5-qFvL-h+EGo9|d z*w(s1La8arZ7bVX-}T-f?4K!AiW?R>bL;jq@Z?1MzUkQx`c@6H{x{jbi=yXB9hg{# z0B%=Y7B$~Sn!sZJW30}C>jf!aZljUPaM<)D(YI<=q^O~sIXEq@?>O|QkuXPx1o7DsS z)@;E`pDXtde472uzWGJ}&G{D zQgt_X2G2aP0h_p>IylLWrSZs2{79D==bXE~JNKQZq+-0)H~N-gdr8IgJGL>RjMckk zp6!VEtw@a%m(*&$cjy!gjjtq$O2z(ec>TrUq}PcGNAeX&L9*eJ6-o-1tQ8MhiBcaclhFxgUK` z%uiV9tilcuoWBa0c_amu;o`k@D-hhf$Qepe!{NIxc+apPh)_*)Zr=dLVefU^yPEU) z|NK?{hxbRCOmfbhuS)N}%4o~X;5Kzq;1loMx5vO>+<6YWa+y2jJ1cy`y5ox$T{Su{ z!*FDxe+#CoMk#R*XN9>&E_`S2YVR+c-@f1eH$9iF%d7&i!iy54qOWgX^g`4%*^W{U z3w{;4m4!-iheC=O#~A4Dre=oGGJ5$I0$(FBGGAowjC2DuT#B4JWnxxQ7DdT*j*UP%!rzE7A`UoX>frU-lpg2M`>~ z2-M*1Eidnpd!po}p{i-Yy%l$Q*V(rJS{IgJ##g20d^Y0(Ifc49SS+HL^?yDD4RmQa zpXjU_V9;{9CU31>9D6ZljTHMhan0ra-!E1ElC5>+{$6W=$rH*pfEg8~z%=f7U9>+I$~BQ#^a zn7WGuDL!I49Z%(|mDsAJ)p}uKXU_f3y2@W7Mj^9r^~s^P4+~T0r}rO!73r~c#&jQ- zCFW&x_8aWCMEvWgvH$8id+DfY5^c9t{rU;aOmkYFIk8<56Kpmv-mlz*e|>fEYpJB+ zbIyLLsywSD(Y@1r;03Zv=)-AW*XKH?bvM_9Lzo%Mv!U-G6!A4-2Br_+xbc5nW-j?f z`DJ09o{t^+R;RNTbC(t+S87MeCN@nholXNgALm8~{9Om+#@UY;okhoXw&?wV%MyHb z#sCwrmL~wED-$#fue~GwY_c-vY0IW`mYY{!<;jqHnu*&?@}?j- zeHp(zZ`;hS3$liw*gHs2$ax&a43%;|V z;%_>O>tz*HJ!ni9txBw`tk+APc{02!>DJNp3whZ$7?;2M|BgJt`?ox4zK5rz%A@lL zsb9QyIEAdzdFMIVF_%8)DX|k2sG;H*v!+k?^zrdo%w7i9VT)Z9o?Nrg>OS86F1Ipv z0F6K(9AZ=+Rfu) zBQP(*bVdOsD%lzqY%JkB_vy~-knacDxR~bHVcCta>}Q16g!g8`)2>jBeeD0{%hC`0 z=0pCb$4!rzdgJ!Wc*X+U{f(V5*Uv8&y5}?xbs~pI%r$WMe_#JXVk#Y(_qECf*5HUR z+SanBRh$e7(M(gn!O4$YkA0_@={jvMX?${UgQAp9z+>}C=gaRYC?|I4pk_9>PLpT3 zxcI+wiD!o}BtlJcbsVhU9*JbMo!>J|x1!c8(Z+@&^mPsP-$}`&J!pmc9wc^GZ+}s= zp&Ia<@x1b;C%dNo+-<|DNxJraXLb2kZ4_6ajTv%@y+qBS$Qsm+xJ3eX;1t?ifmi@`!uW?a?r=^Zb{u=~z!{s|DotuCe@PdoK6D1pdMP*wx)c9-rew*JCUMDL&sy2;m z=d)>QZ)Si?rTRtkXZQqw}VsFD&2Pk5sg9nMA@c$nK0fBU* zumaP#Q>XNLFLJ5wzEWWyVz^TcOH(&K=auG-N8PCP)2?N(uWWg;7yHIYaF-rJ|m8h5%EpOqy?8Op?oc3qWbDZ*HrRW$)I><7f4 z@HfOT_t-Z%1UplK`iof!ZD-*uEBYQ@`@cR+zME!uh1QoB6YQMJ#||#vsU;gW-7%5W9WMHTZ*0^bd7@LMbpfNVB1J=7mR&?~ zo#3niUQhN;kO9cQ8)L^cAqK>M;Pg!(tH__`^71;iL-l?Ss4!U=Mq-Qy;K^DiNZ`OT>}!wC`p2mBEFzzG;N zt|dpjRwPE&yeLxSs+0u2iGH0?A}Q`^az*c?H{>CVzL{4=8qJ1>X`7|<5-veqWRc{T z2MX75^lQMcn^`>!#FwA>{d8%_g7h1Jv8O<@Oy^Y9rIsphV>7XFh@KNCQJlhE8EXI`c zOX~|DiKylK#}2cI+UOQ{e5~yk+gYBg^~Cqv$yKT=r=K?$?*k{@r4_Rp5bYZ{D&b!Mr2!2+E!> zD=M51$_#$7m*T*UUI#hRW=vu4;lix3brKuA>0)T0Z%U48=+<=nYj}g%slMMX0%coU zcJm0jaKC?vtnT``!c4c0Q$ur2d_&I59cwF|v-cM<->d9rKtu^Nc0Td1w1Rmc8OhNc z6f#Ohu^JBE1>E4Z0E(m30@{CR(7G_^}$F zP2du$<8|UBW%ph{M1<2mG?5`+BK9V)u+(xLW;5Tbr!mLcbvv7k)P{fPt9ZP}h9~1R zV-i=k4Ts_xhzQ7~c7L?fPjGq;`+?VWwfz$I6OZz)i%>_Yoojy`znxk@MSX}VWyCCk z+uGJoJ}RI~k;g1FT?l)9P*qTi4orbN0J3>YC&`yIJ>SUA?B*Ut3lX-0k0xNhY61tg zc(m+JAapru!KdN>M2p=zZ(V&`NGtp)b1_E0=6wSiei=VJ+bEj#*UD#N!1-Nge*zy; z8(n4PM40`&f{dNG0S}sfnKrEykD54JAT(}6qgO*;-=8?7kN+7)l;%HrbFbcq-}6-W zh69CE={PdQ69qI4pE%b|Br7TWqMY%)H|;=M$J^cA!TGZ> z1R3CDP(v9FLz_L{)G7F>JL?fhVg^58i&`S(&)mmDeUpaLv5ETg;YD^z#>N^j9|4M!d~n z`xH@wWV}0W&ShV0iLcxuW}DVwM7Xi?MkJ2 zrWe^L?FCMK(zOl=w(IO7_F?fma3pO}?neoZu-veFL_fjg zmt%6Wg35d)Cm=f0x1kkIN4$P}@ns_Q3|_BPm+pdh>^d&GazofFhlxWzja-f>l;D<5 z#QM;?AkG-x#l&zGjP@eIIATy*leeCA^~vOjy?4Yqu6O(gSr>W0ff#BHx+=^{_JcC3 z4VF4KFgWNBKn5dgYmmWcXemS^%ia1^L1uygo@{SVzJ9n34LG4!L(mEnsgYPJm=Yfi zhNRRwzg1F@8CUp<9eqK0?h@q^OIWEmf%*YTLLwaO?qlr8g5yq*%2hx()Yn;W2&?=D zVA;0&2Md)z&y|RQWpGST#Cfd%lgkDSTN?L*E-max=r%$oHxF`t2)iP{L_mbKuw(bk zzV3_kBga0Nj-K0ImDMtVTb5vv;#=^FsTtE$8{96B5mhl~?@gvE8u8%EhJfU79Fm?^n4gfx zC}@x&uXtn*U?*0q9VCc6OH}%-+yP0XOTrK2mvM_nXiG~C+hIGk$>)sH%2;%Jy9}BvO$L`haO%& z%Z@wDTb7*6)is1usS2tiHsthQR=#>P7!Pak%a@PfFemC(!bFT17b3f@jR5-+zqco5 z!$NLSs!V^}3CCw>Si&8dG`#}{AM!v9-vxC08I*6#FrOFRSr1gj1iMoAiDN1Rx0^s{ zBhhuos6KA>wKPC(=epox6B(6u87&L*3Is z%h!uZMGimRT!-@TYWLi4l2$&mtdP;02a-P+rZV=rmI>5v>Wles<76TM72 zI6bq}T$7w5V`li@>=^?PrstoKkje~-0##&xOg^qbJO>E9H^QIS5I=(jDs6z+-VdF? z^~uD5?AXZYyZypDLGVb=2c#BXQ(BF zuPWi=A5aO7oOdkmJ^QTnjLT0sYIcZehb^WWPUh3<^0oNm}ct5 zK#b4{ny}!46=_dEPZV6SVt>q|rlc+BN{(xS^2$48JUR~h3~3Owf1{j2ca{UR%*2VTon&(o(v1_@1yjpgiOw#_Ug zxj5@KCiRFRCd3#8El~fAp+bol-Y`O88-_iQ@tejOsP#0-NDmV*0usKp0N|l5);m^D1Xfg zxQe~;mXW;Bs1TLTTb`aF3Ia}=M0zcA_%^S2ziQQ5)u?0bWeF*AUbhUoW;Jy8h=nVU zr?rmnu)5$~G;ZU?e%HkuHoTY6hD#e%s-+}0uuL2#S;T>4WYX2}RJ#o}sEivQ>JjK^ z2xgQG>3aZiYdqrJVj(|i3bz{Ktj6$2Eqsw^oGlHuI4WcQzC=Nw0;Z%jEEniDiOG+s zUE}>Wi$=KM)vp#8uc+O}dk=?6qJlj-2T{_q?DTbdGo2Z|*VB!5dmvndVdJGsO_9C< zB{CW1!|~dupWNj85T4Q=uliqT|v_uC>99TK`1;nDUC?0FVs=(%p0vs5r9piiM{CPn|V)HuH9q{x}ebQL9AbM%K9CbWG+nOHP6Mt`MJ#_&)MYfhwPGL>?9uznmQH{-e;I z>ag$YnpVFeWtAeB;c*$sX|4m?KVr`$=k}&k&#WX9UxH()uM<6v3hoh@-*%bvJe_k zeH5~YRu@nR!Cclv8gLW+4@UA+1AGG(gs`6G%82(ixX+>}GrM{<;}FF4-X+J&p&SSn zee&hcurXM@vhZ-sdxL$DXp`&>V-}Ibr5s{_rjFe}1Jh}|*qoJnUy%kE7qJuaFt7s? zs+cABc9LN|8D{$>*heCVtRWQsr$84@7|o4^T)j^7!X-olNh5Sn5Rin*1nV#5B|@ppIdDws%v2V?nQ zNdV=HL9nyMHH^2yco2s{7C9-9?h)8t2+9IR^0N~XO!z9n^!qMN#KSf%`M`}Mq=B`e z#N@}L$vWFOtsFIf9`1{a$GF)jfYNM~U}_2X4PKVUZR~F?cWx8lwv%x_E8FU5p0en1 z^n2=0qzJIF*v2Y59g2fyhd1#Y-NX}6x9X`^gNH0v&2o%KH7$bO`~zGfsY{9s5r;$Z zTBB^(TI=ihBk3kLj|>r=7Y7!Z37OaqjxBitw1=#Q;H0_=0WMwsyfh1b?-UT^-|!uR z_a>w+Ssj%$@{C5~kyL7qs`Smy^*oBGcho0FjpAO~3kq#fvMhXP;e(=s%0l@7=IBL3 z;X!QRe7oC)*Wj(IMKjg$1j|86_G4v05D5Oa{8@8Gwg(Pduq#cD+))KOp9Q#(1kd%GRmSitkvgLo>FJ|=3 z-|zP|&3qi^yzl!w&wXF_wR8Ylf#BpFwBvrrv0A&vEEy867MK*nji97NB{He=Dp;_1 z9R9YslvPQUY&5)?$-&iqy{i3vDHOf%nmbmIwrZX|I<%D9$Kl`~8(==SX~_+EVph() zl(pAhR0v{cHQJDgk-AXp>`th>gmhowAbflzok-6mM&tHi*5izu-i?C8HyFW0Fc+DV z938<1=gnoXHi;|0x-P1Z(t2{`2~0xL*y#8JVHpg+im0e9uvS>eeQV@sg~=i=5$v-N z_Ja0euqAKegbDN=B$mXECh$20+YHIX$*ux0CoUB1)j?mCJ8wPzC76=KlLld>zzdBI zDAc8F69gthX6k8@OJEC`-t;JUIoYM~DTZj&YBw^?!)HjjunHueoM2XgX0ZTP zLB1VJV=ZJkP!z_hErfsWg)IkhdP5L&jBSkOgK@lhU=JBsA$IYj1=Xr{*g9cNv>i|F zel4wHd$*hTv~aZ!krSN`&fq8XcZIMxYAZ|~0FYF%Me$W$-T^GHBJ5)wZ!stPP7-&L zOop;4m4p#6evc4>!UKA-h_n{cnW2K(g9}6fVWcM~{kfj7xsV+MLYUFZM z2v924zWt6wATUxW7yzm$h^132H*2<-v5X&7P;Q49{X z;6J*VS>EUs{g(K3twL9u`tCMW`|^nHfb1zJVU182Wx3qSs;uX}34NQxgY%3AIeB>k)d|pK(@)7}IXq~g^kN7VW=zgZVxbOE zBQOP$`LN`YsBGRGE-n*xAeuCxnf<2G0Np9I#Us7f8=NC@Q&4Ebf!+A| zd(5Zm)KrQJ2}nG@)KM+%G2X12L4@HOjW&6@=x2ysJ`eP zY&}TEBAfFVY9_|fr3x5__wCxPojAoIlw8gVGM*nRIi0dC87zRYfb6+CNR z3g(H@k}JB0t+xr{8q1wag0UclX3i#&xQ5G1E9@EAQv4x84{G(rI1OL=f!?RCr8MGbZ6SvjF&GF zMqRkhdKTi0;D`il9Y7Nm&g(D-|L05Mi=|=7q+Dy!oojowFt!H6Yf0x(13^R0veB`R z&nSEyGt%-`^sl`$r?Q;O;p+^{rXc?s&MAb#18IZ>dW%PnBNR&*u$ZYiE~UJV`Sa#| zh#m@s90K-P&l#U2ppM?R>(9{+MiDYiwos^sF(wwC2!TM!=;hOx3d6<2?Bgia-ps1g zA>1E|3W5hPxF%j5@Vaos5JuUy z96q+*FV>BQh_@RYywq*E*GGw(kvf9&M^T>-O%lXqNpGTZG=Ir zK@aw@X}+m5OD@SABldtu8D}J!sDPr9Oy23RaAbqMPgh@V^qQM@^q2n2wP!86{#E zfQe9u{x~{L!SaSY8TG4BJ1=`*aSz=D0pK_e6OZI#Bue!(29og`7K`kI7dj+PpKfWP zy-}W$y*D55`H#e+PUKlfx5O%x4@%wwQ|CH@;TaGT@fP zM&v@wMEhN$@6A5Hwg>)Ov1*jJfnGJIHu>wZ4U5dt7bS#|=ZR4WdAzu~4(b9#;%_p8 zF0rlbX{Nq+;^b`Tzq0gmp=;A{c_D~Bj8f&uGy(6jv$xk$+6mW7l9C4@nbX;HcUeMj zlx~jBlS7^1!AL>dKiuJc|6x_5oGBol)SPp8B$Q_^+45MeF{E+LxF<9(U=S-DsKCNSNrM=&PB)bx)r7OF6Gtm@&aXqIq-e|qeL{yHBM0BhyA=(e>`+1K+i}UK=MSpm72uK78NSXb zU6e%B*f}+T6THL9FiJ4lk&YVylex`gaK%wkaC<-lsSh~Ve7FPw+q~D`e<~^O*%=CL zl^(!&qFO%}CqV>`%!CyfGXC?$qwmy~;%60UQglW1|Fhy^Nyv{mFtirpgvBNxUVV@D z+dCW6kBHWje}p1J<8iGm4joXZ10i4tE?5Lagj%Eye@`rU`uC+vG=`$b7!Bo9H4K;M zE?ga-g2owX84c=Y7^W@^IF*e3l}wSyf1I2qs5ysiEPt*kOwDj%q;cw=er4xl=lfLG zMd?&Z-b#BC>Y);qwl43qxdZzkoL&omh;-Ps%UIT@I9L2phHu-!-BKflg*orpf;CMG zriK3c>F>YkN;o_iCD}Plp!6X?x0xC#-}?<>2StHA(H&&!fm#W6Kq&Eab=30K-CCCFw z(hX5-GhA<}Eh20jj|=L%yrv;DGc&U6BI7!_0UaG33VT;>skHKaddA-MAxJLqE2fIv z6!!7N(q8q~v%~CmoGqq1$Mb#U=4lLWR;u3rKCmjZ&DvXfud01jpU!kLcuh*S%2~mD zYNk}is5=|=+Pq(Xbur0BiHe;d;SVM%0PN7O;ZW@4L!3OlDu;7xmAPw^SDfnDNY;go%2Z8SPXiPkWlawZkE)_e-yG(EXY7-^WB@b0kTV+~5ziSw9!*f;il0 z!=m{f8oW0VoIh+@5ku2MF`P8+yJ(Kh3z^J8t*xy#E$FK13zv~)K=b$EhS#+dBW@#4 zy!{tWZXTXbKg54mDN&^d>L39 zYM&6@3UvdGc4f=J3xVC%9N?B@-P7*G6h+3w6cH)7B8o`Umtwjaxx;Letp|T(H#^i_ zW27cuM$MR6R}+Y6h6b;%SVvb^4-m?k-pkjn!L%5s5cwUQ>E*dTZT|YWfXLPE0^0BO zZ;%<5BPPc|?Zet{QkF-&aG2FXnM-5{L9H^zj^uDpZZl`vFc*o05*XBhQ}KDH?0MrW zy9afotLr*DrjI?F_-84B-0-|%3xWD`Qk*4F-u!|HWAcBrA|$%*}ls^=}R zDAk(ef-%e=@^g2zN9TJj|HfP(J|MEIgjq?A>PS>=E}VfrU$$yE6;pDJ{LK02lM`3X zTZcM7AIzReGMFVi%hMz!7}&IDNhAD@5%*V2_^Mw@MuQlP$|{%tWLy`~xK`cKd;38A z_zB+G+tNV=(MQWUHAQr*4JLyC5IXQ`uhR4}QnEwch&;}CUd>#;-MUNTg?HZs=y46# zVqdx0Dd&Sx3WXu3c`f(+R3kyPAjMvQh`y9**U?^*2lKS(UTm6Qt5nF!RS<*S32iNV zG3Dm0N?h^R*4A2_frUfEIc2dEeFWfA0=V`;dqN985!t42EPHI#hM6UmmAo4^y!|Lx z*(g^S-_n;g*T-|*J##pLJ*@m``vIeG?T^MUWpVtfQ zV9hM7I-0hLPr}9fH~uqHkf*{1LKnP z#Cdshs%F=${Oz~jqTv^aGq(DpARu>4-*wOTqhpY7q|5E&>DAqVx|&B+bf`Q74%z{; z=sllJfcIA$(p<~A!SSqO^o41B0M#9=bsru#*!S8PUBugnBb&tRw3<)buj;n(+nBBc ztexS?+h0+{vvW@4*Y1W%KYbIY<_Re`gpiUwNT47&oG-Vm zJYqJh-HfLh&tOuLhPX=A?Z!1H8ldGKJ}dLfFTc2e%`L@jai4XzZ{JQ<2$7m5=)j)z zZC^>{KE%Vg8-@_ddA=v6K`e7f6LifTL2SS~L_MCc;>y>u9a}yCG?0~@aA3}&MUPNalq-7PyeaQz zABn3-*>*TPJbVBA(r~4BqNS*~`@UxucXttroA6?Is0cp{L^ul)%0u>-c{Kqb zFmCb$=N~j5_3+Sx0avHzZ_@^A;T0s|R6(7ql3|g}r#5{ns0;sJ>T6;AT z0Kes)Zwv8W%kpF6M7ECW>E-fu13#Wrt>jYM+~{!H?DZtAj{24W*j$B{e0xdqi$DIL zCq!c3h&*-PK8$(WooY6WZ7O6$Yhu!2V?dF=un+}2A0DC!1*nL*7U!VQ494)@5fk9D-uEO%(?Y*BnqrTT` zs)z|yY^upAsuXNR%(SGk!POkI@vLI*vfv?)EgjwAJEFcOfwf-p%e$I|YU@Id38FV2 zmC3m2i~!mFD)$;Tsb7ZDwH21JvKwr6!oBUDT6<`pk;+3CU01qk;;2GExTXjYq zAK|Yu!VO`IjN z0=w__@})N-xSSCFewe+6hv(6uWIgKEl?~2duY{>g+=`hZyY6n%HH?@!ZCX^k5K?b3 ze|Vx6iy5_N@89)56RYG@gT&orYjnXL;gw%1&B5-YT~i-L_VdvVg#O{sNJ^IJ)kB)X z%3dzNPtqnWi}3dXnb=At?e{4@UzbSGw@G|?eueJeuB*gw{m{Sl;tur->+TZ}giQIG15@iXH3eEEa?50hK%U=Q?TMU+Z7GJ=^C_?) znFZIDbHyGFLMN<`5<|HK5HV&e5oVwkW+9|OzY1#~DGWY!s1t-rlrgB6u!ikbn^4jG zk^wJR4vkXLhVg%KhYG@`@zl;aO`v9x;kER+`G113N~06hZwm!t)KE<=-u367xbe)} z9{I!c@7K}G_?(9&!TC@zKJ!eQw+wK z8=tx|rdiQyv4}kf@jHFem71yKE#=uvlLl0`^G|kQ5XZA^TdBS#=+zkbO^ddauW39n zG)aW9i|;f+SMXHrDPZY^t8dy3e%a&E^&}Gm@|q|uxHHlmq9_5pimaS#T;t8Z<>n1q z)kJ+vz3KOGc_Y}$5$7(q+eNr9saD$$?$RjpBTh`~2}sxuzpY}Hp4ZsYBeMz&_iM%` zkk<`L2!Uux05A3t6PRHt8)yg~%64}ioXZoDODx^AWdYsptE*6h98OIVc`76z zmH)u`3{Q8IEmyR;LhO!Z@{;rc@pz42kq#u>aw+&nzCbv9w^SE@p>x7;AIY0zpw>`Imb(-7ri%7L!F8qGZnO+gcE za?YXR4OmipA?L-LUS5OFwMK8cVD^28!3y9)+7OMNb0;LDCHy}9qRfPIns2Cb z+UgoIavsuEag(98RZQhgK+AxoeMygQCb#snk}0=46;k(@93;|Tg-0f)sUoA3r_JPA zc=d0P-7NQ*-YtD`2#yyu5@3FlU-j4U?eJV9b7Tz3T0nH{EAH>_$5|uKA@k`F#98+M z>lX|p4R+=T6%invwXbp&hO3yR$1o1n2{wIEu5;(xlS?6n?TN=UR4`Qoly_3W2prMY z=67KEhC1usGKV+(jm4W^MsWIsz}HFHz=>0|`NHbqVz@Pj3KApz@!|6Yn?9gzLhPqS z`FE#I^o#3Ze;h1|FlwEG!`^@e$kA6ecl?&udJG_jNx@>ivjvaHho{_M+4VFzbr)S< zKWe7KDs^HIo6l!QX!}(gHP$?HlY3w+AUEevLLaYOyGBxoqJ*C&PA=V2ndVJwMuJTB z20-a0FLVE*1k_#4l(4DBVd=Ty$ORC7!-|o7eGqeWC2SGX56;)dC^LZ&W4LfXtCIg- zixLS+np^wX=n|u>{jRU3X!H>#m{7@rNtm0sIXfRn5hTlEJo%s+4VK`BPT-?8Fcaa2?dA?=pD zvMUq^vUwvvq56tR^jPJ!?bIKDb8YTJ-r22$Q8WD34?TJCHo5g3xMrb(z+n!`T(3_J z(n>n}BzNKsk!P^KG$=3&7bQ*u*sO*6nrI}qU?38NM(*FQ9$`obXm14_AFcppAHj`*t7ZGb@UhQPPM0}2L3(AD)D?BoM4D=kQcjV>(-KHF+k#S zc=(si&k4qP9SGJl#Woq{0sXDA?X4o5wx}Fni72ebIa=C+X=;n3u2eDc@Usa7uh5p{ zsxVZ5*+dtvUNDY>bF~*2Qs`Cw_cxD`k%eEe7bOKU>=nST$=OU-26!q7_x5)abscl= z=~ca;3oB9A#ik(|<)3?URxfJ;hR4h)p+_L5&PwYT82{_ANMBpS~!TU^60T+k(yo`StH=o1nlT8w4=v-H~;gRSZPFIPLJqrAvg$;#;zgcBI9ji zI?`Z|j4wZ*94Y37MvM9L0N|!4XU3hXzgoD~fh}17m%7+^@OsOczD;U9{1YI6(n^dw_UrF-AI{QM zH$9fsxVbBRpn`3bwXy8$=S7Q}L&auoRmxmBv!TAFa@HNRTNlTx$~bcv#%O}DW5wz_ zbELZ3rd;(z4gm$lwRe*XHlkBRfv_`>T+H@Upw_MMMFWjwHmA75gtkCKgnWHvZq%E zUCC8sI06S&43b?=G;5-}V8fNPrhAWXE+Vo#+Rcij7(AxuFoa)zn;SqMZ)l6y7G%&F5t$ z^$iUH@Q8dJSdR9Htcvepe5;vEq)>8x#-~hZ_qzo~Y$-c36ik9(1`J|NC^JuY>tfaQSfBF7w;StLV zmeaG)65OJiCnLLc8+L03X3AvMtiWSR3S&)!4&Zg}0v++GXJJhqi4xWv#`X5LM%bCB z&6-t086`MpLcw_uYO}&{i0n!!*$=WO-GU`>tt9#fc8^Kf+JzKgvjcfr@9hSRJWCA0 zokdu*9L7l&5Ry|aC0Tc3zIL*p9|fQuipcVKvmlyM-~f50v#HE_?$sN>RGYvCDv2NN8jHdok=)6|hbbRhf0-O)XMe8IK@*tp0k+t1H$LS$|pDCzh# z+hHS69(WG!J|w9?yFg14N$`=RbOT^LZR*q~dPDe-L}r28FU7BTZZ(0tN&kq+)%_@? z!jOfL8~D>|R4hf99C7a>Rxy%-$aE5K(bMrt5*G3#yCkly#$HGek;J3=T0cBXhi1(b zNlpqDVvl01VV>R(!ZXngF%o$PQHaSQl~g<1{dYI*!T@p4`6%HE+;>69nb07j!otZe zFq2c{5E0oi!!axufV6?IeuDR*#47!`3@++^u*23f6CHaz@J~~xu7fJr6BRuG^^K_K#$04R?;R_0D)|}c>y_MMzdMUI9CpBGH!OL31J_1)<;{9G z_$!m_8)re}KsT6Cw6utK1x`^AI+#a#1%adbd(5d3$`b}o*GZJT)Sw{FA_PN?2@PkP z0zAxf_+q!!t(m{wB)R+c!Gj04FuZDE9CCrO-sg-o5u`yoB^l&H!G$R^P4hNw-i&Vf zch{_km{sv2L~QX^|3mxs?=J$}8Lg9b%fNmCtenwGgkpas)fXNHvZ#kFz|CzQNFYiJ z`8D1`BMztb=|$B!IntC}1#fH3QqN8SK=u7#j1>|A9lo#<2A1uW!B8$VgV^PcikiR_ z?D^DxAn?Kk-46OR@H~Ujd6J5cDBGG7Etctl^eQydtuGO5lxFx-Pg2_q8P9}SZc~5x z?bfJ8b^)na#li;@zO z`=%B<+h-RhQT=Ni->`u4Bk-o>A*un9lNXMH0RaI_n~VV-3C4&XkFE1}ImcJ8_To{? zn7x%TJQ;mn<~_fgu0m#@0UA*q7CgEkKZj=C;c<^N9-26!g)kifNz+zkFztWl2>>g5tS`tnN*O)t%unklQ8zqPJM1Kvc91#P25_^8Q1Vw9&I>nb4A^t&yoQKiTu#e|1 zN$fEN-F5@!!0HshBP;u6X3KZs!RS2RO%<7Wce{4~GBw%pw_hcKulN=I^4kT6d_^hN{Ehtunkt9+LLrN>Ji&(L*>=Vza-q*lDY3V23C1oC2^iw=x;MZuAd1 zo^He2ACvnMiv^-h?p(Kj?A&hiVYfv>EHf;@Hv~wP*}KytD&;*Z*5(sNo{j!|5%xd* z&T4!FhYy4i8O6N^r50J`rbmCvr1$|mVHg>%_2_Oz=BwSe+9{Y3Cx!(DEd@V4#;~mJ zcCFa1FJHfs4HYnc?lo(6BMrLU=|}{NEv91o5{R{0Vln zWG~>0x3~jD)4SB(!h`d!A7iZ|NCq`WsNF9(f*_rk)=(?^t zIi1-zUUFs1PHvIa>v>_Z!(u~5L^s=iz1}OccOjO?{vL57Vb$1-_6@4``pLzl0TtU}NpjwsrI(OIC}_bRSO zLsA58LLnAsP`9aL>hMqpjerWKsKa`GH!u`s{4VeE@q3bny0LP~0{aw6WV8iWwq7_I zxz*a!JjcPY`Rk|s)28uxoA@!cD{G`9l^3h*yq~!0Y?yP5&4>11Sj!%Q{^~fz1|`7D zEIqGuJS*C^-R?9{3z~8Jk$P+d;rifoN+KbPqdN8Xrs~vGA_|bW0h=#>lisGgh3Gjc zIIDbg8^zgy4EopHL*5yn8-n&&04S0qOgOBXaLg;gRHCZWY!U2eK!7sgZTr7K93gc^jYcEC&!wEu2H_$kmF*(M4^A;BU(MG+cd3+%8^ zh$h3llnJ51+EYORvMj~~*+*RvH+&*h;DFzHYtrHn4GnoQ%Ti)-Okt1_1WYyezV=9L zGOa%r>u_c8U+eA-0X0eNiPmgM51FK&_AN%=N`3j=*K0;c3uzW-Gv?!aMI4Lti=<TA<^1%f&0Xl-oa-7n@I_=MatGOzvX;B8ynh$T22i2aXqS080)e@}%88<{++ z;mVh~PQsF#_$>(I0?NN1SRqGQiNf97<5;*m!AEa?}<&-L$yI+H^32u$yR3NfHf4@xTVxYpuwf=r&zD4 zfVD}mcbdlh$iUPXmEG&!-974BBPQ<%AHBY(J^ zS#V8hsl7;8_w-pg`cFEx%jfPWD&(8EBs;StXB5>n6?H9=k6Z%SOShQqsNxnle35)4 zFnfsTI{_rX1-z(hbD!PBk%%+b^2=A0Anr}Tys{l(uTE*?uzBH)YKLQbF_4t@2Z|*g zE-rq6au%p=24M;s*LkXD_`q~BPhar+Thyly;FlvgB>Bf56lh9l15}VT)y7kh3qS@I z(S(1~)xsl9-tdr;Ly*3Xmsc836}m$z^MIUEy^SJ{7vWL_ihzh#h$MU5uy<9Knf0r= zx%E&{mM2@s5|0=NN((M6QJ_GfLf;#V_W%;|tIW*CkVrFtXvi=TtujrYNv`s!^(b`O zvO0Xuc5Ht1grG1WY=czR$eM|Wj^2VsVmKIKB8 za^I|&%>i2jIc#$%vTVOJc4C|XYbv)Qee%B{mwfb}B&Gv^l#dzweYA%O!u^7a7e}9L zDKFAzH$&f8j2yo%^s+5j=8oqO)kpkL+y1V1Xahu>4PFS&5n1kBfIFY21fK>XQeE?{ z#*;BPOfxoz(^pznu^M*jpT2$DCPiUwZ%`@wz4)s=nwJFShi;G9MV_4#;arm?HDEv< zip;dzQ)(dN7Xify@ExKp@PKHy;!QzRz|_1!(V*eh+`mjv?&CpF0kC^{(7sPL{DOi? zWWJS`rvlv_J|5|U5T!*HKsbTd)g}XK7Ia#~V-|q>Vt_h^ZWHFp)~8CzdX>s}Am&mew zvMNR#n^-(1w4-|pVlV8xd}Py`It&Cxy}8KoD2?(|C_t6t8(5N|S(ofIA;bG*VtpFz?k^v3+lG)`iVpi>|>0c6A<=Sz6afSe}DV70C? zjsPEWgUbkk6+yz?^(9kBgSA*9W4Ym`_Yt^P8V1^WJOo)a7q*OhNBFB72UfPHo!A4| zyaWG3oJV1}pm|H$?#?e?PmeZjBGZ`@Pc8(zA`;TI1}jm?u5rz}afMaWPeXh_%H_w2 zNsi$&UUHYlh-iXh7l6TQ4JH8^B+2xc$z=Czhp6A$G-84+d4964nEFSLmy`IbpBD!kOhZX<+Lby|U|7*;%h+4Qz8?&bLt4aJ!JcZ5Th8 zH}2Qs@t=eSup3JI@-QH@1L(b*FZ}uAT~6vC4C5q2e||LZ=y-@) zPI-OUM}$*$o>uEfc^xl*@?TYaNaNRF^;&<<+F(LHKkMmu@H7Or(4ERwt;it@{pF|oi{$T=!-$V zXLkPfG`qK`cp&*M!MyXkNidW z4bFNVaq;Spc(R22O#(lM+Qw>U=B8;V=Jbv6jbHp zG@d1h6C!hm*_Qp+#H#L3588|&@cq*c=dSAqhTNP#>Qd{FPyV)tFOl0F#3po0(Jwt< zjPBQ$geix9?~b%@5+Ck!#^0sS*@0484#GA058|9oe7F`)Q_Dz6jhM7{mt>p^G``uc z!_dk8y-Fh9MMsN1a@(KGjh&*i?s118YrkBJ{>V2Krh#Y-f7q7LN@OvENbpvYkfnpgh&<)`r~&c&a5s<4G&uNBfm zCZ7$>8M;yQh%c{}=`j3wXeV>iA0BKJuY!LF`Fs@_#a0D^I|uralyMFoIH@3bn?S2( zJ4%ZE=j9y=mRH*BzEWVxE4(T%qPu9RV{^<+`H){ZYevjqS#F}t%cBO(&BuUTEsTg9 zO#U%YuSWzp&YIx zJ$pv^S=8u@_LLqQwTAoWrn;$OzxDK3RNzO0O_=kacgXxj*8S!! z{{RKcCTDMoa%t%Rp-r%O=DVV?rQG=!v+?0JQ0O z23eNC4MCDk3Nx&&{(!%y7p;8%;NSPcxv#l>wy zNL)PKHjgK2;h^4*`-(6<+oHda@0L5(VHk4ugZ)B}|rz91oyz3>K2V^IZo9I^Hq>r<5)B@K!1u?GJW4&R@P1wL;At4fsxGFGbnzupDE_ zEp~%vp(wPZDF-GcWnnFdiYCtWrC#{@72`l4xD&eEl)g1gok$nx-!I+Ur~ryz98(kR zb(q%KX1()_{~4vCzV}N%Ec{eIc2=1jC!@x+M=*Ynw1B6EshT5%5@fF=)MD4yuuw96 zJeD`|;ygw$rG`Hr@{ z4#eb?Sho?$x2nI#1l^tmB&$gkiI@7HcDA6<+aWq$Dlqc4BV2q{{N_LH)vq0nS^HVSpn(i zv1$nwjk|XzthhQ@V{BANN2lSd+bSgZ|9LXC4Q5-BAuFw;17`c^8uvQR}! z;j-{VwWC>w;8z}~?6q4z)`fWa!@d_pt|{k<`|(K+KQ@`@TG-!{aJ79disGju?%FI? zI+d`X^-RttsT|-p{=Hv4Ahar7#&e9V#s=|{#?`xm9XgRu2BiR9?X+X2H-4tS+{)5P zXuTnhV|gic-KPo?lwxdVZ6G89*$u9;n(#ubH-L^p{;Eun!p7_=EELW3}+|FD<9S z2al&t>qO!P1faSWi_8D~zEh0xS*=<0&wjxYDTl^vW)Y#jS^FZ2p%0d{*xm7CpF_Vf z!p+?$R6DS(xR!CXZ8K2Le75zG-lb+_$B&w~vRcU>+hLC|Y>n>k@K4uVmUZ%gfA4>8 z086FsSjl#3AYQvsHc!Od2b}(%!AFZErZ53#5bTe<(B>W214vOUdzy_RG6!H+Utiy@ z|1W5yX5F+-KDDoHJB_q#3R7mv91Lx@m}jP9Yh~p*HfP!PGi`O8Z7>gWY{nz`@xy8r zBn*cjd{h>}-#S&WPSTwF3r`Sg2PF3K+qE||aO0R6%ZVE6kVA_?pvS%Dd&$x9G%60% zR~mKwzofap@y&kw;DF_)RxZS&%$n9+WVFg(F?1g{^O;Qf|2a7D7BC5PY_8lW_c1Re zW^%R;uq5DH7#HwMO>z?eR*D?Yh2oLQ;Y((Hq)X2e8@HRNX%2q?Y9YIIemgPj@HDy@ zOP@h`^j!x}rdh*OYHd3yXGK0$SJz@W?)tOQyKXb?uB#!h{(b^@7i-tX$AF)=G=yYy zfS|m_XKv7M$M4P24QgEX47*9gZ*)v@_H$IJgbO@0sQ*2mWP3GwY%ui94O-(bYHFsq*2*|~Al z`I=?AgL!vqVDjYNgLf*lt}z(N<3Vp{YW=Zy#{84pqSiccfo+2138z4a&k-#bd*kxK zwntK<=DjQpCS%AMzGx?&z63#e(mttTVeqrE_VM>VpDsXg-RAnv=!`rCQ6gY@WN7uS z6%dFFO?f$K(j-Sa{_h`JTC9tVlta6thGP!>zN`I+khYk7wLV)b<`Ul;*QSujzruY2 zR{piB$Moe;%|KJi4BZAhmuDLnFMD!nZRM;@+xR6_ zpV~cmW%GkyPyD&^&E-_n-SgH9ocKGuW9#^Te-ZF)`0^iKv+ZlI^SoFrf0@4hh4!{p z(@x>r`A)oWAJFXE&inv<)4K2zf1_4OVedn&;?ik$t#{y=c#$3_I>sg0;-z~QT)ViL zzOU~3H)%c5Rs0$3-J`#{?mCa+?Yzs?c*KC&DGV03CZdor0A&O0% zS>HUgTGw!M&+kif0E7+|8Gj-l%1#&#IBv#ldfkc@HBl8PQV)N7UImH)AerRWm!mW3oY-kC zUs!^X({PCIB|LlxmwIpN`1$kaP)-pVn%7R51$iDxj&h8lYA!*oGvmY~kQ@;&=ZaoKYvB>h0SM>+&uU@$#kM>d^(Fo8| zKb#e2c6|9(?;Hwhghy2m*ct1&xijAOW1?k%&d;L?^eiz<>?=$iXRq4*2=0I$RYGPT zW#DZ5;%z_9foA+jN^1=GHv4@<%1j-B1yO1Peh`jdMBjgV4qOSaSZbpxfT3LN9%=>N zlwjU;y37bJOofOQo!L>l&RJDCRJkpxf^x;Z#ca#p_G1pUo}a%xssfB;in?C%W&>>S zz()HJRq^qScPJZPpph*%#pu& z)8&j$atlvv*zr1Wo5K44Y|e!8>i4-V-yp~s$% z{My(}0KOu6eoEUm3TYJFp)Wl@?h7FD_^oD@FP*PE3YVJpY*YjYBL2LPM2 z0DJXXtY&|zIC|>1kWBZ8Wy^3ND|roH#0j8cyZoxK&a1hbw;i3er_yK7_v>ewMNUv2;h0? z+S8ww!IiQ)$M|XE#t7b2EqmR00IY^TZ=Ly90Kckcs3+u zx>p}SHAFAblAN5}&}Q2=pu4SZpvfuo_sBuJ+g&HJXOBMxu57M5F!q4b(wDQ^z6!?N z-FWIX7~J2ZEu9`T<}uFBS$t~UckyxCKep_D_YW!j-woaGFm<#mvuzw*9d!Z$wb%EG zx(4VL^ftYIXP$1YwSL8mJ>KmGkJR?3N2oKe&b*>j`r;$ge|)w@>AhfeKD_3uZDniD zJ#s{y{YdK7edc#F2d&M&Qsg#Hb&eM`*>2wQ+kly_2tWx z?P2jeXo^>*`1*Xlqr1;OaM_ok-<$H>@E^E`?%u+Z|M&0}sXcM^pH1QaKbe2HHHNn0 zLqkJGJ^$=kE^EDKqpGzo_R5cZ+Ou9D^V@V40j1boaS1aGLei#X48KP$z`TU~E7v!d zZ`G*zk2~~vPrL}YuEC{=r-!yTk=pAlhZZs$PV?{U?_a-amH(?HDDN6PvvdvuB;y}o z!j-dmBN*Map9@(3#;HR+p{=1yOgcqwOVcQ37Rdv*`gz_NRlc)#yJQPG17x zB4L%D3jb5*<2q89^#)GArQsQVWGl(PYDBOwfE12GzMSXB5X-iS9Gv;-__WBZ4pbQueJ{EZf0Z=yQQ#g5>m`L<#X8^yU`WC@ zcPFG6Gm2=W9l!I30+s$n*C`+k^S@aJ_0E@c+2ygBAn67VRn7d+RzI4-g?@CTjDDV; zKC=jw0@2oGWzE`Bb}vfi`p*mQJ(zv>cfuZIxiiI49hN%(X%^jNt&4r~I|X`q1QOFCx-IT09c;bKGfDX~gVf@8 z%Pkq{beZ=CI-pc{ONr&_dj`Gi43tCUWns6-&kJ&HIJhK!v%;JllJtK9@kZM0i!dgM zhN1Q~-^`aUk;9US*(ScyL~-Gze7(YK_5n!IkK$cA;-|t=9dv{olTxhUY}nV zdbWQWZqziokJ`KR1~`8gShs4TE`};AU9U{3`{_jXt5G|A|%y4P+R{=R$6W6H?V#>>Xf&xm>< z3B=#AnRxf;M5XaTTPLZN9P1LJ-}A#)Hkb7IT}$n@h0PRS257FDGgr8zkgs=(+dp|= zEQf&9BQl(_Hv$9%dg?2IyX2P1-ni zuO;+eGRJx-%)0I;Ky0vmdsfkP4!0}d==~QFlF)lRyX>Wdc@LYf_OP|bv88xdK%}WjlC9Dfe#HUjd^qC)IHG2hY9wK zBH%*VS^NI?H?RVpf!)O1DxX}yg@@P@7F<;_?gokN@n4y5_Uqc1NR*nGXvkQO-$0{5 zD!U6??8`9y%Do48nW6vv&rldY@L3TP`j&;9`G`&_!=OMlbIFo#=E9C6SA*r5R7JBW zb$~#`VpG(rl=rN8I)=nbsGc}OWV7p-HDAiThw6&&(BrfwRbY@ax~I;X zr2@#*%jZA+dChiNE~%o{;jmciJ2D_qEZL9}uGae~XT-dPb$Fo(gG*nwZjawXomy@J zIvssXy<~GcL7?Hq@bq{UA^%VBmKixb1*%r`NIv~PsM^pFnF+!?oh}xQpBxNSe^)l@ z@4H+qunkF~`X!w5vBhu0Coav(%p2iTWpDi#;|X|9&U)ZcgDdvvRRWnt0(S}lqp%=q zu)}_Mv*K1*?FIpm`k$|}PSIv%YMp(u-ldk$BD(F)zi-|Vc4bL)NL}e+=3D(VHZc$7 zZjAdV?)$AahJDBC&XS7Ku8b;kBBj!R$=$fVYVGqPk ziN~1jarDD%CEAQYfn`&pb1d)L&8ej=xyN10drkZjIZXm;HrTIS%>bpW2KNz!SP?xA z>49O$0#q1J!q8BMeF@xRmzCRt;im@M(cA>kgg>EGJ9CnmE9gq%R3<7WCY^{2Q6TLb zMVmlLh-o>XF^C60)$IWViQIxfEeuBI2dc%XUd{1W+~MKFRUqXwaRjW^C8xpD4hhc2 zfg#-x-i>-<5@?t~IxBQ=g33e+9J8y7`manvR20`o+ z=ebvMP;nnqx<6r7^TddwPY%H!FZh}-p6UI^pO!Hv)%Vlz&m;4GDH$1XNJA+!$FpSf zE_(D4?*th~A+U0C!Xq9Om{AiICi3KtA%U10Vf>n(k(cSrC17v=zJXZh5`F32vun=& zzzV7UDsk`3qX^)2w=hB{KUCBCBhP8xZ&O%q>tP680=uypMPitELW7}t#X9ieLt^cc za8gwrjyLFi@4pcJiDl{m##Rm#ID?;%2b1WpwPxkYXL9Y}l|z;KliNhJ4dliOWgY+x zz8lN79|XCz0Bl03Ei$`rfe^xmmk#Ek`-gk&hl45tf-3n=@7t|SY>OfgP{nMIaO`MUu6tXG~zzektx z7EH1-BkBeJ@-=3BfbU3cM#@W+PI=)Y#GBFgB$b%tHG%t0X*kzflcxrEu4fq@l&S7- z9*9*Q+uHewv&M5C!&?irp5bI@FthOiI)PJ@07 zo*#m5Q4KHkGz$X-$ZvsjKEiad8Hz9f=z5R#fJnIo$O>LkvYXyYwj+dyL-kz4a=>dy zH)WYQ9vE<#=)L`3V5F8-q&IJ?^TU$sh*H3EGyCyq5u(|(Lu+~z{` zlmO6E1}8?%JJeS0pOsrwc{M?b)Wrn0!vOG2p-wNW7)gnEvtmFgAVu> z12vQOdWI4g^jSqiL&Gb*6IS4IdE4~s=|-rZ=;hSocwMhI;n-0{OMUFAc)|G`u2*i{ zC`y`Q zfnFXxJ@D9}#0+TCW2+`q*Ht!*^B5r>KXy9XDE z&x$EbC~2EOS;Ni>*n@J-FidZP1v0tEQa%YWQ?Q@!KwQ^f9n55mxi0u)b<^A1oBMUk zjdf3aC}XFbOP3=?*8JxaM~Mk6zq8B<)D0!3Pd zN#tX_X)t|nLeYPvmnlb>UyQMk z$s11Tf)as9s)R27VqZ1nT#R?PdTe9NtdXC_lDK~QqzW#^K2 zr^V#f{PumemvhuYl+!$&fQWv*X%;9s>ICHSB{f^s$}mJk9x`6t#=oI#s5eLuG+ z8A*rO{>KPNa1tni1cKl0JqkZ7>#vII=#4bYD%r!62jUFdyqSM_)lI{ab6nyA774wR z1)YLlc4*?0WwS;qy5Vg6OIkhc=qI-?<(WHs_%c#LS=m^gvL_+=-*NV{ADIdf`54Iq zm?o2$R8GzX6DkUk6_B@5NXeAC;0ojtI9fN|NQa= z56_NrG<<1#6e37&3RG9Xx|%9*T9}B0q=kt?4g?ZV)gNJDHs4k^md6=7f5C!}?VmVK zA**O?NyDL*4To?Pp5*=q#E4`w7Z5lE4|OP*q`|TZL z5*09n^3CyZ>}scC1ckr%cC+2I)hZkiZE!iii9}OSpa!4^r%83YE#4a&Bu7%$*JnDb zz$Jr-judVA0@0Rma>~6|H$!?|4pDD$im0FiD8>qEeUBmj0Z?+@Q6erl77Z zr$6ik61`)?lNL;Mn!q)FthyD6Lof_^J?YBT9wJGC)xN73T%wjInVe=)!x;54p$;gp z*<>^~{APXw&N_NH$e(KgTjk#cERBmx2h6SEtgFM-t=&DO#AB-F#w9F{WNlaWrC0C8R0`#dGO ze)dBx+Wqhoa&vcYxIF{-Uok30Hqu@ZZgJ<%BM1S|7ie+WcHJ~a)(JUr+NRyoS4HVlC_zu&v>>4!whU6E zfuj*bjw+BNu8V4iXuv{h7&UkcJXzkNc3GZciP%G|?m+xUgVM)GNTaTZj`z}d%ygRv zK6Xz-CR_iF-TV(_y^azyD-`7$2bScBzsek?6|ySRTL~;@Uu7!V?^L zVd@|Wg<-VnR=9s42GhzB%I6SF^eF}t2Kn@011XT+BJ)uSrv$Z17I56(p?mV8|7((Uu}U=D{5T6C%-Vt}*`JV@ozfQ=c_^6=ehfQt^QBoa%_XYVZA;eFw>1VB zr+YrioS3_4%?J#YJ&!piAuzvsMfotD>D%_xDVhCwXrdG^l%aU;fjVLIO@rv2?!AsP-s3f%ujlLes(9{&bNL}Q zGwK&MHiK|u4E3Rrk(j;~1tXyf1s#j?O`8=w(LjEMm(}~zqJ8sUK7qiT&8s&!@kW)1 zn*Sii;fZ4E0S5Df)L34R2sXozu|W)DX1v%gb*SfGVM%p+N0AO#sgIVJC;(=DnEET* z)aBhmy-KqGuu@s-?-G2^!mY|o70z#H<}$UwY;AtBEt8XL)G#PZyJPQYk-*h2I(|YV zv!7)yYg2B7fdNMk~Jr!EBE(Jocb)G%Kx1jNQ2r1NIOi&iv} zXE}sv2WD!;-B){J@`fPUk@8{|$B0ry^q6A4XdrIW6NHweD7f26R?wh4U#S7Q8u8G6 z*cvvlh?*G8iY43o)}r)Z2F0x~Ak38wN1O`t*LzYf35*vDvv`;8J0+BU-Gr!H833^C z1ho?oiXuC*{Tare9n{WsHf4t5%yoISs_4!r$wUhQKGm>rGw&5RJ-yc=rd!E+}?nC8U*Zrc&7iztQS1kyQJ6S`dx(|{4wtX9(& z@EIzRT`DFd2lWtWBfP-arn<;s=$(;}6e2OCt%xh|+%5{+pjL$_&8cEH`Z>`XSqfMR zPh4!>|A*r>=mJpB(V~iD=#Zu!0_3RZr`@z4z5#L>0k%kTIVCKW(A{5#QpH1WZ~f#v8iahI`Zq!aw>)@OJ^JPW z6!qBI>No9&nnMXHJ*qI%Tf;5|;u?~gN{%Lat#{BETo_d)Y}85!_Cuo|F(;b4_tWfS zv^+)-$c9_6E8Rp>Gk}`N5r;+K7UvYT@*;>TrEarTVz&^t7@&c}n6;7mHT;CI07rpt z9jNc-njO21wvFktB(8WAFI9ooIcmnGWuTB2%K)AnYR07N0@N^&tn|EvtM&2q97bp1 z3se#ig&01&DrYW14Rrv&lF-&KSyB5)qra$Y{gt`fqv0XNkEOY{eY@ z;prCqFZ@He9w`y2C)pyd*uc0OU#<%vd`VPWf%(yh?nQ<2a7{7KW~O^41yL&g*Aw6$ zT5v*cSy{6}-H_EIoh0P3`XB%PGxmhDdH0PQH)xbS zfctRZQ;;|Gry+^(M9M%JXFXu=;;Nv1%V>57-0py}oFHPeM!|VSqo98U*Uti3v*!xs z6y)-|>BUzX9zqih6>hXFsue&6Pyv+=$4H4Ln`zojo6~f>Vu?X#;S1HL!{s3MMZ#|I zu-hdh(oc-n<7@Asb{Cq(snY;^uOX$R3!5Q4TlnA!T3eQnPT;kvm4__~XhbS_TR#Ej zj?Mq;5R)kPez8b>5RDzAk=lqWhM;pH2g@r|-VN;GC=@J_4xJYLSNZ)_Ol+yyLs6Tg zB}QU~RaPciapFrde?PQag>TrziRnd7dl+hIpfQt0RDRF3^t6qlbCLI}AV^KrMk3;3 z`pYNV;?28{z1a2JX+!W36$@jG8^lS%qiTAPa2i}{Un!eZz~NUL&Ila+c-j%j&8a4v z(MQ;%W0AkFLvmdL`jdKOkIQfHr8vTxgT*wIlL9^K9L0z8E#ad-_aeXaKHUJv2GR^C_#9 zUZBU0P-ITbVQSLoSx?6{(r=Q@2)kg9G5Jh^hcyY|M_vK#6Q0;DNQe-D zn;+S59)os-4KXn=0t7^Hp*%#1s4hjPHb6uK&p>b;hrak1XZzVXr*( z@-Q=6G1d>Wp#&Cvb&_s4A^;>bucK@rv;bAM&<%z#yJ0ZKHT58W9;Uhs@(mh^oAyP$ z%YogvgsdZ4R;nWli;9k2V_iFc6wYGR^BFjJ(tHFdRFagu5Taf@Do_PoO$!pXkWHY5 zEPxi}7(twHE~FQC1U~;g#Kab5_r)-uQA6_)E_bH;!K<| zI&e2z{gstL77i6=_6grrIbbA^#EsNs&n}UhupU*}s95_&l4r5vi zQc0i#kN~P`=#wX+zlIKO+PbwHl^H>mQ}EV|Hdt^tWUZ*6L~>Vve-~HGHqA~4qD@ZL zYByL@1e0H=qz6qkSB&`BQz36T*+QxC(74Wl!jqA*n(`5fhIDC33T7JG#^JtVO+ zByh6QVKjP`qUw^FB5cT~-d>vlYB9v)Ers>Cf|^t4u48Oa&hWAWA%kH8LxoQk*QSq! zqZj568}q6bo{Eos4qv{sg(~A|+)QfJ$0Jlf@HojtK>_in%>#N9zOsG6+vg11SA%@e zc6#`Dn4S+b6$`Jg1T~9(a8$$4;aN*VA6!Xm^Y)0vQ_zyD zr$Ti=_694s+g$?DwXh*}{TV!NZNo+}F*SrUv1-SmutYMC$Q>OTGMot0h8A=k$1x9g z_s6g&RsWgd_$RWSE0LmbQ<~9nc2DXO=Zm*1y3JF2GDUF85Fx~kw{KK=1&QLuras6)#8u8ff)ThUW|d2Ou1Aw$+F03k305rcoS1vFf6HmV17F zehDHOlkgFwHpfxk@ORfHJw+5JgKJUm&DqB4AB?`zuIiYOLh+3^H4kjZ!jeQ{VJdm{ zVIM^2!QbsAwLf4k2g(aP;TG8@u8xCSj!)w6OCEUc@%DMoki@j$)ilq->X51W=2_!P zw8Zd^id1qgO}Y=EvK7mjj>3a?E?`^D4A{_=nfS_k?YxJ7*R%YL8ReC_n38D*5yYPO zMFd&llo(Z#n)P|ssIAbpK^Sqlb_TM~!P`~BPsbTUCXE8~vP z-x>ZYeqpIRif_9F_jEv_*Zg<3c7C6Oq@soRs>fq`uC8r^22?9FIukUY8m{y^QtUF& zpC2P(eq)dz9%^xfqy~WNfr$h~9Jr45@|_fwf$xt`0kDng=-4cGx9@ncbrYcB`unyZ zcu+AmHg*$2uO_+e-aatgf>F55*KI&O5tq@>BCy#K$rpLD4Tgx?p29EJY`*$+VbM$_ zA(q&lu6sy5?51Banjjxvc{yLIL9tN0(gUNQ=G0A?(hV>Z6)TavY8O&c|DvC_=p%xwKKrz%A00JMEuMlFQj#C z;7=@V0dBVi{9Qw*4T&t^ywyZn!#cM1_xBG;*a-;8>p<;+W{?6^C2k6VyY9ANMG=z& z%TAySH5yoTJqsfz={4k~GbUj@kh7+>x3{-^C%q}ETL$5kKJ70|7nz z6ox7i@(tJ)%+Y9&gv3&4e0=-{Lu&Iwyj9x}k_;X;b^KLF?pUnnjk#|y)qJ)mcIMc% zGpK{y3(=)81pA{kmH+0A>DQ^kr0zqFQj#WF2rw+pslV*ki$klF&}sEksu7w){q>Y& z{=;BmQR?zBNk5{=V{*x2(Q67_R&w@2PT&All4ve{VJcK=L__Vq`9ZR#Ts;><5e;-T zT0fHR=teO#4SYX17hrXY#b35!9>{B1-UD5T{{X6igAWLmatnnoQ_pbtQd>PwIYrjM z5CEC{^mtDZ4f{p6{7IUcSYXX1X{AE0hHT?0&JW-GG%Z9r1PF#?75P#>l-}A&R1U;K19QrFv4fjJqA++`Z8<0%{pTqr>-VhX#+l zap5X>^>b!w_w30o&+qPiYJFW0f)zc@j@~@`FS!ZP+Yt`FI=8c?<}J?;eBoChck=kg zC!O)^+=$bIt1a^QpZw9^__i^jpn?DGqNaR#AEWfoYc4u~OGFY02i*9|QD|UzI}rWf z1ZU{sXrK{sgCSg1aIlDrFr+kn3XAM+>_g&n8F4*DlzS^7H!p{P=@@*7f50=$8>NQF zvPt<;@D2^*bZL^O{G|kd9$@xGS{YD} zr%2FgoOQ(`i^k5+>$0Z4+{IlioEv+jxuoBY2gh6m=@=C2rZ#j_Zil+$cGLworyM|E zOi|k_ZxjVOiT-$d2`5LRG{{7{hmd7cD|4DP>>_FYC8~)4o=LN=-hteV#$Ey0h(2Y8 z0rV8HBk8_)h7o8mEeQ8+a(mNPj_$~;4V&VaY}^#mcyC#kaHQk+e_Z=kZtgh^A~TCU zd+R#!C$iK1h%1t-pS1^=S=o|J&;cIR$^jHEJt(NX5vq;me{mlE=xXUnk+fRscoQ3Ym z4&bUo|6%?Tj&M@t473^X!KGCX&<3E;1!YRo$|V{D%136^jo_j1t5`s)LNqdL84Ye0 zQ`+YasoawWn7i6nuZD_F6*9cLkqXchACvI`CQrjabsNBgY3((def^e%R|+kL!m-7{ zaoMb>xTt@UVSV;_5pxvNocUd;b!A@wT-u8t{EDFKQ$Ssw@X?Aw2w54dX*@6Jg6YgD z2L_(2wC_J2>}9}zJlGk@dsx6n)ao8CfgHLM%TiftIO8uM`-0VhyF zQNQ120P0B6_^n5=f=X?N0dc-xz;!JMl41ssgmSPIesl(Am*`^n>Rm4-t6rSai`#-B z;jOZ#NJI}AL`~$bOS)D+BjiLxRu?%5gGq&ll1BRe#8Hal<>igqW8>_91{T({rYGQb z)V)Pr+wSW9tHL5$H;~aTWZf)|PWf9^iz;8)VWLG*!dDRcGz+7Ij4pg-*L9KJ?bQi+hZ+nFU)>V^IeOW*BK^5Fa|@7Di6f0x zE7$Qc00a$R%%Ob3woBK!Fcsli^{>;YvynutpE>LaqC78ItJQKi-;%NIP;>XdjLLEj z@U|?vX1pelHW^h4Vvy;){ZV|tV)CV>A=ZavP{Siv68^3{%g&B`2ub*P?o@jWqVx`N z@slKi*^fLg8XOArxQ+^ zgFA`|z3BCkCWM|0F=9um%7gDk`XiM%m^6(zY|-`DlP`e3s5lk{BL8QNFf4uI*dTe} z@B9yLpyx3QMI3qgA3OVFSe zPO5bmrb5uvE4d1S*B2^>Fi)7iwP|!Skq8vDLT;+#=(m+~K-?UM#Et|VkRuhQLT2QR zjzCJUHdTgpv88aGdx$eY=>ZZ~b%HjqUVKY@uA&+t2$nUml77uVEs_311JgyKhW9Pd zBXB=zT7j^S-&Bs*&bO!G^+53$aTszA%mReWxItVSX0xDk=HY?zb{uOw73GqoM_M2; z2oFANAN&_7kI_{G1pxida*ekIG1E^s9{=)1_<73*_RD%x_kNE2(0%I`bIn?Rn7cyU z!HhH(40RXKV|)8z2*A@wt7Iti_4FNC4p;Anxc6!kb}+xHYGj2R%vfhR2dtwh*5uO2 zX^!J>-@d(M@uMqE>qFSoLDFbQebJEk9eP~%5G4mk8j+{bXrtZKz-{7;rd6^{rzwM? zls3Y*E#$Sozs-EnlW4Rjjik7u{Pk;30ii#q|34K9k*ps++~xf5FB;XGow?9g$n?>O zi9D1HL)m_38!JvsjWOg&l32rRF$mg8ZB6vpd>NyVNGNr0CFTx#bo@EX0Hl?%jKq1s zz*k40`DqyVN|Q<=#lYiM-u2^x1sK^ZEjDSJy!;2&3(u9qTu2Lb8o3yTpL>(sX*huH zE4@M}szNR_sk$5OvllASTTLUw0#0n!9qK;w$<~sF($_{3OaS0QnZa%a$Of(zxV)a> zt}0iGek=M{5i{8zZB+?PoaIwV!rP|RT{NuYJ5FLYY`m)Fp(=@`OeRE7FOF_psjHCI?E5=ku$0Yd4m3?hSK8#!b)2tB^#cxB8c}-oeczCiYC1x zUP{~Ou^mfOK}iEHC(#$(v$E`BDxv1qjmT=-l_s#^{e+^}!d2WGLrq!afgn_1yo#Us zX4YdEvpfW-r#ceCb>6ZwHrsaSc~=;iTm0xZH9gH|ORFz)^_;L@1r&wva_R0m{D3T( zk`#ztdJ19>LQ_mGlsa%NDG1OCn}2JpqiBr1;{4~uUq;M}%>o%uWGZSgyH$cD2Jbnm zd`eHjP*vS?Mom%5#nS~ZSR*oq+`sn~F*9_CEfNtZ1(#}nDHX=T0;~?e?Nq&>wTI?g z6o_wY4EupttVxO9gykXdC8xH^t$zH5`NoWUi*mSsIzBD%SIsD<#9{~^ie!-lD-aJC z6W#dJuKBaVjRndeY$pb%z*Knr(N080~((*1gc(`Da<0x|8p_N z2hT5+V9r;eIDK5F0oKk*Qc0JQlTzG5$nJ?rardyL9^5-*7a^7a3wIrnKrwAL zlz8U|2-r{3Gz((Lz#IwG=TV!qX?xl(%d4!`dIB3qU$3CLK41FhKitOoz`FnvY>1wh zoVlnPgUSGE&=Op9U|M7PvNARIA3Th1-8HJ;G*L!fI)3HBcCroC37!XaAABXa%DC5$ z8h{E4X-%q4S5GcW8lL}Q9f;ovYJhM#phd*qXoeyQ%@<`TpRR2zW33m93=VoVvYUgI zQ~YBmJUD%)O&d1+K^P=Nz4R>$fe|}Zyv~31w7$OnY;ULhz6Bm*lasr}9L-R8kwf`C zK}`ha?`;1g;9FE@W%%fr(ad#4ztN{>KDeh9*U7(U_Oq-wCMl1*T5%{Qfpv~@@L>-V zfbp3FV7x{bgHL#$ed7Cz(ZG`!>+aoYC#=QY-#3PiFZxZO9ob)LCKop|DHJNG7Q*hQj+wq#W3dnDoy2j_v3UD`dbJCMV8BXn zg%|XrF(JVQumfxotfx<5Uq*Iue*Wi<#?Y(Y*`W}ASX_bTOZ3Kl*iV9UBrl}Y3#aRp zU;$EKp)V>|DMqhy;hq*%u%>VYbYZ0K5oDK6k;sfo;AHM5n4tNm&=w!)J?HU-E9k=vk8IRmokvRUW72J6qX*a(4PxHJ+SV&L@D) ztnL{F7mW&gqOXyOpe6q6s@WecgcdR?f@`FshR?p4V=M1eCI*Rm^-_C15@)CIhY@Kp z`k<_7QUk2e-bzbrYeV4lId3}_L0o5DLmFH<7)ICj-FD!>7#3Oq!1pxQLpA}mr<{pN zgKmij;J->2+BDBPfbLfKc+^pWB^?un}htCZ8udpk(1 zd6Dn8o!Qf;B=L`E50r-P+;O!y6D_A+xzN5HQyktSdITVcF;PpN;ayz;$)Dl&+r`S+ z^+BJS_~)xZ*}7rgdH-n0`8ssLskeUG^jQ!&ciP9=<|!MY35#}A@Ek@jKVig%J9_o( z-TvaGYB^HS#l3nuV+T>xF3+&Gkey^b_h}K-uF62G;H;(2nYoA3wG_2+YFXo%xg2&W zZlO~~W6!x#D2+!HYxAsH+136v?BV{I5%wtY{>Y%o)^^$utn}%I6pKWi>{7{1(8$?f zNXR1sh3=Vg;IBly@XLT#RqnY~bP?<&D5s~T_oJlEMoWs=GPn*H|O3PHycN-%?NtXExLGZ(=i^C=Nlh<6L6gqCS&0i zfvMCeX;~IF%JN}+4o6^cctS|yc(fQwfEVHpqst5JlbZNyr)kz;la$ve6}N*^vG%Zo z-QZN$>lUJVqJIC!fF}@!cQ73M@?}vK;6;@!4|=y=A^e;64k=wtBwpDCtW%_YDR6fe zDv3M>hVS0WouHm0Y%r70YDVS#8B}15Doy|82JEd*ptEu8B>wdacc#>2ezC ze<fD82o{Ne@#m*EgM>I9$}k%Yo!E3o!VvF2M^>HlR__)F zaHt`lVE_#uGyd^)EPEApd%YMpF)FR?U-HHvX0klM8C)jrfYw82A64VBg=t68eN3UV{awurgA8dWOa=onAx#;b7+17@NN_@bsPo6 zYhi%Y8_iG@6*h#&l`#0MxIZU5yE+nDm^1}rVd*PnB$=!-X^>ANi4J9qEy*caQ(f5`!?l|ztYH9z^U zo{(3qBSxYxYF1QrezKjk9o336g*9Oh`B#T9OONUm%|lenSo;gJCULu;9i0X1xArUy z8bT8RGlK`TyEe7=0025w+?bxXZ954B#}$42mH)IwYm5^TUBRcMjGQ( zk*|S9_F+?Gr>_%eC{<-6!;wD#4-@>`)rL*z6TuZ4LKPhe=w%R6ER?KHSN7H0PfOHSaM+ZEA zUNUI*#~;imR?qS2EN~GYy=>pOq-ljrr^r__-CW$FHFb^R7L0)?%;2)>2wvW97Eerh zoK)WKQEC>3PPVRw8rzm%_XC$aic4ffb0Pm=pm@vwT5$muM@a)fJ*qQGkr{wljl+!r zGUwDLZ9;R@;>8?4En2iwSvHggiItR;Y%s+C1t#KbIOF5ikHO8GLDpUhDS?_uKOjd4 z{rvykvHLcy?DkQiN$Ktc>*0i^_-s$`$E{Xq^SUfsc`iL z;NQ)2RDa#n)Kt2NkGktQGb0T3<9y>hh#?MvQZ^SVi7)+nsq|$7hVD9Z z>$uUk_Z;xb2{Wyx@bX=1S9+J3E0`~~N_`Yj&eP~u%Y4==^SLj*ZG%+fb!*Ayml@Dh zW=5sR3HQ^8NJe>n2K82tH=lg^yLO>B@ey>XI&Bi6sg26DpSh&fkP-^;j{@>4AORYI zCN4j7h*G`)#?*Xc&&4oE+mLjW5_2RkKkx%Tp<~Z0Hp@Db{@ExiVBZI2$pLQH`DpYa z;61*y-jlMrQ7Xu8>Gt}(OSZf@%Qu5U$SH7;O)s%AKRx})EnQl4uDfn_CQ4{<>D#jm zixiY(B~`ADu?!Dg1Lr~@1l~u!epTlFZf@Ml*x%{}GBxJklIuCMRE57WGy^u%WKr~y5jNy@gc+V+B@%V1_oGrdo zUZm(g0$%jFh9t^5;D3$CIucbJ*|hfYr6JUYgr64ZYGD2aIE5%~^_5`W5eUNBxtELo?PtV8J!z+_CVWLy%I~*7 zt_U(;l{cU1jO~@@h@rl~&@C;;a+W@Lqho1=siBUOa@o>Hn1trw zjB2Qpp7gdBlJiG^>z_CaFejXuRRG+%OyD}t?KDuq6d~;*+)Z6Fi&+KsAX?*F^O? zG7munP`;F0#~@q0!-Pr1XYNm^+=5Xj=J}Z}UvNn37RO<(HmY>E zb*p0_kITYx{$YNK0-6dy9JK*~$o&ZwO|2Wz7>EGaZDTWQDFS(tv2`#&efeqzx=0ii zRpNm|chNip!}%cxE-^)9&N)I_8@tDA>s=^uh$Q<-mgmU0=jBbRS{dn@X~!PL8`|i% zvNT9Wp~@GzHO{9=5-3X0Wu{>3XFgK$c$;u%Y;1X?P4@NuEFR}j%*9wxOE;nM@x-R- zFi`!waDhV3iqU)$2c{14vt6~19~PyvVuA;!Rskk>OHPy6H3EF zDN4E&QGoK9A`N(?Uc7g^in$TthE6|1OtP4W=ZH3l5+VD8B1bQ{YF*IkhCu(>@J8^* zh$5s=9*0Uc64i9Hf9&7ZQa=AW^6^jSZyUrk67TB#hPtmtL5PkdnF-kp?EH zfm$aow`YgvXruLENR?t`L4G6}sKZRgYdtN zplTlhB-SH&mO6^yE@Tr>J&5XqSy{fcUJM=3Xrd?AB0Eg8E6{Bogil_qk39_C%}lQ!CENx zGO<<0a=EzMO35{4#;HAT=e!>pG-fitmHoqubxQ@6dp zrfu2QP2VYb5^szcJ=PhpO2Hq$3m`bEt0pcC9dSmZG=oDK{|uvk$rj=2>|BoU;Jigv z=~Lp~fcdwmiW=~#!xm_4ILOVSIv-p&p%g?@Q2|2T@D(Zju zq0r_czQ@2K33hv!4zyR-Ez2MK91&^eeLy z#542827l&N%{UWI`T9Pif*E!(X1d{F?))=ia+znqXHlL_f$T?w%6?t5fwnF4=lVmt zD_J9!G8$Vi$5^r0tBgG!Cz?sZ2mvgJC$)bNQ^MwhS1wLMfx~)`;ywm?D&2d15*Y<~ zK3EdP{1-@*PGL}<9R@>d>)(SBMIOrwmDjVae7)2uh1ujPG-2VR5NTBsZyt#SwE%*C zizuZR?8#NK-4EQ|Bw|}?4@+&%9WVGAAkIj%5qAlPoIvd(kzBe2V;D@4KXgd zMnSDf>q}LjU6fra`Gi>0c+(W)X@sD|s9+i3NMhoad`v98KboRtV=6t4LA{aYzaj7l z+0gC0Nchs|t5`Bq;P``x#$mF8{hCIiL68#HuBrpj(pvS;|(hh1ih*uOa>X|W` z4ZU~h_3#>sviwnQPTyJWJ|+ZX53 z4R49t|2|`5MXH{LPvP7!Jc%Fv?Qw_UI2F?6z}a?TyMX{kdaV^sx+VptDlRC}oX0$&yt25?6) zx>1>8c)Ys5smNOoIB;Sc(zsjR#x^tp(`YjQNYoaK6b+CrO1Qxog+>h{2s*_P6Olol zz;H5<+LYfbuDylnIn#$>NXmd=EQ+p4zZ$ph>XXm2A;cWTcie$luy7?{ou-RE;l`}q zD8f}sR~(i&Q&n4P@G0L-c){E1qnN!*<@4VidmzLahW=!lS~P(Z;*@X&7QGfPO9CdO zB$P8%_D@T*zs`cFofcCXDlMiR4w7h| z2=CebpD8%M{;ky@C!(B?uf%AHXOUR=ul==uGS{VEmaF7Lq&~5aduv$UEeZbm`Wkz`V;WmS1|6D6@n1^T-Ut-m1Zba2!YK6IH|)l${>9fcp|D7(*++VJ-480 z89+2}SgoQyNetWs$>-B6m1Gr^wTX|0YQXLUSKu7fvj*T*%xD&=bp)UQAn-;pRe_?W ze{5B(9*xqkx`d#v6UXC9wQcBLW(|O@dD`e&$QT{mGMbg9jt*xksDnOY2;+LCcc7im zif{VdziMJ0s?Zbi^O^}pnv#F?G^R}DiX2xC`%5HW#NKPooXHbnOoKqH^%MY8 ztYp+iDAp+`cwTLI;4T?#_+7KBO}rYZ`pA*j@vr==f#N-e1_dy@w2)Vaa4$kh^ANIv6j?XzcDJ@je#E2k%&ns(3z)MabK0#JdQ~0APjzNmKk-}G)Obd@-n+6Ec-BU z{uJUGVfB7g6F9d${g^wVW%)Q z)(cLMF`~uc5EX!cXqE@dF7O(94*Q)sJ7bM}qp0-<8Dfqjvh4=sz&8>U6{~|*)GJN1 zNK{B*Zi%9b0J_O&ycAe&lDwy|XVljJ^cz!V3)P?weOTm2J z#HfO>@Ge`%rIj5h+5Gn=mbbAm3v5xG2pv(SeB_-w01y>H(gp;jCC_Y-Ed*TqvL6Hu ziuM$HRoRGK2OxlkG}B1GB;6FmEyQN-K%g!u+Ue>NPZ|1JtMrciXtC7NuKp(R(dW z&SJE0f%0B2o=owd6xJtXF{zF^6nT&omxbwZSq9 zQU^iiMAr@*v_B}a{-^{y z#G{_9L<~frU7VSAYNg2e$ep0%coZBq_0lpOfoE{AR`75nwnNlKq@t=ASgA0v`!4P* zr9ALWJK(O!(Z&@^JqLK1*4q9X=xxYPDp8bzsO3>uv7%O1UYZ?DPMNw_s7WSl_yh(% z(S@aEu28x25GFg`BSaYo_Oa!)=zV-<@*X&C-9St)*2rwPv$F$T?GTw2a0i|t&wp+= zJA=5`e7_xIMHqi1m)2;XpO|PJuAS+|(EtOZB1T(oP3R>Tz+2$(X9mo@zAe1aILLiLPv5}h}V;3>Tm`rndS7ap5z%HX%t4YQU zXzlB}ZzK5-sT)?EZWQI`2M!;uB4Q$Fhx*tQ;#R?Uax@MWn*}3M!tWAIMAjNAzDY?y z$OVx@l7s^~ElN;TqH%Yl0d)G%C}j?JyuE5u1f~fV&I@tCH9`7n)alN0Sg&_jM?0uPr#uPmgh>lCP#)NuUVBX>(?lU*S zy%Jm?^R{=aK%CIDOWGu$w%vDiEmqZP->w=#eCpJX4(#R0rrOkQ85|sJobHwDQ`mM_ z%N2x2x+N6h!o*T=M9dcy{vgJogbshuA<&-s1WNUHrB5N?R6){BiB(dg*PLjN&`lm# zY$)D=3>vn}uaHIxV$UNfyar}k4ssP{JUzWDeH?mw$3a5^x$WVjM?4JSY^{0o=c9vA z9lfMTQW8|MY;CCN5b1;x;uF^O|5TA)wMO-#b;WK7L}4#qlc|Sv#hFjNFlutan{#GA}GvlI}Fn{Zh7#F(N1piTUMm&&nYtI>CjrhjL3xi`-cjd}|kojm9# z%u{uw<1Da})nWdZ4)|YsyDbG%S{aY~#}qU**j;CAjmwQ{hRvKCi%SMd|*G$hJ zl{aHBfyEd8iN9a2$XK#l&}yBP{+`t>@lK%ByW>6L7Gs((m%C5XR@0ZE{Z-<_ z4MCKkvK`#{?*bEU@}{rfIQV@-9diCv*mXm*dNiU0{wc^JbKK*Z*(O@>O>XkpfL^a8 zW8F(Q#iY9=DqmEy*-aL9$Jm}bl;+Ye86>JW_O~tnwLfNu0C(E+{yn~orQx35!yi~m zo&gk~5e@s=`pi3mS$)=YG)863ObF-opc*l7ed)FJ3(vFIM{Rk~E{~;pwBOX!^jhl< ztvBX)GkbqC+wuVnv#}f=5NWB|y(1*$S*V6tkNHJ44x5o|?mji|Hi%u9n2Sn(ACz{4 z`W9K#ViD{ox47)C<**{>b; zZE%w}6Q`{b-$lE?a({EySPtLg%uHJ^ZFHWp22S_r#d$C*ZTNBipP`sAEobb%!u%9l zo%z&#Q=67sdpdq&c9JxTbn#mYgor&0p}_Q@q^g=|GZ4%)7&=8 zKE8(oZ$nHHO>XSTj(?Dw{VNye8VvI8WC+;Ecm+dGz+REZ=iokN<+70iR9)QUH(m1n z-|2SSiL$_b=H}*pEtw+;(dY0@OH{?=aOCtWN=uiks;buUc|Cl%S2JKu4Z__9*TE2% za}94_43wC(Wv8w>RcC&!zqDEO0jOo=h<|~aycR7lV0eEje9G$9Kp$R2M33-RzACw=`WkT)R!aq7dr^D zz0+kL9(?H^3%f}gHG)s-li9U_vkOhHqvE~;gr(_l;Zu2Cl&m$hw$ zIIK_s^kFXieSD&12${7YgETSgIU>io3KDRaSN}6_wdUo8qEyRIxhY4|Qi3(|yzX_b z*m~_uR)_QxJ>LhEACy#VBk3S}K|_80JIMKW@SG57TmIAx;i6Z!IBM+%@%xiP-LCFTe z0XU;5D`#V4^LEe%yXu1Cl0*al*O#~7c`7Sn%evH$!za?N8REiKWQn@WPCZ#G79&{r zhF-iwaV0~^%a~fspzRYNU!V@G=x*TDr>*CGzL7oi@6ldJCkOq=@lNWR_fO+ZE_&7?rZ6ihu6SS?sUq8yh&b_iL_)7Z^25-dS?&4_AK5&?dJ)PUpRo{O+0LAx*6dPvn7u(iZUr!Tv! ztD4k3cH{5#u@9ZrIksiDtvNt;yYz|-@1YG4XEWpco~5Ju%1Dr^-o%Q>!NI>`R+q&D zNfVLA-6gtF_I+=rnKQa&^oH8f7Y}?kY2QC`Uz)?c=k`S0x9zE?<;Uo|Ak~wc0ju5?pvpbE1ZE^-fOrdjQ;4c8@eOEY593Y z?0e5o?Q$%aMSebq`!>|o)s;AF2YY_W8(X!0)Sr5`_XvuJ zf38sD)*FilN*0@)?RKEmy|@Rfd-uWF51$(uX7|a>Z)W$~cV@Y)fN3uS&9gi%K1+Ar zlTS2p`N5TwRqk4>#Lqtuma#KVbM1bH&HVOD4Mk78Xl2D>bO+k7vLT1hU}c}IjcfY4 zvXUYH*$aE)jXno+)3c&owwgTRx;I?d>#O~4=7*MQv(bA2Hg`*zN|z)4j63!1ZBqZ7 zsLi!(Zo3-uA(XLJ_t$WVzK~cVs;l$O3fK=RF|5GXUy|`ky7V#EatxpC+;k!q;k0G+ zSjn2vyVo~bg)x2R6R-dCHj$ofo|XfdoB0PbH@h9A6>wo?jw|#D)pynPs(I&^$+tyneU?G@_*jN|7tP5zOm1mdv(6>H--VN_M`X=uTz@n!Q3Dfawn*|H;L?G+qhZ(LL# z`ZWi$Yr67uCnj`{m7d9HmeulKd2`>$ehL-WS4r6ZC}ZJ{JMl*SHbR!fM;X7o*fssr z`;wAh(8s-dS{>zI^mm^Vqc(Jz(NDI_@_l|(dtZdJ(*n4&c5H+{6pBGJAXf(VwiOM(W)A)*FRl8IPc$zNO)GeOMn(_?3b!fY@c5%bj+(Ya9+jMBR?z7W1 z`sa~)AD-!OqX6GY-zHm;LC?0zZmEIcZM$vS2a62;x@*`xAf35vF=KqKl;(w4N?lRe^d(jCFUFmKd%5VD2p~MPJ<^S0zZblW#A^))al7q z1>TfRq!i|jAacF+jP2;-@Ve5m%)scn(zV4+8Qd;X)@N5Mhsr4^2y9<>f{kygsaZa8 zQ=Qc5ts{O?5>l2EnnzA}1X9#2BiAq`hbmMtZ>=(zgq0VFo2%ziEkM#f3=M_SsbZBv@`v> z6ESlB{Qlg?ES`I7`qVghc-~woh|Ay2%)5pB>i7Q`aha_Nh)Yk1#zi#b z@m+hieT&U$8)sj^_4l6D>UBF9k(17L8fVApH7&m3J>X;W_?m&*+zxDg;MM*08#4ax z$)pV9i|4qtMDdEGcX#n$f}0Go;Np^p)A-`k4(et%PPe=>;fgrOpyO?LyuRvd)X8{( zYMWK?K3EC7z|*eOa7(0K6YovW%O_Z~b^En+*0tyP>m7rYN>AUzF)?7u-zuxUfsfCP zP8htg*nb^)hmLU6vwJ>Ec@NcHqu0$?%DH^H!0M?{QKAY@1IN;a-?rijMpXkyi|?$+ zOx9Y&S|`Gc3xmv*|Km?e95*2^{8D-KeW}O6I{(5$JOiIz47O;`3WzOt+*8}u;G?4; zpeq@_GayUv2uxhRaL?fNGyK!e8IQxW6&MlihlYB?`7APFp7NU>18Li>jwR@bVmR`6 zfH-$hHMhE5fUlwP=5Mcvv*Y!P&j(tJ`wz!l)K%><|9n5bc-r#?dsmBFQ=ucYGPPzN zubW4C%`RWq-3}{;m2MG1y!5CxO=~BL;3bck=@}})zvOY49b^R7I(uw1lqGEPZa5dt z4sk9#`_A@~Vjor1@--S^>=fe< zaYV;zE0O042;22Ob+Dw9J^e1DOju9bhH)_Y+n+roV8H8+thBiB(*Qx?FJG3QFCbzi zi^jwMbFPD|YCJ7_2Sj#d7Cm>(Vx8pR-#Op4FD}nam9K93(uU7g7fxs(37dqCT#@-w zYY}IYiEA9al8gmqt^YiNZW`huwAfwS=>Fzi^uvSuBy0!MMSK0qa8%xBik);H__DE} zrQbqzpMu%sABSP9IfgqkLc(u*Wzmbk@Vdfr~t` zsdXu)iaP_-f;9}+Jp7dRzWtzc#!}YWDDugTg^bm;E%**0B@l?}*w)?!`PRc-tvT*^ z*`(Hg-g6*(1>O@NX236qlrI|)%8-(_`kYNeR+B1g%ThKD$;s8B*WNWBugnd}3S_TK z6izfOJkvVeJcgtr^QKjNwpr}z=`)!3CkVt+&sK)%>p~igP&U46AT%CEa?Ai=aR0%tL$fI1`RJI z&ZM^=&&%XmyL#gm&&+=B1QX+XS>&W%Mm*Ip9AZ7OoKD)>V~x=nj2zV7LaByw^RJJR z?}S7WvL7V9D=>GqZ1%kRzP|iRK=%WlH{R3vUy@rU`4VAR`ekot`!q?Z_%MF+$&ufq zkQ~a$C473Au*~sJ%z{O4%~yVXL6+2DiXRp~H#Fnih~(^^7nkPhGDWtu>D1c7#RK{M zZP~F^RY`_Lf4fhKPDDEL54;RMe*nAA!jit1tY^<2ZCNvkt94U%?yTjH5&Ze?7c>8F zFpGVkj_#xvGCdM$Ez4yLMV<<6%)njVPbL&^2GW-7%yI~ zFv{bIU~KQ6?01u%*^Ib}LM!H@VK0tln6V#M;XR%dmskxmZ3PL_g7l8v$#UrtO`M?Qc=kgSu$A z-wa-#gMH2N-(IZR3^7!5XWg1l;`>ha0!OxuPwbFylg<)9_O59x zp!@i{rnQ4wCswRj%I-V;kM8nicD|XW=IYd7sVe@`$1g>tUBnIhy)COtkSV3O5C*`~ z;6S!y?6#56y@7X+7B-Cz7Ehi3-MPl@w8zl)cW1YM`$Vbe#WB8D> zW3MmDrR&Q|ue$u`^MS(Q*vwdOtt_hcI$esKqA)N0w>;f59= z>~!g&>o}k?&w=Lx7E5u#|9W|(ItYyzU61Qwzmorp>jzks6sotpkXp?i~+2;r7=aT4%=N^48+%6oD>7-%Fe! z8q2RbijLIVG-vbmuR$0nQ~Cz_Z_J(J z&qtWJgqdjFXM%4sj1+^tHuNuy{rF}JM%k~yr5_@s4hI(&?&6{#Qm7@z)ZlHupaQzT849eYHp})dzFGZ^Zn4ii&{w{;EA#Wo&Q<0h33}_?g3;X7Bjj4sO{sGf>ww zBOEHxG+ty8>)xI|SX9un<{Qud=>3CRTHc&$+pAzEP<2EgDl}y{amxdZ*+kk@89B;; z?2Uu}8#e)E)VcN#Y$onC4!~j6pa_<^GSWMXzb)(K9LO1Tin0_Luc}ga=e*gmeL5}o z6y4w4$ukL9!^6|4%81gwt+aj54u-+5Rz^EOH3S4D5;jD58oxQ}dnaNuszqfxv}Z&1 z=@=a%XA^JExFwvQ+S~KMd$6Ed&V562H*HdB+hOg!ySdf)&z_yFo-Fy5VWfUpwhmR5 zNvf(KME3GpgXs(XljG!%>oxAidWTmu^+z}lELiLUpeQy|7}v=rf%z^P0M>H1h50l0 zZ8uIT3N0&I5(~8Mc(&<8wdkl&;w@!(_N!I6^FK<1r$4od@HjD1 z*vZN1F=z?zF_H;fkAu!!(o$Ov`L2Yt&O7rSUOh0XA!%xo4W-eu_;)IxR6}g>LQU*u zUq3&vG}eLF;JQ{&U&(nb{|0cnI2UkSl%c9;)%)*)WUaCo7OwAUN{W~!*iF4&OGQ7} z!&IK#M_2<}m+#p(&keOdzKej3v=OuzSniYLEUkYLP^=OolS#jw=gQJy%!FYnW(HtB zQUIqHbG0|ovNLnDSiz7nUt`*)5phfTAj-3qLOCWIw~2bw__xf2l)aivhmc4|x% z!xvh>Z*Tz_@5o<^Sf*YV6}d4A3JpiJwYBTf;$O$t5BdrtR@YHS>b3J~Xu=*{q;-g5 zB@gH{9#!(^k_(7A&iG0_9*nP){$(+$ng|(km6HnlmHOLCQSLe1C@ifw({)`l|0l7M z^755-Q!QLA5znKXP|8WN4nQOZ($zh5{N+OXi3=6ufgC*`UCfPy1ciJ2$HPmb@ zQLW9?IWLXXUK&@_PR1gsl@uRA@%nDoR4d;=wYF;x`s^QvZkC)J1gq>U+Or41j*tSq zav4bAy6TvHzz<>f_;=LnPLKOe0B283y{!%RS6fxk7Uk;sbVR!9aop~qPp0qnWcJTh za~NesUfqELL+wt(?n|64lAf8VysNX)g>w(H`ge1eyr_p*>OlYOOn;2!Ky!SthN|kS zrpd<9W?#c7M{JbnOw;V7-I1fsKk+YH1}2dcsO3V?S+6{SVSKq&&!0cPiy{|4<|E{a zA}wpdr?#aN+w$!$HYr9GcQ+$&A;l{$))GKnaxSr~AcYJ+)$G&)FagYYWRP&mw zJLwXKkA1avSF{=`9Zm>77vHX@n&%|qk)IxDBQ3hq;ZR2))1|%I&G73A)$zKgRHU*H zkJk!PSW^5^R{O)9Mi3A*N>O22890``^>I`b@78V+A)y?Mkys0$c;G?c)TXVhmUYp# z!_TYZ&nwrX6Xn2HSk~U7+}QZeUcTdU=k}_Sn{rp%?$%im&7D{wxYtZs;aH`Dm%HYl z1J@5*JwO_c#6h2N^E;_tKi(+h*7KvujQfTCxhoKK9iHhf2ON&_S*iybMs|js6X?HO zp?Z8TC}2~le7!UGFz$!;pDQd>o~!Lp$Ume8@o>1D82w|aJ0rtg9uA7=^rq-%ELbTw zULNcHTf$BU=U#TRz*DPS8;15>S$+7yMnxW1_eMm(lw`4_-zASAo)OAt;xug1mMODA z_4#&@oci`-IZu`@DK=l(Apn(AE)X`}8hgEQW)s>jH8bFv2TlI7Ap7xS02>iQ%B!mK z!0TX`8t9(=N_`WSDCb)k_Hj*j$noPcQkBu7JGn0iCA%$$12{k?y9>hj)-8(uYtbfj z4`uXyU?PQJGy!5LyzZ~U#`SB#=XM3RNen#ToH1OGb+8x>FNSSlN%EG-aV&!xiGhRh z*Hp8lru;&L>)yDCkl4rDkMUM}CoK1o`r*LiYbOmI57tymxyh$b=ju$ZMn;iH=OSaqJ%YG_*bk6*)nLGftEJ{JyFNHtu$hVr~qm6n}k=43;Eu2E8h=NIv& zv0Ra}Xmv5oUMBbC8d4&NQEeQTDn6QuV6`Q-fVZx7fP$;$QU$(-7ec#UK&?P(B*rxd zOgj#)sSgXtQyHz>rIUYuEi!{WdpPh)1H~ZlEL%2!-^t;#8!t#kBmCp1Pq%~)^Wj3F z<7*$LGbhf%Q!yWpPNI+*?ytJ);i`%l6rS$ve3(DPsj|FPx!~;I@v&mHpij)i(HN513!D5^Xo?4HLEnR$$vu}!k2jj}~*3Te-b z6iP`*+Gvra(q39;%+Q{Qgp`sjEz+u$QT@`MrG25FHf<`}m-jl~nCJPw@Bi&HpD|*7 zeV6+__c_dTngGlWAK?R0}ZpCZQMY{3V=7OZBTWu8g$XTGvkRft1#Zi<8yzD zqH#BEHJE!mAH|I?U!iZWnUd0zdAw&u-so;U+n4J!p+rnl`}!_-_F1AV!u>_jx)-az zmFh5YHT7Cih{k5W--NWpf?d*gDaeQ}FOTy@7=C^0S9x?1SZg)}mCeTM<13iJB)ok` zdOp{Vbo~#NRq}*Cvhx=COipI&sr;ed1?j(4veH_?D2z6PxGX^msNU-*eK0{|gH7R0 zd<@W6U$u{7kOFH!W9GAlxMNRkN?c2@`}_HZ-k2I9b8e)(S@wYb+2?a9K^txCP)IMa zNli_)fdqwxnzdJC-S=KSs%w{sJAZn|CkmLvUIlzb8?cl>3_$#>mrRWJE7p0dsiV2f zV!2tO(mnJZ#7`X43DMX>ZPJ*wfv~8{e@YGd=d}J|n0xKQUtK$ZXGh=9FVRG%Szf?E zmVM7LR#xiV=LPZ|YV<>^7w}chQ~319tvHOQ?kGe?(h85l=C+KM znduQ!hMli~xl=b?2B`1Oax~owpnG8s@S?|M7TrcCb{{^3*Yhw&_eq*nSLJO@g?N$m zYFqr~ym+l8IAld2DK*Vh4Ru3@pN`~T|Ne)#^yPyogsBT3{NRXOv%S3u};mI&xdqM*&P8+v>uiBcn*}z+IGB1y1=lQ_@qiL8}Ft=2c z6YqGE4PA4A&W!s}YTbyV@$R2EaSdFx{O1DPH&egV+kSd!9Nizu|MiTx%koY-`$2-IpeOJ{EJPw zbcfP!zdaXa-94!M?fHJFzVLSYz$`KUD4B{2PeJG%eQ6-8N)$FM{O=g-Rn1RLb?e$mkw21Z;SysOj}Imp2OyJ z<+jp?I8yn#wND~8ol(QZA6wq0HBTk)Io~6t_9kU@>ge$-8HzA`J^XF~0m1~vZ?M2q zx$F0DZHR`79LhA|CL7m!^H|e0Weo~n9%vNMi;zsF>3IWh6Fs)8KFExP;4)SEB&3K0 zJ~3ab=OKHFGt}XlZ+2ui@=`RQZlb@l#>i*KiCi?}=Jzo|Jn zQa0Dub$R|g^_!R85*o|lB_B(zDKGUlWWjsP8&wp?s}^jitAbXYk`_uZdTkqF^c)eR z)TE8cAPv09u&@zX%jA>z0KsFbCg8u02Q3NvSevolb)5vD-hiK87aL86Jg;&(-mxjz zB^HoK>n9EWAka!8-a0H+jFCGxyruZ#4Z4YEx0z1n&e%c3q7>+w z-N`$pkewNUy(fPBnU_e+M-N{=KU@U3^Z#CiSKnsTqS!db6j)I`-FuiB7cXz`me;#Z z!u^L36U!#Go7>!#O5Gg~qp^DV>X%|XqNzaM+gDTR61+Y$-Edq2#tEcKw?BTdsO0y{ zBQlepUTCcvL1-_8@<06jHadtU zrk2GrGqIviSuOkZkq|34#s*+d$=S={-6)p{}qSqt7)Ft#U_59G~x?6Lx*bZhxm6yu9;p6OA0h-xot_QC7g)7;4n8}i&v+>Hu z-p*18vR+C-VP%Zd4h=Fbyn~u=HBICT)wH$7Z=?2O`#uP~5r7)=rD}eW&s2J7(dSNj z4(oaKmfJ<>bC+~j?di^rUcb=$r`NV4jXZP+H121Rvm$*r-uE;a-NDhUQ(8>370Y9u7}(yqC?$HbivMd-0Q5B(7Ikqh9YH-otE zI~D*ejhILY#yc;Dp1z}|so8h?0Gv!4+piz8Rx$hBZ8#&73s9&7S&_ZP(@9-K>BwkI zXz_y-fuV>xdxB$fH1)VKLc;F0xR3XnZWSyEbDx+0m-%_)#t+XmUp@L2Z*$qy#n1i^ zHUwgvy#D2DV;}*n9}jgo5A9^61=G3+U~0thF0($ql8%I+dlx=uKiZeDY-tB8*sSMj z_sUA)l$5)}{R*K@J(y3JF1`M3LscEc^nt61Zl*yUP_XzsdGZ8W8$amLnYtJ0OK?Pl z0NCr6x$~fh-+WrhkdK@LQ zyzHTG=9T~*ogHF|oXj#nDcAGI`H-TXI}bJl_>76g`4CTKn?@drpN~G#uS3Auie%5W z)o1Sr)pF~lpg<)vQ?)A^DeRpEuUu$TIsj0~w5n}rMOTtef*A0#GP+o|o{TQjjE z4@MP~%daRaE6Z|dgciIN>H@!Ai=@|5osWx$y-uZku`N74HxXT&dD-D;)%gJ8FZ{>% z;n7K3hv9uDKQAGI>-Aq90GOUVuyo{*;1$uif6qz~3=_k1REBunt1;vE%tSy4^BJ?e zpzv28*vbXO&_s{Pmd`Y3!OG^%i{z|KuuNiuPji-FK{N5E&-ZT$3=A=iJDMaIlVrU; z%d<<>(3h_B1?VEoSEQ?j6E1?p9kw}k6Z~~5{9H>WloD1#bx#)-le=0m=FH48aSBLLnVB*OMG-OEhP{OXy{UWfPg&l6O4m@quSo z8B%!oaB6?kwc$e$13oxFOIfGU{`G$0s~K(|gamvPXT~ZtVT4g7hfXFr}J!!66d!4 z>5CB(qMOX(eF%+EsoR3KEc^S2TWIlBb}itM6p68c<^IbvmqwD@#s*KFK0WdBC_VI6 z2>C4S&^8rYvov%P;uLGo)zg@(wdoeaBueW957vPs3$I(lei= zjNU6+#Y774V<+p~zhp!E)AHw56il;13*zz|69&Ehi`a#id(HVi3brwty1H29-DB(ckE~9#x11s{gVl zwd!%a^ycp6h+SAWg?~LT6+bughvw0{O825)mQ?sfSKMCdG=27@(vyJaKHkRV%^L;> zhn`$!L_LWz57MJ+_V0uT}CvRY|7s28EI2 z>_wudv`EHfkDTMw|{!Sj?e# z2-)i-S@5~qP#DN}bL>|g2~53^WRcuW6YAf;w{dRYzMYy%CZ=2Hr{SyUE*iW?hwC#b zZCHo)SK)XMmH-G;wJ*;{xfKI-`uS>+z2rqtBR7#7hnIm{<1{|T@BTCUlUAXb^z7!` z&$N@5j4u@S8GP|W{y%w%6%HZ#H{2TUuSCsCdsEW1I7E`Q4QMrt0Qd#Qid3Flx_=l; zQw}(jWuRDZ?HCa2%4NUXG^IMYOVZ{k0r@65Sc-}7|zeI62+d}E;5xK-AA5mUN; zV7M%q{_a8COCL4g_qh@9h0>TDRX_HnE06^KV1Eu`T+|Z!PEA+e{vL+O&1)g+X>88` z=I6mkCyaVZU->sp z174T$znnj5Cw9mbtM6Ad?%%j+V1rc816q?877Or0Y}DA60e>bT>PB>;NIYWOboRwU z;Q(1Y*^yJ>*j;$=+qU&ot;&i{NJuCXhbg$rKRWyO?{D;&=+)8rCMOzJ0-O5iATSdk z^B^eswbS$6}Y|hQ+l3LU$S_UQ5a@G#m`nX z96wk%l#Tzif#5k++6oT0Hh@R^tByTb`r!-$M^JSwAAEHz10N(Ll>dI&+Ymh#dIfQD z-!@>@qdN)0%k!Q{Ql(PY-5vc@SazKRLaXuQZ&=UAbo@b09vjbP&s-9+yEVHHe_-~ZFz)qU#8ani>He{}919Iyh&5WFP#aDVy`&s5R%%u+ z65`{X(dxUowb8DEMt1qPk0IFd;OSyjcgH11MINtEFPOLRbk?oYD8F4(3i~?I!@6k< zP4cw?Uh01eOn$@QT0EnwVe&Xb``7b1-UyQPp8zbj~cKbO_ z^}D^iyv_z9IM$B5u`++tFnL$UMrQd;5#q_}Mq>#@`#@`fYqt7B2;kqgU#F?D+!Z#! z%9T)07Jg$Gd!@apktBqPs#uYTWQAillC=b1L$u-_ad0`;y+wiVUB3j$t&>nv`c2d0 zOs_6C=Sy!Tmh%;G4Uj4hF{tjk{n97wOFcat2nu-33z(?zH&#%&`464GSYB>$QVQ}M z3-vU&>v75*3LnK-H-3zA)2O$@3eQJ}a|QF@<>AX?jPl<#yB&sN4ZLvLyhX(=^!D-w ziCf@+?t~X0qO*kTZP@Uasn~M?&Oci{#!3uN&emkOq&)>pLo-VTP;}sqmLek`wU(%j z5fV}ab)LYzfFymSI>ydiL?>dl4BL5)p`>U56^0-z^F^Dt_y0mb%eDwIJc$o0oMQ!w z{t|QVQYD;?PH!h^E0}=V6br}Z1FR4LT%c-kAraEq0ob#|ZW{)P#qn4*FK7b57lfcz zYIafsFeNwk;fl>aKW(^cTBa`zQ#UB%lq8;ZZ}`W3=w^#QHP(B((Muh&X?E#|aW~-T zjBD;^sIFNs%J$z{A!kR7=u7z7l7&%qZ#AWpH#NH%?@CEAL1tr?hr2z-ytzAV`%G%L zLoda_5r6A{Bo1qr5C9w(F?BJq>-gaen@*w0Yn4!pUbzsKGgN zk^$qj!IPtvI{EL<^k_=lO)ylb=>|isbD?Yx zj9M^@IdBrkt~d@74Ee2X%Ro166IzP`1$i?Qd9jwg^n0f9gaqid%^?$`B&TlGHoO-QT01Fm0jnKkh9|%*Z`*CrN z(c4jtwi0AW9Z@xNH%Or;Cp#2dqPMqLj(_g5415X~eQLk&?au7)@ZVaFBZoF&irW^T zVw0a^6$7Aq7KP1n3Tx==q4F$&y0|sB^*EgjRP6=`uxKWKG%nF~RJg4Qa=q%BzxxP0rN%K# z`&9O^VF=lFUB=v8>+0UDUeN#fZ!xzu(6=01<@y}rQP@QBBVzO(qcOz3LP2s8gzb+^@x#t5 zRp0I_rt(bpwB%csg+?~Flm21O9R`E;ayCQR&O-sEz!10(ECF7;NqwR{MQX%%aX!@y zFN!CGgP8|(Jbmd0hI3SZw@b*VFZodvB#Cix+Tfw~IDPnpQ$mT+sh1c|OHg|*q|mxK zTbki;1cC3tbnZ#*uXbAwvV(BN0XP92wt))=i#Q+f2%fYum2C^rYHgYBZE@_reux)- zy-9$t^1+R$YOkfpIDp>J7U(jKFfCdf92Ulk06kVL!Uj2otAn@TFv8N#9lV+WFI25P z0t2y%Q^M0|4T>pDb!o7`72&za=XmsUPu-9^3xk0anZDW!f$3ietrqQ2zzlcx)`&4R zH*~7@2!A`hvtwYj0HAhb!fQ9I)c@mubcU&^Nl5zWK#=FH zL2;5fmxyMGh-URX>1@gK>;VslX|bbLq-YG28EPO>@#1I-V}tXpPI(jhg||O^p*|?X zo@pD{vSo{=jt)0YnXFXxO@B*pa#E~lggGm;Qy=kuKm#T8jh0=QMzz9=na7BQxqyc`)uc^E^q~u^Y3e2B{;C zP8~_wL11^-<$kFAAt7cEw+UMSaGiG*2#cwvLMr4DM+A4Z!;SzV{I-8Z?cvQR((8G* z0`IS#xgI?5(b)Rrwvst4fB)yv6DIZxA>~I{+70Fkv)_A-@rYN_N%Q)eY2MVZA7<%o zq|lcp-O>we#1COWl&TK@_#|08v=yGCF9ce535*{ArM9O!2`AbBpyi&bao9jHaTD$O zrz%6RbhtDt*VnGWi-g-l!+QyEBuq=jEkUsOf=pBAmG#-6jS)u>!><*ffV*0BX&Fh} zIF3nwvsl=fPC%pz^#Yn2F9nae4sZ5-0Vi=GyYC;2VL)#Sy;@@6NSFKyJ#z+3OpTG2 zaqDjo6BDy~+ICH<)mz9205Z4!=EKD6VglEE(TvrPx`(msr@@BFhdtA+w+>%pSf^ZC zT+8ySVA(-<6Q`3cZP7g}@M>#u?4m$|-QWGV4tIeslZ%A%WCpZCh69AMpv7b8oN~M3 z;AcpFE-EIi2}MGnhx5}08u`Ld@T+Q{n5rJBnd$JH?#O7rVG)HM+~#gfi(W$=($P*8 z#Z^S#DZXJj_E9@;6)I(lK5^U9g3!E1AM~~q)~H18H*RQn38bg!-BKPFb$Tx#pM4jH z{o!>$EnJ{Bsy+;Rh(o92Z31%L&0LE_{hn4N_!AY@p;`0F544EP!?{l7;h5d3F#3FP z;oKE^zW_MZD6D~{cMy063W4&&wf>1;tmg4MAJ2wS?LY+h22j>bt_Q_0`S$xJQP3e) zDtfpPL0a?h;j2jw>ax8lOq(6s;AQP9=27A2i{5d7M>NjZ4ay$BjZZHv7c26MR>(nIhz1{(bQ^kk=SZ6bFRjg28y2Wmw(Qs4p!S!3uDkVyNHfFcR z%_xYJPnVyt>0}jdW)uw^k-Ij6A?ww5@8QEu==5@drQidbrF>-4MkpIm;jY9A^#Mjn z+J1)dW7C>X2U>!V(>Vk>f4VYC`(S$IiyZ2He0%_GXG!n@ScLxK0yO?$!MzGeO(0cR zG}MZZujtbBu5*QNxKvmW)$T2E)6!VQMLIWA(axXAvW18uuTdTbO0OR}A!vja9l6O| zM=CvuQ0d=bm9+)eSlu^%4O@ZS%KMgYQM*_EdneOb@enFkVO3>0ME?_=%72DDOk= zZTfA|@bPsVw&u_WsOC?6FWM~`5Z)WZn^agp7Y`mqvIzsQX}EvXA}&Sg+}_`jh^?UY zE{Ak{07+lk#9TI6?cgmD#mB9cE5aMi`+L&DmsIJQk~Rg)c=*(9>Sp74#|kgAUpSA? z{s6Cim`n55X#h@R*E7aH!c4yPxVHjPdJ`QC3n?L#Xf=yb_U5xqvfx9BfdS8mCh| z;cjk>@TzHOD1dXL3f%@O;fQrhd@y+R`!5E!!lw4bMQBSr_I2|iE6~~EuY*ojbv0AZ zBMU7jmkK&%q>^Q-X z;9)jdk~gWU7NHKQ!Vxpm3b0Pers8VX}3#5!e6SCCHLPWs~2vr^vtxZ3q2%h5!Ja`mTqp#}H% ze*bE=j;CjunFxp%7ncw8p0JIDkDh1?YDwPHpwKudY+8jwGA@2Lk?Oj4;D^-#*k|lV zhEu1h66V(LASNTGdMh&ISFE_LnMYL8&@UzKXDgQCt|K-2pmyKFP1sBhuvq;bBeDew zl`r{R#to7_e{rbFh<8a3+${1kNJueN`@+ATH9JS3P%s90fNBwH**(sbw6IvrU9$sf zpWS2Bf4;P2w%M6Uc!c>Aw5~@#Y*6GTdg+ns1{`>9AGIQUXTZkto#~&Mn1S<=iD^?{ zD^hbm4Qw!?o!>Hb28dz|BU^?=3pS+fweP(_fVCb;${An5&|frKl8&bb%J#6?(b_Yu zj){00mxNtyXSF!s^>@}Jwk!&r!_j$^I`-~%7R3JnxhctJKTgIAfdqKIdD00rt3~(k zqW_aIt;a21dAev$WgTn?WddbB-aq>I_(<`OuiB#gM19E+W`jk?KR6<}h!N^!yEqV=v*#a6LSn*Xf?(npLY-MLl_98yi6fD9{#>4N=kN=*`IH&Kx8i zRLsD6{+7SUp< zw6PzqIr|--76}~f9f{IORjHXNQd8PopZl6*69D+!GA+7>-)~V@82dnE+l1&d+Ss%a z)1PD6f6U|e=H7Y|9yOJVT)s9{$_2{(Pj$=5a@v&EO>CS!(D38DmVzRV#=5DiPicE< z!;|E*Q2@G$(&%|W2YRyd@=Uraj>ytaEV zb4zlcs%ms@t^$Q#jBPzFH&nWnd62JSRJCr8AdmFNu%=(j@%`b(5cLxXYXeC^?s592 z5*VE06CEhC3B<6)`8cq7pb#O>0v1ZpLLNybp9c;!P`b4upWYW7WbKim-j(wNjC%`H z#wkn9M@P+3R^XEBF4h;nse3`*H4%DAB{mZp0-WGglpWl}+ztNK>4t@LXiMFa`J2JO zNQ)~`2cLkG+Pjo^gS5_@Gyb)zi*((Ghh&nli^Kj1b4=>Cj2|gxYryt>6f`jb#7OO% z#`qhAXEGTSodqH7{Rq++aj-RJOg5U#k8IG>yCZf99f!$LJTf%@^7@=*(P|B(MpOsUNSIqV^oHU}l77kFP*i22>E`gx% zy3(+%>`S{A?HybE4l{^Z`*$=g#kt+XACH+@jZ%OmjfQ*bgaw9>Hm_5cZVQn=mLA>J zvq8w<{+m=VJ-`5I_K;Ro^b8t)=7J8;;ua~V*a+F_p({o}b{gbitH1MJ%mnXGugd85 zAk7c+$Mh%5yhiw*6H3H=2~2TVPej|E1XJ)Kh@4N*APx2AbR7wz6nZ-H`9725D*z>N zaHQCJD5+Hc*O8=BXNr!hVp9ns_4A?y(0eQv&P_HAmg&3A&CMrKQJk@xw5yO`v7^ae z>lQeSy~h%xiH@u_&2}Q42|+H{1r$rVS1C z4xX50k0`pF4f!kzB%0a4m36c}FXEuf`ilIp1!kO&RjaLC!szX&myTkqrL7iV0E=*? zQSf+fUrV*?rNgwny*;GR0Q;6<-I`H%xzTN?ED2K#V2h`9lWm>z<;dR>l|J9ZVTT}Z z6coI7>sJ{RVZ}E8MvD6+@ATK?hvPzusvl(QK(Vv{&qFLHRff5OdEx zLLRAUC&>!nm6o7bo|2#s`z~#Lhr@K5p0?|uL|YuA>+9TUTDgd1L8KlCWn+jbKkPtV zK{=N;uefAMnZQ0a<#f>HahDCICc1Bl`8^EOfpw^GqCnK(F8kg@{e-3muS0t?r%(0F zx9s05;eO21bw^4YR?as&T+kZ&DEWxs6~jv_W;r>yus_a6Wn7F+V-C-qnHe>F$9ISr z=E_l14$lrnGlfzAwu}##Rhc%(Xj8vOP1k%=l0v+F`&Kw$s`8>j$op-alp&)c%EuYx zBn=6BArVHrzF$=2yneM^A-~kdfB8ckt9x(U)HN#L;USK(h=+^inMW^?DtAszYYN&u zi`;lnkhvTV?)Uu8UQK6_nX5>Iov~{q4b0rRVGTx#gTX=humt176o;0!444FNJCbO? z2hm2^(Q9hDNk+T(u?vF)1Yq%AeD=l>)VJPb-dARW<*E%z&)2V=7c0^1x3&@kjcL68 zU&?|2NEFu!z-Lz0^oe~u`(*At-NAo+2Z?Pg1K~67hZnOUnp{g5%R4|_GhkL@#b@-U zHMCk7P8?GnGI@o1@ZhQ)M)}_0Els6j64Z_NYrp+$j!)A!cyx`%c)BTkig=h>R-*~~ z^N>;LobRb%@UJucianUzbZwt=Fa=p56`MENfne>#h1|U5P_1LRyjV%8(Q{@hJoCW4 zn3#1jHs^m>SbX+!ItEXG8MA+Xoy)s#Eq3^0yn0j13rbe4f#B-{q1ZxE*(+V2MdGkR z`&vh5R?q7!h8$Fw=96fxa)KMRnbh7#KXI+k$3|W@f4K-Cd1^RNjSBM3=BKaX$(G*+ zf)V3V3~5QXq%Nqd2uGwC-?e;sN~B1JAVDyFNDd*0MWs3 zZuRa5%Zqs-O~6O7k6A7&Ch{O9Avo2}Tss(31E#^jRq5~wU9iDL7bcqf*gq`dz5YMX z)Lwi4LiFGP<`}))Y!RKLfY$uFG4Z}xy)6iTer*# z1GE_o@)+EI^C3UTcwvgfATsHW^tGI{gjA*Ww+>Yy^vo|$uH1nztHH-hd+^WS*GW|B z{7))fXf5Nl^h|w<@NzK&bff9AzU-DkmqgWE4|OT%6zV8Hd0|~b>dQXcMl5VjJPT^k z_?zL>3k7HiGT};$1u9JDh!+d&ff|Yt5ZeFv-z%h62FcOPtB$ttlF=<`Za$}`R=ugb zeAU74+|v9}Vg_IxBFKJN(Qaz0zdGmJNe(A7@F`c%UAAl)68{EXnw=|h*QEh%xM(Z~ zxHvy9v4Om>_+V7&bp`ixH~*GE-^*{qZD&DsnXbG3C+m<)%b{as8F&+atZeu1rl@q7 z73e}!5q22Y1A*>!u$@|O&lT^BWE!LXjj>FJn)zRLnnAq1dM-v#*zRKww|LH!{!r($ z_sV)&HOVF7VAlA+_Ffq?dy=^}l~G{N=y_5Cmsto6&9V=)Yj}=p!Tv8@x(~8ClmESr zRP^=1l!yx`_WgKtd_411`4Jzr#6MTgfJ(zT5u)so`?Y54?7?|+_c&oB0XK1GfJcdh zuJ`T9J8DWwz(L4kc)rgoxP=eY>wS#m6$V( z{Xd-e6v?r=E+&C6YEZ-payhKY9Zt=_@e2o^sl`^FB=>163B}!mrg%=ddY)qfVhAQV zJ(;q_$h=7&Bo3Kd7?0n02%wyt{l|z#2ls6v7dh*?TN+c`LO+7_M7ldFMmX%MgX?GW zEy2P7qlJb)3b^buiPSyofsd&yX558;=k{89_uxh?U`YgQ{(ggxPUje#2iIEd4`F#2 z-2x_NgLvO>+ema^5*baRkzjqSW~R*AgNwLwH`$A%KU^9Gx_hHK^^df-Z{D1lnNe^b z|L`lkWp?(>x;44)x=gUxL>u6`LasmOc-^W$@_MD8Szc@1QV3*^BiXXS-freS3he@Q|vU_#HM6mS^47eb{|OTN@F&ec{Sq zSN8$=l0x6e7~w37*Oe4ZnDx#_^(-&a(B5PH7yuIJIg#$^2O#fmSrUkyOx1`yv>^dp zwXa{DlONM0^IJn}7$W3=GVaj*#pXzaLUr!EIf z(=yN#(*#-x!|?Vd#F>@B11be5=B@iUElGFyLNJ@9ww+G5m zIrhfNBTMOI+vLLFQuT{!pZO2)GNMKhnk3Q^zebYdu}h09MNtJ3-j3-P0nnQFd}@K% zLj~V_Q(di0ztq%ND~c*AD$<#RVRF8(%-xOB!5DbHIEGNJly&SGo(Tkc_QQgemtN@p zXsw#+9Rqw6XQ~~wmVoeq_E^`Jk#GpnK^!NAGpdhP@HdS~r_Kjfdv139F>e*ko zkm8WLF<~C!XWu=Ozx_?L&fygpk9H*ZVtmx+v3*_`2PzSIw@7%S+&;dmUJ~}#w_B^h zt=%JaJ<$9WhHm2233J8-SN2tH10OW)M)+ntpsF?kQb8Jp-WrU;bd5Du30Spko`Bm~ zUZ@Ujiq>4r$6U}Tv@u=nbtB~=dDHsF3jb2yKk1aZm0sdnJe=Gw@zw>}dE;-XMbv7h zIH7Y0`^3JC;7ve#Y}uAEbpndH^}lsi!3KR;cU0gi_^Tp~D}%9`a?eAhOTg`s<>ysK zG{3I-p5=c_^c+H5r>u(x85Y2VJ#`mnLBh|*f=225kN2&=(l6Wc#I(d{Y_M$rrMKyX z15r_K*}vLr^J?#g0&x~E7pgho#JRn1LG6E)fq2UB+FKI;^KdgY;@mo9TYO0WHtJSxH7;R)6~CO5xN963cve>C z_X|zo(a|1!GXK;Zyztr7d4#ura%Oyde8faVSlFc^+x6TG#`$W29~dLYD(_=IOia`m zvp`FF=!q?Mm^eF6-t~u6-PdsZQ^UGke>?M#~QKI@VqD3!)cwQlJbQ9 z$u8rsdYIM2Y3ZKV%NdV9NLEStDC(LoJ0=@-Rle17*!xJ6d(eHX1=W*@LC667-ug+J z#Vg&bh`fx%?YO_}spAWH>oz0xhc8QBN5^yis$%{DNmr%Ko+>HlMn;C3hH@sJ$m7G9 z&ucObI_3B8@9^p0{zr^u+iAtC_}fkFb6#^U?{vnrgXz16Q=&#lid}r+Sj82THeJXAG$sh!tZDh0XqK z3jQc?{wWxwBR>_C_mm4%hgV^`1iM_e-yeX=1}gGWuDw)J$_A`Ln;Q;HKBVL)L@=ei zg?sAVJjGLXrLcz|yv=osj5JAPE7w1a=!95UeAR${n_crXnWY?S* z4m9Bb@gSrFY3!(Lf^N<^hho+UI?ZUEr@wFj!Ii>9NC)H!t`)aO`uYnJaz#;u^pCmF z9-uZ_+X8s3xK)JD1G=j*HUigz=dQjF@S((KZ(D%TRzZj{eP^2>sw10)7&by37};ko zc3*z^!OC56;&T@lnpk!3Gr_ekq+0H_F^>QKG1s%;_zAa!y}{jJwnNis~S@mcg=5*`N*%SuOB`LHwt?7^wPimL$4f*v(c{H-ZoL+U zevDf=ch365WJHvz69OJ$A2Tk7GX1zMU32L{brRr)_ye8-h3ZxF}K88 z5LFU;&cZF^FyU@$(l0i^!kjwgjv0M8^8x@$#@aL7CYI+UYf;VHnwtLVks%Zyfe1(^ zFLvMd81G_^?Ay`Njb_r|=<_8^fbPYE>8^XbMhO=HZx3${EnGjMZU~!60kkH<7M?FP zHpM~G2?^|n|F<5D6=e0&F#?66_rdbBNCgT}ujIaP2$CDzLrYD#;so>T@c2xFoS6sL zI>kI!W*_m5{D{5yb+60zak`Z4);zRhqi^~`-+u}{WcjZAR5q5XY4}9)qibA1>fG%~ z&gx2~E)zrlz9Phe!>+^LPBU5G!bZx+a@YK9!dG3(}!+SA(73xeC4&ymn}xzQnq#5;vR7_x7kY14<)~4lho*L^2vO?mp9$ zxt&D*MBj)8BYyzH9i+iwn%)8~NmvpirDSrFqFdSbS~oUJZuCu~Cz7k9oBlLX^rPy- z=-j(9H|C!fI_Mbzd>3C{A>{8=mu}znDg(>~Ws00ERe9S3})s0lR#(Kw!W$2&?jre5_@~)NVu_0 zQnCYhXEfw7E$9!gKe$J-mBamO^+tA!!LT95%{VZUx8B9(ta z@V;Pm8=C>w;qIm}=~DDwkOa&ILUe!;)(|~0;D#869!;{IX2^r{%mSQToy=eNU3-+1 ze7AQ?mhRvi&aJa2ugM<63kkNeCVMn+cvo>+U0l#rQhAtud3h;NTIQeLOKaS@GmG(y zJohVc6_pG=iMwLEw4d@xq~HwpY?&~JvDDP<33IUcnz#1fZq7r0Jw^BL&$3xTkI-jo zOWbW>V1Voa;oP;4jYBT_&YctKKUewr`8j1!(TJAa!SVx0t`XE_^=jbQ59yU~#Xw)b z8M+3@0YZYr;LeLF;Cu#8^;lN;eWzIEA&Am{(z!}8na zW43tMh&O~|)Zrsl@s}rCgaz_q_g(zr{}W>tvW67%y)_NrqV1S0bF%;M+55jA$L!*N zLkS(-hgIr@z$h5FofQ85%k)mxy#x3BEKuHIVsa3}q{d;miqm>#u+x8?MAl$=!%&}X z7?pUXW(r(}6ZJJlDELcu%gH2BooItyfHE7DpOf%PQ7rmBY6R^lKkR$`K-gtzfb}k| z>LbyC){f5=bs1rT3J1lJ+7KC&5EN?Zlld1>a{l;!o-!<5=uib6P5?vC0x`c)^fsDv zThu)_;e9c*&W=i%6Ej&oDWU~)+g<~Rai=70~;CG(Ph@b|( z*O|JbhqC}J^bWp>uuhAG*9ae!;w+-c$)spE%tFdd2D7cJWhwH1m7fAGWmC4jhKUC_ zJ^F=@x~RH(2KV%Y9$ep}p6j%{Eqg)|#N#arWwHyzZ;+MN9h8>7ix-M}zXf2xM5lL|}_%f&Is0_fJ_)JPi-y7wfiAu-2LfRhvE z!T}gOR$~Kiq5>q|^?HvmI)j>@G*SrklToG9JD|Iq{qjnwgP$V#j*tahUs=!9q6Mqo z%0kayfE%sy+*9$5CGg2(X|cUHQVr&PlYI-#s2I-Jb5grNJnYPNSBs|Mlm|Hzl6l)% zx;2WR&JI-WT3kR=Yv2#$;szrQHSIH*_pvHM3g1>&pOktz@#w(=b2~LNu@D{jtx!oo zx`vR#2x_bXgpomGw;|O4^&IK`1Luon|4Q?F2(*fdi7^djQLyATyTyqSmuImia`d|| zbJuP9oiOUism6=+>rPj=Cvu@8qs`HMBxOo3)1F%{6Fdk$6rEr3Rt~%*EDx))}~Mwvm}Tkq2pRcGq~CR%op>ggO$>tRM*~3H~0IF?l!J5Xc>6JlrL_ zK7#8lh$1vr?C9w;XG(t)#Cr1T>zeBGds$I2+fjP9h)6TKN!!t-B*Vr3i_b*lS2!ec zNOR-spSGaQHVtf$$=SS5xjz%RDi}7xlMH~iklKL)w7fnt!3Pa|=;2uy|29h_|z|#tMQJx(>i;#b9 zqftf_O4!X~6x^Qdo4O~??VC8MwKCC9?<<61M9wP-<|EAK6$2XtmED=W;jvsJ=^WA^gK}XlM zbJU|j)nt6Zr}8)WfAD{G;9%t<8wk=z4Iooi#G&YT%zMzPU*wQW$8{<;>0!i%J09yn zo1a_#wvLcWpg)KKJBZwW|Is5qVr?;bFOe02AaN!cKULdQAb|sEfV2rD_$j0o9dQDa zo&7pb5py5N9io=6exNQ~h9Ftp2o)e6@kyz@CyCv>-@K9hpEe4=EI&U=@w^c~((>AZ zDUeZuV3H+)P@R0)Pk%E~H7uu`j&tan;j3q=YHs#8aCCj^yOt~r zuR7}74zgY#vBHVkFzS~#>KErJ|CtX7j-u6plOugiNdO`#j=VY&PGZY=Hct5FlAE8i zG5ePVWr1rWo3b2%(P#6XJl2d&E|=NN*e~L+4|36i87NsRc{|}^bn5+$rRy(V9#*Me z6!4fx=atD2gKyi;H}+yD5MG^TCZ*9UHjxNEmbKyIwYyPP=9?U?#q=R`NIc`$bOnNNhD#pJ{w@r z?>WQ0d-rOK^c-*B?V1$S*Ut!(5etPYYen7W=KC=Qd3#~QM=c-{>GuWWA&GE zywwZ@)o*TpxLI(kea5$i=qw!gS?l5j4H7OevEJIXp~3d)kvs`H=TX}utL^iqWoQFO ztilBStVKVUJo7-b!!t(g58WYMi*FiXNwVav;KVdFSn&lNM%)Zs9bH|nL{~IDKJh|4 zsP3tqnZ3Qe5^B3^X{|?*y^0B8eg@^&-X~d*vvKJ3+kffh0^qH*sMK@pH#i za3|dc0Yz`_8nq-;$CZ|0f{%H!iV7mly$U{_U8=ih2`?Oi|1lkpQ4*|LcG=|xPxCJ% zC}4j{^mGqQ|CopI(JQDS#lz5A3mLWN1eAWYxUxKd>q^&6n>HD}xv!Z7k4 z%j;A#r`^wrG%alXyuE25b%;g=*Q-RhW=E>2sHgz;6aq8Qq=LYeg!T?@z z+Yd!6W$aHalB7g%Wd^kx@NE@05lEi^Ghf?5K{0ZJy}gN%U2pk)-OIk2F$=3QWc@h9 zwiZX(dbp@5rpx)N{+ui^%aVvxJW?KK1698uw9i2K&yG6|IcJ&2UhH2&y3EKe&2wmn zCl|5O$>%$9>*@f0c^O7KMmbm9*XL&S6BKLyGZwa;OmP`5)2^p3v zFh{ONTn~hWs$+Ks;ivgNT&^xRUu>6@#5ejp_)J(>jK(zy`gDlY8h6>tz<7iQ)c@f; zT}7>f2QPP%>%jPenmwPFq3@N1;q-fAU#qxfgVRsG2W|0qku(sR5QZi2!zB~SS zuL<5`LTIGxbXUZ*u)=s%kn)K;EApRoLI2=KoLCUWu67?TN&s%E5XAvLdQxD7TTlK!tz|9k*ib7-;KHnPdz`~Lln z^Lf797TR4pK4iGYvA>xQ3KqF`aa37>gM+p+C+ID{`%ld4u2aa7_+%Y2{gFR#S zbrzIsn^B_uk%8ZxbBG{6&?cF_is_z;a}Ghx+ko<0@r}UKF~6aCIL)BB{W#H{(?15% z;XGw3bpnSIX%f*K@OGaV=KGRiFM~Vkp%((j#NQV1$!xoT)POXLNQ;R}je<+Wibnce za^>UW3s#Sfj*s7ROjkELHFZ1nAaZhC1%BOxb_>`lJ|h%;KF{eI4m>*Z&+vWS`d=P} zZdXz@b`+GDOZVA>`&8uCs^Ay;+J&rqkv;z1+3&0}yY8`nFclP>ZZn*Y(LOIhk|*>_ zKV`7WkiQXfYS0j!9*$Rw+XaN)*S3F=Q-96~wjeQNLU+73Atxs!*p7|&OFepfdy`Ps zikzX`>DRMYF_Ig9wEh(}NiXf{N-OtPv)m6i*OpcB`*nPa7QFO(U=|cmtSuz*_wKQ8 z=kc#Ae=6p<nhCXRw-_*#S8cin?^z;T-_= zC?v)g@iN7%-#j2gQ}q7ryKDPA7Jew4zF&$X!x;F;Q-h0Im(*jkJi;UT%ajoU-?gvu z$$f}bgBP`SJ?0-ANl8zqIx)*Cf@F0E-o+o}SYXg=*>!Zr%}nWJ*mE2 z)j?1GIUGedkP4y zNtj*T{fGC0o$3gD*m@tvfAo4@=p^mMWl!8QEX5X;!W0`f~|&lwmXFh03-Y_s_%X#WtxN0Mh(hgdSHq?lpF=h_}-MyOTQqlwC` zc#I2>WFglx!qP~>b}BNFz|m-hJH{}~N(WaQhzhr`0v8-h2<}wH--q!^0r^pb(_hn# zm%_2&XUq7mqa%%JbWm^KoVHt669SgA38&4^q3Z(#Kw<xxqMW;0z+VmjuvcUo2v2QC; zyb25v9UQxB7rVXt-lkf|Ec{h=ZYzN#G!KAm{@DCkNUs>gfSh2}Ak$YF!8*{Gge$fS zonTEexp(j0ZFs+C{5Bl3SHjhaFu_+{_B{>hV(`d``fqG|)zvfkc|F}=?j{g1{wFF@ zPXhu>%%=Eb4gGm@b$uhhg|?MnCX!+Or(5cEWuHi-pE~-RnxfMgI=BXVo)n2K<)T=G zwd(gDQx5fiAm3yYyVec!%w_tL{FZO=eUy;7i7I?$i7>ebF4Qg09t!V=g;Tp#zvLy- z&wG>MLX(Um5@PByjt0$)22t1C)nt0Gt%OZ3<-|kj8nz>62^xGKRJtLZ{3LK(U2JNp zs^X*={?Y_x-G}2_hb>?mhMF(2dzgj)fkrdGM+D+{%3kHud=14Pa!RDsAKJzq|AKGt zluVUOXVoujh)P=zJl4u@n6~7;pN$HiwozD*EnCGmHg`IU{x1Hu;f9UhpS{e;b4dS4 zYQR9(9*|6y0om{)|B~kM>U2lf!sZ;;*+Kw7U(=!^ZsY}m!`IPO+4C$R;bdk2w5TG} zVKR^p?GI~L-RzN^{(uTFmTk}{h z7eQJGFF4a`1*XHGJ!YE$6Ud!?8On5GdHoTS`ar%qu69+b>OqP*!Q}^)?q%Hl^<*g@ z&$6K_;^x(zc-;zLQ_N|l13$c5yKadO)3&5J8;3SIG_rSC)-!^}Y+(FBL6DaYmkV<1oOz{}X&{B+Rv z5}v5Eduyr{^WNSyCQHCySQlbI2%LVM?o+-L}P=BDj@& z2RV=vP)kq~WH=;;rHz9hS~%R>Kt7~RKfmEUO+#ajKmU`nVG8BCR{aohI7z}EYfoth^L6~Jx%nBt zwS2RJAR))7 zIL|pJtCNfYD=wnz>No2T4vz0thjP=7=47w=2#8{8enYfSc#L?~4OI$2wUOBLh3I#gop_V?Ga{n^e9xJq*TWlD51 z#Rp}Nf2bBcPez4Ch{R2+OkpU`Z^UeQf0j@-A_pT0ofbhMm@F|w;6CA?lp@EKc5kLR z4o9Ic&hC)!_aSCvY!=Cv8C@(o(ZR3f|Gm)M2j zbqQqdLB-nYnpIBeg{X3<#tRVZFFmGo511xSi|D9L-0aw(UxMd6`+^Yl?2(>8Rp{7) z4V66qG3|WS+{{n-uSco1C{lScw7?$fuc{*iJsVRn=s6^eHBG73{xPwBiBARwgRn_; z-J0@Ry}OF z(m97}bSxQEjS@hsVQ1jShxpdk6VzDhf&kJNy_9%9EwlQH7w1h&uRJMO`nr zY%(c#!`hq}KlgTJV@;knVP`)?jk6K9{n8a%M!Mrc);hD_;*&P}) zV)J>jvZA63EfA_AC3EGh?~v-922`i z*6J;0(N_e=Jp&|nmD6*JAD~MNQo=4KU1oqTgxW?>DFSdBNgZAgM1V@t=QR5kkY0eJ zC?l30Pz{5+d2pw|bCf9a!RIngnP%M(z;ltfA^^7ZxKMc>LlfrO7%tIKa^Fw;pY?D=HNNUS#rImPZ+Y-t-WZMf^bv?p7^G$@f~hyJDpj35rguTG zO0cnf%7DhpBXz{AR)t*}OdXE?atq1|D=D^7xIPB@5vyFhroPi7i^u9>9H$Zq__ggix3jc0U(+GQZ@!E zM4l6n?qH}07>R8A2PGqwhkj4hl00J65z-hP+?xyxWKVOzvm>4b2PZ*?vNyfOLtiwTn( z@|KWNu~6N)APdU06Fn_#tE-SU=z4<_!*$V?X?4`X|;V*SrDwMjU5& zE+6JX->VM^iNyKj&CExEHe|-O1n!0pvu<+qkc}R0#1#jXq1@6wMl;@gP$%1hH{GqI3Y*; zU7Iol9B4yR0#4!i0gx!Yh{>e}N`*}3-zXYdG^k?hD3mTS2XnpYrbJNLlmhy{VO^mt zBV#}|Og*2S0b+F+K-+?03f60+yRv5??sj7TB{U?hY?`T_XA^wdRB%nRp)dF>12arJ z0UZrH?~|UC@aw+BZ9%NX`TY2fH3y>xgbdg^9v$D4<0J_@+3&4|i>+J4O+o#|b2*E@ zMr!_R5@+>eg;01*q=}+Tyvu`cIrt+@od`W0C&Zezhb~=YeTt67469)I(|0l2PFM=m z(fv`ESWWiRbkU&=+zsffLsco@UQ^5ur$I5#Je{(*I|R(U+OZbDMQRrH#_D7C$_qef zlj1zLg;xDmD3Di*ArAqtZtCCKWnBPiYCYUkhH1-o*!}UOW}3dI@=(%b&Ye8nCg=q& zlFv1G8FJ@bq0LM6l@-A&q5s-cS-8?ZI#6j!_a(Z!BQ1qPvO8GK!~-F_HSL+wN?T~( zLq1k}X!11jF*qd288N=yvH}>1)&rxCBCH=bNo4Bsu?jhr02J^{mxhnKhC01P8DP8J z7bM=-4LHiMpO`N+sa0+RIlN`NvzC^AMIhHW1hg|x46vn<0DzcH083u6m;q7g-6(RY z5Wj3{B|akXsnTI{0~A7iy*xbPV{Ki`TubuIDewbnj_z>i;UvtW)YN=;XnMFqXJkpi zVI(~I%r*V2s{$sa%}JrP>(+InaWj;%m!i&9-@<~FV%Q4O6ffi_7~tM9fd{3zxV*Ct zbYitLv2_b>uIm1t?P?Fxghbyn_&p7O1QoIX1@RnC35yj`+kZoP*!{#*kN$i33czO= zVZOU9IB&|a*#jQX6cEg*Km+W9gaM9D4S3tQf!}G8Xsj4fPTL7CEr%^OgcDAdU_oPf zQi!zrA=}ZM1v=`9=Mo9v2WvXaIK@oiT-s2NpcrvB!AU5wKB0uj&Ame5GNznm(|`0_ z)Y0iS^X1wnKD}M;ArxbpQ}x^&g(SXNgMT7Q_u~%@zZU=e7@iTTti6E-IOOCj9%NNT z!Jl$tAY6iHZ_3Tz%WbiRsBrpVMkA$6om#i#>JDK65UPV@MD70ob&eJ!HFHPU;DU zf|v{0C`Yec`NCBjcF1mm7FsamK7Rb=_iy6Z|IyE54!+6c#J-{6IPEbX$lE723k*&{ zVdj67AxYW0IEBj6Gc#FcLjcq&1`@@YYc-I!Teaz6>tDsN6wPbb1_f9;VYq#(sNo-p z1NFZupFeM2RjQ_@=AgTQRCf^06XY8KFbH@Q)+B$+-0?u%H7hPIsGylC zbo~KwCJK*M)HuveOl&r5VTi%qP^gC2x9h{(#Hv*;1r-=m%WwcBN^=13!sfOhcuaVM zr_!S-Z&-EEk!lIp^IcK%8}lNdD4J|nZFt7Mlzxiq4GV) z#2Hv;(=4F-bU9opvYGPP+3(-ONF;y7Ljq&Rd%0;_{mRc4^*{*@Zs=nz)6U|(FdQ!* zL9hVbV4#LWZ}g|$>TDpT!KefC397U+Cu)(`4v{TFjSwT;VQzJHfHWIj3j-p}qJo2i zb)-5Je`!v&UJf6(DT-6JK4vU`BvCcYGfuMk$755wRURSc$5imFekDeI2{(4(a)uHV znB>v{VNP88+g`Bd&43qh2>45-HxGfsCID0|ieY9^P>a=((oj`x(MhAuUXs?!LHM$g z2R86!fTSCismih!?&2dVa&RJygr_J7*SBhsr^n~xdH%;vgIzgDo~`Ojku0w$zLX3! zr*7tt0f$4OuEsoR_S+dNDnKm;@t!Dtrl%HTrwO~hVvW5BtB`>a4JGU(xpYrF+kv|Z z9$5faFQv|Mt0Y5jY6gw&@Vb z86ItLoI;9&1{Z6Jbv8KS%Y(|L^*{ZRkqCB#_|}F%DXxF{`(&JhO@`gA*2wCrK1|)} z$Kb#HW1shkCz$E?8c@*+8cR6G!I-0s&Jip*AfL^F2{@0PR1sOT0@u;(*8W8hwT^)^ zo#fYWw;aIB&pQ2JvjsCU-yJC)?m+wg`reK_V(_!B^HpZ7PP;_}ZKz1C$-Ra?%Zq*6 zw)K|264Qx>!#plrgng}>J0*&cISb(v7}^n{MNsNbL~Q~h(qK+|OUsTi`^H=%zk(W7 zcccZR+2a5=&ADHBuyTxh|NhbUL>Uj9=4V1m|00TW#69rSr)OFNn?&^{G zmXEazJL#Z+Y_6}eb@`iwN4N)`H#$tpoS&~#{d90n>|R6nMe^gQPWpx!XdSb~{=cLe*{hC4J>Bg-~?=!Ny2g zi!-g=K(?Gcd?gfUO$2=sO-sO}ghgm5wG*JkH_VIT%phKUHwuLg^}_wYUk5#HzMKK| z!~?MQ1AzGH+?fzcB8DwOVAwWgb+<#zMw=kmDS@qvwUD2W+k!lWT<+`@Eai6MzlugE zfRl`~$gO|FXp5^464ekgIacbK@lb-Zv+Katb2Mj`qleWo4Sh40 za?RE1VV`ITYK_k4g`#ovl~n?cFq#+lcE4(lVJm!HXu2Yb&&(0^+vU@=j-jVRk z&UHV~1n;S&=^ur|Mwao%!>U_{LspJSOwFW3K7tSc77>y$$<>o3ETDt@!6&QsXDBMu zy3zd7!HE5})|cgsHEQgdv57Afa*nn8yIz`a%Q$Yp&8m2QlMwJrPKQZ~PfR)vkO%!t zFy6!CU5)GNY@kpfLil8%&n}zOM-TTT{>odvV@vv$Pv$pRYBlwOeToM_-j0$vODNCo zX10Jse|q5b@{}rzYlxea|jU!h2pbffxK+N_%qC{=a9 z3|dlryB7bsOe#oH77<*MacL61{KYkQt6EbppP8?DraA-Ppv+plpnEz@Y~KXs4x&m4 zq-3pmKFRSE5}$!r;)(2V04i=?3h$NSn3KQiT;B`Cpn>s_Dqt$w)Q40#f$!n=WfL+| zl;+irOlj5t&*@rIUmwe0RzWsb*oWyODjuiHWvJD?uSx00Ip`WlCzfW1&|nNgMX1&8zlF; zY%a6G{I@iB{BugVdcFm#_y|v|=hKH6-Kgk(LP#TnU+6h_-iZxMClW|9OAw&^1`7CG z1(pGxNTt{u8i~L_PPy}zztpRe(cTEggD8HWp`&EMFxEw2xBYoo$hQY+dcL)*N#@BA zfn$bKXAFVEn+j^kA>;hvRi?;AzSbQWO2Rot;Jb0UJ@-Q(!mD_u>zz!`1qaB=!2gIi zM4urBgcE$3js<*oclUQ)f^uon;**%96Osiy2Dlx5LguCh=~KL6Jln_tNabulKJ2LH zo?JdwKFbP^T)PLH6$qI5M!ZkMtBH;Aiq_T;-1n?PXTjUg4{%Ll(z>iTan4l-U0sJ? zWR~D#lKah~&%oJ3oEIxjJm78w9Y~8hd|s@%>~ael!{` zFKiiE%VWAj*O8w#>RonTR==pJ3zJU>3H%k^yeNm|>s`O+=r`6PWS0|*U{!Hnj(W3K z8FXKTNuX47wxp>%mKp=f$o_UXlEPm~wm#JP^uZOgu(=DlsRwLyQy~X}yVp4jR3q{& zZGfuY^3Bz)&&?FEItqSx9T9*Dm8|yyGz?FRkP{f*64z@1U{NezjKzo~DSzAq+2-*V z<$&ExeZPVO1ds*iLr!XlWBKT}4E6O2YY}1OPYzu_j}%x#i%Rxj*`uG}9aBD+;|O$B zbaCQ^4I5D6|3=J286*_%0Y`R6^c8goB6Zk*)mSb^bVeB#FL6Z`wr0l)Tz^22Zy{TLn4Yb}@cXU{U86U9DrC5hE%&g`TOf`>ll%@mfNO}UqOd=+)c zRzQ{97c`U;ahe@V{cbzq@q2s>_mEQ&ts4MHrWkh<$dbCeHJe~J7$d@qMb7OpZw$TX zHvGmZ!8ufyjLQRd`9IU;oWD;ruKKNlx9h`t)89b&8@f4zP_<@xSYw4t&^|9bji`U-4dPA2uh z2_1(bTIRCBxWCUz>v?+|fGHOdq&AC3zE^47e{7*A(Av!Nn?ctUweRd9h?d z=FgeTe*4%J@lXvYn2O~qZnx~8P8<689rYk~xpf%cM+=K6%um7w0^RD60f0a= zI6~X62;A}tlvmKVy?_>LTg<>PU2|7=W{GMRPI8G17%VG-jSL|;ptGi!8d$RmLMud3 z#1~+@nabADx%!j>&XD-OA&(kfE1VC?-$3Le3$)9;Vf8VP5_%FvLg(@A&a~*BqLF?U zJ=PXLT5L=>!2@gW+;K8d1D@0+@)IWV=@Mk*L`1fGnILQscoa5~Dp4fU=4Vo{O8O?C z2tPg2%`yK@5GqW_pb{l!4fbJ2{Vk@z51!9(0qAW8>@{354A_N%t?OH7<>Kt$mDJ%S zg@^h0oHnxWJxd!J*A7Md9uDn^P(3`zuJwE0>)K46np)rRb>fr$*?UzW5akCCV3H7m zL0(h4Q^+qt-&*~;W9K3E*n-}>J0P2w#o7|9&rgTt)9ZCPq6Z~VXn7tiBKt8i1E|pd z3*(f0hpRabhdT8nrqy_&Vw3#!$FGF0WH}Z8kDqF}@0Y;aAnN<#a$X{;f-r#nHG}#FI0nOJ^*IR7KgF7T zUQi2$1(c9^l=91a1l@v#2hxDca}(OtL;RSsmLiVsymD3j zGtjzWVHP^QV5Rp=ybgF>s%Q3t%R5NE{yS7`_B#XPy4^;W07_bSRL?`k%>|jg!95R8 zkPjNyG|`{uflc6sFqO<3%{NIdlTICZsJZBZyWN7u5U$ULY67d9DpDESl zDGONsP_iE@X0mCcg)DF6BB* zy|ybtyB+i0eilH!k@a(Km>^uiFt98h{9Eh3#qvn6)Wmz2%!GSCpEB3{;(bGSO-0*V zxOwZECV(qc^b~ecjw>2g$~;&R2VOQmfnp~HyZ2&Y3UFq&tgVy{SB;A0U^4D2cM>}E zVeFkqInPf~XjPkAi3{6BLPeN1Q1Inq965 zknl`r{tNTHVT4T1Tx~Th3RYJDs`J9V3g8nbGJF#F3qDyb^dG?!%{d@d5>Dq!lS>QI zype=N{NiSR>T)SZ7kYeo$>=Mj2f8~A}6fKt_#~KF?&Ozi5z4KX4KIjuvAGYXJ zd%nQB^l)S+^B@#8K-i*F(w2e=1q44n3pc69q|0U6K!$&@83}=xAwUM$M+qE1i{FWy z4!r4Q8JQn=4D7rW%69k4%os|dP;Es}4dJNT54RaSGQB*^=Fzc089da=;HR>*FmpW9 z0PsXrdZE4`IiM%7M@pTfhUrnhn*tenAgbGrQ4j9D<4rog#o%kc2^oB7&!%3=$i=_q zeXd_9TeXB`ANT`wBY6#NijuPX!srj0TuvTYe)75puY@y-hYT_SWKv3WxZ+^>%AnuP zbv=^?eEr^-)Mtm-YZ&S5mPgys2g<*+;7+yO6d0D>_e^i+jn0 zGb3x5oL`llJ}be$OYz*fO>nrIlDh0m>jq_vJT^X;>J%3l+kVRAmE286XHahXMvR-_lN(b%IN9W?f z@B!o#j`jUE90x44c>2y^%@8;}qGNfJIX^=IEQIau(f94YhT^Qqn6cLdAUGzm)9ut~ z0(vWM4?D&7phy(dPTt8>z=1Sy76??qU}#r_*3-zYYjngeE6BqGFDV_cLQ*g6C~$N@ zE-*TD0c9VEiQ6G~M6*2*FL?n`Flk8w_FhzUBWedW3f6T?biS12m_%9~6PFLYpqc>+ zJ5gM+9S$lkh6`Kipm+!XH+vO5!{5s@(g^^NfCChH_+_vP%GRKEg#?6)%%u{Mg|zoT zL7tEx@-}_;dqUKMb=id}+U3`~(gkznMGXZ7g(PJd;{hQmNG0oBmz67WkyrjG)Ps!d z?c@kV;zMe5!c8cnn1sO*^jfC>7eEyNQqLC;qJWRR&rfvWp3cv;)aT+b=}Zc~l>Q2M zj^|SbgCbPC%4k>=+vxmGoZ0DAM5sRCo9{c~iQszsG9SKc^0l(LAc9vRQy5B|>nZ%H zC5ivRA3_Bb@K32%l-o%AdtlqF$ABLyipV+o-?%^UXaD~GXKVg%Bpvb>XuaG5ip?m^ zN+9Y3JJ%{VA))Lc0DHfc@N_>SPLWA|U_C2<4Pr_+V$2EY{;}qw&CVq&NTRI&v5^y5 z@T*rvor~?AR_#Ag+Yat{{}l|%nzrVrb6qz)uaLQi?rFLMfGku0`V-s{eFB(U1u5Xwc(>wje2c_Vshb0Kitk9;|Cj;hB;aAN+=&Futkb zy@#&=DQs4Y9f{RU7OK~jE(W2*@tE&+Dzx*t=r=g%^>e^1fYI)X6FFl&pcdW{mv=y^ zBq8zS?|27rr{w^Apd;54nznhIbp6Wk3N^ zt#Rxgg(9TVkO9!uR3S3*1O@oRzXp|l6T~!!es({IW{Vii;iI)1 z?{QA{9F`Ihhh%L-W=uSi2VS&qK{N)YMsDT-1A`l^+S+gw9-uW7{(Q+(wR!4yM@1A@cG6No{!jxeJLK z_s=XJAanWg&gnx50-^5iagxU4Rmm5NV-HqUbX^Qj1cmc~W<|E6cx;Ugh-nM0@uR~h}$AOZsUhG9#gKViU={TOnz@1u2!~hfj zB7}&)q{ar`J~%N5Bw-y@mJ1QB*RLg9XKM9CqASHg!?Vn?`}66dnAtpf@C3H=d+?}n zIM?hZ6H{o@0%~JV9Bu#LdbJHm=!7^{VH+Zbi)|B}`>7RkK%O@do1dYnDKLh{ebqBH zXLA~l9==tGY_U552m@;ItBwzpH03y%X8Lx*&qP}zop6Wd9*s6n9jy8z#Xw#DNIkEi zdz=xdvNj9!dZ#9YJo3I~K`b+VPTR#_WslBYc-M^}?njg1;he>=#=H_| zQ-f27EIOZUaq1A7P4cXGrW@$JZ|Lp|QGXv)gxW#&4{09=CR;uR2W1m~l+2k01uQ>BjzHXBzDf-phNLj33V&g7yCEQfNpXJ{8%=CBKw}vGP%Ec3r34uv>R8{WuSytNqt-;9l4+NNf5SN;{cAg32s0 zCiA`{%*U!0s6>#+w4~DcVa8`sa;z81iDGFyYnMMZs`dAeeQa&E4@N7dv^MuASve?F zyR)$yNVb%UJ61%(K*984FTCsB(CZ!+M*^^T;r$&w{CIgN!)bmSfLcQk(MbQC3eu2R zVsV~3d0Nu&G!28eXy^G)STqMVB-G6vGC;St4x~^z2-FAEa(XSi%>&92c|=`q8QmzD zr$$qx0p-YSn+w9DCL`&S2S=~pGZc$r#}h6Ri2v=7Y? zNp3Cjh7W{kc_Qr?wT48J;X4UX90il!fhve?QHdi4_QAMZ{p4ArD%I1_uq0jI=Fn29yxGj& zfYbwN2VV)NmxlGOS5W)736j8VOe4*9?*{9>z?}4iiiI#m6(n=U?zau;w|9H?I%pQo zE}CCx=$Bfo%n1?5Jmh+h-ha9|J~}pq7X`vlsJa9R-oSB4@PxFFE9LF*3%w+Eo|@f} z%uoOJ76N|u8zjpbDmpauX9#DM21q}@$891dG@N!;i6RsNl3I}~<^>D~;KQn*Ds(yl zk~KSz<+(!gIs4luS{%rG#irq;f2yXhaO$*UxY_u>A;N~1HP)hGefh>I*X>{zK2hun z=%Sn)fZ}`E+={#*N`>6(X7O=qu0a}z!BsNQ2ugiIvYcz;418m6Fm!9F z{0}sRv6qu+eHXvS+BWv{VMp-G$(!XJRCS1AH+tpPY<$ZX66tzQm!Z?+b9mnFT zOkvkF+kcdB24(?7HP44xBlGCX4)9Z=|0`H3Z@+c@!9M$YO$wd#mCP#JCp!=Ea!l^D zS>j?%8}H=-Hycla&kii+gU0{jqMWkOz^=9g|NRZ9?mUbH%H`g$D&>bxoTDo60>_*f~y77*cj8rZWwFe_la!wTC&*+M}3_c#IQJ{4*e z7I}Y@rlfwK9Z(G%FFLE?W2q*Wq&(;kl&MnZ3G>U7?=9?kQ&T}1f;@ao(LVkE6lYhq zOvXg|y1Spsyd2goPl}rTtsv_77BoPJ(p*k93rXjOv|djQShwI{8RTH|3Mu}GCt0*7 zK~P-bhRO#hq{rO!r0i7uqC6*fJzO8Jr=@*=uKs?v@qd20SR*J?ofndo&GSnXB*!)R zO0Pk*vAdXK3A{HY!eWx*zCe9}hanX6K`irfQ$!V{)e+8)qnf!+iwg<;7FmBociUgl z$bE}Xg&It7dobuREx9p!pN(m5NzN~r_%|}sz`+7;7_;%|=hm|ytlf434;^zRNHt1M z@1sT`t6vPw4PEkAh1~1P)g$-}jc4qPH)Q_d(y{kfgx^!&u--xE$JjymqHfinxzhsk zBHcPwPd?}{XHql}0I8ohOoi1X>2!%A4XI$KM*6a{JeLYSznuR$lI;u`pO(y)z{kpH ztb*<45FZ60rYvBl0G=MTu&}^7gwNvJ?FIK^c&S@;SvrJ)%(?xsWtI?~-tZaeoX$CW z;VA3a=S!7Iu5lP~!RtS7IIC+MpX#w!L18+cdWblmSJ!0vH2n!eW6^ZcXT#6C7smVh zwYW(Gj<*G;+>d%~E5;U>sQg7J3IL+q#mmc+&*jbV-S`7?i_g@vHDX#1G>&*~k8EKy zD6rQ4dRhb&RoC2ItuQGItp}zw@By0tq%3xq7?qbd-zc!CW!-!X?`&mo6b*+lu#(47 zVKV;l(NAH}Gd5T`vwvKCv@PiP9v|mA0mPutzfp%-2)qmv5)yzdODZ_0_O;dIv{hemWbsKg3 z(NTeQ5BRp?1b_w*(L-;dzM&dd4wONNda-t$JsiTeO4nz$bRV2NfUbhjeb90)a3&1e zJmAojhNnYc$`EPipIp@|=&R23by8u#(o~RyEp+V^ftOT!;tUg%^>KUg_3Nd=GaNBF z1>z=l1Hs@PFnhtqtKz;Q^{kUw`UY4WTfz5YzGD^^le9+!vlm>aK+xMb4rPG(kWNl8 z&@=fpBcxa(M%_zC?YJ5Zrx?nwu|-dO0j#C>(*;9C6<_Pea!$7*MWvTZc2G81UTzEC9uQ<6~2?|>RVG{>m^+fCPe`rcFM zhkzQa5>(E-E4Tt0F>FRF*1VoHpbjOIap?96jfa7WmEQ#FF!YyzQ@6mRI!$ej(`j~E zffREkW!X4gC50r^ovs#0Muy9s>f62R&dg;~7Q^dJK#(IU94PfMIo(%x|1?N)(23Iw zw1*{FAj1a6;EWA87Lu%!UY;_|9*ld~)ek=Bhi4(fPm)B@JNLyzchDkEwJb|^7**5^ z#hI7ND`8zU_H6GdHtdjM(~p$ifASc0bJkUZsRCQYqp8X5pZGk7=B_Kioc;4K!-fec z2JFVh7giELyVdQ&Dl^jca8*cvt6oI9`bO}*RxSohKWL-yBVjxY`lcx@M+LjqY?FS; zK4WB9Grc399YUIFht?v%8}KsMg=rFh(}yxmcJ=ha#Pq?+TT`i2gVp@;!@=nAWyk=o zVGGcM9qND=i;OedgFl9VJrsHfPE_(qU;mSX6b z-I(k(@^H4-9^MXIE{Ee`7l5ts?2kiUL))jz>`1#B0gawOlT;0Wev`DS9s@2TYw4;F zmH~5`DD|?fb?68f5%C51-TouUI+jGBgQ%iP2bGefbp!Cr@$bHxo<39H_FE_O-fwh4 z)pvR&%mus#>|pO3NU`9(T=25AW)&%$mGg+KET}241$Q&uJ+b;*exYbXi#r1=j%zht zZZDLQN3P5=eP11co(ixhq-9fw)oGK>cWGfEwYdEcQ@yF$$ zOx5q>sTqQ~S{5fY3veSlm{YhqNUZ_a#DLVNYOn1Sn@-g-avZEf<4P` zWG&^581}0v9GI=cduR>rI)o8#2Q>)Q{M3F*iSWSP?%Y%m}Q*Q`@G58(p zIi~~&gR&gNhf9Xw24{#Kb@m@oc+ST1qwF_05m@L@uK@IxkQ!gNIi_o#uP~O=(;hGP z<^BTko*ak0-r(96(ypCoW&!p**&2YyM4i2H58hpm>c_|iw5&=$l~EK2x)yyGIo+9u zkP(6}*TZ2E7?%y*nBHhbsls$@(1(R}?%Zk@CyMY-fW^7mP$MAXsQqy;#1~*OH8H9A zuzY;2)ST?dxRjm9+Qk4tIzNEx$3!8j47_gE@HA$}v5GhP3Dz zRkbS<+^kT*jiVd0a6AE+OgyGm*Wn+ZAGY8!7JPs@%jrYHX48v@ASH&nC{Yr-!^3J3 zwJs@?`CX;Y;>!Ev$ul4ZyF=Mr6?r49Oa7~Z#vICj5~BjZwXS{3E*TH!VTdmaZ#V_9 zBE5c}E}U+2R2P{I;vYKhfYx|VP4>cXlY$)hSvBf0FR#m<~vLGm?;ejcN z-gUpRsOz@0sD4P%FK$5kD=Hy?a?;2>eZnBm`X5NqgNO;>Q$8#Qp{NWcv=@6=NS=IN z6{I>o973oP!Vm&w4viXlj6Mnh>D;-h6yDIUN>}FQf)a*>YEeK5mLH1Wm zY#G`>4*7LNfE>Z}R4K{mZwUfm5KN>l?<+E$m_b|d0fb^_ZTL#WfP+=Y+WcD8A=ArP)C3{#9cGE{ z=)cF`E*beC139(wY1lad!J4eA{}5;pyl#3W*gWqK)8)Y4gR4*K>^WELE070H7jlj_ zG0`EG{LY9x(8pZ@`)~jhV~D(l2Q~e~bzg1Sq0S#176H3dbhy~(6RNZ$s2>XG`xt=A zEHPx}kq7+pcZuJVlP}1{b$?@Vt$*;fQ^e0^YBrAiIdy3;G&n+yhL$SJ$*nyxK zLMe3LaIXKW60|lEz4y*^pt&RzlVM|L4G^2y=?(6=;XI}kgb*S{Lh%OffcsJL1{ACi zAc{5@`6JK`)gIW{pS0HQbWptpNc^>wuYS|{S?y0HW+%!8^v_@W@8Q{yMot3egh2xj znn5Jluvjns-`!;24oZTXD4IidrmQTQPGZw*^fOG&Z~6N~?D=sZ5GNXrEpEtD2lqzk%-O6# zj-p_vRz_dbNp6YmpuJBor3=%^JEU&$V^EQrf=nojUg&Ah%UQ#4@7=|##&c|Hyw{9f zZeF=_Cat=lI z8a)(0$bssUw$OF)Ryew4%Mo6V_(>obg%S~D=3st?KtT5>xW_UHWQgwT_eCN+y+rma zIaWcpFg!vcCD|L2+8Vn1rRY#fIA~G&YmGh5kCBY*Sg>4}uW`rv2V<1iXEl8BnU*aBgl;uHHE~AOPC3X*8fM(>CW}OLBXc{H4 zj(RFgfvGGQ_Kty3n_4u;fM-T30Fix_$cgtF3X}e3#WxL)GDc3I&<}T7*&Epoh91wf zni@(R-3KDXQyo_J$<7px(Vg~62@M|y!?Anw%AG7~4>S7gBTQ7taD$^ia!tmQZ1TDB zUSp&p;Xcu2fkz`x6tv-KS^XlUr+1#CBF zOEBowdTEYl^GcBZdDMqVj#oh00;V1Kt3h&uxKghjf`qaSNA|H*x|P_OhHk4}xPIYc zKXbKR<7tEfiD7mLAb`oJ|K4m}opLFla@{6k|b-n?Hg1eMg&bO{B$ARe%*LSWtxdPFv8e#tx-=HqeuY ztNIW6M4zeE3eI=Q^UfvmLAh@9mG;O4^>CasO=}sj=%S?$kKAWUGqyVX~ zO}O+=2<;9_6O#H(fsZQz@7a!hD;q~vE?s4$H^L^>$lXJskoA0REo-x>*lRDIa}f1bZdwoks@2ozKTP0v|m>ZAY45X4WhIeL&Fawd>aIswx0| zdi}elpO^C%s)EC-BCWoB&+6(EvJix62bWgVr9uZsoF`eCqa96IHaba-gCg6#3wMp? z3?=<`$6t1#f(T(MIht4CrE%>?nVi(-PDtOuvuYr#f22IB3j3SkZ$URAMj`es!bZBOAL;4=r7=bk6mMr(tVv4&+kFxoux7NDp!^7p-5 zweCnhNhaQVBPtPU!il>~zJD;(MlbP*b;RBCZ~AJ|&b0A`9p~utT)yDAU|6Gx+4IkG z2@ukL{oL+HU;ebe6GgKIc3h-bHG%0jNFaAs-x3Hxjuhdhr`9nMtP`2Zaa#~fbbXU= z_HvJ-f#&;$25V5|J?@8wOT=8a$)>%eN{J~du~z=ccWq5Mhc-;v?AYP>Ng{gOg80BKqWjXkeB>c9Y+etI*N1+Z zl1Of50{>_>K&<0DYvbJbzp7juOOsqn@LW{h7O&mvny(Tn_C!=V?vWZZL=`#{40?W= z{QOe8nm|(UXtBKujdX(S0LSa9l@gNPZ0A;ZW-ag?I*HQxfIRFu8f`zd@j(y0oV(T3 zktf;6-P_i#+|JbRD=iHVTKgSc!3Zg3Es{YA;U+5SXk&QStX7}t)PU$G4?N<1(d?)L z1QsP|ArDsT8sU((f;V!*NHcs5^6$`w5z665|0BZg7a5h9GMHSKS5w+=uc|(6W7ZFReRXGufxZsaBVjcHDKR zzDGGRIZ2F1o(a%xOtjzSbYb>+0+=ZcTg?ShG7*lyfFX#DcY?T;p-*fzZHypo#Ct?# zrfuO6C@Coc`{Om(Wo|$m+JH=jq!9*fV6>wRL|6qiwVmMHx2C#j>~(5Ois$wD**UbE z$pW!U?({T(VZ;^g4O%y-c|R4&O%qJhI4N5-(znIPJJmW>@ z+*J46qA%~uE6zuPdCHVHX-ZChM1FkUs?c|SXw)nIfHWObsL$o(dX8VGNl$nbjhqrt zkWt~$z24OJNaE$}i4cWQcb!rV0PifC7U!KK;CuwU>kI88n*lpt>#E14aMXO4Ug}>e z!VEpe`4;7tNgUV4e1b8~81d&-DBK4XxVL#B;y@{ftpP)dw}&^u`nhZRkQO*S@3V5# zm20GpdhTa^GZwP%Z6klmqJmr;Td-6aflD(yS42Ay9Mc1Nj1;q!(ES_J`Rj-2DD!&V&S-&vEb+A@%~WS^3X6iSY;BOcv2ALKio*T>yZ@b^I zu|h1ouDa1`}=5CFu6^&jeue zAr6k3CA1Qq`c8Fn(9$v_yONf0dnu-TxjXXS?;dFTi1r?0(hR@_FRlBqJ73Bo>Y4py zy{+B*;HFP?mM8lmVG(|o6!zhW8aY0iQlFk5>i&6Qw$#yT_Go)jjz)yY&9ZN{ldlez zw(jfL)*t-Hp{f7h+2={gK2S%{Xy5x_+cIQs{trAtFp$+z>(dQ=hn$H{N{B4Op16(H z?9yfZ!Yv+Ej3az^=WFq({|>%a%+TV@f=s5SECdqG$rth?sQI7}>VZp<&*JAHTl6F} zCVC>zOhCuPj%Md>){k4(uAS`mpABc8b#(Z_7194;w#xJN+XdzpIKJSDGQDPG=-v5Z zUY$6*(td=N$&Teq1wShDZ9Hr5cv;QN__Fwq51bWz;-eM>5;{LcN3Kci;(#*YH8h`B zGtC#lz7v?hV`zn)p^7T`3UAh#$$3>V*50BGgSrHEgeP1t;lC^d+N_~G%4#<>g-Fvj ztOs@$VTO<&Gwa6A$_^aNiXYw4P%AunjCrX#H9U*Uz{dkpH8{1!pY|(9KJZ2&*EdR{ zm>o2FTy8peC@Xoiz}9x;-TV5E`sb51oDysu7soTQ?B_lS=nsULNGDU4g;`p`mF0YQ z*YM`hmCu>#R$ffjU_zxo#D0Vj5r7JCH})}+E(G@-Y*c|^2{!7)6ci0R&+a?9Ql?h) zL*bo8y4wZNu%r}Q(pWiwO{3qVvH0V#1CVKY1NBtX4nTMGdozw_>g{ITLfdVCkBK_$ zV}n;|Lyej;)Al+|#e#9anBzaS+&neDI}4}6I2n4KIUvl{B3L*y%+IZpJaN;V{nWl) zZAT_#em!-%mle(AFH3Z{goxSqorvfTb~9nvdKkEp>q;~?*{EA7CpAWGq$t(yQ=400 z?GP#S*cFJc}ri`{`TCN9M|^qefxAg7U?mix!IRe`If$_oB<#?8|p(y*<{W69llNS>=(;sn6DqoxjCWa?7?9civ%@ z2P_(V0k@I-r4(K%OHoFF2wWQqZ80zQMg(O8#|qL3f)ovv*fha_n1_?DC&s%zKGXqc zz;%gSBdzKDziOvO(joI5Bd3AsSqY>Hgg043YOK?!A)+$nU6(VyiWZm-&d(ny zI1L@hAKY<<*UL(qcihkuXtq$8!^0ZWn6#Ypix7xD{o*0 zi4^Vn4+DA5kbf4XYwnd?)b{4pVisd{Mmz^wWx72R&SY$hdgOs=&LDg2lP5(tSn-41 znQDL@O`<>b&zt)jMom6Nh8_D<@aaiG(m-HYk8kb$wA4#AKdkRP3}Fa5?d^R^IqCa`waO9PSJ-d6!C13F&h64961vIoaK7UYl{Wb6La}3Z7-Ya6Ln9eZab~9 zEA!op=j@uXfqN`!*QxEuxO(c{HbtSX=04ZzmJcuQo@XG*D4jz>jf(>B*0tB5aT$mD zYWO@C*JHSck?Vc_cUfWniTsH8{i_+S*%dRGUu^14{Odtk$h3(Uzp`qa zyz;_b#huLURu#UQW|P9P`c2V?2!GI`ZN6ArCdC}#-&+4@}~ry`Eh;K z`$G0Ucoz$U8TcsJ^m>EG#gR*N>4~<}-+bJ-U<74Xkz38d-xHU6=()1GE1HH`vifQ; z9PhdO%DGMlz+ipcH?l7z@Tf->z1iVu+Y$T4mm8ew>_1FziR&G>{j95rhKiz+ZtN(C zk+QoksoJd>BXjn3ePWllb~fYw>HX+-KXuGPBj6>K+NR4A|Be>@=V?S6y1>PHpRxcnIIz`WSDkUTio?R$`W ztMHx^uK(mL^qCiQQa@tXe#SwuXe+DXo^gj)&-ETWRT(TFR8>knzTfTCgRPp;dkp=b z+8Lx?FMSrGSNf1Lv0htlg<1aVdTr@?B_SnAz2L=)9~rCaKecQRYD-+G2NxetJ-%33 zc3SU;_n$U5p04*_V$`kDgME1A&+loOyh=vxF}j--bz-l zXBd>V3wg^=vuehwEHho9 zz<7mKhHShnyU@X-K5KL1E^K?AB`mj%d#|8}{^5`AshjEeBrFXR! z9=TsS_CC$w(FHkYx2JZ!*}dixZK@XwPIn8HJ`A(UzzH%;+g0;Uf;kQf`da(e!pr$} z@oUq(J2(0B%#Z6kV9F-sXCK^`%^=2QUX@v?a;@>-iOVN-H(xeC=`U`v;7?P&*>hTy z`nS7oF%F3CGJT;8t9)LfinpNlY;~i5>R$NzFcp5qZKoC_k7bZI9gk^xGXslv`o`Cq z{&@-#DdGQoC!h1^T_3Zpk?3vRaX*%edpg(Tt zF-)}(C1JC8x#q$I{Z;R#TQ0G$fuddIVOoz#E$#+vG zbH_M8E{u=F(xpBD$;HCFr*3?6XhX?pf^M8%i;`5~@tU={?DCZXBIP@RD6Y5g>z`%s zJU*OnHn84qQ6oQV>FD&T`P0?8Sp(WHZY0)qeJHMwuNDz8d;*U#pOnSdpmW?G@XjfK z&o-+61P{hIh*ap$Y}KcC<=NIDx{|~{LF{(R_aRf{bHK7(c}rd7ixo_gZFE6Z_1?Nc zwY>gmACgXdoD7on0OAYf($=-9G_hM?e(_X2hAm(2bahyWm_j8}W$!+lr^1=_^*lnC zc(%z`gl!!b*mEMkJimgmiZSPqfJHRuvb05E>+6eN=5-JsX;9zN#H%SUQxN9j!}!(v zr2a|!)QbMC6)Gx;<=gwXxk4$ON%5D9j#->dYp751YaIJD8j~wuUGYk9$kl&mk9n4o z!sXr1@0J1{@f!PF_Q&Sts)0Rf1GIKZw;9t|^~VZmm;Chk^HYwFj$mo8$hp;XI>i4i zuPa~Pw|^2bQ)R2tPT@RwaP|q|*>FEW6rG{8_N0qUmnnbbggdOBk5OdRId$rMbND}E z+@2yBXYd-dJ#@)|2uc`vFT_#y}! zm%7BXYAi?m!{DF` zJW1$T-aAMvbb|l1FgNW_?tI=qBNbn>!lKjmO=y4p+S0YWyqfzQT-)n;NaJ3OH~!#1 zVxG9>^}tKVdF#dD!k^Cp`oCsn?K-yL6Ri1<@Sndvl61qKi8p`3bX}S9mUBAl4oZRn z#utOC_Se5UnHyKL?>_I{-(TMuM~D2pbPbrrOkWROz21=Z%1l)?L&?NVZM#qI{l+)& zxr*mF?+CS|=(s_nPLmg!g&H49Pw8d_kb^DanO_fl{M5qHnc;F%ZRPa@W3Q9?{?*U? zRaU_XcR@V&T!s>*MKb>KCJ6{e?43F%C%zxDe?G{on07vqD@T7w1a^rWqb|Kv6$n+} zHN%%G4#D_?H+2lyM4xlLLPJ*`{!FGXX0On=>jyG`Onf`(Nm7Q?ClgbD*eQ+_T;y82 zaaJvWcVG6vyUn3q>w^4C6fcl}kNEbLk5}Y7eY1k~lK*OH@3h;TeDyuRG z?#xM_rz-G!99=5n-$NGXXAQyJx+UA9pUX?PD_;iA^*!6(@z*z4FGMH;m4qu0bL{&s ziHZ3+#$J4`x3go9rhLo>$GT@%5A~SJr(PYZGW)VQRP5+U`TjvJcc~gVyqQfUKXBvv ztCP>Eu-6e6?+dl(!5!NaC)xGn{ae2T!=}Y0rg*ygpB`dLuCHx+bE3m>RvlX^UB7zu z{uTNoHve*>tZ@8Ua`IVFIe)I}g(9CCpdA9?#HOh2CWMuYJx?<&WYSGVuGKaiV_Jy1 zaI9>hbm7HCFZNo9Jp!w_lvLxYr%r!9jo$;&5IwPS_N2<#$QWL4EbE>vYa9|1;jRph zEspi-g?O!2$~W3yvMP`jP(*@48dj+>WKN=9YaK6(}fs-C4y_fL#?VDoUU(Kty&)Zvj4u(>Hlk__DU+??ZcNjt#F}2Xq|4FjR z_K^K9T0iWpMS2h@`0h<4|91I=q$y9p}ovwn);@u1Z*RoSfT6lB2?V!**0F) zC!U^bL0^3edOGfqcFF_xLKO?+uX}O%v#wJj!BN7uEK?*3{^1m*_dGfJr(9BakhNG} zb5N+Xb{o?iW&yphSU$kw=+#hk{ssD>S9$10i%xxC8p!3XO zXjEISof4jLy03^ew7y=+5gIAgX)b=!yao*d-!l?XEcsSk{^hS@sV}hcfgL=-ag6c( zXBo?rx}KHhJ&7+XRjw#sbW&9k#ED2;EWtJgL3%wpj_ zwgvH=zj!j3Sg!hy&#}K*b>}d44nJ~NAl_U%w2DJ&{O?7m)Oukvz8AF1pGhJe|Le}m z!=J{C{F37otl$>3H2L>s&-fd`3DTRudH&2{`~SEF*zU)e?Udo{7#?bPnx6crKJRI> zVy}4?oN>ZjUX68skX+vT{uBD=EU;^az_cOt5|1EFw+@T6b$+q-doYs}azwkFH-Xg0 zf`7f`-`u)C)G5IV>%z+PpkdTO@x6i&_V$v8;mq#65S&mh_l@h-*Hf~mbmR0meZ6>H z!xMv>;pnR73S;vs*1paRD_2;7GvM<9lQ!EH--t`>lR#{95&S)qJ0^33|H)#m>f617 zrXo+JPwo|56_DDK_^MK@GbyjjJ3;r?8S-wBd7!~{ZvDh}$(Eb8X*3LRdVAIUt$Lqu z_gd$qYfbzS%N`pR3<<%eQ(G(cWC7*t(Zt-AO5LQauC?gA?=_+Ox{2oN zJ7Wm{^InF%_WOR{_y4WKalCu)cd?#lJ@;OjncML<2t@Selbv-yuqlNzjGgl*DY`7~p!BTz|Q-K6F5pZeO` zLV<_OYXSBRVWi4A)Od|KPC4X`8XBTPLbg4PjAUnLKaF8vY!}RypRQSsD=mcSEbc<=UTXPphc-h1m75 z!ft4EdI&1qn53k^S7z|ykwI5-6x=~9$Wf2^7DW&DJ>;*cE71HS|L*J8$1gNzSa(?% z7(Dg#>XsrI*Mo=DkeIJUYTpn&X71mHtw<@8#xjYhth-*acuUoN&EGseQS&p3PSAb) z(yEo}b{fg?X2GwnCbS3+#8b<;46`0<3;r|F+s?*O%Q<>MzU@0ger%Ga7(T|PH_+FA zhWJ-mxXb|6BK2lKTe-BmuNlT4q~FiRK7!PKS$m)e9C%$)ZAn3xru392WHe%laW;KS6`ERio1hUJ`$3mR{s#6 z;NUnS#0Jsr)vXpL$GGZ)<0!P7+iZmwF08Pv6BB3Kw@(?f{i+9^+{~M=jdF|J9)#Y? zuo+7|Se(Q0I6f5^iT=IQK1olgWq&|`6z#>|(xJD@9J_#=FfK+Ta%9RzVNk+S0?jWfGZpPFr3%KQsD{Jd;c9+MUPaMiP9}YGWMxP=BH5s`0F()|*OvcMHq# z9_br6m=B!^m9(+3Sr_@6Xu_>qi#g7`BqPOLP2zRv$KkdUJ2GM;`18{Zxl(sAO-)U5 zSwla++%L2vqoTR_8Rnc3%9T!XVySuwbdd8o2a({JJ`AyqW&S zYi;j63q&9J`fkv4njDtf@5Nt%_N8!;g_B?R9CK};OWg3s@5$#IxUt`OQGB?(xOVNg zEWp_({Sq?2A8t7RONV?rLb`2k*o2(iq>#T>1|(xsP0N-am@7om**U2GdO zcdqTfwjZbG_0Y#H0>2^zuHM&*b&|_EZn<47P?JvsOZK#cAIpA@^6I^Aj%2I4-Xh?S^>!-cL)MFPH%T3}ej1abmbioIVY|p9EOqZRNKR zhTDw$!3&Mya2=P2Cid=68w|6!stKL`I2_6x_nj?%rmUe6g9$3{I|tw5NpP*ATRe=W z2-~g!_(P8A5kA!UFDk_L=_A9fP~Vf9sJfDkOv4%%2+9>ny?;@}m2j%8SXU~@cMmX= zT$g{}?3$4+%}ju7cvDQPtE==)YJZmeu<*%D{+M_Mh)IOuj>L-?d%9~Ao)8)9UjFk3 z5?##NGpJx#On(yw(T|LA=&er3L9@mXQxjc{YI!JE_FbJ`|ePVs{$C+uaUCH9hlkNxkSQ8Ro$I+tv$R z?h=M3hA*~QBB*%nd-osc1*3eaV5z!Fnl$peOm!Ro0H2VccoF8i$!`)*_d^5@zwGeH5Id9l^6sv#515h{k4A?gU51JNGxZe}p=iYmQSz5mR`$*Q)xN)X@X_=u z!pl^}CpDZe#$N?@u}d7jP-7no7cW^djIYRaxTl81XrvQameV`u?w7L4T5NO1R{*QX z6yAr%1F|vP6?5Lq1KG7yHs@J!?|1WWWh@(7G?9F1S`^3Hg~Kn!k29T9_Z8WodHAzD zfdCE-A2z7xmVA$s=#(%ykC9Ddr17)tY%SFKw{(Jret-$%5cT@)M?Z-vynK9o-!k0X z=;AapmElM~%-^nWV9*WeOBg!phB4ljE_3SMp_UJ@{E8=ou{ymE1&|qbjTmVsZ0hCd zIfTZvlf*b%NmllvR(erUk@|D(YnYJr7@55goGU}NUHz#eIQ8>Or*-E1ZE(t%KDK`* z-0|*O8SXZmdAZL!Nq;VB@gmw=%?9k07SQ4e7|_zXJWB6zUbTQ&{7JJ&jnnUaO&mI| zC?w$zu3@;z{Q+U-iPNt_C-1kq3>n{5(@S8tL>3#wclFEv$PdLJLG}GvL-N9=7!Ocn zxerHDv{Fpu6E8^WXaG6KbYv25Rk6a`bYd)W)L5)YY>UaYXSHmI`za$Kr2tF2RkFqhhjcV-Bg5 zMYs#UyN!;H_L9I#+zP+2Ui)bQ{h&zlck`(Z^RG6UV!Ntz6T4b5tdJK;TVJbF$3nZ4 zCvQ;Q_Qui7!@slPM+dA#E6DIBms%|ttEp$%rF^r=EK(3>U|=BGqEz{Ok&)YNoji2w zw0`PAw&(ki*%z_aVrz;dQXwE#+GjQOzo3>)pKI59#Xl%D;o(KEC1no~v;Z!>Tg1b@ z3vE$+Q8hpCwBT^|m}tf%B-;Kociu%7BTm+`=e@gSLSi5N`nrcH03%is$RLB&KE6Z- zQCXKWW!-RIulMl<`deg*WprBF<@yx#@YTS5&D+as?M)zdv#(X`h`?W4H#|V4v^=Fx zu1GRfO^G{G2uTkRr3d$Dk)+VqA0BHR8_GcPcJO=avuy20QMQ(MI^KbDy40=P9?=m% z@^I%W+=yp5A=2%7q9WJPExvt6-`(eZbzNOA9$ET#R15Snf9Bsliz$Vx<1(kGCVV_R zxZ1{upKK_`_evyWkM}Ut^|j`ll@T2FK8oR4?my`gham7dZVtyt+`8n$$1og|pBGe7 zI7O{fwz7Nt+4VeugUw&O2yhtN0|3dM4T~hizZlPX`+!rD$<(kR__0*qrmfwAx+b;x zC9VkC_+cwzYb{#6efrKVhb1785(l&ZN?Vz+NC|vfc zt&Q`+#$O_KjFXqW$~S7WgxLcureAGiFVthH(AuYOfA8Hxmpp5Q49wMPtI>5XUh*q>SOLr9O_}1=CS(%9UjAusu!^vV)g}I@&DLv zrpYtBiHh5jbv1Z0lEq}QWkPNjH}VsSEXax)ZcuwLccZJkwk?RTlg5oPd?=? zoN^Ksy|vA*YlkB`3fc=UdGXBDc?TbgNCe&`Bf^hZRw zUMk|T1bVe1Z)=W1cP~a5)i6#uUH%dKPr@H>&fgMKRDwN03vZv+w@G1HhaG%${4dxn9ZZG{QV5i%y-39sk_w*Qt9mhDKnS0ZW0T$q`xj8$=%^)5QQ|hrkI3+F z;r-b^pKRE#6^o?C>*{Y<^wyUz_d?e60wxNVCXxHqV0`1IJmYI!4H#-D+>4sqaA22? zbff}FkwOIR%U*s*gR|V(vybEz6vDXu)UE;_nAF{ismALf=GRZ|sjhwo#pb5c zfeRNDC+#_wE(-fwp9S}$9unm9mhF*7xZ4(5WICsDym9DbODACy!;Ei7sj=3sBisPV z503t@VAil@04S4t?yVqykZ0cK59oCwy7V4Q8lF^*azoWL*6wHhcD+g$9z)&6?7tVq zsV1ISv}h4m&?Zim@SEJ2ftpq16%@padPGL%KFNPg6S59UDBOD`#P}G~hIHz!&C)c8 zcjFu3`A5R1GMROwaY8x?=z6qMn#k+d55___7++^nsbagUbTr|Ve|p$NDgFHWIa8Pa zwK%!^)9zV}8~-L*8fgA#KLAvbr+2-*JoN~gNqKVP1VfOrmR1NntBG=5ECYuvFDECb z;$F*G#R5*cEST8Z!NYjiC&5941PEroGf!Y>YuZyCMIc5bx|qYWJEmsSmxNORhpkOw z#d29v(T=E7_qC(L1QQqJ9`61YU>Z+ShFhAWB-iaZ;ZIVE*V-5Btx03_6VAED6AGoQ zR_Ls(eXFr=&hE!q1fg67)K>h%4{w#(% zeLxWD>1y5G-EskJi9sgjo%`m`J3g=1Q;$db1PIKBJFC@pnn62nN$9^Qd@91ccK)gH zsoc}Nr>>ADiv5(W{3uGTA@w}RK8?M2Xz3!BUq*%>18={wd=G_ZSD_unZN)}SD~}M{ z4ulB6{6KUeZ9#LEFuHdYf7APn6p(7)QMn2=Vv|LTurlb8h>X=i6A&F1A{C7&qy zDpgM2;>O@`t%kWsvKba@#|n$3Kn}O0UNpdTLX!&@lrVGJ>ei;?=GkKr_{CdfW=Nfg z&b)Ol#X<2RBY{4XBZ2rH3E=&(8P)I`R<&6~F^vU0-TaftO()0ng?ctrhr<)KG4{`! zs$VgDF?`p4(OA4;&H9LqGnvd!L>%dutSn99VzWQL$?f@dbV5l^ZuL!9(OS~5P?3R@hV6;S0trwx(GoT_&7!6 ziadHsW#vi|b$zdJxc^q7sG_p5A_LpoU!W-6sJ5o&UhxTkK))+9ceApJCmEF=?JHb@ zdhHkn{Efo|CEVzdqq5ljZTI+`fUIQ<6tfSz$~c@r_qmF+v~>QX8CfZAgwyx0>pQmA zJ1T;3Hc2}am2dT)%N<68i3Z)TZBdSE$|SXG|A8Dm6J>SzfLU$= zq6_wh;?uVg0>F|;e@3z%hf&Q@Q&U&P3-9XhD%OASawn^IV#9gBWbSVc>shnzcBfbz-p?hd}xSM<* z1W4=#EL=yXTs`#uV?JCyWL?K?RbR)3qiX8HEM6PQqDhErrA8%A*1NQ8NidHyImtE> zP*F(pM6CLRx>PB95vvCXvv&9P0B_zR!c|e+%&@WFVIpq~QTFcfDH2xSmA7_`(-&Y! zRAi)4y|u@NOt<7ymKf_P8KVESuOUe+RQ6oGb$fgJ$!UyO6(T)8L!==lqSS!?);7l> zxyezd=``Z0+y%PjAjkYFV%!9bGcV=B$$!*D6VHVsRBtL!Y0{Z5J-6$_hnmMVDKYIo z>=o+{T9~^yvhlO>tIMYfqlDbJQL9AH1n+eD<0kimb^8Kd;?P-7x0nfKZ%rsu<$_Jx z2ly?%o)Ydwo1Ik1*J|{J?^NH|UAJ0h#Wn%@iVVG*+!#Bdo_gM2%W+tVr*KncZEXY@ z<&M^u%pqhs^2#y1Z0Yk0fax{R&f1jsX}pYJ&ok5s+UfI%igw=7Z8)7|`-Xk~y`nec zukE`~pLQJU9;&MM4{Q@6B~y3x78j{N*4Nupq{7b3`Zk&RwM(rl7V;drj6NEiBtCC- zU0x$1|*@>~m+i1PteXV%^Ztuv^CBYP!eOtv|kk$XXq@ z8DakLks~SkMQac?i@ru3{SE>|Q9;3LoBcN~<~@Tk^W0wk{yffg^>sU1Yek8Us$mU| z*pgR@{GCnhvB`7FrTM#Yae6H)>tyyb3FV^JGpFN%Hv}U(G!-v;oLS-L>&;OC9l}g5 zeEy44zpRwhJ<=|*aw6V*JBO$Lk<0N%F&UJAXLZ2ld_qFZ#$$!{3ajUPdU@#$?1}{V zz#LN(Ez4q6V6B%f8}azD5J@(4<#$__td$W61x`JQo}2p(bn_P!sY`z=VDvJMQ6enq zE6su)?VY&C7wq9b+tX<(cJ1oF)5fuUl0nigX#Pzh36v6~Z=_26%0F|8wmp_zZ1?l? z?b}n+i7y`BKb$Dp0n7RD?1|=n6A+?u{wrNlzJLGjQVY}shpB&3Q&Us<%iWa;Od-T4 zE7=TQ7l6A;pZ5|49P$vrpfMR4>PUjYS1Fj7L}z4XT6cZe(btltk&rbKFg1}gt#R~G ze{2WjyM@Sb4p8S`$CML!0`*02d`qY6-D~Nw)WyKdp2Zb?yeuKGTd-+&;Va<7LAEdC z=X^L3z2%-fO%nmxS@dPJD~qXr1|IB<)Y=cBVe}6ri5I*51D4=@`6ojqulIiYR!t@p zuUKE;Q0*$hjeK_;68Qw?)4sx%!i*h@7cbtaZj{s@8S?eli;0PeFwUZPJ>9O~Tuad= zwjH=C9tNpqs!{pJK$4^oUsP6Bi*uOQaoj4s*-Q|wJa#|cZXCwGAGL#v{?3pw3|zcM zz84Za+se7};B>xl^6%Tn4)BJhUH*A_KU%;i>-!&`I@kIx)LGd;n@zk#Nh5Lc1bfqjzF#h23YXWND7tdb2lz%Vb+Z|9;$CBr}Lp*Y?m(J{c z{c)tV-$-8GlZ~DIwjurZ-p@04_~W@4RAhwkLm&3(o}M1hx4L8X`}@E-6SxOpv6^%w z&j!5(Ticn zl?k$HKGOdxj5Id3@e^Lr1YRe5G)Kv-Rx+}*Yw)y$#LyVH=I~yq+lDcZKtv!9#e=ct zmCrZvM*O2V=$iEV&S7=@Nyl4`C#Qo>Nsn6S| zKI_$q3|L;2#Bw0hQM}@tGOT0ZFOcqH{spsC<+Ze0#Oo#jSE5I+=|el(1FEi0VJi*$ zmpgQX6E`cK^ISEqW;v51_k9!y^Vx_&d%};-o;ec>QzFwnnj1mdBhL^P$b&7@0n(@( zuL0m4gv08JP7Dv|Inp{-CSEr@JRDpzI@lAFPzyFjCgXcbomLe(M7I36@SM7C{ZqtZ z)l+)H1=}R&mlSp3lC?Xtp!SB0{1I4saHzimXfhS`B^>jOiBom!%T8~KMW&20lt9&(EjnDh~f zFCyW%=gaMvc4E_Csb`{mIxh>oMvKE>se+c1uD@HUVHGTuPWscWQ4SZ`>*1a8klB+v zFv(clZDXefi-MY36hO^rv^xix=K-pwk`Q3vIL>CD(bUX4_Ge~%yfhgm77LDKGzb>= zv#+xJ!w(~>Lw05jG%f5o7ky8{@Ete(J`ZuzN+FXN{XcVzU3rTvI%MWcR!W5$n+my#D3Kc5gB zEa6dqbtUoo>rc;nw_o}6Tl1yDt;OZ#+dUlSZi3RQ9UyPN%%@Qy{Ojwz;__mV>E>(~ zUkOL3EsPSoO#=%!S7_&QKVIm+BzeE-qkyUasZxp5-6T0OwP@0}{?_$CDKDpkI1q4)7Rq=cafGqgF4@Yomxem_2^9P&6>kwp; z*fvXui;t;x%LDY?qr#9Vy1@{#GVx}DN!?dqBf=E{Rp@h(P3wiiVyOJ$u4D(={D zZotifxvA`zu*%#{`SNo6%+@EnZOhy~{GVeYH8O4~q}iS`zfiB*$~3-YA|?G&Qtfxm z7{3+S;n~_>TOV0oy7c)i@-w0bYJb|EDCXco!dctPD-BF9x4+(YNm8J1HQ<}=8mE{4 z?mQ@hq=w|ZI6Zd-pJCA>8tuC{Zbjo@4Cc$UfNS*Z^zd2CJv_?$EyLVtqG=ol^tPL> zN6XC8R!*il97Y;#0{0iPAc)Tj0Cd-+saIqPjJ7)E{JHk#N_tqX5LM}O(_raHNH=fX z-|8(Irr@~z<4vJg^ms0S7H{uUQC7bCZ6ycU0}oh;o`&huezMOU|HpAT021 z$+f{Bb_QicJh5we^efcLGwMHr}uGP*hcv*_;-3|$mR@z%iqsTJtWB}qYeR- zw1;|3`n=3FgrKKD3y26aPm!TgQS1VuqzTq!(O`r6tzZT1ZMazz##$p&xkWvp#oV^F zI@awg9S57*F5qLuKYV7W4SKa1aYC!bpZoav$J|8L@feo4v>gy~kU#}-PV@5RG{CP~ zDk^o)O-1!WCBvsj_Kbrge3qPiU~L5d_gkCI9zeWR-nrSPucs!4w9m}GBCBg^BOCjq z8k17wZckp2U)Q2q9B^K)NCYs;nKRG44}{G3UO^1_6dfU;Eg)Jnsd_E7bkp&w7kgiH zy>Rs_0@l*VTE|8@LI?!Q>3PLa_4@mwA~|#Oe&b_DFSX^fNH5Hf{P^*sOD#r-J`^a5 z8Xg^u$;ol5w}y{r$4Z_zKwZmBvT97ISf*D5e;LkQjNX7$gHlhJfikLFcm zZY!GmCZio=#IplLw~j*qd_Y3qb8o<5%QNT!lJ=0VvW=d*O$tSHBMN)L=b8{M5sG5# z!j5d;_a40un!0OWyf9!Z+k22of^jY^Uvv5*7W&fP7eN03&<*;JHU-SO67Izm0@TL8 zEXZ0B*U|Z`7WW7_6C7ux0y^}mV$HAx$2vBSD#NQRb8n?^z8OjD_e-l~$I4z9yhO5elixvUu-nA|=?Y#l zK!Qo7x+sQ3!T>6(sB+@)^G_bLk1t(nF;6w%$UEB((Q)g1uOyDw=}0Z5 z0=|BckdT0-KrCz!c;b7zyDKoX@BpkiS)}GU>$c_7bE$$IH?IWx7^UB-wusL$; zg>du)@>@ob?&!w*h0%-)UG~5Q@r8Qa(wirY&eVPQu09g>{?F15o!5eyZC z9wNj?;?=P6lauHx;|O3!xd+j=Phfy4l`vSfjKurTOIQ55nnPx0u}Ce<--9w6^R2r+ zy}p6#tFNbj>MFg#IJD$zk(U$z9jPF`AF;LN!AI(Xj!Wx-5m>#x_*-kvv8Dg?EU9+& zZ&hq|H-xS#+Ns~=#ElNWckgyeS#{hzt>4k)<8hKknnn~x$rD{>f?w=KO?zvjpQgR7 zekHEv1tsoRw#&vQWr|c~gR^QFo;s1r8~yr;(7itRxHBJ4(}U+jB>}5uWMp{z`!hU^ zdV>JIr6L1-t=Ap~TcabEIy#}^UP0>AWxR88+uZhdt_aP!EIZM{Phk8Bn{9FzIoJ7o z{L}pmKYO1=NfJBHeqLJq_|!71CCRBaaRMpZ`uH;nt79Sd+u*m)7c8v6gn$}{GFANL zeC0TK+MtGkABJr`VuJ+g9jAMaMu-l5BgPBTMJ{X;Gd7L_7n?$Tv_u>w_ppoaQ8{4P z%1U|5C0y5<&2U@3KxmlMANlzieHYs9fj0GujQIF{UVG*)pJKSVYvondo&OeGABcOQ z>OLk?Tr6`}V)y)7;H3l9&^(zRPR8dLeOBCq+&;Gr8?qBL!Gccl7&NqJ9UEQ*FX%Mv~ z+Z}I(2itsT*YC|4`94t8U)h~CyxQLb51xJCbd7L9z8p$&q8?P0xX>%0+f;QQ&}l^| z{Xl!~86Qq?iX-4XSHKFFl^(uqz*L&PikETl966%F%*-tJ(C{lXygY3u{LkGzz(Y?L zATWQj(zDWtxCyPWF*s*%qf{wSYtqHYfAe2wKx0#?3Zj?tgi5b$-42DMrIkyQV;%f) zkrDR;&8Rz!GXU*q_|CcsA$oN<<}6h8bec}FXFA}06`T!^lNf|5o0AK;4uacpsRhqd z`c+)I7G)#&RGqrg;3K2q)7fHP#l;eYM(KRs3#15~-l`g1f4mEblfM4LBY!;j1nv}8 z43~qgs0#5l>y37Sf0LpWi02SR`XV%BGIJ016|;Bz_?<#8PSxpB7~KY;i*@l$%|0lY zHp&m4vF}`?&TNx_MI7=9!qB5hKygFv-!uIyqn|rCuho5x8}4~Jx!;)afVN4C!-PZnRd zSD2ny6Fp>+*TcvsPfh@oUAp+T)1D7_JTLcpv+mn>(3Z6AP+zNDWpO9llc`F0h>mUi zC;qC{8@K~%gwF5XI?0kdG+S4DaUSQ8)_Z>#_h>P3*LHEKLva6chopO}a=VM%K+7 zkBNVsV4zb2N=?)&-IztW8BZfou>+7q)Y7F(hf2+_^3;Yc;JO6n0Bx#F;xO|60Egxc zH(kSrd+WrKzc-pD@Y=2!gyby>xFqVF@#m(;etuf031@4$hdo!cb|HvLhRhe0LDK&v z1Sf)C^t76O%r6N&G%|O`$Uwqw#Vj$f{4W>Cwq#eHU_ha#fU= zO*<$qHNbH>T(H@kE|ZXn(A!+^9(>r1|KRpawxje=Yc&RthH+N>cy)?;V$JV%K9AMl zM_SohYn>gS+plWb?(;F|%>mLi68k*nqQnN7^Yc<1w5`t)posXSW&0Lg)eFzP;u#i| zKBz?0`3yqkz2v2c+>o;78YK?)6Dj-5VVrUkgu5!nzk; zQD?L}5&8g}Lv>}PMS*pCdOCn6MU&`sr(~3nQ;&%fbBj&$p`0c;^J};XUjva3LS;?@L!j|pJ3DiQDh7N`lMg~ z%P%XcMzzVKaZw5Kfb6&A4+fKGrhew8VGd0Tdd%)hyGo9{#5eHGLb*}t0B;}|BA2za zX9S3^;uuROw=+&*Y&J3P4W6|A@$RT!WWDJ4b4E)1HjA_D-83)~pELN;+e!rS*88xx--c8p&# zK;aV^9O3Gvf;*x3b350Jr+U6;ONA^z6i?4J;4J&yddZ&y4TTU?HRO+tdeh~*TRG6Z zYQG}Nk1|d=3>T+89fh8t59pqK6KP3y(wJ4IgR3e01!3PM;}xh_R^6uUp<5Nzn5s@R z^zoW;SkVeecPj7BR$US8GCWA5-9OKA-=C5RHP90s6JJThvhc%pj8!xQo(z%LLqfD@ zLT*SDhM1AClcWIxI&1W5u_2Mrxa}gktb-}C5l|_VAD#I2ycg%8HIyiU2gQ;hh=TU? zQ5A$smkX?egM-J(LPAzj?0)bQ4U3(JY5R_wI7q6LqI z!q*^kKR5)yxM*5fmRQP6!-mba2ICnjmOWkiyG0tIVv7RwNoNw}K^L0! z;4Z%%LSoXn05`O!+1c4%5(eR4`s`;rYpigI>>M0YDA{Di#a#)k3*kG)A{CjW1WcvS zbz&)8B?^mOf8JSq@AwUOHMB0GP2Nh%}bQ`UwhZU-SJgqq*znxg({Rmr3^m>(Cj*Bkf>@^xb<=u;9Lfq zKGOCIybsbwtiy3~tm)J>oImK;&VH8R$1hdZ{rl_S{(EckP&4Gb6zZ0W{o2l+cd%sn@4OBPV0(WvFJ82!)A zA*icJ7h*{OwH1=$tbknV^KOstTh4p=~$ zx2_j)^aKdL*`_%zttA>_hWqDiVo5*9y=UQ_WY9wVs{siJZ|?u3i&06aCD4LPZTy*Z z&n(bP)R%J-^%mesknm^Mxs#U_xfOW4+8=7{GBQZqt@&V&sV6P3>g>Pb^0wNZ#v0PV z)|6dW9UJ7m1qaSfpal&#lWe7k=xCK5A*U}cN#GCpg0Ced%bm&ko``IxGVN**Bi=n6c9gT$t=dyMB zn3>jpVtjz6254?ePboKi+(~#G2c2wBS~i>h1Mi2Y(5Soz(f~IF^qFuJWta>oL4c>u zX?soHQ(m%^pf0QUml|;DhfAom#l2!~DZapYkQhGM4ONKMR9Ax|1z$FfG1sBkOe{x^ zOuXVg3*NyI9J|}OKELcCW=*RKkxrkD30J|>LEb9=TKjLeUdSlLA%g`y;>hILG^6V$ z?T@SDasZT~*W=jEhM9*4A%IBSweO*8{F#;<4)gT)^gW=slg9wf`pgP6v}477`lUVP z%bk1?GnY+h$(lc}tA3@nC<)bFa`<`IfvPK$gs)w7A6^O0mJgt7Cat)HIk>HvX*+00 zdecDCOfzLRUzN5+#a=!Un2F~^Z#v+!m>0cgr zWkJorC_%?isDIi5N4m3>&_XXEBHX-qN3fd*%v%HmA@x8fnr%JUTJtAMcgHF)Y-vzgr1jR^) z9?m_RlyBU;?1KE7cO^CuT+6fVw6}iyr9*f^+Q~@IC}ke#ekI^JfKIkm^x3aR;re8e zekKEfZU`Q5N;rRIVUWpM_Z_kiY>dB1Tmb6gVlO~TCZ{&Nky>b$SjmIkCvuLCI zXpRlfRjsm3R++j$h4b!Nd-$Y2O3)8fVoqB2HI_xW=-YyZe{Hggjo+%?Pn`9Imd$j@ z*{a7})Xotlsb`hQNohMrDB9bw&+>H>^X-1uuJ%V}i3W(Nlc)Xm)#T<12|prySx=41 zSs!F9H#ce#p?G^oM|4ikS@>xJ4>l5B#Jimrq)r^Dv)E(i$pM1)sYKq|1MQm+_3=YA z7LHy_aZg2c^=N3Zj6c4-1ad$Q&?dl)SW#@FFg_48piBnY zKNQzHFa}`s&1f8_O8a*|&dW}HroWq6Ly0>^2y!0@!;LJ=_ipF@HrtmuTknPW0hp*r zK1rZKw1#h;+zL;rcHbfh{1F-Mm2WXe4V%9J`ahv3iS!=XOSkJOKl%6>S?toqHxjok z)T<_~P{ei4@R;7lGZ(LE*|x7=zj0$=z#ss0Eh312-V18dhREO}$}CC{H8zug=lW8y zU@y^ckghy-e%td$LpGcnu`wkT9@soWnD{loQ+v`^Vn9{KhP-T3p-kgp~TGV z!NV0+TRxD;FrF3N|LhPi`+i;-f*ay43|~vOByXcQ(|_g-qLk$F^gaesqn(mNJ+f}{SZ>u4V?%-dXU*O#7cLzP34-2>Kp;wmO(*2_%GFTfn%X_@1zKMqbKCtB%G*z3Pu~pa`Cb^1jOF- z+DK$R#o{W(zWI7^%cbP13Ww66(`-%eYGV3PSJ&A2OQk=8)Q3p(30!n(`fks%5&wY8mnz;`_+?t_HQb}x;1Ie^=$jlo zvY5K=u*ZMEa5QT36IhgK19fNt-AQiPO~^wqEyny|MexuildO74AvBDK{+@HJPu6dr zW;AgEk&djYo;NnoeLAC8e-E#mYnmKOMZ$y&c1i_=><9kRK6uAF#7EceA9QP#6zT6k zu#{@v#5;N*Fo1W5<#oUnXWIAqbokEXY>e5&5{T(M!oA&icO-erWFKLwO0P?^jfBJ< zl3Mnl;2lB=qqZGxv*AUJ>n7myC3g;&-8N z$+$R0TVS-E{7>thQ)M5PKRtwwo0umrPblB5sTQEnbIjl`@H*1=#5_D>$d>K;QtFaT zYS>7b6c-oQX{7<6B9wIR^@2!{#blLtD-JJ4*=RgDK1`a$Q}E`=^66jqk;9dbjgVzl zC3UEq6k@Mz2SqQ+Q`b9Iqz{#EBUQd`V~LiJ<_(LMob0%* z9uDkODrT?p*sGle9T5TGDo(M`mW_#3X#DUS$q6_5Ro->)q&dsE-_g*i9-DFgjR7I@ zY*IfP@Tnabfc}Q3hN^?5=xxLXoPTjHU36o|){p;>f@fik z$44H6y#!W)fUkhiQIWpdGk6UMT^}Hie1ifPuOkh*5-EwA6omvId_zyy?o)c<<7Y{(-(}lf z9eUB&+xW*HeTw_HecJbXn+VG~c}K^|5A7JaQEZY@Kx1IZIS%kRw`Ikw+uqT`2Zneto<7p?S;>00L*K2S}ib`vTje zv%3)bN#qRBzbCP8{&H3=YhKvgD4TN}>1*IhbKf0#$;99@KFI1R5`g#+iZ%7+Ty>dYS~k1?Hrs|4}v{1T!N& zcm(-8F^OQ*B|w1{29t8bt=K~K?%*}0#)&`hX+K9dFm6JzJNY>h%mw16rp}tuZCc9J5W4G3W1Y;jK$Z`CKlbw)2 z*RqjrkeFzT>`A$iz)DS=-#t0K=L{Q?p56$pNIH#M#?+*TbCVnk&z&=l!!=<&HuHPK z`CRX8(=2-Zrdw9uTwJ=}!$TyXtAu#-7CK~dThM?bLb{xEC(U`Ym~n`7_Jk-D3jMd^ zEcIr>U^aoTl)eTP9=cCxkO*ht8e&Y>zlG$Dj`PNJM&DrxVQ6MTtiFWwX$~!CwUNu; z>SikV#@0j-gukjCh*>7?&;N_zzyuxTqBOPWfsdyf%PZ#X_}EfuYrc-TwoGT$P5;k& zh*c{Oj~^kXfTZJt<9TWI-oTm&*bo*geXsQKO7NcbXJGW5Z_OmzVCLnLuk9o|+@E?* zMk;J1yE*pt6l|C3PrqpY^;~#&B%>gWW<*GUo^E*$DjlRp=e|tcqt?-fBG0))9RTTw z@_eSs>5GRZk%i!t7q9kQ`}n%u^G}XavUbZKQBzq=i0hBDh^O3sv;sbfYMAYEjC?>7 zZg=@Mb7Ycxim#y)vb4sVoI(HL2g{_d?pvcsjO)IKbAvl)}jx(mL^KuF6Y+6VK`Qe#Id= zBy)AHnxhKcEVgsp=U00DPZGXr|A`$ZZ;v>r?o1-?;tP?(a!8Qm(b(thrbAp_g*9{Q zk@DbTPZRN^B5sQR-LD^9*a;J5SSek*aa&jL)-L162{H`9g{P|*uh`}ZtKM5{Z#L|f z`Z@}@VjXRq;si$YfAiwm^J`S-jWN<_OZ!J&s5LaC%u&tgN>z|F8q68_`e*jjs%ab( zD_ZRnGGHJ!%;Fi|zUSBU!j>AYz%LKodQ5x-Mo^uDRgj~-4*E-??_^J22t<8L8qk_I zpaJdMB~mPq2DEb~2Wd}bK2(Op1_;^U{yryh{F}mHM^h(hhK0H8Y>&M55GyE~;Y;!? zYt5Icv@rA{wCT}P53vD(jFB_#seRWwT1<6wZSo~< zx5O3%g0z+{NM;h>_^>OK>`) zY4tXooiI5U2TnX?j`W9nBz-1#OpLdj(o-`DgI(ebH8sVt(RU!^aprQTO;qx@=}wBR zuqm49%)4-H#tU5WXgSeXt&MCilAvKI)}VSdHqBEemb%DSnr}3tt&s2g33TWYpCHtP zq&8Y}@^i6Ibfm1Pr{c?jGC;hPQxw{z#1{wVtx=(h1tDH+bBUvT4_B0bkp=b`Pxo~J zHLqB?qJKhko0O&ou`E=si?970pBG_>4sjD8;^2JZyT3#P!uIBrfPalr@v~_8%h&yi z^%YgvlcL#b^&tJA(0<9%7RjNfp?$>yPTA6P2L@iEFCdmTR!2RvuS8`H?fR9C%ZjtJ z=}#iKE4=y?k}5qbt@^4>v6_?wL)D9vwJdN%%aGfY`TK`i0f zmwbd-1D<)rGC;Z_NFf`eu$<2|jixu%1ZzL##!_dq{RZE|YkY6#Lfq^#!T)fobXI81 zmQkv8+k8s?S87UVLGPSTs{lq;sNE{DzjpBjvzm%@wmhm#6`5>xR&mw{Fnt&IEmetE zbiBU4cwPJ}o?3jJYv^c}UM@Z69_*POAqL)uznR0pTmA*;Fq8t%WAtsV$yZ+CTQh%w zuI%(n3EPZ>_QJE)$04t`DGVBJDDlQ=0<(YUu*(SMRVHR=?ZX`%T^-Cwz2UjN{d*n{ z-+VZ5=6aHub#|tPI{ekt$JN|~FF)XXMYTV;h8M)VyX@qH`42vIeo8q9%p*3M^5Y}g zs8;jh+uMoH{j3|RvxnkKi>Ezn!(}5bwg)Fdzx%-X%E3MO1EMMD*F^t@Vb{P5gZKJL z4K(OGBiFFi(EFS$)-yW?U&}F6u#h69xa1NV$)gy)!Cj9rn@Iog1UZomtPG@rUfvsvH&A@7fnWuUC|){c%Mv|t7@ z4O8c&uXf*h1Zf1EMg{7L9)a2#u|~|i)7j)Ql;tUMOKj4L|L||!sh6mJp#6;lKohn= zh45s_5fnYEa%fUwP8HaVl6{G5O4xcuipFjfo^N$BSy~LK(4V0^^Cidpv4Uj=bI1Ij zwDTvl*LC%6lBH^~H(6`f$=!S+M~V%pax!&cz*a<}T!KsRAIlOKBlHvl3v2&jJM^u^ zsHUaW%tXsrI!c*O<(ygrx751;ZBj;8_|AP5761AwuG6B&E(%bqH)e*RNx`{?ICjrC zWrr^tAe8Lb$DIaWW&e>1P_}#%cs6STm*5Dq6x%3U(!)<|>(`&zHH(QRQddLaxlqZ^ z#Ygl67f=|l(FW0c514cJIcBQiBS*6Ag+pH>J(s-r)dc55ap!tgoa{QDUcyFhKS@e|c@1XP?V#9yKR`cf^grbq7l9f0gaLOPtLK78qz3 z%za+KYzZZ|TYokg3wx!w`=4Ztvecm91#xbwWy)U<_b||BJ4iU6c{%^SY6~6VD8@_| zL^oH&PKCUF_H~0~u{Ydy!LAS7vE^o)doP7i9D67(B5la6pFuEZ)Yh8L>R~|VJL`9S zR;JiP>y0*0zjal4@`S}~=btdelf|3Ck}i*aycI$t{(`Ffm3f@7ebyD6e+u+@*U4n0 zqeQR@LRbFmWnjw#g|H%F*yq7;Xa@kg`OC;X_Z)VLkfxJXZJ|!M8Vo25rX)K=q5d>< z3w&*gxAHBSO=3n_IDCqp#VZ>sDUmE(Xw6M-y~acff8oOIXHjcUKwD0B8(#U#%T5Vd z-GsZ#$1370lF}4F<9AKXkvUn}sn-!kGqQuRB6&2emyB`&RZBa{1tI1iQ$%NBS?ZU9 z=7HJ$O*y%DaU4^aXN?IwFZlJ0=|tEH8Eye6dZNuq-z!JaRyq&wn}2&u6U-5ql2SnkzazYps3-Qzk-PytGQR zP_QJp6yxf?iI06f+YD&qyWE|*(H+jVKbcn-cty>{zT7cxs-HCE^+Za0X!Or#h58%A zN&1ysth-*C@V#>{KA3U!9nH|d@s6tb8BNy<5tJhPA+{5Y73-lo7?)F?&v|miX?KY9 zYlwG0HpL5SY=(yJSqukiQ`l!x%cH%%S-XgMckcD+cd2G6b%jh(Oqv2v29KQx4u!j? zH8O~Pu=O|2ht{%ts9~b}p{pbP zlUv2?!aM^#ympGgS{f66ygR857@XH>;%b=MyFa2L5{V^OdB44u=0eT?$*<4(^IXYx zNsG-(PBX3~8Y6~&qvYaxcy9d=(*mjW2bumuW3QE*OfOA6j}r43{&We#g&qCCueh_S zrFyN;$D#9qTLzEq^|;hAQ`$JQ(q2dMHD`tkafQ2VyyhB^NMC!nrBM5#^LYFF-6SG7IK&Msm-5CvQB^Q>Q}Cp%vuqq!$+&)X$`P7>Fg-{^4fllgqd2yEpP|0UQE1GoE^+UZ~J=0#yb1g9diGg39q7MRa9cd?wpzn z3wgAe=B0$ebC0Mc=Yid}!Kuemq>vFdlB1-laE zCJL6XW4`m=?Sk5}$F(+J4vRM_M2c%f8CM<>wD$TX-C`L~VE!>J(ztSjIq=n`fJ1w% z`(E{JUid=)ZOG@Ha?5Uq|K7L8_2w?h3d(|AhQDz>Y@eE#J^>&kB^FVTl znWOq;#bzC2WZ9}$8b0eVGs!WBt(JQ0emXs<%E!$0a^Z@x#-`wS97fBz{=tu&MOX#> z<@$@bf{$`N8O-wXGLTkLc?+V9DUpBVyAJ!nY!W-QEOHJ4|u)Dw8;>LE!p`}}5 z*_%wg+YWtw(sdZt7IBex@BE+K!W$f*)EcPwcD4WgeZ|Ro!UYD;etb7cxe%xH{vs0bB;O2m}@ag7==5A$AX%oIXEms8|z6f#e7C?vg$OEk5D{4V_wKugk=E$Ar5!k z&7uqj&`;O}{ReV5Q;ufr&kILIszteyOLD)p+CGsT<13=c(%gLSHptxiQbF$dgVAy} zx@8tr_GG9&$8*LH$*B(HQH;rqE!y?Zqe;2*q^vnb(?C*!mH$ISyLhjLdFhFY3|2TZ zn!)YY>bx)|PlD{#q=if^Y4$0LYqc+}etD%A_fEjsh&`+otkZdwSBOJuN5EUW*15gL zv>p8TLe1Fxsq8}-29C(ZikE#mU}->JC+^cEHb1K6x`5@3^HHKXcDJev%>~>^pAA$} zl_`~@-``0b*#{`4{Tt#ITUhwz6ifr3%m#@nS&65Ap=r``_e{*nmMJ8&N^Y&shk}Wi zyM@(%b^OY;E2m>GOVt-`mlPA6xK9+yk^EF9l*xYkNREK%isM$;T@po?#%BjJ4z@J! zzR8TbUl!tBJLMAsSjZk%`WU66;Sp%B)oc}j(dp9((Zv?f2bs% zLdG>KW0lyhoc1J3kyJZ>ot%AF?TEBZxW>1&b;MFFZas=_i4M?hvoUIGYX0ESekwc7 zFq;*G$DR^9y3_^w8}LOv$fX{eHMiSYS!QpnFVX$?RBf(#yebhVW2wuuxmXJ)oW zULz6c{y6?_?><{hPtH^7bQY|~)WYoPlSSNVcI^?TgVzG0U{HycwWO=bHOBi2q=2M% z!AFaKY=11UDO}iESr5>a^OGHSB`ZyUQ5mOqGv(GA8$f4I9&e|&RO~4Mf42v0a85sS zmXgZ6NNC6~;oEcnc`G+N;LP09;fNjRZelXEEsSHJ^q-yiaY@6rFczSu;;Wrak*_Ka zcJ-Q#A+^F6i7|iY=A-v3PwnBYncMSJU9XRC5%kW?4&aRjno`5>Sw$&Rc7- zqJqtZxs4}hE_--l9!XP2HVvA;ZG&K`;G!;JQ&-20{h?BJQx?WMe}!3xkui7U3`}Bt7BOK>E6;LDY&s#vNp6Mq zBK)v`&#FxEa1vxAzXKfb#@UI`rRG=I$S%I=$c&8ptT3B7P*qtw@I zZs6d-46N-9)XBe=Rcz61F`+P51x423rw~;}Yjn{lCj#Q-u*tdTz1unHGQ}tQUiW|h zz~4>4pVz9P-7Y#sv?QF{^$PR)QesTpXpVYgZnRq8(hD&qR=T0y%=;xvFGSSgZm#56 znLF@P@sFwkpThTiLTZb(m4r3hZ>-!}jsMh53T$uuQJ zy>nPeBum~uwfStlL;~#D<+Kt7m&c08`o|Y}k1MscDO&j9M_~%Cn2q6>)YTbii0v;_ z*n0M8OOVRHwlJgPKpW3;Sc5Vvjm&&cRzMNh30`RKBMBmX8qc$?3_gS;l(d!m%`dp7 z(?_MafrJ0Dj2t#=-_f{=H9lEFo5OVytq_FIUb)UtPxstk-*iab^7D)FOqa^x=e7)} z%_UO8c-eMM?-}L2i*2Wgl^h8y;1n*L97nPqzCd8ykgp<+LTmH8t)7HP6m6 ziE4a5Zhs>oIah>AZKJB0!StPihT)nIgyigOlVnww+GfZP&y0?>v+aE7Zz-3^AMtLD`Kh)3u|&F)O3V02+% zrqX~pCKsxu#KgK-E}uLy?GZbc5=p!FA13hBs65(`faxB0Xx)V4Z_f3?&t9qF>H zA7Sn$a{GKlTiQ3~)@MSgylD%yT72@i;z#qxESA`h=om)WzIfFIL5gATZ7K@zu(bJz z>eSxgQX@EZOH4*f&lhqU!fiBcj~oAS%l#y4tYX-flPbPgf0raJ_W9}EUTMt0XY+UF zlQUEDkp5ky??VC!RG6wBz24T@l~|aBRc59-bp)fC&oXZ4;lZ8_HNum}x|jjmn6$xpa>FB224qh4q(6G8JB z8f~f^GV< zKG@94;iYxs`dnd@f`5&X`@v%DBrrJy*9q@!Ud`Z_Q>KSU8UjUpimDe+<-TfzSGXcs zaQm{kovg1`3mPVmVW(9+9cV>5>k%5}+%z)i8||u} z)Svzy$nGHIuj3y8x~5a8Z{bU+MCZ4DZUTOMYe{tmwrQ*RDcZft1os{j{Cmkd*VuPZ z$>F|v3B~kWPOi};v7ioMn5vFG6DfKO=9gYjoB@~G!Q6%sv+A3C>j#ZnSmD&&xz(cj zR1BuJO>Z-_LghaU#E?6EtLylg=;;eb*Ky%Sv4OfFesR;$R`iYCY*6nA`+|9Cv08Em zqi5l_f%mh6eh^6Iuq*T5e4VMr#cIR}Zpwm3e z%-ge6Ne~%sER;q877>{z-8czf7Fv?uvj4@Qh%moN!>?c#VS$gr0#`!#R^w!8euQYe zXzWEP+^RSGvd7V8Q}UKh$KQk|6WFJC2zeU^A@99wA^5#I3#u>X&a7sBQBe)#s~<^UGMyaRp3RI{Js+y@g#c6A`}L(VE_%F^5<3xZT+J{akg)oJt?P5P z{7Eah>U!Mf4EXQ9Z(%MFFR*y8|M=QtETQFEvw=v~24yLwsf{W{Dn*xSp%Rm`IUE{& zyPDw~>-gl~xcGwrL_%Vj%%{y@LS3+wJ~Hp^c>#CZD) zwT@^pW1Mu}-VMGs2?y_pE1=P%hv5uW>FJK|m4SSVWA~{vnky>>EXF)+)_7>+ET@+jRyYx zg-JrxaWEUbF09uQFxsnR8PBE6y&zjFla!c{iGY==#>~%$v8SlyVdRtJQo%AZIirEC z9gy#;sZLer+84StORLPE=l(P8&VN!~cPor|eP8rBv$RII&Kh2)KEK{lozl1RIC5!Y zBb+_w-_%EL63NS7f?(k{jR(gt24B-LVe2ndHddMXJlJRG?^j^F&qEO4`l|YX<+A0} zYTp=J7-bHtk>#o(D)C|97J6)B4j|z+|H?NP7Pt(UD}>8hx@OF{{zlnB71%hQ*Gg3R_qNOi?!hd8%XzdSeX2oGlA@Vxyr`f zhS{?vZFG!dt>~gW`BQt_wQRb2G|R?%T*q?x#nkVC$2!NAMCNnajpYC-mE_I39`iel zOR15mH@TA&Ir?ZksvZ#1ac~(LmDEo8n=YF`cwM!^1{8j3Zr_00j!l^gBlpRK>7>bCt3;LgNMMMt3 zb7?^jRMKwF)zZbZptas!L)8_3=QaZ%U^D*!*rj2AW*+=|DHkmf3Cl_VR*4-+g8|fJ9?c#Kl@XC%%@4)3PaIm?N~MB2CMJjB4&ZRe zT6ODKdNz*BzN^3Q+aAwTor9a>p`0mjC@x;54*~#PlWW{kH#_7Ld#vdlLSw*nd@V+ph>U=)xsMCACDpW#ijL` zo=kr0i^99gVoa)hK%Is7Azm#mOCY!UA|)@GZvNwTB5}|| z&ahjV+f4({<;6sUsJ%Wr@rnv%f0u1#@sR?Z|sS=6NvG+rh*p*PuPYaNs z_UE#Dkf{G4@yd;4FX7G*th!8eS)cvf+xv6VJ+ul+!Kte&Pl>v74L;|{$HioJDaTJi zR`=Ls;byxfv#fms*N|!MmhN@0* zphx`Q10W;zHRA+=q+1y(7oz{Xm37$OWL9NTnSXBHSGdg=4{Je_Y~MH!GP#RRd=b$j z{$Q$Ni1y8(7r;ZTj<@tooIT-hXJpy4<=YBav?D-(WO*Ny5e z&JENe41#{I32t|YDk?5f0}QhE^V^M@v02=_zDMM31tA(JAV=%%LumCT{rHrB`|{bY z_~tlj+xgjix3+df=VH3|<-f~%A#olXo}RK*!N-?ER#oo`ZdF!JuCyJ|x$y0E@r-mp zc>NS`VSqcVm}vA`{t;C(mju+&RuC)yYSK()-&Nlu-yoa;y^Qu*5CXT zNZra~8hWURrU8;kjDkN6N*Y<#q+h=?Qdb46^X&>L8W)F`5461Vw%lgtymh zMEkkA+NNiQiaWvUtE}hP)QV3n2 zXZxT{SCKRR#9Zg=28Wv*m*@eMIAu_zxRm0^LH3JNgJBYR{A+# z317Yv5%OJhUT&&ASP31r{@-qjwOACuZdL5zGvbWQMfnpF^H9|?e>?Y)BaHPgH8r9s z*ViZlbZ;|8(vSBXIXlUFE2$*ncu06dr%z!)d3;W)CG7iTIm`W(O{7AJR|nZxzoddj z;AOqbA=QnFAy)m9>#a>)AFhW)O3GRLBZ57}0*a3LS=!i-r=ixaFIrE-(ZqzjtPo$@ zo1dEUIT3jxe)!*-{9YQ|*x(nDx*we}eZ1P!L2g%z&GjX%rd5;K$PNbRb<#%O&>ydG zMVZ##)SZ?^r|}=rHsweNrgBpO%5v$8o%^nwVNi%?ijan|rwTqH`ynIR0W;zlJadY*1Jl6 z(473P;XuP}a`SOW^M~y%?~=9joSKof1vRDspL-=yA7lb?j9njjizt_o$V?JfI*wCR zNtI8Z@BW_w4z&!~WNtr1o5%SbA;eCa#P8=h9HdY%QZH3ws?b4vExppEaQR7p;O(ve zZdvgoR zbL!qm(*$ujP9ly>4jURBB91r}RhbWBfr8qk8_aI8yx;yLVkmQHeH+KW=if)clKy@= zjp-<3Ewi?MWfuivR9@a!R41gO2FDFuXA=<0l+w(kO|3@hwPE4eZ2ei!oezG;l{$5uh(QcuTrfdV68syBzC zq3u#C^YOTbWpQFbZE+7ny2p)gs9&{>0C^@4s9ZKH0#`|BX8zoTwSRwY!1J_FiSkpf zWcp;a_gO^8etL*_mZTBdw)IIypwPh5DJGK@FF_9wi^SbiG6=%I+*v z7p0qQ%wFFUhpwRgv=GC4g?TH98R5b19IiH#6VF~D)+OVwXQy!N%lq4W|2|<0BA2z& z$c5~0$z${)-h)zEF7NFXXhL{LLRBmG<(84)@xx)u`n~4VOD38oYEV zq|S|(<847*mP7Hu4_+{nMJhQ}G=o}5uj=@h`x^X)dx+n0IGV|yACeL8`2KapuWxNa z$#~Pu*El%NVDev0;dqI2g4$>P@Ik%I9G6>igqi+lcuR=Y1?|ss%^_ws__;_{`)d2d zM0-4vjpAykMW7>B@g1|h{Z6$wGvSSA{;&$L%lXeqcgBe^pGd<(Jjx^4BS|y7^ZTRQ>v84x6nm;q?ewQ>dp&rH z4T#i5!vc73Z!vpCB+HI6vgGru2qLQ53sTKU!sZWQG(QBb7RA}xj0$S&9y$E9o`Z+d zn#v*X_T?-@He2S5Lfl|Dzc;dhn;^o@E%VFssXQyFDYDCny3)U`D8aj4_PW1K@28zI zKxI^`s=0NuT$UMSl&T#?#Eke!D`q5~?mP^C2lu$0ir`L2>tibB+DJMUXF0~B<|4w~ zF(V7H{2tl8B$~{bQRwnXVSO`U5UXLE3fvs9eP_=?5`TSnhwU@%V9MWgz(wS#~(PNIMqh2>IlPdgbUC zOBZF1`D)3aOc?LsX=wMo%k|NXdB4K8xdBqNH`WT1N0x5>&pc+m%i6)|{|B`TQgXoP z0ZfK;-Ki6(=7fN_R?iW8uN=5%AS(FDL5z{_47Zvy1^nUkW-q#w-OU_Z_b&)~Uhs`A zmPz*75ONxHU@lk2SjeZr?+)C|ob4XaF8llWMO_4+grD4l)kw#Q%c%o+EqlY1Y1GptnD z-e(7cBXZkQP|3|6-;9kIk7{8vNw{t%ZpEvb-ga`Ual^sviLS!~U5ks4MdE#=14Cxg zr6A}T7g=Qs3-5oi#P@Q%+LG_5PrfbYZv}0^k5QYkzFWHRAwuHPErI74PAWr%Qzk4K z6fCut-GNXU&&x-v$Im~lw_4qt!}c*c-oCm$(`$C*AZ~+1{j+ayn#7`r45?-a5?9Fo zP^$*#<~;QtWWFkt=t{B}LEZ*z`1|Efmdis+d94=xhS?^maxI%|bAGq>zt_KDmz94x zf>QMH%^UhpbpLHGI_&5S02~FD#qvc&F=w0^W>S}({Qek_SgblHow-d{`-V@p5tKBb z`40EyhzS@Z;+EbD_zUX4I>vGV7>7ISBG*{@?rCPyoI6HJK@sk#s-i+4SUaM51?|o} zPAnBgdwJ=~_X*P6;imNL>X8={3-3;c^Ya>r#1(#tJ-ICZ$C{D~Zw4$C-}bOB2QwF2 z67t3XLKD~EGByb4ALQoJ7irVj!lu*vHgKxxNSWoIG|r0$E@`rL z`5ql-6`06{KH7V(@`Xf#{ZaC9}g65w%rkT~TrEo)w znZIHLTq0K42(bb&1h$p1w7puIfs7z4YG`%{WeHRT$mG+4-yx|)go2U6=F^B!n`|rM z(96u^gTmWdr_vkUs~-51k!7*vz`<$>}3Q^U%Qg1itWuS@kY06 zZpK(z$r`le0QPw3bX*)Q58UJQ#=>CK$ARa!7J41i$4ym2wW$fVWAHhHP}K>y?>yR(&o>!3PLbza#k?fwd}dNo~)O0|7f+ zIXA^S-RCS8{olVTcDIqfHH(-G*1a?yrAM%SFzGNUh2&n!xC;RaDKE~Y<*3dHxMKc7 zeuBdTh_Ye6S-$#HE*^zDueoo{?fW;PB4?=%svC>PDem^TFkr17IpD@i@5^p;wGxL?W>Idvk zwf=(%#QunP><9O{Ht;U+ZVD zm6?1|07}BnlaVrf+?v9bN(PmfFo=)_F_jRj#z|Y0vTktLEA7yAWoA!8;+WxnFpkS- z<-lwAi*dlLx=_az7Q(>~_H?~@O(<<)7=-t2ln+BUPS9}j4OyJ5jR8{p=bHn(8@bBi zX?p}G!|~!k8)RL85ZW=`nh>j$O_Xg@uxMcU*&-n|sUG*%&$5KJ$uh{3dvjipGg&DD z(&gcsjY3L){vFZSmCFTy5 zN)6SqYGi;K8Nua5O#}QMzZm4eEkxy2tG)PntF>qz}BA&dA8YK*Sa8 z!Vg|_ly;JTUVQ-5zE@vXY5Ik2VfI?Q(GT76A(6F}AOFnsNMS8@FU`bgHbLoVs_{|< zRz51=uj!r*7-b^}T@dYNu}NB`O ztgl}}kXf^HzrE(qH^gLo2TxDqGGF>kiAlInSSD-orxa-kR$iQ4P{BMBPq;h9Hq?!< zT5kO91C}V!7y4CTH7ZiwBQV;Mal}B`+?PEDUUQZp#E0op`(%v7#LGO$WoS)U{TK$Nb0bGiyfbVipXUAfcS& zC2JFP_|{ysZZx9+!oHVDFJ)puG?~Saz-k53)a7^< zyiVkHx7%sP4z2tLlhJ%3&LGWAB^nfg#_24+6W>&D>PML{>|LL;EDGPW*3Oc02g;&a zrt4$IVlCO??|wtefS(_n8U`-moyW=OpRZazG1H6P6egcGRD(*Q&aZ38LU7^>S^>A| zd!J*-d%K9lVEIz99d1d)Ke*Ola##ploY$hIbQ;3}OhBU$B9#cIWiO3nT~^4I&UnL6Qc!@AB@XRaaAM`pme(O zwS5eN`c^&6yVLw$zDS{&5Fv42xPC5@%!`CKRF+Ar_hCe>5-2RK7LM*M&U_m2I2Kj}x2lE6`_4v3CrKmX;Hg&)IU@aEoKy~c=e$D+p-hvBC8 zBV=eg6h%K}S-Xb|8OHE`@ZJ)Fw+WX8J}+qhBq=@Go)+0XY=K;fm=)2m`zXpgecYZ( z-8R}<-kx>ePADB;Iqudk+`=wznI6{RyPxLOl3bCV z1isFuEU9{8UB-G_{rdZe{XhlDr<7(~HVyfA0m57fXkeTck5=CuRhd`w_n*Udrrx1p z=ucBKTeruhGtBWfyXmy-V_@y5<)EtYmCd8>3lfIf7e9P?Ljr>gEKL#x$-a$EE-8&O zfsO1CY#TPaHJ`0gN7L!>6RA1NV_3iLX|sI+ChZcjCoQq3{bZx3C#3>R_|n?+sn5!G zd|@k+YQ<_cAFu@OjczI-Z3Cv?0jwtj3L|qS!{PPBYIje1%W*Fsw1i9O%)j+bz2-T2 z5*Rr&$0og(D~2-J;KUtF#=*V$efX7COw2>9(Y^BA5pAXuak5pR;tGXvKFqn3?1$4x zy#N-i*Nvrt(pE^NluW43YieHm=J|58QFe~8|NncoHRf%P*qllkzZ;yHc&qsP_G_en z&wlj;8qwMg*)0LK=!^6c=btd?f~}+zT;i~U?MoK}w7YDLC0C1=fdT&au|I%(NPhU? zf>w_<4SEDYY6UivhL7VS3zye-QLZVAR3ny{$?TH+*`TP&5PI-gUJslay+PNx>My^z z=tk??prmLq=)cZmGi;j6srIK<1K#hnYvnoD%Cyx@ty!)2U$y8BWp%kYQo+KNl$vNY0OCrm(Zkw?9EatUpWE`Qr~eL| z^iKagF`!|WcZYF0bDlnxZrOH!_@9DEyY14*`Q2Qzld$F-SZX}NWWiFiHCoqC6Asuk zH_^}+$4IgBC$jai;dlYrbGo{I4vTEifP#oA2fLnjJB5oEwv(M?YeH7Tjj!a))!2PcI^d)o4riAm9bqX541J7SGKYpAxdC^lc$eISS~kY zuMLb_e_f|Ozmc7qk&`WLg;kxx2Rq!0Qx#;OlwqJO9Gv&~iWWFyEihy6SP;0Jw{J9} zVbeB{x3tcVFtiqK{LB~4os2~e38&c0R%*v-sK=3|xaCm#CLg z*_OU++Uak@_!3sk1ByYp;0Q@>K2 z={UHb)AFS)#UMN%k<02!KjYawq0ABcx#&TmgNd)hhDN_-L5-fxudx|P1J3xpqZNp= z6nWwld0x~yV)0Y`k;*3vL$loATx!!HKv~OnoXa!36L&e|^9^DHYkhZQsM71BuqvpLWA7_ft|x4} zjgNdLBxATkJ5pFta-1o(jT$TaNDlsfaauF>k3e`7J8W47f0`kW>wY%XdkQN{WSm(=^t3*apGZKb6`rTohg#Ri_#;@eHD3RP6T+=p%oOD|B@e7Q^ao? z*9OT*nwdM_3HTIu`j z%5#K8uIo8`OziQCwYE~|PX$8|(%B5@@|r*u)Pd5D1zQrY&H53l#=1(XZk4j>0ITkt z{L{f+c;*J9d3t~)43i@H)8fz1b7C{=EMf{1F^F+Axug4kW%+B6W(mcBDz~iXdXp@JV#^bPU8W=BRbGUxL}8!N7Oy)B213^C?Ju`g9hCz zW%(9IH_5;0R1zzmb@B23N4m+m#@z$zuQ{6$+h3Wmpn!W$SH=?@8E5u9Ahk{gAtB_U z5oDgUr>ayhh$ebz6j@!Tp*2r7(Hf|65;d1Bk<$_HFl!yXVe%acV#`}5)8WLXF-d*N zZ%Z=Do4_=&^W$-NSU=fzUg`Z_Of`I#c9~7@WYH8nHyik*X*7Pa= zyp`K0F`6UQ65@20!)VDg-zZJF$7O8fAY`1n@xlJs-xYJvbM%Kp1fVKWw)4|8kA?{8 zfwUS#Y;8~flD5&$VR&z|!ll1TGBE--?Nv!P+q zaWj3JZF>c7k9jYwLQt_Vs7oK0;ZlG8+%*(3reu}<@A`QM)$T$OQ{p-(60^4FdU^&i5rxg;{ zSNuB-!7O+YA$6im<5Sxys0UJi;(JS~L~?n*CUWMuy2CoK-nNg07Eop?2Yu56fg;cX z0j)|Oyo5QPW^hnp(wyg!m&7G`8CH8n4AC(Hd$@xJU%Lk|Ln9!0WK-3hCk}UXf2m5Z z{`zU3KDCr5TX-p|YZP$T>m<`eKR~-Kk8i6PSKBNkhgyt=Ki7$ST0-xa`@qvKyS`l% zeVL4dJMrf)h(9-0j8JaXbY}jarb*4a>hsEwo^Y}_n1k=s9|}wU3zI@K`YWY5QxSSE z2kwqEMCP*f|F#)%T##C=xPezF=`W<$vNjPMiOPw}pFm2g4!9`zUAWfOmM4M$4ETBECP#VB!v?6j?kh~eiQ)|6 zO=6@$u{1I~_aj#V`mvy2Y=n+J3m5mx-1qu`*=dK5hun@VG33z&4V75^zIAtveZ9Q7VZEj*kVz_4TUlRuL?GY1prsL4NgJAsSs> zNq69I$J;S;M<~4pe;!8lZ`qSQbgOvP@>aC>tLoJQ!A)60Bh1#QKC3lO(6zsVs-MP_ zReu@LXnT-SG7~)gA1<*6sy4Q)Wv$XCfL=Cn7zaW6-R22#==VTv7wN5DK9p&ayLEXzT z@03K;`&E>ZD8d;7ir9C@Oe~KB0Nwk72=C3>{t{ zma?aD>Ib{sU3JfnPbfsX+R?=>)b8}XUh>WW1Beh{7wGuI7Pl}MQn;IVE1ft8W9B+EmwxM4MCzTxf8wlucc%9(jV%z6J$aTR^=f( z#@%5l(&MI&Q*FrHHfr<$^3sDhy*+784#`Dj%!pA`@POWM8q4vFIbUChv&l)Q?-k%F zkmcUBwb_^8!@!G)C&XAQZo<{I)@@qwmv?;T@?U>@D?LAS3l^vvX|P#AyQQ^rY?9Hb zhRq~du$>CmuHIrw`!P4-j-&$W$~e<0OS%qO{n{Zi;sgY9F${b=iMj{kF4p3WN=|#O z{0@p^Q((u5YPH&eg8p1DAAw9JlU~e(ry0Ki&G_#Q&FF$#g$zVt{0G77;$jdI*8(zV z+0P}VBb7yO(2vOof>LRC#ZBPwnfXJ^(D+v~b_^&R>Yc)z{fJz@Y9eeSsJOzSzMKrV zcU0|lY&BO&Z(41nYF@KVI-h`}{m^G&Qh)(js1Gceuy7Ck$v8VHBBmh?K6GfV@UMNw zsdg0OL;x;gU0Ykc{g}07K4%)*V(oBkvDyAc9)M4NuAI1zp?_wig8M|MTNYr&-smw&=b{z+M4jzWO~bJ11lGEyw`(z5 zj2JpXcb>9)u3r&ZB;K(iYMk7KM8NBzk+R|G4M@0R$osd|Pg>9udUff5h?@&!0uOvz ziXV8Napfs5U0|agF332=;?JExAL}YS`9$E#Azyf#xPscmn6*MY?aX~P_XBN?Pwr4F z%3P|r8J6avQOR?&oX@c>p}n>jf-xAQ)I@;TcIe?@8o|XA#qBjtSz`xYJ zE^S=5088Ahrov30ZkULFdSwMVI$Shy2YkuBp(s8TsY_t28p7tYK$1SG(9yjof z!s;i%ljCKyEcqlS<6YQ-NLzuwKS_PW^$@f9&@JfKi>L1k;J03vK#T-~H6p+c?(qmuMfr6z#kdsV2V@ zw}6Q;mrOP+W>)R7Kj^ApZyq~ipK=#VK~gX?KVzG67q(p}bPMe~3>x4*$xO^#eHHYf z)$6dY^SozeTxD3Aej>i807r7~1RZFqKL6Ia?eO4Wb;9xBn!^Co*Z!O!&@euxN)lL%lcVikH*_-Qw0!+lGeYxtOLAcE!->KanPg_uyz8rUP|nG zR^;mDdnZA{?Ns7WmAyf#C3d#PyF6iXq!2%8lyh^+;-MhLIA)A}2wW0X*z5Fkd|I{pu%jbYOIbJ#+eB{13$ zk|0$235|uNSsJ^@7PrT*jSg%$A=kSq6H`Ok9Mb3Qe@|MUw6~i`;@2poP2ldD3Zwl) zB4P&q3k6z`nEp-91oK351^2HfsE=6k*{fT#U@hveO#{b(fP(95B^rHjK!dRuBKkC= zr1WJCTU$7<HSYg_eh~4hiq8k;KPOhbgNckijKf2v5g!K)D@a!R?M4AG}`) zfeVo~lKwW(Vm*|Bh8%y5R%%U#I0It46?EWHlKNE3=6ZYLSp0pT7=wO5n$u=^J0FE& z9hB4G^uDE&zFQr}3dRfQ)L0aZzJC!lhCyJa8)vTj{TM`4us-{9vgsH(RCi?``_+9N z+<*N`)6BvmI2|629@uRg%eYr3KE`S`3Y+xal}+Ceaa{<=YRQvDNv5Y72&-f{R)${` zhNTfOC==QzN?j*h684EZI7SZr={wIedznsJh%4zQzSY@N2%j{7R~)?I)2ZH}png;{?e57-w%hiSAw13#1-kY$-n)7p{ zp_DE8!}+V_LA6@9oU8AGI>oKlBt;o0cyjA7+h3%uY4g( z9aVVufoxL&-i5*wT#;7`Mi~wl(#6azdbzHE2+uc`ykBDwHU_;CO_g4z=&c(=e9Ay?A z4cM|sef0$vS$Z9pP4emK@vk0}yvsZ=-0Bon*U~%t9<(*Lh3mkYgAQy-U{nLd4<|om zR@|+Nxs@Xpd-xW^;l-#;B=Oaf$x{4&;)kD#bt4CYTfIPc5Ld8}eJJ$Rzx;yZkeo)x zYDeP7n4fX#dX9|_uA$0fJCmAwm7g=Qb+BUBuP1}LN!zMXH!024Ki#BY1=>CAMMN2{ zDWY`Tn8h*74A&9Cyy6EuIZWu;3WH#RmI=cSS!F3{au0)J4UVb*dDcXrdBnpTeMHnh zLs#Ipfl;VcT!URng-;pWTzr=qlwUd4GA4KPxOj(!+ok)9C2OnTD4&JDZX0Q1J~5QT zj29{nvgP#eMa~X3?%Of=!!QzuDr4>X+BZIN&v+ra?VS9o{c_(@X+MZTZ*jRD+MUd2 z9p)g9GaQRtbe6`SgVi1+Tu1y?YwbOts6$8V8-Cc%en|xnq#@}h_&P$ImF1@V2Ye9AG&8G)SxALX5>-C&aaM5P2Sw38)U4oR^udTSxhuC|3SJ#folo_xoX%w34!vP- zE<{-KNZQuEaBE?fA9+GFPs70*VE5sNj%he03)=E}A^#-Zxqa152uL9-~*twi_ zA_@}U+0o=ac&T_6U@lsl^r?m_1$Ju2Xab%>;CRpxsUQFb0&=|0PY zZ%62c)~L~}cThP8oKWutEm(&7q}Gn?5WeuG5;?hH#CPhhqR-iZgL>Xh!mWFE6NMdAuYIymaDZi4jqD2^n#5X}rM zCeSthZj`cgq*7~&qBWhiYO)3@$@osF{boZ90|8E!)D)`K&3gaf^1NroU0df~8$TnBmBy4(&uJakVpap=OI4kE~?Wlz|GgEtlw>w28( zR$Hw{>K@wp9wTeDF-kx2)$Ym7xbps}koTndZX=72XE%A*!_zVbPA!ll16sf(bfVku z`}o5Mb^5l;a2#3AQ^b+sJ&I+Y%J8m{>knYc@J(EBhx5GW@=R|nA=oUPV!_^IW+!lE z^WD$%|4+g_EZZSV?wM$GszyVO8kH@FHD5i4t485L=i|ZPX@P>Tm>86B|Ejtb5+=q4 z$)fKJR?h?eQ+brhyx^lTElXQ>gF#_kYPS=p-P@hf=y zNU~279rB*l68^7$q|8z~&YYAYkB8FtJJ^`we3gKjRFEsSGU184eNm=&z_+`&Xr^_~ z?RvYMRSYti(ha4#jgI22k*zxczu~CTslsneEJ)RkKN?K8`hr z&g098SQiT>>$KaHzU0mDjyvzQPrUa~Rx2sEO+3%yd~52^6oLj|Z*3t8OvN$LqhQe8 z1FFPFQ8(%ASz!SfS?7mKD)a82m{%$7KSPg{Rl2Zz`p#6!U)~+)FK}3$on4UIpH-n1 z%2?(%XmB!;M6aad;kd3pkE?W!mmCj82Mo@+`scH{>tM{$Vd8{0Ju)+gwv9tkL#a68 zLEh81{W1_#MS;Qo>g*EkMSI5ip3wh zgl2W9aGj#}fFuS+AoSp_tYM6!8K^uK7e90c7a?_ag!ywplcNq#949bx>Lg4R6NZ0= ziYfc336&KKwAS9@UuTQ(pf_deGk-15qMgv75HGNO{o511TNkqm?6OZlq3J4yqnphO zT#WH1kXv+zFzhuRZgiHvqmXAp-Bu09%T9cA$JcX7FUK#DnB?Mflhbb7c$p7mQMMQC za^%S00aiPp!(gPf8ftL`aW$|uaU!f)CNAvY#tN5>@rlCC}O()oISvU@POkX&cT)tY;}hU$~8i{c{FglbdmuzDF%?EdpGnQzRWe)LHxJ z&s`FK>^CTMmBatd$P!q?)h_}ZQ;yPz0wvUa&vqw^(^$5j11hA_8tZ*{g#m4 zal$8cb*4rbnw`<<7TZmNBXg@yan2J=50}H*3H($E4x1CeY#JbMB_y7`gee~Yb|mnx zfsaa7xxw?t?#yP`jU2aj7k6*){2C?_(IPon^Rn(s-QNKJq46x7>b=2ljylh;s+1nH z)+-ro2>UDYz;3T3-z`f`r2dbC3)|BbE}jE1*vG0Cm@?JtxK}Ci?r})mgvC*eqL6@~ z;NsRgc4~9EzoV+^AD`+N_#dSGgRh)kmq&$!hFUiAE{`{GV`U#ceAD88fW&1sk$;F0 zEmspzv4A(h+kd__!~sSKgQWu}{Iowk0XabyN^cra4fIO*cfACdfKOkZ-h)_i2a;C8 z%6fiz(BMLb*_$x*JyoQ*`AN;K0TpQ26@4odV5%6gc*tPZZ#NN2ZzCz-(>2w-81K2A z2+kZ$DQGjvLcOUUg&$rHaacF59-UgMrFwbimE}%OSL&J$YsB_AhxaMSs4unhE7ypk8JHIS%Uk?*pw6yn}{Kn)a8nAdR2?m z05D2&1%s|{Dc5E@_Du_LJE%bUy{aoXq=WvoQ|yh<#!0)i4gU{8`I$krhnU}W;@+K< zv=sUKe4Y#Q@6x9>rexKnXW%P62E*@HI3BDS4;tVk;u$dWE6Uc{skfLGvmt-es9Wl) zOXU@8!&`JdVSlbfM1eBSvW~&D-x7^W#FU)@!mxjH#%fW}aY1nHcLky8`l2dRAQw0H zB3bDySy#4E$3fOFja)B(N1dYLvlDR~LuWRjOW2K$FV;kiO1r6w1 zBZreezxh|;BZkSbkzC#ZuB0hQiGq<4@K5CSS7T?j=wihvttz@ zw2jCHbGYSzh~MKHZI|fE0qS3!QNoCFU^MnIxR*6x{zTWtznA~hiW_Lx^4+qtvGf1k zk_-K+_A7u5g@g#dVEsqgSBSpEykkLFDK`A5qpF2&DxUd{3WMDUYGb%=9U)-~MgGqe z*n6@5i%N|XOk1Nyd>kQPgNj^MkK0=Wkf*3~6DBQSo3NBr4vtbrD}`fjFg zM}~VTXbc>RXMdUrmj9&c6rdBg_cZ*h$$%%SlhfI^1le)Y1_k=96bI_2^Gak@yjjbt zjaKo`UG8a`ah5dPUvB*~X$orl6~gl=Kvm@r=(}2mUesH{=r8s|F>CT{>=*ET_<|H$ z?{Jlm+f)~~zKasR3mLA~qbrvXH2;?EcjsrhuunTNW6WP(e!pBoDEeEh0aQ-i~>vnIZ(}m6x-iXIcom1%Q3Js|;d+ zK>v0e2M5PeprCKSXNY`t1fp7Pr|q%; z=zsbVu(`&0hK{^K(M>4=$Vh}Dhv0^XdpzXcuWfZZ1X0y-h(@32!ggV^>rDaHM`)lo zSWm|@VR{M2p1)G$NZGPuUyCf2 zllCqkRxV&zC&-$+;G@D)@L+QQ zw%mT8;;L<`dg&?S#&yHYp*t#incDkkgxAZJvauieW;u(kY5yC#VI zL78r|Bn|E)_lKqd*}3T7^xs|ctG4~S0Qzu) z>QQ9+;X;~ zQxCa(3CBZsW>sU=Y{lrYUh1!1V3I%>e0~4aC&gMOTkMHWPBW zC$wDc9Z`NR2@-y-MBp1TdyTbWCZS94czr!m%m%Blnh{hYXaL21sc-;Q8g4ZR_i==_ zj-k1X=Wfl%Q7fq5LaE(=_3!2m_jBGD-f@4rK%Z4m%siAkq1+^E{+x)IJDXc-X*gyg&o*wCxTyZ&=a zH3fGA(%F2d;)q&H$b(w90xpII899w2)!6G#XyXD+&!(o3_5e(QqJV`0m3jYhzL`KiD_a<$_zOBKggN5$nfca9`%j{a4?y56@vo)_Tg8BJzFz^q1xI z#c09K7RQm5n0NJ3QM0&p51KNpV@xAmb72=1(`M~D`foNwb9oqYB?Y?R%3-c?#{InE z-zaVKh5v@{>-+>-ZP3hUNIHY>Tt%-1nIZo|Z~k%NbB-{zbGnv0kWS->c*gC^U*Uij z8M{v=KshENQEp}Eha%|<_rVCX#H-4jq^#xBDj>>ZIgLNN2dN*AfzDqS6C^!mD*(P9 zTMLsVAEX3f<^>O*_Bl@;f_D-3)lCmq>C?WkQ%+IFjj5@@x$x8q4nXhAV5anZsG3lk z`tl*%Tw-Xtzlp+zh|EEk1?()Ofb@<4zw*C;Gd%hqcoHA8JTMhNl98v^_gV{!5D?fj zT%(2QeG5}Vi=W}7aXM(oz#jqZy%V%PKP%6#M37g_7})cG7!)4^eUieUPXd^cQwGZa z6nryx7YuE}ahd$W!W+01A6(gsK21%{wR^IwTl{8hjVnL9&_jyFw7z9;gGQ9Li$5gPqb@ux zZ8lTEW&rqoyEuOJDr`=#DkxO}1ltn$7VX?324IC0CX61YJfO|7J4|_vP`{UrFMG2{ z(Xx#xS#02pt2P#zd;Ny7E|W|5*f%cV=62%>Mp+|Y!chT^{)=%<KaExVmy+gZ0ps?07Q8WPy-9t}(73pIu*Q7hz9*BrK0{lDQ}XOyx`D1plMb{k z>_2*wj>5}%MZ!Pght<>c(Zx%8D0kdiy5Fvk^RKF&4|de)83Q>(&)yvtrwQ$}jrODA zF^eP`1=rgc#+gs1fZx?dHl>~2R+HrNA%~eyg=1L_&=C%LkiGu$ ziqpryB-O~9MNgPgJrAPz1V+eh9!vSOWn49E%xuhZJ|7WM>)8sTfZxV^L$6=rz)a8R z=!+>Lk)K#}$QNYF-rtfRh>D0T#*B#XxeO;(JZAIy`iv|)Q0bA6q-pPZXX$wh{*tEQ z>pkyQyOQP)!#>JEgpo)d3V?zqQq6JzWIw>qDhYrhF_?-NC0K1pK>`s^nn#Qx{VEXt zH_hP*;r=h0BfDcH~ zKq8jpw)CyT)*qLgd=c5%_H^w|T@#&`VrhV4?Z+#eqB7BH$pxO;Rnis?pn=u^RXu$% z-&@d({HG(?7u}+0bTsJtJ{vBysO$+B88@TzB9mZb!EgMVH`x<~XNHG2x07tHmI<8= zphVf5Yysy60h)?N1K-b!;W|Ci_76b6X2ukvAcsyB%o;wB5uAVNpF7D5x{|bt>oh-X=vA72>y! zlwEG0+<25J=0(XP{x7BD=JfOvEiU4MYOl?$2wy{!-s~Y$_U_`YI#wk zk^iK_4re1ltNJ@YOnse2EhWmz9Uq&NG!@CC*JOnbFFvY`_BO790%};1CXJt0f2%Py zvn-C4aJqyPz+Jln=ZXRSu;2{zg9c!9R6ie0HAA|L`Sw0~YtZ|canvY>qOvlQQvhxD z#;Z7&eRZ(Hji@9|`q~(FSX|ejElDtp9>HWjSb4+7@TW@P^$;DuRHP8 zW0rLk@8K@)y|aCr0yM@4yAiOB!B-d{e1%TnmAC(Wc+wBMF}fA;gdFiwUTSI9!*gEx zrFMnMt<3!V{E$p`)&;TTufGu=@x`ZI4SHAHE|aYgC1AL?Ugk1Z z3W;$TsqkZJr3K}V{w5{e~oAM?m1cVjmD<<1BJG3ZxlP zF(oU0&i@vi$E_qIUlI_3$a2beI#w@0=49z0#gXhudsPo&`8a+M;Kdr8 zx!;q+l#zE{XQNvq(?sb!Nfy~}^eghI-5=SW5_t?UV4ZQ&k*C;j>{qah5tYsPPwEf> z4^Eh^_$T88Z@LXdWpqLW7%vg%@5vCSua1HUQ&%B~5qqNegn?kHQ96eJ!qWMxUnokN(oT3zPYe7;^3?oJ<6EVDYlh<;LXf`(~YeuK~RuUs(k;8g`=uh*LMJ z8;_d{8xmM2$na8iL z$e-lC(0Prmef4U;3%hV$RcyJt8mBUcb;76X_MvT!sp*fxL`l}q#jFRLed5IppB=~- zQ;z%OmhiP?sMoZO%k-(mED-=Dv{w)6CvO{Xs$Sn;Exw(Uwee){?9`~oGX zt^`}VcY|#&A*rx%#lLj(7RoNEje=YYR~FHj#2kSq*Hvx_qca1SBW4^I z@2-3hIH8)VLOun^cfuuPGP*{cER_9mvq#@Bz0s}ZY(67Adpr8l75a0UJs|fOHM(zN zadJB2knC7OWs5rPViC9r~N(Xzl5CW<9+|-SH#YDn(MtC#mu)b~i)P-4RuGG+sQmd2ZAW)K1i^13a7U4hPb zS~}OdTQu?egPjM4rhaqJIHhWM*k#5C*X$^POrqHSY@Mzz9yopOXN^hh`NUPRGW}|g zD)n0GrfrG7m-2dgDnjU*gBr`raB}HjZ3M5jO@Cf$szq?v;2RY?lXpo z*KBQEwbWBwVvi-@r(0eUbjrqUowF$w3(>4T_ndvmtB|=fE|c7^L0*QjI1TPcnS4>Z z%qN^((oP-g9<|Hhc|!Qj^_Iu&GFVRi%%9HW<8A4)Q5yYryjfm$Jx8r!2b$KYP*l`c z5ki`p*0}w`_zrawdHB0lUwr%seYw`?nS>rk&A#Y48ChRnk5+bexpU!yd!=Ej8liN+ zzW!3o2svS-1D2)(c@cs}N;+*RX)5}+fSqiia<~OvoLb2~RJl*21-ILol+2Fvb#Q|M z#@DiS$|>uLVetZ$?$dj-ax1Uf8wSH9X}st=71wGhaSVm3F9?NT0)?`eX5UmZ1*>0M zL>mn|hUW>kl+E~Iwt4P|nY?YQLvi*{uMu|;wpuDpGF+HSE-fVZON6#j2Rm(^eZ)Nuv+hXCm5`8_3jZyDTP#i~S@nbK9@MAXMM2w? zLR+nEGNmkS?39Bt-@tTr56-IVdzhtOu+)EGyzjw~D<2S&%-^3OgL?6Vatc*08FT3> z3!Vl2Eb$}kq4BrTsSD9{Z(kA~UPV_NcQiV3@LQKMO&NPa0Kb0|s{G9N(16@Vp2H=c z3+wVsY}!+C4bUnf+YuF|K&`G$JrLuM?eCwGgm!o}N(Gp$s82R<8hL=^he_MYjGl2} z548*YW|PiXiPM>(fRlv!FQxEAIQUtmJYe&_mbChwb1K@#4*|gp5f)=OHso2O`D{7B zWY}cs>c~mMvD@byR@Vg%2cc;swdc@9fBO5>?$+YIoSb9&%QNnkgAN|uX0RyosN&d9ZPJ~?lC)aA-i z(y69s`zs^8UrhDqqyDXGj>w5!ngf(-m$HFeS=yp3?&gkd*+liEwJz2&@>fn-uXp>}(q$=xSdZImo}-)m zMz^qMcu((;UA5K4p%m`O%cyK!sU;!;}8BeiHhKR<7h&xro=Cy(kyRzC{SIG>D0lGyS49HS|6 zp*HUBrD>Dw=Wbt+rQl@^mvuysb+bVF8!O@q@V1t=wsyB!()!?}D|Le$n>ffmI^Ay5Hb-5-83UMa(rso;nbLM!_}UnoNSgOtii2QKGZdC`<(i)ib#=`9 z%Og$zCFko{mIqzhyEl&goJospwA^1SY+YU7;=j<%xTdctcXqk|$Z=hs%u)I5QF(5X zGW>^NyzyNyJ2^Sorc!n-h4$gZ9}^F4VHNz(3*-NO*|xktv44=Q>x#{#gM^(*uQ-;L z9WjPb&(tb8i6+HrH);)BUyh4N|MpCl6opfzFn`$5rE2$7X?)C@)__}+b?}@W8vOK# zzGeEnV@`Rp*RIp=>z}*E{?+-nVU4#Y>w>1Dqc!xU1SSm)K2#i=@RKo|p8jYq_rOw5 z-=c4(a|MntI^gntnX$M%*we(~b@UDT$b182C? zm(haWzRD$TXqygq&B7pAjoO6g7J^8CS(6sgY6%G2jqBs>YV>dJL}0gy^%_kGzfAOWt^5#6q;!!}F81*6v~iXg zC;2@<;-T-dnY4|F{986QS=9);sC7{+t{cJy#RhPL4t9sNM>p5l`%xE@dI4c`Ynbt0 zFT?0#=5}CIA6yX!X$~aG6|MvJAhZ&WQA{|H8?53trM}iWveC-OD*CLFy3InROTQE* zdVbj{y)x+HG3ek59g++UdD$FGD6=GLo65=mf+e%$eBIRGP&sC=9Jt^tomFSL6zAZcz0J|zrr?$@8W1l$!r8dj94}% zM;K$RwFndcJLd+TtxF!0ls5U0+?Vs^RB?r?Kr&&`+K^3!H^~ska(`f2%$_utS(1H2 zawV{5*pF9QP0tdKUuE6_{m`A%umfWbKRkaVCCjASFa)sp#@`p*Moa^ER_zgN4&Mz`* zH;Ws@&Kzn7*6;pI`Uvri*NHO09dt*lQ`#}{ zFz)j|eO9-y+#4s_x8R0QhN%E!6O(vKzAxu-zMnRs_F`(H-_^R9W^`!PF}phfP@I6D_+67ecv5-qAlb2lDx&3@q366dW zJ#Q}=Hh7el@j|9sa{;$O@_bX1!pULiw6I1*u;Ihf5XHs;UfWvm=yBi8Q#wa*s$0Yj^J(^TZ~zJjGXxG z>jp*-^i~9-8eY4JH;uTiOI|>RLci>;1_l19l*SRY+pP0o#4@D1hj#}-hQhq?SJ%;R z8gd0@SU$_lvuQ&k0_h3rNFS>W1ylF1L;H&W0T&bN#kzg*v_S(mR;6Y ziG%@!jg!<5Ry@a=O1!)wP^rLrCq({c%k1c^{2e67yXf)J6-mTRh7hx;oRAg%!91m7 zZTszWUws-Ro6dk7%-O@e%Y#nFqg2J|>7gj(u&)hyBJ{>ii$jP0@aFN^@}aBz`sXp! zH~z3J7fT1;ko-t^2)Sw{&LE?xGEIKf%+eWqEUp`(3uI+U7FUxl5gidf zbr58yi#d=-70}8Xp}-$i_lg5@jf@;)MPrTXaBARE<1F88VNJ6>u^}?NAn7p z%(w(J3}w63W$bB=PgsK!#jgjMKc#NBx<`13+}nMv_yo;0EFC%_vlyvb-%QRMlhoH| z{)SPjy|anDwr1{8Nt8g^hyyScdI?b5d-emRFeSn<1_QtIo+tz0!F!>v-CxU?w$|%d z*~(7+%$`+TT&(;EK3*%zknfhatFpS8!Zu+u7d^#XQl+|B*?L#ckPi3LzMjuf?`m1; zR0#6*GC2_1Kn(vjTt8Ipw+5-5OK7{0SA0O7II z7S2ZMW&k_zvwS$6cKCF&YmvU~Zxt{jIs#7#Hfpxos%%NkNHR;m&YISXoVwosZ0P2> zodG@({FacT^C2rO5@*cwRF{h{I^>qdN9LUH_Zqv*HYWfybSnxIWw0-Vj*!?kLRP4} zS6dzqMQZC34;T^{85q{$e&$3PHXNC!PkT)TeKdE59D3UlB%xh_*T76#TG~{2hF)%< za6&?YZM?Y~>v`uZkFI=)l=Z+GthHFloRZ8Xz%Gn_8#TOfYM2jRh7jlVu$ zB2wUj<>UC28FE1`^;}vb-kc7n6pZU&<0n-1L@1bVPr8xZCZ1M8_C=6VI$%mIk8f>t zV?`PjLHp1Xu;nl8t*ERd>2QgNi>H&xUStYYB9*7om7u0H;O60x@ASNTu};wc24=+r z<1t|GKPK*fd1VBHNjLxpPPcMIao?Ko1*9R(;CB((I1yH2X{@`bMnuDF*X>_#-^lw( z`id`3EoH}AM?X8=>S?(reN$;^;Kn7*>n$ZDP5@68Re1DUVnc3qiIKz*3$TA$M<7I3 zuXIgs{IyFgC)}xto|A(zVbWODd#=2*9rr>_!mxLqRZ{Pe@0aVa=*BUeZ?et3oH_B8$ zh9V}w)ZW>$BdcfAsCVk~)c2`m@GBFp%cgpf77~5AUi3gWtEBRVz2W$QnEL?($l@#5 z^b;RSI=>v#v|?6S5B{%5wNRt0>#c?+%p0<~t}DIbbVa*#yIx6=+7~LZnRV(nSB;1| zgZ1Ibg%||R6FVQmzG;O61N}(vwR6GtTI9U{>Jk`;%6IFBrrA}&(haYZqJn8NV0Uwl ztOJ*sdml_h#zhqs6{UecQ##!Ax$r|nRrS}kLfsx@S6)tjDnp$Q&9}baYm5Qdm|BNh zW!bfLv&Z0UW_n_$?CK7hNopZ#@Gp=%sL+;F;zBl=u*M{{!iJCBWlqP!xno1z6x=J7 z1|+xG5CvEoUVDgVW|lzM-0CWd47`v5jCHE|Udva;>FLTkCiFIDb1sK`_c)@s&Cag4 zuW!64y6Z0h$s@i*D-aZTbe5|MoU5#tO9WWz`1tdgKfD%w{lQ`EB>-$D`x-(6`gI~x zr-}KzfRts{jy3H|%5y|j8t#Pv0(&Kmb{#AJajykzMzLKGn4t9cLcpYYPrQntgtqqp zeJ5aoj%M5MU7Q)JEZb*2Wp?YrtK3HGeS`#9}y4u#p2$(#`IrLkF5Y z4cg!onV(B`5W&Zey;;t6%(brUHS)0!4%3KBNa+6X;R9=#&s^;eNb;wi!Xh!5(K(~g zNC?bYh~_wl9FmVAa_Y@Liwci*|3r7dkXrhLz6j3U4-xtd1R^ z6b+omB1tWBO^ttROex#wD-3Jk3a?Eo)zRsyTdD)7f4TWr^w#~=TFq*-0wy3(=#Fy9 zj{fnYN<}$XQK*8e3-je__wLCv$)u3Ajh-!#0bHJ))nb6lXsJ2Nz7ruo;C@so2ds=2 zR~>x@1`w&ifP;vHM3$#i-uLg{E6lyg<59N#v#g}izs{lJv$erAO{@lmy zcIWCYU5^rc1*m^E0Lx0jZPxCVeo0-^j?US+j3`J2qM*t?aGrb&*wxPB^86or>mC49 zeQ^HZvByj|c<$}ZHjfakI%~-NI7U$goR%K$jb|U&i+Fb{F!i?$brlN?eg|4fHKnqH z9^0Kd=l@sk2k=|%iJDWZPN|_xJT6ljep^1-*?7*?%0GINo?cl!20nW<4J;DM4sAf# zjzS+ha-`fW`N?U&#ki3!q#mRDk7rB4j=m{rGi&SXz2|nKqQlxJmqAgUTtsbD@qf(IDnc9=Jz)hVJ3neUsPdt&Q>_M?iPI)+B7IMnnCZ;c4{zyc~cdWX5s4q_*~;9DHdRO)cn;P$qDzQ{)*$>JwvY`__H4wj~cou&iXSHzrC9=c@P{wTHOh=$Q5x% zC{XRJ zf&?QK%oBZ#Qu`3zmy#~xULvL{1Lz@8!S6tj2DCDS9KRL#u_a|N`xUexz3==1@ zxi_MYkGbA;yJX2wr6J-96p?!*>i9!(P_0$?F{!-3C>%ep@km@87ETuhbwTYNf3(!< z3%h-CKiFDS2DA2uO&5Y8DD($?fdP#Sg)svT;s8+OgJN`T9uj_Z>ms=wQ=K*=vs%lP zXB|>9mn!Jj=(<&U{{2C3s2GBW|Lt2wMMXuA45*8UPc3xiIg5az%0Bd=C0-@-sbEZq zyTZP7L;gzeT@D(^8ogZ^b&#%GgZnkva{MuqHJ6OW;&;w3oT7)=UutY$;nQ!KGF>xG z<+2n;>uR15NlHRelK@^-%>#IPerWJ}F>ir_!-E0({zDyqXrbFwXDZLit^v783<(2N z=rK0W7iuTRW(l8t8QmKT{!j(klgH;t|Jlh|9j;T?F>C3VinKuCQ>RX?t>b9xk`BFi zJVJilYIO#?oqOhITxF>|-=WLjGNIT|k(7C<6<--YYvJ*G2=tMuW_ z;SGwxZG@@1*Ew#!4zC*~HT1Q|obM=Vr@Yw|MbKe<11bOwvjU;Tx4a~elm3@r%gI}m z76fkGg=j)EPzVk#!G|>+5ZGzTC;6wN*N{@|`XOT2S)?~2wbKmC|ViIWBkYW8lcC7x4eekWZ<$67|o z9a-Z?q|ExudyrXM1gu5U0Vu4cc50uj{xW@RqOx)PEQn%2F)2x1MqQMZ7&+}8SL(67 zYq$#Rc2|GRkid_K!X)TCOqsOo3Vq7#OzYHcz$`@+MeoksjgW84*)iEjoL^dr3`y=q z1z(!TM+o&FY@Q9Er;@1B0E9P{UVH+$1e&(c%-~J?tMqHB{zy#hL)5o$agIUs#()k> zt-jiVn(d^I=rcPtSuL~6zHHr?M#K;>)OK1XBD~L*pdxBdZvA&V##N-3!$GaC?PiD4 z$v23xf6g~vwG)3MU~e*r3oNBHxkDd?w(1eEqFPEK~YyqX#&z%X=E3Hb*B<#FWo}s1D_C_La=q zYplC%6Ry5m_V*HYn}G0z*FTtUR*OT%{~y_L)CVA0SF1?e5Do+62t_1Q64kBa&q)a+ zzNimUh+)Lwdton8PG4kc{vXt-0Cnb@o9>V%>K@(e*1HKO^p6KR3om;#)-wfw%5L3FAW?y z56cJ9vUQ6xm)@Vpz}Dn~GlX5MH&6T(b6)0aRy!HTm|B>18-Nj4FBzQ4HkU{fa*s2d zss0Yp-0^0!Qm?W`%dzNPuwDa}(_fcofUJHN-x*T*bnbEs?{sAM)mrFi6O zjOi{P{<>!iec+~l|`%k5Z zH=5hDZAa;NW>Np5~&Zjmh>54TD5>`y%2vjupRy>Ludw z4?*M5R2fHAIT?)&2Q<3-?SM!etm@IzisoKIEUlGSC_Hv ze#&y8Y~5X58m%$ZMp-iFTA=Z2U~JirfZ*wAUMHnQrQx~Nx?5^iDvE>)#y*tGo3gno zpY|^4*kCVM{!3h;64qbQG%hsYLALPtq|^Xm+b1;$ZXh~A$R)T>v>T+5nwVC)A#gdq zNG4}JhlEijjT0RctC1Hj0&#}@uzkeaXt46`J3O>|^!;+3Ke48rg3mJ9J+``ED@>Ee zdj4x8_+|(5SJj&g1js%<%tyXy7vPNZ+}oI8Enb*mg!u@TyK8z7s}8l}m|SGylNZSS z0(1VK16h{d?iT#uP(~cBy*CA!5ENU3;5g5yDvO;u_W;e@^`-;53goBAY13YvN9lwL zLm>ds(X4EPTt?-{s&ecX$RE*c(5R{6Wmc#VKA)di2=xGZ1*@HKEHaXbceWcN0~>eh~PXJd;N&>7 z_WGupU6c=@8xQH*1Mz2w#G@Tpv}0^+J#%w&k42_OaKmez5!{l^soxxQf{)Ke5n_MLZumc{gEq>@}rZAkpA{`l!7@ zvtU=6*)g*)rQGTsfJ%tF%s?PzV}0v$Ib{3rDXCAdaZ#pS5S7hZonxb(0SpoVE#_&u z|En&;8H$xv<{>#ATz1=$nde!}Oj_ecDmcELV!t5}l}-G#gNdz6yn23bNl8h!n*r+V z85xOebwR~pr%Lwfvzhlu{h6h+^%Ac(JMhy(PkG4CABVQsfPiRs@vGXj^BYx=2i0Q$Ji<=BO4O4%T&yZ#@8+V37D5?3?zM!`?=W1w51~n z5eb?lzK86AcbjnK=E|>5o(uzsN^zcS=S8nVKoe^Fxuo}%nxEtI2`s4^(%8xBb*}G7 zJ`cdnA7JcFA~vSmsX4H_mTH;&Rp&k52$)qPyaZA~nOXR(Xe&zpa;8qFOOoU%U9_Fu z^>+VRH_BJXYD4!Oe;&yQRcloH()lK>egdJvK>KM}bxtrl5~q7vN+zA2^&yZy2XNX= z$8X0VQpo@xNUoN^UgQ-~yVO-0TZh(=o3T3pNt5BCP)LGQsl#py2)rX&B7W^_wCtJe zv@OXD8My!qOiF?S~++;EdD8Z)K*y>2AzDK+=b)Rq=?R1dvdrt5Gi$ikVXcA>34u@y1J}NbOr0X1#1Vf#hq|Z8QK5$O@d^@(!Tu`+?HWsuDoi zZCz~4F(N0O@}RuYt`>edr>{TGvBv-kmD8zR%m4tjA+P~B zUa7xO^7r(Cn+T%8xIAVckaIgugn->vi%Xr48C`rX1)}xXYY_^j;36}38a5i}hB=Av ziW*8qF!{5V9=APGFQlFNnEXQW7Cq%h0ZwGDMwm=g2f^lqvG0x4z(7d)?QGRw(5@qp z8j%<=Gy{f>@s;|_fNmCC9fo!x#37P@nUU}OpGYyg@p^x6xFQFMPy!033?{#Cm)G8N z$|RSTmUi#mg*yH|$oL6Q68G@(;zG`i?tI7M#H-+;SGl1)jX(!MtloO3Sm*qPV)UXS8Lh*?eFR|Y3V#EWl9 z^w^W*25pGeS>X-SpALo(G|!&+F&LA@A85#mlgfLQZNDd~hfb!K>G(2EWEkg1xcaZy^+BS7RvMR*jIU@|M)IcX`O zJfCQ2ozlC^&|u&^G}sxNTHfK(wY?B8q>$_7y@ zLIjihwd<}CWsR)qQ`JkQzWKgV%H1`kU()-2?YZFxTW`M9%tGBdkb6surPpZ;gWS9L zdg}}oo|D?0mhXoCeXQ>IM*6M7kFyMq`IK-Z?m2#KCGnch9k7o(*2ewtapuJ?{>K@kzj}djlV^}%9wVEgR;yRi%Xe7b zn~F>7UZ;*QL1>)YPkj62ACTaO9Iyo84?(KsroZ=M6j0q@#&QjV7eov6e^3a}3i*Vz zSC{Kwd+p;q;vg^q&Xf-}2tN{=_Mg8>M>B}e00T>u$wios?XZabDylb4yOW34w6<+; zf`R~PAG#74xlyfcR!GKVV))q4N{>aEQ;XszxW`y?y4(8C;o;J${NNHuIXWLP1S)z0 zp)u!^)c!CQW}S(IfCG|_jNI&>!Iq%KRr=83M;F5}!P6whLi`BY2arN!A}UVqYt!T%clfR~ zS!0SU=)PF=j_WmB2#Iq)v9`YTY^c5v3G+~&G9G7!cecysFTq1J_Pm%1ZMeoH^?>07 zu4QeV!Ek#2R0g1W4r_lz(t;tcao$sU(fXAOPXqhnjmS+8*(e{W=;K>Tcq91E2(;Ql z0H=Pc7(sx$gBFYU@Qn_wV=e*_4Wd7E?hD%u7%UfP8*FTCvl*U#xv7Y+ZgT7~N6KT4 zmygewMObw3#D-|I$fT3fEQA0soLL|}?`^E3TWhWRV{$|VYUdeb@&TbCC;!2n1XUHY ziEM}w`$p1!w*{78dIr*fpP^^&fC21fFq(TdDDMr;U1QlQ1s%1zAa`~5G` zt}^x#{jo&@)BS{z%(e^Z5_egFgS2ga%K2Uh3200X7V#;N8-vo!a%}TL4E0ShbS5SK z#t$Y%M9N?UB^C!IIgtpHQpsRaP$-+X=y+7mX7J6Z(U4C^FII)iM^eA5k8~`NH4N)* zXKcD;sljE94kH^oQkA$tbahmP+u!hx;+jnltdd<0E5NTJxgv1?UtJ{?kzA2}nOxT4 zw+(i3$88~as#HTLn-+xeEk^*2%0}!dW^e)8OZ`uMeG5;|ZQ_=(xCUpNioWkJq?& zuE=^u9S^|eYgZ2&@vHKv*Y);tVjS}cN3u`KqM^v^9>n!sZ_9uRq3?%0I*bl^+q-*A zO%u2OzJJFb_rKaRay3Ff2Xpkgd-97Ys#qF3IqHbP-*$hWioYGzN1mpq zr!yjv<0mHJG@R07d1x=l5_!TuH>aQHU5!@2Og-CJA2*1Ev zLrTCeN#K$kKkTfcWN7DKks#To#qGSio0g2CP0Lb35| z);D)?4*3yYYTZ|fh7U4nf$Fj9#S$UB5YPQ;iL?&`16`jwO(dGK3iuQVS4s^|h)84u zpai}Z4wA%qoNzlg(_hH>qBIY3@u=PAcL%EerNJvetUa?r{UL?-hm@`|D_vn$x*E}x zswg+01{pb`)q)ioTLPUC=J}1d@XlYY@%yttUowbwp)+=K<-(je+yveI|22NVDLexiRkTI^rCY~ zhH3z(*{PW2A`Hg?o;8ttC*Ko#}y5rd|*TBgr#49rh4VG zst$-aX){Y05mrK8!cWDq9B1vpz%W1hFb;gX=-=^yLj7 zqP1IGjR!;kDTY(i|2H*YshUh{LBydzMjyxqNTK(s43&i}`O?Q5IIe}Z|2lYM= zWxAM$;{dp=;jULTW1-xTA=03`@cy~pUxPBF59-CNa|}di>^Ja24un9OlUBkCx_QP> z)-h_*su=DaaaY|-I`U+@4x|8cz}}{hRfi{(8;FY%F%9K?biW7pVv-G+7)*!wp@t_v zH^E6DCwz{t@Emx|HF%iLpkM!yCX(f9N=ZDDplps_ z>K2mT2z__8UJwEbHWf|g53lm`MrcOQ4-L)&>FA2is!G2OF_CkHgWuhA@P7Ig*Jt3M zTzEwhX36TH74I2g7wma_hgQzeNZxI(oNF#uVBI~NcvulvG4A9!yH*mCC{?k2ClLWT z=#Lkbq1*iI)UgrMKw)sqdClkgp4~{@0f)dd${5Xc-HxstBYl1camAfYUf)TR6Sj;m zJ{v;cKV9A9k6tV9Q-&oc#~Et;vDTy1)<@1nsi9Cl@;QEYFQ`cfO;_|%)%=(&NA^bb zCYR;`b_@l+kc|8*p13fCY@fCep4f*xu}_enkx#f~*u`1x>y8Zt!zw$pFR%pXg?pP^ z@V50P@Y&kq%MZR>23bvRlWmOaPxctOxvuvkfbBZwA1=L?`6NGIg*rTp_OeGxf*VO7 z{)DqPY=ztSVK=QTbD#T|UlXR%)IDtULjj5kkVMMNQ7AXF2tMf*tVmIhlWr5bw}`q* zo6Ifh(jM&-!CT~Ag<8N&>`+-24MJbWr9*n0`VurF zkI$GSi{;*EK%6LaoMf+z16C(kZ?R|>?CdXP zOh5&g@+cNTUiw67MV@NhZ}IpjeqQUnL$R&OZ52%?#dC*xW=9>)PcKU!K1=8KGxE&x zQh$n|kQ;izL9I3-d;63WG%8pyTzlTC+pb4{b+$`oL&X$ifsMtfg%uj=Um_phBBU4cHTR&-kg`Hv4T0HvSwli}D^=H0Rt2QTSv|ESSGamjqaxX7S5}UiOm5`WpSNBw9#i5n{qma%$o}@kA({-nWK2d44&-utZ z@u&Jf1MDWcRLDzAiy7MpB1=RuB5O&<=dhqeYv^FVYO9&SoCrIV@A+FsC`el7MI?ld3? z0g0Eb&LMN4ABFp68UGtN$Y>(qFml3Lsm>VHSxD^#t-jMl8Fts+yHXFEUjOhHOF8uu zePfp}G^Erw5!x8k0ue=*p?i23ISOEz9Urf|_d49xvipT<=7ET(D!iQN+v@y>F#g~K zLLMw3HC{Cbfvc+EyCJs1*J0ykv+OKWk-i70Qgid92Dh&U`=d^#9UXi$7z#A+JKDD~K*7g^Tof08HPzo$gFyPIzOx*}*xOYZ&qBf6o! z8q;I=bCEJLF)2S9OX7?H zVa9Z)sJh|VW#}rUsqquGa4HmOkDo=a_M?8+EJGNR0w28!=k`?2qfL5z5Lj+z=&P7P zg)e67#bE1DEOtetI{d#`NW^pHYT$qU-TfI=d%r^gSb*<^u|2N_9!*Wy;FT)ticXxs zl`t>Ihre+T_2Wl92GXdCVDav`+iR^JdO&*YV?IRkVxZosp4czp>fcpI_o2q{FtFgS1dTI!I05M5nqE`l$r`1n-MRMO;%MB9J9@IY!NtH4*s11ex&}OT+ z^!qXb=+svXfjocFL(_8*_F7%FHpY?-pyE0HUu^hvvb5XRuwq}5rIiXwm~7ez36lUw zm~?lbM?`eDQiBt|t2-`fD>PppNCQRiLHC$EB%`~E89uZTpXX;>SYiR23_ zomGkFX%B{u4#-BCww_3lGK3ME=bKM@*{Ltmb=Pk0vjTDZ=;Xg+?VopeEgEUOj~siK z`LWWg^xn35`mEM8UdWhN%uJ-~!3OOcux!v^9eMUh5E9RK1u2WY_`gjtuueIr zn*>$NpuWN;uPKOQsH_66tjj2~Lhw>?oNp;DU+}$3izUm`&zTP3QxFf$l zbMMM^v8NveGDnV}PeNBu0LMc$m>w7)WJ^?A$hJg1nGslhJK}ZM-mXkBU-!?s_Qld= ze`9q>yiBh{{~K9sxMal0#YJ^;={f9-nW-3qT6WO{%HF6w%qDN)hWZ~OuN}^)&5?v* z8XB!~)$w6*e45#dD?jLotS$CeJjIrurpAQ;1)WB1esCO`44Sl?gDx53YY!~xE!yFc zPlAHzR);?a|LyI#6psw{7098wJ*4Z;Mi}LE%V4`N;SK_H7~MxV!!7}D*maiOnGGfZ zYaS}#M@%_}oR{dR@6f?qFj84upY^`azhpG-#9vC{3fe*M z3<Hc!sb zN3?VNJh+Wx@k+%Xawqo>=Uc5!h}K3Vw-VI(q0x!|kA`*E2KpoAlTE|?auUX=Bba}N zt&c3EC@|{wu$VcjP|U|;=axGgfb_g!i4eIJ1qv{%BM3t73=40OkP1dg@$AJ{|C1*O zm?rxet~jCIK#-dTB`IWFH*@47HUf}LI)}*&svq*BJjE6##oQ*Qnj=7l>6@7pGq+xV zJvHbD1;4t0b-^D#GDEi|I37s${gvDlp&_ZE2QY#8P)7|k49Lqj!6`Ms$K~%%E@_`6 zzR%i79xeNSkJi&O^v=!&ptMlUZA%)sAy_|T8;Uz0!Kx)ks3Cp>oBNDJz#XagTMBe< z^@oO}1p&=;^Gp5i=aV_;i3)A!Y)jO{XET>S+u6Uv(@0P=zAzJC+SDAa#z~K+v+4;C z%qSFbNK0t(#1Ip0?bUI{2&N4@%WBs8IMY@~w9N#udyt;vf6hezJd=zIFHt`e_qM$f z;SMqbHHiH%Z*;UZ@hUcK9q$V7(o|~NhNC(2YOEnSeaYT7(XRG$ZY3cu&AZ0aP230* z`OrU~0GU2y=qMYRQN-oMu?J#tjyS38tW>ZzYO2qLpFy4v1pkD=mrrqMVT~2!p zRHLr8_lhTNcz)S_(;?o?Fg^g5ae-9{hRnmW&mos?>@SBSEsP3>Xp=b?1SW&(2Y8vb zjzIy?a{IQQ7BEQs^)Ia5oKK^>Xv;NrXpQpz)W%>RgPcg zBvK4V`qB_>qDU0CdTY zE{k+qk`z**XF}n?lM!``6w+JRf{FgAQVgo{$Ss@T2kQp1#-rKvE&xNP}Hkjsy1c z01~`xUgwZoJTpIE+uv;=f`eXy7X!|3`3pE0TR?Vi9SPwM^RttibazQ~x(hqr&;z2& zJQsFMU9@|y$ZVf3geR5gEWYt^v@o(==c22*efBc6M?Rr~?JtKiI$%F-ZAG5vhzo2XO5ZG%!v>T9KdK&L9ua2%h*(n>DWU&(;7e^-YNh6hYWR)Yk)5`68^7`eya8ht8 z6!q9^wZG^Z7a%H-A75Xoj+R$M&^<$&!CvP^!`!D_2s=AxZm*Gg?xSZfZ|GS^F$86) zhY#yYSC*gzm<)F|tS%d{9g4J>?LkaNHQ{{^_=NW4 zW}4~6^RcvOufpyyz?QG+eq<|QBTPjAh5bWyp^ z5ItEWgX-jWS7P?$0{{=M+x8Y`hz@0GGnJ@npXtWNO&K3IAM$|c&y(lU-aX3gbK-&J z74enWkt2fhU*sl2y6d$lDVxF|C@X>;--`PJeAt670kAXxaD}5kSk(}A6d)@0P#2I( zQ7xtJgoUA86*#aeNOt$qnYgbwR`J~XEasu!)W*cY?O#NHT`$w4tV~mVkTP7q98KP9 zl@~Dj$DR$pWa?T;m=O8-8vKHCr~6MQNAV5=ibEo#ZGjeY2XhVrodV?bdujuGPY!6a z-|l>4`$8S=hk3Bdgew}sR3Y3dbTwD*-ctz;<6)Y}D0G_2;Pw}Gh>7ejXy-qRq-VXs zGhvV>%N!Xa50g61tSbMCXiSh0&()(b(N*Aq5)p|fpB*~qJMMkUtkt=UtmP?lq--KO zdpN}rK!hgkrSq7zVH6)!ew3JNt1&5DfDL-)dZsY|BMvk^hT7^&XSc*`S|5S-SHtgV zs3t%EerF4q7Hxne@x8f8PHk_mjt;YZ|7qdyaB0>6a{4z-fg-Sgn2c_J?9L$CppAMg zkYSj$6EDBb{w&S%*^279x)2HJnn#DqX4i|kb-S0~MdIj&Xy;wRt^}0Tk~s(A0!FlM zXAYwEuzM@I8YNYz1n=d+n*(BmUF4`ld=PVgS!R$D0{I%kJp@q|DJZs0je5ObPN-Cy z(SGq!=_cy8lM4~DPM2mgBi}9F6E9`SEE}#^J&ZXv(8af7x|?z$d{|{tL8-fcQ~3_H z1LgXB62Mfqt-fWBBO?-mK0h>VqP?WNs|G|u_#>dhY^Uq)03kpi1QP`N6Q%a2*q^!T z$xOf%^;JBuDoR(2)2hzHKpNY_lCpi8B3hkuy<$AtcfRN*c_<@=vQsk0#>V2L$+52E zPmCjaDZpkv4E!(sT+oRVMyMa8vxtfB>j#Ar$ObAW+?Aka)3Ra2L=o5 zFPTzt0GkYS*&V3jH{s;>RBzhl~V}CA|89x5@{y5e5aF zd8~yJFqAm61)e!UJsJGE-1X?>AM)4H)?0wts!&{Kyy$@A$(}DsS2R%Q*iIGn(2#mB z`_XMoPb?O!JI9@f??*Eb@yk?zH0* zo+jyF{foeu(xis3sJ=rs)n)0$h^cc`ne)_E5>L~RF)>@<5ILe0)=(l!Y9tsJy1XQD zZA_;#n>9&L?0xcH(c{?(gFQdbB|?c`#u^h7I9mV0!FAeB#Y~!S`-ivV_mO%Cez4cL zJ^CZ_`S63VhJr}&N8xd5;xzWr9g1m+l0~z_nH+v>AvJ+$@>8RFxtq(QrJ!DQX1ByX zeUZ+D78HJ`vgH#1$)`qA0JRzZRJ|iB5@I3?qq#eW>?~%M%UKGRR~4GWO9ikS09j>? zx&+;$`sA6h{oPvGs(PshVlRU6$SL`k%4Sl$p0H}{)A6_H|2r*Ga3$#p>y8ZC8a_sm zL$H4dYM4T0^GBA*#-$Tnx469gd1^u@P8q)!K^irKg$eabe3>la$@}c*j~Kc1+A;B& zfbCF+$U$a)Pc>n$#h39UuqOj=yjmAIef*cSEW^V7tNz>-pPm zw42YTP+jTrutL=w#lCaM#v$*cKm*= zY-awOd2BVst}NEyb0krix=A#y9Z3sqJ;U4W#KYz*{eiDVC{`CMHM z`@}i?thxc&xfF>GecfLqB2sA9zHx|LDdl`5Xd0uDT8R`B8}-GLCl)r>rgWpkc;Y+5 zf_k|M%_MI1Ekk>`K+2kBTQbm%vya2U9kiGY2iUnz?G&b3*_lZnQeHjzd21LM+Xbr? zdO-6ldmUG4XdUm6R`SWxMh|-Wu=`)l&j&EL87s*-L0gy0=vpjmhQBl+l&muFC)UT- zcp6u%4*zttJD)kb*v$BdNK%idJaU^RN`8nXW4Uro4ZlXeWPLhm$m_wzi|7PY7WboZ z<-?H0;2+%BC;ts)ZFgKsaZ>wg4w#Q~)rU?tC|hW!d)vc0{B0t^FjkgqR|7ladCSXB z!p^!eid~%&>*TC|A$<=%Y^=LcR(F`|&(Vpon59^Q%)V|(`hkLiQL&1}1Qq;LhcSPs zhBnR#a`dlxeSQRbmkrc?qB|d;06JRLlk7S>l*H?L&~b%`8nu~8gJuPKB(7Tj+(l5o zghkP(J3*(oKJW_MY1O$`4!K>OmUhmLQ0KvT^3c?^h1&P6S48Olj<`;`T`m57AY#?B z`TCDbxSDDy%qafKtr{y)HAw<@t$)_#GwVT->!S~5!anJUHIp2_Jl=Mp?FeSkX-7c} z(#>o~tjF4He}z1ok2h5P9yWm5-{SBhb9mG|zT6`_*h8v8DVVV7%bZNG#-vGLx@hMm zfnalm?qQv;uS!TwR$dK=y-&;>j1B@fAK8yd|9T%QBNK>wdOH!!!!3pEhrXP*$7>CKwAbGP!)FAC$OTp z?#1yG5+k0JGz&^!0hE)8rZtRZ)@y3>F{K*|gj|aLu>z2~@9e$L zofUdc+#auWOrcxXpv@7KiO-G21qs;7;EgQ`%iRm&?_=95u1UfMDvPdiBj-~K;(giG z$+*FKr9-4{8me)`m|0Qvu`C z-UprWav$lv14eK@fYbst+Nk|OTzZGo)Hk5tKvq%8xX1(fJym*)nC;PnmSADTOtqkz z&lfHn8k2Q?rYX)SBNNoJ8x}SK$?cQ9aBPF*&e59b$_Rd9AGhT4%*Usm^NlvfnB7(e zznP|NECUrP(z(1s;$VMNn*sZEVvOLQI&Q<8+(vO9(00!fWSKwUG^Dp7Ga};d<={(# z@0%SEy9@&g@)-c(J7)(#!z~m}1HBbJ=IDJSAA0%5L9*T6yf8(SMf{|-NSn^p+*}x0 zI6e6;7-3J|C9IRyDREJci#t{%k%d%xf~3fS2mU>N?NcqUe+s49cz&CcxxV^!)4`cV zZAXeBq{%@ur%&I{SMA6Krw4@_pr~MCrgI7upFEZaQOh_a=3yRYc&LS@;$^oBNNcJB zt%;slb)W@09Rk{IZ$jwksG3FUh&{{V-{NMV+s1|2Lh64QS~T@;qYJM@Gx4LP;dXLaR45xOvat`LWvuTfR%1Q`ey=m zWpbbjJldmr0*Lf~n=FbIt?ulx{8cPja2`vl2pj^EU*kFCRsPjRHc2`6kYuow+m~Bn zJ+5T6KBDi8=V_!lkdWp8H4_N<;Jc_T>VajEZ3dpyODjw2FsY^n-n;EnvJxbvTE^2x zO!FX7IynNOL($Yp;hU#_?a(Q-z~B9KS3WUwC8j4npg%J35Z5v*t-1RfTg;Ndwa&w) zFJN|ftuGXtT&d+{vN;bC8UTLdcFZg;TVWbEHduvQQ|0BMA#gIEv3i&iNJJ;oq4pP^ z!d`^reeScELqD{j1Yo#wB$vF_36|94IdK2F*I_izq)GD0&YQcShaNuqlfFh8#eCN# z@d7_wG~gFGk>bH-187UgO4gCz5s23rsA__}wpR)|WomF8rQkATL#hqHSIbF zJ>Vrv*sO$Qs0QkI8L8^0W+HH40>{HhH*>5kkANIDaM?)W!gGW74!Pl-w_alU*zSeC zvKPXPzj}P?Gm^Ct?1ou?K!>M6d$cVk2+O|0?oZTLr{Dl==!3ZiMiOLni1z)ryA$M( z@M6FKni^oUrkId4-`S!&aYY(^ukS&ILpv(!U$xAb{D;3A)LcUikkS?V}P)u)KaY^BC^+&4nf9&Jh{SULq8B_HF@Q)b9fW`>CSsug|%K`adAbC)V!xmC~2rx)}{YaG=0>GU_ZA?E$d2ZWH(h|54JHLFvNn&M5 zd4L30c3rRy%?V3^qLSj2dP69jJ4nkLMdnDy{49jlrEN$Yp^O21&uWA0RJGC|!n9YE zVPaq8X3LeE+6tKJ5zE1IL6W$;tlP%z1?~>jE7A-UfLo^48_LG0nprm?ST->;-VHdz zelbgQ6LsD8uMx6jIthv4)0hv#Z|EiS8mqHMNz7m$mEhqg!+{(m1X}Mk#%5G=Luv6Z zVUOu0HEMl}Q`$-$(5Apt;gxi+>$JVPiQGleXWw&mAmP^O0irRoF+E0kPiPo`1A6j% z?rE`f%2#AiVtXWsSH^2)Ly8nHeM6ElUZ;rKS>Z9$ocC?ipjIVv3i+(9Oq<@}k)NL#1>(pPxfFvHStz2YMnl*yS zL!Jvj}N_ppKNFJEQYd@cruOujukBh7>j^ z;%Gx12CZRR9jZ6W59Nn&!6t!H1=Cy*v4?|4#22$xuD%#s^$xU&a75d(99P%F+jk* zGQBfGq7*MhR|maPKw~O&sYP53c1I)&4VA}}E*Eua{@TSzaK!l;eiJXcda~FGa3)eF z8Vcu#t*?-)X!~NV{9IU(4S9X2%BFMJBtu@V97yutb<}(s(VDP&$aB-RM~hvG=eY;P z0niQe*H$>fUCiN=-{+|@w8w&8I_GKLj9{WW*ElnTfct45eG?bweF?7iZ$B zxccf2m{_vXrTWXTtp|!mp3|CBl2D=p#Dh2mTXF0s$owu>!XgDeL-bV00#Q z{fg1TiVQ36zu<0TzlWI0oq})(6hgt+o5H5;h~87q!{v7b^t3<)gSuO&>tnuGLtd;| zQn0DD6M7wBu0hp!Fz{1XkF_f`V-irWasRiI1INkk4;6O&ZXx;iq0;wp=VKtCd9DrDq@`Mi!ZSVF04TUCxz(?ie{4Kdd z$PyF0k$wPPuYeC_#}!oH4*lAy$WHbj+G4Q~3$1EurV2vAqS!BFJwOUebEz(yUoG-L zlaWXPx9M1aBjwZXso1kXgKJT#3&qV61jtoH*l&Ang`KN9x~1AG$na5_O_)J7P_k^; z1WMDR#OAkI@E(*h=bk9kqCT-p8(ThEowOzRepOuL0AxjqvL^% z)`H}LfE!ry{B9(BPO*oyz+|Bc5ZGTASaS#p#UNIFXx9YQ3p4%?#MXo8petN&g`Tq< zYJv18b-4W?M28JrhS-G^o2IrlBsWh?`~wgW-WqG{Ny-PGw)<*M0He#68}rYU+0ESC zieL0~b+Mmtc0@oZ>pZmJwWKaGkcGOKHDm%C_Q?_;QeD8`L2G_YoDrZ$PD*_*#sxG1 zgF+QVeC8QZYmqLUtBwxJ;M1l`7nD&Vho#<;~zz?z^6O@R(}5vzexXu*V8~uCufE^rEoI49 zWAQnz?(Z1riy)kiQdhW;3++&aq3SLrFYT_4!x zd79b3M*jeM-(&Z#9nznNVm`D|Tv`htXRGwjqj>$X z2~`V33&&L{fkbdFPVw@f$I#`4rO(0+dXAur`&-J&KHlhMfmiupM@m5FW{FF1s|0HJQQoO>JJh~ECN>QKV9XLm zasO1Ffk^uJ2oXpv3DS()la+Zv>-m0dGyDuEvHAb2f1zCHkW7|G8+;IU&vSQ%lBcf&P-$=9EwHvSK_+4Pb+e9h z#-gMx7oDy+@0R@|%@=BOAL#Z-z6G}y*Z zN7P##R;ih(f>5qD1C5yjjoLNu{@Cx%`+qX2-pynf4 z74hyL36$=z;OsSiIr}WhQjs4i#tg=XB#%eazc%yg0^%PPBbI4uhwXBJ1J_WgHYNpu z4%DzZ^aGMp=HCP;#Pjbg0P)RHsO=K7>d<_<5f^tjlKturLm~)5D}wP0&z@)1QJVZ* zo8lrp`DU~5otq5K9Yu!{BCag`NT4ViurBHTG{WZ{Jj2FupY#~n)m*!u z9<#1L9A*;TCSMLSXy1u4H@_+srxeE!#hk7!e)31*5S4vGV!D=dp;p;MnMkYCMZtpp zw6j+CT60PyJhzEo#DtYfS(WGr;wNvK57VJaiO&^l=W@dVpQYGJ6CWR>dSmdSRF_Dk z+?!y_^j96_FIijv_WK)N?dR;5pZky8Dh@x|Fg86><7mDdC@UM)nmnS!5XJDJ3JPr! z)4Tf;;0Zi0mRXgJT1~0gXk}WPmq>E0?j(P<*Xj8BkUW=hm&1%XF5{syQ1dt#8m)TV zMyp#&Xy}UqKa=o*>&^w7{xx%JuAE@`zniEswxb13p>lI`OPR#DyR0FcpG&`zQXnq6 zlm$c8En;&#i>g~PR{Px>(q>;-Uvmey*0N{@750cHap|+K728`rStL`{Fq)ru-uF#+ z!mP{C4S|%l8=3pp5d_Xmw;bj=>6XUMtR!S#J(tEmJ<(mT!(aH5u7?gbpL}rS&A>dy zz6xEg0sAuJtm!;c0jEL$T1mIrH*glE1_%U(8nOQ3;qcS+lA~keMAoVApIMH+QY8ub zH8n+jfWZJ#b6HaQegM8Mgcr34P!Cq(l=6%G7jXxm`KSg|XzK zS5(7QMmkp3%m+2J$LWd0wl{mdmG2ndEa+qZx%wl)gyI!dUpCwRk+dmhgz`TKAD3Z# zBn_dtMI?Q2RJNnmuvJ7MmDWorg}aa_;b=GdTvjF~<&7cPe)t&EA5^2!>BtEEu3Ir; zhP_VZv6`#O7vo{h-gA87sZlAmeL0uQzjo6dhauOK3tBHIzXHlD_Ex9HcrxGZh2 z*nTj)d*SY1b>sS5sy2v$p$kt-*c5R-dP9 zf6)qz$~H0?SMlG|^mlzz$2p_?B7>qN?|K>$;cG3v)zZGBt#fQqVPXd*{6<{ITE;C@ z!Bna9_NEl~b(gl2ZSUQ_NRU6EIQJ7zkztKWbc~=_x|3(c&9Zy!1EE6)C1^`YJ6*#g zWRCuFVLQ)aL!hNuq}}%B%{kI45OUJA%ir86^m;WO7vfc)%|3hZ?4L&Yn`^EHhSi%o zxaIEfrH2JH5=Q*p7@Sl@Ss48445!@?#m^hGxJbw<3z~H$U64o} z@?XDR=4UE$WZP%2{4&CwwE0godX~paPh#PIS0 zojxfcmU0g6igp`p0p+hNzxyYlTf+77=^`4|Tw5bi2v0jtmd?FG?qjkuE&*DK ze&Uhvf4kRrrU)9glds(pzpWEv+bds-`<+d%+<)4@V#_EoJk)FkuN+4N58)_t#YbLdBy|Y^+EmxQud-uH};Vq&8xQT>alI0n+`q0ZsgV$z9@1+?G?|Z z>D~RSKi(Kp?n`+0=r^x^r-NS0sk(e}VJ~@!2)u(i$32rd$<0kU2RiEz+qiZ-_#(do zYja)|j%697a#>G~S6&-G3;DsR4Jty$(;YnEpk(BHLd|ei%ezw; zyW#39Rf5N$uhuF9P}LcE2S{rUNL za|dtn`VD^R`CgP_ie6i`IZ_oG;)>bmlm@GbmAIw6!Y27{+>Bdk!Z7C1y*3WfQq@JB zEZgDdI;X&O@>^&mZ1N$R8!!E!>hrKa%t&@f=ZOh&Bdx7$zOw%2xaEa6+Qjxh`*EoFj82egLu~%pVi<%fryAP1 zjcY3|BeI^&*{*eK4X2JBtL)p_VHvs9un(=z6F}-85{?22`F=zpDqJK!fXK=(!k<#RBnh@>1=QB9+l^y7l;kCC@$>`P zFK2BCgag(WJG@6-K?``|v9g&KEazR3ZW5M0sokSAENKS|GCr5Q>wtRPqlqGsfzU72u+(3G0_3X6D?rP+`~tazuu%tom5cP zUY1+bKHYnDL)mFE2&~+xC?uF%W$4d+$I#CLIgjROelZIfkH;BOFwCF&EBfa+(Zit2 zXTU^gUF)spIsC8i_3P)25*x=>86k{DFa*{H*)c@W6XC9aX^`o_qd;7>?7Hg)M~}n< z(nCQjqT8ko>=;2)ND5Nmh1UH+A@&5KrjU~*8}p#9)bP>J=zNyd=v&}fJSHZ7VJiZm zn;DCs*h4Vj;G$T(8MmUZNz%#Mio6l6$;p83t|=xa$eKC0Dbs|oD%(lzS=Nr=`m%Mj zx>qm-kR7=0p!*H0!9Uu+%k0NrNv@hLL?tvdiK>S4q?>en7+^f};pro`hNU9R_G9TY z`T60xYwVgZe(@JYFqOY`@K(e(Z5WAmrogL=61#SCo8n72XpBfq%v0Cw`4}HjZ|Lff zHLrh|(H=|#)|2Dev8})P6|QQwok4r|q{97~#WQAlB1g>fW|wHkCsc@!wIF^K^c;}8 z^zb*IMhN~Nwt+P`7>>+A?dOA5&!@Ox&$&|tA82I0jW??>F<;|#hsc)mt z$mdo`L53V!f8i6(PDE#`+_qDxFhn1^`%;0=F`0`$2OGa}Nu9M5AhnWNR?hRqALAa{B`-8)rsfuWIf3J)!x57{HO2 zDxyQ*U%3)##*Fo5%Tr9H5jBU%)>v*#88m?b3}5IlL3>{w;n`UPtfthIY%=%w0Sm^E z#qpT4zg{rwRKv{#8BobYwLF8aIotm17pp504>Ru zQni+fBbLQ>CtyfLB2>#u9X(CW#J)3ESod6u11_g%qh$lAh<-HCNP~i*te%UCXI9a$ zX56n~RI_$aX5Wcm3oET6F}*;w%J7frLe9PY=O%XcERYOp2~Zl|<5 z7plx10i3OQve&%)0EXATZ`xKj zb3iqglnF8DRD+$U@sgEN5gU=F;I>@v5?gPZYs3g{3Hn<&WMx$D81D3EQo8JcMSCZQ zq>%?M(zA~b&YVB+{T*d63F^B%@6wzSTa@00ZjG*wZb5a2qawtIs|}0;U}esbzJGTW z{3}EXyGI425J0|R^BAO6-(gLxK;^N>}JO$i3dxL&fdJ=Q+4?Bs*brj7Mru#Z>u9 zYisKjTckl{&C*J3h#zi|YD@@hUVTiPxi>8o z^x_1$WZ+G9o-cMhlr&O;hhQ&Y9cCrH*@@ zipDoh9n0g>%?!GwPOrl*chW~B;d+ghvg=iaq5xK;vjnh`XsHmAHn&!VH3?+jj~T-0 z9;1Kgq=Zwif5oyBkudXxF4HOU(!3GMA`xw!MLF!j4--rnhVx2C|8~r{Z4hk0Q$HPA z*60qgj$f?p<6Hfx_O|ACZ~sU3{`p=2dv@-1PutUQW=iYyn z;$-P!_;4e5{fukdPcz38h9FGs$!hcY-TJ*YDu#!>|1>?QG9Bu1V85^*$i=hy1$x{4 zuV((}?R_Ddx4~m=@e&9eYca7>;Fw;h8n{6>ZXG)EobYLd^20OaZs_hg)u4EYg+a5J zx@3FUQ$h8GtpFSyulu>}p_m21Yk$?lU7+$6?!o9K^NEBryk=-|f19dcXC53IM_%-o zQcbALKee{@^1a|(lN@`KpoZe?PzQnZ*0eo7lEwkWxh}PHZ|=SW+4WBYpd>-^(tM06 z&K3n{Rv*2;=2Q)uq_1_yU;nTLM-P`TMH!$Fabw|L}ArJLkZ5QpPynwsWd@XOHFj8j?YzG=1fM?~5tgdRGMVLBX| zNkYdyzrmzOQV1{Tl$ruw_|qU8tg$a&;CFAPU$cLWN=HHj}Fn<3FlqO;aE^IbG>=`)!;5x10*^AM=B_HN)yGTDxlnAcDQy`;0Q`wkEg^R_$kgPCt1HfTw z*}lC0^vT=khVSkJ?ozf++2IW<8$l3#Y4A3&0J<(Ylz|9Aoy(Z?pvvK13Efr+y3G=~ z6-E`JJH@4Q6%e)Q7J(xmuSH#3{u~vOLq|Ta+OtG>My&eoVXWljp{={>~p$qA{j*eXC4XxAP7<#NMZ2y&$CU`OV zQGAit-52WG%5L1(R5)3LBj69|5FJLmw_aA$5830bQO;R~+~Fvdb8=_9rQ3l+TmAkH zkIpi~k|pTn9vyQ0`)|{mPo;zWZn%S|de2y+Fb(^5ao!OvZi5(&P2o%5YDO_l@3)KJ z#(Bh$)n>%>mfd(4r5iJB1$R}on6CoE5 zHijIBqWP@S66c8DGz&t<0Wyfp@C))@)J z+s_VzY=WZq>>})%>(Q6C$OUC}t3+O+85H#MiqVV#jW>0Bm9Q4PPCaSmIren(O?X6n z!15y%C6~^DsGH;Ry|6AP2T_?Zm9Ot&0nolbXkH9?8>qgihw;ji`6}jw#tjKy1pP$J z!+UY1E3=QViZ4l$R=4Oao;eu?CM$2^H)tv%n64}kk73O8)^RC579e$ckeo1!JbY=> znN93BLMLqto~0|CKeOGjz{x^y_N1$rF7dbmD`jjQ{$p&Hn3#jW*woMp@UeQyMjPn< zeHxw=;GzdGF=)^McxYyYu9OrE`W9CSqp{Ik#G?>sFHz>jVzmPrK>Vs?S@X-|r-~G1fuQZU zk02tDi2|A71n|CprQc|iI+U>Ep_$`)UT}Dbg3`SA8u#HkVHgp8x#2eieJXbKWZvAo zndiL=Mw-hjbfaU(#o`8nhKF)pKAnU7c`F;#z91iLTgZ;_sXwwqIWsBwJM4)nsn1hz zO2=I?A%0NBS%cUC%Pto5JTiSOg0w^ws*>Lr1o!82WYy1|vpkIjiQR$}?%;JO*--x! z%?Z9EL>}ABkhXYj8+y}Ky1ZQ5)Mjyo|+6MO@~HP7&$!9 zsSOmtL4OPT2_qmxA1@dLpWzAW?hNF$rw@uupVf*St1?+?rJL0Bextqpq4(XmuI^kl z6okC307Abwou(^EVNKe6x(*U6;Hnfm1My%=axxc)2SDc`Yy1WOwoQl#_S+~=11eP!Xdj54@n$2G{cn^!M1^G^fC&eWs!cZ3nhh)xiD za5s)4q%Ei$66PC9*AZ#fNj@QqI1JVQX-DUN*%3E5vHd~i2bc#pUXj`buqmJAMszg5 zzVdHQzr#L4$1w_v^%AN5Kl%5bGaY-&*>@6|CK1>;#HjGFqH6BkQx?pA_#$H;@5jm) z2!|w@)~^rm*nc_&%a9<|AXo?*jgHxpNB~ zt?edm)#1W`2NUH$|F)~~OBIDkqdD>2bA$Ufl~+8C5`ITq>bYk41pndND-+f-T%wTE zcDOw7N+mY56_aO%hnkYV&>|2H22DSzocqBSMQFgp#abnK1!hNI?zVKt$0_aK<1|Db zCv_F!7?5gmMVMzhDA@3ibsM(rRRwt(WXL2)wJ2m2s70TuBnwQ~x+gIFK^d@dbx5_@ zt-kmL5d9=gh;>2vP1{;pA0EE6qWLZPM9;)s1I;)n7az5DoSL%fJQ{OPj^AL|j#1+0 zkD{NwbAL-Ja)%J#y^|-ccK5G3ZMcQNq2J*Df)R3fN(K%UGI6|IKYmcn&xb`T#Fu70 z1$9fakeB(mn-n`O=nP>WTAn3n*?_QqFbK4FOwb%gi?h&jv;>fw@)I+c@JMW=wD);Id55wSp0P$E$#;1Q-I@jD`cJd6%HyoI5qs)%v zwv0awxw&+CfnMJJ9-DFzn2z&@A3Lu<9P!3pMt{>^^9#xGnR2tQUneA5CIzpq%J|j> zCM4#$e6Mq9;33g?%eb%le(cSW0IeEh`H#gJ%7z5%(QuM4uRO})_qwaf9>OOquHjwv z`~_RQu~JZXz-)lsxoct{Hy_#IcchC!#d-08dPB<(XlC~P7~U4q^e=3^8Dn-d_O0W$ z9JxxtaOx&KlVQl^L*l2qBBojGH-{+CN?Gsvf&Xu5AqAO@VaENcbFUR9tok_oNjzeB zpDKM7O6ZE9xE!s8K_S050~RGZOk}94t=+0#|10K8``JCSx zx=J@=vNEAVKxE@azU=e2cxU18!8e&di%01BXK$ae78(N8cpq~JX+HdS6hjc$O?Iwc zRt5s%W1tlyga=~`gP$X>eGExo7JZ4PLYm&yoHgL7lBjP}znz+nh{lWLvJ7wIykaSR zcMw~U^idbZKH#O0RKn{RU{&m^Kg;ERqcRNAo!zG?9sA?_<(5oz^!E&{67=#zh{S_Hybie2&D zKU4HnS|DysP_8lL=GH}`9^XnhM|LQn=pFtV<+s;g2H1h!B5Nag%||CSr2J-MN2UO{3vTu;KYkUpbwjY92XTU zyCmjG8K-ypn6>rZ;yoF2vkbN{+Kowx4h3s{HZ$Y-t)36EE(a-&I3w%-N~m!#0cF?h z*@%3>fQ5U=B(Rd-=AkXs22y}z(D3kQaTobJ-kXU50=Mb@I^weUm2NsTj;gPRLvEiw zR>y|TA$;i=B9qlwx3bZxsZ0=UDwWs*x70NlA(1^cl;brIB-)Y87JjV}5U83Sq(9Pc zsG|34ue3OXKFGHYux@jV+R4ZAo}2@^tUK!bec589rK+Bdc#j$6?`ZVCT$$>BI!E8zT4J{KW$?v-76|oDJ zCn}GFLN(eiBaf>D*LuAY2!+(&|7P`q?&Elo8zF1w|3Clj(Qi=XG!|w=Y(3L8rj*&U z5=(|btI%OcF0uyH`Rg$Gu^|ORS7+R9ss4jo4U@Tu+quPJF*nyr? zjRr$zB&YE|=qzlr=eQBdVF(M}+VQRkX<=DL4tHmjI{`*L2pGgjak+Jq?nMp^1lF3fFV5FL^R1nfN6lHGD_{tvBNLzje#av z6l)zHoX72w(3S||T+HrF>S|7C)7F({vR3TGeMbOEc8~w z;XGKC*_GuVo?=t3&BRN3%Zg=_j+siFJ5&4LSs54`Ul4~*6Z3n2PVW_Qoq3K*!RC6GU}$?~LgMd}K)1k3awabU+EyYAe38Y)>QBP1l*JF-`WJ3C~rvPa0?{9f{Y+ z_3)wdDfe|<@AqpyU(eU;{Wqu_U}sV3w*;uuDZSMSZw#CyX`Py=m0KRzS>#yHJ(WDG zPa=mh<8)}h@=+imv4Fg~r*Bb`W1!-Wv}mxuq+{W@z2)u>BYR97693S~rUBzfWZm_E zEv{!41_X-YYzn7C;T=9d6wwDpabV#Llhd%2cKxXKx;=K%`7w&tR6@5TgY&|5>@S)N z=lE8?8HlxiCxnNDGzb(e%D{B>?$3E$vz!HA$xS~w&3DEC>DhR}0+iqs8^P?9Ur5}O zlGktIzyyEmP(u?xdA-ta+;XX0gJKq_G6oVh0b>bKh73q%m6la6y~0Q22u->rYi(^v zSXRD zFe)^z*MQ?mjkzVuL<#1H>b6x%9$>7yt=PVh2a%!<*V|>~g8{P9{<5Bciz}*sB?74Q1GsD67Zi3&16Z|B@4TjXJiNyS z;_SLRP#4boVYK;`pNA@mel62|*2|M~;oM?L_KQWkhUt;Y36(Ej{@&KZvn}vG;xtc$ ziSVuW_+zoVxm+~RWN$|A+nbWJ?q)ve4vIZEX zN!}#+kzXx)xHK>o%77j0PfM#H%9C902JIb-AhFx zte?AMo)wB#o63`ryFwW|;sh_^`?%Vp^kVeOY47peQBHISHeZnsp|=i!(gkyGQyOn) zbw;alM9=Ee-GZjf2BX+98cvuI8at?2Hhr0)8IMGK`$ z-3Hdy$~N6jS zKbxR^LINGNK0D~LHn_AhD3)?ALT=h(y}EnFYdnAY3UVW=wP^6E@m0vYA;*+Q^=FBw zbVT8Y3=|;~|A;B>LZAo~K~y?TC!5y=Xs`k!4p#}xlSN*GRimt zrSv2~t%oDIxc;`wvA+;?aY6!>!Cuu60i30U%_|ae7qUT(7~~(>s67%Gn(OOdrMRq) z+Q0il>yBpafjy6A!Iu3!Ha50Ya$GcRWKwKx(q}fyWjV`!RK43?vo!H4UeR?V8Z zqse(Qm0%!7y@%*T>=oy`U5dKEtc`k^Iz}?s^*w#wZKI=ec70fE_4wPYtP~@7k(BpOri<9XOiV&kyS2Z9T z*p7F|v*>?&a;GYrto$|Ng{i89Y35NrCQ#=8MFT8$s?)Y|VK7&8I$0{VNcM!2)AJOC z4I_~&Od8FJtw^yxV)itDomd;6m?@ZWN{PlZ+J3n^>RqmJ>&_jyVChTRYg2(LB6Eey z;|)lu+&+A@5;Mi(*qIueLIqQ&QFRD$bHDm@x3?!St}hUl?u#vKaa!qROc{3K)XI+) zTb~wdek3{*LEa5-KZ2NC8u>#g>kqiOnRKJFcbAEcR%JqsTnw$pEzE%dEOkfGA!NSd zC)!ZFM={s2)vHYL9?ve|Jyaa0FsG)Lu1#PEOaEt6Z<($x&o&_F*|xW5>GkEHgx89! z0-`1LKmsY7z}~yX_*w7imBUsz)kq|{ON+HGg(GG~>&rzcK8}4yY3K446cp^sc*7!i z4QdkYzpXE6uS-G9?7;smN5&2!#u&!cA#vZ=1|p+s_7e`>3EInVwfzX`f?|m);x04d zOWz-fX*8ro$Xy<`yp{*8MAPxrHc6(Z`p@q?MFxQrFRwyQk;DA>?ZxUkT+^WWnz_|~ zvw!NoAK*;7N`F)E&+tc_Cm=WUZoUj}(2`uSm=Ay)OA#eR#*iT9><_MoE=uqhT=h|3 z%(tq7~>rgyzg?{>}yUiKdn9;;4ktI6b^9FvEj<&&&PaXOE&4xdUV^FVFC= zTjlmb-mK$QxHg+Is>kKf8c(pYu^BCKKVW$4R_mw1^`iCp^%1KSht7CH=baDa_A78e z(L8+IqCop}*t{_EBaACwcFeXl7g{%jcbm}_4DhAYp$Rk3z1K&J){IsmBC`%vxh<;Y z3F&C(IkUgxTK(%ShT~Ns6qARVQR{mk!;wdvXi=te2WJmy5DSJ- zmBk0NPs&e};-~PtsN`AWH26i*l7;hZxGv(K-Ggz^zfT7J4lKzANVv4l2NOvH4(A!C zzZi%n$!T{#6lF&5PP{(f`}y|c*}Z#27QWn1V3-H{w6 zqTn7zs!g3OH2IC6Avc1O0j`vH-SGl~f^q7m1xkUOn%8DqgvPVacdyN530!X+=qcTK zI5aekNdo#G^lf*!+QTvTXM}8&iBwdIC&Wr;ZbtT!ON`AuYHg2KNhaLjAb?o}7$Di= z`HdhB$EI1BPx<7Kf(a{)AA}3wApmcLtXK_>*FzrS#5O#{L6bqiDqh)M!bjsW+6iQj zu73!IM1n{6KR-@U2b}gTmd0)YL`L;KNPBEdj6vhx_a@n2w}*;4!FZq)P9ZS+DR5S} z%VIpCV4;+&3Dar44_Brm_Bvgja9Lkg5lPO;Q3IVJ+kQVJ)o}W|?pCkyFw@SXQqNEe zij3@UcS0rmeQUU0sF?G|L5u{2!5d8lp%u}9%*VY+FK}7DbK>_f*T24ggaS~%Eh1z) ze<9jD9C^fx+5~Q%2*n}c8yTcf~HwAf@N0jyCCm@ zJ$4*E!@CP`WS_cdqszfqy|MPVIF>&QH`M0@9 zap2y)DWhhf-R|W-Uliwh`w{rM#CKcv3a5_nF!+d@I!}j;=E8I>^Y&5$M zYi#|dk-pd}d5k$&2HHJ|$T2kRq6%x_fRhPJG~cydWgOa@0Nl(}4bGT%@7`6c+T{1r z=U;-Pus9c(v>mF_*!E7joAndQFqzH^@!RzpFxRQd2m$KAmm^RFJeD4Y zd6JN!yy=@5u|LOMRxma(;tyE4*5l**Nk#b-UbY4d?C9Q}f|6&~viJY{mNTIfjxo`_ zT61p#8|~ajKSi7$85?UH8X5x8MKDH1zq$WOf#Pa`ZjA;rmBQGqa@tTeRVf%-7hZA! zw6Zx)j+4c&nuRZm!XxJ-gN4~7z>MS(tzj{I0zcTR7pTIOCO4S`1s66X3M-p{$ z%6&4*wkn8hID;64bY*5H+~c_mTNQSH>eT*wUGWI5H4DX}Fag`2Eqy>{z@zkpFP@LZ zf$BRsDvWXA zDVgiWP4;xIvxn&Hrlz|wM&Y;1fRwTcC{elRO!?MCE3q7e+I$V(?sIE>4ux0FUx<|X zHbpO7_!(hFnt0=FK^^K($FPw{tVYT9Y7lWTIJC6DY z%MUUMeNgo3wx!+kXf%H-(c&Fn?S91j;SDeU)kDTot&YlAhs7HTR4X4}HI^irgmdB+ z;!OJh=F4sV71VcC66}BT#Gp2}4&meO56I&Dp(XNoQ$SWy5>U+^b7?XPv!K>gyPJP* zq&sD?(o!x(VA-v-HV1Y(d%%yyzJurdE9RkTnInKG1-p!tJ8XNs3{6e7`7EbQ*XK+_ zGHyCZ9i!l*Z*FZ>>pp@z1-)G(JQ$}pl?h<1D1fv$2HXRGQtwEW0*s&7vHaBpLUg{x zh3g2RgUgs6y14rRE`D~O2ag}0UC4f+Q8SaD`v!=p_Vy5pm^}y9MyKn8@6jX zht%RK9s?lGq>w-W?31`Xz+Qj;Vj#AxCPP?#&$V*S>5;~Vr$@yh4O<;z^^rJ6@jNU{ zSzWz-z_TqHOEJ7h$HtPTDRd0dk$M!2m~GI+4qt(J7SJgXa8}x!$Sk*V{+drz?!=p? z?PsGJ3rxr}Hi9Z#q6EwvadvcMr9mj=69SanWoi?+Dt*N$;YP@epz)*rUdv-~&(+v^52GDKCSYi;*rt0iM^$Xj45=D+G#v0M{Uj1AL>lL~JqP z))z#$Fd}O;=gVsOH2=`-Txh)o>FEV11UO=g?ihy!8K?VFX+c51o6Voew(M?i(zj=@ z&L+`F){kxA0Q`2?%yQyN;ED$j)rK#YiKTab+3HL2T^Ut{BuL()dkwvMzO;!#irZ}2 z5o*(=Hpo<5!w(8EFpu&2?(>DPSFs9)Bt9uQmR>F?tY3KA6ma{N_Kaq)k_WE<@`92P zREVb>R(}Mj%}M#$v2gy|6y6;k{e6Mv^DusqltK=vwVR4}f$7Q65c#G4wzfeGB9EN= zg5~Nx68BEhZ<#llB2IrJJvJ|RsI%k%MyZGl6vNCRFh)&^qflKL&c3#`J3A9j`W<1{ zUX+v}6fRbqCQl#M8N`;pU|^oMhB&@MjtOg^gX(T2O#Y~}G-*Rs#=|#(+pP}y<NHs6=a+IYO=QFAD%&8(z_Yy&VTZm7cdP!+bOTnJ1CV2B z?ZERa?q%>lPIF3RZ#E~%Jgx1z8XVnjq5!naPf&_NBg0Y29^Y+TA8tPM|@_8o&Psd+u#JSTs|?9m?j`jnN56yx`Q=@=ZQJCr{@PmkIz(mzmE zUIZVf;$Dhv3UEn{%&*s@7wfw%4^*-Yz7Z{LyIWp}$c6E0R3p#+`BDJFo@fJjj8iXq zKKsM&#Op|-Dx;&u6;V`H1G)fsJ(hhw?E6N|B6%jWe-{y%%6toL>z^+orx6Ar(|S!e zZw7|cSM`kk==&zoUlX90MpuSlWoh}@uKX=b!ASx6TD5rD1|^XbPJj<34Y!CbMT$Y` z+)8WfH))L8nzFn~avs6AUw`wry8iXvh9~FH#)yr+0F5jPL#-qitCfsbi~(W>HM~Vr zQUhtG*Hq7|sonz+Cq|9d!&EN2+5Slwox!%xgLR)zP8}9KY81j)xyg{()DIg3f~XBA z@^CYU2WQLx)w9$mQh}U}mKsJzMxlX;6LvRi4hvSuT0e_}w($}0-^>CE(A%M>0Bse}PgD_L4vb`j@_ML)sFdnHo0u@_I-Wu>vL_{< zsn>yV?3Nx3krTLXw{!z00uQ9I`3`fNHzF+v_4^&z85FkT6oy}OY|}fleVi|UbJ0Y{ z0)-z+pAYM{zBN(-gR6d;?im#Aax|PPdUsYNc22BzO|S+_H(7oY7oFO_xVmvwBr zthHp+d4u5>eYfi10F+0MKg2^&g(mzE3BW-3Rz5~&hUZBFB>GMkOn8`bSezhr|7C__ z5(OLJs4KlVxl3>{AB9nTe60ICasq9o-}Ser1tD&C*bd`EL@kkc7KQ3~f=E9$u8=1v zU(t1TE{yJd|MgC2pzy4PcA?`Ut54i)?QhK}b{b6&Uo{4O?_=VsOVFB)N3W3l?&&*n z2OwR8?I~3bX$+A%_L(AyRpTkVroI z_NJ!jqP5YY4%kz`EGEHNH!kGq8DP!oPc>XvFUi7~Iouo)bNv#Ub@hCw1hu zcP~p|Wn=!k!RhkBgtbp8axAfmY>g{4GBPq~#(+zBsqWQM-ARe=!5BZWfY3A}XYWR= zf8<+yY}KU|-nU&vwO$JbhVU<&r)&ND(=1KaUeH1t&q!52uVf9gmGyXHy~QnHG;xW) zUCql3MX2Vvrxj7`pQCQFjCAc4&k)F%FR$ItbSrJ<^Lp4=pGC<5&Cw#EQISCl?>o0k z#1v>J=gSHEIYqtin4vG#cY^Or1>e8*tKIK*?r-gd_XpWbUFP$;ovPOvwf`90c@TX) zrfMIiGh-6n_}Azco(}GeQIzNLyL#PG!wr;ca@V}Qu0~XP@bhqd!qj-@(e8H)i+GVK z#&1uH42G?3vJ#K4bV~UO?8|0j{y@BEXU+b%xnVv>sSh5UEfr_9nh;)!9nYI6jHh>` z``Sa7cF*F0QOt{@$t6bQ=owxd)!6t_zJopf?Es6Co}L~B=hep+4?NIU$&*lXZ&mUi z&%N;r@SEs&_<96&le)DDg1XxVcd8tHaTKR>0^DFRo8hX?ryFtu?p!R%dM6lFCvE^f zn_^dOWVnU{ymdW0H!p8AKc2^F;RB=AY!FnrC*lvDMnI*}+WG`<*yQelrN)$G`*uJ) zESwfAwUg}z5%3!i(8kDZ7pTcaS`5}S&a8=uh%9+^FL=dg$w*5NHH5EOR?~KUe<(2Y z{p$xM)8$7l3p+yLXp-pp?gED_=kGc2_bM3tu>3QgoI02)%HIGYJ^ot)TW zxvZhH=lWdtTDy{ILVx&uz17uKR7H@V%>{UV-5#J{Wp zooqaQU)f^5(}tbeL#beFI($7JRi*6Lx9r$6G-m4J(AW;F3sgdUH9($X-cxTNTz~b-=d9JSL!Z~mBgZO8 z3}e1{2xYF3oj7wnTrQSI9==j3{h8+d^u6h#0@q9r4eo57eQ`8ws1r^=hGI~B7ys$g zvB8I3LS|27b-Y5(RmrrM?rUz7U{4$rNVq-$s`5TQYZbuYD(obkTT|A+?&xaKI` zky|n@;Tv+GY}{Z?NqM!T{)*uxF_dtER56(Q@AGAApCU=(Ea-Lg~_ZTSq#XB@!gA)ox4U@jJ$VMP$uaz?MbKeP}|8l^fg5|5g=0IBYEcE87zck+8Z)pT<-;-=+^jz z1?nsA`j|nf-WM?cd?HIKFJ6~4uBuph&|i`*s$oPr+$xeMJ&;O^jPPIp(u@S5iLL@v zQiY;^S?|(_tV_It9x2UfEl)rAGk=s!a{G5vzAne@wyUN8t^PCrk ztNT9oPO|LVsaTMt!O0$8+noPyV!m?uf$7QG!D%BhnYAc+gMR*WTQ&PRu`l-1;@R+JJte5SL52SRc3W>1YW72sPna+2{lWvX z-d=NgiT*M~3s9s9|0n(7VE2>6Xy!!+`#zu9>}Ckh=SwI@M2>aCdvuGAeDXgOAxKuYD-RJPhVMH_QN70`-2n$&zMq*_EaJ zKRlFBKV914f4vs=a_Hj>ODsyR6%~0~l#tczPqq&``aC2g<;=6)TU}>SbunRKxoF*C zbtz?iDW0(Um2vHQqlbGnVvvQ3xva7J+yWKruM8BpRo66i+-2%GLf7RQ((ax;tG&L| zJp1ZkL2O~<;i?1L-z4&B{&wn|PI9Hc>zxN+}2;0QR!+wQ{xj zHRzP3o1DOZqE&=m2Y}lPe^gYB!cYgF>)3$1_IKx=z0$t}NfNO&*|*=vT3X*d?HXUBc4w3zQB#V%UU{u zOHCI^vtPK;B#-a7`BvBl8G`{lpiiCfO1%60cv1c0V)+c$3GE3m`Yqb z3r_-9F@G^#;yl23*vvqg(E zgFTDhst04dR0wDaNIPtWM^tI9X$#q$zyx%j#Q&&g29iipEy2)D1!%Ycv|oEmKs`$; zmYe5D40K4RB_}?k7C3wWIWqQrK1$G54<~sNI}|pa_~qB{2ZAA61F#hUjBnqJQQ9L4 z?AdVb*=%6tE%~&bW3c`58`Nz~{d!M>1+MdPR-Es!kPTJ&4eO6CxK&H+D{rO`fF5`j zXjS=T5(4*h_v1?q)W!*$fF{aa;*>K@)Mg}RLT19$N#!b;5nf* zbhe_KUWuF92G27YVC!kR?u~-{ya~Xna9cUD!KKFa!i-YrO!g}C^kU7T^eOjYQmncG#dM*G!ads@psI$D z{BaW~D-PTJ^1!Jlpmo4i3H$(59-?DnMul#K)~b(&;)@5BYgY-4KM~@r0yb9A4foy>|e+0%qWGS@zGY=kDvNrUPyKV5B>{&o&$V(n5 z1E***sPkRt$}=6}L!9*m>X2scYk=)RSIzPGisNOScdAMrD6$}MPg%<2URso#G)MGV z;X=zi@&6SWopywUCEPSM4MfTD%I70@JtMkl)JCUaKucDQ)ZuPa;2cGA?O!`+bY=|& ze4-2Q_BPp3x#~gnq%3UNW^K`??<3FL%7!MM`u0#4$ab`zh_nvv<5Q{(4ZH~Q5q1OQ z1rmn55n!6dh7$z^#c_d`v)={r%;%yxkXlZ51!R^sVn=9tyXMBa#T^g3nr)u`1Z$VAN!!njjZunhv;KroAsZ7vYNZ4|mIgR#dyvU%EDtEZTB{=}?2zSIuC#Z}@jC%} zoHW6LBerRKiL76FQVu;9gWK`fI&Vs&83*3OyR9k)zcQitC^f)Nn4wgcr-2uU2FgfA z6f3++k5Ry}g{FzGfQfD^4Ho^^CXJWCm5c-ugvwSt1&mw-CFC`D4K2qdxlAu1bV<9m+Dc(mA(&DIMl2JCI5w9pV47imnCM7Yi1aF-5%Fpg{Up| zz@LrJ$;o-{4QwIp6j`Scg(+KME3NH1!KBX7Oivh*CCLG0Pj>=`_WR$Qvq=WR_GJI! zVian0(9bt7`my63cRne!DD($ca@56T2-AfGnk+jYANsIeuV>OW zH1Jf|*RR(L5dLB8)s0&lQ7O6>zT7d`H)}tdzZ^h+q|)mr&&JIphG9wv7X6dcMb{q-YS zHmH5zySgh<_0QtKv|d=SZFB-+!5iq50G9w-laq#+fBnWyGx5-Z&mvyRlK@jaQ%mXgMA!cTXp6$m~+=f*;5$nJ1{$9}q ze}X5N2aG3Sp}@boKoCnF&Tco!O9FHHAq`J}nGFS(4{~WG4lii0^=mhYtu~0oMMXu` zRN^!$zkGZ-yh|2nUY5P%wCvCy1%n1gE5=}+BB>`7&ZO!&?G2sQECT$Ql%9uFoEPVU zdC~Y*T}``l5$yMnj|lo*gvai~k$=Spxc1#hX6rn(W?m`XKk19=<>HWRHZybh7Osw& zLeMal)vYziGys^!IWGG;56iWc#pm8dW0~zUz~ejr^-eZ=NDq>VhbaP`-)VKC;dZFd z(T}7hH1?ObzOpz8Y@|c#xmvmY>1wF{I;imFAuUEuxi^`ePfw3V`=9%;p~e+VR47KZ*@^pfnihGC|w6a0kC|mI;W$!oFo<zhzePyp*Ee26r_DA5p`AABGHDGaQDH=5csSeq9Sly-rM z#*Y!W&%yprE+S6)0kWhE_?|Qv1STupb>}1LSOnsm!S^rY6n2fGzIC8p2545u6BaN4KfUNk238x`^G&FR1+g?VWfp82+yf8h zI*JT;(-+A3ukpe3n)PLu^@-f=aQ3ul5+dLvFxY@i9|?3>3>?k;@LG{As@=3mv$waG zj~=lo5o)$PKanzh5+_?q8rs0OQOzR0eQFdO2QgLtdJ3=d2oI|lf=u_89Z)Oe+14{| z#mx{Xb~vEFS8CwLVxd2{jy;<2-r~v!mO|_0{T+J^b#;4KeU^d88Ts_-ev#fowXv1n zK);A&3#Iy$s~7iZm0{0Qi1Uxio^PIc0UX?&QO3%PCAL;T`LITltH3TVQvu^mfbxJ3y=84Z2a8xHP#BToJey!&%C40bQM(Q)5;y~s#@?=(Xo1^#k1Ifd zFg0J8MB5CMY1C{4UK4EfOKMDWHL`xpG05Bs2RK2IHhvjSe{yS`GZB4W~A=ydqd zp{pt?%@2hqK7IP9Ytq{$(f$Q!6r#e84%J1{PUTlZ$BFZKRGbI$3Si1jtMlDO5w-B> zNe2stF534!6*oLnn2;ca8af)=+w&rXtmBOeP7j>lndk;bN7QDG^N8RzMXd&79#;_M zQRf4MYQHo!VLd1Z_T<$CWz%}>D$^Zbg~Jbaxoyl%Cy6mXIW}E-VfHqhGJ*tT1oZ(e zP7j7pWls;*jy9$^zlB=LMC{wQR+_boU+(W6flfDB8NynV>1xwM!VT%?p`ndZT2sEy z@h3sWn$PbQxgfp$=AT5%*}h5h6V>44Y3FadAa$1dAtAu4Mkx`t>JCB-fi|@a&J90j z*kVs*mpyn{m?l8#{;=Rq4~5o=ppRhurmn8KMTu3K>QM)RyALaAq#nv1jmrr|Sf z=NuRuoP85mAdTVWX9^=D;n`;X*~2KRF{p<#gyFK-1T?E(?Z6!>m~Si^EHBEVOa*%!o{T# z?*dK-k(Qo`PP)quK|EnsUHi0Je>TQtDQ3x|XyFe*Z-s{CmD=@1vBtW(tJ4;z-jtSJ zEPxKf&wHJ}-+%7ioo?WR_FxF42ZhEbFsr(GVjj+#1xBX5c%ea7miPc~?#@Hyi_PMJ zC@v{UDk6wsTOf%<#sIA!{}KTlP6ZLin#c=zsa$d-}^WDucuCZuRFgpaX%XssLUGny=AB)SHDKlbp6 zYDIq=$r<5xwv3a4sI==3N%SVP$K(kBJvt>D!bU>;zy08E#Z3zTzx$6!L4Y9|)e09P zUZbBs2Y2ew=jP_l&5)?<;(N#y||HEcWx|)2L7HgMFhm8?moV0MN)mX@Bg`F5eRE(E@`|BHk;K6vI3+Hmu9zf`Bj=|^9 zS`b(?_!1Q9UL{xqThFWlO*B!7IE{dKU--Toi6w0xkiye-(}J|-bDJR=Hm`yF(M0%Rm)G-9UiO#>NVPS5M~L)|&=AjX$aV#3-Jk zVG6&dueie~zHK>+n5?rOkNOO0PS^*otxc>Kn$)HnHFK^Ghp)wT%_iGSwqN}1)N5>F z*NDl_7_oReY6-L$?2xOH=VlJP%mU@5BfFybb&Yrb%P`0FFau2jOFt-sqt8)+i44iGf7r4qKedfg!HeD1I2 ztSJ`eV$pi3<@O=O+mk)~@<%mQ=(0@aDAI<}`ed9t@VaKGn@^Vq=7_t0Bqi6RCvhc5 z!SqNUw05PTkaYBs*h&Nd2(u_2Y-ng`o>hIcm$3;-ncE9`=_fwj-LiwyJy#8`G? zMO<&Aaekj$Q9}gkv{nF$0jlheAo{}WP^8ZY1OXK{PC{2Td`&?_`RD@(M_|unwl|&N zs~FH@`$-S&L{$#`C7&Y_x$A4oR_m+trft&&-`%)?Nft8ah-<1Pg@z&ezXa4mz6zWP zw&O3Rb_r1WsXrm~9q5Je=<+$nC{?na(0WqFu?<#nehC`u-~b}h!6X}xjuS%DIa-cE zbq1l+vyg*#&rsrGLx^kC`O`zDCIxV6Tb~EMV+GcL@>?)q=jd3G>5&SUu|Fg@bP2Bu z^k7d~@5#)!V6K0_jvMz%CJw2geZTP{CcnIh`ZXBdbY1t{B2q^l7|cSW;%qDpVH83r z(JruWqWz;LmyORQ{cL)GWkLKUn5viU{xP`}M_&7%{Q8aV5q4WWZv92;T3Daw|Koi~ z1HDpBNK^T^H?O`93QQ3v1>!dAFyJB4dVuf{+c^H5g$dy2?05k?6-X#n2!urx~me<$+aeQ`R~K)4~|qadlzk_m)<4j7HAqN4og%d@hzlHAM;(CQU=mV+51(~@?3x|stf&NY%;(Of-xLSF2~F-ax+K6BkKq=YeSbU z;wElbAOy#+&Brq9xgQ$rEx>-{{eBTrYz}+^Vy`}NrL)i91>GbH)qXElY zcI8qF_XOm2kXXpT`R*h3P@sdpVBxr9Vd3Pt%e)9%;fyJ$9U7SmAlLcw-X<>&H~on` zfoIRfpsr7;KSBsNbpe>>{R9Gd$zEWsveGI1;B{VpO#yF&hx!M#A9O5Z#He4_4i`oo zs+JhsdwOZ2c6B1!;Ic22dmlc0$Tp9BGdpT1=>unkoGa0whTTK9Y%b9pN^*F2*!l3w zvHx6=f(f%=%i7zC-WrR>5jm~_7q0!QA%;^Zh(kH~(mAB+?tF$xZ1t~9uSV#`nv20% z?s0MD2v&rVRbEh0cwLX4h%D#DwKuH+%W;CcH4;e-?0ds01obmc)41oa!46;&x=;?-5V12mxTQyRhFOj z>T$f#v$q?QMefqSglU;#qRA_&y3qYg>BA}`3wb?~%u~?e>JFUDtK1;^u)ygG|FyvU zDEJ{=O>wCAk(|Q+)+r#>J`Z!fT>>`ma(Dq`kpQuL{iarKhPtgy9hSlCL!|_hdk*Fe zF7&_F@#Wtev!cKxgpx*a311Cn+n88)_eAVzzPFT5?9QFm|CLS3;fA;GxG4>@1!R5D zF&F>xl{lS0P~b$oink*M_SV0H*@zFlU0F**(b@6U83eza;>DvfiSU$oBv2W~nHUuA z3}^lyOOeS9Py*>Pb|q1xWfd>^e%=@!!d=B0pm;iDalLhUekgl1g%k=XDGcDb3f^ z+IW}qik3yxrv%!b4UAoM<53`Zm(Fb2d*PTw+kSPxVvkoHEVCphzc_z)OC8@SN~mg5 zv?eEK^#0tLR0&q%(H5@EfWo*RAk+KnFWozRa&7xn#d%|737_lm0i`ewtnBmTfv3_k zQS>QMC)+avB=Pzl_}szFM-TsMZVt2tKkN zRw|`u|L{?yK)9^Xb{S=17tv^MMlLD>T>^&>tEU%y^xHSBLmhbnxqCSLOD!2s@6$Yg zzRv93wx{L#4Oeyoh1(g<`NPTetU=WLvSf8XPF;do!uQzNKHOP{${Qy=!lqB4Zokjg zbKW1!dcM5Nz`q{xrA=00N&lP4?VPmO_p@=Q^b5HMZb~xJK@d;J|dhTNV<&7p_}oDAHKK z{}kA~1*sJXvKLPB1z49nt1xa?W_uzi$L0~t<=t8&X71#4i?AW9kOT24kR(?I`0^CT zGjB#zefb!Xag-b4FAeF?(^ui+tU02+89d7I;`ou4Nfz%POO?fy`*4nnvTQf`#b(&y zGy~ZiZ(1`B{JyalxU-d{BW+!oN9k+CWknees3$5$8`z$}!a*Qhl&Y znw~v?Ak82`&AV6lAM5;Qm1AA>nmZ)*c&JKw4r~Ax zaMZ8-br9MZn8JGOigDVx;CD~Y-x6=}_dVwRez+k$ipRo@C(5S*EsRJgwlLkI>NLC= zax@lS&RULjGv;XK)qC&2oei1dJq8OyF^|NDY1{|bVo1E3%#|x;kQmG@5>&LEtc=?; zPn2Fj|D@o<;!yb@Uf09F0`^1PR5aY$lROD6AHA5C8lA;ARcU$=>e9){jNZ4(oCiaf z=bk-*Lr3xYmH0E9*~MHY@G83hBU@hR;B~leK7IG}>FKnKWP01h_e9ZOKYy9bElAYL zu#j7Sq$Mp#*#1U#@*8kAYwr>rjx&to;CDjj}$fBB3hQtE~V1valkho2-zY^k%- zxmhU8oMmCqHu>`gIt?2Vbpp!!6vz4PND}q>)oGsn3dgUMe6EY+v4TZm5IGD6gYY>G zf0d3=R!GaJ-@Goz)YNh>Jxf3-ohpmZa7+5}lflw$yMEdWol1F7{TH5WQP z9UhSs+LQ^(-QQUAG;GZ!{vfS+H4-AcPboZk)SDnYL3irraPN#eSR~mP`n0H%A|iEs z8DhDQ_V`!m4piVD&WW20)@(L&IQG{hKYA^Zq`<~+cPOxKUHVz)P);iBM^0|(Oecwj-X{W4xNo2&|c7A~fgqhUGLuA)Sv&^F#O zUGnk9$y>*fZ6#f8{y#o$L;3Cpl9aF8KgTyXI7rm)B(o1gD3?btyLYhNP(<{L$WSZc zNp~teo~W^ip|&iplcAxTEg_Dd=s9lE)6-ABKUkRB1B9ZpLbS*$(dNtP-|74Gr0lo^ zh1-M^7igSE`J4AaaUco+-yV&QQTNXfx#3_RPlg}JoEJACc%$7fj_xzK43CVA2o5LN z!T4Kh;|2s`kDfAT4h z6qnND(JSRCB`|7tzZ^}9JeoTXZ{opt4AlkMEqn!=q(L|ko=r4^KeouM{5*%AujUb~_-IL9Xp6(wWHF&4}6@0t>ui#+!pkN6hNhv)Che|U1 zL;b8ruZ-5^`mAT7H;DlxhmQ{2+y)N%tft8&_?(xEHC<+>uh0nxS$ifWz?*RvX20Rq zzsZujm+o=L7oF;&y+2j|CjaJlYiq5ll6L(1hjx(5%Dsd6f1WvWMqV03{^r3DE( zogs^ij9R}^>%`$QZYeDWYHZdnN!WIE;Q?4zf1f!G8NK{ z{VCP6XK~s?Qb&Kpzl5?jOh(9By>h%|zvhlTRn&xUKI1uKtIJ2*+e0>+0atPv(u1g< z^F4M|*da4<=fF(QSX~|Qf$-BzJmrhix5T@H&Im=0_IOBL8} z2mUW(g$wZ|sV)DD*Q%a93k$wX+)=NB-uMR9)vpDGT@hM}Zh&~J&I%kdNMb-49We&W zu`#`IW`*WwT!GUmSd;;`37338Rn>*-#)+@C>PNq#(YG{{sA^HYkQQV;bK+1JnzV~Hf%W!GrdD>Bv8#VC?KcA&xicz z!L@lY&*X@Rjh8}7y>Xp7OIj$8V-ghQITlw>JLM|k6qJ7FRoSDUN$Dpo{hB_M*{+^Z zyE-?F$Nymmt<>An%UeBofxB~^+4))h87MQhFI>$??Ip;8GKB_ zH{(1GH+I6WoWs5*YhMODxURXm`I?!HjZJlm8W;`n@|l@>Cho|{tFg8w)((!s??qZ4 z26Vn1_Q!kaBup|~c}aD6x!MZ- zf37F~0yh;F`uP3Oup33t$k^ihAUEHjzLmv{$n6`9{9|7a+pN&R0qD?MV zM!MumZfb6RatyqLy0Y)Fr!Rz5*j!n;9tN{}#Bq8CcXD1q>d;uxuV1ONL>*W>v)7-h z#Q*jL?6U^vSRbwY#2r!lsl}k1W*afb2@yzritVTWZC@qP>%q1ED%&Gg(KTDWT~*%* z!HZ*Q7nyk68Iy0TLe9`?9<=7>v+DGemgcc{j&IP^`=GmbKZ5N;mT5@6;>*X&FK(J) zA=9&(P2o!M(p6%V86vl#U*a&gky=uRx*T9HUXMDpsv=gr`x&c$>(Y2FYn?80}j`+}{v9@cD zdXtr}z^<~qU`V1-a9o+pz^7kpHSSwlqJE-XA*pM=x?0Dhy;C8xD23}J{o2SgNm3y7 zsvHYK>OyJ-tgdYO@cMpD#A<_yw2*90ekHGZ$ek?t-6K%Q+cT+TPj~h9W|7gFiO1N*T5QP+IRU$3j*# z*mL9hBuW&L)VO23yjN)$wcl*jAD9_t@$^<2XQcOHp>FW5Vbinurpof*5DVAc;qVil zhg37f@@}iQrCnDdJ~Srse0rPG1YDa3(T}w$gOBC~D|xygnu6HehK6w64US`Z zcqmDYLgBR28Hki`5%k}h=R`^AEG-{x7L&^~wRUJu{@7=J>-eKg0Tli>sj~2%HjkCK zwXp#3^QHh9fYdFY%yTp}tXuV{e13CnlJq?W7FR2Mt9~I%^d;~#g2BjiH8k?6@8Ol3 zOEWc-kZxW3=1u>!{6@X^o{$Z#RMp$iN|`Ib8vCU6uP6$a`CJ;}+qNS(*E!`;nU{rb zaA!JST^=$#Ug}w~|C$iJTSFuduRVk`QE5E9e%M_b4$wDl!5NWT)S>1C)-e@jK5`xn zaG#95zdH1tu1S|r>_giI6jR5Z1K|*g!{EI8YbSTOK0M}jjKy- zlw_c>0dEQl(o4Bl^_X~8r!R8T_t#dh1$GvSjJ4n@M@V>t)rQs7j!}f$4*!qoC*m=> z622uf$A?7TRk_$(O7zfe|e?)nT)40MO-dk6+dQrJAy zp*|YX1iY3!T9TBP29z-j!alO8XmOJ4jQuVgi za?zcTLrV(%epdZ5=(9nsGG);zc?v)2E7A0!N)?t?N>s(4x!lXgI}Ty)4oBN%K7Vuk z>c*$R&rE9Mh!Q19${@$45V3*H;ZAAFb6kSJI&ncSLtjGrD>9p2WmUs<@Z%!FJ>VWQ zGZ&JJxXvu?F!V1`1X!iY#K7L({{!yzjW~yl+qF)~4wOId=6V8?mIMrEq^wY+p%e7C z-s+kQ3jD-8C^+X_P`{)uIKU^Rpa+tzp+c3CI!mwcFTp;opY7YeG{|U>m)GD;UQE`Q zD?aM-!SuENMri_W;+la>r%ofu^*)dfe*Aa{a|xnjG{w{kK-JOsT|s#}uQoOB8UA(0 z&6*5;9h3qhk~3^!w2w8wTAx{=+E=WM0Fc`%8v9}7R{!J2wl{0TPTwh|VvX5kv2_aU z1R&2g!uEu+;=%>c8WeHUszUH1EnW4j*ppM6f;U$V_63W4M!tD!xM*9>%!?I*2bmkf~>fz-+y7*pO^ujf~YiriCeGTjfo5oD~gsd zczj%be-)DFWj2Uh0!yl%eVCcM#Ow!|0WPF!ZcuCg-ig)&5*LKu7|6DnZQKfeUcQSQ zT$3>drB0HdRNS>=tdy^~MYXQ3$ZKuqRY(ATcj}egWuY?({$pdBueL^WnQz%rcQx`D zbDon!TiS0rT~4+6r%)*P<9dxHJVs5Vj5zb=hCjJQz#aZaTIK{L(o@BNlB(Oap5B+t z9EJaqs7F3}d5M}#$M9LnjJS!;br*3L7vxaA$#F(gAHzg2pnu~Ye_jkeHko`Hr(+i^ ztzTzR==QRW`%1gvkV5Z4nEQKogTyt@fo2&mb+>!p2M+hkIErL zJ>;UcDI&!gpX~auE90Da8{D%+7=FBCi?GRBLIuFJik*@#9H1($aA2-O4YC8Od-1k3!6`XxlmC zwlpocq{7?OwuB5nIK6QM$3YyB4p zxq*kymB4`a9F%2MFGT6x>e3d?NlCsWAeiyGK@}((^oHOH3uW~iyf;B@aDzB(4=ZQ( z3`QOg_i>kzXKUC1Tln3G2o?D4hCfQV``dXVqgH>(@WoMfzXioHPlt!yiJQ4uOk3oz z^^nJ;pNMx$3Y}Az)YpH-&7YaQRo`TJ2BkSaQ~bf2HxMQK9@PK;82iqEsIIQvQKNaI zlEi{YPiWGS-oYpx6zLt5j-Uu5y(R{wI3QiRR2iythH8`|UFy(LMnJj)(qXvk44P=( z@4NS&9}&XLIs5Fr_Ot3<54iY{z5I5){CSY5E{doBOHkhZALz8jP4@LU9BQ8}WC!(z`s>U{el3|9Zfu%F9H1ey^2|VX2dB4Vd zan)!`zqmeqohjs~R}F0VU9?5W`UNd5td;d`fw8d@M-khI{z#dM`7x%E5!wR-=Bq)Y zF0~@l`<$1IgvWRgBgd32Zk=UEt#1Y?ir~pu z1r-RPR6L`nghf%hUpOwiC;m~^04K;`7WON+# z+xy;rNj2*k5*&zr(e9X1uq!6R@UE-tLGjcdVlrV6Fo8t3p3dQ3D*7XBQ4I^^xY)mD zIwA1uFn!0p-L>y6CO^I_wRj$6DIu8~d^4v)m9eeOyjaprfi2-G7y(~h&l|~!W)KDc zs?kSp)NGc;=q~)opeA|jHYbF%E+0}uKrsf zcdzW4pEedtx@yDJoNELv5jnpcworZ>5p92pe0}aFIDI$GXy)9)3gy{aNcjHokAJ6K z$r+RGP9$Xz5LycB^Lz~fs~-XcXcfU|ud5qoy?EpZ;w_E7xO6W{77rd6kWI$1wS)ctL#DudVY)^6$t=X8WfHw;bhy{d z@g~i!wo4w=YO@xK9{g%Ut`M{%$0`2x zJu*-}4*qP)rE0S=F%?ToQ#SH}v?FmDjdgG99oMOgUmkSuuQn3hxpa#x?`+&rEla~X z1~9-}maO87Y$M>VIDGqgkwb`WpYcVXm)c|1M5?cE3z!}5)q^0hK5Pwmt$Ujy|AbMI z8~ERIf5rvS2#wl;&fL~yUu~G!T7)F!41m&SxjFakgM`!&V8VXU#~kEDT=QGUU4)9ue{JiUJFhifSeBvOcU>r|+<31~=XcM%AH6s+cBX4|gsO|) z^YZS36;%V6nLm#_%@IXMj^9uMCB@}dvksytohlJ z&o5cl!B=G!^%O;Xrwyo@=94RAlYN~0IyQ!W6C?*`KBLIj zrv}GHDC>86)kE}*>nf&qmTn0DgE^PVK5tW}&AY18%bybi4k~c89BIF-Ed@r^VDML- zfXMxa&0Wn#j&-7UBvBB<{&4cbII+uVHE9B>GT8pVho+z?b5W>{Rm}HY4Y~U(>+bK{Er&I9r``!h66fk`Ot2?Wx5)<5 z?R;{GbvJ&791vz}{{|d{@I=L~CY|MKW`zq`y`jZy>1TS0RU2ccE-)l1NghWTC6Zra z95DUNv{>JtEdNXZczl9B%fyz-IUlzMW*fHN(4MnDrNlkL*Db3OYnw%z=MUYmK#Ef? zjU1Rd^>YNT2M^QTD84GUg4=aKs;_1$%WIO<+?h$AiCywrFh+idJyx2IdM41ltE;6D|T|!QwZZL>Az}l0-D56w9;88uAkJm!#0US6mVW2eF)UNQBvz z4@{`-?QPEgGISOf-Vs-wI(W=fB^6ZnNIV;jtM!g<3qxf*i*T-h|L=5R{=iQ^`JDKT z=5xlrGR=Y)_s$bpt$(gJ3Sc#w)xT?V0%3&-a^~|LK1$Rp^b3tpk9m(+JC?nO364RO zMc47xn-JxSZu#f?Fvkfv*qcUaYHUp8_iJ93h(q4*Jn|q1c92c3^Iq8j%3puSKUzXm zC(zzeI>Pml%UZcQeGpnJpwt5OJb4lnYkGw+C=0tJMQNj=*w1&`Uo&cOGYE# z{V;^xd_VTAC-l&Zb7_c|Nnr!K^LPG-1HS^iU-E)#KVXNN*;j=m4Uz-K-u;~01Q*d( z6ylK-6_7Jl;JmZh!@psL%1a=x$_tgx76ued*e?NwK%T-kNegyq29hg-6Sh_VDk+=& z=Du!YvNRh>G{}wXJe{SMNK5)sJCh_tT8UTmv%q|7i9+7sMm9L(R^V*rD_S#8v^n!ve z7+ri5)HtG^pF*IyH}rANPh-Bupz7x@Bl`aDOkFl-^w9d~i~^LsX>uMs+HkQ5K(D1* zy|JF&i~Rg%#w307_v>5vMGqOm0s{*Z&tufbeQuGq_Nu+e&&6F)4@{|DNOQmJsK=EK zdsZkK@q}-rdn_zyd(S0*-xC_1qdt!2BrT`-8lJ3NKK!(i>;T*(d*C^j<4B^r3MzI7 z1F(%|QJ(DFQ6v;P$}*%>ZT$Wuonj#U#TK%%`Ui2gJYQ?L??_jO(A}AEyY(OEmg^kFrT61Srx>A zi7_+{+`{Z+}sD5Fc{xY7-ta@mbwclWMjC8o)6X)i>@AlC~TX(?ZsanIG-gMEEE zEIBE7V(Y^gan_6Rk*sH9W|0lPyp$QnWE6Pt0BT85dRTNNNd+UZ^$&87Qc^-qMkIPe z55Hg|N6smh>ugNpT|cAS0Q+a1+yU@I)==7&i?6Q`9h(_K>`m7{xo?$hkmHu8K^}t+ z)+c@ET4*MHYQFc{dwr?>onsKD`upDGvBSWhFEw>uZT7j)JUJd|LG0HeIIVn=Q&a0~ zI5LxRD&VyOZ?Mx&^>SeHQs|)Mn=`SdrCiCl3clo`3cl^~9lfit7V9gu%@+tfqGM+& z=sm<1*;Q%a#p-YUAmWIQ&oTQeKWOF@V!IP;_QufFTWA(KDUn&dwM$b6nh2usG~ zj=L$2?hitu=!^OlX4s#{CsV~PEGbJO9}6NIuEWsLxBfOs5VqkU&;_FkD+L0J5ZwuqLw!U+7o7e1uj#ZI*> zdMkNEy%}#M`(b|C8@?;GrYzZu2$jQOvZO=dN!AnXsB-S8()M%ZXOHs>N475~@X`wE zXsiqDRGNpbIHA#JV|ed#NH*X5Re5K{LE?fs-&$Dfp-X5eq$B#>Mcptc8&{e(`p+=* zHCFS6hM>uQ-i?%ca*7Yfn{^ptqVs<})zYW9f5ZR<_z z1*26-u=fVz>xggT+}F&;8Nep6Q#2?eC3jX5MM;sOR{;*}$yMJ2dPPs#WAoKwDT~^p zvD^mFH7y)mG*qYP0)hpew9ufnqy9P@{Eo-SsJWMKlrqJ4H7tYvzR0_;+q z1_3YF0kCFUi}N{17&PevdKtKD7=CL(}b6|fGM$nuW2tVNmWv% z*Le5OMW@wN#?Zg$q3#}lK;&n{+ZMV~^dw3}Cns2Mx=p+Fgb|c3$18I-X~)(^QB`So zY8V_7G_VMT$-B&7vll47BM{a=RW*_5`lx(mb!42@Zzl%-_YB_4poh`X2!rXmBq@Fl z#5SZbnINBE$LMi`<8he(O{?94p%-EZ#cJNmvfuKKZR+mkD_<=v{l%1RkC6zWe@CvitOSo%_<8Gm|!a z)$GY{M*4$a!(4FvKf#G4tPGprs*EqbrM&KY!;q0ssk7j1Y1izo)E+Do3R$Ky$`EDj z#mpR`%(UxP1(uoD*}2RN%pG*XLA3ji@n^D;FquD$>!Cmh55^l@`*GstZh z{U|BnnxsnGr`yYq{5BW&)jwOMs7thHFuXE&lp~&S=$^|~)1}N)qf+VWh^=TpYmoyL z;BhQ$xvi$>I{5Y87x%3Swxsq+{G z49L`$fXa_n)&{fE#kL|N8tj6E zWhrX>xF-u@-5Q3D)tV5iW%o+m8>hVXK0+?r7K=DzrhBm!%^w10U}(4AHg@0dIYSmjdE?Pc?NbHFIBBd9nqy%tge^ ziRT0xv*jK)$+C%%58y*v*aVMz9eUhmZO*=-v}>^>`;0y_-+NQmhtqfVnJ>$ix&KnN zY&ZoD32`7{83WP^hg>|!PQ-!d+_M7M2-U~`4`{SS&tx4Zn?(J7#y4sgmllKhjQ1=c zm=Fs-Ch92$wB(I+u5&gaS~)6OS=P6r^0cL7_0~0?@Hk_+&9DaB#n~s>g0OLy<$rJc zqz2&9>=AP0lAIndtqJ|mhjy#9T#GxBlKZF&bo9PWVSD}l|0v6~YwT4;3 zDZDh-qH3QmX^%1`Y{qzfq156H+dpB2=W9?bDmvjIP=K4NJ1;96>6&;P3=DSC;-H07 zM_V!jpWpg;yeI)?I~SbG3xu4Fu_6vA%wuAZ5u`5knTVa7z9LI^U$Tm)JB9{Mo%n&)g`RBT=pRbCWj;l1hNZt41@paSDNzSY%DbV)E3 z1)O%+#PnS$>gC^uZuq|aBMEY`2dSkORoh75Atqrd=wKaLF-Zxb6LrL;%C+S03F@Y6 zYL1TpMF+T*Bi!4rZZsTd60I??Z;;=c%xX#EzSOWKvN-@--mQbKQfj0ylQ<{q*C?~0 z3W`duQr6k;yV7)X{vhmS9Xl0|78Qf7)=^SRad9*@?xjPx>Y_Lp-Ta_p0(xR!E{I12 zzl_DknGeSvd&6m}yQ zR8-c9mdkM}{mrcr(E(v0ZF<4>@fKB&wPWhe25Ydh*_ko;_e~YYX*#L!o-v`v4W-4j zM;zq}2{CMK)oVR|qsl(2^j_z=I&R74U1REiKf!<@XJK53NB{+ie;im9l(_vOw9}Lq zNm%BS{VQVMg+(>88F>gX0YEnG;Yba3qJFB*owTtSDqRhQrvTu#f{fce#8T#rxhoZn z8xKIm47MH@JVm&`%rvRBzgspK>%lU0X?Ck`rv7XfY4(}?!Z2<4s_r@4fXhYN!vf-3 z2E_vV#$cZ6uyRLQS#fCz1`M5!$(W|o0!Yi_Z|+lbO3lu^E;Di2=>)3idc3CYpn%>> zO_Mr-jUq`sgBpST-BCISp}M@Eo|!M;Z`QQBh_*l*Wb&X;2|8@br*(2rFN$voL#^W< z(VI>8Z6^EuJiH!VQ+q~l)xYf}L1>!TR9Au6y+0*5^uBu!_?mAkG9ZekcGHfk0g*eB z)i0no$1QB0O?vq4hVcuRxJ(H3^@n35N%LXNmmKxTJ4+~0hQVp9q~}_<>A1Ig!wXWW z){7igWlc_1ET?YVex=-2>%Aco7Nl|Ibc`W7YB`}`P*!hS^GTN$`}W=)e`66rqn?PM zg3!^+L=}%;Rb9GUPfu}8$@7}zCRz9vJet6QJcQt6(+csoCj^;f)Lm1fRHx z$1NrJeix$(guamQN`N_l#H53r%HkiCsmh%pMOCJKt}-gNTAK=| zeXbskNyR6n3s$%r*NRJ^<6c{ytpMDqUNwUGDwP8d1cA35M#)&$sH`g3O33e+de1%d zE~^+|MIOL1H8{&EPz2)n2?7}_OIpMeUA5py!foQ4)D?_3@-|-uZeF3^J2ep$Nc3Vl zw*D*$P|-i?Y;a53<>=X}qg<+(tGB4i`kq)+UFY=Xh%Swit$+NzzrJ>2&k)!*5ea;z z207lDB{_dW8-)+7S`xnHs4ReIG{L^3JFZQEcYdS)5X!&*Am5Kj!+{syeHuY887Dl} zeQV0=0DrJxoIDtTj3YCpsQ0Y??k?p{)Lod)C~-mYGm^b52>XkCHgKiM!sjsyEADvj$z}x9iS5HYg@h9Je(YwKW+X zikpnaosQ{2Q?hcw9`5wz_N%M;)2i+hYpl_e!WtIqIDsdf#!bsGf1eMG#4r6{B9veY zR?U;TE0_D+hxs*${gDKx4Y%gWA*zjM2vj}2z1w`nW>Q>TMG}6yv@P?oF}-M2c_{dF z40fm|W~C<<8_&uU&BzsEtRgRflEXgE%=^Dn zjj94Q7~aNt8>T{Eog6XGIk4zxEoLC3+@lHq5b{O+gb_cXTM6Rd+$*Vk^y-qAb7b!A zIFaL+x1dafKZu=8dA8ns$W^nfUSC`!Zla*R{<_+^q}<6(b4`A|sX>XIkZ6lY76UfD zevHWH`ak15nFdoUQ@vuYzjeQ% zhWnexI=lZoxwx{XHmL z+on8yT>g0D@D%G5^2;rof?7YUy^iC)bKHFNQ|?%t?#+{JBcQqpppZ%4OI*+(a5-5v z7CEqUBWbZs>a-(7WuLR1ILb9t91)`i+Q(W|_gt&)Ey|iGDqNp;ojKsRM_Yu2YS@7; zLY0cvH&Q^6P+|gSLspzZ$ zkP!pIUXk2dcQgtwW?auR$?kql>Z!{-AwRds$9EFTdloC@hE@BST9dpN)=35_$hJ3-=Ere}BFd!%4@{PHD!i5ux#f2bZnGuF1}Y&&Jj3 z=iaqguW8IYF3!2Zr^8-6O1fO6u%%?+(d@j#CCJCSVQabXJjK8e4;p4jJWO$?U-ly5$sm^rVQndvgqT5!Irzed%a7d31AMuEwUb$j~Ox37tpfUiRGf>hzc`F zdz`Vm**L{@LY_moO|P}!AkK`U)lw7z<1iwZTPu!Be|GM*Jbu)*p!jWOt}ampG4tX+ zEWK9HD>+B62)t zS}!uC<-9h(Q&(&e**b}tV|o-YbB?h@%ujn7tHBl_H$*VUSmYF_=g;eKw`u#dkCx4+ zc>YqLyjU`tOiI~b#cVF^`*H)kk+0`@YHTV296FgCQ>@%$!pDuLTlFN+A#Da#_U%R5 z)a{xU)y_k&t)t74Pd|4?)C8c&5tSIuHvO#g7VmJGA=1GVbb@AwPoJ2gqdZDibp5!1 zo`9wr6I1Jq3HuZ~-;Y?{mF)K7ds|9l7HK(389CgU685Ltq7(bvJ90VfI0o3cgL3Rm zxZCRgSk<+$@>u|Y!ryzAgvdW!!$#_QcT(Lmb8c9rTC$27y@@c;?(5OfEf+AW=_$HL zt!5W$tV6A4bx2K7;qhF z`oyk9n*7Q{ydXgQU>H1si==!91PKj<*q8!Bcj4QL& zRIYJ$jl6crm2h+lvPfIuhX=e+u@pQtq{dbpr)FtgfgTE2#O=imEgF|QFT5nJSO{9J zD!?Ix%BNz~MBCxQ@>;s{3qg7^^Bk%_Wv|9cV|I0}*Vgl?&^*Z`(alGuk3Vj5?!#r- zhjqWDv+vT_pfma~|18{KZd(6Y*NCV0p3u86t+B$CrfJ(SI*dseoA;fHo|M=J&Uwu= zrR#L|9oJinJnDSs`1p+G=WSkj^OawlzdeR7?buhv&+pUQw-GZY%LCDCT_w@Go4xA| zj5Q=yavTKZe^nhZXi<6hLFGiVo(^e_Y88m#UDwaK$HF0*^+c}0_>g?joHu3TSuUlz{#u*+=kp2!i zli#ClDi+bf%ge~YN7uqrU0?Ia(&?R&otgGxE~wXA`#r1|)>N*a6Tr7d-M+g&>YDEy zy;4+$>?+5hd80&+sU2Ee%>48xV&MG1@;%zW_BVP?5Mq5NA*BYoAx{)s45>A;;|{O# zxy(?gJFX?}BVj2&-PJ%rM_I8b$CxQ6lw&~5dgzbG#jAbn>{#BMY$N^CZLwC|QEu&1 zDG3%h?h_W%!B^s))wItAadYmn%Vt&Hy_(x~rY*T5+}^}QNYf?XK2cQTG$Nu7OsfHu zL&H;)Ypp!RaZjXOolYs`@Aa>0C%bJS3a-t{)O(?al^tVMU{auI@3+{ln&f7+6I&fq z=6on09M!EKAQyD$PbAv}h8Q2R!=45$ZFX7^?~hUOa;|5ye+q1zqNlW?E@5RZYZaJo zQwZkY_wGmwkq~J&dt%3SPgvzzYr*ZsRbF0G zgGKThWZy0rHOF2KS6J7h@@dDI7;9^acRBA+t@i`gss7OF92d*`8+HRx!94-L_V1wK z)!0rlu4@@2@jK`cQ%^$#S^XmCf#umub)t~3j3c=pO~5r+6F z!)$KJR>YtaC6m^54*T5tN@TnSD@weuvUXS+)?T@M!dh#nr#-71pi2T(D9YFQdMQ$Cj zhy<=eeXDm$TckPX(5a2s+j#cn?Am(oi3I{p025}h&_t{_0w2cXvGMhuKJ%#Pn5RPXboLykSQ@C}3;vAhD3J`q0A}3E>F}JF z;l^8opj2=xJs~;Hp~n4#hC5urQaP=XG2>=+g|4ZuL5~aI+35_Hg!{Rav9D`hz6@{e ziERvE!l|(dST%Fdk?kQ6^sAi8G~DcV^8BrwGxi_oa;0rBC&S5adE?CI9wRRvXlbyV z)(M~~X*?Sj+#I6Hl@k^uk8Y1P?BjfwE#W9)u6~nk^7qn0HLsSRC>qR23t`-xbOy%T z#UI7vMq*9U?q=-j|NWYmaw05e&7*W;leJ|l+MnoB<>ysC%2YUJ#Q|lH#}APA(ujV} zNlOy$30I0fd)5=K^(TIbJd$j!A&R%Cg0!hHeNv7t;YwQ`CFroW>7X17>t@R|&(IE=YkdxPF7$rGmnYV+&TF_(#bD8}dgPvcWTl=m@Nxv0! zNSk8uP+)8EqX3K6kSj5KZTfrsQwCfr*V3BoJ9R0ctDv`L?mbH)KNmN5T(zqepoOYo z)SoB^E7`l`V=#!2`uF8kewP{4$ezn9jrF}#Hsf#+*#{1qWX+y^-K0~a+TT3&Ls|`Y zdbowkOtwx;k$Y&P6?Lxc^5hB}3w23 zQM`zm62-yUrxV!*?x%F7&JDGnK6uYhCCr*cJFH_ z16WlP-LMwZT?zS4YJKd>>|E>m+roM=&T`gH%FUY1ybgG47}q>m9KOxU6Y|e# z0RQrE7M%bVdmauug<0j?PF(BBR!tPDM@!>Tqmv9evKJE=leEzR^A+jx6gc2lfm zR`*Fva!HdnmvpmA5;;s4zmGeNib2AlsQ3@EJ`+n2(}cDt2Y3drHJB5T@yV=j=R5{u zXIr2!Z9HqN+A*ZGq%h;qW2{=cUNT|S|Lm^TPRLADt5$?L_-Cl{f~}s%(NPh3#Tgl< zL=~=J4P6PdHFTWAtl9U+P=jxg3YAM|q{&(D&r^qT5NV6P(!OZsMEp%~+W0SAEIlpP zYct1Aoz61b&S+EolnPfozh3{m;aXxFT}7HWEv}Oy)BtVJVpzC5nrOc}j1}`OL-V*9 z-$!4r=DPL_PVo#b2n=l>WeG{P|4q3iSWsvuv90|XY?K?S#S4I1sU=N;Qx@_djG89 zp+zGH@{?~Qbwq2jG(PcL-P(06TDUsf*eaTh_pa-7Z6ua;#zKvV+U(`hBEDL#G%vlp z>_@+vQ%oH#Q#ol)f#!*}VnvH=d(L&>;_(_j?S=)7qeS~eWa<2er-Kz@xWx@_A5wO` zxkMQoRr>UkCAb#ok)cxAD@Z!=-B=iW%Q! zQZ}-4B^8c~M`gkjggze&he37RVh#BIDqoOo#zk}COsXQaCF>|tp;Y#aRQsBU(;+L1 zwnSmm*%=?48pivY;dM4L=v|T!C{wu>ukmN`z+|-U+4Q{Pb^trnKoC-sh+O3lSXEi) zqR%w6s<6hJo-Q&Tu>B}31fw@O8*%xjoR$hV4X%mHha#6l(qPt}ov~2=K)464W>x)? z@mEh|R&-Qe>UWvgM)tOv2hakc3v4LVMOCs93z0n%cuBqn6MYxz z$S_ z@a?K0$>zHo90N!!1N93l8Mfo@P%BG*p1MWr8TnJVP<^9!moTE!&veCp7M^yv-2Fmj z;`PKQXaDF#FI-V>Et{%wSeb7@Jh4p62?M~k2H=vYYLc$gK1(ry+!QVh7I6DUP3ozfmDXj)d3Y%ub&^bf0Hr3=_2J zY=Cp`3!^weS2$v=?%5ML34AezQhT%NVQ@|~gZ^OG>Qhmi73kyfSIWJZ*0h;*&Plue z0b6WP-gcFUrl-a;{d6m<3-&(Jx!lL?N;fT+#B9rM``BF|PYnELum^TgDI6vyLNk5d zJGiNs%C!L_g3-jb?yF{381@O%kAJuWrx%T$sfX1`3W_q`4{Y~fh?TQh36ldxju<{) zVhF#q^w`HDb&po9$xJ>UyBcWk8^Q>z!k9;91!RdS|1&y@T1c#JR-R6kQX#MOacbvg zp9+)iwufzoe)@o`keDwIzOrfFPDSIjW}!{A{I6dIh+BNJ+Z$x(F_y-S(^hDb^WE{A&utVz$y_I2HXO?6I0pQ5+y&$vQ9VX&3j`Z$#`tT-ovqW~MWRr29;MbtO*QYM*f}CWrtS?6p;+WLW(oYXhd;FmF+FAR*7Xj*VQ!Z2cv&APSKDzSo$3|ooVv=Xl8TV|xp$kM1 z(zu=oM4k0i8%}Lm_Fdu&EmQ?0;BVx-*1>IkMO9 zN(*L9HgYY94mG=}A>WawG2@aE<&v36!^4GAUX|#m8`m*;R$7;IxFCev~F0Vb;Kua^(X ztFM(bKhynC6h9wjBKCE^7L=_7xK~#{0+&h?LZP*ZumTm#T#aA>{+)_OAUiV#GOc;f zC08Q+MVvIrM=~Gl@&ZDu2J**e{75sEZ~r(ku($g{w?t0)H?0t!0mEBAw}m-+9=ZY= z_1Bmod~lvUt{^S|U$ta)YJN{V-?KKCvtOTpqcr|%Ehl>Wi=F7W%& z=$W|ajC#)Jhih!3?$LoYv;bpWwzCdpb5kN zX4w9DW@hH_t{IE2Wa;jqA!M@RfJ0nhuW%wplv+bVB_YtaT6&0dzcE}u_ z!7n96=Li(ilO-v84s_zqET*KDSW&5c8=2KO_nnc6x?sI84(pc}>437n8_{(@Q{S|_ zH@++^RQ~MQg*%n+9*`lKL)}B=N;5<^-Pdx>=n)E6phnxhe5E;29L@G4gVcHD2q7U~ zW~c!1-HP=ShkerfW)ojCE$jqDAPv!arqIkIE7c--yYE?3hv)X;#G*O0lGsE`pm21* za)sbnzqh{m=Ale!4*K?YaEj7r)OTl*0z*$t9TevMp1B+7k#f-VQtlUJ*0Acr+MLiX z@eDFYx-Q>rI(Rnuq+agF3csBSqWb8#{hCodC7;(&TfB3p8rvD5wkUR|p05r0p0heMdx)X=yfMDrz#Vs1fR!MtLd|ZMRXNof&%2>iG3TQT_u7$;qKG zXeUzrEHpb|K6FVHdG+6a^4okB&Z0c#1Z!4L4V_$h+K4@|bwa*xzxRE*R0*7zB}C8y z<=oAl9&dmDeiEIsV?5>rl$5;$1lx>a$S9_uFc->oE(8I@3@h<(o(wt>31H|x4Uc#X zz*^|DXm1n`y{8*=^h|Wzj8m@%!l;Te4F+CeM90rJninlqDipLBnz;1qfJn`S?tFYG zJG#RCuX|pHW}BDpUrUmpber&T8*@Tgv?<7k;{)4@HhrKEM zcq-P|Sy>9SLZRdmoFEGRp27X;l*hmB`xI*W{f~{gj@*V@fVnk$?gGaa(CU!fTeXrk z-9{0`)BOJZdkL0Xz@pT$iLm)q5t7$SpEUxp%)qZ24G1JYXcFEQ{yR+a`4Js(KI-Xj zn3(%Dn~i*ToFbx==0|a8BJkEY(f5=#QPpoYin%SpE z|1n|B)*d*!9c$*hC6U3g)eUm{plJ^_x_wAw>9uq#F+_VA(q^<%LMtA?`)tWO%w}%i z+z85Q*+9cnoQKAj>55?k^ln>Iv5IVw1`p*}yF5D4G&CEa{W2Ss4WD%{U`#`-Ut5<@ zP=4<-BRLUNR8-`mbdV|i=bnhSL-P^7!y3VYm0Wu0`vH!Cb^LJwlm`FBi`U&ofgTq3 zqn%-T_~ket?QVt^0(khl!f^+%VBkDg?%K_NZbts;hAwi%M&u6#)!%q)KlKb8!@dK4 zUQch}$T4v?CK`d?cK~c8L<9O1TH@b__Hz)&V1lA^ z2VrE6-zae?+1S_^-~H?8{Nt=1pzfuisW=sKm8Qd+*hp0&)?!X&>VEUyy?YIyxQYoP zlP;fqZT(0{n?u#zFvoCPK`q%~D$j-;dF9F#a)v}H2~tDlG>BA)`R=-p@lzS!{SDNv zi;~u?vbv|{6#|V1#bQ=>JI3_BHSicgBV`$W;8_3Nsu?UX2cN^A^-5`ou_C#$@5_`p z7$B#yN~=q3x|(q4nYmEa^gc`086Th!G)&CcqUjjz#QU0?r==Fcd8=zfZlQY#KQJy==|rea>Ilcd`ce4#9<0{N^+Z`nkJ zqZzp?8}hA-Hn(nZ%Iv=TsY{lWX||pDVQx<4UpM+2SNsUZiE z;KoUqR{K;n-q?`jsx~~%zmLuJ_U6^j{s#F{t|3#Y_OzYVVt{QKpF*t(6&&! zPcEgA3IfkO#@v=hhu&0vdD?3ixswa(!k3*%-jA%d&oOM6oi4g<1bXD3OWzTsX6{LH z@*P`akeiUmyv0#1Ev@;-88{l;`l9a`a}RDEZ;ZaW`xoQxZ>n8Rz=K<50nQ{~blzsA zIM7*kyYQYpPO*=B6bRE4>>y%99DV=Z5)M?qA;NrsoN^`u_;YR7fP1aL8=LEX=hm&9 zcjrcse%)q~>Jcn#7cS6tzUl5hMNc0+v3*rtT`~2#t$XNg;c#TR;d8b$tJTUt6GbPk!TK0S1A_V(e`6=r54TtUJ zf`ro=Xf(_*`ZqA_MG8^+%;)mn8yYgJz;^}$k0!WaKKlHRA5#%&rO{Yky^VZ}`?*4t zL$q*O;xh8R6XdU+Ms98XJNfR#8UulITRDtIUv6t;g~@J4p8EOA`d|Jq5E$WV!raB0ffOY|6D!6(*5%4-zzJX~8%RVG5tiz9ngiVp4e6M+@=dy6j3#y)HP zA$RT~&1Xft@1uvTVjJ7cNGriJOSK#0Aow!fcRNLE-cb-UE=Xf1aX)##JwkkQF--OFB);8T;+6QP_~}W#}#_t4|zlmRT>_1h&%dH$)#FAEFVMd6Zok45krK z5`XtW$~HD7cm`O@D7*H6SI}Y<$ge57h&%QBJ0Zzl8(!mQ>dV|e#H=rE)LZ~aQ(dYD z=WY^sk}Vq1(C6!J4OoD;H|fAKm8C*V2Cn34BbASVSqie4rnBAi_CD(RCBUKGbgCpi-Ch;Ne5E`PPVrmyabNmg(3>I)pI$W*`xrpkHRdssMBD zudiQt5d2_22R0S-ZUjA83IO1ymR^{iBou)gEA(n;s#$-N%@T!<07Y<|L<+u;}jkOOqh(L8$DAa3%YzPoZe8){7$T!!tnX~>T&UMPG>^oadM!$@7%rrR@FHg1jUj%}-w1HI zsPxgnkNm>IWeZP2c&pg2B}?J11##A{Sv3EQjUz`C5L#Uj#`RJ_9qdTfQFOuoFgq zb{TI#-Z_Ri1qYxb?$#In`GuiNALHTYWjcQ8HBr&ttD_E>#Om#YMawJ~PL0R~H&o6>PcWt<5um0u#RiI`5VJsOCU? z>VR2rp7z=d8m6DCwf}#eTf-uSyr?fP{`JUVN5dAC%iCqZ#v^}6RL*ni0l%)Cnt^meD1=w7G@pzl|fZz3(D493jTf-#y8qD(SWEFvd??)Rz%%Kk>hO zCF{VRs;jGe(3B*O&T3S?l@K2vjKyNB2w-^|F=n+uhm1*x41h%rgv=J!)@%|I1N(k< z7~f9O$+CwS7I5^AQW;+-LK)zVT<0)w8@{50A`?j**qkm4AZT}rPVDY42t+MBArgsVup*z<*9)|AA`ss+)#>{m>1>@MrtO7Rv0Bdz6D^C7 z49ZZ6&3x!cAf8?%{@W&-xky{p!T3?6slY!y<`3qZ+;{lW5n$b$L=p*OPGlDb2%iT4 zMn6J0J2%w{{D6Flp2HYx@NVkIhJO)un4bTUwgVajA=*93&wH(3uetp8$U%c3h7Bcn zpMQ8-{%-P^aO{mg;`M?5458tnNtO^{LkDNb5uLkWCxb^0B!7MBLN4;s5yZcH(Bwm) zoq+f4PeRXhCKdVZlU$T~jbT(p@Ou?uc&$oNPHHu-%fSiB!G3+|1JTOUL$aT)$o9Rd zEcBk@;<=`2=itDN5K{NiZ$KDDQXsA!oV5aoXvLbi8o>L5Yd6^*CpiDu_P6wu`8K}# zn*VaPZ$L4N|1s~04Ii^l8yk4~itzveh%D_hC`Uj*(Dv7BlDAmAB3PVelH3Ze#2-a$ zmHE)w<>fHs_5XXxk@ovSAHZ$AHpUMgALe^T@4NIpQ3s(yFNn{LK)9mUcHIvepWb$g zI11GEk9L;p>z69I3M$R%d%k{S`1!?Q#8cZQLJ0Rk6B4k1ee)Kfc?XZxLU!GP=UR^h z#@exYe*6O-sd@SOLh|nZ$7+!{gzf15mhAqsMr9QSzg=SG-ulRVX!WNaRl>^?e8vyu z@}0WnsTzAB^jSrygU>fLG&I0O)?A;y;5&K2F!A4E08R)h*}g$1uO_;`Jd+G=KTpLd z!Z-$T8Df~9R905jTczXk0{kf+7Zz>VPkLTKHB39jp z69U3oZlg#@{I&I-Be`t%pSkc~n@Ub}lM z%*fF$X6++6cn^|XMYvPDHh?(EswHGjbXpqx2Ru3J`_G+GLR#ebMFe7^Ikm9HHbCpX z7<#vn+ZBytZWHu~9I86kfQUXaFVc4#g$(O(Orl?{6$H8$?agQ%y+%f2==Iol_lK&x zKC=n~)-I<79I`fQ3Xr3?Wl0mC5fV13J zj2RF|bTsw@CYJr^Z+WLs&2*zs(H&c3VR`X$n-&`MuG-;C%92#0qO?Cc!w$`(2 z9C`)DKX&~^3Ay5De;hr*$;Q@XZG89cbA%1K#$#1N>Y+`thXR*gK`E{1tv+@NIZUmcD+s2%*z? z*N_&a9#y{D_ri^qEF9oa-|Ef6j8$f5v#%{rOuSp{N|Bw==8r42>&=0E`lI8&qY_^p zD##AKtAc=ESEBdm6`*8K3!&nZ$XhI|+g5=|D;X2>^Yg2Pq|T4_8>yl6lC51`T}$fC zq4f0QqqAF0OFV~SF%2vXtN!=-lg10r9Z^sj$|egn!+ zr9Ubre2ol>EsJQ~rdlb5Zx3sShljV^LBr~K?ycdkHoDIC$g`?MDY+&rWm&dF%#Gqo zu!G~ZUiQFA-f~BfiRm&dZcTwnwY8{-Y795znJOa2*#7mbFTW~BzwG}3<$s~|@vrw~ zwm&et%nx+jfzFg8+V#FZJo?Ws8I)LG)%1eH!7i`STxMK0*fa!sP>^-B2%%d1!j6> z7e{UlK2II@oaY&<^O4k8+}&O6;xsDHE59>#i?hzUBOc}voi>bmd)~>(X}H>LIYkzJ zD7f|mG7#ejGGyiS&DMbb|I-`jkhDp2ycKon^w!pv-TJ~%YrJqScJl-kZ?+SmDaW+7 z>gCIq4(G(geRnIz{q}t*IklBie7CVDUtR21fB;k4Sam}>i@9!o>5t5+mJLzz$%K?FpyNX|KfSSAbv1p^r) zNEQ&uS)$}983oBXXL@exoZIJi-@5(%>@mJ(j2e~#@B2La*?Xa z(mwd}=|`$089A-Y_u7vCJST6eQy!q0s8^126B^+_F7m(l3Oam0Y7Yg4?8`&vDevFE zA93pLrpJ#S@lFR!4>lSvFHBF&&ML*8&vFr}PJPay zcoA&0?pw{?h^&PH&f&InC7>4`YBxOMo%{Kv@fhX5m^3LQ=t$|7`N{qH=bveglVLKU z;xS-CImE@q5dlQ!-w(qdfO`Z}nqp&b|Bg1q{tj>;-sgz+V+IoopE;Zi&jp?WCeoa&T}+ zu->v|OI5UTqC&V#uue8c+WePaUVlZC{hy8MFY@V?UBQmxGEcuAe-o?xB0=|?o?}bw zOEG7=7?q@p=bq3cWeh(*B0tb#o?XBFSjG*e>ZLUQa?~1^#U*O zt=R;76ZG#66xH_zZ`h2tI)GH@Ba1|{H7}5Uw&<^`EV&5JI83~d;CRTR!{jBqo#xp z^ez-6*%qbxu z;hvSvHi=D>eQO!s8adm6I;kV_VK#k>64Q0^Dp@Y6Jr%)GP=^JlGXF^%|LaZu^{2&N zoR-_ZqLXEO%~`JL4RM-ruQZ&b`fI~wC!DD{uaPZPJDR;3i^qGl>gxl%n883@gs}5W z^n;!I!)_KlK0Kd!T&MUoVw4enw)u-`V2EQ6{bs%YHBtZb9dCDiupsecIPzLdWTavg z2RFA&Airr%*yTW*vCdPB;x5-;ajVx1w>pObgM zx>VMOACL+VcTEeE4ILRcAzcz8mJZi|7-&3aVb_Jv*J9NoK)m!<8*&8fu8&SALbgP)xPb-MC>x%EG_fMEmSJ2@PFa2&e1>6N)g6# zbha-oEvfyhA?`ol!EM>sJ2u?zo**gqZ@-FOBRc=xm%~;Z=)e2A{p!E{)kk|{W$>#h z68Sv1zNf$cwJ~q$lh`rGu|P`Ezd!)~{7>+-(|Acen0)uY{>tI~Z?_vVAr`z4>@Q=9qp$4UaTJS+cN;%-6OJm{%m6fuj8jF(O za9g6FurSh~`t8brLBij_eQ%;Dq}-!ezpBaW!=AW*n@-C&TQ;mX?>3>_;_T996FQ8BH;JgYH2^h*%ViuY*hTlW7j)Z_Qd$ z-k?AS4&Vg3-$qHf29mf``F|BZJ9B><^;J|Sdw1{tIWYBu1&)`hT3Lyhdk-c;+*TY> zoaQvYM{chau^o7R@i{wQ=;L{&xGQh&pdz_xd5z*m3+RR^5MC?}8Ri{X`vlB_Z1D-| zYA6$(38tlF7LNw(9BhbDeeB_(AT8}t^Iq!R3Bww8=b0f6jf@mfXO_C<0rmAq^4Gn6 z`_`trco!-SHQHku3Jwk_W*u2ExOOZs2Rr+P+}vDJLnr80#=@r{joMTx%Voa1x3_m- zN^E!6-P`6`BZtt#^2TjFS^Mj8sG9=>EpOf_a$D$UL%Cd+cCWK~Ep2sfNH%LDcWyKO zv*0{ar62D*kjW8K{k5urep`8Yc?stIV%`x8FF`+Cro#3kK?e^VBJdR!9N7a04qOZt zPP!T{69XnR>dKqb910(wZlmRnMtLxZa=iC|{O(|3+lzyZag9In-ED`y^9JMTWAoMh z69vyNE^-3flNtgznN$PI^G&#IHDF*RNU%||>r4K@$QbkX+>?Q!rbKVi5ELMc*rZ^w zlLh&}C!n+qpkxqy4RgrK{3Q6!LA-eys@zZs-1u^$!702DuZ07x6c`X%f%^$}*=*vZ~X@*0mHKD?r!@cd_27d1`}ke_Zvkg||< zkHSc6sv^ozvGK2aBC!YXqrC(2<7>18spvY#!ABXR$fMEQ5WBq*usoE8OXYo%aih_< zmt1MCi*|22@;f>-$%88oIH{OyrY^QPl!z^9clwJ33asWn+=cAe9A3D|a>H#|VeC3m zS{*v?)khuz3KVYjwD(a;aRb<2X>O}oSHq+uo<9A@2h?e(t*(HuRE)mPOD>Q@DK=;u zHAnYA?QP$)=gt|TjBCzxPWECFizLq!hr>-=-}~|7tC0#3&si_;`ydmn0!m2kN8bI_ zC7jY7+06VWjOs3cmXR8pgH1Kes6JBJZ&$2Z>f2xu`vFpaVA2NtKD z|M=s!-DrEv)ejeygQzJqPcavY!PTWQ*;8KYbNJF{%PvWfLVmYQaclLjPpv;`SaUYX zsQ#wLbN7c{UJY^CE0HJ)4M1%P+w?ufQ{S^J4%>F*_4v176(UeV_m{AR+PEZW6f+iW zc6DuKu;52j%UKV~pr+7szb!gIBtn}c&z|iA1w>ZixAp5+)t)>PcXj$z8M<1@`?!eN zO-=XPOT{Z!o<_;$$5=3*U)>b@%d6{dncKbObgN&Fx6vH^SX^9;lNcxvhoDjR;2zI? z0wFsk@DAaD0_Fi;m9LJ43fm3!eRdJ89*oO2v)&8>c2OGFpJuzY$+EYCu{>BriQF~l zSf9@ihevC|W#d3!L|XkSjnvG}3UL}Z!g>|BC4ZCaY@0o)rLkdrqh~KZJ9t0D;pbMx zST*I7#tjOfZC(i58WpiDY{6d%yX!O63~uqGO@9q#1$#f%=*2Njacl!_sW^L`Mk8=x zM(F3cQ`C}V9FD!xpan})#y4iSr8k!Y`N{szsW~<7L`Hz+h6(8K8nr4aV`4# zooshRB4O}eOwL2R?n$Y3!zw6XziEy3ULZBT^Ju2NW4apc$bsX>uXeahda}xfL?bnb zEG^d}=Dg%m9hh#^RC=`gFvH5qmkdM&;Gh^~B0p-KdURQy0!% z0PUxe>6AoP6t6f48?x+-Ge`vu?EM<>ORvFBfOk-!EUp^|3`o-bMiZl+ehvPQdhi~* zgU;%5f;(cVs4QZG!5VfVr1KM1b+AIYypdcxz21}vk`SreZGB;k8x$z3t`?$aT@iv z*R2m~elXQJ%Y`%v6tk8l5&6OFe7x}NAjkDjuW=@WL+&b4~>@BZ3+B{m~e;)Z@9AAC+(0w(V+Dg0A9+i`3X%myor_2eOK? zEtzL!r_6nN5s_*Tj`vLOQz{#_)*m@8-ZwnS?8`S>QI93=d8&WfsB(U*Y#V*-E? z0xX9I!V!;RWm;l}I`SZ6V%35Bsrb%Z?p3144`Q^YloH{I`~;m0pD;hSLdJye_Y_9_!4d zG`GeHd#Sly&kcK~XKeEFmd5*wh|>I$UJQosWkcJ2I{3g5cFp&O3LsQKf?uR?G2PLC09e%=g zp`!x-wx6)&yXfirYbHmk-rPMryG?3d2vpl8iNJf16jgT5DrX;r6#`F{Q_n- z(?`d>!@sr%K<0io7#cB7@L_WI(|gC(%H`<$B2SLeaJh|GvAtfvx}Pg*MPjeNGu(*PHU^Pda6}HF;eE+)yvTiA+`%s zhTq&8SC)N|(cb|?NycepdLS&(0bbcIIJV@qp3iXxuHH{nn5>lr<9DjbW|IELb$w3K z7F2f)#QtN~F0CER;;qHLY~J$OgW!2hPnfs2`hne4YIn9`o;ASv8O6zv+IQxwrka>| z-=%*Z90{*|BDU_1**MFRA1=P|5NLPE$9}zUxw_)&9;AA;4Nnrk=U(n28zlInhT#YO z+#rk+E4Z=4hoH_p%2Kv-&%I%P70i8LsM7W8eo^u#^78XNH8P!qGS4iJhT?uw7wXix zxw$LI_0%#mNDLIwZ*=vMzrqU4!#%3D+6JZXd30rC^{x3|w1L9}!bqyA1?9JFq;PnN zkbnJ_?6WG_`H5eiNLk8GE418dJVXi-1;FGM8AayZhcNSLDnqOU%7n>`$Z_3LowH}p z3TCL=(_O#VSJbpoH-)>k5_!nu^!;tA-5m$n*^B4K@~OD`MOf^wIHM;@rm{L(%9r)< zpc;eN_%Jwj{wM3gFTN->rCI##5393Se1KK~pikX<4<4j-o9h>P(0f8IP8&+yzfreL z1lzb8;rknFwfIs5Fl&@-o9+WjMx)8ZenRicOMeD_5SGf`e2w~f(`Q59@n+*Vdf+zu z5?f|EIs+Wuq9glhzFPzMcR`pqiA-$pUfRFraBnE561O(+!^_ZgEtb*IQ#WqBwuGAa zs(YFJ?q({PhU~lVR#zB=ZHmWcXJtQSA{5gh3RxKhQe@D&(#_7G^GMkBZj8GGV8l%1 zM*9#!cOG%^b~+)e_q+D)?e;N_zma>V5D`?(Ze^s9y6bM1xY@|C2CV8V%c^r1Px-s8 zzQ;mfp5`m{h0L$mi<5wPbdc5f(Z0AJ;t-Q0o(dNlnkuPlzn$`t(~z#3RLO?anNO^j;t6zb4aVNbV@0B!^sbdD3& zKYcVSkq3gM$nhQd^+%Qr5e_2d-aUY+@g%%QjS;2VlD6R@cHxS z2hn^Xm+3TZGudMrQ%Z~i2dt3JqCD^Q-0kEa&hbAe*WMKVUh6T{m2q@R;^kY)^S0 zo5Rx2f+q_@iIqpow%lfWOV!nm%S5$9(CRr!NtK!&WHQBfk~`Hi9IAb0g34=q{(-#n z@z(MJ(ZTmJG7kGNkYXCzoH0}~Zo`hYl$$P9!68)Fh0I2_ladezEM0h~x7F;3dO18M zxSMOpdjx`gv%WEMsM8;|&-y5(V<_h2U_+2YOsz{YR)WVHpKGb@URk+HJ|J6+0|k|a z+p?{Crc-@=zk}#V*UF<6&n{`Sv+Uf5&}Xg#|H?}{m^}1 z_Etd{7MuC5y_HEbLFZ9Z zCVu}71%+9!+v;K{*n-Zw-<*`p<=_{&yf= zl)}5@fgZH1Cv3>xdHu&avLBhmocciM#L9F%EA(O7^-qoC*rVJE_AP;E8Gxq z7#05)`4%Y;qIOFAA7?tbt5&_Rg9vyaDR8z|KMAbNH0g&r)*W=BXn2R61_?B3*CEO4 zS?rdG9fZI`&f+p{tQIw;{DI&=glN!SdG!(O5d6@K+lasc*W;vISb1(+YmYG z67^-3!hclb62p-&2GQu8m_fm0&AhJC8qdTPy*|xpww#rndw6h~0PIh#;T8^ygGy~h zh=xHRREz+|VrBBXl*Po0m(EvCf88USBE0buf&RFR2GA67-@jk~)_mFj_=knrQFFcr zqoUu>5Gs1C*X-nl5NvQ`xO2BMRr>RVHz%8$Ye~ALy38k_pq4u4MoZ6c;@6yHtlv~| zJ_P=f!)9{9ZR)HIE2?lCC`4b6-{6h%K*g6$_6vd?MVXLA=WViOd@c^fel~64M}$&j zlL@l0-BU&% zSovmoX^A0i@ijFL(FgE2Vt+c@Xl0}9eu3GbPaw!wiD ztzX;}znCbKbDi6TR9FK5!&SD0g5j=s+1>ktdsw9{lozpoiA6!|3y*(z`2i0Pk2>p0 zF@5W-5Kb2a&IMot_238Jc*N&qvxLn?*w=5`QH7!y|5n7eqpR}%xPE0wQnWhgi7{5x zGy^pso^0Ad_j+-5G+mhSdd|S2;DUhHG#qa!!%OV4KRmncO8ttOWG;7_C}ATPrxdQ` zk7!E7=9d!diLv%LD%8$#&;0^v1+AA-j;#rCnXp1JWs5wH0x?MfKfiXnL)Xp^fCXM%pZ;(q_FEkq$FSexvzBL6Q8t#;8>XB^`4u2w z9*Ymmt*?*p`#G?ph@yq&==IJT1`|h=0H#c#f|hT&H8Kq3_$fLCvs&FjzRSGbeg|BV zCXiJF0J;s<10EyQ>gwukh-XOeQ>cg#3{{|V^DT$KKvRW%do-VCxAQjcUPJ3GA~t=m z0c2PfY#k?i6yaJq;W(i){5}2*kVr#$paAurJ@4R`>jNRDl5Q7+aw`G_BuKmy)uub> zkAKyEyh|7qvv*HaS5FC9+Q*)P-_b3j7=QEJH=4ZTv%795rvMBD@S8@09!V3XzFtFgi^HU8%0Y^x*9exoL$^;!4flzuS^Ss-P07;0{V8VUGajB(zid2e= zMVbTHJzW|qkxj_us;Vnw-@&#<2x#nOo4GM9Vl;A|9jOlybG8|5;9?8%?Cr;E`mpw+ z&eVVxLJ^5Y5!eJ2)fK{wf=wpG-qMhHdq%_>>D)Am*8tG5TzVwfM39lNqcdC`+{P^) z#5#hLv9LVb!R$y7MF5Z1olV4*tp~HzZrB)MGl{VHk;ifM{lmw5kGw?za0GY$FFu?| z1TY|wFoBT1mx*bmSB!vRpU*9YgjU0&HpG_OhJrfJ-@kWsG;a6di-cHP<9+wCzXrj} ziI}x*=T1euyv_20E$EcXz(!Rd6qB&*0DV%}KaY$Cadk#@AD{7?wSEM&5$X464a{uY zjPv^uQS$opoxAgFe>lK#DTk}sJsp6`DMB_>929gq3Yw{6znq*u2mwtt7HE=spbGj2 zZ;&Piz)#lV2wzUdvWpU+gJf^@cH(m$*}~HUis03o4iCp&k3S6qvHPWF{&#@<#7_i1 zak9AUfmR<9s#fwY3h_gbOPmHG!l&xwWg}1s5=4x{_W{?-2@dNq;v^Uao8jh@sIxC2 zch(|Gz$EzLY;rx)AvODzKk$9KJpUZ{)Vv5*lWJ}oe8d)V1#H+9ur|>!O2NGnc?R1B z8)39ke;Ax*EjIb;(E8DqWLZ-7<~2ElfI)2G+GZZN+H2-CJ7U`ORh;vKl&>U#5%RKP zAHYK&(adtetBr*^`hJbyj8T2{zE`Znbv78}{PXvx11fw3%r(SdZ6Z7; z*$8-s1U!=mcj3arg9i_iyFz7t4p5#jyHhB`4lkr11^@u6ufv{bz4g`x=m#9go>yYN zfqeR2s>im$oE8Q^{1HDRIxz>1eTw8o0=^3T*Ny2-X$AG-tUF;`f^-ormIs{A)h9Gu zOv*=DL39#}Au{f3@LGeobOLOpX)mdMG4Th?`6VY}>)gzcN6)9%2lDG;oiXt}p+r9e zTH;yu>bu!)JnTf2TG23$Md3Gm-Xqi-!DzS-t*g*y%+oTF6Z+Akyj6U5Rx*S~yf`IQ zKgD_0>}^rYjf(vH<6sgLUmjHsYA3kGAq@x-dsc;r5mUwh36a=VQOMRDDxW_R?i}#y z2n2_fl@+(xjVZ(*7$Q3FokX`+c;%RRmiIfiEk?tff5GytZW!yb&t-7*sA;JY;}rjI;WPm>^TRk*OF#Nt`Hpk|CmwJETe$ zB2a-v$rgMV>Bu(kE`9N>M}G<)X4Q~JoLmps{8$G%jwAXP64HLCEnT2w7+!cfyaHdl z%j9J;iet5CQUBY^@;~+a+5tD8^%?gA7M?^kqK~?jEfw8$vim~aR#N34dmdtE?_(a# zhA(+@$dC0WA<@j(KV%^@S|}^aJ+M$+@kLD5#X^F$cs53f!yfc}`;yH&?2Pb{fwP~{ z8?j-PpGdrOeeb+IKwJ=a?PWVv@Ycr(l6w!fq1ufNJ5+sh(6DB^V=trpFg96(L1Sz% zFIdqoEWMP`Ab@h=(*tKb@bat+8O~FEKdL5Y_M#q3T5Lkt_!=RE9av~a+1~K#SDFPC zHlR#hZ*_{Lb{8;diJ3h%gCrtqznyh=@sFq3JKY3KzVo`S7kv^ehMstFFPpUu80u)($5f*&Mu4SmiQDnKnw9iZO)R~2FS0C5Vl5iA%L!S zEpq~P=J46LfmlnJcT|d0D5*cfS_;oOgH?9#&|uY2$~ma09taZq$peLKoAyVTTZ4umeP z)@-*9TskeE8&%m7fOn3eP_sO;t$R>DXwBf4T`*GKNE}A+B_twN=5{ZNRSjq}o=AWG zD{9C@zTNZGgf~8Y`m}UM99o8Qa`gupLipXsprA;?7J9jt8aT>>Swg&NxIM)(-;BAx zLjpv@<&~|@Ta>)PgruY<4>ZPww#>3I5&L0n_8~M-AcdOIWv{NJV}jc{ZIGgcL~1z! zh4}&$3Lo)6u(!e^XFlCc^}gMkf-><;mRtFXptV|?93t4ukJfMnuaQ&1OQ9asHk zIKY3FvjhXc&iJ%Eg!33wj2X($!tVgyy!sUk+9+itp%r-MSxR}8+$GOW5@wR zh)jB}LM=Un`ai*?Q;0B#x2Xo362r>_i?K-q)5fR2oO5_IJ)GRpyyOBag$Ec+h3YMlp7gyKc75G>)5(=D=(g8??yoI97FYyW*m9W_6ZKW3KDG1WEL+#0{%ldFyP@1}-aFcwn zgI+pW!fxog`xo;suRSu)-Io=ge}883_#j?h60H_z7ThaB=B|ZF(+3VG8&u~-46nca zu1VEH87ry{MU-+_9%@9HA8-Bz7y;gn=)yuURK>6Yx2fABXj*k|n?R`(y+cOXCBb&^ z+B?v5l8C;t)Xzb_Pr0#1t}g1M4v&?oMHhz|9fT5_;^h#|?WH<^4Rky=ZpR~ExPM7S zK}c}JqXn6xDxVE}wl}eS)i~vk__Uue9%r^$i|?hS)%VzUlB3%9tUDF+$R~!Ca+6c^ z&dX6aq{3Y1RiRPe6tGWh4CJG|-Hu~d{E{oMe5M06O?VPjj&-%WC3?O}RgOS_9QtA(I6tyw<2 z#^?El%B5Ink&sx3_wvL^pfk@He-P1_=6uQ@4jGn#L<5i(mhc+8_wHh1GIN30>PC|@ z+jHl5mIK7*LQBFy2F@eV=Zs8tx=Uo0y;wU%RH%;l#q_>d{krJ>#q``MdR5ZYLHhM1 z|NL#^ZdciE4^KfRUC6O^*2 zf1Q^XyHSlccC7k5v;WEt1kA4ICC4z4E3oY?JCz&p=3rI6ye`A^BwYbLtO8|uxd%XO zjh+n5IE9F8(!uW%*|M6xo&5dxoWlj4>wb@5N}{Vpzm7rk=ZJi^-eGpyicfI0KYTyXrVVkAHC# zKbAS=)9mXc~2YzWEl)fbYMFa#-uzUf+vYI`mgcVKOoOnML z|Jpk??;Xp{K3N5f;(?h^jb@e~vRAJQF{h#?-|95QSnhvQ4=kkfN$@*=h@N8L9O+W+K8vYEYdkL|i@0rhgc8(#2yLV|Qv> zEI)v10Q|g0`kVG+5LzU3wZ53-_NzD&wboJS!T_x8o3h(o1BoE8=$K|!G%6|;ym&g$ zEe*Gt0bij;`!#~!O_(Gsf8M*bGOzz6VI4)v6C^*>z#62Q`DKb8HDyw5^v?mUqoQp7 z;n-c~FHZ(Hfti|y7|J0VB1&oAH3}l*JxaJEfFNN%fsUde_vMiC6UW7O+s;a6sco!8E7-Ao+$p=JhB&-?2$&>8;n>m5D~yWtejxe?~c8Fgf3-nnxpsDbonoWxWu(lryN zIf)QK_Scd5d!U#AnS~uE-os513y|G>WLQ+;&FPJR`^2eqf|?l`2nl@=LQTjU`!{ah z%;q4<$|{M%B>|L$8z(}QAzv5@@`+h{Z^I`b{1TfaydOTS0=+?GhwwL4T`FLRlE7{Z z7lJ>Qg>BOEJ6{tX0TEHcZk~sx{ggjAcTev>;5Af**maV65xgE@zhp|tvEl$15^+6I zdviz`W8r3cfmupsm$5(LEeh%!C)E?+07M@lz?iylS!OQfgtGuB$EO2;aSVZhWh#c& zfkq68_~Xyt2rY^#?gI)S;?E+68&v4;1Ug*gQ9fG*^4gqFgY5|m_6|&Ai)T4D2JxN1 z93~`o4BLa)+=yIM+mhgOZ0%qMK}9E~v8_zzs4GbC%XYpA>5&tJZf=a96&bq%qAvLO zYBl4A&6@|oqBP=U>N{n2AnVuwbh7Es+|FF72Z|YrwY@)T>HSO@V*(=ZLrO*7%(7z+ z0PMtHf>%|W*>na)hE{*~&3v9Zbm*Tucdp6P6^v&R(jGBi-YIj*N8R%o#;9~lB#=7b z`=FUCm5kI}Dhlw1eWur*zLSeb`#s|tpfn6o#@qQ4V!*-JF*n=-g-@f4kI-1Z7NdVN z!I7@QRWdZ#A^S{2bsK>E?$qTe@EkIRduFm2c3TZwsLM^^_92QV;prAX?zEli0t?9j z>_?;9?VQ4`)(iX@_9QW5vO+{=Ihh_{r$1{2$Rp_G`O~N;>SNVK0(s$>eeCI(#D1tB zOfo3_sB$`c4#5DJ`7!|y`L)Ajf+LY2o*e(}cK77uByk@Re`z@|na|JPsqk)6q}voO zF>{U;LUm#T2L(Q-dIDD>$#8zumPA8l9h?t=yw|+5K_aSQI7u>nm&|e$o=`K_3J-iN z1qB7l&v#MC!uB_f@=Ka_BbkqtPn!l2s|YQD?rkXu>;oVXEe%?{em=6^QZ8Ogxpiwb zDu&>f=Rvth({3l>n`pS7)zmy8AgDp8;{t0Rh0}D{K@_GUVE&2bjZeI;;tZdqrny{p zaG{$hb@Yf8Cs4LPl{pQsS7V7U+cb77X%~%DPyf;{{xEzILl8~c*(6B2FLq^V|NT!t z)M7ITDM1H9L+<+Z>vu?eEpvS!g^WoKKr`A;;Ze~MsOaeEh$(am`h`)BpVQ5zMxzHb zlMHJMM-pYSX2;Bly+5Z2B4d6}tQQc;0?H|_vSMpS6yRpID>#4tu~!DR;Kl0@IS@%; zc}9t@h?B}yTq;29K2vwo@LVH6$H-I^FMoHw@yTKQCJ__^bXWj5%X`KFlG7A_x!@S5 z`?ljA<4}&PV#O(_Jeb6qr|$g;qFeZVIerXJT7Dn)YPq^!aD-;|Ezm*%5#QmiDXEJ+ z8Df@qZ!20uGc^cJ({LRGa4%3y!tr)eD{n&}FVS9M06bdC?zpCiXUl`Ckwf~4 zzEpe<+T}H%Ct~|kuek;HCd3de%q@Xr&)8rGKdEhB)q&+vw^e!6(u^}%kH$eIl4l=w zvocsj-^irFe`q?6hzzKym3=*iX5)Zh-y@w}f9@$Xvp~q>Y7h-vrJHWEy{777A~1a! zh}fb&@ThV=!>|eyQ699nqF{(=R z$8{`hg}E&!x}^eVOQ_&dG)8HU3x2*)Ik!p87KH@sJZU(D0Q%iy9t_5FA#1%S$0yYO zxorc{jvkTXG(Di4cHkZ-P|>%kjzz>zL7~9SU`0QG6mRx`n&HKb5>`rlY{%OEb;n?c zk5EMU?JHq@``E@Y=Fk}xmz5y$6x{v(CkfAx;G&Y-oxYg`p%Nl(kyGv$vwCpK1Qd6C zKz(Z_z}v(DIy-*;1{)^e$)#(v6v1#aB!17f=y587+L!&47)qr46pdq87zPHsiek#7Fs17b z6@|ld$SH)cjFmZqhjb0>k#s?MQObxZw`j}GHM!-}LB=7aq}J)i-+SZnl^!re_fuObCq zE=XH2&-)K3=ApP81vYk|H`MJ5eV134Inq%=i;{iO=r#)UHWrHcEidZnaVuU0VNT%8 z=l#i$d*lnuqkqDviP*`%=piZuHbenrqP;b<3%jN?^=1c%U2Q*wxEb;lXDwj_Gsn5%Uu>xqo%A5u zu$E-VHvkv^)jkz~Sl-M>XVF6&6y&)`TCbt@8FS!VWfB95FP~Emsu>J{u=(@%xlOYH z%jnY$8hGa|UW4Iwdqg#0`X|#A0C!T!xyP`aKwiMy_|F4V09?|F-b2ty``yKO*3#~# z1j1ayL#6WcnKS(A!O*mf_zEMp#)PCSX0ZH%mseJ7`gyq@beQS{cTAHIts}?L62QaW zinSq9Ej1y;WkO0mp11_fj&py3>I?$EK(CCnb<6Qv9M;U_CM-BdEKrq9MfaaLW9&%B zc3nf4H(0PbKiLAZ+9cA#*op{eBa?gW)yCMHRu`RdGUL)JC~}&B0ft9z%>JVzu7Vf% zoY>*aT0zH>F8S@pCoaQ-6jR=XeN8+#=bBj5ZEQZ1;RXQD8?=eFlBVENYduCM>v4=A zzTjIvzKQYIU?#51a&^X2T?y<&wQ7Ib1;PT>EI8yFNJeUEYBV{Z-jd(GC58sQ5u0}I z`|hC(z3|dv6~!1kw8~VF9`NUC3ydI&*$*&8fS;6~m4>y$uGe3=#JBe!X)TF!;Q0I> zPc|%WDcrpJO{u8dmrODz-s?T0BfY)hq)^;9o2Lm7r0-NK6-9HO5Bg#{DXSoq-Vlhz zc6S=hoDB-0ivIPOsEj3v@LPlYI+EK36#MqN`ay?pbFUB04J;LrxuL-Rc3tGDBBEY@ z`fQPys-Wc!7m^+XOjn`NnYy8!k2`Gfn1@;9XvxNqKZ*N(?jdY`;K{`=j-_CJAc`H6 zflahE#IpihY>P*{70(IudV{%2+D}X>u4B2IX>__(S*87MSX*_U!8L{eUX3o@YxT=K z=Ya5Hw?KI`ByDl&%uJRlLaDCNALwH~Pr6AWQs9sh5!y58&&XmO9xN1;+kX3PxAPuJ zSN~%gv@j=x{Tv$JH_DCy2&KT+ZGwDvb1F!L{P*(0%86-aTi`X&)TZ{bCnqzFdKT#^ z#%L3L&jD}gmgKo;?uHHykkaD$4I=^w;eSdpi-39+Vgd34bF6Hq8OQ*;P8L`(pU!c( z83r+4`4bK@wuvE>v>b(Kf$34EiT7DCnd8Y=2V)d;GL`untC5DaVcZ?+Ck`O9ktbe6 zyDo>?C5dVhvAX3b!yM71ho;mtFzx}PESfwMe=3L5hlsmZl_fd=Ueuo3>+{W|qxePT z&)`SnxvLYuEGOUd>^K9hI9_OW0wG)xl^a)CsmR>?ynp+Z%F=T`;OFkFASu4q^2pWq z7FPV90ysyy`Z`!(hnppyDf$P`Zj`~VV(#RT-{@F7_xhbf4c)VM2*3pjY7jkKVmtM* z?G?bR%g0}vjw9$gTA4497pJ)qpoyzw^GKzb(gj%k+%Ygh9zn|E zGoHGk_dCxc@P=S0g{eR+>N7jeD+et>2881i72NE)h*C+Y0mKvM9)JDka83sD&aeiu zHllzXh)=J))RU!3pv5V);w>FUtrxbbv`verx*F8TO^y-N4>A>BZ9#rSz;n{#aRezD z%~mFIk`^a5Gq}r+YCL5cs?wt7+o-FS`j7?dWw-fcaGOL1nD;fRAPhyFO!)z!kXs9e zh+jo|Ww1S8rq10+A^H>-^Q$7b#Y_#3xR#-;UM^yQk>8`=0p$mF3LF>n0Ho~l@v|k( z<8kjv6H$4|Div+X@%|2R&7lr4Qu@kgAA<8l5$@QH^oOI-42TQ&DW}t)CCx0+$k9z6 zmc1*AVEBetT;JSaqpXB z@t{W47KjBU044s-M*3W%*c5+}bru95WB7@Ic>WVylGiQkCZ+s!D7dTq-(zte`i^n3r?({!ttDLD`4> zQTeH-xiadewGlb7pbMm>8}3Rqqb^FM-$O&wQ@7c3hP4b)p#%p7JsO0-bsn-kzqX6%>?zIOCynO_RbPN0 zAR^@ZHA$D>Tt8l^%o;Wt*selrn^AOqDIbkP(1w88Y&a}(CzH{V>?G7)O>a#oazy5S zW_pPDfg@@2!>J&{C1`ZI(pyc>+<*Vj(^C-$+tiB>{LNa{yRYoXt+^tDAN(-UQ*JE4 z4NgSi)KUG!#%z@ghj;*)fzLDHmjm@C9bjn1cofF)q);`|PKA(L?g#PxJ6FJZir7wL zw>XU0OS-k}lx~SlO_~_EiZ2lFT|^2gD1`R3WN1;o@z-x2nPJedT26G(zu_`g?c&%f z8V}d;JFvP4*7$q@(jEc~Dh`(KBsJ}xJzd?>D{!V$jF3SpC#PL6{JCxPuOuOr2&n+l z6?bkI`icTX9TPx)L|-b+cg#mvm~Wos=QG~@VRInwb2O8dG^McF4{0J6)Q)t-B8fD+ z-df-B2eG(iv;rJVAx|{_bpa^2aRDyyEWT?C4h}qFcvFtQ2BZzR5sq|AWTk3tZ!tZ@ zSzS~KcG^fh^$1Mc6UKMUuzuFaa#2P}W_z)PP=V=BD>QD6frv zUmNJhG&1J_Cm`ZQaOSY(Lh?Rw^Xrzu-4hmBE5UtIy&zYZ&_g=-GCNA{~Lt^m!-NJ3i+rv@8kkv9@~I4gU&y6$@QT&ipVq`6E@?eiY( zl!8M0XMcGuN1-b*{eG-Dx`hv4dU^f%u2z3%@0#BzZtL(O1Et#~2|a9w0~lkdzUM`Y zb^w(R7m`kwJJL*~rG!XK0J}U#OTIXllykEKA=F|3mpRh2aKV4^J{~F{m2&LkoVT3lhS28 zjYq`5%x>cTAwNS-0Am^*A0A8#1M05Oll}{=F}BYT4i^2UfxIDCEIy<3LJL#ET5w4( zc(#thZM?vlUWqULk9(Gsy;jMH>O^bB6wCF2ywJ=Ji{!H1iF0Ffs+q?+%iyMx=)0oF zlku&Bk&$s|=@u7TymWd*D$48+Q(Q0q*VDaRKu$~QqovF6-IE5wbW2c93BL!fPJ{{F z(+er+fVP&vm{%@7X+NFla9-PmM~j4VI%KCLWgSlBE#i{8Pw&W<*dYgz+urQp>e^B6 zfm5Uz=&vmWbBRvj@Y3jPP_ig+WmpdUx}W#vJ?O76DZ)8JY=#Kv^BGz$RrD_XjxBgj z)DXl3xZx5K7t@ek-4^0Skex$(9EPo7lV2KhK;bqG?M2n^S?`lakE&7RnH0_~E=Hk{ zrO{;}P2gtI$Y*t*w9fRhb!orkR*zhxIgLS!ZftU(aeguZtIE&kkDJ>+EoMyJ$bFr; zEg9JVgyIp*Lpo2^HX;RfA3=b-HV8cmLH>`vh8SRx?6#|2gRODc{`CXx`JcAfBGmGh z03}vdtW;pJ)L^(u*pDhxKcP_~1NK?G^}v|jU*Q!y20lJU_vAqXFh6!rzOj8?f-?AKzbs6au3K2>KREmfMJu_O?kEioq<1W1%4GJCRr~*B?c{Ck=Z~L%wwR^DR zQHb3NfEz$6f07_;{E%lh=?BHmwRA}LdWrrtgtSV%GCUVsu!zR^XlY;3;Za2^f7e2z zUuNAfI}ks5TMC}0@|S;%jb<29zDXB*f)6%vj}WwXpc%d3LB(43s;Io2wB-}WXdo|f z9RX(^EiHD&IIt!KHC$v+P>BRD$>F?wk_Y0Ma#~VWfMc5|<{v9Ye3g9h1%qmr?RK#D4<%?1O{6 z+z(XIS~ofSp;6Kkn|^mMB$jJPr${Vt{;R;$HMF&w*@@J@|Nw* zv&Z>f_dO9&m=gwiBX$6zUNRC(^|;_HREU7bFmeX?^2NuYzt3(_0F%Qk3<5DJE&y|M z%l#nVJC^C#^K~Rvu$QiX1?5wv|m+jLn$=oP7aW>L7DZxldbU-k?KaV}Kg=a8bWWQ7C zT;SQ&ZMXF&lCm51XlhWWmeftEoIfs~Q^>PpxGAw{zGTTWx%|M1Md_9yzKQPRweYk! zK4+6<+MW!j8L?R8M3xO}U3o1fAXI#cj_0t+A=!*~gS+@6_H4C%`3jw`` z_2A(pk^jH^zCY#h8j|;;1*HPAnG@7bt{*6*0eGX55X^gbcHOP`$ywP#yt0wr$E1j- zlstK!9RQr=X2bvkcl&|u#}_WOXE>5sTY7JJRQcugDv>Efikh$Qa>ht}|1^9>soV zMWugBFC_7jhqYh}vM(8($X8gplX~|c;M%_9IuFbJpgyZ+9SRZ{t6vFbL5i0~%81|J zE7J=xIu2W@$z$vG?eZoj(fQ3m$lvHY*(1t?${zMMk!UgfcWxVVYUfm#dyu@twq?Cw zm&?0j;?odTzfm{Clu`>0m*<%Kmu`tXB@e_RZ%u{}MlAkR4q}R7PCdc;ljgu$+O__`p}g@W(jaZ zwS@=g2nWYSGBM)?#|tu!0%?kfYQ!cEDCldwjk^&VFZe!@+%D2Rj?jZQiqJ`>#>W5j zi3dsi^J0chY_0hh6&?zT5?-@bLCgrjZNbL<976_r*>rdlMQ)42CxkN5NpF)B5JTV7 zMIi?o5KUOc570=P8Fd)3Bk<{B0^z^nbxL-dqFdWc4LT13R`+MoHOC#CUYd8#S&w#P z$6-T8pl+cwtkhUn3nIq3?zS6x+At~QW@6tM7z8rY1FcwJ^U5f4CZp9-uab(tD`Qx^ z@I{%IwO{aS8VuMVb6Ch?z$B0QWiLJb5nvS}gM%qh#HM%wx)P&XeC~{`R<;#p?~cN9 z@o#qnu)0JTY@S1-7I41??)l6N1T#^(C@l*nXXv{es5i?yMfv&pNl0o0lN}gt8q|dJ zB#jrgy`XxHhi~NzY71hLM|}J8`yq-?<&6tGXzJjh)}NNi@tNOvR07w z*@IuVbZ>fxoR0$H=k|p8V-q>7(__PC7e z`Me*piqQ51#~UaXQI`Dnn+auAA);9Bos9t!Zds)3mB1C7MKW3ho$vKf;*iOT-?6S| zedS-N;e$~p+LLooa!+8QCKuus+*SN-w@^i3!-V&SILlyk?pU#L8knw9&`pTquWk@4 zz)74{o#bDpU_PjBC4);g5zokk4(i1$F(SA9z&eT$U6{}a#Wz&Aanq*e;c$ny#DB8> zJjtY1{0&&#;5I+_FVdFJcB6b+8*c)j0U-DhYF8g%A5o+cNvIhZqRA8yq!n+m89#D% zVe5!MMMY|M(zHGxZ^4=6q7KWE5;0WcX_*wpXl83bUM2HV^R0;u23<5a)L^VGV=ZR2?4b1o~R+Ih|zf4+zqc=x-uZD9iCG4UWG~Yf@Oe zC&aNrP}Hb4It$^jPJ&N|*wzW-1XBj`?zF@cBlry1Sy;}Z_3tVQIl>ts`kp3JL{RLs z^*Cnv>ks3>d{UnKh1VdGRML&y-!QYFMo;UR8)9oH>4ZQaj(~=X&BnW|VtzBsP5;-N z(oL7ia$>(!yi;`d?%iq3zyS80B|ZB@_$VYTVSto0Iyzjk^MPaLq<8@=fbJN!L7V6= zPwyN@hsh^Zo8sC9CB)XN0715Zvm3NwfsRAK9Q4-@iRa;?a5y2m?EFGOkN=jBTB6A3 zCjRn}Gggk140%YwgXqzcgZHgGMJxY71cpBl&w0M}^(>dvh`~6#7n$0S-(r8*oSxa{ z1j!=rFp`6RG!f%wV&T*#-GGfafYZdh^%(0H<(ueuV(sX8sZf1FGh#WY68vxj^cd;n zP*myU#!$*$MYeh&VsBO(cV9bYftX88A838VE_(d<@kJi!kiwX5a~Dhpl`Ipp4XdXA z>Kv#9e~z#hf0dycxKkb;5EFfYvv_fC-2|Cbn{H?Nf?Hh$nyca4 z$0Zl2Sc}cSe>ydqG3kZxhT#qRA@nQ2ar?Ht=*7P~3Bp)8TS%);U{RDp#81oh-r#IF zuDretp1DIEGiM86P$08Qons= z?%|GXiKbytCH+XLTbZa3aDl9S+Pvz^h8)hU{)56K9W~XhxgVS5a`qjJ&{1i#w<_=U%)YIgnlxOPY?PCJ4h*D3ChPX zG#h_UDDd!x8mK?ee)vuA5DZmyC=!5dxuGvh0VGH(@Y46^%Df>`4ZvF%X{&*aopcQC znPv(Z!9EHrWN(dkv;UE|F?}O7B_K zl8AJlZpYO${C&S0;rB6=CwRy%TCZo(YlWJ^zVnDH-TC7!Zk7cH%iz&xKeughF+-(( z^JI_EJvcaclZ5JFrmTlapEQ%d86Is)JWu>;Z7Fch!%$^OY1+c*urT+UkH^fc1E$8k zG&C-( z@mc)>Rr{kg3g8)Twk3MUAdoQd3`W*hE*7-3508q-K5=2zHh(W9vSuugjL3x*h6ULDjGTM4QR`j z&geW^jax$6<8KA$!D4B5nN$c(=DyC?V z+mWEe?LyxO=L21tjIhsDy(<)gk{t#kL?0X({PhASiL(Pbnj%J*oVbxg5tS&Z6)pVA2_3|1FsAkUh*_ouN3iBS(ZD`w3BqJ}t6aweO; zuLE%aq~>=bS^ywM>m=<$pNRFTk1WJzxUv!=AodK0L-q$b9Av~=grL$q6t3m`|p2{jol`=pp;cUDQN;j(IKF| zGbH?$`{B(n5&R;q+_g34br}%pWyRDbXX;fn2~R^30J&}1>?QC(%K#)AX~ycO3}Yj6 z;nuW-W$j(f$cs}X2*4+4rJ{jccLk}M@Za)^mg+HRfV5-dK5V~6ie^~NIzD3TTSw85 zhLLDlb3eDEzPtz*!SN)%^N@9?CMzX4VKlz8BZhc)#}kzRQa1uC&*wh3ys zy!lDWU!eDY`hgUHwqs>Vu4dg*7e&9^exlOabrB5&`prkAA+#o_`7|TCSHnLT4yyI^ z+DAudqWP1IRD+BzWmM_^@7WT*yUSMl!T+EZNH-~TFv^wVTh51A?C>@5HwugU&;rho zaU;|%Yf6$fS3b{Yu-)Xy!4E?wsvR|MDYLfg5A9+gedp+T#6?8oZ3Pd`6Nkk zF*RvH&DW&~i??lhK^PhX8jwqOi;nDkqN9Eo(u>W35O^gx(Qa6Ax%eiT!=r9epw3o} z!$r_(BE4_xcrq|!6PHC#gsWR&2Zh6Ln#1{i!|PLw8g=-FfnpjXD*IdvDSrU>Dxe-n zw*+%p2W%FBc>X;|LgyQ<1Ka%=N|CC%(I5E8-8Tq}ha z-hC%pjm>g5`}I~3OUTL~K7+d&b~AW5pgm{eW3xf-s*BpXR5iKiu8_VbTa3_1wARKA#y1m(}+(q&lYvf}1;TNI)o zmgNeR8w))ZH}Yv5WK6-QZFLno=JD;sxr5EllD&%bX~HyH*VcR3I^70c^?|wI{0-6d zkalZ1jm#@WYqkM^2H_=Ps*L)lg*%LPNeqLn$QU=67lyi{W9%{CNWS18OFvM+RN8$- zpVV~)5H9}WWm+qt0-QkeI#5Q1+4wf|T-$M3h@Hggc)36Z*=pmqy;l%aPNE$*u+skh z{~+tV!@1u7@bP!+bgENMlTw`al93Tvl@eKrlB{HfkYr?}twKa)QxTC-MpmeVWM-31 zc1HI8-Vf(|zQ6Bv{r>n|*ZG`Nyx*_a^Z6L}^4-z#P#~;O~|{-3>?sy}gI5(5xYPkEDk=(SSwNLVTS`Fsh{eeB4OjZu=Q4+8Fw`OduK9^EDKyKp z+;;I3&PEkSs(L>jSUH>orG`*#a8TKynRraMn<_j&Dzv^Lyb@~bs;k-u4X7$2%snvt z+O(qHoaT4y7m(;s3ldPG^I^Mw~{Y^G7mcm$eNZqd_1->@4cOi?Hz4wYnqGW(Nd;;JCnf5}Qa3Na=K=ErLQU$hl z??Sn?0WNxY=CFg3RIPb`Iv-r&jkEiMao_}U4F5mg!iOBR!$WjkA4cK6&^>H*iR34G z!}Q|}J8UGYwe5*Rqo3^8JAs@CKt}HraBTpL zFF{(T5`_HJ61I*v;N22fAYC%GL!k*1To*s=hpkJUW1rvsh6jBbj}5dSOJXdwUO$Cs zL8lXd5vs)wQVTohOsV17@j<=}IB7@c@FVzzF`}P&^DLFd35=m3i9zU)6k?+i3deW= za^e;Pr|YkS^4fM2$N+U_0y>C6!C`^6-(I?W@Z9-`>7ZXszM}}dX)u(~-}4@AjeOw_ zLxD?G?yWOKg@Iu*xnU9663uH0=CL02Z}2`Kg17h3?7pZUUD=Z3wim^tUXgs$xnALj zwGF*dbo0A_8z_VhMJZ6CXIza)#h@Yn_=;(X zUOyY9nwpyCdLOUtGV4&gRBq4GWkc-oCps~Z1J#L19~NLMwAKetBXSPU2@F~6QU3uD z^Nesi3dFx6<})}H!H04f`hFbU?6WsY=DsKf&_W#xy<>qD6~nKFpc-X+3r$@js{vn6M_e zF7?KQGgtcgE$XWfao?b9d+6d4&x*FN&m(JfA#HG>vPAh3kgi&*Rlg)K>7>RQra!?8 zbzmX}o8;F=nX@rSDMf(!cYXpe0MJaGG&ti(-IuIyubfa}sDG+N8d~~o;lhP5UsqnI zJE*0N~NE0-z^JdV0~8y2o$&z?qYxnjhSS$BhFb*M47wG#AyDgNQj*TZS{iKDSPLkO9?N zPW7tX>TLz+ndM>zuinFS#SrW*Tj*dko@HkEBx|y3PS(#%Ep==2`N4q+n>be9sm9oxnCLL9i#DK7s+c zX5r_2N547@NY4;DWzwkt`d;<4kLp~^fw!s1CEQ9oX7}GHX7zAjeLAN4jW5iR(tEOf z##bz0{1Z;b+o)NM(Djm7Lq*{s*?o6zvBnv%M3!x@y`%m$e>w}ypSG!^B40r={Ws$@ zT~=ovp;dW+fXa|a%FtBHSiLO*EgjYmWKm>8z|i59f$r|^3*Cq^p?|pKj%<)vUE2Ua zfNh=EoP>D>(`0~O%@Et1Ciog0GsWIKI#^rP)f!nVgJP9zfl;*!|C}xmGj_zd3-^jM z)f~+SuRh2eyB5ln738V%VD`TK1WynKjE{n61r4Vn3dEt8G>cL&*t91MSgp6q0q zS4_RYVNtgKKqO=wu!8A7P`aKdzc){ z5wTR?J5P``Ki-lt!nD{s7N>#3KkN-_YXi~W*VMh529Pk)*}(i}4g7jY--z>B7vb$P z7wHYGTrS`uQBxRR1wcfdTipDV|8L3C23JiArWT9u2a2&+1G6G>uKqr0bw@i#(y*9rBEBjReE#FxiFppqE^z~ z=-`}t!2;l=ylY2^KP$ra_utPkK{1A(0dxxuTXo2*2JIm2UN9;Nc|aj9N;B;oRr~-e z<=UsPH!2(h0FvQ!RwiwY3rh1jB8C%NidXv_p1fz!+0F{V#CZ>mi&WP`_-@3*;e3|0g3qrO!dIP*p+>=Bg|NO>r7AVzj2C6FDbYV4P8@EO^ZJzVeK zf4g2HjGfW=7e)!x*MMu>H?Ztz{(ZRXBkIaFER%=3ZCUG11wEvaLSf|)aE%m12JXWJ@yWtTJDXCZ z{DI$I#LSoP}sA9S`dbraX@IIUw7fMdq3u zWD~&XhN?v*b1?m5aIML(kwOK@R69C4jwW8i_aQHO@Vrz|{A{!pd$ghbPwc0lk`~oD zl!?QSdGOsex5Q+NxKTe>Y1fkUXp#$D58F@i2#R4ygGdTKi z&Cgz_gE8IX*IQ&Ei;er?HT-O*9C(3Ac5%l1^ZW`unR6Ir9gB(>Gyf05;y2ZBTKqXn z^fkkfEcj>#rTB5k6W6z-b&ia7DsTlNTj zXo|}ymkx+--XbQZNo2ck^1^4Xd@*3h{fDdxGf5L$>`z(6e{mGdXG5s!prlrNc`yXU zgPe!e`uJOrD%5S_#->)olpBw99j(8hinE>S9b6^6Z9YSNCq5GK`)R)=a9KnAJfLHS z&CSh2pwo6CQ-wAo`E?DazW7n|^Y>=!nirq3?ghM`@0egv-t2^acml2{Lm*<2)SMti z;G0B>*n{Y^^v^#}qVA#X17vcBj7<(Q>65*}8cCNA6BG_!+nS9V{X5jjXAY0|U=v4F zmgQqU%DKp6pSXo!ScLrQsd8De3Lz8fgtyaI}f%p}3 z_B;)A@|P`J#;frGC~gl)Ap`us2j9JSk6NM$e6_1^CM4AW2EULI$w_Vq zEbeV*W!n@9EJS7pz@`SzK7nbM8FVa!uyp3u^%nM|-4q_`Lyh=~+ywRW0ggrh%u;*u zcvKL)5fVr!WmKZh^ySgHhcK^mSige&nrHy%{cs;-@M2T_61c8sLD)kuEy4Mf%V?N` znTl}u)p{EJ)Q4giNvsN;nSy>kM>wK6c6n~Oo9v)juqK-aiFI}@*cteGoye)>c;%Z? zs!n;J>wAT(2Q*TTfCGt!A9ZvIPE(e3fiGzlM?EBdCjk29MmhW2q#(<7;S-es`Q`%& z{%ApR{00XuMs(|ao`-RI$A^OT^H=*vH;{rsZFDpJ6GP=v=uX5U7o7y#d5eDrAV3 z8r8m}IOEp7IX$5SZ4JeLm+2S0&G|?#bpD&LwR5f+ScvHxxoHS=gEANm(y2nM2-UQJ z&$*kUyJu~Yn4sWUdYTy1w)O=Lsr{xjg0T$&OP!VECyPE?+O*WCNA4mvfmQ+%y3mz| z{^TXbK-=DkDtuZo#9*kPv}ZBJR#W}W8{L=kjP;bT?#sK8$m6kO-1VYlCyYiuh7 zUU!-%zk5~W>93Mo^%E=dAO`UV+5a3`BX8gn&Ba+u&S0z4dlFl~KVs$gFJAolHHf)x6e`ir$2p?B4RL@5N?*Fmnl?>~$WIbwXJV>S z+TLRD-A?3g3jT`nA24~MZqe}=ydRuY!b*J}x?v^(wWLS+j+tDlJ)<1sKzN#?uj!CM z9Uw*3Cy%WMpU^NgVcZSmxKe~O*{uC-6ADn|Kr`j=ieNfoA7Cm{cSU~3^xmrG@!&+L z+vZ9rSTqUf(3}p<00khLiPw4K&kBn_&XAUG4+f!b0&Ub&APP>c(7(&UWwUrlw;O&% zM+y0s`VsB!UsR72fpV}MFnqhaI>mk*1kl({g*LlkD>uq2!4Q+c0Q!3e<{4+j~9%qVl1^K2*zP~4Wy0w;sk`6vOc3h;kw?9<6ET`~H2 zh7-LUc?JwY-!+GnVjY%$i9BGSA$(wC3_u>#?CU_K#wMD4yZbXh8-=+A$IxKKqpOtp zAqKW05h>;`T1rlavGKoJXHmm5xDY8GOjNj0F+|cT^CSrC1)V!II+;6D+_2GfMH>f>b7nvv;?In z5X=VSrc-IgOS#-LF18RDec20%#ihbat^-yH&1tEXMgaa-%%-2yfKvJ;qHmQ8R>$71 zF01wRnJGuDQERo8iBX?fH_3elt4|VHTfW&Hi91%F@9(refAdrx=uJ<+(WB8z3SfJ^ zUmNbdAgdZY^)slGu0oldSM%O?rwdccYO{?85_duliRAcx{6iSp5~{K|@|Swh3wi@X z07Q(8wxXcEuB$UQp#)anEu^ys?ZE`<2%7#lwR(V-LlmZ~=IMZrF5>d9Fl3!=T`_8& zUXk$t8`SXSO-Oe!M-SY_uGP331!Sx9AUk|)O}l)QN#hR@+m{d={BBe;??GO$rg0Kap>I{d-*H)LY{Myi>67v} zyH_uYAvS-do#M<#ag8NC(qa9abQbolEw^2dEhEwm;H_ zYPBPQ@tDCy6Q>4XZD`;=nNvvia~?q)C9+*{BY2c^wbkXzmt!r)Qo+FJf|*r0YOoZ;uuVqp5+i?;ZwoG7%t zfs%_XeOKg5(hy<@Z`->*9`x6Dn!J^tILy$xl+P4^UTd;0X32^b6=VQbw$a`dm+_z{ zSD_={UzxodQ=HH}Hn(2-kO{nv2wbFur=k`JR%h1}C>(dpF-5hhBF0&OH#txN63404 z-nU(C-NU_exWNX}e0jCEV;~tCqbWWJ%)73N1T;vnqhIT`curI^W9vNB99J$2FwshP zkP&zjZs(u@Bv&1>c;217?KtRHu*7ay7?b>;bOMcp%B{Y421RVC&NgYd57MDljju|X z7!b4`@;*yeIyem^WttvqajSv$w6hXD%V~smC7fom)a`h$VS;{)N)WleRYI8MxQP^n z^oK49e)NRbK%U?nj46r%Mz0Go$M!uR?Zs>#iWD0k%+kvJ_b*qQyB4&_-3qp z4{%Xq8-DkljxD2z!FS1adwxM{lHyRB*sRSaITy3xV2xN zc-I(jSM}U}@;?)Xy+sBr_t1fdQY-rqwOJZv0}zFTg?Nqq0j?s@mf}9kW`O{%h2q5e z%9%o{D9P*q3=_LsJXHJPCao5^jwLVqG*Zg+h0_J*hCs=gTVxsaPGb4N$##d=$C(IU z&}6sxlYNZ_?JuB_%;@8I#0TNJi^42TD1!Y#22@dnA)m!@e*88hP?gxi+cHDFf- z-DIoY+Hi1r_;!c=eE-4F-rd|H2WixsmZAIcfaXU2+@LcrFMq8lfx)d@g&jBtd(qtD zMtuiNNF;t*??8TjWTrFWKz>~ad4~8X=+_-$ubki{FyU25{azK6x5Nv$9e1q}EFaoC zMzh@1cL<2(z;ubI9@g6Y=)<^Jp~~a|V1{vO9QttC+k<(ZQqAb;UNNx_+4O_6=J-?x zVU${zgp<*Q#PVfi^*KAG5)Ut_7_`NgQg;454LPAVKTxso1nfMf}A7tq?{I&ZLvfpf`0V zT;j?ufV?`h56!$SiX|$zsV%|dKZytP1dZguaxi(8*tI&k821!v@7|tppGF-HtS0(|7umW&Wz%%Eyl$QD^$wBb2)20@v zH)_o@5Eg(%oQ`I}ul_DK`Xsu-07`zgMn;;0RshqTN`3988E@biLS@lFhR%Ppr2=p2 zR-79#8VUFI_Fm{lxFvhn+>+q-6u3ecMKQGSe1#)C!`%Vv&K%%K2 zj&}p}BKj)uu`mb#-#~Ff7!?#JRLIkX#OG0@*&I6f4p_iWppXFjZc*ttfw|pFwI(LU zp2s}$^TUc>s*$n!cA*Zb6;Sto0Z~$kAf8t;VVI{AJl6#RHlg7pn*npS96TZIl*XU9 z+~gC3*^8i%@el9GKR-V8u+;X-OseU!Ph=J_{WTxA>@YP zFV@sbfr~uH^xIVbKE`4cP0qm2{}`X6nBm(M{IU8yO_0#HqZBv^w2+R#a8I=oCh}k} zhQ(v*0S-?2kbgc9n$Ek-n%vW=KRNWH)v^=pndj(0e?zxIdol|A@=$OX0UKPW|5G@> zmV5Ey#TZ6td7Mg)rO|Ft91;(jarf{l1Q%g`W&`PO20_R$v{-i_cS??ukkm5!2y z^a{IWf1n5n2PI78w|C4hF)p4LYZ>RGaP=TilqR<}5?6Qe;~LQ})tA;qm!Bf2g&)5C zN9e2-Xv6`yuE}@`by`aea_GiezUe@lm@mgeB<^ zR!Ze;lRHBlfBN|BUB5vFWA?N3(ZkAZtPl;U1G3~F_5~zGluX(!dDZTWF{v3pN5ZK- zv3ha5ihDee%FrNfoB46m5>^}LHOfFnF^tD;j87EWjAs#rW_%B($MS{w(?CTUhB&_? zAeQ2>c-HBk3QQR7sphTzRWk_frQbOhW0rer;>HIuH|1ookhLVx4%Ts^+qSEs?rrQ@?QFs99JgB8H)ZUkvCO z$(?td18>lkK#At(BX(zRyQKGYs=NQK{rQ{ixes(Cw+EJDNF|#^mPFLeK`MC~jpETn z+L{0$nh+lP-TUEU+hqywQt6iu6H|m?O_R% zHCANCR%T3_l9A1RsDJr&i5y8zNUsmJf#;paRRtdwoXld(moM(AP^!F;m+ok{8 zrBl%UCy9t?-494t_NaGD?yuY`oAt-Sg%@E;LA-Tz;*wCc1UihUV#7$KvOR)Q0_eLj z=laj0yGzZwxvEPGu<(ywgX6PH86Iw8E)M!_S@5Jxz9g~-To7gTE4@7461$eOi>VW# zbL|f}GGSyT2M7mP3o74I#70@JT389ch6UCy_xBp`EId9~0hKNJDqCNQ!0?8o6dd3F z1e9Bf*D1%mP7N$V(2YAI3MbEokZrR@$4+j65n8 zF_-lBKm9p>D5gVgoO7q&GKpab~( z`%LnrPTnbZ*k;|_-foccHisTM)0uOwz>%C%SNe>n6+wkVlL4}3cp(H%2T|E8DDUl= z0eBdfsuLpIQ5No5(1O=Uqp+F5+5hEpEiVi$h;Ls#p1gW)tcb-89Y$Cc zK(!@W6*C}d1h&8@PBm^v^{?$Cs&=@kAY1zCCK}(XHeX@wP-t2)`_8)IyW(jRR;NDc zBY#R?d|Yq$So7#%-y2(YoycMS`|mYJBVX^j|B!F*t^2qBk>Xl zWp)%u&;~c9O)H$T-PrqLlY=whMp!AqBpL!RWJ5VPTxStql}O|-uP?6B@&@A@Shcl@ z&(@VssR5_}lAETiH^}c2!>DrQaq$uEP0D=Ti$K3_r*z#lxr|4SI?J1)CO?JBtwOsO z1q%9JvA+s^I5HE5PKaLHo@zyIPHncpbaTc{|wam9~bALvk2!GXP^YTc5(+@vAB?zhOz zZ$B!{4K3|0pok~TsMF#o;zlLl-BXrq+lo}$7e{@ZIBtjtENMv->|3`k3JsV6il#o> zJh%*jn-;FG3ri9899XOKCf+&76b|a@r%rj$PVTUP+hBCHmaiBvyqW9jMIfDfD_1Wk zXA+QGjuXGN2-3j~(WpRidkpt7Zu4V<g$pl%XP%eXGTLv^6iAksw6{yu3(8|s*r8m1&yh!rg5&HC zWpjUgV8N?;s`|WAIo#OAXT)bsFr<{%D#gU?2b)ylvK9$O(smvmMGWIgz;x144x;t| z`cVvV@fjSs)0|Lo)+h(%d9@1>9ut4EA6k=`d45Q@wvm7IgyM= zZM;rP6K4VAWi#z9lf)@@6Zw7LoVNgDNg8R9A$C^ohhU)0@{YZ$SFPd$q~|!5NIokF z9P$l`Xb|SbDYdh+Xw7@OT8G5~1AIwKoZzm> z@e^zfp=F63ec0z%M_jD!LOoxmo*UofHtT(a^GcA3yfH!S0CTFJ{5dP2`}J>ht(kfn zpek0fRq6LE`si015DZe-6Jm=g`pz!B(>`zNZenyxN!OS@bc2a?f?a)LDEDrtmA1&( zn_n+p8tM2UVaXJ@hw2qV8&`PwtqRe@k)xVlF)k4?xEn2Gf>@b}_f+lv_a{;>?xG%& z6}IJh8f>rxue+g9*0vX_Z1svN(eqY`d*64;9aG>D4N9~UkaC3(DLJA0Rp)05g(Y|T z9H_Dex)H`ddtLA{rbqH-5%-*&hycNs+b$z3W`_XWvF8h5&CQJsqjiL~pEX7+7{ia3je-N{O8~rPKZrL?9#76!Kc0&sZP% zUVpUUhWLpSCr&}5LA;gV37{>+3HEpjH%dOw4>S1eI6}&gBxKNF6r9r z>ES^u!dO?SW>&UktXjQ#PPkP!%#EEgnre62-C*$d90P-M($dnB!#FmC7jVeyx!t+5 z5EDOHL_FSzB6tr2lh-#~aMCOf!a!ua-uSkLK{Hg)mXL*DM5z=|P|2M>|2%UxcQ21a zBX5Gv(kyzbr_$pJ&Ak6tQ1}_;ixg&hn@47(JcO zAau~q{5`rTHu)& z-`W-oRgt766wir*5BO`xX9m+0)~hg$lH3Mr9mkp3AHSq#t#6XyW>~7i^v%QKjE_c0 z{?^Iodzfag@5=I{Y648PP88yj!+53T(3zD?^_^Mg;)`?nOfi5<^v1WMyOX#ep@6nh zBAu}$3=O`i#FpK}90gs`)kw~-$;R`|KohW0#FCfdv$GhO{ftk?J`sZcMOGGsdAl%e z&%V!?uZFYe!h8&zgH9UZU`3*_`JP!1a4j(!&3Y}6Q27q#RY5TYj;<^`pMNF{<4?t) z*ZA?|YX)KMfVc!St3=_oO9I7;d$GAhIswbT(Pg#&gNF}G;4AkWIR82S{7H4!7{a*m zHmAmCHC$tey^D&`ks0m!6%q$pga6Z`q|BTmwwYK^(O1K=NlZ4*1Q zRW9EX=EF$xE!`^gJ|{+Oz{9|={x!0Vx3=ARfxfkMjzyxgm61>H(yREJ&Yov81Ny`p zCZCWQ4<_lJqSs*+fdPY@2LZCctMWQ07d2zbSZ&}I*N2sofxodm4p>2zUL7iZOE4Z; zR|#3elZU2vHeSyFlTfGzFUB(~*PeZuWWm$jO4+Y_K|-zggXc@pv2WgD&%xwAPPF}I zKF4c-oLzg@?}Ik(nI|k@X6qQCOFK@6soBzY51nrYgbtDT70Q7(XJ5 zGGduYZc87vQoz1Gjh)K?r=AlKZ8NG{niB9q%N9I=pJ9wq7=#G^_$m^xEmG&Sn%1!= zf}@vCeZ0u*4xaS+?gw#@3=ZBC1YsdddWLp-!Q#?FwY}Gt>jD2A=Zcb-^v9I zXeA9Dm4zK=?43)`I*%W=m=Q4RjRt{5k`~sSgVH^Qk2m}GVw~f*ieSbJa>)PIibOXo zx57yR71jRe_G>pj8nj!gpWE1A4`B?Fu4kz){`g5StFKI^H9?WXKEzicK0`)%@~k&! zHUrH?ZGw7db{QPo!SlMPoHw>K{oXw?XMGL6c*;iI3~Y4DcD8+d5G0Drsyh3Ne}|B` z8Ld>37%0ybcavT5oHvyFaD?_BL+j2HoiJ%f40O0#CPfYo_c_2MnaDa}{Ei$Kr&}C7 zSHDK>q#qg4n+9rzbA&RN>3*h1i3P2dZNDiY!ub>NzTEN+J ze6i=iW8GPnTxK86zeex&trch9J&NW4pFw_y?FrPvE>@8=P6fnmDDkq)eAt~_sfeUN zZngMFd1Le?9iMd5Gl$~t@NBtpXbA6trSA+g&Ie`{uhHPG3;V5QrI9o7+resgf4k7O z2H)8UcoOS-1npQ!Sr)+`mQ+5&I4=x&8MI2hT`vGNXRxX zezH8dnnQbwgHxbdZrMoN2ehnsv0LqVo-Y7pRNX-U@h%J%t6*m4V!dQwO{t&vOil88 zq=xK-(1v9S6#vLID~x}pKdleV9k3byo&k(%jX|R`w88+3W;uBqJd0q}BhrLnMLA-P zMg`tPfiY9p6eeg?dE*EfC~F~=<7>+zttFx!p{-L?j&Vx$XS3v1(w3{&g+H8y$C9Oz z@dZ%a6zT!j=_Hq#?gi6%AO*+ZU#3J(5^{^Q+P&b_5mZM6)$J7%n|YrDDoH4))5*12 z;UEE-x^_-K$Q|o{B;5OUnr$WHY!qoxFhNx`LBT;F6I7$;SicojTW<2(rzQYMP8yN; zifXs(WY0~pqRl>a!s!s^f-TOWCEICa%7<>2q?Y>%&ZjV@Fd;4juR()+C#!7^C@AC2a+2wjJv3F3}m0*eZn$(8NzKl!K|z+FNdM@XiiN*j?U z#PCliaY02l7477n{o~^a7wuDpL)t}vmXP@}WLdv?3-nJdKw-|~@Mjp%)Aun<6!wUo zj3QV#>IXm_atIS?8{yAqO37izRP9@N`zho>TKuWzyBYJ2*S%1h@<3LI_hj36bMYzG zJOc~^PeUcm*|&Dvwrv+tKamzjE|A;=gx4$3n=5#E}d9mm)yIFVRhHq1G1Ov_2}Em zm)5OxD8Q;zL-p=A4UUdu^_4IlK+{+Tfud*BHH6xLUa`K*g7a}cb1!Yamny72kKuj_ zBX7P4-T?2xcyJ-GCi@VIK!FG@K-@52h(;7r^Ut3pTnDJB<+&DD9*-DkTzDhm?7|W= zTH3c*(zJ$RaO7T~&EIdGR^T;Rg-t6fWh`ut{4b`;9T%S-Qu0b=QX4;iH<3qdq5C>2 zU&-6Y#fVS?fHGispY{JXTYYU4>CcQXJLc@R9~Mh(Wgo5a)Uh=|#~~fV#Uct!a=<>M zoW`B;&!;f6crWloHRlY*-zWs7$Ti`6+YF)Wm9)gb z<*$x=`*EINGDCZdx?-&Wm*NX(qxt(`KYr~-JooV?=bofTI`$TJp#@w$=MTQeEGk?} z;K@MP_~F$!JTVx#e|s%$4t_S7F0-y$gj8~crLy-&Vp02sZ`|o8Qg3~L$07QCZ*}gR zFJG$ao03sGN?KyZk?nk3^e3K~q~%Q2d8z%g^)hV;X#0i2#O?d=9!N48pIv^T;!wSV z=7nM=M*qIhx`_b(+i~B};a|lyH%7xEIZVI@>I9QCpFRcIXs)W8#Z&XtN*7y+x&}Fy z@lK1N_3_J+HZAfJ_fq;?E`Jn*e(RLf3#6Y;F#6efR_yk`<{R;CIITo%n>zx;mGm0j zVD21H`7U&{#^L{Y^B>0wM`<+?&HIlWxuxiU6h)0tReEapS`QBoa`kVWCgI-?6>FuBVrVN{eyi6|Jyx^sOkV56txbQLP5{~hGW?x&%sn#Rj;y@FwF`^zDC;Zd#jzOP-c)JsV%BJKbHDi4 ziJTv5n8J~nSS%+-*fgeI{$Rcv*P|F&)|MLa!p+3pv8nyD1uZF6Hb`OQmdY}x0IDi) z-WJ$&S@2ZCUJJk_PxE)&8yEWH?>~vHBE`p!1JW)$IyM{6yJOX*?+$1m!~Xlhw=@;Z4( zQx*77v-`3jagdmH{@#RWA(^oNC>VDZOLkmuN;hXP$Ric1=mT~t1oEZmTN$))Ppuwp zc33cYyUpIbexsop^sb5l0md4t81XWblm{aN?uefVYoGqTHH&7%=+(6Pn0_t>5JFsOty}ZcU##*tPMMFffPgm*791pF3EvFVsa=TP0uiF19c3AwvJ!Lb zHLZSrctP;N^wDsy5~mpm>|a3bTXb(=^Nt`P9DfpuFE?Z`xcfp)EBo4kt&{TxASLdI zjFv~j@!-%RhJM4XDbihBOvzV3pyD21x-rBwl9uRIVgJvxgQrP43Lm?`|<`w^LYKlFXcP0rOQ^=jt@l+;&&gCoM_ zzOJauR>2UeQS9gj$+`C=u|v4F2TK_5ZJQl}k{j*Kif5u(L-sSZbsl|b4g}W&a!b@= z?no`_!;&gJIRLzC*L*>CIqydP^RGF<{>H=Qhdw5gi3q!r!(>x{$8;J(L1)iJ_i!$tY74%e=p50!za8&J-( zmQR!-<_(mOa|tGb!A45=vBL!<`2-=Jw!&oP_6$IpWLWi9TQUJ1F1oB&DD@3Yc8OmF zy!xu+=IXYF5Cr?UNnVB*OXk_Fn4_j(p_@iUltyaB*yg0N{U*CCkXY6Hw_P^psy_fo zrqHXcU|#Nr7qTZRE{3iFRyVdZaPh~6YV%DwV}GQ7)M{U>I@?hTMd1^7_r}<0^d&fs zj}Y7xU>Aja=wjqxVz2kx!tG<$*A1ux$hJ|VV(f~94^5Suw>gsUEXMg770|^@41W|s z(JASyOjsHSD>d#N>q;|>9c%cx;KqcfVBO76@lJQdN9T9-BF2p{Z%wB)d(Y&TYy@Y! ze5;$tOE3X8lpCN^Kpl97M*0P7rHDBP0UvtnEa_vZWQqu;(}4&GEC6MbDU^p z^>$p)xWq*}a`@u{rliPZz+@mo8DD#b;SEbbJFIm%h;WHgy(6V=I71bGy!N@Q#(JIEwfCl+iu>w>v_RC~p^S#Y6c^lx8J`8uD`Ln34VtQ*RGIrwD5Q4@sY3Zo?V zQFOo{96#zyU;di@N{u}|`+-eiD4!H*A-Iv~U9VJe8st$Levg&_>N{5kJeVPyxBr6h zeJ60eYN9rY5CBSB)4abQM~X8Kce0Z=^ev zT6eYg(`wni&dDDRBR|5=zI%zN(jLD9b0=E=%a;RAM#pfnVyRP724t?mqkh!NToMEW>9u`t9=Y;(>(!_EvjLC=4 zQl~_wqA4Hf8!ID~hO5|4Xec3&kNTocn5r+-mt zTP*i(=6eEaGb5x~&hA^cZ!frx12x_})&+Jtm_eBEJ-g1NQgA8uab=G=0cS43s zRPd@N2owP=_a(QGPHov^Be4D7JhD*hYw?W4z}VW5Mu;~M^~AhjV&5ohgyC9 z)|2nfmnDzZ+ZDYgS|B>9SdPWw%oTeSe10Xa2H7G7pDSH#E$cmFDvldO%%gXM2M5t` zu#_+QEOH#|c_OTMSsGrmZ{G{@MHE1OEl6z-L}1{NLc&})n^5Y;c!1Y*VyiT{O9k5X z3N2f`=pGL6YoNo~!-m@SxGMN$ytp46K(qMhE&Q1C@dl>=BU1C- zTI^HrL{4}#t2Os^JcoAIv^J?JHX4LJQ~nb){z++DHrV#DA$gG77Ub!<7BE3ju5te+Eo6q8 zilYJt51zw%d3j?TGg^+M_WR?3?Bf!sNGUTy=B01YX zK34}vEJK|+4nPBg!>1P5PHdY9yVl3YYimr3nK5O@3|$p~vh{cvNNDpiCZ`a9)H#n( z5{OE@$6%C1<0o%8Q1lw5)9Xz8SMb^@*?0_-_o8qGtkAP}+qjscJT-GI5yYVVZxb@yR6{pOYyez+R_ zZ=7?PY8e}i%g7Bd1JyTwiHu#{9NUI_PMZ`iNiERI+O!Kb{Q(eazv>kLA&g@B%|$T$ zxA!_ZE6Ag!gaa%|zH^r~fxF;)6qImS@zm8_#@O;%+u3&)=IHIpKVaM^6LlRIOh82R;@=Up3>!T@gMXkq^fq9doA}jTb-u;mZlviK1)7in%^Xt!XxpI8 zv-l7gmcT$EsMMFB;M|9YuHcDKjh-|^hP>MlQAT(iyiL&y5G6T5dqxWs2=W9Au0b_A z_ERDh%@F?v_CR6lLaq!k>quCIVJ>5FP6>eSy1M!OdlAAFadgO3BY1-R1Q8K`r|zgp z*G09MJ;;i<HY{j*Z06MO;pzjk9SQm zn+k#a4H>oB)bk@Kv&e;Mu7lDYVSx;m{DN90P!g$;jT*ONBgtF7k97e~oj03Wp*s@= zIz>oxu>pqI&*v~Va6^hQ4AZ7#L?;yUL@!H3j(?Hi{V-|_=5fhv z`g5$nvPXB+a$^hY*nF)Z04Tx9B!2FQ+j9KTMq8Nwnn zL8HQ3{k~cgme6rW0N(cdzT)R@9)xOm$9{kP9)!kuac2SPt;4%{l9vK7oz>dGQUyXy z(9>+1xCTKinXkA7isQT!ZHE>JD6?Z1JEp-k zwsB(aKC=65j9prnBfwW;380Zk8=0rfErQrMrC#-hD6|hB?vHQ)C1fp3MREF>)L}hU z_xe59#ufK&{-k1s57n;x1x{=yavSjj&JP+D z7@a90`JV#bmBTAF*8qOt{!P}S+io8~0QjM|Ivw*1+G!hlbSx9l0w`3X0b&j{uhVg~ zX=^TFCFc9>KqJeJD)L9DA@N0LLx*8=howWB|ju1S0~Hlq0u zByKk~W%#%=tp})Zi{uNk=3Xv3n9nQ88UqIc#4a1Wo%ruTprrL7P{jiP;(2Xf z#|wZnnTeo!@mCJqbmC3x4$AEJ7c@UY+p!f*@IFtYPm{S4!e38NCo)kUWumJ^7_7Q> z(GMwmzJ3<%)~*&iv;q=HA&G+DwOF)1EnH5ZP3>i{8&W?gCIOdiITjG894xs!SUv*s zKY_02zoMxT2aTFPq5xA|Qa-)208(;lg;QpS+gj{ucCkKakI6p?t=$Z4I$wFwM(mbz zV~Lnv{_9cd2~8@%@Q=p@y=^wJV zi0G3|lEi$>0Stz_KP#f+Yqk>+vk_}3S~s=`); zhF45@s-+;!rdg3W0%SM(*)4gv66fBx=;7c&a%1jg2@+y_i1ru!F>=&cUk~l?cZaN4 zJJ5%*)Of*r;aF&ZH~70Mxil6j z9Tru9J(z$*@yQH+z_lPNa77bjOmvl;GJ{pQUTuqg4$L|q5O-^`qr6h#uZs$Ya-FkM z-RGL)P#vOCC9zOm3XPRuoY>;G1h_11(lc6h-wqmFJ#^54=oq@7 zdE|@Wulurb7Ul)^i2{Bg@Vx`8P*>x51}6JjSFzwCjGyf7F|RSnUC^*rkarbMpa48t zD$pS`#ulnAGjc*M$GToGOALs3dtY8^24+j%NakB{BPSN-7v6Wgh+7XNu`L#Wtp!OD zF+mft>O~!^K%jx537!c-Z*Bps_3v$Ho3 zufS&Ce;C_aS%VrHW`9ll3pmk&mVwK4Q&i@=O18eyXyaeC`#ppgn1Ggf3BdLW#31m9u3oEng7NHOSp5nzb za}rnNc3KrT{8v#tql40~178m<*5H$ppu*FIR4a2(W7nB2X<5yn(&tns#_ z+&}iJ=Q8FZW|Q+=#B}Q%jex{=4#Cj&eV?rV zE!*XGXvkoqWh&t@8-Zq+oCtzzz)Fq)ni3wE1oO++5O9TKYPG%`%BeEJU~xp35(so$ z*3AIrqtzc$!_jf1$wW^PNd;^MDd0Hdmoj!7_*r7)q{omlCc7nykD&MzW6RS^Of$}2 zFQnLs&pHReS=T->6}`l~cJ0r18>#puZf`MgR;~CzEe3EGAy#KV%DM%bWs^00*_E0g)+n8wI?4vU+ZrzzCG` zG|HDJIs5-Y+m6nw0_~)07l80`@M_!w*z2`pJKm$OU%G5r-0qc(kbI!sLx@b>s8%J1 ziADPVfU?ke5XTcU=15Eg$l54d_+;o8=WAKdbgkCdE>#bcnPS zr8h9~VwK-U)IY*MXv0eI1l-~(qm0EJ2Z|+_lGUZ!qQ+z5+dxk~O|1iZCsukL%IKDv zyf+<&r$ZD1SMAs!sQ}5&k3;@${EhJgj9#g39Tu(MU>vMBF|ve6lf0$C1wJv5jNUPr zkV~{hlEWASMFS`DXdZ0JphG~Q)9Vo+mlT;$)iqXBRr&z)AUY<^<6X6sK&U78=dJCd zYtseAy`Qxg+!VhAMFLIb5cbF(wxzPpad!Gy!{DSaMrQUt!rj-XGoq}Ak1SU%)Y8&Y z4x1vV8^664gH00}W5tNVPMMP5|CNM(R1(_FoHaQA62WX;*b)vvZG?i9MX4P~6zI72 zJ9p=4pb*PEr&qV^^?vyRs+SvnG=>7k9LA3#YqZLBgLN7XKZ&0df8pf9&+K%RYFzfO zK|&#s$d#cKCQJ3;%7u#;8$*aSZ}M*?)YC&2a(0YIurK<&IrUM~Tt$qa_1%{f1u`TUT7?{LqKGb-!lE zW@*$nXV4tN(vy9CpVd`i0F`CLAORokQ`B9~BJtS|IPG4|gP#v1ZD2of3cafdmLBhh zd-ysGPpWLD5DK;uUysxJ^N0$1h;lLs2kEp6W&{bddWTNykem8{G&}?weh>`jnH$(-VZ~Nr+-AH5VI6D~xq(obJ zmh9(AkRiCXWNEevLzd^>z&?}_yw|<=!w-^4bjV%PaoRGmy_nXJ0N+ui%%*(`1N8To%k=pVtLj9iGwq6b-ILk1^=h&W}k1J@jUVhWi;6Ruf= zn4mQz!g2_C9s!P5!VHAppm1Yi{Z=Gm>d*P-d48f=CK@(B*+CNMag^}!@Wt<}5fzTb z^7zw{XBEL^IdGlC{xBL|j|b9S(){1Wp<#6JBqe72nN*^=(&7LUsn!fwdV$WnCk-eZ zt!5-=akS2i(GAJ1@E3D9 zM;{8;-9*+(2B0qbg($n;0V@oiqvBgO)D0qOUGhg|?f_$wGy$ ze2KaQy8sn*;dQpI8S9}#zCO{pGng}oB#_l{VRU`K5v7s@!BstW)AgbN;V_U?XyFB| zCs#|Jv5{Ii(+4SlRrMEAN|Mo=+ye$9eFxAgr~(Mg1CmLzBaHQ>@pqNMGJA?ugm~yO zsEbcS-UE#LDTX|tYGX*CN}44ae*l6&ou)xcD?mQKCP>N1 zA|a@9uklHoh&=o52=d&p)n9JLKq`@}o32jrz-11|pPfMHL>Q_#L;OG@x{%EcnL#18 zoI+xvdK@da)yQxW`HqNh&)G1O;j4+fs0WT=|IJ_yYP333|A+pUZagF z*2~11>%H)`h;19y*NsXl8pP$(3;y_vNPNl}*Bx-u@;Vok5t9!Cg#_5Bk#9IkEGuE! z*Io{v@kFh~4Ia3JXqknha{Yzk*sis%M7??Fn>}20Xi2B}GzcT~`IfErAxHrdAG7L7 z^f7V>w?y39E{#zw6dJx1moW2rjj7}}@K@==AS{z-Ho_#S{DBo)g2uB+=*m%08;kK} zmCDt509W{8K{dEFKXbWwQ~^R_$yn*!Fmc~UO$0c)TBy~|qKr_c#sIJMM+FQOj1ZqD z;9|`OCGj+@-c0oX`ai*#zN^A`N*d3A4t^Lvd>55LvoSgGWW*kmHdB77gBZvxUB_`z zdkZh3#8tccek&?86F2A~8+%PavZ~}zUq-&d$X()QIfwSZ5In`-5iFDtq5~*xVWhk8 zxb$J;W*pI^fF>tJ%7FqzbZ^XPUn4CeI%vdJjsejt!KIHufATr1AcdX@&QnTl6YFlo z{UTBf(wJnxn1qd}j>1toQ((dWqVTH@nhae^S`nJFaEDTT-wUb}PffB#7^11s!Pyh*Va1UzlSk&mL_T+ z7C*iLtA7L2McNsJM{y!0!A~0(9kaey#l-h6eoj&Oiw+zsIe$JK%w(f61l$oy@79pOkNy}M%_{Gn z5waCQPZaig$#ElmP9I6PdC`EL3C5-=K%ypXe1M?f2rOw)ADo0s!BcG9gj{qtJ}$)z zG?QyU90sp2%xG~a5x;S+=J8AWpMjBy0xg9t^+g2O%fXRPkj7rxAOylkc#S#tcBpnh z;@tRy{W%!qlfwXQyGRNep@4BadR2bR>j?4z2)hTyoitqpGXY+>op21Kear~gPhQF* zsvoGiSr-Hh_yjos0e|+mQ~=I3BuD===KCEe(re*wYhZj#ByS74{pg%ryNXbi5@ZQQ z*?Za+1}VfI@V!ZfK#VhhvV^PuT0D#;sA0G`dyr^$kMBSK&#qlk$aE@*aITg5)7lhd z(e!SYhQ}IxOn4RJvA@DAB)dt>70G%Ulz4Iql3xy8GHX5muv z?4>L?FU1hF1wViOd`()t)}o1jQ*_(n=~4vQ*;@Z>EN6oXB3ly?ssvit51U#P9Qizx zQM8(fa<%MDx=qY>#%}0mL~(D6Iwgc5ZZ1K^-;+?M&t})d13O;gU6~%(47&UM<5nxD z?4D78(dldNMuZtK@KUulo6tecZLA+Hru_K4KWOsZj%p!sW>(>CziiwV?z<=X2qqW)PAFkc(p( zQ@@>^JnM{hkSIMYRr`}8m5#DY7cfrkgd+*sBckLrJ{=tGDwly4a|8GJ8)`8!2$twO zuQq<1=cad!3T4D`+n#Cra`sU#?6!V(sQ{xd;&7}*8=9@lIKNM&Wv^4_3;f$3PyS%I zuflC2l#}8lfSi}kz6YzxU6!!&IK2elLjwe1}Tklk|1 zig<`_X*<>9x(_}YSpEUC{aHSgs@PiqSs%{uY0UFkSG|%$&0T^pVq&(#6GaD7zF^dD zv?pk`v=#pOKkS`}U(adV{=b+TvtVY7t*k@Y*T|a8m`PbeMMPyOq(~?#EoN&5St@HO zrj$@wqD2d1lu%JBi9(T7idJd)z0WT*_xzsM^ZWvi8_>)U6!uJbz2<2;Vzte@h# zvkk^~)9})`WjYA4q>PZy^?6b2j}3umugMGfq$-nND0A0v!hZ6x-jevwz>Uuk^eEz2 znBAI(D;TW;p1Zm+UAyo+l^dnqfO;O_vw)rXnxs^*4Pf zcQZj<$F2CY{gITQFAxu6>KGv=uuhY2Y8NqskCP*ZM83RyP~~39612=daBPCdD%_{> zihICNO|ee3Xud-}QG*qPbxsDLtyC()U5oH5P@Szpw(+```<2aN9E5eC)f_VG1x)!9 zXv;uSJvjwu9vEizE=G&p?sq{uter&=4tRO3`B zwjbB^G6Y(%q9ngG-g{pVBAaNNz2Y{-T5EQHza0hRJ!tA69&?6AinJKCYZ9~Z1k+%w zOC9@v{k6P!V)WOk4*f?U*+#lmw!c?r=nSXnub)3V`pThg!N`$Qe;Gh(ZN?qQ$W6(u z%YOArLfKdn8sfjvM0_LhE6NQ1F5x(BV)2RwuqrDbbapYzTgrgAUf+vm2pc%@EgQs{nZJAGr_bAYC(D-O7?Um{N!6d$ z9X=K+nzva`(yIBEn02vnTky)sCE48v(Wh4Kx8K-rbU9R%tykD- zC2NMP*iL|w-1Z3OWvJ7O_J0=c+MB~8Io7gq`h#ufyV1OEgTUi=5h`1ya)x0IGtT!* zHKkJ?98@{WZ;kNhrHRJJGxlEFSkBW@asLEN@FAGog4gWkDw#BkfBBe6R|Ww8frcTv zB+nO`;w1p2E55Jds`MXWg*i1ddL(BWdHEee-uq_r_JdPM|JZz+Of8BLFG`j= zMM_=q5d)EV?a*`U-IaT^f@$<= z`Z|iw3Gjtrt`TMJhd)~TGQqiSy);&b7T2lUrgwt+G+|4Q=@z8{4%vf3KPK~OJ%j;*Y#}*qMu^ZU1=D; z-b;MYIBd@k_S{6Q%OT$u>$+QQM+jm_E+<_AX#BUmHr1aNMZe?)l&xwz7s%BMnok94 zcC`LSdvS%}V44*6Bx$%Js27P!CiRXzvKAMdIi-PPd?ZD1b}?@gpDsoyH#}_Pan=|< zzra2rp1JOdtG9Ibk zw|>s@X9AU#jFBVLSh1_SI}GKrjR*HhGa82Vxq+W6`Yyl@J*p~a7Pw)>$M5vwF*7tKo*+!0S zPTYr9sUVjTG)4&W?ruEKJ;1f4=fi2&UNSdtN6dp%bC0aM=FiS^2aO$jFR;Q*mIk6l zaqgD!yn7PH8w3O0g8Cd3y(5@#OIP%7sFWngn4Deq%@Na~#pRO9ZFlwO< z?};q0w9yIMA!WYkBdjMvrD~P~@-s-w!?C)Q^ugC{(i1mJ0AZ7F@Ou&1T4u;jPB)(2e)5${dD^m4Pl4HBg2$JpIQSAZ-bu1a_$qk?{SL@C%yxn z=XOsZU6>}R3H@iS+WhuYWS@&iv6u-~oFrvbl2 z$N(vTEibL+-l4fAF zwO9{}a3j_b4OexkNq{Fa(c~O?T1T*n6goMn@X4*OpZ1>pG7%6`=2gnPqLl2}=!EdZ>?xKuVkdaL6@4LgVp+xR4oGXiTwjtU`1nt_pN`| z8FP&VoHPre-`R6^I87Klr5}}zJRER(v1cb(t>vI3k65xJXLXY)=^Sa}@fp1xza#Bh zez2mYIQ8vS?NPS7Bc&$dxHV?^?Vq@56+N%%(zxWi7Z3)-p9$=_CdJu>X#2UYjIkq8 zd`VrDLz5~LMd=#ypTTB(d{A)9!{qb1SkJiHy|F3v;e4;u-80f}*)M%V2DScnrv?v7 zFd5Hix40WQH{FE?dv9nnsjFpTf`}v~AOUBDQff+rii!ybyCH9jHaT&^uy$miIOmqz z6WupOFEQwGAG?MpBY3)BHa3n@WofEy1iE<_x$)Ud9QtMuTm`$KehPxO1G+W`S=T3> zI!VklA{J0A7>T7F8`Gts^i4Y@us0V{)F$KLbGiSwq zSPtyi((udMHoocPUk9EeRQ;K{y1JL1OPf{X&nt&e>DLnrtzbspa?2O&5~~icXQwAJuYRDEJh3up~jeH~@m#VxmViBo|HfS&@GI zI45WnBG1<+1bn_f3gC~lM$ETPp3(D1p5?~H5VW>XiJ_YyXhuo z8shkaD|$)zv9n@lcQ`fxxfEgD2L=0B9xRnZWI26s$%O*pm)}DFiw~j)@1fUfL$29-UJ(nL$jwy z5%O7mg4_e;v%N_sj%h;4@t>xM+wu0BD_fNEW2_Rrw8Y1gV>P|PH{@#72eG7bz#x6w zjV3~eCEH8^C~KXai9|a-@c7}+6cf&|3qw*Zl(Sod4u7^+XOwpP#}3p!ist2P z2mL+1Q%1JwyMaHg=T5texsa7i#aN^MW8V92XFKuE00Ey}TMscn9L(|#wV!tE5GSJG zPi3!(xF!5))aWmWsMc@|HaczN3>7oKIaZ3kqu|(#R1QYTj&5lDk3z9QG9VlyXM~KC zlAV8ZWfRwa0%wwe&Qk~oLT2#%O>w0q+UfBq+EtS9@~`S!KX2EnQ5Aj4742vh0oT6a zf}#d@P}r_?{k(Dx=YJ>x(Ob(5nX0gwlD?}Ps04H?-N^|BD6mR}9k#jV^O|(S=dojQ406NAV@O2C8alyA(sBoij`k0D&6{QtK5$1$l~cteX4cjdWJvDK za}Tw5PZTKu739IP*Hpv;*D0@X)OgHaLcBX8xw}i+yE@v#HZd{3EsswHDCG54$H9EUHTsGZiauN4_y zaG?faZjf6@N9G^yXE^{Y_HY$4OH?x$bJ9b7KH7GT1zSUGpB&bMNn>-Y9!Dr+*yC>`!2)faDB@Y7JC{>c6hphe_gc22tFLf{Y668o!G{W!NX_)@~*H5*ZoGsrgqW2-RB? zoDR#90nUvQt6~GkDg=BW7ujN>!C!HN=lQf(DEeB8Ych*i9UkY~s@X$YyMHS91Lvu? zRz8Do@J77DwJG`zcS8Pd6usez#h$rPZ$uTtgNUx+BaP`QoKI#L;B=vfDDT8iYePN6 z!NHjCC5=^V>rnOMv6Vg);kX)VlZjo(!?*6xB1wV{xFqEu;>+hYgEz zk7nhcBHKWwo9NMS?IIo1~Wzf0Z)PU^(%K5^2HtWCjQYiPT@7d!OdI#1<>^`jp;`+ex65u;D=| zAoG!?lf}%ct>+^az|)fjdzkV~QpqT-u4Lut+fU(9pcz74asklWBBG85eH=9Tz8_&? zh3n_K&dM+$C45wT?@w{#U?)q1X=G6A$2-|tWpzYVX#fGSWvtuN?Y$es0!oq8l*fDC zAE13d7qb$s`CuIteIyEno%7his<; zp_m{P@1I*p2GTy&f(KbH!weDr5l2uOvdCiEZ@=kVuFM4v7A0+=6*Y_xYeb{$-b9Ztz(%8op30=ngHkP)-QMTp<5N_Q z$+=>?`0B!6$Xd6DA1JS6$h>3jsiBJcQy}dpDPX7@cwgilYsgeT`S{~=6FKmwy##tR zXHyw}`|Tg=_Kb%dC&=8yE{b~TFQ{F1mxP*T@B)gkb^08(eT9edl7XJ*lULt9beuX_ z7Ppt!OyV=8)2?IB=O1WtM~0sKUtd==l;QIK`0G|bD0l4t{B{O8mPd{#_FP;|ct` zB>u+(`TwItvk+(jCr7jZBIW1JZ}rh3B$48E16poOt!)pSB-Dvmph6}shl^@4V2*Iu zYY(4)Mz2^)+X%F4Etqfq?l1QWm!FnbDG1zM z6eltSPC81s_|Jn+Azc}ayhLIx?NYijP+)z4?Ra*xgpUvNNhnj$G)<&sN0TeQ$+A`Z zc`!w@CRfB2Mm`sT7tQQBzZr}~?Z>0akuEnX;$B)#Ms!g#fi}KURXtr_U$3pbN3H4Y zL_a*jVGWk2r#}Ua38l3uEl~(>p_rD96f3&uVs2QZ2Us%+@ljACm=X&kRkHx6JK3z*XJG>@o?QDe^e|d=_cx21exy|(n`^Ho%m`BaT0Xb zaq`S7^&sfN9Ts}JFcC!IYyNJAVH-V>+VR{r<;7z7eiHOlq;4WDgwsBRp_l#N8cN&9 zZB^Y^m@E*Afn5f}#{l~CMw>BwqVdennBdJD+pyS}ZkAA0-%NQW9WC0-tBhcX8={E0 zn=z#_9PGLTSUjcoNM@qTEDhDpG4fhaJqv+Z=ncY9WO%nN{L>wtp8E%|8X7N+gCHd8 z5PGm8Acy+7ga$^Pt}AQ}VQjK;w3-uWvN1EQNxRtsd<(j5eN}p&)I{+9?+YVZ4npUo zcO|0?azy+GbwfrCk1*c?28gocZF);0Z{4jYV>*naF$Y8^Zbl()?P^PN(k(AcF~1gH zSrlKLF{^>r)Mn7Xyx!WIp6|+cEbiq3?Ot;rZ8-UI&kK}h!~3tZ!o`V%)F^b-y!rfX zH~EO9IRhR)L{0fS8X{@U3Zeg5u}mU|)e}l9ai*7eWbrnXx;{iDXJ~-m(r8@rK`W7$ zh9dI>K=mnzfCAiq=yYBi+UY_^RZR>dOXx8**i7${>0$F}mm%LxKdiX)o&}U*mCERV zE?++Nos}=_4`_-dpoaFR4;xE=ckl;o4kU;Hp>QgMgpn1b*O~cj$)%nNioSdC*B#Wa z-;+Lb^!@B6^mNlah+Xj!VT*uf4x(Gqbzn^gptnpRia?4mc{6!5!Yx#SViYGH(hwBp zVEAsxy$FM0Pe7;o>Fm*br_$jfu}jGo;ipiWcz2d7g<&mU(OLz5rozxsezg)iWD}Z{ zQ7ifV$hXLt)~FY@5;h5)s%l`%px$UqmUUXTXPxW`TQ-)T#2~*) zETqvVptmxEcB+Ium5-{iTi)LH4~_rNr5#AYGlu2QW;hiJ3 zTP9s><(F>n|KhIh#?rntbB^Y3w$5c<#MZMTmHa+V2$>5Ys*b3_=tzjZ7@2=Bfrh1( zVYIS`-Xu1DLv8tKnM6*9{b_;L-d)7}gQ+W!qy!1Q#^**1tfd#2NzJF>vKcLvZL*!v z$K-a!p-IL9%JEw7#x}^fT#;~^85`nQA%^Ht{bPo+R0!+$u-+9D568)A0YYqJhPCui zT}Q9~p~VWP)K9(|^f)q@?%Hj)54Tu3N$Fzy{&x}gi7Zg?o|j{QdPN79v}~?!S84zL z{gn%xLDJ`74W4A7i<_n}6f?EiE0L9_D|d_a7B9%vu}L^661PNf!>1j1-uu*L2G5(h z)GQF?9=LgpL(eP4IGE^g5Zaqm(R#}DQFo-9L_;86g7&(H(RcIg9*T>Q7T)4wgeZbS z+vHY?#zb83P?2uo$T9< zhz*0k@)DVE7Bb+tUe`~s2c%glH=BUb9chH~#+t2S+4a7?CT$I+S)%HIz^ z+;78sl`r=#cf{`N{nyr1ctc}hN62*K{N1$Mhjk?@L9f>%3j*tWcKU@0`zj{0iV0gM zxq{$^cnExWRGIq#-b5*;Vup|#yuxy!P_b-&7jb{WvJa2Fa=el>@&0#arcKRxD#`f0#xks*~RefiAEXNDPz~@Gm zGP`?WgjpD&a1BZX+Ij}3@<)cvoITr!9U`h0p^)a;DI#LnkNIvbE=muSH*2d-&}j|j ze>?WHKtL+%ay`d91OBeyJ*iBpQoVsKiI%T(Z7sO8b(4e6u!>-#A4!i4ZIu42!Hs~-S#qXQM^YY)#2enUpY7UuD0-U#Cbd~ z)q)8s;%gvvsQ5w7@J)G`hON?Z9F3*nFJoH?Um=`~i=Ffp?wjBmW{A12kfMdNDS182 zq{#~sJIm7HybL~hc;~<}Msl+SH(lPhg71jLyN4oMBa19%1eZbOd>0N<4Lo~>$j)9L z?@9_SF<$H=&&}4o%=UYEUJP6`2O#;EFZUKD&+PqgDq~4xUC7n*ck|c7aCdM$IF2Ri zeeKEFex9}>J(a*n*#0vthd`tcJxrKP3*h2f|1ohN>hyS`j&RRJU`yD~)7VNHx%eI& z6bbebac_3yMc}A#A@fn$_G!YfFNMmfZ_P^+-{d@>7bD4hjaZ!GcAQ-*0fe|3PmYCV zIPm)tFQ&Gu!6IBt!ebywPj!W%qEd}Gy^xp+S+1Wrvx!h{NB(M*1){vjOAIh5m7szg z7bfsSCsSgL($tiX ztMTXm!V*^uU@z*}6B$MIIb5GIF76otZiF>w#q#N27G#~6)lI~?>*IqV_oB5A80IoB z(?}{7crG$Qn>93l-n<8k4}96RYp_g6La_y7=I}$Oay(>g+(vb;yu^tddq%Q#8{Ic^ zscxO{a1iQkVUFm(X?VF zd)TU_ESTzT(G~=0c?zO`er=7Z!njqpyNivsnBck$BOUm z8r*u@EyC_aSS2CY(-z&O*tIeIJ+T_6V6i9-PX}lq?GF~~lRu0G8^&z36rGuPami$a z@(FANCPhe&C&Y6eg8jQ1$(%9eS@+HP7Ae;Wc3&4Zuw#YL?*!v$_-uP;@B)c1qT0(Y z74auu?N^`@);dN>3Bkzp-5MKzN&`IZ~Nn(*8&Zs*CA^JI3t zgg880|EaG;AO?b_h2`vGz}!I9?v0Po%AKYfJWaZszk9`L2yAN@6tF&i6(aqvCt7Vw zC*qlAvnX=Il4kp#MWrhSTG0&8-X){x2|kv~Pu&w4q-cIPJ)9)3v_(NZ*7D|8viYfL zQNN;36t(iOnGUxoG{rS3%1pFt7n#5L`*-1J#I3}f8_>ejTqsadbaxH@)?_c?STGN( zImCFO^oZnB`E_OZKQfyGrPyv0Bu%ps-JcYz!gf5OOOhYVHzg^*uD8vQUCMl{mG2Gp zU);U+$9MjnF)2a1w3NM}Z`k2SF*A})9PP>)mwM{w-xLKK8td((Fd9+H(vxWdxH+5x zIY_Euk1~#85gF6)*+q`vUpSuJ;{&{d zRkpQq*Itu#YQN6zo+a7V;v@qYw!}+9rVK{6bK#q6(k53d@={Zivy9p6-+%XA_r&K? z>tIv)Gfsd!gFqSGYc&Uv0=2H?-xcz)e}Gqd)NTT|9<*m--b>!P1OP=`1kg*;Me$7F z0C~1y!m!yEME2Tny5Cp}VSodraoeQINkppH}4bp)yiTQTsFR!z+ad_CUrSiuy^C2-9rv zp(rsjq*PcneauHkfSZLE55e^=Ftr?`)F@`8s|GwMvC1caktx~8-N|B9Vv#$#To{`} z{#OlMktAZBu$g5}6y^3yP!U8a^EfRKz@8Eem@p*OFZb7NUZ+Rc0$Oq3QuUKy1~NqQ z1uE89vUxOs!#u9NE-si0ST0f&h?Ax=^qO=pzE?pZgHEwA1-age$HQQ92vQ-pX1$>z znv+rkAW!gaD1yKjYNA9SStaNp*_=n0zz2N??Swg4p;tQCL_mvdsCwshpe6MqFU}Qf z7EzMSO09X9KHa^!7u~}QagYH`o^oJ06}d^G zYrI_({5(l=_8cwnj@?ob4)SeH#L=li@|i6(YYw=b-u))Zhy*dRfb~gO8^n?BX13D9 z!{go3!r$GjNkyoPiX&G+{g;t(N`5*dN#&Q-KgfLU>%>1?NUc&J-FhGx1FQ6GzboJ3mj6O%?`(yRI6Lnus`e?9T-=79l#Z{i` zwf&*@ZGS!Wf^_@WNoV3K_8%(CoxGvt`7U6|KmffP$;mTNPGnd|#0OJNO%C!N%8+|q znKlm7-=`?O1$OaQJ$i(KmteYN>E-I?Q9wL+DQtdVzGvk}YnzW$vD!sEkC5qiia!FA zAt$m3r}`X9r*lG&f%d^@Muixn!i*k+JErE1sfRVVMQLY^p> z0&ZCGa!6b;^_}yUf~=E`_l?hEO7A zce^&7^|MBD3!J|s4@ZkUu(YT6it>oL{(QG>x3BT9X8O#dN|!zm!D=wB{oj-uMgWS- z_3AzM)0!ZTs*{vl(j7G^Z*K(-3HP_Lw6m2%0 z8=E7&+wQz~oSv@Jlb^d)^Ia;>TDpI0!Z!RW!iB_BRGdj~K`R&4`jrfVVs5}u-m*cl#|00fr}Yr z480HgPTZv4MjWx_Yr@a(;aNj1)fyZlSal-uYpYRFknQh|x3r_2fDkJ4LtK4~AU`kk8C zI!JH%=XJ}vxVgDqZu{p_rvAi^*&0O9^h8O+W)cJjx5A@mmXFapmun*-L*Nr65Q7-U zB+VxIRPj@OQhK5*YQ8&iWZp(x@#n|unpdP>jAlK4(!TxKvmMTew}DhPVloA!VOuxq zum`})4ve}kXt(>0Ebn%|V*9RJ+}7_zFh>3=Rysof14%Y=#2$`XS&D15N*6lgrH z+kQ(LfkfzWTPq)1bn@1_$?ruyi7DVx$?AZ2v%p$p73#;U`#wzXJz>K%V3LjB{snQC z^!j@RDclX;*4K0VEZ50p8?PZQbshh$NhG30qG(FSb`@!OvV?YxKay*sDVAguB5sc_ z7ft%s$jC?H18Vq18(n8ayS%$3lThW2Qsy5ByFetAhJAgn;G@fVzZjGUQ+ln>nd~$$ znb5%rJXApE+Hw&Y>^-CgO8lXwX~hR-`d`(W4-YcdW&l%(N7 zLbBx2?!f4(O-qo*NLzw1L3R8sui5^^*_@!BQ@1S=n+@saK~I^y&NTWUCvYjI-lNk- znnVt|KK(eKDqcC=i{Dk3^q-p^`8xd$KjJhnZ;#^g9%p{^*ojeucq(HuyOwj{Ktf0D z8-he4`8M>)gHOX>D5l(YsR%#7z$1X&DpkXMP8>wv@gTpMYBjRl&Wm7}+t?E0kqU`h?c z?8_*w#J0)>1Vevu#d6Z5kn#Cjr_1UmyEz(LOG`##1E|fd(9$EK@0B?&l#A~%)YKob0MqVei#ZW!SAknE)&Lr%Idc< zn@9Mj1_S&WL&b;&DJg$BX>fjf|07M*?Ru-I#e&`46$2yRK7x8=;pc)uQJG4||Kz+Q zXv-E9bc~8rf5{f&m+)znx%s&AXRp%Nv8!^rnQs$*)C9|Tk6b#Mh}t4Z|0dNqfBq_v z%S*}?|MgCK&W8j}gOs4N*xcM)iu=JP>A6bl^fFTPVK!b<#p4^P_8qcHgX`n&9Infi zJc;$~b$j$*{Wf=vQGflC(0()|B;#pRVoC z5hmm1L3`~?2I{>;*)Avjy>We>@h;>P7mLSx_MLgDEPg2|^iAtJQRGSWD0h7Ri7|E+ zcQw+d1ad-YEm-$m0fi?$TuBRzjrHusiH3(MPSPVvM`7GAZw#k}EsH&>ZOF8ea%tb) z$ji(7L-VYO!H*@)X_?+`Hw%Z+BC(srKmSJdhe`^~dXz`hwQtJKyvc_eztetBa zegfGvtoHV1{dXVIxZK06fV2oltAIW`@MpyPTp&V_#hp z?I!_lR+oy#ZBPIFSUk`|uLWf62ykm&EM5^DOiN7#N;F^tL2PG ze!*KabwX)Hh3)drjgMxHj4!Ho_NZRV+R~Z0x}#4F4GNGO&+`ch39=Bbdp;f{JvhX15 ziLmnc7W$V-+AVqXju}CFf50AbZI#VR#FGN-CLh|^*eLWoHmtNuC6^_;w9H9L#xSx& z?O}dJlP_u*%2uP0Si;m=Jtk6jaSE2o!pt5-ZZN$O;EYT4N z2TAR6j{4y-0XxnSJWfNw2wnfg@_?6mA9v0g02If(RD;d)1fq_qI+X>o?2 z3EHK5_miYkR`bGsuxN%SCu1QWVqk^W2)KpmD}Cgt!_(`R$#pRB|zj3CYszi-3C zy+}eN29SzJ7eZ zIHlJo{LbmsXcPQJAJ_Whyvye=Rg_~Pqz5m?Z#=%G57e}#Mx9U>cR*SP;hbv^vli_A z1ux!3qRpRQOYm3#+cGY`yd~rbl#LuQ{Hy{OI_vCt?-=bwdF=BY=q5=58aBLW6?sm2Lrh%oWOxyaPsKhO=N6H~LY0{5CCmc? z{p;h7AA+~IxHD+`=NbN&xn|Z;fV8Vy-X*qVf>U}H#IR3)lhyl`ippA_Es+w`0PI{X zf=Nx3Kc94a#`@oFmv}x`F(NV?APr`UcKnK|aGQ0C)5>Gu06ze3_mP6g9pMVyu zsW&<`Meo_O$KS2lkq2;XO=m0G{Ax{8e=5Wh-4NiV*Mh82v6*3!umQ7Qt)$F3EyfCD z*TPd3&IVC!2$>jPfD01QeB&=L9oFOq6G6g$qcgs&1?(BmBhsDFQb?erC zcb;#lUAlA5_>Zn#6o2;)-ADCZoQy2rj4&hBlq83M_)Qb1J>x`>cBP=E?CCY^FozDU z_6M<-@s2Ue5U~7=>+Ze11M~GFO5d?T$QD-MknJm3et=6ovnCLrrrik5-nrmwZ5??chmyuHsYB<<3-<9N=s*SEE`#bF4yyNele zB!Y;l^cs(a882em_U+rnQH0H3b>*R4KIl}QR*@Rev+NVD@FbYp3-B_%-kljUN_2lA zPX5-zXY>FCnLd79eM7@qi2<|{Oe^-5KY4PT^x-5MNetsXhsx0md*u{+W>3$veFe06Q&(pU0%}B~(k;FtNY(-l%52WT z8io-FDJP|&XNDJn<0Z>;)|i8SsTG5-Uc4XQlNym(FlXOIle3o!m*U0VYucLUi&K4# zDJt*4?L5xeDU5NI$qr{;<;PpcN!CM~eoj1-p&aTq|5RQ3u(q$HwY2WHFwom>Yatyl`4HGt4U8n@d+1T&Sm$C~!4`>n6(>zbMcP^W1jP6}*< zE#Xyjgm-FIXag`;Hq~t{&G;_=`RJo5)pd?;O4>COo$;I3Uvr=qxV_|fVxr4lZP%y= zWV_gdRqtCoa^y&=TqRfQaRt^FJFD*UvIYmJD1s;AjdZO;HaBK(FbcZzJ7R%W0_K0Sd~y__B^@ zfI$g?ZE|2ENr6yjgyc&EuS%TyiggQkC=8$!l|!#Rs4>Oj@aB3)?TBpIU z&(8S`mtN^Ei5JUdO||9-05oxZ?DVMUZC~kNoBIAVhx%NLewXw>Uyr6D5nxxEcHCa+ zzH1h}nf5eE43veU1uw39FK_OjXr+w*HD?}kHDXl<6gIdaSNF91EN<||gaCvLE=*4& zvpY!o_3qB{F`d2yDy6R_a|C5HkExa$V_(=Xso^V^B}!;nO*mLB3%BICxt_o{KhNo_ z$BG}FkcPL29@}jpB{PL%$^eg)L+wc|>5a(*5gE_TN|Q9kaC3yu1952_R9sftD`!RB z7vzE9cT=ikioOvyJ07R7*&MW1>lzSE#L`$OCM?*qrT4+ja2ZCLdTv`#f369XbXkc=-!dpagLkBhma<_-o`__K4#5<$Sd2eY$$gcUBH$V2=`#?ZJssFfP!)+t@ zcxXSFTW?%PR3R4bQ!7_?R-b)`qu21Eo|ni>AUUa83I}G zt+IU^Ae)uG95Uh@u&E2tH0dq0Oo8dy3I{?~ziFAN&G`mOl0!fl2-Z?q$OVMlxN*ZG zVrP&Ha7fCfY+iEzqlL3{b?=Z(dsbOFZdz~hTA~$?P4BrFfU$8(Var@Pvy+qt2q_!_ z>R>c60_KaeajsMNib?a5EUtwGE{)#sjf?`m3B!5*Jw7I5$5`u=i)5J6010;VZ0Uvd9#G||N)@NBLB2HX#UxY)qFu{wnGQvYl1YZ$t3FHK z)njGc@&`lkdO2HUy|3$i8_jrJ#KDPlluO|L*{k7OX3w2T(h0;j#nIVW^_gf2U>;Af zacPvb&&%0$-rwI}@+d)c#F3V#JSNSz<7d;~@M0be8c(_6QE+R@O!jt-TT7jrM6b;3 z&0RA)oUgSxFn6%CW?o3moT^u^SVWQ(*(FGb101}jdCu9ExS>nP6=Ph>%713v0 zOWNjRw`p1pTmOLs)K_cee_yd~7qJP2?=;}>We_h@)uhK}aq;oeq@e&weNs%2wm(1q zJfNvDabe4bz=C-AzB)0|orehQ)v*?yM5kRINAC{>cNPll>m(Na+dr3E*HsjlOM>~F zq&O0jQlZK$w{DT#UR*{oDV#G#6_^tM?f&@@dX9~+lO>wO+PD}mfh$C&xXve)KDnqL zQWX1G0ah~m?5&uRfBp3zPqg|Pd&-QWQSvyn9*ts&~Z5#l{~EuI1b;1tZbP zrLiss^2dMFYZ)ayu(JDiCordb115));ykn-*2K*566D#@DfW3lQrnL{TEmUOJ74CN zi{K%q@twkIIziL(LQ0Q8oqP1KYTV@o2L~h8tXJa1 zCs*(Vpo+m}RWJ`EC!Aj^j6D(~!?;xj()(gPs<;%0DX;+UTN=#8iyL6-Xl+_%=w13Y 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 v)Ud2;Ua3{9d+Qn_o7b> ~/.zprofile + + note: this is the command for `zsh`. Other shells will require different commands. Homebrew should provide the correct command after install is complete. + eval "$(/opt/homebrew/bin/brew shellenv)" + +Install packages using homebrew +------------------------------- + +.. code-block:: + + brew install bison cmake gfortran git-lfs open-mpi lapack python3 ninja m4 + echo 'export PATH="/opt/homebrew/opt/bison/bin:$PATH"' >> ~/.zshrc + echo 'export PATH="/opt/homebrew/opt/m4/bin:$PATH"' >> ~/.zshrc + git lfs install + +Clone GEOS +---------- + +.. code-block:: + + git clone git@github.com:GEOS-DEV/GEOS.git + cd GEOS + git submodule init + git submodule update + cd .. + +Clone thirdPartyLibs +-------------------- + +.. code-block:: + + git clone git@github.com:GEOS-DEV/thirdPartyLibs.git + cd thirdPartyLibs + git submodule init + git submodule update + git lfs pull + + +Configure and build thirdPartyLibs +--------------------------------- + +.. code-block:: + + python3 scripts/config-build.py -hc ../GEOS/host-configs/apple/macOS_arm.cmake -bt Release + +You will get a warning you can ignore + +.. code-block:: + + CMake Warning at /Users/settgast1/Codes/geos/GEOS/host-configs/tpls.cmake:10 (message): + 'GEOS_TPL_DIR' does not exist. + + +Continue with the build + +.. code-block:: + + cd build-macOS_arm-release + make + +You will get an error at the end...you can ignore it. + +.. code-block:: + + [100%] Linking CXX executable ../../../tests/blt_mpi_smoke + ld: warning: -commons use_dylibs is no longer supported, using error treatment instead + ld: file not found: @rpath/libquadmath.0.dylib for architecture arm64 + clang: error: linker command failed with exit code 1 (use -v to see invocation) + make[2]: *** [tests/blt_mpi_smoke] Error 1 + make[1]: *** [blt/tests/smoke/CMakeFiles/blt_mpi_smoke.dir/all] Error 2 + make: *** [all] Error 2 + + +Build GEOS +---------- + +.. code-block:: + + cd ../../GEOS + python3 scripts/config-build.py -hc host-configs/apple/macOS_arm.cmake -bt Release --ninja + cd build-macOS_arm-release + ninja geosx diff --git a/src/docs/sphinx/buildGuide/Index.rst b/src/docs/sphinx/buildGuide/Index.rst index afd042d9561..1ed27e84f1f 100644 --- a/src/docs/sphinx/buildGuide/Index.rst +++ b/src/docs/sphinx/buildGuide/Index.rst @@ -18,3 +18,5 @@ Welcome to the GEOS build guide. SpackUberenv ContinuousIntegration + + AppleMacOS diff --git a/src/docs/sphinx/buildGuide/Prerequisites.rst b/src/docs/sphinx/buildGuide/Prerequisites.rst index 78251f997d5..9bbe5ee6174 100644 --- a/src/docs/sphinx/buildGuide/Prerequisites.rst +++ b/src/docs/sphinx/buildGuide/Prerequisites.rst @@ -10,10 +10,10 @@ List of prerequisites Minimal requirements: -- `CMake `_ build system generator (3.17+). +- `CMake `_ build system generator (3.23.1+). - build tools (`GNU make `_ or `ninja `_ on Linux, XCode on MacOS). -- a C++ compiler with full c++17 standard support (`gcc `_ 8.3+ or `clang `_ 10.0+ are recommended). -- `python `_ (2.7+ or 3.6+). +- a C++ compiler with full c++17 standard support (`gcc `_ 12+ or `clang `_ 13.0+ are recommended). +- `python `_ 3.9-3.11 (versions 3.12+ are untested). - :code:`zlib`, :code:`blas` and :code:`lapack` libraries - any compatible MPI runtime and compilers (if building with MPI) diff --git a/src/docs/sphinx/developerGuide/Contributing/Doxygen.rst b/src/docs/sphinx/developerGuide/Contributing/Doxygen.rst index 8a25b96ee0c..1b240c99811 100644 --- a/src/docs/sphinx/developerGuide/Contributing/Doxygen.rst +++ b/src/docs/sphinx/developerGuide/Contributing/Doxygen.rst @@ -239,4 +239,18 @@ Example Current Doxygen ==================================== -`Link to Doxygen <../../../doxygen_output/html/classes.html>`__ +`Link to Doxygen Class directory <../../../../doxygen_output/html/classes.html>`__ + +Direct links to some useful class documentation: + +`Group API <../../../../doxygen_output/html/classgeos_1_1data_repository_1_1_group.html>`_ + +`Wrapper API <../../../../doxygen_output/html/classgeos_1_1data_repository_1_1_wrapper.html>`_ + +`ObjectManagerBase API <../../../../doxygen_output/html/classgeos_1_1_object_manager_base.html>`_ + +`MeshLevel API <../../../../doxygen_output/html/classgeos_1_1_mesh_level.html>`_ + +`NodeManager API <../../../../doxygen_output/html/classgeos_1_1_node_manager.html>`_ + +`FaceManager API <../../../../doxygen_output/html/classgeos_1_1_face_manager.html>`_ \ No newline at end of file diff --git a/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst b/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst index dd03fc486a3..3e34bdc70c8 100644 --- a/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst +++ b/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst @@ -1,3 +1,4 @@ +.. _Contributing: ############################################################################### Contributing ############################################################################### diff --git a/src/docs/sphinx/developerGuide/Index.rst b/src/docs/sphinx/developerGuide/Index.rst index 7e06c68461d..9ecf43b846d 100644 --- a/src/docs/sphinx/developerGuide/Index.rst +++ b/src/docs/sphinx/developerGuide/Index.rst @@ -2,7 +2,10 @@ Developer Guide ############################################################################### -Welcome to the GEOS developer guide. +Welcome to the GEOS developer guide. +This guide serves as a reference for developers contributing to the GEOS project. +The :ref:`Contributing` section provides general details and guidelines for contributing to the GEOS project. +The :ref:`KeyComponents` section provides an overview of the some basic components that of the GEOS project. .. toctree:: :maxdepth: 3 diff --git a/src/docs/sphinx/developerGuide/KeyComponents/index_KeyComponents.rst b/src/docs/sphinx/developerGuide/KeyComponents/index_KeyComponents.rst index 6960fe15c24..68899719971 100644 --- a/src/docs/sphinx/developerGuide/KeyComponents/index_KeyComponents.rst +++ b/src/docs/sphinx/developerGuide/KeyComponents/index_KeyComponents.rst @@ -1,3 +1,5 @@ +.. _KeyComponents: + ############################################################################### Code Components ############################################################################### diff --git a/src/index.rst b/src/index.rst index 9dedc1f4d75..46113205346 100644 --- a/src/index.rst +++ b/src/index.rst @@ -126,6 +126,22 @@ you have suggestions for improving the guides below, please post an issue on our To the Python Tools Documentation + .. grid-item-card:: + + Feature Requests, Reporting Bugs, and Support + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + To make feature requests, report bugs, or get support (after reviewing the user guide) please submit an issue on Github. + + +++ + + .. button-link:: https://github.com/GEOS-DEV/GEOS/issues/new/choose + :expand: + :color: info + :click-parent: + + To the "New issue" page on the GEOS Github repository + ******************** Table of Contents From 5f6d7106ebdc8cd1994636b1e97d15fce179b04b Mon Sep 17 00:00:00 2001 From: Jian Huang <53012159+jhuang2601@users.noreply.github.com> Date: Sun, 1 Sep 2024 17:55:14 -0500 Subject: [PATCH 177/286] docs: update publications and fix a link (#3304) * add a new publication on IJRMMS * fix a link for triaxialDriver --- .../constitutiveDrivers/docs/ConstitutiveDrivers.rst | 4 ++-- src/docs/sphinx/Publications.rst | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/constitutiveDrivers/docs/ConstitutiveDrivers.rst b/src/coreComponents/constitutiveDrivers/docs/ConstitutiveDrivers.rst index dd1b29d36d3..8ad6a17ca83 100644 --- a/src/coreComponents/constitutiveDrivers/docs/ConstitutiveDrivers.rst +++ b/src/coreComponents/constitutiveDrivers/docs/ConstitutiveDrivers.rst @@ -7,7 +7,7 @@ These drivers are designed to facilitate the exploration of various constitutive .. toctree:: :maxdepth: 1 - - SolidModels PVTDriver + + TriaxialDriver diff --git a/src/docs/sphinx/Publications.rst b/src/docs/sphinx/Publications.rst index e3c1ef438c7..57df228cddb 100644 --- a/src/docs/sphinx/Publications.rst +++ b/src/docs/sphinx/Publications.rst @@ -2,7 +2,7 @@ Publications ############################################################################### -Last updated 9-July-2024 +Last updated 26-August-2024 Preprints and Early-Views ========================= @@ -49,6 +49,10 @@ Preprints and Early-Views | Journal of Computational Physics | `doi:10.1016/j.jcp.2024.113163 `_ + * - | **Theory and analytical solutions to wellbore problems with hardening/softening Drucker-Prager models** + | T Nguyen-Sy, J Huang, H Gross + | International Journal of Rock Mechanics and Mining Sciences + | `doi:10.1016/j.ijrmms.2024.105878 `_ 2023 ==== From a38d1ee58ba085a667d98981dab9b6aaffa672d2 Mon Sep 17 00:00:00 2001 From: Stefano Frambati Date: Mon, 2 Sep 2024 03:10:19 +0200 Subject: [PATCH 178/286] fix: Bug with elastic wave propagator at higher orders (#3294) * fixed a bug due to PR 3202 concerning the elastic solver at higher orders * added corresponding compute jacobian with corners * added correction for ghost nodes * Re-enable wave tests --------- Co-authored-by: acitrain <60715545+acitrain@users.noreply.github.com> --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../Qk_Hexahedron_Lagrange_GaussLobatto.hpp | 143 ++++++++++++++++++ .../PrecomputeSourcesAndReceiversKernel.hpp | 20 +-- 4 files changed, 158 insertions(+), 11 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index a00377b2bbc..3fa9cbb2698 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -4,4 +4,4 @@ baselines: allow_fail: all: '' - streak: pennyShapedToughnessDominated_smoke_01,pennyShapedViscosityDominated_smoke_01,pknViscosityDominated_smoke_01,SeismicityRate_poromechanics_1d_smoke_01,SeismicityRate_poromechanics_1d_smoke_02,elas3D_Q3_abc_smoke_01,elas3D_Q3_abc_smoke_08,elas3D_Q3_abc_fs_smoke_01,elas3D_Q3_abc_fs_smoke_08 + streak: pennyShapedToughnessDominated_smoke_01,pennyShapedViscosityDominated_smoke_01,pknViscosityDominated_smoke_01,SeismicityRate_poromechanics_1d_smoke_01,SeismicityRate_poromechanics_1d_smoke_02 diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index d1d315d5658..13eca60093d 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3294 (2024-09-01) +====================== +Re-enable enforcement of wave propagation integrated test pass. + PR #3300 (2024-08-28) ====================== Re-enable floating point exceptions. Rebaseline due to minor changing default value of maxRelativeCompDensChange from 1.7976931348623157e+308 to 1.7976931348623157e+208. diff --git a/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp b/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp index 6ec0c1eaa57..a218ad7d4b7 100644 --- a/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp @@ -328,6 +328,51 @@ class Qk_Hexahedron_Lagrange_GaussLobatto final : public FiniteElementBase real64 const (&X)[numNodes][3], StackVariables const & stack, real64 ( &gradN )[numNodes][3] ); + /** + * @brief Calculate the shape functions derivatives wrt the physical + * coordinates. + * @param q Index of the quadrature point. + * @param X Array containing the coordinates of the mesh corners. + * @param gradN Array to contain the shape function derivatives for all + * support points at the coordinates of the quadrature point @p q. + * @return The determinant of the parent/physical transformation matrix. + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static real64 calcGradNWithCorners( localIndex const q, + real64 const (&X)[8][3], + real64 ( &gradN )[numNodes][3] ); + /** + * @brief Calculate the shape functions derivatives wrt the physical + * coordinates at a single point. + * @param[in] coords The parent coordinates at which to evaluate the shape function value + * @param[in] X Array containing the coordinates of the mesh corners. + * @param[out] gradN Array to contain the shape function derivatives for all + * support points at the coordinates of the quadrature point @p q. + * @return The determinant of the parent/physical transformation matrix. + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static real64 calcGradNWithCorners( real64 const (&coords)[3], + real64 const (&X)[8][3], + real64 ( &gradN )[numNodes][3] ); + + /** + * @brief Calculate the shape functions derivatives wrt the physical + * coordinates. + * @param q Index of the quadrature point. + * @param X Array containing the coordinates of the mesh corners. + * @param stack Variables allocated on the stack as filled by @ref setupStack. + * @param gradN Array to contain the shape function derivatives for all + * support points at the coordinates of the quadrature point @p q. + * @return The determinant of the parent/physical transformation matrix. + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static real64 calcGradNWithCorners( localIndex const q, + real64 const (&X)[8][3], + StackVariables const & stack, + real64 ( &gradN )[numNodes][3] ); /** * @brief Calculate the integration weights for a quadrature point. @@ -494,6 +539,22 @@ class Qk_Hexahedron_Lagrange_GaussLobatto final : public FiniteElementBase static void jacobianTransformation( real64 const (&coords)[3], real64 const (&X)[numNodes][3], real64 ( &J )[3][3] ); + + /** + * @brief Calculates the isoparametric "Jacobian" transformation + * matrix/mapping from the parent space to the physical space at a single point. + * Assumes that the coordinate of high-order nodes are given by trilinear + * interpolation of the mesh corners. + * @param coords The parent coordinates at which to evaluate the shape function value + * @param X Array containing the coordinates of the mesh corners. + * @param J Array to store the Jacobian transformation. + */ + GEOS_HOST_DEVICE + GEOS_FORCE_INLINE + static void jacobianTransformationWithCorners( real64 const (&coords)[3], + real64 const (&X)[8][3], + real64 ( &J )[3][3] ); + /** * @brief performs a trilinear interpolation to determine the real-world coordinates of a * vertex @@ -923,6 +984,57 @@ calcGradN( localIndex const q, return calcGradN( q, X, gradN ); } +template< typename GL_BASIS > +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +real64 +Qk_Hexahedron_Lagrange_GaussLobatto< GL_BASIS >::calcGradNWithCorners( localIndex const q, + real64 const (&X)[8][3], + real64 (& gradN)[numNodes][3] ) +{ + int qa, qb, qc; + GL_BASIS::TensorProduct3D::multiIndex( q, qa, qb, qc ); + + real64 J[3][3] = {{0}}; + + jacobianTransformation( qa, qb, qc, X, J ); + + real64 const detJ = LvArray::tensorOps::invert< 3 >( J ); + + applyTransformationToParentGradients( q, J, gradN ); + + return detJ; +} +//************************************************************************************************* +template< typename GL_BASIS > +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +real64 +Qk_Hexahedron_Lagrange_GaussLobatto< GL_BASIS >::calcGradNWithCorners( real64 const (&coords)[3], + real64 const (&X)[8][3], + real64 (& gradN)[numNodes][3] ) +{ + real64 J[3][3] = {{0}}; + + jacobianTransformationWithCorners( coords, X, J ); + + real64 const detJ = LvArray::tensorOps::invert< 3 >( J ); + + applyTransformationToParentGradients( coords, J, gradN ); + + return detJ; +} +template< typename GL_BASIS > +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +real64 Qk_Hexahedron_Lagrange_GaussLobatto< GL_BASIS >:: +calcGradNWithCorners( localIndex const q, + real64 const (&X)[8][3], + StackVariables const & GEOS_UNUSED_PARAM( stack ), + real64 ( & gradN )[numNodes][3] ) +{ + return calcGradN( q, X, gradN ); +} //************************************************************************************************* #if __GNUC__ #pragma GCC diagnostic push @@ -983,6 +1095,37 @@ jacobianTransformation( real64 const (&coords)[3], }, X, J ); } +template< typename GL_BASIS > +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +void +Qk_Hexahedron_Lagrange_GaussLobatto< GL_BASIS >:: +jacobianTransformationWithCorners( real64 const (&coords)[3], + real64 const (&X)[8][3], + real64 ( & J )[3][3] ) +{ + supportLoop( coords, [] GEOS_HOST_DEVICE ( real64 const (&dNdXi)[3], + int const nodeIndex, + real64 const (&X)[8][3], + real64 (& J)[3][3] ) + { + int qa, qb, qc; + GL_BASIS::TensorProduct3D::multiIndex( nodeIndex, qa, qb, qc ); + real64 Xnode[3]; + real64 alpha = ( GL_BASIS::parentSupportCoord( qa ) + 1.0 ) / 2.0; + real64 beta = ( GL_BASIS::parentSupportCoord( qb ) + 1.0 ) / 2.0; + real64 gamma = ( GL_BASIS::parentSupportCoord( qc ) + 1.0 ) / 2.0; + trilinearInterp( alpha, beta, gamma, X, Xnode ); + for( int i = 0; i < 3; ++i ) + { + for( int j = 0; j < 3; ++j ) + { + J[i][j] = J[i][j] + dNdXi[ j ] * Xnode[i]; + } + } + }, X, J ); +} + template< typename GL_BASIS > GEOS_HOST_DEVICE GEOS_FORCE_INLINE diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp index a5d98c5d970..7115ac0fbb1 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp @@ -460,13 +460,13 @@ struct PreComputeSourcesAndReceivers sourceCoordinates[isrc][1], sourceCoordinates[isrc][2] }; - real64 xLocal[numNodesPerElem][3]; + real64 xLocal[8][3]; - for( localIndex a=0; a< numNodesPerElem; ++a ) + for( localIndex a = 0; a < 8; ++a ) { - for( localIndex i=0; i<3; ++i ) + for( localIndex i = 0; i < 3; ++i ) { - xLocal[a][i] = baseNodeCoords( elemsToNodes( k, a ), i ); + xLocal[a][i] = baseNodeCoords( baseElemsToNodes( k, a ), i ); } } @@ -496,7 +496,7 @@ struct PreComputeSourcesAndReceivers real64 N[numNodesPerElem]; real64 gradN[numNodesPerElem][3]; FE_TYPE::calcN( coordsOnRefElem, N ); - FE_TYPE::calcGradN( coordsOnRefElem, xLocal, gradN ); + FE_TYPE::calcGradNWithCorners( coordsOnRefElem, xLocal, gradN ); R2SymTensor moment = sourceMoment; for( localIndex q=0; q< numNodesPerElem; ++q ) { @@ -593,13 +593,13 @@ struct PreComputeSourcesAndReceivers if( sampleFound && elemGhostRank[k] < 0 ) { real64 coordsOnRefElem[3]{}; - real64 xLocal[numNodesPerElem][3]; + real64 xLocal[8][3]; - for( localIndex a=0; a< numNodesPerElem; ++a ) + for( localIndex a = 0; a < 8; ++a ) { - for( localIndex i=0; i<3; ++i ) + for( localIndex i=0; i < 3; ++i ) { - xLocal[a][i] = baseNodeCoords( elemsToNodes( k, a ), i ); + xLocal[a][i] = baseNodeCoords( baseElemsToNodes( k, a ), i ); } } @@ -610,7 +610,7 @@ struct PreComputeSourcesAndReceivers real64 N[numNodesPerElem]; real64 gradN[numNodesPerElem][3]; FE_TYPE::calcN( coordsOnRefElem, N ); - FE_TYPE::calcGradN( coordsOnRefElem, xLocal, gradN ); + FE_TYPE::calcGradNWithCorners( coordsOnRefElem, xLocal, gradN ); for( localIndex a = 0; a < numNodesPerElem; ++a ) { receiverNodeIds[ircv][iSample * numNodesPerElem + a] = elemsToNodes( k, From 6f9c1b4390cc9d5aa0436072a629b56fd4115b06 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Sun, 1 Sep 2024 23:10:47 -0500 Subject: [PATCH 179/286] fix: Small fix (#3308) * Fix bug in SinglePhasePoromechanicsConformingFractures.cpp --------- --- .../SinglePhasePoromechanicsConformingFractures.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 97bfe909e3a..32f5980986e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -409,7 +409,7 @@ addTransmissibilityCouplingPattern( DomainPartition const & domain, // to the nodes of the adjacent cell localIndex const rowIndex = presDofNumber[sei[iconn][1-kf]] - rankOffset; - if( rowIndex > 0 && rowIndex < pattern.numRows() ) + if( rowIndex >= 0 && rowIndex < pattern.numRows() ) { // Get fracture, face and region/subregion/element indices (for elements on both sides) @@ -655,7 +655,7 @@ assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, localIndex const localRow = LvArray::integerConversion< localIndex >( elemDOF[0] - rankOffset ); - if( localRow > 0 && localRow < localMatrix.numRows() ) + if( localRow >= 0 && localRow < localMatrix.numRows() ) { localMatrix.addToRowBinarySearchUnsorted< serialAtomic >( localRow, @@ -711,7 +711,7 @@ assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, { localIndex const localRow = LvArray::integerConversion< localIndex >( elemDOF[0] - rankOffset ); - if( localRow > 0 && localRow < localMatrix.numRows() ) + if( localRow >= 0 && localRow < localMatrix.numRows() ) { localMatrix.addToRowBinarySearchUnsorted< serialAtomic >( localRow, nodeDOF, From fda7ed253392f073108a05ad75d853f06605bbe7 Mon Sep 17 00:00:00 2001 From: Sy-Tuan Nguyen <45685596+sytuannguyen@users.noreply.github.com> Date: Thu, 5 Sep 2024 10:55:13 +0700 Subject: [PATCH 180/286] feat: Temperature dependent single phase thermal conductivity (#3135) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 + .../3D_10x10x10_thermalCompressible_base.xml | 4 +- .../thermalCompressible_2d_base.xml | 36 +- .../thermalCompressible_2d_benchmark.xml | 2 +- .../thermalCompressible_2d_smoke.xml | 2 +- ...glePhaseThermalConductivity_benchmark.xml} | 2 +- ...tSinglePhaseThermalConductivity_smoke.xml} | 2 +- ...endentVolumetricHeatCapacity_benchmark.xml | 50 + ...eDependentVolumetricHeatCapacity_smoke.xml | 50 + .../thermalSinglePhaseFlow.ats | 12 +- .../egsCollab_thermalFlow_base.xml | 4 +- .../fractureMatrixThermalFlow_base.xml | 4 +- .../ThermoPoroElastic_consolidation_base.xml | 4 +- .../ThermoPoroElastic_base.xml | 4 +- ...moPoroElastic_efem-edfm_eggModel_small.xml | 4 +- ...asticWellbore_ImperfectInterfaces_base.xml | 16 +- .../CasedThermoElasticWellbore_base.xml | 12 +- .../ThermoPoroElasticWellbore_base.xml | 4 +- .../constitutive/CMakeLists.txt | 4 +- .../constitutive/docs/Constitutive.rst | 1 + ...emperatureDependentThermalConductivity.rst | 53 + .../docs/constitutiveDeveloperGuide.rst | 2 +- ...SinglePhaseConstantThermalConductivity.cpp | 101 -- .../SinglePhaseThermalConductivity.cpp | 134 +++ ...hpp => SinglePhaseThermalConductivity.hpp} | 43 +- .../SinglePhaseThermalConductivityBase.cpp | 3 + .../SinglePhaseThermalConductivityBase.hpp | 25 +- ...SinglePhaseThermalConductivitySelector.hpp | 6 +- .../ThermalConductivityFields.hpp | 8 + .../fluidFlow/SinglePhaseBase.cpp | 15 +- .../ThermalSinglePhaseFVMKernels.hpp | 43 +- .../schema/docs/Constitutive.rst | 2 +- .../schema/docs/Constitutive_other.rst | 2 +- ...SinglePhaseConstantThermalConductivity.rst | 10 - ...PhaseConstantThermalConductivity_other.rst | 9 - .../docs/SinglePhaseThermalConductivity.rst | 12 + .../SinglePhaseThermalConductivity_other.rst | 10 + src/coreComponents/schema/schema.xsd | 16 +- src/coreComponents/schema/schema.xsd.other | 6 +- .../testThermalCompMultiphaseFlow.cpp | 2 +- .../testThermalSinglePhaseFlow.cpp | 4 +- src/docs/sphinx/CompleteXMLSchema.rst | 28 +- .../wellboreProblems/Index.rst | 8 +- .../Example.rst | 10 +- .../linearThermalDiffusion/data_1.csv | 1002 +++++++++++++++++ .../linearThermalDiffusion/data_10.csv | 1002 +++++++++++++++++ .../linearThermalDiffusion/data_2.csv | 1002 +++++++++++++++++ .../linearThermalDiffusion/data_5.csv | 1002 +++++++++++++++++ .../linearThermalDiffusion_plot.py} | 22 +- .../radialThermalDiffusionSketch.png | Bin .../nonLinearThermalDiffusion/data_1.csv | 1002 ----------------- .../nonLinearThermalDiffusion/data_10.csv | 1002 ----------------- .../nonLinearThermalDiffusion/data_2.csv | 1002 ----------------- .../nonLinearThermalDiffusion/data_5.csv | 1002 ----------------- .../Example.rst | 62 + .../data_1.csv | 1002 +++++++++++++++++ .../data_10.csv | 1002 +++++++++++++++++ .../data_2.csv | 1002 +++++++++++++++++ .../data_5.csv | 1002 +++++++++++++++++ ...dentSinglePhaseThermalConductivity_plot.py | 205 ++++ .../Example.rst | 16 +- .../data_1.csv | 1002 +++++++++++++++++ .../data_10.csv | 1002 +++++++++++++++++ .../data_2.csv | 1002 +++++++++++++++++ .../data_5.csv | 1002 +++++++++++++++++ ...reDependentVolumetricHeatCapacity_plot.py} | 63 +- .../pureThermalDiffusion/data_1.csv | 1002 ----------------- .../pureThermalDiffusion/data_10.csv | 1002 ----------------- .../pureThermalDiffusion/data_2.csv | 1002 ----------------- .../pureThermalDiffusion/data_5.csv | 1002 ----------------- .../analyticalResults.py | 6 +- 72 files changed, 12877 insertions(+), 8314 deletions(-) rename inputFiles/singlePhaseFlow/{thermalCompressible_nonLinear_2d_benchmark.xml => thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml} (93%) rename inputFiles/singlePhaseFlow/{thermalCompressible_nonLinear_2d_smoke.xml => thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_smoke.xml} (93%) create mode 100644 inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentVolumetricHeatCapacity_benchmark.xml create mode 100644 inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentVolumetricHeatCapacity_smoke.xml create mode 100644 src/coreComponents/constitutive/docs/TemperatureDependentThermalConductivity.rst delete mode 100644 src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp create mode 100644 src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp rename src/coreComponents/constitutive/thermalConductivity/{SinglePhaseConstantThermalConductivity.hpp => SinglePhaseThermalConductivity.hpp} (61%) delete mode 100644 src/coreComponents/schema/docs/SinglePhaseConstantThermalConductivity.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseConstantThermalConductivity_other.rst create mode 100644 src/coreComponents/schema/docs/SinglePhaseThermalConductivity.rst create mode 100644 src/coreComponents/schema/docs/SinglePhaseThermalConductivity_other.rst rename src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/{pureThermalDiffusion => linearThermalDiffusion}/Example.rst (93%) create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_1.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_10.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_2.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_5.csv rename src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/{pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py => linearThermalDiffusion/linearThermalDiffusion_plot.py} (82%) rename src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/{pureThermalDiffusion => linearThermalDiffusion}/radialThermalDiffusionSketch.png (100%) delete mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_1.csv delete mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_10.csv delete mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_2.csv delete mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_5.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/Example.rst create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_1.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_10.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_2.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_5.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/temperatureDependentSinglePhaseThermalConductivity_plot.py rename src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/{nonLinearThermalDiffusion => nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity}/Example.rst (70%) create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_1.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_10.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_2.csv create mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_5.csv rename src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/{nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py => nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/temperatureDependentVolumetricHeatCapacity_plot.py} (68%) delete mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_1.csv delete mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_10.csv delete mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_2.csv delete mode 100644 src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_5.csv diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 3fa9cbb2698..8da0056af21 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3300-7077-1277f18 + baseline: integratedTests/baseline_integratedTests-pr3135-7235-53174a0 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 13eca60093d..48b90a0e986 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,10 +6,16 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3135 (2024-09-04) +====================== +Temperature dependent single phase thermal conductivity. Rebaseline all thermal cases. + + PR #3294 (2024-09-01) ====================== Re-enable enforcement of wave propagation integrated test pass. + PR #3300 (2024-08-28) ====================== Re-enable floating point exceptions. Rebaseline due to minor changing default value of maxRelativeCompDensChange from 1.7976931348623157e+308 to 1.7976931348623157e+208. diff --git a/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml b/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml index 942ab9d95c8..6de1ae4dfdf 100644 --- a/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml +++ b/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml @@ -83,9 +83,9 @@ specificHeatCapacity="4.0e3" referenceInternalEnergy="1.1e6"/> - + defaultThermalConductivityComponents="{ 3.5, 3.5, 3.5 }"/> diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml b/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml index 767e0f4f701..f51963bf385 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml @@ -11,7 +11,7 @@ targetRegions="{ region }"> + newtonMaxIter="100"/> @@ -34,7 +34,7 @@ solidInternalEnergyModelName="rockInternalEnergy_linear"/> - + - + - - - + + + + + + + @@ -125,21 +135,21 @@ setNames="{ all }" objectPath="ElementRegions/region/cb" fieldName="temperature" - scale="0"/> + scale="100"/> + scale="100"/> + scale="-20.0"/> diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml b/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml index 68e33c33f50..b578a7ac119 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_2d_benchmark.xml @@ -9,7 +9,7 @@ + materialList="{ fluid, rock_linear, thermalCond_linear }"/> diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_2d_smoke.xml b/inputFiles/singlePhaseFlow/thermalCompressible_2d_smoke.xml index 5fea4f7ebaa..e4ec4ed0475 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_2d_smoke.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_2d_smoke.xml @@ -9,7 +9,7 @@ + materialList="{ fluid, rock_linear, thermalCond_linear }"/> diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_benchmark.xml b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml similarity index 93% rename from inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_benchmark.xml rename to inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml index 47c273a3519..a526d78f438 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_benchmark.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml @@ -9,7 +9,7 @@ + materialList="{ fluid, rock_linear, thermalCond_nonLinear }"/> diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_smoke.xml b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_smoke.xml similarity index 93% rename from inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_smoke.xml rename to inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_smoke.xml index e4cfc03c23b..ca969a98c99 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_smoke.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_smoke.xml @@ -9,7 +9,7 @@ + materialList="{ fluid, rock_linear, thermalCond_nonLinear }"/> diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentVolumetricHeatCapacity_benchmark.xml b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentVolumetricHeatCapacity_benchmark.xml new file mode 100644 index 00000000000..fa9af06fd2f --- /dev/null +++ b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentVolumetricHeatCapacity_benchmark.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentVolumetricHeatCapacity_smoke.xml b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentVolumetricHeatCapacity_smoke.xml new file mode 100644 index 00000000000..013e81c76c2 --- /dev/null +++ b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentVolumetricHeatCapacity_smoke.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats b/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats index cd021117e0a..886d8add60a 100644 --- a/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats +++ b/inputFiles/singlePhaseFlow/thermalSinglePhaseFlow.ats @@ -22,9 +22,17 @@ decks = [ check_step=20, restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( - name="thermalCompressible_nonLinear_2d_smoke", + name="thermalCompressible_temperatureDependentVolumetricHeatCapacity_smoke", description= - 'non-linear thermal diffusion around a wellbore)', + 'a wellbore problem with temperature dependent volumetric heat capacity)', + partitions=((1, 1, 1), (2, 2, 1)), + restart_step=1, + check_step=2, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_smoke", + description= + 'a wellbore problem with temperature dependent thermal conductivity)', partitions=((1, 1, 1), (2, 2, 1)), restart_step=1, check_step=2, diff --git a/inputFiles/thermalSinglePhaseFlowFractures/egsCollab_thermalFlow/egsCollab_thermalFlow_base.xml b/inputFiles/thermalSinglePhaseFlowFractures/egsCollab_thermalFlow/egsCollab_thermalFlow_base.xml index c83229e78b5..4f238dee779 100644 --- a/inputFiles/thermalSinglePhaseFlowFractures/egsCollab_thermalFlow/egsCollab_thermalFlow_base.xml +++ b/inputFiles/thermalSinglePhaseFlowFractures/egsCollab_thermalFlow/egsCollab_thermalFlow_base.xml @@ -60,9 +60,9 @@ specificHeatCapacity="4.2e6" referenceInternalEnergy="0.99"/> - + defaultThermalConductivityComponents="{ 3.81, 3.81, 3.81 }"/> - + defaultThermalConductivityComponents="{ 1, 1, 1 }"/> - + defaultThermalConductivityComponents="{ 836, 836, 836 }"/> diff --git a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml index 1ba0e49f27f..fc20919e014 100644 --- a/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml +++ b/inputFiles/thermoPoromechanicsFractures/ThermoPoroElastic_base.xml @@ -31,9 +31,9 @@ specificHeatCapacity="1.672e2" referenceInternalEnergy="0.001"/> - + defaultThermalConductivityComponents="{ 1, 1, 1 }"/> - + defaultThermalConductivityComponents="{ 10, 10, 10 }"/> - + defaultThermalConductivityComponents="{ 15, 15, 15 }"/> - + defaultThermalConductivityComponents="{ 1.0, 1.0, 1.0 }"/> - + defaultThermalConductivityComponents="{ 1.66, 1.66, 1.66 }"/> - + defaultThermalConductivityComponents="{ 1.0, 1.0, 1.0 }"/> diff --git a/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml b/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml index 87e49a84312..a161b4c85fa 100644 --- a/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml +++ b/inputFiles/wellbore/CasedThermoElasticWellbore_base.xml @@ -142,17 +142,17 @@ - + defaultThermalConductivityComponents="{ 15, 15, 15 }"/> - + defaultThermalConductivityComponents="{ 1.0, 1.0, 1.0 }"/> - + defaultThermalConductivityComponents="{ 1.66, 1.66, 1.66 }"/> diff --git a/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml b/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml index 20aaa9ae436..cc8b31618ab 100644 --- a/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml +++ b/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml @@ -85,9 +85,9 @@ - + defaultThermalConductivityComponents="{ 6.6, 6.6, 6.6 }"/> diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index 3a01edc6e7c..69a953f361a 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -169,7 +169,7 @@ set( constitutive_headers thermalConductivity/MultiPhaseThermalConductivityFields.hpp thermalConductivity/MultiPhaseThermalConductivitySelector.hpp thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp - thermalConductivity/SinglePhaseConstantThermalConductivity.hpp + thermalConductivity/SinglePhaseThermalConductivity.hpp thermalConductivity/SinglePhaseThermalConductivityBase.hpp thermalConductivity/SinglePhaseThermalConductivityFields.hpp thermalConductivity/SinglePhaseThermalConductivitySelector.hpp @@ -285,7 +285,7 @@ set( constitutive_sources thermalConductivity/MultiPhaseConstantThermalConductivity.cpp thermalConductivity/MultiPhaseThermalConductivityBase.cpp thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp - thermalConductivity/SinglePhaseConstantThermalConductivity.cpp + thermalConductivity/SinglePhaseThermalConductivity.cpp thermalConductivity/SinglePhaseThermalConductivityBase.cpp ) diff --git a/src/coreComponents/constitutive/docs/Constitutive.rst b/src/coreComponents/constitutive/docs/Constitutive.rst index 68279ea3774..61108c5525d 100644 --- a/src/coreComponents/constitutive/docs/Constitutive.rst +++ b/src/coreComponents/constitutive/docs/Constitutive.rst @@ -19,6 +19,7 @@ These models are grouped together based on their input/output interface. PermeabilityModels PorousSolids TemperatureDependentSolidVolumetricHeatCapacity + TemperatureDependentThermalConductivity In an input XML file, constitutive models are listed in the ```` block. diff --git a/src/coreComponents/constitutive/docs/TemperatureDependentThermalConductivity.rst b/src/coreComponents/constitutive/docs/TemperatureDependentThermalConductivity.rst new file mode 100644 index 00000000000..cfe9fe25264 --- /dev/null +++ b/src/coreComponents/constitutive/docs/TemperatureDependentThermalConductivity.rst @@ -0,0 +1,53 @@ +.. _TemperatureDependentThermalConductivity: + + +########################################################## +Temperature-dependent Thermal Conductivity Model +########################################################## + + +Overview +====================== + +In this model, thermal conductivity of porous medium is defined as a linear function of temperature: + +.. math:: + k = k_{0} + \frac{ dk }{ dT } (T - T_{0}) + +where + :math:`k` is the thermal conductivity at temperature T, which is a vector; + :math:`k_{0}` is the reference thermal conductivity at the reference temperature; + :math:`T_{0}` is the reference temperature; + :math:`\frac{ dk }{ dT }` is the gradient of the thermal conductivity with respect to temperature, which equals to zero for the cases with constant thermal conductivity; note that this term is also in vector form, whose components could vary with directions. + + + +Parameters +====================== + +The temperature-dependent thermal conductivity model is called in the +```` block of the input XML file. +This model must be assigned a unique name via the +``name`` attribute. +This name is used to attach the model to CellElementRegion of the physical +domain in the ```` block. + +The following attributes are supported: + +.. include:: /coreComponents/schema/docs/SinglePhaseThermalConductivity.rst + + +Example +======================= + +.. code-block:: xml + + + ... + + ... + diff --git a/src/coreComponents/constitutive/docs/constitutiveDeveloperGuide.rst b/src/coreComponents/constitutive/docs/constitutiveDeveloperGuide.rst index 224903eabfc..8f1b7292122 100644 --- a/src/coreComponents/constitutive/docs/constitutiveDeveloperGuide.rst +++ b/src/coreComponents/constitutive/docs/constitutiveDeveloperGuide.rst @@ -88,7 +88,7 @@ dependency of porosity and permeability on the primary unknowns. The base class ``CoupledSolidBase`` implements some basic behaviors and is used to access a generic ``CoupledSolid`` in a physics solver: -.. literalinclude:: /coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +.. literalinclude:: /coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp :language: c++ :start-after: //START_SPHINX_INCLUDE_COUPLEDSOLID :end-before: //END_SPHINX_INCLUDE_COUPLEDSOLID diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp deleted file mode 100644 index 96398d60a59..00000000000 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * 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 SinglePhaseConstantThermalConductivity.cpp - */ - -#include "SinglePhaseConstantThermalConductivity.hpp" - -namespace geos -{ - -using namespace dataRepository; - -namespace constitutive -{ - -SinglePhaseConstantThermalConductivity::SinglePhaseConstantThermalConductivity( string const & name, Group * const parent ): - SinglePhaseThermalConductivityBase( name, parent ) -{ - registerWrapper( viewKeyStruct::thermalConductivityComponentsString(), &m_thermalConductivityComponents ). - setInputFlag( InputFlags::REQUIRED ). - setRestartFlags( RestartFlags::NO_WRITE ). - setDescription( "xx, yy, and zz components of a diagonal thermal conductivity tensor [J/(s.m.K)]" ); -} - -std::unique_ptr< ConstitutiveBase > -SinglePhaseConstantThermalConductivity::deliverClone( string const & name, - Group * const parent ) const -{ - return SinglePhaseThermalConductivityBase::deliverClone( name, parent ); -} - -void SinglePhaseConstantThermalConductivity::initializeRockFluidState( arrayView2d< real64 const > const & initialPorosity ) const -{ - for( localIndex ei = 0; ei < initialPorosity.size( 0 ); ++ei ) - { - // NOTE: enforcing 1 quadrature point - for( localIndex q = 0; q < 1; ++q ) - { - m_effectiveConductivity[ei][q][0] = m_thermalConductivityComponents[0]; - m_effectiveConductivity[ei][q][1] = m_thermalConductivityComponents[1]; - m_effectiveConductivity[ei][q][2] = m_thermalConductivityComponents[2]; - } - } -} - -void SinglePhaseConstantThermalConductivity::update( arrayView2d< real64 const > const & initialPorosity ) const -{ - real64 thermalConductivityComponents[3]; - for( int i = 0; i<3; ++i ) - { - thermalConductivityComponents[i] = m_thermalConductivityComponents[i]; - } - arrayView3d< real64 > const effectiveConductivity = m_effectiveConductivity; - - forAll< parallelDevicePolicy<> >( initialPorosity.size( 0 ), [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - // NOTE: enforcing 1 quadrature point - for( localIndex q = 0; q < 1; ++q ) - { - effectiveConductivity[ei][q][0] = thermalConductivityComponents[0]; - effectiveConductivity[ei][q][1] = thermalConductivityComponents[1]; - effectiveConductivity[ei][q][2] = thermalConductivityComponents[2]; - } - } ); -} - -void SinglePhaseConstantThermalConductivity::allocateConstitutiveData( dataRepository::Group & parent, - localIndex const numConstitutivePointsPerParentIndex ) -{ - SinglePhaseThermalConductivityBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); -} - -void SinglePhaseConstantThermalConductivity::postInputInitialization() -{ - GEOS_THROW_IF( m_thermalConductivityComponents[0] <= 0 || - m_thermalConductivityComponents[1] <= 0 || - m_thermalConductivityComponents[2] <= 0, - GEOS_FMT( "{}: the components of the thermal conductivity tensor must be strictly positive", - getFullName() ), - InputError ); -} - -REGISTER_CATALOG_ENTRY( ConstitutiveBase, SinglePhaseConstantThermalConductivity, string const &, Group * const ) - -} // namespace constitutive - -} // namespace geos diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp new file mode 100644 index 00000000000..aad8dcb5187 --- /dev/null +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp @@ -0,0 +1,134 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SinglePhaseThermalConductivity.cpp + */ + +#include "SinglePhaseThermalConductivity.hpp" + +namespace geos +{ + +using namespace dataRepository; + +namespace constitutive +{ + +SinglePhaseThermalConductivity::SinglePhaseThermalConductivity( string const & name, Group * const parent ): + SinglePhaseThermalConductivityBase( name, parent ) +{ + registerWrapper( viewKeyStruct::defaultThermalConductivityComponentsString(), &m_defaultThermalConductivityComponents ). + setInputFlag( InputFlags::REQUIRED ). + setRestartFlags( RestartFlags::NO_WRITE ). + setDescription( "xx, yy, and zz diagonal components of the default thermal conductivity tensor [J/(s.m.K)]" ); + + registerWrapper( viewKeyStruct::thermalConductivityGradientComponentsString(), &m_thermalConductivityGradientComponents ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( {0.0, 0.0, 0.0} ). + setDescription( "xx, yy, and zz diagonal components of the thermal conductivity gradient tensor w.r.t. temperature [J/(s.m.K^2)]" ); + + registerWrapper( viewKeyStruct::referenceTemperatureString(), &m_referenceTemperature ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 0.0 ). + setDescription( "The reference temperature at which the conductivity components are equal to the default values" ); +} + +std::unique_ptr< ConstitutiveBase > +SinglePhaseThermalConductivity::deliverClone( string const & name, + Group * const parent ) const +{ + return SinglePhaseThermalConductivityBase::deliverClone( name, parent ); +} + +void SinglePhaseThermalConductivity::initializeRockFluidState( arrayView2d< real64 const > const & initialPorosity ) const +{ + arrayView3d< real64 > dEffectiveConductivity_dT = m_dEffectiveConductivity_dT.toView(); + arrayView3d< real64 > effectiveConductivity = m_effectiveConductivity.toView(); + R1Tensor const defaultThermalConductivityComponents = m_defaultThermalConductivityComponents; + R1Tensor const thermalConductivityGradientComponents = m_thermalConductivityGradientComponents; + + forAll< parallelDevicePolicy<> >( initialPorosity.size( 0 ), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + // NOTE: enforcing 1 quadrature point + for( localIndex q = 0; q < 1; ++q ) + { + effectiveConductivity[ei][q][0] = defaultThermalConductivityComponents[0]; + effectiveConductivity[ei][q][1] = defaultThermalConductivityComponents[1]; + effectiveConductivity[ei][q][2] = defaultThermalConductivityComponents[2]; + + dEffectiveConductivity_dT[ei][q][0] = thermalConductivityGradientComponents[0]; + dEffectiveConductivity_dT[ei][q][1] = thermalConductivityGradientComponents[1]; + dEffectiveConductivity_dT[ei][q][2] = thermalConductivityGradientComponents[2]; + } + } ); +} + +void SinglePhaseThermalConductivity::updateFromTemperature( arrayView1d< real64 const > const & temperature ) const +{ + arrayView3d< real64 > dEffectiveConductivity_dT = m_dEffectiveConductivity_dT.toView(); + arrayView3d< real64 > effectiveConductivity = m_effectiveConductivity.toView(); + R1Tensor const defaultThermalConductivityComponents = m_defaultThermalConductivityComponents; + R1Tensor const thermalConductivityGradientComponents = m_thermalConductivityGradientComponents; + real64 const referenceTemperature = m_referenceTemperature; + + forAll< parallelDevicePolicy<> >( temperature.size( 0 ), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + for( localIndex q = 0; q < 1; ++q ) + { + + real64 const deltaTemperature = temperature[ei] - referenceTemperature; + + effectiveConductivity[ei][q][0] = defaultThermalConductivityComponents[0] + thermalConductivityGradientComponents[0] * deltaTemperature; + effectiveConductivity[ei][q][1] = defaultThermalConductivityComponents[1] + thermalConductivityGradientComponents[1] * deltaTemperature; + effectiveConductivity[ei][q][2] = defaultThermalConductivityComponents[2] + thermalConductivityGradientComponents[2] * deltaTemperature; + + for( localIndex i=0; i<=2; i++ ) + { + if( effectiveConductivity[ei][q][i] <1e-2 ) + { + effectiveConductivity[ei][q][i] = 1e-2; // W/m/K To avoid negative conductivity + } + } + + dEffectiveConductivity_dT[ei][q][0] = thermalConductivityGradientComponents[0]; + dEffectiveConductivity_dT[ei][q][1] = thermalConductivityGradientComponents[1]; + dEffectiveConductivity_dT[ei][q][2] = thermalConductivityGradientComponents[2]; + } + } ); +} + +void SinglePhaseThermalConductivity::allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) +{ + SinglePhaseThermalConductivityBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); +} + +void SinglePhaseThermalConductivity::postInputInitialization() +{ + GEOS_THROW_IF( m_defaultThermalConductivityComponents[0] <= 0 || + m_defaultThermalConductivityComponents[1] <= 0 || + m_defaultThermalConductivityComponents[2] <= 0, + GEOS_FMT( "{}: the components of the default thermal conductivity tensor must be strictly positive", + getFullName() ), + InputError ); + +} + +REGISTER_CATALOG_ENTRY( ConstitutiveBase, SinglePhaseThermalConductivity, string const &, Group * const ) + +} // namespace constitutive + +} // namespace geos diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.hpp similarity index 61% rename from src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp rename to src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.hpp index 7e069bd0bd2..fa6d7623ef8 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.hpp @@ -14,11 +14,11 @@ */ /** - * @file SinglePhaseConstantThermalConductivity.hpp + * @file SinglePhaseThermalConductivity.hpp */ -#ifndef GEOS_CONSTITUTIVE_SINGLEPHASE_THERMALCONDUCTIVITY_CONSTANTTHERMALCONDUCTIVITY_HPP_ -#define GEOS_CONSTITUTIVE_SINGLEPHASE_THERMALCONDUCTIVITY_CONSTANTTHERMALCONDUCTIVITY_HPP_ +#ifndef GEOS_CONSTITUTIVE_SINGLEPHASE_THERMALCONDUCTIVITY_THERMALCONDUCTIVITY_HPP_ +#define GEOS_CONSTITUTIVE_SINGLEPHASE_THERMALCONDUCTIVITY_THERMALCONDUCTIVITY_HPP_ #include "constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp" @@ -31,7 +31,7 @@ namespace constitutive /** * @brief The update class for constant thermal conductivity (does not do anything) */ -class SinglePhaseConstantThermalConductivityUpdate : public SinglePhaseThermalConductivityBaseUpdate +class SinglePhaseThermalConductivityUpdate : public SinglePhaseThermalConductivityBaseUpdate { public: @@ -40,8 +40,10 @@ class SinglePhaseConstantThermalConductivityUpdate : public SinglePhaseThermalCo * @param effectiveConductivity the array of cell-wise effective conductivities in the subregion * the subregion */ - SinglePhaseConstantThermalConductivityUpdate( arrayView3d< real64 > const & effectiveConductivity ) - : SinglePhaseThermalConductivityBaseUpdate( effectiveConductivity ) + SinglePhaseThermalConductivityUpdate( arrayView3d< real64 > const & effectiveConductivity, + arrayView3d< real64 > const & dEffectiveConductivity_dT ) + : SinglePhaseThermalConductivityBaseUpdate( effectiveConductivity, + dEffectiveConductivity_dT ) {} GEOS_HOST_DEVICE @@ -55,7 +57,7 @@ class SinglePhaseConstantThermalConductivityUpdate : public SinglePhaseThermalCo /** * @brief The class for constant thermal conductivity */ -class SinglePhaseConstantThermalConductivity : public SinglePhaseThermalConductivityBase +class SinglePhaseThermalConductivity : public SinglePhaseThermalConductivityBase { public: @@ -64,7 +66,7 @@ class SinglePhaseConstantThermalConductivity : public SinglePhaseThermalConducti * @param[in] name the name of the class * @param[in] parent pointer to the parent Group */ - SinglePhaseConstantThermalConductivity( string const & name, Group * const parent ); + SinglePhaseThermalConductivity( string const & name, Group * const parent ); std::unique_ptr< ConstitutiveBase > deliverClone( string const & name, Group * const parent ) const override; @@ -72,18 +74,16 @@ class SinglePhaseConstantThermalConductivity : public SinglePhaseThermalConducti virtual void allocateConstitutiveData( dataRepository::Group & parent, localIndex const numConstitutivePointsPerParentIndex ) override; - static string catalogName() { return "SinglePhaseConstantThermalConductivity"; } + static string catalogName() { return "SinglePhaseThermalConductivity"; } virtual string getCatalogName() const override { return catalogName(); } - virtual void initializeRockFluidState( arrayView2d< real64 const > const & initialPorosity ) const override final; - virtual void update( arrayView2d< real64 const > const & porosity ) const override final; - + virtual void updateFromTemperature( arrayView1d< real64 const > const & temperature ) const override final; /// Type of kernel wrapper for in-kernel update - using KernelWrapper = SinglePhaseConstantThermalConductivityUpdate; + using KernelWrapper = SinglePhaseThermalConductivityUpdate; /** * @brief Create an update kernel wrapper. @@ -91,12 +91,15 @@ class SinglePhaseConstantThermalConductivity : public SinglePhaseThermalConducti */ KernelWrapper createKernelWrapper() const { - return KernelWrapper( m_effectiveConductivity ); + return KernelWrapper( m_effectiveConductivity, + m_dEffectiveConductivity_dT ); } struct viewKeyStruct : public SinglePhaseThermalConductivityBase::viewKeyStruct { - static constexpr char const * thermalConductivityComponentsString() { return "thermalConductivityComponents"; } + static constexpr char const * defaultThermalConductivityComponentsString() { return "defaultThermalConductivityComponents"; } + static constexpr char const * thermalConductivityGradientComponentsString() { return "thermalConductivityGradientComponents"; } + static constexpr char const * referenceTemperatureString() { return "referenceTemperature"; } } viewKeys; protected: @@ -105,8 +108,14 @@ class SinglePhaseConstantThermalConductivity : public SinglePhaseThermalConducti private: - /// default thermal conductivity in the subRegion - R1Tensor m_thermalConductivityComponents; + /// Default thermal conductivity components in the subRegion + R1Tensor m_defaultThermalConductivityComponents; + + /// Thermal conductivity gradient components in the subRegion + R1Tensor m_thermalConductivityGradientComponents; + + /// Reference temperature + real64 m_referenceTemperature; }; diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp index 245cf2800d5..d4760a4d871 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp @@ -33,6 +33,7 @@ SinglePhaseThermalConductivityBase::SinglePhaseThermalConductivityBase( string c : ConstitutiveBase( name, parent ) { registerField( fields::thermalconductivity::effectiveConductivity{}, &m_effectiveConductivity ); + registerField( fields::thermalconductivity::dEffectiveConductivity_dT{}, &m_dEffectiveConductivity_dT ); } void SinglePhaseThermalConductivityBase::postInputInitialization() @@ -40,6 +41,7 @@ void SinglePhaseThermalConductivityBase::postInputInitialization() ConstitutiveBase::postInputInitialization(); m_effectiveConductivity.resize( 0, 0, 3 ); + m_dEffectiveConductivity_dT.resize( 0, 0, 3 ); } void SinglePhaseThermalConductivityBase::allocateConstitutiveData( dataRepository::Group & parent, @@ -47,6 +49,7 @@ void SinglePhaseThermalConductivityBase::allocateConstitutiveData( dataRepositor { // NOTE: enforcing 1 quadrature point m_effectiveConductivity.resize( 0, 1, 3 ); + m_dEffectiveConductivity_dT.resize( 0, 1, 3 ); ConstitutiveBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); } diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp index 16bdf302ec0..c0037f04751 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp @@ -56,16 +56,18 @@ class SinglePhaseThermalConductivityBaseUpdate /** * @brief Constructor for the class performing the thermal conductivity updates * @param effectiveConductivity the array of cell-wise effective conductivities in the subregion - * @param dEffectiveConductivity_dPhaseVolFrac the array of cell-wise derivatives of effective conductivities wrt phase vol fractions in - * the subregion */ - SinglePhaseThermalConductivityBaseUpdate( arrayView3d< real64 > const & effectiveConductivity ) - : m_effectiveConductivity( effectiveConductivity ) + SinglePhaseThermalConductivityBaseUpdate( arrayView3d< real64 > const & effectiveConductivity, + arrayView3d< real64 > const & dEffectiveConductivity_dT ) + : m_effectiveConductivity( effectiveConductivity ), + m_dEffectiveConductivity_dT( dEffectiveConductivity_dT ) {} /// View on the cell-wise effective conductivities arrayView3d< real64 > m_effectiveConductivity; + /// View on the derivative of effective conductivities w.r.t. temperature + arrayView3d< real64 > m_dEffectiveConductivity_dT; private: /** @@ -125,12 +127,25 @@ class SinglePhaseThermalConductivityBase : public ConstitutiveBase virtual void update( arrayView2d< real64 const > const & porosity ) const { GEOS_UNUSED_VAR( porosity ); } + /** + * @brief Update the thermal conductivity state + * @param[in] temperature the temperature field + */ + virtual void updateFromTemperature( arrayView1d< real64 const > const & temperature ) const + { GEOS_UNUSED_VAR( temperature ); } + /** * @brief Getter for the effective conductivities in the subRegion * @return an arrayView of effective conductivities */ arrayView3d< real64 const > effectiveConductivity() const { return m_effectiveConductivity; } + /** + * @brief Getter for the derivative of effective conductivities in the subRegion w.r.t. temperature + * @return an arrayView of derivative of effective conductivities w.r.t. temperature + */ + arrayView3d< real64 const > dEffectiveConductivity_dT() const { return m_dEffectiveConductivity_dT; } + private: /** @@ -147,6 +162,8 @@ class SinglePhaseThermalConductivityBase : public ConstitutiveBase /// cell-wise effective conductivities in the subregion array3d< real64 > m_effectiveConductivity; + /// Derivative of effective conductivities w.r.t. temperature + array3d< real64 > m_dEffectiveConductivity_dT; }; } // namespace constitutive diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp index 1fe3bc24a21..689dc17d22b 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp @@ -21,7 +21,7 @@ #define GEOS_CONSTITUTIVE_SINGLEPHASE_THERMALCONDUCTIVITY_THERMALCONDUCTIVITYSELECTOR_HPP #include "constitutive/ConstitutivePassThruHandler.hpp" -#include "constitutive/thermalConductivity/SinglePhaseConstantThermalConductivity.hpp" +#include "constitutive/thermalConductivity/SinglePhaseThermalConductivity.hpp" namespace geos { @@ -33,14 +33,14 @@ template< typename LAMBDA > void constitutiveUpdatePassThru( SinglePhaseThermalConductivityBase const & thermalConductivity, LAMBDA && lambda ) { - ConstitutivePassThruHandler< SinglePhaseConstantThermalConductivity >::execute( thermalConductivity, std::forward< LAMBDA >( lambda ) ); + ConstitutivePassThruHandler< SinglePhaseThermalConductivity >::execute( thermalConductivity, std::forward< LAMBDA >( lambda ) ); } template< typename LAMBDA > void constitutiveUpdatePassThru( SinglePhaseThermalConductivityBase & thermalConductivity, LAMBDA && lambda ) { - ConstitutivePassThruHandler< SinglePhaseConstantThermalConductivity >::execute( thermalConductivity, std::forward< LAMBDA >( lambda ) ); + ConstitutivePassThruHandler< SinglePhaseThermalConductivity >::execute( thermalConductivity, std::forward< LAMBDA >( lambda ) ); } } // namespace constitutive diff --git a/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp b/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp index fc259f25e29..52d85814310 100644 --- a/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp @@ -40,6 +40,14 @@ DECLARE_FIELD( effectiveConductivity, WRITE_AND_READ, "Effective conductivity" ); +DECLARE_FIELD( dEffectiveConductivity_dT, + "dEffectiveConductivity_dT", + array3d< real64 >, + 0, + LEVEL_3, + WRITE_AND_READ, + "Derivative of effective conductivity w.r.t. temperature" ); + DECLARE_FIELD( rockThermalConductivity, "rockThermalConductivity", array3d< real64 >, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 4468100083c..450019e5731 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -318,29 +318,24 @@ void SinglePhaseBase::updateEnergy( ElementSubRegionBase & subRegion ) const void SinglePhaseBase::updateSolidInternalEnergyModel( ObjectManagerBase & dataGroup ) const { - arrayView1d< real64 const > const temp = dataGroup.getField< fields::flow::temperature >(); + arrayView1d< real64 const > const temperature = dataGroup.getField< fields::flow::temperature >(); string const & solidInternalEnergyName = dataGroup.getReference< string >( viewKeyStruct::solidInternalEnergyNamesString() ); SolidInternalEnergy & solidInternalEnergy = getConstitutiveModel< SolidInternalEnergy >( dataGroup, solidInternalEnergyName ); SolidInternalEnergy::KernelWrapper solidInternalEnergyWrapper = solidInternalEnergy.createKernelUpdates(); - thermalSinglePhaseBaseKernels::SolidInternalEnergyUpdateKernel::launch< parallelDevicePolicy<> >( dataGroup.size(), solidInternalEnergyWrapper, temp ); + thermalSinglePhaseBaseKernels::SolidInternalEnergyUpdateKernel::launch< parallelDevicePolicy<> >( dataGroup.size(), solidInternalEnergyWrapper, temperature ); } void SinglePhaseBase::updateThermalConductivity( ElementSubRegionBase & subRegion ) const { - //START_SPHINX_INCLUDE_COUPLEDSOLID - CoupledSolidBase const & porousSolid = - getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); - //END_SPHINX_INCLUDE_COUPLEDSOLID - - arrayView2d< real64 const > const porosity = porousSolid.getPorosity(); - string const & thermalConductivityName = subRegion.template getReference< string >( viewKeyStruct::thermalConductivityNamesString() ); SinglePhaseThermalConductivityBase const & conductivityMaterial = getConstitutiveModel< SinglePhaseThermalConductivityBase >( subRegion, thermalConductivityName ); - conductivityMaterial.update( porosity ); + + arrayView1d< real64 const > const & temperature = subRegion.template getField< fields::flow::temperature >(); + conductivityMaterial.updateFromTemperature( temperature ); } real64 SinglePhaseBase::updateFluidState( ElementSubRegionBase & subRegion ) const diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp index 5c4973d94b8..b108ae79339 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp @@ -89,7 +89,9 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK using ThermalConductivityAccessors = StencilMaterialAccessors< constitutive::SinglePhaseThermalConductivityBase, - fields::thermalconductivity::effectiveConductivity >; + fields::thermalconductivity::effectiveConductivity, + fields::thermalconductivity::dEffectiveConductivity_dT >; + /** * @brief Constructor for the kernel interface @@ -133,7 +135,8 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK m_enthalpy( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::enthalpy {} ) ), m_dEnthalpy_dPres( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dEnthalpy_dPressure {} ) ), m_dEnthalpy_dTemp( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dEnthalpy_dTemperature {} ) ), - m_thermalConductivity( thermalConductivityAccessors.get( fields::thermalconductivity::effectiveConductivity {} ) ) + m_thermalConductivity( thermalConductivityAccessors.get( fields::thermalconductivity::effectiveConductivity {} ) ), + m_dThermalCond_dT( thermalConductivityAccessors.get( fields::thermalconductivity::dEffectiveConductivity_dT {} ) ) {} struct StackVariables : public Base::StackVariables @@ -156,10 +159,12 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK using Base::StackVariables::localFlux; using Base::StackVariables::localFluxJacobian; - // Thermal transmissibility (for now, no derivatives) - + // Thermal transmissibility real64 thermalTransmissibility[maxNumConns][2]{}; + /// Derivatives of thermal transmissibility with respect to temperature + real64 dThermalTrans_dT[maxNumConns][2]{}; + // Energy fluxes and derivatives /// Energy fluxes @@ -328,9 +333,9 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK // We follow how the thermal compositional multi-phase solver does to update the thermal transmissibility m_stencilWrapper.computeWeights( iconn, m_thermalConductivity, - m_thermalConductivity, // we have to pass something here, so we just use thermal conductivity + m_dThermalCond_dT, stack.thermalTransmissibility, - stack.dTrans_dPres ); // again, we have to pass something here, but this is unused for now + stack.dThermalTrans_dT ); localIndex k[2]; localIndex connectionIndex = 0; @@ -340,6 +345,7 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK for( k[1] = k[0] + 1; k[1] < stack.numFluxElems; ++k[1] ) { real64 const thermalTrans[2] = { stack.thermalTransmissibility[connectionIndex][0], stack.thermalTransmissibility[connectionIndex][1] }; + real64 const dThermalTrans_dT[2] = { stack.dThermalTrans_dT[connectionIndex][0], stack.dThermalTrans_dT[connectionIndex][1] }; 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] )}; @@ -353,7 +359,7 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK localIndex const ei = sei[ke]; stack.energyFlux += thermalTrans[ke] * m_temp[er][esr][ei]; - stack.dEnergyFlux_dT[ke] += thermalTrans[ke]; + stack.dEnergyFlux_dT[ke] += thermalTrans[ke] + dThermalTrans_dT[ke] * m_temp[er][esr][ei]; } // add energyFlux and its derivatives to localFlux and localFluxJacobian @@ -420,6 +426,9 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK /// View on thermal conductivity ElementViewConst< arrayView3d< real64 const > > m_thermalConductivity; + /// View on derivatives of thermal conductivity w.r.t. temperature + ElementViewConst< arrayView3d< real64 const > > m_dThermalCond_dT; + }; /** @@ -539,7 +548,8 @@ class DirichletFaceBasedAssemblyKernel : public singlePhaseFVMKernels::Dirichlet using ThermalConductivityAccessors = StencilMaterialAccessors< constitutive::SinglePhaseThermalConductivityBase, - fields::thermalconductivity::effectiveConductivity >; + fields::thermalconductivity::effectiveConductivity, + fields::thermalconductivity::dEffectiveConductivity_dT >; /** * @brief Constructor for the kernel interface @@ -591,7 +601,8 @@ class DirichletFaceBasedAssemblyKernel : public singlePhaseFVMKernels::Dirichlet m_enthalpy( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::enthalpy {} ) ), m_dEnthalpy_dPres( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dEnthalpy_dPressure {} ) ), m_dEnthalpy_dTemp( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dEnthalpy_dTemperature {} ) ), - m_thermalConductivity( thermalConductivityAccessors.get( fields::thermalconductivity::effectiveConductivity {} ) ) + m_thermalConductivity( thermalConductivityAccessors.get( fields::thermalconductivity::effectiveConductivity {} ) ), + m_dThermalCond_dT( thermalConductivityAccessors.get( fields::thermalconductivity::dEffectiveConductivity_dT {} ) ) {} @@ -682,14 +693,17 @@ class DirichletFaceBasedAssemblyKernel : public singlePhaseFVMKernels::Dirichlet // Contribution of energy conduction through the solid phase real64 thermalTrans = 0.0; - real64 dThermalTrans_dPerm[3]{}; // not used + real64 dThermalTrans_dThermalCond[3]{}; m_stencilWrapper.computeWeights( iconn, m_thermalConductivity, thermalTrans, - dThermalTrans_dPerm ); + dThermalTrans_dThermalCond ); + + real64 const dThermalTrans_dT = LvArray::tensorOps::AiBi< 3 >( dThermalTrans_dThermalCond, m_dThermalCond_dT[er][esr][ei][0] ); - stack.energyFlux += thermalTrans * ( m_temp[er][esr][ei] - m_faceTemp[kf] ); - stack.dEnergyFlux_dT += thermalTrans; + real64 const deltaT = m_temp[er][esr][ei] - m_faceTemp[kf]; + stack.energyFlux += thermalTrans * deltaT; + stack.dEnergyFlux_dT += thermalTrans + dThermalTrans_dT * deltaT; // Add energyFlux and its derivatives to localFlux and localFluxJacobian integer const localRowIndexEnergy = numEqn - 1; @@ -744,6 +758,9 @@ class DirichletFaceBasedAssemblyKernel : public singlePhaseFVMKernels::Dirichlet /// View on thermal conductivity ElementViewConst< arrayView3d< real64 const > > m_thermalConductivity; + /// View on derivatives of thermal conductivity w.r.t. temperature + ElementViewConst< arrayView3d< real64 const > > m_dThermalCond_dT; + }; diff --git a/src/coreComponents/schema/docs/Constitutive.rst b/src/coreComponents/schema/docs/Constitutive.rst index c62cb08d281..6f5e6d38dd0 100644 --- a/src/coreComponents/schema/docs/Constitutive.rst +++ b/src/coreComponents/schema/docs/Constitutive.rst @@ -73,7 +73,7 @@ ProppantSlurryFluid node :ref:`XML_ProppantSlu ProppantSolidProppantPermeability node :ref:`XML_ProppantSolidProppantPermeability` ReactiveBrine node :ref:`XML_ReactiveBrine` ReactiveBrineThermal node :ref:`XML_ReactiveBrineThermal` -SinglePhaseConstantThermalConductivity node :ref:`XML_SinglePhaseConstantThermalConductivity` +SinglePhaseThermalConductivity node :ref:`XML_SinglePhaseThermalConductivity` SlipDependentPermeability node :ref:`XML_SlipDependentPermeability` SolidInternalEnergy node :ref:`XML_SolidInternalEnergy` TableCapillaryPressure node :ref:`XML_TableCapillaryPressure` diff --git a/src/coreComponents/schema/docs/Constitutive_other.rst b/src/coreComponents/schema/docs/Constitutive_other.rst index 1195cddf026..e9d48fcdcfc 100644 --- a/src/coreComponents/schema/docs/Constitutive_other.rst +++ b/src/coreComponents/schema/docs/Constitutive_other.rst @@ -73,7 +73,7 @@ ProppantSlurryFluid node :ref:`DATASTRUCTURE_ProppantS ProppantSolidProppantPermeability node :ref:`DATASTRUCTURE_ProppantSolidProppantPermeability` ReactiveBrine node :ref:`DATASTRUCTURE_ReactiveBrine` ReactiveBrineThermal node :ref:`DATASTRUCTURE_ReactiveBrineThermal` -SinglePhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_SinglePhaseConstantThermalConductivity` +SinglePhaseThermalConductivity node :ref:`DATASTRUCTURE_SinglePhaseThermalConductivity` SlipDependentPermeability node :ref:`DATASTRUCTURE_SlipDependentPermeability` SolidInternalEnergy node :ref:`DATASTRUCTURE_SolidInternalEnergy` TableCapillaryPressure node :ref:`DATASTRUCTURE_TableCapillaryPressure` diff --git a/src/coreComponents/schema/docs/SinglePhaseConstantThermalConductivity.rst b/src/coreComponents/schema/docs/SinglePhaseConstantThermalConductivity.rst deleted file mode 100644 index d9dc99ad411..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseConstantThermalConductivity.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -============================= ========= ======== =============================================================================== -Name Type Default Description -============================= ========= ======== =============================================================================== -name groupName required A name is required for any non-unique nodes -thermalConductivityComponents R1Tensor required xx, yy, and zz components of a diagonal thermal conductivity tensor [J/(s.m.K)] -============================= ========= ======== =============================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseConstantThermalConductivity_other.rst b/src/coreComponents/schema/docs/SinglePhaseConstantThermalConductivity_other.rst deleted file mode 100644 index 02570b893e3..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseConstantThermalConductivity_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -===================== ============== ====================== -Name Type Description -===================== ============== ====================== -effectiveConductivity real64_array3d Effective conductivity -===================== ============== ====================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseThermalConductivity.rst b/src/coreComponents/schema/docs/SinglePhaseThermalConductivity.rst new file mode 100644 index 00000000000..1dc1947b73a --- /dev/null +++ b/src/coreComponents/schema/docs/SinglePhaseThermalConductivity.rst @@ -0,0 +1,12 @@ + + +===================================== ========= ======== =============================================================================================================== +Name Type Default Description +===================================== ========= ======== =============================================================================================================== +defaultThermalConductivityComponents R1Tensor required xx, yy, and zz diagonal components of the default thermal conductivity tensor [J/(s.m.K)] +name groupName required A name is required for any non-unique nodes +referenceTemperature real64 0 The reference temperature at which the conductivity components are equal to the default values +thermalConductivityGradientComponents R1Tensor {0,0,0} xx, yy, and zz diagonal components of the thermal conductivity gradient tensor w.r.t. temperature [J/(s.m.K^2)] +===================================== ========= ======== =============================================================================================================== + + diff --git a/src/coreComponents/schema/docs/SinglePhaseThermalConductivity_other.rst b/src/coreComponents/schema/docs/SinglePhaseThermalConductivity_other.rst new file mode 100644 index 00000000000..cf5ae873411 --- /dev/null +++ b/src/coreComponents/schema/docs/SinglePhaseThermalConductivity_other.rst @@ -0,0 +1,10 @@ + + +========================= ============== ======================================================= +Name Type Description +========================= ============== ======================================================= +dEffectiveConductivity_dT real64_array3d Derivative of effective conductivity w.r.t. temperature +effectiveConductivity real64_array3d Effective conductivity +========================= ============== ======================================================= + + diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 9f99b83e2c6..30fcdf27768 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -825,8 +825,8 @@ - - + + @@ -4223,7 +4223,7 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -5454,9 +5454,13 @@ If you want to do a three-phase simulation, please use instead wettingIntermedia - - - + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index fac7e939187..a4c03ba8fff 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1480,7 +1480,7 @@ - + @@ -2662,7 +2662,9 @@ - + + + diff --git a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp index 6ff832d9036..e89a27b6a53 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp @@ -103,7 +103,7 @@ char const * xmlInput = solidModelName="nullSolid" porosityModelName="rockPorosity" permeabilityModelName="rockPerm" - solidInternalEnergyModelName="rockInternalEnergy" /> + solidInternalEnergyModelName="rockInternalEnergy"/> - + - :end-before: + :start-after: + :end-before: The thermal conductivity of the medium around the wellbore is defined in the ``SinglePhaseConstantThermalConductivity`` XML block as .. literalinclude:: ../../../../../../../inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml :language: xml - :start-after: - :end-before: + :start-after: + :end-before: The volumetric heat capacity of fluid is set to a negligible value to exclude thermal convection effect. It is defined in the ``ThermalCompressibleSinglePhaseFluid`` XML block as @@ -100,7 +100,7 @@ Results and benchmark A good agreement between the GEOS results and analytical results is shown in the figure below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py +.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/linearThermalDiffusion_plot.py ------------------------------------------------------------------ diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_1.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_1.csv new file mode 100644 index 00000000000..27b265b8428 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_1.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,0.07071,0.072112,0.05,-18.996 +10000,0.07071,0.072112,0.05,-18.996 +10000,0.07211,0.07354,0.05,-17.027 +10000,0.07351,0.074968,0.05,-15.096 +10000,0.075155,0.076646,0.05,-12.871 +10000,0.075155,0.076646,0.05,-12.871 +10000,0.077046,0.078574,0.05,-10.378 +10000,0.077046,0.078574,0.05,-10.378 +10000,0.078936,0.080501,0.05,-7.9475 +10000,0.078936,0.080501,0.05,-7.9475 +10000,0.080826,0.082429,0.05,-5.5759 +10000,0.080826,0.082429,0.05,-5.5759 +10000,0.082716,0.084357,0.05,-3.2609 +10000,0.082716,0.084357,0.05,-3.2609 +10000,0.084607,0.086285,0.05,-1.0005 +10000,0.084607,0.086285,0.05,-1.0005 +10000,0.086497,0.088212,0.05,1.2075 +10000,0.086497,0.088212,0.05,1.2075 +10000,0.088387,0.09014,0.05,3.365 +10000,0.088387,0.09014,0.05,3.365 +10000,0.090278,0.092068,0.05,5.4737 +10000,0.090278,0.092068,0.05,5.4737 +10000,0.092168,0.093995,0.05,7.5355 +10000,0.092168,0.093995,0.05,7.5355 +10000,0.094031,0.095896,0.05,9.5228 +10000,0.095885,0.097786,0.05,11.459 +10000,0.095885,0.097786,0.05,11.459 +10000,0.097776,0.099715,0.05,13.391 +10000,0.097776,0.099715,0.05,13.391 +10000,0.099704,0.10168,0.05,15.318 +10000,0.099704,0.10168,0.05,15.318 +10000,0.10167,0.10369,0.05,17.241 +10000,0.10167,0.10369,0.05,17.241 +10000,0.10368,0.10573,0.05,19.159 +10000,0.10368,0.10573,0.05,19.159 +10000,0.10572,0.10782,0.05,21.071 +10000,0.10572,0.10782,0.05,21.071 +10000,0.10781,0.10995,0.05,22.977 +10000,0.10781,0.10995,0.05,22.977 +10000,0.10993,0.11211,0.05,24.877 +10000,0.10993,0.11211,0.05,24.877 +10000,0.10993,0.11211,0.05,24.877 +10000,0.1121,0.11433,0.05,26.769 +10000,0.1121,0.11433,0.05,26.769 +10000,0.11432,0.11658,0.05,28.653 +10000,0.11432,0.11658,0.05,28.653 +10000,0.11657,0.11888,0.05,30.529 +10000,0.11657,0.11888,0.05,30.529 +10000,0.11887,0.12123,0.05,32.396 +10000,0.11887,0.12123,0.05,32.396 +10000,0.11887,0.12123,0.05,32.396 +10000,0.12122,0.12362,0.05,34.254 +10000,0.12122,0.12362,0.05,34.254 +10000,0.12361,0.12607,0.05,36.1 +10000,0.12361,0.12607,0.05,36.1 +10000,0.12361,0.12607,0.05,36.1 +10000,0.12605,0.12855,0.05,37.936 +10000,0.12605,0.12855,0.05,37.936 +10000,0.12854,0.13109,0.05,39.76 +10000,0.12854,0.13109,0.05,39.76 +10000,0.12854,0.13109,0.05,39.76 +10000,0.13108,0.13368,0.05,41.571 +10000,0.13108,0.13368,0.05,41.571 +10000,0.13367,0.13632,0.05,43.368 +10000,0.13367,0.13632,0.05,43.368 +10000,0.13367,0.13632,0.05,43.368 +10000,0.13631,0.13901,0.05,45.152 +10000,0.13631,0.13901,0.05,45.152 +10000,0.13631,0.13901,0.05,45.152 +10000,0.139,0.14176,0.05,46.92 +10000,0.139,0.14176,0.05,46.92 +10000,0.14175,0.14456,0.05,48.672 +10000,0.14175,0.14456,0.05,48.672 +10000,0.14175,0.14456,0.05,48.672 +10000,0.14455,0.14742,0.05,50.407 +10000,0.14455,0.14742,0.05,50.407 +10000,0.14455,0.14742,0.05,50.407 +10000,0.1474,0.15033,0.05,52.125 +10000,0.1474,0.15033,0.05,52.125 +10000,0.1474,0.15033,0.05,52.125 +10000,0.15032,0.1533,0.05,53.824 +10000,0.15032,0.1533,0.05,53.824 +10000,0.15032,0.1533,0.05,53.824 +10000,0.15329,0.15633,0.05,55.503 +10000,0.15329,0.15633,0.05,55.503 +10000,0.15329,0.15633,0.05,55.503 +10000,0.15632,0.15942,0.05,57.161 +10000,0.15632,0.15942,0.05,57.161 +10000,0.15632,0.15942,0.05,57.161 +10000,0.15941,0.16257,0.05,58.797 +10000,0.15941,0.16257,0.05,58.797 +10000,0.15941,0.16257,0.05,58.797 +10000,0.16256,0.16578,0.05,60.411 +10000,0.16256,0.16578,0.05,60.411 +10000,0.16256,0.16578,0.05,60.411 +10000,0.16577,0.16906,0.05,62.001 +10000,0.16577,0.16906,0.05,62.001 +10000,0.16577,0.16906,0.05,62.001 +10000,0.16577,0.16906,0.05,62.001 +10000,0.16905,0.1724,0.05,63.566 +10000,0.16905,0.1724,0.05,63.566 +10000,0.16905,0.1724,0.05,63.566 +10000,0.17239,0.1758,0.05,65.106 +10000,0.17239,0.1758,0.05,65.106 +10000,0.17239,0.1758,0.05,65.106 +10000,0.17579,0.17928,0.05,66.619 +10000,0.17579,0.17928,0.05,66.619 +10000,0.17579,0.17928,0.05,66.619 +10000,0.17579,0.17928,0.05,66.619 +10000,0.17927,0.18282,0.05,68.104 +10000,0.17927,0.18282,0.05,68.104 +10000,0.17927,0.18282,0.05,68.104 +10000,0.18281,0.18644,0.05,69.56 +10000,0.18281,0.18644,0.05,69.56 +10000,0.18281,0.18644,0.05,69.56 +10000,0.18281,0.18644,0.05,69.56 +10000,0.18643,0.19013,0.05,70.986 +10000,0.18643,0.19013,0.05,70.986 +10000,0.18643,0.19013,0.05,70.986 +10000,0.18643,0.19013,0.05,70.986 +10000,0.19011,0.19388,0.05,72.382 +10000,0.19011,0.19388,0.05,72.382 +10000,0.19011,0.19388,0.05,72.382 +10000,0.19387,0.19772,0.05,73.746 +10000,0.19387,0.19772,0.05,73.746 +10000,0.19387,0.19772,0.05,73.746 +10000,0.19387,0.19772,0.05,73.746 +10000,0.19771,0.20163,0.05,75.077 +10000,0.19771,0.20163,0.05,75.077 +10000,0.19771,0.20163,0.05,75.077 +10000,0.19771,0.20163,0.05,75.077 +10000,0.20162,0.20562,0.05,76.375 +10000,0.20162,0.20562,0.05,76.375 +10000,0.20162,0.20562,0.05,76.375 +10000,0.20162,0.20562,0.05,76.375 +10000,0.2056,0.20968,0.05,77.639 +10000,0.2056,0.20968,0.05,77.639 +10000,0.2056,0.20968,0.05,77.639 +10000,0.2056,0.20968,0.05,77.639 +10000,0.20967,0.21383,0.05,78.867 +10000,0.20967,0.21383,0.05,78.867 +10000,0.20967,0.21383,0.05,78.867 +10000,0.20967,0.21383,0.05,78.867 +10000,0.21382,0.21806,0.05,80.06 +10000,0.21382,0.21806,0.05,80.06 +10000,0.21382,0.21806,0.05,80.06 +10000,0.21382,0.21806,0.05,80.06 +10000,0.21382,0.21806,0.05,80.06 +10000,0.21805,0.22237,0.05,81.216 +10000,0.21805,0.22237,0.05,81.216 +10000,0.21805,0.22237,0.05,81.216 +10000,0.21805,0.22237,0.05,81.216 +10000,0.22236,0.22677,0.05,82.334 +10000,0.22236,0.22677,0.05,82.334 +10000,0.22236,0.22677,0.05,82.334 +10000,0.22236,0.22677,0.05,82.334 +10000,0.22676,0.23125,0.05,83.416 +10000,0.22676,0.23125,0.05,83.416 +10000,0.22676,0.23125,0.05,83.416 +10000,0.22676,0.23125,0.05,83.416 +10000,0.22676,0.23125,0.05,83.416 +10000,0.23124,0.23583,0.05,84.459 +10000,0.23124,0.23583,0.05,84.459 +10000,0.23124,0.23583,0.05,84.459 +10000,0.23124,0.23583,0.05,84.459 +10000,0.23582,0.2405,0.05,85.463 +10000,0.23582,0.2405,0.05,85.463 +10000,0.23582,0.2405,0.05,85.463 +10000,0.23582,0.2405,0.05,85.463 +10000,0.23582,0.2405,0.05,85.463 +10000,0.24048,0.24525,0.05,86.429 +10000,0.24048,0.24525,0.05,86.429 +10000,0.24048,0.24525,0.05,86.429 +10000,0.24048,0.24525,0.05,86.429 +10000,0.24048,0.24525,0.05,86.429 +10000,0.24524,0.25011,0.05,87.355 +10000,0.24524,0.25011,0.05,87.355 +10000,0.24524,0.25011,0.05,87.355 +10000,0.24524,0.25011,0.05,87.355 +10000,0.24524,0.25011,0.05,87.355 +10000,0.25009,0.25505,0.05,88.242 +10000,0.25009,0.25505,0.05,88.242 +10000,0.25009,0.25505,0.05,88.242 +10000,0.25009,0.25505,0.05,88.242 +10000,0.25009,0.25505,0.05,88.242 +10000,0.25504,0.2601,0.05,89.09 +10000,0.25504,0.2601,0.05,89.09 +10000,0.25504,0.2601,0.05,89.09 +10000,0.25504,0.2601,0.05,89.09 +10000,0.25504,0.2601,0.05,89.09 +10000,0.26009,0.26525,0.05,89.899 +10000,0.26009,0.26525,0.05,89.899 +10000,0.26009,0.26525,0.05,89.899 +10000,0.26009,0.26525,0.05,89.899 +10000,0.26009,0.26525,0.05,89.899 +10000,0.26524,0.2705,0.05,90.669 +10000,0.26524,0.2705,0.05,90.669 +10000,0.26524,0.2705,0.05,90.669 +10000,0.26524,0.2705,0.05,90.669 +10000,0.26524,0.2705,0.05,90.669 +10000,0.27048,0.27585,0.05,91.4 +10000,0.27048,0.27585,0.05,91.4 +10000,0.27048,0.27585,0.05,91.4 +10000,0.27048,0.27585,0.05,91.4 +10000,0.27048,0.27585,0.05,91.4 +10000,0.27584,0.28131,0.05,92.092 +10000,0.27584,0.28131,0.05,92.092 +10000,0.27584,0.28131,0.05,92.092 +10000,0.27584,0.28131,0.05,92.092 +10000,0.27584,0.28131,0.05,92.092 +10000,0.27584,0.28131,0.05,92.092 +10000,0.2813,0.28687,0.05,92.746 +10000,0.2813,0.28687,0.05,92.746 +10000,0.2813,0.28687,0.05,92.746 +10000,0.2813,0.28687,0.05,92.746 +10000,0.2813,0.28687,0.05,92.746 +10000,0.28686,0.29255,0.05,93.363 +10000,0.28686,0.29255,0.05,93.363 +10000,0.28686,0.29255,0.05,93.363 +10000,0.28686,0.29255,0.05,93.363 +10000,0.28686,0.29255,0.05,93.363 +10000,0.28686,0.29255,0.05,93.363 +10000,0.29254,0.29834,0.05,93.944 +10000,0.29254,0.29834,0.05,93.944 +10000,0.29254,0.29834,0.05,93.944 +10000,0.29254,0.29834,0.05,93.944 +10000,0.29254,0.29834,0.05,93.944 +10000,0.29254,0.29834,0.05,93.944 +10000,0.29833,0.30425,0.05,94.488 +10000,0.29833,0.30425,0.05,94.488 +10000,0.29833,0.30425,0.05,94.488 +10000,0.29833,0.30425,0.05,94.488 +10000,0.29833,0.30425,0.05,94.488 +10000,0.29833,0.30425,0.05,94.488 +10000,0.30424,0.31027,0.05,94.997 +10000,0.30424,0.31027,0.05,94.997 +10000,0.30424,0.31027,0.05,94.997 +10000,0.30424,0.31027,0.05,94.997 +10000,0.30424,0.31027,0.05,94.997 +10000,0.30424,0.31027,0.05,94.997 +10000,0.31026,0.31641,0.05,95.472 +10000,0.31026,0.31641,0.05,95.472 +10000,0.31026,0.31641,0.05,95.472 +10000,0.31026,0.31641,0.05,95.472 +10000,0.31026,0.31641,0.05,95.472 +10000,0.31026,0.31641,0.05,95.472 +10000,0.3164,0.32267,0.05,95.914 +10000,0.3164,0.32267,0.05,95.914 +10000,0.3164,0.32267,0.05,95.914 +10000,0.3164,0.32267,0.05,95.914 +10000,0.3164,0.32267,0.05,95.914 +10000,0.3164,0.32267,0.05,95.914 +10000,0.32266,0.32906,0.05,96.324 +10000,0.32266,0.32906,0.05,96.324 +10000,0.32266,0.32906,0.05,96.324 +10000,0.32266,0.32906,0.05,96.324 +10000,0.32266,0.32906,0.05,96.324 +10000,0.32266,0.32906,0.05,96.324 +10000,0.32266,0.32906,0.05,96.324 +10000,0.32905,0.33558,0.05,96.703 +10000,0.32905,0.33558,0.05,96.703 +10000,0.32905,0.33558,0.05,96.703 +10000,0.32905,0.33558,0.05,96.703 +10000,0.32905,0.33558,0.05,96.703 +10000,0.32905,0.33558,0.05,96.703 +10000,0.33556,0.34222,0.05,97.052 +10000,0.33556,0.34222,0.05,97.052 +10000,0.33556,0.34222,0.05,97.052 +10000,0.33556,0.34222,0.05,97.052 +10000,0.33556,0.34222,0.05,97.052 +10000,0.33556,0.34222,0.05,97.052 +10000,0.33556,0.34222,0.05,97.052 +10000,0.34221,0.34899,0.05,97.373 +10000,0.34221,0.34899,0.05,97.373 +10000,0.34221,0.34899,0.05,97.373 +10000,0.34221,0.34899,0.05,97.373 +10000,0.34221,0.34899,0.05,97.373 +10000,0.34221,0.34899,0.05,97.373 +10000,0.34221,0.34899,0.05,97.373 +10000,0.34898,0.3559,0.05,97.667 +10000,0.34898,0.3559,0.05,97.667 +10000,0.34898,0.3559,0.05,97.667 +10000,0.34898,0.3559,0.05,97.667 +10000,0.34898,0.3559,0.05,97.667 +10000,0.34898,0.3559,0.05,97.667 +10000,0.35589,0.36295,0.05,97.935 +10000,0.35589,0.36295,0.05,97.935 +10000,0.35589,0.36295,0.05,97.935 +10000,0.35589,0.36295,0.05,97.935 +10000,0.35589,0.36295,0.05,97.935 +10000,0.35589,0.36295,0.05,97.935 +10000,0.35589,0.36295,0.05,97.935 +10000,0.36294,0.37013,0.05,98.179 +10000,0.36294,0.37013,0.05,98.179 +10000,0.36294,0.37013,0.05,98.179 +10000,0.36294,0.37013,0.05,98.179 +10000,0.36294,0.37013,0.05,98.179 +10000,0.36294,0.37013,0.05,98.179 +10000,0.36294,0.37013,0.05,98.179 +10000,0.36294,0.37013,0.05,98.179 +10000,0.37012,0.37746,0.05,98.4 +10000,0.37012,0.37746,0.05,98.4 +10000,0.37012,0.37746,0.05,98.4 +10000,0.37012,0.37746,0.05,98.4 +10000,0.37012,0.37746,0.05,98.4 +10000,0.37012,0.37746,0.05,98.4 +10000,0.37012,0.37746,0.05,98.4 +10000,0.37745,0.38494,0.05,98.599 +10000,0.37745,0.38494,0.05,98.599 +10000,0.37745,0.38494,0.05,98.599 +10000,0.37745,0.38494,0.05,98.599 +10000,0.37745,0.38494,0.05,98.599 +10000,0.37745,0.38494,0.05,98.599 +10000,0.37745,0.38494,0.05,98.599 +10000,0.38493,0.39256,0.05,98.778 +10000,0.38493,0.39256,0.05,98.778 +10000,0.38493,0.39256,0.05,98.778 +10000,0.38493,0.39256,0.05,98.778 +10000,0.38493,0.39256,0.05,98.778 +10000,0.38493,0.39256,0.05,98.778 +10000,0.38493,0.39256,0.05,98.778 +10000,0.38493,0.39256,0.05,98.778 +10000,0.39255,0.40033,0.05,98.939 +10000,0.39255,0.40033,0.05,98.939 +10000,0.39255,0.40033,0.05,98.939 +10000,0.39255,0.40033,0.05,98.939 +10000,0.39255,0.40033,0.05,98.939 +10000,0.39255,0.40033,0.05,98.939 +10000,0.39255,0.40033,0.05,98.939 +10000,0.39255,0.40033,0.05,98.939 +10000,0.40032,0.40826,0.05,99.082 +10000,0.40032,0.40826,0.05,99.082 +10000,0.40032,0.40826,0.05,99.082 +10000,0.40032,0.40826,0.05,99.082 +10000,0.40032,0.40826,0.05,99.082 +10000,0.40032,0.40826,0.05,99.082 +10000,0.40032,0.40826,0.05,99.082 +10000,0.40032,0.40826,0.05,99.082 +10000,0.40825,0.41634,0.05,99.209 +10000,0.40825,0.41634,0.05,99.209 +10000,0.40825,0.41634,0.05,99.209 +10000,0.40825,0.41634,0.05,99.209 +10000,0.40825,0.41634,0.05,99.209 +10000,0.40825,0.41634,0.05,99.209 +10000,0.40825,0.41634,0.05,99.209 +10000,0.40825,0.41634,0.05,99.209 +10000,0.41633,0.42459,0.05,99.321 +10000,0.41633,0.42459,0.05,99.321 +10000,0.41633,0.42459,0.05,99.321 +10000,0.41633,0.42459,0.05,99.321 +10000,0.41633,0.42459,0.05,99.321 +10000,0.41633,0.42459,0.05,99.321 +10000,0.41633,0.42459,0.05,99.321 +10000,0.41633,0.42459,0.05,99.321 +10000,0.42458,0.433,0.05,99.42 +10000,0.42458,0.433,0.05,99.42 +10000,0.42458,0.433,0.05,99.42 +10000,0.42458,0.433,0.05,99.42 +10000,0.42458,0.433,0.05,99.42 +10000,0.42458,0.433,0.05,99.42 +10000,0.42458,0.433,0.05,99.42 +10000,0.42458,0.433,0.05,99.42 +10000,0.42458,0.433,0.05,99.42 +10000,0.43298,0.44157,0.05,99.507 +10000,0.43298,0.44157,0.05,99.507 +10000,0.43298,0.44157,0.05,99.507 +10000,0.43298,0.44157,0.05,99.507 +10000,0.43298,0.44157,0.05,99.507 +10000,0.43298,0.44157,0.05,99.507 +10000,0.43298,0.44157,0.05,99.507 +10000,0.43298,0.44157,0.05,99.507 +10000,0.44156,0.45031,0.05,99.583 +10000,0.44156,0.45031,0.05,99.583 +10000,0.44156,0.45031,0.05,99.583 +10000,0.44156,0.45031,0.05,99.583 +10000,0.44156,0.45031,0.05,99.583 +10000,0.44156,0.45031,0.05,99.583 +10000,0.44156,0.45031,0.05,99.583 +10000,0.44156,0.45031,0.05,99.583 +10000,0.44156,0.45031,0.05,99.583 +10000,0.4503,0.45923,0.05,99.649 +10000,0.4503,0.45923,0.05,99.649 +10000,0.4503,0.45923,0.05,99.649 +10000,0.4503,0.45923,0.05,99.649 +10000,0.4503,0.45923,0.05,99.649 +10000,0.4503,0.45923,0.05,99.649 +10000,0.4503,0.45923,0.05,99.649 +10000,0.4503,0.45923,0.05,99.649 +10000,0.4503,0.45923,0.05,99.649 +10000,0.45922,0.46833,0.05,99.706 +10000,0.45922,0.46833,0.05,99.706 +10000,0.45922,0.46833,0.05,99.706 +10000,0.45922,0.46833,0.05,99.706 +10000,0.45922,0.46833,0.05,99.706 +10000,0.45922,0.46833,0.05,99.706 +10000,0.45922,0.46833,0.05,99.706 +10000,0.45922,0.46833,0.05,99.706 +10000,0.45922,0.46833,0.05,99.706 +10000,0.46832,0.4776,0.05,99.754 +10000,0.46832,0.4776,0.05,99.754 +10000,0.46832,0.4776,0.05,99.754 +10000,0.46832,0.4776,0.05,99.754 +10000,0.46832,0.4776,0.05,99.754 +10000,0.46832,0.4776,0.05,99.754 +10000,0.46832,0.4776,0.05,99.754 +10000,0.46832,0.4776,0.05,99.754 +10000,0.46832,0.4776,0.05,99.754 +10000,0.47759,0.48706,0.05,99.796 +10000,0.47759,0.48706,0.05,99.796 +10000,0.47759,0.48706,0.05,99.796 +10000,0.47759,0.48706,0.05,99.796 +10000,0.47759,0.48706,0.05,99.796 +10000,0.47759,0.48706,0.05,99.796 +10000,0.47759,0.48706,0.05,99.796 +10000,0.47759,0.48706,0.05,99.796 +10000,0.47759,0.48706,0.05,99.796 +10000,0.47759,0.48706,0.05,99.796 +10000,0.48705,0.49671,0.05,99.832 +10000,0.48705,0.49671,0.05,99.832 +10000,0.48705,0.49671,0.05,99.832 +10000,0.48705,0.49671,0.05,99.832 +10000,0.48705,0.49671,0.05,99.832 +10000,0.48705,0.49671,0.05,99.832 +10000,0.48705,0.49671,0.05,99.832 +10000,0.48705,0.49671,0.05,99.832 +10000,0.48705,0.49671,0.05,99.832 +10000,0.4967,0.50655,0.05,99.862 +10000,0.4967,0.50655,0.05,99.862 +10000,0.4967,0.50655,0.05,99.862 +10000,0.4967,0.50655,0.05,99.862 +10000,0.4967,0.50655,0.05,99.862 +10000,0.4967,0.50655,0.05,99.862 +10000,0.4967,0.50655,0.05,99.862 +10000,0.4967,0.50655,0.05,99.862 +10000,0.4967,0.50655,0.05,99.862 +10000,0.4967,0.50655,0.05,99.862 +10000,0.50654,0.51658,0.05,99.887 +10000,0.50654,0.51658,0.05,99.887 +10000,0.50654,0.51658,0.05,99.887 +10000,0.50654,0.51658,0.05,99.887 +10000,0.50654,0.51658,0.05,99.887 +10000,0.50654,0.51658,0.05,99.887 +10000,0.50654,0.51658,0.05,99.887 +10000,0.50654,0.51658,0.05,99.887 +10000,0.50654,0.51658,0.05,99.887 +10000,0.50654,0.51658,0.05,99.887 +10000,0.51657,0.52681,0.05,99.908 +10000,0.51657,0.52681,0.05,99.908 +10000,0.51657,0.52681,0.05,99.908 +10000,0.51657,0.52681,0.05,99.908 +10000,0.51657,0.52681,0.05,99.908 +10000,0.51657,0.52681,0.05,99.908 +10000,0.51657,0.52681,0.05,99.908 +10000,0.51657,0.52681,0.05,99.908 +10000,0.51657,0.52681,0.05,99.908 +10000,0.51657,0.52681,0.05,99.908 +10000,0.5268,0.53725,0.05,99.926 +10000,0.5268,0.53725,0.05,99.926 +10000,0.5268,0.53725,0.05,99.926 +10000,0.5268,0.53725,0.05,99.926 +10000,0.5268,0.53725,0.05,99.926 +10000,0.5268,0.53725,0.05,99.926 +10000,0.5268,0.53725,0.05,99.926 +10000,0.5268,0.53725,0.05,99.926 +10000,0.5268,0.53725,0.05,99.926 +10000,0.5268,0.53725,0.05,99.926 +10000,0.5268,0.53725,0.05,99.926 +10000,0.53724,0.54789,0.05,99.941 +10000,0.53724,0.54789,0.05,99.941 +10000,0.53724,0.54789,0.05,99.941 +10000,0.53724,0.54789,0.05,99.941 +10000,0.53724,0.54789,0.05,99.941 +10000,0.53724,0.54789,0.05,99.941 +10000,0.53724,0.54789,0.05,99.941 +10000,0.53724,0.54789,0.05,99.941 +10000,0.53724,0.54789,0.05,99.941 +10000,0.53724,0.54789,0.05,99.941 +10000,0.54788,0.55874,0.05,99.953 +10000,0.54788,0.55874,0.05,99.953 +10000,0.54788,0.55874,0.05,99.953 +10000,0.54788,0.55874,0.05,99.953 +10000,0.54788,0.55874,0.05,99.953 +10000,0.54788,0.55874,0.05,99.953 +10000,0.54788,0.55874,0.05,99.953 +10000,0.54788,0.55874,0.05,99.953 +10000,0.54788,0.55874,0.05,99.953 +10000,0.54788,0.55874,0.05,99.953 +10000,0.54788,0.55874,0.05,99.953 +10000,0.55873,0.56981,0.05,99.962 +10000,0.55873,0.56981,0.05,99.962 +10000,0.55873,0.56981,0.05,99.962 +10000,0.55873,0.56981,0.05,99.962 +10000,0.55873,0.56981,0.05,99.962 +10000,0.55873,0.56981,0.05,99.962 +10000,0.55873,0.56981,0.05,99.962 +10000,0.55873,0.56981,0.05,99.962 +10000,0.55873,0.56981,0.05,99.962 +10000,0.55873,0.56981,0.05,99.962 +10000,0.55873,0.56981,0.05,99.962 +10000,0.5698,0.5811,0.05,99.97 +10000,0.5698,0.5811,0.05,99.97 +10000,0.5698,0.5811,0.05,99.97 +10000,0.5698,0.5811,0.05,99.97 +10000,0.5698,0.5811,0.05,99.97 +10000,0.5698,0.5811,0.05,99.97 +10000,0.5698,0.5811,0.05,99.97 +10000,0.5698,0.5811,0.05,99.97 +10000,0.5698,0.5811,0.05,99.97 +10000,0.5698,0.5811,0.05,99.97 +10000,0.5698,0.5811,0.05,99.97 +10000,0.5698,0.5811,0.05,99.97 +10000,0.58109,0.59261,0.05,99.977 +10000,0.58109,0.59261,0.05,99.977 +10000,0.58109,0.59261,0.05,99.977 +10000,0.58109,0.59261,0.05,99.977 +10000,0.58109,0.59261,0.05,99.977 +10000,0.58109,0.59261,0.05,99.977 +10000,0.58109,0.59261,0.05,99.977 +10000,0.58109,0.59261,0.05,99.977 +10000,0.58109,0.59261,0.05,99.977 +10000,0.58109,0.59261,0.05,99.977 +10000,0.58109,0.59261,0.05,99.977 +10000,0.5926,0.60435,0.05,99.982 +10000,0.5926,0.60435,0.05,99.982 +10000,0.5926,0.60435,0.05,99.982 +10000,0.5926,0.60435,0.05,99.982 +10000,0.5926,0.60435,0.05,99.982 +10000,0.5926,0.60435,0.05,99.982 +10000,0.5926,0.60435,0.05,99.982 +10000,0.5926,0.60435,0.05,99.982 +10000,0.5926,0.60435,0.05,99.982 +10000,0.5926,0.60435,0.05,99.982 +10000,0.5926,0.60435,0.05,99.982 +10000,0.5926,0.60435,0.05,99.982 +10000,0.60434,0.61632,0.05,99.986 +10000,0.60434,0.61632,0.05,99.986 +10000,0.60434,0.61632,0.05,99.986 +10000,0.60434,0.61632,0.05,99.986 +10000,0.60434,0.61632,0.05,99.986 +10000,0.60434,0.61632,0.05,99.986 +10000,0.60434,0.61632,0.05,99.986 +10000,0.60434,0.61632,0.05,99.986 +10000,0.60434,0.61632,0.05,99.986 +10000,0.60434,0.61632,0.05,99.986 +10000,0.60434,0.61632,0.05,99.986 +10000,0.60434,0.61632,0.05,99.986 +10000,0.61631,0.62853,0.05,99.99 +10000,0.61631,0.62853,0.05,99.99 +10000,0.61631,0.62853,0.05,99.99 +10000,0.61631,0.62853,0.05,99.99 +10000,0.61631,0.62853,0.05,99.99 +10000,0.61631,0.62853,0.05,99.99 +10000,0.61631,0.62853,0.05,99.99 +10000,0.61631,0.62853,0.05,99.99 +10000,0.61631,0.62853,0.05,99.99 +10000,0.61631,0.62853,0.05,99.99 +10000,0.61631,0.62853,0.05,99.99 +10000,0.61631,0.62853,0.05,99.99 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.62852,0.64098,0.05,99.992 +10000,0.64097,0.65368,0.05,99.994 +10000,0.64097,0.65368,0.05,99.994 +10000,0.64097,0.65368,0.05,99.994 +10000,0.64097,0.65368,0.05,99.994 +10000,0.64097,0.65368,0.05,99.994 +10000,0.64097,0.65368,0.05,99.994 +10000,0.64097,0.65368,0.05,99.994 +10000,0.64097,0.65368,0.05,99.994 +10000,0.64097,0.65368,0.05,99.994 +10000,0.64097,0.65368,0.05,99.994 +10000,0.64097,0.65368,0.05,99.994 +10000,0.64097,0.65368,0.05,99.994 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.65367,0.66663,0.05,99.996 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.66662,0.67984,0.05,99.997 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.67983,0.69331,0.05,99.998 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_10.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_10.csv new file mode 100644 index 00000000000..7980a3a5bfe --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_10.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,0.07071,0.072112,0.05,-19.432 +1e+05,0.07071,0.072112,0.05,-19.432 +1e+05,0.07211,0.07354,0.05,-18.317 +1e+05,0.07351,0.074968,0.05,-17.224 +1e+05,0.075155,0.076646,0.05,-15.964 +1e+05,0.075155,0.076646,0.05,-15.964 +1e+05,0.077046,0.078574,0.05,-14.552 +1e+05,0.077046,0.078574,0.05,-14.552 +1e+05,0.078936,0.080501,0.05,-13.175 +1e+05,0.078936,0.080501,0.05,-13.175 +1e+05,0.080826,0.082429,0.05,-11.83 +1e+05,0.080826,0.082429,0.05,-11.83 +1e+05,0.082716,0.084357,0.05,-10.516 +1e+05,0.082716,0.084357,0.05,-10.516 +1e+05,0.084607,0.086285,0.05,-9.2319 +1e+05,0.084607,0.086285,0.05,-9.2319 +1e+05,0.086497,0.088212,0.05,-7.9764 +1e+05,0.086497,0.088212,0.05,-7.9764 +1e+05,0.088387,0.09014,0.05,-6.748 +1e+05,0.088387,0.09014,0.05,-6.748 +1e+05,0.090278,0.092068,0.05,-5.5458 +1e+05,0.090278,0.092068,0.05,-5.5458 +1e+05,0.092168,0.093995,0.05,-4.3685 +1e+05,0.092168,0.093995,0.05,-4.3685 +1e+05,0.094031,0.095896,0.05,-3.2318 +1e+05,0.095885,0.097786,0.05,-2.1226 +1e+05,0.095885,0.097786,0.05,-2.1226 +1e+05,0.097776,0.099715,0.05,-1.0134 +1e+05,0.097776,0.099715,0.05,-1.0134 +1e+05,0.099704,0.10168,0.05,0.095763 +1e+05,0.099704,0.10168,0.05,0.095763 +1e+05,0.10167,0.10369,0.05,1.2049 +1e+05,0.10167,0.10369,0.05,1.2049 +1e+05,0.10368,0.10573,0.05,2.3141 +1e+05,0.10368,0.10573,0.05,2.3141 +1e+05,0.10572,0.10782,0.05,3.4231 +1e+05,0.10572,0.10782,0.05,3.4231 +1e+05,0.10781,0.10995,0.05,4.5321 +1e+05,0.10781,0.10995,0.05,4.5321 +1e+05,0.10993,0.11211,0.05,5.641 +1e+05,0.10993,0.11211,0.05,5.641 +1e+05,0.10993,0.11211,0.05,5.641 +1e+05,0.1121,0.11433,0.05,6.7497 +1e+05,0.1121,0.11433,0.05,6.7497 +1e+05,0.11432,0.11658,0.05,7.8584 +1e+05,0.11432,0.11658,0.05,7.8584 +1e+05,0.11657,0.11888,0.05,8.9668 +1e+05,0.11657,0.11888,0.05,8.9668 +1e+05,0.11887,0.12123,0.05,10.075 +1e+05,0.11887,0.12123,0.05,10.075 +1e+05,0.11887,0.12123,0.05,10.075 +1e+05,0.12122,0.12362,0.05,11.183 +1e+05,0.12122,0.12362,0.05,11.183 +1e+05,0.12361,0.12607,0.05,12.291 +1e+05,0.12361,0.12607,0.05,12.291 +1e+05,0.12361,0.12607,0.05,12.291 +1e+05,0.12605,0.12855,0.05,13.399 +1e+05,0.12605,0.12855,0.05,13.399 +1e+05,0.12854,0.13109,0.05,14.506 +1e+05,0.12854,0.13109,0.05,14.506 +1e+05,0.12854,0.13109,0.05,14.506 +1e+05,0.13108,0.13368,0.05,15.613 +1e+05,0.13108,0.13368,0.05,15.613 +1e+05,0.13367,0.13632,0.05,16.72 +1e+05,0.13367,0.13632,0.05,16.72 +1e+05,0.13367,0.13632,0.05,16.72 +1e+05,0.13631,0.13901,0.05,17.826 +1e+05,0.13631,0.13901,0.05,17.826 +1e+05,0.13631,0.13901,0.05,17.826 +1e+05,0.139,0.14176,0.05,18.932 +1e+05,0.139,0.14176,0.05,18.932 +1e+05,0.14175,0.14456,0.05,20.037 +1e+05,0.14175,0.14456,0.05,20.037 +1e+05,0.14175,0.14456,0.05,20.037 +1e+05,0.14455,0.14742,0.05,21.142 +1e+05,0.14455,0.14742,0.05,21.142 +1e+05,0.14455,0.14742,0.05,21.142 +1e+05,0.1474,0.15033,0.05,22.246 +1e+05,0.1474,0.15033,0.05,22.246 +1e+05,0.1474,0.15033,0.05,22.246 +1e+05,0.15032,0.1533,0.05,23.35 +1e+05,0.15032,0.1533,0.05,23.35 +1e+05,0.15032,0.1533,0.05,23.35 +1e+05,0.15329,0.15633,0.05,24.453 +1e+05,0.15329,0.15633,0.05,24.453 +1e+05,0.15329,0.15633,0.05,24.453 +1e+05,0.15632,0.15942,0.05,25.556 +1e+05,0.15632,0.15942,0.05,25.556 +1e+05,0.15632,0.15942,0.05,25.556 +1e+05,0.15941,0.16257,0.05,26.658 +1e+05,0.15941,0.16257,0.05,26.658 +1e+05,0.15941,0.16257,0.05,26.658 +1e+05,0.16256,0.16578,0.05,27.759 +1e+05,0.16256,0.16578,0.05,27.759 +1e+05,0.16256,0.16578,0.05,27.759 +1e+05,0.16577,0.16906,0.05,28.859 +1e+05,0.16577,0.16906,0.05,28.859 +1e+05,0.16577,0.16906,0.05,28.859 +1e+05,0.16577,0.16906,0.05,28.859 +1e+05,0.16905,0.1724,0.05,29.959 +1e+05,0.16905,0.1724,0.05,29.959 +1e+05,0.16905,0.1724,0.05,29.959 +1e+05,0.17239,0.1758,0.05,31.057 +1e+05,0.17239,0.1758,0.05,31.057 +1e+05,0.17239,0.1758,0.05,31.057 +1e+05,0.17579,0.17928,0.05,32.155 +1e+05,0.17579,0.17928,0.05,32.155 +1e+05,0.17579,0.17928,0.05,32.155 +1e+05,0.17579,0.17928,0.05,32.155 +1e+05,0.17927,0.18282,0.05,33.251 +1e+05,0.17927,0.18282,0.05,33.251 +1e+05,0.17927,0.18282,0.05,33.251 +1e+05,0.18281,0.18644,0.05,34.346 +1e+05,0.18281,0.18644,0.05,34.346 +1e+05,0.18281,0.18644,0.05,34.346 +1e+05,0.18281,0.18644,0.05,34.346 +1e+05,0.18643,0.19013,0.05,35.441 +1e+05,0.18643,0.19013,0.05,35.441 +1e+05,0.18643,0.19013,0.05,35.441 +1e+05,0.18643,0.19013,0.05,35.441 +1e+05,0.19011,0.19388,0.05,36.534 +1e+05,0.19011,0.19388,0.05,36.534 +1e+05,0.19011,0.19388,0.05,36.534 +1e+05,0.19387,0.19772,0.05,37.625 +1e+05,0.19387,0.19772,0.05,37.625 +1e+05,0.19387,0.19772,0.05,37.625 +1e+05,0.19387,0.19772,0.05,37.625 +1e+05,0.19771,0.20163,0.05,38.715 +1e+05,0.19771,0.20163,0.05,38.715 +1e+05,0.19771,0.20163,0.05,38.715 +1e+05,0.19771,0.20163,0.05,38.715 +1e+05,0.20162,0.20562,0.05,39.804 +1e+05,0.20162,0.20562,0.05,39.804 +1e+05,0.20162,0.20562,0.05,39.804 +1e+05,0.20162,0.20562,0.05,39.804 +1e+05,0.2056,0.20968,0.05,40.891 +1e+05,0.2056,0.20968,0.05,40.891 +1e+05,0.2056,0.20968,0.05,40.891 +1e+05,0.2056,0.20968,0.05,40.891 +1e+05,0.20967,0.21383,0.05,41.976 +1e+05,0.20967,0.21383,0.05,41.976 +1e+05,0.20967,0.21383,0.05,41.976 +1e+05,0.20967,0.21383,0.05,41.976 +1e+05,0.21382,0.21806,0.05,43.06 +1e+05,0.21382,0.21806,0.05,43.06 +1e+05,0.21382,0.21806,0.05,43.06 +1e+05,0.21382,0.21806,0.05,43.06 +1e+05,0.21382,0.21806,0.05,43.06 +1e+05,0.21805,0.22237,0.05,44.142 +1e+05,0.21805,0.22237,0.05,44.142 +1e+05,0.21805,0.22237,0.05,44.142 +1e+05,0.21805,0.22237,0.05,44.142 +1e+05,0.22236,0.22677,0.05,45.222 +1e+05,0.22236,0.22677,0.05,45.222 +1e+05,0.22236,0.22677,0.05,45.222 +1e+05,0.22236,0.22677,0.05,45.222 +1e+05,0.22676,0.23125,0.05,46.299 +1e+05,0.22676,0.23125,0.05,46.299 +1e+05,0.22676,0.23125,0.05,46.299 +1e+05,0.22676,0.23125,0.05,46.299 +1e+05,0.22676,0.23125,0.05,46.299 +1e+05,0.23124,0.23583,0.05,47.375 +1e+05,0.23124,0.23583,0.05,47.375 +1e+05,0.23124,0.23583,0.05,47.375 +1e+05,0.23124,0.23583,0.05,47.375 +1e+05,0.23582,0.2405,0.05,48.448 +1e+05,0.23582,0.2405,0.05,48.448 +1e+05,0.23582,0.2405,0.05,48.448 +1e+05,0.23582,0.2405,0.05,48.448 +1e+05,0.23582,0.2405,0.05,48.448 +1e+05,0.24048,0.24525,0.05,49.519 +1e+05,0.24048,0.24525,0.05,49.519 +1e+05,0.24048,0.24525,0.05,49.519 +1e+05,0.24048,0.24525,0.05,49.519 +1e+05,0.24048,0.24525,0.05,49.519 +1e+05,0.24524,0.25011,0.05,50.587 +1e+05,0.24524,0.25011,0.05,50.587 +1e+05,0.24524,0.25011,0.05,50.587 +1e+05,0.24524,0.25011,0.05,50.587 +1e+05,0.24524,0.25011,0.05,50.587 +1e+05,0.25009,0.25505,0.05,51.653 +1e+05,0.25009,0.25505,0.05,51.653 +1e+05,0.25009,0.25505,0.05,51.653 +1e+05,0.25009,0.25505,0.05,51.653 +1e+05,0.25009,0.25505,0.05,51.653 +1e+05,0.25504,0.2601,0.05,52.715 +1e+05,0.25504,0.2601,0.05,52.715 +1e+05,0.25504,0.2601,0.05,52.715 +1e+05,0.25504,0.2601,0.05,52.715 +1e+05,0.25504,0.2601,0.05,52.715 +1e+05,0.26009,0.26525,0.05,53.775 +1e+05,0.26009,0.26525,0.05,53.775 +1e+05,0.26009,0.26525,0.05,53.775 +1e+05,0.26009,0.26525,0.05,53.775 +1e+05,0.26009,0.26525,0.05,53.775 +1e+05,0.26524,0.2705,0.05,54.832 +1e+05,0.26524,0.2705,0.05,54.832 +1e+05,0.26524,0.2705,0.05,54.832 +1e+05,0.26524,0.2705,0.05,54.832 +1e+05,0.26524,0.2705,0.05,54.832 +1e+05,0.27048,0.27585,0.05,55.885 +1e+05,0.27048,0.27585,0.05,55.885 +1e+05,0.27048,0.27585,0.05,55.885 +1e+05,0.27048,0.27585,0.05,55.885 +1e+05,0.27048,0.27585,0.05,55.885 +1e+05,0.27584,0.28131,0.05,56.935 +1e+05,0.27584,0.28131,0.05,56.935 +1e+05,0.27584,0.28131,0.05,56.935 +1e+05,0.27584,0.28131,0.05,56.935 +1e+05,0.27584,0.28131,0.05,56.935 +1e+05,0.27584,0.28131,0.05,56.935 +1e+05,0.2813,0.28687,0.05,57.982 +1e+05,0.2813,0.28687,0.05,57.982 +1e+05,0.2813,0.28687,0.05,57.982 +1e+05,0.2813,0.28687,0.05,57.982 +1e+05,0.2813,0.28687,0.05,57.982 +1e+05,0.28686,0.29255,0.05,59.025 +1e+05,0.28686,0.29255,0.05,59.025 +1e+05,0.28686,0.29255,0.05,59.025 +1e+05,0.28686,0.29255,0.05,59.025 +1e+05,0.28686,0.29255,0.05,59.025 +1e+05,0.28686,0.29255,0.05,59.025 +1e+05,0.29254,0.29834,0.05,60.063 +1e+05,0.29254,0.29834,0.05,60.063 +1e+05,0.29254,0.29834,0.05,60.063 +1e+05,0.29254,0.29834,0.05,60.063 +1e+05,0.29254,0.29834,0.05,60.063 +1e+05,0.29254,0.29834,0.05,60.063 +1e+05,0.29833,0.30425,0.05,61.098 +1e+05,0.29833,0.30425,0.05,61.098 +1e+05,0.29833,0.30425,0.05,61.098 +1e+05,0.29833,0.30425,0.05,61.098 +1e+05,0.29833,0.30425,0.05,61.098 +1e+05,0.29833,0.30425,0.05,61.098 +1e+05,0.30424,0.31027,0.05,62.129 +1e+05,0.30424,0.31027,0.05,62.129 +1e+05,0.30424,0.31027,0.05,62.129 +1e+05,0.30424,0.31027,0.05,62.129 +1e+05,0.30424,0.31027,0.05,62.129 +1e+05,0.30424,0.31027,0.05,62.129 +1e+05,0.31026,0.31641,0.05,63.155 +1e+05,0.31026,0.31641,0.05,63.155 +1e+05,0.31026,0.31641,0.05,63.155 +1e+05,0.31026,0.31641,0.05,63.155 +1e+05,0.31026,0.31641,0.05,63.155 +1e+05,0.31026,0.31641,0.05,63.155 +1e+05,0.3164,0.32267,0.05,64.177 +1e+05,0.3164,0.32267,0.05,64.177 +1e+05,0.3164,0.32267,0.05,64.177 +1e+05,0.3164,0.32267,0.05,64.177 +1e+05,0.3164,0.32267,0.05,64.177 +1e+05,0.3164,0.32267,0.05,64.177 +1e+05,0.32266,0.32906,0.05,65.194 +1e+05,0.32266,0.32906,0.05,65.194 +1e+05,0.32266,0.32906,0.05,65.194 +1e+05,0.32266,0.32906,0.05,65.194 +1e+05,0.32266,0.32906,0.05,65.194 +1e+05,0.32266,0.32906,0.05,65.194 +1e+05,0.32266,0.32906,0.05,65.194 +1e+05,0.32905,0.33558,0.05,66.205 +1e+05,0.32905,0.33558,0.05,66.205 +1e+05,0.32905,0.33558,0.05,66.205 +1e+05,0.32905,0.33558,0.05,66.205 +1e+05,0.32905,0.33558,0.05,66.205 +1e+05,0.32905,0.33558,0.05,66.205 +1e+05,0.33556,0.34222,0.05,67.212 +1e+05,0.33556,0.34222,0.05,67.212 +1e+05,0.33556,0.34222,0.05,67.212 +1e+05,0.33556,0.34222,0.05,67.212 +1e+05,0.33556,0.34222,0.05,67.212 +1e+05,0.33556,0.34222,0.05,67.212 +1e+05,0.33556,0.34222,0.05,67.212 +1e+05,0.34221,0.34899,0.05,68.214 +1e+05,0.34221,0.34899,0.05,68.214 +1e+05,0.34221,0.34899,0.05,68.214 +1e+05,0.34221,0.34899,0.05,68.214 +1e+05,0.34221,0.34899,0.05,68.214 +1e+05,0.34221,0.34899,0.05,68.214 +1e+05,0.34221,0.34899,0.05,68.214 +1e+05,0.34898,0.3559,0.05,69.209 +1e+05,0.34898,0.3559,0.05,69.209 +1e+05,0.34898,0.3559,0.05,69.209 +1e+05,0.34898,0.3559,0.05,69.209 +1e+05,0.34898,0.3559,0.05,69.209 +1e+05,0.34898,0.3559,0.05,69.209 +1e+05,0.35589,0.36295,0.05,70.2 +1e+05,0.35589,0.36295,0.05,70.2 +1e+05,0.35589,0.36295,0.05,70.2 +1e+05,0.35589,0.36295,0.05,70.2 +1e+05,0.35589,0.36295,0.05,70.2 +1e+05,0.35589,0.36295,0.05,70.2 +1e+05,0.35589,0.36295,0.05,70.2 +1e+05,0.36294,0.37013,0.05,71.184 +1e+05,0.36294,0.37013,0.05,71.184 +1e+05,0.36294,0.37013,0.05,71.184 +1e+05,0.36294,0.37013,0.05,71.184 +1e+05,0.36294,0.37013,0.05,71.184 +1e+05,0.36294,0.37013,0.05,71.184 +1e+05,0.36294,0.37013,0.05,71.184 +1e+05,0.36294,0.37013,0.05,71.184 +1e+05,0.37012,0.37746,0.05,72.162 +1e+05,0.37012,0.37746,0.05,72.162 +1e+05,0.37012,0.37746,0.05,72.162 +1e+05,0.37012,0.37746,0.05,72.162 +1e+05,0.37012,0.37746,0.05,72.162 +1e+05,0.37012,0.37746,0.05,72.162 +1e+05,0.37012,0.37746,0.05,72.162 +1e+05,0.37745,0.38494,0.05,73.134 +1e+05,0.37745,0.38494,0.05,73.134 +1e+05,0.37745,0.38494,0.05,73.134 +1e+05,0.37745,0.38494,0.05,73.134 +1e+05,0.37745,0.38494,0.05,73.134 +1e+05,0.37745,0.38494,0.05,73.134 +1e+05,0.37745,0.38494,0.05,73.134 +1e+05,0.38493,0.39256,0.05,74.099 +1e+05,0.38493,0.39256,0.05,74.099 +1e+05,0.38493,0.39256,0.05,74.099 +1e+05,0.38493,0.39256,0.05,74.099 +1e+05,0.38493,0.39256,0.05,74.099 +1e+05,0.38493,0.39256,0.05,74.099 +1e+05,0.38493,0.39256,0.05,74.099 +1e+05,0.38493,0.39256,0.05,74.099 +1e+05,0.39255,0.40033,0.05,75.057 +1e+05,0.39255,0.40033,0.05,75.057 +1e+05,0.39255,0.40033,0.05,75.057 +1e+05,0.39255,0.40033,0.05,75.057 +1e+05,0.39255,0.40033,0.05,75.057 +1e+05,0.39255,0.40033,0.05,75.057 +1e+05,0.39255,0.40033,0.05,75.057 +1e+05,0.39255,0.40033,0.05,75.057 +1e+05,0.40032,0.40826,0.05,76.009 +1e+05,0.40032,0.40826,0.05,76.009 +1e+05,0.40032,0.40826,0.05,76.009 +1e+05,0.40032,0.40826,0.05,76.009 +1e+05,0.40032,0.40826,0.05,76.009 +1e+05,0.40032,0.40826,0.05,76.009 +1e+05,0.40032,0.40826,0.05,76.009 +1e+05,0.40032,0.40826,0.05,76.009 +1e+05,0.40825,0.41634,0.05,76.954 +1e+05,0.40825,0.41634,0.05,76.954 +1e+05,0.40825,0.41634,0.05,76.954 +1e+05,0.40825,0.41634,0.05,76.954 +1e+05,0.40825,0.41634,0.05,76.954 +1e+05,0.40825,0.41634,0.05,76.954 +1e+05,0.40825,0.41634,0.05,76.954 +1e+05,0.40825,0.41634,0.05,76.954 +1e+05,0.41633,0.42459,0.05,77.891 +1e+05,0.41633,0.42459,0.05,77.891 +1e+05,0.41633,0.42459,0.05,77.891 +1e+05,0.41633,0.42459,0.05,77.891 +1e+05,0.41633,0.42459,0.05,77.891 +1e+05,0.41633,0.42459,0.05,77.891 +1e+05,0.41633,0.42459,0.05,77.891 +1e+05,0.41633,0.42459,0.05,77.891 +1e+05,0.42458,0.433,0.05,78.821 +1e+05,0.42458,0.433,0.05,78.821 +1e+05,0.42458,0.433,0.05,78.821 +1e+05,0.42458,0.433,0.05,78.821 +1e+05,0.42458,0.433,0.05,78.821 +1e+05,0.42458,0.433,0.05,78.821 +1e+05,0.42458,0.433,0.05,78.821 +1e+05,0.42458,0.433,0.05,78.821 +1e+05,0.42458,0.433,0.05,78.821 +1e+05,0.43298,0.44157,0.05,79.743 +1e+05,0.43298,0.44157,0.05,79.743 +1e+05,0.43298,0.44157,0.05,79.743 +1e+05,0.43298,0.44157,0.05,79.743 +1e+05,0.43298,0.44157,0.05,79.743 +1e+05,0.43298,0.44157,0.05,79.743 +1e+05,0.43298,0.44157,0.05,79.743 +1e+05,0.43298,0.44157,0.05,79.743 +1e+05,0.44156,0.45031,0.05,80.658 +1e+05,0.44156,0.45031,0.05,80.658 +1e+05,0.44156,0.45031,0.05,80.658 +1e+05,0.44156,0.45031,0.05,80.658 +1e+05,0.44156,0.45031,0.05,80.658 +1e+05,0.44156,0.45031,0.05,80.658 +1e+05,0.44156,0.45031,0.05,80.658 +1e+05,0.44156,0.45031,0.05,80.658 +1e+05,0.44156,0.45031,0.05,80.658 +1e+05,0.4503,0.45923,0.05,81.565 +1e+05,0.4503,0.45923,0.05,81.565 +1e+05,0.4503,0.45923,0.05,81.565 +1e+05,0.4503,0.45923,0.05,81.565 +1e+05,0.4503,0.45923,0.05,81.565 +1e+05,0.4503,0.45923,0.05,81.565 +1e+05,0.4503,0.45923,0.05,81.565 +1e+05,0.4503,0.45923,0.05,81.565 +1e+05,0.4503,0.45923,0.05,81.565 +1e+05,0.45922,0.46833,0.05,82.464 +1e+05,0.45922,0.46833,0.05,82.464 +1e+05,0.45922,0.46833,0.05,82.464 +1e+05,0.45922,0.46833,0.05,82.464 +1e+05,0.45922,0.46833,0.05,82.464 +1e+05,0.45922,0.46833,0.05,82.464 +1e+05,0.45922,0.46833,0.05,82.464 +1e+05,0.45922,0.46833,0.05,82.464 +1e+05,0.45922,0.46833,0.05,82.464 +1e+05,0.46832,0.4776,0.05,83.355 +1e+05,0.46832,0.4776,0.05,83.355 +1e+05,0.46832,0.4776,0.05,83.355 +1e+05,0.46832,0.4776,0.05,83.355 +1e+05,0.46832,0.4776,0.05,83.355 +1e+05,0.46832,0.4776,0.05,83.355 +1e+05,0.46832,0.4776,0.05,83.355 +1e+05,0.46832,0.4776,0.05,83.355 +1e+05,0.46832,0.4776,0.05,83.355 +1e+05,0.47759,0.48706,0.05,84.238 +1e+05,0.47759,0.48706,0.05,84.238 +1e+05,0.47759,0.48706,0.05,84.238 +1e+05,0.47759,0.48706,0.05,84.238 +1e+05,0.47759,0.48706,0.05,84.238 +1e+05,0.47759,0.48706,0.05,84.238 +1e+05,0.47759,0.48706,0.05,84.238 +1e+05,0.47759,0.48706,0.05,84.238 +1e+05,0.47759,0.48706,0.05,84.238 +1e+05,0.47759,0.48706,0.05,84.238 +1e+05,0.48705,0.49671,0.05,85.112 +1e+05,0.48705,0.49671,0.05,85.112 +1e+05,0.48705,0.49671,0.05,85.112 +1e+05,0.48705,0.49671,0.05,85.112 +1e+05,0.48705,0.49671,0.05,85.112 +1e+05,0.48705,0.49671,0.05,85.112 +1e+05,0.48705,0.49671,0.05,85.112 +1e+05,0.48705,0.49671,0.05,85.112 +1e+05,0.48705,0.49671,0.05,85.112 +1e+05,0.4967,0.50655,0.05,85.979 +1e+05,0.4967,0.50655,0.05,85.979 +1e+05,0.4967,0.50655,0.05,85.979 +1e+05,0.4967,0.50655,0.05,85.979 +1e+05,0.4967,0.50655,0.05,85.979 +1e+05,0.4967,0.50655,0.05,85.979 +1e+05,0.4967,0.50655,0.05,85.979 +1e+05,0.4967,0.50655,0.05,85.979 +1e+05,0.4967,0.50655,0.05,85.979 +1e+05,0.4967,0.50655,0.05,85.979 +1e+05,0.50654,0.51658,0.05,86.837 +1e+05,0.50654,0.51658,0.05,86.837 +1e+05,0.50654,0.51658,0.05,86.837 +1e+05,0.50654,0.51658,0.05,86.837 +1e+05,0.50654,0.51658,0.05,86.837 +1e+05,0.50654,0.51658,0.05,86.837 +1e+05,0.50654,0.51658,0.05,86.837 +1e+05,0.50654,0.51658,0.05,86.837 +1e+05,0.50654,0.51658,0.05,86.837 +1e+05,0.50654,0.51658,0.05,86.837 +1e+05,0.51657,0.52681,0.05,87.687 +1e+05,0.51657,0.52681,0.05,87.687 +1e+05,0.51657,0.52681,0.05,87.687 +1e+05,0.51657,0.52681,0.05,87.687 +1e+05,0.51657,0.52681,0.05,87.687 +1e+05,0.51657,0.52681,0.05,87.687 +1e+05,0.51657,0.52681,0.05,87.687 +1e+05,0.51657,0.52681,0.05,87.687 +1e+05,0.51657,0.52681,0.05,87.687 +1e+05,0.51657,0.52681,0.05,87.687 +1e+05,0.5268,0.53725,0.05,88.53 +1e+05,0.5268,0.53725,0.05,88.53 +1e+05,0.5268,0.53725,0.05,88.53 +1e+05,0.5268,0.53725,0.05,88.53 +1e+05,0.5268,0.53725,0.05,88.53 +1e+05,0.5268,0.53725,0.05,88.53 +1e+05,0.5268,0.53725,0.05,88.53 +1e+05,0.5268,0.53725,0.05,88.53 +1e+05,0.5268,0.53725,0.05,88.53 +1e+05,0.5268,0.53725,0.05,88.53 +1e+05,0.5268,0.53725,0.05,88.53 +1e+05,0.53724,0.54789,0.05,89.364 +1e+05,0.53724,0.54789,0.05,89.364 +1e+05,0.53724,0.54789,0.05,89.364 +1e+05,0.53724,0.54789,0.05,89.364 +1e+05,0.53724,0.54789,0.05,89.364 +1e+05,0.53724,0.54789,0.05,89.364 +1e+05,0.53724,0.54789,0.05,89.364 +1e+05,0.53724,0.54789,0.05,89.364 +1e+05,0.53724,0.54789,0.05,89.364 +1e+05,0.53724,0.54789,0.05,89.364 +1e+05,0.54788,0.55874,0.05,90.19 +1e+05,0.54788,0.55874,0.05,90.19 +1e+05,0.54788,0.55874,0.05,90.19 +1e+05,0.54788,0.55874,0.05,90.19 +1e+05,0.54788,0.55874,0.05,90.19 +1e+05,0.54788,0.55874,0.05,90.19 +1e+05,0.54788,0.55874,0.05,90.19 +1e+05,0.54788,0.55874,0.05,90.19 +1e+05,0.54788,0.55874,0.05,90.19 +1e+05,0.54788,0.55874,0.05,90.19 +1e+05,0.54788,0.55874,0.05,90.19 +1e+05,0.55873,0.56981,0.05,91.009 +1e+05,0.55873,0.56981,0.05,91.009 +1e+05,0.55873,0.56981,0.05,91.009 +1e+05,0.55873,0.56981,0.05,91.009 +1e+05,0.55873,0.56981,0.05,91.009 +1e+05,0.55873,0.56981,0.05,91.009 +1e+05,0.55873,0.56981,0.05,91.009 +1e+05,0.55873,0.56981,0.05,91.009 +1e+05,0.55873,0.56981,0.05,91.009 +1e+05,0.55873,0.56981,0.05,91.009 +1e+05,0.55873,0.56981,0.05,91.009 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.5698,0.5811,0.05,91.82 +1e+05,0.58109,0.59261,0.05,92.624 +1e+05,0.58109,0.59261,0.05,92.624 +1e+05,0.58109,0.59261,0.05,92.624 +1e+05,0.58109,0.59261,0.05,92.624 +1e+05,0.58109,0.59261,0.05,92.624 +1e+05,0.58109,0.59261,0.05,92.624 +1e+05,0.58109,0.59261,0.05,92.624 +1e+05,0.58109,0.59261,0.05,92.624 +1e+05,0.58109,0.59261,0.05,92.624 +1e+05,0.58109,0.59261,0.05,92.624 +1e+05,0.58109,0.59261,0.05,92.624 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.5926,0.60435,0.05,93.422 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.60434,0.61632,0.05,94.213 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.61631,0.62853,0.05,94.998 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.62852,0.64098,0.05,95.778 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.64097,0.65368,0.05,96.553 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.65367,0.66663,0.05,97.325 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.66662,0.67984,0.05,98.093 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.67983,0.69331,0.05,98.858 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,0.6933,0.70704,0.05,99.622 +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_2.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_2.csv new file mode 100644 index 00000000000..898f12c9d0d --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_2.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,0.07071,0.072112,0.05,-19.178 +20000,0.07071,0.072112,0.05,-19.178 +20000,0.07211,0.07354,0.05,-17.568 +20000,0.07351,0.074968,0.05,-15.988 +20000,0.075155,0.076646,0.05,-14.167 +20000,0.075155,0.076646,0.05,-14.167 +20000,0.077046,0.078574,0.05,-12.127 +20000,0.077046,0.078574,0.05,-12.127 +20000,0.078936,0.080501,0.05,-10.136 +20000,0.078936,0.080501,0.05,-10.136 +20000,0.080826,0.082429,0.05,-8.1938 +20000,0.080826,0.082429,0.05,-8.1938 +20000,0.082716,0.084357,0.05,-6.2968 +20000,0.082716,0.084357,0.05,-6.2968 +20000,0.084607,0.086285,0.05,-4.4434 +20000,0.084607,0.086285,0.05,-4.4434 +20000,0.086497,0.088212,0.05,-2.6319 +20000,0.086497,0.088212,0.05,-2.6319 +20000,0.088387,0.09014,0.05,-0.86037 +20000,0.088387,0.09014,0.05,-0.86037 +20000,0.090278,0.092068,0.05,0.87259 +20000,0.090278,0.092068,0.05,0.87259 +20000,0.092168,0.093995,0.05,2.5685 +20000,0.092168,0.093995,0.05,2.5685 +20000,0.094031,0.095896,0.05,4.2049 +20000,0.095885,0.097786,0.05,5.8006 +20000,0.095885,0.097786,0.05,5.8006 +20000,0.097776,0.099715,0.05,7.3951 +20000,0.097776,0.099715,0.05,7.3951 +20000,0.099704,0.10168,0.05,8.9883 +20000,0.099704,0.10168,0.05,8.9883 +20000,0.10167,0.10369,0.05,10.58 +20000,0.10167,0.10369,0.05,10.58 +20000,0.10368,0.10573,0.05,12.17 +20000,0.10368,0.10573,0.05,12.17 +20000,0.10572,0.10782,0.05,13.758 +20000,0.10572,0.10782,0.05,13.758 +20000,0.10781,0.10995,0.05,15.344 +20000,0.10781,0.10995,0.05,15.344 +20000,0.10993,0.11211,0.05,16.928 +20000,0.10993,0.11211,0.05,16.928 +20000,0.10993,0.11211,0.05,16.928 +20000,0.1121,0.11433,0.05,18.509 +20000,0.1121,0.11433,0.05,18.509 +20000,0.11432,0.11658,0.05,20.088 +20000,0.11432,0.11658,0.05,20.088 +20000,0.11657,0.11888,0.05,21.664 +20000,0.11657,0.11888,0.05,21.664 +20000,0.11887,0.12123,0.05,23.237 +20000,0.11887,0.12123,0.05,23.237 +20000,0.11887,0.12123,0.05,23.237 +20000,0.12122,0.12362,0.05,24.806 +20000,0.12122,0.12362,0.05,24.806 +20000,0.12361,0.12607,0.05,26.372 +20000,0.12361,0.12607,0.05,26.372 +20000,0.12361,0.12607,0.05,26.372 +20000,0.12605,0.12855,0.05,27.933 +20000,0.12605,0.12855,0.05,27.933 +20000,0.12854,0.13109,0.05,29.491 +20000,0.12854,0.13109,0.05,29.491 +20000,0.12854,0.13109,0.05,29.491 +20000,0.13108,0.13368,0.05,31.044 +20000,0.13108,0.13368,0.05,31.044 +20000,0.13367,0.13632,0.05,32.592 +20000,0.13367,0.13632,0.05,32.592 +20000,0.13367,0.13632,0.05,32.592 +20000,0.13631,0.13901,0.05,34.135 +20000,0.13631,0.13901,0.05,34.135 +20000,0.13631,0.13901,0.05,34.135 +20000,0.139,0.14176,0.05,35.673 +20000,0.139,0.14176,0.05,35.673 +20000,0.14175,0.14456,0.05,37.204 +20000,0.14175,0.14456,0.05,37.204 +20000,0.14175,0.14456,0.05,37.204 +20000,0.14455,0.14742,0.05,38.73 +20000,0.14455,0.14742,0.05,38.73 +20000,0.14455,0.14742,0.05,38.73 +20000,0.1474,0.15033,0.05,40.248 +20000,0.1474,0.15033,0.05,40.248 +20000,0.1474,0.15033,0.05,40.248 +20000,0.15032,0.1533,0.05,41.76 +20000,0.15032,0.1533,0.05,41.76 +20000,0.15032,0.1533,0.05,41.76 +20000,0.15329,0.15633,0.05,43.264 +20000,0.15329,0.15633,0.05,43.264 +20000,0.15329,0.15633,0.05,43.264 +20000,0.15632,0.15942,0.05,44.76 +20000,0.15632,0.15942,0.05,44.76 +20000,0.15632,0.15942,0.05,44.76 +20000,0.15941,0.16257,0.05,46.248 +20000,0.15941,0.16257,0.05,46.248 +20000,0.15941,0.16257,0.05,46.248 +20000,0.16256,0.16578,0.05,47.726 +20000,0.16256,0.16578,0.05,47.726 +20000,0.16256,0.16578,0.05,47.726 +20000,0.16577,0.16906,0.05,49.195 +20000,0.16577,0.16906,0.05,49.195 +20000,0.16577,0.16906,0.05,49.195 +20000,0.16577,0.16906,0.05,49.195 +20000,0.16905,0.1724,0.05,50.655 +20000,0.16905,0.1724,0.05,50.655 +20000,0.16905,0.1724,0.05,50.655 +20000,0.17239,0.1758,0.05,52.103 +20000,0.17239,0.1758,0.05,52.103 +20000,0.17239,0.1758,0.05,52.103 +20000,0.17579,0.17928,0.05,53.541 +20000,0.17579,0.17928,0.05,53.541 +20000,0.17579,0.17928,0.05,53.541 +20000,0.17579,0.17928,0.05,53.541 +20000,0.17927,0.18282,0.05,54.967 +20000,0.17927,0.18282,0.05,54.967 +20000,0.17927,0.18282,0.05,54.967 +20000,0.18281,0.18644,0.05,56.381 +20000,0.18281,0.18644,0.05,56.381 +20000,0.18281,0.18644,0.05,56.381 +20000,0.18281,0.18644,0.05,56.381 +20000,0.18643,0.19013,0.05,57.781 +20000,0.18643,0.19013,0.05,57.781 +20000,0.18643,0.19013,0.05,57.781 +20000,0.18643,0.19013,0.05,57.781 +20000,0.19011,0.19388,0.05,59.169 +20000,0.19011,0.19388,0.05,59.169 +20000,0.19011,0.19388,0.05,59.169 +20000,0.19387,0.19772,0.05,60.542 +20000,0.19387,0.19772,0.05,60.542 +20000,0.19387,0.19772,0.05,60.542 +20000,0.19387,0.19772,0.05,60.542 +20000,0.19771,0.20163,0.05,61.9 +20000,0.19771,0.20163,0.05,61.9 +20000,0.19771,0.20163,0.05,61.9 +20000,0.19771,0.20163,0.05,61.9 +20000,0.20162,0.20562,0.05,63.243 +20000,0.20162,0.20562,0.05,63.243 +20000,0.20162,0.20562,0.05,63.243 +20000,0.20162,0.20562,0.05,63.243 +20000,0.2056,0.20968,0.05,64.57 +20000,0.2056,0.20968,0.05,64.57 +20000,0.2056,0.20968,0.05,64.57 +20000,0.2056,0.20968,0.05,64.57 +20000,0.20967,0.21383,0.05,65.88 +20000,0.20967,0.21383,0.05,65.88 +20000,0.20967,0.21383,0.05,65.88 +20000,0.20967,0.21383,0.05,65.88 +20000,0.21382,0.21806,0.05,67.173 +20000,0.21382,0.21806,0.05,67.173 +20000,0.21382,0.21806,0.05,67.173 +20000,0.21382,0.21806,0.05,67.173 +20000,0.21382,0.21806,0.05,67.173 +20000,0.21805,0.22237,0.05,68.447 +20000,0.21805,0.22237,0.05,68.447 +20000,0.21805,0.22237,0.05,68.447 +20000,0.21805,0.22237,0.05,68.447 +20000,0.22236,0.22677,0.05,69.702 +20000,0.22236,0.22677,0.05,69.702 +20000,0.22236,0.22677,0.05,69.702 +20000,0.22236,0.22677,0.05,69.702 +20000,0.22676,0.23125,0.05,70.938 +20000,0.22676,0.23125,0.05,70.938 +20000,0.22676,0.23125,0.05,70.938 +20000,0.22676,0.23125,0.05,70.938 +20000,0.22676,0.23125,0.05,70.938 +20000,0.23124,0.23583,0.05,72.153 +20000,0.23124,0.23583,0.05,72.153 +20000,0.23124,0.23583,0.05,72.153 +20000,0.23124,0.23583,0.05,72.153 +20000,0.23582,0.2405,0.05,73.347 +20000,0.23582,0.2405,0.05,73.347 +20000,0.23582,0.2405,0.05,73.347 +20000,0.23582,0.2405,0.05,73.347 +20000,0.23582,0.2405,0.05,73.347 +20000,0.24048,0.24525,0.05,74.519 +20000,0.24048,0.24525,0.05,74.519 +20000,0.24048,0.24525,0.05,74.519 +20000,0.24048,0.24525,0.05,74.519 +20000,0.24048,0.24525,0.05,74.519 +20000,0.24524,0.25011,0.05,75.669 +20000,0.24524,0.25011,0.05,75.669 +20000,0.24524,0.25011,0.05,75.669 +20000,0.24524,0.25011,0.05,75.669 +20000,0.24524,0.25011,0.05,75.669 +20000,0.25009,0.25505,0.05,76.796 +20000,0.25009,0.25505,0.05,76.796 +20000,0.25009,0.25505,0.05,76.796 +20000,0.25009,0.25505,0.05,76.796 +20000,0.25009,0.25505,0.05,76.796 +20000,0.25504,0.2601,0.05,77.898 +20000,0.25504,0.2601,0.05,77.898 +20000,0.25504,0.2601,0.05,77.898 +20000,0.25504,0.2601,0.05,77.898 +20000,0.25504,0.2601,0.05,77.898 +20000,0.26009,0.26525,0.05,78.976 +20000,0.26009,0.26525,0.05,78.976 +20000,0.26009,0.26525,0.05,78.976 +20000,0.26009,0.26525,0.05,78.976 +20000,0.26009,0.26525,0.05,78.976 +20000,0.26524,0.2705,0.05,80.029 +20000,0.26524,0.2705,0.05,80.029 +20000,0.26524,0.2705,0.05,80.029 +20000,0.26524,0.2705,0.05,80.029 +20000,0.26524,0.2705,0.05,80.029 +20000,0.27048,0.27585,0.05,81.055 +20000,0.27048,0.27585,0.05,81.055 +20000,0.27048,0.27585,0.05,81.055 +20000,0.27048,0.27585,0.05,81.055 +20000,0.27048,0.27585,0.05,81.055 +20000,0.27584,0.28131,0.05,82.055 +20000,0.27584,0.28131,0.05,82.055 +20000,0.27584,0.28131,0.05,82.055 +20000,0.27584,0.28131,0.05,82.055 +20000,0.27584,0.28131,0.05,82.055 +20000,0.27584,0.28131,0.05,82.055 +20000,0.2813,0.28687,0.05,83.028 +20000,0.2813,0.28687,0.05,83.028 +20000,0.2813,0.28687,0.05,83.028 +20000,0.2813,0.28687,0.05,83.028 +20000,0.2813,0.28687,0.05,83.028 +20000,0.28686,0.29255,0.05,83.973 +20000,0.28686,0.29255,0.05,83.973 +20000,0.28686,0.29255,0.05,83.973 +20000,0.28686,0.29255,0.05,83.973 +20000,0.28686,0.29255,0.05,83.973 +20000,0.28686,0.29255,0.05,83.973 +20000,0.29254,0.29834,0.05,84.89 +20000,0.29254,0.29834,0.05,84.89 +20000,0.29254,0.29834,0.05,84.89 +20000,0.29254,0.29834,0.05,84.89 +20000,0.29254,0.29834,0.05,84.89 +20000,0.29254,0.29834,0.05,84.89 +20000,0.29833,0.30425,0.05,85.779 +20000,0.29833,0.30425,0.05,85.779 +20000,0.29833,0.30425,0.05,85.779 +20000,0.29833,0.30425,0.05,85.779 +20000,0.29833,0.30425,0.05,85.779 +20000,0.29833,0.30425,0.05,85.779 +20000,0.30424,0.31027,0.05,86.638 +20000,0.30424,0.31027,0.05,86.638 +20000,0.30424,0.31027,0.05,86.638 +20000,0.30424,0.31027,0.05,86.638 +20000,0.30424,0.31027,0.05,86.638 +20000,0.30424,0.31027,0.05,86.638 +20000,0.31026,0.31641,0.05,87.468 +20000,0.31026,0.31641,0.05,87.468 +20000,0.31026,0.31641,0.05,87.468 +20000,0.31026,0.31641,0.05,87.468 +20000,0.31026,0.31641,0.05,87.468 +20000,0.31026,0.31641,0.05,87.468 +20000,0.3164,0.32267,0.05,88.268 +20000,0.3164,0.32267,0.05,88.268 +20000,0.3164,0.32267,0.05,88.268 +20000,0.3164,0.32267,0.05,88.268 +20000,0.3164,0.32267,0.05,88.268 +20000,0.3164,0.32267,0.05,88.268 +20000,0.32266,0.32906,0.05,89.038 +20000,0.32266,0.32906,0.05,89.038 +20000,0.32266,0.32906,0.05,89.038 +20000,0.32266,0.32906,0.05,89.038 +20000,0.32266,0.32906,0.05,89.038 +20000,0.32266,0.32906,0.05,89.038 +20000,0.32266,0.32906,0.05,89.038 +20000,0.32905,0.33558,0.05,89.778 +20000,0.32905,0.33558,0.05,89.778 +20000,0.32905,0.33558,0.05,89.778 +20000,0.32905,0.33558,0.05,89.778 +20000,0.32905,0.33558,0.05,89.778 +20000,0.32905,0.33558,0.05,89.778 +20000,0.33556,0.34222,0.05,90.487 +20000,0.33556,0.34222,0.05,90.487 +20000,0.33556,0.34222,0.05,90.487 +20000,0.33556,0.34222,0.05,90.487 +20000,0.33556,0.34222,0.05,90.487 +20000,0.33556,0.34222,0.05,90.487 +20000,0.33556,0.34222,0.05,90.487 +20000,0.34221,0.34899,0.05,91.166 +20000,0.34221,0.34899,0.05,91.166 +20000,0.34221,0.34899,0.05,91.166 +20000,0.34221,0.34899,0.05,91.166 +20000,0.34221,0.34899,0.05,91.166 +20000,0.34221,0.34899,0.05,91.166 +20000,0.34221,0.34899,0.05,91.166 +20000,0.34898,0.3559,0.05,91.815 +20000,0.34898,0.3559,0.05,91.815 +20000,0.34898,0.3559,0.05,91.815 +20000,0.34898,0.3559,0.05,91.815 +20000,0.34898,0.3559,0.05,91.815 +20000,0.34898,0.3559,0.05,91.815 +20000,0.35589,0.36295,0.05,92.433 +20000,0.35589,0.36295,0.05,92.433 +20000,0.35589,0.36295,0.05,92.433 +20000,0.35589,0.36295,0.05,92.433 +20000,0.35589,0.36295,0.05,92.433 +20000,0.35589,0.36295,0.05,92.433 +20000,0.35589,0.36295,0.05,92.433 +20000,0.36294,0.37013,0.05,93.02 +20000,0.36294,0.37013,0.05,93.02 +20000,0.36294,0.37013,0.05,93.02 +20000,0.36294,0.37013,0.05,93.02 +20000,0.36294,0.37013,0.05,93.02 +20000,0.36294,0.37013,0.05,93.02 +20000,0.36294,0.37013,0.05,93.02 +20000,0.36294,0.37013,0.05,93.02 +20000,0.37012,0.37746,0.05,93.578 +20000,0.37012,0.37746,0.05,93.578 +20000,0.37012,0.37746,0.05,93.578 +20000,0.37012,0.37746,0.05,93.578 +20000,0.37012,0.37746,0.05,93.578 +20000,0.37012,0.37746,0.05,93.578 +20000,0.37012,0.37746,0.05,93.578 +20000,0.37745,0.38494,0.05,94.106 +20000,0.37745,0.38494,0.05,94.106 +20000,0.37745,0.38494,0.05,94.106 +20000,0.37745,0.38494,0.05,94.106 +20000,0.37745,0.38494,0.05,94.106 +20000,0.37745,0.38494,0.05,94.106 +20000,0.37745,0.38494,0.05,94.106 +20000,0.38493,0.39256,0.05,94.604 +20000,0.38493,0.39256,0.05,94.604 +20000,0.38493,0.39256,0.05,94.604 +20000,0.38493,0.39256,0.05,94.604 +20000,0.38493,0.39256,0.05,94.604 +20000,0.38493,0.39256,0.05,94.604 +20000,0.38493,0.39256,0.05,94.604 +20000,0.38493,0.39256,0.05,94.604 +20000,0.39255,0.40033,0.05,95.074 +20000,0.39255,0.40033,0.05,95.074 +20000,0.39255,0.40033,0.05,95.074 +20000,0.39255,0.40033,0.05,95.074 +20000,0.39255,0.40033,0.05,95.074 +20000,0.39255,0.40033,0.05,95.074 +20000,0.39255,0.40033,0.05,95.074 +20000,0.39255,0.40033,0.05,95.074 +20000,0.40032,0.40826,0.05,95.515 +20000,0.40032,0.40826,0.05,95.515 +20000,0.40032,0.40826,0.05,95.515 +20000,0.40032,0.40826,0.05,95.515 +20000,0.40032,0.40826,0.05,95.515 +20000,0.40032,0.40826,0.05,95.515 +20000,0.40032,0.40826,0.05,95.515 +20000,0.40032,0.40826,0.05,95.515 +20000,0.40825,0.41634,0.05,95.929 +20000,0.40825,0.41634,0.05,95.929 +20000,0.40825,0.41634,0.05,95.929 +20000,0.40825,0.41634,0.05,95.929 +20000,0.40825,0.41634,0.05,95.929 +20000,0.40825,0.41634,0.05,95.929 +20000,0.40825,0.41634,0.05,95.929 +20000,0.40825,0.41634,0.05,95.929 +20000,0.41633,0.42459,0.05,96.315 +20000,0.41633,0.42459,0.05,96.315 +20000,0.41633,0.42459,0.05,96.315 +20000,0.41633,0.42459,0.05,96.315 +20000,0.41633,0.42459,0.05,96.315 +20000,0.41633,0.42459,0.05,96.315 +20000,0.41633,0.42459,0.05,96.315 +20000,0.41633,0.42459,0.05,96.315 +20000,0.42458,0.433,0.05,96.674 +20000,0.42458,0.433,0.05,96.674 +20000,0.42458,0.433,0.05,96.674 +20000,0.42458,0.433,0.05,96.674 +20000,0.42458,0.433,0.05,96.674 +20000,0.42458,0.433,0.05,96.674 +20000,0.42458,0.433,0.05,96.674 +20000,0.42458,0.433,0.05,96.674 +20000,0.42458,0.433,0.05,96.674 +20000,0.43298,0.44157,0.05,97.009 +20000,0.43298,0.44157,0.05,97.009 +20000,0.43298,0.44157,0.05,97.009 +20000,0.43298,0.44157,0.05,97.009 +20000,0.43298,0.44157,0.05,97.009 +20000,0.43298,0.44157,0.05,97.009 +20000,0.43298,0.44157,0.05,97.009 +20000,0.43298,0.44157,0.05,97.009 +20000,0.44156,0.45031,0.05,97.318 +20000,0.44156,0.45031,0.05,97.318 +20000,0.44156,0.45031,0.05,97.318 +20000,0.44156,0.45031,0.05,97.318 +20000,0.44156,0.45031,0.05,97.318 +20000,0.44156,0.45031,0.05,97.318 +20000,0.44156,0.45031,0.05,97.318 +20000,0.44156,0.45031,0.05,97.318 +20000,0.44156,0.45031,0.05,97.318 +20000,0.4503,0.45923,0.05,97.603 +20000,0.4503,0.45923,0.05,97.603 +20000,0.4503,0.45923,0.05,97.603 +20000,0.4503,0.45923,0.05,97.603 +20000,0.4503,0.45923,0.05,97.603 +20000,0.4503,0.45923,0.05,97.603 +20000,0.4503,0.45923,0.05,97.603 +20000,0.4503,0.45923,0.05,97.603 +20000,0.4503,0.45923,0.05,97.603 +20000,0.45922,0.46833,0.05,97.866 +20000,0.45922,0.46833,0.05,97.866 +20000,0.45922,0.46833,0.05,97.866 +20000,0.45922,0.46833,0.05,97.866 +20000,0.45922,0.46833,0.05,97.866 +20000,0.45922,0.46833,0.05,97.866 +20000,0.45922,0.46833,0.05,97.866 +20000,0.45922,0.46833,0.05,97.866 +20000,0.45922,0.46833,0.05,97.866 +20000,0.46832,0.4776,0.05,98.107 +20000,0.46832,0.4776,0.05,98.107 +20000,0.46832,0.4776,0.05,98.107 +20000,0.46832,0.4776,0.05,98.107 +20000,0.46832,0.4776,0.05,98.107 +20000,0.46832,0.4776,0.05,98.107 +20000,0.46832,0.4776,0.05,98.107 +20000,0.46832,0.4776,0.05,98.107 +20000,0.46832,0.4776,0.05,98.107 +20000,0.47759,0.48706,0.05,98.327 +20000,0.47759,0.48706,0.05,98.327 +20000,0.47759,0.48706,0.05,98.327 +20000,0.47759,0.48706,0.05,98.327 +20000,0.47759,0.48706,0.05,98.327 +20000,0.47759,0.48706,0.05,98.327 +20000,0.47759,0.48706,0.05,98.327 +20000,0.47759,0.48706,0.05,98.327 +20000,0.47759,0.48706,0.05,98.327 +20000,0.47759,0.48706,0.05,98.327 +20000,0.48705,0.49671,0.05,98.527 +20000,0.48705,0.49671,0.05,98.527 +20000,0.48705,0.49671,0.05,98.527 +20000,0.48705,0.49671,0.05,98.527 +20000,0.48705,0.49671,0.05,98.527 +20000,0.48705,0.49671,0.05,98.527 +20000,0.48705,0.49671,0.05,98.527 +20000,0.48705,0.49671,0.05,98.527 +20000,0.48705,0.49671,0.05,98.527 +20000,0.4967,0.50655,0.05,98.708 +20000,0.4967,0.50655,0.05,98.708 +20000,0.4967,0.50655,0.05,98.708 +20000,0.4967,0.50655,0.05,98.708 +20000,0.4967,0.50655,0.05,98.708 +20000,0.4967,0.50655,0.05,98.708 +20000,0.4967,0.50655,0.05,98.708 +20000,0.4967,0.50655,0.05,98.708 +20000,0.4967,0.50655,0.05,98.708 +20000,0.4967,0.50655,0.05,98.708 +20000,0.50654,0.51658,0.05,98.872 +20000,0.50654,0.51658,0.05,98.872 +20000,0.50654,0.51658,0.05,98.872 +20000,0.50654,0.51658,0.05,98.872 +20000,0.50654,0.51658,0.05,98.872 +20000,0.50654,0.51658,0.05,98.872 +20000,0.50654,0.51658,0.05,98.872 +20000,0.50654,0.51658,0.05,98.872 +20000,0.50654,0.51658,0.05,98.872 +20000,0.50654,0.51658,0.05,98.872 +20000,0.51657,0.52681,0.05,99.019 +20000,0.51657,0.52681,0.05,99.019 +20000,0.51657,0.52681,0.05,99.019 +20000,0.51657,0.52681,0.05,99.019 +20000,0.51657,0.52681,0.05,99.019 +20000,0.51657,0.52681,0.05,99.019 +20000,0.51657,0.52681,0.05,99.019 +20000,0.51657,0.52681,0.05,99.019 +20000,0.51657,0.52681,0.05,99.019 +20000,0.51657,0.52681,0.05,99.019 +20000,0.5268,0.53725,0.05,99.152 +20000,0.5268,0.53725,0.05,99.152 +20000,0.5268,0.53725,0.05,99.152 +20000,0.5268,0.53725,0.05,99.152 +20000,0.5268,0.53725,0.05,99.152 +20000,0.5268,0.53725,0.05,99.152 +20000,0.5268,0.53725,0.05,99.152 +20000,0.5268,0.53725,0.05,99.152 +20000,0.5268,0.53725,0.05,99.152 +20000,0.5268,0.53725,0.05,99.152 +20000,0.5268,0.53725,0.05,99.152 +20000,0.53724,0.54789,0.05,99.27 +20000,0.53724,0.54789,0.05,99.27 +20000,0.53724,0.54789,0.05,99.27 +20000,0.53724,0.54789,0.05,99.27 +20000,0.53724,0.54789,0.05,99.27 +20000,0.53724,0.54789,0.05,99.27 +20000,0.53724,0.54789,0.05,99.27 +20000,0.53724,0.54789,0.05,99.27 +20000,0.53724,0.54789,0.05,99.27 +20000,0.53724,0.54789,0.05,99.27 +20000,0.54788,0.55874,0.05,99.374 +20000,0.54788,0.55874,0.05,99.374 +20000,0.54788,0.55874,0.05,99.374 +20000,0.54788,0.55874,0.05,99.374 +20000,0.54788,0.55874,0.05,99.374 +20000,0.54788,0.55874,0.05,99.374 +20000,0.54788,0.55874,0.05,99.374 +20000,0.54788,0.55874,0.05,99.374 +20000,0.54788,0.55874,0.05,99.374 +20000,0.54788,0.55874,0.05,99.374 +20000,0.54788,0.55874,0.05,99.374 +20000,0.55873,0.56981,0.05,99.467 +20000,0.55873,0.56981,0.05,99.467 +20000,0.55873,0.56981,0.05,99.467 +20000,0.55873,0.56981,0.05,99.467 +20000,0.55873,0.56981,0.05,99.467 +20000,0.55873,0.56981,0.05,99.467 +20000,0.55873,0.56981,0.05,99.467 +20000,0.55873,0.56981,0.05,99.467 +20000,0.55873,0.56981,0.05,99.467 +20000,0.55873,0.56981,0.05,99.467 +20000,0.55873,0.56981,0.05,99.467 +20000,0.5698,0.5811,0.05,99.549 +20000,0.5698,0.5811,0.05,99.549 +20000,0.5698,0.5811,0.05,99.549 +20000,0.5698,0.5811,0.05,99.549 +20000,0.5698,0.5811,0.05,99.549 +20000,0.5698,0.5811,0.05,99.549 +20000,0.5698,0.5811,0.05,99.549 +20000,0.5698,0.5811,0.05,99.549 +20000,0.5698,0.5811,0.05,99.549 +20000,0.5698,0.5811,0.05,99.549 +20000,0.5698,0.5811,0.05,99.549 +20000,0.5698,0.5811,0.05,99.549 +20000,0.58109,0.59261,0.05,99.621 +20000,0.58109,0.59261,0.05,99.621 +20000,0.58109,0.59261,0.05,99.621 +20000,0.58109,0.59261,0.05,99.621 +20000,0.58109,0.59261,0.05,99.621 +20000,0.58109,0.59261,0.05,99.621 +20000,0.58109,0.59261,0.05,99.621 +20000,0.58109,0.59261,0.05,99.621 +20000,0.58109,0.59261,0.05,99.621 +20000,0.58109,0.59261,0.05,99.621 +20000,0.58109,0.59261,0.05,99.621 +20000,0.5926,0.60435,0.05,99.685 +20000,0.5926,0.60435,0.05,99.685 +20000,0.5926,0.60435,0.05,99.685 +20000,0.5926,0.60435,0.05,99.685 +20000,0.5926,0.60435,0.05,99.685 +20000,0.5926,0.60435,0.05,99.685 +20000,0.5926,0.60435,0.05,99.685 +20000,0.5926,0.60435,0.05,99.685 +20000,0.5926,0.60435,0.05,99.685 +20000,0.5926,0.60435,0.05,99.685 +20000,0.5926,0.60435,0.05,99.685 +20000,0.5926,0.60435,0.05,99.685 +20000,0.60434,0.61632,0.05,99.74 +20000,0.60434,0.61632,0.05,99.74 +20000,0.60434,0.61632,0.05,99.74 +20000,0.60434,0.61632,0.05,99.74 +20000,0.60434,0.61632,0.05,99.74 +20000,0.60434,0.61632,0.05,99.74 +20000,0.60434,0.61632,0.05,99.74 +20000,0.60434,0.61632,0.05,99.74 +20000,0.60434,0.61632,0.05,99.74 +20000,0.60434,0.61632,0.05,99.74 +20000,0.60434,0.61632,0.05,99.74 +20000,0.60434,0.61632,0.05,99.74 +20000,0.61631,0.62853,0.05,99.789 +20000,0.61631,0.62853,0.05,99.789 +20000,0.61631,0.62853,0.05,99.789 +20000,0.61631,0.62853,0.05,99.789 +20000,0.61631,0.62853,0.05,99.789 +20000,0.61631,0.62853,0.05,99.789 +20000,0.61631,0.62853,0.05,99.789 +20000,0.61631,0.62853,0.05,99.789 +20000,0.61631,0.62853,0.05,99.789 +20000,0.61631,0.62853,0.05,99.789 +20000,0.61631,0.62853,0.05,99.789 +20000,0.61631,0.62853,0.05,99.789 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.62852,0.64098,0.05,99.832 +20000,0.64097,0.65368,0.05,99.869 +20000,0.64097,0.65368,0.05,99.869 +20000,0.64097,0.65368,0.05,99.869 +20000,0.64097,0.65368,0.05,99.869 +20000,0.64097,0.65368,0.05,99.869 +20000,0.64097,0.65368,0.05,99.869 +20000,0.64097,0.65368,0.05,99.869 +20000,0.64097,0.65368,0.05,99.869 +20000,0.64097,0.65368,0.05,99.869 +20000,0.64097,0.65368,0.05,99.869 +20000,0.64097,0.65368,0.05,99.869 +20000,0.64097,0.65368,0.05,99.869 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.65367,0.66663,0.05,99.903 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.66662,0.67984,0.05,99.933 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.67983,0.69331,0.05,99.961 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,0.6933,0.70704,0.05,99.987 +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_5.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_5.csv new file mode 100644 index 00000000000..a0165428e76 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/data_5.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,0.07071,0.072112,0.05,-19.345 +50000,0.07071,0.072112,0.05,-19.345 +50000,0.07211,0.07354,0.05,-18.062 +50000,0.07351,0.074968,0.05,-16.803 +50000,0.075155,0.076646,0.05,-15.352 +50000,0.075155,0.076646,0.05,-15.352 +50000,0.077046,0.078574,0.05,-13.727 +50000,0.077046,0.078574,0.05,-13.727 +50000,0.078936,0.080501,0.05,-12.141 +50000,0.078936,0.080501,0.05,-12.141 +50000,0.080826,0.082429,0.05,-10.592 +50000,0.080826,0.082429,0.05,-10.592 +50000,0.082716,0.084357,0.05,-9.0797 +50000,0.082716,0.084357,0.05,-9.0797 +50000,0.084607,0.086285,0.05,-7.6016 +50000,0.084607,0.086285,0.05,-7.6016 +50000,0.086497,0.088212,0.05,-6.1563 +50000,0.086497,0.088212,0.05,-6.1563 +50000,0.088387,0.09014,0.05,-4.7426 +50000,0.088387,0.09014,0.05,-4.7426 +50000,0.090278,0.092068,0.05,-3.359 +50000,0.090278,0.092068,0.05,-3.359 +50000,0.092168,0.093995,0.05,-2.0045 +50000,0.092168,0.093995,0.05,-2.0045 +50000,0.094031,0.095896,0.05,-0.69679 +50000,0.095885,0.097786,0.05,0.57908 +50000,0.095885,0.097786,0.05,0.57908 +50000,0.097776,0.099715,0.05,1.8547 +50000,0.097776,0.099715,0.05,1.8547 +50000,0.099704,0.10168,0.05,3.1301 +50000,0.099704,0.10168,0.05,3.1301 +50000,0.10167,0.10369,0.05,4.4051 +50000,0.10167,0.10369,0.05,4.4051 +50000,0.10368,0.10573,0.05,5.6798 +50000,0.10368,0.10573,0.05,5.6798 +50000,0.10572,0.10782,0.05,6.9541 +50000,0.10572,0.10782,0.05,6.9541 +50000,0.10781,0.10995,0.05,8.2279 +50000,0.10781,0.10995,0.05,8.2279 +50000,0.10993,0.11211,0.05,9.5012 +50000,0.10993,0.11211,0.05,9.5012 +50000,0.10993,0.11211,0.05,9.5012 +50000,0.1121,0.11433,0.05,10.774 +50000,0.1121,0.11433,0.05,10.774 +50000,0.11432,0.11658,0.05,12.046 +50000,0.11432,0.11658,0.05,12.046 +50000,0.11657,0.11888,0.05,13.317 +50000,0.11657,0.11888,0.05,13.317 +50000,0.11887,0.12123,0.05,14.588 +50000,0.11887,0.12123,0.05,14.588 +50000,0.11887,0.12123,0.05,14.588 +50000,0.12122,0.12362,0.05,15.858 +50000,0.12122,0.12362,0.05,15.858 +50000,0.12361,0.12607,0.05,17.127 +50000,0.12361,0.12607,0.05,17.127 +50000,0.12361,0.12607,0.05,17.127 +50000,0.12605,0.12855,0.05,18.395 +50000,0.12605,0.12855,0.05,18.395 +50000,0.12854,0.13109,0.05,19.662 +50000,0.12854,0.13109,0.05,19.662 +50000,0.12854,0.13109,0.05,19.662 +50000,0.13108,0.13368,0.05,20.927 +50000,0.13108,0.13368,0.05,20.927 +50000,0.13367,0.13632,0.05,22.192 +50000,0.13367,0.13632,0.05,22.192 +50000,0.13367,0.13632,0.05,22.192 +50000,0.13631,0.13901,0.05,23.455 +50000,0.13631,0.13901,0.05,23.455 +50000,0.13631,0.13901,0.05,23.455 +50000,0.139,0.14176,0.05,24.716 +50000,0.139,0.14176,0.05,24.716 +50000,0.14175,0.14456,0.05,25.977 +50000,0.14175,0.14456,0.05,25.977 +50000,0.14175,0.14456,0.05,25.977 +50000,0.14455,0.14742,0.05,27.235 +50000,0.14455,0.14742,0.05,27.235 +50000,0.14455,0.14742,0.05,27.235 +50000,0.1474,0.15033,0.05,28.492 +50000,0.1474,0.15033,0.05,28.492 +50000,0.1474,0.15033,0.05,28.492 +50000,0.15032,0.1533,0.05,29.746 +50000,0.15032,0.1533,0.05,29.746 +50000,0.15032,0.1533,0.05,29.746 +50000,0.15329,0.15633,0.05,30.999 +50000,0.15329,0.15633,0.05,30.999 +50000,0.15329,0.15633,0.05,30.999 +50000,0.15632,0.15942,0.05,32.249 +50000,0.15632,0.15942,0.05,32.249 +50000,0.15632,0.15942,0.05,32.249 +50000,0.15941,0.16257,0.05,33.497 +50000,0.15941,0.16257,0.05,33.497 +50000,0.15941,0.16257,0.05,33.497 +50000,0.16256,0.16578,0.05,34.743 +50000,0.16256,0.16578,0.05,34.743 +50000,0.16256,0.16578,0.05,34.743 +50000,0.16577,0.16906,0.05,35.986 +50000,0.16577,0.16906,0.05,35.986 +50000,0.16577,0.16906,0.05,35.986 +50000,0.16577,0.16906,0.05,35.986 +50000,0.16905,0.1724,0.05,37.226 +50000,0.16905,0.1724,0.05,37.226 +50000,0.16905,0.1724,0.05,37.226 +50000,0.17239,0.1758,0.05,38.464 +50000,0.17239,0.1758,0.05,38.464 +50000,0.17239,0.1758,0.05,38.464 +50000,0.17579,0.17928,0.05,39.698 +50000,0.17579,0.17928,0.05,39.698 +50000,0.17579,0.17928,0.05,39.698 +50000,0.17579,0.17928,0.05,39.698 +50000,0.17927,0.18282,0.05,40.928 +50000,0.17927,0.18282,0.05,40.928 +50000,0.17927,0.18282,0.05,40.928 +50000,0.18281,0.18644,0.05,42.155 +50000,0.18281,0.18644,0.05,42.155 +50000,0.18281,0.18644,0.05,42.155 +50000,0.18281,0.18644,0.05,42.155 +50000,0.18643,0.19013,0.05,43.379 +50000,0.18643,0.19013,0.05,43.379 +50000,0.18643,0.19013,0.05,43.379 +50000,0.18643,0.19013,0.05,43.379 +50000,0.19011,0.19388,0.05,44.598 +50000,0.19011,0.19388,0.05,44.598 +50000,0.19011,0.19388,0.05,44.598 +50000,0.19387,0.19772,0.05,45.813 +50000,0.19387,0.19772,0.05,45.813 +50000,0.19387,0.19772,0.05,45.813 +50000,0.19387,0.19772,0.05,45.813 +50000,0.19771,0.20163,0.05,47.024 +50000,0.19771,0.20163,0.05,47.024 +50000,0.19771,0.20163,0.05,47.024 +50000,0.19771,0.20163,0.05,47.024 +50000,0.20162,0.20562,0.05,48.23 +50000,0.20162,0.20562,0.05,48.23 +50000,0.20162,0.20562,0.05,48.23 +50000,0.20162,0.20562,0.05,48.23 +50000,0.2056,0.20968,0.05,49.431 +50000,0.2056,0.20968,0.05,49.431 +50000,0.2056,0.20968,0.05,49.431 +50000,0.2056,0.20968,0.05,49.431 +50000,0.20967,0.21383,0.05,50.627 +50000,0.20967,0.21383,0.05,50.627 +50000,0.20967,0.21383,0.05,50.627 +50000,0.20967,0.21383,0.05,50.627 +50000,0.21382,0.21806,0.05,51.818 +50000,0.21382,0.21806,0.05,51.818 +50000,0.21382,0.21806,0.05,51.818 +50000,0.21382,0.21806,0.05,51.818 +50000,0.21382,0.21806,0.05,51.818 +50000,0.21805,0.22237,0.05,53.002 +50000,0.21805,0.22237,0.05,53.002 +50000,0.21805,0.22237,0.05,53.002 +50000,0.21805,0.22237,0.05,53.002 +50000,0.22236,0.22677,0.05,54.181 +50000,0.22236,0.22677,0.05,54.181 +50000,0.22236,0.22677,0.05,54.181 +50000,0.22236,0.22677,0.05,54.181 +50000,0.22676,0.23125,0.05,55.353 +50000,0.22676,0.23125,0.05,55.353 +50000,0.22676,0.23125,0.05,55.353 +50000,0.22676,0.23125,0.05,55.353 +50000,0.22676,0.23125,0.05,55.353 +50000,0.23124,0.23583,0.05,56.518 +50000,0.23124,0.23583,0.05,56.518 +50000,0.23124,0.23583,0.05,56.518 +50000,0.23124,0.23583,0.05,56.518 +50000,0.23582,0.2405,0.05,57.677 +50000,0.23582,0.2405,0.05,57.677 +50000,0.23582,0.2405,0.05,57.677 +50000,0.23582,0.2405,0.05,57.677 +50000,0.23582,0.2405,0.05,57.677 +50000,0.24048,0.24525,0.05,58.828 +50000,0.24048,0.24525,0.05,58.828 +50000,0.24048,0.24525,0.05,58.828 +50000,0.24048,0.24525,0.05,58.828 +50000,0.24048,0.24525,0.05,58.828 +50000,0.24524,0.25011,0.05,59.971 +50000,0.24524,0.25011,0.05,59.971 +50000,0.24524,0.25011,0.05,59.971 +50000,0.24524,0.25011,0.05,59.971 +50000,0.24524,0.25011,0.05,59.971 +50000,0.25009,0.25505,0.05,61.107 +50000,0.25009,0.25505,0.05,61.107 +50000,0.25009,0.25505,0.05,61.107 +50000,0.25009,0.25505,0.05,61.107 +50000,0.25009,0.25505,0.05,61.107 +50000,0.25504,0.2601,0.05,62.233 +50000,0.25504,0.2601,0.05,62.233 +50000,0.25504,0.2601,0.05,62.233 +50000,0.25504,0.2601,0.05,62.233 +50000,0.25504,0.2601,0.05,62.233 +50000,0.26009,0.26525,0.05,63.351 +50000,0.26009,0.26525,0.05,63.351 +50000,0.26009,0.26525,0.05,63.351 +50000,0.26009,0.26525,0.05,63.351 +50000,0.26009,0.26525,0.05,63.351 +50000,0.26524,0.2705,0.05,64.46 +50000,0.26524,0.2705,0.05,64.46 +50000,0.26524,0.2705,0.05,64.46 +50000,0.26524,0.2705,0.05,64.46 +50000,0.26524,0.2705,0.05,64.46 +50000,0.27048,0.27585,0.05,65.559 +50000,0.27048,0.27585,0.05,65.559 +50000,0.27048,0.27585,0.05,65.559 +50000,0.27048,0.27585,0.05,65.559 +50000,0.27048,0.27585,0.05,65.559 +50000,0.27584,0.28131,0.05,66.648 +50000,0.27584,0.28131,0.05,66.648 +50000,0.27584,0.28131,0.05,66.648 +50000,0.27584,0.28131,0.05,66.648 +50000,0.27584,0.28131,0.05,66.648 +50000,0.27584,0.28131,0.05,66.648 +50000,0.2813,0.28687,0.05,67.726 +50000,0.2813,0.28687,0.05,67.726 +50000,0.2813,0.28687,0.05,67.726 +50000,0.2813,0.28687,0.05,67.726 +50000,0.2813,0.28687,0.05,67.726 +50000,0.28686,0.29255,0.05,68.794 +50000,0.28686,0.29255,0.05,68.794 +50000,0.28686,0.29255,0.05,68.794 +50000,0.28686,0.29255,0.05,68.794 +50000,0.28686,0.29255,0.05,68.794 +50000,0.28686,0.29255,0.05,68.794 +50000,0.29254,0.29834,0.05,69.85 +50000,0.29254,0.29834,0.05,69.85 +50000,0.29254,0.29834,0.05,69.85 +50000,0.29254,0.29834,0.05,69.85 +50000,0.29254,0.29834,0.05,69.85 +50000,0.29254,0.29834,0.05,69.85 +50000,0.29833,0.30425,0.05,70.894 +50000,0.29833,0.30425,0.05,70.894 +50000,0.29833,0.30425,0.05,70.894 +50000,0.29833,0.30425,0.05,70.894 +50000,0.29833,0.30425,0.05,70.894 +50000,0.29833,0.30425,0.05,70.894 +50000,0.30424,0.31027,0.05,71.926 +50000,0.30424,0.31027,0.05,71.926 +50000,0.30424,0.31027,0.05,71.926 +50000,0.30424,0.31027,0.05,71.926 +50000,0.30424,0.31027,0.05,71.926 +50000,0.30424,0.31027,0.05,71.926 +50000,0.31026,0.31641,0.05,72.945 +50000,0.31026,0.31641,0.05,72.945 +50000,0.31026,0.31641,0.05,72.945 +50000,0.31026,0.31641,0.05,72.945 +50000,0.31026,0.31641,0.05,72.945 +50000,0.31026,0.31641,0.05,72.945 +50000,0.3164,0.32267,0.05,73.951 +50000,0.3164,0.32267,0.05,73.951 +50000,0.3164,0.32267,0.05,73.951 +50000,0.3164,0.32267,0.05,73.951 +50000,0.3164,0.32267,0.05,73.951 +50000,0.3164,0.32267,0.05,73.951 +50000,0.32266,0.32906,0.05,74.943 +50000,0.32266,0.32906,0.05,74.943 +50000,0.32266,0.32906,0.05,74.943 +50000,0.32266,0.32906,0.05,74.943 +50000,0.32266,0.32906,0.05,74.943 +50000,0.32266,0.32906,0.05,74.943 +50000,0.32266,0.32906,0.05,74.943 +50000,0.32905,0.33558,0.05,75.921 +50000,0.32905,0.33558,0.05,75.921 +50000,0.32905,0.33558,0.05,75.921 +50000,0.32905,0.33558,0.05,75.921 +50000,0.32905,0.33558,0.05,75.921 +50000,0.32905,0.33558,0.05,75.921 +50000,0.33556,0.34222,0.05,76.885 +50000,0.33556,0.34222,0.05,76.885 +50000,0.33556,0.34222,0.05,76.885 +50000,0.33556,0.34222,0.05,76.885 +50000,0.33556,0.34222,0.05,76.885 +50000,0.33556,0.34222,0.05,76.885 +50000,0.33556,0.34222,0.05,76.885 +50000,0.34221,0.34899,0.05,77.833 +50000,0.34221,0.34899,0.05,77.833 +50000,0.34221,0.34899,0.05,77.833 +50000,0.34221,0.34899,0.05,77.833 +50000,0.34221,0.34899,0.05,77.833 +50000,0.34221,0.34899,0.05,77.833 +50000,0.34221,0.34899,0.05,77.833 +50000,0.34898,0.3559,0.05,78.766 +50000,0.34898,0.3559,0.05,78.766 +50000,0.34898,0.3559,0.05,78.766 +50000,0.34898,0.3559,0.05,78.766 +50000,0.34898,0.3559,0.05,78.766 +50000,0.34898,0.3559,0.05,78.766 +50000,0.35589,0.36295,0.05,79.683 +50000,0.35589,0.36295,0.05,79.683 +50000,0.35589,0.36295,0.05,79.683 +50000,0.35589,0.36295,0.05,79.683 +50000,0.35589,0.36295,0.05,79.683 +50000,0.35589,0.36295,0.05,79.683 +50000,0.35589,0.36295,0.05,79.683 +50000,0.36294,0.37013,0.05,80.583 +50000,0.36294,0.37013,0.05,80.583 +50000,0.36294,0.37013,0.05,80.583 +50000,0.36294,0.37013,0.05,80.583 +50000,0.36294,0.37013,0.05,80.583 +50000,0.36294,0.37013,0.05,80.583 +50000,0.36294,0.37013,0.05,80.583 +50000,0.36294,0.37013,0.05,80.583 +50000,0.37012,0.37746,0.05,81.466 +50000,0.37012,0.37746,0.05,81.466 +50000,0.37012,0.37746,0.05,81.466 +50000,0.37012,0.37746,0.05,81.466 +50000,0.37012,0.37746,0.05,81.466 +50000,0.37012,0.37746,0.05,81.466 +50000,0.37012,0.37746,0.05,81.466 +50000,0.37745,0.38494,0.05,82.332 +50000,0.37745,0.38494,0.05,82.332 +50000,0.37745,0.38494,0.05,82.332 +50000,0.37745,0.38494,0.05,82.332 +50000,0.37745,0.38494,0.05,82.332 +50000,0.37745,0.38494,0.05,82.332 +50000,0.37745,0.38494,0.05,82.332 +50000,0.38493,0.39256,0.05,83.18 +50000,0.38493,0.39256,0.05,83.18 +50000,0.38493,0.39256,0.05,83.18 +50000,0.38493,0.39256,0.05,83.18 +50000,0.38493,0.39256,0.05,83.18 +50000,0.38493,0.39256,0.05,83.18 +50000,0.38493,0.39256,0.05,83.18 +50000,0.38493,0.39256,0.05,83.18 +50000,0.39255,0.40033,0.05,84.01 +50000,0.39255,0.40033,0.05,84.01 +50000,0.39255,0.40033,0.05,84.01 +50000,0.39255,0.40033,0.05,84.01 +50000,0.39255,0.40033,0.05,84.01 +50000,0.39255,0.40033,0.05,84.01 +50000,0.39255,0.40033,0.05,84.01 +50000,0.39255,0.40033,0.05,84.01 +50000,0.40032,0.40826,0.05,84.821 +50000,0.40032,0.40826,0.05,84.821 +50000,0.40032,0.40826,0.05,84.821 +50000,0.40032,0.40826,0.05,84.821 +50000,0.40032,0.40826,0.05,84.821 +50000,0.40032,0.40826,0.05,84.821 +50000,0.40032,0.40826,0.05,84.821 +50000,0.40032,0.40826,0.05,84.821 +50000,0.40825,0.41634,0.05,85.613 +50000,0.40825,0.41634,0.05,85.613 +50000,0.40825,0.41634,0.05,85.613 +50000,0.40825,0.41634,0.05,85.613 +50000,0.40825,0.41634,0.05,85.613 +50000,0.40825,0.41634,0.05,85.613 +50000,0.40825,0.41634,0.05,85.613 +50000,0.40825,0.41634,0.05,85.613 +50000,0.41633,0.42459,0.05,86.386 +50000,0.41633,0.42459,0.05,86.386 +50000,0.41633,0.42459,0.05,86.386 +50000,0.41633,0.42459,0.05,86.386 +50000,0.41633,0.42459,0.05,86.386 +50000,0.41633,0.42459,0.05,86.386 +50000,0.41633,0.42459,0.05,86.386 +50000,0.41633,0.42459,0.05,86.386 +50000,0.42458,0.433,0.05,87.139 +50000,0.42458,0.433,0.05,87.139 +50000,0.42458,0.433,0.05,87.139 +50000,0.42458,0.433,0.05,87.139 +50000,0.42458,0.433,0.05,87.139 +50000,0.42458,0.433,0.05,87.139 +50000,0.42458,0.433,0.05,87.139 +50000,0.42458,0.433,0.05,87.139 +50000,0.42458,0.433,0.05,87.139 +50000,0.43298,0.44157,0.05,87.872 +50000,0.43298,0.44157,0.05,87.872 +50000,0.43298,0.44157,0.05,87.872 +50000,0.43298,0.44157,0.05,87.872 +50000,0.43298,0.44157,0.05,87.872 +50000,0.43298,0.44157,0.05,87.872 +50000,0.43298,0.44157,0.05,87.872 +50000,0.43298,0.44157,0.05,87.872 +50000,0.44156,0.45031,0.05,88.586 +50000,0.44156,0.45031,0.05,88.586 +50000,0.44156,0.45031,0.05,88.586 +50000,0.44156,0.45031,0.05,88.586 +50000,0.44156,0.45031,0.05,88.586 +50000,0.44156,0.45031,0.05,88.586 +50000,0.44156,0.45031,0.05,88.586 +50000,0.44156,0.45031,0.05,88.586 +50000,0.44156,0.45031,0.05,88.586 +50000,0.4503,0.45923,0.05,89.278 +50000,0.4503,0.45923,0.05,89.278 +50000,0.4503,0.45923,0.05,89.278 +50000,0.4503,0.45923,0.05,89.278 +50000,0.4503,0.45923,0.05,89.278 +50000,0.4503,0.45923,0.05,89.278 +50000,0.4503,0.45923,0.05,89.278 +50000,0.4503,0.45923,0.05,89.278 +50000,0.4503,0.45923,0.05,89.278 +50000,0.45922,0.46833,0.05,89.951 +50000,0.45922,0.46833,0.05,89.951 +50000,0.45922,0.46833,0.05,89.951 +50000,0.45922,0.46833,0.05,89.951 +50000,0.45922,0.46833,0.05,89.951 +50000,0.45922,0.46833,0.05,89.951 +50000,0.45922,0.46833,0.05,89.951 +50000,0.45922,0.46833,0.05,89.951 +50000,0.45922,0.46833,0.05,89.951 +50000,0.46832,0.4776,0.05,90.602 +50000,0.46832,0.4776,0.05,90.602 +50000,0.46832,0.4776,0.05,90.602 +50000,0.46832,0.4776,0.05,90.602 +50000,0.46832,0.4776,0.05,90.602 +50000,0.46832,0.4776,0.05,90.602 +50000,0.46832,0.4776,0.05,90.602 +50000,0.46832,0.4776,0.05,90.602 +50000,0.46832,0.4776,0.05,90.602 +50000,0.47759,0.48706,0.05,91.234 +50000,0.47759,0.48706,0.05,91.234 +50000,0.47759,0.48706,0.05,91.234 +50000,0.47759,0.48706,0.05,91.234 +50000,0.47759,0.48706,0.05,91.234 +50000,0.47759,0.48706,0.05,91.234 +50000,0.47759,0.48706,0.05,91.234 +50000,0.47759,0.48706,0.05,91.234 +50000,0.47759,0.48706,0.05,91.234 +50000,0.47759,0.48706,0.05,91.234 +50000,0.48705,0.49671,0.05,91.844 +50000,0.48705,0.49671,0.05,91.844 +50000,0.48705,0.49671,0.05,91.844 +50000,0.48705,0.49671,0.05,91.844 +50000,0.48705,0.49671,0.05,91.844 +50000,0.48705,0.49671,0.05,91.844 +50000,0.48705,0.49671,0.05,91.844 +50000,0.48705,0.49671,0.05,91.844 +50000,0.48705,0.49671,0.05,91.844 +50000,0.4967,0.50655,0.05,92.434 +50000,0.4967,0.50655,0.05,92.434 +50000,0.4967,0.50655,0.05,92.434 +50000,0.4967,0.50655,0.05,92.434 +50000,0.4967,0.50655,0.05,92.434 +50000,0.4967,0.50655,0.05,92.434 +50000,0.4967,0.50655,0.05,92.434 +50000,0.4967,0.50655,0.05,92.434 +50000,0.4967,0.50655,0.05,92.434 +50000,0.4967,0.50655,0.05,92.434 +50000,0.50654,0.51658,0.05,93.004 +50000,0.50654,0.51658,0.05,93.004 +50000,0.50654,0.51658,0.05,93.004 +50000,0.50654,0.51658,0.05,93.004 +50000,0.50654,0.51658,0.05,93.004 +50000,0.50654,0.51658,0.05,93.004 +50000,0.50654,0.51658,0.05,93.004 +50000,0.50654,0.51658,0.05,93.004 +50000,0.50654,0.51658,0.05,93.004 +50000,0.50654,0.51658,0.05,93.004 +50000,0.51657,0.52681,0.05,93.553 +50000,0.51657,0.52681,0.05,93.553 +50000,0.51657,0.52681,0.05,93.553 +50000,0.51657,0.52681,0.05,93.553 +50000,0.51657,0.52681,0.05,93.553 +50000,0.51657,0.52681,0.05,93.553 +50000,0.51657,0.52681,0.05,93.553 +50000,0.51657,0.52681,0.05,93.553 +50000,0.51657,0.52681,0.05,93.553 +50000,0.51657,0.52681,0.05,93.553 +50000,0.5268,0.53725,0.05,94.083 +50000,0.5268,0.53725,0.05,94.083 +50000,0.5268,0.53725,0.05,94.083 +50000,0.5268,0.53725,0.05,94.083 +50000,0.5268,0.53725,0.05,94.083 +50000,0.5268,0.53725,0.05,94.083 +50000,0.5268,0.53725,0.05,94.083 +50000,0.5268,0.53725,0.05,94.083 +50000,0.5268,0.53725,0.05,94.083 +50000,0.5268,0.53725,0.05,94.083 +50000,0.5268,0.53725,0.05,94.083 +50000,0.53724,0.54789,0.05,94.593 +50000,0.53724,0.54789,0.05,94.593 +50000,0.53724,0.54789,0.05,94.593 +50000,0.53724,0.54789,0.05,94.593 +50000,0.53724,0.54789,0.05,94.593 +50000,0.53724,0.54789,0.05,94.593 +50000,0.53724,0.54789,0.05,94.593 +50000,0.53724,0.54789,0.05,94.593 +50000,0.53724,0.54789,0.05,94.593 +50000,0.53724,0.54789,0.05,94.593 +50000,0.54788,0.55874,0.05,95.084 +50000,0.54788,0.55874,0.05,95.084 +50000,0.54788,0.55874,0.05,95.084 +50000,0.54788,0.55874,0.05,95.084 +50000,0.54788,0.55874,0.05,95.084 +50000,0.54788,0.55874,0.05,95.084 +50000,0.54788,0.55874,0.05,95.084 +50000,0.54788,0.55874,0.05,95.084 +50000,0.54788,0.55874,0.05,95.084 +50000,0.54788,0.55874,0.05,95.084 +50000,0.54788,0.55874,0.05,95.084 +50000,0.55873,0.56981,0.05,95.557 +50000,0.55873,0.56981,0.05,95.557 +50000,0.55873,0.56981,0.05,95.557 +50000,0.55873,0.56981,0.05,95.557 +50000,0.55873,0.56981,0.05,95.557 +50000,0.55873,0.56981,0.05,95.557 +50000,0.55873,0.56981,0.05,95.557 +50000,0.55873,0.56981,0.05,95.557 +50000,0.55873,0.56981,0.05,95.557 +50000,0.55873,0.56981,0.05,95.557 +50000,0.55873,0.56981,0.05,95.557 +50000,0.5698,0.5811,0.05,96.012 +50000,0.5698,0.5811,0.05,96.012 +50000,0.5698,0.5811,0.05,96.012 +50000,0.5698,0.5811,0.05,96.012 +50000,0.5698,0.5811,0.05,96.012 +50000,0.5698,0.5811,0.05,96.012 +50000,0.5698,0.5811,0.05,96.012 +50000,0.5698,0.5811,0.05,96.012 +50000,0.5698,0.5811,0.05,96.012 +50000,0.5698,0.5811,0.05,96.012 +50000,0.5698,0.5811,0.05,96.012 +50000,0.5698,0.5811,0.05,96.012 +50000,0.58109,0.59261,0.05,96.45 +50000,0.58109,0.59261,0.05,96.45 +50000,0.58109,0.59261,0.05,96.45 +50000,0.58109,0.59261,0.05,96.45 +50000,0.58109,0.59261,0.05,96.45 +50000,0.58109,0.59261,0.05,96.45 +50000,0.58109,0.59261,0.05,96.45 +50000,0.58109,0.59261,0.05,96.45 +50000,0.58109,0.59261,0.05,96.45 +50000,0.58109,0.59261,0.05,96.45 +50000,0.58109,0.59261,0.05,96.45 +50000,0.5926,0.60435,0.05,96.872 +50000,0.5926,0.60435,0.05,96.872 +50000,0.5926,0.60435,0.05,96.872 +50000,0.5926,0.60435,0.05,96.872 +50000,0.5926,0.60435,0.05,96.872 +50000,0.5926,0.60435,0.05,96.872 +50000,0.5926,0.60435,0.05,96.872 +50000,0.5926,0.60435,0.05,96.872 +50000,0.5926,0.60435,0.05,96.872 +50000,0.5926,0.60435,0.05,96.872 +50000,0.5926,0.60435,0.05,96.872 +50000,0.5926,0.60435,0.05,96.872 +50000,0.60434,0.61632,0.05,97.279 +50000,0.60434,0.61632,0.05,97.279 +50000,0.60434,0.61632,0.05,97.279 +50000,0.60434,0.61632,0.05,97.279 +50000,0.60434,0.61632,0.05,97.279 +50000,0.60434,0.61632,0.05,97.279 +50000,0.60434,0.61632,0.05,97.279 +50000,0.60434,0.61632,0.05,97.279 +50000,0.60434,0.61632,0.05,97.279 +50000,0.60434,0.61632,0.05,97.279 +50000,0.60434,0.61632,0.05,97.279 +50000,0.60434,0.61632,0.05,97.279 +50000,0.61631,0.62853,0.05,97.673 +50000,0.61631,0.62853,0.05,97.673 +50000,0.61631,0.62853,0.05,97.673 +50000,0.61631,0.62853,0.05,97.673 +50000,0.61631,0.62853,0.05,97.673 +50000,0.61631,0.62853,0.05,97.673 +50000,0.61631,0.62853,0.05,97.673 +50000,0.61631,0.62853,0.05,97.673 +50000,0.61631,0.62853,0.05,97.673 +50000,0.61631,0.62853,0.05,97.673 +50000,0.61631,0.62853,0.05,97.673 +50000,0.61631,0.62853,0.05,97.673 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.62852,0.64098,0.05,98.054 +50000,0.64097,0.65368,0.05,98.424 +50000,0.64097,0.65368,0.05,98.424 +50000,0.64097,0.65368,0.05,98.424 +50000,0.64097,0.65368,0.05,98.424 +50000,0.64097,0.65368,0.05,98.424 +50000,0.64097,0.65368,0.05,98.424 +50000,0.64097,0.65368,0.05,98.424 +50000,0.64097,0.65368,0.05,98.424 +50000,0.64097,0.65368,0.05,98.424 +50000,0.64097,0.65368,0.05,98.424 +50000,0.64097,0.65368,0.05,98.424 +50000,0.64097,0.65368,0.05,98.424 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.65367,0.66663,0.05,98.785 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.66662,0.67984,0.05,99.138 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.67983,0.69331,0.05,99.486 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,0.6933,0.70704,0.05,99.83 +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/linearThermalDiffusion_plot.py similarity index 82% rename from src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py rename to src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/linearThermalDiffusion_plot.py index 7e45aa17ab7..9c364049289 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/pureThermalDiffusionAroundWellbore.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/linearThermalDiffusion_plot.py @@ -15,9 +15,9 @@ def steadyState(Tin, Tout, Rin, Rout, radialCoordinate): def diffusionFunction(radialCoordinate, Rin, diffusionCoefficient, diffusionTime): return special.erfc( (radialCoordinate - Rin) / 2.0 / np.sqrt( diffusionCoefficient * diffusionTime ) ) -def computeTransientTemperature(Tin, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime): +def computeTransientTemperature(Tin, Tout, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime): # Ref. Wang and Papamichos (1994), https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94WR01774 - return Tin * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) + return Tout + (Tin-Tout) * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) def computeThermalDiffusionCoefficient(thermalConductivity, volumetricHeatCapacity): return thermalConductivity / volumetricHeatCapacity @@ -55,14 +55,17 @@ def getLoadingFromXML(xmlFilePath): if fsParam.get('setNames') == "{ rpos }": Tout = float(fsParam.get('scale')) - thermalConductivity = float( extractDataFromXMLList( tree.find('Constitutive/SinglePhaseConstantThermalConductivity').get('thermalConductivityComponents') )[0] ) + tree_SinglePhaseThermalConductivities = tree.findall('Constitutive/SinglePhaseThermalConductivity') + + for tree_SinglePhaseThermalConductivity in tree_SinglePhaseThermalConductivities: + if tree_SinglePhaseThermalConductivity.get('name') == "thermalCond_linear": + thermalConductivity = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('defaultThermalConductivityComponents') )[0] ) tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') for tree_SolidInternalEnergy in tree_SolidInternalEnergies: if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_linear": - volumetricHeatCapacity = float( tree_SolidInternalEnergy.get('volumetricHeatCapacity') ) - + volumetricHeatCapacity = float( tree_SolidInternalEnergy.get('referenceVolumetricHeatCapacity') ) permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) @@ -92,15 +95,14 @@ def main(): for chart_idx, idx in enumerate([1, 2, 5, 10]): # Numerical results data = pd.read_csv(f'data_{idx}.csv') - radialCoordinate = data['elementCenter:0'] + radialCoordinate = (data['elementCenter:0']**2.0 + data['elementCenter:1']**2.0)**0.5 temperature = data['temperature'] - pressure = data['pressure'] diffusionTime = data['Time'][0] # Analytical results thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(thermalConductivity, volumetricHeatCapacity) - T_transient = computeTransientTemperature(Tin, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime) + T_transient = computeTransientTemperature(Tin, Tout, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime) # Analytical results of the steady state regime for comparison T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate) @@ -109,7 +111,7 @@ def main(): # Temperature plt.subplot(2,2,chart_idx+1) plt.plot( radialCoordinate, temperature, 'k+' , label='GEOSX' ) - plt.plot( radialCoordinate, T_transient, 'r-' , label='Analytic' ) + plt.plot( radialCoordinate, T_transient, 'r-' , label='Analytic, infinite domain' ) plt.plot( radialCoordinate, T_steadyState, 'b-' , label='Steady State' ) if chart_idx==1: @@ -121,7 +123,7 @@ def main(): if chart_idx in [0,2]: plt.ylabel('Temperature (°C)') - plt.ylim(-10,100) + plt.ylim(-30,110) plt.xlim(0,1.0) plt.title('t = '+str(diffusionTime)+'(s)') plt.tight_layout() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/radialThermalDiffusionSketch.png b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/radialThermalDiffusionSketch.png similarity index 100% rename from src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/radialThermalDiffusionSketch.png rename to src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/radialThermalDiffusionSketch.png diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_1.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_1.csv deleted file mode 100644 index 9ccebfe447a..00000000000 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_1.csv +++ /dev/null @@ -1,1002 +0,0 @@ -Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,nan,nan,nan,nan -10000,0.10099,0.0009915,0.05,95.827 -10000,0.10099,0.0009915,0.05,95.827 -10000,0.10099,0.0009915,0.05,95.827 -10000,0.10299,0.0010111,0.05,87.738 -10000,0.10299,0.0010111,0.05,87.738 -10000,0.10499,0.0010308,0.05,80.054 -10000,0.10499,0.0010308,0.05,80.054 -10000,0.10734,0.0010538,0.05,71.614 -10000,0.10734,0.0010538,0.05,71.614 -10000,0.11004,0.0010803,0.05,62.937 -10000,0.11004,0.0010803,0.05,62.937 -10000,0.11004,0.0010803,0.05,62.937 -10000,0.11274,0.0011068,0.05,55.295 -10000,0.11274,0.0011068,0.05,55.295 -10000,0.11274,0.0011068,0.05,55.295 -10000,0.11544,0.0011334,0.05,48.633 -10000,0.11544,0.0011334,0.05,48.633 -10000,0.11814,0.0011599,0.05,42.858 -10000,0.11814,0.0011599,0.05,42.858 -10000,0.11814,0.0011599,0.05,42.858 -10000,0.12084,0.0011864,0.05,37.866 -10000,0.12084,0.0011864,0.05,37.866 -10000,0.12084,0.0011864,0.05,37.866 -10000,0.12354,0.0012129,0.05,33.555 -10000,0.12354,0.0012129,0.05,33.555 -10000,0.12624,0.0012394,0.05,29.826 -10000,0.12624,0.0012394,0.05,29.826 -10000,0.12624,0.0012394,0.05,29.826 -10000,0.12894,0.0012659,0.05,26.597 -10000,0.12894,0.0012659,0.05,26.597 -10000,0.12894,0.0012659,0.05,26.597 -10000,0.13164,0.0012924,0.05,23.791 -10000,0.13164,0.0012924,0.05,23.791 -10000,0.13164,0.0012924,0.05,23.791 -10000,0.1343,0.0013185,0.05,21.382 -10000,0.1343,0.0013185,0.05,21.382 -10000,0.13695,0.0013445,0.05,19.278 -10000,0.13695,0.0013445,0.05,19.278 -10000,0.13695,0.0013445,0.05,19.278 -10000,0.13965,0.001371,0.05,17.394 -10000,0.13965,0.001371,0.05,17.394 -10000,0.13965,0.001371,0.05,17.394 -10000,0.1424,0.0013981,0.05,15.705 -10000,0.1424,0.0013981,0.05,15.705 -10000,0.14521,0.0014256,0.05,14.189 -10000,0.14521,0.0014256,0.05,14.189 -10000,0.14521,0.0014256,0.05,14.189 -10000,0.14807,0.0014538,0.05,12.828 -10000,0.14807,0.0014538,0.05,12.828 -10000,0.14807,0.0014538,0.05,12.828 -10000,0.151,0.0014824,0.05,11.603 -10000,0.151,0.0014824,0.05,11.603 -10000,0.151,0.0014824,0.05,11.603 -10000,0.15397,0.0015117,0.05,10.501 -10000,0.15397,0.0015117,0.05,10.501 -10000,0.15397,0.0015117,0.05,10.501 -10000,0.15701,0.0015415,0.05,9.5061 -10000,0.15701,0.0015415,0.05,9.5061 -10000,0.15701,0.0015415,0.05,9.5061 -10000,0.16011,0.0015719,0.05,8.6085 -10000,0.16011,0.0015719,0.05,8.6085 -10000,0.16011,0.0015719,0.05,8.6085 -10000,0.16327,0.001603,0.05,7.7972 -10000,0.16327,0.001603,0.05,7.7972 -10000,0.16327,0.001603,0.05,7.7972 -10000,0.16649,0.0016346,0.05,7.0632 -10000,0.16649,0.0016346,0.05,7.0632 -10000,0.16649,0.0016346,0.05,7.0632 -10000,0.16649,0.0016346,0.05,7.0632 -10000,0.16978,0.0016669,0.05,6.3983 -10000,0.16978,0.0016669,0.05,6.3983 -10000,0.16978,0.0016669,0.05,6.3983 -10000,0.17313,0.0016998,0.05,5.7955 -10000,0.17313,0.0016998,0.05,5.7955 -10000,0.17313,0.0016998,0.05,5.7955 -10000,0.17655,0.0017333,0.05,5.2484 -10000,0.17655,0.0017333,0.05,5.2484 -10000,0.17655,0.0017333,0.05,5.2484 -10000,0.17655,0.0017333,0.05,5.2484 -10000,0.18004,0.0017676,0.05,4.7516 -10000,0.18004,0.0017676,0.05,4.7516 -10000,0.18004,0.0017676,0.05,4.7516 -10000,0.18359,0.0018025,0.05,4.3001 -10000,0.18359,0.0018025,0.05,4.3001 -10000,0.18359,0.0018025,0.05,4.3001 -10000,0.18359,0.0018025,0.05,4.3001 -10000,0.18722,0.001838,0.05,3.8894 -10000,0.18722,0.001838,0.05,3.8894 -10000,0.18722,0.001838,0.05,3.8894 -10000,0.18722,0.001838,0.05,3.8894 -10000,0.19091,0.0018743,0.05,3.5157 -10000,0.19091,0.0018743,0.05,3.5157 -10000,0.19091,0.0018743,0.05,3.5157 -10000,0.19468,0.0019114,0.05,3.1756 -10000,0.19468,0.0019114,0.05,3.1756 -10000,0.19468,0.0019114,0.05,3.1756 -10000,0.19468,0.0019114,0.05,3.1756 -10000,0.19853,0.0019491,0.05,2.8658 -10000,0.19853,0.0019491,0.05,2.8658 -10000,0.19853,0.0019491,0.05,2.8658 -10000,0.19853,0.0019491,0.05,2.8658 -10000,0.20245,0.0019876,0.05,2.5837 -10000,0.20245,0.0019876,0.05,2.5837 -10000,0.20245,0.0019876,0.05,2.5837 -10000,0.20245,0.0019876,0.05,2.5837 -10000,0.20645,0.0020269,0.05,2.3268 -10000,0.20645,0.0020269,0.05,2.3268 -10000,0.20645,0.0020269,0.05,2.3268 -10000,0.20645,0.0020269,0.05,2.3268 -10000,0.21053,0.0020669,0.05,2.0928 -10000,0.21053,0.0020669,0.05,2.0928 -10000,0.21053,0.0020669,0.05,2.0928 -10000,0.21053,0.0020669,0.05,2.0928 -10000,0.21469,0.0021078,0.05,1.8798 -10000,0.21469,0.0021078,0.05,1.8798 -10000,0.21469,0.0021078,0.05,1.8798 -10000,0.21469,0.0021078,0.05,1.8798 -10000,0.21893,0.0021494,0.05,1.6859 -10000,0.21893,0.0021494,0.05,1.6859 -10000,0.21893,0.0021494,0.05,1.6859 -10000,0.21893,0.0021494,0.05,1.6859 -10000,0.21893,0.0021494,0.05,1.6859 -10000,0.22326,0.0021919,0.05,1.5095 -10000,0.22326,0.0021919,0.05,1.5095 -10000,0.22326,0.0021919,0.05,1.5095 -10000,0.22326,0.0021919,0.05,1.5095 -10000,0.22767,0.0022352,0.05,1.3492 -10000,0.22767,0.0022352,0.05,1.3492 -10000,0.22767,0.0022352,0.05,1.3492 -10000,0.22767,0.0022352,0.05,1.3492 -10000,0.23217,0.0022794,0.05,1.2036 -10000,0.23217,0.0022794,0.05,1.2036 -10000,0.23217,0.0022794,0.05,1.2036 -10000,0.23217,0.0022794,0.05,1.2036 -10000,0.23217,0.0022794,0.05,1.2036 -10000,0.23676,0.0023244,0.05,1.0714 -10000,0.23676,0.0023244,0.05,1.0714 -10000,0.23676,0.0023244,0.05,1.0714 -10000,0.23676,0.0023244,0.05,1.0714 -10000,0.23676,0.0023244,0.05,1.0714 -10000,0.24144,0.0023704,0.05,0.95166 -10000,0.24144,0.0023704,0.05,0.95166 -10000,0.24144,0.0023704,0.05,0.95166 -10000,0.24144,0.0023704,0.05,0.95166 -10000,0.24621,0.0024172,0.05,0.84329 -10000,0.24621,0.0024172,0.05,0.84329 -10000,0.24621,0.0024172,0.05,0.84329 -10000,0.24621,0.0024172,0.05,0.84329 -10000,0.24621,0.0024172,0.05,0.84329 -10000,0.25108,0.002465,0.05,0.74536 -10000,0.25108,0.002465,0.05,0.74536 -10000,0.25108,0.002465,0.05,0.74536 -10000,0.25108,0.002465,0.05,0.74536 -10000,0.25108,0.002465,0.05,0.74536 -10000,0.25604,0.0025137,0.05,0.65703 -10000,0.25604,0.0025137,0.05,0.65703 -10000,0.25604,0.0025137,0.05,0.65703 -10000,0.25604,0.0025137,0.05,0.65703 -10000,0.25604,0.0025137,0.05,0.65703 -10000,0.2611,0.0025634,0.05,0.57751 -10000,0.2611,0.0025634,0.05,0.57751 -10000,0.2611,0.0025634,0.05,0.57751 -10000,0.2611,0.0025634,0.05,0.57751 -10000,0.2611,0.0025634,0.05,0.57751 -10000,0.26626,0.0026141,0.05,0.50608 -10000,0.26626,0.0026141,0.05,0.50608 -10000,0.26626,0.0026141,0.05,0.50608 -10000,0.26626,0.0026141,0.05,0.50608 -10000,0.26626,0.0026141,0.05,0.50608 -10000,0.27153,0.0026658,0.05,0.44207 -10000,0.27153,0.0026658,0.05,0.44207 -10000,0.27153,0.0026658,0.05,0.44207 -10000,0.27153,0.0026658,0.05,0.44207 -10000,0.27153,0.0026658,0.05,0.44207 -10000,0.27153,0.0026658,0.05,0.44207 -10000,0.2769,0.0027185,0.05,0.38486 -10000,0.2769,0.0027185,0.05,0.38486 -10000,0.2769,0.0027185,0.05,0.38486 -10000,0.2769,0.0027185,0.05,0.38486 -10000,0.2769,0.0027185,0.05,0.38486 -10000,0.28237,0.0027723,0.05,0.33387 -10000,0.28237,0.0027723,0.05,0.33387 -10000,0.28237,0.0027723,0.05,0.33387 -10000,0.28237,0.0027723,0.05,0.33387 -10000,0.28237,0.0027723,0.05,0.33387 -10000,0.28237,0.0027723,0.05,0.33387 -10000,0.28796,0.0028271,0.05,0.28855 -10000,0.28796,0.0028271,0.05,0.28855 -10000,0.28796,0.0028271,0.05,0.28855 -10000,0.28796,0.0028271,0.05,0.28855 -10000,0.28796,0.0028271,0.05,0.28855 -10000,0.29365,0.002883,0.05,0.24842 -10000,0.29365,0.002883,0.05,0.24842 -10000,0.29365,0.002883,0.05,0.24842 -10000,0.29365,0.002883,0.05,0.24842 -10000,0.29365,0.002883,0.05,0.24842 -10000,0.29365,0.002883,0.05,0.24842 -10000,0.29946,0.00294,0.05,0.213 -10000,0.29946,0.00294,0.05,0.213 -10000,0.29946,0.00294,0.05,0.213 -10000,0.29946,0.00294,0.05,0.213 -10000,0.29946,0.00294,0.05,0.213 -10000,0.29946,0.00294,0.05,0.213 -10000,0.30538,0.0029982,0.05,0.18186 -10000,0.30538,0.0029982,0.05,0.18186 -10000,0.30538,0.0029982,0.05,0.18186 -10000,0.30538,0.0029982,0.05,0.18186 -10000,0.30538,0.0029982,0.05,0.18186 -10000,0.30538,0.0029982,0.05,0.18186 -10000,0.31142,0.0030575,0.05,0.15458 -10000,0.31142,0.0030575,0.05,0.15458 -10000,0.31142,0.0030575,0.05,0.15458 -10000,0.31142,0.0030575,0.05,0.15458 -10000,0.31142,0.0030575,0.05,0.15458 -10000,0.31142,0.0030575,0.05,0.15458 -10000,0.31758,0.003118,0.05,0.13079 -10000,0.31758,0.003118,0.05,0.13079 -10000,0.31758,0.003118,0.05,0.13079 -10000,0.31758,0.003118,0.05,0.13079 -10000,0.31758,0.003118,0.05,0.13079 -10000,0.31758,0.003118,0.05,0.13079 -10000,0.32386,0.0031796,0.05,0.11012 -10000,0.32386,0.0031796,0.05,0.11012 -10000,0.32386,0.0031796,0.05,0.11012 -10000,0.32386,0.0031796,0.05,0.11012 -10000,0.32386,0.0031796,0.05,0.11012 -10000,0.32386,0.0031796,0.05,0.11012 -10000,0.32386,0.0031796,0.05,0.11012 -10000,0.33027,0.0032425,0.05,0.092267 -10000,0.33027,0.0032425,0.05,0.092267 -10000,0.33027,0.0032425,0.05,0.092267 -10000,0.33027,0.0032425,0.05,0.092267 -10000,0.33027,0.0032425,0.05,0.092267 -10000,0.33027,0.0032425,0.05,0.092267 -10000,0.3368,0.0033067,0.05,0.076906 -10000,0.3368,0.0033067,0.05,0.076906 -10000,0.3368,0.0033067,0.05,0.076906 -10000,0.3368,0.0033067,0.05,0.076906 -10000,0.3368,0.0033067,0.05,0.076906 -10000,0.3368,0.0033067,0.05,0.076906 -10000,0.3368,0.0033067,0.05,0.076906 -10000,0.34347,0.0033721,0.05,0.06376 -10000,0.34347,0.0033721,0.05,0.06376 -10000,0.34347,0.0033721,0.05,0.06376 -10000,0.34347,0.0033721,0.05,0.06376 -10000,0.34347,0.0033721,0.05,0.06376 -10000,0.34347,0.0033721,0.05,0.06376 -10000,0.35026,0.0034388,0.05,0.05257 -10000,0.35026,0.0034388,0.05,0.05257 -10000,0.35026,0.0034388,0.05,0.05257 -10000,0.35026,0.0034388,0.05,0.05257 -10000,0.35026,0.0034388,0.05,0.05257 -10000,0.35026,0.0034388,0.05,0.05257 -10000,0.35026,0.0034388,0.05,0.05257 -10000,0.35719,0.0035069,0.05,0.043097 -10000,0.35719,0.0035069,0.05,0.043097 -10000,0.35719,0.0035069,0.05,0.043097 -10000,0.35719,0.0035069,0.05,0.043097 -10000,0.35719,0.0035069,0.05,0.043097 -10000,0.35719,0.0035069,0.05,0.043097 -10000,0.35719,0.0035069,0.05,0.043097 -10000,0.36426,0.0035762,0.05,0.035123 -10000,0.36426,0.0035762,0.05,0.035123 -10000,0.36426,0.0035762,0.05,0.035123 -10000,0.36426,0.0035762,0.05,0.035123 -10000,0.36426,0.0035762,0.05,0.035123 -10000,0.36426,0.0035762,0.05,0.035123 -10000,0.36426,0.0035762,0.05,0.035123 -10000,0.37147,0.003647,0.05,0.028451 -10000,0.37147,0.003647,0.05,0.028451 -10000,0.37147,0.003647,0.05,0.028451 -10000,0.37147,0.003647,0.05,0.028451 -10000,0.37147,0.003647,0.05,0.028451 -10000,0.37147,0.003647,0.05,0.028451 -10000,0.37147,0.003647,0.05,0.028451 -10000,0.37147,0.003647,0.05,0.028451 -10000,0.37882,0.0037192,0.05,0.022902 -10000,0.37882,0.0037192,0.05,0.022902 -10000,0.37882,0.0037192,0.05,0.022902 -10000,0.37882,0.0037192,0.05,0.022902 -10000,0.37882,0.0037192,0.05,0.022902 -10000,0.37882,0.0037192,0.05,0.022902 -10000,0.37882,0.0037192,0.05,0.022902 -10000,0.38632,0.0037928,0.05,0.018318 -10000,0.38632,0.0037928,0.05,0.018318 -10000,0.38632,0.0037928,0.05,0.018318 -10000,0.38632,0.0037928,0.05,0.018318 -10000,0.38632,0.0037928,0.05,0.018318 -10000,0.38632,0.0037928,0.05,0.018318 -10000,0.38632,0.0037928,0.05,0.018318 -10000,0.38632,0.0037928,0.05,0.018318 -10000,0.39396,0.0038678,0.05,0.014554 -10000,0.39396,0.0038678,0.05,0.014554 -10000,0.39396,0.0038678,0.05,0.014554 -10000,0.39396,0.0038678,0.05,0.014554 -10000,0.39396,0.0038678,0.05,0.014554 -10000,0.39396,0.0038678,0.05,0.014554 -10000,0.39396,0.0038678,0.05,0.014554 -10000,0.40176,0.0039444,0.05,0.011486 -10000,0.40176,0.0039444,0.05,0.011486 -10000,0.40176,0.0039444,0.05,0.011486 -10000,0.40176,0.0039444,0.05,0.011486 -10000,0.40176,0.0039444,0.05,0.011486 -10000,0.40176,0.0039444,0.05,0.011486 -10000,0.40176,0.0039444,0.05,0.011486 -10000,0.40176,0.0039444,0.05,0.011486 -10000,0.40971,0.0040224,0.05,0.009001 -10000,0.40971,0.0040224,0.05,0.009001 -10000,0.40971,0.0040224,0.05,0.009001 -10000,0.40971,0.0040224,0.05,0.009001 -10000,0.40971,0.0040224,0.05,0.009001 -10000,0.40971,0.0040224,0.05,0.009001 -10000,0.40971,0.0040224,0.05,0.009001 -10000,0.40971,0.0040224,0.05,0.009001 -10000,0.41782,0.004102,0.05,0.0070035 -10000,0.41782,0.004102,0.05,0.0070035 -10000,0.41782,0.004102,0.05,0.0070035 -10000,0.41782,0.004102,0.05,0.0070035 -10000,0.41782,0.004102,0.05,0.0070035 -10000,0.41782,0.004102,0.05,0.0070035 -10000,0.41782,0.004102,0.05,0.0070035 -10000,0.41782,0.004102,0.05,0.0070035 -10000,0.42609,0.0041832,0.05,0.0054095 -10000,0.42609,0.0041832,0.05,0.0054095 -10000,0.42609,0.0041832,0.05,0.0054095 -10000,0.42609,0.0041832,0.05,0.0054095 -10000,0.42609,0.0041832,0.05,0.0054095 -10000,0.42609,0.0041832,0.05,0.0054095 -10000,0.42609,0.0041832,0.05,0.0054095 -10000,0.42609,0.0041832,0.05,0.0054095 -10000,0.42609,0.0041832,0.05,0.0054095 -10000,0.43452,0.004266,0.05,0.004147 -10000,0.43452,0.004266,0.05,0.004147 -10000,0.43452,0.004266,0.05,0.004147 -10000,0.43452,0.004266,0.05,0.004147 -10000,0.43452,0.004266,0.05,0.004147 -10000,0.43452,0.004266,0.05,0.004147 -10000,0.43452,0.004266,0.05,0.004147 -10000,0.43452,0.004266,0.05,0.004147 -10000,0.44312,0.0043505,0.05,0.0031547 -10000,0.44312,0.0043505,0.05,0.0031547 -10000,0.44312,0.0043505,0.05,0.0031547 -10000,0.44312,0.0043505,0.05,0.0031547 -10000,0.44312,0.0043505,0.05,0.0031547 -10000,0.44312,0.0043505,0.05,0.0031547 -10000,0.44312,0.0043505,0.05,0.0031547 -10000,0.44312,0.0043505,0.05,0.0031547 -10000,0.44312,0.0043505,0.05,0.0031547 -10000,0.45189,0.0044366,0.05,0.0023811 -10000,0.45189,0.0044366,0.05,0.0023811 -10000,0.45189,0.0044366,0.05,0.0023811 -10000,0.45189,0.0044366,0.05,0.0023811 -10000,0.45189,0.0044366,0.05,0.0023811 -10000,0.45189,0.0044366,0.05,0.0023811 -10000,0.45189,0.0044366,0.05,0.0023811 -10000,0.45189,0.0044366,0.05,0.0023811 -10000,0.45189,0.0044366,0.05,0.0023811 -10000,0.46084,0.0045244,0.05,0.0017827 -10000,0.46084,0.0045244,0.05,0.0017827 -10000,0.46084,0.0045244,0.05,0.0017827 -10000,0.46084,0.0045244,0.05,0.0017827 -10000,0.46084,0.0045244,0.05,0.0017827 -10000,0.46084,0.0045244,0.05,0.0017827 -10000,0.46084,0.0045244,0.05,0.0017827 -10000,0.46084,0.0045244,0.05,0.0017827 -10000,0.46084,0.0045244,0.05,0.0017827 -10000,0.46996,0.004614,0.05,0.0013237 -10000,0.46996,0.004614,0.05,0.0013237 -10000,0.46996,0.004614,0.05,0.0013237 -10000,0.46996,0.004614,0.05,0.0013237 -10000,0.46996,0.004614,0.05,0.0013237 -10000,0.46996,0.004614,0.05,0.0013237 -10000,0.46996,0.004614,0.05,0.0013237 -10000,0.46996,0.004614,0.05,0.0013237 -10000,0.46996,0.004614,0.05,0.0013237 -10000,0.47926,0.0047053,0.05,0.00097467 -10000,0.47926,0.0047053,0.05,0.00097467 -10000,0.47926,0.0047053,0.05,0.00097467 -10000,0.47926,0.0047053,0.05,0.00097467 -10000,0.47926,0.0047053,0.05,0.00097467 -10000,0.47926,0.0047053,0.05,0.00097467 -10000,0.47926,0.0047053,0.05,0.00097467 -10000,0.47926,0.0047053,0.05,0.00097467 -10000,0.47926,0.0047053,0.05,0.00097467 -10000,0.47926,0.0047053,0.05,0.00097467 -10000,0.48875,0.0047985,0.05,0.00071149 -10000,0.48875,0.0047985,0.05,0.00071149 -10000,0.48875,0.0047985,0.05,0.00071149 -10000,0.48875,0.0047985,0.05,0.00071149 -10000,0.48875,0.0047985,0.05,0.00071149 -10000,0.48875,0.0047985,0.05,0.00071149 -10000,0.48875,0.0047985,0.05,0.00071149 -10000,0.48875,0.0047985,0.05,0.00071149 -10000,0.48875,0.0047985,0.05,0.00071149 -10000,0.49843,0.0048935,0.05,0.00051482 -10000,0.49843,0.0048935,0.05,0.00051482 -10000,0.49843,0.0048935,0.05,0.00051482 -10000,0.49843,0.0048935,0.05,0.00051482 -10000,0.49843,0.0048935,0.05,0.00051482 -10000,0.49843,0.0048935,0.05,0.00051482 -10000,0.49843,0.0048935,0.05,0.00051482 -10000,0.49843,0.0048935,0.05,0.00051482 -10000,0.49843,0.0048935,0.05,0.00051482 -10000,0.49843,0.0048935,0.05,0.00051482 -10000,0.5083,0.0049903,0.05,0.00036917 -10000,0.5083,0.0049903,0.05,0.00036917 -10000,0.5083,0.0049903,0.05,0.00036917 -10000,0.5083,0.0049903,0.05,0.00036917 -10000,0.5083,0.0049903,0.05,0.00036917 -10000,0.5083,0.0049903,0.05,0.00036917 -10000,0.5083,0.0049903,0.05,0.00036917 -10000,0.5083,0.0049903,0.05,0.00036917 -10000,0.5083,0.0049903,0.05,0.00036917 -10000,0.5083,0.0049903,0.05,0.00036917 -10000,0.51836,0.0050891,0.05,0.00026231 -10000,0.51836,0.0050891,0.05,0.00026231 -10000,0.51836,0.0050891,0.05,0.00026231 -10000,0.51836,0.0050891,0.05,0.00026231 -10000,0.51836,0.0050891,0.05,0.00026231 -10000,0.51836,0.0050891,0.05,0.00026231 -10000,0.51836,0.0050891,0.05,0.00026231 -10000,0.51836,0.0050891,0.05,0.00026231 -10000,0.51836,0.0050891,0.05,0.00026231 -10000,0.51836,0.0050891,0.05,0.00026231 -10000,0.52862,0.0051899,0.05,0.00018463 -10000,0.52862,0.0051899,0.05,0.00018463 -10000,0.52862,0.0051899,0.05,0.00018463 -10000,0.52862,0.0051899,0.05,0.00018463 -10000,0.52862,0.0051899,0.05,0.00018463 -10000,0.52862,0.0051899,0.05,0.00018463 -10000,0.52862,0.0051899,0.05,0.00018463 -10000,0.52862,0.0051899,0.05,0.00018463 -10000,0.52862,0.0051899,0.05,0.00018463 -10000,0.52862,0.0051899,0.05,0.00018463 -10000,0.53909,0.0052927,0.05,0.00012872 -10000,0.53909,0.0052927,0.05,0.00012872 -10000,0.53909,0.0052927,0.05,0.00012872 -10000,0.53909,0.0052927,0.05,0.00012872 -10000,0.53909,0.0052927,0.05,0.00012872 -10000,0.53909,0.0052927,0.05,0.00012872 -10000,0.53909,0.0052927,0.05,0.00012872 -10000,0.53909,0.0052927,0.05,0.00012872 -10000,0.53909,0.0052927,0.05,0.00012872 -10000,0.53909,0.0052927,0.05,0.00012872 -10000,0.53909,0.0052927,0.05,0.00012872 -10000,0.54976,0.0053975,0.05,8.8861e-05 -10000,0.54976,0.0053975,0.05,8.8861e-05 -10000,0.54976,0.0053975,0.05,8.8861e-05 -10000,0.54976,0.0053975,0.05,8.8861e-05 -10000,0.54976,0.0053975,0.05,8.8861e-05 -10000,0.54976,0.0053975,0.05,8.8861e-05 -10000,0.54976,0.0053975,0.05,8.8861e-05 -10000,0.54976,0.0053975,0.05,8.8861e-05 -10000,0.54976,0.0053975,0.05,8.8861e-05 -10000,0.54976,0.0053975,0.05,8.8861e-05 -10000,0.54976,0.0053975,0.05,8.8861e-05 -10000,0.56065,0.0055043,0.05,6.0736e-05 -10000,0.56065,0.0055043,0.05,6.0736e-05 -10000,0.56065,0.0055043,0.05,6.0736e-05 -10000,0.56065,0.0055043,0.05,6.0736e-05 -10000,0.56065,0.0055043,0.05,6.0736e-05 -10000,0.56065,0.0055043,0.05,6.0736e-05 -10000,0.56065,0.0055043,0.05,6.0736e-05 -10000,0.56065,0.0055043,0.05,6.0736e-05 -10000,0.56065,0.0055043,0.05,6.0736e-05 -10000,0.56065,0.0055043,0.05,6.0736e-05 -10000,0.56065,0.0055043,0.05,6.0736e-05 -10000,0.57175,0.0056133,0.05,4.1091e-05 -10000,0.57175,0.0056133,0.05,4.1091e-05 -10000,0.57175,0.0056133,0.05,4.1091e-05 -10000,0.57175,0.0056133,0.05,4.1091e-05 -10000,0.57175,0.0056133,0.05,4.1091e-05 -10000,0.57175,0.0056133,0.05,4.1091e-05 -10000,0.57175,0.0056133,0.05,4.1091e-05 -10000,0.57175,0.0056133,0.05,4.1091e-05 -10000,0.57175,0.0056133,0.05,4.1091e-05 -10000,0.57175,0.0056133,0.05,4.1091e-05 -10000,0.57175,0.0056133,0.05,4.1091e-05 -10000,0.58307,0.0057245,0.05,2.7512e-05 -10000,0.58307,0.0057245,0.05,2.7512e-05 -10000,0.58307,0.0057245,0.05,2.7512e-05 -10000,0.58307,0.0057245,0.05,2.7512e-05 -10000,0.58307,0.0057245,0.05,2.7512e-05 -10000,0.58307,0.0057245,0.05,2.7512e-05 -10000,0.58307,0.0057245,0.05,2.7512e-05 -10000,0.58307,0.0057245,0.05,2.7512e-05 -10000,0.58307,0.0057245,0.05,2.7512e-05 -10000,0.58307,0.0057245,0.05,2.7512e-05 -10000,0.58307,0.0057245,0.05,2.7512e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.59462,0.0058378,0.05,1.8226e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.60639,0.0059535,0.05,1.1944e-05 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.6184,0.0060714,0.05,7.7407e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.63065,0.0061916,0.05,4.9605e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.64314,0.0063142,0.05,3.1424e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.65588,0.0064393,0.05,1.9674e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.66887,0.0065668,0.05,1.2171e-06 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.68211,0.0066969,0.05,7.4374e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.69562,0.0068295,0.05,4.4882e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.7094,0.0069648,0.05,2.6739e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.72345,0.0071027,0.05,1.5721e-07 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.73778,0.0072434,0.05,9.117e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7524,0.0073869,0.05,5.2122e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7673,0.0075332,0.05,2.935e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.7825,0.0076824,0.05,1.6256e-08 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.798,0.0078346,0.05,8.8364e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.81381,0.0079898,0.05,4.6971e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.82993,0.0081481,0.05,2.4256e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.84637,0.0083095,0.05,1.2022e-09 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.86314,0.0084741,0.05,5.5787e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.88024,0.008642,0.05,2.2863e-10 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.89767,0.0088132,0.05,6.8108e-11 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.91546,0.0089878,0.05,-3.5322e-12 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.93359,0.0091658,0.05,-2.9158e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.95209,0.0093474,0.05,-3.1439e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.97095,0.0095326,0.05,-2.2242e-11 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 -10000,0.99019,0.0097215,0.05,-7.8581e-12 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_10.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_10.csv deleted file mode 100644 index 6bd17f57f37..00000000000 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_10.csv +++ /dev/null @@ -1,1002 +0,0 @@ -Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,nan,nan,nan,nan -1e+05,0.10099,0.0009915,0.05,98.477 -1e+05,0.10099,0.0009915,0.05,98.477 -1e+05,0.10099,0.0009915,0.05,98.477 -1e+05,0.10299,0.0010111,0.05,95.492 -1e+05,0.10299,0.0010111,0.05,95.492 -1e+05,0.10499,0.0010308,0.05,92.573 -1e+05,0.10499,0.0010308,0.05,92.573 -1e+05,0.10734,0.0010538,0.05,89.221 -1e+05,0.10734,0.0010538,0.05,89.221 -1e+05,0.11004,0.0010803,0.05,85.495 -1e+05,0.11004,0.0010803,0.05,85.495 -1e+05,0.11004,0.0010803,0.05,85.495 -1e+05,0.11274,0.0011068,0.05,81.898 -1e+05,0.11274,0.0011068,0.05,81.898 -1e+05,0.11274,0.0011068,0.05,81.898 -1e+05,0.11544,0.0011334,0.05,78.431 -1e+05,0.11544,0.0011334,0.05,78.431 -1e+05,0.11814,0.0011599,0.05,75.096 -1e+05,0.11814,0.0011599,0.05,75.096 -1e+05,0.11814,0.0011599,0.05,75.096 -1e+05,0.12084,0.0011864,0.05,71.891 -1e+05,0.12084,0.0011864,0.05,71.891 -1e+05,0.12084,0.0011864,0.05,71.891 -1e+05,0.12354,0.0012129,0.05,68.816 -1e+05,0.12354,0.0012129,0.05,68.816 -1e+05,0.12624,0.0012394,0.05,65.869 -1e+05,0.12624,0.0012394,0.05,65.869 -1e+05,0.12624,0.0012394,0.05,65.869 -1e+05,0.12894,0.0012659,0.05,63.049 -1e+05,0.12894,0.0012659,0.05,63.049 -1e+05,0.12894,0.0012659,0.05,63.049 -1e+05,0.13164,0.0012924,0.05,60.352 -1e+05,0.13164,0.0012924,0.05,60.352 -1e+05,0.13164,0.0012924,0.05,60.352 -1e+05,0.1343,0.0013185,0.05,57.811 -1e+05,0.1343,0.0013185,0.05,57.811 -1e+05,0.13695,0.0013445,0.05,55.394 -1e+05,0.13695,0.0013445,0.05,55.394 -1e+05,0.13695,0.0013445,0.05,55.394 -1e+05,0.13965,0.001371,0.05,53.041 -1e+05,0.13965,0.001371,0.05,53.041 -1e+05,0.13965,0.001371,0.05,53.041 -1e+05,0.1424,0.0013981,0.05,50.753 -1e+05,0.1424,0.0013981,0.05,50.753 -1e+05,0.14521,0.0014256,0.05,48.531 -1e+05,0.14521,0.0014256,0.05,48.531 -1e+05,0.14521,0.0014256,0.05,48.531 -1e+05,0.14807,0.0014538,0.05,46.377 -1e+05,0.14807,0.0014538,0.05,46.377 -1e+05,0.14807,0.0014538,0.05,46.377 -1e+05,0.151,0.0014824,0.05,44.292 -1e+05,0.151,0.0014824,0.05,44.292 -1e+05,0.151,0.0014824,0.05,44.292 -1e+05,0.15397,0.0015117,0.05,42.275 -1e+05,0.15397,0.0015117,0.05,42.275 -1e+05,0.15397,0.0015117,0.05,42.275 -1e+05,0.15701,0.0015415,0.05,40.326 -1e+05,0.15701,0.0015415,0.05,40.326 -1e+05,0.15701,0.0015415,0.05,40.326 -1e+05,0.16011,0.0015719,0.05,38.446 -1e+05,0.16011,0.0015719,0.05,38.446 -1e+05,0.16011,0.0015719,0.05,38.446 -1e+05,0.16327,0.001603,0.05,36.635 -1e+05,0.16327,0.001603,0.05,36.635 -1e+05,0.16327,0.001603,0.05,36.635 -1e+05,0.16649,0.0016346,0.05,34.89 -1e+05,0.16649,0.0016346,0.05,34.89 -1e+05,0.16649,0.0016346,0.05,34.89 -1e+05,0.16649,0.0016346,0.05,34.89 -1e+05,0.16978,0.0016669,0.05,33.212 -1e+05,0.16978,0.0016669,0.05,33.212 -1e+05,0.16978,0.0016669,0.05,33.212 -1e+05,0.17313,0.0016998,0.05,31.6 -1e+05,0.17313,0.0016998,0.05,31.6 -1e+05,0.17313,0.0016998,0.05,31.6 -1e+05,0.17655,0.0017333,0.05,30.052 -1e+05,0.17655,0.0017333,0.05,30.052 -1e+05,0.17655,0.0017333,0.05,30.052 -1e+05,0.17655,0.0017333,0.05,30.052 -1e+05,0.18004,0.0017676,0.05,28.568 -1e+05,0.18004,0.0017676,0.05,28.568 -1e+05,0.18004,0.0017676,0.05,28.568 -1e+05,0.18359,0.0018025,0.05,27.145 -1e+05,0.18359,0.0018025,0.05,27.145 -1e+05,0.18359,0.0018025,0.05,27.145 -1e+05,0.18359,0.0018025,0.05,27.145 -1e+05,0.18722,0.001838,0.05,25.782 -1e+05,0.18722,0.001838,0.05,25.782 -1e+05,0.18722,0.001838,0.05,25.782 -1e+05,0.18722,0.001838,0.05,25.782 -1e+05,0.19091,0.0018743,0.05,24.477 -1e+05,0.19091,0.0018743,0.05,24.477 -1e+05,0.19091,0.0018743,0.05,24.477 -1e+05,0.19468,0.0019114,0.05,23.23 -1e+05,0.19468,0.0019114,0.05,23.23 -1e+05,0.19468,0.0019114,0.05,23.23 -1e+05,0.19468,0.0019114,0.05,23.23 -1e+05,0.19853,0.0019491,0.05,22.037 -1e+05,0.19853,0.0019491,0.05,22.037 -1e+05,0.19853,0.0019491,0.05,22.037 -1e+05,0.19853,0.0019491,0.05,22.037 -1e+05,0.20245,0.0019876,0.05,20.898 -1e+05,0.20245,0.0019876,0.05,20.898 -1e+05,0.20245,0.0019876,0.05,20.898 -1e+05,0.20245,0.0019876,0.05,20.898 -1e+05,0.20645,0.0020269,0.05,19.811 -1e+05,0.20645,0.0020269,0.05,19.811 -1e+05,0.20645,0.0020269,0.05,19.811 -1e+05,0.20645,0.0020269,0.05,19.811 -1e+05,0.21053,0.0020669,0.05,18.773 -1e+05,0.21053,0.0020669,0.05,18.773 -1e+05,0.21053,0.0020669,0.05,18.773 -1e+05,0.21053,0.0020669,0.05,18.773 -1e+05,0.21469,0.0021078,0.05,17.784 -1e+05,0.21469,0.0021078,0.05,17.784 -1e+05,0.21469,0.0021078,0.05,17.784 -1e+05,0.21469,0.0021078,0.05,17.784 -1e+05,0.21893,0.0021494,0.05,16.84 -1e+05,0.21893,0.0021494,0.05,16.84 -1e+05,0.21893,0.0021494,0.05,16.84 -1e+05,0.21893,0.0021494,0.05,16.84 -1e+05,0.21893,0.0021494,0.05,16.84 -1e+05,0.22326,0.0021919,0.05,15.941 -1e+05,0.22326,0.0021919,0.05,15.941 -1e+05,0.22326,0.0021919,0.05,15.941 -1e+05,0.22326,0.0021919,0.05,15.941 -1e+05,0.22767,0.0022352,0.05,15.085 -1e+05,0.22767,0.0022352,0.05,15.085 -1e+05,0.22767,0.0022352,0.05,15.085 -1e+05,0.22767,0.0022352,0.05,15.085 -1e+05,0.23217,0.0022794,0.05,14.27 -1e+05,0.23217,0.0022794,0.05,14.27 -1e+05,0.23217,0.0022794,0.05,14.27 -1e+05,0.23217,0.0022794,0.05,14.27 -1e+05,0.23217,0.0022794,0.05,14.27 -1e+05,0.23676,0.0023244,0.05,13.494 -1e+05,0.23676,0.0023244,0.05,13.494 -1e+05,0.23676,0.0023244,0.05,13.494 -1e+05,0.23676,0.0023244,0.05,13.494 -1e+05,0.23676,0.0023244,0.05,13.494 -1e+05,0.24144,0.0023704,0.05,12.756 -1e+05,0.24144,0.0023704,0.05,12.756 -1e+05,0.24144,0.0023704,0.05,12.756 -1e+05,0.24144,0.0023704,0.05,12.756 -1e+05,0.24621,0.0024172,0.05,12.054 -1e+05,0.24621,0.0024172,0.05,12.054 -1e+05,0.24621,0.0024172,0.05,12.054 -1e+05,0.24621,0.0024172,0.05,12.054 -1e+05,0.24621,0.0024172,0.05,12.054 -1e+05,0.25108,0.002465,0.05,11.386 -1e+05,0.25108,0.002465,0.05,11.386 -1e+05,0.25108,0.002465,0.05,11.386 -1e+05,0.25108,0.002465,0.05,11.386 -1e+05,0.25108,0.002465,0.05,11.386 -1e+05,0.25604,0.0025137,0.05,10.752 -1e+05,0.25604,0.0025137,0.05,10.752 -1e+05,0.25604,0.0025137,0.05,10.752 -1e+05,0.25604,0.0025137,0.05,10.752 -1e+05,0.25604,0.0025137,0.05,10.752 -1e+05,0.2611,0.0025634,0.05,10.148 -1e+05,0.2611,0.0025634,0.05,10.148 -1e+05,0.2611,0.0025634,0.05,10.148 -1e+05,0.2611,0.0025634,0.05,10.148 -1e+05,0.2611,0.0025634,0.05,10.148 -1e+05,0.26626,0.0026141,0.05,9.5755 -1e+05,0.26626,0.0026141,0.05,9.5755 -1e+05,0.26626,0.0026141,0.05,9.5755 -1e+05,0.26626,0.0026141,0.05,9.5755 -1e+05,0.26626,0.0026141,0.05,9.5755 -1e+05,0.27153,0.0026658,0.05,9.0312 -1e+05,0.27153,0.0026658,0.05,9.0312 -1e+05,0.27153,0.0026658,0.05,9.0312 -1e+05,0.27153,0.0026658,0.05,9.0312 -1e+05,0.27153,0.0026658,0.05,9.0312 -1e+05,0.27153,0.0026658,0.05,9.0312 -1e+05,0.2769,0.0027185,0.05,8.5143 -1e+05,0.2769,0.0027185,0.05,8.5143 -1e+05,0.2769,0.0027185,0.05,8.5143 -1e+05,0.2769,0.0027185,0.05,8.5143 -1e+05,0.2769,0.0027185,0.05,8.5143 -1e+05,0.28237,0.0027723,0.05,8.0236 -1e+05,0.28237,0.0027723,0.05,8.0236 -1e+05,0.28237,0.0027723,0.05,8.0236 -1e+05,0.28237,0.0027723,0.05,8.0236 -1e+05,0.28237,0.0027723,0.05,8.0236 -1e+05,0.28237,0.0027723,0.05,8.0236 -1e+05,0.28796,0.0028271,0.05,7.5579 -1e+05,0.28796,0.0028271,0.05,7.5579 -1e+05,0.28796,0.0028271,0.05,7.5579 -1e+05,0.28796,0.0028271,0.05,7.5579 -1e+05,0.28796,0.0028271,0.05,7.5579 -1e+05,0.29365,0.002883,0.05,7.1159 -1e+05,0.29365,0.002883,0.05,7.1159 -1e+05,0.29365,0.002883,0.05,7.1159 -1e+05,0.29365,0.002883,0.05,7.1159 -1e+05,0.29365,0.002883,0.05,7.1159 -1e+05,0.29365,0.002883,0.05,7.1159 -1e+05,0.29946,0.00294,0.05,6.6965 -1e+05,0.29946,0.00294,0.05,6.6965 -1e+05,0.29946,0.00294,0.05,6.6965 -1e+05,0.29946,0.00294,0.05,6.6965 -1e+05,0.29946,0.00294,0.05,6.6965 -1e+05,0.29946,0.00294,0.05,6.6965 -1e+05,0.30538,0.0029982,0.05,6.2987 -1e+05,0.30538,0.0029982,0.05,6.2987 -1e+05,0.30538,0.0029982,0.05,6.2987 -1e+05,0.30538,0.0029982,0.05,6.2987 -1e+05,0.30538,0.0029982,0.05,6.2987 -1e+05,0.30538,0.0029982,0.05,6.2987 -1e+05,0.31142,0.0030575,0.05,5.9215 -1e+05,0.31142,0.0030575,0.05,5.9215 -1e+05,0.31142,0.0030575,0.05,5.9215 -1e+05,0.31142,0.0030575,0.05,5.9215 -1e+05,0.31142,0.0030575,0.05,5.9215 -1e+05,0.31142,0.0030575,0.05,5.9215 -1e+05,0.31758,0.003118,0.05,5.5639 -1e+05,0.31758,0.003118,0.05,5.5639 -1e+05,0.31758,0.003118,0.05,5.5639 -1e+05,0.31758,0.003118,0.05,5.5639 -1e+05,0.31758,0.003118,0.05,5.5639 -1e+05,0.31758,0.003118,0.05,5.5639 -1e+05,0.32386,0.0031796,0.05,5.2249 -1e+05,0.32386,0.0031796,0.05,5.2249 -1e+05,0.32386,0.0031796,0.05,5.2249 -1e+05,0.32386,0.0031796,0.05,5.2249 -1e+05,0.32386,0.0031796,0.05,5.2249 -1e+05,0.32386,0.0031796,0.05,5.2249 -1e+05,0.32386,0.0031796,0.05,5.2249 -1e+05,0.33027,0.0032425,0.05,4.9037 -1e+05,0.33027,0.0032425,0.05,4.9037 -1e+05,0.33027,0.0032425,0.05,4.9037 -1e+05,0.33027,0.0032425,0.05,4.9037 -1e+05,0.33027,0.0032425,0.05,4.9037 -1e+05,0.33027,0.0032425,0.05,4.9037 -1e+05,0.3368,0.0033067,0.05,4.5994 -1e+05,0.3368,0.0033067,0.05,4.5994 -1e+05,0.3368,0.0033067,0.05,4.5994 -1e+05,0.3368,0.0033067,0.05,4.5994 -1e+05,0.3368,0.0033067,0.05,4.5994 -1e+05,0.3368,0.0033067,0.05,4.5994 -1e+05,0.3368,0.0033067,0.05,4.5994 -1e+05,0.34347,0.0033721,0.05,4.3111 -1e+05,0.34347,0.0033721,0.05,4.3111 -1e+05,0.34347,0.0033721,0.05,4.3111 -1e+05,0.34347,0.0033721,0.05,4.3111 -1e+05,0.34347,0.0033721,0.05,4.3111 -1e+05,0.34347,0.0033721,0.05,4.3111 -1e+05,0.35026,0.0034388,0.05,4.0382 -1e+05,0.35026,0.0034388,0.05,4.0382 -1e+05,0.35026,0.0034388,0.05,4.0382 -1e+05,0.35026,0.0034388,0.05,4.0382 -1e+05,0.35026,0.0034388,0.05,4.0382 -1e+05,0.35026,0.0034388,0.05,4.0382 -1e+05,0.35026,0.0034388,0.05,4.0382 -1e+05,0.35719,0.0035069,0.05,3.7798 -1e+05,0.35719,0.0035069,0.05,3.7798 -1e+05,0.35719,0.0035069,0.05,3.7798 -1e+05,0.35719,0.0035069,0.05,3.7798 -1e+05,0.35719,0.0035069,0.05,3.7798 -1e+05,0.35719,0.0035069,0.05,3.7798 -1e+05,0.35719,0.0035069,0.05,3.7798 -1e+05,0.36426,0.0035762,0.05,3.5354 -1e+05,0.36426,0.0035762,0.05,3.5354 -1e+05,0.36426,0.0035762,0.05,3.5354 -1e+05,0.36426,0.0035762,0.05,3.5354 -1e+05,0.36426,0.0035762,0.05,3.5354 -1e+05,0.36426,0.0035762,0.05,3.5354 -1e+05,0.36426,0.0035762,0.05,3.5354 -1e+05,0.37147,0.003647,0.05,3.3041 -1e+05,0.37147,0.003647,0.05,3.3041 -1e+05,0.37147,0.003647,0.05,3.3041 -1e+05,0.37147,0.003647,0.05,3.3041 -1e+05,0.37147,0.003647,0.05,3.3041 -1e+05,0.37147,0.003647,0.05,3.3041 -1e+05,0.37147,0.003647,0.05,3.3041 -1e+05,0.37147,0.003647,0.05,3.3041 -1e+05,0.37882,0.0037192,0.05,3.0854 -1e+05,0.37882,0.0037192,0.05,3.0854 -1e+05,0.37882,0.0037192,0.05,3.0854 -1e+05,0.37882,0.0037192,0.05,3.0854 -1e+05,0.37882,0.0037192,0.05,3.0854 -1e+05,0.37882,0.0037192,0.05,3.0854 -1e+05,0.37882,0.0037192,0.05,3.0854 -1e+05,0.38632,0.0037928,0.05,2.8787 -1e+05,0.38632,0.0037928,0.05,2.8787 -1e+05,0.38632,0.0037928,0.05,2.8787 -1e+05,0.38632,0.0037928,0.05,2.8787 -1e+05,0.38632,0.0037928,0.05,2.8787 -1e+05,0.38632,0.0037928,0.05,2.8787 -1e+05,0.38632,0.0037928,0.05,2.8787 -1e+05,0.38632,0.0037928,0.05,2.8787 -1e+05,0.39396,0.0038678,0.05,2.6834 -1e+05,0.39396,0.0038678,0.05,2.6834 -1e+05,0.39396,0.0038678,0.05,2.6834 -1e+05,0.39396,0.0038678,0.05,2.6834 -1e+05,0.39396,0.0038678,0.05,2.6834 -1e+05,0.39396,0.0038678,0.05,2.6834 -1e+05,0.39396,0.0038678,0.05,2.6834 -1e+05,0.40176,0.0039444,0.05,2.499 -1e+05,0.40176,0.0039444,0.05,2.499 -1e+05,0.40176,0.0039444,0.05,2.499 -1e+05,0.40176,0.0039444,0.05,2.499 -1e+05,0.40176,0.0039444,0.05,2.499 -1e+05,0.40176,0.0039444,0.05,2.499 -1e+05,0.40176,0.0039444,0.05,2.499 -1e+05,0.40176,0.0039444,0.05,2.499 -1e+05,0.40971,0.0040224,0.05,2.3249 -1e+05,0.40971,0.0040224,0.05,2.3249 -1e+05,0.40971,0.0040224,0.05,2.3249 -1e+05,0.40971,0.0040224,0.05,2.3249 -1e+05,0.40971,0.0040224,0.05,2.3249 -1e+05,0.40971,0.0040224,0.05,2.3249 -1e+05,0.40971,0.0040224,0.05,2.3249 -1e+05,0.40971,0.0040224,0.05,2.3249 -1e+05,0.41782,0.004102,0.05,2.1607 -1e+05,0.41782,0.004102,0.05,2.1607 -1e+05,0.41782,0.004102,0.05,2.1607 -1e+05,0.41782,0.004102,0.05,2.1607 -1e+05,0.41782,0.004102,0.05,2.1607 -1e+05,0.41782,0.004102,0.05,2.1607 -1e+05,0.41782,0.004102,0.05,2.1607 -1e+05,0.41782,0.004102,0.05,2.1607 -1e+05,0.42609,0.0041832,0.05,2.0058 -1e+05,0.42609,0.0041832,0.05,2.0058 -1e+05,0.42609,0.0041832,0.05,2.0058 -1e+05,0.42609,0.0041832,0.05,2.0058 -1e+05,0.42609,0.0041832,0.05,2.0058 -1e+05,0.42609,0.0041832,0.05,2.0058 -1e+05,0.42609,0.0041832,0.05,2.0058 -1e+05,0.42609,0.0041832,0.05,2.0058 -1e+05,0.42609,0.0041832,0.05,2.0058 -1e+05,0.43452,0.004266,0.05,1.8599 -1e+05,0.43452,0.004266,0.05,1.8599 -1e+05,0.43452,0.004266,0.05,1.8599 -1e+05,0.43452,0.004266,0.05,1.8599 -1e+05,0.43452,0.004266,0.05,1.8599 -1e+05,0.43452,0.004266,0.05,1.8599 -1e+05,0.43452,0.004266,0.05,1.8599 -1e+05,0.43452,0.004266,0.05,1.8599 -1e+05,0.44312,0.0043505,0.05,1.7224 -1e+05,0.44312,0.0043505,0.05,1.7224 -1e+05,0.44312,0.0043505,0.05,1.7224 -1e+05,0.44312,0.0043505,0.05,1.7224 -1e+05,0.44312,0.0043505,0.05,1.7224 -1e+05,0.44312,0.0043505,0.05,1.7224 -1e+05,0.44312,0.0043505,0.05,1.7224 -1e+05,0.44312,0.0043505,0.05,1.7224 -1e+05,0.44312,0.0043505,0.05,1.7224 -1e+05,0.45189,0.0044366,0.05,1.5931 -1e+05,0.45189,0.0044366,0.05,1.5931 -1e+05,0.45189,0.0044366,0.05,1.5931 -1e+05,0.45189,0.0044366,0.05,1.5931 -1e+05,0.45189,0.0044366,0.05,1.5931 -1e+05,0.45189,0.0044366,0.05,1.5931 -1e+05,0.45189,0.0044366,0.05,1.5931 -1e+05,0.45189,0.0044366,0.05,1.5931 -1e+05,0.45189,0.0044366,0.05,1.5931 -1e+05,0.46084,0.0045244,0.05,1.4715 -1e+05,0.46084,0.0045244,0.05,1.4715 -1e+05,0.46084,0.0045244,0.05,1.4715 -1e+05,0.46084,0.0045244,0.05,1.4715 -1e+05,0.46084,0.0045244,0.05,1.4715 -1e+05,0.46084,0.0045244,0.05,1.4715 -1e+05,0.46084,0.0045244,0.05,1.4715 -1e+05,0.46084,0.0045244,0.05,1.4715 -1e+05,0.46084,0.0045244,0.05,1.4715 -1e+05,0.46996,0.004614,0.05,1.3573 -1e+05,0.46996,0.004614,0.05,1.3573 -1e+05,0.46996,0.004614,0.05,1.3573 -1e+05,0.46996,0.004614,0.05,1.3573 -1e+05,0.46996,0.004614,0.05,1.3573 -1e+05,0.46996,0.004614,0.05,1.3573 -1e+05,0.46996,0.004614,0.05,1.3573 -1e+05,0.46996,0.004614,0.05,1.3573 -1e+05,0.46996,0.004614,0.05,1.3573 -1e+05,0.47926,0.0047053,0.05,1.25 -1e+05,0.47926,0.0047053,0.05,1.25 -1e+05,0.47926,0.0047053,0.05,1.25 -1e+05,0.47926,0.0047053,0.05,1.25 -1e+05,0.47926,0.0047053,0.05,1.25 -1e+05,0.47926,0.0047053,0.05,1.25 -1e+05,0.47926,0.0047053,0.05,1.25 -1e+05,0.47926,0.0047053,0.05,1.25 -1e+05,0.47926,0.0047053,0.05,1.25 -1e+05,0.47926,0.0047053,0.05,1.25 -1e+05,0.48875,0.0047985,0.05,1.1495 -1e+05,0.48875,0.0047985,0.05,1.1495 -1e+05,0.48875,0.0047985,0.05,1.1495 -1e+05,0.48875,0.0047985,0.05,1.1495 -1e+05,0.48875,0.0047985,0.05,1.1495 -1e+05,0.48875,0.0047985,0.05,1.1495 -1e+05,0.48875,0.0047985,0.05,1.1495 -1e+05,0.48875,0.0047985,0.05,1.1495 -1e+05,0.48875,0.0047985,0.05,1.1495 -1e+05,0.49843,0.0048935,0.05,1.0552 -1e+05,0.49843,0.0048935,0.05,1.0552 -1e+05,0.49843,0.0048935,0.05,1.0552 -1e+05,0.49843,0.0048935,0.05,1.0552 -1e+05,0.49843,0.0048935,0.05,1.0552 -1e+05,0.49843,0.0048935,0.05,1.0552 -1e+05,0.49843,0.0048935,0.05,1.0552 -1e+05,0.49843,0.0048935,0.05,1.0552 -1e+05,0.49843,0.0048935,0.05,1.0552 -1e+05,0.49843,0.0048935,0.05,1.0552 -1e+05,0.5083,0.0049903,0.05,0.96708 -1e+05,0.5083,0.0049903,0.05,0.96708 -1e+05,0.5083,0.0049903,0.05,0.96708 -1e+05,0.5083,0.0049903,0.05,0.96708 -1e+05,0.5083,0.0049903,0.05,0.96708 -1e+05,0.5083,0.0049903,0.05,0.96708 -1e+05,0.5083,0.0049903,0.05,0.96708 -1e+05,0.5083,0.0049903,0.05,0.96708 -1e+05,0.5083,0.0049903,0.05,0.96708 -1e+05,0.5083,0.0049903,0.05,0.96708 -1e+05,0.51836,0.0050891,0.05,0.88468 -1e+05,0.51836,0.0050891,0.05,0.88468 -1e+05,0.51836,0.0050891,0.05,0.88468 -1e+05,0.51836,0.0050891,0.05,0.88468 -1e+05,0.51836,0.0050891,0.05,0.88468 -1e+05,0.51836,0.0050891,0.05,0.88468 -1e+05,0.51836,0.0050891,0.05,0.88468 -1e+05,0.51836,0.0050891,0.05,0.88468 -1e+05,0.51836,0.0050891,0.05,0.88468 -1e+05,0.51836,0.0050891,0.05,0.88468 -1e+05,0.52862,0.0051899,0.05,0.80776 -1e+05,0.52862,0.0051899,0.05,0.80776 -1e+05,0.52862,0.0051899,0.05,0.80776 -1e+05,0.52862,0.0051899,0.05,0.80776 -1e+05,0.52862,0.0051899,0.05,0.80776 -1e+05,0.52862,0.0051899,0.05,0.80776 -1e+05,0.52862,0.0051899,0.05,0.80776 -1e+05,0.52862,0.0051899,0.05,0.80776 -1e+05,0.52862,0.0051899,0.05,0.80776 -1e+05,0.52862,0.0051899,0.05,0.80776 -1e+05,0.53909,0.0052927,0.05,0.73605 -1e+05,0.53909,0.0052927,0.05,0.73605 -1e+05,0.53909,0.0052927,0.05,0.73605 -1e+05,0.53909,0.0052927,0.05,0.73605 -1e+05,0.53909,0.0052927,0.05,0.73605 -1e+05,0.53909,0.0052927,0.05,0.73605 -1e+05,0.53909,0.0052927,0.05,0.73605 -1e+05,0.53909,0.0052927,0.05,0.73605 -1e+05,0.53909,0.0052927,0.05,0.73605 -1e+05,0.53909,0.0052927,0.05,0.73605 -1e+05,0.53909,0.0052927,0.05,0.73605 -1e+05,0.54976,0.0053975,0.05,0.66931 -1e+05,0.54976,0.0053975,0.05,0.66931 -1e+05,0.54976,0.0053975,0.05,0.66931 -1e+05,0.54976,0.0053975,0.05,0.66931 -1e+05,0.54976,0.0053975,0.05,0.66931 -1e+05,0.54976,0.0053975,0.05,0.66931 -1e+05,0.54976,0.0053975,0.05,0.66931 -1e+05,0.54976,0.0053975,0.05,0.66931 -1e+05,0.54976,0.0053975,0.05,0.66931 -1e+05,0.54976,0.0053975,0.05,0.66931 -1e+05,0.54976,0.0053975,0.05,0.66931 -1e+05,0.56065,0.0055043,0.05,0.60728 -1e+05,0.56065,0.0055043,0.05,0.60728 -1e+05,0.56065,0.0055043,0.05,0.60728 -1e+05,0.56065,0.0055043,0.05,0.60728 -1e+05,0.56065,0.0055043,0.05,0.60728 -1e+05,0.56065,0.0055043,0.05,0.60728 -1e+05,0.56065,0.0055043,0.05,0.60728 -1e+05,0.56065,0.0055043,0.05,0.60728 -1e+05,0.56065,0.0055043,0.05,0.60728 -1e+05,0.56065,0.0055043,0.05,0.60728 -1e+05,0.56065,0.0055043,0.05,0.60728 -1e+05,0.57175,0.0056133,0.05,0.54972 -1e+05,0.57175,0.0056133,0.05,0.54972 -1e+05,0.57175,0.0056133,0.05,0.54972 -1e+05,0.57175,0.0056133,0.05,0.54972 -1e+05,0.57175,0.0056133,0.05,0.54972 -1e+05,0.57175,0.0056133,0.05,0.54972 -1e+05,0.57175,0.0056133,0.05,0.54972 -1e+05,0.57175,0.0056133,0.05,0.54972 -1e+05,0.57175,0.0056133,0.05,0.54972 -1e+05,0.57175,0.0056133,0.05,0.54972 -1e+05,0.57175,0.0056133,0.05,0.54972 -1e+05,0.58307,0.0057245,0.05,0.49642 -1e+05,0.58307,0.0057245,0.05,0.49642 -1e+05,0.58307,0.0057245,0.05,0.49642 -1e+05,0.58307,0.0057245,0.05,0.49642 -1e+05,0.58307,0.0057245,0.05,0.49642 -1e+05,0.58307,0.0057245,0.05,0.49642 -1e+05,0.58307,0.0057245,0.05,0.49642 -1e+05,0.58307,0.0057245,0.05,0.49642 -1e+05,0.58307,0.0057245,0.05,0.49642 -1e+05,0.58307,0.0057245,0.05,0.49642 -1e+05,0.58307,0.0057245,0.05,0.49642 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.59462,0.0058378,0.05,0.44715 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.60639,0.0059535,0.05,0.40169 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.6184,0.0060714,0.05,0.35985 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.63065,0.0061916,0.05,0.32142 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.64314,0.0063142,0.05,0.28621 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.65588,0.0064393,0.05,0.25404 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.66887,0.0065668,0.05,0.22472 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.68211,0.0066969,0.05,0.19808 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.69562,0.0068295,0.05,0.17395 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.7094,0.0069648,0.05,0.15216 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.72345,0.0071027,0.05,0.13255 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.73778,0.0072434,0.05,0.11496 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7524,0.0073869,0.05,0.099241 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7673,0.0075332,0.05,0.085248 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.7825,0.0076824,0.05,0.072837 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.798,0.0078346,0.05,0.06187 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.81381,0.0079898,0.05,0.052214 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.82993,0.0081481,0.05,0.043741 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.84637,0.0083095,0.05,0.036326 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.86314,0.0084741,0.05,0.029851 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.88024,0.008642,0.05,0.024199 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.89767,0.0088132,0.05,0.019259 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.91546,0.0089878,0.05,0.014921 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.93359,0.0091658,0.05,0.011078 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.95209,0.0093474,0.05,0.0076246 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.97095,0.0095326,0.05,0.0044533 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 -1e+05,0.99019,0.0097215,0.05,0.0014552 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_2.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_2.csv deleted file mode 100644 index 245f1b2f8cf..00000000000 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_2.csv +++ /dev/null @@ -1,1002 +0,0 @@ -Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,nan,nan,nan,nan -20000,0.10099,0.0009915,0.05,96.996 -20000,0.10099,0.0009915,0.05,96.996 -20000,0.10099,0.0009915,0.05,96.996 -20000,0.10299,0.0010111,0.05,91.135 -20000,0.10299,0.0010111,0.05,91.135 -20000,0.10499,0.0010308,0.05,85.471 -20000,0.10499,0.0010308,0.05,85.471 -20000,0.10734,0.0010538,0.05,79.09 -20000,0.10734,0.0010538,0.05,79.09 -20000,0.11004,0.0010803,0.05,72.24 -20000,0.11004,0.0010803,0.05,72.24 -20000,0.11004,0.0010803,0.05,72.24 -20000,0.11274,0.0011068,0.05,65.904 -20000,0.11274,0.0011068,0.05,65.904 -20000,0.11274,0.0011068,0.05,65.904 -20000,0.11544,0.0011334,0.05,60.092 -20000,0.11544,0.0011334,0.05,60.092 -20000,0.11814,0.0011599,0.05,54.792 -20000,0.11814,0.0011599,0.05,54.792 -20000,0.11814,0.0011599,0.05,54.792 -20000,0.12084,0.0011864,0.05,49.98 -20000,0.12084,0.0011864,0.05,49.98 -20000,0.12084,0.0011864,0.05,49.98 -20000,0.12354,0.0012129,0.05,45.627 -20000,0.12354,0.0012129,0.05,45.627 -20000,0.12624,0.0012394,0.05,41.695 -20000,0.12624,0.0012394,0.05,41.695 -20000,0.12624,0.0012394,0.05,41.695 -20000,0.12894,0.0012659,0.05,38.149 -20000,0.12894,0.0012659,0.05,38.149 -20000,0.12894,0.0012659,0.05,38.149 -20000,0.13164,0.0012924,0.05,34.952 -20000,0.13164,0.0012924,0.05,34.952 -20000,0.13164,0.0012924,0.05,34.952 -20000,0.1343,0.0013185,0.05,32.111 -20000,0.1343,0.0013185,0.05,32.111 -20000,0.13695,0.0013445,0.05,29.553 -20000,0.13695,0.0013445,0.05,29.553 -20000,0.13695,0.0013445,0.05,29.553 -20000,0.13965,0.001371,0.05,27.195 -20000,0.13965,0.001371,0.05,27.195 -20000,0.13965,0.001371,0.05,27.195 -20000,0.1424,0.0013981,0.05,25.024 -20000,0.1424,0.0013981,0.05,25.024 -20000,0.14521,0.0014256,0.05,23.026 -20000,0.14521,0.0014256,0.05,23.026 -20000,0.14521,0.0014256,0.05,23.026 -20000,0.14807,0.0014538,0.05,21.188 -20000,0.14807,0.0014538,0.05,21.188 -20000,0.14807,0.0014538,0.05,21.188 -20000,0.151,0.0014824,0.05,19.498 -20000,0.151,0.0014824,0.05,19.498 -20000,0.151,0.0014824,0.05,19.498 -20000,0.15397,0.0015117,0.05,17.943 -20000,0.15397,0.0015117,0.05,17.943 -20000,0.15397,0.0015117,0.05,17.943 -20000,0.15701,0.0015415,0.05,16.514 -20000,0.15701,0.0015415,0.05,16.514 -20000,0.15701,0.0015415,0.05,16.514 -20000,0.16011,0.0015719,0.05,15.2 -20000,0.16011,0.0015719,0.05,15.2 -20000,0.16011,0.0015719,0.05,15.2 -20000,0.16327,0.001603,0.05,13.991 -20000,0.16327,0.001603,0.05,13.991 -20000,0.16327,0.001603,0.05,13.991 -20000,0.16649,0.0016346,0.05,12.878 -20000,0.16649,0.0016346,0.05,12.878 -20000,0.16649,0.0016346,0.05,12.878 -20000,0.16649,0.0016346,0.05,12.878 -20000,0.16978,0.0016669,0.05,11.855 -20000,0.16978,0.0016669,0.05,11.855 -20000,0.16978,0.0016669,0.05,11.855 -20000,0.17313,0.0016998,0.05,10.912 -20000,0.17313,0.0016998,0.05,10.912 -20000,0.17313,0.0016998,0.05,10.912 -20000,0.17655,0.0017333,0.05,10.044 -20000,0.17655,0.0017333,0.05,10.044 -20000,0.17655,0.0017333,0.05,10.044 -20000,0.17655,0.0017333,0.05,10.044 -20000,0.18004,0.0017676,0.05,9.2442 -20000,0.18004,0.0017676,0.05,9.2442 -20000,0.18004,0.0017676,0.05,9.2442 -20000,0.18359,0.0018025,0.05,8.507 -20000,0.18359,0.0018025,0.05,8.507 -20000,0.18359,0.0018025,0.05,8.507 -20000,0.18359,0.0018025,0.05,8.507 -20000,0.18722,0.001838,0.05,7.8273 -20000,0.18722,0.001838,0.05,7.8273 -20000,0.18722,0.001838,0.05,7.8273 -20000,0.18722,0.001838,0.05,7.8273 -20000,0.19091,0.0018743,0.05,7.2003 -20000,0.19091,0.0018743,0.05,7.2003 -20000,0.19091,0.0018743,0.05,7.2003 -20000,0.19468,0.0019114,0.05,6.6217 -20000,0.19468,0.0019114,0.05,6.6217 -20000,0.19468,0.0019114,0.05,6.6217 -20000,0.19468,0.0019114,0.05,6.6217 -20000,0.19853,0.0019491,0.05,6.0877 -20000,0.19853,0.0019491,0.05,6.0877 -20000,0.19853,0.0019491,0.05,6.0877 -20000,0.19853,0.0019491,0.05,6.0877 -20000,0.20245,0.0019876,0.05,5.5945 -20000,0.20245,0.0019876,0.05,5.5945 -20000,0.20245,0.0019876,0.05,5.5945 -20000,0.20245,0.0019876,0.05,5.5945 -20000,0.20645,0.0020269,0.05,5.139 -20000,0.20645,0.0020269,0.05,5.139 -20000,0.20645,0.0020269,0.05,5.139 -20000,0.20645,0.0020269,0.05,5.139 -20000,0.21053,0.0020669,0.05,4.7182 -20000,0.21053,0.0020669,0.05,4.7182 -20000,0.21053,0.0020669,0.05,4.7182 -20000,0.21053,0.0020669,0.05,4.7182 -20000,0.21469,0.0021078,0.05,4.3294 -20000,0.21469,0.0021078,0.05,4.3294 -20000,0.21469,0.0021078,0.05,4.3294 -20000,0.21469,0.0021078,0.05,4.3294 -20000,0.21893,0.0021494,0.05,3.97 -20000,0.21893,0.0021494,0.05,3.97 -20000,0.21893,0.0021494,0.05,3.97 -20000,0.21893,0.0021494,0.05,3.97 -20000,0.21893,0.0021494,0.05,3.97 -20000,0.22326,0.0021919,0.05,3.6379 -20000,0.22326,0.0021919,0.05,3.6379 -20000,0.22326,0.0021919,0.05,3.6379 -20000,0.22326,0.0021919,0.05,3.6379 -20000,0.22767,0.0022352,0.05,3.3309 -20000,0.22767,0.0022352,0.05,3.3309 -20000,0.22767,0.0022352,0.05,3.3309 -20000,0.22767,0.0022352,0.05,3.3309 -20000,0.23217,0.0022794,0.05,3.0471 -20000,0.23217,0.0022794,0.05,3.0471 -20000,0.23217,0.0022794,0.05,3.0471 -20000,0.23217,0.0022794,0.05,3.0471 -20000,0.23217,0.0022794,0.05,3.0471 -20000,0.23676,0.0023244,0.05,2.7849 -20000,0.23676,0.0023244,0.05,2.7849 -20000,0.23676,0.0023244,0.05,2.7849 -20000,0.23676,0.0023244,0.05,2.7849 -20000,0.23676,0.0023244,0.05,2.7849 -20000,0.24144,0.0023704,0.05,2.5425 -20000,0.24144,0.0023704,0.05,2.5425 -20000,0.24144,0.0023704,0.05,2.5425 -20000,0.24144,0.0023704,0.05,2.5425 -20000,0.24621,0.0024172,0.05,2.3187 -20000,0.24621,0.0024172,0.05,2.3187 -20000,0.24621,0.0024172,0.05,2.3187 -20000,0.24621,0.0024172,0.05,2.3187 -20000,0.24621,0.0024172,0.05,2.3187 -20000,0.25108,0.002465,0.05,2.112 -20000,0.25108,0.002465,0.05,2.112 -20000,0.25108,0.002465,0.05,2.112 -20000,0.25108,0.002465,0.05,2.112 -20000,0.25108,0.002465,0.05,2.112 -20000,0.25604,0.0025137,0.05,1.9211 -20000,0.25604,0.0025137,0.05,1.9211 -20000,0.25604,0.0025137,0.05,1.9211 -20000,0.25604,0.0025137,0.05,1.9211 -20000,0.25604,0.0025137,0.05,1.9211 -20000,0.2611,0.0025634,0.05,1.7451 -20000,0.2611,0.0025634,0.05,1.7451 -20000,0.2611,0.0025634,0.05,1.7451 -20000,0.2611,0.0025634,0.05,1.7451 -20000,0.2611,0.0025634,0.05,1.7451 -20000,0.26626,0.0026141,0.05,1.5827 -20000,0.26626,0.0026141,0.05,1.5827 -20000,0.26626,0.0026141,0.05,1.5827 -20000,0.26626,0.0026141,0.05,1.5827 -20000,0.26626,0.0026141,0.05,1.5827 -20000,0.27153,0.0026658,0.05,1.4332 -20000,0.27153,0.0026658,0.05,1.4332 -20000,0.27153,0.0026658,0.05,1.4332 -20000,0.27153,0.0026658,0.05,1.4332 -20000,0.27153,0.0026658,0.05,1.4332 -20000,0.27153,0.0026658,0.05,1.4332 -20000,0.2769,0.0027185,0.05,1.2955 -20000,0.2769,0.0027185,0.05,1.2955 -20000,0.2769,0.0027185,0.05,1.2955 -20000,0.2769,0.0027185,0.05,1.2955 -20000,0.2769,0.0027185,0.05,1.2955 -20000,0.28237,0.0027723,0.05,1.1688 -20000,0.28237,0.0027723,0.05,1.1688 -20000,0.28237,0.0027723,0.05,1.1688 -20000,0.28237,0.0027723,0.05,1.1688 -20000,0.28237,0.0027723,0.05,1.1688 -20000,0.28237,0.0027723,0.05,1.1688 -20000,0.28796,0.0028271,0.05,1.0525 -20000,0.28796,0.0028271,0.05,1.0525 -20000,0.28796,0.0028271,0.05,1.0525 -20000,0.28796,0.0028271,0.05,1.0525 -20000,0.28796,0.0028271,0.05,1.0525 -20000,0.29365,0.002883,0.05,0.94576 -20000,0.29365,0.002883,0.05,0.94576 -20000,0.29365,0.002883,0.05,0.94576 -20000,0.29365,0.002883,0.05,0.94576 -20000,0.29365,0.002883,0.05,0.94576 -20000,0.29365,0.002883,0.05,0.94576 -20000,0.29946,0.00294,0.05,0.84795 -20000,0.29946,0.00294,0.05,0.84795 -20000,0.29946,0.00294,0.05,0.84795 -20000,0.29946,0.00294,0.05,0.84795 -20000,0.29946,0.00294,0.05,0.84795 -20000,0.29946,0.00294,0.05,0.84795 -20000,0.30538,0.0029982,0.05,0.75847 -20000,0.30538,0.0029982,0.05,0.75847 -20000,0.30538,0.0029982,0.05,0.75847 -20000,0.30538,0.0029982,0.05,0.75847 -20000,0.30538,0.0029982,0.05,0.75847 -20000,0.30538,0.0029982,0.05,0.75847 -20000,0.31142,0.0030575,0.05,0.67673 -20000,0.31142,0.0030575,0.05,0.67673 -20000,0.31142,0.0030575,0.05,0.67673 -20000,0.31142,0.0030575,0.05,0.67673 -20000,0.31142,0.0030575,0.05,0.67673 -20000,0.31142,0.0030575,0.05,0.67673 -20000,0.31758,0.003118,0.05,0.60221 -20000,0.31758,0.003118,0.05,0.60221 -20000,0.31758,0.003118,0.05,0.60221 -20000,0.31758,0.003118,0.05,0.60221 -20000,0.31758,0.003118,0.05,0.60221 -20000,0.31758,0.003118,0.05,0.60221 -20000,0.32386,0.0031796,0.05,0.5344 -20000,0.32386,0.0031796,0.05,0.5344 -20000,0.32386,0.0031796,0.05,0.5344 -20000,0.32386,0.0031796,0.05,0.5344 -20000,0.32386,0.0031796,0.05,0.5344 -20000,0.32386,0.0031796,0.05,0.5344 -20000,0.32386,0.0031796,0.05,0.5344 -20000,0.33027,0.0032425,0.05,0.47284 -20000,0.33027,0.0032425,0.05,0.47284 -20000,0.33027,0.0032425,0.05,0.47284 -20000,0.33027,0.0032425,0.05,0.47284 -20000,0.33027,0.0032425,0.05,0.47284 -20000,0.33027,0.0032425,0.05,0.47284 -20000,0.3368,0.0033067,0.05,0.41707 -20000,0.3368,0.0033067,0.05,0.41707 -20000,0.3368,0.0033067,0.05,0.41707 -20000,0.3368,0.0033067,0.05,0.41707 -20000,0.3368,0.0033067,0.05,0.41707 -20000,0.3368,0.0033067,0.05,0.41707 -20000,0.3368,0.0033067,0.05,0.41707 -20000,0.34347,0.0033721,0.05,0.36668 -20000,0.34347,0.0033721,0.05,0.36668 -20000,0.34347,0.0033721,0.05,0.36668 -20000,0.34347,0.0033721,0.05,0.36668 -20000,0.34347,0.0033721,0.05,0.36668 -20000,0.34347,0.0033721,0.05,0.36668 -20000,0.35026,0.0034388,0.05,0.32128 -20000,0.35026,0.0034388,0.05,0.32128 -20000,0.35026,0.0034388,0.05,0.32128 -20000,0.35026,0.0034388,0.05,0.32128 -20000,0.35026,0.0034388,0.05,0.32128 -20000,0.35026,0.0034388,0.05,0.32128 -20000,0.35026,0.0034388,0.05,0.32128 -20000,0.35719,0.0035069,0.05,0.28049 -20000,0.35719,0.0035069,0.05,0.28049 -20000,0.35719,0.0035069,0.05,0.28049 -20000,0.35719,0.0035069,0.05,0.28049 -20000,0.35719,0.0035069,0.05,0.28049 -20000,0.35719,0.0035069,0.05,0.28049 -20000,0.35719,0.0035069,0.05,0.28049 -20000,0.36426,0.0035762,0.05,0.24395 -20000,0.36426,0.0035762,0.05,0.24395 -20000,0.36426,0.0035762,0.05,0.24395 -20000,0.36426,0.0035762,0.05,0.24395 -20000,0.36426,0.0035762,0.05,0.24395 -20000,0.36426,0.0035762,0.05,0.24395 -20000,0.36426,0.0035762,0.05,0.24395 -20000,0.37147,0.003647,0.05,0.21134 -20000,0.37147,0.003647,0.05,0.21134 -20000,0.37147,0.003647,0.05,0.21134 -20000,0.37147,0.003647,0.05,0.21134 -20000,0.37147,0.003647,0.05,0.21134 -20000,0.37147,0.003647,0.05,0.21134 -20000,0.37147,0.003647,0.05,0.21134 -20000,0.37147,0.003647,0.05,0.21134 -20000,0.37882,0.0037192,0.05,0.18234 -20000,0.37882,0.0037192,0.05,0.18234 -20000,0.37882,0.0037192,0.05,0.18234 -20000,0.37882,0.0037192,0.05,0.18234 -20000,0.37882,0.0037192,0.05,0.18234 -20000,0.37882,0.0037192,0.05,0.18234 -20000,0.37882,0.0037192,0.05,0.18234 -20000,0.38632,0.0037928,0.05,0.15663 -20000,0.38632,0.0037928,0.05,0.15663 -20000,0.38632,0.0037928,0.05,0.15663 -20000,0.38632,0.0037928,0.05,0.15663 -20000,0.38632,0.0037928,0.05,0.15663 -20000,0.38632,0.0037928,0.05,0.15663 -20000,0.38632,0.0037928,0.05,0.15663 -20000,0.38632,0.0037928,0.05,0.15663 -20000,0.39396,0.0038678,0.05,0.13395 -20000,0.39396,0.0038678,0.05,0.13395 -20000,0.39396,0.0038678,0.05,0.13395 -20000,0.39396,0.0038678,0.05,0.13395 -20000,0.39396,0.0038678,0.05,0.13395 -20000,0.39396,0.0038678,0.05,0.13395 -20000,0.39396,0.0038678,0.05,0.13395 -20000,0.40176,0.0039444,0.05,0.11401 -20000,0.40176,0.0039444,0.05,0.11401 -20000,0.40176,0.0039444,0.05,0.11401 -20000,0.40176,0.0039444,0.05,0.11401 -20000,0.40176,0.0039444,0.05,0.11401 -20000,0.40176,0.0039444,0.05,0.11401 -20000,0.40176,0.0039444,0.05,0.11401 -20000,0.40176,0.0039444,0.05,0.11401 -20000,0.40971,0.0040224,0.05,0.096567 -20000,0.40971,0.0040224,0.05,0.096567 -20000,0.40971,0.0040224,0.05,0.096567 -20000,0.40971,0.0040224,0.05,0.096567 -20000,0.40971,0.0040224,0.05,0.096567 -20000,0.40971,0.0040224,0.05,0.096567 -20000,0.40971,0.0040224,0.05,0.096567 -20000,0.40971,0.0040224,0.05,0.096567 -20000,0.41782,0.004102,0.05,0.081376 -20000,0.41782,0.004102,0.05,0.081376 -20000,0.41782,0.004102,0.05,0.081376 -20000,0.41782,0.004102,0.05,0.081376 -20000,0.41782,0.004102,0.05,0.081376 -20000,0.41782,0.004102,0.05,0.081376 -20000,0.41782,0.004102,0.05,0.081376 -20000,0.41782,0.004102,0.05,0.081376 -20000,0.42609,0.0041832,0.05,0.068212 -20000,0.42609,0.0041832,0.05,0.068212 -20000,0.42609,0.0041832,0.05,0.068212 -20000,0.42609,0.0041832,0.05,0.068212 -20000,0.42609,0.0041832,0.05,0.068212 -20000,0.42609,0.0041832,0.05,0.068212 -20000,0.42609,0.0041832,0.05,0.068212 -20000,0.42609,0.0041832,0.05,0.068212 -20000,0.42609,0.0041832,0.05,0.068212 -20000,0.43452,0.004266,0.05,0.056864 -20000,0.43452,0.004266,0.05,0.056864 -20000,0.43452,0.004266,0.05,0.056864 -20000,0.43452,0.004266,0.05,0.056864 -20000,0.43452,0.004266,0.05,0.056864 -20000,0.43452,0.004266,0.05,0.056864 -20000,0.43452,0.004266,0.05,0.056864 -20000,0.43452,0.004266,0.05,0.056864 -20000,0.44312,0.0043505,0.05,0.047133 -20000,0.44312,0.0043505,0.05,0.047133 -20000,0.44312,0.0043505,0.05,0.047133 -20000,0.44312,0.0043505,0.05,0.047133 -20000,0.44312,0.0043505,0.05,0.047133 -20000,0.44312,0.0043505,0.05,0.047133 -20000,0.44312,0.0043505,0.05,0.047133 -20000,0.44312,0.0043505,0.05,0.047133 -20000,0.44312,0.0043505,0.05,0.047133 -20000,0.45189,0.0044366,0.05,0.038837 -20000,0.45189,0.0044366,0.05,0.038837 -20000,0.45189,0.0044366,0.05,0.038837 -20000,0.45189,0.0044366,0.05,0.038837 -20000,0.45189,0.0044366,0.05,0.038837 -20000,0.45189,0.0044366,0.05,0.038837 -20000,0.45189,0.0044366,0.05,0.038837 -20000,0.45189,0.0044366,0.05,0.038837 -20000,0.45189,0.0044366,0.05,0.038837 -20000,0.46084,0.0045244,0.05,0.031805 -20000,0.46084,0.0045244,0.05,0.031805 -20000,0.46084,0.0045244,0.05,0.031805 -20000,0.46084,0.0045244,0.05,0.031805 -20000,0.46084,0.0045244,0.05,0.031805 -20000,0.46084,0.0045244,0.05,0.031805 -20000,0.46084,0.0045244,0.05,0.031805 -20000,0.46084,0.0045244,0.05,0.031805 -20000,0.46084,0.0045244,0.05,0.031805 -20000,0.46996,0.004614,0.05,0.025882 -20000,0.46996,0.004614,0.05,0.025882 -20000,0.46996,0.004614,0.05,0.025882 -20000,0.46996,0.004614,0.05,0.025882 -20000,0.46996,0.004614,0.05,0.025882 -20000,0.46996,0.004614,0.05,0.025882 -20000,0.46996,0.004614,0.05,0.025882 -20000,0.46996,0.004614,0.05,0.025882 -20000,0.46996,0.004614,0.05,0.025882 -20000,0.47926,0.0047053,0.05,0.020924 -20000,0.47926,0.0047053,0.05,0.020924 -20000,0.47926,0.0047053,0.05,0.020924 -20000,0.47926,0.0047053,0.05,0.020924 -20000,0.47926,0.0047053,0.05,0.020924 -20000,0.47926,0.0047053,0.05,0.020924 -20000,0.47926,0.0047053,0.05,0.020924 -20000,0.47926,0.0047053,0.05,0.020924 -20000,0.47926,0.0047053,0.05,0.020924 -20000,0.47926,0.0047053,0.05,0.020924 -20000,0.48875,0.0047985,0.05,0.016801 -20000,0.48875,0.0047985,0.05,0.016801 -20000,0.48875,0.0047985,0.05,0.016801 -20000,0.48875,0.0047985,0.05,0.016801 -20000,0.48875,0.0047985,0.05,0.016801 -20000,0.48875,0.0047985,0.05,0.016801 -20000,0.48875,0.0047985,0.05,0.016801 -20000,0.48875,0.0047985,0.05,0.016801 -20000,0.48875,0.0047985,0.05,0.016801 -20000,0.49843,0.0048935,0.05,0.013396 -20000,0.49843,0.0048935,0.05,0.013396 -20000,0.49843,0.0048935,0.05,0.013396 -20000,0.49843,0.0048935,0.05,0.013396 -20000,0.49843,0.0048935,0.05,0.013396 -20000,0.49843,0.0048935,0.05,0.013396 -20000,0.49843,0.0048935,0.05,0.013396 -20000,0.49843,0.0048935,0.05,0.013396 -20000,0.49843,0.0048935,0.05,0.013396 -20000,0.49843,0.0048935,0.05,0.013396 -20000,0.5083,0.0049903,0.05,0.010605 -20000,0.5083,0.0049903,0.05,0.010605 -20000,0.5083,0.0049903,0.05,0.010605 -20000,0.5083,0.0049903,0.05,0.010605 -20000,0.5083,0.0049903,0.05,0.010605 -20000,0.5083,0.0049903,0.05,0.010605 -20000,0.5083,0.0049903,0.05,0.010605 -20000,0.5083,0.0049903,0.05,0.010605 -20000,0.5083,0.0049903,0.05,0.010605 -20000,0.5083,0.0049903,0.05,0.010605 -20000,0.51836,0.0050891,0.05,0.0083322 -20000,0.51836,0.0050891,0.05,0.0083322 -20000,0.51836,0.0050891,0.05,0.0083322 -20000,0.51836,0.0050891,0.05,0.0083322 -20000,0.51836,0.0050891,0.05,0.0083322 -20000,0.51836,0.0050891,0.05,0.0083322 -20000,0.51836,0.0050891,0.05,0.0083322 -20000,0.51836,0.0050891,0.05,0.0083322 -20000,0.51836,0.0050891,0.05,0.0083322 -20000,0.51836,0.0050891,0.05,0.0083322 -20000,0.52862,0.0051899,0.05,0.0064967 -20000,0.52862,0.0051899,0.05,0.0064967 -20000,0.52862,0.0051899,0.05,0.0064967 -20000,0.52862,0.0051899,0.05,0.0064967 -20000,0.52862,0.0051899,0.05,0.0064967 -20000,0.52862,0.0051899,0.05,0.0064967 -20000,0.52862,0.0051899,0.05,0.0064967 -20000,0.52862,0.0051899,0.05,0.0064967 -20000,0.52862,0.0051899,0.05,0.0064967 -20000,0.52862,0.0051899,0.05,0.0064967 -20000,0.53909,0.0052927,0.05,0.0050256 -20000,0.53909,0.0052927,0.05,0.0050256 -20000,0.53909,0.0052927,0.05,0.0050256 -20000,0.53909,0.0052927,0.05,0.0050256 -20000,0.53909,0.0052927,0.05,0.0050256 -20000,0.53909,0.0052927,0.05,0.0050256 -20000,0.53909,0.0052927,0.05,0.0050256 -20000,0.53909,0.0052927,0.05,0.0050256 -20000,0.53909,0.0052927,0.05,0.0050256 -20000,0.53909,0.0052927,0.05,0.0050256 -20000,0.53909,0.0052927,0.05,0.0050256 -20000,0.54976,0.0053975,0.05,0.0038561 -20000,0.54976,0.0053975,0.05,0.0038561 -20000,0.54976,0.0053975,0.05,0.0038561 -20000,0.54976,0.0053975,0.05,0.0038561 -20000,0.54976,0.0053975,0.05,0.0038561 -20000,0.54976,0.0053975,0.05,0.0038561 -20000,0.54976,0.0053975,0.05,0.0038561 -20000,0.54976,0.0053975,0.05,0.0038561 -20000,0.54976,0.0053975,0.05,0.0038561 -20000,0.54976,0.0053975,0.05,0.0038561 -20000,0.54976,0.0053975,0.05,0.0038561 -20000,0.56065,0.0055043,0.05,0.002934 -20000,0.56065,0.0055043,0.05,0.002934 -20000,0.56065,0.0055043,0.05,0.002934 -20000,0.56065,0.0055043,0.05,0.002934 -20000,0.56065,0.0055043,0.05,0.002934 -20000,0.56065,0.0055043,0.05,0.002934 -20000,0.56065,0.0055043,0.05,0.002934 -20000,0.56065,0.0055043,0.05,0.002934 -20000,0.56065,0.0055043,0.05,0.002934 -20000,0.56065,0.0055043,0.05,0.002934 -20000,0.56065,0.0055043,0.05,0.002934 -20000,0.57175,0.0056133,0.05,0.0022133 -20000,0.57175,0.0056133,0.05,0.0022133 -20000,0.57175,0.0056133,0.05,0.0022133 -20000,0.57175,0.0056133,0.05,0.0022133 -20000,0.57175,0.0056133,0.05,0.0022133 -20000,0.57175,0.0056133,0.05,0.0022133 -20000,0.57175,0.0056133,0.05,0.0022133 -20000,0.57175,0.0056133,0.05,0.0022133 -20000,0.57175,0.0056133,0.05,0.0022133 -20000,0.57175,0.0056133,0.05,0.0022133 -20000,0.57175,0.0056133,0.05,0.0022133 -20000,0.58307,0.0057245,0.05,0.0016549 -20000,0.58307,0.0057245,0.05,0.0016549 -20000,0.58307,0.0057245,0.05,0.0016549 -20000,0.58307,0.0057245,0.05,0.0016549 -20000,0.58307,0.0057245,0.05,0.0016549 -20000,0.58307,0.0057245,0.05,0.0016549 -20000,0.58307,0.0057245,0.05,0.0016549 -20000,0.58307,0.0057245,0.05,0.0016549 -20000,0.58307,0.0057245,0.05,0.0016549 -20000,0.58307,0.0057245,0.05,0.0016549 -20000,0.58307,0.0057245,0.05,0.0016549 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.59462,0.0058378,0.05,0.0012262 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.60639,0.0059535,0.05,0.00090008 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.6184,0.0060714,0.05,0.0006544 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.63065,0.0061916,0.05,0.00047112 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.64314,0.0063142,0.05,0.00033577 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.65588,0.0064393,0.05,0.00023684 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.66887,0.0065668,0.05,0.00016529 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.68211,0.0066969,0.05,0.00011412 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.69562,0.0068295,0.05,7.791e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.7094,0.0069648,0.05,5.2588e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.72345,0.0071027,0.05,3.5084e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.73778,0.0072434,0.05,2.3128e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7524,0.0073869,0.05,1.5061e-05 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7673,0.0075332,0.05,9.686e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.7825,0.0076824,0.05,6.1499e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.798,0.0078346,0.05,3.8539e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.81381,0.0079898,0.05,2.383e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.82993,0.0081481,0.05,1.4534e-06 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.84637,0.0083095,0.05,8.7409e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.86314,0.0084741,0.05,5.1819e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.88024,0.008642,0.05,3.0268e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.89767,0.0088132,0.05,1.7406e-07 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.91546,0.0089878,0.05,9.8385e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.93359,0.0091658,0.05,5.4389e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.95209,0.0093474,0.05,2.8923e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.97095,0.0095326,0.05,1.3863e-08 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 -20000,0.99019,0.0097215,0.05,4.0575e-09 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_5.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_5.csv deleted file mode 100644 index 29117bbb056..00000000000 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/data_5.csv +++ /dev/null @@ -1,1002 +0,0 @@ -Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,nan,nan,nan,nan -50000,0.10099,0.0009915,0.05,97.986 -50000,0.10099,0.0009915,0.05,97.986 -50000,0.10099,0.0009915,0.05,97.986 -50000,0.10299,0.0010111,0.05,94.045 -50000,0.10299,0.0010111,0.05,94.045 -50000,0.10499,0.0010308,0.05,90.2 -50000,0.10499,0.0010308,0.05,90.2 -50000,0.10734,0.0010538,0.05,85.805 -50000,0.10734,0.0010538,0.05,85.805 -50000,0.11004,0.0010803,0.05,80.963 -50000,0.11004,0.0010803,0.05,80.963 -50000,0.11004,0.0010803,0.05,80.963 -50000,0.11274,0.0011068,0.05,76.339 -50000,0.11274,0.0011068,0.05,76.339 -50000,0.11274,0.0011068,0.05,76.339 -50000,0.11544,0.0011334,0.05,71.941 -50000,0.11544,0.0011334,0.05,71.941 -50000,0.11814,0.0011599,0.05,67.771 -50000,0.11814,0.0011599,0.05,67.771 -50000,0.11814,0.0011599,0.05,67.771 -50000,0.12084,0.0011864,0.05,63.829 -50000,0.12084,0.0011864,0.05,63.829 -50000,0.12084,0.0011864,0.05,63.829 -50000,0.12354,0.0012129,0.05,60.112 -50000,0.12354,0.0012129,0.05,60.112 -50000,0.12624,0.0012394,0.05,56.614 -50000,0.12624,0.0012394,0.05,56.614 -50000,0.12624,0.0012394,0.05,56.614 -50000,0.12894,0.0012659,0.05,53.328 -50000,0.12894,0.0012659,0.05,53.328 -50000,0.12894,0.0012659,0.05,53.328 -50000,0.13164,0.0012924,0.05,50.245 -50000,0.13164,0.0012924,0.05,50.245 -50000,0.13164,0.0012924,0.05,50.245 -50000,0.1343,0.0013185,0.05,47.397 -50000,0.1343,0.0013185,0.05,47.397 -50000,0.13695,0.0013445,0.05,44.739 -50000,0.13695,0.0013445,0.05,44.739 -50000,0.13695,0.0013445,0.05,44.739 -50000,0.13965,0.001371,0.05,42.199 -50000,0.13965,0.001371,0.05,42.199 -50000,0.13965,0.001371,0.05,42.199 -50000,0.1424,0.0013981,0.05,39.778 -50000,0.1424,0.0013981,0.05,39.778 -50000,0.14521,0.0014256,0.05,37.474 -50000,0.14521,0.0014256,0.05,37.474 -50000,0.14521,0.0014256,0.05,37.474 -50000,0.14807,0.0014538,0.05,35.284 -50000,0.14807,0.0014538,0.05,35.284 -50000,0.14807,0.0014538,0.05,35.284 -50000,0.151,0.0014824,0.05,33.205 -50000,0.151,0.0014824,0.05,33.205 -50000,0.151,0.0014824,0.05,33.205 -50000,0.15397,0.0015117,0.05,31.233 -50000,0.15397,0.0015117,0.05,31.233 -50000,0.15397,0.0015117,0.05,31.233 -50000,0.15701,0.0015415,0.05,29.366 -50000,0.15701,0.0015415,0.05,29.366 -50000,0.15701,0.0015415,0.05,29.366 -50000,0.16011,0.0015719,0.05,27.6 -50000,0.16011,0.0015719,0.05,27.6 -50000,0.16011,0.0015719,0.05,27.6 -50000,0.16327,0.001603,0.05,25.93 -50000,0.16327,0.001603,0.05,25.93 -50000,0.16327,0.001603,0.05,25.93 -50000,0.16649,0.0016346,0.05,24.352 -50000,0.16649,0.0016346,0.05,24.352 -50000,0.16649,0.0016346,0.05,24.352 -50000,0.16649,0.0016346,0.05,24.352 -50000,0.16978,0.0016669,0.05,22.863 -50000,0.16978,0.0016669,0.05,22.863 -50000,0.16978,0.0016669,0.05,22.863 -50000,0.17313,0.0016998,0.05,21.459 -50000,0.17313,0.0016998,0.05,21.459 -50000,0.17313,0.0016998,0.05,21.459 -50000,0.17655,0.0017333,0.05,20.135 -50000,0.17655,0.0017333,0.05,20.135 -50000,0.17655,0.0017333,0.05,20.135 -50000,0.17655,0.0017333,0.05,20.135 -50000,0.18004,0.0017676,0.05,18.887 -50000,0.18004,0.0017676,0.05,18.887 -50000,0.18004,0.0017676,0.05,18.887 -50000,0.18359,0.0018025,0.05,17.712 -50000,0.18359,0.0018025,0.05,17.712 -50000,0.18359,0.0018025,0.05,17.712 -50000,0.18359,0.0018025,0.05,17.712 -50000,0.18722,0.001838,0.05,16.605 -50000,0.18722,0.001838,0.05,16.605 -50000,0.18722,0.001838,0.05,16.605 -50000,0.18722,0.001838,0.05,16.605 -50000,0.19091,0.0018743,0.05,15.564 -50000,0.19091,0.0018743,0.05,15.564 -50000,0.19091,0.0018743,0.05,15.564 -50000,0.19468,0.0019114,0.05,14.584 -50000,0.19468,0.0019114,0.05,14.584 -50000,0.19468,0.0019114,0.05,14.584 -50000,0.19468,0.0019114,0.05,14.584 -50000,0.19853,0.0019491,0.05,13.662 -50000,0.19853,0.0019491,0.05,13.662 -50000,0.19853,0.0019491,0.05,13.662 -50000,0.19853,0.0019491,0.05,13.662 -50000,0.20245,0.0019876,0.05,12.795 -50000,0.20245,0.0019876,0.05,12.795 -50000,0.20245,0.0019876,0.05,12.795 -50000,0.20245,0.0019876,0.05,12.795 -50000,0.20645,0.0020269,0.05,11.979 -50000,0.20645,0.0020269,0.05,11.979 -50000,0.20645,0.0020269,0.05,11.979 -50000,0.20645,0.0020269,0.05,11.979 -50000,0.21053,0.0020669,0.05,11.212 -50000,0.21053,0.0020669,0.05,11.212 -50000,0.21053,0.0020669,0.05,11.212 -50000,0.21053,0.0020669,0.05,11.212 -50000,0.21469,0.0021078,0.05,10.492 -50000,0.21469,0.0021078,0.05,10.492 -50000,0.21469,0.0021078,0.05,10.492 -50000,0.21469,0.0021078,0.05,10.492 -50000,0.21893,0.0021494,0.05,9.8141 -50000,0.21893,0.0021494,0.05,9.8141 -50000,0.21893,0.0021494,0.05,9.8141 -50000,0.21893,0.0021494,0.05,9.8141 -50000,0.21893,0.0021494,0.05,9.8141 -50000,0.22326,0.0021919,0.05,9.1773 -50000,0.22326,0.0021919,0.05,9.1773 -50000,0.22326,0.0021919,0.05,9.1773 -50000,0.22326,0.0021919,0.05,9.1773 -50000,0.22767,0.0022352,0.05,8.5788 -50000,0.22767,0.0022352,0.05,8.5788 -50000,0.22767,0.0022352,0.05,8.5788 -50000,0.22767,0.0022352,0.05,8.5788 -50000,0.23217,0.0022794,0.05,8.0163 -50000,0.23217,0.0022794,0.05,8.0163 -50000,0.23217,0.0022794,0.05,8.0163 -50000,0.23217,0.0022794,0.05,8.0163 -50000,0.23217,0.0022794,0.05,8.0163 -50000,0.23676,0.0023244,0.05,7.4878 -50000,0.23676,0.0023244,0.05,7.4878 -50000,0.23676,0.0023244,0.05,7.4878 -50000,0.23676,0.0023244,0.05,7.4878 -50000,0.23676,0.0023244,0.05,7.4878 -50000,0.24144,0.0023704,0.05,6.9912 -50000,0.24144,0.0023704,0.05,6.9912 -50000,0.24144,0.0023704,0.05,6.9912 -50000,0.24144,0.0023704,0.05,6.9912 -50000,0.24621,0.0024172,0.05,6.5246 -50000,0.24621,0.0024172,0.05,6.5246 -50000,0.24621,0.0024172,0.05,6.5246 -50000,0.24621,0.0024172,0.05,6.5246 -50000,0.24621,0.0024172,0.05,6.5246 -50000,0.25108,0.002465,0.05,6.0863 -50000,0.25108,0.002465,0.05,6.0863 -50000,0.25108,0.002465,0.05,6.0863 -50000,0.25108,0.002465,0.05,6.0863 -50000,0.25108,0.002465,0.05,6.0863 -50000,0.25604,0.0025137,0.05,5.6745 -50000,0.25604,0.0025137,0.05,5.6745 -50000,0.25604,0.0025137,0.05,5.6745 -50000,0.25604,0.0025137,0.05,5.6745 -50000,0.25604,0.0025137,0.05,5.6745 -50000,0.2611,0.0025634,0.05,5.2877 -50000,0.2611,0.0025634,0.05,5.2877 -50000,0.2611,0.0025634,0.05,5.2877 -50000,0.2611,0.0025634,0.05,5.2877 -50000,0.2611,0.0025634,0.05,5.2877 -50000,0.26626,0.0026141,0.05,4.9244 -50000,0.26626,0.0026141,0.05,4.9244 -50000,0.26626,0.0026141,0.05,4.9244 -50000,0.26626,0.0026141,0.05,4.9244 -50000,0.26626,0.0026141,0.05,4.9244 -50000,0.27153,0.0026658,0.05,4.5833 -50000,0.27153,0.0026658,0.05,4.5833 -50000,0.27153,0.0026658,0.05,4.5833 -50000,0.27153,0.0026658,0.05,4.5833 -50000,0.27153,0.0026658,0.05,4.5833 -50000,0.27153,0.0026658,0.05,4.5833 -50000,0.2769,0.0027185,0.05,4.263 -50000,0.2769,0.0027185,0.05,4.263 -50000,0.2769,0.0027185,0.05,4.263 -50000,0.2769,0.0027185,0.05,4.263 -50000,0.2769,0.0027185,0.05,4.263 -50000,0.28237,0.0027723,0.05,3.9624 -50000,0.28237,0.0027723,0.05,3.9624 -50000,0.28237,0.0027723,0.05,3.9624 -50000,0.28237,0.0027723,0.05,3.9624 -50000,0.28237,0.0027723,0.05,3.9624 -50000,0.28237,0.0027723,0.05,3.9624 -50000,0.28796,0.0028271,0.05,3.6802 -50000,0.28796,0.0028271,0.05,3.6802 -50000,0.28796,0.0028271,0.05,3.6802 -50000,0.28796,0.0028271,0.05,3.6802 -50000,0.28796,0.0028271,0.05,3.6802 -50000,0.29365,0.002883,0.05,3.4154 -50000,0.29365,0.002883,0.05,3.4154 -50000,0.29365,0.002883,0.05,3.4154 -50000,0.29365,0.002883,0.05,3.4154 -50000,0.29365,0.002883,0.05,3.4154 -50000,0.29365,0.002883,0.05,3.4154 -50000,0.29946,0.00294,0.05,3.167 -50000,0.29946,0.00294,0.05,3.167 -50000,0.29946,0.00294,0.05,3.167 -50000,0.29946,0.00294,0.05,3.167 -50000,0.29946,0.00294,0.05,3.167 -50000,0.29946,0.00294,0.05,3.167 -50000,0.30538,0.0029982,0.05,2.934 -50000,0.30538,0.0029982,0.05,2.934 -50000,0.30538,0.0029982,0.05,2.934 -50000,0.30538,0.0029982,0.05,2.934 -50000,0.30538,0.0029982,0.05,2.934 -50000,0.30538,0.0029982,0.05,2.934 -50000,0.31142,0.0030575,0.05,2.7156 -50000,0.31142,0.0030575,0.05,2.7156 -50000,0.31142,0.0030575,0.05,2.7156 -50000,0.31142,0.0030575,0.05,2.7156 -50000,0.31142,0.0030575,0.05,2.7156 -50000,0.31142,0.0030575,0.05,2.7156 -50000,0.31758,0.003118,0.05,2.511 -50000,0.31758,0.003118,0.05,2.511 -50000,0.31758,0.003118,0.05,2.511 -50000,0.31758,0.003118,0.05,2.511 -50000,0.31758,0.003118,0.05,2.511 -50000,0.31758,0.003118,0.05,2.511 -50000,0.32386,0.0031796,0.05,2.3193 -50000,0.32386,0.0031796,0.05,2.3193 -50000,0.32386,0.0031796,0.05,2.3193 -50000,0.32386,0.0031796,0.05,2.3193 -50000,0.32386,0.0031796,0.05,2.3193 -50000,0.32386,0.0031796,0.05,2.3193 -50000,0.32386,0.0031796,0.05,2.3193 -50000,0.33027,0.0032425,0.05,2.1398 -50000,0.33027,0.0032425,0.05,2.1398 -50000,0.33027,0.0032425,0.05,2.1398 -50000,0.33027,0.0032425,0.05,2.1398 -50000,0.33027,0.0032425,0.05,2.1398 -50000,0.33027,0.0032425,0.05,2.1398 -50000,0.3368,0.0033067,0.05,1.9718 -50000,0.3368,0.0033067,0.05,1.9718 -50000,0.3368,0.0033067,0.05,1.9718 -50000,0.3368,0.0033067,0.05,1.9718 -50000,0.3368,0.0033067,0.05,1.9718 -50000,0.3368,0.0033067,0.05,1.9718 -50000,0.3368,0.0033067,0.05,1.9718 -50000,0.34347,0.0033721,0.05,1.8147 -50000,0.34347,0.0033721,0.05,1.8147 -50000,0.34347,0.0033721,0.05,1.8147 -50000,0.34347,0.0033721,0.05,1.8147 -50000,0.34347,0.0033721,0.05,1.8147 -50000,0.34347,0.0033721,0.05,1.8147 -50000,0.35026,0.0034388,0.05,1.6679 -50000,0.35026,0.0034388,0.05,1.6679 -50000,0.35026,0.0034388,0.05,1.6679 -50000,0.35026,0.0034388,0.05,1.6679 -50000,0.35026,0.0034388,0.05,1.6679 -50000,0.35026,0.0034388,0.05,1.6679 -50000,0.35026,0.0034388,0.05,1.6679 -50000,0.35719,0.0035069,0.05,1.5308 -50000,0.35719,0.0035069,0.05,1.5308 -50000,0.35719,0.0035069,0.05,1.5308 -50000,0.35719,0.0035069,0.05,1.5308 -50000,0.35719,0.0035069,0.05,1.5308 -50000,0.35719,0.0035069,0.05,1.5308 -50000,0.35719,0.0035069,0.05,1.5308 -50000,0.36426,0.0035762,0.05,1.4029 -50000,0.36426,0.0035762,0.05,1.4029 -50000,0.36426,0.0035762,0.05,1.4029 -50000,0.36426,0.0035762,0.05,1.4029 -50000,0.36426,0.0035762,0.05,1.4029 -50000,0.36426,0.0035762,0.05,1.4029 -50000,0.36426,0.0035762,0.05,1.4029 -50000,0.37147,0.003647,0.05,1.2836 -50000,0.37147,0.003647,0.05,1.2836 -50000,0.37147,0.003647,0.05,1.2836 -50000,0.37147,0.003647,0.05,1.2836 -50000,0.37147,0.003647,0.05,1.2836 -50000,0.37147,0.003647,0.05,1.2836 -50000,0.37147,0.003647,0.05,1.2836 -50000,0.37147,0.003647,0.05,1.2836 -50000,0.37882,0.0037192,0.05,1.1725 -50000,0.37882,0.0037192,0.05,1.1725 -50000,0.37882,0.0037192,0.05,1.1725 -50000,0.37882,0.0037192,0.05,1.1725 -50000,0.37882,0.0037192,0.05,1.1725 -50000,0.37882,0.0037192,0.05,1.1725 -50000,0.37882,0.0037192,0.05,1.1725 -50000,0.38632,0.0037928,0.05,1.0691 -50000,0.38632,0.0037928,0.05,1.0691 -50000,0.38632,0.0037928,0.05,1.0691 -50000,0.38632,0.0037928,0.05,1.0691 -50000,0.38632,0.0037928,0.05,1.0691 -50000,0.38632,0.0037928,0.05,1.0691 -50000,0.38632,0.0037928,0.05,1.0691 -50000,0.38632,0.0037928,0.05,1.0691 -50000,0.39396,0.0038678,0.05,0.97306 -50000,0.39396,0.0038678,0.05,0.97306 -50000,0.39396,0.0038678,0.05,0.97306 -50000,0.39396,0.0038678,0.05,0.97306 -50000,0.39396,0.0038678,0.05,0.97306 -50000,0.39396,0.0038678,0.05,0.97306 -50000,0.39396,0.0038678,0.05,0.97306 -50000,0.40176,0.0039444,0.05,0.88389 -50000,0.40176,0.0039444,0.05,0.88389 -50000,0.40176,0.0039444,0.05,0.88389 -50000,0.40176,0.0039444,0.05,0.88389 -50000,0.40176,0.0039444,0.05,0.88389 -50000,0.40176,0.0039444,0.05,0.88389 -50000,0.40176,0.0039444,0.05,0.88389 -50000,0.40176,0.0039444,0.05,0.88389 -50000,0.40971,0.0040224,0.05,0.80124 -50000,0.40971,0.0040224,0.05,0.80124 -50000,0.40971,0.0040224,0.05,0.80124 -50000,0.40971,0.0040224,0.05,0.80124 -50000,0.40971,0.0040224,0.05,0.80124 -50000,0.40971,0.0040224,0.05,0.80124 -50000,0.40971,0.0040224,0.05,0.80124 -50000,0.40971,0.0040224,0.05,0.80124 -50000,0.41782,0.004102,0.05,0.72474 -50000,0.41782,0.004102,0.05,0.72474 -50000,0.41782,0.004102,0.05,0.72474 -50000,0.41782,0.004102,0.05,0.72474 -50000,0.41782,0.004102,0.05,0.72474 -50000,0.41782,0.004102,0.05,0.72474 -50000,0.41782,0.004102,0.05,0.72474 -50000,0.41782,0.004102,0.05,0.72474 -50000,0.42609,0.0041832,0.05,0.65404 -50000,0.42609,0.0041832,0.05,0.65404 -50000,0.42609,0.0041832,0.05,0.65404 -50000,0.42609,0.0041832,0.05,0.65404 -50000,0.42609,0.0041832,0.05,0.65404 -50000,0.42609,0.0041832,0.05,0.65404 -50000,0.42609,0.0041832,0.05,0.65404 -50000,0.42609,0.0041832,0.05,0.65404 -50000,0.42609,0.0041832,0.05,0.65404 -50000,0.43452,0.004266,0.05,0.58881 -50000,0.43452,0.004266,0.05,0.58881 -50000,0.43452,0.004266,0.05,0.58881 -50000,0.43452,0.004266,0.05,0.58881 -50000,0.43452,0.004266,0.05,0.58881 -50000,0.43452,0.004266,0.05,0.58881 -50000,0.43452,0.004266,0.05,0.58881 -50000,0.43452,0.004266,0.05,0.58881 -50000,0.44312,0.0043505,0.05,0.52875 -50000,0.44312,0.0043505,0.05,0.52875 -50000,0.44312,0.0043505,0.05,0.52875 -50000,0.44312,0.0043505,0.05,0.52875 -50000,0.44312,0.0043505,0.05,0.52875 -50000,0.44312,0.0043505,0.05,0.52875 -50000,0.44312,0.0043505,0.05,0.52875 -50000,0.44312,0.0043505,0.05,0.52875 -50000,0.44312,0.0043505,0.05,0.52875 -50000,0.45189,0.0044366,0.05,0.47356 -50000,0.45189,0.0044366,0.05,0.47356 -50000,0.45189,0.0044366,0.05,0.47356 -50000,0.45189,0.0044366,0.05,0.47356 -50000,0.45189,0.0044366,0.05,0.47356 -50000,0.45189,0.0044366,0.05,0.47356 -50000,0.45189,0.0044366,0.05,0.47356 -50000,0.45189,0.0044366,0.05,0.47356 -50000,0.45189,0.0044366,0.05,0.47356 -50000,0.46084,0.0045244,0.05,0.42294 -50000,0.46084,0.0045244,0.05,0.42294 -50000,0.46084,0.0045244,0.05,0.42294 -50000,0.46084,0.0045244,0.05,0.42294 -50000,0.46084,0.0045244,0.05,0.42294 -50000,0.46084,0.0045244,0.05,0.42294 -50000,0.46084,0.0045244,0.05,0.42294 -50000,0.46084,0.0045244,0.05,0.42294 -50000,0.46084,0.0045244,0.05,0.42294 -50000,0.46996,0.004614,0.05,0.37662 -50000,0.46996,0.004614,0.05,0.37662 -50000,0.46996,0.004614,0.05,0.37662 -50000,0.46996,0.004614,0.05,0.37662 -50000,0.46996,0.004614,0.05,0.37662 -50000,0.46996,0.004614,0.05,0.37662 -50000,0.46996,0.004614,0.05,0.37662 -50000,0.46996,0.004614,0.05,0.37662 -50000,0.46996,0.004614,0.05,0.37662 -50000,0.47926,0.0047053,0.05,0.33434 -50000,0.47926,0.0047053,0.05,0.33434 -50000,0.47926,0.0047053,0.05,0.33434 -50000,0.47926,0.0047053,0.05,0.33434 -50000,0.47926,0.0047053,0.05,0.33434 -50000,0.47926,0.0047053,0.05,0.33434 -50000,0.47926,0.0047053,0.05,0.33434 -50000,0.47926,0.0047053,0.05,0.33434 -50000,0.47926,0.0047053,0.05,0.33434 -50000,0.47926,0.0047053,0.05,0.33434 -50000,0.48875,0.0047985,0.05,0.29585 -50000,0.48875,0.0047985,0.05,0.29585 -50000,0.48875,0.0047985,0.05,0.29585 -50000,0.48875,0.0047985,0.05,0.29585 -50000,0.48875,0.0047985,0.05,0.29585 -50000,0.48875,0.0047985,0.05,0.29585 -50000,0.48875,0.0047985,0.05,0.29585 -50000,0.48875,0.0047985,0.05,0.29585 -50000,0.48875,0.0047985,0.05,0.29585 -50000,0.49843,0.0048935,0.05,0.2609 -50000,0.49843,0.0048935,0.05,0.2609 -50000,0.49843,0.0048935,0.05,0.2609 -50000,0.49843,0.0048935,0.05,0.2609 -50000,0.49843,0.0048935,0.05,0.2609 -50000,0.49843,0.0048935,0.05,0.2609 -50000,0.49843,0.0048935,0.05,0.2609 -50000,0.49843,0.0048935,0.05,0.2609 -50000,0.49843,0.0048935,0.05,0.2609 -50000,0.49843,0.0048935,0.05,0.2609 -50000,0.5083,0.0049903,0.05,0.22927 -50000,0.5083,0.0049903,0.05,0.22927 -50000,0.5083,0.0049903,0.05,0.22927 -50000,0.5083,0.0049903,0.05,0.22927 -50000,0.5083,0.0049903,0.05,0.22927 -50000,0.5083,0.0049903,0.05,0.22927 -50000,0.5083,0.0049903,0.05,0.22927 -50000,0.5083,0.0049903,0.05,0.22927 -50000,0.5083,0.0049903,0.05,0.22927 -50000,0.5083,0.0049903,0.05,0.22927 -50000,0.51836,0.0050891,0.05,0.20072 -50000,0.51836,0.0050891,0.05,0.20072 -50000,0.51836,0.0050891,0.05,0.20072 -50000,0.51836,0.0050891,0.05,0.20072 -50000,0.51836,0.0050891,0.05,0.20072 -50000,0.51836,0.0050891,0.05,0.20072 -50000,0.51836,0.0050891,0.05,0.20072 -50000,0.51836,0.0050891,0.05,0.20072 -50000,0.51836,0.0050891,0.05,0.20072 -50000,0.51836,0.0050891,0.05,0.20072 -50000,0.52862,0.0051899,0.05,0.17504 -50000,0.52862,0.0051899,0.05,0.17504 -50000,0.52862,0.0051899,0.05,0.17504 -50000,0.52862,0.0051899,0.05,0.17504 -50000,0.52862,0.0051899,0.05,0.17504 -50000,0.52862,0.0051899,0.05,0.17504 -50000,0.52862,0.0051899,0.05,0.17504 -50000,0.52862,0.0051899,0.05,0.17504 -50000,0.52862,0.0051899,0.05,0.17504 -50000,0.52862,0.0051899,0.05,0.17504 -50000,0.53909,0.0052927,0.05,0.15203 -50000,0.53909,0.0052927,0.05,0.15203 -50000,0.53909,0.0052927,0.05,0.15203 -50000,0.53909,0.0052927,0.05,0.15203 -50000,0.53909,0.0052927,0.05,0.15203 -50000,0.53909,0.0052927,0.05,0.15203 -50000,0.53909,0.0052927,0.05,0.15203 -50000,0.53909,0.0052927,0.05,0.15203 -50000,0.53909,0.0052927,0.05,0.15203 -50000,0.53909,0.0052927,0.05,0.15203 -50000,0.53909,0.0052927,0.05,0.15203 -50000,0.54976,0.0053975,0.05,0.13149 -50000,0.54976,0.0053975,0.05,0.13149 -50000,0.54976,0.0053975,0.05,0.13149 -50000,0.54976,0.0053975,0.05,0.13149 -50000,0.54976,0.0053975,0.05,0.13149 -50000,0.54976,0.0053975,0.05,0.13149 -50000,0.54976,0.0053975,0.05,0.13149 -50000,0.54976,0.0053975,0.05,0.13149 -50000,0.54976,0.0053975,0.05,0.13149 -50000,0.54976,0.0053975,0.05,0.13149 -50000,0.54976,0.0053975,0.05,0.13149 -50000,0.56065,0.0055043,0.05,0.11321 -50000,0.56065,0.0055043,0.05,0.11321 -50000,0.56065,0.0055043,0.05,0.11321 -50000,0.56065,0.0055043,0.05,0.11321 -50000,0.56065,0.0055043,0.05,0.11321 -50000,0.56065,0.0055043,0.05,0.11321 -50000,0.56065,0.0055043,0.05,0.11321 -50000,0.56065,0.0055043,0.05,0.11321 -50000,0.56065,0.0055043,0.05,0.11321 -50000,0.56065,0.0055043,0.05,0.11321 -50000,0.56065,0.0055043,0.05,0.11321 -50000,0.57175,0.0056133,0.05,0.097023 -50000,0.57175,0.0056133,0.05,0.097023 -50000,0.57175,0.0056133,0.05,0.097023 -50000,0.57175,0.0056133,0.05,0.097023 -50000,0.57175,0.0056133,0.05,0.097023 -50000,0.57175,0.0056133,0.05,0.097023 -50000,0.57175,0.0056133,0.05,0.097023 -50000,0.57175,0.0056133,0.05,0.097023 -50000,0.57175,0.0056133,0.05,0.097023 -50000,0.57175,0.0056133,0.05,0.097023 -50000,0.57175,0.0056133,0.05,0.097023 -50000,0.58307,0.0057245,0.05,0.082748 -50000,0.58307,0.0057245,0.05,0.082748 -50000,0.58307,0.0057245,0.05,0.082748 -50000,0.58307,0.0057245,0.05,0.082748 -50000,0.58307,0.0057245,0.05,0.082748 -50000,0.58307,0.0057245,0.05,0.082748 -50000,0.58307,0.0057245,0.05,0.082748 -50000,0.58307,0.0057245,0.05,0.082748 -50000,0.58307,0.0057245,0.05,0.082748 -50000,0.58307,0.0057245,0.05,0.082748 -50000,0.58307,0.0057245,0.05,0.082748 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.59462,0.0058378,0.05,0.070218 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.60639,0.0059535,0.05,0.059272 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.6184,0.0060714,0.05,0.049759 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.63065,0.0061916,0.05,0.041535 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.64314,0.0063142,0.05,0.034465 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.65588,0.0064393,0.05,0.028423 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.66887,0.0065668,0.05,0.02329 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.68211,0.0066969,0.05,0.018957 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.69562,0.0068295,0.05,0.015324 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.7094,0.0069648,0.05,0.012299 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.72345,0.0071027,0.05,0.009798 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.73778,0.0072434,0.05,0.0077457 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7524,0.0073869,0.05,0.0060746 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7673,0.0075332,0.05,0.0047249 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.7825,0.0076824,0.05,0.0036436 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.798,0.0078346,0.05,0.002785 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.81381,0.0079898,0.05,0.0021091 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.82993,0.0081481,0.05,0.0015818 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.84637,0.0083095,0.05,0.0011742 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.86314,0.0084741,0.05,0.00086204 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.88024,0.008642,0.05,0.00062499 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.89767,0.0088132,0.05,0.0004463 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.91546,0.0089878,0.05,0.00031223 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.93359,0.0091658,0.05,0.00021151 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.95209,0.0093474,0.05,0.00013486 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.97095,0.0095326,0.05,7.4494e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 -50000,0.99019,0.0097215,0.05,2.3623e-05 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/Example.rst new file mode 100644 index 00000000000..aa8fbb0677e --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/Example.rst @@ -0,0 +1,62 @@ +.. _AdvancedExampleWellboreNonLinearThermalDiffusionTemperatureDependentSinglePhaseThermalConductivity: + + +##################################################################################################################### +Non-Linear Thermal Diffusion Around a Wellbore: The Case with Temperature Dependent Single Phase Thermal Conductivity +##################################################################################################################### + +------------------------------------------------------------------ +Problem description +------------------------------------------------------------------ + +This example is an extension of the linear thermal diffusion problem presented in :ref:`AdvancedExamplePureThermalDiffusionWellbore` to model wellbore cooling upon CO2 injection. It uses the thermal single-phase flow solver to model a non-linear thermal diffusion problem around a wellbore where the single phase thermal conductivity of the porous rock depends linearly on the temperature. + + +**Input file** + +This benchmark example uses no external input file and everything required is +contained within two GEOS xml files that are located at: + +.. code-block:: console + + inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml + +and + +.. code-block:: console + + inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml + + +In this example, we focus on the ``Constitutive`` tag. + +----------------------------------------------------------- +Constitutive +----------------------------------------------------------- + +The reference value of the single phase thermal conductivity of the porous medium around the wellbore and its derivative with respect to temperature are defined in the ``SinglePhaseThermalConductivity`` XML block: + +.. literalinclude:: ../../../../../../../inputFiles/singlePhaseFlow/thermalCompressible_2d_base.xml + :language: xml + :start-after: + :end-before: + + +--------------------------------- +Results and benchmark +--------------------------------- + +A good agreement between the results obtained using GEOS and the reference results that are obtained by the classical finite difference method is shown in the figure below: + + +.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/temperatureDependentSinglePhaseThermalConductivity_plot.py + + +------------------------------------------------------------------ +To go further +------------------------------------------------------------------ + +**Feedback on this example** + +This concludes the example of a non-linear thermal diffusion problem around a wellbore due to temperature dependent single phase thermal conductivity of porous rock. +For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_1.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_1.csv new file mode 100644 index 00000000000..8771183d7fa --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_1.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,0.07071,0.072112,0.05,-19.002 +10000,0.07071,0.072112,0.05,-19.002 +10000,0.07211,0.07354,0.05,-17.045 +10000,0.07351,0.074968,0.05,-15.122 +10000,0.075155,0.076646,0.05,-12.902 +10000,0.075155,0.076646,0.05,-12.902 +10000,0.077046,0.078574,0.05,-10.412 +10000,0.077046,0.078574,0.05,-10.412 +10000,0.078936,0.080501,0.05,-7.9783 +10000,0.078936,0.080501,0.05,-7.9783 +10000,0.080826,0.082429,0.05,-5.5998 +10000,0.080826,0.082429,0.05,-5.5998 +10000,0.082716,0.084357,0.05,-3.2741 +10000,0.082716,0.084357,0.05,-3.2741 +10000,0.084607,0.086285,0.05,-0.99929 +10000,0.084607,0.086285,0.05,-0.99929 +10000,0.086497,0.088212,0.05,1.2264 +10000,0.086497,0.088212,0.05,1.2264 +10000,0.088387,0.09014,0.05,3.4046 +10000,0.088387,0.09014,0.05,3.4046 +10000,0.090278,0.092068,0.05,5.537 +10000,0.090278,0.092068,0.05,5.537 +10000,0.092168,0.093995,0.05,7.6248 +10000,0.092168,0.093995,0.05,7.6248 +10000,0.094031,0.095896,0.05,9.6402 +10000,0.095885,0.097786,0.05,11.606 +10000,0.095885,0.097786,0.05,11.606 +10000,0.097776,0.099715,0.05,13.57 +10000,0.097776,0.099715,0.05,13.57 +10000,0.099704,0.10168,0.05,15.533 +10000,0.099704,0.10168,0.05,15.533 +10000,0.10167,0.10369,0.05,17.494 +10000,0.10167,0.10369,0.05,17.494 +10000,0.10368,0.10573,0.05,19.451 +10000,0.10368,0.10573,0.05,19.451 +10000,0.10572,0.10782,0.05,21.405 +10000,0.10572,0.10782,0.05,21.405 +10000,0.10781,0.10995,0.05,23.355 +10000,0.10781,0.10995,0.05,23.355 +10000,0.10993,0.11211,0.05,25.301 +10000,0.10993,0.11211,0.05,25.301 +10000,0.10993,0.11211,0.05,25.301 +10000,0.1121,0.11433,0.05,27.241 +10000,0.1121,0.11433,0.05,27.241 +10000,0.11432,0.11658,0.05,29.174 +10000,0.11432,0.11658,0.05,29.174 +10000,0.11657,0.11888,0.05,31.102 +10000,0.11657,0.11888,0.05,31.102 +10000,0.11887,0.12123,0.05,33.021 +10000,0.11887,0.12123,0.05,33.021 +10000,0.11887,0.12123,0.05,33.021 +10000,0.12122,0.12362,0.05,34.932 +10000,0.12122,0.12362,0.05,34.932 +10000,0.12361,0.12607,0.05,36.834 +10000,0.12361,0.12607,0.05,36.834 +10000,0.12361,0.12607,0.05,36.834 +10000,0.12605,0.12855,0.05,38.726 +10000,0.12605,0.12855,0.05,38.726 +10000,0.12854,0.13109,0.05,40.606 +10000,0.12854,0.13109,0.05,40.606 +10000,0.12854,0.13109,0.05,40.606 +10000,0.13108,0.13368,0.05,42.475 +10000,0.13108,0.13368,0.05,42.475 +10000,0.13367,0.13632,0.05,44.33 +10000,0.13367,0.13632,0.05,44.33 +10000,0.13367,0.13632,0.05,44.33 +10000,0.13631,0.13901,0.05,46.171 +10000,0.13631,0.13901,0.05,46.171 +10000,0.13631,0.13901,0.05,46.171 +10000,0.139,0.14176,0.05,47.997 +10000,0.139,0.14176,0.05,47.997 +10000,0.14175,0.14456,0.05,49.807 +10000,0.14175,0.14456,0.05,49.807 +10000,0.14175,0.14456,0.05,49.807 +10000,0.14455,0.14742,0.05,51.599 +10000,0.14455,0.14742,0.05,51.599 +10000,0.14455,0.14742,0.05,51.599 +10000,0.1474,0.15033,0.05,53.373 +10000,0.1474,0.15033,0.05,53.373 +10000,0.1474,0.15033,0.05,53.373 +10000,0.15032,0.1533,0.05,55.127 +10000,0.15032,0.1533,0.05,55.127 +10000,0.15032,0.1533,0.05,55.127 +10000,0.15329,0.15633,0.05,56.86 +10000,0.15329,0.15633,0.05,56.86 +10000,0.15329,0.15633,0.05,56.86 +10000,0.15632,0.15942,0.05,58.57 +10000,0.15632,0.15942,0.05,58.57 +10000,0.15632,0.15942,0.05,58.57 +10000,0.15941,0.16257,0.05,60.257 +10000,0.15941,0.16257,0.05,60.257 +10000,0.15941,0.16257,0.05,60.257 +10000,0.16256,0.16578,0.05,61.92 +10000,0.16256,0.16578,0.05,61.92 +10000,0.16256,0.16578,0.05,61.92 +10000,0.16577,0.16906,0.05,63.556 +10000,0.16577,0.16906,0.05,63.556 +10000,0.16577,0.16906,0.05,63.556 +10000,0.16577,0.16906,0.05,63.556 +10000,0.16905,0.1724,0.05,65.165 +10000,0.16905,0.1724,0.05,65.165 +10000,0.16905,0.1724,0.05,65.165 +10000,0.17239,0.1758,0.05,66.746 +10000,0.17239,0.1758,0.05,66.746 +10000,0.17239,0.1758,0.05,66.746 +10000,0.17579,0.17928,0.05,68.296 +10000,0.17579,0.17928,0.05,68.296 +10000,0.17579,0.17928,0.05,68.296 +10000,0.17579,0.17928,0.05,68.296 +10000,0.17927,0.18282,0.05,69.816 +10000,0.17927,0.18282,0.05,69.816 +10000,0.17927,0.18282,0.05,69.816 +10000,0.18281,0.18644,0.05,71.303 +10000,0.18281,0.18644,0.05,71.303 +10000,0.18281,0.18644,0.05,71.303 +10000,0.18281,0.18644,0.05,71.303 +10000,0.18643,0.19013,0.05,72.756 +10000,0.18643,0.19013,0.05,72.756 +10000,0.18643,0.19013,0.05,72.756 +10000,0.18643,0.19013,0.05,72.756 +10000,0.19011,0.19388,0.05,74.175 +10000,0.19011,0.19388,0.05,74.175 +10000,0.19011,0.19388,0.05,74.175 +10000,0.19387,0.19772,0.05,75.558 +10000,0.19387,0.19772,0.05,75.558 +10000,0.19387,0.19772,0.05,75.558 +10000,0.19387,0.19772,0.05,75.558 +10000,0.19771,0.20163,0.05,76.904 +10000,0.19771,0.20163,0.05,76.904 +10000,0.19771,0.20163,0.05,76.904 +10000,0.19771,0.20163,0.05,76.904 +10000,0.20162,0.20562,0.05,78.213 +10000,0.20162,0.20562,0.05,78.213 +10000,0.20162,0.20562,0.05,78.213 +10000,0.20162,0.20562,0.05,78.213 +10000,0.2056,0.20968,0.05,79.482 +10000,0.2056,0.20968,0.05,79.482 +10000,0.2056,0.20968,0.05,79.482 +10000,0.2056,0.20968,0.05,79.482 +10000,0.20967,0.21383,0.05,80.712 +10000,0.20967,0.21383,0.05,80.712 +10000,0.20967,0.21383,0.05,80.712 +10000,0.20967,0.21383,0.05,80.712 +10000,0.21382,0.21806,0.05,81.901 +10000,0.21382,0.21806,0.05,81.901 +10000,0.21382,0.21806,0.05,81.901 +10000,0.21382,0.21806,0.05,81.901 +10000,0.21382,0.21806,0.05,81.901 +10000,0.21805,0.22237,0.05,83.048 +10000,0.21805,0.22237,0.05,83.048 +10000,0.21805,0.22237,0.05,83.048 +10000,0.21805,0.22237,0.05,83.048 +10000,0.22236,0.22677,0.05,84.154 +10000,0.22236,0.22677,0.05,84.154 +10000,0.22236,0.22677,0.05,84.154 +10000,0.22236,0.22677,0.05,84.154 +10000,0.22676,0.23125,0.05,85.218 +10000,0.22676,0.23125,0.05,85.218 +10000,0.22676,0.23125,0.05,85.218 +10000,0.22676,0.23125,0.05,85.218 +10000,0.22676,0.23125,0.05,85.218 +10000,0.23124,0.23583,0.05,86.239 +10000,0.23124,0.23583,0.05,86.239 +10000,0.23124,0.23583,0.05,86.239 +10000,0.23124,0.23583,0.05,86.239 +10000,0.23582,0.2405,0.05,87.216 +10000,0.23582,0.2405,0.05,87.216 +10000,0.23582,0.2405,0.05,87.216 +10000,0.23582,0.2405,0.05,87.216 +10000,0.23582,0.2405,0.05,87.216 +10000,0.24048,0.24525,0.05,88.15 +10000,0.24048,0.24525,0.05,88.15 +10000,0.24048,0.24525,0.05,88.15 +10000,0.24048,0.24525,0.05,88.15 +10000,0.24048,0.24525,0.05,88.15 +10000,0.24524,0.25011,0.05,89.041 +10000,0.24524,0.25011,0.05,89.041 +10000,0.24524,0.25011,0.05,89.041 +10000,0.24524,0.25011,0.05,89.041 +10000,0.24524,0.25011,0.05,89.041 +10000,0.25009,0.25505,0.05,89.889 +10000,0.25009,0.25505,0.05,89.889 +10000,0.25009,0.25505,0.05,89.889 +10000,0.25009,0.25505,0.05,89.889 +10000,0.25009,0.25505,0.05,89.889 +10000,0.25504,0.2601,0.05,90.694 +10000,0.25504,0.2601,0.05,90.694 +10000,0.25504,0.2601,0.05,90.694 +10000,0.25504,0.2601,0.05,90.694 +10000,0.25504,0.2601,0.05,90.694 +10000,0.26009,0.26525,0.05,91.456 +10000,0.26009,0.26525,0.05,91.456 +10000,0.26009,0.26525,0.05,91.456 +10000,0.26009,0.26525,0.05,91.456 +10000,0.26009,0.26525,0.05,91.456 +10000,0.26524,0.2705,0.05,92.175 +10000,0.26524,0.2705,0.05,92.175 +10000,0.26524,0.2705,0.05,92.175 +10000,0.26524,0.2705,0.05,92.175 +10000,0.26524,0.2705,0.05,92.175 +10000,0.27048,0.27585,0.05,92.853 +10000,0.27048,0.27585,0.05,92.853 +10000,0.27048,0.27585,0.05,92.853 +10000,0.27048,0.27585,0.05,92.853 +10000,0.27048,0.27585,0.05,92.853 +10000,0.27584,0.28131,0.05,93.49 +10000,0.27584,0.28131,0.05,93.49 +10000,0.27584,0.28131,0.05,93.49 +10000,0.27584,0.28131,0.05,93.49 +10000,0.27584,0.28131,0.05,93.49 +10000,0.27584,0.28131,0.05,93.49 +10000,0.2813,0.28687,0.05,94.087 +10000,0.2813,0.28687,0.05,94.087 +10000,0.2813,0.28687,0.05,94.087 +10000,0.2813,0.28687,0.05,94.087 +10000,0.2813,0.28687,0.05,94.087 +10000,0.28686,0.29255,0.05,94.644 +10000,0.28686,0.29255,0.05,94.644 +10000,0.28686,0.29255,0.05,94.644 +10000,0.28686,0.29255,0.05,94.644 +10000,0.28686,0.29255,0.05,94.644 +10000,0.28686,0.29255,0.05,94.644 +10000,0.29254,0.29834,0.05,95.164 +10000,0.29254,0.29834,0.05,95.164 +10000,0.29254,0.29834,0.05,95.164 +10000,0.29254,0.29834,0.05,95.164 +10000,0.29254,0.29834,0.05,95.164 +10000,0.29254,0.29834,0.05,95.164 +10000,0.29833,0.30425,0.05,95.646 +10000,0.29833,0.30425,0.05,95.646 +10000,0.29833,0.30425,0.05,95.646 +10000,0.29833,0.30425,0.05,95.646 +10000,0.29833,0.30425,0.05,95.646 +10000,0.29833,0.30425,0.05,95.646 +10000,0.30424,0.31027,0.05,96.092 +10000,0.30424,0.31027,0.05,96.092 +10000,0.30424,0.31027,0.05,96.092 +10000,0.30424,0.31027,0.05,96.092 +10000,0.30424,0.31027,0.05,96.092 +10000,0.30424,0.31027,0.05,96.092 +10000,0.31026,0.31641,0.05,96.504 +10000,0.31026,0.31641,0.05,96.504 +10000,0.31026,0.31641,0.05,96.504 +10000,0.31026,0.31641,0.05,96.504 +10000,0.31026,0.31641,0.05,96.504 +10000,0.31026,0.31641,0.05,96.504 +10000,0.3164,0.32267,0.05,96.883 +10000,0.3164,0.32267,0.05,96.883 +10000,0.3164,0.32267,0.05,96.883 +10000,0.3164,0.32267,0.05,96.883 +10000,0.3164,0.32267,0.05,96.883 +10000,0.3164,0.32267,0.05,96.883 +10000,0.32266,0.32906,0.05,97.23 +10000,0.32266,0.32906,0.05,97.23 +10000,0.32266,0.32906,0.05,97.23 +10000,0.32266,0.32906,0.05,97.23 +10000,0.32266,0.32906,0.05,97.23 +10000,0.32266,0.32906,0.05,97.23 +10000,0.32266,0.32906,0.05,97.23 +10000,0.32905,0.33558,0.05,97.548 +10000,0.32905,0.33558,0.05,97.548 +10000,0.32905,0.33558,0.05,97.548 +10000,0.32905,0.33558,0.05,97.548 +10000,0.32905,0.33558,0.05,97.548 +10000,0.32905,0.33558,0.05,97.548 +10000,0.33556,0.34222,0.05,97.836 +10000,0.33556,0.34222,0.05,97.836 +10000,0.33556,0.34222,0.05,97.836 +10000,0.33556,0.34222,0.05,97.836 +10000,0.33556,0.34222,0.05,97.836 +10000,0.33556,0.34222,0.05,97.836 +10000,0.33556,0.34222,0.05,97.836 +10000,0.34221,0.34899,0.05,98.098 +10000,0.34221,0.34899,0.05,98.098 +10000,0.34221,0.34899,0.05,98.098 +10000,0.34221,0.34899,0.05,98.098 +10000,0.34221,0.34899,0.05,98.098 +10000,0.34221,0.34899,0.05,98.098 +10000,0.34221,0.34899,0.05,98.098 +10000,0.34898,0.3559,0.05,98.334 +10000,0.34898,0.3559,0.05,98.334 +10000,0.34898,0.3559,0.05,98.334 +10000,0.34898,0.3559,0.05,98.334 +10000,0.34898,0.3559,0.05,98.334 +10000,0.34898,0.3559,0.05,98.334 +10000,0.35589,0.36295,0.05,98.547 +10000,0.35589,0.36295,0.05,98.547 +10000,0.35589,0.36295,0.05,98.547 +10000,0.35589,0.36295,0.05,98.547 +10000,0.35589,0.36295,0.05,98.547 +10000,0.35589,0.36295,0.05,98.547 +10000,0.35589,0.36295,0.05,98.547 +10000,0.36294,0.37013,0.05,98.738 +10000,0.36294,0.37013,0.05,98.738 +10000,0.36294,0.37013,0.05,98.738 +10000,0.36294,0.37013,0.05,98.738 +10000,0.36294,0.37013,0.05,98.738 +10000,0.36294,0.37013,0.05,98.738 +10000,0.36294,0.37013,0.05,98.738 +10000,0.36294,0.37013,0.05,98.738 +10000,0.37012,0.37746,0.05,98.908 +10000,0.37012,0.37746,0.05,98.908 +10000,0.37012,0.37746,0.05,98.908 +10000,0.37012,0.37746,0.05,98.908 +10000,0.37012,0.37746,0.05,98.908 +10000,0.37012,0.37746,0.05,98.908 +10000,0.37012,0.37746,0.05,98.908 +10000,0.37745,0.38494,0.05,99.059 +10000,0.37745,0.38494,0.05,99.059 +10000,0.37745,0.38494,0.05,99.059 +10000,0.37745,0.38494,0.05,99.059 +10000,0.37745,0.38494,0.05,99.059 +10000,0.37745,0.38494,0.05,99.059 +10000,0.37745,0.38494,0.05,99.059 +10000,0.38493,0.39256,0.05,99.193 +10000,0.38493,0.39256,0.05,99.193 +10000,0.38493,0.39256,0.05,99.193 +10000,0.38493,0.39256,0.05,99.193 +10000,0.38493,0.39256,0.05,99.193 +10000,0.38493,0.39256,0.05,99.193 +10000,0.38493,0.39256,0.05,99.193 +10000,0.38493,0.39256,0.05,99.193 +10000,0.39255,0.40033,0.05,99.31 +10000,0.39255,0.40033,0.05,99.31 +10000,0.39255,0.40033,0.05,99.31 +10000,0.39255,0.40033,0.05,99.31 +10000,0.39255,0.40033,0.05,99.31 +10000,0.39255,0.40033,0.05,99.31 +10000,0.39255,0.40033,0.05,99.31 +10000,0.39255,0.40033,0.05,99.31 +10000,0.40032,0.40826,0.05,99.414 +10000,0.40032,0.40826,0.05,99.414 +10000,0.40032,0.40826,0.05,99.414 +10000,0.40032,0.40826,0.05,99.414 +10000,0.40032,0.40826,0.05,99.414 +10000,0.40032,0.40826,0.05,99.414 +10000,0.40032,0.40826,0.05,99.414 +10000,0.40032,0.40826,0.05,99.414 +10000,0.40825,0.41634,0.05,99.504 +10000,0.40825,0.41634,0.05,99.504 +10000,0.40825,0.41634,0.05,99.504 +10000,0.40825,0.41634,0.05,99.504 +10000,0.40825,0.41634,0.05,99.504 +10000,0.40825,0.41634,0.05,99.504 +10000,0.40825,0.41634,0.05,99.504 +10000,0.40825,0.41634,0.05,99.504 +10000,0.41633,0.42459,0.05,99.582 +10000,0.41633,0.42459,0.05,99.582 +10000,0.41633,0.42459,0.05,99.582 +10000,0.41633,0.42459,0.05,99.582 +10000,0.41633,0.42459,0.05,99.582 +10000,0.41633,0.42459,0.05,99.582 +10000,0.41633,0.42459,0.05,99.582 +10000,0.41633,0.42459,0.05,99.582 +10000,0.42458,0.433,0.05,99.65 +10000,0.42458,0.433,0.05,99.65 +10000,0.42458,0.433,0.05,99.65 +10000,0.42458,0.433,0.05,99.65 +10000,0.42458,0.433,0.05,99.65 +10000,0.42458,0.433,0.05,99.65 +10000,0.42458,0.433,0.05,99.65 +10000,0.42458,0.433,0.05,99.65 +10000,0.42458,0.433,0.05,99.65 +10000,0.43298,0.44157,0.05,99.708 +10000,0.43298,0.44157,0.05,99.708 +10000,0.43298,0.44157,0.05,99.708 +10000,0.43298,0.44157,0.05,99.708 +10000,0.43298,0.44157,0.05,99.708 +10000,0.43298,0.44157,0.05,99.708 +10000,0.43298,0.44157,0.05,99.708 +10000,0.43298,0.44157,0.05,99.708 +10000,0.44156,0.45031,0.05,99.758 +10000,0.44156,0.45031,0.05,99.758 +10000,0.44156,0.45031,0.05,99.758 +10000,0.44156,0.45031,0.05,99.758 +10000,0.44156,0.45031,0.05,99.758 +10000,0.44156,0.45031,0.05,99.758 +10000,0.44156,0.45031,0.05,99.758 +10000,0.44156,0.45031,0.05,99.758 +10000,0.44156,0.45031,0.05,99.758 +10000,0.4503,0.45923,0.05,99.8 +10000,0.4503,0.45923,0.05,99.8 +10000,0.4503,0.45923,0.05,99.8 +10000,0.4503,0.45923,0.05,99.8 +10000,0.4503,0.45923,0.05,99.8 +10000,0.4503,0.45923,0.05,99.8 +10000,0.4503,0.45923,0.05,99.8 +10000,0.4503,0.45923,0.05,99.8 +10000,0.4503,0.45923,0.05,99.8 +10000,0.45922,0.46833,0.05,99.836 +10000,0.45922,0.46833,0.05,99.836 +10000,0.45922,0.46833,0.05,99.836 +10000,0.45922,0.46833,0.05,99.836 +10000,0.45922,0.46833,0.05,99.836 +10000,0.45922,0.46833,0.05,99.836 +10000,0.45922,0.46833,0.05,99.836 +10000,0.45922,0.46833,0.05,99.836 +10000,0.45922,0.46833,0.05,99.836 +10000,0.46832,0.4776,0.05,99.866 +10000,0.46832,0.4776,0.05,99.866 +10000,0.46832,0.4776,0.05,99.866 +10000,0.46832,0.4776,0.05,99.866 +10000,0.46832,0.4776,0.05,99.866 +10000,0.46832,0.4776,0.05,99.866 +10000,0.46832,0.4776,0.05,99.866 +10000,0.46832,0.4776,0.05,99.866 +10000,0.46832,0.4776,0.05,99.866 +10000,0.47759,0.48706,0.05,99.891 +10000,0.47759,0.48706,0.05,99.891 +10000,0.47759,0.48706,0.05,99.891 +10000,0.47759,0.48706,0.05,99.891 +10000,0.47759,0.48706,0.05,99.891 +10000,0.47759,0.48706,0.05,99.891 +10000,0.47759,0.48706,0.05,99.891 +10000,0.47759,0.48706,0.05,99.891 +10000,0.47759,0.48706,0.05,99.891 +10000,0.47759,0.48706,0.05,99.891 +10000,0.48705,0.49671,0.05,99.912 +10000,0.48705,0.49671,0.05,99.912 +10000,0.48705,0.49671,0.05,99.912 +10000,0.48705,0.49671,0.05,99.912 +10000,0.48705,0.49671,0.05,99.912 +10000,0.48705,0.49671,0.05,99.912 +10000,0.48705,0.49671,0.05,99.912 +10000,0.48705,0.49671,0.05,99.912 +10000,0.48705,0.49671,0.05,99.912 +10000,0.4967,0.50655,0.05,99.93 +10000,0.4967,0.50655,0.05,99.93 +10000,0.4967,0.50655,0.05,99.93 +10000,0.4967,0.50655,0.05,99.93 +10000,0.4967,0.50655,0.05,99.93 +10000,0.4967,0.50655,0.05,99.93 +10000,0.4967,0.50655,0.05,99.93 +10000,0.4967,0.50655,0.05,99.93 +10000,0.4967,0.50655,0.05,99.93 +10000,0.4967,0.50655,0.05,99.93 +10000,0.50654,0.51658,0.05,99.944 +10000,0.50654,0.51658,0.05,99.944 +10000,0.50654,0.51658,0.05,99.944 +10000,0.50654,0.51658,0.05,99.944 +10000,0.50654,0.51658,0.05,99.944 +10000,0.50654,0.51658,0.05,99.944 +10000,0.50654,0.51658,0.05,99.944 +10000,0.50654,0.51658,0.05,99.944 +10000,0.50654,0.51658,0.05,99.944 +10000,0.50654,0.51658,0.05,99.944 +10000,0.51657,0.52681,0.05,99.955 +10000,0.51657,0.52681,0.05,99.955 +10000,0.51657,0.52681,0.05,99.955 +10000,0.51657,0.52681,0.05,99.955 +10000,0.51657,0.52681,0.05,99.955 +10000,0.51657,0.52681,0.05,99.955 +10000,0.51657,0.52681,0.05,99.955 +10000,0.51657,0.52681,0.05,99.955 +10000,0.51657,0.52681,0.05,99.955 +10000,0.51657,0.52681,0.05,99.955 +10000,0.5268,0.53725,0.05,99.965 +10000,0.5268,0.53725,0.05,99.965 +10000,0.5268,0.53725,0.05,99.965 +10000,0.5268,0.53725,0.05,99.965 +10000,0.5268,0.53725,0.05,99.965 +10000,0.5268,0.53725,0.05,99.965 +10000,0.5268,0.53725,0.05,99.965 +10000,0.5268,0.53725,0.05,99.965 +10000,0.5268,0.53725,0.05,99.965 +10000,0.5268,0.53725,0.05,99.965 +10000,0.5268,0.53725,0.05,99.965 +10000,0.53724,0.54789,0.05,99.973 +10000,0.53724,0.54789,0.05,99.973 +10000,0.53724,0.54789,0.05,99.973 +10000,0.53724,0.54789,0.05,99.973 +10000,0.53724,0.54789,0.05,99.973 +10000,0.53724,0.54789,0.05,99.973 +10000,0.53724,0.54789,0.05,99.973 +10000,0.53724,0.54789,0.05,99.973 +10000,0.53724,0.54789,0.05,99.973 +10000,0.53724,0.54789,0.05,99.973 +10000,0.54788,0.55874,0.05,99.979 +10000,0.54788,0.55874,0.05,99.979 +10000,0.54788,0.55874,0.05,99.979 +10000,0.54788,0.55874,0.05,99.979 +10000,0.54788,0.55874,0.05,99.979 +10000,0.54788,0.55874,0.05,99.979 +10000,0.54788,0.55874,0.05,99.979 +10000,0.54788,0.55874,0.05,99.979 +10000,0.54788,0.55874,0.05,99.979 +10000,0.54788,0.55874,0.05,99.979 +10000,0.54788,0.55874,0.05,99.979 +10000,0.55873,0.56981,0.05,99.984 +10000,0.55873,0.56981,0.05,99.984 +10000,0.55873,0.56981,0.05,99.984 +10000,0.55873,0.56981,0.05,99.984 +10000,0.55873,0.56981,0.05,99.984 +10000,0.55873,0.56981,0.05,99.984 +10000,0.55873,0.56981,0.05,99.984 +10000,0.55873,0.56981,0.05,99.984 +10000,0.55873,0.56981,0.05,99.984 +10000,0.55873,0.56981,0.05,99.984 +10000,0.55873,0.56981,0.05,99.984 +10000,0.5698,0.5811,0.05,99.987 +10000,0.5698,0.5811,0.05,99.987 +10000,0.5698,0.5811,0.05,99.987 +10000,0.5698,0.5811,0.05,99.987 +10000,0.5698,0.5811,0.05,99.987 +10000,0.5698,0.5811,0.05,99.987 +10000,0.5698,0.5811,0.05,99.987 +10000,0.5698,0.5811,0.05,99.987 +10000,0.5698,0.5811,0.05,99.987 +10000,0.5698,0.5811,0.05,99.987 +10000,0.5698,0.5811,0.05,99.987 +10000,0.5698,0.5811,0.05,99.987 +10000,0.58109,0.59261,0.05,99.99 +10000,0.58109,0.59261,0.05,99.99 +10000,0.58109,0.59261,0.05,99.99 +10000,0.58109,0.59261,0.05,99.99 +10000,0.58109,0.59261,0.05,99.99 +10000,0.58109,0.59261,0.05,99.99 +10000,0.58109,0.59261,0.05,99.99 +10000,0.58109,0.59261,0.05,99.99 +10000,0.58109,0.59261,0.05,99.99 +10000,0.58109,0.59261,0.05,99.99 +10000,0.58109,0.59261,0.05,99.99 +10000,0.5926,0.60435,0.05,99.993 +10000,0.5926,0.60435,0.05,99.993 +10000,0.5926,0.60435,0.05,99.993 +10000,0.5926,0.60435,0.05,99.993 +10000,0.5926,0.60435,0.05,99.993 +10000,0.5926,0.60435,0.05,99.993 +10000,0.5926,0.60435,0.05,99.993 +10000,0.5926,0.60435,0.05,99.993 +10000,0.5926,0.60435,0.05,99.993 +10000,0.5926,0.60435,0.05,99.993 +10000,0.5926,0.60435,0.05,99.993 +10000,0.5926,0.60435,0.05,99.993 +10000,0.60434,0.61632,0.05,99.995 +10000,0.60434,0.61632,0.05,99.995 +10000,0.60434,0.61632,0.05,99.995 +10000,0.60434,0.61632,0.05,99.995 +10000,0.60434,0.61632,0.05,99.995 +10000,0.60434,0.61632,0.05,99.995 +10000,0.60434,0.61632,0.05,99.995 +10000,0.60434,0.61632,0.05,99.995 +10000,0.60434,0.61632,0.05,99.995 +10000,0.60434,0.61632,0.05,99.995 +10000,0.60434,0.61632,0.05,99.995 +10000,0.60434,0.61632,0.05,99.995 +10000,0.61631,0.62853,0.05,99.996 +10000,0.61631,0.62853,0.05,99.996 +10000,0.61631,0.62853,0.05,99.996 +10000,0.61631,0.62853,0.05,99.996 +10000,0.61631,0.62853,0.05,99.996 +10000,0.61631,0.62853,0.05,99.996 +10000,0.61631,0.62853,0.05,99.996 +10000,0.61631,0.62853,0.05,99.996 +10000,0.61631,0.62853,0.05,99.996 +10000,0.61631,0.62853,0.05,99.996 +10000,0.61631,0.62853,0.05,99.996 +10000,0.61631,0.62853,0.05,99.996 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.62852,0.64098,0.05,99.997 +10000,0.64097,0.65368,0.05,99.998 +10000,0.64097,0.65368,0.05,99.998 +10000,0.64097,0.65368,0.05,99.998 +10000,0.64097,0.65368,0.05,99.998 +10000,0.64097,0.65368,0.05,99.998 +10000,0.64097,0.65368,0.05,99.998 +10000,0.64097,0.65368,0.05,99.998 +10000,0.64097,0.65368,0.05,99.998 +10000,0.64097,0.65368,0.05,99.998 +10000,0.64097,0.65368,0.05,99.998 +10000,0.64097,0.65368,0.05,99.998 +10000,0.64097,0.65368,0.05,99.998 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.65367,0.66663,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.66662,0.67984,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.67983,0.69331,0.05,99.999 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_10.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_10.csv new file mode 100644 index 00000000000..f84f6a0a181 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_10.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,0.07071,0.072112,0.05,-19.444 +1e+05,0.07071,0.072112,0.05,-19.444 +1e+05,0.07211,0.07354,0.05,-18.353 +1e+05,0.07351,0.074968,0.05,-17.283 +1e+05,0.075155,0.076646,0.05,-16.048 +1e+05,0.075155,0.076646,0.05,-16.048 +1e+05,0.077046,0.078574,0.05,-14.662 +1e+05,0.077046,0.078574,0.05,-14.662 +1e+05,0.078936,0.080501,0.05,-13.309 +1e+05,0.078936,0.080501,0.05,-13.309 +1e+05,0.080826,0.082429,0.05,-11.987 +1e+05,0.080826,0.082429,0.05,-11.987 +1e+05,0.082716,0.084357,0.05,-10.693 +1e+05,0.082716,0.084357,0.05,-10.693 +1e+05,0.084607,0.086285,0.05,-9.4284 +1e+05,0.084607,0.086285,0.05,-9.4284 +1e+05,0.086497,0.088212,0.05,-8.1901 +1e+05,0.086497,0.088212,0.05,-8.1901 +1e+05,0.088387,0.09014,0.05,-6.9775 +1e+05,0.088387,0.09014,0.05,-6.9775 +1e+05,0.090278,0.092068,0.05,-5.7896 +1e+05,0.090278,0.092068,0.05,-5.7896 +1e+05,0.092168,0.093995,0.05,-4.6253 +1e+05,0.092168,0.093995,0.05,-4.6253 +1e+05,0.094031,0.095896,0.05,-3.5002 +1e+05,0.095885,0.097786,0.05,-2.4013 +1e+05,0.095885,0.097786,0.05,-2.4013 +1e+05,0.097776,0.099715,0.05,-1.3015 +1e+05,0.097776,0.099715,0.05,-1.3015 +1e+05,0.099704,0.10168,0.05,-0.20076 +1e+05,0.099704,0.10168,0.05,-0.20076 +1e+05,0.10167,0.10369,0.05,0.90087 +1e+05,0.10167,0.10369,0.05,0.90087 +1e+05,0.10368,0.10573,0.05,2.0034 +1e+05,0.10368,0.10573,0.05,2.0034 +1e+05,0.10572,0.10782,0.05,3.1067 +1e+05,0.10572,0.10782,0.05,3.1067 +1e+05,0.10781,0.10995,0.05,4.2109 +1e+05,0.10781,0.10995,0.05,4.2109 +1e+05,0.10993,0.11211,0.05,5.316 +1e+05,0.10993,0.11211,0.05,5.316 +1e+05,0.10993,0.11211,0.05,5.316 +1e+05,0.1121,0.11433,0.05,6.4218 +1e+05,0.1121,0.11433,0.05,6.4218 +1e+05,0.11432,0.11658,0.05,7.5284 +1e+05,0.11432,0.11658,0.05,7.5284 +1e+05,0.11657,0.11888,0.05,8.6358 +1e+05,0.11657,0.11888,0.05,8.6358 +1e+05,0.11887,0.12123,0.05,9.7439 +1e+05,0.11887,0.12123,0.05,9.7439 +1e+05,0.11887,0.12123,0.05,9.7439 +1e+05,0.12122,0.12362,0.05,10.853 +1e+05,0.12122,0.12362,0.05,10.853 +1e+05,0.12361,0.12607,0.05,11.962 +1e+05,0.12361,0.12607,0.05,11.962 +1e+05,0.12361,0.12607,0.05,11.962 +1e+05,0.12605,0.12855,0.05,13.072 +1e+05,0.12605,0.12855,0.05,13.072 +1e+05,0.12854,0.13109,0.05,14.183 +1e+05,0.12854,0.13109,0.05,14.183 +1e+05,0.12854,0.13109,0.05,14.183 +1e+05,0.13108,0.13368,0.05,15.294 +1e+05,0.13108,0.13368,0.05,15.294 +1e+05,0.13367,0.13632,0.05,16.406 +1e+05,0.13367,0.13632,0.05,16.406 +1e+05,0.13367,0.13632,0.05,16.406 +1e+05,0.13631,0.13901,0.05,17.518 +1e+05,0.13631,0.13901,0.05,17.518 +1e+05,0.13631,0.13901,0.05,17.518 +1e+05,0.139,0.14176,0.05,18.631 +1e+05,0.139,0.14176,0.05,18.631 +1e+05,0.14175,0.14456,0.05,19.744 +1e+05,0.14175,0.14456,0.05,19.744 +1e+05,0.14175,0.14456,0.05,19.744 +1e+05,0.14455,0.14742,0.05,20.858 +1e+05,0.14455,0.14742,0.05,20.858 +1e+05,0.14455,0.14742,0.05,20.858 +1e+05,0.1474,0.15033,0.05,21.972 +1e+05,0.1474,0.15033,0.05,21.972 +1e+05,0.1474,0.15033,0.05,21.972 +1e+05,0.15032,0.1533,0.05,23.086 +1e+05,0.15032,0.1533,0.05,23.086 +1e+05,0.15032,0.1533,0.05,23.086 +1e+05,0.15329,0.15633,0.05,24.201 +1e+05,0.15329,0.15633,0.05,24.201 +1e+05,0.15329,0.15633,0.05,24.201 +1e+05,0.15632,0.15942,0.05,25.315 +1e+05,0.15632,0.15942,0.05,25.315 +1e+05,0.15632,0.15942,0.05,25.315 +1e+05,0.15941,0.16257,0.05,26.43 +1e+05,0.15941,0.16257,0.05,26.43 +1e+05,0.15941,0.16257,0.05,26.43 +1e+05,0.16256,0.16578,0.05,27.544 +1e+05,0.16256,0.16578,0.05,27.544 +1e+05,0.16256,0.16578,0.05,27.544 +1e+05,0.16577,0.16906,0.05,28.659 +1e+05,0.16577,0.16906,0.05,28.659 +1e+05,0.16577,0.16906,0.05,28.659 +1e+05,0.16577,0.16906,0.05,28.659 +1e+05,0.16905,0.1724,0.05,29.774 +1e+05,0.16905,0.1724,0.05,29.774 +1e+05,0.16905,0.1724,0.05,29.774 +1e+05,0.17239,0.1758,0.05,30.888 +1e+05,0.17239,0.1758,0.05,30.888 +1e+05,0.17239,0.1758,0.05,30.888 +1e+05,0.17579,0.17928,0.05,32.002 +1e+05,0.17579,0.17928,0.05,32.002 +1e+05,0.17579,0.17928,0.05,32.002 +1e+05,0.17579,0.17928,0.05,32.002 +1e+05,0.17927,0.18282,0.05,33.116 +1e+05,0.17927,0.18282,0.05,33.116 +1e+05,0.17927,0.18282,0.05,33.116 +1e+05,0.18281,0.18644,0.05,34.229 +1e+05,0.18281,0.18644,0.05,34.229 +1e+05,0.18281,0.18644,0.05,34.229 +1e+05,0.18281,0.18644,0.05,34.229 +1e+05,0.18643,0.19013,0.05,35.342 +1e+05,0.18643,0.19013,0.05,35.342 +1e+05,0.18643,0.19013,0.05,35.342 +1e+05,0.18643,0.19013,0.05,35.342 +1e+05,0.19011,0.19388,0.05,36.454 +1e+05,0.19011,0.19388,0.05,36.454 +1e+05,0.19011,0.19388,0.05,36.454 +1e+05,0.19387,0.19772,0.05,37.566 +1e+05,0.19387,0.19772,0.05,37.566 +1e+05,0.19387,0.19772,0.05,37.566 +1e+05,0.19387,0.19772,0.05,37.566 +1e+05,0.19771,0.20163,0.05,38.676 +1e+05,0.19771,0.20163,0.05,38.676 +1e+05,0.19771,0.20163,0.05,38.676 +1e+05,0.19771,0.20163,0.05,38.676 +1e+05,0.20162,0.20562,0.05,39.786 +1e+05,0.20162,0.20562,0.05,39.786 +1e+05,0.20162,0.20562,0.05,39.786 +1e+05,0.20162,0.20562,0.05,39.786 +1e+05,0.2056,0.20968,0.05,40.895 +1e+05,0.2056,0.20968,0.05,40.895 +1e+05,0.2056,0.20968,0.05,40.895 +1e+05,0.2056,0.20968,0.05,40.895 +1e+05,0.20967,0.21383,0.05,42.002 +1e+05,0.20967,0.21383,0.05,42.002 +1e+05,0.20967,0.21383,0.05,42.002 +1e+05,0.20967,0.21383,0.05,42.002 +1e+05,0.21382,0.21806,0.05,43.108 +1e+05,0.21382,0.21806,0.05,43.108 +1e+05,0.21382,0.21806,0.05,43.108 +1e+05,0.21382,0.21806,0.05,43.108 +1e+05,0.21382,0.21806,0.05,43.108 +1e+05,0.21805,0.22237,0.05,44.213 +1e+05,0.21805,0.22237,0.05,44.213 +1e+05,0.21805,0.22237,0.05,44.213 +1e+05,0.21805,0.22237,0.05,44.213 +1e+05,0.22236,0.22677,0.05,45.316 +1e+05,0.22236,0.22677,0.05,45.316 +1e+05,0.22236,0.22677,0.05,45.316 +1e+05,0.22236,0.22677,0.05,45.316 +1e+05,0.22676,0.23125,0.05,46.418 +1e+05,0.22676,0.23125,0.05,46.418 +1e+05,0.22676,0.23125,0.05,46.418 +1e+05,0.22676,0.23125,0.05,46.418 +1e+05,0.22676,0.23125,0.05,46.418 +1e+05,0.23124,0.23583,0.05,47.517 +1e+05,0.23124,0.23583,0.05,47.517 +1e+05,0.23124,0.23583,0.05,47.517 +1e+05,0.23124,0.23583,0.05,47.517 +1e+05,0.23582,0.2405,0.05,48.615 +1e+05,0.23582,0.2405,0.05,48.615 +1e+05,0.23582,0.2405,0.05,48.615 +1e+05,0.23582,0.2405,0.05,48.615 +1e+05,0.23582,0.2405,0.05,48.615 +1e+05,0.24048,0.24525,0.05,49.71 +1e+05,0.24048,0.24525,0.05,49.71 +1e+05,0.24048,0.24525,0.05,49.71 +1e+05,0.24048,0.24525,0.05,49.71 +1e+05,0.24048,0.24525,0.05,49.71 +1e+05,0.24524,0.25011,0.05,50.804 +1e+05,0.24524,0.25011,0.05,50.804 +1e+05,0.24524,0.25011,0.05,50.804 +1e+05,0.24524,0.25011,0.05,50.804 +1e+05,0.24524,0.25011,0.05,50.804 +1e+05,0.25009,0.25505,0.05,51.894 +1e+05,0.25009,0.25505,0.05,51.894 +1e+05,0.25009,0.25505,0.05,51.894 +1e+05,0.25009,0.25505,0.05,51.894 +1e+05,0.25009,0.25505,0.05,51.894 +1e+05,0.25504,0.2601,0.05,52.982 +1e+05,0.25504,0.2601,0.05,52.982 +1e+05,0.25504,0.2601,0.05,52.982 +1e+05,0.25504,0.2601,0.05,52.982 +1e+05,0.25504,0.2601,0.05,52.982 +1e+05,0.26009,0.26525,0.05,54.067 +1e+05,0.26009,0.26525,0.05,54.067 +1e+05,0.26009,0.26525,0.05,54.067 +1e+05,0.26009,0.26525,0.05,54.067 +1e+05,0.26009,0.26525,0.05,54.067 +1e+05,0.26524,0.2705,0.05,55.149 +1e+05,0.26524,0.2705,0.05,55.149 +1e+05,0.26524,0.2705,0.05,55.149 +1e+05,0.26524,0.2705,0.05,55.149 +1e+05,0.26524,0.2705,0.05,55.149 +1e+05,0.27048,0.27585,0.05,56.227 +1e+05,0.27048,0.27585,0.05,56.227 +1e+05,0.27048,0.27585,0.05,56.227 +1e+05,0.27048,0.27585,0.05,56.227 +1e+05,0.27048,0.27585,0.05,56.227 +1e+05,0.27584,0.28131,0.05,57.302 +1e+05,0.27584,0.28131,0.05,57.302 +1e+05,0.27584,0.28131,0.05,57.302 +1e+05,0.27584,0.28131,0.05,57.302 +1e+05,0.27584,0.28131,0.05,57.302 +1e+05,0.27584,0.28131,0.05,57.302 +1e+05,0.2813,0.28687,0.05,58.373 +1e+05,0.2813,0.28687,0.05,58.373 +1e+05,0.2813,0.28687,0.05,58.373 +1e+05,0.2813,0.28687,0.05,58.373 +1e+05,0.2813,0.28687,0.05,58.373 +1e+05,0.28686,0.29255,0.05,59.44 +1e+05,0.28686,0.29255,0.05,59.44 +1e+05,0.28686,0.29255,0.05,59.44 +1e+05,0.28686,0.29255,0.05,59.44 +1e+05,0.28686,0.29255,0.05,59.44 +1e+05,0.28686,0.29255,0.05,59.44 +1e+05,0.29254,0.29834,0.05,60.503 +1e+05,0.29254,0.29834,0.05,60.503 +1e+05,0.29254,0.29834,0.05,60.503 +1e+05,0.29254,0.29834,0.05,60.503 +1e+05,0.29254,0.29834,0.05,60.503 +1e+05,0.29254,0.29834,0.05,60.503 +1e+05,0.29833,0.30425,0.05,61.562 +1e+05,0.29833,0.30425,0.05,61.562 +1e+05,0.29833,0.30425,0.05,61.562 +1e+05,0.29833,0.30425,0.05,61.562 +1e+05,0.29833,0.30425,0.05,61.562 +1e+05,0.29833,0.30425,0.05,61.562 +1e+05,0.30424,0.31027,0.05,62.615 +1e+05,0.30424,0.31027,0.05,62.615 +1e+05,0.30424,0.31027,0.05,62.615 +1e+05,0.30424,0.31027,0.05,62.615 +1e+05,0.30424,0.31027,0.05,62.615 +1e+05,0.30424,0.31027,0.05,62.615 +1e+05,0.31026,0.31641,0.05,63.664 +1e+05,0.31026,0.31641,0.05,63.664 +1e+05,0.31026,0.31641,0.05,63.664 +1e+05,0.31026,0.31641,0.05,63.664 +1e+05,0.31026,0.31641,0.05,63.664 +1e+05,0.31026,0.31641,0.05,63.664 +1e+05,0.3164,0.32267,0.05,64.708 +1e+05,0.3164,0.32267,0.05,64.708 +1e+05,0.3164,0.32267,0.05,64.708 +1e+05,0.3164,0.32267,0.05,64.708 +1e+05,0.3164,0.32267,0.05,64.708 +1e+05,0.3164,0.32267,0.05,64.708 +1e+05,0.32266,0.32906,0.05,65.746 +1e+05,0.32266,0.32906,0.05,65.746 +1e+05,0.32266,0.32906,0.05,65.746 +1e+05,0.32266,0.32906,0.05,65.746 +1e+05,0.32266,0.32906,0.05,65.746 +1e+05,0.32266,0.32906,0.05,65.746 +1e+05,0.32266,0.32906,0.05,65.746 +1e+05,0.32905,0.33558,0.05,66.778 +1e+05,0.32905,0.33558,0.05,66.778 +1e+05,0.32905,0.33558,0.05,66.778 +1e+05,0.32905,0.33558,0.05,66.778 +1e+05,0.32905,0.33558,0.05,66.778 +1e+05,0.32905,0.33558,0.05,66.778 +1e+05,0.33556,0.34222,0.05,67.804 +1e+05,0.33556,0.34222,0.05,67.804 +1e+05,0.33556,0.34222,0.05,67.804 +1e+05,0.33556,0.34222,0.05,67.804 +1e+05,0.33556,0.34222,0.05,67.804 +1e+05,0.33556,0.34222,0.05,67.804 +1e+05,0.33556,0.34222,0.05,67.804 +1e+05,0.34221,0.34899,0.05,68.824 +1e+05,0.34221,0.34899,0.05,68.824 +1e+05,0.34221,0.34899,0.05,68.824 +1e+05,0.34221,0.34899,0.05,68.824 +1e+05,0.34221,0.34899,0.05,68.824 +1e+05,0.34221,0.34899,0.05,68.824 +1e+05,0.34221,0.34899,0.05,68.824 +1e+05,0.34898,0.3559,0.05,69.838 +1e+05,0.34898,0.3559,0.05,69.838 +1e+05,0.34898,0.3559,0.05,69.838 +1e+05,0.34898,0.3559,0.05,69.838 +1e+05,0.34898,0.3559,0.05,69.838 +1e+05,0.34898,0.3559,0.05,69.838 +1e+05,0.35589,0.36295,0.05,70.844 +1e+05,0.35589,0.36295,0.05,70.844 +1e+05,0.35589,0.36295,0.05,70.844 +1e+05,0.35589,0.36295,0.05,70.844 +1e+05,0.35589,0.36295,0.05,70.844 +1e+05,0.35589,0.36295,0.05,70.844 +1e+05,0.35589,0.36295,0.05,70.844 +1e+05,0.36294,0.37013,0.05,71.844 +1e+05,0.36294,0.37013,0.05,71.844 +1e+05,0.36294,0.37013,0.05,71.844 +1e+05,0.36294,0.37013,0.05,71.844 +1e+05,0.36294,0.37013,0.05,71.844 +1e+05,0.36294,0.37013,0.05,71.844 +1e+05,0.36294,0.37013,0.05,71.844 +1e+05,0.36294,0.37013,0.05,71.844 +1e+05,0.37012,0.37746,0.05,72.835 +1e+05,0.37012,0.37746,0.05,72.835 +1e+05,0.37012,0.37746,0.05,72.835 +1e+05,0.37012,0.37746,0.05,72.835 +1e+05,0.37012,0.37746,0.05,72.835 +1e+05,0.37012,0.37746,0.05,72.835 +1e+05,0.37012,0.37746,0.05,72.835 +1e+05,0.37745,0.38494,0.05,73.819 +1e+05,0.37745,0.38494,0.05,73.819 +1e+05,0.37745,0.38494,0.05,73.819 +1e+05,0.37745,0.38494,0.05,73.819 +1e+05,0.37745,0.38494,0.05,73.819 +1e+05,0.37745,0.38494,0.05,73.819 +1e+05,0.37745,0.38494,0.05,73.819 +1e+05,0.38493,0.39256,0.05,74.795 +1e+05,0.38493,0.39256,0.05,74.795 +1e+05,0.38493,0.39256,0.05,74.795 +1e+05,0.38493,0.39256,0.05,74.795 +1e+05,0.38493,0.39256,0.05,74.795 +1e+05,0.38493,0.39256,0.05,74.795 +1e+05,0.38493,0.39256,0.05,74.795 +1e+05,0.38493,0.39256,0.05,74.795 +1e+05,0.39255,0.40033,0.05,75.763 +1e+05,0.39255,0.40033,0.05,75.763 +1e+05,0.39255,0.40033,0.05,75.763 +1e+05,0.39255,0.40033,0.05,75.763 +1e+05,0.39255,0.40033,0.05,75.763 +1e+05,0.39255,0.40033,0.05,75.763 +1e+05,0.39255,0.40033,0.05,75.763 +1e+05,0.39255,0.40033,0.05,75.763 +1e+05,0.40032,0.40826,0.05,76.722 +1e+05,0.40032,0.40826,0.05,76.722 +1e+05,0.40032,0.40826,0.05,76.722 +1e+05,0.40032,0.40826,0.05,76.722 +1e+05,0.40032,0.40826,0.05,76.722 +1e+05,0.40032,0.40826,0.05,76.722 +1e+05,0.40032,0.40826,0.05,76.722 +1e+05,0.40032,0.40826,0.05,76.722 +1e+05,0.40825,0.41634,0.05,77.672 +1e+05,0.40825,0.41634,0.05,77.672 +1e+05,0.40825,0.41634,0.05,77.672 +1e+05,0.40825,0.41634,0.05,77.672 +1e+05,0.40825,0.41634,0.05,77.672 +1e+05,0.40825,0.41634,0.05,77.672 +1e+05,0.40825,0.41634,0.05,77.672 +1e+05,0.40825,0.41634,0.05,77.672 +1e+05,0.41633,0.42459,0.05,78.614 +1e+05,0.41633,0.42459,0.05,78.614 +1e+05,0.41633,0.42459,0.05,78.614 +1e+05,0.41633,0.42459,0.05,78.614 +1e+05,0.41633,0.42459,0.05,78.614 +1e+05,0.41633,0.42459,0.05,78.614 +1e+05,0.41633,0.42459,0.05,78.614 +1e+05,0.41633,0.42459,0.05,78.614 +1e+05,0.42458,0.433,0.05,79.545 +1e+05,0.42458,0.433,0.05,79.545 +1e+05,0.42458,0.433,0.05,79.545 +1e+05,0.42458,0.433,0.05,79.545 +1e+05,0.42458,0.433,0.05,79.545 +1e+05,0.42458,0.433,0.05,79.545 +1e+05,0.42458,0.433,0.05,79.545 +1e+05,0.42458,0.433,0.05,79.545 +1e+05,0.42458,0.433,0.05,79.545 +1e+05,0.43298,0.44157,0.05,80.467 +1e+05,0.43298,0.44157,0.05,80.467 +1e+05,0.43298,0.44157,0.05,80.467 +1e+05,0.43298,0.44157,0.05,80.467 +1e+05,0.43298,0.44157,0.05,80.467 +1e+05,0.43298,0.44157,0.05,80.467 +1e+05,0.43298,0.44157,0.05,80.467 +1e+05,0.43298,0.44157,0.05,80.467 +1e+05,0.44156,0.45031,0.05,81.379 +1e+05,0.44156,0.45031,0.05,81.379 +1e+05,0.44156,0.45031,0.05,81.379 +1e+05,0.44156,0.45031,0.05,81.379 +1e+05,0.44156,0.45031,0.05,81.379 +1e+05,0.44156,0.45031,0.05,81.379 +1e+05,0.44156,0.45031,0.05,81.379 +1e+05,0.44156,0.45031,0.05,81.379 +1e+05,0.44156,0.45031,0.05,81.379 +1e+05,0.4503,0.45923,0.05,82.282 +1e+05,0.4503,0.45923,0.05,82.282 +1e+05,0.4503,0.45923,0.05,82.282 +1e+05,0.4503,0.45923,0.05,82.282 +1e+05,0.4503,0.45923,0.05,82.282 +1e+05,0.4503,0.45923,0.05,82.282 +1e+05,0.4503,0.45923,0.05,82.282 +1e+05,0.4503,0.45923,0.05,82.282 +1e+05,0.4503,0.45923,0.05,82.282 +1e+05,0.45922,0.46833,0.05,83.173 +1e+05,0.45922,0.46833,0.05,83.173 +1e+05,0.45922,0.46833,0.05,83.173 +1e+05,0.45922,0.46833,0.05,83.173 +1e+05,0.45922,0.46833,0.05,83.173 +1e+05,0.45922,0.46833,0.05,83.173 +1e+05,0.45922,0.46833,0.05,83.173 +1e+05,0.45922,0.46833,0.05,83.173 +1e+05,0.45922,0.46833,0.05,83.173 +1e+05,0.46832,0.4776,0.05,84.055 +1e+05,0.46832,0.4776,0.05,84.055 +1e+05,0.46832,0.4776,0.05,84.055 +1e+05,0.46832,0.4776,0.05,84.055 +1e+05,0.46832,0.4776,0.05,84.055 +1e+05,0.46832,0.4776,0.05,84.055 +1e+05,0.46832,0.4776,0.05,84.055 +1e+05,0.46832,0.4776,0.05,84.055 +1e+05,0.46832,0.4776,0.05,84.055 +1e+05,0.47759,0.48706,0.05,84.926 +1e+05,0.47759,0.48706,0.05,84.926 +1e+05,0.47759,0.48706,0.05,84.926 +1e+05,0.47759,0.48706,0.05,84.926 +1e+05,0.47759,0.48706,0.05,84.926 +1e+05,0.47759,0.48706,0.05,84.926 +1e+05,0.47759,0.48706,0.05,84.926 +1e+05,0.47759,0.48706,0.05,84.926 +1e+05,0.47759,0.48706,0.05,84.926 +1e+05,0.47759,0.48706,0.05,84.926 +1e+05,0.48705,0.49671,0.05,85.786 +1e+05,0.48705,0.49671,0.05,85.786 +1e+05,0.48705,0.49671,0.05,85.786 +1e+05,0.48705,0.49671,0.05,85.786 +1e+05,0.48705,0.49671,0.05,85.786 +1e+05,0.48705,0.49671,0.05,85.786 +1e+05,0.48705,0.49671,0.05,85.786 +1e+05,0.48705,0.49671,0.05,85.786 +1e+05,0.48705,0.49671,0.05,85.786 +1e+05,0.4967,0.50655,0.05,86.636 +1e+05,0.4967,0.50655,0.05,86.636 +1e+05,0.4967,0.50655,0.05,86.636 +1e+05,0.4967,0.50655,0.05,86.636 +1e+05,0.4967,0.50655,0.05,86.636 +1e+05,0.4967,0.50655,0.05,86.636 +1e+05,0.4967,0.50655,0.05,86.636 +1e+05,0.4967,0.50655,0.05,86.636 +1e+05,0.4967,0.50655,0.05,86.636 +1e+05,0.4967,0.50655,0.05,86.636 +1e+05,0.50654,0.51658,0.05,87.475 +1e+05,0.50654,0.51658,0.05,87.475 +1e+05,0.50654,0.51658,0.05,87.475 +1e+05,0.50654,0.51658,0.05,87.475 +1e+05,0.50654,0.51658,0.05,87.475 +1e+05,0.50654,0.51658,0.05,87.475 +1e+05,0.50654,0.51658,0.05,87.475 +1e+05,0.50654,0.51658,0.05,87.475 +1e+05,0.50654,0.51658,0.05,87.475 +1e+05,0.50654,0.51658,0.05,87.475 +1e+05,0.51657,0.52681,0.05,88.303 +1e+05,0.51657,0.52681,0.05,88.303 +1e+05,0.51657,0.52681,0.05,88.303 +1e+05,0.51657,0.52681,0.05,88.303 +1e+05,0.51657,0.52681,0.05,88.303 +1e+05,0.51657,0.52681,0.05,88.303 +1e+05,0.51657,0.52681,0.05,88.303 +1e+05,0.51657,0.52681,0.05,88.303 +1e+05,0.51657,0.52681,0.05,88.303 +1e+05,0.51657,0.52681,0.05,88.303 +1e+05,0.5268,0.53725,0.05,89.121 +1e+05,0.5268,0.53725,0.05,89.121 +1e+05,0.5268,0.53725,0.05,89.121 +1e+05,0.5268,0.53725,0.05,89.121 +1e+05,0.5268,0.53725,0.05,89.121 +1e+05,0.5268,0.53725,0.05,89.121 +1e+05,0.5268,0.53725,0.05,89.121 +1e+05,0.5268,0.53725,0.05,89.121 +1e+05,0.5268,0.53725,0.05,89.121 +1e+05,0.5268,0.53725,0.05,89.121 +1e+05,0.5268,0.53725,0.05,89.121 +1e+05,0.53724,0.54789,0.05,89.928 +1e+05,0.53724,0.54789,0.05,89.928 +1e+05,0.53724,0.54789,0.05,89.928 +1e+05,0.53724,0.54789,0.05,89.928 +1e+05,0.53724,0.54789,0.05,89.928 +1e+05,0.53724,0.54789,0.05,89.928 +1e+05,0.53724,0.54789,0.05,89.928 +1e+05,0.53724,0.54789,0.05,89.928 +1e+05,0.53724,0.54789,0.05,89.928 +1e+05,0.53724,0.54789,0.05,89.928 +1e+05,0.54788,0.55874,0.05,90.724 +1e+05,0.54788,0.55874,0.05,90.724 +1e+05,0.54788,0.55874,0.05,90.724 +1e+05,0.54788,0.55874,0.05,90.724 +1e+05,0.54788,0.55874,0.05,90.724 +1e+05,0.54788,0.55874,0.05,90.724 +1e+05,0.54788,0.55874,0.05,90.724 +1e+05,0.54788,0.55874,0.05,90.724 +1e+05,0.54788,0.55874,0.05,90.724 +1e+05,0.54788,0.55874,0.05,90.724 +1e+05,0.54788,0.55874,0.05,90.724 +1e+05,0.55873,0.56981,0.05,91.511 +1e+05,0.55873,0.56981,0.05,91.511 +1e+05,0.55873,0.56981,0.05,91.511 +1e+05,0.55873,0.56981,0.05,91.511 +1e+05,0.55873,0.56981,0.05,91.511 +1e+05,0.55873,0.56981,0.05,91.511 +1e+05,0.55873,0.56981,0.05,91.511 +1e+05,0.55873,0.56981,0.05,91.511 +1e+05,0.55873,0.56981,0.05,91.511 +1e+05,0.55873,0.56981,0.05,91.511 +1e+05,0.55873,0.56981,0.05,91.511 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.5698,0.5811,0.05,92.288 +1e+05,0.58109,0.59261,0.05,93.055 +1e+05,0.58109,0.59261,0.05,93.055 +1e+05,0.58109,0.59261,0.05,93.055 +1e+05,0.58109,0.59261,0.05,93.055 +1e+05,0.58109,0.59261,0.05,93.055 +1e+05,0.58109,0.59261,0.05,93.055 +1e+05,0.58109,0.59261,0.05,93.055 +1e+05,0.58109,0.59261,0.05,93.055 +1e+05,0.58109,0.59261,0.05,93.055 +1e+05,0.58109,0.59261,0.05,93.055 +1e+05,0.58109,0.59261,0.05,93.055 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.5926,0.60435,0.05,93.814 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.60434,0.61632,0.05,94.564 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.61631,0.62853,0.05,95.306 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.62852,0.64098,0.05,96.042 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.64097,0.65368,0.05,96.771 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.65367,0.66663,0.05,97.495 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.66662,0.67984,0.05,98.214 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.67983,0.69331,0.05,98.931 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,0.6933,0.70704,0.05,99.646 +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_2.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_2.csv new file mode 100644 index 00000000000..7645d62f469 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_2.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,0.07071,0.072112,0.05,-19.187 +20000,0.07071,0.072112,0.05,-19.187 +20000,0.07211,0.07354,0.05,-17.591 +20000,0.07351,0.074968,0.05,-16.025 +20000,0.075155,0.076646,0.05,-14.216 +20000,0.075155,0.076646,0.05,-14.216 +20000,0.077046,0.078574,0.05,-12.188 +20000,0.077046,0.078574,0.05,-12.188 +20000,0.078936,0.080501,0.05,-10.206 +20000,0.078936,0.080501,0.05,-10.206 +20000,0.080826,0.082429,0.05,-8.2679 +20000,0.080826,0.082429,0.05,-8.2679 +20000,0.082716,0.084357,0.05,-6.373 +20000,0.082716,0.084357,0.05,-6.373 +20000,0.084607,0.086285,0.05,-4.519 +20000,0.084607,0.086285,0.05,-4.519 +20000,0.086497,0.088212,0.05,-2.7043 +20000,0.086497,0.088212,0.05,-2.7043 +20000,0.088387,0.09014,0.05,-0.92736 +20000,0.088387,0.09014,0.05,-0.92736 +20000,0.090278,0.092068,0.05,0.81323 +20000,0.090278,0.092068,0.05,0.81323 +20000,0.092168,0.093995,0.05,2.5188 +20000,0.092168,0.093995,0.05,2.5188 +20000,0.094031,0.095896,0.05,4.1665 +20000,0.095885,0.097786,0.05,5.7753 +20000,0.095885,0.097786,0.05,5.7753 +20000,0.097776,0.099715,0.05,7.3847 +20000,0.097776,0.099715,0.05,7.3847 +20000,0.099704,0.10168,0.05,8.9946 +20000,0.099704,0.10168,0.05,8.9946 +20000,0.10167,0.10369,0.05,10.605 +20000,0.10167,0.10369,0.05,10.605 +20000,0.10368,0.10573,0.05,12.215 +20000,0.10368,0.10573,0.05,12.215 +20000,0.10572,0.10782,0.05,13.825 +20000,0.10572,0.10782,0.05,13.825 +20000,0.10781,0.10995,0.05,15.435 +20000,0.10781,0.10995,0.05,15.435 +20000,0.10993,0.11211,0.05,17.045 +20000,0.10993,0.11211,0.05,17.045 +20000,0.10993,0.11211,0.05,17.045 +20000,0.1121,0.11433,0.05,18.654 +20000,0.1121,0.11433,0.05,18.654 +20000,0.11432,0.11658,0.05,20.261 +20000,0.11432,0.11658,0.05,20.261 +20000,0.11657,0.11888,0.05,21.868 +20000,0.11657,0.11888,0.05,21.868 +20000,0.11887,0.12123,0.05,23.473 +20000,0.11887,0.12123,0.05,23.473 +20000,0.11887,0.12123,0.05,23.473 +20000,0.12122,0.12362,0.05,25.076 +20000,0.12122,0.12362,0.05,25.076 +20000,0.12361,0.12607,0.05,26.677 +20000,0.12361,0.12607,0.05,26.677 +20000,0.12361,0.12607,0.05,26.677 +20000,0.12605,0.12855,0.05,28.275 +20000,0.12605,0.12855,0.05,28.275 +20000,0.12854,0.13109,0.05,29.871 +20000,0.12854,0.13109,0.05,29.871 +20000,0.12854,0.13109,0.05,29.871 +20000,0.13108,0.13368,0.05,31.463 +20000,0.13108,0.13368,0.05,31.463 +20000,0.13367,0.13632,0.05,33.052 +20000,0.13367,0.13632,0.05,33.052 +20000,0.13367,0.13632,0.05,33.052 +20000,0.13631,0.13901,0.05,34.637 +20000,0.13631,0.13901,0.05,34.637 +20000,0.13631,0.13901,0.05,34.637 +20000,0.139,0.14176,0.05,36.217 +20000,0.139,0.14176,0.05,36.217 +20000,0.14175,0.14456,0.05,37.793 +20000,0.14175,0.14456,0.05,37.793 +20000,0.14175,0.14456,0.05,37.793 +20000,0.14455,0.14742,0.05,39.363 +20000,0.14455,0.14742,0.05,39.363 +20000,0.14455,0.14742,0.05,39.363 +20000,0.1474,0.15033,0.05,40.927 +20000,0.1474,0.15033,0.05,40.927 +20000,0.1474,0.15033,0.05,40.927 +20000,0.15032,0.1533,0.05,42.484 +20000,0.15032,0.1533,0.05,42.484 +20000,0.15032,0.1533,0.05,42.484 +20000,0.15329,0.15633,0.05,44.035 +20000,0.15329,0.15633,0.05,44.035 +20000,0.15329,0.15633,0.05,44.035 +20000,0.15632,0.15942,0.05,45.578 +20000,0.15632,0.15942,0.05,45.578 +20000,0.15632,0.15942,0.05,45.578 +20000,0.15941,0.16257,0.05,47.113 +20000,0.15941,0.16257,0.05,47.113 +20000,0.15941,0.16257,0.05,47.113 +20000,0.16256,0.16578,0.05,48.64 +20000,0.16256,0.16578,0.05,48.64 +20000,0.16256,0.16578,0.05,48.64 +20000,0.16577,0.16906,0.05,50.157 +20000,0.16577,0.16906,0.05,50.157 +20000,0.16577,0.16906,0.05,50.157 +20000,0.16577,0.16906,0.05,50.157 +20000,0.16905,0.1724,0.05,51.664 +20000,0.16905,0.1724,0.05,51.664 +20000,0.16905,0.1724,0.05,51.664 +20000,0.17239,0.1758,0.05,53.16 +20000,0.17239,0.1758,0.05,53.16 +20000,0.17239,0.1758,0.05,53.16 +20000,0.17579,0.17928,0.05,54.645 +20000,0.17579,0.17928,0.05,54.645 +20000,0.17579,0.17928,0.05,54.645 +20000,0.17579,0.17928,0.05,54.645 +20000,0.17927,0.18282,0.05,56.118 +20000,0.17927,0.18282,0.05,56.118 +20000,0.17927,0.18282,0.05,56.118 +20000,0.18281,0.18644,0.05,57.578 +20000,0.18281,0.18644,0.05,57.578 +20000,0.18281,0.18644,0.05,57.578 +20000,0.18281,0.18644,0.05,57.578 +20000,0.18643,0.19013,0.05,59.024 +20000,0.18643,0.19013,0.05,59.024 +20000,0.18643,0.19013,0.05,59.024 +20000,0.18643,0.19013,0.05,59.024 +20000,0.19011,0.19388,0.05,60.456 +20000,0.19011,0.19388,0.05,60.456 +20000,0.19011,0.19388,0.05,60.456 +20000,0.19387,0.19772,0.05,61.873 +20000,0.19387,0.19772,0.05,61.873 +20000,0.19387,0.19772,0.05,61.873 +20000,0.19387,0.19772,0.05,61.873 +20000,0.19771,0.20163,0.05,63.273 +20000,0.19771,0.20163,0.05,63.273 +20000,0.19771,0.20163,0.05,63.273 +20000,0.19771,0.20163,0.05,63.273 +20000,0.20162,0.20562,0.05,64.657 +20000,0.20162,0.20562,0.05,64.657 +20000,0.20162,0.20562,0.05,64.657 +20000,0.20162,0.20562,0.05,64.657 +20000,0.2056,0.20968,0.05,66.023 +20000,0.2056,0.20968,0.05,66.023 +20000,0.2056,0.20968,0.05,66.023 +20000,0.2056,0.20968,0.05,66.023 +20000,0.20967,0.21383,0.05,67.37 +20000,0.20967,0.21383,0.05,67.37 +20000,0.20967,0.21383,0.05,67.37 +20000,0.20967,0.21383,0.05,67.37 +20000,0.21382,0.21806,0.05,68.698 +20000,0.21382,0.21806,0.05,68.698 +20000,0.21382,0.21806,0.05,68.698 +20000,0.21382,0.21806,0.05,68.698 +20000,0.21382,0.21806,0.05,68.698 +20000,0.21805,0.22237,0.05,70.005 +20000,0.21805,0.22237,0.05,70.005 +20000,0.21805,0.22237,0.05,70.005 +20000,0.21805,0.22237,0.05,70.005 +20000,0.22236,0.22677,0.05,71.291 +20000,0.22236,0.22677,0.05,71.291 +20000,0.22236,0.22677,0.05,71.291 +20000,0.22236,0.22677,0.05,71.291 +20000,0.22676,0.23125,0.05,72.555 +20000,0.22676,0.23125,0.05,72.555 +20000,0.22676,0.23125,0.05,72.555 +20000,0.22676,0.23125,0.05,72.555 +20000,0.22676,0.23125,0.05,72.555 +20000,0.23124,0.23583,0.05,73.796 +20000,0.23124,0.23583,0.05,73.796 +20000,0.23124,0.23583,0.05,73.796 +20000,0.23124,0.23583,0.05,73.796 +20000,0.23582,0.2405,0.05,75.013 +20000,0.23582,0.2405,0.05,75.013 +20000,0.23582,0.2405,0.05,75.013 +20000,0.23582,0.2405,0.05,75.013 +20000,0.23582,0.2405,0.05,75.013 +20000,0.24048,0.24525,0.05,76.205 +20000,0.24048,0.24525,0.05,76.205 +20000,0.24048,0.24525,0.05,76.205 +20000,0.24048,0.24525,0.05,76.205 +20000,0.24048,0.24525,0.05,76.205 +20000,0.24524,0.25011,0.05,77.371 +20000,0.24524,0.25011,0.05,77.371 +20000,0.24524,0.25011,0.05,77.371 +20000,0.24524,0.25011,0.05,77.371 +20000,0.24524,0.25011,0.05,77.371 +20000,0.25009,0.25505,0.05,78.511 +20000,0.25009,0.25505,0.05,78.511 +20000,0.25009,0.25505,0.05,78.511 +20000,0.25009,0.25505,0.05,78.511 +20000,0.25009,0.25505,0.05,78.511 +20000,0.25504,0.2601,0.05,79.624 +20000,0.25504,0.2601,0.05,79.624 +20000,0.25504,0.2601,0.05,79.624 +20000,0.25504,0.2601,0.05,79.624 +20000,0.25504,0.2601,0.05,79.624 +20000,0.26009,0.26525,0.05,80.708 +20000,0.26009,0.26525,0.05,80.708 +20000,0.26009,0.26525,0.05,80.708 +20000,0.26009,0.26525,0.05,80.708 +20000,0.26009,0.26525,0.05,80.708 +20000,0.26524,0.2705,0.05,81.764 +20000,0.26524,0.2705,0.05,81.764 +20000,0.26524,0.2705,0.05,81.764 +20000,0.26524,0.2705,0.05,81.764 +20000,0.26524,0.2705,0.05,81.764 +20000,0.27048,0.27585,0.05,82.79 +20000,0.27048,0.27585,0.05,82.79 +20000,0.27048,0.27585,0.05,82.79 +20000,0.27048,0.27585,0.05,82.79 +20000,0.27048,0.27585,0.05,82.79 +20000,0.27584,0.28131,0.05,83.785 +20000,0.27584,0.28131,0.05,83.785 +20000,0.27584,0.28131,0.05,83.785 +20000,0.27584,0.28131,0.05,83.785 +20000,0.27584,0.28131,0.05,83.785 +20000,0.27584,0.28131,0.05,83.785 +20000,0.2813,0.28687,0.05,84.75 +20000,0.2813,0.28687,0.05,84.75 +20000,0.2813,0.28687,0.05,84.75 +20000,0.2813,0.28687,0.05,84.75 +20000,0.2813,0.28687,0.05,84.75 +20000,0.28686,0.29255,0.05,85.684 +20000,0.28686,0.29255,0.05,85.684 +20000,0.28686,0.29255,0.05,85.684 +20000,0.28686,0.29255,0.05,85.684 +20000,0.28686,0.29255,0.05,85.684 +20000,0.28686,0.29255,0.05,85.684 +20000,0.29254,0.29834,0.05,86.585 +20000,0.29254,0.29834,0.05,86.585 +20000,0.29254,0.29834,0.05,86.585 +20000,0.29254,0.29834,0.05,86.585 +20000,0.29254,0.29834,0.05,86.585 +20000,0.29254,0.29834,0.05,86.585 +20000,0.29833,0.30425,0.05,87.454 +20000,0.29833,0.30425,0.05,87.454 +20000,0.29833,0.30425,0.05,87.454 +20000,0.29833,0.30425,0.05,87.454 +20000,0.29833,0.30425,0.05,87.454 +20000,0.29833,0.30425,0.05,87.454 +20000,0.30424,0.31027,0.05,88.291 +20000,0.30424,0.31027,0.05,88.291 +20000,0.30424,0.31027,0.05,88.291 +20000,0.30424,0.31027,0.05,88.291 +20000,0.30424,0.31027,0.05,88.291 +20000,0.30424,0.31027,0.05,88.291 +20000,0.31026,0.31641,0.05,89.094 +20000,0.31026,0.31641,0.05,89.094 +20000,0.31026,0.31641,0.05,89.094 +20000,0.31026,0.31641,0.05,89.094 +20000,0.31026,0.31641,0.05,89.094 +20000,0.31026,0.31641,0.05,89.094 +20000,0.3164,0.32267,0.05,89.864 +20000,0.3164,0.32267,0.05,89.864 +20000,0.3164,0.32267,0.05,89.864 +20000,0.3164,0.32267,0.05,89.864 +20000,0.3164,0.32267,0.05,89.864 +20000,0.3164,0.32267,0.05,89.864 +20000,0.32266,0.32906,0.05,90.6 +20000,0.32266,0.32906,0.05,90.6 +20000,0.32266,0.32906,0.05,90.6 +20000,0.32266,0.32906,0.05,90.6 +20000,0.32266,0.32906,0.05,90.6 +20000,0.32266,0.32906,0.05,90.6 +20000,0.32266,0.32906,0.05,90.6 +20000,0.32905,0.33558,0.05,91.303 +20000,0.32905,0.33558,0.05,91.303 +20000,0.32905,0.33558,0.05,91.303 +20000,0.32905,0.33558,0.05,91.303 +20000,0.32905,0.33558,0.05,91.303 +20000,0.32905,0.33558,0.05,91.303 +20000,0.33556,0.34222,0.05,91.973 +20000,0.33556,0.34222,0.05,91.973 +20000,0.33556,0.34222,0.05,91.973 +20000,0.33556,0.34222,0.05,91.973 +20000,0.33556,0.34222,0.05,91.973 +20000,0.33556,0.34222,0.05,91.973 +20000,0.33556,0.34222,0.05,91.973 +20000,0.34221,0.34899,0.05,92.609 +20000,0.34221,0.34899,0.05,92.609 +20000,0.34221,0.34899,0.05,92.609 +20000,0.34221,0.34899,0.05,92.609 +20000,0.34221,0.34899,0.05,92.609 +20000,0.34221,0.34899,0.05,92.609 +20000,0.34221,0.34899,0.05,92.609 +20000,0.34898,0.3559,0.05,93.212 +20000,0.34898,0.3559,0.05,93.212 +20000,0.34898,0.3559,0.05,93.212 +20000,0.34898,0.3559,0.05,93.212 +20000,0.34898,0.3559,0.05,93.212 +20000,0.34898,0.3559,0.05,93.212 +20000,0.35589,0.36295,0.05,93.782 +20000,0.35589,0.36295,0.05,93.782 +20000,0.35589,0.36295,0.05,93.782 +20000,0.35589,0.36295,0.05,93.782 +20000,0.35589,0.36295,0.05,93.782 +20000,0.35589,0.36295,0.05,93.782 +20000,0.35589,0.36295,0.05,93.782 +20000,0.36294,0.37013,0.05,94.32 +20000,0.36294,0.37013,0.05,94.32 +20000,0.36294,0.37013,0.05,94.32 +20000,0.36294,0.37013,0.05,94.32 +20000,0.36294,0.37013,0.05,94.32 +20000,0.36294,0.37013,0.05,94.32 +20000,0.36294,0.37013,0.05,94.32 +20000,0.36294,0.37013,0.05,94.32 +20000,0.37012,0.37746,0.05,94.825 +20000,0.37012,0.37746,0.05,94.825 +20000,0.37012,0.37746,0.05,94.825 +20000,0.37012,0.37746,0.05,94.825 +20000,0.37012,0.37746,0.05,94.825 +20000,0.37012,0.37746,0.05,94.825 +20000,0.37012,0.37746,0.05,94.825 +20000,0.37745,0.38494,0.05,95.3 +20000,0.37745,0.38494,0.05,95.3 +20000,0.37745,0.38494,0.05,95.3 +20000,0.37745,0.38494,0.05,95.3 +20000,0.37745,0.38494,0.05,95.3 +20000,0.37745,0.38494,0.05,95.3 +20000,0.37745,0.38494,0.05,95.3 +20000,0.38493,0.39256,0.05,95.743 +20000,0.38493,0.39256,0.05,95.743 +20000,0.38493,0.39256,0.05,95.743 +20000,0.38493,0.39256,0.05,95.743 +20000,0.38493,0.39256,0.05,95.743 +20000,0.38493,0.39256,0.05,95.743 +20000,0.38493,0.39256,0.05,95.743 +20000,0.38493,0.39256,0.05,95.743 +20000,0.39255,0.40033,0.05,96.157 +20000,0.39255,0.40033,0.05,96.157 +20000,0.39255,0.40033,0.05,96.157 +20000,0.39255,0.40033,0.05,96.157 +20000,0.39255,0.40033,0.05,96.157 +20000,0.39255,0.40033,0.05,96.157 +20000,0.39255,0.40033,0.05,96.157 +20000,0.39255,0.40033,0.05,96.157 +20000,0.40032,0.40826,0.05,96.541 +20000,0.40032,0.40826,0.05,96.541 +20000,0.40032,0.40826,0.05,96.541 +20000,0.40032,0.40826,0.05,96.541 +20000,0.40032,0.40826,0.05,96.541 +20000,0.40032,0.40826,0.05,96.541 +20000,0.40032,0.40826,0.05,96.541 +20000,0.40032,0.40826,0.05,96.541 +20000,0.40825,0.41634,0.05,96.898 +20000,0.40825,0.41634,0.05,96.898 +20000,0.40825,0.41634,0.05,96.898 +20000,0.40825,0.41634,0.05,96.898 +20000,0.40825,0.41634,0.05,96.898 +20000,0.40825,0.41634,0.05,96.898 +20000,0.40825,0.41634,0.05,96.898 +20000,0.40825,0.41634,0.05,96.898 +20000,0.41633,0.42459,0.05,97.227 +20000,0.41633,0.42459,0.05,97.227 +20000,0.41633,0.42459,0.05,97.227 +20000,0.41633,0.42459,0.05,97.227 +20000,0.41633,0.42459,0.05,97.227 +20000,0.41633,0.42459,0.05,97.227 +20000,0.41633,0.42459,0.05,97.227 +20000,0.41633,0.42459,0.05,97.227 +20000,0.42458,0.433,0.05,97.53 +20000,0.42458,0.433,0.05,97.53 +20000,0.42458,0.433,0.05,97.53 +20000,0.42458,0.433,0.05,97.53 +20000,0.42458,0.433,0.05,97.53 +20000,0.42458,0.433,0.05,97.53 +20000,0.42458,0.433,0.05,97.53 +20000,0.42458,0.433,0.05,97.53 +20000,0.42458,0.433,0.05,97.53 +20000,0.43298,0.44157,0.05,97.807 +20000,0.43298,0.44157,0.05,97.807 +20000,0.43298,0.44157,0.05,97.807 +20000,0.43298,0.44157,0.05,97.807 +20000,0.43298,0.44157,0.05,97.807 +20000,0.43298,0.44157,0.05,97.807 +20000,0.43298,0.44157,0.05,97.807 +20000,0.43298,0.44157,0.05,97.807 +20000,0.44156,0.45031,0.05,98.061 +20000,0.44156,0.45031,0.05,98.061 +20000,0.44156,0.45031,0.05,98.061 +20000,0.44156,0.45031,0.05,98.061 +20000,0.44156,0.45031,0.05,98.061 +20000,0.44156,0.45031,0.05,98.061 +20000,0.44156,0.45031,0.05,98.061 +20000,0.44156,0.45031,0.05,98.061 +20000,0.44156,0.45031,0.05,98.061 +20000,0.4503,0.45923,0.05,98.292 +20000,0.4503,0.45923,0.05,98.292 +20000,0.4503,0.45923,0.05,98.292 +20000,0.4503,0.45923,0.05,98.292 +20000,0.4503,0.45923,0.05,98.292 +20000,0.4503,0.45923,0.05,98.292 +20000,0.4503,0.45923,0.05,98.292 +20000,0.4503,0.45923,0.05,98.292 +20000,0.4503,0.45923,0.05,98.292 +20000,0.45922,0.46833,0.05,98.502 +20000,0.45922,0.46833,0.05,98.502 +20000,0.45922,0.46833,0.05,98.502 +20000,0.45922,0.46833,0.05,98.502 +20000,0.45922,0.46833,0.05,98.502 +20000,0.45922,0.46833,0.05,98.502 +20000,0.45922,0.46833,0.05,98.502 +20000,0.45922,0.46833,0.05,98.502 +20000,0.45922,0.46833,0.05,98.502 +20000,0.46832,0.4776,0.05,98.691 +20000,0.46832,0.4776,0.05,98.691 +20000,0.46832,0.4776,0.05,98.691 +20000,0.46832,0.4776,0.05,98.691 +20000,0.46832,0.4776,0.05,98.691 +20000,0.46832,0.4776,0.05,98.691 +20000,0.46832,0.4776,0.05,98.691 +20000,0.46832,0.4776,0.05,98.691 +20000,0.46832,0.4776,0.05,98.691 +20000,0.47759,0.48706,0.05,98.861 +20000,0.47759,0.48706,0.05,98.861 +20000,0.47759,0.48706,0.05,98.861 +20000,0.47759,0.48706,0.05,98.861 +20000,0.47759,0.48706,0.05,98.861 +20000,0.47759,0.48706,0.05,98.861 +20000,0.47759,0.48706,0.05,98.861 +20000,0.47759,0.48706,0.05,98.861 +20000,0.47759,0.48706,0.05,98.861 +20000,0.47759,0.48706,0.05,98.861 +20000,0.48705,0.49671,0.05,99.013 +20000,0.48705,0.49671,0.05,99.013 +20000,0.48705,0.49671,0.05,99.013 +20000,0.48705,0.49671,0.05,99.013 +20000,0.48705,0.49671,0.05,99.013 +20000,0.48705,0.49671,0.05,99.013 +20000,0.48705,0.49671,0.05,99.013 +20000,0.48705,0.49671,0.05,99.013 +20000,0.48705,0.49671,0.05,99.013 +20000,0.4967,0.50655,0.05,99.149 +20000,0.4967,0.50655,0.05,99.149 +20000,0.4967,0.50655,0.05,99.149 +20000,0.4967,0.50655,0.05,99.149 +20000,0.4967,0.50655,0.05,99.149 +20000,0.4967,0.50655,0.05,99.149 +20000,0.4967,0.50655,0.05,99.149 +20000,0.4967,0.50655,0.05,99.149 +20000,0.4967,0.50655,0.05,99.149 +20000,0.4967,0.50655,0.05,99.149 +20000,0.50654,0.51658,0.05,99.27 +20000,0.50654,0.51658,0.05,99.27 +20000,0.50654,0.51658,0.05,99.27 +20000,0.50654,0.51658,0.05,99.27 +20000,0.50654,0.51658,0.05,99.27 +20000,0.50654,0.51658,0.05,99.27 +20000,0.50654,0.51658,0.05,99.27 +20000,0.50654,0.51658,0.05,99.27 +20000,0.50654,0.51658,0.05,99.27 +20000,0.50654,0.51658,0.05,99.27 +20000,0.51657,0.52681,0.05,99.377 +20000,0.51657,0.52681,0.05,99.377 +20000,0.51657,0.52681,0.05,99.377 +20000,0.51657,0.52681,0.05,99.377 +20000,0.51657,0.52681,0.05,99.377 +20000,0.51657,0.52681,0.05,99.377 +20000,0.51657,0.52681,0.05,99.377 +20000,0.51657,0.52681,0.05,99.377 +20000,0.51657,0.52681,0.05,99.377 +20000,0.51657,0.52681,0.05,99.377 +20000,0.5268,0.53725,0.05,99.47 +20000,0.5268,0.53725,0.05,99.47 +20000,0.5268,0.53725,0.05,99.47 +20000,0.5268,0.53725,0.05,99.47 +20000,0.5268,0.53725,0.05,99.47 +20000,0.5268,0.53725,0.05,99.47 +20000,0.5268,0.53725,0.05,99.47 +20000,0.5268,0.53725,0.05,99.47 +20000,0.5268,0.53725,0.05,99.47 +20000,0.5268,0.53725,0.05,99.47 +20000,0.5268,0.53725,0.05,99.47 +20000,0.53724,0.54789,0.05,99.552 +20000,0.53724,0.54789,0.05,99.552 +20000,0.53724,0.54789,0.05,99.552 +20000,0.53724,0.54789,0.05,99.552 +20000,0.53724,0.54789,0.05,99.552 +20000,0.53724,0.54789,0.05,99.552 +20000,0.53724,0.54789,0.05,99.552 +20000,0.53724,0.54789,0.05,99.552 +20000,0.53724,0.54789,0.05,99.552 +20000,0.53724,0.54789,0.05,99.552 +20000,0.54788,0.55874,0.05,99.624 +20000,0.54788,0.55874,0.05,99.624 +20000,0.54788,0.55874,0.05,99.624 +20000,0.54788,0.55874,0.05,99.624 +20000,0.54788,0.55874,0.05,99.624 +20000,0.54788,0.55874,0.05,99.624 +20000,0.54788,0.55874,0.05,99.624 +20000,0.54788,0.55874,0.05,99.624 +20000,0.54788,0.55874,0.05,99.624 +20000,0.54788,0.55874,0.05,99.624 +20000,0.54788,0.55874,0.05,99.624 +20000,0.55873,0.56981,0.05,99.686 +20000,0.55873,0.56981,0.05,99.686 +20000,0.55873,0.56981,0.05,99.686 +20000,0.55873,0.56981,0.05,99.686 +20000,0.55873,0.56981,0.05,99.686 +20000,0.55873,0.56981,0.05,99.686 +20000,0.55873,0.56981,0.05,99.686 +20000,0.55873,0.56981,0.05,99.686 +20000,0.55873,0.56981,0.05,99.686 +20000,0.55873,0.56981,0.05,99.686 +20000,0.55873,0.56981,0.05,99.686 +20000,0.5698,0.5811,0.05,99.739 +20000,0.5698,0.5811,0.05,99.739 +20000,0.5698,0.5811,0.05,99.739 +20000,0.5698,0.5811,0.05,99.739 +20000,0.5698,0.5811,0.05,99.739 +20000,0.5698,0.5811,0.05,99.739 +20000,0.5698,0.5811,0.05,99.739 +20000,0.5698,0.5811,0.05,99.739 +20000,0.5698,0.5811,0.05,99.739 +20000,0.5698,0.5811,0.05,99.739 +20000,0.5698,0.5811,0.05,99.739 +20000,0.5698,0.5811,0.05,99.739 +20000,0.58109,0.59261,0.05,99.785 +20000,0.58109,0.59261,0.05,99.785 +20000,0.58109,0.59261,0.05,99.785 +20000,0.58109,0.59261,0.05,99.785 +20000,0.58109,0.59261,0.05,99.785 +20000,0.58109,0.59261,0.05,99.785 +20000,0.58109,0.59261,0.05,99.785 +20000,0.58109,0.59261,0.05,99.785 +20000,0.58109,0.59261,0.05,99.785 +20000,0.58109,0.59261,0.05,99.785 +20000,0.58109,0.59261,0.05,99.785 +20000,0.5926,0.60435,0.05,99.825 +20000,0.5926,0.60435,0.05,99.825 +20000,0.5926,0.60435,0.05,99.825 +20000,0.5926,0.60435,0.05,99.825 +20000,0.5926,0.60435,0.05,99.825 +20000,0.5926,0.60435,0.05,99.825 +20000,0.5926,0.60435,0.05,99.825 +20000,0.5926,0.60435,0.05,99.825 +20000,0.5926,0.60435,0.05,99.825 +20000,0.5926,0.60435,0.05,99.825 +20000,0.5926,0.60435,0.05,99.825 +20000,0.5926,0.60435,0.05,99.825 +20000,0.60434,0.61632,0.05,99.858 +20000,0.60434,0.61632,0.05,99.858 +20000,0.60434,0.61632,0.05,99.858 +20000,0.60434,0.61632,0.05,99.858 +20000,0.60434,0.61632,0.05,99.858 +20000,0.60434,0.61632,0.05,99.858 +20000,0.60434,0.61632,0.05,99.858 +20000,0.60434,0.61632,0.05,99.858 +20000,0.60434,0.61632,0.05,99.858 +20000,0.60434,0.61632,0.05,99.858 +20000,0.60434,0.61632,0.05,99.858 +20000,0.60434,0.61632,0.05,99.858 +20000,0.61631,0.62853,0.05,99.887 +20000,0.61631,0.62853,0.05,99.887 +20000,0.61631,0.62853,0.05,99.887 +20000,0.61631,0.62853,0.05,99.887 +20000,0.61631,0.62853,0.05,99.887 +20000,0.61631,0.62853,0.05,99.887 +20000,0.61631,0.62853,0.05,99.887 +20000,0.61631,0.62853,0.05,99.887 +20000,0.61631,0.62853,0.05,99.887 +20000,0.61631,0.62853,0.05,99.887 +20000,0.61631,0.62853,0.05,99.887 +20000,0.61631,0.62853,0.05,99.887 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.62852,0.64098,0.05,99.911 +20000,0.64097,0.65368,0.05,99.932 +20000,0.64097,0.65368,0.05,99.932 +20000,0.64097,0.65368,0.05,99.932 +20000,0.64097,0.65368,0.05,99.932 +20000,0.64097,0.65368,0.05,99.932 +20000,0.64097,0.65368,0.05,99.932 +20000,0.64097,0.65368,0.05,99.932 +20000,0.64097,0.65368,0.05,99.932 +20000,0.64097,0.65368,0.05,99.932 +20000,0.64097,0.65368,0.05,99.932 +20000,0.64097,0.65368,0.05,99.932 +20000,0.64097,0.65368,0.05,99.932 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.65367,0.66663,0.05,99.95 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.66662,0.67984,0.05,99.966 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.67983,0.69331,0.05,99.98 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,0.6933,0.70704,0.05,99.994 +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_5.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_5.csv new file mode 100644 index 00000000000..03f9eb13744 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/data_5.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,0.07071,0.072112,0.05,-19.355 +50000,0.07071,0.072112,0.05,-19.355 +50000,0.07211,0.07354,0.05,-18.09 +50000,0.07351,0.074968,0.05,-16.848 +50000,0.075155,0.076646,0.05,-15.415 +50000,0.075155,0.076646,0.05,-15.415 +50000,0.077046,0.078574,0.05,-13.807 +50000,0.077046,0.078574,0.05,-13.807 +50000,0.078936,0.080501,0.05,-12.236 +50000,0.078936,0.080501,0.05,-12.236 +50000,0.080826,0.082429,0.05,-10.701 +50000,0.080826,0.082429,0.05,-10.701 +50000,0.082716,0.084357,0.05,-9.2003 +50000,0.082716,0.084357,0.05,-9.2003 +50000,0.084607,0.086285,0.05,-7.7316 +50000,0.084607,0.086285,0.05,-7.7316 +50000,0.086497,0.088212,0.05,-6.294 +50000,0.086497,0.088212,0.05,-6.294 +50000,0.088387,0.09014,0.05,-4.8861 +50000,0.088387,0.09014,0.05,-4.8861 +50000,0.090278,0.092068,0.05,-3.5069 +50000,0.090278,0.092068,0.05,-3.5069 +50000,0.092168,0.093995,0.05,-2.1551 +50000,0.092168,0.093995,0.05,-2.1551 +50000,0.094031,0.095896,0.05,-0.84874 +50000,0.095885,0.097786,0.05,0.42708 +50000,0.095885,0.097786,0.05,0.42708 +50000,0.097776,0.099715,0.05,1.7039 +50000,0.097776,0.099715,0.05,1.7039 +50000,0.099704,0.10168,0.05,2.9817 +50000,0.099704,0.10168,0.05,2.9817 +50000,0.10167,0.10369,0.05,4.2604 +50000,0.10167,0.10369,0.05,4.2604 +50000,0.10368,0.10573,0.05,5.54 +50000,0.10368,0.10573,0.05,5.54 +50000,0.10572,0.10782,0.05,6.8204 +50000,0.10572,0.10782,0.05,6.8204 +50000,0.10781,0.10995,0.05,8.1016 +50000,0.10781,0.10995,0.05,8.1016 +50000,0.10993,0.11211,0.05,9.3835 +50000,0.10993,0.11211,0.05,9.3835 +50000,0.10993,0.11211,0.05,9.3835 +50000,0.1121,0.11433,0.05,10.666 +50000,0.1121,0.11433,0.05,10.666 +50000,0.11432,0.11658,0.05,11.949 +50000,0.11432,0.11658,0.05,11.949 +50000,0.11657,0.11888,0.05,13.233 +50000,0.11657,0.11888,0.05,13.233 +50000,0.11887,0.12123,0.05,14.517 +50000,0.11887,0.12123,0.05,14.517 +50000,0.11887,0.12123,0.05,14.517 +50000,0.12122,0.12362,0.05,15.801 +50000,0.12122,0.12362,0.05,15.801 +50000,0.12361,0.12607,0.05,17.086 +50000,0.12361,0.12607,0.05,17.086 +50000,0.12361,0.12607,0.05,17.086 +50000,0.12605,0.12855,0.05,18.371 +50000,0.12605,0.12855,0.05,18.371 +50000,0.12854,0.13109,0.05,19.655 +50000,0.12854,0.13109,0.05,19.655 +50000,0.12854,0.13109,0.05,19.655 +50000,0.13108,0.13368,0.05,20.94 +50000,0.13108,0.13368,0.05,20.94 +50000,0.13367,0.13632,0.05,22.225 +50000,0.13367,0.13632,0.05,22.225 +50000,0.13367,0.13632,0.05,22.225 +50000,0.13631,0.13901,0.05,23.51 +50000,0.13631,0.13901,0.05,23.51 +50000,0.13631,0.13901,0.05,23.51 +50000,0.139,0.14176,0.05,24.794 +50000,0.139,0.14176,0.05,24.794 +50000,0.14175,0.14456,0.05,26.077 +50000,0.14175,0.14456,0.05,26.077 +50000,0.14175,0.14456,0.05,26.077 +50000,0.14455,0.14742,0.05,27.36 +50000,0.14455,0.14742,0.05,27.36 +50000,0.14455,0.14742,0.05,27.36 +50000,0.1474,0.15033,0.05,28.642 +50000,0.1474,0.15033,0.05,28.642 +50000,0.1474,0.15033,0.05,28.642 +50000,0.15032,0.1533,0.05,29.924 +50000,0.15032,0.1533,0.05,29.924 +50000,0.15032,0.1533,0.05,29.924 +50000,0.15329,0.15633,0.05,31.204 +50000,0.15329,0.15633,0.05,31.204 +50000,0.15329,0.15633,0.05,31.204 +50000,0.15632,0.15942,0.05,32.483 +50000,0.15632,0.15942,0.05,32.483 +50000,0.15632,0.15942,0.05,32.483 +50000,0.15941,0.16257,0.05,33.761 +50000,0.15941,0.16257,0.05,33.761 +50000,0.15941,0.16257,0.05,33.761 +50000,0.16256,0.16578,0.05,35.037 +50000,0.16256,0.16578,0.05,35.037 +50000,0.16256,0.16578,0.05,35.037 +50000,0.16577,0.16906,0.05,36.311 +50000,0.16577,0.16906,0.05,36.311 +50000,0.16577,0.16906,0.05,36.311 +50000,0.16577,0.16906,0.05,36.311 +50000,0.16905,0.1724,0.05,37.583 +50000,0.16905,0.1724,0.05,37.583 +50000,0.16905,0.1724,0.05,37.583 +50000,0.17239,0.1758,0.05,38.853 +50000,0.17239,0.1758,0.05,38.853 +50000,0.17239,0.1758,0.05,38.853 +50000,0.17579,0.17928,0.05,40.12 +50000,0.17579,0.17928,0.05,40.12 +50000,0.17579,0.17928,0.05,40.12 +50000,0.17579,0.17928,0.05,40.12 +50000,0.17927,0.18282,0.05,41.385 +50000,0.17927,0.18282,0.05,41.385 +50000,0.17927,0.18282,0.05,41.385 +50000,0.18281,0.18644,0.05,42.647 +50000,0.18281,0.18644,0.05,42.647 +50000,0.18281,0.18644,0.05,42.647 +50000,0.18281,0.18644,0.05,42.647 +50000,0.18643,0.19013,0.05,43.906 +50000,0.18643,0.19013,0.05,43.906 +50000,0.18643,0.19013,0.05,43.906 +50000,0.18643,0.19013,0.05,43.906 +50000,0.19011,0.19388,0.05,45.161 +50000,0.19011,0.19388,0.05,45.161 +50000,0.19011,0.19388,0.05,45.161 +50000,0.19387,0.19772,0.05,46.413 +50000,0.19387,0.19772,0.05,46.413 +50000,0.19387,0.19772,0.05,46.413 +50000,0.19387,0.19772,0.05,46.413 +50000,0.19771,0.20163,0.05,47.66 +50000,0.19771,0.20163,0.05,47.66 +50000,0.19771,0.20163,0.05,47.66 +50000,0.19771,0.20163,0.05,47.66 +50000,0.20162,0.20562,0.05,48.904 +50000,0.20162,0.20562,0.05,48.904 +50000,0.20162,0.20562,0.05,48.904 +50000,0.20162,0.20562,0.05,48.904 +50000,0.2056,0.20968,0.05,50.142 +50000,0.2056,0.20968,0.05,50.142 +50000,0.2056,0.20968,0.05,50.142 +50000,0.2056,0.20968,0.05,50.142 +50000,0.20967,0.21383,0.05,51.376 +50000,0.20967,0.21383,0.05,51.376 +50000,0.20967,0.21383,0.05,51.376 +50000,0.20967,0.21383,0.05,51.376 +50000,0.21382,0.21806,0.05,52.604 +50000,0.21382,0.21806,0.05,52.604 +50000,0.21382,0.21806,0.05,52.604 +50000,0.21382,0.21806,0.05,52.604 +50000,0.21382,0.21806,0.05,52.604 +50000,0.21805,0.22237,0.05,53.826 +50000,0.21805,0.22237,0.05,53.826 +50000,0.21805,0.22237,0.05,53.826 +50000,0.21805,0.22237,0.05,53.826 +50000,0.22236,0.22677,0.05,55.043 +50000,0.22236,0.22677,0.05,55.043 +50000,0.22236,0.22677,0.05,55.043 +50000,0.22236,0.22677,0.05,55.043 +50000,0.22676,0.23125,0.05,56.253 +50000,0.22676,0.23125,0.05,56.253 +50000,0.22676,0.23125,0.05,56.253 +50000,0.22676,0.23125,0.05,56.253 +50000,0.22676,0.23125,0.05,56.253 +50000,0.23124,0.23583,0.05,57.456 +50000,0.23124,0.23583,0.05,57.456 +50000,0.23124,0.23583,0.05,57.456 +50000,0.23124,0.23583,0.05,57.456 +50000,0.23582,0.2405,0.05,58.652 +50000,0.23582,0.2405,0.05,58.652 +50000,0.23582,0.2405,0.05,58.652 +50000,0.23582,0.2405,0.05,58.652 +50000,0.23582,0.2405,0.05,58.652 +50000,0.24048,0.24525,0.05,59.84 +50000,0.24048,0.24525,0.05,59.84 +50000,0.24048,0.24525,0.05,59.84 +50000,0.24048,0.24525,0.05,59.84 +50000,0.24048,0.24525,0.05,59.84 +50000,0.24524,0.25011,0.05,61.019 +50000,0.24524,0.25011,0.05,61.019 +50000,0.24524,0.25011,0.05,61.019 +50000,0.24524,0.25011,0.05,61.019 +50000,0.24524,0.25011,0.05,61.019 +50000,0.25009,0.25505,0.05,62.191 +50000,0.25009,0.25505,0.05,62.191 +50000,0.25009,0.25505,0.05,62.191 +50000,0.25009,0.25505,0.05,62.191 +50000,0.25009,0.25505,0.05,62.191 +50000,0.25504,0.2601,0.05,63.353 +50000,0.25504,0.2601,0.05,63.353 +50000,0.25504,0.2601,0.05,63.353 +50000,0.25504,0.2601,0.05,63.353 +50000,0.25504,0.2601,0.05,63.353 +50000,0.26009,0.26525,0.05,64.505 +50000,0.26009,0.26525,0.05,64.505 +50000,0.26009,0.26525,0.05,64.505 +50000,0.26009,0.26525,0.05,64.505 +50000,0.26009,0.26525,0.05,64.505 +50000,0.26524,0.2705,0.05,65.647 +50000,0.26524,0.2705,0.05,65.647 +50000,0.26524,0.2705,0.05,65.647 +50000,0.26524,0.2705,0.05,65.647 +50000,0.26524,0.2705,0.05,65.647 +50000,0.27048,0.27585,0.05,66.779 +50000,0.27048,0.27585,0.05,66.779 +50000,0.27048,0.27585,0.05,66.779 +50000,0.27048,0.27585,0.05,66.779 +50000,0.27048,0.27585,0.05,66.779 +50000,0.27584,0.28131,0.05,67.9 +50000,0.27584,0.28131,0.05,67.9 +50000,0.27584,0.28131,0.05,67.9 +50000,0.27584,0.28131,0.05,67.9 +50000,0.27584,0.28131,0.05,67.9 +50000,0.27584,0.28131,0.05,67.9 +50000,0.2813,0.28687,0.05,69.008 +50000,0.2813,0.28687,0.05,69.008 +50000,0.2813,0.28687,0.05,69.008 +50000,0.2813,0.28687,0.05,69.008 +50000,0.2813,0.28687,0.05,69.008 +50000,0.28686,0.29255,0.05,70.105 +50000,0.28686,0.29255,0.05,70.105 +50000,0.28686,0.29255,0.05,70.105 +50000,0.28686,0.29255,0.05,70.105 +50000,0.28686,0.29255,0.05,70.105 +50000,0.28686,0.29255,0.05,70.105 +50000,0.29254,0.29834,0.05,71.189 +50000,0.29254,0.29834,0.05,71.189 +50000,0.29254,0.29834,0.05,71.189 +50000,0.29254,0.29834,0.05,71.189 +50000,0.29254,0.29834,0.05,71.189 +50000,0.29254,0.29834,0.05,71.189 +50000,0.29833,0.30425,0.05,72.259 +50000,0.29833,0.30425,0.05,72.259 +50000,0.29833,0.30425,0.05,72.259 +50000,0.29833,0.30425,0.05,72.259 +50000,0.29833,0.30425,0.05,72.259 +50000,0.29833,0.30425,0.05,72.259 +50000,0.30424,0.31027,0.05,73.315 +50000,0.30424,0.31027,0.05,73.315 +50000,0.30424,0.31027,0.05,73.315 +50000,0.30424,0.31027,0.05,73.315 +50000,0.30424,0.31027,0.05,73.315 +50000,0.30424,0.31027,0.05,73.315 +50000,0.31026,0.31641,0.05,74.357 +50000,0.31026,0.31641,0.05,74.357 +50000,0.31026,0.31641,0.05,74.357 +50000,0.31026,0.31641,0.05,74.357 +50000,0.31026,0.31641,0.05,74.357 +50000,0.31026,0.31641,0.05,74.357 +50000,0.3164,0.32267,0.05,75.384 +50000,0.3164,0.32267,0.05,75.384 +50000,0.3164,0.32267,0.05,75.384 +50000,0.3164,0.32267,0.05,75.384 +50000,0.3164,0.32267,0.05,75.384 +50000,0.3164,0.32267,0.05,75.384 +50000,0.32266,0.32906,0.05,76.395 +50000,0.32266,0.32906,0.05,76.395 +50000,0.32266,0.32906,0.05,76.395 +50000,0.32266,0.32906,0.05,76.395 +50000,0.32266,0.32906,0.05,76.395 +50000,0.32266,0.32906,0.05,76.395 +50000,0.32266,0.32906,0.05,76.395 +50000,0.32905,0.33558,0.05,77.389 +50000,0.32905,0.33558,0.05,77.389 +50000,0.32905,0.33558,0.05,77.389 +50000,0.32905,0.33558,0.05,77.389 +50000,0.32905,0.33558,0.05,77.389 +50000,0.32905,0.33558,0.05,77.389 +50000,0.33556,0.34222,0.05,78.367 +50000,0.33556,0.34222,0.05,78.367 +50000,0.33556,0.34222,0.05,78.367 +50000,0.33556,0.34222,0.05,78.367 +50000,0.33556,0.34222,0.05,78.367 +50000,0.33556,0.34222,0.05,78.367 +50000,0.33556,0.34222,0.05,78.367 +50000,0.34221,0.34899,0.05,79.327 +50000,0.34221,0.34899,0.05,79.327 +50000,0.34221,0.34899,0.05,79.327 +50000,0.34221,0.34899,0.05,79.327 +50000,0.34221,0.34899,0.05,79.327 +50000,0.34221,0.34899,0.05,79.327 +50000,0.34221,0.34899,0.05,79.327 +50000,0.34898,0.3559,0.05,80.269 +50000,0.34898,0.3559,0.05,80.269 +50000,0.34898,0.3559,0.05,80.269 +50000,0.34898,0.3559,0.05,80.269 +50000,0.34898,0.3559,0.05,80.269 +50000,0.34898,0.3559,0.05,80.269 +50000,0.35589,0.36295,0.05,81.192 +50000,0.35589,0.36295,0.05,81.192 +50000,0.35589,0.36295,0.05,81.192 +50000,0.35589,0.36295,0.05,81.192 +50000,0.35589,0.36295,0.05,81.192 +50000,0.35589,0.36295,0.05,81.192 +50000,0.35589,0.36295,0.05,81.192 +50000,0.36294,0.37013,0.05,82.097 +50000,0.36294,0.37013,0.05,82.097 +50000,0.36294,0.37013,0.05,82.097 +50000,0.36294,0.37013,0.05,82.097 +50000,0.36294,0.37013,0.05,82.097 +50000,0.36294,0.37013,0.05,82.097 +50000,0.36294,0.37013,0.05,82.097 +50000,0.36294,0.37013,0.05,82.097 +50000,0.37012,0.37746,0.05,82.981 +50000,0.37012,0.37746,0.05,82.981 +50000,0.37012,0.37746,0.05,82.981 +50000,0.37012,0.37746,0.05,82.981 +50000,0.37012,0.37746,0.05,82.981 +50000,0.37012,0.37746,0.05,82.981 +50000,0.37012,0.37746,0.05,82.981 +50000,0.37745,0.38494,0.05,83.845 +50000,0.37745,0.38494,0.05,83.845 +50000,0.37745,0.38494,0.05,83.845 +50000,0.37745,0.38494,0.05,83.845 +50000,0.37745,0.38494,0.05,83.845 +50000,0.37745,0.38494,0.05,83.845 +50000,0.37745,0.38494,0.05,83.845 +50000,0.38493,0.39256,0.05,84.688 +50000,0.38493,0.39256,0.05,84.688 +50000,0.38493,0.39256,0.05,84.688 +50000,0.38493,0.39256,0.05,84.688 +50000,0.38493,0.39256,0.05,84.688 +50000,0.38493,0.39256,0.05,84.688 +50000,0.38493,0.39256,0.05,84.688 +50000,0.38493,0.39256,0.05,84.688 +50000,0.39255,0.40033,0.05,85.51 +50000,0.39255,0.40033,0.05,85.51 +50000,0.39255,0.40033,0.05,85.51 +50000,0.39255,0.40033,0.05,85.51 +50000,0.39255,0.40033,0.05,85.51 +50000,0.39255,0.40033,0.05,85.51 +50000,0.39255,0.40033,0.05,85.51 +50000,0.39255,0.40033,0.05,85.51 +50000,0.40032,0.40826,0.05,86.311 +50000,0.40032,0.40826,0.05,86.311 +50000,0.40032,0.40826,0.05,86.311 +50000,0.40032,0.40826,0.05,86.311 +50000,0.40032,0.40826,0.05,86.311 +50000,0.40032,0.40826,0.05,86.311 +50000,0.40032,0.40826,0.05,86.311 +50000,0.40032,0.40826,0.05,86.311 +50000,0.40825,0.41634,0.05,87.089 +50000,0.40825,0.41634,0.05,87.089 +50000,0.40825,0.41634,0.05,87.089 +50000,0.40825,0.41634,0.05,87.089 +50000,0.40825,0.41634,0.05,87.089 +50000,0.40825,0.41634,0.05,87.089 +50000,0.40825,0.41634,0.05,87.089 +50000,0.40825,0.41634,0.05,87.089 +50000,0.41633,0.42459,0.05,87.845 +50000,0.41633,0.42459,0.05,87.845 +50000,0.41633,0.42459,0.05,87.845 +50000,0.41633,0.42459,0.05,87.845 +50000,0.41633,0.42459,0.05,87.845 +50000,0.41633,0.42459,0.05,87.845 +50000,0.41633,0.42459,0.05,87.845 +50000,0.41633,0.42459,0.05,87.845 +50000,0.42458,0.433,0.05,88.577 +50000,0.42458,0.433,0.05,88.577 +50000,0.42458,0.433,0.05,88.577 +50000,0.42458,0.433,0.05,88.577 +50000,0.42458,0.433,0.05,88.577 +50000,0.42458,0.433,0.05,88.577 +50000,0.42458,0.433,0.05,88.577 +50000,0.42458,0.433,0.05,88.577 +50000,0.42458,0.433,0.05,88.577 +50000,0.43298,0.44157,0.05,89.287 +50000,0.43298,0.44157,0.05,89.287 +50000,0.43298,0.44157,0.05,89.287 +50000,0.43298,0.44157,0.05,89.287 +50000,0.43298,0.44157,0.05,89.287 +50000,0.43298,0.44157,0.05,89.287 +50000,0.43298,0.44157,0.05,89.287 +50000,0.43298,0.44157,0.05,89.287 +50000,0.44156,0.45031,0.05,89.973 +50000,0.44156,0.45031,0.05,89.973 +50000,0.44156,0.45031,0.05,89.973 +50000,0.44156,0.45031,0.05,89.973 +50000,0.44156,0.45031,0.05,89.973 +50000,0.44156,0.45031,0.05,89.973 +50000,0.44156,0.45031,0.05,89.973 +50000,0.44156,0.45031,0.05,89.973 +50000,0.44156,0.45031,0.05,89.973 +50000,0.4503,0.45923,0.05,90.636 +50000,0.4503,0.45923,0.05,90.636 +50000,0.4503,0.45923,0.05,90.636 +50000,0.4503,0.45923,0.05,90.636 +50000,0.4503,0.45923,0.05,90.636 +50000,0.4503,0.45923,0.05,90.636 +50000,0.4503,0.45923,0.05,90.636 +50000,0.4503,0.45923,0.05,90.636 +50000,0.4503,0.45923,0.05,90.636 +50000,0.45922,0.46833,0.05,91.275 +50000,0.45922,0.46833,0.05,91.275 +50000,0.45922,0.46833,0.05,91.275 +50000,0.45922,0.46833,0.05,91.275 +50000,0.45922,0.46833,0.05,91.275 +50000,0.45922,0.46833,0.05,91.275 +50000,0.45922,0.46833,0.05,91.275 +50000,0.45922,0.46833,0.05,91.275 +50000,0.45922,0.46833,0.05,91.275 +50000,0.46832,0.4776,0.05,91.89 +50000,0.46832,0.4776,0.05,91.89 +50000,0.46832,0.4776,0.05,91.89 +50000,0.46832,0.4776,0.05,91.89 +50000,0.46832,0.4776,0.05,91.89 +50000,0.46832,0.4776,0.05,91.89 +50000,0.46832,0.4776,0.05,91.89 +50000,0.46832,0.4776,0.05,91.89 +50000,0.46832,0.4776,0.05,91.89 +50000,0.47759,0.48706,0.05,92.481 +50000,0.47759,0.48706,0.05,92.481 +50000,0.47759,0.48706,0.05,92.481 +50000,0.47759,0.48706,0.05,92.481 +50000,0.47759,0.48706,0.05,92.481 +50000,0.47759,0.48706,0.05,92.481 +50000,0.47759,0.48706,0.05,92.481 +50000,0.47759,0.48706,0.05,92.481 +50000,0.47759,0.48706,0.05,92.481 +50000,0.47759,0.48706,0.05,92.481 +50000,0.48705,0.49671,0.05,93.049 +50000,0.48705,0.49671,0.05,93.049 +50000,0.48705,0.49671,0.05,93.049 +50000,0.48705,0.49671,0.05,93.049 +50000,0.48705,0.49671,0.05,93.049 +50000,0.48705,0.49671,0.05,93.049 +50000,0.48705,0.49671,0.05,93.049 +50000,0.48705,0.49671,0.05,93.049 +50000,0.48705,0.49671,0.05,93.049 +50000,0.4967,0.50655,0.05,93.593 +50000,0.4967,0.50655,0.05,93.593 +50000,0.4967,0.50655,0.05,93.593 +50000,0.4967,0.50655,0.05,93.593 +50000,0.4967,0.50655,0.05,93.593 +50000,0.4967,0.50655,0.05,93.593 +50000,0.4967,0.50655,0.05,93.593 +50000,0.4967,0.50655,0.05,93.593 +50000,0.4967,0.50655,0.05,93.593 +50000,0.4967,0.50655,0.05,93.593 +50000,0.50654,0.51658,0.05,94.113 +50000,0.50654,0.51658,0.05,94.113 +50000,0.50654,0.51658,0.05,94.113 +50000,0.50654,0.51658,0.05,94.113 +50000,0.50654,0.51658,0.05,94.113 +50000,0.50654,0.51658,0.05,94.113 +50000,0.50654,0.51658,0.05,94.113 +50000,0.50654,0.51658,0.05,94.113 +50000,0.50654,0.51658,0.05,94.113 +50000,0.50654,0.51658,0.05,94.113 +50000,0.51657,0.52681,0.05,94.611 +50000,0.51657,0.52681,0.05,94.611 +50000,0.51657,0.52681,0.05,94.611 +50000,0.51657,0.52681,0.05,94.611 +50000,0.51657,0.52681,0.05,94.611 +50000,0.51657,0.52681,0.05,94.611 +50000,0.51657,0.52681,0.05,94.611 +50000,0.51657,0.52681,0.05,94.611 +50000,0.51657,0.52681,0.05,94.611 +50000,0.51657,0.52681,0.05,94.611 +50000,0.5268,0.53725,0.05,95.086 +50000,0.5268,0.53725,0.05,95.086 +50000,0.5268,0.53725,0.05,95.086 +50000,0.5268,0.53725,0.05,95.086 +50000,0.5268,0.53725,0.05,95.086 +50000,0.5268,0.53725,0.05,95.086 +50000,0.5268,0.53725,0.05,95.086 +50000,0.5268,0.53725,0.05,95.086 +50000,0.5268,0.53725,0.05,95.086 +50000,0.5268,0.53725,0.05,95.086 +50000,0.5268,0.53725,0.05,95.086 +50000,0.53724,0.54789,0.05,95.539 +50000,0.53724,0.54789,0.05,95.539 +50000,0.53724,0.54789,0.05,95.539 +50000,0.53724,0.54789,0.05,95.539 +50000,0.53724,0.54789,0.05,95.539 +50000,0.53724,0.54789,0.05,95.539 +50000,0.53724,0.54789,0.05,95.539 +50000,0.53724,0.54789,0.05,95.539 +50000,0.53724,0.54789,0.05,95.539 +50000,0.53724,0.54789,0.05,95.539 +50000,0.54788,0.55874,0.05,95.971 +50000,0.54788,0.55874,0.05,95.971 +50000,0.54788,0.55874,0.05,95.971 +50000,0.54788,0.55874,0.05,95.971 +50000,0.54788,0.55874,0.05,95.971 +50000,0.54788,0.55874,0.05,95.971 +50000,0.54788,0.55874,0.05,95.971 +50000,0.54788,0.55874,0.05,95.971 +50000,0.54788,0.55874,0.05,95.971 +50000,0.54788,0.55874,0.05,95.971 +50000,0.54788,0.55874,0.05,95.971 +50000,0.55873,0.56981,0.05,96.382 +50000,0.55873,0.56981,0.05,96.382 +50000,0.55873,0.56981,0.05,96.382 +50000,0.55873,0.56981,0.05,96.382 +50000,0.55873,0.56981,0.05,96.382 +50000,0.55873,0.56981,0.05,96.382 +50000,0.55873,0.56981,0.05,96.382 +50000,0.55873,0.56981,0.05,96.382 +50000,0.55873,0.56981,0.05,96.382 +50000,0.55873,0.56981,0.05,96.382 +50000,0.55873,0.56981,0.05,96.382 +50000,0.5698,0.5811,0.05,96.773 +50000,0.5698,0.5811,0.05,96.773 +50000,0.5698,0.5811,0.05,96.773 +50000,0.5698,0.5811,0.05,96.773 +50000,0.5698,0.5811,0.05,96.773 +50000,0.5698,0.5811,0.05,96.773 +50000,0.5698,0.5811,0.05,96.773 +50000,0.5698,0.5811,0.05,96.773 +50000,0.5698,0.5811,0.05,96.773 +50000,0.5698,0.5811,0.05,96.773 +50000,0.5698,0.5811,0.05,96.773 +50000,0.5698,0.5811,0.05,96.773 +50000,0.58109,0.59261,0.05,97.145 +50000,0.58109,0.59261,0.05,97.145 +50000,0.58109,0.59261,0.05,97.145 +50000,0.58109,0.59261,0.05,97.145 +50000,0.58109,0.59261,0.05,97.145 +50000,0.58109,0.59261,0.05,97.145 +50000,0.58109,0.59261,0.05,97.145 +50000,0.58109,0.59261,0.05,97.145 +50000,0.58109,0.59261,0.05,97.145 +50000,0.58109,0.59261,0.05,97.145 +50000,0.58109,0.59261,0.05,97.145 +50000,0.5926,0.60435,0.05,97.499 +50000,0.5926,0.60435,0.05,97.499 +50000,0.5926,0.60435,0.05,97.499 +50000,0.5926,0.60435,0.05,97.499 +50000,0.5926,0.60435,0.05,97.499 +50000,0.5926,0.60435,0.05,97.499 +50000,0.5926,0.60435,0.05,97.499 +50000,0.5926,0.60435,0.05,97.499 +50000,0.5926,0.60435,0.05,97.499 +50000,0.5926,0.60435,0.05,97.499 +50000,0.5926,0.60435,0.05,97.499 +50000,0.5926,0.60435,0.05,97.499 +50000,0.60434,0.61632,0.05,97.837 +50000,0.60434,0.61632,0.05,97.837 +50000,0.60434,0.61632,0.05,97.837 +50000,0.60434,0.61632,0.05,97.837 +50000,0.60434,0.61632,0.05,97.837 +50000,0.60434,0.61632,0.05,97.837 +50000,0.60434,0.61632,0.05,97.837 +50000,0.60434,0.61632,0.05,97.837 +50000,0.60434,0.61632,0.05,97.837 +50000,0.60434,0.61632,0.05,97.837 +50000,0.60434,0.61632,0.05,97.837 +50000,0.60434,0.61632,0.05,97.837 +50000,0.61631,0.62853,0.05,98.159 +50000,0.61631,0.62853,0.05,98.159 +50000,0.61631,0.62853,0.05,98.159 +50000,0.61631,0.62853,0.05,98.159 +50000,0.61631,0.62853,0.05,98.159 +50000,0.61631,0.62853,0.05,98.159 +50000,0.61631,0.62853,0.05,98.159 +50000,0.61631,0.62853,0.05,98.159 +50000,0.61631,0.62853,0.05,98.159 +50000,0.61631,0.62853,0.05,98.159 +50000,0.61631,0.62853,0.05,98.159 +50000,0.61631,0.62853,0.05,98.159 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.62852,0.64098,0.05,98.468 +50000,0.64097,0.65368,0.05,98.764 +50000,0.64097,0.65368,0.05,98.764 +50000,0.64097,0.65368,0.05,98.764 +50000,0.64097,0.65368,0.05,98.764 +50000,0.64097,0.65368,0.05,98.764 +50000,0.64097,0.65368,0.05,98.764 +50000,0.64097,0.65368,0.05,98.764 +50000,0.64097,0.65368,0.05,98.764 +50000,0.64097,0.65368,0.05,98.764 +50000,0.64097,0.65368,0.05,98.764 +50000,0.64097,0.65368,0.05,98.764 +50000,0.64097,0.65368,0.05,98.764 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.65367,0.66663,0.05,99.05 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.66662,0.67984,0.05,99.328 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.67983,0.69331,0.05,99.6 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,0.6933,0.70704,0.05,99.868 +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/temperatureDependentSinglePhaseThermalConductivity_plot.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/temperatureDependentSinglePhaseThermalConductivity_plot.py new file mode 100644 index 00000000000..a6ed534271d --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/temperatureDependentSinglePhaseThermalConductivity_plot.py @@ -0,0 +1,205 @@ +import os +import sys + +import numpy as np +import matplotlib.pyplot as plt +import pandas as pd +import scipy.linalg +from scipy import special + +from scipy.sparse import diags +from scipy.sparse.linalg import spsolve + +from xml.etree import ElementTree + +# Analytical results for linear thermal behavior +def steadyState(Tin, Tout, Rin, Rout, radialCoordinate): + return Tin + (Tout - Tin) * (np.log(radialCoordinate) - np.log(Rin)) / (np.log(Rout) - np.log(Rin)) + +def diffusionFunction(radialCoordinate, Rin, diffusionCoefficient, diffusionTime): + return special.erfc( (radialCoordinate - Rin) / 2.0 / np.sqrt( diffusionCoefficient * diffusionTime ) ) + +def computeTransientTemperature(Tin, Tout, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime): + # Ref. Wang and Papamichos (1994), https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94WR01774 + return Tout + (Tin-Tout) * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) + +def computeThermalDiffusionCoefficient(thermalConductivity, volumetricHeatCapacity): + return thermalConductivity / volumetricHeatCapacity + +# Finite difference results for non-linear thermal behavior +def temperatureDependentThermalConductivity(lambda0, lambda_gradient, T, Treference): + return lambda0 + lambda_gradient*(T-Treference) + +def temperatureDependentVolumetricHeat(c0, c_gradient, T, Treference): + return c0 + c_gradient*(T-Treference) + +def coefficientMatrix(thermalConductivity, volumetricHeatCapacity, r, dt, N): + # Coefficients for the matrix + A = np.zeros((N+1, N+1)) + + for i in range(1,N): + dr = r[i] - r[i-1] + r_i = r[i] + + diffusivity_i = thermalConductivity[i]/volumetricHeatCapacity[i] + A[i, i-1] = - diffusivity_i * (dt/(dr**2) - dt/(2 * r_i * dr)) \ + + (thermalConductivity[i+1] - thermalConductivity[i-1])/volumetricHeatCapacity[i]*dt/4/(dr**2) + A[i, i] = 1.0 + 2.0 * diffusivity_i * dt / (dr**2) + A[i, i+1] = - diffusivity_i * (dt/(dr**2) + dt/(2 * r_i * dr)) \ + - (thermalConductivity[i+1] - thermalConductivity[i-1])/volumetricHeatCapacity[i]*dt/4/(dr**2) + + # Boundary conditions + # No-flux at r=0 approximated by setting the flux between the first two cells to zero + A[0, 0] = 1.0 + A[N, N] = 1.0 + return A + +def solve_radial_diffusion(r, tmax, dt, Tin, Tout, lambda0, lambda_gradient, c0, c_gradient, Treference): + N = len(r)-1 + # Time setup + n_steps = int(tmax / dt) + + # Time-stepping + T = np.zeros(N+1) + Tout # initial condition u(r, 0) + T[0] = Tin + for step in range(n_steps): + thermalConductivity = temperatureDependentThermalConductivity(lambda0, lambda_gradient, T, Treference) + + volumetricHeatCapacity = temperatureDependentVolumetricHeat(c0, c_gradient, T, Treference) + + A = coefficientMatrix(thermalConductivity, volumetricHeatCapacity, r, dt, N) + T = spsolve(A, T) + + return T + + +def extractDataFromXMLList(paramList): + # Extract data from a list in XML such as "{ 1, 2, 3}" + return paramList.replace('{', '').replace('}', '').strip().split(',') + +def getWellboreGeometryFromXML(xmlFilePath): + tree = ElementTree.parse(xmlFilePath) + + meshParam = tree.find('Mesh/InternalWellbore') + radii = extractDataFromXMLList( meshParam.get("radius") ) + + Rin = float(radii[0]) + Rout = float(radii[-1]) + + return [Rin, Rout] + +def getLoadingFromXML(xmlFilePath): + tree = ElementTree.parse(xmlFilePath) + fsParams = tree.findall('FieldSpecifications/FieldSpecification') + + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "pressure") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Pin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Pout = float(fsParam.get('scale')) + + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "temperature") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Tin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Tout = float(fsParam.get('scale')) + + + tree_SinglePhaseThermalConductivities = tree.findall('Constitutive/SinglePhaseThermalConductivity') + + for tree_SinglePhaseThermalConductivity in tree_SinglePhaseThermalConductivities: + if tree_SinglePhaseThermalConductivity.get('name') == "thermalCond_nonLinear": + defaultThermalConductivity = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('defaultThermalConductivityComponents') )[0] ) + + thermalConductivityGradient = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('thermalConductivityGradientComponents') )[0] ) + referenceTemperature = float( tree_SinglePhaseThermalConductivity.get('referenceTemperature') ) + + + tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') + + for tree_SolidInternalEnergy in tree_SolidInternalEnergies: + if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_linear": + volumetricHeatCapacity = float( tree_SolidInternalEnergy.get('referenceVolumetricHeatCapacity') ) + dVolumetricHeatCapacity_dTemperature = 0.0 + + + permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) + + porosity = float( tree.find('Constitutive/PressurePorosity').get('defaultReferencePorosity') ) + + fluidViscosity = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('defaultViscosity') ) + + fluidCompressibility = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('compressibility') ) + + fluidThermalExpansionCoefficient = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('thermalExpansionCoeff') ) + + return [Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient] + + +def main(): + + xmlFilePath = "../../../../../../../inputFiles/singlePhaseFlow/" + + Rin, Rout = getWellboreGeometryFromXML(xmlFilePath+"thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml") + + Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient = getLoadingFromXML(xmlFilePath+"thermalCompressible_2d_base.xml") + + plt.figure(figsize=(10,7)) + font = {'size' : 16} + plt.rc('font', **font) + + for chart_idx, idx in enumerate([1, 2, 5, 10]): + # Numerical results + data = pd.read_csv(f'data_{idx}.csv') + data.dropna(inplace=True) + data.drop_duplicates(inplace=True) + data.reset_index(drop=True, inplace=True) + + radialCoordinate = (data['elementCenter:0']**2.0 + data['elementCenter:1']**2.0)**0.5 + temperature = data['temperature'] + #pressure = data['pressure'] + diffusionTime = data['Time'][0] + + # Analytical results for linear thermal behavior, for comparison + radialCoordinate_anal = np.arange(Rin, Rout, (Rout-Rin)/100) + + thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(defaultThermalConductivity, volumetricHeatCapacity) + + T_transient_linear = computeTransientTemperature(Tin, Tout, Rin, radialCoordinate_anal, thermalDiffusionCoefficient, diffusionTime) + + # Analytical results of the steady state regime for comparison + T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate_anal) + + # Finite different results for non-linear thermal behavior + + T_transient_nonLinear = solve_radial_diffusion(radialCoordinate_anal, diffusionTime, diffusionTime/1000, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature) + + # Visualization + # Temperature + plt.subplot(2,2,chart_idx+1) + plt.plot( radialCoordinate, temperature, 'k+' , label='GEOS' ) + plt.plot( radialCoordinate_anal, T_transient_nonLinear, 'g.' , label='FDM Non-Linear' ) + plt.plot( radialCoordinate_anal, T_transient_linear, 'r-' , label='Analytic Linear' ) + plt.plot( radialCoordinate_anal, T_steadyState, 'b-' , label='Steady State' ) + + if chart_idx==1: + plt.legend() + + if chart_idx in [2,3]: + plt.xlabel('Radial distance from well center') + + if chart_idx in [0,2]: + plt.ylabel('Temperature (°C)') + + plt.ylim(Tin-10,Tout+10) + plt.xlim(0.1,0.3) + plt.title('t = '+str(diffusionTime)+'(s)') + plt.tight_layout() + + plt.show() + +if __name__ == "__main__": + main() + diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/Example.rst similarity index 70% rename from src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/Example.rst rename to src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/Example.rst index 9c728e39f33..959302bd7a2 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/Example.rst @@ -1,9 +1,9 @@ -.. _AdvancedExampleNonLinearThermalDiffusionWellbore: +.. _AdvancedWellboreExampleNonLinearThermalDiffusionTemperatureDependentVolumetricHeatCapacity: -#################################################### -Non-Linear Thermal Diffusion Around a Wellbore -#################################################### +############################################################################################################ +Non-Linear Thermal Diffusion Around a Wellbore: The Case with Temperature Dependent Volumetric Heat Capacity +############################################################################################################ ------------------------------------------------------------------ Problem description @@ -25,7 +25,7 @@ and .. code-block:: console - inputFiles/singlePhaseFlow/thermalCompressible_nonLinear_2d_benchmark.xml + inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentVolumetricHeatCapacity_benchmark.xml In this example, we focus on the ``Constitutive`` tag. @@ -46,10 +46,10 @@ The reference value of the volumetric heat capacity of the medium around the wel Results and benchmark --------------------------------- -A good agreement between the results obtained using GEOS and the analytical results is shown in the figure below: +A good agreement between the results obtained using GEOS and the reference results that are obtained by the classical finite difference method is shown in the figure below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py +.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/temperatureDependentVolumetricHeatCapacity_plot.py ------------------------------------------------------------------ @@ -58,5 +58,5 @@ To go further **Feedback on this example** -This concludes the example of a non-linear thermal diffusion problem around a wellbore. +This concludes the example of a non-linear thermal diffusion problem around a wellbore due to temperature dependent volumetric heat capacity of rock. For any feedback on this example, please submit a `GitHub issue on the project's GitHub page `_. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_1.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_1.csv new file mode 100644 index 00000000000..92fbae1a86a --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_1.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,0.07071,0.072112,0.05,-13.76 +10000,0.07071,0.072112,0.05,-13.76 +10000,0.07211,0.07354,0.05,-1.5083 +10000,0.07351,0.074968,0.05,10.502 +10000,0.075155,0.076646,0.05,24.239 +10000,0.075155,0.076646,0.05,24.239 +10000,0.077046,0.078574,0.05,39.135 +10000,0.077046,0.078574,0.05,39.135 +10000,0.078936,0.080501,0.05,52.698 +10000,0.078936,0.080501,0.05,52.698 +10000,0.080826,0.082429,0.05,64.497 +10000,0.080826,0.082429,0.05,64.497 +10000,0.082716,0.084357,0.05,74.262 +10000,0.082716,0.084357,0.05,74.262 +10000,0.084607,0.086285,0.05,81.944 +10000,0.084607,0.086285,0.05,81.944 +10000,0.086497,0.088212,0.05,87.71 +10000,0.086497,0.088212,0.05,87.71 +10000,0.088387,0.09014,0.05,91.858 +10000,0.088387,0.09014,0.05,91.858 +10000,0.090278,0.092068,0.05,94.735 +10000,0.090278,0.092068,0.05,94.735 +10000,0.092168,0.093995,0.05,96.667 +10000,0.092168,0.093995,0.05,96.667 +10000,0.094031,0.095896,0.05,97.913 +10000,0.095885,0.097786,0.05,98.714 +10000,0.095885,0.097786,0.05,98.714 +10000,0.097776,0.099715,0.05,99.227 +10000,0.097776,0.099715,0.05,99.227 +10000,0.099704,0.10168,0.05,99.547 +10000,0.099704,0.10168,0.05,99.547 +10000,0.10167,0.10369,0.05,99.741 +10000,0.10167,0.10369,0.05,99.741 +10000,0.10368,0.10573,0.05,99.855 +10000,0.10368,0.10573,0.05,99.855 +10000,0.10572,0.10782,0.05,99.921 +10000,0.10572,0.10782,0.05,99.921 +10000,0.10781,0.10995,0.05,99.958 +10000,0.10781,0.10995,0.05,99.958 +10000,0.10993,0.11211,0.05,99.978 +10000,0.10993,0.11211,0.05,99.978 +10000,0.10993,0.11211,0.05,99.978 +10000,0.1121,0.11433,0.05,99.989 +10000,0.1121,0.11433,0.05,99.989 +10000,0.11432,0.11658,0.05,99.995 +10000,0.11432,0.11658,0.05,99.995 +10000,0.11657,0.11888,0.05,99.997 +10000,0.11657,0.11888,0.05,99.997 +10000,0.11887,0.12123,0.05,99.999 +10000,0.11887,0.12123,0.05,99.999 +10000,0.11887,0.12123,0.05,99.999 +10000,0.12122,0.12362,0.05,99.999 +10000,0.12122,0.12362,0.05,99.999 +10000,0.12361,0.12607,0.05,100 +10000,0.12361,0.12607,0.05,100 +10000,0.12361,0.12607,0.05,100 +10000,0.12605,0.12855,0.05,100 +10000,0.12605,0.12855,0.05,100 +10000,0.12854,0.13109,0.05,100 +10000,0.12854,0.13109,0.05,100 +10000,0.12854,0.13109,0.05,100 +10000,0.13108,0.13368,0.05,100 +10000,0.13108,0.13368,0.05,100 +10000,0.13367,0.13632,0.05,100 +10000,0.13367,0.13632,0.05,100 +10000,0.13367,0.13632,0.05,100 +10000,0.13631,0.13901,0.05,100 +10000,0.13631,0.13901,0.05,100 +10000,0.13631,0.13901,0.05,100 +10000,0.139,0.14176,0.05,100 +10000,0.139,0.14176,0.05,100 +10000,0.14175,0.14456,0.05,100 +10000,0.14175,0.14456,0.05,100 +10000,0.14175,0.14456,0.05,100 +10000,0.14455,0.14742,0.05,100 +10000,0.14455,0.14742,0.05,100 +10000,0.14455,0.14742,0.05,100 +10000,0.1474,0.15033,0.05,100 +10000,0.1474,0.15033,0.05,100 +10000,0.1474,0.15033,0.05,100 +10000,0.15032,0.1533,0.05,100 +10000,0.15032,0.1533,0.05,100 +10000,0.15032,0.1533,0.05,100 +10000,0.15329,0.15633,0.05,100 +10000,0.15329,0.15633,0.05,100 +10000,0.15329,0.15633,0.05,100 +10000,0.15632,0.15942,0.05,100 +10000,0.15632,0.15942,0.05,100 +10000,0.15632,0.15942,0.05,100 +10000,0.15941,0.16257,0.05,100 +10000,0.15941,0.16257,0.05,100 +10000,0.15941,0.16257,0.05,100 +10000,0.16256,0.16578,0.05,100 +10000,0.16256,0.16578,0.05,100 +10000,0.16256,0.16578,0.05,100 +10000,0.16577,0.16906,0.05,100 +10000,0.16577,0.16906,0.05,100 +10000,0.16577,0.16906,0.05,100 +10000,0.16577,0.16906,0.05,100 +10000,0.16905,0.1724,0.05,100 +10000,0.16905,0.1724,0.05,100 +10000,0.16905,0.1724,0.05,100 +10000,0.17239,0.1758,0.05,100 +10000,0.17239,0.1758,0.05,100 +10000,0.17239,0.1758,0.05,100 +10000,0.17579,0.17928,0.05,100 +10000,0.17579,0.17928,0.05,100 +10000,0.17579,0.17928,0.05,100 +10000,0.17579,0.17928,0.05,100 +10000,0.17927,0.18282,0.05,100 +10000,0.17927,0.18282,0.05,100 +10000,0.17927,0.18282,0.05,100 +10000,0.18281,0.18644,0.05,100 +10000,0.18281,0.18644,0.05,100 +10000,0.18281,0.18644,0.05,100 +10000,0.18281,0.18644,0.05,100 +10000,0.18643,0.19013,0.05,100 +10000,0.18643,0.19013,0.05,100 +10000,0.18643,0.19013,0.05,100 +10000,0.18643,0.19013,0.05,100 +10000,0.19011,0.19388,0.05,100 +10000,0.19011,0.19388,0.05,100 +10000,0.19011,0.19388,0.05,100 +10000,0.19387,0.19772,0.05,100 +10000,0.19387,0.19772,0.05,100 +10000,0.19387,0.19772,0.05,100 +10000,0.19387,0.19772,0.05,100 +10000,0.19771,0.20163,0.05,100 +10000,0.19771,0.20163,0.05,100 +10000,0.19771,0.20163,0.05,100 +10000,0.19771,0.20163,0.05,100 +10000,0.20162,0.20562,0.05,100 +10000,0.20162,0.20562,0.05,100 +10000,0.20162,0.20562,0.05,100 +10000,0.20162,0.20562,0.05,100 +10000,0.2056,0.20968,0.05,100 +10000,0.2056,0.20968,0.05,100 +10000,0.2056,0.20968,0.05,100 +10000,0.2056,0.20968,0.05,100 +10000,0.20967,0.21383,0.05,100 +10000,0.20967,0.21383,0.05,100 +10000,0.20967,0.21383,0.05,100 +10000,0.20967,0.21383,0.05,100 +10000,0.21382,0.21806,0.05,100 +10000,0.21382,0.21806,0.05,100 +10000,0.21382,0.21806,0.05,100 +10000,0.21382,0.21806,0.05,100 +10000,0.21382,0.21806,0.05,100 +10000,0.21805,0.22237,0.05,100 +10000,0.21805,0.22237,0.05,100 +10000,0.21805,0.22237,0.05,100 +10000,0.21805,0.22237,0.05,100 +10000,0.22236,0.22677,0.05,100 +10000,0.22236,0.22677,0.05,100 +10000,0.22236,0.22677,0.05,100 +10000,0.22236,0.22677,0.05,100 +10000,0.22676,0.23125,0.05,100 +10000,0.22676,0.23125,0.05,100 +10000,0.22676,0.23125,0.05,100 +10000,0.22676,0.23125,0.05,100 +10000,0.22676,0.23125,0.05,100 +10000,0.23124,0.23583,0.05,100 +10000,0.23124,0.23583,0.05,100 +10000,0.23124,0.23583,0.05,100 +10000,0.23124,0.23583,0.05,100 +10000,0.23582,0.2405,0.05,100 +10000,0.23582,0.2405,0.05,100 +10000,0.23582,0.2405,0.05,100 +10000,0.23582,0.2405,0.05,100 +10000,0.23582,0.2405,0.05,100 +10000,0.24048,0.24525,0.05,100 +10000,0.24048,0.24525,0.05,100 +10000,0.24048,0.24525,0.05,100 +10000,0.24048,0.24525,0.05,100 +10000,0.24048,0.24525,0.05,100 +10000,0.24524,0.25011,0.05,100 +10000,0.24524,0.25011,0.05,100 +10000,0.24524,0.25011,0.05,100 +10000,0.24524,0.25011,0.05,100 +10000,0.24524,0.25011,0.05,100 +10000,0.25009,0.25505,0.05,100 +10000,0.25009,0.25505,0.05,100 +10000,0.25009,0.25505,0.05,100 +10000,0.25009,0.25505,0.05,100 +10000,0.25009,0.25505,0.05,100 +10000,0.25504,0.2601,0.05,100 +10000,0.25504,0.2601,0.05,100 +10000,0.25504,0.2601,0.05,100 +10000,0.25504,0.2601,0.05,100 +10000,0.25504,0.2601,0.05,100 +10000,0.26009,0.26525,0.05,100 +10000,0.26009,0.26525,0.05,100 +10000,0.26009,0.26525,0.05,100 +10000,0.26009,0.26525,0.05,100 +10000,0.26009,0.26525,0.05,100 +10000,0.26524,0.2705,0.05,100 +10000,0.26524,0.2705,0.05,100 +10000,0.26524,0.2705,0.05,100 +10000,0.26524,0.2705,0.05,100 +10000,0.26524,0.2705,0.05,100 +10000,0.27048,0.27585,0.05,100 +10000,0.27048,0.27585,0.05,100 +10000,0.27048,0.27585,0.05,100 +10000,0.27048,0.27585,0.05,100 +10000,0.27048,0.27585,0.05,100 +10000,0.27584,0.28131,0.05,100 +10000,0.27584,0.28131,0.05,100 +10000,0.27584,0.28131,0.05,100 +10000,0.27584,0.28131,0.05,100 +10000,0.27584,0.28131,0.05,100 +10000,0.27584,0.28131,0.05,100 +10000,0.2813,0.28687,0.05,100 +10000,0.2813,0.28687,0.05,100 +10000,0.2813,0.28687,0.05,100 +10000,0.2813,0.28687,0.05,100 +10000,0.2813,0.28687,0.05,100 +10000,0.28686,0.29255,0.05,100 +10000,0.28686,0.29255,0.05,100 +10000,0.28686,0.29255,0.05,100 +10000,0.28686,0.29255,0.05,100 +10000,0.28686,0.29255,0.05,100 +10000,0.28686,0.29255,0.05,100 +10000,0.29254,0.29834,0.05,100 +10000,0.29254,0.29834,0.05,100 +10000,0.29254,0.29834,0.05,100 +10000,0.29254,0.29834,0.05,100 +10000,0.29254,0.29834,0.05,100 +10000,0.29254,0.29834,0.05,100 +10000,0.29833,0.30425,0.05,100 +10000,0.29833,0.30425,0.05,100 +10000,0.29833,0.30425,0.05,100 +10000,0.29833,0.30425,0.05,100 +10000,0.29833,0.30425,0.05,100 +10000,0.29833,0.30425,0.05,100 +10000,0.30424,0.31027,0.05,100 +10000,0.30424,0.31027,0.05,100 +10000,0.30424,0.31027,0.05,100 +10000,0.30424,0.31027,0.05,100 +10000,0.30424,0.31027,0.05,100 +10000,0.30424,0.31027,0.05,100 +10000,0.31026,0.31641,0.05,100 +10000,0.31026,0.31641,0.05,100 +10000,0.31026,0.31641,0.05,100 +10000,0.31026,0.31641,0.05,100 +10000,0.31026,0.31641,0.05,100 +10000,0.31026,0.31641,0.05,100 +10000,0.3164,0.32267,0.05,100 +10000,0.3164,0.32267,0.05,100 +10000,0.3164,0.32267,0.05,100 +10000,0.3164,0.32267,0.05,100 +10000,0.3164,0.32267,0.05,100 +10000,0.3164,0.32267,0.05,100 +10000,0.32266,0.32906,0.05,100 +10000,0.32266,0.32906,0.05,100 +10000,0.32266,0.32906,0.05,100 +10000,0.32266,0.32906,0.05,100 +10000,0.32266,0.32906,0.05,100 +10000,0.32266,0.32906,0.05,100 +10000,0.32266,0.32906,0.05,100 +10000,0.32905,0.33558,0.05,100 +10000,0.32905,0.33558,0.05,100 +10000,0.32905,0.33558,0.05,100 +10000,0.32905,0.33558,0.05,100 +10000,0.32905,0.33558,0.05,100 +10000,0.32905,0.33558,0.05,100 +10000,0.33556,0.34222,0.05,100 +10000,0.33556,0.34222,0.05,100 +10000,0.33556,0.34222,0.05,100 +10000,0.33556,0.34222,0.05,100 +10000,0.33556,0.34222,0.05,100 +10000,0.33556,0.34222,0.05,100 +10000,0.33556,0.34222,0.05,100 +10000,0.34221,0.34899,0.05,100 +10000,0.34221,0.34899,0.05,100 +10000,0.34221,0.34899,0.05,100 +10000,0.34221,0.34899,0.05,100 +10000,0.34221,0.34899,0.05,100 +10000,0.34221,0.34899,0.05,100 +10000,0.34221,0.34899,0.05,100 +10000,0.34898,0.3559,0.05,100 +10000,0.34898,0.3559,0.05,100 +10000,0.34898,0.3559,0.05,100 +10000,0.34898,0.3559,0.05,100 +10000,0.34898,0.3559,0.05,100 +10000,0.34898,0.3559,0.05,100 +10000,0.35589,0.36295,0.05,100 +10000,0.35589,0.36295,0.05,100 +10000,0.35589,0.36295,0.05,100 +10000,0.35589,0.36295,0.05,100 +10000,0.35589,0.36295,0.05,100 +10000,0.35589,0.36295,0.05,100 +10000,0.35589,0.36295,0.05,100 +10000,0.36294,0.37013,0.05,100 +10000,0.36294,0.37013,0.05,100 +10000,0.36294,0.37013,0.05,100 +10000,0.36294,0.37013,0.05,100 +10000,0.36294,0.37013,0.05,100 +10000,0.36294,0.37013,0.05,100 +10000,0.36294,0.37013,0.05,100 +10000,0.36294,0.37013,0.05,100 +10000,0.37012,0.37746,0.05,100 +10000,0.37012,0.37746,0.05,100 +10000,0.37012,0.37746,0.05,100 +10000,0.37012,0.37746,0.05,100 +10000,0.37012,0.37746,0.05,100 +10000,0.37012,0.37746,0.05,100 +10000,0.37012,0.37746,0.05,100 +10000,0.37745,0.38494,0.05,100 +10000,0.37745,0.38494,0.05,100 +10000,0.37745,0.38494,0.05,100 +10000,0.37745,0.38494,0.05,100 +10000,0.37745,0.38494,0.05,100 +10000,0.37745,0.38494,0.05,100 +10000,0.37745,0.38494,0.05,100 +10000,0.38493,0.39256,0.05,100 +10000,0.38493,0.39256,0.05,100 +10000,0.38493,0.39256,0.05,100 +10000,0.38493,0.39256,0.05,100 +10000,0.38493,0.39256,0.05,100 +10000,0.38493,0.39256,0.05,100 +10000,0.38493,0.39256,0.05,100 +10000,0.38493,0.39256,0.05,100 +10000,0.39255,0.40033,0.05,100 +10000,0.39255,0.40033,0.05,100 +10000,0.39255,0.40033,0.05,100 +10000,0.39255,0.40033,0.05,100 +10000,0.39255,0.40033,0.05,100 +10000,0.39255,0.40033,0.05,100 +10000,0.39255,0.40033,0.05,100 +10000,0.39255,0.40033,0.05,100 +10000,0.40032,0.40826,0.05,100 +10000,0.40032,0.40826,0.05,100 +10000,0.40032,0.40826,0.05,100 +10000,0.40032,0.40826,0.05,100 +10000,0.40032,0.40826,0.05,100 +10000,0.40032,0.40826,0.05,100 +10000,0.40032,0.40826,0.05,100 +10000,0.40032,0.40826,0.05,100 +10000,0.40825,0.41634,0.05,100 +10000,0.40825,0.41634,0.05,100 +10000,0.40825,0.41634,0.05,100 +10000,0.40825,0.41634,0.05,100 +10000,0.40825,0.41634,0.05,100 +10000,0.40825,0.41634,0.05,100 +10000,0.40825,0.41634,0.05,100 +10000,0.40825,0.41634,0.05,100 +10000,0.41633,0.42459,0.05,100 +10000,0.41633,0.42459,0.05,100 +10000,0.41633,0.42459,0.05,100 +10000,0.41633,0.42459,0.05,100 +10000,0.41633,0.42459,0.05,100 +10000,0.41633,0.42459,0.05,100 +10000,0.41633,0.42459,0.05,100 +10000,0.41633,0.42459,0.05,100 +10000,0.42458,0.433,0.05,100 +10000,0.42458,0.433,0.05,100 +10000,0.42458,0.433,0.05,100 +10000,0.42458,0.433,0.05,100 +10000,0.42458,0.433,0.05,100 +10000,0.42458,0.433,0.05,100 +10000,0.42458,0.433,0.05,100 +10000,0.42458,0.433,0.05,100 +10000,0.42458,0.433,0.05,100 +10000,0.43298,0.44157,0.05,100 +10000,0.43298,0.44157,0.05,100 +10000,0.43298,0.44157,0.05,100 +10000,0.43298,0.44157,0.05,100 +10000,0.43298,0.44157,0.05,100 +10000,0.43298,0.44157,0.05,100 +10000,0.43298,0.44157,0.05,100 +10000,0.43298,0.44157,0.05,100 +10000,0.44156,0.45031,0.05,100 +10000,0.44156,0.45031,0.05,100 +10000,0.44156,0.45031,0.05,100 +10000,0.44156,0.45031,0.05,100 +10000,0.44156,0.45031,0.05,100 +10000,0.44156,0.45031,0.05,100 +10000,0.44156,0.45031,0.05,100 +10000,0.44156,0.45031,0.05,100 +10000,0.44156,0.45031,0.05,100 +10000,0.4503,0.45923,0.05,100 +10000,0.4503,0.45923,0.05,100 +10000,0.4503,0.45923,0.05,100 +10000,0.4503,0.45923,0.05,100 +10000,0.4503,0.45923,0.05,100 +10000,0.4503,0.45923,0.05,100 +10000,0.4503,0.45923,0.05,100 +10000,0.4503,0.45923,0.05,100 +10000,0.4503,0.45923,0.05,100 +10000,0.45922,0.46833,0.05,100 +10000,0.45922,0.46833,0.05,100 +10000,0.45922,0.46833,0.05,100 +10000,0.45922,0.46833,0.05,100 +10000,0.45922,0.46833,0.05,100 +10000,0.45922,0.46833,0.05,100 +10000,0.45922,0.46833,0.05,100 +10000,0.45922,0.46833,0.05,100 +10000,0.45922,0.46833,0.05,100 +10000,0.46832,0.4776,0.05,100 +10000,0.46832,0.4776,0.05,100 +10000,0.46832,0.4776,0.05,100 +10000,0.46832,0.4776,0.05,100 +10000,0.46832,0.4776,0.05,100 +10000,0.46832,0.4776,0.05,100 +10000,0.46832,0.4776,0.05,100 +10000,0.46832,0.4776,0.05,100 +10000,0.46832,0.4776,0.05,100 +10000,0.47759,0.48706,0.05,100 +10000,0.47759,0.48706,0.05,100 +10000,0.47759,0.48706,0.05,100 +10000,0.47759,0.48706,0.05,100 +10000,0.47759,0.48706,0.05,100 +10000,0.47759,0.48706,0.05,100 +10000,0.47759,0.48706,0.05,100 +10000,0.47759,0.48706,0.05,100 +10000,0.47759,0.48706,0.05,100 +10000,0.47759,0.48706,0.05,100 +10000,0.48705,0.49671,0.05,100 +10000,0.48705,0.49671,0.05,100 +10000,0.48705,0.49671,0.05,100 +10000,0.48705,0.49671,0.05,100 +10000,0.48705,0.49671,0.05,100 +10000,0.48705,0.49671,0.05,100 +10000,0.48705,0.49671,0.05,100 +10000,0.48705,0.49671,0.05,100 +10000,0.48705,0.49671,0.05,100 +10000,0.4967,0.50655,0.05,100 +10000,0.4967,0.50655,0.05,100 +10000,0.4967,0.50655,0.05,100 +10000,0.4967,0.50655,0.05,100 +10000,0.4967,0.50655,0.05,100 +10000,0.4967,0.50655,0.05,100 +10000,0.4967,0.50655,0.05,100 +10000,0.4967,0.50655,0.05,100 +10000,0.4967,0.50655,0.05,100 +10000,0.4967,0.50655,0.05,100 +10000,0.50654,0.51658,0.05,100 +10000,0.50654,0.51658,0.05,100 +10000,0.50654,0.51658,0.05,100 +10000,0.50654,0.51658,0.05,100 +10000,0.50654,0.51658,0.05,100 +10000,0.50654,0.51658,0.05,100 +10000,0.50654,0.51658,0.05,100 +10000,0.50654,0.51658,0.05,100 +10000,0.50654,0.51658,0.05,100 +10000,0.50654,0.51658,0.05,100 +10000,0.51657,0.52681,0.05,100 +10000,0.51657,0.52681,0.05,100 +10000,0.51657,0.52681,0.05,100 +10000,0.51657,0.52681,0.05,100 +10000,0.51657,0.52681,0.05,100 +10000,0.51657,0.52681,0.05,100 +10000,0.51657,0.52681,0.05,100 +10000,0.51657,0.52681,0.05,100 +10000,0.51657,0.52681,0.05,100 +10000,0.51657,0.52681,0.05,100 +10000,0.5268,0.53725,0.05,100 +10000,0.5268,0.53725,0.05,100 +10000,0.5268,0.53725,0.05,100 +10000,0.5268,0.53725,0.05,100 +10000,0.5268,0.53725,0.05,100 +10000,0.5268,0.53725,0.05,100 +10000,0.5268,0.53725,0.05,100 +10000,0.5268,0.53725,0.05,100 +10000,0.5268,0.53725,0.05,100 +10000,0.5268,0.53725,0.05,100 +10000,0.5268,0.53725,0.05,100 +10000,0.53724,0.54789,0.05,100 +10000,0.53724,0.54789,0.05,100 +10000,0.53724,0.54789,0.05,100 +10000,0.53724,0.54789,0.05,100 +10000,0.53724,0.54789,0.05,100 +10000,0.53724,0.54789,0.05,100 +10000,0.53724,0.54789,0.05,100 +10000,0.53724,0.54789,0.05,100 +10000,0.53724,0.54789,0.05,100 +10000,0.53724,0.54789,0.05,100 +10000,0.54788,0.55874,0.05,100 +10000,0.54788,0.55874,0.05,100 +10000,0.54788,0.55874,0.05,100 +10000,0.54788,0.55874,0.05,100 +10000,0.54788,0.55874,0.05,100 +10000,0.54788,0.55874,0.05,100 +10000,0.54788,0.55874,0.05,100 +10000,0.54788,0.55874,0.05,100 +10000,0.54788,0.55874,0.05,100 +10000,0.54788,0.55874,0.05,100 +10000,0.54788,0.55874,0.05,100 +10000,0.55873,0.56981,0.05,100 +10000,0.55873,0.56981,0.05,100 +10000,0.55873,0.56981,0.05,100 +10000,0.55873,0.56981,0.05,100 +10000,0.55873,0.56981,0.05,100 +10000,0.55873,0.56981,0.05,100 +10000,0.55873,0.56981,0.05,100 +10000,0.55873,0.56981,0.05,100 +10000,0.55873,0.56981,0.05,100 +10000,0.55873,0.56981,0.05,100 +10000,0.55873,0.56981,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.5698,0.5811,0.05,100 +10000,0.58109,0.59261,0.05,100 +10000,0.58109,0.59261,0.05,100 +10000,0.58109,0.59261,0.05,100 +10000,0.58109,0.59261,0.05,100 +10000,0.58109,0.59261,0.05,100 +10000,0.58109,0.59261,0.05,100 +10000,0.58109,0.59261,0.05,100 +10000,0.58109,0.59261,0.05,100 +10000,0.58109,0.59261,0.05,100 +10000,0.58109,0.59261,0.05,100 +10000,0.58109,0.59261,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.5926,0.60435,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.60434,0.61632,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.61631,0.62853,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.62852,0.64098,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.64097,0.65368,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.65367,0.66663,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.66662,0.67984,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.67983,0.69331,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,0.6933,0.70704,0.05,100 +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan +10000,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_10.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_10.csv new file mode 100644 index 00000000000..f8bba333145 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_10.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,0.07071,0.072112,0.05,-17.679 +1e+05,0.07071,0.072112,0.05,-17.679 +1e+05,0.07211,0.07354,0.05,-13.128 +1e+05,0.07351,0.074968,0.05,-8.6631 +1e+05,0.075155,0.076646,0.05,-3.5144 +1e+05,0.075155,0.076646,0.05,-3.5144 +1e+05,0.077046,0.078574,0.05,2.2548 +1e+05,0.077046,0.078574,0.05,2.2548 +1e+05,0.078936,0.080501,0.05,7.8811 +1e+05,0.078936,0.080501,0.05,7.8811 +1e+05,0.080826,0.082429,0.05,13.366 +1e+05,0.080826,0.082429,0.05,13.366 +1e+05,0.082716,0.084357,0.05,18.708 +1e+05,0.082716,0.084357,0.05,18.708 +1e+05,0.084607,0.086285,0.05,23.905 +1e+05,0.084607,0.086285,0.05,23.905 +1e+05,0.086497,0.088212,0.05,28.953 +1e+05,0.086497,0.088212,0.05,28.953 +1e+05,0.088387,0.09014,0.05,33.846 +1e+05,0.088387,0.09014,0.05,33.846 +1e+05,0.090278,0.092068,0.05,38.579 +1e+05,0.090278,0.092068,0.05,38.579 +1e+05,0.092168,0.093995,0.05,43.144 +1e+05,0.092168,0.093995,0.05,43.144 +1e+05,0.094031,0.095896,0.05,47.472 +1e+05,0.095885,0.097786,0.05,51.606 +1e+05,0.095885,0.097786,0.05,51.606 +1e+05,0.097776,0.099715,0.05,55.636 +1e+05,0.097776,0.099715,0.05,55.636 +1e+05,0.099704,0.10168,0.05,59.545 +1e+05,0.099704,0.10168,0.05,59.545 +1e+05,0.10167,0.10369,0.05,63.317 +1e+05,0.10167,0.10369,0.05,63.317 +1e+05,0.10368,0.10573,0.05,66.937 +1e+05,0.10368,0.10573,0.05,66.937 +1e+05,0.10572,0.10782,0.05,70.39 +1e+05,0.10572,0.10782,0.05,70.39 +1e+05,0.10781,0.10995,0.05,73.659 +1e+05,0.10781,0.10995,0.05,73.659 +1e+05,0.10993,0.11211,0.05,76.734 +1e+05,0.10993,0.11211,0.05,76.734 +1e+05,0.10993,0.11211,0.05,76.734 +1e+05,0.1121,0.11433,0.05,79.604 +1e+05,0.1121,0.11433,0.05,79.604 +1e+05,0.11432,0.11658,0.05,82.259 +1e+05,0.11432,0.11658,0.05,82.259 +1e+05,0.11657,0.11888,0.05,84.696 +1e+05,0.11657,0.11888,0.05,84.696 +1e+05,0.11887,0.12123,0.05,86.911 +1e+05,0.11887,0.12123,0.05,86.911 +1e+05,0.11887,0.12123,0.05,86.911 +1e+05,0.12122,0.12362,0.05,88.906 +1e+05,0.12122,0.12362,0.05,88.906 +1e+05,0.12361,0.12607,0.05,90.684 +1e+05,0.12361,0.12607,0.05,90.684 +1e+05,0.12361,0.12607,0.05,90.684 +1e+05,0.12605,0.12855,0.05,92.253 +1e+05,0.12605,0.12855,0.05,92.253 +1e+05,0.12854,0.13109,0.05,93.623 +1e+05,0.12854,0.13109,0.05,93.623 +1e+05,0.12854,0.13109,0.05,93.623 +1e+05,0.13108,0.13368,0.05,94.805 +1e+05,0.13108,0.13368,0.05,94.805 +1e+05,0.13367,0.13632,0.05,95.814 +1e+05,0.13367,0.13632,0.05,95.814 +1e+05,0.13367,0.13632,0.05,95.814 +1e+05,0.13631,0.13901,0.05,96.664 +1e+05,0.13631,0.13901,0.05,96.664 +1e+05,0.13631,0.13901,0.05,96.664 +1e+05,0.139,0.14176,0.05,97.373 +1e+05,0.139,0.14176,0.05,97.373 +1e+05,0.14175,0.14456,0.05,97.956 +1e+05,0.14175,0.14456,0.05,97.956 +1e+05,0.14175,0.14456,0.05,97.956 +1e+05,0.14455,0.14742,0.05,98.429 +1e+05,0.14455,0.14742,0.05,98.429 +1e+05,0.14455,0.14742,0.05,98.429 +1e+05,0.1474,0.15033,0.05,98.808 +1e+05,0.1474,0.15033,0.05,98.808 +1e+05,0.1474,0.15033,0.05,98.808 +1e+05,0.15032,0.1533,0.05,99.108 +1e+05,0.15032,0.1533,0.05,99.108 +1e+05,0.15032,0.1533,0.05,99.108 +1e+05,0.15329,0.15633,0.05,99.341 +1e+05,0.15329,0.15633,0.05,99.341 +1e+05,0.15329,0.15633,0.05,99.341 +1e+05,0.15632,0.15942,0.05,99.521 +1e+05,0.15632,0.15942,0.05,99.521 +1e+05,0.15632,0.15942,0.05,99.521 +1e+05,0.15941,0.16257,0.05,99.656 +1e+05,0.15941,0.16257,0.05,99.656 +1e+05,0.15941,0.16257,0.05,99.656 +1e+05,0.16256,0.16578,0.05,99.757 +1e+05,0.16256,0.16578,0.05,99.757 +1e+05,0.16256,0.16578,0.05,99.757 +1e+05,0.16577,0.16906,0.05,99.831 +1e+05,0.16577,0.16906,0.05,99.831 +1e+05,0.16577,0.16906,0.05,99.831 +1e+05,0.16577,0.16906,0.05,99.831 +1e+05,0.16905,0.1724,0.05,99.885 +1e+05,0.16905,0.1724,0.05,99.885 +1e+05,0.16905,0.1724,0.05,99.885 +1e+05,0.17239,0.1758,0.05,99.922 +1e+05,0.17239,0.1758,0.05,99.922 +1e+05,0.17239,0.1758,0.05,99.922 +1e+05,0.17579,0.17928,0.05,99.949 +1e+05,0.17579,0.17928,0.05,99.949 +1e+05,0.17579,0.17928,0.05,99.949 +1e+05,0.17579,0.17928,0.05,99.949 +1e+05,0.17927,0.18282,0.05,99.967 +1e+05,0.17927,0.18282,0.05,99.967 +1e+05,0.17927,0.18282,0.05,99.967 +1e+05,0.18281,0.18644,0.05,99.979 +1e+05,0.18281,0.18644,0.05,99.979 +1e+05,0.18281,0.18644,0.05,99.979 +1e+05,0.18281,0.18644,0.05,99.979 +1e+05,0.18643,0.19013,0.05,99.987 +1e+05,0.18643,0.19013,0.05,99.987 +1e+05,0.18643,0.19013,0.05,99.987 +1e+05,0.18643,0.19013,0.05,99.987 +1e+05,0.19011,0.19388,0.05,99.992 +1e+05,0.19011,0.19388,0.05,99.992 +1e+05,0.19011,0.19388,0.05,99.992 +1e+05,0.19387,0.19772,0.05,99.995 +1e+05,0.19387,0.19772,0.05,99.995 +1e+05,0.19387,0.19772,0.05,99.995 +1e+05,0.19387,0.19772,0.05,99.995 +1e+05,0.19771,0.20163,0.05,99.997 +1e+05,0.19771,0.20163,0.05,99.997 +1e+05,0.19771,0.20163,0.05,99.997 +1e+05,0.19771,0.20163,0.05,99.997 +1e+05,0.20162,0.20562,0.05,99.998 +1e+05,0.20162,0.20562,0.05,99.998 +1e+05,0.20162,0.20562,0.05,99.998 +1e+05,0.20162,0.20562,0.05,99.998 +1e+05,0.2056,0.20968,0.05,99.999 +1e+05,0.2056,0.20968,0.05,99.999 +1e+05,0.2056,0.20968,0.05,99.999 +1e+05,0.2056,0.20968,0.05,99.999 +1e+05,0.20967,0.21383,0.05,99.999 +1e+05,0.20967,0.21383,0.05,99.999 +1e+05,0.20967,0.21383,0.05,99.999 +1e+05,0.20967,0.21383,0.05,99.999 +1e+05,0.21382,0.21806,0.05,100 +1e+05,0.21382,0.21806,0.05,100 +1e+05,0.21382,0.21806,0.05,100 +1e+05,0.21382,0.21806,0.05,100 +1e+05,0.21382,0.21806,0.05,100 +1e+05,0.21805,0.22237,0.05,100 +1e+05,0.21805,0.22237,0.05,100 +1e+05,0.21805,0.22237,0.05,100 +1e+05,0.21805,0.22237,0.05,100 +1e+05,0.22236,0.22677,0.05,100 +1e+05,0.22236,0.22677,0.05,100 +1e+05,0.22236,0.22677,0.05,100 +1e+05,0.22236,0.22677,0.05,100 +1e+05,0.22676,0.23125,0.05,100 +1e+05,0.22676,0.23125,0.05,100 +1e+05,0.22676,0.23125,0.05,100 +1e+05,0.22676,0.23125,0.05,100 +1e+05,0.22676,0.23125,0.05,100 +1e+05,0.23124,0.23583,0.05,100 +1e+05,0.23124,0.23583,0.05,100 +1e+05,0.23124,0.23583,0.05,100 +1e+05,0.23124,0.23583,0.05,100 +1e+05,0.23582,0.2405,0.05,100 +1e+05,0.23582,0.2405,0.05,100 +1e+05,0.23582,0.2405,0.05,100 +1e+05,0.23582,0.2405,0.05,100 +1e+05,0.23582,0.2405,0.05,100 +1e+05,0.24048,0.24525,0.05,100 +1e+05,0.24048,0.24525,0.05,100 +1e+05,0.24048,0.24525,0.05,100 +1e+05,0.24048,0.24525,0.05,100 +1e+05,0.24048,0.24525,0.05,100 +1e+05,0.24524,0.25011,0.05,100 +1e+05,0.24524,0.25011,0.05,100 +1e+05,0.24524,0.25011,0.05,100 +1e+05,0.24524,0.25011,0.05,100 +1e+05,0.24524,0.25011,0.05,100 +1e+05,0.25009,0.25505,0.05,100 +1e+05,0.25009,0.25505,0.05,100 +1e+05,0.25009,0.25505,0.05,100 +1e+05,0.25009,0.25505,0.05,100 +1e+05,0.25009,0.25505,0.05,100 +1e+05,0.25504,0.2601,0.05,100 +1e+05,0.25504,0.2601,0.05,100 +1e+05,0.25504,0.2601,0.05,100 +1e+05,0.25504,0.2601,0.05,100 +1e+05,0.25504,0.2601,0.05,100 +1e+05,0.26009,0.26525,0.05,100 +1e+05,0.26009,0.26525,0.05,100 +1e+05,0.26009,0.26525,0.05,100 +1e+05,0.26009,0.26525,0.05,100 +1e+05,0.26009,0.26525,0.05,100 +1e+05,0.26524,0.2705,0.05,100 +1e+05,0.26524,0.2705,0.05,100 +1e+05,0.26524,0.2705,0.05,100 +1e+05,0.26524,0.2705,0.05,100 +1e+05,0.26524,0.2705,0.05,100 +1e+05,0.27048,0.27585,0.05,100 +1e+05,0.27048,0.27585,0.05,100 +1e+05,0.27048,0.27585,0.05,100 +1e+05,0.27048,0.27585,0.05,100 +1e+05,0.27048,0.27585,0.05,100 +1e+05,0.27584,0.28131,0.05,100 +1e+05,0.27584,0.28131,0.05,100 +1e+05,0.27584,0.28131,0.05,100 +1e+05,0.27584,0.28131,0.05,100 +1e+05,0.27584,0.28131,0.05,100 +1e+05,0.27584,0.28131,0.05,100 +1e+05,0.2813,0.28687,0.05,100 +1e+05,0.2813,0.28687,0.05,100 +1e+05,0.2813,0.28687,0.05,100 +1e+05,0.2813,0.28687,0.05,100 +1e+05,0.2813,0.28687,0.05,100 +1e+05,0.28686,0.29255,0.05,100 +1e+05,0.28686,0.29255,0.05,100 +1e+05,0.28686,0.29255,0.05,100 +1e+05,0.28686,0.29255,0.05,100 +1e+05,0.28686,0.29255,0.05,100 +1e+05,0.28686,0.29255,0.05,100 +1e+05,0.29254,0.29834,0.05,100 +1e+05,0.29254,0.29834,0.05,100 +1e+05,0.29254,0.29834,0.05,100 +1e+05,0.29254,0.29834,0.05,100 +1e+05,0.29254,0.29834,0.05,100 +1e+05,0.29254,0.29834,0.05,100 +1e+05,0.29833,0.30425,0.05,100 +1e+05,0.29833,0.30425,0.05,100 +1e+05,0.29833,0.30425,0.05,100 +1e+05,0.29833,0.30425,0.05,100 +1e+05,0.29833,0.30425,0.05,100 +1e+05,0.29833,0.30425,0.05,100 +1e+05,0.30424,0.31027,0.05,100 +1e+05,0.30424,0.31027,0.05,100 +1e+05,0.30424,0.31027,0.05,100 +1e+05,0.30424,0.31027,0.05,100 +1e+05,0.30424,0.31027,0.05,100 +1e+05,0.30424,0.31027,0.05,100 +1e+05,0.31026,0.31641,0.05,100 +1e+05,0.31026,0.31641,0.05,100 +1e+05,0.31026,0.31641,0.05,100 +1e+05,0.31026,0.31641,0.05,100 +1e+05,0.31026,0.31641,0.05,100 +1e+05,0.31026,0.31641,0.05,100 +1e+05,0.3164,0.32267,0.05,100 +1e+05,0.3164,0.32267,0.05,100 +1e+05,0.3164,0.32267,0.05,100 +1e+05,0.3164,0.32267,0.05,100 +1e+05,0.3164,0.32267,0.05,100 +1e+05,0.3164,0.32267,0.05,100 +1e+05,0.32266,0.32906,0.05,100 +1e+05,0.32266,0.32906,0.05,100 +1e+05,0.32266,0.32906,0.05,100 +1e+05,0.32266,0.32906,0.05,100 +1e+05,0.32266,0.32906,0.05,100 +1e+05,0.32266,0.32906,0.05,100 +1e+05,0.32266,0.32906,0.05,100 +1e+05,0.32905,0.33558,0.05,100 +1e+05,0.32905,0.33558,0.05,100 +1e+05,0.32905,0.33558,0.05,100 +1e+05,0.32905,0.33558,0.05,100 +1e+05,0.32905,0.33558,0.05,100 +1e+05,0.32905,0.33558,0.05,100 +1e+05,0.33556,0.34222,0.05,100 +1e+05,0.33556,0.34222,0.05,100 +1e+05,0.33556,0.34222,0.05,100 +1e+05,0.33556,0.34222,0.05,100 +1e+05,0.33556,0.34222,0.05,100 +1e+05,0.33556,0.34222,0.05,100 +1e+05,0.33556,0.34222,0.05,100 +1e+05,0.34221,0.34899,0.05,100 +1e+05,0.34221,0.34899,0.05,100 +1e+05,0.34221,0.34899,0.05,100 +1e+05,0.34221,0.34899,0.05,100 +1e+05,0.34221,0.34899,0.05,100 +1e+05,0.34221,0.34899,0.05,100 +1e+05,0.34221,0.34899,0.05,100 +1e+05,0.34898,0.3559,0.05,100 +1e+05,0.34898,0.3559,0.05,100 +1e+05,0.34898,0.3559,0.05,100 +1e+05,0.34898,0.3559,0.05,100 +1e+05,0.34898,0.3559,0.05,100 +1e+05,0.34898,0.3559,0.05,100 +1e+05,0.35589,0.36295,0.05,100 +1e+05,0.35589,0.36295,0.05,100 +1e+05,0.35589,0.36295,0.05,100 +1e+05,0.35589,0.36295,0.05,100 +1e+05,0.35589,0.36295,0.05,100 +1e+05,0.35589,0.36295,0.05,100 +1e+05,0.35589,0.36295,0.05,100 +1e+05,0.36294,0.37013,0.05,100 +1e+05,0.36294,0.37013,0.05,100 +1e+05,0.36294,0.37013,0.05,100 +1e+05,0.36294,0.37013,0.05,100 +1e+05,0.36294,0.37013,0.05,100 +1e+05,0.36294,0.37013,0.05,100 +1e+05,0.36294,0.37013,0.05,100 +1e+05,0.36294,0.37013,0.05,100 +1e+05,0.37012,0.37746,0.05,100 +1e+05,0.37012,0.37746,0.05,100 +1e+05,0.37012,0.37746,0.05,100 +1e+05,0.37012,0.37746,0.05,100 +1e+05,0.37012,0.37746,0.05,100 +1e+05,0.37012,0.37746,0.05,100 +1e+05,0.37012,0.37746,0.05,100 +1e+05,0.37745,0.38494,0.05,100 +1e+05,0.37745,0.38494,0.05,100 +1e+05,0.37745,0.38494,0.05,100 +1e+05,0.37745,0.38494,0.05,100 +1e+05,0.37745,0.38494,0.05,100 +1e+05,0.37745,0.38494,0.05,100 +1e+05,0.37745,0.38494,0.05,100 +1e+05,0.38493,0.39256,0.05,100 +1e+05,0.38493,0.39256,0.05,100 +1e+05,0.38493,0.39256,0.05,100 +1e+05,0.38493,0.39256,0.05,100 +1e+05,0.38493,0.39256,0.05,100 +1e+05,0.38493,0.39256,0.05,100 +1e+05,0.38493,0.39256,0.05,100 +1e+05,0.38493,0.39256,0.05,100 +1e+05,0.39255,0.40033,0.05,100 +1e+05,0.39255,0.40033,0.05,100 +1e+05,0.39255,0.40033,0.05,100 +1e+05,0.39255,0.40033,0.05,100 +1e+05,0.39255,0.40033,0.05,100 +1e+05,0.39255,0.40033,0.05,100 +1e+05,0.39255,0.40033,0.05,100 +1e+05,0.39255,0.40033,0.05,100 +1e+05,0.40032,0.40826,0.05,100 +1e+05,0.40032,0.40826,0.05,100 +1e+05,0.40032,0.40826,0.05,100 +1e+05,0.40032,0.40826,0.05,100 +1e+05,0.40032,0.40826,0.05,100 +1e+05,0.40032,0.40826,0.05,100 +1e+05,0.40032,0.40826,0.05,100 +1e+05,0.40032,0.40826,0.05,100 +1e+05,0.40825,0.41634,0.05,100 +1e+05,0.40825,0.41634,0.05,100 +1e+05,0.40825,0.41634,0.05,100 +1e+05,0.40825,0.41634,0.05,100 +1e+05,0.40825,0.41634,0.05,100 +1e+05,0.40825,0.41634,0.05,100 +1e+05,0.40825,0.41634,0.05,100 +1e+05,0.40825,0.41634,0.05,100 +1e+05,0.41633,0.42459,0.05,100 +1e+05,0.41633,0.42459,0.05,100 +1e+05,0.41633,0.42459,0.05,100 +1e+05,0.41633,0.42459,0.05,100 +1e+05,0.41633,0.42459,0.05,100 +1e+05,0.41633,0.42459,0.05,100 +1e+05,0.41633,0.42459,0.05,100 +1e+05,0.41633,0.42459,0.05,100 +1e+05,0.42458,0.433,0.05,100 +1e+05,0.42458,0.433,0.05,100 +1e+05,0.42458,0.433,0.05,100 +1e+05,0.42458,0.433,0.05,100 +1e+05,0.42458,0.433,0.05,100 +1e+05,0.42458,0.433,0.05,100 +1e+05,0.42458,0.433,0.05,100 +1e+05,0.42458,0.433,0.05,100 +1e+05,0.42458,0.433,0.05,100 +1e+05,0.43298,0.44157,0.05,100 +1e+05,0.43298,0.44157,0.05,100 +1e+05,0.43298,0.44157,0.05,100 +1e+05,0.43298,0.44157,0.05,100 +1e+05,0.43298,0.44157,0.05,100 +1e+05,0.43298,0.44157,0.05,100 +1e+05,0.43298,0.44157,0.05,100 +1e+05,0.43298,0.44157,0.05,100 +1e+05,0.44156,0.45031,0.05,100 +1e+05,0.44156,0.45031,0.05,100 +1e+05,0.44156,0.45031,0.05,100 +1e+05,0.44156,0.45031,0.05,100 +1e+05,0.44156,0.45031,0.05,100 +1e+05,0.44156,0.45031,0.05,100 +1e+05,0.44156,0.45031,0.05,100 +1e+05,0.44156,0.45031,0.05,100 +1e+05,0.44156,0.45031,0.05,100 +1e+05,0.4503,0.45923,0.05,100 +1e+05,0.4503,0.45923,0.05,100 +1e+05,0.4503,0.45923,0.05,100 +1e+05,0.4503,0.45923,0.05,100 +1e+05,0.4503,0.45923,0.05,100 +1e+05,0.4503,0.45923,0.05,100 +1e+05,0.4503,0.45923,0.05,100 +1e+05,0.4503,0.45923,0.05,100 +1e+05,0.4503,0.45923,0.05,100 +1e+05,0.45922,0.46833,0.05,100 +1e+05,0.45922,0.46833,0.05,100 +1e+05,0.45922,0.46833,0.05,100 +1e+05,0.45922,0.46833,0.05,100 +1e+05,0.45922,0.46833,0.05,100 +1e+05,0.45922,0.46833,0.05,100 +1e+05,0.45922,0.46833,0.05,100 +1e+05,0.45922,0.46833,0.05,100 +1e+05,0.45922,0.46833,0.05,100 +1e+05,0.46832,0.4776,0.05,100 +1e+05,0.46832,0.4776,0.05,100 +1e+05,0.46832,0.4776,0.05,100 +1e+05,0.46832,0.4776,0.05,100 +1e+05,0.46832,0.4776,0.05,100 +1e+05,0.46832,0.4776,0.05,100 +1e+05,0.46832,0.4776,0.05,100 +1e+05,0.46832,0.4776,0.05,100 +1e+05,0.46832,0.4776,0.05,100 +1e+05,0.47759,0.48706,0.05,100 +1e+05,0.47759,0.48706,0.05,100 +1e+05,0.47759,0.48706,0.05,100 +1e+05,0.47759,0.48706,0.05,100 +1e+05,0.47759,0.48706,0.05,100 +1e+05,0.47759,0.48706,0.05,100 +1e+05,0.47759,0.48706,0.05,100 +1e+05,0.47759,0.48706,0.05,100 +1e+05,0.47759,0.48706,0.05,100 +1e+05,0.47759,0.48706,0.05,100 +1e+05,0.48705,0.49671,0.05,100 +1e+05,0.48705,0.49671,0.05,100 +1e+05,0.48705,0.49671,0.05,100 +1e+05,0.48705,0.49671,0.05,100 +1e+05,0.48705,0.49671,0.05,100 +1e+05,0.48705,0.49671,0.05,100 +1e+05,0.48705,0.49671,0.05,100 +1e+05,0.48705,0.49671,0.05,100 +1e+05,0.48705,0.49671,0.05,100 +1e+05,0.4967,0.50655,0.05,100 +1e+05,0.4967,0.50655,0.05,100 +1e+05,0.4967,0.50655,0.05,100 +1e+05,0.4967,0.50655,0.05,100 +1e+05,0.4967,0.50655,0.05,100 +1e+05,0.4967,0.50655,0.05,100 +1e+05,0.4967,0.50655,0.05,100 +1e+05,0.4967,0.50655,0.05,100 +1e+05,0.4967,0.50655,0.05,100 +1e+05,0.4967,0.50655,0.05,100 +1e+05,0.50654,0.51658,0.05,100 +1e+05,0.50654,0.51658,0.05,100 +1e+05,0.50654,0.51658,0.05,100 +1e+05,0.50654,0.51658,0.05,100 +1e+05,0.50654,0.51658,0.05,100 +1e+05,0.50654,0.51658,0.05,100 +1e+05,0.50654,0.51658,0.05,100 +1e+05,0.50654,0.51658,0.05,100 +1e+05,0.50654,0.51658,0.05,100 +1e+05,0.50654,0.51658,0.05,100 +1e+05,0.51657,0.52681,0.05,100 +1e+05,0.51657,0.52681,0.05,100 +1e+05,0.51657,0.52681,0.05,100 +1e+05,0.51657,0.52681,0.05,100 +1e+05,0.51657,0.52681,0.05,100 +1e+05,0.51657,0.52681,0.05,100 +1e+05,0.51657,0.52681,0.05,100 +1e+05,0.51657,0.52681,0.05,100 +1e+05,0.51657,0.52681,0.05,100 +1e+05,0.51657,0.52681,0.05,100 +1e+05,0.5268,0.53725,0.05,100 +1e+05,0.5268,0.53725,0.05,100 +1e+05,0.5268,0.53725,0.05,100 +1e+05,0.5268,0.53725,0.05,100 +1e+05,0.5268,0.53725,0.05,100 +1e+05,0.5268,0.53725,0.05,100 +1e+05,0.5268,0.53725,0.05,100 +1e+05,0.5268,0.53725,0.05,100 +1e+05,0.5268,0.53725,0.05,100 +1e+05,0.5268,0.53725,0.05,100 +1e+05,0.5268,0.53725,0.05,100 +1e+05,0.53724,0.54789,0.05,100 +1e+05,0.53724,0.54789,0.05,100 +1e+05,0.53724,0.54789,0.05,100 +1e+05,0.53724,0.54789,0.05,100 +1e+05,0.53724,0.54789,0.05,100 +1e+05,0.53724,0.54789,0.05,100 +1e+05,0.53724,0.54789,0.05,100 +1e+05,0.53724,0.54789,0.05,100 +1e+05,0.53724,0.54789,0.05,100 +1e+05,0.53724,0.54789,0.05,100 +1e+05,0.54788,0.55874,0.05,100 +1e+05,0.54788,0.55874,0.05,100 +1e+05,0.54788,0.55874,0.05,100 +1e+05,0.54788,0.55874,0.05,100 +1e+05,0.54788,0.55874,0.05,100 +1e+05,0.54788,0.55874,0.05,100 +1e+05,0.54788,0.55874,0.05,100 +1e+05,0.54788,0.55874,0.05,100 +1e+05,0.54788,0.55874,0.05,100 +1e+05,0.54788,0.55874,0.05,100 +1e+05,0.54788,0.55874,0.05,100 +1e+05,0.55873,0.56981,0.05,100 +1e+05,0.55873,0.56981,0.05,100 +1e+05,0.55873,0.56981,0.05,100 +1e+05,0.55873,0.56981,0.05,100 +1e+05,0.55873,0.56981,0.05,100 +1e+05,0.55873,0.56981,0.05,100 +1e+05,0.55873,0.56981,0.05,100 +1e+05,0.55873,0.56981,0.05,100 +1e+05,0.55873,0.56981,0.05,100 +1e+05,0.55873,0.56981,0.05,100 +1e+05,0.55873,0.56981,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.5698,0.5811,0.05,100 +1e+05,0.58109,0.59261,0.05,100 +1e+05,0.58109,0.59261,0.05,100 +1e+05,0.58109,0.59261,0.05,100 +1e+05,0.58109,0.59261,0.05,100 +1e+05,0.58109,0.59261,0.05,100 +1e+05,0.58109,0.59261,0.05,100 +1e+05,0.58109,0.59261,0.05,100 +1e+05,0.58109,0.59261,0.05,100 +1e+05,0.58109,0.59261,0.05,100 +1e+05,0.58109,0.59261,0.05,100 +1e+05,0.58109,0.59261,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.5926,0.60435,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.60434,0.61632,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.61631,0.62853,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.62852,0.64098,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.64097,0.65368,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.65367,0.66663,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.66662,0.67984,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.67983,0.69331,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,0.6933,0.70704,0.05,100 +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan +1e+05,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_2.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_2.csv new file mode 100644 index 00000000000..52362b795f0 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_2.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,0.07071,0.072112,0.05,-15.478 +20000,0.07071,0.072112,0.05,-15.478 +20000,0.07211,0.07354,0.05,-6.6062 +20000,0.07351,0.074968,0.05,2.1009 +20000,0.075155,0.076646,0.05,12.127 +20000,0.075155,0.076646,0.05,12.127 +20000,0.077046,0.078574,0.05,23.273 +20000,0.077046,0.078574,0.05,23.273 +20000,0.078936,0.080501,0.05,33.948 +20000,0.078936,0.080501,0.05,33.948 +20000,0.080826,0.082429,0.05,44.021 +20000,0.080826,0.082429,0.05,44.021 +20000,0.082716,0.084357,0.05,53.356 +20000,0.082716,0.084357,0.05,53.356 +20000,0.084607,0.086285,0.05,61.822 +20000,0.084607,0.086285,0.05,61.822 +20000,0.086497,0.088212,0.05,69.322 +20000,0.086497,0.088212,0.05,69.322 +20000,0.088387,0.09014,0.05,75.802 +20000,0.088387,0.09014,0.05,75.802 +20000,0.090278,0.092068,0.05,81.26 +20000,0.090278,0.092068,0.05,81.26 +20000,0.092168,0.093995,0.05,85.744 +20000,0.092168,0.093995,0.05,85.744 +20000,0.094031,0.095896,0.05,89.288 +20000,0.095885,0.097786,0.05,92.071 +20000,0.095885,0.097786,0.05,92.071 +20000,0.097776,0.099715,0.05,94.256 +20000,0.097776,0.099715,0.05,94.256 +20000,0.099704,0.10168,0.05,95.926 +20000,0.099704,0.10168,0.05,95.926 +20000,0.10167,0.10369,0.05,97.173 +20000,0.10167,0.10369,0.05,97.173 +20000,0.10368,0.10573,0.05,98.08 +20000,0.10368,0.10573,0.05,98.08 +20000,0.10572,0.10782,0.05,98.724 +20000,0.10572,0.10782,0.05,98.724 +20000,0.10781,0.10995,0.05,99.171 +20000,0.10781,0.10995,0.05,99.171 +20000,0.10993,0.11211,0.05,99.473 +20000,0.10993,0.11211,0.05,99.473 +20000,0.10993,0.11211,0.05,99.473 +20000,0.1121,0.11433,0.05,99.672 +20000,0.1121,0.11433,0.05,99.672 +20000,0.11432,0.11658,0.05,99.801 +20000,0.11432,0.11658,0.05,99.801 +20000,0.11657,0.11888,0.05,99.882 +20000,0.11657,0.11888,0.05,99.882 +20000,0.11887,0.12123,0.05,99.931 +20000,0.11887,0.12123,0.05,99.931 +20000,0.11887,0.12123,0.05,99.931 +20000,0.12122,0.12362,0.05,99.961 +20000,0.12122,0.12362,0.05,99.961 +20000,0.12361,0.12607,0.05,99.978 +20000,0.12361,0.12607,0.05,99.978 +20000,0.12361,0.12607,0.05,99.978 +20000,0.12605,0.12855,0.05,99.988 +20000,0.12605,0.12855,0.05,99.988 +20000,0.12854,0.13109,0.05,99.994 +20000,0.12854,0.13109,0.05,99.994 +20000,0.12854,0.13109,0.05,99.994 +20000,0.13108,0.13368,0.05,99.997 +20000,0.13108,0.13368,0.05,99.997 +20000,0.13367,0.13632,0.05,99.998 +20000,0.13367,0.13632,0.05,99.998 +20000,0.13367,0.13632,0.05,99.998 +20000,0.13631,0.13901,0.05,99.999 +20000,0.13631,0.13901,0.05,99.999 +20000,0.13631,0.13901,0.05,99.999 +20000,0.139,0.14176,0.05,100 +20000,0.139,0.14176,0.05,100 +20000,0.14175,0.14456,0.05,100 +20000,0.14175,0.14456,0.05,100 +20000,0.14175,0.14456,0.05,100 +20000,0.14455,0.14742,0.05,100 +20000,0.14455,0.14742,0.05,100 +20000,0.14455,0.14742,0.05,100 +20000,0.1474,0.15033,0.05,100 +20000,0.1474,0.15033,0.05,100 +20000,0.1474,0.15033,0.05,100 +20000,0.15032,0.1533,0.05,100 +20000,0.15032,0.1533,0.05,100 +20000,0.15032,0.1533,0.05,100 +20000,0.15329,0.15633,0.05,100 +20000,0.15329,0.15633,0.05,100 +20000,0.15329,0.15633,0.05,100 +20000,0.15632,0.15942,0.05,100 +20000,0.15632,0.15942,0.05,100 +20000,0.15632,0.15942,0.05,100 +20000,0.15941,0.16257,0.05,100 +20000,0.15941,0.16257,0.05,100 +20000,0.15941,0.16257,0.05,100 +20000,0.16256,0.16578,0.05,100 +20000,0.16256,0.16578,0.05,100 +20000,0.16256,0.16578,0.05,100 +20000,0.16577,0.16906,0.05,100 +20000,0.16577,0.16906,0.05,100 +20000,0.16577,0.16906,0.05,100 +20000,0.16577,0.16906,0.05,100 +20000,0.16905,0.1724,0.05,100 +20000,0.16905,0.1724,0.05,100 +20000,0.16905,0.1724,0.05,100 +20000,0.17239,0.1758,0.05,100 +20000,0.17239,0.1758,0.05,100 +20000,0.17239,0.1758,0.05,100 +20000,0.17579,0.17928,0.05,100 +20000,0.17579,0.17928,0.05,100 +20000,0.17579,0.17928,0.05,100 +20000,0.17579,0.17928,0.05,100 +20000,0.17927,0.18282,0.05,100 +20000,0.17927,0.18282,0.05,100 +20000,0.17927,0.18282,0.05,100 +20000,0.18281,0.18644,0.05,100 +20000,0.18281,0.18644,0.05,100 +20000,0.18281,0.18644,0.05,100 +20000,0.18281,0.18644,0.05,100 +20000,0.18643,0.19013,0.05,100 +20000,0.18643,0.19013,0.05,100 +20000,0.18643,0.19013,0.05,100 +20000,0.18643,0.19013,0.05,100 +20000,0.19011,0.19388,0.05,100 +20000,0.19011,0.19388,0.05,100 +20000,0.19011,0.19388,0.05,100 +20000,0.19387,0.19772,0.05,100 +20000,0.19387,0.19772,0.05,100 +20000,0.19387,0.19772,0.05,100 +20000,0.19387,0.19772,0.05,100 +20000,0.19771,0.20163,0.05,100 +20000,0.19771,0.20163,0.05,100 +20000,0.19771,0.20163,0.05,100 +20000,0.19771,0.20163,0.05,100 +20000,0.20162,0.20562,0.05,100 +20000,0.20162,0.20562,0.05,100 +20000,0.20162,0.20562,0.05,100 +20000,0.20162,0.20562,0.05,100 +20000,0.2056,0.20968,0.05,100 +20000,0.2056,0.20968,0.05,100 +20000,0.2056,0.20968,0.05,100 +20000,0.2056,0.20968,0.05,100 +20000,0.20967,0.21383,0.05,100 +20000,0.20967,0.21383,0.05,100 +20000,0.20967,0.21383,0.05,100 +20000,0.20967,0.21383,0.05,100 +20000,0.21382,0.21806,0.05,100 +20000,0.21382,0.21806,0.05,100 +20000,0.21382,0.21806,0.05,100 +20000,0.21382,0.21806,0.05,100 +20000,0.21382,0.21806,0.05,100 +20000,0.21805,0.22237,0.05,100 +20000,0.21805,0.22237,0.05,100 +20000,0.21805,0.22237,0.05,100 +20000,0.21805,0.22237,0.05,100 +20000,0.22236,0.22677,0.05,100 +20000,0.22236,0.22677,0.05,100 +20000,0.22236,0.22677,0.05,100 +20000,0.22236,0.22677,0.05,100 +20000,0.22676,0.23125,0.05,100 +20000,0.22676,0.23125,0.05,100 +20000,0.22676,0.23125,0.05,100 +20000,0.22676,0.23125,0.05,100 +20000,0.22676,0.23125,0.05,100 +20000,0.23124,0.23583,0.05,100 +20000,0.23124,0.23583,0.05,100 +20000,0.23124,0.23583,0.05,100 +20000,0.23124,0.23583,0.05,100 +20000,0.23582,0.2405,0.05,100 +20000,0.23582,0.2405,0.05,100 +20000,0.23582,0.2405,0.05,100 +20000,0.23582,0.2405,0.05,100 +20000,0.23582,0.2405,0.05,100 +20000,0.24048,0.24525,0.05,100 +20000,0.24048,0.24525,0.05,100 +20000,0.24048,0.24525,0.05,100 +20000,0.24048,0.24525,0.05,100 +20000,0.24048,0.24525,0.05,100 +20000,0.24524,0.25011,0.05,100 +20000,0.24524,0.25011,0.05,100 +20000,0.24524,0.25011,0.05,100 +20000,0.24524,0.25011,0.05,100 +20000,0.24524,0.25011,0.05,100 +20000,0.25009,0.25505,0.05,100 +20000,0.25009,0.25505,0.05,100 +20000,0.25009,0.25505,0.05,100 +20000,0.25009,0.25505,0.05,100 +20000,0.25009,0.25505,0.05,100 +20000,0.25504,0.2601,0.05,100 +20000,0.25504,0.2601,0.05,100 +20000,0.25504,0.2601,0.05,100 +20000,0.25504,0.2601,0.05,100 +20000,0.25504,0.2601,0.05,100 +20000,0.26009,0.26525,0.05,100 +20000,0.26009,0.26525,0.05,100 +20000,0.26009,0.26525,0.05,100 +20000,0.26009,0.26525,0.05,100 +20000,0.26009,0.26525,0.05,100 +20000,0.26524,0.2705,0.05,100 +20000,0.26524,0.2705,0.05,100 +20000,0.26524,0.2705,0.05,100 +20000,0.26524,0.2705,0.05,100 +20000,0.26524,0.2705,0.05,100 +20000,0.27048,0.27585,0.05,100 +20000,0.27048,0.27585,0.05,100 +20000,0.27048,0.27585,0.05,100 +20000,0.27048,0.27585,0.05,100 +20000,0.27048,0.27585,0.05,100 +20000,0.27584,0.28131,0.05,100 +20000,0.27584,0.28131,0.05,100 +20000,0.27584,0.28131,0.05,100 +20000,0.27584,0.28131,0.05,100 +20000,0.27584,0.28131,0.05,100 +20000,0.27584,0.28131,0.05,100 +20000,0.2813,0.28687,0.05,100 +20000,0.2813,0.28687,0.05,100 +20000,0.2813,0.28687,0.05,100 +20000,0.2813,0.28687,0.05,100 +20000,0.2813,0.28687,0.05,100 +20000,0.28686,0.29255,0.05,100 +20000,0.28686,0.29255,0.05,100 +20000,0.28686,0.29255,0.05,100 +20000,0.28686,0.29255,0.05,100 +20000,0.28686,0.29255,0.05,100 +20000,0.28686,0.29255,0.05,100 +20000,0.29254,0.29834,0.05,100 +20000,0.29254,0.29834,0.05,100 +20000,0.29254,0.29834,0.05,100 +20000,0.29254,0.29834,0.05,100 +20000,0.29254,0.29834,0.05,100 +20000,0.29254,0.29834,0.05,100 +20000,0.29833,0.30425,0.05,100 +20000,0.29833,0.30425,0.05,100 +20000,0.29833,0.30425,0.05,100 +20000,0.29833,0.30425,0.05,100 +20000,0.29833,0.30425,0.05,100 +20000,0.29833,0.30425,0.05,100 +20000,0.30424,0.31027,0.05,100 +20000,0.30424,0.31027,0.05,100 +20000,0.30424,0.31027,0.05,100 +20000,0.30424,0.31027,0.05,100 +20000,0.30424,0.31027,0.05,100 +20000,0.30424,0.31027,0.05,100 +20000,0.31026,0.31641,0.05,100 +20000,0.31026,0.31641,0.05,100 +20000,0.31026,0.31641,0.05,100 +20000,0.31026,0.31641,0.05,100 +20000,0.31026,0.31641,0.05,100 +20000,0.31026,0.31641,0.05,100 +20000,0.3164,0.32267,0.05,100 +20000,0.3164,0.32267,0.05,100 +20000,0.3164,0.32267,0.05,100 +20000,0.3164,0.32267,0.05,100 +20000,0.3164,0.32267,0.05,100 +20000,0.3164,0.32267,0.05,100 +20000,0.32266,0.32906,0.05,100 +20000,0.32266,0.32906,0.05,100 +20000,0.32266,0.32906,0.05,100 +20000,0.32266,0.32906,0.05,100 +20000,0.32266,0.32906,0.05,100 +20000,0.32266,0.32906,0.05,100 +20000,0.32266,0.32906,0.05,100 +20000,0.32905,0.33558,0.05,100 +20000,0.32905,0.33558,0.05,100 +20000,0.32905,0.33558,0.05,100 +20000,0.32905,0.33558,0.05,100 +20000,0.32905,0.33558,0.05,100 +20000,0.32905,0.33558,0.05,100 +20000,0.33556,0.34222,0.05,100 +20000,0.33556,0.34222,0.05,100 +20000,0.33556,0.34222,0.05,100 +20000,0.33556,0.34222,0.05,100 +20000,0.33556,0.34222,0.05,100 +20000,0.33556,0.34222,0.05,100 +20000,0.33556,0.34222,0.05,100 +20000,0.34221,0.34899,0.05,100 +20000,0.34221,0.34899,0.05,100 +20000,0.34221,0.34899,0.05,100 +20000,0.34221,0.34899,0.05,100 +20000,0.34221,0.34899,0.05,100 +20000,0.34221,0.34899,0.05,100 +20000,0.34221,0.34899,0.05,100 +20000,0.34898,0.3559,0.05,100 +20000,0.34898,0.3559,0.05,100 +20000,0.34898,0.3559,0.05,100 +20000,0.34898,0.3559,0.05,100 +20000,0.34898,0.3559,0.05,100 +20000,0.34898,0.3559,0.05,100 +20000,0.35589,0.36295,0.05,100 +20000,0.35589,0.36295,0.05,100 +20000,0.35589,0.36295,0.05,100 +20000,0.35589,0.36295,0.05,100 +20000,0.35589,0.36295,0.05,100 +20000,0.35589,0.36295,0.05,100 +20000,0.35589,0.36295,0.05,100 +20000,0.36294,0.37013,0.05,100 +20000,0.36294,0.37013,0.05,100 +20000,0.36294,0.37013,0.05,100 +20000,0.36294,0.37013,0.05,100 +20000,0.36294,0.37013,0.05,100 +20000,0.36294,0.37013,0.05,100 +20000,0.36294,0.37013,0.05,100 +20000,0.36294,0.37013,0.05,100 +20000,0.37012,0.37746,0.05,100 +20000,0.37012,0.37746,0.05,100 +20000,0.37012,0.37746,0.05,100 +20000,0.37012,0.37746,0.05,100 +20000,0.37012,0.37746,0.05,100 +20000,0.37012,0.37746,0.05,100 +20000,0.37012,0.37746,0.05,100 +20000,0.37745,0.38494,0.05,100 +20000,0.37745,0.38494,0.05,100 +20000,0.37745,0.38494,0.05,100 +20000,0.37745,0.38494,0.05,100 +20000,0.37745,0.38494,0.05,100 +20000,0.37745,0.38494,0.05,100 +20000,0.37745,0.38494,0.05,100 +20000,0.38493,0.39256,0.05,100 +20000,0.38493,0.39256,0.05,100 +20000,0.38493,0.39256,0.05,100 +20000,0.38493,0.39256,0.05,100 +20000,0.38493,0.39256,0.05,100 +20000,0.38493,0.39256,0.05,100 +20000,0.38493,0.39256,0.05,100 +20000,0.38493,0.39256,0.05,100 +20000,0.39255,0.40033,0.05,100 +20000,0.39255,0.40033,0.05,100 +20000,0.39255,0.40033,0.05,100 +20000,0.39255,0.40033,0.05,100 +20000,0.39255,0.40033,0.05,100 +20000,0.39255,0.40033,0.05,100 +20000,0.39255,0.40033,0.05,100 +20000,0.39255,0.40033,0.05,100 +20000,0.40032,0.40826,0.05,100 +20000,0.40032,0.40826,0.05,100 +20000,0.40032,0.40826,0.05,100 +20000,0.40032,0.40826,0.05,100 +20000,0.40032,0.40826,0.05,100 +20000,0.40032,0.40826,0.05,100 +20000,0.40032,0.40826,0.05,100 +20000,0.40032,0.40826,0.05,100 +20000,0.40825,0.41634,0.05,100 +20000,0.40825,0.41634,0.05,100 +20000,0.40825,0.41634,0.05,100 +20000,0.40825,0.41634,0.05,100 +20000,0.40825,0.41634,0.05,100 +20000,0.40825,0.41634,0.05,100 +20000,0.40825,0.41634,0.05,100 +20000,0.40825,0.41634,0.05,100 +20000,0.41633,0.42459,0.05,100 +20000,0.41633,0.42459,0.05,100 +20000,0.41633,0.42459,0.05,100 +20000,0.41633,0.42459,0.05,100 +20000,0.41633,0.42459,0.05,100 +20000,0.41633,0.42459,0.05,100 +20000,0.41633,0.42459,0.05,100 +20000,0.41633,0.42459,0.05,100 +20000,0.42458,0.433,0.05,100 +20000,0.42458,0.433,0.05,100 +20000,0.42458,0.433,0.05,100 +20000,0.42458,0.433,0.05,100 +20000,0.42458,0.433,0.05,100 +20000,0.42458,0.433,0.05,100 +20000,0.42458,0.433,0.05,100 +20000,0.42458,0.433,0.05,100 +20000,0.42458,0.433,0.05,100 +20000,0.43298,0.44157,0.05,100 +20000,0.43298,0.44157,0.05,100 +20000,0.43298,0.44157,0.05,100 +20000,0.43298,0.44157,0.05,100 +20000,0.43298,0.44157,0.05,100 +20000,0.43298,0.44157,0.05,100 +20000,0.43298,0.44157,0.05,100 +20000,0.43298,0.44157,0.05,100 +20000,0.44156,0.45031,0.05,100 +20000,0.44156,0.45031,0.05,100 +20000,0.44156,0.45031,0.05,100 +20000,0.44156,0.45031,0.05,100 +20000,0.44156,0.45031,0.05,100 +20000,0.44156,0.45031,0.05,100 +20000,0.44156,0.45031,0.05,100 +20000,0.44156,0.45031,0.05,100 +20000,0.44156,0.45031,0.05,100 +20000,0.4503,0.45923,0.05,100 +20000,0.4503,0.45923,0.05,100 +20000,0.4503,0.45923,0.05,100 +20000,0.4503,0.45923,0.05,100 +20000,0.4503,0.45923,0.05,100 +20000,0.4503,0.45923,0.05,100 +20000,0.4503,0.45923,0.05,100 +20000,0.4503,0.45923,0.05,100 +20000,0.4503,0.45923,0.05,100 +20000,0.45922,0.46833,0.05,100 +20000,0.45922,0.46833,0.05,100 +20000,0.45922,0.46833,0.05,100 +20000,0.45922,0.46833,0.05,100 +20000,0.45922,0.46833,0.05,100 +20000,0.45922,0.46833,0.05,100 +20000,0.45922,0.46833,0.05,100 +20000,0.45922,0.46833,0.05,100 +20000,0.45922,0.46833,0.05,100 +20000,0.46832,0.4776,0.05,100 +20000,0.46832,0.4776,0.05,100 +20000,0.46832,0.4776,0.05,100 +20000,0.46832,0.4776,0.05,100 +20000,0.46832,0.4776,0.05,100 +20000,0.46832,0.4776,0.05,100 +20000,0.46832,0.4776,0.05,100 +20000,0.46832,0.4776,0.05,100 +20000,0.46832,0.4776,0.05,100 +20000,0.47759,0.48706,0.05,100 +20000,0.47759,0.48706,0.05,100 +20000,0.47759,0.48706,0.05,100 +20000,0.47759,0.48706,0.05,100 +20000,0.47759,0.48706,0.05,100 +20000,0.47759,0.48706,0.05,100 +20000,0.47759,0.48706,0.05,100 +20000,0.47759,0.48706,0.05,100 +20000,0.47759,0.48706,0.05,100 +20000,0.47759,0.48706,0.05,100 +20000,0.48705,0.49671,0.05,100 +20000,0.48705,0.49671,0.05,100 +20000,0.48705,0.49671,0.05,100 +20000,0.48705,0.49671,0.05,100 +20000,0.48705,0.49671,0.05,100 +20000,0.48705,0.49671,0.05,100 +20000,0.48705,0.49671,0.05,100 +20000,0.48705,0.49671,0.05,100 +20000,0.48705,0.49671,0.05,100 +20000,0.4967,0.50655,0.05,100 +20000,0.4967,0.50655,0.05,100 +20000,0.4967,0.50655,0.05,100 +20000,0.4967,0.50655,0.05,100 +20000,0.4967,0.50655,0.05,100 +20000,0.4967,0.50655,0.05,100 +20000,0.4967,0.50655,0.05,100 +20000,0.4967,0.50655,0.05,100 +20000,0.4967,0.50655,0.05,100 +20000,0.4967,0.50655,0.05,100 +20000,0.50654,0.51658,0.05,100 +20000,0.50654,0.51658,0.05,100 +20000,0.50654,0.51658,0.05,100 +20000,0.50654,0.51658,0.05,100 +20000,0.50654,0.51658,0.05,100 +20000,0.50654,0.51658,0.05,100 +20000,0.50654,0.51658,0.05,100 +20000,0.50654,0.51658,0.05,100 +20000,0.50654,0.51658,0.05,100 +20000,0.50654,0.51658,0.05,100 +20000,0.51657,0.52681,0.05,100 +20000,0.51657,0.52681,0.05,100 +20000,0.51657,0.52681,0.05,100 +20000,0.51657,0.52681,0.05,100 +20000,0.51657,0.52681,0.05,100 +20000,0.51657,0.52681,0.05,100 +20000,0.51657,0.52681,0.05,100 +20000,0.51657,0.52681,0.05,100 +20000,0.51657,0.52681,0.05,100 +20000,0.51657,0.52681,0.05,100 +20000,0.5268,0.53725,0.05,100 +20000,0.5268,0.53725,0.05,100 +20000,0.5268,0.53725,0.05,100 +20000,0.5268,0.53725,0.05,100 +20000,0.5268,0.53725,0.05,100 +20000,0.5268,0.53725,0.05,100 +20000,0.5268,0.53725,0.05,100 +20000,0.5268,0.53725,0.05,100 +20000,0.5268,0.53725,0.05,100 +20000,0.5268,0.53725,0.05,100 +20000,0.5268,0.53725,0.05,100 +20000,0.53724,0.54789,0.05,100 +20000,0.53724,0.54789,0.05,100 +20000,0.53724,0.54789,0.05,100 +20000,0.53724,0.54789,0.05,100 +20000,0.53724,0.54789,0.05,100 +20000,0.53724,0.54789,0.05,100 +20000,0.53724,0.54789,0.05,100 +20000,0.53724,0.54789,0.05,100 +20000,0.53724,0.54789,0.05,100 +20000,0.53724,0.54789,0.05,100 +20000,0.54788,0.55874,0.05,100 +20000,0.54788,0.55874,0.05,100 +20000,0.54788,0.55874,0.05,100 +20000,0.54788,0.55874,0.05,100 +20000,0.54788,0.55874,0.05,100 +20000,0.54788,0.55874,0.05,100 +20000,0.54788,0.55874,0.05,100 +20000,0.54788,0.55874,0.05,100 +20000,0.54788,0.55874,0.05,100 +20000,0.54788,0.55874,0.05,100 +20000,0.54788,0.55874,0.05,100 +20000,0.55873,0.56981,0.05,100 +20000,0.55873,0.56981,0.05,100 +20000,0.55873,0.56981,0.05,100 +20000,0.55873,0.56981,0.05,100 +20000,0.55873,0.56981,0.05,100 +20000,0.55873,0.56981,0.05,100 +20000,0.55873,0.56981,0.05,100 +20000,0.55873,0.56981,0.05,100 +20000,0.55873,0.56981,0.05,100 +20000,0.55873,0.56981,0.05,100 +20000,0.55873,0.56981,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.5698,0.5811,0.05,100 +20000,0.58109,0.59261,0.05,100 +20000,0.58109,0.59261,0.05,100 +20000,0.58109,0.59261,0.05,100 +20000,0.58109,0.59261,0.05,100 +20000,0.58109,0.59261,0.05,100 +20000,0.58109,0.59261,0.05,100 +20000,0.58109,0.59261,0.05,100 +20000,0.58109,0.59261,0.05,100 +20000,0.58109,0.59261,0.05,100 +20000,0.58109,0.59261,0.05,100 +20000,0.58109,0.59261,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.5926,0.60435,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.60434,0.61632,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.61631,0.62853,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.62852,0.64098,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.64097,0.65368,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.65367,0.66663,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.66662,0.67984,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.67983,0.69331,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,0.6933,0.70704,0.05,100 +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan +20000,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_5.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_5.csv new file mode 100644 index 00000000000..c4a1fbb52a2 --- /dev/null +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/data_5.csv @@ -0,0 +1,1002 @@ +Time,"elementCenter:0","elementCenter:1","elementCenter:2","temperature" +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,0.07071,0.072112,0.05,-16.946 +50000,0.07071,0.072112,0.05,-16.946 +50000,0.07211,0.07354,0.05,-10.957 +50000,0.07351,0.074968,0.05,-5.0805 +50000,0.075155,0.076646,0.05,1.6961 +50000,0.075155,0.076646,0.05,1.6961 +50000,0.077046,0.078574,0.05,9.2828 +50000,0.077046,0.078574,0.05,9.2828 +50000,0.078936,0.080501,0.05,16.663 +50000,0.078936,0.080501,0.05,16.663 +50000,0.080826,0.082429,0.05,23.824 +50000,0.080826,0.082429,0.05,23.824 +50000,0.082716,0.084357,0.05,30.745 +50000,0.082716,0.084357,0.05,30.745 +50000,0.084607,0.086285,0.05,37.403 +50000,0.084607,0.086285,0.05,37.403 +50000,0.086497,0.088212,0.05,43.771 +50000,0.086497,0.088212,0.05,43.771 +50000,0.088387,0.09014,0.05,49.822 +50000,0.088387,0.09014,0.05,49.822 +50000,0.090278,0.092068,0.05,55.527 +50000,0.090278,0.092068,0.05,55.527 +50000,0.092168,0.093995,0.05,60.865 +50000,0.092168,0.093995,0.05,60.865 +50000,0.094031,0.095896,0.05,65.743 +50000,0.095885,0.097786,0.05,70.214 +50000,0.095885,0.097786,0.05,70.214 +50000,0.097776,0.099715,0.05,74.369 +50000,0.097776,0.099715,0.05,74.369 +50000,0.099704,0.10168,0.05,78.184 +50000,0.099704,0.10168,0.05,78.184 +50000,0.10167,0.10369,0.05,81.643 +50000,0.10167,0.10369,0.05,81.643 +50000,0.10368,0.10573,0.05,84.738 +50000,0.10368,0.10573,0.05,84.738 +50000,0.10572,0.10782,0.05,87.469 +50000,0.10572,0.10782,0.05,87.469 +50000,0.10781,0.10995,0.05,89.844 +50000,0.10781,0.10995,0.05,89.844 +50000,0.10993,0.11211,0.05,91.879 +50000,0.10993,0.11211,0.05,91.879 +50000,0.10993,0.11211,0.05,91.879 +50000,0.1121,0.11433,0.05,93.596 +50000,0.1121,0.11433,0.05,93.596 +50000,0.11432,0.11658,0.05,95.022 +50000,0.11432,0.11658,0.05,95.022 +50000,0.11657,0.11888,0.05,96.186 +50000,0.11657,0.11888,0.05,96.186 +50000,0.11887,0.12123,0.05,97.123 +50000,0.11887,0.12123,0.05,97.123 +50000,0.11887,0.12123,0.05,97.123 +50000,0.12122,0.12362,0.05,97.862 +50000,0.12122,0.12362,0.05,97.862 +50000,0.12361,0.12607,0.05,98.437 +50000,0.12361,0.12607,0.05,98.437 +50000,0.12361,0.12607,0.05,98.437 +50000,0.12605,0.12855,0.05,98.876 +50000,0.12605,0.12855,0.05,98.876 +50000,0.12854,0.13109,0.05,99.205 +50000,0.12854,0.13109,0.05,99.205 +50000,0.12854,0.13109,0.05,99.205 +50000,0.13108,0.13368,0.05,99.448 +50000,0.13108,0.13368,0.05,99.448 +50000,0.13367,0.13632,0.05,99.623 +50000,0.13367,0.13632,0.05,99.623 +50000,0.13367,0.13632,0.05,99.623 +50000,0.13631,0.13901,0.05,99.747 +50000,0.13631,0.13901,0.05,99.747 +50000,0.13631,0.13901,0.05,99.747 +50000,0.139,0.14176,0.05,99.834 +50000,0.139,0.14176,0.05,99.834 +50000,0.14175,0.14456,0.05,99.893 +50000,0.14175,0.14456,0.05,99.893 +50000,0.14175,0.14456,0.05,99.893 +50000,0.14455,0.14742,0.05,99.932 +50000,0.14455,0.14742,0.05,99.932 +50000,0.14455,0.14742,0.05,99.932 +50000,0.1474,0.15033,0.05,99.958 +50000,0.1474,0.15033,0.05,99.958 +50000,0.1474,0.15033,0.05,99.958 +50000,0.15032,0.1533,0.05,99.975 +50000,0.15032,0.1533,0.05,99.975 +50000,0.15032,0.1533,0.05,99.975 +50000,0.15329,0.15633,0.05,99.985 +50000,0.15329,0.15633,0.05,99.985 +50000,0.15329,0.15633,0.05,99.985 +50000,0.15632,0.15942,0.05,99.991 +50000,0.15632,0.15942,0.05,99.991 +50000,0.15632,0.15942,0.05,99.991 +50000,0.15941,0.16257,0.05,99.995 +50000,0.15941,0.16257,0.05,99.995 +50000,0.15941,0.16257,0.05,99.995 +50000,0.16256,0.16578,0.05,99.997 +50000,0.16256,0.16578,0.05,99.997 +50000,0.16256,0.16578,0.05,99.997 +50000,0.16577,0.16906,0.05,99.999 +50000,0.16577,0.16906,0.05,99.999 +50000,0.16577,0.16906,0.05,99.999 +50000,0.16577,0.16906,0.05,99.999 +50000,0.16905,0.1724,0.05,99.999 +50000,0.16905,0.1724,0.05,99.999 +50000,0.16905,0.1724,0.05,99.999 +50000,0.17239,0.1758,0.05,100 +50000,0.17239,0.1758,0.05,100 +50000,0.17239,0.1758,0.05,100 +50000,0.17579,0.17928,0.05,100 +50000,0.17579,0.17928,0.05,100 +50000,0.17579,0.17928,0.05,100 +50000,0.17579,0.17928,0.05,100 +50000,0.17927,0.18282,0.05,100 +50000,0.17927,0.18282,0.05,100 +50000,0.17927,0.18282,0.05,100 +50000,0.18281,0.18644,0.05,100 +50000,0.18281,0.18644,0.05,100 +50000,0.18281,0.18644,0.05,100 +50000,0.18281,0.18644,0.05,100 +50000,0.18643,0.19013,0.05,100 +50000,0.18643,0.19013,0.05,100 +50000,0.18643,0.19013,0.05,100 +50000,0.18643,0.19013,0.05,100 +50000,0.19011,0.19388,0.05,100 +50000,0.19011,0.19388,0.05,100 +50000,0.19011,0.19388,0.05,100 +50000,0.19387,0.19772,0.05,100 +50000,0.19387,0.19772,0.05,100 +50000,0.19387,0.19772,0.05,100 +50000,0.19387,0.19772,0.05,100 +50000,0.19771,0.20163,0.05,100 +50000,0.19771,0.20163,0.05,100 +50000,0.19771,0.20163,0.05,100 +50000,0.19771,0.20163,0.05,100 +50000,0.20162,0.20562,0.05,100 +50000,0.20162,0.20562,0.05,100 +50000,0.20162,0.20562,0.05,100 +50000,0.20162,0.20562,0.05,100 +50000,0.2056,0.20968,0.05,100 +50000,0.2056,0.20968,0.05,100 +50000,0.2056,0.20968,0.05,100 +50000,0.2056,0.20968,0.05,100 +50000,0.20967,0.21383,0.05,100 +50000,0.20967,0.21383,0.05,100 +50000,0.20967,0.21383,0.05,100 +50000,0.20967,0.21383,0.05,100 +50000,0.21382,0.21806,0.05,100 +50000,0.21382,0.21806,0.05,100 +50000,0.21382,0.21806,0.05,100 +50000,0.21382,0.21806,0.05,100 +50000,0.21382,0.21806,0.05,100 +50000,0.21805,0.22237,0.05,100 +50000,0.21805,0.22237,0.05,100 +50000,0.21805,0.22237,0.05,100 +50000,0.21805,0.22237,0.05,100 +50000,0.22236,0.22677,0.05,100 +50000,0.22236,0.22677,0.05,100 +50000,0.22236,0.22677,0.05,100 +50000,0.22236,0.22677,0.05,100 +50000,0.22676,0.23125,0.05,100 +50000,0.22676,0.23125,0.05,100 +50000,0.22676,0.23125,0.05,100 +50000,0.22676,0.23125,0.05,100 +50000,0.22676,0.23125,0.05,100 +50000,0.23124,0.23583,0.05,100 +50000,0.23124,0.23583,0.05,100 +50000,0.23124,0.23583,0.05,100 +50000,0.23124,0.23583,0.05,100 +50000,0.23582,0.2405,0.05,100 +50000,0.23582,0.2405,0.05,100 +50000,0.23582,0.2405,0.05,100 +50000,0.23582,0.2405,0.05,100 +50000,0.23582,0.2405,0.05,100 +50000,0.24048,0.24525,0.05,100 +50000,0.24048,0.24525,0.05,100 +50000,0.24048,0.24525,0.05,100 +50000,0.24048,0.24525,0.05,100 +50000,0.24048,0.24525,0.05,100 +50000,0.24524,0.25011,0.05,100 +50000,0.24524,0.25011,0.05,100 +50000,0.24524,0.25011,0.05,100 +50000,0.24524,0.25011,0.05,100 +50000,0.24524,0.25011,0.05,100 +50000,0.25009,0.25505,0.05,100 +50000,0.25009,0.25505,0.05,100 +50000,0.25009,0.25505,0.05,100 +50000,0.25009,0.25505,0.05,100 +50000,0.25009,0.25505,0.05,100 +50000,0.25504,0.2601,0.05,100 +50000,0.25504,0.2601,0.05,100 +50000,0.25504,0.2601,0.05,100 +50000,0.25504,0.2601,0.05,100 +50000,0.25504,0.2601,0.05,100 +50000,0.26009,0.26525,0.05,100 +50000,0.26009,0.26525,0.05,100 +50000,0.26009,0.26525,0.05,100 +50000,0.26009,0.26525,0.05,100 +50000,0.26009,0.26525,0.05,100 +50000,0.26524,0.2705,0.05,100 +50000,0.26524,0.2705,0.05,100 +50000,0.26524,0.2705,0.05,100 +50000,0.26524,0.2705,0.05,100 +50000,0.26524,0.2705,0.05,100 +50000,0.27048,0.27585,0.05,100 +50000,0.27048,0.27585,0.05,100 +50000,0.27048,0.27585,0.05,100 +50000,0.27048,0.27585,0.05,100 +50000,0.27048,0.27585,0.05,100 +50000,0.27584,0.28131,0.05,100 +50000,0.27584,0.28131,0.05,100 +50000,0.27584,0.28131,0.05,100 +50000,0.27584,0.28131,0.05,100 +50000,0.27584,0.28131,0.05,100 +50000,0.27584,0.28131,0.05,100 +50000,0.2813,0.28687,0.05,100 +50000,0.2813,0.28687,0.05,100 +50000,0.2813,0.28687,0.05,100 +50000,0.2813,0.28687,0.05,100 +50000,0.2813,0.28687,0.05,100 +50000,0.28686,0.29255,0.05,100 +50000,0.28686,0.29255,0.05,100 +50000,0.28686,0.29255,0.05,100 +50000,0.28686,0.29255,0.05,100 +50000,0.28686,0.29255,0.05,100 +50000,0.28686,0.29255,0.05,100 +50000,0.29254,0.29834,0.05,100 +50000,0.29254,0.29834,0.05,100 +50000,0.29254,0.29834,0.05,100 +50000,0.29254,0.29834,0.05,100 +50000,0.29254,0.29834,0.05,100 +50000,0.29254,0.29834,0.05,100 +50000,0.29833,0.30425,0.05,100 +50000,0.29833,0.30425,0.05,100 +50000,0.29833,0.30425,0.05,100 +50000,0.29833,0.30425,0.05,100 +50000,0.29833,0.30425,0.05,100 +50000,0.29833,0.30425,0.05,100 +50000,0.30424,0.31027,0.05,100 +50000,0.30424,0.31027,0.05,100 +50000,0.30424,0.31027,0.05,100 +50000,0.30424,0.31027,0.05,100 +50000,0.30424,0.31027,0.05,100 +50000,0.30424,0.31027,0.05,100 +50000,0.31026,0.31641,0.05,100 +50000,0.31026,0.31641,0.05,100 +50000,0.31026,0.31641,0.05,100 +50000,0.31026,0.31641,0.05,100 +50000,0.31026,0.31641,0.05,100 +50000,0.31026,0.31641,0.05,100 +50000,0.3164,0.32267,0.05,100 +50000,0.3164,0.32267,0.05,100 +50000,0.3164,0.32267,0.05,100 +50000,0.3164,0.32267,0.05,100 +50000,0.3164,0.32267,0.05,100 +50000,0.3164,0.32267,0.05,100 +50000,0.32266,0.32906,0.05,100 +50000,0.32266,0.32906,0.05,100 +50000,0.32266,0.32906,0.05,100 +50000,0.32266,0.32906,0.05,100 +50000,0.32266,0.32906,0.05,100 +50000,0.32266,0.32906,0.05,100 +50000,0.32266,0.32906,0.05,100 +50000,0.32905,0.33558,0.05,100 +50000,0.32905,0.33558,0.05,100 +50000,0.32905,0.33558,0.05,100 +50000,0.32905,0.33558,0.05,100 +50000,0.32905,0.33558,0.05,100 +50000,0.32905,0.33558,0.05,100 +50000,0.33556,0.34222,0.05,100 +50000,0.33556,0.34222,0.05,100 +50000,0.33556,0.34222,0.05,100 +50000,0.33556,0.34222,0.05,100 +50000,0.33556,0.34222,0.05,100 +50000,0.33556,0.34222,0.05,100 +50000,0.33556,0.34222,0.05,100 +50000,0.34221,0.34899,0.05,100 +50000,0.34221,0.34899,0.05,100 +50000,0.34221,0.34899,0.05,100 +50000,0.34221,0.34899,0.05,100 +50000,0.34221,0.34899,0.05,100 +50000,0.34221,0.34899,0.05,100 +50000,0.34221,0.34899,0.05,100 +50000,0.34898,0.3559,0.05,100 +50000,0.34898,0.3559,0.05,100 +50000,0.34898,0.3559,0.05,100 +50000,0.34898,0.3559,0.05,100 +50000,0.34898,0.3559,0.05,100 +50000,0.34898,0.3559,0.05,100 +50000,0.35589,0.36295,0.05,100 +50000,0.35589,0.36295,0.05,100 +50000,0.35589,0.36295,0.05,100 +50000,0.35589,0.36295,0.05,100 +50000,0.35589,0.36295,0.05,100 +50000,0.35589,0.36295,0.05,100 +50000,0.35589,0.36295,0.05,100 +50000,0.36294,0.37013,0.05,100 +50000,0.36294,0.37013,0.05,100 +50000,0.36294,0.37013,0.05,100 +50000,0.36294,0.37013,0.05,100 +50000,0.36294,0.37013,0.05,100 +50000,0.36294,0.37013,0.05,100 +50000,0.36294,0.37013,0.05,100 +50000,0.36294,0.37013,0.05,100 +50000,0.37012,0.37746,0.05,100 +50000,0.37012,0.37746,0.05,100 +50000,0.37012,0.37746,0.05,100 +50000,0.37012,0.37746,0.05,100 +50000,0.37012,0.37746,0.05,100 +50000,0.37012,0.37746,0.05,100 +50000,0.37012,0.37746,0.05,100 +50000,0.37745,0.38494,0.05,100 +50000,0.37745,0.38494,0.05,100 +50000,0.37745,0.38494,0.05,100 +50000,0.37745,0.38494,0.05,100 +50000,0.37745,0.38494,0.05,100 +50000,0.37745,0.38494,0.05,100 +50000,0.37745,0.38494,0.05,100 +50000,0.38493,0.39256,0.05,100 +50000,0.38493,0.39256,0.05,100 +50000,0.38493,0.39256,0.05,100 +50000,0.38493,0.39256,0.05,100 +50000,0.38493,0.39256,0.05,100 +50000,0.38493,0.39256,0.05,100 +50000,0.38493,0.39256,0.05,100 +50000,0.38493,0.39256,0.05,100 +50000,0.39255,0.40033,0.05,100 +50000,0.39255,0.40033,0.05,100 +50000,0.39255,0.40033,0.05,100 +50000,0.39255,0.40033,0.05,100 +50000,0.39255,0.40033,0.05,100 +50000,0.39255,0.40033,0.05,100 +50000,0.39255,0.40033,0.05,100 +50000,0.39255,0.40033,0.05,100 +50000,0.40032,0.40826,0.05,100 +50000,0.40032,0.40826,0.05,100 +50000,0.40032,0.40826,0.05,100 +50000,0.40032,0.40826,0.05,100 +50000,0.40032,0.40826,0.05,100 +50000,0.40032,0.40826,0.05,100 +50000,0.40032,0.40826,0.05,100 +50000,0.40032,0.40826,0.05,100 +50000,0.40825,0.41634,0.05,100 +50000,0.40825,0.41634,0.05,100 +50000,0.40825,0.41634,0.05,100 +50000,0.40825,0.41634,0.05,100 +50000,0.40825,0.41634,0.05,100 +50000,0.40825,0.41634,0.05,100 +50000,0.40825,0.41634,0.05,100 +50000,0.40825,0.41634,0.05,100 +50000,0.41633,0.42459,0.05,100 +50000,0.41633,0.42459,0.05,100 +50000,0.41633,0.42459,0.05,100 +50000,0.41633,0.42459,0.05,100 +50000,0.41633,0.42459,0.05,100 +50000,0.41633,0.42459,0.05,100 +50000,0.41633,0.42459,0.05,100 +50000,0.41633,0.42459,0.05,100 +50000,0.42458,0.433,0.05,100 +50000,0.42458,0.433,0.05,100 +50000,0.42458,0.433,0.05,100 +50000,0.42458,0.433,0.05,100 +50000,0.42458,0.433,0.05,100 +50000,0.42458,0.433,0.05,100 +50000,0.42458,0.433,0.05,100 +50000,0.42458,0.433,0.05,100 +50000,0.42458,0.433,0.05,100 +50000,0.43298,0.44157,0.05,100 +50000,0.43298,0.44157,0.05,100 +50000,0.43298,0.44157,0.05,100 +50000,0.43298,0.44157,0.05,100 +50000,0.43298,0.44157,0.05,100 +50000,0.43298,0.44157,0.05,100 +50000,0.43298,0.44157,0.05,100 +50000,0.43298,0.44157,0.05,100 +50000,0.44156,0.45031,0.05,100 +50000,0.44156,0.45031,0.05,100 +50000,0.44156,0.45031,0.05,100 +50000,0.44156,0.45031,0.05,100 +50000,0.44156,0.45031,0.05,100 +50000,0.44156,0.45031,0.05,100 +50000,0.44156,0.45031,0.05,100 +50000,0.44156,0.45031,0.05,100 +50000,0.44156,0.45031,0.05,100 +50000,0.4503,0.45923,0.05,100 +50000,0.4503,0.45923,0.05,100 +50000,0.4503,0.45923,0.05,100 +50000,0.4503,0.45923,0.05,100 +50000,0.4503,0.45923,0.05,100 +50000,0.4503,0.45923,0.05,100 +50000,0.4503,0.45923,0.05,100 +50000,0.4503,0.45923,0.05,100 +50000,0.4503,0.45923,0.05,100 +50000,0.45922,0.46833,0.05,100 +50000,0.45922,0.46833,0.05,100 +50000,0.45922,0.46833,0.05,100 +50000,0.45922,0.46833,0.05,100 +50000,0.45922,0.46833,0.05,100 +50000,0.45922,0.46833,0.05,100 +50000,0.45922,0.46833,0.05,100 +50000,0.45922,0.46833,0.05,100 +50000,0.45922,0.46833,0.05,100 +50000,0.46832,0.4776,0.05,100 +50000,0.46832,0.4776,0.05,100 +50000,0.46832,0.4776,0.05,100 +50000,0.46832,0.4776,0.05,100 +50000,0.46832,0.4776,0.05,100 +50000,0.46832,0.4776,0.05,100 +50000,0.46832,0.4776,0.05,100 +50000,0.46832,0.4776,0.05,100 +50000,0.46832,0.4776,0.05,100 +50000,0.47759,0.48706,0.05,100 +50000,0.47759,0.48706,0.05,100 +50000,0.47759,0.48706,0.05,100 +50000,0.47759,0.48706,0.05,100 +50000,0.47759,0.48706,0.05,100 +50000,0.47759,0.48706,0.05,100 +50000,0.47759,0.48706,0.05,100 +50000,0.47759,0.48706,0.05,100 +50000,0.47759,0.48706,0.05,100 +50000,0.47759,0.48706,0.05,100 +50000,0.48705,0.49671,0.05,100 +50000,0.48705,0.49671,0.05,100 +50000,0.48705,0.49671,0.05,100 +50000,0.48705,0.49671,0.05,100 +50000,0.48705,0.49671,0.05,100 +50000,0.48705,0.49671,0.05,100 +50000,0.48705,0.49671,0.05,100 +50000,0.48705,0.49671,0.05,100 +50000,0.48705,0.49671,0.05,100 +50000,0.4967,0.50655,0.05,100 +50000,0.4967,0.50655,0.05,100 +50000,0.4967,0.50655,0.05,100 +50000,0.4967,0.50655,0.05,100 +50000,0.4967,0.50655,0.05,100 +50000,0.4967,0.50655,0.05,100 +50000,0.4967,0.50655,0.05,100 +50000,0.4967,0.50655,0.05,100 +50000,0.4967,0.50655,0.05,100 +50000,0.4967,0.50655,0.05,100 +50000,0.50654,0.51658,0.05,100 +50000,0.50654,0.51658,0.05,100 +50000,0.50654,0.51658,0.05,100 +50000,0.50654,0.51658,0.05,100 +50000,0.50654,0.51658,0.05,100 +50000,0.50654,0.51658,0.05,100 +50000,0.50654,0.51658,0.05,100 +50000,0.50654,0.51658,0.05,100 +50000,0.50654,0.51658,0.05,100 +50000,0.50654,0.51658,0.05,100 +50000,0.51657,0.52681,0.05,100 +50000,0.51657,0.52681,0.05,100 +50000,0.51657,0.52681,0.05,100 +50000,0.51657,0.52681,0.05,100 +50000,0.51657,0.52681,0.05,100 +50000,0.51657,0.52681,0.05,100 +50000,0.51657,0.52681,0.05,100 +50000,0.51657,0.52681,0.05,100 +50000,0.51657,0.52681,0.05,100 +50000,0.51657,0.52681,0.05,100 +50000,0.5268,0.53725,0.05,100 +50000,0.5268,0.53725,0.05,100 +50000,0.5268,0.53725,0.05,100 +50000,0.5268,0.53725,0.05,100 +50000,0.5268,0.53725,0.05,100 +50000,0.5268,0.53725,0.05,100 +50000,0.5268,0.53725,0.05,100 +50000,0.5268,0.53725,0.05,100 +50000,0.5268,0.53725,0.05,100 +50000,0.5268,0.53725,0.05,100 +50000,0.5268,0.53725,0.05,100 +50000,0.53724,0.54789,0.05,100 +50000,0.53724,0.54789,0.05,100 +50000,0.53724,0.54789,0.05,100 +50000,0.53724,0.54789,0.05,100 +50000,0.53724,0.54789,0.05,100 +50000,0.53724,0.54789,0.05,100 +50000,0.53724,0.54789,0.05,100 +50000,0.53724,0.54789,0.05,100 +50000,0.53724,0.54789,0.05,100 +50000,0.53724,0.54789,0.05,100 +50000,0.54788,0.55874,0.05,100 +50000,0.54788,0.55874,0.05,100 +50000,0.54788,0.55874,0.05,100 +50000,0.54788,0.55874,0.05,100 +50000,0.54788,0.55874,0.05,100 +50000,0.54788,0.55874,0.05,100 +50000,0.54788,0.55874,0.05,100 +50000,0.54788,0.55874,0.05,100 +50000,0.54788,0.55874,0.05,100 +50000,0.54788,0.55874,0.05,100 +50000,0.54788,0.55874,0.05,100 +50000,0.55873,0.56981,0.05,100 +50000,0.55873,0.56981,0.05,100 +50000,0.55873,0.56981,0.05,100 +50000,0.55873,0.56981,0.05,100 +50000,0.55873,0.56981,0.05,100 +50000,0.55873,0.56981,0.05,100 +50000,0.55873,0.56981,0.05,100 +50000,0.55873,0.56981,0.05,100 +50000,0.55873,0.56981,0.05,100 +50000,0.55873,0.56981,0.05,100 +50000,0.55873,0.56981,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.5698,0.5811,0.05,100 +50000,0.58109,0.59261,0.05,100 +50000,0.58109,0.59261,0.05,100 +50000,0.58109,0.59261,0.05,100 +50000,0.58109,0.59261,0.05,100 +50000,0.58109,0.59261,0.05,100 +50000,0.58109,0.59261,0.05,100 +50000,0.58109,0.59261,0.05,100 +50000,0.58109,0.59261,0.05,100 +50000,0.58109,0.59261,0.05,100 +50000,0.58109,0.59261,0.05,100 +50000,0.58109,0.59261,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.5926,0.60435,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.60434,0.61632,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.61631,0.62853,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.62852,0.64098,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.64097,0.65368,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.65367,0.66663,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.66662,0.67984,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.67983,0.69331,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,0.6933,0.70704,0.05,100 +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan +50000,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/temperatureDependentVolumetricHeatCapacity_plot.py similarity index 68% rename from src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py rename to src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/temperatureDependentVolumetricHeatCapacity_plot.py index 39a4c1e8a00..cb3f51e16fe 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion/nonLinearThermalDiffusionAroundWellbore.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/temperatureDependentVolumetricHeatCapacity_plot.py @@ -19,9 +19,9 @@ def steadyState(Tin, Tout, Rin, Rout, radialCoordinate): def diffusionFunction(radialCoordinate, Rin, diffusionCoefficient, diffusionTime): return special.erfc( (radialCoordinate - Rin) / 2.0 / np.sqrt( diffusionCoefficient * diffusionTime ) ) -def computeTransientTemperature(Tin, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime): +def computeTransientTemperature(Tin, Tout, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime): # Ref. Wang and Papamichos (1994), https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94WR01774 - return Tin * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) + return Tout + (Tin-Tout) * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) def computeThermalDiffusionCoefficient(thermalConductivity, volumetricHeatCapacity): return thermalConductivity / volumetricHeatCapacity @@ -40,29 +40,33 @@ def coefficientMatrix(thermalConductivity, volumetricHeatCapacity, r, dt, N): for i in range(1,N): dr = r[i] - r[i-1] r_i = r[i] - A[i, i-1] = - thermalConductivity[i]/volumetricHeatCapacity[i] * (dt/(dr**2) - dt/(2 * r_i * dr)) \ + + diffusivity_i = thermalConductivity[i]/volumetricHeatCapacity[i] + A[i, i-1] = - diffusivity_i * (dt/(dr**2) - dt/(2 * r_i * dr)) \ + (thermalConductivity[i+1] - thermalConductivity[i-1])/volumetricHeatCapacity[i]*dt/4/(dr**2) - A[i, i] = 1 + 2 * thermalConductivity[i]/volumetricHeatCapacity[i] * dt / (dr**2) - A[i, i+1] = - thermalConductivity[i]/volumetricHeatCapacity[i] * (dt/(dr**2) + dt/(2 * r_i * dr)) \ + A[i, i] = 1.0 + 2.0 * diffusivity_i * dt / (dr**2) + A[i, i+1] = - diffusivity_i * (dt/(dr**2) + dt/(2 * r_i * dr)) \ - (thermalConductivity[i+1] - thermalConductivity[i-1])/volumetricHeatCapacity[i]*dt/4/(dr**2) # Boundary conditions # No-flux at r=0 approximated by setting the flux between the first two cells to zero - A[0, 0] = 1 - A[N, N] = 1 + A[0, 0] = 1.0 + A[N, N] = 1.0 return A -def solve_radial_diffusion(r, tmax, dt, Tin, lambda0, lambda_gradient, c0, c_gradient, Treference): +def solve_radial_diffusion(r, tmax, dt, Tin, Tout, lambda0, lambda_gradient, c0, c_gradient, Treference): N = len(r)-1 # Time setup n_steps = int(tmax / dt) # Time-stepping - T = np.zeros(N+1) # initial condition u(r, 0) + T = np.zeros(N+1) + Tout # initial condition u(r, 0) T[0] = Tin for step in range(n_steps): thermalConductivity = temperatureDependentThermalConductivity(lambda0, lambda_gradient, T, Treference) + volumetricHeatCapacity = temperatureDependentVolumetricHeat(c0, c_gradient, T, Treference) + A = coefficientMatrix(thermalConductivity, volumetricHeatCapacity, r, dt, N) T = spsolve(A, T) @@ -101,8 +105,14 @@ def getLoadingFromXML(xmlFilePath): Tin = float(fsParam.get('scale')) if fsParam.get('setNames') == "{ rpos }": Tout = float(fsParam.get('scale')) - - thermalConductivity = float( extractDataFromXMLList( tree.find('Constitutive/SinglePhaseConstantThermalConductivity').get('thermalConductivityComponents') )[0] ) + + + tree_SinglePhaseThermalConductivities = tree.findall('Constitutive/SinglePhaseThermalConductivity') + + for tree_SinglePhaseThermalConductivity in tree_SinglePhaseThermalConductivities: + if tree_SinglePhaseThermalConductivity.get('name') == "thermalCond_linear": + defaultThermalConductivity = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('defaultThermalConductivityComponents') )[0] ) + thermalConductivityGradient = 0.0 tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') @@ -112,6 +122,7 @@ def getLoadingFromXML(xmlFilePath): dVolumetricHeatCapacity_dTemperature = float( tree_SolidInternalEnergy.get('dVolumetricHeatCapacity_dTemperature') ) referenceTemperature = float( tree_SolidInternalEnergy.get('referenceTemperature') ) + permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) porosity = float( tree.find('Constitutive/PressurePorosity').get('defaultReferencePorosity') ) @@ -122,16 +133,16 @@ def getLoadingFromXML(xmlFilePath): fluidThermalExpansionCoefficient = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('thermalExpansionCoeff') ) - return [Pin, Pout, Tin, Tout, thermalConductivity, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient] + return [Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient] def main(): xmlFilePath = "../../../../../../../inputFiles/singlePhaseFlow/" - Rin, Rout = getWellboreGeometryFromXML(xmlFilePath+"thermalCompressible_nonLinear_2d_benchmark.xml") + Rin, Rout = getWellboreGeometryFromXML(xmlFilePath+"thermalCompressible_temperatureDependentVolumetricHeatCapacity_benchmark.xml") - Pin, Pout, Tin, Tout, thermalConductivity, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient = getLoadingFromXML(xmlFilePath+"thermalCompressible_2d_base.xml") + Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient = getLoadingFromXML(xmlFilePath+"thermalCompressible_2d_base.xml") plt.figure(figsize=(10,7)) font = {'size' : 16} @@ -144,29 +155,32 @@ def main(): data.drop_duplicates(inplace=True) data.reset_index(drop=True, inplace=True) - radialCoordinate = data['elementCenter:0'] + radialCoordinate = (data['elementCenter:0']**2.0 + data['elementCenter:1']**2.0)**0.5 temperature = data['temperature'] #pressure = data['pressure'] diffusionTime = data['Time'][0] # Analytical results for linear thermal behavior, for comparison - thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(thermalConductivity, referenceVolumetricHeatCapacity) + radialCoordinate_anal = radialCoordinate# np.arange(Rin, Rout, (Rout-Rin)/100) + + thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(defaultThermalConductivity, volumetricHeatCapacity) - T_transient_linear = computeTransientTemperature(Tin, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime) + T_transient_linear = computeTransientTemperature(Tin, Tout, Rin, radialCoordinate_anal, thermalDiffusionCoefficient, diffusionTime) # Analytical results of the steady state regime for comparison - T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate) + T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate_anal) # Finite different results for non-linear thermal behavior - T_transient_nonLinear = solve_radial_diffusion(radialCoordinate, diffusionTime, diffusionTime/100, Tin, thermalConductivity, 0, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature) + + T_transient_nonLinear = solve_radial_diffusion(radialCoordinate_anal, diffusionTime, diffusionTime/100, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature) # Visualization # Temperature plt.subplot(2,2,chart_idx+1) plt.plot( radialCoordinate, temperature, 'k+' , label='GEOS' ) - plt.plot( radialCoordinate, T_transient_nonLinear, 'g-' , label='FDM Non-Linear' ) - plt.plot( radialCoordinate, T_transient_linear, 'r-' , label='Analytic Linear' ) - plt.plot( radialCoordinate, T_steadyState, 'b-' , label='Steady State' ) + plt.plot( radialCoordinate_anal, T_transient_nonLinear, 'g-' , label='FDM Non-Linear' ) + plt.plot( radialCoordinate_anal, T_transient_linear, 'r-' , label='Analytic Linear' ) + plt.plot( radialCoordinate_anal, T_steadyState, 'b-' , label='Steady State' ) if chart_idx==1: plt.legend() @@ -177,13 +191,12 @@ def main(): if chart_idx in [0,2]: plt.ylabel('Temperature (°C)') - plt.ylim(-10,100) - plt.xlim(0,1.0) + plt.ylim(-30,110) + plt.xlim(0.,0.5) plt.title('t = '+str(diffusionTime)+'(s)') plt.tight_layout() plt.show() - if __name__ == "__main__": main() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_1.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_1.csv deleted file mode 100644 index 4e2e56defb8..00000000000 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_1.csv +++ /dev/null @@ -1,1002 +0,0 @@ -Time,"elementCenter:0","elementCenter:1","elementCenter:2","pressure","temperature" -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,nan,nan,nan,nan,nan -10000,0.10099,0.0009915,0.05,11157,98.637 -10000,0.10099,0.0009915,0.05,11157,98.637 -10000,0.10299,0.0010111,0.05,33009,95.965 -10000,0.10299,0.0010111,0.05,33009,95.965 -10000,0.10499,0.0010308,0.05,54404,93.345 -10000,0.10499,0.0010308,0.05,54404,93.345 -10000,0.10734,0.0010538,0.05,79006,90.329 -10000,0.10734,0.0010538,0.05,79006,90.329 -10000,0.10734,0.0010538,0.05,79006,90.329 -10000,0.11004,0.0010803,0.05,1.0645e+05,86.957 -10000,0.11004,0.0010803,0.05,1.0645e+05,86.957 -10000,0.11004,0.0010803,0.05,1.0645e+05,86.957 -10000,0.11274,0.0011068,0.05,1.3309e+05,83.676 -10000,0.11274,0.0011068,0.05,1.3309e+05,83.676 -10000,0.11274,0.0011068,0.05,1.3309e+05,83.676 -10000,0.11544,0.0011334,0.05,1.5893e+05,80.484 -10000,0.11544,0.0011334,0.05,1.5893e+05,80.484 -10000,0.11814,0.0011599,0.05,1.8397e+05,77.381 -10000,0.11814,0.0011599,0.05,1.8397e+05,77.381 -10000,0.11814,0.0011599,0.05,1.8397e+05,77.381 -10000,0.12084,0.0011864,0.05,2.0822e+05,74.363 -10000,0.12084,0.0011864,0.05,2.0822e+05,74.363 -10000,0.12084,0.0011864,0.05,2.0822e+05,74.363 -10000,0.12354,0.0012129,0.05,2.3168e+05,71.432 -10000,0.12354,0.0012129,0.05,2.3168e+05,71.432 -10000,0.12624,0.0012394,0.05,2.5437e+05,68.583 -10000,0.12624,0.0012394,0.05,2.5437e+05,68.583 -10000,0.12624,0.0012394,0.05,2.5437e+05,68.583 -10000,0.12894,0.0012659,0.05,2.7628e+05,65.818 -10000,0.12894,0.0012659,0.05,2.7628e+05,65.818 -10000,0.12894,0.0012659,0.05,2.7628e+05,65.818 -10000,0.13164,0.0012924,0.05,2.9743e+05,63.133 -10000,0.13164,0.0012924,0.05,2.9743e+05,63.133 -10000,0.1343,0.0013185,0.05,3.1752e+05,60.566 -10000,0.1343,0.0013185,0.05,3.1752e+05,60.566 -10000,0.1343,0.0013185,0.05,3.1752e+05,60.566 -10000,0.13695,0.0013445,0.05,3.3679e+05,58.087 -10000,0.13695,0.0013445,0.05,3.3679e+05,58.087 -10000,0.13695,0.0013445,0.05,3.3679e+05,58.087 -10000,0.13965,0.001371,0.05,3.5571e+05,55.635 -10000,0.13965,0.001371,0.05,3.5571e+05,55.635 -10000,0.13965,0.001371,0.05,3.5571e+05,55.635 -10000,0.1424,0.0013981,0.05,3.7423e+05,53.214 -10000,0.1424,0.0013981,0.05,3.7423e+05,53.214 -10000,0.14521,0.0014256,0.05,3.9234e+05,50.826 -10000,0.14521,0.0014256,0.05,3.9234e+05,50.826 -10000,0.14521,0.0014256,0.05,3.9234e+05,50.826 -10000,0.14807,0.0014538,0.05,4.0999e+05,48.473 -10000,0.14807,0.0014538,0.05,4.0999e+05,48.473 -10000,0.14807,0.0014538,0.05,4.0999e+05,48.473 -10000,0.151,0.0014824,0.05,4.2717e+05,46.158 -10000,0.151,0.0014824,0.05,4.2717e+05,46.158 -10000,0.151,0.0014824,0.05,4.2717e+05,46.158 -10000,0.15397,0.0015117,0.05,4.4383e+05,43.883 -10000,0.15397,0.0015117,0.05,4.4383e+05,43.883 -10000,0.15397,0.0015117,0.05,4.4383e+05,43.883 -10000,0.15701,0.0015415,0.05,4.5994e+05,41.652 -10000,0.15701,0.0015415,0.05,4.5994e+05,41.652 -10000,0.15701,0.0015415,0.05,4.5994e+05,41.652 -10000,0.16011,0.0015719,0.05,4.7548e+05,39.466 -10000,0.16011,0.0015719,0.05,4.7548e+05,39.466 -10000,0.16011,0.0015719,0.05,4.7548e+05,39.466 -10000,0.16327,0.001603,0.05,4.9042e+05,37.329 -10000,0.16327,0.001603,0.05,4.9042e+05,37.329 -10000,0.16327,0.001603,0.05,4.9042e+05,37.329 -10000,0.16649,0.0016346,0.05,5.0472e+05,35.242 -10000,0.16649,0.0016346,0.05,5.0472e+05,35.242 -10000,0.16649,0.0016346,0.05,5.0472e+05,35.242 -10000,0.16649,0.0016346,0.05,5.0472e+05,35.242 -10000,0.16978,0.0016669,0.05,5.1835e+05,33.208 -10000,0.16978,0.0016669,0.05,5.1835e+05,33.208 -10000,0.16978,0.0016669,0.05,5.1835e+05,33.208 -10000,0.17313,0.0016998,0.05,5.313e+05,31.23 -10000,0.17313,0.0016998,0.05,5.313e+05,31.23 -10000,0.17313,0.0016998,0.05,5.313e+05,31.23 -10000,0.17655,0.0017333,0.05,5.4352e+05,29.309 -10000,0.17655,0.0017333,0.05,5.4352e+05,29.309 -10000,0.17655,0.0017333,0.05,5.4352e+05,29.309 -10000,0.17655,0.0017333,0.05,5.4352e+05,29.309 -10000,0.18004,0.0017676,0.05,5.55e+05,27.447 -10000,0.18004,0.0017676,0.05,5.55e+05,27.447 -10000,0.18004,0.0017676,0.05,5.55e+05,27.447 -10000,0.18359,0.0018025,0.05,5.6572e+05,25.648 -10000,0.18359,0.0018025,0.05,5.6572e+05,25.648 -10000,0.18359,0.0018025,0.05,5.6572e+05,25.648 -10000,0.18359,0.0018025,0.05,5.6572e+05,25.648 -10000,0.18722,0.001838,0.05,5.7565e+05,23.912 -10000,0.18722,0.001838,0.05,5.7565e+05,23.912 -10000,0.18722,0.001838,0.05,5.7565e+05,23.912 -10000,0.18722,0.001838,0.05,5.7565e+05,23.912 -10000,0.19091,0.0018743,0.05,5.8477e+05,22.24 -10000,0.19091,0.0018743,0.05,5.8477e+05,22.24 -10000,0.19091,0.0018743,0.05,5.8477e+05,22.24 -10000,0.19468,0.0019114,0.05,5.9307e+05,20.635 -10000,0.19468,0.0019114,0.05,5.9307e+05,20.635 -10000,0.19468,0.0019114,0.05,5.9307e+05,20.635 -10000,0.19468,0.0019114,0.05,5.9307e+05,20.635 -10000,0.19853,0.0019491,0.05,6.0054e+05,19.098 -10000,0.19853,0.0019491,0.05,6.0054e+05,19.098 -10000,0.19853,0.0019491,0.05,6.0054e+05,19.098 -10000,0.19853,0.0019491,0.05,6.0054e+05,19.098 -10000,0.20245,0.0019876,0.05,6.0715e+05,17.629 -10000,0.20245,0.0019876,0.05,6.0715e+05,17.629 -10000,0.20245,0.0019876,0.05,6.0715e+05,17.629 -10000,0.20245,0.0019876,0.05,6.0715e+05,17.629 -10000,0.20645,0.0020269,0.05,6.1292e+05,16.229 -10000,0.20645,0.0020269,0.05,6.1292e+05,16.229 -10000,0.20645,0.0020269,0.05,6.1292e+05,16.229 -10000,0.20645,0.0020269,0.05,6.1292e+05,16.229 -10000,0.21053,0.0020669,0.05,6.1782e+05,14.899 -10000,0.21053,0.0020669,0.05,6.1782e+05,14.899 -10000,0.21053,0.0020669,0.05,6.1782e+05,14.899 -10000,0.21053,0.0020669,0.05,6.1782e+05,14.899 -10000,0.21469,0.0021078,0.05,6.2187e+05,13.638 -10000,0.21469,0.0021078,0.05,6.2187e+05,13.638 -10000,0.21469,0.0021078,0.05,6.2187e+05,13.638 -10000,0.21469,0.0021078,0.05,6.2187e+05,13.638 -10000,0.21893,0.0021494,0.05,6.2506e+05,12.447 -10000,0.21893,0.0021494,0.05,6.2506e+05,12.447 -10000,0.21893,0.0021494,0.05,6.2506e+05,12.447 -10000,0.21893,0.0021494,0.05,6.2506e+05,12.447 -10000,0.21893,0.0021494,0.05,6.2506e+05,12.447 -10000,0.22326,0.0021919,0.05,6.274e+05,11.325 -10000,0.22326,0.0021919,0.05,6.274e+05,11.325 -10000,0.22326,0.0021919,0.05,6.274e+05,11.325 -10000,0.22326,0.0021919,0.05,6.274e+05,11.325 -10000,0.22767,0.0022352,0.05,6.289e+05,10.272 -10000,0.22767,0.0022352,0.05,6.289e+05,10.272 -10000,0.22767,0.0022352,0.05,6.289e+05,10.272 -10000,0.22767,0.0022352,0.05,6.289e+05,10.272 -10000,0.23217,0.0022794,0.05,6.2957e+05,9.2858 -10000,0.23217,0.0022794,0.05,6.2957e+05,9.2858 -10000,0.23217,0.0022794,0.05,6.2957e+05,9.2858 -10000,0.23217,0.0022794,0.05,6.2957e+05,9.2858 -10000,0.23217,0.0022794,0.05,6.2957e+05,9.2858 -10000,0.23676,0.0023244,0.05,6.2942e+05,8.3664 -10000,0.23676,0.0023244,0.05,6.2942e+05,8.3664 -10000,0.23676,0.0023244,0.05,6.2942e+05,8.3664 -10000,0.23676,0.0023244,0.05,6.2942e+05,8.3664 -10000,0.23676,0.0023244,0.05,6.2942e+05,8.3664 -10000,0.24144,0.0023704,0.05,6.2848e+05,7.5119 -10000,0.24144,0.0023704,0.05,6.2848e+05,7.5119 -10000,0.24144,0.0023704,0.05,6.2848e+05,7.5119 -10000,0.24144,0.0023704,0.05,6.2848e+05,7.5119 -10000,0.24621,0.0024172,0.05,6.2677e+05,6.7205 -10000,0.24621,0.0024172,0.05,6.2677e+05,6.7205 -10000,0.24621,0.0024172,0.05,6.2677e+05,6.7205 -10000,0.24621,0.0024172,0.05,6.2677e+05,6.7205 -10000,0.24621,0.0024172,0.05,6.2677e+05,6.7205 -10000,0.25108,0.002465,0.05,6.2432e+05,5.9904 -10000,0.25108,0.002465,0.05,6.2432e+05,5.9904 -10000,0.25108,0.002465,0.05,6.2432e+05,5.9904 -10000,0.25108,0.002465,0.05,6.2432e+05,5.9904 -10000,0.25108,0.002465,0.05,6.2432e+05,5.9904 -10000,0.25604,0.0025137,0.05,6.2114e+05,5.3193 -10000,0.25604,0.0025137,0.05,6.2114e+05,5.3193 -10000,0.25604,0.0025137,0.05,6.2114e+05,5.3193 -10000,0.25604,0.0025137,0.05,6.2114e+05,5.3193 -10000,0.25604,0.0025137,0.05,6.2114e+05,5.3193 -10000,0.2611,0.0025634,0.05,6.1727e+05,4.705 -10000,0.2611,0.0025634,0.05,6.1727e+05,4.705 -10000,0.2611,0.0025634,0.05,6.1727e+05,4.705 -10000,0.2611,0.0025634,0.05,6.1727e+05,4.705 -10000,0.2611,0.0025634,0.05,6.1727e+05,4.705 -10000,0.26626,0.0026141,0.05,6.1275e+05,4.145 -10000,0.26626,0.0026141,0.05,6.1275e+05,4.145 -10000,0.26626,0.0026141,0.05,6.1275e+05,4.145 -10000,0.26626,0.0026141,0.05,6.1275e+05,4.145 -10000,0.26626,0.0026141,0.05,6.1275e+05,4.145 -10000,0.27153,0.0026658,0.05,6.076e+05,3.6365 -10000,0.27153,0.0026658,0.05,6.076e+05,3.6365 -10000,0.27153,0.0026658,0.05,6.076e+05,3.6365 -10000,0.27153,0.0026658,0.05,6.076e+05,3.6365 -10000,0.27153,0.0026658,0.05,6.076e+05,3.6365 -10000,0.27153,0.0026658,0.05,6.076e+05,3.6365 -10000,0.2769,0.0027185,0.05,6.0186e+05,3.1768 -10000,0.2769,0.0027185,0.05,6.0186e+05,3.1768 -10000,0.2769,0.0027185,0.05,6.0186e+05,3.1768 -10000,0.2769,0.0027185,0.05,6.0186e+05,3.1768 -10000,0.2769,0.0027185,0.05,6.0186e+05,3.1768 -10000,0.28237,0.0027723,0.05,5.9557e+05,2.7631 -10000,0.28237,0.0027723,0.05,5.9557e+05,2.7631 -10000,0.28237,0.0027723,0.05,5.9557e+05,2.7631 -10000,0.28237,0.0027723,0.05,5.9557e+05,2.7631 -10000,0.28237,0.0027723,0.05,5.9557e+05,2.7631 -10000,0.28237,0.0027723,0.05,5.9557e+05,2.7631 -10000,0.28796,0.0028271,0.05,5.8877e+05,2.3925 -10000,0.28796,0.0028271,0.05,5.8877e+05,2.3925 -10000,0.28796,0.0028271,0.05,5.8877e+05,2.3925 -10000,0.28796,0.0028271,0.05,5.8877e+05,2.3925 -10000,0.28796,0.0028271,0.05,5.8877e+05,2.3925 -10000,0.29365,0.002883,0.05,5.8149e+05,2.062 -10000,0.29365,0.002883,0.05,5.8149e+05,2.062 -10000,0.29365,0.002883,0.05,5.8149e+05,2.062 -10000,0.29365,0.002883,0.05,5.8149e+05,2.062 -10000,0.29365,0.002883,0.05,5.8149e+05,2.062 -10000,0.29365,0.002883,0.05,5.8149e+05,2.062 -10000,0.29946,0.00294,0.05,5.7377e+05,1.7688 -10000,0.29946,0.00294,0.05,5.7377e+05,1.7688 -10000,0.29946,0.00294,0.05,5.7377e+05,1.7688 -10000,0.29946,0.00294,0.05,5.7377e+05,1.7688 -10000,0.29946,0.00294,0.05,5.7377e+05,1.7688 -10000,0.29946,0.00294,0.05,5.7377e+05,1.7688 -10000,0.30538,0.0029982,0.05,5.6564e+05,1.5099 -10000,0.30538,0.0029982,0.05,5.6564e+05,1.5099 -10000,0.30538,0.0029982,0.05,5.6564e+05,1.5099 -10000,0.30538,0.0029982,0.05,5.6564e+05,1.5099 -10000,0.30538,0.0029982,0.05,5.6564e+05,1.5099 -10000,0.30538,0.0029982,0.05,5.6564e+05,1.5099 -10000,0.31142,0.0030575,0.05,5.5715e+05,1.2824 -10000,0.31142,0.0030575,0.05,5.5715e+05,1.2824 -10000,0.31142,0.0030575,0.05,5.5715e+05,1.2824 -10000,0.31142,0.0030575,0.05,5.5715e+05,1.2824 -10000,0.31142,0.0030575,0.05,5.5715e+05,1.2824 -10000,0.31142,0.0030575,0.05,5.5715e+05,1.2824 -10000,0.31758,0.003118,0.05,5.4832e+05,1.0837 -10000,0.31758,0.003118,0.05,5.4832e+05,1.0837 -10000,0.31758,0.003118,0.05,5.4832e+05,1.0837 -10000,0.31758,0.003118,0.05,5.4832e+05,1.0837 -10000,0.31758,0.003118,0.05,5.4832e+05,1.0837 -10000,0.31758,0.003118,0.05,5.4832e+05,1.0837 -10000,0.32386,0.0031796,0.05,5.392e+05,0.91088 -10000,0.32386,0.0031796,0.05,5.392e+05,0.91088 -10000,0.32386,0.0031796,0.05,5.392e+05,0.91088 -10000,0.32386,0.0031796,0.05,5.392e+05,0.91088 -10000,0.32386,0.0031796,0.05,5.392e+05,0.91088 -10000,0.32386,0.0031796,0.05,5.392e+05,0.91088 -10000,0.32386,0.0031796,0.05,5.392e+05,0.91088 -10000,0.33027,0.0032425,0.05,5.2982e+05,0.76151 -10000,0.33027,0.0032425,0.05,5.2982e+05,0.76151 -10000,0.33027,0.0032425,0.05,5.2982e+05,0.76151 -10000,0.33027,0.0032425,0.05,5.2982e+05,0.76151 -10000,0.33027,0.0032425,0.05,5.2982e+05,0.76151 -10000,0.33027,0.0032425,0.05,5.2982e+05,0.76151 -10000,0.3368,0.0033067,0.05,5.202e+05,0.63311 -10000,0.3368,0.0033067,0.05,5.202e+05,0.63311 -10000,0.3368,0.0033067,0.05,5.202e+05,0.63311 -10000,0.3368,0.0033067,0.05,5.202e+05,0.63311 -10000,0.3368,0.0033067,0.05,5.202e+05,0.63311 -10000,0.3368,0.0033067,0.05,5.202e+05,0.63311 -10000,0.3368,0.0033067,0.05,5.202e+05,0.63311 -10000,0.34347,0.0033721,0.05,5.1038e+05,0.52338 -10000,0.34347,0.0033721,0.05,5.1038e+05,0.52338 -10000,0.34347,0.0033721,0.05,5.1038e+05,0.52338 -10000,0.34347,0.0033721,0.05,5.1038e+05,0.52338 -10000,0.34347,0.0033721,0.05,5.1038e+05,0.52338 -10000,0.34347,0.0033721,0.05,5.1038e+05,0.52338 -10000,0.35026,0.0034388,0.05,5.0039e+05,0.43015 -10000,0.35026,0.0034388,0.05,5.0039e+05,0.43015 -10000,0.35026,0.0034388,0.05,5.0039e+05,0.43015 -10000,0.35026,0.0034388,0.05,5.0039e+05,0.43015 -10000,0.35026,0.0034388,0.05,5.0039e+05,0.43015 -10000,0.35026,0.0034388,0.05,5.0039e+05,0.43015 -10000,0.35026,0.0034388,0.05,5.0039e+05,0.43015 -10000,0.35719,0.0035069,0.05,4.9025e+05,0.35142 -10000,0.35719,0.0035069,0.05,4.9025e+05,0.35142 -10000,0.35719,0.0035069,0.05,4.9025e+05,0.35142 -10000,0.35719,0.0035069,0.05,4.9025e+05,0.35142 -10000,0.35719,0.0035069,0.05,4.9025e+05,0.35142 -10000,0.35719,0.0035069,0.05,4.9025e+05,0.35142 -10000,0.35719,0.0035069,0.05,4.9025e+05,0.35142 -10000,0.36426,0.0035762,0.05,4.7999e+05,0.28535 -10000,0.36426,0.0035762,0.05,4.7999e+05,0.28535 -10000,0.36426,0.0035762,0.05,4.7999e+05,0.28535 -10000,0.36426,0.0035762,0.05,4.7999e+05,0.28535 -10000,0.36426,0.0035762,0.05,4.7999e+05,0.28535 -10000,0.36426,0.0035762,0.05,4.7999e+05,0.28535 -10000,0.36426,0.0035762,0.05,4.7999e+05,0.28535 -10000,0.37147,0.003647,0.05,4.6962e+05,0.23025 -10000,0.37147,0.003647,0.05,4.6962e+05,0.23025 -10000,0.37147,0.003647,0.05,4.6962e+05,0.23025 -10000,0.37147,0.003647,0.05,4.6962e+05,0.23025 -10000,0.37147,0.003647,0.05,4.6962e+05,0.23025 -10000,0.37147,0.003647,0.05,4.6962e+05,0.23025 -10000,0.37147,0.003647,0.05,4.6962e+05,0.23025 -10000,0.37147,0.003647,0.05,4.6962e+05,0.23025 -10000,0.37882,0.0037192,0.05,4.5918e+05,0.1846 -10000,0.37882,0.0037192,0.05,4.5918e+05,0.1846 -10000,0.37882,0.0037192,0.05,4.5918e+05,0.1846 -10000,0.37882,0.0037192,0.05,4.5918e+05,0.1846 -10000,0.37882,0.0037192,0.05,4.5918e+05,0.1846 -10000,0.37882,0.0037192,0.05,4.5918e+05,0.1846 -10000,0.37882,0.0037192,0.05,4.5918e+05,0.1846 -10000,0.38632,0.0037928,0.05,4.4867e+05,0.14703 -10000,0.38632,0.0037928,0.05,4.4867e+05,0.14703 -10000,0.38632,0.0037928,0.05,4.4867e+05,0.14703 -10000,0.38632,0.0037928,0.05,4.4867e+05,0.14703 -10000,0.38632,0.0037928,0.05,4.4867e+05,0.14703 -10000,0.38632,0.0037928,0.05,4.4867e+05,0.14703 -10000,0.38632,0.0037928,0.05,4.4867e+05,0.14703 -10000,0.38632,0.0037928,0.05,4.4867e+05,0.14703 -10000,0.39396,0.0038678,0.05,4.3813e+05,0.11632 -10000,0.39396,0.0038678,0.05,4.3813e+05,0.11632 -10000,0.39396,0.0038678,0.05,4.3813e+05,0.11632 -10000,0.39396,0.0038678,0.05,4.3813e+05,0.11632 -10000,0.39396,0.0038678,0.05,4.3813e+05,0.11632 -10000,0.39396,0.0038678,0.05,4.3813e+05,0.11632 -10000,0.39396,0.0038678,0.05,4.3813e+05,0.11632 -10000,0.40176,0.0039444,0.05,4.2755e+05,0.091393 -10000,0.40176,0.0039444,0.05,4.2755e+05,0.091393 -10000,0.40176,0.0039444,0.05,4.2755e+05,0.091393 -10000,0.40176,0.0039444,0.05,4.2755e+05,0.091393 -10000,0.40176,0.0039444,0.05,4.2755e+05,0.091393 -10000,0.40176,0.0039444,0.05,4.2755e+05,0.091393 -10000,0.40176,0.0039444,0.05,4.2755e+05,0.091393 -10000,0.40176,0.0039444,0.05,4.2755e+05,0.091393 -10000,0.40971,0.0040224,0.05,4.1695e+05,0.071303 -10000,0.40971,0.0040224,0.05,4.1695e+05,0.071303 -10000,0.40971,0.0040224,0.05,4.1695e+05,0.071303 -10000,0.40971,0.0040224,0.05,4.1695e+05,0.071303 -10000,0.40971,0.0040224,0.05,4.1695e+05,0.071303 -10000,0.40971,0.0040224,0.05,4.1695e+05,0.071303 -10000,0.40971,0.0040224,0.05,4.1695e+05,0.071303 -10000,0.40971,0.0040224,0.05,4.1695e+05,0.071303 -10000,0.41782,0.004102,0.05,4.0636e+05,0.055229 -10000,0.41782,0.004102,0.05,4.0636e+05,0.055229 -10000,0.41782,0.004102,0.05,4.0636e+05,0.055229 -10000,0.41782,0.004102,0.05,4.0636e+05,0.055229 -10000,0.41782,0.004102,0.05,4.0636e+05,0.055229 -10000,0.41782,0.004102,0.05,4.0636e+05,0.055229 -10000,0.41782,0.004102,0.05,4.0636e+05,0.055229 -10000,0.41782,0.004102,0.05,4.0636e+05,0.055229 -10000,0.42609,0.0041832,0.05,3.9577e+05,0.042464 -10000,0.42609,0.0041832,0.05,3.9577e+05,0.042464 -10000,0.42609,0.0041832,0.05,3.9577e+05,0.042464 -10000,0.42609,0.0041832,0.05,3.9577e+05,0.042464 -10000,0.42609,0.0041832,0.05,3.9577e+05,0.042464 -10000,0.42609,0.0041832,0.05,3.9577e+05,0.042464 -10000,0.42609,0.0041832,0.05,3.9577e+05,0.042464 -10000,0.42609,0.0041832,0.05,3.9577e+05,0.042464 -10000,0.42609,0.0041832,0.05,3.9577e+05,0.042464 -10000,0.43452,0.004266,0.05,3.8519e+05,0.032404 -10000,0.43452,0.004266,0.05,3.8519e+05,0.032404 -10000,0.43452,0.004266,0.05,3.8519e+05,0.032404 -10000,0.43452,0.004266,0.05,3.8519e+05,0.032404 -10000,0.43452,0.004266,0.05,3.8519e+05,0.032404 -10000,0.43452,0.004266,0.05,3.8519e+05,0.032404 -10000,0.43452,0.004266,0.05,3.8519e+05,0.032404 -10000,0.43452,0.004266,0.05,3.8519e+05,0.032404 -10000,0.44312,0.0043505,0.05,3.7464e+05,0.024537 -10000,0.44312,0.0043505,0.05,3.7464e+05,0.024537 -10000,0.44312,0.0043505,0.05,3.7464e+05,0.024537 -10000,0.44312,0.0043505,0.05,3.7464e+05,0.024537 -10000,0.44312,0.0043505,0.05,3.7464e+05,0.024537 -10000,0.44312,0.0043505,0.05,3.7464e+05,0.024537 -10000,0.44312,0.0043505,0.05,3.7464e+05,0.024537 -10000,0.44312,0.0043505,0.05,3.7464e+05,0.024537 -10000,0.44312,0.0043505,0.05,3.7464e+05,0.024537 -10000,0.45189,0.0044366,0.05,3.6413e+05,0.018434 -10000,0.45189,0.0044366,0.05,3.6413e+05,0.018434 -10000,0.45189,0.0044366,0.05,3.6413e+05,0.018434 -10000,0.45189,0.0044366,0.05,3.6413e+05,0.018434 -10000,0.45189,0.0044366,0.05,3.6413e+05,0.018434 -10000,0.45189,0.0044366,0.05,3.6413e+05,0.018434 -10000,0.45189,0.0044366,0.05,3.6413e+05,0.018434 -10000,0.45189,0.0044366,0.05,3.6413e+05,0.018434 -10000,0.45189,0.0044366,0.05,3.6413e+05,0.018434 -10000,0.46084,0.0045244,0.05,3.5365e+05,0.013738 -10000,0.46084,0.0045244,0.05,3.5365e+05,0.013738 -10000,0.46084,0.0045244,0.05,3.5365e+05,0.013738 -10000,0.46084,0.0045244,0.05,3.5365e+05,0.013738 -10000,0.46084,0.0045244,0.05,3.5365e+05,0.013738 -10000,0.46084,0.0045244,0.05,3.5365e+05,0.013738 -10000,0.46084,0.0045244,0.05,3.5365e+05,0.013738 -10000,0.46084,0.0045244,0.05,3.5365e+05,0.013738 -10000,0.46084,0.0045244,0.05,3.5365e+05,0.013738 -10000,0.46996,0.004614,0.05,3.4322e+05,0.010154 -10000,0.46996,0.004614,0.05,3.4322e+05,0.010154 -10000,0.46996,0.004614,0.05,3.4322e+05,0.010154 -10000,0.46996,0.004614,0.05,3.4322e+05,0.010154 -10000,0.46996,0.004614,0.05,3.4322e+05,0.010154 -10000,0.46996,0.004614,0.05,3.4322e+05,0.010154 -10000,0.46996,0.004614,0.05,3.4322e+05,0.010154 -10000,0.46996,0.004614,0.05,3.4322e+05,0.010154 -10000,0.46996,0.004614,0.05,3.4322e+05,0.010154 -10000,0.47926,0.0047053,0.05,3.3284e+05,0.0074422 -10000,0.47926,0.0047053,0.05,3.3284e+05,0.0074422 -10000,0.47926,0.0047053,0.05,3.3284e+05,0.0074422 -10000,0.47926,0.0047053,0.05,3.3284e+05,0.0074422 -10000,0.47926,0.0047053,0.05,3.3284e+05,0.0074422 -10000,0.47926,0.0047053,0.05,3.3284e+05,0.0074422 -10000,0.47926,0.0047053,0.05,3.3284e+05,0.0074422 -10000,0.47926,0.0047053,0.05,3.3284e+05,0.0074422 -10000,0.47926,0.0047053,0.05,3.3284e+05,0.0074422 -10000,0.48875,0.0047985,0.05,3.2251e+05,0.0054079 -10000,0.48875,0.0047985,0.05,3.2251e+05,0.0054079 -10000,0.48875,0.0047985,0.05,3.2251e+05,0.0054079 -10000,0.48875,0.0047985,0.05,3.2251e+05,0.0054079 -10000,0.48875,0.0047985,0.05,3.2251e+05,0.0054079 -10000,0.48875,0.0047985,0.05,3.2251e+05,0.0054079 -10000,0.48875,0.0047985,0.05,3.2251e+05,0.0054079 -10000,0.48875,0.0047985,0.05,3.2251e+05,0.0054079 -10000,0.48875,0.0047985,0.05,3.2251e+05,0.0054079 -10000,0.48875,0.0047985,0.05,3.2251e+05,0.0054079 -10000,0.49843,0.0048935,0.05,3.1224e+05,0.0038952 -10000,0.49843,0.0048935,0.05,3.1224e+05,0.0038952 -10000,0.49843,0.0048935,0.05,3.1224e+05,0.0038952 -10000,0.49843,0.0048935,0.05,3.1224e+05,0.0038952 -10000,0.49843,0.0048935,0.05,3.1224e+05,0.0038952 -10000,0.49843,0.0048935,0.05,3.1224e+05,0.0038952 -10000,0.49843,0.0048935,0.05,3.1224e+05,0.0038952 -10000,0.49843,0.0048935,0.05,3.1224e+05,0.0038952 -10000,0.49843,0.0048935,0.05,3.1224e+05,0.0038952 -10000,0.49843,0.0048935,0.05,3.1224e+05,0.0038952 -10000,0.5083,0.0049903,0.05,3.0204e+05,0.0027806 -10000,0.5083,0.0049903,0.05,3.0204e+05,0.0027806 -10000,0.5083,0.0049903,0.05,3.0204e+05,0.0027806 -10000,0.5083,0.0049903,0.05,3.0204e+05,0.0027806 -10000,0.5083,0.0049903,0.05,3.0204e+05,0.0027806 -10000,0.5083,0.0049903,0.05,3.0204e+05,0.0027806 -10000,0.5083,0.0049903,0.05,3.0204e+05,0.0027806 -10000,0.5083,0.0049903,0.05,3.0204e+05,0.0027806 -10000,0.5083,0.0049903,0.05,3.0204e+05,0.0027806 -10000,0.5083,0.0049903,0.05,3.0204e+05,0.0027806 -10000,0.51836,0.0050891,0.05,2.919e+05,0.0019668 -10000,0.51836,0.0050891,0.05,2.919e+05,0.0019668 -10000,0.51836,0.0050891,0.05,2.919e+05,0.0019668 -10000,0.51836,0.0050891,0.05,2.919e+05,0.0019668 -10000,0.51836,0.0050891,0.05,2.919e+05,0.0019668 -10000,0.51836,0.0050891,0.05,2.919e+05,0.0019668 -10000,0.51836,0.0050891,0.05,2.919e+05,0.0019668 -10000,0.51836,0.0050891,0.05,2.919e+05,0.0019668 -10000,0.51836,0.0050891,0.05,2.919e+05,0.0019668 -10000,0.51836,0.0050891,0.05,2.919e+05,0.0019668 -10000,0.52862,0.0051899,0.05,2.8183e+05,0.0013782 -10000,0.52862,0.0051899,0.05,2.8183e+05,0.0013782 -10000,0.52862,0.0051899,0.05,2.8183e+05,0.0013782 -10000,0.52862,0.0051899,0.05,2.8183e+05,0.0013782 -10000,0.52862,0.0051899,0.05,2.8183e+05,0.0013782 -10000,0.52862,0.0051899,0.05,2.8183e+05,0.0013782 -10000,0.52862,0.0051899,0.05,2.8183e+05,0.0013782 -10000,0.52862,0.0051899,0.05,2.8183e+05,0.0013782 -10000,0.52862,0.0051899,0.05,2.8183e+05,0.0013782 -10000,0.52862,0.0051899,0.05,2.8183e+05,0.0013782 -10000,0.53909,0.0052927,0.05,2.7183e+05,0.00095658 -10000,0.53909,0.0052927,0.05,2.7183e+05,0.00095658 -10000,0.53909,0.0052927,0.05,2.7183e+05,0.00095658 -10000,0.53909,0.0052927,0.05,2.7183e+05,0.00095658 -10000,0.53909,0.0052927,0.05,2.7183e+05,0.00095658 -10000,0.53909,0.0052927,0.05,2.7183e+05,0.00095658 -10000,0.53909,0.0052927,0.05,2.7183e+05,0.00095658 -10000,0.53909,0.0052927,0.05,2.7183e+05,0.00095658 -10000,0.53909,0.0052927,0.05,2.7183e+05,0.00095658 -10000,0.53909,0.0052927,0.05,2.7183e+05,0.00095658 -10000,0.53909,0.0052927,0.05,2.7183e+05,0.00095658 -10000,0.54976,0.0053975,0.05,2.6191e+05,0.00065749 -10000,0.54976,0.0053975,0.05,2.6191e+05,0.00065749 -10000,0.54976,0.0053975,0.05,2.6191e+05,0.00065749 -10000,0.54976,0.0053975,0.05,2.6191e+05,0.00065749 -10000,0.54976,0.0053975,0.05,2.6191e+05,0.00065749 -10000,0.54976,0.0053975,0.05,2.6191e+05,0.00065749 -10000,0.54976,0.0053975,0.05,2.6191e+05,0.00065749 -10000,0.54976,0.0053975,0.05,2.6191e+05,0.00065749 -10000,0.54976,0.0053975,0.05,2.6191e+05,0.00065749 -10000,0.54976,0.0053975,0.05,2.6191e+05,0.00065749 -10000,0.54976,0.0053975,0.05,2.6191e+05,0.00065749 -10000,0.56065,0.0055043,0.05,2.5206e+05,0.00044744 -10000,0.56065,0.0055043,0.05,2.5206e+05,0.00044744 -10000,0.56065,0.0055043,0.05,2.5206e+05,0.00044744 -10000,0.56065,0.0055043,0.05,2.5206e+05,0.00044744 -10000,0.56065,0.0055043,0.05,2.5206e+05,0.00044744 -10000,0.56065,0.0055043,0.05,2.5206e+05,0.00044744 -10000,0.56065,0.0055043,0.05,2.5206e+05,0.00044744 -10000,0.56065,0.0055043,0.05,2.5206e+05,0.00044744 -10000,0.56065,0.0055043,0.05,2.5206e+05,0.00044744 -10000,0.56065,0.0055043,0.05,2.5206e+05,0.00044744 -10000,0.56065,0.0055043,0.05,2.5206e+05,0.00044744 -10000,0.57175,0.0056133,0.05,2.423e+05,0.00030141 -10000,0.57175,0.0056133,0.05,2.423e+05,0.00030141 -10000,0.57175,0.0056133,0.05,2.423e+05,0.00030141 -10000,0.57175,0.0056133,0.05,2.423e+05,0.00030141 -10000,0.57175,0.0056133,0.05,2.423e+05,0.00030141 -10000,0.57175,0.0056133,0.05,2.423e+05,0.00030141 -10000,0.57175,0.0056133,0.05,2.423e+05,0.00030141 -10000,0.57175,0.0056133,0.05,2.423e+05,0.00030141 -10000,0.57175,0.0056133,0.05,2.423e+05,0.00030141 -10000,0.57175,0.0056133,0.05,2.423e+05,0.00030141 -10000,0.57175,0.0056133,0.05,2.423e+05,0.00030141 -10000,0.58307,0.0057245,0.05,2.3261e+05,0.00020095 -10000,0.58307,0.0057245,0.05,2.3261e+05,0.00020095 -10000,0.58307,0.0057245,0.05,2.3261e+05,0.00020095 -10000,0.58307,0.0057245,0.05,2.3261e+05,0.00020095 -10000,0.58307,0.0057245,0.05,2.3261e+05,0.00020095 -10000,0.58307,0.0057245,0.05,2.3261e+05,0.00020095 -10000,0.58307,0.0057245,0.05,2.3261e+05,0.00020095 -10000,0.58307,0.0057245,0.05,2.3261e+05,0.00020095 -10000,0.58307,0.0057245,0.05,2.3261e+05,0.00020095 -10000,0.58307,0.0057245,0.05,2.3261e+05,0.00020095 -10000,0.58307,0.0057245,0.05,2.3261e+05,0.00020095 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.59462,0.0058378,0.05,2.2301e+05,0.00013256 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.60639,0.0059535,0.05,2.135e+05,8.6508e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.6184,0.0060714,0.05,2.0407e+05,5.5836e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.63065,0.0061916,0.05,1.9473e+05,3.5636e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.64314,0.0063142,0.05,1.8548e+05,2.2485e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.65588,0.0064393,0.05,1.7633e+05,1.4022e-05 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.66887,0.0065668,0.05,1.6727e+05,8.6404e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.68211,0.0066969,0.05,1.583e+05,5.2599e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.69562,0.0068295,0.05,1.4942e+05,3.1624e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.7094,0.0069648,0.05,1.4064e+05,1.8772e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.72345,0.0071027,0.05,1.3195e+05,1.0998e-06 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.73778,0.0072434,0.05,1.2336e+05,6.3578e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7524,0.0073869,0.05,1.1486e+05,3.6242e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7673,0.0075332,0.05,1.0645e+05,2.0359e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.7825,0.0076824,0.05,98125,1.1259e-07 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.798,0.0078346,0.05,89890,6.1195e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.81381,0.0079898,0.05,81740,3.2607e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.82993,0.0081481,0.05,73670,1.6956e-08 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.84637,0.0083095,0.05,65677,8.5358e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.86314,0.0084741,0.05,57756,4.096e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.88024,0.008642,0.05,49901,1.8143e-09 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.89767,0.0088132,0.05,42106,6.8413e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.91546,0.0089878,0.05,34365,1.585e-10 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.93359,0.0091658,0.05,26670,-5.514e-11 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.95209,0.0093474,0.05,19011,-1.1096e-10 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.97095,0.0095326,0.05,11380,-8.9385e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,0.99019,0.0097215,0.05,3766.6,-3.2912e-11 -10000,nan,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_10.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_10.csv deleted file mode 100644 index 9de70bbb19f..00000000000 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_10.csv +++ /dev/null @@ -1,1002 +0,0 @@ -Time,"elementCenter:0","elementCenter:1","elementCenter:2","pressure","temperature" -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,nan,nan,nan,nan,nan -1e+05,0.10099,0.0009915,0.05,2886.1,99.336 -1e+05,0.10099,0.0009915,0.05,2886.1,99.336 -1e+05,0.10299,0.0010111,0.05,8542.7,98.035 -1e+05,0.10299,0.0010111,0.05,8542.7,98.035 -1e+05,0.10499,0.0010308,0.05,14088,96.759 -1e+05,0.10499,0.0010308,0.05,14088,96.759 -1e+05,0.10734,0.0010538,0.05,20476,95.288 -1e+05,0.10734,0.0010538,0.05,20476,95.288 -1e+05,0.10734,0.0010538,0.05,20476,95.288 -1e+05,0.11004,0.0010803,0.05,27628,93.64 -1e+05,0.11004,0.0010803,0.05,27628,93.64 -1e+05,0.11004,0.0010803,0.05,27628,93.64 -1e+05,0.11274,0.0011068,0.05,34599,92.032 -1e+05,0.11274,0.0011068,0.05,34599,92.032 -1e+05,0.11274,0.0011068,0.05,34599,92.032 -1e+05,0.11544,0.0011334,0.05,41397,90.463 -1e+05,0.11544,0.0011334,0.05,41397,90.463 -1e+05,0.11814,0.0011599,0.05,48030,88.93 -1e+05,0.11814,0.0011599,0.05,48030,88.93 -1e+05,0.11814,0.0011599,0.05,48030,88.93 -1e+05,0.12084,0.0011864,0.05,54503,87.433 -1e+05,0.12084,0.0011864,0.05,54503,87.433 -1e+05,0.12084,0.0011864,0.05,54503,87.433 -1e+05,0.12354,0.0012129,0.05,60824,85.969 -1e+05,0.12354,0.0012129,0.05,60824,85.969 -1e+05,0.12624,0.0012394,0.05,66997,84.537 -1e+05,0.12624,0.0012394,0.05,66997,84.537 -1e+05,0.12624,0.0012394,0.05,66997,84.537 -1e+05,0.12894,0.0012659,0.05,73028,83.137 -1e+05,0.12894,0.0012659,0.05,73028,83.137 -1e+05,0.12894,0.0012659,0.05,73028,83.137 -1e+05,0.13164,0.0012924,0.05,78922,81.766 -1e+05,0.13164,0.0012924,0.05,78922,81.766 -1e+05,0.1343,0.0013185,0.05,84601,80.443 -1e+05,0.1343,0.0013185,0.05,84601,80.443 -1e+05,0.1343,0.0013185,0.05,84601,80.443 -1e+05,0.13695,0.0013445,0.05,90131,79.153 -1e+05,0.13695,0.0013445,0.05,90131,79.153 -1e+05,0.13695,0.0013445,0.05,90131,79.153 -1e+05,0.13965,0.001371,0.05,95647,77.864 -1e+05,0.13965,0.001371,0.05,95647,77.864 -1e+05,0.13965,0.001371,0.05,95647,77.864 -1e+05,0.1424,0.0013981,0.05,1.0115e+05,76.576 -1e+05,0.1424,0.0013981,0.05,1.0115e+05,76.576 -1e+05,0.14521,0.0014256,0.05,1.0663e+05,75.288 -1e+05,0.14521,0.0014256,0.05,1.0663e+05,75.288 -1e+05,0.14521,0.0014256,0.05,1.0663e+05,75.288 -1e+05,0.14807,0.0014538,0.05,1.121e+05,74.002 -1e+05,0.14807,0.0014538,0.05,1.121e+05,74.002 -1e+05,0.14807,0.0014538,0.05,1.121e+05,74.002 -1e+05,0.151,0.0014824,0.05,1.1755e+05,72.717 -1e+05,0.151,0.0014824,0.05,1.1755e+05,72.717 -1e+05,0.151,0.0014824,0.05,1.1755e+05,72.717 -1e+05,0.15397,0.0015117,0.05,1.2298e+05,71.434 -1e+05,0.15397,0.0015117,0.05,1.2298e+05,71.434 -1e+05,0.15397,0.0015117,0.05,1.2298e+05,71.434 -1e+05,0.15701,0.0015415,0.05,1.2839e+05,70.152 -1e+05,0.15701,0.0015415,0.05,1.2839e+05,70.152 -1e+05,0.15701,0.0015415,0.05,1.2839e+05,70.152 -1e+05,0.16011,0.0015719,0.05,1.3377e+05,68.871 -1e+05,0.16011,0.0015719,0.05,1.3377e+05,68.871 -1e+05,0.16011,0.0015719,0.05,1.3377e+05,68.871 -1e+05,0.16327,0.001603,0.05,1.3913e+05,67.592 -1e+05,0.16327,0.001603,0.05,1.3913e+05,67.592 -1e+05,0.16327,0.001603,0.05,1.3913e+05,67.592 -1e+05,0.16649,0.0016346,0.05,1.4447e+05,66.316 -1e+05,0.16649,0.0016346,0.05,1.4447e+05,66.316 -1e+05,0.16649,0.0016346,0.05,1.4447e+05,66.316 -1e+05,0.16649,0.0016346,0.05,1.4447e+05,66.316 -1e+05,0.16978,0.0016669,0.05,1.4977e+05,65.041 -1e+05,0.16978,0.0016669,0.05,1.4977e+05,65.041 -1e+05,0.16978,0.0016669,0.05,1.4977e+05,65.041 -1e+05,0.17313,0.0016998,0.05,1.5504e+05,63.769 -1e+05,0.17313,0.0016998,0.05,1.5504e+05,63.769 -1e+05,0.17313,0.0016998,0.05,1.5504e+05,63.769 -1e+05,0.17655,0.0017333,0.05,1.6028e+05,62.499 -1e+05,0.17655,0.0017333,0.05,1.6028e+05,62.499 -1e+05,0.17655,0.0017333,0.05,1.6028e+05,62.499 -1e+05,0.17655,0.0017333,0.05,1.6028e+05,62.499 -1e+05,0.18004,0.0017676,0.05,1.6548e+05,61.232 -1e+05,0.18004,0.0017676,0.05,1.6548e+05,61.232 -1e+05,0.18004,0.0017676,0.05,1.6548e+05,61.232 -1e+05,0.18359,0.0018025,0.05,1.7064e+05,59.968 -1e+05,0.18359,0.0018025,0.05,1.7064e+05,59.968 -1e+05,0.18359,0.0018025,0.05,1.7064e+05,59.968 -1e+05,0.18359,0.0018025,0.05,1.7064e+05,59.968 -1e+05,0.18722,0.001838,0.05,1.7576e+05,58.707 -1e+05,0.18722,0.001838,0.05,1.7576e+05,58.707 -1e+05,0.18722,0.001838,0.05,1.7576e+05,58.707 -1e+05,0.18722,0.001838,0.05,1.7576e+05,58.707 -1e+05,0.19091,0.0018743,0.05,1.8084e+05,57.449 -1e+05,0.19091,0.0018743,0.05,1.8084e+05,57.449 -1e+05,0.19091,0.0018743,0.05,1.8084e+05,57.449 -1e+05,0.19468,0.0019114,0.05,1.8587e+05,56.195 -1e+05,0.19468,0.0019114,0.05,1.8587e+05,56.195 -1e+05,0.19468,0.0019114,0.05,1.8587e+05,56.195 -1e+05,0.19468,0.0019114,0.05,1.8587e+05,56.195 -1e+05,0.19853,0.0019491,0.05,1.9085e+05,54.944 -1e+05,0.19853,0.0019491,0.05,1.9085e+05,54.944 -1e+05,0.19853,0.0019491,0.05,1.9085e+05,54.944 -1e+05,0.19853,0.0019491,0.05,1.9085e+05,54.944 -1e+05,0.20245,0.0019876,0.05,1.9578e+05,53.698 -1e+05,0.20245,0.0019876,0.05,1.9578e+05,53.698 -1e+05,0.20245,0.0019876,0.05,1.9578e+05,53.698 -1e+05,0.20245,0.0019876,0.05,1.9578e+05,53.698 -1e+05,0.20645,0.0020269,0.05,2.0065e+05,52.456 -1e+05,0.20645,0.0020269,0.05,2.0065e+05,52.456 -1e+05,0.20645,0.0020269,0.05,2.0065e+05,52.456 -1e+05,0.20645,0.0020269,0.05,2.0065e+05,52.456 -1e+05,0.21053,0.0020669,0.05,2.0546e+05,51.219 -1e+05,0.21053,0.0020669,0.05,2.0546e+05,51.219 -1e+05,0.21053,0.0020669,0.05,2.0546e+05,51.219 -1e+05,0.21053,0.0020669,0.05,2.0546e+05,51.219 -1e+05,0.21469,0.0021078,0.05,2.1021e+05,49.986 -1e+05,0.21469,0.0021078,0.05,2.1021e+05,49.986 -1e+05,0.21469,0.0021078,0.05,2.1021e+05,49.986 -1e+05,0.21469,0.0021078,0.05,2.1021e+05,49.986 -1e+05,0.21893,0.0021494,0.05,2.149e+05,48.759 -1e+05,0.21893,0.0021494,0.05,2.149e+05,48.759 -1e+05,0.21893,0.0021494,0.05,2.149e+05,48.759 -1e+05,0.21893,0.0021494,0.05,2.149e+05,48.759 -1e+05,0.21893,0.0021494,0.05,2.149e+05,48.759 -1e+05,0.22326,0.0021919,0.05,2.1951e+05,47.537 -1e+05,0.22326,0.0021919,0.05,2.1951e+05,47.537 -1e+05,0.22326,0.0021919,0.05,2.1951e+05,47.537 -1e+05,0.22326,0.0021919,0.05,2.1951e+05,47.537 -1e+05,0.22767,0.0022352,0.05,2.2404e+05,46.321 -1e+05,0.22767,0.0022352,0.05,2.2404e+05,46.321 -1e+05,0.22767,0.0022352,0.05,2.2404e+05,46.321 -1e+05,0.22767,0.0022352,0.05,2.2404e+05,46.321 -1e+05,0.23217,0.0022794,0.05,2.285e+05,45.111 -1e+05,0.23217,0.0022794,0.05,2.285e+05,45.111 -1e+05,0.23217,0.0022794,0.05,2.285e+05,45.111 -1e+05,0.23217,0.0022794,0.05,2.285e+05,45.111 -1e+05,0.23217,0.0022794,0.05,2.285e+05,45.111 -1e+05,0.23676,0.0023244,0.05,2.3287e+05,43.908 -1e+05,0.23676,0.0023244,0.05,2.3287e+05,43.908 -1e+05,0.23676,0.0023244,0.05,2.3287e+05,43.908 -1e+05,0.23676,0.0023244,0.05,2.3287e+05,43.908 -1e+05,0.23676,0.0023244,0.05,2.3287e+05,43.908 -1e+05,0.24144,0.0023704,0.05,2.3715e+05,42.712 -1e+05,0.24144,0.0023704,0.05,2.3715e+05,42.712 -1e+05,0.24144,0.0023704,0.05,2.3715e+05,42.712 -1e+05,0.24144,0.0023704,0.05,2.3715e+05,42.712 -1e+05,0.24621,0.0024172,0.05,2.4134e+05,41.523 -1e+05,0.24621,0.0024172,0.05,2.4134e+05,41.523 -1e+05,0.24621,0.0024172,0.05,2.4134e+05,41.523 -1e+05,0.24621,0.0024172,0.05,2.4134e+05,41.523 -1e+05,0.24621,0.0024172,0.05,2.4134e+05,41.523 -1e+05,0.25108,0.002465,0.05,2.4544e+05,40.342 -1e+05,0.25108,0.002465,0.05,2.4544e+05,40.342 -1e+05,0.25108,0.002465,0.05,2.4544e+05,40.342 -1e+05,0.25108,0.002465,0.05,2.4544e+05,40.342 -1e+05,0.25108,0.002465,0.05,2.4544e+05,40.342 -1e+05,0.25604,0.0025137,0.05,2.4943e+05,39.169 -1e+05,0.25604,0.0025137,0.05,2.4943e+05,39.169 -1e+05,0.25604,0.0025137,0.05,2.4943e+05,39.169 -1e+05,0.25604,0.0025137,0.05,2.4943e+05,39.169 -1e+05,0.25604,0.0025137,0.05,2.4943e+05,39.169 -1e+05,0.2611,0.0025634,0.05,2.5331e+05,38.005 -1e+05,0.2611,0.0025634,0.05,2.5331e+05,38.005 -1e+05,0.2611,0.0025634,0.05,2.5331e+05,38.005 -1e+05,0.2611,0.0025634,0.05,2.5331e+05,38.005 -1e+05,0.2611,0.0025634,0.05,2.5331e+05,38.005 -1e+05,0.26626,0.0026141,0.05,2.5707e+05,36.85 -1e+05,0.26626,0.0026141,0.05,2.5707e+05,36.85 -1e+05,0.26626,0.0026141,0.05,2.5707e+05,36.85 -1e+05,0.26626,0.0026141,0.05,2.5707e+05,36.85 -1e+05,0.26626,0.0026141,0.05,2.5707e+05,36.85 -1e+05,0.27153,0.0026658,0.05,2.6072e+05,35.704 -1e+05,0.27153,0.0026658,0.05,2.6072e+05,35.704 -1e+05,0.27153,0.0026658,0.05,2.6072e+05,35.704 -1e+05,0.27153,0.0026658,0.05,2.6072e+05,35.704 -1e+05,0.27153,0.0026658,0.05,2.6072e+05,35.704 -1e+05,0.27153,0.0026658,0.05,2.6072e+05,35.704 -1e+05,0.2769,0.0027185,0.05,2.6424e+05,34.568 -1e+05,0.2769,0.0027185,0.05,2.6424e+05,34.568 -1e+05,0.2769,0.0027185,0.05,2.6424e+05,34.568 -1e+05,0.2769,0.0027185,0.05,2.6424e+05,34.568 -1e+05,0.2769,0.0027185,0.05,2.6424e+05,34.568 -1e+05,0.28237,0.0027723,0.05,2.6763e+05,33.443 -1e+05,0.28237,0.0027723,0.05,2.6763e+05,33.443 -1e+05,0.28237,0.0027723,0.05,2.6763e+05,33.443 -1e+05,0.28237,0.0027723,0.05,2.6763e+05,33.443 -1e+05,0.28237,0.0027723,0.05,2.6763e+05,33.443 -1e+05,0.28237,0.0027723,0.05,2.6763e+05,33.443 -1e+05,0.28796,0.0028271,0.05,2.7088e+05,32.329 -1e+05,0.28796,0.0028271,0.05,2.7088e+05,32.329 -1e+05,0.28796,0.0028271,0.05,2.7088e+05,32.329 -1e+05,0.28796,0.0028271,0.05,2.7088e+05,32.329 -1e+05,0.28796,0.0028271,0.05,2.7088e+05,32.329 -1e+05,0.29365,0.002883,0.05,2.7399e+05,31.226 -1e+05,0.29365,0.002883,0.05,2.7399e+05,31.226 -1e+05,0.29365,0.002883,0.05,2.7399e+05,31.226 -1e+05,0.29365,0.002883,0.05,2.7399e+05,31.226 -1e+05,0.29365,0.002883,0.05,2.7399e+05,31.226 -1e+05,0.29365,0.002883,0.05,2.7399e+05,31.226 -1e+05,0.29946,0.00294,0.05,2.7694e+05,30.135 -1e+05,0.29946,0.00294,0.05,2.7694e+05,30.135 -1e+05,0.29946,0.00294,0.05,2.7694e+05,30.135 -1e+05,0.29946,0.00294,0.05,2.7694e+05,30.135 -1e+05,0.29946,0.00294,0.05,2.7694e+05,30.135 -1e+05,0.29946,0.00294,0.05,2.7694e+05,30.135 -1e+05,0.30538,0.0029982,0.05,2.7974e+05,29.057 -1e+05,0.30538,0.0029982,0.05,2.7974e+05,29.057 -1e+05,0.30538,0.0029982,0.05,2.7974e+05,29.057 -1e+05,0.30538,0.0029982,0.05,2.7974e+05,29.057 -1e+05,0.30538,0.0029982,0.05,2.7974e+05,29.057 -1e+05,0.30538,0.0029982,0.05,2.7974e+05,29.057 -1e+05,0.31142,0.0030575,0.05,2.8238e+05,27.992 -1e+05,0.31142,0.0030575,0.05,2.8238e+05,27.992 -1e+05,0.31142,0.0030575,0.05,2.8238e+05,27.992 -1e+05,0.31142,0.0030575,0.05,2.8238e+05,27.992 -1e+05,0.31142,0.0030575,0.05,2.8238e+05,27.992 -1e+05,0.31142,0.0030575,0.05,2.8238e+05,27.992 -1e+05,0.31758,0.003118,0.05,2.8484e+05,26.941 -1e+05,0.31758,0.003118,0.05,2.8484e+05,26.941 -1e+05,0.31758,0.003118,0.05,2.8484e+05,26.941 -1e+05,0.31758,0.003118,0.05,2.8484e+05,26.941 -1e+05,0.31758,0.003118,0.05,2.8484e+05,26.941 -1e+05,0.31758,0.003118,0.05,2.8484e+05,26.941 -1e+05,0.32386,0.0031796,0.05,2.8713e+05,25.903 -1e+05,0.32386,0.0031796,0.05,2.8713e+05,25.903 -1e+05,0.32386,0.0031796,0.05,2.8713e+05,25.903 -1e+05,0.32386,0.0031796,0.05,2.8713e+05,25.903 -1e+05,0.32386,0.0031796,0.05,2.8713e+05,25.903 -1e+05,0.32386,0.0031796,0.05,2.8713e+05,25.903 -1e+05,0.32386,0.0031796,0.05,2.8713e+05,25.903 -1e+05,0.33027,0.0032425,0.05,2.8923e+05,24.881 -1e+05,0.33027,0.0032425,0.05,2.8923e+05,24.881 -1e+05,0.33027,0.0032425,0.05,2.8923e+05,24.881 -1e+05,0.33027,0.0032425,0.05,2.8923e+05,24.881 -1e+05,0.33027,0.0032425,0.05,2.8923e+05,24.881 -1e+05,0.33027,0.0032425,0.05,2.8923e+05,24.881 -1e+05,0.3368,0.0033067,0.05,2.9114e+05,23.874 -1e+05,0.3368,0.0033067,0.05,2.9114e+05,23.874 -1e+05,0.3368,0.0033067,0.05,2.9114e+05,23.874 -1e+05,0.3368,0.0033067,0.05,2.9114e+05,23.874 -1e+05,0.3368,0.0033067,0.05,2.9114e+05,23.874 -1e+05,0.3368,0.0033067,0.05,2.9114e+05,23.874 -1e+05,0.3368,0.0033067,0.05,2.9114e+05,23.874 -1e+05,0.34347,0.0033721,0.05,2.9285e+05,22.883 -1e+05,0.34347,0.0033721,0.05,2.9285e+05,22.883 -1e+05,0.34347,0.0033721,0.05,2.9285e+05,22.883 -1e+05,0.34347,0.0033721,0.05,2.9285e+05,22.883 -1e+05,0.34347,0.0033721,0.05,2.9285e+05,22.883 -1e+05,0.34347,0.0033721,0.05,2.9285e+05,22.883 -1e+05,0.35026,0.0034388,0.05,2.9435e+05,21.909 -1e+05,0.35026,0.0034388,0.05,2.9435e+05,21.909 -1e+05,0.35026,0.0034388,0.05,2.9435e+05,21.909 -1e+05,0.35026,0.0034388,0.05,2.9435e+05,21.909 -1e+05,0.35026,0.0034388,0.05,2.9435e+05,21.909 -1e+05,0.35026,0.0034388,0.05,2.9435e+05,21.909 -1e+05,0.35026,0.0034388,0.05,2.9435e+05,21.909 -1e+05,0.35719,0.0035069,0.05,2.9564e+05,20.951 -1e+05,0.35719,0.0035069,0.05,2.9564e+05,20.951 -1e+05,0.35719,0.0035069,0.05,2.9564e+05,20.951 -1e+05,0.35719,0.0035069,0.05,2.9564e+05,20.951 -1e+05,0.35719,0.0035069,0.05,2.9564e+05,20.951 -1e+05,0.35719,0.0035069,0.05,2.9564e+05,20.951 -1e+05,0.35719,0.0035069,0.05,2.9564e+05,20.951 -1e+05,0.36426,0.0035762,0.05,2.9671e+05,20.012 -1e+05,0.36426,0.0035762,0.05,2.9671e+05,20.012 -1e+05,0.36426,0.0035762,0.05,2.9671e+05,20.012 -1e+05,0.36426,0.0035762,0.05,2.9671e+05,20.012 -1e+05,0.36426,0.0035762,0.05,2.9671e+05,20.012 -1e+05,0.36426,0.0035762,0.05,2.9671e+05,20.012 -1e+05,0.36426,0.0035762,0.05,2.9671e+05,20.012 -1e+05,0.37147,0.003647,0.05,2.9755e+05,19.091 -1e+05,0.37147,0.003647,0.05,2.9755e+05,19.091 -1e+05,0.37147,0.003647,0.05,2.9755e+05,19.091 -1e+05,0.37147,0.003647,0.05,2.9755e+05,19.091 -1e+05,0.37147,0.003647,0.05,2.9755e+05,19.091 -1e+05,0.37147,0.003647,0.05,2.9755e+05,19.091 -1e+05,0.37147,0.003647,0.05,2.9755e+05,19.091 -1e+05,0.37147,0.003647,0.05,2.9755e+05,19.091 -1e+05,0.37882,0.0037192,0.05,2.9816e+05,18.188 -1e+05,0.37882,0.0037192,0.05,2.9816e+05,18.188 -1e+05,0.37882,0.0037192,0.05,2.9816e+05,18.188 -1e+05,0.37882,0.0037192,0.05,2.9816e+05,18.188 -1e+05,0.37882,0.0037192,0.05,2.9816e+05,18.188 -1e+05,0.37882,0.0037192,0.05,2.9816e+05,18.188 -1e+05,0.37882,0.0037192,0.05,2.9816e+05,18.188 -1e+05,0.38632,0.0037928,0.05,2.9853e+05,17.305 -1e+05,0.38632,0.0037928,0.05,2.9853e+05,17.305 -1e+05,0.38632,0.0037928,0.05,2.9853e+05,17.305 -1e+05,0.38632,0.0037928,0.05,2.9853e+05,17.305 -1e+05,0.38632,0.0037928,0.05,2.9853e+05,17.305 -1e+05,0.38632,0.0037928,0.05,2.9853e+05,17.305 -1e+05,0.38632,0.0037928,0.05,2.9853e+05,17.305 -1e+05,0.38632,0.0037928,0.05,2.9853e+05,17.305 -1e+05,0.39396,0.0038678,0.05,2.9864e+05,16.443 -1e+05,0.39396,0.0038678,0.05,2.9864e+05,16.443 -1e+05,0.39396,0.0038678,0.05,2.9864e+05,16.443 -1e+05,0.39396,0.0038678,0.05,2.9864e+05,16.443 -1e+05,0.39396,0.0038678,0.05,2.9864e+05,16.443 -1e+05,0.39396,0.0038678,0.05,2.9864e+05,16.443 -1e+05,0.39396,0.0038678,0.05,2.9864e+05,16.443 -1e+05,0.40176,0.0039444,0.05,2.9851e+05,15.6 -1e+05,0.40176,0.0039444,0.05,2.9851e+05,15.6 -1e+05,0.40176,0.0039444,0.05,2.9851e+05,15.6 -1e+05,0.40176,0.0039444,0.05,2.9851e+05,15.6 -1e+05,0.40176,0.0039444,0.05,2.9851e+05,15.6 -1e+05,0.40176,0.0039444,0.05,2.9851e+05,15.6 -1e+05,0.40176,0.0039444,0.05,2.9851e+05,15.6 -1e+05,0.40176,0.0039444,0.05,2.9851e+05,15.6 -1e+05,0.40971,0.0040224,0.05,2.9811e+05,14.779 -1e+05,0.40971,0.0040224,0.05,2.9811e+05,14.779 -1e+05,0.40971,0.0040224,0.05,2.9811e+05,14.779 -1e+05,0.40971,0.0040224,0.05,2.9811e+05,14.779 -1e+05,0.40971,0.0040224,0.05,2.9811e+05,14.779 -1e+05,0.40971,0.0040224,0.05,2.9811e+05,14.779 -1e+05,0.40971,0.0040224,0.05,2.9811e+05,14.779 -1e+05,0.40971,0.0040224,0.05,2.9811e+05,14.779 -1e+05,0.41782,0.004102,0.05,2.9744e+05,13.979 -1e+05,0.41782,0.004102,0.05,2.9744e+05,13.979 -1e+05,0.41782,0.004102,0.05,2.9744e+05,13.979 -1e+05,0.41782,0.004102,0.05,2.9744e+05,13.979 -1e+05,0.41782,0.004102,0.05,2.9744e+05,13.979 -1e+05,0.41782,0.004102,0.05,2.9744e+05,13.979 -1e+05,0.41782,0.004102,0.05,2.9744e+05,13.979 -1e+05,0.41782,0.004102,0.05,2.9744e+05,13.979 -1e+05,0.42609,0.0041832,0.05,2.965e+05,13.202 -1e+05,0.42609,0.0041832,0.05,2.965e+05,13.202 -1e+05,0.42609,0.0041832,0.05,2.965e+05,13.202 -1e+05,0.42609,0.0041832,0.05,2.965e+05,13.202 -1e+05,0.42609,0.0041832,0.05,2.965e+05,13.202 -1e+05,0.42609,0.0041832,0.05,2.965e+05,13.202 -1e+05,0.42609,0.0041832,0.05,2.965e+05,13.202 -1e+05,0.42609,0.0041832,0.05,2.965e+05,13.202 -1e+05,0.42609,0.0041832,0.05,2.965e+05,13.202 -1e+05,0.43452,0.004266,0.05,2.9528e+05,12.447 -1e+05,0.43452,0.004266,0.05,2.9528e+05,12.447 -1e+05,0.43452,0.004266,0.05,2.9528e+05,12.447 -1e+05,0.43452,0.004266,0.05,2.9528e+05,12.447 -1e+05,0.43452,0.004266,0.05,2.9528e+05,12.447 -1e+05,0.43452,0.004266,0.05,2.9528e+05,12.447 -1e+05,0.43452,0.004266,0.05,2.9528e+05,12.447 -1e+05,0.43452,0.004266,0.05,2.9528e+05,12.447 -1e+05,0.44312,0.0043505,0.05,2.9377e+05,11.715 -1e+05,0.44312,0.0043505,0.05,2.9377e+05,11.715 -1e+05,0.44312,0.0043505,0.05,2.9377e+05,11.715 -1e+05,0.44312,0.0043505,0.05,2.9377e+05,11.715 -1e+05,0.44312,0.0043505,0.05,2.9377e+05,11.715 -1e+05,0.44312,0.0043505,0.05,2.9377e+05,11.715 -1e+05,0.44312,0.0043505,0.05,2.9377e+05,11.715 -1e+05,0.44312,0.0043505,0.05,2.9377e+05,11.715 -1e+05,0.44312,0.0043505,0.05,2.9377e+05,11.715 -1e+05,0.45189,0.0044366,0.05,2.9198e+05,11.006 -1e+05,0.45189,0.0044366,0.05,2.9198e+05,11.006 -1e+05,0.45189,0.0044366,0.05,2.9198e+05,11.006 -1e+05,0.45189,0.0044366,0.05,2.9198e+05,11.006 -1e+05,0.45189,0.0044366,0.05,2.9198e+05,11.006 -1e+05,0.45189,0.0044366,0.05,2.9198e+05,11.006 -1e+05,0.45189,0.0044366,0.05,2.9198e+05,11.006 -1e+05,0.45189,0.0044366,0.05,2.9198e+05,11.006 -1e+05,0.45189,0.0044366,0.05,2.9198e+05,11.006 -1e+05,0.46084,0.0045244,0.05,2.8989e+05,10.321 -1e+05,0.46084,0.0045244,0.05,2.8989e+05,10.321 -1e+05,0.46084,0.0045244,0.05,2.8989e+05,10.321 -1e+05,0.46084,0.0045244,0.05,2.8989e+05,10.321 -1e+05,0.46084,0.0045244,0.05,2.8989e+05,10.321 -1e+05,0.46084,0.0045244,0.05,2.8989e+05,10.321 -1e+05,0.46084,0.0045244,0.05,2.8989e+05,10.321 -1e+05,0.46084,0.0045244,0.05,2.8989e+05,10.321 -1e+05,0.46084,0.0045244,0.05,2.8989e+05,10.321 -1e+05,0.46996,0.004614,0.05,2.875e+05,9.6595 -1e+05,0.46996,0.004614,0.05,2.875e+05,9.6595 -1e+05,0.46996,0.004614,0.05,2.875e+05,9.6595 -1e+05,0.46996,0.004614,0.05,2.875e+05,9.6595 -1e+05,0.46996,0.004614,0.05,2.875e+05,9.6595 -1e+05,0.46996,0.004614,0.05,2.875e+05,9.6595 -1e+05,0.46996,0.004614,0.05,2.875e+05,9.6595 -1e+05,0.46996,0.004614,0.05,2.875e+05,9.6595 -1e+05,0.46996,0.004614,0.05,2.875e+05,9.6595 -1e+05,0.47926,0.0047053,0.05,2.8481e+05,9.0227 -1e+05,0.47926,0.0047053,0.05,2.8481e+05,9.0227 -1e+05,0.47926,0.0047053,0.05,2.8481e+05,9.0227 -1e+05,0.47926,0.0047053,0.05,2.8481e+05,9.0227 -1e+05,0.47926,0.0047053,0.05,2.8481e+05,9.0227 -1e+05,0.47926,0.0047053,0.05,2.8481e+05,9.0227 -1e+05,0.47926,0.0047053,0.05,2.8481e+05,9.0227 -1e+05,0.47926,0.0047053,0.05,2.8481e+05,9.0227 -1e+05,0.47926,0.0047053,0.05,2.8481e+05,9.0227 -1e+05,0.48875,0.0047985,0.05,2.8182e+05,8.4104 -1e+05,0.48875,0.0047985,0.05,2.8182e+05,8.4104 -1e+05,0.48875,0.0047985,0.05,2.8182e+05,8.4104 -1e+05,0.48875,0.0047985,0.05,2.8182e+05,8.4104 -1e+05,0.48875,0.0047985,0.05,2.8182e+05,8.4104 -1e+05,0.48875,0.0047985,0.05,2.8182e+05,8.4104 -1e+05,0.48875,0.0047985,0.05,2.8182e+05,8.4104 -1e+05,0.48875,0.0047985,0.05,2.8182e+05,8.4104 -1e+05,0.48875,0.0047985,0.05,2.8182e+05,8.4104 -1e+05,0.48875,0.0047985,0.05,2.8182e+05,8.4104 -1e+05,0.49843,0.0048935,0.05,2.7852e+05,7.8227 -1e+05,0.49843,0.0048935,0.05,2.7852e+05,7.8227 -1e+05,0.49843,0.0048935,0.05,2.7852e+05,7.8227 -1e+05,0.49843,0.0048935,0.05,2.7852e+05,7.8227 -1e+05,0.49843,0.0048935,0.05,2.7852e+05,7.8227 -1e+05,0.49843,0.0048935,0.05,2.7852e+05,7.8227 -1e+05,0.49843,0.0048935,0.05,2.7852e+05,7.8227 -1e+05,0.49843,0.0048935,0.05,2.7852e+05,7.8227 -1e+05,0.49843,0.0048935,0.05,2.7852e+05,7.8227 -1e+05,0.49843,0.0048935,0.05,2.7852e+05,7.8227 -1e+05,0.5083,0.0049903,0.05,2.7492e+05,7.2599 -1e+05,0.5083,0.0049903,0.05,2.7492e+05,7.2599 -1e+05,0.5083,0.0049903,0.05,2.7492e+05,7.2599 -1e+05,0.5083,0.0049903,0.05,2.7492e+05,7.2599 -1e+05,0.5083,0.0049903,0.05,2.7492e+05,7.2599 -1e+05,0.5083,0.0049903,0.05,2.7492e+05,7.2599 -1e+05,0.5083,0.0049903,0.05,2.7492e+05,7.2599 -1e+05,0.5083,0.0049903,0.05,2.7492e+05,7.2599 -1e+05,0.5083,0.0049903,0.05,2.7492e+05,7.2599 -1e+05,0.5083,0.0049903,0.05,2.7492e+05,7.2599 -1e+05,0.51836,0.0050891,0.05,2.7101e+05,6.722 -1e+05,0.51836,0.0050891,0.05,2.7101e+05,6.722 -1e+05,0.51836,0.0050891,0.05,2.7101e+05,6.722 -1e+05,0.51836,0.0050891,0.05,2.7101e+05,6.722 -1e+05,0.51836,0.0050891,0.05,2.7101e+05,6.722 -1e+05,0.51836,0.0050891,0.05,2.7101e+05,6.722 -1e+05,0.51836,0.0050891,0.05,2.7101e+05,6.722 -1e+05,0.51836,0.0050891,0.05,2.7101e+05,6.722 -1e+05,0.51836,0.0050891,0.05,2.7101e+05,6.722 -1e+05,0.51836,0.0050891,0.05,2.7101e+05,6.722 -1e+05,0.52862,0.0051899,0.05,2.6678e+05,6.209 -1e+05,0.52862,0.0051899,0.05,2.6678e+05,6.209 -1e+05,0.52862,0.0051899,0.05,2.6678e+05,6.209 -1e+05,0.52862,0.0051899,0.05,2.6678e+05,6.209 -1e+05,0.52862,0.0051899,0.05,2.6678e+05,6.209 -1e+05,0.52862,0.0051899,0.05,2.6678e+05,6.209 -1e+05,0.52862,0.0051899,0.05,2.6678e+05,6.209 -1e+05,0.52862,0.0051899,0.05,2.6678e+05,6.209 -1e+05,0.52862,0.0051899,0.05,2.6678e+05,6.209 -1e+05,0.52862,0.0051899,0.05,2.6678e+05,6.209 -1e+05,0.53909,0.0052927,0.05,2.6226e+05,5.7208 -1e+05,0.53909,0.0052927,0.05,2.6226e+05,5.7208 -1e+05,0.53909,0.0052927,0.05,2.6226e+05,5.7208 -1e+05,0.53909,0.0052927,0.05,2.6226e+05,5.7208 -1e+05,0.53909,0.0052927,0.05,2.6226e+05,5.7208 -1e+05,0.53909,0.0052927,0.05,2.6226e+05,5.7208 -1e+05,0.53909,0.0052927,0.05,2.6226e+05,5.7208 -1e+05,0.53909,0.0052927,0.05,2.6226e+05,5.7208 -1e+05,0.53909,0.0052927,0.05,2.6226e+05,5.7208 -1e+05,0.53909,0.0052927,0.05,2.6226e+05,5.7208 -1e+05,0.53909,0.0052927,0.05,2.6226e+05,5.7208 -1e+05,0.54976,0.0053975,0.05,2.5742e+05,5.2574 -1e+05,0.54976,0.0053975,0.05,2.5742e+05,5.2574 -1e+05,0.54976,0.0053975,0.05,2.5742e+05,5.2574 -1e+05,0.54976,0.0053975,0.05,2.5742e+05,5.2574 -1e+05,0.54976,0.0053975,0.05,2.5742e+05,5.2574 -1e+05,0.54976,0.0053975,0.05,2.5742e+05,5.2574 -1e+05,0.54976,0.0053975,0.05,2.5742e+05,5.2574 -1e+05,0.54976,0.0053975,0.05,2.5742e+05,5.2574 -1e+05,0.54976,0.0053975,0.05,2.5742e+05,5.2574 -1e+05,0.54976,0.0053975,0.05,2.5742e+05,5.2574 -1e+05,0.54976,0.0053975,0.05,2.5742e+05,5.2574 -1e+05,0.56065,0.0055043,0.05,2.5228e+05,4.8185 -1e+05,0.56065,0.0055043,0.05,2.5228e+05,4.8185 -1e+05,0.56065,0.0055043,0.05,2.5228e+05,4.8185 -1e+05,0.56065,0.0055043,0.05,2.5228e+05,4.8185 -1e+05,0.56065,0.0055043,0.05,2.5228e+05,4.8185 -1e+05,0.56065,0.0055043,0.05,2.5228e+05,4.8185 -1e+05,0.56065,0.0055043,0.05,2.5228e+05,4.8185 -1e+05,0.56065,0.0055043,0.05,2.5228e+05,4.8185 -1e+05,0.56065,0.0055043,0.05,2.5228e+05,4.8185 -1e+05,0.56065,0.0055043,0.05,2.5228e+05,4.8185 -1e+05,0.56065,0.0055043,0.05,2.5228e+05,4.8185 -1e+05,0.57175,0.0056133,0.05,2.4684e+05,4.4039 -1e+05,0.57175,0.0056133,0.05,2.4684e+05,4.4039 -1e+05,0.57175,0.0056133,0.05,2.4684e+05,4.4039 -1e+05,0.57175,0.0056133,0.05,2.4684e+05,4.4039 -1e+05,0.57175,0.0056133,0.05,2.4684e+05,4.4039 -1e+05,0.57175,0.0056133,0.05,2.4684e+05,4.4039 -1e+05,0.57175,0.0056133,0.05,2.4684e+05,4.4039 -1e+05,0.57175,0.0056133,0.05,2.4684e+05,4.4039 -1e+05,0.57175,0.0056133,0.05,2.4684e+05,4.4039 -1e+05,0.57175,0.0056133,0.05,2.4684e+05,4.4039 -1e+05,0.57175,0.0056133,0.05,2.4684e+05,4.4039 -1e+05,0.58307,0.0057245,0.05,2.411e+05,4.0133 -1e+05,0.58307,0.0057245,0.05,2.411e+05,4.0133 -1e+05,0.58307,0.0057245,0.05,2.411e+05,4.0133 -1e+05,0.58307,0.0057245,0.05,2.411e+05,4.0133 -1e+05,0.58307,0.0057245,0.05,2.411e+05,4.0133 -1e+05,0.58307,0.0057245,0.05,2.411e+05,4.0133 -1e+05,0.58307,0.0057245,0.05,2.411e+05,4.0133 -1e+05,0.58307,0.0057245,0.05,2.411e+05,4.0133 -1e+05,0.58307,0.0057245,0.05,2.411e+05,4.0133 -1e+05,0.58307,0.0057245,0.05,2.411e+05,4.0133 -1e+05,0.58307,0.0057245,0.05,2.411e+05,4.0133 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.59462,0.0058378,0.05,2.3507e+05,3.6464 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.60639,0.0059535,0.05,2.2875e+05,3.3027 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.6184,0.0060714,0.05,2.2215e+05,2.9816 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.63065,0.0061916,0.05,2.1528e+05,2.6827 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.64314,0.0063142,0.05,2.0814e+05,2.4053 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.65588,0.0064393,0.05,2.0074e+05,2.1488 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.66887,0.0065668,0.05,1.9309e+05,1.9123 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.68211,0.0066969,0.05,1.8521e+05,1.6952 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.69562,0.0068295,0.05,1.7709e+05,1.4965 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.7094,0.0069648,0.05,1.6876e+05,1.3154 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.72345,0.0071027,0.05,1.6022e+05,1.1511 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.73778,0.0072434,0.05,1.5148e+05,1.0025 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7524,0.0073869,0.05,1.4256e+05,0.86883 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7673,0.0075332,0.05,1.3347e+05,0.74899 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.7825,0.0076824,0.05,1.2422e+05,0.64203 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.798,0.0078346,0.05,1.1482e+05,0.54698 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.81381,0.0079898,0.05,1.0528e+05,0.46286 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.82993,0.0081481,0.05,95624,0.38869 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.84637,0.0083095,0.05,85855,0.3235 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.86314,0.0084741,0.05,75985,0.26634 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.88024,0.008642,0.05,66028,0.21628 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.89767,0.0088132,0.05,55994,0.17237 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.91546,0.0089878,0.05,45895,0.1337 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.93359,0.0091658,0.05,35742,0.099362 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.95209,0.0093474,0.05,25547,0.068435 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.97095,0.0095326,0.05,15321,0.03999 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,0.99019,0.0097215,0.05,5075.6,0.01307 -1e+05,nan,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_2.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_2.csv deleted file mode 100644 index 440878fbef7..00000000000 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_2.csv +++ /dev/null @@ -1,1002 +0,0 @@ -Time,"elementCenter:0","elementCenter:1","elementCenter:2","pressure","temperature" -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,nan,nan,nan,nan,nan -20000,0.10099,0.0009915,0.05,7867.1,98.936 -20000,0.10099,0.0009915,0.05,7867.1,98.936 -20000,0.10299,0.0010111,0.05,23281,96.849 -20000,0.10299,0.0010111,0.05,23281,96.849 -20000,0.10499,0.0010308,0.05,38382,94.802 -20000,0.10499,0.0010308,0.05,38382,94.802 -20000,0.10734,0.0010538,0.05,55766,92.444 -20000,0.10734,0.0010538,0.05,55766,92.444 -20000,0.10734,0.0010538,0.05,55766,92.444 -20000,0.11004,0.0010803,0.05,75199,89.805 -20000,0.11004,0.0010803,0.05,75199,89.805 -20000,0.11004,0.0010803,0.05,75199,89.805 -20000,0.11274,0.0011068,0.05,94107,87.232 -20000,0.11274,0.0011068,0.05,94107,87.232 -20000,0.11274,0.0011068,0.05,94107,87.232 -20000,0.11544,0.0011334,0.05,1.125e+05,84.724 -20000,0.11544,0.0011334,0.05,1.125e+05,84.724 -20000,0.11814,0.0011599,0.05,1.304e+05,82.279 -20000,0.11814,0.0011599,0.05,1.304e+05,82.279 -20000,0.11814,0.0011599,0.05,1.304e+05,82.279 -20000,0.12084,0.0011864,0.05,1.4782e+05,79.895 -20000,0.12084,0.0011864,0.05,1.4782e+05,79.895 -20000,0.12084,0.0011864,0.05,1.4782e+05,79.895 -20000,0.12354,0.0012129,0.05,1.6476e+05,77.57 -20000,0.12354,0.0012129,0.05,1.6476e+05,77.57 -20000,0.12624,0.0012394,0.05,1.8125e+05,75.301 -20000,0.12624,0.0012394,0.05,1.8125e+05,75.301 -20000,0.12624,0.0012394,0.05,1.8125e+05,75.301 -20000,0.12894,0.0012659,0.05,1.9727e+05,73.088 -20000,0.12894,0.0012659,0.05,1.9727e+05,73.088 -20000,0.12894,0.0012659,0.05,1.9727e+05,73.088 -20000,0.13164,0.0012924,0.05,2.1286e+05,70.93 -20000,0.13164,0.0012924,0.05,2.1286e+05,70.93 -20000,0.1343,0.0013185,0.05,2.2779e+05,68.854 -20000,0.1343,0.0013185,0.05,2.2779e+05,68.854 -20000,0.1343,0.0013185,0.05,2.2779e+05,68.854 -20000,0.13695,0.0013445,0.05,2.4224e+05,66.837 -20000,0.13695,0.0013445,0.05,2.4224e+05,66.837 -20000,0.13695,0.0013445,0.05,2.4224e+05,66.837 -20000,0.13965,0.001371,0.05,2.5657e+05,64.829 -20000,0.13965,0.001371,0.05,2.5657e+05,64.829 -20000,0.13965,0.001371,0.05,2.5657e+05,64.829 -20000,0.1424,0.0013981,0.05,2.7075e+05,62.832 -20000,0.1424,0.0013981,0.05,2.7075e+05,62.832 -20000,0.14521,0.0014256,0.05,2.8478e+05,60.847 -20000,0.14521,0.0014256,0.05,2.8478e+05,60.847 -20000,0.14521,0.0014256,0.05,2.8478e+05,60.847 -20000,0.14807,0.0014538,0.05,2.9865e+05,58.874 -20000,0.14807,0.0014538,0.05,2.9865e+05,58.874 -20000,0.14807,0.0014538,0.05,2.9865e+05,58.874 -20000,0.151,0.0014824,0.05,3.1233e+05,56.915 -20000,0.151,0.0014824,0.05,3.1233e+05,56.915 -20000,0.151,0.0014824,0.05,3.1233e+05,56.915 -20000,0.15397,0.0015117,0.05,3.2583e+05,54.971 -20000,0.15397,0.0015117,0.05,3.2583e+05,54.971 -20000,0.15397,0.0015117,0.05,3.2583e+05,54.971 -20000,0.15701,0.0015415,0.05,3.3912e+05,53.043 -20000,0.15701,0.0015415,0.05,3.3912e+05,53.043 -20000,0.15701,0.0015415,0.05,3.3912e+05,53.043 -20000,0.16011,0.0015719,0.05,3.5218e+05,51.132 -20000,0.16011,0.0015719,0.05,3.5218e+05,51.132 -20000,0.16011,0.0015719,0.05,3.5218e+05,51.132 -20000,0.16327,0.001603,0.05,3.6501e+05,49.24 -20000,0.16327,0.001603,0.05,3.6501e+05,49.24 -20000,0.16327,0.001603,0.05,3.6501e+05,49.24 -20000,0.16649,0.0016346,0.05,3.7758e+05,47.367 -20000,0.16649,0.0016346,0.05,3.7758e+05,47.367 -20000,0.16649,0.0016346,0.05,3.7758e+05,47.367 -20000,0.16649,0.0016346,0.05,3.7758e+05,47.367 -20000,0.16978,0.0016669,0.05,3.8989e+05,45.516 -20000,0.16978,0.0016669,0.05,3.8989e+05,45.516 -20000,0.16978,0.0016669,0.05,3.8989e+05,45.516 -20000,0.17313,0.0016998,0.05,4.0191e+05,43.687 -20000,0.17313,0.0016998,0.05,4.0191e+05,43.687 -20000,0.17313,0.0016998,0.05,4.0191e+05,43.687 -20000,0.17655,0.0017333,0.05,4.1363e+05,41.881 -20000,0.17655,0.0017333,0.05,4.1363e+05,41.881 -20000,0.17655,0.0017333,0.05,4.1363e+05,41.881 -20000,0.17655,0.0017333,0.05,4.1363e+05,41.881 -20000,0.18004,0.0017676,0.05,4.2502e+05,40.101 -20000,0.18004,0.0017676,0.05,4.2502e+05,40.101 -20000,0.18004,0.0017676,0.05,4.2502e+05,40.101 -20000,0.18359,0.0018025,0.05,4.3609e+05,38.348 -20000,0.18359,0.0018025,0.05,4.3609e+05,38.348 -20000,0.18359,0.0018025,0.05,4.3609e+05,38.348 -20000,0.18359,0.0018025,0.05,4.3609e+05,38.348 -20000,0.18722,0.001838,0.05,4.4679e+05,36.623 -20000,0.18722,0.001838,0.05,4.4679e+05,36.623 -20000,0.18722,0.001838,0.05,4.4679e+05,36.623 -20000,0.18722,0.001838,0.05,4.4679e+05,36.623 -20000,0.19091,0.0018743,0.05,4.5713e+05,34.927 -20000,0.19091,0.0018743,0.05,4.5713e+05,34.927 -20000,0.19091,0.0018743,0.05,4.5713e+05,34.927 -20000,0.19468,0.0019114,0.05,4.6707e+05,33.263 -20000,0.19468,0.0019114,0.05,4.6707e+05,33.263 -20000,0.19468,0.0019114,0.05,4.6707e+05,33.263 -20000,0.19468,0.0019114,0.05,4.6707e+05,33.263 -20000,0.19853,0.0019491,0.05,4.7661e+05,31.631 -20000,0.19853,0.0019491,0.05,4.7661e+05,31.631 -20000,0.19853,0.0019491,0.05,4.7661e+05,31.631 -20000,0.19853,0.0019491,0.05,4.7661e+05,31.631 -20000,0.20245,0.0019876,0.05,4.8572e+05,30.032 -20000,0.20245,0.0019876,0.05,4.8572e+05,30.032 -20000,0.20245,0.0019876,0.05,4.8572e+05,30.032 -20000,0.20245,0.0019876,0.05,4.8572e+05,30.032 -20000,0.20645,0.0020269,0.05,4.9439e+05,28.469 -20000,0.20645,0.0020269,0.05,4.9439e+05,28.469 -20000,0.20645,0.0020269,0.05,4.9439e+05,28.469 -20000,0.20645,0.0020269,0.05,4.9439e+05,28.469 -20000,0.21053,0.0020669,0.05,5.026e+05,26.943 -20000,0.21053,0.0020669,0.05,5.026e+05,26.943 -20000,0.21053,0.0020669,0.05,5.026e+05,26.943 -20000,0.21053,0.0020669,0.05,5.026e+05,26.943 -20000,0.21469,0.0021078,0.05,5.1034e+05,25.455 -20000,0.21469,0.0021078,0.05,5.1034e+05,25.455 -20000,0.21469,0.0021078,0.05,5.1034e+05,25.455 -20000,0.21469,0.0021078,0.05,5.1034e+05,25.455 -20000,0.21893,0.0021494,0.05,5.1758e+05,24.006 -20000,0.21893,0.0021494,0.05,5.1758e+05,24.006 -20000,0.21893,0.0021494,0.05,5.1758e+05,24.006 -20000,0.21893,0.0021494,0.05,5.1758e+05,24.006 -20000,0.21893,0.0021494,0.05,5.1758e+05,24.006 -20000,0.22326,0.0021919,0.05,5.2432e+05,22.598 -20000,0.22326,0.0021919,0.05,5.2432e+05,22.598 -20000,0.22326,0.0021919,0.05,5.2432e+05,22.598 -20000,0.22326,0.0021919,0.05,5.2432e+05,22.598 -20000,0.22767,0.0022352,0.05,5.3053e+05,21.232 -20000,0.22767,0.0022352,0.05,5.3053e+05,21.232 -20000,0.22767,0.0022352,0.05,5.3053e+05,21.232 -20000,0.22767,0.0022352,0.05,5.3053e+05,21.232 -20000,0.23217,0.0022794,0.05,5.3622e+05,19.909 -20000,0.23217,0.0022794,0.05,5.3622e+05,19.909 -20000,0.23217,0.0022794,0.05,5.3622e+05,19.909 -20000,0.23217,0.0022794,0.05,5.3622e+05,19.909 -20000,0.23217,0.0022794,0.05,5.3622e+05,19.909 -20000,0.23676,0.0023244,0.05,5.4135e+05,18.63 -20000,0.23676,0.0023244,0.05,5.4135e+05,18.63 -20000,0.23676,0.0023244,0.05,5.4135e+05,18.63 -20000,0.23676,0.0023244,0.05,5.4135e+05,18.63 -20000,0.23676,0.0023244,0.05,5.4135e+05,18.63 -20000,0.24144,0.0023704,0.05,5.4593e+05,17.395 -20000,0.24144,0.0023704,0.05,5.4593e+05,17.395 -20000,0.24144,0.0023704,0.05,5.4593e+05,17.395 -20000,0.24144,0.0023704,0.05,5.4593e+05,17.395 -20000,0.24621,0.0024172,0.05,5.4994e+05,16.207 -20000,0.24621,0.0024172,0.05,5.4994e+05,16.207 -20000,0.24621,0.0024172,0.05,5.4994e+05,16.207 -20000,0.24621,0.0024172,0.05,5.4994e+05,16.207 -20000,0.24621,0.0024172,0.05,5.4994e+05,16.207 -20000,0.25108,0.002465,0.05,5.5337e+05,15.065 -20000,0.25108,0.002465,0.05,5.5337e+05,15.065 -20000,0.25108,0.002465,0.05,5.5337e+05,15.065 -20000,0.25108,0.002465,0.05,5.5337e+05,15.065 -20000,0.25108,0.002465,0.05,5.5337e+05,15.065 -20000,0.25604,0.0025137,0.05,5.5621e+05,13.97 -20000,0.25604,0.0025137,0.05,5.5621e+05,13.97 -20000,0.25604,0.0025137,0.05,5.5621e+05,13.97 -20000,0.25604,0.0025137,0.05,5.5621e+05,13.97 -20000,0.25604,0.0025137,0.05,5.5621e+05,13.97 -20000,0.2611,0.0025634,0.05,5.5847e+05,12.923 -20000,0.2611,0.0025634,0.05,5.5847e+05,12.923 -20000,0.2611,0.0025634,0.05,5.5847e+05,12.923 -20000,0.2611,0.0025634,0.05,5.5847e+05,12.923 -20000,0.2611,0.0025634,0.05,5.5847e+05,12.923 -20000,0.26626,0.0026141,0.05,5.6014e+05,11.924 -20000,0.26626,0.0026141,0.05,5.6014e+05,11.924 -20000,0.26626,0.0026141,0.05,5.6014e+05,11.924 -20000,0.26626,0.0026141,0.05,5.6014e+05,11.924 -20000,0.26626,0.0026141,0.05,5.6014e+05,11.924 -20000,0.27153,0.0026658,0.05,5.6121e+05,10.972 -20000,0.27153,0.0026658,0.05,5.6121e+05,10.972 -20000,0.27153,0.0026658,0.05,5.6121e+05,10.972 -20000,0.27153,0.0026658,0.05,5.6121e+05,10.972 -20000,0.27153,0.0026658,0.05,5.6121e+05,10.972 -20000,0.27153,0.0026658,0.05,5.6121e+05,10.972 -20000,0.2769,0.0027185,0.05,5.6168e+05,10.069 -20000,0.2769,0.0027185,0.05,5.6168e+05,10.069 -20000,0.2769,0.0027185,0.05,5.6168e+05,10.069 -20000,0.2769,0.0027185,0.05,5.6168e+05,10.069 -20000,0.2769,0.0027185,0.05,5.6168e+05,10.069 -20000,0.28237,0.0027723,0.05,5.6156e+05,9.2141 -20000,0.28237,0.0027723,0.05,5.6156e+05,9.2141 -20000,0.28237,0.0027723,0.05,5.6156e+05,9.2141 -20000,0.28237,0.0027723,0.05,5.6156e+05,9.2141 -20000,0.28237,0.0027723,0.05,5.6156e+05,9.2141 -20000,0.28237,0.0027723,0.05,5.6156e+05,9.2141 -20000,0.28796,0.0028271,0.05,5.6085e+05,8.4069 -20000,0.28796,0.0028271,0.05,5.6085e+05,8.4069 -20000,0.28796,0.0028271,0.05,5.6085e+05,8.4069 -20000,0.28796,0.0028271,0.05,5.6085e+05,8.4069 -20000,0.28796,0.0028271,0.05,5.6085e+05,8.4069 -20000,0.29365,0.002883,0.05,5.5955e+05,7.6469 -20000,0.29365,0.002883,0.05,5.5955e+05,7.6469 -20000,0.29365,0.002883,0.05,5.5955e+05,7.6469 -20000,0.29365,0.002883,0.05,5.5955e+05,7.6469 -20000,0.29365,0.002883,0.05,5.5955e+05,7.6469 -20000,0.29365,0.002883,0.05,5.5955e+05,7.6469 -20000,0.29946,0.00294,0.05,5.5768e+05,6.9336 -20000,0.29946,0.00294,0.05,5.5768e+05,6.9336 -20000,0.29946,0.00294,0.05,5.5768e+05,6.9336 -20000,0.29946,0.00294,0.05,5.5768e+05,6.9336 -20000,0.29946,0.00294,0.05,5.5768e+05,6.9336 -20000,0.29946,0.00294,0.05,5.5768e+05,6.9336 -20000,0.30538,0.0029982,0.05,5.5524e+05,6.2663 -20000,0.30538,0.0029982,0.05,5.5524e+05,6.2663 -20000,0.30538,0.0029982,0.05,5.5524e+05,6.2663 -20000,0.30538,0.0029982,0.05,5.5524e+05,6.2663 -20000,0.30538,0.0029982,0.05,5.5524e+05,6.2663 -20000,0.30538,0.0029982,0.05,5.5524e+05,6.2663 -20000,0.31142,0.0030575,0.05,5.5225e+05,5.6441 -20000,0.31142,0.0030575,0.05,5.5225e+05,5.6441 -20000,0.31142,0.0030575,0.05,5.5225e+05,5.6441 -20000,0.31142,0.0030575,0.05,5.5225e+05,5.6441 -20000,0.31142,0.0030575,0.05,5.5225e+05,5.6441 -20000,0.31142,0.0030575,0.05,5.5225e+05,5.6441 -20000,0.31758,0.003118,0.05,5.4871e+05,5.0659 -20000,0.31758,0.003118,0.05,5.4871e+05,5.0659 -20000,0.31758,0.003118,0.05,5.4871e+05,5.0659 -20000,0.31758,0.003118,0.05,5.4871e+05,5.0659 -20000,0.31758,0.003118,0.05,5.4871e+05,5.0659 -20000,0.31758,0.003118,0.05,5.4871e+05,5.0659 -20000,0.32386,0.0031796,0.05,5.4465e+05,4.5304 -20000,0.32386,0.0031796,0.05,5.4465e+05,4.5304 -20000,0.32386,0.0031796,0.05,5.4465e+05,4.5304 -20000,0.32386,0.0031796,0.05,5.4465e+05,4.5304 -20000,0.32386,0.0031796,0.05,5.4465e+05,4.5304 -20000,0.32386,0.0031796,0.05,5.4465e+05,4.5304 -20000,0.32386,0.0031796,0.05,5.4465e+05,4.5304 -20000,0.33027,0.0032425,0.05,5.4008e+05,4.0363 -20000,0.33027,0.0032425,0.05,5.4008e+05,4.0363 -20000,0.33027,0.0032425,0.05,5.4008e+05,4.0363 -20000,0.33027,0.0032425,0.05,5.4008e+05,4.0363 -20000,0.33027,0.0032425,0.05,5.4008e+05,4.0363 -20000,0.33027,0.0032425,0.05,5.4008e+05,4.0363 -20000,0.3368,0.0033067,0.05,5.3502e+05,3.5822 -20000,0.3368,0.0033067,0.05,5.3502e+05,3.5822 -20000,0.3368,0.0033067,0.05,5.3502e+05,3.5822 -20000,0.3368,0.0033067,0.05,5.3502e+05,3.5822 -20000,0.3368,0.0033067,0.05,5.3502e+05,3.5822 -20000,0.3368,0.0033067,0.05,5.3502e+05,3.5822 -20000,0.3368,0.0033067,0.05,5.3502e+05,3.5822 -20000,0.34347,0.0033721,0.05,5.2948e+05,3.1664 -20000,0.34347,0.0033721,0.05,5.2948e+05,3.1664 -20000,0.34347,0.0033721,0.05,5.2948e+05,3.1664 -20000,0.34347,0.0033721,0.05,5.2948e+05,3.1664 -20000,0.34347,0.0033721,0.05,5.2948e+05,3.1664 -20000,0.34347,0.0033721,0.05,5.2948e+05,3.1664 -20000,0.35026,0.0034388,0.05,5.235e+05,2.7873 -20000,0.35026,0.0034388,0.05,5.235e+05,2.7873 -20000,0.35026,0.0034388,0.05,5.235e+05,2.7873 -20000,0.35026,0.0034388,0.05,5.235e+05,2.7873 -20000,0.35026,0.0034388,0.05,5.235e+05,2.7873 -20000,0.35026,0.0034388,0.05,5.235e+05,2.7873 -20000,0.35026,0.0034388,0.05,5.235e+05,2.7873 -20000,0.35719,0.0035069,0.05,5.1709e+05,2.4431 -20000,0.35719,0.0035069,0.05,5.1709e+05,2.4431 -20000,0.35719,0.0035069,0.05,5.1709e+05,2.4431 -20000,0.35719,0.0035069,0.05,5.1709e+05,2.4431 -20000,0.35719,0.0035069,0.05,5.1709e+05,2.4431 -20000,0.35719,0.0035069,0.05,5.1709e+05,2.4431 -20000,0.35719,0.0035069,0.05,5.1709e+05,2.4431 -20000,0.36426,0.0035762,0.05,5.1027e+05,2.132 -20000,0.36426,0.0035762,0.05,5.1027e+05,2.132 -20000,0.36426,0.0035762,0.05,5.1027e+05,2.132 -20000,0.36426,0.0035762,0.05,5.1027e+05,2.132 -20000,0.36426,0.0035762,0.05,5.1027e+05,2.132 -20000,0.36426,0.0035762,0.05,5.1027e+05,2.132 -20000,0.36426,0.0035762,0.05,5.1027e+05,2.132 -20000,0.37147,0.003647,0.05,5.0307e+05,1.8519 -20000,0.37147,0.003647,0.05,5.0307e+05,1.8519 -20000,0.37147,0.003647,0.05,5.0307e+05,1.8519 -20000,0.37147,0.003647,0.05,5.0307e+05,1.8519 -20000,0.37147,0.003647,0.05,5.0307e+05,1.8519 -20000,0.37147,0.003647,0.05,5.0307e+05,1.8519 -20000,0.37147,0.003647,0.05,5.0307e+05,1.8519 -20000,0.37147,0.003647,0.05,5.0307e+05,1.8519 -20000,0.37882,0.0037192,0.05,4.9552e+05,1.6011 -20000,0.37882,0.0037192,0.05,4.9552e+05,1.6011 -20000,0.37882,0.0037192,0.05,4.9552e+05,1.6011 -20000,0.37882,0.0037192,0.05,4.9552e+05,1.6011 -20000,0.37882,0.0037192,0.05,4.9552e+05,1.6011 -20000,0.37882,0.0037192,0.05,4.9552e+05,1.6011 -20000,0.37882,0.0037192,0.05,4.9552e+05,1.6011 -20000,0.38632,0.0037928,0.05,4.8763e+05,1.3775 -20000,0.38632,0.0037928,0.05,4.8763e+05,1.3775 -20000,0.38632,0.0037928,0.05,4.8763e+05,1.3775 -20000,0.38632,0.0037928,0.05,4.8763e+05,1.3775 -20000,0.38632,0.0037928,0.05,4.8763e+05,1.3775 -20000,0.38632,0.0037928,0.05,4.8763e+05,1.3775 -20000,0.38632,0.0037928,0.05,4.8763e+05,1.3775 -20000,0.38632,0.0037928,0.05,4.8763e+05,1.3775 -20000,0.39396,0.0038678,0.05,4.7944e+05,1.1792 -20000,0.39396,0.0038678,0.05,4.7944e+05,1.1792 -20000,0.39396,0.0038678,0.05,4.7944e+05,1.1792 -20000,0.39396,0.0038678,0.05,4.7944e+05,1.1792 -20000,0.39396,0.0038678,0.05,4.7944e+05,1.1792 -20000,0.39396,0.0038678,0.05,4.7944e+05,1.1792 -20000,0.39396,0.0038678,0.05,4.7944e+05,1.1792 -20000,0.40176,0.0039444,0.05,4.7097e+05,1.0042 -20000,0.40176,0.0039444,0.05,4.7097e+05,1.0042 -20000,0.40176,0.0039444,0.05,4.7097e+05,1.0042 -20000,0.40176,0.0039444,0.05,4.7097e+05,1.0042 -20000,0.40176,0.0039444,0.05,4.7097e+05,1.0042 -20000,0.40176,0.0039444,0.05,4.7097e+05,1.0042 -20000,0.40176,0.0039444,0.05,4.7097e+05,1.0042 -20000,0.40176,0.0039444,0.05,4.7097e+05,1.0042 -20000,0.40971,0.0040224,0.05,4.6223e+05,0.85065 -20000,0.40971,0.0040224,0.05,4.6223e+05,0.85065 -20000,0.40971,0.0040224,0.05,4.6223e+05,0.85065 -20000,0.40971,0.0040224,0.05,4.6223e+05,0.85065 -20000,0.40971,0.0040224,0.05,4.6223e+05,0.85065 -20000,0.40971,0.0040224,0.05,4.6223e+05,0.85065 -20000,0.40971,0.0040224,0.05,4.6223e+05,0.85065 -20000,0.40971,0.0040224,0.05,4.6223e+05,0.85065 -20000,0.41782,0.004102,0.05,4.5326e+05,0.71658 -20000,0.41782,0.004102,0.05,4.5326e+05,0.71658 -20000,0.41782,0.004102,0.05,4.5326e+05,0.71658 -20000,0.41782,0.004102,0.05,4.5326e+05,0.71658 -20000,0.41782,0.004102,0.05,4.5326e+05,0.71658 -20000,0.41782,0.004102,0.05,4.5326e+05,0.71658 -20000,0.41782,0.004102,0.05,4.5326e+05,0.71658 -20000,0.41782,0.004102,0.05,4.5326e+05,0.71658 -20000,0.42609,0.0041832,0.05,4.4408e+05,0.60022 -20000,0.42609,0.0041832,0.05,4.4408e+05,0.60022 -20000,0.42609,0.0041832,0.05,4.4408e+05,0.60022 -20000,0.42609,0.0041832,0.05,4.4408e+05,0.60022 -20000,0.42609,0.0041832,0.05,4.4408e+05,0.60022 -20000,0.42609,0.0041832,0.05,4.4408e+05,0.60022 -20000,0.42609,0.0041832,0.05,4.4408e+05,0.60022 -20000,0.42609,0.0041832,0.05,4.4408e+05,0.60022 -20000,0.42609,0.0041832,0.05,4.4408e+05,0.60022 -20000,0.43452,0.004266,0.05,4.3471e+05,0.49981 -20000,0.43452,0.004266,0.05,4.3471e+05,0.49981 -20000,0.43452,0.004266,0.05,4.3471e+05,0.49981 -20000,0.43452,0.004266,0.05,4.3471e+05,0.49981 -20000,0.43452,0.004266,0.05,4.3471e+05,0.49981 -20000,0.43452,0.004266,0.05,4.3471e+05,0.49981 -20000,0.43452,0.004266,0.05,4.3471e+05,0.49981 -20000,0.43452,0.004266,0.05,4.3471e+05,0.49981 -20000,0.44312,0.0043505,0.05,4.2517e+05,0.41369 -20000,0.44312,0.0043505,0.05,4.2517e+05,0.41369 -20000,0.44312,0.0043505,0.05,4.2517e+05,0.41369 -20000,0.44312,0.0043505,0.05,4.2517e+05,0.41369 -20000,0.44312,0.0043505,0.05,4.2517e+05,0.41369 -20000,0.44312,0.0043505,0.05,4.2517e+05,0.41369 -20000,0.44312,0.0043505,0.05,4.2517e+05,0.41369 -20000,0.44312,0.0043505,0.05,4.2517e+05,0.41369 -20000,0.44312,0.0043505,0.05,4.2517e+05,0.41369 -20000,0.45189,0.0044366,0.05,4.1547e+05,0.34028 -20000,0.45189,0.0044366,0.05,4.1547e+05,0.34028 -20000,0.45189,0.0044366,0.05,4.1547e+05,0.34028 -20000,0.45189,0.0044366,0.05,4.1547e+05,0.34028 -20000,0.45189,0.0044366,0.05,4.1547e+05,0.34028 -20000,0.45189,0.0044366,0.05,4.1547e+05,0.34028 -20000,0.45189,0.0044366,0.05,4.1547e+05,0.34028 -20000,0.45189,0.0044366,0.05,4.1547e+05,0.34028 -20000,0.45189,0.0044366,0.05,4.1547e+05,0.34028 -20000,0.46084,0.0045244,0.05,4.0565e+05,0.27811 -20000,0.46084,0.0045244,0.05,4.0565e+05,0.27811 -20000,0.46084,0.0045244,0.05,4.0565e+05,0.27811 -20000,0.46084,0.0045244,0.05,4.0565e+05,0.27811 -20000,0.46084,0.0045244,0.05,4.0565e+05,0.27811 -20000,0.46084,0.0045244,0.05,4.0565e+05,0.27811 -20000,0.46084,0.0045244,0.05,4.0565e+05,0.27811 -20000,0.46084,0.0045244,0.05,4.0565e+05,0.27811 -20000,0.46084,0.0045244,0.05,4.0565e+05,0.27811 -20000,0.46996,0.004614,0.05,3.9572e+05,0.2258 -20000,0.46996,0.004614,0.05,3.9572e+05,0.2258 -20000,0.46996,0.004614,0.05,3.9572e+05,0.2258 -20000,0.46996,0.004614,0.05,3.9572e+05,0.2258 -20000,0.46996,0.004614,0.05,3.9572e+05,0.2258 -20000,0.46996,0.004614,0.05,3.9572e+05,0.2258 -20000,0.46996,0.004614,0.05,3.9572e+05,0.2258 -20000,0.46996,0.004614,0.05,3.9572e+05,0.2258 -20000,0.46996,0.004614,0.05,3.9572e+05,0.2258 -20000,0.47926,0.0047053,0.05,3.8568e+05,0.18209 -20000,0.47926,0.0047053,0.05,3.8568e+05,0.18209 -20000,0.47926,0.0047053,0.05,3.8568e+05,0.18209 -20000,0.47926,0.0047053,0.05,3.8568e+05,0.18209 -20000,0.47926,0.0047053,0.05,3.8568e+05,0.18209 -20000,0.47926,0.0047053,0.05,3.8568e+05,0.18209 -20000,0.47926,0.0047053,0.05,3.8568e+05,0.18209 -20000,0.47926,0.0047053,0.05,3.8568e+05,0.18209 -20000,0.47926,0.0047053,0.05,3.8568e+05,0.18209 -20000,0.48875,0.0047985,0.05,3.7556e+05,0.14582 -20000,0.48875,0.0047985,0.05,3.7556e+05,0.14582 -20000,0.48875,0.0047985,0.05,3.7556e+05,0.14582 -20000,0.48875,0.0047985,0.05,3.7556e+05,0.14582 -20000,0.48875,0.0047985,0.05,3.7556e+05,0.14582 -20000,0.48875,0.0047985,0.05,3.7556e+05,0.14582 -20000,0.48875,0.0047985,0.05,3.7556e+05,0.14582 -20000,0.48875,0.0047985,0.05,3.7556e+05,0.14582 -20000,0.48875,0.0047985,0.05,3.7556e+05,0.14582 -20000,0.48875,0.0047985,0.05,3.7556e+05,0.14582 -20000,0.49843,0.0048935,0.05,3.6538e+05,0.11594 -20000,0.49843,0.0048935,0.05,3.6538e+05,0.11594 -20000,0.49843,0.0048935,0.05,3.6538e+05,0.11594 -20000,0.49843,0.0048935,0.05,3.6538e+05,0.11594 -20000,0.49843,0.0048935,0.05,3.6538e+05,0.11594 -20000,0.49843,0.0048935,0.05,3.6538e+05,0.11594 -20000,0.49843,0.0048935,0.05,3.6538e+05,0.11594 -20000,0.49843,0.0048935,0.05,3.6538e+05,0.11594 -20000,0.49843,0.0048935,0.05,3.6538e+05,0.11594 -20000,0.49843,0.0048935,0.05,3.6538e+05,0.11594 -20000,0.5083,0.0049903,0.05,3.5513e+05,0.091499 -20000,0.5083,0.0049903,0.05,3.5513e+05,0.091499 -20000,0.5083,0.0049903,0.05,3.5513e+05,0.091499 -20000,0.5083,0.0049903,0.05,3.5513e+05,0.091499 -20000,0.5083,0.0049903,0.05,3.5513e+05,0.091499 -20000,0.5083,0.0049903,0.05,3.5513e+05,0.091499 -20000,0.5083,0.0049903,0.05,3.5513e+05,0.091499 -20000,0.5083,0.0049903,0.05,3.5513e+05,0.091499 -20000,0.5083,0.0049903,0.05,3.5513e+05,0.091499 -20000,0.5083,0.0049903,0.05,3.5513e+05,0.091499 -20000,0.51836,0.0050891,0.05,3.4484e+05,0.071665 -20000,0.51836,0.0050891,0.05,3.4484e+05,0.071665 -20000,0.51836,0.0050891,0.05,3.4484e+05,0.071665 -20000,0.51836,0.0050891,0.05,3.4484e+05,0.071665 -20000,0.51836,0.0050891,0.05,3.4484e+05,0.071665 -20000,0.51836,0.0050891,0.05,3.4484e+05,0.071665 -20000,0.51836,0.0050891,0.05,3.4484e+05,0.071665 -20000,0.51836,0.0050891,0.05,3.4484e+05,0.071665 -20000,0.51836,0.0050891,0.05,3.4484e+05,0.071665 -20000,0.51836,0.0050891,0.05,3.4484e+05,0.071665 -20000,0.52862,0.0051899,0.05,3.3451e+05,0.055694 -20000,0.52862,0.0051899,0.05,3.3451e+05,0.055694 -20000,0.52862,0.0051899,0.05,3.3451e+05,0.055694 -20000,0.52862,0.0051899,0.05,3.3451e+05,0.055694 -20000,0.52862,0.0051899,0.05,3.3451e+05,0.055694 -20000,0.52862,0.0051899,0.05,3.3451e+05,0.055694 -20000,0.52862,0.0051899,0.05,3.3451e+05,0.055694 -20000,0.52862,0.0051899,0.05,3.3451e+05,0.055694 -20000,0.52862,0.0051899,0.05,3.3451e+05,0.055694 -20000,0.52862,0.0051899,0.05,3.3451e+05,0.055694 -20000,0.53909,0.0052927,0.05,3.2416e+05,0.042935 -20000,0.53909,0.0052927,0.05,3.2416e+05,0.042935 -20000,0.53909,0.0052927,0.05,3.2416e+05,0.042935 -20000,0.53909,0.0052927,0.05,3.2416e+05,0.042935 -20000,0.53909,0.0052927,0.05,3.2416e+05,0.042935 -20000,0.53909,0.0052927,0.05,3.2416e+05,0.042935 -20000,0.53909,0.0052927,0.05,3.2416e+05,0.042935 -20000,0.53909,0.0052927,0.05,3.2416e+05,0.042935 -20000,0.53909,0.0052927,0.05,3.2416e+05,0.042935 -20000,0.53909,0.0052927,0.05,3.2416e+05,0.042935 -20000,0.53909,0.0052927,0.05,3.2416e+05,0.042935 -20000,0.54976,0.0053975,0.05,3.1378e+05,0.032828 -20000,0.54976,0.0053975,0.05,3.1378e+05,0.032828 -20000,0.54976,0.0053975,0.05,3.1378e+05,0.032828 -20000,0.54976,0.0053975,0.05,3.1378e+05,0.032828 -20000,0.54976,0.0053975,0.05,3.1378e+05,0.032828 -20000,0.54976,0.0053975,0.05,3.1378e+05,0.032828 -20000,0.54976,0.0053975,0.05,3.1378e+05,0.032828 -20000,0.54976,0.0053975,0.05,3.1378e+05,0.032828 -20000,0.54976,0.0053975,0.05,3.1378e+05,0.032828 -20000,0.54976,0.0053975,0.05,3.1378e+05,0.032828 -20000,0.54976,0.0053975,0.05,3.1378e+05,0.032828 -20000,0.56065,0.0055043,0.05,3.0338e+05,0.024888 -20000,0.56065,0.0055043,0.05,3.0338e+05,0.024888 -20000,0.56065,0.0055043,0.05,3.0338e+05,0.024888 -20000,0.56065,0.0055043,0.05,3.0338e+05,0.024888 -20000,0.56065,0.0055043,0.05,3.0338e+05,0.024888 -20000,0.56065,0.0055043,0.05,3.0338e+05,0.024888 -20000,0.56065,0.0055043,0.05,3.0338e+05,0.024888 -20000,0.56065,0.0055043,0.05,3.0338e+05,0.024888 -20000,0.56065,0.0055043,0.05,3.0338e+05,0.024888 -20000,0.56065,0.0055043,0.05,3.0338e+05,0.024888 -20000,0.56065,0.0055043,0.05,3.0338e+05,0.024888 -20000,0.57175,0.0056133,0.05,2.9298e+05,0.018705 -20000,0.57175,0.0056133,0.05,2.9298e+05,0.018705 -20000,0.57175,0.0056133,0.05,2.9298e+05,0.018705 -20000,0.57175,0.0056133,0.05,2.9298e+05,0.018705 -20000,0.57175,0.0056133,0.05,2.9298e+05,0.018705 -20000,0.57175,0.0056133,0.05,2.9298e+05,0.018705 -20000,0.57175,0.0056133,0.05,2.9298e+05,0.018705 -20000,0.57175,0.0056133,0.05,2.9298e+05,0.018705 -20000,0.57175,0.0056133,0.05,2.9298e+05,0.018705 -20000,0.57175,0.0056133,0.05,2.9298e+05,0.018705 -20000,0.57175,0.0056133,0.05,2.9298e+05,0.018705 -20000,0.58307,0.0057245,0.05,2.8257e+05,0.013933 -20000,0.58307,0.0057245,0.05,2.8257e+05,0.013933 -20000,0.58307,0.0057245,0.05,2.8257e+05,0.013933 -20000,0.58307,0.0057245,0.05,2.8257e+05,0.013933 -20000,0.58307,0.0057245,0.05,2.8257e+05,0.013933 -20000,0.58307,0.0057245,0.05,2.8257e+05,0.013933 -20000,0.58307,0.0057245,0.05,2.8257e+05,0.013933 -20000,0.58307,0.0057245,0.05,2.8257e+05,0.013933 -20000,0.58307,0.0057245,0.05,2.8257e+05,0.013933 -20000,0.58307,0.0057245,0.05,2.8257e+05,0.013933 -20000,0.58307,0.0057245,0.05,2.8257e+05,0.013933 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.59462,0.0058378,0.05,2.7216e+05,0.010284 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.60639,0.0059535,0.05,2.6175e+05,0.0075198 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.6184,0.0060714,0.05,2.5134e+05,0.0054458 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.63065,0.0061916,0.05,2.4094e+05,0.003905 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.64314,0.0063142,0.05,2.3055e+05,0.0027719 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.65588,0.0064393,0.05,2.2018e+05,0.0019473 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.66887,0.0065668,0.05,2.0981e+05,0.0013535 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.68211,0.0066969,0.05,1.9945e+05,0.00093059 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.69562,0.0068295,0.05,1.8911e+05,0.00063272 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.7094,0.0069648,0.05,1.7878e+05,0.00042531 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.72345,0.0071027,0.05,1.6846e+05,0.00028257 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.73778,0.0072434,0.05,1.5816e+05,0.0001855 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7524,0.0073869,0.05,1.4787e+05,0.0001203 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7673,0.0075332,0.05,1.3759e+05,7.704e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.7825,0.0076824,0.05,1.2733e+05,4.871e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.798,0.0078346,0.05,1.1708e+05,3.0398e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.81381,0.0079898,0.05,1.0684e+05,1.8717e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.82993,0.0081481,0.05,96621,1.1369e-05 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.84637,0.0083095,0.05,86409,6.809e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.86314,0.0084741,0.05,76208,4.02e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.88024,0.008642,0.05,66018,2.3386e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.89767,0.0088132,0.05,55836,1.3395e-06 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.91546,0.0089878,0.05,45663,7.542e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.93359,0.0091658,0.05,35497,4.1541e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.95209,0.0093474,0.05,25337,2.2017e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.97095,0.0095326,0.05,15180,1.0526e-07 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,0.99019,0.0097215,0.05,5026.7,3.0759e-08 -20000,nan,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_5.csv b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_5.csv deleted file mode 100644 index 00f866b98e9..00000000000 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/pureThermalDiffusion/data_5.csv +++ /dev/null @@ -1,1002 +0,0 @@ -Time,"elementCenter:0","elementCenter:1","elementCenter:2","pressure","temperature" -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,nan,nan,nan,nan,nan -50000,0.10099,0.0009915,0.05,4623.8,99.199 -50000,0.10099,0.0009915,0.05,4623.8,99.199 -50000,0.10299,0.0010111,0.05,13685,97.628 -50000,0.10299,0.0010111,0.05,13685,97.628 -50000,0.10499,0.0010308,0.05,22567,96.087 -50000,0.10499,0.0010308,0.05,22567,96.087 -50000,0.10734,0.0010538,0.05,32796,94.311 -50000,0.10734,0.0010538,0.05,32796,94.311 -50000,0.10734,0.0010538,0.05,32796,94.311 -50000,0.11004,0.0010803,0.05,44244,92.322 -50000,0.11004,0.0010803,0.05,44244,92.322 -50000,0.11004,0.0010803,0.05,44244,92.322 -50000,0.11274,0.0011068,0.05,55397,90.382 -50000,0.11274,0.0011068,0.05,55397,90.382 -50000,0.11274,0.0011068,0.05,55397,90.382 -50000,0.11544,0.0011334,0.05,66268,88.489 -50000,0.11544,0.0011334,0.05,66268,88.489 -50000,0.11814,0.0011599,0.05,76867,86.641 -50000,0.11814,0.0011599,0.05,76867,86.641 -50000,0.11814,0.0011599,0.05,76867,86.641 -50000,0.12084,0.0011864,0.05,87204,84.836 -50000,0.12084,0.0011864,0.05,87204,84.836 -50000,0.12084,0.0011864,0.05,87204,84.836 -50000,0.12354,0.0012129,0.05,97287,83.072 -50000,0.12354,0.0012129,0.05,97287,83.072 -50000,0.12624,0.0012394,0.05,1.0713e+05,81.348 -50000,0.12624,0.0012394,0.05,1.0713e+05,81.348 -50000,0.12624,0.0012394,0.05,1.0713e+05,81.348 -50000,0.12894,0.0012659,0.05,1.1673e+05,79.663 -50000,0.12894,0.0012659,0.05,1.1673e+05,79.663 -50000,0.12894,0.0012659,0.05,1.1673e+05,79.663 -50000,0.13164,0.0012924,0.05,1.261e+05,78.015 -50000,0.13164,0.0012924,0.05,1.261e+05,78.015 -50000,0.1343,0.0013185,0.05,1.3512e+05,76.425 -50000,0.1343,0.0013185,0.05,1.3512e+05,76.425 -50000,0.1343,0.0013185,0.05,1.3512e+05,76.425 -50000,0.13695,0.0013445,0.05,1.4388e+05,74.877 -50000,0.13695,0.0013445,0.05,1.4388e+05,74.877 -50000,0.13695,0.0013445,0.05,1.4388e+05,74.877 -50000,0.13965,0.001371,0.05,1.5262e+05,73.33 -50000,0.13965,0.001371,0.05,1.5262e+05,73.33 -50000,0.13965,0.001371,0.05,1.5262e+05,73.33 -50000,0.1424,0.0013981,0.05,1.6131e+05,71.786 -50000,0.1424,0.0013981,0.05,1.6131e+05,71.786 -50000,0.14521,0.0014256,0.05,1.6997e+05,70.246 -50000,0.14521,0.0014256,0.05,1.6997e+05,70.246 -50000,0.14521,0.0014256,0.05,1.6997e+05,70.246 -50000,0.14807,0.0014538,0.05,1.7857e+05,68.708 -50000,0.14807,0.0014538,0.05,1.7857e+05,68.708 -50000,0.14807,0.0014538,0.05,1.7857e+05,68.708 -50000,0.151,0.0014824,0.05,1.8713e+05,67.174 -50000,0.151,0.0014824,0.05,1.8713e+05,67.174 -50000,0.151,0.0014824,0.05,1.8713e+05,67.174 -50000,0.15397,0.0015117,0.05,1.9564e+05,65.644 -50000,0.15397,0.0015117,0.05,1.9564e+05,65.644 -50000,0.15397,0.0015117,0.05,1.9564e+05,65.644 -50000,0.15701,0.0015415,0.05,2.0409e+05,64.118 -50000,0.15701,0.0015415,0.05,2.0409e+05,64.118 -50000,0.15701,0.0015415,0.05,2.0409e+05,64.118 -50000,0.16011,0.0015719,0.05,2.1248e+05,62.596 -50000,0.16011,0.0015719,0.05,2.1248e+05,62.596 -50000,0.16011,0.0015719,0.05,2.1248e+05,62.596 -50000,0.16327,0.001603,0.05,2.208e+05,61.08 -50000,0.16327,0.001603,0.05,2.208e+05,61.08 -50000,0.16327,0.001603,0.05,2.208e+05,61.08 -50000,0.16649,0.0016346,0.05,2.2905e+05,59.568 -50000,0.16649,0.0016346,0.05,2.2905e+05,59.568 -50000,0.16649,0.0016346,0.05,2.2905e+05,59.568 -50000,0.16649,0.0016346,0.05,2.2905e+05,59.568 -50000,0.16978,0.0016669,0.05,2.3723e+05,58.063 -50000,0.16978,0.0016669,0.05,2.3723e+05,58.063 -50000,0.16978,0.0016669,0.05,2.3723e+05,58.063 -50000,0.17313,0.0016998,0.05,2.4532e+05,56.564 -50000,0.17313,0.0016998,0.05,2.4532e+05,56.564 -50000,0.17313,0.0016998,0.05,2.4532e+05,56.564 -50000,0.17655,0.0017333,0.05,2.5332e+05,55.071 -50000,0.17655,0.0017333,0.05,2.5332e+05,55.071 -50000,0.17655,0.0017333,0.05,2.5332e+05,55.071 -50000,0.17655,0.0017333,0.05,2.5332e+05,55.071 -50000,0.18004,0.0017676,0.05,2.6124e+05,53.586 -50000,0.18004,0.0017676,0.05,2.6124e+05,53.586 -50000,0.18004,0.0017676,0.05,2.6124e+05,53.586 -50000,0.18359,0.0018025,0.05,2.6905e+05,52.108 -50000,0.18359,0.0018025,0.05,2.6905e+05,52.108 -50000,0.18359,0.0018025,0.05,2.6905e+05,52.108 -50000,0.18359,0.0018025,0.05,2.6905e+05,52.108 -50000,0.18722,0.001838,0.05,2.7676e+05,50.639 -50000,0.18722,0.001838,0.05,2.7676e+05,50.639 -50000,0.18722,0.001838,0.05,2.7676e+05,50.639 -50000,0.18722,0.001838,0.05,2.7676e+05,50.639 -50000,0.19091,0.0018743,0.05,2.8435e+05,49.178 -50000,0.19091,0.0018743,0.05,2.8435e+05,49.178 -50000,0.19091,0.0018743,0.05,2.8435e+05,49.178 -50000,0.19468,0.0019114,0.05,2.9183e+05,47.727 -50000,0.19468,0.0019114,0.05,2.9183e+05,47.727 -50000,0.19468,0.0019114,0.05,2.9183e+05,47.727 -50000,0.19468,0.0019114,0.05,2.9183e+05,47.727 -50000,0.19853,0.0019491,0.05,2.9918e+05,46.285 -50000,0.19853,0.0019491,0.05,2.9918e+05,46.285 -50000,0.19853,0.0019491,0.05,2.9918e+05,46.285 -50000,0.19853,0.0019491,0.05,2.9918e+05,46.285 -50000,0.20245,0.0019876,0.05,3.0639e+05,44.854 -50000,0.20245,0.0019876,0.05,3.0639e+05,44.854 -50000,0.20245,0.0019876,0.05,3.0639e+05,44.854 -50000,0.20245,0.0019876,0.05,3.0639e+05,44.854 -50000,0.20645,0.0020269,0.05,3.1347e+05,43.434 -50000,0.20645,0.0020269,0.05,3.1347e+05,43.434 -50000,0.20645,0.0020269,0.05,3.1347e+05,43.434 -50000,0.20645,0.0020269,0.05,3.1347e+05,43.434 -50000,0.21053,0.0020669,0.05,3.2039e+05,42.025 -50000,0.21053,0.0020669,0.05,3.2039e+05,42.025 -50000,0.21053,0.0020669,0.05,3.2039e+05,42.025 -50000,0.21053,0.0020669,0.05,3.2039e+05,42.025 -50000,0.21469,0.0021078,0.05,3.2716e+05,40.63 -50000,0.21469,0.0021078,0.05,3.2716e+05,40.63 -50000,0.21469,0.0021078,0.05,3.2716e+05,40.63 -50000,0.21469,0.0021078,0.05,3.2716e+05,40.63 -50000,0.21893,0.0021494,0.05,3.3376e+05,39.247 -50000,0.21893,0.0021494,0.05,3.3376e+05,39.247 -50000,0.21893,0.0021494,0.05,3.3376e+05,39.247 -50000,0.21893,0.0021494,0.05,3.3376e+05,39.247 -50000,0.21893,0.0021494,0.05,3.3376e+05,39.247 -50000,0.22326,0.0021919,0.05,3.4019e+05,37.878 -50000,0.22326,0.0021919,0.05,3.4019e+05,37.878 -50000,0.22326,0.0021919,0.05,3.4019e+05,37.878 -50000,0.22326,0.0021919,0.05,3.4019e+05,37.878 -50000,0.22767,0.0022352,0.05,3.4643e+05,36.524 -50000,0.22767,0.0022352,0.05,3.4643e+05,36.524 -50000,0.22767,0.0022352,0.05,3.4643e+05,36.524 -50000,0.22767,0.0022352,0.05,3.4643e+05,36.524 -50000,0.23217,0.0022794,0.05,3.5248e+05,35.185 -50000,0.23217,0.0022794,0.05,3.5248e+05,35.185 -50000,0.23217,0.0022794,0.05,3.5248e+05,35.185 -50000,0.23217,0.0022794,0.05,3.5248e+05,35.185 -50000,0.23217,0.0022794,0.05,3.5248e+05,35.185 -50000,0.23676,0.0023244,0.05,3.5832e+05,33.862 -50000,0.23676,0.0023244,0.05,3.5832e+05,33.862 -50000,0.23676,0.0023244,0.05,3.5832e+05,33.862 -50000,0.23676,0.0023244,0.05,3.5832e+05,33.862 -50000,0.23676,0.0023244,0.05,3.5832e+05,33.862 -50000,0.24144,0.0023704,0.05,3.6396e+05,32.556 -50000,0.24144,0.0023704,0.05,3.6396e+05,32.556 -50000,0.24144,0.0023704,0.05,3.6396e+05,32.556 -50000,0.24144,0.0023704,0.05,3.6396e+05,32.556 -50000,0.24621,0.0024172,0.05,3.6937e+05,31.267 -50000,0.24621,0.0024172,0.05,3.6937e+05,31.267 -50000,0.24621,0.0024172,0.05,3.6937e+05,31.267 -50000,0.24621,0.0024172,0.05,3.6937e+05,31.267 -50000,0.24621,0.0024172,0.05,3.6937e+05,31.267 -50000,0.25108,0.002465,0.05,3.7455e+05,29.997 -50000,0.25108,0.002465,0.05,3.7455e+05,29.997 -50000,0.25108,0.002465,0.05,3.7455e+05,29.997 -50000,0.25108,0.002465,0.05,3.7455e+05,29.997 -50000,0.25108,0.002465,0.05,3.7455e+05,29.997 -50000,0.25604,0.0025137,0.05,3.7949e+05,28.746 -50000,0.25604,0.0025137,0.05,3.7949e+05,28.746 -50000,0.25604,0.0025137,0.05,3.7949e+05,28.746 -50000,0.25604,0.0025137,0.05,3.7949e+05,28.746 -50000,0.25604,0.0025137,0.05,3.7949e+05,28.746 -50000,0.2611,0.0025634,0.05,3.8418e+05,27.516 -50000,0.2611,0.0025634,0.05,3.8418e+05,27.516 -50000,0.2611,0.0025634,0.05,3.8418e+05,27.516 -50000,0.2611,0.0025634,0.05,3.8418e+05,27.516 -50000,0.2611,0.0025634,0.05,3.8418e+05,27.516 -50000,0.26626,0.0026141,0.05,3.8861e+05,26.306 -50000,0.26626,0.0026141,0.05,3.8861e+05,26.306 -50000,0.26626,0.0026141,0.05,3.8861e+05,26.306 -50000,0.26626,0.0026141,0.05,3.8861e+05,26.306 -50000,0.26626,0.0026141,0.05,3.8861e+05,26.306 -50000,0.27153,0.0026658,0.05,3.9276e+05,25.118 -50000,0.27153,0.0026658,0.05,3.9276e+05,25.118 -50000,0.27153,0.0026658,0.05,3.9276e+05,25.118 -50000,0.27153,0.0026658,0.05,3.9276e+05,25.118 -50000,0.27153,0.0026658,0.05,3.9276e+05,25.118 -50000,0.27153,0.0026658,0.05,3.9276e+05,25.118 -50000,0.2769,0.0027185,0.05,3.9664e+05,23.952 -50000,0.2769,0.0027185,0.05,3.9664e+05,23.952 -50000,0.2769,0.0027185,0.05,3.9664e+05,23.952 -50000,0.2769,0.0027185,0.05,3.9664e+05,23.952 -50000,0.2769,0.0027185,0.05,3.9664e+05,23.952 -50000,0.28237,0.0027723,0.05,4.0022e+05,22.81 -50000,0.28237,0.0027723,0.05,4.0022e+05,22.81 -50000,0.28237,0.0027723,0.05,4.0022e+05,22.81 -50000,0.28237,0.0027723,0.05,4.0022e+05,22.81 -50000,0.28237,0.0027723,0.05,4.0022e+05,22.81 -50000,0.28237,0.0027723,0.05,4.0022e+05,22.81 -50000,0.28796,0.0028271,0.05,4.035e+05,21.692 -50000,0.28796,0.0028271,0.05,4.035e+05,21.692 -50000,0.28796,0.0028271,0.05,4.035e+05,21.692 -50000,0.28796,0.0028271,0.05,4.035e+05,21.692 -50000,0.28796,0.0028271,0.05,4.035e+05,21.692 -50000,0.29365,0.002883,0.05,4.0648e+05,20.599 -50000,0.29365,0.002883,0.05,4.0648e+05,20.599 -50000,0.29365,0.002883,0.05,4.0648e+05,20.599 -50000,0.29365,0.002883,0.05,4.0648e+05,20.599 -50000,0.29365,0.002883,0.05,4.0648e+05,20.599 -50000,0.29365,0.002883,0.05,4.0648e+05,20.599 -50000,0.29946,0.00294,0.05,4.0913e+05,19.532 -50000,0.29946,0.00294,0.05,4.0913e+05,19.532 -50000,0.29946,0.00294,0.05,4.0913e+05,19.532 -50000,0.29946,0.00294,0.05,4.0913e+05,19.532 -50000,0.29946,0.00294,0.05,4.0913e+05,19.532 -50000,0.29946,0.00294,0.05,4.0913e+05,19.532 -50000,0.30538,0.0029982,0.05,4.1145e+05,18.491 -50000,0.30538,0.0029982,0.05,4.1145e+05,18.491 -50000,0.30538,0.0029982,0.05,4.1145e+05,18.491 -50000,0.30538,0.0029982,0.05,4.1145e+05,18.491 -50000,0.30538,0.0029982,0.05,4.1145e+05,18.491 -50000,0.30538,0.0029982,0.05,4.1145e+05,18.491 -50000,0.31142,0.0030575,0.05,4.1343e+05,17.477 -50000,0.31142,0.0030575,0.05,4.1343e+05,17.477 -50000,0.31142,0.0030575,0.05,4.1343e+05,17.477 -50000,0.31142,0.0030575,0.05,4.1343e+05,17.477 -50000,0.31142,0.0030575,0.05,4.1343e+05,17.477 -50000,0.31142,0.0030575,0.05,4.1343e+05,17.477 -50000,0.31758,0.003118,0.05,4.1507e+05,16.491 -50000,0.31758,0.003118,0.05,4.1507e+05,16.491 -50000,0.31758,0.003118,0.05,4.1507e+05,16.491 -50000,0.31758,0.003118,0.05,4.1507e+05,16.491 -50000,0.31758,0.003118,0.05,4.1507e+05,16.491 -50000,0.31758,0.003118,0.05,4.1507e+05,16.491 -50000,0.32386,0.0031796,0.05,4.1635e+05,15.534 -50000,0.32386,0.0031796,0.05,4.1635e+05,15.534 -50000,0.32386,0.0031796,0.05,4.1635e+05,15.534 -50000,0.32386,0.0031796,0.05,4.1635e+05,15.534 -50000,0.32386,0.0031796,0.05,4.1635e+05,15.534 -50000,0.32386,0.0031796,0.05,4.1635e+05,15.534 -50000,0.32386,0.0031796,0.05,4.1635e+05,15.534 -50000,0.33027,0.0032425,0.05,4.1727e+05,14.605 -50000,0.33027,0.0032425,0.05,4.1727e+05,14.605 -50000,0.33027,0.0032425,0.05,4.1727e+05,14.605 -50000,0.33027,0.0032425,0.05,4.1727e+05,14.605 -50000,0.33027,0.0032425,0.05,4.1727e+05,14.605 -50000,0.33027,0.0032425,0.05,4.1727e+05,14.605 -50000,0.3368,0.0033067,0.05,4.1782e+05,13.707 -50000,0.3368,0.0033067,0.05,4.1782e+05,13.707 -50000,0.3368,0.0033067,0.05,4.1782e+05,13.707 -50000,0.3368,0.0033067,0.05,4.1782e+05,13.707 -50000,0.3368,0.0033067,0.05,4.1782e+05,13.707 -50000,0.3368,0.0033067,0.05,4.1782e+05,13.707 -50000,0.3368,0.0033067,0.05,4.1782e+05,13.707 -50000,0.34347,0.0033721,0.05,4.1799e+05,12.839 -50000,0.34347,0.0033721,0.05,4.1799e+05,12.839 -50000,0.34347,0.0033721,0.05,4.1799e+05,12.839 -50000,0.34347,0.0033721,0.05,4.1799e+05,12.839 -50000,0.34347,0.0033721,0.05,4.1799e+05,12.839 -50000,0.34347,0.0033721,0.05,4.1799e+05,12.839 -50000,0.35026,0.0034388,0.05,4.1778e+05,12.002 -50000,0.35026,0.0034388,0.05,4.1778e+05,12.002 -50000,0.35026,0.0034388,0.05,4.1778e+05,12.002 -50000,0.35026,0.0034388,0.05,4.1778e+05,12.002 -50000,0.35026,0.0034388,0.05,4.1778e+05,12.002 -50000,0.35026,0.0034388,0.05,4.1778e+05,12.002 -50000,0.35026,0.0034388,0.05,4.1778e+05,12.002 -50000,0.35719,0.0035069,0.05,4.1719e+05,11.195 -50000,0.35719,0.0035069,0.05,4.1719e+05,11.195 -50000,0.35719,0.0035069,0.05,4.1719e+05,11.195 -50000,0.35719,0.0035069,0.05,4.1719e+05,11.195 -50000,0.35719,0.0035069,0.05,4.1719e+05,11.195 -50000,0.35719,0.0035069,0.05,4.1719e+05,11.195 -50000,0.35719,0.0035069,0.05,4.1719e+05,11.195 -50000,0.36426,0.0035762,0.05,4.162e+05,10.421 -50000,0.36426,0.0035762,0.05,4.162e+05,10.421 -50000,0.36426,0.0035762,0.05,4.162e+05,10.421 -50000,0.36426,0.0035762,0.05,4.162e+05,10.421 -50000,0.36426,0.0035762,0.05,4.162e+05,10.421 -50000,0.36426,0.0035762,0.05,4.162e+05,10.421 -50000,0.36426,0.0035762,0.05,4.162e+05,10.421 -50000,0.37147,0.003647,0.05,4.1482e+05,9.6778 -50000,0.37147,0.003647,0.05,4.1482e+05,9.6778 -50000,0.37147,0.003647,0.05,4.1482e+05,9.6778 -50000,0.37147,0.003647,0.05,4.1482e+05,9.6778 -50000,0.37147,0.003647,0.05,4.1482e+05,9.6778 -50000,0.37147,0.003647,0.05,4.1482e+05,9.6778 -50000,0.37147,0.003647,0.05,4.1482e+05,9.6778 -50000,0.37147,0.003647,0.05,4.1482e+05,9.6778 -50000,0.37882,0.0037192,0.05,4.1305e+05,8.9668 -50000,0.37882,0.0037192,0.05,4.1305e+05,8.9668 -50000,0.37882,0.0037192,0.05,4.1305e+05,8.9668 -50000,0.37882,0.0037192,0.05,4.1305e+05,8.9668 -50000,0.37882,0.0037192,0.05,4.1305e+05,8.9668 -50000,0.37882,0.0037192,0.05,4.1305e+05,8.9668 -50000,0.37882,0.0037192,0.05,4.1305e+05,8.9668 -50000,0.38632,0.0037928,0.05,4.1087e+05,8.288 -50000,0.38632,0.0037928,0.05,4.1087e+05,8.288 -50000,0.38632,0.0037928,0.05,4.1087e+05,8.288 -50000,0.38632,0.0037928,0.05,4.1087e+05,8.288 -50000,0.38632,0.0037928,0.05,4.1087e+05,8.288 -50000,0.38632,0.0037928,0.05,4.1087e+05,8.288 -50000,0.38632,0.0037928,0.05,4.1087e+05,8.288 -50000,0.38632,0.0037928,0.05,4.1087e+05,8.288 -50000,0.39396,0.0038678,0.05,4.083e+05,7.6412 -50000,0.39396,0.0038678,0.05,4.083e+05,7.6412 -50000,0.39396,0.0038678,0.05,4.083e+05,7.6412 -50000,0.39396,0.0038678,0.05,4.083e+05,7.6412 -50000,0.39396,0.0038678,0.05,4.083e+05,7.6412 -50000,0.39396,0.0038678,0.05,4.083e+05,7.6412 -50000,0.39396,0.0038678,0.05,4.083e+05,7.6412 -50000,0.40176,0.0039444,0.05,4.0533e+05,7.0266 -50000,0.40176,0.0039444,0.05,4.0533e+05,7.0266 -50000,0.40176,0.0039444,0.05,4.0533e+05,7.0266 -50000,0.40176,0.0039444,0.05,4.0533e+05,7.0266 -50000,0.40176,0.0039444,0.05,4.0533e+05,7.0266 -50000,0.40176,0.0039444,0.05,4.0533e+05,7.0266 -50000,0.40176,0.0039444,0.05,4.0533e+05,7.0266 -50000,0.40176,0.0039444,0.05,4.0533e+05,7.0266 -50000,0.40971,0.0040224,0.05,4.0196e+05,6.4439 -50000,0.40971,0.0040224,0.05,4.0196e+05,6.4439 -50000,0.40971,0.0040224,0.05,4.0196e+05,6.4439 -50000,0.40971,0.0040224,0.05,4.0196e+05,6.4439 -50000,0.40971,0.0040224,0.05,4.0196e+05,6.4439 -50000,0.40971,0.0040224,0.05,4.0196e+05,6.4439 -50000,0.40971,0.0040224,0.05,4.0196e+05,6.4439 -50000,0.40971,0.0040224,0.05,4.0196e+05,6.4439 -50000,0.41782,0.004102,0.05,3.982e+05,5.8929 -50000,0.41782,0.004102,0.05,3.982e+05,5.8929 -50000,0.41782,0.004102,0.05,3.982e+05,5.8929 -50000,0.41782,0.004102,0.05,3.982e+05,5.8929 -50000,0.41782,0.004102,0.05,3.982e+05,5.8929 -50000,0.41782,0.004102,0.05,3.982e+05,5.8929 -50000,0.41782,0.004102,0.05,3.982e+05,5.8929 -50000,0.41782,0.004102,0.05,3.982e+05,5.8929 -50000,0.42609,0.0041832,0.05,3.9405e+05,5.3733 -50000,0.42609,0.0041832,0.05,3.9405e+05,5.3733 -50000,0.42609,0.0041832,0.05,3.9405e+05,5.3733 -50000,0.42609,0.0041832,0.05,3.9405e+05,5.3733 -50000,0.42609,0.0041832,0.05,3.9405e+05,5.3733 -50000,0.42609,0.0041832,0.05,3.9405e+05,5.3733 -50000,0.42609,0.0041832,0.05,3.9405e+05,5.3733 -50000,0.42609,0.0041832,0.05,3.9405e+05,5.3733 -50000,0.42609,0.0041832,0.05,3.9405e+05,5.3733 -50000,0.43452,0.004266,0.05,3.8951e+05,4.8847 -50000,0.43452,0.004266,0.05,3.8951e+05,4.8847 -50000,0.43452,0.004266,0.05,3.8951e+05,4.8847 -50000,0.43452,0.004266,0.05,3.8951e+05,4.8847 -50000,0.43452,0.004266,0.05,3.8951e+05,4.8847 -50000,0.43452,0.004266,0.05,3.8951e+05,4.8847 -50000,0.43452,0.004266,0.05,3.8951e+05,4.8847 -50000,0.43452,0.004266,0.05,3.8951e+05,4.8847 -50000,0.44312,0.0043505,0.05,3.846e+05,4.4267 -50000,0.44312,0.0043505,0.05,3.846e+05,4.4267 -50000,0.44312,0.0043505,0.05,3.846e+05,4.4267 -50000,0.44312,0.0043505,0.05,3.846e+05,4.4267 -50000,0.44312,0.0043505,0.05,3.846e+05,4.4267 -50000,0.44312,0.0043505,0.05,3.846e+05,4.4267 -50000,0.44312,0.0043505,0.05,3.846e+05,4.4267 -50000,0.44312,0.0043505,0.05,3.846e+05,4.4267 -50000,0.44312,0.0043505,0.05,3.846e+05,4.4267 -50000,0.45189,0.0044366,0.05,3.7932e+05,3.9985 -50000,0.45189,0.0044366,0.05,3.7932e+05,3.9985 -50000,0.45189,0.0044366,0.05,3.7932e+05,3.9985 -50000,0.45189,0.0044366,0.05,3.7932e+05,3.9985 -50000,0.45189,0.0044366,0.05,3.7932e+05,3.9985 -50000,0.45189,0.0044366,0.05,3.7932e+05,3.9985 -50000,0.45189,0.0044366,0.05,3.7932e+05,3.9985 -50000,0.45189,0.0044366,0.05,3.7932e+05,3.9985 -50000,0.45189,0.0044366,0.05,3.7932e+05,3.9985 -50000,0.46084,0.0045244,0.05,3.7368e+05,3.5995 -50000,0.46084,0.0045244,0.05,3.7368e+05,3.5995 -50000,0.46084,0.0045244,0.05,3.7368e+05,3.5995 -50000,0.46084,0.0045244,0.05,3.7368e+05,3.5995 -50000,0.46084,0.0045244,0.05,3.7368e+05,3.5995 -50000,0.46084,0.0045244,0.05,3.7368e+05,3.5995 -50000,0.46084,0.0045244,0.05,3.7368e+05,3.5995 -50000,0.46084,0.0045244,0.05,3.7368e+05,3.5995 -50000,0.46084,0.0045244,0.05,3.7368e+05,3.5995 -50000,0.46996,0.004614,0.05,3.6768e+05,3.2291 -50000,0.46996,0.004614,0.05,3.6768e+05,3.2291 -50000,0.46996,0.004614,0.05,3.6768e+05,3.2291 -50000,0.46996,0.004614,0.05,3.6768e+05,3.2291 -50000,0.46996,0.004614,0.05,3.6768e+05,3.2291 -50000,0.46996,0.004614,0.05,3.6768e+05,3.2291 -50000,0.46996,0.004614,0.05,3.6768e+05,3.2291 -50000,0.46996,0.004614,0.05,3.6768e+05,3.2291 -50000,0.46996,0.004614,0.05,3.6768e+05,3.2291 -50000,0.47926,0.0047053,0.05,3.6134e+05,2.8862 -50000,0.47926,0.0047053,0.05,3.6134e+05,2.8862 -50000,0.47926,0.0047053,0.05,3.6134e+05,2.8862 -50000,0.47926,0.0047053,0.05,3.6134e+05,2.8862 -50000,0.47926,0.0047053,0.05,3.6134e+05,2.8862 -50000,0.47926,0.0047053,0.05,3.6134e+05,2.8862 -50000,0.47926,0.0047053,0.05,3.6134e+05,2.8862 -50000,0.47926,0.0047053,0.05,3.6134e+05,2.8862 -50000,0.47926,0.0047053,0.05,3.6134e+05,2.8862 -50000,0.48875,0.0047985,0.05,3.5467e+05,2.57 -50000,0.48875,0.0047985,0.05,3.5467e+05,2.57 -50000,0.48875,0.0047985,0.05,3.5467e+05,2.57 -50000,0.48875,0.0047985,0.05,3.5467e+05,2.57 -50000,0.48875,0.0047985,0.05,3.5467e+05,2.57 -50000,0.48875,0.0047985,0.05,3.5467e+05,2.57 -50000,0.48875,0.0047985,0.05,3.5467e+05,2.57 -50000,0.48875,0.0047985,0.05,3.5467e+05,2.57 -50000,0.48875,0.0047985,0.05,3.5467e+05,2.57 -50000,0.48875,0.0047985,0.05,3.5467e+05,2.57 -50000,0.49843,0.0048935,0.05,3.4768e+05,2.2795 -50000,0.49843,0.0048935,0.05,3.4768e+05,2.2795 -50000,0.49843,0.0048935,0.05,3.4768e+05,2.2795 -50000,0.49843,0.0048935,0.05,3.4768e+05,2.2795 -50000,0.49843,0.0048935,0.05,3.4768e+05,2.2795 -50000,0.49843,0.0048935,0.05,3.4768e+05,2.2795 -50000,0.49843,0.0048935,0.05,3.4768e+05,2.2795 -50000,0.49843,0.0048935,0.05,3.4768e+05,2.2795 -50000,0.49843,0.0048935,0.05,3.4768e+05,2.2795 -50000,0.49843,0.0048935,0.05,3.4768e+05,2.2795 -50000,0.5083,0.0049903,0.05,3.4039e+05,2.0137 -50000,0.5083,0.0049903,0.05,3.4039e+05,2.0137 -50000,0.5083,0.0049903,0.05,3.4039e+05,2.0137 -50000,0.5083,0.0049903,0.05,3.4039e+05,2.0137 -50000,0.5083,0.0049903,0.05,3.4039e+05,2.0137 -50000,0.5083,0.0049903,0.05,3.4039e+05,2.0137 -50000,0.5083,0.0049903,0.05,3.4039e+05,2.0137 -50000,0.5083,0.0049903,0.05,3.4039e+05,2.0137 -50000,0.5083,0.0049903,0.05,3.4039e+05,2.0137 -50000,0.5083,0.0049903,0.05,3.4039e+05,2.0137 -50000,0.51836,0.0050891,0.05,3.328e+05,1.7714 -50000,0.51836,0.0050891,0.05,3.328e+05,1.7714 -50000,0.51836,0.0050891,0.05,3.328e+05,1.7714 -50000,0.51836,0.0050891,0.05,3.328e+05,1.7714 -50000,0.51836,0.0050891,0.05,3.328e+05,1.7714 -50000,0.51836,0.0050891,0.05,3.328e+05,1.7714 -50000,0.51836,0.0050891,0.05,3.328e+05,1.7714 -50000,0.51836,0.0050891,0.05,3.328e+05,1.7714 -50000,0.51836,0.0050891,0.05,3.328e+05,1.7714 -50000,0.51836,0.0050891,0.05,3.328e+05,1.7714 -50000,0.52862,0.0051899,0.05,3.2494e+05,1.5515 -50000,0.52862,0.0051899,0.05,3.2494e+05,1.5515 -50000,0.52862,0.0051899,0.05,3.2494e+05,1.5515 -50000,0.52862,0.0051899,0.05,3.2494e+05,1.5515 -50000,0.52862,0.0051899,0.05,3.2494e+05,1.5515 -50000,0.52862,0.0051899,0.05,3.2494e+05,1.5515 -50000,0.52862,0.0051899,0.05,3.2494e+05,1.5515 -50000,0.52862,0.0051899,0.05,3.2494e+05,1.5515 -50000,0.52862,0.0051899,0.05,3.2494e+05,1.5515 -50000,0.52862,0.0051899,0.05,3.2494e+05,1.5515 -50000,0.53909,0.0052927,0.05,3.1681e+05,1.3528 -50000,0.53909,0.0052927,0.05,3.1681e+05,1.3528 -50000,0.53909,0.0052927,0.05,3.1681e+05,1.3528 -50000,0.53909,0.0052927,0.05,3.1681e+05,1.3528 -50000,0.53909,0.0052927,0.05,3.1681e+05,1.3528 -50000,0.53909,0.0052927,0.05,3.1681e+05,1.3528 -50000,0.53909,0.0052927,0.05,3.1681e+05,1.3528 -50000,0.53909,0.0052927,0.05,3.1681e+05,1.3528 -50000,0.53909,0.0052927,0.05,3.1681e+05,1.3528 -50000,0.53909,0.0052927,0.05,3.1681e+05,1.3528 -50000,0.53909,0.0052927,0.05,3.1681e+05,1.3528 -50000,0.54976,0.0053975,0.05,3.0844e+05,1.174 -50000,0.54976,0.0053975,0.05,3.0844e+05,1.174 -50000,0.54976,0.0053975,0.05,3.0844e+05,1.174 -50000,0.54976,0.0053975,0.05,3.0844e+05,1.174 -50000,0.54976,0.0053975,0.05,3.0844e+05,1.174 -50000,0.54976,0.0053975,0.05,3.0844e+05,1.174 -50000,0.54976,0.0053975,0.05,3.0844e+05,1.174 -50000,0.54976,0.0053975,0.05,3.0844e+05,1.174 -50000,0.54976,0.0053975,0.05,3.0844e+05,1.174 -50000,0.54976,0.0053975,0.05,3.0844e+05,1.174 -50000,0.54976,0.0053975,0.05,3.0844e+05,1.174 -50000,0.56065,0.0055043,0.05,2.9983e+05,1.0139 -50000,0.56065,0.0055043,0.05,2.9983e+05,1.0139 -50000,0.56065,0.0055043,0.05,2.9983e+05,1.0139 -50000,0.56065,0.0055043,0.05,2.9983e+05,1.0139 -50000,0.56065,0.0055043,0.05,2.9983e+05,1.0139 -50000,0.56065,0.0055043,0.05,2.9983e+05,1.0139 -50000,0.56065,0.0055043,0.05,2.9983e+05,1.0139 -50000,0.56065,0.0055043,0.05,2.9983e+05,1.0139 -50000,0.56065,0.0055043,0.05,2.9983e+05,1.0139 -50000,0.56065,0.0055043,0.05,2.9983e+05,1.0139 -50000,0.56065,0.0055043,0.05,2.9983e+05,1.0139 -50000,0.57175,0.0056133,0.05,2.9101e+05,0.87123 -50000,0.57175,0.0056133,0.05,2.9101e+05,0.87123 -50000,0.57175,0.0056133,0.05,2.9101e+05,0.87123 -50000,0.57175,0.0056133,0.05,2.9101e+05,0.87123 -50000,0.57175,0.0056133,0.05,2.9101e+05,0.87123 -50000,0.57175,0.0056133,0.05,2.9101e+05,0.87123 -50000,0.57175,0.0056133,0.05,2.9101e+05,0.87123 -50000,0.57175,0.0056133,0.05,2.9101e+05,0.87123 -50000,0.57175,0.0056133,0.05,2.9101e+05,0.87123 -50000,0.57175,0.0056133,0.05,2.9101e+05,0.87123 -50000,0.57175,0.0056133,0.05,2.9101e+05,0.87123 -50000,0.58307,0.0057245,0.05,2.8199e+05,0.74476 -50000,0.58307,0.0057245,0.05,2.8199e+05,0.74476 -50000,0.58307,0.0057245,0.05,2.8199e+05,0.74476 -50000,0.58307,0.0057245,0.05,2.8199e+05,0.74476 -50000,0.58307,0.0057245,0.05,2.8199e+05,0.74476 -50000,0.58307,0.0057245,0.05,2.8199e+05,0.74476 -50000,0.58307,0.0057245,0.05,2.8199e+05,0.74476 -50000,0.58307,0.0057245,0.05,2.8199e+05,0.74476 -50000,0.58307,0.0057245,0.05,2.8199e+05,0.74476 -50000,0.58307,0.0057245,0.05,2.8199e+05,0.74476 -50000,0.58307,0.0057245,0.05,2.8199e+05,0.74476 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.59462,0.0058378,0.05,2.7279e+05,0.63322 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.60639,0.0059535,0.05,2.6341e+05,0.53539 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.6184,0.0060714,0.05,2.5388e+05,0.45006 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.63065,0.0061916,0.05,2.4421e+05,0.37607 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.64314,0.0063142,0.05,2.3441e+05,0.3123 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.65588,0.0064393,0.05,2.2449e+05,0.25768 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.66887,0.0065668,0.05,2.1448e+05,0.21121 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.68211,0.0066969,0.05,2.0438e+05,0.17193 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.69562,0.0068295,0.05,1.9419e+05,0.13897 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.7094,0.0069648,0.05,1.8394e+05,0.1115 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.72345,0.0071027,0.05,1.7363e+05,0.088788 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.73778,0.0072434,0.05,1.6327e+05,0.070147 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7524,0.0073869,0.05,1.5287e+05,0.054971 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7673,0.0075332,0.05,1.4243e+05,0.042717 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.7825,0.0076824,0.05,1.3196e+05,0.032908 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.798,0.0078346,0.05,1.2147e+05,0.025123 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.81381,0.0079898,0.05,1.1095e+05,0.019002 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.82993,0.0081481,0.05,1.0041e+05,0.014231 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.84637,0.0083095,0.05,89867,0.010549 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.86314,0.0084741,0.05,79309,0.0077325 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.88024,0.008642,0.05,68742,0.0055971 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.89767,0.0088132,0.05,58168,0.0039904 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.91546,0.0089878,0.05,47589,0.0027872 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.93359,0.0091658,0.05,37006,0.0018853 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.95209,0.0093474,0.05,26420,0.0012005 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.97095,0.0095326,0.05,15832,0.00066249 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,0.99019,0.0097215,0.05,5242.9,0.00020997 -50000,nan,nan,nan,nan,nan diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/analyticalResults.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/analyticalResults.py index c4ae5d7c182..938f88b0700 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/analyticalResults.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/analyticalResults.py @@ -34,12 +34,12 @@ def getDataFromXML(xmlFilePathPrefix): defaultShearModulus = float( tree.find('Constitutive/ElasticIsotropic').get('defaultShearModulus') ) defaultDrainedLinearTEC = float( tree.find('Constitutive/ElasticIsotropic').get('defaultDrainedLinearTEC') ) defaultReferencePorosity = float( tree.find('Constitutive/BiotPorosity').get('defaultReferencePorosity') ) - grainBulkModulus = float( tree.find('Constitutive/BiotPorosity').get('grainBulkModulus') ) + grainBulkModulus = float( tree.find('Constitutive/BiotPorosity').get('defaultGrainBulkModulus') ) fluidCompressibility = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('compressibility') ) fluidViscosity = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('defaultViscosity') ) fluidThermalExpansionCoefficient = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('thermalExpansionCoeff') ) - thermalConductivity = float( extractDataFromXMLList( tree.find('Constitutive/SinglePhaseConstantThermalConductivity').get('thermalConductivityComponents') )[0] ) - volumetricHeatCapacity = float( tree.find('Constitutive/SolidInternalEnergy').get('volumetricHeatCapacity') ) + thermalConductivity = float( extractDataFromXMLList( tree.find('Constitutive/SinglePhaseThermalConductivity').get('defaultThermalConductivityComponents') )[0] ) + volumetricHeatCapacity = float( tree.find('Constitutive/SolidInternalEnergy').get('referenceVolumetricHeatCapacity') ) permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) return [ri, Ti, drainedBulkModulusRock, defaultShearModulus, defaultDrainedLinearTEC, defaultReferencePorosity, grainBulkModulus, fluidCompressibility, fluidViscosity, fluidThermalExpansionCoefficient, permeability, thermalConductivity, volumetricHeatCapacity] From 6dd40e776556ec1235ba183e00796f2eedc035ac Mon Sep 17 00:00:00 2001 From: frankfeifan Date: Thu, 5 Sep 2024 13:08:25 -0700 Subject: [PATCH 181/286] fix: Fix restart issue when running HydroFracture cases. (#3302) --- .integrated_tests.yaml | 4 +-- BASELINE_NOTES.md | 5 +++- .../hydraulicFracturing/Hydrofracturing.ats | 26 +++++++++--------- .../kgdToughnessDominated_smoke.xml | 7 +++-- .../kgdViscosityDominated_smoke.xml | 12 ++++----- .../pennyShapedToughnessDominated_smoke.xml | 26 ++++++++++-------- .../pennyShapedViscosityDominated_smoke.xml | 27 +++++++++++-------- .../pknViscosityDominated_smoke.xml | 17 ++++++------ src/CMakeLists.txt | 4 +-- .../fileIO/Outputs/TimeHistoryOutput.cpp | 2 -- src/coreComponents/mesh/ObjectManagerBase.cpp | 10 +++++++ src/coreComponents/mesh/ObjectManagerBase.hpp | 6 +++++ 12 files changed, 86 insertions(+), 60 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 8da0056af21..cfecf5fb131 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,7 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3135-7235-53174a0 + baseline: integratedTests/baseline_integratedTests-pr3302-7289-4ec7c0d allow_fail: all: '' - streak: pennyShapedToughnessDominated_smoke_01,pennyShapedViscosityDominated_smoke_01,pknViscosityDominated_smoke_01,SeismicityRate_poromechanics_1d_smoke_01,SeismicityRate_poromechanics_1d_smoke_02 + streak: SeismicityRate_poromechanics_1d_smoke_01,SeismicityRate_poromechanics_1d_smoke_02 diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 48b90a0e986..82b360f8b34 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3302 (2024-09-05) +====================== +Added restartcheks to hydrofrac cases and reduced time of cases that were too long. + PR #3135 (2024-09-04) ====================== Temperature dependent single phase thermal conductivity. Rebaseline all thermal cases. @@ -20,7 +24,6 @@ PR #3300 (2024-08-28) ====================== Re-enable floating point exceptions. Rebaseline due to minor changing default value of maxRelativeCompDensChange from 1.7976931348623157e+308 to 1.7976931348623157e+208. - PR #3283 (2024-08-22) ====================== Reuse computeSinglePhaseFlux. Rebaseline due to minor numerical diffs. diff --git a/inputFiles/hydraulicFracturing/Hydrofracturing.ats b/inputFiles/hydraulicFracturing/Hydrofracturing.ats index c3ba4ef2533..aeae19dc8b5 100644 --- a/inputFiles/hydraulicFracturing/Hydrofracturing.ats +++ b/inputFiles/hydraulicFracturing/Hydrofracturing.ats @@ -6,9 +6,9 @@ kgd_viscosity_dominated = { "name": "kgdViscosityDominated_smoke", "description": "KGD fracture in viscosity-dominated regime", "partitions": ((1, 1, 1), (2, 3, 1)), - "restart_step": 0, - "check_step": 1, - "tolerance": [2.3e-5, 27000.0], + "restart_step": 4, + "check_step": 6, + "tolerance": [2.3e-5, 510000.0], "aperture_curve_method": "kgd_viscosity_dominated_aperture_curve", "pressure_curve_method": "kgd_viscosity_dominated_pressure_curve" } @@ -26,9 +26,9 @@ kgd_toughness_dominated = { "name": "kgdToughnessDominated_smoke", "description": "KGD fracture in toughness-dominated regime", "partitions": ((1, 1, 1), (2, 3, 1)), - "restart_step": 0, - "check_step": 1, - "tolerance": [1e-5, 21000.0], + "restart_step": 5, + "check_step": 9, + "tolerance": [1e-4, 40000.0], "aperture_curve_method": "kgd_toughness_dominated_aperture_curve", "pressure_curve_method": "kgd_toughness_dominated_pressure_curve" } @@ -80,9 +80,9 @@ penny_shaped_toughness_dominated = { "name": "pennyShapedToughnessDominated_smoke", "description": "Penny Shaped fracture in Toughness-dominated regime", "partitions": ((1, 1, 1), (1, 3, 2)), - "restart_step": 0, - "check_step": 5, - "tolerance": [3.4e-6, 1e5], + "restart_step": 5, + "check_step": 10, + "tolerance": [1e-5, 3e5], "aperture_curve_method": "penny_shaped_toughness_dominated_aperture_curve", "pressure_curve_method": "penny_shaped_toughness_dominated_pressure_curve" } @@ -100,8 +100,8 @@ penny_shaped_viscosity_dominated = { "name": "pennyShapedViscosityDominated_smoke", "description": "Penny Shaped fracture in Viscosity-dominated regime", "partitions": ((1, 1, 1), (1, 2, 2)), - "restart_step": 0, - "check_step": 5, + "restart_step": 5, + "check_step": 10, "tolerance": [2.7e-3, 3e6], "aperture_curve_method": "penny_shaped_viscosity_dominated_aperture_curve", "pressure_curve_method": "penny_shaped_viscosity_dominated_pressure_curve" @@ -120,8 +120,8 @@ pkn_viscosity_dominated = { "name": "pknViscosityDominated_smoke", "description": "PKN fracture in Viscosity-dominated regime", "partitions": ((1, 1, 1), (1, 2, 2)), - "restart_step": 0, - "check_step": 5, + "restart_step": 5, + "check_step": 10, "tolerance": [1.8e-5, 2e5], "aperture_curve_method": "pkn_viscosity_dominated_aperture_curve", "pressure_curve_method": "pkn_viscosity_dominated_pressure_curve" diff --git a/inputFiles/hydraulicFracturing/kgdToughnessDominated_smoke.xml b/inputFiles/hydraulicFracturing/kgdToughnessDominated_smoke.xml index b21bb677c40..26195e1f67a 100644 --- a/inputFiles/hydraulicFracturing/kgdToughnessDominated_smoke.xml +++ b/inputFiles/hydraulicFracturing/kgdToughnessDominated_smoke.xml @@ -38,7 +38,7 @@ + maxTime="10.0"> @@ -64,7 +64,7 @@ @@ -75,8 +75,7 @@ diff --git a/inputFiles/hydraulicFracturing/kgdViscosityDominated_smoke.xml b/inputFiles/hydraulicFracturing/kgdViscosityDominated_smoke.xml index 87c12c67c72..7ab3f2483c1 100644 --- a/inputFiles/hydraulicFracturing/kgdViscosityDominated_smoke.xml +++ b/inputFiles/hydraulicFracturing/kgdViscosityDominated_smoke.xml @@ -38,7 +38,7 @@ + maxTime="2.0"> @@ -52,21 +52,21 @@ diff --git a/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_smoke.xml b/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_smoke.xml index 795ecf85933..f433335ab6e 100644 --- a/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_smoke.xml +++ b/inputFiles/hydraulicFracturing/pennyShapedToughnessDominated_smoke.xml @@ -51,12 +51,12 @@ + maxTime="1.0" + maxCycle="10"> @@ -93,17 +94,20 @@ @@ -113,7 +117,7 @@ diff --git a/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_smoke.xml b/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_smoke.xml index 15b93eea743..4b20bae5125 100644 --- a/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_smoke.xml +++ b/inputFiles/hydraulicFracturing/pennyShapedViscosityDominated_smoke.xml @@ -51,12 +51,12 @@ + maxTime="1.0" + maxCycle="10"> @@ -93,17 +94,21 @@ @@ -113,7 +118,7 @@ diff --git a/inputFiles/hydraulicFracturing/pknViscosityDominated_smoke.xml b/inputFiles/hydraulicFracturing/pknViscosityDominated_smoke.xml index 9fc2afc127b..0545171c3bc 100644 --- a/inputFiles/hydraulicFracturing/pknViscosityDominated_smoke.xml +++ b/inputFiles/hydraulicFracturing/pknViscosityDominated_smoke.xml @@ -51,12 +51,12 @@ + maxTime="4" + maxCycle="10"> @@ -107,13 +108,13 @@ targetExactTimestep="0" target="/Outputs/curveOutput"/> - + target="/Outputs/vtkOutput"/> --> diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2a5843f2a12..f8c8dd57401 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -222,8 +222,8 @@ install( FILES ${CMAKE_BINARY_DIR}/schema.xsd ################################ # Add python environment setup ################################ -# message(WARNING "Temporarily changing the geosPythonBranch to feature/packaging") -# set(GEOS_PYTHON_PACKAGES_BRANCH "feature/packaging" CACHE STRING "" FORCE) +# message(WARNING "Temporarily changing the geosPythonBranch to bugfix/sherman/fixNumpyProd") +# set(GEOS_PYTHON_PACKAGES_BRANCH "bugfix/sherman/fixNumpyProd" CACHE STRING "" FORCE) if ( Python3_EXECUTABLE ) diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index 1eec41fff7c..d01edac3dcf 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -61,8 +61,6 @@ TimeHistoryOutput::TimeHistoryOutput( string const & name, void TimeHistoryOutput::initCollectorParallel( DomainPartition const & domain, HistoryCollection & collector ) { - GEOS_ASSERT( m_io.empty() ); - bool const freshInit = ( m_recordCount == 0 ); string const outputDirectory = getOutputDirectory(); diff --git a/src/coreComponents/mesh/ObjectManagerBase.cpp b/src/coreComponents/mesh/ObjectManagerBase.cpp index f2933ccd0b9..aaa209044cf 100644 --- a/src/coreComponents/mesh/ObjectManagerBase.cpp +++ b/src/coreComponents/mesh/ObjectManagerBase.cpp @@ -56,6 +56,16 @@ ObjectManagerBase::ObjectManagerBase( string const & name, registerWrapper< array1d< integer > >( viewKeyStruct::domainBoundaryIndicatorString(), &m_domainBoundaryIndicator ); + registerWrapper( viewKeyStruct::localMaxGlobalIndexString(), &m_localMaxGlobalIndex ). + setApplyDefaultValue( -1 ). + setRestartFlags( RestartFlags::WRITE_AND_READ ). + setPlotLevel( PlotLevel::NOPLOT ); + + registerWrapper( viewKeyStruct::maxGlobalIndexString(), &m_maxGlobalIndex ). + setApplyDefaultValue( -1 ). + setRestartFlags( RestartFlags::WRITE_AND_READ ). + setPlotLevel( PlotLevel::NOPLOT ); + m_sets.registerWrapper< SortedArray< localIndex > >( this->m_ObjectManagerBaseViewKeys.externalSet ); excludeWrappersFromPacking( { viewKeyStruct::localToGlobalMapString(), diff --git a/src/coreComponents/mesh/ObjectManagerBase.hpp b/src/coreComponents/mesh/ObjectManagerBase.hpp index a6550a53eed..1cc67026b84 100644 --- a/src/coreComponents/mesh/ObjectManagerBase.hpp +++ b/src/coreComponents/mesh/ObjectManagerBase.hpp @@ -685,6 +685,12 @@ class ObjectManagerBase : public dataRepository::Group /// @return String key to the local->global map static constexpr char const * localToGlobalMapString() { return "localToGlobalMap"; } + /// @return String key for m_localMaxGlobalIndexString + static constexpr char const * localMaxGlobalIndexString() { return "localMaxGlobalIndex"; } + + /// @return String key for m_maxGlobalIndexString + static constexpr char const * maxGlobalIndexString() { return "maxGlobalIndex"; } + /// View key to external set dataRepository::ViewKey externalSet = { externalSetString() }; From bf9e5ecd8038a8ad522608e2154307ea268a3441 Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Thu, 5 Sep 2024 18:26:34 -0500 Subject: [PATCH 182/286] Add some initialisation to class members (#3323) --- .../denseLinearAlgebra/unitTests/testDenseLASolvers.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp index 220e6fdb77f..5ec47ac1982 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp @@ -35,9 +35,9 @@ template< std::ptrdiff_t N > class LinearSystem { public: - real64 matrix[N][N]; - real64 solution[N]; - real64 rhs[N]; + real64 matrix[N][N]{}; + real64 solution[N]{}; + real64 rhs[N]{}; }; template< std::ptrdiff_t N > From b3842f27161582b64a8a6e32ce35128e7bbe39e8 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Fri, 6 Sep 2024 10:44:27 -0700 Subject: [PATCH 183/286] chore: update codeowners for integrated_tests.yaml (#3333) --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b23f7e229c6..1048325b177 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -10,6 +10,7 @@ /.github/ @rrsettgast /BASELINE_NOTES.md +/.integrated_tests.yaml @CusiniM @cssherman @rrsettgast @wrtobin @castelletto1 @jhuang2601 @paveltomin /inputFiles/ @CusiniM @cssherman @jhuang2601 @rrsettgast /src/coreComponents/LvArray @rrsettgast @wrtobin @corbett5 @CusiniM /src/coreComponents/codingUtilities @rrsettgast @untereiner @corbett5 @wrtobin From 1872181764e220b2238244a39fb9eb1c7afc886c Mon Sep 17 00:00:00 2001 From: Jian Huang <53012159+jhuang2601@users.noreply.github.com> Date: Fri, 6 Sep 2024 16:25:36 -0500 Subject: [PATCH 184/286] feat: print out fracture state for contact model (#3322) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 ++++++ src/coreComponents/physicsSolvers/contact/ContactFields.hpp | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index cfecf5fb131..ba16ffbcbf8 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3302-7289-4ec7c0d + baseline: integratedTests/baseline_integratedTests-pr3322-7333-3b1cff1 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 82b360f8b34..f0cf9fadf40 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,10 +6,16 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3322 (2024-09-06) +====================== +Print out fracture state for contact model. Rebaseline the corresponding cases. + + PR #3302 (2024-09-05) ====================== Added restartcheks to hydrofrac cases and reduced time of cases that were too long. + PR #3135 (2024-09-04) ====================== Temperature dependent single phase thermal conductivity. Rebaseline all thermal cases. diff --git a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp index 1ee3cb73aeb..17291a2dbf7 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp @@ -134,8 +134,8 @@ DECLARE_FIELD( fractureState, "fractureState", array1d< integer >, FractureState::Stick, - NOPLOT, - NO_WRITE, + LEVEL_0, + WRITE_AND_READ, "Fracture state." ); DECLARE_FIELD( oldFractureState, From 14a21b5ef217901aaa6de6bf80ba36952b91a6f1 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Sat, 7 Sep 2024 11:04:54 -1000 Subject: [PATCH 185/286] docs: edits from joss review (#3332) --- .../scripts/hydrofractureFigure.py | 38 +- .../scripts/hydrofractureQueries.py | 20 +- scripts/automatic_xml_preprocess.sh | 8 +- ...reDependentSolidVolumetricHeatCapacity.rst | 3 +- src/coreComponents/mesh/docs/Mesh.rst | 2 +- .../gravityInitializationFigure.py | 243 ++++---- .../userTableStressInitialization/Example.rst | 16 +- .../tableInitializationFigure.py | 249 ++++---- src/docs/sphinx/QuickStart.rst | 2 + .../inSituDataMonitor/AdvancedExample.rst | 20 +- .../AdvancedExample.rst | 16 +- .../buckleyLeverett/buckleyLeverettFigure.py | 25 +- .../faultVerificationFigure.py | 21 +- .../intersectFrac/intersectFracFigure.py | 21 +- .../singleFracCompressionFigure.py | 23 +- .../faultMechanics/sneddon/sneddonFigure.py | 19 +- .../kgdToughnessDominatedFigure.py | 5 +- .../kgdValidation/kgdValidationFigure.py | 15 +- .../kgdValidation/kgdValidationQueries.py | 13 +- .../kgdViscosityDominatedFigure.py | 4 +- .../pennyShapedToughnessDominatedFigure.py | 4 +- .../pennyShapedViscosityDominatedFigure.py | 4 +- .../pknViscosityDominatedFigure.py | 4 +- .../proppantSlotTestFigure.py | 21 +- .../poromechanics/mandel/Example.rst | 1 + .../poromechanics/mandel/mandelFigure.py | 25 +- ...ialDriver_vs_SemiAnalytic_DruckerPrager.py | 479 ++++++++------- ...r_vs_SemiAnalytic_ExtendedDruckerPrager.py | 515 ++++++++-------- ...lDriver_vs_SemiAnalytic_ModifiedCamClay.py | 413 +++++++------ .../RelaxationTest/relaxationTestFigure.py | 577 +++++++++--------- ...iver_vs_SemiAnalytic_ViscoDruckerPrager.py | 515 ++++++++-------- ...SemiAnalytic_ViscoExtendedDruckerPrager.py | 541 ++++++++-------- ...er_vs_SemiAnalytic_ViscoModifiedCamClay.py | 428 ++++++------- ...viatedPoroElasticWellboreExample1Figure.py | 32 +- ...viatedPoroElasticWellboreExample2Figure.py | 34 +- .../edpWellbore/edpWellbore_plot.py | 450 +++++++------- .../kirschWellbore/kirschWellboreFigure.py | 23 +- .../linearThermalDiffusion_plot.py | 181 +++--- ...dentSinglePhaseThermalConductivity_plot.py | 215 ++++--- ...ureDependentVolumetricHeatCapacity_plot.py | 217 +++---- .../THM_wellbore_stress.py | 285 +++++---- .../poromechanics/poromechanicsFigure.py | 21 +- .../triaxialDriver/triaxialDriverFigure.py | 19 +- src/docs/sphinx/buildGuide/BuildProcess.rst | 12 +- .../Contributing/WorkInteractivelyOnCI.rst | 58 +- src/docs/sphinx/tutorials/step01/Tutorial.rst | 10 +- src/docs/sphinx/tutorials/step03/Tutorial.rst | 3 +- src/main/main.cpp | 2 + src/pygeosx/pygeosx.hpp | 4 +- 49 files changed, 3149 insertions(+), 2707 deletions(-) diff --git a/inputFiles/hydraulicFracturing/scripts/hydrofractureFigure.py b/inputFiles/hydraulicFracturing/scripts/hydrofractureFigure.py index 739777bb336..c8cb897201d 100644 --- a/inputFiles/hydraulicFracturing/scripts/hydrofractureFigure.py +++ b/inputFiles/hydraulicFracturing/scripts/hydrofractureFigure.py @@ -5,10 +5,10 @@ import sys -def getParametersFromXML(xmlFilePath): - prefix = "../../../../../../../inputFiles/hydraulicFracturing/" +def getParametersFromXML( geosDir, xmlFilePrefix): + prefix = geosDir + "/inputFiles/hydraulicFracturing/" - tree = ElementTree.parse(prefix + xmlFilePath + "_benchmark.xml") + tree = ElementTree.parse(prefix + xmlFilePrefix + "_benchmark.xml") maxTime = float(tree.find('Events').get('maxTime')) @@ -22,7 +22,7 @@ def getParametersFromXML(xmlFilePath): found_source = True if found_source: break - tree = ElementTree.parse(prefix + xmlFilePath + "_base.xml") + tree = ElementTree.parse(prefix + xmlFilePrefix + "_base.xml") elasticParam = tree.find('Constitutive/ElasticIsotropic') @@ -30,30 +30,30 @@ def getParametersFromXML(xmlFilePath): fluidDensity = float(tree.find('Constitutive/CompressibleSinglePhaseFluid').get('defaultDensity')) - if xmlFilePath == 'kgdToughnessDominated' or xmlFilePath == 'kgdViscosityDominated': + if xmlFilePrefix == 'kgdToughnessDominated' or xmlFilePrefix == 'kgdViscosityDominated': youngModulus = float(elasticParam.get('defaultYoungModulus')) poissonRatio = float(elasticParam.get('defaultPoissonRatio')) injectionRate = -2.0 * float(tree.find('FieldSpecifications/SourceFlux').get('scale')) / fluidDensity - tree = ElementTree.parse(prefix + xmlFilePath + "_base.xml") + tree = ElementTree.parse(prefix + xmlFilePrefix + "_base.xml") toughness = float(tree.find('Solvers/SurfaceGenerator').get('rockToughness')) - elif xmlFilePath == 'pennyShapedToughnessDominated' or xmlFilePath == 'pennyShapedViscosityDominated': + elif xmlFilePrefix == 'pennyShapedToughnessDominated' or xmlFilePrefix == 'pennyShapedViscosityDominated': K = float(elasticParam.get('defaultBulkModulus')) G = float(elasticParam.get('defaultShearModulus')) youngModulus = (9.0 * K * G) / (3.0 * K + G) poissonRatio = youngModulus / (2.0 * G) - 1.0 injectionRate = -4.0 * float(tree.find('FieldSpecifications/SourceFlux').get('scale')) / fluidDensity - tree = ElementTree.parse(prefix + xmlFilePath + "_benchmark.xml") + tree = ElementTree.parse(prefix + xmlFilePrefix + "_benchmark.xml") toughness = float(tree.find('Solvers/SurfaceGenerator').get('rockToughness')) - elif xmlFilePath == 'pknViscosityDominated': + elif xmlFilePrefix == 'pknViscosityDominated': K = float(elasticParam.get('defaultBulkModulus')) G = float(elasticParam.get('defaultShearModulus')) youngModulus = (9.0 * K * G) / (3.0 * K + G) poissonRatio = youngModulus / (2.0 * G) - 1.0 injectionRate = -4.0 * float(tree.find('FieldSpecifications/SourceFlux').get('scale')) / fluidDensity - tree = ElementTree.parse(prefix + xmlFilePath + "_benchmark.xml") + tree = ElementTree.parse(prefix + xmlFilePrefix + "_benchmark.xml") toughness = float(tree.find('Solvers/SurfaceGenerator').get('rockToughness')) found_core = False for elem in param: @@ -68,17 +68,17 @@ def getParametersFromXML(xmlFilePath): -def main(xmlFilePathPrefix=''): - if not xmlFilePathPrefix: - xmlFilePathPrefix = sys.argv[1] +def main( geosDir, xmlFilePrefix=''): + if not xmlFilePrefix: + xmlFilePrefix = sys.argv[1] - tMax, E, nu, KIC, mu, Q0, xSource = getParametersFromXML(xmlFilePathPrefix) + tMax, E, nu, KIC, mu, Q0, xSource = getParametersFromXML( geosDir, xmlFilePrefix) Ep = E / (1.0 - nu**2.0) t = np.arange(0.01 * tMax, tMax, 0.01 * tMax) radTimes = np.array([tMax]) - if xmlFilePathPrefix == 'kgdToughnessDominated': + if xmlFilePrefix == 'kgdToughnessDominated': hfsolns = HydrofractureSolutions.KGDSolutions() kgdFrac = hfsolns.Solutions(mu, Ep, Q0, KIC, t, radTimes, xSource) inletPressure = kgdFrac[5] @@ -86,7 +86,7 @@ def main(xmlFilePathPrefix=''): inletAperture = kgdFrac[7] lablelist = ['Asymptotic ( $\mu$ => 0, $C_{L}$ => 0 )', 'GEOSX ( $\mu$ => 0, $C_{L}$ => 0 )'] - elif xmlFilePathPrefix == 'kgdViscosityDominated': + elif xmlFilePrefix == 'kgdViscosityDominated': hfsolns = HydrofractureSolutions.KGDSolutions() kgdFrac = hfsolns.Solutions(mu, Ep, Q0, KIC, t, radTimes, xSource) inletPressure = kgdFrac[8] @@ -94,7 +94,7 @@ def main(xmlFilePathPrefix=''): inletAperture = kgdFrac[10] lablelist = ['Asymptotic ( $K_{IC}$ => 0, $C_{L}$ => 0 )', 'GEOSX ( $K_{IC}$ => 0, $C_{L}$ => 0 )'] - elif xmlFilePathPrefix == 'pennyShapedToughnessDominated': + elif xmlFilePrefix == 'pennyShapedToughnessDominated': hfsolns = HydrofractureSolutions.PennySolutions() pennyFrac = hfsolns.Solutions(mu, Ep, Q0, KIC, t, radTimes, xSource) inletPressure = pennyFrac[5] @@ -102,7 +102,7 @@ def main(xmlFilePathPrefix=''): inletAperture = pennyFrac[7] lablelist = ['Asymptotic ( $\mu$ => 0, $C_{L}$ => 0 )', 'GEOSX ( $\mu$ => 0, $C_{L}$ => 0 )'] - elif xmlFilePathPrefix == 'pennyShapedViscosityDominated': + elif xmlFilePrefix == 'pennyShapedViscosityDominated': hfsolns = HydrofractureSolutions.PennySolutions() pennyFrac = hfsolns.Solutions(mu, Ep, Q0, KIC, t, radTimes, xSource) inletPressure = pennyFrac[8] @@ -110,7 +110,7 @@ def main(xmlFilePathPrefix=''): inletAperture = pennyFrac[10] lablelist = ['Asymptotic ( $K_{IC}$ => 0, $C_{L}$ => 0 )', 'GEOSX ( $K_{IC}$ => 0, $C_{L}$ => 0 )'] - elif xmlFilePathPrefix == 'pknViscosityDominated': + elif xmlFilePrefix == 'pknViscosityDominated': pknFrac = HydrofractureSolutions.PKN_viscosityStorageDominated(E, nu, KIC, mu, Q0, t, xSource) halfLength, inletAperture, inletPressure = pknFrac.analyticalSolution() lablelist = ['Asymptotic ( $K_{IC}$ => 0, $C_{L}$ => 0 )', 'GEOSX ( $K_{IC}$ => 0, $C_{L}$ => 0 )'] diff --git a/inputFiles/hydraulicFracturing/scripts/hydrofractureQueries.py b/inputFiles/hydraulicFracturing/scripts/hydrofractureQueries.py index 4bc35027610..68c84f3545d 100644 --- a/inputFiles/hydraulicFracturing/scripts/hydrofractureQueries.py +++ b/inputFiles/hydraulicFracturing/scripts/hydrofractureQueries.py @@ -8,8 +8,8 @@ import xml.etree.ElementTree as ElementTree -def getFracHeightFromXML(fracType): - prefix = "../../../../../../../inputFiles/hydraulicFracturing/" +def getFracHeightFromXML(fracType, geosDir): + prefix = geosDir + "/inputFiles/hydraulicFracturing/" tree = ElementTree.parse(prefix + fracType + "_benchmark.xml") @@ -36,15 +36,27 @@ def getFracHeightFromXML(fracType): def main(): + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + + # Parse the command-line arguments + args = parser.parse_args() + # Load and process GEOSX results # File path + geosDir = args.geosDir + fracType = sys.argv[1] - prefix = "../../../../../../../inputFiles/hydraulicFracturing/" + prefix = geosDir + "/inputFiles/hydraulicFracturing/" hdf5File = prefix + fracType + '_output.hdf5' # Get frac height from XML file if fracType == 'kgdToughnessDominated' or fracType == 'kgdViscosityDominated' or fracType == 'pknViscosityDominated': - fracHeight = getFracHeightFromXML(fracType) + fracHeight = getFracHeightFromXML(fracType, geosDir) # Read simulation output from HDF5 file # Global Coordinate of Element Center diff --git a/scripts/automatic_xml_preprocess.sh b/scripts/automatic_xml_preprocess.sh index b1cf109b943..df7fb7a3be1 100755 --- a/scripts/automatic_xml_preprocess.sh +++ b/scripts/automatic_xml_preprocess.sh @@ -9,7 +9,7 @@ COMPILED_XML_NAME_OVERRIDE="" PARAMETER_ARGS="" NEW_ARGS="" USE_PYGEOSX=1 -PYGEOS_WARNINGS=0 +PYGEOSX_WARNINGS=0 SCRIPT_DIR=$(dirname "$0") PYGEOSX=$SCRIPT_DIR/../lib/PYGEOSX/bin/python @@ -37,7 +37,7 @@ do shift ;; -w|--pygeosx-warnings) - PYGEOS_WARNINGS=$2 + PYGEOSX_WARNINGS=$2 shift ;; -h|--help) @@ -75,12 +75,12 @@ if [ "$USE_PYGEOSX" -eq "1" ] then if [ -f $PYGEOSX ] then - if [ "$PYGEOS_WARNINGS" -eq "1" ] + if [ "$PYGEOSX_WARNINGS" -eq "1" ] then echo "Using pygeosx to preprocess the xml file" fi else - if [ "$PYGEOS_WARNINGS" -eq "1" ] + if [ "$PYGEOSX_WARNINGS" -eq "1" ] then echo "Pygeosx installation not found... reverting to non-pygeosx version" fi diff --git a/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst b/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst index 22feb9c1b8c..d3714bbf146 100644 --- a/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst +++ b/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst @@ -35,7 +35,8 @@ block. The following attributes are supported: -.. include:: /coreComponents/schema/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst +.. include:: /coreComponents/schema/docs/SolidInternalEnergy.rst + Example diff --git a/src/coreComponents/mesh/docs/Mesh.rst b/src/coreComponents/mesh/docs/Mesh.rst index c87441015b4..211b804ab79 100644 --- a/src/coreComponents/mesh/docs/Mesh.rst +++ b/src/coreComponents/mesh/docs/Mesh.rst @@ -287,7 +287,7 @@ Importing surfaces ****************** Surfaces are imported through point sets in GEOS. This feature is supported using only the ``vtk`` file format. -In the same way than the regions, the surfaces of interests can be defined using the `physical entity names`_. +In the same way than the regions, the surfaces of interests can be defined using the `physical entity names`. The surfaces are automatically import in GEOS if they exist in the ``vtk`` file. Within GEOS, the point set will have the same name than the one given in the file. This name can be used again to impose boundary condition. For instance, if a surface is named "Bottom" and the user wants to diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py index f6381a56e08..4255c9ff3a4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py @@ -6,141 +6,150 @@ import math from math import sin,cos,tan,exp,atan,asin import csv +import os +import argparse def getHydromechanicalParametersFromXML(xmlFilePath): - tree = ElementTree.parse(xmlFilePath) + tree = ElementTree.parse(xmlFilePath) - param1 = tree.find('Constitutive/ElasticIsotropic') - param2 = tree.find('Constitutive/BiotPorosity') - param3 = tree.find('Constitutive/CompressibleSinglePhaseFluid') + param1 = tree.find('Constitutive/ElasticIsotropic') + param2 = tree.find('Constitutive/BiotPorosity') + param3 = tree.find('Constitutive/CompressibleSinglePhaseFluid') - hydromechanicalParameters = dict.fromkeys([ + hydromechanicalParameters = dict.fromkeys([ "bulkModulus", "shearModulus", "youngModulus", "poissonRatio", "rockDensity", "poissonRatio", "biotCoefficient", "porosity", "fluidDensity", "traction"]) - hydromechanicalParameters["rockDensity"] = float(param1.get("defaultDensity")) - hydromechanicalParameters["poissonRatio"] = float(param1.get("defaultPoissonRatio")) - hydromechanicalParameters["youngModulus"] = float(param1.get("defaultYoungModulus")) + hydromechanicalParameters["rockDensity"] = float(param1.get("defaultDensity")) + hydromechanicalParameters["poissonRatio"] = float(param1.get("defaultPoissonRatio")) + hydromechanicalParameters["youngModulus"] = float(param1.get("defaultYoungModulus")) - E = hydromechanicalParameters["youngModulus"] - nu = hydromechanicalParameters["poissonRatio"] - K = E / (3 * (1 - 2 * nu)) - G = E / (2 * (1 + nu)) + E = hydromechanicalParameters["youngModulus"] + nu = hydromechanicalParameters["poissonRatio"] + K = E / (3 * (1 - 2 * nu)) + G = E / (2 * (1 + nu)) - hydromechanicalParameters["poissonRatio"] = nu - hydromechanicalParameters["bulkModulus"] = K - hydromechanicalParameters["shearModulus"] = G + hydromechanicalParameters["poissonRatio"] = nu + hydromechanicalParameters["bulkModulus"] = K + hydromechanicalParameters["shearModulus"] = G - Ks = float(param2.get("defaultGrainBulkModulus")) - hydromechanicalParameters["biotCoefficient"] = 1.0 - K / Ks + Ks = float(param2.get("defaultGrainBulkModulus")) + hydromechanicalParameters["biotCoefficient"] = 1.0 - K / Ks - hydromechanicalParameters["porosity"] = float(param2.get("defaultReferencePorosity")) + hydromechanicalParameters["porosity"] = float(param2.get("defaultReferencePorosity")) - hydromechanicalParameters["fluidDensity"] = float(param3.get("defaultDensity")) + hydromechanicalParameters["fluidDensity"] = float(param3.get("defaultDensity")) - param4 = tree.findall('FieldSpecifications/Traction') - found_stress = False - for elem in param4: - if elem.get("name") == "tractionTop" and elem.get("tractionType") == "normal": - traction = float(elem.get("scale")) * (-1) - found_stress = True - if found_stress: break + param4 = tree.findall('FieldSpecifications/Traction') + found_stress = False + for elem in param4: + if elem.get("name") == "tractionTop" and elem.get("tractionType") == "normal": + traction = float(elem.get("scale")) * (-1) + found_stress = True + if found_stress: break - return hydromechanicalParameters + return hydromechanicalParameters def main(): - # File path - xmlFile1Path = "../../../../../../inputFiles/initialization/gravityInducedStress_initialization_base.xml" - xmlFile2Path = "../../../../../../inputFiles/initialization/gravityInducedStress_initialization_benchmark.xml" - - hydromechanicalParameters = getHydromechanicalParametersFromXML(xmlFile1Path) - - BiotCoefficient = hydromechanicalParameters["biotCoefficient"] - nu = hydromechanicalParameters["poissonRatio"] - rhoF = hydromechanicalParameters["fluidDensity"] - rhoR = hydromechanicalParameters["rockDensity"] - phi = hydromechanicalParameters["porosity"] - rhoB = (1-phi)*rhoR + phi*rhoF - - traction = hydromechanicalParameters["traction"] - gravity = 9.81 - - # rename this file to the name of your Paraview output file - file = open("simulation_result_0.csv") - csvreader = csv.reader(file) - header = next(csvreader) - header_index = {column_name: index for index, column_name in enumerate(header)} - - rows = [] - for row in csvreader: - rows.append(row) - file.close() - - zloc_index = header_index["elementCenter:2"] - pressure_index = header_index["pressure"] - tsxx_index = header_index["rockSolid_stress:0"] # the solidModelName="rockSolid" has been defined in the gravityInducedStress_initialization_base.xml file, please change if you have a different solidModelName - tsyy_index = header_index["rockSolid_stress:1"] - tszz_index = header_index["rockSolid_stress:2"] - - - rows = np.array(rows) - zloc_0 = np.empty(len(rows[:,1])) - pressure_0 = np.empty(len(rows[:,1])) - tsxx_0 = np.empty(len(rows[:,1])) - tsyy_0 = np.empty(len(rows[:,1])) - tszz_0 = np.empty(len(rows[:,1])) - for i in range(0,len(rows[:,1])): - zloc_0[i]=-(float(rows[i,zloc_index])) - pressure_0[i]=float(rows[i,pressure_index]) - tsxx_0[i]=-(float(rows[i,tsxx_index])-BiotCoefficient*pressure_0[i])/1.0e6 - tsyy_0[i]=-(float(rows[i,tsyy_index])-BiotCoefficient*pressure_0[i])/1.0e6 - tszz_0[i]=-(float(rows[i,tszz_index])-BiotCoefficient*pressure_0[i])/1.0e6 - - - z_analytical= np.linspace(0, 1000, 100) - pp_analytical= rhoF*gravity*z_analytical/1.0e6 - szz_analtyical= rhoB*gravity*z_analytical/1.0e6 - - sxx_analtyical=nu/(1-nu)*(szz_analtyical-BiotCoefficient*pp_analytical)+BiotCoefficient*pp_analytical - - fsize = 20 - msize = 12 - lw = 6 - mew = 2 - malpha = 0.6 - lalpha = 0.8 - N1=1 - - fig = plt.figure(figsize=(10,8)) - cmap = plt.get_cmap("tab10") - - - plt.plot(tsxx_0[::N1], zloc_0[::N1], 'o', color=cmap(0), markersize=msize, alpha=malpha, mec=cmap(0), fillstyle='none', mew=mew, label= 'Sxx_Total_GEOS') - plt.plot(sxx_analtyical, z_analytical, lw=lw, alpha=0.8, color='orange', linestyle= ':', label='Sxx_Total_Analytical') - plt.plot(tsyy_0[::N1], zloc_0[::N1], 's', color=cmap(1), markersize=msize, alpha=malpha, mec=cmap(1), fillstyle='none', mew=mew, label= 'Syy_Total_GEOS') - plt.plot(tszz_0[::N1], zloc_0[::N1], 'd', color=cmap(2), markersize=msize, alpha=malpha, mec=cmap(2), fillstyle='none', mew=mew, label= 'Szz_Total_GEOS') - plt.plot(szz_analtyical, z_analytical, lw=lw, alpha=0.8, color='g', linestyle= ':', label='Szz_Total_Analytical') - plt.plot(pressure_0[::N1]/1.0e6, zloc_0[::N1], 'x', color=cmap(3), markersize=msize, alpha=malpha, mec=cmap(3), fillstyle='none', mew=mew, label= 'Pore Pressure_GEOS') - plt.plot(pp_analytical, z_analytical, lw=lw, alpha=0.8, color='r', linestyle= ':', label='Pore Pressure_Analytical') - plt.xlabel('Total Stresses [MPa]', size=fsize, weight="bold") - plt.ylabel('Depth [m]', size=fsize, weight="bold") - plt.legend(loc='upper right',fontsize=fsize*0.5) - plt.grid(True) - ax = plt.gca() - ax.xaxis.set_tick_params(labelsize=fsize) - ax.yaxis.set_tick_params(labelsize=fsize) - ax.invert_yaxis() - - plt.show() - - -if __name__ == "__main__": - main() + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + # File path + outputDir = args.outputDir + geosDir = args.geosDir + xmlFile1Path = geosDir + "/inputFiles/initialization/gravityInducedStress_initialization_base.xml" + xmlFile2Path = geosDir + "/inputFiles/initialization/gravityInducedStress_initialization_benchmark.xml" + + hydromechanicalParameters = getHydromechanicalParametersFromXML(xmlFile1Path) + + BiotCoefficient = hydromechanicalParameters["biotCoefficient"] + nu = hydromechanicalParameters["poissonRatio"] + rhoF = hydromechanicalParameters["fluidDensity"] + rhoR = hydromechanicalParameters["rockDensity"] + phi = hydromechanicalParameters["porosity"] + rhoB = (1-phi)*rhoR + phi*rhoF + + traction = hydromechanicalParameters["traction"] + gravity = 9.81 + + # rename this file to the name of your Paraview output file + file = open(outputDir + "/simulation_result_0.csv") + csvreader = csv.reader(file) + header = next(csvreader) + header_index = {column_name: index for index, column_name in enumerate(header)} + + rows = [] + for row in csvreader: + rows.append(row) + file.close() + + zloc_index = header_index["elementCenter:2"] + pressure_index = header_index["pressure"] + tsxx_index = header_index["rockSolid_stress:0"] # the solidModelName="rockSolid" has been defined in the gravityInducedStress_initialization_base.xml file, please change if you have a different solidModelName + tsyy_index = header_index["rockSolid_stress:1"] + tszz_index = header_index["rockSolid_stress:2"] + + + rows = np.array(rows) + zloc_0 = np.empty(len(rows[:,1])) + pressure_0 = np.empty(len(rows[:,1])) + tsxx_0 = np.empty(len(rows[:,1])) + tsyy_0 = np.empty(len(rows[:,1])) + tszz_0 = np.empty(len(rows[:,1])) + for i in range(0,len(rows[:,1])): + zloc_0[i]=-(float(rows[i,zloc_index])) + pressure_0[i]=float(rows[i,pressure_index]) + tsxx_0[i]=-(float(rows[i,tsxx_index])-BiotCoefficient*pressure_0[i])/1.0e6 + tsyy_0[i]=-(float(rows[i,tsyy_index])-BiotCoefficient*pressure_0[i])/1.0e6 + tszz_0[i]=-(float(rows[i,tszz_index])-BiotCoefficient*pressure_0[i])/1.0e6 + + + z_analytical= np.linspace(0, 1000, 100) + pp_analytical= rhoF*gravity*z_analytical/1.0e6 + szz_analtyical= rhoB*gravity*z_analytical/1.0e6 + + sxx_analtyical=nu/(1-nu)*(szz_analtyical-BiotCoefficient*pp_analytical)+BiotCoefficient*pp_analytical + + fsize = 20 + msize = 12 + lw = 6 + mew = 2 + malpha = 0.6 + lalpha = 0.8 + N1=1 + + fig = plt.figure(figsize=(10,8)) + cmap = plt.get_cmap("tab10") + + + plt.plot(tsxx_0[::N1], zloc_0[::N1], 'o', color=cmap(0), markersize=msize, alpha=malpha, mec=cmap(0), fillstyle='none', mew=mew, label= 'Sxx_Total_GEOS') + plt.plot(sxx_analtyical, z_analytical, lw=lw, alpha=0.8, color='orange', linestyle= ':', label='Sxx_Total_Analytical') + plt.plot(tsyy_0[::N1], zloc_0[::N1], 's', color=cmap(1), markersize=msize, alpha=malpha, mec=cmap(1), fillstyle='none', mew=mew, label= 'Syy_Total_GEOS') + plt.plot(tszz_0[::N1], zloc_0[::N1], 'd', color=cmap(2), markersize=msize, alpha=malpha, mec=cmap(2), fillstyle='none', mew=mew, label= 'Szz_Total_GEOS') + plt.plot(szz_analtyical, z_analytical, lw=lw, alpha=0.8, color='g', linestyle= ':', label='Szz_Total_Analytical') + plt.plot(pressure_0[::N1]/1.0e6, zloc_0[::N1], 'x', color=cmap(3), markersize=msize, alpha=malpha, mec=cmap(3), fillstyle='none', mew=mew, label= 'Pore Pressure_GEOS') + plt.plot(pp_analytical, z_analytical, lw=lw, alpha=0.8, color='r', linestyle= ':', label='Pore Pressure_Analytical') + plt.xlabel('Total Stresses [MPa]', size=fsize, weight="bold") + plt.ylabel('Depth [m]', size=fsize, weight="bold") + plt.legend(loc='upper right',fontsize=fsize*0.5) + plt.grid(True) + ax = plt.gca() + ax.xaxis.set_tick_params(labelsize=fsize) + ax.yaxis.set_tick_params(labelsize=fsize) + ax.invert_yaxis() + + plt.show() - - - +if __name__ == "__main__": + main() diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/Example.rst b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/Example.rst index b60009c1b27..6ec3b78de4f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/Example.rst +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/Example.rst @@ -87,19 +87,19 @@ The following figure shows the final gradient of pressure and of the effective v .. _problemInitializationPres: .. figure:: pressure_field.png - :align: center - :width: 500 - :figclass: align-center + :align: center + :width: 500 + :figclass: align-center - Simulation result of pressure + Simulation result of pressure .. _problemInitializationSZZ: .. figure:: stressZZ_field.png - :align: center - :width: 500 - :figclass: align-center + :align: center + :width: 500 + :figclass: align-center - Simulation result of effective vertical stress + Simulation result of effective vertical stress The figure below shows the comparisons between the numerical predictions (marks) and the corresponding user-provided stress gradients. Note that anisotropic horizontal stresses are obtained through this intialization procedure; however, mechanical equilibrium might not be guaranteed, especially for the heterogeneous models. diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/tableInitializationFigure.py b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/tableInitializationFigure.py index 7a9c0d241b0..6dbd1fa0e30 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/tableInitializationFigure.py +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/userTableStressInitialization/tableInitializationFigure.py @@ -7,147 +7,162 @@ import math from math import sin,cos,tan,exp,atan,asin import csv +import os +import argparse def getHydromechanicalParametersFromXML(xmlFilePath): - tree = ElementTree.parse(xmlFilePath) + tree = ElementTree.parse(xmlFilePath) - param1 = tree.find('Constitutive/ElasticIsotropic') - param2 = tree.find('Constitutive/BiotPorosity') - param3 = tree.find('Constitutive/CompressibleSinglePhaseFluid') + param1 = tree.find('Constitutive/ElasticIsotropic') + param2 = tree.find('Constitutive/BiotPorosity') + param3 = tree.find('Constitutive/CompressibleSinglePhaseFluid') - hydromechanicalParameters = dict.fromkeys([ + hydromechanicalParameters = dict.fromkeys([ "bulkModulus", "shearModulus", "youngModulus", "poissonRatio", "rockDensity", "poissonRatio", "biotCoefficient", "porosity", "fluidDensity", "traction"]) - hydromechanicalParameters["rockDensity"] = float(param1.get("defaultDensity")) - hydromechanicalParameters["poissonRatio"] = float(param1.get("defaultPoissonRatio")) - hydromechanicalParameters["youngModulus"] = float(param1.get("defaultYoungModulus")) + hydromechanicalParameters["rockDensity"] = float(param1.get("defaultDensity")) + hydromechanicalParameters["poissonRatio"] = float(param1.get("defaultPoissonRatio")) + hydromechanicalParameters["youngModulus"] = float(param1.get("defaultYoungModulus")) - E = hydromechanicalParameters["youngModulus"] - nu = hydromechanicalParameters["poissonRatio"] - K = E / (3 * (1 - 2 * nu)) - G = E / (2 * (1 + nu)) + E = hydromechanicalParameters["youngModulus"] + nu = hydromechanicalParameters["poissonRatio"] + K = E / (3 * (1 - 2 * nu)) + G = E / (2 * (1 + nu)) - hydromechanicalParameters["poissonRatio"] = nu - hydromechanicalParameters["bulkModulus"] = K - hydromechanicalParameters["shearModulus"] = G + hydromechanicalParameters["poissonRatio"] = nu + hydromechanicalParameters["bulkModulus"] = K + hydromechanicalParameters["shearModulus"] = G - Ks = float(param2.get("defaultGrainBulkModulus")) - hydromechanicalParameters["biotCoefficient"] = 1.0 - K / Ks + Ks = float(param2.get("defaultGrainBulkModulus")) + hydromechanicalParameters["biotCoefficient"] = 1.0 - K / Ks - hydromechanicalParameters["porosity"] = float(param2.get("defaultReferencePorosity")) + hydromechanicalParameters["porosity"] = float(param2.get("defaultReferencePorosity")) - hydromechanicalParameters["fluidDensity"] = float(param3.get("defaultDensity")) + hydromechanicalParameters["fluidDensity"] = float(param3.get("defaultDensity")) - param4 = tree.findall('FieldSpecifications/Traction') - found_stress = False - for elem in param4: - if elem.get("name") == "tractionTop" and elem.get("tractionType") == "normal": - traction = float(elem.get("scale")) * (-1) - found_stress = True - if found_stress: break + param4 = tree.findall('FieldSpecifications/Traction') + found_stress = False + for elem in param4: + if elem.get("name") == "tractionTop" and elem.get("tractionType") == "normal": + traction = float(elem.get("scale")) * (-1) + found_stress = True + if found_stress: break - return hydromechanicalParameters + return hydromechanicalParameters def inputStressGradientsMPa(stressXX=None, stressYY=None, stressZZ=None,porePressure=None): stress_gradients = { 'stressXX': stressXX, 'stressYY': stressYY, 'stressZZ': stressZZ, - 'porePressure': porePressure + 'porePressure': porePressure } return stress_gradients def main(): - # File path - xmlFile1Path = "../../../../../../inputFiles/initialization/userdefinedStress_initialization_base.xml" - xmlFile2Path = "../../../../../../inputFiles/initialization/userdefinedStress_initialization_benchmark.xml" - - - hydromechanicalParameters = getHydromechanicalParametersFromXML(xmlFile1Path) - stress_gradients = inputStressGradientsMPa(0.17,0.27,0.24,0.1) - sxx_grad = stress_gradients["stressXX"] - syy_grad = stress_gradients["stressYY"] - szz_grad = stress_gradients["stressZZ"] - pp_grad = stress_gradients["porePressure"] - BiotCoefficient = hydromechanicalParameters["biotCoefficient"] - nu = hydromechanicalParameters["poissonRatio"] - rhoF = hydromechanicalParameters["fluidDensity"] - rhoR = hydromechanicalParameters["rockDensity"] - phi = hydromechanicalParameters["porosity"] - rhoB = (1-phi)*rhoR + phi*rhoF - - traction = hydromechanicalParameters["traction"] - gravity = 9.81 - - # rename this file to the name of your Paraview output file - file = open("simulation_result_0.csv") - csvreader = csv.reader(file) - header = next(csvreader) - header_index = {column_name: index for index, column_name in enumerate(header)} - - rows = [] - for row in csvreader: - rows.append(row) - file.close() - - zloc_index = header_index["elementCenter:2"] - pressure_index = header_index["pressure"] - tsxx_index = header_index["rockSolid_stress:0"] # the solidModelName="rockSolid" has been defined in the gravityInducedStress_initialization_base.xml file, please change if you have a different solidModelName - tsyy_index = header_index["rockSolid_stress:1"] - tszz_index = header_index["rockSolid_stress:2"] - - - rows = np.array(rows) - zloc_0 = np.empty(len(rows[:,1])) - pressure_0 = np.empty(len(rows[:,1])) - tsxx_0 = np.empty(len(rows[:,1])) - tsyy_0 = np.empty(len(rows[:,1])) - tszz_0 = np.empty(len(rows[:,1])) - for i in range(0,len(rows[:,1])): - zloc_0[i]=-(float(rows[i,zloc_index])) - pressure_0[i]=float(rows[i,pressure_index]) - tsxx_0[i]=-(float(rows[i,tsxx_index])-BiotCoefficient*pressure_0[i])/1.0e6 - tsyy_0[i]=-(float(rows[i,tsyy_index])-BiotCoefficient*pressure_0[i])/1.0e6 - tszz_0[i]=-(float(rows[i,tszz_index])-BiotCoefficient*pressure_0[i])/1.0e6 - - - z_analytical= np.linspace(0, 1000, 100) - - pp_analytical= pp_grad*100000*z_analytical/1.0e6 - szz_analtyical= szz_grad*100000*z_analytical/1.0e6 - sxx_analtyical = sxx_grad*100000*z_analytical/1.0e6 - syy_analtyical = syy_grad*100000*z_analytical/1.0e6 - - fsize = 20 - msize = 12 - lw = 6 - mew = 2 - malpha = 0.6 - lalpha = 0.8 - N1=1 - - fig = plt.figure(figsize=(10,8)) - cmap = plt.get_cmap("tab10") + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + # File path + outputDir = args.outputDir + geosDir = args.geosDir + xmlFile1Path = geosDir + "/inputFiles/initialization/userdefinedStress_initialization_base.xml" + xmlFile2Path = geosDir + "/inputFiles/initialization/userdefinedStress_initialization_benchmark.xml" + + + hydromechanicalParameters = getHydromechanicalParametersFromXML(xmlFile1Path) + stress_gradients = inputStressGradientsMPa(0.17,0.27,0.24,0.1) + sxx_grad = stress_gradients["stressXX"] + syy_grad = stress_gradients["stressYY"] + szz_grad = stress_gradients["stressZZ"] + pp_grad = stress_gradients["porePressure"] + BiotCoefficient = hydromechanicalParameters["biotCoefficient"] + nu = hydromechanicalParameters["poissonRatio"] + rhoF = hydromechanicalParameters["fluidDensity"] + rhoR = hydromechanicalParameters["rockDensity"] + phi = hydromechanicalParameters["porosity"] + rhoB = (1-phi)*rhoR + phi*rhoF + + traction = hydromechanicalParameters["traction"] + gravity = 9.81 + + # rename this file to the name of your Paraview output file + file = open(outputDir + "/simulation_result_0.csv") + csvreader = csv.reader(file) + header = next(csvreader) + header_index = {column_name: index for index, column_name in enumerate(header)} + + rows = [] + for row in csvreader: + rows.append(row) + file.close() + + zloc_index = header_index["elementCenter:2"] + pressure_index = header_index["pressure"] + tsxx_index = header_index["rockSolid_stress:0"] # the solidModelName="rockSolid" has been defined in the gravityInducedStress_initialization_base.xml file, please change if you have a different solidModelName + tsyy_index = header_index["rockSolid_stress:1"] + tszz_index = header_index["rockSolid_stress:2"] + + + rows = np.array(rows) + zloc_0 = np.empty(len(rows[:,1])) + pressure_0 = np.empty(len(rows[:,1])) + tsxx_0 = np.empty(len(rows[:,1])) + tsyy_0 = np.empty(len(rows[:,1])) + tszz_0 = np.empty(len(rows[:,1])) + for i in range(0,len(rows[:,1])): + zloc_0[i]=-(float(rows[i,zloc_index])) + pressure_0[i]=float(rows[i,pressure_index]) + tsxx_0[i]=-(float(rows[i,tsxx_index])-BiotCoefficient*pressure_0[i])/1.0e6 + tsyy_0[i]=-(float(rows[i,tsyy_index])-BiotCoefficient*pressure_0[i])/1.0e6 + tszz_0[i]=-(float(rows[i,tszz_index])-BiotCoefficient*pressure_0[i])/1.0e6 + + + z_analytical= np.linspace(0, 1000, 100) + + pp_analytical= pp_grad*100000*z_analytical/1.0e6 + szz_analtyical= szz_grad*100000*z_analytical/1.0e6 + sxx_analtyical = sxx_grad*100000*z_analytical/1.0e6 + syy_analtyical = syy_grad*100000*z_analytical/1.0e6 + + fsize = 20 + msize = 12 + lw = 6 + mew = 2 + malpha = 0.6 + lalpha = 0.8 + N1=1 + + fig = plt.figure(figsize=(10,8)) + cmap = plt.get_cmap("tab10") - plt.plot(tsxx_0[::N1], zloc_0[::N1], 'o', color=cmap(0), markersize=msize, alpha=malpha, mec=cmap(0), fillstyle='none', mew=mew, label= 'Sxx_Total_GEOS') - plt.plot(sxx_analtyical, z_analytical, lw=lw, alpha=0.8, color='b', linestyle= ':', label='Sxx_Total_Reference') - plt.plot(tsyy_0[::N1], zloc_0[::N1], 's', color=cmap(1), markersize=msize, alpha=malpha, mec=cmap(1), fillstyle='none', mew=mew, label= 'Syy_Total_GEOS') - plt.plot(syy_analtyical, z_analytical, lw=lw, alpha=0.8, color='orange', linestyle= ':', label='Syy_Total_Reference') - plt.plot(tszz_0[::N1], zloc_0[::N1], 'd', color=cmap(2), markersize=msize, alpha=malpha, mec=cmap(2), fillstyle='none', mew=mew, label= 'Szz_Total_GEOS') - plt.plot(szz_analtyical, z_analytical, lw=lw, alpha=0.8, color='y', linestyle= ':', label='Szz_Total_Reference') - plt.plot(pressure_0[::N1]/1.0e6, zloc_0[::N1], 'x', color=cmap(3), markersize=msize, alpha=malpha, mec=cmap(3), fillstyle='none', mew=mew, label= 'Pore Pressure_GEOS') - plt.plot(pp_analytical, z_analytical, lw=lw, alpha=0.8, color='r', linestyle= ':', label='Pore Pressure_Reference') - plt.xlabel('Total Stresses [MPa]', size=fsize, weight="bold") - plt.ylabel('Depth [m]', size=fsize, weight="bold") - plt.legend(loc='upper right',fontsize=fsize*0.5) - plt.grid(True) - ax = plt.gca() - ax.xaxis.set_tick_params(labelsize=fsize) - ax.yaxis.set_tick_params(labelsize=fsize) - ax.invert_yaxis() - - plt.show() + plt.plot(tsxx_0[::N1], zloc_0[::N1], 'o', color=cmap(0), markersize=msize, alpha=malpha, mec=cmap(0), fillstyle='none', mew=mew, label= 'Sxx_Total_GEOS') + plt.plot(sxx_analtyical, z_analytical, lw=lw, alpha=0.8, color='b', linestyle= ':', label='Sxx_Total_Reference') + plt.plot(tsyy_0[::N1], zloc_0[::N1], 's', color=cmap(1), markersize=msize, alpha=malpha, mec=cmap(1), fillstyle='none', mew=mew, label= 'Syy_Total_GEOS') + plt.plot(syy_analtyical, z_analytical, lw=lw, alpha=0.8, color='orange', linestyle= ':', label='Syy_Total_Reference') + plt.plot(tszz_0[::N1], zloc_0[::N1], 'd', color=cmap(2), markersize=msize, alpha=malpha, mec=cmap(2), fillstyle='none', mew=mew, label= 'Szz_Total_GEOS') + plt.plot(szz_analtyical, z_analytical, lw=lw, alpha=0.8, color='y', linestyle= ':', label='Szz_Total_Reference') + plt.plot(pressure_0[::N1]/1.0e6, zloc_0[::N1], 'x', color=cmap(3), markersize=msize, alpha=malpha, mec=cmap(3), fillstyle='none', mew=mew, label= 'Pore Pressure_GEOS') + plt.plot(pp_analytical, z_analytical, lw=lw, alpha=0.8, color='r', linestyle= ':', label='Pore Pressure_Reference') + plt.xlabel('Total Stresses [MPa]', size=fsize, weight="bold") + plt.ylabel('Depth [m]', size=fsize, weight="bold") + plt.legend(loc='upper right',fontsize=fsize*0.5) + plt.grid(True) + ax = plt.gca() + ax.xaxis.set_tick_params(labelsize=fsize) + ax.yaxis.set_tick_params(labelsize=fsize) + ax.invert_yaxis() + + plt.show() if __name__ == "__main__": - main() + main() diff --git a/src/docs/sphinx/QuickStart.rst b/src/docs/sphinx/QuickStart.rst index 0ad5e2acab9..d043c7fea15 100644 --- a/src/docs/sphinx/QuickStart.rst +++ b/src/docs/sphinx/QuickStart.rst @@ -303,6 +303,7 @@ Compiling GEOS Once the TPLs have been compiler, the next step is to compile the main code. The ``config-build.py`` script is used to configure the build directory. Before running the configuration script, ensure that the path to the TPLs is correctly set in the host configuration file by setting .. code-block:: sh + set(GEOS_TPL_DIR "/path/to/your/TPL/installation/dir" CACHE PATH "") If you have followed these instructions, the TPLs are installed at the default location, i.e. ``/path/to/your/TPL/thirdPartyLibs/install-your-platform-release``. @@ -313,6 +314,7 @@ If you have followed these instructions, the TPLs are installed at the default l python scripts/config-build.py -hc host-configs/your-platform.cmake -bt Release An alternative is to set the path ``GEOS_TPL_DIR`` via a cmake command line option, e.g. + .. code-block:: sh python scripts/config-build.py -hc host-configs/your-platform.cmake -bt Release -D GEOS_TPL_DIR=/full/path/to/thirdPartyLibs diff --git a/src/docs/sphinx/advancedExamples/pygeosxExamples/inSituDataMonitor/AdvancedExample.rst b/src/docs/sphinx/advancedExamples/pygeosxExamples/inSituDataMonitor/AdvancedExample.rst index 918ec1422d1..2d9d42bad7b 100644 --- a/src/docs/sphinx/advancedExamples/pygeosxExamples/inSituDataMonitor/AdvancedExample.rst +++ b/src/docs/sphinx/advancedExamples/pygeosxExamples/inSituDataMonitor/AdvancedExample.rst @@ -63,8 +63,8 @@ The custom packages include pygeosx, which provides an interface to GEOS, and py .. literalinclude:: ../../../../../../examples/pygeosxExamples/hydraulicFractureWithMonitor/hydraulicFractureWithMonitor.py :language: python - :start-after: # PYGEOS_SETUP - :end-before: # PYGEOS_SETUP_END + :start-after: # PYGEOSX_SETUP + :end-before: # PYGEOSX_SETUP_END In the next step, we apply the xml preprocessor to resolve the advanced xml features. Note that this step will modify the input arguments to reflect the location of the compiled xml file, which is processed directly by GEOS. @@ -73,8 +73,8 @@ There is an opportunity to interact with the GEOS before the initial conditions .. literalinclude:: ../../../../../../examples/pygeosxExamples/hydraulicFractureWithMonitor/hydraulicFractureWithMonitor.py :language: python - :start-after: # PYGEOS_INITIALIZATION - :end-before: # PYGEOS_INITIALIZATION_END + :start-after: # PYGEOSX_INITIALIZATION + :end-before: # PYGEOSX_INITIALIZATION_END To extract information from the problem, you need to know the full path (or 'key') to the target object. These keys can be quite long, and can change depending on the xml input. @@ -84,8 +84,8 @@ Note that these functions will throw an error if they do not find a matching key .. literalinclude:: ../../../../../../examples/pygeosxExamples/hydraulicFractureWithMonitor/hydraulicFractureWithMonitor.py :language: python - :start-after: # PYGEOS_KEY_SEARCH - :end-before: # PYGEOS_KEY_SEARCH_END + :start-after: # PYGEOSX_KEY_SEARCH + :end-before: # PYGEOSX_KEY_SEARCH_END Next, we setup a dictionary that will allow us to use pygeosx_tools to automatically query the problem. The root level of this dictionary contains the target keys (fracture location and aperture) and the required `time` key. @@ -94,8 +94,8 @@ The target dictionaries also hold an entry `fhandle`, which contains a matplotli .. literalinclude:: ../../../../../../examples/pygeosxExamples/hydraulicFractureWithMonitor/hydraulicFractureWithMonitor.py :language: python - :start-after: # PYGEOS_QUERY_SETUP - :end-before: # PYGEOS_QUERY_SETUP_END + :start-after: # PYGEOSX_QUERY_SETUP + :end-before: # PYGEOSX_QUERY_SETUP_END After setting up the problem, we enter the main problem loop. Upon calling `pygeosx.run()`, the code will execute until a Python event is triggered in the Event loop. @@ -104,8 +104,8 @@ Here, we use pygeosx_tools to query the datastructure and occasionaly plot the r .. literalinclude:: ../../../../../../examples/pygeosxExamples/hydraulicFractureWithMonitor/hydraulicFractureWithMonitor.py :language: python - :start-after: # PYGEOS_QUERY_SETUP - :end-before: # PYGEOS_QUERY_SETUP_END + :start-after: # PYGEOSX_QUERY_SETUP + :end-before: # PYGEOSX_QUERY_SETUP_END --------------------------------- diff --git a/src/docs/sphinx/advancedExamples/pygeosxExamples/initialConditionModification/AdvancedExample.rst b/src/docs/sphinx/advancedExamples/pygeosxExamples/initialConditionModification/AdvancedExample.rst index 7c32edc5c86..614d3d6fb64 100644 --- a/src/docs/sphinx/advancedExamples/pygeosxExamples/initialConditionModification/AdvancedExample.rst +++ b/src/docs/sphinx/advancedExamples/pygeosxExamples/initialConditionModification/AdvancedExample.rst @@ -59,32 +59,32 @@ Similar to the previous example, the python script begins by importing the requi .. literalinclude:: ../../../../../../examples/pygeosxExamples/sedovWithStressFunction/run_sedov_problem.py :language: python - :start-after: # PYGEOS_INITIALIZATION - :end-before: # PYGEOS_INITIALIZATION_END + :start-after: # PYGEOSX_INITIALIZATION + :end-before: # PYGEOSX_INITIALIZATION_END The next steps rely on a python function that we use to set stress. The argument to this function, x, is assumed to be a numpy array of element centers: .. literalinclude:: ../../../../../../examples/pygeosxExamples/sedovWithStressFunction/run_sedov_problem.py :language: python - :start-after: # PYGEOS_STRESS_FN - :end-before: # PYGEOS_STRESS_FN_END + :start-after: # PYGEOSX_STRESS_FN + :end-before: # PYGEOSX_STRESS_FN_END In the following section, we zero out the initial stress and then set it based on `stress_fn`. While doing this, we use `wrapper.print_global_value_range` to check on the process. .. literalinclude:: ../../../../../../examples/pygeosxExamples/sedovWithStressFunction/run_sedov_problem.py :language: python - :start-after: # PYGEOS_STRESS_IC - :end-before: # PYGEOS_STRESS_IC_END + :start-after: # PYGEOSX_STRESS_IC + :end-before: # PYGEOSX_STRESS_IC_END Finally, we run the simulation. As an optional step, we extract numpy arrays from the datastructure using different parallel approaches: .. literalinclude:: ../../../../../../examples/pygeosxExamples/sedovWithStressFunction/run_sedov_problem.py :language: python - :start-after: # PYGEOS_MAIN_LOOP - :end-before: # PYGEOS_MAIN_LOOP_END + :start-after: # PYGEOSX_MAIN_LOOP + :end-before: # PYGEOSX_MAIN_LOOP_END --------------------------------- diff --git a/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/buckleyLeverettFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/buckleyLeverettFigure.py index 507ffc44cb3..4109c71ff0f 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/buckleyLeverettFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/buckleyLeverettFigure.py @@ -3,6 +3,8 @@ import xml.etree.ElementTree as ElementTree import numpy as np import h5py +import os +import argparse def getMaxTime(xmlFilePath): @@ -118,12 +120,25 @@ def computeFractionalFlow( phaseVolFrac, \ def main(): + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + # File paths - hdf5FilePath = "saturationHistory.hdf5" - pvdgFilePath = "../../../../../../../inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_table/pvdg.txt" - pvtwFilePath = "../../../../../../../inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_table/pvtw.txt" - xmlFile1Path = "../../../../../../../inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_base.xml" - xmlFile2Path = "../../../../../../../inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_benchmark.xml" + outputDir = args.outputDir + geosDir = args.geosDir + hdf5FilePath = outputDir + "/saturationHistory.hdf5" + pvdgFilePath = geosDir + "/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_table/pvdg.txt" + pvtwFilePath = geosDir + "/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_table/pvtw.txt" + xmlFile1Path = geosDir + "/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_base.xml" + xmlFile2Path = geosDir + "/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_benchmark.xml" # Read simulation parameters from XML file xMin, xMax, yMin, yMax, zMin, zMax = getDomainMaxMinCoords(xmlFile2Path) diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/faultVerification/faultVerificationFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/faultVerification/faultVerificationFigure.py index 03bd050a39f..20c937e0d34 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/faultVerification/faultVerificationFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/faultVerification/faultVerificationFigure.py @@ -4,6 +4,8 @@ from matplotlib.ticker import (MultipleLocator, FormatStrFormatter, AutoMinorLocator) import xml.etree.ElementTree as ElementTree import csv +import os +import argparse def getHydromechanicalParametersFromXML(xmlFilePath): @@ -73,8 +75,21 @@ def getCompressiveStressFromXML(xmlFilePath): def main(): + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + # File path - xmlFilePath = "../../../../../../../inputFiles/poromechanics/faultPoroelastic_base.xml" + outputDir = args.outputDir + geosDir = args.geosDir + xmlFilePath = geosDir + "/inputFiles/poromechanics/faultPoroelastic_base.xml" # Extract info from XML hydromechanicalParameters = getHydromechanicalParametersFromXML(xmlFilePath) @@ -82,7 +97,7 @@ def main(): Stress, Pr_i = getCompressiveStressFromXML(xmlFilePath) # Load simulation result for case with impermeable fault - file = open("result_imp.csv") + file = open(outputDir + "/result_imp.csv") csvreader = csv.reader(file) header = next(csvreader) rows = [] @@ -104,7 +119,7 @@ def main(): y_imp[i] = float(rows[i, 26]) # Load simulation result for case with permeable fault - file = open("result_per.csv") + file = open( outputDir + "/result_per.csv") csvreader = csv.reader(file) header = next(csvreader) rows = [] diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py index 63ad214a36f..e56746ce8ae 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py @@ -7,6 +7,8 @@ import math from math import sin, cos, tan, exp, atan, asin from mpl_toolkits.mplot3d import axes3d +import os +import argparse class Sneddon: @@ -87,10 +89,23 @@ def getFractureGeometryFromXML(xmlFilePath): def main(): + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + # File path - hdf5File1Path = "traction_history.hdf5" - hdf5File2Path = "displacementJump_history.hdf5" - xmlFilePath = "../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml" + outputDir = args.outputDir + geosDir = args.geosDir + hdf5File1Path = outputDir + "/traction_history.hdf5" + hdf5File2Path = outputDir + "/displacementJump_history.hdf5" + xmlFilePath = geosDir + "/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml" # Read HDF5 # Global Coordinate of Fracture Element Center diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py index e4c5f331e8c..761d56d7146 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py @@ -7,6 +7,8 @@ import math from math import sin, cos, tan, exp, atan, asin from mpl_toolkits.mplot3d import axes3d +import os +import argparse class Analytical: @@ -78,11 +80,24 @@ def getFractureGeometryFromXML(xmlFilePath): def main(): + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + # File path - hdf5File1Path = "traction_history.hdf5" - hdf5File2Path = "displacementJump_history.hdf5" - xmlFile1Path = "../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml" - xmlFile2Path = "../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_benchmark.xml" + outputDir = args.outputDir + geosDir = args.geosDir + hdf5File1Path = outputDir + "/traction_history.hdf5" + hdf5File2Path = outputDir + "/displacementJump_history.hdf5" + xmlFile1Path = geosDir + "/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml" + xmlFile2Path = geosDir + "/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_benchmark.xml" # Read HDF5 # Global Coordinate of Fracture Element Center diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/sneddonFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/sneddonFigure.py index 5d3db7e4687..f595a1478c4 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/sneddonFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/sneddonFigure.py @@ -5,6 +5,8 @@ import xml.etree.ElementTree as ElementTree from mpmath import * import math +import os +import argparse class Sneddon: @@ -62,8 +64,21 @@ def getFractureLengthFromXML(xmlFilePath): def main(): + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + #-------- EmbeddeFrac File path - hdf5File1Path = "displacementJump_embeddedFrac.hdf5" + outputDir = args.outputDir + geosDir = args.geosDir + hdf5File1Path = outputDir + "/displacementJump_embeddedFrac.hdf5" # Read HDF5 hf = h5py.File(hdf5File1Path, 'r') @@ -96,7 +111,7 @@ def main(): loc_HydroFrac = x[0, :, 1] #-------- Extract info from XML - xmlFilePath = "../../../../../../../inputFiles/efemFractureMechanics/Sneddon_embeddedFrac" + xmlFilePath = geosDir + "/inputFiles/efemFractureMechanics/Sneddon_embeddedFrac" mechanicalParameters = getMechanicalParametersFromXML(xmlFilePath+"_base.xml") appliedPressure = getFracturePressureFromXML(xmlFilePath+"_base.xml") diff --git a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdToughnessDominated/kgdToughnessDominatedFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdToughnessDominated/kgdToughnessDominatedFigure.py index ce6deb2112c..98c7e241dd7 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdToughnessDominated/kgdToughnessDominatedFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdToughnessDominated/kgdToughnessDominatedFigure.py @@ -1,6 +1,9 @@ import sys +import os +import argparse + sys.path.append('../../../../../../../inputFiles/hydraulicFracturing/scripts') import hydrofractureFigure -hydrofractureFigure.main(xmlFilePathPrefix='kgdToughnessDominated') +hydrofractureFigure.main( geosDir='../../../../../../..',xmlFilePrefix='kgdToughnessDominated') diff --git a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationFigure.py index 5ef9337d72a..e16cbbaba83 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationFigure.py @@ -1,10 +1,23 @@ import matplotlib import numpy as np import matplotlib.pyplot as plt +import os +import argparse def main(): + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + outputDir = args.outputDir + + # Experiments (Rubin, 1983) H = 0.055 Tinj = 3.7 @@ -16,7 +29,7 @@ def main(): P58list = [1.677, 4.145, 4.134, 3.507, 3.381, 2.827, 2.292, 1.894, 1.557, 1.345, 1.172, 1.050, 0.949] # Load GEOSX results - GTime, GWellP, G58P, G57P, GAper, GArea = np.loadtxt("model_results.txt", skiprows=1, unpack=True) + GTime, GWellP, G58P, G57P, GAper, GArea = np.loadtxt(outputDir + "/model_results.txt", skiprows=1, unpack=True) GLength = GArea / H * 1000 GTime = GTime + Tinj diff --git a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationQueries.py b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationQueries.py index 18354b98f23..dd2730e3c1f 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationQueries.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationQueries.py @@ -43,9 +43,20 @@ def getMeshSettings(xmlFilePath): def main(): + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + # Load and process GEOSX results # File path - prefix = "../../../../../../../inputFiles/hydraulicFracturing/" + prefix = geosDir + "/inputFiles/hydraulicFracturing/" hdf5File = prefix + "KGD_validation_output.hdf5" xmlFile1Path = prefix + "kgdValidation_base.xml" xmlFile2Path = prefix + "kgdValidation_benchmark.xml" diff --git a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdViscosityDominated/kgdViscosityDominatedFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdViscosityDominated/kgdViscosityDominatedFigure.py index f27bdd261c4..94fca42b18e 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdViscosityDominated/kgdViscosityDominatedFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdViscosityDominated/kgdViscosityDominatedFigure.py @@ -1,6 +1,8 @@ import sys +import os +import argparse sys.path.append('../../../../../../../inputFiles/hydraulicFracturing/scripts') import hydrofractureFigure -hydrofractureFigure.main(xmlFilePathPrefix='kgdViscosityDominated') +hydrofractureFigure.main( geosDir='../../../../../../..',xmlFilePrefix='kgdViscosityDominated') diff --git a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pennyFracToughnessDominated/pennyShapedToughnessDominatedFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pennyFracToughnessDominated/pennyShapedToughnessDominatedFigure.py index 79da99b2b64..1fbe44c6ddf 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pennyFracToughnessDominated/pennyShapedToughnessDominatedFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pennyFracToughnessDominated/pennyShapedToughnessDominatedFigure.py @@ -1,6 +1,8 @@ import sys +import os +import argparse sys.path.append('../../../../../../../inputFiles/hydraulicFracturing/scripts') import hydrofractureFigure -hydrofractureFigure.main(xmlFilePathPrefix='pennyShapedToughnessDominated') +hydrofractureFigure.main( geosDir='../../../../../../..',xmlFilePrefix='pennyShapedToughnessDominated') diff --git a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pennyFracViscosityDominated/pennyShapedViscosityDominatedFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pennyFracViscosityDominated/pennyShapedViscosityDominatedFigure.py index 8f1e331a3c4..a2ca7bea56f 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pennyFracViscosityDominated/pennyShapedViscosityDominatedFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pennyFracViscosityDominated/pennyShapedViscosityDominatedFigure.py @@ -1,6 +1,8 @@ import sys +import os +import argparse sys.path.append('../../../../../../../inputFiles/hydraulicFracturing/scripts') import hydrofractureFigure -hydrofractureFigure.main(xmlFilePathPrefix='pennyShapedViscosityDominated') +hydrofractureFigure.main( geosDir='../../../../../../..',xmlFilePrefix='pennyShapedViscosityDominated') diff --git a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pknFracViscosityDominated/pknViscosityDominatedFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pknFracViscosityDominated/pknViscosityDominatedFigure.py index 3fe908fb9f8..824b5c3dfe8 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pknFracViscosityDominated/pknViscosityDominatedFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/pknFracViscosityDominated/pknViscosityDominatedFigure.py @@ -1,6 +1,8 @@ import sys +import os +import argparse sys.path.append('../../../../../../../inputFiles/hydraulicFracturing/scripts') import hydrofractureFigure -hydrofractureFigure.main(xmlFilePathPrefix='pknViscosityDominated') +hydrofractureFigure.main( geosDir='../../../../../../..',xmlFilePrefix='pknViscosityDominated') diff --git a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/proppantSlotTest/proppantSlotTestFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/proppantSlotTest/proppantSlotTestFigure.py index 39e494eb0e0..5a528ad123e 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/proppantSlotTest/proppantSlotTestFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/proppantSlotTest/proppantSlotTestFigure.py @@ -2,14 +2,27 @@ import matplotlib import numpy as np import matplotlib.pyplot as plt +import os +import argparse def main(): - eTime, eLength, eArea = np.loadtxt("experiment-data.txt", skiprows=0, unpack=True) - esTime, esArea = np.loadtxt("experiment-data2.txt", skiprows=0, unpack=True) - dTime, dLength, dArea = np.loadtxt("model-results.txt", skiprows=1, unpack=True) - sTime, sArea = np.loadtxt("model-results2.txt", skiprows=1, unpack=True) + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + outputDir = args.outputDir + + eTime, eLength, eArea = np.loadtxt(outputDir + "/experiment-data.txt", skiprows=0, unpack=True) + esTime, esArea = np.loadtxt(outputDir + "/experiment-data2.txt", skiprows=0, unpack=True) + + dTime, dLength, dArea = np.loadtxt(outputDir + "/model-results.txt", skiprows=1, unpack=True) + sTime, sArea = np.loadtxt(outputDir + "/model-results2.txt", skiprows=1, unpack=True) # offSize is the size of the bounday cell which should be excluded from the model domain offSize = 0.0127 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/Example.rst index ea1107077f7..a0fb9047a0c 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/Example.rst @@ -267,6 +267,7 @@ The figure below compares the results from GEOS (marks) and the corresponding an .. plot:: docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/mandelFigure.py +.. note:: The python script included above is used to generate the figure shown here. If you want to run this script to verify your results, you will need to run the script from your output directory, and modify the path to the variables `xmlFile1Path` and `xmlFile1Path` in the script to point to the location of the input files on your system. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/mandelFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/mandelFigure.py index b484b5bda99..737c8680836 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/mandelFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/mandelFigure.py @@ -7,7 +7,8 @@ import math from math import sin, cos, tan, exp, atan, asin from scipy.optimize import newton - +import os +import argparse class Mandel: @@ -140,11 +141,25 @@ def getGeometryFromXML(xmlFilePath): def main(): + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + # File path - hdf5File1Path = "pressure_history.hdf5" - hdf5File2Path = "displacement_history.hdf5" - xmlFile1Path = "../../../../../../../inputFiles/poromechanics/PoroElastic_Mandel_base.xml" - xmlFile2Path = "../../../../../../../inputFiles/poromechanics/PoroElastic_Mandel_benchmark_fim.xml" + outputDir = args.outputDir + geosDir = args.geosDir + hdf5File1Path = outputDir + "/pressure_history.hdf5" + hdf5File2Path = outputDir + "/displacement_history.hdf5" + xmlFile1Path = geosDir + "/inputFiles/poromechanics/PoroElastic_Mandel_base.xml" + xmlFile2Path = geosDir + "/inputFiles/poromechanics/PoroElastic_Mandel_benchmark_fim.xml" # Read HDF5 # Global Coordinate of Element Center diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/DruckerPrager/TriaxialDriver_vs_SemiAnalytic_DruckerPrager.py b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/DruckerPrager/TriaxialDriver_vs_SemiAnalytic_DruckerPrager.py index 4c15b4b910f..454ba85d837 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/DruckerPrager/TriaxialDriver_vs_SemiAnalytic_DruckerPrager.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/DruckerPrager/TriaxialDriver_vs_SemiAnalytic_DruckerPrager.py @@ -3,240 +3,255 @@ import numpy as np import matplotlib.pyplot as plt import xml.etree.ElementTree as ElementTree +import os +import argparse def main(): - # File paths - path = "DruckerPragerResults.txt" - xmlFilePath = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_base.xml" - xmlFilePath_case = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_DruckerPrager.xml" - imposedStrainFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/axialStrain.geos" - imposedStressFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/radialStress.geos" - - # Load GEOSX results - time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( - path, skiprows=5, unpack=True) - - # Extract mechanical parameters from XML files - tree = ElementTree.parse(xmlFilePath) - tree_case = ElementTree.parse(xmlFilePath_case) - model = tree_case.find('Tasks/TriaxialDriver') - param = tree.find('Constitutive/DruckerPrager') - - bulkModulus = float(param.get("defaultBulkModulus")) - shearModulus = float(param.get("defaultShearModulus")) - cohesion = float(param.get("defaultCohesion")) - frictionAngle = float(param.get("defaultFrictionAngle")) - dilationAngle = float(param.get("defaultDilationAngle")) - hardeningRate = float(param.get("defaultHardeningRate")) - initialStress = float(model.get("initialStress")) - - # Compute Lame modulus and Young modulus - lameModulus = bulkModulus - 2.0/3.0*shearModulus - youngModulus = 1.0 / ( 1.0/9.0/bulkModulus + 1.0/3.0/shearModulus ) - - # Friction and cohesion parameters - frictionAngleRad = frictionAngle*3.1416/180.0 - cosFrictionAngle = np.cos(frictionAngleRad) - sinFrictionAngle = np.sin(frictionAngleRad) - a = 6.0*cohesion*cosFrictionAngle/(3.0-sinFrictionAngle) - b = 6.0*sinFrictionAngle/(3.0-sinFrictionAngle) - - # Dilation parameter - dilationAngleRad = dilationAngle*np.pi/180.0 - cosDilationAngle = np.cos(dilationAngleRad) - sinDilationAngle = np.sin(dilationAngleRad) - b_dilation = 6.0*sinDilationAngle/(3.0-sinDilationAngle) - - # Elasto-plastic moduli for plastic yield during the loading period - plasticYoungModulus = 1.0 / ( 1.0/youngModulus + (b_dilation-3.0)*(b-3.0)/9.0/hardeningRate ) - plasticModulusForRaStrain = 1.0 / ( 1.0/2.0/shearModulus - (b-3.0)/2.0/hardeningRate ) - - # Elasto-plastic moduli for plastic yield during the unloading period - plasticYoungModulus_unload = 1.0 / ( 1.0/youngModulus + (b_dilation+3.0)*(b+3.0)/9.0/hardeningRate ) - plasticModulusForRaStrain_unload = 1.0 / ( 1.0/2.0/shearModulus + (b+3.0)/2.0/hardeningRate ) - - # Extract axial strain loading from input tables - imp_strain = np.loadtxt( - imposedStrainFilePath, skiprows=0, unpack=True) - - list_ax_strain_anal = [] - numStepPerLoadingPeriod = 1000 - - for i in range(0,len(imp_strain)-1): - dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod - loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) - list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) - - # Extract radial stress loading from input tables - imp_stress = np.loadtxt( - imposedStressFilePath, skiprows=0, unpack=True) - - list_ra_stress_anal = imp_stress[0]*np.ones(len(list_ax_strain_anal)) #constant radial confining stress - - # Initiate radial strain and axial stress arrays - list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) - list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) - list_ax_stress_anal[0] = initialStress - list_ra_strain_anal[0] = 0 - - # Loop over the loading/unloading steps - for idx in range(1,len(list_ax_strain_anal)): - delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] - delta_ra_stress_anal = 0 # constant radial confining stress - - # Elastic trial - delta_ra_strain_anal = ( delta_ra_stress_anal - lameModulus*delta_ax_strain_anal ) / ( 2.0*lameModulus + 2.0*shearModulus ) - delta_ax_stress_anal = ( lameModulus + 2.0*shearModulus )*delta_ax_strain_anal + lameModulus/( lameModulus + shearModulus ) * ( delta_ra_stress_anal - lameModulus*delta_ax_strain_anal ) - - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Compute mean and shear stresses - ra_stress_anal = list_ra_stress_anal[idx] - - p_anal = (ax_stress_anal + 2.0 * ra_stress_anal) / 3.0 - q_anal = -(ax_stress_anal - ra_stress_anal) - - # Plastic correction - if(q_anal>=0): #loading - F_anal = q_anal + b*p_anal - a - - if(F_anal>=0): - # Compute stress and strain variations - delta_ax_stress_anal = delta_ax_strain_anal * plasticYoungModulus - delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / plasticModulusForRaStrain - - # Compute stress and strain at actual loading step - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Update plastic cohesion - delta_a = (b-3.0)/3.0*delta_ax_stress_anal - a += delta_a - - else: #unloading - F_anal = -q_anal + b*p_anal - a # negative sign added to q for q<0 to obtain the absolute value - - if(F_anal>=0): - # Compute stress and strain variations - delta_ax_stress_anal = delta_ax_strain_anal * plasticYoungModulus_unload - delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / plasticModulusForRaStrain_unload - - # Compute stress and strain at actual loading step - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Update plastic cohesion - delta_a = (b+3.0)/3.0*delta_ax_stress_anal - a += delta_a - - list_ax_stress_anal[idx] = ax_stress_anal - list_ra_strain_anal[idx] = ra_strain_anal - - # Preparing data for visualizing semi-analytical results - list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 - list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) - - list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal - - p_num = (ax_stress + 2.0 * ra_stress1) / 3.0 - q_num = -(ax_stress - ra_stress1) - - strain_vol = ax_strain + 2.0 * ra_strain1 - - #Visualization parameters - fsize = 30 - msize = 12 - lw = 6 - malpha = 0.5 - fig, ax = plt.subplots(1, 3, figsize=(37, 10)) - cmap = plt.get_cmap("tab10") - - # Plot strain versus shear stress - ax[0].plot(-ax_strain * 100, #convert to % - q_num*1e-6, #convert to MPa - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[0].plot(-ra_strain1 * 100, - q_num*1e-6, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha) - ax[0].plot(-list_ax_strain_anal* 100, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[0].plot(-list_ra_strain_anal * 100, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - linewidth=6) - ax[0].set_xlabel(r'Strain (%)', size=fsize, weight="bold") - ax[0].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") - ax[0].xaxis.set_tick_params(labelsize=fsize) - ax[0].yaxis.set_tick_params(labelsize=fsize) - - # Plot axial strain versus volumetric strain - ax[1].plot(-ax_strain * 100, - -strain_vol * 100, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[1].plot(-list_ax_strain_anal* 100, - -list_strain_vol_anal* 100, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") - ax[1].set_ylabel(r'Volumetric Strain (%)', size=fsize, weight="bold") - #ax[1].legend(loc='lower right', fontsize=fsize) - ax[1].xaxis.set_tick_params(labelsize=fsize) - ax[1].yaxis.set_tick_params(labelsize=fsize) - - # Plot shear stress versus mean stress - ax[2].plot(-p_num*1e-6, - q_num*1e-6, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[2].plot(-list_p_anal*1e-6, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[2].set_xlabel(r'Mean stress (MPa)', size=fsize, weight="bold") - ax[2].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") - ax[2].legend(loc='lower right', fontsize=fsize) - ax[2].xaxis.set_tick_params(labelsize=fsize) - ax[2].yaxis.set_tick_params(labelsize=fsize) - - plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) - plt.show() + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + # File paths + outputDir = args.outputDir + geosDir = args.geosDir + path = outputDir + "/DruckerPragerResults.txt" + xmlFilePath = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_base.xml" + xmlFilePath_case = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_DruckerPrager.xml" + imposedStrainFilePath = geosDir + "/inputFiles/triaxialDriver/tables/axialStrain.geos" + imposedStressFilePath = geosDir + "/inputFiles/triaxialDriver/tables/radialStress.geos" + + # Load GEOSX results + time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( + path, skiprows=5, unpack=True) + + # Extract mechanical parameters from XML files + tree = ElementTree.parse(xmlFilePath) + tree_case = ElementTree.parse(xmlFilePath_case) + model = tree_case.find('Tasks/TriaxialDriver') + param = tree.find('Constitutive/DruckerPrager') + + bulkModulus = float(param.get("defaultBulkModulus")) + shearModulus = float(param.get("defaultShearModulus")) + cohesion = float(param.get("defaultCohesion")) + frictionAngle = float(param.get("defaultFrictionAngle")) + dilationAngle = float(param.get("defaultDilationAngle")) + hardeningRate = float(param.get("defaultHardeningRate")) + initialStress = float(model.get("initialStress")) + + # Compute Lame modulus and Young modulus + lameModulus = bulkModulus - 2.0/3.0*shearModulus + youngModulus = 1.0 / ( 1.0/9.0/bulkModulus + 1.0/3.0/shearModulus ) + + # Friction and cohesion parameters + frictionAngleRad = frictionAngle*3.1416/180.0 + cosFrictionAngle = np.cos(frictionAngleRad) + sinFrictionAngle = np.sin(frictionAngleRad) + a = 6.0*cohesion*cosFrictionAngle/(3.0-sinFrictionAngle) + b = 6.0*sinFrictionAngle/(3.0-sinFrictionAngle) + + # Dilation parameter + dilationAngleRad = dilationAngle*np.pi/180.0 + cosDilationAngle = np.cos(dilationAngleRad) + sinDilationAngle = np.sin(dilationAngleRad) + b_dilation = 6.0*sinDilationAngle/(3.0-sinDilationAngle) + + # Elasto-plastic moduli for plastic yield during the loading period + plasticYoungModulus = 1.0 / ( 1.0/youngModulus + (b_dilation-3.0)*(b-3.0)/9.0/hardeningRate ) + plasticModulusForRaStrain = 1.0 / ( 1.0/2.0/shearModulus - (b-3.0)/2.0/hardeningRate ) + + # Elasto-plastic moduli for plastic yield during the unloading period + plasticYoungModulus_unload = 1.0 / ( 1.0/youngModulus + (b_dilation+3.0)*(b+3.0)/9.0/hardeningRate ) + plasticModulusForRaStrain_unload = 1.0 / ( 1.0/2.0/shearModulus + (b+3.0)/2.0/hardeningRate ) + + # Extract axial strain loading from input tables + imp_strain = np.loadtxt( + imposedStrainFilePath, skiprows=0, unpack=True) + + list_ax_strain_anal = [] + numStepPerLoadingPeriod = 1000 + + for i in range(0,len(imp_strain)-1): + dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod + loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) + list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) + + # Extract radial stress loading from input tables + imp_stress = np.loadtxt( + imposedStressFilePath, skiprows=0, unpack=True) + + list_ra_stress_anal = imp_stress[0]*np.ones(len(list_ax_strain_anal)) #constant radial confining stress + + # Initiate radial strain and axial stress arrays + list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) + list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) + list_ax_stress_anal[0] = initialStress + list_ra_strain_anal[0] = 0 + + # Loop over the loading/unloading steps + for idx in range(1,len(list_ax_strain_anal)): + delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] + delta_ra_stress_anal = 0 # constant radial confining stress + + # Elastic trial + delta_ra_strain_anal = ( delta_ra_stress_anal - lameModulus*delta_ax_strain_anal ) / ( 2.0*lameModulus + 2.0*shearModulus ) + delta_ax_stress_anal = ( lameModulus + 2.0*shearModulus )*delta_ax_strain_anal + lameModulus/( lameModulus + shearModulus ) * ( delta_ra_stress_anal - lameModulus*delta_ax_strain_anal ) + + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Compute mean and shear stresses + ra_stress_anal = list_ra_stress_anal[idx] + + p_anal = (ax_stress_anal + 2.0 * ra_stress_anal) / 3.0 + q_anal = -(ax_stress_anal - ra_stress_anal) + + # Plastic correction + if(q_anal>=0): #loading + F_anal = q_anal + b*p_anal - a + + if(F_anal>=0): + # Compute stress and strain variations + delta_ax_stress_anal = delta_ax_strain_anal * plasticYoungModulus + delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / plasticModulusForRaStrain + + # Compute stress and strain at actual loading step + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Update plastic cohesion + delta_a = (b-3.0)/3.0*delta_ax_stress_anal + a += delta_a + + else: #unloading + F_anal = -q_anal + b*p_anal - a # negative sign added to q for q<0 to obtain the absolute value + + if(F_anal>=0): + # Compute stress and strain variations + delta_ax_stress_anal = delta_ax_strain_anal * plasticYoungModulus_unload + delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / plasticModulusForRaStrain_unload + + # Compute stress and strain at actual loading step + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Update plastic cohesion + delta_a = (b+3.0)/3.0*delta_ax_stress_anal + a += delta_a + + list_ax_stress_anal[idx] = ax_stress_anal + list_ra_strain_anal[idx] = ra_strain_anal + + # Preparing data for visualizing semi-analytical results + list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 + list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) + + list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal + + p_num = (ax_stress + 2.0 * ra_stress1) / 3.0 + q_num = -(ax_stress - ra_stress1) + + strain_vol = ax_strain + 2.0 * ra_strain1 + + #Visualization parameters + fsize = 30 + msize = 12 + lw = 6 + malpha = 0.5 + fig, ax = plt.subplots(1, 3, figsize=(37, 10)) + cmap = plt.get_cmap("tab10") + + # Plot strain versus shear stress + ax[0].plot(-ax_strain * 100, #convert to % + q_num*1e-6, #convert to MPa + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[0].plot(-ra_strain1 * 100, + q_num*1e-6, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha) + ax[0].plot(-list_ax_strain_anal* 100, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[0].plot(-list_ra_strain_anal * 100, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + linewidth=6) + ax[0].set_xlabel(r'Strain (%)', size=fsize, weight="bold") + ax[0].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") + ax[0].xaxis.set_tick_params(labelsize=fsize) + ax[0].yaxis.set_tick_params(labelsize=fsize) + + # Plot axial strain versus volumetric strain + ax[1].plot(-ax_strain * 100, + -strain_vol * 100, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[1].plot(-list_ax_strain_anal* 100, + -list_strain_vol_anal* 100, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") + ax[1].set_ylabel(r'Volumetric Strain (%)', size=fsize, weight="bold") + #ax[1].legend(loc='lower right', fontsize=fsize) + ax[1].xaxis.set_tick_params(labelsize=fsize) + ax[1].yaxis.set_tick_params(labelsize=fsize) + + # Plot shear stress versus mean stress + ax[2].plot(-p_num*1e-6, + q_num*1e-6, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[2].plot(-list_p_anal*1e-6, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[2].set_xlabel(r'Mean stress (MPa)', size=fsize, weight="bold") + ax[2].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") + ax[2].legend(loc='lower right', fontsize=fsize) + ax[2].xaxis.set_tick_params(labelsize=fsize) + ax[2].yaxis.set_tick_params(labelsize=fsize) + + plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) + plt.show() if __name__ == "__main__": main() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ExtendedDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ExtendedDruckerPrager.py b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ExtendedDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ExtendedDruckerPrager.py index e55ccc04526..6589ac70c4a 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ExtendedDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ExtendedDruckerPrager.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ExtendedDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ExtendedDruckerPrager.py @@ -3,258 +3,273 @@ import numpy as np import matplotlib.pyplot as plt import xml.etree.ElementTree as ElementTree +import os +import argparse def main(): - # File paths - path = "ExtendedDruckerPragerResults.txt" - xmlFilePath = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_base.xml" - xmlFilePath_case = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_ExtendedDruckerPrager.xml" - imposedStrainFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/axialStrain.geos" - imposedStressFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/radialStress.geos" - - # Load GEOSX results - time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( - path, skiprows=5, unpack=True) - - # Extract mechanical parameters from XML file - tree = ElementTree.parse(xmlFilePath) - tree_case = ElementTree.parse(xmlFilePath_case) - model = tree_case.find('Tasks/TriaxialDriver') - param = tree.find('Constitutive/ExtendedDruckerPrager') - - bulkModulus = float(param.get("defaultBulkModulus")) - shearModulus = float(param.get("defaultShearModulus")) - cohesion = float(param.get("defaultCohesion")) - initialFrictionAngle = float(param.get("defaultInitialFrictionAngle")) - residualFrictionAngle = float(param.get("defaultResidualFrictionAngle")) - hardeningParameter = float(param.get("defaultHardening")) - dilationRatio = float(param.get("defaultDilationRatio")) - initialStress = float(model.get("initialStress")) - - # Compute Lame modulus and Young modulus - lameModulus = bulkModulus - 2.0/3.0*shearModulus - youngModulus = 1.0 / ( 1.0/9.0/bulkModulus + 1.0/3.0/shearModulus ) - - # Friction and cohesion parameters - initialFrictionAngleRad = initialFrictionAngle * np.pi / 180.0 - cosInitialFrictionAngle = np.cos(initialFrictionAngleRad) - sinInitialFrictionAngle = np.sin(initialFrictionAngleRad) - a_init = 6.0*cohesion*cosInitialFrictionAngle / ( 3.0 - sinInitialFrictionAngle ) - b_init = 6.0*sinInitialFrictionAngle / ( 3.0 - sinInitialFrictionAngle ) - - residualFrictionAngleRad = residualFrictionAngle * np.pi / 180.0 - sinResidualFrictionAngle = np.sin(residualFrictionAngleRad) - b_resi = 6.0*sinResidualFrictionAngle/(3.0-sinResidualFrictionAngle) - - # Extract loading from input tables - imp_strain = np.loadtxt( - imposedStrainFilePath, skiprows=0, unpack=True) - - list_ax_strain_anal = [] - numStepPerLoadingPeriod = 1000 - - for i in range(0,len(imp_strain)-1): - dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod - loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) - list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) - - # Extract radial stress loading from input tables - imp_stress = np.loadtxt( - imposedStressFilePath, skiprows=0, unpack=True) - - list_ra_stress_anal = imp_stress[0]*np.ones(len(list_ax_strain_anal)) #constant radial confining stress - - # Initiate radial strain and axial stress arrays - list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) - list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) - list_ax_stress_anal[0] = initialStress - list_ra_strain_anal[0] = 0 - - - # Loop over the loading/unloading steps - plasticMultiplier = 0 - b = b_init - - for idx in range(1,len(list_ax_strain_anal)): - delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] - delta_ra_stress_anal = 0 # constant lateral confining stress - - # Elastic trial - delta_ra_strain_anal = ( delta_ra_stress_anal - lameModulus*delta_ax_strain_anal ) / ( 2.0*lameModulus + 2.0*shearModulus ) - delta_ax_stress_anal = ( lameModulus + 2.0*shearModulus )*delta_ax_strain_anal + lameModulus/( lameModulus + shearModulus )*( delta_ra_stress_anal - lameModulus*delta_ax_strain_anal ) - - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Compute mean and shear stresses - ra_stress_anal = list_ra_stress_anal[idx] - - p_anal = (ax_stress_anal + 2.0 * ra_stress_anal) / 3.0 - q_anal = -(ax_stress_anal - ra_stress_anal) - - # Plastic correction - if(q_anal>=0): #loading - - F_anal = q_anal + b*p_anal - b*a_init/b_init - - if(F_anal>=0): - b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) - dF_db = p_anal - a_init/b_init - db_dlambda = hardeningParameter * (b_resi - b_init) / ( hardeningParameter + plasticMultiplier ) / ( hardeningParameter + plasticMultiplier ) - hardeningRate = -dF_db*db_dlambda - - # Elasto-plastic moduli for plastic yield during the loading period - plasticYoungModulus = 1.0 / ( 1.0/youngModulus + (b*dilationRatio-3.0)*(b-3.0)/9.0/hardeningRate ) - plasticModulusForRaStrain = 1.0 / ( 1.0/2.0/shearModulus - (b-3.0)/2.0/hardeningRate ) - - # Compute stress and strain variations - delta_ax_stress_anal = delta_ax_strain_anal*plasticYoungModulus - delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / plasticModulusForRaStrain - - # Compute stress and strain at actual loading step - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Update plastic multiplier - delta_lambda = (b-3.0)/3.0/hardeningRate*delta_ax_stress_anal - plasticMultiplier += delta_lambda - - else: #unloading - - F_anal = -q_anal + b*p_anal - b*a_init/b_init # negative sign added to q for q<0 to obtain the absolute value - - if(F_anal>=0): - b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) - dF_db = p_anal - a_init/b_init - db_dlambda = hardeningParameter * (b_resi - b_init) / (hardeningParameter+plasticMultiplier) / (hardeningParameter+plasticMultiplier) - hardeningRate = -dF_db*db_dlambda - - # Elasto-plastic moduli for plastic yield during the unloading period - plasticYoungModulus_unload = 1.0/(1.0/youngModulus + (b*dilationRatio+3.0)*(b+3.0)/9.0/hardeningRate) - plasticModulusForRaStrain_unload = 1.0/(1.0/2.0/shearModulus + (b+3.0)/2.0/hardeningRate) - - # Compute stress and strain variations - delta_ax_stress_anal = delta_ax_strain_anal*plasticYoungModulus_unload - delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / plasticModulusForRaStrain_unload - - # Compute stress and strain at actual loading step - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Update plastic multiplier - delta_lambda = (b+3.0)/3.0/hardeningRate*delta_ax_stress_anal - plasticMultiplier += delta_lambda - - list_ax_stress_anal[idx] = ax_stress_anal - list_ra_strain_anal[idx] = ra_strain_anal - - # Preparing data for visualizing semi-analytical results - list_p_anal = -(list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 - list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) - - list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal - - p_num = -(ax_stress + 2.0 * ra_stress1) / 3.0 - q_num = -(ax_stress - ra_stress1) - - strain_vol = ax_strain + 2.0 * ra_strain1 - - #Visualization parameters - fsize = 30 - msize = 12 - lw = 6 - malpha = 0.5 - fig, ax = plt.subplots(1, 3, figsize=(37, 10)) - cmap = plt.get_cmap("tab10") - - # Plot strain versus shear stress - ax[0].plot(-ax_strain * 100, #convert to % - q_num*1e-6, #convert to MPa - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[0].plot(-ra_strain1 * 100, - q_num*1e-6, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha) - ax[0].plot(-list_ax_strain_anal* 100, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[0].plot(-list_ra_strain_anal * 100, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - linewidth=6) - ax[0].set_xlabel(r'Strain (%)', size=fsize, weight="bold") - ax[0].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") - #ax[0].legend(loc='lower right', fontsize=fsize) - ax[0].xaxis.set_tick_params(labelsize=fsize) - ax[0].yaxis.set_tick_params(labelsize=fsize) - - # Plot axial strain versus volumetric strain - ax[1].plot(-ax_strain * 100, - -strain_vol * 100, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[1].plot(-list_ax_strain_anal* 100, - -list_strain_vol_anal* 100, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") - ax[1].set_ylabel(r'Volumetric Strain (%)', size=fsize, weight="bold") - #ax[1].legend(loc='lower right', fontsize=fsize) - ax[1].xaxis.set_tick_params(labelsize=fsize) - ax[1].yaxis.set_tick_params(labelsize=fsize) - - - # Plot shear stress versus mean stress - ax[2].plot(p_num*1e-6, - q_num*1e-6, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[2].plot(list_p_anal*1e-6, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[2].set_xlabel(r'Mean stress (MPa)', size=fsize, weight="bold") - ax[2].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") - ax[2].legend(loc='lower right', fontsize=fsize) - ax[2].xaxis.set_tick_params(labelsize=fsize) - ax[2].yaxis.set_tick_params(labelsize=fsize) - - plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) - - plt.show() + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + # File paths + outputDir = args.outputDir + geosDir = args.geosDir + path = outputDir + "/ExtendedDruckerPragerResults.txt" + xmlFilePath = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_base.xml" + xmlFilePath_case = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_ExtendedDruckerPrager.xml" + imposedStrainFilePath = geosDir + "/inputFiles/triaxialDriver/tables/axialStrain.geos" + imposedStressFilePath = geosDir + "/inputFiles/triaxialDriver/tables/radialStress.geos" + + # Load GEOSX results + time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( + path, skiprows=5, unpack=True) + + # Extract mechanical parameters from XML file + tree = ElementTree.parse(xmlFilePath) + tree_case = ElementTree.parse(xmlFilePath_case) + model = tree_case.find('Tasks/TriaxialDriver') + param = tree.find('Constitutive/ExtendedDruckerPrager') + + bulkModulus = float(param.get("defaultBulkModulus")) + shearModulus = float(param.get("defaultShearModulus")) + cohesion = float(param.get("defaultCohesion")) + initialFrictionAngle = float(param.get("defaultInitialFrictionAngle")) + residualFrictionAngle = float(param.get("defaultResidualFrictionAngle")) + hardeningParameter = float(param.get("defaultHardening")) + dilationRatio = float(param.get("defaultDilationRatio")) + initialStress = float(model.get("initialStress")) + + # Compute Lame modulus and Young modulus + lameModulus = bulkModulus - 2.0/3.0*shearModulus + youngModulus = 1.0 / ( 1.0/9.0/bulkModulus + 1.0/3.0/shearModulus ) + + # Friction and cohesion parameters + initialFrictionAngleRad = initialFrictionAngle * np.pi / 180.0 + cosInitialFrictionAngle = np.cos(initialFrictionAngleRad) + sinInitialFrictionAngle = np.sin(initialFrictionAngleRad) + a_init = 6.0*cohesion*cosInitialFrictionAngle / ( 3.0 - sinInitialFrictionAngle ) + b_init = 6.0*sinInitialFrictionAngle / ( 3.0 - sinInitialFrictionAngle ) + + residualFrictionAngleRad = residualFrictionAngle * np.pi / 180.0 + sinResidualFrictionAngle = np.sin(residualFrictionAngleRad) + b_resi = 6.0*sinResidualFrictionAngle/(3.0-sinResidualFrictionAngle) + + # Extract loading from input tables + imp_strain = np.loadtxt( + imposedStrainFilePath, skiprows=0, unpack=True) + + list_ax_strain_anal = [] + numStepPerLoadingPeriod = 1000 + + for i in range(0,len(imp_strain)-1): + dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod + loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) + list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) + + # Extract radial stress loading from input tables + imp_stress = np.loadtxt( + imposedStressFilePath, skiprows=0, unpack=True) + + list_ra_stress_anal = imp_stress[0]*np.ones(len(list_ax_strain_anal)) #constant radial confining stress + + # Initiate radial strain and axial stress arrays + list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) + list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) + list_ax_stress_anal[0] = initialStress + list_ra_strain_anal[0] = 0 + + + # Loop over the loading/unloading steps + plasticMultiplier = 0 + b = b_init + + for idx in range(1,len(list_ax_strain_anal)): + delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] + delta_ra_stress_anal = 0 # constant lateral confining stress + + # Elastic trial + delta_ra_strain_anal = ( delta_ra_stress_anal - lameModulus*delta_ax_strain_anal ) / ( 2.0*lameModulus + 2.0*shearModulus ) + delta_ax_stress_anal = ( lameModulus + 2.0*shearModulus )*delta_ax_strain_anal + lameModulus/( lameModulus + shearModulus )*( delta_ra_stress_anal - lameModulus*delta_ax_strain_anal ) + + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Compute mean and shear stresses + ra_stress_anal = list_ra_stress_anal[idx] + + p_anal = (ax_stress_anal + 2.0 * ra_stress_anal) / 3.0 + q_anal = -(ax_stress_anal - ra_stress_anal) + + # Plastic correction + if(q_anal>=0): #loading + + F_anal = q_anal + b*p_anal - b*a_init/b_init + + if(F_anal>=0): + b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) + dF_db = p_anal - a_init/b_init + db_dlambda = hardeningParameter * (b_resi - b_init) / ( hardeningParameter + plasticMultiplier ) / ( hardeningParameter + plasticMultiplier ) + hardeningRate = -dF_db*db_dlambda + + # Elasto-plastic moduli for plastic yield during the loading period + plasticYoungModulus = 1.0 / ( 1.0/youngModulus + (b*dilationRatio-3.0)*(b-3.0)/9.0/hardeningRate ) + plasticModulusForRaStrain = 1.0 / ( 1.0/2.0/shearModulus - (b-3.0)/2.0/hardeningRate ) + + # Compute stress and strain variations + delta_ax_stress_anal = delta_ax_strain_anal*plasticYoungModulus + delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / plasticModulusForRaStrain + + # Compute stress and strain at actual loading step + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Update plastic multiplier + delta_lambda = (b-3.0)/3.0/hardeningRate*delta_ax_stress_anal + plasticMultiplier += delta_lambda + + else: #unloading + + F_anal = -q_anal + b*p_anal - b*a_init/b_init # negative sign added to q for q<0 to obtain the absolute value + + if(F_anal>=0): + b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) + dF_db = p_anal - a_init/b_init + db_dlambda = hardeningParameter * (b_resi - b_init) / (hardeningParameter+plasticMultiplier) / (hardeningParameter+plasticMultiplier) + hardeningRate = -dF_db*db_dlambda + + # Elasto-plastic moduli for plastic yield during the unloading period + plasticYoungModulus_unload = 1.0/(1.0/youngModulus + (b*dilationRatio+3.0)*(b+3.0)/9.0/hardeningRate) + plasticModulusForRaStrain_unload = 1.0/(1.0/2.0/shearModulus + (b+3.0)/2.0/hardeningRate) + + # Compute stress and strain variations + delta_ax_stress_anal = delta_ax_strain_anal*plasticYoungModulus_unload + delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / plasticModulusForRaStrain_unload + + # Compute stress and strain at actual loading step + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Update plastic multiplier + delta_lambda = (b+3.0)/3.0/hardeningRate*delta_ax_stress_anal + plasticMultiplier += delta_lambda + + list_ax_stress_anal[idx] = ax_stress_anal + list_ra_strain_anal[idx] = ra_strain_anal + + # Preparing data for visualizing semi-analytical results + list_p_anal = -(list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 + list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) + + list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal + + p_num = -(ax_stress + 2.0 * ra_stress1) / 3.0 + q_num = -(ax_stress - ra_stress1) + + strain_vol = ax_strain + 2.0 * ra_strain1 + + #Visualization parameters + fsize = 30 + msize = 12 + lw = 6 + malpha = 0.5 + fig, ax = plt.subplots(1, 3, figsize=(37, 10)) + cmap = plt.get_cmap("tab10") + + # Plot strain versus shear stress + ax[0].plot(-ax_strain * 100, #convert to % + q_num*1e-6, #convert to MPa + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[0].plot(-ra_strain1 * 100, + q_num*1e-6, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha) + ax[0].plot(-list_ax_strain_anal* 100, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[0].plot(-list_ra_strain_anal * 100, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + linewidth=6) + ax[0].set_xlabel(r'Strain (%)', size=fsize, weight="bold") + ax[0].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") + #ax[0].legend(loc='lower right', fontsize=fsize) + ax[0].xaxis.set_tick_params(labelsize=fsize) + ax[0].yaxis.set_tick_params(labelsize=fsize) + + # Plot axial strain versus volumetric strain + ax[1].plot(-ax_strain * 100, + -strain_vol * 100, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[1].plot(-list_ax_strain_anal* 100, + -list_strain_vol_anal* 100, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") + ax[1].set_ylabel(r'Volumetric Strain (%)', size=fsize, weight="bold") + #ax[1].legend(loc='lower right', fontsize=fsize) + ax[1].xaxis.set_tick_params(labelsize=fsize) + ax[1].yaxis.set_tick_params(labelsize=fsize) + + + # Plot shear stress versus mean stress + ax[2].plot(p_num*1e-6, + q_num*1e-6, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[2].plot(list_p_anal*1e-6, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[2].set_xlabel(r'Mean stress (MPa)', size=fsize, weight="bold") + ax[2].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") + ax[2].legend(loc='lower right', fontsize=fsize) + ax[2].xaxis.set_tick_params(labelsize=fsize) + ax[2].yaxis.set_tick_params(labelsize=fsize) + + plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) + + plt.show() if __name__ == "__main__": main() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ModifiedCamClay/TriaxialDriver_vs_SemiAnalytic_ModifiedCamClay.py b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ModifiedCamClay/TriaxialDriver_vs_SemiAnalytic_ModifiedCamClay.py index d87be34dcad..440c44b3474 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ModifiedCamClay/TriaxialDriver_vs_SemiAnalytic_ModifiedCamClay.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ModifiedCamClay/TriaxialDriver_vs_SemiAnalytic_ModifiedCamClay.py @@ -3,206 +3,221 @@ import numpy as np import matplotlib.pyplot as plt import xml.etree.ElementTree as ElementTree +import os +import argparse def main(): - # File paths - path = "ModifiedCamClayResults.txt" - xmlFilePath = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_base.xml" - xmlFilePath_case = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_ModifiedCamClay.xml" - imposedStrainFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/axialStrain.geos" - - # Load GEOSX results - time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( - path, skiprows=5, unpack=True) - - # Extract mechanical parameters from XML file - tree = ElementTree.parse(xmlFilePath) - tree_case = ElementTree.parse(xmlFilePath_case) - model = tree_case.find('Tasks/TriaxialDriver') - param = tree.find('Constitutive/ModifiedCamClay') - - refPressure = float(param.get("defaultRefPressure")) - refStrainVol = float(param.get("defaultRefStrainVol")) - shearModulus = float(param.get("defaultShearModulus")) - preConsolidationPressure = float(param.get("defaultPreConsolidationPressure")) - cslSlope = float(param.get("defaultCslSlope")) - virginCompressionIndex = float(param.get("defaultVirginCompressionIndex")) - recompressionIndex = float(param.get("defaultRecompressionIndex")) - initialStress = float(model.get("initialStress")) - - # Extract loading from input tables - imp_strain = np.loadtxt( - imposedStrainFilePath, skiprows=0, unpack=True) - - list_ax_strain_anal = [] - numStepPerLoadingPeriod = 10000 - - for i in range(0,len(imp_strain)-1): - dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod - loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) - list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) - - list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) - list_ra_stress_anal = np.zeros(len(list_ax_strain_anal)) - list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) - - p_anal = refPressure - list_ax_strain_anal += refStrainVol # Oedometric compaction: zero lateral strain - list_ax_stress_anal += initialStress # Assuming isotropic initial stress condition - list_ra_stress_anal += initialStress - - for idx in range(1,len(list_ax_strain_anal)): - delta_ax_strain_anal = list_ax_strain_anal[idx]-list_ax_strain_anal[idx-1] - delta_ra_strain_anal = 0 - - # Compute elastic moduli - bulkModulus = - p_anal/recompressionIndex - lameModulus = bulkModulus - 2.0/3.0*shearModulus - - # Elastic trial - delta_ax_stress_anal = (lameModulus+2.0*shearModulus)*delta_ax_strain_anal + 2.0*lameModulus*delta_ra_strain_anal - delta_ra_stress_anal = lameModulus*delta_ax_strain_anal + (2.0*lameModulus+2.0*shearModulus)*delta_ra_strain_anal - - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_stress_anal = list_ra_stress_anal[idx-1] + delta_ra_stress_anal - - p_anal = (ax_stress_anal + 2.0*ra_stress_anal)/3.0 - q_anal = -(ax_stress_anal - ra_stress_anal) - - # Plastic correction - F_anal = q_anal*q_anal + cslSlope*cslSlope*p_anal*(p_anal-preConsolidationPressure) - - if(F_anal>=0): - # Derivatives - dF_dp = cslSlope*cslSlope*(2.0*p_anal-preConsolidationPressure) - dF_dq = 2.0*q_anal - dF_dpc = -cslSlope*cslSlope*p_anal - - dG_dp = dF_dp # associated plastic rule was considered - dG_dq = dF_dq - - dpc_dlambda = -preConsolidationPressure/(virginCompressionIndex-recompressionIndex)*dG_dp - hardeningRate = -dF_dpc*dpc_dlambda - - # Elasto-plastic coefficients - coeff_1 = 1.0/bulkModulus + dG_dp*dF_dp/hardeningRate - coeff_2 = dG_dp*dF_dq/hardeningRate - coeff_3 = 3.0/2.0*dG_dq*dF_dp/hardeningRate - coeff_4 = 1.0/2.0/shearModulus + 3.0/2.0*dG_dq*dF_dq/hardeningRate - denom = coeff_1*coeff_4 - coeff_2*coeff_3 - - # Compute stress variations - delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] - - delta_strain_vol = delta_ax_strain_anal - delta_strain_shear = -delta_ax_strain_anal - delta_p_anal = (coeff_4*delta_strain_vol - coeff_2*delta_strain_shear)/denom - delta_q_anal = (coeff_1*delta_strain_shear - coeff_3*delta_strain_vol)/denom - - delta_ax_stress_anal = (3.0*delta_p_anal-2*delta_q_anal)/3.0 - delta_ra_stress_anal = delta_ax_stress_anal+delta_q_anal - - # Update stress - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_stress_anal = list_ra_stress_anal[idx-1] + delta_ra_stress_anal - - delta_lambda = (dF_dq*delta_q_anal + dF_dp*delta_p_anal)/hardeningRate - delta_pc = dpc_dlambda * delta_lambda - preConsolidationPressure += delta_pc - - p_anal = (ax_stress_anal + 2.0*ra_stress_anal)/3.0 - q_anal = -(ax_stress_anal - ra_stress_anal) - - list_ax_stress_anal[idx] = ax_stress_anal - list_ra_stress_anal[idx] = ra_stress_anal - - list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 - list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) - - list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal - - p_num = (ax_stress + 2.0 * ra_stress1) / 3.0 - q_num = -(ax_stress - ra_stress1) - - #Visualization parameters - fsize = 30 - msize = 12 - lw = 6 - malpha = 0.5 - fig, ax = plt.subplots(1, 3, figsize=(37, 10)) - cmap = plt.get_cmap("tab10") - - ax[0].plot(-ax_strain * 100, #convert to % - -ax_stress*1e-3, #convert to kPa - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[0].plot(-list_ax_strain_anal* 100, - -list_ax_stress_anal*1e-3, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - - ax[0].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") - ax[0].set_ylabel(r'Axial Stress (kPa)', size=fsize, weight="bold") - #ax[0].legend(loc='lower right', fontsize=fsize) - ax[0].xaxis.set_tick_params(labelsize=fsize) - ax[0].yaxis.set_tick_params(labelsize=fsize) - - ax[1].plot(-ax_strain * 100, - -ra_stress1 * 1e-3, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[1].plot(-list_ax_strain_anal* 100, - -list_ra_stress_anal* 1e-3, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") - ax[1].set_ylabel(r'Radial stress (kPa)', size=fsize, weight="bold") - #ax[1].legend(loc='lower right', fontsize=fsize) - ax[1].xaxis.set_tick_params(labelsize=fsize) - ax[1].yaxis.set_tick_params(labelsize=fsize) - - # Plan p-q - ax[2].plot(-p_num*1e-3, - q_num*1e-3, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[2].plot(-list_p_anal*1e-3, - list_q_anal*1e-3, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[2].set_xlabel(r'Mean stress (kPa)', size=fsize, weight="bold") - ax[2].set_ylabel(r'Deviatoric Stress (kPa)', size=fsize, weight="bold") - ax[2].legend(loc='lower right', fontsize=fsize) - ax[2].xaxis.set_tick_params(labelsize=fsize) - ax[2].yaxis.set_tick_params(labelsize=fsize) - - plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) - - plt.show() - + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + # File paths + outputDir = args.outputDir + geosDir = args.geosDir + path = outputDir + "/ModifiedCamClayResults.txt" + xmlFilePath = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_base.xml" + xmlFilePath_case = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_ModifiedCamClay.xml" + imposedStrainFilePath = geosDir + "/inputFiles/triaxialDriver/tables/axialStrain.geos" + + # Load GEOSX results + time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( + path, skiprows=5, unpack=True) + + # Extract mechanical parameters from XML file + tree = ElementTree.parse(xmlFilePath) + tree_case = ElementTree.parse(xmlFilePath_case) + model = tree_case.find('Tasks/TriaxialDriver') + param = tree.find('Constitutive/ModifiedCamClay') + + refPressure = float(param.get("defaultRefPressure")) + refStrainVol = float(param.get("defaultRefStrainVol")) + shearModulus = float(param.get("defaultShearModulus")) + preConsolidationPressure = float(param.get("defaultPreConsolidationPressure")) + cslSlope = float(param.get("defaultCslSlope")) + virginCompressionIndex = float(param.get("defaultVirginCompressionIndex")) + recompressionIndex = float(param.get("defaultRecompressionIndex")) + initialStress = float(model.get("initialStress")) + + # Extract loading from input tables + imp_strain = np.loadtxt( + imposedStrainFilePath, skiprows=0, unpack=True) + + list_ax_strain_anal = [] + numStepPerLoadingPeriod = 10000 + + for i in range(0,len(imp_strain)-1): + dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod + loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) + list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) + + list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) + list_ra_stress_anal = np.zeros(len(list_ax_strain_anal)) + list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) + + p_anal = refPressure + list_ax_strain_anal += refStrainVol # Oedometric compaction: zero lateral strain + list_ax_stress_anal += initialStress # Assuming isotropic initial stress condition + list_ra_stress_anal += initialStress + + for idx in range(1,len(list_ax_strain_anal)): + delta_ax_strain_anal = list_ax_strain_anal[idx]-list_ax_strain_anal[idx-1] + delta_ra_strain_anal = 0 + + # Compute elastic moduli + bulkModulus = - p_anal/recompressionIndex + lameModulus = bulkModulus - 2.0/3.0*shearModulus + + # Elastic trial + delta_ax_stress_anal = (lameModulus+2.0*shearModulus)*delta_ax_strain_anal + 2.0*lameModulus*delta_ra_strain_anal + delta_ra_stress_anal = lameModulus*delta_ax_strain_anal + (2.0*lameModulus+2.0*shearModulus)*delta_ra_strain_anal + + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_stress_anal = list_ra_stress_anal[idx-1] + delta_ra_stress_anal + + p_anal = (ax_stress_anal + 2.0*ra_stress_anal)/3.0 + q_anal = -(ax_stress_anal - ra_stress_anal) + + # Plastic correction + F_anal = q_anal*q_anal + cslSlope*cslSlope*p_anal*(p_anal-preConsolidationPressure) + + if(F_anal>=0): + # Derivatives + dF_dp = cslSlope*cslSlope*(2.0*p_anal-preConsolidationPressure) + dF_dq = 2.0*q_anal + dF_dpc = -cslSlope*cslSlope*p_anal + + dG_dp = dF_dp # associated plastic rule was considered + dG_dq = dF_dq + + dpc_dlambda = -preConsolidationPressure/(virginCompressionIndex-recompressionIndex)*dG_dp + hardeningRate = -dF_dpc*dpc_dlambda + + # Elasto-plastic coefficients + coeff_1 = 1.0/bulkModulus + dG_dp*dF_dp/hardeningRate + coeff_2 = dG_dp*dF_dq/hardeningRate + coeff_3 = 3.0/2.0*dG_dq*dF_dp/hardeningRate + coeff_4 = 1.0/2.0/shearModulus + 3.0/2.0*dG_dq*dF_dq/hardeningRate + denom = coeff_1*coeff_4 - coeff_2*coeff_3 + + # Compute stress variations + delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] + + delta_strain_vol = delta_ax_strain_anal + delta_strain_shear = -delta_ax_strain_anal + delta_p_anal = (coeff_4*delta_strain_vol - coeff_2*delta_strain_shear)/denom + delta_q_anal = (coeff_1*delta_strain_shear - coeff_3*delta_strain_vol)/denom + + delta_ax_stress_anal = (3.0*delta_p_anal-2*delta_q_anal)/3.0 + delta_ra_stress_anal = delta_ax_stress_anal+delta_q_anal + + # Update stress + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_stress_anal = list_ra_stress_anal[idx-1] + delta_ra_stress_anal + + delta_lambda = (dF_dq*delta_q_anal + dF_dp*delta_p_anal)/hardeningRate + delta_pc = dpc_dlambda * delta_lambda + preConsolidationPressure += delta_pc + + p_anal = (ax_stress_anal + 2.0*ra_stress_anal)/3.0 + q_anal = -(ax_stress_anal - ra_stress_anal) + + list_ax_stress_anal[idx] = ax_stress_anal + list_ra_stress_anal[idx] = ra_stress_anal + + list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 + list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) + + list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal + + p_num = (ax_stress + 2.0 * ra_stress1) / 3.0 + q_num = -(ax_stress - ra_stress1) + + #Visualization parameters + fsize = 30 + msize = 12 + lw = 6 + malpha = 0.5 + fig, ax = plt.subplots(1, 3, figsize=(37, 10)) + cmap = plt.get_cmap("tab10") + + ax[0].plot(-ax_strain * 100, #convert to % + -ax_stress*1e-3, #convert to kPa + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[0].plot(-list_ax_strain_anal* 100, + -list_ax_stress_anal*1e-3, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + + ax[0].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") + ax[0].set_ylabel(r'Axial Stress (kPa)', size=fsize, weight="bold") + #ax[0].legend(loc='lower right', fontsize=fsize) + ax[0].xaxis.set_tick_params(labelsize=fsize) + ax[0].yaxis.set_tick_params(labelsize=fsize) + + ax[1].plot(-ax_strain * 100, + -ra_stress1 * 1e-3, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[1].plot(-list_ax_strain_anal* 100, + -list_ra_stress_anal* 1e-3, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") + ax[1].set_ylabel(r'Radial stress (kPa)', size=fsize, weight="bold") + #ax[1].legend(loc='lower right', fontsize=fsize) + ax[1].xaxis.set_tick_params(labelsize=fsize) + ax[1].yaxis.set_tick_params(labelsize=fsize) + + # Plan p-q + ax[2].plot(-p_num*1e-3, + q_num*1e-3, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[2].plot(-list_p_anal*1e-3, + list_q_anal*1e-3, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[2].set_xlabel(r'Mean stress (kPa)', size=fsize, weight="bold") + ax[2].set_ylabel(r'Deviatoric Stress (kPa)', size=fsize, weight="bold") + ax[2].legend(loc='lower right', fontsize=fsize) + ax[2].xaxis.set_tick_params(labelsize=fsize) + ax[2].yaxis.set_tick_params(labelsize=fsize) + + plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) + + plt.show() + if __name__ == "__main__": main() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/RelaxationTest/relaxationTestFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/RelaxationTest/relaxationTestFigure.py index 842855692f8..2b03b587a40 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/RelaxationTest/relaxationTestFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/RelaxationTest/relaxationTestFigure.py @@ -5,305 +5,320 @@ import xml.etree.ElementTree as ElementTree from math import sin,cos,tan,exp,atan import h5py +import os +import argparse def getMechanicalParametersFromXML( xmlFilePath ): - tree = ElementTree.parse(xmlFilePath) + tree = ElementTree.parse(xmlFilePath) - param = tree.find('Constitutive/ViscoExtendedDruckerPrager') + param = tree.find('Constitutive/ViscoExtendedDruckerPrager') - mechanicalParameters = dict.fromkeys(["bulkModulus", "shearModulus", "cohesion", "initialFrictionAngle", "residualFrictionAngle", "dilationRatio", "hardening", "relaxationTime"]) - mechanicalParameters["bulkModulus"] = float(param.get("defaultBulkModulus")) - mechanicalParameters["shearModulus"] = float(param.get("defaultShearModulus")) - mechanicalParameters["cohesion"] = float(param.get("defaultCohesion")) - mechanicalParameters["initialFrictionAngle"] = float(param.get("defaultInitialFrictionAngle")) - mechanicalParameters["residualFrictionAngle"] = float(param.get("defaultResidualFrictionAngle")) - mechanicalParameters["dilationRatio"] = float(param.get("defaultDilationRatio")) - mechanicalParameters["hardening"] = float(param.get("defaultHardening")) - mechanicalParameters["relaxationTime"] = float(param.get("relaxationTime")) + mechanicalParameters = dict.fromkeys(["bulkModulus", "shearModulus", "cohesion", "initialFrictionAngle", "residualFrictionAngle", "dilationRatio", "hardening", "relaxationTime"]) + mechanicalParameters["bulkModulus"] = float(param.get("defaultBulkModulus")) + mechanicalParameters["shearModulus"] = float(param.get("defaultShearModulus")) + mechanicalParameters["cohesion"] = float(param.get("defaultCohesion")) + mechanicalParameters["initialFrictionAngle"] = float(param.get("defaultInitialFrictionAngle")) + mechanicalParameters["residualFrictionAngle"] = float(param.get("defaultResidualFrictionAngle")) + mechanicalParameters["dilationRatio"] = float(param.get("defaultDilationRatio")) + mechanicalParameters["hardening"] = float(param.get("defaultHardening")) + mechanicalParameters["relaxationTime"] = float(param.get("relaxationTime")) - return mechanicalParameters + return mechanicalParameters def getLoadingFromXML(xmlFilePath): - tree = ElementTree.parse(xmlFilePath) + tree = ElementTree.parse(xmlFilePath) - param = tree.findall('FieldSpecifications/FieldSpecification') - - for elem in param: - if elem.get("name") == "stressZZ" and elem.get("initialCondition") == "1": - initialStress = float(elem.get("scale")) + param = tree.findall('FieldSpecifications/FieldSpecification') + + for elem in param: + if elem.get("name") == "stressZZ" and elem.get("initialCondition") == "1": + initialStress = float(elem.get("scale")) - elif elem.get("name") == "axialload" and elem.get("fieldName") == "totalDisplacement": - strainScale = float(elem.get("scale")) + elif elem.get("name") == "axialload" and elem.get("fieldName") == "totalDisplacement": + strainScale = float(elem.get("scale")) - param1 = tree.find('Functions/TableFunction') - if param1.get("name") == "timeFunction" and param1.get("inputVarNames") == "{ time }": - load = param1.get("values") - load = [float(i)*strainScale for i in load[1:-1].split(",")] - loadTime = param1.get("coordinates") - loadTime = [float(i) for i in loadTime[1:-1].split(",")] + param1 = tree.find('Functions/TableFunction') + if param1.get("name") == "timeFunction" and param1.get("inputVarNames") == "{ time }": + load = param1.get("values") + load = [float(i)*strainScale for i in load[1:-1].split(",")] + loadTime = param1.get("coordinates") + loadTime = [float(i) for i in loadTime[1:-1].split(",")] - return initialStress, load, loadTime + return initialStress, load, loadTime def semiAnalytical( mechanicalParameters, imp_strain, imp_time, initialStress ): - bulkModulus = mechanicalParameters["bulkModulus"] - shearModulus = mechanicalParameters["shearModulus"] - cohesion = mechanicalParameters["cohesion"] - dilationRatio = mechanicalParameters["dilationRatio"] - hardeningParameter = mechanicalParameters["hardening"] - relaxationTime = mechanicalParameters["relaxationTime"] - # Compute Lame modulus and Young modulus - lameModulus = bulkModulus - 2.0/3.0*shearModulus - youngModulus = 1.0/(1.0/9.0/bulkModulus + 1.0/3.0/shearModulus) - - # Initial friction and cohesion parameters - initialFrictionAngleRad = mechanicalParameters["initialFrictionAngle"]*np.pi/180.0 - cosInitialFrictionAngle = np.cos(initialFrictionAngleRad) - sinInitialFrictionAngle = np.sin(initialFrictionAngleRad) - a_init = 6.0*cohesion*cosInitialFrictionAngle/(3.0-sinInitialFrictionAngle) - b_init = 6.0*sinInitialFrictionAngle/(3.0-sinInitialFrictionAngle) - - # Residual friction parameters - residualFrictionAngleRad = mechanicalParameters["residualFrictionAngle"]*np.pi/180.0 - sinResidualFrictionAngle = np.sin(residualFrictionAngleRad) - b_resi = 6.0*sinResidualFrictionAngle/(3.0-sinResidualFrictionAngle) - - list_ax_strain_anal = [] - numStepPerLoadingPeriod = 1000 - - for i in range(0,len(imp_strain)-1): - loadingPeriod = np.linspace(imp_strain[i],imp_strain[i+1], numStepPerLoadingPeriod, endpoint=False) - list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) - - list_time_anal = [] - for i in range(0,len(imp_time)-1): - timePeriod = np.linspace(imp_time[i],imp_time[i+1], numStepPerLoadingPeriod, endpoint=False) - list_time_anal = np.concatenate((list_time_anal, timePeriod), axis=0) - - list_ra_stress_anal = initialStress*np.ones(len(list_ax_strain_anal)) #constant radial confining stress - - # Initiate radial strain and axial stress arrays - list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) - list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) - list_ax_stress_anal[0] = initialStress - - # Loop over the loading/unloading steps - list_ra_strain_anal[0] = 0 - plasticMultiplier = 0 - b = b_init - - for idx in range(1,len(list_ax_strain_anal)): - delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] - delta_time_anal = list_time_anal[idx]-list_time_anal[idx-1] - delta_ra_stress_anal = 0 - - # Elastic trial - delta_ra_strain_anal = (delta_ra_stress_anal-lameModulus*delta_ax_strain_anal)/(2.0*lameModulus+2.0*shearModulus) - delta_ax_stress_anal = (lameModulus+2.0*shearModulus)*delta_ax_strain_anal + lameModulus/(lameModulus+shearModulus)*(delta_ra_stress_anal-lameModulus*delta_ax_strain_anal) - - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Compute mean and shear stresses - ra_stress_anal = list_ra_stress_anal[idx] - p_anal = (ax_stress_anal + 2.0 * ra_stress_anal) / 3.0 - q_anal = -(ax_stress_anal - ra_stress_anal) - - # Plastic correction - if(q_anal>=0): #loading - - F_anal = q_anal + b*p_anal - b*a_init/b_init - - if(F_anal>=0): - - b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) - b_dilation = b*dilationRatio - - dF_db = p_anal - a_init/b_init - db_dlambda = hardeningParameter * (b_resi - b_init) / (hardeningParameter+plasticMultiplier) / (hardeningParameter+plasticMultiplier) - hardeningRate = -dF_db*db_dlambda - - # Variation of Perzyna plastic multiplier, see Runesson et al. 1999, see Eq. 56, 4, 80, 62, 63 - parameter_Aep = 3.0*shearModulus + bulkModulus*b*b_dilation + hardeningRate - delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) - - # Compute stress and strain variations - delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation-3.0)/3.0 ) * youngModulus - delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus + 3.0/2.0*delta_lambda - - # Compute stress and strain at actual loading step - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Update plastic multiplier - plasticMultiplier += delta_lambda - - else: #unloading - - F_anal = -q_anal + b*p_anal - b*a_init/b_init # negative sign added to q for q<0 to obtain the absolute value - - if(F_anal>=0): - b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) - b_dilation = b*dilationRatio - - dF_db = p_anal - a_init/b_init - db_dlambda = hardeningParameter * (b_resi - b_init) / (hardeningParameter+plasticMultiplier) / (hardeningParameter+plasticMultiplier) - hardeningRate = -dF_db*db_dlambda - - # Variation of Perzyna plastic multiplier, see Runesson et al. 1999, see Eq. 56, 4, 80, 62, 63 - parameter_Aep = 3.0*shearModulus + bulkModulus*b*b_dilation + hardeningRate - delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) - - # Compute stress and strain variations - delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation+3.0)/3.0 ) * youngModulus - delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus - 3.0/2.0*delta_lambda - - # Compute stress and strain at actual loading step - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Update plastic multiplier - plasticMultiplier += delta_lambda - - list_ax_stress_anal[idx] = ax_stress_anal - list_ra_strain_anal[idx] = ra_strain_anal - - # Preparing data for visualizing semi-analytical results - list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 - list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) - - return list_ax_stress_anal,list_time_anal,list_ax_strain_anal,list_ra_strain_anal,list_p_anal,list_q_anal + bulkModulus = mechanicalParameters["bulkModulus"] + shearModulus = mechanicalParameters["shearModulus"] + cohesion = mechanicalParameters["cohesion"] + dilationRatio = mechanicalParameters["dilationRatio"] + hardeningParameter = mechanicalParameters["hardening"] + relaxationTime = mechanicalParameters["relaxationTime"] + # Compute Lame modulus and Young modulus + lameModulus = bulkModulus - 2.0/3.0*shearModulus + youngModulus = 1.0/(1.0/9.0/bulkModulus + 1.0/3.0/shearModulus) + + # Initial friction and cohesion parameters + initialFrictionAngleRad = mechanicalParameters["initialFrictionAngle"]*np.pi/180.0 + cosInitialFrictionAngle = np.cos(initialFrictionAngleRad) + sinInitialFrictionAngle = np.sin(initialFrictionAngleRad) + a_init = 6.0*cohesion*cosInitialFrictionAngle/(3.0-sinInitialFrictionAngle) + b_init = 6.0*sinInitialFrictionAngle/(3.0-sinInitialFrictionAngle) + + # Residual friction parameters + residualFrictionAngleRad = mechanicalParameters["residualFrictionAngle"]*np.pi/180.0 + sinResidualFrictionAngle = np.sin(residualFrictionAngleRad) + b_resi = 6.0*sinResidualFrictionAngle/(3.0-sinResidualFrictionAngle) + + list_ax_strain_anal = [] + numStepPerLoadingPeriod = 1000 + + for i in range(0,len(imp_strain)-1): + loadingPeriod = np.linspace(imp_strain[i],imp_strain[i+1], numStepPerLoadingPeriod, endpoint=False) + list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) + + list_time_anal = [] + for i in range(0,len(imp_time)-1): + timePeriod = np.linspace(imp_time[i],imp_time[i+1], numStepPerLoadingPeriod, endpoint=False) + list_time_anal = np.concatenate((list_time_anal, timePeriod), axis=0) + + list_ra_stress_anal = initialStress*np.ones(len(list_ax_strain_anal)) #constant radial confining stress + + # Initiate radial strain and axial stress arrays + list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) + list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) + list_ax_stress_anal[0] = initialStress + + # Loop over the loading/unloading steps + list_ra_strain_anal[0] = 0 + plasticMultiplier = 0 + b = b_init + + for idx in range(1,len(list_ax_strain_anal)): + delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] + delta_time_anal = list_time_anal[idx]-list_time_anal[idx-1] + delta_ra_stress_anal = 0 + + # Elastic trial + delta_ra_strain_anal = (delta_ra_stress_anal-lameModulus*delta_ax_strain_anal)/(2.0*lameModulus+2.0*shearModulus) + delta_ax_stress_anal = (lameModulus+2.0*shearModulus)*delta_ax_strain_anal + lameModulus/(lameModulus+shearModulus)*(delta_ra_stress_anal-lameModulus*delta_ax_strain_anal) + + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Compute mean and shear stresses + ra_stress_anal = list_ra_stress_anal[idx] + p_anal = (ax_stress_anal + 2.0 * ra_stress_anal) / 3.0 + q_anal = -(ax_stress_anal - ra_stress_anal) + + # Plastic correction + if(q_anal>=0): #loading + + F_anal = q_anal + b*p_anal - b*a_init/b_init + + if(F_anal>=0): + + b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) + b_dilation = b*dilationRatio + + dF_db = p_anal - a_init/b_init + db_dlambda = hardeningParameter * (b_resi - b_init) / (hardeningParameter+plasticMultiplier) / (hardeningParameter+plasticMultiplier) + hardeningRate = -dF_db*db_dlambda + + # Variation of Perzyna plastic multiplier, see Runesson et al. 1999, see Eq. 56, 4, 80, 62, 63 + parameter_Aep = 3.0*shearModulus + bulkModulus*b*b_dilation + hardeningRate + delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) + + # Compute stress and strain variations + delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation-3.0)/3.0 ) * youngModulus + delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus + 3.0/2.0*delta_lambda + + # Compute stress and strain at actual loading step + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Update plastic multiplier + plasticMultiplier += delta_lambda + + else: #unloading + + F_anal = -q_anal + b*p_anal - b*a_init/b_init # negative sign added to q for q<0 to obtain the absolute value + + if(F_anal>=0): + b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) + b_dilation = b*dilationRatio + + dF_db = p_anal - a_init/b_init + db_dlambda = hardeningParameter * (b_resi - b_init) / (hardeningParameter+plasticMultiplier) / (hardeningParameter+plasticMultiplier) + hardeningRate = -dF_db*db_dlambda + + # Variation of Perzyna plastic multiplier, see Runesson et al. 1999, see Eq. 56, 4, 80, 62, 63 + parameter_Aep = 3.0*shearModulus + bulkModulus*b*b_dilation + hardeningRate + delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) + + # Compute stress and strain variations + delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation+3.0)/3.0 ) * youngModulus + delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus - 3.0/2.0*delta_lambda + + # Compute stress and strain at actual loading step + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Update plastic multiplier + plasticMultiplier += delta_lambda + + list_ax_stress_anal[idx] = ax_stress_anal + list_ra_strain_anal[idx] = ra_strain_anal + + # Preparing data for visualizing semi-analytical results + list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 + list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) + + return list_ax_stress_anal,list_time_anal,list_ax_strain_anal,list_ra_strain_anal,list_p_anal,list_q_anal def main(): - # File path - hdf5File1Path = "displacement_history.hdf5" - hdf5File2Path = "stress_history.hdf5" - xmlFile1Path = "../../../../../../../inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_base.xml" - xmlFile2Path = "../../../../../../../inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_benchmark.xml" - - # Read HDF5 - # Global Coordinate of Nodal Point - hf = h5py.File(hdf5File1Path, 'r') - xl_node = hf.get('totalDisplacement ReferencePosition topPoint') - xcord_node = xl_node[0,:,0] - ycord_node = xl_node[0,:,1] - zcord_node = xl_node[0,:,2] - # Load Displacement Components - disp = hf.get('totalDisplacement topPoint') - - # Global Coordinate of Element Center - hf = h5py.File(hdf5File2Path, 'r') - xl_elm = hf.get('rock_stress elementCenter') - xl_elm = np.array(xl_elm) - xcord_elm = xl_elm[0, :, 0] - ycord_elm = xl_elm[0, :, 1] - zcord_elm = xl_elm[0, :, 2] - time = hf.get('rock_stress Time') - # Load Stress Components - sigma = hf.get('rock_stress') - sigma = np.array(sigma) - sigma_Cart = np.zeros([len(sigma[:,0,0]), len(sigma[0,:,0]), 6]) - for tl in range(0,len(sigma[:,0,0])): - for i in range(0,len(sigma[0,:,0])): - for j in range(0, 6): - for k in range(0, 8): - sigma_Cart[tl,i,j] += sigma[tl, i, j+6*k]/8. - - ax_stress = sigma_Cart[:, -1, 2] - ra_stress = sigma_Cart[:, -1, 0] - p_num = (ax_stress + 2.0 * ra_stress) / 3.0 - q_num = -(ax_stress - ra_stress) - ax_strain = disp[:, -1, 2] - ra_strain = disp[:, -1, 0] - - - # Extract info from XML - mechanicalParameters = getMechanicalParametersFromXML(xmlFile1Path) - initialStress, imp_strain, imp_time = getLoadingFromXML(xmlFile1Path) - list_ax_stress_anal,list_time_anal,list_ax_strain_anal,list_ra_strain_anal,list_p_anal,list_q_anal = semiAnalytical( mechanicalParameters, imp_strain, imp_time, initialStress ) - - - #Visualization parameters - fsize = 20 - msize = 12 - lw = 6 - malpha = 0.5 - N1 = 3 - fig, ax = plt.subplots(3,1,figsize=(10, 18)) - cmap = plt.get_cmap("tab10") - - - # Plot strain versus shear stress - ax[0].plot(-ax_strain[::N1]*100, q_num[::N1]*1e-6, 'o', color=cmap(2), alpha=malpha, fillstyle='full', markersize=msize, label='GEOS') - ax[0].plot(-ra_strain[::N1]*100, q_num[::N1]*1e-6, 'o', color=cmap(2), alpha=malpha, fillstyle='full', markersize=msize) - ax[0].plot(-list_ax_strain_anal*100, list_q_anal*1e-6, lw=lw, alpha=0.8, color=cmap(2), label='Analytical') - ax[0].plot(-list_ra_strain_anal*100, list_q_anal*1e-6, lw=lw, alpha=0.8, color=cmap(2)) - ax[0].set_xlim([-0.12, 0.12]) - ax[0].set_ylim(0, 12) - ax[0].set_xlabel(r'Strain (%)', size=fsize, weight="bold") - ax[0].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") - ax[0].legend(loc='lower left',fontsize=fsize) - ax[0].grid(True, which="both", ls="-") - ax[0].xaxis.set_tick_params(labelsize=fsize) - ax[0].yaxis.set_tick_params(labelsize=fsize) - - - # Plot stress path and yield surfaces - phi_i = mechanicalParameters["initialFrictionAngle"] - phi_r= mechanicalParameters["residualFrictionAngle"] - c_i = mechanicalParameters["cohesion"]/1.0e6 - f_i = atan(6.0*sin(phi_i/180*np.pi)/(3.0-sin(phi_i/180*np.pi)))*180/np.pi - f_r = atan(6.0*sin(phi_r/180*np.pi)/(3.0-sin(phi_r/180*np.pi)))*180/np.pi - d_i = 6.0*c_i*cos(phi_i/180*np.pi)/(3.0-sin(phi_i/180*np.pi)) - po = d_i/tan(f_i/180*np.pi) - d_r = po*tan(f_r/180*np.pi) - - k_i = tan(f_i/180*np.pi) - p_Yield = np.linspace(0, 50, 100) - q_iniYield = k_i*p_Yield+d_i - k_r = tan(f_r/180*np.pi) - q_resYield = k_r*p_Yield+d_r - - ax[1].plot(-p_num[::N1]*1e-6, q_num[::N1]*1e-6, 'o', color=cmap(2), alpha=malpha, fillstyle='full', markersize=msize, label='GEOS') - ax[1].plot(-list_p_anal*1e-6, list_q_anal*1e-6, lw=lw, alpha=0.8, color=cmap(2), label='Analytical') - ax[1].plot(p_Yield, q_iniYield, lw=lw, alpha=0.8, color='k', linestyle= '--', label='Initial Yield Surface') - ax[1].plot(p_Yield, q_resYield, lw=lw, alpha=0.8, color='orange', linestyle= '--', label='Residual Yield Surface') - ax[1].set_xlim([0, 15]) - ax[1].set_ylim([0, 15]) - ax[1].set_xlabel(r'p (MPa)', size=fsize, weight="bold") - ax[1].set_ylabel(r'q (MPa)', size=fsize, weight="bold") - ax[1].legend(loc='upper left',fontsize=fsize) - ax[1].grid(True, which="both", ls="-") - ax[1].xaxis.set_tick_params(labelsize=fsize) - ax[1].yaxis.set_tick_params(labelsize=fsize) - - - - # Plot axial stress and strain with time - ax[2].plot(time[::N1]/86400, -ax_strain[::N1]*100, 'o', color=cmap(1), alpha=malpha, fillstyle='full', markersize=msize, label='Axial Strain_GEOS') - ax[2].plot(list_time_anal/86400, -list_ax_strain_anal*100, lw=lw, alpha=0.8, color=cmap(1), label='Axial Strain_Analytical') - ax[2].set_xlabel(r'Time (D)', size=fsize, weight="bold") - ax[2].set_ylabel(r'Axial Strain (%)', size=fsize, weight="bold") - ax[2].set_ylim([0, 0.2]) - ax[2].legend(loc='upper left',fontsize=fsize) - ax[2].grid(True, which="both", ls="-") - ax[2].xaxis.set_tick_params(labelsize=fsize) - ax[2].yaxis.set_tick_params(labelsize=fsize) - ax2=ax[2].twinx() - ax2.plot(time[::N1]/86400, -ax_stress[::N1]/1.0e6, 'o', color=cmap(0), alpha=malpha, fillstyle='full', markersize=msize, label='Axial Stress_GEOS') - ax2.plot(list_time_anal/86400, -list_ax_stress_anal/1.0e6, lw=lw, alpha=0.8, color=cmap(0), label='Axial Stress_Analytical') - ax2.set_ylabel(r'Stress (MPa)', size=fsize, weight="bold") - ax2.set_ylim([10, 25]) - ax2.legend(loc='lower right',fontsize=fsize) - ax2.yaxis.set_tick_params(labelsize=fsize) - - - - plt.subplots_adjust(left=0.15, bottom=0.1, right=0.85, top=0.95, wspace=0.4, hspace=0.4) - plt.show() - + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + # File path + outputDir = args.outputDir + geosDir = args.geosDir + hdf5File1Path = outputDir + "/displacement_history.hdf5" + hdf5File2Path = outputDir + "/stress_history.hdf5" + xmlFile1Path = geosDir + "/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_base.xml" + xmlFile2Path = geosDir + "/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_benchmark.xml" + + # Read HDF5 + # Global Coordinate of Nodal Point + hf = h5py.File(hdf5File1Path, 'r') + xl_node = hf.get('totalDisplacement ReferencePosition topPoint') + xcord_node = xl_node[0,:,0] + ycord_node = xl_node[0,:,1] + zcord_node = xl_node[0,:,2] + # Load Displacement Components + disp = hf.get('totalDisplacement topPoint') + + # Global Coordinate of Element Center + hf = h5py.File(hdf5File2Path, 'r') + xl_elm = hf.get('rock_stress elementCenter') + xl_elm = np.array(xl_elm) + xcord_elm = xl_elm[0, :, 0] + ycord_elm = xl_elm[0, :, 1] + zcord_elm = xl_elm[0, :, 2] + time = hf.get('rock_stress Time') + # Load Stress Components + sigma = hf.get('rock_stress') + sigma = np.array(sigma) + sigma_Cart = np.zeros([len(sigma[:,0,0]), len(sigma[0,:,0]), 6]) + for tl in range(0,len(sigma[:,0,0])): + for i in range(0,len(sigma[0,:,0])): + for j in range(0, 6): + for k in range(0, 8): + sigma_Cart[tl,i,j] += sigma[tl, i, j+6*k]/8. + + ax_stress = sigma_Cart[:, -1, 2] + ra_stress = sigma_Cart[:, -1, 0] + p_num = (ax_stress + 2.0 * ra_stress) / 3.0 + q_num = -(ax_stress - ra_stress) + ax_strain = disp[:, -1, 2] + ra_strain = disp[:, -1, 0] + + + # Extract info from XML + mechanicalParameters = getMechanicalParametersFromXML(xmlFile1Path) + initialStress, imp_strain, imp_time = getLoadingFromXML(xmlFile1Path) + list_ax_stress_anal,list_time_anal,list_ax_strain_anal,list_ra_strain_anal,list_p_anal,list_q_anal = semiAnalytical( mechanicalParameters, imp_strain, imp_time, initialStress ) + + + #Visualization parameters + fsize = 20 + msize = 12 + lw = 6 + malpha = 0.5 + N1 = 3 + fig, ax = plt.subplots(3,1,figsize=(10, 18)) + cmap = plt.get_cmap("tab10") + + + # Plot strain versus shear stress + ax[0].plot(-ax_strain[::N1]*100, q_num[::N1]*1e-6, 'o', color=cmap(2), alpha=malpha, fillstyle='full', markersize=msize, label='GEOS') + ax[0].plot(-ra_strain[::N1]*100, q_num[::N1]*1e-6, 'o', color=cmap(2), alpha=malpha, fillstyle='full', markersize=msize) + ax[0].plot(-list_ax_strain_anal*100, list_q_anal*1e-6, lw=lw, alpha=0.8, color=cmap(2), label='Analytical') + ax[0].plot(-list_ra_strain_anal*100, list_q_anal*1e-6, lw=lw, alpha=0.8, color=cmap(2)) + ax[0].set_xlim([-0.12, 0.12]) + ax[0].set_ylim(0, 12) + ax[0].set_xlabel(r'Strain (%)', size=fsize, weight="bold") + ax[0].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") + ax[0].legend(loc='lower left',fontsize=fsize) + ax[0].grid(True, which="both", ls="-") + ax[0].xaxis.set_tick_params(labelsize=fsize) + ax[0].yaxis.set_tick_params(labelsize=fsize) + + + # Plot stress path and yield surfaces + phi_i = mechanicalParameters["initialFrictionAngle"] + phi_r= mechanicalParameters["residualFrictionAngle"] + c_i = mechanicalParameters["cohesion"]/1.0e6 + f_i = atan(6.0*sin(phi_i/180*np.pi)/(3.0-sin(phi_i/180*np.pi)))*180/np.pi + f_r = atan(6.0*sin(phi_r/180*np.pi)/(3.0-sin(phi_r/180*np.pi)))*180/np.pi + d_i = 6.0*c_i*cos(phi_i/180*np.pi)/(3.0-sin(phi_i/180*np.pi)) + po = d_i/tan(f_i/180*np.pi) + d_r = po*tan(f_r/180*np.pi) + + k_i = tan(f_i/180*np.pi) + p_Yield = np.linspace(0, 50, 100) + q_iniYield = k_i*p_Yield+d_i + k_r = tan(f_r/180*np.pi) + q_resYield = k_r*p_Yield+d_r + + ax[1].plot(-p_num[::N1]*1e-6, q_num[::N1]*1e-6, 'o', color=cmap(2), alpha=malpha, fillstyle='full', markersize=msize, label='GEOS') + ax[1].plot(-list_p_anal*1e-6, list_q_anal*1e-6, lw=lw, alpha=0.8, color=cmap(2), label='Analytical') + ax[1].plot(p_Yield, q_iniYield, lw=lw, alpha=0.8, color='k', linestyle= '--', label='Initial Yield Surface') + ax[1].plot(p_Yield, q_resYield, lw=lw, alpha=0.8, color='orange', linestyle= '--', label='Residual Yield Surface') + ax[1].set_xlim([0, 15]) + ax[1].set_ylim([0, 15]) + ax[1].set_xlabel(r'p (MPa)', size=fsize, weight="bold") + ax[1].set_ylabel(r'q (MPa)', size=fsize, weight="bold") + ax[1].legend(loc='upper left',fontsize=fsize) + ax[1].grid(True, which="both", ls="-") + ax[1].xaxis.set_tick_params(labelsize=fsize) + ax[1].yaxis.set_tick_params(labelsize=fsize) + + + + # Plot axial stress and strain with time + ax[2].plot(time[::N1]/86400, -ax_strain[::N1]*100, 'o', color=cmap(1), alpha=malpha, fillstyle='full', markersize=msize, label='Axial Strain_GEOS') + ax[2].plot(list_time_anal/86400, -list_ax_strain_anal*100, lw=lw, alpha=0.8, color=cmap(1), label='Axial Strain_Analytical') + ax[2].set_xlabel(r'Time (D)', size=fsize, weight="bold") + ax[2].set_ylabel(r'Axial Strain (%)', size=fsize, weight="bold") + ax[2].set_ylim([0, 0.2]) + ax[2].legend(loc='upper left',fontsize=fsize) + ax[2].grid(True, which="both", ls="-") + ax[2].xaxis.set_tick_params(labelsize=fsize) + ax[2].yaxis.set_tick_params(labelsize=fsize) + ax2=ax[2].twinx() + ax2.plot(time[::N1]/86400, -ax_stress[::N1]/1.0e6, 'o', color=cmap(0), alpha=malpha, fillstyle='full', markersize=msize, label='Axial Stress_GEOS') + ax2.plot(list_time_anal/86400, -list_ax_stress_anal/1.0e6, lw=lw, alpha=0.8, color=cmap(0), label='Axial Stress_Analytical') + ax2.set_ylabel(r'Stress (MPa)', size=fsize, weight="bold") + ax2.set_ylim([10, 25]) + ax2.legend(loc='lower right',fontsize=fsize) + ax2.yaxis.set_tick_params(labelsize=fsize) + + + + plt.subplots_adjust(left=0.15, bottom=0.1, right=0.85, top=0.95, wspace=0.4, hspace=0.4) + plt.show() + if __name__ == "__main__": main() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ViscoDruckerPrager.py b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ViscoDruckerPrager.py index 80dc6616163..660f780bd75 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ViscoDruckerPrager.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ViscoDruckerPrager.py @@ -3,257 +3,272 @@ import numpy as np import matplotlib.pyplot as plt import xml.etree.ElementTree as ElementTree +import os +import argparse def main(): - # File paths - path = "ViscoDruckerPragerResults.txt" - timeFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/time.geos" - xmlFilePath = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_base.xml" - xmlFilePath_case = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_ViscoDruckerPrager.xml" - imposedStrainFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/axialStrain.geos" - imposedStressFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/radialStress.geos" - - # Load GEOSX results - time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( - path, skiprows=5, unpack=True) - - # Extract mechanical parameters from XML file - tree = ElementTree.parse(xmlFilePath) - tree_case = ElementTree.parse(xmlFilePath_case) - model = tree_case.find('Tasks/TriaxialDriver') - param = tree.find('Constitutive/ViscoDruckerPrager') - - bulkModulus = float(param.get("defaultBulkModulus")) - shearModulus = float(param.get("defaultShearModulus")) - cohesion = float(param.get("defaultCohesion")) - frictionAngle = float(param.get("defaultFrictionAngle")) - dilationAngle = float(param.get("defaultDilationAngle")) - hardeningRate = float(param.get("defaultHardeningRate")) - relaxationTime = float(param.get("relaxationTime")) - initialStress = float(model.get("initialStress")) - - # Compute Lame modulus and Young modulus - lameModulus = bulkModulus - 2.0/3.0*shearModulus - youngModulus = 1.0 / ( 1.0/9.0/bulkModulus + 1.0/3.0/shearModulus ) - - # Friction and cohesion parameters - frictionAngleRad = frictionAngle*np.pi/180.0 - cosFrictionAngle = np.cos(frictionAngleRad) - sinFrictionAngle = np.sin(frictionAngleRad) - a = 6.0*cohesion*cosFrictionAngle/(3.0-sinFrictionAngle) - b = 6.0*sinFrictionAngle/(3.0-sinFrictionAngle) - - # Dilation parameter - dilationAngleRad = dilationAngle*np.pi/180.0 - sinDilationAngle = np.sin(dilationAngleRad) - b_dilation = 6.0*sinDilationAngle/(3.0-sinDilationAngle) - - # See Runesson et al. 1999, see Eq. 56 - parameter_Aep = 3.0*shearModulus + bulkModulus*b*b_dilation + hardeningRate - - # Extract loading from input tables - imp_strain = np.loadtxt( - imposedStrainFilePath, skiprows=0, unpack=True) - - list_ax_strain_anal = [] - numStepPerLoadingPeriod = 1000 - - for i in range(0,len(imp_strain)-1): - dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod - loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) - list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) - - # Extract time from input tables - imp_time = np.loadtxt( - timeFilePath, skiprows=0, unpack=True) - - list_time_anal = [] - for i in range(0,len(imp_time)-1): - dTimePerStep = (imp_time[i+1]-imp_time[i])/numStepPerLoadingPeriod - timePeriod = np.arange(imp_time[i],imp_time[i+1]+dTimePerStep,dTimePerStep) - list_time_anal = np.concatenate((list_time_anal, timePeriod), axis=0) - - # Extract radial stress loading from input tables - imp_stress = np.loadtxt( - imposedStressFilePath, skiprows=0, unpack=True) - - list_ra_stress_anal = imp_stress[0]*np.ones(len(list_ax_strain_anal)) #constant radial confining stress - - # Initiate radial strain and axial stress arrays - list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) - list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) - list_ax_stress_anal[0] = initialStress - list_ra_strain_anal[0] = 0 - - # Loop over the loading/unloading steps - for idx in range(1,len(list_ax_strain_anal)): - delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] - delta_time_anal = list_time_anal[idx]-list_time_anal[idx-1] - delta_ra_stress_anal = 0 # constant radial confining stress - - # Elastic trial - delta_ra_strain_anal = (delta_ra_stress_anal-lameModulus*delta_ax_strain_anal)/(2.0*lameModulus+2.0*shearModulus) - delta_ax_stress_anal = (lameModulus+2.0*shearModulus)*delta_ax_strain_anal + lameModulus/(lameModulus+shearModulus)*(delta_ra_stress_anal-lameModulus*delta_ax_strain_anal) - - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Compute mean and shear stresses - ra_stress_anal = list_ra_stress_anal[idx] - p_anal = (ax_stress_anal + 2.0 * ra_stress_anal) / 3.0 - q_anal = -(ax_stress_anal - ra_stress_anal) - - # Plastic correction - if(q_anal>=0): #loading - - F_anal = q_anal + b*p_anal - a - - if(F_anal>=0): - - # Variation of Perzyna visco-plastic multiplier, see Runesson et al. 1999, see Eq. 4, 80, 62, 63 - delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) - - # Compute stress and strain variations - delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] - delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation-3.0)/3.0 ) * youngModulus - delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus + 3.0/2.0*delta_lambda - - # Compute stress and strain at actual loading step - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Update plastic cohesion - delta_a = hardeningRate*delta_lambda - a += delta_a - - else: #unloading - - F_anal = -q_anal + b*p_anal - a # negative sign added to q for q<0 to obtain the absolute value - - if(F_anal>=0): - # Variation of Perzyna visco-plastic multiplier, see Runesson et al. 1999, see Eq. 4, 80, 62, 63 - delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) - - # Compute stress and strain variations - delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] - delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation+3.0)/3.0 ) * youngModulus - delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus - 3.0/2.0*delta_lambda - - # Compute stress and strain at actual loading step - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Update plastic cohesion - delta_a = hardeningRate*delta_lambda - a += delta_a - - list_ax_stress_anal[idx] = ax_stress_anal - list_ra_strain_anal[idx] = ra_strain_anal - - # Preparing data for visualizing semi-analytical results - list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 - list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) - - list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal - - p_num = (ax_stress + 2.0 * ra_stress1) / 3.0 - q_num = -(ax_stress - ra_stress1) - - strain_vol = ax_strain + 2.0 * ra_strain1 - - #Visualization parameters - fsize = 30 - msize = 12 - lw = 6 - malpha = 0.5 - fig, ax = plt.subplots(1, 3, figsize=(37, 10)) - cmap = plt.get_cmap("tab10") - - # Plot strain versus shear stress - ax[0].plot(-ax_strain * 100, #convert to % - q_num*1e-6, #convert to MPa - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[0].plot(-ra_strain1 * 100, - q_num*1e-6, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha) - ax[0].plot(-list_ax_strain_anal* 100, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[0].plot(-list_ra_strain_anal * 100, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - linewidth=6) - ax[0].set_xlabel(r'Strain (%)', size=fsize, weight="bold") - ax[0].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") - ax[0].xaxis.set_tick_params(labelsize=fsize) - ax[0].yaxis.set_tick_params(labelsize=fsize) - - # Plot axial strain versus volumetric strain - ax[1].plot(-ax_strain * 100, - -strain_vol * 100, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[1].plot(-list_ax_strain_anal* 100, - -list_strain_vol_anal* 100, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") - ax[1].set_ylabel(r'Volumetric Strain (%)', size=fsize, weight="bold") - #ax[1].legend(loc='lower right', fontsize=fsize) - ax[1].xaxis.set_tick_params(labelsize=fsize) - ax[1].yaxis.set_tick_params(labelsize=fsize) - - # Plot shear stress versus mean stress - ax[2].plot(-p_num*1e-6, - q_num*1e-6, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[2].plot(-list_p_anal*1e-6, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[2].set_xlabel(r'Mean stress (MPa)', size=fsize, weight="bold") - ax[2].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") - ax[2].legend(loc='lower right', fontsize=fsize) - ax[2].xaxis.set_tick_params(labelsize=fsize) - ax[2].yaxis.set_tick_params(labelsize=fsize) - - plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) - plt.show() - + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + # File paths + outputDir = args.outputDir + geosDir = args.geosDir + path = outputDir + "/ViscoDruckerPragerResults.txt" + timeFilePath = geosDir + "/inputFiles/triaxialDriver/tables/time.geos" + xmlFilePath = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_base.xml" + xmlFilePath_case = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_ViscoDruckerPrager.xml" + imposedStrainFilePath = geosDir + "/inputFiles/triaxialDriver/tables/axialStrain.geos" + imposedStressFilePath = geosDir + "/inputFiles/triaxialDriver/tables/radialStress.geos" + + # Load GEOSX results + time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( + path, skiprows=5, unpack=True) + + # Extract mechanical parameters from XML file + tree = ElementTree.parse(xmlFilePath) + tree_case = ElementTree.parse(xmlFilePath_case) + model = tree_case.find('Tasks/TriaxialDriver') + param = tree.find('Constitutive/ViscoDruckerPrager') + + bulkModulus = float(param.get("defaultBulkModulus")) + shearModulus = float(param.get("defaultShearModulus")) + cohesion = float(param.get("defaultCohesion")) + frictionAngle = float(param.get("defaultFrictionAngle")) + dilationAngle = float(param.get("defaultDilationAngle")) + hardeningRate = float(param.get("defaultHardeningRate")) + relaxationTime = float(param.get("relaxationTime")) + initialStress = float(model.get("initialStress")) + + # Compute Lame modulus and Young modulus + lameModulus = bulkModulus - 2.0/3.0*shearModulus + youngModulus = 1.0 / ( 1.0/9.0/bulkModulus + 1.0/3.0/shearModulus ) + + # Friction and cohesion parameters + frictionAngleRad = frictionAngle*np.pi/180.0 + cosFrictionAngle = np.cos(frictionAngleRad) + sinFrictionAngle = np.sin(frictionAngleRad) + a = 6.0*cohesion*cosFrictionAngle/(3.0-sinFrictionAngle) + b = 6.0*sinFrictionAngle/(3.0-sinFrictionAngle) + + # Dilation parameter + dilationAngleRad = dilationAngle*np.pi/180.0 + sinDilationAngle = np.sin(dilationAngleRad) + b_dilation = 6.0*sinDilationAngle/(3.0-sinDilationAngle) + + # See Runesson et al. 1999, see Eq. 56 + parameter_Aep = 3.0*shearModulus + bulkModulus*b*b_dilation + hardeningRate + + # Extract loading from input tables + imp_strain = np.loadtxt( + imposedStrainFilePath, skiprows=0, unpack=True) + + list_ax_strain_anal = [] + numStepPerLoadingPeriod = 1000 + + for i in range(0,len(imp_strain)-1): + dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod + loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) + list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) + + # Extract time from input tables + imp_time = np.loadtxt( + timeFilePath, skiprows=0, unpack=True) + + list_time_anal = [] + for i in range(0,len(imp_time)-1): + dTimePerStep = (imp_time[i+1]-imp_time[i])/numStepPerLoadingPeriod + timePeriod = np.arange(imp_time[i],imp_time[i+1]+dTimePerStep,dTimePerStep) + list_time_anal = np.concatenate((list_time_anal, timePeriod), axis=0) + + # Extract radial stress loading from input tables + imp_stress = np.loadtxt( + imposedStressFilePath, skiprows=0, unpack=True) + + list_ra_stress_anal = imp_stress[0]*np.ones(len(list_ax_strain_anal)) #constant radial confining stress + + # Initiate radial strain and axial stress arrays + list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) + list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) + list_ax_stress_anal[0] = initialStress + list_ra_strain_anal[0] = 0 + + # Loop over the loading/unloading steps + for idx in range(1,len(list_ax_strain_anal)): + delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] + delta_time_anal = list_time_anal[idx]-list_time_anal[idx-1] + delta_ra_stress_anal = 0 # constant radial confining stress + + # Elastic trial + delta_ra_strain_anal = (delta_ra_stress_anal-lameModulus*delta_ax_strain_anal)/(2.0*lameModulus+2.0*shearModulus) + delta_ax_stress_anal = (lameModulus+2.0*shearModulus)*delta_ax_strain_anal + lameModulus/(lameModulus+shearModulus)*(delta_ra_stress_anal-lameModulus*delta_ax_strain_anal) + + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Compute mean and shear stresses + ra_stress_anal = list_ra_stress_anal[idx] + p_anal = (ax_stress_anal + 2.0 * ra_stress_anal) / 3.0 + q_anal = -(ax_stress_anal - ra_stress_anal) + + # Plastic correction + if(q_anal>=0): #loading + + F_anal = q_anal + b*p_anal - a + + if(F_anal>=0): + + # Variation of Perzyna visco-plastic multiplier, see Runesson et al. 1999, see Eq. 4, 80, 62, 63 + delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) + + # Compute stress and strain variations + delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] + delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation-3.0)/3.0 ) * youngModulus + delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus + 3.0/2.0*delta_lambda + + # Compute stress and strain at actual loading step + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Update plastic cohesion + delta_a = hardeningRate*delta_lambda + a += delta_a + + else: #unloading + + F_anal = -q_anal + b*p_anal - a # negative sign added to q for q<0 to obtain the absolute value + + if(F_anal>=0): + # Variation of Perzyna visco-plastic multiplier, see Runesson et al. 1999, see Eq. 4, 80, 62, 63 + delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) + + # Compute stress and strain variations + delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] + delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation+3.0)/3.0 ) * youngModulus + delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus - 3.0/2.0*delta_lambda + + # Compute stress and strain at actual loading step + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Update plastic cohesion + delta_a = hardeningRate*delta_lambda + a += delta_a + + list_ax_stress_anal[idx] = ax_stress_anal + list_ra_strain_anal[idx] = ra_strain_anal + + # Preparing data for visualizing semi-analytical results + list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 + list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) + + list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal + + p_num = (ax_stress + 2.0 * ra_stress1) / 3.0 + q_num = -(ax_stress - ra_stress1) + + strain_vol = ax_strain + 2.0 * ra_strain1 + + #Visualization parameters + fsize = 30 + msize = 12 + lw = 6 + malpha = 0.5 + fig, ax = plt.subplots(1, 3, figsize=(37, 10)) + cmap = plt.get_cmap("tab10") + + # Plot strain versus shear stress + ax[0].plot(-ax_strain * 100, #convert to % + q_num*1e-6, #convert to MPa + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[0].plot(-ra_strain1 * 100, + q_num*1e-6, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha) + ax[0].plot(-list_ax_strain_anal* 100, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[0].plot(-list_ra_strain_anal * 100, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + linewidth=6) + ax[0].set_xlabel(r'Strain (%)', size=fsize, weight="bold") + ax[0].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") + ax[0].xaxis.set_tick_params(labelsize=fsize) + ax[0].yaxis.set_tick_params(labelsize=fsize) + + # Plot axial strain versus volumetric strain + ax[1].plot(-ax_strain * 100, + -strain_vol * 100, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[1].plot(-list_ax_strain_anal* 100, + -list_strain_vol_anal* 100, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") + ax[1].set_ylabel(r'Volumetric Strain (%)', size=fsize, weight="bold") + #ax[1].legend(loc='lower right', fontsize=fsize) + ax[1].xaxis.set_tick_params(labelsize=fsize) + ax[1].yaxis.set_tick_params(labelsize=fsize) + + # Plot shear stress versus mean stress + ax[2].plot(-p_num*1e-6, + q_num*1e-6, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[2].plot(-list_p_anal*1e-6, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[2].set_xlabel(r'Mean stress (MPa)', size=fsize, weight="bold") + ax[2].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") + ax[2].legend(loc='lower right', fontsize=fsize) + ax[2].xaxis.set_tick_params(labelsize=fsize) + ax[2].yaxis.set_tick_params(labelsize=fsize) + + plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) + plt.show() + if __name__ == "__main__": main() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoExtendedDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ViscoExtendedDruckerPrager.py b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoExtendedDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ViscoExtendedDruckerPrager.py index b8c431e94a4..82cccf82ac8 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoExtendedDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ViscoExtendedDruckerPrager.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoExtendedDruckerPrager/TriaxialDriver_vs_SemiAnalytic_ViscoExtendedDruckerPrager.py @@ -3,270 +3,285 @@ import numpy as np import matplotlib.pyplot as plt import xml.etree.ElementTree as ElementTree +import os +import argparse def main(): - # File paths - path = "ViscoExtendedDruckerPragerResults.txt" - timeFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/time.geos" - xmlFilePath = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_base.xml" - xmlFilePath_case = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_ViscoExtendedDruckerPrager.xml" - imposedStrainFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/axialStrain.geos" - imposedStressFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/radialStress.geos" - - # Load GEOSX results - time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( - path, skiprows=5, unpack=True) - - # Extract mechanical parameters from XML files - tree = ElementTree.parse(xmlFilePath) - tree_case = ElementTree.parse(xmlFilePath_case) - model = tree_case.find('Tasks/TriaxialDriver') - param = tree.find('Constitutive/ViscoExtendedDruckerPrager') - - bulkModulus = float(param.get("defaultBulkModulus")) - shearModulus = float(param.get("defaultShearModulus")) - cohesion = float(param.get("defaultCohesion")) - initialFrictionAngle = float(param.get("defaultInitialFrictionAngle")) - residualFrictionAngle = float(param.get("defaultResidualFrictionAngle")) - hardeningParameter = float(param.get("defaultHardening")) - dilationRatio = float(param.get("defaultDilationRatio")) - relaxationTime = float(param.get("relaxationTime")) - initialStress = float(model.get("initialStress")) - - # Compute Lame modulus and Young modulus - lameModulus = bulkModulus - 2.0/3.0*shearModulus - youngModulus = 1.0/(1.0/9.0/bulkModulus + 1.0/3.0/shearModulus) - - # Initial friction and cohesion parameters - initialFrictionAngleRad = initialFrictionAngle*np.pi/180.0 - cosInitialFrictionAngle = np.cos(initialFrictionAngleRad) - sinInitialFrictionAngle = np.sin(initialFrictionAngleRad) - a_init = 6.0*cohesion*cosInitialFrictionAngle/(3.0-sinInitialFrictionAngle) - b_init = 6.0*sinInitialFrictionAngle/(3.0-sinInitialFrictionAngle) - - # Residual friction parameters - residualFrictionAngleRad = residualFrictionAngle*np.pi/180.0 - sinResidualFrictionAngle = np.sin(residualFrictionAngleRad) - b_resi = 6.0*sinResidualFrictionAngle/(3.0-sinResidualFrictionAngle) - - # Extract loading from input tables - imp_strain = np.loadtxt( - imposedStrainFilePath, skiprows=0, unpack=True) - - list_ax_strain_anal = [] - numStepPerLoadingPeriod = 1000 - - for i in range(0,len(imp_strain)-1): - dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod - loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) - list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) - - # Extract time from input tables - imp_time = np.loadtxt( - timeFilePath, skiprows=0, unpack=True) - - list_time_anal = [] - for i in range(0,len(imp_time)-1): - dTimePerStep = (imp_time[i+1]-imp_time[i])/numStepPerLoadingPeriod - timePeriod = np.arange(imp_time[i],imp_time[i+1]+dTimePerStep,dTimePerStep) - list_time_anal = np.concatenate((list_time_anal, timePeriod), axis=0) - - # Extract radial stress loading from input tables - imp_stress = np.loadtxt( - imposedStressFilePath, skiprows=0, unpack=True) - - list_ra_stress_anal = imp_stress[0]*np.ones(len(list_ax_strain_anal)) #constant radial confining stress - - # Initiate radial strain and axial stress arrays - list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) - list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) - list_ax_stress_anal[0] = initialStress - - # Loop over the loading/unloading steps - list_ra_strain_anal[0] = 0 - plasticMultiplier = 0 - b = b_init - - for idx in range(1,len(list_ax_strain_anal)): - delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] - delta_time_anal = list_time_anal[idx]-list_time_anal[idx-1] - delta_ra_stress_anal = 0 - - # Elastic trial - delta_ra_strain_anal = (delta_ra_stress_anal-lameModulus*delta_ax_strain_anal)/(2.0*lameModulus+2.0*shearModulus) - delta_ax_stress_anal = (lameModulus+2.0*shearModulus)*delta_ax_strain_anal + lameModulus/(lameModulus+shearModulus)*(delta_ra_stress_anal-lameModulus*delta_ax_strain_anal) - - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Compute mean and shear stresses - ra_stress_anal = list_ra_stress_anal[idx] - p_anal = (ax_stress_anal + 2.0 * ra_stress_anal) / 3.0 - q_anal = -(ax_stress_anal - ra_stress_anal) - - # Plastic correction - if(q_anal>=0): #loading - - F_anal = q_anal + b*p_anal - b*a_init/b_init - - if(F_anal>=0): - - b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) - b_dilation = b*dilationRatio - - dF_db = p_anal - a_init/b_init - db_dlambda = hardeningParameter * (b_resi - b_init) / (hardeningParameter+plasticMultiplier) / (hardeningParameter+plasticMultiplier) - hardeningRate = -dF_db*db_dlambda - - # Variation of Perzyna plastic multiplier, see Runesson et al. 1999, see Eq. 56, 4, 80, 62, 63 - parameter_Aep = 3.0*shearModulus + bulkModulus*b*b_dilation + hardeningRate - delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) - - # Compute stress and strain variations - delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation-3.0)/3.0 ) * youngModulus - delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus + 3.0/2.0*delta_lambda - - # Compute stress and strain at actual loading step - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Update plastic multiplier - plasticMultiplier += delta_lambda - - else: #unloading - - F_anal = -q_anal + b*p_anal - b*a_init/b_init # negative sign added to q for q<0 to obtain the absolute value - - if(F_anal>=0): - b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) - b_dilation = b*dilationRatio - - dF_db = p_anal - a_init/b_init - db_dlambda = hardeningParameter * (b_resi - b_init) / (hardeningParameter+plasticMultiplier) / (hardeningParameter+plasticMultiplier) - hardeningRate = -dF_db*db_dlambda - - # Variation of Perzyna plastic multiplier, see Runesson et al. 1999, see Eq. 56, 4, 80, 62, 63 - parameter_Aep = 3.0*shearModulus + bulkModulus*b*b_dilation + hardeningRate - delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) - - # Compute stress and strain variations - delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation+3.0)/3.0 ) * youngModulus - delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus - 3.0/2.0*delta_lambda - - # Compute stress and strain at actual loading step - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal - - # Update plastic multiplier - plasticMultiplier += delta_lambda - - list_ax_stress_anal[idx] = ax_stress_anal - list_ra_strain_anal[idx] = ra_strain_anal - - # Preparing data for visualizing semi-analytical results - list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 - list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) - - list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal - - p_num = (ax_stress + 2.0 * ra_stress1) / 3.0 - q_num = -(ax_stress - ra_stress1) - - strain_vol = ax_strain + 2.0 * ra_strain1 - - #Visualization parameters - fsize = 30 - msize = 12 - lw = 6 - malpha = 0.5 - fig, ax = plt.subplots(1, 3, figsize=(37, 10)) - cmap = plt.get_cmap("tab10") - - # Plot strain versus shear stress - ax[0].plot(-ax_strain * 100, #convert to % - q_num*1e-6, #convert to MPa - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[0].plot(-ra_strain1 * 100, - q_num*1e-6, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha) - ax[0].plot(-list_ax_strain_anal* 100, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[0].plot(-list_ra_strain_anal * 100, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - linewidth=6) - ax[0].set_xlabel(r'Strain (%)', size=fsize, weight="bold") - ax[0].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") - ax[0].xaxis.set_tick_params(labelsize=fsize) - ax[0].yaxis.set_tick_params(labelsize=fsize) - - # Plot axial strain versus volumetric strain - ax[1].plot(-ax_strain * 100, - -strain_vol * 100, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[1].plot(-list_ax_strain_anal* 100, - -list_strain_vol_anal* 100, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") - ax[1].set_ylabel(r'Volumetric Strain (%)', size=fsize, weight="bold") - #ax[1].legend(loc='lower right', fontsize=fsize) - ax[1].xaxis.set_tick_params(labelsize=fsize) - ax[1].yaxis.set_tick_params(labelsize=fsize) - - # Plot shear stress versus mean stress - ax[2].plot(-p_num*1e-6, - q_num*1e-6, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[2].plot(-list_p_anal*1e-6, - list_q_anal*1e-6, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[2].set_xlabel(r'Mean stress (MPa)', size=fsize, weight="bold") - ax[2].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") - ax[2].legend(loc='lower right', fontsize=fsize) - ax[2].xaxis.set_tick_params(labelsize=fsize) - ax[2].yaxis.set_tick_params(labelsize=fsize) - - plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) - plt.show() - + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + # File paths + outputDir = args.outputDir + geosDir = args.geosDir + path = outputDir + "/ViscoExtendedDruckerPragerResults.txt" + timeFilePath = geosDir + "/inputFiles/triaxialDriver/tables/time.geos" + xmlFilePath = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_base.xml" + xmlFilePath_case = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_ViscoExtendedDruckerPrager.xml" + imposedStrainFilePath = geosDir + "/inputFiles/triaxialDriver/tables/axialStrain.geos" + imposedStressFilePath = geosDir + "/inputFiles/triaxialDriver/tables/radialStress.geos" + + # Load GEOSX results + time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( + path, skiprows=5, unpack=True) + + # Extract mechanical parameters from XML files + tree = ElementTree.parse(xmlFilePath) + tree_case = ElementTree.parse(xmlFilePath_case) + model = tree_case.find('Tasks/TriaxialDriver') + param = tree.find('Constitutive/ViscoExtendedDruckerPrager') + + bulkModulus = float(param.get("defaultBulkModulus")) + shearModulus = float(param.get("defaultShearModulus")) + cohesion = float(param.get("defaultCohesion")) + initialFrictionAngle = float(param.get("defaultInitialFrictionAngle")) + residualFrictionAngle = float(param.get("defaultResidualFrictionAngle")) + hardeningParameter = float(param.get("defaultHardening")) + dilationRatio = float(param.get("defaultDilationRatio")) + relaxationTime = float(param.get("relaxationTime")) + initialStress = float(model.get("initialStress")) + + # Compute Lame modulus and Young modulus + lameModulus = bulkModulus - 2.0/3.0*shearModulus + youngModulus = 1.0/(1.0/9.0/bulkModulus + 1.0/3.0/shearModulus) + + # Initial friction and cohesion parameters + initialFrictionAngleRad = initialFrictionAngle*np.pi/180.0 + cosInitialFrictionAngle = np.cos(initialFrictionAngleRad) + sinInitialFrictionAngle = np.sin(initialFrictionAngleRad) + a_init = 6.0*cohesion*cosInitialFrictionAngle/(3.0-sinInitialFrictionAngle) + b_init = 6.0*sinInitialFrictionAngle/(3.0-sinInitialFrictionAngle) + + # Residual friction parameters + residualFrictionAngleRad = residualFrictionAngle*np.pi/180.0 + sinResidualFrictionAngle = np.sin(residualFrictionAngleRad) + b_resi = 6.0*sinResidualFrictionAngle/(3.0-sinResidualFrictionAngle) + + # Extract loading from input tables + imp_strain = np.loadtxt( + imposedStrainFilePath, skiprows=0, unpack=True) + + list_ax_strain_anal = [] + numStepPerLoadingPeriod = 1000 + + for i in range(0,len(imp_strain)-1): + dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod + loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) + list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) + + # Extract time from input tables + imp_time = np.loadtxt( + timeFilePath, skiprows=0, unpack=True) + + list_time_anal = [] + for i in range(0,len(imp_time)-1): + dTimePerStep = (imp_time[i+1]-imp_time[i])/numStepPerLoadingPeriod + timePeriod = np.arange(imp_time[i],imp_time[i+1]+dTimePerStep,dTimePerStep) + list_time_anal = np.concatenate((list_time_anal, timePeriod), axis=0) + + # Extract radial stress loading from input tables + imp_stress = np.loadtxt( + imposedStressFilePath, skiprows=0, unpack=True) + + list_ra_stress_anal = imp_stress[0]*np.ones(len(list_ax_strain_anal)) #constant radial confining stress + + # Initiate radial strain and axial stress arrays + list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) + list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) + list_ax_stress_anal[0] = initialStress + + # Loop over the loading/unloading steps + list_ra_strain_anal[0] = 0 + plasticMultiplier = 0 + b = b_init + + for idx in range(1,len(list_ax_strain_anal)): + delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] + delta_time_anal = list_time_anal[idx]-list_time_anal[idx-1] + delta_ra_stress_anal = 0 + + # Elastic trial + delta_ra_strain_anal = (delta_ra_stress_anal-lameModulus*delta_ax_strain_anal)/(2.0*lameModulus+2.0*shearModulus) + delta_ax_stress_anal = (lameModulus+2.0*shearModulus)*delta_ax_strain_anal + lameModulus/(lameModulus+shearModulus)*(delta_ra_stress_anal-lameModulus*delta_ax_strain_anal) + + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Compute mean and shear stresses + ra_stress_anal = list_ra_stress_anal[idx] + p_anal = (ax_stress_anal + 2.0 * ra_stress_anal) / 3.0 + q_anal = -(ax_stress_anal - ra_stress_anal) + + # Plastic correction + if(q_anal>=0): #loading + + F_anal = q_anal + b*p_anal - b*a_init/b_init + + if(F_anal>=0): + + b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) + b_dilation = b*dilationRatio + + dF_db = p_anal - a_init/b_init + db_dlambda = hardeningParameter * (b_resi - b_init) / (hardeningParameter+plasticMultiplier) / (hardeningParameter+plasticMultiplier) + hardeningRate = -dF_db*db_dlambda + + # Variation of Perzyna plastic multiplier, see Runesson et al. 1999, see Eq. 56, 4, 80, 62, 63 + parameter_Aep = 3.0*shearModulus + bulkModulus*b*b_dilation + hardeningRate + delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) + + # Compute stress and strain variations + delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation-3.0)/3.0 ) * youngModulus + delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus + 3.0/2.0*delta_lambda + + # Compute stress and strain at actual loading step + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Update plastic multiplier + plasticMultiplier += delta_lambda + + else: #unloading + + F_anal = -q_anal + b*p_anal - b*a_init/b_init # negative sign added to q for q<0 to obtain the absolute value + + if(F_anal>=0): + b = b_init + plasticMultiplier/(hardeningParameter+plasticMultiplier) * (b_resi - b_init) + b_dilation = b*dilationRatio + + dF_db = p_anal - a_init/b_init + db_dlambda = hardeningParameter * (b_resi - b_init) / (hardeningParameter+plasticMultiplier) / (hardeningParameter+plasticMultiplier) + hardeningRate = -dF_db*db_dlambda + + # Variation of Perzyna plastic multiplier, see Runesson et al. 1999, see Eq. 56, 4, 80, 62, 63 + parameter_Aep = 3.0*shearModulus + bulkModulus*b*b_dilation + hardeningRate + delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) + + # Compute stress and strain variations + delta_ax_stress_anal = ( delta_ax_strain_anal-delta_lambda*(b_dilation+3.0)/3.0 ) * youngModulus + delta_ra_strain_anal = delta_ax_strain_anal - delta_ax_stress_anal / 2.0 / shearModulus - 3.0/2.0*delta_lambda + + # Compute stress and strain at actual loading step + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_strain_anal = list_ra_strain_anal[idx-1] + delta_ra_strain_anal + + # Update plastic multiplier + plasticMultiplier += delta_lambda + + list_ax_stress_anal[idx] = ax_stress_anal + list_ra_strain_anal[idx] = ra_strain_anal + + # Preparing data for visualizing semi-analytical results + list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 + list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) + + list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal + + p_num = (ax_stress + 2.0 * ra_stress1) / 3.0 + q_num = -(ax_stress - ra_stress1) + + strain_vol = ax_strain + 2.0 * ra_strain1 + + #Visualization parameters + fsize = 30 + msize = 12 + lw = 6 + malpha = 0.5 + fig, ax = plt.subplots(1, 3, figsize=(37, 10)) + cmap = plt.get_cmap("tab10") + + # Plot strain versus shear stress + ax[0].plot(-ax_strain * 100, #convert to % + q_num*1e-6, #convert to MPa + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[0].plot(-ra_strain1 * 100, + q_num*1e-6, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha) + ax[0].plot(-list_ax_strain_anal* 100, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[0].plot(-list_ra_strain_anal * 100, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + linewidth=6) + ax[0].set_xlabel(r'Strain (%)', size=fsize, weight="bold") + ax[0].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") + ax[0].xaxis.set_tick_params(labelsize=fsize) + ax[0].yaxis.set_tick_params(labelsize=fsize) + + # Plot axial strain versus volumetric strain + ax[1].plot(-ax_strain * 100, + -strain_vol * 100, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[1].plot(-list_ax_strain_anal* 100, + -list_strain_vol_anal* 100, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") + ax[1].set_ylabel(r'Volumetric Strain (%)', size=fsize, weight="bold") + #ax[1].legend(loc='lower right', fontsize=fsize) + ax[1].xaxis.set_tick_params(labelsize=fsize) + ax[1].yaxis.set_tick_params(labelsize=fsize) + + # Plot shear stress versus mean stress + ax[2].plot(-p_num*1e-6, + q_num*1e-6, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[2].plot(-list_p_anal*1e-6, + list_q_anal*1e-6, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[2].set_xlabel(r'Mean stress (MPa)', size=fsize, weight="bold") + ax[2].set_ylabel(r'Deviatoric Stress (MPa)', size=fsize, weight="bold") + ax[2].legend(loc='lower right', fontsize=fsize) + ax[2].xaxis.set_tick_params(labelsize=fsize) + ax[2].yaxis.set_tick_params(labelsize=fsize) + + plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) + plt.show() + if __name__ == "__main__": main() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoModifiedCamClay/TriaxialDriver_vs_SemiAnalytic_ViscoModifiedCamClay.py b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoModifiedCamClay/TriaxialDriver_vs_SemiAnalytic_ViscoModifiedCamClay.py index 019252903c8..3b4cc7e8fd8 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoModifiedCamClay/TriaxialDriver_vs_SemiAnalytic_ViscoModifiedCamClay.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/ViscoModifiedCamClay/TriaxialDriver_vs_SemiAnalytic_ViscoModifiedCamClay.py @@ -3,214 +3,230 @@ import numpy as np import matplotlib.pyplot as plt import xml.etree.ElementTree as ElementTree +import os +import argparse def main(): - # File paths - path = "ViscoModifiedCamClayResults.txt" - timeFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/time.geos" - xmlFilePath = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_base.xml" - xmlFilePath_case = "../../../../../../../inputFiles/triaxialDriver/triaxialDriver_ViscoModifiedCamClay.xml" - imposedStrainFilePath = "../../../../../../../inputFiles/triaxialDriver/tables/axialStrain.geos" - - # Load GEOSX results - time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( - path, skiprows=5, unpack=True) - - # Extract mechanical parameters from XML file - tree = ElementTree.parse(xmlFilePath) - tree_case = ElementTree.parse(xmlFilePath_case) - model = tree_case.find('Tasks/TriaxialDriver') - param = tree.find('Constitutive/ViscoModifiedCamClay') - - refPressure = float(param.get("defaultRefPressure")) - refStrainVol = float(param.get("defaultRefStrainVol")) - shearModulus = float(param.get("defaultShearModulus")) - preConsolidationPressure = float(param.get("defaultPreConsolidationPressure")) - cslSlope = float(param.get("defaultCslSlope")) - virginCompressionIndex = float(param.get("defaultVirginCompressionIndex")) - recompressionIndex = float(param.get("defaultRecompressionIndex")) - relaxationTime = float(param.get("relaxationTime")) - initialStress = float(model.get("initialStress")) - - # Extract loading from input tables - imp_strain = np.loadtxt( - imposedStrainFilePath, skiprows=0, unpack=True) - - list_ax_strain_anal = [] - numStepPerLoadingPeriod = 10001 - - for i in range(0,len(imp_strain)-1): - dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod - loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) - list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) - - # Extract time from input tables - imp_time = np.loadtxt( - timeFilePath, skiprows=0, unpack=True) - - list_time_anal = [] - for i in range(0,len(imp_time)-1): - dTimePerStep = (imp_time[i+1]-imp_time[i])/numStepPerLoadingPeriod - timePeriod = np.arange(imp_time[i],imp_time[i+1]+dTimePerStep,dTimePerStep) - list_time_anal = np.concatenate((list_time_anal, timePeriod), axis=0) - - list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) - list_ra_stress_anal = np.zeros(len(list_ax_strain_anal)) - list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) - - p_anal = refPressure - list_ax_strain_anal += refStrainVol # Oedometric compaction: zero lateral strain - list_ax_stress_anal += initialStress # Assuming isotropic initial stress condition - list_ra_stress_anal += initialStress - - for idx in range(1,len(list_ax_strain_anal)): - delta_ax_strain_anal = list_ax_strain_anal[idx]-list_ax_strain_anal[idx-1] - delta_ra_strain_anal = 0 - - # Compute elastic moduli - bulkModulus = - p_anal/recompressionIndex - lameModulus = bulkModulus - 2.0/3.0*shearModulus - - # Elastic trial - delta_ax_stress_anal = (lameModulus+2.0*shearModulus)*delta_ax_strain_anal + 2.0*lameModulus*delta_ra_strain_anal - delta_ra_stress_anal = lameModulus*delta_ax_strain_anal + (2.0*lameModulus+2.0*shearModulus)*delta_ra_strain_anal - - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_stress_anal = list_ra_stress_anal[idx-1] + delta_ra_stress_anal - - p_anal = (ax_stress_anal + 2.0*ra_stress_anal)/3.0 - q_anal = -(ax_stress_anal - ra_stress_anal) - - # Plastic correction - F_anal = q_anal*q_anal/(cslSlope*cslSlope) + p_anal*(p_anal-preConsolidationPressure) - - if(F_anal>=0): - # Derivatives - dF_dp = 2.0*p_anal-preConsolidationPressure - dF_dq = 2.0*q_anal/(cslSlope*cslSlope) - dF_dpc = -p_anal - - dG_dp = dF_dp # associated plastic rule was considered - dG_dq = dF_dq - - dpc_dlambda = -preConsolidationPressure/(virginCompressionIndex-recompressionIndex)*dG_dp - hardeningRate = -dF_dpc*dpc_dlambda - - # See Runesson et al. 1999, see Eq. 29 - parameter_Aep = 3.0*shearModulus*dF_dq*dG_dq + bulkModulus*dF_dp*dG_dp + hardeningRate - - # Compute stress variations - delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] - delta_time_anal = list_time_anal[idx]-list_time_anal[idx-1] - - delta_strain_vol = delta_ax_strain_anal - delta_strain_shear = -delta_ax_strain_anal #3/2*delta_gamma - - # See Runesson et al. 1999, see Eq. 4, 80, 62, 63 - delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) - delta_p_anal = (delta_strain_vol - delta_lambda*dG_dp)*bulkModulus - delta_q_anal = (delta_strain_shear - 3.0/2.0*delta_lambda*dG_dq)*2.0*shearModulus - - delta_ax_stress_anal = (3.0*delta_p_anal - 2.0*delta_q_anal)/3.0 - delta_ra_stress_anal = delta_ax_stress_anal + delta_q_anal - - # Update stress - ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal - ra_stress_anal = list_ra_stress_anal[idx-1] + delta_ra_stress_anal - - delta_pc = dpc_dlambda * delta_lambda - preConsolidationPressure += delta_pc - - list_ax_stress_anal[idx] = ax_stress_anal - list_ra_stress_anal[idx] = ra_stress_anal - - list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 - list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) - - list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal - - p_num = (ax_stress + 2.0 * ra_stress1) / 3.0 - q_num = -(ax_stress - ra_stress1) - - #Visualization parameters - fsize = 30 - msize = 12 - lw = 6 - malpha = 0.5 - fig, ax = plt.subplots(1, 3, figsize=(37, 10)) - cmap = plt.get_cmap("tab10") - - ax[0].plot(-ax_strain * 100, #convert to % - -ax_stress*1e-3, #convert to kPa - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[0].plot(-list_ax_strain_anal* 100, - -list_ax_stress_anal*1e-3, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - - ax[0].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") - ax[0].set_ylabel(r'Axial Stress (kPa)', size=fsize, weight="bold") - #ax[0].legend(loc='lower right', fontsize=fsize) - ax[0].xaxis.set_tick_params(labelsize=fsize) - ax[0].yaxis.set_tick_params(labelsize=fsize) - - ax[1].plot(-ax_strain * 100, - -ra_stress1 * 1e-3, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[1].plot(-list_ax_strain_anal* 100, - -list_ra_stress_anal* 1e-3, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") - ax[1].set_ylabel(r'Radial stress (kPa)', size=fsize, weight="bold") - #ax[1].legend(loc='lower right', fontsize=fsize) - ax[1].xaxis.set_tick_params(labelsize=fsize) - ax[1].yaxis.set_tick_params(labelsize=fsize) - - # Plan p-q - ax[2].plot(-p_num*1e-3, - q_num*1e-3, - 'o', - color=cmap(0), - mec='b', - markersize=msize, - alpha=malpha, - label='Triaxial Driver') - ax[2].plot(-list_p_anal*1e-3, - list_q_anal*1e-3, - '-', - color='r', - mec='r', - markersize=msize, - alpha=malpha, - label='Semi-Analytical', linewidth=6) - ax[2].set_xlabel(r'Mean stress (kPa)', size=fsize, weight="bold") - ax[2].set_ylabel(r'Deviatoric Stress (kPa)', size=fsize, weight="bold") - ax[2].legend(loc='lower right', fontsize=fsize) - ax[2].xaxis.set_tick_params(labelsize=fsize) - ax[2].yaxis.set_tick_params(labelsize=fsize) - - plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) - - plt.show() + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + # File paths + outputDir = args.outputDir + geosDir = args.geosDir + + path = outputDir + "/ViscoModifiedCamClayResults.txt" + timeFilePath = geosDir + "/inputFiles/triaxialDriver/tables/time.geos" + xmlFilePath = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_base.xml" + xmlFilePath_case = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_ViscoModifiedCamClay.xml" + imposedStrainFilePath = geosDir + "/inputFiles/triaxialDriver/tables/axialStrain.geos" + + # Load GEOSX results + time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( + path, skiprows=5, unpack=True) + + # Extract mechanical parameters from XML file + tree = ElementTree.parse(xmlFilePath) + tree_case = ElementTree.parse(xmlFilePath_case) + model = tree_case.find('Tasks/TriaxialDriver') + param = tree.find('Constitutive/ViscoModifiedCamClay') + + refPressure = float(param.get("defaultRefPressure")) + refStrainVol = float(param.get("defaultRefStrainVol")) + shearModulus = float(param.get("defaultShearModulus")) + preConsolidationPressure = float(param.get("defaultPreConsolidationPressure")) + cslSlope = float(param.get("defaultCslSlope")) + virginCompressionIndex = float(param.get("defaultVirginCompressionIndex")) + recompressionIndex = float(param.get("defaultRecompressionIndex")) + relaxationTime = float(param.get("relaxationTime")) + initialStress = float(model.get("initialStress")) + + # Extract loading from input tables + imp_strain = np.loadtxt( + imposedStrainFilePath, skiprows=0, unpack=True) + + list_ax_strain_anal = [] + numStepPerLoadingPeriod = 10001 + + for i in range(0,len(imp_strain)-1): + dStrainPerStep = (imp_strain[i+1]-imp_strain[i])/numStepPerLoadingPeriod + loadingPeriod = np.arange(imp_strain[i],imp_strain[i+1]+dStrainPerStep,dStrainPerStep) + list_ax_strain_anal = np.concatenate((list_ax_strain_anal, loadingPeriod), axis=0) + + # Extract time from input tables + imp_time = np.loadtxt( + timeFilePath, skiprows=0, unpack=True) + + list_time_anal = [] + for i in range(0,len(imp_time)-1): + dTimePerStep = (imp_time[i+1]-imp_time[i])/numStepPerLoadingPeriod + timePeriod = np.arange(imp_time[i],imp_time[i+1]+dTimePerStep,dTimePerStep) + list_time_anal = np.concatenate((list_time_anal, timePeriod), axis=0) + + list_ax_stress_anal = np.zeros(len(list_ax_strain_anal)) + list_ra_stress_anal = np.zeros(len(list_ax_strain_anal)) + list_ra_strain_anal = np.zeros(len(list_ax_strain_anal)) + + p_anal = refPressure + list_ax_strain_anal += refStrainVol # Oedometric compaction: zero lateral strain + list_ax_stress_anal += initialStress # Assuming isotropic initial stress condition + list_ra_stress_anal += initialStress + + for idx in range(1,len(list_ax_strain_anal)): + delta_ax_strain_anal = list_ax_strain_anal[idx]-list_ax_strain_anal[idx-1] + delta_ra_strain_anal = 0 + + # Compute elastic moduli + bulkModulus = - p_anal/recompressionIndex + lameModulus = bulkModulus - 2.0/3.0*shearModulus + + # Elastic trial + delta_ax_stress_anal = (lameModulus+2.0*shearModulus)*delta_ax_strain_anal + 2.0*lameModulus*delta_ra_strain_anal + delta_ra_stress_anal = lameModulus*delta_ax_strain_anal + (2.0*lameModulus+2.0*shearModulus)*delta_ra_strain_anal + + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_stress_anal = list_ra_stress_anal[idx-1] + delta_ra_stress_anal + + p_anal = (ax_stress_anal + 2.0*ra_stress_anal)/3.0 + q_anal = -(ax_stress_anal - ra_stress_anal) + + # Plastic correction + F_anal = q_anal*q_anal/(cslSlope*cslSlope) + p_anal*(p_anal-preConsolidationPressure) + + if(F_anal>=0): + # Derivatives + dF_dp = 2.0*p_anal-preConsolidationPressure + dF_dq = 2.0*q_anal/(cslSlope*cslSlope) + dF_dpc = -p_anal + + dG_dp = dF_dp # associated plastic rule was considered + dG_dq = dF_dq + + dpc_dlambda = -preConsolidationPressure/(virginCompressionIndex-recompressionIndex)*dG_dp + hardeningRate = -dF_dpc*dpc_dlambda + + # See Runesson et al. 1999, see Eq. 29 + parameter_Aep = 3.0*shearModulus*dF_dq*dG_dq + bulkModulus*dF_dp*dG_dp + hardeningRate + + # Compute stress variations + delta_ax_strain_anal = list_ax_strain_anal[idx] - list_ax_strain_anal[idx-1] + delta_time_anal = list_time_anal[idx]-list_time_anal[idx-1] + + delta_strain_vol = delta_ax_strain_anal + delta_strain_shear = -delta_ax_strain_anal #3/2*delta_gamma + + # See Runesson et al. 1999, see Eq. 4, 80, 62, 63 + delta_lambda = delta_time_anal / relaxationTime * (F_anal/parameter_Aep) + delta_p_anal = (delta_strain_vol - delta_lambda*dG_dp)*bulkModulus + delta_q_anal = (delta_strain_shear - 3.0/2.0*delta_lambda*dG_dq)*2.0*shearModulus + + delta_ax_stress_anal = (3.0*delta_p_anal - 2.0*delta_q_anal)/3.0 + delta_ra_stress_anal = delta_ax_stress_anal + delta_q_anal + + # Update stress + ax_stress_anal = list_ax_stress_anal[idx-1] + delta_ax_stress_anal + ra_stress_anal = list_ra_stress_anal[idx-1] + delta_ra_stress_anal + + delta_pc = dpc_dlambda * delta_lambda + preConsolidationPressure += delta_pc + + list_ax_stress_anal[idx] = ax_stress_anal + list_ra_stress_anal[idx] = ra_stress_anal + + list_p_anal = (list_ax_stress_anal + 2.0 * list_ra_stress_anal) / 3.0 + list_q_anal = -(list_ax_stress_anal - list_ra_stress_anal) + + list_strain_vol_anal = list_ax_strain_anal + 2.0 * list_ra_strain_anal + + p_num = (ax_stress + 2.0 * ra_stress1) / 3.0 + q_num = -(ax_stress - ra_stress1) + + #Visualization parameters + fsize = 30 + msize = 12 + lw = 6 + malpha = 0.5 + fig, ax = plt.subplots(1, 3, figsize=(37, 10)) + cmap = plt.get_cmap("tab10") + + ax[0].plot(-ax_strain * 100, #convert to % + -ax_stress*1e-3, #convert to kPa + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[0].plot(-list_ax_strain_anal* 100, + -list_ax_stress_anal*1e-3, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + + ax[0].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") + ax[0].set_ylabel(r'Axial Stress (kPa)', size=fsize, weight="bold") + #ax[0].legend(loc='lower right', fontsize=fsize) + ax[0].xaxis.set_tick_params(labelsize=fsize) + ax[0].yaxis.set_tick_params(labelsize=fsize) + + ax[1].plot(-ax_strain * 100, + -ra_stress1 * 1e-3, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[1].plot(-list_ax_strain_anal* 100, + -list_ra_stress_anal* 1e-3, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[1].set_xlabel(r'Axial Strain (%)', size=fsize, weight="bold") + ax[1].set_ylabel(r'Radial stress (kPa)', size=fsize, weight="bold") + #ax[1].legend(loc='lower right', fontsize=fsize) + ax[1].xaxis.set_tick_params(labelsize=fsize) + ax[1].yaxis.set_tick_params(labelsize=fsize) + + # Plan p-q + ax[2].plot(-p_num*1e-3, + q_num*1e-3, + 'o', + color=cmap(0), + mec='b', + markersize=msize, + alpha=malpha, + label='Triaxial Driver') + ax[2].plot(-list_p_anal*1e-3, + list_q_anal*1e-3, + '-', + color='r', + mec='r', + markersize=msize, + alpha=malpha, + label='Semi-Analytical', linewidth=6) + ax[2].set_xlabel(r'Mean stress (kPa)', size=fsize, weight="bold") + ax[2].set_ylabel(r'Deviatoric Stress (kPa)', size=fsize, weight="bold") + ax[2].legend(loc='lower right', fontsize=fsize) + ax[2].xaxis.set_tick_params(labelsize=fsize) + ax[2].yaxis.set_tick_params(labelsize=fsize) + + plt.subplots_adjust(left=0.2, bottom=0.1, right=0.9, top=0.9, wspace=0.4, hspace=0.4) + + plt.show() if __name__ == "__main__": main() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample1Figure.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample1Figure.py index 3ee5c1af5f4..aaeb8bc8820 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample1Figure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample1Figure.py @@ -3,6 +3,8 @@ import numpy as np import matplotlib.pyplot as plt import xml.etree.ElementTree as ElementTree +import os +import argparse def FFunction(s, R): @@ -131,7 +133,21 @@ def getWellboreGeometryFromXML(xmlFilePath): def main(): - xmlFilePathPrefix = "../../../../../../../inputFiles/wellbore/DeviatedPoroElasticWellbore_Injection" + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + outputDir = args.outputDir + geosDir = args.geosDir + + xmlFilePathPrefix = geosDir + "/inputFiles/wellbore/DeviatedPoroElasticWellbore_Injection" geometry = getWellboreGeometryFromXML(xmlFilePathPrefix + "_benchmark.xml") parameters = getParametersFromXML(xmlFilePathPrefix + "_base.xml") @@ -187,7 +203,7 @@ def main(): # Get stress_ij and pore pressure # Data are extracted along the y-axis from the wellbore center r, pPore, stress_11, stress_12, stress_13, stress_22, stress_23, stress_33 = [], [], [], [], [], [], [], [] - for line in open('stress_11.curve', 'r'): + for line in open( outputDir + '/stress_11.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] rval = values[0] @@ -195,37 +211,37 @@ def main(): r.append(rval) stress_11.append(sigVal) - for line in open('stress_12.curve', 'r'): + for line in open( outputDir + '/stress_12.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] sigVal = values[1] * 1e-6 # convert to MPa stress_12.append(sigVal) - for line in open('stress_13.curve', 'r'): + for line in open( outputDir + '/stress_13.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] sigVal = values[1] * 1e-6 # convert to MPa stress_13.append(sigVal) - for line in open('stress_22.curve', 'r'): + for line in open( outputDir + '/stress_22.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] sigVal = values[1] * 1e-6 # convert to MPa stress_22.append(sigVal) - for line in open('stress_23.curve', 'r'): + for line in open( outputDir + '/stress_23.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] sigVal = values[1] * 1e-6 # convert to MPa stress_23.append(sigVal) - for line in open('stress_33.curve', 'r'): + for line in open( outputDir + '/stress_33.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] sigVal = values[1] * 1e-6 # convert to MPa stress_33.append(sigVal) - for line in open('pressure.curve', 'r'): + for line in open( outputDir + '/pressure.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] pPore.append(values[1] * 1e-6) diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample2Figure.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample2Figure.py index 24c2132409b..a27e706eed3 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample2Figure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample2Figure.py @@ -4,6 +4,8 @@ import matplotlib.pyplot as plt import wellboreAnalyticalSolutions as analytic import xml.etree.ElementTree as ElementTree +import os +import argparse # Rotate stress from local coordinates of an inclined borehole to the global coordinates system @@ -141,7 +143,21 @@ def getWellboreGeometryFromXML(xmlFilePath): def main(): - xmlFilePathPrefix = "../../../../../../../inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling" + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + outputDir = args.outputDir + geosDir = args.geosDir + + xmlFilePathPrefix = geosDir + "/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling" geometry = getWellboreGeometryFromXML(xmlFilePathPrefix + "_benchmark.xml") parameters = getParametersFromXML(xmlFilePathPrefix + "_base.xml") @@ -193,7 +209,7 @@ def main(): # Get radial coordinate and compute analytical results r = [] - for line in open('stress_11_drilling.curve', 'r'): + for line in open( outputDir + '/stress_11_drilling.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] rval = values[0] @@ -202,43 +218,43 @@ def main(): # Get stress_ij and pore pressure # These data are extracted along the y-axis from the well center (theta angle = 90°) stress_11, stress_12, stress_13, stress_22, stress_23, stress_33, pPore = [], [], [], [], [], [], [] - for line in open('stress_11_drilling.curve', 'r'): + for line in open( outputDir + '/stress_11_drilling.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] sigVal = values[1] * 1e-6 # convert to MPa stress_11.append(sigVal) - for line in open('stress_12_drilling.curve', 'r'): + for line in open( outputDir + '/stress_12_drilling.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] sigVal = values[1] * 1e-6 # convert to MPa stress_12.append(sigVal) - for line in open('stress_13_drilling.curve', 'r'): + for line in open( outputDir + '/stress_13_drilling.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] sigVal = values[1] * 1e-6 # convert to MPa stress_13.append(sigVal) - for line in open('stress_22_drilling.curve', 'r'): + for line in open( outputDir + '/stress_22_drilling.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] sigVal = values[1] * 1e-6 # convert to MPa stress_22.append(sigVal) - for line in open('stress_23_drilling.curve', 'r'): + for line in open( outputDir + '/stress_23_drilling.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] sigVal = values[1] * 1e-6 # convert to MPa stress_23.append(sigVal) - for line in open('stress_33_drilling.curve', 'r'): + for line in open( outputDir + '/stress_33_drilling.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] sigVal = values[1] * 1e-6 # convert to MPa stress_33.append(sigVal) - for line in open('pressure_drilling.curve', 'r'): + for line in open( outputDir + '/pressure_drilling.curve', 'r'): if not (line.strip().startswith("#") or line.strip() == ''): values = [float(s) for s in line.split()] pPoreVal = values[1] * 1e-6 # convert to MPa diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/edpWellbore_plot.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/edpWellbore_plot.py index cfb316156ac..88a45f27884 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/edpWellbore_plot.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/edpWellbore_plot.py @@ -6,240 +6,256 @@ from xml.etree import ElementTree import edpWellbore_analyticalResults as edpAnal import elastoPlasticWellboreAnalyticalSolutions as epwAnal +import os +import argparse def extractDataFromXMLList(paramList): - # Extract data from a list in XML such as "{ 1, 2, 3}" - return paramList.replace('{', '').replace('}', '').strip().split(',') + # Extract data from a list in XML such as "{ 1, 2, 3}" + return paramList.replace('{', '').replace('}', '').strip().split(',') def getDataFromXML(xmlFilePathPrefix): - # Get wellbore inner radius - xmlFilePath = xmlFilePathPrefix + "_benchmark.xml" - tree = ElementTree.parse(xmlFilePath) + # Get wellbore inner radius + xmlFilePath = xmlFilePathPrefix + "_benchmark.xml" + tree = ElementTree.parse(xmlFilePath) - meshParam = tree.find('Mesh/InternalWellbore') - radii = extractDataFromXMLList( meshParam.get("radius") ) - a0 = float(radii[0]) + meshParam = tree.find('Mesh/InternalWellbore') + radii = extractDataFromXMLList( meshParam.get("radius") ) + a0 = float(radii[0]) - # Get the temperature change on the inner surface of the wellbore - xmlFilePath = xmlFilePathPrefix + "_base.xml" - tree = ElementTree.parse(xmlFilePath) + # Get the temperature change on the inner surface of the wellbore + xmlFilePath = xmlFilePathPrefix + "_base.xml" + tree = ElementTree.parse(xmlFilePath) - fsParams = tree.findall('FieldSpecifications/FieldSpecification') - for fsParam in fsParams: - if fsParam.get('name') == 'stressXX': - sh = float( fsParam.get('scale') ) - if fsParam.get('name') == 'stressZZ': - sv = float( fsParam.get('scale') ) + fsParams = tree.findall('FieldSpecifications/FieldSpecification') + for fsParam in fsParams: + if fsParam.get('name') == 'stressXX': + sh = float( fsParam.get('scale') ) + if fsParam.get('name') == 'stressZZ': + sv = float( fsParam.get('scale') ) - pw = float( extractDataFromXMLList(tree.find('Functions/TableFunction').get('values') )[1]) + pw = float( extractDataFromXMLList(tree.find('Functions/TableFunction').get('values') )[1]) - defaultBulkModulus = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultBulkModulus') ) - defaultShearModulus = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultShearModulus') ) - defaultCohesion = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultCohesion') ) - defaultInitialFrictionAngle = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultInitialFrictionAngle') ) - defaultResidualFrictionAngle = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultResidualFrictionAngle') ) - defaultDilationRatio = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultDilationRatio') ) - defaultHardening = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultHardening') ) + defaultBulkModulus = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultBulkModulus') ) + defaultShearModulus = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultShearModulus') ) + defaultCohesion = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultCohesion') ) + defaultInitialFrictionAngle = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultInitialFrictionAngle') ) + defaultResidualFrictionAngle = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultResidualFrictionAngle') ) + defaultDilationRatio = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultDilationRatio') ) + defaultHardening = float( tree.find('Constitutive/ExtendedDruckerPrager').get('defaultHardening') ) - return [a0, sh, sv, pw, defaultBulkModulus, defaultShearModulus, defaultCohesion, defaultInitialFrictionAngle, defaultResidualFrictionAngle, defaultDilationRatio, defaultHardening] + return [a0, sh, sv, pw, defaultBulkModulus, defaultShearModulus, defaultCohesion, defaultInitialFrictionAngle, defaultResidualFrictionAngle, defaultDilationRatio, defaultHardening] def stressRotation(stress, phi_x): rotx = np.array([[np.cos(phi_x), np.sin(phi_x), 0.], [-np.sin(phi_x), np.cos(phi_x), 0.], [0., 0., 1.]]) return np.dot(np.dot(np.transpose(rotx), stress), rotx) def main(): - xmlFilePathPrefix = "../../../../../../../inputFiles/solidMechanics/ExtendedDruckerPragerWellbore" - xmlData = getDataFromXML(xmlFilePathPrefix) - - # Initial wellbore radius - a0 = xmlData[0] - - # Initial stresses - sh = -xmlData[1] #negative sign because of positive sign convention for compression stress in the analytical solution - sv = -xmlData[2] #negative sign because of positive sign convention for compression stress in the analytical solution - - # Boundary condition on the wellbore surface - pw = -xmlData[3] #negative sign because of positive sign convention for compression stress in the analytical solution - # Equivalent displacement condition for the analytical solution - a0_a_ratio = 1.075 # This ratio corresponds to pw, extracted from the relationship between pw and a0/a (see bottom-right figure) - - # Elastic moduli - K = xmlData[4] - G = xmlData[5] - nu = (3.0*K-2.0*G) / (6.0*K+2.0*G) - - # Elasto-plastic parameters - cohesion = xmlData[6] - initialFrictionAngle = xmlData[7] # deg - finalFrictionAngle = xmlData[8] # deg - dilationRatio = xmlData[9] - param_m = xmlData[10] # Extended Drucker-Prager hardening parameter, this is noted by c in the ref. Chen and Abousleiman (2017) - - # Note that the solution developed by Chen and Abousleiman (2017) is for an associated elasto-plastic model (i.e. dilationRatio = 1) with zero cohesion - assert dilationRatio == 1.0, "The associated model is considered by the reference solutions, please set the dilation ratio to 1.0" - assert cohesion == 0.0, "Zero cohesion is considered by the reference solutions, please set the cohesion to 0.0" - - # Get stress, time and element center from GEOSX results - stress_field_name = 'rock_stress' - hf_stress = h5py.File('stressHistory_rock.hdf5', 'r') - time = np.array( hf_stress.get(stress_field_name + ' Time') ) - center = np.array( hf_stress.get(stress_field_name + ' elementCenter') ) - stress = np.array( hf_stress.get(stress_field_name) ) - - # Get the deformed wellbore radius - hf_disp = h5py.File("displacementHistory.hdf5", 'r') - displacement = np.array( hf_disp.get('totalDisplacement') ) - node_position = np.array( hf_disp.get('totalDisplacement ReferencePosition') ) - da = displacement[:, 0, 0] - a = a0 + da - - # Compute total stress, the stress of each element is the average value of its eight Gauss points - nTimeSteps = 30 - stress_xx = ( sum(stress[nTimeSteps,:,6*i+0] for i in range(8)) )/8.0 - stress_yy = ( sum(stress[nTimeSteps,:,6*i+1] for i in range(8)) )/8.0 - stress_zz = ( sum(stress[nTimeSteps,:,6*i+2] for i in range(8)) )/8.0 - stress_yz = ( sum(stress[nTimeSteps,:,6*i+3] for i in range(8)) )/8.0 - stress_xz = ( sum(stress[nTimeSteps,:,6*i+4] for i in range(8)) )/8.0 - stress_xy = ( sum(stress[nTimeSteps,:,6*i+5] for i in range(8)) )/8.0 - - # Coordinate of elemnt center - nElements = center.shape[1] - xCoord = center[0, :, 0] - yCoord = center[0, :, 1] - - rCoord = np.sqrt( xCoord*xCoord + yCoord*yCoord ) - - # Compute stress components in cylindrical coordinate system - stress_rr = np.zeros(stress_xx.shape) - stress_tt = np.zeros(stress_xx.shape) - - for idx_elem in range(stress.shape[1]): - stressMatrix_cartesian = np.array([[stress_xx[idx_elem],stress_xy[idx_elem],stress_xz[idx_elem]],\ - [stress_xy[idx_elem],stress_yy[idx_elem],stress_yz[idx_elem]],\ - [stress_xz[idx_elem],stress_yz[idx_elem],stress_zz[idx_elem]]]) - - if(yCoord[idx_elem] != 0): - phi_x = np.arctan( xCoord[idx_elem]/yCoord[idx_elem] ) - else: - phi_x = 0 - - stressMatrix_cylindirical = stressRotation(stressMatrix_cartesian, phi_x) - stress_rr[idx_elem] = stressMatrix_cylindirical[1][1] - stress_tt[idx_elem] = stressMatrix_cylindirical[0][0] - - # Stress invariants at wellbore surface - stress_xx_wellboresurface = ( sum(stress[:,0,6*i+0] for i in range(8)) )/8.0 - stress_yy_wellboresurface = ( sum(stress[:,0,6*i+1] for i in range(8)) )/8.0 - stress_zz_wellboresurface = ( sum(stress[:,0,6*i+2] for i in range(8)) )/8.0 - stress_yz_wellboresurface = ( sum(stress[:,0,6*i+3] for i in range(8)) )/8.0 - stress_xz_wellboresurface = ( sum(stress[:,0,6*i+4] for i in range(8)) )/8.0 - stress_xy_wellboresurface = ( sum(stress[:,0,6*i+5] for i in range(8)) )/8.0 - p = (stress_xx_wellboresurface + stress_yy_wellboresurface + stress_zz_wellboresurface)/3.0 - q = np.sqrt(1.5) * np.sqrt( (stress_xx_wellboresurface-p)**2.0 + (stress_yy_wellboresurface-p)**2.0 + (stress_zz_wellboresurface-p)**2.0 + \ + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + + outputDir = args.outputDir + geosDir = args.geosDir + + xmlFilePathPrefix = geosDir + "/inputFiles/solidMechanics/ExtendedDruckerPragerWellbore" + xmlData = getDataFromXML(xmlFilePathPrefix) + + # Initial wellbore radius + a0 = xmlData[0] + + # Initial stresses + sh = -xmlData[1] #negative sign because of positive sign convention for compression stress in the analytical solution + sv = -xmlData[2] #negative sign because of positive sign convention for compression stress in the analytical solution + + # Boundary condition on the wellbore surface + pw = -xmlData[3] #negative sign because of positive sign convention for compression stress in the analytical solution + # Equivalent displacement condition for the analytical solution + a0_a_ratio = 1.075 # This ratio corresponds to pw, extracted from the relationship between pw and a0/a (see bottom-right figure) + + # Elastic moduli + K = xmlData[4] + G = xmlData[5] + nu = (3.0*K-2.0*G) / (6.0*K+2.0*G) + + # Elasto-plastic parameters + cohesion = xmlData[6] + initialFrictionAngle = xmlData[7] # deg + finalFrictionAngle = xmlData[8] # deg + dilationRatio = xmlData[9] + param_m = xmlData[10] # Extended Drucker-Prager hardening parameter, this is noted by c in the ref. Chen and Abousleiman (2017) + + # Note that the solution developed by Chen and Abousleiman (2017) is for an associated elasto-plastic model (i.e. dilationRatio = 1) with zero cohesion + assert dilationRatio == 1.0, "The associated model is considered by the reference solutions, please set the dilation ratio to 1.0" + assert cohesion == 0.0, "Zero cohesion is considered by the reference solutions, please set the cohesion to 0.0" + + # Get stress, time and element center from GEOSX results + stress_field_name = 'rock_stress' + hf_stress = h5py.File(outputDir + '/stressHistory_rock.hdf5', 'r') + time = np.array( hf_stress.get(stress_field_name + ' Time') ) + center = np.array( hf_stress.get(stress_field_name + ' elementCenter') ) + stress = np.array( hf_stress.get(stress_field_name) ) + + # Get the deformed wellbore radius + hf_disp = h5py.File(outputDir + "/displacementHistory.hdf5", 'r') + displacement = np.array( hf_disp.get('totalDisplacement') ) + node_position = np.array( hf_disp.get('totalDisplacement ReferencePosition') ) + da = displacement[:, 0, 0] + a = a0 + da + + # Compute total stress, the stress of each element is the average value of its eight Gauss points + nTimeSteps = 30 + stress_xx = ( sum(stress[nTimeSteps,:,6*i+0] for i in range(8)) )/8.0 + stress_yy = ( sum(stress[nTimeSteps,:,6*i+1] for i in range(8)) )/8.0 + stress_zz = ( sum(stress[nTimeSteps,:,6*i+2] for i in range(8)) )/8.0 + stress_yz = ( sum(stress[nTimeSteps,:,6*i+3] for i in range(8)) )/8.0 + stress_xz = ( sum(stress[nTimeSteps,:,6*i+4] for i in range(8)) )/8.0 + stress_xy = ( sum(stress[nTimeSteps,:,6*i+5] for i in range(8)) )/8.0 + + # Coordinate of elemnt center + nElements = center.shape[1] + xCoord = center[0, :, 0] + yCoord = center[0, :, 1] + + rCoord = np.sqrt( xCoord*xCoord + yCoord*yCoord ) + + # Compute stress components in cylindrical coordinate system + stress_rr = np.zeros(stress_xx.shape) + stress_tt = np.zeros(stress_xx.shape) + + for idx_elem in range(stress.shape[1]): + stressMatrix_cartesian = np.array([[stress_xx[idx_elem],stress_xy[idx_elem],stress_xz[idx_elem]],\ + [stress_xy[idx_elem],stress_yy[idx_elem],stress_yz[idx_elem]],\ + [stress_xz[idx_elem],stress_yz[idx_elem],stress_zz[idx_elem]]]) + + if(yCoord[idx_elem] != 0): + phi_x = np.arctan( xCoord[idx_elem]/yCoord[idx_elem] ) + else: + phi_x = 0 + + stressMatrix_cylindirical = stressRotation(stressMatrix_cartesian, phi_x) + stress_rr[idx_elem] = stressMatrix_cylindirical[1][1] + stress_tt[idx_elem] = stressMatrix_cylindirical[0][0] + + # Stress invariants at wellbore surface + stress_xx_wellboresurface = ( sum(stress[:,0,6*i+0] for i in range(8)) )/8.0 + stress_yy_wellboresurface = ( sum(stress[:,0,6*i+1] for i in range(8)) )/8.0 + stress_zz_wellboresurface = ( sum(stress[:,0,6*i+2] for i in range(8)) )/8.0 + stress_yz_wellboresurface = ( sum(stress[:,0,6*i+3] for i in range(8)) )/8.0 + stress_xz_wellboresurface = ( sum(stress[:,0,6*i+4] for i in range(8)) )/8.0 + stress_xy_wellboresurface = ( sum(stress[:,0,6*i+5] for i in range(8)) )/8.0 + p = (stress_xx_wellboresurface + stress_yy_wellboresurface + stress_zz_wellboresurface)/3.0 + q = np.sqrt(1.5) * np.sqrt( (stress_xx_wellboresurface-p)**2.0 + (stress_yy_wellboresurface-p)**2.0 + (stress_zz_wellboresurface-p)**2.0 + \ stress_xy_wellboresurface**2.0 + stress_xz_wellboresurface**2.0 + stress_yz_wellboresurface**2.0 ) - # Analytical results - r_ep_analytic,srr_ep_analytic,stt_ep_analytic,szz_ep_analytic,r_elas_analytic,srr_elas_analytic,stt_elas_analytic,szz_elas_analytic,\ + # Analytical results + r_ep_analytic,srr_ep_analytic,stt_ep_analytic,szz_ep_analytic,r_elas_analytic,srr_elas_analytic,stt_elas_analytic,szz_elas_analytic,\ pw_analytic,p_wellsurface_analytic,q_wellsurface_analytic = edpAnal.EDP(a0_a_ratio, sh, sv, nu, a0, G, initialFrictionAngle, finalFrictionAngle, param_m) - - # Compute pressure at wellbore surface - list_a0_a_ratio = np.arange(1.0,1.1,0.001) - list_pw_analytic = [] - list_p_wellsurface_analytic = [] - list_q_wellsurface_analytic = [] - - for a0_a_ratio_val in list_a0_a_ratio: - tmp = edpAnal.EDP(a0_a_ratio_val, sh, sv, nu, a0, G, initialFrictionAngle, finalFrictionAngle, param_m) - pw_analytic = tmp[8] - p_wellsurface_analytic = tmp[9] - q_wellsurface_analytic = tmp[10] - list_pw_analytic.append(pw_analytic) - list_p_wellsurface_analytic.append(p_wellsurface_analytic) - list_q_wellsurface_analytic.append(q_wellsurface_analytic) - - # Plots - plt.figure(figsize=(15,10)) - - # Plot GEOS results versus analytical results for elasto-plastic material - plt.subplot(2,2,1) - plt.plot( rCoord/rCoord[0],-stress_rr,'r+',label=r'$\sigma_{rr}$: GEOS Plasticity') - plt.plot(r_ep_analytic,srr_ep_analytic, 'r', label=r'$\sigma_{rr}$: Analytical Plasticity') - plt.plot(r_elas_analytic,srr_elas_analytic, 'r') - - plt.plot( rCoord/rCoord[0],-stress_tt,'b+',label=r'$\sigma_{\theta\theta}$: GEOS Plasticity') - plt.plot(r_ep_analytic,stt_ep_analytic, 'b', label=r'$\sigma_{\theta\theta}$: Analytical Plasticity') - plt.plot(r_elas_analytic,stt_elas_analytic, 'b') - - plt.plot( rCoord/rCoord[0],-stress_zz,'g+',label=r'$\sigma_{zz}$: GEOS Plasticity') - plt.plot(r_ep_analytic,szz_ep_analytic, 'g', label=r'$\sigma_{zz}$: Analytical Plasticity') - plt.plot(r_elas_analytic,szz_elas_analytic, 'g') - - plt.plot([r_ep_analytic[0],r_ep_analytic[0]],[0.0,20e6],'k--', label='Elastic-Plastic boundary') - - plt.ylabel('Stresses [Pa]') - plt.xlabel(r'Normalized radial coordinate, $r/a$') - plt.xlim(1.0,10.0) - plt.ylim(0.0,20e6) - plt.yticks(np.linspace(0.0,20e6,11)) - plt.xscale('log', subs=range(2,10)) - plt.legend() - - # Plot GEOS results for elasto-plastic material versus analytical results for elastic material - r_elas_assumed,srr_elas_assumed,stt_elas_assumed,szz_elas_assumed = epwAnal.solution_elastic(sh,sv,1.0,pw) - - plt.subplot(2,2,2) - plt.plot( rCoord/rCoord[0],-stress_rr,'r+',label=r'$\sigma_{rr}$: GEOS Plasticity') - plt.plot(r_elas_assumed,srr_elas_assumed, 'r', label=r'$\sigma_{rr}$: Analytical Elasticity') - - plt.plot( rCoord/rCoord[0],-stress_tt,'b+',label=r'$\sigma_{\theta\theta}$: GEOS Plasticity') - plt.plot(r_elas_assumed,stt_elas_assumed, 'b', label=r'$\sigma_{\theta\theta}$: Analytical Elasticity') - - plt.plot( rCoord/rCoord[0],-stress_zz,'g+',label=r'$\sigma_{zz}$: GEOS Plasticity') - plt.plot(r_elas_assumed,szz_elas_assumed, 'g', label=r'$\sigma_{zz}$: Analytical Elasticity') - - plt.ylabel('Stresses [Pa]') - plt.xlabel(r'Normalized radial coordinate, $r/a$') - plt.xlim(1.0,10.0) - plt.ylim(0.0,20e6) - plt.yticks(np.linspace(0.0,20e6,11)) - plt.xscale('log', subs=range(2,10)) - plt.legend() - - # Plot the stress path on the p-q plan when the well surface pressure decrease from the in-situ condition - initialFrictionAngle *= np.pi/180.0 # converted to rad - finalFrictionAngle *= np.pi/180.0 # converted to rad - param_b_i = edpAnal.compute_param_b(initialFrictionAngle) - param_b_f = edpAnal.compute_param_b(finalFrictionAngle) - p_yieldSurface = np.arange(0,15e6,1) - q_yieldSurface_i = p_yieldSurface*param_b_i - q_yieldSurface_f = p_yieldSurface*param_b_f - - plt.subplot(2,2,3) - plt.plot(-p,q,'ko',label='GEOS') - plt.plot(list_p_wellsurface_analytic,list_q_wellsurface_analytic,'b',label='Analytical') - plt.plot(p_yieldSurface,q_yieldSurface_i,'g--',label='Initial yield surface') - plt.plot(p_yieldSurface,q_yieldSurface_f,'r--',label='Final yield surface') - - plt.xlabel('p (Pa)') - plt.ylabel('q (Pa)') - plt.xlim(0,15e6) - plt.ylim(0,10e6) - plt.legend() - - # Plot the wellbore deformation a0/a versus wellbore surface pressure pw - pw = stress_xx_wellboresurface - - plt.subplot(2,2,4) - plt.plot(a0/a, -pw,'ko',label='GEOS') - plt.plot(list_a0_a_ratio,list_pw_analytic,'b',label='Analytical') - plt.xlabel('a0/a') - plt.ylabel('pw (Pa)') - plt.xlim(1.0,1.1) - plt.ylim(0,12e6) - plt.legend() - - plt.savefig('edpWellboreVerification.png') - + + # Compute pressure at wellbore surface + list_a0_a_ratio = np.arange(1.0,1.1,0.001) + list_pw_analytic = [] + list_p_wellsurface_analytic = [] + list_q_wellsurface_analytic = [] + + for a0_a_ratio_val in list_a0_a_ratio: + tmp = edpAnal.EDP(a0_a_ratio_val, sh, sv, nu, a0, G, initialFrictionAngle, finalFrictionAngle, param_m) + pw_analytic = tmp[8] + p_wellsurface_analytic = tmp[9] + q_wellsurface_analytic = tmp[10] + list_pw_analytic.append(pw_analytic) + list_p_wellsurface_analytic.append(p_wellsurface_analytic) + list_q_wellsurface_analytic.append(q_wellsurface_analytic) + + # Plots + plt.figure(figsize=(15,10)) + + # Plot GEOS results versus analytical results for elasto-plastic material + plt.subplot(2,2,1) + plt.plot( rCoord/rCoord[0],-stress_rr,'r+',label=r'$\sigma_{rr}$: GEOS Plasticity') + plt.plot(r_ep_analytic,srr_ep_analytic, 'r', label=r'$\sigma_{rr}$: Analytical Plasticity') + plt.plot(r_elas_analytic,srr_elas_analytic, 'r') + + plt.plot( rCoord/rCoord[0],-stress_tt,'b+',label=r'$\sigma_{\theta\theta}$: GEOS Plasticity') + plt.plot(r_ep_analytic,stt_ep_analytic, 'b', label=r'$\sigma_{\theta\theta}$: Analytical Plasticity') + plt.plot(r_elas_analytic,stt_elas_analytic, 'b') + + plt.plot( rCoord/rCoord[0],-stress_zz,'g+',label=r'$\sigma_{zz}$: GEOS Plasticity') + plt.plot(r_ep_analytic,szz_ep_analytic, 'g', label=r'$\sigma_{zz}$: Analytical Plasticity') + plt.plot(r_elas_analytic,szz_elas_analytic, 'g') + + plt.plot([r_ep_analytic[0],r_ep_analytic[0]],[0.0,20e6],'k--', label='Elastic-Plastic boundary') + + plt.ylabel('Stresses [Pa]') + plt.xlabel(r'Normalized radial coordinate, $r/a$') + plt.xlim(1.0,10.0) + plt.ylim(0.0,20e6) + plt.yticks(np.linspace(0.0,20e6,11)) + plt.xscale('log', subs=range(2,10)) + plt.legend() + + # Plot GEOS results for elasto-plastic material versus analytical results for elastic material + r_elas_assumed,srr_elas_assumed,stt_elas_assumed,szz_elas_assumed = epwAnal.solution_elastic(sh,sv,1.0,pw) + + plt.subplot(2,2,2) + plt.plot( rCoord/rCoord[0],-stress_rr,'r+',label=r'$\sigma_{rr}$: GEOS Plasticity') + plt.plot(r_elas_assumed,srr_elas_assumed, 'r', label=r'$\sigma_{rr}$: Analytical Elasticity') + + plt.plot( rCoord/rCoord[0],-stress_tt,'b+',label=r'$\sigma_{\theta\theta}$: GEOS Plasticity') + plt.plot(r_elas_assumed,stt_elas_assumed, 'b', label=r'$\sigma_{\theta\theta}$: Analytical Elasticity') + + plt.plot( rCoord/rCoord[0],-stress_zz,'g+',label=r'$\sigma_{zz}$: GEOS Plasticity') + plt.plot(r_elas_assumed,szz_elas_assumed, 'g', label=r'$\sigma_{zz}$: Analytical Elasticity') + + plt.ylabel('Stresses [Pa]') + plt.xlabel(r'Normalized radial coordinate, $r/a$') + plt.xlim(1.0,10.0) + plt.ylim(0.0,20e6) + plt.yticks(np.linspace(0.0,20e6,11)) + plt.xscale('log', subs=range(2,10)) + plt.legend() + + # Plot the stress path on the p-q plan when the well surface pressure decrease from the in-situ condition + initialFrictionAngle *= np.pi/180.0 # converted to rad + finalFrictionAngle *= np.pi/180.0 # converted to rad + param_b_i = edpAnal.compute_param_b(initialFrictionAngle) + param_b_f = edpAnal.compute_param_b(finalFrictionAngle) + p_yieldSurface = np.arange(0,15e6,1) + q_yieldSurface_i = p_yieldSurface*param_b_i + q_yieldSurface_f = p_yieldSurface*param_b_f + + plt.subplot(2,2,3) + plt.plot(-p,q,'ko',label='GEOS') + plt.plot(list_p_wellsurface_analytic,list_q_wellsurface_analytic,'b',label='Analytical') + plt.plot(p_yieldSurface,q_yieldSurface_i,'g--',label='Initial yield surface') + plt.plot(p_yieldSurface,q_yieldSurface_f,'r--',label='Final yield surface') + + plt.xlabel('p (Pa)') + plt.ylabel('q (Pa)') + plt.xlim(0,15e6) + plt.ylim(0,10e6) + plt.legend() + + # Plot the wellbore deformation a0/a versus wellbore surface pressure pw + pw = stress_xx_wellboresurface + + plt.subplot(2,2,4) + plt.plot(a0/a, -pw,'ko',label='GEOS') + plt.plot(list_a0_a_ratio,list_pw_analytic,'b',label='Analytical') + plt.xlabel('a0/a') + plt.ylabel('pw (Pa)') + plt.xlim(1.0,1.1) + plt.ylim(0,12e6) + plt.legend() + + plt.savefig('edpWellboreVerification.png') + if __name__ == "__main__": - main() - + main() + diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/kirschWellbore/kirschWellboreFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/kirschWellbore/kirschWellboreFigure.py index df68ed728e2..8c683c2db28 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/kirschWellbore/kirschWellboreFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/kirschWellbore/kirschWellboreFigure.py @@ -5,6 +5,8 @@ import xml.etree.ElementTree as ElementTree import math from math import sin, cos, tan, exp, atan, asin +import os +import argparse class Analytical: @@ -112,12 +114,25 @@ def dispRotation(disp, phi_x): def main(): + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + # Load and process GEOSX results # File path - hdf5File1Path = "stress_history.hdf5" - hdf5File2Path = "displacement_history.hdf5" - xmlFile1Path = "../../../../../../../inputFiles/solidMechanics/KirschProblem_base.xml" - xmlFile2Path = "../../../../../../../inputFiles/solidMechanics/KirschProblem_benchmark.xml" + outputDir = args.outputDir + geosDir = args.geosDir + hdf5File1Path = outputDir + "/stress_history.hdf5" + hdf5File2Path = outputDir + "/displacement_history.hdf5" + xmlFile1Path = geosDir + "/inputFiles/solidMechanics/KirschProblem_base.xml" + xmlFile2Path = geosDir + "/inputFiles/solidMechanics/KirschProblem_benchmark.xml" # Read HDF5 # Global Coordinate of Element Center diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/linearThermalDiffusion_plot.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/linearThermalDiffusion_plot.py index 9c364049289..67e336576c2 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/linearThermalDiffusion_plot.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/linearThermalDiffusion/linearThermalDiffusion_plot.py @@ -1,5 +1,7 @@ import os import sys +import os +import argparse import numpy as np import matplotlib.pyplot as plt @@ -10,125 +12,136 @@ # Analytical results def steadyState(Tin, Tout, Rin, Rout, radialCoordinate): - return Tin + (Tout - Tin) * (np.log(radialCoordinate) - np.log(Rin)) / (np.log(Rout) - np.log(Rin)) + return Tin + (Tout - Tin) * (np.log(radialCoordinate) - np.log(Rin)) / (np.log(Rout) - np.log(Rin)) def diffusionFunction(radialCoordinate, Rin, diffusionCoefficient, diffusionTime): - return special.erfc( (radialCoordinate - Rin) / 2.0 / np.sqrt( diffusionCoefficient * diffusionTime ) ) + return special.erfc( (radialCoordinate - Rin) / 2.0 / np.sqrt( diffusionCoefficient * diffusionTime ) ) def computeTransientTemperature(Tin, Tout, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime): - # Ref. Wang and Papamichos (1994), https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94WR01774 - return Tout + (Tin-Tout) * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) - + # Ref. Wang and Papamichos (1994), https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94WR01774 + return Tout + (Tin-Tout) * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) + def computeThermalDiffusionCoefficient(thermalConductivity, volumetricHeatCapacity): - return thermalConductivity / volumetricHeatCapacity - + return thermalConductivity / volumetricHeatCapacity + def extractDataFromXMLList(paramList): - # Extract data from a list in XML such as "{ 1, 2, 3}" - return paramList.replace('{', '').replace('}', '').strip().split(',') + # Extract data from a list in XML such as "{ 1, 2, 3}" + return paramList.replace('{', '').replace('}', '').strip().split(',') def getWellboreGeometryFromXML(xmlFilePath): - tree = ElementTree.parse(xmlFilePath) + tree = ElementTree.parse(xmlFilePath) - meshParam = tree.find('Mesh/InternalWellbore') - radii = extractDataFromXMLList( meshParam.get("radius") ) + meshParam = tree.find('Mesh/InternalWellbore') + radii = extractDataFromXMLList( meshParam.get("radius") ) - Rin = float(radii[0]) - Rout = float(radii[-1]) + Rin = float(radii[0]) + Rout = float(radii[-1]) - return [Rin, Rout] + return [Rin, Rout] def getLoadingFromXML(xmlFilePath): - tree = ElementTree.parse(xmlFilePath) - fsParams = tree.findall('FieldSpecifications/FieldSpecification') - - for fsParam in fsParams: - if ( (fsParam.get('fieldName') == "pressure") & (fsParam.get('initialCondition') != "1") ): - if fsParam.get('setNames') == "{ rneg }": - Pin = float(fsParam.get('scale')) - if fsParam.get('setNames') == "{ rpos }": - Pout = float(fsParam.get('scale')) - - for fsParam in fsParams: - if ( (fsParam.get('fieldName') == "temperature") & (fsParam.get('initialCondition') != "1") ): - if fsParam.get('setNames') == "{ rneg }": - Tin = float(fsParam.get('scale')) - if fsParam.get('setNames') == "{ rpos }": - Tout = float(fsParam.get('scale')) + tree = ElementTree.parse(xmlFilePath) + fsParams = tree.findall('FieldSpecifications/FieldSpecification') + + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "pressure") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Pin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Pout = float(fsParam.get('scale')) + + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "temperature") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Tin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Tout = float(fsParam.get('scale')) - tree_SinglePhaseThermalConductivities = tree.findall('Constitutive/SinglePhaseThermalConductivity') + tree_SinglePhaseThermalConductivities = tree.findall('Constitutive/SinglePhaseThermalConductivity') - for tree_SinglePhaseThermalConductivity in tree_SinglePhaseThermalConductivities: - if tree_SinglePhaseThermalConductivity.get('name') == "thermalCond_linear": - thermalConductivity = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('defaultThermalConductivityComponents') )[0] ) + for tree_SinglePhaseThermalConductivity in tree_SinglePhaseThermalConductivities: + if tree_SinglePhaseThermalConductivity.get('name') == "thermalCond_linear": + thermalConductivity = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('defaultThermalConductivityComponents') )[0] ) - tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') + tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') - for tree_SolidInternalEnergy in tree_SolidInternalEnergies: - if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_linear": - volumetricHeatCapacity = float( tree_SolidInternalEnergy.get('referenceVolumetricHeatCapacity') ) - - permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) + for tree_SolidInternalEnergy in tree_SolidInternalEnergies: + if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_linear": + volumetricHeatCapacity = float( tree_SolidInternalEnergy.get('referenceVolumetricHeatCapacity') ) + + permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) - porosity = float( tree.find('Constitutive/PressurePorosity').get('defaultReferencePorosity') ) - - fluidViscosity = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('defaultViscosity') ) + porosity = float( tree.find('Constitutive/PressurePorosity').get('defaultReferencePorosity') ) + + fluidViscosity = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('defaultViscosity') ) - fluidCompressibility = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('compressibility') ) + fluidCompressibility = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('compressibility') ) - fluidThermalExpansionCoefficient = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('thermalExpansionCoeff') ) + fluidThermalExpansionCoefficient = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('thermalExpansionCoeff') ) - return [Pin, Pout, Tin, Tout, thermalConductivity, volumetricHeatCapacity, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient] + return [Pin, Pout, Tin, Tout, thermalConductivity, volumetricHeatCapacity, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient] def main(): - xmlFilePath = "../../../../../../../inputFiles/singlePhaseFlow/thermalCompressible_2d" - - Rin, Rout = getWellboreGeometryFromXML(xmlFilePath+"_benchmark.xml") + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + + # Parse the command-line arguments + args = parser.parse_args() + + geosDir = args.geosDir + + xmlFilePath = geosDir + "/inputFiles/singlePhaseFlow/thermalCompressible_2d" + + Rin, Rout = getWellboreGeometryFromXML(xmlFilePath+"_benchmark.xml") - Pin, Pout, Tin, Tout, thermalConductivity, volumetricHeatCapacity, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient = getLoadingFromXML(xmlFilePath+"_base.xml") + Pin, Pout, Tin, Tout, thermalConductivity, volumetricHeatCapacity, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient = getLoadingFromXML(xmlFilePath+"_base.xml") - plt.figure(figsize=(10,7)) - font = {'size' : 16} - plt.rc('font', **font) + plt.figure(figsize=(10,7)) + font = {'size' : 16} + plt.rc('font', **font) - for chart_idx, idx in enumerate([1, 2, 5, 10]): - # Numerical results - data = pd.read_csv(f'data_{idx}.csv') - radialCoordinate = (data['elementCenter:0']**2.0 + data['elementCenter:1']**2.0)**0.5 - temperature = data['temperature'] - diffusionTime = data['Time'][0] + for chart_idx, idx in enumerate([1, 2, 5, 10]): + # Numerical results + data = pd.read_csv(f'data_{idx}.csv') + radialCoordinate = (data['elementCenter:0']**2.0 + data['elementCenter:1']**2.0)**0.5 + temperature = data['temperature'] + diffusionTime = data['Time'][0] - # Analytical results - thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(thermalConductivity, volumetricHeatCapacity) + # Analytical results + thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(thermalConductivity, volumetricHeatCapacity) - T_transient = computeTransientTemperature(Tin, Tout, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime) - - # Analytical results of the steady state regime for comparison - T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate) + T_transient = computeTransientTemperature(Tin, Tout, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime) + + # Analytical results of the steady state regime for comparison + T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate) - # Visualization - # Temperature - plt.subplot(2,2,chart_idx+1) - plt.plot( radialCoordinate, temperature, 'k+' , label='GEOSX' ) - plt.plot( radialCoordinate, T_transient, 'r-' , label='Analytic, infinite domain' ) - plt.plot( radialCoordinate, T_steadyState, 'b-' , label='Steady State' ) + # Visualization + # Temperature + plt.subplot(2,2,chart_idx+1) + plt.plot( radialCoordinate, temperature, 'k+' , label='GEOSX' ) + plt.plot( radialCoordinate, T_transient, 'r-' , label='Analytic, infinite domain' ) + plt.plot( radialCoordinate, T_steadyState, 'b-' , label='Steady State' ) - if chart_idx==1: - plt.legend() + if chart_idx==1: + plt.legend() - if chart_idx in [2,3]: - plt.xlabel('Radial distance from well center') + if chart_idx in [2,3]: + plt.xlabel('Radial distance from well center') - if chart_idx in [0,2]: - plt.ylabel('Temperature (°C)') + if chart_idx in [0,2]: + plt.ylabel('Temperature (°C)') - plt.ylim(-30,110) - plt.xlim(0,1.0) - plt.title('t = '+str(diffusionTime)+'(s)') - plt.tight_layout() + plt.ylim(-30,110) + plt.xlim(0,1.0) + plt.title('t = '+str(diffusionTime)+'(s)') + plt.tight_layout() - plt.show() + plt.show() if __name__ == "__main__": - main() + main() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/temperatureDependentSinglePhaseThermalConductivity_plot.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/temperatureDependentSinglePhaseThermalConductivity_plot.py index a6ed534271d..74dc2483e90 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/temperatureDependentSinglePhaseThermalConductivity_plot.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentSinglePhaseThermalConductivity/temperatureDependentSinglePhaseThermalConductivity_plot.py @@ -1,5 +1,7 @@ import os import sys +import os +import argparse import numpy as np import matplotlib.pyplot as plt @@ -14,18 +16,18 @@ # Analytical results for linear thermal behavior def steadyState(Tin, Tout, Rin, Rout, radialCoordinate): - return Tin + (Tout - Tin) * (np.log(radialCoordinate) - np.log(Rin)) / (np.log(Rout) - np.log(Rin)) + return Tin + (Tout - Tin) * (np.log(radialCoordinate) - np.log(Rin)) / (np.log(Rout) - np.log(Rin)) def diffusionFunction(radialCoordinate, Rin, diffusionCoefficient, diffusionTime): - return special.erfc( (radialCoordinate - Rin) / 2.0 / np.sqrt( diffusionCoefficient * diffusionTime ) ) + return special.erfc( (radialCoordinate - Rin) / 2.0 / np.sqrt( diffusionCoefficient * diffusionTime ) ) def computeTransientTemperature(Tin, Tout, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime): - # Ref. Wang and Papamichos (1994), https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94WR01774 - return Tout + (Tin-Tout) * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) - + # Ref. Wang and Papamichos (1994), https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94WR01774 + return Tout + (Tin-Tout) * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) + def computeThermalDiffusionCoefficient(thermalConductivity, volumetricHeatCapacity): - return thermalConductivity / volumetricHeatCapacity - + return thermalConductivity / volumetricHeatCapacity + # Finite difference results for non-linear thermal behavior def temperatureDependentThermalConductivity(lambda0, lambda_gradient, T, Treference): return lambda0 + lambda_gradient*(T-Treference) @@ -38,7 +40,7 @@ def coefficientMatrix(thermalConductivity, volumetricHeatCapacity, r, dt, N): A = np.zeros((N+1, N+1)) for i in range(1,N): - dr = r[i] - r[i-1] + dr = r[i] - r[i-1] r_i = r[i] diffusivity_i = thermalConductivity[i]/volumetricHeatCapacity[i] @@ -74,132 +76,143 @@ def solve_radial_diffusion(r, tmax, dt, Tin, Tout, lambda0, lambda_gradient, c0, def extractDataFromXMLList(paramList): - # Extract data from a list in XML such as "{ 1, 2, 3}" - return paramList.replace('{', '').replace('}', '').strip().split(',') + # Extract data from a list in XML such as "{ 1, 2, 3}" + return paramList.replace('{', '').replace('}', '').strip().split(',') def getWellboreGeometryFromXML(xmlFilePath): - tree = ElementTree.parse(xmlFilePath) + tree = ElementTree.parse(xmlFilePath) - meshParam = tree.find('Mesh/InternalWellbore') - radii = extractDataFromXMLList( meshParam.get("radius") ) + meshParam = tree.find('Mesh/InternalWellbore') + radii = extractDataFromXMLList( meshParam.get("radius") ) - Rin = float(radii[0]) - Rout = float(radii[-1]) + Rin = float(radii[0]) + Rout = float(radii[-1]) - return [Rin, Rout] + return [Rin, Rout] def getLoadingFromXML(xmlFilePath): - tree = ElementTree.parse(xmlFilePath) - fsParams = tree.findall('FieldSpecifications/FieldSpecification') + tree = ElementTree.parse(xmlFilePath) + fsParams = tree.findall('FieldSpecifications/FieldSpecification') - for fsParam in fsParams: - if ( (fsParam.get('fieldName') == "pressure") & (fsParam.get('initialCondition') != "1") ): - if fsParam.get('setNames') == "{ rneg }": - Pin = float(fsParam.get('scale')) - if fsParam.get('setNames') == "{ rpos }": - Pout = float(fsParam.get('scale')) + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "pressure") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Pin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Pout = float(fsParam.get('scale')) - for fsParam in fsParams: - if ( (fsParam.get('fieldName') == "temperature") & (fsParam.get('initialCondition') != "1") ): - if fsParam.get('setNames') == "{ rneg }": - Tin = float(fsParam.get('scale')) - if fsParam.get('setNames') == "{ rpos }": - Tout = float(fsParam.get('scale')) + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "temperature") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Tin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Tout = float(fsParam.get('scale')) - tree_SinglePhaseThermalConductivities = tree.findall('Constitutive/SinglePhaseThermalConductivity') + tree_SinglePhaseThermalConductivities = tree.findall('Constitutive/SinglePhaseThermalConductivity') - for tree_SinglePhaseThermalConductivity in tree_SinglePhaseThermalConductivities: - if tree_SinglePhaseThermalConductivity.get('name') == "thermalCond_nonLinear": - defaultThermalConductivity = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('defaultThermalConductivityComponents') )[0] ) + for tree_SinglePhaseThermalConductivity in tree_SinglePhaseThermalConductivities: + if tree_SinglePhaseThermalConductivity.get('name') == "thermalCond_nonLinear": + defaultThermalConductivity = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('defaultThermalConductivityComponents') )[0] ) - thermalConductivityGradient = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('thermalConductivityGradientComponents') )[0] ) - referenceTemperature = float( tree_SinglePhaseThermalConductivity.get('referenceTemperature') ) + thermalConductivityGradient = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('thermalConductivityGradientComponents') )[0] ) + referenceTemperature = float( tree_SinglePhaseThermalConductivity.get('referenceTemperature') ) - tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') + tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') - for tree_SolidInternalEnergy in tree_SolidInternalEnergies: - if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_linear": - volumetricHeatCapacity = float( tree_SolidInternalEnergy.get('referenceVolumetricHeatCapacity') ) - dVolumetricHeatCapacity_dTemperature = 0.0 - - - permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) + for tree_SolidInternalEnergy in tree_SolidInternalEnergies: + if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_linear": + volumetricHeatCapacity = float( tree_SolidInternalEnergy.get('referenceVolumetricHeatCapacity') ) + dVolumetricHeatCapacity_dTemperature = 0.0 + + + permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) - porosity = float( tree.find('Constitutive/PressurePorosity').get('defaultReferencePorosity') ) - - fluidViscosity = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('defaultViscosity') ) + porosity = float( tree.find('Constitutive/PressurePorosity').get('defaultReferencePorosity') ) + + fluidViscosity = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('defaultViscosity') ) - fluidCompressibility = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('compressibility') ) + fluidCompressibility = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('compressibility') ) - fluidThermalExpansionCoefficient = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('thermalExpansionCoeff') ) + fluidThermalExpansionCoefficient = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('thermalExpansionCoeff') ) - return [Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient] + return [Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient] def main(): - xmlFilePath = "../../../../../../../inputFiles/singlePhaseFlow/" - - Rin, Rout = getWellboreGeometryFromXML(xmlFilePath+"thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml") - - Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient = getLoadingFromXML(xmlFilePath+"thermalCompressible_2d_base.xml") - - plt.figure(figsize=(10,7)) - font = {'size' : 16} - plt.rc('font', **font) - - for chart_idx, idx in enumerate([1, 2, 5, 10]): - # Numerical results - data = pd.read_csv(f'data_{idx}.csv') - data.dropna(inplace=True) - data.drop_duplicates(inplace=True) - data.reset_index(drop=True, inplace=True) - - radialCoordinate = (data['elementCenter:0']**2.0 + data['elementCenter:1']**2.0)**0.5 - temperature = data['temperature'] - #pressure = data['pressure'] - diffusionTime = data['Time'][0] - - # Analytical results for linear thermal behavior, for comparison - radialCoordinate_anal = np.arange(Rin, Rout, (Rout-Rin)/100) + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + + # Parse the command-line arguments + args = parser.parse_args() + + geosDir = args.geosDir + + xmlFilePath = geosDir + "/inputFiles/singlePhaseFlow/" + + Rin, Rout = getWellboreGeometryFromXML(xmlFilePath+"thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml") + + Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient = getLoadingFromXML(xmlFilePath+"thermalCompressible_2d_base.xml") + + plt.figure(figsize=(10,7)) + font = {'size' : 16} + plt.rc('font', **font) + + for chart_idx, idx in enumerate([1, 2, 5, 10]): + # Numerical results + data = pd.read_csv(f'data_{idx}.csv') + data.dropna(inplace=True) + data.drop_duplicates(inplace=True) + data.reset_index(drop=True, inplace=True) + + radialCoordinate = (data['elementCenter:0']**2.0 + data['elementCenter:1']**2.0)**0.5 + temperature = data['temperature'] + #pressure = data['pressure'] + diffusionTime = data['Time'][0] + + # Analytical results for linear thermal behavior, for comparison + radialCoordinate_anal = np.arange(Rin, Rout, (Rout-Rin)/100) - thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(defaultThermalConductivity, volumetricHeatCapacity) + thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(defaultThermalConductivity, volumetricHeatCapacity) - T_transient_linear = computeTransientTemperature(Tin, Tout, Rin, radialCoordinate_anal, thermalDiffusionCoefficient, diffusionTime) - - # Analytical results of the steady state regime for comparison - T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate_anal) + T_transient_linear = computeTransientTemperature(Tin, Tout, Rin, radialCoordinate_anal, thermalDiffusionCoefficient, diffusionTime) + + # Analytical results of the steady state regime for comparison + T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate_anal) - # Finite different results for non-linear thermal behavior - - T_transient_nonLinear = solve_radial_diffusion(radialCoordinate_anal, diffusionTime, diffusionTime/1000, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature) + # Finite different results for non-linear thermal behavior + + T_transient_nonLinear = solve_radial_diffusion(radialCoordinate_anal, diffusionTime, diffusionTime/1000, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature) - # Visualization - # Temperature - plt.subplot(2,2,chart_idx+1) - plt.plot( radialCoordinate, temperature, 'k+' , label='GEOS' ) - plt.plot( radialCoordinate_anal, T_transient_nonLinear, 'g.' , label='FDM Non-Linear' ) - plt.plot( radialCoordinate_anal, T_transient_linear, 'r-' , label='Analytic Linear' ) - plt.plot( radialCoordinate_anal, T_steadyState, 'b-' , label='Steady State' ) + # Visualization + # Temperature + plt.subplot(2,2,chart_idx+1) + plt.plot( radialCoordinate, temperature, 'k+' , label='GEOS' ) + plt.plot( radialCoordinate_anal, T_transient_nonLinear, 'g.' , label='FDM Non-Linear' ) + plt.plot( radialCoordinate_anal, T_transient_linear, 'r-' , label='Analytic Linear' ) + plt.plot( radialCoordinate_anal, T_steadyState, 'b-' , label='Steady State' ) - if chart_idx==1: - plt.legend() + if chart_idx==1: + plt.legend() - if chart_idx in [2,3]: - plt.xlabel('Radial distance from well center') + if chart_idx in [2,3]: + plt.xlabel('Radial distance from well center') - if chart_idx in [0,2]: - plt.ylabel('Temperature (°C)') + if chart_idx in [0,2]: + plt.ylabel('Temperature (°C)') - plt.ylim(Tin-10,Tout+10) - plt.xlim(0.1,0.3) - plt.title('t = '+str(diffusionTime)+'(s)') - plt.tight_layout() + plt.ylim(Tin-10,Tout+10) + plt.xlim(0.1,0.3) + plt.title('t = '+str(diffusionTime)+'(s)') + plt.tight_layout() - plt.show() + plt.show() if __name__ == "__main__": - main() + main() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/temperatureDependentVolumetricHeatCapacity_plot.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/temperatureDependentVolumetricHeatCapacity_plot.py index cb3f51e16fe..20d7eed6613 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/temperatureDependentVolumetricHeatCapacity_plot.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/nonLinearThermalDiffusion_TemperatureDependentVolumetricHeatCapacity/temperatureDependentVolumetricHeatCapacity_plot.py @@ -1,5 +1,7 @@ import os import sys +import os +import argparse import numpy as np import matplotlib.pyplot as plt @@ -14,18 +16,18 @@ # Analytical results for linear thermal behavior def steadyState(Tin, Tout, Rin, Rout, radialCoordinate): - return Tin + (Tout - Tin) * (np.log(radialCoordinate) - np.log(Rin)) / (np.log(Rout) - np.log(Rin)) + return Tin + (Tout - Tin) * (np.log(radialCoordinate) - np.log(Rin)) / (np.log(Rout) - np.log(Rin)) def diffusionFunction(radialCoordinate, Rin, diffusionCoefficient, diffusionTime): - return special.erfc( (radialCoordinate - Rin) / 2.0 / np.sqrt( diffusionCoefficient * diffusionTime ) ) + return special.erfc( (radialCoordinate - Rin) / 2.0 / np.sqrt( diffusionCoefficient * diffusionTime ) ) def computeTransientTemperature(Tin, Tout, Rin, radialCoordinate, thermalDiffusionCoefficient, diffusionTime): - # Ref. Wang and Papamichos (1994), https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94WR01774 - return Tout + (Tin-Tout) * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) - + # Ref. Wang and Papamichos (1994), https://agupubs.onlinelibrary.wiley.com/doi/abs/10.1029/94WR01774 + return Tout + (Tin-Tout) * np.sqrt(Rin/radialCoordinate) * diffusionFunction(radialCoordinate, Rin, thermalDiffusionCoefficient, diffusionTime) + def computeThermalDiffusionCoefficient(thermalConductivity, volumetricHeatCapacity): - return thermalConductivity / volumetricHeatCapacity - + return thermalConductivity / volumetricHeatCapacity + # Finite difference results for non-linear thermal behavior def temperatureDependentThermalConductivity(lambda0, lambda_gradient, T, Treference): return lambda0 + lambda_gradient*(T-Treference) @@ -38,7 +40,7 @@ def coefficientMatrix(thermalConductivity, volumetricHeatCapacity, r, dt, N): A = np.zeros((N+1, N+1)) for i in range(1,N): - dr = r[i] - r[i-1] + dr = r[i] - r[i-1] r_i = r[i] diffusivity_i = thermalConductivity[i]/volumetricHeatCapacity[i] @@ -74,130 +76,141 @@ def solve_radial_diffusion(r, tmax, dt, Tin, Tout, lambda0, lambda_gradient, c0, def extractDataFromXMLList(paramList): - # Extract data from a list in XML such as "{ 1, 2, 3}" - return paramList.replace('{', '').replace('}', '').strip().split(',') + # Extract data from a list in XML such as "{ 1, 2, 3}" + return paramList.replace('{', '').replace('}', '').strip().split(',') def getWellboreGeometryFromXML(xmlFilePath): - tree = ElementTree.parse(xmlFilePath) + tree = ElementTree.parse(xmlFilePath) - meshParam = tree.find('Mesh/InternalWellbore') - radii = extractDataFromXMLList( meshParam.get("radius") ) + meshParam = tree.find('Mesh/InternalWellbore') + radii = extractDataFromXMLList( meshParam.get("radius") ) - Rin = float(radii[0]) - Rout = float(radii[-1]) + Rin = float(radii[0]) + Rout = float(radii[-1]) - return [Rin, Rout] + return [Rin, Rout] def getLoadingFromXML(xmlFilePath): - tree = ElementTree.parse(xmlFilePath) - fsParams = tree.findall('FieldSpecifications/FieldSpecification') + tree = ElementTree.parse(xmlFilePath) + fsParams = tree.findall('FieldSpecifications/FieldSpecification') + + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "pressure") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Pin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Pout = float(fsParam.get('scale')) + + for fsParam in fsParams: + if ( (fsParam.get('fieldName') == "temperature") & (fsParam.get('initialCondition') != "1") ): + if fsParam.get('setNames') == "{ rneg }": + Tin = float(fsParam.get('scale')) + if fsParam.get('setNames') == "{ rpos }": + Tout = float(fsParam.get('scale')) + + + tree_SinglePhaseThermalConductivities = tree.findall('Constitutive/SinglePhaseThermalConductivity') + + for tree_SinglePhaseThermalConductivity in tree_SinglePhaseThermalConductivities: + if tree_SinglePhaseThermalConductivity.get('name') == "thermalCond_linear": + defaultThermalConductivity = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('defaultThermalConductivityComponents') )[0] ) + thermalConductivityGradient = 0.0 + + tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') + + for tree_SolidInternalEnergy in tree_SolidInternalEnergies: + if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_nonLinear": + referenceVolumetricHeatCapacity = float( tree_SolidInternalEnergy.get('referenceVolumetricHeatCapacity') ) + dVolumetricHeatCapacity_dTemperature = float( tree_SolidInternalEnergy.get('dVolumetricHeatCapacity_dTemperature') ) + referenceTemperature = float( tree_SolidInternalEnergy.get('referenceTemperature') ) + + + permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) + + porosity = float( tree.find('Constitutive/PressurePorosity').get('defaultReferencePorosity') ) + + fluidViscosity = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('defaultViscosity') ) - for fsParam in fsParams: - if ( (fsParam.get('fieldName') == "pressure") & (fsParam.get('initialCondition') != "1") ): - if fsParam.get('setNames') == "{ rneg }": - Pin = float(fsParam.get('scale')) - if fsParam.get('setNames') == "{ rpos }": - Pout = float(fsParam.get('scale')) + fluidCompressibility = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('compressibility') ) - for fsParam in fsParams: - if ( (fsParam.get('fieldName') == "temperature") & (fsParam.get('initialCondition') != "1") ): - if fsParam.get('setNames') == "{ rneg }": - Tin = float(fsParam.get('scale')) - if fsParam.get('setNames') == "{ rpos }": - Tout = float(fsParam.get('scale')) + fluidThermalExpansionCoefficient = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('thermalExpansionCoeff') ) + return [Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient] - tree_SinglePhaseThermalConductivities = tree.findall('Constitutive/SinglePhaseThermalConductivity') - for tree_SinglePhaseThermalConductivity in tree_SinglePhaseThermalConductivities: - if tree_SinglePhaseThermalConductivity.get('name') == "thermalCond_linear": - defaultThermalConductivity = float( extractDataFromXMLList( tree_SinglePhaseThermalConductivity.get('defaultThermalConductivityComponents') )[0] ) - thermalConductivityGradient = 0.0 +def main(): - tree_SolidInternalEnergies = tree.findall('Constitutive/SolidInternalEnergy') + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") - for tree_SolidInternalEnergy in tree_SolidInternalEnergies: - if tree_SolidInternalEnergy.get('name') == "rockInternalEnergy_nonLinear": - referenceVolumetricHeatCapacity = float( tree_SolidInternalEnergy.get('referenceVolumetricHeatCapacity') ) - dVolumetricHeatCapacity_dTemperature = float( tree_SolidInternalEnergy.get('dVolumetricHeatCapacity_dTemperature') ) - referenceTemperature = float( tree_SolidInternalEnergy.get('referenceTemperature') ) - - - permeability = float( extractDataFromXMLList( tree.find('Constitutive/ConstantPermeability').get('permeabilityComponents') )[0] ) + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') - porosity = float( tree.find('Constitutive/PressurePorosity').get('defaultReferencePorosity') ) - - fluidViscosity = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('defaultViscosity') ) + # Parse the command-line arguments + args = parser.parse_args() - fluidCompressibility = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('compressibility') ) + geosDir = args.geosDir - fluidThermalExpansionCoefficient = float( tree.find('Constitutive/ThermalCompressibleSinglePhaseFluid').get('thermalExpansionCoeff') ) + xmlFilePath = geosDir + "/inputFiles/singlePhaseFlow/" + + Rin, Rout = getWellboreGeometryFromXML(xmlFilePath+"thermalCompressible_temperatureDependentVolumetricHeatCapacity_benchmark.xml") - return [Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, referenceVolumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient] + Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient = getLoadingFromXML(xmlFilePath+"thermalCompressible_2d_base.xml") + plt.figure(figsize=(10,7)) + font = {'size' : 16} + plt.rc('font', **font) -def main(): + for chart_idx, idx in enumerate([1, 2, 5, 10]): + # Numerical results + data = pd.read_csv(f'data_{idx}.csv') + data.dropna(inplace=True) + data.drop_duplicates(inplace=True) + data.reset_index(drop=True, inplace=True) + + radialCoordinate = (data['elementCenter:0']**2.0 + data['elementCenter:1']**2.0)**0.5 + temperature = data['temperature'] + #pressure = data['pressure'] + diffusionTime = data['Time'][0] - xmlFilePath = "../../../../../../../inputFiles/singlePhaseFlow/" - - Rin, Rout = getWellboreGeometryFromXML(xmlFilePath+"thermalCompressible_temperatureDependentVolumetricHeatCapacity_benchmark.xml") - - Pin, Pout, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, referenceTemperature, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, permeability, porosity, fluidViscosity, fluidCompressibility, fluidThermalExpansionCoefficient = getLoadingFromXML(xmlFilePath+"thermalCompressible_2d_base.xml") - - plt.figure(figsize=(10,7)) - font = {'size' : 16} - plt.rc('font', **font) - - for chart_idx, idx in enumerate([1, 2, 5, 10]): - # Numerical results - data = pd.read_csv(f'data_{idx}.csv') - data.dropna(inplace=True) - data.drop_duplicates(inplace=True) - data.reset_index(drop=True, inplace=True) - - radialCoordinate = (data['elementCenter:0']**2.0 + data['elementCenter:1']**2.0)**0.5 - temperature = data['temperature'] - #pressure = data['pressure'] - diffusionTime = data['Time'][0] - - # Analytical results for linear thermal behavior, for comparison - radialCoordinate_anal = radialCoordinate# np.arange(Rin, Rout, (Rout-Rin)/100) + # Analytical results for linear thermal behavior, for comparison + radialCoordinate_anal = radialCoordinate# np.arange(Rin, Rout, (Rout-Rin)/100) - thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(defaultThermalConductivity, volumetricHeatCapacity) + thermalDiffusionCoefficient = computeThermalDiffusionCoefficient(defaultThermalConductivity, volumetricHeatCapacity) - T_transient_linear = computeTransientTemperature(Tin, Tout, Rin, radialCoordinate_anal, thermalDiffusionCoefficient, diffusionTime) - - # Analytical results of the steady state regime for comparison - T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate_anal) + T_transient_linear = computeTransientTemperature(Tin, Tout, Rin, radialCoordinate_anal, thermalDiffusionCoefficient, diffusionTime) + + # Analytical results of the steady state regime for comparison + T_steadyState = steadyState(Tin, Tout, Rin, Rout, radialCoordinate_anal) - # Finite different results for non-linear thermal behavior - - T_transient_nonLinear = solve_radial_diffusion(radialCoordinate_anal, diffusionTime, diffusionTime/100, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature) + # Finite different results for non-linear thermal behavior + + T_transient_nonLinear = solve_radial_diffusion(radialCoordinate_anal, diffusionTime, diffusionTime/100, Tin, Tout, defaultThermalConductivity, thermalConductivityGradient, volumetricHeatCapacity, dVolumetricHeatCapacity_dTemperature, referenceTemperature) - # Visualization - # Temperature - plt.subplot(2,2,chart_idx+1) - plt.plot( radialCoordinate, temperature, 'k+' , label='GEOS' ) - plt.plot( radialCoordinate_anal, T_transient_nonLinear, 'g-' , label='FDM Non-Linear' ) - plt.plot( radialCoordinate_anal, T_transient_linear, 'r-' , label='Analytic Linear' ) - plt.plot( radialCoordinate_anal, T_steadyState, 'b-' , label='Steady State' ) + # Visualization + # Temperature + plt.subplot(2,2,chart_idx+1) + plt.plot( radialCoordinate, temperature, 'k+' , label='GEOS' ) + plt.plot( radialCoordinate_anal, T_transient_nonLinear, 'g-' , label='FDM Non-Linear' ) + plt.plot( radialCoordinate_anal, T_transient_linear, 'r-' , label='Analytic Linear' ) + plt.plot( radialCoordinate_anal, T_steadyState, 'b-' , label='Steady State' ) - if chart_idx==1: - plt.legend() + if chart_idx==1: + plt.legend() - if chart_idx in [2,3]: - plt.xlabel('Radial distance from well center') + if chart_idx in [2,3]: + plt.xlabel('Radial distance from well center') - if chart_idx in [0,2]: - plt.ylabel('Temperature (°C)') + if chart_idx in [0,2]: + plt.ylabel('Temperature (°C)') - plt.ylim(-30,110) - plt.xlim(0.,0.5) - plt.title('t = '+str(diffusionTime)+'(s)') - plt.tight_layout() + plt.ylim(-30,110) + plt.xlim(0.,0.5) + plt.title('t = '+str(diffusionTime)+'(s)') + plt.tight_layout() - plt.show() + plt.show() if __name__ == "__main__": - main() + main() diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_stress.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_stress.py index fa2179aa8c6..6ee08ca6282 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_stress.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_stress.py @@ -5,6 +5,8 @@ import h5py from numpy import genfromtxt from xml.etree import ElementTree +import os +import argparse import analyticalResults @@ -13,140 +15,153 @@ def stressRotation(stress, phi_x): return np.dot(np.dot(np.transpose(rotx), stress), rotx) def main(): - # Material properties from input XML file - xmlFilePathPrefix = "../../../../../../../inputFiles/wellbore/ThermoPoroElasticWellbore" - - xmlData = analyticalResults.getDataFromXML(xmlFilePathPrefix) - - bulkModulus = xmlData[2] # drained bulk modulus of the porous medium - thermalExpansionCoefficients = xmlData[4] # drained linear thermal expansion coefficient of the porous medium - grainBulkModulus = xmlData[6] - BiotCoefficient = 1.0 - bulkModulus / grainBulkModulus - - # Get solid stress, time and element center from GEOSX results - stress_field_name = 'rockSolid_stress' - hf_stress = h5py.File('stressHistory_rock.hdf5', 'r') - time = np.array( hf_stress.get(stress_field_name + ' Time') ) - center = np.array( hf_stress.get(stress_field_name + ' elementCenter') ) - stress = np.array( hf_stress.get(stress_field_name) ) - - # Get temperature and pore pressure for computing the total stress - hf_temperature = h5py.File('temperatureHistory_rock.hdf5', 'r') - temperature = np.array( hf_temperature.get('temperature') ) - - hf_pressure = h5py.File('pressureHistory_rock.hdf5', 'r') - pressure = np.array( hf_pressure.get('pressure') ) - - # Compute total stress - stress_xx_total = stress[:,:,0] - BiotCoefficient * pressure - 3 * bulkModulus * thermalExpansionCoefficients * temperature - stress_yy_total = stress[:,:,1] - BiotCoefficient * pressure - 3 * bulkModulus * thermalExpansionCoefficients * temperature - stress_zz_total = stress[:,:,2] - BiotCoefficient * pressure - 3 * bulkModulus * thermalExpansionCoefficients * temperature - stress_yz_total = stress[:,:,3] - stress_xz_total = stress[:,:,4] - stress_xy_total = stress[:,:,5] - - # Coordinate of elemnt center - nElements = center.shape[1] - xCoord = center[0, :, 0] - yCoord = center[0, :, 1] - rCoord = np.sqrt( xCoord*xCoord + yCoord*yCoord ) - - # Compute stress components in cylindrical coordinate system - stress_rr_total = np.zeros(stress_xx_total.shape) - stress_tt_total = np.zeros(stress_xx_total.shape) - - for idx_time in range(stress.shape[0]): - for idx_elem in range(stress.shape[1]): - stressMatrix_cartesian = np.array([[stress_xx_total[idx_time][idx_elem],stress_xy_total[idx_time][idx_elem],stress_xz_total[idx_time][idx_elem]],\ - [stress_xy_total[idx_time][idx_elem],stress_yy_total[idx_time][idx_elem],stress_yz_total[idx_time][idx_elem]],\ - [stress_xz_total[idx_time][idx_elem],stress_yz_total[idx_time][idx_elem],stress_zz_total[idx_time][idx_elem]]]) - - if(yCoord[idx_elem] != 0): - phi_x = np.arctan( xCoord[idx_elem]/yCoord[idx_elem] ) - else: - phi_x = 0 - - stressMatrix_cylindirical = stressRotation(stressMatrix_cartesian, phi_x) - stress_rr_total[idx_time][idx_elem] = stressMatrix_cylindirical[1][1] - stress_tt_total[idx_time][idx_elem] = stressMatrix_cylindirical[0][0] - - # Plot GEOSX results - plt.figure(figsize=(10,5)) - - plt.subplot(1,2,1) - - plt.plot( rCoord, - stress_rr_total[10, :], - 'r+', - label='GEOS: t = 1 (min)') - - plt.plot( rCoord, - stress_rr_total[24, :], - 'b+', - label='GEOS: t = 1 (hour)') - - plt.subplot(1,2,2) - - plt.plot( rCoord, - stress_tt_total[10, :], - 'r+', - label='GEOS: t = 1 (min)') - - plt.plot( rCoord, - stress_tt_total[24, :], - 'b+', - label='GEOS: t = 1 (hour)') - - # Plot analytical results at one minute - t = 60 #s - r_anal, T_anal, p_anal, ur_anal, sig_rr_anal, sig_tt_anal, sig_zz_anal = analyticalResults.analyticalResults(t) - - plt.subplot(1,2,1) - plt.plot( r_anal, - sig_rr_anal, - 'r-', - label='Analytical: t = 1 (min)') - - plt.subplot(1,2,2) - plt.plot( r_anal, - sig_tt_anal, - 'r-', - label='Analytical: t = 1 (min)') - - # Plot analytical results at one hour - t = 3600 #s - r_anal, T_anal, p_anal, ur_anal, sig_rr_anal, sig_tt_anal, sig_zz_anal = analyticalResults.analyticalResults(t) - - plt.subplot(1,2,1) - plt.plot( r_anal, - sig_rr_anal, - 'b-', - label='Analytical: t = 1 (hour)') - - plt.subplot(1,2,2) - plt.plot( r_anal, - sig_tt_anal, - 'b-', - label='Analytical: t = 1 (hour)') - - plt.subplot(1,2,1) - plt.grid() - plt.ylabel('Radial stress [Pa]') - plt.xlabel('Radial coordinate [m]') - plt.xlim(0.1,0.3) - #plt.ylim(0,100) - - plt.subplot(1,2,2) - plt.grid() - plt.ylabel('Tangential stress [Pa]') - plt.xlabel('Radial coordinate [m]') - plt.xlim(0.1,0.3) - #plt.ylim(0,70e6) - plt.legend(loc='lower right') - plt.tight_layout() - plt.savefig('stress.png') - plt.isoff() + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + outputDir = args.outputDir + geosDir = args.geosDir + + # Material properties from input XML file + xmlFilePathPrefix = geosDir + "/inputFiles/wellbore/ThermoPoroElasticWellbore" + + xmlData = analyticalResults.getDataFromXML(xmlFilePathPrefix) + + bulkModulus = xmlData[2] # drained bulk modulus of the porous medium + thermalExpansionCoefficients = xmlData[4] # drained linear thermal expansion coefficient of the porous medium + grainBulkModulus = xmlData[6] + BiotCoefficient = 1.0 - bulkModulus / grainBulkModulus + + # Get solid stress, time and element center from GEOSX results + stress_field_name = 'rockSolid_stress' + hf_stress = h5py.File(outputDir + '/stressHistory_rock.hdf5', 'r') + time = np.array( hf_stress.get(stress_field_name + ' Time') ) + center = np.array( hf_stress.get(stress_field_name + ' elementCenter') ) + stress = np.array( hf_stress.get(stress_field_name) ) + + # Get temperature and pore pressure for computing the total stress + hf_temperature = h5py.File(outputDir + '/temperatureHistory_rock.hdf5', 'r') + temperature = np.array( hf_temperature.get('temperature') ) + + hf_pressure = h5py.File(outputDir + '/pressureHistory_rock.hdf5', 'r') + pressure = np.array( hf_pressure.get('pressure') ) + + # Compute total stress + stress_xx_total = stress[:,:,0] - BiotCoefficient * pressure - 3 * bulkModulus * thermalExpansionCoefficients * temperature + stress_yy_total = stress[:,:,1] - BiotCoefficient * pressure - 3 * bulkModulus * thermalExpansionCoefficients * temperature + stress_zz_total = stress[:,:,2] - BiotCoefficient * pressure - 3 * bulkModulus * thermalExpansionCoefficients * temperature + stress_yz_total = stress[:,:,3] + stress_xz_total = stress[:,:,4] + stress_xy_total = stress[:,:,5] + + # Coordinate of elemnt center + nElements = center.shape[1] + xCoord = center[0, :, 0] + yCoord = center[0, :, 1] + rCoord = np.sqrt( xCoord*xCoord + yCoord*yCoord ) + + # Compute stress components in cylindrical coordinate system + stress_rr_total = np.zeros(stress_xx_total.shape) + stress_tt_total = np.zeros(stress_xx_total.shape) + + for idx_time in range(stress.shape[0]): + for idx_elem in range(stress.shape[1]): + stressMatrix_cartesian = np.array([[stress_xx_total[idx_time][idx_elem],stress_xy_total[idx_time][idx_elem],stress_xz_total[idx_time][idx_elem]],\ + [stress_xy_total[idx_time][idx_elem],stress_yy_total[idx_time][idx_elem],stress_yz_total[idx_time][idx_elem]],\ + [stress_xz_total[idx_time][idx_elem],stress_yz_total[idx_time][idx_elem],stress_zz_total[idx_time][idx_elem]]]) + + if(yCoord[idx_elem] != 0): + phi_x = np.arctan( xCoord[idx_elem]/yCoord[idx_elem] ) + else: + phi_x = 0 + + stressMatrix_cylindirical = stressRotation(stressMatrix_cartesian, phi_x) + stress_rr_total[idx_time][idx_elem] = stressMatrix_cylindirical[1][1] + stress_tt_total[idx_time][idx_elem] = stressMatrix_cylindirical[0][0] + + # Plot GEOSX results + plt.figure(figsize=(10,5)) + + plt.subplot(1,2,1) + + plt.plot( rCoord, + stress_rr_total[10, :], + 'r+', + label='GEOS: t = 1 (min)') + + plt.plot( rCoord, + stress_rr_total[24, :], + 'b+', + label='GEOS: t = 1 (hour)') + + plt.subplot(1,2,2) + + plt.plot( rCoord, + stress_tt_total[10, :], + 'r+', + label='GEOS: t = 1 (min)') + + plt.plot( rCoord, + stress_tt_total[24, :], + 'b+', + label='GEOS: t = 1 (hour)') + + # Plot analytical results at one minute + t = 60 #s + r_anal, T_anal, p_anal, ur_anal, sig_rr_anal, sig_tt_anal, sig_zz_anal = analyticalResults.analyticalResults(t) + + plt.subplot(1,2,1) + plt.plot( r_anal, + sig_rr_anal, + 'r-', + label='Analytical: t = 1 (min)') + + plt.subplot(1,2,2) + plt.plot( r_anal, + sig_tt_anal, + 'r-', + label='Analytical: t = 1 (min)') + + # Plot analytical results at one hour + t = 3600 #s + r_anal, T_anal, p_anal, ur_anal, sig_rr_anal, sig_tt_anal, sig_zz_anal = analyticalResults.analyticalResults(t) + + plt.subplot(1,2,1) + plt.plot( r_anal, + sig_rr_anal, + 'b-', + label='Analytical: t = 1 (hour)') + + plt.subplot(1,2,2) + plt.plot( r_anal, + sig_tt_anal, + 'b-', + label='Analytical: t = 1 (hour)') + + plt.subplot(1,2,1) + plt.grid() + plt.ylabel('Radial stress [Pa]') + plt.xlabel('Radial coordinate [m]') + plt.xlim(0.1,0.3) + #plt.ylim(0,100) + + plt.subplot(1,2,2) + plt.grid() + plt.ylabel('Tangential stress [Pa]') + plt.xlabel('Radial coordinate [m]') + plt.xlim(0.1,0.3) + #plt.ylim(0,70e6) + plt.legend(loc='lower right') + plt.tight_layout() + plt.savefig('stress.png') + plt.isoff() if __name__ == "__main__": - main() - + main() + diff --git a/src/docs/sphinx/basicExamples/poromechanics/poromechanicsFigure.py b/src/docs/sphinx/basicExamples/poromechanics/poromechanicsFigure.py index a1936cfc4ed..43e76a3a72b 100644 --- a/src/docs/sphinx/basicExamples/poromechanics/poromechanicsFigure.py +++ b/src/docs/sphinx/basicExamples/poromechanics/poromechanicsFigure.py @@ -5,6 +5,8 @@ import xml.etree.ElementTree as ElementTree from mpmath import * import math +import os +import argparse class terzaghi: @@ -91,10 +93,23 @@ def getDomainMaxMinXCoordFromXML(xmlFilePath): def main(): + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + outputDir = args.outputDir + geosDir = args.geosDir + # File path - hdf5FilePath = "pressure_history.hdf5" - xmlBaseFilePath = "../../../../../inputFiles/poromechanics/PoroElastic_Terzaghi_base_direct.xml" - xmlSmokeFilePath = "../../../../../inputFiles/poromechanics/PoroElastic_Terzaghi_smoke.xml" + hdf5FilePath = outputDir + "/pressure_history.hdf5" + xmlBaseFilePath = geosDir + "/inputFiles/poromechanics/PoroElastic_Terzaghi_base_direct.xml" + xmlSmokeFilePath = geosDir + "/inputFiles/poromechanics/PoroElastic_Terzaghi_smoke.xml" # Read HDF5 hf = h5py.File(hdf5FilePath, 'r') diff --git a/src/docs/sphinx/basicExamples/triaxialDriver/triaxialDriverFigure.py b/src/docs/sphinx/basicExamples/triaxialDriver/triaxialDriverFigure.py index 8de7daa7ca9..b46ec1f300f 100755 --- a/src/docs/sphinx/basicExamples/triaxialDriver/triaxialDriverFigure.py +++ b/src/docs/sphinx/basicExamples/triaxialDriver/triaxialDriverFigure.py @@ -5,6 +5,8 @@ import math from math import sin, cos, tan, exp, atan import xml.etree.ElementTree as ElementTree +import os +import argparse def yieldSurface(xmlFilePath, mechanicalParameters): @@ -166,14 +168,27 @@ def getMechanicalParametersFromXML(xmlFilePath): def main(): + + # Initialize the argument parser + parser = argparse.ArgumentParser(description="Script to generate figure from tutorial.") + + # Add arguments to accept individual file paths + parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../..') + parser.add_argument('--outputDir', help='Path to output directory', default='.') + + # Parse the command-line arguments + args = parser.parse_args() + # File path - xmlFilePath = "../../../../../inputFiles/triaxialDriver/triaxialDriver_ExtendedDruckerPrager_basicExample.xml" + outputDir = args.outputDir + geosDir = args.geosDir + xmlFilePath = geosDir + "/inputFiles/triaxialDriver/triaxialDriver_ExtendedDruckerPrager_basicExample.xml" # Extract info from XML mechanicalParameters = getMechanicalParametersFromXML(xmlFilePath) # Load GEOSX results - path = "simulationResults.txt" + path = outputDir + "/simulationResults.txt" time, ax_strain, ra_strain1, ra_strain2, ax_stress, ra_stress1, ra_stress2, newton_iter, residual_norm = np.loadtxt( path, skiprows=5, unpack=True) p_num = -(ax_stress + 2.0 * ra_stress1) / 3.0 / 1.0e6 diff --git a/src/docs/sphinx/buildGuide/BuildProcess.rst b/src/docs/sphinx/buildGuide/BuildProcess.rst index 8860a9d1486..cd3910c451c 100644 --- a/src/docs/sphinx/buildGuide/BuildProcess.rst +++ b/src/docs/sphinx/buildGuide/BuildProcess.rst @@ -75,10 +75,10 @@ Option Default Explanation ``ENABLE_TOTALVIEW_OUTPUT`` ``OFF`` Enables TotalView debugger custom view of GEOS data structures ``ENABLE_COV`` ``OFF`` Enables code coverage ``GEOS_ENABLE_TESTS`` ``ON`` Enables unit testing targets -``GEOS_LA_INTERFACE`` ``Hypre`` Choiсe of Linear Algebra backend (Hypre/Petsc/Trilinos) -``GEOS_BUILD_OBJ_LIBS`` ``ON`` Use CMake Object Libraries build -``GEOS_BUILD_SHARED_LIBS`` ``OFF`` Build ``geosx_core`` as a shared library instead of static -``GEOS_PARALLEL_COMPILE_JOBS`` Max. number of compile jobs (when using Ninja), in addition to ``-j`` flag -``GEOS_PARALLEL_LINK_JOBS`` Max. number of link jobs (when using Ninja), in addition to ``-j`` flag -``GEOS_INSTALL_SCHEMA`` ``ON`` Enables schema generation and installation +``GEOS_LA_INTERFACE`` ``Hypre`` Choiсe of Linear Algebra backend (Hypre/Petsc/Trilinos) +``GEOS_BUILD_OBJ_LIBS`` ``ON`` Use CMake Object Libraries build +``GEOS_BUILD_SHARED_LIBS`` ``OFF`` Build ``geosx_core`` as a shared library instead of static +``GEOS_PARALLEL_COMPILE_JOBS`` Max. number of compile jobs (when using Ninja), in addition to ``-j`` flag +``GEOS_PARALLEL_LINK_JOBS`` Max. number of link jobs (when using Ninja), in addition to ``-j`` flag +``GEOS_INSTALL_SCHEMA`` ``ON`` Enables schema generation and installation =============================== ========= ============================================================================== diff --git a/src/docs/sphinx/developerGuide/Contributing/WorkInteractivelyOnCI.rst b/src/docs/sphinx/developerGuide/Contributing/WorkInteractivelyOnCI.rst index 5a15121d48c..64f2e92a07e 100644 --- a/src/docs/sphinx/developerGuide/Contributing/WorkInteractivelyOnCI.rst +++ b/src/docs/sphinx/developerGuide/Contributing/WorkInteractivelyOnCI.rst @@ -16,6 +16,7 @@ First, as much as you can, try to reduce the number of jobs you're triggering by Then in your branch, add the following GHA step to the `.github/build_and_test.yml` (see full documentation of the action `here _`). .. code-block:: console + - name: ssh uses: lhotari/action-upterm@v1 with: @@ -28,9 +29,11 @@ The action should be added after whichever step triggers an error. In case of a It is also important to prevent the job to exit upon failure. For instance, it is suggested to comment the following lines in the `build, test and deploy` step. .. code-block:: console + set -e .. code-block:: console + exit ${EXIT_STATUS} @@ -40,28 +43,29 @@ Step 2: Inspect the CI and grab server address ============================================== .. code-block:: console - Run lhotari/action-upterm@v1 - upterm - - Auto-generating ~/.ssh/known_hosts by attempting connection to uptermd.upterm.dev - Pseudo-terminal will not be allocated because stdin is not a terminal. - - Warning: Permanently added 'uptermd.upterm.dev' (ED25519) to the list of known hosts. - - runner@uptermd.upterm.dev: Permission denied (publickey). - Adding actor "GitHubLogin" to allowed users. - Fetching SSH keys registered with GitHub profiles: GitHubLogin - Fetched 2 ssh public keys - Creating a new session. Connecting to upterm server ssh://uptermd.upterm.dev:22 - Created new session successfully - Entering main loop - === Q16OBOFBLODJVA3TRXPL - Command: tmux new -s upterm -x 132 -y 43 - Force Command: tmux attach -t upterm - - Host: ssh://uptermd.upterm.dev:22 - SSH Session: ssh Q16oBofblOdjVa3TrXPl:ZTc4NGUxMWRiMjI5MDgudm0udXB0ZXJtLmludGVybmFsOjIyMjI=@uptermd.upterm.dev + Run lhotari/action-upterm@v1 + upterm + + Auto-generating ~/.ssh/known_hosts by attempting connection to uptermd.upterm.dev + Pseudo-terminal will not be allocated because stdin is not a terminal. + + Warning: Permanently added 'uptermd.upterm.dev' (ED25519) to the list of known hosts. + + runner@uptermd.upterm.dev: Permission denied (publickey). + + Adding actor "GitHubLogin" to allowed users. + Fetching SSH keys registered with GitHub profiles: GitHubLogin + Fetched 2 ssh public keys + Creating a new session. Connecting to upterm server ssh://uptermd.upterm.dev:22 + Created new session successfully + Entering main loop + === Q16OBOFBLODJVA3TRXPL + Command: tmux new -s upterm -x 132 -y 43 + Force Command: tmux attach -t upterm + + Host: ssh://uptermd.upterm.dev:22 + SSH Session: ssh Q16oBofblOdjVa3TrXPl:ZTc4NGUxMWRiMjI5MDgudm0udXB0ZXJtLmludGVybmFsOjIyMjI=@uptermd.upterm.dev Step 3: Connect to the machine via ssh @@ -71,7 +75,8 @@ You can now open a terminal in your own machine and sshe to the upterm server, e .. code-block:: console - ssh Q16oBofblOdjVa3TrXPl:ZTc4NGUxMWRiMjI5MDgudm0udXB0ZXJtLmludGVybmFsOjIyMjI=@uptermd.upterm.dev + + ssh Q16oBofblOdjVa3TrXPl:ZTc4NGUxMWRiMjI5MDgudm0udXB0ZXJtLmludGVybmFsOjIyMjI=@uptermd.upterm.dev Step 4: Run the docker container interactively @@ -79,18 +84,21 @@ Step 4: Run the docker container interactively Once you are connected to the machine it is convenient to follow these steps to interactively run the docker container: .. code-block:: console - docker ps -a + + docker ps -a The id of the existing docker container will be displayed and you can use it to commit the container. .. code-block:: console - docker commit debug_image + + docker commit debug_image and then run it interactively, e.g. .. code-block:: console - docker run -it --volume=/home/runner/work/GEOS/GEOS:/tmp/geos -e ENABLE_HYPRE=ON -e ENABLE_HYPRE_DEVICE=CUDA -e ENABLE_TRILINOS=OFF --cap-add=SYS_PTRACE --entrypoint /bin/bash debug_image + + docker run -it --volume=/home/runner/work/GEOS/GEOS:/tmp/geos -e ENABLE_HYPRE=ON -e ENABLE_HYPRE_DEVICE=CUDA -e ENABLE_TRILINOS=OFF --cap-add=SYS_PTRACE --entrypoint /bin/bash debug_image Step 5: Cancel the workflow ============================================== diff --git a/src/docs/sphinx/tutorials/step01/Tutorial.rst b/src/docs/sphinx/tutorials/step01/Tutorial.rst index 0e896f33fa3..cd3c85fcd7a 100644 --- a/src/docs/sphinx/tutorials/step01/Tutorial.rst +++ b/src/docs/sphinx/tutorials/step01/Tutorial.rst @@ -91,6 +91,9 @@ in different regions of the domain at different moments of the simulation. In this first example, we use one type of solver in the entire domain and for the entire duration of the simulation. +The input file for this tutorial can be found in the repository at +`inputFiles/singlePhaseFlow/3D_10x10x10_compressible_smoke.xml `_, which also includes +`inputFiles/singlePhaseFlow/3D_10x10x10_compressible_base.xml `_. The solver we are specifying here is a single-phase flow solver. In GEOS, such a solver is created using a ``SinglePhaseFVM`` element. This type of solver is one among several cell-centered single-phase finite volume methods. @@ -134,7 +137,7 @@ In production runs, you may want to suppress most console output. For solvers of the ``SinglePhaseFVM`` family, one required attribute is a discretization scheme. Here, we use a Two-Point Flux Approximation (TPFA) finite volume discretization scheme called ``singlePhaseTPFA``. -To know the list of admissible values of an attribute, please see GEOS's XML schema. +To know the list of admissible values of an attribute, please see `GEOS's XML schema `_. This discretization type must know how to find permeability values that it uses internally to compute transmissibilities. The ``permeabilityNames`` attribute tells the solver the user-defined name (the *handle*) of the permeability values that will be defined elsewhere in the input file. @@ -291,14 +294,11 @@ Now to use this scheme, we need to supply more details in the ``NumericalMethods :start-after: :end-before: -The ``fieldName`` attribute specifies which property will be used for flux computations, -and also specifies that for Dirichlet boundary conditions, the pressure value at the element face is used. -The ``coefficientName`` attribute is used for the stencil transmissibility computations. - Note that in GEOS, there is a difference between physics solvers and numerical methods. Their parameterizations are thus independent. We can have multiple solvers using the same numerical scheme but with different tolerances, for instance. +The available numerical methods and their options are listed in the GEOS XML schema documentation which may be found by using the search function in the documentation. .. _ElementRegions_tag_single_phase_internal_mesh: diff --git a/src/docs/sphinx/tutorials/step03/Tutorial.rst b/src/docs/sphinx/tutorials/step03/Tutorial.rst index e38b55222bd..6d760c3d033 100644 --- a/src/docs/sphinx/tutorials/step03/Tutorial.rst +++ b/src/docs/sphinx/tutorials/step03/Tutorial.rst @@ -214,7 +214,8 @@ The constitutive parameters such as the density, the viscosity, and the compress To consider an incompressible fluid, the user has to set the compressibility to 0. .. note:: - GEOS handles permeability as a diagonal matrix, so the three values of the permeability tensor are set individually using the ``component`` field. + Currently GEOS handles permeability as a diagonal matrix, so the three values of the permeability tensor are set individually using the ``component`` field. + The ability for a full tensor permeability is planned for future releases. .. _FieldSpecifications_tag_field_case: diff --git a/src/main/main.cpp b/src/main/main.cpp index 66233a7b02a..3904111aa1c 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -71,12 +71,14 @@ int main( int argc, char *argv[] ) // A NotAnError is thrown if "-h" or "--help" option is used. catch( NotAnError const & ) { + basicCleanup(); return 0; } catch( std::exception const & e ) { GEOS_LOG( e.what() ); LvArray::system::callErrorHandler(); + basicCleanup(); std::abort(); } return 0; diff --git a/src/pygeosx/pygeosx.hpp b/src/pygeosx/pygeosx.hpp index f90f6502f85..0e54130019a 100644 --- a/src/pygeosx/pygeosx.hpp +++ b/src/pygeosx/pygeosx.hpp @@ -14,8 +14,8 @@ */ // Source includes -#ifndef GEOS_PYGEOS_PYGEOS_HPP_ -#define GEOS_PYGEOS_PYGEOS_HPP_ +#ifndef GEOS_PYGEOSX_PYGEOSX_HPP_ +#define GEOS_PYGEOSX_PYGEOSX_HPP_ #include "LvArray/src/python/pythonForwardDeclarations.hpp" #include "mainInterface/GeosxState.hpp" From cbe0d680bad9df3ef23e452dcd238c81d564570c Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Mon, 9 Sep 2024 08:53:55 -1000 Subject: [PATCH 186/286] update schema docs from previous PR's that forgot to generate the updates (#3341) --- .../schema/docs/CellElementRegion_other.rst | 2 + .../docs/CompositionalMultiphaseWell.rst | 2 +- .../schema/docs/ElementRegions_other.rst | 2 + .../schema/docs/ParticleRegion_other.rst | 2 + .../schema/docs/ParticleRegions_other.rst | 2 + .../docs/SurfaceElementRegion_other.rst | 2 + ...WellElementRegionUniqueSubRegion_other.rst | 2 + .../schema/docs/WellElementRegion_other.rst | 2 + .../schema/docs/edgeManager_other.rst | 2 + .../embeddedSurfacesEdgeManager_other.rst | 2 + .../embeddedSurfacesNodeManager_other.rst | 2 + .../schema/docs/faceManager_other.rst | 2 + .../schema/docs/nodeManager_other.rst | 2 + .../docs/wellElementSubRegion_other.rst | 2 + src/coreComponents/schema/schema.xsd | 2 +- src/coreComponents/schema/schema.xsd.other | 52 +++++++++++++++++++ 16 files changed, 80 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/schema/docs/CellElementRegion_other.rst b/src/coreComponents/schema/docs/CellElementRegion_other.rst index bb012ac8ff4..747768b410c 100644 --- a/src/coreComponents/schema/docs/CellElementRegion_other.rst +++ b/src/coreComponents/schema/docs/CellElementRegion_other.rst @@ -7,7 +7,9 @@ domainBoundaryIndicator integer_array ghostRank integer_array (no description available) globalToLocalMap geos_mapBase > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` neighborData node :ref:`DATASTRUCTURE_neighborData` sets node :ref:`DATASTRUCTURE_sets` diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst index 197e006821f..d484d65a68b 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst @@ -9,7 +9,7 @@ initialDt real64 1e+99 Initial time-step logLevel integer 0 Log level maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration maxCompFractionChange real64 1 Maximum (absolute) change in a component fraction between two Newton iterations -maxRelativeCompDensChange real64 1.79769e+308 Maximum (relative) change in a component density between two Newton iterations +maxRelativeCompDensChange real64 1.79769e+208 Maximum (relative) change in a component density between two Newton iterations maxRelativePressureChange real64 1 Maximum (relative) change in pressure between two Newton iterations (recommended with rate control) name groupName required A name is required for any non-unique nodes targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. diff --git a/src/coreComponents/schema/docs/ElementRegions_other.rst b/src/coreComponents/schema/docs/ElementRegions_other.rst index f62357429ae..73341aae872 100644 --- a/src/coreComponents/schema/docs/ElementRegions_other.rst +++ b/src/coreComponents/schema/docs/ElementRegions_other.rst @@ -7,7 +7,9 @@ domainBoundaryIndicator integer_array ghostRank integer_array (no description available) globalToLocalMap geos_mapBase > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) CellElementRegion node :ref:`DATASTRUCTURE_CellElementRegion` SurfaceElementRegion node :ref:`DATASTRUCTURE_SurfaceElementRegion` WellElementRegion node :ref:`DATASTRUCTURE_WellElementRegion` diff --git a/src/coreComponents/schema/docs/ParticleRegion_other.rst b/src/coreComponents/schema/docs/ParticleRegion_other.rst index f57cca08d6b..6d535e7b280 100644 --- a/src/coreComponents/schema/docs/ParticleRegion_other.rst +++ b/src/coreComponents/schema/docs/ParticleRegion_other.rst @@ -7,7 +7,9 @@ domainBoundaryIndicator integer_array ghostRank integer_array (no description available) globalToLocalMap geos_mapBase > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) neighborData node :ref:`DATASTRUCTURE_neighborData` particleSubRegions node :ref:`DATASTRUCTURE_particleSubRegions` sets node :ref:`DATASTRUCTURE_sets` diff --git a/src/coreComponents/schema/docs/ParticleRegions_other.rst b/src/coreComponents/schema/docs/ParticleRegions_other.rst index 94022d14540..800947cc16c 100644 --- a/src/coreComponents/schema/docs/ParticleRegions_other.rst +++ b/src/coreComponents/schema/docs/ParticleRegions_other.rst @@ -7,7 +7,9 @@ domainBoundaryIndicator integer_array ghostRank integer_array (no description available) globalToLocalMap geos_mapBase > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) ParticleRegion node :ref:`DATASTRUCTURE_ParticleRegion` neighborData node :ref:`DATASTRUCTURE_neighborData` particleRegionsGroup node :ref:`DATASTRUCTURE_particleRegionsGroup` diff --git a/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst b/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst index bb012ac8ff4..747768b410c 100644 --- a/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst +++ b/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst @@ -7,7 +7,9 @@ domainBoundaryIndicator integer_array ghostRank integer_array (no description available) globalToLocalMap geos_mapBase > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` neighborData node :ref:`DATASTRUCTURE_neighborData` sets node :ref:`DATASTRUCTURE_sets` diff --git a/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst b/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst index eca5644ac14..cc185a514b1 100644 --- a/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst +++ b/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst @@ -9,7 +9,9 @@ elementVolume real64_array ghostRank integer_array (no description available) globalToLocalMap geos_mapBase > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) nextWellElementIndex integer_array (no description available) nextWellElementIndexGlobal integer_array (no description available) nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) diff --git a/src/coreComponents/schema/docs/WellElementRegion_other.rst b/src/coreComponents/schema/docs/WellElementRegion_other.rst index bb655ec67d1..a32b9e5a226 100644 --- a/src/coreComponents/schema/docs/WellElementRegion_other.rst +++ b/src/coreComponents/schema/docs/WellElementRegion_other.rst @@ -7,7 +7,9 @@ domainBoundaryIndicator integer_array ghostRank integer_array (no description available) globalToLocalMap geos_mapBase > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) wellControlsName groupNameRef (no description available) wellGeneratorName groupNameRef (no description available) elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` diff --git a/src/coreComponents/schema/docs/edgeManager_other.rst b/src/coreComponents/schema/docs/edgeManager_other.rst index 0d02ec6d8c8..243e8c0b337 100644 --- a/src/coreComponents/schema/docs/edgeManager_other.rst +++ b/src/coreComponents/schema/docs/edgeManager_other.rst @@ -8,7 +8,9 @@ faceList geos_InterObjectRelation > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) neighborData node :ref:`DATASTRUCTURE_neighborData` sets node :ref:`DATASTRUCTURE_sets` diff --git a/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst b/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst index 0d02ec6d8c8..243e8c0b337 100644 --- a/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst +++ b/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst @@ -8,7 +8,9 @@ faceList geos_InterObjectRelation > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) neighborData node :ref:`DATASTRUCTURE_neighborData` sets node :ref:`DATASTRUCTURE_sets` diff --git a/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst b/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst index 3a3c4f725f8..9aff15dcd84 100644 --- a/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst +++ b/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst @@ -11,7 +11,9 @@ elemSubRegionList LvArray_ArrayOfArrays ghostRank integer_array (no description available) globalToLocalMap geos_mapBase > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) parentEdgeGlobalIndex globalIndex_array (no description available) referencePosition real64_array2d (no description available) parentEdgeIndex integer_array :ref:`DATASTRUCTURE_EmbeddedSurfaceGenerator` Index of parent edge within the mesh object it is registered on. diff --git a/src/coreComponents/schema/docs/faceManager_other.rst b/src/coreComponents/schema/docs/faceManager_other.rst index 7f1730f0304..7aac5efbd3e 100644 --- a/src/coreComponents/schema/docs/faceManager_other.rst +++ b/src/coreComponents/schema/docs/faceManager_other.rst @@ -14,7 +14,9 @@ faceNormal real64_array2d ghostRank integer_array (no description available) globalToLocalMap geos_mapBase > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) nodeList geos_InterObjectRelation > (no description available) facePressure_n real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM`, :ref:`DATASTRUCTURE_SinglePhaseHybridFVM` Face pressure at the previous converged time step mimGravityCoefficient real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM` Mimetic gravity coefficient diff --git a/src/coreComponents/schema/docs/nodeManager_other.rst b/src/coreComponents/schema/docs/nodeManager_other.rst index cde3077884e..d1aad06734e 100644 --- a/src/coreComponents/schema/docs/nodeManager_other.rst +++ b/src/coreComponents/schema/docs/nodeManager_other.rst @@ -13,7 +13,9 @@ faceList geos_InterObjectRelation > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. +maxGlobalIndex globalIndex (no description available) primaryField real64_array Primary field variable neighborData node :ref:`DATASTRUCTURE_neighborData` sets node :ref:`DATASTRUCTURE_sets` diff --git a/src/coreComponents/schema/docs/wellElementSubRegion_other.rst b/src/coreComponents/schema/docs/wellElementSubRegion_other.rst index 6ceeee5546c..3af96c4f2b1 100644 --- a/src/coreComponents/schema/docs/wellElementSubRegion_other.rst +++ b/src/coreComponents/schema/docs/wellElementSubRegion_other.rst @@ -7,8 +7,10 @@ domainBoundaryIndicator integer_array ghostRank integer_array (no description available) globalToLocalMap geos_mapBase > (no description available) isExternal integer_array (no description available) +localMaxGlobalIndex globalIndex (no description available) localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. location real64_array2d For each perforation, physical location (x,y,z coordinates) +maxGlobalIndex globalIndex (no description available) numPerforationsGlobal globalIndex (no description available) reservoirElementIndex integer_array For each perforation, element index of the perforated element reservoirElementRegion integer_array For each perforation, elementRegion index of the perforated element diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 30fcdf27768..8537e8af271 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -2657,7 +2657,7 @@ Local- Add jump stabilization on interior of macro elements--> - + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index a4c03ba8fff..215191d89f5 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -2961,8 +2961,12 @@ + + + + @@ -2985,8 +2989,12 @@ + + + + @@ -3004,8 +3012,12 @@ + + + + @@ -3024,8 +3036,12 @@ + + + + @@ -3050,8 +3066,12 @@ + + + + @@ -3088,8 +3108,12 @@ + + + + @@ -3120,8 +3144,12 @@ + + + + @@ -3139,8 +3167,12 @@ + + + + @@ -3161,8 +3193,12 @@ + + + + @@ -3178,8 +3214,12 @@ + + + + @@ -3204,8 +3244,12 @@ + + + + @@ -3241,10 +3285,14 @@ + + + + @@ -3274,8 +3322,12 @@ + + + + From fec63dbd50804358efebfbb6291e2735ba116e82 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Mon, 9 Sep 2024 14:58:15 -0500 Subject: [PATCH 187/286] chore: Update quick-start-template.cmake (#3326) * Update quick-start-template.cmake --- host-configs/quick-start-template.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/host-configs/quick-start-template.cmake b/host-configs/quick-start-template.cmake index 7170d002b23..239f52e202f 100644 --- a/host-configs/quick-start-template.cmake +++ b/host-configs/quick-start-template.cmake @@ -12,8 +12,8 @@ set(MPI_CXX_COMPILER "path-to-mpi/bin/mpicxx" CACHE PATH "") # This is typically set(MPIEXEC "path-to-mpi/bin/mpirun" CACHE PATH "") # This is typically something like /usr/bin/mpirun # Set paths to blas and lapack -set( BLAS_LIBRARIES "path-to-blas" CACHE PATH "" FORCE ) # This is typically something like /usr/lib64/libblas.so -set( LAPACK_LIBRARIES CACHE PATH "path-to-lapack" FORCE ) # This is typically something like /usr/lib64/liblapack.so +set( BLAS_LIBRARIES "path-to-blas" CACHE PATH "" FORCE ) # This is typically something like /usr/lib64/libblas.so +set( LAPACK_LIBRARIES "path-to-lapack" CACHE PATH "" FORCE ) # This is typically something like /usr/lib64/liblapack.so # Cuda and openMP set( ENABLE_CUDA OFF CACHE PATH "" FORCE ) @@ -29,4 +29,4 @@ if(NOT ( EXISTS "${GEOS_TPL_DIR}" AND IS_DIRECTORY "${GEOS_TPL_DIR}" ) ) set(GEOS_TPL_DIR "${CMAKE_SOURCE_DIR}/../../thirdPartyLibs/install-${CONFIG_NAME}-release" CACHE PATH "" FORCE ) endif() -include(${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake) +include(${CMAKE_CURRENT_LIST_DIR}/tpls.cmake) From 98e9ae0874ae2a3e111ca79b97de3f5eca3aa1a8 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Tue, 10 Sep 2024 11:58:19 -0700 Subject: [PATCH 188/286] chore: increase minimum required cmake version. (#3331) * build: increase minimum required cmake version. --------- Co-authored-by: Randolph Settgast --- src/CMakeLists.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f8c8dd57401..9aee09fa577 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,10 +1,8 @@ -cmake_minimum_required( VERSION 3.23 ) +cmake_minimum_required( VERSION 3.24 ) # At the moment we are manually passing the cuda arch flag. -if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.23.0") - cmake_policy(SET CMP0104 OLD) # when using nvcc populate CMAKE_CUDA_ARCHITECTURES, raise error if we can't -endif() +cmake_policy(SET CMP0104 OLD) # when using nvcc populate CMAKE_CUDA_ARCHITECTURES, raise error if we can't cmake_policy(SET CMP0074 NEW) # dont ignore _ROOT env vars when searching for packages via find_package() cmake_policy(SET CMP0066 NEW) # use CMAKE__FLAGS_ for try_compile() instead of only CMAKE__FLAGS cmake_policy(SET CMP0056 NEW) # use CMAKE_EXE_LINKER_FLAGS in try_compile() in addition to CMAKE__FLAGS From abbd19aa2ff11c9b13196c0ac5b17ef2d843f3b9 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 11 Sep 2024 09:20:22 -1000 Subject: [PATCH 189/286] ci: Disable trigger of ci jobs when description is edited (#3346) --- .github/workflows/ci_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 54b0c791efa..128a79febcd 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -5,7 +5,7 @@ on: branches: - develop pull_request: - types: [opened, synchronize, reopened, edited] + types: [opened, synchronize, reopened] workflow_dispatch: # Cancels in-progress workflows for a PR when updated From e8fb2b2f280217a3782c88e539e65f0539ee525f Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 11 Sep 2024 20:44:21 -0500 Subject: [PATCH 190/286] fix: Check for zero permeability in J-function cap pressure (#3320) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update JFunctionCapillaryPressure.cpp --------- Co-authored-by: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Co-authored-by: Pavel Tomin <“paveltomin@users.noreply.github.com”> Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .../capillaryPressure/JFunctionCapillaryPressure.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp index 305abff3455..1dda8c49484 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp @@ -250,6 +250,7 @@ void JFunctionCapillaryPressure::saveConvergedRockState( arrayView2d< real64 con { permeability = convergedPermeability[ei][0][2]; } + GEOS_ERROR_IF( permeability < LvArray::NumericLimits< real64 >::epsilon, "Zero permeability in J-function capillary pressure" ); // here we compute an average of the porosity over quadrature points // this average is exact for tets, regular pyramids/wedges/hexes, or for VEM From 41e95e34dfef61b4cf1629e5c9ac425fccad0643 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 11 Sep 2024 15:51:22 -1000 Subject: [PATCH 191/286] fix: Fix the sphinx errors present in the readthedocs log (#3343) * turn on fail_on_warning in readthedocs.yml * exclude blt and from sphinx log * fix some sphinx errors from readthedocs log * try using np.asarray to avoid the DepricationWarnings in several python scripts --- .readthedocs.yml | 2 ++ .../scripts/sneddonCurveChecks.py | 2 +- .../scripts/hydrofractureQueries.py | 10 +++++----- inputFiles/solidMechanics/beamBending_base.xml | 1 - .../wellbore/CasedThermoElasticWellbore_base.xml | 2 +- .../wellbore/ThermoPoroElasticWellbore_base.xml | 2 ++ scripts/SchemaToRSTDocumentation.py | 12 ++++++------ scripts/postProcessing/SneddonValidation.py | 2 +- scripts/postProcessing/plotsolution_thermalFlow.py | 14 +++++++------- src/conf.py | 8 +++++--- .../constitutiveDrivers/docs/TriaxialDriver.rst | 2 +- .../mesh/docs/meshDeveloperGuide.rst | 2 +- .../docs/SolidMechanicsConformingFractures.rst | 4 ++-- .../docs/SolidMechanicsEmbeddedFractures.rst | 8 ++++---- .../fluidFlow/CompositionalMultiphaseBase.cpp | 2 +- .../gravityInducedStressInitialization/Example.rst | 4 ++-- .../gravityInitializationFigure.py | 4 ++-- .../schema/docs/CompositionalMultiphaseFVM.rst | 2 +- .../docs/CompositionalMultiphaseHybridFVM.rst | 2 +- src/coreComponents/schema/schema.xsd | 4 ++-- src/docs/sphinx/CompleteXMLSchema.rst | 13 ++++++------- src/docs/sphinx/QuickStart.rst | 4 ++-- .../performanceBenchmarks/Index.rst | 1 + .../carbonStorage/buckleyLeverett/Example.rst | 6 +++--- .../buckleyLeverett/buckleyLeverettFigure.py | 6 +++--- .../isothermalLeakyWellFigure.py | 5 +++-- .../thermalLeakyWell/thermalLeakyWell.py | 8 ++++---- .../intersectFrac/intersectFracFigure.py | 6 +++--- .../singleFracCompressionFigure.py | 6 +++--- .../faultMechanics/sneddon/sneddonFigure.py | 6 +++--- .../kgdValidation/kgdValidationQueries.py | 10 +++++----- .../validationStudies/poromechanics/Index.rst | 2 +- .../poromechanics/mandel/Example.rst | 8 ++++---- .../thermalConsolidation/Example.rst | 2 +- .../thermalConsolidationDisplacementFigure.py | 6 +++--- .../thermalConsolidationPressureFigure.py | 6 +++--- .../thermalConsolidationTemperatureFigure.py | 6 +++--- .../RelaxationTest/relaxationTestFigure.py | 4 ++-- .../casedContactElasticWellbore/Example.rst | 4 ++-- .../elastic_casedWellbore_displacementJump.py | 4 ++-- .../casedContactThermoElasticWellbore/Example.rst | 6 ------ ...rmoElastic_casedContactWellbore_displacement.py | 6 +++--- .../thermoElastic_casedContactWellbore_stress.py | 8 ++++---- ...ermoElastic_casedContactWellbore_temperature.py | 8 ++++---- .../casedThermoElasticWellbore/Example.rst | 6 ------ .../thermoElastic_casedWellbore_displacement.py | 6 +++--- .../thermoElastic_casedWellbore_stress.py | 8 ++++---- .../thermoElastic_casedWellbore_temperature.py | 6 +++--- .../deviatedPoroElasticWellboreExample1Figure.py | 2 +- .../deviatedPoroElasticWellboreExample2Figure.py | 2 +- .../wellboreProblems/dpWellbore/Example.rst | 4 +--- .../wellboreProblems/dpWellbore/dpWellbore_plot.py | 10 +++++----- .../wellboreProblems/edpWellbore/Example.rst | 2 -- .../edpWellbore/edpWellbore_plot.py | 10 +++++----- .../kirschWellbore/kirschWellboreFigure.py | 8 ++++---- .../thermoPoroElasticWellbore/Example.rst | 10 ++-------- .../THM_wellbore_displacement.py | 6 +++--- .../THM_wellbore_stress.py | 10 +++++----- .../THM_wellbore_temperature_pressure.py | 8 ++++---- .../multiphaseFlowWithWellsFigure.py | 4 ++-- src/docs/sphinx/buildGuide/AppleMacOS.rst | 4 ++-- .../Contributing/IntegratedTests.rst | 6 ++++-- .../Contributing/index_contributing.rst | 3 ++- src/docs/sphinx/tutorials/step02/Tutorial.rst | 2 +- src/docs/sphinx/tutorials/step04/Tutorial.rst | 2 +- src/pygeosx/pygeosx_documentation.rst | 2 +- 66 files changed, 169 insertions(+), 182 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index 16bd2dc1fc5..215487bd2b5 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -30,6 +30,8 @@ python: sphinx: configuration: src/conf.py builder: html + fail_on_warning: true + # Optionally build your docs in additional formats such as PDF and ePub formats: all diff --git a/inputFiles/efemFractureMechanics/scripts/sneddonCurveChecks.py b/inputFiles/efemFractureMechanics/scripts/sneddonCurveChecks.py index 627417d4db0..bc4488f8774 100644 --- a/inputFiles/efemFractureMechanics/scripts/sneddonCurveChecks.py +++ b/inputFiles/efemFractureMechanics/scripts/sneddonCurveChecks.py @@ -99,7 +99,7 @@ def debug(): # Read HDF5 data = hdf5_wrapper.hdf5_wrapper(hdf5File1Path).get_copy() jump = data['displacementJump'] - jump = np.array(jump) + jump = np.asarray(jump) aperture_EmbeddeFrac = jump[0, :, 0] x = data['displacementJump elementCenter'] loc_EmbeddeFrac = x[0, :, 0] diff --git a/inputFiles/hydraulicFracturing/scripts/hydrofractureQueries.py b/inputFiles/hydraulicFracturing/scripts/hydrofractureQueries.py index 68c84f3545d..24a466ebcbf 100644 --- a/inputFiles/hydraulicFracturing/scripts/hydrofractureQueries.py +++ b/inputFiles/hydraulicFracturing/scripts/hydrofractureQueries.py @@ -62,21 +62,21 @@ def main(): # Global Coordinate of Element Center hf = hdf5_wrapper.hdf5_wrapper(hdf5File) xl = hf['pressure elementCenter'] - xl = np.array(xl) + xl = np.asarray(xl) xcord = xl[-1, :, 0] ycord = xl[-1, :, 1] zcord = xl[-1, :, 2] tl = hf['pressure Time'] - tl = np.array(tl) + tl = np.asarray(tl) # Load pressure fpre = hf['pressure'] - fpre = np.array(fpre) + fpre = np.asarray(fpre) # Load elementAperture aper = hf['elementAperture'] - aper = np.array(aper) + aper = np.asarray(aper) # Load elementArea area = hf['elementArea'] - area = np.array(area) + area = np.asarray(area) # Find injection location ind = np.argmin(ycord) diff --git a/inputFiles/solidMechanics/beamBending_base.xml b/inputFiles/solidMechanics/beamBending_base.xml index 83ef0821a02..7dabd0f8933 100644 --- a/inputFiles/solidMechanics/beamBending_base.xml +++ b/inputFiles/solidMechanics/beamBending_base.xml @@ -38,7 +38,6 @@ target="/Outputs/restartOutput"/> - - + + + `\n\n' % (sphinx_path)) @@ -287,9 +287,9 @@ def buildTableValues(type_map, link_string='XML', include_defaults=True): output_handle.write('.. include:: %s/%s.rst\n\n' % (sphinx_path, type_name)) # Parse the non-input schema definitions - output_handle.write('********************************\n') + output_handle.write('*************************\n') output_handle.write('Datastructure Definitions\n') - output_handle.write('********************************\n\n') + output_handle.write('*************************\n\n') for type_name in sorted(other_attribute_map.keys()): # Write the individual tables diff --git a/scripts/postProcessing/SneddonValidation.py b/scripts/postProcessing/SneddonValidation.py index c49d4b4c254..ca5708d83c5 100644 --- a/scripts/postProcessing/SneddonValidation.py +++ b/scripts/postProcessing/SneddonValidation.py @@ -77,7 +77,7 @@ def main(filesPaths): # Read HDF5 hf = h5py.File(hdf5File1Path, 'r') jump = hf.get('displacementJump') - jump = np.array(jump) + jump = np.asarray(jump) aperture = jump[0, :, 0] hf = h5py.File(hdf5File1Path, 'r') diff --git a/scripts/postProcessing/plotsolution_thermalFlow.py b/scripts/postProcessing/plotsolution_thermalFlow.py index a7fc5695da3..283bc0d12af 100644 --- a/scripts/postProcessing/plotsolution_thermalFlow.py +++ b/scripts/postProcessing/plotsolution_thermalFlow.py @@ -17,21 +17,21 @@ def main(directory): # Read simulation output from HDF5 file hf = h5py.File(hdf5FilePathTemperature, 'r') timeTemperature = hf.get('temperature Time') - timeTemperature = np.array(timeTemperature) + timeTemperature = np.asarray(timeTemperature) centerTemperature = hf.get('temperature elementCenter') - centerTemperature = np.array(centerTemperature) + centerTemperature = np.asarray(centerTemperature) xcord_elm = centerTemperature[0,:,0] ycord_elm = centerTemperature[0,:,1] zcord_elm = centerTemperature[0,:,2] temperature = hf.get('temperature') - temperature = np.array(temperature) + temperature = np.asarray(temperature) print(ycord_elm) filename = "pressure_history.hdf5" hdf5FilePathPressure = os.path.join( directory, filename ) hf = h5py.File(hdf5FilePathPressure, 'r') - pressure = np.array( hf.get('pressure') ) + pressure = np.asarray( hf.get('pressure') ) t_index = [0, 1, 2, 9] tstar = [0, 100, 200, 900] @@ -57,9 +57,9 @@ def main(directory): pplist.append(ptemp) temperaturelist.append(ttemp) - xlist = np.array(xlist) - pplist = np.array(pplist) - temperaturelist = np.array(temperaturelist) + xlist = np.asarray(xlist) + pplist = np.asarray(pplist) + temperaturelist = np.asarray(temperaturelist) #Visualization diff --git a/src/conf.py b/src/conf.py index fe9c2002d28..0bcf74a68b2 100644 --- a/src/conf.py +++ b/src/conf.py @@ -79,9 +79,11 @@ if not os.path.exists(config_dst): os.symlink(config_src, config_dst) + print("********** Running Doxygen in ReadtheDocs **********") # Call doxygen - from subprocess import call - call(['doxygen', doxyfile_dst]) + from subprocess import run + run(['doxygen', doxyfile_dst]) + print("********** Finished Running Doxygen in ReadtheDocs **********") # -- Project information ----------------------------------------------------- @@ -149,7 +151,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path . -exclude_patterns = [u'_build', 'Thumbs.db', '.DS_Store', 'cmake/*'] +exclude_patterns = [u'_build', 'Thumbs.db', '.DS_Store', 'cmake/*', '**/blt/**'] todo_include_todos = True diff --git a/src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.rst b/src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.rst index 8ddede6ba58..b229bd29047 100644 --- a/src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.rst +++ b/src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.rst @@ -21,7 +21,7 @@ XML Structure ------------- A typical XML file to run the triaxial driver will have the following key elements. We present the whole file first, before digging into the individual blocks. -.. literalinclude:: ../../../unitTests/constitutiveTests/testTriaxial_druckerPragerExtended.xml +.. literalinclude:: ../../unitTests/constitutiveTests/testTriaxial_druckerPragerExtended.xml :language: xml The first thing to note is that the XML structure is identical to a standard GEOS input deck. In fact, once the constitutive block is calibrated, one could start adding solver and discretization blocks to the same file to create a proper field simulation. This makes it easy to go back and forth between calibration and simulation. diff --git a/src/coreComponents/mesh/docs/meshDeveloperGuide.rst b/src/coreComponents/mesh/docs/meshDeveloperGuide.rst index 8800dd7d139..5145efa3f95 100644 --- a/src/coreComponents/mesh/docs/meshDeveloperGuide.rst +++ b/src/coreComponents/mesh/docs/meshDeveloperGuide.rst @@ -30,7 +30,7 @@ regions (Top and Bottom) (:numref:`modelMeshDevFig`). DomainPartition =============== -In :numref:`MeshObjectInstantiationHierarchy` the top level object ``DomainPartition`` represents +In :numref:`diagMeshDevFig` the top level object ``DomainPartition`` represents a partition of the decomposed physical domain. At this time there is a unique ``DomainPartition`` for every MPI rank. diff --git a/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsConformingFractures.rst b/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsConformingFractures.rst index 0a8fe63a76f..0e6e022541a 100644 --- a/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsConformingFractures.rst +++ b/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsConformingFractures.rst @@ -1,8 +1,8 @@ .. _SolidMechanicsConformingFractures: -##################################### +########################################### Solid mechanics conforming fractures solver -##################################### +########################################### Introduction ============ diff --git a/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsEmbeddedFractures.rst b/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsEmbeddedFractures.rst index 0e138bd2b84..6bce5272991 100644 --- a/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsEmbeddedFractures.rst +++ b/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsEmbeddedFractures.rst @@ -1,8 +1,8 @@ .. _SolidMechanicsEmbeddedFractures: -##################################### +######################################### Solid mechanics embedded fractures solver -##################################### +######################################### @@ -11,7 +11,7 @@ Introduction Discretization & soltuion strategy -========================= +================================== The linear momentum balance equation is discretized using a low order finite element method. Moreover, to account for the influence of the fractures on the overall behavior, we utilize the enriched finite element method (EFEM) with a piece-wise constant enrichment. This method employs an element-local enrichment of the FE space using the concept of assumedenhanced strain [1-6]. @@ -22,7 +22,7 @@ Example An example of a valid XML block is given here: -.. literalinclude:: ../../../../../inputFiles/efemFractureMechanics/Sneddon_embeddedFrac_base.xml +.. literalinclude:: ../../../../../inputFiles/efemFractureMechanics/Sneddon_embeddedFrac_smoke.xml :language: xml :start-after: :end-before: diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 2ce27d7e4f8..b8bab4d1c07 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -140,7 +140,7 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, setApplyDefaultValue( -1. ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Target CFL condition `CFL condition `_" - "when computing the next timestep." ); + " when computing the next timestep." ); this->registerWrapper( viewKeyStruct::useTotalMassEquationString(), &m_useTotalMassEquation ). setSizedFromParent( 0 ). diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/Example.rst b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/Example.rst index 912f18a8828..14eb7d136f3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/Example.rst +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/Example.rst @@ -200,7 +200,7 @@ Inspecting Results In the example, we request vtk output files for time-series (time history). We use paraview to visualize the outcome at the time 0s. The following figure shows the final gradient of pressure and of the effective vertical stress after initialization is completed. -.. _problemInitializationPres: +.. _problemInitializationPressure: .. figure:: pressure_field.png :align: center :width: 500 @@ -208,7 +208,7 @@ The following figure shows the final gradient of pressure and of the effective v Simulation result of pressure -.. _problemInitializationSZZ: +.. _problemInitializationStressZZ: .. figure:: effective_SZZ.png :align: center :width: 500 diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py index 4255c9ff3a4..17d26c5174f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/gravityInducedStressInitialization/gravityInitializationFigure.py @@ -60,8 +60,8 @@ def main(): parser.add_argument('--geosDir', help='Path to the GEOS repository ', default='../../../../../..') parser.add_argument('--outputDir', help='Path to output directory', default='.') - # Parse the command-line arguments - args = parser.parse_args() + # Parse the command-line arguments + args = parser.parse_args() # File path outputDir = args.outputDir diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst index 44d96c03c57..9879256818e 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst @@ -30,7 +30,7 @@ scalingType geos_CompositionalMultiphaseFVM_Scalin | * Global | * Local solutionChangeScalingFactor real64 0.5 Damping factor for solution change targets -targetFlowCFL real64 -1 Target CFL condition `CFL condition `_when computing the next timestep. +targetFlowCFL real64 -1 Target CFL condition `CFL condition `_ when computing the next timestep. targetPhaseVolFractionChangeInTimeStep real64 0.2 Target (absolute) change in phase volume fraction in a time step targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. targetRelativeCompDensChangeInTimeStep real64 1.79769e+308 Target (relative) change in component density in a time step diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst index cd57d7e4ef8..bd913f8f271 100644 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst +++ b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst @@ -22,7 +22,7 @@ minCompDens real64 1e-10 Minimu minScalingFactor real64 0.01 Minimum value for solution scaling factor name groupName required A name is required for any non-unique nodes solutionChangeScalingFactor real64 0.5 Damping factor for solution change targets -targetFlowCFL real64 -1 Target CFL condition `CFL condition `_when computing the next timestep. +targetFlowCFL real64 -1 Target CFL condition `CFL condition `_ when computing the next timestep. targetPhaseVolFractionChangeInTimeStep real64 0.2 Target (absolute) change in phase volume fraction in a time step targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. targetRelativeCompDensChangeInTimeStep real64 1.79769e+308 Target (relative) change in component density in a time step diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 8537e8af271..71b6b3f3452 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -2475,7 +2475,7 @@ the relative residual norm satisfies: - + @@ -2553,7 +2553,7 @@ the relative residual norm satisfies: - + diff --git a/src/docs/sphinx/CompleteXMLSchema.rst b/src/docs/sphinx/CompleteXMLSchema.rst index fcdc093a46c..a837763309d 100644 --- a/src/docs/sphinx/CompleteXMLSchema.rst +++ b/src/docs/sphinx/CompleteXMLSchema.rst @@ -1,11 +1,10 @@ -###################### +################### Datastructure Index -###################### - -************************** +################### +************************ Input Schema Definitions -************************** +************************ :download:`XML Schema <../../coreComponents/schema/docs/../schema.xsd>` @@ -1479,9 +1478,9 @@ Element: quartz =============== .. include:: ../../coreComponents/schema/docs/quartz.rst -******************************** +************************* Datastructure Definitions -******************************** +************************* .. _DATASTRUCTURE_AcousticElasticSEM: diff --git a/src/docs/sphinx/QuickStart.rst b/src/docs/sphinx/QuickStart.rst index d043c7fea15..71a74716fad 100644 --- a/src/docs/sphinx/QuickStart.rst +++ b/src/docs/sphinx/QuickStart.rst @@ -303,7 +303,7 @@ Compiling GEOS Once the TPLs have been compiler, the next step is to compile the main code. The ``config-build.py`` script is used to configure the build directory. Before running the configuration script, ensure that the path to the TPLs is correctly set in the host configuration file by setting .. code-block:: sh - + set(GEOS_TPL_DIR "/path/to/your/TPL/installation/dir" CACHE PATH "") If you have followed these instructions, the TPLs are installed at the default location, i.e. ``/path/to/your/TPL/thirdPartyLibs/install-your-platform-release``. @@ -320,7 +320,7 @@ An alternative is to set the path ``GEOS_TPL_DIR`` via a cmake command line opti python scripts/config-build.py -hc host-configs/your-platform.cmake -bt Release -D GEOS_TPL_DIR=/full/path/to/thirdPartyLibs .. note:: - + We highly recommend using full paths, rather than relative paths, whenever possible. Once the configuration process is completed, we proceed with the compilation of the main code and the instalation of geos. diff --git a/src/docs/sphinx/advancedExamples/performanceBenchmarks/Index.rst b/src/docs/sphinx/advancedExamples/performanceBenchmarks/Index.rst index bbca61572c6..8d75689daf8 100644 --- a/src/docs/sphinx/advancedExamples/performanceBenchmarks/Index.rst +++ b/src/docs/sphinx/advancedExamples/performanceBenchmarks/Index.rst @@ -78,6 +78,7 @@ Compositional Multiphase Flow Weak scaling results for the compositional multiphase flow model on Frontier. .. _wellboreRunning: + Running the Performance Study ----------------------------- diff --git a/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/Example.rst index 0259759d569..9aedba305d5 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/Example.rst @@ -154,9 +154,9 @@ Either the entire field or specified named sets of indices in the field can be c In this example, ``phaseVolumeFractionCollection`` is specified to output the time history of phase saturations ``fieldName="phaseVolumeFraction"`` across the computational domain. .. literalinclude:: ../../../../../../../inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_base.xml - :language: xml - :start-after: - :end-before: + :language: xml + :start-after: + :end-before: This task is triggered using the ``Event`` manager with a ``PeriodicEvent`` defined for the recurring tasks. GEOS writes one file named after the string defined in the ``filename`` keyword, formatted as a HDF5 file (saturationHistory.hdf5). The TimeHistory file contains the collected time history information from the specified time history collector. diff --git a/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/buckleyLeverettFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/buckleyLeverettFigure.py index 4109c71ff0f..f4faa2eaeae 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/buckleyLeverettFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/buckleyLeverett/buckleyLeverettFigure.py @@ -153,11 +153,11 @@ def main(): # Read simulation output from HDF5 file hf = h5py.File(hdf5FilePath, 'r') time = hf.get('phaseVolumeFraction Time') - time = np.array(time) + time = np.asarray(time) center = hf.get('phaseVolumeFraction elementCenter') - center = np.array(center) + center = np.asarray(center) phaseVolFracFromGEOSX = hf.get('phaseVolumeFraction') - phaseVolFracFromGEOSX = np.array(phaseVolFracFromGEOSX) + phaseVolFracFromGEOSX = np.asarray(phaseVolFracFromGEOSX) n = 100000 # sampling value, will decide the accuracy of front detection in the BL analytical solution minDiff = 1e99 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/isothermalLeakyWell/isothermalLeakyWellFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/isothermalLeakyWell/isothermalLeakyWellFigure.py index fc67ae8b080..a116c42d825 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/isothermalLeakyWell/isothermalLeakyWellFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/isothermalLeakyWell/isothermalLeakyWellFigure.py @@ -14,9 +14,10 @@ def main(): # Read HDF5 hf = h5py.File(hdf5FilePath, 'r') time = hf.get('phaseOutflux Time') - time = np.array(time) phaseOutflux = hf.get('phaseOutflux') - phaseOutflux = np.array(phaseOutflux) + + time = np.asarray(time) + phaseOutflux = np.asarray(phaseOutflux) # Conversions inKilograms = 479.0 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/thermalLeakyWell/thermalLeakyWell.py b/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/thermalLeakyWell/thermalLeakyWell.py index bc28a9aeccb..95e6ddac052 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/thermalLeakyWell/thermalLeakyWell.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/carbonStorage/thermalLeakyWell/thermalLeakyWell.py @@ -15,15 +15,15 @@ def main(): # Read HDF5 hf = h5py.File(hdf5FilePathRefined, 'r') timeRefined = hf.get('componentOutflux Time') - timeRefined = np.array(timeRefined) + timeRefined = np.asarray(timeRefined) compOutfluxRefined = hf.get('componentOutflux') - compOutfluxRefined = np.array(compOutfluxRefined) + compOutfluxRefined = np.asarray(compOutfluxRefined) hf = h5py.File(hdf5FilePathCoarse, 'r') timeCoarse = hf.get('componentOutflux Time') - timeCoarse = np.array(timeCoarse) + timeCoarse = np.asarray(timeCoarse) compOutfluxCoarse = hf.get('componentOutflux') - compOutfluxCoarse = np.array(compOutfluxCoarse) + compOutfluxCoarse = np.asarray(compOutfluxCoarse) # Conversions inDays = 1.0 / 86400.0 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py index e56746ce8ae..2aa2ffa8fdf 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py @@ -111,20 +111,20 @@ def main(): # Global Coordinate of Fracture Element Center hf = h5py.File(hdf5File1Path, 'r') xl = hf.get('traction elementCenter') - xl = np.array(xl) + xl = np.asarray(xl) xcord = xl[0, :, 0] ycord = xl[0, :, 1] zcord = xl[0, :, 2] # Local Normal Traction trac = hf.get('traction') - trac = np.array(trac) + trac = np.asarray(trac) normalTraction = trac[-1, :, 0] # Local Shear Displacement hf = h5py.File(hdf5File2Path, 'r') jump = hf.get('displacementJump') - jump = np.array(jump) + jump = np.asarray(jump) displacementJump = jump[-1, :, 1] aperture = jump[-1, :, 0] diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py index 761d56d7146..01513ae946d 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py @@ -103,7 +103,7 @@ def main(): # Global Coordinate of Fracture Element Center hf = h5py.File(hdf5File1Path, 'r') xl = hf.get('traction elementCenter') - xl = np.array(xl) + xl = np.asarray(xl) xcord = xl[0, :, 0] ycord = xl[0, :, 1] zcord = xl[0, :, 2] @@ -111,13 +111,13 @@ def main(): # Local Normal Traction hf = h5py.File(hdf5File1Path, 'r') trac = hf.get('traction') - trac = np.array(trac) + trac = np.asarray(trac) normalTraction = trac[0, :, 0] # Local Shear Displacement hf = h5py.File(hdf5File2Path, 'r') jump = hf.get('displacementJump') - jump = np.array(jump) + jump = np.asarray(jump) displacementJump = jump[0, :, 1] # Extract Local Inform for The Middle Layer diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/sneddonFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/sneddonFigure.py index f595a1478c4..6562cfdc8e9 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/sneddonFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/sneddonFigure.py @@ -83,7 +83,7 @@ def main(): # Read HDF5 hf = h5py.File(hdf5File1Path, 'r') jump = hf.get('displacementJump') - jump = np.array(jump) + jump = np.asarray(jump) aperture_EmbeddeFrac = jump[0, :, 0] x = hf.get('displacementJump elementCenter') loc_EmbeddeFrac = x[0, :, 1] @@ -94,7 +94,7 @@ def main(): # Read HDF5 hf = h5py.File(hdf5File2Path, 'r') jump = hf.get('displacementJump') - jump = np.array(jump) + jump = np.asarray(jump) aperture_Contact = jump[0, :, 0] x = hf.get('displacementJump elementCenter') loc_Contact = x[0, :, 1] @@ -105,7 +105,7 @@ def main(): # Read HDF5 hf = h5py.File(hdf5File3Path, 'r') jump = hf.get('elementAperture') - jump = np.array(jump) + jump = np.asarray(jump) aperture_HydroFrac = jump[0, :] x = hf.get('elementAperture elementCenter') loc_HydroFrac = x[0, :, 1] diff --git a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationQueries.py b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationQueries.py index dd2730e3c1f..f46826d4c03 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationQueries.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/hydraulicFracture/kgdValidation/kgdValidationQueries.py @@ -73,21 +73,21 @@ def main(): # Global Coordinate of Element Center hf = hdf5_wrapper.hdf5_wrapper(hdf5File) xl = hf['pressure elementCenter'] - xl = np.array(xl) + xl = np.asarray(xl) xcord = xl[-1, :, 0] ycord = xl[-1, :, 1] zcord = xl[-1, :, 2] tl = hf['pressure Time'] - tl = np.array(tl) + tl = np.asarray(tl) # Load pressure fpre = hf['pressure'] - fpre = np.array(fpre) + fpre = np.asarray(fpre) # Load elementAperture aper = hf['elementAperture'] - aper = np.array(aper) + aper = np.asarray(aper) # Load elementArea area = hf['elementArea'] - area = np.array(area) + area = np.asarray(area) # Query simulation results xloc_58 = 0.015 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/Index.rst b/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/Index.rst index 46eda39040d..3b5ff0a73ca 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/Index.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/Index.rst @@ -1,4 +1,4 @@ -.. _ValidationStudiesFaultMechanics: +.. _ValidationStudiesPoromechanics: Poromechanics diff --git a/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/Example.rst index a0fb9047a0c..3e0cf3e0710 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/poromechanics/mandel/Example.rst @@ -30,7 +30,7 @@ Description of the case We simulate the consolidation of a poroelastic slab between two rigid and impermeable plates subjected to a constant normal force. The slab is assumed to be fully saturated, homogeneous, isotropic, and infinitely long in the y-direction. We apply a uniform compressive load in the vertical direction. This force leads to a change of pore pressure and mechanical deformations of the sample, evolving with time due to fluid diffusion and coupling effects. The numerical model represents a plane strain deformation and lateral drainage without confinement, showing only a quarter of the computational domain in the x-z plane (the rest follows by symmetry). -.. _problemSketchFig: +.. _mandelProblemSketchFig: .. figure:: sketch.png :align: center :width: 500 @@ -119,7 +119,7 @@ As demonstrated in this example, to setup a poromechanical coupling, we need to - the mechanics solver, a solver of type ``SolidMechanicsLagrangianSSLE`` called here ``lagsolve`` (more information here: :ref:`SolidMechanicsLagrangianFEM`), -.. literalinclude:: ../../../../../../../inputFiles/poromechanics/PoroElastic_Mandel_base.xml +.. literalinclude:: ../../../../../../../inputFiles/poromechanics/PoroElastic_Mandel_smoke_sequential.xml :language: xml :start-after: :end-before: @@ -127,7 +127,7 @@ As demonstrated in this example, to setup a poromechanical coupling, we need to - the single-phase flow solver, a solver of type ``SinglePhaseFVM`` called here ``SinglePhaseFlow`` (more information on these solvers at :ref:`SinglePhaseFlow`), -.. literalinclude:: ../../../../../../../inputFiles/poromechanics/PoroElastic_Mandel_base.xml +.. literalinclude:: ../../../../../../../inputFiles/poromechanics/PoroElastic_Mandel_smoke_sequential.xml :language: xml :start-after: :end-before: @@ -135,7 +135,7 @@ As demonstrated in this example, to setup a poromechanical coupling, we need to - the coupling solver (``SinglePhasePoromechanics``) that will bind the two single-physics solvers above, which is named as ``poroSolve`` (more information at :ref:`PoroelasticSolver`). -.. literalinclude:: ../../../../../../../inputFiles/poromechanics/PoroElastic_Mandel_base.xml +.. literalinclude:: ../../../../../../../inputFiles/poromechanics/PoroElastic_Mandel_smoke_sequential.xml :language: xml :start-after: :end-before: diff --git a/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/Example.rst index 74e9a10750d..7e67e01d820 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/Example.rst @@ -31,7 +31,7 @@ The initial temperature of the saturated soil is 0 degrees Celsius. The soil column is insulated and sealed everywhere, except at the top surface. The problem setup is illustrated below. -.. _problemSketchFig: +.. _thermoPoroMechanicsProblemSketchFig: .. figure:: sketch.png :align: center :width: 350 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationDisplacementFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationDisplacementFigure.py index 210bfd27a8c..285a7b15706 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationDisplacementFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationDisplacementFigure.py @@ -15,11 +15,11 @@ def main(): # Read simulation output from HDF5 file hf = h5py.File(hdf5FilePathDisplacement, 'r') timeDisplacement = hf.get('totalDisplacement Time') - timeDisplacement = np.array(timeDisplacement) + timeDisplacement = np.asarray(timeDisplacement) centerDisplacement = hf.get('totalDisplacement ReferencePosition') - centerDisplacement = np.array(centerDisplacement) + centerDisplacement = np.asarray(centerDisplacement) displacement = hf.get('totalDisplacement') - displacement = np.array(displacement) + displacement = np.asarray(displacement) time = 1 posVertex1 = -1 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationPressureFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationPressureFigure.py index 90a074889f1..d72455e6020 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationPressureFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationPressureFigure.py @@ -15,11 +15,11 @@ def main(): # Read simulation output from HDF5 file hf = h5py.File(hdf5FilePathPressure, 'r') timePressure = hf.get('pressure Time') - timePressure = np.array(timePressure) + timePressure = np.asarray(timePressure) centerPressure = hf.get('pressure elementCenter') - centerPressure = np.array(centerPressure) + centerPressure = np.asarray(centerPressure) pressure = hf.get('pressure') - pressure = np.array(pressure) + pressure = np.asarray(pressure) time = 1 posElement1 = -1 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationTemperatureFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationTemperatureFigure.py index 65b4dd710d5..ee60cf94ab5 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationTemperatureFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/thermoPoromechanics/thermalConsolidation/thermalConsolidationTemperatureFigure.py @@ -15,11 +15,11 @@ def main(): # Read simulation output from HDF5 file hf = h5py.File(hdf5FilePathTemperature, 'r') timeTemperature = hf.get('temperature Time') - timeTemperature = np.array(timeTemperature) + timeTemperature = np.asarray(timeTemperature) centerTemperature = hf.get('temperature elementCenter') - centerTemperature = np.array(centerTemperature) + centerTemperature = np.asarray(centerTemperature) temperature = hf.get('temperature') - temperature = np.array(temperature) + temperature = np.asarray(temperature) time = 1 posElement1 = -1 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/RelaxationTest/relaxationTestFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/RelaxationTest/relaxationTestFigure.py index 2b03b587a40..abb10fdcaac 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/RelaxationTest/relaxationTestFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/viscoplasticity/RelaxationTest/relaxationTestFigure.py @@ -212,14 +212,14 @@ def main(): # Global Coordinate of Element Center hf = h5py.File(hdf5File2Path, 'r') xl_elm = hf.get('rock_stress elementCenter') - xl_elm = np.array(xl_elm) + xl_elm = np.asarray(xl_elm) xcord_elm = xl_elm[0, :, 0] ycord_elm = xl_elm[0, :, 1] zcord_elm = xl_elm[0, :, 2] time = hf.get('rock_stress Time') # Load Stress Components sigma = hf.get('rock_stress') - sigma = np.array(sigma) + sigma = np.asarray(sigma) sigma_Cart = np.zeros([len(sigma[:,0,0]), len(sigma[0,:,0]), 6]) for tl in range(0,len(sigma[:,0,0])): for i in range(0,len(sigma[0,:,0])): diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/Example.rst index 7db478cad33..58b71536263 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/Example.rst @@ -1,9 +1,9 @@ .. _AdvancedExampleCasedElasticWellbore_ImperfectInterfaces: -############################################### +################################################ Cased Elastic Wellbore with Imperfect Interfaces -############################################### +################################################ ------------------------------------------------------------------ Problem description diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/elastic_casedWellbore_displacementJump.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/elastic_casedWellbore_displacementJump.py index 54d4738a790..6f319c97a47 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/elastic_casedWellbore_displacementJump.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactElasticWellbore/elastic_casedWellbore_displacementJump.py @@ -13,8 +13,8 @@ def main(): # Plot GEOSX results hf = h5py.File(hdf5FilePath, 'r') - time = np.array( hf.get('displacementJump Time') ) - displacementJump = np.array( hf.get('displacementJump') ) + time = np.asarray( hf.get('displacementJump Time') ) + displacementJump = np.asarray( hf.get('displacementJump') ) nTime = time.shape[0] diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/Example.rst index fb56a974211..4003200ef5c 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/Example.rst @@ -111,8 +111,6 @@ The GEOS results of displacement jump across the casing-cement and cement-rock i The GEOS results and analytical results for temperature distribution around the cased wellbore are shown in the figures below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_temperature.py - .. _problemCasedContactThermoElasticWellbore_Temperature_Fig: .. figure:: temperature.png :align: center @@ -123,8 +121,6 @@ The GEOS results and analytical results for temperature distribution around the and the radial displacement around the wellbore is shown below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_displacement.py - .. _problemCasedContactThermoElasticWellbore_Displacement_Fig: .. figure:: displacement.png :align: center @@ -135,8 +131,6 @@ and the radial displacement around the wellbore is shown below: The total radial and hoop stress (tangential stress) components computed by GEOS and the reference results are shown in the figure below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_stress.py - .. _problemCasedContactThermoElasticWellbore_Stresses_Fig: .. figure:: stress.png :align: center diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_displacement.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_displacement.py index a3fe2be399e..ec2a13f547a 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_displacement.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_displacement.py @@ -13,9 +13,9 @@ def main(): # Plot GEOSX results hf = h5py.File(hdf5FilePath, 'r') - time = np.array( hf.get('totalDisplacement Time') ) - center = np.array( hf.get('totalDisplacement ReferencePosition') ) - displacement = np.array( hf.get('totalDisplacement') ) + time = np.asarray( hf.get('totalDisplacement Time') ) + center = np.asarray( hf.get('totalDisplacement ReferencePosition') ) + displacement = np.asarray( hf.get('totalDisplacement') ) nNodes = center.shape[1] xCoord = center[0, 0:nNodes, 0] diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_stress.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_stress.py index dfdb898838d..6a641106112 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_stress.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_stress.py @@ -30,13 +30,13 @@ def main(): # Get stress, time and element center hf_stress = h5py.File(filePath_stress, 'r') - time = np.array( hf_stress.get(stress_field_name + ' Time') ) - center = np.array( hf_stress.get(stress_field_name + ' elementCenter') ) - stress = np.array( hf_stress.get(stress_field_name) ) + time = np.asarray( hf_stress.get(stress_field_name + ' Time') ) + center = np.asarray( hf_stress.get(stress_field_name + ' elementCenter') ) + stress = np.asarray( hf_stress.get(stress_field_name) ) # Get temperature hf_temperature = h5py.File(filePath_temperature, 'r') - temperature = np.array( hf_temperature.get('temperature') ) + temperature = np.asarray( hf_temperature.get('temperature') ) # Compute total stress stress_xx_total = stress[:,:,0] - 3 * bulkModuli[idx] * thermalExpansionCoefficients[idx] * temperature diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_temperature.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_temperature.py index 0d93502677d..112a18e726b 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_temperature.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedContactThermoElasticWellbore/thermoElastic_casedContactWellbore_temperature.py @@ -18,9 +18,9 @@ def main(): for filePath in hdf5FilePath: hf = h5py.File(filePath, 'r') - time = np.array( hf.get('temperature Time') ) - center = np.array( hf.get('temperature elementCenter') ) - temperature = np.array( hf.get('temperature') ) + time = np.asarray( hf.get('temperature Time') ) + center = np.asarray( hf.get('temperature elementCenter') ) + temperature = np.asarray( hf.get('temperature') ) nElements = center.shape[1] xCoord = center[0, 0:nElements, 0] @@ -29,7 +29,7 @@ def main(): if (hasLabel): plt.plot( rCoord, - temperature[10, 0:nElements], + temperature[10, 0:nElements], 'r+', label='GEOS: t = 1e4 (s)') diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/Example.rst index c48146a0053..bad01dcc9a7 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/Example.rst @@ -212,8 +212,6 @@ Results and benchmark A good agreement between the GEOS results and analytical results for temperature distribution around the cased wellbore is shown in the figures below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_temperature.py - .. _problemCasedThermoElasticWellbore_Temperature_Fig: .. figure:: temperature.png :align: center @@ -224,8 +222,6 @@ A good agreement between the GEOS results and analytical results for temperature and the validation for the radial displacement around the cased wellbore is shown below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_displacement.py - .. _problemCasedThermoElasticWellbore_Displacement_Fig: .. figure:: displacement.png :align: center @@ -236,8 +232,6 @@ and the validation for the radial displacement around the cased wellbore is show The validations of the total radial and hoop stress (tangent stress) components computed by GEOS against reference results are shown in the figure below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_stress.py - .. _problemCasedThermoElasticWellbore_Stresses_Fig: .. figure:: stress.png :align: center diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_displacement.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_displacement.py index e3179d7296b..e6189fe2c71 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_displacement.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_displacement.py @@ -13,9 +13,9 @@ def main(): # Get GEOS results hf = h5py.File(hdf5FilePath, 'r') - time = np.array( hf.get('totalDisplacement Time') ) - center = np.array( hf.get('totalDisplacement ReferencePosition') ) - displacement = np.array( hf.get('totalDisplacement') ) + time = np.asarray( hf.get('totalDisplacement Time') ) + center = np.asarray( hf.get('totalDisplacement ReferencePosition') ) + displacement = np.asarray( hf.get('totalDisplacement') ) nNodes = center.shape[1] xCoord = center[0, 0:nNodes, 0] diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_stress.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_stress.py index 54cd5044145..e6ec6e50296 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_stress.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_stress.py @@ -31,13 +31,13 @@ def main(): # Get stress, time and element center hf_stress = h5py.File(filePath_stress, 'r') - time = np.array( hf_stress.get(stress_field_name + ' Time') ) - center = np.array( hf_stress.get(stress_field_name + ' elementCenter') ) - stress = np.array( hf_stress.get(stress_field_name) ) + time = np.asarray( hf_stress.get(stress_field_name + ' Time') ) + center = np.asarray( hf_stress.get(stress_field_name + ' elementCenter') ) + stress = np.asarray( hf_stress.get(stress_field_name) ) # Get temperature hf_temperature = h5py.File(filePath_temperature, 'r') - temperature = np.array( hf_temperature.get('temperature') ) + temperature = np.asarray( hf_temperature.get('temperature') ) # Compute total stress: # With the actual version of GEOS, the output stress need to be combined with the temperature contribution to obtain the total tress as follows: diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_temperature.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_temperature.py index 6f942827d58..84c3758b636 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_temperature.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/casedThermoElasticWellbore/thermoElastic_casedWellbore_temperature.py @@ -18,9 +18,9 @@ def main(): for filePath in hdf5FilePath: hf = h5py.File(filePath, 'r') - time = np.array( hf.get('temperature Time') ) - center = np.array( hf.get('temperature elementCenter') ) - temperature = np.array( hf.get('temperature') ) + time = np.asarray( hf.get('temperature Time') ) + center = np.asarray( hf.get('temperature elementCenter') ) + temperature = np.asarray( hf.get('temperature') ) nElements = center.shape[1] xCoord = center[0, 0:nElements, 0] diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample1Figure.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample1Figure.py index aaeb8bc8820..51ba65feb99 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample1Figure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample1Figure.py @@ -96,7 +96,7 @@ def getParametersFromXML(xmlFilePath): porosity = float(tree.find('Constitutive/BiotPorosity').get('defaultReferencePorosity')) - skeletonBulkModulus = float(tree.find('Constitutive/BiotPorosity').get('grainBulkModulus')) + skeletonBulkModulus = float(tree.find('Constitutive/BiotPorosity').get('defaultGrainBulkModulus')) fluidCompressibility = float(tree.find('Constitutive/CompressibleSinglePhaseFluid').get('compressibility')) bBiot = 1.0 - bulkModulus / skeletonBulkModulus diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample2Figure.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample2Figure.py index a27e706eed3..4bf3b74370f 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample2Figure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/deviatedPoroElasticWellbore/deviatedPoroElasticWellboreExample2Figure.py @@ -103,7 +103,7 @@ def getParametersFromXML(xmlFilePath): porosity = float(tree.find('Constitutive/BiotPorosity').get('defaultReferencePorosity')) - skeletonBulkModulus = float(tree.find('Constitutive/BiotPorosity').get('grainBulkModulus')) + skeletonBulkModulus = float(tree.find('Constitutive/BiotPorosity').get('defaultGrainBulkModulus')) fluidCompressibility = float(tree.find('Constitutive/CompressibleSinglePhaseFluid').get('compressibility')) bBiot = 1.0 - bulkModulus / skeletonBulkModulus diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/dpWellbore/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/dpWellbore/Example.rst index df0e8f5ba23..25ca393373a 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/dpWellbore/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/dpWellbore/Example.rst @@ -68,9 +68,7 @@ The parameters used in the simulation are summarized in the following table. The validation of GEOS results against analytical results is shown in the figure below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/dpWellbore/dpWellbore_plot.py - -.. _edpWellboreVerificationFig: +.. _dpWellboreVerificationFig: .. figure:: dpWellboreVerification.png :align: center :width: 1000 diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/dpWellbore/dpWellbore_plot.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/dpWellbore/dpWellbore_plot.py index f4cc634c4b7..24dd2e4eb2e 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/dpWellbore/dpWellbore_plot.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/dpWellbore/dpWellbore_plot.py @@ -76,14 +76,14 @@ def main(): # Get stress, time and element center from GEOSX results stress_field_name = 'rock_stress' hf_stress = h5py.File('stressHistory_rock.hdf5', 'r') - time = np.array( hf_stress.get(stress_field_name + ' Time') ) - center = np.array( hf_stress.get(stress_field_name + ' elementCenter') ) - stress = np.array( hf_stress.get(stress_field_name) ) + time = np.asarray( hf_stress.get(stress_field_name + ' Time') ) + center = np.asarray( hf_stress.get(stress_field_name + ' elementCenter') ) + stress = np.asarray( hf_stress.get(stress_field_name) ) # Get the deformed wellbore radius hf_disp = h5py.File("displacementHistory.hdf5", 'r') - displacement = np.array( hf_disp.get('totalDisplacement') ) - node_position = np.array( hf_disp.get('totalDisplacement ReferencePosition') ) + displacement = np.asarray( hf_disp.get('totalDisplacement') ) + node_position = np.asarray( hf_disp.get('totalDisplacement ReferencePosition') ) da = displacement[:, 0, 0] a = a0 + da diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/Example.rst index ea699e22054..f691cd73e2d 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/Example.rst @@ -201,8 +201,6 @@ Inspecting results In the above example, we requested hdf5 output files. We can therefore use python scripts to visualize the outcome. Below figure shows the comparisons between the numerical predictions (marks) and the corresponding analytical solutions (solid curves) with respect to the distributions of principal stress components, stress path on the wellbore surface, the supporting wellbore pressure and wellbore size. It is clear that the GEOS predictions are in excellent agreement with the analytical results. On the top-right figure, we added also a comparison between GEOS results for elasto-plastic material and the anlytical solutions of an elastic material. Note that the elastic solutions are differed from the elasto-plastic results even in the elastic zone (r/a>2). -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/edpWellbore_plot.py - .. _edpWellboreVerificationFig: .. figure:: edpWellboreVerification.png :align: center diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/edpWellbore_plot.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/edpWellbore_plot.py index 88a45f27884..007ce7f6669 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/edpWellbore_plot.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/edpWellbore/edpWellbore_plot.py @@ -98,14 +98,14 @@ def main(): # Get stress, time and element center from GEOSX results stress_field_name = 'rock_stress' hf_stress = h5py.File(outputDir + '/stressHistory_rock.hdf5', 'r') - time = np.array( hf_stress.get(stress_field_name + ' Time') ) - center = np.array( hf_stress.get(stress_field_name + ' elementCenter') ) - stress = np.array( hf_stress.get(stress_field_name) ) + time = np.asarray( hf_stress.get(stress_field_name + ' Time') ) + center = np.asarray( hf_stress.get(stress_field_name + ' elementCenter') ) + stress = np.asarray( hf_stress.get(stress_field_name) ) # Get the deformed wellbore radius hf_disp = h5py.File(outputDir + "/displacementHistory.hdf5", 'r') - displacement = np.array( hf_disp.get('totalDisplacement') ) - node_position = np.array( hf_disp.get('totalDisplacement ReferencePosition') ) + displacement = np.asarray( hf_disp.get('totalDisplacement') ) + node_position = np.asarray( hf_disp.get('totalDisplacement ReferencePosition') ) da = displacement[:, 0, 0] a = a0 + da diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/kirschWellbore/kirschWellboreFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/kirschWellbore/kirschWellboreFigure.py index 8c683c2db28..e99152255d5 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/kirschWellbore/kirschWellboreFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/kirschWellbore/kirschWellboreFigure.py @@ -138,13 +138,13 @@ def main(): # Global Coordinate of Element Center hf = h5py.File(hdf5File1Path, 'r') xl_elm = hf.get('rock_stress elementCenter') - xl_elm = np.array(xl_elm) + xl_elm = np.asarray(xl_elm) xcord_elm = xl_elm[0, :, 0] ycord_elm = xl_elm[0, :, 1] zcord_elm = xl_elm[0, :, 2] # Load Stress Components sigma = hf.get('rock_stress') - sigma = np.array(sigma) + sigma = np.asarray(sigma) sigma_Cart = np.zeros([len(sigma[0, :, 0]), 6]) for i in range(0, len(sigma[0, :, 0])): for j in range(0, 6): @@ -154,13 +154,13 @@ def main(): # Global Coordinate of Nodal Point hf = h5py.File(hdf5File2Path, 'r') xl_node = hf.get('totalDisplacement ReferencePosition') - xl_node = np.array(xl_node) + xl_node = np.asarray(xl_node) xcord_node = xl_node[0, :, 0] ycord_node = xl_node[0, :, 1] zcord_node = xl_node[0, :, 2] # Load Displacement Components disp_load = hf.get('totalDisplacement') - disp_load = np.array(disp_load) + disp_load = np.asarray(disp_load) disp_Cart = disp_load[0, :, :] # Extract Mechanical Properties and Fracture Geometry from XML diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/Example.rst index fa07f267b26..e17d62c0702 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/Example.rst @@ -144,8 +144,8 @@ It is important to remark that the initial effective stress of rock must be set .. literalinclude:: ../../../../../../../inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml :language: xml - :start-after: - :end-before: + :start-after: + :end-before: The initial and boundary conditions for pore pressure are defined in the block below: @@ -208,8 +208,6 @@ Results and benchmark A good agreement between the GEOS results and analytical results for temperature and pore pressure distribution around the wellbore is shown in the figures below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_temperature_pressure.py - .. _problemThermoPoroElasticWellbore_Temperature_Pressure_Fig: .. figure:: temperature_pressure.png :align: center @@ -220,8 +218,6 @@ A good agreement between the GEOS results and analytical results for temperature and the validation for the radial displacement around the cased wellbore is shown below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_displacement.py - .. _problemThermoPoroElasticWellbore_Displacement_Fig: .. figure:: displacement.png :align: center @@ -232,8 +228,6 @@ and the validation for the radial displacement around the cased wellbore is show The validations of the total radial and hoop stress (tangent stress) components computed by GEOS against reference results are shown in the figure below: -.. plot:: docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_stress.py - .. _problemThermoPoroElasticWellbore_Stress_Fig: .. figure:: stress.png :align: center diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_displacement.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_displacement.py index 6ce4afe8f19..6e0bacc654d 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_displacement.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_displacement.py @@ -9,9 +9,9 @@ def main(): # Plot GEOSX results hf = h5py.File("displacementHistory.hdf5", 'r') - time = np.array( hf.get('totalDisplacement Time') ) - center = np.array( hf.get('totalDisplacement ReferencePosition') ) - displacement = np.array( hf.get('totalDisplacement') ) + time = np.asarray( hf.get('totalDisplacement Time') ) + center = np.asarray( hf.get('totalDisplacement ReferencePosition') ) + displacement = np.asarray( hf.get('totalDisplacement') ) nNodes = center.shape[1] xCoord = center[0, 0:nNodes, 0] diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_stress.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_stress.py index 6ee08ca6282..4448fa04bc8 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_stress.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_stress.py @@ -41,16 +41,16 @@ def main(): # Get solid stress, time and element center from GEOSX results stress_field_name = 'rockSolid_stress' hf_stress = h5py.File(outputDir + '/stressHistory_rock.hdf5', 'r') - time = np.array( hf_stress.get(stress_field_name + ' Time') ) - center = np.array( hf_stress.get(stress_field_name + ' elementCenter') ) - stress = np.array( hf_stress.get(stress_field_name) ) + time = np.asarray( hf_stress.get(stress_field_name + ' Time') ) + center = np.asarray( hf_stress.get(stress_field_name + ' elementCenter') ) + stress = np.asarray( hf_stress.get(stress_field_name) ) # Get temperature and pore pressure for computing the total stress hf_temperature = h5py.File(outputDir + '/temperatureHistory_rock.hdf5', 'r') - temperature = np.array( hf_temperature.get('temperature') ) + temperature = np.asarray( hf_temperature.get('temperature') ) hf_pressure = h5py.File(outputDir + '/pressureHistory_rock.hdf5', 'r') - pressure = np.array( hf_pressure.get('pressure') ) + pressure = np.asarray( hf_pressure.get('pressure') ) # Compute total stress stress_xx_total = stress[:,:,0] - BiotCoefficient * pressure - 3 * bulkModulus * thermalExpansionCoefficients * temperature diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_temperature_pressure.py b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_temperature_pressure.py index 9d89633ed58..b1c612e3861 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_temperature_pressure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/thermoPoroElasticWellbore/THM_wellbore_temperature_pressure.py @@ -10,12 +10,12 @@ def main(): # Plot GEOSX results hf = h5py.File("temperatureHistory_rock.hdf5", 'r') - time = np.array( hf.get('temperature Time') ) - center = np.array( hf.get('temperature elementCenter') ) - temperature = np.array( hf.get('temperature') ) + time = np.asarray( hf.get('temperature Time') ) + center = np.asarray( hf.get('temperature elementCenter') ) + temperature = np.asarray( hf.get('temperature') ) hf = h5py.File("pressureHistory_rock.hdf5", 'r') - pressure = np.array( hf.get('pressure') ) + pressure = np.asarray( hf.get('pressure') ) nElements = center.shape[1] xCoord = center[0, 0:nElements, 0] diff --git a/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/multiphaseFlowWithWellsFigure.py b/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/multiphaseFlowWithWellsFigure.py index 0c0cf09bae4..7ef4dd4c370 100644 --- a/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/multiphaseFlowWithWellsFigure.py +++ b/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/multiphaseFlowWithWellsFigure.py @@ -18,9 +18,9 @@ def main(): # Read HDF5 hf = h5py.File(hdf5FilePath, 'r') time = hf.get('Time') - time = np.array(time) + time = np.asarray(time) massRate = hf.get('wellElementMixtureConnectionRate') - massRate = np.array(massRate) + massRate = np.asarray(massRate) # Some comments about the computation of the volumetric rate here: # A proper oil rate constraint for individual wells is currently being implemented diff --git a/src/docs/sphinx/buildGuide/AppleMacOS.rst b/src/docs/sphinx/buildGuide/AppleMacOS.rst index 7b8085035b9..ac2be331852 100644 --- a/src/docs/sphinx/buildGuide/AppleMacOS.rst +++ b/src/docs/sphinx/buildGuide/AppleMacOS.rst @@ -1,7 +1,7 @@ .. _AppleMacOS: Building Apple MacOS -============== +==================== Install homebrew ---------------- @@ -48,7 +48,7 @@ Clone thirdPartyLibs Configure and build thirdPartyLibs ---------------------------------- +---------------------------------- .. code-block:: diff --git a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst index 3b5c325ce13..2f712ee5506 100644 --- a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst +++ b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst @@ -139,8 +139,10 @@ After building GEOS, the integrated tests can be triggered in the GEOS build dir When running test or creating new baselines on LC systems, we recommend that you use the *quartz-gcc-12-release* configuration +.. _overrideTestBehavior: + Override Test Behavior -------------------------- +---------------------- For cases where you need additional control over the integrated tests behavior, you can use this script in your build directory: */path/to/GEOS/build-xyz/integratedTests/geos_ats.sh*. To run the tests, simply call this script with any desired arguments (see the output of `geos_ats.sh --help` for additional details.) @@ -532,4 +534,4 @@ We highly recommend running tests and rebaselining on an MPI-aware platform. **Filtering Checks**: A common reason for rebaselining is that you have changed the name of an XML node in the input files. While the baselines may be numerically identical, the restarts will fail because they contain different node names. -In this situation, it can be useful to add a filter to the restart check script using the *geos_ats.sh* script (see the `-e` and `-m` options in :ref:`Override Test Behavior` ) +In this situation, it can be useful to add a filter to the restart check script using the *geos_ats.sh* script (see the `-e` and `-m` options in :ref:`overrideTestBehavior` ) diff --git a/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst b/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst index 3e34bdc70c8..dbc125fa326 100644 --- a/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst +++ b/src/docs/sphinx/developerGuide/Contributing/index_contributing.rst @@ -1,4 +1,5 @@ .. _Contributing: + ############################################################################### Contributing ############################################################################### @@ -28,4 +29,4 @@ Contributing InstallWin.rst - WorkingInteractivelyOnCI.rst + WorkInteractivelyOnCI.rst diff --git a/src/docs/sphinx/tutorials/step02/Tutorial.rst b/src/docs/sphinx/tutorials/step02/Tutorial.rst index c2d0998af32..06b51144eb7 100644 --- a/src/docs/sphinx/tutorials/step02/Tutorial.rst +++ b/src/docs/sphinx/tutorials/step02/Tutorial.rst @@ -152,7 +152,7 @@ Here is the ``vtk`` file : .. literalinclude:: ../../../../../inputFiles/singlePhaseFlow/vtk/cube_10x10x10_hex.vtk :caption: cube_10x10x10_hex.vtk - :lines: 1-20 + :lines: 1-7 GEOS can run different physical solvers on different regions of the mesh at different times. Here, to keep things simple, we run one solver (single-phase flow) diff --git a/src/docs/sphinx/tutorials/step04/Tutorial.rst b/src/docs/sphinx/tutorials/step04/Tutorial.rst index d89f009817e..0be6a99f9dd 100644 --- a/src/docs/sphinx/tutorials/step04/Tutorial.rst +++ b/src/docs/sphinx/tutorials/step04/Tutorial.rst @@ -82,7 +82,7 @@ The computational domain is discretized by ``C3D8`` elements with the first orde functions at each direction in the parent domain. The 2 x 2 x 2 Gauss quadrature rule is adopted to be compatible with the first order interpolation functions. -.. literalinclude:: ../../../../../inputFiles/solidMechanics/beamBending_base.xml +.. literalinclude:: ../../../../../inputFiles/solidMechanics/beamBending_smoke.xml :language: xml :start-after: :end-before: diff --git a/src/pygeosx/pygeosx_documentation.rst b/src/pygeosx/pygeosx_documentation.rst index 4c1e3c3e346..557999148ba 100644 --- a/src/pygeosx/pygeosx_documentation.rst +++ b/src/pygeosx/pygeosx_documentation.rst @@ -6,7 +6,7 @@ GEOS can be manipulated and executed through a Python script. High-level control of GEOS is managed through the top-level ``pygeosx`` functions, like ``initialize`` and ``run``. GEOS's data can be manipulated by getting -:ref:`pylvarray ` views of LvArray objects living in GEOS's data repository. +`pylvarray `_ views of LvArray objects living in GEOS's data repository. These ``pylvarray`` views are fetched by calling ``Wrapper.value()`` after getting a ``Wrapper`` out of the data repository. From e07cec3e850dd44b92a73ef1482c3ef2e831672c Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Thu, 12 Sep 2024 09:35:10 -0700 Subject: [PATCH 192/286] fix: fix rockylinux jobs and activate them. (#3336) * fix: fix rockylinux jobs and activate them. * clean up circular dependency between finiteVolume, fieldSpecification and linearAlgebra. * use LvArray::NumericLimits * try new certs procedure on rocky/rhel * replace a+=b with a=a+b in wave solver to allow for fma operations --------- Co-authored-by: Randolph Settgast --- .github/workflows/ci_tests.yml | 44 +++++++++--------- src/coreComponents/CMakeLists.txt | 2 +- .../AquiferBoundaryCondition.cpp | 2 - .../fieldSpecification/CMakeLists.txt | 2 +- .../FieldSpecificationBase.cpp | 2 - .../FieldSpecificationBase.hpp | 1 - .../FieldSpecificationManager.hpp | 2 - .../PerfectlyMatchedLayer.hpp | 3 -- .../linearAlgebra/CMakeLists.txt | 2 +- .../mesh/utilities/ComputationalGeometry.hpp | 10 ++--- .../physicsSolvers/CMakeLists.txt | 2 +- .../CompositionalMultiphaseHybridFVM.cpp | 1 + .../inducedSeismicity/SeismicityRate.cpp | 1 + .../simplePDE/LaplaceBaseH1.cpp | 1 + .../physicsSolvers/simplePDE/LaplaceFEM.cpp | 2 + .../AcousticFirstOrderWaveEquationSEM.cpp | 1 + .../AcousticVTIWaveEquationSEM.cpp | 1 + .../isotropic/AcousticWaveEquationSEM.cpp | 1 + .../ElasticFirstOrderWaveEquationSEM.cpp | 1 + ...ElasticFirstOrderWaveEquationSEMKernel.hpp | 45 ++++++++++--------- .../isotropic/ElasticWaveEquationSEM.cpp | 1 + .../wavePropagation/shared/WaveSolverBase.cpp | 1 + 22 files changed, 68 insertions(+), 60 deletions(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 128a79febcd..6a97ca6b815 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -298,27 +298,31 @@ jobs: DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" DOCKER_CERTS_UPDATE_COMMAND: "update-ca-certificates" - # compiler error in ElasticFirstOrderWaveEquationSEMKernel::StressComputation::launch in call to FE_TYPE::computeFirstOrderStiffnessTermX - # - name: Rockylinux (8, clang 17.0.6, cuda 12.5) - # BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" - # CMAKE_BUILD_TYPE: Release - # DOCKER_REPOSITORY: geosx/rockylinux8-clang17-cuda12.5 - # RUNS_ON: streak2 - # NPROC: 2 - # DOCKER_RUN_ARGS: "--cpus=1 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" - # DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" - # DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" + - name: Rockylinux CUDA (8, clang 17.0.6, cuda 12.5.1) + BUILD_AND_TEST_CLI_ARGS: "--no-install-schema" + CMAKE_BUILD_TYPE: Release + ENABLE_HYPRE_DEVICE: CUDA + ENABLE_HYPRE: ON + ENABLE_TRILINOS: OFF + DOCKER_REPOSITORY: geosx/rockylinux8-clang17-cuda12.5 + RUNS_ON: streak + NPROC: 8 + DOCKER_RUN_ARGS: "--cpus=8 --memory=256g --runtime=nvidia --gpus all -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" + DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" - # compiler error in ElasticFirstOrderWaveEquationSEMKernel::StressComputation::launch in call to FE_TYPE::computeFirstOrderStiffnessTermX - # - name: Rockylinux (8, gcc 8.5, cuda 12.5) - # BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" - # CMAKE_BUILD_TYPE: Release - # DOCKER_REPOSITORY: geosx/rockylinux8-gcc8-cuda12.5 - # RUNS_ON: streak2 - # NPROC: 2 - # DOCKER_RUN_ARGS: "--cpus=1 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" - # DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" - # DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" + - name: Rockylinux CUDA (8, gcc 8.5, cuda 12.5.1) + BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" + CMAKE_BUILD_TYPE: Release + ENABLE_HYPRE_DEVICE: CUDA + ENABLE_HYPRE: ON + ENABLE_TRILINOS: OFF + DOCKER_REPOSITORY: geosx/rockylinux8-gcc8-cuda12.5 + RUNS_ON: streak2 + NPROC: 8 + DOCKER_RUN_ARGS: "--cpus=8 --memory=128g --runtime=nvidia -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" + DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" # Below this line, jobs that deploy to Google Cloud. diff --git a/src/coreComponents/CMakeLists.txt b/src/coreComponents/CMakeLists.txt index 014eea9d9b0..d2286f907da 100644 --- a/src/coreComponents/CMakeLists.txt +++ b/src/coreComponents/CMakeLists.txt @@ -9,9 +9,9 @@ set( subdirs schema finiteElement mesh - linearAlgebra fieldSpecification finiteVolume + linearAlgebra discretizationMethods events constitutiveDrivers diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp index 69d0fe96041..dffd783e997 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp @@ -19,8 +19,6 @@ #include "AquiferBoundaryCondition.hpp" -#include "mesh/DomainPartition.hpp" - namespace geos { diff --git a/src/coreComponents/fieldSpecification/CMakeLists.txt b/src/coreComponents/fieldSpecification/CMakeLists.txt index 5e67ea51812..943e95ab809 100644 --- a/src/coreComponents/fieldSpecification/CMakeLists.txt +++ b/src/coreComponents/fieldSpecification/CMakeLists.txt @@ -26,7 +26,7 @@ set( fieldSpecification_sources PerfectlyMatchedLayer.cpp ) -set( dependencyList ${parallelDeps} linearAlgebra ) +set( dependencyList ${parallelDeps} mesh ) geos_decorate_link_dependencies( LIST decoratedDependencies DEPENDENCIES ${dependencyList} ) diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp index 3880a96d904..45e58177dd4 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp @@ -17,8 +17,6 @@ #include "common/MpiWrapper.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" -#include "mesh/DomainPartition.hpp" - namespace geos { diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp index 953e2bee600..8306eafca0b 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp @@ -26,7 +26,6 @@ #include "codingUtilities/Utilities.hpp" #include "dataRepository/Group.hpp" #include "functions/FunctionBase.hpp" -#include "linearAlgebra/interfaces/InterfaceTypes.hpp" #include "common/FieldSpecificationOps.hpp" #include "mesh/ObjectManagerBase.hpp" #include "mesh/MeshObjectPath.hpp" diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp index 43175c82119..91672902314 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp @@ -25,8 +25,6 @@ #include "common/format/StringUtilities.hpp" #include "common/DataTypes.hpp" #include "common/TimingMacros.hpp" -#include "mesh/ObjectManagerBase.hpp" -#include "mesh/DomainPartition.hpp" namespace geos { diff --git a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp index ae0eb160f99..ce7a6151b2b 100644 --- a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp +++ b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp @@ -22,13 +22,10 @@ #define GEOS_FIELDSPECIFICATION_PERFECTLYMATCHEDLAYER_HPP_ #include "FieldSpecificationBase.hpp" -#include "mesh/DomainPartition.hpp" namespace geos { -class DomainPartition; - /** * @class PerfectlyMatchedLayer * A class to manage Perfectly Matched Layer for wave propagation solvers diff --git a/src/coreComponents/linearAlgebra/CMakeLists.txt b/src/coreComponents/linearAlgebra/CMakeLists.txt index d19283bb37f..095544ff4aa 100644 --- a/src/coreComponents/linearAlgebra/CMakeLists.txt +++ b/src/coreComponents/linearAlgebra/CMakeLists.txt @@ -47,7 +47,7 @@ set( linearAlgebra_sources solvers/SeparateComponentPreconditioner.cpp utilities/ReverseCutHillMcKeeOrdering.cpp ) -set( dependencyList ${parallelDeps} mesh denseLinearAlgebra ) +set( dependencyList ${parallelDeps} mesh denseLinearAlgebra finiteVolume ) set( tplDependencyList "" ) list( APPEND linearAlgebra_headers interfaces/direct/SuiteSparse.hpp ) diff --git a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp index 1670a351364..23e3fe65887 100644 --- a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp +++ b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp @@ -35,7 +35,7 @@ namespace computationalGeometry { /// Machine epsilon for double-precision calculations -constexpr real64 machinePrecision = std::numeric_limits< real64 >::epsilon(); +constexpr real64 machinePrecision = LvArray::NumericLimits< real64 >::epsilon; /** * @brief Calculate the intersection between a line and a plane. @@ -551,7 +551,7 @@ int findVertexRefElement( arraySlice1d< localIndex const > const & nodeElements, arrayView1d< globalIndex const > const & elementGlobalIndex ) { localIndex minElement = -1; - globalIndex minElementGID = std::numeric_limits< globalIndex >::max(); + globalIndex minElementGID = LvArray::NumericLimits< globalIndex >::max; for( int i = 0; i < nodeElements.size(); i++ ) { localIndex e = nodeElements( i ); @@ -579,7 +579,7 @@ int findEdgeRefElement( arraySlice1d< localIndex const > const & nodeElements1, arrayView1d< globalIndex const > const & elementGlobalIndex ) { localIndex minElement = -1; - globalIndex minElementGID = std::numeric_limits< globalIndex >::max(); + globalIndex minElementGID = LvArray::NumericLimits< globalIndex >::max; for( int i = 0; i < nodeElements1.size(); i++ ) { localIndex e1 = nodeElements1( i ); @@ -616,7 +616,7 @@ int findTriangleRefElement( arraySlice1d< localIndex const > const & nodeElement arrayView1d< globalIndex const > const & elementGlobalIndex ) { localIndex minElement = -1; - globalIndex minElementGID = std::numeric_limits< globalIndex >::max(); + globalIndex minElementGID = LvArray::NumericLimits< globalIndex >::max; for( int i = 0; i < nodeElements1.size(); i++ ) { localIndex e1 = nodeElements1( i ); @@ -674,7 +674,7 @@ bool computeWindingNumber( localIndex element, // triangulate the face. The triangulation must be done in a consistent way across ranks. // This can be achieved by always picking the vertex with the lowest global index as root. localIndex const faceIndex = faceIndices[kf]; - globalIndex minGlobalId = std::numeric_limits< globalIndex >::max(); + globalIndex minGlobalId = LvArray::NumericLimits< globalIndex >::max; localIndex minVertex = -1; localIndex numFaceVertices = facesToNodes[faceIndex].size(); for( localIndex v = 0; v < numFaceVertices; v++ ) diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index b9bc68e85e3..387979f7a41 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -51,7 +51,7 @@ if( GEOS_ENABLE_WAVEPROPAGATION ) add_subdirectory( wavePropagation ) endif() -set( dependencyList ${parallelDeps} fileIO discretizationMethods events ) +set( dependencyList ${parallelDeps} fileIO discretizationMethods events linearAlgebra ) if( ENABLE_PYGEOSX ) list( APPEND physicsSolvers_headers diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index 084bd670f83..3eb04d7636b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -19,6 +19,7 @@ #include "CompositionalMultiphaseHybridFVM.hpp" +#include "mesh/DomainPartition.hpp" #include "constitutive/ConstitutivePassThru.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/relativePermeability/RelativePermeabilityBase.hpp" diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp index 16618193b6a..767a08fdd7e 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp @@ -21,6 +21,7 @@ #include "dataRepository/InputFlags.hpp" #include "mainInterface/GeosxState.hpp" +#include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "SeismicityRateKernels.hpp" diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp index c55602a67ef..f32f270e88e 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp @@ -22,6 +22,7 @@ #include "dataRepository/InputFlags.hpp" #include "mainInterface/GeosxState.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "mesh/DomainPartition.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp index 4b887570af9..7c0d4e1a6d4 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp @@ -17,6 +17,8 @@ * @file LaplaceFEM.cpp */ +#include "mesh/DomainPartition.hpp" + // Source includes #include "LaplaceFEM.hpp" #include "LaplaceFEMKernels.hpp" diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 441be568741..304d89a43e1 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -26,6 +26,7 @@ #include "fieldSpecification/FieldSpecificationManager.hpp" #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" +#include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp" #include "physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index da5199d7d9a..e3360243dc9 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -26,6 +26,7 @@ #include "fieldSpecification/PerfectlyMatchedLayer.hpp" #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" +#include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" #include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 4dabc899a92..26f30ddfbda 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -26,6 +26,7 @@ #include "fieldSpecification/PerfectlyMatchedLayer.hpp" #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" +#include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" #include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index e64bc4b6c12..e4ba67351ce 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -25,6 +25,7 @@ #include "fieldSpecification/FieldSpecificationManager.hpp" #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" +#include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp" #include "physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp index a76cb4ed6fe..fc07cd1151a 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp @@ -145,36 +145,39 @@ struct StressComputation { //Volume integral - m_finiteElement.template computeFirstOrderStiffnessTermX( q, xLocal, [&] ( int i, int j, real32 dfx1, real32 dfx2, real32 dfx3 ) + m_finiteElement.template computeFirstOrderStiffnessTermX( q, xLocal, [&] ( int const i, int const j, real32 const dfx1, real32 const dfx2, real32 const dfx3 ) { - auxx[j]+= dfx1*ux_np1[elemsToNodes[k][i]]; - auyy[j]+= dfx2*uy_np1[elemsToNodes[k][i]]; - auzz[j]+= dfx3*uz_np1[elemsToNodes[k][i]]; - auxy[j]+= dfx1*uy_np1[elemsToNodes[k][i]]+dfx2*ux_np1[elemsToNodes[k][i]]; - auxz[j]+= dfx1*uz_np1[elemsToNodes[k][i]]+dfx3*ux_np1[elemsToNodes[k][i]]; - auyz[j]+= dfx2*uz_np1[elemsToNodes[k][i]]+dfx3*uy_np1[elemsToNodes[k][i]]; + localIndex const nodeIndex = elemsToNodes[k][i]; + auxx[j] = auxx[j] + dfx1*ux_np1[nodeIndex]; + auyy[j] = auyy[j] + dfx2*uy_np1[nodeIndex]; + auzz[j] = auzz[j] + dfx3*uz_np1[nodeIndex]; + auxy[j] = auxy[j] + dfx1*uy_np1[nodeIndex]+dfx2*ux_np1[nodeIndex]; + auxz[j] = auxz[j] + dfx1*uz_np1[nodeIndex]+dfx3*ux_np1[nodeIndex]; + auyz[j] = auyz[j] + dfx2*uz_np1[nodeIndex]+dfx3*uy_np1[nodeIndex]; } ); - m_finiteElement.template computeFirstOrderStiffnessTermY( q, xLocal, [&] ( int i, int j, real32 dfy1, real32 dfy2, real32 dfy3 ) + m_finiteElement.template computeFirstOrderStiffnessTermY( q, xLocal, [&] ( int const i, int const j, real32 const dfy1, real32 const dfy2, real32 const dfy3 ) { - auxx[j]+= dfy1*ux_np1[elemsToNodes[k][i]]; - auyy[j]+= dfy2*uy_np1[elemsToNodes[k][i]]; - auzz[j]+= dfy3*uz_np1[elemsToNodes[k][i]]; - auxy[j]+= dfy1*uy_np1[elemsToNodes[k][i]]+dfy2*ux_np1[elemsToNodes[k][i]]; - auxz[j]+= dfy1*uz_np1[elemsToNodes[k][i]]+dfy3*ux_np1[elemsToNodes[k][i]]; - auyz[j]+= dfy2*uz_np1[elemsToNodes[k][i]]+dfy3*uy_np1[elemsToNodes[k][i]]; + localIndex const nodeIndex = elemsToNodes[k][i]; + auxx[j] = auxx[j] + dfy1*ux_np1[nodeIndex]; + auyy[j] = auyy[j] + dfy2*uy_np1[nodeIndex]; + auzz[j] = auzz[j] + dfy3*uz_np1[nodeIndex]; + auxy[j] = auxy[j] + dfy1*uy_np1[nodeIndex]+dfy2*ux_np1[nodeIndex]; + auxz[j] = auxz[j] + dfy1*uz_np1[nodeIndex]+dfy3*ux_np1[nodeIndex]; + auyz[j] = auyz[j] + dfy2*uz_np1[nodeIndex]+dfy3*uy_np1[nodeIndex]; } ); - m_finiteElement.template computeFirstOrderStiffnessTermZ( q, xLocal, [&] ( int i, int j, real32 dfz1, real32 dfz2, real32 dfz3 ) + m_finiteElement.template computeFirstOrderStiffnessTermZ( q, xLocal, [&] ( int const i, int const j, real32 const dfz1, real32 const dfz2, real32 const dfz3 ) { - auxx[j]+= dfz1*ux_np1[elemsToNodes[k][i]]; - auyy[j]+= dfz2*uy_np1[elemsToNodes[k][i]]; - auzz[j]+= dfz3*uz_np1[elemsToNodes[k][i]]; - auxy[j]+= dfz1*uy_np1[elemsToNodes[k][i]]+dfz2*ux_np1[elemsToNodes[k][i]]; - auxz[j]+= dfz1*uz_np1[elemsToNodes[k][i]]+dfz3*ux_np1[elemsToNodes[k][i]]; - auyz[j]+= dfz2*uz_np1[elemsToNodes[k][i]]+dfz3*uy_np1[elemsToNodes[k][i]]; + localIndex const nodeIndex = elemsToNodes[k][i]; + auxx[j] = auxx[j] + dfz1*ux_np1[nodeIndex]; + auyy[j] = auyy[j] + dfz2*uy_np1[nodeIndex]; + auzz[j] = auzz[j] + dfz3*uz_np1[nodeIndex]; + auxy[j] = auxy[j] + dfz1*uy_np1[nodeIndex]+dfz2*ux_np1[nodeIndex]; + auxz[j] = auxz[j] + dfz1*uz_np1[nodeIndex]+dfz3*ux_np1[nodeIndex]; + auyz[j] = auyz[j] + dfz2*uz_np1[nodeIndex]+dfz3*uy_np1[nodeIndex]; } ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 1e984673d0a..62f713d01ca 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -26,6 +26,7 @@ #include "finiteElement/FiniteElementDiscretization.hpp" #include "mainInterface/ProblemManager.hpp" #include "mesh/ElementType.hpp" +#include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp" #include "physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index 26f157062ec..d15555e75a9 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -27,6 +27,7 @@ #include "fieldSpecification/PerfectlyMatchedLayer.hpp" #include "mainInterface/ProblemManager.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "mesh/DomainPartition.hpp" #include "WaveSolverUtils.hpp" #include "events/EventManager.hpp" From 8100a32e82305b4381f6e4ccfbe7b9c06144a63d Mon Sep 17 00:00:00 2001 From: Algiane Froehly Date: Thu, 12 Sep 2024 21:15:05 +0200 Subject: [PATCH 193/286] ci: add the possitility to use other build generators than ninja inside the ci (#3276) * Add possibility to use other build generators than ninja in ci. --------- Co-authored-by: Gaetan Co-authored-by: Randolph Settgast --- .github/workflows/build_and_test.yml | 10 ++++++- .github/workflows/ci_tests.yml | 7 ++++- scripts/ci_build_and_test_in_container.sh | 33 +++++++++++++++-------- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 11d2761b90f..0f06044f92f 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -67,7 +67,11 @@ on: type: string LOCAL_BASELINE_DIR: required: false - type: string + type: string + BUILD_GENERATOR: + required: false + type: string + default: '--ninja' secrets: GOOGLE_CLOUD_GCP: required: false @@ -140,6 +144,10 @@ jobs: script_args+=(--nproc ${NPROC}) fi + if [[ -n "${{ inputs.BUILD_GENERATOR }}" ]]; then + script_args+=(${{ inputs.BUILD_GENERATOR }}) + fi + docker_args+=(${{ inputs.DOCKER_RUN_ARGS }}) COMMIT=${{ github.event.pull_request.head.sha }} diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index 6a97ca6b815..f7ce401bb4f 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -275,6 +275,7 @@ jobs: - name: Ubuntu CUDA debug (20.04, clang 10.0.0 + gcc 9.4.0, open-mpi 4.0.3, cuda-11.8.89) BUILD_AND_TEST_CLI_ARGS: "--build-exe-only --no-install-schema" CMAKE_BUILD_TYPE: Debug + BUILD_GENERATOR: "--ninja" DOCKER_REPOSITORY: geosx/ubuntu20.04-clang10.0.0-cuda11.8.89 ENABLE_HYPRE_DEVICE: CUDA ENABLE_HYPRE: ON @@ -288,6 +289,7 @@ jobs: - name: Ubuntu CUDA (20.04, clang 10.0.0 + gcc 9.4.0, open-mpi 4.0.3, cuda-11.8.89) BUILD_AND_TEST_CLI_ARGS: "--no-install-schema" CMAKE_BUILD_TYPE: Release + BUILD_GENERATOR: "--ninja" DOCKER_REPOSITORY: geosx/ubuntu20.04-clang10.0.0-cuda11.8.89 ENABLE_HYPRE_DEVICE: CUDA ENABLE_HYPRE: ON @@ -297,10 +299,11 @@ jobs: DOCKER_RUN_ARGS: "--cpus=8 --memory=256g --runtime=nvidia --gpus all -v /etc/pki/ca-trust/source/anchors/:/usr/local/share/ca-certificates/llnl:ro" DOCKER_CERTS_DIR: "/usr/local/share/ca-certificates" DOCKER_CERTS_UPDATE_COMMAND: "update-ca-certificates" - + - name: Rockylinux CUDA (8, clang 17.0.6, cuda 12.5.1) BUILD_AND_TEST_CLI_ARGS: "--no-install-schema" CMAKE_BUILD_TYPE: Release + BUILD_GENERATOR: "--ninja" ENABLE_HYPRE_DEVICE: CUDA ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF @@ -314,6 +317,7 @@ jobs: - name: Rockylinux CUDA (8, gcc 8.5, cuda 12.5.1) BUILD_AND_TEST_CLI_ARGS: "--no-run-unit-tests --no-install-schema" CMAKE_BUILD_TYPE: Release + BUILD_GENERATOR: "--ninja" ENABLE_HYPRE_DEVICE: CUDA ENABLE_HYPRE: ON ENABLE_TRILINOS: OFF @@ -330,6 +334,7 @@ jobs: with: BUILD_AND_TEST_CLI_ARGS: ${{ matrix.BUILD_AND_TEST_CLI_ARGS }} CMAKE_BUILD_TYPE: ${{ matrix.CMAKE_BUILD_TYPE }} + BUILD_GENERATOR: ${{ matrix.BUILD_GENERATOR }} DOCKER_CERTS_DIR: ${{ matrix.DOCKER_CERTS_DIR }} DOCKER_CERTS_UPDATE_COMMAND: ${{ matrix.DOCKER_CERTS_UPDATE_COMMAND }} DOCKER_IMAGE_TAG: ${{ needs.is_not_draft_pull_request.outputs.DOCKER_IMAGE_TAG }} diff --git a/scripts/ci_build_and_test_in_container.sh b/scripts/ci_build_and_test_in_container.sh index fbb33b328f9..23bff96bfa3 100755 --- a/scripts/ci_build_and_test_in_container.sh +++ b/scripts/ci_build_and_test_in_container.sh @@ -44,6 +44,10 @@ Usage: $0 The host-config. Path is relative to the root of the repository. --install-dir-basename GEOS-e42ffc1 GEOS installation basename. + --makefile + Use "Unix Makefiles" as build system generator. + --ninja + Use "Ninja" as build system generator. --no-install-schema Do not install the xsd schema. --no-run-unit-tests @@ -68,10 +72,11 @@ exit 1 or_die cd $(dirname $0)/.. # Parsing using getopt -args=$(or_die getopt -a -o h --long build-exe-only,cmake-build-type:,code-coverage,data-basename:,exchange-dir:,host-config:,install-dir-basename:,no-install-schema,no-run-unit-tests,nproc:,repository:,run-integrated-tests,sccache-credentials:,test-code-style,test-documentation,help -- "$@") +args=$(or_die getopt -a -o h --long build-exe-only,cmake-build-type:,code-coverage,data-basename:,exchange-dir:,host-config:,install-dir-basename:,makefile,ninja,no-install-schema,no-run-unit-tests,nproc:,repository:,run-integrated-tests,sccache-credentials:,test-code-style,test-documentation,help -- "$@") # Variables with default values BUILD_EXE_ONLY=false +BUILD_GENERATOR="" GEOS_INSTALL_SCHEMA=true HOST_CONFIG="host-configs/environment.cmake" RUN_UNIT_TESTS=true @@ -91,6 +96,9 @@ do RUN_UNIT_TESTS=false shift;; --cmake-build-type) CMAKE_BUILD_TYPE=$2; shift 2;; + --ninja) + BUILD_GENERATOR=$1; + shift;; --data-basename) DATA_BASENAME=$2 DATA_BASENAME_WE=${DATA_BASENAME%%.*} @@ -104,6 +112,7 @@ do --exchange-dir) DATA_EXCHANGE_DIR=$2; shift 2;; --host-config) HOST_CONFIG=$2; shift 2;; --install-dir-basename) GEOS_DIR=${GEOSX_TPL_DIR}/../$2; shift 2;; + --makefile) BUILD_GENERATOR=""; shift;; --no-install-schema) GEOS_INSTALL_SCHEMA=false; shift;; --no-run-unit-tests) RUN_UNIT_TESTS=false; shift;; --nproc) NPROC=$2; shift 2;; @@ -211,7 +220,7 @@ fi # The option `--oversubscribe` tells OpenMPI to allow more MPI ranks than the node has cores. # This is needed because our unit test `blt_mpi_smoke` is run in parallel with _hard coded_ 4 ranks. # While some of our ci nodes may have less cores available. -# +# # In case we have more powerful nodes, consider removing `--oversubscribe` and use `--use-hwthread-cpus` instead. # This will tells OpenMPI to discover the number of hardware threads on the node, # and use that as the number of slots available. (There is a distinction between threads and cores). @@ -221,7 +230,7 @@ or_die python3 scripts/config-build.py \ -bt ${CMAKE_BUILD_TYPE} \ -bp ${GEOS_BUILD_DIR} \ -ip ${GEOS_DIR} \ - --ninja \ + ${BUILD_GENERATOR} \ -DBLT_MPI_COMMAND_APPEND='"--allow-run-as-root;--oversubscribe"' \ -DGEOS_INSTALL_SCHEMA=${GEOS_INSTALL_SCHEMA} \ -DENABLE_COVERAGE=$([[ "${CODE_COVERAGE}" = true ]] && echo 1 || echo 0) \ @@ -245,10 +254,10 @@ fi # Performing the requested build. if [[ "${BUILD_EXE_ONLY}" = true ]]; then - or_die ninja -j $NPROC geosx + or_die cmake --build . -j $NPROC --target geosx else - or_die ninja -j $NPROC - or_die ninja install + or_die cmake --build . -j $NPROC + or_die cmake --install . if [[ ! -z "${DATA_BASENAME_WE}" ]]; then # Here we pack the installation. @@ -269,7 +278,7 @@ if [[ ! -z "${SCCACHE_CREDS}" ]]; then fi if [[ "${CODE_COVERAGE}" = true ]]; then - or_die ninja coreComponents_coverage + or_die cmake --build . --target coreComponents_coverage cp -r ${GEOS_BUILD_DIR}/coreComponents_coverage.info.cleaned ${GEOS_SRC_DIR}/geos_coverage.info.cleaned fi @@ -284,9 +293,11 @@ fi if [[ "${RUN_INTEGRATED_TESTS}" = true ]]; then # We split the process in two steps. First installing the environment, then running the tests. - or_die ninja ats_environment - - # The tests are not run using ninja (`ninja --verbose ats_run`) because it swallows the output while all the simulations are running. + or_die cmake --build . --target ats_environment + + # The tests are not run using cmake (`cmake --build . --verbose --target ats_run`) + # because with ninja it swallows the output while all the + # simulations are running. # We directly use the script instead... echo "Available baselines:" ls -lR /tmp/geos/baselines @@ -321,7 +332,7 @@ if [[ "${RUN_INTEGRATED_TESTS}" = true ]]; then fi # Cleaning the build directory. -or_die ninja clean +or_die cmake --build . --target clean # Clean the repository From 9d2dee85433d955016a641bd3a6239551e488df1 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Thu, 12 Sep 2024 17:38:29 -0700 Subject: [PATCH 194/286] fix: modify and reactivate SeismicityRate poroelastic integrated test. (#3318) * Modify and reactivate SeismicityRate integratedTest. * baseline notes. * Update .integrated_tests.yaml --------- Co-authored-by: Jian Huang <53012159+jhuang2601@users.noreply.github.com> Co-authored-by: Randolph Settgast --- .integrated_tests.yaml | 4 +- BASELINE_NOTES.md | 4 + .../SeismicityRate_poromechanics_1d_smoke.xml | 267 ------------------ .../SeismicityRate_poromechanics_base.xml | 169 +++++++++++ ...SeismicityRate_poromechanics_benchmark.xml | 25 ++ .../SeismicityRate_poromechanics_smoke.xml | 25 ++ .../inducedSeismicity/inducedSeismicity.ats | 8 +- .../inducedSeismicity/SeismicityRate.cpp | 13 +- .../inducedSeismicity/SeismicityRate.hpp | 8 +- .../SeismicityRateKernels.hpp | 15 +- 10 files changed, 248 insertions(+), 290 deletions(-) delete mode 100644 inputFiles/inducedSeismicity/SeismicityRate_poromechanics_1d_smoke.xml create mode 100644 inputFiles/inducedSeismicity/SeismicityRate_poromechanics_base.xml create mode 100644 inputFiles/inducedSeismicity/SeismicityRate_poromechanics_benchmark.xml create mode 100644 inputFiles/inducedSeismicity/SeismicityRate_poromechanics_smoke.xml diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index ba16ffbcbf8..85a23286bf6 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,7 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3322-7333-3b1cff1 + baseline: integratedTests/baseline_integratedTests-pr3318-7578-14f13e2 allow_fail: all: '' - streak: SeismicityRate_poromechanics_1d_smoke_01,SeismicityRate_poromechanics_1d_smoke_02 + streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index f0cf9fadf40..7c26b2ef528 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3318 (2024-09-12) +====================== +Modified SeismicityRate poroelastic case. + PR #3322 (2024-09-06) ====================== Print out fracture state for contact model. Rebaseline the corresponding cases. diff --git a/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_1d_smoke.xml b/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_1d_smoke.xml deleted file mode 100644 index dc6696b11b7..00000000000 --- a/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_1d_smoke.xml +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_base.xml b/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_base.xml new file mode 100644 index 00000000000..7c353e1c4b5 --- /dev/null +++ b/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_base.xml @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_benchmark.xml b/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_benchmark.xml new file mode 100644 index 00000000000..81c26f17495 --- /dev/null +++ b/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_benchmark.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + diff --git a/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_smoke.xml b/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_smoke.xml new file mode 100644 index 00000000000..21e07439132 --- /dev/null +++ b/inputFiles/inducedSeismicity/SeismicityRate_poromechanics_smoke.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + diff --git a/inputFiles/inducedSeismicity/inducedSeismicity.ats b/inputFiles/inducedSeismicity/inducedSeismicity.ats index ca310081883..58a28bf9c40 100644 --- a/inputFiles/inducedSeismicity/inducedSeismicity.ats +++ b/inputFiles/inducedSeismicity/inducedSeismicity.ats @@ -9,11 +9,11 @@ curvecheck_params["curves"] = "seismicityRate" decks = [ TestDeck( - name="SeismicityRate_poromechanics_1d_smoke", + name="SeismicityRate_poromechanics_smoke", description="", - partitions=((1, 1, 1), (2, 1, 1)), - restart_step=40, - check_step=90, + partitions=((1, 1, 1), (2, 2, 2)), + restart_step=20, + check_step=30, restartcheck_params=RestartcheckParameters(atol=1e-4, rtol=1e-3)), TestDeck( name="SeismicityRate_analytical_verification_smoke", diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp index 767a08fdd7e..c35871c173b 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp @@ -40,11 +40,11 @@ SeismicityRate::SeismicityRate( const string & name, { this->registerWrapper( viewKeyStruct::directEffectString(), &m_directEffect ). setInputFlag( InputFlags::REQUIRED ). - setDescription( "Rate-and-state friction direct effect parameter" ); + setDescription( "Rate-and-state friction direct effect parameter." ); this->registerWrapper( viewKeyStruct::backgroundStressingRateString(), &m_backgroundStressingRate ). setInputFlag( InputFlags::REQUIRED ). - setDescription( "Background stressing rate" ); + setDescription( "Background stressing rate (Pa/s)." ); this->registerWrapper( viewKeyStruct::stressSolverNameString(), &m_stressSolverName ). setInputFlag( InputFlags::OPTIONAL ). @@ -185,12 +185,12 @@ void SeismicityRate::updateFaultTraction( ElementSubRegionBase & subRegion ) con } } -void SeismicityRate::computeTotalStressOnFault( arrayView1d< real64 const > const biotCoefficient, - arrayView1d< real64 const > const pres, +void SeismicityRate::computeTotalStressOnFault( arrayView1d< real64 const > const & biotCoefficient, + arrayView1d< real64 const > const & pres, real64 const (&faultNormalProjectionTensor)[6], real64 const (&faultShearProjectionTensor)[6], - arrayView1d< real64 > const sig, - arrayView1d< real64 > const tau ) const + arrayView1d< real64 > const & sig, + arrayView1d< real64 > const & tau ) const { // To calculate the action of the total stress on the fault from our previous calculations, // we need to project the action of the pore pressure on the stress tensor onto the fault @@ -208,6 +208,7 @@ void SeismicityRate::computeTotalStressOnFault( arrayView1d< real64 const > cons sig[k] += pressureOnFaultNormal; tau[k] += pressureOnFaultShear; } ); + } void SeismicityRate::initializeFaultTraction( real64 const time_n, integer const cycleNumber, DomainPartition & domain ) const diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp index 30124cb34fa..f99582b6c12 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp @@ -98,12 +98,12 @@ class SeismicityRate : public SolverBase * @param sig * @param tau */ - void computeTotalStressOnFault( arrayView1d< real64 const > const biotCoefficient, - arrayView1d< real64 const > const pres, + void computeTotalStressOnFault( arrayView1d< real64 const > const & biotCoefficient, + arrayView1d< real64 const > const & pres, real64 const (&faultNormalProjectionTensor)[6], real64 const (&faultShearProjectionTensor)[6], - arrayView1d< real64 > const sig, - arrayView1d< real64 > const tau ) const; + arrayView1d< real64 > const & sig, + arrayView1d< real64 > const & tau ) const; /** * @brief called in SolverStep before member stress solver is called to diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp index 62344ce70e7..8bbb0f5865f 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp @@ -104,16 +104,17 @@ class SeismicityRateKernel { // arguments of stress exponential at current and previous time step - real64 const g = ( m_tau[k] + stack.backgroundStressingRateValue*(time_n+dt))/(stack.directEffectValue*stack.effectiveNormalTraction ) - - m_tau_0[k]/(stack.directEffectValue * stack.effectiveNormalTraction_0 ); + real64 const g = ( LvArray::math::abs( m_tau[k] ) + stack.backgroundStressingRateValue*(time_n+dt) ) / ( stack.directEffectValue*stack.effectiveNormalTraction ) - + LvArray::math::abs( m_tau_0[k] ) / (stack.directEffectValue * stack.effectiveNormalTraction_0 ); - real64 const g_n = ( m_tau_n[k] + stack.backgroundStressingRateValue*time_n)/(stack.directEffectValue*stack.effectiveNormalTraction_n ) - - m_tau_0[k]/(stack.directEffectValue*stack.effectiveNormalTraction_0); + real64 const g_n = ( LvArray::math::abs( m_tau_n[k] ) + stack.backgroundStressingRateValue*time_n ) / ( stack.directEffectValue*stack.effectiveNormalTraction_n ) - + LvArray::math::abs( m_tau_0[k] ) / (stack.directEffectValue*stack.effectiveNormalTraction_0); // Compute the difference of the log of the denominator of closed for integral solution. // This avoids directly computing the exponential of the current stress state which is more prone to overflow. - m_logDenom[k] += std::log( 1 + dt/(2*(stack.directEffectValue*stack.effectiveNormalTraction_0/stack.backgroundStressingRateValue)) - *(std::exp( g - m_logDenom[k] ) + std::exp( g_n - m_logDenom[k] ) )); + m_logDenom[k] += + LvArray::math::log( 1 + dt/(2*(stack.directEffectValue*stack.effectiveNormalTraction_0/stack.backgroundStressingRateValue) ) * + ( LvArray::math::exp( g - m_logDenom[k] ) + LvArray::math::exp( g_n - m_logDenom[k] ) )); // Convert log seismicity rate to raw value m_R[k] = LvArray::math::exp( g - m_logDenom[k] ); @@ -157,7 +158,7 @@ class SeismicityRateKernelPoroelastic : public SeismicityRateKernel { stack.effectiveNormalTraction_0 = -m_sigma_0[k] - m_pressure_0[k]; stack.effectiveNormalTraction_n = -m_sigma_n[k] - m_pressure_n[k]; - stack.effectiveNormalTraction = -m_sigma[k] - m_pressure[k]; + stack.effectiveNormalTraction = -m_sigma[k] - m_pressure[k]; } private: From 67b6cd592f680a2dedb8499982168551ee6752af Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Thu, 12 Sep 2024 14:42:49 -1000 Subject: [PATCH 195/286] docs: avoid offline documentation generation (#3350) * Change formats:all to formats:pdf --- .readthedocs.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index 215487bd2b5..c697f1f2f11 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -34,7 +34,8 @@ sphinx: # Optionally build your docs in additional formats such as PDF and ePub -formats: all +formats: + - pdf submodules: include: From dc604e5c16ea0c2909aafb6d9c86dc0c716e9a53 Mon Sep 17 00:00:00 2001 From: Christopher Sherman Date: Fri, 13 Sep 2024 10:43:57 -0700 Subject: [PATCH 196/286] docs: Generating sphinx datastructure tables on the fly (#3344) * Generating sphinx datastructure tables on the fly * Updating doc build instructions * add cmake dependency of geosx_docs on geosx_build_datastructure_tables * Using absolute paths for datastructure tables --------- Co-authored-by: Randolph Settgast --- .gitignore | 1 + .readthedocs.yml | 2 + scripts/SchemaToRSTDocumentation.py | 203 +- src/CMakeLists.txt | 7 +- .../constitutive/docs/BiotPorosity.rst | 2 +- .../constitutive/docs/BlackOilFluid.rst | 2 +- .../docs/BrooksCoreyCapillaryPressure.rst | 2 +- .../docs/BrooksCoreyRelativePermeability.rst | 2 +- .../constitutive/docs/CO2BrineFluid.rst | 2 +- .../docs/CompositionalMultiphaseFluid.rst | 2 +- .../docs/CompressibleSinglePhaseFluid.rst | 2 +- .../docs/ConstantPermeability.rst | 2 +- .../docs/ExponentialDecayPermeability.rst | 2 +- .../docs/KozenyCarmanPermeability.rst | 2 +- .../docs/ParallelPlatesPermeability.rst | 2 +- .../constitutive/docs/PressurePorosity.rst | 2 +- .../docs/SlipDependentPermeability.rst | 2 +- .../docs/TableCapillaryPressure.rst | 2 +- .../docs/TableRelativePermeability.rst | 2 +- ...reDependentSolidVolumetricHeatCapacity.rst | 2 +- ...emperatureDependentThermalConductivity.rst | 2 +- .../docs/ThreePhaseRelativePermeability.rst | 2 +- .../docs/VanGenuchtenCapillaryPressure.rst | 2 +- .../docs/WillisRichardsPermeability.rst | 2 +- .../constitutive/docs/solid/DruckerPrager.rst | 2 +- .../docs/solid/ElasticIsotropic.rst | 2 +- .../docs/solid/ElasticOrthotropic.rst | 2 +- .../docs/solid/ElasticTransverseIsotropic.rst | 2 +- .../constitutiveDrivers/docs/PVTDriver.rst | 2 +- .../docs/TriaxialDriver.rst | 2 +- .../docs/NumericalMethodsManager.rst | 2 +- .../events/docs/EventManager.rst | 8 +- .../events/docs/TasksManager.rst | 4 +- .../docs/AquiferBoundaryCondition.rst | 2 +- .../docs/EquilibriumInitialCondition.rst | 2 +- src/coreComponents/fileIO/doc/Outputs.rst | 6 +- .../functions/docs/FunctionManager.rst | 6 +- .../linearAlgebra/docs/LinearSolvers.rst | 2 +- src/coreComponents/mesh/docs/Mesh.rst | 2 +- .../physicsSolvers/SolutionStrategy.rst | 2 +- .../SolidMechanicsConformingFractures.rst | 4 +- .../docs/SolidMechanicsEmbeddedFractures.rst | 4 +- .../docs/CompositionalMultiphaseFlow.rst | 2 +- .../fluidFlow/docs/ProppantTransport.rst | 2 +- .../fluidFlow/docs/SinglePhaseFlow.rst | 2 +- .../docs/CompositionalMultiphaseWell.rst | 2 +- .../multiphysics/docs/Poromechanics.rst | 2 +- .../solidMechanics/docs/SolidMechanics.rst | 4 +- .../schema/docs/AcousticElasticSEM.rst | 19 - .../schema/docs/AcousticElasticSEM_other.rst | 13 - .../schema/docs/AcousticFirstOrderSEM.rst | 37 - .../docs/AcousticFirstOrderSEM_other.rst | 33 - .../schema/docs/AcousticSEM.rst | 37 - .../schema/docs/AcousticSEM_other.rst | 28 - .../schema/docs/AcousticVTISEM.rst | 37 - .../schema/docs/AcousticVTISEM_other.rst | 28 - src/coreComponents/schema/docs/Aquifer.rst | 38 - .../schema/docs/Aquifer_other.rst | 12 - src/coreComponents/schema/docs/Benchmarks.rst | 11 - .../schema/docs/Benchmarks_other.rst | 11 - .../schema/docs/BiotPorosity.rst | 13 - .../schema/docs/BiotPorosity_other.rst | 21 - .../schema/docs/BlackOilFluid.rst | 25 - .../schema/docs/BlackOilFluid_other.rst | 36 - src/coreComponents/schema/docs/Blueprint.rst | 13 - .../schema/docs/Blueprint_other.rst | 9 - src/coreComponents/schema/docs/Box.rst | 12 - src/coreComponents/schema/docs/Box_other.rst | 11 - .../BrooksCoreyBakerRelativePermeability.rst | 19 - ...ksCoreyBakerRelativePermeability_other.rst | 15 - .../docs/BrooksCoreyCapillaryPressure.rst | 14 - .../BrooksCoreyCapillaryPressure_other.rst | 13 - .../docs/BrooksCoreyRelativePermeability.rst | 13 - .../BrooksCoreyRelativePermeability_other.rst | 15 - .../BrooksCoreyStone2RelativePermeability.rst | 19 - ...sCoreyStone2RelativePermeability_other.rst | 15 - .../schema/docs/CO2BrineEzrokhiFluid.rst | 17 - .../docs/CO2BrineEzrokhiFluid_other.rst | 30 - .../docs/CO2BrineEzrokhiThermalFluid.rst | 17 - .../CO2BrineEzrokhiThermalFluid_other.rst | 30 - .../schema/docs/CO2BrinePhillipsFluid.rst | 17 - .../docs/CO2BrinePhillipsFluid_other.rst | 30 - .../docs/CO2BrinePhillipsThermalFluid.rst | 17 - .../CO2BrinePhillipsThermalFluid_other.rst | 30 - .../schema/docs/CarmanKozenyPermeability.rst | 12 - .../docs/CarmanKozenyPermeability_other.rst | 11 - .../schema/docs/CellElementRegion.rst | 13 - .../schema/docs/CellElementRegion_other.rst | 18 - .../schema/docs/CellToCellDataCollection.rst | 12 - .../docs/CellToCellDataCollection_other.rst | 12 - .../schema/docs/CeramicDamage.rst | 19 - .../schema/docs/CeramicDamage_other.rst | 17 - src/coreComponents/schema/docs/ChomboIO.rst | 16 - .../schema/docs/ChomboIO_other.rst | 9 - .../schema/docs/CompositeFunction.rst | 13 - .../schema/docs/CompositeFunction_other.rst | 9 - .../docs/CompositionalMultiphaseFVM.rst | 49 - .../docs/CompositionalMultiphaseFVM_other.rst | 13 - .../docs/CompositionalMultiphaseFluid.rst | 20 - .../CompositionalMultiphaseFluid_other.rst | 30 - .../docs/CompositionalMultiphaseHybridFVM.rst | 40 - ...CompositionalMultiphaseHybridFVM_other.rst | 15 - .../docs/CompositionalMultiphaseReservoir.rst | 18 - ...tionalMultiphaseReservoirPoromechanics.rst | 25 - ...seReservoirPoromechanicsInitialization.rst | 12 - ...rvoirPoromechanicsInitialization_other.rst | 9 - ...MultiphaseReservoirPoromechanics_other.rst | 15 - ...CompositionalMultiphaseReservoir_other.rst | 14 - .../CompositionalMultiphaseStatistics.rst | 15 - ...ompositionalMultiphaseStatistics_other.rst | 9 - .../docs/CompositionalMultiphaseWell.rst | 25 - .../CompositionalMultiphaseWell_other.rst | 15 - .../docs/CompositionalTwoPhaseFluid.rst | 23 - ...ositionalTwoPhaseFluidLohrenzBrayClark.rst | 26 - ...nalTwoPhaseFluidLohrenzBrayClark_other.rst | 31 - .../docs/CompositionalTwoPhaseFluid_other.rst | 31 - .../docs/CompressibleSinglePhaseFluid.rst | 24 - .../CompressibleSinglePhaseFluid_other.rst | 22 - ...pressibleSolidCarmanKozenyPermeability.rst | 13 - ...bleSolidCarmanKozenyPermeability_other.rst | 9 - .../CompressibleSolidConstantPermeability.rst | 13 - ...essibleSolidConstantPermeability_other.rst | 9 - ...sibleSolidExponentialDecayPermeability.rst | 13 - ...olidExponentialDecayPermeability_other.rst | 9 - ...essibleSolidParallelPlatesPermeability.rst | 13 - ...eSolidParallelPlatesPermeability_other.rst | 9 - .../CompressibleSolidPressurePermeability.rst | 13 - ...essibleSolidPressurePermeability_other.rst | 9 - ...ressibleSolidSlipDependentPermeability.rst | 13 - ...leSolidSlipDependentPermeability_other.rst | 9 - ...essibleSolidWillisRichardsPermeability.rst | 13 - ...eSolidWillisRichardsPermeability_other.rst | 9 - .../schema/docs/ConstantDiffusion.rst | 12 - .../schema/docs/ConstantDiffusion_other.rst | 11 - .../schema/docs/ConstantPermeability.rst | 10 - .../docs/ConstantPermeability_other.rst | 10 - .../schema/docs/Constitutive.rst | 92 - .../schema/docs/ConstitutiveModels_other.rst | 9 - .../schema/docs/Constitutive_other.rst | 92 - src/coreComponents/schema/docs/Coulomb.rst | 13 - .../schema/docs/Coulomb_other.rst | 9 - .../schema/docs/CustomPolarObject.rst | 15 - .../schema/docs/CustomPolarObject_other.rst | 9 - src/coreComponents/schema/docs/Cylinder.rst | 13 - .../schema/docs/Cylinder_other.rst | 9 - .../schema/docs/DamageElasticIsotropic.rst | 23 - .../docs/DamageElasticIsotropic_other.rst | 17 - .../docs/DamageSpectralElasticIsotropic.rst | 23 - .../DamageSpectralElasticIsotropic_other.rst | 17 - .../docs/DamageVolDevElasticIsotropic.rst | 23 - .../DamageVolDevElasticIsotropic_other.rst | 17 - .../schema/docs/DeadOilFluid.rst | 25 - .../schema/docs/DeadOilFluid_other.rst | 35 - src/coreComponents/schema/docs/DelftEgg.rst | 20 - .../schema/docs/DelftEgg_other.rst | 20 - src/coreComponents/schema/docs/Dirichlet.rst | 21 - .../schema/docs/Dirichlet_other.rst | 9 - src/coreComponents/schema/docs/Disc.rst | 15 - src/coreComponents/schema/docs/Disc_other.rst | 9 - .../schema/docs/DruckerPrager.rst | 19 - .../schema/docs/DruckerPrager_other.rst | 19 - .../schema/docs/ElasticFirstOrderSEM.rst | 37 - .../docs/ElasticFirstOrderSEM_other.rst | 38 - .../schema/docs/ElasticIsotropic.rst | 15 - .../ElasticIsotropicPressureDependent.rst | 15 - ...lasticIsotropicPressureDependent_other.rst | 16 - .../schema/docs/ElasticIsotropic_other.rst | 14 - .../schema/docs/ElasticOrthotropic.rst | 29 - .../schema/docs/ElasticOrthotropic_other.rst | 21 - src/coreComponents/schema/docs/ElasticSEM.rst | 40 - .../schema/docs/ElasticSEM_other.rst | 31 - .../docs/ElasticTransverseIsotropic.rst | 21 - .../docs/ElasticTransverseIsotropic_other.rst | 17 - .../schema/docs/ElementRegions.rst | 11 - .../schema/docs/ElementRegions_other.rst | 21 - .../schema/docs/EmbeddedSurfaceGenerator.rst | 20 - .../docs/EmbeddedSurfaceGenerator_other.rst | 14 - src/coreComponents/schema/docs/Events.rst | 16 - .../schema/docs/Events_other.rst | 15 - .../docs/ExponentialDecayPermeability.rst | 11 - .../ExponentialDecayPermeability_other.rst | 12 - .../schema/docs/ExtendedDruckerPrager.rst | 20 - .../docs/ExtendedDruckerPrager_other.rst | 21 - .../schema/docs/FieldSpecification.rst | 21 - .../schema/docs/FieldSpecification_other.rst | 9 - .../schema/docs/FieldSpecifications.rst | 15 - .../schema/docs/FieldSpecifications_other.rst | 15 - src/coreComponents/schema/docs/File.rst | 9 - src/coreComponents/schema/docs/File_other.rst | 9 - .../schema/docs/FiniteElementSpace.rst | 12 - .../schema/docs/FiniteElementSpace_other.rst | 9 - .../schema/docs/FiniteElements.rst | 11 - .../schema/docs/FiniteElements_other.rst | 11 - .../schema/docs/FiniteVolume.rst | 10 - .../schema/docs/FiniteVolume_other.rst | 10 - .../schema/docs/FlowProppantTransport.rst | 18 - .../docs/FlowProppantTransport_other.rst | 14 - .../schema/docs/FrictionlessContact.rst | 10 - .../schema/docs/FrictionlessContact_other.rst | 9 - src/coreComponents/schema/docs/Functions.rst | 12 - .../schema/docs/Functions_other.rst | 12 - src/coreComponents/schema/docs/Geometry.rst | 14 - .../schema/docs/Geometry_other.rst | 14 - src/coreComponents/schema/docs/HaltEvent.rst | 21 - .../schema/docs/HaltEvent_other.rst | 16 - .../docs/HybridMimeticDiscretization.rst | 10 - .../HybridMimeticDiscretization_other.rst | 9 - .../schema/docs/HydraulicApertureTable.rst | 12 - .../docs/HydraulicApertureTable_other.rst | 9 - .../schema/docs/Hydrofracture.rst | 31 - .../docs/HydrofractureInitialization.rst | 12 - .../HydrofractureInitialization_other.rst | 9 - .../schema/docs/Hydrofracture_other.rst | 15 - .../schema/docs/HydrostaticEquilibrium.rst | 26 - .../docs/HydrostaticEquilibrium_other.rst | 12 - src/coreComponents/schema/docs/Included.rst | 9 - .../schema/docs/Included_other.rst | 9 - .../schema/docs/InternalMesh.rst | 24 - .../schema/docs/InternalMesh_other.rst | 11 - .../schema/docs/InternalWell.rst | 19 - .../schema/docs/InternalWell_other.rst | 9 - .../schema/docs/InternalWellbore.rst | 30 - .../schema/docs/InternalWellbore_other.rst | 15 - .../docs/JFunctionCapillaryPressure.rst | 38 - .../docs/JFunctionCapillaryPressure_other.rst | 14 - src/coreComponents/schema/docs/LaplaceFEM.rst | 21 - .../schema/docs/LaplaceFEM_other.rst | 13 - .../schema/docs/Level0_other.rst | 16 - .../schema/docs/LinearIsotropicDispersion.rst | 10 - .../docs/LinearIsotropicDispersion_other.rst | 9 - .../schema/docs/LinearSolverParameters.rst | 43 - .../docs/LinearSolverParameters_other.rst | 9 - src/coreComponents/schema/docs/Mesh.rst | 12 - .../schema/docs/MeshBodies_other.rst | 12 - src/coreComponents/schema/docs/Mesh_other.rst | 12 - .../schema/docs/ModifiedCamClay.rst | 18 - .../schema/docs/ModifiedCamClay_other.rst | 20 - .../MultiPhaseConstantThermalConductivity.rst | 11 - ...PhaseConstantThermalConductivity_other.rst | 10 - ...PhaseVolumeWeightedThermalConductivity.rst | 12 - ...olumeWeightedThermalConductivity_other.rst | 11 - .../schema/docs/MultiphasePoromechanics.rst | 25 - .../MultiphasePoromechanicsInitialization.rst | 12 - ...phasePoromechanicsInitialization_other.rst | 9 - .../docs/MultiphasePoromechanicsReservoir.rst | 18 - ...MultiphasePoromechanicsReservoir_other.rst | 14 - .../docs/MultiphasePoromechanics_other.rst | 15 - .../docs/MultivariableTableFunction.rst | 10 - .../docs/MultivariableTableFunction_other.rst | 9 - .../schema/docs/NonlinearSolverParameters.rst | 47 - .../docs/NonlinearSolverParameters_other.rst | 12 - src/coreComponents/schema/docs/NullModel.rst | 9 - .../schema/docs/NullModel_other.rst | 9 - .../schema/docs/NumericalMethods.rst | 10 - .../schema/docs/NumericalMethods_other.rst | 10 - src/coreComponents/schema/docs/Outputs.rst | 15 - .../schema/docs/Outputs_other.rst | 15 - src/coreComponents/schema/docs/PML.rst | 26 - src/coreComponents/schema/docs/PML_other.rst | 10 - src/coreComponents/schema/docs/PVTDriver.rst | 20 - .../schema/docs/PVTDriver_other.rst | 9 - .../schema/docs/PackCollection.rst | 14 - .../schema/docs/PackCollection_other.rst | 9 - .../docs/ParallelPlatesPermeability.rst | 10 - .../docs/ParallelPlatesPermeability_other.rst | 11 - src/coreComponents/schema/docs/Parameter.rst | 10 - .../schema/docs/Parameter_other.rst | 9 - src/coreComponents/schema/docs/Parameters.rst | 9 - .../schema/docs/Parameters_other.rst | 9 - .../schema/docs/ParticleFluid.rst | 23 - .../schema/docs/ParticleFluid_other.rst | 15 - .../schema/docs/ParticleMesh.rst | 13 - .../schema/docs/ParticleMesh_other.rst | 9 - .../schema/docs/ParticleRegion.rst | 12 - .../schema/docs/ParticleRegion_other.rst | 18 - .../schema/docs/ParticleRegions.rst | 9 - .../schema/docs/ParticleRegions_other.rst | 19 - .../schema/docs/PerfectlyPlastic.rst | 16 - .../schema/docs/PerfectlyPlastic_other.rst | 15 - .../schema/docs/Perforation.rst | 12 - .../schema/docs/Perforation_other.rst | 9 - .../schema/docs/PeriodicEvent.rst | 28 - .../schema/docs/PeriodicEvent_other.rst | 16 - .../schema/docs/PhaseFieldDamageFEM.rst | 22 - .../schema/docs/PhaseFieldDamageFEM_other.rst | 13 - .../schema/docs/PhaseFieldFracture.rst | 18 - .../schema/docs/PhaseFieldFracture_other.rst | 14 - .../docs/PorousDamageElasticIsotropic.rst | 13 - .../PorousDamageElasticIsotropic_other.rst | 9 - .../PorousDamageSpectralElasticIsotropic.rst | 13 - ...usDamageSpectralElasticIsotropic_other.rst | 9 - .../PorousDamageVolDevElasticIsotropic.rst | 13 - ...rousDamageVolDevElasticIsotropic_other.rst | 9 - .../schema/docs/PorousDelftEgg.rst | 13 - .../schema/docs/PorousDelftEgg_other.rst | 9 - .../schema/docs/PorousDruckerPrager.rst | 13 - .../schema/docs/PorousDruckerPrager_other.rst | 9 - .../schema/docs/PorousElasticIsotropic.rst | 13 - .../docs/PorousElasticIsotropic_other.rst | 9 - .../schema/docs/PorousElasticOrthotropic.rst | 13 - .../docs/PorousElasticOrthotropic_other.rst | 9 - .../docs/PorousElasticTransverseIsotropic.rst | 13 - ...PorousElasticTransverseIsotropic_other.rst | 9 - .../docs/PorousExtendedDruckerPrager.rst | 13 - .../PorousExtendedDruckerPrager_other.rst | 9 - .../schema/docs/PorousModifiedCamClay.rst | 13 - .../docs/PorousModifiedCamClay_other.rst | 9 - .../schema/docs/PorousViscoDruckerPrager.rst | 13 - .../docs/PorousViscoDruckerPrager_other.rst | 9 - .../docs/PorousViscoExtendedDruckerPrager.rst | 13 - ...PorousViscoExtendedDruckerPrager_other.rst | 9 - .../docs/PorousViscoModifiedCamClay.rst | 13 - .../docs/PorousViscoModifiedCamClay_other.rst | 9 - .../schema/docs/PressurePermeability.rst | 14 - .../docs/PressurePermeability_other.rst | 11 - .../schema/docs/PressurePorosity.rst | 12 - .../schema/docs/PressurePorosity_other.rst | 14 - src/coreComponents/schema/docs/Problem.rst | 23 - .../schema/docs/Problem_other.rst | 25 - .../schema/docs/ProppantPermeability.rst | 11 - .../docs/ProppantPermeability_other.rst | 13 - .../schema/docs/ProppantPorosity.rst | 11 - .../schema/docs/ProppantPorosity_other.rst | 14 - .../schema/docs/ProppantSlurryFluid.rst | 21 - .../schema/docs/ProppantSlurryFluid_other.rst | 35 - .../ProppantSolidProppantPermeability.rst | 13 - ...roppantSolidProppantPermeability_other.rst | 9 - .../schema/docs/ProppantTransport.rst | 29 - .../schema/docs/ProppantTransport_other.rst | 13 - src/coreComponents/schema/docs/Python.rst | 11 - .../schema/docs/Python_other.rst | 9 - .../schema/docs/ReactiveBrine.rst | 14 - .../schema/docs/ReactiveBrineThermal.rst | 14 - .../docs/ReactiveBrineThermal_other.rst | 34 - .../schema/docs/ReactiveBrine_other.rst | 34 - .../ReactiveCompositionalMultiphaseOBL.rst | 32 - ...activeCompositionalMultiphaseOBL_other.rst | 13 - .../schema/docs/ReactiveFluidDriver.rst | 17 - .../schema/docs/ReactiveFluidDriver_other.rst | 9 - src/coreComponents/schema/docs/Rectangle.rst | 15 - .../schema/docs/Rectangle_other.rst | 9 - .../schema/docs/RelpermDriver.rst | 14 - .../schema/docs/RelpermDriver_other.rst | 9 - src/coreComponents/schema/docs/Restart.rst | 11 - .../schema/docs/Restart_other.rst | 9 - src/coreComponents/schema/docs/Run.rst | 18 - src/coreComponents/schema/docs/Run_other.rst | 9 - .../schema/docs/SeismicityRate.rst | 21 - .../schema/docs/SeismicityRate_other.rst | 14 - src/coreComponents/schema/docs/Silo.rst | 19 - src/coreComponents/schema/docs/Silo_other.rst | 9 - .../schema/docs/SinglePhaseFVM.rst | 27 - .../schema/docs/SinglePhaseFVM_other.rst | 13 - .../schema/docs/SinglePhaseHybridFVM.rst | 27 - .../docs/SinglePhaseHybridFVM_other.rst | 14 - .../schema/docs/SinglePhasePoromechanics.rst | 25 - ...ePhasePoromechanicsConformingFractures.rst | 25 - ...anicsConformingFracturesInitialization.rst | 12 - ...onformingFracturesInitialization_other.rst | 9 - ...omechanicsConformingFracturesReservoir.rst | 18 - ...nicsConformingFracturesReservoir_other.rst | 14 - ...PoromechanicsConformingFractures_other.rst | 15 - ...glePhasePoromechanicsEmbeddedFractures.rst | 25 - ...chanicsEmbeddedFracturesInitialization.rst | 12 - ...sEmbeddedFracturesInitialization_other.rst | 9 - ...sePoromechanicsEmbeddedFractures_other.rst | 15 - ...SinglePhasePoromechanicsInitialization.rst | 12 - ...PhasePoromechanicsInitialization_other.rst | 9 - .../SinglePhasePoromechanicsReservoir.rst | 18 - ...inglePhasePoromechanicsReservoir_other.rst | 14 - .../docs/SinglePhasePoromechanics_other.rst | 15 - .../schema/docs/SinglePhaseProppantFVM.rst | 27 - .../docs/SinglePhaseProppantFVM_other.rst | 13 - .../schema/docs/SinglePhaseReservoir.rst | 18 - .../SinglePhaseReservoirPoromechanics.rst | 25 - ...seReservoirPoromechanicsInitialization.rst | 12 - ...rvoirPoromechanicsInitialization_other.rst | 9 - ...inglePhaseReservoirPoromechanics_other.rst | 15 - .../docs/SinglePhaseReservoir_other.rst | 14 - .../schema/docs/SinglePhaseStatistics.rst | 12 - .../docs/SinglePhaseStatistics_other.rst | 9 - .../docs/SinglePhaseThermalConductivity.rst | 12 - .../SinglePhaseThermalConductivity_other.rst | 10 - .../schema/docs/SinglePhaseWell.rst | 18 - .../schema/docs/SinglePhaseWell_other.rst | 15 - .../schema/docs/SlipDependentPermeability.rst | 12 - .../docs/SlipDependentPermeability_other.rst | 11 - .../schema/docs/SolidInternalEnergy.rst | 13 - .../schema/docs/SolidInternalEnergy_other.rst | 11 - ...lidMechanicsAugmentedLagrangianContact.rst | 30 - ...hanicsAugmentedLagrangianContact_other.rst | 16 - .../docs/SolidMechanicsEmbeddedFractures.rst | 31 - .../SolidMechanicsEmbeddedFractures_other.rst | 16 - .../docs/SolidMechanicsLagrangeContact.rst | 32 - .../SolidMechanicsLagrangeContact_other.rst | 16 - .../docs/SolidMechanicsLagrangianSSLE.rst | 32 - .../SolidMechanicsLagrangianSSLE_other.rst | 14 - .../schema/docs/SolidMechanicsStateReset.rst | 13 - .../docs/SolidMechanicsStateReset_other.rst | 9 - .../schema/docs/SolidMechanicsStatistics.rst | 12 - .../docs/SolidMechanicsStatistics_other.rst | 9 - .../docs/SolidMechanics_LagrangianFEM.rst | 32 - .../SolidMechanics_LagrangianFEM_other.rst | 14 - .../schema/docs/SolidMechanics_MPM.rst | 42 - .../schema/docs/SolidMechanics_MPM_other.rst | 34 - src/coreComponents/schema/docs/SoloEvent.rst | 23 - .../schema/docs/SoloEvent_other.rst | 16 - .../schema/docs/SolverStatistics_other.rst | 16 - src/coreComponents/schema/docs/Solvers.rst | 49 - .../schema/docs/Solvers_other.rst | 48 - src/coreComponents/schema/docs/SourceFlux.rst | 20 - .../schema/docs/SourceFluxStatistics.rst | 16 - .../docs/SourceFluxStatistics_other.rst | 9 - .../schema/docs/SourceFlux_other.rst | 9 - .../schema/docs/SurfaceElementRegion.rst | 14 - .../docs/SurfaceElementRegion_other.rst | 18 - .../schema/docs/SurfaceGenerator.rst | 21 - .../schema/docs/SurfaceGenerator_other.rst | 19 - .../schema/docs/SymbolicFunction.rst | 12 - .../schema/docs/SymbolicFunction_other.rst | 9 - .../schema/docs/TableCapillaryPressure.rst | 19 - .../docs/TableCapillaryPressure_other.rst | 13 - .../schema/docs/TableFunction.rst | 19 - .../schema/docs/TableFunction_other.rst | 9 - .../schema/docs/TableRelativePermeability.rst | 25 - .../TableRelativePermeabilityHysteresis.rst | 32 - ...leRelativePermeabilityHysteresis_other.rst | 27 - .../docs/TableRelativePermeability_other.rst | 17 - src/coreComponents/schema/docs/Tasks.rst | 26 - .../schema/docs/Tasks_other.rst | 26 - .../ThermalCompressibleSinglePhaseFluid.rst | 32 - ...rmalCompressibleSinglePhaseFluid_other.rst | 22 - src/coreComponents/schema/docs/ThickPlane.rst | 12 - .../schema/docs/ThickPlane_other.rst | 9 - .../schema/docs/TimeHistory.rst | 15 - .../schema/docs/TimeHistory_other.rst | 9 - src/coreComponents/schema/docs/Traction.rst | 24 - .../schema/docs/Traction_other.rst | 10 - .../schema/docs/TriaxialDriver.rst | 18 - .../schema/docs/TriaxialDriver_other.rst | 9 - .../schema/docs/TwoPointFluxApproximation.rst | 16 - .../docs/TwoPointFluxApproximation_other.rst | 15 - src/coreComponents/schema/docs/VTK.rst | 22 - src/coreComponents/schema/docs/VTKMesh.rst | 26 - .../schema/docs/VTKMesh_other.rst | 11 - src/coreComponents/schema/docs/VTKWell.rst | 17 - .../schema/docs/VTKWell_other.rst | 9 - src/coreComponents/schema/docs/VTK_other.rst | 9 - .../VanGenuchtenBakerRelativePermeability.rst | 19 - ...nuchtenBakerRelativePermeability_other.rst | 15 - .../docs/VanGenuchtenCapillaryPressure.rst | 14 - .../VanGenuchtenCapillaryPressure_other.rst | 13 - ...VanGenuchtenStone2RelativePermeability.rst | 19 - ...uchtenStone2RelativePermeability_other.rst | 15 - .../schema/docs/ViscoDruckerPrager.rst | 20 - .../schema/docs/ViscoDruckerPrager_other.rst | 19 - .../docs/ViscoExtendedDruckerPrager.rst | 21 - .../docs/ViscoExtendedDruckerPrager_other.rst | 21 - .../schema/docs/ViscoModifiedCamClay.rst | 19 - .../docs/ViscoModifiedCamClay_other.rst | 20 - .../schema/docs/WellControls.rst | 43 - .../schema/docs/WellControls_other.rst | 9 - .../schema/docs/WellElementRegion.rst | 11 - ...WellElementRegionUniqueSubRegion_other.rst | 31 - .../schema/docs/WellElementRegion_other.rst | 20 - .../docs/WillisRichardsPermeability.rst | 12 - .../docs/WillisRichardsPermeability_other.rst | 12 - .../schema/docs/commandLine_other.rst | 20 - src/coreComponents/schema/docs/crusher.rst | 9 - .../schema/docs/crusher_other.rst | 9 - .../schema/docs/domain_other.rst | 12 - .../schema/docs/edgeManager_other.rst | 19 - .../schema/docs/elementRegionsGroup_other.rst | 9 - .../schema/docs/elementSubRegions_other.rst | 9 - .../embeddedSurfacesEdgeManager_other.rst | 19 - .../embeddedSurfacesNodeManager_other.rst | 24 - .../schema/docs/faceManager_other.rst | 27 - src/coreComponents/schema/docs/lassen.rst | 9 - .../schema/docs/lassen_other.rst | 9 - .../schema/docs/meshLevels_other.rst | 9 - .../schema/docs/neighborData_other.rst | 9 - .../schema/docs/nodeManager_other.rst | 24 - .../docs/particleRegionsGroup_other.rst | 9 - .../schema/docs/particleSubRegions_other.rst | 9 - src/coreComponents/schema/docs/quartz.rst | 9 - .../schema/docs/quartz_other.rst | 9 - src/coreComponents/schema/docs/sets_other.rst | 9 - .../docs/wellElementSubRegion_other.rst | 25 - src/docs/sphinx/CompleteXMLSchema.rst | 3094 ----------------- .../wellboreProblems/mccWellbore/Example.rst | 2 +- .../developerGuide/Contributing/Sphinx.rst | 2 +- src/index.rst | 2 +- 492 files changed, 161 insertions(+), 10664 deletions(-) delete mode 100644 src/coreComponents/schema/docs/AcousticElasticSEM.rst delete mode 100644 src/coreComponents/schema/docs/AcousticElasticSEM_other.rst delete mode 100644 src/coreComponents/schema/docs/AcousticFirstOrderSEM.rst delete mode 100644 src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst delete mode 100644 src/coreComponents/schema/docs/AcousticSEM.rst delete mode 100644 src/coreComponents/schema/docs/AcousticSEM_other.rst delete mode 100644 src/coreComponents/schema/docs/AcousticVTISEM.rst delete mode 100644 src/coreComponents/schema/docs/AcousticVTISEM_other.rst delete mode 100644 src/coreComponents/schema/docs/Aquifer.rst delete mode 100644 src/coreComponents/schema/docs/Aquifer_other.rst delete mode 100644 src/coreComponents/schema/docs/Benchmarks.rst delete mode 100644 src/coreComponents/schema/docs/Benchmarks_other.rst delete mode 100644 src/coreComponents/schema/docs/BiotPorosity.rst delete mode 100644 src/coreComponents/schema/docs/BiotPorosity_other.rst delete mode 100644 src/coreComponents/schema/docs/BlackOilFluid.rst delete mode 100644 src/coreComponents/schema/docs/BlackOilFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/Blueprint.rst delete mode 100644 src/coreComponents/schema/docs/Blueprint_other.rst delete mode 100644 src/coreComponents/schema/docs/Box.rst delete mode 100644 src/coreComponents/schema/docs/Box_other.rst delete mode 100644 src/coreComponents/schema/docs/BrooksCoreyBakerRelativePermeability.rst delete mode 100644 src/coreComponents/schema/docs/BrooksCoreyBakerRelativePermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/BrooksCoreyCapillaryPressure.rst delete mode 100644 src/coreComponents/schema/docs/BrooksCoreyCapillaryPressure_other.rst delete mode 100644 src/coreComponents/schema/docs/BrooksCoreyRelativePermeability.rst delete mode 100644 src/coreComponents/schema/docs/BrooksCoreyRelativePermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/BrooksCoreyStone2RelativePermeability.rst delete mode 100644 src/coreComponents/schema/docs/BrooksCoreyStone2RelativePermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/CO2BrineEzrokhiFluid.rst delete mode 100644 src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid.rst delete mode 100644 src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/CO2BrinePhillipsFluid.rst delete mode 100644 src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid.rst delete mode 100644 src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/CarmanKozenyPermeability.rst delete mode 100644 src/coreComponents/schema/docs/CarmanKozenyPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/CellElementRegion.rst delete mode 100644 src/coreComponents/schema/docs/CellElementRegion_other.rst delete mode 100644 src/coreComponents/schema/docs/CellToCellDataCollection.rst delete mode 100644 src/coreComponents/schema/docs/CellToCellDataCollection_other.rst delete mode 100644 src/coreComponents/schema/docs/CeramicDamage.rst delete mode 100644 src/coreComponents/schema/docs/CeramicDamage_other.rst delete mode 100644 src/coreComponents/schema/docs/ChomboIO.rst delete mode 100644 src/coreComponents/schema/docs/ChomboIO_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositeFunction.rst delete mode 100644 src/coreComponents/schema/docs/CompositeFunction_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseReservoir.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseStatistics.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseStatistics_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark_other.rst delete mode 100644 src/coreComponents/schema/docs/CompositionalTwoPhaseFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSinglePhaseFluid.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSinglePhaseFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidCarmanKozenyPermeability.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidCarmanKozenyPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidConstantPermeability.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidConstantPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidExponentialDecayPermeability.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidExponentialDecayPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidSlipDependentPermeability.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidSlipDependentPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidWillisRichardsPermeability.rst delete mode 100644 src/coreComponents/schema/docs/CompressibleSolidWillisRichardsPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/ConstantDiffusion.rst delete mode 100644 src/coreComponents/schema/docs/ConstantDiffusion_other.rst delete mode 100644 src/coreComponents/schema/docs/ConstantPermeability.rst delete mode 100644 src/coreComponents/schema/docs/ConstantPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/Constitutive.rst delete mode 100644 src/coreComponents/schema/docs/ConstitutiveModels_other.rst delete mode 100644 src/coreComponents/schema/docs/Constitutive_other.rst delete mode 100644 src/coreComponents/schema/docs/Coulomb.rst delete mode 100644 src/coreComponents/schema/docs/Coulomb_other.rst delete mode 100644 src/coreComponents/schema/docs/CustomPolarObject.rst delete mode 100644 src/coreComponents/schema/docs/CustomPolarObject_other.rst delete mode 100644 src/coreComponents/schema/docs/Cylinder.rst delete mode 100644 src/coreComponents/schema/docs/Cylinder_other.rst delete mode 100644 src/coreComponents/schema/docs/DamageElasticIsotropic.rst delete mode 100644 src/coreComponents/schema/docs/DamageElasticIsotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/DamageSpectralElasticIsotropic.rst delete mode 100644 src/coreComponents/schema/docs/DamageSpectralElasticIsotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/DamageVolDevElasticIsotropic.rst delete mode 100644 src/coreComponents/schema/docs/DamageVolDevElasticIsotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/DeadOilFluid.rst delete mode 100644 src/coreComponents/schema/docs/DeadOilFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/DelftEgg.rst delete mode 100644 src/coreComponents/schema/docs/DelftEgg_other.rst delete mode 100644 src/coreComponents/schema/docs/Dirichlet.rst delete mode 100644 src/coreComponents/schema/docs/Dirichlet_other.rst delete mode 100644 src/coreComponents/schema/docs/Disc.rst delete mode 100644 src/coreComponents/schema/docs/Disc_other.rst delete mode 100644 src/coreComponents/schema/docs/DruckerPrager.rst delete mode 100644 src/coreComponents/schema/docs/DruckerPrager_other.rst delete mode 100644 src/coreComponents/schema/docs/ElasticFirstOrderSEM.rst delete mode 100644 src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst delete mode 100644 src/coreComponents/schema/docs/ElasticIsotropic.rst delete mode 100644 src/coreComponents/schema/docs/ElasticIsotropicPressureDependent.rst delete mode 100644 src/coreComponents/schema/docs/ElasticIsotropicPressureDependent_other.rst delete mode 100644 src/coreComponents/schema/docs/ElasticIsotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/ElasticOrthotropic.rst delete mode 100644 src/coreComponents/schema/docs/ElasticOrthotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/ElasticSEM.rst delete mode 100644 src/coreComponents/schema/docs/ElasticSEM_other.rst delete mode 100644 src/coreComponents/schema/docs/ElasticTransverseIsotropic.rst delete mode 100644 src/coreComponents/schema/docs/ElasticTransverseIsotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/ElementRegions.rst delete mode 100644 src/coreComponents/schema/docs/ElementRegions_other.rst delete mode 100644 src/coreComponents/schema/docs/EmbeddedSurfaceGenerator.rst delete mode 100644 src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst delete mode 100644 src/coreComponents/schema/docs/Events.rst delete mode 100644 src/coreComponents/schema/docs/Events_other.rst delete mode 100644 src/coreComponents/schema/docs/ExponentialDecayPermeability.rst delete mode 100644 src/coreComponents/schema/docs/ExponentialDecayPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/ExtendedDruckerPrager.rst delete mode 100644 src/coreComponents/schema/docs/ExtendedDruckerPrager_other.rst delete mode 100644 src/coreComponents/schema/docs/FieldSpecification.rst delete mode 100644 src/coreComponents/schema/docs/FieldSpecification_other.rst delete mode 100644 src/coreComponents/schema/docs/FieldSpecifications.rst delete mode 100644 src/coreComponents/schema/docs/FieldSpecifications_other.rst delete mode 100644 src/coreComponents/schema/docs/File.rst delete mode 100644 src/coreComponents/schema/docs/File_other.rst delete mode 100644 src/coreComponents/schema/docs/FiniteElementSpace.rst delete mode 100644 src/coreComponents/schema/docs/FiniteElementSpace_other.rst delete mode 100644 src/coreComponents/schema/docs/FiniteElements.rst delete mode 100644 src/coreComponents/schema/docs/FiniteElements_other.rst delete mode 100644 src/coreComponents/schema/docs/FiniteVolume.rst delete mode 100644 src/coreComponents/schema/docs/FiniteVolume_other.rst delete mode 100644 src/coreComponents/schema/docs/FlowProppantTransport.rst delete mode 100644 src/coreComponents/schema/docs/FlowProppantTransport_other.rst delete mode 100644 src/coreComponents/schema/docs/FrictionlessContact.rst delete mode 100644 src/coreComponents/schema/docs/FrictionlessContact_other.rst delete mode 100644 src/coreComponents/schema/docs/Functions.rst delete mode 100644 src/coreComponents/schema/docs/Functions_other.rst delete mode 100644 src/coreComponents/schema/docs/Geometry.rst delete mode 100644 src/coreComponents/schema/docs/Geometry_other.rst delete mode 100644 src/coreComponents/schema/docs/HaltEvent.rst delete mode 100644 src/coreComponents/schema/docs/HaltEvent_other.rst delete mode 100644 src/coreComponents/schema/docs/HybridMimeticDiscretization.rst delete mode 100644 src/coreComponents/schema/docs/HybridMimeticDiscretization_other.rst delete mode 100644 src/coreComponents/schema/docs/HydraulicApertureTable.rst delete mode 100644 src/coreComponents/schema/docs/HydraulicApertureTable_other.rst delete mode 100644 src/coreComponents/schema/docs/Hydrofracture.rst delete mode 100644 src/coreComponents/schema/docs/HydrofractureInitialization.rst delete mode 100644 src/coreComponents/schema/docs/HydrofractureInitialization_other.rst delete mode 100644 src/coreComponents/schema/docs/Hydrofracture_other.rst delete mode 100644 src/coreComponents/schema/docs/HydrostaticEquilibrium.rst delete mode 100644 src/coreComponents/schema/docs/HydrostaticEquilibrium_other.rst delete mode 100644 src/coreComponents/schema/docs/Included.rst delete mode 100644 src/coreComponents/schema/docs/Included_other.rst delete mode 100644 src/coreComponents/schema/docs/InternalMesh.rst delete mode 100644 src/coreComponents/schema/docs/InternalMesh_other.rst delete mode 100644 src/coreComponents/schema/docs/InternalWell.rst delete mode 100644 src/coreComponents/schema/docs/InternalWell_other.rst delete mode 100644 src/coreComponents/schema/docs/InternalWellbore.rst delete mode 100644 src/coreComponents/schema/docs/InternalWellbore_other.rst delete mode 100644 src/coreComponents/schema/docs/JFunctionCapillaryPressure.rst delete mode 100644 src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst delete mode 100644 src/coreComponents/schema/docs/LaplaceFEM.rst delete mode 100644 src/coreComponents/schema/docs/LaplaceFEM_other.rst delete mode 100644 src/coreComponents/schema/docs/Level0_other.rst delete mode 100644 src/coreComponents/schema/docs/LinearIsotropicDispersion.rst delete mode 100644 src/coreComponents/schema/docs/LinearIsotropicDispersion_other.rst delete mode 100644 src/coreComponents/schema/docs/LinearSolverParameters.rst delete mode 100644 src/coreComponents/schema/docs/LinearSolverParameters_other.rst delete mode 100644 src/coreComponents/schema/docs/Mesh.rst delete mode 100644 src/coreComponents/schema/docs/MeshBodies_other.rst delete mode 100644 src/coreComponents/schema/docs/Mesh_other.rst delete mode 100644 src/coreComponents/schema/docs/ModifiedCamClay.rst delete mode 100644 src/coreComponents/schema/docs/ModifiedCamClay_other.rst delete mode 100644 src/coreComponents/schema/docs/MultiPhaseConstantThermalConductivity.rst delete mode 100644 src/coreComponents/schema/docs/MultiPhaseConstantThermalConductivity_other.rst delete mode 100644 src/coreComponents/schema/docs/MultiPhaseVolumeWeightedThermalConductivity.rst delete mode 100644 src/coreComponents/schema/docs/MultiPhaseVolumeWeightedThermalConductivity_other.rst delete mode 100644 src/coreComponents/schema/docs/MultiphasePoromechanics.rst delete mode 100644 src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst delete mode 100644 src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization_other.rst delete mode 100644 src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir.rst delete mode 100644 src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst delete mode 100644 src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst delete mode 100644 src/coreComponents/schema/docs/MultivariableTableFunction.rst delete mode 100644 src/coreComponents/schema/docs/MultivariableTableFunction_other.rst delete mode 100644 src/coreComponents/schema/docs/NonlinearSolverParameters.rst delete mode 100644 src/coreComponents/schema/docs/NonlinearSolverParameters_other.rst delete mode 100644 src/coreComponents/schema/docs/NullModel.rst delete mode 100644 src/coreComponents/schema/docs/NullModel_other.rst delete mode 100644 src/coreComponents/schema/docs/NumericalMethods.rst delete mode 100644 src/coreComponents/schema/docs/NumericalMethods_other.rst delete mode 100644 src/coreComponents/schema/docs/Outputs.rst delete mode 100644 src/coreComponents/schema/docs/Outputs_other.rst delete mode 100644 src/coreComponents/schema/docs/PML.rst delete mode 100644 src/coreComponents/schema/docs/PML_other.rst delete mode 100644 src/coreComponents/schema/docs/PVTDriver.rst delete mode 100644 src/coreComponents/schema/docs/PVTDriver_other.rst delete mode 100644 src/coreComponents/schema/docs/PackCollection.rst delete mode 100644 src/coreComponents/schema/docs/PackCollection_other.rst delete mode 100644 src/coreComponents/schema/docs/ParallelPlatesPermeability.rst delete mode 100644 src/coreComponents/schema/docs/ParallelPlatesPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/Parameter.rst delete mode 100644 src/coreComponents/schema/docs/Parameter_other.rst delete mode 100644 src/coreComponents/schema/docs/Parameters.rst delete mode 100644 src/coreComponents/schema/docs/Parameters_other.rst delete mode 100644 src/coreComponents/schema/docs/ParticleFluid.rst delete mode 100644 src/coreComponents/schema/docs/ParticleFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/ParticleMesh.rst delete mode 100644 src/coreComponents/schema/docs/ParticleMesh_other.rst delete mode 100644 src/coreComponents/schema/docs/ParticleRegion.rst delete mode 100644 src/coreComponents/schema/docs/ParticleRegion_other.rst delete mode 100644 src/coreComponents/schema/docs/ParticleRegions.rst delete mode 100644 src/coreComponents/schema/docs/ParticleRegions_other.rst delete mode 100644 src/coreComponents/schema/docs/PerfectlyPlastic.rst delete mode 100644 src/coreComponents/schema/docs/PerfectlyPlastic_other.rst delete mode 100644 src/coreComponents/schema/docs/Perforation.rst delete mode 100644 src/coreComponents/schema/docs/Perforation_other.rst delete mode 100644 src/coreComponents/schema/docs/PeriodicEvent.rst delete mode 100644 src/coreComponents/schema/docs/PeriodicEvent_other.rst delete mode 100644 src/coreComponents/schema/docs/PhaseFieldDamageFEM.rst delete mode 100644 src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst delete mode 100644 src/coreComponents/schema/docs/PhaseFieldFracture.rst delete mode 100644 src/coreComponents/schema/docs/PhaseFieldFracture_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousDamageElasticIsotropic.rst delete mode 100644 src/coreComponents/schema/docs/PorousDamageElasticIsotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousDamageSpectralElasticIsotropic.rst delete mode 100644 src/coreComponents/schema/docs/PorousDamageSpectralElasticIsotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousDamageVolDevElasticIsotropic.rst delete mode 100644 src/coreComponents/schema/docs/PorousDamageVolDevElasticIsotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousDelftEgg.rst delete mode 100644 src/coreComponents/schema/docs/PorousDelftEgg_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousDruckerPrager.rst delete mode 100644 src/coreComponents/schema/docs/PorousDruckerPrager_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousElasticIsotropic.rst delete mode 100644 src/coreComponents/schema/docs/PorousElasticIsotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousElasticOrthotropic.rst delete mode 100644 src/coreComponents/schema/docs/PorousElasticOrthotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousElasticTransverseIsotropic.rst delete mode 100644 src/coreComponents/schema/docs/PorousElasticTransverseIsotropic_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousExtendedDruckerPrager.rst delete mode 100644 src/coreComponents/schema/docs/PorousExtendedDruckerPrager_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousModifiedCamClay.rst delete mode 100644 src/coreComponents/schema/docs/PorousModifiedCamClay_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousViscoDruckerPrager.rst delete mode 100644 src/coreComponents/schema/docs/PorousViscoDruckerPrager_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousViscoExtendedDruckerPrager.rst delete mode 100644 src/coreComponents/schema/docs/PorousViscoExtendedDruckerPrager_other.rst delete mode 100644 src/coreComponents/schema/docs/PorousViscoModifiedCamClay.rst delete mode 100644 src/coreComponents/schema/docs/PorousViscoModifiedCamClay_other.rst delete mode 100644 src/coreComponents/schema/docs/PressurePermeability.rst delete mode 100644 src/coreComponents/schema/docs/PressurePermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/PressurePorosity.rst delete mode 100644 src/coreComponents/schema/docs/PressurePorosity_other.rst delete mode 100644 src/coreComponents/schema/docs/Problem.rst delete mode 100644 src/coreComponents/schema/docs/Problem_other.rst delete mode 100644 src/coreComponents/schema/docs/ProppantPermeability.rst delete mode 100644 src/coreComponents/schema/docs/ProppantPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/ProppantPorosity.rst delete mode 100644 src/coreComponents/schema/docs/ProppantPorosity_other.rst delete mode 100644 src/coreComponents/schema/docs/ProppantSlurryFluid.rst delete mode 100644 src/coreComponents/schema/docs/ProppantSlurryFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/ProppantSolidProppantPermeability.rst delete mode 100644 src/coreComponents/schema/docs/ProppantSolidProppantPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/ProppantTransport.rst delete mode 100644 src/coreComponents/schema/docs/ProppantTransport_other.rst delete mode 100644 src/coreComponents/schema/docs/Python.rst delete mode 100644 src/coreComponents/schema/docs/Python_other.rst delete mode 100644 src/coreComponents/schema/docs/ReactiveBrine.rst delete mode 100644 src/coreComponents/schema/docs/ReactiveBrineThermal.rst delete mode 100644 src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst delete mode 100644 src/coreComponents/schema/docs/ReactiveBrine_other.rst delete mode 100644 src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL.rst delete mode 100644 src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst delete mode 100644 src/coreComponents/schema/docs/ReactiveFluidDriver.rst delete mode 100644 src/coreComponents/schema/docs/ReactiveFluidDriver_other.rst delete mode 100644 src/coreComponents/schema/docs/Rectangle.rst delete mode 100644 src/coreComponents/schema/docs/Rectangle_other.rst delete mode 100644 src/coreComponents/schema/docs/RelpermDriver.rst delete mode 100644 src/coreComponents/schema/docs/RelpermDriver_other.rst delete mode 100644 src/coreComponents/schema/docs/Restart.rst delete mode 100644 src/coreComponents/schema/docs/Restart_other.rst delete mode 100644 src/coreComponents/schema/docs/Run.rst delete mode 100644 src/coreComponents/schema/docs/Run_other.rst delete mode 100644 src/coreComponents/schema/docs/SeismicityRate.rst delete mode 100644 src/coreComponents/schema/docs/SeismicityRate_other.rst delete mode 100644 src/coreComponents/schema/docs/Silo.rst delete mode 100644 src/coreComponents/schema/docs/Silo_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseFVM.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseFVM_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanics.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseReservoir.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseStatistics.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseStatistics_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseThermalConductivity.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseThermalConductivity_other.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseWell.rst delete mode 100644 src/coreComponents/schema/docs/SinglePhaseWell_other.rst delete mode 100644 src/coreComponents/schema/docs/SlipDependentPermeability.rst delete mode 100644 src/coreComponents/schema/docs/SlipDependentPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/SolidInternalEnergy.rst delete mode 100644 src/coreComponents/schema/docs/SolidInternalEnergy_other.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact_other.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsStateReset.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsStateReset_other.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsStatistics.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanicsStatistics_other.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanics_MPM.rst delete mode 100644 src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst delete mode 100644 src/coreComponents/schema/docs/SoloEvent.rst delete mode 100644 src/coreComponents/schema/docs/SoloEvent_other.rst delete mode 100644 src/coreComponents/schema/docs/SolverStatistics_other.rst delete mode 100644 src/coreComponents/schema/docs/Solvers.rst delete mode 100644 src/coreComponents/schema/docs/Solvers_other.rst delete mode 100644 src/coreComponents/schema/docs/SourceFlux.rst delete mode 100644 src/coreComponents/schema/docs/SourceFluxStatistics.rst delete mode 100644 src/coreComponents/schema/docs/SourceFluxStatistics_other.rst delete mode 100644 src/coreComponents/schema/docs/SourceFlux_other.rst delete mode 100644 src/coreComponents/schema/docs/SurfaceElementRegion.rst delete mode 100644 src/coreComponents/schema/docs/SurfaceElementRegion_other.rst delete mode 100644 src/coreComponents/schema/docs/SurfaceGenerator.rst delete mode 100644 src/coreComponents/schema/docs/SurfaceGenerator_other.rst delete mode 100644 src/coreComponents/schema/docs/SymbolicFunction.rst delete mode 100644 src/coreComponents/schema/docs/SymbolicFunction_other.rst delete mode 100644 src/coreComponents/schema/docs/TableCapillaryPressure.rst delete mode 100644 src/coreComponents/schema/docs/TableCapillaryPressure_other.rst delete mode 100644 src/coreComponents/schema/docs/TableFunction.rst delete mode 100644 src/coreComponents/schema/docs/TableFunction_other.rst delete mode 100644 src/coreComponents/schema/docs/TableRelativePermeability.rst delete mode 100644 src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis.rst delete mode 100644 src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst delete mode 100644 src/coreComponents/schema/docs/TableRelativePermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/Tasks.rst delete mode 100644 src/coreComponents/schema/docs/Tasks_other.rst delete mode 100644 src/coreComponents/schema/docs/ThermalCompressibleSinglePhaseFluid.rst delete mode 100644 src/coreComponents/schema/docs/ThermalCompressibleSinglePhaseFluid_other.rst delete mode 100644 src/coreComponents/schema/docs/ThickPlane.rst delete mode 100644 src/coreComponents/schema/docs/ThickPlane_other.rst delete mode 100644 src/coreComponents/schema/docs/TimeHistory.rst delete mode 100644 src/coreComponents/schema/docs/TimeHistory_other.rst delete mode 100644 src/coreComponents/schema/docs/Traction.rst delete mode 100644 src/coreComponents/schema/docs/Traction_other.rst delete mode 100644 src/coreComponents/schema/docs/TriaxialDriver.rst delete mode 100644 src/coreComponents/schema/docs/TriaxialDriver_other.rst delete mode 100644 src/coreComponents/schema/docs/TwoPointFluxApproximation.rst delete mode 100644 src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst delete mode 100644 src/coreComponents/schema/docs/VTK.rst delete mode 100644 src/coreComponents/schema/docs/VTKMesh.rst delete mode 100644 src/coreComponents/schema/docs/VTKMesh_other.rst delete mode 100644 src/coreComponents/schema/docs/VTKWell.rst delete mode 100644 src/coreComponents/schema/docs/VTKWell_other.rst delete mode 100644 src/coreComponents/schema/docs/VTK_other.rst delete mode 100644 src/coreComponents/schema/docs/VanGenuchtenBakerRelativePermeability.rst delete mode 100644 src/coreComponents/schema/docs/VanGenuchtenBakerRelativePermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/VanGenuchtenCapillaryPressure.rst delete mode 100644 src/coreComponents/schema/docs/VanGenuchtenCapillaryPressure_other.rst delete mode 100644 src/coreComponents/schema/docs/VanGenuchtenStone2RelativePermeability.rst delete mode 100644 src/coreComponents/schema/docs/VanGenuchtenStone2RelativePermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/ViscoDruckerPrager.rst delete mode 100644 src/coreComponents/schema/docs/ViscoDruckerPrager_other.rst delete mode 100644 src/coreComponents/schema/docs/ViscoExtendedDruckerPrager.rst delete mode 100644 src/coreComponents/schema/docs/ViscoExtendedDruckerPrager_other.rst delete mode 100644 src/coreComponents/schema/docs/ViscoModifiedCamClay.rst delete mode 100644 src/coreComponents/schema/docs/ViscoModifiedCamClay_other.rst delete mode 100644 src/coreComponents/schema/docs/WellControls.rst delete mode 100644 src/coreComponents/schema/docs/WellControls_other.rst delete mode 100644 src/coreComponents/schema/docs/WellElementRegion.rst delete mode 100644 src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst delete mode 100644 src/coreComponents/schema/docs/WellElementRegion_other.rst delete mode 100644 src/coreComponents/schema/docs/WillisRichardsPermeability.rst delete mode 100644 src/coreComponents/schema/docs/WillisRichardsPermeability_other.rst delete mode 100644 src/coreComponents/schema/docs/commandLine_other.rst delete mode 100644 src/coreComponents/schema/docs/crusher.rst delete mode 100644 src/coreComponents/schema/docs/crusher_other.rst delete mode 100644 src/coreComponents/schema/docs/domain_other.rst delete mode 100644 src/coreComponents/schema/docs/edgeManager_other.rst delete mode 100644 src/coreComponents/schema/docs/elementRegionsGroup_other.rst delete mode 100644 src/coreComponents/schema/docs/elementSubRegions_other.rst delete mode 100644 src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst delete mode 100644 src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst delete mode 100644 src/coreComponents/schema/docs/faceManager_other.rst delete mode 100644 src/coreComponents/schema/docs/lassen.rst delete mode 100644 src/coreComponents/schema/docs/lassen_other.rst delete mode 100644 src/coreComponents/schema/docs/meshLevels_other.rst delete mode 100644 src/coreComponents/schema/docs/neighborData_other.rst delete mode 100644 src/coreComponents/schema/docs/nodeManager_other.rst delete mode 100644 src/coreComponents/schema/docs/particleRegionsGroup_other.rst delete mode 100644 src/coreComponents/schema/docs/particleSubRegions_other.rst delete mode 100644 src/coreComponents/schema/docs/quartz.rst delete mode 100644 src/coreComponents/schema/docs/quartz_other.rst delete mode 100644 src/coreComponents/schema/docs/sets_other.rst delete mode 100644 src/coreComponents/schema/docs/wellElementSubRegion_other.rst delete mode 100644 src/docs/sphinx/CompleteXMLSchema.rst diff --git a/.gitignore b/.gitignore index d00a78b3725..8b641c28a31 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ /Debug/ uberenv_libs spack-*.txt +/src/docs/sphinx/datastructure *~ __pycache__ diff --git a/.readthedocs.yml b/.readthedocs.yml index c697f1f2f11..5f3f5d49dbf 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -15,6 +15,8 @@ build: nodejs: "16" python: "3.10" jobs: + pre_build: + - python3 scripts/SchemaToRSTDocumentation.py -s src/coreComponents/schema/schema.xsd -o src/docs/sphinx post_install: - npm install -g npm@9.8.1 - npm install -g @mermaid-js/mermaid-cli@10.3.1 diff --git a/scripts/SchemaToRSTDocumentation.py b/scripts/SchemaToRSTDocumentation.py index 6ffcb05ffc8..23e7613e422 100644 --- a/scripts/SchemaToRSTDocumentation.py +++ b/scripts/SchemaToRSTDocumentation.py @@ -1,7 +1,7 @@ import os import re -import sys -#import numpy as np +import shutil +import argparse from xml.etree import ElementTree as etree @@ -15,7 +15,6 @@ def comment(self, data): def writeTableRST(file_name, values): L = [[len(x) for x in row] for row in values] - # M = tuple(np.amax(np.array(L), axis=0)) # np isn't in the docker images for our CI MAX = [None] * len(L[0]) @@ -211,107 +210,97 @@ def buildTableValues(type_map, link_string='XML', include_defaults=True): return table_values -# Config -if len(sys.argv) < 2: - print("Usage: %s " % sys.argv[0]) - sys.exit(1) -schema_dir = sys.argv[1] -schema_name = os.path.join(schema_dir, 'schema.xsd') -additional_documentation_name = os.path.join(schema_dir, 'schema.xsd.other') -complete_output = os.path.join(schema_dir, '../../docs/sphinx/CompleteXMLSchema') -output_folder = os.path.join(schema_dir, 'docs') -sphinx_path = '../../coreComponents/schema/docs' -xsd = '{http://www.w3.org/2001/XMLSchema}' - -# Parse the input/non-input schemas -parser = etree.XMLParser(target=TreeBuilderWithComments()) -include_tree = etree.parse(schema_name, parser=parser) -include_root = include_tree.getroot() -input_attribute_map = buildAttributeMap(include_root) - -parser = etree.XMLParser(target=TreeBuilderWithComments()) -include_tree = etree.parse(additional_documentation_name, parser=parser) -include_root = include_tree.getroot() -other_attribute_map = buildAttributeMap(include_root) - -# Check for non-unique (ignoring case) links -input_keys = sorted(input_attribute_map.keys()) -input_keys_lower = [k.lower() for k in input_keys] -input_keys_count = [input_keys_lower.count(k) for k in input_keys_lower] -input_repeated_keys = [input_keys[ii] for ii in range(0, len(input_keys)) if input_keys_count[ii] > 1] - -other_keys = sorted(other_attribute_map.keys()) -other_keys_lower = [k.lower() for k in other_keys] -other_keys_count = [other_keys_lower.count(k) for k in other_keys_lower] -other_repeated_keys = [other_keys[ii] for ii in range(0, len(other_keys)) if other_keys_count[ii] > 1] - -if ((len(input_repeated_keys) > 0) | (len(other_repeated_keys) > 0)): - print('Duplicate input documentation table names:') - print(input_repeated_keys) - print('Duplicate other documentation table names:') - print(other_repeated_keys) - raise ValueError('Duplicate data structure names are not allowed due to .rst limitations (case-insensitive)!') - -# Setup directory -os.system('mkdir -p %s' % (output_folder)) - -# Keep track of existing/touched files -old_files = [f for f in os.listdir(output_folder) if '.rst' in f] -touched_files = [] - -# Build documentation tables -with open('%s.rst' % (complete_output), 'w') as output_handle: - # Write the file header - output_handle.write('###################\n') - output_handle.write('Datastructure Index\n') - output_handle.write('###################\n\n') - - # Parse the input schema definitions - output_handle.write('************************\n') - output_handle.write('Input Schema Definitions\n') - output_handle.write('************************\n\n') - - output_handle.write(':download:`XML Schema <%s/../schema.xsd>`\n\n' % (sphinx_path)) - - for type_name in sorted(input_attribute_map.keys()): - # Write the individual tables - table_values = buildTableValues(input_attribute_map[type_name]) - writeTableRST('%s/%s.rst' % (output_folder, type_name), table_values) - touched_files.append('%s.rst' % (type_name)) - - # Write to the master list - element_header = 'Element: %s' % (type_name) - output_handle.write('\n.. _XML_%s:\n\n' % (type_name)) - output_handle.write('%s\n' % (element_header)) - output_handle.write('=' * len(element_header) + '\n') - output_handle.write('.. include:: %s/%s.rst\n\n' % (sphinx_path, type_name)) - - # Parse the non-input schema definitions - output_handle.write('*************************\n') - output_handle.write('Datastructure Definitions\n') - output_handle.write('*************************\n\n') - - for type_name in sorted(other_attribute_map.keys()): - # Write the individual tables - table_values = buildTableValues(other_attribute_map[type_name], - link_string='DATASTRUCTURE', - include_defaults=False) - writeTableRST('%s/%s_other.rst' % (output_folder, type_name), table_values) - touched_files.append('%s_other.rst' % (type_name)) - - # Write to the master list - element_header = 'Datastructure: %s' % (type_name) - output_handle.write('\n.. _DATASTRUCTURE_%s:\n\n' % (type_name)) - output_handle.write('%s\n' % (element_header)) - output_handle.write('=' * len(element_header) + '\n') - output_handle.write('.. include:: %s/%s_other.rst\n\n' % (sphinx_path, type_name)) - -# Check for any untouched tables -untouched_files = [] -for f in old_files: - if f not in touched_files: - untouched_files.append(f) - -if len(untouched_files): - tmp = '\n '.join(untouched_files) - raise ValueError('Obsolete autogenerated .rst table files detected:%s' % (tmp)) +def main(schema_name='schema.xsd', output_folder='./', xsd='{http://www.w3.org/2001/XMLSchema}'): + """ + Build RST Documentation Tables + """ + # Setup folders + additional_documentation_name = f'{schema_name}.other' + output_folder = os.path.abspath(os.path.expanduser(output_folder)) + datastructure_folder = os.path.join(output_folder, 'datastructure') + summary_file = os.path.join(datastructure_folder, 'CompleteXMLSchema.rst') + os.makedirs(datastructure_folder, exist_ok=True) + shutil.copy(schema_name, os.path.join(datastructure_folder, 'schema.xsd')) + shutil.copy(additional_documentation_name, os.path.join(datastructure_folder, 'schema.xsd.other')) + + # Parse the input/non-input schemas + parser = etree.XMLParser(target=TreeBuilderWithComments()) + include_tree = etree.parse(schema_name, parser=parser) + include_root = include_tree.getroot() + input_attribute_map = buildAttributeMap(include_root) + + parser = etree.XMLParser(target=TreeBuilderWithComments()) + include_tree = etree.parse(additional_documentation_name, parser=parser) + include_root = include_tree.getroot() + other_attribute_map = buildAttributeMap(include_root) + + # Check for non-unique (ignoring case) links + input_keys = sorted(input_attribute_map.keys()) + input_keys_lower = [k.lower() for k in input_keys] + input_keys_count = [input_keys_lower.count(k) for k in input_keys_lower] + input_repeated_keys = [input_keys[ii] for ii in range(0, len(input_keys)) if input_keys_count[ii] > 1] + + other_keys = sorted(other_attribute_map.keys()) + other_keys_lower = [k.lower() for k in other_keys] + other_keys_count = [other_keys_lower.count(k) for k in other_keys_lower] + other_repeated_keys = [other_keys[ii] for ii in range(0, len(other_keys)) if other_keys_count[ii] > 1] + + if ((len(input_repeated_keys) > 0) | (len(other_repeated_keys) > 0)): + print('Duplicate input documentation table names:') + print(input_repeated_keys) + print('Duplicate other documentation table names:') + print(other_repeated_keys) + raise ValueError('Duplicate data structure names are not allowed due to .rst limitations (case-insensitive)!') + + # Build documentation tables + with open(summary_file, 'w') as output_handle: + # Write the file header + output_handle.write('###################\n') + output_handle.write('Datastructure Index\n') + output_handle.write('###################\n\n') + + # Parse the input schema definitions + output_handle.write('************************\n') + output_handle.write('Input Schema Definitions\n') + output_handle.write('************************\n\n') + + output_handle.write(':download:`XML Schema `\n\n') + + for type_name in sorted(input_attribute_map.keys()): + # Write the individual tables + table_values = buildTableValues(input_attribute_map[type_name]) + writeTableRST('%s/%s.rst' % (datastructure_folder, type_name), table_values) + + # Write to the master list + element_header = 'Element: %s' % (type_name) + output_handle.write('\n.. _XML_%s:\n\n' % (type_name)) + output_handle.write('%s\n' % (element_header)) + output_handle.write('=' * len(element_header) + '\n') + output_handle.write('.. include:: %s.rst\n\n' % (type_name)) + + # Parse the non-input schema definitions + output_handle.write('*************************\n') + output_handle.write('Datastructure Definitions\n') + output_handle.write('*************************\n\n') + + for type_name in sorted(other_attribute_map.keys()): + # Write the individual tables + table_values = buildTableValues(other_attribute_map[type_name], + link_string='DATASTRUCTURE', + include_defaults=False) + writeTableRST('%s/%s_other.rst' % (datastructure_folder, type_name), table_values) + + # Write to the master list + element_header = 'Datastructure: %s' % (type_name) + output_handle.write('\n.. _DATASTRUCTURE_%s:\n\n' % (type_name)) + output_handle.write('%s\n' % (element_header)) + output_handle.write('=' * len(element_header) + '\n') + output_handle.write('.. include:: %s_other.rst\n\n' % (type_name)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('-s', '--schema', type=str, help='GEOS schema file', default='schema.xsd') + parser.add_argument('-o', '--output', type=str, help='Output directory', default='./') + args = parser.parse_args() + main(schema_name=args.schema, output_folder=args.output) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 9aee09fa577..d76017b88a1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -169,9 +169,9 @@ if( ENABLE_XML_UPDATES AND ENABLE_MPI AND UNIX AND NOT CMAKE_HOST_APPLE AND NOT COMMENT "Generating XML schema" ) - add_custom_target( geosx_update_rst_tables + add_custom_target( geosx_build_datastructure_tables ALL - COMMAND python3 ${SCRIPT_DIR}/SchemaToRSTDocumentation.py ${SCHEMA_DIR} >update_rst_tables.log 2>&1 || (cat update_rst_tables.log && exit 1) + COMMAND python3 ${SCRIPT_DIR}/SchemaToRSTDocumentation.py -s ${SCHEMA_DIR}/schema.xsd -o ${CMAKE_SOURCE_DIR}/docs/sphinx >update_rst_tables.log 2>&1 || (cat update_rst_tables.log && exit 1) WORKING_DIRECTORY ${CMAKE_BINARY_DIR} DEPENDS geosx_generate_schema COMMENT "Generating schema-dependent RST files" @@ -181,7 +181,7 @@ if( ENABLE_XML_UPDATES AND ENABLE_MPI AND UNIX AND NOT CMAKE_HOST_APPLE AND NOT ALL COMMAND bash ${SCRIPT_DIR}/validateXMLFiles.bash -g ${SCHEMA_DIR}/schema.xsd ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/../examples ${CMAKE_SOURCE_DIR}/../inputFiles WORKING_DIRECTORY ${CMAKE_BINARY_DIR} - DEPENDS geosx_update_rst_tables + DEPENDS geosx_generate_schema COMMENT "Validating all XML files in the repository against the schema" ) endif() @@ -192,6 +192,7 @@ endif() if( SPHINX_FOUND ) blt_add_sphinx_target( geosx_docs ) + add_dependencies( geosx_docs geosx_build_datastructure_tables ) endif() diff --git a/src/coreComponents/constitutive/docs/BiotPorosity.rst b/src/coreComponents/constitutive/docs/BiotPorosity.rst index dd74e0dbbc5..e1257d14c1e 100644 --- a/src/coreComponents/constitutive/docs/BiotPorosity.rst +++ b/src/coreComponents/constitutive/docs/BiotPorosity.rst @@ -33,7 +33,7 @@ block. The following attributes are supported: -.. include:: /coreComponents/schema/docs/BiotPorosity.rst +.. include:: /docs/sphinx/datastructure/BiotPorosity.rst Example ======================= diff --git a/src/coreComponents/constitutive/docs/BlackOilFluid.rst b/src/coreComponents/constitutive/docs/BlackOilFluid.rst index a7e3fb27e68..106cd122646 100644 --- a/src/coreComponents/constitutive/docs/BlackOilFluid.rst +++ b/src/coreComponents/constitutive/docs/BlackOilFluid.rst @@ -83,7 +83,7 @@ In order to use the model, GEOS must be built with ``-DENABLE_PVTPACKAGE=ON`` (d The following attributes are supported: -.. include:: ../../../coreComponents/schema/docs/BlackOilFluid.rst +.. include:: /docs/sphinx/datastructure/BlackOilFluid.rst Supported phase names are: diff --git a/src/coreComponents/constitutive/docs/BrooksCoreyCapillaryPressure.rst b/src/coreComponents/constitutive/docs/BrooksCoreyCapillaryPressure.rst index e2820290648..e9e5ed043f9 100644 --- a/src/coreComponents/constitutive/docs/BrooksCoreyCapillaryPressure.rst +++ b/src/coreComponents/constitutive/docs/BrooksCoreyCapillaryPressure.rst @@ -47,7 +47,7 @@ node. The following attributes are supported: -.. include:: /coreComponents/schema/docs/BrooksCoreyCapillaryPressure.rst +.. include:: /docs/sphinx/datastructure/BrooksCoreyCapillaryPressure.rst Below are some comments on the model parameters: diff --git a/src/coreComponents/constitutive/docs/BrooksCoreyRelativePermeability.rst b/src/coreComponents/constitutive/docs/BrooksCoreyRelativePermeability.rst index be638c984b1..2ef89a3e981 100644 --- a/src/coreComponents/constitutive/docs/BrooksCoreyRelativePermeability.rst +++ b/src/coreComponents/constitutive/docs/BrooksCoreyRelativePermeability.rst @@ -35,7 +35,7 @@ node. The following attributes are supported: -.. include:: /coreComponents/schema/docs/BrooksCoreyRelativePermeability.rst +.. include:: /docs/sphinx/datastructure/BrooksCoreyRelativePermeability.rst Below are some comments on the model parameters. diff --git a/src/coreComponents/constitutive/docs/CO2BrineFluid.rst b/src/coreComponents/constitutive/docs/CO2BrineFluid.rst index 61ab1782578..2a3e001fc46 100644 --- a/src/coreComponents/constitutive/docs/CO2BrineFluid.rst +++ b/src/coreComponents/constitutive/docs/CO2BrineFluid.rst @@ -244,7 +244,7 @@ The models are represented by ````, ```` node in the input The following attributes are supported: -.. include:: ../../../coreComponents/schema/docs/CompressibleSinglePhaseFluid.rst +.. include:: /docs/sphinx/datastructure/CompressibleSinglePhaseFluid.rst Example ========================= diff --git a/src/coreComponents/constitutive/docs/ConstantPermeability.rst b/src/coreComponents/constitutive/docs/ConstantPermeability.rst index 6c4b065bdfc..84b0d26fe58 100644 --- a/src/coreComponents/constitutive/docs/ConstantPermeability.rst +++ b/src/coreComponents/constitutive/docs/ConstantPermeability.rst @@ -17,7 +17,7 @@ Parameters The following attributes are supported: -.. include:: /coreComponents/schema/docs/ConstantPermeability.rst +.. include:: /docs/sphinx/datastructure/ConstantPermeability.rst Example diff --git a/src/coreComponents/constitutive/docs/ExponentialDecayPermeability.rst b/src/coreComponents/constitutive/docs/ExponentialDecayPermeability.rst index c5e5889fa42..b2221a83db7 100644 --- a/src/coreComponents/constitutive/docs/ExponentialDecayPermeability.rst +++ b/src/coreComponents/constitutive/docs/ExponentialDecayPermeability.rst @@ -30,7 +30,7 @@ block. The following attributes are supported: -.. include:: /coreComponents/schema/docs/ExponentialDecayPermeability.rst +.. include:: /docs/sphinx/datastructure/ExponentialDecayPermeability.rst Example diff --git a/src/coreComponents/constitutive/docs/KozenyCarmanPermeability.rst b/src/coreComponents/constitutive/docs/KozenyCarmanPermeability.rst index 8365288ce2f..0f315a4ce9f 100644 --- a/src/coreComponents/constitutive/docs/KozenyCarmanPermeability.rst +++ b/src/coreComponents/constitutive/docs/KozenyCarmanPermeability.rst @@ -32,7 +32,7 @@ block. The following attributes are supported: -.. include:: /coreComponents/schema/docs/CarmanKozenyPermeability.rst +.. include:: /docs/sphinx/datastructure/CarmanKozenyPermeability.rst diff --git a/src/coreComponents/constitutive/docs/ParallelPlatesPermeability.rst b/src/coreComponents/constitutive/docs/ParallelPlatesPermeability.rst index 8f53bbb32a8..3169f3d0f84 100644 --- a/src/coreComponents/constitutive/docs/ParallelPlatesPermeability.rst +++ b/src/coreComponents/constitutive/docs/ParallelPlatesPermeability.rst @@ -35,7 +35,7 @@ block. The following attributes are supported: -.. include:: /coreComponents/schema/docs/ParallelPlatesPermeability.rst +.. include:: /docs/sphinx/datastructure/ParallelPlatesPermeability.rst .. _Witherspoon et al.: https://agupubs.onlinelibrary.wiley.com/doi/pdf/10.1029/WR016i006p01016 diff --git a/src/coreComponents/constitutive/docs/PressurePorosity.rst b/src/coreComponents/constitutive/docs/PressurePorosity.rst index 9a6fcb1d365..6659084688b 100644 --- a/src/coreComponents/constitutive/docs/PressurePorosity.rst +++ b/src/coreComponents/constitutive/docs/PressurePorosity.rst @@ -23,7 +23,7 @@ Parameters The following attributes are supported: -.. include:: /coreComponents/schema/docs/PressurePorosity.rst +.. include:: /docs/sphinx/datastructure/PressurePorosity.rst Example ======================= diff --git a/src/coreComponents/constitutive/docs/SlipDependentPermeability.rst b/src/coreComponents/constitutive/docs/SlipDependentPermeability.rst index fb47d4cd597..562728ce046 100644 --- a/src/coreComponents/constitutive/docs/SlipDependentPermeability.rst +++ b/src/coreComponents/constitutive/docs/SlipDependentPermeability.rst @@ -30,7 +30,7 @@ block. The following attributes are supported: -.. include:: /coreComponents/schema/docs/SlipDependentPermeability.rst +.. include:: /docs/sphinx/datastructure/SlipDependentPermeability.rst Example diff --git a/src/coreComponents/constitutive/docs/TableCapillaryPressure.rst b/src/coreComponents/constitutive/docs/TableCapillaryPressure.rst index 64246920f27..e420a43e51b 100644 --- a/src/coreComponents/constitutive/docs/TableCapillaryPressure.rst +++ b/src/coreComponents/constitutive/docs/TableCapillaryPressure.rst @@ -46,7 +46,7 @@ node. The following attributes are supported: -.. include:: /coreComponents/schema/docs/TableCapillaryPressure.rst +.. include:: /docs/sphinx/datastructure/TableCapillaryPressure.rst Below are some comments on the model parameters. diff --git a/src/coreComponents/constitutive/docs/TableRelativePermeability.rst b/src/coreComponents/constitutive/docs/TableRelativePermeability.rst index 1e77bf9c9c6..c7bc8285cfb 100644 --- a/src/coreComponents/constitutive/docs/TableRelativePermeability.rst +++ b/src/coreComponents/constitutive/docs/TableRelativePermeability.rst @@ -28,7 +28,7 @@ node. The following attributes are supported: -.. include:: /coreComponents/schema/docs/TableRelativePermeability.rst +.. include:: /docs/sphinx/datastructure/TableRelativePermeability.rst Below are some comments on the model parameters. diff --git a/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst b/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst index d3714bbf146..3ea9510c5d5 100644 --- a/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst +++ b/src/coreComponents/constitutive/docs/TemperatureDependentSolidVolumetricHeatCapacity.rst @@ -35,7 +35,7 @@ block. The following attributes are supported: -.. include:: /coreComponents/schema/docs/SolidInternalEnergy.rst +.. include:: /docs/sphinx/datastructure/SolidInternalEnergy.rst diff --git a/src/coreComponents/constitutive/docs/TemperatureDependentThermalConductivity.rst b/src/coreComponents/constitutive/docs/TemperatureDependentThermalConductivity.rst index cfe9fe25264..35a047ca0b9 100644 --- a/src/coreComponents/constitutive/docs/TemperatureDependentThermalConductivity.rst +++ b/src/coreComponents/constitutive/docs/TemperatureDependentThermalConductivity.rst @@ -34,7 +34,7 @@ domain in the ```` block. The following attributes are supported: -.. include:: /coreComponents/schema/docs/SinglePhaseThermalConductivity.rst +.. include:: /docs/sphinx/datastructure/SinglePhaseThermalConductivity.rst Example diff --git a/src/coreComponents/constitutive/docs/ThreePhaseRelativePermeability.rst b/src/coreComponents/constitutive/docs/ThreePhaseRelativePermeability.rst index 5aa85ef9b01..4176072e29e 100644 --- a/src/coreComponents/constitutive/docs/ThreePhaseRelativePermeability.rst +++ b/src/coreComponents/constitutive/docs/ThreePhaseRelativePermeability.rst @@ -57,7 +57,7 @@ node. The following attributes are supported: -.. include:: /coreComponents/schema/docs/BrooksCoreyBakerRelativePermeability.rst +.. include:: /docs/sphinx/datastructure/BrooksCoreyBakerRelativePermeability.rst Below are some comments on the model parameters. diff --git a/src/coreComponents/constitutive/docs/VanGenuchtenCapillaryPressure.rst b/src/coreComponents/constitutive/docs/VanGenuchtenCapillaryPressure.rst index 8f1d3fac28b..366fc3d5d97 100644 --- a/src/coreComponents/constitutive/docs/VanGenuchtenCapillaryPressure.rst +++ b/src/coreComponents/constitutive/docs/VanGenuchtenCapillaryPressure.rst @@ -52,7 +52,7 @@ node. The following attributes are supported: -.. include:: /coreComponents/schema/docs/VanGenuchtenCapillaryPressure.rst +.. include:: /docs/sphinx/datastructure/VanGenuchtenCapillaryPressure.rst Below are some comments on the model parameters: diff --git a/src/coreComponents/constitutive/docs/WillisRichardsPermeability.rst b/src/coreComponents/constitutive/docs/WillisRichardsPermeability.rst index f3c02410953..49105b211e7 100644 --- a/src/coreComponents/constitutive/docs/WillisRichardsPermeability.rst +++ b/src/coreComponents/constitutive/docs/WillisRichardsPermeability.rst @@ -41,7 +41,7 @@ block. The following attributes are supported: -.. include:: /coreComponents/schema/docs/WillisRichardsPermeability.rst +.. include:: /docs/sphinx/datastructure/WillisRichardsPermeability.rst Example diff --git a/src/coreComponents/constitutive/docs/solid/DruckerPrager.rst b/src/coreComponents/constitutive/docs/solid/DruckerPrager.rst index 51c52063308..dcb4ccafe49 100644 --- a/src/coreComponents/constitutive/docs/solid/DruckerPrager.rst +++ b/src/coreComponents/constitutive/docs/solid/DruckerPrager.rst @@ -83,7 +83,7 @@ Parameters The following attributes are supported: -.. include:: /coreComponents/schema/docs/DruckerPrager.rst +.. include:: /docs/sphinx/datastructure/DruckerPrager.rst Example ~~~~~~~~~~~~~~~ diff --git a/src/coreComponents/constitutive/docs/solid/ElasticIsotropic.rst b/src/coreComponents/constitutive/docs/solid/ElasticIsotropic.rst index bbd0cc27eb7..92dcf35daed 100644 --- a/src/coreComponents/constitutive/docs/solid/ElasticIsotropic.rst +++ b/src/coreComponents/constitutive/docs/solid/ElasticIsotropic.rst @@ -67,7 +67,7 @@ two will be internally calculated. The "default" keyword in front of certain pr is the default value adopted for a region unless the user separately specifies a heterogeneous field via the ``FieldSpecification`` mechanism. -.. include:: /coreComponents/schema/docs/ElasticIsotropic.rst +.. include:: /docs/sphinx/datastructure/ElasticIsotropic.rst Example ========================= diff --git a/src/coreComponents/constitutive/docs/solid/ElasticOrthotropic.rst b/src/coreComponents/constitutive/docs/solid/ElasticOrthotropic.rst index cf794fb2f0c..483cf8116d2 100644 --- a/src/coreComponents/constitutive/docs/solid/ElasticOrthotropic.rst +++ b/src/coreComponents/constitutive/docs/solid/ElasticOrthotropic.rst @@ -47,7 +47,7 @@ The following attributes are supported. The "default" keyword in front of certa is the default value adopted for a region unless the user separately specifies a heterogeneous field via the ``FieldSpecification`` mechanism. -.. include:: /coreComponents/schema/docs/ElasticOrthotropic.rst +.. include:: /docs/sphinx/datastructure/ElasticOrthotropic.rst Example ========================= diff --git a/src/coreComponents/constitutive/docs/solid/ElasticTransverseIsotropic.rst b/src/coreComponents/constitutive/docs/solid/ElasticTransverseIsotropic.rst index aa0cb479042..8ea11a38cd1 100644 --- a/src/coreComponents/constitutive/docs/solid/ElasticTransverseIsotropic.rst +++ b/src/coreComponents/constitutive/docs/solid/ElasticTransverseIsotropic.rst @@ -47,7 +47,7 @@ The following attributes are supported. The "default" keyword in front of certa is the default value adopted for a region unless the user separately specifies a heterogeneous field via the ``FieldSpecification`` mechanism. -.. include:: /coreComponents/schema/docs/ElasticTransverseIsotropic.rst +.. include:: /docs/sphinx/datastructure/ElasticTransverseIsotropic.rst Example ========================= diff --git a/src/coreComponents/constitutiveDrivers/docs/PVTDriver.rst b/src/coreComponents/constitutiveDrivers/docs/PVTDriver.rst index ae9563480c1..eaa849ea060 100644 --- a/src/coreComponents/constitutiveDrivers/docs/PVTDriver.rst +++ b/src/coreComponents/constitutiveDrivers/docs/PVTDriver.rst @@ -80,7 +80,7 @@ Parameters ---------- The key XML parameters for the PVTDriver are summarized in the following table: -.. include:: /coreComponents/schema/docs/PVTDriver.rst +.. include:: /docs/sphinx/datastructure/PVTDriver.rst Output Format ------------- diff --git a/src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.rst b/src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.rst index b229bd29047..ced93bc86f7 100644 --- a/src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.rst +++ b/src/coreComponents/constitutiveDrivers/docs/TriaxialDriver.rst @@ -32,7 +32,7 @@ Internally, the triaxial driver uses a simple form of time-stepping to advance t The key parameters for the TriaxialDriver are: -.. include:: /coreComponents/schema/docs/TriaxialDriver.rst +.. include:: /docs/sphinx/datastructure/TriaxialDriver.rst .. note:: diff --git a/src/coreComponents/discretizationMethods/docs/NumericalMethodsManager.rst b/src/coreComponents/discretizationMethods/docs/NumericalMethodsManager.rst index ff8e3d19238..312b3acba67 100644 --- a/src/coreComponents/discretizationMethods/docs/NumericalMethodsManager.rst +++ b/src/coreComponents/discretizationMethods/docs/NumericalMethodsManager.rst @@ -5,7 +5,7 @@ Numerical Methods This section describes the specification of numerical methods used by solvers. -.. include:: /coreComponents/schema/docs/NumericalMethods.rst +.. include:: /docs/sphinx/datastructure/NumericalMethods.rst .. include:: /coreComponents/finiteElement/docs/FiniteElement.rst.txt diff --git a/src/coreComponents/events/docs/EventManager.rst b/src/coreComponents/events/docs/EventManager.rst index 76c94493feb..d7fde6dc073 100644 --- a/src/coreComponents/events/docs/EventManager.rst +++ b/src/coreComponents/events/docs/EventManager.rst @@ -52,7 +52,7 @@ Event ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The children of the Event block define the events that may execute during a simulation. These may be of type ``HaltEvent``, ``PeriodicEvent``, or ``SoloEvent``. The exit criteria for the global event loop are defined by the attributes ``maxTime`` and ``maxCycle`` (which by default are set to their max values). If the optional logLevel flag is set, the EventManager will report additional information with regards to timestep requests and event forecasts for its children. -.. include:: ../../../coreComponents/schema/docs/Events.rst +.. include:: /docs/sphinx/datastructure/Events.rst PeriodicEvent @@ -67,21 +67,21 @@ By default, a PeriodicEvent will execute throughout the entire simulation. This The timestep request event is typically determined via its target. However, this value can be overridden by setting the ``forceDt`` or ``maxEventDt`` attributes. -.. include:: ../../../coreComponents/schema/docs/PeriodicEvent.rst +.. include:: /docs/sphinx/datastructure/PeriodicEvent.rst SoloEvent ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This type of event will execute once once the event loop reaches a certain cycle (targetCycle) or time (targetTime). Similar to the PeriodicEvent type, this event will modify its timestep requests so that a cycle occurs at the exact time requested (this can be turned off by specifying targetExactTimestep="0"). The forecast calculations follow an similar approach to the PeriodicEvent type. -.. include:: ../../../coreComponents/schema/docs/SoloEvent.rst +.. include:: /docs/sphinx/datastructure/SoloEvent.rst HaltEvent ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This event type is designed to track the wall clock. When the time exceeds the value specified via maxRunTime, the event will trigger and set a flag that instructs the main EventManager loop to cleanly exit at the end of the current cycle. The event for cast for this event type is given by: ``forecast = (maxRuntime - (currentTime - startTime)) / realDt`` -.. include:: ../../../coreComponents/schema/docs/HaltEvent.rst +.. include:: /docs/sphinx/datastructure/HaltEvent.rst diff --git a/src/coreComponents/events/docs/TasksManager.rst b/src/coreComponents/events/docs/TasksManager.rst index c0e5740b483..22a026a2e38 100644 --- a/src/coreComponents/events/docs/TasksManager.rst +++ b/src/coreComponents/events/docs/TasksManager.rst @@ -21,13 +21,13 @@ Task *************************** The children of the Tasks block define different Tasks to be triggered by events specified in the :ref:`EventManager` during the execution of the simulation. At present the only supported task is the ``PackCollection`` used to collect time history data for output by a TimeHistory output. -.. include:: ../../../coreComponents/schema/docs/Tasks.rst +.. include:: /docs/sphinx/datastructure/Tasks.rst PackCollection *************************** The ``PackCollection`` Task is used to collect time history information from fields. Either the entire field or specified named sets of indices in the field can be collected. -.. include:: ../../../coreComponents/schema/docs/PackCollection.rst +.. include:: /docs/sphinx/datastructure/PackCollection.rst Note: The time history information collected via this task is buffered internally until it is output by a linked TimeHistory Output. diff --git a/src/coreComponents/fieldSpecification/docs/AquiferBoundaryCondition.rst b/src/coreComponents/fieldSpecification/docs/AquiferBoundaryCondition.rst index 86e22f1349b..fff21095fe4 100644 --- a/src/coreComponents/fieldSpecification/docs/AquiferBoundaryCondition.rst +++ b/src/coreComponents/fieldSpecification/docs/AquiferBoundaryCondition.rst @@ -156,7 +156,7 @@ The main Carter-Tracy parameters and the expected units are listed below: The full list of parameters is provided below: -.. include:: /coreComponents/schema/docs/Aquifer.rst +.. include:: /docs/sphinx/datastructure/Aquifer.rst Examples =============== diff --git a/src/coreComponents/fieldSpecification/docs/EquilibriumInitialCondition.rst b/src/coreComponents/fieldSpecification/docs/EquilibriumInitialCondition.rst index a3489725b82..3967e4d5831 100644 --- a/src/coreComponents/fieldSpecification/docs/EquilibriumInitialCondition.rst +++ b/src/coreComponents/fieldSpecification/docs/EquilibriumInitialCondition.rst @@ -58,7 +58,7 @@ These parameters are used with the fluid density model (depending for compositio The full list of parameters is provided below: -.. include:: /coreComponents/schema/docs/HydrostaticEquilibrium.rst +.. include:: /docs/sphinx/datastructure/HydrostaticEquilibrium.rst Examples diff --git a/src/coreComponents/fileIO/doc/Outputs.rst b/src/coreComponents/fileIO/doc/Outputs.rst index d46204a92e0..b8d91d92fed 100644 --- a/src/coreComponents/fileIO/doc/Outputs.rst +++ b/src/coreComponents/fileIO/doc/Outputs.rst @@ -28,7 +28,7 @@ The SILO output is defined through the ```` XML node (subnode of ```` XML node (subnode of `` The parameter options are listed in the following table: -.. include:: /coreComponents/schema/docs/VTK.rst +.. include:: /docs/sphinx/datastructure/VTK.rst TimeHistory Output ================== @@ -59,7 +59,7 @@ The TimeHistory output is defined through the ```` XML node (subnod The parameter options are listed in the following table: -.. include:: /coreComponents/schema/docs/TimeHistory.rst +.. include:: /docs/sphinx/datastructure/TimeHistory.rst In order to properly collect and output time history information the following steps must be accomplished: diff --git a/src/coreComponents/functions/docs/FunctionManager.rst b/src/coreComponents/functions/docs/FunctionManager.rst index ef58be85a27..18138683c0e 100644 --- a/src/coreComponents/functions/docs/FunctionManager.rst +++ b/src/coreComponents/functions/docs/FunctionManager.rst @@ -64,7 +64,7 @@ TableFunction A table function uses a set of pre-computed values defined at points on a structured grid to represent an arbitrary-dimensional function. Typically, the axes of the table will represent time and/or spatial dimensions; however, these can be applied to represent phase diagrams, etc. -.. include:: ../../../coreComponents/schema/docs/TableFunction.rst +.. include:: /docs/sphinx/datastructure/TableFunction.rst 1D Table @@ -157,7 +157,7 @@ SymbolicFunction This function leverages the symbolic expression library mathpresso to define and evaluate functions. These functions are processed using an x86-64 JIT compiler, so are nearly as efficient as natively compiled C++ expressions. -.. include:: ../../../coreComponents/schema/docs/SymbolicFunction.rst +.. include:: /docs/sphinx/datastructure/SymbolicFunction.rst The ``variableNames`` attribute defines a set of single-character names for the inputs to the symbolic function. There should be a definition for each scalar input and for each component of a vector input. @@ -187,7 +187,7 @@ CompositeFunction This function is derived from the symbolic function. However, instead of using the time or object as inputs, it is used to combine the outputs of other functions using a symbolic expression. -.. include:: ../../../coreComponents/schema/docs/CompositeFunction.rst +.. include:: /docs/sphinx/datastructure/CompositeFunction.rst The ``functionNames`` attribute defines the set of input functions to use (these may be of any type, and may each have any number of inputs). diff --git a/src/coreComponents/linearAlgebra/docs/LinearSolvers.rst b/src/coreComponents/linearAlgebra/docs/LinearSolvers.rst index bda0ecc9543..b4b68dfc682 100644 --- a/src/coreComponents/linearAlgebra/docs/LinearSolvers.rst +++ b/src/coreComponents/linearAlgebra/docs/LinearSolvers.rst @@ -66,7 +66,7 @@ Summary The following table summarizes the available input parameters for the linear solver. -.. include:: ../../schema/docs/LinearSolverParameters.rst +.. include:: /docs/sphinx/datastructure/LinearSolverParameters.rst *************************** Preconditioner descriptions diff --git a/src/coreComponents/mesh/docs/Mesh.rst b/src/coreComponents/mesh/docs/Mesh.rst index 211b804ab79..cf6e587336e 100644 --- a/src/coreComponents/mesh/docs/Mesh.rst +++ b/src/coreComponents/mesh/docs/Mesh.rst @@ -23,7 +23,7 @@ Basic Example The Internal Mesh Generator allows one to quickly build simple cartesian grids and divide them into several regions. The following attributes are supported in the input block for InternalMesh: -.. include:: /coreComponents/schema/docs/InternalMesh.rst +.. include:: /docs/sphinx/datastructure/InternalMesh.rst The following is an example XML ```` block, which will generate a vertical beam with two ``CellBlocks`` (one in red and one in blue in the following picture). diff --git a/src/coreComponents/physicsSolvers/SolutionStrategy.rst b/src/coreComponents/physicsSolvers/SolutionStrategy.rst index 3a7f0f0bb31..e0ca4873f5f 100644 --- a/src/coreComponents/physicsSolvers/SolutionStrategy.rst +++ b/src/coreComponents/physicsSolvers/SolutionStrategy.rst @@ -88,4 +88,4 @@ All parameters defining the behavior of the nonlinear solver and determining the timestep size requested by the physics solver are defined in the NonlinearSolverParameters and are presented in the following table. -.. include:: /coreComponents/schema/docs/NonlinearSolverParameters.rst +.. include:: /docs/sphinx/datastructure/NonlinearSolverParameters.rst diff --git a/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsConformingFractures.rst b/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsConformingFractures.rst index 0e6e022541a..5f70bfcbb5d 100644 --- a/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsConformingFractures.rst +++ b/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsConformingFractures.rst @@ -24,9 +24,9 @@ Parameters In the preceding XML block, The `SolidMechanicsLagrangeContact` is specified by the title of the subblock of the `Solvers` block. The following attributes are supported in the input block for `SolidMechanicsLagrangeContact`: -.. include:: /coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst +.. include:: /docs/sphinx/datastructure/SolidMechanicsLagrangeContact.rst The following data are allocated and used by the solver: -.. include:: /coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst +.. include:: /docs/sphinx/datastructure/SolidMechanicsLagrangeContact_other.rst diff --git a/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsEmbeddedFractures.rst b/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsEmbeddedFractures.rst index 6bce5272991..739c9ab5226 100644 --- a/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsEmbeddedFractures.rst +++ b/src/coreComponents/physicsSolvers/contact/docs/SolidMechanicsEmbeddedFractures.rst @@ -34,11 +34,11 @@ In the preceding XML block, The `SolidMechanicsEmbeddedFractures` is specified b Note that the `SolidMechanicsEmbeddedFractures` always relies on the existance of a The following attributes are supported in the input block for `SolidMechanicsEmbeddedFractures`: -.. include:: /coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst +.. include:: /docs/sphinx/datastructure/SolidMechanicsEmbeddedFractures.rst The following data are allocated and used by the solver: -.. include:: /coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst +.. include:: /docs/sphinx/datastructure/SolidMechanicsEmbeddedFractures_other.rst References ========== diff --git a/src/coreComponents/physicsSolvers/fluidFlow/docs/CompositionalMultiphaseFlow.rst b/src/coreComponents/physicsSolvers/fluidFlow/docs/CompositionalMultiphaseFlow.rst index 533b01385db..2197a50f5b1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/docs/CompositionalMultiphaseFlow.rst +++ b/src/coreComponents/physicsSolvers/fluidFlow/docs/CompositionalMultiphaseFlow.rst @@ -182,7 +182,7 @@ Parameters The following attributes are supported: -.. include:: /coreComponents/schema/docs/CompositionalMultiphaseFVM.rst +.. include:: /docs/sphinx/datastructure/CompositionalMultiphaseFVM.rst .. _input_example: diff --git a/src/coreComponents/physicsSolvers/fluidFlow/docs/ProppantTransport.rst b/src/coreComponents/physicsSolvers/fluidFlow/docs/ProppantTransport.rst index 180e9050196..52f681bc6c2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/docs/ProppantTransport.rst +++ b/src/coreComponents/physicsSolvers/fluidFlow/docs/ProppantTransport.rst @@ -207,7 +207,7 @@ Like any solver, time stepping is driven by events, see :ref:`EventManager`. The following attributes are supported: -.. include:: /coreComponents/schema/docs/ProppantTransport.rst +.. include:: /docs/sphinx/datastructure/ProppantTransport.rst In particular: diff --git a/src/coreComponents/physicsSolvers/fluidFlow/docs/SinglePhaseFlow.rst b/src/coreComponents/physicsSolvers/fluidFlow/docs/SinglePhaseFlow.rst index 9b87049a3c6..3840591994b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/docs/SinglePhaseFlow.rst +++ b/src/coreComponents/physicsSolvers/fluidFlow/docs/SinglePhaseFlow.rst @@ -90,7 +90,7 @@ Like any solver, time stepping is driven by events, see :ref:`EventManager`. The following attributes are supported: -.. include:: /coreComponents/schema/docs/SinglePhaseFVM.rst +.. include:: /docs/sphinx/datastructure/SinglePhaseFVM.rst In particular: diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/docs/CompositionalMultiphaseWell.rst b/src/coreComponents/physicsSolvers/fluidFlow/wells/docs/CompositionalMultiphaseWell.rst index b78c7b6583b..dccbaa36cff 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/docs/CompositionalMultiphaseWell.rst +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/docs/CompositionalMultiphaseWell.rst @@ -127,7 +127,7 @@ Parameters The following attributes are supported: -.. include:: /coreComponents/schema/docs/CompositionalMultiphaseWell.rst +.. include:: /docs/sphinx/datastructure/CompositionalMultiphaseWell.rst .. _well_input_example: diff --git a/src/coreComponents/physicsSolvers/multiphysics/docs/Poromechanics.rst b/src/coreComponents/physicsSolvers/multiphysics/docs/Poromechanics.rst index f745e30e86b..28579e26852 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/docs/Poromechanics.rst +++ b/src/coreComponents/physicsSolvers/multiphysics/docs/Poromechanics.rst @@ -48,7 +48,7 @@ In the main solver, it requires the specification of solidSolverName, flowSolver The following attributes are supported: -.. include:: /coreComponents/schema/docs/SinglePhasePoromechanics.rst +.. include:: /docs/sphinx/datastructure/SinglePhasePoromechanics.rst * ``couplingTypeOption``: defines the coupling scheme. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/docs/SolidMechanics.rst b/src/coreComponents/physicsSolvers/solidMechanics/docs/SolidMechanics.rst index d0020fd3770..a44e4797a88 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/docs/SolidMechanics.rst +++ b/src/coreComponents/physicsSolvers/solidMechanics/docs/SolidMechanics.rst @@ -195,11 +195,11 @@ Parameters In the preceding XML block, The `SolidMechanics_LagrangianFEM` is specified by the title of the subblock of the `Solvers` block. The following attributes are supported in the input block for `SolidMechanics_LagrangianFEM`: -.. include:: /coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst +.. include:: /docs/sphinx/datastructure/SolidMechanics_LagrangianFEM.rst The following data are allocated and used by the solver: -.. include:: /coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst +.. include:: /docs/sphinx/datastructure/SolidMechanics_LagrangianFEM_other.rst Example ========================= diff --git a/src/coreComponents/schema/docs/AcousticElasticSEM.rst b/src/coreComponents/schema/docs/AcousticElasticSEM.rst deleted file mode 100644 index 8dc0c8b4e21..00000000000 --- a/src/coreComponents/schema/docs/AcousticElasticSEM.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -========================= ================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ======================================================================================================================================================================================================================================================================================================================== -acousticSolverName groupNameRef required Name of the acoustic solver used by the coupled solver -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -elasticSolverName groupNameRef required Name of the elastic solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/AcousticElasticSEM_other.rst b/src/coreComponents/schema/docs/AcousticElasticSEM_other.rst deleted file mode 100644 index f296d4de732..00000000000 --- a/src/coreComponents/schema/docs/AcousticElasticSEM_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================================ -Name Type Description -========================= ====================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================================ - - diff --git a/src/coreComponents/schema/docs/AcousticFirstOrderSEM.rst b/src/coreComponents/schema/docs/AcousticFirstOrderSEM.rst deleted file mode 100644 index 0d655628fe6..00000000000 --- a/src/coreComponents/schema/docs/AcousticFirstOrderSEM.rst +++ /dev/null @@ -1,37 +0,0 @@ - - -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== -attenuationType geos_WaveSolverUtils_AttenuationType none Flag to indicate which attenuation model to use: "none" for no attenuation, "sls\ for the standard-linear-solid (SLS) model (Fichtner, 2014). -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -dtSeismoTrace real64 0 Time step for output pressure at receivers -enableLifo integer 0 Set to 1 to enable LIFO storage feature -forward integer 1 Set to 1 to compute forward propagation -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) -lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) -lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) -linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) -linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise -receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers -rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default -saveFields integer 0 Set to 1 to save fields during forward and restore them during backward -shotIndex integer 0 Set the current shot for temporary files -slsAnelasticityCoefficients real32_array {0} Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided. -slsReferenceAngularFrequencies real32_array {0} Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided. -sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeSourceDelay real32 -1 Source time delay (1 / f0 by default) -timeSourceFrequency real32 0 Central frequency for the time source -useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: "none" to deactivate DAS, "strainIntegration" for strain integration, "dipole" for displacement difference -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst b/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst deleted file mode 100644 index 88ca2990ec7..00000000000 --- a/src/coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst +++ /dev/null @@ -1,33 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================= -Name Type Description -========================= ====================================================================================================================================================== ======================================================================= -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverElem integer_array Element containing the receivers -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceElem integer_array Element containing the sources -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceRegion integer_array Region containing the sources -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -uxNp1AtReceivers real32_array2d Ux value at each receiver for each timestep -uyNp1AtReceivers real32_array2d Uy value at each receiver for each timestep -uzNp1AtReceivers real32_array2d Uz value at each receiver for each timestep -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================= - - diff --git a/src/coreComponents/schema/docs/AcousticSEM.rst b/src/coreComponents/schema/docs/AcousticSEM.rst deleted file mode 100644 index 0d655628fe6..00000000000 --- a/src/coreComponents/schema/docs/AcousticSEM.rst +++ /dev/null @@ -1,37 +0,0 @@ - - -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== -attenuationType geos_WaveSolverUtils_AttenuationType none Flag to indicate which attenuation model to use: "none" for no attenuation, "sls\ for the standard-linear-solid (SLS) model (Fichtner, 2014). -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -dtSeismoTrace real64 0 Time step for output pressure at receivers -enableLifo integer 0 Set to 1 to enable LIFO storage feature -forward integer 1 Set to 1 to compute forward propagation -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) -lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) -lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) -linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) -linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise -receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers -rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default -saveFields integer 0 Set to 1 to save fields during forward and restore them during backward -shotIndex integer 0 Set the current shot for temporary files -slsAnelasticityCoefficients real32_array {0} Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided. -slsReferenceAngularFrequencies real32_array {0} Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided. -sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeSourceDelay real32 -1 Source time delay (1 / f0 by default) -timeSourceFrequency real32 0 Central frequency for the time source -useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: "none" to deactivate DAS, "strainIntegration" for strain integration, "dipole" for displacement difference -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/AcousticSEM_other.rst b/src/coreComponents/schema/docs/AcousticSEM_other.rst deleted file mode 100644 index 1ef831de5ac..00000000000 --- a/src/coreComponents/schema/docs/AcousticSEM_other.rst +++ /dev/null @@ -1,28 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================= -Name Type Description -========================= ====================================================================================================================================================== ======================================================================= -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverElem integer_array Element containing the receivers -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================= - - diff --git a/src/coreComponents/schema/docs/AcousticVTISEM.rst b/src/coreComponents/schema/docs/AcousticVTISEM.rst deleted file mode 100644 index 0d655628fe6..00000000000 --- a/src/coreComponents/schema/docs/AcousticVTISEM.rst +++ /dev/null @@ -1,37 +0,0 @@ - - -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== -attenuationType geos_WaveSolverUtils_AttenuationType none Flag to indicate which attenuation model to use: "none" for no attenuation, "sls\ for the standard-linear-solid (SLS) model (Fichtner, 2014). -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -dtSeismoTrace real64 0 Time step for output pressure at receivers -enableLifo integer 0 Set to 1 to enable LIFO storage feature -forward integer 1 Set to 1 to compute forward propagation -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) -lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) -lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) -linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) -linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise -receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers -rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default -saveFields integer 0 Set to 1 to save fields during forward and restore them during backward -shotIndex integer 0 Set the current shot for temporary files -slsAnelasticityCoefficients real32_array {0} Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided. -slsReferenceAngularFrequencies real32_array {0} Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided. -sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeSourceDelay real32 -1 Source time delay (1 / f0 by default) -timeSourceFrequency real32 0 Central frequency for the time source -useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: "none" to deactivate DAS, "strainIntegration" for strain integration, "dipole" for displacement difference -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/AcousticVTISEM_other.rst b/src/coreComponents/schema/docs/AcousticVTISEM_other.rst deleted file mode 100644 index 1ef831de5ac..00000000000 --- a/src/coreComponents/schema/docs/AcousticVTISEM_other.rst +++ /dev/null @@ -1,28 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================= -Name Type Description -========================= ====================================================================================================================================================== ======================================================================= -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -pressureNp1AtReceivers real32_array2d Pressure value at each receiver for each timestep -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverElem integer_array Element containing the receivers -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================= - - diff --git a/src/coreComponents/schema/docs/Aquifer.rst b/src/coreComponents/schema/docs/Aquifer.rst deleted file mode 100644 index 20c477d38bc..00000000000 --- a/src/coreComponents/schema/docs/Aquifer.rst +++ /dev/null @@ -1,38 +0,0 @@ - - -================================== ================== ======== ========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -================================== ================== ======== ========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== -allowAllPhasesIntoAquifer integer 0 | Flag to allow all phases to flow into the aquifer. - | This flag only matters for the configuration in which flow is from reservoir to aquifer. - | - If the flag is equal to 1, then all phases, including non-aqueous phases, are allowed to flow into the aquifer. - | - If the flag is equal to 0, then only the water phase is allowed to flow into the aquifer. - | If you are in a configuration in which flow is from reservoir to aquifer and you expect non-aqueous phases to saturate the reservoir cells next to the aquifer, set this flag to 1. - | This keyword is ignored for single-phase flow simulations -aquiferAngle real64 required Angle subtended by the aquifer boundary from the center of the reservoir [degress] -aquiferElevation real64 required Aquifer elevation (positive going upward) [m] -aquiferInitialPressure real64 required Aquifer initial pressure [Pa] -aquiferInnerRadius real64 required Aquifer inner radius [m] -aquiferPermeability real64 required Aquifer permeability [m^2] -aquiferPorosity real64 required Aquifer porosity -aquiferThickness real64 required Aquifer thickness [m] -aquiferTotalCompressibility real64 required Aquifer total compressibility (rock and fluid) [Pa^-1] -aquiferWaterDensity real64 required Aquifer water density [kg.m^-3] -aquiferWaterPhaseComponentFraction real64_array {0} Aquifer water phase component fraction. This keyword is ignored for single-phase flow simulations. -aquiferWaterPhaseComponentNames string_array {} Aquifer water phase component names. This keyword is ignored for single-phase flow simulations. -aquiferWaterViscosity real64 required Aquifer water viscosity [Pa.s] -bcApplicationTableName groupNameRef Name of table that specifies the on/off application of the boundary condition. -beginTime real64 -1e+99 Time at which the boundary condition will start being applied. -direction R1Tensor {0,0,0} Direction to apply boundary condition to. -endTime real64 1e+99 Time at which the boundary condition will stop being applied. -functionName groupNameRef Name of function that specifies variation of the boundary condition. -initialCondition integer 0 Boundary condition is applied as an initial condition. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -pressureInfluenceFunctionName groupNameRef | Name of the table describing the pressure influence function - | . If not provided, we use a default pressure influence function -scale real64 0 Scale factor for value of the boundary condition. -setNames groupNameRef_array required Name of sets that boundary condition is applied to. -================================== ================== ======== ========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/Aquifer_other.rst b/src/coreComponents/schema/docs/Aquifer_other.rst deleted file mode 100644 index b171b95f04b..00000000000 --- a/src/coreComponents/schema/docs/Aquifer_other.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============== ============ ============================================================== -Name Type Description -============== ============ ============================================================== -component integer Component of field (if tensor) to apply boundary condition to. -cumulativeFlux real64 (no description available) -fieldName groupNameRef Name of field that boundary condition is applied to. -objectPath groupNameRef Path to the target field -============== ============ ============================================================== - - diff --git a/src/coreComponents/schema/docs/Benchmarks.rst b/src/coreComponents/schema/docs/Benchmarks.rst deleted file mode 100644 index faa738ea57d..00000000000 --- a/src/coreComponents/schema/docs/Benchmarks.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -======= ==== ======= ================== -Name Type Default Description -======= ==== ======= ================== -crusher node unique :ref:`XML_crusher` -lassen node unique :ref:`XML_lassen` -quartz node unique :ref:`XML_quartz` -======= ==== ======= ================== - - diff --git a/src/coreComponents/schema/docs/Benchmarks_other.rst b/src/coreComponents/schema/docs/Benchmarks_other.rst deleted file mode 100644 index daf4c9768fa..00000000000 --- a/src/coreComponents/schema/docs/Benchmarks_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -======= ==== ============================ -Name Type Description -======= ==== ============================ -crusher node :ref:`DATASTRUCTURE_crusher` -lassen node :ref:`DATASTRUCTURE_lassen` -quartz node :ref:`DATASTRUCTURE_quartz` -======= ==== ============================ - - diff --git a/src/coreComponents/schema/docs/BiotPorosity.rst b/src/coreComponents/schema/docs/BiotPorosity.rst deleted file mode 100644 index e0098540256..00000000000 --- a/src/coreComponents/schema/docs/BiotPorosity.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -======================== ========= ======== =========================================================== -Name Type Default Description -======================== ========= ======== =========================================================== -defaultGrainBulkModulus real64 required Grain bulk modulus -defaultPorosityTEC real64 0 Default thermal expansion coefficient -defaultReferencePorosity real64 required Default value of the reference porosity -name groupName required A name is required for any non-unique nodes -useUniaxialFixedStress integer 0 Flag enabling uniaxial approximation in fixed stress update -======================== ========= ======== =========================================================== - - diff --git a/src/coreComponents/schema/docs/BiotPorosity_other.rst b/src/coreComponents/schema/docs/BiotPorosity_other.rst deleted file mode 100644 index 335965a9ad6..00000000000 --- a/src/coreComponents/schema/docs/BiotPorosity_other.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -================================= ============== ================================================================================================ -Name Type Description -================================= ============== ================================================================================================ -averageMeanTotalStressIncrement_k real64_array Mean total stress increment averaged over quadrature points at the previous sequential iteration -biotCoefficient real64_array Biot coefficient -dPorosity_dPressure real64_array2d Derivative of rock porosity with respect to pressure -dPorosity_dTemperature real64_array2d Derivative of rock porosity with respect to temperature -grainBulkModulus real64_array Grain Bulk modulus. -initialPorosity real64_array2d Initial porosity -meanTotalStressIncrement_k real64_array2d Mean total stress increment at quadrature points at the previous sequential iteration -porosity real64_array2d Rock porosity -porosity_n real64_array2d Rock porosity at the previous converged time step -referencePorosity real64_array Reference porosity -solidBulkModulus real64_array Solid bulk modulus -solidShearModulus real64_array Solid shear modulus -thermalExpansionCoefficient real64_array Thermal expansion coefficient -================================= ============== ================================================================================================ - - diff --git a/src/coreComponents/schema/docs/BlackOilFluid.rst b/src/coreComponents/schema/docs/BlackOilFluid.rst deleted file mode 100644 index c34b2d2ec84..00000000000 --- a/src/coreComponents/schema/docs/BlackOilFluid.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -======================================= ================== ======== ===================================================================================================================================================================================================================================================================================================== -Name Type Default Description -======================================= ================== ======== ===================================================================================================================================================================================================================================================================================================== -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentMolarWeight real64_array required Component molar weights -componentNames string_array {} List of component names -hydrocarbonFormationVolFactorTableNames groupNameRef_array {} | List of formation volume factor TableFunction names from the Functions block. - | The user must provide one TableFunction per hydrocarbon phase, in the order provided in "phaseNames". - | For instance, if "oil" is before "gas" in "phaseNames", the table order should be: oilTableName, gasTableName -hydrocarbonViscosityTableNames groupNameRef_array {} | List of viscosity TableFunction names from the Functions block. - | The user must provide one TableFunction per hydrocarbon phase, in the order provided in "phaseNames". - | For instance, if "oil" is before "gas" in "phaseNames", the table order should be: oilTableName, gasTableName -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -surfaceDensities real64_array required List of surface mass densities for each phase -tableFiles path_array {} List of filenames with input PVT tables (one per phase) -waterCompressibility real64 0 Water compressibility -waterFormationVolumeFactor real64 0 Water formation volume factor -waterReferencePressure real64 0 Water reference pressure -waterViscosity real64 0 Water viscosity -======================================= ================== ======== ===================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/BlackOilFluid_other.rst b/src/coreComponents/schema/docs/BlackOilFluid_other.rst deleted file mode 100644 index 0ceddaa556f..00000000000 --- a/src/coreComponents/schema/docs/BlackOilFluid_other.rst +++ /dev/null @@ -1,36 +0,0 @@ - - -=============================== =================================================================================================== ============================================================================================================ -Name Type Description -=============================== =================================================================================================== ============================================================================================================ -PVTO geos_constitutive_PVTOData (no description available) -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -formationVolFactorTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) -hydrocarbonPhaseOrder integer_array (no description available) -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -viscosityTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) -=============================== =================================================================================================== ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/Blueprint.rst b/src/coreComponents/schema/docs/Blueprint.rst deleted file mode 100644 index 13d7114d15c..00000000000 --- a/src/coreComponents/schema/docs/Blueprint.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -======================== ============================= ======== =============================================================== -Name Type Default Description -======================== ============================= ======== =============================================================== -childDirectory string Child directory path -name groupName required A name is required for any non-unique nodes -outputFullQuadratureData integer 0 If true writes out data associated with every quadrature point. -parallelThreads integer 1 Number of plot files. -plotLevel geos_dataRepository_PlotLevel 1 Determines which fields to write. -======================== ============================= ======== =============================================================== - - diff --git a/src/coreComponents/schema/docs/Blueprint_other.rst b/src/coreComponents/schema/docs/Blueprint_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/Blueprint_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Box.rst b/src/coreComponents/schema/docs/Box.rst deleted file mode 100644 index 02f28e2078b..00000000000 --- a/src/coreComponents/schema/docs/Box.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -====== ========= ======== =========================================== -Name Type Default Description -====== ========= ======== =========================================== -name groupName required A name is required for any non-unique nodes -strike real64 -90 The strike angle of the box -xMax R1Tensor required Maximum (x,y,z) coordinates of the box -xMin R1Tensor required Minimum (x,y,z) coordinates of the box -====== ========= ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/Box_other.rst b/src/coreComponents/schema/docs/Box_other.rst deleted file mode 100644 index b24a032b246..00000000000 --- a/src/coreComponents/schema/docs/Box_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -========= ======== ========================== -Name Type Description -========= ======== ========================== -center R1Tensor (no description available) -cosStrike real64 (no description available) -sinStrike real64 (no description available) -========= ======== ========================== - - diff --git a/src/coreComponents/schema/docs/BrooksCoreyBakerRelativePermeability.rst b/src/coreComponents/schema/docs/BrooksCoreyBakerRelativePermeability.rst deleted file mode 100644 index c10a2a48b2f..00000000000 --- a/src/coreComponents/schema/docs/BrooksCoreyBakerRelativePermeability.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -======================= ================== ======== ========================================================================================================================================================== -Name Type Default Description -======================= ================== ======== ========================================================================================================================================================== -gasOilRelPermExponent real64_array {1} | Rel perm power law exponent for the pair (gas phase, oil phase) at residual water saturation - | The expected format is "{ gasExp, oilExp }", in that order -gasOilRelPermMaxValue real64_array {0} | Maximum rel perm value for the pair (gas phase, oil phase) at residual water saturation - | The expected format is "{ gasMax, oilMax }", in that order -name groupName required A name is required for any non-unique nodes -phaseMinVolumeFraction real64_array {0} Minimum volume fraction value for each phase -phaseNames groupNameRef_array required List of fluid phases -waterOilRelPermExponent real64_array {1} | Rel perm power law exponent for the pair (water phase, oil phase) at residual gas saturation - | The expected format is "{ waterExp, oilExp }", in that order -waterOilRelPermMaxValue real64_array {0} | Maximum rel perm value for the pair (water phase, oil phase) at residual gas saturation - | The expected format is "{ waterMax, oilMax }", in that order -======================= ================== ======== ========================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/BrooksCoreyBakerRelativePermeability_other.rst b/src/coreComponents/schema/docs/BrooksCoreyBakerRelativePermeability_other.rst deleted file mode 100644 index e6dd24aeb13..00000000000 --- a/src/coreComponents/schema/docs/BrooksCoreyBakerRelativePermeability_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=============================== ============== ======================================================================================================================= -Name Type Description -=============================== ============== ======================================================================================================================= -dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction -phaseOrder integer_array (no description available) -phaseRelPerm real64_array3d Phase relative permeability -phaseRelPerm_n real64_array3d Phase relative permeability at previous time -phaseTrappedVolFraction real64_array3d Phase trapped volume fraction -phaseTypes integer_array (no description available) -volFracScale real64 Factor used to scale the phase capillary pressure, defined as: one minus the sum of the phase minimum volume fractions. -=============================== ============== ======================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/BrooksCoreyCapillaryPressure.rst b/src/coreComponents/schema/docs/BrooksCoreyCapillaryPressure.rst deleted file mode 100644 index 32e8ddad824..00000000000 --- a/src/coreComponents/schema/docs/BrooksCoreyCapillaryPressure.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -=========================== ================== ======== ============================================================================================================================================== -Name Type Default Description -=========================== ================== ======== ============================================================================================================================================== -capPressureEpsilon real64 1e-06 Wetting-phase saturation at which the max cap. pressure is attained; used to avoid infinite cap. pressure values for saturations close to zero -name groupName required A name is required for any non-unique nodes -phaseCapPressureExponentInv real64_array {2} Inverse of capillary power law exponent for each phase -phaseEntryPressure real64_array {1} Entry pressure value for each phase -phaseMinVolumeFraction real64_array {0} Minimum volume fraction value for each phase -phaseNames groupNameRef_array required List of fluid phases -=========================== ================== ======== ============================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/BrooksCoreyCapillaryPressure_other.rst b/src/coreComponents/schema/docs/BrooksCoreyCapillaryPressure_other.rst deleted file mode 100644 index 336528e2f6f..00000000000 --- a/src/coreComponents/schema/docs/BrooksCoreyCapillaryPressure_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -=================================== ============== ======================================================================================================================= -Name Type Description -=================================== ============== ======================================================================================================================= -dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction -phaseCapPressure real64_array3d Phase capillary pressure -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -volFracScale real64 Factor used to scale the phase capillary pressure, defined as: one minus the sum of the phase minimum volume fractions. -=================================== ============== ======================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/BrooksCoreyRelativePermeability.rst b/src/coreComponents/schema/docs/BrooksCoreyRelativePermeability.rst deleted file mode 100644 index 675393020c0..00000000000 --- a/src/coreComponents/schema/docs/BrooksCoreyRelativePermeability.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -====================== ================== ======== =============================================================== -Name Type Default Description -====================== ================== ======== =============================================================== -name groupName required A name is required for any non-unique nodes -phaseMinVolumeFraction real64_array {0} Minimum volume fraction value for each phase -phaseNames groupNameRef_array required List of fluid phases -phaseRelPermExponent real64_array {1} Minimum relative permeability power law exponent for each phase -phaseRelPermMaxValue real64_array {0} Maximum relative permeability value for each phase -====================== ================== ======== =============================================================== - - diff --git a/src/coreComponents/schema/docs/BrooksCoreyRelativePermeability_other.rst b/src/coreComponents/schema/docs/BrooksCoreyRelativePermeability_other.rst deleted file mode 100644 index d77ac5b3557..00000000000 --- a/src/coreComponents/schema/docs/BrooksCoreyRelativePermeability_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=============================== ============== ========================================================================================================================== -Name Type Description -=============================== ============== ========================================================================================================================== -dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction -phaseOrder integer_array (no description available) -phaseRelPerm real64_array3d Phase relative permeability -phaseRelPerm_n real64_array3d Phase relative permeability at previous time -phaseTrappedVolFraction real64_array3d Phase trapped volume fraction -phaseTypes integer_array (no description available) -volFracScale real64 Factor used to scale the phase relative permeability, defined as: one minus the sum of the phase minimum volume fractions. -=============================== ============== ========================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/BrooksCoreyStone2RelativePermeability.rst b/src/coreComponents/schema/docs/BrooksCoreyStone2RelativePermeability.rst deleted file mode 100644 index c10a2a48b2f..00000000000 --- a/src/coreComponents/schema/docs/BrooksCoreyStone2RelativePermeability.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -======================= ================== ======== ========================================================================================================================================================== -Name Type Default Description -======================= ================== ======== ========================================================================================================================================================== -gasOilRelPermExponent real64_array {1} | Rel perm power law exponent for the pair (gas phase, oil phase) at residual water saturation - | The expected format is "{ gasExp, oilExp }", in that order -gasOilRelPermMaxValue real64_array {0} | Maximum rel perm value for the pair (gas phase, oil phase) at residual water saturation - | The expected format is "{ gasMax, oilMax }", in that order -name groupName required A name is required for any non-unique nodes -phaseMinVolumeFraction real64_array {0} Minimum volume fraction value for each phase -phaseNames groupNameRef_array required List of fluid phases -waterOilRelPermExponent real64_array {1} | Rel perm power law exponent for the pair (water phase, oil phase) at residual gas saturation - | The expected format is "{ waterExp, oilExp }", in that order -waterOilRelPermMaxValue real64_array {0} | Maximum rel perm value for the pair (water phase, oil phase) at residual gas saturation - | The expected format is "{ waterMax, oilMax }", in that order -======================= ================== ======== ========================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/BrooksCoreyStone2RelativePermeability_other.rst b/src/coreComponents/schema/docs/BrooksCoreyStone2RelativePermeability_other.rst deleted file mode 100644 index e6dd24aeb13..00000000000 --- a/src/coreComponents/schema/docs/BrooksCoreyStone2RelativePermeability_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=============================== ============== ======================================================================================================================= -Name Type Description -=============================== ============== ======================================================================================================================= -dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction -phaseOrder integer_array (no description available) -phaseRelPerm real64_array3d Phase relative permeability -phaseRelPerm_n real64_array3d Phase relative permeability at previous time -phaseTrappedVolFraction real64_array3d Phase trapped volume fraction -phaseTypes integer_array (no description available) -volFracScale real64 Factor used to scale the phase capillary pressure, defined as: one minus the sum of the phase minimum volume fractions. -=============================== ============== ======================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid.rst b/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid.rst deleted file mode 100644 index 8d5cb05986a..00000000000 --- a/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -==================== ================== ======== ============================================================================================================ -Name Type Default Description -==================== ================== ======== ============================================================================================================ -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentMolarWeight real64_array {0} Component molar weights -componentNames string_array {} List of component names -flashModelParaFile path Name of the file defining the parameters of the flash model -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array {} List of fluid phases -phasePVTParaFiles path_array required Names of the files defining the parameters of the viscosity and density models -solubilityTableNames string_array {} Names of solubility tables for each phase -==================== ================== ======== ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst b/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst deleted file mode 100644 index 28636011f61..00000000000 --- a/src/coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst +++ /dev/null @@ -1,30 +0,0 @@ - - -===================== ========================================================================================= ============================================================================================================ -Name Type Description -===================== ========================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ========================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid.rst b/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid.rst deleted file mode 100644 index 8d5cb05986a..00000000000 --- a/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -==================== ================== ======== ============================================================================================================ -Name Type Default Description -==================== ================== ======== ============================================================================================================ -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentMolarWeight real64_array {0} Component molar weights -componentNames string_array {} List of component names -flashModelParaFile path Name of the file defining the parameters of the flash model -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array {} List of fluid phases -phasePVTParaFiles path_array required Names of the files defining the parameters of the viscosity and density models -solubilityTableNames string_array {} Names of solubility tables for each phase -==================== ================== ======== ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst b/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst deleted file mode 100644 index 28636011f61..00000000000 --- a/src/coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst +++ /dev/null @@ -1,30 +0,0 @@ - - -===================== ========================================================================================= ============================================================================================================ -Name Type Description -===================== ========================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ========================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CO2BrinePhillipsFluid.rst b/src/coreComponents/schema/docs/CO2BrinePhillipsFluid.rst deleted file mode 100644 index 8d5cb05986a..00000000000 --- a/src/coreComponents/schema/docs/CO2BrinePhillipsFluid.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -==================== ================== ======== ============================================================================================================ -Name Type Default Description -==================== ================== ======== ============================================================================================================ -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentMolarWeight real64_array {0} Component molar weights -componentNames string_array {} List of component names -flashModelParaFile path Name of the file defining the parameters of the flash model -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array {} List of fluid phases -phasePVTParaFiles path_array required Names of the files defining the parameters of the viscosity and density models -solubilityTableNames string_array {} Names of solubility tables for each phase -==================== ================== ======== ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst b/src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst deleted file mode 100644 index 28636011f61..00000000000 --- a/src/coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst +++ /dev/null @@ -1,30 +0,0 @@ - - -===================== ========================================================================================= ============================================================================================================ -Name Type Description -===================== ========================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ========================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid.rst b/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid.rst deleted file mode 100644 index 8d5cb05986a..00000000000 --- a/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -==================== ================== ======== ============================================================================================================ -Name Type Default Description -==================== ================== ======== ============================================================================================================ -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentMolarWeight real64_array {0} Component molar weights -componentNames string_array {} List of component names -flashModelParaFile path Name of the file defining the parameters of the flash model -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array {} List of fluid phases -phasePVTParaFiles path_array required Names of the files defining the parameters of the viscosity and density models -solubilityTableNames string_array {} Names of solubility tables for each phase -==================== ================== ======== ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst b/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst deleted file mode 100644 index 28636011f61..00000000000 --- a/src/coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst +++ /dev/null @@ -1,30 +0,0 @@ - - -===================== ========================================================================================= ============================================================================================================ -Name Type Description -===================== ========================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ========================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CarmanKozenyPermeability.rst b/src/coreComponents/schema/docs/CarmanKozenyPermeability.rst deleted file mode 100644 index 5bda6c4bfbc..00000000000 --- a/src/coreComponents/schema/docs/CarmanKozenyPermeability.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================ ========= ======== ===================================================== -Name Type Default Description -================ ========= ======== ===================================================== -anisotropy R1Tensor {1,1,1} Anisotropy factors for three permeability components. -name groupName required A name is required for any non-unique nodes -particleDiameter real64 required Diameter of the spherical particles. -sphericity real64 required Sphericity of the particles. -================ ========= ======== ===================================================== - - diff --git a/src/coreComponents/schema/docs/CarmanKozenyPermeability_other.rst b/src/coreComponents/schema/docs/CarmanKozenyPermeability_other.rst deleted file mode 100644 index 3e91e0e04e9..00000000000 --- a/src/coreComponents/schema/docs/CarmanKozenyPermeability_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -=============== ============== ======================================================== -Name Type Description -=============== ============== ======================================================== -dPerm_dPorosity real64_array3d (no description available) -dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure -permeability real64_array3d Rock permeability -=============== ============== ======================================================== - - diff --git a/src/coreComponents/schema/docs/CellElementRegion.rst b/src/coreComponents/schema/docs/CellElementRegion.rst deleted file mode 100644 index 7c773016b98..00000000000 --- a/src/coreComponents/schema/docs/CellElementRegion.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -=============== ================== ======== =========================================== -Name Type Default Description -=============== ================== ======== =========================================== -cellBlocks groupNameRef_array required (no description available) -coarseningRatio real64 0 (no description available) -materialList groupNameRef_array required List of materials present in this region -meshBody groupNameRef Mesh body that contains this region -name groupName required A name is required for any non-unique nodes -=============== ================== ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/CellElementRegion_other.rst b/src/coreComponents/schema/docs/CellElementRegion_other.rst deleted file mode 100644 index 747768b410c..00000000000 --- a/src/coreComponents/schema/docs/CellElementRegion_other.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -======================= ================================================================= ========================================================= -Name Type Description -======================= ================================================================= ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ================================================================= ========================================================= - - diff --git a/src/coreComponents/schema/docs/CellToCellDataCollection.rst b/src/coreComponents/schema/docs/CellToCellDataCollection.rst deleted file mode 100644 index 90337122674..00000000000 --- a/src/coreComponents/schema/docs/CellToCellDataCollection.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============== ============ ======== =================================================== -Name Type Default Description -============== ============ ======== =================================================== -flowSolverName groupNameRef required Name of the flow solver, to get the permeabilities. -logLevel integer 0 When higher than 1: Display store events details. -meshBody groupNameRef required Name of the target -name groupName required A name is required for any non-unique nodes -============== ============ ======== =================================================== - - diff --git a/src/coreComponents/schema/docs/CellToCellDataCollection_other.rst b/src/coreComponents/schema/docs/CellToCellDataCollection_other.rst deleted file mode 100644 index 4b1a6106d81..00000000000 --- a/src/coreComponents/schema/docs/CellToCellDataCollection_other.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================== ================= ========================== -Name Type Description -================== ================= ========================== -cellAGlobalId globalIndex_array (no description available) -cellBGlobalId globalIndex_array (no description available) -transmissibilityAB real64_array (no description available) -transmissibilityBA real64_array (no description available) -================== ================= ========================== - - diff --git a/src/coreComponents/schema/docs/CeramicDamage.rst b/src/coreComponents/schema/docs/CeramicDamage.rst deleted file mode 100644 index fa671dd48bc..00000000000 --- a/src/coreComponents/schema/docs/CeramicDamage.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -======================= ========= ======== ==================================================================== -Name Type Default Description -======================= ========= ======== ==================================================================== -compressiveStrength real64 required Compressive strength -crackSpeed real64 required Crack speed -defaultBulkModulus real64 -1 Default Bulk Modulus Parameter -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultPoissonRatio real64 -1 Default Poisson's Ratio -defaultShearModulus real64 -1 Default Shear Modulus Parameter -defaultYoungModulus real64 -1 Default Young's Modulus -maximumStrength real64 required Maximum theoretical strength -name groupName required A name is required for any non-unique nodes -tensileStrength real64 required Tensile strength -======================= ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/CeramicDamage_other.rst b/src/coreComponents/schema/docs/CeramicDamage_other.rst deleted file mode 100644 index 4614da5bcc8..00000000000 --- a/src/coreComponents/schema/docs/CeramicDamage_other.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -bulkModulus real64_array Elastic Bulk Modulus Field -damage real64_array2d Array of quadrature point damage values -density real64_array2d Material Density -jacobian real64_array2d Array of quadrature point jacobian values -lengthScale real64_array Array of quadrature point damage values -oldStress real64_array3d Previous Material Stress -shearModulus real64_array Elastic Shear Modulus Field -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/ChomboIO.rst b/src/coreComponents/schema/docs/ChomboIO.rst deleted file mode 100644 index 4bce4a9f5f9..00000000000 --- a/src/coreComponents/schema/docs/ChomboIO.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -================== ========= =================== ============================================================================================== -Name Type Default Description -================== ========= =================== ============================================================================================== -beginCycle real64 required Cycle at which the coupling will commence. -childDirectory string Child directory path -inputPath string /INVALID_INPUT_PATH Path at which the chombo to geos file will be written. -name groupName required A name is required for any non-unique nodes -outputPath string required Path at which the geos to chombo file will be written. -parallelThreads integer 1 Number of plot files. -useChomboPressures integer 0 True iff geos should use the pressures chombo writes out. -waitForInput integer required True iff geos should wait for chombo to write out a file. When true the inputPath must be set. -================== ========= =================== ============================================================================================== - - diff --git a/src/coreComponents/schema/docs/ChomboIO_other.rst b/src/coreComponents/schema/docs/ChomboIO_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/ChomboIO_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/CompositeFunction.rst b/src/coreComponents/schema/docs/CompositeFunction.rst deleted file mode 100644 index 81bfb601d57..00000000000 --- a/src/coreComponents/schema/docs/CompositeFunction.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============= ================== ======== ========================================================================== -Name Type Default Description -============= ================== ======== ========================================================================== -expression string Composite math expression -functionNames string_array {} List of source functions. The order must match the variableNames argument. -inputVarNames groupNameRef_array {} Name of fields are input to function. -name groupName required A name is required for any non-unique nodes -variableNames groupNameRef_array {} List of variables in expression -============= ================== ======== ========================================================================== - - diff --git a/src/coreComponents/schema/docs/CompositeFunction_other.rst b/src/coreComponents/schema/docs/CompositeFunction_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/CompositeFunction_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst deleted file mode 100644 index 9879256818e..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM.rst +++ /dev/null @@ -1,49 +0,0 @@ - - -========================================= =========================================== ============ ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================================= =========================================== ============ ======================================================================================================================================================================================================================================================================================================================== -allowLocalCompDensityChopping integer 1 Flag indicating whether local (cell-wise) chopping of negative compositions is allowed -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contMultiplierDBC real64 0.5 Factor by which continuation parameter is changed every newton when DBC is used -continuationDBC integer 1 Flag for enabling continuation parameter -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -kappaminDBC real64 1e-20 Factor that controls how much dissipation is kept in the system when continuation is used -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxCompFractionChange real64 0.5 Maximum (absolute) change in a component fraction in a Newton iteration -maxRelativeCompDensChange real64 1.79769e+208 Maximum (relative) change in a component density in a Newton iteration -maxRelativePressureChange real64 0.5 Maximum (relative) change in pressure in a Newton iteration -maxRelativeTemperatureChange real64 0.5 Maximum (relative) change in temperature in a Newton iteration -maxSequentialCompDensChange real64 1 Maximum (absolute) component density change in a sequential iteration, used for outer loop convergence check -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -minCompDens real64 1e-10 Minimum allowed global component density -minScalingFactor real64 0.01 Minimum value for solution scaling factor -miscibleDBC integer 0 Flag for enabling DBC formulation with/without miscibility -name groupName required A name is required for any non-unique nodes -omegaDBC real64 1 Factor by which DBC flux is multiplied -scalingType geos_CompositionalMultiphaseFVM_ScalingType Global | Solution scaling type.Valid options: - | * Global - | * Local -solutionChangeScalingFactor real64 0.5 Damping factor for solution change targets -targetFlowCFL real64 -1 Target CFL condition `CFL condition `_ when computing the next timestep. -targetPhaseVolFractionChangeInTimeStep real64 0.2 Target (absolute) change in phase volume fraction in a time step -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -targetRelativeCompDensChangeInTimeStep real64 1.79769e+308 Target (relative) change in component density in a time step -targetRelativePressureChangeInTimeStep real64 0.2 Target (relative) change in pressure in a time step (expected value between 0 and 1) -targetRelativeTemperatureChangeInTimeStep real64 0.2 Target (relative) change in temperature in a time step (expected value between 0 and 1) -temperature real64 required Temperature -useDBC integer 0 Enable Dissipation-based continuation flux -useMass integer 0 Use mass formulation instead of molar. Warning : Affects SourceFlux rates units. -useSimpleAccumulation integer 1 Flag indicating whether simple accumulation form is used -useTotalMassEquation integer 1 Flag indicating whether total mass equation is used -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================================= =========================================== ============ ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst deleted file mode 100644 index f296d4de732..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================================ -Name Type Description -========================= ====================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================================ - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst deleted file mode 100644 index dab7f7ffa9f..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -============================ ================== ======== ============================================================================================================ -Name Type Default Description -============================ ================== ======== ============================================================================================================ -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentAcentricFactor real64_array required Component acentric factors -componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients -componentCriticalPressure real64_array required Component critical pressures -componentCriticalTemperature real64_array required Component critical temperatures -componentMolarWeight real64_array required Component molar weights -componentNames string_array required List of component names -componentVolumeShift real64_array {0} Component volume shifts -constantPhaseViscosity real64_array {0} Viscosity for each phase -equationsOfState string_array required List of equation of state types for each phase -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -============================ ================== ======== ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst deleted file mode 100644 index 28636011f61..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst +++ /dev/null @@ -1,30 +0,0 @@ - - -===================== ========================================================================================= ============================================================================================================ -Name Type Description -===================== ========================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ========================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst deleted file mode 100644 index bd913f8f271..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst +++ /dev/null @@ -1,40 +0,0 @@ - - -========================================= ================== ============ ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================================= ================== ============ ======================================================================================================================================================================================================================================================================================================================== -allowLocalCompDensityChopping integer 1 Flag indicating whether local (cell-wise) chopping of negative compositions is allowed -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxCompFractionChange real64 0.5 Maximum (absolute) change in a component fraction in a Newton iteration -maxRelativeCompDensChange real64 1.79769e+208 Maximum (relative) change in a component density in a Newton iteration -maxRelativePressureChange real64 0.5 Maximum (relative) change in pressure in a Newton iteration -maxRelativeTemperatureChange real64 0.5 Maximum (relative) change in temperature in a Newton iteration -maxSequentialCompDensChange real64 1 Maximum (absolute) component density change in a sequential iteration, used for outer loop convergence check -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -minCompDens real64 1e-10 Minimum allowed global component density -minScalingFactor real64 0.01 Minimum value for solution scaling factor -name groupName required A name is required for any non-unique nodes -solutionChangeScalingFactor real64 0.5 Damping factor for solution change targets -targetFlowCFL real64 -1 Target CFL condition `CFL condition `_ when computing the next timestep. -targetPhaseVolFractionChangeInTimeStep real64 0.2 Target (absolute) change in phase volume fraction in a time step -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -targetRelativeCompDensChangeInTimeStep real64 1.79769e+308 Target (relative) change in component density in a time step -targetRelativePressureChangeInTimeStep real64 0.2 Target (relative) change in pressure in a time step (expected value between 0 and 1) -targetRelativeTemperatureChangeInTimeStep real64 0.2 Target (relative) change in temperature in a time step (expected value between 0 and 1) -temperature real64 required Temperature -useMass integer 0 Use mass formulation instead of molar. Warning : Affects SourceFlux rates units. -useSimpleAccumulation integer 1 Flag indicating whether simple accumulation form is used -useTotalMassEquation integer 1 Flag indicating whether total mass equation is used -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================================= ================== ============ ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst deleted file mode 100644 index 2944d71993d..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================ ================================================================ -Name Type Registered On Description -========================= ====================================================================================================================================================== ================================ ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -facePressure_n real64_array :ref:`DATASTRUCTURE_faceManager` Face pressure at the previous converged time step -mimGravityCoefficient real64_array :ref:`DATASTRUCTURE_faceManager` Mimetic gravity coefficient -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================ ================================================================ - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir.rst deleted file mode 100644 index 9b67dda6230..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -wellSolverName groupNameRef required Name of the well solver used by the coupled solver -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics.rst deleted file mode 100644 index 6ec494e2d08..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -=========================== ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -=========================== ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -reservoirAndWellsSolverName groupNameRef required Name of the reservoirAndWells solver used by the coupled solver -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -stabilizationMultiplier real64 1 Constant multiplier of stabilization strength -stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. -stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: - | None- Add no stabilization to mass equation - | Global- Add jump stabilization to all faces - | Local- Add jump stabilization on interior of macro elements -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -=========================== ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst deleted file mode 100644 index 18e3a0dd9e7..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst deleted file mode 100644 index dc33be0a036..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst deleted file mode 100644 index cccf4603c70..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseStatistics.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseStatistics.rst deleted file mode 100644 index 4a386d1d1c3..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseStatistics.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -======================= ============ ======== =============================================================================================================================================================== -Name Type Default Description -======================= ============ ======== =============================================================================================================================================================== -computeCFLNumbers integer 0 Flag to decide whether CFL numbers are computed or not -computeRegionStatistics integer 1 Flag to decide whether region statistics are computed or not -flowSolverName groupNameRef required Name of the flow solver -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -relpermThreshold real64 1e-06 Flag to decide whether a phase is considered mobile (when the relperm is above the threshold) or immobile (when the relperm is below the threshold) in metric 2 -writeCSV integer 0 Write statistics into a CSV file -======================= ============ ======== =============================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseStatistics_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseStatistics_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseStatistics_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst deleted file mode 100644 index d484d65a68b..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseWell.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -============================= ================== ============ ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================= ================== ============ ====================================================================================================================================================================================================================================================================================================================== -allowLocalCompDensityChopping integer 1 Flag indicating whether local (cell-wise) chopping of negative compositions is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxCompFractionChange real64 1 Maximum (absolute) change in a component fraction between two Newton iterations -maxRelativeCompDensChange real64 1.79769e+208 Maximum (relative) change in a component density between two Newton iterations -maxRelativePressureChange real64 1 Maximum (relative) change in pressure between two Newton iterations (recommended with rate control) -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -useMass integer 0 Use mass formulation instead of molar -useTotalMassEquation integer 1 Use total mass equation -writeCSV integer 0 Write rates into a CSV file -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -WellControls node :ref:`XML_WellControls` -============================= ================== ============ ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst b/src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst deleted file mode 100644 index f2c739b92d8..00000000000 --- a/src/coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -WellControls node :ref:`DATASTRUCTURE_WellControls` -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst deleted file mode 100644 index c4f2fe1194c..00000000000 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst +++ /dev/null @@ -1,23 +0,0 @@ - - -============================ ================== ======== ============================================================================================================ -Name Type Default Description -============================ ================== ======== ============================================================================================================ -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentAcentricFactor real64_array required Component acentric factors -componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients -componentCriticalPressure real64_array required Component critical pressures -componentCriticalTemperature real64_array required Component critical temperatures -componentCriticalVolume real64_array {0} Component critical volumes -componentMolarWeight real64_array required Component molar weights -componentNames string_array required List of component names -componentVolumeShift real64_array {0} Component volume shifts -constantPhaseViscosity real64_array {0} Constant phase viscosity -equationsOfState string_array required | List of equation of state types for each phase. Valid options: - | * pr - | * srk -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -============================ ================== ======== ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark.rst deleted file mode 100644 index 7e0e2716d63..00000000000 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark.rst +++ /dev/null @@ -1,26 +0,0 @@ - - -============================ ================== =============== ========================================================================================================================= -Name Type Default Description -============================ ================== =============== ========================================================================================================================= -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentAcentricFactor real64_array required Component acentric factors -componentBinaryCoeff real64_array2d {{0}} Table of binary interaction coefficients -componentCriticalPressure real64_array required Component critical pressures -componentCriticalTemperature real64_array required Component critical temperatures -componentCriticalVolume real64_array {0} Component critical volumes -componentMolarWeight real64_array required Component molar weights -componentNames string_array required List of component names -componentVolumeShift real64_array {0} Component volume shifts -equationsOfState string_array required | List of equation of state types for each phase. Valid options: - | * pr - | * srk -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -viscosityMixingRule string HerningZipperer | Viscosity mixing rule to be used for Lohrenz-Bray-Clark computation. Valid options: - | * HerningZipperer - | * Wilke - | * Brokaw -============================ ================== =============== ========================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark_other.rst deleted file mode 100644 index c8f51e2b3c9..00000000000 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark_other.rst +++ /dev/null @@ -1,31 +0,0 @@ - - -===================== ========================================================================================= ============================================================================================================ -Name Type Description -===================== ========================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -kValues real64_array4d Phase equilibrium ratios -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ========================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid_other.rst b/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid_other.rst deleted file mode 100644 index c8f51e2b3c9..00000000000 --- a/src/coreComponents/schema/docs/CompositionalTwoPhaseFluid_other.rst +++ /dev/null @@ -1,31 +0,0 @@ - - -===================== ========================================================================================= ============================================================================================================ -Name Type Description -===================== ========================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -kValues real64_array4d Phase equilibrium ratios -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -===================== ========================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/CompressibleSinglePhaseFluid.rst b/src/coreComponents/schema/docs/CompressibleSinglePhaseFluid.rst deleted file mode 100644 index bdba4fedb0b..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSinglePhaseFluid.rst +++ /dev/null @@ -1,24 +0,0 @@ - - -================== =========================================== ======== ============================================================================= -Name Type Default Description -================== =========================================== ======== ============================================================================= -compressibility real64 0 Fluid compressibility -defaultDensity real64 required Default value for density. -defaultViscosity real64 required Default value for viscosity. -densityModelType geos_constitutive_ExponentApproximationType linear | Type of density model. Valid options: - | * exponential - | * linear - | * quadratic -name groupName required A name is required for any non-unique nodes -referenceDensity real64 1000 Reference fluid density -referencePressure real64 0 Reference pressure -referenceViscosity real64 0.001 Reference fluid viscosity -viscosibility real64 0 Fluid viscosity exponential coefficient -viscosityModelType geos_constitutive_ExponentApproximationType linear | Type of viscosity model. Valid options: - | * exponential - | * linear - | * quadratic -================== =========================================== ======== ============================================================================= - - diff --git a/src/coreComponents/schema/docs/CompressibleSinglePhaseFluid_other.rst b/src/coreComponents/schema/docs/CompressibleSinglePhaseFluid_other.rst deleted file mode 100644 index 53255e66ebc..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSinglePhaseFluid_other.rst +++ /dev/null @@ -1,22 +0,0 @@ - - -============================ ============== ========================================================= -Name Type Description -============================ ============== ========================================================= -dDensity_dPressure real64_array2d Derivative of density with respect to pressure -dDensity_dTemperature real64_array2d Derivative of density with respect to temperature -dEnthalpy_dPressure real64_array2d Derivative of enthalpy with respect to pressure -dEnthalpy_dTemperature real64_array2d Derivative of enthalpy with respect to temperature -dInternalEnergy_dPressure real64_array2d Derivative of internal energy with respect to pressure -dInternalEnergy_dTemperature real64_array2d Derivative of internal energy with respect to temperature -dViscosity_dPressure real64_array2d Derivative of viscosity with respect to pressure -dViscosity_dTemperature real64_array2d Derivative of viscosity with respect to temperature -density real64_array2d Density -density_n real64_array2d Density at the previous converged time step -enthalpy real64_array2d Enthalpy -internalEnergy real64_array2d Internal energy -internalEnergy_n real64_array2d Fluid internal energy at the previous converged step -viscosity real64_array2d Viscosity -============================ ============== ========================================================= - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidCarmanKozenyPermeability.rst b/src/coreComponents/schema/docs/CompressibleSolidCarmanKozenyPermeability.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidCarmanKozenyPermeability.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidCarmanKozenyPermeability_other.rst b/src/coreComponents/schema/docs/CompressibleSolidCarmanKozenyPermeability_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidCarmanKozenyPermeability_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidConstantPermeability.rst b/src/coreComponents/schema/docs/CompressibleSolidConstantPermeability.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidConstantPermeability.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidConstantPermeability_other.rst b/src/coreComponents/schema/docs/CompressibleSolidConstantPermeability_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidConstantPermeability_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidExponentialDecayPermeability.rst b/src/coreComponents/schema/docs/CompressibleSolidExponentialDecayPermeability.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidExponentialDecayPermeability.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidExponentialDecayPermeability_other.rst b/src/coreComponents/schema/docs/CompressibleSolidExponentialDecayPermeability_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidExponentialDecayPermeability_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability.rst b/src/coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability_other.rst b/src/coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst b/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst b/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidSlipDependentPermeability.rst b/src/coreComponents/schema/docs/CompressibleSolidSlipDependentPermeability.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidSlipDependentPermeability.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidSlipDependentPermeability_other.rst b/src/coreComponents/schema/docs/CompressibleSolidSlipDependentPermeability_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidSlipDependentPermeability_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidWillisRichardsPermeability.rst b/src/coreComponents/schema/docs/CompressibleSolidWillisRichardsPermeability.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidWillisRichardsPermeability.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/CompressibleSolidWillisRichardsPermeability_other.rst b/src/coreComponents/schema/docs/CompressibleSolidWillisRichardsPermeability_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/CompressibleSolidWillisRichardsPermeability_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/ConstantDiffusion.rst b/src/coreComponents/schema/docs/ConstantDiffusion.rst deleted file mode 100644 index 4b1d8180c32..00000000000 --- a/src/coreComponents/schema/docs/ConstantDiffusion.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================================== ============ ======== ========================================================= -Name Type Default Description -================================== ============ ======== ========================================================= -defaultPhaseDiffusivityMultipliers real64_array {1} List of phase diffusivity multipliers -diffusivityComponents real64_array required xx, yy, and zz components of a diffusivity tensor [m^2/s] -name groupName required A name is required for any non-unique nodes -phaseNames string_array required List of fluid phases -================================== ============ ======== ========================================================= - - diff --git a/src/coreComponents/schema/docs/ConstantDiffusion_other.rst b/src/coreComponents/schema/docs/ConstantDiffusion_other.rst deleted file mode 100644 index 1879103f909..00000000000 --- a/src/coreComponents/schema/docs/ConstantDiffusion_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -========================== ============== ====================================================== -Name Type Description -========================== ============== ====================================================== -dDiffusivity_dTemperature real64_array3d Derivatives of diffusivity with respect to temperature -diffusivity real64_array3d Diffusivity -phaseDiffusivityMultiplier real64_array3d Phase multipliers for the diffusivity coefficients -========================== ============== ====================================================== - - diff --git a/src/coreComponents/schema/docs/ConstantPermeability.rst b/src/coreComponents/schema/docs/ConstantPermeability.rst deleted file mode 100644 index dc2314ec8db..00000000000 --- a/src/coreComponents/schema/docs/ConstantPermeability.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -====================== ========= ======== =========================================================== -Name Type Default Description -====================== ========= ======== =========================================================== -name groupName required A name is required for any non-unique nodes -permeabilityComponents R1Tensor required xx, yy and zz components of a diagonal permeability tensor. -====================== ========= ======== =========================================================== - - diff --git a/src/coreComponents/schema/docs/ConstantPermeability_other.rst b/src/coreComponents/schema/docs/ConstantPermeability_other.rst deleted file mode 100644 index fa997a57413..00000000000 --- a/src/coreComponents/schema/docs/ConstantPermeability_other.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -=============== ============== ======================================================== -Name Type Description -=============== ============== ======================================================== -dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure -permeability real64_array3d Rock permeability -=============== ============== ======================================================== - - diff --git a/src/coreComponents/schema/docs/Constitutive.rst b/src/coreComponents/schema/docs/Constitutive.rst deleted file mode 100644 index 6f5e6d38dd0..00000000000 --- a/src/coreComponents/schema/docs/Constitutive.rst +++ /dev/null @@ -1,92 +0,0 @@ - - -============================================= ==== ======= ======================================================== -Name Type Default Description -============================================= ==== ======= ======================================================== -BiotPorosity node :ref:`XML_BiotPorosity` -BlackOilFluid node :ref:`XML_BlackOilFluid` -BrooksCoreyBakerRelativePermeability node :ref:`XML_BrooksCoreyBakerRelativePermeability` -BrooksCoreyCapillaryPressure node :ref:`XML_BrooksCoreyCapillaryPressure` -BrooksCoreyRelativePermeability node :ref:`XML_BrooksCoreyRelativePermeability` -BrooksCoreyStone2RelativePermeability node :ref:`XML_BrooksCoreyStone2RelativePermeability` -CO2BrineEzrokhiFluid node :ref:`XML_CO2BrineEzrokhiFluid` -CO2BrineEzrokhiThermalFluid node :ref:`XML_CO2BrineEzrokhiThermalFluid` -CO2BrinePhillipsFluid node :ref:`XML_CO2BrinePhillipsFluid` -CO2BrinePhillipsThermalFluid node :ref:`XML_CO2BrinePhillipsThermalFluid` -CarmanKozenyPermeability node :ref:`XML_CarmanKozenyPermeability` -CeramicDamage node :ref:`XML_CeramicDamage` -CompositionalMultiphaseFluid node :ref:`XML_CompositionalMultiphaseFluid` -CompositionalTwoPhaseFluid node :ref:`XML_CompositionalTwoPhaseFluid` -CompositionalTwoPhaseFluidLohrenzBrayClark node :ref:`XML_CompositionalTwoPhaseFluidLohrenzBrayClark` -CompressibleSinglePhaseFluid node :ref:`XML_CompressibleSinglePhaseFluid` -CompressibleSolidCarmanKozenyPermeability node :ref:`XML_CompressibleSolidCarmanKozenyPermeability` -CompressibleSolidConstantPermeability node :ref:`XML_CompressibleSolidConstantPermeability` -CompressibleSolidExponentialDecayPermeability node :ref:`XML_CompressibleSolidExponentialDecayPermeability` -CompressibleSolidParallelPlatesPermeability node :ref:`XML_CompressibleSolidParallelPlatesPermeability` -CompressibleSolidPressurePermeability node :ref:`XML_CompressibleSolidPressurePermeability` -CompressibleSolidSlipDependentPermeability node :ref:`XML_CompressibleSolidSlipDependentPermeability` -CompressibleSolidWillisRichardsPermeability node :ref:`XML_CompressibleSolidWillisRichardsPermeability` -ConstantDiffusion node :ref:`XML_ConstantDiffusion` -ConstantPermeability node :ref:`XML_ConstantPermeability` -Coulomb node :ref:`XML_Coulomb` -DamageElasticIsotropic node :ref:`XML_DamageElasticIsotropic` -DamageSpectralElasticIsotropic node :ref:`XML_DamageSpectralElasticIsotropic` -DamageVolDevElasticIsotropic node :ref:`XML_DamageVolDevElasticIsotropic` -DeadOilFluid node :ref:`XML_DeadOilFluid` -DelftEgg node :ref:`XML_DelftEgg` -DruckerPrager node :ref:`XML_DruckerPrager` -ElasticIsotropic node :ref:`XML_ElasticIsotropic` -ElasticIsotropicPressureDependent node :ref:`XML_ElasticIsotropicPressureDependent` -ElasticOrthotropic node :ref:`XML_ElasticOrthotropic` -ElasticTransverseIsotropic node :ref:`XML_ElasticTransverseIsotropic` -ExponentialDecayPermeability node :ref:`XML_ExponentialDecayPermeability` -ExtendedDruckerPrager node :ref:`XML_ExtendedDruckerPrager` -FrictionlessContact node :ref:`XML_FrictionlessContact` -HydraulicApertureTable node :ref:`XML_HydraulicApertureTable` -JFunctionCapillaryPressure node :ref:`XML_JFunctionCapillaryPressure` -LinearIsotropicDispersion node :ref:`XML_LinearIsotropicDispersion` -ModifiedCamClay node :ref:`XML_ModifiedCamClay` -MultiPhaseConstantThermalConductivity node :ref:`XML_MultiPhaseConstantThermalConductivity` -MultiPhaseVolumeWeightedThermalConductivity node :ref:`XML_MultiPhaseVolumeWeightedThermalConductivity` -NullModel node :ref:`XML_NullModel` -ParallelPlatesPermeability node :ref:`XML_ParallelPlatesPermeability` -ParticleFluid node :ref:`XML_ParticleFluid` -PerfectlyPlastic node :ref:`XML_PerfectlyPlastic` -PorousDamageElasticIsotropic node :ref:`XML_PorousDamageElasticIsotropic` -PorousDamageSpectralElasticIsotropic node :ref:`XML_PorousDamageSpectralElasticIsotropic` -PorousDamageVolDevElasticIsotropic node :ref:`XML_PorousDamageVolDevElasticIsotropic` -PorousDelftEgg node :ref:`XML_PorousDelftEgg` -PorousDruckerPrager node :ref:`XML_PorousDruckerPrager` -PorousElasticIsotropic node :ref:`XML_PorousElasticIsotropic` -PorousElasticOrthotropic node :ref:`XML_PorousElasticOrthotropic` -PorousElasticTransverseIsotropic node :ref:`XML_PorousElasticTransverseIsotropic` -PorousExtendedDruckerPrager node :ref:`XML_PorousExtendedDruckerPrager` -PorousModifiedCamClay node :ref:`XML_PorousModifiedCamClay` -PorousViscoDruckerPrager node :ref:`XML_PorousViscoDruckerPrager` -PorousViscoExtendedDruckerPrager node :ref:`XML_PorousViscoExtendedDruckerPrager` -PorousViscoModifiedCamClay node :ref:`XML_PorousViscoModifiedCamClay` -PressurePermeability node :ref:`XML_PressurePermeability` -PressurePorosity node :ref:`XML_PressurePorosity` -ProppantPermeability node :ref:`XML_ProppantPermeability` -ProppantPorosity node :ref:`XML_ProppantPorosity` -ProppantSlurryFluid node :ref:`XML_ProppantSlurryFluid` -ProppantSolidProppantPermeability node :ref:`XML_ProppantSolidProppantPermeability` -ReactiveBrine node :ref:`XML_ReactiveBrine` -ReactiveBrineThermal node :ref:`XML_ReactiveBrineThermal` -SinglePhaseThermalConductivity node :ref:`XML_SinglePhaseThermalConductivity` -SlipDependentPermeability node :ref:`XML_SlipDependentPermeability` -SolidInternalEnergy node :ref:`XML_SolidInternalEnergy` -TableCapillaryPressure node :ref:`XML_TableCapillaryPressure` -TableRelativePermeability node :ref:`XML_TableRelativePermeability` -TableRelativePermeabilityHysteresis node :ref:`XML_TableRelativePermeabilityHysteresis` -ThermalCompressibleSinglePhaseFluid node :ref:`XML_ThermalCompressibleSinglePhaseFluid` -VanGenuchtenBakerRelativePermeability node :ref:`XML_VanGenuchtenBakerRelativePermeability` -VanGenuchtenCapillaryPressure node :ref:`XML_VanGenuchtenCapillaryPressure` -VanGenuchtenStone2RelativePermeability node :ref:`XML_VanGenuchtenStone2RelativePermeability` -ViscoDruckerPrager node :ref:`XML_ViscoDruckerPrager` -ViscoExtendedDruckerPrager node :ref:`XML_ViscoExtendedDruckerPrager` -ViscoModifiedCamClay node :ref:`XML_ViscoModifiedCamClay` -WillisRichardsPermeability node :ref:`XML_WillisRichardsPermeability` -============================================= ==== ======= ======================================================== - - diff --git a/src/coreComponents/schema/docs/ConstitutiveModels_other.rst b/src/coreComponents/schema/docs/ConstitutiveModels_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/ConstitutiveModels_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Constitutive_other.rst b/src/coreComponents/schema/docs/Constitutive_other.rst deleted file mode 100644 index e9d48fcdcfc..00000000000 --- a/src/coreComponents/schema/docs/Constitutive_other.rst +++ /dev/null @@ -1,92 +0,0 @@ - - -============================================= ==== ================================================================== -Name Type Description -============================================= ==== ================================================================== -BiotPorosity node :ref:`DATASTRUCTURE_BiotPorosity` -BlackOilFluid node :ref:`DATASTRUCTURE_BlackOilFluid` -BrooksCoreyBakerRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyBakerRelativePermeability` -BrooksCoreyCapillaryPressure node :ref:`DATASTRUCTURE_BrooksCoreyCapillaryPressure` -BrooksCoreyRelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyRelativePermeability` -BrooksCoreyStone2RelativePermeability node :ref:`DATASTRUCTURE_BrooksCoreyStone2RelativePermeability` -CO2BrineEzrokhiFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiFluid` -CO2BrineEzrokhiThermalFluid node :ref:`DATASTRUCTURE_CO2BrineEzrokhiThermalFluid` -CO2BrinePhillipsFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsFluid` -CO2BrinePhillipsThermalFluid node :ref:`DATASTRUCTURE_CO2BrinePhillipsThermalFluid` -CarmanKozenyPermeability node :ref:`DATASTRUCTURE_CarmanKozenyPermeability` -CeramicDamage node :ref:`DATASTRUCTURE_CeramicDamage` -CompositionalMultiphaseFluid node :ref:`DATASTRUCTURE_CompositionalMultiphaseFluid` -CompositionalTwoPhaseFluid node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluid` -CompositionalTwoPhaseFluidLohrenzBrayClark node :ref:`DATASTRUCTURE_CompositionalTwoPhaseFluidLohrenzBrayClark` -CompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_CompressibleSinglePhaseFluid` -CompressibleSolidCarmanKozenyPermeability node :ref:`DATASTRUCTURE_CompressibleSolidCarmanKozenyPermeability` -CompressibleSolidConstantPermeability node :ref:`DATASTRUCTURE_CompressibleSolidConstantPermeability` -CompressibleSolidExponentialDecayPermeability node :ref:`DATASTRUCTURE_CompressibleSolidExponentialDecayPermeability` -CompressibleSolidParallelPlatesPermeability node :ref:`DATASTRUCTURE_CompressibleSolidParallelPlatesPermeability` -CompressibleSolidPressurePermeability node :ref:`DATASTRUCTURE_CompressibleSolidPressurePermeability` -CompressibleSolidSlipDependentPermeability node :ref:`DATASTRUCTURE_CompressibleSolidSlipDependentPermeability` -CompressibleSolidWillisRichardsPermeability node :ref:`DATASTRUCTURE_CompressibleSolidWillisRichardsPermeability` -ConstantDiffusion node :ref:`DATASTRUCTURE_ConstantDiffusion` -ConstantPermeability node :ref:`DATASTRUCTURE_ConstantPermeability` -Coulomb node :ref:`DATASTRUCTURE_Coulomb` -DamageElasticIsotropic node :ref:`DATASTRUCTURE_DamageElasticIsotropic` -DamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_DamageSpectralElasticIsotropic` -DamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_DamageVolDevElasticIsotropic` -DeadOilFluid node :ref:`DATASTRUCTURE_DeadOilFluid` -DelftEgg node :ref:`DATASTRUCTURE_DelftEgg` -DruckerPrager node :ref:`DATASTRUCTURE_DruckerPrager` -ElasticIsotropic node :ref:`DATASTRUCTURE_ElasticIsotropic` -ElasticIsotropicPressureDependent node :ref:`DATASTRUCTURE_ElasticIsotropicPressureDependent` -ElasticOrthotropic node :ref:`DATASTRUCTURE_ElasticOrthotropic` -ElasticTransverseIsotropic node :ref:`DATASTRUCTURE_ElasticTransverseIsotropic` -ExponentialDecayPermeability node :ref:`DATASTRUCTURE_ExponentialDecayPermeability` -ExtendedDruckerPrager node :ref:`DATASTRUCTURE_ExtendedDruckerPrager` -FrictionlessContact node :ref:`DATASTRUCTURE_FrictionlessContact` -HydraulicApertureTable node :ref:`DATASTRUCTURE_HydraulicApertureTable` -JFunctionCapillaryPressure node :ref:`DATASTRUCTURE_JFunctionCapillaryPressure` -LinearIsotropicDispersion node :ref:`DATASTRUCTURE_LinearIsotropicDispersion` -ModifiedCamClay node :ref:`DATASTRUCTURE_ModifiedCamClay` -MultiPhaseConstantThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseConstantThermalConductivity` -MultiPhaseVolumeWeightedThermalConductivity node :ref:`DATASTRUCTURE_MultiPhaseVolumeWeightedThermalConductivity` -NullModel node :ref:`DATASTRUCTURE_NullModel` -ParallelPlatesPermeability node :ref:`DATASTRUCTURE_ParallelPlatesPermeability` -ParticleFluid node :ref:`DATASTRUCTURE_ParticleFluid` -PerfectlyPlastic node :ref:`DATASTRUCTURE_PerfectlyPlastic` -PorousDamageElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageElasticIsotropic` -PorousDamageSpectralElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageSpectralElasticIsotropic` -PorousDamageVolDevElasticIsotropic node :ref:`DATASTRUCTURE_PorousDamageVolDevElasticIsotropic` -PorousDelftEgg node :ref:`DATASTRUCTURE_PorousDelftEgg` -PorousDruckerPrager node :ref:`DATASTRUCTURE_PorousDruckerPrager` -PorousElasticIsotropic node :ref:`DATASTRUCTURE_PorousElasticIsotropic` -PorousElasticOrthotropic node :ref:`DATASTRUCTURE_PorousElasticOrthotropic` -PorousElasticTransverseIsotropic node :ref:`DATASTRUCTURE_PorousElasticTransverseIsotropic` -PorousExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousExtendedDruckerPrager` -PorousModifiedCamClay node :ref:`DATASTRUCTURE_PorousModifiedCamClay` -PorousViscoDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoDruckerPrager` -PorousViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_PorousViscoExtendedDruckerPrager` -PorousViscoModifiedCamClay node :ref:`DATASTRUCTURE_PorousViscoModifiedCamClay` -PressurePermeability node :ref:`DATASTRUCTURE_PressurePermeability` -PressurePorosity node :ref:`DATASTRUCTURE_PressurePorosity` -ProppantPermeability node :ref:`DATASTRUCTURE_ProppantPermeability` -ProppantPorosity node :ref:`DATASTRUCTURE_ProppantPorosity` -ProppantSlurryFluid node :ref:`DATASTRUCTURE_ProppantSlurryFluid` -ProppantSolidProppantPermeability node :ref:`DATASTRUCTURE_ProppantSolidProppantPermeability` -ReactiveBrine node :ref:`DATASTRUCTURE_ReactiveBrine` -ReactiveBrineThermal node :ref:`DATASTRUCTURE_ReactiveBrineThermal` -SinglePhaseThermalConductivity node :ref:`DATASTRUCTURE_SinglePhaseThermalConductivity` -SlipDependentPermeability node :ref:`DATASTRUCTURE_SlipDependentPermeability` -SolidInternalEnergy node :ref:`DATASTRUCTURE_SolidInternalEnergy` -TableCapillaryPressure node :ref:`DATASTRUCTURE_TableCapillaryPressure` -TableRelativePermeability node :ref:`DATASTRUCTURE_TableRelativePermeability` -TableRelativePermeabilityHysteresis node :ref:`DATASTRUCTURE_TableRelativePermeabilityHysteresis` -ThermalCompressibleSinglePhaseFluid node :ref:`DATASTRUCTURE_ThermalCompressibleSinglePhaseFluid` -VanGenuchtenBakerRelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenBakerRelativePermeability` -VanGenuchtenCapillaryPressure node :ref:`DATASTRUCTURE_VanGenuchtenCapillaryPressure` -VanGenuchtenStone2RelativePermeability node :ref:`DATASTRUCTURE_VanGenuchtenStone2RelativePermeability` -ViscoDruckerPrager node :ref:`DATASTRUCTURE_ViscoDruckerPrager` -ViscoExtendedDruckerPrager node :ref:`DATASTRUCTURE_ViscoExtendedDruckerPrager` -ViscoModifiedCamClay node :ref:`DATASTRUCTURE_ViscoModifiedCamClay` -WillisRichardsPermeability node :ref:`DATASTRUCTURE_WillisRichardsPermeability` -============================================= ==== ================================================================== - - diff --git a/src/coreComponents/schema/docs/Coulomb.rst b/src/coreComponents/schema/docs/Coulomb.rst deleted file mode 100644 index 2cbf7fdeffc..00000000000 --- a/src/coreComponents/schema/docs/Coulomb.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -========================= ========= =========== ================================================================== -Name Type Default Description -========================= ========= =========== ================================================================== -cohesion real64 required Cohesion -displacementJumpThreshold real64 2.22045e-16 A threshold valued to determine whether a fracture is open or not. -frictionCoefficient real64 required Friction coefficient -name groupName required A name is required for any non-unique nodes -shearStiffness real64 0 Value of the shear elastic stiffness. Units of Pressure/length -========================= ========= =========== ================================================================== - - diff --git a/src/coreComponents/schema/docs/Coulomb_other.rst b/src/coreComponents/schema/docs/Coulomb_other.rst deleted file mode 100644 index e34713e1c47..00000000000 --- a/src/coreComponents/schema/docs/Coulomb_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -=========== ============== ============ -Name Type Description -=========== ============== ============ -elasticSlip real64_array2d Elastic Slip -=========== ============== ============ - - diff --git a/src/coreComponents/schema/docs/CustomPolarObject.rst b/src/coreComponents/schema/docs/CustomPolarObject.rst deleted file mode 100644 index dc3565d6b83..00000000000 --- a/src/coreComponents/schema/docs/CustomPolarObject.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -============ ============ ======== ========================================================================================================================================= -Name Type Default Description -============ ============ ======== ========================================================================================================================================= -center R1Tensor required (x,y,z) coordinates of the center of the CustomPolarObject -coefficients real64_array required Coefficients of the CustomPolarObject function relating the localradius to the angle theta. -lengthVector R1Tensor required Tangent vector defining the orthonormal basis along with the normal. -name groupName required A name is required for any non-unique nodes -normal R1Tensor required Normal (n_x,n_y,n_z) to the plane (will be normalized automatically) -tolerance real64 1e-05 Tolerance to determine if a point sits on the CustomPolarObject or not. It is relative to the maximum dimension of the CustomPolarObject. -widthVector R1Tensor required Tangent vector defining the orthonormal basis along with the normal. -============ ============ ======== ========================================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/CustomPolarObject_other.rst b/src/coreComponents/schema/docs/CustomPolarObject_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/CustomPolarObject_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Cylinder.rst b/src/coreComponents/schema/docs/Cylinder.rst deleted file mode 100644 index c96dc7455b4..00000000000 --- a/src/coreComponents/schema/docs/Cylinder.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -================ ========= ======== =============================================== -Name Type Default Description -================ ========= ======== =============================================== -firstFaceCenter R1Tensor required Center point of the first face of the cylinder -innerRadius real64 -1 Inner radius of the annulus -name groupName required A name is required for any non-unique nodes -outerRadius real64 required Outer radius of the cylinder -secondFaceCenter R1Tensor required Center point of the second face of the cylinder -================ ========= ======== =============================================== - - diff --git a/src/coreComponents/schema/docs/Cylinder_other.rst b/src/coreComponents/schema/docs/Cylinder_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/Cylinder_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/DamageElasticIsotropic.rst b/src/coreComponents/schema/docs/DamageElasticIsotropic.rst deleted file mode 100644 index 19236b59dcf..00000000000 --- a/src/coreComponents/schema/docs/DamageElasticIsotropic.rst +++ /dev/null @@ -1,23 +0,0 @@ - - -======================= ========= ======== ==================================================================== -Name Type Default Description -======================= ========= ======== ==================================================================== -compressiveStrength real64 0 Compressive strength from the uniaxial compression test -criticalFractureEnergy real64 required Critical fracture energy -criticalStrainEnergy real64 required Critical stress in a 1d tension test -defaultBulkModulus real64 -1 Default Bulk Modulus Parameter -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultPoissonRatio real64 -1 Default Poisson's Ratio -defaultShearModulus real64 -1 Default Shear Modulus Parameter -defaultYoungModulus real64 -1 Default Young's Modulus -degradationLowerLimit real64 0 The lower limit of the degradation function -deltaCoefficient real64 -1 Coefficient in the calculation of the external driving force -extDrivingForceFlag integer 0 Whether to have external driving force. Can be 0 or 1 -lengthScale real64 required Length scale l in the phase-field equation -name groupName required A name is required for any non-unique nodes -tensileStrength real64 0 Tensile strength from the uniaxial tension test -======================= ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/DamageElasticIsotropic_other.rst b/src/coreComponents/schema/docs/DamageElasticIsotropic_other.rst deleted file mode 100644 index 2cda8d3e931..00000000000 --- a/src/coreComponents/schema/docs/DamageElasticIsotropic_other.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -bulkModulus real64_array Elastic Bulk Modulus Field -damage real64_array2d Material Damage Variable -density real64_array2d Material Density -extDrivingForce real64_array2d External Driving Force -oldStress real64_array3d Previous Material Stress -shearModulus real64_array Elastic Shear Modulus Field -strainEnergyDensity real64_array2d Strain Energy Density -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/DamageSpectralElasticIsotropic.rst b/src/coreComponents/schema/docs/DamageSpectralElasticIsotropic.rst deleted file mode 100644 index 19236b59dcf..00000000000 --- a/src/coreComponents/schema/docs/DamageSpectralElasticIsotropic.rst +++ /dev/null @@ -1,23 +0,0 @@ - - -======================= ========= ======== ==================================================================== -Name Type Default Description -======================= ========= ======== ==================================================================== -compressiveStrength real64 0 Compressive strength from the uniaxial compression test -criticalFractureEnergy real64 required Critical fracture energy -criticalStrainEnergy real64 required Critical stress in a 1d tension test -defaultBulkModulus real64 -1 Default Bulk Modulus Parameter -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultPoissonRatio real64 -1 Default Poisson's Ratio -defaultShearModulus real64 -1 Default Shear Modulus Parameter -defaultYoungModulus real64 -1 Default Young's Modulus -degradationLowerLimit real64 0 The lower limit of the degradation function -deltaCoefficient real64 -1 Coefficient in the calculation of the external driving force -extDrivingForceFlag integer 0 Whether to have external driving force. Can be 0 or 1 -lengthScale real64 required Length scale l in the phase-field equation -name groupName required A name is required for any non-unique nodes -tensileStrength real64 0 Tensile strength from the uniaxial tension test -======================= ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/DamageSpectralElasticIsotropic_other.rst b/src/coreComponents/schema/docs/DamageSpectralElasticIsotropic_other.rst deleted file mode 100644 index 2cda8d3e931..00000000000 --- a/src/coreComponents/schema/docs/DamageSpectralElasticIsotropic_other.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -bulkModulus real64_array Elastic Bulk Modulus Field -damage real64_array2d Material Damage Variable -density real64_array2d Material Density -extDrivingForce real64_array2d External Driving Force -oldStress real64_array3d Previous Material Stress -shearModulus real64_array Elastic Shear Modulus Field -strainEnergyDensity real64_array2d Strain Energy Density -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/DamageVolDevElasticIsotropic.rst b/src/coreComponents/schema/docs/DamageVolDevElasticIsotropic.rst deleted file mode 100644 index 19236b59dcf..00000000000 --- a/src/coreComponents/schema/docs/DamageVolDevElasticIsotropic.rst +++ /dev/null @@ -1,23 +0,0 @@ - - -======================= ========= ======== ==================================================================== -Name Type Default Description -======================= ========= ======== ==================================================================== -compressiveStrength real64 0 Compressive strength from the uniaxial compression test -criticalFractureEnergy real64 required Critical fracture energy -criticalStrainEnergy real64 required Critical stress in a 1d tension test -defaultBulkModulus real64 -1 Default Bulk Modulus Parameter -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultPoissonRatio real64 -1 Default Poisson's Ratio -defaultShearModulus real64 -1 Default Shear Modulus Parameter -defaultYoungModulus real64 -1 Default Young's Modulus -degradationLowerLimit real64 0 The lower limit of the degradation function -deltaCoefficient real64 -1 Coefficient in the calculation of the external driving force -extDrivingForceFlag integer 0 Whether to have external driving force. Can be 0 or 1 -lengthScale real64 required Length scale l in the phase-field equation -name groupName required A name is required for any non-unique nodes -tensileStrength real64 0 Tensile strength from the uniaxial tension test -======================= ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/DamageVolDevElasticIsotropic_other.rst b/src/coreComponents/schema/docs/DamageVolDevElasticIsotropic_other.rst deleted file mode 100644 index 2cda8d3e931..00000000000 --- a/src/coreComponents/schema/docs/DamageVolDevElasticIsotropic_other.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -bulkModulus real64_array Elastic Bulk Modulus Field -damage real64_array2d Material Damage Variable -density real64_array2d Material Density -extDrivingForce real64_array2d External Driving Force -oldStress real64_array3d Previous Material Stress -shearModulus real64_array Elastic Shear Modulus Field -strainEnergyDensity real64_array2d Strain Energy Density -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/DeadOilFluid.rst b/src/coreComponents/schema/docs/DeadOilFluid.rst deleted file mode 100644 index c34b2d2ec84..00000000000 --- a/src/coreComponents/schema/docs/DeadOilFluid.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -======================================= ================== ======== ===================================================================================================================================================================================================================================================================================================== -Name Type Default Description -======================================= ================== ======== ===================================================================================================================================================================================================================================================================================================== -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentMolarWeight real64_array required Component molar weights -componentNames string_array {} List of component names -hydrocarbonFormationVolFactorTableNames groupNameRef_array {} | List of formation volume factor TableFunction names from the Functions block. - | The user must provide one TableFunction per hydrocarbon phase, in the order provided in "phaseNames". - | For instance, if "oil" is before "gas" in "phaseNames", the table order should be: oilTableName, gasTableName -hydrocarbonViscosityTableNames groupNameRef_array {} | List of viscosity TableFunction names from the Functions block. - | The user must provide one TableFunction per hydrocarbon phase, in the order provided in "phaseNames". - | For instance, if "oil" is before "gas" in "phaseNames", the table order should be: oilTableName, gasTableName -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -surfaceDensities real64_array required List of surface mass densities for each phase -tableFiles path_array {} List of filenames with input PVT tables (one per phase) -waterCompressibility real64 0 Water compressibility -waterFormationVolumeFactor real64 0 Water formation volume factor -waterReferencePressure real64 0 Water reference pressure -waterViscosity real64 0 Water viscosity -======================================= ================== ======== ===================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/DeadOilFluid_other.rst b/src/coreComponents/schema/docs/DeadOilFluid_other.rst deleted file mode 100644 index de90cbaf87f..00000000000 --- a/src/coreComponents/schema/docs/DeadOilFluid_other.rst +++ /dev/null @@ -1,35 +0,0 @@ - - -=============================== =================================================================================================== ============================================================================================================ -Name Type Description -=============================== =================================================================================================== ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -formationVolFactorTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) -hydrocarbonPhaseOrder integer_array (no description available) -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -phaseViscosity real64_array3d Phase viscosity -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -viscosityTableWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) -=============================== =================================================================================================== ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/DelftEgg.rst b/src/coreComponents/schema/docs/DelftEgg.rst deleted file mode 100644 index a509cdd295e..00000000000 --- a/src/coreComponents/schema/docs/DelftEgg.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -=============================== ========= ======== ==================================================================== -Name Type Default Description -=============================== ========= ======== ==================================================================== -defaultBulkModulus real64 -1 Default Bulk Modulus Parameter -defaultCslSlope real64 1 Slope of the critical state line -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultPoissonRatio real64 -1 Default Poisson's Ratio -defaultPreConsolidationPressure real64 -1.5 Initial preconsolidation pressure -defaultRecompressionIndex real64 0.002 Recompresion Index -defaultShapeParameter real64 1 Shape parameter for the yield surface -defaultShearModulus real64 -1 Default Shear Modulus Parameter -defaultVirginCompressionIndex real64 0.005 Virgin compression index -defaultYoungModulus real64 -1 Default Young's Modulus -name groupName required A name is required for any non-unique nodes -=============================== ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/DelftEgg_other.rst b/src/coreComponents/schema/docs/DelftEgg_other.rst deleted file mode 100644 index a03c1dc5716..00000000000 --- a/src/coreComponents/schema/docs/DelftEgg_other.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -bulkModulus real64_array Elastic Bulk Modulus Field -cslSlope real64_array Slope of the critical state line -density real64_array2d Material Density -oldPreConsolidationPressure real64_array2d Old preconsolidation pressure -oldStress real64_array3d Previous Material Stress -preConsolidationPressure real64_array2d New preconsolidation pressure -recompressionIndex real64_array Recompression index -shapeParameter real64_array Shape parameter for the yield surface -shearModulus real64_array Elastic Shear Modulus Field -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -virginCompressionIndex real64_array Virgin compression index -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/Dirichlet.rst b/src/coreComponents/schema/docs/Dirichlet.rst deleted file mode 100644 index 81d6fead75e..00000000000 --- a/src/coreComponents/schema/docs/Dirichlet.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -====================== ================== ======== ============================================================================== -Name Type Default Description -====================== ================== ======== ============================================================================== -bcApplicationTableName groupNameRef Name of table that specifies the on/off application of the boundary condition. -beginTime real64 -1e+99 Time at which the boundary condition will start being applied. -component integer -1 Component of field (if tensor) to apply boundary condition to. -direction R1Tensor {0,0,0} Direction to apply boundary condition to. -endTime real64 1e+99 Time at which the boundary condition will stop being applied. -fieldName groupNameRef Name of field that boundary condition is applied to. -functionName groupNameRef Name of function that specifies variation of the boundary condition. -initialCondition integer 0 Boundary condition is applied as an initial condition. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -objectPath groupNameRef Path to the target field -scale real64 0 Scale factor for value of the boundary condition. -setNames groupNameRef_array required Name of sets that boundary condition is applied to. -====================== ================== ======== ============================================================================== - - diff --git a/src/coreComponents/schema/docs/Dirichlet_other.rst b/src/coreComponents/schema/docs/Dirichlet_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/Dirichlet_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Disc.rst b/src/coreComponents/schema/docs/Disc.rst deleted file mode 100644 index b3e07062220..00000000000 --- a/src/coreComponents/schema/docs/Disc.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -============ ========= ======== =============================================================================================================== -Name Type Default Description -============ ========= ======== =============================================================================================================== -center R1Tensor required (x,y,z) coordinates of the center of the disc -lengthVector R1Tensor required Tangent vector defining the orthonormal basis along with the normal. -name groupName required A name is required for any non-unique nodes -normal R1Tensor required Normal (n_x,n_y,n_z) to the plane (will be normalized automatically) -radius real64 required Radius of the disc. -tolerance real64 1e-05 Tolerance to determine if a point sits on the disc or not. It is relative to the maximum dimension of the disc. -widthVector R1Tensor required Tangent vector defining the orthonormal basis along with the normal. -============ ========= ======== =============================================================================================================== - - diff --git a/src/coreComponents/schema/docs/Disc_other.rst b/src/coreComponents/schema/docs/Disc_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/Disc_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/DruckerPrager.rst b/src/coreComponents/schema/docs/DruckerPrager.rst deleted file mode 100644 index 3f5d4ef7249..00000000000 --- a/src/coreComponents/schema/docs/DruckerPrager.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -======================= ========= ======== ==================================================================== -Name Type Default Description -======================= ========= ======== ==================================================================== -defaultBulkModulus real64 -1 Default Bulk Modulus Parameter -defaultCohesion real64 0 Initial cohesion -defaultDensity real64 required Default Material Density -defaultDilationAngle real64 30 Dilation angle (degrees) -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultFrictionAngle real64 30 Friction angle (degrees) -defaultHardeningRate real64 0 Cohesion hardening/softening rate -defaultPoissonRatio real64 -1 Default Poisson's Ratio -defaultShearModulus real64 -1 Default Shear Modulus Parameter -defaultYoungModulus real64 -1 Default Young's Modulus -name groupName required A name is required for any non-unique nodes -======================= ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/DruckerPrager_other.rst b/src/coreComponents/schema/docs/DruckerPrager_other.rst deleted file mode 100644 index 3185dd07d81..00000000000 --- a/src/coreComponents/schema/docs/DruckerPrager_other.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -bulkModulus real64_array Elastic Bulk Modulus Field -cohesion real64_array2d New cohesion state -density real64_array2d Material Density -dilation real64_array Plastic potential slope -friction real64_array Yield surface slope -hardening real64_array Hardening rate -oldCohesion real64_array2d Old cohesion state -oldStress real64_array3d Previous Material Stress -shearModulus real64_array Elastic Shear Modulus Field -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/ElasticFirstOrderSEM.rst b/src/coreComponents/schema/docs/ElasticFirstOrderSEM.rst deleted file mode 100644 index 0d655628fe6..00000000000 --- a/src/coreComponents/schema/docs/ElasticFirstOrderSEM.rst +++ /dev/null @@ -1,37 +0,0 @@ - - -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== -attenuationType geos_WaveSolverUtils_AttenuationType none Flag to indicate which attenuation model to use: "none" for no attenuation, "sls\ for the standard-linear-solid (SLS) model (Fichtner, 2014). -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -dtSeismoTrace real64 0 Time step for output pressure at receivers -enableLifo integer 0 Set to 1 to enable LIFO storage feature -forward integer 1 Set to 1 to compute forward propagation -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) -lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) -lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) -linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) -linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise -receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers -rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default -saveFields integer 0 Set to 1 to save fields during forward and restore them during backward -shotIndex integer 0 Set the current shot for temporary files -slsAnelasticityCoefficients real32_array {0} Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided. -slsReferenceAngularFrequencies real32_array {0} Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided. -sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeSourceDelay real32 -1 Source time delay (1 / f0 by default) -timeSourceFrequency real32 0 Central frequency for the time source -useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: "none" to deactivate DAS, "strainIntegration" for strain integration, "dipole" for displacement difference -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ==================================== ========== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst b/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst deleted file mode 100644 index 24ca5ae2f69..00000000000 --- a/src/coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst +++ /dev/null @@ -1,38 +0,0 @@ - - -=========================== ====================================================================================================================================================== ======================================================================= -Name Type Description -=========================== ====================================================================================================================================================== ======================================================================= -displacementxNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (x-components) -displacementyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (y-components) -displacementzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverElem integer_array Element containing the receivers -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sigmaxxNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmaxyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmaxzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmayyNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmayzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sigmazzNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-components) -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds -sourceElem integer_array Element containing the sources -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceRegion integer_array Region containing the sources -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ====================================================================================================================================================== ======================================================================= - - diff --git a/src/coreComponents/schema/docs/ElasticIsotropic.rst b/src/coreComponents/schema/docs/ElasticIsotropic.rst deleted file mode 100644 index 15e42d76f2b..00000000000 --- a/src/coreComponents/schema/docs/ElasticIsotropic.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -======================= ========= ======== ==================================================================== -Name Type Default Description -======================= ========= ======== ==================================================================== -defaultBulkModulus real64 -1 Default Bulk Modulus Parameter -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultPoissonRatio real64 -1 Default Poisson's Ratio -defaultShearModulus real64 -1 Default Shear Modulus Parameter -defaultYoungModulus real64 -1 Default Young's Modulus -name groupName required A name is required for any non-unique nodes -======================= ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/ElasticIsotropicPressureDependent.rst b/src/coreComponents/schema/docs/ElasticIsotropicPressureDependent.rst deleted file mode 100644 index 96015fd3861..00000000000 --- a/src/coreComponents/schema/docs/ElasticIsotropicPressureDependent.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -========================= ========= ======== ==================================================================== -Name Type Default Description -========================= ========= ======== ==================================================================== -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultRecompressionIndex real64 0.002 Recompresion Index -defaultRefPressure real64 -1 Reference Pressure -defaultRefStrainVol real64 0 Reference Volumetric Strain -defaultShearModulus real64 -1 Elastic Shear Modulus Parameter -name groupName required A name is required for any non-unique nodes -========================= ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/ElasticIsotropicPressureDependent_other.rst b/src/coreComponents/schema/docs/ElasticIsotropicPressureDependent_other.rst deleted file mode 100644 index 3c45927c9b2..00000000000 --- a/src/coreComponents/schema/docs/ElasticIsotropicPressureDependent_other.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -density real64_array2d Material Density -oldStress real64_array3d Previous Material Stress -recompressionIndex real64_array Recompression Index Field -refPressure real64 Reference Pressure Field -refStrainVol real64 Reference Volumetric Strain -shearModulus real64_array Elastic Shear Modulus -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/ElasticIsotropic_other.rst b/src/coreComponents/schema/docs/ElasticIsotropic_other.rst deleted file mode 100644 index f202084d9bf..00000000000 --- a/src/coreComponents/schema/docs/ElasticIsotropic_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -bulkModulus real64_array Elastic Bulk Modulus Field -density real64_array2d Material Density -oldStress real64_array3d Previous Material Stress -shearModulus real64_array Elastic Shear Modulus Field -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/ElasticOrthotropic.rst b/src/coreComponents/schema/docs/ElasticOrthotropic.rst deleted file mode 100644 index f2d55b8530f..00000000000 --- a/src/coreComponents/schema/docs/ElasticOrthotropic.rst +++ /dev/null @@ -1,29 +0,0 @@ - - -======================= ========= ======== ==================================================================== -Name Type Default Description -======================= ========= ======== ==================================================================== -defaultC11 real64 -1 Default C11 Component of Voigt Stiffness Tensor -defaultC12 real64 -1 Default C12 Component of Voigt Stiffness Tensor -defaultC13 real64 -1 Default C13 Component of Voigt Stiffness Tensor -defaultC22 real64 -1 Default C22 Component of Voigt Stiffness Tensor -defaultC23 real64 -1 Default C23 Component of Voigt Stiffness Tensor -defaultC33 real64 -1 Default C33 Component of Voigt Stiffness Tensor -defaultC44 real64 -1 Default C44 Component of Voigt Stiffness Tensor -defaultC55 real64 -1 Default C55 Component of Voigt Stiffness Tensor -defaultC66 real64 -1 Default C66 Component of Voigt Stiffness Tensor -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultE1 real64 -1 Default Young's Modulus E1 -defaultE2 real64 -1 Default Young's Modulus E2 -defaultE3 real64 -1 Default Young's Modulus E3 -defaultG12 real64 -1 Default Shear Modulus G12 -defaultG13 real64 -1 Default Shear Modulus G13 -defaultG23 real64 -1 Default Shear Modulus G23 -defaultNu12 real64 -1 Default Poission's Ratio Nu12 -defaultNu13 real64 -1 Default Poission's Ratio Nu13 -defaultNu23 real64 -1 Default Poission's Ratio Nu23 -name groupName required A name is required for any non-unique nodes -======================= ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/ElasticOrthotropic_other.rst b/src/coreComponents/schema/docs/ElasticOrthotropic_other.rst deleted file mode 100644 index e4df4dab8e0..00000000000 --- a/src/coreComponents/schema/docs/ElasticOrthotropic_other.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -c11 real64_array Elastic Stiffness Field C11 -c12 real64_array Elastic Stiffness Field C12 -c13 real64_array Elastic Stiffness Field C13 -c22 real64_array Elastic Stiffness Field C22 -c23 real64_array Elastic Stiffness Field C23 -c33 real64_array Elastic Stiffness Field C33 -c44 real64_array Elastic Stiffness Field C44 -c55 real64_array Elastic Stiffness Field C55 -c66 real64_array Elastic Stiffness Field C66 -density real64_array2d Material Density -oldStress real64_array3d Previous Material Stress -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/ElasticSEM.rst b/src/coreComponents/schema/docs/ElasticSEM.rst deleted file mode 100644 index 924f4d2c984..00000000000 --- a/src/coreComponents/schema/docs/ElasticSEM.rst +++ /dev/null @@ -1,40 +0,0 @@ - - -============================== ==================================== ============= ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ==================================== ============= ======================================================================================================================================================================================================================================================================================================================== -attenuationType geos_WaveSolverUtils_AttenuationType none Flag to indicate which attenuation model to use: "none" for no attenuation, "sls\ for the standard-linear-solid (SLS) model (Fichtner, 2014). -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -dtSeismoTrace real64 0 Time step for output pressure at receivers -enableLifo integer 0 Set to 1 to enable LIFO storage feature -forward integer 1 Set to 1 to compute forward propagation -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -lifoOnDevice integer -80 Set the capacity of the lifo device storage (if negative, opposite of percentage of remaining memory) -lifoOnHost integer -80 Set the capacity of the lifo host storage (if negative, opposite of percentage of remaining memory) -lifoSize integer 2147483647 Set the capacity of the lifo storage (should be the total number of buffers to store in the LIFO) -linearDASGeometry real64_array2d {{0}} Geometry parameters for a linear DAS fiber (dip, azimuth, gauge length) -linearDASSamples integer 5 Number of sample points to be used for strain integration when integrating the strain for the DAS signal -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -outputSeismoTrace integer 0 Flag that indicates if we write the seismo trace in a file .txt, 0 no output, 1 otherwise -receiverCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the receivers -rickerOrder integer 2 Flag that indicates the order of the Ricker to be used o, 1 or 2. Order 2 by default -saveFields integer 0 Set to 1 to save fields during forward and restore them during backward -shotIndex integer 0 Set the current shot for temporary files -slsAnelasticityCoefficients real32_array {0} Anelasticity coefficients for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding reference frequencies must be provided. -slsReferenceAngularFrequencies real32_array {0} Reference angular frequencies (omega) for the standard-linear-solid (SLS) anelasticity.The default value is { }, corresponding to no attenuation. An array with the corresponding anelasticity coefficients must be provided. -sourceCoordinates real64_array2d {{0}} Coordinates (x,y,z) of the sources -sourceForce R1Tensor {0,0,0} Force of the source: 3 real values for a vector source, and 6 real values for a tensor source (in Voigt notation).The default value is { 0, 0, 0 } (no net force). -sourceMoment R2SymTensor {1,1,1,0,0,0} Moment of the source: 6 real values describing a symmetric tensor in Voigt notation.The default value is { 1, 1, 1, 0, 0, 0 } (diagonal moment, corresponding to a pure explosion). -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeSourceDelay real32 -1 Source time delay (1 / f0 by default) -timeSourceFrequency real32 0 Central frequency for the time source -useDAS geos_WaveSolverUtils_DASType none Flag to indicate if DAS data will be modeled, and which DAS type to use: "none" to deactivate DAS, "strainIntegration" for strain integration, "dipole" for displacement difference -useVTI integer 0 Flag to apply VTI anisotropy. The default is to use isotropic physic. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ==================================== ============= ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/ElasticSEM_other.rst b/src/coreComponents/schema/docs/ElasticSEM_other.rst deleted file mode 100644 index 2e9e89c914f..00000000000 --- a/src/coreComponents/schema/docs/ElasticSEM_other.rst +++ /dev/null @@ -1,31 +0,0 @@ - - -=========================== ====================================================================================================================================================== ================================================================================== -Name Type Description -=========================== ====================================================================================================================================================== ================================================================================== -dasSignalNp1AtReceivers real32_array2d DAS signal value at each receiver for each timestep -displacementXNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (x-component) -displacementYNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (y-component) -displacementZNp1AtReceivers real32_array2d Displacement value at each receiver for each timestep (z-component) -indexSeismoTrace integer Count for output pressure at receivers -linearDASVectorX real32_array X component of the linear DAS direction vector -linearDASVectorY real32_array Y component of the linear DAS direction vector -linearDASVectorZ real32_array Z component of the linear DAS direction vector -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -receiverConstants real64_array2d Constant part of the receiver for the nodes listed in m_receiverNodeIds -receiverElem integer_array Element containing the receivers -receiverIsLocal integer_array Flag that indicates whether the receiver is local to this MPI rank -receiverNodeIds integer_array2d Indices of the nodes (in the right order) for each receiver point -receiverRegion integer_array Region containing the receivers -sourceConstants real64_array2d Constant part of the source for the nodes listed in m_sourceNodeIds in z-direction -sourceIsAccessible integer_array Flag that indicates whether the source is local to this MPI rank -sourceNodeIds integer_array2d Indices of the nodes (in the right order) for each source point -sourceValue real32_array2d Source Value of the sources -usePML integer Flag to apply PML -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ====================================================================================================================================================== ================================================================================== - - diff --git a/src/coreComponents/schema/docs/ElasticTransverseIsotropic.rst b/src/coreComponents/schema/docs/ElasticTransverseIsotropic.rst deleted file mode 100644 index e07838a1fd3..00000000000 --- a/src/coreComponents/schema/docs/ElasticTransverseIsotropic.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -================================== ========= ======== ==================================================================== -Name Type Default Description -================================== ========= ======== ==================================================================== -defaultC11 real64 -1 Default Stiffness Parameter C11 -defaultC13 real64 -1 Default Stiffness Parameter C13 -defaultC33 real64 -1 Default Stiffness Parameter C33 -defaultC44 real64 -1 Default Stiffness Parameter C44 -defaultC66 real64 -1 Default Stiffness Parameter C66 -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultPoissonRatioAxialTransverse real64 -1 Default Axial-Transverse Poisson's Ratio -defaultPoissonRatioTransverse real64 -1 Default Transverse Poisson's Ratio -defaultShearModulusAxialTransverse real64 -1 Default Axial-Transverse Shear Modulus -defaultYoungModulusAxial real64 -1 Default Axial Young's Modulus -defaultYoungModulusTransverse real64 -1 Default Transverse Young's Modulus -name groupName required A name is required for any non-unique nodes -================================== ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/ElasticTransverseIsotropic_other.rst b/src/coreComponents/schema/docs/ElasticTransverseIsotropic_other.rst deleted file mode 100644 index 310de3990d0..00000000000 --- a/src/coreComponents/schema/docs/ElasticTransverseIsotropic_other.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -c11 real64_array Elastic Stiffness Field C11 -c13 real64_array Elastic Stiffness Field C13 -c33 real64_array Elastic Stiffness Field C33 -c44 real64_array Elastic Stiffness Field C44 -c66 real64_array Elastic Stiffness Field C66 -density real64_array2d Material Density -oldStress real64_array3d Previous Material Stress -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/ElementRegions.rst b/src/coreComponents/schema/docs/ElementRegions.rst deleted file mode 100644 index 82d745e17be..00000000000 --- a/src/coreComponents/schema/docs/ElementRegions.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -==================== ==== ======= =============================== -Name Type Default Description -==================== ==== ======= =============================== -CellElementRegion node :ref:`XML_CellElementRegion` -SurfaceElementRegion node :ref:`XML_SurfaceElementRegion` -WellElementRegion node :ref:`XML_WellElementRegion` -==================== ==== ======= =============================== - - diff --git a/src/coreComponents/schema/docs/ElementRegions_other.rst b/src/coreComponents/schema/docs/ElementRegions_other.rst deleted file mode 100644 index 73341aae872..00000000000 --- a/src/coreComponents/schema/docs/ElementRegions_other.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -======================= ================================================================= ========================================================= -Name Type Description -======================= ================================================================= ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -CellElementRegion node :ref:`DATASTRUCTURE_CellElementRegion` -SurfaceElementRegion node :ref:`DATASTRUCTURE_SurfaceElementRegion` -WellElementRegion node :ref:`DATASTRUCTURE_WellElementRegion` -elementRegionsGroup node :ref:`DATASTRUCTURE_elementRegionsGroup` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ================================================================= ========================================================= - - diff --git a/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator.rst b/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator.rst deleted file mode 100644 index 4dc73219d88..00000000000 --- a/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -========================= ================== ============== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ============== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -fractureRegion groupNameRef FractureRegion (no description available) -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -mpiCommOrder integer 0 Flag to enable MPI consistent communication ordering -name groupName required A name is required for any non-unique nodes -targetObjects groupNameRef_array required List of geometric objects that will be used to initialized the embedded surfaces/fractures. -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ============== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst b/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst deleted file mode 100644 index f2590daca7c..00000000000 --- a/src/coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================ ================================================================ -Name Type Registered On Description -========================= ====================================================================================================================================================== ================================================ ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -parentEdgeIndex integer_array :ref:`DATASTRUCTURE_embeddedSurfacesNodeManager` Index of parent edge within the mesh object it is registered on. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================ ================================================================ - - diff --git a/src/coreComponents/schema/docs/Events.rst b/src/coreComponents/schema/docs/Events.rst deleted file mode 100644 index a9963170314..00000000000 --- a/src/coreComponents/schema/docs/Events.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -================ ================================== ============ ======================================================================== -Name Type Default Description -================ ================================== ============ ======================================================================== -logLevel integer 0 Log level -maxCycle integer 2147483647 Maximum simulation cycle for the global event loop. Disabled by default. -maxTime real64 1.79769e+308 Maximum simulation time for the global event loop. Disabled by default. -minTime real64 0 Start simulation time for the global event loop. -timeOutputFormat geos_EventManager_TimeOutputFormat seconds Format of the time in the GEOS log. -HaltEvent node :ref:`XML_HaltEvent` -PeriodicEvent node :ref:`XML_PeriodicEvent` -SoloEvent node :ref:`XML_SoloEvent` -================ ================================== ============ ======================================================================== - - diff --git a/src/coreComponents/schema/docs/Events_other.rst b/src/coreComponents/schema/docs/Events_other.rst deleted file mode 100644 index b9ef302077f..00000000000 --- a/src/coreComponents/schema/docs/Events_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=============== ======= ================================== -Name Type Description -=============== ======= ================================== -currentSubEvent integer Index of the current subevent. -cycle integer Current simulation cycle number. -dt real64 Current simulation timestep. -time real64 Current simulation time. -HaltEvent node :ref:`DATASTRUCTURE_HaltEvent` -PeriodicEvent node :ref:`DATASTRUCTURE_PeriodicEvent` -SoloEvent node :ref:`DATASTRUCTURE_SoloEvent` -=============== ======= ================================== - - diff --git a/src/coreComponents/schema/docs/ExponentialDecayPermeability.rst b/src/coreComponents/schema/docs/ExponentialDecayPermeability.rst deleted file mode 100644 index 478b850e596..00000000000 --- a/src/coreComponents/schema/docs/ExponentialDecayPermeability.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -=================== ========= ======== =========================================== -Name Type Default Description -=================== ========= ======== =========================================== -empiricalConstant real64 required an empirical constant. -initialPermeability R1Tensor required initial permeability of the fracture. -name groupName required A name is required for any non-unique nodes -=================== ========= ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/ExponentialDecayPermeability_other.rst b/src/coreComponents/schema/docs/ExponentialDecayPermeability_other.rst deleted file mode 100644 index 945812dafaa..00000000000 --- a/src/coreComponents/schema/docs/ExponentialDecayPermeability_other.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -=============== ============== =================================================================== -Name Type Description -=============== ============== =================================================================== -dPerm_dDispJump real64_array4d Derivative of rock permeability with respect to displacement jump -dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure -dPerm_dTraction real64_array4d Derivative of rock permeability with respect to the traction vector -permeability real64_array3d Rock permeability -=============== ============== =================================================================== - - diff --git a/src/coreComponents/schema/docs/ExtendedDruckerPrager.rst b/src/coreComponents/schema/docs/ExtendedDruckerPrager.rst deleted file mode 100644 index a196499ef95..00000000000 --- a/src/coreComponents/schema/docs/ExtendedDruckerPrager.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -============================ ========= ======== ==================================================================== -Name Type Default Description -============================ ========= ======== ==================================================================== -defaultBulkModulus real64 -1 Default Bulk Modulus Parameter -defaultCohesion real64 0 Initial cohesion -defaultDensity real64 required Default Material Density -defaultDilationRatio real64 1 Dilation ratio [0,1] (ratio = tan dilationAngle / tan frictionAngle) -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultHardening real64 0 Hardening parameter (hardening rate is faster for smaller values) -defaultInitialFrictionAngle real64 30 Initial friction angle (degrees) -defaultPoissonRatio real64 -1 Default Poisson's Ratio -defaultResidualFrictionAngle real64 30 Residual friction angle (degrees) -defaultShearModulus real64 -1 Default Shear Modulus Parameter -defaultYoungModulus real64 -1 Default Young's Modulus -name groupName required A name is required for any non-unique nodes -============================ ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/ExtendedDruckerPrager_other.rst b/src/coreComponents/schema/docs/ExtendedDruckerPrager_other.rst deleted file mode 100644 index 729d894b362..00000000000 --- a/src/coreComponents/schema/docs/ExtendedDruckerPrager_other.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -bulkModulus real64_array Elastic Bulk Modulus Field -density real64_array2d Material Density -dilationRatio real64_array Plastic potential slope ratio -hardening real64_array Hardening parameter -initialFriction real64_array Initial yield surface slope -oldStateVariable real64_array2d Old equivalent plastic shear strain -oldStress real64_array3d Previous Material Stress -pressureIntercept real64_array Pressure point at cone vertex -residualFriction real64_array Residual yield surface slope -shearModulus real64_array Elastic Shear Modulus Field -stateVariable real64_array2d New equivalent plastic shear strain -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/FieldSpecification.rst b/src/coreComponents/schema/docs/FieldSpecification.rst deleted file mode 100644 index 81d6fead75e..00000000000 --- a/src/coreComponents/schema/docs/FieldSpecification.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -====================== ================== ======== ============================================================================== -Name Type Default Description -====================== ================== ======== ============================================================================== -bcApplicationTableName groupNameRef Name of table that specifies the on/off application of the boundary condition. -beginTime real64 -1e+99 Time at which the boundary condition will start being applied. -component integer -1 Component of field (if tensor) to apply boundary condition to. -direction R1Tensor {0,0,0} Direction to apply boundary condition to. -endTime real64 1e+99 Time at which the boundary condition will stop being applied. -fieldName groupNameRef Name of field that boundary condition is applied to. -functionName groupNameRef Name of function that specifies variation of the boundary condition. -initialCondition integer 0 Boundary condition is applied as an initial condition. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -objectPath groupNameRef Path to the target field -scale real64 0 Scale factor for value of the boundary condition. -setNames groupNameRef_array required Name of sets that boundary condition is applied to. -====================== ================== ======== ============================================================================== - - diff --git a/src/coreComponents/schema/docs/FieldSpecification_other.rst b/src/coreComponents/schema/docs/FieldSpecification_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/FieldSpecification_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/FieldSpecifications.rst b/src/coreComponents/schema/docs/FieldSpecifications.rst deleted file mode 100644 index f0da4190ad4..00000000000 --- a/src/coreComponents/schema/docs/FieldSpecifications.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -====================== ==== ======= ================================= -Name Type Default Description -====================== ==== ======= ================================= -Aquifer node :ref:`XML_Aquifer` -Dirichlet node :ref:`XML_Dirichlet` -FieldSpecification node :ref:`XML_FieldSpecification` -HydrostaticEquilibrium node :ref:`XML_HydrostaticEquilibrium` -PML node :ref:`XML_PML` -SourceFlux node :ref:`XML_SourceFlux` -Traction node :ref:`XML_Traction` -====================== ==== ======= ================================= - - diff --git a/src/coreComponents/schema/docs/FieldSpecifications_other.rst b/src/coreComponents/schema/docs/FieldSpecifications_other.rst deleted file mode 100644 index 7280e734cf5..00000000000 --- a/src/coreComponents/schema/docs/FieldSpecifications_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -====================== ==== =========================================== -Name Type Description -====================== ==== =========================================== -Aquifer node :ref:`DATASTRUCTURE_Aquifer` -Dirichlet node :ref:`DATASTRUCTURE_Dirichlet` -FieldSpecification node :ref:`DATASTRUCTURE_FieldSpecification` -HydrostaticEquilibrium node :ref:`DATASTRUCTURE_HydrostaticEquilibrium` -PML node :ref:`DATASTRUCTURE_PML` -SourceFlux node :ref:`DATASTRUCTURE_SourceFlux` -Traction node :ref:`DATASTRUCTURE_Traction` -====================== ==== =========================================== - - diff --git a/src/coreComponents/schema/docs/File.rst b/src/coreComponents/schema/docs/File.rst deleted file mode 100644 index 949fd71db6e..00000000000 --- a/src/coreComponents/schema/docs/File.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ======== ======================= -Name Type Default Description -==== ==== ======== ======================= -name path required The relative file path. -==== ==== ======== ======================= - - diff --git a/src/coreComponents/schema/docs/File_other.rst b/src/coreComponents/schema/docs/File_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/File_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/FiniteElementSpace.rst b/src/coreComponents/schema/docs/FiniteElementSpace.rst deleted file mode 100644 index 1dfa434e822..00000000000 --- a/src/coreComponents/schema/docs/FiniteElementSpace.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================== ============================================ ======== ======================================================================================================================================================================= -Name Type Default Description -================== ============================================ ======== ======================================================================================================================================================================= -formulation geos_FiniteElementDiscretization_Formulation default Specifier to indicate any specialized formuations. For instance, one of the many enhanced assumed strain methods of the Hexahedron parent shape would be indicated here -name groupName required A name is required for any non-unique nodes -order integer required The order of the finite element basis. -useVirtualElements integer 0 Specifier to indicate whether to force the use of VEM -================== ============================================ ======== ======================================================================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/FiniteElementSpace_other.rst b/src/coreComponents/schema/docs/FiniteElementSpace_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/FiniteElementSpace_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/FiniteElements.rst b/src/coreComponents/schema/docs/FiniteElements.rst deleted file mode 100644 index 8a027502bcb..00000000000 --- a/src/coreComponents/schema/docs/FiniteElements.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -========================= ==== ======= ==================================== -Name Type Default Description -========================= ==== ======= ==================================== -FiniteElementSpace node :ref:`XML_FiniteElementSpace` -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ==== ======= ==================================== - - diff --git a/src/coreComponents/schema/docs/FiniteElements_other.rst b/src/coreComponents/schema/docs/FiniteElements_other.rst deleted file mode 100644 index 2c1625e9f5a..00000000000 --- a/src/coreComponents/schema/docs/FiniteElements_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -========================= ==== ============================================== -Name Type Description -========================= ==== ============================================== -FiniteElementSpace node :ref:`DATASTRUCTURE_FiniteElementSpace` -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -========================= ==== ============================================== - - diff --git a/src/coreComponents/schema/docs/FiniteVolume.rst b/src/coreComponents/schema/docs/FiniteVolume.rst deleted file mode 100644 index 2eeb1baa188..00000000000 --- a/src/coreComponents/schema/docs/FiniteVolume.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -=========================== ==== ======= ====================================== -Name Type Default Description -=========================== ==== ======= ====================================== -HybridMimeticDiscretization node :ref:`XML_HybridMimeticDiscretization` -TwoPointFluxApproximation node :ref:`XML_TwoPointFluxApproximation` -=========================== ==== ======= ====================================== - - diff --git a/src/coreComponents/schema/docs/FiniteVolume_other.rst b/src/coreComponents/schema/docs/FiniteVolume_other.rst deleted file mode 100644 index f72f9ada3c7..00000000000 --- a/src/coreComponents/schema/docs/FiniteVolume_other.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -=========================== ==== ================================================ -Name Type Description -=========================== ==== ================================================ -HybridMimeticDiscretization node :ref:`DATASTRUCTURE_HybridMimeticDiscretization` -TwoPointFluxApproximation node :ref:`DATASTRUCTURE_TwoPointFluxApproximation` -=========================== ==== ================================================ - - diff --git a/src/coreComponents/schema/docs/FlowProppantTransport.rst b/src/coreComponents/schema/docs/FlowProppantTransport.rst deleted file mode 100644 index 1444704a5ed..00000000000 --- a/src/coreComponents/schema/docs/FlowProppantTransport.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -proppantSolverName groupNameRef required Name of the proppant solver used by the coupled solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/FlowProppantTransport_other.rst b/src/coreComponents/schema/docs/FlowProppantTransport_other.rst deleted file mode 100644 index cccf4603c70..00000000000 --- a/src/coreComponents/schema/docs/FlowProppantTransport_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/FrictionlessContact.rst b/src/coreComponents/schema/docs/FrictionlessContact.rst deleted file mode 100644 index e150b24c06a..00000000000 --- a/src/coreComponents/schema/docs/FrictionlessContact.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -========================= ========= =========== ================================================================== -Name Type Default Description -========================= ========= =========== ================================================================== -displacementJumpThreshold real64 2.22045e-16 A threshold valued to determine whether a fracture is open or not. -name groupName required A name is required for any non-unique nodes -========================= ========= =========== ================================================================== - - diff --git a/src/coreComponents/schema/docs/FrictionlessContact_other.rst b/src/coreComponents/schema/docs/FrictionlessContact_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/FrictionlessContact_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Functions.rst b/src/coreComponents/schema/docs/Functions.rst deleted file mode 100644 index 7f0ec63e038..00000000000 --- a/src/coreComponents/schema/docs/Functions.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -========================== ==== ======= ===================================== -Name Type Default Description -========================== ==== ======= ===================================== -CompositeFunction node :ref:`XML_CompositeFunction` -MultivariableTableFunction node :ref:`XML_MultivariableTableFunction` -SymbolicFunction node :ref:`XML_SymbolicFunction` -TableFunction node :ref:`XML_TableFunction` -========================== ==== ======= ===================================== - - diff --git a/src/coreComponents/schema/docs/Functions_other.rst b/src/coreComponents/schema/docs/Functions_other.rst deleted file mode 100644 index 93d4ce21f6c..00000000000 --- a/src/coreComponents/schema/docs/Functions_other.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -========================== ==== =============================================== -Name Type Description -========================== ==== =============================================== -CompositeFunction node :ref:`DATASTRUCTURE_CompositeFunction` -MultivariableTableFunction node :ref:`DATASTRUCTURE_MultivariableTableFunction` -SymbolicFunction node :ref:`DATASTRUCTURE_SymbolicFunction` -TableFunction node :ref:`DATASTRUCTURE_TableFunction` -========================== ==== =============================================== - - diff --git a/src/coreComponents/schema/docs/Geometry.rst b/src/coreComponents/schema/docs/Geometry.rst deleted file mode 100644 index 43bc76a5f42..00000000000 --- a/src/coreComponents/schema/docs/Geometry.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -================= ==== ======= ============================ -Name Type Default Description -================= ==== ======= ============================ -Box node :ref:`XML_Box` -CustomPolarObject node :ref:`XML_CustomPolarObject` -Cylinder node :ref:`XML_Cylinder` -Disc node :ref:`XML_Disc` -Rectangle node :ref:`XML_Rectangle` -ThickPlane node :ref:`XML_ThickPlane` -================= ==== ======= ============================ - - diff --git a/src/coreComponents/schema/docs/Geometry_other.rst b/src/coreComponents/schema/docs/Geometry_other.rst deleted file mode 100644 index af15f983b0a..00000000000 --- a/src/coreComponents/schema/docs/Geometry_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -================= ==== ====================================== -Name Type Description -================= ==== ====================================== -Box node :ref:`DATASTRUCTURE_Box` -CustomPolarObject node :ref:`DATASTRUCTURE_CustomPolarObject` -Cylinder node :ref:`DATASTRUCTURE_Cylinder` -Disc node :ref:`DATASTRUCTURE_Disc` -Rectangle node :ref:`DATASTRUCTURE_Rectangle` -ThickPlane node :ref:`DATASTRUCTURE_ThickPlane` -================= ==== ====================================== - - diff --git a/src/coreComponents/schema/docs/HaltEvent.rst b/src/coreComponents/schema/docs/HaltEvent.rst deleted file mode 100644 index de2a154b525..00000000000 --- a/src/coreComponents/schema/docs/HaltEvent.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -==================== ============ ======== ===================================================================================================================== -Name Type Default Description -==================== ============ ======== ===================================================================================================================== -beginTime real64 0 Start time of this event. -endTime real64 1e+100 End time of this event. -finalDtStretch real64 0.001 Allow the final dt request for this event to grow by this percentage to match the endTime exactly. -forceDt real64 -1 While active, this event will request this timestep value (ignoring any children/targets requests). -logLevel integer 0 Log level -maxEventDt real64 -1 While active, this event will request a timestep <= this value (depending upon any child/target requests). -maxRuntime real64 required The maximum allowable runtime for the job. -name groupName required A name is required for any non-unique nodes -target groupNameRef Name of the object to be executed when the event criteria are met. -targetExactStartStop integer 1 If this option is set, the event will reduce its timestep requests to match any specified beginTime/endTimes exactly. -HaltEvent node :ref:`XML_HaltEvent` -PeriodicEvent node :ref:`XML_PeriodicEvent` -SoloEvent node :ref:`XML_SoloEvent` -==================== ============ ======== ===================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/HaltEvent_other.rst b/src/coreComponents/schema/docs/HaltEvent_other.rst deleted file mode 100644 index f63756dd49b..00000000000 --- a/src/coreComponents/schema/docs/HaltEvent_other.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -================= ======= =============================================== -Name Type Description -================= ======= =============================================== -currentSubEvent integer Index of the current subevent -eventForecast integer Indicates when the event is expected to execute -isTargetExecuting integer Index of the current subevent -lastCycle integer Last event occurrence (cycle) -lastTime real64 Last event occurrence (time) -HaltEvent node :ref:`DATASTRUCTURE_HaltEvent` -PeriodicEvent node :ref:`DATASTRUCTURE_PeriodicEvent` -SoloEvent node :ref:`DATASTRUCTURE_SoloEvent` -================= ======= =============================================== - - diff --git a/src/coreComponents/schema/docs/HybridMimeticDiscretization.rst b/src/coreComponents/schema/docs/HybridMimeticDiscretization.rst deleted file mode 100644 index 1ada365b75a..00000000000 --- a/src/coreComponents/schema/docs/HybridMimeticDiscretization.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -================ ========= ======== =================================================== -Name Type Default Description -================ ========= ======== =================================================== -innerProductType string required Type of inner product used in the hybrid FVM solver -name groupName required A name is required for any non-unique nodes -================ ========= ======== =================================================== - - diff --git a/src/coreComponents/schema/docs/HybridMimeticDiscretization_other.rst b/src/coreComponents/schema/docs/HybridMimeticDiscretization_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/HybridMimeticDiscretization_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/HydraulicApertureTable.rst b/src/coreComponents/schema/docs/HydraulicApertureTable.rst deleted file mode 100644 index 396fc421971..00000000000 --- a/src/coreComponents/schema/docs/HydraulicApertureTable.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================= ============ ======== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= -Name Type Default Description -================= ============ ======== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= -apertureTableName groupNameRef required Name of the aperture table -apertureTolerance real64 1e-09 Value to be used to avoid floating point errors in expressions involving aperture. For example in the case of dividing by the actual aperture (not the effective aperture that results from the aperture function) this value may be used to avoid the 1/0 error. Note that this value may have some physical significance in its usage, as it may be used to smooth out highly nonlinear behavior associated with 1/0 in addition to avoiding the 1/0 error. -name groupName required A name is required for any non-unique nodes -referenceAperture real64 1e-06 Reference hydraulic aperture. It is the aperture at zero normal stress. -================= ============ ======== ============================================================================================================================================================================================================================================================================================================================================================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/HydraulicApertureTable_other.rst b/src/coreComponents/schema/docs/HydraulicApertureTable_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/HydraulicApertureTable_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Hydrofracture.rst b/src/coreComponents/schema/docs/Hydrofracture.rst deleted file mode 100644 index d36978900e6..00000000000 --- a/src/coreComponents/schema/docs/Hydrofracture.rst +++ /dev/null @@ -1,31 +0,0 @@ - - -===================================== =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -===================================== =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isLaggingFractureStencilWeightsUpdate integer 0 Flag to determine whether or not to apply lagging update for the fracture stencil weights. -isMatrixPoroelastic integer 0 (no description available) -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -maxNumResolves integer 10 Value to indicate how many resolves may be executed to perform surface generation after the execution of flow and mechanics solver. -name groupName required A name is required for any non-unique nodes -newFractureInitializationType geos_HydrofractureSolver >_InitializationType Pressure Type of new fracture element initialization. Can be Pressure or Displacement. -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -stabilizationMultiplier real64 1 Constant multiplier of stabilization strength -stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. -stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: - | None- Add no stabilization to mass equation - | Global- Add jump stabilization to all faces - | Local- Add jump stabilization on interior of macro elements -surfaceGeneratorName groupNameRef required Name of the surface generator to use in the hydrofracture solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -useQuasiNewton integer 0 (no description available) -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -===================================== =================================================================================================================================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/HydrofractureInitialization.rst b/src/coreComponents/schema/docs/HydrofractureInitialization.rst deleted file mode 100644 index 18e3a0dd9e7..00000000000 --- a/src/coreComponents/schema/docs/HydrofractureInitialization.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/HydrofractureInitialization_other.rst b/src/coreComponents/schema/docs/HydrofractureInitialization_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/HydrofractureInitialization_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Hydrofracture_other.rst b/src/coreComponents/schema/docs/Hydrofracture_other.rst deleted file mode 100644 index dc33be0a036..00000000000 --- a/src/coreComponents/schema/docs/Hydrofracture_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/HydrostaticEquilibrium.rst b/src/coreComponents/schema/docs/HydrostaticEquilibrium.rst deleted file mode 100644 index 3b1f86b4003..00000000000 --- a/src/coreComponents/schema/docs/HydrostaticEquilibrium.rst +++ /dev/null @@ -1,26 +0,0 @@ - - -============================================ ================== ======== ==================================================================================================== -Name Type Default Description -============================================ ================== ======== ==================================================================================================== -bcApplicationTableName groupNameRef Name of table that specifies the on/off application of the boundary condition. -beginTime real64 -1e+99 Time at which the boundary condition will start being applied. -componentFractionVsElevationTableNames groupNameRef_array {} Names of the tables specifying the (component fraction vs elevation) relationship for each component -componentNames string_array {} Names of the fluid components -datumElevation real64 required Datum elevation [m] -datumPressure real64 required Datum pressure [Pa] -direction R1Tensor {0,0,0} Direction to apply boundary condition to. -elevationIncrementInHydrostaticPressureTable real64 0.6096 Elevation increment [m] in the hydrostatic pressure table constructed internally -endTime real64 1e+99 Time at which the boundary condition will stop being applied. -equilibrationTolerance real64 0.001 Tolerance in the fixed-point iteration scheme used for hydrostatic initialization -functionName groupNameRef Name of function that specifies variation of the boundary condition. -initialPhaseName groupNameRef Name of the phase initially saturating the reservoir -logLevel integer 0 Log level -maxNumberOfEquilibrationIterations integer 5 Maximum number of equilibration iterations -name groupName required A name is required for any non-unique nodes -objectPath groupNameRef Path to the target field -scale real64 0 Scale factor for value of the boundary condition. -temperatureVsElevationTableName groupNameRef Name of the table specifying the (temperature [K] vs elevation) relationship -============================================ ================== ======== ==================================================================================================== - - diff --git a/src/coreComponents/schema/docs/HydrostaticEquilibrium_other.rst b/src/coreComponents/schema/docs/HydrostaticEquilibrium_other.rst deleted file mode 100644 index 57ad4f17a8c..00000000000 --- a/src/coreComponents/schema/docs/HydrostaticEquilibrium_other.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================ ================== ============================================================== -Name Type Description -================ ================== ============================================================== -component integer Component of field (if tensor) to apply boundary condition to. -fieldName groupNameRef Name of field that boundary condition is applied to. -initialCondition integer Boundary condition is applied as an initial condition. -setNames groupNameRef_array Name of sets that boundary condition is applied to. -================ ================== ============================================================== - - diff --git a/src/coreComponents/schema/docs/Included.rst b/src/coreComponents/schema/docs/Included.rst deleted file mode 100644 index c3b01961df6..00000000000 --- a/src/coreComponents/schema/docs/Included.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ======= =============== -Name Type Default Description -==== ==== ======= =============== -File node :ref:`XML_File` -==== ==== ======= =============== - - diff --git a/src/coreComponents/schema/docs/Included_other.rst b/src/coreComponents/schema/docs/Included_other.rst deleted file mode 100644 index 2fbd25975df..00000000000 --- a/src/coreComponents/schema/docs/Included_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ========================= -Name Type Description -==== ==== ========================= -File node :ref:`DATASTRUCTURE_File` -==== ==== ========================= - - diff --git a/src/coreComponents/schema/docs/InternalMesh.rst b/src/coreComponents/schema/docs/InternalMesh.rst deleted file mode 100644 index c8de2fad08c..00000000000 --- a/src/coreComponents/schema/docs/InternalMesh.rst +++ /dev/null @@ -1,24 +0,0 @@ - - -================= ================== ======== ======================================================================================================= -Name Type Default Description -================= ================== ======== ======================================================================================================= -cellBlockNames groupNameRef_array required Names of each mesh block -elementTypes string_array required Element types of each mesh block -name groupName required A name is required for any non-unique nodes -nx integer_array required Number of elements in the x-direction within each mesh block -ny integer_array required Number of elements in the y-direction within each mesh block -nz integer_array required Number of elements in the z-direction within each mesh block -positionTolerance real64 1e-10 A position tolerance to verify if a node belong to a nodeset -trianglePattern integer 0 Pattern by which to decompose the hex mesh into wedges -xBias real64_array {1} Bias of element sizes in the x-direction within each mesh block (dx_left=(1+b)*L/N, dx_right=(1-b)*L/N) -xCoords real64_array required x-coordinates of each mesh block vertex -yBias real64_array {1} Bias of element sizes in the y-direction within each mesh block (dy_left=(1+b)*L/N, dx_right=(1-b)*L/N) -yCoords real64_array required y-coordinates of each mesh block vertex -zBias real64_array {1} Bias of element sizes in the z-direction within each mesh block (dz_left=(1+b)*L/N, dz_right=(1-b)*L/N) -zCoords real64_array required z-coordinates of each mesh block vertex -InternalWell node :ref:`XML_InternalWell` -VTKWell node :ref:`XML_VTKWell` -================= ================== ======== ======================================================================================================= - - diff --git a/src/coreComponents/schema/docs/InternalMesh_other.rst b/src/coreComponents/schema/docs/InternalMesh_other.rst deleted file mode 100644 index 8ca4f02bc36..00000000000 --- a/src/coreComponents/schema/docs/InternalMesh_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -============ ==== ================================= -Name Type Description -============ ==== ================================= -InternalWell node :ref:`DATASTRUCTURE_InternalWell` -VTKWell node :ref:`DATASTRUCTURE_VTKWell` -meshLevels node :ref:`DATASTRUCTURE_meshLevels` -============ ==== ================================= - - diff --git a/src/coreComponents/schema/docs/InternalWell.rst b/src/coreComponents/schema/docs/InternalWell.rst deleted file mode 100644 index bb26958fc59..00000000000 --- a/src/coreComponents/schema/docs/InternalWell.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -===================== =================== ======== ==================================================================================================== -Name Type Default Description -===================== =================== ======== ==================================================================================================== -logLevel integer 0 Log level -minElementLength real64 0.001 Minimum length of a well element, computed as (segment length / number of elements per segment ) [m] -minSegmentLength real64 0.01 Minimum length of a well segment [m] -name groupName required A name is required for any non-unique nodes -numElementsPerSegment integer required Number of well elements per polyline segment -polylineNodeCoords real64_array2d required Physical coordinates of the well polyline nodes -polylineSegmentConn globalIndex_array2d required Connectivity of the polyline segments -radius real64 required Radius of the well [m] -wellControlsName string required Name of the set of constraints associated with this well -wellRegionName string required Name of the well element region -Perforation node :ref:`XML_Perforation` -===================== =================== ======== ==================================================================================================== - - diff --git a/src/coreComponents/schema/docs/InternalWell_other.rst b/src/coreComponents/schema/docs/InternalWell_other.rst deleted file mode 100644 index 638cc779598..00000000000 --- a/src/coreComponents/schema/docs/InternalWell_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -=========== ==== ================================ -Name Type Description -=========== ==== ================================ -Perforation node :ref:`DATASTRUCTURE_Perforation` -=========== ==== ================================ - - diff --git a/src/coreComponents/schema/docs/InternalWellbore.rst b/src/coreComponents/schema/docs/InternalWellbore.rst deleted file mode 100644 index d9e3151e2f9..00000000000 --- a/src/coreComponents/schema/docs/InternalWellbore.rst +++ /dev/null @@ -1,30 +0,0 @@ - - -=========================== ================== ======== ============================================================================================================================================================================================================================ -Name Type Default Description -=========================== ================== ======== ============================================================================================================================================================================================================================ -autoSpaceRadialElems real64_array {-1} Automatically set number and spacing of elements in the radial direction. This overrides the values of nr!Value in each block indicates factor to scale the radial increment.Larger numbers indicate larger radial elements. -cartesianMappingInnerRadius real64 1e+99 If using a Cartesian aligned outer boundary, this is inner radius at which to start the mapping. -cellBlockNames groupNameRef_array required Names of each mesh block -elementTypes string_array required Element types of each mesh block -hardRadialCoords real64_array {0} Sets the radial spacing to specified values -name groupName required A name is required for any non-unique nodes -nr integer_array required Number of elements in the radial direction -nt integer_array required Number of elements in the tangent direction -nz integer_array required Number of elements in the z-direction within each mesh block -positionTolerance real64 1e-10 A position tolerance to verify if a node belong to a nodeset -rBias real64_array {-0.8} Bias of element sizes in the radial direction -radius real64_array required Wellbore radius -theta real64_array required Tangent angle defining geometry size: 90 for quarter, 180 for half and 360 for full wellbore geometry -trajectory real64_array2d {{0}} Coordinates defining the wellbore trajectory -trianglePattern integer 0 Pattern by which to decompose the hex mesh into wedges -useCartesianOuterBoundary integer 1000000 Enforce a Cartesian aligned outer boundary on the outer block starting with the radial block specified in this value -xBias real64_array {1} Bias of element sizes in the x-direction within each mesh block (dx_left=(1+b)*L/N, dx_right=(1-b)*L/N) -yBias real64_array {1} Bias of element sizes in the y-direction within each mesh block (dy_left=(1+b)*L/N, dx_right=(1-b)*L/N) -zBias real64_array {1} Bias of element sizes in the z-direction within each mesh block (dz_left=(1+b)*L/N, dz_right=(1-b)*L/N) -zCoords real64_array required z-coordinates of each mesh block vertex -InternalWell node :ref:`XML_InternalWell` -VTKWell node :ref:`XML_VTKWell` -=========================== ================== ======== ============================================================================================================================================================================================================================ - - diff --git a/src/coreComponents/schema/docs/InternalWellbore_other.rst b/src/coreComponents/schema/docs/InternalWellbore_other.rst deleted file mode 100644 index 14901e94dac..00000000000 --- a/src/coreComponents/schema/docs/InternalWellbore_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -============ ============= ============================================================ -Name Type Description -============ ============= ============================================================ -nx integer_array Number of elements in the x-direction within each mesh block -ny integer_array Number of elements in the y-direction within each mesh block -xCoords real64_array x-coordinates of each mesh block vertex -yCoords real64_array y-coordinates of each mesh block vertex -InternalWell node :ref:`DATASTRUCTURE_InternalWell` -VTKWell node :ref:`DATASTRUCTURE_VTKWell` -meshLevels node :ref:`DATASTRUCTURE_meshLevels` -============ ============= ============================================================ - - diff --git a/src/coreComponents/schema/docs/JFunctionCapillaryPressure.rst b/src/coreComponents/schema/docs/JFunctionCapillaryPressure.rst deleted file mode 100644 index 5f42b347615..00000000000 --- a/src/coreComponents/schema/docs/JFunctionCapillaryPressure.rst +++ /dev/null @@ -1,38 +0,0 @@ - - -======================================== ================================================================== ======== ========================================================================================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -======================================== ================================================================== ======== ========================================================================================================================================================================================================================================================================================================================================================================================== -name groupName required A name is required for any non-unique nodes -nonWettingIntermediateJFunctionTableName groupNameRef | J-function table (dimensionless) for the pair (non-wetting phase, intermediate phase) - | Note that this input is only used for three-phase flow. - | If you want to do a two-phase simulation, please use instead wettingNonWettingJFunctionTableName to specify the table names. -nonWettingIntermediateSurfaceTension real64 0 | Surface tension [N/m] for the pair (non-wetting phase, intermediate phase) - | If you have a value in [dyne/cm], divide it by 1000 to obtain the value in [N/m] - | Note that this input is only used for three-phase flow. - | If you want to do a two-phase simulation, please use instead wettingNonWettingSurfaceTension to specify the surface tensions. -permeabilityDirection geos_constitutive_JFunctionCapillaryPressure_PermeabilityDirection required | Permeability direction. Options are: - | XY - use the average of the permeabilities in the x and y directions, - | X - only use the permeability in the x direction, - | Y - only use the permeability in the y direction, - | Z - only use the permeability in the z direction. -permeabilityExponent real64 0.5 Permeability exponent -phaseNames groupNameRef_array required List of fluid phases -porosityExponent real64 0.5 Porosity exponent -wettingIntermediateJFunctionTableName groupNameRef | J-function table (dimensionless) for the pair (wetting phase, intermediate phase) - | Note that this input is only used for three-phase flow. - | If you want to do a two-phase simulation, please use instead wettingNonWettingJFunctionTableName to specify the table names. -wettingIntermediateSurfaceTension real64 0 | Surface tension [N/m] for the pair (wetting phase, intermediate phase) - | If you have a value in [dyne/cm], divide it by 1000 to obtain the value in [N/m] - | Note that this input is only used for three-phase flow. - | If you want to do a two-phase simulation, please use instead wettingNonWettingSurfaceTension to specify the surface tensions. -wettingNonWettingJFunctionTableName groupNameRef | J-function table (dimensionless) for the pair (wetting phase, non-wetting phase) - | Note that this input is only used for two-phase flow. - | If you want to do a three-phase simulation, please use instead wettingIntermediateJFunctionTableName and nonWettingIntermediateJFunctionTableName to specify the table names. -wettingNonWettingSurfaceTension real64 0 | Surface tension [N/m] for the pair (wetting phase, non-wetting phase) - | If you have a value in [dyne/cm], divide it by 1000 to obtain the value in [N/m] - | Note that this input is only used for two-phase flow. - | If you want to do a three-phase simulation, please use instead wettingIntermediateSurfaceTension and nonWettingIntermediateSurfaceTension to specify the surface tensions. -======================================== ================================================================== ======== ========================================================================================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst b/src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst deleted file mode 100644 index a9cd8c30fda..00000000000 --- a/src/coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -=================================== =================================================================================================== ============================================================================ -Name Type Description -=================================== =================================================================================================== ============================================================================ -dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction -jFuncMultiplier real64_array2d Multiplier for the Leverett J-function -jFunctionWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) -phaseCapPressure real64_array3d Phase capillary pressure -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -=================================== =================================================================================================== ============================================================================ - - diff --git a/src/coreComponents/schema/docs/LaplaceFEM.rst b/src/coreComponents/schema/docs/LaplaceFEM.rst deleted file mode 100644 index 21ff08859ec..00000000000 --- a/src/coreComponents/schema/docs/LaplaceFEM.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -========================= ======================================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ======================================== ======== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -fieldName groupNameRef required Name of field variable -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeIntegrationOption geos_LaplaceBaseH1_TimeIntegrationOption required | Time integration method. Options are: - | * SteadyState - | * ImplicitTransient -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ======================================== ======== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/LaplaceFEM_other.rst b/src/coreComponents/schema/docs/LaplaceFEM_other.rst deleted file mode 100644 index f296d4de732..00000000000 --- a/src/coreComponents/schema/docs/LaplaceFEM_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================================ -Name Type Description -========================= ====================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================================ - - diff --git a/src/coreComponents/schema/docs/Level0_other.rst b/src/coreComponents/schema/docs/Level0_other.rst deleted file mode 100644 index 14597cbcd99..00000000000 --- a/src/coreComponents/schema/docs/Level0_other.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -=========================== ======= ================================================ -Name Type Description -=========================== ======= ================================================ -meshLevel integer (no description available) -ElementRegions node :ref:`DATASTRUCTURE_ElementRegions` -ParticleRegions node :ref:`DATASTRUCTURE_ParticleRegions` -edgeManager node :ref:`DATASTRUCTURE_edgeManager` -embeddedSurfacesEdgeManager node :ref:`DATASTRUCTURE_embeddedSurfacesEdgeManager` -embeddedSurfacesNodeManager node :ref:`DATASTRUCTURE_embeddedSurfacesNodeManager` -faceManager node :ref:`DATASTRUCTURE_faceManager` -nodeManager node :ref:`DATASTRUCTURE_nodeManager` -=========================== ======= ================================================ - - diff --git a/src/coreComponents/schema/docs/LinearIsotropicDispersion.rst b/src/coreComponents/schema/docs/LinearIsotropicDispersion.rst deleted file mode 100644 index 705ac240c42..00000000000 --- a/src/coreComponents/schema/docs/LinearIsotropicDispersion.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -======================== ========= ======== =========================================== -Name Type Default Description -======================== ========= ======== =========================================== -longitudinalDispersivity real64 required Longitudinal dispersivity [m] -name groupName required A name is required for any non-unique nodes -======================== ========= ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/LinearIsotropicDispersion_other.rst b/src/coreComponents/schema/docs/LinearIsotropicDispersion_other.rst deleted file mode 100644 index 27d657ba903..00000000000 --- a/src/coreComponents/schema/docs/LinearIsotropicDispersion_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -============ ============== ============ -Name Type Description -============ ============== ============ -dispersivity real64_array3d Dispersivity -============ ============== ============ - - diff --git a/src/coreComponents/schema/docs/LinearSolverParameters.rst b/src/coreComponents/schema/docs/LinearSolverParameters.rst deleted file mode 100644 index 67d62e850dd..00000000000 --- a/src/coreComponents/schema/docs/LinearSolverParameters.rst +++ /dev/null @@ -1,43 +0,0 @@ - - -============================= ============================================== ============= ======================================================================================================================================================================================================================================================================================================================= -Name Type Default Description -============================= ============================================== ============= ======================================================================================================================================================================================================================================================================================================================= -amgAggressiveCoarseningLevels integer 0 AMG number of levels for aggressive coarsening -amgAggressiveCoarseningPaths integer 1 AMG number of paths for aggressive coarsening -amgAggressiveInterpType geos_LinearSolverParameters_AMG_AggInterpType multipass AMG aggressive interpolation algorithm. Available options are: ``default\|extendedIStage2\|standardStage2\|extendedStage2\|multipass\|modifiedExtended\|modifiedExtendedI\|modifiedExtendedE\|modifiedMultipass`` -amgCoarseSolver geos_LinearSolverParameters_AMG_CoarseType direct AMG coarsest level solver/smoother type. Available options are: ``default\|jacobi\|l1jacobi\|fgs\|sgs\|l1sgs\|chebyshev\|direct\|bgs`` -amgCoarseningType geos_LinearSolverParameters_AMG_CoarseningType HMIS AMG coarsening algorithm. Available options are: ``default\|CLJP\|RugeStueben\|Falgout\|PMIS\|HMIS`` -amgInterpolationMaxNonZeros integer 4 AMG interpolation maximum number of nonzeros per row -amgInterpolationType geos_LinearSolverParameters_AMG_InterpType extendedI AMG interpolation algorithm. Available options are: ``default\|modifiedClassical\|direct\|multipass\|extendedI\|standard\|extended\|directBAMG\|modifiedExtended\|modifiedExtendedI\|modifiedExtendedE`` -amgNullSpaceType geos_LinearSolverParameters_AMG_NullSpaceType constantModes AMG near null space approximation. Available options are:``constantModes\|rigidBodyModes`` -amgNumFunctions integer 1 AMG number of functions -amgNumSweeps integer 1 AMG smoother sweeps -amgRelaxWeight real64 1 AMG relaxation factor for the smoother -amgSeparateComponents integer 0 AMG apply separate component filter for multi-variable problems -amgSmootherType geos_LinearSolverParameters_AMG_SmootherType l1sgs AMG smoother type. Available options are: ``default\|jacobi\|l1jacobi\|fgs\|bgs\|sgs\|l1sgs\|chebyshev\|ilu0\|ilut\|ic0\|ict`` -amgThreshold real64 0 AMG strength-of-connection threshold -directCheckResidual integer 0 Whether to check the linear system solution residual -directColPerm geos_LinearSolverParameters_Direct_ColPerm metis How to permute the columns. Available options are: ``none\|MMD_AtplusA\|MMD_AtA\|colAMD\|metis\|parmetis`` -directEquil integer 1 Whether to scale the rows and columns of the matrix -directIterRef integer 1 Whether to perform iterative refinement -directParallel integer 1 Whether to use a parallel solver (instead of a serial one) -directReplTinyPivot integer 1 Whether to replace tiny pivots by sqrt(epsilon)*norm(A) -directRowPerm geos_LinearSolverParameters_Direct_RowPerm mc64 How to permute the rows. Available options are: ``none\|mc64`` -iluFill integer 0 ILU(K) fill factor -iluThreshold real64 0 ILU(T) threshold factor -krylovAdaptiveTol integer 0 Use Eisenstat-Walker adaptive linear tolerance -krylovMaxIter integer 200 Maximum iterations allowed for an iterative solver -krylovMaxRestart integer 200 Maximum iterations before restart (GMRES only) -krylovTol real64 1e-06 | Relative convergence tolerance of the iterative method - | If the method converges, the iterative solution :math:`\mathsf{x}_k` is such that - | the relative residual norm satisfies: - | :math:`\left\lVert \mathsf{b} - \mathsf{A} \mathsf{x}_k \right\rVert_2` < ``krylovTol`` * :math:`\left\lVert\mathsf{b}\right\rVert_2` -krylovWeakestTol real64 0.001 Weakest-allowed tolerance for adaptive method -logLevel integer 0 Log level -preconditionerType geos_LinearSolverParameters_PreconditionerType iluk Preconditioner type. Available options are: ``none\|jacobi\|l1jacobi\|fgs\|sgs\|l1sgs\|chebyshev\|iluk\|ilut\|icc\|ict\|amg\|mgr\|block\|direct\|bgs`` -solverType geos_LinearSolverParameters_SolverType direct Linear solver type. Available options are: ``direct\|cg\|gmres\|fgmres\|bicgstab\|preconditioner`` -stopIfError integer 1 Whether to stop the simulation if the linear solver reports an error -============================= ============================================== ============= ======================================================================================================================================================================================================================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/LinearSolverParameters_other.rst b/src/coreComponents/schema/docs/LinearSolverParameters_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/LinearSolverParameters_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Mesh.rst b/src/coreComponents/schema/docs/Mesh.rst deleted file mode 100644 index b64bf1d9e19..00000000000 --- a/src/coreComponents/schema/docs/Mesh.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================ ==== ======= =========================== -Name Type Default Description -================ ==== ======= =========================== -InternalMesh node :ref:`XML_InternalMesh` -InternalWellbore node :ref:`XML_InternalWellbore` -ParticleMesh node :ref:`XML_ParticleMesh` -VTKMesh node :ref:`XML_VTKMesh` -================ ==== ======= =========================== - - diff --git a/src/coreComponents/schema/docs/MeshBodies_other.rst b/src/coreComponents/schema/docs/MeshBodies_other.rst deleted file mode 100644 index 03f870a1bdc..00000000000 --- a/src/coreComponents/schema/docs/MeshBodies_other.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================ ==== ===================================== -Name Type Description -================ ==== ===================================== -InternalMesh node :ref:`DATASTRUCTURE_InternalMesh` -InternalWellbore node :ref:`DATASTRUCTURE_InternalWellbore` -ParticleMesh node :ref:`DATASTRUCTURE_ParticleMesh` -VTKMesh node :ref:`DATASTRUCTURE_VTKMesh` -================ ==== ===================================== - - diff --git a/src/coreComponents/schema/docs/Mesh_other.rst b/src/coreComponents/schema/docs/Mesh_other.rst deleted file mode 100644 index 03f870a1bdc..00000000000 --- a/src/coreComponents/schema/docs/Mesh_other.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================ ==== ===================================== -Name Type Description -================ ==== ===================================== -InternalMesh node :ref:`DATASTRUCTURE_InternalMesh` -InternalWellbore node :ref:`DATASTRUCTURE_InternalWellbore` -ParticleMesh node :ref:`DATASTRUCTURE_ParticleMesh` -VTKMesh node :ref:`DATASTRUCTURE_VTKMesh` -================ ==== ===================================== - - diff --git a/src/coreComponents/schema/docs/ModifiedCamClay.rst b/src/coreComponents/schema/docs/ModifiedCamClay.rst deleted file mode 100644 index 1784d9660fb..00000000000 --- a/src/coreComponents/schema/docs/ModifiedCamClay.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -=============================== ========= ======== ==================================================================== -Name Type Default Description -=============================== ========= ======== ==================================================================== -defaultCslSlope real64 1 Slope of the critical state line -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultPreConsolidationPressure real64 -1.5 Initial preconsolidation pressure -defaultRecompressionIndex real64 0.002 Recompresion Index -defaultRefPressure real64 -1 Reference Pressure -defaultRefStrainVol real64 0 Reference Volumetric Strain -defaultShearModulus real64 -1 Elastic Shear Modulus Parameter -defaultVirginCompressionIndex real64 0.005 Virgin compression index -name groupName required A name is required for any non-unique nodes -=============================== ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/ModifiedCamClay_other.rst b/src/coreComponents/schema/docs/ModifiedCamClay_other.rst deleted file mode 100644 index 9cbfc0ba5ef..00000000000 --- a/src/coreComponents/schema/docs/ModifiedCamClay_other.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -cslSlope real64_array Slope of the critical state line -density real64_array2d Material Density -oldPreConsolidationPressure real64_array2d Old preconsolidation pressure -oldStress real64_array3d Previous Material Stress -preConsolidationPressure real64_array2d New preconsolidation pressure -recompressionIndex real64_array Recompression Index Field -refPressure real64 Reference Pressure Field -refStrainVol real64 Reference Volumetric Strain -shearModulus real64_array Elastic Shear Modulus -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -virginCompressionIndex real64_array Virgin compression index -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/MultiPhaseConstantThermalConductivity.rst b/src/coreComponents/schema/docs/MultiPhaseConstantThermalConductivity.rst deleted file mode 100644 index 6e3bc5a89be..00000000000 --- a/src/coreComponents/schema/docs/MultiPhaseConstantThermalConductivity.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -============================= ================== ======== =============================================================================== -Name Type Default Description -============================= ================== ======== =============================================================================== -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -thermalConductivityComponents R1Tensor required xx, yy, and zz components of a diagonal thermal conductivity tensor [J/(s.m.K)] -============================= ================== ======== =============================================================================== - - diff --git a/src/coreComponents/schema/docs/MultiPhaseConstantThermalConductivity_other.rst b/src/coreComponents/schema/docs/MultiPhaseConstantThermalConductivity_other.rst deleted file mode 100644 index d05e1e4c5be..00000000000 --- a/src/coreComponents/schema/docs/MultiPhaseConstantThermalConductivity_other.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -======================================== ============== ========================================================================== -Name Type Description -======================================== ============== ========================================================================== -dEffectiveConductivity_dPhaseVolFraction real64_array4d Derivative of effective conductivity with respect to phase volume fraction -effectiveConductivity real64_array3d Effective conductivity -======================================== ============== ========================================================================== - - diff --git a/src/coreComponents/schema/docs/MultiPhaseVolumeWeightedThermalConductivity.rst b/src/coreComponents/schema/docs/MultiPhaseVolumeWeightedThermalConductivity.rst deleted file mode 100644 index 9e3b5842029..00000000000 --- a/src/coreComponents/schema/docs/MultiPhaseVolumeWeightedThermalConductivity.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================================= ================== ======== ================================================================================== -Name Type Default Description -================================= ================== ======== ================================================================================== -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -phaseThermalConductivity real64_array required Phase thermal conductivity [W/(m.K)] -rockThermalConductivityComponents R1Tensor required xx, yy, and zz components of a diagonal rock thermal conductivity tensor [W/(m.K)] -================================= ================== ======== ================================================================================== - - diff --git a/src/coreComponents/schema/docs/MultiPhaseVolumeWeightedThermalConductivity_other.rst b/src/coreComponents/schema/docs/MultiPhaseVolumeWeightedThermalConductivity_other.rst deleted file mode 100644 index 9884bfb7511..00000000000 --- a/src/coreComponents/schema/docs/MultiPhaseVolumeWeightedThermalConductivity_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -======================================== ============== ========================================================================== -Name Type Description -======================================== ============== ========================================================================== -dEffectiveConductivity_dPhaseVolFraction real64_array4d Derivative of effective conductivity with respect to phase volume fraction -effectiveConductivity real64_array3d Effective conductivity -rockThermalConductivity real64_array3d Rock thermal conductivity -======================================== ============== ========================================================================== - - diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanics.rst b/src/coreComponents/schema/docs/MultiphasePoromechanics.rst deleted file mode 100644 index 002c98b6c89..00000000000 --- a/src/coreComponents/schema/docs/MultiphasePoromechanics.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -stabilizationMultiplier real64 1 Constant multiplier of stabilization strength -stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. -stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: - | None- Add no stabilization to mass equation - | Global- Add jump stabilization to all faces - | Local- Add jump stabilization on interior of macro elements -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst b/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst deleted file mode 100644 index 18e3a0dd9e7..00000000000 --- a/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization_other.rst b/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/MultiphasePoromechanicsInitialization_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir.rst b/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir.rst deleted file mode 100644 index abe1a84cf22..00000000000 --- a/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -poromechanicsSolverName groupNameRef required Name of the poromechanics solver used by the coupled solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -wellSolverName groupNameRef required Name of the well solver used by the coupled solver -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst b/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst deleted file mode 100644 index cccf4603c70..00000000000 --- a/src/coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst b/src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst deleted file mode 100644 index dc33be0a036..00000000000 --- a/src/coreComponents/schema/docs/MultiphasePoromechanics_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/MultivariableTableFunction.rst b/src/coreComponents/schema/docs/MultivariableTableFunction.rst deleted file mode 100644 index e82bf5f8a22..00000000000 --- a/src/coreComponents/schema/docs/MultivariableTableFunction.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -============= ================== ======== =========================================== -Name Type Default Description -============= ================== ======== =========================================== -inputVarNames groupNameRef_array {} Name of fields are input to function. -name groupName required A name is required for any non-unique nodes -============= ================== ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/MultivariableTableFunction_other.rst b/src/coreComponents/schema/docs/MultivariableTableFunction_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/MultivariableTableFunction_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/NonlinearSolverParameters.rst b/src/coreComponents/schema/docs/NonlinearSolverParameters.rst deleted file mode 100644 index 536793a2dea..00000000000 --- a/src/coreComponents/schema/docs/NonlinearSolverParameters.rst +++ /dev/null @@ -1,47 +0,0 @@ - - -============================== ============================================================= ============= =================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ============================================================= ============= =================================================================================================================================================================================================================================================================================================================== -allowNonConverged integer 0 Allow non-converged solution to be accepted. (i.e. exit from the Newton loop without achieving the desired tolerance) -configurationTolerance real64 0 Configuration tolerance -couplingType geos_NonlinearSolverParameters_CouplingType FullyImplicit | Type of coupling. Valid options: - | * FullyImplicit - | * Sequential -lineSearchAction geos_NonlinearSolverParameters_LineSearchAction Attempt | How the line search is to be used. Options are: - | * None - Do not use line search. - | * Attempt - Use line search. Allow exit from line search without achieving smaller residual than starting residual. - | * Require - Use line search. If smaller residual than starting resdual is not achieved, cut time step. -lineSearchCutFactor real64 0.5 Line search cut factor. For instance, a value of 0.5 will result in the effective application of the last solution by a factor of (0.5, 0.25, 0.125, ...) -lineSearchInterpolationType geos_NonlinearSolverParameters_LineSearchInterpolationType Linear | Strategy to cut the solution update during the line search. Options are: - | * Linear - | * Parabolic -lineSearchMaxCuts integer 4 Maximum number of line search cuts. -lineSearchResidualFactor real64 1 Factor to determine residual increase (recommended values: 1.1 (conservative), 2.0 (relaxed), 10.0 (aggressive)). -lineSearchStartingIteration integer 0 Iteration when line search starts. -logLevel integer 0 Log level -maxAllowedResidualNorm real64 1e+09 Maximum value of residual norm that is allowed in a Newton loop -maxNumConfigurationAttempts integer 10 Max number of times that the configuration can be changed -maxSubSteps integer 10 Maximum number of time sub-steps allowed for the solver -maxTimeStepCuts integer 2 Max number of time step cuts -minNormalizer real64 1e-12 Value used to make sure that residual normalizers are not too small when computing residual norm. -newtonMaxIter integer 5 Maximum number of iterations that are allowed in a Newton loop. -newtonMinIter integer 1 Minimum number of iterations that are required before exiting the Newton loop. -newtonTol real64 1e-06 The required tolerance in order to exit the Newton iteration loop. -nonlinearAccelerationType geos_NonlinearSolverParameters_NonlinearAccelerationType None Nonlinear acceleration type for sequential solver. -normType geos_solverBaseKernels_NormType Linfinity | Norm used by the flow solver to check nonlinear convergence. Valid options: - | * Linfinity - | * L2 -sequentialConvergenceCriterion geos_NonlinearSolverParameters_SequentialConvergenceCriterion ResidualNorm | Criterion used to check outer-loop convergence in sequential schemes. Valid options: - | * ResidualNorm - | * NumberOfNonlinearIterations - | * SolutionIncrements -subcycling integer 0 Flag to decide whether to iterate between sequentially coupled solvers or not. -timeStepCutFactor real64 0.5 Factor by which the time step will be cut if a timestep cut is required. -timeStepDecreaseFactor real64 0.5 Factor by which the time step is decreased when the number of Newton iterations is large. -timeStepDecreaseIterLimit real64 0.7 Fraction of the max Newton iterations above which the solver asks for the time-step to be decreased for the next time step. -timeStepIncreaseFactor real64 2 Factor by which the time step is increased when the number of Newton iterations is small. -timeStepIncreaseIterLimit real64 0.4 Fraction of the max Newton iterations below which the solver asks for the time-step to be increased for the next time step. -============================== ============================================================= ============= =================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/NonlinearSolverParameters_other.rst b/src/coreComponents/schema/docs/NonlinearSolverParameters_other.rst deleted file mode 100644 index 4ead4f562eb..00000000000 --- a/src/coreComponents/schema/docs/NonlinearSolverParameters_other.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -======================== =============================== ============================================================================================== -Name Type Description -======================== =============================== ============================================================================================== -newtonNumberOfIterations integer Number of Newton's iterations. -normType geos_solverBaseKernels_NormType | Norm used by the flow solver to check nonlinear convergence. Valid options: - | * Linfinity - | * L2 -======================== =============================== ============================================================================================== - - diff --git a/src/coreComponents/schema/docs/NullModel.rst b/src/coreComponents/schema/docs/NullModel.rst deleted file mode 100644 index f6c735e1d91..00000000000 --- a/src/coreComponents/schema/docs/NullModel.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ========= ======== =========================================== -Name Type Default Description -==== ========= ======== =========================================== -name groupName required A name is required for any non-unique nodes -==== ========= ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/NullModel_other.rst b/src/coreComponents/schema/docs/NullModel_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/NullModel_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/NumericalMethods.rst b/src/coreComponents/schema/docs/NumericalMethods.rst deleted file mode 100644 index 8eacb5881ba..00000000000 --- a/src/coreComponents/schema/docs/NumericalMethods.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -============== ==== ======= ========================= -Name Type Default Description -============== ==== ======= ========================= -FiniteElements node unique :ref:`XML_FiniteElements` -FiniteVolume node unique :ref:`XML_FiniteVolume` -============== ==== ======= ========================= - - diff --git a/src/coreComponents/schema/docs/NumericalMethods_other.rst b/src/coreComponents/schema/docs/NumericalMethods_other.rst deleted file mode 100644 index 8db7a57c3d9..00000000000 --- a/src/coreComponents/schema/docs/NumericalMethods_other.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -============== ==== =================================== -Name Type Description -============== ==== =================================== -FiniteElements node :ref:`DATASTRUCTURE_FiniteElements` -FiniteVolume node :ref:`DATASTRUCTURE_FiniteVolume` -============== ==== =================================== - - diff --git a/src/coreComponents/schema/docs/Outputs.rst b/src/coreComponents/schema/docs/Outputs.rst deleted file mode 100644 index 9950b014151..00000000000 --- a/src/coreComponents/schema/docs/Outputs.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=========== ==== ======= ====================== -Name Type Default Description -=========== ==== ======= ====================== -Blueprint node :ref:`XML_Blueprint` -ChomboIO node :ref:`XML_ChomboIO` -Python node :ref:`XML_Python` -Restart node :ref:`XML_Restart` -Silo node :ref:`XML_Silo` -TimeHistory node :ref:`XML_TimeHistory` -VTK node :ref:`XML_VTK` -=========== ==== ======= ====================== - - diff --git a/src/coreComponents/schema/docs/Outputs_other.rst b/src/coreComponents/schema/docs/Outputs_other.rst deleted file mode 100644 index cbcc1b80401..00000000000 --- a/src/coreComponents/schema/docs/Outputs_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=========== ==== ================================ -Name Type Description -=========== ==== ================================ -Blueprint node :ref:`DATASTRUCTURE_Blueprint` -ChomboIO node :ref:`DATASTRUCTURE_ChomboIO` -Python node :ref:`DATASTRUCTURE_Python` -Restart node :ref:`DATASTRUCTURE_Restart` -Silo node :ref:`DATASTRUCTURE_Silo` -TimeHistory node :ref:`DATASTRUCTURE_TimeHistory` -VTK node :ref:`DATASTRUCTURE_VTK` -=========== ==== ================================ - - diff --git a/src/coreComponents/schema/docs/PML.rst b/src/coreComponents/schema/docs/PML.rst deleted file mode 100644 index 7aa79ed39a6..00000000000 --- a/src/coreComponents/schema/docs/PML.rst +++ /dev/null @@ -1,26 +0,0 @@ - - -====================== ================== ======================================== ================================================================================================== -Name Type Default Description -====================== ================== ======================================== ================================================================================================== -bcApplicationTableName groupNameRef Name of table that specifies the on/off application of the boundary condition. -beginTime real64 -1e+99 Time at which the boundary condition will start being applied. -component integer -1 Component of field (if tensor) to apply boundary condition to. -direction R1Tensor {0,0,0} Direction to apply boundary condition to. -endTime real64 1e+99 Time at which the boundary condition will stop being applied. -functionName groupNameRef Name of function that specifies variation of the boundary condition. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -objectPath groupNameRef Path to the target field -reflectivity real32 0.001 Desired reflectivity of the PML region, used to compute the damping profile -scale real64 0 Scale factor for value of the boundary condition. -setNames groupNameRef_array required Name of sets that boundary condition is applied to. -thicknessMaxXYZ R1Tensor32 {-1,-1,-1} Thickness of the PML region, at right, back, and bottom sides, used to compute the damping profile -thicknessMinXYZ R1Tensor32 {-1,-1,-1} Thickness of the PML region, at left, front, and top sides, used to compute the damping profile -waveSpeedMaxXYZ R1Tensor32 {-1,-1,-1} Wave speed in the PML, at right, back, and bottom sides, used to compute the damping profile -waveSpeedMinXYZ R1Tensor32 {-1,-1,-1} Wave speed in the PML, at left, front, and top sides, used to compute the damping profile -xMax R1Tensor32 {3.40282e+38,3.40282e+38,3.40282e+38} Maximum (x,y,z) coordinates of the inner PML boundaries -xMin R1Tensor32 {-3.40282e+38,-3.40282e+38,-3.40282e+38} Minimum (x,y,z) coordinates of the inner PML boundaries -====================== ================== ======================================== ================================================================================================== - - diff --git a/src/coreComponents/schema/docs/PML_other.rst b/src/coreComponents/schema/docs/PML_other.rst deleted file mode 100644 index 32f3b5042b3..00000000000 --- a/src/coreComponents/schema/docs/PML_other.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -================ ============ ====================================================== -Name Type Description -================ ============ ====================================================== -fieldName groupNameRef Name of field that boundary condition is applied to. -initialCondition integer Boundary condition is applied as an initial condition. -================ ============ ====================================================== - - diff --git a/src/coreComponents/schema/docs/PVTDriver.rst b/src/coreComponents/schema/docs/PVTDriver.rst deleted file mode 100644 index 9196c73c11a..00000000000 --- a/src/coreComponents/schema/docs/PVTDriver.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -====================== ============ ======== ===================================================================== -Name Type Default Description -====================== ============ ======== ===================================================================== -baseline path none Baseline file -feedComposition real64_array required Feed composition array [mol fraction] -fluid groupNameRef required Fluid to test -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -output string none Output file -outputCompressibility integer 0 Flag to indicate that the total compressibility should be output -outputMassDensity integer 0 Flag to indicate that the mass density of each phase should be output -outputPhaseComposition integer 0 Flag to indicate that phase compositions should be output -pressureControl groupNameRef required Function controlling pressure time history -steps integer required Number of load steps to take -temperatureControl groupNameRef required Function controlling temperature time history -====================== ============ ======== ===================================================================== - - diff --git a/src/coreComponents/schema/docs/PVTDriver_other.rst b/src/coreComponents/schema/docs/PVTDriver_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PVTDriver_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PackCollection.rst b/src/coreComponents/schema/docs/PackCollection.rst deleted file mode 100644 index 0548e8255d7..00000000000 --- a/src/coreComponents/schema/docs/PackCollection.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -====================== ================== ======== =========================================================================================== -Name Type Default Description -====================== ================== ======== =========================================================================================== -disableCoordCollection integer 0 Whether or not to create coordinate meta-collectors if collected objects are mesh objects. -fieldName groupNameRef required The name of the (packable) field associated with the specified object to retrieve data from -name groupName required A name is required for any non-unique nodes -objectPath groupNameRef required The name of the object from which to retrieve field values. -onlyOnSetChange integer 0 Whether or not to only collect when the collected sets of indices change in any way. -setNames groupNameRef_array {} The set(s) for which to retrieve data. -====================== ================== ======== =========================================================================================== - - diff --git a/src/coreComponents/schema/docs/PackCollection_other.rst b/src/coreComponents/schema/docs/PackCollection_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PackCollection_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/ParallelPlatesPermeability.rst b/src/coreComponents/schema/docs/ParallelPlatesPermeability.rst deleted file mode 100644 index 3302c76016c..00000000000 --- a/src/coreComponents/schema/docs/ParallelPlatesPermeability.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -======================= ========= ======== =========================================================================================================================== -Name Type Default Description -======================= ========= ======== =========================================================================================================================== -name groupName required A name is required for any non-unique nodes -transversalPermeability real64 -1 Default value of the permeability normal to the surface. If not specified the permeability is updated using the cubic law. -======================= ========= ======== =========================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/ParallelPlatesPermeability_other.rst b/src/coreComponents/schema/docs/ParallelPlatesPermeability_other.rst deleted file mode 100644 index 43a2d06a562..00000000000 --- a/src/coreComponents/schema/docs/ParallelPlatesPermeability_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -=============== ============== ================================================================= -Name Type Description -=============== ============== ================================================================= -dPerm_dDispJump real64_array4d Derivative of rock permeability with respect to displacement jump -dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure -permeability real64_array3d Rock permeability -=============== ============== ================================================================= - - diff --git a/src/coreComponents/schema/docs/Parameter.rst b/src/coreComponents/schema/docs/Parameter.rst deleted file mode 100644 index d9baf793024..00000000000 --- a/src/coreComponents/schema/docs/Parameter.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -===== ========= ======== =============================================== -Name Type Default Description -===== ========= ======== =============================================== -name groupName required A name is required for any non-unique nodes -value string required Input parameter definition for the preprocessor -===== ========= ======== =============================================== - - diff --git a/src/coreComponents/schema/docs/Parameter_other.rst b/src/coreComponents/schema/docs/Parameter_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/Parameter_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Parameters.rst b/src/coreComponents/schema/docs/Parameters.rst deleted file mode 100644 index c871a1cfb34..00000000000 --- a/src/coreComponents/schema/docs/Parameters.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -========= ==== ======= ==================== -Name Type Default Description -========= ==== ======= ==================== -Parameter node :ref:`XML_Parameter` -========= ==== ======= ==================== - - diff --git a/src/coreComponents/schema/docs/Parameters_other.rst b/src/coreComponents/schema/docs/Parameters_other.rst deleted file mode 100644 index 626d3944b70..00000000000 --- a/src/coreComponents/schema/docs/Parameters_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -========= ==== ============================== -Name Type Description -========= ==== ============================== -Parameter node :ref:`DATASTRUCTURE_Parameter` -========= ==== ============================== - - diff --git a/src/coreComponents/schema/docs/ParticleFluid.rst b/src/coreComponents/schema/docs/ParticleFluid.rst deleted file mode 100644 index 6f659a16e35..00000000000 --- a/src/coreComponents/schema/docs/ParticleFluid.rst +++ /dev/null @@ -1,23 +0,0 @@ - - -=========================== ======================================= ======== ======================================================================================== -Name Type Default Description -=========================== ======================================= ======== ======================================================================================== -collisionAlpha real64 1.27 Collision alpha coefficient -collisionBeta real64 1.5 Collision beta coefficient -fluidViscosity real64 0.001 Fluid viscosity -hinderedSettlingCoefficient real64 5.9 Hindered settling coefficient -isCollisionalSlip integer 0 Whether the collisional component of the slip velocity is considered -maxProppantConcentration real64 0.6 Max proppant concentration -name groupName required A name is required for any non-unique nodes -particleSettlingModel geos_constitutive_ParticleSettlingModel required | Particle settling velocity model. Valid options: - | * Stokes - | * Intermediate - | * Turbulence -proppantDensity real64 1400 Proppant density -proppantDiameter real64 0.0002 Proppant diameter -slipConcentration real64 0.1 Slip concentration -sphericity real64 1 Sphericity -=========================== ======================================= ======== ======================================================================================== - - diff --git a/src/coreComponents/schema/docs/ParticleFluid_other.rst b/src/coreComponents/schema/docs/ParticleFluid_other.rst deleted file mode 100644 index bd2a5de8053..00000000000 --- a/src/coreComponents/schema/docs/ParticleFluid_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -======================================= ============== ===================================================================== -Name Type Description -======================================= ============== ===================================================================== -collisionFactor real64_array Collision factor -dCollisionFactor_dProppantConcentration real64_array Derivative of collision factor with respect to proppant concentration -dSettlingFactor_dComponentConcentration real64_array2d Derivative of settling factor with respect to component concentration -dSettlingFactor_dPressure real64_array Derivative of settling factor with respect to pressure -dSettlingFactor_dProppantConcentration real64_array Derivative of settling factor with respect to proppant concentration -proppantPackPermeability real64_array Proppant pack permeability -settlingFactor real64_array Settling factor -======================================= ============== ===================================================================== - - diff --git a/src/coreComponents/schema/docs/ParticleMesh.rst b/src/coreComponents/schema/docs/ParticleMesh.rst deleted file mode 100644 index 435f9ccf07a..00000000000 --- a/src/coreComponents/schema/docs/ParticleMesh.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -================== ============ ======== =========================================== -Name Type Default Description -================== ============ ======== =========================================== -headerFile path required path to the header file -name groupName required A name is required for any non-unique nodes -particleBlockNames string_array required Names of each particle block -particleFile path required path to the particle file -particleTypes string_array required Particle types of each particle block -================== ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/ParticleMesh_other.rst b/src/coreComponents/schema/docs/ParticleMesh_other.rst deleted file mode 100644 index 14257041f64..00000000000 --- a/src/coreComponents/schema/docs/ParticleMesh_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -========== ==== =============================== -Name Type Description -========== ==== =============================== -meshLevels node :ref:`DATASTRUCTURE_meshLevels` -========== ==== =============================== - - diff --git a/src/coreComponents/schema/docs/ParticleRegion.rst b/src/coreComponents/schema/docs/ParticleRegion.rst deleted file mode 100644 index 6cfaeb99938..00000000000 --- a/src/coreComponents/schema/docs/ParticleRegion.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============== ============ ======== =========================================== -Name Type Default Description -============== ============ ======== =========================================== -materialList string_array required List of materials present in this region -meshBody string Mesh body that contains this region -name groupName required A name is required for any non-unique nodes -particleBlocks string_array {} (no description available) -============== ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/ParticleRegion_other.rst b/src/coreComponents/schema/docs/ParticleRegion_other.rst deleted file mode 100644 index 6d535e7b280..00000000000 --- a/src/coreComponents/schema/docs/ParticleRegion_other.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -======================= ================================================================= ========================================================= -Name Type Description -======================= ================================================================= ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -neighborData node :ref:`DATASTRUCTURE_neighborData` -particleSubRegions node :ref:`DATASTRUCTURE_particleSubRegions` -sets node :ref:`DATASTRUCTURE_sets` -======================= ================================================================= ========================================================= - - diff --git a/src/coreComponents/schema/docs/ParticleRegions.rst b/src/coreComponents/schema/docs/ParticleRegions.rst deleted file mode 100644 index bd41c7378b9..00000000000 --- a/src/coreComponents/schema/docs/ParticleRegions.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -============== ==== ======= ========================= -Name Type Default Description -============== ==== ======= ========================= -ParticleRegion node :ref:`XML_ParticleRegion` -============== ==== ======= ========================= - - diff --git a/src/coreComponents/schema/docs/ParticleRegions_other.rst b/src/coreComponents/schema/docs/ParticleRegions_other.rst deleted file mode 100644 index 800947cc16c..00000000000 --- a/src/coreComponents/schema/docs/ParticleRegions_other.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -======================= ================================================================= ========================================================= -Name Type Description -======================= ================================================================= ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -ParticleRegion node :ref:`DATASTRUCTURE_ParticleRegion` -neighborData node :ref:`DATASTRUCTURE_neighborData` -particleRegionsGroup node :ref:`DATASTRUCTURE_particleRegionsGroup` -sets node :ref:`DATASTRUCTURE_sets` -======================= ================================================================= ========================================================= - - diff --git a/src/coreComponents/schema/docs/PerfectlyPlastic.rst b/src/coreComponents/schema/docs/PerfectlyPlastic.rst deleted file mode 100644 index 019ce1379dc..00000000000 --- a/src/coreComponents/schema/docs/PerfectlyPlastic.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -======================= ========= ============ ==================================================================== -Name Type Default Description -======================= ========= ============ ==================================================================== -defaultBulkModulus real64 -1 Default Bulk Modulus Parameter -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultPoissonRatio real64 -1 Default Poisson's Ratio -defaultShearModulus real64 -1 Default Shear Modulus Parameter -defaultYieldStress real64 1.79769e+308 Default yield stress -defaultYoungModulus real64 -1 Default Young's Modulus -name groupName required A name is required for any non-unique nodes -======================= ========= ============ ==================================================================== - - diff --git a/src/coreComponents/schema/docs/PerfectlyPlastic_other.rst b/src/coreComponents/schema/docs/PerfectlyPlastic_other.rst deleted file mode 100644 index b1207ce6f4a..00000000000 --- a/src/coreComponents/schema/docs/PerfectlyPlastic_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -bulkModulus real64_array Elastic Bulk Modulus Field -density real64_array2d Material Density -oldStress real64_array3d Previous Material Stress -shearModulus real64_array Elastic Shear Modulus Field -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -yieldStress real64_array Array of element yield stresses -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/Perforation.rst b/src/coreComponents/schema/docs/Perforation.rst deleted file mode 100644 index 60a3f8c0b92..00000000000 --- a/src/coreComponents/schema/docs/Perforation.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================ ========= ======== ================================================= -Name Type Default Description -================ ========= ======== ================================================= -distanceFromHead real64 required Linear distance from well head to the perforation -name groupName required A name is required for any non-unique nodes -skinFactor real64 0 Perforation skin factor -transmissibility real64 -1 Perforation transmissibility -================ ========= ======== ================================================= - - diff --git a/src/coreComponents/schema/docs/Perforation_other.rst b/src/coreComponents/schema/docs/Perforation_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/Perforation_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PeriodicEvent.rst b/src/coreComponents/schema/docs/PeriodicEvent.rst deleted file mode 100644 index 3f1c9b21b88..00000000000 --- a/src/coreComponents/schema/docs/PeriodicEvent.rst +++ /dev/null @@ -1,28 +0,0 @@ - - -==================== ============ ======== ================================================================================================================================================================================= -Name Type Default Description -==================== ============ ======== ================================================================================================================================================================================= -beginTime real64 0 Start time of this event. -cycleFrequency integer 1 Event application frequency (cycle, default) -endTime real64 1e+100 End time of this event. -finalDtStretch real64 0.001 Allow the final dt request for this event to grow by this percentage to match the endTime exactly. -forceDt real64 -1 While active, this event will request this timestep value (ignoring any children/targets requests). -function groupNameRef Name of an optional function to evaluate when the time/cycle criteria are met.If the result is greater than the specified eventThreshold, the function will continue to execute. -logLevel integer 0 Log level -maxEventDt real64 -1 While active, this event will request a timestep <= this value (depending upon any child/target requests). -name groupName required A name is required for any non-unique nodes -object groupNameRef If the optional function requires an object as an input, specify its path here. -set groupNameRef If the optional function is applied to an object, specify the setname to evaluate (default = everything). -stat integer 0 If the optional function is applied to an object, specify the statistic to compare to the eventThreshold.The current options include: min, avg, and max. -target groupNameRef Name of the object to be executed when the event criteria are met. -targetExactStartStop integer 1 If this option is set, the event will reduce its timestep requests to match any specified beginTime/endTimes exactly. -targetExactTimestep integer 1 If this option is set, the event will reduce its timestep requests to match the specified timeFrequency perfectly: dt_request = min(dt_request, t_last + time_frequency - time)). -threshold real64 0 If the optional function is used, the event will execute if the value returned by the function exceeds this threshold. -timeFrequency real64 -1 Event application frequency (time). Note: if this value is specified, it will override any cycle-based behavior. -HaltEvent node :ref:`XML_HaltEvent` -PeriodicEvent node :ref:`XML_PeriodicEvent` -SoloEvent node :ref:`XML_SoloEvent` -==================== ============ ======== ================================================================================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/PeriodicEvent_other.rst b/src/coreComponents/schema/docs/PeriodicEvent_other.rst deleted file mode 100644 index f63756dd49b..00000000000 --- a/src/coreComponents/schema/docs/PeriodicEvent_other.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -================= ======= =============================================== -Name Type Description -================= ======= =============================================== -currentSubEvent integer Index of the current subevent -eventForecast integer Indicates when the event is expected to execute -isTargetExecuting integer Index of the current subevent -lastCycle integer Last event occurrence (cycle) -lastTime real64 Last event occurrence (time) -HaltEvent node :ref:`DATASTRUCTURE_HaltEvent` -PeriodicEvent node :ref:`DATASTRUCTURE_PeriodicEvent` -SoloEvent node :ref:`DATASTRUCTURE_SoloEvent` -================= ======= =============================================== - - diff --git a/src/coreComponents/schema/docs/PhaseFieldDamageFEM.rst b/src/coreComponents/schema/docs/PhaseFieldDamageFEM.rst deleted file mode 100644 index 738d26eb91a..00000000000 --- a/src/coreComponents/schema/docs/PhaseFieldDamageFEM.rst +++ /dev/null @@ -1,22 +0,0 @@ - - -========================= ============================================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ============================================== ======== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -damageUpperBound real64 1.5 The upper bound of the damage -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -fieldName groupNameRef required name of field variable -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -irreversibilityFlag integer 0 The flag to indicate whether to apply the irreversibility constraint -localDissipation geos_PhaseFieldDamageFEM_LocalDissipation required Type of local dissipation function. Can be Linear or Quadratic -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeIntegrationOption geos_PhaseFieldDamageFEM_TimeIntegrationOption required option for default time integration method -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ============================================== ======== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst b/src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst deleted file mode 100644 index f296d4de732..00000000000 --- a/src/coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================================ -Name Type Description -========================= ====================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================================ - - diff --git a/src/coreComponents/schema/docs/PhaseFieldFracture.rst b/src/coreComponents/schema/docs/PhaseFieldFracture.rst deleted file mode 100644 index eb49f03806a..00000000000 --- a/src/coreComponents/schema/docs/PhaseFieldFracture.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -damageSolverName groupNameRef required Name of the damage solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/PhaseFieldFracture_other.rst b/src/coreComponents/schema/docs/PhaseFieldFracture_other.rst deleted file mode 100644 index cccf4603c70..00000000000 --- a/src/coreComponents/schema/docs/PhaseFieldFracture_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/PorousDamageElasticIsotropic.rst b/src/coreComponents/schema/docs/PorousDamageElasticIsotropic.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousDamageElasticIsotropic.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousDamageElasticIsotropic_other.rst b/src/coreComponents/schema/docs/PorousDamageElasticIsotropic_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousDamageElasticIsotropic_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousDamageSpectralElasticIsotropic.rst b/src/coreComponents/schema/docs/PorousDamageSpectralElasticIsotropic.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousDamageSpectralElasticIsotropic.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousDamageSpectralElasticIsotropic_other.rst b/src/coreComponents/schema/docs/PorousDamageSpectralElasticIsotropic_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousDamageSpectralElasticIsotropic_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousDamageVolDevElasticIsotropic.rst b/src/coreComponents/schema/docs/PorousDamageVolDevElasticIsotropic.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousDamageVolDevElasticIsotropic.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousDamageVolDevElasticIsotropic_other.rst b/src/coreComponents/schema/docs/PorousDamageVolDevElasticIsotropic_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousDamageVolDevElasticIsotropic_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousDelftEgg.rst b/src/coreComponents/schema/docs/PorousDelftEgg.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousDelftEgg.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousDelftEgg_other.rst b/src/coreComponents/schema/docs/PorousDelftEgg_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousDelftEgg_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousDruckerPrager.rst b/src/coreComponents/schema/docs/PorousDruckerPrager.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousDruckerPrager.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousDruckerPrager_other.rst b/src/coreComponents/schema/docs/PorousDruckerPrager_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousDruckerPrager_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousElasticIsotropic.rst b/src/coreComponents/schema/docs/PorousElasticIsotropic.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousElasticIsotropic.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousElasticIsotropic_other.rst b/src/coreComponents/schema/docs/PorousElasticIsotropic_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousElasticIsotropic_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousElasticOrthotropic.rst b/src/coreComponents/schema/docs/PorousElasticOrthotropic.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousElasticOrthotropic.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousElasticOrthotropic_other.rst b/src/coreComponents/schema/docs/PorousElasticOrthotropic_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousElasticOrthotropic_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousElasticTransverseIsotropic.rst b/src/coreComponents/schema/docs/PorousElasticTransverseIsotropic.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousElasticTransverseIsotropic.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousElasticTransverseIsotropic_other.rst b/src/coreComponents/schema/docs/PorousElasticTransverseIsotropic_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousElasticTransverseIsotropic_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousExtendedDruckerPrager.rst b/src/coreComponents/schema/docs/PorousExtendedDruckerPrager.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousExtendedDruckerPrager.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousExtendedDruckerPrager_other.rst b/src/coreComponents/schema/docs/PorousExtendedDruckerPrager_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousExtendedDruckerPrager_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousModifiedCamClay.rst b/src/coreComponents/schema/docs/PorousModifiedCamClay.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousModifiedCamClay.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousModifiedCamClay_other.rst b/src/coreComponents/schema/docs/PorousModifiedCamClay_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousModifiedCamClay_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousViscoDruckerPrager.rst b/src/coreComponents/schema/docs/PorousViscoDruckerPrager.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousViscoDruckerPrager.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousViscoDruckerPrager_other.rst b/src/coreComponents/schema/docs/PorousViscoDruckerPrager_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousViscoDruckerPrager_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousViscoExtendedDruckerPrager.rst b/src/coreComponents/schema/docs/PorousViscoExtendedDruckerPrager.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousViscoExtendedDruckerPrager.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousViscoExtendedDruckerPrager_other.rst b/src/coreComponents/schema/docs/PorousViscoExtendedDruckerPrager_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousViscoExtendedDruckerPrager_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PorousViscoModifiedCamClay.rst b/src/coreComponents/schema/docs/PorousViscoModifiedCamClay.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/PorousViscoModifiedCamClay.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/PorousViscoModifiedCamClay_other.rst b/src/coreComponents/schema/docs/PorousViscoModifiedCamClay_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/PorousViscoModifiedCamClay_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/PressurePermeability.rst b/src/coreComponents/schema/docs/PressurePermeability.rst deleted file mode 100644 index b8f04d3f124..00000000000 --- a/src/coreComponents/schema/docs/PressurePermeability.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -=============================== =================================== ========== ===================================================================== -Name Type Default Description -=============================== =================================== ========== ===================================================================== -maxPermeability real64 1 Max. permeability can be reached. -name groupName required A name is required for any non-unique nodes -pressureDependenceConstants R1Tensor required Pressure dependence coefficients for each permeability component. -pressureModelType geos_constitutive_PressureModelType Hyperbolic Type of the pressure dependence model. -referencePermeabilityComponents R1Tensor required Reference xx, yy and zz components of a diagonal permeability tensor. -referencePressure real64 required Reference pressure for the pressure permeability model -=============================== =================================== ========== ===================================================================== - - diff --git a/src/coreComponents/schema/docs/PressurePermeability_other.rst b/src/coreComponents/schema/docs/PressurePermeability_other.rst deleted file mode 100644 index dd549711708..00000000000 --- a/src/coreComponents/schema/docs/PressurePermeability_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -===================== ============== ======================================================== -Name Type Description -===================== ============== ======================================================== -dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure -permeability real64_array3d Rock permeability -referencePermeability real64_array3d Reference permeability field -===================== ============== ======================================================== - - diff --git a/src/coreComponents/schema/docs/PressurePorosity.rst b/src/coreComponents/schema/docs/PressurePorosity.rst deleted file mode 100644 index 1025b310512..00000000000 --- a/src/coreComponents/schema/docs/PressurePorosity.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -======================== ========= ======== ============================================ -Name Type Default Description -======================== ========= ======== ============================================ -compressibility real64 required Solid compressibility -defaultReferencePorosity real64 required Default value of the reference porosity -name groupName required A name is required for any non-unique nodes -referencePressure real64 required Reference pressure for solid compressibility -======================== ========= ======== ============================================ - - diff --git a/src/coreComponents/schema/docs/PressurePorosity_other.rst b/src/coreComponents/schema/docs/PressurePorosity_other.rst deleted file mode 100644 index 17d801d7587..00000000000 --- a/src/coreComponents/schema/docs/PressurePorosity_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -====================== ============== ======================================================= -Name Type Description -====================== ============== ======================================================= -dPorosity_dPressure real64_array2d Derivative of rock porosity with respect to pressure -dPorosity_dTemperature real64_array2d Derivative of rock porosity with respect to temperature -initialPorosity real64_array2d Initial porosity -porosity real64_array2d Rock porosity -porosity_n real64_array2d Rock porosity at the previous converged time step -referencePorosity real64_array Reference porosity -====================== ============== ======================================================= - - diff --git a/src/coreComponents/schema/docs/Problem.rst b/src/coreComponents/schema/docs/Problem.rst deleted file mode 100644 index a34b51acf38..00000000000 --- a/src/coreComponents/schema/docs/Problem.rst +++ /dev/null @@ -1,23 +0,0 @@ - - -=================== ==== ================ ============================== -Name Type Default Description -=================== ==== ================ ============================== -Benchmarks node unique :ref:`XML_Benchmarks` -Constitutive node unique :ref:`XML_Constitutive` -ElementRegions node unique :ref:`XML_ElementRegions` -Events node unique, required :ref:`XML_Events` -FieldSpecifications node unique :ref:`XML_FieldSpecifications` -Functions node unique :ref:`XML_Functions` -Geometry node unique :ref:`XML_Geometry` -Included node unique :ref:`XML_Included` -Mesh node unique, required :ref:`XML_Mesh` -NumericalMethods node unique :ref:`XML_NumericalMethods` -Outputs node unique, required :ref:`XML_Outputs` -Parameters node unique :ref:`XML_Parameters` -ParticleRegions node unique :ref:`XML_ParticleRegions` -Solvers node unique, required :ref:`XML_Solvers` -Tasks node unique :ref:`XML_Tasks` -=================== ==== ================ ============================== - - diff --git a/src/coreComponents/schema/docs/Problem_other.rst b/src/coreComponents/schema/docs/Problem_other.rst deleted file mode 100644 index 2f154100ff3..00000000000 --- a/src/coreComponents/schema/docs/Problem_other.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -=================== ==== ======================================== -Name Type Description -=================== ==== ======================================== -Benchmarks node :ref:`DATASTRUCTURE_Benchmarks` -Constitutive node :ref:`DATASTRUCTURE_Constitutive` -ElementRegions node :ref:`DATASTRUCTURE_ElementRegions` -Events node :ref:`DATASTRUCTURE_Events` -FieldSpecifications node :ref:`DATASTRUCTURE_FieldSpecifications` -Functions node :ref:`DATASTRUCTURE_Functions` -Geometry node :ref:`DATASTRUCTURE_Geometry` -Included node :ref:`DATASTRUCTURE_Included` -Mesh node :ref:`DATASTRUCTURE_Mesh` -NumericalMethods node :ref:`DATASTRUCTURE_NumericalMethods` -Outputs node :ref:`DATASTRUCTURE_Outputs` -Parameters node :ref:`DATASTRUCTURE_Parameters` -ParticleRegions node :ref:`DATASTRUCTURE_ParticleRegions` -Solvers node :ref:`DATASTRUCTURE_Solvers` -Tasks node :ref:`DATASTRUCTURE_Tasks` -commandLine node :ref:`DATASTRUCTURE_commandLine` -domain node :ref:`DATASTRUCTURE_domain` -=================== ==== ======================================== - - diff --git a/src/coreComponents/schema/docs/ProppantPermeability.rst b/src/coreComponents/schema/docs/ProppantPermeability.rst deleted file mode 100644 index a8877faca2f..00000000000 --- a/src/coreComponents/schema/docs/ProppantPermeability.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -======================== ========= ======== =========================================== -Name Type Default Description -======================== ========= ======== =========================================== -maxProppantConcentration real64 required Maximum proppant concentration. -name groupName required A name is required for any non-unique nodes -proppantDiameter real64 required Proppant diameter. -======================== ========= ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/ProppantPermeability_other.rst b/src/coreComponents/schema/docs/ProppantPermeability_other.rst deleted file mode 100644 index 989c76d45c1..00000000000 --- a/src/coreComponents/schema/docs/ProppantPermeability_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -======================== ============== ================================================================= -Name Type Description -======================== ============== ================================================================= -dPerm_dDispJump real64_array4d Derivative of rock permeability with respect to displacement jump -dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure -permeability real64_array3d Rock permeability -permeabilityMultiplier real64_array3d Rock permeability multiplier -proppantPackPermeability real64 (no description available) -======================== ============== ================================================================= - - diff --git a/src/coreComponents/schema/docs/ProppantPorosity.rst b/src/coreComponents/schema/docs/ProppantPorosity.rst deleted file mode 100644 index e5ce1f5fdb6..00000000000 --- a/src/coreComponents/schema/docs/ProppantPorosity.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -======================== ========= ======== =========================================== -Name Type Default Description -======================== ========= ======== =========================================== -defaultReferencePorosity real64 required Default value of the reference porosity -maxProppantConcentration real64 required Maximum proppant concentration -name groupName required A name is required for any non-unique nodes -======================== ========= ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/ProppantPorosity_other.rst b/src/coreComponents/schema/docs/ProppantPorosity_other.rst deleted file mode 100644 index 17d801d7587..00000000000 --- a/src/coreComponents/schema/docs/ProppantPorosity_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -====================== ============== ======================================================= -Name Type Description -====================== ============== ======================================================= -dPorosity_dPressure real64_array2d Derivative of rock porosity with respect to pressure -dPorosity_dTemperature real64_array2d Derivative of rock porosity with respect to temperature -initialPorosity real64_array2d Initial porosity -porosity real64_array2d Rock porosity -porosity_n real64_array2d Rock porosity at the previous converged time step -referencePorosity real64_array Reference porosity -====================== ============== ======================================================= - - diff --git a/src/coreComponents/schema/docs/ProppantSlurryFluid.rst b/src/coreComponents/schema/docs/ProppantSlurryFluid.rst deleted file mode 100644 index d960825e262..00000000000 --- a/src/coreComponents/schema/docs/ProppantSlurryFluid.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -========================= ============ ======== ================================================ -Name Type Default Description -========================= ============ ======== ================================================ -componentNames string_array {} List of fluid component names -compressibility real64 0 Fluid compressibility -defaultComponentDensity real64_array {0} Default value for the component density. -defaultComponentViscosity real64_array {0} Default value for the component viscosity. -defaultCompressibility real64_array {0} Default value for the component compressibility. -flowBehaviorIndex real64_array {0} Flow behavior index -flowConsistencyIndex real64_array {0} Flow consistency index -maxProppantConcentration real64 0.6 Maximum proppant concentration -name groupName required A name is required for any non-unique nodes -referenceDensity real64 1000 Reference fluid density -referencePressure real64 100000 Reference pressure -referenceProppantDensity real64 1400 Reference proppant density -referenceViscosity real64 0.001 Reference fluid viscosity -========================= ============ ======== ================================================ - - diff --git a/src/coreComponents/schema/docs/ProppantSlurryFluid_other.rst b/src/coreComponents/schema/docs/ProppantSlurryFluid_other.rst deleted file mode 100644 index 5248c9d190d..00000000000 --- a/src/coreComponents/schema/docs/ProppantSlurryFluid_other.rst +++ /dev/null @@ -1,35 +0,0 @@ - - -============================ ============== ======================================================================= -Name Type Description -============================ ============== ======================================================================= -FluidDensity real64_array2d Fluid density -FluidViscosity real64_array2d Fluid viscosity -componentDensity real64_array3d Component density -dCompDens_dCompConc real64_array4d Derivative of component density with respect to component concentration -dCompDens_dPres real64_array3d Derivative of component density with respect to pressure -dDens_dCompConc real64_array3d Derivative of density with respect to component concentration -dDens_dProppantConc real64_array2d Derivative of density with respect to proppant concentration -dDensity_dPressure real64_array2d Derivative of density with respect to pressure -dDensity_dTemperature real64_array2d Derivative of density with respect to temperature -dEnthalpy_dPressure real64_array2d Derivative of enthalpy with respect to pressure -dEnthalpy_dTemperature real64_array2d Derivative of enthalpy with respect to temperature -dFluidDens_dCompConc real64_array3d Derivative of fluid density with respect to component concentration -dFluidDens_dPres real64_array2d Derivative of fluid density with respect to pressure -dFluidVisc_dCompConc real64_array3d Derivative of fluid viscosity with respect to component concentration -dFluidVisc_dPres real64_array2d Derivative of fluid viscosity with respect to pressure -dInternalEnergy_dPressure real64_array2d Derivative of internal energy with respect to pressure -dInternalEnergy_dTemperature real64_array2d Derivative of internal energy with respect to temperature -dVisc_dCompConc real64_array3d Derivative of viscosity with respect to component concentration -dVisc_dProppantConc real64_array2d Derivative of viscosity with respect to proppant concentration -dViscosity_dPressure real64_array2d Derivative of viscosity with respect to pressure -dViscosity_dTemperature real64_array2d Derivative of viscosity with respect to temperature -density real64_array2d Density -density_n real64_array2d Density at the previous converged time step -enthalpy real64_array2d Enthalpy -internalEnergy real64_array2d Internal energy -internalEnergy_n real64_array2d Fluid internal energy at the previous converged step -viscosity real64_array2d Viscosity -============================ ============== ======================================================================= - - diff --git a/src/coreComponents/schema/docs/ProppantSolidProppantPermeability.rst b/src/coreComponents/schema/docs/ProppantSolidProppantPermeability.rst deleted file mode 100644 index 7d6d29602c1..00000000000 --- a/src/coreComponents/schema/docs/ProppantSolidProppantPermeability.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -name groupName required A name is required for any non-unique nodes -permeabilityModelName groupNameRef required Name of the permeability model. -porosityModelName groupNameRef required Name of the porosity model. -solidInternalEnergyModelName groupNameRef Name of the solid internal energy model. -solidModelName groupNameRef required Name of the solid model. -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/ProppantSolidProppantPermeability_other.rst b/src/coreComponents/schema/docs/ProppantSolidProppantPermeability_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/ProppantSolidProppantPermeability_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/ProppantTransport.rst b/src/coreComponents/schema/docs/ProppantTransport.rst deleted file mode 100644 index 6d381b82584..00000000000 --- a/src/coreComponents/schema/docs/ProppantTransport.rst +++ /dev/null @@ -1,29 +0,0 @@ - - -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -bridgingFactor real64 0 Bridging factor used for bridging/screen-out calculation -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -criticalShieldsNumber real64 0 Critical Shields number -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -frictionCoefficient real64 0.03 Friction coefficient -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxProppantConcentration real64 0.6 Maximum proppant concentration -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -name groupName required A name is required for any non-unique nodes -proppantDensity real64 2500 Proppant density -proppantDiameter real64 0.0004 Proppant diameter -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -updateProppantPacking integer 0 Flag that enables/disables proppant-packing update -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/ProppantTransport_other.rst b/src/coreComponents/schema/docs/ProppantTransport_other.rst deleted file mode 100644 index f296d4de732..00000000000 --- a/src/coreComponents/schema/docs/ProppantTransport_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================================ -Name Type Description -========================= ====================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================================ - - diff --git a/src/coreComponents/schema/docs/Python.rst b/src/coreComponents/schema/docs/Python.rst deleted file mode 100644 index c7dc6b70183..00000000000 --- a/src/coreComponents/schema/docs/Python.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -=============== ========= ======== =========================================== -Name Type Default Description -=============== ========= ======== =========================================== -childDirectory string Child directory path -name groupName required A name is required for any non-unique nodes -parallelThreads integer 1 Number of plot files. -=============== ========= ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/Python_other.rst b/src/coreComponents/schema/docs/Python_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/Python_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/ReactiveBrine.rst b/src/coreComponents/schema/docs/ReactiveBrine.rst deleted file mode 100644 index d710c396a38..00000000000 --- a/src/coreComponents/schema/docs/ReactiveBrine.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -==================== ================== ======== ============================================================================================================ -Name Type Default Description -==================== ================== ======== ============================================================================================================ -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentMolarWeight real64_array {0} Component molar weights -componentNames string_array {} List of component names -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array {} List of fluid phases -phasePVTParaFiles path_array required Names of the files defining the parameters of the viscosity and density models -==================== ================== ======== ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/ReactiveBrineThermal.rst b/src/coreComponents/schema/docs/ReactiveBrineThermal.rst deleted file mode 100644 index d710c396a38..00000000000 --- a/src/coreComponents/schema/docs/ReactiveBrineThermal.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -==================== ================== ======== ============================================================================================================ -Name Type Default Description -==================== ================== ======== ============================================================================================================ -checkPVTTablesRanges integer 1 Enable (1) or disable (0) an error when the input pressure or temperature of the PVT tables is out of range. -componentMolarWeight real64_array {0} Component molar weights -componentNames string_array {} List of component names -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array {} List of fluid phases -phasePVTParaFiles path_array required Names of the files defining the parameters of the viscosity and density models -==================== ================== ======== ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst b/src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst deleted file mode 100644 index 05bd31c0020..00000000000 --- a/src/coreComponents/schema/docs/ReactiveBrineThermal_other.rst +++ /dev/null @@ -1,34 +0,0 @@ - - -================================ ========================================================================================= ============================================================================================================ -Name Type Description -================================ ========================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -kineticReactionRates real64_array2d kineticReactionRates -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -primarySpeciesConcentration real64_array2d primarySpeciesConcentration -primarySpeciesTotalConcentration real64_array2d primarySpeciesTotalConcentration -secondarySpeciesConcentration real64_array2d secondarySpeciesConcentration -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -================================ ========================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/ReactiveBrine_other.rst b/src/coreComponents/schema/docs/ReactiveBrine_other.rst deleted file mode 100644 index 05bd31c0020..00000000000 --- a/src/coreComponents/schema/docs/ReactiveBrine_other.rst +++ /dev/null @@ -1,34 +0,0 @@ - - -================================ ========================================================================================= ============================================================================================================ -Name Type Description -================================ ========================================================================================= ============================================================================================================ -dPhaseCompFraction LvArray_Array, int, LvArray_ChaiBuffer> Derivative of phase component fraction with respect to pressure, temperature, and global component fractions -dPhaseDensity real64_array4d Derivative of phase density with respect to pressure, temperature, and global component fractions -dPhaseEnthalpy real64_array4d Derivative of phase enthalpy with respect to pressure, temperature, and global component fractions -dPhaseFraction real64_array4d Derivative of phase fraction with respect to pressure, temperature, and global component fractions -dPhaseInternalEnergy real64_array4d Derivative of phase internal energy with respect to pressure, temperature, and global component fractions -dPhaseMassDensity real64_array4d Derivative of phase mass density with respect to pressure, temperature, and global component fractions -dPhaseViscosity real64_array4d Derivative of phase viscosity with respect to pressure, temperature, and global component fractions -dTotalDensity real64_array3d Derivative of total density with respect to pressure, temperature, and global component fractions -kineticReactionRates real64_array2d kineticReactionRates -phaseCompFraction real64_array4d Phase component fraction -phaseCompFraction_n real64_array4d Phase component fraction at the previous converged time step -phaseDensity real64_array3d Phase density -phaseDensity_n real64_array3d Phase density at the previous converged time step -phaseEnthalpy real64_array3d Phase enthalpy -phaseEnthalpy_n real64_array3d Phase enthalpy at the previous converged time step -phaseFraction real64_array3d Phase fraction -phaseInternalEnergy real64_array3d Phase internal energy -phaseInternalEnergy_n real64_array3d Phase internal energy at the previous converged time step -phaseMassDensity real64_array3d Phase mass density -phaseViscosity real64_array3d Phase viscosity -primarySpeciesConcentration real64_array2d primarySpeciesConcentration -primarySpeciesTotalConcentration real64_array2d primarySpeciesTotalConcentration -secondarySpeciesConcentration real64_array2d secondarySpeciesConcentration -totalDensity real64_array2d Total density -totalDensity_n real64_array2d Total density at the previous converged time step -useMass integer (no description available) -================================ ========================================================================================= ============================================================================================================ - - diff --git a/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL.rst b/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL.rst deleted file mode 100644 index c3f5cebfb57..00000000000 --- a/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL.rst +++ /dev/null @@ -1,32 +0,0 @@ - - -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== -OBLOperatorsTableFile path required File containing OBL operator values -allowLocalOBLChopping integer 1 Allow keeping solution within OBL limits -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -componentNames string_array {} List of component names -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -enableEnergyBalance integer required Enable energy balance calculation and temperature degree of freedom -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxCompFractionChange real64 1 Maximum (absolute) change in a component fraction between two Newton iterations -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -name groupName required A name is required for any non-unique nodes -numComponents integer required Number of components -numPhases integer required Number of phases -phaseNames groupNameRef_array {} List of fluid phases -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -transMultExp real64 1 Exponent of dynamic transmissibility multiplier -useDARTSL2Norm integer 1 Use L2 norm calculation similar to one used DARTS -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst b/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst deleted file mode 100644 index f296d4de732..00000000000 --- a/src/coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================================ -Name Type Description -========================= ====================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================================ - - diff --git a/src/coreComponents/schema/docs/ReactiveFluidDriver.rst b/src/coreComponents/schema/docs/ReactiveFluidDriver.rst deleted file mode 100644 index b2c089baae6..00000000000 --- a/src/coreComponents/schema/docs/ReactiveFluidDriver.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -================== ============ ======== =================================================================== -Name Type Default Description -================== ============ ======== =================================================================== -baseline path none Baseline file -feedComposition real64_array required Feed composition array: total concentration of the primary species -fluid groupNameRef required Fluid to test -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -output string none Output file -pressureControl groupNameRef required Function controlling pressure time history -steps integer required Number of load steps to take -temperatureControl groupNameRef required Function controlling temperature time history -================== ============ ======== =================================================================== - - diff --git a/src/coreComponents/schema/docs/ReactiveFluidDriver_other.rst b/src/coreComponents/schema/docs/ReactiveFluidDriver_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/ReactiveFluidDriver_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Rectangle.rst b/src/coreComponents/schema/docs/Rectangle.rst deleted file mode 100644 index 2413e9f671b..00000000000 --- a/src/coreComponents/schema/docs/Rectangle.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -============ ============ ======== ================================================================================================================= -Name Type Default Description -============ ============ ======== ================================================================================================================= -dimensions real64_array required Length and width of the bounded plane -lengthVector R1Tensor required Tangent vector defining the orthonormal basis along with the normal. -name groupName required A name is required for any non-unique nodes -normal R1Tensor required Normal (n_x,n_y,n_z) to the plane (will be normalized automatically) -origin R1Tensor required Origin point (x,y,z) of the plane (basically, any point on the plane) -tolerance real64 1e-05 Tolerance to determine if a point sits on the plane or not. It is relative to the maximum dimension of the plane. -widthVector R1Tensor required Tangent vector defining the orthonormal basis along with the normal. -============ ============ ======== ================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/Rectangle_other.rst b/src/coreComponents/schema/docs/Rectangle_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/Rectangle_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/RelpermDriver.rst b/src/coreComponents/schema/docs/RelpermDriver.rst deleted file mode 100644 index 090a04d2c45..00000000000 --- a/src/coreComponents/schema/docs/RelpermDriver.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -======== ============ ======== =========================================== -Name Type Default Description -======== ============ ======== =========================================== -baseline path none Baseline file -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -output string none Output file -relperm groupNameRef required Relperm model to test -steps integer required Number of saturation steps to take -======== ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/RelpermDriver_other.rst b/src/coreComponents/schema/docs/RelpermDriver_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/RelpermDriver_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Restart.rst b/src/coreComponents/schema/docs/Restart.rst deleted file mode 100644 index c7dc6b70183..00000000000 --- a/src/coreComponents/schema/docs/Restart.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -=============== ========= ======== =========================================== -Name Type Default Description -=============== ========= ======== =========================================== -childDirectory string Child directory path -name groupName required A name is required for any non-unique nodes -parallelThreads integer 1 Number of plot files. -=============== ========= ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/Restart_other.rst b/src/coreComponents/schema/docs/Restart_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/Restart_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/Run.rst b/src/coreComponents/schema/docs/Run.rst deleted file mode 100644 index feeeefeb973..00000000000 --- a/src/coreComponents/schema/docs/Run.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -============== ============= ======== ======================================================================================================================================================= -Name Type Default Description -============== ============= ======== ======================================================================================================================================================= -args string Any extra command line arguments to pass to GEOSX. -autoPartition string May be 'Off' or 'On', if 'On' partitioning arguments are created automatically. Default is Off. -meshSizes integer_array {0} The target number of elements in the internal mesh (per-process for weak scaling, globally for strong scaling) default doesn't modify the internalMesh. -name string required The name of this benchmark. -nodes integer 0 The number of nodes needed to run the base benchmark, default is 1. -scaleList integer_array {0} The scales at which to run the problem ( scale * nodes * tasksPerNode ). -scaling string Whether to run a scaling, and which type of scaling to run. -tasksPerNode integer required The number of tasks per node to run the benchmark with. -threadsPerTask integer 0 The number of threads per task to run the benchmark with. -timeLimit integer 0 The time limit of the benchmark. -============== ============= ======== ======================================================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/Run_other.rst b/src/coreComponents/schema/docs/Run_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/Run_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/SeismicityRate.rst b/src/coreComponents/schema/docs/SeismicityRate.rst deleted file mode 100644 index a4e6bddb031..00000000000 --- a/src/coreComponents/schema/docs/SeismicityRate.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -backgroundStressingRate real64 required Background stressing rate -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -directEffect real64 required Rate-and-state friction direct effect parameter -faultNormalDirection R1Tensor {0,0,0} Fault normal direction -faultShearDirection R1Tensor {0,0,0} Fault shear direction -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -stressSolverName string Name of solver for computing stress -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SeismicityRate_other.rst b/src/coreComponents/schema/docs/SeismicityRate_other.rst deleted file mode 100644 index cccf4603c70..00000000000 --- a/src/coreComponents/schema/docs/SeismicityRate_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/Silo.rst b/src/coreComponents/schema/docs/Silo.rst deleted file mode 100644 index 8257591bdb5..00000000000 --- a/src/coreComponents/schema/docs/Silo.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -=========================== ================== ======== ======================================================================================================================================================================================== -Name Type Default Description -=========================== ================== ======== ======================================================================================================================================================================================== -childDirectory string Child directory path -fieldNames groupNameRef_array {} Names of the fields to output. If this attribute is specified, GEOSX outputs all (and only) the fields specified by the user, regardless of their plotLevel -name groupName required A name is required for any non-unique nodes -onlyPlotSpecifiedFieldNames integer 0 If this flag is equal to 1, then we only plot the fields listed in `fieldNames`. Otherwise, we plot all the fields with the required `plotLevel`, plus the fields listed in `fieldNames` -parallelThreads integer 1 Number of plot files. -plotFileRoot string plot (no description available) -plotLevel integer 1 (no description available) -writeCellElementMesh integer 1 (no description available) -writeEdgeMesh integer 0 (no description available) -writeFEMFaces integer 0 (no description available) -writeFaceElementMesh integer 1 (no description available) -=========================== ================== ======== ======================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/Silo_other.rst b/src/coreComponents/schema/docs/Silo_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/Silo_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/SinglePhaseFVM.rst b/src/coreComponents/schema/docs/SinglePhaseFVM.rst deleted file mode 100644 index f95554a5d12..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseFVM.rst +++ /dev/null @@ -1,27 +0,0 @@ - - -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 | Flag indicating whether the problem is thermal or not. - | SourceFluxes application if isThermal is enabled : - | - negative value (injection): the mass balance equation is modified to considered the additional source term, - | - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. - | For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -temperature real64 0 Temperature -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseFVM_other.rst b/src/coreComponents/schema/docs/SinglePhaseFVM_other.rst deleted file mode 100644 index f296d4de732..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseFVM_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================================ -Name Type Description -========================= ====================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================================ - - diff --git a/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst b/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst deleted file mode 100644 index f95554a5d12..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseHybridFVM.rst +++ /dev/null @@ -1,27 +0,0 @@ - - -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 | Flag indicating whether the problem is thermal or not. - | SourceFluxes application if isThermal is enabled : - | - negative value (injection): the mass balance equation is modified to considered the additional source term, - | - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. - | For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -temperature real64 0 Temperature -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst b/src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst deleted file mode 100644 index f0cca96f3a1..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================ ================================================================ -Name Type Registered On Description -========================= ====================================================================================================================================================== ================================ ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -facePressure_n real64_array :ref:`DATASTRUCTURE_faceManager` Face pressure at the previous converged time step -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================ ================================================================ - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanics.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanics.rst deleted file mode 100644 index 002c98b6c89..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanics.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -stabilizationMultiplier real64 1 Constant multiplier of stabilization strength -stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. -stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: - | None- Add no stabilization to mass equation - | Global- Add jump stabilization to all faces - | Local- Add jump stabilization on interior of macro elements -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures.rst deleted file mode 100644 index 002c98b6c89..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -stabilizationMultiplier real64 1 Constant multiplier of stabilization strength -stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. -stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: - | None- Add no stabilization to mass equation - | Global- Add jump stabilization to all faces - | Local- Add jump stabilization on interior of macro elements -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization.rst deleted file mode 100644 index 18e3a0dd9e7..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir.rst deleted file mode 100644 index af1c8e817b3..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -========================================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -poromechanicsConformingFracturesSolverName groupNameRef required Name of the poromechanicsConformingFractures solver used by the coupled solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -wellSolverName groupNameRef required Name of the well solver used by the coupled solver -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir_other.rst deleted file mode 100644 index cccf4603c70..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst deleted file mode 100644 index dc33be0a036..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures.rst deleted file mode 100644 index 002c98b6c89..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -stabilizationMultiplier real64 1 Constant multiplier of stabilization strength -stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. -stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: - | None- Add no stabilization to mass equation - | Global- Add jump stabilization to all faces - | Local- Add jump stabilization on interior of macro elements -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization.rst deleted file mode 100644 index 18e3a0dd9e7..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst deleted file mode 100644 index dc33be0a036..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst deleted file mode 100644 index 18e3a0dd9e7..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsInitialization_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir.rst deleted file mode 100644 index abe1a84cf22..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -poromechanicsSolverName groupNameRef required Name of the poromechanics solver used by the coupled solver -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -wellSolverName groupNameRef required Name of the well solver used by the coupled solver -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst deleted file mode 100644 index cccf4603c70..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst b/src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst deleted file mode 100644 index dc33be0a036..00000000000 --- a/src/coreComponents/schema/docs/SinglePhasePoromechanics_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst b/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst deleted file mode 100644 index f95554a5d12..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseProppantFVM.rst +++ /dev/null @@ -1,27 +0,0 @@ - - -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== -allowNegativePressure integer 1 Flag indicating if negative pressure is allowed -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 | Flag indicating whether the problem is thermal or not. - | SourceFluxes application if isThermal is enabled : - | - negative value (injection): the mass balance equation is modified to considered the additional source term, - | - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. - | For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced. -logLevel integer 0 Log level -maxAbsolutePressureChange real64 -1 Maximum (absolute) pressure change in a Newton iteration -maxSequentialPressureChange real64 100000 Maximum (absolute) pressure change in a sequential iteration, used for outer loop convergence check -maxSequentialTemperatureChange real64 0.1 Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -temperature real64 0 Temperature -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ================== ======== ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst b/src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst deleted file mode 100644 index f296d4de732..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================================ -Name Type Description -========================= ====================================================================================================================================================== ================================================================ -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================================ - - diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoir.rst b/src/coreComponents/schema/docs/SinglePhaseReservoir.rst deleted file mode 100644 index 9b67dda6230..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseReservoir.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -flowSolverName groupNameRef required Name of the flow solver used by the coupled solver -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -wellSolverName groupNameRef required Name of the well solver used by the coupled solver -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics.rst b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics.rst deleted file mode 100644 index 6ec494e2d08..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -=========================== ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -=========================== ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isThermal integer 0 Flag indicating whether the problem is thermal or not. Set isThermal="1" to enable the thermal coupling -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -reservoirAndWellsSolverName groupNameRef required Name of the reservoirAndWells solver used by the coupled solver -solidSolverName groupNameRef required Name of the solid solver used by the coupled solver -stabilizationMultiplier real64 1 Constant multiplier of stabilization strength -stabilizationRegionNames groupNameRef_array {} Regions where stabilization is applied. -stabilizationType geos_stabilization_StabilizationType None | StabilizationType. Options are: - | None- Add no stabilization to mass equation - | Global- Add jump stabilization to all faces - | Local- Add jump stabilization on interior of macro elements -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -=========================== ==================================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst deleted file mode 100644 index 18e3a0dd9e7..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============================ ============ ======== =========================================== -Name Type Default Description -============================ ============ ======== =========================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -poromechanicsSolverName groupNameRef required Name of the poromechanics solver -solidMechanicsStatisticsName groupNameRef Name of the solid mechanics statistics -============================ ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization_other.rst b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst b/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst deleted file mode 100644 index dc33be0a036..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -performStressInitialization integer Flag to indicate that the solver is going to perform stress initialization -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -=========================== ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst b/src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst deleted file mode 100644 index cccf4603c70..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseReservoir_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseStatistics.rst b/src/coreComponents/schema/docs/SinglePhaseStatistics.rst deleted file mode 100644 index ff3105519bd..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseStatistics.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============== ============ ======== =========================================== -Name Type Default Description -============== ============ ======== =========================================== -flowSolverName groupNameRef required Name of the flow solver -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -writeCSV integer 0 Write statistics into a CSV file -============== ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseStatistics_other.rst b/src/coreComponents/schema/docs/SinglePhaseStatistics_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseStatistics_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/SinglePhaseThermalConductivity.rst b/src/coreComponents/schema/docs/SinglePhaseThermalConductivity.rst deleted file mode 100644 index 1dc1947b73a..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseThermalConductivity.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -===================================== ========= ======== =============================================================================================================== -Name Type Default Description -===================================== ========= ======== =============================================================================================================== -defaultThermalConductivityComponents R1Tensor required xx, yy, and zz diagonal components of the default thermal conductivity tensor [J/(s.m.K)] -name groupName required A name is required for any non-unique nodes -referenceTemperature real64 0 The reference temperature at which the conductivity components are equal to the default values -thermalConductivityGradientComponents R1Tensor {0,0,0} xx, yy, and zz diagonal components of the thermal conductivity gradient tensor w.r.t. temperature [J/(s.m.K^2)] -===================================== ========= ======== =============================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseThermalConductivity_other.rst b/src/coreComponents/schema/docs/SinglePhaseThermalConductivity_other.rst deleted file mode 100644 index cf5ae873411..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseThermalConductivity_other.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -========================= ============== ======================================================= -Name Type Description -========================= ============== ======================================================= -dEffectiveConductivity_dT real64_array3d Derivative of effective conductivity w.r.t. temperature -effectiveConductivity real64_array3d Effective conductivity -========================= ============== ======================================================= - - diff --git a/src/coreComponents/schema/docs/SinglePhaseWell.rst b/src/coreComponents/schema/docs/SinglePhaseWell.rst deleted file mode 100644 index 0e07797aec9..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseWell.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeCSV integer 0 Write rates into a CSV file -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -WellControls node :ref:`XML_WellControls` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SinglePhaseWell_other.rst b/src/coreComponents/schema/docs/SinglePhaseWell_other.rst deleted file mode 100644 index f2c739b92d8..00000000000 --- a/src/coreComponents/schema/docs/SinglePhaseWell_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -WellControls node :ref:`DATASTRUCTURE_WellControls` -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SlipDependentPermeability.rst b/src/coreComponents/schema/docs/SlipDependentPermeability.rst deleted file mode 100644 index 86118d26163..00000000000 --- a/src/coreComponents/schema/docs/SlipDependentPermeability.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -=================== ========= ======== =========================================== -Name Type Default Description -=================== ========= ======== =========================================== -initialPermeability R1Tensor required initial permeability of the fracture. -maxPermMultiplier real64 required Maximum permeability multiplier. -name groupName required A name is required for any non-unique nodes -shearDispThreshold real64 required Threshold of shear displacement. -=================== ========= ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/SlipDependentPermeability_other.rst b/src/coreComponents/schema/docs/SlipDependentPermeability_other.rst deleted file mode 100644 index 43a2d06a562..00000000000 --- a/src/coreComponents/schema/docs/SlipDependentPermeability_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -=============== ============== ================================================================= -Name Type Description -=============== ============== ================================================================= -dPerm_dDispJump real64_array4d Derivative of rock permeability with respect to displacement jump -dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure -permeability real64_array3d Rock permeability -=============== ============== ================================================================= - - diff --git a/src/coreComponents/schema/docs/SolidInternalEnergy.rst b/src/coreComponents/schema/docs/SolidInternalEnergy.rst deleted file mode 100644 index b4432cbfb54..00000000000 --- a/src/coreComponents/schema/docs/SolidInternalEnergy.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -==================================== ========= ======== ================================================================================= -Name Type Default Description -==================================== ========= ======== ================================================================================= -dVolumetricHeatCapacity_dTemperature real64 0 Derivative of the solid volumetric heat capacity w.r.t. temperature [J/(m^3.K^2)] -name groupName required A name is required for any non-unique nodes -referenceInternalEnergy real64 required Internal energy at the reference temperature [J/kg] -referenceTemperature real64 required Reference temperature [K] -referenceVolumetricHeatCapacity real64 required Reference solid volumetric heat capacity [J/(kg.K)] -==================================== ========= ======== ================================================================================= - - diff --git a/src/coreComponents/schema/docs/SolidInternalEnergy_other.rst b/src/coreComponents/schema/docs/SolidInternalEnergy_other.rst deleted file mode 100644 index c6d23064113..00000000000 --- a/src/coreComponents/schema/docs/SolidInternalEnergy_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -============================ ============== ============================================================================== -Name Type Description -============================ ============== ============================================================================== -dInternalEnergy_dTemperature real64_array2d Derivative of the solid internal energy w.r.t. temperature [J/(m^3.K)] -internalEnergy real64_array2d Internal energy of the solid per unit volume [J/m^3] -internalEnergy_n real64_array2d Internal energy of the solid per unit volume at the previous time-step [J/m^3] -============================ ============== ============================================================================== - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst b/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst deleted file mode 100644 index 4ea2de12d3a..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst +++ /dev/null @@ -1,30 +0,0 @@ - - -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contactPenaltyStiffness real64 0 Value of the penetration penalty stiffness. Units of Pressure/length -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -massDamping real64 0 Value of mass based damping coefficient. -maxNumResolves integer 10 Value to indicate how many resolves may be executed after some other event is executed. For example, if a SurfaceGenerator is specified, it will be executed after the mechanics solve. However if a new surface is generated, then the mechanics solve must be executed again due to the change in topology. -name groupName required A name is required for any non-unique nodes -newmarkBeta real64 0.25 Value of :math:`\beta` in the Newmark Method for Implicit Dynamic time integration option. This should be pow(newmarkGamma+0.5,2.0)/4.0 unless you know what you are doing. -newmarkGamma real64 0.5 Value of :math:`\gamma` in the Newmark Method for Implicit Dynamic time integration option -stiffnessDamping real64 0 Value of stiffness based damping coefficient. -strainTheory integer 0 | Indicates whether or not to use `Infinitesimal Strain Theory `_, or `Finite Strain Theory `_. Valid Inputs are: - | 0 - Infinitesimal Strain - | 1 - Finite Strain -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption ExplicitDynamic | Time integration method. Options are: - | * QuasiStatic - | * ImplicitDynamic - | * ExplicitDynamic -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact_other.rst b/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact_other.rst deleted file mode 100644 index 1a9ad823675..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact_other.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -========================= ====================================================================================================================================================== ===================================================================== -Name Type Description -========================= ====================================================================================================================================================== ===================================================================== -contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -surfaceGeneratorName string Name of the surface generator to use -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ===================================================================== - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst b/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst deleted file mode 100644 index f1eeeefdbf1..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst +++ /dev/null @@ -1,31 +0,0 @@ - - -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contactPenaltyStiffness real64 required Value of the penetration penalty stiffness. Units of Pressure/length -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -massDamping real64 0 Value of mass based damping coefficient. -maxNumResolves integer 10 Value to indicate how many resolves may be executed after some other event is executed. For example, if a SurfaceGenerator is specified, it will be executed after the mechanics solve. However if a new surface is generated, then the mechanics solve must be executed again due to the change in topology. -name groupName required A name is required for any non-unique nodes -newmarkBeta real64 0.25 Value of :math:`\beta` in the Newmark Method for Implicit Dynamic time integration option. This should be pow(newmarkGamma+0.5,2.0)/4.0 unless you know what you are doing. -newmarkGamma real64 0.5 Value of :math:`\gamma` in the Newmark Method for Implicit Dynamic time integration option -stiffnessDamping real64 0 Value of stiffness based damping coefficient. -strainTheory integer 0 | Indicates whether or not to use `Infinitesimal Strain Theory `_, or `Finite Strain Theory `_. Valid Inputs are: - | 0 - Infinitesimal Strain - | 1 - Finite Strain -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption ExplicitDynamic | Time integration method. Options are: - | * QuasiStatic - | * ImplicitDynamic - | * ExplicitDynamic -useStaticCondensation integer 0 Defines whether to use static condensation or not. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst b/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst deleted file mode 100644 index 1a9ad823675..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -========================= ====================================================================================================================================================== ===================================================================== -Name Type Description -========================= ====================================================================================================================================================== ===================================================================== -contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -surfaceGeneratorName string Name of the surface generator to use -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ===================================================================== - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst deleted file mode 100644 index e801acd20e0..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst +++ /dev/null @@ -1,32 +0,0 @@ - - -=============================== ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -=============================== ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contactPenaltyStiffness real64 0 Value of the penetration penalty stiffness. Units of Pressure/length -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -massDamping real64 0 Value of mass based damping coefficient. -maxNumResolves integer 10 Value to indicate how many resolves may be executed after some other event is executed. For example, if a SurfaceGenerator is specified, it will be executed after the mechanics solve. However if a new surface is generated, then the mechanics solve must be executed again due to the change in topology. -name groupName required A name is required for any non-unique nodes -newmarkBeta real64 0.25 Value of :math:`\beta` in the Newmark Method for Implicit Dynamic time integration option. This should be pow(newmarkGamma+0.5,2.0)/4.0 unless you know what you are doing. -newmarkGamma real64 0.5 Value of :math:`\gamma` in the Newmark Method for Implicit Dynamic time integration option -stabilizationName groupNameRef required Name of the stabilization to use in the lagrangian contact solver -stabilizationScalingCoefficient real64 1 It be used to increase the scale of the stabilization entries. A value < 1.0 results in larger entries in the stabilization matrix. -stiffnessDamping real64 0 Value of stiffness based damping coefficient. -strainTheory integer 0 | Indicates whether or not to use `Infinitesimal Strain Theory `_, or `Finite Strain Theory `_. Valid Inputs are: - | 0 - Infinitesimal Strain - | 1 - Finite Strain -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption ExplicitDynamic | Time integration method. Options are: - | * QuasiStatic - | * ImplicitDynamic - | * ExplicitDynamic -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -=============================== ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst deleted file mode 100644 index 1a9ad823675..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -========================= ====================================================================================================================================================== ===================================================================== -Name Type Description -========================= ====================================================================================================================================================== ===================================================================== -contactRelationName groupNameRef Name of contact relation to enforce constraints on fracture boundary. -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -surfaceGeneratorName string Name of the surface generator to use -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ===================================================================== - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst deleted file mode 100644 index 1bccbf3c052..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst +++ /dev/null @@ -1,32 +0,0 @@ - - -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contactPenaltyStiffness real64 0 Value of the penetration penalty stiffness. Units of Pressure/length -contactRelationName groupNameRef NOCONTACT Name of contact relation to enforce constraints on fracture boundary. -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -massDamping real64 0 Value of mass based damping coefficient. -maxNumResolves integer 10 Value to indicate how many resolves may be executed after some other event is executed. For example, if a SurfaceGenerator is specified, it will be executed after the mechanics solve. However if a new surface is generated, then the mechanics solve must be executed again due to the change in topology. -name groupName required A name is required for any non-unique nodes -newmarkBeta real64 0.25 Value of :math:`\beta` in the Newmark Method for Implicit Dynamic time integration option. This should be pow(newmarkGamma+0.5,2.0)/4.0 unless you know what you are doing. -newmarkGamma real64 0.5 Value of :math:`\gamma` in the Newmark Method for Implicit Dynamic time integration option -stiffnessDamping real64 0 Value of stiffness based damping coefficient. -strainTheory integer 0 | Indicates whether or not to use `Infinitesimal Strain Theory `_, or `Finite Strain Theory `_. Valid Inputs are: - | 0 - Infinitesimal Strain - | 1 - Finite Strain -surfaceGeneratorName string Name of the surface generator to use -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption ExplicitDynamic | Time integration method. Options are: - | * QuasiStatic - | * ImplicitDynamic - | * ExplicitDynamic -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst b/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst deleted file mode 100644 index e458a0e69b3..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================================ -Name Type Description -========================= ====================================================================================================================================================== ================================================================ -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================================ - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsStateReset.rst b/src/coreComponents/schema/docs/SolidMechanicsStateReset.rst deleted file mode 100644 index c8483e51e88..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsStateReset.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -=================== ============ ======== ============================================ -Name Type Default Description -=================== ============ ======== ============================================ -disableInelasticity integer 0 Flag to enable/disable inelastic behavior -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -resetDisplacements integer 1 Flag to reset displacements (and velocities) -solidSolverName groupNameRef required Name of the solid mechanics solver -=================== ============ ======== ============================================ - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsStateReset_other.rst b/src/coreComponents/schema/docs/SolidMechanicsStateReset_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsStateReset_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsStatistics.rst b/src/coreComponents/schema/docs/SolidMechanicsStatistics.rst deleted file mode 100644 index 2395830a112..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsStatistics.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -=============== ============ ======== =========================================== -Name Type Default Description -=============== ============ ======== =========================================== -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -solidSolverName groupNameRef required Name of the solid solver -writeCSV integer 0 Write statistics into a CSV file -=============== ============ ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/SolidMechanicsStatistics_other.rst b/src/coreComponents/schema/docs/SolidMechanicsStatistics_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanicsStatistics_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst b/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst deleted file mode 100644 index 1bccbf3c052..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst +++ /dev/null @@ -1,32 +0,0 @@ - - -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contactPenaltyStiffness real64 0 Value of the penetration penalty stiffness. Units of Pressure/length -contactRelationName groupNameRef NOCONTACT Name of contact relation to enforce constraints on fracture boundary. -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -massDamping real64 0 Value of mass based damping coefficient. -maxNumResolves integer 10 Value to indicate how many resolves may be executed after some other event is executed. For example, if a SurfaceGenerator is specified, it will be executed after the mechanics solve. However if a new surface is generated, then the mechanics solve must be executed again due to the change in topology. -name groupName required A name is required for any non-unique nodes -newmarkBeta real64 0.25 Value of :math:`\beta` in the Newmark Method for Implicit Dynamic time integration option. This should be pow(newmarkGamma+0.5,2.0)/4.0 unless you know what you are doing. -newmarkGamma real64 0.5 Value of :math:`\gamma` in the Newmark Method for Implicit Dynamic time integration option -stiffnessDamping real64 0 Value of stiffness based damping coefficient. -strainTheory integer 0 | Indicates whether or not to use `Infinitesimal Strain Theory `_, or `Finite Strain Theory `_. Valid Inputs are: - | 0 - Infinitesimal Strain - | 1 - Finite Strain -surfaceGeneratorName string Name of the surface generator to use -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeIntegrationOption geos_SolidMechanicsLagrangianFEM_TimeIntegrationOption ExplicitDynamic | Time integration method. Options are: - | * QuasiStatic - | * ImplicitDynamic - | * ExplicitDynamic -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ====================================================== =============== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst b/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst deleted file mode 100644 index e458a0e69b3..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================================ -Name Type Description -========================= ====================================================================================================================================================== ================================================================ -maxForce real64 The maximum force contribution in the problem domain. -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================================ - - diff --git a/src/coreComponents/schema/docs/SolidMechanics_MPM.rst b/src/coreComponents/schema/docs/SolidMechanics_MPM.rst deleted file mode 100644 index 35d3b93b477..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanics_MPM.rst +++ /dev/null @@ -1,42 +0,0 @@ - - -============================== ============================================ =============== ======================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -============================== ============================================ =============== ======================================================================================================================================================================================================================================================================================================================== -boundaryConditionTypes integer_array {0} | Boundary conditions on x-, x+, y-, y+, z- and z+ faces. Options are: - | * Outflow - | * Symmetry -boxAverageHistory integer 0 Flag for whether to output box average history -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -contactGapCorrection integer 0 Flag for mitigating contact gaps -cpdiDomainScaling integer 0 Option for CPDI domain scaling -damageFieldPartitioning integer 0 Flag for using the gradient of the particle damage field to partition material into separate velocity fields -discretization groupNameRef required Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -fTableInterpType integer 0 The type of F table interpolation. Options are 0 (linear), 1 (cosine), 2 (quintic polynomial). -fTablePath path Path to f-table -frictionCoefficient real64 0 Coefficient of friction, currently assumed to be the same everywhere -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -needsNeighborList integer 0 Flag for whether to construct neighbor list -neighborRadius real64 -1 Neighbor radius for SPH-type calculations -planeStrain integer 0 Flag for performing plane strain calculations -prescribedBcTable integer 0 Flag for whether to have time-dependent boundary condition types -prescribedBoundaryFTable integer 0 Flag for whether to have time-dependent boundary conditions described by a global background grid F -reactionHistory integer 0 Flag for whether to output face reaction history -separabilityMinDamage real64 0.5 Damage threshold for field separability -solverProfiling integer 0 Flag for timing subroutines in the solver -surfaceDetection integer 0 Flag for automatic surface detection on the 1st cycle -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -timeIntegrationOption geos_SolidMechanicsMPM_TimeIntegrationOption ExplicitDynamic | Time integration method. Options are: - | * QuasiStatic - | * ImplicitDynamic - | * ExplicitDynamic -treatFullyDamagedAsSingleField integer 1 Whether to consolidate fully damaged fields into a single field. Nice for modeling damaged mush. -useDamageAsSurfaceFlag integer 0 Indicates whether particle damage at the beginning of the simulation should be interpreted as a surface flag -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -============================== ============================================ =============== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst b/src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst deleted file mode 100644 index e0b8502fb7f..00000000000 --- a/src/coreComponents/schema/docs/SolidMechanics_MPM_other.rst +++ /dev/null @@ -1,34 +0,0 @@ - - -========================= ====================================================================================================================================================== ================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ================================================================================================== -bcTable real64_array2d Array that stores time-dependent bc types on x-, x+, y-, y+, z- and z+ faces. -binSizeMultiplier integer Multiplier for setting bin size, used to speed up particle neighbor sorting -domainExtent real64_array domain extent -domainF real64_array domain deformation gradient -domainL real64_array domain L -elementSize real64_array Minimum element size in x, y and z -fTable real64_array2d Array that stores time-dependent grid-aligned stretches interpreted as a global background grid F. -globalMaximum real64_array global maximum -globalMinimum real64_array global minimum -localMaximum real64_array local maximum -localMaximumNoGhost real64_array local maximum without ghost cells -localMinimum real64_array local minimum -localMinimumNoGhost real64_array local minimum without ghost cells -m_ijkMap integer_array3d Map from indices in each spatial dimension to local node ID -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -numContactFlags integer Number of contact flags that can appear due to damage -numContactGroups integer Number of prescribed contact groups -numDims integer The number of active spatial dimensions, 2 for plane strain, 3 otherwise -numElements integer_array number of elements along partition directions -numVelocityFields integer Number of velocity fields -partitionExtent real64_array parititon extent -smallMass real64 The small mass threshold for ignoring extremely low-mass nodes. -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SoloEvent.rst b/src/coreComponents/schema/docs/SoloEvent.rst deleted file mode 100644 index de9a7ad86ee..00000000000 --- a/src/coreComponents/schema/docs/SoloEvent.rst +++ /dev/null @@ -1,23 +0,0 @@ - - -==================== ============ ======== ================================================================================================================================================================= -Name Type Default Description -==================== ============ ======== ================================================================================================================================================================= -beginTime real64 0 Start time of this event. -endTime real64 1e+100 End time of this event. -finalDtStretch real64 0.001 Allow the final dt request for this event to grow by this percentage to match the endTime exactly. -forceDt real64 -1 While active, this event will request this timestep value (ignoring any children/targets requests). -logLevel integer 0 Log level -maxEventDt real64 -1 While active, this event will request a timestep <= this value (depending upon any child/target requests). -name groupName required A name is required for any non-unique nodes -target groupNameRef Name of the object to be executed when the event criteria are met. -targetCycle integer -1 Targeted cycle to execute the event. -targetExactStartStop integer 1 If this option is set, the event will reduce its timestep requests to match any specified beginTime/endTimes exactly. -targetExactTimestep integer 1 If this option is set, the event will reduce its timestep requests to match the specified execution time exactly: dt_request = min(dt_request, t_target - time)). -targetTime real64 -1 Targeted time to execute the event. -HaltEvent node :ref:`XML_HaltEvent` -PeriodicEvent node :ref:`XML_PeriodicEvent` -SoloEvent node :ref:`XML_SoloEvent` -==================== ============ ======== ================================================================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/SoloEvent_other.rst b/src/coreComponents/schema/docs/SoloEvent_other.rst deleted file mode 100644 index f63756dd49b..00000000000 --- a/src/coreComponents/schema/docs/SoloEvent_other.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -================= ======= =============================================== -Name Type Description -================= ======= =============================================== -currentSubEvent integer Index of the current subevent -eventForecast integer Indicates when the event is expected to execute -isTargetExecuting integer Index of the current subevent -lastCycle integer Last event occurrence (cycle) -lastTime real64 Last event occurrence (time) -HaltEvent node :ref:`DATASTRUCTURE_HaltEvent` -PeriodicEvent node :ref:`DATASTRUCTURE_PeriodicEvent` -SoloEvent node :ref:`DATASTRUCTURE_SoloEvent` -================= ======= =============================================== - - diff --git a/src/coreComponents/schema/docs/SolverStatistics_other.rst b/src/coreComponents/schema/docs/SolverStatistics_other.rst deleted file mode 100644 index 51ffa886326..00000000000 --- a/src/coreComponents/schema/docs/SolverStatistics_other.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -================================ ======= ===================================================== -Name Type Description -================================ ======= ===================================================== -numDiscardedLinearIterations integer Cumulative number of discarded linear iterations -numDiscardedNonlinearIterations integer Cumulative number of discarded nonlinear iterations -numDiscardedOuterLoopIterations integer Cumulative number of discarded outer loop iterations -numSuccessfulLinearIterations integer Cumulative number of successful linear iterations -numSuccessfulNonlinearIterations integer Cumulative number of successful nonlinear iterations -numSuccessfulOuterLoopIterations integer Cumulative number of successful outer loop iterations -numTimeStepCuts integer Number of time step cuts -numTimeSteps integer Number of time steps -================================ ======= ===================================================== - - diff --git a/src/coreComponents/schema/docs/Solvers.rst b/src/coreComponents/schema/docs/Solvers.rst deleted file mode 100644 index a8779059e55..00000000000 --- a/src/coreComponents/schema/docs/Solvers.rst +++ /dev/null @@ -1,49 +0,0 @@ - - -==================================================== ======== =========== =============================================================== -Name Type Default Description -==================================================== ======== =========== =============================================================== -gravityVector R1Tensor {0,0,-9.81} Gravity vector used in the physics solvers -AcousticElasticSEM node :ref:`XML_AcousticElasticSEM` -AcousticFirstOrderSEM node :ref:`XML_AcousticFirstOrderSEM` -AcousticSEM node :ref:`XML_AcousticSEM` -AcousticVTISEM node :ref:`XML_AcousticVTISEM` -CompositionalMultiphaseFVM node :ref:`XML_CompositionalMultiphaseFVM` -CompositionalMultiphaseHybridFVM node :ref:`XML_CompositionalMultiphaseHybridFVM` -CompositionalMultiphaseReservoir node :ref:`XML_CompositionalMultiphaseReservoir` -CompositionalMultiphaseReservoirPoromechanics node :ref:`XML_CompositionalMultiphaseReservoirPoromechanics` -CompositionalMultiphaseWell node :ref:`XML_CompositionalMultiphaseWell` -ElasticFirstOrderSEM node :ref:`XML_ElasticFirstOrderSEM` -ElasticSEM node :ref:`XML_ElasticSEM` -EmbeddedSurfaceGenerator node :ref:`XML_EmbeddedSurfaceGenerator` -FlowProppantTransport node :ref:`XML_FlowProppantTransport` -Hydrofracture node :ref:`XML_Hydrofracture` -LaplaceFEM node :ref:`XML_LaplaceFEM` -MultiphasePoromechanics node :ref:`XML_MultiphasePoromechanics` -MultiphasePoromechanicsReservoir node :ref:`XML_MultiphasePoromechanicsReservoir` -PhaseFieldDamageFEM node :ref:`XML_PhaseFieldDamageFEM` -PhaseFieldFracture node :ref:`XML_PhaseFieldFracture` -ProppantTransport node :ref:`XML_ProppantTransport` -ReactiveCompositionalMultiphaseOBL node :ref:`XML_ReactiveCompositionalMultiphaseOBL` -SeismicityRate node :ref:`XML_SeismicityRate` -SinglePhaseFVM node :ref:`XML_SinglePhaseFVM` -SinglePhaseHybridFVM node :ref:`XML_SinglePhaseHybridFVM` -SinglePhasePoromechanics node :ref:`XML_SinglePhasePoromechanics` -SinglePhasePoromechanicsConformingFractures node :ref:`XML_SinglePhasePoromechanicsConformingFractures` -SinglePhasePoromechanicsConformingFracturesReservoir node :ref:`XML_SinglePhasePoromechanicsConformingFracturesReservoir` -SinglePhasePoromechanicsEmbeddedFractures node :ref:`XML_SinglePhasePoromechanicsEmbeddedFractures` -SinglePhasePoromechanicsReservoir node :ref:`XML_SinglePhasePoromechanicsReservoir` -SinglePhaseProppantFVM node :ref:`XML_SinglePhaseProppantFVM` -SinglePhaseReservoir node :ref:`XML_SinglePhaseReservoir` -SinglePhaseReservoirPoromechanics node :ref:`XML_SinglePhaseReservoirPoromechanics` -SinglePhaseWell node :ref:`XML_SinglePhaseWell` -SolidMechanicsAugmentedLagrangianContact node :ref:`XML_SolidMechanicsAugmentedLagrangianContact` -SolidMechanicsEmbeddedFractures node :ref:`XML_SolidMechanicsEmbeddedFractures` -SolidMechanicsLagrangeContact node :ref:`XML_SolidMechanicsLagrangeContact` -SolidMechanicsLagrangianSSLE node :ref:`XML_SolidMechanicsLagrangianSSLE` -SolidMechanics_LagrangianFEM node :ref:`XML_SolidMechanics_LagrangianFEM` -SolidMechanics_MPM node :ref:`XML_SolidMechanics_MPM` -SurfaceGenerator node :ref:`XML_SurfaceGenerator` -==================================================== ======== =========== =============================================================== - - diff --git a/src/coreComponents/schema/docs/Solvers_other.rst b/src/coreComponents/schema/docs/Solvers_other.rst deleted file mode 100644 index 6a42cd06a7c..00000000000 --- a/src/coreComponents/schema/docs/Solvers_other.rst +++ /dev/null @@ -1,48 +0,0 @@ - - -==================================================== ==== ========================================================================= -Name Type Description -==================================================== ==== ========================================================================= -AcousticElasticSEM node :ref:`DATASTRUCTURE_AcousticElasticSEM` -AcousticFirstOrderSEM node :ref:`DATASTRUCTURE_AcousticFirstOrderSEM` -AcousticSEM node :ref:`DATASTRUCTURE_AcousticSEM` -AcousticVTISEM node :ref:`DATASTRUCTURE_AcousticVTISEM` -CompositionalMultiphaseFVM node :ref:`DATASTRUCTURE_CompositionalMultiphaseFVM` -CompositionalMultiphaseHybridFVM node :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM` -CompositionalMultiphaseReservoir node :ref:`DATASTRUCTURE_CompositionalMultiphaseReservoir` -CompositionalMultiphaseReservoirPoromechanics node :ref:`DATASTRUCTURE_CompositionalMultiphaseReservoirPoromechanics` -CompositionalMultiphaseWell node :ref:`DATASTRUCTURE_CompositionalMultiphaseWell` -ElasticFirstOrderSEM node :ref:`DATASTRUCTURE_ElasticFirstOrderSEM` -ElasticSEM node :ref:`DATASTRUCTURE_ElasticSEM` -EmbeddedSurfaceGenerator node :ref:`DATASTRUCTURE_EmbeddedSurfaceGenerator` -FlowProppantTransport node :ref:`DATASTRUCTURE_FlowProppantTransport` -Hydrofracture node :ref:`DATASTRUCTURE_Hydrofracture` -LaplaceFEM node :ref:`DATASTRUCTURE_LaplaceFEM` -MultiphasePoromechanics node :ref:`DATASTRUCTURE_MultiphasePoromechanics` -MultiphasePoromechanicsReservoir node :ref:`DATASTRUCTURE_MultiphasePoromechanicsReservoir` -PhaseFieldDamageFEM node :ref:`DATASTRUCTURE_PhaseFieldDamageFEM` -PhaseFieldFracture node :ref:`DATASTRUCTURE_PhaseFieldFracture` -ProppantTransport node :ref:`DATASTRUCTURE_ProppantTransport` -ReactiveCompositionalMultiphaseOBL node :ref:`DATASTRUCTURE_ReactiveCompositionalMultiphaseOBL` -SeismicityRate node :ref:`DATASTRUCTURE_SeismicityRate` -SinglePhaseFVM node :ref:`DATASTRUCTURE_SinglePhaseFVM` -SinglePhaseHybridFVM node :ref:`DATASTRUCTURE_SinglePhaseHybridFVM` -SinglePhasePoromechanics node :ref:`DATASTRUCTURE_SinglePhasePoromechanics` -SinglePhasePoromechanicsConformingFractures node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsConformingFractures` -SinglePhasePoromechanicsConformingFracturesReservoir node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsConformingFracturesReservoir` -SinglePhasePoromechanicsEmbeddedFractures node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsEmbeddedFractures` -SinglePhasePoromechanicsReservoir node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsReservoir` -SinglePhaseProppantFVM node :ref:`DATASTRUCTURE_SinglePhaseProppantFVM` -SinglePhaseReservoir node :ref:`DATASTRUCTURE_SinglePhaseReservoir` -SinglePhaseReservoirPoromechanics node :ref:`DATASTRUCTURE_SinglePhaseReservoirPoromechanics` -SinglePhaseWell node :ref:`DATASTRUCTURE_SinglePhaseWell` -SolidMechanicsAugmentedLagrangianContact node :ref:`DATASTRUCTURE_SolidMechanicsAugmentedLagrangianContact` -SolidMechanicsEmbeddedFractures node :ref:`DATASTRUCTURE_SolidMechanicsEmbeddedFractures` -SolidMechanicsLagrangeContact node :ref:`DATASTRUCTURE_SolidMechanicsLagrangeContact` -SolidMechanicsLagrangianSSLE node :ref:`DATASTRUCTURE_SolidMechanicsLagrangianSSLE` -SolidMechanics_LagrangianFEM node :ref:`DATASTRUCTURE_SolidMechanics_LagrangianFEM` -SolidMechanics_MPM node :ref:`DATASTRUCTURE_SolidMechanics_MPM` -SurfaceGenerator node :ref:`DATASTRUCTURE_SurfaceGenerator` -==================================================== ==== ========================================================================= - - diff --git a/src/coreComponents/schema/docs/SourceFlux.rst b/src/coreComponents/schema/docs/SourceFlux.rst deleted file mode 100644 index 660880a3b49..00000000000 --- a/src/coreComponents/schema/docs/SourceFlux.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -====================== ================== ======== ======================================================================================================================================================================================================================================================================================== -Name Type Default Description -====================== ================== ======== ======================================================================================================================================================================================================================================================================================== -bcApplicationTableName groupNameRef Name of table that specifies the on/off application of the boundary condition. -beginTime real64 -1e+99 Time at which the boundary condition will start being applied. -component integer -1 Component of field (if tensor) to apply boundary condition to. -direction R1Tensor {0,0,0} Direction to apply boundary condition to. -endTime real64 1e+99 Time at which the boundary condition will stop being applied. -functionName groupNameRef Name of a function that specifies the variation of the production rate variations of this SourceFlux.Multiplied by scale. If no function is provided, a constant value of 1 is used.The producted fluid rate unit is in kg by default, or in mole if the flow solver has a useMass of 0. -initialCondition integer 0 Boundary condition is applied as an initial condition. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -objectPath groupNameRef Path to the target field -scale real64 0 Multiplier of the functionName value. If no functionName is provided, this value is used directly. -setNames groupNameRef_array required Name of sets that boundary condition is applied to. -====================== ================== ======== ======================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SourceFluxStatistics.rst b/src/coreComponents/schema/docs/SourceFluxStatistics.rst deleted file mode 100644 index a5ef4f42a89..00000000000 --- a/src/coreComponents/schema/docs/SourceFluxStatistics.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -============== ================== ======== ===================================================================================================================================================================================== -Name Type Default Description -============== ================== ======== ===================================================================================================================================================================================== -flowSolverName groupNameRef required Name of the flow solver -fluxNames groupNameRef_array {*} Name(s) array of the SourceFlux(s) for which we want the statistics. Use "*" to target all SourceFlux. -logLevel integer 0 | Log level - | - Log Level 1 outputs the sum of all SourceFlux(s) produced rate & mass, - | - Log Level 2 details values for each SourceFlux, - | - Log Level 3 details values for each region. -name groupName required A name is required for any non-unique nodes -writeCSV integer 0 Write statistics into a CSV file -============== ================== ======== ===================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SourceFluxStatistics_other.rst b/src/coreComponents/schema/docs/SourceFluxStatistics_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/SourceFluxStatistics_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/SourceFlux_other.rst b/src/coreComponents/schema/docs/SourceFlux_other.rst deleted file mode 100644 index c3574d52b05..00000000000 --- a/src/coreComponents/schema/docs/SourceFlux_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -========= ============ ==================================================== -Name Type Description -========= ============ ==================================================== -fieldName groupNameRef Name of field that boundary condition is applied to. -========= ============ ==================================================== - - diff --git a/src/coreComponents/schema/docs/SurfaceElementRegion.rst b/src/coreComponents/schema/docs/SurfaceElementRegion.rst deleted file mode 100644 index 8e8ab2e6ec6..00000000000 --- a/src/coreComponents/schema/docs/SurfaceElementRegion.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -=============== ============================================== ================= ================================================================================= -Name Type Default Description -=============== ============================================== ================= ================================================================================= -defaultAperture real64 required The default aperture of newly formed surface elements. -faceBlock groupNameRef FractureSubRegion The name of the face block in the mesh, or the embedded surface. -materialList groupNameRef_array required List of materials present in this region -meshBody groupNameRef Mesh body that contains this region -name groupName required A name is required for any non-unique nodes -subRegionType geos_SurfaceElementRegion_SurfaceSubRegionType faceElement Type of surface element subregion. Valid options: {faceElement, embeddedElement}. -=============== ============================================== ================= ================================================================================= - - diff --git a/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst b/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst deleted file mode 100644 index 747768b410c..00000000000 --- a/src/coreComponents/schema/docs/SurfaceElementRegion_other.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -======================= ================================================================= ========================================================= -Name Type Description -======================= ================================================================= ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ================================================================= ========================================================= - - diff --git a/src/coreComponents/schema/docs/SurfaceGenerator.rst b/src/coreComponents/schema/docs/SurfaceGenerator.rst deleted file mode 100644 index 4160911ec7b..00000000000 --- a/src/coreComponents/schema/docs/SurfaceGenerator.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== -cflFactor real64 0.5 Factor to apply to the `CFL condition `_ when calculating the maximum allowable time step. Values should be in the interval (0,1] -fractureRegion groupNameRef Fracture (no description available) -initialDt real64 1e+99 Initial time-step value required by the solver to the event manager. -isPoroelastic integer 0 Flag that defines whether the material is poroelastic or not. -logLevel integer 0 Log level -mpiCommOrder integer 0 Flag to enable MPI consistent communication ordering -name groupName required A name is required for any non-unique nodes -nodeBasedSIF integer 0 Flag for choosing between node or edge based criteria: 1 for node based criterion -rockToughness real64 required Rock toughness of the solid material -targetRegions groupNameRef_array required Allowable regions that the solver may be applied to. Note that this does not indicate that the solver will be applied to these regions, only that allocation will occur such that the solver may be applied to these regions. The decision about what regions this solver will beapplied to rests in the EventManager. -writeLinearSystem integer 0 Write matrix, rhs, solution to screen ( = 1) or file ( = 2). -LinearSolverParameters node unique :ref:`XML_LinearSolverParameters` -NonlinearSolverParameters node unique :ref:`XML_NonlinearSolverParameters` -========================= ================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SurfaceGenerator_other.rst b/src/coreComponents/schema/docs/SurfaceGenerator_other.rst deleted file mode 100644 index 644325ed6a9..00000000000 --- a/src/coreComponents/schema/docs/SurfaceGenerator_other.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -Name Type Description -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== -discretization groupNameRef Name of discretization object (defined in the :ref:`NumericalMethodsManager`) to use for this solver. For instance, if this is a Finite Element Solver, the name of a :ref:`FiniteElement` should be specified. If this is a Finite Volume Method, the name of a :ref:`FiniteVolume` discretization should be specified. -failCriterion integer (no description available) -maxStableDt real64 Value of the Maximum Stable Timestep for this solver. -meshTargets geos_mapBase, LvArray_Array, int, LvArray_ChaiBuffer>, std_integral_constant > MeshBody/Region combinations that the solver will be applied to. -tipEdges LvArray_SortedArray Set containing all the tip edges -tipFaces LvArray_SortedArray Set containing all the tip faces -tipNodes LvArray_SortedArray Set containing all the nodes at the fracture tip -trailingFaces LvArray_SortedArray Set containing all the trailing faces -LinearSolverParameters node :ref:`DATASTRUCTURE_LinearSolverParameters` -NonlinearSolverParameters node :ref:`DATASTRUCTURE_NonlinearSolverParameters` -SolverStatistics node :ref:`DATASTRUCTURE_SolverStatistics` -========================= ====================================================================================================================================================== ======================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/SymbolicFunction.rst b/src/coreComponents/schema/docs/SymbolicFunction.rst deleted file mode 100644 index 0429ef7ef0d..00000000000 --- a/src/coreComponents/schema/docs/SymbolicFunction.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -============= ================== ======== ============================================================================ -Name Type Default Description -============= ================== ======== ============================================================================ -expression string required Symbolic math expression -inputVarNames groupNameRef_array {} Name of fields are input to function. -name groupName required A name is required for any non-unique nodes -variableNames groupNameRef_array required List of variables in expression. The order must match the evaluate argument -============= ================== ======== ============================================================================ - - diff --git a/src/coreComponents/schema/docs/SymbolicFunction_other.rst b/src/coreComponents/schema/docs/SymbolicFunction_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/SymbolicFunction_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/TableCapillaryPressure.rst b/src/coreComponents/schema/docs/TableCapillaryPressure.rst deleted file mode 100644 index c3732b8a9b7..00000000000 --- a/src/coreComponents/schema/docs/TableCapillaryPressure.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -========================================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== -name groupName required A name is required for any non-unique nodes -nonWettingIntermediateCapPressureTableName groupNameRef | Capillary pressure table [Pa] for the pair (non-wetting phase, intermediate phase) - | Note that this input is only used for three-phase flow. - | If you want to do a two-phase simulation, please use instead wettingNonWettingCapPressureTableName to specify the table names -phaseNames groupNameRef_array required List of fluid phases -wettingIntermediateCapPressureTableName groupNameRef | Capillary pressure table [Pa] for the pair (wetting phase, intermediate phase) - | Note that this input is only used for three-phase flow. - | If you want to do a two-phase simulation, please use instead wettingNonWettingCapPressureTableName to specify the table names -wettingNonWettingCapPressureTableName groupNameRef | Capillary pressure table [Pa] for the pair (wetting phase, non-wetting phase) - | Note that this input is only used for two-phase flow. - | If you want to do a three-phase simulation, please use instead wettingIntermediateCapPressureTableName and nonWettingIntermediateCapPressureTableName to specify the table names -========================================== ================== ======== ====================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/TableCapillaryPressure_other.rst b/src/coreComponents/schema/docs/TableCapillaryPressure_other.rst deleted file mode 100644 index d4c775cae61..00000000000 --- a/src/coreComponents/schema/docs/TableCapillaryPressure_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -=================================== =================================================================================================== ============================================================================ -Name Type Description -=================================== =================================================================================================== ============================================================================ -capPresWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) -dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction -phaseCapPressure real64_array3d Phase capillary pressure -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -=================================== =================================================================================================== ============================================================================ - - diff --git a/src/coreComponents/schema/docs/TableFunction.rst b/src/coreComponents/schema/docs/TableFunction.rst deleted file mode 100644 index b8909ae71d7..00000000000 --- a/src/coreComponents/schema/docs/TableFunction.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -=============== ==================================== ======== =========================================================================== -Name Type Default Description -=============== ==================================== ======== =========================================================================== -coordinateFiles path_array {} List of coordinate file names for ND Table -coordinates real64_array {0} Coordinates inputs for 1D tables -inputVarNames groupNameRef_array {} Name of fields are input to function. -interpolation geos_TableFunction_InterpolationType linear | Interpolation method. Valid options: - | * linear - | * nearest - | * upper - | * lower -name groupName required A name is required for any non-unique nodes -values real64_array {0} Values for 1D tables -voxelFile path Voxel file name for ND Table -=============== ==================================== ======== =========================================================================== - - diff --git a/src/coreComponents/schema/docs/TableFunction_other.rst b/src/coreComponents/schema/docs/TableFunction_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/TableFunction_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/TableRelativePermeability.rst b/src/coreComponents/schema/docs/TableRelativePermeability.rst deleted file mode 100644 index e5570ab4b80..00000000000 --- a/src/coreComponents/schema/docs/TableRelativePermeability.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -======================================= ======================================== ======== ================================================================================================================================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -======================================= ======================================== ======== ================================================================================================================================================================================================================================================================================================================================================================================================================================== -name groupName required A name is required for any non-unique nodes -nonWettingIntermediateRelPermTableNames groupNameRef_array {} | List of relative permeability tables for the pair (non-wetting phase, intermediate phase) - | The expected format is "{ nonWettingPhaseRelPermTableName, intermediatePhaseRelPermTableName }", in that order - | Note that this input is only used for three-phase flow. - | If you want to do a two-phase simulation, please use instead wettingNonWettingRelPermTableNames to specify the table names -phaseNames groupNameRef_array required List of fluid phases -threePhaseInterpolator geos_constitutive_ThreePhaseInterpolator BAKER | Type of Three phase interpolator.Valid options - | * BAKER - | * STONEII -wettingIntermediateRelPermTableNames groupNameRef_array {} | List of relative permeability tables for the pair (wetting phase, intermediate phase) - | The expected format is "{ wettingPhaseRelPermTableName, intermediatePhaseRelPermTableName }", in that order - | Note that this input is only used for three-phase flow. - | If you want to do a two-phase simulation, please use instead wettingNonWettingRelPermTableNames to specify the table names -wettingNonWettingRelPermTableNames groupNameRef_array {} | List of relative permeability tables for the pair (wetting phase, non-wetting phase) - | The expected format is "{ wettingPhaseRelPermTableName, nonWettingPhaseRelPermTableName }", in that order - | Note that this input is only used for two-phase flow. - | If you want to do a three-phase simulation, please use instead wettingIntermediateRelPermTableNames and nonWettingIntermediateRelPermTableNames to specify the table names -======================================= ======================================== ======== ================================================================================================================================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis.rst b/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis.rst deleted file mode 100644 index 6d8d9b07bb7..00000000000 --- a/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis.rst +++ /dev/null @@ -1,32 +0,0 @@ - - -=============================================== ======================================== ======== =========================================================================================================================================================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -=============================================== ======================================== ======== =========================================================================================================================================================================================================================================================================================================================================================================================================================================================== -drainageNonWettingIntermediateRelPermTableNames groupNameRef_array {} | List of drainage relative permeability tables for the pair (non-wetting phase, intermediate phase) - | The expected format is "{ nonWettingPhaseRelPermTableName, intermediatePhaseRelPermTableName }", in that order - | Note that this input is only used for three-phase flow. - | If you want to do a two-phase simulation, please use instead drainageWettingNonWettingRelPermTableNames to specify the table names -drainageWettingIntermediateRelPermTableNames groupNameRef_array {} | List of drainage relative permeability tables for the pair (wetting phase, intermediate phase) - | The expected format is "{ wettingPhaseRelPermTableName, intermediatePhaseRelPermTableName }", in that order - | Note that this input is only used for three-phase flow. - | If you want to do a two-phase simulation, please use instead drainageWettingNonWettingRelPermTableNames to specify the table names -drainageWettingNonWettingRelPermTableNames groupNameRef_array {} | List of drainage relative permeability tables for the pair (wetting phase, non-wetting phase) - | The expected format is "{ wettingPhaseRelPermTableName, nonWettingPhaseRelPermTableName }", in that order - | Note that this input is only used for two-phase flow. - | If you want to do a three-phase simulation, please use instead drainageWettingIntermediateRelPermTableNames and drainageNonWettingIntermediateRelPermTableNames to specify the table names -imbibitionNonWettingRelPermTableName groupNameRef | Imbibition relative permeability table name for the non-wetting phase. - | To neglect hysteresis on this phase, just use the same table name for the drainage and imbibition curves -imbibitionWettingRelPermTableName groupNameRef | Imbibition relative permeability table name for the wetting phase. - | To neglect hysteresis on this phase, just use the same table name for the drainage and imbibition curves -jerauldParameterA real64 0.1 First parameter (modification parameter) introduced by Jerauld in the Land trapping model (see RTD documentation). -jerauldParameterB real64 0 Second parameter introduced by Jerauld in the Land trapping model (see RTD documentation). -killoughCurvatureParameter real64 1 Curvature parameter introduced by Killough for wetting-phase hysteresis (see RTD documentation). -name groupName required A name is required for any non-unique nodes -phaseNames groupNameRef_array required List of fluid phases -threePhaseInterpolator geos_constitutive_ThreePhaseInterpolator BAKER | Type of Three phase interpolator.Valid options - | * BAKER - | * STONEII -=============================================== ======================================== ======== =========================================================================================================================================================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst b/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst deleted file mode 100644 index f8e13266217..00000000000 --- a/src/coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst +++ /dev/null @@ -1,27 +0,0 @@ - - -================================ =================================================================================================== =============================================================================== -Name Type Description -================================ =================================================================================================== =============================================================================== -dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction -drainagePhaseMaxVolumeFraction real64_array (no description available) -drainagePhaseMinVolumeFraction real64_array (no description available) -drainagePhaseRelPermEndPoint real64_array (no description available) -drainageRelPermWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) -imbibitionPhaseMaxVolumeFraction real64_array (no description available) -imbibitionPhaseMinVolumeFraction real64_array (no description available) -imbibitionPhaseRelPermEndPoint real64_array (no description available) -imbibitionRelPermWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) -landParameter real64_array (no description available) -phaseHasHysteresis integer_array (no description available) -phaseMaxHistoricalVolFraction real64_array2d Phase max historical phase volume fraction -phaseMinHistoricalVolFraction real64_array2d Phase min historical phase volume fraction -phaseOrder integer_array (no description available) -phaseRelPerm real64_array3d Phase relative permeability -phaseRelPerm_n real64_array3d Phase relative permeability at previous time -phaseTrappedVolFraction real64_array3d Phase trapped volume fraction -phaseTypes integer_array (no description available) -waterOilMaxRelPerm real64 (no description available) -================================ =================================================================================================== =============================================================================== - - diff --git a/src/coreComponents/schema/docs/TableRelativePermeability_other.rst b/src/coreComponents/schema/docs/TableRelativePermeability_other.rst deleted file mode 100644 index 4d6a2f00651..00000000000 --- a/src/coreComponents/schema/docs/TableRelativePermeability_other.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -=============================== =================================================================================================== =============================================================================== -Name Type Description -=============================== =================================================================================================== =============================================================================== -dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction -phaseMinVolumeFraction real64_array (no description available) -phaseOrder integer_array (no description available) -phaseRelPerm real64_array3d Phase relative permeability -phaseRelPerm_n real64_array3d Phase relative permeability at previous time -phaseTrappedVolFraction real64_array3d Phase trapped volume fraction -phaseTypes integer_array (no description available) -relPermWrappers LvArray_Array, int, LvArray_ChaiBuffer> (no description available) -waterOilMaxRelPerm real64 (no description available) -=============================== =================================================================================================== =============================================================================== - - diff --git a/src/coreComponents/schema/docs/Tasks.rst b/src/coreComponents/schema/docs/Tasks.rst deleted file mode 100644 index 261764bbeaa..00000000000 --- a/src/coreComponents/schema/docs/Tasks.rst +++ /dev/null @@ -1,26 +0,0 @@ - - -=========================================================== ==== ======= ====================================================================== -Name Type Default Description -=========================================================== ==== ======= ====================================================================== -CellToCellDataCollection node :ref:`XML_CellToCellDataCollection` -CompositionalMultiphaseReservoirPoromechanicsInitialization node :ref:`XML_CompositionalMultiphaseReservoirPoromechanicsInitialization` -CompositionalMultiphaseStatistics node :ref:`XML_CompositionalMultiphaseStatistics` -HydrofractureInitialization node :ref:`XML_HydrofractureInitialization` -MultiphasePoromechanicsInitialization node :ref:`XML_MultiphasePoromechanicsInitialization` -PVTDriver node :ref:`XML_PVTDriver` -PackCollection node :ref:`XML_PackCollection` -ReactiveFluidDriver node :ref:`XML_ReactiveFluidDriver` -RelpermDriver node :ref:`XML_RelpermDriver` -SinglePhasePoromechanicsConformingFracturesInitialization node :ref:`XML_SinglePhasePoromechanicsConformingFracturesInitialization` -SinglePhasePoromechanicsEmbeddedFracturesInitialization node :ref:`XML_SinglePhasePoromechanicsEmbeddedFracturesInitialization` -SinglePhasePoromechanicsInitialization node :ref:`XML_SinglePhasePoromechanicsInitialization` -SinglePhaseReservoirPoromechanicsInitialization node :ref:`XML_SinglePhaseReservoirPoromechanicsInitialization` -SinglePhaseStatistics node :ref:`XML_SinglePhaseStatistics` -SolidMechanicsStateReset node :ref:`XML_SolidMechanicsStateReset` -SolidMechanicsStatistics node :ref:`XML_SolidMechanicsStatistics` -SourceFluxStatistics node :ref:`XML_SourceFluxStatistics` -TriaxialDriver node :ref:`XML_TriaxialDriver` -=========================================================== ==== ======= ====================================================================== - - diff --git a/src/coreComponents/schema/docs/Tasks_other.rst b/src/coreComponents/schema/docs/Tasks_other.rst deleted file mode 100644 index bcde01875c0..00000000000 --- a/src/coreComponents/schema/docs/Tasks_other.rst +++ /dev/null @@ -1,26 +0,0 @@ - - -=========================================================== ==== ================================================================================ -Name Type Description -=========================================================== ==== ================================================================================ -CellToCellDataCollection node :ref:`DATASTRUCTURE_CellToCellDataCollection` -CompositionalMultiphaseReservoirPoromechanicsInitialization node :ref:`DATASTRUCTURE_CompositionalMultiphaseReservoirPoromechanicsInitialization` -CompositionalMultiphaseStatistics node :ref:`DATASTRUCTURE_CompositionalMultiphaseStatistics` -HydrofractureInitialization node :ref:`DATASTRUCTURE_HydrofractureInitialization` -MultiphasePoromechanicsInitialization node :ref:`DATASTRUCTURE_MultiphasePoromechanicsInitialization` -PVTDriver node :ref:`DATASTRUCTURE_PVTDriver` -PackCollection node :ref:`DATASTRUCTURE_PackCollection` -ReactiveFluidDriver node :ref:`DATASTRUCTURE_ReactiveFluidDriver` -RelpermDriver node :ref:`DATASTRUCTURE_RelpermDriver` -SinglePhasePoromechanicsConformingFracturesInitialization node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsConformingFracturesInitialization` -SinglePhasePoromechanicsEmbeddedFracturesInitialization node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsEmbeddedFracturesInitialization` -SinglePhasePoromechanicsInitialization node :ref:`DATASTRUCTURE_SinglePhasePoromechanicsInitialization` -SinglePhaseReservoirPoromechanicsInitialization node :ref:`DATASTRUCTURE_SinglePhaseReservoirPoromechanicsInitialization` -SinglePhaseStatistics node :ref:`DATASTRUCTURE_SinglePhaseStatistics` -SolidMechanicsStateReset node :ref:`DATASTRUCTURE_SolidMechanicsStateReset` -SolidMechanicsStatistics node :ref:`DATASTRUCTURE_SolidMechanicsStatistics` -SourceFluxStatistics node :ref:`DATASTRUCTURE_SourceFluxStatistics` -TriaxialDriver node :ref:`DATASTRUCTURE_TriaxialDriver` -=========================================================== ==== ================================================================================ - - diff --git a/src/coreComponents/schema/docs/ThermalCompressibleSinglePhaseFluid.rst b/src/coreComponents/schema/docs/ThermalCompressibleSinglePhaseFluid.rst deleted file mode 100644 index 469050d50fa..00000000000 --- a/src/coreComponents/schema/docs/ThermalCompressibleSinglePhaseFluid.rst +++ /dev/null @@ -1,32 +0,0 @@ - - -======================= =========================================== ======== =================================================================================== -Name Type Default Description -======================= =========================================== ======== =================================================================================== -compressibility real64 0 Fluid compressibility -defaultDensity real64 required Default value for density. -defaultViscosity real64 required Default value for viscosity. -densityModelType geos_constitutive_ExponentApproximationType linear | Type of density model. Valid options: - | * exponential - | * linear - | * quadratic -internalEnergyModelType geos_constitutive_ExponentApproximationType linear | Type of internal energy model. Valid options: - | * exponential - | * linear - | * quadratic -name groupName required A name is required for any non-unique nodes -referenceDensity real64 1000 Reference fluid density -referenceInternalEnergy real64 0.001 Reference fluid internal energy -referencePressure real64 0 Reference pressure -referenceTemperature real64 0 Reference temperature -referenceViscosity real64 0.001 Reference fluid viscosity -specificHeatCapacity real64 0 Fluid heat capacity. Unit: J/kg/K -thermalExpansionCoeff real64 0 Fluid thermal expansion coefficient. Unit: 1/K -viscosibility real64 0 Fluid viscosity exponential coefficient -viscosityModelType geos_constitutive_ExponentApproximationType linear | Type of viscosity model. Valid options: - | * exponential - | * linear - | * quadratic -======================= =========================================== ======== =================================================================================== - - diff --git a/src/coreComponents/schema/docs/ThermalCompressibleSinglePhaseFluid_other.rst b/src/coreComponents/schema/docs/ThermalCompressibleSinglePhaseFluid_other.rst deleted file mode 100644 index 53255e66ebc..00000000000 --- a/src/coreComponents/schema/docs/ThermalCompressibleSinglePhaseFluid_other.rst +++ /dev/null @@ -1,22 +0,0 @@ - - -============================ ============== ========================================================= -Name Type Description -============================ ============== ========================================================= -dDensity_dPressure real64_array2d Derivative of density with respect to pressure -dDensity_dTemperature real64_array2d Derivative of density with respect to temperature -dEnthalpy_dPressure real64_array2d Derivative of enthalpy with respect to pressure -dEnthalpy_dTemperature real64_array2d Derivative of enthalpy with respect to temperature -dInternalEnergy_dPressure real64_array2d Derivative of internal energy with respect to pressure -dInternalEnergy_dTemperature real64_array2d Derivative of internal energy with respect to temperature -dViscosity_dPressure real64_array2d Derivative of viscosity with respect to pressure -dViscosity_dTemperature real64_array2d Derivative of viscosity with respect to temperature -density real64_array2d Density -density_n real64_array2d Density at the previous converged time step -enthalpy real64_array2d Enthalpy -internalEnergy real64_array2d Internal energy -internalEnergy_n real64_array2d Fluid internal energy at the previous converged step -viscosity real64_array2d Viscosity -============================ ============== ========================================================= - - diff --git a/src/coreComponents/schema/docs/ThickPlane.rst b/src/coreComponents/schema/docs/ThickPlane.rst deleted file mode 100644 index d48c386ac4d..00000000000 --- a/src/coreComponents/schema/docs/ThickPlane.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -========= ========= ======== ===================================================================== -Name Type Default Description -========= ========= ======== ===================================================================== -name groupName required A name is required for any non-unique nodes -normal R1Tensor required Normal (n_x,n_y,n_z) to the plane (will be normalized automatically) -origin R1Tensor required Origin point (x,y,z) of the plane (basically, any point on the plane) -thickness real64 required The total thickness of the plane (with half to each side) -========= ========= ======== ===================================================================== - - diff --git a/src/coreComponents/schema/docs/ThickPlane_other.rst b/src/coreComponents/schema/docs/ThickPlane_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/ThickPlane_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/TimeHistory.rst b/src/coreComponents/schema/docs/TimeHistory.rst deleted file mode 100644 index 48d9d3cf740..00000000000 --- a/src/coreComponents/schema/docs/TimeHistory.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=============== ================== =========== =============================================================================== -Name Type Default Description -=============== ================== =========== =============================================================================== -childDirectory string Child directory path -filename string TimeHistory The filename to which to write time history output. -format string hdf The output file format for time history output. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -parallelThreads integer 1 Number of plot files. -sources groupNameRef_array required A list of collectors from which to collect and output time history information. -=============== ================== =========== =============================================================================== - - diff --git a/src/coreComponents/schema/docs/TimeHistory_other.rst b/src/coreComponents/schema/docs/TimeHistory_other.rst deleted file mode 100644 index dff6ceb0fc6..00000000000 --- a/src/coreComponents/schema/docs/TimeHistory_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -======= ======= ====================================================================================================================== -Name Type Description -======= ======= ====================================================================================================================== -restart integer The current history record to be written, on restart from an earlier time allows use to remove invalid future history. -======= ======= ====================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/Traction.rst b/src/coreComponents/schema/docs/Traction.rst deleted file mode 100644 index 58522e086bc..00000000000 --- a/src/coreComponents/schema/docs/Traction.rst +++ /dev/null @@ -1,24 +0,0 @@ - - -====================== =========================================== ============= =============================================================================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -====================== =========================================== ============= =============================================================================================================================================================================================================================================================================================================================================================================== -bcApplicationTableName groupNameRef Name of table that specifies the on/off application of the boundary condition. -beginTime real64 -1e+99 Time at which the boundary condition will start being applied. -direction R1Tensor {0,0,0} Direction to apply boundary condition to. -endTime real64 1e+99 Time at which the boundary condition will stop being applied. -functionName groupNameRef Name of function that specifies variation of the boundary condition. -initialCondition integer 0 Boundary condition is applied as an initial condition. -inputStress R2SymTensor {0,0,0,0,0,0} Input stress for tractionType = stress -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -objectPath groupNameRef Path to the target field -scale real64 0 Scale factor for value of the boundary condition. -setNames groupNameRef_array required Name of sets that boundary condition is applied to. -tractionType geos_TractionBoundaryCondition_TractionType vector | Type of traction boundary condition. Options are: - | vector - traction is applied to the faces as specified from the scale and direction, - | normal - traction is applied to the faces as a pressure specified from the product of scale and the outward face normal, - | stress - traction is applied to the faces as specified by the inner product of input stress and face normal. -====================== =========================================== ============= =============================================================================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/Traction_other.rst b/src/coreComponents/schema/docs/Traction_other.rst deleted file mode 100644 index 15200f2e3a7..00000000000 --- a/src/coreComponents/schema/docs/Traction_other.rst +++ /dev/null @@ -1,10 +0,0 @@ - - -========= ============ ============================================================== -Name Type Description -========= ============ ============================================================== -component integer Component of field (if tensor) to apply boundary condition to. -fieldName groupNameRef Name of field that boundary condition is applied to. -========= ============ ============================================================== - - diff --git a/src/coreComponents/schema/docs/TriaxialDriver.rst b/src/coreComponents/schema/docs/TriaxialDriver.rst deleted file mode 100644 index d8144999bee..00000000000 --- a/src/coreComponents/schema/docs/TriaxialDriver.rst +++ /dev/null @@ -1,18 +0,0 @@ - - -============= ======================== ======== ===================================================================== -Name Type Default Description -============= ======================== ======== ===================================================================== -axialControl groupNameRef required Function controlling axial stress or strain (depending on test mode) -baseline path none Baseline file -initialStress real64 required Initial stress (scalar used to set an isotropic stress state) -logLevel integer 0 Log level -material groupNameRef required Solid material to test -mode geos_TriaxialDriver_Mode required Test mode [stressControl, strainControl, mixedControl] -name groupName required A name is required for any non-unique nodes -output string none Output file -radialControl groupNameRef required Function controlling radial stress or strain (depending on test mode) -steps integer required Number of load steps to take -============= ======================== ======== ===================================================================== - - diff --git a/src/coreComponents/schema/docs/TriaxialDriver_other.rst b/src/coreComponents/schema/docs/TriaxialDriver_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/TriaxialDriver_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/TwoPointFluxApproximation.rst b/src/coreComponents/schema/docs/TwoPointFluxApproximation.rst deleted file mode 100644 index 30fa4827360..00000000000 --- a/src/coreComponents/schema/docs/TwoPointFluxApproximation.rst +++ /dev/null @@ -1,16 +0,0 @@ - - -=================== ==================== ======== =============================================================== -Name Type Default Description -=================== ==================== ======== =============================================================== -areaRelTol real64 1e-08 Relative tolerance for area calculations. -meanPermCoefficient real64 1 (no description available) -name groupName required A name is required for any non-unique nodes -upwindingScheme geos_UpwindingScheme PPU | Type of upwinding scheme. Valid options: - | * PPU - | * C1PPU - | * IHU -usePEDFM integer 0 (no description available) -=================== ==================== ======== =============================================================== - - diff --git a/src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst b/src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst deleted file mode 100644 index a21d5757d0f..00000000000 --- a/src/coreComponents/schema/docs/TwoPointFluxApproximation_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -======================== =================================================================================================================================== ======================================== -Name Type Description -======================== =================================================================================================================================== ======================================== -cellStencil geos_CellElementStencilTPFA (no description available) -coefficientName groupNameRef Name of coefficient field -edfmStencil geos_EmbeddedSurfaceToCellStencil (no description available) -faceElementToCellStencil geos_FaceElementToCellStencil (no description available) -fieldName groupNameRef_array Name of primary solution field -fractureStencil geos_SurfaceElementStencil (no description available) -targetRegions geos_mapBase, int, LvArray_ChaiBuffer>, std_integral_constant > List of regions to build the stencil for -======================== =================================================================================================================================== ======================================== - - diff --git a/src/coreComponents/schema/docs/VTK.rst b/src/coreComponents/schema/docs/VTK.rst deleted file mode 100644 index 952b60a3267..00000000000 --- a/src/coreComponents/schema/docs/VTK.rst +++ /dev/null @@ -1,22 +0,0 @@ - - -=========================== ======================= ======== ======================================================================================================================================================================================== -Name Type Default Description -=========================== ======================= ======== ======================================================================================================================================================================================== -childDirectory string Child directory path -fieldNames groupNameRef_array {} Names of the fields to output. If this attribute is specified, GEOSX outputs all the fields specified by the user, regardless of their `plotLevel` -format geos_vtk_VTKOutputMode binary Output data format. Valid options: ``binary``, ``ascii`` -levelNames string_array {} Names of mesh levels to output. -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -onlyPlotSpecifiedFieldNames integer 0 If this flag is equal to 1, then we only plot the fields listed in `fieldNames`. Otherwise, we plot all the fields with the required `plotLevel`, plus the fields listed in `fieldNames` -outputRegionType geos_vtk_VTKRegionTypes all Output region types. Valid options: ``cell``, ``well``, ``surface``, ``particle``, ``all`` -parallelThreads integer 1 Number of plot files. -plotFileRoot string VTK Name of the root file for this output. -plotLevel integer 1 Level detail plot. Only fields with lower of equal plot level will be output. -writeFEMFaces integer 0 (no description available) -writeFaceElementsAs3D integer 0 Should the face elements be written as 3d volumes or not. -writeGhostCells integer 0 Should the vtk files contain the ghost cells or not. -=========================== ======================= ======== ======================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/VTKMesh.rst b/src/coreComponents/schema/docs/VTKMesh.rst deleted file mode 100644 index f8365fa847f..00000000000 --- a/src/coreComponents/schema/docs/VTKMesh.rst +++ /dev/null @@ -1,26 +0,0 @@ - - -====================== ======================== ========= ============================================================================================================================================================================================================================================================================================================================================================================================================================================================================ -Name Type Default Description -====================== ======================== ========= ============================================================================================================================================================================================================================================================================================================================================================================================================================================================================ -faceBlocks groupNameRef_array {} For multi-block files, names of the face mesh block. -fieldNamesInGEOS groupNameRef_array {} Names of the volumic fields in GEOS to import into -fieldsToImport groupNameRef_array {} Volumic fields to be imported from the external mesh file -file path required Path to the mesh file -logLevel integer 0 Log level -mainBlockName groupNameRef main For multi-block files, name of the 3d mesh block. -name groupName required A name is required for any non-unique nodes -nodesetNames groupNameRef_array {} Names of the VTK nodesets to import -partitionMethod geos_vtk_PartitionMethod parmetis Method (library) used to partition the mesh -partitionRefinement integer 1 Number of partitioning refinement iterations (defaults to 1, recommended value).A value of 0 disables graph partitioning and keeps simple kd-tree partitions (not recommended). Values higher than 1 may lead to slightly improved partitioning, but yield diminishing returns. -regionAttribute groupNameRef attribute Name of the VTK cell attribute to use as region marker -scale R1Tensor {1,1,1} Scale the coordinates of the vertices by given scale factors (after translation) -surfacicFieldsInGEOS groupNameRef_array {} Names of the surfacic fields in GEOS to import into -surfacicFieldsToImport groupNameRef_array {} Surfacic fields to be imported from the external mesh file -translate R1Tensor {0,0,0} Translate the coordinates of the vertices by a given vector (prior to scaling) -useGlobalIds integer 0 Controls the use of global IDs in the input file for cells and points. If set to 0 (default value), the GlobalId arrays in the input mesh are used if available, and generated otherwise. If set to a negative value, the GlobalId arrays in the input mesh are not used, and generated global Ids are automatically generated. If set to a positive value, the GlobalId arrays in the input mesh are used and required, and the simulation aborts if they are not available -InternalWell node :ref:`XML_InternalWell` -VTKWell node :ref:`XML_VTKWell` -====================== ======================== ========= ============================================================================================================================================================================================================================================================================================================================================================================================================================================================================ - - diff --git a/src/coreComponents/schema/docs/VTKMesh_other.rst b/src/coreComponents/schema/docs/VTKMesh_other.rst deleted file mode 100644 index 8ca4f02bc36..00000000000 --- a/src/coreComponents/schema/docs/VTKMesh_other.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -============ ==== ================================= -Name Type Description -============ ==== ================================= -InternalWell node :ref:`DATASTRUCTURE_InternalWell` -VTKWell node :ref:`DATASTRUCTURE_VTKWell` -meshLevels node :ref:`DATASTRUCTURE_meshLevels` -============ ==== ================================= - - diff --git a/src/coreComponents/schema/docs/VTKWell.rst b/src/coreComponents/schema/docs/VTKWell.rst deleted file mode 100644 index 0df45b1798d..00000000000 --- a/src/coreComponents/schema/docs/VTKWell.rst +++ /dev/null @@ -1,17 +0,0 @@ - - -===================== ========= ======== ==================================================================================================== -Name Type Default Description -===================== ========= ======== ==================================================================================================== -file path required Path to the well file -minElementLength real64 0.001 Minimum length of a well element, computed as (segment length / number of elements per segment ) [m] -minSegmentLength real64 0.01 Minimum length of a well segment [m] -name groupName required A name is required for any non-unique nodes -numElementsPerSegment integer required Number of well elements per polyline segment -radius real64 required Radius of the well [m] -wellControlsName string required Name of the set of constraints associated with this well -wellRegionName string required Name of the well element region -Perforation node :ref:`XML_Perforation` -===================== ========= ======== ==================================================================================================== - - diff --git a/src/coreComponents/schema/docs/VTKWell_other.rst b/src/coreComponents/schema/docs/VTKWell_other.rst deleted file mode 100644 index 638cc779598..00000000000 --- a/src/coreComponents/schema/docs/VTKWell_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -=========== ==== ================================ -Name Type Description -=========== ==== ================================ -Perforation node :ref:`DATASTRUCTURE_Perforation` -=========== ==== ================================ - - diff --git a/src/coreComponents/schema/docs/VTK_other.rst b/src/coreComponents/schema/docs/VTK_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/VTK_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/VanGenuchtenBakerRelativePermeability.rst b/src/coreComponents/schema/docs/VanGenuchtenBakerRelativePermeability.rst deleted file mode 100644 index 00d74f74608..00000000000 --- a/src/coreComponents/schema/docs/VanGenuchtenBakerRelativePermeability.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -========================== ================== ======== ================================================================================================================================================================== -Name Type Default Description -========================== ================== ======== ================================================================================================================================================================== -gasOilRelPermExponentInv real64_array {0.5} | Rel perm power law exponent inverse for the pair (gas phase, oil phase) at residual water saturation - | The expected format is "{ gasExp, oilExp }", in that order -gasOilRelPermMaxValue real64_array {0} | Maximum rel perm value for the pair (gas phase, oil phase) at residual water saturation - | The expected format is "{ gasMax, oilMax }", in that order -name groupName required A name is required for any non-unique nodes -phaseMinVolumeFraction real64_array {0} Minimum volume fraction value for each phase -phaseNames groupNameRef_array required List of fluid phases -waterOilRelPermExponentInv real64_array {0.5} | Rel perm power law exponent inverse for the pair (water phase, oil phase) at residual gas saturation - | The expected format is "{ waterExp, oilExp }", in that order -waterOilRelPermMaxValue real64_array {0} | Maximum rel perm value for the pair (water phase, oil phase) at residual gas saturation - | The expected format is "{ waterMax, oilMax }", in that order -========================== ================== ======== ================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/VanGenuchtenBakerRelativePermeability_other.rst b/src/coreComponents/schema/docs/VanGenuchtenBakerRelativePermeability_other.rst deleted file mode 100644 index e6dd24aeb13..00000000000 --- a/src/coreComponents/schema/docs/VanGenuchtenBakerRelativePermeability_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=============================== ============== ======================================================================================================================= -Name Type Description -=============================== ============== ======================================================================================================================= -dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction -phaseOrder integer_array (no description available) -phaseRelPerm real64_array3d Phase relative permeability -phaseRelPerm_n real64_array3d Phase relative permeability at previous time -phaseTrappedVolFraction real64_array3d Phase trapped volume fraction -phaseTypes integer_array (no description available) -volFracScale real64 Factor used to scale the phase capillary pressure, defined as: one minus the sum of the phase minimum volume fractions. -=============================== ============== ======================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/VanGenuchtenCapillaryPressure.rst b/src/coreComponents/schema/docs/VanGenuchtenCapillaryPressure.rst deleted file mode 100644 index d1ba6cf0266..00000000000 --- a/src/coreComponents/schema/docs/VanGenuchtenCapillaryPressure.rst +++ /dev/null @@ -1,14 +0,0 @@ - - -=========================== ================== ======== ================================================================================================================================================== -Name Type Default Description -=========================== ================== ======== ================================================================================================================================================== -capPressureEpsilon real64 1e-06 Saturation at which the extremum capillary pressure is attained; used to avoid infinite capillary pressure values for saturations close to 0 and 1 -name groupName required A name is required for any non-unique nodes -phaseCapPressureExponentInv real64_array {0.5} Inverse of capillary power law exponent for each phase -phaseCapPressureMultiplier real64_array {1} Entry pressure value for each phase -phaseMinVolumeFraction real64_array {0} Minimum volume fraction value for each phase -phaseNames groupNameRef_array required List of fluid phases -=========================== ================== ======== ================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/VanGenuchtenCapillaryPressure_other.rst b/src/coreComponents/schema/docs/VanGenuchtenCapillaryPressure_other.rst deleted file mode 100644 index 336528e2f6f..00000000000 --- a/src/coreComponents/schema/docs/VanGenuchtenCapillaryPressure_other.rst +++ /dev/null @@ -1,13 +0,0 @@ - - -=================================== ============== ======================================================================================================================= -Name Type Description -=================================== ============== ======================================================================================================================= -dPhaseCapPressure_dPhaseVolFraction real64_array4d Derivative of phase capillary pressure with respect to phase volume fraction -phaseCapPressure real64_array3d Phase capillary pressure -phaseOrder integer_array (no description available) -phaseTypes integer_array (no description available) -volFracScale real64 Factor used to scale the phase capillary pressure, defined as: one minus the sum of the phase minimum volume fractions. -=================================== ============== ======================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/VanGenuchtenStone2RelativePermeability.rst b/src/coreComponents/schema/docs/VanGenuchtenStone2RelativePermeability.rst deleted file mode 100644 index 00d74f74608..00000000000 --- a/src/coreComponents/schema/docs/VanGenuchtenStone2RelativePermeability.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -========================== ================== ======== ================================================================================================================================================================== -Name Type Default Description -========================== ================== ======== ================================================================================================================================================================== -gasOilRelPermExponentInv real64_array {0.5} | Rel perm power law exponent inverse for the pair (gas phase, oil phase) at residual water saturation - | The expected format is "{ gasExp, oilExp }", in that order -gasOilRelPermMaxValue real64_array {0} | Maximum rel perm value for the pair (gas phase, oil phase) at residual water saturation - | The expected format is "{ gasMax, oilMax }", in that order -name groupName required A name is required for any non-unique nodes -phaseMinVolumeFraction real64_array {0} Minimum volume fraction value for each phase -phaseNames groupNameRef_array required List of fluid phases -waterOilRelPermExponentInv real64_array {0.5} | Rel perm power law exponent inverse for the pair (water phase, oil phase) at residual gas saturation - | The expected format is "{ waterExp, oilExp }", in that order -waterOilRelPermMaxValue real64_array {0} | Maximum rel perm value for the pair (water phase, oil phase) at residual gas saturation - | The expected format is "{ waterMax, oilMax }", in that order -========================== ================== ======== ================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/VanGenuchtenStone2RelativePermeability_other.rst b/src/coreComponents/schema/docs/VanGenuchtenStone2RelativePermeability_other.rst deleted file mode 100644 index e6dd24aeb13..00000000000 --- a/src/coreComponents/schema/docs/VanGenuchtenStone2RelativePermeability_other.rst +++ /dev/null @@ -1,15 +0,0 @@ - - -=============================== ============== ======================================================================================================================= -Name Type Description -=============================== ============== ======================================================================================================================= -dPhaseRelPerm_dPhaseVolFraction real64_array4d Derivative of phase relative permeability with respect to phase volume fraction -phaseOrder integer_array (no description available) -phaseRelPerm real64_array3d Phase relative permeability -phaseRelPerm_n real64_array3d Phase relative permeability at previous time -phaseTrappedVolFraction real64_array3d Phase trapped volume fraction -phaseTypes integer_array (no description available) -volFracScale real64 Factor used to scale the phase capillary pressure, defined as: one minus the sum of the phase minimum volume fractions. -=============================== ============== ======================================================================================================================= - - diff --git a/src/coreComponents/schema/docs/ViscoDruckerPrager.rst b/src/coreComponents/schema/docs/ViscoDruckerPrager.rst deleted file mode 100644 index 0fcfe196f5d..00000000000 --- a/src/coreComponents/schema/docs/ViscoDruckerPrager.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -======================= ========= ======== ==================================================================== -Name Type Default Description -======================= ========= ======== ==================================================================== -defaultBulkModulus real64 -1 Default Bulk Modulus Parameter -defaultCohesion real64 0 Initial cohesion -defaultDensity real64 required Default Material Density -defaultDilationAngle real64 30 Dilation angle (degrees) -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultFrictionAngle real64 30 Friction angle (degrees) -defaultHardeningRate real64 0 Cohesion hardening/softening rate -defaultPoissonRatio real64 -1 Default Poisson's Ratio -defaultShearModulus real64 -1 Default Shear Modulus Parameter -defaultYoungModulus real64 -1 Default Young's Modulus -name groupName required A name is required for any non-unique nodes -relaxationTime real64 required Relaxation time -======================= ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/ViscoDruckerPrager_other.rst b/src/coreComponents/schema/docs/ViscoDruckerPrager_other.rst deleted file mode 100644 index 3185dd07d81..00000000000 --- a/src/coreComponents/schema/docs/ViscoDruckerPrager_other.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -bulkModulus real64_array Elastic Bulk Modulus Field -cohesion real64_array2d New cohesion state -density real64_array2d Material Density -dilation real64_array Plastic potential slope -friction real64_array Yield surface slope -hardening real64_array Hardening rate -oldCohesion real64_array2d Old cohesion state -oldStress real64_array3d Previous Material Stress -shearModulus real64_array Elastic Shear Modulus Field -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/ViscoExtendedDruckerPrager.rst b/src/coreComponents/schema/docs/ViscoExtendedDruckerPrager.rst deleted file mode 100644 index 6f9cc0dda2b..00000000000 --- a/src/coreComponents/schema/docs/ViscoExtendedDruckerPrager.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -============================ ========= ======== ==================================================================== -Name Type Default Description -============================ ========= ======== ==================================================================== -defaultBulkModulus real64 -1 Default Bulk Modulus Parameter -defaultCohesion real64 0 Initial cohesion -defaultDensity real64 required Default Material Density -defaultDilationRatio real64 1 Dilation ratio [0,1] (ratio = tan dilationAngle / tan frictionAngle) -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultHardening real64 0 Hardening parameter (hardening rate is faster for smaller values) -defaultInitialFrictionAngle real64 30 Initial friction angle (degrees) -defaultPoissonRatio real64 -1 Default Poisson's Ratio -defaultResidualFrictionAngle real64 30 Residual friction angle (degrees) -defaultShearModulus real64 -1 Default Shear Modulus Parameter -defaultYoungModulus real64 -1 Default Young's Modulus -name groupName required A name is required for any non-unique nodes -relaxationTime real64 required Relaxation time -============================ ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/ViscoExtendedDruckerPrager_other.rst b/src/coreComponents/schema/docs/ViscoExtendedDruckerPrager_other.rst deleted file mode 100644 index 729d894b362..00000000000 --- a/src/coreComponents/schema/docs/ViscoExtendedDruckerPrager_other.rst +++ /dev/null @@ -1,21 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -bulkModulus real64_array Elastic Bulk Modulus Field -density real64_array2d Material Density -dilationRatio real64_array Plastic potential slope ratio -hardening real64_array Hardening parameter -initialFriction real64_array Initial yield surface slope -oldStateVariable real64_array2d Old equivalent plastic shear strain -oldStress real64_array3d Previous Material Stress -pressureIntercept real64_array Pressure point at cone vertex -residualFriction real64_array Residual yield surface slope -shearModulus real64_array Elastic Shear Modulus Field -stateVariable real64_array2d New equivalent plastic shear strain -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/ViscoModifiedCamClay.rst b/src/coreComponents/schema/docs/ViscoModifiedCamClay.rst deleted file mode 100644 index 2649b896438..00000000000 --- a/src/coreComponents/schema/docs/ViscoModifiedCamClay.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -=============================== ========= ======== ==================================================================== -Name Type Default Description -=============================== ========= ======== ==================================================================== -defaultCslSlope real64 1 Slope of the critical state line -defaultDensity real64 required Default Material Density -defaultDrainedLinearTEC real64 0 Default Linear Thermal Expansion Coefficient of the Solid Rock Frame -defaultPreConsolidationPressure real64 -1.5 Initial preconsolidation pressure -defaultRecompressionIndex real64 0.002 Recompresion Index -defaultRefPressure real64 -1 Reference Pressure -defaultRefStrainVol real64 0 Reference Volumetric Strain -defaultShearModulus real64 -1 Elastic Shear Modulus Parameter -defaultVirginCompressionIndex real64 0.005 Virgin compression index -name groupName required A name is required for any non-unique nodes -relaxationTime real64 required Relaxation time -=============================== ========= ======== ==================================================================== - - diff --git a/src/coreComponents/schema/docs/ViscoModifiedCamClay_other.rst b/src/coreComponents/schema/docs/ViscoModifiedCamClay_other.rst deleted file mode 100644 index 9cbfc0ba5ef..00000000000 --- a/src/coreComponents/schema/docs/ViscoModifiedCamClay_other.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -=========================== ============== ========================================== -Name Type Description -=========================== ============== ========================================== -cslSlope real64_array Slope of the critical state line -density real64_array2d Material Density -oldPreConsolidationPressure real64_array2d Old preconsolidation pressure -oldStress real64_array3d Previous Material Stress -preConsolidationPressure real64_array2d New preconsolidation pressure -recompressionIndex real64_array Recompression Index Field -refPressure real64 Reference Pressure Field -refStrainVol real64 Reference Volumetric Strain -shearModulus real64_array Elastic Shear Modulus -stress real64_array3d Current Material Stress -thermalExpansionCoefficient real64_array Linear Thermal Expansion Coefficient Field -virginCompressionIndex real64_array Virgin compression index -=========================== ============== ========================================== - - diff --git a/src/coreComponents/schema/docs/WellControls.rst b/src/coreComponents/schema/docs/WellControls.rst deleted file mode 100644 index c31d40067e7..00000000000 --- a/src/coreComponents/schema/docs/WellControls.rst +++ /dev/null @@ -1,43 +0,0 @@ - - -========================== ========================= ======== =================================================================================================================================================================================================================================================================================================================================================================================================== -Name Type Default Description -========================== ========================= ======== =================================================================================================================================================================================================================================================================================================================================================================================================== -control geos_WellControls_Control required | Well control. Valid options: - | * BHP - | * phaseVolRate - | * totalVolRate - | * massRate - | * uninitialized -enableCrossflow integer 1 | Flag to enable crossflow. Currently only supported for injectors: - | - If the flag is set to 1, both reservoir-to-well flow and well-to-reservoir flow are allowed at the perforations. - | - If the flag is set to 0, we only allow well-to-reservoir flow at the perforations. -initialPressureCoefficient real64 0.1 | Tuning coefficient for the initial well pressure of rate-controlled wells: - | - Injector pressure at reference depth initialized as: (1+initialPressureCoefficient)*reservoirPressureAtClosestPerforation + density*g*( zRef - zPerf ) - | - Producer pressure at reference depth initialized as: (1-initialPressureCoefficient)*reservoirPressureAtClosestPerforation + density*g*( zRef - zPerf ) -injectionStream real64_array {-1} Global component densities of the injection stream [moles/m^3 or kg/m^3] -injectionTemperature real64 -1 Temperature of the injection stream [K] -logLevel integer 0 Log level -name groupName required A name is required for any non-unique nodes -referenceElevation real64 required Reference elevation where BHP control is enforced [m] -statusTableName groupNameRef | Name of the well status table when the status of the well is a time dependent function. - | If the status function evaluates to a positive value at the current time, the well will be open otherwise the well will be shut. -surfacePressure real64 0 Surface pressure used to compute volumetric rates when surface conditions are used [Pa] -surfaceTemperature real64 0 Surface temperature used to compute volumetric rates when surface conditions are used [K] -targetBHP real64 0 Target bottom-hole pressure [Pa] -targetBHPTableName groupNameRef Name of the BHP table when the rate is a time dependent function -targetMassRate real64 0 Target Mass Rate rate ( [kg^3/s]) -targetMassRateTableName groupNameRef Name of the mass rate table when the rate is a time dependent function -targetPhaseName groupNameRef Name of the target phase -targetPhaseRate real64 0 Target phase volumetric rate (if useSurfaceConditions: [surface m^3/s]; else [reservoir m^3/s]) -targetPhaseRateTableName groupNameRef Name of the phase rate table when the rate is a time dependent function -targetTotalRate real64 0 Target total volumetric rate (if useSurfaceConditions: [surface m^3/s]; else [reservoir m^3/s]) -targetTotalRateTableName groupNameRef Name of the total rate table when the rate is a time dependent function -type geos_WellControls_Type required | Well type. Valid options: - | * producer - | * injector -useSurfaceConditions integer 0 | Flag to specify whether rates are checked at surface or reservoir conditions. - | Equal to 1 for surface conditions, and to 0 for reservoir conditions -========================== ========================= ======== =================================================================================================================================================================================================================================================================================================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/WellControls_other.rst b/src/coreComponents/schema/docs/WellControls_other.rst deleted file mode 100644 index 503c03ed6f5..00000000000 --- a/src/coreComponents/schema/docs/WellControls_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -============== ========================= ==================== -Name Type Description -============== ========================= ==================== -currentControl geos_WellControls_Control Current well control -============== ========================= ==================== - - diff --git a/src/coreComponents/schema/docs/WellElementRegion.rst b/src/coreComponents/schema/docs/WellElementRegion.rst deleted file mode 100644 index d34dc05fe1a..00000000000 --- a/src/coreComponents/schema/docs/WellElementRegion.rst +++ /dev/null @@ -1,11 +0,0 @@ - - -============ ================== ======== =========================================== -Name Type Default Description -============ ================== ======== =========================================== -materialList groupNameRef_array required List of materials present in this region -meshBody groupNameRef Mesh body that contains this region -name groupName required A name is required for any non-unique nodes -============ ================== ======== =========================================== - - diff --git a/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst b/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst deleted file mode 100644 index cc185a514b1..00000000000 --- a/src/coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst +++ /dev/null @@ -1,31 +0,0 @@ - - -========================== ===================================================================================================== ========================================================= -Name Type Description -========================== ===================================================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -elementCenter real64_array2d (no description available) -elementVolume real64_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -nextWellElementIndex integer_array (no description available) -nextWellElementIndexGlobal integer_array (no description available) -nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) -numEdgesPerElement integer (no description available) -numFacesPerElement integer (no description available) -numNodesPerElement integer (no description available) -radius real64_array (no description available) -topRank integer (no description available) -topWellElementIndex integer (no description available) -wellControlsName groupNameRef (no description available) -ConstitutiveModels node :ref:`DATASTRUCTURE_ConstitutiveModels` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -wellElementSubRegion node :ref:`DATASTRUCTURE_wellElementSubRegion` -========================== ===================================================================================================== ========================================================= - - diff --git a/src/coreComponents/schema/docs/WellElementRegion_other.rst b/src/coreComponents/schema/docs/WellElementRegion_other.rst deleted file mode 100644 index a32b9e5a226..00000000000 --- a/src/coreComponents/schema/docs/WellElementRegion_other.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -======================= ================================================================= ========================================================= -Name Type Description -======================= ================================================================= ========================================================= -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -wellControlsName groupNameRef (no description available) -wellGeneratorName groupNameRef (no description available) -elementSubRegions node :ref:`DATASTRUCTURE_elementSubRegions` -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ================================================================= ========================================================= - - diff --git a/src/coreComponents/schema/docs/WillisRichardsPermeability.rst b/src/coreComponents/schema/docs/WillisRichardsPermeability.rst deleted file mode 100644 index 47299a37b6a..00000000000 --- a/src/coreComponents/schema/docs/WillisRichardsPermeability.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -=================== ========= ======== ========================================================= -Name Type Default Description -=================== ========= ======== ========================================================= -dilationCoefficient real64 required Dilation coefficient (tan of dilation angle). -maxFracAperture real64 required Maximum fracture aperture at zero contact stress. -name groupName required A name is required for any non-unique nodes -refClosureStress real64 required Effective normal stress causes 90% reduction in aperture. -=================== ========= ======== ========================================================= - - diff --git a/src/coreComponents/schema/docs/WillisRichardsPermeability_other.rst b/src/coreComponents/schema/docs/WillisRichardsPermeability_other.rst deleted file mode 100644 index 945812dafaa..00000000000 --- a/src/coreComponents/schema/docs/WillisRichardsPermeability_other.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -=============== ============== =================================================================== -Name Type Description -=============== ============== =================================================================== -dPerm_dDispJump real64_array4d Derivative of rock permeability with respect to displacement jump -dPerm_dPressure real64_array3d Derivative of rock permeability with respect to pressure -dPerm_dTraction real64_array4d Derivative of rock permeability with respect to the traction vector -permeability real64_array3d Rock permeability -=============== ============== =================================================================== - - diff --git a/src/coreComponents/schema/docs/commandLine_other.rst b/src/coreComponents/schema/docs/commandLine_other.rst deleted file mode 100644 index 6800ed46187..00000000000 --- a/src/coreComponents/schema/docs/commandLine_other.rst +++ /dev/null @@ -1,20 +0,0 @@ - - -======================== ======= ====================================================================================================================== -Name Type Description -======================== ======= ====================================================================================================================== -beginFromRestart integer Flag to indicate restart run. -inputFileName string Name of the input xml file. -outputDirectory string Directory in which to put the output files, if not specified defaults to the current directory. -overridePartitionNumbers integer Flag to indicate partition number override -problemName string Used in writing the output files, if not specified defaults to the name of the input file. -restartFileName string Name of the restart file. -schemaFileName string Name of the output schema -suppressPinned integer Whether to disallow using pinned memory allocations for MPI communication buffers. -useNonblockingMPI integer Whether to prefer using non-blocking MPI communication where implemented (results in non-deterministic DOF numbering). -xPartitionsOverride integer Number of partitions in the x-direction -yPartitionsOverride integer Number of partitions in the y-direction -zPartitionsOverride integer Number of partitions in the z-direction -======================== ======= ====================================================================================================================== - - diff --git a/src/coreComponents/schema/docs/crusher.rst b/src/coreComponents/schema/docs/crusher.rst deleted file mode 100644 index 5c143d46c6a..00000000000 --- a/src/coreComponents/schema/docs/crusher.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ======= ============== -Name Type Default Description -==== ==== ======= ============== -Run node unique :ref:`XML_Run` -==== ==== ======= ============== - - diff --git a/src/coreComponents/schema/docs/crusher_other.rst b/src/coreComponents/schema/docs/crusher_other.rst deleted file mode 100644 index fb5ee6f8329..00000000000 --- a/src/coreComponents/schema/docs/crusher_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ======================== -Name Type Description -==== ==== ======================== -Run node :ref:`DATASTRUCTURE_Run` -==== ==== ======================== - - diff --git a/src/coreComponents/schema/docs/domain_other.rst b/src/coreComponents/schema/docs/domain_other.rst deleted file mode 100644 index 4cbdf6ffbda..00000000000 --- a/src/coreComponents/schema/docs/domain_other.rst +++ /dev/null @@ -1,12 +0,0 @@ - - -================ ================================================================================ ================================= -Name Type Description -================ ================================================================================ ================================= -Neighbors std_vector > (no description available) -partitionManager geos_PartitionBase (no description available) -Constitutive node :ref:`DATASTRUCTURE_Constitutive` -MeshBodies node :ref:`DATASTRUCTURE_MeshBodies` -================ ================================================================================ ================================= - - diff --git a/src/coreComponents/schema/docs/edgeManager_other.rst b/src/coreComponents/schema/docs/edgeManager_other.rst deleted file mode 100644 index 243e8c0b337..00000000000 --- a/src/coreComponents/schema/docs/edgeManager_other.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -======================= ===================================================================================================== ========================================================= -Name Type Description -======================= ===================================================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -faceList geos_InterObjectRelation > (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ===================================================================================================== ========================================================= - - diff --git a/src/coreComponents/schema/docs/elementRegionsGroup_other.rst b/src/coreComponents/schema/docs/elementRegionsGroup_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/elementRegionsGroup_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/elementSubRegions_other.rst b/src/coreComponents/schema/docs/elementSubRegions_other.rst deleted file mode 100644 index 3be4d2e912b..00000000000 --- a/src/coreComponents/schema/docs/elementSubRegions_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -================================ ==== ===================================================== -Name Type Description -================================ ==== ===================================================== -WellElementRegionUniqueSubRegion node :ref:`DATASTRUCTURE_WellElementRegionUniqueSubRegion` -================================ ==== ===================================================== - - diff --git a/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst b/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst deleted file mode 100644 index 243e8c0b337..00000000000 --- a/src/coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst +++ /dev/null @@ -1,19 +0,0 @@ - - -======================= ===================================================================================================== ========================================================= -Name Type Description -======================= ===================================================================================================== ========================================================= -domainBoundaryIndicator integer_array (no description available) -faceList geos_InterObjectRelation > (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -nodeList geos_InterObjectRelation, int, LvArray_ChaiBuffer> > (no description available) -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ===================================================================================================== ========================================================= - - diff --git a/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst b/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst deleted file mode 100644 index 9aff15dcd84..00000000000 --- a/src/coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst +++ /dev/null @@ -1,24 +0,0 @@ - - -======================= ============================================================================ ============================================= ================================================================ -Name Type Registered By Description -======================= ============================================================================ ============================================= ================================================================ -domainBoundaryIndicator integer_array (no description available) -edgeList geos_InterObjectRelation > (no description available) -elemList LvArray_ArrayOfArrays (no description available) -elemRegionList LvArray_ArrayOfArrays (no description available) -elemSubRegionList LvArray_ArrayOfArrays (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -parentEdgeGlobalIndex globalIndex_array (no description available) -referencePosition real64_array2d (no description available) -parentEdgeIndex integer_array :ref:`DATASTRUCTURE_EmbeddedSurfaceGenerator` Index of parent edge within the mesh object it is registered on. -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ============================================================================ ============================================= ================================================================ - - diff --git a/src/coreComponents/schema/docs/faceManager_other.rst b/src/coreComponents/schema/docs/faceManager_other.rst deleted file mode 100644 index 7aac5efbd3e..00000000000 --- a/src/coreComponents/schema/docs/faceManager_other.rst +++ /dev/null @@ -1,27 +0,0 @@ - - -======================= ============================================================================== ================================================================================================ ========================================================= -Name Type Registered By Description -======================= ============================================================================== ================================================================================================ ========================================================= -domainBoundaryIndicator integer_array (no description available) -edgeList geos_InterObjectRelation > (no description available) -elemList integer_array2d (no description available) -elemRegionList integer_array2d (no description available) -elemSubRegionList integer_array2d (no description available) -faceArea real64_array (no description available) -faceCenter real64_array2d (no description available) -faceNormal real64_array2d (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -nodeList geos_InterObjectRelation > (no description available) -facePressure_n real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM`, :ref:`DATASTRUCTURE_SinglePhaseHybridFVM` Face pressure at the previous converged time step -mimGravityCoefficient real64_array :ref:`DATASTRUCTURE_CompositionalMultiphaseHybridFVM` Mimetic gravity coefficient -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ============================================================================== ================================================================================================ ========================================================= - - diff --git a/src/coreComponents/schema/docs/lassen.rst b/src/coreComponents/schema/docs/lassen.rst deleted file mode 100644 index 5c143d46c6a..00000000000 --- a/src/coreComponents/schema/docs/lassen.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ======= ============== -Name Type Default Description -==== ==== ======= ============== -Run node unique :ref:`XML_Run` -==== ==== ======= ============== - - diff --git a/src/coreComponents/schema/docs/lassen_other.rst b/src/coreComponents/schema/docs/lassen_other.rst deleted file mode 100644 index fb5ee6f8329..00000000000 --- a/src/coreComponents/schema/docs/lassen_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ======================== -Name Type Description -==== ==== ======================== -Run node :ref:`DATASTRUCTURE_Run` -==== ==== ======================== - - diff --git a/src/coreComponents/schema/docs/meshLevels_other.rst b/src/coreComponents/schema/docs/meshLevels_other.rst deleted file mode 100644 index ec43e922076..00000000000 --- a/src/coreComponents/schema/docs/meshLevels_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -====== ==== =========================== -Name Type Description -====== ==== =========================== -Level0 node :ref:`DATASTRUCTURE_Level0` -====== ==== =========================== - - diff --git a/src/coreComponents/schema/docs/neighborData_other.rst b/src/coreComponents/schema/docs/neighborData_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/neighborData_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/nodeManager_other.rst b/src/coreComponents/schema/docs/nodeManager_other.rst deleted file mode 100644 index d1aad06734e..00000000000 --- a/src/coreComponents/schema/docs/nodeManager_other.rst +++ /dev/null @@ -1,24 +0,0 @@ - - -======================= ============================================================================ ========================================================= -Name Type Description -======================= ============================================================================ ========================================================= -ReferencePosition real64_array2d (no description available) -domainBoundaryIndicator integer_array (no description available) -edgeList geos_InterObjectRelation > (no description available) -elemList LvArray_ArrayOfArrays (no description available) -elemRegionList LvArray_ArrayOfArrays (no description available) -elemSubRegionList LvArray_ArrayOfArrays (no description available) -faceList geos_InterObjectRelation > (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -maxGlobalIndex globalIndex (no description available) -primaryField real64_array Primary field variable -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -======================= ============================================================================ ========================================================= - - diff --git a/src/coreComponents/schema/docs/particleRegionsGroup_other.rst b/src/coreComponents/schema/docs/particleRegionsGroup_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/particleRegionsGroup_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/particleSubRegions_other.rst b/src/coreComponents/schema/docs/particleSubRegions_other.rst deleted file mode 100644 index adf1c1b8aec..00000000000 --- a/src/coreComponents/schema/docs/particleSubRegions_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ============================ -Name Type Description -==== ==== ============================ - (no documentation available) -==== ==== ============================ - - diff --git a/src/coreComponents/schema/docs/quartz.rst b/src/coreComponents/schema/docs/quartz.rst deleted file mode 100644 index 5c143d46c6a..00000000000 --- a/src/coreComponents/schema/docs/quartz.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ======= ============== -Name Type Default Description -==== ==== ======= ============== -Run node unique :ref:`XML_Run` -==== ==== ======= ============== - - diff --git a/src/coreComponents/schema/docs/quartz_other.rst b/src/coreComponents/schema/docs/quartz_other.rst deleted file mode 100644 index fb5ee6f8329..00000000000 --- a/src/coreComponents/schema/docs/quartz_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -==== ==== ======================== -Name Type Description -==== ==== ======================== -Run node :ref:`DATASTRUCTURE_Run` -==== ==== ======================== - - diff --git a/src/coreComponents/schema/docs/sets_other.rst b/src/coreComponents/schema/docs/sets_other.rst deleted file mode 100644 index 59e718c41f8..00000000000 --- a/src/coreComponents/schema/docs/sets_other.rst +++ /dev/null @@ -1,9 +0,0 @@ - - -=========== ================================================= ========================== -Name Type Description -=========== ================================================= ========================== -externalSet LvArray_SortedArray (no description available) -=========== ================================================= ========================== - - diff --git a/src/coreComponents/schema/docs/wellElementSubRegion_other.rst b/src/coreComponents/schema/docs/wellElementSubRegion_other.rst deleted file mode 100644 index 3af96c4f2b1..00000000000 --- a/src/coreComponents/schema/docs/wellElementSubRegion_other.rst +++ /dev/null @@ -1,25 +0,0 @@ - - -========================= ================================================================= ====================================================================== -Name Type Description -========================= ================================================================= ====================================================================== -domainBoundaryIndicator integer_array (no description available) -ghostRank integer_array (no description available) -globalToLocalMap geos_mapBase > (no description available) -isExternal integer_array (no description available) -localMaxGlobalIndex globalIndex (no description available) -localToGlobalMap globalIndex_array Array that contains a map from localIndex to globalIndex. -location real64_array2d For each perforation, physical location (x,y,z coordinates) -maxGlobalIndex globalIndex (no description available) -numPerforationsGlobal globalIndex (no description available) -reservoirElementIndex integer_array For each perforation, element index of the perforated element -reservoirElementRegion integer_array For each perforation, elementRegion index of the perforated element -reservoirElementSubregion integer_array For each perforation, elementSubRegion index of the perforated element -wellElementIndex integer_array For each perforation, index of the well element -wellSkinFactor real64_array For each perforation, well skin factor -wellTransmissibility real64_array For each perforation, well transmissibility -neighborData node :ref:`DATASTRUCTURE_neighborData` -sets node :ref:`DATASTRUCTURE_sets` -========================= ================================================================= ====================================================================== - - diff --git a/src/docs/sphinx/CompleteXMLSchema.rst b/src/docs/sphinx/CompleteXMLSchema.rst deleted file mode 100644 index a837763309d..00000000000 --- a/src/docs/sphinx/CompleteXMLSchema.rst +++ /dev/null @@ -1,3094 +0,0 @@ -################### -Datastructure Index -################### - -************************ -Input Schema Definitions -************************ - -:download:`XML Schema <../../coreComponents/schema/docs/../schema.xsd>` - - -.. _XML_AcousticElasticSEM: - -Element: AcousticElasticSEM -=========================== -.. include:: ../../coreComponents/schema/docs/AcousticElasticSEM.rst - - -.. _XML_AcousticFirstOrderSEM: - -Element: AcousticFirstOrderSEM -============================== -.. include:: ../../coreComponents/schema/docs/AcousticFirstOrderSEM.rst - - -.. _XML_AcousticSEM: - -Element: AcousticSEM -==================== -.. include:: ../../coreComponents/schema/docs/AcousticSEM.rst - - -.. _XML_AcousticVTISEM: - -Element: AcousticVTISEM -======================= -.. include:: ../../coreComponents/schema/docs/AcousticVTISEM.rst - - -.. _XML_Aquifer: - -Element: Aquifer -================ -.. include:: ../../coreComponents/schema/docs/Aquifer.rst - - -.. _XML_Benchmarks: - -Element: Benchmarks -=================== -.. include:: ../../coreComponents/schema/docs/Benchmarks.rst - - -.. _XML_BiotPorosity: - -Element: BiotPorosity -===================== -.. include:: ../../coreComponents/schema/docs/BiotPorosity.rst - - -.. _XML_BlackOilFluid: - -Element: BlackOilFluid -====================== -.. include:: ../../coreComponents/schema/docs/BlackOilFluid.rst - - -.. _XML_Blueprint: - -Element: Blueprint -================== -.. include:: ../../coreComponents/schema/docs/Blueprint.rst - - -.. _XML_Box: - -Element: Box -============ -.. include:: ../../coreComponents/schema/docs/Box.rst - - -.. _XML_BrooksCoreyBakerRelativePermeability: - -Element: BrooksCoreyBakerRelativePermeability -============================================= -.. include:: ../../coreComponents/schema/docs/BrooksCoreyBakerRelativePermeability.rst - - -.. _XML_BrooksCoreyCapillaryPressure: - -Element: BrooksCoreyCapillaryPressure -===================================== -.. include:: ../../coreComponents/schema/docs/BrooksCoreyCapillaryPressure.rst - - -.. _XML_BrooksCoreyRelativePermeability: - -Element: BrooksCoreyRelativePermeability -======================================== -.. include:: ../../coreComponents/schema/docs/BrooksCoreyRelativePermeability.rst - - -.. _XML_BrooksCoreyStone2RelativePermeability: - -Element: BrooksCoreyStone2RelativePermeability -============================================== -.. include:: ../../coreComponents/schema/docs/BrooksCoreyStone2RelativePermeability.rst - - -.. _XML_CO2BrineEzrokhiFluid: - -Element: CO2BrineEzrokhiFluid -============================= -.. include:: ../../coreComponents/schema/docs/CO2BrineEzrokhiFluid.rst - - -.. _XML_CO2BrineEzrokhiThermalFluid: - -Element: CO2BrineEzrokhiThermalFluid -==================================== -.. include:: ../../coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid.rst - - -.. _XML_CO2BrinePhillipsFluid: - -Element: CO2BrinePhillipsFluid -============================== -.. include:: ../../coreComponents/schema/docs/CO2BrinePhillipsFluid.rst - - -.. _XML_CO2BrinePhillipsThermalFluid: - -Element: CO2BrinePhillipsThermalFluid -===================================== -.. include:: ../../coreComponents/schema/docs/CO2BrinePhillipsThermalFluid.rst - - -.. _XML_CarmanKozenyPermeability: - -Element: CarmanKozenyPermeability -================================= -.. include:: ../../coreComponents/schema/docs/CarmanKozenyPermeability.rst - - -.. _XML_CellElementRegion: - -Element: CellElementRegion -========================== -.. include:: ../../coreComponents/schema/docs/CellElementRegion.rst - - -.. _XML_CellToCellDataCollection: - -Element: CellToCellDataCollection -================================= -.. include:: ../../coreComponents/schema/docs/CellToCellDataCollection.rst - - -.. _XML_CeramicDamage: - -Element: CeramicDamage -====================== -.. include:: ../../coreComponents/schema/docs/CeramicDamage.rst - - -.. _XML_ChomboIO: - -Element: ChomboIO -================= -.. include:: ../../coreComponents/schema/docs/ChomboIO.rst - - -.. _XML_CompositeFunction: - -Element: CompositeFunction -========================== -.. include:: ../../coreComponents/schema/docs/CompositeFunction.rst - - -.. _XML_CompositionalMultiphaseFVM: - -Element: CompositionalMultiphaseFVM -=================================== -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseFVM.rst - - -.. _XML_CompositionalMultiphaseFluid: - -Element: CompositionalMultiphaseFluid -===================================== -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseFluid.rst - - -.. _XML_CompositionalMultiphaseHybridFVM: - -Element: CompositionalMultiphaseHybridFVM -========================================= -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseHybridFVM.rst - - -.. _XML_CompositionalMultiphaseReservoir: - -Element: CompositionalMultiphaseReservoir -========================================= -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseReservoir.rst - - -.. _XML_CompositionalMultiphaseReservoirPoromechanics: - -Element: CompositionalMultiphaseReservoirPoromechanics -====================================================== -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics.rst - - -.. _XML_CompositionalMultiphaseReservoirPoromechanicsInitialization: - -Element: CompositionalMultiphaseReservoirPoromechanicsInitialization -==================================================================== -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization.rst - - -.. _XML_CompositionalMultiphaseStatistics: - -Element: CompositionalMultiphaseStatistics -========================================== -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseStatistics.rst - - -.. _XML_CompositionalMultiphaseWell: - -Element: CompositionalMultiphaseWell -==================================== -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseWell.rst - - -.. _XML_CompositionalTwoPhaseFluid: - -Element: CompositionalTwoPhaseFluid -=================================== -.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluid.rst - - -.. _XML_CompositionalTwoPhaseFluidLohrenzBrayClark: - -Element: CompositionalTwoPhaseFluidLohrenzBrayClark -=================================================== -.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark.rst - - -.. _XML_CompressibleSinglePhaseFluid: - -Element: CompressibleSinglePhaseFluid -===================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSinglePhaseFluid.rst - - -.. _XML_CompressibleSolidCarmanKozenyPermeability: - -Element: CompressibleSolidCarmanKozenyPermeability -================================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidCarmanKozenyPermeability.rst - - -.. _XML_CompressibleSolidConstantPermeability: - -Element: CompressibleSolidConstantPermeability -============================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidConstantPermeability.rst - - -.. _XML_CompressibleSolidExponentialDecayPermeability: - -Element: CompressibleSolidExponentialDecayPermeability -====================================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidExponentialDecayPermeability.rst - - -.. _XML_CompressibleSolidParallelPlatesPermeability: - -Element: CompressibleSolidParallelPlatesPermeability -==================================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability.rst - - -.. _XML_CompressibleSolidPressurePermeability: - -Element: CompressibleSolidPressurePermeability -============================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidPressurePermeability.rst - - -.. _XML_CompressibleSolidSlipDependentPermeability: - -Element: CompressibleSolidSlipDependentPermeability -=================================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidSlipDependentPermeability.rst - - -.. _XML_CompressibleSolidWillisRichardsPermeability: - -Element: CompressibleSolidWillisRichardsPermeability -==================================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidWillisRichardsPermeability.rst - - -.. _XML_ConstantDiffusion: - -Element: ConstantDiffusion -========================== -.. include:: ../../coreComponents/schema/docs/ConstantDiffusion.rst - - -.. _XML_ConstantPermeability: - -Element: ConstantPermeability -============================= -.. include:: ../../coreComponents/schema/docs/ConstantPermeability.rst - - -.. _XML_Constitutive: - -Element: Constitutive -===================== -.. include:: ../../coreComponents/schema/docs/Constitutive.rst - - -.. _XML_Coulomb: - -Element: Coulomb -================ -.. include:: ../../coreComponents/schema/docs/Coulomb.rst - - -.. _XML_CustomPolarObject: - -Element: CustomPolarObject -========================== -.. include:: ../../coreComponents/schema/docs/CustomPolarObject.rst - - -.. _XML_Cylinder: - -Element: Cylinder -================= -.. include:: ../../coreComponents/schema/docs/Cylinder.rst - - -.. _XML_DamageElasticIsotropic: - -Element: DamageElasticIsotropic -=============================== -.. include:: ../../coreComponents/schema/docs/DamageElasticIsotropic.rst - - -.. _XML_DamageSpectralElasticIsotropic: - -Element: DamageSpectralElasticIsotropic -======================================= -.. include:: ../../coreComponents/schema/docs/DamageSpectralElasticIsotropic.rst - - -.. _XML_DamageVolDevElasticIsotropic: - -Element: DamageVolDevElasticIsotropic -===================================== -.. include:: ../../coreComponents/schema/docs/DamageVolDevElasticIsotropic.rst - - -.. _XML_DeadOilFluid: - -Element: DeadOilFluid -===================== -.. include:: ../../coreComponents/schema/docs/DeadOilFluid.rst - - -.. _XML_DelftEgg: - -Element: DelftEgg -================= -.. include:: ../../coreComponents/schema/docs/DelftEgg.rst - - -.. _XML_Dirichlet: - -Element: Dirichlet -================== -.. include:: ../../coreComponents/schema/docs/Dirichlet.rst - - -.. _XML_Disc: - -Element: Disc -============= -.. include:: ../../coreComponents/schema/docs/Disc.rst - - -.. _XML_DruckerPrager: - -Element: DruckerPrager -====================== -.. include:: ../../coreComponents/schema/docs/DruckerPrager.rst - - -.. _XML_ElasticFirstOrderSEM: - -Element: ElasticFirstOrderSEM -============================= -.. include:: ../../coreComponents/schema/docs/ElasticFirstOrderSEM.rst - - -.. _XML_ElasticIsotropic: - -Element: ElasticIsotropic -========================= -.. include:: ../../coreComponents/schema/docs/ElasticIsotropic.rst - - -.. _XML_ElasticIsotropicPressureDependent: - -Element: ElasticIsotropicPressureDependent -========================================== -.. include:: ../../coreComponents/schema/docs/ElasticIsotropicPressureDependent.rst - - -.. _XML_ElasticOrthotropic: - -Element: ElasticOrthotropic -=========================== -.. include:: ../../coreComponents/schema/docs/ElasticOrthotropic.rst - - -.. _XML_ElasticSEM: - -Element: ElasticSEM -=================== -.. include:: ../../coreComponents/schema/docs/ElasticSEM.rst - - -.. _XML_ElasticTransverseIsotropic: - -Element: ElasticTransverseIsotropic -=================================== -.. include:: ../../coreComponents/schema/docs/ElasticTransverseIsotropic.rst - - -.. _XML_ElementRegions: - -Element: ElementRegions -======================= -.. include:: ../../coreComponents/schema/docs/ElementRegions.rst - - -.. _XML_EmbeddedSurfaceGenerator: - -Element: EmbeddedSurfaceGenerator -================================= -.. include:: ../../coreComponents/schema/docs/EmbeddedSurfaceGenerator.rst - - -.. _XML_Events: - -Element: Events -=============== -.. include:: ../../coreComponents/schema/docs/Events.rst - - -.. _XML_ExponentialDecayPermeability: - -Element: ExponentialDecayPermeability -===================================== -.. include:: ../../coreComponents/schema/docs/ExponentialDecayPermeability.rst - - -.. _XML_ExtendedDruckerPrager: - -Element: ExtendedDruckerPrager -============================== -.. include:: ../../coreComponents/schema/docs/ExtendedDruckerPrager.rst - - -.. _XML_FieldSpecification: - -Element: FieldSpecification -=========================== -.. include:: ../../coreComponents/schema/docs/FieldSpecification.rst - - -.. _XML_FieldSpecifications: - -Element: FieldSpecifications -============================ -.. include:: ../../coreComponents/schema/docs/FieldSpecifications.rst - - -.. _XML_File: - -Element: File -============= -.. include:: ../../coreComponents/schema/docs/File.rst - - -.. _XML_FiniteElementSpace: - -Element: FiniteElementSpace -=========================== -.. include:: ../../coreComponents/schema/docs/FiniteElementSpace.rst - - -.. _XML_FiniteElements: - -Element: FiniteElements -======================= -.. include:: ../../coreComponents/schema/docs/FiniteElements.rst - - -.. _XML_FiniteVolume: - -Element: FiniteVolume -===================== -.. include:: ../../coreComponents/schema/docs/FiniteVolume.rst - - -.. _XML_FlowProppantTransport: - -Element: FlowProppantTransport -============================== -.. include:: ../../coreComponents/schema/docs/FlowProppantTransport.rst - - -.. _XML_FrictionlessContact: - -Element: FrictionlessContact -============================ -.. include:: ../../coreComponents/schema/docs/FrictionlessContact.rst - - -.. _XML_Functions: - -Element: Functions -================== -.. include:: ../../coreComponents/schema/docs/Functions.rst - - -.. _XML_Geometry: - -Element: Geometry -================= -.. include:: ../../coreComponents/schema/docs/Geometry.rst - - -.. _XML_HaltEvent: - -Element: HaltEvent -================== -.. include:: ../../coreComponents/schema/docs/HaltEvent.rst - - -.. _XML_HybridMimeticDiscretization: - -Element: HybridMimeticDiscretization -==================================== -.. include:: ../../coreComponents/schema/docs/HybridMimeticDiscretization.rst - - -.. _XML_HydraulicApertureTable: - -Element: HydraulicApertureTable -=============================== -.. include:: ../../coreComponents/schema/docs/HydraulicApertureTable.rst - - -.. _XML_Hydrofracture: - -Element: Hydrofracture -====================== -.. include:: ../../coreComponents/schema/docs/Hydrofracture.rst - - -.. _XML_HydrofractureInitialization: - -Element: HydrofractureInitialization -==================================== -.. include:: ../../coreComponents/schema/docs/HydrofractureInitialization.rst - - -.. _XML_HydrostaticEquilibrium: - -Element: HydrostaticEquilibrium -=============================== -.. include:: ../../coreComponents/schema/docs/HydrostaticEquilibrium.rst - - -.. _XML_Included: - -Element: Included -================= -.. include:: ../../coreComponents/schema/docs/Included.rst - - -.. _XML_InternalMesh: - -Element: InternalMesh -===================== -.. include:: ../../coreComponents/schema/docs/InternalMesh.rst - - -.. _XML_InternalWell: - -Element: InternalWell -===================== -.. include:: ../../coreComponents/schema/docs/InternalWell.rst - - -.. _XML_InternalWellbore: - -Element: InternalWellbore -========================= -.. include:: ../../coreComponents/schema/docs/InternalWellbore.rst - - -.. _XML_JFunctionCapillaryPressure: - -Element: JFunctionCapillaryPressure -=================================== -.. include:: ../../coreComponents/schema/docs/JFunctionCapillaryPressure.rst - - -.. _XML_LaplaceFEM: - -Element: LaplaceFEM -=================== -.. include:: ../../coreComponents/schema/docs/LaplaceFEM.rst - - -.. _XML_LinearIsotropicDispersion: - -Element: LinearIsotropicDispersion -================================== -.. include:: ../../coreComponents/schema/docs/LinearIsotropicDispersion.rst - - -.. _XML_LinearSolverParameters: - -Element: LinearSolverParameters -=============================== -.. include:: ../../coreComponents/schema/docs/LinearSolverParameters.rst - - -.. _XML_Mesh: - -Element: Mesh -============= -.. include:: ../../coreComponents/schema/docs/Mesh.rst - - -.. _XML_ModifiedCamClay: - -Element: ModifiedCamClay -======================== -.. include:: ../../coreComponents/schema/docs/ModifiedCamClay.rst - - -.. _XML_MultiPhaseConstantThermalConductivity: - -Element: MultiPhaseConstantThermalConductivity -============================================== -.. include:: ../../coreComponents/schema/docs/MultiPhaseConstantThermalConductivity.rst - - -.. _XML_MultiPhaseVolumeWeightedThermalConductivity: - -Element: MultiPhaseVolumeWeightedThermalConductivity -==================================================== -.. include:: ../../coreComponents/schema/docs/MultiPhaseVolumeWeightedThermalConductivity.rst - - -.. _XML_MultiphasePoromechanics: - -Element: MultiphasePoromechanics -================================ -.. include:: ../../coreComponents/schema/docs/MultiphasePoromechanics.rst - - -.. _XML_MultiphasePoromechanicsInitialization: - -Element: MultiphasePoromechanicsInitialization -============================================== -.. include:: ../../coreComponents/schema/docs/MultiphasePoromechanicsInitialization.rst - - -.. _XML_MultiphasePoromechanicsReservoir: - -Element: MultiphasePoromechanicsReservoir -========================================= -.. include:: ../../coreComponents/schema/docs/MultiphasePoromechanicsReservoir.rst - - -.. _XML_MultivariableTableFunction: - -Element: MultivariableTableFunction -=================================== -.. include:: ../../coreComponents/schema/docs/MultivariableTableFunction.rst - - -.. _XML_NonlinearSolverParameters: - -Element: NonlinearSolverParameters -================================== -.. include:: ../../coreComponents/schema/docs/NonlinearSolverParameters.rst - - -.. _XML_NullModel: - -Element: NullModel -================== -.. include:: ../../coreComponents/schema/docs/NullModel.rst - - -.. _XML_NumericalMethods: - -Element: NumericalMethods -========================= -.. include:: ../../coreComponents/schema/docs/NumericalMethods.rst - - -.. _XML_Outputs: - -Element: Outputs -================ -.. include:: ../../coreComponents/schema/docs/Outputs.rst - - -.. _XML_PML: - -Element: PML -============ -.. include:: ../../coreComponents/schema/docs/PML.rst - - -.. _XML_PVTDriver: - -Element: PVTDriver -================== -.. include:: ../../coreComponents/schema/docs/PVTDriver.rst - - -.. _XML_PackCollection: - -Element: PackCollection -======================= -.. include:: ../../coreComponents/schema/docs/PackCollection.rst - - -.. _XML_ParallelPlatesPermeability: - -Element: ParallelPlatesPermeability -=================================== -.. include:: ../../coreComponents/schema/docs/ParallelPlatesPermeability.rst - - -.. _XML_Parameter: - -Element: Parameter -================== -.. include:: ../../coreComponents/schema/docs/Parameter.rst - - -.. _XML_Parameters: - -Element: Parameters -=================== -.. include:: ../../coreComponents/schema/docs/Parameters.rst - - -.. _XML_ParticleFluid: - -Element: ParticleFluid -====================== -.. include:: ../../coreComponents/schema/docs/ParticleFluid.rst - - -.. _XML_ParticleMesh: - -Element: ParticleMesh -===================== -.. include:: ../../coreComponents/schema/docs/ParticleMesh.rst - - -.. _XML_ParticleRegion: - -Element: ParticleRegion -======================= -.. include:: ../../coreComponents/schema/docs/ParticleRegion.rst - - -.. _XML_ParticleRegions: - -Element: ParticleRegions -======================== -.. include:: ../../coreComponents/schema/docs/ParticleRegions.rst - - -.. _XML_PerfectlyPlastic: - -Element: PerfectlyPlastic -========================= -.. include:: ../../coreComponents/schema/docs/PerfectlyPlastic.rst - - -.. _XML_Perforation: - -Element: Perforation -==================== -.. include:: ../../coreComponents/schema/docs/Perforation.rst - - -.. _XML_PeriodicEvent: - -Element: PeriodicEvent -====================== -.. include:: ../../coreComponents/schema/docs/PeriodicEvent.rst - - -.. _XML_PhaseFieldDamageFEM: - -Element: PhaseFieldDamageFEM -============================ -.. include:: ../../coreComponents/schema/docs/PhaseFieldDamageFEM.rst - - -.. _XML_PhaseFieldFracture: - -Element: PhaseFieldFracture -=========================== -.. include:: ../../coreComponents/schema/docs/PhaseFieldFracture.rst - - -.. _XML_PorousDamageElasticIsotropic: - -Element: PorousDamageElasticIsotropic -===================================== -.. include:: ../../coreComponents/schema/docs/PorousDamageElasticIsotropic.rst - - -.. _XML_PorousDamageSpectralElasticIsotropic: - -Element: PorousDamageSpectralElasticIsotropic -============================================= -.. include:: ../../coreComponents/schema/docs/PorousDamageSpectralElasticIsotropic.rst - - -.. _XML_PorousDamageVolDevElasticIsotropic: - -Element: PorousDamageVolDevElasticIsotropic -=========================================== -.. include:: ../../coreComponents/schema/docs/PorousDamageVolDevElasticIsotropic.rst - - -.. _XML_PorousDelftEgg: - -Element: PorousDelftEgg -======================= -.. include:: ../../coreComponents/schema/docs/PorousDelftEgg.rst - - -.. _XML_PorousDruckerPrager: - -Element: PorousDruckerPrager -============================ -.. include:: ../../coreComponents/schema/docs/PorousDruckerPrager.rst - - -.. _XML_PorousElasticIsotropic: - -Element: PorousElasticIsotropic -=============================== -.. include:: ../../coreComponents/schema/docs/PorousElasticIsotropic.rst - - -.. _XML_PorousElasticOrthotropic: - -Element: PorousElasticOrthotropic -================================= -.. include:: ../../coreComponents/schema/docs/PorousElasticOrthotropic.rst - - -.. _XML_PorousElasticTransverseIsotropic: - -Element: PorousElasticTransverseIsotropic -========================================= -.. include:: ../../coreComponents/schema/docs/PorousElasticTransverseIsotropic.rst - - -.. _XML_PorousExtendedDruckerPrager: - -Element: PorousExtendedDruckerPrager -==================================== -.. include:: ../../coreComponents/schema/docs/PorousExtendedDruckerPrager.rst - - -.. _XML_PorousModifiedCamClay: - -Element: PorousModifiedCamClay -============================== -.. include:: ../../coreComponents/schema/docs/PorousModifiedCamClay.rst - - -.. _XML_PorousViscoDruckerPrager: - -Element: PorousViscoDruckerPrager -================================= -.. include:: ../../coreComponents/schema/docs/PorousViscoDruckerPrager.rst - - -.. _XML_PorousViscoExtendedDruckerPrager: - -Element: PorousViscoExtendedDruckerPrager -========================================= -.. include:: ../../coreComponents/schema/docs/PorousViscoExtendedDruckerPrager.rst - - -.. _XML_PorousViscoModifiedCamClay: - -Element: PorousViscoModifiedCamClay -=================================== -.. include:: ../../coreComponents/schema/docs/PorousViscoModifiedCamClay.rst - - -.. _XML_PressurePermeability: - -Element: PressurePermeability -============================= -.. include:: ../../coreComponents/schema/docs/PressurePermeability.rst - - -.. _XML_PressurePorosity: - -Element: PressurePorosity -========================= -.. include:: ../../coreComponents/schema/docs/PressurePorosity.rst - - -.. _XML_Problem: - -Element: Problem -================ -.. include:: ../../coreComponents/schema/docs/Problem.rst - - -.. _XML_ProppantPermeability: - -Element: ProppantPermeability -============================= -.. include:: ../../coreComponents/schema/docs/ProppantPermeability.rst - - -.. _XML_ProppantPorosity: - -Element: ProppantPorosity -========================= -.. include:: ../../coreComponents/schema/docs/ProppantPorosity.rst - - -.. _XML_ProppantSlurryFluid: - -Element: ProppantSlurryFluid -============================ -.. include:: ../../coreComponents/schema/docs/ProppantSlurryFluid.rst - - -.. _XML_ProppantSolidProppantPermeability: - -Element: ProppantSolidProppantPermeability -========================================== -.. include:: ../../coreComponents/schema/docs/ProppantSolidProppantPermeability.rst - - -.. _XML_ProppantTransport: - -Element: ProppantTransport -========================== -.. include:: ../../coreComponents/schema/docs/ProppantTransport.rst - - -.. _XML_Python: - -Element: Python -=============== -.. include:: ../../coreComponents/schema/docs/Python.rst - - -.. _XML_ReactiveBrine: - -Element: ReactiveBrine -====================== -.. include:: ../../coreComponents/schema/docs/ReactiveBrine.rst - - -.. _XML_ReactiveBrineThermal: - -Element: ReactiveBrineThermal -============================= -.. include:: ../../coreComponents/schema/docs/ReactiveBrineThermal.rst - - -.. _XML_ReactiveCompositionalMultiphaseOBL: - -Element: ReactiveCompositionalMultiphaseOBL -=========================================== -.. include:: ../../coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL.rst - - -.. _XML_ReactiveFluidDriver: - -Element: ReactiveFluidDriver -============================ -.. include:: ../../coreComponents/schema/docs/ReactiveFluidDriver.rst - - -.. _XML_Rectangle: - -Element: Rectangle -================== -.. include:: ../../coreComponents/schema/docs/Rectangle.rst - - -.. _XML_RelpermDriver: - -Element: RelpermDriver -====================== -.. include:: ../../coreComponents/schema/docs/RelpermDriver.rst - - -.. _XML_Restart: - -Element: Restart -================ -.. include:: ../../coreComponents/schema/docs/Restart.rst - - -.. _XML_Run: - -Element: Run -============ -.. include:: ../../coreComponents/schema/docs/Run.rst - - -.. _XML_SeismicityRate: - -Element: SeismicityRate -======================= -.. include:: ../../coreComponents/schema/docs/SeismicityRate.rst - - -.. _XML_Silo: - -Element: Silo -============= -.. include:: ../../coreComponents/schema/docs/Silo.rst - - -.. _XML_SinglePhaseFVM: - -Element: SinglePhaseFVM -======================= -.. include:: ../../coreComponents/schema/docs/SinglePhaseFVM.rst - - -.. _XML_SinglePhaseHybridFVM: - -Element: SinglePhaseHybridFVM -============================= -.. include:: ../../coreComponents/schema/docs/SinglePhaseHybridFVM.rst - - -.. _XML_SinglePhasePoromechanics: - -Element: SinglePhasePoromechanics -================================= -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanics.rst - - -.. _XML_SinglePhasePoromechanicsConformingFractures: - -Element: SinglePhasePoromechanicsConformingFractures -==================================================== -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures.rst - - -.. _XML_SinglePhasePoromechanicsConformingFracturesInitialization: - -Element: SinglePhasePoromechanicsConformingFracturesInitialization -================================================================== -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization.rst - - -.. _XML_SinglePhasePoromechanicsConformingFracturesReservoir: - -Element: SinglePhasePoromechanicsConformingFracturesReservoir -============================================================= -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir.rst - - -.. _XML_SinglePhasePoromechanicsEmbeddedFractures: - -Element: SinglePhasePoromechanicsEmbeddedFractures -================================================== -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures.rst - - -.. _XML_SinglePhasePoromechanicsEmbeddedFracturesInitialization: - -Element: SinglePhasePoromechanicsEmbeddedFracturesInitialization -================================================================ -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization.rst - - -.. _XML_SinglePhasePoromechanicsInitialization: - -Element: SinglePhasePoromechanicsInitialization -=============================================== -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsInitialization.rst - - -.. _XML_SinglePhasePoromechanicsReservoir: - -Element: SinglePhasePoromechanicsReservoir -========================================== -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsReservoir.rst - - -.. _XML_SinglePhaseProppantFVM: - -Element: SinglePhaseProppantFVM -=============================== -.. include:: ../../coreComponents/schema/docs/SinglePhaseProppantFVM.rst - - -.. _XML_SinglePhaseReservoir: - -Element: SinglePhaseReservoir -============================= -.. include:: ../../coreComponents/schema/docs/SinglePhaseReservoir.rst - - -.. _XML_SinglePhaseReservoirPoromechanics: - -Element: SinglePhaseReservoirPoromechanics -========================================== -.. include:: ../../coreComponents/schema/docs/SinglePhaseReservoirPoromechanics.rst - - -.. _XML_SinglePhaseReservoirPoromechanicsInitialization: - -Element: SinglePhaseReservoirPoromechanicsInitialization -======================================================== -.. include:: ../../coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization.rst - - -.. _XML_SinglePhaseStatistics: - -Element: SinglePhaseStatistics -============================== -.. include:: ../../coreComponents/schema/docs/SinglePhaseStatistics.rst - - -.. _XML_SinglePhaseThermalConductivity: - -Element: SinglePhaseThermalConductivity -======================================= -.. include:: ../../coreComponents/schema/docs/SinglePhaseThermalConductivity.rst - - -.. _XML_SinglePhaseWell: - -Element: SinglePhaseWell -======================== -.. include:: ../../coreComponents/schema/docs/SinglePhaseWell.rst - - -.. _XML_SlipDependentPermeability: - -Element: SlipDependentPermeability -================================== -.. include:: ../../coreComponents/schema/docs/SlipDependentPermeability.rst - - -.. _XML_SolidInternalEnergy: - -Element: SolidInternalEnergy -============================ -.. include:: ../../coreComponents/schema/docs/SolidInternalEnergy.rst - - -.. _XML_SolidMechanicsAugmentedLagrangianContact: - -Element: SolidMechanicsAugmentedLagrangianContact -================================================= -.. include:: ../../coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact.rst - - -.. _XML_SolidMechanicsEmbeddedFractures: - -Element: SolidMechanicsEmbeddedFractures -======================================== -.. include:: ../../coreComponents/schema/docs/SolidMechanicsEmbeddedFractures.rst - - -.. _XML_SolidMechanicsLagrangeContact: - -Element: SolidMechanicsLagrangeContact -====================================== -.. include:: ../../coreComponents/schema/docs/SolidMechanicsLagrangeContact.rst - - -.. _XML_SolidMechanicsLagrangianSSLE: - -Element: SolidMechanicsLagrangianSSLE -===================================== -.. include:: ../../coreComponents/schema/docs/SolidMechanicsLagrangianSSLE.rst - - -.. _XML_SolidMechanicsStateReset: - -Element: SolidMechanicsStateReset -================================= -.. include:: ../../coreComponents/schema/docs/SolidMechanicsStateReset.rst - - -.. _XML_SolidMechanicsStatistics: - -Element: SolidMechanicsStatistics -================================= -.. include:: ../../coreComponents/schema/docs/SolidMechanicsStatistics.rst - - -.. _XML_SolidMechanics_LagrangianFEM: - -Element: SolidMechanics_LagrangianFEM -===================================== -.. include:: ../../coreComponents/schema/docs/SolidMechanics_LagrangianFEM.rst - - -.. _XML_SolidMechanics_MPM: - -Element: SolidMechanics_MPM -=========================== -.. include:: ../../coreComponents/schema/docs/SolidMechanics_MPM.rst - - -.. _XML_SoloEvent: - -Element: SoloEvent -================== -.. include:: ../../coreComponents/schema/docs/SoloEvent.rst - - -.. _XML_Solvers: - -Element: Solvers -================ -.. include:: ../../coreComponents/schema/docs/Solvers.rst - - -.. _XML_SourceFlux: - -Element: SourceFlux -=================== -.. include:: ../../coreComponents/schema/docs/SourceFlux.rst - - -.. _XML_SourceFluxStatistics: - -Element: SourceFluxStatistics -============================= -.. include:: ../../coreComponents/schema/docs/SourceFluxStatistics.rst - - -.. _XML_SurfaceElementRegion: - -Element: SurfaceElementRegion -============================= -.. include:: ../../coreComponents/schema/docs/SurfaceElementRegion.rst - - -.. _XML_SurfaceGenerator: - -Element: SurfaceGenerator -========================= -.. include:: ../../coreComponents/schema/docs/SurfaceGenerator.rst - - -.. _XML_SymbolicFunction: - -Element: SymbolicFunction -========================= -.. include:: ../../coreComponents/schema/docs/SymbolicFunction.rst - - -.. _XML_TableCapillaryPressure: - -Element: TableCapillaryPressure -=============================== -.. include:: ../../coreComponents/schema/docs/TableCapillaryPressure.rst - - -.. _XML_TableFunction: - -Element: TableFunction -====================== -.. include:: ../../coreComponents/schema/docs/TableFunction.rst - - -.. _XML_TableRelativePermeability: - -Element: TableRelativePermeability -================================== -.. include:: ../../coreComponents/schema/docs/TableRelativePermeability.rst - - -.. _XML_TableRelativePermeabilityHysteresis: - -Element: TableRelativePermeabilityHysteresis -============================================ -.. include:: ../../coreComponents/schema/docs/TableRelativePermeabilityHysteresis.rst - - -.. _XML_Tasks: - -Element: Tasks -============== -.. include:: ../../coreComponents/schema/docs/Tasks.rst - - -.. _XML_ThermalCompressibleSinglePhaseFluid: - -Element: ThermalCompressibleSinglePhaseFluid -============================================ -.. include:: ../../coreComponents/schema/docs/ThermalCompressibleSinglePhaseFluid.rst - - -.. _XML_ThickPlane: - -Element: ThickPlane -=================== -.. include:: ../../coreComponents/schema/docs/ThickPlane.rst - - -.. _XML_TimeHistory: - -Element: TimeHistory -==================== -.. include:: ../../coreComponents/schema/docs/TimeHistory.rst - - -.. _XML_Traction: - -Element: Traction -================= -.. include:: ../../coreComponents/schema/docs/Traction.rst - - -.. _XML_TriaxialDriver: - -Element: TriaxialDriver -======================= -.. include:: ../../coreComponents/schema/docs/TriaxialDriver.rst - - -.. _XML_TwoPointFluxApproximation: - -Element: TwoPointFluxApproximation -================================== -.. include:: ../../coreComponents/schema/docs/TwoPointFluxApproximation.rst - - -.. _XML_VTK: - -Element: VTK -============ -.. include:: ../../coreComponents/schema/docs/VTK.rst - - -.. _XML_VTKMesh: - -Element: VTKMesh -================ -.. include:: ../../coreComponents/schema/docs/VTKMesh.rst - - -.. _XML_VTKWell: - -Element: VTKWell -================ -.. include:: ../../coreComponents/schema/docs/VTKWell.rst - - -.. _XML_VanGenuchtenBakerRelativePermeability: - -Element: VanGenuchtenBakerRelativePermeability -============================================== -.. include:: ../../coreComponents/schema/docs/VanGenuchtenBakerRelativePermeability.rst - - -.. _XML_VanGenuchtenCapillaryPressure: - -Element: VanGenuchtenCapillaryPressure -====================================== -.. include:: ../../coreComponents/schema/docs/VanGenuchtenCapillaryPressure.rst - - -.. _XML_VanGenuchtenStone2RelativePermeability: - -Element: VanGenuchtenStone2RelativePermeability -=============================================== -.. include:: ../../coreComponents/schema/docs/VanGenuchtenStone2RelativePermeability.rst - - -.. _XML_ViscoDruckerPrager: - -Element: ViscoDruckerPrager -=========================== -.. include:: ../../coreComponents/schema/docs/ViscoDruckerPrager.rst - - -.. _XML_ViscoExtendedDruckerPrager: - -Element: ViscoExtendedDruckerPrager -=================================== -.. include:: ../../coreComponents/schema/docs/ViscoExtendedDruckerPrager.rst - - -.. _XML_ViscoModifiedCamClay: - -Element: ViscoModifiedCamClay -============================= -.. include:: ../../coreComponents/schema/docs/ViscoModifiedCamClay.rst - - -.. _XML_WellControls: - -Element: WellControls -===================== -.. include:: ../../coreComponents/schema/docs/WellControls.rst - - -.. _XML_WellElementRegion: - -Element: WellElementRegion -========================== -.. include:: ../../coreComponents/schema/docs/WellElementRegion.rst - - -.. _XML_WillisRichardsPermeability: - -Element: WillisRichardsPermeability -=================================== -.. include:: ../../coreComponents/schema/docs/WillisRichardsPermeability.rst - - -.. _XML_crusher: - -Element: crusher -================ -.. include:: ../../coreComponents/schema/docs/crusher.rst - - -.. _XML_lassen: - -Element: lassen -=============== -.. include:: ../../coreComponents/schema/docs/lassen.rst - - -.. _XML_quartz: - -Element: quartz -=============== -.. include:: ../../coreComponents/schema/docs/quartz.rst - -************************* -Datastructure Definitions -************************* - - -.. _DATASTRUCTURE_AcousticElasticSEM: - -Datastructure: AcousticElasticSEM -================================= -.. include:: ../../coreComponents/schema/docs/AcousticElasticSEM_other.rst - - -.. _DATASTRUCTURE_AcousticFirstOrderSEM: - -Datastructure: AcousticFirstOrderSEM -==================================== -.. include:: ../../coreComponents/schema/docs/AcousticFirstOrderSEM_other.rst - - -.. _DATASTRUCTURE_AcousticSEM: - -Datastructure: AcousticSEM -========================== -.. include:: ../../coreComponents/schema/docs/AcousticSEM_other.rst - - -.. _DATASTRUCTURE_AcousticVTISEM: - -Datastructure: AcousticVTISEM -============================= -.. include:: ../../coreComponents/schema/docs/AcousticVTISEM_other.rst - - -.. _DATASTRUCTURE_Aquifer: - -Datastructure: Aquifer -====================== -.. include:: ../../coreComponents/schema/docs/Aquifer_other.rst - - -.. _DATASTRUCTURE_Benchmarks: - -Datastructure: Benchmarks -========================= -.. include:: ../../coreComponents/schema/docs/Benchmarks_other.rst - - -.. _DATASTRUCTURE_BiotPorosity: - -Datastructure: BiotPorosity -=========================== -.. include:: ../../coreComponents/schema/docs/BiotPorosity_other.rst - - -.. _DATASTRUCTURE_BlackOilFluid: - -Datastructure: BlackOilFluid -============================ -.. include:: ../../coreComponents/schema/docs/BlackOilFluid_other.rst - - -.. _DATASTRUCTURE_Blueprint: - -Datastructure: Blueprint -======================== -.. include:: ../../coreComponents/schema/docs/Blueprint_other.rst - - -.. _DATASTRUCTURE_Box: - -Datastructure: Box -================== -.. include:: ../../coreComponents/schema/docs/Box_other.rst - - -.. _DATASTRUCTURE_BrooksCoreyBakerRelativePermeability: - -Datastructure: BrooksCoreyBakerRelativePermeability -=================================================== -.. include:: ../../coreComponents/schema/docs/BrooksCoreyBakerRelativePermeability_other.rst - - -.. _DATASTRUCTURE_BrooksCoreyCapillaryPressure: - -Datastructure: BrooksCoreyCapillaryPressure -=========================================== -.. include:: ../../coreComponents/schema/docs/BrooksCoreyCapillaryPressure_other.rst - - -.. _DATASTRUCTURE_BrooksCoreyRelativePermeability: - -Datastructure: BrooksCoreyRelativePermeability -============================================== -.. include:: ../../coreComponents/schema/docs/BrooksCoreyRelativePermeability_other.rst - - -.. _DATASTRUCTURE_BrooksCoreyStone2RelativePermeability: - -Datastructure: BrooksCoreyStone2RelativePermeability -==================================================== -.. include:: ../../coreComponents/schema/docs/BrooksCoreyStone2RelativePermeability_other.rst - - -.. _DATASTRUCTURE_CO2BrineEzrokhiFluid: - -Datastructure: CO2BrineEzrokhiFluid -=================================== -.. include:: ../../coreComponents/schema/docs/CO2BrineEzrokhiFluid_other.rst - - -.. _DATASTRUCTURE_CO2BrineEzrokhiThermalFluid: - -Datastructure: CO2BrineEzrokhiThermalFluid -========================================== -.. include:: ../../coreComponents/schema/docs/CO2BrineEzrokhiThermalFluid_other.rst - - -.. _DATASTRUCTURE_CO2BrinePhillipsFluid: - -Datastructure: CO2BrinePhillipsFluid -==================================== -.. include:: ../../coreComponents/schema/docs/CO2BrinePhillipsFluid_other.rst - - -.. _DATASTRUCTURE_CO2BrinePhillipsThermalFluid: - -Datastructure: CO2BrinePhillipsThermalFluid -=========================================== -.. include:: ../../coreComponents/schema/docs/CO2BrinePhillipsThermalFluid_other.rst - - -.. _DATASTRUCTURE_CarmanKozenyPermeability: - -Datastructure: CarmanKozenyPermeability -======================================= -.. include:: ../../coreComponents/schema/docs/CarmanKozenyPermeability_other.rst - - -.. _DATASTRUCTURE_CellElementRegion: - -Datastructure: CellElementRegion -================================ -.. include:: ../../coreComponents/schema/docs/CellElementRegion_other.rst - - -.. _DATASTRUCTURE_CellToCellDataCollection: - -Datastructure: CellToCellDataCollection -======================================= -.. include:: ../../coreComponents/schema/docs/CellToCellDataCollection_other.rst - - -.. _DATASTRUCTURE_CeramicDamage: - -Datastructure: CeramicDamage -============================ -.. include:: ../../coreComponents/schema/docs/CeramicDamage_other.rst - - -.. _DATASTRUCTURE_ChomboIO: - -Datastructure: ChomboIO -======================= -.. include:: ../../coreComponents/schema/docs/ChomboIO_other.rst - - -.. _DATASTRUCTURE_CompositeFunction: - -Datastructure: CompositeFunction -================================ -.. include:: ../../coreComponents/schema/docs/CompositeFunction_other.rst - - -.. _DATASTRUCTURE_CompositionalMultiphaseFVM: - -Datastructure: CompositionalMultiphaseFVM -========================================= -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseFVM_other.rst - - -.. _DATASTRUCTURE_CompositionalMultiphaseFluid: - -Datastructure: CompositionalMultiphaseFluid -=========================================== -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseFluid_other.rst - - -.. _DATASTRUCTURE_CompositionalMultiphaseHybridFVM: - -Datastructure: CompositionalMultiphaseHybridFVM -=============================================== -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseHybridFVM_other.rst - - -.. _DATASTRUCTURE_CompositionalMultiphaseReservoir: - -Datastructure: CompositionalMultiphaseReservoir -=============================================== -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseReservoir_other.rst - - -.. _DATASTRUCTURE_CompositionalMultiphaseReservoirPoromechanics: - -Datastructure: CompositionalMultiphaseReservoirPoromechanics -============================================================ -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanics_other.rst - - -.. _DATASTRUCTURE_CompositionalMultiphaseReservoirPoromechanicsInitialization: - -Datastructure: CompositionalMultiphaseReservoirPoromechanicsInitialization -========================================================================== -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseReservoirPoromechanicsInitialization_other.rst - - -.. _DATASTRUCTURE_CompositionalMultiphaseStatistics: - -Datastructure: CompositionalMultiphaseStatistics -================================================ -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseStatistics_other.rst - - -.. _DATASTRUCTURE_CompositionalMultiphaseWell: - -Datastructure: CompositionalMultiphaseWell -========================================== -.. include:: ../../coreComponents/schema/docs/CompositionalMultiphaseWell_other.rst - - -.. _DATASTRUCTURE_CompositionalTwoPhaseFluid: - -Datastructure: CompositionalTwoPhaseFluid -========================================= -.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluid_other.rst - - -.. _DATASTRUCTURE_CompositionalTwoPhaseFluidLohrenzBrayClark: - -Datastructure: CompositionalTwoPhaseFluidLohrenzBrayClark -========================================================= -.. include:: ../../coreComponents/schema/docs/CompositionalTwoPhaseFluidLohrenzBrayClark_other.rst - - -.. _DATASTRUCTURE_CompressibleSinglePhaseFluid: - -Datastructure: CompressibleSinglePhaseFluid -=========================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSinglePhaseFluid_other.rst - - -.. _DATASTRUCTURE_CompressibleSolidCarmanKozenyPermeability: - -Datastructure: CompressibleSolidCarmanKozenyPermeability -======================================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidCarmanKozenyPermeability_other.rst - - -.. _DATASTRUCTURE_CompressibleSolidConstantPermeability: - -Datastructure: CompressibleSolidConstantPermeability -==================================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidConstantPermeability_other.rst - - -.. _DATASTRUCTURE_CompressibleSolidExponentialDecayPermeability: - -Datastructure: CompressibleSolidExponentialDecayPermeability -============================================================ -.. include:: ../../coreComponents/schema/docs/CompressibleSolidExponentialDecayPermeability_other.rst - - -.. _DATASTRUCTURE_CompressibleSolidParallelPlatesPermeability: - -Datastructure: CompressibleSolidParallelPlatesPermeability -========================================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidParallelPlatesPermeability_other.rst - - -.. _DATASTRUCTURE_CompressibleSolidPressurePermeability: - -Datastructure: CompressibleSolidPressurePermeability -==================================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidPressurePermeability_other.rst - - -.. _DATASTRUCTURE_CompressibleSolidSlipDependentPermeability: - -Datastructure: CompressibleSolidSlipDependentPermeability -========================================================= -.. include:: ../../coreComponents/schema/docs/CompressibleSolidSlipDependentPermeability_other.rst - - -.. _DATASTRUCTURE_CompressibleSolidWillisRichardsPermeability: - -Datastructure: CompressibleSolidWillisRichardsPermeability -========================================================== -.. include:: ../../coreComponents/schema/docs/CompressibleSolidWillisRichardsPermeability_other.rst - - -.. _DATASTRUCTURE_ConstantDiffusion: - -Datastructure: ConstantDiffusion -================================ -.. include:: ../../coreComponents/schema/docs/ConstantDiffusion_other.rst - - -.. _DATASTRUCTURE_ConstantPermeability: - -Datastructure: ConstantPermeability -=================================== -.. include:: ../../coreComponents/schema/docs/ConstantPermeability_other.rst - - -.. _DATASTRUCTURE_Constitutive: - -Datastructure: Constitutive -=========================== -.. include:: ../../coreComponents/schema/docs/Constitutive_other.rst - - -.. _DATASTRUCTURE_ConstitutiveModels: - -Datastructure: ConstitutiveModels -================================= -.. include:: ../../coreComponents/schema/docs/ConstitutiveModels_other.rst - - -.. _DATASTRUCTURE_Coulomb: - -Datastructure: Coulomb -====================== -.. include:: ../../coreComponents/schema/docs/Coulomb_other.rst - - -.. _DATASTRUCTURE_CustomPolarObject: - -Datastructure: CustomPolarObject -================================ -.. include:: ../../coreComponents/schema/docs/CustomPolarObject_other.rst - - -.. _DATASTRUCTURE_Cylinder: - -Datastructure: Cylinder -======================= -.. include:: ../../coreComponents/schema/docs/Cylinder_other.rst - - -.. _DATASTRUCTURE_DamageElasticIsotropic: - -Datastructure: DamageElasticIsotropic -===================================== -.. include:: ../../coreComponents/schema/docs/DamageElasticIsotropic_other.rst - - -.. _DATASTRUCTURE_DamageSpectralElasticIsotropic: - -Datastructure: DamageSpectralElasticIsotropic -============================================= -.. include:: ../../coreComponents/schema/docs/DamageSpectralElasticIsotropic_other.rst - - -.. _DATASTRUCTURE_DamageVolDevElasticIsotropic: - -Datastructure: DamageVolDevElasticIsotropic -=========================================== -.. include:: ../../coreComponents/schema/docs/DamageVolDevElasticIsotropic_other.rst - - -.. _DATASTRUCTURE_DeadOilFluid: - -Datastructure: DeadOilFluid -=========================== -.. include:: ../../coreComponents/schema/docs/DeadOilFluid_other.rst - - -.. _DATASTRUCTURE_DelftEgg: - -Datastructure: DelftEgg -======================= -.. include:: ../../coreComponents/schema/docs/DelftEgg_other.rst - - -.. _DATASTRUCTURE_Dirichlet: - -Datastructure: Dirichlet -======================== -.. include:: ../../coreComponents/schema/docs/Dirichlet_other.rst - - -.. _DATASTRUCTURE_Disc: - -Datastructure: Disc -=================== -.. include:: ../../coreComponents/schema/docs/Disc_other.rst - - -.. _DATASTRUCTURE_DruckerPrager: - -Datastructure: DruckerPrager -============================ -.. include:: ../../coreComponents/schema/docs/DruckerPrager_other.rst - - -.. _DATASTRUCTURE_ElasticFirstOrderSEM: - -Datastructure: ElasticFirstOrderSEM -=================================== -.. include:: ../../coreComponents/schema/docs/ElasticFirstOrderSEM_other.rst - - -.. _DATASTRUCTURE_ElasticIsotropic: - -Datastructure: ElasticIsotropic -=============================== -.. include:: ../../coreComponents/schema/docs/ElasticIsotropic_other.rst - - -.. _DATASTRUCTURE_ElasticIsotropicPressureDependent: - -Datastructure: ElasticIsotropicPressureDependent -================================================ -.. include:: ../../coreComponents/schema/docs/ElasticIsotropicPressureDependent_other.rst - - -.. _DATASTRUCTURE_ElasticOrthotropic: - -Datastructure: ElasticOrthotropic -================================= -.. include:: ../../coreComponents/schema/docs/ElasticOrthotropic_other.rst - - -.. _DATASTRUCTURE_ElasticSEM: - -Datastructure: ElasticSEM -========================= -.. include:: ../../coreComponents/schema/docs/ElasticSEM_other.rst - - -.. _DATASTRUCTURE_ElasticTransverseIsotropic: - -Datastructure: ElasticTransverseIsotropic -========================================= -.. include:: ../../coreComponents/schema/docs/ElasticTransverseIsotropic_other.rst - - -.. _DATASTRUCTURE_ElementRegions: - -Datastructure: ElementRegions -============================= -.. include:: ../../coreComponents/schema/docs/ElementRegions_other.rst - - -.. _DATASTRUCTURE_EmbeddedSurfaceGenerator: - -Datastructure: EmbeddedSurfaceGenerator -======================================= -.. include:: ../../coreComponents/schema/docs/EmbeddedSurfaceGenerator_other.rst - - -.. _DATASTRUCTURE_Events: - -Datastructure: Events -===================== -.. include:: ../../coreComponents/schema/docs/Events_other.rst - - -.. _DATASTRUCTURE_ExponentialDecayPermeability: - -Datastructure: ExponentialDecayPermeability -=========================================== -.. include:: ../../coreComponents/schema/docs/ExponentialDecayPermeability_other.rst - - -.. _DATASTRUCTURE_ExtendedDruckerPrager: - -Datastructure: ExtendedDruckerPrager -==================================== -.. include:: ../../coreComponents/schema/docs/ExtendedDruckerPrager_other.rst - - -.. _DATASTRUCTURE_FieldSpecification: - -Datastructure: FieldSpecification -================================= -.. include:: ../../coreComponents/schema/docs/FieldSpecification_other.rst - - -.. _DATASTRUCTURE_FieldSpecifications: - -Datastructure: FieldSpecifications -================================== -.. include:: ../../coreComponents/schema/docs/FieldSpecifications_other.rst - - -.. _DATASTRUCTURE_File: - -Datastructure: File -=================== -.. include:: ../../coreComponents/schema/docs/File_other.rst - - -.. _DATASTRUCTURE_FiniteElementSpace: - -Datastructure: FiniteElementSpace -================================= -.. include:: ../../coreComponents/schema/docs/FiniteElementSpace_other.rst - - -.. _DATASTRUCTURE_FiniteElements: - -Datastructure: FiniteElements -============================= -.. include:: ../../coreComponents/schema/docs/FiniteElements_other.rst - - -.. _DATASTRUCTURE_FiniteVolume: - -Datastructure: FiniteVolume -=========================== -.. include:: ../../coreComponents/schema/docs/FiniteVolume_other.rst - - -.. _DATASTRUCTURE_FlowProppantTransport: - -Datastructure: FlowProppantTransport -==================================== -.. include:: ../../coreComponents/schema/docs/FlowProppantTransport_other.rst - - -.. _DATASTRUCTURE_FrictionlessContact: - -Datastructure: FrictionlessContact -================================== -.. include:: ../../coreComponents/schema/docs/FrictionlessContact_other.rst - - -.. _DATASTRUCTURE_Functions: - -Datastructure: Functions -======================== -.. include:: ../../coreComponents/schema/docs/Functions_other.rst - - -.. _DATASTRUCTURE_Geometry: - -Datastructure: Geometry -======================= -.. include:: ../../coreComponents/schema/docs/Geometry_other.rst - - -.. _DATASTRUCTURE_HaltEvent: - -Datastructure: HaltEvent -======================== -.. include:: ../../coreComponents/schema/docs/HaltEvent_other.rst - - -.. _DATASTRUCTURE_HybridMimeticDiscretization: - -Datastructure: HybridMimeticDiscretization -========================================== -.. include:: ../../coreComponents/schema/docs/HybridMimeticDiscretization_other.rst - - -.. _DATASTRUCTURE_HydraulicApertureTable: - -Datastructure: HydraulicApertureTable -===================================== -.. include:: ../../coreComponents/schema/docs/HydraulicApertureTable_other.rst - - -.. _DATASTRUCTURE_Hydrofracture: - -Datastructure: Hydrofracture -============================ -.. include:: ../../coreComponents/schema/docs/Hydrofracture_other.rst - - -.. _DATASTRUCTURE_HydrofractureInitialization: - -Datastructure: HydrofractureInitialization -========================================== -.. include:: ../../coreComponents/schema/docs/HydrofractureInitialization_other.rst - - -.. _DATASTRUCTURE_HydrostaticEquilibrium: - -Datastructure: HydrostaticEquilibrium -===================================== -.. include:: ../../coreComponents/schema/docs/HydrostaticEquilibrium_other.rst - - -.. _DATASTRUCTURE_Included: - -Datastructure: Included -======================= -.. include:: ../../coreComponents/schema/docs/Included_other.rst - - -.. _DATASTRUCTURE_InternalMesh: - -Datastructure: InternalMesh -=========================== -.. include:: ../../coreComponents/schema/docs/InternalMesh_other.rst - - -.. _DATASTRUCTURE_InternalWell: - -Datastructure: InternalWell -=========================== -.. include:: ../../coreComponents/schema/docs/InternalWell_other.rst - - -.. _DATASTRUCTURE_InternalWellbore: - -Datastructure: InternalWellbore -=============================== -.. include:: ../../coreComponents/schema/docs/InternalWellbore_other.rst - - -.. _DATASTRUCTURE_JFunctionCapillaryPressure: - -Datastructure: JFunctionCapillaryPressure -========================================= -.. include:: ../../coreComponents/schema/docs/JFunctionCapillaryPressure_other.rst - - -.. _DATASTRUCTURE_LaplaceFEM: - -Datastructure: LaplaceFEM -========================= -.. include:: ../../coreComponents/schema/docs/LaplaceFEM_other.rst - - -.. _DATASTRUCTURE_Level0: - -Datastructure: Level0 -===================== -.. include:: ../../coreComponents/schema/docs/Level0_other.rst - - -.. _DATASTRUCTURE_LinearIsotropicDispersion: - -Datastructure: LinearIsotropicDispersion -======================================== -.. include:: ../../coreComponents/schema/docs/LinearIsotropicDispersion_other.rst - - -.. _DATASTRUCTURE_LinearSolverParameters: - -Datastructure: LinearSolverParameters -===================================== -.. include:: ../../coreComponents/schema/docs/LinearSolverParameters_other.rst - - -.. _DATASTRUCTURE_Mesh: - -Datastructure: Mesh -=================== -.. include:: ../../coreComponents/schema/docs/Mesh_other.rst - - -.. _DATASTRUCTURE_MeshBodies: - -Datastructure: MeshBodies -========================= -.. include:: ../../coreComponents/schema/docs/MeshBodies_other.rst - - -.. _DATASTRUCTURE_ModifiedCamClay: - -Datastructure: ModifiedCamClay -============================== -.. include:: ../../coreComponents/schema/docs/ModifiedCamClay_other.rst - - -.. _DATASTRUCTURE_MultiPhaseConstantThermalConductivity: - -Datastructure: MultiPhaseConstantThermalConductivity -==================================================== -.. include:: ../../coreComponents/schema/docs/MultiPhaseConstantThermalConductivity_other.rst - - -.. _DATASTRUCTURE_MultiPhaseVolumeWeightedThermalConductivity: - -Datastructure: MultiPhaseVolumeWeightedThermalConductivity -========================================================== -.. include:: ../../coreComponents/schema/docs/MultiPhaseVolumeWeightedThermalConductivity_other.rst - - -.. _DATASTRUCTURE_MultiphasePoromechanics: - -Datastructure: MultiphasePoromechanics -====================================== -.. include:: ../../coreComponents/schema/docs/MultiphasePoromechanics_other.rst - - -.. _DATASTRUCTURE_MultiphasePoromechanicsInitialization: - -Datastructure: MultiphasePoromechanicsInitialization -==================================================== -.. include:: ../../coreComponents/schema/docs/MultiphasePoromechanicsInitialization_other.rst - - -.. _DATASTRUCTURE_MultiphasePoromechanicsReservoir: - -Datastructure: MultiphasePoromechanicsReservoir -=============================================== -.. include:: ../../coreComponents/schema/docs/MultiphasePoromechanicsReservoir_other.rst - - -.. _DATASTRUCTURE_MultivariableTableFunction: - -Datastructure: MultivariableTableFunction -========================================= -.. include:: ../../coreComponents/schema/docs/MultivariableTableFunction_other.rst - - -.. _DATASTRUCTURE_NonlinearSolverParameters: - -Datastructure: NonlinearSolverParameters -======================================== -.. include:: ../../coreComponents/schema/docs/NonlinearSolverParameters_other.rst - - -.. _DATASTRUCTURE_NullModel: - -Datastructure: NullModel -======================== -.. include:: ../../coreComponents/schema/docs/NullModel_other.rst - - -.. _DATASTRUCTURE_NumericalMethods: - -Datastructure: NumericalMethods -=============================== -.. include:: ../../coreComponents/schema/docs/NumericalMethods_other.rst - - -.. _DATASTRUCTURE_Outputs: - -Datastructure: Outputs -====================== -.. include:: ../../coreComponents/schema/docs/Outputs_other.rst - - -.. _DATASTRUCTURE_PML: - -Datastructure: PML -================== -.. include:: ../../coreComponents/schema/docs/PML_other.rst - - -.. _DATASTRUCTURE_PVTDriver: - -Datastructure: PVTDriver -======================== -.. include:: ../../coreComponents/schema/docs/PVTDriver_other.rst - - -.. _DATASTRUCTURE_PackCollection: - -Datastructure: PackCollection -============================= -.. include:: ../../coreComponents/schema/docs/PackCollection_other.rst - - -.. _DATASTRUCTURE_ParallelPlatesPermeability: - -Datastructure: ParallelPlatesPermeability -========================================= -.. include:: ../../coreComponents/schema/docs/ParallelPlatesPermeability_other.rst - - -.. _DATASTRUCTURE_Parameter: - -Datastructure: Parameter -======================== -.. include:: ../../coreComponents/schema/docs/Parameter_other.rst - - -.. _DATASTRUCTURE_Parameters: - -Datastructure: Parameters -========================= -.. include:: ../../coreComponents/schema/docs/Parameters_other.rst - - -.. _DATASTRUCTURE_ParticleFluid: - -Datastructure: ParticleFluid -============================ -.. include:: ../../coreComponents/schema/docs/ParticleFluid_other.rst - - -.. _DATASTRUCTURE_ParticleMesh: - -Datastructure: ParticleMesh -=========================== -.. include:: ../../coreComponents/schema/docs/ParticleMesh_other.rst - - -.. _DATASTRUCTURE_ParticleRegion: - -Datastructure: ParticleRegion -============================= -.. include:: ../../coreComponents/schema/docs/ParticleRegion_other.rst - - -.. _DATASTRUCTURE_ParticleRegions: - -Datastructure: ParticleRegions -============================== -.. include:: ../../coreComponents/schema/docs/ParticleRegions_other.rst - - -.. _DATASTRUCTURE_PerfectlyPlastic: - -Datastructure: PerfectlyPlastic -=============================== -.. include:: ../../coreComponents/schema/docs/PerfectlyPlastic_other.rst - - -.. _DATASTRUCTURE_Perforation: - -Datastructure: Perforation -========================== -.. include:: ../../coreComponents/schema/docs/Perforation_other.rst - - -.. _DATASTRUCTURE_PeriodicEvent: - -Datastructure: PeriodicEvent -============================ -.. include:: ../../coreComponents/schema/docs/PeriodicEvent_other.rst - - -.. _DATASTRUCTURE_PhaseFieldDamageFEM: - -Datastructure: PhaseFieldDamageFEM -================================== -.. include:: ../../coreComponents/schema/docs/PhaseFieldDamageFEM_other.rst - - -.. _DATASTRUCTURE_PhaseFieldFracture: - -Datastructure: PhaseFieldFracture -================================= -.. include:: ../../coreComponents/schema/docs/PhaseFieldFracture_other.rst - - -.. _DATASTRUCTURE_PorousDamageElasticIsotropic: - -Datastructure: PorousDamageElasticIsotropic -=========================================== -.. include:: ../../coreComponents/schema/docs/PorousDamageElasticIsotropic_other.rst - - -.. _DATASTRUCTURE_PorousDamageSpectralElasticIsotropic: - -Datastructure: PorousDamageSpectralElasticIsotropic -=================================================== -.. include:: ../../coreComponents/schema/docs/PorousDamageSpectralElasticIsotropic_other.rst - - -.. _DATASTRUCTURE_PorousDamageVolDevElasticIsotropic: - -Datastructure: PorousDamageVolDevElasticIsotropic -================================================= -.. include:: ../../coreComponents/schema/docs/PorousDamageVolDevElasticIsotropic_other.rst - - -.. _DATASTRUCTURE_PorousDelftEgg: - -Datastructure: PorousDelftEgg -============================= -.. include:: ../../coreComponents/schema/docs/PorousDelftEgg_other.rst - - -.. _DATASTRUCTURE_PorousDruckerPrager: - -Datastructure: PorousDruckerPrager -================================== -.. include:: ../../coreComponents/schema/docs/PorousDruckerPrager_other.rst - - -.. _DATASTRUCTURE_PorousElasticIsotropic: - -Datastructure: PorousElasticIsotropic -===================================== -.. include:: ../../coreComponents/schema/docs/PorousElasticIsotropic_other.rst - - -.. _DATASTRUCTURE_PorousElasticOrthotropic: - -Datastructure: PorousElasticOrthotropic -======================================= -.. include:: ../../coreComponents/schema/docs/PorousElasticOrthotropic_other.rst - - -.. _DATASTRUCTURE_PorousElasticTransverseIsotropic: - -Datastructure: PorousElasticTransverseIsotropic -=============================================== -.. include:: ../../coreComponents/schema/docs/PorousElasticTransverseIsotropic_other.rst - - -.. _DATASTRUCTURE_PorousExtendedDruckerPrager: - -Datastructure: PorousExtendedDruckerPrager -========================================== -.. include:: ../../coreComponents/schema/docs/PorousExtendedDruckerPrager_other.rst - - -.. _DATASTRUCTURE_PorousModifiedCamClay: - -Datastructure: PorousModifiedCamClay -==================================== -.. include:: ../../coreComponents/schema/docs/PorousModifiedCamClay_other.rst - - -.. _DATASTRUCTURE_PorousViscoDruckerPrager: - -Datastructure: PorousViscoDruckerPrager -======================================= -.. include:: ../../coreComponents/schema/docs/PorousViscoDruckerPrager_other.rst - - -.. _DATASTRUCTURE_PorousViscoExtendedDruckerPrager: - -Datastructure: PorousViscoExtendedDruckerPrager -=============================================== -.. include:: ../../coreComponents/schema/docs/PorousViscoExtendedDruckerPrager_other.rst - - -.. _DATASTRUCTURE_PorousViscoModifiedCamClay: - -Datastructure: PorousViscoModifiedCamClay -========================================= -.. include:: ../../coreComponents/schema/docs/PorousViscoModifiedCamClay_other.rst - - -.. _DATASTRUCTURE_PressurePermeability: - -Datastructure: PressurePermeability -=================================== -.. include:: ../../coreComponents/schema/docs/PressurePermeability_other.rst - - -.. _DATASTRUCTURE_PressurePorosity: - -Datastructure: PressurePorosity -=============================== -.. include:: ../../coreComponents/schema/docs/PressurePorosity_other.rst - - -.. _DATASTRUCTURE_Problem: - -Datastructure: Problem -====================== -.. include:: ../../coreComponents/schema/docs/Problem_other.rst - - -.. _DATASTRUCTURE_ProppantPermeability: - -Datastructure: ProppantPermeability -=================================== -.. include:: ../../coreComponents/schema/docs/ProppantPermeability_other.rst - - -.. _DATASTRUCTURE_ProppantPorosity: - -Datastructure: ProppantPorosity -=============================== -.. include:: ../../coreComponents/schema/docs/ProppantPorosity_other.rst - - -.. _DATASTRUCTURE_ProppantSlurryFluid: - -Datastructure: ProppantSlurryFluid -================================== -.. include:: ../../coreComponents/schema/docs/ProppantSlurryFluid_other.rst - - -.. _DATASTRUCTURE_ProppantSolidProppantPermeability: - -Datastructure: ProppantSolidProppantPermeability -================================================ -.. include:: ../../coreComponents/schema/docs/ProppantSolidProppantPermeability_other.rst - - -.. _DATASTRUCTURE_ProppantTransport: - -Datastructure: ProppantTransport -================================ -.. include:: ../../coreComponents/schema/docs/ProppantTransport_other.rst - - -.. _DATASTRUCTURE_Python: - -Datastructure: Python -===================== -.. include:: ../../coreComponents/schema/docs/Python_other.rst - - -.. _DATASTRUCTURE_ReactiveBrine: - -Datastructure: ReactiveBrine -============================ -.. include:: ../../coreComponents/schema/docs/ReactiveBrine_other.rst - - -.. _DATASTRUCTURE_ReactiveBrineThermal: - -Datastructure: ReactiveBrineThermal -=================================== -.. include:: ../../coreComponents/schema/docs/ReactiveBrineThermal_other.rst - - -.. _DATASTRUCTURE_ReactiveCompositionalMultiphaseOBL: - -Datastructure: ReactiveCompositionalMultiphaseOBL -================================================= -.. include:: ../../coreComponents/schema/docs/ReactiveCompositionalMultiphaseOBL_other.rst - - -.. _DATASTRUCTURE_ReactiveFluidDriver: - -Datastructure: ReactiveFluidDriver -================================== -.. include:: ../../coreComponents/schema/docs/ReactiveFluidDriver_other.rst - - -.. _DATASTRUCTURE_Rectangle: - -Datastructure: Rectangle -======================== -.. include:: ../../coreComponents/schema/docs/Rectangle_other.rst - - -.. _DATASTRUCTURE_RelpermDriver: - -Datastructure: RelpermDriver -============================ -.. include:: ../../coreComponents/schema/docs/RelpermDriver_other.rst - - -.. _DATASTRUCTURE_Restart: - -Datastructure: Restart -====================== -.. include:: ../../coreComponents/schema/docs/Restart_other.rst - - -.. _DATASTRUCTURE_Run: - -Datastructure: Run -================== -.. include:: ../../coreComponents/schema/docs/Run_other.rst - - -.. _DATASTRUCTURE_SeismicityRate: - -Datastructure: SeismicityRate -============================= -.. include:: ../../coreComponents/schema/docs/SeismicityRate_other.rst - - -.. _DATASTRUCTURE_Silo: - -Datastructure: Silo -=================== -.. include:: ../../coreComponents/schema/docs/Silo_other.rst - - -.. _DATASTRUCTURE_SinglePhaseFVM: - -Datastructure: SinglePhaseFVM -============================= -.. include:: ../../coreComponents/schema/docs/SinglePhaseFVM_other.rst - - -.. _DATASTRUCTURE_SinglePhaseHybridFVM: - -Datastructure: SinglePhaseHybridFVM -=================================== -.. include:: ../../coreComponents/schema/docs/SinglePhaseHybridFVM_other.rst - - -.. _DATASTRUCTURE_SinglePhasePoromechanics: - -Datastructure: SinglePhasePoromechanics -======================================= -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanics_other.rst - - -.. _DATASTRUCTURE_SinglePhasePoromechanicsConformingFractures: - -Datastructure: SinglePhasePoromechanicsConformingFractures -========================================================== -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFractures_other.rst - - -.. _DATASTRUCTURE_SinglePhasePoromechanicsConformingFracturesInitialization: - -Datastructure: SinglePhasePoromechanicsConformingFracturesInitialization -======================================================================== -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesInitialization_other.rst - - -.. _DATASTRUCTURE_SinglePhasePoromechanicsConformingFracturesReservoir: - -Datastructure: SinglePhasePoromechanicsConformingFracturesReservoir -=================================================================== -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsConformingFracturesReservoir_other.rst - - -.. _DATASTRUCTURE_SinglePhasePoromechanicsEmbeddedFractures: - -Datastructure: SinglePhasePoromechanicsEmbeddedFractures -======================================================== -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFractures_other.rst - - -.. _DATASTRUCTURE_SinglePhasePoromechanicsEmbeddedFracturesInitialization: - -Datastructure: SinglePhasePoromechanicsEmbeddedFracturesInitialization -====================================================================== -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsEmbeddedFracturesInitialization_other.rst - - -.. _DATASTRUCTURE_SinglePhasePoromechanicsInitialization: - -Datastructure: SinglePhasePoromechanicsInitialization -===================================================== -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsInitialization_other.rst - - -.. _DATASTRUCTURE_SinglePhasePoromechanicsReservoir: - -Datastructure: SinglePhasePoromechanicsReservoir -================================================ -.. include:: ../../coreComponents/schema/docs/SinglePhasePoromechanicsReservoir_other.rst - - -.. _DATASTRUCTURE_SinglePhaseProppantFVM: - -Datastructure: SinglePhaseProppantFVM -===================================== -.. include:: ../../coreComponents/schema/docs/SinglePhaseProppantFVM_other.rst - - -.. _DATASTRUCTURE_SinglePhaseReservoir: - -Datastructure: SinglePhaseReservoir -=================================== -.. include:: ../../coreComponents/schema/docs/SinglePhaseReservoir_other.rst - - -.. _DATASTRUCTURE_SinglePhaseReservoirPoromechanics: - -Datastructure: SinglePhaseReservoirPoromechanics -================================================ -.. include:: ../../coreComponents/schema/docs/SinglePhaseReservoirPoromechanics_other.rst - - -.. _DATASTRUCTURE_SinglePhaseReservoirPoromechanicsInitialization: - -Datastructure: SinglePhaseReservoirPoromechanicsInitialization -============================================================== -.. include:: ../../coreComponents/schema/docs/SinglePhaseReservoirPoromechanicsInitialization_other.rst - - -.. _DATASTRUCTURE_SinglePhaseStatistics: - -Datastructure: SinglePhaseStatistics -==================================== -.. include:: ../../coreComponents/schema/docs/SinglePhaseStatistics_other.rst - - -.. _DATASTRUCTURE_SinglePhaseThermalConductivity: - -Datastructure: SinglePhaseThermalConductivity -============================================= -.. include:: ../../coreComponents/schema/docs/SinglePhaseThermalConductivity_other.rst - - -.. _DATASTRUCTURE_SinglePhaseWell: - -Datastructure: SinglePhaseWell -============================== -.. include:: ../../coreComponents/schema/docs/SinglePhaseWell_other.rst - - -.. _DATASTRUCTURE_SlipDependentPermeability: - -Datastructure: SlipDependentPermeability -======================================== -.. include:: ../../coreComponents/schema/docs/SlipDependentPermeability_other.rst - - -.. _DATASTRUCTURE_SolidInternalEnergy: - -Datastructure: SolidInternalEnergy -================================== -.. include:: ../../coreComponents/schema/docs/SolidInternalEnergy_other.rst - - -.. _DATASTRUCTURE_SolidMechanicsAugmentedLagrangianContact: - -Datastructure: SolidMechanicsAugmentedLagrangianContact -======================================================= -.. include:: ../../coreComponents/schema/docs/SolidMechanicsAugmentedLagrangianContact_other.rst - - -.. _DATASTRUCTURE_SolidMechanicsEmbeddedFractures: - -Datastructure: SolidMechanicsEmbeddedFractures -============================================== -.. include:: ../../coreComponents/schema/docs/SolidMechanicsEmbeddedFractures_other.rst - - -.. _DATASTRUCTURE_SolidMechanicsLagrangeContact: - -Datastructure: SolidMechanicsLagrangeContact -============================================ -.. include:: ../../coreComponents/schema/docs/SolidMechanicsLagrangeContact_other.rst - - -.. _DATASTRUCTURE_SolidMechanicsLagrangianSSLE: - -Datastructure: SolidMechanicsLagrangianSSLE -=========================================== -.. include:: ../../coreComponents/schema/docs/SolidMechanicsLagrangianSSLE_other.rst - - -.. _DATASTRUCTURE_SolidMechanicsStateReset: - -Datastructure: SolidMechanicsStateReset -======================================= -.. include:: ../../coreComponents/schema/docs/SolidMechanicsStateReset_other.rst - - -.. _DATASTRUCTURE_SolidMechanicsStatistics: - -Datastructure: SolidMechanicsStatistics -======================================= -.. include:: ../../coreComponents/schema/docs/SolidMechanicsStatistics_other.rst - - -.. _DATASTRUCTURE_SolidMechanics_LagrangianFEM: - -Datastructure: SolidMechanics_LagrangianFEM -=========================================== -.. include:: ../../coreComponents/schema/docs/SolidMechanics_LagrangianFEM_other.rst - - -.. _DATASTRUCTURE_SolidMechanics_MPM: - -Datastructure: SolidMechanics_MPM -================================= -.. include:: ../../coreComponents/schema/docs/SolidMechanics_MPM_other.rst - - -.. _DATASTRUCTURE_SoloEvent: - -Datastructure: SoloEvent -======================== -.. include:: ../../coreComponents/schema/docs/SoloEvent_other.rst - - -.. _DATASTRUCTURE_SolverStatistics: - -Datastructure: SolverStatistics -=============================== -.. include:: ../../coreComponents/schema/docs/SolverStatistics_other.rst - - -.. _DATASTRUCTURE_Solvers: - -Datastructure: Solvers -====================== -.. include:: ../../coreComponents/schema/docs/Solvers_other.rst - - -.. _DATASTRUCTURE_SourceFlux: - -Datastructure: SourceFlux -========================= -.. include:: ../../coreComponents/schema/docs/SourceFlux_other.rst - - -.. _DATASTRUCTURE_SourceFluxStatistics: - -Datastructure: SourceFluxStatistics -=================================== -.. include:: ../../coreComponents/schema/docs/SourceFluxStatistics_other.rst - - -.. _DATASTRUCTURE_SurfaceElementRegion: - -Datastructure: SurfaceElementRegion -=================================== -.. include:: ../../coreComponents/schema/docs/SurfaceElementRegion_other.rst - - -.. _DATASTRUCTURE_SurfaceGenerator: - -Datastructure: SurfaceGenerator -=============================== -.. include:: ../../coreComponents/schema/docs/SurfaceGenerator_other.rst - - -.. _DATASTRUCTURE_SymbolicFunction: - -Datastructure: SymbolicFunction -=============================== -.. include:: ../../coreComponents/schema/docs/SymbolicFunction_other.rst - - -.. _DATASTRUCTURE_TableCapillaryPressure: - -Datastructure: TableCapillaryPressure -===================================== -.. include:: ../../coreComponents/schema/docs/TableCapillaryPressure_other.rst - - -.. _DATASTRUCTURE_TableFunction: - -Datastructure: TableFunction -============================ -.. include:: ../../coreComponents/schema/docs/TableFunction_other.rst - - -.. _DATASTRUCTURE_TableRelativePermeability: - -Datastructure: TableRelativePermeability -======================================== -.. include:: ../../coreComponents/schema/docs/TableRelativePermeability_other.rst - - -.. _DATASTRUCTURE_TableRelativePermeabilityHysteresis: - -Datastructure: TableRelativePermeabilityHysteresis -================================================== -.. include:: ../../coreComponents/schema/docs/TableRelativePermeabilityHysteresis_other.rst - - -.. _DATASTRUCTURE_Tasks: - -Datastructure: Tasks -==================== -.. include:: ../../coreComponents/schema/docs/Tasks_other.rst - - -.. _DATASTRUCTURE_ThermalCompressibleSinglePhaseFluid: - -Datastructure: ThermalCompressibleSinglePhaseFluid -================================================== -.. include:: ../../coreComponents/schema/docs/ThermalCompressibleSinglePhaseFluid_other.rst - - -.. _DATASTRUCTURE_ThickPlane: - -Datastructure: ThickPlane -========================= -.. include:: ../../coreComponents/schema/docs/ThickPlane_other.rst - - -.. _DATASTRUCTURE_TimeHistory: - -Datastructure: TimeHistory -========================== -.. include:: ../../coreComponents/schema/docs/TimeHistory_other.rst - - -.. _DATASTRUCTURE_Traction: - -Datastructure: Traction -======================= -.. include:: ../../coreComponents/schema/docs/Traction_other.rst - - -.. _DATASTRUCTURE_TriaxialDriver: - -Datastructure: TriaxialDriver -============================= -.. include:: ../../coreComponents/schema/docs/TriaxialDriver_other.rst - - -.. _DATASTRUCTURE_TwoPointFluxApproximation: - -Datastructure: TwoPointFluxApproximation -======================================== -.. include:: ../../coreComponents/schema/docs/TwoPointFluxApproximation_other.rst - - -.. _DATASTRUCTURE_VTK: - -Datastructure: VTK -================== -.. include:: ../../coreComponents/schema/docs/VTK_other.rst - - -.. _DATASTRUCTURE_VTKMesh: - -Datastructure: VTKMesh -====================== -.. include:: ../../coreComponents/schema/docs/VTKMesh_other.rst - - -.. _DATASTRUCTURE_VTKWell: - -Datastructure: VTKWell -====================== -.. include:: ../../coreComponents/schema/docs/VTKWell_other.rst - - -.. _DATASTRUCTURE_VanGenuchtenBakerRelativePermeability: - -Datastructure: VanGenuchtenBakerRelativePermeability -==================================================== -.. include:: ../../coreComponents/schema/docs/VanGenuchtenBakerRelativePermeability_other.rst - - -.. _DATASTRUCTURE_VanGenuchtenCapillaryPressure: - -Datastructure: VanGenuchtenCapillaryPressure -============================================ -.. include:: ../../coreComponents/schema/docs/VanGenuchtenCapillaryPressure_other.rst - - -.. _DATASTRUCTURE_VanGenuchtenStone2RelativePermeability: - -Datastructure: VanGenuchtenStone2RelativePermeability -===================================================== -.. include:: ../../coreComponents/schema/docs/VanGenuchtenStone2RelativePermeability_other.rst - - -.. _DATASTRUCTURE_ViscoDruckerPrager: - -Datastructure: ViscoDruckerPrager -================================= -.. include:: ../../coreComponents/schema/docs/ViscoDruckerPrager_other.rst - - -.. _DATASTRUCTURE_ViscoExtendedDruckerPrager: - -Datastructure: ViscoExtendedDruckerPrager -========================================= -.. include:: ../../coreComponents/schema/docs/ViscoExtendedDruckerPrager_other.rst - - -.. _DATASTRUCTURE_ViscoModifiedCamClay: - -Datastructure: ViscoModifiedCamClay -=================================== -.. include:: ../../coreComponents/schema/docs/ViscoModifiedCamClay_other.rst - - -.. _DATASTRUCTURE_WellControls: - -Datastructure: WellControls -=========================== -.. include:: ../../coreComponents/schema/docs/WellControls_other.rst - - -.. _DATASTRUCTURE_WellElementRegion: - -Datastructure: WellElementRegion -================================ -.. include:: ../../coreComponents/schema/docs/WellElementRegion_other.rst - - -.. _DATASTRUCTURE_WellElementRegionUniqueSubRegion: - -Datastructure: WellElementRegionUniqueSubRegion -=============================================== -.. include:: ../../coreComponents/schema/docs/WellElementRegionUniqueSubRegion_other.rst - - -.. _DATASTRUCTURE_WillisRichardsPermeability: - -Datastructure: WillisRichardsPermeability -========================================= -.. include:: ../../coreComponents/schema/docs/WillisRichardsPermeability_other.rst - - -.. _DATASTRUCTURE_commandLine: - -Datastructure: commandLine -========================== -.. include:: ../../coreComponents/schema/docs/commandLine_other.rst - - -.. _DATASTRUCTURE_crusher: - -Datastructure: crusher -====================== -.. include:: ../../coreComponents/schema/docs/crusher_other.rst - - -.. _DATASTRUCTURE_domain: - -Datastructure: domain -===================== -.. include:: ../../coreComponents/schema/docs/domain_other.rst - - -.. _DATASTRUCTURE_edgeManager: - -Datastructure: edgeManager -========================== -.. include:: ../../coreComponents/schema/docs/edgeManager_other.rst - - -.. _DATASTRUCTURE_elementRegionsGroup: - -Datastructure: elementRegionsGroup -================================== -.. include:: ../../coreComponents/schema/docs/elementRegionsGroup_other.rst - - -.. _DATASTRUCTURE_elementSubRegions: - -Datastructure: elementSubRegions -================================ -.. include:: ../../coreComponents/schema/docs/elementSubRegions_other.rst - - -.. _DATASTRUCTURE_embeddedSurfacesEdgeManager: - -Datastructure: embeddedSurfacesEdgeManager -========================================== -.. include:: ../../coreComponents/schema/docs/embeddedSurfacesEdgeManager_other.rst - - -.. _DATASTRUCTURE_embeddedSurfacesNodeManager: - -Datastructure: embeddedSurfacesNodeManager -========================================== -.. include:: ../../coreComponents/schema/docs/embeddedSurfacesNodeManager_other.rst - - -.. _DATASTRUCTURE_faceManager: - -Datastructure: faceManager -========================== -.. include:: ../../coreComponents/schema/docs/faceManager_other.rst - - -.. _DATASTRUCTURE_lassen: - -Datastructure: lassen -===================== -.. include:: ../../coreComponents/schema/docs/lassen_other.rst - - -.. _DATASTRUCTURE_meshLevels: - -Datastructure: meshLevels -========================= -.. include:: ../../coreComponents/schema/docs/meshLevels_other.rst - - -.. _DATASTRUCTURE_neighborData: - -Datastructure: neighborData -=========================== -.. include:: ../../coreComponents/schema/docs/neighborData_other.rst - - -.. _DATASTRUCTURE_nodeManager: - -Datastructure: nodeManager -========================== -.. include:: ../../coreComponents/schema/docs/nodeManager_other.rst - - -.. _DATASTRUCTURE_particleRegionsGroup: - -Datastructure: particleRegionsGroup -=================================== -.. include:: ../../coreComponents/schema/docs/particleRegionsGroup_other.rst - - -.. _DATASTRUCTURE_particleSubRegions: - -Datastructure: particleSubRegions -================================= -.. include:: ../../coreComponents/schema/docs/particleSubRegions_other.rst - - -.. _DATASTRUCTURE_quartz: - -Datastructure: quartz -===================== -.. include:: ../../coreComponents/schema/docs/quartz_other.rst - - -.. _DATASTRUCTURE_sets: - -Datastructure: sets -=================== -.. include:: ../../coreComponents/schema/docs/sets_other.rst - - -.. _DATASTRUCTURE_wellElementSubRegion: - -Datastructure: wellElementSubRegion -=================================== -.. include:: ../../coreComponents/schema/docs/wellElementSubRegion_other.rst - diff --git a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/mccWellbore/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/mccWellbore/Example.rst index 83ad3e0e8ef..352a17cf1c4 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/mccWellbore/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/wellboreProblems/mccWellbore/Example.rst @@ -115,7 +115,7 @@ Here, Modified Cam-Clay ``ModifiedCamClay`` is used to simulate the elastoplasti The following material parameters should be defined properly to reproduce the analytical example: -.. include:: ../../../../../../../src/coreComponents/schema/docs/ModifiedCamClay.rst +.. include:: /docs/sphinx/datastructure/ModifiedCamClay.rst The constitutive parameters such as the density, the bulk modulus, and the shear modulus are specified in the International System of Units. diff --git a/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst b/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst index 6eab163dc43..1a273cce07a 100644 --- a/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst +++ b/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst @@ -11,7 +11,7 @@ Generating the documentation sudo apt install python-sphinx - Then you can generate the documentation files with the following command + Then you can generate the documentation files with the following commands .. code-block:: sh diff --git a/src/index.rst b/src/index.rst index 46113205346..a912239cb52 100644 --- a/src/index.rst +++ b/src/index.rst @@ -166,7 +166,7 @@ Table of Contents docs/sphinx/buildGuide/Index - docs/sphinx/CompleteXMLSchema + docs/sphinx/datastructure/CompleteXMLSchema docs/sphinx/Contributors From 096aff6424dce3d250be333b4fc77706823a23a0 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Fri, 13 Sep 2024 09:03:20 -1000 Subject: [PATCH 197/286] replace the word explosion with seismic charge (#3354) --- src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp | 2 +- .../elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 450019e5731..05dbc006843 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -1128,7 +1128,7 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, real64 const rhsValue = rhsContributionArrayView[a] / sizeScalingFactor; // scale the contribution by the sizeScalingFactor here! localRhs[massRowIndex] += rhsValue; massProd += rhsValue; - //add the value to the energey balance equation if the flux is positive (i.e., it's a producer) + //add the value to the energy balance equation if the flux is positive (i.e., it's a producer) if( rhsContributionArrayView[a] > 0.0 ) { globalIndex const pressureDofIndex = dofNumber[ei] - rankOffset; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 62f713d01ca..bdae31b1e26 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -93,7 +93,7 @@ ElasticWaveEquationSEM::ElasticWaveEquationSEM( const std::string & name, setSizedFromParent( 0 ). setApplyDefaultValue( { 1.0, 1.0, 1.0, 0.0, 0.0, 0.0 } ). setDescription( "Moment of the source: 6 real values describing a symmetric tensor in Voigt notation." - "The default value is { 1, 1, 1, 0, 0, 0 } (diagonal moment, corresponding to a pure explosion)." ); + "The default value is { 1, 1, 1, 0, 0, 0 } (diagonal moment, corresponding to a seismic charge)." ); registerWrapper( viewKeyStruct::useVtiString(), &m_useVTI ). From 0ba1f36f69a5e4b08f125dbedbceb314e8760470 Mon Sep 17 00:00:00 2001 From: Algiane Froehly Date: Fri, 13 Sep 2024 21:42:36 +0200 Subject: [PATCH 198/286] ci: Time-saving version of PR #3159 that adds Pangea3 job with ppc emulation (#3340) * Add pangea-3 job and emulation step. * Replace relative path in cmake for P3-wave-solver host-config file. * Build wave solver only in Pangea 3 job. * Build Geos executable only in Pangea 3 job. --------- Co-authored-by: Gaetan <159525405+Bubusch@users.noreply.github.com> --- .devcontainer/devcontainer.json | 2 +- .github/workflows/build_and_test.yml | 9 +++++++++ .github/workflows/ci_tests.yml | 20 +++++++++++++++++++ ...3-gcc8.4.1-openmpi-4.1.2-wave-solver.cmake | 13 ++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2-wave-solver.cmake diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 853e17d5191..a3484e12f77 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "280-510" + "GEOS_TPL_TAG": "257-513" } }, "runArgs": [ diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 0f06044f92f..8d6ea27f6d8 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -55,6 +55,9 @@ on: required: false type: string default: '' + HOST_ARCH: + required: false + type: string RUNS_ON: required: true type: string @@ -122,6 +125,12 @@ jobs: - name: Print environment run: printenv + - name: Setup QEMU for ${{ inputs.HOST_ARCH }} emulation + if: ${{ inputs.HOST_ARCH }} + uses: docker/setup-qemu-action@v3 + with: + platforms: ${{ inputs.HOST_ARCH }} + - name: Build, test, deploy. run: | # Those two bash arrays will be populated depending on the required options, diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index f7ce401bb4f..c0a8ff85faa 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -328,6 +328,23 @@ jobs: DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" + - name: Pangea 3 (AlmaLinux 8.8, gcc 9.4.0, open-mpi 4.1.2, cuda 11.5.0, openblas 0.3.10) + BUILD_AND_TEST_CLI_ARGS: "--build-exe-only --no-install-schema" + CMAKE_BUILD_TYPE: Release + BUILD_GENERATOR: "--makefile" + DOCKER_REPOSITORY: geosx/pangea3-almalinux8-gcc9.4-openmpi4.1.2-cuda11.5.0-openblas0.3.18 + HOST_CONFIG: host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2-wave-solver.cmake + ENABLE_HYPRE_DEVICE: CUDA + ENABLE_HYPRE: ON + ENABLE_TRILINOS: OFF + HOST_ARCH: ppc64le + RUNS_ON: streak2 + NPROC: 8 + DOCKER_RUN_ARGS: "--cpus=8 --memory=128g -v /etc/pki/ca-trust/source/anchors/:/etc/pki/ca-trust/source/anchors/llnl:ro" + DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" + DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" + + # Below this line, jobs that deploy to Google Cloud. uses: ./.github/workflows/build_and_test.yml @@ -343,6 +360,9 @@ jobs: ENABLE_HYPRE_DEVICE: ${{ matrix.ENABLE_HYPRE_DEVICE }} ENABLE_HYPRE: ${{ matrix.ENABLE_HYPRE }} ENABLE_TRILINOS: ${{ matrix.ENABLE_TRILINOS }} + GCP_BUCKET: ${{ matrix.GCP_BUCKET }} + HOST_ARCH: ${{ matrix.HOST_ARCH }} + HOST_CONFIG: ${{ matrix.HOST_CONFIG }} NPROC: ${{ matrix.NPROC }} RUNS_ON: ${{ matrix.RUNS_ON }} REQUIRED_LABEL: "ci: run CUDA builds" diff --git a/host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2-wave-solver.cmake b/host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2-wave-solver.cmake new file mode 100644 index 00000000000..46c8080ddb7 --- /dev/null +++ b/host-configs/TOTAL/pangea3-gcc8.4.1-openmpi-4.1.2-wave-solver.cmake @@ -0,0 +1,13 @@ +# hostconfig to build only the wave solver on pangea3 +# +# +include( ${CMAKE_CURRENT_LIST_DIR}/pangea3-gcc8.4.1-openmpi-4.1.2.cmake ) + +set ( GEOS_ENABLE_CONTACT OFF CACHE BOOL "" FORCE ) +set ( GEOS_ENABLE_FLUIDFLOW OFF CACHE BOOL "" FORCE ) +set ( GEOS_ENABLE_INDUCEDSEISMICITY OFF CACHE BOOL "" FORCE ) +set ( GEOS_ENABLE_MULTIPHYSICS OFF CACHE BOOL "" FORCE ) +set ( GEOS_ENABLE_SIMPLEPDE OFF CACHE BOOL "" FORCE ) +set ( GEOS_ENABLE_SOLIDMECHANICS OFF CACHE BOOL "" FORCE ) +set ( GEOS_ENABLE_SURFACEGENERATION OFF CACHE BOOL "" FORCE ) + From b719676674a6f42ed71eb66969529e0898e788db Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Sat, 14 Sep 2024 06:54:53 -1000 Subject: [PATCH 199/286] docs: Add scripts for user/commit stats and update CITATION.cff (#3357) * scripts for user/commit stats * modified repositoryStats_condeseDev.py to output authors in the citation.cff format --- CITATION.cff | 108 +++++++-- scripts/repositoryStats.sh | 36 +++ scripts/repositoryStats_condenseDev.py | 321 +++++++++++++++++++++++++ 3 files changed, 447 insertions(+), 18 deletions(-) create mode 100644 scripts/repositoryStats.sh create mode 100644 scripts/repositoryStats_condenseDev.py diff --git a/CITATION.cff b/CITATION.cff index 2a02e009860..5abaf1f928d 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -6,7 +6,6 @@ authors: orcid: "https://orcid.org/0000-0002-2536-7867" - family-names: "Corbett" given-names: "Benjamin Curtice" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Klevtsov" given-names: "Sergey" orcid: "https://orcid.org/0000-0001-9044-1827" @@ -24,7 +23,6 @@ authors: orcid: "https://orcid.org/0000-0002-6103-4605" - family-names: "Tobin" given-names: "William" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "White" given-names: "Joshua" orcid: "https://orcid.org/0000-0003-3491-142X" @@ -42,7 +40,6 @@ authors: orcid: "https://orcid.org/0000-0002-5380-2563" - family-names: "Han" given-names: "Brian" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Gross" given-names: "Herve" orcid: "https://orcid.org/0000-0002-1747-2018" @@ -51,45 +48,120 @@ authors: orcid: "https://orcid.org/0000-0002-8833-9425" - family-names: "Mazuyer" given-names: "Antoine" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Besset" given-names: "Julien" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Citrain" given-names: "Aurelien" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Vargas" given-names: "Arturo" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Cremon" given-names: "Matthias" orcid: "https://orcid.org/0000-0001-7458-6401" - family-names: "Hao" given-names: "Yue" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Khait" given-names: "Mark" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Lacoste" given-names: "Xavier" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Semnani" given-names: "Shabnam" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Frambati" given-names: "Stefano" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "N'diaye" given-names: "Mamadou" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Nguyen" given-names: "Sy-Tuan" - orcid: "https://orcid.org/0000-0000-0000-0000" - family-names: "Morgan" given-names: "Hannah Mairs" - orcid: "https://orcid.org/0000-0000-0000-0000" +- family-names: "Crook" + given-names: "Cameron Mikel" +- family-names: "Jin" + given-names: "Tao" +- family-names: "Froehly" + given-names: "Algiane" +- family-names: "Homel" + given-names: "Michael" +- family-names: "Magri" + given-names: "Victor Paludetto" +- family-names: "Ju" + given-names: "Isaac" +- family-names: "Rey" + given-names: "Mel" +- family-names: "Povolny" + given-names: "Stefan" +- family-names: "Wu" + given-names: "Hui" +- family-names: "Bui" + given-names: "Quan" +- family-names: "Tang" + given-names: "Hewei" +- family-names: "Camargo" + given-names: "Julia T." +- family-names: "Chourdakis" + given-names: "Gerasimos" +- family-names: "Hui" + given-names: "Wu" +- family-names: "Ren" + given-names: "Guotong" +- family-names: "Yang" + given-names: "Li" +- family-names: "Taeho" + given-names: "Kim" +- family-names: "Waziri" + given-names: "Sohail" +- family-names: "White" + given-names: "Chris" +- family-names: "Fu" + given-names: "Pengcheng" +- family-names: "Lapene" + given-names: "Alexandre" +- family-names: "Thierry" + given-names: "Bertrand" +- family-names: "Fei" + given-names: "Fan" +- family-names: "Meng" + given-names: "Jie" +- family-names: "Untereiner" + given-names: "Lionel" +- family-names: "Raji" + given-names: "Oluwatobi Quadri" +- family-names: "Karimi-Fard" + given-names: "Mohammad" +- family-names: "Fuss" + given-names: "Gaetan" +- family-names: "Huang" + given-names: "Jixian" +- family-names: "Frigo" + given-names: "Matteo" +- family-names: "Martinez" + given-names: "Paloma" +- family-names: "Kachuma" + given-names: "Dickson" +- family-names: "Tomin" + given-names: "Pavel" +- family-names: "Byer" + given-names: "Thomas James" +- family-names: "Ligocki" + given-names: "Terry" +- family-names: "Shovkun" + given-names: "Igor" +- family-names: "Bader" + given-names: "Milad" +- family-names: "Robinson" + given-names: "Peter B." +- family-names: "Hasanzade" + given-names: "Rasim" +- family-names: "Dudes" + given-names: "Arnaud" +- family-names: "Costa" + given-names: "Andre Macieira Braga" +- family-names: "Pellerin" + given-names: "Jeanne" +- family-names: "Aronson" + given-names: "Ryan" +- family-names: "Osei-Kuffuor" + given-names: "Daniel" title: "GEOSX" -version: 0.2.1 -doi: 10.5281/zenodo.7151032 -date-released: 2022-10-06 +version: 1.1.0 +date-released: 2024-09-14 url: "https://github.com/GEOS-DEV/GEOS" diff --git a/scripts/repositoryStats.sh b/scripts/repositoryStats.sh new file mode 100644 index 00000000000..62b6b996909 --- /dev/null +++ b/scripts/repositoryStats.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# This script is used to get the number of line changes with time +# Usage: +# bash repositoryStats.sh +# + +months=`seq 1 12` +years=`seq 2016 2024` + +echo "Month-Year NumDevelopersMonth numDevelopers3MonthWindow NumDevelopersTotal NumCommitsMonth NumCommitsTotal NumLinesInMonth" +for year in $years +do + for month in $months + do + numLines=$(git log --since="$year-$month-01" --until="$year-$month-31" --format= --numstat | awk '{s+=$1; s+=$2} END {print s}') + #numDevelopersMonth=$(git log --since="$year-$month-01" --until="$year-$month-31" --all --pretty="%an" | sort | uniq | tr -d " ' " | xargs python3 repositoryStats_condenseDev.py) + numDevelopersMonth=$(git log --since="$year-$month-01" --until="$year-$month-31" | grep -E 'Author:|Co-authored-by:' | sed 's/^.*: //' | sed 's/<.*//' | sort | uniq | tr -d " ' " | xargs python3 repositoryStats_condenseDev.py) + + minus1month=$(date -j -v-1m -f "%Y-%m-%d" "$year-$month-15" "+%Y-%m-%d") + plus1month=$(date -j -v+1m -f "%Y-%m-%d" "$year-$month-15" "+%Y-%m-%d") + +# echo "Begin: $minus1month End: $plus1month" + + # numDevelopers3Month=$(git log --since="$minus1month" --until="$plus1month" --all --pretty="%an" | sort | uniq | tr -d " ' " | xargs python3 repositoryStats_condenseDev.py) + # numDevelopersTotal=$(git log --since="2010-01-01" --until="$year-$month-31" --all --pretty="%an" | sort | uniq | tr -d " ' " | xargs python3 repositoryStats_condenseDev.py) + numDevelopers3Month=$(git log --since="$minus1month" --until="$plus1month" | grep -E 'Author:|Co-authored-by:' | sed 's/^.*: //' | sed 's/<.*//' | sort | uniq | tr -d " ' " | xargs python3 repositoryStats_condenseDev.py) + numDevelopersTotal=$(git log --since="2010-01-01" --until="$year-$month-31" | grep -E 'Author:|Co-authored-by:' | sed 's/^.*: //' | sed 's/<.*//' | sort | uniq | tr -d " ' " | xargs python3 repositoryStats_condenseDev.py) + + numCommitsMonth=$(git rev-list --count HEAD --since="$year-$month-01" --before="$year-$month-31") + numCommitsTotal=$(git rev-list --count HEAD --since="2010-01-01" --before="$year-$month-31") + echo "$month-$year $numDevelopersMonth $numDevelopers3Month $numDevelopersTotal $numCommitsMonth $numCommitsTotal $numLines" + done +done + + diff --git a/scripts/repositoryStats_condenseDev.py b/scripts/repositoryStats_condenseDev.py new file mode 100644 index 00000000000..3146a5a1412 --- /dev/null +++ b/scripts/repositoryStats_condenseDev.py @@ -0,0 +1,321 @@ +import sys + +# +# git log --since="2010-01-01" --until="2026-11-31" --all --pretty="%an" | sort | uniq | tr -d " ' " | xargs python3 repositoryStats_condenseDev.py +# + +# Define the username mapping dictionary +username_mapping = { +"AleksNovikov" : "aleksnovikov", +"AlexandreLapene" : "alexandrelapene", +"Algiane" : "algiane", +"AlgianeFroehly" : "algianefroehly", +"AmmarAlali" : "ammaralali", +"AndreaBorio" : "andreaborio", +"AndreaFranceschini" : "andreafranceschini", +"AndreCosta" : "andrecosta", +"AndreMacieiraBragaCosta" : "andrecosta", +"andrembcosta" : "andrecosta", +"AntoineMazuyer" : "antoinemazuyer", +"mazuyer" : "antoinemazuyer", +"ArnaudDUDES" : "arnauddudes", +"arng40" : "arnauddudes", +"ArturoVargas" : "arturovargas", +"Aurelien" : "aurelien", +"acitrain" : "aurelien", +"aure-lily" : "aurelily", +"Ben" : "bencorbett", +"BenCorbett" : "bencorbett", +"BenjaminCorbett" : "bencorbett", +"BenjaminCurticeCorbett" : "bencorbett", +"BenjaminT.Liu" : "benjamintliu", +"BertrandThierry" : "bertrandthierry", +"BrianHan" : "brianhan", +"BrianManhHienHan" : "brianhan", +"CameronCrook" : "cameroncrook", +"CameronMikelCrook" : "cameroncrook", +"cmcrook5" : "cameroncrook", +"Castelletto" : "castelletto", +"Castelletto1" : "castelletto", +"NicolaCastelletto" : "castelletto", +"castelletto1" : "castelletto", +"ChaoyiWang" : "chaoyiwang", +"ChristopherSherman" : "christophersherman", +"ChrisWhite" : "chriswhite", +"DanielOsei-Kuffuor" : "danieloseikuffuor", +"david4utd" : "ruiwang", +"DicksonKachuma" : "dicksonkachuma", +"dkachuma" : "dicksonkachuma", +"FrancoisHamon" : "francoishamon", +"francoishamon" : "francoishamon", +"FanFei" : "frankfeifan", +"Fei" : "frankfeifan", +"frankfeifan" : "frankfeifan", +"fanfei" : "frankfeifan", +"fei2" : "frankfeifan", +"Gaetan" : "gaetanfuss", +"GaetanFuss" : "gaetanfuss", +"GerasimosChourdakis" : "gerasimoschourdakis", +"Guotong" : "guotongren", +"GuotongRen" : "guotongren", +"Guotong-Ren" : "guotongren", +"hannah_mairs" : "hannahmairs", +"HerveGross" : "hervegross", +"HeweiTang" : "heweitang", +"HuiWu" : "huiwu", +"IbrahimIsraa" : "ibrahimisraa", +"IgorShovkun" : "igorshovkun", +"IsaacJu" : "isaacju", +"IsaacJu-debug" : "isaacju", +"JacquesFranc" : "jacquesfranc", +"jacques" : "jacquesfranc", +"jacquesn7" : "jacquesfranc", +"jafranc" : "jacquesfranc", +"jfranc" : "jacquesfranc", +"JaisreeIyer" : "jaisreeiyer", +"JamesCorbett" : "jamescorbett", +"jay-a" : "jay-a", +"JeannePellerin" : "jeannepellerin", +"JieMeng" : "jiemeng", +"jiamin.jiang" : "jiaminjiang", +"jiemeng-total" : "jiemeng", +"jhuang2601" : "jianhuang", +"JianHUANG" : "jianhuang", +"JianHuang" : "jianhuang", +"JixiangHuang" : "jixianghuang", +"JoshuaWhite" : "joshuawhite", +"joshua-white" : "joshuawhite", +"joshwhite" : "joshuawhite", +"julia.camargo" : "juliacamargo", +"juliatcamargo" : "juliacamargo", +"BESSETJulien" : "julienrenethomasbesset", +"Julien" : "julienrenethomasbesset", +"JulienReneThomasBesset" : "julienrenethomasbesset", +"KevinJ.Dugan" : "kevinjdugan", +"labesse40" : "julienrenethomasbesset", +"liyangrock" : "liyangrock", +"LionelUntereiner" : "lioneluntereiner", +"LucasVALARCHER" : "lucasvalarcher", +"ŁukaszŁaniewski-Wołłk" : "lukaszlaniewski-wollk", +"MadonnaYoder" : "madonnayoder", +"MamadouN'diaye" : "mamadoundiaye", +"MamadouNdiaye" : "mamadoundiaye", +"mndiaye24" : "mamadoundiaye", +"MarkKhait" : "markkhait", +"mkhait" : "markkhait", +"Cusini" : "matteocusini", +"Matteo" : "matteocusini", +"MatteoCusini" : "matteocusini", +"MatteoFrigo" : "matteofrigo5", +"matteofrigo5" : "matteofrigo5", +"mfrigo" : "matteofrigo5", +"Matthias" : "matthiascremon", +"MatthiasCremon" : "matthiascremon", +"MelReyCG" : "melreycg", +"MichaelHomel" : "michaelhomel", +"MiladBader" : "miladbader", +"MohammadKarimi-Fard" : "mohammadkarimifard", +"OluwatobiQuadriRaji" : "oluwatobiquadri", +"Oluwatobi-PM" : "oluwatobiquadri", +"Ouassim" : "ouassim", +"paloma-martinez" : "palomamartinez", +"PavelTomin" : "paveltomin", +"paveltomin" : "paveltomin", +"PengchengFu" : "pengchengfu", +"PeterB.Robinson" : "peterbrobinson", +"robinspb" : "peterbrobinson", +"PhillipChacon" : "phillipchacon", +"TheLastBlockbender" : "phillipchacon", +"QuanBui" : "quanbui", +"RandolphR.Settgast" : "randolphrsettgast", +"RandolphSettgast" : "randolphrsettgast", +"RandySettgast" : "randolphrsettgast", +"UncrustifyRobot" : "randolphrsettgast", +"dependabot[bot]" : "randolphrsettgast", +"geosadmn" : "randolphrsettgast", +"rasimHZ" : "rasimhz", +"Ron-Wang" : "ronwang", +"rustem.zaydullin@totalenergies.com" : "rustemzaydullin", +"RyanARONSON(X)" : "ryanaronson", +"RyanAronson" : "ryanaronson", +"SergeyKlevtsov" : "sergeyklevtsov", +"Shabnam" : "shabnamjandaghisemnani", +"ShabnamJandaghiSemnani" : "shabnamjandaghisemnani", +"shabnamjs" : "shabnamjandaghisemnani", +"SohailWaziri" : "sohailwaziri", +"sohailwaziri" : "sohailwaziri", +"StefanoFrambati" : "stefanoframbati", +"j0405284" : "stefanoframbati", +"sframba" : "stefanoframbati", +"StefanPovolny" : "stefanpovolny", +"povolny1" : "stefanpovolny", +"stenix" : "stenix", +"Sy-TuanNguyen" : "sytuannguyen", +"sytuannguyen" : "sytuannguyen", +"TaehoKim" : "taehokim", +"kimtaeho07" : "taehokim", +"TaoJin" : "taojin", +"tbeltzun" : "tbeltzun", +"TerryLigocki" : "terryligocki", +"ThomasGAZZOLA" : "thomasgazzola", +"ThomasGazzola" : "thomasgazzola", +"TotoGaz" : "thomasgazzola", +"TomByer" : "tombyer", +"ThomasJamesByer" : "tombyer", +"tjb" : "tombyer", +"tony" : "tony", +"VictorA.P.Magri" : "victorapmagri", +"VictorA.PaludettoMagri" : "victorapmagri", +"WilliamRTobin" : "williamrtobin", +"WilliamTobin" : "williamrtobin", +"wrtobin" : "williamrtobin", +"WuHuiLLNL" : "wuhuillnl", +"XavierLacoste" : "xavierlacoste", +"YohannDudouit" : "yohanndudouit", +"YueHao" : "yuehao" +} + +inverse_username_mapping = { + "aleksnovikov":"Aleks Novikov" , + "alexandrelapene":"Alexandre Lapene" , + "algianefroehly":"Algiane Froehly" , + "ammaralali":"Ammar Alali" , + "andreaborio":"Andrea Borio" , + "andreafranceschini":"Andrea Franceschini" , + "andrecosta":"Andre Macieira Braga Costa" , + "antoinemazuyer":"Antoine Mazuyer" , + "arnauddudes":"Arnaud Dudes" , + "arturovargas":"Arturo Vargas" , + "aurelien":"Aurelien Citrain" , + "aurelily":"aure-lily" , + "bencorbett":"Benjamin Curtice Corbett" , + "benjamintliu":"Benjamin T. Liu" , + "bertrandthierry":"Bertrand Thierry" , + "brianhan":"Brian Manh Hien Han" , + "cameroncrook":"Cameron Mikel Crook" , + "castelletto":"Nicola Castelletto" , + "chaoyiwang":"Chaoyi Wang" , + "christophersherman":"Christopher Sherman" , + "chriswhite":"Chris White" , + "danieloseikuffuor":"Daniel Osei-Kuffuor" , + "ruiwang":"Rui Wang" , + "dicksonkachuma":"Dickson Kachuma" , + "francoishamon":"Francois Hamon" , + "frankfeifan":"Fan Fei" , + "gaetanfuss":"Gaetan Fuss" , + "gerasimoschourdakis":"Gerasimos Chourdakis" , + "guotongren":"Guotong" , + "guotongren":"Guotong Ren" , + "hannahmairs" : "hannah mairs", + "hervegross":"Herve Gross" , + "heweitang":"Hewei Tang" , + "huiwu":"Hui Wu" , + "ibrahimisraa":"Ibrahim Israa" , + "igorshovkun":"Igor Shovkun" , + "isaacju":"Isaac Ju" , + "jacquesfranc":"Jacques Franc" , + "jaisreeiyer":"Jaisree Iyer" , + "jamescorbett":"James Corbett" , + "jay-a":"Jay Appleton" , + "jeannepellerin":"Jeanne Pellerin" , + "jiemeng":"Jie Meng" , + "jiaminjiang":"Jiamin Jiang" , + "jianhuang":"Jian Huang" , + "jixianghuang":"Jixian Huang" , + "joshuawhite":"Joshua White" , + "juliacamargo":"Julia T. Camargo" , + "julienrenethomasbesset":"Julien Rene Thomas Besset" , + "kevinjdugan":"Kevin J. Dugan" , + "kimtaeho07":"Taeho Kim" , + "liyangrock":"Li Yang" , + "lioneluntereiner":"Lionel Untereiner" , + "lucasvalarcher":"Lucas Valarcher" , + "lukaszlaniewski-wollk":"ŁukaszŁaniewski-Wołłk" , + "madonnayoder":"Madonna Yoder" , + "mamadoundiaye":"Mamadou N'diaye" , + "markkhait":"Mark Khait" , + "matteocusini":"Matteo Cusini" , + "matteofrigo5":"Matteo Frigo" , + "matthiascremon":"Matthias Cremon" , + "melreycg":"Mel Rey" , + "michaelhomel":"Michael Homel" , + "miladbader":"Milad Bader" , + "mohammadkarimifard":"Mohammad Karimi-Fard" , + "oluwatobiquadri":"Oluwatobi Quadri Raji" , + "ouassim":"Ouassim Khebzegga" , + "palomamartinez":"Paloma Martinez" , + "paveltomin":"Pavel Tomin" , + "pengchengfu":"Pengcheng Fu" , + "peterbrobinson":"Peter B. Robinson" , + "phillipchacon":"Phillip Chacon" , + "quanbui":"Quan Bui" , + "randolphrsettgast":"Randolph R.Settgast" , + "rasimhz":"Rasim Hasanzade" , + "ronwang":"Ron Wang" , + "rustemzaydullin":"Rustem Zaydullin" , + "ryanaronson":"Ryan Aronson" , + "sergeyklevtsov":"Sergey Klevtsov" , + "shabnamjandaghisemnani":"Shabnam Jandaghi Semnani" , + "sohailwaziri":"Sohail Waziri" , + "stefanoframbati":"Stefano Frambati" , + "stefanpovolny":"Stefan Povolny" , + "stenix":"stenix" , + "sytuannguyen":"Sy-Tuan Nguyen" , + "taehokim":"TaehoKim" , + "taojin":"Tao Jin" , + "tbeltzun":"tbeltzun" , + "terryligocki":"Terry Ligocki" , + "thomasgazzola":"ThomasGazzola" , + "tombyer":"Thomas James Byer" , + "tony":"Tony ?" , + "victorapmagri":"Victor Paludetto Magri" , + "williamrtobin":"William R. Tobin" , + "wuhuillnl":"Wu Hui" , + "xavierlacoste":"Xavier Lacoste" , + "yohanndudouit":"Yohann Dudouit" , + "yuehao":"Yue Hao" +} + +def count_unique_users(usernames): + # Substitute usernames using the username mapping dictionary + #substituted_usernames = [username_mapping.get(username.strip(), username.strip()) for username in usernames] + + # sorted_username_mapping = dict(sorted(username_mapping.items(), key=lambda item: item[1])) + # for key, value in sorted_username_mapping.items(): + # print(f'{key}: {value}') + + substituted_usernames = [] + for username in usernames: + stripped_username = username.strip() + if stripped_username not in username_mapping: + raise ValueError(f"Username '{stripped_username}' not found in username_mapping") + substituted_usernames.append(username_mapping[stripped_username]) + + + # Count the number of unique usernames + unique_usernames = set(substituted_usernames) +# print ("unique_usernames:", sorted(unique_usernames)) + + for username in unique_usernames: +# print( "- username: \"" + username + "\"") + name = inverse_username_mapping[username] + splitName = name.split() + givenNames = " ".join(splitName[:-1]) + lastName = splitName[-1] + print( "- family-names: \"" + lastName + "\"") + print( " given-names: \"" + givenNames + "\"") + + num_unique_users = len(unique_usernames) + return num_unique_users + +# Example usage: +if __name__ == "__main__": + # Read usernames from command line arguments + usernames = sys.argv[1:] + #print ("usernames:", usernames) + + # Count unique users + num_unique_users = count_unique_users(usernames) + + # Output the number of unique users + print(num_unique_users) From 3b5b5a6f2f0a835d8323bab6f1c0eaca0e6f5924 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Sat, 14 Sep 2024 10:21:57 -0700 Subject: [PATCH 200/286] update DOI in CITATION.cff --- CITATION.cff | 1 + 1 file changed, 1 insertion(+) diff --git a/CITATION.cff b/CITATION.cff index 5abaf1f928d..3f4d284506a 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -163,5 +163,6 @@ authors: given-names: "Daniel" title: "GEOSX" version: 1.1.0 +doi: "10.5281/zenodo.7151031" date-released: 2024-09-14 url: "https://github.com/GEOS-DEV/GEOS" From 713046244c75a48eb198b30497c49a190433c88d Mon Sep 17 00:00:00 2001 From: Matteo Frigo <43966286+matteofrigo5@users.noreply.github.com> Date: Tue, 17 Sep 2024 10:53:18 -0700 Subject: [PATCH 201/286] feat: Augmented Lagrangian (slip and open modes) (#3217) * Implementation of slip and open modes for ALM * Adding a new inputFile for ALM and bug (bubble functions) fixed * Bug bubble functions gradient fixed * Adding initial stress contribution for bubble functions - updating lambda functions * Adding nested ALM * Adding simultaneous and nested ALM * Moving the traction update into the friction model * Moved contact constitutive behavior from ALM to the friction law --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + ...rlock-gcc10-ompi4.1.2-openblas0.3.10.cmake | 1 - .../ALM_stickFault_base.xml | 115 ---- inputFiles/almContactMechanics/alm.ats | 19 - .../ALM_PassingCrack_smoke.xml | 55 ++ .../ALM_SimpleCubes_smoke.xml | 58 ++ .../ALM_SingleFracCompression_benchmark.xml | 77 +++ .../ALM_SingleFracCompression_smoke.xml | 77 +++ .../ALM_Sneddon_benchmark.xml | 67 ++ .../ALM_Sneddon_smoke.xml | 67 ++ .../ALM_TFrac_benchmark.xml | 77 +++ .../ALM_TFrac_smoke.xml | 77 +++ .../ALM_UnstructuredCrack_benchmark.xml | 57 ++ .../ALM_UnstructuredCrack_smoke.xml | 58 ++ .../ALM_slippingFault_horizontal_smoke.xml | 55 ++ .../ALM_slippingFault_vertical_smoke.xml | 55 ++ .../ContactMechanics_PassingCrack_smoke.xml | 95 +-- .../ContactMechanics_SimpleCubes_smoke.xml | 76 +-- ...hanics_SingleFracCompression_benchmark.xml | 106 ++- ...tMechanics_SingleFracCompression_smoke.xml | 100 +-- ...=> ContactMechanics_Sneddon_benchmark.xml} | 30 +- ...xml => ContactMechanics_Sneddon_smoke.xml} | 57 +- .../ContactMechanics_TFrac_benchmark.xml | 76 +-- .../ContactMechanics_TFrac_smoke.xml | 33 +- ...tMechanics_UnstructuredCrack_benchmark.xml | 95 +-- ...ntactMechanics_UnstructuredCrack_smoke.xml | 95 +-- .../ContactMechanics_slippingFault_base.xml | 111 --- ...chanics_slippingFault_horizontal_smoke.xml | 174 ++--- ...Mechanics_slippingFault_vertical_smoke.xml | 147 ++-- ...ngCrack_base.xml => PassingCrack_base.xml} | 27 +- .../PassingCrack_smoke.xml | 58 ++ ...pleCubes_base.xml => SimpleCubes_base.xml} | 24 - .../SimpleCubes_smoke.xml | 54 ++ ...ase.xml => SingleFracCompression_base.xml} | 26 - .../SingleFracCompression_benchmark.xml | 75 ++ .../SingleFracCompression_smoke.xml | 75 ++ .../SlippingFault_base.xml | 59 ++ .../SlippingFault_horizontal_smoke.xml | 134 ++++ .../SlippingFault_vertical_smoke.xml} | 55 +- ...actMechanics_base.xml => Sneddon_base.xml} | 7 +- .../Sneddon_benchmark.xml | 34 + .../Sneddon_smoke.xml | 35 + ...echanics_TFrac_base.xml => TFrac_base.xml} | 6 +- .../TFrac_benchmark.xml | 36 + .../TFrac_smoke.xml | 42 ++ ...ck_base.xml => UnstructuredCrack_base.xml} | 24 +- .../UnstructuredCrack_benchmark.xml | 74 ++ .../UnstructuredCrack_smoke.xml | 74 ++ .../contactMechanics.ats | 41 +- .../constitutive/ConstitutivePassThru.hpp | 15 + .../constitutive/contact/CoulombFriction.cpp | 2 +- .../constitutive/contact/CoulombFriction.hpp | 283 +++++++- .../constitutive/contact/FrictionBase.hpp | 74 ++ .../contact/FrictionlessContact.cpp | 2 +- .../contact/FrictionlessContact.hpp | 2 +- .../elementFormulations/LagrangeBasis1.hpp | 127 ++-- .../physicsSolvers/CMakeLists.txt | 3 +- .../physicsSolvers/contact/ContactFields.hpp | 8 +- .../SolidMechanicsALMBubbleKernels.hpp | 41 +- .../contact/SolidMechanicsALMKernels.hpp | 90 +-- .../contact/SolidMechanicsALMKernelsBase.hpp | 178 ++++- .../SolidMechanicsALMSimultaneousKernels.hpp | 435 ++++++++++++ ...lidMechanicsAugmentedLagrangianContact.cpp | 643 ++++++++++++++---- ...lidMechanicsAugmentedLagrangianContact.hpp | 86 ++- .../SolidMechanicsEmbeddedFractures.cpp | 4 +- .../contact/SolidMechanicsLagrangeContact.cpp | 4 +- .../faultMechanics/intersectFrac/Example.rst | 18 +- .../intersectFrac/intersectFracFigure.py | 2 +- .../singleFracCompression/Example.rst | 18 +- .../singleFracCompressionFigure.py | 4 +- .../faultMechanics/sneddon/Example.rst | 15 +- 72 files changed, 3740 insertions(+), 1390 deletions(-) delete mode 100644 inputFiles/almContactMechanics/ALM_stickFault_base.xml delete mode 100644 inputFiles/almContactMechanics/alm.ats create mode 100644 inputFiles/lagrangianContactMechanics/ALM_PassingCrack_smoke.xml create mode 100644 inputFiles/lagrangianContactMechanics/ALM_SimpleCubes_smoke.xml create mode 100644 inputFiles/lagrangianContactMechanics/ALM_SingleFracCompression_benchmark.xml create mode 100644 inputFiles/lagrangianContactMechanics/ALM_SingleFracCompression_smoke.xml create mode 100644 inputFiles/lagrangianContactMechanics/ALM_Sneddon_benchmark.xml create mode 100644 inputFiles/lagrangianContactMechanics/ALM_Sneddon_smoke.xml create mode 100644 inputFiles/lagrangianContactMechanics/ALM_TFrac_benchmark.xml create mode 100644 inputFiles/lagrangianContactMechanics/ALM_TFrac_smoke.xml create mode 100644 inputFiles/lagrangianContactMechanics/ALM_UnstructuredCrack_benchmark.xml create mode 100644 inputFiles/lagrangianContactMechanics/ALM_UnstructuredCrack_smoke.xml create mode 100644 inputFiles/lagrangianContactMechanics/ALM_slippingFault_horizontal_smoke.xml create mode 100644 inputFiles/lagrangianContactMechanics/ALM_slippingFault_vertical_smoke.xml rename inputFiles/lagrangianContactMechanics/{Sneddon_contactMechanics_smoke.xml => ContactMechanics_Sneddon_benchmark.xml} (75%) mode change 100755 => 100644 rename inputFiles/lagrangianContactMechanics/{Sneddon_contactMechanics_benchmark.xml => ContactMechanics_Sneddon_smoke.xml} (58%) mode change 100755 => 100644 delete mode 100644 inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml rename inputFiles/lagrangianContactMechanics/{ContactMechanics_PassingCrack_base.xml => PassingCrack_base.xml} (78%) create mode 100644 inputFiles/lagrangianContactMechanics/PassingCrack_smoke.xml rename inputFiles/lagrangianContactMechanics/{ContactMechanics_SimpleCubes_base.xml => SimpleCubes_base.xml} (81%) create mode 100644 inputFiles/lagrangianContactMechanics/SimpleCubes_smoke.xml rename inputFiles/lagrangianContactMechanics/{ContactMechanics_SingleFracCompression_base.xml => SingleFracCompression_base.xml} (81%) mode change 100755 => 100644 create mode 100644 inputFiles/lagrangianContactMechanics/SingleFracCompression_benchmark.xml create mode 100644 inputFiles/lagrangianContactMechanics/SingleFracCompression_smoke.xml create mode 100644 inputFiles/lagrangianContactMechanics/SlippingFault_base.xml create mode 100644 inputFiles/lagrangianContactMechanics/SlippingFault_horizontal_smoke.xml rename inputFiles/{almContactMechanics/ALM_stickFault_vertical_smoke.xml => lagrangianContactMechanics/SlippingFault_vertical_smoke.xml} (73%) rename inputFiles/lagrangianContactMechanics/{Sneddon_contactMechanics_base.xml => Sneddon_base.xml} (96%) mode change 100755 => 100644 create mode 100644 inputFiles/lagrangianContactMechanics/Sneddon_benchmark.xml create mode 100644 inputFiles/lagrangianContactMechanics/Sneddon_smoke.xml rename inputFiles/lagrangianContactMechanics/{ContactMechanics_TFrac_base.xml => TFrac_base.xml} (97%) create mode 100644 inputFiles/lagrangianContactMechanics/TFrac_benchmark.xml create mode 100644 inputFiles/lagrangianContactMechanics/TFrac_smoke.xml rename inputFiles/lagrangianContactMechanics/{ContactMechanics_UnstructuredCrack_base.xml => UnstructuredCrack_base.xml} (80%) create mode 100644 inputFiles/lagrangianContactMechanics/UnstructuredCrack_benchmark.xml create mode 100644 inputFiles/lagrangianContactMechanics/UnstructuredCrack_smoke.xml create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsALMSimultaneousKernels.hpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 85a23286bf6..53c078f12d0 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3318-7578-14f13e2 + baseline: integratedTests/baseline_integratedTests-pr3217-7661-9b4a604 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 7c26b2ef528..a01e4749868 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3217 (2024-09-16) +====================== +ALM slip and open modes with relative tests. + PR #3318 (2024-09-12) ====================== Modified SeismicityRate poroelastic case. diff --git a/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10.cmake b/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10.cmake index 86013187457..d29b6180e11 100644 --- a/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10.cmake +++ b/host-configs/Stanford/sherlock-gcc10-ompi4.1.2-openblas0.3.10.cmake @@ -40,5 +40,4 @@ set(LAPACK_LIBRARIES "${OPENBLAS_ROOT}/lib/libopenblas.so" CACHE STRING "") set(ENABLE_VALGRIND OFF CACHE BOOL "") set(ENABLE_CALIPER ON CACHE BOOL "") -set(GEOS_TPL_DIR "$ENV{GEOSX_TPL_DIR}" CACHE PATH "" FORCE) include(${CMAKE_CURRENT_LIST_DIR}/../tpls.cmake) diff --git a/inputFiles/almContactMechanics/ALM_stickFault_base.xml b/inputFiles/almContactMechanics/ALM_stickFault_base.xml deleted file mode 100644 index 7a8c79aa7d8..00000000000 --- a/inputFiles/almContactMechanics/ALM_stickFault_base.xml +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/inputFiles/almContactMechanics/alm.ats b/inputFiles/almContactMechanics/alm.ats deleted file mode 100644 index dc6417df533..00000000000 --- a/inputFiles/almContactMechanics/alm.ats +++ /dev/null @@ -1,19 +0,0 @@ -import os -from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests - -restartcheck_params = {} -restartcheck_params["atol"] = 2.0E-4 -restartcheck_params["rtol"] = 1.0E-7 - -decks = [ - TestDeck( - name="ALM_stickFault_vertical_smoke", - description= - "Cube with a vertical fracture (structured grid)", - partitions=((1, 1, 1), (2, 2, 2)), - restart_step=1, - check_step=2, - restartcheck_params=RestartcheckParameters(**restartcheck_params)), -] - -generate_geos_tests(decks) diff --git a/inputFiles/lagrangianContactMechanics/ALM_PassingCrack_smoke.xml b/inputFiles/lagrangianContactMechanics/ALM_PassingCrack_smoke.xml new file mode 100644 index 00000000000..2025d1e4e19 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_PassingCrack_smoke.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ALM_SimpleCubes_smoke.xml b/inputFiles/lagrangianContactMechanics/ALM_SimpleCubes_smoke.xml new file mode 100644 index 00000000000..d0c48b78bdf --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_SimpleCubes_smoke.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ALM_SingleFracCompression_benchmark.xml b/inputFiles/lagrangianContactMechanics/ALM_SingleFracCompression_benchmark.xml new file mode 100644 index 00000000000..2202aa2f739 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_SingleFracCompression_benchmark.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ALM_SingleFracCompression_smoke.xml b/inputFiles/lagrangianContactMechanics/ALM_SingleFracCompression_smoke.xml new file mode 100644 index 00000000000..8b09acbea67 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_SingleFracCompression_smoke.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ALM_Sneddon_benchmark.xml b/inputFiles/lagrangianContactMechanics/ALM_Sneddon_benchmark.xml new file mode 100644 index 00000000000..ba0462cbe05 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_Sneddon_benchmark.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ALM_Sneddon_smoke.xml b/inputFiles/lagrangianContactMechanics/ALM_Sneddon_smoke.xml new file mode 100644 index 00000000000..41c125ef0e5 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_Sneddon_smoke.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ALM_TFrac_benchmark.xml b/inputFiles/lagrangianContactMechanics/ALM_TFrac_benchmark.xml new file mode 100644 index 00000000000..8acc35c09b1 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_TFrac_benchmark.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ALM_TFrac_smoke.xml b/inputFiles/lagrangianContactMechanics/ALM_TFrac_smoke.xml new file mode 100644 index 00000000000..c7a5bf66543 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_TFrac_smoke.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ALM_UnstructuredCrack_benchmark.xml b/inputFiles/lagrangianContactMechanics/ALM_UnstructuredCrack_benchmark.xml new file mode 100644 index 00000000000..4a893d5dc0a --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_UnstructuredCrack_benchmark.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ALM_UnstructuredCrack_smoke.xml b/inputFiles/lagrangianContactMechanics/ALM_UnstructuredCrack_smoke.xml new file mode 100644 index 00000000000..4b230c006ce --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_UnstructuredCrack_smoke.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ALM_slippingFault_horizontal_smoke.xml b/inputFiles/lagrangianContactMechanics/ALM_slippingFault_horizontal_smoke.xml new file mode 100644 index 00000000000..4060a64af2e --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_slippingFault_horizontal_smoke.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ALM_slippingFault_vertical_smoke.xml b/inputFiles/lagrangianContactMechanics/ALM_slippingFault_vertical_smoke.xml new file mode 100644 index 00000000000..7beefc7386d --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/ALM_slippingFault_vertical_smoke.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_smoke.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_smoke.xml index 4ba2c33f6d8..cccc821fc54 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_smoke.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_smoke.xml @@ -3,57 +3,35 @@ + name="./PassingCrack_smoke.xml"/> - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + @@ -61,26 +39,23 @@ name="preFracture" target="/Solvers/SurfaceGen"/> - - - + target="/Outputs/vtkOutput"/> + + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_smoke.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_smoke.xml index 74ef1533500..733a439db2e 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_smoke.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_smoke.xml @@ -3,54 +3,37 @@ + name="./SimpleCubes_smoke.xml"/> + + + + + + - - - - - - - - - - - - - - - - - + + + + + @@ -74,9 +57,6 @@ targetExactTimestep="0" target="/Outputs/restartOutput"/> - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -81,7 +48,6 @@ @@ -90,6 +56,12 @@ timeFrequency="1" targetExactTimestep="0" target="/Outputs/vtkOutput"/> + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_smoke.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_Sneddon_benchmark.xml old mode 100755 new mode 100644 similarity index 75% rename from inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_smoke.xml rename to inputFiles/lagrangianContactMechanics/ContactMechanics_Sneddon_benchmark.xml index e7962f070c1..cefdf59664b --- a/inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_smoke.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_Sneddon_benchmark.xml @@ -3,7 +3,7 @@ + name="./Sneddon_benchmark.xml"/> - - - - - - - + + + + + + name="./Sneddon_smoke.xml"/> - + - - - + - - - - - + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml index 83e9561f2c4..89e2f4854df 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_benchmark.xml @@ -2,60 +2,44 @@ - + - - + + targetRegions="{ Region, Fracture }"> + newtonTol="1.0e-8" + logLevel="2" + maxNumConfigurationAttempts="10" + newtonMaxIter="10" + lineSearchAction="Require" + lineSearchMaxCuts="2" + maxTimeStepCuts="2"/> - + solverType="direct" + directParallel="0" + logLevel="0"/> + + + - - - + + + + + - - - - - - + maxTime="0.2"> @@ -63,7 +47,7 @@ @@ -93,6 +77,12 @@ name="displacementHistoryOutput" timeFrequency="0.2" targetExactTimestep="0" - target="/Outputs/displacementOutput"/> + target="/Outputs/displacementOutput"/> + + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml index b788e0ac183..d3a1a91319c 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_smoke.xml @@ -2,7 +2,7 @@ - + - - - - - - - - - + + + + + + - + name="./UnstructuredCrack_benchmark.xml"/> - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_smoke.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_smoke.xml index 71b7da13653..ea9c2adfe64 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_smoke.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_smoke.xml @@ -1,75 +1,38 @@ - + name="./UnstructuredCrack_smoke.xml"/> - - - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - @@ -90,14 +53,12 @@ targetExactTimestep="0" target="/Outputs/restartOutput"/> - + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml deleted file mode 100644 index 0c5350192c1..00000000000 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_base.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_horizontal_smoke.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_horizontal_smoke.xml index 6b59abebbbf..7584144aec3 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_horizontal_smoke.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_horizontal_smoke.xml @@ -3,132 +3,64 @@ - + - - - - - - - - - - - - - - - - - + + + + + + - + + + + + - + + - + - + - - - - - - - - - - - - - + + + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_vertical_smoke.xml b/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_vertical_smoke.xml index b520f3498c6..9a6ca75ddba 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_vertical_smoke.xml +++ b/inputFiles/lagrangianContactMechanics/ContactMechanics_slippingFault_vertical_smoke.xml @@ -3,107 +3,64 @@ - + - - - + + + + + + - - + + + + + - - - + + - - + - + - + + - - - - - - - - - - - - - - diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_base.xml b/inputFiles/lagrangianContactMechanics/PassingCrack_base.xml similarity index 78% rename from inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_base.xml rename to inputFiles/lagrangianContactMechanics/PassingCrack_base.xml index c309080025d..14ccc3cd8f8 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_PassingCrack_base.xml +++ b/inputFiles/lagrangianContactMechanics/PassingCrack_base.xml @@ -3,22 +3,6 @@ - - - - - - - - @@ -124,9 +103,9 @@ - + diff --git a/inputFiles/lagrangianContactMechanics/PassingCrack_smoke.xml b/inputFiles/lagrangianContactMechanics/PassingCrack_smoke.xml new file mode 100644 index 00000000000..5af8f7534a5 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/PassingCrack_smoke.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml b/inputFiles/lagrangianContactMechanics/SimpleCubes_base.xml similarity index 81% rename from inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml rename to inputFiles/lagrangianContactMechanics/SimpleCubes_base.xml index 690ecf823a3..2098ad04708 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_SimpleCubes_base.xml +++ b/inputFiles/lagrangianContactMechanics/SimpleCubes_base.xml @@ -3,25 +3,6 @@ - - - - - - - - - diff --git a/inputFiles/lagrangianContactMechanics/SimpleCubes_smoke.xml b/inputFiles/lagrangianContactMechanics/SimpleCubes_smoke.xml new file mode 100644 index 00000000000..157f01ceda1 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/SimpleCubes_smoke.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml b/inputFiles/lagrangianContactMechanics/SingleFracCompression_base.xml old mode 100755 new mode 100644 similarity index 81% rename from inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml rename to inputFiles/lagrangianContactMechanics/SingleFracCompression_base.xml index 28b80df0368..2da12a025df --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml +++ b/inputFiles/lagrangianContactMechanics/SingleFracCompression_base.xml @@ -4,27 +4,6 @@ - - - - - - - - - diff --git a/inputFiles/lagrangianContactMechanics/SingleFracCompression_benchmark.xml b/inputFiles/lagrangianContactMechanics/SingleFracCompression_benchmark.xml new file mode 100644 index 00000000000..346528e4bea --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/SingleFracCompression_benchmark.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/SingleFracCompression_smoke.xml b/inputFiles/lagrangianContactMechanics/SingleFracCompression_smoke.xml new file mode 100644 index 00000000000..a724d175616 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/SingleFracCompression_smoke.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/SlippingFault_base.xml b/inputFiles/lagrangianContactMechanics/SlippingFault_base.xml new file mode 100644 index 00000000000..5299794fe0f --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/SlippingFault_base.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/SlippingFault_horizontal_smoke.xml b/inputFiles/lagrangianContactMechanics/SlippingFault_horizontal_smoke.xml new file mode 100644 index 00000000000..2d81f9a0593 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/SlippingFault_horizontal_smoke.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/almContactMechanics/ALM_stickFault_vertical_smoke.xml b/inputFiles/lagrangianContactMechanics/SlippingFault_vertical_smoke.xml similarity index 73% rename from inputFiles/almContactMechanics/ALM_stickFault_vertical_smoke.xml rename to inputFiles/lagrangianContactMechanics/SlippingFault_vertical_smoke.xml index 4eb31ff467b..8c70450485d 100644 --- a/inputFiles/almContactMechanics/ALM_stickFault_vertical_smoke.xml +++ b/inputFiles/lagrangianContactMechanics/SlippingFault_vertical_smoke.xml @@ -3,19 +3,19 @@ - + @@ -26,7 +26,7 @@ origin="{0.0, 0.0, 0.0}" lengthVector="{0.0, 1.0, 0.0}" widthVector="{0.0, 0.0, 1.0}" - dimensions="{ 500, 200 }"/> + dimensions="{ 180, 10 }"/> + dimensions="{ 180, 10 }"/> @@ -56,20 +56,20 @@ scale="1"/> + setNames="{ xneg }"/> + setNames="{ yneg, ypos, xneg, xpos }"/> + setNames="{ zneg, zpos }"/> - + scale="-4.25e6"/> - + plotFileRoot="faultSlip_vertical"/> - + name="restartOutput"/> + diff --git a/inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_base.xml b/inputFiles/lagrangianContactMechanics/Sneddon_base.xml old mode 100755 new mode 100644 similarity index 96% rename from inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_base.xml rename to inputFiles/lagrangianContactMechanics/Sneddon_base.xml index 64b949a396e..b4d2d0a3a22 --- a/inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_base.xml +++ b/inputFiles/lagrangianContactMechanics/Sneddon_base.xml @@ -27,11 +27,6 @@ name="FE1" order="1"/> - - - - @@ -114,7 +109,7 @@ setNames="{ core }"/> - + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/Sneddon_smoke.xml b/inputFiles/lagrangianContactMechanics/Sneddon_smoke.xml new file mode 100644 index 00000000000..5e64b204ad1 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/Sneddon_smoke.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml b/inputFiles/lagrangianContactMechanics/TFrac_base.xml similarity index 97% rename from inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml rename to inputFiles/lagrangianContactMechanics/TFrac_base.xml index d8d82afdd12..9c3a4f54cdd 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml +++ b/inputFiles/lagrangianContactMechanics/TFrac_base.xml @@ -43,11 +43,6 @@ name="FE1" order="1"/> - - - - @@ -159,6 +154,7 @@ inputVarNames="{ time }" coordinates="{ 0.0, 1.0 }" values="{ 0.0, 1.e0 }"/> + diff --git a/inputFiles/lagrangianContactMechanics/TFrac_benchmark.xml b/inputFiles/lagrangianContactMechanics/TFrac_benchmark.xml new file mode 100644 index 00000000000..60f1a1f537a --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/TFrac_benchmark.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/TFrac_smoke.xml b/inputFiles/lagrangianContactMechanics/TFrac_smoke.xml new file mode 100644 index 00000000000..5ab56b69af9 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/TFrac_smoke.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_base.xml b/inputFiles/lagrangianContactMechanics/UnstructuredCrack_base.xml similarity index 80% rename from inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_base.xml rename to inputFiles/lagrangianContactMechanics/UnstructuredCrack_base.xml index 4c4c2bb1379..b8de0e0eaea 100644 --- a/inputFiles/lagrangianContactMechanics/ContactMechanics_UnstructuredCrack_base.xml +++ b/inputFiles/lagrangianContactMechanics/UnstructuredCrack_base.xml @@ -3,23 +3,6 @@ - - - - - - - - - @@ -136,7 +114,7 @@ name="ForceTimeFunction" inputVarNames="{ time }" coordinates="{ 0.0, 2.0 }" - values="{ 0.0, 2.e0 }"/> + values="{ 0.0, 2.e0 }"/> diff --git a/inputFiles/lagrangianContactMechanics/UnstructuredCrack_benchmark.xml b/inputFiles/lagrangianContactMechanics/UnstructuredCrack_benchmark.xml new file mode 100644 index 00000000000..bb32766c947 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/UnstructuredCrack_benchmark.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/UnstructuredCrack_smoke.xml b/inputFiles/lagrangianContactMechanics/UnstructuredCrack_smoke.xml new file mode 100644 index 00000000000..faf2455cbf1 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/UnstructuredCrack_smoke.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/contactMechanics.ats b/inputFiles/lagrangianContactMechanics/contactMechanics.ats index b522d942a63..bc4a2e43d0e 100644 --- a/inputFiles/lagrangianContactMechanics/contactMechanics.ats +++ b/inputFiles/lagrangianContactMechanics/contactMechanics.ats @@ -21,7 +21,7 @@ decks = [ check_step=2, restartcheck_params=RestartcheckParameters(**restartcheck_params)), TestDeck( - name="Sneddon_contactMechanics_smoke", + name="ContactMechanics_Sneddon_smoke", description= "Testing Sneddon problem using contact mechanics (structured grid)", partitions=((1, 1, 1), ), @@ -51,6 +51,45 @@ decks = [ partitions=((1, 1, 1), (2, 1, 1)), restart_step=5, check_step=10, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="ALM_SimpleCubes_smoke", + description= + "Two cubes with a fracture separating them (structured grid)", + partitions=((1, 1, 1), (2, 2, 2), (1, 3, 3)), + restart_step=10, + check_step=20, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="ALM_UnstructuredCrack_smoke", + description="A thick plane with a crack in it (unstructured grid)", + partitions=((1, 1, 1), ), + restart_step=1, + check_step=2, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="ALM_Sneddon_smoke", + description= + "Testing Sneddon problem using contact mechanics (structured grid)", + partitions=((1, 1, 1), ), + restart_step=1, + check_step=2, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="ALM_TFrac_smoke", + description= + "Two fractures intersecting at a right angle (structured grid)", + partitions=((1, 1, 1), (2, 2, 1)), + restart_step=1, + check_step=2, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="ALM_SingleFracCompression_smoke", + description= + "Single tilted fracture subjected to remote compression (unstructured grid)", + partitions=((1, 1, 1), ), + restart_step=1, + check_step=2, restartcheck_params=RestartcheckParameters(**restartcheck_params)) ] diff --git a/src/coreComponents/constitutive/ConstitutivePassThru.hpp b/src/coreComponents/constitutive/ConstitutivePassThru.hpp index bef43e6e7ce..decabffbb6a 100644 --- a/src/coreComponents/constitutive/ConstitutivePassThru.hpp +++ b/src/coreComponents/constitutive/ConstitutivePassThru.hpp @@ -49,6 +49,7 @@ #include "permeability/ProppantPermeability.hpp" #include "permeability/SlipDependentPermeability.hpp" #include "permeability/WillisRichardsPermeability.hpp" +#include "contact/CoulombFriction.hpp" namespace geos @@ -83,6 +84,20 @@ struct ConstitutivePassThru< ElasticIsotropic > } }; +/** + * Specialization for models that derive from CoulombFriction. + */ +template<> +struct ConstitutivePassThru< CoulombFriction > +{ + template< typename LAMBDA > + static + void execute( ConstitutiveBase & constitutiveRelation, LAMBDA && lambda ) + { + ConstitutivePassThruHandler< CoulombFriction >::execute( constitutiveRelation, + std::forward< LAMBDA >( lambda ) ); + } +}; /** * Specialization for models that derive from SolidBase. diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.cpp b/src/coreComponents/constitutive/contact/CoulombFriction.cpp index 32a5ee4f765..1199f652d7e 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.cpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.cpp @@ -73,7 +73,7 @@ void CoulombFriction::allocateConstitutiveData( Group & parent, } -CoulombFrictionUpdates CoulombFriction::createKernelWrapper() const +CoulombFrictionUpdates CoulombFriction::createKernelUpdates() const { return CoulombFrictionUpdates( m_displacementJumpThreshold, m_shearStiffness, diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.hpp b/src/coreComponents/constitutive/contact/CoulombFriction.hpp index 02c56ed0926..2ed7d182536 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.hpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.hpp @@ -90,6 +90,41 @@ class CoulombFrictionUpdates : public FrictionBaseUpdates arraySlice1d< real64 const > const & tractionVector, integer & fractureState ) const override final; + GEOS_HOST_DEVICE + inline + virtual void updateTraction( arraySlice1d< real64 const > const & oldDispJump, + arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & penalty, + arraySlice1d< real64 const > const & traction, + bool const symmetric, + bool const fixedLimitTau, + real64 const normalTractionTolerance, + real64 const tangentialTractionTolerance, + real64 ( &dTraction_dDispJump )[3][3], + real64 ( &tractionNew )[3], + integer & fractureState ) const override final; + + + GEOS_HOST_DEVICE + inline + virtual void updateTractionOnly( arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & deltaDispJump, + arraySlice1d< real64 const > const & penalty, + arraySlice1d< real64 const > const & traction, + arraySlice1d< real64 > const & tractionNew ) const override final; + + GEOS_HOST_DEVICE + inline + virtual void constraintCheck( arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & deltaDispJump, + arraySlice1d< real64 > const & tractionVector, + integer const fractureState, + real64 const normalTractionTolerance, + real64 const normalDisplacementTolerance, + real64 const slidingTolerance, + real64 const slidingCheckTolerance, + integer & condConv ) const override final; + private: /// The shear stiffness real64 m_shearStiffness; @@ -155,7 +190,7 @@ class CoulombFriction : public FrictionBase * @brief Create an update kernel wrapper. * @return the wrapper */ - KernelWrapper createKernelWrapper() const; + KernelWrapper createKernelUpdates() const; protected: @@ -302,6 +337,252 @@ inline void CoulombFrictionUpdates::updateFractureState( localIndex const k, } } +GEOS_HOST_DEVICE +inline void CoulombFrictionUpdates::updateTraction( arraySlice1d< real64 const > const & oldDispJump, + arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & penalty, + arraySlice1d< real64 const > const & traction, + bool const symmetric, + bool const fixedLimitTau, + real64 const normalTractionTolerance, + real64 const tangentialTractionTolerance, + real64 ( & dTraction_dDispJump )[3][3], + real64 ( & tractionNew ) [3], + integer & fractureState ) const +{ + + using namespace fields::contact; + + real64 dLimitTangentialTractionNorm_dTraction = 0.0; + real64 limitTau = 0.0; + + // Compute the trial traction + real64 tractionTrial[ 3 ]; + tractionTrial[ 0 ] = traction[0] + penalty[0] * dispJump[0]; + tractionTrial[ 1 ] = traction[1] + penalty[1] * (dispJump[1] - oldDispJump[1]); + tractionTrial[ 2 ] = traction[2] + penalty[1] * (dispJump[2] - oldDispJump[2]); + + // Compute tangential trial traction norm + real64 const tau[2] = { tractionTrial[1], + tractionTrial[2] }; + real64 const tractionTrialNorm = LvArray::tensorOps::l2Norm< 2 >( tau ); + + // If normal tangential trial is positive (opening) + fractureState = FractureState::Stick; + if( tractionTrial[ 0 ] > normalTractionTolerance ) + { + tractionNew[0] = 0.0; + dTraction_dDispJump[0][0] = 0.0; + fractureState = FractureState::Open; + } + else + { + tractionNew[0] = tractionTrial[0]; + dTraction_dDispJump[0][0] = -penalty[ 0 ]; + } + + // Compute limit Tau + if( fixedLimitTau ) + { + limitTau = computeLimitTangentialTractionNorm( traction[0], + dLimitTangentialTractionNorm_dTraction ); + } + else + { + limitTau = computeLimitTangentialTractionNorm( tractionNew[0], + dLimitTangentialTractionNorm_dTraction ); + } + + if( tractionTrialNorm <= tangentialTractionTolerance ) + { + // It is needed for the first iteration (both t and u are equal to zero) + dTraction_dDispJump[1][1] = -penalty[1]; + dTraction_dDispJump[2][2] = -penalty[1]; + + tractionNew[1] = tractionTrial[1]; + tractionNew[2] = tractionTrial[2]; + + if( fractureState != FractureState::Open ) + fractureState = FractureState::Stick; + } + else if( limitTau <= tangentialTractionTolerance ) + { + dTraction_dDispJump[1][1] = 0.0; + dTraction_dDispJump[2][2] = 0.0; + + tractionNew[1] = (fixedLimitTau) ? tractionTrial[1] : 0.0; + tractionNew[2] = (fixedLimitTau) ? tractionTrial[2] : 0.0; + + if( fractureState != FractureState::Open ) + fractureState = FractureState::Slip; + } + else + { + // Compute psi and dpsi + //real64 const psi = std::tanh( tractionTrialNorm/limitTau ); + //real64 const dpsi = 1.0-std::pow(psi,2); + real64 const psi = ( tractionTrialNorm > limitTau) ? 1.0 : tractionTrialNorm/limitTau; + real64 const dpsi = ( tractionTrialNorm > limitTau) ? 0.0 : 1.0; + + if( fractureState != FractureState::Open ) + { + fractureState = ( tractionTrialNorm > limitTau) ? FractureState::Slip : FractureState::Stick; + } + + // Two symmetric 2x2 matrices + real64 dNormTTdgT[ 3 ]; + dNormTTdgT[ 0 ] = tractionTrial[ 1 ] * tractionTrial[ 1 ]; + dNormTTdgT[ 1 ] = tractionTrial[ 2 ] * tractionTrial[ 2 ]; + dNormTTdgT[ 2 ] = tractionTrial[ 1 ] * tractionTrial[ 2 ]; + + real64 dTdgT[ 3 ]; + dTdgT[ 0 ] = (tractionTrialNorm * tractionTrialNorm - dNormTTdgT[0]); + dTdgT[ 1 ] = (tractionTrialNorm * tractionTrialNorm - dNormTTdgT[1]); + dTdgT[ 2 ] = -dNormTTdgT[2]; + + LvArray::tensorOps::scale< 3 >( dNormTTdgT, 1. / std::pow( tractionTrialNorm, 2 ) ); + LvArray::tensorOps::scale< 3 >( dTdgT, 1. / std::pow( tractionTrialNorm, 3 ) ); + + // Compute dTdDispJump + dTraction_dDispJump[1][1] = -penalty[1] * ( + dpsi * dNormTTdgT[0] + + psi * dTdgT[0] * limitTau ); + dTraction_dDispJump[2][2] = -penalty[1] * ( + dpsi * dNormTTdgT[1] + + psi * dTdgT[1] * limitTau ); + dTraction_dDispJump[1][2] = -penalty[1] * ( + dpsi * dNormTTdgT[2] + + psi * dTdgT[2] * limitTau ); + dTraction_dDispJump[2][1] = dTraction_dDispJump[1][2]; + + if( !symmetric ) + { + // Nonsymetric term + dTraction_dDispJump[1][0] = -dTraction_dDispJump[0][0] * m_frictionCoefficient * + tractionTrial[1] * (psi/tractionTrialNorm - dpsi/limitTau); + dTraction_dDispJump[2][0] = -dTraction_dDispJump[0][0] * m_frictionCoefficient * + tractionTrial[2] * (psi/tractionTrialNorm - dpsi/limitTau); + } + + LvArray::tensorOps::scale< 3 >( tractionTrial, (psi * limitTau)/tractionTrialNorm ); + tractionNew[1] = tractionTrial[1]; + tractionNew[2] = tractionTrial[2]; + } + +} + +GEOS_HOST_DEVICE +inline void CoulombFrictionUpdates::updateTractionOnly( arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & deltaDispJump, + arraySlice1d< real64 const > const & penalty, + arraySlice1d< real64 const > const & traction, + arraySlice1d< real64 > const & tractionNew ) const +{ + + // TODO: Pass this tol as an argument or define a new class member + real64 const zero = LvArray::NumericLimits< real64 >::epsilon; + + tractionNew[0] = traction[0] + penalty[0] * dispJump[0]; + tractionNew[1] = traction[1] + penalty[1] * deltaDispJump[1]; + tractionNew[2] = traction[2] + penalty[1] * deltaDispJump[2]; + + real64 const tau[2] = { tractionNew[1], + tractionNew[2] }; + real64 const currentTau = LvArray::tensorOps::l2Norm< 2 >( tau ); + + real64 dLimitTangentialTractionNorm_dTraction = 0.0; + real64 const limitTau = computeLimitTangentialTractionNorm( tractionNew[0], + dLimitTangentialTractionNorm_dTraction ); + + // Compute psi + real64 psi; + if( limitTau < zero ) + { + psi = 1.0; + } + else + { + //psi = std::tanh(currentTau / limitTau); + psi = (currentTau > limitTau ) ? 1.0 : currentTau/limitTau; + } + + // Compute the new tangential traction + if( limitTau > zero && currentTau > zero ) + { + tractionNew[1] *= limitTau * psi / currentTau; + tractionNew[2] *= limitTau * psi / currentTau; + } + else + { + tractionNew[1] *= 0.0; + tractionNew[2] *= 0.0; + } +} + +GEOS_HOST_DEVICE +inline void CoulombFrictionUpdates::constraintCheck( arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & deltaDispJump, + arraySlice1d< real64 > const & tractionVector, + integer const fractureState, + real64 const normalTractionTolerance, + real64 const normalDisplacementTolerance, + real64 const slidingTolerance, + real64 const slidingCheckTolerance, + integer & condConv ) const +{ + + using namespace fields::contact; + + // Compute the slip + real64 const deltaDisp[2] = { deltaDispJump[1], + deltaDispJump[2] }; + + real64 const deltaDispNorm = LvArray::tensorOps::l2Norm< 2 >( deltaDisp ); + + // Compute current Tau and limit Tau + real64 const tau[2] = { tractionVector[1], + tractionVector[2] }; + real64 const currentTau = LvArray::tensorOps::l2Norm< 2 >( tau ); + + real64 dLimitTangentialTractionNorm_dTraction = 0.0; + real64 const limitTau = computeLimitTangentialTractionNorm( tractionVector[0], + dLimitTangentialTractionNorm_dTraction ); + + condConv = 0; + // Case 1: if it is open + if( tractionVector[0] >= normalTractionTolerance ) + { + if( fractureState != FractureState::Open ) + { + condConv = 1; + } + tractionVector[0] = 0.0; + tractionVector[1] = 0.0; + tractionVector[2] = 0.0; + } + else + { + // Case 2: compenetration + if(( LvArray::math::abs( dispJump[0] ) > normalDisplacementTolerance ) && + (fractureState != FractureState::Open)) + { + condConv = 2; + } + // Case 3: it is stick and dg is greater than 0 + if( fractureState == FractureState::Stick && + deltaDispNorm > slidingTolerance ) + { + condConv = 3; + } + + // Case 4: the elastic tangential traction is greater than the limit + if( currentTau > (LvArray::math::abs( limitTau ) * (1.0 + slidingCheckTolerance)) ) + { + condConv = 4; + } + } +} + } /* namespace constitutive */ } /* namespace geos */ diff --git a/src/coreComponents/constitutive/contact/FrictionBase.hpp b/src/coreComponents/constitutive/contact/FrictionBase.hpp index 13186378e42..e05923f2998 100644 --- a/src/coreComponents/constitutive/contact/FrictionBase.hpp +++ b/src/coreComponents/constitutive/contact/FrictionBase.hpp @@ -89,7 +89,81 @@ class FrictionBaseUpdates integer & fractureState ) const { GEOS_UNUSED_VAR( k, dispJump, tractionVector, fractureState ); } + /** + * @brief Update the trial traction vector ( return mapping ) + * @param[in] oldDispJump the displacement jump of the previous time step + * @param[in] dispJump the displacement jump of the current time step + * @param[in] penalty the penalty coefficients + * @param[in] traction the traction vector + * @param[in] symmetric flag to compute only the symmetric part of dTraction_dDispJump + * @param[in] fixedLimitTau flag to keep fixed the tangential stress + * @param[in] normalTractionTolerance normal traction tolerance (if tn > tol => fracture is open) + * @param[in] tangentialTractionTolerance tangential traction tolerance (if tau < tol => tau = 0) + * @param[out] dTraction_dDispJump matrix containing the derivatives of traction over the displacement jump + * @param[out] tractionNew the new traction vector + * @param[out] fractureState the fracture state + */ + GEOS_HOST_DEVICE + inline + virtual void updateTraction( arraySlice1d< real64 const > const & oldDispJump, + arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & penalty, + arraySlice1d< real64 const > const & traction, + bool const symmetric, + bool const fixedLimitTau, + real64 const normalTractionTolerance, + real64 const tangentialTractionTolerance, + real64 ( & dTraction_dDispJump )[3][3], + real64 ( & tractionNew )[3], + integer & fractureState ) const + { + GEOS_UNUSED_VAR( oldDispJump, dispJump, penalty, traction, symmetric, fixedLimitTau, + normalTractionTolerance, tangentialTractionTolerance, + dTraction_dDispJump, tractionNew, fractureState ); + } + /** + * @brief Update the traction vector only ( return mapping ) + * @param[in] dispJump the displacement jump of the current time step + * @param[in] deltaDispJump the delta displacement jump of the current time step + * @param[in] penalty the penalty coefficients + * @param[in] traction the traction vector + * @param[out] tractionNew the new traction vector + */ + GEOS_HOST_DEVICE + inline + virtual void updateTractionOnly( arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & deltaDispJump, + arraySlice1d< real64 const > const & penalty, + arraySlice1d< real64 const > const & traction, + arraySlice1d< real64 > const & tractionNew ) const + { GEOS_UNUSED_VAR( dispJump, deltaDispJump, penalty, traction, tractionNew ); } + + /** + * @brief Check for the constraint satisfaction + * @param[in] dispJump the displacement jump of the current time step + * @param[in] deltaDispJump the delta displacement jump of the current time step + * @param[in] tractionVector the traction vector + * @param[in] fractureState the fracture check + * @param[in] tolerance the tolerance + * @param[out] condConv flag indicating the result of the check + */ + GEOS_HOST_DEVICE + inline + virtual void constraintCheck( arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & deltaDispJump, + arraySlice1d< real64 > const & tractionVector, + integer const fractureState, + real64 const normalTractionTolerance, + real64 const normalDisplacementTolerance, + real64 const slidingTolerance, + real64 const slidingCheckTolerance, + integer & condConv ) const + { + GEOS_UNUSED_VAR( dispJump, deltaDispJump, tractionVector, fractureState, + normalTractionTolerance, normalDisplacementTolerance, slidingTolerance, + slidingCheckTolerance, condConv ); + } /** * @brief Evaluate the limit tangential traction norm and return the derivative wrt normal traction diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.cpp b/src/coreComponents/constitutive/contact/FrictionlessContact.cpp index 557bdd81a0d..e7fb6bb8ba6 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.cpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.cpp @@ -35,7 +35,7 @@ FrictionlessContact::FrictionlessContact( string const & name, FrictionlessContact::~FrictionlessContact() {} -FrictionlessContactUpdates FrictionlessContact::createKernelWrapper() const +FrictionlessContactUpdates FrictionlessContact::createKernelUpdates() const { return FrictionlessContactUpdates( m_displacementJumpThreshold ); } diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp index b4ce8dba853..83e53fd8e14 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp @@ -118,7 +118,7 @@ class FrictionlessContact : public FrictionBase * @brief Create an update kernel wrapper. * @return the wrapper */ - KernelWrapper createKernelWrapper() const; + KernelWrapper createKernelUpdates() const; /** * @struct Structure to hold scoped key names diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp index 81d1762bcdb..2ea2d584a79 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp @@ -176,8 +176,7 @@ class LagrangeBasis1 GEOS_FORCE_INLINE constexpr static real64 gradientBubble( const real64 xi ) { - GEOS_UNUSED_VAR( xi ); - return -0.5*xi; + return -2.0*xi; } /** @@ -420,20 +419,29 @@ class LagrangeBasis1 static void valueFaceBubble( real64 const (&coords)[3], real64 (& N)[numSupportFaces] ) { - for( int a=0; a<2; ++a ) - { - N[ a*5 ] = LagrangeBasis1::valueBubble( coords[0] ) * - LagrangeBasis1::valueBubble( coords[1] ) * - LagrangeBasis1::value( a, coords[2] ); + N[ 0 ] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::value( 0, coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); - N[ a*3+1 ] = LagrangeBasis1::valueBubble( coords[0] ) * - LagrangeBasis1::value( a, coords[1] ) * - LagrangeBasis1::valueBubble( coords[2] ); + N[ 1 ] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::value( 0, coords[2] ); - N[ a+2 ] = LagrangeBasis1::value( a, coords[0] ) * - LagrangeBasis1::valueBubble( coords[1] ) * - LagrangeBasis1::valueBubble( coords[2] ); - } + N[ 2 ] = LagrangeBasis1::value( 0, coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); + + N[ 3 ] = LagrangeBasis1::value( 1, coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); + + N[ 4 ] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::value( 1, coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); + + N[ 5 ] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::value( 1, coords[2] ); } /** @@ -448,38 +456,65 @@ class LagrangeBasis1 static void gradientFaceBubble( real64 const (&coords)[3], real64 (& dNdXi)[numSupportFaces][3] ) { - for( int a=0; a<2; ++a ) - { - dNdXi[ a*5 ][0] = LagrangeBasis1::gradientBubble( coords[0] ) * - LagrangeBasis1::valueBubble( coords[1] ) * - LagrangeBasis1::value( a, coords[2] ); - dNdXi[ a*5 ][1] = LagrangeBasis1::valueBubble( coords[0] ) * - LagrangeBasis1::gradientBubble( coords[1] ) * - LagrangeBasis1::value( a, coords[2] ); - dNdXi[ a*5 ][2] = LagrangeBasis1::valueBubble( coords[0] ) * - LagrangeBasis1::valueBubble( coords[1] ) * - LagrangeBasis1::gradient( a, coords[2] ); - - dNdXi[ a*3+1 ][0] = LagrangeBasis1::gradientBubble( coords[0] ) * - LagrangeBasis1::value( a, coords[1] ) * - LagrangeBasis1::valueBubble( coords[2] ); - dNdXi[ a*3+1 ][1] = LagrangeBasis1::valueBubble( coords[0] ) * - LagrangeBasis1::gradient( a, coords[1] ) * - LagrangeBasis1::valueBubble( coords[2] ); - dNdXi[ a*3+1 ][2] = LagrangeBasis1::valueBubble( coords[0] ) * - LagrangeBasis1::value( a, coords[1] ) * - LagrangeBasis1::gradientBubble( coords[2] ); - - dNdXi[ a+2 ][0] = LagrangeBasis1::gradient( a, coords[0] ) * - LagrangeBasis1::valueBubble( coords[1] ) * - LagrangeBasis1::valueBubble( coords[2] ); - dNdXi[ a+2 ][1] = LagrangeBasis1::value( a, coords[0] ) * - LagrangeBasis1::gradientBubble( coords[1] ) * - LagrangeBasis1::valueBubble( coords[2] ); - dNdXi[ a+2 ][2] = LagrangeBasis1::value( a, coords[0] ) * - LagrangeBasis1::valueBubble( coords[1] ) * - LagrangeBasis1::gradientBubble( coords[2] ); - } + dNdXi[0][0] = LagrangeBasis1::gradientBubble( coords[0] ) * + LagrangeBasis1::value( 0, coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); + dNdXi[0][1] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::gradient( 0, coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); + dNdXi[0][2] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::value( 0, coords[1] ) * + LagrangeBasis1::gradientBubble( coords[2] ); + + dNdXi[1][0] = LagrangeBasis1::gradientBubble( coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::value( 0, coords[2] ); + dNdXi[1][1] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::gradientBubble( coords[1] ) * + LagrangeBasis1::value( 0, coords[2] ); + dNdXi[1][2] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::gradient( 0, coords[2] ); + + dNdXi[2][0] = LagrangeBasis1::gradient( 0, coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); + dNdXi[2][1] = LagrangeBasis1::value( 0, coords[0] ) * + LagrangeBasis1::gradientBubble( coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); + dNdXi[2][2] = LagrangeBasis1::value( 0, coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::gradientBubble( coords[2] ); + + dNdXi[3][0] = LagrangeBasis1::gradient( 1, coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); + dNdXi[3][1] = LagrangeBasis1::value( 1, coords[0] ) * + LagrangeBasis1::gradientBubble( coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); + dNdXi[3][2] = LagrangeBasis1::value( 1, coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::gradientBubble( coords[2] ); + + dNdXi[4][0] = LagrangeBasis1::gradientBubble( coords[0] ) * + LagrangeBasis1::value( 1, coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); + dNdXi[4][1] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::gradient( 1, coords[1] ) * + LagrangeBasis1::valueBubble( coords[2] ); + dNdXi[4][2] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::value( 1, coords[1] ) * + LagrangeBasis1::gradientBubble( coords[2] ); + + dNdXi[5][0] = LagrangeBasis1::gradientBubble( coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::value( 1, coords[2] ); + dNdXi[5][1] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::gradientBubble( coords[1] ) * + LagrangeBasis1::value( 1, coords[2] ); + dNdXi[5][2] = LagrangeBasis1::valueBubble( coords[0] ) * + LagrangeBasis1::valueBubble( coords[1] ) * + LagrangeBasis1::gradient( 1, coords[2] ); } /** diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index 387979f7a41..ed3ea6de356 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -6,8 +6,7 @@ set( physicsSolvers_headers SolverBase.hpp SolverBaseKernels.hpp SolverStatistics.hpp - FieldStatisticsBase.hpp - ) + FieldStatisticsBase.hpp ) # Specify solver sources set( physicsSolvers_sources diff --git a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp index 17291a2dbf7..4792ca2d019 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp @@ -50,13 +50,13 @@ struct FractureState }; }; -DECLARE_FIELD( penalty, - "penalty", +DECLARE_FIELD( iterativePenalty, + "iterativePenalty", array2d< real64 >, - 0, + 1.e5, LEVEL_0, WRITE_AND_READ, - "Penalty coefficients" ); + "Penalty coefficients used in the iterative procedure of the Augmented Lagrangian Method" ); DECLARE_FIELD( rotationMatrix, "rotationMatrix", diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp index 7764d9e0a50..4b76b7a4a3d 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp @@ -285,30 +285,7 @@ class ALMBubbleKernels : real64 strainBubbleMatrix[6][nBubbleUdof]; solidMechanicsALMKernelsHelper::assembleStrainOperator< 6, nBubbleUdof, numFacesPerElem >( strainBubbleMatrix, dBubbleNdX ); - // TODO: Use the following functions - //using namespace PDEUtilities; - //constexpr FunctionSpace displacementTrialSpace = FE_TYPE::template getFunctionSpace< numDofPerTrialSupportPoint >(); - //constexpr FunctionSpace displacementTestSpace = displacementTrialSpace; - //real64 Abb_bilinear[nBubbleUdof][nBubbleUdof]; - //BilinearFormUtilities::compute< displacementTrialSpace, - // displacementTestSpace, - // DifferentialOperator::SymmetricGradient, - // DifferentialOperator::SymmetricGradient > - //( - // Abb_bilinear, - // dBubbleNdX, - // stack.constitutiveStiffness, // fourth-order tensor handled via DiscretizationOps - // dBubbleNdX, - // -detJ ); - - - //LinearFormUtilities::compute< displacementTestSpace, - // DifferentialOperator::Identity > - //( - //stack.localResidualMomentum, - //N, - //stack.bodyForce, - //detJxW ); + // TODO: It would be nice use BilinearFormUtilities::compute real64 matBD[nBubbleUdof][6]; real64 Abb_gauss[nBubbleUdof][nBubbleUdof], Abu_gauss[nBubbleUdof][nUdof], Aub_gauss[nUdof][nBubbleUdof]; @@ -330,6 +307,22 @@ class ALMBubbleKernels : LvArray::tensorOps::scaledAdd< nBubbleUdof, nUdof >( stack.localAbu, Abu_gauss, -detJ ); LvArray::tensorOps::scaledAdd< nUdof, nBubbleUdof >( stack.localAub, Aub_gauss, -detJ ); + // Compute the initial stress + // The following block assumes a linear elastic constitutive model + real64 rb_gauss[nBubbleUdof]{}; + real64 strain[6] = {0}; + LvArray::tensorOps::Ri_eq_AijBj< 6, nUdof >( strain, strainMatrix, stack.uLocal ); + + real64 initStressLocal[ 6 ] = {0}; + LvArray::tensorOps::Ri_eq_AijBj< 6, 6 >( initStressLocal, stack.constitutiveStiffness, strain ); + for( localIndex c = 0; c < 6; ++c ) + { + initStressLocal[ c ] -= m_constitutiveUpdate.m_newStress( k, q, c ); + } + + LvArray::tensorOps::Ri_eq_AjiBj< nBubbleUdof, 6 >( rb_gauss, strainBubbleMatrix, initStressLocal ); + LvArray::tensorOps::scaledAdd< nBubbleUdof >( stack.localRb, rb_gauss, detJ ); + } GEOS_HOST_DEVICE diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp index 7c63181a6c9..9f5c53f5132 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp @@ -52,6 +52,7 @@ class ALM : using Base::m_elemsToFaces; using Base::m_faceToNodes; using Base::m_finiteElementSpace; + using Base::m_constitutiveUpdate; using Base::m_dofNumber; using Base::m_bDofNumber; using Base::m_dofRankOffset; @@ -80,7 +81,8 @@ class ALM : CRSMatrixView< real64, globalIndex const > const inputMatrix, arrayView1d< real64 > const inputRhs, real64 const inputDt, - arrayView1d< localIndex const > const & faceElementList ): + arrayView1d< localIndex const > const & faceElementList, + bool const isSymmetric ): Base( nodeManager, edgeManager, faceManager, @@ -95,7 +97,8 @@ class ALM : inputRhs, inputDt, faceElementList ), - m_traction( elementSubRegion.getField< fields::contact::traction >().toViewConst()) + m_traction( elementSubRegion.getField< fields::contact::traction >().toViewConst()), + m_symmetric( isSymmetric ) {} //*************************************************************************** @@ -223,11 +226,6 @@ class ALM : } } - // The minus sign is consistent with the sign of the Jacobian - stack.localPenalty[0][0] = -m_penalty( k, 0 ); - stack.localPenalty[1][1] = -m_penalty( k, 1 ); - stack.localPenalty[2][2] = -m_penalty( k, 1 ); - for( int i=0; i::epsilon; constexpr int numUdofs = numNodesPerElem * 3 * 2; @@ -259,13 +258,24 @@ class ALM : real64 matRRtAtu[3][numUdofs], matDRtAtu[3][numUdofs]; real64 matRRtAtb[3][numBdofs], matDRtAtb[3][numBdofs]; - real64 dispJumpR[numUdofs]; - real64 oldDispJumpR[numUdofs]; real64 tractionR[numUdofs]; - real64 dispJumpRb[numBdofs]; - real64 oldDispJumpRb[numBdofs]; real64 tractionRb[numBdofs]; + real64 tractionNew[3]; + + integer fractureState; + m_constitutiveUpdate.updateTraction( m_oldDispJump[k], + m_dispJump[k], + m_penalty[k], + m_traction[k], + m_symmetric, + m_symmetric, + zero, + zero, + stack.localPenalty, + tractionNew, + fractureState ); + // transp(R) * Atu LvArray::tensorOps::Rij_eq_AkiBkj< 3, numUdofs, 3 >( matRRtAtu, stack.localRotationMatrix, stack.localAtu ); @@ -274,8 +284,8 @@ class ALM : stack.localAtb ); // Compute the traction contribute of the local residuals - LvArray::tensorOps::Ri_eq_AjiBj< numUdofs, 3 >( tractionR, matRRtAtu, stack.tLocal ); - LvArray::tensorOps::Ri_eq_AjiBj< numBdofs, 3 >( tractionRb, matRRtAtb, stack.tLocal ); + LvArray::tensorOps::Ri_eq_AjiBj< numUdofs, 3 >( tractionR, matRRtAtu, tractionNew ); + LvArray::tensorOps::Ri_eq_AjiBj< numBdofs, 3 >( tractionRb, matRRtAtb, tractionNew ); // D*RtAtu LvArray::tensorOps::Rij_eq_AikBkj< 3, numUdofs, 3 >( matDRtAtu, stack.localPenalty, @@ -307,18 +317,9 @@ class ALM : matRRtAtb ); // Compute the local residuals - LvArray::tensorOps::Ri_eq_AjiBj< numUdofs, 3 >( dispJumpR, matDRtAtu, stack.dispJumpLocal ); - LvArray::tensorOps::Ri_eq_AjiBj< numUdofs, 3 >( oldDispJumpR, matDRtAtu, stack.oldDispJumpLocal ); - LvArray::tensorOps::Ri_eq_AjiBj< numBdofs, 3 >( dispJumpRb, matDRtAtb, stack.dispJumpLocal ); - LvArray::tensorOps::Ri_eq_AjiBj< numBdofs, 3 >( oldDispJumpRb, matDRtAtb, stack.oldDispJumpLocal ); - LvArray::tensorOps::scaledAdd< numUdofs >( stack.localRu, tractionR, -1 ); - LvArray::tensorOps::scaledAdd< numUdofs >( stack.localRu, dispJumpR, 1 ); - LvArray::tensorOps::scaledAdd< numUdofs >( stack.localRu, oldDispJumpR, -1 ); LvArray::tensorOps::scaledAdd< numBdofs >( stack.localRb, tractionRb, -1 ); - LvArray::tensorOps::scaledAdd< numBdofs >( stack.localRb, dispJumpRb, 1 ); - LvArray::tensorOps::scaledAdd< numBdofs >( stack.localRb, oldDispJumpRb, -1 ); for( localIndex i=0; i < numUdofs; ++i ) { @@ -369,6 +370,8 @@ class ALM : arrayView2d< real64 const > const m_traction; + bool const m_symmetric; + }; /// The factory used to construct the kernel. @@ -379,48 +382,45 @@ using ALMFactory = finiteElement::InterfaceKernelFactory< ALM, CRSMatrixView< real64, globalIndex const > const, arrayView1d< real64 > const, real64 const, - arrayView1d< localIndex const > const >; - + arrayView1d< localIndex const > const, + bool const >; /** - * @brief A struct to compute rotation matrices + * @brief A struct to compute the traction after nonlinear solve */ -struct ComputeRotationMatricesKernel +struct ComputeTractionKernel { /** - * @brief Launch the kernel function to comute rotation matrices + * @brief Launch the kernel function to compute the traction * @tparam POLICY the type of policy used in the kernel launch + * @tparam CONTACT_WRAPPER the type of contact wrapper doing the fracture traction updates * @param[in] size the size of the subregion - * @param[in] faceNormal the array of array containing the face to nodes map - * @param[in] elemsToFaces the array of array containing the element to faces map - * @param[out] rotationMatrix the array containing the rotation matrices + * @param[in] penalty the array containing the tangential penalty matrix + * @param[in] traction the array containing the current traction + * @param[in] dispJump the array containing the displacement jump + * @param[in] deltaDispJump the array containing the delta displacement jump + * @param[out] tractionNew the array containing the new traction */ - template< typename POLICY > + template< typename POLICY, typename CONTACT_WRAPPER > static void launch( localIndex const size, - arrayView2d< real64 const > const & faceNormal, - ArrayOfArraysView< localIndex const > const & elemsToFaces, - arrayView3d< real64 > const & rotationMatrix ) + CONTACT_WRAPPER const & contactWrapper, + arrayView2d< real64 const > const & penalty, + arrayView2d< real64 const > const & traction, + arrayView2d< real64 const > const & dispJump, + arrayView2d< real64 const > const & deltaDispJump, + arrayView2d< real64 > const & tractionNew ) { forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) { - localIndex const f0 = elemsToFaces[k][0]; - localIndex const f1 = elemsToFaces[k][1]; - - real64 Nbar[3]; - Nbar[0] = faceNormal[f0][0] - faceNormal[f1][0]; - Nbar[1] = faceNormal[f0][1] - faceNormal[f1][1]; - Nbar[2] = faceNormal[f0][2] - faceNormal[f1][2]; - - LvArray::tensorOps::normalize< 3 >( Nbar ); - computationalGeometry::RotationMatrix_3D( Nbar, rotationMatrix[k] ); + contactWrapper.updateTractionOnly( dispJump[k], deltaDispJump[k], + penalty[k], traction[k], tractionNew[k] ); } ); } - }; } // namespace SolidMechanicsALMKernels diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp index d1debe35a5d..4f3504e3d5f 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp @@ -98,7 +98,7 @@ class ALMKernelsBase : m_rotationMatrix( elementSubRegion.getField< fields::contact::rotationMatrix >().toViewConst()), m_dispJump( elementSubRegion.getField< fields::contact::dispJump >().toView() ), m_oldDispJump( elementSubRegion.getField< fields::contact::oldDispJump >().toViewConst() ), - m_penalty( elementSubRegion.getField< fields::contact::penalty >().toViewConst() ) + m_penalty( elementSubRegion.getField< fields::contact::iterativePenalty >().toViewConst() ) {} //*************************************************************************** @@ -266,6 +266,182 @@ class ALMKernelsBase : }; +/** + * @brief A struct to compute rotation matrices + */ +struct ComputeRotationMatricesKernel +{ + + /** + * @brief Launch the kernel function to comute rotation matrices + * @tparam POLICY the type of policy used in the kernel launch + * @param[in] size the size of the subregion + * @param[in] faceNormal the array of array containing the face to nodes map + * @param[in] elemsToFaces the array of array containing the element to faces map + * @param[out] rotationMatrix the array containing the rotation matrices + */ + template< typename POLICY > + static void + launch( localIndex const size, + arrayView2d< real64 const > const & faceNormal, + ArrayOfArraysView< localIndex const > const & elemsToFaces, + arrayView3d< real64 > const & rotationMatrix ) + { + + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + + localIndex const & f0 = elemsToFaces[k][0]; + localIndex const & f1 = elemsToFaces[k][1]; + + real64 Nbar[3]; + Nbar[0] = faceNormal[f0][0] - faceNormal[f1][0]; + Nbar[1] = faceNormal[f0][1] - faceNormal[f1][1]; + Nbar[2] = faceNormal[f0][2] - faceNormal[f1][2]; + + LvArray::tensorOps::normalize< 3 >( Nbar ); + computationalGeometry::RotationMatrix_3D( Nbar, rotationMatrix[k] ); + + } ); + } + +}; + +/** + * @brief A struct to check for constraint satisfaction + */ +struct ConstraintCheckKernel +{ + + /** + * @brief Launch the kernel function to check the constraint satisfaction + * @tparam POLICY the type of policy used in the kernel launch + * @tparam CONTACT_WRAPPER the type of contact wrapper doing the fracture traction updates + * @param[in] size the size of the subregion + * @param[in] traction the array containing the current traction + * @param[in] dispJump the array containing the displacement jump + * @param[in] deltaDispJump the array containing the delta displacement jump + * @param[in] normalTractionTolerance Check tolerance (normal traction) + * @param[in] normalDisplacementTolerance Check tolerance (compenetration) + * @param[in] slidingTolerance Check tolerance (sliding) + * @param[in] slidingCheckTolerance Check tolerance (if shear strass exceeds tauLim) + * @param[in] area interface element area + * @param[in] fractureState the array containing the fracture state + * @param[out] condConv the array containing the convergence flag: + * 0: Constraint conditions satisfied + * 1: Open + * 2: Compenetration + * 3: Slip exceeds sliding tolerance + * 4: Shear stress exceeds tauLim + */ + template< typename POLICY, typename CONTACT_WRAPPER > + static void + launch( localIndex const size, + CONTACT_WRAPPER const & contactWrapper, + arrayView1d< integer const > const & ghostRank, + arrayView2d< real64 > const & traction, + arrayView2d< real64 const > const & dispJump, + arrayView2d< real64 const > const & deltaDispJump, + arrayView1d< real64 const > const & normalTractionTolerance, + arrayView1d< real64 const > const & normalDisplacementTolerance, + arrayView1d< real64 const > const & slidingTolerance, + real64 const slidingCheckTolerance, + arrayView1d< real64 const > const & area, + arrayView1d< integer const > const & fractureState, + arrayView1d< integer > const & condConv ) + { + + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + if( ghostRank[k] < 0 ) + { + contactWrapper.constraintCheck( dispJump[k], + deltaDispJump[k], + traction[k], + fractureState[k], + normalTractionTolerance[k], + normalDisplacementTolerance[k]*area[k], + slidingTolerance[k]*area[k], + slidingCheckTolerance, + condConv[k] ); + } + + } ); + } +}; + +/** + * @brief A struct to check for constraint satisfaction + */ +struct UpdateStateKernel +{ + + /** + * @brief Launch the kernel function to check the constraint satisfaction + * @tparam POLICY the type of policy used in the kernel launch + * @tparam CONTACT_WRAPPER the type of contact wrapper doing the fracture traction updates + * @param[in] size the size of the subregion + * @param[in] oldDispJump the array containing the old displacement jump (previous time step) + * @param[in] dispJump the array containing the displacement jump + * @param[in] penalty the array containing the penalty coefficients + * @param[in] symmetric flag to compute symmetric penalty matrix + * @param[in] normalTractionTolerance Check tolerance (normal traction) + * @param[in] traction the array containing the current traction + * @param[in] fractureState the array containing the fracture state + */ + template< typename POLICY, typename CONTACT_WRAPPER > + static void + launch( localIndex const size, + CONTACT_WRAPPER const & contactWrapper, + arrayView2d< real64 const > const & oldDispJump, + arrayView2d< real64 const > const & dispJump, + arrayView2d< real64 > const & penalty, + bool const symmetric, + arrayView1d< real64 const > const & normalTractionTolerance, + arrayView2d< real64 > const & traction, + arrayView1d< integer > const & fractureState ) + + { + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + + real64 const zero = LvArray::NumericLimits< real64 >::epsilon; + + real64 localPenalty[3][3]{}; + real64 localTractionNew[3]{}; + contactWrapper.updateTraction( oldDispJump[k], + dispJump[k], + penalty[k], + traction[k], + symmetric, + false, + normalTractionTolerance[k], + zero, + localPenalty, + localTractionNew, + fractureState[k] ); + + if( fractureState[k] == fields::contact::FractureState::Open ) + { + + LvArray::tensorOps::fill< 3 >( localTractionNew, 0.0 ); + } + else if( LvArray::math::abs( localTractionNew[ 0 ] ) < normalTractionTolerance[k] ) + { + LvArray::tensorOps::fill< 3 >( localTractionNew, 0.0 ); + fractureState[k] = fields::contact::FractureState::Slip; + } + + LvArray::tensorOps::copy< 3 >( traction[k], localTractionNew ); + penalty[k][2] = -localPenalty[1][1]; + penalty[k][3] = -localPenalty[2][2]; + penalty[k][4] = -localPenalty[1][2]; + + } ); + } + +}; + } // namespace SolidMechanicsALMKernels } // namespace geos diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMSimultaneousKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMSimultaneousKernels.hpp new file mode 100644 index 00000000000..f9cd307b6fe --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMSimultaneousKernels.hpp @@ -0,0 +1,435 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 Total, S.A + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SolidMechanicsALMSimultaneousKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMSIMULTANEOUSKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMSIMULTANEOUSKERNELS_HPP_ + +#include "SolidMechanicsALMKernelsBase.hpp" + +namespace geos +{ + +namespace solidMechanicsALMKernels +{ + +/** + * @copydoc geos::finiteElement::ImplicitKernelBase + */ +template< typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +class ALMSimultaneous : + public ALMKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE > +{ +public: + /// Alias for the base class. + using Base = ALMKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE >; + + /// Maximum number of nodes per element, which is equal to the maxNumTestSupportPointPerElem and + /// maxNumTrialSupportPointPerElem by definition. + static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; + + /// Compile time value for the number of quadrature points per element. + static constexpr int numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + + using Base::m_elemsToFaces; + using Base::m_faceToNodes; + using Base::m_finiteElementSpace; + using Base::m_dofNumber; + using Base::m_bDofNumber; + using Base::m_dofRankOffset; + using Base::m_X; + using Base::m_rotationMatrix; + using Base::m_penalty; + using Base::m_dispJump; + using Base::m_oldDispJump; + using Base::m_matrix; + using Base::m_rhs; + + /** + * @brief Constructor + * @copydoc geos::finiteElement::InterfaceKernelBase::InterfaceKernelBase + */ + ALMSimultaneous( NodeManager const & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + FaceElementSubRegion & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + arrayView1d< globalIndex const > const uDofNumber, + arrayView1d< globalIndex const > const bDofNumber, + globalIndex const rankOffset, + CRSMatrixView< real64, globalIndex const > const inputMatrix, + arrayView1d< real64 > const inputRhs, + real64 const inputDt, + arrayView1d< localIndex const > const & faceElementList ): + Base( nodeManager, + edgeManager, + faceManager, + targetRegionIndex, + elementSubRegion, + finiteElementSpace, + inputConstitutiveType, + uDofNumber, + bDofNumber, + rankOffset, + inputMatrix, + inputRhs, + inputDt, + faceElementList ), + m_traction( elementSubRegion.getField< fields::contact::traction >().toViewConst()) + {} + + //*************************************************************************** + + /** + * @copydoc finiteElement::KernelBase::StackVariables + */ + struct StackVariables : public Base::StackVariables + { + + /// The number of displacement dofs per element. + static constexpr int numUdofs = numNodesPerElem * 3 * 2; + + /// The number of lagrange multiplier dofs per element. + static constexpr int numTdofs = 3; + + /// The number of bubble dofs per element. + static constexpr int numBdofs = 3*2; + +public: + + GEOS_HOST_DEVICE + StackVariables(): + Base::StackVariables(), + dispEqnRowIndices{}, + dispColIndices{}, + bEqnRowIndices{}, + bColIndices{}, + localRu{}, + localRb{}, + localAutAtu{ {} }, + localAbtAtb{ {} }, + localAbtAtu{ {} }, + localAutAtb{ {} }, + tLocal{} + {} + + /// C-array storage for the element local row degrees of freedom. + globalIndex dispEqnRowIndices[numUdofs]; + + /// C-array storage for the element local column degrees of freedom. + globalIndex dispColIndices[numUdofs]; + + /// C-array storage for the element local row degrees of freedom. + globalIndex bEqnRowIndices[numBdofs]; + + /// C-array storage for the element local column degrees of freedom. + globalIndex bColIndices[numBdofs]; + + /// C-array storage for the element local Ru residual vector. + real64 localRu[numUdofs]; + + /// C-array storage for the element local Rb residual vector. + real64 localRb[numBdofs]; + + /// C-array storage for the element local AutAtu matrix. + real64 localAutAtu[numUdofs][numUdofs]; + + /// C-array storage for the element local AbtAtb matrix. + real64 localAbtAtb[numBdofs][numBdofs]; + + /// C-array storage for the element local AbtAtu matrix. + real64 localAbtAtu[numBdofs][numUdofs]; + + /// C-array storage for the element local AbtAtu matrix. + real64 localAutAtb[numUdofs][numBdofs]; + + /// Stack storage for the element local lagrange multiplier vector + real64 tLocal[numTdofs]; + + }; + + //*************************************************************************** + + //START_kernelLauncher + template< typename POLICY, + typename KERNEL_TYPE > + static + real64 + kernelLaunch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + return Base::template kernelLaunch< POLICY, KERNEL_TYPE >( numElems, kernelComponent ); + } + //END_kernelLauncher + + /** + * @brief Copy global values from primary field to a local stack array. + * @copydoc ::geos::finiteElement::InterfaceKernelBase::setup + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const k, + StackVariables & stack ) const + { + constexpr int shift = numNodesPerElem * 3; + + constexpr int numTdofs = 3; + + int permutation[numNodesPerElem]; + m_finiteElementSpace.getPermutation( permutation ); + + localIndex const kf0 = m_elemsToFaces[k][0]; + localIndex const kf1 = m_elemsToFaces[k][1]; + for( localIndex a=0; a( tractionNew, stack.tLocal, -1.0 ); + LvArray::tensorOps::Ri_add_AijBj< 3, 3 >( tractionNew, stack.localPenalty, dispJump ); + + // If normal tangential trial is positive (opening) + //if (tractionNew[ 0 ] < -zero) + //{ + // tractionNew[0] = 0.0; + // stack.localPenalty[0][0] = 0.0; + //} + + // transp(R) * Atu + LvArray::tensorOps::Rij_eq_AkiBkj< 3, numUdofs, 3 >( matRRtAtu, stack.localRotationMatrix, + stack.localAtu ); + // transp(R) * Atb + LvArray::tensorOps::Rij_eq_AkiBkj< 3, numBdofs, 3 >( matRRtAtb, stack.localRotationMatrix, + stack.localAtb ); + + // Compute the traction contribute of the local residuals + LvArray::tensorOps::Ri_eq_AjiBj< numUdofs, 3 >( tractionR, matRRtAtu, tractionNew ); + LvArray::tensorOps::Ri_eq_AjiBj< numBdofs, 3 >( tractionRb, matRRtAtb, tractionNew ); + + // D*RtAtu + LvArray::tensorOps::Rij_eq_AikBkj< 3, numUdofs, 3 >( matDRtAtu, stack.localPenalty, + matRRtAtu ); + // D*RtAtb + LvArray::tensorOps::Rij_eq_AikBkj< 3, numBdofs, 3 >( matDRtAtb, stack.localPenalty, + matRRtAtb ); + + // R*RtAtu + LvArray::tensorOps::Rij_eq_AikBkj< 3, numUdofs, 3 >( matRRtAtu, stack.localRotationMatrix, + matDRtAtu ); + // R*RtAtb + LvArray::tensorOps::Rij_eq_AikBkj< 3, numBdofs, 3 >( matRRtAtb, stack.localRotationMatrix, + matDRtAtb ); + + // transp(Atu)*RRtAtu + LvArray::tensorOps::Rij_eq_AkiBkj< numUdofs, numUdofs, 3 >( stack.localAutAtu, stack.localAtu, + matRRtAtu ); + // transp(Atb)*RRtAtb + LvArray::tensorOps::Rij_eq_AkiBkj< numBdofs, numBdofs, 3 >( stack.localAbtAtb, stack.localAtb, + matRRtAtb ); + + // transp(Atb)*RRtAtu + LvArray::tensorOps::Rij_eq_AkiBkj< numBdofs, numUdofs, 3 >( stack.localAbtAtu, stack.localAtb, + matRRtAtu ); + + // transp(Atu)*RRtAtb + LvArray::tensorOps::Rij_eq_AkiBkj< numUdofs, numBdofs, 3 >( stack.localAutAtb, stack.localAtu, + matRRtAtb ); + + // Compute the local residuals + LvArray::tensorOps::scaledAdd< numUdofs >( stack.localRu, tractionR, 1 ); + + LvArray::tensorOps::scaledAdd< numBdofs >( stack.localRb, tractionRb, 1 ); + + for( localIndex i=0; i < numUdofs; ++i ) + { + localIndex const dof = LvArray::integerConversion< localIndex >( stack.dispEqnRowIndices[ i ] ); + + if( dof < 0 || dof >= m_matrix.numRows() ) continue; + + // Is it necessary? Each row should be indepenedent + RAJA::atomicAdd< parallelDeviceAtomic >( &m_rhs[dof], stack.localRu[i] ); + + // Fill in matrix + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.dispColIndices, + stack.localAutAtu[i], + numUdofs ); + + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.bColIndices, + stack.localAutAtb[i], + numBdofs ); + } + + for( localIndex i=0; i < numBdofs; ++i ) + { + localIndex const dof = LvArray::integerConversion< localIndex >( stack.bEqnRowIndices[ i ] ); + + if( dof < 0 || dof >= m_matrix.numRows() ) continue; + + // Is it necessary? Each row should be indepenedent + RAJA::atomicAdd< parallelDeviceAtomic >( &m_rhs[dof], stack.localRb[i] ); + + // Fill in matrix + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.bColIndices, + stack.localAbtAtb[i], + numBdofs ); + + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.dispColIndices, + stack.localAbtAtu[i], + numUdofs ); + } + + return 0.0; + } + +protected: + + arrayView2d< real64 const > const m_traction; +}; + +/// The factory used to construct the kernel. +using ALMSimultaneousFactory = finiteElement::InterfaceKernelFactory< ALMSimultaneous, + arrayView1d< globalIndex const > const, + arrayView1d< globalIndex const > const, + globalIndex const, + CRSMatrixView< real64, globalIndex const > const, + arrayView1d< real64 > const, + real64 const, + arrayView1d< localIndex const > const >; + +/** + * @brief A struct to compute the traction after nonlinear solve + */ +struct ComputeTractionSimultaneousKernel +{ + + /** + * @brief Launch the kernel function to comute traction + * @tparam POLICY the type of policy used in the kernel launch + * @param[in] size the size of the subregion + * @param[in] penalty the array containing the tangential penalty matrix + * @param[in] traction the array containing the current traction + * @param[in] dispJump the array containing the displacement jump + * @param[in] deltaDispJump the array containing the delta displacement jump + * @param[out] tractionNew the array containing the new traction + */ + template< typename POLICY > + static void + launch( localIndex const size, + arrayView2d< real64 const > const & penalty, + arrayView2d< real64 const > const & traction, + arrayView2d< real64 const > const & dispJump, + arrayView2d< real64 const > const & deltaDispJump, + arrayView2d< real64 > const & tractionNew ) + { + + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + tractionNew[kfe][0] = traction[kfe][0] + penalty[kfe][0] * dispJump[kfe][0]; + tractionNew[kfe][1] = traction[kfe][1] + penalty[kfe][2] * deltaDispJump[kfe][1] + + penalty[kfe][4] * deltaDispJump[kfe][2]; + tractionNew[kfe][2] = traction[kfe][2] + penalty[kfe][3] * deltaDispJump[kfe][2] + + penalty[kfe][4] * deltaDispJump[kfe][1]; + } ); + } + +}; + +} // namespace SolidMechanicsALMKernels + +} // namespace geos + + +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp index f37d5e8d05d..eb9fc81049e 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -21,9 +21,13 @@ #include "SolidMechanicsAugmentedLagrangianContact.hpp" #include "physicsSolvers/contact/SolidMechanicsALMKernels.hpp" +#include "physicsSolvers/contact/SolidMechanicsALMSimultaneousKernels.hpp" #include "physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp" #include "physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp" +#include "constitutive/ConstitutiveManager.hpp" +#include "constitutive/contact/FrictionSelector.hpp" + namespace geos { @@ -95,9 +99,9 @@ void SolidMechanicsAugmentedLagrangianContact::registerDataOnMesh( dataRepositor subRegion.registerField< contact::oldDispJump >( this->getName() ). reference().resizeDimension< 1 >( 3 ); - // Register the displacement jump - subRegion.registerField< contact::penalty >( this->getName() ). - reference().resizeDimension< 1 >( 2 ); + // Register the penalty coefficients for the iterative procedure + subRegion.registerField< contact::iterativePenalty >( this->getName() ). + reference().resizeDimension< 1 >( 5 ); subRegion.registerWrapper< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ). setPlotLevel( PlotLevel::NOPLOT ). @@ -114,6 +118,12 @@ void SolidMechanicsAugmentedLagrangianContact::registerDataOnMesh( dataRepositor setRegisteringObjects( this->getName()). setDescription( "An array that holds the sliding tolerance." ); + subRegion.registerWrapper< array2d< real64 > >( viewKeyStruct::dispJumpUpdPenaltyString() ). + setPlotLevel( PlotLevel::NOPLOT ). + setRegisteringObjects( this->getName()). + setDescription( "An array that stores the displacement jumps used to update the penalty coefficients." ). + reference().resizeDimension< 1 >( 3 ); + } ); } ); @@ -147,14 +157,6 @@ void SolidMechanicsAugmentedLagrangianContact::setupDofs( DomainPartition const solidMechanics::totalBubbleDisplacement::key(), DofManager::Connector::Elem ); - // The dofManager can not create the connection due to the coupling - // between totalDisplacement and totalBubbleDisplacement - // These connection are created using the two functions - // addCouplingNumNonzeros and addCouplingSparsityPattern - // dofManager.addCoupling( solidMechanics::totalDisplacement::key(), - // solidMechanics::totalBubbleDisplacement::key(), - // DofManager::Connector::Elem); - } void SolidMechanicsAugmentedLagrangianContact::setupSystem( DomainPartition & domain, @@ -168,9 +170,12 @@ void SolidMechanicsAugmentedLagrangianContact::setupSystem( DomainPartition & do GEOS_MARK_FUNCTION; GEOS_UNUSED_VAR( setSparsity ); - // Create the list of interface elements that have same type. + // Create the lists of interface elements that have same type. createFaceTypeList( domain ); + // Create the lists of interface elements that have same type and same fracture state. + updateStickSlipList( domain ); + // Create the list of cell elements that they are enriched with bubble functions. createBubbleCellList( domain ); @@ -236,9 +241,12 @@ void SolidMechanicsAugmentedLagrangianContact::implicitStepSetup( real64 const & SurfaceElementRegion & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); FaceElementSubRegion & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); - arrayView2d< real64 const > const & faceNormal = faceManager.faceNormal(); + arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< real64 > const incrBubbleDisp = + faceManager.getField< fields::solidMechanics::incrementalBubbleDisplacement >(); + arrayView3d< real64 > const rotationMatrix = subRegion.getField< fields::contact::rotationMatrix >().toView(); @@ -249,21 +257,67 @@ void SolidMechanicsAugmentedLagrangianContact::implicitStepSetup( real64 const & elemsToFaces, rotationMatrix ); + // Set the tollerances + computeTolerances( domain ); + + // Set array to update penalty coefficients + arrayView2d< real64 > const dispJumpUpdPenalty = + subRegion.getReference< array2d< real64 > >( viewKeyStruct::dispJumpUpdPenaltyString() ); + arrayView2d< real64 > const - penalty = subRegion.getField< fields::contact::penalty >().toView(); + iterativePenalty = subRegion.getField< fields::contact::iterativePenalty >().toView(); + arrayView1d< integer const > const fractureState = subRegion.getField< contact::fractureState >(); + + if( m_simultaneous ) + { + // Set the iterative penalty coefficients + forAll< parallelDevicePolicy<> >( subRegion.size(), + [=] + GEOS_HOST_DEVICE ( localIndex const k ) + { + if( fractureState[k] == contact::FractureState::Stick ) + { + iterativePenalty[k][2] = iterativePenalty[k][1]; + iterativePenalty[k][3] = iterativePenalty[k][1]; + iterativePenalty[k][4] = 0.0; + } + else + { + iterativePenalty[k][2] = 0.0; + iterativePenalty[k][3] = 0.0; + iterativePenalty[k][4] = 0.0; + } + } ); + } - // Set the penalty coefficients - // TODO: This is only temporary. The setting of penalty will be adaptive in the final version. - forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + forAll< parallelDevicePolicy<> >( subRegion.size(), + [ = ] + GEOS_HOST_DEVICE ( localIndex const k ) { - penalty[k] [0] = 1.e+7; - penalty[k] [1] = 1.e+7; + LvArray::tensorOps::fill< 3 >( dispJumpUpdPenalty[k], 0.0 ); + localIndex const kf0 = elemsToFaces[k][0]; + localIndex const kf1 = elemsToFaces[k][1]; + LvArray::tensorOps::fill< 3 >( incrBubbleDisp[kf0], 0.0 ); + LvArray::tensorOps::fill< 3 >( incrBubbleDisp[kf1], 0.0 ); } ); + } ); + // Sync iterativePenalty + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + FieldIdentifiers fieldsToBeSync; + + fieldsToBeSync.addElementFields( { contact::iterativePenalty::key() }, + { getUniqueFractureRegionName() } ); + + CommunicationTools::getInstance().synchronizeFields( fieldsToBeSync, + mesh, + domain.getNeighbors(), + true ); } ); - // Set the tollerances - computeTolerances( domain ); } void SolidMechanicsAugmentedLagrangianContact::assembleSystem( real64 const time, @@ -288,7 +342,6 @@ void SolidMechanicsAugmentedLagrangianContact::assembleSystem( real64 const time //ParallelMatrix parallel_matrix; //parallel_matrix.create( localMatrix.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOS ); //parallel_matrix.write("mech.mtx"); - //abort(); // Loop for assembling contributes from interface elements (Aut*eps^-1*Atu and Aub*eps^-1*Abu) forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshName, @@ -308,31 +361,113 @@ void SolidMechanicsAugmentedLagrangianContact::assembleSystem( real64 const time string const & fractureRegionName = this->getUniqueFractureRegionName(); - forFiniteElementOnFractureSubRegions( meshName, [&] ( string const & finiteElementName, - arrayView1d< localIndex const > const & faceElementList ) + forFiniteElementOnStickFractureSubRegions( meshName, [&] ( string const &, + finiteElement::FiniteElementBase const & subRegionFE, + arrayView1d< localIndex const > const & faceElementList, + bool const ) { - finiteElement::FiniteElementBase & subRegionFE = *(m_faceTypeToFiniteElements[finiteElementName]); + if( m_simultaneous ) + { + solidMechanicsALMKernels::ALMSimultaneousFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + localMatrix, + localRhs, + dt, + faceElementList ); + + real64 maxTraction = finiteElement:: + interfaceBasedKernelApplication + < parallelDevicePolicy< >, + constitutive::CoulombFriction >( mesh, + fractureRegionName, + faceElementList, + subRegionFE, + viewKeyStruct::frictionLawNameString(), + kernelFactory ); + + GEOS_UNUSED_VAR( maxTraction ); - solidMechanicsALMKernels::ALMFactory kernelFactory( dispDofNumber, - bubbleDofNumber, - dofManager.rankOffset(), - localMatrix, - localRhs, - dt, - faceElementList ); + } + else + { + solidMechanicsALMKernels::ALMFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + localMatrix, + localRhs, + dt, + faceElementList, + m_symmetric ); + + real64 maxTraction = finiteElement:: + interfaceBasedKernelApplication + < parallelDevicePolicy< >, + constitutive::CoulombFriction >( mesh, + fractureRegionName, + faceElementList, + subRegionFE, + viewKeyStruct::frictionLawNameString(), + kernelFactory ); + + GEOS_UNUSED_VAR( maxTraction ); + } - real64 maxTraction = finiteElement:: - interfaceBasedKernelApplication - < parallelDevicePolicy< >, - constitutive::NullModel >( mesh, - fractureRegionName, - faceElementList, - subRegionFE, - "", - kernelFactory ); + } ); - GEOS_UNUSED_VAR( maxTraction ); + forFiniteElementOnSlipFractureSubRegions( meshName, [&] ( string const &, + finiteElement::FiniteElementBase const & subRegionFE, + arrayView1d< localIndex const > const & faceElementList, + bool const ) + { + + if( m_simultaneous ) + { + solidMechanicsALMKernels::ALMSimultaneousFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + localMatrix, + localRhs, + dt, + faceElementList ); + + real64 maxTraction = finiteElement:: + interfaceBasedKernelApplication + < parallelDevicePolicy< >, + constitutive::CoulombFriction >( mesh, + fractureRegionName, + faceElementList, + subRegionFE, + viewKeyStruct::frictionLawNameString(), + kernelFactory ); + + GEOS_UNUSED_VAR( maxTraction ); + + } + else + { + solidMechanicsALMKernels::ALMFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + localMatrix, + localRhs, + dt, + faceElementList, + m_symmetric ); + + real64 maxTraction = finiteElement:: + interfaceBasedKernelApplication + < parallelDevicePolicy< >, + constitutive::CoulombFriction >( mesh, + fractureRegionName, + faceElementList, + subRegionFE, + viewKeyStruct::frictionLawNameString(), + kernelFactory ); + + GEOS_UNUSED_VAR( maxTraction ); + } } ); @@ -384,7 +519,6 @@ void SolidMechanicsAugmentedLagrangianContact::implicitStepComplete( real64 cons DomainPartition & domain ) { - SolidMechanicsLagrangianFEM::implicitStepComplete( time_n, dt, domain ); forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -399,10 +533,16 @@ void SolidMechanicsAugmentedLagrangianContact::implicitStepComplete( real64 cons arrayView2d< real64 > const oldDispJump = subRegion.getField< contact::oldDispJump >(); arrayView2d< real64 > const deltaDispJump = subRegion.getField< contact::deltaDispJump >(); - forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const kfe ) + arrayView1d< integer const > const fractureState = subRegion.getField< contact::fractureState >(); + arrayView1d< integer > const oldFractureState = subRegion.getField< contact::oldFractureState >(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), + [ = ] + GEOS_HOST_DEVICE ( localIndex const kfe ) { LvArray::tensorOps::fill< 3 >( deltaDispJump[kfe], 0.0 ); LvArray::tensorOps::copy< 3 >( oldDispJump[kfe], dispJump[kfe] ); + oldFractureState[kfe] = fractureState[kfe]; } ); } ); @@ -441,13 +581,15 @@ real64 SolidMechanicsAugmentedLagrangianContact::calculateResidualNorm( real64 c SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); - arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); + arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); - forAll< parallelDevicePolicy<> >( subRegion.size(), [ elemsToFaces, localRhs, localSum, bubbleDofNumber, rankOffset, ghostRank] GEOS_HOST_DEVICE ( localIndex const kfe ) + forAll< parallelDevicePolicy<> >( subRegion.size(), + [ = ] + GEOS_HOST_DEVICE ( localIndex const kfe ) { if( ghostRank[kfe] < 0 ) @@ -550,12 +692,11 @@ void SolidMechanicsAugmentedLagrangianContact::applySystemSolution( DofManager c CRSMatrix< real64, globalIndex > const voidMatrix; array1d< real64 > const voidRhs; - forFiniteElementOnFractureSubRegions( meshName, [&] ( string const & finiteElementName, + forFiniteElementOnFractureSubRegions( meshName, [&] ( string const &, + finiteElement::FiniteElementBase const & subRegionFE, arrayView1d< localIndex const > const & faceElementList ) { - finiteElement::FiniteElementBase & subRegionFE = *(m_faceTypeToFiniteElements[finiteElementName]); - solidMechanicsALMKernels::ALMJumpUpdateFactory kernelFactory( dispDofNumber, bubbleDofNumber, dofManager.rankOffset(), @@ -611,10 +752,9 @@ bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartit { GEOS_MARK_FUNCTION; - int hasConfigurationConverged = true; - int condConv = true; - // TODO: This function's design is temporary and intended solely for testing the stick mode. - // In the final version the parallelHostPolicy will be substitute with the parallelDevicePolicy<>. + array1d< int > condConv; + localIndex globalCondConv[5] = {0, 0, 0, 0, 0}; + array2d< real64 > traction_new; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -627,12 +767,16 @@ bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartit FaceElementSubRegion & subRegion ) { - arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); + string const & frictionLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + FrictionBase const & frictionLaw = getConstitutiveModel< FrictionBase >( subRegion, frictionLawName ); + + arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); arrayView2d< real64 const > const traction = subRegion.getField< contact::traction >(); arrayView2d< real64 const > const dispJump = subRegion.getField< contact::dispJump >(); arrayView2d< real64 const > const deltaDispJump = subRegion.getField< contact::deltaDispJump >(); - arrayView2d< real64 const > const penalty = subRegion.getField< contact::penalty >(); + arrayView2d< real64 const > const iterativePenalty = subRegion.getField< contact::iterativePenalty >(); + arrayView1d< integer const > const fractureState = subRegion.getField< contact::fractureState >(); arrayView1d< real64 const > const normalDisplacementTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalDisplacementToleranceString() ); @@ -641,95 +785,317 @@ bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartit arrayView1d< real64 const > const & normalTractionTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ); + arrayView1d< real64 const > const area = subRegion.getElementArea().toViewConst(); + std::ptrdiff_t const sizes[ 2 ] = {subRegion.size(), 3}; traction_new.resize( 2, sizes ); arrayView2d< real64 > const traction_new_v = traction_new.toView(); - // TODO: Create a Kernel to update Traction - forAll< parallelHostPolicy >( subRegion.size(), - [ traction_new_v, traction, penalty, dispJump, deltaDispJump ] ( localIndex const kfe ) + condConv.resize( subRegion.size()); + arrayView1d< int > const condConv_v = condConv.toView(); + + // Update the traction field based on the displacement results from the nonlinear solve + constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) { - real64 eps_N = penalty[kfe][0]; - real64 eps_T = penalty[kfe][1]; - traction_new_v[kfe][0] = traction[kfe][0] + eps_N * dispJump[kfe][0]; - traction_new_v[kfe][1] = traction[kfe][1] + eps_T * deltaDispJump[kfe][1]; - traction_new_v[kfe][2] = traction[kfe][2] + eps_T * deltaDispJump[kfe][2]; + using FrictionType = TYPEOFREF( castedFrictionLaw ); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelUpdates(); + + if( m_simultaneous ) + { + solidMechanicsALMKernels::ComputeTractionSimultaneousKernel:: + launch< parallelDevicePolicy<> >( subRegion.size(), + iterativePenalty, + traction, + dispJump, + deltaDispJump, + traction_new_v ); + } + else + { + solidMechanicsALMKernels::ComputeTractionKernel:: + launch< parallelDevicePolicy<> >( subRegion.size(), + frictionWrapper, + iterativePenalty, + traction, + dispJump, + deltaDispJump, + traction_new_v ); + } + } ); + + real64 const slidingCheckTolerance = m_slidingCheckTolerance; + + constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) + { + using FrictionType = TYPEOFREF( castedFrictionLaw ); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelUpdates(); + + solidMechanicsALMKernels::ConstraintCheckKernel:: + launch< parallelDevicePolicy<> >( subRegion.size(), + frictionWrapper, + ghostRank, + traction_new_v, + dispJump, + deltaDispJump, + normalTractionTolerance, + normalDisplacementTolerance, + slidingTolerance, + slidingCheckTolerance, + area, + fractureState, + condConv_v ); } ); - forAll< parallelHostPolicy >( subRegion.size(), - [ &condConv, ghostRank, traction_new_v, normalTractionTolerance, normalDisplacementTolerance, slidingTolerance, deltaDispJump, dispJump ] ( localIndex const kfe ) + RAJA::ReduceSum< parallelDeviceReduce, localIndex > localSum[5] = + { RAJA::ReduceSum< parallelDeviceReduce, localIndex >( 0 ), + RAJA::ReduceSum< parallelDeviceReduce, localIndex >( 0 ), + RAJA::ReduceSum< parallelDeviceReduce, localIndex >( 0 ), + RAJA::ReduceSum< parallelDeviceReduce, localIndex >( 0 ), + RAJA::ReduceSum< parallelDeviceReduce, localIndex >( 0 ) }; + forAll< parallelDevicePolicy<> >( subRegion.size(), [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) { if( ghostRank[kfe] < 0 ) { - if( traction_new_v[kfe][0] >= normalTractionTolerance[kfe] ) - { - GEOS_ERROR( "Unsuported open mode! Only stick mode is supported with ALM" ); - } - else + localSum[condConv_v[kfe]] += 1; + } + } ); + + localIndex const localConvCond[5] = { static_cast< localIndex >( localSum[0].get()), + static_cast< localIndex >( localSum[1].get()), + static_cast< localIndex >( localSum[2].get()), + static_cast< localIndex >( localSum[3].get()), + static_cast< localIndex >( localSum[4].get()) }; + + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); + int const numRanks = MpiWrapper::commSize( MPI_COMM_GEOS ); + array1d< localIndex > globalValues( numRanks * 5 ); + + // Everything is done on rank 0 + MpiWrapper::gather( localConvCond, + 5, + globalValues.data(), + 5, + 0, + MPI_COMM_GEOS ); + + if( rank==0 ) + { + for( int r=0; r normalDisplacementTolerance[kfe] ) - { - //GEOS_LOG_LEVEL(2, - //GEOS_FMT( " Element: {}, Stick mode and g_n > tol1 => compenetration, g_n: {:4.2e} tol1: {:4.2e}", - //kfe,std::abs(dispJump[kfe][0]), normalDisplacementTolerance[kfe] )) - condConv = false; - } - if( deltaDisp > slidingTolerance[kfe] ) - { - //GEOS_LOG_LEVEL(2, - //GEOS_FMT( " Element: {}, Stick and dg_t > tol2, dg_t: {:4.2e} tol2: {:4.2e}", - //kfe, deltaDisp, slidingTolerance[kfe] )) - condConv = false; - } + globalCondConv[i] += globalValues[r*5+i]; } } - } ); + } + + MpiWrapper::bcast( globalCondConv, 5, 0, MPI_COMM_GEOS ); } ); } ); - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + localIndex totCondNotConv = 0; + for( int i=0; i<4; ++i ) { - ElementRegionManager & elemManager = mesh.getElemManager(); + totCondNotConv+=globalCondConv[i+1]; + } - elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, - FaceElementSubRegion & subRegion ) + int hasConfigurationConvergedGlobally = (totCondNotConv == 0) ? true : false; + + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " ALM convergence summary:" + " converged: {:6} | stick & gn>0: {:6} | compenetration: {:6} | stick & gt>lim: {:6} | tau>tauLim: {:6}\n", + globalCondConv[0], globalCondConv[1], globalCondConv[2], + globalCondConv[3], globalCondConv[4] )); + + if( hasConfigurationConvergedGlobally ) + { + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { + ElementRegionManager & elemManager = mesh.getElemManager(); - arrayView2d< real64 > const traction_new_v = traction_new.toView(); - arrayView2d< real64 > const traction = subRegion.getField< contact::traction >(); - forAll< parallelHostPolicy >( subRegion.size(), [ traction, traction_new_v ] ( localIndex const kfe ) + elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, + FaceElementSubRegion & subRegion ) { - traction[kfe][0] = traction_new_v( kfe, 0 ); - traction[kfe][1] = traction_new_v( kfe, 1 ); - traction[kfe][2] = traction_new_v( kfe, 2 ); + + arrayView2d< real64 > const traction_new_v = traction_new.toView(); + arrayView2d< real64 > const traction = subRegion.getField< contact::traction >(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + LvArray::tensorOps::copy< 3 >( traction[kfe], traction_new_v[kfe] ); + } ); } ); } ); - } ); - - if( !condConv ) + } + else { - hasConfigurationConverged = false; + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + + elemManager.forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, + FaceElementSubRegion & subRegion ) + { + + string const & frictionLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + FrictionBase const & frictionLaw = getConstitutiveModel< FrictionBase >( subRegion, frictionLawName ); + + arrayView2d< real64 > const traction = subRegion.getField< contact::traction >(); + + arrayView1d< real64 const > const normalTractionTolerance = + subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ); + + arrayView2d< real64 > const iterativePenalty = subRegion.getField< fields::contact::iterativePenalty >().toView(); + + arrayView2d< real64 > const dispJumpUpdPenalty = + subRegion.getReference< array2d< real64 > >( viewKeyStruct::dispJumpUpdPenaltyString() ); + + arrayView1d< integer > const fractureState = subRegion.getField< contact::fractureState >(); + + arrayView2d< real64 const > const dispJump = subRegion.getField< contact::dispJump >(); + + arrayView2d< real64 const > const oldDispJump = subRegion.getField< contact::oldDispJump >(); + + arrayView2d< real64 const > const deltaDispJump = subRegion.getField< contact::deltaDispJump >(); + + constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) + { + using FrictionType = TYPEOFREF( castedFrictionLaw ); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelUpdates(); + + solidMechanicsALMKernels::UpdateStateKernel:: + launch< parallelDevicePolicy<> >( subRegion.size(), + frictionWrapper, + oldDispJump, + dispJump, + iterativePenalty, + m_symmetric, + normalTractionTolerance, + traction, + fractureState ); + } ); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [ = ] + GEOS_HOST_DEVICE ( localIndex const kfe ) + { + dispJumpUpdPenalty[kfe][0] = dispJump[kfe][0]; + dispJumpUpdPenalty[kfe][1] = deltaDispJump[kfe][1]; + dispJumpUpdPenalty[kfe][2] = deltaDispJump[kfe][2]; + } ); + } ); + } ); } // Need to synchronize the fracture state due to the use will be made of in AssemblyStabilization synchronizeFractureState( domain ); - // Compute if globally the fracture state has changed - int hasConfigurationConvergedGlobally; - MpiWrapper::allReduce( &hasConfigurationConverged, - &hasConfigurationConvergedGlobally, - 1, - MPI_LAND, - MPI_COMM_GEOS ); + // Update lists of stick and slip elements + if( !hasConfigurationConvergedGlobally ) + { + updateStickSlipList( domain ); + } return hasConfigurationConvergedGlobally; } +void SolidMechanicsAugmentedLagrangianContact::updateStickSlipList( DomainPartition const & domain ) +{ + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshName, + MeshLevel const & mesh, + arrayView1d< string const > const & ) + + { + + ElementRegionManager const & elemManager = mesh.getElemManager(); + SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + + arrayView1d< integer const > const fractureState = subRegion.getField< contact::fractureState >(); + + forFiniteElementOnFractureSubRegions( meshName, [&] ( string const & finiteElementName, + finiteElement::FiniteElementBase const &, + arrayView1d< localIndex const > const & faceElementList ) + { + + array1d< localIndex > keys( subRegion.size()); + array1d< localIndex > vals( subRegion.size()); + array1d< localIndex > stickList; + array1d< localIndex > slipList; + RAJA::ReduceSum< ReducePolicy< parallelDevicePolicy<> >, localIndex > nStick_r( 0 ); + RAJA::ReduceSum< ReducePolicy< parallelDevicePolicy<> >, localIndex > nSlip_r( 0 ); + + arrayView1d< localIndex > const keys_v = keys.toView(); + arrayView1d< localIndex > const vals_v = vals.toView(); + forAll< parallelDevicePolicy<> >( faceElementList.size(), + [ = ] + GEOS_HOST_DEVICE ( localIndex const kfe ) + { + + localIndex const faceIndex = faceElementList[kfe]; + if( fractureState[faceIndex] == contact::FractureState::Stick ) + { + keys_v[kfe]=0; + vals_v[kfe]=faceIndex; + nStick_r += 1; + } + else if(( fractureState[faceIndex] == contact::FractureState::Slip ) || + (fractureState[faceIndex] == contact::FractureState::NewSlip)) + { + keys_v[kfe]=1; + vals_v[kfe]=faceIndex; + nSlip_r += 1; + } + else + { + keys_v[kfe] = 2; + } + + } ); + + localIndex nStick = static_cast< localIndex >(nStick_r.get()); + localIndex nSlip = static_cast< localIndex >(nSlip_r.get()); + + // Sort vals according to keys to ensure that + // elements of the same type are adjacent in the vals list. + // This arrangement allows for efficient copying into the container + // by leveraging parallelism. + RAJA::sort_pairs< parallelDevicePolicy<> >( keys_v, vals_v ); + + stickList.resize( nStick ); + slipList.resize( nSlip ); + arrayView1d< localIndex > const stickList_v = stickList.toView(); + arrayView1d< localIndex > const slipList_v = slipList.toView(); + + forAll< parallelDevicePolicy<> >( nStick, [ = ] + GEOS_HOST_DEVICE ( localIndex const kfe ) + { + stickList_v[kfe] = vals_v[kfe]; + } ); + + forAll< parallelDevicePolicy<> >( nSlip, [ = ] + GEOS_HOST_DEVICE ( localIndex const kfe ) + { + slipList_v[kfe] = vals_v[nStick+kfe]; + } ); + + this->m_faceTypesToFaceElementsStick[meshName][finiteElementName] = stickList; + this->m_faceTypesToFaceElementsSlip[meshName][finiteElementName] = slipList; + + GEOS_LOG_LEVEL( 2, + GEOS_FMT( "# stick elements: {}, # slip elements: {}", nStick, nSlip )) + } ); + } ); + +} + void SolidMechanicsAugmentedLagrangianContact::createFaceTypeList( DomainPartition const & domain ) { @@ -756,7 +1122,8 @@ void SolidMechanicsAugmentedLagrangianContact::createFaceTypeList( DomainPartiti arrayView1d< localIndex > const vals_v = vals.toView(); // Determine the size of the lists and generate the vector keys and vals for parallel indexing into lists. // (With RAJA, parallelizing this operation seems the most viable approach.) - forAll< parallelDevicePolicy<> >( subRegion.size(), [ nTri_r, nQuad_r, faceToNodeMap, keys_v, vals_v ] GEOS_HOST_DEVICE ( localIndex const kfe ) + forAll< parallelDevicePolicy<> >( subRegion.size(), + [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) { localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( kfe ); @@ -792,12 +1159,12 @@ void SolidMechanicsAugmentedLagrangianContact::createFaceTypeList( DomainPartiti arrayView1d< localIndex > const quadList_v = quadList.toView(); arrayView1d< localIndex > const triList_v = triList.toView(); - forAll< parallelDevicePolicy<> >( nTri, [triList_v, vals_v] GEOS_HOST_DEVICE ( localIndex const kfe ) + forAll< parallelDevicePolicy<> >( nTri, [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) { triList_v[kfe] = vals_v[kfe]; } ); - forAll< parallelDevicePolicy<> >( nQuad, [quadList_v, vals_v, nTri] GEOS_HOST_DEVICE ( localIndex const kfe ) + forAll< parallelDevicePolicy<> >( nQuad, [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) { quadList_v[kfe] = vals_v[nTri+kfe]; } ); @@ -819,6 +1186,7 @@ void SolidMechanicsAugmentedLagrangianContact::createBubbleCellList( DomainParti SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + // Array to store face indexes array1d< localIndex > tmpSpace( 2*subRegion.size()); SortedArray< localIndex > faceIdList; @@ -827,7 +1195,7 @@ void SolidMechanicsAugmentedLagrangianContact::createBubbleCellList( DomainParti { ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); - forAll< parallelDevicePolicy<> >( subRegion.size(), [ tmpSpace_v, elemsToFaces ] GEOS_HOST_DEVICE ( localIndex const kfe ) + forAll< parallelDevicePolicy<> >( subRegion.size(), [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) { localIndex const kf0 = elemsToFaces[kfe][0], kf1 = elemsToFaces[kfe][1]; @@ -862,7 +1230,7 @@ void SolidMechanicsAugmentedLagrangianContact::createBubbleCellList( DomainParti SortedArrayView< localIndex const > const faceIdList_v = faceIdList.toViewConst(); forAll< parallelDevicePolicy<> >( cellElementSubRegion.size(), - [ keys_v, vals_v, perms_v, localFaceIds_v, nBubElems_r, elemsToFaces, faceIdList_v ] + [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) { for( int i=0; i < elemsToFaces.size( 1 ); ++i ) @@ -896,18 +1264,18 @@ void SolidMechanicsAugmentedLagrangianContact::createBubbleCellList( DomainParti arrayView1d< localIndex > const bubbleElemsList_v = bubbleElemsList.toView(); - forAll< parallelDevicePolicy<> >( n_max, [ keys_v, vals_v, perms_v ] GEOS_HOST_DEVICE ( localIndex const k ) + forAll< parallelDevicePolicy<> >( n_max, [ = ] GEOS_HOST_DEVICE ( localIndex const k ) { keys_v[k] = vals_v[perms_v[k]]; } ); - forAll< parallelDevicePolicy<> >( nBubElems, [ bubbleElemsList_v, keys_v ] GEOS_HOST_DEVICE ( localIndex const k ) + forAll< parallelDevicePolicy<> >( nBubElems, [ = ] GEOS_HOST_DEVICE ( localIndex const k ) { bubbleElemsList_v[k] = keys_v[k]; } ); cellElementSubRegion.setBubbleElementsList( bubbleElemsList.toViewConst()); - forAll< parallelDevicePolicy<> >( n_max, [ keys_v, localFaceIds_v, perms_v ] GEOS_HOST_DEVICE ( localIndex const k ) + forAll< parallelDevicePolicy<> >( n_max, [ = ] GEOS_HOST_DEVICE ( localIndex const k ) { keys_v[k] = localFaceIds_v[perms_v[k]]; } ); @@ -918,7 +1286,7 @@ void SolidMechanicsAugmentedLagrangianContact::createBubbleCellList( DomainParti arrayView2d< localIndex > const faceElemsList_v = faceElemsList.toView(); forAll< parallelDevicePolicy<> >( nBubElems, - [ faceElemsList_v, keys_v, elemsToFaces, bubbleElemsList_v ] + [ = ] GEOS_HOST_DEVICE ( localIndex const k ) { localIndex const kfe = bubbleElemsList_v[k]; @@ -1193,7 +1561,6 @@ void SolidMechanicsAugmentedLagrangianContact::addCouplingSparsityPattern( Domai } -// TODO: Is it possible to define this method once? Similar to SolidMechanicsLagrangeContact void SolidMechanicsAugmentedLagrangianContact::computeTolerances( DomainPartition & domain ) const { GEOS_MARK_FUNCTION; @@ -1208,16 +1575,16 @@ void SolidMechanicsAugmentedLagrangianContact::computeTolerances( DomainPartitio // Get the "face to element" map (valid for the entire mesh) FaceManager::ElemMapType const & faceToElem = faceManager.toElementRelation(); - arrayView2d< localIndex const > const & faceToElemRegion = faceToElem.m_toElementRegion; - arrayView2d< localIndex const > const & faceToElemSubRegion = faceToElem.m_toElementSubRegion; - arrayView2d< localIndex const > const & faceToElemIndex = faceToElem.m_toElementIndex; + arrayView2d< localIndex const > const faceToElemRegion = faceToElem.m_toElementRegion; + arrayView2d< localIndex const > const faceToElemSubRegion = faceToElem.m_toElementSubRegion; + arrayView2d< localIndex const > const faceToElemIndex = faceToElem.m_toElementIndex; // Get the volume for all elements ElementRegionManager::ElementViewAccessor< arrayView1d< real64 const > > const elemVolume = elemManager.constructViewAccessor< array1d< real64 >, arrayView1d< real64 const > >( ElementSubRegionBase::viewKeyStruct::elementVolumeString() ); // Get the coordinates for all nodes - arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const & nodePosition = nodeManager.referencePosition(); + arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const nodePosition = nodeManager.referencePosition(); // Bulk modulus accessor ElementRegionManager::ElementViewAccessor< arrayView1d< real64 const > > const bulkModulus = @@ -1235,20 +1602,25 @@ void SolidMechanicsAugmentedLagrangianContact::computeTolerances( DomainPartitio { if( subRegion.hasField< contact::traction >() ) { - arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); - arrayView1d< real64 const > const & faceArea = subRegion.getElementArea().toViewConst(); - arrayView3d< real64 const > const & faceRotationMatrix = subRegion.getField< fields::contact::rotationMatrix >().toView(); - ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + arrayView1d< real64 const > const faceArea = subRegion.getElementArea().toViewConst(); + arrayView3d< real64 const > const faceRotationMatrix = subRegion.getField< fields::contact::rotationMatrix >().toView(); + ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); - arrayView1d< real64 > const & normalTractionTolerance = + arrayView1d< real64 > const normalTractionTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ); - arrayView1d< real64 > const & normalDisplacementTolerance = + arrayView1d< real64 > const normalDisplacementTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalDisplacementToleranceString() ); - arrayView1d< real64 > const & slidingTolerance = + arrayView1d< real64 > const slidingTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::slidingToleranceString() ); + arrayView2d< real64 > const + iterativePenalty = subRegion.getField< fields::contact::iterativePenalty >().toView(); + + arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); + forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { + if( ghostRank[kfe] < 0 ) { real64 const area = faceArea[kfe]; @@ -1330,10 +1702,13 @@ void SolidMechanicsAugmentedLagrangianContact::computeTolerances( DomainPartitio LvArray::tensorOps::scale< 3, 3 >( rotatedInvStiffApprox, area ); // Finally, compute tolerances for the given fracture element - normalDisplacementTolerance[kfe] = rotatedInvStiffApprox[ 0 ][ 0 ] * averageYoungModulus / 2.e+8; - slidingTolerance[kfe] = sqrt( rotatedInvStiffApprox[ 1 ][ 1 ] * rotatedInvStiffApprox[ 1 ][ 1 ] + - rotatedInvStiffApprox[ 2 ][ 2 ] * rotatedInvStiffApprox[ 2 ][ 2 ] ) * averageYoungModulus / 2.e+8; - normalTractionTolerance[kfe] = 1.0 / 2.0 * averageConstrainedModulus / averageBoxSize0 * normalDisplacementTolerance[kfe]; + normalDisplacementTolerance[kfe] = rotatedInvStiffApprox[ 0 ][ 0 ] * averageYoungModulus / 2.e+7; + slidingTolerance[kfe] = sqrt( pow( rotatedInvStiffApprox[ 1 ][ 1 ], 2 ) + + pow( rotatedInvStiffApprox[ 2 ][ 2 ], 2 )) * averageYoungModulus / 2.e+5; + normalTractionTolerance[kfe] = (1.0 / 2.0) * (averageConstrainedModulus / averageBoxSize0) * + (normalDisplacementTolerance[kfe]); + iterativePenalty[kfe][0] = 1e+01*averageConstrainedModulus/(averageBoxSize0*area); + iterativePenalty[kfe][1] = 1e-01*averageConstrainedModulus/(averageBoxSize0*area); } } ); } diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp index c11bd493159..54ffa40bab7 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp @@ -108,11 +108,76 @@ class SolidMechanicsAugmentedLagrangianContact : public ContactSolverBase for( const auto & [finiteElementName, faceElementList] : faceTypesToFaceElements ) { arrayView1d< localIndex const > const faceElemList = faceElementList.toViewConst(); - lambda( finiteElementName, faceElemList ); + + finiteElement::FiniteElementBase const & subRegionFE = *(m_faceTypeToFiniteElements.at( finiteElementName )); + + lambda( finiteElementName, subRegionFE, faceElemList ); } } + /** + * @brief Loop over the finite element type on the stick fracture subregions of meshName and apply callback. + * @tparam LAMBDA The callback function type + * @param meshName The mesh name. + * @param lambda The callback function. Take the finite element type name and + * the list of face element of the same type. + */ + template< typename LAMBDA > + void forFiniteElementOnStickFractureSubRegions( string const & meshName, LAMBDA && lambda ) const + { + + bool const isStickState = true; + + std::map< string, array1d< localIndex > > const & + faceTypesToFaceElements = m_faceTypesToFaceElementsStick.at( meshName ); + + for( const auto & [finiteElementName, faceElementList] : faceTypesToFaceElements ) + { + arrayView1d< localIndex const > const faceElemList = faceElementList.toViewConst(); + + finiteElement::FiniteElementBase const & subRegionFE = *(m_faceTypeToFiniteElements.at( finiteElementName )); + + lambda( finiteElementName, subRegionFE, faceElemList, isStickState ); + } + + } + + /** + * @brief Loop over the finite element type on the slip fracture subregions of meshName and apply callback. + * @tparam LAMBDA The callback function type + * @param meshName The mesh name. + * @param lambda The callback function. Take the finite element type name and + * the list of face element of the same type. + */ + template< typename LAMBDA > + void forFiniteElementOnSlipFractureSubRegions( string const & meshName, LAMBDA && lambda ) const + { + + bool const isStickState = false; + + std::map< string, array1d< localIndex > > const & + faceTypesToFaceElements = m_faceTypesToFaceElementsSlip.at( meshName ); + + for( const auto & [finiteElementName, faceElementList] : faceTypesToFaceElements ) + { + arrayView1d< localIndex const > const faceElemList = faceElementList.toViewConst(); + + finiteElement::FiniteElementBase const & subRegionFE = *(m_faceTypeToFiniteElements.at( finiteElementName )); + + lambda( finiteElementName, subRegionFE, faceElemList, isStickState ); + } + + } + + /** + * @brief Create the list of finite elements of the same type + * for each FaceElementSubRegion (Triangle or Quadrilateral) + * and of the same fracture state (Stick or Slip). + * @param domain The physical domain object + */ + void updateStickSlipList( DomainPartition const & domain ); + /** * @brief Create the list of finite elements of the same type * for each FaceElementSubRegion (Triangle or Quadrilateral). @@ -155,6 +220,12 @@ class SolidMechanicsAugmentedLagrangianContact : public ContactSolverBase /// Finite element type to face element index map std::map< string, std::map< string, array1d< localIndex > > > m_faceTypesToFaceElements; + /// Finite element type to face element index map (stick mode) + std::map< string, std::map< string, array1d< localIndex > > > m_faceTypesToFaceElementsStick; + + /// Finite element type to face element index map (slip mode) + std::map< string, std::map< string, array1d< localIndex > > > m_faceTypesToFaceElementsSlip; + /// Finite element type to finite element object map std::map< string, std::unique_ptr< geos::finiteElement::FiniteElementBase > > m_faceTypeToFiniteElements; @@ -166,8 +237,21 @@ class SolidMechanicsAugmentedLagrangianContact : public ContactSolverBase constexpr static char const * normalTractionToleranceString() { return "normalTractionTolerance"; } constexpr static char const * slidingToleranceString() { return "slidingTolerance"; } + + constexpr static char const * dispJumpUpdPenaltyString() { return "dispJumpUpdPenalty"; } }; + /// Tolerance for the sliding check: the tangential traction must exceed (1 + m_slidingCheckTolerance) * t_lim to activate the sliding + /// condition + real64 const m_slidingCheckTolerance = 0.05; + + /// Flag to update the Lagrange multiplier at each Newton iteration (true), or only after the Newton loop has converged (false) + bool m_simultaneous = true; + + /// Flag to neglect the non-symmetric contribution in the tangential matrix, i.e., the derivative of tangential traction with respect to + /// the normal displacement is neglected + bool m_symmetric = true; + }; } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index df8976ed422..90f33a650e0 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -740,7 +740,7 @@ void SolidMechanicsEmbeddedFractures::updateState( DomainPartition & domain ) constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) { using FrictionType = TYPEOFREF( castedFrictionLaw ); - typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelWrapper(); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelUpdates(); solidMechanicsEFEMKernels::StateUpdateKernel:: launch< parallelDevicePolicy<> >( subRegion.size(), @@ -776,7 +776,7 @@ bool SolidMechanicsEmbeddedFractures::updateConfiguration( DomainPartition & dom constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) { using FrictionType = TYPEOFREF( castedFrictionLaw ); - typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelWrapper(); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelUpdates(); RAJA::ReduceMin< parallelHostReduce, integer > checkActiveSetSub( 1 ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index e943728e7f0..2b66ae59da0 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -1476,7 +1476,7 @@ void SolidMechanicsLagrangeContact:: constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) { using FrictionType = TYPEOFREF( castedFrictionLaw ); - typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelWrapper(); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelUpdates(); forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { @@ -2250,7 +2250,7 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) { using FrictionType = TYPEOFREF( castedFrictionLaw ); - typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelWrapper(); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelUpdates(); forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/Example.rst index a1019bac817..6714806e81f 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/Example.rst @@ -14,11 +14,15 @@ method `(Phan et al., 2003) :end-before: @@ -78,7 +82,7 @@ with one group of cell blocks named here ``cb1``. Refinement is necessary to conform with the fracture geometry specified in the ``Geometry`` section. -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/TFrac_base.xml :language: xml :start-after: :end-before: @@ -124,7 +128,7 @@ A homogeneous and isotropic domain with one solid material is assumed, and its m Fracture surface slippage is assumed to be governed by the Coulomb failure criterion. The contact constitutive behavior is named ``fractureMaterial`` in the ``Coulomb`` block, where cohesion ``cohesion="0.0"`` and friction coefficient ``frictionCoefficient="0.577350269"`` are specified. -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/TFrac_base.xml :language: xml :start-after: :end-before: @@ -145,7 +149,7 @@ In the ``Tasks`` section, ``PackCollection`` tasks are defined to collect time h Either the entire field or specified named sets of indices in the field can be collected. In this example, ``tractionCollection`` and ``displacementJumpCollection`` tasks are specified to output the local traction ``fieldName="traction"`` and relative displacement ``fieldName="displacementJump"`` on the fracture surface. -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/TFrac_base.xml :language: xml :start-after: :end-before: @@ -171,7 +175,7 @@ The remaining parts of the outer boundaries are subjected to roller constraints. These boundary conditions are set up through the ``FieldSpecifications`` section. -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/TFrac_base.xml :language: xml :start-after: :end-before: diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py index 2aa2ffa8fdf..ac6f796ed04 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/intersectFrac/intersectFracFigure.py @@ -105,7 +105,7 @@ def main(): geosDir = args.geosDir hdf5File1Path = outputDir + "/traction_history.hdf5" hdf5File2Path = outputDir + "/displacementJump_history.hdf5" - xmlFilePath = geosDir + "/inputFiles/lagrangianContactMechanics/ContactMechanics_TFrac_base.xml" + xmlFilePath = geosDir + "/inputFiles/lagrangianContactMechanics/TFrac_base.xml" # Read HDF5 # Global Coordinate of Fracture Element Center diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/Example.rst index c34a6cf30cb..4b29541ce9d 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/Example.rst @@ -13,11 +13,15 @@ In this example, a single fracture is simulated using a Lagrange contact model i **Input file** -Everything required is contained within two GEOS input files and one mesh file located at: +Everything required is contained within these GEOS input files and one mesh file located at: .. code-block:: console - inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml + inputFiles/lagrangianContactMechanics/SingleFracCompression_base.xml + +.. code-block:: console + + inputFiles/lagrangianContactMechanics/SingleFracCompression_benchmark.xml .. code-block:: console @@ -79,7 +83,7 @@ The syntax to import external meshes is simple: in the XML file, the mesh file ``crackInPlane_benchmark.vtu`` is included with its relative or absolute path to the location of the GEOS XML file and a user-specified label (here ``CubeHex``) is given to the mesh object. This unstructured mesh contains quadrilaterals elements and interface elements. Refinement is performed to conform with the fracture geometry specified in the ``Geometry`` section. -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_benchmark.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/SingleFracCompression_benchmark.xml :language: xml :start-after: :end-before: @@ -110,7 +114,7 @@ To setup a coupling between rock and fracture deformations, we define three diff - The solver ``SurfaceGenerator`` defines the fracture region and rock toughness. -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_benchmark.xml :language: xml :start-after: :end-before: @@ -124,7 +128,7 @@ For this specific problem, we simulate the elastic deformation and fracture slip Fracture surface slippage is assumed to be governed by the Coulomb failure criterion. The contact constitutive behavior is named ``fractureMaterial`` in the ``Coulomb`` block, where cohesion ``cohesion="0.0"`` and friction coefficient ``frictionCoefficient="0.577350269"`` are specified. -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/SingleFracCompression_base.xml :language: xml :start-after: :end-before: @@ -145,7 +149,7 @@ In the ``Tasks`` section, ``PackCollection`` tasks are defined to collect time h Either the entire field or specified named sets of indices in the field can be collected. In this example, ``tractionCollection`` and ``displacementJumpCollection`` tasks are specified to output the local traction ``fieldName="traction"`` and relative displacement ``fieldName="displacementJump"`` on the fracture surface. -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/SingleFracCompression_base.xml :language: xml :start-after: :end-before: @@ -170,7 +174,7 @@ The remaining parts of the outer boundaries are subjected to roller constraints. These boundary conditions are set up through the ``FieldSpecifications`` section. -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/SingleFracCompression_base.xml :language: xml :start-after: :end-before: diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py index 01513ae946d..32afe5d42b2 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/singleFracCompression/singleFracCompressionFigure.py @@ -96,8 +96,8 @@ def main(): geosDir = args.geosDir hdf5File1Path = outputDir + "/traction_history.hdf5" hdf5File2Path = outputDir + "/displacementJump_history.hdf5" - xmlFile1Path = geosDir + "/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_base.xml" - xmlFile2Path = geosDir + "/inputFiles/lagrangianContactMechanics/ContactMechanics_SingleFracCompression_benchmark.xml" + xmlFile1Path = geosDir + "/inputFiles/lagrangianContactMechanics/SingleFracCompression_base.xml" + xmlFile2Path = geosDir + "/inputFiles/lagrangianContactMechanics/SingleFracCompression_benchmark.xml" # Read HDF5 # Global Coordinate of Fracture Element Center diff --git a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/Example.rst b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/Example.rst index 65a1ad48d5e..c8a81833630 100644 --- a/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/Example.rst +++ b/src/docs/sphinx/advancedExamples/validationStudies/faultMechanics/sneddon/Example.rst @@ -29,8 +29,9 @@ The xml input files for the case with LagrangianContact solver are located at: .. code-block:: console - inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_base.xml - inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_benchmark.xml + inputFiles/lagrangianContactMechanics/Sneddon_base.xml + inputFiles/lagrangianContactMechanics/Sneddon_benchmark.xml + inputFiles/lagrangianContactMechanics/ContactMechanics_Sneddon_benchmark.xml The xml input files for the case with HydroFracture solver are located at: @@ -99,7 +100,7 @@ To setup a coupling between rock and fracture deformations in LagrangianContact - The solver ``SurfaceGenerator`` defines the fracture region and rock toughness. -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_benchmark.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/ContactMechanics_Sneddon_benchmark.xml :language: xml :start-after: :end-before: @@ -155,7 +156,7 @@ along the Z axes, 121 elements along the X axis and 921 elements along the Y axi The mesh for the case with LagrangianContact solver was also created using the internal mesh generator, as parametrized in the ``InternalMesh`` XML tag. The mesh discretizes the same compational domain (:math:`40\, m \, \times 40 \, m \, \times 1 \, m`) with 300 x 300 x 2 eight-node brick elements in the x, y, and z directions respectively. -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_benchmark.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/Sneddon_benchmark.xml :language: xml :start-after: :end-before: @@ -209,7 +210,7 @@ The static fracture is defined by a nodeset occupying a small region within the - The test case with LagrangianContact solver: -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_base.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/Sneddon_base.xml :language: xml :start-after: :end-before: @@ -242,7 +243,7 @@ In this example, a task is specified to output fracture aperture (normal opening - The test case with LagrangianContact solver: -.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_base.xml +.. literalinclude:: ../../../../../../../inputFiles/lagrangianContactMechanics/Sneddon_base.xml :language: xml :start-after: :end-before: @@ -271,7 +272,7 @@ To run these three cases, use the following commands: ``path/to/geos -i inputFiles/efemFractureMechanics/Sneddon_embeddedFrac_verification.xml`` -``path/to/geos -i inputFiles/lagrangianContactMechanics/Sneddon_contactMechanics_benchmark.xml`` +``path/to/geos -i inputFiles/lagrangianContactMechanics/ContactMechanics_Sneddon_benchmark.xml`` ``path/to/geos -i inputFiles/hydraulicFracturing/Sneddon_hydroFrac_benchmark.xml`` From 7ff234904e7f1be38d8c1197e422186b4c12df4a Mon Sep 17 00:00:00 2001 From: Nicola Castelletto <38361926+castelletto1@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:03:19 -0700 Subject: [PATCH 202/286] refactor: mixture density computation in multiphase poromechanics solvers (#3342) * Simplifying body force computation --- .../multiphysics/MultiphasePoromechanics.cpp | 2 +- .../MultiphasePoromechanics.hpp | 40 +++++++++++-------- .../MultiphasePoromechanics_impl.hpp | 35 ++++------------ .../ThermalMultiphasePoromechanics_impl.hpp | 26 ++---------- 4 files changed, 36 insertions(+), 67 deletions(-) diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index f1833a12b7e..476ebc35a94 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -296,7 +296,7 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateBulkDensity // update the bulk density poromechanicsKernels:: MultiphaseBulkDensityKernelFactory:: - createAndLaunch< parallelDevicePolicy<> >( this->flowSolver()->numFluidPhases(), + createAndLaunch< parallelDevicePolicy<> >( this->flowSolver()->numFluidComponents(), fluid, solid, subRegion ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp index af42e77b4d4..a0f81fce935 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp @@ -342,8 +342,10 @@ class MultiphasePoromechanics : arrayView3d< real64 const, compflow::USD_COMP_DC > const m_dGlobalCompFraction_dGlobalCompDensity; // Views on component densities + bool m_useMass; arrayView2d< real64 const, compflow::USD_COMP > m_compDens; arrayView2d< real64 const, compflow::USD_COMP > m_compDens_n; + arrayView1d< real64 const > m_componentMolarWeight; /// Number of components localIndex const m_numComponents; @@ -386,20 +388,21 @@ class MultiphaseBulkDensityKernel /** * @brief Constructor - * @param[in] numPhases the number of fluid phases + * @param[in] numComponents the number of fluid components (species) * @param[in] fluid the fluid model * @param[in] solid the porous solid model * @param[in] subRegion the element subregion */ - MultiphaseBulkDensityKernel( integer const numPhases, + MultiphaseBulkDensityKernel( integer const numComponents, constitutive::MultiFluidBase const & fluid, constitutive::CoupledSolidBase const & solid, ElementSubRegionBase & subRegion ) - : m_numPhases( numPhases ), + : m_numComponents( numComponents ), m_bulkDensity( subRegion.getField< fields::poromechanics::bulkDensity >() ), - m_fluidPhaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), + m_compDens( subRegion.getField< fields::flow::globalCompDensity >() ), + m_useMass( fluid.getMassFlag()), m_rockDensity( solid.getDensity() ), - m_fluidPhaseDensity( fluid.phaseMassDensity() ), + m_componentMolarWeight( fluid.componentMolarWeights() ), m_porosity( solid.getPorosity() ) {} @@ -413,12 +416,12 @@ class MultiphaseBulkDensityKernel localIndex const q ) const { m_bulkDensity[ei][q] = 0.0; - for( integer ip = 0; ip < m_numPhases; ++ip ) + for( integer ic = 0; ic < m_numComponents; ++ic ) { - m_bulkDensity[ei][q] += m_fluidPhaseVolFrac[ei][ip] * m_fluidPhaseDensity[ei][q][ip]; + m_bulkDensity[ei][q] = m_bulkDensity[ei][q] + ( m_useMass ? m_compDens[ei][ic] : m_compDens[ei][ic] * m_componentMolarWeight[ic] ); } m_bulkDensity[ei][q] *= m_porosity[ei][q]; - m_bulkDensity[ei][q] += ( 1 - m_porosity[ei][q] ) * m_rockDensity[ei][q]; + m_bulkDensity[ei][q] = m_bulkDensity[ei][q] + ( 1 - m_porosity[ei][q] ) * m_rockDensity[ei][q]; } /** @@ -446,20 +449,23 @@ class MultiphaseBulkDensityKernel protected: - // number of fluid phases - integer const m_numPhases; + // number of fluid components (species) + integer const m_numComponents; // the bulk density arrayView2d< real64 > const m_bulkDensity; - // the fluid phase saturation - arrayView2d< real64 const, compflow::USD_PHASE > const m_fluidPhaseVolFrac; + // the fluid component densities + arrayView2d< real64 const, compflow::USD_PHASE > const m_compDens; + + // the flag for selecting mass formulation instead of molar formulation + bool m_useMass; // the rock density arrayView2d< real64 const > const m_rockDensity; - // the fluid density - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_fluidPhaseDensity; + // the molar component weights + arrayView1d< real64 const > m_componentMolarWeight; // the porosity arrayView2d< real64 const > const m_porosity; @@ -476,19 +482,19 @@ class MultiphaseBulkDensityKernelFactory /** * @brief Create a new kernel and launch * @tparam POLICY the policy used in the RAJA kernel - * @param[in] numPhases number of phases + * @param[in] numComponents number of phases components (species) * @param[in] fluid the fluid model * @param[in] solid the porous solid model * @param[in] subRegion the element subregion */ template< typename POLICY > static void - createAndLaunch( integer const numPhases, + createAndLaunch( integer const numComponents, constitutive::MultiFluidBase const & fluid, constitutive::CoupledSolidBase const & solid, ElementSubRegionBase & subRegion ) { - MultiphaseBulkDensityKernel kernel( numPhases, fluid, solid, subRegion ); + MultiphaseBulkDensityKernel kernel( numComponents, fluid, solid, subRegion ); MultiphaseBulkDensityKernel::launch< POLICY >( subRegion.size(), subRegion.getField< fields::poromechanics::bulkDensity >().size( 1 ), kernel ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp index 856ee6eccdf..d12925a3daf 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp @@ -104,6 +104,9 @@ MultiphasePoromechanics( NodeManager const & nodeManager, m_fluidPhaseMassDensity = fluid.phaseMassDensity(); m_dFluidPhaseMassDensity = fluid.dPhaseMassDensity(); + + m_useMass = fluid.getMassFlag(); + m_componentMolarWeight = fluid.componentMolarWeights(); } } @@ -214,39 +217,18 @@ computeBodyForce( localIndex const k, StackVariables & stack, FUNC && bodyForceKernelOp ) const { - using Deriv = constitutive::multifluid::DerivativeOffset; - GEOS_UNUSED_VAR( dPorosity_dTemperature ); - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseMassDensity = m_fluidPhaseMassDensity[k][q]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseMassDensity = m_dFluidPhaseMassDensity[k][q]; - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const phaseVolFrac = m_fluidPhaseVolFrac[k]; - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dFluidPhaseVolFrac[k]; - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const dGlobalCompFrac_dGlobalCompDensity = m_dGlobalCompFraction_dGlobalCompDensity[k]; - // Step 1: compute fluid total mass density and its derivatives real64 totalMassDensity = 0.0; - real64 dTotalMassDensity_dPressure = 0.0; real64 dTotalMassDensity_dComponents[maxNumComponents]{}; - real64 dPhaseMassDensity_dComponents[maxNumComponents]{}; - for( integer ip = 0; ip < m_numPhases; ++ip ) + arraySlice1d< real64 const, compflow::USD_COMP - 1 > const compDens = m_compDens[k]; + for( integer ic = 0; ic < m_numComponents; ++ic ) { - totalMassDensity += phaseVolFrac( ip ) * phaseMassDensity( ip ); - dTotalMassDensity_dPressure += dPhaseVolFrac( ip, Deriv::dP ) * phaseMassDensity( ip ) - + phaseVolFrac( ip ) * dPhaseMassDensity( ip, Deriv::dP ); - - applyChainRule( m_numComponents, - dGlobalCompFrac_dGlobalCompDensity, - dPhaseMassDensity[ip], - dPhaseMassDensity_dComponents, - Deriv::dC ); - for( integer jc = 0; jc < m_numComponents; ++jc ) - { - dTotalMassDensity_dComponents[jc] += dPhaseVolFrac( ip, Deriv::dC+jc ) * phaseMassDensity( ip ) - + phaseVolFrac( ip ) * dPhaseMassDensity_dComponents[jc]; - } + totalMassDensity = totalMassDensity + ( m_useMass ? compDens[ic] : compDens[ic] * m_componentMolarWeight[ic] ); + dTotalMassDensity_dComponents[ic] = m_useMass ? 1.0 : m_componentMolarWeight[ic]; } // Step 2: compute mixture density as an average between total mass density and solid density @@ -254,8 +236,7 @@ computeBodyForce( localIndex const k, real64 const mixtureDensity = ( 1.0 - porosity ) * m_solidDensity( k, q ) + porosity * totalMassDensity; real64 const dMixtureDens_dVolStrainIncrement = dPorosity_dVolStrain * ( -m_solidDensity( k, q ) + totalMassDensity ); real64 const dMixtureDens_dPressure = dPorosity_dPressure * ( -m_solidDensity( k, q ) + totalMassDensity ) - + ( 1.0 - porosity ) * dSolidDensity_dPressure - + porosity * dTotalMassDensity_dPressure; + + ( 1.0 - porosity ) * dSolidDensity_dPressure; LvArray::tensorOps::scale< maxNumComponents >( dTotalMassDensity_dComponents, porosity ); // Step 3: finally, get the body force diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp index 33287b890ee..5fd1de083e4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp @@ -188,8 +188,6 @@ computeBodyForce( localIndex const k, real64 const & dSolidDensity_dPressure, StackVariables & stack ) const { - using Deriv = constitutive::multifluid::DerivativeOffset; - Base::computeBodyForce( k, q, porosity, dPorosity_dVolStrain, @@ -201,27 +199,11 @@ computeBodyForce( localIndex const k, { GEOS_UNUSED_VAR( mixtureDensity ); - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseMassDensity = m_fluidPhaseMassDensity[k][q]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseMassDensity = m_dFluidPhaseMassDensity[k][q]; - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const phaseVolFrac = m_fluidPhaseVolFrac[k]; - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dFluidPhaseVolFrac[k]; - - // Step 1: compute fluid total mass density and its derivatives - - real64 dTotalMassDensity_dTemperature = 0.0; - - for( integer ip = 0; ip < m_numPhases; ++ip ) - { - dTotalMassDensity_dTemperature += dPhaseVolFrac( ip, Deriv::dT ) * phaseMassDensity( ip ) - + phaseVolFrac( ip ) * dPhaseMassDensity( ip, Deriv::dT ); - } - - // Step 2: compute the derivative of the bulk density (an average between total mass density and solid density) wrt temperature - - real64 const dMixtureDens_dTemperature = dPorosity_dTemperature * ( -m_solidDensity( k, q ) + totalMassDensity ) - + porosity * dTotalMassDensity_dTemperature; + // Step 1: compute the derivative of the mixture density (an average between total mass density and solid density) wrt temperature + // TODO include solid density derivative with respect to temperature + real64 const dMixtureDens_dTemperature = dPorosity_dTemperature * ( -m_solidDensity( k, q ) + totalMassDensity ); - // Step 3: finally, get the body force + // Step 2: finally, get the body force LvArray::tensorOps::scaledCopy< 3 >( stack.dBodyForce_dTemperature, m_gravityVector, dMixtureDens_dTemperature ); From eb7c6b2faa284caafc564e74eabee64b5577df0c Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Thu, 19 Sep 2024 14:10:40 -0500 Subject: [PATCH 203/286] fix: Remove shadow declarations (#3293) * fix: Remove shadow declarations * Rename variable --------- Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .../mesh/generators/CellBlockManager.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/coreComponents/mesh/generators/CellBlockManager.cpp b/src/coreComponents/mesh/generators/CellBlockManager.cpp index 8b8b7653b03..4e51bb0bcfe 100644 --- a/src/coreComponents/mesh/generators/CellBlockManager.cpp +++ b/src/coreComponents/mesh/generators/CellBlockManager.cpp @@ -249,13 +249,13 @@ struct FaceBuilder */ auto duplicateFaceEquality() const { - return [duplicateFaces = duplicateFaces.toViewConst()] + return [faces = duplicateFaces.toViewConst()] ( NodesAndElementOfFace const & lhs, NodesAndElementOfFace const & rhs ) { - return std::equal( duplicateFaces[ lhs.duplicateFaceNodesIndex ].begin(), - duplicateFaces[ lhs.duplicateFaceNodesIndex ].end(), - duplicateFaces[ rhs.duplicateFaceNodesIndex ].begin(), - duplicateFaces[ rhs.duplicateFaceNodesIndex ].end() ); + return std::equal( faces[ lhs.duplicateFaceNodesIndex ].begin(), + faces[ lhs.duplicateFaceNodesIndex ].end(), + faces[ rhs.duplicateFaceNodesIndex ].begin(), + faces[ rhs.duplicateFaceNodesIndex ].end() ); }; } @@ -1071,7 +1071,7 @@ void CellBlockManager::generateHighOrderMaps( localIndex const order, [ =, faceToNodesMapSource=faceToNodesMapSource.toView(), edgeToNodeMapNew=edgeToNodeMapNew.toView(), faceToNodeMapNew=faceToNodeMapNew.toView(), - m_faceToEdges=m_faceToEdges.toView(), + faceToEdges=m_faceToEdges.toView(), refPosSrc=refPosSource.toView(), refPosNew=refPosNew.toView(), faceLocalToGlobal=faceLocalToGlobal.toView(), @@ -1099,7 +1099,7 @@ void CellBlockManager::generateHighOrderMaps( localIndex const order, for( localIndex iter_node=0; iter_node Date: Thu, 19 Sep 2024 16:00:41 -0700 Subject: [PATCH 204/286] build(deps): bump the github-actions group with 2 updates (#3324) Bumps the github-actions group with 2 updates: [google-github-actions/auth](https://github.com/google-github-actions/auth) and [google-github-actions/setup-gcloud](https://github.com/google-github-actions/setup-gcloud). Updates `google-github-actions/auth` from 2.1.3 to 2.1.5 - [Release notes](https://github.com/google-github-actions/auth/releases) - [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md) - [Commits](https://github.com/google-github-actions/auth/compare/v2.1.3...v2.1.5) Updates `google-github-actions/setup-gcloud` from 2.1.0 to 2.1.1 - [Release notes](https://github.com/google-github-actions/setup-gcloud/releases) - [Changelog](https://github.com/google-github-actions/setup-gcloud/blob/main/CHANGELOG.md) - [Commits](https://github.com/google-github-actions/setup-gcloud/compare/v2.1.0...v2.1.1) --- updated-dependencies: - dependency-name: google-github-actions/auth dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: google-github-actions/setup-gcloud dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Randolph Settgast --- .github/workflows/build_and_test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 8d6ea27f6d8..80debbb603a 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -111,14 +111,14 @@ jobs: - id: 'auth' if: ${{ inputs.GCP_BUCKET || inputs.USE_SCCACHE }} - uses: 'google-github-actions/auth@v2.1.3' + uses: 'google-github-actions/auth@v2.1.5' with: credentials_json: '${{ secrets.GOOGLE_CLOUD_GCP }}' create_credentials_file: true - name: 'Set up Cloud SDK' if: inputs.GCP_BUCKET - uses: 'google-github-actions/setup-gcloud@v2.1.0' + uses: 'google-github-actions/setup-gcloud@v2.1.1' with: version: '>= 363.0.0' From 1616ea43905b495541dd141c2574b491a04a91ca Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" <50467563+victorapm@users.noreply.github.com> Date: Fri, 20 Sep 2024 02:07:24 -0400 Subject: [PATCH 205/286] feat: minimum interval for time-step increase after time-step cut (#3338) * Add minDtIncreaseInterval and update time-stepping logic * Use getter for minTimeStepIncreaseInterval * change ats config for c1_ppy.ats...they appear invalid * rebaseline --------- Co-authored-by: Nicola Castelletto <38361926+castelletto1@users.noreply.github.com> Co-authored-by: Randolph Settgast --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 12 +++++-- .../c1-ppu/c1_ppu.ats | 4 +-- .../c1-ppu/grav_seg_c1ppu_hyst.xml | 2 +- scripts/processIntegratedTestCheckFailures.py | 6 ++-- .../interfaces/hypre/HypreInterface.cpp | 2 +- .../NonlinearSolverParameters.cpp | 34 +++++++++++-------- .../NonlinearSolverParameters.hpp | 14 ++++++++ .../physicsSolvers/SolverBase.cpp | 26 ++++++++++++++ .../physicsSolvers/SolverBase.hpp | 6 ++++ .../fluidFlow/CompositionalMultiphaseBase.cpp | 10 +++--- 11 files changed, 90 insertions(+), 28 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 53c078f12d0..773e2d25766 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3217-7661-9b4a604 + baseline: integratedTests/baseline_integratedTests-pr3338-7720-9f62c4a allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index a01e4749868..5d9c79a2b9e 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,14 +6,21 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3338 (2024-09-19) +====================== +Updated time-stepping logic. Rebaseline due to new input parameter and minor numerical diffs. + + PR #3217 (2024-09-16) ====================== ALM slip and open modes with relative tests. + PR #3318 (2024-09-12) ====================== Modified SeismicityRate poroelastic case. + PR #3322 (2024-09-06) ====================== Print out fracture state for contact model. Rebaseline the corresponding cases. @@ -36,11 +43,12 @@ Re-enable enforcement of wave propagation integrated test pass. PR #3300 (2024-08-28) ====================== -Re-enable floating point exceptions. Rebaseline due to minor changing default value of maxRelativeCompDensChange from 1.7976931348623157e+308 to 1.7976931348623157e+208. +Re-enable floating point exceptions. Rebaseline due to minor changing default value of maxRelativeCompDensChange from 1.7976931348623157e+308 to 1.7976931348623157e+208. + PR #3283 (2024-08-22) ====================== -Reuse computeSinglePhaseFlux. Rebaseline due to minor numerical diffs. +Reuse computeSinglePhaseFlux. Rebaseline due to minor numerical diffs. PR #3249 (2024-08-14) diff --git a/inputFiles/compositionalMultiphaseFlow/c1-ppu/c1_ppu.ats b/inputFiles/compositionalMultiphaseFlow/c1-ppu/c1_ppu.ats index 1f524c1ee75..5b68a2cb9f4 100644 --- a/inputFiles/compositionalMultiphaseFlow/c1-ppu/c1_ppu.ats +++ b/inputFiles/compositionalMultiphaseFlow/c1-ppu/c1_ppu.ats @@ -8,8 +8,8 @@ decks = [ TestDeck(name="grav_seg_c1ppu_hyst", description="Smoke test for C1-PPU (1D displacement, C1-PPU)", partitions=((1, 1, 1), (1, 1, 2)), - restart_step=87, - check_step=109, + restart_step=50, + check_step=88, restartcheck_params=RestartcheckParameters(atol=1e-4, rtol=1e-3)), ] diff --git a/inputFiles/compositionalMultiphaseFlow/c1-ppu/grav_seg_c1ppu_hyst.xml b/inputFiles/compositionalMultiphaseFlow/c1-ppu/grav_seg_c1ppu_hyst.xml index a82c573ad0f..d47f6ff14ea 100644 --- a/inputFiles/compositionalMultiphaseFlow/c1-ppu/grav_seg_c1ppu_hyst.xml +++ b/inputFiles/compositionalMultiphaseFlow/c1-ppu/grav_seg_c1ppu_hyst.xml @@ -50,7 +50,7 @@ diff --git a/scripts/processIntegratedTestCheckFailures.py b/scripts/processIntegratedTestCheckFailures.py index ab5183322b9..db503687f42 100644 --- a/scripts/processIntegratedTestCheckFailures.py +++ b/scripts/processIntegratedTestCheckFailures.py @@ -48,9 +48,11 @@ def findFiles(folder, extension): matchStrings = ['Error:'] # What stings to look for in order to exclude a block +print( args.exclusionStrings ) +exclusionStrings = [] #exclusionStrings = [ 'sizedFromParent', 'different shapes' ] -#exclusionStrings = [ 'sizedFromParent', 'different shapes', 'but not the' ] -exclusionStrings = ['logLevel', 'NonlinearSolverParameters', 'has a child', 'different shapes', 'different types', 'differing types'] +#exclusionStrings = [ 'but not the' ] +#exclusionStrings = ['logLevel', 'NonlinearSolverParameters', 'has a child', 'different shapes', 'different types', 'differing types'] exclusionStrings += args.exclusionStrings directory = args.directory diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp index f13477eecc5..5b056df8de7 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp @@ -71,7 +71,7 @@ HypreInterface::createSolver( LinearSolverParameters params ) return std::make_unique< SuperLUDist< HypreInterface > >( std::move( params ) ); #else GEOS_ERROR( "GEOSX is configured without support for SuperLU_dist." ); - return std::unique_ptr< LinearSolverBase< HypreInterface > >( NULL ); + return std::unique_ptr< LinearSolverBase< HypreInterface > >( nullptr ); #endif } else diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp index e958a2a054b..94d3f9658dc 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp @@ -37,7 +37,7 @@ NonlinearSolverParameters::NonlinearSolverParameters( string const & name, setDescription( "How the line search is to be used. Options are: \n " "* None - Do not use line search.\n" "* Attempt - Use line search. Allow exit from line search without achieving smaller residual than starting residual.\n" - "* Require - Use line search. If smaller residual than starting resdual is not achieved, cut time step." ); + "* Require - Use line search. If smaller residual than starting resdual is not achieved, cut time-step." ); registerWrapper( viewKeysStruct::lineSearchInterpolationTypeString(), &m_lineSearchInterpType ). setApplyDefaultValue( LineSearchInterpolationType::Linear ). @@ -112,32 +112,37 @@ NonlinearSolverParameters::NonlinearSolverParameters( string const & name, registerWrapper( viewKeysStruct::timeStepDecreaseIterLimString(), &m_timeStepDecreaseIterLimit ). setApplyDefaultValue( 0.7 ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Fraction of the max Newton iterations above which the solver asks for the time-step to be decreased for the next time step." ); + setDescription( "Fraction of the max Newton iterations above which the solver asks for the time-step to be decreased for the next time-step." ); registerWrapper( viewKeysStruct::timeStepIncreaseIterLimString(), &m_timeStepIncreaseIterLimit ). setApplyDefaultValue( 0.4 ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Fraction of the max Newton iterations below which the solver asks for the time-step to be increased for the next time step." ); + setDescription( "Fraction of the max Newton iterations below which the solver asks for the time-step to be increased for the next time-step." ); registerWrapper( viewKeysStruct::timeStepDecreaseFactorString(), &m_timeStepDecreaseFactor ). setApplyDefaultValue( 0.5 ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Factor by which the time step is decreased when the number of Newton iterations is large." ); + setDescription( "Factor by which the time-step is decreased when the number of Newton iterations is large." ); registerWrapper( viewKeysStruct::timeStepIncreaseFactorString(), &m_timeStepIncreaseFactor ). setApplyDefaultValue( 2.0 ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Factor by which the time step is increased when the number of Newton iterations is small." ); + setDescription( "Factor by which the time-step is increased when the number of Newton iterations is small." ); + + registerWrapper( viewKeysStruct::minTimeStepIncreaseIntervalString(), &m_minTimeStepIncreaseInterval ). + setApplyDefaultValue( 10 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Minimum number of cycles since the last time-step cut for increasing the time-step again." ); registerWrapper( viewKeysStruct::timeStepCutFactorString(), &m_timeStepCutFactor ). setApplyDefaultValue( 0.5 ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Factor by which the time step will be cut if a timestep cut is required." ); + setDescription( "Factor by which the time-step will be cut if a time-step cut is required." ); registerWrapper( viewKeysStruct::maxTimeStepCutsString(), &m_maxTimeStepCuts ). setApplyDefaultValue( 2 ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Max number of time step cuts" ); + setDescription( "Max number of time-step cuts" ); registerWrapper( viewKeysStruct::maxSubStepsString(), &m_maxSubSteps ). setApplyDefaultValue( 10 ). @@ -215,13 +220,14 @@ void NonlinearSolverParameters::print() const tableData.addRow( "Minimum iterations", m_minIterNewton ); tableData.addRow( "Maximum allowed residual norm", m_maxAllowedResidualNorm ); tableData.addRow( "Allow non-converged", m_allowNonConverged ); - tableData.addRow( "Time step decrease iterations limit", m_timeStepDecreaseIterLimit ); - tableData.addRow( "Time step increase iterations limit", m_timeStepIncreaseIterLimit ); - tableData.addRow( "Time step decrease factor", m_timeStepDecreaseFactor ); - tableData.addRow( "Time step increase factor", m_timeStepDecreaseFactor ); - tableData.addRow( "Time step cut factor", m_timeStepCutFactor ); - tableData.addRow( "Maximum time step cuts", m_maxTimeStepCuts ); - tableData.addRow( "Maximum sub time steps", m_maxSubSteps ); + tableData.addRow( "Time-step decrease iterations limit", m_timeStepDecreaseIterLimit ); + tableData.addRow( "Time-step increase iterations limit", m_timeStepIncreaseIterLimit ); + tableData.addRow( "Time-step decrease factor", m_timeStepDecreaseFactor ); + tableData.addRow( "Time-step increase factor", m_timeStepDecreaseFactor ); + tableData.addRow( "Time-step cut factor", m_timeStepCutFactor ); + tableData.addRow( "Minimum time-step increase interval", m_minTimeStepIncreaseInterval ); + tableData.addRow( "Maximum time-step cuts", m_maxTimeStepCuts ); + tableData.addRow( "Maximum sub time-steps", m_maxSubSteps ); tableData.addRow( "Maximum number of configuration attempts", m_maxNumConfigurationAttempts ); tableData.addRow( "Coupling type", m_couplingType ); if( m_couplingType == CouplingType::Sequential ) diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp index e8f9eb1d5d4..4678b3c38d2 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp @@ -79,6 +79,7 @@ class NonlinearSolverParameters : public dataRepository::Group m_timeStepIncreaseIterLimit = params.m_timeStepIncreaseIterLimit; m_timeStepDecreaseFactor = params.m_timeStepDecreaseFactor; m_timeStepIncreaseFactor = params.m_timeStepIncreaseFactor; + m_minTimeStepIncreaseInterval = params.m_minTimeStepIncreaseInterval; m_maxSubSteps = params.m_maxSubSteps; m_maxTimeStepCuts = params.m_maxTimeStepCuts; m_timeStepCutFactor = params.m_timeStepCutFactor; @@ -125,6 +126,7 @@ class NonlinearSolverParameters : public dataRepository::Group static constexpr char const * timeStepIncreaseIterLimString() { return "timeStepIncreaseIterLimit"; } static constexpr char const * timeStepDecreaseFactorString() { return "timeStepDecreaseFactor"; } static constexpr char const * timeStepIncreaseFactorString() { return "timeStepIncreaseFactor"; } + static constexpr char const * minTimeStepIncreaseIntervalString() { return "minTimeStepIncreaseInterval"; } static constexpr char const * maxSubStepsString() { return "maxSubSteps"; } static constexpr char const * maxTimeStepCutsString() { return "maxTimeStepCuts"; } @@ -226,6 +228,15 @@ class NonlinearSolverParameters : public dataRepository::Group return m_timeStepIncreaseFactor; } + /** + * @brief Getter for the minimum interval for increasing the time-step + * @return the minimum interval for increasing the time-step + */ + integer minTimeStepIncreaseInterval() const + { + return m_minTimeStepIncreaseInterval; + } + /** * @brief Getter for the norm type used to check convergence in the flow/well solvers * @return the norm type @@ -304,6 +315,9 @@ class NonlinearSolverParameters : public dataRepository::Group /// Factor used to increase the time step size real64 m_timeStepIncreaseFactor; + /// Minimum interval, since the last time-step cut, for increasing the time-step + integer m_minTimeStepIncreaseInterval; + /// Maximum number of time sub-steps allowed for the solver integer m_maxSubSteps; diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index 2ebb1671baf..f20ca388324 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -39,6 +39,7 @@ SolverBase::SolverBase( string const & name, m_cflFactor(), m_maxStableDt{ 1e99 }, m_nextDt( 1e99 ), + m_numTimestepsSinceLastDtCut( -1 ), m_dofManager( name ), m_linearSolverParameters( groupKeyStruct::linearSolverParametersString(), this ), m_nonlinearSolverParameters( groupKeyStruct::nonlinearSolverParametersString(), this ), @@ -247,6 +248,16 @@ bool SolverBase::execute( real64 const time_n, DomainPartition & domain ) { GEOS_MARK_FUNCTION; + + /* + * Reset counter indicating the number of cycles since the last timestep cut + * when the new timestep. "-1" means that no time-step cut has ocurred. + * */ + if( dt < m_nextDt ) + { + m_numTimestepsSinceLastDtCut = -1; + } + real64 dtRemaining = dt; real64 nextDt = dt; @@ -311,6 +322,12 @@ bool SolverBase::execute( real64 const time_n, // Decide what to do with the next Dt for the event running the solver. m_nextDt = setNextDt( nextDt, domain ); + // Increase counter to indicate how many cycles since the last timestep cut + if( m_numTimestepsSinceLastDtCut >= 0 ) + { + m_numTimestepsSinceLastDtCut++; + } + logEndOfCycleInformation( cycleNumber, numOfSubSteps, subStepDt ); return false; @@ -337,6 +354,7 @@ void SolverBase::logEndOfCycleInformation( integer const cycleNumber, real64 SolverBase::setNextDt( real64 const & currentDt, DomainPartition & domain ) { + integer const minTimeStepIncreaseInterval = m_nonlinearSolverParameters.minTimeStepIncreaseInterval(); real64 const nextDtNewton = setNextDtBasedOnNewtonIter( currentDt ); if( m_nonlinearSolverParameters.getLogLevel() > 0 ) GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on Newton iterations = {}", getName(), nextDtNewton )); @@ -344,6 +362,13 @@ real64 SolverBase::setNextDt( real64 const & currentDt, if( m_nonlinearSolverParameters.getLogLevel() > 0 ) GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on state change = {}", getName(), nextDtStateChange )); + if( ( m_numTimestepsSinceLastDtCut >= 0 ) && ( m_numTimestepsSinceLastDtCut < minTimeStepIncreaseInterval ) ) + { + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step size will be kept the same since it's been {} cycles since last cut.", + getName(), m_numTimestepsSinceLastDtCut ) ); + return currentDt; + } + if( nextDtNewton < nextDtStateChange ) // time step size decided based on convergence { if( nextDtNewton > currentDt ) @@ -816,6 +841,7 @@ real64 SolverBase::nonlinearImplicitStep( real64 const & time_n, { // cut timestep, go back to beginning of step and restart the Newton loop stepDt *= dtCutFactor; + m_numTimestepsSinceLastDtCut = 0; GEOS_LOG_LEVEL_RANK_0 ( 1, GEOS_FMT( "New dt = {}", stepDt ) ); // notify the solver statistics counter that this is a time step cut diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index 702fa445b03..491df9bf949 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -686,6 +686,9 @@ class SolverBase : public ExecutableGroup /// @return string for the initialDt wrapper static constexpr char const * initialDtString() { return "initialDt"; } + /// @return string for the minDtIncreaseInterval wrapper + static constexpr char const * minDtIncreaseIntervalString() { return "minDtIncreaseInterval"; } + /// @return string for the maxStableDt wrapper static constexpr char const * maxStableDtString() { return "maxStableDt"; } @@ -1008,6 +1011,9 @@ class SolverBase : public ExecutableGroup /// timestep of the next cycle real64 m_nextDt; + /// Number of cycles since last timestep cut + integer m_numTimestepsSinceLastDtCut; + /// name of the FV discretization object in the data repository string m_discretizationName; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index b8bab4d1c07..a8d6f99ecec 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -2173,18 +2173,18 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & real64 const eps = LvArray::NumericLimits< real64 >::epsilon; - real64 const nextDtPressure = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativePresChange + real64 const nextDtPressure = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativePresChange / std::max( eps, maxRelativePresChange + m_solutionChangeScalingFactor * m_targetRelativePresChange ); if( m_nonlinearSolverParameters.getLogLevel() > 0 ) GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on pressure change = {}", getName(), nextDtPressure )); - real64 const nextDtPhaseVolFrac = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetPhaseVolFracChange + real64 const nextDtPhaseVolFrac = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetPhaseVolFracChange / std::max( eps, maxAbsolutePhaseVolFracChange + m_solutionChangeScalingFactor * m_targetPhaseVolFracChange ); if( m_nonlinearSolverParameters.getLogLevel() > 0 ) GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on phase volume fraction change = {}", getName(), nextDtPhaseVolFrac )); real64 nextDtCompDens = LvArray::NumericLimits< real64 >::max; if( m_targetRelativeCompDensChange < LvArray::NumericLimits< real64 >::max ) { - nextDtCompDens = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativeCompDensChange + nextDtCompDens = currentDt * ( 1.0 + m_solutionChangeScalingFactor ) * m_targetRelativeCompDensChange / std::max( eps, maxRelativeCompDensChange + m_solutionChangeScalingFactor * m_targetRelativeCompDensChange ); if( m_nonlinearSolverParameters.getLogLevel() > 0 ) GEOS_LOG_RANK_0( GEOS_FMT( "{}: next time step based on component density change = {}", getName(), nextDtCompDens )); @@ -2211,8 +2211,8 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnCFL( const geos::real64 & cu GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max phase CFL number = {}", getName(), maxPhaseCFL ) ); GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max component CFL number = {} ", getName(), maxCompCFL ) ); - return std::min( m_targetFlowCFL*currentDt/maxCompCFL, m_targetFlowCFL*currentDt/maxPhaseCFL ); - + return std::min( m_targetFlowCFL * currentDt / maxCompCFL, + m_targetFlowCFL * currentDt / maxPhaseCFL ); } void CompositionalMultiphaseBase::computeCFLNumbers( geos::DomainPartition & domain, const geos::real64 & dt, From 08d5eeb7f7508dacf66f2bfc54ea674236eeee6f Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Fri, 20 Sep 2024 06:28:59 -1000 Subject: [PATCH 206/286] build: update Mathpresso (#3360) * update GEOS_TPL_TAG. Update version tag. enable mathpresso on osx. enable xml tools on osx * runs on ruby with new LC path and new schema modifications from a previous contribution * update LvArray hash. Move geosx_docs inside schema generation guard --- .devcontainer/devcontainer.json | 2 +- host-configs/apple/macOS_base.cmake | 2 +- src/CMakeLists.txt | 12 +++++------- src/VERSION | 2 +- src/coreComponents/LvArray | 2 +- src/coreComponents/schema/schema.xsd | 6 +++--- 6 files changed, 12 insertions(+), 14 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a3484e12f77..5757d8230fa 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "257-513" + "GEOS_TPL_TAG": "284-535" } }, "runArgs": [ diff --git a/host-configs/apple/macOS_base.cmake b/host-configs/apple/macOS_base.cmake index 1e5e06c80aa..836e2b15936 100644 --- a/host-configs/apple/macOS_base.cmake +++ b/host-configs/apple/macOS_base.cmake @@ -27,7 +27,7 @@ set( LAPACK_LIBRARIES ${HOMEBREW_DIR}/opt/lapack/lib/liblapack.dylib CACHE PATH set(ENABLE_DOXYGEN ON CACHE BOOL "" FORCE) set(ENABLE_SPHINX ON CACHE BOOL "" FORCE) -set(ENABLE_MATHPRESSO OFF CACHE BOOL "" FORCE ) +set(ENABLE_MATHPRESSO ON CACHE BOOL "" FORCE ) set(GEOS_BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d76017b88a1..09988abe2fd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -156,7 +156,7 @@ install( FILES ${CMAKE_INSTALL_PREFIX}/bin/geosx RENAME geos PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) -if( ENABLE_XML_UPDATES AND ENABLE_MPI AND UNIX AND NOT CMAKE_HOST_APPLE AND NOT ENABLE_CUDA AND NOT ENABLE_HIP ) +if( ENABLE_XML_UPDATES AND ENABLE_MPI AND UNIX AND NOT ENABLE_CUDA AND NOT ENABLE_HIP ) set(SCHEMA_DIR ${CMAKE_SOURCE_DIR}/coreComponents/schema) set(SCRIPT_DIR ${CMAKE_SOURCE_DIR}/../scripts) @@ -184,18 +184,16 @@ if( ENABLE_XML_UPDATES AND ENABLE_MPI AND UNIX AND NOT CMAKE_HOST_APPLE AND NOT DEPENDS geosx_generate_schema COMMENT "Validating all XML files in the repository against the schema" ) + if( SPHINX_FOUND ) + blt_add_sphinx_target( geosx_docs ) + add_dependencies( geosx_docs geosx_build_datastructure_tables ) + endif() endif() if( ENABLE_PYGEOSX ) add_subdirectory( pygeosx ) endif() -if( SPHINX_FOUND ) - blt_add_sphinx_target( geosx_docs ) - add_dependencies( geosx_docs geosx_build_datastructure_tables ) -endif() - - install( DIRECTORY ../examples/ DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/${CMAKE_PROJECT_NAME}/examples ) diff --git a/src/VERSION b/src/VERSION index 6103e22aefe..b4bba825f4a 100644 --- a/src/VERSION +++ b/src/VERSION @@ -1 +1 @@ -VERSION_ID = v1.0.1 +VERSION_ID = v1.1.0 diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index ec26694afbc..355e8d987fb 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit ec26694afbcdd137533b6f04ce8f8c264ff8c1fb +Subproject commit 355e8d987fbf15c9ac07442bda28bc52a8e80480 diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 71b6b3f3452..8bcb61ab88b 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -2851,7 +2851,7 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - + @@ -3213,11 +3213,11 @@ Local- Add jump stabilization on interior of macro elements--> - + - + From 258f072031c72157b001d41215644f6f439d5fda Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Fri, 20 Sep 2024 14:36:56 -0500 Subject: [PATCH 207/286] refactor: Trying to improve adaptive linear solver tolerance selection (#3163) * improve adaptive linear solver tolerance selection. Added adaptiveExponent, adaptiveGamma, and strongestTol input. * updated baselines for new fields --------- Co-authored-by: Randolph Settgast --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 ++ .../utilities/LinearSolverParameters.hpp | 3 ++ .../physicsSolvers/LinearSolverParameters.cpp | 15 +++++++ .../physicsSolvers/LinearSolverParameters.hpp | 6 +++ .../physicsSolvers/SolverBase.cpp | 42 ++++++++++--------- .../physicsSolvers/SolverBase.hpp | 6 ++- 7 files changed, 55 insertions(+), 23 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 773e2d25766..7f309b2c34b 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3338-7720-9f62c4a + baseline: integratedTests/baseline_integratedTests-pr3163-7758-9fe3734 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 5d9c79a2b9e..67f0c1c877e 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3163 (2024-09-20) +===================== +Added new fields (krylovStrongestTol, adaptiveGamma, adaptiveExponent) to the LinearSolverParameters for adaptive tolerances. + PR #3338 (2024-09-19) ====================== Updated time-stepping logic. Rebaseline due to new input parameter and minor numerical diffs. diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp index 51c2239c0a6..90efd13f7ef 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp @@ -124,6 +124,9 @@ struct LinearSolverParameters #endif integer useAdaptiveTol = false; ///< Use Eisenstat-Walker adaptive tolerance real64 weakestTol = 1e-3; ///< Weakest allowed tolerance when using adaptive method + real64 strongestTol = 1e-8; ///< Strongest allowed tolerance when using adaptive method + real64 adaptiveGamma = 0.1; ///< Gamma parameter for adaptive method + real64 adaptiveExponent = 1.0; ///< Exponent parameter for adaptive method } krylov; ///< Krylov-method parameter struct diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp index fd7ba60c1f4..3bc0888dae6 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp @@ -115,6 +115,21 @@ LinearSolverParametersInput::LinearSolverParametersInput( string const & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Weakest-allowed tolerance for adaptive method" ); + registerWrapper( viewKeyStruct::krylovStrongTolString(), &m_parameters.krylov.strongestTol ). + setApplyDefaultValue( m_parameters.krylov.strongestTol ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Strongest-allowed tolerance for adaptive method" ); + + registerWrapper( viewKeyStruct::adaptiveGammaString(), &m_parameters.krylov.adaptiveGamma ). + setApplyDefaultValue( m_parameters.krylov.adaptiveGamma ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Gamma parameter for adaptive method" ); + + registerWrapper( viewKeyStruct::adaptiveExponentString(), &m_parameters.krylov.adaptiveExponent ). + setApplyDefaultValue( m_parameters.krylov.adaptiveExponent ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Exponent parameter for adaptive method" ); + registerWrapper( viewKeyStruct::amgNumSweepsString(), &m_parameters.amg.numSweeps ). setApplyDefaultValue( m_parameters.amg.numSweeps ). setInputFlag( InputFlags::OPTIONAL ). diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp index 55bcfe82763..2d6636b8f77 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp @@ -103,6 +103,12 @@ class LinearSolverParametersInput : public dataRepository::Group static constexpr char const * krylovAdaptiveTolString() { return "krylovAdaptiveTol"; } /// Krylov weakest tolerance key static constexpr char const * krylovWeakTolString() { return "krylovWeakestTol"; } + /// Krylov strongest tolerance key + static constexpr char const * krylovStrongTolString() { return "krylovStrongestTol"; } + /// Adaptive gamma parameter key + static constexpr char const * adaptiveGammaString() { return "adaptiveGamma"; } + /// Adaptive exponent parameter key + static constexpr char const * adaptiveExponentString() { return "adaptiveExponent"; } /// AMG number of sweeps key static constexpr char const * amgNumSweepsString() { return "amgNumSweeps"; } diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index f20ca388324..47212daed32 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -731,22 +731,24 @@ bool SolverBase::lineSearchWithParabolicInterpolation( real64 const & time_n, real64 SolverBase::eisenstatWalker( real64 const newNewtonNorm, real64 const oldNewtonNorm, - real64 const weakestTol ) + LinearSolverParameters::Krylov const & krylovParams, + integer const logLevel ) { - real64 const strongestTol = 1e-8; - real64 const exponent = 2.0; - real64 const gamma = 0.9; - - real64 normRatio = newNewtonNorm / oldNewtonNorm; - if( normRatio > 1 ) - normRatio = 1; - - real64 newKrylovTol = gamma*std::pow( normRatio, exponent ); - real64 altKrylovTol = gamma*std::pow( oldNewtonNorm, exponent ); + real64 normRatio = std::min( newNewtonNorm / oldNewtonNorm, 1.0 ); + real64 newKrylovTol = krylovParams.adaptiveGamma * std::pow( normRatio, krylovParams.adaptiveExponent ); + // the following is a safeguard to avoid too sharp tolerance reduction + // the bound is the quadratic reduction wrt previous value + real64 altKrylovTol = std::pow( krylovParams.relTolerance, 2.0 ); real64 krylovTol = std::max( newKrylovTol, altKrylovTol ); - krylovTol = std::min( krylovTol, weakestTol ); - krylovTol = std::max( krylovTol, strongestTol ); + krylovTol = std::min( krylovTol, krylovParams.weakestTol ); + krylovTol = std::max( krylovTol, krylovParams.strongestTol ); + + if( logLevel > 0 ) + { + GEOS_LOG_RANK_0( GEOS_FMT( " Adaptive linear tolerance = {:4.2e} (norm ratio = {:4.2e}, old tolerance = {:4.2e}, new tolerance = {:4.2e}, safeguard = {:4.2e})", + krylovTol, normRatio, krylovParams.relTolerance, newKrylovTol, altKrylovTol ) ); + } return krylovTol; } @@ -1009,16 +1011,16 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, } } - // if using adaptive Krylov tolerance scheme, update tolerance. - LinearSolverParameters::Krylov & krylovParams = m_linearSolverParameters.get().krylov; - if( krylovParams.useAdaptiveTol ) - { - krylovParams.relTolerance = eisenstatWalker( residualNorm, lastResidual, krylovParams.weakestTol ); - } - { Timer timer( m_timers["linear solver total"] ); + // if using adaptive Krylov tolerance scheme, update tolerance. + LinearSolverParameters::Krylov & krylovParams = m_linearSolverParameters.get().krylov; + if( krylovParams.useAdaptiveTol ) + { + krylovParams.relTolerance = newtonIter > 0 ? eisenstatWalker( residualNorm, lastResidual, krylovParams, m_linearSolverParameters.getLogLevel() ) : krylovParams.weakestTol; + } + // TODO: Trilinos currently requires this, re-evaluate after moving to Tpetra-based solvers if( m_precond ) { diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index 491df9bf949..3003bab3cde 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -934,12 +934,14 @@ class SolverBase : public ExecutableGroup * * @param newNewtonNorm Residual norm at current iteration * @param oldNewtonNorm Residual norm at previous iteration - * @param weakestTol Weakest tolerance allowed (default 1e-3). + * @param krylovParams Linear solver parameters + * @param logLevel Log level * @return Adaptive tolerance recommendation */ static real64 eisenstatWalker( real64 const newNewtonNorm, real64 const oldNewtonNorm, - real64 const weakestTol ); + LinearSolverParameters::Krylov const & krylovParams, + integer const logLevel ); /** * @brief Get the Constitutive Name object From 9f2ba4b0b75d83e6c139f93cd8c81cd3eea2b3cc Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Fri, 20 Sep 2024 09:37:22 -1000 Subject: [PATCH 208/286] add code coverage label requirement (#3363) --- .github/workflows/ci_tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index c0a8ff85faa..bf62843e07b 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -250,6 +250,8 @@ jobs: ENABLE_TRILINOS: OFF GCP_BUCKET: geosx/ubuntu22.04-gcc11 RUNS_ON: Runner_4core_16GB + REQUIRED_LABEL: "ci: run code coverage" + # mac_builds: # needs: From f9a64bb2d1fe34eab99adc25ea1d4be822eca129 Mon Sep 17 00:00:00 2001 From: Stefano Frambati Date: Sat, 21 Sep 2024 08:20:11 +0200 Subject: [PATCH 209/286] fix: testLifoStorage random fail on RockyLinux with clang+CUDA (#3362) * added debug print for testLifoStorage * force test for debugging purposes * added extraction of TPL tag in ci * corrected ci yml * pb with yml * indentation * manually added tpl tag * leftover dependency * corrected tag extraction * indentation * building only failing test * do not install * do not run other tests * commented print statements * changed lifo test sizes for coherence * changed lifo test sizes for coherence * restoring yml files and updating testLifoStorage * restored ci build script --- .../common/unitTests/testLifoStorage.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/coreComponents/common/unitTests/testLifoStorage.cpp b/src/coreComponents/common/unitTests/testLifoStorage.cpp index 80414e5ce04..8c50e8f8f79 100644 --- a/src/coreComponents/common/unitTests/testLifoStorage.cpp +++ b/src/coreComponents/common/unitTests/testLifoStorage.cpp @@ -120,7 +120,7 @@ void testLifoStorageBig( int elemCnt, int numberOfElementsOnDevice, int numberOf array.move( local::RAJAHelper< POLICY >::space ); LifoStorage< float, localIndex > lifo( "lifo", array, numberOfElementsOnDevice, numberOfElementsOnHost, totalNumberOfBuffers ); - for( int j = 0; j < 10; j++ ) + for( int j = 0; j < totalNumberOfBuffers; j++ ) { float * dataPointer = array.data(); @@ -128,7 +128,7 @@ void testLifoStorageBig( int elemCnt, int numberOfElementsOnDevice, int numberOf lifo.push( array ); } - for( int j = 0; j < 10; j++ ) + for( int j = 0; j < totalNumberOfBuffers; j++ ) { lifo.pop( array ); float * dataPointer = array.data(); @@ -178,22 +178,22 @@ TEST( LifoStorageTest, LifoStorageBufferOnCUDA ) TEST( LifoStorageTest, LifoStorageBufferOnCUDAlarge ) { - testLifoStorageBig< parallelDevicePolicy< > >( 1000000, 2, 3, 10000 ); + testLifoStorageBig< parallelDevicePolicy< > >( 1000000, 2, 3, 10 ); } TEST( LifoStorageTest, LifoStorageBufferOnCUDAlargeAutoSizeHost ) { - testLifoStorageBig< parallelDevicePolicy< > >( 1000000, 2, -80, 10000 ); + testLifoStorageBig< parallelDevicePolicy< > >( 1000000, 2, -80, 10 ); } TEST( LifoStorageTest, LifoStorageBufferOnCUDAlargeAutoSizeDevice ) { - testLifoStorageBig< parallelDevicePolicy< > >( 1000000, -80, 3, 10000 ); + testLifoStorageBig< parallelDevicePolicy< > >( 1000000, -80, 3, 10 ); } TEST( LifoStorageTest, LifoStorageBufferOnCUDAlargeAutoSizeBoth ) { - testLifoStorageBig< parallelDevicePolicy< > >( 1000000, -80, -80, 10000 ); + testLifoStorageBig< parallelDevicePolicy< > >( 1000000, -80, -80, 10 ); } From d6c5900c88f6a76d481dbb342771cbd6ab295353 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" <50467563+victorapm@users.noreply.github.com> Date: Wed, 25 Sep 2024 08:46:34 -0400 Subject: [PATCH 210/286] Move chai's disableCallbacks to setupLvArray (#3367) --- src/coreComponents/common/initializeEnvironment.cpp | 3 +++ src/coreComponents/mainInterface/ProblemManager.cpp | 3 --- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index 78e9a0db602..ee3b826aec6 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -98,6 +98,9 @@ void setupLvArray() #else LvArray::system::disableFloatingPointExceptions( FE_ALL_EXCEPT ); #endif + + /* Disable chai callbacks by default */ + chai::ArrayManager::getInstance()->disableCallbacks(); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index f5b074425c3..0a134a6bcea 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -138,9 +138,6 @@ ProblemManager::ProblemManager( conduit::Node & root ): setApplyDefaultValue( 0 ). setRestartFlags( RestartFlags::WRITE ). setDescription( "Whether to disallow using pinned memory allocations for MPI communication buffers." ); - - chai::ArrayManager::getInstance()->disableCallbacks(); - } ProblemManager::~ProblemManager() From c225416b8ca7efcc08e13503f96dbc08e3c925f3 Mon Sep 17 00:00:00 2001 From: Ryan Aronson Date: Thu, 26 Sep 2024 06:44:40 +0200 Subject: [PATCH 211/286] docs: Move table titles from CompleteXMLSchema.rst to corresponding include file (#3321) * alter SchemaToRSTDocumentation to move headers into table files * rename Element to XML Element * avoid includeding headers in table files when included outside of CompleteXMLSchema.rst --------- Co-authored-by: Randolph R. Settgast --- scripts/SchemaToRSTDocumentation.py | 19 ++- .../events/docs/EventManager.rst | 7 +- .../events/docs/TasksManager.rst | 4 +- .../functions/docs/FunctionManager.rst | 5 +- .../fluidFlow/SourceFluxStatistics.cpp | 2 +- src/coreComponents/schema/schema.xsd | 26 ++-- src/coreComponents/schema/schema.xsd.other | 130 +++++++++--------- 7 files changed, 102 insertions(+), 91 deletions(-) diff --git a/scripts/SchemaToRSTDocumentation.py b/scripts/SchemaToRSTDocumentation.py index 23e7613e422..8a7b1a8cda7 100644 --- a/scripts/SchemaToRSTDocumentation.py +++ b/scripts/SchemaToRSTDocumentation.py @@ -13,7 +13,10 @@ def comment(self, data): self.end(etree.Comment) -def writeTableRST(file_name, values): +def writeTableRST(type_name, file_name, title_prefix, values): + + element_header = '%s: %s' % (title_prefix, type_name) + L = [[len(x) for x in row] for row in values] # np isn't in the docker images for our CI @@ -54,7 +57,9 @@ def writeTableRST(file_name, values): # Build table with open(file_name, 'w') as f: - f.write('\n\n') + f.write('%s\n' % (element_header)) + f.write('=' * len(element_header) + '\n') + f.write('\n') f.write(boundary) f.write(formatted_lines[0]) f.write(boundary) @@ -269,13 +274,10 @@ def main(schema_name='schema.xsd', output_folder='./', xsd='{http://www.w3.org/2 for type_name in sorted(input_attribute_map.keys()): # Write the individual tables table_values = buildTableValues(input_attribute_map[type_name]) - writeTableRST('%s/%s.rst' % (datastructure_folder, type_name), table_values) + writeTableRST( type_name, '%s/%s.rst' % (datastructure_folder, type_name), 'XML Element', table_values) # Write to the master list - element_header = 'Element: %s' % (type_name) output_handle.write('\n.. _XML_%s:\n\n' % (type_name)) - output_handle.write('%s\n' % (element_header)) - output_handle.write('=' * len(element_header) + '\n') output_handle.write('.. include:: %s.rst\n\n' % (type_name)) # Parse the non-input schema definitions @@ -288,13 +290,10 @@ def main(schema_name='schema.xsd', output_folder='./', xsd='{http://www.w3.org/2 table_values = buildTableValues(other_attribute_map[type_name], link_string='DATASTRUCTURE', include_defaults=False) - writeTableRST('%s/%s_other.rst' % (datastructure_folder, type_name), table_values) + writeTableRST( type_name, '%s/%s_other.rst' % (datastructure_folder, type_name), 'Datastructure', table_values) # Write to the master list - element_header = 'Datastructure: %s' % (type_name) output_handle.write('\n.. _DATASTRUCTURE_%s:\n\n' % (type_name)) - output_handle.write('%s\n' % (element_header)) - output_handle.write('=' * len(element_header) + '\n') output_handle.write('.. include:: %s_other.rst\n\n' % (type_name)) diff --git a/src/coreComponents/events/docs/EventManager.rst b/src/coreComponents/events/docs/EventManager.rst index d7fde6dc073..8fe6ace3bb8 100644 --- a/src/coreComponents/events/docs/EventManager.rst +++ b/src/coreComponents/events/docs/EventManager.rst @@ -53,7 +53,7 @@ Event The children of the Event block define the events that may execute during a simulation. These may be of type ``HaltEvent``, ``PeriodicEvent``, or ``SoloEvent``. The exit criteria for the global event loop are defined by the attributes ``maxTime`` and ``maxCycle`` (which by default are set to their max values). If the optional logLevel flag is set, the EventManager will report additional information with regards to timestep requests and event forecasts for its children. .. include:: /docs/sphinx/datastructure/Events.rst - + :start-line: 3 PeriodicEvent ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -68,20 +68,21 @@ By default, a PeriodicEvent will execute throughout the entire simulation. This The timestep request event is typically determined via its target. However, this value can be overridden by setting the ``forceDt`` or ``maxEventDt`` attributes. .. include:: /docs/sphinx/datastructure/PeriodicEvent.rst - + :start-line: 3 SoloEvent ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This type of event will execute once once the event loop reaches a certain cycle (targetCycle) or time (targetTime). Similar to the PeriodicEvent type, this event will modify its timestep requests so that a cycle occurs at the exact time requested (this can be turned off by specifying targetExactTimestep="0"). The forecast calculations follow an similar approach to the PeriodicEvent type. .. include:: /docs/sphinx/datastructure/SoloEvent.rst - + :start-line: 3 HaltEvent ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This event type is designed to track the wall clock. When the time exceeds the value specified via maxRunTime, the event will trigger and set a flag that instructs the main EventManager loop to cleanly exit at the end of the current cycle. The event for cast for this event type is given by: ``forecast = (maxRuntime - (currentTime - startTime)) / realDt`` .. include:: /docs/sphinx/datastructure/HaltEvent.rst + :start-line: 3 diff --git a/src/coreComponents/events/docs/TasksManager.rst b/src/coreComponents/events/docs/TasksManager.rst index 22a026a2e38..49ca88b6dc6 100644 --- a/src/coreComponents/events/docs/TasksManager.rst +++ b/src/coreComponents/events/docs/TasksManager.rst @@ -22,12 +22,14 @@ Task The children of the Tasks block define different Tasks to be triggered by events specified in the :ref:`EventManager` during the execution of the simulation. At present the only supported task is the ``PackCollection`` used to collect time history data for output by a TimeHistory output. .. include:: /docs/sphinx/datastructure/Tasks.rst - + :start-line: 3 + PackCollection *************************** The ``PackCollection`` Task is used to collect time history information from fields. Either the entire field or specified named sets of indices in the field can be collected. .. include:: /docs/sphinx/datastructure/PackCollection.rst + :start-line: 3 Note: The time history information collected via this task is buffered internally until it is output by a linked TimeHistory Output. diff --git a/src/coreComponents/functions/docs/FunctionManager.rst b/src/coreComponents/functions/docs/FunctionManager.rst index 18138683c0e..66c1e34e503 100644 --- a/src/coreComponents/functions/docs/FunctionManager.rst +++ b/src/coreComponents/functions/docs/FunctionManager.rst @@ -65,7 +65,7 @@ A table function uses a set of pre-computed values defined at points on a struct Typically, the axes of the table will represent time and/or spatial dimensions; however, these can be applied to represent phase diagrams, etc. .. include:: /docs/sphinx/datastructure/TableFunction.rst - + :start-line: 3 1D Table ************* @@ -158,6 +158,7 @@ This function leverages the symbolic expression library mathpresso to define and These functions are processed using an x86-64 JIT compiler, so are nearly as efficient as natively compiled C++ expressions. .. include:: /docs/sphinx/datastructure/SymbolicFunction.rst + :start-line: 3 The ``variableNames`` attribute defines a set of single-character names for the inputs to the symbolic function. There should be a definition for each scalar input and for each component of a vector input. @@ -188,7 +189,7 @@ This function is derived from the symbolic function. However, instead of using the time or object as inputs, it is used to combine the outputs of other functions using a symbolic expression. .. include:: /docs/sphinx/datastructure/CompositeFunction.rst - + :start-line: 3 The ``functionNames`` attribute defines the set of input functions to use (these may be of any type, and may each have any number of inputs). The ``variableNames`` attribute defines a set of single-character names for each function. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp index 42ed3028feb..9667e4270f7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp @@ -31,7 +31,7 @@ SourceFluxStatsAggregator::SourceFluxStatsAggregator( const string & name, Group * const parent ): Base( name, parent ) { - getWrapper< integer >( Group::viewKeyStruct::logLevelString() ). + getWrapperBase( Group::viewKeyStruct::logLevelString() ). appendDescription( GEOS_FMT( "\n- Log Level 1 outputs the sum of all {0}(s) produced rate & mass,\n" "- Log Level 2 details values for each {0},\n" "- Log Level 3 details values for each region.", diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 8bcb61ab88b..2930e0f6b9e 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -1770,6 +1770,10 @@ stress - traction is applied to the faces as specified by the inner product of i + + + + @@ -1822,6 +1826,8 @@ stress - traction is applied to the faces as specified by the inner product of i + + +* Require - Use line search. If smaller residual than starting resdual is not achieved, cut time-step.--> @@ -1922,10 +1928,12 @@ the relative residual norm satisfies: - + + + @@ -1941,15 +1949,15 @@ the relative residual norm satisfies: - + - + - + - + - + - + @@ -2961,7 +2969,7 @@ Local- Add jump stabilization on interior of macro elements--> - + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 215191d89f5..d59f6b947e5 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -471,7 +471,7 @@ - + @@ -553,7 +553,7 @@ - + @@ -590,7 +590,7 @@ - + @@ -641,7 +641,7 @@ - + @@ -682,7 +682,7 @@ - + @@ -715,7 +715,7 @@ - + @@ -726,7 +726,7 @@ - + @@ -739,7 +739,7 @@ - + @@ -752,7 +752,7 @@ - + @@ -768,7 +768,7 @@ - + @@ -802,7 +802,7 @@ - + @@ -865,7 +865,7 @@ - + @@ -896,7 +896,7 @@ - + @@ -909,7 +909,7 @@ - + @@ -922,7 +922,7 @@ - + @@ -935,7 +935,7 @@ - + @@ -948,7 +948,7 @@ - + @@ -963,7 +963,7 @@ - + @@ -974,7 +974,7 @@ - + @@ -987,7 +987,7 @@ - + @@ -998,7 +998,7 @@ - + @@ -1009,7 +1009,7 @@ - + @@ -1022,7 +1022,7 @@ - + @@ -1033,7 +1033,7 @@ - + @@ -1044,7 +1044,7 @@ - + @@ -1057,7 +1057,7 @@ - + @@ -1072,7 +1072,7 @@ - + @@ -1087,7 +1087,7 @@ - + @@ -1100,7 +1100,7 @@ - + @@ -1115,7 +1115,7 @@ - + @@ -1126,7 +1126,7 @@ - + @@ -1139,7 +1139,7 @@ - + @@ -1152,7 +1152,7 @@ - + @@ -1168,7 +1168,7 @@ - + @@ -1183,7 +1183,7 @@ - + @@ -1200,7 +1200,7 @@ - + @@ -1217,7 +1217,7 @@ - + @@ -1232,7 +1232,7 @@ - + @@ -1245,7 +1245,7 @@ - + @@ -1284,7 +1284,7 @@ - + @@ -1313,7 +1313,7 @@ - + @@ -1404,7 +1404,7 @@ - + @@ -2958,7 +2958,7 @@ - + @@ -2986,7 +2986,7 @@ - + @@ -3005,11 +3005,11 @@ - + - + @@ -3019,7 +3019,7 @@ - + @@ -3029,11 +3029,11 @@ - + - + @@ -3043,7 +3043,7 @@ - + @@ -3053,7 +3053,7 @@ - + @@ -3063,7 +3063,7 @@ - + @@ -3087,7 +3087,7 @@ - + @@ -3105,7 +3105,7 @@ - + @@ -3117,7 +3117,7 @@ - + @@ -3129,7 +3129,7 @@ - + @@ -3137,11 +3137,11 @@ - + - + @@ -3164,7 +3164,7 @@ - + @@ -3190,7 +3190,7 @@ - + @@ -3211,7 +3211,7 @@ - + @@ -3241,7 +3241,7 @@ - + @@ -3255,7 +3255,7 @@ - + @@ -3282,7 +3282,7 @@ - + @@ -3319,7 +3319,7 @@ - + From 0db85bed495f1b37bd1b64a4c0eef74d62717cc3 Mon Sep 17 00:00:00 2001 From: Arnaud DUDES <155963334+arng40@users.noreply.github.com> Date: Tue, 1 Oct 2024 18:35:46 +0200 Subject: [PATCH 212/286] feat: Log refactor - Output PVT (#3149) Co-authored-by: MelReyCG <122801580+MelReyCG@users.noreply.github.com> Co-authored-by: Randolph Settgast --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../common/format/table/TableData.cpp | 39 ++- .../common/format/table/TableData.hpp | 31 ++- .../common/format/table/TableFormatter.cpp | 8 +- .../common/format/table/TableFormatter.hpp | 55 +++- .../common/format/table/TableLayout.hpp | 2 + .../format/table/unitTests/testTable.cpp | 15 +- .../constitutive/ConstitutiveBase.cpp | 10 +- .../constitutive/ConstitutiveBase.hpp | 14 + .../multifluid/CO2Brine/CO2BrineFluid.cpp | 44 +++- .../multifluid/CO2Brine/CO2BrineFluid.hpp | 6 + .../fluid/multifluid/CO2Brine/PhaseModel.hpp | 11 +- .../CO2Brine/functions/BrineEnthalpy.cpp | 13 +- .../CO2Brine/functions/BrineEnthalpy.hpp | 2 +- .../CO2Brine/functions/CO2Enthalpy.cpp | 9 +- .../CO2Brine/functions/CO2Enthalpy.hpp | 2 +- .../CO2Brine/functions/CO2Solubility.cpp | 10 +- .../CO2Brine/functions/CO2Solubility.hpp | 4 +- .../functions/EzrokhiBrineDensity.cpp | 12 +- .../functions/EzrokhiBrineDensity.hpp | 2 +- .../functions/EzrokhiBrineViscosity.cpp | 8 +- .../functions/EzrokhiBrineViscosity.hpp | 2 +- .../functions/FenghourCO2Viscosity.cpp | 8 +- .../functions/FenghourCO2Viscosity.hpp | 2 +- .../CO2Brine/functions/FlashModelBase.hpp | 13 - .../CO2Brine/functions/NoOpPVTFunction.hpp | 4 +- .../CO2Brine/functions/PVTFunctionBase.hpp | 11 - .../functions/PhillipsBrineDensity.cpp | 8 +- .../functions/PhillipsBrineDensity.hpp | 2 +- .../functions/PhillipsBrineViscosity.cpp | 8 +- .../functions/PhillipsBrineViscosity.hpp | 2 +- .../functions/SpanWagnerCO2Density.cpp | 8 +- .../functions/SpanWagnerCO2Density.hpp | 2 +- .../CO2Brine/functions/WaterDensity.cpp | 8 +- .../CO2Brine/functions/WaterDensity.hpp | 2 +- .../reactive/ReactiveBrineFluid.cpp | 17 +- .../reactive/ReactiveBrineFluid.hpp | 7 + .../functions/TableFunction.cpp | 240 ++++++++++++------ .../functions/TableFunction.hpp | 43 +++- src/coreComponents/schema/schema.xsd | 12 + .../testCO2BrinePVTModels.cpp | 14 +- .../testCO2SpycherPruessModels.cpp | 7 +- .../developerGuide/Contributing/Sphinx.rst | 18 ++ .../Contributing/githubtestsummary.png | Bin 0 -> 213374 bytes .../Contributing/readthedocsbuildsummary.png | Bin 0 -> 158384 bytes 46 files changed, 527 insertions(+), 214 deletions(-) create mode 100644 src/docs/sphinx/developerGuide/Contributing/githubtestsummary.png create mode 100644 src/docs/sphinx/developerGuide/Contributing/readthedocsbuildsummary.png diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 7f309b2c34b..2445d111d26 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3163-7758-9fe3734 + baseline: integratedTests/baseline_integratedTests-pr3149-7884-f97a068 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 67f0c1c877e..a63ce3f58e4 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3149( 2024-09-30) +===================== +Added new field "writeCSV" + PR #3163 (2024-09-20) ===================== Added new fields (krylovStrongestTol, adaptiveGamma, adaptiveExponent) to the LinearSolverParameters for adaptive tolerances. diff --git a/src/coreComponents/common/format/table/TableData.cpp b/src/coreComponents/common/format/table/TableData.cpp index 4ff32559385..dcbec10a01a 100644 --- a/src/coreComponents/common/format/table/TableData.cpp +++ b/src/coreComponents/common/format/table/TableData.cpp @@ -51,11 +51,42 @@ std::vector< string > const & TableData::getErrorMsgs() const return m_errorsMsg; } -TableData2D::Conversion1D TableData2D::buildTableData( string_view targetUnit, - string_view rowFmt, - string_view columnFmt ) const +void TableData2D::collectTableValues( arraySlice1d< real64 const > rowAxisValues, + arraySlice1d< real64 const > columnAxisValues, + arrayView1d< real64 const > values ) { - TableData2D::Conversion1D tableData1D; + integer const nX = rowAxisValues.size(); + integer const nY = columnAxisValues.size(); + + for( integer i = 0; i < nX; i++ ) + { + for( integer y = 0; y < nY; y++ ) + { + addCell( rowAxisValues[i], columnAxisValues[y], values[ y*nX + i ] ); + } + } +} + +TableData2D::TableDataHolder TableData2D::convertTable2D( arrayView1d< real64 const > const values, + units::Unit const valueUnit, + ArrayOfArraysView< real64 const > const coordinates, + string_view rowAxisDescription, + string_view columnAxisDescription ) +{ + string const rowFmt = GEOS_FMT( "{} = {{}}", rowAxisDescription ); + string const columnFmt = GEOS_FMT( "{} = {{}}", columnAxisDescription ); + + collectTableValues( coordinates[0], coordinates[1], values ); + return buildTableData( string( units::getDescription( valueUnit )), + rowFmt, + columnFmt ); +} + +TableData2D::TableDataHolder TableData2D::buildTableData( string_view targetUnit, + string_view rowFmt, + string_view columnFmt ) const +{ + TableData2D::TableDataHolder tableData1D; std::vector< size_t > rowsLength; tableData1D.headerNames.push_back( string( targetUnit ) ); diff --git a/src/coreComponents/common/format/table/TableData.hpp b/src/coreComponents/common/format/table/TableData.hpp index 316adeda8a3..aa35f06a0f6 100644 --- a/src/coreComponents/common/format/table/TableData.hpp +++ b/src/coreComponents/common/format/table/TableData.hpp @@ -20,6 +20,7 @@ #ifndef GEOS_COMMON_FORMAT_TABLE_TABLEDATA_HPP #define GEOS_COMMON_FORMAT_TABLE_TABLEDATA_HPP +#include "common/Units.hpp" #include "common/DataTypes.hpp" #include "common/format/Format.hpp" @@ -85,9 +86,10 @@ class TableData2D using ColumnType = real64; /// Struct containing conversion informations - struct Conversion1D + struct TableDataHolder { /// Vector containing all columns names + /// A header value is presented as "pressure [K] = {}" std::vector< string > headerNames; /// TableData to be built TableData tableData; @@ -103,6 +105,30 @@ class TableData2D template< typename T > void addCell( RowType rowValue, ColumnType columnValue, T const & value ); + /** + * @brief Collects all the values needed to build the table + * @param rowAxisValues Vector containing all row axis values + * @param columnAxisValues Vector containing all column axis values + * @param values Vector containing all table values + */ + void collectTableValues( arraySlice1d< real64 const > rowAxisValues, + arraySlice1d< real64 const > columnAxisValues, + arrayView1d< real64 const > values ); + + /** + * @param values Vector containing all table values + * @param valueUnit The table unit value + * @param coordinates Array containing row/column axis values + * @param rowAxisDescription The description for a row unit value + * @param columnAxisDescription The description for a column unit value + * @return A struct containing the tableData converted and all header values ; + */ + TableData2D::TableDataHolder convertTable2D( arrayView1d< real64 const > const values, + units::Unit const valueUnit, + ArrayOfArraysView< real64 const > const coordinates, + string_view rowAxisDescription, + string_view columnAxisDescription ); + /** * @return Convert and return a struct containing a 1D Table, the column names list from a TableData2D and any errors related to the table * @param dataDescription The table dataDescription shown at the top left side @@ -112,7 +138,8 @@ class TableData2D * By default it displays the axis value. * I.E to display a customized axis to show the pressures in y axis, a rowFmt value can be : "pressure [K] = {}" */ - Conversion1D buildTableData( string_view dataDescription, string_view rowFmt = "{}", string_view columnFmt = "{}" ) const; + TableDataHolder buildTableData( string_view dataDescription, + string_view rowFmt = "{}", string_view columnFmt = "{}" ) const; private: /// @brief all cell values by their [ row ][ column ] diff --git a/src/coreComponents/common/format/table/TableFormatter.cpp b/src/coreComponents/common/format/table/TableFormatter.cpp index da1f90df986..56f529bdcee 100644 --- a/src/coreComponents/common/format/table/TableFormatter.cpp +++ b/src/coreComponents/common/format/table/TableFormatter.cpp @@ -17,6 +17,7 @@ * @file TableFormatter.cpp */ +#include "TableFormatter.hpp" #include #include "common/format/StringUtilities.hpp" #include "TableFormatter.hpp" @@ -67,7 +68,8 @@ string TableCSVFormatter::dataToString( TableData const & tableData ) const return oss.str(); } -string TableCSVFormatter::toString( TableData const & tableData ) const +template<> +string TableCSVFormatter::toString< TableData >( TableData const & tableData ) const { return headerToString() + dataToString( tableData ); } @@ -155,7 +157,8 @@ string TableTextFormatter::layoutToString() const return tableOutput.str(); } -string TableTextFormatter::toString( TableData const & tableData ) const +template<> +string TableTextFormatter::toString< TableData >( TableData const & tableData ) const { std::ostringstream tableOutput; string sectionSeparatingLine; @@ -403,4 +406,5 @@ void TableTextFormatter::outputSectionRows( std::vector< TableLayout::Column > c tableOutput << GEOS_FMT( "{}\n", sectionSeparatingLine ); } } + } diff --git a/src/coreComponents/common/format/table/TableFormatter.hpp b/src/coreComponents/common/format/table/TableFormatter.hpp index 35410506e07..165533445b6 100644 --- a/src/coreComponents/common/format/table/TableFormatter.hpp +++ b/src/coreComponents/common/format/table/TableFormatter.hpp @@ -37,6 +37,8 @@ class TableFormatter /// Layout for a table TableLayout m_tableLayout; + TableFormatter() = default; + /** * @brief Construct a new Table Formatter from a tableLayout * @param tableLayout Contain all column names and optionnaly the table title @@ -56,6 +58,13 @@ class TableCSVFormatter : public TableFormatter { public: + /** + * @brief Construct a new Table Formatter + */ + TableCSVFormatter(): + TableFormatter( TableLayout() ) + {} + /** * @brief Construct a new Table Formatter from a tableLayout * @param tableLayout Contain all column names and optionnaly the table title @@ -80,28 +89,47 @@ class TableCSVFormatter : public TableFormatter string dataToString( TableData const & tableData ) const; /** - * @brief Convert the TableData to a table string. - * @param tableData The TableData to convert. - * @return The table string representation of the TableData. + * @brief Convert a data source to a CSV string. + * @tparam DATASOURCE The source to convert + * @param tableData The data source to convert + * @return The CSV string representation of a data source. */ - string toString( TableData const & tableData ) const; + template< typename DATASOURCE > + string toString( DATASOURCE const & tableData ) const; }; +/** + * @brief Convert the TableData to a CSV string. + * @param tableData The TableData to convert. + * @return The CSV string representation of the TableData. + */ +template<> +string TableCSVFormatter::toString< TableData >( TableData const & tableData ) const; + + /** * @brief class for log formatting */ class TableTextFormatter : public TableFormatter { - public: + + /** + * @brief Construct a new TableFormatter + */ + TableTextFormatter(): + TableFormatter( TableLayout() ) + {} + /** * @brief Construct a new TableFormatter from a tableLayout * @param tableLayout Contain all column names and optionnaly the table title */ TableTextFormatter( TableLayout const & tableLayout ); + /** * @brief Destroy the Table Text Formatter object */ @@ -113,11 +141,12 @@ class TableTextFormatter : public TableFormatter string layoutToString() const; /** - * @brief Convert the TableData to a table string. - * @param tableData The TableData to convert. + * @brief Convert a data source to a table string. + * @param tableData The data source to convert. * @return The table string representation of the TableData. */ - string toString( TableData const & tableData ) const; + template< typename DATASOURCE > + string toString( DATASOURCE const & tableData ) const; private: @@ -126,7 +155,7 @@ class TableTextFormatter : public TableFormatter /// for the extremity of a row static constexpr char m_horizontalLine = '-'; - /**F + /** * @brief Fill the vector (m_column) in tableData with values from rows stored in tableData. * @param columns Vector of columns to be filled. * @param tableData Vector containing all rows filled with values @@ -217,6 +246,14 @@ class TableTextFormatter : public TableFormatter integer const nbRows, TableLayout::Section const section ) const; }; + +/** + * @brief Convert a TableData to a table string. + * @param tableData The TableData to convert. + * @return The table string representation of the TableData. + */ +template<> +string TableTextFormatter::toString< TableData >( TableData const & tableData ) const; } #endif /* GEOS_COMMON_FORMAT_TABLE_TABLEFORMATTER_HPP */ diff --git a/src/coreComponents/common/format/table/TableLayout.hpp b/src/coreComponents/common/format/table/TableLayout.hpp index 99354e85417..4f24fa5559c 100644 --- a/src/coreComponents/common/format/table/TableLayout.hpp +++ b/src/coreComponents/common/format/table/TableLayout.hpp @@ -97,6 +97,8 @@ class TableLayout string m_maxStringSize; }; + TableLayout() = default; + /** * @brief Construct a new Table object, all values in the table are centered by default * @param columnNames The names of the columns diff --git a/src/coreComponents/common/format/table/unitTests/testTable.cpp b/src/coreComponents/common/format/table/unitTests/testTable.cpp index 35507b94c03..3663b5eae22 100644 --- a/src/coreComponents/common/format/table/unitTests/testTable.cpp +++ b/src/coreComponents/common/format/table/unitTests/testTable.cpp @@ -210,9 +210,9 @@ TEST( testTable, table2DTable ) //convert string const rowFmt = GEOS_FMT( "{} = {{}}", "Temperature" ); string const columnFmt = GEOS_FMT( "{} = {{}}", "Pression" ); - TableData2D::Conversion1D tableconverted = tableData.buildTableData( "Viscosity kg*s", - rowFmt, - columnFmt ); + TableData2D::TableDataHolder tableconverted = tableData.buildTableData( "Viscosity kg*s", + rowFmt, + columnFmt ); //format TableLayout const tableLayout( tableconverted.headerNames ); @@ -248,9 +248,9 @@ TEST( testTable, table2DColumnMismatch ) //convert string const rowFmt = GEOS_FMT( "{} = {{}}", "Temperature" ); string const columnFmt = GEOS_FMT( "{} = {{}}", "Pression" ); - TableData2D::Conversion1D tableConverted = tableData.buildTableData( "Viscosity kg*s", - rowFmt, - columnFmt ); + TableData2D::TableDataHolder tableConverted = tableData.buildTableData( "Viscosity kg*s", + rowFmt, + columnFmt ); //format TableLayout const tableLayout( tableConverted.headerNames ); @@ -274,11 +274,10 @@ TEST( testTable, table2DColumnMismatch ) TEST( testTable, layoutTable ) { string filename = "fluid1_phaseModel1_PhillipsBrineDensity_table"; - //2. format + string log = GEOS_FMT( "The {} PVT table exceeding 500 rows.\nTo visualize the tables, go to the generated csv \n", filename ); TableLayout const tableLayoutInfos( {TableLayout::ColumnParam{{log}, TableLayout::Alignment::left}}, filename ); - //3. log TableTextFormatter const tableLog( tableLayoutInfos ); EXPECT_EQ( tableLog.layoutToString(), "\n-------------------------------------------------------------------------------------\n" diff --git a/src/coreComponents/constitutive/ConstitutiveBase.cpp b/src/coreComponents/constitutive/ConstitutiveBase.cpp index f18138b0e87..2c7334239c3 100644 --- a/src/coreComponents/constitutive/ConstitutiveBase.cpp +++ b/src/coreComponents/constitutive/ConstitutiveBase.cpp @@ -30,7 +30,8 @@ namespace constitutive ConstitutiveBase::ConstitutiveBase( string const & name, Group * const parent ): Group( name, parent ), - m_numQuadraturePoints( 1 ) + m_numQuadraturePoints( 1 ), + m_isClone( false ) { setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); } @@ -72,6 +73,11 @@ void ConstitutiveBase::allocateConstitutiveData( dataRepository::Group & parent, this->resize( parent.size() ); } +void ConstitutiveBase::setIsClone( bool const newState ) +{ + m_isClone = newState; +} + std::unique_ptr< ConstitutiveBase > ConstitutiveBase::deliverClone( string const & name, Group * const parent ) const @@ -84,6 +90,8 @@ ConstitutiveBase::deliverClone( string const & name, wrapper.copyWrapper( this->getWrapperBase( wrapper.getName() ) ); } ); + newModel->setIsClone( true ); + return newModel; } diff --git a/src/coreComponents/constitutive/ConstitutiveBase.hpp b/src/coreComponents/constitutive/ConstitutiveBase.hpp index 9f39fbbd314..c025a58bb4b 100644 --- a/src/coreComponents/constitutive/ConstitutiveBase.hpp +++ b/src/coreComponents/constitutive/ConstitutiveBase.hpp @@ -113,6 +113,11 @@ class ConstitutiveBase : public dataRepository::Group localIndex numQuadraturePoints() const { return m_numQuadraturePoints; } + /** + * @return true if the instance has been produced with deliverClone() + */ + bool isClone() const { return m_isClone; } + virtual std::vector< string > getSubRelationNames() const { return {}; } /** @@ -162,7 +167,16 @@ class ConstitutiveBase : public dataRepository::Group private: + /** + * @brief Set a isClone state boolean + * @param newState The state of the new constitutive model + */ + void setIsClone( bool const newState ); + localIndex m_numQuadraturePoints; + + /// Indicate if this constitutive model a clone + bool m_isClone; }; } diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index 7125e3fe6a0..c90b6c296f6 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -21,6 +21,7 @@ #include "constitutive/fluid/multifluid/MultiFluidFields.hpp" #include "constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp" #include "common/Units.hpp" +#include "functions/TableFunction.hpp" namespace geos { @@ -102,6 +103,12 @@ CO2BrineFluid( string const & name, Group * const parent ): setRestartFlags( RestartFlags::NO_WRITE ). setDescription( "Names of solubility tables for each phase" ); + this->registerWrapper( viewKeyStruct::writeCSVFlagString(), &m_writeCSV ). + setInputFlag( InputFlags::OPTIONAL ). + setRestartFlags( RestartFlags::NO_WRITE ). + setDescription( "Write PVT tables into a CSV file" ). + setDefaultValue( 0 ); + // if this is a thermal model, we need to make sure that the arrays will be properly displayed and saved to restart if( isThermal() ) { @@ -228,14 +235,12 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::postInputInitialization() string const expectedGasPhaseNames[] = { "CO2", "co2", "gas", "Gas" }; m_p2Index = PVTFunctionHelpers::findName( m_phaseNames, expectedGasPhaseNames, viewKeyStruct::phaseNamesString() ); - createPVTModels(); } template< typename PHASE1, typename PHASE2, typename FLASH > void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() { - // TODO: get rid of these external files and move into XML, this is too error prone // For now, to support the legacy input, we read all the input parameters at once in the arrays below, and then we create the models array1d< array1d< string > > phase1InputParams; @@ -325,10 +330,23 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() InputError ); // then, we are ready to instantiate the phase models - m_phase1 = std::make_unique< PHASE1 >( getName() + "_phaseModel1", phase1InputParams, m_componentNames, m_componentMolarWeight, - getLogLevel() > 0 && logger::internal::rank==0 ); - m_phase2 = std::make_unique< PHASE2 >( getName() + "_phaseModel2", phase2InputParams, m_componentNames, m_componentMolarWeight, - getLogLevel() > 0 && logger::internal::rank==0 ); + bool const isClone = this->isClone(); + TableFunction::OutputOptions const pvtOutputOpts = { + !isClone && m_writeCSV,// writeCSV + !isClone && (getLogLevel() > 0 && logger::internal::rank==0), // writeInLog + }; + + m_phase1 = std::make_unique< PHASE1 >( getName() + "_phaseModel1", + phase1InputParams, + m_componentNames, + m_componentMolarWeight, + pvtOutputOpts ); + m_phase2 = std::make_unique< PHASE2 >( getName() + "_phaseModel2", + phase2InputParams, + m_componentNames, + m_componentMolarWeight, + pvtOutputOpts ); + // 2) Create the flash model if( !m_flashModelParaFile.empty()) @@ -349,12 +367,16 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() { if( strs[1] == FLASH::catalogName() ) { + TableFunction::OutputOptions const flashOutputOpts = { + !isClone && m_writeCSV,// writeCSV + !isClone && (getLogLevel() > 0 && logger::internal::rank==0), // writeInLog + }; m_flash = std::make_unique< FLASH >( getName() + '_' + FLASH::catalogName(), strs, m_phaseNames, m_componentNames, m_componentMolarWeight, - getLogLevel() > 0 && logger::internal::rank==0 ); + flashOutputOpts ); } } else @@ -390,12 +412,18 @@ void CO2BrineFluid< PHASE1, PHASE2, FLASH >::createPVTModels() { strs[2] = m_solubilityTables[0]; } + + TableFunction::OutputOptions const flashOutputOpts = { + !isClone && m_writeCSV,// writeCSV + !isClone && (getLogLevel() >= 0 && logger::internal::rank==0), // writeInLog + }; + m_flash = std::make_unique< FLASH >( getName() + '_' + FLASH::catalogName(), strs, m_phaseNames, m_componentNames, m_componentMolarWeight, - getLogLevel() > 0 && logger::internal::rank==0 ); + flashOutputOpts ); } GEOS_THROW_IF( m_flash == nullptr, diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp index fed8e2c8c67..62b6c3a1a15 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp @@ -171,6 +171,7 @@ class CO2BrineFluid : public MultiFluidBase static constexpr char const * flashModelParaFileString() { return "flashModelParaFile"; } static constexpr char const * solubilityTablesString() { return "solubilityTableNames"; } static constexpr char const * phasePVTParaFilesString() { return "phasePVTParaFiles"; } + static constexpr char const * writeCSVFlagString() { return "writeCSV"; } }; protected: @@ -181,6 +182,9 @@ class CO2BrineFluid : public MultiFluidBase private: + /** + * @brief Create a PVT Model and output them + */ void createPVTModels(); /// Names of the files defining the viscosity and density models @@ -198,6 +202,8 @@ class CO2BrineFluid : public MultiFluidBase /// Index of the gas phase integer m_p2Index; + /// Output csv file containing informations about PVT + integer m_writeCSV; /// Brine constitutive models std::unique_ptr< PHASE1 > m_phase1; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp index 596d6332457..9c398939b62 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp @@ -20,6 +20,8 @@ #ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_PHASEMODEL_HPP_ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_PHASEMODEL_HPP_ +#include "functions/TableFunction.hpp" + namespace geos { @@ -54,27 +56,28 @@ struct PhaseModel * @param[in] inputParams input parameters read from files * @param[in] componentNames names of the components * @param[in] componentMolarWeight molar weights of the components + * @param[in] pvtOutputOpts A structure containing generated table output options */ PhaseModel( string const & phaseModelName, array1d< array1d< string > > const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ) + TableFunction::OutputOptions const pvtOutputOpts ) : density( phaseModelName + "_" + Density::catalogName(), inputParams[InputParamOrder::DENSITY], componentNames, componentMolarWeight, - printTable ), + pvtOutputOpts ), viscosity( phaseModelName + "_" + Viscosity::catalogName(), inputParams[InputParamOrder::VISCOSITY], componentNames, componentMolarWeight, - printTable ), + pvtOutputOpts ), enthalpy( phaseModelName + "_" + Enthalpy::catalogName(), inputParams[InputParamOrder::ENTHALPY], componentNames, componentMolarWeight, - printTable ) + pvtOutputOpts ) {} /// The phase density model diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp index 5d8abb34def..5edd296fd51 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp @@ -192,7 +192,7 @@ BrineEnthalpy::BrineEnthalpy( string const & name, string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ): + TableFunction::OutputOptions const pvtOutputOpts ): PVTFunctionBase( name, componentNames, componentMolarWeight ) @@ -205,13 +205,12 @@ BrineEnthalpy::BrineEnthalpy( string const & name, m_CO2EnthalpyTable = makeCO2EnthalpyTable( inputParams, m_functionName, FunctionManager::getInstance() ); m_brineEnthalpyTable = makeBrineEnthalpyTable( inputParams, m_functionName, FunctionManager::getInstance() ); - if( printTable ) - { - m_CO2EnthalpyTable->print( m_CO2EnthalpyTable->getName() ); - m_brineEnthalpyTable->print( m_brineEnthalpyTable->getName() ); - } + + m_CO2EnthalpyTable->outputPVTTableData( pvtOutputOpts ); + m_brineEnthalpyTable->outputPVTTableData( pvtOutputOpts ); } + void BrineEnthalpy::checkTablesParameters( real64 const pressure, real64 const temperature ) const { @@ -233,8 +232,6 @@ BrineEnthalpy::createKernelWrapper() const m_waterIndex ); } -REGISTER_CATALOG_ENTRY( PVTFunctionBase, BrineEnthalpy, string const &, string_array const &, string_array const &, array1d< real64 > const &, bool const ) - } // namespace PVTProps } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp index 8a5b6020592..2e000d40f97 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp @@ -92,7 +92,7 @@ class BrineEnthalpy : public PVTFunctionBase string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ); + TableFunction::OutputOptions const pvtOutputOpts ); static string catalogName() { return "BrineEnthalpy"; } diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp index 6734098364f..01683a9dd64 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp @@ -257,7 +257,7 @@ CO2Enthalpy::CO2Enthalpy( string const & name, string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ): + TableFunction::OutputOptions const pvtOutputOpts ): PVTFunctionBase( name, componentNames, componentMolarWeight ) @@ -266,8 +266,9 @@ CO2Enthalpy::CO2Enthalpy( string const & name, m_CO2Index = PVTFunctionHelpers::findName( componentNames, expectedCO2ComponentNames, "componentNames" ); m_CO2EnthalpyTable = makeCO2EnthalpyTable( inputParams, m_functionName, FunctionManager::getInstance() ); - if( printTable ) - m_CO2EnthalpyTable->print( m_CO2EnthalpyTable->getName() ); + + m_CO2EnthalpyTable->outputPVTTableData( pvtOutputOpts ); + m_CO2EnthalpyTable->outputPVTTableData( pvtOutputOpts ); } @@ -309,8 +310,6 @@ CO2Enthalpy::createKernelWrapper() const m_CO2Index ); } -REGISTER_CATALOG_ENTRY( PVTFunctionBase, CO2Enthalpy, string const &, string_array const &, string_array const &, array1d< real64 > const &, bool const ) - } // namespace PVTProps } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp index 1c476e09085..034ad20475a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp @@ -80,7 +80,7 @@ class CO2Enthalpy : public PVTFunctionBase string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ); + TableFunction::OutputOptions const pvtOutputOpts ); static string catalogName() { return "CO2Enthalpy"; } diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp index 226357aed9c..131fdb60ed9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp @@ -221,7 +221,7 @@ CO2Solubility::CO2Solubility( string const & name, string_array const & phaseNames, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ): + TableFunction::OutputOptions const pvtOutputOpts ): FlashModelBase( name, componentNames, componentMolarWeight ) @@ -257,11 +257,9 @@ CO2Solubility::CO2Solubility( string const & name, std::tie( m_CO2SolubilityTable, m_WaterVapourisationTable ) = makeSolubilityTables( m_modelName, inputParams, solubilityModel ); - if( printTable ) - { - m_CO2SolubilityTable->print( m_CO2SolubilityTable->getName() ); - m_WaterVapourisationTable->print( m_WaterVapourisationTable->getName() ); - } + m_CO2SolubilityTable->outputPVTTableData( pvtOutputOpts ); + m_WaterVapourisationTable->outputPVTTableData( pvtOutputOpts ); + } void CO2Solubility::checkTablesParameters( real64 const pressure, diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp index ea7143a4443..fe24e1e0270 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp @@ -21,10 +21,10 @@ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_FUNCTIONS_CO2SOLUBILITY_HPP_ #include "FlashModelBase.hpp" - #include "constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp" #include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" +#include "fileIO/Outputs/OutputBase.hpp" #include "functions/TableFunction.hpp" namespace geos @@ -117,7 +117,7 @@ class CO2Solubility : public FlashModelBase string_array const & phaseNames, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ); + TableFunction::OutputOptions const pvtOutputOpts ); static string catalogName() { return "CO2Solubility"; } diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp index a35551945e1..7ba7020fa9e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp @@ -38,7 +38,7 @@ EzrokhiBrineDensity::EzrokhiBrineDensity( string const & name, string_array const & inputPara, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ): + TableFunction::OutputOptions const pvtOutputOpts ): PVTFunctionBase( name, componentNames, componentMolarWeight ) @@ -52,11 +52,9 @@ EzrokhiBrineDensity::EzrokhiBrineDensity( string const & name, makeCoefficients( inputPara ); m_waterSatDensityTable = PureWaterProperties::makeSaturationDensityTable( m_functionName, FunctionManager::getInstance() ); m_waterSatPressureTable = PureWaterProperties::makeSaturationPressureTable( m_functionName, FunctionManager::getInstance() ); - if( printTable ) - { - m_waterSatDensityTable->print( m_waterSatDensityTable->getName() ); - m_waterSatPressureTable->print( m_waterSatPressureTable->getName() ); - } + + m_waterSatPressureTable->outputPVTTableData( pvtOutputOpts ); + m_waterSatDensityTable->outputPVTTableData( pvtOutputOpts ); } void EzrokhiBrineDensity::makeCoefficients( string_array const & inputPara ) @@ -103,8 +101,6 @@ EzrokhiBrineDensity::createKernelWrapper() const m_coef2 ); } -REGISTER_CATALOG_ENTRY( PVTFunctionBase, EzrokhiBrineDensity, string const &, string_array const &, string_array const &, array1d< real64 > const &, bool const ) - } // end namespace PVTProps } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp index 8d69675aae6..5942eff4f0a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp @@ -109,7 +109,7 @@ class EzrokhiBrineDensity : public PVTFunctionBase string_array const & inputPara, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ); + TableFunction::OutputOptions const pvtOutputOpts ); virtual ~EzrokhiBrineDensity() override = default; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp index b8aeccec02a..c300237899a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp @@ -38,7 +38,7 @@ EzrokhiBrineViscosity::EzrokhiBrineViscosity( string const & name, string_array const & inputPara, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ): + TableFunction::OutputOptions const pvtOutputOpts ): PVTFunctionBase( name, componentNames, componentMolarWeight ) @@ -51,8 +51,8 @@ EzrokhiBrineViscosity::EzrokhiBrineViscosity( string const & name, makeCoefficients( inputPara ); m_waterViscosityTable = PureWaterProperties::makeSaturationViscosityTable( m_functionName, FunctionManager::getInstance() ); - if( printTable ) - m_waterViscosityTable->print( m_waterViscosityTable->getName() ); + + m_waterViscosityTable->outputPVTTableData( pvtOutputOpts ); } void EzrokhiBrineViscosity::makeCoefficients( string_array const & inputPara ) @@ -94,8 +94,6 @@ EzrokhiBrineViscosity::createKernelWrapper() const m_coef2 ); } -REGISTER_CATALOG_ENTRY( PVTFunctionBase, EzrokhiBrineViscosity, string const &, string_array const &, string_array const &, array1d< real64 > const &, bool const ) - } // end namespace PVTProps } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp index dd3202d5ecf..7140a4ca41c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp @@ -98,7 +98,7 @@ class EzrokhiBrineViscosity : public PVTFunctionBase string_array const & inputPara, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ); + TableFunction::OutputOptions const pvtOutputOpts ); virtual ~EzrokhiBrineViscosity() override = default; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp index 62d055f1add..11bc6522254 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp @@ -142,14 +142,14 @@ FenghourCO2Viscosity::FenghourCO2Viscosity( string const & name, string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ) + TableFunction::OutputOptions const pvtOutputOpts ) : PVTFunctionBase( name, componentNames, componentMolarWeight ) { m_CO2ViscosityTable = makeViscosityTable( inputParams, m_functionName, FunctionManager::getInstance() ); - if( printTable ) - m_CO2ViscosityTable->print( m_CO2ViscosityTable->getName() ); + + m_CO2ViscosityTable->outputPVTTableData( pvtOutputOpts ); } void FenghourCO2Viscosity::checkTablesParameters( real64 const pressure, @@ -166,8 +166,6 @@ FenghourCO2Viscosity::createKernelWrapper() const *m_CO2ViscosityTable ); } -REGISTER_CATALOG_ENTRY( PVTFunctionBase, FenghourCO2Viscosity, string const &, string_array const &, string_array const &, array1d< real64 > const &, bool const ) - } // end namespace PVTProps } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp index e45d04f312f..ea490882910 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp @@ -76,7 +76,7 @@ class FenghourCO2Viscosity : public PVTFunctionBase string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ); + TableFunction::OutputOptions const pvtOutputOpts ); virtual ~FenghourCO2Viscosity() override = default; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp index d6b81cca1fa..acef1ec1ab0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp @@ -78,19 +78,6 @@ class FlashModelBase virtual ~FlashModelBase() = default; - using CatalogInterface = dataRepository::CatalogInterface< FlashModelBase, - string const &, - string_array const &, - string_array const &, - string_array const &, - array1d< real64 > const &, - bool const >; - static typename CatalogInterface::CatalogType & getCatalog() - { - static CatalogInterface::CatalogType catalog; - return catalog; - } - virtual string getCatalogName() const = 0; /** diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp index 7a6af6b075f..c647a071f79 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp @@ -71,12 +71,12 @@ class NoOpPVTFunction : public PVTFunctionBase string_array const & inputPara, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ) + TableFunction::OutputOptions const pvtOutputOpts ) : PVTFunctionBase( name, componentNames, componentMolarWeight ) { - GEOS_UNUSED_VAR( inputPara, printTable ); + GEOS_UNUSED_VAR( inputPara, pvtOutputOpts ); } virtual ~NoOpPVTFunction() override = default; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp index 2778347dd78..135d7c899c4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp @@ -113,17 +113,6 @@ class PVTFunctionBase virtual ~PVTFunctionBase() = default; - using CatalogInterface = dataRepository::CatalogInterface< PVTFunctionBase, - string const &, - array1d< string > const &, - array1d< string > const &, - array1d< real64 > const &, - bool const >; - static typename CatalogInterface::CatalogType & getCatalog() - { - static CatalogInterface::CatalogType catalog; - return catalog; - } virtual string getCatalogName() const = 0; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp index 129e723a205..017f5ab92f8 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp @@ -177,7 +177,7 @@ PhillipsBrineDensity::PhillipsBrineDensity( string const & name, string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ): + TableFunction::OutputOptions const pvtOutputOpts ): PVTFunctionBase( name, componentNames, componentMolarWeight ) @@ -189,8 +189,8 @@ PhillipsBrineDensity::PhillipsBrineDensity( string const & name, m_waterIndex = PVTFunctionHelpers::findName( componentNames, expectedWaterComponentNames, "componentNames" ); m_brineDensityTable = makeDensityTable( inputParams, m_functionName, FunctionManager::getInstance() ); - if( printTable ) - m_brineDensityTable->print( m_brineDensityTable->getName() ); + + m_brineDensityTable->outputPVTTableData( pvtOutputOpts ); } PhillipsBrineDensity::KernelWrapper @@ -209,8 +209,6 @@ void PhillipsBrineDensity::checkTablesParameters( real64 const pressure, m_brineDensityTable->checkCoord( temperature, 1 ); } -REGISTER_CATALOG_ENTRY( PVTFunctionBase, PhillipsBrineDensity, string const &, string_array const &, string_array const &, array1d< real64 > const &, bool const ) - } // namespace PVTProps } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp index f22a8e945e5..fbfa037be96 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp @@ -86,7 +86,7 @@ class PhillipsBrineDensity : public PVTFunctionBase string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ); + TableFunction::OutputOptions const pvtOutputOpts ); static string catalogName() { return "PhillipsBrineDensity"; } diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp index 7107cb15056..8dd96a8a82d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp @@ -37,15 +37,15 @@ PhillipsBrineViscosity::PhillipsBrineViscosity( string const & name, string_array const & inputPara, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ): + TableFunction::OutputOptions const pvtOutputOpts ): PVTFunctionBase( name, componentNames, componentMolarWeight ) { m_waterViscosityTable = PureWaterProperties::makeSaturationViscosityTable( m_functionName, FunctionManager::getInstance() ); - if( printTable ) - m_waterViscosityTable->print( m_waterViscosityTable->getName() ); makeCoefficients( inputPara ); + + m_waterViscosityTable->outputPVTTableData( pvtOutputOpts ); } void PhillipsBrineViscosity::makeCoefficients( string_array const & inputPara ) @@ -92,8 +92,6 @@ PhillipsBrineViscosity::createKernelWrapper() const m_coef1 ); } -REGISTER_CATALOG_ENTRY( PVTFunctionBase, PhillipsBrineViscosity, string const &, string_array const &, string_array const &, array1d< real64 > const &, bool const ) - } // end namespace PVTProps } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp index 1ff04c0bd91..bdb6bfa0f5a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp @@ -84,7 +84,7 @@ class PhillipsBrineViscosity : public PVTFunctionBase string_array const & inputPara, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ); + TableFunction::OutputOptions const pvtOutputOpts ); virtual ~PhillipsBrineViscosity() override = default; diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp index ceefb08daf2..0ef520014a0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp @@ -279,7 +279,7 @@ SpanWagnerCO2Density::SpanWagnerCO2Density( string const & name, string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ): + TableFunction::OutputOptions const pvtOutputOpts ): PVTFunctionBase( name, componentNames, componentMolarWeight ) @@ -288,8 +288,8 @@ SpanWagnerCO2Density::SpanWagnerCO2Density( string const & name, m_CO2Index = PVTFunctionHelpers::findName( componentNames, expectedCO2ComponentNames, "componentNames" ); m_CO2DensityTable = makeDensityTable( inputParams, m_functionName, FunctionManager::getInstance() ); - if( printTable ) - m_CO2DensityTable->print( m_CO2DensityTable->getName() ); + + m_CO2DensityTable->outputPVTTableData( pvtOutputOpts ); } void SpanWagnerCO2Density::checkTablesParameters( real64 const pressure, @@ -307,8 +307,6 @@ SpanWagnerCO2Density::createKernelWrapper() const m_CO2Index ); } -REGISTER_CATALOG_ENTRY( PVTFunctionBase, SpanWagnerCO2Density, string const &, string_array const &, string_array const &, array1d< real64 > const &, bool const ) - } // namespace PVTProps } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp index 1167d615994..f729064fcf0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp @@ -81,7 +81,7 @@ class SpanWagnerCO2Density : public PVTFunctionBase string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ); + TableFunction::OutputOptions const pvtOutputOpts ); static string catalogName() { return "SpanWagnerCO2Density"; } diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp index 5b3ba0f5a30..41a047c11b5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp @@ -37,15 +37,15 @@ WaterDensity::WaterDensity( string const & name, string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ): + TableFunction::OutputOptions const pvtOutputOpts ): PVTFunctionBase( name, componentNames, componentMolarWeight ) { GEOS_UNUSED_VAR( inputParams ); m_waterDensityTable = PureWaterProperties::makeSaturationDensityTable( m_functionName, FunctionManager::getInstance() ); - if( printTable ) - m_waterDensityTable->print( m_waterDensityTable->getName() ); + + m_waterDensityTable->outputPVTTableData( pvtOutputOpts ); } void WaterDensity::checkTablesParameters( real64 const pressure, @@ -62,8 +62,6 @@ WaterDensity::createKernelWrapper() const *m_waterDensityTable ); } -REGISTER_CATALOG_ENTRY( PVTFunctionBase, WaterDensity, string const &, string_array const &, string_array const &, array1d< real64 > const &, bool const ) - } // namespace PVTProps } // namespace constitutive diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp index fc963e7811a..36cd4932661 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp @@ -76,7 +76,7 @@ class WaterDensity : public PVTFunctionBase string_array const & inputParams, string_array const & componentNames, array1d< real64 > const & componentMolarWeight, - bool const printTable ); + TableFunction::OutputOptions const pvtOutputOpts ); static string catalogName() { return "WaterDensity"; } virtual string getCatalogName() const final { return catalogName(); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index 708d4f42d31..fa2dc6eb819 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -20,6 +20,7 @@ #include "constitutive/fluid/multifluid/MultiFluidFields.hpp" #include "constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp" +#include "constitutive/ConstitutiveManager.hpp" #include "common/Units.hpp" namespace geos @@ -69,6 +70,12 @@ ReactiveBrineFluid( string const & name, Group * const parent ): setRestartFlags( RestartFlags::NO_WRITE ). setDescription( "Names of the files defining the parameters of the viscosity and density models" ); + this->registerWrapper( viewKeyStruct::writeCSVFlagString(), &m_writeCSV ). + setApplyDefaultValue( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setRestartFlags( RestartFlags::NO_WRITE ). + setDescription( "Write PVT tables into a CSV file" ); + // if this is a thermal model, we need to make sure that the arrays will be properly displayed and saved to restart if( isThermal() ) { @@ -94,6 +101,7 @@ std::unique_ptr< ConstitutiveBase > ReactiveBrineFluid< PHASE > :: deliverClone( string const & name, Group * const parent ) const { + std::unique_ptr< ConstitutiveBase > clone = ReactiveMultiFluid::deliverClone( name, parent ); ReactiveBrineFluid & newConstitutiveRelation = dynamicCast< ReactiveBrineFluid & >( *clone ); @@ -129,7 +137,6 @@ void ReactiveBrineFluid< PHASE > ::postInputInitialization() template< typename PHASE > void ReactiveBrineFluid< PHASE > ::createPVTModels() { - // TODO: get rid of these external files and move into XML, this is too error prone // For now, to support the legacy input, we read all the input parameters at once in the arrays below, and then we create the models array1d< array1d< string > > phase1InputParams; @@ -193,9 +200,15 @@ void ReactiveBrineFluid< PHASE > ::createPVTModels() GEOS_FMT( "{}: PVT model {} not found in input files", getFullName(), PHASE::Enthalpy::catalogName() ), InputError ); + bool const isClone = this->isClone(); + TableFunction::OutputOptions const pvtOutputOpts = { + !isClone && m_writeCSV,// writeCSV + !isClone && (getLogLevel() >= 0 && logger::internal::rank==0), // writeInLog + }; + // then, we are ready to instantiate the phase models m_phase = std::make_unique< PHASE >( getName() + "_phaseModel1", phase1InputParams, m_componentNames, m_componentMolarWeight, - getLogLevel() > 0 && logger::internal::rank==0 ); + pvtOutputOpts ); } template< typename PHASE > diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp index 0ff1ba70c0b..9ba08387cf6 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp @@ -152,6 +152,7 @@ class ReactiveBrineFluid : public ReactiveMultiFluid struct viewKeyStruct : ReactiveMultiFluid::viewKeyStruct { static constexpr char const * phasePVTParaFilesString() { return "phasePVTParaFiles"; } + static constexpr char const * writeCSVFlagString() { return "writeCSV"; } }; protected: @@ -160,11 +161,17 @@ class ReactiveBrineFluid : public ReactiveMultiFluid private: + /** + * @brief Create a PVT Model and output them + */ void createPVTModels(); /// Names of the files defining the viscosity and density models path_array m_phasePVTParaFiles; + /// Output csv file containing informations about PVT + integer m_writeCSV; + /// Brine constitutive models std::unique_ptr< PHASE > m_phase; diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index d9f804241fb..2e1897e7629 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -184,77 +184,6 @@ void TableFunction::checkCoord( real64 const coord, localIndex const dim ) const SimulationError ); } -void TableFunction::print( std::string const & filename ) const -{ - std::ofstream os( joinPath( FunctionBase::getOutputDirectory(), filename + ".csv" ) ); - - integer const numDimensions = LvArray::integerConversion< integer >( m_coordinates.size() ); - - if( numDimensions != 2 ) - { - // print header - - for( integer d = 0; d < numDimensions; d++ ) - { - os << units::getDescription( getDimUnit( d )) << ","; - } - os << units::getDescription( m_valueUnit ) << "\n"; - - // print values - - // prepare dividers - std::vector< integer > div( numDimensions ); - div[0] = 1; - for( integer d = 1; d < numDimensions; d++ ) - { - div[d] = div[d-1] * m_coordinates[d-1].size(); - } - // loop through all the values - for( integer v = 0; v < m_values.size(); v++ ) - { - // find coords indices - std::vector< integer > idx( numDimensions ); - integer r = v; - for( integer d = numDimensions-1; d >= 0; d-- ) - { - idx[d] = r / div[d]; - r = r % div[d]; - } - // finally print out in right order - for( integer d = 0; d < numDimensions; d++ ) - { - arraySlice1d< real64 const > const coords = m_coordinates[d]; - os << coords[idx[d]] << ","; - } - os << m_values[v] << "\n"; - } - } - else // numDimensions == 2 - { - arraySlice1d< real64 const > const coordsX = m_coordinates[0]; - arraySlice1d< real64 const > const coordsY = m_coordinates[1]; - integer const nX = coordsX.size(); - integer const nY = coordsY.size(); - os< const coordinates, + arrayView1d< real64 const > const values ) +{ + // prepare dividers + std::vector< integer > div( numDimensions ); + div[0] = 1; + for( integer d = 1; d < numDimensions; d++ ) + { + div[d] = div[d-1] * coordinates[d-1].size(); + } + // loop through all the values + for( integer v = 0; v < values.size(); v++ ) + { + // find coords indices + std::vector< integer > idx( numDimensions ); + integer r = v; + for( integer d = numDimensions-1; d >= 0; d-- ) + { + idx[d] = r / div[d]; + r = r % div[d]; + } + // finally print out in right order + for( integer d = 0; d < numDimensions; d++ ) + { + arraySlice1d< real64 const > const coords = coordinates[d]; + formatterStream << coords[idx[d]] << ","; + } + formatterStream << values[v] << "\n"; + } +} + +void TableFunction::outputPVTTableData( OutputOptions const pvtOutputOpts ) const +{ + if( pvtOutputOpts.writeInLog && this->numDimensions() <= 2 ) + { + TableTextFormatter textFormatter; + GEOS_LOG_RANK_0( textFormatter.toString( *this )); + } + if( pvtOutputOpts.writeCSV || ( pvtOutputOpts.writeInLog && this->numDimensions() >= 3 ) ) + { + string const filename = this->getName(); + std::ofstream logStream( joinPath( FunctionBase::getOutputDirectory(), filename + ".csv" ) ); + GEOS_LOG_RANK_0( GEOS_FMT( "CSV Generated to {}/{}.csv \n", + FunctionBase::getOutputDirectory(), + filename )); + TableCSVFormatter csvFormatter; + logStream << csvFormatter.toString( *this ); + } +} + +template<> +string TableCSVFormatter::toString< TableFunction >( TableFunction const & tableFunction ) const +{ + ArrayOfArraysView< real64 const > const coordinates = tableFunction.getCoordinates(); + arrayView1d< real64 const > const values = tableFunction.getValues(); + units::Unit const valueUnit = tableFunction.getValueUnit(); + std::ostringstream formatterStream; + + integer const numDimensions = LvArray::integerConversion< integer >( coordinates.size() ); + if( numDimensions != 2 ) + { + collectHeaders( formatterStream, tableFunction, numDimensions, valueUnit ); + collectValues( formatterStream, numDimensions, coordinates, values ); + } + else + { + TableData2D tableData2D; + TableData2D::TableDataHolder tableConverted; + tableConverted = tableData2D.convertTable2D( values, + valueUnit, + coordinates, + units::getDescription( tableFunction.getDimUnit( 0 ) ), + units::getDescription( tableFunction.getDimUnit( 1 ) ) ); + + TableLayout tableLayout( tableConverted.headerNames ); + + TableCSVFormatter csvFormat( tableLayout ); + formatterStream << csvFormat.headerToString() << csvFormat.dataToString( tableConverted.tableData ); + } + return formatterStream.str(); +} + +template<> +string TableTextFormatter::toString< TableFunction >( TableFunction const & tableFunction ) const +{ + ArrayOfArraysView< real64 const > coordinates = tableFunction.getCoordinates(); + units::Unit const valueUnit = tableFunction.getValueUnit(); + arrayView1d< real64 const > const values = tableFunction.getValues(); + integer const numDimensions = LvArray::integerConversion< integer >( coordinates.size() ); + string const filename = tableFunction.getName(); + string logOutput; + + GEOS_LOG_RANK_0( GEOS_FMT( "Values in the table are represented by : {}", units::getDescription( valueUnit ))); + + if( numDimensions == 1 ) + { + TableData tableData; + arraySlice1d< real64 const > const coords = coordinates[0]; + for( integer idx = 0; idx < values.size(); idx++ ) + { + tableData.addRow( coords[idx], values[idx] ); + } + + TableLayout const tableLayout( { + string( units::getDescription( tableFunction.getDimUnit( 0 ))), + string( units::getDescription( valueUnit )) + }, filename ); + + TableTextFormatter const logTable( tableLayout ); + logOutput = logTable.toString( tableData ); + } + else if( numDimensions == 2 ) + { + integer const nX = coordinates[0].size(); + integer const nY = coordinates[1].size(); + if( nX * nY <= 500 ) + { + TableData2D tableData2D; + TableData2D::TableDataHolder tableConverted; + tableConverted = tableData2D.convertTable2D( values, + valueUnit, + coordinates, + units::getDescription( tableFunction.getDimUnit( 0 ) ), + units::getDescription( tableFunction.getDimUnit( 1 ) )); + + TableLayout tableLayout( tableConverted.headerNames, filename ); + + TableTextFormatter const table2DLog( tableLayout ); + logOutput = table2DLog.toString( tableConverted.tableData ); + } + else + { + string log = GEOS_FMT( "The {} PVT table exceeding 500 rows.\nTo visualize the tables, go to the generated csv \n", filename ); + TableLayout const tableLayoutInfos( {TableLayout::ColumnParam{{log}, TableLayout::Alignment::left}}, filename ); + TableTextFormatter const tableLog( tableLayoutInfos ); + logOutput = tableLog.layoutToString(); + } + } + return logOutput; +} + REGISTER_CATALOG_ENTRY( FunctionBase, TableFunction, string const &, Group * const ) } // end of namespace geos diff --git a/src/coreComponents/functions/TableFunction.hpp b/src/coreComponents/functions/TableFunction.hpp index 216b29ad91b..676807847a7 100644 --- a/src/coreComponents/functions/TableFunction.hpp +++ b/src/coreComponents/functions/TableFunction.hpp @@ -24,6 +24,7 @@ #include "codingUtilities/EnumStrings.hpp" #include "LvArray/src/tensorOps.hpp" +#include "common/format/table/TableFormatter.hpp" #include "common/Units.hpp" namespace geos @@ -47,6 +48,15 @@ class TableFunction : public FunctionBase Lower }; + /// Struct containing output options + struct OutputOptions + { + /// Output PVT in CSV file + bool writeCSV; + /// Output PVT in log + bool writeInLog; + }; + /// maximum dimensions for the coordinates in the table static constexpr integer maxDimensions = 4; @@ -277,7 +287,9 @@ class TableFunction : public FunctionBase * @return The unit of a coordinate dimension, or units::Unknown if no units has been specified. */ units::Unit getDimUnit( localIndex const dim ) const - { return size_t(dim) < m_dimUnits.size() ? m_dimUnits[dim] : units::Unknown; } + { + return size_t(dim) < m_dimUnits.size() ? m_dimUnits[dim] : units::Unknown; + } /** * @brief Set the interpolation method @@ -318,11 +330,17 @@ class TableFunction : public FunctionBase m_valueUnit = unit; } +/** + * @return The table unit + */ + units::Unit getValueUnit() const { return m_valueUnit; } + + /** - * @brief Print table into a CSV file (only 1d and 2d tables are supported) - * @param filename Filename for output + * @brief Print the table(s) in the log and/or CSV files when requested by the user. + * @param pvtOutputOpts Struct containing output options */ - void print( std::string const & filename ) const; + void outputPVTTableData( OutputOptions const pvtOutputOpts ) const; /** * @brief Create an instance of the kernel wrapper @@ -355,6 +373,7 @@ class TableFunction : public FunctionBase */ void readFile( string const & filename, array1d< real64 > & target ); + /// Coordinates for 1D table array1d< real64 > m_tableCoordinates1D; @@ -674,6 +693,22 @@ ENUM_STRINGS( TableFunction::InterpolationType, "upper", "lower" ); +/** + * @brief Template specialisation to convert a TableFunction to a CSV string. + * @param tableData The TableFunction object to convert. + * @return The CSV string representation of the TableFunction. + */ +template<> +string TableTextFormatter::toString< TableFunction >( TableFunction const & tableData ) const; + +/** + * @brief Template specialisation to convert a TableFunction to a table string. + * @param tableData The TableFunction object to convert. + * @return The table string representation of the TableFunction. + */ +template<> +string TableCSVFormatter::toString< TableFunction >( TableFunction const & tableData ) const; + } /* namespace geos */ #endif /* GEOS_FUNCTIONS_TABLEFUNCTION_HPP_ */ diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 2930e0f6b9e..a8430b98131 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -4374,6 +4374,8 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + @@ -4394,6 +4396,8 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + @@ -4414,6 +4418,8 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + @@ -4434,6 +4440,8 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + @@ -5445,6 +5453,8 @@ If you want to do a three-phase simulation, please use instead wettingIntermedia + + @@ -5459,6 +5469,8 @@ If you want to do a three-phase simulation, please use instead wettingIntermedia + + diff --git a/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp b/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp index 9b8a69cf84d..20df8c70fe5 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp @@ -361,13 +361,18 @@ std::unique_ptr< MODEL > makePVTFunction( string const & filename, { array1d< string > const strs = stringutilities::tokenizeBySpaces< array1d >( str ); + TableFunction::OutputOptions const pvtOutputOpts = { + true,// writeCSV + true, // writeInLog + }; + if( strs.size()>1 && strs[0] == key ) { pvtFunction = std::make_unique< MODEL >( strs[1], strs, componentNames, componentMolarWeight, - true ); // print PVT tables + pvtOutputOpts ); } } GEOS_ERROR_IF( pvtFunction == nullptr, @@ -401,7 +406,10 @@ std::unique_ptr< MODEL > makeFlashModel( string const & filename, while( std::getline( is, str ) ) { array1d< string > const strs = stringutilities::tokenizeBySpaces< array1d >( str ); - + TableFunction::OutputOptions const flashOutputOpts = { + true, // writeCSV + true, // writeInLog + }; if( strs.size()>1 && strs[0] == key ) { flashModel = std::make_unique< MODEL >( strs[1], @@ -409,7 +417,7 @@ std::unique_ptr< MODEL > makeFlashModel( string const & filename, phaseNames, componentNames, componentMolarWeight, - true ); // print PVT tables + flashOutputOpts ); } } GEOS_ERROR_IF( flashModel == nullptr, diff --git a/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp b/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp index e7cf917857e..a8160dc51f9 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp @@ -83,12 +83,17 @@ CO2SolubilitySpycherPruessTestFixture::makeFlashModel( string const & fileConten // Read file parameters array1d< string > const strs = stringutilities::tokenizeBySpaces< array1d >( fileContent ); + TableFunction::OutputOptions const flashOutputOpts = { + false, // writeCSV + false, // writeInLog + }; + return std::make_unique< CO2Solubility >( strs[1], strs, phaseNames, componentNames, componentMolarWeight, - false ); + flashOutputOpts ); } TEST_P( CO2SolubilitySpycherPruessTestFixture, testExpectedValues ) diff --git a/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst b/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst index 1a273cce07a..2b09f25e2e4 100644 --- a/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst +++ b/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst @@ -35,3 +35,21 @@ like those describing a specific class, can instead be found in ``docs`` subdire in the folder containing the source code. Information about how to write ``rst`` files can be found `here `_ . + +Fixing errors the documentation +=============================== +As part of the Continuous Integration process, the documentation is built on readthedocs, and any warnings or errors result in a failure test failure. +What follows is a brief guide on how to fix the most common errors. + +#. Navigate to the readthedocs build logs. This can be done by clicking on the failed test in the github test summary. + +.. image:: githubtestsummary.png + :width: 600 + +#. Download the logs from the failed test on readthedocs through the "view raw" button. + +.. image:: readthedocsbuildsummary.png + :width: 600 + +#. Perform a case sensitive search for "WARNING:" or "ERROR" to locate the sphinx issues. +Note that there will be numerous doxygen warnings that should be ignored. \ No newline at end of file diff --git a/src/docs/sphinx/developerGuide/Contributing/githubtestsummary.png b/src/docs/sphinx/developerGuide/Contributing/githubtestsummary.png new file mode 100644 index 0000000000000000000000000000000000000000..87d77dd9a2228b85102e467972e637319f7366c6 GIT binary patch literal 213374 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%0DWl8vW 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 z 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 literal 0 HcmV?d00001 diff --git a/src/docs/sphinx/developerGuide/Contributing/readthedocsbuildsummary.png b/src/docs/sphinx/developerGuide/Contributing/readthedocsbuildsummary.png new file mode 100644 index 0000000000000000000000000000000000000000..fc6a42e6a0cd38bd73a30738d0a74843507c6517 GIT binary patch literal 158384 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≺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

      7!yLyCrA&-}(CNtkjxoBX*3 z0BO%|JoMr$kVA14#KNoj@;;h5V9qlza;n;HF08aGaBKn%RVBe|p2LSwD|B@jKgAT9#qu{0+Vg&c!((h!2TZ zOY?kpRxk{0%K15cntf>z&ODpY__n-j&>_k2&5YUr7h1cPEfTXq6%8hlmZ!+4%g-aV z)7i+Xv-cLaDl3kUlfZqc&KZl`+Y*FBu`~3ltCwC%i{!3*lUk0rLnS@!9{L$6E%sR) z5_}_n*dMdp!`|oj6EF05HD#48bxYXsn)i_c^6!fVN82Kj0)A4H@)6FR+;QYhrkP3A+geR?{nd=}H;D{@1Ne5w8&`5oDEEAUc%EmM4yNzHWJ zlSH~gG?o`ZI%ENW^EgSByo?yVP50pB8J(&KxLmWh%UHF_tX#ud3uuc0-8aJLr0D>f zewWs=`m^!5q%U}!PMZ!=3)Ir+OA`U?erLVdg7s4lI4sA}BXO`^o%-v%SM*YW%m!P5 zpPJU(e8f}O0#U}_u{##8#po2 zWGn_ai74CCvuTkoPd$cHyhI|ON(-0RdH~YDw@}D56>wjPlIYy2sJb3s{8~Je9ID*P zVeyb(^_B5NKrxED_65Q(q9G?}I?pa)RN8+<;Td;TTtf^D z_AXK}{M9r3Gp1SFTZ->#GhE({O2b7Juo0ojwpf@sGXf8=8%D52#(~y3> z$8a7nL;hL|r+kh0Q(-$-gxBAFNDA%HC9DkX*|c-07%^@>LNO)iekl)LAI&iW93O1f zyR#sj`KS|$H_}Thrpsy|v*nPANeetixnV~?$|53My)XjuuSIP=%Fs8O!v`$^Elh76 zVzRn9f4T^oQ%y9<_WRU|s!6dUH@;_=M{Lp-06E8`gHhe*#yj9wn}qp8(Gobwtvr>2 z)an-xf`@GaO_8K4x`Thkc*s-*I6FP?({jtB^>=g>ZWq2wup=J%ZIh;I!{Ow1We){_ z6?_bSU^B0DxyZ&XS;hRZ1LwF>9Z=5_p|k<|xX?Thjz1UcIuXnFdqqkLDn~H{&f?|& ze9&!&QXjG}<(H4S_1K%tCWl!BvzPTCXH6{tqd}L(kEVJB)~!aj%|Y=$BIsf}$Y%5f|2 zdu`^6*6O69(l}9DxY_o^7R_B`mfaSNwW@Ko$_S1^C#x6 zRA}GTm?B-RM>SSbKL#)X_NcGgqZ)qu?a1Gs zIwJwv9V8rCPz<|dm2s*eW1J2z23s%?ERHd3lhb+QiugMhyVCb6!tgIgjFmD@Z(dQ1 z57=o(0Aqf7epg(>7R!jiKv-JD@hA73zIie35(nsxumK6`ifm4t*j^hBH@ry%U3?j=t+gI4CP%ARvTiX6P})1&TN*BwbBX z8mBu+1*e_x0+{tU9#*50#cpQXluAsi;LCTYUL@0g3&~-`qymK8I@Jm0)D3p&?E&EW%=R^^k&KfZa9$54joE~P}gZ%Z+cRi7x~ z@Fnh1$Sq4QHQVT9JyX`-%X$8rkKkoqlfLeDsd2CBQXlFqves;al7qOc&XMH`tMMUP z-wf%05nu(ql@v!qP~?z;a)A2UAkU0m%|EUvXV{wDUvM@9(5wp}V;9UxSg>SQZL;!; zh(hBp8O<3nwjqq1Y*C+P0;xFwTDrAL&0|rJ5-B2JlVCC({rIM(v%{n@o@;>=*D9~U zOgD>xd2^pICsve1HZ|-c5zn??i06$kXL0tedr?AY zWcT!oz2+af?2DdFsome#Od9SO6?jYI@IP2)##i3M4p>C$LE|?!ErC%+C5`@l@^H7R z_-4s#j*LSCLuz7(cNkk&$%ED&j4G-nm}L=O1qmloYY%ZieBM=-{jNK4vp$`QCL8^ zR&0(Lq%t#|z|)XrTF!T<83Tr+K7x!p&5BpWyvq^_qkT68b{=AQ>d*#JMo)#9hM*Fv zi;R0?lFz&0aYps1T|ZLjfnx6Z03XUm+KSJI0^eP{_1fr#m$;$hhA4-wV!UN9~`W)>XM6@ z*SBS7z5+@*{VKM7V*9Z|gq59i5D=t}qdp~E1#aUMxJHta((|K0DokMkY4Dvqp;k}v z9&cD4ig?^Ot81wcLvx>x&C{ea@-~V}X{Tf?v7{V_07Isat}~b&Bz?EJPOk=YQzSV1 zES}9pq-B3|@~hF%)*GRin4+`(CKLH=V(+!!T=D2H=HE!`a(V8gkdKN0Y{ZPW+rws6 zty=T2A}_?EG(dYyTLijgv^zak78gg#!iyaNRz)b)P%;##x6Le>3|+>HC>4xywRTu8 zwt-Tofe=xVV{=jf73`NBgZn&`_b^Ut7bU{82*M#ZvT{<`dW<&05s?)#(I8-Lm$y8T|}TYFAZJXmAUEd%Yv`a+|4C;k{&S34_^&Fsfh zvF6LU$mkkqsNx?pe91-hqt&2bID~L>{xeSOrq+}y-(l5*@R-I8j&9M*&m27`UVLx|HB9FmBoZz?&Q#6!g|2GWQ@3l5WPO!Ikpv@Mi zlOowe^-OX9h%G1Z*dp=7Vt!kxSKm7(A4TS&nJ2N|aZ>TG>&6JwkXAH0eZ6D_`$c1v zwDC6VMht##y zuaw^jogsF{9nYSRQWOiUa7X1n9?z@%?5hiI{{6|HP_ZV{#It7b1RoKDzb~@Khe$4Y zxB-!J?wxMa8+XVCuZ|@O%jWbObUU5C@cpi!JJl?K9^RhdZjvSH?kVV9M=C^ zzmbEEJC$`oDI|Hpv-@)smrEIi`BDf8VWMhK^s$dI`QW`9=y*0uQgkR;u4QMANbQI9 z3TP!Y8BUh>yqb@T`(EKnkl63CygNY@+R&$$JaMN{W*UZqJO^g`zxT%5w_QpXLMJ;N|xn zzfYcD7T>Mw-7UR~U%nu4B*m)7q8Q913*DBss$43g4D|Hmk6>9pU;h|{Kf9!5NAN9E z$u=1@+hd+Q^y}`8bv}5Sw&_Wr0Di-UXLPa(r~g)#w8Q}%=T3miu*C0mrUA5fhHnFQ zf9RPFV#%-uqfYvhuAsWg6SrklDTk|B@mhO4pBiTLY?yWV9>a_OVMN|rd+RGeYfHk>hPR#9g^tXse22lEZ&mc#kl zV4Cbqqv#DnAegPhjVBCz(ZV#ew}|_-?uaUfA5IA>x9_OgSkdUSK9tO}YSW6~!tAJm zb2nbL8OjMPOOQ1*{`j>81JM$HMWK%4dG6k@H4CaCul!SVo4JzD7p7vETQJdkgp`wv z3H(69fjka_^LvAgc4{A115Ub8r1v*cG5Tb)VWMdjc3H^(lkPBY+(?ox(-5~# zFq5qStmU)zFL1WRLlfS%pSa~ydK~JnCldNlFOWXHDz;v+!`GJ^}41A3dBmKdVm2#+k8e4%X5fj(`;XZi^`^!3IgM&)#Dy12OIhO;OD45@sPw*>-Q=1e)M?WX7H~81Vk$cCaO-_Xyz=Xrmn;}8 zS5#$J>p$KGyMMgOFZ;%Ti7BgtjEsz!wC=ml(lCWTBTGv;BTIjG(-pJK=LLp%o%%vM zph9PL08h`G=6W~lNddP3#-(R6hURQo!U(t zNR03FeetvRp2u+|4R^db6UxSA4|;e|&|))z8*tS-v-oyf24FHP{%7w_e#7$NG_XEF zQaa|Cy}_D&(=yyQGQ|8KrMfsZoiLlINC!<(n#PBdZy%(shS* zL_U}9S(zT5HU3l*H&sLUReIz-u(OT0`RdNoZmz+1q((#g~cI%6{hGZfrFZgoEk7U>8FK=q%l1ZbthI zQM=JP`If#7$_4ncID}X(U3BOt8B@W+3pqaai?~z!deuddiGdbQ*BINuG4CdS9Dco+ zZfltrEOn_?!CZO6m`cw%Gy*d8kQnjkpe1A6S`P>vH=?O_X1t>( z%XOOp8)NOstBSZUih0Dm@r2-Ke?(1jZ9EV{^;m(Pr36{ou)mh&m@`__qFnh5;emAW zy$iF9j(K3XUZWykg@$@{C0w-S;wkMt96`>$96U{5PM^*`Pb?RPAqsy7m(T^^#NR@c z(&APW2X%4}CR)rj&saTP?G;S7(QI|H4W8CjU0=NW&bnj7Bx6ummwe%y{t>1=;?y)L zINRz=?ICPnVs*7&#;bg=VC3}^zFyzB937bk0TEps0SPw{0sb-wRf>iJaYH!!q3uE} zqd^Qbm>_goCL_w}?=CdF=msiWRL^qcLw&=Tk=JHJOfStZt|NRMhz{JQ0JDb{qg#+CIPooGe)y8 zZgt7p^Xt72&xMAqPsN})b~=Zpu6jyhhSkSk4dzAu_+jZJqzsk*I|0?=W}fGG=|q&( zARYGmtTLCgM46Zm4KCamW-eRy^D$VF&H=t*k9M&W9qwy!-Mqjm`^`k=1~VR{xb2vIk#ZPWBTKp)dMZ z?_Z>{apwHm;zVY}csHy3UY%;>?BJur{K>6@yW-?U#tU9W`@}PlGjWx|-spa=>n&jE zsi!1_8tv58kb7iL+$jsaaa3Jelz27&!g&OW4KP4G{XM|5&bX8E@lnX?_eNrq3iMo# zJ+-l_`rdP)vk%E!BS!YF`l!gaIo@Wr8S_;ukc2DhOf}P`o$%7g%$p+J-IDQo?P<~; zUjxYJ9%Yz!qnMBKfXDbGQ1~QGf9D(f+f6=gS~>{t`3!*e=~@*Ma+s6VQT=dAazzew zTRI~cR*rIxg`WA15%U~`Vl%05+TRblaUyN zGnZXPRFuiYEs_sI=K83Cimn#8%AfEd>ttW)zxx_Aqwk7LJwjU5s=I$pcQH%`c&%B2 zW4vQO1IB4SD)9=qrw8SRKPssNIBr=nE2^b2oiv^()}3p5*5hf@-M^%>DLF}!zB7}T+y@nLLpODG$}K}oPxxH873UMe&VN&679KA5fo z61`Fku$bFUyhBcu9xNnD%C(E-JFgZJ16u;lr$1JxXPv(Gp0Y2PM8n@JoHJ>B8RA=I zroM1OMpAQuN1XN!uH<+0#Qa&9klX{Sz!Uz%5E3L!$lv!fD__!=kwC2pYQ7v%=FEnv z<*_9PS~lJQ$_du7Urw&@o`~$bm!zr+ouwx zlcf}q%IFz*yrgsejy|3aBj|4)MXzvnC#PgTDXnCdc4;2BX+}4d&4ED$D=F&0`p0|t z3dYA|i=)x@^8s0d+PuT&PG4x&LYvpqoAnu^1pj|T)BhJ(nc~C~;P=6aD?>fEI0UJw&b{ zf8f{qp}#t}Zb&x2PByi`S@M3UQej&5Wj|p`ourxDHls;OUW5p(Dylpl-A+bgQfi{f z!APlffhvxAB2!{W;ujBkxrMEQ6A4RoN(Z93HrAecM{42A)_A&G8_wnBo=2N#$9b^f zK=n$yP9tHOxx}?DK#$QwEkA~Pxb@uw3paJgmPUx{{#txbMIvvFE-+2pU_e00@JJ=v zSP@v*bb#qwtR~6HZ*jpsp;bk9=vZY>;MP9(_pBxFuiU>HQ03+xFuMyRe<8+G7jdE@e0$@~^q^kR^zetLW3nGcRCe(WB}O8N^t%03Z$wtqa+ANP4nDdXXbXTUDw{S__zhu^=C=f3oqv!=t}$B?@g zcu!dI@cxbH%Q?}HoKBIKf3WfQfj)|7Fnzp~+OK&D?@u=VB$8kNi0DN%Hg5b!J^qg| zDMc>b!V88I;{6~0{7rI{j{qW~?K}tNKW6xInfjJ*7~om#Y2e}g8`14^qA$wP9-sca z`|r~Izg49yHb~!9T7-8W%^N4YFbnEVdOCf-H_2L_oP8_uO`(A0-SwNJ-_M@i4AB6+ z&9Y1{N9BOgGu-X;rrJx8lo9>6Fo6n2#r&NCIHO|y`tJagmk1Z@pjBZZ@mcUeR>6;u zVHpacWQU@wc@3oX!>cCmdtpl1+}R>1`G|c{xUy!Fbn)AUnWYF*k=++HWx%Q88=v17 z!6Zs<86|8-Iz9|x;xZ6Y?6Gt)?J9QmCmt!X)hs_GT_2Lk`c z_?=}^J5J+xG@&Oy<_?a_lt&GpRr6k<nFrA_ zbeo(jxFBjrg_wX>=Cb3bFs-ipoaIIM*WY(lf~e+29Mmt;GjY>97X0bz{()@yGEvtq z6Gb+Tsxu;2HS!A%e^LqjqM9%In{NMc=^gN>uRL8&!jP`7@dooy%py|!kN^K*IVu4# zdIwTQD8UZ`i_&$|!27KSr8oW{`MY`2y$66RVnNpScDwBFd}XmpiWJX89_kzaGQleV zG+FkZlV5&)_uC6Ig>Z8R$_wGs`;@={uRWABk1mYayM~mJA)YqwVhH&H;Nxv3puTA3 z-8ft0Xf?yCbNM2au=sTjNsBqX4Wks^SvSdt#w%)`{*#X@f&4%J>nwo(dg{LC0817R zd*kXp|C_N(0Z;kZu7w4|ue!RsZH6Za3nIQ~yW%|C>2^#m{;FEwK=D@lpei z`T#E%|8_3^WyRIs@j7=eTnwG_#VA_po_cjLVv9ef2cSP(*us|dqHzF@Dap^FAMNH? z75(bt1M%n`2B3HNf6pQ%`?*XH`W=j;74dG0n~KrOU0}Z6C(5aA5mkM)64$LKgr#Hh zHIZO8&551XK+yho4Ou;SZvC6-eV6fW!9%op;Nq{!-V_KUdqT>%d)>M%)dpC6xG441 zZpuDE(d|q`OjZ?*Iosy89xsBpZZyB=S+5b(H$xS^Q+=bi9T{I`W14hwPyu{zilm(K z7#p~Hb1lJA9n^EQU1_uu;kpx1g^n=p@C`Lp=~=p4N0#v4tj+&Yu}&#E|4Mi5 zHpr0)F#3Mh$}=)l>xk(OT`lKM;f zT`UZ%IPvtycycTr7`{3re_M(HNYJI6WCH<uBDeR^Y;9PLMOGOlHd{@C?QPsnxDDgG@r3*BSuJ7rM zsA0UPb^{DlnAvtR2M(X70-!plk^}1^%Le|*_IQ5l7zfWeAL5enIe4*UhIGyvSKH4{ z(=MAPP5t*vaBTWo7DLJl7lm@&l(&`77yVgUlf*#r4X0I9HXA=~uwWvmEi4{JE=G!q zvE!}O6q8?M88QLl?}_l##azX{y*XS7GL5D;7;FhCt^hy0lch?Ksz@wa@b(s7?eeas zo}u7m{Cv=4imd5P$wv)D*Zw+r3#BbCBuMUQFnH496XX`t*2tKHg_ zrF`xO3gc~3E|;zMmct_q3=PJ_S-;`k|48WdoQ&uKK@s_gCxzgBAXtL(O%+OYRVE4g zZXZt(`(CpeDa}HbZ^m#{={&v?-^RGBQE=jv?ir0R83v=qzelqTK4G&;SrlC6cU}Kb z(wA)NUAt@$06r*FW zqkSbCXZdL%sYkF*3cfkLyUFSc2QwrF&h)i_x}8TVh@0APibaJ*6uztdAqv@%#r$r< zfSe8JWSJIz=eiN`iyqxZH}wA;sZrLCywe!_1m$TQIqg0;jqMeQ>8PH|ffX*z>PI?X zj2+Ie=`=F5q_dVAIv80r_28~0twea#qgrfF6xFC!$fmRAr;M@mm5!;dc2j8*6EEKsm+d(`Mtq3-0PnNmPFp-0Dc!KTyUr)Bd znAJ$-S=sdU2~W=c*Y7V}JUSKsE32Nwcy38{p1+$|2t=bI1Vh7kSeP^#e}3esB9taI zQNv+g+aPPo5buXhnkje!1eKXO>byqvlZ}P0JZ39pIm6y$j_Nm)rdi))?Q%!WBuv1e z)#ZLW`WYm=<68kw)T^h&Aqu#D*9xQ^wrGxue2 zdNaW*G}xAdN#w}1z2pO0)Kp(ViSb%lPKr~)z8Q<}$$c?l&IP?UN4?2zoj(yf0T2<> zQa-z>iCUtECJ9#zK_*Ac8t{`nQjg{OvofWZI;YcAc1Gy6a>uBJQT3d$rCwoDP+jzE zN3*(N1G46c{@S;Tit#2X!pGI!aZg2qU@%vV_Ctt*-1|{tsau{0zXtiiv!A0JBPaR@ zz7~dxH36>Uj%l8Xm>m`kv|aAW{Se}3(0mO&07HPl105sIjg3!}n(;xHNYeEVF`Wn_ z;qQSR|?rLu$=T2dqe1zS!ITO=+yBF&a}94e4)DNI3-5&Ol0_VvYAS8|(=Ae@{4E@2+qh1gpU=LUfiP$hPq+vrY)#~= zPSm<{s$P2cFPbNPrIYfqOfrs;iWEykX+t;~p>%wlr(oZ3`V6aSysEb5 zeyU;Zj=~Bn)HMGX7!h?#|7H*~ODA-5`FpAjuvj6DG<3Vt(R-AY-r7Vh4>i^tZ`@+} z#~#h!l+)YcE_42+)UZ!>#hW;nc@)kNy$P45&(V;aAQl8_2A;Wln!83@^7D?LjHnOleND4Zfuo94l@(?2dyj zi9#}XlTO|!U(xC4^_BgYA^nr^qL@O3@v5h z_);opiL+>IMlEu6gvqkMwqk$Wi3g1sUmUT{2re*1?zkQ;84Z-XtqiN~US`)XWvG7x zfpXTk+W%2A{3E0g=f9j~ty8v;y!6b?8oJd8sl>|WNSYV)H`K8(^Z~I_I^~TnWj42^ny^{xk1!gKt^X^sC64wo#!5^(@Z+09F@BaRj%=VT3 zKaTW|9KpN!#+%QV#9MLhJM%*W*9ixRMcm_OS2Szc&km4LkNEBSxlQZT1pH`SszCs9 z^959y;5-4)4+YuZ?zHGQwNp5(!gl10$i(i2T-8@p?r@k{8|Qc4yUv0k9M7F!QiCc; z`rc-`P|7N@S6F}I_0^jyX1Vcio|)bF94Nc`l07+rau=b<&Y+?;D$AV$lpZqtcA(AH zun8t*QA0;2Mc&=|CBC~E{I~FSb8;y01oyuu_f>uKfGsaI6MQtHVOjczM*k(@mEPdki&&p)qfs2!L{iz~H)^%`#l3pTk;s>yn?BUGq&5`naQ9+;;=K}|J+6ta z6D%6;;urkg7=`Xh`nKu||6o?}O#H^Ejz?0|-gYo9!R`)9qjLQ!k6GqCN9eILc>0B@ zJ`gkbkW{=~N49}Sdt81)rt`olQPvQ^Pp}|yQi1%S)9%tju0)Zp`&SL2i565#fMJOs*=`cV&#g&FNQ!P9i?vQ zx5J}E&DhMFO_^8LYhB9DqcG zM6-+7;brUoT4yJ(Ct|U+RG2$6hF33$VsBggK1cW5Q7NkTj>`1tcaP><6z>~ShW3JDnntWS+;bif2z$o^E?pLAx6=QAO*7Ng(BHfYgpyugi zI(MmyVS9mIi_t|@ z$Aj5dC$-+S=`|=Uz;3#sLy$JTsMC=Nr?m&VUfqqk83>(HW`24{hzDoQM(Erh@b*U$ zY3E6pXptP;oavkG``^PHb~x!CF|M6gq2^*IP1j#N@$iItVt|e1N+#%;(0Q)CEnzz4 zg$ocvW>%p(-G~%jFh{QurQ0xg1P`d@ZjjgVrG&$USeEfBi>aTrM0&{Dy-iw{GlVvL zavHu%j9FXBQ5%SHG{$KTuBYwddKnw`&8B1f+kHpvYR09+K0t#VS+{H2k9;n)lH1Ho z-jcfWv7FyhG~eGt>(XFve)P)=4J!GnYZrv!m0-efVdi4iZNP|s? z&2N6B){+;t(DHW1bO%ry`GoQ87xg@v>1%(s9Xx8&SBZ>kzWRhiei0hU*R}b!pg0Fe zY>-E(5;oW=7uYi`qvP4u>|%LtGUgaKqb>~)=8td_R78bl8pqh`XV=GEea!H~!Qkoj zk44BDI|SX3@+$E0#1xp{quDhfJxsM}IZRSUG?scs-8P%yt(mSQ^bSGE`E_L%zh_NcZ>EWwAEIyd39q(+M z)BhRiTV^)#UA#$8Ha$!^$^Gy~V7b%GWeopsmIbdgwHv)z8W_H{Evhp;i+)*>zXeKv zUeeiJ-k-n=JJgN1efgf0__bJkSoQa2x!3l8IJ>{ylajH-WvI=)}I!xU5!n+FqD0DUSuRVFEZvMv^B14E<{|&hVdhS<7XnEjS3@z0zKbL zsYW!{u3j*(IQ|oW*jx0SZGP#E0=(`gu|uaxN87QNGSwf0OIq zF1=4)1Ehc+L{+BUHn<`#;TAD@QH7E<1}Me{KzPXt=t(UGf;3_DV)`2wl`f*i@im+T}71# zA&)!3mmK{5z}~;F?UsmlwofJU(u3O{#W`;G)$yD3HdxKbUA&#}@#FhlpdqOt2ePsP zDE?B?05`@F6d*7(z(L&D0?<;AY3=3lizOlRq|aobGddr?WE)m*6FKcV1wWae8zQp- zp6WH}JL|D){00di&=#?fRwSchK#xD^#mGY@N5_j-9T~%+XTl?j8#4=`Fm_}LssbXX zu^l_|x)yf&+sq{iT9MgJDN*B!32#8x(KD6WUeHOF`l%8+RSm&G?vE58D1sBNas5*k zj^wO=db5`&vcw9gb0M80DtMiYyqW-Zk-aEG~w32N)?p+k`{1wQ0 z*Pfdm=ZYifV$Aw$Sq$))N#B+F{$r9qSQ~l*D7~|6iuHvh$8#O+lmrwjt})`mIQ~4n zNaeg?fR`(OqC@p>+yhzN1H8^FF*X;kD`29|vcQD814|PZTL`cV#C@j`Pld7Adl#56cCUv2!YKb-4hjG?MBQNj7b^fn zx*7pYSew~f@vm|)JqL0HgO2|S)2~d)G6~KA&=vsAvqun6DAiMgk9^i6?4a6{YR4{)s`4A8jGtd4um?yG(9fF# z2|C?PIV*SU6%qIaJ=&T%0DAbwtZQYN2}5z79_tmOrDlWWmg?xCyvV|u#rP4JzL<4? z`sPx{e`Jw(|trFc4g8}3V!SO*%5bFv~ccUV?u zgV!>FuGT*`YSEnNfviB?4^3AMwb8eQ_lMM7)=Jv^60CdxessaiIve%7JqP{Lw7zJ8 z$qzo%_CM~hv^jzb5V#Y5^Pa?~;|+(?)^+QZ+C}Qm^&WX=dfjvw4!#@szHcR~lANfJ zX2cBjibM`Ex>>&)5=_DKQ>)4rB;j|fWG+-}I$pp|ug{U)d{zzl-65thV)rfW{{E|thU{Z{kMN}z#zdcbfgP_%*OP_gzZ z(3L^Dc<1eqYS2)gZG|d?=xAR5T=uwmq}fC)54qB*iU(X>&Y`(12vM{I%Xtju2B+&^K7x-Nem-s-+_TOI(M%LMGFE^$*Q%L)9D z9#5oK#>>hxVyZXdd6aMO5Mzfy2i@sUW)!j8^AJ#18aANz<-}lf2_Mk+8|#>yMH1RA zfD(RVvRT$E`eIPi{gd17;eY*YL!zvCiB4l zbVw$1@uznA205Gp&v1lN^0B_|fVp&3sJi#g&Q=+^oB0MropGKyRC)Wx6sBb>uU64% zPUR{BFC(6>)ybym3ltlRud*1{$>V6o-&%OXIOIik`Yk-sNTZ4GlmcUo;C4EUzu0M$ zD9|)M2>f02n8stxP*cw>i|FC=r^dA>?sR#Tr2`vhzkNvfr?j6v%FrwM>EqYQL)zwv zFr}QR0_7pv;#{+l`n2ew$>YHF-ZQTzy%PhSVC@MT;Uug$mR#554uu?Xl+#uSLdPv zGAnuIq4m6`-fKOEL;JpaJoSghOKJ25olz{l`gz_-&m0#OBCAl>sB8@E5Lg%dy1G+a zX=>nuddLv5$X?%;vfK@Z=tgpVPeU&Fkx^$)f*t&YX+rQ%>EFN#21cFLVu0r3+Ar?; z1&2Nb-}3g87nj3T?;woZLJXmqiV6Jt8$Y=ar#r=K4vZEBkBq-bIatnX@-HBca+Qnj zm{4k*ghEd<*4mdh8GWjw!e6MpZS!5a%cM5OkE-Nz*@}&@Z03O-%#wof()#b-)@K|e=X!ItF<)Gp>egV@n>ACD2o3cyZCkk{6$0l zqP8I=cNQv!8xzIu4Hkz~`;dt2g*EIA$h!<{XvVGHQG5M+MBA=nIA1g8cb`yZF%hMP z53kZ?LP&bCmF<;}x4wdqm7v6@)z$>!K*o56-GsKFw7|{d<|&}1Bycj&;=6nOJGkpQ zt>@D>?p{m?*6>|X8z8z?7(I83SRxg7Tjm*FqT6Cz6SE6FJA~%l z_{5PcPsCse24s0(ejqthcC?#=1Oc_C!!M5#@W6yjC$LIPBvhGVIQ8 z;5}x!IK1jR>Az#>@w|m^FnfNB1pH@j;RrIz>-yB^`TYY%Ip!lS=&}56^ckTK1DB5C z9+f5z%}sf43$1@Pp$FO5&<3QD&UUsWcJ>TqEG!t-C}+I6$@sDOH@nvv1|{7Ih4`!k z7Q?smyJkpSt&bQEvYxfdb+#JN9G($&8FN+XrZOkFLZ`BM!?VuGjW^FGPaxyY6?58> zNbJHMcKstYKRX|A#Ju?HJMCR~sdo=ohr3R1eB>jmc_uHh&T#KUVc+{CQ2(@6&JiYHaTTQeyvqMl?u_j#A@gjIfB|2rHMNv{P z7E913Q+Q@HbT7%t;gTB&W_ zI=_1LwP^H^x-wB&{q|3)7LQ>+#)11~wPYgF6?L=EUDn3JQeJ(`vmr!B%UfmWvK~;% zjtC4pR_JaV$~qTGhte48iY%x45W0u#czMnElD}GnA#m4fi&Tr<_NLki9^FB2XajMen5BUH4cOxh(12m-6rpLK|sQ7A*9TGjK)O z@=D5BE=WV086TQ`ptzoeQ3Nz+zxhKr%hmQ``fIgz`@@O95(KzBX(uaVI?KSD)3~Dg z5w?Xx7Hz`?;Tg#cRz80<`t&<^IVoQ54r>xk5$e? z(Q~Hw6&G-!DvflDP;+v*>au&9rzg(^R8Ew?=`9>1TswA_`^eSJwF4Ks)7Rf}Bp{`H zJbaN{aDkp_YMv)LDA)DrO5}aC)XFTIfaunDj`x+1CL!~-30j+c)?ng(Wia1nZv`1Oj8m zNbNk$HoZj0%^(f!6W6DE(fjMR$g63}l@A8EywEc)YR5-$$|TKIL4?hGD_(nvG1m{P zU7pJB3O0!l>F0o}_XaU&S&=$~*ik$Ov2aHf;j7mydx4V9vw2mbRUJHV{^2a|hT5@O zY%TJokgY|$j9@G?Bi6$>XJV|Q473(C-n0y7?1z95{dDN*7iD_#OK>5x@4<1xY{FHh zD&WzTvh2c9MBRGL@Cl3aIG6OP=sfkAl#2fJ>7G2sW>x_`lBav*NkUT+&W8~lN?qMm zw}Y6$AkX{FdbA&m;BTYsBbzAD-q7yM&hNrE4U51p7a;2yH&pExxwI%pvMi*FxeW?A zE6s9#6=2H;&3damQardOhqErGBt$ z+Glocy(=mX^)8fiz2#6A^vk8GZcOkpXy+c!8($l8<-1^+9yHGA#_A+X5XojrFAsEZSYA z9jzrZSQQ3hwzu07X_r-L<27~cU-P~&6Yl@rT7qT4^e>2Snps;xkZAejvRQwDZ7wC8wMm+ zqCwiQj^@FyR1`aPC@kmemkR@{8Sew!Sqe-(9F3!5vTbCNeI90@{{CH-gW-^BRVtjUTDi=#1xd&BMEjoV2UHb}e&= zt2%%J<0fxmX1=TxXgP!QWA1$-+oRF0Nro6qB^rYh%f@4kJ7QxUg=c-CA8Gz42nXJ zTE7}UT2^db(o9JCoU6Btk@LIub;1L6C+*wP-KF=PV41sz?>2;IQQSl`$jU@So3n0C z#4;>1U;WGt2f?7BdJ14>(-gAmUR_76>dl?HTukO}iTeEsCSg(bq=JZF@U?}{kr}4S!zBXhg)TIhrg`!(< zEecj<>Mlm14ir-NV8o#Ll))eIW8rl~RXoH~^lBTmbE2_>B;!pZx1y{xCwT_$bI6`4 zdj2SCSvPM=yrCqU=p@>yELU;XumzvG&CC*8m>ZA$soTaej1Xn~R)0K?U!|D8r?fi0 z?lKZgANZCd9_a%WY~pN~ixV#q?!WigbUa^Mx^8bCVk2`#!-AReBMSkG?1xP4ZJ`fz z{cs_-o{EVXF(K{h3^&R@<@PH z@iUwa6uxwMAwdQRLEFO*vy=KdhsBBsSVdvkYRFhm!e@GWllm|6YNi}9$NWtC)GSqV zrn^64h1AGrOj$%EPlMGTnu= zRK3GrPw%d7m`_(&Z|1K`bP~7^*7!>=S+-7ryB53G7pQv618v;~lHD-7QM_$9gWckF z+3`5DmW3>d*p%872)||a6mA}Asiu`{ayFQUk@~46rYgFgcS{g~SyDfkIa6*Wqj165_%Q`NJNPobdgpW(7eaXTXtjDL44gum6&W!O z*{j29ea|Q$@zg)&@(mR&)u92hW!KEp!`^Q5sVNCj%fYPhbgczPAb(J4-<>3P9jQlKLnjIK77ZGxKn&av@tz$S4UNPD&Y5(%eGjRif+>hbvw^Rc3&k!oPiZ)v?kP& z)x|TYMl)GN+%@-fP=_g=v^CbB#=RXCG;(iM)_J<4={oJ&TQ;-2lNI1}fvpd>-pEvF ze)rkt*KPyiPPrY*tRVr4@ICECwzGXq`t8dhv8xF|FQFJD>N8VD?vz?W28!qF&et<| zy9(!P`?QEFu*`|TSDktmB5#oEyT_vlT=agGE`%hQ+aaREU?~LC1t3|d$icg@UVDT# zAu63;K0`z&Aqz!ak%VjK3_jSAXgD&JuS%ALvg*QRHv&fw8Fq>QxY9W!-K1Rs=RXMV zZv#h#m8v6z;ADgPtOv&o!)=ZWTor}v2T6{jV0quS5kBHN$FMmsR9hC83rj{4+T%Ou zOYg4gnxp-~on9k^gbodn<$GEfkF|cOt=*> z;LSxA`Z{MD+FWctnQ}fps>kE<<^o3AjAYcajnod=>aF$*(8nR|3{do(_uM0&CJ8R+ zJpUl4e1~*rx4zzCnC`s?*1!UG()VgHoj?%ixW*ex10Lz&Guf>%LsEtWz@PiS=U4Dj*xU%d)3jdx|(Xj$KL8i#A)?x#zOBxe*j~#_f9i z*nq}koz#PA%M3R@Od{0@r63Zlu*(>He2i)*QLvngFnJ$nI$fy|=vrb0svF~8(r%Ok zVy^3t^Ug5M*ZF{I8my>kIpWo8zbnA`5hqI%JPS{hF@r_bT-Lh1PKp$cAr13IWD5v5 z@*Z&yl$^2mbi&L17`oQayRQS9uMrTX3~BCn-b1F}Sdf67ZAyn(BBsr=oS{|;Y^vY2 zOW3m#xJ?77-R8r?{li5idxbXZqj=_@tqUVE+Z%Q|*;;0%c3eli+{A@K-#XhWzgURM zjm!_qyyDV%nlMA&V?x>3pB&DcYN@M_WhFlF$reNf!PVXcWV=2b zRXeUl$2#VPiR`>}dDL3S<<4)kEG6CEqLr-cF12%cRBgYNWy@4%;EEgkrSx$g54)Z6 zVR*hdea2Ve-LDUV#e4xhfSjJ=MJd?P!LfXxCw8prR}N|uGEo=?h!m{PK& zUR8HMqxF)rmEO<jx0-32@&No$=Yr|Z=#;Q|fRqItK(dLXB53wp7 z{g>=sUt^?5oV4@y%HVxu(wF*Dm6avA44W)@qam8X^~tcFYinnXmV(I8mlx)qca$kE zad)83aEHq(MYl~=n+=}i!F|0B_b@q_sCK+e+~JG|SM zK-g^@s$%$>JNJdk-y}svO{5U=uJ-2b;V(ILo zHQRHP&sHR{j1?M60qb1%22qONLzg-?Vp=Psv+5l;CU676#6uR(DctW#sZ9?OQpJ7F z6`Sk5k%s$jjncuj3X_A2wC`i6XM60JyH2)1Y$FRek)kfaXi4Z3b;zWZ1=IsKF}MbW zJ{KhjRxb<_JpKq;MkZA^NR9k_sa_V(Ut(OsoqF{+1&=i@u?l~m z@M{TI(i{>ecg7OZUIFb&W0kfMb3c97?asjO+R@|r$`#N=u;gvZ42h`I6z_h+u6b5NUywOj&FS^`J|pcPEnp!pbv+khITKJQ zG*N_f62%od@#0N63ac->wZ$(Oa#vJ)vCto+i($_djJcqeJR9ZV3rKP^1qpSq{qIxcO?CouE0ToIt8! z?T%|*ilMTubHLR7dMe6=-}BkhdN9K^nc9NZr=tYd8wNL$-%JC?nFmkXAHp&F?NjP^ zyNo&$H=WszvDK^7;WHqc2h5F7`}v*&WTOXeh_1eGL;KBex96tniiu2roy!afxXRxL ztO%rz)=G*LB_-T_Y12CvhMVvpM@s5>DeDTNAajI}A*?vW`g7=Nt<;Aa6hZJ%jo?$M z)wmOf(ZNlrYo*CAk*>X)UM89;&SAPvp0_O-EV!cm?G&Ed!Z=zE*K;s-bLQ&L&@9*R zAYmO{>d>92$m{7*A5NGZX=7NAeaZD6`0dz(p8@-fk+y-`eGod+slj`=fcw1;XB<)ZWg1Xys1cQxf( zeKbAMo{aBq@&sTr=+TslsbjP7s#@X0@?LDmO_8Kroq&6s3u#g>tA+QT&5&S67@+W2 z%e$U~(K!z>ryhsVziVUssO2p=!k@0fG=JviN* z>Z~~SQX^z2&vQk%(+Ms-$@l1I$EE8J4R&~AAB}%~&Jq-TW?OA+8}~+((lQl{`Wp1f zXpN11p@FLi?yX|@g3OC9@=IvY!vGlimLd1*GCorCCnkBXQ$9IF$*G9U3U2ZF%Pn^9 zD?eLuk5*>U@K|_|pMAe{MwAPD*+)yRzWNBWcY4bIEV;6%@}7XM%{>RH-48NDdR-r~ z`>rYdctt4BRMF2FJ$H_3zLpWC($^Rp{J-mOh{VjO|5O;wmVcjM`{T25P8M0h_kft?jrhV2}%#2i!1pVTnwopqCsjPpC! zgotu`mr$W2yUr82z_<81r>D5^X^3wX`&&=^k2_ntoRx?-3Q&POQN2Wo5|C-$rcV9C zi5MR5lcE#;0RjeJkG)`rm7Wf8O3)f7d(27kD$kFsZ%eaFs%zjcDbf&aSTCxwV%tMU z^RH;AsFr!N3qB=ub$X;bJyXqsn0Pk64k6mKeZoN4_V@{sPfTpA==mHTm0+rQA9-Od zerrUmLl;Z>eRjS0VdJ+nl}sB|6}ny%xTeHQkn~+%rsm_e4NAj)Pr|rnA{Nz>W0_}# z#bQcc#S14*BGliwQ$E#i^xo{;dCcY1)zI5ur)~zBQ({A^C7-CpvyHg*a$0{LRZWVR z^%`reNJn?JjFGnvAYKqm&6)hzs#u@+?RM;}Sn|_U#&tFzay2M_2EQHDOtFTN+U z*+jk~eBrj=(s+sg8xx&=&C>W`x*!`2o6sxPd_b_+^PvQ{&uNhyDdgoG7H-xNpH5>t&zIvX>Zq6L7qe zZ{+wOr-CGJo$t;+`7T@H86KN13TME-c8ehT5NBUi6q*QZinW3KlJ)wfiqoxG%fIY? z+zqvyq9vr#WIma0TIJ0NBrg)qeEOl&6f~M`@##GUUgAJIqB4jSZrIGy8O_K7$L)7k za9%AYWvPN}OHj$W6+F*bk)-FF51*9`pmHmDv3-w0ZNogCpr=oa97kGMrPrgIp*yRXc8{(x7(v+G)St zN}f~LCCIsHubHxNZo z8<98E&grsO=6Ws(GCs~jXSBC}Qz}{9`N9>ss(oZQN#>^{Rq2$jN?#;0gsr}VzcOHk z)Rcp=YQv-53kJMW9PAx3zD6m53hc%@oNZ5CJ$I}Tn;JGy7O!B>%E;BZ<5AYELWPs0 zNJB+pqLq^^ueiYXvG!B6@0sWHUlggYfn}Z@zF}D!TCzjdo``VHkKfZiue^|{_4q}+ zjXad=$i73oA}QCm|LKNR5_7?8#`kr~RgHMXihUzP3MJjw@D-*@m9ouLtH~33yJ&+1 zSi+xJZ7LDgn+`_5ZsRj7VG9-ZriEhF*E#bOz1j~(5aw37X5c1Wkx=aO1oCO@qaC^! z`}raKs+%VmOSV;|X1JYR1;*j8bfEs#x4%1y*% z#RVFn4Y4iZmpG?}-fNtQf?@$X;|4F}2b$J&>a1+~2jy}5nYx?bbi0obw#xZ%dDm&_ zVGSmmWoA<9I_Z@qHj)N4YWUi9?ILnY-+`oj*%IuHP(GGg+6il54{$yAmfVUYsiP1D z`7d&njsfA6=9M`~3DtYtt!`gVmTI0poM76Vw;{agCMCGt>xe1kNCFoR$UI}cnn1>^ zc12Eg>4#==H6*(D*Kph@w&tq{MA0wq0G9_PT8A2Q09iNx|ZO&#zO{ppM%* z4+DPo(ez7LRk6_w=FvhZDRoz7rn4nCM^|`geN0l7Wi48+=811r!p$Zw31LX(VRMS> zfLm|vZtD-LTcTWM0dR;oZIjy?24 z@I?5mY5+O8vhz@`s_GGI15jlzkL*fMkMVk5=Grtr&McAi%1ZY1u#SHs%Rwh&?Bu?A zq^&lnTI#9n?EbLwCL?(N@E9HcQD-~*$k@)%!(F+-)O{?z5Yr7kKz3a3_N{WFwlxGiu=+eZ6+ z2v{kN3F6~gUyx=juVLND=-EN5#HBcXHT zz1|bX;k@47@-a_%qH5tAB<}<7-yZFlV{6^%Mj^XOrPQM{24P+|vkFm`Wd6K$ap`2$ zkyS0eN8&fk+QyDDp76h~sTg9loi|E%kdFx{J*+25@;8N{yeJtg(*-Q@= z^9hqLS+JA6g+o$;-V^sUq1H~-5u-S1-|s%r4$(COsL+H+XV0u8n*_Z} zcFH!FYQKq^dqbbk)ix7C_^Jd88S8r(w5s{GQeY^_+g^SJ}Oj z>5+3Uxm$LVZ&1jsX3n`m;TfLAyZR`7!n$->o}}0YvSPx7Fr{M{)fV(e*6CJ5LfKSm z;Bg8|uqZr>KvP(q1#*wFoqY8DTXqdpLMMsrYz}PC`Anki(2SED<*>EYpoa~A_+1_+ zl9y~sI?TuNE-AJuN{Abenf7qf*^B>)Q|;-!=AXWN{cR<}&-m7~O2+wEUzX?uVhLh% zFhKrDqx;rT@44xR@?A_cK8f(t)(2^-c<`L$h?+xXbk@*H=8ipKrDxZinDLoTQVPt( zoyiH#*by~atnS53jKG=v>TfH%72`#a<_XJl;?{eP|8eoshsUv*%V0-tiyez$dl7jN zp=t@R;HP;PxOP?0kNl~rD}nFSuV^Cw*ATBt38>Ws>zhb}F}^}1(QmOk9n5#47^ z;cgpjzag1Ctu)Yz1GjZHuxBZuwK+u9fC}A-bM?2=RdiM1Mg{QF-Ay;*xYajzvC*$O z`@;q~0n57G0!iy8z>#%90)W8%!Dg#m{{8NBbxoL@D6OIqI#ZK|uxwgS*d6tFbU`(t zD`t8=*`8P3?5#i3Dzd@xW$RAxb?(_j_tvu=LFnq*v0K(I>2aqv`Q28rjS=-#Z%rbr zvI16l{>7q#=t}miU(qunm*l;jL{{d{iLFXs3W> zaSE>g#(VrBjYj(9FeMy8`@`&k<$(MO15E@aN5U9NzLF}kK-NBc~xjZ6ZuMV*PnSlLUKJUIl3rkY*VRY zW-&%Z%e=nd-W=}(sVi%!9MM@u>B3#HYgIQh(j9>c%=cjH`P#E1`|jA(uau_0wo?`XLGcYhR#5F#R41R)X8OY|-w zh~CTSqL;x$ZzCj#PIQ9kz4xA|F{1?0%jliaXBg#f-*djdb3W&uyY652zq`z`W?9zE z-uwORXFt#LD(|)eZ^^YoVIlSsQDOmRUo3y8Z@q_g!8!xo~9&6CM^9jjV>P0rU3EXWIVB|5!gzLz5D-<9o@ zw2=^W^KAQzp$jQE@L=S}!$`XpTvBQT<`R?d#VtW2IUjYg*WqwOZ;?3jGLp=5 zv4&IV%71fK;-He_*gg(5CvBBbPez~qpS%^`7jf;cnV ztdyWjJ%agfu*7Qmhl#bUrGw^RiQpAuaRpK&jU97!+MB60^~@ysLk__^RuNS+6 z_?%~pRokWd_E1R*E8T;$iyI6w(WBjxSo6XuiBGW)a_Fv@BM8gnh4`~dY96tE3E!>| z^C3*})to$Hx*4xOa=rHeY)xvUD~qMfz0qAU*%Un0>@vy`2kWy&%39^NWXvY*pEsGy zbMUj|uN!)9d;C#jK57YJ$_}e&KZ22SCE@ z>8Oy&kdn+iV%?2aE>iG1!k(RpMlJAUj%~kG_G7hA$6`IqhKk$0N6Nj{TjwZDWqY^5 z$_J8oOgEl=)+P8d7tW9udH>asTlTq-qsWFc<}lAA#KqNyXP27JcbqmVF*W|mgK0m3 zr$WxPGEhh36?Rk-fNGy9r2NtC(i&qyU7@GinKZ;Y9A-7TVJ-lM*0A8c!+oz>tb_d9 zd+G0MMrkU`FcO6M3!{sRdanEJYwgxvo!0=?9>&QKG}VsTrv@u#ZHLqKArQ!k)5A@l zw&vsc(L9$WlR5WxMdjL}5v-&A#8DN}nTrg?Th0O+JIx9DG@nhTmNXKo#$0OXf1TTZ z*#F7T(tfUG$cQNu=;+X=+>^(eO};B3X@7Y#k0?@Q(-+bM(HFq6*>7?%_9VsAtK`zF z86HUWpgJ|5(0h$FH_j8>th83GX05*>*KSJ)X{5Wh&h$HDu?_5#f~UKB-w0or@m^l2 zIkaS!l-5Ba4K4pbt~goBTQ#p0r}NIFXT8_GB~LM%+ixYjtQ1#xlRBs9l;ieV|22oU zV6%SR=lcpO?&`%--$7Wzc&Ge9G0$CQzO;AXFOsZ-=}F)eEkx(dyhbbPgMUMH!nmZ4 zg1^FfH@UKk{GLh9=)_gCiF}7@icr5zYu_`UcOjPDoUfo4T+qXCXRRFgZ^0MnQ~l}lJ;t(`F0m31S;S#E|Kx3AxybKx$jw}9;?)BV1-`F5q8ttK$d8g+150M^uZ-BD>4`lpmqs{4!O`GG$JA zBY1^eUMpQd>PwkcW)&6;o0oYaY9D3HD|zS5O@@(%BMYT8%gy}VIgyc#ioFJjt5FJn zr!O>*R_AjRL!1M5foW_VN!Mh(qUubaW7}e3tK1&*aPv37TZLRf!ASY*)@rJK`D>Og z-$T(EjX>C)dbK8iv78hAq{lu!doNy7MSknj0;bt@l=sDDdHJe&@1k8P&`Fr8FfRAW z*2NE(7r4!IuVfdh+WT&P$1)g=*22+{KKhL4SN!EkXOT%w@|`?En$*@g!-kZW)fQyF}c0>Vx~DF~eL&7fKkO zx`eu`Axl=1`m0-}phEKdpiEc4KMos^QdgYQrCA*hP-sVA-dF|fm;VNQJcPZr6l~BC zp>im$l9TS%`Y!=ST&PJ<-X;K6w(RN3O@l(BD>;Hs6hq~V`g#U1N7wIC>2S^X6DtbC z+R|A*dr00a@Jqa>$NkQgaI)*$vlOz@Q4NR%E@TFq_t`iQw7lawr2|7R?X4^&^fF=k zR%Dj_5=E#ke?cv^psFI(7d>rG4|Zy-3R=S|oF!7l=K4i5RozQ$laQW!;g8X$K2qHM zXXL1e2W}7s0nqIJ`8?$8z>;Yyd@_@y^yW9Gq?_cd+p*hc&pqf_PZNcgwNW_@fAIT1Yk+K{&XFYOCh=vajdn(I^*=)s0X4tAgPZ>F(Fo zHL^?{5WFAjQ5X+aS(cuezee*&oL7jopT7PcP2=`geO)zXErjGKVf|^|4^PzAyI@NH zqb1MO+@onoA1#ASE}2wn2}7J1Al(>w*{qP`Vy}5Z0+5`2Ceg5VI-x1{@nVW0PdJ z@^l|s&5@_(ntjGG_Wf}?$=^KH2CcM&{vQP-Y##G&x~{2`-&ki-%ozU_t5jjh5Ra--+6d3qwMP9d`Lng~;Fkgm*b?040`(#Uq0Dbe=1Ru0Ys8bJj_n?7 z?Q}JiWk?%cJ=>XCE59XpY7M>2(`~RD9_7j(did(IVS)fg_0grlBZGZx|fM6JYSf&S0#mRrklD3kjTkD!k5Xt|fp6P(?DWD)LErqw%2;1{G_6Q^GSoxd zXpg@8oTEG`}Erj6}6x1!YfPBpd)u{yVbx}WX<=-Di(Cdvign(2M7o;Moi zSfkzQR(9O4KQ_8pz-0PgdwHfx=+Av8987u<3+blH%f004MK2zeMdr<@1aX9g z&p1oEj@lNaC-TS}fNK?j+5zoXFzYyyEuvBcy;;t7R}2&LU*7P1>TiHNjFo!^GAE0a zD%$dM3sa*q;(PAZ{vXU2U-<4QxdHL~xxQo5T4MdUjsdVUkXz&{*A6QFhwD?ZS_r8Q z1I~f(&;~M27_rH6SeC#QKm>T0{&d-F$uQLc{_;W-hR_wW4ZJ{qncQ#abF!`hOa@YJekXELR<>0F6b+ zJ*+*K7s$i6pYJsd+JF@N`z@Cxa{xz-+zZeBX8puborww2jU+*Y+v)VB`lE|0=GsUY zs%h0Azc*2(BPrn;Y%tr=R|mSCAip%S#yct1DTFJYsi;0*Ek8x?WX`bopF8Eoe8kwB zPnUw~W~{E4Q*$cwUbZX+=97iyb*Z#-9te6HuY0259kWghQdZPax1jdR1`c|MG- z#R;Y2jxO)Yscn$B$QQqa$&J(-+}E-@+YTY!LrX50GZ|gevALFGC#kZ)71&CUd*Y7U z-@k4ZYnO27qLVa);&XC7~@nd|JxFxFaiue> zS3^zVub1}5gwunf<3mix!*G zPHJH#^^-QtfMsm84zORFCPVen`TG{exJ!>)eu=4i8z#xJN^Zh`jZIC_`rBX2xPV<} znvBj+ItmF?@_#-n`YuCU!&|lbeZ$+z#Z*^diY!AbF!!Vm34N#LtyhYanIPM4CAvD5 z=M{Q;JoKAl;`UUy7D@+lpWn;Bh&C`;P2pf{(TuXeZ#+`pq-5d9HH_6*U~$kE%xl!4 zbzX4i(I|{^Y(HPmQkQxzUfy~HW9|-rVAyWm?tg`DW(zq}G(+~CMiwYHa9B1`zs+hc z_SglaCJ*3@c^#TqQPhH*zL~iPx|d!oiexjg3RvTHjlbYViWw^Mt2vh^#;o0utxA@y zBYmN;9F$U)8W~iPf&4p;CS5IoOHA#1;oSapE#2JQM30IG3VxU~qS*(7c#CA@#a%!K zbXAv$!F~hdGFe{opL?Ab8QpzAgwJV|$8pNeZzsd>Dwv3xf#*4Qn!d~SAVg_gfE5D1Gar6FAa zd`;F>D$jp*;tUA^PZnul*yI6e)y|oK@-liWm&$BHQ2Zn{^7=!n{1Us9Ly$!Z58L<> z`xcJ{+^Ox2+5T!|G}BDN+xG-4f7YbA7|;CzvK=mKFV<4LFMiF=Dk7r^&7Blqdkhgp zPw8}B%wGIztA8Mt)TfdHuJGp@N%VI*(CNS=$?ffOzk@6IxLe-~>zl;EZG*MBo)cik zm7}L~y6#Qg`#ez%C^yo`{tkEW3LLyICpdJOC3Tt>mP0;X7!JjN!NaYmO@l_2LSiUY z4+-n&)(d%OM^!++&^AaQmCgL@d^Kg%9FuXIcVhdCrV?S+0L5^WwTT2}r;SPeH5eSx82pU<(&#g4J4=UUQc zjnv_-L|CkK@iZFoFlqT0#Liw_`;}b}vyKc182s2f&ezkHAU#U%khm_|1<5eY;>JUj z_@r0Zi8jj!*YqVom?nO?c?sx%=WItbVEQcTd3WP^j9)}MUJ1uqe~%9$Ac}GP5~!Fo ztYJAKm-dcspGQL|_DJa-mcLM~sLrkiL8Atm!et&1OQ&3a3>A~j{W~nz|Dr2`jLduC z2C_#%qYCC$o`iGtLkm>SOn3&Z#Ukr?>+v$o|AeZ%F3$SnqO@P~klJU`O5c z+db5yL?2?wOXn~ZFLkU(Y8rn+xB$`m33V0*kl<&W?a}E}ob2Q!>cbxLJHQq2CS~!< z>!+>KR+mEr-u!XwbkBUAWy!=}J!Lay6v~T)xhx+P| z)#{B<${~=U?;jV$GxsSo_rfiT9wBoI0!RfJijuqQo*>HFuE~)H|g9lKrJ2h=*u%^`4rs#HeE7iUf81JmmA>uj?~QkER|mMFo-Jv zRou!$`HL}7iR@0>Ju3&a521{pKSd=gQVW}#eVB>Or@#O<_{8V>e4}8RPC#^`+-W`R z^Rydt3&~6!L0c==`AM@Ef@6nv_z3AyTDqN4bL3v#BlE&u1@x0UZx$t6zL#&r&IP8v z|KPZRBd_ep%g`;8b;U2QN(LiZ?Qv4nG1;&C#s6kwJpK;{N<5XL8IEl@;ZQSC(3zQy z)nKRSQwozjYH#YId*&~a06rq}klC5?PWf$EGe|RmIhp#zxcwdk}jeSj;=udYl9kph5~u>ZPEhYub6mHb#cECxrIM#{KH07+(MGVTG<@MGhM1$Jske z`7O^B{LcqA!l5_O2*3IA(i@IQqm{PPA*y^rYm=+ATxXx{Cdw{iM^1qm1OK@XX2X%a z(|OYrJ=>DT-sThJyaa0a2h_MfB~8{Vpt2NRm8KYC)hU*UP@WPqLUZ4MnYK?yKh_z7 zq95YuG~!>9{3Jo+zZLQXY$9HnSuA*eC)Sr3@;YD3p)7etNYhs!)G0t$NiX{*tTH`X z_3kD94Kteooip2)BWy*Tn_tn|0y?e(Z{EC*tgGah``zcs6~O1L9CssR%_z(hFOGrK2as>CRSzrS3k|7ak#P7JfWbIQ>*YSMlR z{YW+jwo7CTJN7LTJ1Gk#WeV<(V=A~#jt;4$Go!)zK&tZRl^)r$aX<>r`PmPo*3)h^gp7k=t zr2+SP%{_+>*>~u0`e-ioYW>dT03DPl%q~>3RH(YVFMldT)@n&nf^Mb!xY;O5QQ-^76H22g@QN)3UaZgz3#aL zPe2IDTAoNNQZp8LbWINM%q)9UbL`9qo~@pDm6FT=Mh`hoSyL7cGWh#`$p*raR2^6C z>DC6l7_zMcUm2`nmuVbJi(Z`ai(O$yUW+i;m}6<+{ji5mFh6;d51A?s&LClDAxr04 zTIDKHuS>pyTqBsoPMe4>7cwN##k!&16aQ5}s8C{mb> z@b)ZGPnBYOMeiV)&Z1_(-s$z>TplBstl`PNQ;ft=C2|8kUp~|Yv=-yX$?oZo{fZH& z1eJ@Nb1kNF1Xr_r74Z;tyUTA1^`E@{>mq@kjg%nA-9UN#x?^uR?w9h!iP|B4V#pqv z8gq(_ph-IeJJB9PgeO^JhVT27Qc7ToqF>5w|(jiExC3Y1~22aJ0Rt)Vqrng>Zl7@AU}TrNZ>dhiETUR-E_W z$t;zZn{mZX_LCkQ8swIY6&FVWJaT`$SBLELd?sPNiPv9DlY;a`iQFy;W*YW=_pec2 zwQM!fvko1ln3ZIsiTged=&es0zi@-Zq%CMwBFaGdQsHkpt&&OEp>}e65}~GDR|0hQJ{ZbycDHzvDIiDq9reN7IDiY8gp6pkpojg zKaQ3!Q5Nh`QCcFz94eRlY7{eXHsDLY`fd`hp5>?8W@BOmb5VDg$u$$J*89K@Bx*>y zDev?7PT*@+)%VOqBng#%ZR1Atf$LO7eBT@|qXKM<#0x)>i@I6Z36wkO-@k-$N^|+b zIi;z#%w7{ov)e#|Mif8c?nUO&;OKvG_Ihh1VZ_ee6l}l6u%0PQ=adX(m$j4Bi{>xB!9CgqL_eQ|*@+Cq%qGt+;7F^L9NymU{et$=D*9T^Pi7 zJY3~)QkIf^;F&RPO;vn!I`--&-0ec~B%0X2^qaEUlyYjslNo zUwtv1k_}S#LkqCus%Yo;nnAwWJ@E&YJq1??6Hk`c8BRl>kVNeg0VntJ2+U`G6||44 zmeN{+>flk?Hku8Bz0sH9&B-$OWcD6O<=h4|6*JG<2f}q?c^7unyxBb4#gcR*mM--? zL^MywY=?n!fP!7pEP6PIoWh_|`-J7A;}3#QEE)`!tT->||MlYD#{YpOn-Wf+^0Sm^ zqFVhCHp%~d1*qJod1eGLa)Dp5TVF zS^4@DfV3$p&V4gsVLu|?y}A3JuOE^)?496FfA-%Hyu$zZ>VN*8e}t|y@V)vA_a}iu zCo{7fKFi{X5Wn+~L|@6FRrRcPaim!;3mj6hv2bz!eTV@hil6vH^*;Aas0sr<2%QT) zNbwIlIf3Dy@W1}^r9_3(7&mj?sMxilDw#=cdIqw3K-kNF-zx2#7V>;iHwRu#xjj_l z{tINX;JP`-2Ext7;(k06_U})Lc#p%b2Y)em_i_`UHS#|t`>!+muTwO@0ptpK&fQIu z!L$4Rt!sJg`tAD!=3Qs@T(o-0etMtDu)1b=Sd;#JaBt-9mIJ<0&VVmgZsST{G%=jL zMoDgx<=emi;osj5oD3hs!SA@?;2lRldJc^NskNI>LW*G$$`dHk5J`ZHButDpS^jMM z_RMOM7!F~<3eIEHdid|l^nYK{fBl6y_7ep*CrSRd$Nvxi@SlMYVD_9I_h)787ufTE zN6kN%?mt6`9*6O949<^t$qEYpUiJTTZT|TtIOr2_DMlZ&hWsyQ`rlVB{{0(*Pmj%5 zS^i&6b#X_3@b1eV+8?_hMELaL(igN##_51I~XsU<*9w^;8vOfOz!}(v{ zzX`pYi^cr^U&Q}y#s9y!h}^COpXB3S1qrVwGhCH5Zx?rU+P+I#Ip4@621suvQ>LGZ zZvB_$>p20-F&Clp)wnLeEQI20-UH#ho?;ygU{z&%ZeiS~j~lm(OFDb0ooL*FLh%5Y zpDDGGmlay=?e_x?M#9v1T!0Z&utuFI!Z|>cJGF1hvA5nj!|Roy>xj%!jP%3%qPvyS zLfeHooq%R_>%CpW*PjIvr$wbmz;0(;Mm@jS{OYd|{(bq*0$W^`G(n zCh2be9?$j9oDKlN1w2TM-=EXJ)ZEPcnc=ff#o3Ntj(-$rNXEWX)?h5%sVaV|H3jfG zx`4x*c6JQssK*~u5p|u<%la;&CIOguc+xx6j>s;ZPMWBOA^-$z3GlAskjzn!|Ip%d z1n6Agy}$ggc1(yYX40J+f6_jQGfa&=j_UuG$$%$hl z1WlmlYZq~vOBK*<(Wl6sqDsOCZV4A#nbJnD$yNTj1qC6J0PHsin2NyWeqht%Oz`SI26-*e;Ql zGkY0nnZ6Jwjpy}+qA;y$53oNX0Gv?V(hum?HVj<`$t5mEq8}0k#QsHu+)E|kd4XT( z6#dmoAxO(0@_W68yv%>Qjb#M`Y)RG+<+$OPkw}Z}lB+(6vnuCdag+tQf%jHkjo)n3 zZZ#Yykc&{S;~C&OXIuY?cFf)NG5WWh#N&mt`UXpdPpZDlq-Gae1#}`$7;M>hRx@Zs zelpa)nU4Yw1XdsXB8GA+eHVINTG>e;EqKT7<*CO?Q5n9g)EmDRQiU!OIWRxX-Vcp` zB#t+tIAan=zZv$HH!ty-oVSY#UhQblc$d{p5CGl{Q0d59g9*z%3C#3xFkl-ffhkKL zQO3gkx!NDs1;ja>6~NbU{__@(h%qLXFVXFz>O;m=61_qoK07YgxR!|h(b78bTO5{* zMX3f~)7kpvDT?K*JSh4N&h{)r!N^}7hJrFJjsKQX14fjAJgffax@J(o0NpFtK2n|E z=v7rYB(gJAUjHHnF#p|e4(Kp@$RPh{q+eWkpj1v{x|wRW^}v5fc!NfNN%B%o!=Fz6 zO2#t%=d%$aNugq#9ZuTZg;NAqOQ|OrnIGBjO;MTym zVW(!{&;|>)PyxiV$quU^AHbR_bB}l>>H@=E9|qI9hkd%o!>kh*40!Vm!DRmN$rp^= zd%(?+ln0pwH;kVPXP5<3bpp;FnduGbx5jKseUjG@ebGga4vZ0ch3@9b0%idf3^>!R zm{s*qC^}j#oDX^Ep9DDE3bTV1x!U*)B3uFAC89>w=QJOGKVJfTK^`<#|5_tj0&>O! zz>G*82pGK4CK(FQ%SE_vLApBuyX!3Li3S2N^k4zF16L-6<925GDOLm+WQYIH?FMEs z^y23wfS_?7AQtKCxeW3f=<8>?j>@O3F+ndxNhTyO54x6C<5X2Znu!e2Vmy12fIa0B zs^i9QCL}4S1=%k8=Zr!R%M-{~b(uj1qfB(2jgXbjU}{IbC&P5zL@;S$@%V>eU=hs# zjR&egQyhYLOP8YrxU%_oW`}d8UQ8EAUTxKuwJZ+O0hWCqg@6OPvnMdfH}>V$mlI@_ zlE-X^?%{%xZ~}&Yu8u%TdU)$~X(YCzc#;I!FBO!hwG0Z$ilTKFOeV(To3X@U>2;CCcqr&j_~dfZ!WR^%i1v&#WnLA z0MhjRqH*I1-d5Hil1M4cx7Sgho z)WQEGhc4*WbnG?-6N%9!8h-5mdym?w6{0f)b#Dec!Nc3(KEDQdhiRT9QK6QCFxAwK zjn5aCLpQ|1T{Z3r+B#K=X^tg@6~mXn!%TUF&hK%1tD>9cf^n}`Mt~ThmvI!GWc%82 zgta)5h+E?1k93-Z0ci6QkRbtt^wzY)s0q%Ku?C+akCvmUbGGuv7vcrygQAcU=uiuu zIi491fCO~tpLnAZH(?h{NaGXbegBzHxP9Q=dEfzBZJ)LmKO#w`+K=efg>|=3p!kvE zt%B>)l3?v#p?I!n=>I6NYnjx-)d_AEuFo1Kv(=jSxd=+^fuh#X%vX_#;L`4JrEb63 zS7Z<>r^^qTQGa8SEK8;_ZUs2Wup7IAG=0_*bgLVY-jgk(P0Y!KJ;c}gmw$$r^{K!u zfF5Hao1URXz@*%GhZ^@u-KNwFxFErN+IrPmqJh<6<0~i)d2il#oqcBd;vV9TPS10Z zcV>3(Mwc=0^21V&`D_lcW7~CqIWxt?KG!j2U7zJpCVgX4NzWSeUq)7(YV>VxuxHBf z{1AD@#!B4R8$qQRu8=U(aeZ2`E5b$!-mk!nWnTY%)VKW1V-5nELz^KU4PShlCsgOo z>}e2V4#}Iev$s{}nn~VakGxETV&!C?u&1lQ|8l9qu&CJ>2Et(ExDx#PpztKb=+Iwb z0y%;TroqkfJjysug?8FJz4>k?_GSAAMQ3AW85WA>sx2RIgi9jP?YTlL5XflwD6fo$U?#1ET%9gs#wO- zgky*gwmj=rKW|r3Mu32@4?;0aNL8TrF^#mYSxZ42IV@(>icO!*=olLG3a!GkuP&VU z4j&PpV*leOz{<~5$#)tlWJ=W3{aEoO+p894f)8=z%?(fbvT4HyT(VDfr?Ksw*+W-C z6cxOI0DYKb_)&g-02fXgt^y0M%MJqUh}l58Gft(w0y8!_7DkSJ4zsF$D|p&^fNdLl z(E&i`;hsf_s$-Frw_j}U{<&4;Kf;xrcIr3=d@boQ_Yt=xEM^}5aAI9u4*}03nlzmc zS$p~%8WX}?Y4>%7_&ZQdO{>nh1PIPQd~J?nay;Pps=W|rG*S?W7&BxN|8I)qOEDmGx zd$QwOnsoo9g!zxc#EKr0)Y$*(RLi<9e?^#sMh-89s2}Ijau$UKuXG+?W#XT5l_0ZtYA%y#ZNx@0D?yp0-%1* zbFY0ot3tEa4z`cB=8;ejQvnSv{XF~1-g%&^?ZTxrjLDmg(M!7nq}rMciQ|;vFSkT# zcx1h)&O5E&1?FNK$;zYln{{pBN1}kWl@!@TFu<02o*rxsrFh1R1ge_SZ1@;^1rVmz z18wi2dak6+EKVIOVl_6q=h7InP-C*nFQ_HpY0!R?vUdz!w;p!=(C>&+N_>wedNtAV znf)HcnkeF2xR#F2Jo^)%mUWNb`pJ^<;>_#l;YMu|7D{)vSlbWh21o?pO&p=-=iBg>;R~<7U~eq zBfvyQ6f>wob$UwIHWJ9nT_;J0eqVnv)pRLWPrI?wAE-JT<<=te=@h`a8JAM)sBLMW z=p_){4=%MccWg?vcBK(JVHTXQa_OH-J5S2))Yy!C;00=M{%NN6u8n0yvm7i+mzscGL%x>KW*E)+ zpHO9}j?74usB($6)qAKL1OBvNrTc8(|0wVFYE#c|SD#e;1 z`R80{Gvia{Gdhm7o&56)+dGXcUyBMP4O`!tshQ0&Cl?J$V0J-s%-k#y8)Ih}Xc(X7 z@*WMR~9mDuNs~@g)gWCiBn`*iF?i{@#7RY$yaf59N z`;C_JA*vuV8AtbrjpkAG0$9)J+HzI-!}D$=UJfYUKZ zUmbrkhT^=Fku{;l6Y@&Ktd*I)qNfh4+7ptmPr*enwQacNyYG@&vJ?p0UTdIX;_#2S zQo;C8?Y*M~KUh5<8vsAs7r%gD|8?@gv?~keL|=3simKSVL!I_;vE55aN zhm+r}nMnJu7=JE0y)!E-1D2ixH_Qu!_o2TbTlSzHqYdz4kCtj@=p)Wgiw#{5MadRs zBVI%HLL#1*2+5}prDi$_`R*F>n$lVXfN=CsXQX-#>=#!mItjU-6(3Q28BpEe zg56Oxqj=6ipr@r@*<-WkL3P^WO;Dmu=vC4@WyY(x$$Th!1Vm%@6dg!ZrI!k(Ok1JKWo(dAs9LeV**bi*R)~XcpGKoaGPhWhKajfBS zi<9KVKMH>~dphuy+e4vIBn%4O)9R|%PAOjYigGzU9j}1aZDr5srOdYd&Mpuz|D@oB z;$Y{AVEbY9oYglqeH(+eX|V=F>5%mn&q_Mk%}a~(%Vts=w_-AMOVI>2^g8?}PU7Eng^T%xK0Q_Q z<^YztHS?;wl#l(dpXtOiP7nMM=jWnp*2j<->qL*1&9OmFRQw0+25P z1o8P4{0M&27xGHxeLth~#~qQby%>JTa8PI4I~{G*`4$W7>C0O$fL{+i)M)6LyZ55~ zB3>N4MGw~=sYs3Vbr^;Gna3%&WRC}#+#H7c;LkPdy{QcU`1y_4-CT;JcDJ@0|IGXz zy2P@k+$^!io!>1)zm)Ip8{(sz&*++J>u@ivFt!KobM=jGM>Lmp6a~8+oOZCs59hJm{L;@FElSfXW4lx3s@!N%7>&5f@jOue{eW) z2CsAyuEr1y@c|p|Tv-v2!X#g}$bXI)e;VA)_p@&}f0ihD-IGb&ql1n8iZ1lkuI$t= zset)=zW#E$l+%`I+I90W!u^^!@m(}Aw@C-jPB@nxEb>OPRF;Hd8Yf@xoBq%3=~8(X z!i`r-$uTM`IT&CHQd{U27Pz|@vr8|Q?tgtA*8vUdX2bBiy;jj<5Un zW-cdC(*9rxV^D`EizdkHbypXAaGSGOCbWdd>s8q@D7Ee2B)sOEN)0ZQgSbQH^%JAq zmvE^X_BCI&p6Cv!8YX8i1KdM`Sd{pIZ^h1)Gw;_tzgxq3SK-}tqhPCLF;Z?mcUswy z>vwdy^Ec$RN;xXbSrZDO<(;`l4qX2U{Wq~rS#ed}%ZXLAT0Vk4*Q#3=0_GE?t(H;8 zVjX);U8T}#zm9;(OR&k!#bl99YlrFUXY)FFDF#pMDjlN-3s3CH&E7iJOs9^QOs-f? zv`q3mI1-VB$9YKk9=jlks{N0KqIe=&pBUsQRy4DoiL@uaemGA4PV#@C49&0p#NyC9 zY1<~641Vk~!cL6!efOw!F=v`Toks3!l*~EM*!`71$yfnmUt*?ewHcUBYIvaw*YBhf zi_{$T!NPDOtFSDp#3&|KRw$m6aBAu?kCt}mJ$NkhtMZ=283fxhe7aiA;)LV--Fx`k zdb?4d3`g?fB$Y!0VzXG=3M*jk9yR z*HW9X@BgU(*9DJF5s*mUNdv+i;BjZl7*a`-aDE6CVfKiNMcgbF0kve_G0wZU06Q?^!(Y)81%vEt_?tA?U?Bp5y7Ynyb>60|dc zx}+MG?fQ?)YFhhv^F6kyqv(Uj6kCubE)1xVF)HXXB!bqdp=Xqi@Z%*ql`RD*6eU1E z&UkWu7(w0JcQ1}e90;)P>Ors@4oXa}SV=7)3;8$4>XA5~ezId-n)rk_zlEw9Tw&%v zOh>EQ8@2!>TsGT#Zw#?G7aJzne;+XH6(q$KY&h1)=_lkxNKCL^v3PNEIwxBqivDl{ z^R;wV&mrDnF;G4JP!(){!la3dN$S-MKbPkaPmzsv?R?E(r8i2YyUM2?C`A(sB%|P2 zk%9|ChQOvb*UsDK%>9jmm0x9q4Yd#4q6t$&Dty=2jI8%CzQ#fmZXY-}4=ndiuLlsr zjla`?CQyHM22*5agJj*A6)kEgKk+LSb&U{Gh!yTMQu-(i?ubGc<4&F&e zmd|M7`UqO)?c)gyML`-ENdAK7Eam@9Hg6aLq9(8wbN+4Lw3yO6rZB9U=3~Nb zb(9&g-UCO#${F;U&JnZc*)eNo zi!9!r<>G2tK;=O*(h@WL`%HUZP%M{PzcoF3G3BprW)Rqx?g^BdR8fx-+mGCx|;wH%t?k_jh5yY ziR*;d4^Ly;ILZH6jDNi=qJd>n22XbG@<4!DgVn0uyqP`l=LiE)IG&J+-3Iq0X z>=|W8J&&hac7J`SosH>0ID7Hub=kC9hbPzISK}H+r+h4naBpx;18*tb>QhA`PuZ@| zQpD?EtR)Y$DyK@t+~*LwrGtTME)Bof*r|4sIrzV-$%-B-Nln==0h(gZp-FoC=HrJ@~Mh_6r|HvdaEd%Iu+I1AY$x&HdfwVIOnmjOPb)1VGj|5BT$}qjnI-{{Ga5 zpzbAo!h!k&&7oVTb5ZSv9wQu_I2MwD?Q&*hoT`Md!7+BpPJ)hp5wrfRx#gilQmn`E zPx0w+QHoMx4&N1O#HIoLj2(N8?+jS3OFVqBDMf~D-=DK_G4R3IjD1D=UX7+~%Oqnm zW(lcmg>%5pLZC;dOVvoH{G{(esHTc=-p+24fn(F|Q^UerTnm^_sgztVIEkw3R(uiL zs~tOhD#bpZ4Ybz;s!Vb)Mm>@n>!`)I=^JVn<7D!zS3~#!r3cR4g*1JLY z9uIDj4KI%Cn#^aP)`2G);N>1AQWtJXw_APWBRiPcXQ?>#B>t96Pr;L&fj{d1y-)eKI+jYo=aq7K=DZmlX8sj%d^y ze*hh+$;39(&&bInalSn4v)YAXn=<)BdT2P&#i#xKl_`8-P+& z_()ZCpf<`qa<)#qphwp}bXW5e6>;t2U%ds{3Unowal$>q ze1Do^2Ym&NZwznvuSk@RPuT;;6fb_DvJltuEz`$|u5B&P;dnA~OtMVrwdA&Eq7M(* zJGn!GVp8}$`x%q;)a(97O5FVPvlgHCcAidldJBYH8>f_q_nduG*!PwzIaL}8blSuFu$YJ$ecKc$Fp zNu}Q3Jym3{diN0%fC;rPZ+b09iag=HqBhmnMxv{FRomvtDnp(=O#VmO`ULj`O@^Ncyg;*%4cxXZ~1z;D76-2-5R78mb6$)s32BWB`spji0j7t|)9y33DWryHx%yGwJTRct!ITr#>d89#ro*SME^fygVd>Y4~Ccx~Jn(yX*0q2ug_8 z3;k^KUCN}b!KvuOUp-dIi|&yq^P zc!z%NU;C$sQ9wA6Zm0e`#mL^acD9%54ghk|t9kleE*8s37J^zgsXI6;m>c0kJ;W)U ze9UsSG=s}BgzLecmXm^?*YuJHi#dRN2lFih}y-_Y(jjfl}H@MAGSW+NoZsH~Eo!y5{r@q56y%buBd>%vw4)QL@+O3cjs|7!2t-`UF6 zI3AajriRfHN-r)|MIxqX>r$6$R8vFelr{{N88nPrIjW@*Rf0;;PTg9JHd^9Znz)p< zl#>|uOPx$LB2T1wTqB4|UCP;+nR5pH;rs)$_fKm-`&rLg?|PrT-}QYz&wBYJR7+9> zQrjO6A^r5-)dzIyr)4-lLzHKRF3a}bR87j4exRsRsz@= zn2XzK^Gs@94IDC0rIA^ANi>{C(T~&}wtZ#8c-oUnq$u@CPzNY2Frf;;KSF)! zPZBW>L-0Z2v1F2~mkb$77$k)3RmIc>fPbO;KcK22P5 zMSR1}nW-K(MoNJx@?N^Wtv^0VJBKjT2%-^O+m==ZfbvyYk>4|=!Zv5VBF?)6FSF|M z>ZY*!B-^&BPED+oSth;ni9nMRJf@{MCA0N@twaKXglnhPjndC7JV=V(UlZ84$m z)GhSNSb0t$XPMrbn@v8}vM70DjXdoQ^&GkO+il+pEE zPW@sG+mY_@oI;ODKdPMDQ~j$BF;P-$BdZ4yF(I1g&#l^|a}dN5SJP(K;c#Js|1m-S zK~0M8#dX>wfGD_)E4>>e7t9k}nz&2@TRaB5mp}~6R;F4kJkG0u#f4BgfNRAzEyo%q zUr!$Fiau8o5HxwOeSK9}2=fRujVm z6ts69s8>gK@DydH|8e`@J!AX~)dHcpvDi3Uh+gpBKhth7=toL6n$Ge96hf)yiRBj2 z$8@V%C#uiY5UxyLs(+66F^{nyf3OCMGcCV;oF|d(xr`JKRJSKN6pGHw9JcPhfq^RV zQz5;Pjr+sSC4>O3C!%62``U!74S3F&LgVWXJdvPYqA!eujdC`Qv4Y=5!u5aY7&X@= zMw;Rm_cTtj03E^oLGa7p-$iA-l=}WTx$7BatIC!wmfq}3~5~l>L6OYFqxb^oKR6@jJ*FBf1T-ZR2L*@MnA@ zR5Qsp%7@!4=QAnKXoBnVWIlelY~P^_Ph>$We_J1QwHiGj-MW(?gOSl6f1o@s#a=;a0=Gs<4e79}T^hCa0F=%3KH(e#Z zR~`pYcYV-jZI{fLp+y#E7eESD_bG>*nOq!Y50JDABLHMg^gCkZ!ks^W-FGPRAF`6yBl1t`hpC!2K{Nmq6D0-2256ux@%jCZRUgVQ$J z!me#1l7Z(6wg63=)STw%wX;S;Qi<+)1kacOC3GwPgr)5K9d`mwp(r=fUH>(F;{q)= z(EIe~ZHC(1REJ0?UZknBHv#iagQSY=_tpOdBJ8|I!*{+Rl3JxLW7&x{zU@o7DD#{e zt$B^0ihC6s=$ga>h6A>7S+~^7q|DY?MxN05w?VWOQ(A3g8RBqud2>@4pTB*UJ9al7Aa;6Rf-04-F5^ZCE!JvcKJ< RWeEbVvq+cIRi`kw{{wZ4Yd-)0 literal 0 HcmV?d00001 From 678890e1dd8588e71667dc4afe1fcac0779ea4c1 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 2 Oct 2024 10:26:06 -0500 Subject: [PATCH 213/286] feat: Separate mass and volume residuals for output in compositional flow solver (#3364) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 51 ++----------------- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 31 +++++++---- .../CompositionalMultiphaseHybridFVM.cpp | 8 ++- ...rmalCompositionalMultiphaseBaseKernels.hpp | 16 +++--- ...rmalCompositionalMultiphaseBaseKernels.hpp | 20 ++++---- 6 files changed, 50 insertions(+), 78 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 2445d111d26..b2984372dd6 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3149-7884-f97a068 + baseline: integratedTests/baseline_integratedTests-pr3364-7912-d967424 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index a63ce3f58e4..426b3bc7980 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3364( 2024-10-01) +===================== +Separate mass and volume residuals for output in compositional flow solver. Baseline update because of minor numerical diffs. + PR #3149( 2024-09-30) ===================== Added new field "writeCSV" @@ -18,227 +22,182 @@ PR #3338 (2024-09-19) ====================== Updated time-stepping logic. Rebaseline due to new input parameter and minor numerical diffs. - PR #3217 (2024-09-16) ====================== ALM slip and open modes with relative tests. - PR #3318 (2024-09-12) ====================== Modified SeismicityRate poroelastic case. - PR #3322 (2024-09-06) ====================== Print out fracture state for contact model. Rebaseline the corresponding cases. - PR #3302 (2024-09-05) ====================== Added restartcheks to hydrofrac cases and reduced time of cases that were too long. - PR #3135 (2024-09-04) ====================== Temperature dependent single phase thermal conductivity. Rebaseline all thermal cases. - PR #3294 (2024-09-01) ====================== Re-enable enforcement of wave propagation integrated test pass. - PR #3300 (2024-08-28) ====================== Re-enable floating point exceptions. Rebaseline due to minor changing default value of maxRelativeCompDensChange from 1.7976931348623157e+308 to 1.7976931348623157e+208. - PR #3283 (2024-08-22) ====================== Reuse computeSinglePhaseFlux. Rebaseline due to minor numerical diffs. - PR #3249 (2024-08-14) ====================== Two initialization options for poromechanical models. Rebaseline the corresponding cases. - PR #3278 (2024-08-12) ====================== Renamed GEOSX to GEOS in enternal mesh import, so rebaseline to change these names is the baselines. - -PR #3202 (2024-08-03) +202 (2024-08-03) ====================== Acoustic VTI tests needed rebaselining after update in source and receiver location algorithm. - PR #3215 (2024-07-23) ====================== Changed the default value for massCreation and name of the wrapper. - PR #3194 (2024-07-22) ====================== Check pore volume for all element types, also check that default aperture > 0. Rebaseline for modified tests. No real results change. - PR #3213 (2024-07-12) ====================== Added baselines for new tests on Dirichlet boundary conditions for multiphase flow. - PR #3194 (2024-07-10) ====================== Use aperture table in poromechanics with conforming fractures. Rebaseline the corresponding cases. - PR #3006 (2024-07-01) ====================== Added baselines for new tests. Relaxing tolerances for singlePhasePoromechanics_FaultModel_smoke. - PR #3196 (2024-06-28) ====================== Added isLaggingFractureStencilWeightsUpdate to hydrofracture solve. Rebaseline because of the new input. - PR #3177 (2024-06-28) ====================== Added logLevel to TimeHistoryOutput. Rebaseline because of the new input flag. - PR #3181 (2024-06-25) ====================== Decouple debug matrix output from logLevel. Rebaseline because of the new input flag. - PR #3142 (2024-06-20) ====================== Adding output of total strain. Rebaseline because of new inclusion of strain in output. - PR #3170 (2024-06-19) ====================== Fix tutorial example for thermal debonding wellbore problem. Test case modified. - PR #3130 (2024-06-19) ====================== New solver for contact mechanics based on the Augmented Lagrangian Method (ALM). New test case added. - PR #3160 (2024-06-18) ====================== Two experimental options for compositional flow solver. Rebaseline because of the new input flags. - PR #3165 (2024-06-18) ====================== Small bug fix. Rebaseline required due to appearance of useTotalMassEquation in well solver params. No real results change. - PR #3088 (2024-06-17) ====================== Adding temperature-dependent Solid Volumetric Heat Capacity. Rebaseline because of the parameter change in SolidInternalEnergy. - PR #3100 (2024-06-14) ====================== Adding pressure stabilization for single phase poromechanics. - PR #3133 (2024-06-14) ====================== Fix node ordering for faceElements. - PR #3021 (2024-06-13) ====================== Preparatory work for fractures + wells. New test case added. - PR #3152 (2024-06-13) ====================== Some random things. Baseline update because of the new parameter (minScalingFactor). - PR #3138 (2024-06-11) ====================== Properly sync nonlinear solver params for coupled solver. Baseline update mostly due to number of iterations change in baseline files. - PR #3140 (2024-06-11) ====================== Fixed derivative in EzrokhiBrineDensity - PR #3080 (2024-06-07) ===================== Rebaseline after adding viscoelastic wave propagator. - PR #3075 (2024-06-05) ===================== Introduce configuration tolerance. Rebaseline because of the new parameter in NonlinearSolverParameters. - PR #3120 (2024-06-05) ===================== Add missing compositionalMultiphaseFlow tests into ATS and adjust output naming. Rebaseline accordingly. - PR #3113 (2024-06-05) ===================== Add general version updateConfiguration. Rebaseline of some edfm cases is needed. - PR #3050 (2024-05-20) ===================== Spatially varying grain bulk modulus. Rebaseline of all poromechanics cases needed. - PR #3141 (2024-05-28) ===================== Test cashing baselines locally. - PR #3125 (2024-05-16) ===================== Remove field to store pressure gradient cell-wise for solvers that don't need it. - PR #2110 (2024-05-13) ===================== new field to store pressure gradient cell-wise. - PR #3060 (2024-05-13) ====================== Rebaselined after addition of elastic VTI wave propagator. - PR #4950 (2024-05-10) ====================== Added smoke tests for SeismicityRate solver in inducedSeismicity. - PR #3086 (2024-05-09) ====================== Added a presure-dependent permeability model and the transmissibility calculation in the CellElementStencil - PR #3105 (2024-05-08) ====================== Added missing derivative for temperature, hence small numerical diffs in thermal tests results and numeracal behavior - PR #2917 (2024-05-07) ====================== New fields for wellsControls: wellControls1_ConstantMassRate_table, targetMassRate, massDensity, ... - PR #3044 (2024-05-02) ====================== Removed old integratedTests submodule diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 3df15307e80..7e65c07d4aa 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -328,7 +328,7 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN { GEOS_MARK_FUNCTION; - integer constexpr numNorm = 2; // mass balance and energy balance + integer constexpr numNorm = 3; // mass/volume balance and energy balance array1d< real64 > localResidualNorm; array1d< real64 > localResidualNormalizer; localResidualNorm.resize( numNorm ); @@ -381,8 +381,8 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN } else { - real64 subRegionFlowResidualNorm[1]{}; - real64 subRegionFlowResidualNormalizer[1]{}; + real64 subRegionFlowResidualNorm[2]{}; + real64 subRegionFlowResidualNormalizer[2]{}; isothermalCompositionalMultiphaseBaseKernels:: ResidualNormKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( normType, @@ -396,8 +396,12 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN m_nonlinearSolverParameters.m_minNormalizer, subRegionFlowResidualNorm, subRegionFlowResidualNormalizer ); + // mass subRegionResidualNorm[0] = subRegionFlowResidualNorm[0]; subRegionResidualNormalizer[0] = subRegionFlowResidualNormalizer[0]; + // volume + subRegionResidualNorm[1] = subRegionFlowResidualNorm[1]; + subRegionResidualNormalizer[1] = subRegionFlowResidualNormalizer[1]; } // step 2: first reduction across meshBodies/regions/subRegions @@ -420,7 +424,6 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN real64 residualNorm = 0.0; if( m_isThermal ) { - array1d< real64 > globalResidualNorm; globalResidualNorm.resize( numNorm ); if( normType == solverBaseKernels::NormType::Linf ) @@ -433,31 +436,37 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN solverBaseKernels::L2ResidualNormHelper:: computeGlobalNorm( localResidualNorm, localResidualNormalizer, globalResidualNorm ); } - residualNorm = sqrt( globalResidualNorm[0] * globalResidualNorm[0] + globalResidualNorm[1] * globalResidualNorm[1] ); + residualNorm = sqrt( globalResidualNorm[0] * globalResidualNorm[0] + globalResidualNorm[1] * globalResidualNorm[1] + globalResidualNorm[2] * globalResidualNorm[2] ); if( getLogLevel() >= 1 && logger::internal::rank == 0 ) { - std::cout << GEOS_FMT( " ( R{} ) = ( {:4.2e} ) ( Renergy ) = ( {:4.2e} )", - coupledSolverAttributePrefix(), globalResidualNorm[0], globalResidualNorm[1] ); + std::cout << GEOS_FMT( " ( Rmass Rvol ) = ( {:4.2e} {:4.2e} ) ( Renergy ) = ( {:4.2e} )", + globalResidualNorm[0], globalResidualNorm[1], globalResidualNorm[2] ); } } else { - + array1d< real64 > globalResidualNorm; + globalResidualNorm.resize( numNorm - 1 ); if( normType == solverBaseKernels::NormType::Linf ) { - solverBaseKernels::LinfResidualNormHelper::computeGlobalNorm( localResidualNorm[0], residualNorm ); + solverBaseKernels::LinfResidualNormHelper:: + computeGlobalNorm( localResidualNorm, globalResidualNorm ); } else { - solverBaseKernels::L2ResidualNormHelper::computeGlobalNorm( localResidualNorm[0], localResidualNormalizer[0], residualNorm ); + solverBaseKernels::L2ResidualNormHelper:: + computeGlobalNorm( localResidualNorm, localResidualNormalizer, globalResidualNorm ); } + residualNorm = sqrt( globalResidualNorm[0] * globalResidualNorm[0] + globalResidualNorm[1] * globalResidualNorm[1] ); if( getLogLevel() >= 1 && logger::internal::rank == 0 ) { - std::cout << GEOS_FMT( " ( R{} ) = ( {:4.2e} )", coupledSolverAttributePrefix(), residualNorm ); + std::cout << GEOS_FMT( " ( Rmass Rvol ) = ( {:4.2e} {:4.2e} )", + globalResidualNorm[0], globalResidualNorm[1] ); } } + return residualNorm; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index 3eb04d7636b..dc4b75cfa27 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -611,8 +611,8 @@ real64 CompositionalMultiphaseHybridFVM::calculateResidualNorm( real64 const & G [&]( localIndex const, ElementSubRegionBase const & subRegion ) { - real64 subRegionResidualNorm[1]{}; - real64 subRegionResidualNormalizer[1]{}; + real64 subRegionResidualNorm[2]{}; + real64 subRegionResidualNormalizer[2]{}; string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); MultiFluidBase const & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); @@ -640,6 +640,8 @@ real64 CompositionalMultiphaseHybridFVM::calculateResidualNorm( real64 const & G if( normType == solverBaseKernels::NormType::Linf ) { + // take max between mass and volume residual + subRegionResidualNorm[0] = LvArray::math::max( subRegionResidualNorm[0], subRegionResidualNorm[1] ); if( subRegionResidualNorm[0] > localResidualNorm ) { localResidualNorm = subRegionResidualNorm[0]; @@ -647,6 +649,8 @@ real64 CompositionalMultiphaseHybridFVM::calculateResidualNorm( real64 const & G } else { + // sum up mass and volume residual + subRegionResidualNorm[0] = subRegionResidualNorm[0] + subRegionResidualNorm[1]; localResidualNorm += subRegionResidualNorm[0]; localResidualNormalizer += subRegionResidualNormalizer[0]; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp index 0128341058f..f2edf8c99ed 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp @@ -1787,11 +1787,11 @@ class SolutionCheckKernelFactory /** * @class ResidualNormKernel */ -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > +class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > { public: - using Base = solverBaseKernels::ResidualNormKernelBase< 1 >; + using Base = solverBaseKernels::ResidualNormKernelBase< 2 >; using Base::m_minNormalizer; using Base::m_rankOffset; using Base::m_localResidual; @@ -1839,9 +1839,9 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > // step 2: volume residual real64 const valVol = LvArray::math::abs( m_localResidual[stack.localRow + m_numComponents] ) / volumeNormalizer; - if( valVol > stack.localValue[0] ) + if( valVol > stack.localValue[1] ) { - stack.localValue[0] = valVol; + stack.localValue[1] = valVol; } } @@ -1865,8 +1865,8 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > real64 const val = m_localResidual[stack.localRow + m_numComponents] * m_totalDens_n[ei][0]; // we need a mass here, hence the // multiplication - stack.localValue[0] += val * val; - stack.localNormalizer[0] += massNormalizer; + stack.localValue[1] += val * val; + stack.localNormalizer[1] += massNormalizer; } @@ -1918,8 +1918,8 @@ class ResidualNormKernelFactory constitutive::MultiFluidBase const & fluid, constitutive::CoupledSolidBase const & solid, real64 const minNormalizer, - real64 (& residualNorm)[1], - real64 (& residualNormalizer)[1] ) + real64 (& residualNorm)[2], + real64 (& residualNormalizer)[2] ) { arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp index 8f1881d41c2..a27d879c215 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -836,11 +836,11 @@ class SolutionCheckKernelFactory /** * @class ResidualNormKernel */ -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > +class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 3 > { public: - using Base = ResidualNormKernelBase< 2 >; + using Base = ResidualNormKernelBase< 3 >; using Base::m_minNormalizer; using Base::m_rankOffset; using Base::m_localResidual; @@ -913,7 +913,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > real64 const valVol = LvArray::math::abs( m_localResidual[stack.localRow + m_numComponents] ) / volumeNormalizer; if( valVol > stack.localValue[0] ) { - stack.localValue[0] = valVol; + stack.localValue[1] = valVol; } // step 3: energy residual @@ -921,7 +921,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > real64 const valEnergy = LvArray::math::abs( m_localResidual[stack.localRow + m_numComponents + 1] ) / energyNormalizer; if( valEnergy > stack.localValue[1] ) { - stack.localValue[1] = valEnergy; + stack.localValue[2] = valEnergy; } } @@ -945,13 +945,13 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > real64 const valVol = m_localResidual[stack.localRow + m_numComponents] * m_totalDens_n[ei][0]; // we need a mass here, hence the // multiplication - stack.localValue[0] += valVol * valVol; - stack.localNormalizer[0] += massNormalizer; + stack.localValue[1] += valVol * valVol; + stack.localNormalizer[1] += massNormalizer; // step 3: energy residual - stack.localValue[1] += m_localResidual[stack.localRow + m_numComponents + 1] * m_localResidual[stack.localRow + m_numComponents + 1]; - stack.localNormalizer[1] += energyNormalizer; + stack.localValue[2] += m_localResidual[stack.localRow + m_numComponents + 1] * m_localResidual[stack.localRow + m_numComponents + 1]; + stack.localNormalizer[2] += energyNormalizer; } protected: @@ -1015,8 +1015,8 @@ class ResidualNormKernelFactory constitutive::CoupledSolidBase const & solid, constitutive::SolidInternalEnergy const & solidInternalEnergy, real64 const minNormalizer, - real64 (& residualNorm)[2], - real64 (& residualNormalizer)[2] ) + real64 (& residualNorm)[3], + real64 (& residualNormalizer)[3] ) { arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); From 915d82f6b76cd1445a1ab115d919b879356a4671 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Thu, 3 Oct 2024 05:23:41 -0700 Subject: [PATCH 214/286] fix: Remove reference to fem space in kernelBase. (#3358) --- .../elementFormulations/ConformingVirtualElementOrder1.hpp | 4 +++- .../finiteElement/elementFormulations/FiniteElementBase.hpp | 5 ++++- .../H1_Hexahedron_Lagrange1_GaussLegendre2.hpp | 1 + .../elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp | 1 + .../H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp | 1 + .../elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp | 1 + .../elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp | 1 + .../elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp | 1 + .../Qk_Hexahedron_Lagrange_GaussLobatto.hpp | 3 +-- .../finiteElement/kernelInterface/KernelBase.hpp | 2 +- 10 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp index 8577e059ade..b796efa611b 100644 --- a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp @@ -63,7 +63,9 @@ class ConformingVirtualElementOrder1 final : public FiniteElementBase ConformingVirtualElementOrder1() = default; - virtual ~ConformingVirtualElementOrder1() = default; + GEOS_HOST_DEVICE + virtual ~ConformingVirtualElementOrder1() override + {} /** * @struct StackVariables diff --git a/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp b/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp index 7dffa992c05..4ea49bb651f 100644 --- a/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp @@ -57,6 +57,7 @@ class FiniteElementBase * @brief Copy Constructor * @param source The object to copy. */ + GEOS_HOST_DEVICE FiniteElementBase( FiniteElementBase const & source ): #ifdef CALC_FEM_SHAPE_IN_KERNEL m_viewGradN(), @@ -87,7 +88,9 @@ class FiniteElementBase /** * @brief Destructor */ - virtual ~FiniteElementBase() = default; + GEOS_HOST_DEVICE + virtual ~FiniteElementBase() + {} /** * @struct StackVariables diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp index 45f6bea55bb..58a685beda8 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp @@ -93,6 +93,7 @@ class H1_Hexahedron_Lagrange1_GaussLegendre2 final : public FiniteElementBase USING_FINITEELEMENTBASE /** @endcond Doxygen_Suppress */ + GEOS_HOST_DEVICE virtual ~H1_Hexahedron_Lagrange1_GaussLegendre2() override {} diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp index eec58087f6f..da69a72a195 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp @@ -77,6 +77,7 @@ class H1_Pyramid_Lagrange1_Gauss5 final : public FiniteElementBase /// The number of sampling points per element. constexpr static int numSamplingPoints = numSamplingPointsPerDirection * numSamplingPointsPerDirection * numSamplingPointsPerDirection; + GEOS_HOST_DEVICE virtual ~H1_Pyramid_Lagrange1_Gauss5() override {} diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp index 9151e61bde3..71a72025977 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp @@ -62,6 +62,7 @@ class H1_QuadrilateralFace_Lagrange1_GaussLegendre2 final : public FiniteElement /// The number of quadrature points per element. constexpr static localIndex numQuadraturePoints = 4; + GEOS_HOST_DEVICE virtual ~H1_QuadrilateralFace_Lagrange1_GaussLegendre2() override {} diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp index 92d7019857c..8ab7b85b244 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp @@ -68,6 +68,7 @@ class H1_Tetrahedron_Lagrange1_Gauss1 final : public FiniteElementBase /// The number of sampling points per element. constexpr static int numSamplingPoints = numSamplingPointsPerDirection * numSamplingPointsPerDirection * numSamplingPointsPerDirection; + GEOS_HOST_DEVICE virtual ~H1_Tetrahedron_Lagrange1_Gauss1() override {} diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp index 6a48e79e7bd..47ed48f9b3d 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp @@ -62,6 +62,7 @@ class H1_TriangleFace_Lagrange1_Gauss1 final : public FiniteElementBase /// The number of quadrature points per element. constexpr static localIndex numQuadraturePoints = 1; + GEOS_HOST_DEVICE virtual ~H1_TriangleFace_Lagrange1_Gauss1() override {} diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp index fe349c4c393..f74a2979296 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp @@ -74,6 +74,7 @@ class H1_Wedge_Lagrange1_Gauss6 final : public FiniteElementBase /// The number of sampling points per element. constexpr static int numSamplingPoints = numSamplingPointsPerDirection * numSamplingPointsPerDirection * numSamplingPointsPerDirection; + GEOS_HOST_DEVICE virtual ~H1_Wedge_Lagrange1_Gauss6() override {} diff --git a/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp b/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp index a218ad7d4b7..2290c28456a 100644 --- a/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp @@ -122,8 +122,7 @@ class Qk_Hexahedron_Lagrange_GaussLobatto final : public FiniteElementBase USING_FINITEELEMENTBASE /** @endcond Doxygen_Suppress */ - virtual ~Qk_Hexahedron_Lagrange_GaussLobatto() override - {} + ~Qk_Hexahedron_Lagrange_GaussLobatto() = default; GEOS_HOST_DEVICE virtual localIndex getNumQuadraturePoints() const override diff --git a/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp index 5670dcffa1f..eaa4f66a1c4 100644 --- a/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp @@ -265,7 +265,7 @@ class KernelBase /// The finite element space/discretization object for the element type in /// the SUBREGION_TYPE. - FE_TYPE const & m_finiteElementSpace; + FE_TYPE const m_finiteElementSpace; }; /** From a493b12c5c2fe6cd456a57d33d1908853befc573 Mon Sep 17 00:00:00 2001 From: Ryan Aronson Date: Fri, 4 Oct 2024 19:37:59 +0200 Subject: [PATCH 215/286] fix: add proper labels when registering strain wrapper (#3373) --- .../solidMechanics/SolidMechanicsLagrangianFEM.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 5794878d59e..0ad7c46f776 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -147,6 +147,8 @@ SolidMechanicsLagrangianFEM::~SolidMechanicsLagrangianFEM() void SolidMechanicsLagrangianFEM::registerDataOnMesh( Group & meshBodies ) { + string const voightLabels[6] = { "XX", "YY", "ZZ", "YZ", "XZ", "XY" }; + forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, MeshLevel & meshLevel, arrayView1d< string const > const & regionNames ) @@ -158,7 +160,7 @@ void SolidMechanicsLagrangianFEM::registerDataOnMesh( Group & meshBodies ) { setConstitutiveNamesCallSuper( subRegion ); - subRegion.registerField< solidMechanics::strain >( getName() ).reference().resizeDimension< 1 >( 6 ); + subRegion.registerField< solidMechanics::strain >( getName() ).setDimLabels( 1, voightLabels ).reference().resizeDimension< 1 >( 6 ); } ); NodeManager & nodes = meshLevel.getNodeManager(); From 769dd04a5ceda609868e4675e84241278b1ea1eb Mon Sep 17 00:00:00 2001 From: acitrain <60715545+acitrain@users.noreply.github.com> Date: Mon, 7 Oct 2024 15:13:22 +0200 Subject: [PATCH 216/286] feat: Add freeOnDevice calls on Wave Propagation Solvers (#2610) * Add freeOnDevice calls * Update LvArray submodule * Revert "Update LvArray submodule" This reverts commit bb15aaec4005844cea3f1f4afae9ed7a680decba. * Update LvArray submodule * add FreeOnDevice for Array * adding freeOnDevice for wavePropagation sovlers * add freeOnDevice function to AcousticFirstOrderWaveEquationSEM * udpate LvArray version * added freeOnDevice calls to all other wave solvers * uncrustify --------- Co-authored-by: Stefano Frambati Co-authored-by: Jie Meng Co-authored-by: j0405284 --- .../AcousticFirstOrderWaveEquationSEM.cpp | 14 +++++++++++++- .../anisotropic/AcousticVTIWaveEquationSEM.cpp | 13 +++++++++++++ .../isotropic/AcousticWaveEquationSEM.cpp | 13 +++++++++++++ .../isotropic/ElasticFirstOrderWaveEquationSEM.cpp | 13 +++++++++++++ .../isotropic/ElasticWaveEquationSEM.cpp | 13 +++++++++++++ 5 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 304d89a43e1..39b2334d532 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -251,8 +251,20 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev m_timeSourceDelay, m_rickerOrder ); } ); + elementSubRegion.faceList().freeOnDevice(); + baseMesh.getElemManager().getRegion( regionIndex ).getSubRegion< CellElementSubRegion >( esr ).nodeList().freeOnDevice(); + elementSubRegion.getElementCenter().freeOnDevice(); + elementSubRegion.ghostRank().freeOnDevice(); + elementSubRegion.localToGlobalMap().freeOnDevice(); } ); - + baseMesh.getNodeManager().localToGlobalMap().freeOnDevice(); + baseMesh.getNodeManager().elementList().toView().freeOnDevice(); + baseMesh.getFaceManager().nodeList().toView().freeOnDevice(); + baseMesh.getNodeManager().referencePosition().freeOnDevice(); + m_sourceCoordinates.freeOnDevice(); + m_receiverCoordinates.freeOnDevice(); + facesToNodes.freeOnDevice(); + nodesToElements.freeOnDevice(); } void AcousticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGroups() diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index e3360243dc9..edf012c68d8 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -202,7 +202,20 @@ void AcousticVTIWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & ba m_timeSourceDelay, m_rickerOrder ); } ); + elementSubRegion.faceList().freeOnDevice(); + baseMesh.getElemManager().getRegion( er ).getSubRegion< CellElementSubRegion >( esr ).nodeList().freeOnDevice(); + elementSubRegion.getElementCenter().freeOnDevice(); + elementSubRegion.ghostRank().freeOnDevice(); + elementSubRegion.localToGlobalMap().freeOnDevice(); } ); + baseMesh.getNodeManager().localToGlobalMap().freeOnDevice(); + baseMesh.getNodeManager().elementList().toView().freeOnDevice(); + baseMesh.getFaceManager().nodeList().toView().freeOnDevice(); + baseMesh.getNodeManager().referencePosition().freeOnDevice(); + m_sourceCoordinates.freeOnDevice(); + m_receiverCoordinates.freeOnDevice(); + facesToNodes.freeOnDevice(); + nodesToElements.freeOnDevice(); } void AcousticVTIWaveEquationSEM::addSourceToRightHandSide( integer const & cycleNumber, arrayView1d< real32 > const rhs ) diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 26f30ddfbda..6e1852d0a55 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -211,7 +211,20 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseM m_rickerOrder ); } } ); + elementSubRegion.faceList().freeOnDevice(); + baseMesh.getElemManager().getRegion( er ).getSubRegion< CellElementSubRegion >( esr ).nodeList().freeOnDevice(); + elementSubRegion.getElementCenter().freeOnDevice(); + elementSubRegion.ghostRank().freeOnDevice(); + elementSubRegion.localToGlobalMap().freeOnDevice(); } ); + baseMesh.getNodeManager().localToGlobalMap().freeOnDevice(); + baseMesh.getNodeManager().elementList().toView().freeOnDevice(); + baseMesh.getFaceManager().nodeList().toView().freeOnDevice(); + baseMesh.getNodeManager().referencePosition().freeOnDevice(); + m_sourceCoordinates.freeOnDevice(); + m_receiverCoordinates.freeOnDevice(); + facesToNodes.freeOnDevice(); + nodesToElements.freeOnDevice(); } void AcousticWaveEquationSEM::addSourceToRightHandSide( integer const & cycleNumber, arrayView1d< real32 > const rhs ) diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index e4ba67351ce..ff99332815d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -303,7 +303,20 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve m_timeSourceDelay, m_rickerOrder ); } ); + elementSubRegion.faceList().freeOnDevice(); + baseMesh.getElemManager().getRegion( regionIndex ).getSubRegion< CellElementSubRegion >( esr ).nodeList().freeOnDevice(); + elementSubRegion.getElementCenter().freeOnDevice(); + elementSubRegion.ghostRank().freeOnDevice(); + elementSubRegion.localToGlobalMap().freeOnDevice(); } ); + baseMesh.getNodeManager().localToGlobalMap().freeOnDevice(); + baseMesh.getNodeManager().elementList().toView().freeOnDevice(); + baseMesh.getFaceManager().nodeList().toView().freeOnDevice(); + baseMesh.getNodeManager().referencePosition().freeOnDevice(); + m_sourceCoordinates.freeOnDevice(); + m_receiverCoordinates.freeOnDevice(); + facesToNodes.freeOnDevice(); + nodesToElements.freeOnDevice(); } void ElasticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGroups() diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index bdae31b1e26..b6e28c5f3d5 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -326,7 +326,20 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMe m_sourceForce, m_sourceMoment ); } ); + elementSubRegion.faceList().freeOnDevice(); + baseMesh.getElemManager().getRegion( er ).getSubRegion< CellElementSubRegion >( esr ).nodeList().freeOnDevice(); + elementSubRegion.getElementCenter().freeOnDevice(); + elementSubRegion.ghostRank().freeOnDevice(); + elementSubRegion.localToGlobalMap().freeOnDevice(); } ); + baseMesh.getNodeManager().localToGlobalMap().freeOnDevice(); + baseMesh.getNodeManager().elementList().toView().freeOnDevice(); + baseMesh.getFaceManager().nodeList().toView().freeOnDevice(); + baseMesh.getNodeManager().referencePosition().freeOnDevice(); + m_sourceCoordinates.freeOnDevice(); + m_receiverCoordinates.freeOnDevice(); + facesToNodes.freeOnDevice(); + nodesToElements.freeOnDevice(); } void ElasticWaveEquationSEM::addSourceToRightHandSide( integer const & cycleNumber, From e601fad71502e0af6b0117af2f8c212ee11ca720 Mon Sep 17 00:00:00 2001 From: Stefano Frambati Date: Fri, 11 Oct 2024 12:26:41 +0200 Subject: [PATCH 217/286] fix: testLifoStorage CI failures (#3387) * temporarily removed offending test * commented test instead of removing, added explanation * uncrustify --- .../common/unitTests/testLifoStorage.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/coreComponents/common/unitTests/testLifoStorage.cpp b/src/coreComponents/common/unitTests/testLifoStorage.cpp index 8c50e8f8f79..f5b260b0b28 100644 --- a/src/coreComponents/common/unitTests/testLifoStorage.cpp +++ b/src/coreComponents/common/unitTests/testLifoStorage.cpp @@ -196,11 +196,16 @@ TEST( LifoStorageTest, LifoStorageBufferOnCUDAlargeAutoSizeBoth ) testLifoStorageBig< parallelDevicePolicy< > >( 1000000, -80, -80, 10 ); } - -TEST( LifoStorageTest, LifoStorageBufferOnCUDANoDeviceBuffer ) -{ - testLifoStorage< local::devicePolicy< 32 > >( 10, 0, 3, 10 ); -} +// The following test is disabled for now, as it produces a random assertion error +// that affects the current CI (see issue https://github.com/GEOS-DEV/GEOS/issues/3355). +// The error appears randomly on some configurations, and is probably related to the +// size-0 device buffer case that this test covers. This case should not be frequent +// in practise, but the issue should be resolved and the test reactivated as soon as +// a solution is found. +//TEST( LifoStorageTest, LifoStorageBufferOnCUDANoDeviceBuffer ) +//{ +// testLifoStorage< local::devicePolicy< 32 > >( 10, 0, 3, 10 ); +//} TEST( LifoStorageTest, LifoStorageAsyncBufferOnCUDA ) { From 5a978086ff9e8f816f8ee0e2008b06f8cfe2fc6b Mon Sep 17 00:00:00 2001 From: Arnaud DUDES <155963334+arng40@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:17:42 +0200 Subject: [PATCH 218/286] refactor: Log level documentation on SolverBase and children (#3230) Co-authored-by: MelReyCG Co-authored-by: Pavel Tomin --- src/coreComponents/common/CMakeLists.txt | 1 + src/coreComponents/common/logger/Logger.hpp | 18 + .../dataRepository/CMakeLists.txt | 3 + src/coreComponents/dataRepository/Group.cpp | 3 +- src/coreComponents/dataRepository/Group.hpp | 39 +- .../dataRepository/LogLevelsInfo.hpp | 90 +++ .../dataRepository/LogLevelsRegistry.cpp | 43 ++ .../dataRepository/LogLevelsRegistry.hpp | 60 ++ .../physicsSolvers/CMakeLists.txt | 3 +- .../physicsSolvers/LogLevelsInfo.hpp | 99 +++ .../physicsSolvers/SolverBase.cpp | 129 ++-- .../physicsSolvers/SolverBase.hpp | 9 +- .../physicsSolvers/contact/CMakeLists.txt | 1 + .../contact/ContactSolverBase.cpp | 1 + .../physicsSolvers/contact/LogLevelsInfo.hpp | 51 ++ ...lidMechanicsAugmentedLagrangianContact.cpp | 15 +- .../contact/SolidMechanicsLagrangeContact.cpp | 14 +- .../physicsSolvers/fluidFlow/CMakeLists.txt | 2 + .../fluidFlow/CompositionalMultiphaseBase.cpp | 27 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 37 +- .../CompositionalMultiphaseStatistics.cpp | 70 +- .../fluidFlow/FlowSolverBase.cpp | 8 +- .../fluidFlow/LogLevelsInfo.hpp | 57 ++ .../ReactiveCompositionalMultiphaseOBL.cpp | 5 +- .../fluidFlow/SinglePhaseBase.cpp | 8 +- .../fluidFlow/SinglePhaseFVM.cpp | 13 +- .../fluidFlow/SinglePhaseStatistics.cpp | 32 +- .../wells/CompositionalMultiphaseWell.cpp | 30 +- .../fluidFlow/wells/LogLevelsInfo.hpp | 57 ++ .../fluidFlow/wells/SinglePhaseWell.cpp | 7 +- .../fluidFlow/wells/WellControls.cpp | 6 +- .../fluidFlow/wells/WellSolverBase.cpp | 4 + .../multiphysics/CMakeLists.txt | 1 + ...mpositionalMultiphaseReservoirAndWells.cpp | 16 +- .../multiphysics/CoupledSolver.hpp | 17 +- .../FlowProppantTransportSolver.cpp | 6 +- .../multiphysics/HydrofractureSolver.cpp | 23 +- .../multiphysics/HydrofractureSolver.hpp | 1 + .../multiphysics/LogLevelsInfo.hpp | 51 ++ .../multiphysics/MultiphasePoromechanics.cpp | 7 +- .../multiphysics/MultiphasePoromechanics.hpp | 1 + .../PoromechanicsInitialization.cpp | 17 +- ...ePhasePoromechanicsConformingFractures.cpp | 6 +- .../solidMechanics/CMakeLists.txt | 3 +- .../solidMechanics/LogLevelsInfo.hpp | 51 ++ .../SolidMechanicsStateReset.cpp | 16 +- .../SolidMechanicsStatistics.cpp | 17 +- .../surfaceGeneration/CMakeLists.txt | 1 + .../EmbeddedSurfaceGenerator.cpp | 6 +- .../surfaceGeneration/LogLevelsInfo.hpp | 63 ++ .../surfaceGeneration/SurfaceGenerator.cpp | 56 +- src/coreComponents/schema/schema.xsd | 607 ++++++++++++++++-- src/coreComponents/schema/schema.xsd.other | 130 ++-- 53 files changed, 1634 insertions(+), 404 deletions(-) create mode 100644 src/coreComponents/dataRepository/LogLevelsInfo.hpp create mode 100644 src/coreComponents/dataRepository/LogLevelsRegistry.cpp create mode 100644 src/coreComponents/dataRepository/LogLevelsRegistry.hpp create mode 100644 src/coreComponents/physicsSolvers/LogLevelsInfo.hpp create mode 100644 src/coreComponents/physicsSolvers/contact/LogLevelsInfo.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/LogLevelsInfo.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp create mode 100644 src/coreComponents/physicsSolvers/multiphysics/LogLevelsInfo.hpp create mode 100644 src/coreComponents/physicsSolvers/solidMechanics/LogLevelsInfo.hpp create mode 100644 src/coreComponents/physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index e384c1d0e5c..32e5a412824 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -16,6 +16,7 @@ set( common_headers GEOS_RAJA_Interface.hpp GeosxMacros.hpp MemoryInfos.hpp + logger/Logger.hpp MpiWrapper.hpp Path.hpp Span.hpp diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index e966df9e9f8..a10c5330b19 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -79,6 +79,21 @@ } \ } while( false ) +/** + * @brief Conditionally log a message on screen on rank 0 without line breaking. + * @param EXP an expression that will be evaluated as a predicate + * @param msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_LOG_RANK_0_IF_NLR( EXP, msg ) \ + do { \ + if( ::geos::logger::internal::rank == 0 && EXP ) \ + { \ + std::ostringstream oss; \ + oss << msg; \ + std::cout << oss.str(); \ + } \ + } while( false ) + /** * @brief Log a message on screen on rank 0. * @param msg a message to log (any expression that can be stream inserted) @@ -456,6 +471,7 @@ * @brief Output messages based on current Group's log level. * @param[in] minLevel minimum log level * @param[in] msg a message to log (any expression that can be stream inserted) + * @deprecated Will be replaced by GEOS_LOG_LEVEL_INFO */ #define GEOS_LOG_LEVEL( minLevel, msg ) GEOS_LOG_IF( this->getLogLevel() >= minLevel, msg ); @@ -463,6 +479,7 @@ * @brief Output messages (only on rank 0) based on current Group's log level. * @param[in] minLevel minimum log level * @param[in] msg a message to log (any expression that can be stream inserted) + * @deprecated Will be replaced by GEOS_LOG_LEVEL_INFO_RANK_0 */ #define GEOS_LOG_LEVEL_RANK_0( minLevel, msg ) GEOS_LOG_RANK_0_IF( this->getLogLevel() >= minLevel, msg ) @@ -470,6 +487,7 @@ * @brief Output messages (with one line per rank) based on current Group's log level. * @param[in] minLevel minimum log level * @param[in] msg a message to log (any expression that can be stream inserted) + * @deprecated Will be replaced by GEOS_LOG_LEVEL_INFO_BY_RANK */ #define GEOS_LOG_LEVEL_BY_RANK( minLevel, msg ) GEOS_LOG_RANK_IF( this->getLogLevel() >= minLevel, msg ) diff --git a/src/coreComponents/dataRepository/CMakeLists.txt b/src/coreComponents/dataRepository/CMakeLists.txt index 70c8a9bf97e..f3e4e82628e 100644 --- a/src/coreComponents/dataRepository/CMakeLists.txt +++ b/src/coreComponents/dataRepository/CMakeLists.txt @@ -11,6 +11,8 @@ set( dataRepository_headers InputFlags.hpp KeyIndexT.hpp KeyNames.hpp + LogLevelsInfo.hpp + LogLevelsRegistry.hpp MappedVector.hpp ObjectCatalog.hpp ReferenceWrapper.hpp @@ -35,6 +37,7 @@ set( dataRepository_sources xmlWrapper.cpp DataContext.cpp GroupContext.cpp + LogLevelsRegistry.cpp WrapperContext.cpp ) set( dependencyList ${parallelDeps} codingUtilities ) diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index c45758eb659..abbf6379fa9 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -50,6 +50,7 @@ Group::Group( string const & name, m_restart_flags( RestartFlags::WRITE_AND_READ ), m_input_flags( InputFlags::INVALID ), m_conduitNode( rootNode[ name ] ), + m_logLevelsRegistry( std::make_unique< LogLevelsRegistry >() ), m_dataContext( std::make_unique< GroupContext >( *this ) ) {} @@ -80,7 +81,6 @@ void Group::deregisterWrapper( string const & name ) m_conduitNode.remove( name ); } - void Group::resize( indexType const newSize ) { forWrappers( [newSize] ( WrapperBase & wrapper ) @@ -245,6 +245,7 @@ void Group::processInputFile( xmlWrapper::xmlNode const & targetNode, void Group::postInputInitializationRecursive() { + m_logLevelsRegistry = nullptr; for( auto const & subGroupIter : m_subGroups ) { subGroupIter.second->postInputInitializationRecursive(); diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index 1a8cb2358cc..3741580fbbb 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -27,6 +27,8 @@ #include "RestartFlags.hpp" #include "Wrapper.hpp" #include "xmlWrapper.hpp" +#include "LogLevelsInfo.hpp" +#include "LogLevelsRegistry.hpp" #include @@ -863,6 +865,16 @@ class Group ///@} //END_SPHINX_INCLUDE_REGISTER_WRAPPER + /** + * @brief Append a levelCondition and a log description to the description of the wrapped object given a log info struct. + * Must be called in constructor. + * @tparam LOG_LEVEL_INFO The log documentation to add. + * @return void if the trait is verified. + */ + template< typename LOG_LEVEL_INFO > + std::enable_if_t< geos::is_log_level_info< LOG_LEVEL_INFO >, void > + addLogLevel(); + /** * @name Schema generation methods */ @@ -1478,7 +1490,9 @@ class Group */ void loadFromConduit(); - /// Enable verbosity input for object + /** + * @deprecated will be remove and replace by addLogLevel + */ void enableLogLevelInput(); /** @@ -1615,6 +1629,8 @@ class Group /// Verbosity flag for group logs integer m_logLevel; + + //END_SPHINX_INCLUDE_02 /// Restart flag for this group... and subsequently all wrappers in this group. @@ -1626,6 +1642,9 @@ class Group /// Reference to the conduit::Node that mirrors this group conduit::Node & m_conduitNode; + // Keep track of log levels & descriptions + std::unique_ptr< LogLevelsRegistry > m_logLevelsRegistry; + /// A DataContext object used to provide contextual information on this Group, /// if it is created from an input XML file, the line or offset in that file. std::unique_ptr< DataContext > m_dataContext; @@ -1712,6 +1731,24 @@ Wrapper< T > & Group::registerWrapper( string const & name, return rval; } +template< typename LOG_LEVEL_INFO > +std::enable_if_t< geos::is_log_level_info< LOG_LEVEL_INFO >, void > +Group::addLogLevel() +{ + GEOS_ERROR_IF( m_logLevelsRegistry == nullptr, "You cannot call addLogLevel after schema generation" ); + + Wrapper< integer > * wrapper = getWrapperPointer< integer >( viewKeyStruct::logLevelString() ); + if( wrapper == nullptr ) + { + wrapper = ®isterWrapper( viewKeyStruct::logLevelString(), &m_logLevel ); + wrapper->setApplyDefaultValue( 0 ); + wrapper->setInputFlag( InputFlags::OPTIONAL ); + } + m_logLevelsRegistry->addEntry( LOG_LEVEL_INFO::getMinLogLevel(), + LOG_LEVEL_INFO::getDescription() ); + wrapper->setDescription( m_logLevelsRegistry->buildLogLevelDescription()); +} + } /* end namespace dataRepository */ } /* end namespace geos */ diff --git a/src/coreComponents/dataRepository/LogLevelsInfo.hpp b/src/coreComponents/dataRepository/LogLevelsInfo.hpp new file mode 100644 index 00000000000..d0b0ee1817d --- /dev/null +++ b/src/coreComponents/dataRepository/LogLevelsInfo.hpp @@ -0,0 +1,90 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LogLevelsInfo.hpp + * This file contains log level information infrastructure and the mecanism to ensure LOG_LEVEL_INFO structure is valid + */ +#ifndef GEOS_COMMON_LOGLEVELSINFO_HPP +#define GEOS_COMMON_LOGLEVELSINFO_HPP + +#include "common/DataTypes.hpp" +#include "common/format/Format.hpp" + +namespace geos +{ + +/** + * @brief Trait used to check whether a LOG_LEVEL_INFO structure is valid. + * @tparam LOG_LEVEL_INFO The log level structure to check. + * + * A log level structure must have this following + * struct LogName + * { + * static constexpr int getMinLogLevel() { return 1; } + * static constexpr std::string_view getDescription() { return "Log level description"; } + * }; + */ +template< typename LOG_LEVEL_INFO > +static constexpr bool is_log_level_info = + std::is_same_v< integer, decltype(LOG_LEVEL_INFO::getMinLogLevel()) > && + std::is_same_v< std::string_view, decltype(LOG_LEVEL_INFO::getDescription()) >; + +/** + * @brief Verify if a log level is active + * @tparam LOG_LEVEL_INFO The structure containing log level information. + * @param level Log level to be checked. + * @return `true` if the log level is active, `false` otherwise. + * @pre `LOG_LEVEL_INFO` must satisfy `logInfo::is_log_level_info`. + * + */ +template< typename LOG_LEVEL_INFO > +std::enable_if_t< is_log_level_info< LOG_LEVEL_INFO >, bool > +isLogLevelActive( integer level ) +{ + return level >= LOG_LEVEL_INFO::getMinLogLevel(); +} + +/** ThOSE 3 macros would replace the ones in Logger.hpp */ +/** + * @brief Output messages based on current Group's log level. + * @param[in] logInfoStruct Strut containing log level desscription + * @param[in] msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_LOG_LEVEL_INFO( logInfoStruct, msg ) GEOS_LOG_IF( isLogLevelActive< logInfoStruct >( this->getLogLevel() ), msg ); + +/** + * @brief Output messages (only on rank 0) based on current Group's log level. + * @param[in] logInfoStruct Strut containing log level desscription + * @param[in] msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_LOG_LEVEL_INFO_RANK_0( logInfoStruct, msg ) GEOS_LOG_RANK_0_IF( isLogLevelActive< logInfoStruct >( this->getLogLevel() ), msg ); + +/** + * @brief Output messages (with one line per rank) based on current Group's log level. + * @param[in] logInfoStruct Strut containing log level desscription + * @param[in] msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_LOG_LEVEL_INFO_BY_RANK( logInfoStruct, msg ) GEOS_LOG_RANK_IF( isLogLevelActive< logInfoStruct >( this->getLogLevel() ), msg ); + +/** + * @brief Output messages (only on rank 0) based on current Group's log level without the line return. + * @param[in] logInfoStruct Strut containing log level desscription + * @param[in] msg a message to log (any expression that can be stream inserted) + */ +#define GEOS_LOG_LEVEL_INFO_RANK_0_NLR( logInfoStruct, msg ) GEOS_LOG_RANK_0_IF_NLR( isLogLevelActive< logInfoStruct >( this->getLogLevel() ), msg ); + +} + +#endif // GEOS_COMMON_LOGLEVELSINFO_HPP diff --git a/src/coreComponents/dataRepository/LogLevelsRegistry.cpp b/src/coreComponents/dataRepository/LogLevelsRegistry.cpp new file mode 100644 index 00000000000..ae3e48ccd72 --- /dev/null +++ b/src/coreComponents/dataRepository/LogLevelsRegistry.cpp @@ -0,0 +1,43 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "LogLevelsRegistry.hpp" + +namespace geos +{ + +void LogLevelsRegistry::addEntry( integer condition, std::string_view description ) +{ + m_logLevelsDescriptions[condition].push_back( string( description ) ); +} + +string LogLevelsRegistry::buildLogLevelDescription() const +{ + std::ostringstream description; + description << "Sets the level of information to write in the standard output (the console typically).\n" + "Level 0 outputs no specific information for this solver. Higher levels require more outputs."; + for( auto const & [logLevel, logDescriptions] : m_logLevelsDescriptions ) + { + description << GEOS_FMT( "\n{}\n", logLevel ); + for( size_t idxDesc = 0; idxDesc < logDescriptions.size(); idxDesc++ ) + { + description << " - " << logDescriptions[idxDesc]; + if( idxDesc != logDescriptions.size() - 1 ) + description << '\n'; + } + } + return description.str(); +} + +} diff --git a/src/coreComponents/dataRepository/LogLevelsRegistry.hpp b/src/coreComponents/dataRepository/LogLevelsRegistry.hpp new file mode 100644 index 00000000000..88b38224cdc --- /dev/null +++ b/src/coreComponents/dataRepository/LogLevelsRegistry.hpp @@ -0,0 +1,60 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LogLevelsRegistry.hpp + */ + +#ifndef GEOS_COMMON_LOGLEVELSREGISTRY_HPP +#define GEOS_COMMON_LOGLEVELSREGISTRY_HPP + +#include "common/DataTypes.hpp" +#include "common/format/Format.hpp" + +namespace geos +{ + +/** + * @brief Keep track of log level documention for a group + */ +class LogLevelsRegistry +{ +public: + + /** + * @brief Add a log description for a wrapper + * @param level The minimum log level + * @param description The description for the log level + */ + void addEntry( integer level, std::string_view description ); + + /** + * @brief Construct the log level string description for a wrapper + * @return The log level string description + */ + string buildLogLevelDescription() const; + +private: + + /** + * @brief Map for building the log level string for each wrapper. + * key : a logLevel condition, values : a set of description for a corresponding loglevel. + */ + std::map< integer, std::vector< std::string > > m_logLevelsDescriptions; + +}; + +} + +#endif diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index ed3ea6de356..6bc42626602 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -6,7 +6,8 @@ set( physicsSolvers_headers SolverBase.hpp SolverBaseKernels.hpp SolverStatistics.hpp - FieldStatisticsBase.hpp ) + FieldStatisticsBase.hpp + LogLevelsInfo.hpp ) # Specify solver sources set( physicsSolvers_sources diff --git a/src/coreComponents/physicsSolvers/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/LogLevelsInfo.hpp new file mode 100644 index 00000000000..a6c75d3e1c6 --- /dev/null +++ b/src/coreComponents/physicsSolvers/LogLevelsInfo.hpp @@ -0,0 +1,99 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LogLevelsInfo.hpp + * This file contains common log level informations for physics solvers + */ + +#ifndef GEOS_PHYSICSSOLVERS_LOGLEVELSINFO_HPP +#define GEOS_PHYSICSSOLVERS_LOGLEVELSINFO_HPP + +#include "common/DataTypes.hpp" + +namespace geos +{ + +namespace logInfo +{ + +/** + * @name Common LogLevels info structures. They must comply with the `is_log_level_info` trait. + */ +///@{ + +/// @cond DO_NOT_DOCUMENT + +struct Fields +{ + static constexpr int getMinLogLevel() { return 2; } + static constexpr std::string_view getDescription() { return "The summary of declared fields and coupling"; } +}; + +struct LineSearch +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Line search information"; } +}; + +struct Solution +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Solution information (scaling, maximum changes, quality check)"; } +}; + +struct Convergence +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Convergence information"; } +}; + +struct TimeStep +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Time step information"; } +}; + +struct LinearSolver +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Linear solver information"; } +}; + +struct NonlinearSolver +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Nonlinear solver information"; } +}; + +struct Timers +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Solver timers information"; } +}; + +struct Initialization +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Initialization information"; } +}; + +/// @endcond +///@} + +} + +} + +#endif // GEOS_PHYSICSSOLVERS_LOGLEVELSINFO_HPP diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index 47212daed32..a41d2fb0401 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -22,6 +22,7 @@ #include "math/interpolation/Interpolation.hpp" #include "common/Timer.hpp" #include "common/Units.hpp" +#include "dataRepository/LogLevelsInfo.hpp" #if defined(GEOS_USE_PYGEOSX) #include "python/PySolverType.hpp" @@ -48,9 +49,6 @@ SolverBase::SolverBase( string const & name, { setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); - // This enables logLevel filtering - enableLogLevelInput(); - // This sets a flag to indicate that this object is going to select the time step size this->setTimesteppingBehavior( ExecutableGroup::TimesteppingBehavior::DeterminesTimeStepSize ); @@ -98,6 +96,15 @@ SolverBase::SolverBase( string const & name, setRestartFlags( RestartFlags::WRITE_AND_READ ). setDescription( "Write matrix, rhs, solution to screen ( = 1) or file ( = 2)." ); + addLogLevel< logInfo::Fields >(); + addLogLevel< logInfo::LineSearch >(); + addLogLevel< logInfo::Solution >(); + addLogLevel< logInfo::Convergence >(); + addLogLevel< logInfo::TimeStep >(); + addLogLevel< logInfo::LinearSolver >(); + addLogLevel< logInfo::NonlinearSolver >(); + addLogLevel< logInfo::Timers >(); + registerGroup( groupKeyStruct::linearSolverParametersString(), &m_linearSolverParameters ); registerGroup( groupKeyStruct::nonlinearSolverParametersString(), &m_nonlinearSolverParameters ); registerGroup( groupKeyStruct::solverStatisticsString(), &m_solverStatistics ); @@ -227,6 +234,10 @@ real64 SolverBase::solverStep( real64 const & time_n, { setupSystem( domain, m_dofManager, m_localMatrix, m_rhs, m_solution ); setSystemSetupTimestamp( meshModificationTimestamp ); + + std::ostringstream oss; + m_dofManager.printFieldInfo( oss ); + GEOS_LOG_LEVEL_INFO( logInfo::Fields, oss.str()) } implicitStepSetup( time_n, dt, domain ); @@ -310,9 +321,10 @@ bool SolverBase::execute( real64 const time_n, } } - if( getLogLevel() >= 1 && dtRemaining > 0.0 ) + if( dtRemaining > 0.0 ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: sub-step = {}, accepted dt = {}, next dt = {}, remaining dt = {}", getName(), subStep, dtAccepted, nextDt, dtRemaining ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, + GEOS_FMT( "{}: sub-step = {}, accepted dt = {}, next dt = {}, remaining dt = {}", getName(), subStep, dtAccepted, nextDt, dtRemaining ) ); } } @@ -364,8 +376,8 @@ real64 SolverBase::setNextDt( real64 const & currentDt, if( ( m_numTimestepsSinceLastDtCut >= 0 ) && ( m_numTimestepsSinceLastDtCut < minTimeStepIncreaseInterval ) ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step size will be kept the same since it's been {} cycles since last cut.", - getName(), m_numTimestepsSinceLastDtCut ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: time-step size will be kept the same since it's been {} cycles since last cut.", + getName(), m_numTimestepsSinceLastDtCut ) ); return currentDt; } @@ -373,36 +385,36 @@ real64 SolverBase::setNextDt( real64 const & currentDt, { if( nextDtNewton > currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be increased based on number of iterations.", - getName() ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: time-step required will be increased based on number of iterations.", + getName() ) ); } else if( nextDtNewton < currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be decreased based on number of iterations.", - getName() ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: time-step required will be decreased based on number of iterations.", + getName() ) ); } else { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be kept the same based on number of iterations.", - getName() ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: time-step required will be kept the same based on number of iterations.", + getName() ) ); } } else // time step size decided based on state change { if( nextDtStateChange > currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be increased based on state change.", - getName())); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: time-step required will be increased based on state change.", + getName())); } else if( nextDtStateChange < currentDt ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be decreased based on state change.", - getName())); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: time-step required will be decreased based on state change.", + getName())); } else { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: time-step required will be kept the same based on state change.", - getName())); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: time-step required will be kept the same based on state change.", + getName())); } } @@ -588,7 +600,7 @@ bool SolverBase::lineSearch( real64 const & time_n, if( !checkSystemSolution( domain, dofManager, solution.values(), localScaleFactor ) ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " Line search {}, solution check failed", lineSearchIteration ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::LineSearch, GEOS_FMT( " Line search {}, solution check failed", lineSearchIteration ) ); continue; } @@ -606,14 +618,11 @@ bool SolverBase::lineSearch( real64 const & time_n, applyBoundaryConditions( time_n, dt, domain, dofManager, localMatrix, localRhs ); rhs.close(); - if( getLogLevel() >= 1 && logger::internal::rank==0 ) - { - std::cout << GEOS_FMT( " Line search @ {:0.3f}: ", cumulativeScale ); - } + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::LineSearch, GEOS_FMT( " Line search @ {:0.3f}: ", cumulativeScale )); // get residual norm residualNorm = calculateResidualNorm( time_n, dt, domain, dofManager, rhs.values() ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " ( R ) = ( {:4.2e} )", residualNorm ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::LineSearch, GEOS_FMT( " ( R ) = ( {:4.2e} )", residualNorm ) ); // if the residual norm is less than the last residual, we can proceed to the // solution step @@ -680,7 +689,7 @@ bool SolverBase::lineSearchWithParabolicInterpolation( real64 const & time_n, if( !checkSystemSolution( domain, dofManager, solution.values(), deltaLocalScaleFactor ) ) { - GEOS_LOG_LEVEL_RANK_0( 1, " Line search " << lineSearchIteration << ", solution check failed" ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::LineSearch, GEOS_FMT( " Line search {}, solution check failed", lineSearchIteration ) ); continue; } @@ -703,14 +712,15 @@ bool SolverBase::lineSearchWithParabolicInterpolation( real64 const & time_n, applyBoundaryConditions( time_n, dt, domain, dofManager, localMatrix, localRhs ); rhs.close(); - if( getLogLevel() >= 1 && logger::internal::rank==0 ) + if( logger::internal::rank==0 ) { - std::cout << GEOS_FMT( " Line search @ {:0.3f}: ", cumulativeScale ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::LineSearch, GEOS_FMT( " Line search @ {:0.3f}: ", cumulativeScale ) ); } // get residual norm residualNormT = calculateResidualNorm( time_n, dt, domain, dofManager, rhs.values() ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " ( R ) = ( {:4.2e} )", residualNormT ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::LineSearch, GEOS_FMT( " ( R ) = ( {:4.2e} )", residualNormT ) ); + ffm = ffT; ffT = residualNormT*residualNormT; @@ -731,8 +741,7 @@ bool SolverBase::lineSearchWithParabolicInterpolation( real64 const & time_n, real64 SolverBase::eisenstatWalker( real64 const newNewtonNorm, real64 const oldNewtonNorm, - LinearSolverParameters::Krylov const & krylovParams, - integer const logLevel ) + LinearSolverParameters::Krylov const & krylovParams ) { real64 normRatio = std::min( newNewtonNorm / oldNewtonNorm, 1.0 ); real64 newKrylovTol = krylovParams.adaptiveGamma * std::pow( normRatio, krylovParams.adaptiveExponent ); @@ -744,11 +753,9 @@ real64 SolverBase::eisenstatWalker( real64 const newNewtonNorm, krylovTol = std::min( krylovTol, krylovParams.weakestTol ); krylovTol = std::max( krylovTol, krylovParams.strongestTol ); - if( logLevel > 0 ) - { - GEOS_LOG_RANK_0( GEOS_FMT( " Adaptive linear tolerance = {:4.2e} (norm ratio = {:4.2e}, old tolerance = {:4.2e}, new tolerance = {:4.2e}, safeguard = {:4.2e})", - krylovTol, normRatio, krylovParams.relTolerance, newKrylovTol, altKrylovTol ) ); - } + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::LinearSolver, + GEOS_FMT( " Adaptive linear tolerance = {:4.2e} (norm ratio = {:4.2e}, old tolerance = {:4.2e}, new tolerance = {:4.2e}, safeguard = {:4.2e})", + krylovTol, normRatio, krylovParams.relTolerance, newKrylovTol, altKrylovTol ) ); return krylovTol; } @@ -813,8 +820,7 @@ real64 SolverBase::nonlinearImplicitStep( real64 const & time_n, { // increment the solver statistics for reporting purposes m_solverStatistics.logOuterLoopIteration(); - - GEOS_LOG_LEVEL_RANK_0( 1, "---------- Configuration did not converge. Testing new configuration. ----------" ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::NonlinearSolver, "---------- Configuration did not converge. Testing new configuration. ----------" ); } } else if( !attemptedSimplestConfiguration ) @@ -844,7 +850,7 @@ real64 SolverBase::nonlinearImplicitStep( real64 const & time_n, // cut timestep, go back to beginning of step and restart the Newton loop stepDt *= dtCutFactor; m_numTimestepsSinceLastDtCut = 0; - GEOS_LOG_LEVEL_RANK_0 ( 1, GEOS_FMT( "New dt = {}", stepDt ) ); + GEOS_LOG_LEVEL_INFO_RANK_0 ( logInfo::TimeStep, GEOS_FMT( "New dt = {}", stepDt ) ); // notify the solver statistics counter that this is a time step cut m_solverStatistics.logTimeStepCut(); @@ -889,7 +895,9 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, for( newtonIter = 0; newtonIter < maxNewtonIter; ++newtonIter ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " Attempt: {:2}, ConfigurationIter: {:2}, NewtonIter: {:2}", dtAttempt, configurationLoopIter, newtonIter ) ); + + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::NonlinearSolver, + GEOS_FMT( " Attempt: {:2}, ConfigurationIter: {:2}, NewtonIter: {:2}", dtAttempt, configurationLoopIter, newtonIter ) ); { Timer timer( m_timers["assemble"] ); @@ -938,7 +946,7 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, // get residual norm residualNorm = calculateResidualNorm( time_n, stepDt, domain, m_dofManager, m_rhs.values() ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " ( R ) = ( {:4.2e} )", residualNorm ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, GEOS_FMT( " ( R ) = ( {:4.2e} )", residualNorm ) ); } // if the residual norm is less than the Newton tolerance we denote that we have @@ -954,9 +962,9 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, if( residualNorm > m_nonlinearSolverParameters.m_maxAllowedResidualNorm ) { string const maxAllowedResidualNormString = NonlinearSolverParameters::viewKeysStruct::maxAllowedResidualNormString(); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " The residual norm is above the {} of {}. Newton loop terminated.", - maxAllowedResidualNormString, - m_nonlinearSolverParameters.m_maxAllowedResidualNorm ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, GEOS_FMT( " The residual norm is above the {} of {}. Newton loop terminated.", + maxAllowedResidualNormString, + m_nonlinearSolverParameters.m_maxAllowedResidualNorm ) ); isNewtonConverged = false; break; } @@ -1000,12 +1008,12 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, { if( m_nonlinearSolverParameters.m_lineSearchAction == NonlinearSolverParameters::LineSearchAction::Attempt ) { - GEOS_LOG_LEVEL_RANK_0( 1, " Line search failed to produce reduced residual. Accepting iteration." ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::LineSearch, " Line search failed to produce reduced residual. Accepting iteration." ); } else if( m_nonlinearSolverParameters.m_lineSearchAction == NonlinearSolverParameters::LineSearchAction::Require ) { // if line search failed, then break out of the main Newton loop. Timestep will be cut. - GEOS_LOG_LEVEL_RANK_0( 1, " Line search failed to produce reduced residual. Exiting Newton Loop." ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::LineSearch, " Line search failed to produce reduced residual. Exiting Newton Loop." ); break; } } @@ -1018,7 +1026,7 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, LinearSolverParameters::Krylov & krylovParams = m_linearSolverParameters.get().krylov; if( krylovParams.useAdaptiveTol ) { - krylovParams.relTolerance = newtonIter > 0 ? eisenstatWalker( residualNorm, lastResidual, krylovParams, m_linearSolverParameters.getLogLevel() ) : krylovParams.weakestTol; + krylovParams.relTolerance = newtonIter > 0 ? eisenstatWalker( residualNorm, lastResidual, krylovParams ) : krylovParams.weakestTol; } // TODO: Trilinos currently requires this, re-evaluate after moving to Tpetra-based solvers @@ -1054,10 +1062,7 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, // Compute the scaling factor for the Newton update scaleFactor = scalingForSystemSolution( domain, m_dofManager, m_solution.values() ); - if( getLogLevel() >= 1 ) - { - GEOS_LOG_RANK_0( GEOS_FMT( " {}: Global solution scaling factor = {}", getName(), scaleFactor ) ); - } + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Global solution scaling factor = {}", getName(), scaleFactor ) ); if( !checkSystemSolution( domain, m_dofManager, m_solution.values(), scaleFactor ) ) { @@ -1294,9 +1299,9 @@ void SolverBase::solveLinearSystem( DofManager const & dofManager, m_linearSolverResult = solver->result(); } - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " Last LinSolve(iter,res) = ( {:3}, {:4.2e} )", - m_linearSolverResult.numIterations, - m_linearSolverResult.residualReduction ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::LinearSolver, GEOS_FMT( " Last LinSolve(iter,res) = ( {:3}, {:4.2e} )", + m_linearSolverResult.numIterations, + m_linearSolverResult.residualReduction ) ); if( params.stopIfError ) { @@ -1378,19 +1383,17 @@ void SolverBase::cleanup( real64 const GEOS_UNUSED_PARAM( time_n ), { m_solverStatistics.outputStatistics(); - if( getLogLevel() > 0 ) + for( auto & timer : m_timers ) { - for( auto & timer : m_timers ) + real64 const time = std::chrono::duration< double >( timer.second ).count(); + real64 const minTime = MpiWrapper::min( time ); + real64 const maxTime = MpiWrapper::max( time ); + if( maxTime > 0 ) { - real64 const time = std::chrono::duration< double >( timer.second ).count(); - real64 const minTime = MpiWrapper::min( time ); - real64 const maxTime = MpiWrapper::max( time ); - if( maxTime > 0 ) - { - GEOS_LOG_RANK_0( GEOS_FMT( "{}: {} time = {} s (min), {} s (max)", getName(), timer.first, minTime, maxTime ) ); - } + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Timers, GEOS_FMT( "{}: {} time = {} s (min), {} s (max)", getName(), timer.first, minTime, maxTime ) ); } } + } Timestamp SolverBase::getMeshModificationTimestamp( DomainPartition & domain ) const diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/SolverBase.hpp index 3003bab3cde..98bd390ef9c 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/SolverBase.hpp @@ -30,6 +30,7 @@ #include "physicsSolvers/NonlinearSolverParameters.hpp" #include "physicsSolvers/LinearSolverParameters.hpp" #include "physicsSolvers/SolverStatistics.hpp" +#include "physicsSolvers/LogLevelsInfo.hpp" #include @@ -935,13 +936,11 @@ class SolverBase : public ExecutableGroup * @param newNewtonNorm Residual norm at current iteration * @param oldNewtonNorm Residual norm at previous iteration * @param krylovParams Linear solver parameters - * @param logLevel Log level * @return Adaptive tolerance recommendation */ - static real64 eisenstatWalker( real64 const newNewtonNorm, - real64 const oldNewtonNorm, - LinearSolverParameters::Krylov const & krylovParams, - integer const logLevel ); + real64 eisenstatWalker( real64 const newNewtonNorm, + real64 const oldNewtonNorm, + LinearSolverParameters::Krylov const & krylovParams ); /** * @brief Get the Constitutive Name object diff --git a/src/coreComponents/physicsSolvers/contact/CMakeLists.txt b/src/coreComponents/physicsSolvers/contact/CMakeLists.txt index 23c4693cedd..c9bf75bec3e 100644 --- a/src/coreComponents/physicsSolvers/contact/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/contact/CMakeLists.txt @@ -15,6 +15,7 @@ set( physicsSolvers_headers contact/SolidMechanicsALMKernelsHelper.hpp contact/SolidMechanicsALMJumpUpdateKernels.hpp contact/SolidMechanicsALMBubbleKernels.hpp + contact/LogLevelsInfo.hpp PARENT_SCOPE ) diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index 185a4c798c9..11d40de0558 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -23,6 +23,7 @@ #include "constitutive/contact/FrictionBase.hpp" #include "mesh/DomainPartition.hpp" #include "mesh/SurfaceElementRegion.hpp" +#include "physicsSolvers/contact/LogLevelsInfo.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "common/GEOS_RAJA_Interface.hpp" diff --git a/src/coreComponents/physicsSolvers/contact/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/contact/LogLevelsInfo.hpp new file mode 100644 index 00000000000..f58f9494b0d --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/LogLevelsInfo.hpp @@ -0,0 +1,51 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LogLevelsInfo.hpp + * This file contains log level informations for contact solvers + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_LOGLEVELSINFO_HPP +#define GEOS_PHYSICSSOLVERS_CONTACT_LOGLEVELSINFO_HPP + +#include "common/DataTypes.hpp" + +namespace geos +{ + +namespace logInfo +{ + +/** + * @name Wells LogLevels info structures. They must comply with the `is_log_level_info` trait. + */ +///@{ + +/// @cond DO_NOT_DOCUMENT + +struct Configuration +{ + static constexpr int getMinLogLevel() { return 2; } + static constexpr std::string_view getDescription() { return "Configuration information"; } +}; + +/// @endcond +///@} + +} + +} + +#endif // GEOS_PHYSICSSOLVERS_CONTACT_LOGLEVELSINFO_HPP diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp index eb9fc81049e..c9e13392126 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -24,6 +24,7 @@ #include "physicsSolvers/contact/SolidMechanicsALMSimultaneousKernels.hpp" #include "physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp" #include "physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp" +#include "physicsSolvers/contact/LogLevelsInfo.hpp" #include "constitutive/ConstitutiveManager.hpp" #include "constitutive/contact/FrictionSelector.hpp" @@ -43,6 +44,8 @@ SolidMechanicsAugmentedLagrangianContact::SolidMechanicsAugmentedLagrangianConta m_faceTypeToFiniteElements["Quadrilateral"] = std::make_unique< finiteElement::H1_QuadrilateralFace_Lagrange1_GaussLegendre2 >(); m_faceTypeToFiniteElements["Triangle"] = std::make_unique< finiteElement::H1_TriangleFace_Lagrange1_Gauss1 >(); + addLogLevel< logInfo::Configuration >(); + // TODO Implement the MGR strategy // Set the default linear solver parameters @@ -903,10 +906,11 @@ bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartit int hasConfigurationConvergedGlobally = (totCondNotConv == 0) ? true : false; - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " ALM convergence summary:" - " converged: {:6} | stick & gn>0: {:6} | compenetration: {:6} | stick & gt>lim: {:6} | tau>tauLim: {:6}\n", - globalCondConv[0], globalCondConv[1], globalCondConv[2], - globalCondConv[3], globalCondConv[4] )); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, + GEOS_FMT( " ALM convergence summary:" + " converged: {:6} | stick & gn>0: {:6} | compenetration: {:6} | stick & gt>lim: {:6} | tau>tauLim: {:6}\n", + globalCondConv[0], globalCondConv[1], globalCondConv[2], + globalCondConv[3], globalCondConv[4] )); if( hasConfigurationConvergedGlobally ) { @@ -1089,8 +1093,7 @@ void SolidMechanicsAugmentedLagrangianContact::updateStickSlipList( DomainPartit this->m_faceTypesToFaceElementsStick[meshName][finiteElementName] = stickList; this->m_faceTypesToFaceElementsSlip[meshName][finiteElementName] = slipList; - GEOS_LOG_LEVEL( 2, - GEOS_FMT( "# stick elements: {}, # slip elements: {}", nStick, nSlip )) + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Configuration, GEOS_FMT( "# stick elements: {}, # slip elements: {}", nStick, nSlip )) } ); } ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 2b66ae59da0..bdb83a14ed6 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -35,6 +35,7 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" // needed to register pressure(_n) #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "physicsSolvers/contact/ContactFields.hpp" +#include "physicsSolvers/contact/LogLevelsInfo.hpp" #include "common/GEOS_RAJA_Interface.hpp" #include "linearAlgebra/utilities/LAIHelperFunctions.hpp" #include "linearAlgebra/solvers/PreconditionerJacobi.hpp" @@ -71,6 +72,8 @@ SolidMechanicsLagrangeContact::SolidMechanicsLagrangeContact( const string & nam setApplyDefaultValue( 1.0 ). setDescription( "It be used to increase the scale of the stabilization entries. A value < 1.0 results in larger entries in the stabilization matrix." ); + addLogLevel< logInfo::Configuration >(); + LinearSolverParameters & linSolParams = m_linearSolverParameters.get(); linSolParams.mgr.strategy = LinearSolverParameters::MGR::StrategyType::lagrangianContactMechanics; linSolParams.mgr.separateComponents = true; @@ -426,10 +429,11 @@ void SolidMechanicsLagrangeContact::computeTolerances( DomainPartition & domain } ); } ); - GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{}: normal displacement tolerance = [{}, {}], sliding tolerance = [{}, {}], normal traction tolerance = [{}, {}]", - this->getName(), minNormalDisplacementTolerance, maxNormalDisplacementTolerance, - minSlidingTolerance, maxSlidingTolerance, - minNormalTractionTolerance, maxNormalTractionTolerance ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Configuration, + GEOS_FMT( "{}: normal displacement tolerance = [{}, {}], sliding tolerance = [{}, {}], normal traction tolerance = [{}, {}]", + this->getName(), minNormalDisplacementTolerance, maxNormalDisplacementTolerance, + minSlidingTolerance, maxSlidingTolerance, + minNormalTractionTolerance, maxNormalTractionTolerance ) ); } void SolidMechanicsLagrangeContact::resetStateToBeginningOfStep( DomainPartition & domain ) @@ -2333,7 +2337,7 @@ bool SolidMechanicsLagrangeContact::updateConfiguration( DomainPartition & domai // and total area of fracture elements totalArea = MpiWrapper::sum( totalArea ); - GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( " {}: changed area {} out of {}", getName(), changedArea, totalArea ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Configuration, GEOS_FMT( " {}: changed area {} out of {}", getName(), changedArea, totalArea ) ); // Assume converged if changed area is below certain fraction of total area return changedArea <= m_nonlinearSolverParameters.m_configurationTolerance * totalArea; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt index 37b41360330..0f9bb90d40e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt @@ -42,6 +42,7 @@ set( physicsSolvers_headers fluidFlow/StencilDataCollection.hpp fluidFlow/ThermalSinglePhaseBaseKernels.hpp fluidFlow/ThermalSinglePhaseFVMKernels.hpp + fluidFlow/LogLevelsInfo.hpp fluidFlow/wells/CompositionalMultiphaseWell.hpp fluidFlow/wells/CompositionalMultiphaseWellFields.hpp fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp @@ -52,6 +53,7 @@ set( physicsSolvers_headers fluidFlow/wells/WellControls.hpp fluidFlow/wells/WellSolverBase.hpp fluidFlow/wells/WellSolverBaseFields.hpp + fluidFlow/wells/LogLevelsInfo.hpp PARENT_SCOPE ) # Specify solver sources diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index a8d6f99ecec..24bfc0dbff0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -2152,23 +2152,23 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnStateChange( real64 const & maxRelativePresChange = MpiWrapper::max( maxRelativePresChange ); maxAbsolutePhaseVolFracChange = MpiWrapper::max( maxAbsolutePhaseVolFracChange ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max relative pressure change during time step = {} %", - getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativePresChange, 3 ) ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max absolute phase volume fraction change during time step = {}", - getName(), GEOS_FMT( "{:.{}f}", maxAbsolutePhaseVolFracChange, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: max relative pressure change during time step = {} %", + getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativePresChange, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: max absolute phase volume fraction change during time step = {}", + getName(), GEOS_FMT( "{:.{}f}", maxAbsolutePhaseVolFracChange, 3 ) ) ); if( m_targetRelativeCompDensChange < LvArray::NumericLimits< real64 >::max ) { maxRelativeCompDensChange = MpiWrapper::max( maxRelativeCompDensChange ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max relative component density change during time step = {} %", - getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativeCompDensChange, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: max relative component density change during time step = {} %", + getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativeCompDensChange, 3 ) ) ); } if( m_isThermal ) { maxRelativeTempChange = MpiWrapper::max( maxRelativeTempChange ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max relative temperature change during time step = {} %", - getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativeTempChange, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: max relative temperature change during time step = {} %", + getName(), GEOS_FMT( "{:.{}f}", 100*maxRelativeTempChange, 3 ) ) ); } real64 const eps = LvArray::NumericLimits< real64 >::epsilon; @@ -2208,8 +2208,8 @@ real64 CompositionalMultiphaseBase::setNextDtBasedOnCFL( const geos::real64 & cu computeCFLNumbers( domain, currentDt, maxPhaseCFL, maxCompCFL ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max phase CFL number = {}", getName(), maxPhaseCFL ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: max component CFL number = {} ", getName(), maxCompCFL ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: max phase CFL number = {}", getName(), maxPhaseCFL ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "{}: max component CFL number = {} ", getName(), maxCompCFL ) ); return std::min( m_targetFlowCFL * currentDt / maxCompCFL, m_targetFlowCFL * currentDt / maxPhaseCFL ); @@ -2611,7 +2611,8 @@ void CompositionalMultiphaseBase::updateState( DomainPartition & domain ) maxDeltaPhaseVolFrac = MpiWrapper::max( maxDeltaPhaseVolFrac ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max phase volume fraction change = {}", getName(), fmt::format( "{:.{}f}", maxDeltaPhaseVolFrac, 4 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, + GEOS_FMT( " {}: Max phase volume fraction change = {}", getName(), fmt::format( "{:.{}f}", maxDeltaPhaseVolFrac, 4 ) ) ); } bool CompositionalMultiphaseBase::checkSequentialSolutionIncrements( DomainPartition & domain ) const @@ -2619,8 +2620,8 @@ bool CompositionalMultiphaseBase::checkSequentialSolutionIncrements( DomainParti bool isConverged = FlowSolverBase::checkSequentialSolutionIncrements( domain ); string const unit = m_useMass ? "kg/m3" : "mol/m3"; - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max component density change during outer iteration: {} {}", - getName(), fmt::format( "{:.{}f}", m_sequentialCompDensChange, 3 ), unit ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, GEOS_FMT( " {}: Max component density change during outer iteration: {} {}", + getName(), fmt::format( "{:.{}f}", m_sequentialCompDensChange, 3 ), unit ) ); return isConverged && (m_sequentialCompDensChange < m_maxSequentialCompDensChange); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 7e65c07d4aa..d85079eb757 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -438,11 +438,8 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN } residualNorm = sqrt( globalResidualNorm[0] * globalResidualNorm[0] + globalResidualNorm[1] * globalResidualNorm[1] + globalResidualNorm[2] * globalResidualNorm[2] ); - if( getLogLevel() >= 1 && logger::internal::rank == 0 ) - { - std::cout << GEOS_FMT( " ( Rmass Rvol ) = ( {:4.2e} {:4.2e} ) ( Renergy ) = ( {:4.2e} )", - globalResidualNorm[0], globalResidualNorm[1], globalResidualNorm[2] ); - } + GEOS_LOG_LEVEL_INFO_RANK_0_NLR( logInfo::Convergence, GEOS_FMT( " ( Rmass Rvol ) = ( {:4.2e} {:4.2e} ) ( Renergy ) = ( {:4.2e} )", + globalResidualNorm[0], globalResidualNorm[1], globalResidualNorm[2] )); } else { @@ -535,26 +532,26 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d minCompDensScalingFactor = MpiWrapper::min( minCompDensScalingFactor ); string const massUnit = m_useMass ? "kg/m3" : "mol/m3"; - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change = {} Pa (before scaling)", - getName(), GEOS_FMT( "{:.{}f}", maxDeltaPres, 3 ) ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max component density change = {} {} (before scaling)", - getName(), GEOS_FMT( "{:.{}f}", maxDeltaCompDens, 3 ), massUnit ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Max pressure change = {} Pa (before scaling)", + getName(), GEOS_FMT( "{:.{}f}", maxDeltaPres, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Max component density change = {} {} (before scaling)", + getName(), GEOS_FMT( "{:.{}f}", maxDeltaCompDens, 3 ), massUnit ) ); if( m_isThermal ) { maxDeltaTemp = MpiWrapper::max( maxDeltaTemp ); minTempScalingFactor = MpiWrapper::min( minTempScalingFactor ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max temperature change = {} K (before scaling)", - getName(), GEOS_FMT( "{:.{}f}", maxDeltaTemp, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Max temperature change = {} K (before scaling)", + getName(), GEOS_FMT( "{:.{}f}", maxDeltaTemp, 3 ) ) ); } if( m_scalingType == ScalingType::Local ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min pressure scaling factor = {}", getName(), minPresScalingFactor ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min component density scaling factor = {}", getName(), minCompDensScalingFactor ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Min pressure scaling factor = {}", getName(), minPresScalingFactor ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Min component density scaling factor = {}", getName(), minCompDensScalingFactor ) ); if( m_isThermal ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min temperature scaling factor = {}", getName(), minTempScalingFactor ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Min temperature scaling factor = {}", getName(), minTempScalingFactor ) ); } } @@ -627,15 +624,15 @@ bool CompositionalMultiphaseFVM::checkSystemSolution( DomainPartition & domain, numNegTotalDens = MpiWrapper::sum( numNegTotalDens ); if( numNegPres > 0 ) - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Number of negative pressure values: {}, minimum value: {} Pa", - getName(), numNegPres, fmt::format( "{:.{}f}", minPres, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Number of negative pressure values: {}, minimum value: {} Pa", + getName(), numNegPres, fmt::format( "{:.{}f}", minPres, 3 ) ) ); string const massUnit = m_useMass ? "kg/m3" : "mol/m3"; if( numNegDens > 0 ) - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Number of negative component density values: {}, minimum value: {} {}}", - getName(), numNegDens, fmt::format( "{:.{}f}", minDens, 3 ), massUnit ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Number of negative component density values: {}, minimum value: {} {}}", + getName(), numNegDens, fmt::format( "{:.{}f}", minDens, 3 ), massUnit ) ); if( minTotalDens > 0 ) - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Number of negative total density values: {}, minimum value: {} {}}", - getName(), minTotalDens, fmt::format( "{:.{}f}", minDens, 3 ), massUnit ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Number of negative total density values: {}, minimum value: {} {}}", + getName(), minTotalDens, fmt::format( "{:.{}f}", minDens, 3 ), massUnit ) ); return MpiWrapper::min( localCheck ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp index 8240c9b3eaf..c40cd769f20 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp @@ -32,6 +32,7 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/LogLevelsInfo.hpp" namespace geos @@ -60,6 +61,9 @@ CompositionalMultiphaseStatistics::CompositionalMultiphaseStatistics( const stri setApplyDefaultValue( 1e-6 ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Flag to decide whether a phase is considered mobile (when the relperm is above the threshold) or immobile (when the relperm is below the threshold) in metric 2" ); + + addLogLevel< logInfo::CFL >(); + addLogLevel< logInfo::Statistics >(); } void CompositionalMultiphaseStatistics::postInputInitialization() @@ -391,8 +395,8 @@ void CompositionalMultiphaseStatistics::computeRegionStatistics( real64 const ti { regionStatistics.averagePressure = 0.0; regionStatistics.averageTemperature = 0.0; - GEOS_LOG_LEVEL_RANK_0( 1, getName() << ", " << regionNames[i] - << ": Cannot compute average pressure because region pore volume is zero." ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{}, {}: Cannot compute average pressure because region pore volume is zero.", getName(), regionNames[i] ) ); } @@ -406,34 +410,46 @@ void CompositionalMultiphaseStatistics::computeRegionStatistics( real64 const ti } string_view massUnit = units::getSymbol( m_solver->getMassUnit() ); - - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Pressure (min, average, max): {}, {}, {} Pa", - getName(), regionNames[i], time, regionStatistics.minPressure, regionStatistics.averagePressure, regionStatistics.maxPressure ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Delta pressure (min, max): {}, {} Pa", - getName(), regionNames[i], time, regionStatistics.minDeltaPressure, regionStatistics.maxDeltaPressure ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Temperature (min, average, max): {}, {}, {} K", - getName(), regionNames[i], time, regionStatistics.minTemperature, regionStatistics.averageTemperature, regionStatistics.maxTemperature ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Total dynamic pore volume: {} rm^3", - getName(), regionNames[i], time, regionStatistics.totalPoreVolume ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Phase dynamic pore volume: {} rm^3", - getName(), regionNames[i], time, regionStatistics.phasePoreVolume ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Phase mass: {} {}", - getName(), regionNames[i], time, regionStatistics.phaseMass, massUnit ) ); + string statPrefix = GEOS_FMT( "{}, {} (time {} s):", getName(), regionNames[i], time ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Pressure (min, average, max): {}, {}, {} Pa", + statPrefix, regionStatistics.minPressure, regionStatistics.averagePressure, regionStatistics.maxPressure ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Delta pressure (min, max): {}, {} Pa", + statPrefix, regionStatistics.minDeltaPressure, regionStatistics.maxDeltaPressure ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Temperature (min, average, max): {}, {}, {} K", + statPrefix, regionStatistics.minTemperature, regionStatistics.averageTemperature, + regionStatistics.maxTemperature ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Total dynamic pore volume: {} rm^3", + statPrefix, regionStatistics.totalPoreVolume ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Phase dynamic pore volume: {} rm^3", + statPrefix, regionStatistics.phasePoreVolume ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Phase mass: {} {}", + statPrefix, regionStatistics.phaseMass, massUnit ) ); // metric 1: trapping computed with the Land trapping coefficient (similar to Eclipse) - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Trapped phase mass (metric 1): {} {}", - getName(), regionNames[i], time, regionStatistics.trappedPhaseMass, massUnit ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Non-trapped phase mass (metric 1): {} {}", - getName(), regionNames[i], time, nonTrappedPhaseMass, massUnit ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Trapped phase mass (metric 1): {} {}", + statPrefix, regionStatistics.trappedPhaseMass, massUnit ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Non-trapped phase mass (metric 1): {} {}", + statPrefix, nonTrappedPhaseMass, massUnit ) ); // metric 2: immobile phase mass computed with a threshold on relative permeability - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Immobile phase mass (metric 2): {} {}", - getName(), regionNames[i], time, regionStatistics.immobilePhaseMass, massUnit ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Mobile phase mass (metric 2): {} {}", - getName(), regionNames[i], time, mobilePhaseMass, massUnit ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Immobile phase mass (metric 2): {} {}", + statPrefix, regionStatistics.immobilePhaseMass, massUnit ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Mobile phase mass (metric 2): {} {}", + statPrefix, mobilePhaseMass, massUnit ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Component mass: {} {}", - getName(), regionNames[i], time, regionStatistics.componentMass, massUnit ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Component mass: {} {}", + statPrefix, regionStatistics.componentMass, massUnit ) ); if( m_writeCSV > 0 && MpiWrapper::commRank() == 0 ) { @@ -472,8 +488,8 @@ void CompositionalMultiphaseStatistics::computeCFLNumbers( real64 const time, real64 maxPhaseCFL, maxCompCFL; m_solver->computeCFLNumbers( domain, dt, maxPhaseCFL, maxCompCFL ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{} (time {} s): Max phase CFL number: {}", getName(), time, maxPhaseCFL ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{} (time {} s): Max component CFL number: {}", getName(), time, maxCompCFL ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::CFL, GEOS_FMT( "{} (time {} s): Max phase CFL number: {}", getName(), time, maxPhaseCFL ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::CFL, GEOS_FMT( "{} (time {} s): Max component CFL number: {}", getName(), time, maxCompCFL ) ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 5c54deae9b5..041b30899e8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -795,13 +795,13 @@ void FlowSolverBase::updateStencilWeights( DomainPartition & domain ) const bool FlowSolverBase::checkSequentialSolutionIncrements( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) const { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change during outer iteration: {} Pa", - getName(), fmt::format( "{:.{}f}", m_sequentialPresChange, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, GEOS_FMT( " {}: Max pressure change during outer iteration: {} Pa", + getName(), fmt::format( "{:.{}f}", m_sequentialPresChange, 3 ) ) ); if( m_isThermal ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max temperature change during outer iteration: {} K", - getName(), fmt::format( "{:.{}f}", m_sequentialTempChange, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, GEOS_FMT( " {}: Max temperature change during outer iteration: {} K", + getName(), fmt::format( "{:.{}f}", m_sequentialTempChange, 3 ) ) ); } return (m_sequentialPresChange < m_maxSequentialPresChange) && (m_sequentialTempChange < m_maxSequentialTempChange); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/fluidFlow/LogLevelsInfo.hpp new file mode 100644 index 00000000000..cd9f3eb5322 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/LogLevelsInfo.hpp @@ -0,0 +1,57 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LogLevelsInfo.hpp + * This file contains log level informations for flow solvers + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_LOGLEVELSINFO_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_LOGLEVELSINFO_HPP + +#include "common/DataTypes.hpp" + +namespace geos +{ + +namespace logInfo +{ + +/** + * @name Wells LogLevels info structures. They must comply with the `is_log_level_info` trait. + */ +///@{ + +/// @cond DO_NOT_DOCUMENT + +struct CFL +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "CFL information"; } +}; + +struct Statistics +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Print statistics"; } +}; + +/// @endcond +///@} + +} + +} + +#endif // GEOS_PHYSICSSOLVERS_FLUIDFLOW_LOGLEVELSINFO_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index 9442496dc2c..4e7e14b7ac0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -367,10 +367,7 @@ real64 ReactiveCompositionalMultiphaseOBL::calculateResidualNorm( real64 const & real64 const residual = m_useDARTSL2Norm ? MpiWrapper::max( localResidualNorm ) : std::sqrt( MpiWrapper::sum( localResidualNorm ) ); - if( getLogLevel() >= 1 && logger::internal::rank==0 ) - { - std::cout << GEOS_FMT( " ( Rflow ) = ( {:4.2e} )", residual ); - } + GEOS_LOG_LEVEL_INFO_RANK_0_NLR( logInfo::Convergence, GEOS_FMT( " ( Rflow ) = ( {:4.2e} )", residual ) ); return residual; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 05dbc006843..29bb60d7ad2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -1339,8 +1339,8 @@ real64 SinglePhaseBase::scalingForSystemSolution( DomainPartition & domain, scalingFactor = MpiWrapper::min( scalingFactor ); maxDeltaPres = MpiWrapper::max( maxDeltaPres ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max pressure change = {} Pa (before scaling)", - getName(), fmt::format( "{:.{}f}", maxDeltaPres, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Max pressure change = {} Pa (before scaling)", + getName(), fmt::format( "{:.{}f}", maxDeltaPres, 3 ) ) ); return scalingFactor; } @@ -1381,8 +1381,8 @@ bool SinglePhaseBase::checkSystemSolution( DomainPartition & domain, numNegativePressures = MpiWrapper::sum( numNegativePressures ); if( numNegativePressures > 0 ) - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Number of negative pressure values: {}, minimum value: {} Pa", - getName(), numNegativePressures, fmt::format( "{:.{}f}", minPressure, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Number of negative pressure values: {}, minimum value: {} Pa", + getName(), numNegativePressures, fmt::format( "{:.{}f}", minPressure, 3 ) ) ); return (m_allowNegativePressure || numNegativePressures == 0) ? 1 : 0; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index d76de134fd8..c5f10cd5f7f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -228,11 +228,8 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED } residualNorm = sqrt( globalResidualNorm[0] * globalResidualNorm[0] + globalResidualNorm[1] * globalResidualNorm[1] ); - if( getLogLevel() >= 1 && logger::internal::rank == 0 ) - { - std::cout << GEOS_FMT( " ( R{} ) = ( {:4.2e} ) ( Renergy ) = ( {:4.2e} )", - FlowSolverBase::coupledSolverAttributePrefix(), globalResidualNorm[0], globalResidualNorm[1] ); - } + GEOS_LOG_LEVEL_INFO_RANK_0_NLR( logInfo::Convergence, GEOS_FMT( " ( R{} ) = ( {:4.2e} ) ( Renergy ) = ( {:4.2e} )", + FlowSolverBase::coupledSolverAttributePrefix(), globalResidualNorm[0], globalResidualNorm[1] )); } else { @@ -246,10 +243,8 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED solverBaseKernels::L2ResidualNormHelper::computeGlobalNorm( localResidualNorm[0], localResidualNormalizer[0], residualNorm ); } - if( getLogLevel() >= 1 && logger::internal::rank == 0 ) - { - std::cout << GEOS_FMT( " ( R{} ) = ( {:4.2e} )", FlowSolverBase::coupledSolverAttributePrefix(), residualNorm ); - } + GEOS_LOG_LEVEL_INFO_RANK_0_NLR( logInfo::Convergence, + GEOS_FMT( " ( R{} ) = ( {:4.2e} )", FlowSolverBase::coupledSolverAttributePrefix(), residualNorm )); } return residualNorm; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp index 4a54f7f3ab1..44be8ac53ac 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp @@ -25,6 +25,7 @@ #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/LogLevelsInfo.hpp" namespace geos { @@ -35,7 +36,9 @@ using namespace dataRepository; SinglePhaseStatistics::SinglePhaseStatistics( const string & name, Group * const parent ): Base( name, parent ) -{} +{ + addLogLevel< logInfo::Statistics >(); +} void SinglePhaseStatistics::registerDataOnMesh( Group & meshBodies ) { @@ -247,16 +250,23 @@ void SinglePhaseStatistics::computeRegionStatistics( real64 const time, GEOS_WARNING( GEOS_FMT( "{}, {}: Cannot compute average pressure & temperature because region pore volume is zero.", getName(), regionNames[i] ) ); } - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Pressure (min, average, max): {}, {}, {} Pa", - getName(), regionNames[i], time, regionStatistics.minPressure, regionStatistics.averagePressure, regionStatistics.maxPressure ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Delta pressure (min, max): {}, {} Pa", - getName(), regionNames[i], time, regionStatistics.minDeltaPressure, regionStatistics.maxDeltaPressure ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Temperature (min, average, max): {}, {}, {} K", - getName(), regionNames[i], time, regionStatistics.minTemperature, regionStatistics.averageTemperature, regionStatistics.maxTemperature ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Total dynamic pore volume: {} rm^3", - getName(), regionNames[i], time, regionStatistics.totalPoreVolume ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}, {} (time {} s): Total fluid mass: {} kg", - getName(), regionNames[i], time, regionStatistics.totalMass ) ); + string statPrefix = GEOS_FMT( "{}, {} (time {} s):", getName(), regionNames[i], time ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Pressure (min, average, max): {}, {}, {} Pa", + statPrefix, regionStatistics.minPressure, regionStatistics.averagePressure, regionStatistics.maxPressure ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Delta pressure (min, max): {}, {} Pa", + statPrefix, regionStatistics.minDeltaPressure, regionStatistics.maxDeltaPressure ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Temperature (min, average, max): {}, {}, {} K", + statPrefix, regionStatistics.minTemperature, regionStatistics.averageTemperature, + regionStatistics.maxTemperature ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Total dynamic pore volume: {} rm^3", + statPrefix, regionStatistics.totalPoreVolume ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, + GEOS_FMT( "{} Total fluid mass: {} kg", + statPrefix, regionStatistics.totalMass ) ); if( m_writeCSV > 0 && MpiWrapper::commRank() == 0 ) { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 2ad8b918fd7..d5787ab1b47 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -42,6 +42,7 @@ #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" +#include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" #if defined( __INTEL_COMPILER ) #pragma GCC optimize "O0" @@ -1336,8 +1337,8 @@ CompositionalMultiphaseWell::checkSystemSolution( DomainPartition & domain, if( !subRegionData.localMinVal ) { - GEOS_LOG_LEVEL( 1, "Solution is invalid in well " << subRegion.getName() - << " (either a negative pressure or a negative component density was found)." ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, + GEOS_FMT( "Solution is invalid in well {} (either a negative pressure or a negative component density was found)", subRegion.getName()) ); } localCheck = std::min( localCheck, subRegionData.localMinVal ); @@ -1596,9 +1597,9 @@ void CompositionalMultiphaseWell::assemblePressureRelations( real64 const & time { GEOS_MARK_FUNCTION; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & regionNames ) + forDiscretizationOnMeshTargets ( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) { ElementRegionManager const & elemManager = mesh.getElemManager(); @@ -1641,7 +1642,7 @@ void CompositionalMultiphaseWell::assemblePressureRelations( real64 const & time subRegion.getTopWellElementIndex(), m_targetPhaseIndex, wellControls, - time_n + dt, // controls evaluated with BHP/rate of the end of step + time_n + dt, // controls evaluated with BHP/rate of the end of step wellElemDofNumber, wellElemGravCoef, nextWellElemIndex, @@ -1665,25 +1666,26 @@ void CompositionalMultiphaseWell::assemblePressureRelations( real64 const & time if( wellControls.isProducer() ) { wellControls.switchToPhaseRateControl( wellControls.getTargetPhaseRate( timeAtEndOfStep ) ); - GEOS_LOG_LEVEL( 1, "Control switch for well " << subRegion.getName() - << " from BHP constraint to phase volumetric rate constraint" ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::WellControl, + GEOS_FMT( "Control switch for well {} from BHP constraint to phase volumetric rate constraint", subRegion.getName() ) ); } else { wellControls.switchToTotalRateControl( wellControls.getTargetTotalRate( timeAtEndOfStep ) ); - GEOS_LOG_LEVEL( 1, "Control switch for well " << subRegion.getName() - << " from BHP constraint to total volumetric rate constraint" ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::WellControl, + GEOS_FMT( "Control switch for well {} from BHP constraint to total volumetric rate constraint", subRegion.getName()) ); } } else { wellControls.switchToBHPControl( wellControls.getTargetBHP( timeAtEndOfStep ) ); - GEOS_LOG_LEVEL( 1, "Control switch for well " << subRegion.getName() - << " from rate constraint to BHP constraint" ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::WellControl, + GEOS_FMT( "Control switch for well {} from rate constraint to BHP constraint", subRegion.getName() ) ); } } } ); - } ); + } + ); } void CompositionalMultiphaseWell::shutDownWell( real64 const time_n, @@ -1950,4 +1952,4 @@ void CompositionalMultiphaseWell::printRates( real64 const & time_n, } REGISTER_CATALOG_ENTRY( SolverBase, CompositionalMultiphaseWell, string const &, Group * const ) -} // namespace geos +} // namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp new file mode 100644 index 00000000000..9e9b9f20b50 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp @@ -0,0 +1,57 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LogLevelsInfo.hpp + * This file contains log level informations for wells + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_LOGLEVELSINFO_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_LOGLEVELSINFO_HPP + +#include "common/DataTypes.hpp" + +namespace geos +{ + +namespace logInfo +{ + +/** + * @name Wells LogLevels info structures. They must comply with the `is_log_level_info` trait. + */ +///@{ + +/// @cond DO_NOT_DOCUMENT + +struct WellControl +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Well control information"; } +}; + +struct Crossflow +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Crossflow information"; } +}; + +/// @endcond +///@} + +} + +} + +#endif // GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_LOGLEVELSINFO_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index 59c73f57eb9..78a700dcd91 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -35,6 +35,7 @@ #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" +#include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" namespace geos { @@ -521,14 +522,12 @@ void SinglePhaseWell::assemblePressureRelations( real64 const & time_n, if( wellControls.getControl() == WellControls::Control::BHP ) { wellControls.switchToTotalRateControl( wellControls.getTargetTotalRate( timeAtEndOfStep ) ); - GEOS_LOG_LEVEL( 1, "Control switch for well " << subRegion.getName() - << " from BHP constraint to rate constraint" ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::WellControl, GEOS_FMT( "Control switch for well {} from BHP constraint to rate constraint", subRegion.getName()) ); } else { wellControls.switchToBHPControl( wellControls.getTargetBHP( timeAtEndOfStep ) ); - GEOS_LOG_LEVEL( 1, "Control switch for well " << subRegion.getName() - << " from rate constraint to BHP constraint" ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::WellControl, GEOS_FMT( "Control switch for well {} from rate constraint to BHP constraint", subRegion.getName()) ); } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp index a71969ca029..5030a951dd1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp @@ -21,6 +21,8 @@ #include "WellConstants.hpp" #include "dataRepository/InputFlags.hpp" #include "functions/FunctionManager.hpp" +#include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" + namespace geos { @@ -340,8 +342,8 @@ void WellControls::postInputInitialization() else if( m_targetBHP <= 0.0 && m_targetBHPTableName.empty() ) { m_targetBHP = isProducer() ? WellConstants::defaultProducerBHP : WellConstants::defaultInjectorBHP; - GEOS_LOG_LEVEL_RANK_0( 1, "WellControls " << getDataContext() << ": Setting " << viewKeyStruct::targetBHPString() << " to default value " - << m_targetBHP << "." ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::WellControl, + GEOS_FMT( "WellControls {}: Setting {} to default value {}", getDataContext(), viewKeyStruct::targetBHPString(), m_targetBHP )); } // 6.2) Check incoherent information diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index e600b55eb35..2b114b13f70 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -27,6 +27,7 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" #include "fileIO/Outputs/OutputBase.hpp" namespace geos @@ -49,6 +50,9 @@ WellSolverBase::WellSolverBase( string const & name, setApplyDefaultValue( 0 ). setInputFlag( dataRepository::InputFlags::OPTIONAL ). setDescription( "Write rates into a CSV file" ); + + addLogLevel< logInfo::WellControl >(); + addLogLevel< logInfo::Crossflow >(); } Group * WellSolverBase::createChild( string const & childKey, string const & childName ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/CMakeLists.txt b/src/coreComponents/physicsSolvers/multiphysics/CMakeLists.txt index 60408e700ec..89a34cbc276 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/multiphysics/CMakeLists.txt @@ -13,6 +13,7 @@ set( physicsSolvers_headers multiphysics/PoromechanicsInitialization.hpp multiphysics/PoromechanicsFields.hpp multiphysics/PoromechanicsInitialization.hpp + multiphysics/LogLevelsInfo.hpp multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp multiphysics/poromechanicsKernels/PoromechanicsBase.hpp diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index c01984e2908..5853f513231 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -21,6 +21,7 @@ #include "CompositionalMultiphaseReservoirAndWells.hpp" #include "common/TimingMacros.hpp" +#include "dataRepository/LogLevelsInfo.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "mesh/PerforationFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" @@ -30,6 +31,7 @@ #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" +#include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" #include "physicsSolvers/multiphysics/MultiphasePoromechanics.hpp" namespace geos @@ -43,7 +45,9 @@ CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: CompositionalMultiphaseReservoirAndWells( const string & name, Group * const parent ) : Base( name, parent ) -{} +{ + Base::template addLogLevel< logInfo::Crossflow >(); +} template< typename RESERVOIR_SOLVER > CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: @@ -91,7 +95,7 @@ setMGRStrategy() // flow solver here is indeed flow solver, not poromechanics solver if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM ) { - GEOS_LOG_RANK_0( "The poromechanics MGR strategy for hybrid FVM is not implemented" ); + GEOS_ERROR( "The poromechanics MGR strategy for hybrid FVM is not implemented" ); } else { @@ -412,10 +416,10 @@ assembleCouplingTerms( real64 const time_n, globalIndex const totalNumCrossflowPerforations = MpiWrapper::sum( numCrossflowPerforations.get() ); if( totalNumCrossflowPerforations > 0 ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "CompositionalMultiphaseReservoir '{}': Warning! Crossflow detected at {} perforations in well {}" - "To disable crossflow for injectors, you can use the field '{}' in the WellControls '{}' section", - this->getName(), totalNumCrossflowPerforations, subRegion.getName(), - WellControls::viewKeyStruct::enableCrossflowString(), wellControls.getName() ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Crossflow, GEOS_FMT( "CompositionalMultiphaseReservoir '{}': Warning! Crossflow detected at {} perforations in well {}" + "To disable crossflow for injectors, you can use the field '{}' in the WellControls '{}' section", + this->getName(), totalNumCrossflowPerforations, subRegion.getName(), + WellControls::viewKeyStruct::enableCrossflowString(), wellControls.getName() )); } } } ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index 93a5d49c243..ea28f7b8b30 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -22,6 +22,7 @@ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_COUPLEDSOLVER_HPP_ #include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/multiphysics/LogLevelsInfo.hpp" #include @@ -55,6 +56,8 @@ class CoupledSolver : public SolverBase this->getWrapper< string >( SolverBase::viewKeyStruct::discretizationString() ). setInputFlag( dataRepository::InputFlags::FALSE ); + + addLogLevel< logInfo::Coupling >(); } /// deleted copy constructor @@ -88,7 +91,7 @@ class CoupledSolver : public SolverBase getDataContext(), solverName, solverType ), InputError ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: found {} solver named {}", getName(), solver->getCatalogName(), solverName ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Coupling, GEOS_FMT( "{}: found {} solver named {}", getName(), solver->getCatalogName(), solverName ) ); } ); } @@ -479,7 +482,7 @@ class CoupledSolver : public SolverBase // Solve the subproblems nonlinearly forEachArgInTuple( m_solvers, [&]( auto & solver, auto idx ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " Iteration {:2}: {}", iter + 1, solver->getName() ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::NonlinearSolver, GEOS_FMT( " Iteration {:2}: {}", iter + 1, solver->getName() ) ); real64 solverDt = solver->nonlinearImplicitStep( time_n, stepDt, cycleNumber, @@ -530,7 +533,7 @@ class CoupledSolver : public SolverBase { // cut timestep, go back to beginning of step and restart the Newton loop stepDt *= dtCutFactor; - GEOS_LOG_LEVEL_RANK_0 ( 1, GEOS_FMT( "New dt = {}", stepDt ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( "New dt = {}", stepDt ) ); // notify the solver statistics counter that this is a time step cut m_solverStatistics.logTimeStepCut(); @@ -582,11 +585,11 @@ class CoupledSolver : public SolverBase if( params.m_subcyclingOption == 0 ) { - GEOS_LOG_LEVEL_RANK_0( 1, "***** Single Pass solver, no subcycling *****" ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, "***** Single Pass solver, no subcycling *****" ); } else { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " Iteration {:2}: outer-loop convergence check", iter + 1 ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, GEOS_FMT( " Iteration {:2}: outer-loop convergence check", iter + 1 ) ); if( params.sequentialConvergenceCriterion() == NonlinearSolverParameters::SequentialConvergenceCriterion::ResidualNorm ) { @@ -627,7 +630,7 @@ class CoupledSolver : public SolverBase // finally, we perform the convergence check on the multiphysics residual residualNorm = sqrt( residualNorm ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " ( R ) = ( {:4.2e} )", residualNorm ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, GEOS_FMT( " ( R ) = ( {:4.2e} )", residualNorm ) ); isConverged = ( residualNorm < params.m_newtonTol ); } @@ -654,7 +657,7 @@ class CoupledSolver : public SolverBase if( isConverged ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "***** The iterative coupling has converged in {} iteration(s) *****", iter + 1 ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, GEOS_FMT( "***** The iterative coupling has converged in {} iteration(s) *****", iter + 1 ) ); } } return isConverged; diff --git a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp index 6102c209659..b0b07f0c2b0 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp @@ -102,7 +102,7 @@ real64 FlowProppantTransportSolver::sequentiallyCoupledSolverStep( real64 const resetStateToBeginningOfStep( domain ); } - GEOS_LOG_LEVEL_RANK_0( 1, " Iteration: " << iter+1 << ", FlowSolver: " ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::NonlinearSolver, GEOS_FMT( " Iteration: {}, FlowSolver: ", iter+1 ) ); dtReturnTemporary = flowSolver()->nonlinearImplicitStep( time_n, dtReturn, cycleNumber, domain ); @@ -117,11 +117,11 @@ real64 FlowProppantTransportSolver::sequentiallyCoupledSolverStep( real64 const if( fluidNonLinearParams.m_numNewtonIterations <= this->m_nonlinearSolverParameters.m_minIterNewton && iter > 0 ) { m_solverStatistics.logNonlinearIteration(); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "***** The iterative coupling has converged in {} iterations *****", iter ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, GEOS_FMT( "***** The iterative coupling has converged in {} iterations *****", iter ) ); break; } - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " Iteration: {}, Proppant Solver: ", iter+1 ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::NonlinearSolver, GEOS_FMT( " Iteration: {}, Proppant Solver: ", iter+1 ) ); dtReturnTemporary = proppantTransportSolver()->nonlinearImplicitStep( time_n, dtReturn, cycleNumber, domain ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 301eb93de28..dfb47daebbe 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -26,6 +26,8 @@ #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/MultiphasePoromechanics.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" +#include "physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp" +#include "dataRepository/LogLevelsInfo.hpp" #include "mesh/MeshFields.hpp" #include "constitutive/fluid/singlefluid/SingleFluidFields.hpp" @@ -70,6 +72,8 @@ HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ); + Base::template addLogLevel< logInfo::SurfaceGenerator >(); + registerWrapper( viewKeyStruct::isLaggingFractureStencilWeightsUpdateString(), &m_isLaggingFractureStencilWeightsUpdate ). setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ). @@ -362,13 +366,12 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::updateHydraulicApertureAndFrac minHydraulicAperture = MpiWrapper::min( minHydraulicAperture ); maxHydraulicAperture = MpiWrapper::max( maxHydraulicAperture ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max aperture change: {} m, max hydraulic aperture change: {} m", - this->getName(), fmt::format( "{:.{}f}", maxApertureChange, 6 ), fmt::format( "{:.{}f}", maxHydraulicApertureChange, 6 ) ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min aperture: {} m, max aperture: {} m", - this->getName(), fmt::format( "{:.{}f}", minAperture, 6 ), fmt::format( "{:.{}f}", maxAperture, 6 ) ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min hydraulic aperture: {} m, max hydraulic aperture: {} m", - this->getName(), fmt::format( "{:.{}f}", minHydraulicAperture, 6 ), fmt::format( "{:.{}f}", maxHydraulicAperture, 6 ) ) ); - + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Max aperture change: {} m, max hydraulic aperture change: {} m", + this->getName(), fmt::format( "{:.{}f}", maxApertureChange, 6 ), fmt::format( "{:.{}f}", maxHydraulicApertureChange, 6 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Min aperture: {} m, max aperture: {} m", + this->getName(), fmt::format( "{:.{}f}", minAperture, 6 ), fmt::format( "{:.{}f}", maxAperture, 6 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Min hydraulic aperture: {} m, max hydraulic aperture: {} m", + this->getName(), fmt::format( "{:.{}f}", minHydraulicAperture, 6 ), fmt::format( "{:.{}f}", maxHydraulicAperture, 6 ) ) ); } template< typename POROMECHANICS_SOLVER > void HydrofractureSolver< POROMECHANICS_SOLVER >::setupCoupling( DomainPartition const & domain, @@ -918,7 +921,6 @@ real64 HydrofractureSolver< POROMECHANICS_SOLVER >::setNextDt( real64 const & cu nextDt = m_surfaceGenerator->getTimestepRequest() < 1e99 ? m_surfaceGenerator->getTimestepRequest() : currentDt; } - GEOS_LOG_LEVEL_RANK_0( 3, this->getName() << ": nextDt request is " << nextDt ); return nextDt; } template< typename POROMECHANICS_SOLVER > @@ -1110,8 +1112,9 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( D aperture[newElemIndex] = 0; } } - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "New elem index = {:4d} , init aper = {:4.2e}, init press = {:4.2e} ", - newElemIndex, aperture[newElemIndex], fluidPressure[newElemIndex] ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::SurfaceGenerator, + GEOS_FMT( "New elem index = {:4d} , init aper = {:4.2e}, init press = {:4.2e} ", + newElemIndex, aperture[newElemIndex], fluidPressure[newElemIndex] ) ); } ); if( m_newFractureInitializationType == InitializationType::Displacement ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index fd850f65b5f..952415312d7 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -24,6 +24,7 @@ #include "physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" +#include "dataRepository/LogLevelsInfo.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/multiphysics/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/multiphysics/LogLevelsInfo.hpp new file mode 100644 index 00000000000..fb9322e1021 --- /dev/null +++ b/src/coreComponents/physicsSolvers/multiphysics/LogLevelsInfo.hpp @@ -0,0 +1,51 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LogLevelsInfo.hpp + * This file contains log level informations for coupled multiphysics solvers + */ + +#ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_LOGLEVELSINFO_HPP +#define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_LOGLEVELSINFO_HPP + +#include "common/DataTypes.hpp" + +namespace geos +{ + +namespace logInfo +{ + +/** + * @name Wells LogLevels info structures. They must comply with the `is_log_level_info` trait. + */ +///@{ + +/// @cond DO_NOT_DOCUMENT + +struct Coupling +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Coupling information"; } +}; + +/// @endcond +///@} + +} + +} + +#endif // GEOS_PHYSICSSOLVERS_MULTIPHYSICS_LOGLEVELSINFO_HPP diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 476ebc35a94..1f4f06d0db3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -21,6 +21,7 @@ #include "MultiphasePoromechanics.hpp" +#include "dataRepository/LogLevelsInfo.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/solid/PorousSolid.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" @@ -45,7 +46,6 @@ MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::MultiphasePoromechanic Group * const parent ) : Base( name, parent ) { - LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanics; linearSolverParameters.mgr.separateComponents = true; @@ -245,8 +245,9 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateState( Doma maxDeltaPhaseVolFrac = MpiWrapper::max( maxDeltaPhaseVolFrac ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max phase volume fraction change = {}", - this->getName(), GEOS_FMT( "{:.{}f}", maxDeltaPhaseVolFrac, 4 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, + GEOS_FMT( " {}: Max phase volume fraction change = {}", + this->getName(), GEOS_FMT( "{:.{}f}", maxDeltaPhaseVolFrac, 4 ) ) ); } template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index faba8e1b6b0..578df76e3cf 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -41,6 +41,7 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANI using Base::m_stabilizationType; using Base::m_stabilizationRegionNames; using Base::m_stabilizationMultiplier; + using Base::getLogLevel; /** * @brief main constructor for MultiphasePoromechanics Objects diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index e86c9553544..e3849c64519 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -19,17 +19,18 @@ #include "PoromechanicsInitialization.hpp" +#include "events/tasks/TasksManager.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" +#include "physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp" #include "physicsSolvers/multiphysics/MultiphasePoromechanics.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp" #include "physicsSolvers/multiphysics/HydrofractureSolver.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp" #include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" -#include "physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp" -#include "events/tasks/TasksManager.hpp" +#include "physicsSolvers/multiphysics/LogLevelsInfo.hpp" namespace geos { @@ -57,6 +58,8 @@ PoromechanicsInitialization( const string & name, setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( "" ). setDescription( "Name of the solid mechanics statistics" ); + + addLogLevel< logInfo::Initialization >(); } template< typename POROMECHANICS_SOLVER > @@ -107,16 +110,16 @@ execute( real64 const time_n, real64 const eventProgress, DomainPartition & domain ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` is set to perform stress initialization during the next time step(s)", - getName(), time_n, m_poromechanicsSolverName ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Initialization, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` is set to perform stress initialization during the next time step(s)", + getName(), time_n, m_poromechanicsSolverName ) ); m_poromechanicsSolver->setStressInitialization( true ); m_solidMechanicsStateResetTask.execute( time_n, dt, cycleNumber, eventCounter, eventProgress, domain ); m_poromechanicsSolver->execute( time_n, dt, cycleNumber, eventCounter, eventProgress, domain ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` has completed stress initialization", - getName(), time_n + dt, m_poromechanicsSolverName ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Initialization, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` has completed stress initialization", + getName(), time_n + dt, m_poromechanicsSolverName ) ); m_poromechanicsSolver->setStressInitialization( false ); if( m_solidMechanicsStatistics != nullptr ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 32f5980986e..5991b0fb3b1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -19,6 +19,7 @@ #include "SinglePhasePoromechanicsConformingFractures.hpp" +#include "dataRepository/LogLevelsInfo.hpp" #include "constitutive/solid/PorousSolid.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "linearAlgebra/solvers/BlockPreconditioner.hpp" @@ -81,11 +82,6 @@ void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::setupSystem( Do this->setupDofs( domain, dofManager ); dofManager.reorderByRank(); - if( this->getLogLevel() > 2 ) - { - dofManager.printFieldInfo(); - } - /// 2. Add coupling terms not added by the DofManager. localIndex const numLocalRows = dofManager.numLocalDofs(); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/CMakeLists.txt b/src/coreComponents/physicsSolvers/solidMechanics/CMakeLists.txt index ba9d4709fb5..2b0cfeb2233 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/solidMechanics/CMakeLists.txt @@ -1,6 +1,7 @@ # Specify solver headers set( physicsSolvers_headers ${physicsSolvers_headers} + solidMechanics/LogLevelsInfo.hpp solidMechanics/SolidMechanicsFields.hpp solidMechanics/SolidMechanicsLagrangianFEM.hpp solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -33,4 +34,4 @@ set( physicsSolvers_sources solidMechanics/SolidMechanicsStatistics.cpp PARENT_SCOPE ) -#include( solidMechanics/kernels/SolidMechanicsKernels.cmake) \ No newline at end of file +#include( solidMechanics/kernels/SolidMechanicsKernels.cmake) diff --git a/src/coreComponents/physicsSolvers/solidMechanics/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/solidMechanics/LogLevelsInfo.hpp new file mode 100644 index 00000000000..c70c238f6a9 --- /dev/null +++ b/src/coreComponents/physicsSolvers/solidMechanics/LogLevelsInfo.hpp @@ -0,0 +1,51 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LogLevelsInfo.hpp + * This file contains log level informations for flow solvers + */ + +#ifndef GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_LOGLEVELSINFO_HPP +#define GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_LOGLEVELSINFO_HPP + +#include "common/DataTypes.hpp" + +namespace geos +{ + +namespace logInfo +{ + +/** + * @name Wells LogLevels info structures. They must comply with the `is_log_level_info` trait. + */ +///@{ + +/// @cond DO_NOT_DOCUMENT + +struct Statistics +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Print statistics"; } +}; + +/// @endcond +///@} + +} + +} + +#endif // GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_LOGLEVELSINFO_HPP diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index 8df7ee28d80..6c35edca982 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -21,6 +21,7 @@ #include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" +#include "physicsSolvers/LogLevelsInfo.hpp" #include "mesh/DomainPartition.hpp" namespace geos @@ -51,6 +52,8 @@ SolidMechanicsStateReset::SolidMechanicsStateReset( const string & name, setApplyDefaultValue( false ). setInputFlag( InputFlags::OPTIONAL ). setDescription( "Flag to enable/disable inelastic behavior" ); + + addLogLevel< logInfo::Initialization >(); } SolidMechanicsStateReset::~SolidMechanicsStateReset() @@ -83,8 +86,9 @@ bool SolidMechanicsStateReset::execute( real64 const time_n, // Option 1: zero out velocity, incremental displacement, and displacement if( m_resetDisplacements ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` is resetting total displacement and velocity to zero", - getName(), time_n, m_solidSolverName ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Initialization, + GEOS_FMT( "Task `{}`: at time {}s, physics solver `{}` is resetting total displacement and velocity to zero", + getName(), time_n, m_solidSolverName ) ); NodeManager & nodeManager = mesh.getNodeManager(); @@ -105,10 +109,10 @@ bool SolidMechanicsStateReset::execute( real64 const time_n, string const & solidMaterialName = subRegion.getReference< string >( SolidMechanicsLagrangianFEM::viewKeyStruct::solidMaterialNamesString() ); Group & constitutiveModels = subRegion.getGroup( ElementSubRegionBase::groupKeyStruct::constitutiveModelsString() ); - GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "Task `{}`: at time {}s, solid model `{}` is setting inelastic behavior to `{}` on subRegion `{}`. ", - getName(), time_n, solidMaterialName, - m_disableInelasticity ? "OFF" : "ON", - subRegion.getName() ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Initialization, GEOS_FMT( "Task `{}`: at time {}s, solid model `{}` is setting inelastic behavior to `{}` on subRegion `{}`. ", + getName(), time_n, solidMaterialName, + m_disableInelasticity ? "OFF" : "ON", + subRegion.getName() ) ); SolidBase & constitutiveRelation = constitutiveModels.getGroup< SolidBase >( solidMaterialName ); constitutiveRelation.disableInelasticity( m_disableInelasticity ); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp index 578c9c82ee6..01b0073205f 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp @@ -25,6 +25,7 @@ #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "fileIO/Outputs/OutputBase.hpp" #include "mesh/DomainPartition.hpp" +#include "physicsSolvers/solidMechanics/LogLevelsInfo.hpp" namespace geos { @@ -36,7 +37,9 @@ using namespace fields; SolidMechanicsStatistics::SolidMechanicsStatistics( const string & name, Group * const parent ): Base( name, parent ) -{} +{ + addLogLevel< logInfo::Statistics >(); +} void SolidMechanicsStatistics::registerDataOnMesh( Group & meshBodies ) { @@ -152,12 +155,12 @@ void SolidMechanicsStatistics::computeNodeStatistics( MeshLevel & mesh, real64 c MpiWrapper::getMpiOp( MpiWrapper::Reduction::Min ), MPI_COMM_GEOS ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{} (time {} s): Min displacement (X, Y, Z): {}, {}, {} m", - getName(), time, nodeStatistics.minDisplacement[0], - nodeStatistics.minDisplacement[1], nodeStatistics.minDisplacement[2] ) ); - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{} (time {} s): Max displacement (X, Y, Z): {}, {}, {} m", - getName(), time, nodeStatistics.maxDisplacement[0], - nodeStatistics.maxDisplacement[1], nodeStatistics.maxDisplacement[2] ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, GEOS_FMT( "{} (time {} s): Min displacement (X, Y, Z): {}, {}, {} m", + getName(), time, nodeStatistics.minDisplacement[0], + nodeStatistics.minDisplacement[1], nodeStatistics.minDisplacement[2] ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, GEOS_FMT( "{} (time {} s): Max displacement (X, Y, Z): {}, {}, {} m", + getName(), time, nodeStatistics.maxDisplacement[0], + nodeStatistics.maxDisplacement[1], nodeStatistics.maxDisplacement[2] ) ); if( m_writeCSV > 0 && MpiWrapper::commRank() == 0 ) { diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt b/src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt index ede9eacf734..9bcfd8fdc9b 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt @@ -6,6 +6,7 @@ set( physicsSolvers_headers surfaceGeneration/ParallelTopologyChange.hpp surfaceGeneration/SurfaceGenerator.hpp surfaceGeneration/SurfaceGeneratorFields.hpp + surfaceGeneration/LogLevelsInfo.hpp surfaceGeneration/kernels/surfaceGenerationKernels.hpp surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp PARENT_SCOPE ) diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp index 0bc16f129e0..7b13c4618d5 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp @@ -36,7 +36,7 @@ #include "mesh/simpleGeometricObjects/GeometricObjectManager.hpp" #include "mesh/simpleGeometricObjects/Rectangle.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" - +#include "physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp" namespace geos @@ -191,7 +191,7 @@ void EmbeddedSurfaceGenerator::initializePostSubGroups() if( added ) { - GEOS_LOG_LEVEL_RANK_0( 2, "Element " << cellIndex << " is fractured" ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::SurfaceGenerator, "Element " << cellIndex << " is fractured" ); // Add the information to the CellElementSubRegion subRegion.addFracturedElement( cellIndex, localNumberOfSurfaceElems ); @@ -353,7 +353,7 @@ void EmbeddedSurfaceGenerator::setGlobalIndices( ElementRegionManager & elemMana totalNumberOfSurfaceElements += numberOfSurfaceElemsPerRank[rank]; } - GEOS_LOG_LEVEL_RANK_0( 1, "Number of embedded surface elements: " << totalNumberOfSurfaceElements ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::SurfaceGenerator, "Number of embedded surface elements: " << totalNumberOfSurfaceElements ); arrayView1d< globalIndex > const & elemLocalToGlobal = embeddedSurfaceSubRegion.localToGlobalMap(); diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp new file mode 100644 index 00000000000..a3be90fff02 --- /dev/null +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp @@ -0,0 +1,63 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file LogLevelsInfo.hpp + * This file contains log level informations for surface generators + */ + +#ifndef GEOS_PHYSICSSOLVERS_SURFACEGENERATION_LOGLEVELSINFO_HPP +#define GEOS_PHYSICSSOLVERS_SURFACEGENERATION_LOGLEVELSINFO_HPP + +#include "common/DataTypes.hpp" + +namespace geos +{ + +namespace logInfo +{ + +/** + * @name Wells LogLevels info structures. They must comply with the `is_log_level_info` trait. + */ +///@{ + +/// @cond DO_NOT_DOCUMENT + +struct SurfaceGenerator +{ + static constexpr int getMinLogLevel() { return 1; } + static constexpr std::string_view getDescription() { return "Fracture generation information"; } +}; + +struct Mapping +{ + static constexpr int getMinLogLevel() { return 2; } + static constexpr std::string_view getDescription() { return "Mapping information"; } +}; + +struct RuptureRate +{ + static constexpr int getMinLogLevel() { return 3; } + static constexpr std::string_view getDescription() { return "Rupture rate information"; } +}; + +/// @endcond +///@} + +} + +} + +#endif // GEOS_PHYSICSSOLVERS_SURFACEGENERATION_LOGLEVELSINFO_HPP diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index 9bcce6125f0..1c8aed78104 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -32,6 +32,7 @@ #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp" #include "physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp" +#include "physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "kernels/surfaceGenerationKernels.hpp" @@ -220,6 +221,10 @@ SurfaceGenerator::SurfaceGenerator( const string & name, this->getWrapper< string >( viewKeyStruct::discretizationString() ). setInputFlag( InputFlags::FALSE ); + + addLogLevel< logInfo::SurfaceGenerator >(); + addLogLevel< logInfo::Mapping >(); + addLogLevel< logInfo::RuptureRate >(); } void SurfaceGenerator::postInputInitialization() @@ -745,7 +750,7 @@ int SurfaceGenerator::separationDriver( DomainPartition & domain, real64 ruptureRate = calculateRuptureRate( elementManager.getRegion< SurfaceElementRegion >( this->m_fractureRegionName ) ); - GEOS_LOG_LEVEL_RANK_0( 3, "rupture rate is " << ruptureRate ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::RuptureRate, GEOS_FMT( "Rupture rate = {}", ruptureRate ) ); if( ruptureRate > 0 ) m_nextDt = ruptureRate < 1e99 ? m_cflFactor / ruptureRate : 1e99; @@ -1724,14 +1729,13 @@ void SurfaceGenerator::performFracture( const localIndex nodeID, // Split the node into two, using the original index, and a new one. localIndex newNodeIndex; - if( getLogLevel() > 0 ) { std::ostringstream s; for( std::set< localIndex >::const_iterator i=separationPathFaces.begin(); i!=separationPathFaces.end(); ++i ) { s << *i << " "; } - GEOS_LOG_RANK( GEOS_FMT( "Splitting node {} along separation plane faces: {}", nodeID, s.str() ) ); + GEOS_LOG_LEVEL_INFO_BY_RANK( logInfo::SurfaceGenerator, GEOS_FMT( "Splitting node {} along separation plane faces: {}", nodeID, s.str() ) ); } @@ -1770,11 +1774,7 @@ void SurfaceGenerator::performFracture( const localIndex nodeID, // >("usedFaces")[newNodeIndex]; // usedFacesNew = usedFaces[nodeID]; - - if( getLogLevel() > 0 ) - { - GEOS_LOG_RANK( GEOS_FMT( "Done splitting node {} into nodes {} and {}", nodeID, nodeID, newNodeIndex ) ); - } + GEOS_LOG_LEVEL_INFO_BY_RANK( logInfo::SurfaceGenerator, GEOS_FMT( "Done splitting node {} into nodes {} and {}", nodeID, nodeID, newNodeIndex ) ); // split edges map< localIndex, localIndex > splitEdges; @@ -1795,10 +1795,7 @@ void SurfaceGenerator::performFracture( const localIndex nodeID, edgeToFaceMap.clearSet( newEdgeIndex ); - if( getLogLevel() > 0 ) - { - GEOS_LOG_RANK( GEOS_FMT ( "Split edge {} into edges {} and {}", parentEdgeIndex, parentEdgeIndex, newEdgeIndex ) ); - } + GEOS_LOG_LEVEL_INFO_BY_RANK( logInfo::SurfaceGenerator, GEOS_FMT ( "Split edge {} into edges {} and {}", parentEdgeIndex, parentEdgeIndex, newEdgeIndex ) ); splitEdges[parentEdgeIndex] = newEdgeIndex; modifiedObjects.newEdges.insert( newEdgeIndex ); @@ -1854,11 +1851,7 @@ void SurfaceGenerator::performFracture( const localIndex nodeID, if( faceManager.splitObject( faceIndex, rank, newFaceIndex ) ) { - - if( getLogLevel() > 0 ) - { - GEOS_LOG_RANK( GEOS_FMT ( "Split face {} into faces {} and {}", faceIndex, faceIndex, newFaceIndex ) ); - } + GEOS_LOG_LEVEL_INFO_BY_RANK( logInfo::SurfaceGenerator, GEOS_FMT ( "Split face {} into faces {} and {}", faceIndex, faceIndex, newFaceIndex ) ); splitFaces[faceIndex] = newFaceIndex; modifiedObjects.newFaces.insert( newFaceIndex ); @@ -2125,23 +2118,19 @@ void SurfaceGenerator::performFracture( const localIndex nodeID, faceToElementMap[faceIndex][1] = -1; } - if( getLogLevel() > 1 ) - { - GEOS_LOG( " faceToRegionMap["< - + @@ -2267,7 +2278,18 @@ the relative residual norm satisfies: - + @@ -2337,7 +2359,18 @@ the relative residual norm satisfies: - + @@ -2397,7 +2430,18 @@ the relative residual norm satisfies: - + @@ -2451,7 +2495,18 @@ the relative residual norm satisfies: - + @@ -2537,7 +2592,18 @@ the relative residual norm satisfies: - + @@ -2597,7 +2663,20 @@ the relative residual norm satisfies: - + @@ -2619,7 +2698,19 @@ the relative residual norm satisfies: - + @@ -2658,7 +2749,20 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -2779,7 +2883,18 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - + @@ -2839,7 +2954,18 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - + @@ -2889,7 +3015,18 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - + @@ -2913,7 +3050,19 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - + @@ -2941,12 +3090,25 @@ Equal to 1 for surface conditions, and to 0 for reservoir conditions--> - + - + @@ -2969,7 +3131,7 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -2987,7 +3149,18 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3018,7 +3191,19 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3047,7 +3232,20 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3079,7 +3277,18 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3111,7 +3320,19 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3143,7 +3364,18 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3189,7 +3421,18 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3233,7 +3476,18 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3263,7 +3517,18 @@ SourceFluxes application if isThermal is enabled : - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced.--> - + @@ -3299,7 +3564,18 @@ SourceFluxes application if isThermal is enabled : - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced.--> - + @@ -3329,7 +3605,19 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t - + @@ -3362,7 +3650,19 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3391,7 +3691,19 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3417,7 +3729,19 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3446,7 +3770,19 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3478,7 +3814,18 @@ SourceFluxes application if isThermal is enabled : - positive value (production): both the mass balance and the energy balance equations are modified to considered the additional source term. For the energy balance equation, the mass flux is multipied by the enthalpy in the cell from which the fluid is being produced.--> - + @@ -3506,7 +3853,19 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t - + @@ -3528,7 +3887,19 @@ For the energy balance equation, the mass flux is multipied by the enthalpy in t - + @@ -3560,7 +3931,20 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3584,7 +3968,19 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3630,7 +4026,18 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3673,7 +4080,19 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3720,7 +4139,18 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3765,7 +4195,18 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3824,7 +4265,18 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3878,7 +4330,22 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3926,7 +4393,10 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3942,7 +4412,11 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3952,7 +4426,10 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3962,7 +4439,10 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -4046,7 +4526,10 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -4056,7 +4539,10 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -4066,7 +4552,10 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -4076,7 +4565,10 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -4088,7 +4580,10 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -4098,7 +4593,10 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -4108,7 +4606,10 @@ Local- Add jump stabilization on interior of macro elements--> - + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index d59f6b947e5..215191d89f5 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -471,7 +471,7 @@ - + @@ -553,7 +553,7 @@ - + @@ -590,7 +590,7 @@ - + @@ -641,7 +641,7 @@ - + @@ -682,7 +682,7 @@ - + @@ -715,7 +715,7 @@ - + @@ -726,7 +726,7 @@ - + @@ -739,7 +739,7 @@ - + @@ -752,7 +752,7 @@ - + @@ -768,7 +768,7 @@ - + @@ -802,7 +802,7 @@ - + @@ -865,7 +865,7 @@ - + @@ -896,7 +896,7 @@ - + @@ -909,7 +909,7 @@ - + @@ -922,7 +922,7 @@ - + @@ -935,7 +935,7 @@ - + @@ -948,7 +948,7 @@ - + @@ -963,7 +963,7 @@ - + @@ -974,7 +974,7 @@ - + @@ -987,7 +987,7 @@ - + @@ -998,7 +998,7 @@ - + @@ -1009,7 +1009,7 @@ - + @@ -1022,7 +1022,7 @@ - + @@ -1033,7 +1033,7 @@ - + @@ -1044,7 +1044,7 @@ - + @@ -1057,7 +1057,7 @@ - + @@ -1072,7 +1072,7 @@ - + @@ -1087,7 +1087,7 @@ - + @@ -1100,7 +1100,7 @@ - + @@ -1115,7 +1115,7 @@ - + @@ -1126,7 +1126,7 @@ - + @@ -1139,7 +1139,7 @@ - + @@ -1152,7 +1152,7 @@ - + @@ -1168,7 +1168,7 @@ - + @@ -1183,7 +1183,7 @@ - + @@ -1200,7 +1200,7 @@ - + @@ -1217,7 +1217,7 @@ - + @@ -1232,7 +1232,7 @@ - + @@ -1245,7 +1245,7 @@ - + @@ -1284,7 +1284,7 @@ - + @@ -1313,7 +1313,7 @@ - + @@ -1404,7 +1404,7 @@ - + @@ -2958,7 +2958,7 @@ - + @@ -2986,7 +2986,7 @@ - + @@ -3005,11 +3005,11 @@ - + - + @@ -3019,7 +3019,7 @@ - + @@ -3029,11 +3029,11 @@ - + - + @@ -3043,7 +3043,7 @@ - + @@ -3053,7 +3053,7 @@ - + @@ -3063,7 +3063,7 @@ - + @@ -3087,7 +3087,7 @@ - + @@ -3105,7 +3105,7 @@ - + @@ -3117,7 +3117,7 @@ - + @@ -3129,7 +3129,7 @@ - + @@ -3137,11 +3137,11 @@ - + - + @@ -3164,7 +3164,7 @@ - + @@ -3190,7 +3190,7 @@ - + @@ -3211,7 +3211,7 @@ - + @@ -3241,7 +3241,7 @@ - + @@ -3255,7 +3255,7 @@ - + @@ -3282,7 +3282,7 @@ - + @@ -3319,7 +3319,7 @@ - + From 50aa846b01940f282567916a09287d72969fd6d1 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 15 Oct 2024 09:20:47 -0500 Subject: [PATCH 219/286] fix: clarify well messages and fix copy-paste typo (#3390) --- .../fluidFlow/wells/CompositionalMultiphaseWell.cpp | 11 ++++------- .../fluidFlow/wells/SinglePhaseWell.cpp | 8 +++----- .../physicsSolvers/fluidFlow/wells/WellControls.cpp | 10 +++++----- .../multiphysics/CoupledReservoirAndWellsBase.hpp | 4 ++-- 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index d5787ab1b47..ffbef731fcd 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -612,7 +612,7 @@ void CompositionalMultiphaseWell::updateBHPForConstraint( WellElementSubRegion & if( logLevel >= 2 ) { - GEOS_LOG_RANK( GEOS_FMT( "{}: BHP (at the specified reference elevation): {} Pa", + GEOS_LOG_RANK( GEOS_FMT( "{}: BHP (at the specified reference elevation) = {} Pa", wellControlsName, currentBHP ) ); } @@ -777,10 +777,8 @@ void CompositionalMultiphaseWell::updateVolRatesForConstraint( WellElementSubReg if( logLevel >= 2 && useSurfaceConditions ) { - GEOS_LOG_RANK( GEOS_FMT( "{}: The total fluid density at surface conditions is {} {}/sm3. \n" - "The total rate is {} {}/s, which corresponds to a total surface volumetric rate of {} sm3/s", - wellControlsName, totalDens[iwelemRef][0], massUnit, - currentTotalRate, massUnit, currentTotalVolRate ) ); + GEOS_LOG_RANK( GEOS_FMT( "{}: total fluid density at surface conditions = {} {}/sm3, total rate = {} {}/s, total surface volumetric rate = {} sm3/s", + wellControlsName, totalDens[iwelemRef][0], massUnit, currentTotalRate, massUnit, currentTotalVolRate ) ); } // Step 3: update the phase volume rate @@ -816,8 +814,7 @@ void CompositionalMultiphaseWell::updateVolRatesForConstraint( WellElementSubReg if( logLevel >= 2 && useSurfaceConditions ) { - GEOS_LOG_RANK( GEOS_FMT( "{}: The density of phase {} at surface conditions is {} {}/sm3. \n" - "The phase surface volumetric rate is {} sm3/s", + GEOS_LOG_RANK( GEOS_FMT( "{}: density of phase {} at surface conditions = {} {}/sm3, phase surface volumetric rate = {} sm3/s", wellControlsName, ip, phaseDens[iwelemRef][0][ip], massUnit, currentPhaseVolRate[ip] ) ); } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index 78a700dcd91..cb81caa04a5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -188,7 +188,7 @@ void SinglePhaseWell::updateBHPForConstraint( WellElementSubRegion & subRegion ) if( logLevel >= 2 ) { - GEOS_LOG_RANK( GEOS_FMT( "{}: The BHP (at the specified reference elevation) is {} Pa", + GEOS_LOG_RANK( GEOS_FMT( "{}: The BHP (at the specified reference elevation) = {} Pa", wellControlsName, currentBHP ) ); } @@ -284,10 +284,8 @@ void SinglePhaseWell::updateVolRateForConstraint( WellElementSubRegion & subRegi if( logLevel >= 2 && useSurfaceConditions ) { - GEOS_LOG_RANK( GEOS_FMT( "{}: The total fluid density at surface conditions is {} kg/sm3. \n" - "The total rate is {} kg/s, which corresponds to a total surface volumetric rate of {} sm3/s", - wellControlsName, dens[iwelemRef][0], - connRate[iwelemRef], currentVolRate ) ); + GEOS_LOG_RANK( GEOS_FMT( "{}: total fluid density at surface conditions = {} kg/sm3, total rate = {} kg/s, total surface volumetric rate = {} sm3/s", + wellControlsName, dens[iwelemRef][0], connRate[iwelemRef], currentVolRate ) ); } } ); } ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp index 5030a951dd1..30ed4a17f09 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp @@ -385,7 +385,7 @@ void WellControls::postInputInitialization() m_targetBHPTable = &(functionManager.getGroup< TableFunction const >( m_targetBHPTableName )); GEOS_THROW_IF( m_targetBHPTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent rate table " + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent BHP table " << m_targetBHPTable->getName() << " should be TableFunction::InterpolationType::Lower", InputError ); } @@ -402,7 +402,7 @@ void WellControls::postInputInitialization() m_targetTotalRateTable = &(functionManager.getGroup< TableFunction const >( m_targetTotalRateTableName )); GEOS_THROW_IF( m_targetTotalRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent rate table " + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent total rate table " << m_targetTotalRateTable->getName() << " should be TableFunction::InterpolationType::Lower", InputError ); } @@ -419,7 +419,7 @@ void WellControls::postInputInitialization() m_targetPhaseRateTable = &(functionManager.getGroup< TableFunction const >( m_targetPhaseRateTableName )); GEOS_THROW_IF( m_targetPhaseRateTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent rate table " + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent phase rate table " << m_targetPhaseRateTable->getName() << " should be TableFunction::InterpolationType::Lower", InputError ); } @@ -457,8 +457,8 @@ void WellControls::postInputInitialization() m_statusTable = &(functionManager.getGroup< TableFunction const >( m_statusTableName )); GEOS_THROW_IF( m_statusTable->getInterpolationMethod() != TableFunction::InterpolationType::Lower, - "WellControls " << getDataContext() << ": The interpolation method for the time-dependent rate table " - << m_targetPhaseRateTable->getName() << " should be TableFunction::InterpolationType::Lower", + "WellControls " << getDataContext() << ": The interpolation method for the time-dependent status table " + << m_statusTable->getName() << " should be TableFunction::InterpolationType::Lower", InputError ); } } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index af10776cdf4..ab65f9eef38 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -364,8 +364,8 @@ class CoupledReservoirAndWellsBase : public CoupledSolver< RESERVOIR_SOLVER, WEL forAll< serialPolicy >( perforationData.size(), [=] ( localIndex const iperf ) { GEOS_UNUSED_VAR( iperf ); // unused if geos_error_if is nulld - GEOS_LOG_RANK( GEOS_FMT( "Perforation at ({},{},{}); perforated element center: ({},{},{}); transmissibility: {} [{}]", - perfLocation[iperf][0], perfLocation[iperf][1], perfLocation[iperf][2], + GEOS_LOG_RANK( GEOS_FMT( "{}: perforation at ({},{},{}), perforated element center = ({},{},{}), transmissibility = {} [{}]", + this->getName(), perfLocation[iperf][0], perfLocation[iperf][1], perfLocation[iperf][2], elemCenter[resElemRegion[iperf]][resElemSubRegion[iperf]][resElemIndex[iperf]][0], elemCenter[resElemRegion[iperf]][resElemSubRegion[iperf]][resElemIndex[iperf]][1], elemCenter[resElemRegion[iperf]][resElemSubRegion[iperf]][resElemIndex[iperf]][2], From a0a6e22f0f8837575807d7df2eddfebdfe396e0f Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 15 Oct 2024 11:15:34 -0500 Subject: [PATCH 220/286] feat: Enable reservoir+wells+contact mechanics (#3356) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + ...hasePoromechanics_FaultModel_well_base.xml | 234 ++++++++++++++++++ ...oromechanics_FaultModel_well_fim_smoke.xml | 116 +++++++++ ...oromechanics_FaultModel_well_seq_smoke.xml | 120 +++++++++ .../mesh/generators/WellGeneratorBase.cpp | 2 +- .../physicsSolvers/SolverBase.cpp | 2 +- .../fluidFlow/wells/SinglePhaseWell.cpp | 43 ++-- .../fluidFlow/wells/SinglePhaseWell.hpp | 3 + .../wells/SinglePhaseWellKernels.hpp | 32 --- .../multiphysics/CoupledSolver.hpp | 6 +- .../PoromechanicsInitialization.cpp | 2 + .../multiphysics/SinglePhasePoromechanics.cpp | 2 +- ...ePhasePoromechanicsConformingFractures.cpp | 7 +- 14 files changed, 515 insertions(+), 60 deletions(-) create mode 100644 inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_base.xml create mode 100644 inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_fim_smoke.xml create mode 100644 inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_seq_smoke.xml diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index b2984372dd6..1cd1ea2f3be 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3364-7912-d967424 + baseline: integratedTests/baseline_integratedTests-pr3356-8134-d7ab233 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 426b3bc7980..eec7a739852 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3364( 2024-10-15) +===================== +Enable reservoir+wells+contact mechanics. Rebaseline needed because of 'allowNegativePressure' flag added for wells. + PR #3364( 2024-10-01) ===================== Separate mass and volume residuals for output in compositional flow solver. Baseline update because of minor numerical diffs. diff --git a/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_base.xml b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_base.xml new file mode 100644 index 00000000000..b86106ea73d --- /dev/null +++ b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_base.xml @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_fim_smoke.xml b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_fim_smoke.xml new file mode 100644 index 00000000000..8a0e0e30138 --- /dev/null +++ b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_fim_smoke.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_seq_smoke.xml b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_seq_smoke.xml new file mode 100644 index 00000000000..4ff5d4e8669 --- /dev/null +++ b/inputFiles/poromechanicsFractures/singlePhasePoromechanics_FaultModel_well_seq_smoke.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index 594b0eaf012..1617aa3fdb4 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -572,7 +572,7 @@ void WellGeneratorBase::logPerforationTable() const tablePerfoData.addRow( iperf, m_perfCoords[iperf], m_perfElemId[iperf] ); } - TableLayout const tableLayoutPerfo ( {"Perforation no.", "Coordinates", "connected to"}, + TableLayout const tableLayoutPerfo ( {"Perforation no.", "Coordinates", "Well element no."}, GEOS_FMT( "Well '{}' Perforation Table", getName() ) ); TableTextFormatter const tablePerfoLog( tableLayoutPerfo ); GEOS_LOG_RANK_0( tablePerfoLog.toString( tablePerfoData )); diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/SolverBase.cpp index a41d2fb0401..1420ce45fd2 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/SolverBase.cpp @@ -1067,7 +1067,7 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, if( !checkSystemSolution( domain, m_dofManager, m_solution.values(), scaleFactor ) ) { // TODO try chopping (similar to line search) - GEOS_LOG_RANK_0( " Solution check failed. Newton loop terminated." ); + GEOS_LOG_RANK_0( GEOS_FMT( " {}: Solution check failed. Newton loop terminated.", getName()) ); break; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index cb81caa04a5..e06f25cd3eb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -50,6 +50,11 @@ SinglePhaseWell::SinglePhaseWell( const string & name, { m_numDofPerWellElement = 2; m_numDofPerResElement = 1; + + this->registerWrapper( FlowSolverBase::viewKeyStruct::allowNegativePressureString(), &m_allowNegativePressure ). + setApplyDefaultValue( 1 ). // negative pressure is allowed by default + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Flag indicating if negative pressure is allowed" ); } void SinglePhaseWell::registerDataOnMesh( Group & meshBodies ) @@ -823,8 +828,9 @@ bool SinglePhaseWell::checkSystemSolution( DomainPartition & domain, { GEOS_MARK_FUNCTION; - localIndex localCheck = 1; string const wellDofKey = dofManager.getKey( wellElementDofName() ); + integer numNegativePressures = 0; + real64 minPressure = 0.0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel const & mesh, @@ -838,33 +844,32 @@ bool SinglePhaseWell::checkSystemSolution( DomainPartition & domain, WellElementSubRegion const & subRegion ) { + globalIndex const rankOffset = dofManager.rankOffset(); // get the degree of freedom numbers on well elements - arrayView1d< globalIndex const > const & wellElemDofNumber = + arrayView1d< globalIndex const > const & dofNumber = subRegion.getReference< array1d< globalIndex > >( wellDofKey ); - arrayView1d< integer const > const & wellElemGhostRank = subRegion.ghostRank(); + arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); // get a reference to the primary variables on well elements - arrayView1d< real64 const > const & wellElemPressure = + arrayView1d< real64 const > const & pres = subRegion.getField< fields::well::pressure >(); - // here we can reuse the flow solver kernel checking that pressures are positive - localIndex const subRegionSolutionCheck = - singlePhaseWellKernels:: - SolutionCheckKernel::launch< parallelDevicePolicy<> >( localSolution, - dofManager.rankOffset(), - wellElemDofNumber, - wellElemGhostRank, - wellElemPressure, - scalingFactor ); - - if( subRegionSolutionCheck == 0 ) - { - localCheck = 0; - } + auto const statistics = + singlePhaseBaseKernels::SolutionCheckKernel:: + launch< parallelDevicePolicy<> >( localSolution, rankOffset, dofNumber, ghostRank, pres, scalingFactor ); + + numNegativePressures += statistics.first; + minPressure = std::min( minPressure, statistics.second ); } ); } ); - return MpiWrapper::min( localCheck ); + numNegativePressures = MpiWrapper::sum( numNegativePressures ); + + if( numNegativePressures > 0 ) + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Number of negative pressure values: {}, minimum value: {} Pa", + getName(), numNegativePressures, fmt::format( "{:.{}f}", minPressure, 3 ) ) ); + + return (m_allowNegativePressure || numNegativePressures == 0) ? 1 : 0; } void diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp index 57dc1d9feff..144a4de033f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp @@ -260,6 +260,9 @@ class SinglePhaseWell : public WellSolverBase real64 const & dt, DomainPartition & domain ) override; + /// flag if negative pressure is allowed + integer m_allowNegativePressure; + private: /** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp index ec21ac00522..4c4a249aa82 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp @@ -469,38 +469,6 @@ class ResidualNormKernelFactory }; -/******************************** SolutionCheckKernel ********************************/ - -struct SolutionCheckKernel -{ - template< typename POLICY > - static localIndex - launch( arrayView1d< real64 const > const & localSolution, - globalIndex const rankOffset, - arrayView1d< globalIndex const > const & presDofNumber, - arrayView1d< integer const > const & ghostRank, - arrayView1d< real64 const > const & pres, - real64 const scalingFactor ) - { - RAJA::ReduceMin< ReducePolicy< POLICY >, localIndex > minVal( 1 ); - - forAll< POLICY >( presDofNumber.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( ghostRank[ei] < 0 && presDofNumber[ei] >= 0 ) - { - localIndex const lid = presDofNumber[ei] - rankOffset; - real64 const newPres = pres[ei] + scalingFactor * localSolution[lid]; - - if( newPres < 0.0 ) - { - minVal.min( 0 ); - } - } - } ); - return minVal.get(); - } -}; - } // end namespace singlePhaseWellKernels } // end namespace geos diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index ea28f7b8b30..cf04bbabc94 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -285,6 +285,10 @@ class CoupledSolver : public SolverBase forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) { bool const validSinglePhysicsSolution = solver->checkSystemSolution( domain, dofManager, localSolution, scalingFactor ); + if( !validSinglePhysicsSolution ) + { + GEOS_LOG_RANK_0( GEOS_FMT( " {}/{}: Solution check failed. Newton loop terminated.", getName(), solver->getName()) ); + } validSolution = validSolution && validSinglePhysicsSolution; } ); return validSolution; @@ -672,7 +676,7 @@ class CoupledSolver : public SolverBase bool const usesLineSearch = getNonlinearSolverParameters().m_lineSearchAction != NonlinearSolverParameters::LineSearchAction::None; GEOS_THROW_IF( isSequential && usesLineSearch, GEOS_FMT( "{}: line search is not supported by the coupled solver when {} is set to `{}`. Please set {} to `{}` to remove this error", - getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ), + getNonlinearSolverParameters().getWrapperDataContext( NonlinearSolverParameters::viewKeysStruct::couplingTypeString() ), NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), EnumStrings< NonlinearSolverParameters::CouplingType >::toString( NonlinearSolverParameters::CouplingType::Sequential ), NonlinearSolverParameters::viewKeysStruct::lineSearchActionString(), diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index e3849c64519..295eaa33321 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -139,6 +139,7 @@ typedef PoromechanicsInitialization< MultiphasePoromechanics<> > MultiphasePorom typedef PoromechanicsInitialization< MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells<> > > MultiphaseReservoirPoromechanicsInitialization; typedef PoromechanicsInitialization< SinglePhasePoromechanics<> > SinglePhasePoromechanicsInitialization; typedef PoromechanicsInitialization< SinglePhasePoromechanicsConformingFractures<> > SinglePhasePoromechanicsConformingFracturesInitialization; +typedef PoromechanicsInitialization< SinglePhasePoromechanicsConformingFractures< SinglePhaseReservoirAndWells<> > > SinglePhaseReservoirPoromechanicsConformingFracturesInitialization; typedef PoromechanicsInitialization< SinglePhasePoromechanicsEmbeddedFractures > SinglePhasePoromechanicsEmbeddedFracturesInitialization; typedef PoromechanicsInitialization< SinglePhasePoromechanics< SinglePhaseReservoirAndWells<> > > SinglePhaseReservoirPoromechanicsInitialization; typedef PoromechanicsInitialization< HydrofractureSolver< SinglePhasePoromechanics<> > > HydrofractureInitialization; @@ -146,6 +147,7 @@ REGISTER_CATALOG_ENTRY( TaskBase, MultiphasePoromechanicsInitialization, string REGISTER_CATALOG_ENTRY( TaskBase, MultiphaseReservoirPoromechanicsInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, SinglePhasePoromechanicsInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, SinglePhasePoromechanicsConformingFracturesInitialization, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( TaskBase, SinglePhaseReservoirPoromechanicsConformingFracturesInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, SinglePhasePoromechanicsEmbeddedFracturesInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, SinglePhaseReservoirPoromechanicsInitialization, string const &, Group * const ) REGISTER_CATALOG_ENTRY( TaskBase, HydrofractureInitialization, string const &, Group * const ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index a8899c78569..6411c8f190e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -339,7 +339,7 @@ template class SinglePhasePoromechanics<>; template class SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsLagrangeContact >; template class SinglePhasePoromechanics< SinglePhaseBase, SolidMechanicsEmbeddedFractures >; template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells<> >; -//template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells<>, SolidMechanicsLagrangeContact >; +template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells<>, SolidMechanicsLagrangeContact >; //template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells<>, SolidMechanicsEmbeddedFractures >; namespace diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 5991b0fb3b1..7f5f69c81a5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -799,13 +799,12 @@ void SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::updateHydraulic } template class SinglePhasePoromechanicsConformingFractures<>; -//template class SinglePhasePoromechanicsConformingFractures< SinglePhaseReservoirAndWells<> >; +template class SinglePhasePoromechanicsConformingFractures< SinglePhaseReservoirAndWells<> >; namespace { -//typedef SinglePhasePoromechanicsConformingFractures< SinglePhaseReservoirAndWells<> > -// SinglePhaseReservoirPoromechanicsConformingFractures; -//REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseReservoirPoromechanicsConformingFractures, string const &, Group * const ) +typedef SinglePhasePoromechanicsConformingFractures< SinglePhaseReservoirAndWells<> > SinglePhaseReservoirPoromechanicsConformingFractures; +REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseReservoirPoromechanicsConformingFractures, string const &, Group * const ) typedef SinglePhasePoromechanicsConformingFractures<> SinglePhasePoromechanicsConformingFractures; REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsConformingFractures, string const &, Group * const ) } From 968476f5dac97fa56da42837c08dad4f1a44db31 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 15 Oct 2024 11:47:20 -0700 Subject: [PATCH 221/286] docs: update citation file (#3397) * Update CITATION.cff Co-authored-by: Joshua White --- CITATION.cff | 167 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 166 insertions(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index 3f4d284506a..d3e83dcea10 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,5 +1,6 @@ cff-version: 1.2.0 -message: "Publications that present GEOSX simulations and/or results should cite as follows:" +message: If you use this software, please cite this repository and our article in the + Journal of Open Source Software. authors: - family-names: "Settgast" given-names: "Randolph Richard" @@ -166,3 +167,167 @@ version: 1.1.0 doi: "10.5281/zenodo.7151031" date-released: 2024-09-14 url: "https://github.com/GEOS-DEV/GEOS" +preferred-citation: + authors: + - family-names: Settgast + given-names: Randolph R. + orcid: "https://orcid.org/0000-0002-2536-7867" + - family-names: Aronson + given-names: Ryan M. + orcid: "https://orcid.org/0009-0004-0785-5084" + - family-names: Besset + given-names: Julien R. + - family-names: Borio + given-names: Andrea + orcid: "https://orcid.org/0000-0003-2016-5403" + - family-names: Bui + given-names: Quan M. + orcid: "https://orcid.org/0000-0003-2648-0586" + - family-names: Byer + given-names: Thomas J. + - family-names: Castelletto + given-names: Nicola + orcid: "https://orcid.org/0000-0001-6816-6769" + - family-names: Citrain + given-names: Aurélien + orcid: "https://orcid.org/0009-0006-3742-1425" + - family-names: Corbett + given-names: Benjamin C. + orcid: "https://orcid.org/0009-0008-7108-9651" + - family-names: Corbett + given-names: James + - family-names: Cordier + given-names: Philippe + orcid: "https://orcid.org/0000-0002-6439-9263" + - family-names: Cremon + given-names: Matthias A. + orcid: "https://orcid.org/0000-0001-7458-6401" + - family-names: Crook + given-names: Cameron M. + orcid: "https://orcid.org/0000-0002-5366-6418" + - family-names: Cusini + given-names: Matteo + orcid: "https://orcid.org/0000-0002-6024-861X" + - family-names: Fei + given-names: Fan + orcid: "https://orcid.org/0000-0001-7273-4458" + - family-names: Frambati + given-names: Stefano + orcid: "https://orcid.org/0000-0003-0683-1203" + - family-names: Franc + given-names: Jacques + orcid: "https://orcid.org/0000-0002-8833-9425" + - family-names: Franceschini + given-names: Andrea + orcid: "https://orcid.org/0000-0003-4395-5125" + - family-names: Frigo + given-names: Matteo + orcid: "https://orcid.org/0000-0001-8150-1090" + - family-names: Fu + given-names: Pengcheng + orcid: "https://orcid.org/0000-0002-7408-3350" + - family-names: Gazzola + given-names: Thomas + orcid: "https://orcid.org/0000-0002-6103-4605" + - family-names: Gross + given-names: Herve + orcid: "https://orcid.org/0000-0002-1747-2018" + - family-names: Hamon + given-names: Francois + orcid: "https://orcid.org/0000-0001-8229-963X" + - family-names: Han + given-names: Brian M. + orcid: "https://orcid.org/0009-0002-8549-7644" + - family-names: Hao + given-names: Yue + orcid: "https://orcid.org/0000-0002-4543-8618" + - family-names: Hasanzade + given-names: Rasim + - family-names: Homel + given-names: Michael + orcid: "https://orcid.org/0000-0002-0399-0092" + - family-names: Huang + given-names: Jian + orcid: "https://orcid.org/0000-0002-5380-2563" + - family-names: Jin + given-names: Tao + orcid: "https://orcid.org/0000-0001-6658-8941" + - family-names: Ju + given-names: Isaac + orcid: "https://orcid.org/0000-0003-4110-7472" + - family-names: Kachuma + given-names: Dickson + - family-names: Karimi-Fard + given-names: Mohammad + orcid: "https://orcid.org/0000-0001-5707-165X" + - family-names: Kim + given-names: Taeho + - family-names: Klevtsov + given-names: Sergey + orcid: "https://orcid.org/0000-0001-9044-1827" + - family-names: Lapene + given-names: Alexandre + - family-names: Magri + given-names: Victor A. P. + orcid: "https://orcid.org/0000-0002-3389-523X" + - family-names: Mazuyer + given-names: Antoine + orcid: "https://orcid.org/0000-0002-0329-3385" + - family-names: N'diaye + given-names: Mamadou + - family-names: Osei-Kuffuor + given-names: Daniel + orcid: "https://orcid.org/0000-0002-6111-6205" + - family-names: Povolny + given-names: Stefan + - family-names: Ren + given-names: Guotong + orcid: "https://orcid.org/0000-0002-5821-9158" + - family-names: Semnani + given-names: Shabnam J. + - family-names: Sherman + given-names: Chris S. + orcid: "https://orcid.org/0000-0003-3550-0657" + - family-names: Rey + given-names: Melvin + - family-names: Tchelepi + given-names: Hamdi A. + orcid: "https://orcid.org/0000-0002-3084-6635" + - family-names: Tobin + given-names: William R. + orcid: "https://orcid.org/0009-0001-3960-6064" + - family-names: Tomin + given-names: Pavel + orcid: "https://orcid.org/0000-0003-4862-4288" + - family-names: Untereiner + given-names: Lionel + orcid: "https://orcid.org/0000-0002-8025-2616" + - family-names: Vargas + given-names: Arturo + orcid: "https://orcid.org/0000-0001-8001-5517" + - family-names: Waziri + given-names: Sohail + - family-names: Wen + given-names: Xianhuan + orcid: "https://orcid.org/0000-0002-6055-4553" + - family-names: White + given-names: Joshua A. + orcid: "https://orcid.org/0000-0003-3491-142X" + - family-names: Wu + given-names: Hui + orcid: "https://orcid.org/0000-0002-9575-3886" + date-published: 2024-10-10 + doi: 10.21105/joss.06973 + issn: 2475-9066 + issue: 102 + journal: Journal of Open Source Software + publisher: + name: Open Journals + start: 6973 + title: "GEOS: A performance portable multi-physics simulation + framework for subsurface applications" + type: article + url: "https://joss.theoj.org/papers/10.21105/joss.06973" + volume: 9 +title: "GEOS: A performance portable multi-physics simulation framework + for subsurface applications" From 263e5fd4262fa0ff6f460293609cf68e9a57be7f Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 16 Oct 2024 20:56:24 -0700 Subject: [PATCH 222/286] Make relationship between MPI_iCommData and CommID unique/one-to-one (#3402) --- .../mesh/mpiCommunications/CommID.hpp | 5 +++-- .../mpiCommunications/CommunicationTools.cpp | 16 ++++++++-------- .../mesh/mpiCommunications/MPI_iCommData.cpp | 5 +++-- .../mesh/mpiCommunications/MPI_iCommData.hpp | 4 ++-- .../SolidMechanicsLagrangianFEM.cpp | 2 +- .../SolidMechanicsLagrangianFEM.hpp | 2 +- .../solidMechanics/SolidMechanicsMPM.cpp | 6 +++++- .../solidMechanics/SolidMechanicsMPM.hpp | 1 - .../EmbeddedSurfacesParallelSynchronization.cpp | 7 +++---- .../surfaceGeneration/ParallelTopologyChange.cpp | 4 ++-- 10 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/coreComponents/mesh/mpiCommunications/CommID.hpp b/src/coreComponents/mesh/mpiCommunications/CommID.hpp index df56b0ca610..2f8997c1ba4 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommID.hpp +++ b/src/coreComponents/mesh/mpiCommunications/CommID.hpp @@ -44,8 +44,6 @@ class CommID */ ~CommID(); - /// default copy constructor - CommID( CommID const & ) = default; /** * Move constructor @@ -53,6 +51,9 @@ class CommID */ CommID( CommID && src ); + /// deleted default copy constructor + CommID( CommID const & ) = delete; + /// deleted copy assignment operator CommID & operator=( CommID const & ) = delete; diff --git a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp index fdb2ac41709..87dd288c167 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp +++ b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp @@ -121,7 +121,7 @@ void CommunicationTools::assignGlobalIndices( ObjectManagerBase & manager, integer const numNeighbors = LvArray::integerConversion< integer >( neighbors.size() ); - MPI_iCommData commData( getCommID() ); + MPI_iCommData commData; commData.resize( numNeighbors ); array1d< int > receiveBufferSizes( numNeighbors ); @@ -340,11 +340,11 @@ CommunicationTools::assignNewGlobalIndices( ElementRegionManager & elementManage * @return The data received from all the @p neighbors. Data at index @p i coming from neighbor at index @p i in the list of @p neighbors. */ template< class DATA_PROVIDER > -array1d< array1d< globalIndex > > exchange( int commId, - std::vector< NeighborCommunicator > & neighbors, +array1d< array1d< globalIndex > > exchange( std::vector< NeighborCommunicator > & neighbors, DATA_PROVIDER const & data ) { - MPI_iCommData commData( commId ); + MPI_iCommData commData; + int commId = commData.commID(); integer const numNeighbors = LvArray::integerConversion< integer >( neighbors.size() ); commData.resize( numNeighbors ); for( integer i = 0; i < numNeighbors; ++i ) @@ -391,7 +391,7 @@ CommunicationTools::buildNeighborPartitionBoundaryObjects( ObjectManagerBase & m { return std::cref( globalPartitionBoundaryObjectsIndices ); }; - array1d< array1d< globalIndex > > const neighborPartitionBoundaryObjects = exchange( getCommID(), allNeighbors, data ); + array1d< array1d< globalIndex > > const neighborPartitionBoundaryObjects = exchange( allNeighbors, data ); integer const numNeighbors = LvArray::integerConversion< integer >( allNeighbors.size() ); for( integer i = 0; i < numNeighbors; ++i ) @@ -566,7 +566,7 @@ void CommunicationTools::findMatchedPartitionBoundaryNodes( NodeManager & nodeMa { return req.at( allNeighbors[i].neighborRank() ); }; - array1d< array1d< globalIndex > > const nodesRequestedByNeighbors = exchange( getCommID(), allNeighbors, data ); + array1d< array1d< globalIndex > > const nodesRequestedByNeighbors = exchange( allNeighbors, data ); // Then we store the requested nodes for each receiver. for( integer i = 0; i < numNeighbors; ++i ) @@ -804,7 +804,7 @@ void CommunicationTools::setupGhosts( MeshLevel & meshLevel, bool const unorderedComms ) { GEOS_MARK_FUNCTION; - MPI_iCommData commData( getCommID() ); + MPI_iCommData commData; commData.resize( neighbors.size() ); NodeManager & nodeManager = meshLevel.getNodeManager(); @@ -1092,7 +1092,7 @@ void CommunicationTools::synchronizeFields( FieldIdentifiers const & fieldsToBeS std::vector< NeighborCommunicator > & neighbors, bool onDevice ) { - MPI_iCommData icomm( getCommID() ); + MPI_iCommData icomm; icomm.resize( neighbors.size() ); synchronizePackSendRecvSizes( fieldsToBeSync, mesh, neighbors, icomm, onDevice ); synchronizePackSendRecv( fieldsToBeSync, mesh, neighbors, icomm, onDevice ); diff --git a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp index 55609a0e0f5..2e0d7920437 100644 --- a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp +++ b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp @@ -14,13 +14,14 @@ */ #include "MPI_iCommData.hpp" +#include "CommunicationTools.hpp" namespace geos { -MPI_iCommData::MPI_iCommData( int const inputCommID ): +MPI_iCommData::MPI_iCommData(): m_size( 0 ), - m_commID( inputCommID ), // CommunicationTools::getInstance().getCommID() ), + m_commID( CommunicationTools::getInstance().getCommID() ), m_mpiSendBufferRequest(), m_mpiRecvBufferRequest(), m_mpiSendBufferStatus(), diff --git a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp index e749a818725..24f5e8cdbad 100644 --- a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp +++ b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp @@ -36,7 +36,7 @@ class MPI_iCommData * @param inputCommID The CommID integer that indicates what communication * pipeline to use for a set of neighbor communications. */ - MPI_iCommData( int const inputCommID ); + MPI_iCommData(); /// Default destructor ~MPI_iCommData(); @@ -96,7 +96,7 @@ class MPI_iCommData int m_size; /// The integer ID for the set of communication pipelines - int m_commID; + CommID m_commID; /// A collection of field names keyed on object keys to pack/unpack from /// communication pipeline. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 0ad7c46f776..1c1c5cf9785 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -59,7 +59,6 @@ SolidMechanicsLagrangianFEM::SolidMechanicsLagrangianFEM( const string & name, m_maxForce( 0.0 ), m_maxNumResolves( 10 ), m_strainTheory( 0 ), - m_iComm( CommunicationTools::getInstance().getCommID() ), m_isFixedStressPoromechanicsUpdate( false ) { @@ -571,6 +570,7 @@ real64 SolidMechanicsLagrangianFEM::explicitStep( real64 const & time_n, solidMechanics::arrayView2dLayoutIncrDisplacement const & uhat = nodes.getField< solidMechanics::incrementalDisplacement >(); solidMechanics::arrayView2dLayoutAcceleration const & acc = nodes.getField< solidMechanics::acceleration >(); + MPI_iCommData m_iComm; FieldIdentifiers fieldsToBeSync; fieldsToBeSync.addFields( FieldLocation::Node, { solidMechanics::velocity::key(), diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index c59227142b1..31060180229 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -294,7 +294,7 @@ class SolidMechanicsLagrangianFEM : public SolverBase real64 m_maxForce = 0.0; integer m_maxNumResolves; integer m_strainTheory; - MPI_iCommData m_iComm; +// MPI_iCommData m_iComm; bool m_isFixedStressPoromechanicsUpdate; /// Rigid body modes diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp index b0cb8c16a2c..a08777484ff 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp @@ -58,7 +58,7 @@ SolidMechanicsMPM::SolidMechanicsMPM( const string & name, SolverBase( name, parent ), m_solverProfiling( 0 ), m_timeIntegrationOption( TimeIntegrationOption::ExplicitDynamic ), - m_iComm( CommunicationTools::getInstance().getCommID() ), +// m_iComm( CommunicationTools::getInstance().getCommID() ), m_prescribedBcTable( 0 ), m_boundaryConditionTypes(), m_bcTable(), @@ -940,6 +940,7 @@ real64 SolidMechanicsMPM::explicitStep( real64 const & time_n, MeshLevel & mesh = grid.getBaseDiscretization(); NodeManager & nodeManager = mesh.getNodeManager(); + MPI_iCommData m_iComm; m_iComm.resize( domain.getNeighbors().size() ); @@ -1258,6 +1259,9 @@ void SolidMechanicsMPM::syncGridFields( std::vector< std::string > const & field fieldsToBeSynced.addFields( FieldLocation::Node, fieldNames ); std::vector< NeighborCommunicator > & neighbors = domain.getNeighbors(); + MPI_iCommData m_iComm; + m_iComm.resize( neighbors.size() ); + // (2) Swap send and receive indices so we can sum from ghost to master for( size_t n=0; n m_profilingLabels; TimeIntegrationOption m_timeIntegrationOption; - MPI_iCommData m_iComm; int m_prescribedBcTable; array1d< int > m_boundaryConditionTypes; // TODO: Surely there's a way to have just one variable here diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp index df8d00264e5..3e41eb295fb 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp @@ -383,7 +383,7 @@ void synchronizeNewNodes( MeshLevel & mesh, //************************************************************************************************ // We need to send over the new embedded surfaces and related objects for those whose parents are ghosts on neighbors. - MPI_iCommData commData( CommunicationTools::getInstance().getCommID() ); + MPI_iCommData commData; commData.resize( neighbors.size()); for( unsigned int neighborIndex=0; neighborIndex & neighbors, string const fractureRegionName ) { - MPI_iCommData commDataJunk( CommunicationTools::getInstance().getCommID() ); - MPI_iCommData commData( CommunicationTools::getInstance().getCommID() ); + MPI_iCommData commData; commData.resize( neighbors.size()); for( unsigned int neighborIndex=0; neighborIndex Date: Thu, 17 Oct 2024 20:24:06 +0200 Subject: [PATCH 223/286] feat: Simplification & consolidation of CellElementRegion definition (#2878) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + examples/GPU/beamBending.xml | 2 +- .../included/included_b.xml | 2 +- .../parameters_example.xml | 2 +- .../symbolic_math_example.xml | 2 +- .../modifyBoundaryCondition/pkn_example.xml | 2 +- .../parametricMesh.xml | 2 +- examples/sedovKernelTest.xml | 2 +- .../2ph_cap_1d_ihu.xml | 2 +- .../4comp_2ph_1d.xml | 2 +- .../4comp_2ph_cap_1d.xml | 2 +- .../deadOilSpe10Layers84_85_base_direct.xml | 2 +- ...deadOilSpe10Layers84_85_base_iterative.xml | 2 +- .../buckleyLeverett_base.xml | 2 +- .../c1-ppu/grav_seg_c1ppu_base.xml | 2 +- .../co2_flux_3d.xml | 2 +- .../co2_hybrid_1d.xml | 2 +- .../bottom_layer_SPE10_base.xml | 2 +- .../buckleyLeverett_1d/buckleyLeverett_1d.xml | 2 +- .../buckleyLeverett_1d_DBC.xml | 2 +- .../dbc/grav_seg_1d/grav_seg_1d.xml | 2 +- .../dbc/grav_seg_1d/grav_seg_1d_DBC.xml | 2 +- .../deadoil_3ph_baker_1d.xml | 2 +- .../deadoil_3ph_corey_1d.xml | 2 +- .../deadoil_3ph_corey_1d_fractured.xml | 2 +- .../deadoil_3ph_stone2_1d.xml | 2 +- .../class09_pb3_drainageOnly_direct_base.xml | 2 +- ...lass09_pb3_drainageOnly_iterative_base.xml | 2 +- .../class09_pb3_hystRelperm_direct_base.xml | 2 +- ...class09_pb3_hystRelperm_iterative_base.xml | 2 +- .../benchmarks/Egg/deadOilEgg_base_direct.xml | 2 +- .../Egg/deadOilEgg_base_iterative.xml | 2 +- .../black_oil_wells_saturated_3d.xml | 2 +- .../black_oil_wells_saturated_3d_stone2.xml | 2 +- .../black_oil_wells_unsaturated_3d.xml | 2 +- .../black_oil_wells_unsaturated_3d_stone2.xml | 2 +- .../compositional_multiphase_wells_1d.xml | 2 +- .../compositional_multiphase_wells_2d.xml | 2 +- .../dead_oil_wells_2d.xml | 2 +- .../dead_oil_wells_hybrid_2d.xml | 2 +- .../simpleCo2InjTutorial_base.xml | 2 +- .../simpleCo2InjTutorial_smoke.xml | 1 - .../staircase_co2_wells_hybrid_3d.xml | 2 +- ...bFrac_Compression_CoulombFriction_base.xml | 2 +- .../EmbFrac_Compression_Frictionless_base.xml | 2 +- .../Sneddon_embeddedFracShapes_base.xml | 2 +- .../Sneddon_embeddedFrac_base.xml | 2 +- .../Sneddon_hydroFrac_base.xml | 2 +- .../heterogeneousInSitu_base.xml | 2 +- .../heterogeneousInSitu_smoke.xml | 2 +- .../hydrofractureSinglePhase2d.xml | 2 +- .../hydraulicFracturing/kgdBase_C3D6_base.xml | 2 +- .../kgdToughnessDominated_base.xml | 2 +- ...kgdToughnessDominated_poroelastic_base.xml | 2 +- .../kgdValidation_base.xml | 2 +- .../kgdViscosityDominated_base.xml | 2 +- ...kgdViscosityDominated_poroelastic_base.xml | 2 +- .../pennyShapedToughnessDominated_base.xml | 2 +- ...pedToughnessDominated_poroelastic_base.xml | 2 +- .../pennyShapedViscosityDominated_base.xml | 2 +- ...pedViscosityDominated_poroelastic_base.xml | 2 +- .../pknViscosityDominated_base.xml | 2 +- ...pknViscosityDominated_poroelastic_base.xml | 2 +- .../PassingCrack_base.xml | 2 +- .../SimpleCubes_base.xml | 2 +- .../SingleFracCompression_base.xml | 2 +- .../Sneddon_base.xml | 2 +- .../lagrangianContactMechanics/TFrac_base.xml | 2 +- .../UnstructuredCrack_base.xml | 2 +- .../dfgMovingGrid/mpm_dfgMovingGrid.xml | 3 +- .../mpm_particleRepartition.xml | 3 +- .../singleParticle/mpm_singleParticle.xml | 3 +- .../meshGeneration/multiBodyMeshGen_base.xml | 2 +- .../deadOil_fractureMatrixFlow_edfm_base.xml | 2 +- .../deadoil_3ph_corey_2d_edfm.xml | 2 +- .../deadoil_3ph_corey_2d_impermeableFault.xml | 2 +- .../deadoil_3ph_corey_edfm_1d.xml | 2 +- ...3ph_corey_pedfm_impermeableFault_smoke.xml | 2 +- .../PhaseFieldFracture_CohesiveModel.xml | 2 +- .../PhaseFieldFracture_DamageAndLoad.xml | 2 +- .../PhaseFieldFracture_DamageOnly.xml | 2 +- .../PhaseFieldFracture_Nucleation_base.xml | 2 +- .../PhaseFieldFracture_Nucleation_smoke.xml | 2 +- .../PhaseFieldFracture_SpectralSplit.xml | 2 +- .../PhaseFieldFracture_VolDevSplit.xml | 2 +- .../PoroDelftEggWellbore_base.xml | 2 +- .../PoroDruckerPragerWellbore_base.xml | 2 +- .../PoroElasticWellbore_base.xml | 2 +- .../poromechanics/PoroElastic_Mandel_base.xml | 2 +- .../PoroElastic_Terzaghi_base_direct.xml | 2 +- .../PoroElastic_Terzaghi_base_iterative.xml | 2 +- .../PoroElastic_deadoil_3ph_baker_2d_base.xml | 2 +- .../poromechanics/PoroElastic_gravity.xml | 2 +- .../PoroElastic_hybridHexPrism_co2_base.xml | 2 +- .../PoroModifiedCamClayWellbore_base.xml | 2 +- .../PoroViscoDruckerPrager_base.xml | 2 +- .../PoroViscoExtendedDruckerPrager_base.xml | 2 +- .../PoroViscoModifiedCamClay_base.xml | 2 +- .../poromechanics/faultPoroelastic_base.xml | 2 +- .../smallEggModel/smallEggModel.xml | 8 +- ...ayPermeability_conformingFracture_base.xml | 2 +- ...ExponentialDecayPermeability_edfm_base.xml | 2 +- ...c_conformingFracture_2d_faultSlip_base.xml | 2 +- ...conformingFracture_2d_openingFrac_base.xml | 2 +- .../PoroElastic_efem-edfm_base.xml | 2 +- .../PoroElastic_efem-edfm_eggModel_large.xml | 8 +- .../PoroElastic_efem-edfm_eggModel_small.xml | 8 +- .../PoroElastic_efem-edfm_pennyCrack_base.xml | 2 +- ...lastic_efem-edfm_pressurizedFrac_smoke.xml | 2 +- .../SlipPermeability_embeddedFrac.xml | 2 +- .../SlipPermeability_pEDFM_base.xml | 2 +- ...lisRichardsPermeability_efem-edfm_base.xml | 2 +- .../FlowProppantBedTransport2d_base.xml | 2 +- .../proppant/FlowProppantTransport2d_base.xml | 2 +- .../proppant/ProppantGelTransport_base.xml | 2 +- inputFiles/proppant/ProppantSlotTest_base.xml | 2 +- .../testRelpermDriverBCBaker.xml | 2 +- .../testRelpermDriverBCStoneII.xml | 2 +- .../testRelpermDriverTableHyst2ph.xml | 2 +- .../10x10x10Hex_LaplaceFEM_smoke.xml | 2 +- .../10x10x10Hex_LaplaceVEM_smoke.xml | 2 +- .../10x5x15Wedges_LaplaceVEM_smoke.xml | 2 +- .../15x5x10Tets_LaplaceVEM_smoke.xml | 2 +- .../simplePDE/50x10x5Hex_LaplaceFEM_smoke.xml | 2 +- .../hybridHexPrism_LaplaceVEM_smoke.xml | 1 - .../3D_10x10x10_compressible_base.xml | 2 +- .../3D_10x10x10_thermalCompressible_base.xml | 2 +- .../FieldCaseTutorial3_base.xml | 4 +- .../singlePhaseFlow/compressible_1d.xml | 2 +- .../singlePhaseFlow/incompressible_1d.xml | 2 +- .../singlePhaseFlow/incompressible_pebi3d.xml | 2 +- inputFiles/singlePhaseFlow/sourceFlux_1d.xml | 2 +- inputFiles/singlePhaseFlow/sourceFlux_2d.xml | 2 +- inputFiles/singlePhaseFlow/staircase_3d.xml | 3 +- .../thermalCompressible_2d_benchmark.xml | 2 +- .../thermalCompressible_2d_smoke.xml | 2 +- ...nglePhaseThermalConductivity_benchmark.xml | 2 +- ...ntSinglePhaseThermalConductivity_smoke.xml | 2 +- ...ureFlowWithGravity_conforming_2d_smoke.xml | 2 +- .../fractureFlow_conforming_2d.xml | 2 +- .../fractureFlow_conforming_2d_vtk_input.xml | 5 +- .../fractureJunctionFlow_conforming_2d.xml | 2 +- ...rixFlowWithGravity_conforming_2d_smoke.xml | 2 +- ...lowWithGravity_edfm_verticalFrac_smoke.xml | 2 +- .../fractureMatrixFlow_conforming_2d.xml | 2 +- .../fractureMatrixFlow_edfm_base.xml | 2 +- ...ixFlow_pedfm_impermeableFracture_smoke.xml | 2 +- .../impermeableFault_conforming_base.xml | 2 +- .../compressible_single_phase_wells_1d.xml | 2 +- ...sible_single_phase_wells_1d_skinFactor.xml | 2 +- ...pressible_single_phase_wells_hybrid_1d.xml | 2 +- .../incompressible_single_phase_wells_2d.xml | 2 +- ...pressible_single_phase_wells_hybrid_2d.xml | 2 +- .../DruckerPragerWellbore_base.xml | 2 +- .../ExtendedDruckerPragerWellbore_base.xml | 2 +- .../solidMechanics/KirschProblem_base.xml | 2 +- .../ModifiedCamClayWellbore_base.xml | 2 +- inputFiles/solidMechanics/OpenWellbore.xml | 2 +- .../solidMechanics/beamBending_base.xml | 2 +- .../beamBending_hybridHexPrism_smoke.xml | 2 +- .../benchmarks/SSLE-QS-small.xml | 2 +- .../solidMechanics/benchmarks/SSLE-io.xml | 2 +- .../benchmarks/VerticalElasticWellbore.xml | 2 +- .../elasticHollowCylinder_isotropic_smoke.xml | 2 +- ...lasticHollowCylinder_orthotropic_smoke.xml | 2 +- ...llowCylinder_transverseIsotropic_smoke.xml | 2 +- .../mechanicsWithHeterogeneousMaterials.xml | 2 +- .../solidMechanics/plasticCubeReset.xml | 3 +- inputFiles/solidMechanics/sedov_base.xml | 2 +- inputFiles/solidMechanics/solidMechBlock.xml | 2 +- ...oExtendedDruckerPrager_relaxation_base.xml | 3 +- .../DryFrac_StaticPenny_PrismElem.xml | 2 +- ...yFrac_ThreeNodesPinched_HorizontalFrac.xml | 2 +- .../DryFrac_ThreeNodesPinched_SlantFrac.xml | 2 +- .../surfaceGeneration/SurfaceGenerator.xml | 2 +- .../thermalMultiphaseFlow/co2_thermal_2d.xml | 2 +- .../co2_thermal_obl_3d.xml | 2 +- ...egsCollab_thermalFlow_initialCond_base.xml | 2 +- .../egsCollab_thermalFlow_injection_base.xml | 2 +- ...ctureMatrixThermalFlow_conforming_base.xml | 2 +- .../fractureMatrixThermalFlow_edfm_base.xml | 2 +- .../ThermoPoroElastic_consolidation_base.xml | 2 +- .../ThermoPoroElastic_conforming_base.xml | 2 +- .../ThermoPoroElastic_efem-edfm_base.xml | 2 +- ...ver_ExtendedDruckerPrager_basicExample.xml | 2 +- .../triaxialDriver/triaxialDriver_base.xml | 2 +- .../acous3D_Q3_firstOrder_small_base.xml | 2 +- .../wavePropagation/acous3D_Q3_small_base.xml | 2 +- .../acous3D_Q5_firstOrder_small_base.xml | 2 +- .../wavePropagation/acous3D_Q5_small_base.xml | 2 +- .../acous3D_firstOrder_small_base.xml | 2 +- .../wavePropagation/acous3D_small_base.xml | 2 +- .../wavePropagation/acous3D_vti_smoke.xml | 2 +- .../benchmarks/acous3D_benchmark_base.xml | 2 +- .../benchmarks/elas3D_benchmark_base.xml | 3 +- .../wavePropagation/elas3D_DAS_smoke.xml | 2 +- .../elas3D_Q3_firstOrder_small_base.xml | 2 +- .../wavePropagation/elas3D_Q3_small_base.xml | 2 +- .../elas3D_Q5_firstOrder_small_base.xml | 2 +- .../wavePropagation/elas3D_Q5_small_base.xml | 2 +- .../elas3D_firstOrder_small_base.xml | 2 +- .../wavePropagation/elas3D_small_base.xml | 2 +- .../wellbore/DeviatedElasticWellbore_base.xml | 2 +- ...iatedPoroElasticWellbore_Drilling_base.xml | 2 +- ...atedPoroElasticWellbore_Injection_base.xml | 2 +- .../ThermoPoroElasticWellbore_base.xml | 2 +- .../codingUtilities/RTTypes.cpp | 5 +- .../common/format/StringUtilities.cpp | 8 +- .../common/format/StringUtilities.hpp | 63 ++++- .../constitutive/docs/Constitutive.rst | 2 +- src/coreComponents/mesh/CMakeLists.txt | 2 + src/coreComponents/mesh/CellElementRegion.cpp | 40 ++- src/coreComponents/mesh/CellElementRegion.hpp | 38 ++- .../mesh/CellElementRegionSelector.cpp | 193 ++++++++++++++ .../mesh/CellElementRegionSelector.hpp | 124 +++++++++ .../mesh/ElementRegionManager.cpp | 22 +- .../mesh/ElementRegionManager.hpp | 4 +- src/coreComponents/mesh/ElementType.hpp | 30 +++ src/coreComponents/mesh/FaceManager.cpp | 6 +- src/coreComponents/mesh/MeshLevel.cpp | 4 +- src/coreComponents/mesh/docs/Mesh.rst | 197 ++++++++++----- .../mesh/generators/CellBlockABC.hpp | 2 +- .../mesh/generators/CellBlockManager.cpp | 8 + .../mesh/generators/CellBlockManager.hpp | 13 + .../mesh/generators/CellBlockManagerABC.hpp | 9 +- .../mesh/generators/InternalMeshGenerator.cpp | 3 +- .../mesh/generators/VTKUtilities.cpp | 32 +-- src/coreComponents/schema/schema.xsd | 11 +- src/coreComponents/schema/schema.xsd.other | 4 +- .../unitTests/constitutiveTests/testPVT.xml | 2 +- .../constitutiveTests/testPVT_CO2Brine.xml | 2 +- .../testPVT_CO2BrineTables.xml | 2 +- .../testPVT_PhaseComposition.xml | 2 +- .../constitutiveTests/testPVT_docExample.xml | 2 +- .../constitutiveTests/testReactiveFluid.xml | 2 +- .../testTriaxial_delftEggCase1.xml | 2 +- .../testTriaxial_delftEggCase2.xml | 2 +- ...tTriaxial_delftEggLoadPathDryUseLinear.xml | 2 +- ...tTriaxial_delftEggLoadPathWetUseLinear.xml | 2 +- .../testTriaxial_delftEggUseLinear.xml | 2 +- .../testTriaxial_druckerPragerExtended.xml | 2 +- .../testTriaxial_elasticIsotropic.xml | 2 +- ...xial_elasticIsotropicPressureDependent.xml | 2 +- .../testTriaxial_modifiedCamClay.xml | 2 +- ...testTriaxial_modifiedCamClayVolumetric.xml | 2 +- .../dataRepositoryTests/testGroupPath.cpp | 2 +- .../testRecursiveFieldApplication.cpp | 7 +- .../fluidFlowTests/testCompMultiphaseFlow.cpp | 2 +- .../testCompMultiphaseFlowHybrid.cpp | 2 +- ...testReactiveCompositionalMultiphaseOBL.cpp | 2 +- .../testThermalCompMultiphaseFlow.cpp | 2 +- .../testThermalSinglePhaseFlow.cpp | 2 +- .../unitTests/meshTests/CMakeLists.txt | 3 +- .../unitTests/meshTests/box_hybrid_mesh.vtu | Bin 0 -> 503362 bytes .../meshTests/testElementRegions.cpp | 236 ++++++++++++++++++ .../testWavePropagation.cpp | 2 +- .../testWavePropagationAcousticFirstOrder.cpp | 2 +- .../testWavePropagationDAS.cpp | 2 +- .../testWavePropagationElasticFirstOrder.cpp | 2 +- .../testReservoirSinglePhaseMSWells.cpp | 2 +- .../unitTests/xmlTests/basic_input.xml | 2 +- .../xmlTests/multifile_input/solver.xml | 2 +- .../unitTests/xmlTests/testXML.cpp | 2 +- .../basicExamples/co2Injection/Example.rst | 3 +- .../basicExamples/multiphaseFlow/Example.rst | 7 +- .../multiphaseFlowWithWells/Example.rst | 7 +- .../developerGuide/Contributing/Sphinx.rst | 16 +- src/docs/sphinx/tutorials/step01/Tutorial.rst | 6 +- src/docs/sphinx/tutorials/step02/Tutorial.rst | 20 +- src/docs/sphinx/tutorials/step03/Tutorial.rst | 36 +-- src/pygeosx/pyssle.xml | 2 +- .../dataRepositoryTests/pygeosx_only.xml | 2 +- 273 files changed, 1206 insertions(+), 463 deletions(-) create mode 100644 src/coreComponents/mesh/CellElementRegionSelector.cpp create mode 100644 src/coreComponents/mesh/CellElementRegionSelector.hpp create mode 100644 src/coreComponents/unitTests/meshTests/box_hybrid_mesh.vtu create mode 100644 src/coreComponents/unitTests/meshTests/testElementRegions.cpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 1cd1ea2f3be..2d289765a28 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3356-8134-d7ab233 + baseline: integratedTests/baseline_integratedTests-pr2878-8188-ed2ded2 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index eec7a739852..65cd8d82bd9 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #2878 (2024-10-17) +===================== +Sorted region cellBlocks names alphabetically. Therefore affected ordering of: faceManager/elemSubRegionList, nodeManager/elemList, nodeManager/elemSubRegionList, SurfaceElementSubRegion::fractureElementsToCellSubRegions, field::perforation::reservoirElementSubregion. + PR #3364( 2024-10-15) ===================== Enable reservoir+wells+contact mechanics. Rebaseline needed because of 'allowNegativePressure' flag added for wells. diff --git a/examples/GPU/beamBending.xml b/examples/GPU/beamBending.xml index 85f7acfb6ae..755d34970e4 100644 --- a/examples/GPU/beamBending.xml +++ b/examples/GPU/beamBending.xml @@ -77,7 +77,7 @@ diff --git a/examples/advanced_xml_features/included/included_b.xml b/examples/advanced_xml_features/included/included_b.xml index bc052d6a51e..ba2aa87baed 100644 --- a/examples/advanced_xml_features/included/included_b.xml +++ b/examples/advanced_xml_features/included/included_b.xml @@ -30,7 +30,7 @@ diff --git a/examples/advanced_xml_features/parameters_example.xml b/examples/advanced_xml_features/parameters_example.xml index 7124be3aa8f..fa31e5d4bd3 100644 --- a/examples/advanced_xml_features/parameters_example.xml +++ b/examples/advanced_xml_features/parameters_example.xml @@ -96,7 +96,7 @@ XML Units: diff --git a/examples/advanced_xml_features/symbolic_math_example.xml b/examples/advanced_xml_features/symbolic_math_example.xml index a0a71b65547..e4d3f4942dd 100644 --- a/examples/advanced_xml_features/symbolic_math_example.xml +++ b/examples/advanced_xml_features/symbolic_math_example.xml @@ -106,7 +106,7 @@ XML Symbolic Math: diff --git a/examples/pygeosxExamples/modifyBoundaryCondition/pkn_example.xml b/examples/pygeosxExamples/modifyBoundaryCondition/pkn_example.xml index 57f6d330ce2..94db4f07eb6 100644 --- a/examples/pygeosxExamples/modifyBoundaryCondition/pkn_example.xml +++ b/examples/pygeosxExamples/modifyBoundaryCondition/pkn_example.xml @@ -70,7 +70,7 @@ diff --git a/examples/sedovKernelTest.xml b/examples/sedovKernelTest.xml index 99b79f3d217..9d56d5b7bf7 100644 --- a/examples/sedovKernelTest.xml +++ b/examples/sedovKernelTest.xml @@ -68,7 +68,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml b/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml index 8ca061df0c1..07a0f5d4731 100644 --- a/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml +++ b/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml @@ -69,7 +69,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml b/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml index 389f0e2a0af..bfe1ffb2914 100644 --- a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/4comp_2ph_1d.xml @@ -72,7 +72,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d.xml b/inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d.xml index 9072e840981..82da5163ad0 100644 --- a/inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/4comp_2ph_cap_1d.xml @@ -85,7 +85,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/deadOilSpe10Layers84_85_base_direct.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/deadOilSpe10Layers84_85_base_direct.xml index 796794b741d..b5f3dc74977 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/deadOilSpe10Layers84_85_base_direct.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/deadOilSpe10Layers84_85_base_direct.xml @@ -67,7 +67,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/deadOilSpe10Layers84_85_base_iterative.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/deadOilSpe10Layers84_85_base_iterative.xml index 68a933abd5a..5ca7d741433 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/deadOilSpe10Layers84_85_base_iterative.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/deadOilSpe10Layers84_85_base_iterative.xml @@ -66,7 +66,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_base.xml b/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_base.xml index ae3ddb8c7b1..a715c16b3a2 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_base.xml +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/buckleyLeverettProblem/buckleyLeverett_base.xml @@ -37,7 +37,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/c1-ppu/grav_seg_c1ppu_base.xml b/inputFiles/compositionalMultiphaseFlow/c1-ppu/grav_seg_c1ppu_base.xml index 89e2c9149b6..0ddb4a08cb2 100644 --- a/inputFiles/compositionalMultiphaseFlow/c1-ppu/grav_seg_c1ppu_base.xml +++ b/inputFiles/compositionalMultiphaseFlow/c1-ppu/grav_seg_c1ppu_base.xml @@ -44,7 +44,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml b/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml index d693f1542e3..8e18675a646 100644 --- a/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml +++ b/inputFiles/compositionalMultiphaseFlow/co2_flux_3d.xml @@ -112,7 +112,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml b/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml index b5ea99f5ff5..99e5d1ad3b0 100644 --- a/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml @@ -75,7 +75,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/dbc/bottom_layer_SPE10/bottom_layer_SPE10_base.xml b/inputFiles/compositionalMultiphaseFlow/dbc/bottom_layer_SPE10/bottom_layer_SPE10_base.xml index 9a7515aa2e8..a1d89df6bd9 100755 --- a/inputFiles/compositionalMultiphaseFlow/dbc/bottom_layer_SPE10/bottom_layer_SPE10_base.xml +++ b/inputFiles/compositionalMultiphaseFlow/dbc/bottom_layer_SPE10/bottom_layer_SPE10_base.xml @@ -11,7 +11,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/dbc/buckleyLeverett_1d/buckleyLeverett_1d.xml b/inputFiles/compositionalMultiphaseFlow/dbc/buckleyLeverett_1d/buckleyLeverett_1d.xml index b7978a7ba52..c2cb4574d62 100755 --- a/inputFiles/compositionalMultiphaseFlow/dbc/buckleyLeverett_1d/buckleyLeverett_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/dbc/buckleyLeverett_1d/buckleyLeverett_1d.xml @@ -41,7 +41,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/dbc/buckleyLeverett_1d/buckleyLeverett_1d_DBC.xml b/inputFiles/compositionalMultiphaseFlow/dbc/buckleyLeverett_1d/buckleyLeverett_1d_DBC.xml index 980fd46f7b9..38eef01c374 100755 --- a/inputFiles/compositionalMultiphaseFlow/dbc/buckleyLeverett_1d/buckleyLeverett_1d_DBC.xml +++ b/inputFiles/compositionalMultiphaseFlow/dbc/buckleyLeverett_1d/buckleyLeverett_1d_DBC.xml @@ -47,7 +47,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/dbc/grav_seg_1d/grav_seg_1d.xml b/inputFiles/compositionalMultiphaseFlow/dbc/grav_seg_1d/grav_seg_1d.xml index 8da5b23a782..2fd8219bf3c 100755 --- a/inputFiles/compositionalMultiphaseFlow/dbc/grav_seg_1d/grav_seg_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/dbc/grav_seg_1d/grav_seg_1d.xml @@ -44,7 +44,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/dbc/grav_seg_1d/grav_seg_1d_DBC.xml b/inputFiles/compositionalMultiphaseFlow/dbc/grav_seg_1d/grav_seg_1d_DBC.xml index 283c3f5623c..ad39d37d01f 100755 --- a/inputFiles/compositionalMultiphaseFlow/dbc/grav_seg_1d/grav_seg_1d_DBC.xml +++ b/inputFiles/compositionalMultiphaseFlow/dbc/grav_seg_1d/grav_seg_1d_DBC.xml @@ -50,7 +50,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_baker_1d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_baker_1d.xml index 30eb6334ce6..5c4ec705a2f 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_baker_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_baker_1d.xml @@ -83,7 +83,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d.xml index 6699f0dc120..660102cec84 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d.xml @@ -78,7 +78,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml index 2d0b2693a80..d8ec1d272af 100644 --- a/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml +++ b/inputFiles/compositionalMultiphaseFlow/deadoil_3ph_corey_1d_fractured.xml @@ -110,7 +110,7 @@ diff --git a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_direct_base.xml b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_direct_base.xml index 56d39f42bfb..fba559385dc 100644 --- a/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_direct_base.xml +++ b/inputFiles/compositionalMultiphaseWell/benchmarks/Class09Pb3/class09_pb3_drainageOnly_direct_base.xml @@ -51,7 +51,7 @@ - diff --git a/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_hybrid_3d.xml b/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_hybrid_3d.xml index e508462a7e5..16d7a6fc1c7 100644 --- a/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_hybrid_3d.xml +++ b/inputFiles/compositionalMultiphaseWell/staircase_co2_wells_hybrid_3d.xml @@ -117,7 +117,7 @@ @@ -133,4 +133,3 @@ boundaryConditionTypes="{ 1, 0, 2, 2, 1, 1 }" - diff --git a/inputFiles/materialPointMethod/particleRepartition/mpm_particleRepartition.xml b/inputFiles/materialPointMethod/particleRepartition/mpm_particleRepartition.xml index ea4fe422923..685e4c3479e 100644 --- a/inputFiles/materialPointMethod/particleRepartition/mpm_particleRepartition.xml +++ b/inputFiles/materialPointMethod/particleRepartition/mpm_particleRepartition.xml @@ -29,7 +29,7 @@ srun -n 4 /usr/workspace/homel1/GEOS/build-quartz-gcc@12-release/bin/geosx -i mp @@ -119,4 +119,3 @@ boundaryConditionTypes="{ 0, 0, 0, 0, 0, 0 }" - diff --git a/inputFiles/materialPointMethod/singleParticle/mpm_singleParticle.xml b/inputFiles/materialPointMethod/singleParticle/mpm_singleParticle.xml index bb795ae6e7f..4fa388009a5 100644 --- a/inputFiles/materialPointMethod/singleParticle/mpm_singleParticle.xml +++ b/inputFiles/materialPointMethod/singleParticle/mpm_singleParticle.xml @@ -29,7 +29,7 @@ srun -n 1 /usr/workspace/homel1/GEOS/build-quartz-gcc@12-release/bin/geosx -i mp @@ -119,4 +119,3 @@ boundaryConditionTypes="{ 0, 0, 0, 0, 0, 0 }" - diff --git a/inputFiles/meshGeneration/multiBodyMeshGen_base.xml b/inputFiles/meshGeneration/multiBodyMeshGen_base.xml index e714f179254..51477c54cb9 100644 --- a/inputFiles/meshGeneration/multiBodyMeshGen_base.xml +++ b/inputFiles/meshGeneration/multiBodyMeshGen_base.xml @@ -41,7 +41,7 @@ diff --git a/inputFiles/multiphaseFlowFractures/deadOil_fractureMatrixFlow_edfm_base.xml b/inputFiles/multiphaseFlowFractures/deadOil_fractureMatrixFlow_edfm_base.xml index 0243011b1b0..2ac98ea35b3 100644 --- a/inputFiles/multiphaseFlowFractures/deadOil_fractureMatrixFlow_edfm_base.xml +++ b/inputFiles/multiphaseFlowFractures/deadOil_fractureMatrixFlow_edfm_base.xml @@ -90,7 +90,7 @@ diff --git a/inputFiles/phaseField/PhaseFieldFracture_DamageAndLoad.xml b/inputFiles/phaseField/PhaseFieldFracture_DamageAndLoad.xml index c24b08aa8c9..14b6d92f8a3 100644 --- a/inputFiles/phaseField/PhaseFieldFracture_DamageAndLoad.xml +++ b/inputFiles/phaseField/PhaseFieldFracture_DamageAndLoad.xml @@ -103,7 +103,7 @@ diff --git a/inputFiles/phaseField/PhaseFieldFracture_DamageOnly.xml b/inputFiles/phaseField/PhaseFieldFracture_DamageOnly.xml index e7bcab72523..99064e92686 100644 --- a/inputFiles/phaseField/PhaseFieldFracture_DamageOnly.xml +++ b/inputFiles/phaseField/PhaseFieldFracture_DamageOnly.xml @@ -105,7 +105,7 @@ diff --git a/inputFiles/phaseField/PhaseFieldFracture_Nucleation_base.xml b/inputFiles/phaseField/PhaseFieldFracture_Nucleation_base.xml index c961f5c52b3..e339684d116 100644 --- a/inputFiles/phaseField/PhaseFieldFracture_Nucleation_base.xml +++ b/inputFiles/phaseField/PhaseFieldFracture_Nucleation_base.xml @@ -67,7 +67,7 @@ diff --git a/inputFiles/phaseField/PhaseFieldFracture_SpectralSplit.xml b/inputFiles/phaseField/PhaseFieldFracture_SpectralSplit.xml index 2cb24468fd0..f7423b48112 100644 --- a/inputFiles/phaseField/PhaseFieldFracture_SpectralSplit.xml +++ b/inputFiles/phaseField/PhaseFieldFracture_SpectralSplit.xml @@ -116,7 +116,7 @@ diff --git a/inputFiles/phaseField/PhaseFieldFracture_VolDevSplit.xml b/inputFiles/phaseField/PhaseFieldFracture_VolDevSplit.xml index e077817c194..26893feb2ce 100644 --- a/inputFiles/phaseField/PhaseFieldFracture_VolDevSplit.xml +++ b/inputFiles/phaseField/PhaseFieldFracture_VolDevSplit.xml @@ -116,7 +116,7 @@ diff --git a/inputFiles/poromechanics/PoroDelftEggWellbore_base.xml b/inputFiles/poromechanics/PoroDelftEggWellbore_base.xml index 4379c94dcca..60fef34af70 100644 --- a/inputFiles/poromechanics/PoroDelftEggWellbore_base.xml +++ b/inputFiles/poromechanics/PoroDelftEggWellbore_base.xml @@ -52,7 +52,7 @@ diff --git a/inputFiles/poromechanics/PoroDruckerPragerWellbore_base.xml b/inputFiles/poromechanics/PoroDruckerPragerWellbore_base.xml index 6072828be93..2fe870777b9 100644 --- a/inputFiles/poromechanics/PoroDruckerPragerWellbore_base.xml +++ b/inputFiles/poromechanics/PoroDruckerPragerWellbore_base.xml @@ -55,7 +55,7 @@ diff --git a/inputFiles/poromechanics/PoroElasticWellbore_base.xml b/inputFiles/poromechanics/PoroElasticWellbore_base.xml index 0c1bd27ae74..635883163d1 100644 --- a/inputFiles/poromechanics/PoroElasticWellbore_base.xml +++ b/inputFiles/poromechanics/PoroElasticWellbore_base.xml @@ -50,7 +50,7 @@ diff --git a/inputFiles/poromechanics/PoroElastic_Mandel_base.xml b/inputFiles/poromechanics/PoroElastic_Mandel_base.xml index a2c25d2aa1b..d1eb25f9673 100644 --- a/inputFiles/poromechanics/PoroElastic_Mandel_base.xml +++ b/inputFiles/poromechanics/PoroElastic_Mandel_base.xml @@ -21,7 +21,7 @@ diff --git a/inputFiles/poromechanics/PoroElastic_Terzaghi_base_direct.xml b/inputFiles/poromechanics/PoroElastic_Terzaghi_base_direct.xml index aa69acd04fc..b22a64ab20a 100644 --- a/inputFiles/poromechanics/PoroElastic_Terzaghi_base_direct.xml +++ b/inputFiles/poromechanics/PoroElastic_Terzaghi_base_direct.xml @@ -47,7 +47,7 @@ diff --git a/inputFiles/poromechanics/PoroElastic_Terzaghi_base_iterative.xml b/inputFiles/poromechanics/PoroElastic_Terzaghi_base_iterative.xml index 90909cbfa39..f266af73a19 100644 --- a/inputFiles/poromechanics/PoroElastic_Terzaghi_base_iterative.xml +++ b/inputFiles/poromechanics/PoroElastic_Terzaghi_base_iterative.xml @@ -48,7 +48,7 @@ diff --git a/inputFiles/poromechanics/PoroElastic_deadoil_3ph_baker_2d_base.xml b/inputFiles/poromechanics/PoroElastic_deadoil_3ph_baker_2d_base.xml index 0d408a2dc4e..94bb5973bb2 100644 --- a/inputFiles/poromechanics/PoroElastic_deadoil_3ph_baker_2d_base.xml +++ b/inputFiles/poromechanics/PoroElastic_deadoil_3ph_baker_2d_base.xml @@ -82,7 +82,7 @@ diff --git a/inputFiles/poromechanics/PoroElastic_gravity.xml b/inputFiles/poromechanics/PoroElastic_gravity.xml index ce1a82c80c6..91c9e679224 100644 --- a/inputFiles/poromechanics/PoroElastic_gravity.xml +++ b/inputFiles/poromechanics/PoroElastic_gravity.xml @@ -81,7 +81,7 @@ diff --git a/inputFiles/poromechanics/PoroElastic_hybridHexPrism_co2_base.xml b/inputFiles/poromechanics/PoroElastic_hybridHexPrism_co2_base.xml index 26c4b973932..85b5592eb52 100644 --- a/inputFiles/poromechanics/PoroElastic_hybridHexPrism_co2_base.xml +++ b/inputFiles/poromechanics/PoroElastic_hybridHexPrism_co2_base.xml @@ -79,7 +79,7 @@ diff --git a/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml b/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml index 39e5a33f29a..5d9149bf22e 100644 --- a/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml +++ b/inputFiles/poromechanics/PoroModifiedCamClayWellbore_base.xml @@ -52,7 +52,7 @@ diff --git a/inputFiles/poromechanics/PoroViscoDruckerPrager_base.xml b/inputFiles/poromechanics/PoroViscoDruckerPrager_base.xml index 301b0a41e88..58b27c73122 100644 --- a/inputFiles/poromechanics/PoroViscoDruckerPrager_base.xml +++ b/inputFiles/poromechanics/PoroViscoDruckerPrager_base.xml @@ -55,7 +55,7 @@ diff --git a/inputFiles/poromechanics/PoroViscoExtendedDruckerPrager_base.xml b/inputFiles/poromechanics/PoroViscoExtendedDruckerPrager_base.xml index c55ea123b70..7e066c4bf0d 100644 --- a/inputFiles/poromechanics/PoroViscoExtendedDruckerPrager_base.xml +++ b/inputFiles/poromechanics/PoroViscoExtendedDruckerPrager_base.xml @@ -56,7 +56,7 @@ diff --git a/inputFiles/poromechanics/PoroViscoModifiedCamClay_base.xml b/inputFiles/poromechanics/PoroViscoModifiedCamClay_base.xml index e571c953761..405d4bb3f01 100644 --- a/inputFiles/poromechanics/PoroViscoModifiedCamClay_base.xml +++ b/inputFiles/poromechanics/PoroViscoModifiedCamClay_base.xml @@ -56,7 +56,7 @@ diff --git a/inputFiles/poromechanics/faultPoroelastic_base.xml b/inputFiles/poromechanics/faultPoroelastic_base.xml index 5c69d115a5b..6b69e6836c1 100755 --- a/inputFiles/poromechanics/faultPoroelastic_base.xml +++ b/inputFiles/poromechanics/faultPoroelastic_base.xml @@ -5,7 +5,7 @@ diff --git a/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml b/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml index 0ab2e1e9527..277776298a8 100755 --- a/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml +++ b/inputFiles/poromechanics/nonlinearAcceleration/smallEggModel/smallEggModel.xml @@ -154,22 +154,22 @@ diff --git a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml index 7c53d0d4981..133e70876ff 100644 --- a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml +++ b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml @@ -82,7 +82,7 @@ diff --git a/inputFiles/relpermDriver/testRelpermDriverBCStoneII.xml b/inputFiles/relpermDriver/testRelpermDriverBCStoneII.xml index ab0c4abaaa7..80c5ab16abb 100644 --- a/inputFiles/relpermDriver/testRelpermDriverBCStoneII.xml +++ b/inputFiles/relpermDriver/testRelpermDriverBCStoneII.xml @@ -47,7 +47,7 @@ diff --git a/inputFiles/relpermDriver/testRelpermDriverTableHyst2ph.xml b/inputFiles/relpermDriver/testRelpermDriverTableHyst2ph.xml index 000003049c7..60614391abf 100644 --- a/inputFiles/relpermDriver/testRelpermDriverTableHyst2ph.xml +++ b/inputFiles/relpermDriver/testRelpermDriverTableHyst2ph.xml @@ -46,7 +46,7 @@ diff --git a/inputFiles/simplePDE/10x10x10Hex_LaplaceFEM_smoke.xml b/inputFiles/simplePDE/10x10x10Hex_LaplaceFEM_smoke.xml index eb35e4b7ccc..0709dcbfcb8 100644 --- a/inputFiles/simplePDE/10x10x10Hex_LaplaceFEM_smoke.xml +++ b/inputFiles/simplePDE/10x10x10Hex_LaplaceFEM_smoke.xml @@ -22,7 +22,7 @@ diff --git a/inputFiles/simplePDE/10x10x10Hex_LaplaceVEM_smoke.xml b/inputFiles/simplePDE/10x10x10Hex_LaplaceVEM_smoke.xml index b05378fb3ed..1c5cd08d1de 100644 --- a/inputFiles/simplePDE/10x10x10Hex_LaplaceVEM_smoke.xml +++ b/inputFiles/simplePDE/10x10x10Hex_LaplaceVEM_smoke.xml @@ -22,7 +22,7 @@ diff --git a/inputFiles/simplePDE/10x5x15Wedges_LaplaceVEM_smoke.xml b/inputFiles/simplePDE/10x5x15Wedges_LaplaceVEM_smoke.xml index 220b273e56c..fbb1ebddd32 100644 --- a/inputFiles/simplePDE/10x5x15Wedges_LaplaceVEM_smoke.xml +++ b/inputFiles/simplePDE/10x5x15Wedges_LaplaceVEM_smoke.xml @@ -22,7 +22,7 @@ diff --git a/inputFiles/simplePDE/15x5x10Tets_LaplaceVEM_smoke.xml b/inputFiles/simplePDE/15x5x10Tets_LaplaceVEM_smoke.xml index 76594883a4c..0cda8414a01 100644 --- a/inputFiles/simplePDE/15x5x10Tets_LaplaceVEM_smoke.xml +++ b/inputFiles/simplePDE/15x5x10Tets_LaplaceVEM_smoke.xml @@ -22,7 +22,7 @@ diff --git a/inputFiles/simplePDE/50x10x5Hex_LaplaceFEM_smoke.xml b/inputFiles/simplePDE/50x10x5Hex_LaplaceFEM_smoke.xml index aff5d97ec10..49913b72224 100644 --- a/inputFiles/simplePDE/50x10x5Hex_LaplaceFEM_smoke.xml +++ b/inputFiles/simplePDE/50x10x5Hex_LaplaceFEM_smoke.xml @@ -22,7 +22,7 @@ diff --git a/inputFiles/simplePDE/hybridHexPrism_LaplaceVEM_smoke.xml b/inputFiles/simplePDE/hybridHexPrism_LaplaceVEM_smoke.xml index 85f31ec5340..80e6b4d50b7 100644 --- a/inputFiles/simplePDE/hybridHexPrism_LaplaceVEM_smoke.xml +++ b/inputFiles/simplePDE/hybridHexPrism_LaplaceVEM_smoke.xml @@ -29,4 +29,3 @@ - diff --git a/inputFiles/singlePhaseFlow/3D_10x10x10_compressible_base.xml b/inputFiles/singlePhaseFlow/3D_10x10x10_compressible_base.xml index 502b8a22bd9..d9157d9b2b0 100644 --- a/inputFiles/singlePhaseFlow/3D_10x10x10_compressible_base.xml +++ b/inputFiles/singlePhaseFlow/3D_10x10x10_compressible_base.xml @@ -50,7 +50,7 @@ diff --git a/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml b/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml index 6de1ae4dfdf..1e529f1a41e 100644 --- a/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml +++ b/inputFiles/singlePhaseFlow/3D_10x10x10_thermalCompressible_base.xml @@ -39,7 +39,7 @@ diff --git a/inputFiles/singlePhaseFlow/FieldCaseTutorial3_base.xml b/inputFiles/singlePhaseFlow/FieldCaseTutorial3_base.xml index d9efb08892d..6de436890ed 100644 --- a/inputFiles/singlePhaseFlow/FieldCaseTutorial3_base.xml +++ b/inputFiles/singlePhaseFlow/FieldCaseTutorial3_base.xml @@ -5,12 +5,12 @@ diff --git a/inputFiles/singlePhaseFlow/compressible_1d.xml b/inputFiles/singlePhaseFlow/compressible_1d.xml index 168809613cb..d4a937ad4b3 100644 --- a/inputFiles/singlePhaseFlow/compressible_1d.xml +++ b/inputFiles/singlePhaseFlow/compressible_1d.xml @@ -70,7 +70,7 @@ diff --git a/inputFiles/singlePhaseFlow/incompressible_1d.xml b/inputFiles/singlePhaseFlow/incompressible_1d.xml index e4f37618cd2..670099cebbf 100644 --- a/inputFiles/singlePhaseFlow/incompressible_1d.xml +++ b/inputFiles/singlePhaseFlow/incompressible_1d.xml @@ -69,7 +69,7 @@ diff --git a/inputFiles/singlePhaseFlow/incompressible_pebi3d.xml b/inputFiles/singlePhaseFlow/incompressible_pebi3d.xml index 90842777527..162b2667e51 100644 --- a/inputFiles/singlePhaseFlow/incompressible_pebi3d.xml +++ b/inputFiles/singlePhaseFlow/incompressible_pebi3d.xml @@ -68,7 +68,7 @@ diff --git a/inputFiles/singlePhaseFlow/sourceFlux_1d.xml b/inputFiles/singlePhaseFlow/sourceFlux_1d.xml index 8fdf76542f5..2cae841d4da 100644 --- a/inputFiles/singlePhaseFlow/sourceFlux_1d.xml +++ b/inputFiles/singlePhaseFlow/sourceFlux_1d.xml @@ -68,7 +68,7 @@ diff --git a/inputFiles/singlePhaseFlow/sourceFlux_2d.xml b/inputFiles/singlePhaseFlow/sourceFlux_2d.xml index a455b137720..4a0d5cf3a28 100644 --- a/inputFiles/singlePhaseFlow/sourceFlux_2d.xml +++ b/inputFiles/singlePhaseFlow/sourceFlux_2d.xml @@ -94,7 +94,7 @@ diff --git a/inputFiles/singlePhaseFlow/staircase_3d.xml b/inputFiles/singlePhaseFlow/staircase_3d.xml index 199f1a726ea..2722e20c150 100644 --- a/inputFiles/singlePhaseFlow/staircase_3d.xml +++ b/inputFiles/singlePhaseFlow/staircase_3d.xml @@ -1,6 +1,7 @@ - + diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_2d_smoke.xml b/inputFiles/singlePhaseFlow/thermalCompressible_2d_smoke.xml index e4ec4ed0475..89d35398376 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_2d_smoke.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_2d_smoke.xml @@ -8,7 +8,7 @@ diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml index a526d78f438..fcac937bf47 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_benchmark.xml @@ -8,7 +8,7 @@ diff --git a/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_smoke.xml b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_smoke.xml index ca969a98c99..195ceabe14c 100644 --- a/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_smoke.xml +++ b/inputFiles/singlePhaseFlow/thermalCompressible_temperatureDependentSinglePhaseThermalConductivity_smoke.xml @@ -8,7 +8,7 @@ diff --git a/inputFiles/singlePhaseFlowFractures/fractureFlowWithGravity_conforming_2d_smoke.xml b/inputFiles/singlePhaseFlowFractures/fractureFlowWithGravity_conforming_2d_smoke.xml index f9ce504d5d7..9dbce69a6a6 100644 --- a/inputFiles/singlePhaseFlowFractures/fractureFlowWithGravity_conforming_2d_smoke.xml +++ b/inputFiles/singlePhaseFlowFractures/fractureFlowWithGravity_conforming_2d_smoke.xml @@ -84,7 +84,7 @@ - + diff --git a/inputFiles/solidMechanics/ExtendedDruckerPragerWellbore_base.xml b/inputFiles/solidMechanics/ExtendedDruckerPragerWellbore_base.xml index a2e0bd5cd8e..9881628d292 100644 --- a/inputFiles/solidMechanics/ExtendedDruckerPragerWellbore_base.xml +++ b/inputFiles/solidMechanics/ExtendedDruckerPragerWellbore_base.xml @@ -32,7 +32,7 @@ diff --git a/inputFiles/solidMechanics/KirschProblem_base.xml b/inputFiles/solidMechanics/KirschProblem_base.xml index 11eee1612ca..c0f724d29b0 100755 --- a/inputFiles/solidMechanics/KirschProblem_base.xml +++ b/inputFiles/solidMechanics/KirschProblem_base.xml @@ -17,7 +17,7 @@ diff --git a/inputFiles/solidMechanics/ModifiedCamClayWellbore_base.xml b/inputFiles/solidMechanics/ModifiedCamClayWellbore_base.xml index 1e216ebc48d..81ac82e3f23 100644 --- a/inputFiles/solidMechanics/ModifiedCamClayWellbore_base.xml +++ b/inputFiles/solidMechanics/ModifiedCamClayWellbore_base.xml @@ -31,7 +31,7 @@ diff --git a/inputFiles/solidMechanics/OpenWellbore.xml b/inputFiles/solidMechanics/OpenWellbore.xml index 8c7c591862d..a6dfa394f5f 100644 --- a/inputFiles/solidMechanics/OpenWellbore.xml +++ b/inputFiles/solidMechanics/OpenWellbore.xml @@ -79,7 +79,7 @@ diff --git a/inputFiles/solidMechanics/beamBending_base.xml b/inputFiles/solidMechanics/beamBending_base.xml index 7dabd0f8933..764cb822641 100644 --- a/inputFiles/solidMechanics/beamBending_base.xml +++ b/inputFiles/solidMechanics/beamBending_base.xml @@ -42,7 +42,7 @@ diff --git a/inputFiles/solidMechanics/beamBending_hybridHexPrism_smoke.xml b/inputFiles/solidMechanics/beamBending_hybridHexPrism_smoke.xml index 0c23d01b854..f0f5db09631 100644 --- a/inputFiles/solidMechanics/beamBending_hybridHexPrism_smoke.xml +++ b/inputFiles/solidMechanics/beamBending_hybridHexPrism_smoke.xml @@ -28,7 +28,7 @@ diff --git a/inputFiles/solidMechanics/benchmarks/SSLE-QS-small.xml b/inputFiles/solidMechanics/benchmarks/SSLE-QS-small.xml index 4df98119448..486f533a5bc 100644 --- a/inputFiles/solidMechanics/benchmarks/SSLE-QS-small.xml +++ b/inputFiles/solidMechanics/benchmarks/SSLE-QS-small.xml @@ -51,7 +51,7 @@ diff --git a/inputFiles/solidMechanics/benchmarks/SSLE-io.xml b/inputFiles/solidMechanics/benchmarks/SSLE-io.xml index 8a64bd59e77..5c0ecc605cf 100644 --- a/inputFiles/solidMechanics/benchmarks/SSLE-io.xml +++ b/inputFiles/solidMechanics/benchmarks/SSLE-io.xml @@ -112,7 +112,7 @@ diff --git a/inputFiles/solidMechanics/benchmarks/VerticalElasticWellbore.xml b/inputFiles/solidMechanics/benchmarks/VerticalElasticWellbore.xml index 35f4635aeb4..e17d1caa837 100644 --- a/inputFiles/solidMechanics/benchmarks/VerticalElasticWellbore.xml +++ b/inputFiles/solidMechanics/benchmarks/VerticalElasticWellbore.xml @@ -79,7 +79,7 @@ diff --git a/inputFiles/solidMechanics/elasticHollowCylinder_isotropic_smoke.xml b/inputFiles/solidMechanics/elasticHollowCylinder_isotropic_smoke.xml index 4882dd593b6..f43377dcb0b 100644 --- a/inputFiles/solidMechanics/elasticHollowCylinder_isotropic_smoke.xml +++ b/inputFiles/solidMechanics/elasticHollowCylinder_isotropic_smoke.xml @@ -10,7 +10,7 @@ diff --git a/inputFiles/solidMechanics/elasticHollowCylinder_orthotropic_smoke.xml b/inputFiles/solidMechanics/elasticHollowCylinder_orthotropic_smoke.xml index ede5290a53c..69b254072cc 100644 --- a/inputFiles/solidMechanics/elasticHollowCylinder_orthotropic_smoke.xml +++ b/inputFiles/solidMechanics/elasticHollowCylinder_orthotropic_smoke.xml @@ -10,7 +10,7 @@ diff --git a/inputFiles/solidMechanics/elasticHollowCylinder_transverseIsotropic_smoke.xml b/inputFiles/solidMechanics/elasticHollowCylinder_transverseIsotropic_smoke.xml index 96433871e09..522d21d57d6 100644 --- a/inputFiles/solidMechanics/elasticHollowCylinder_transverseIsotropic_smoke.xml +++ b/inputFiles/solidMechanics/elasticHollowCylinder_transverseIsotropic_smoke.xml @@ -10,7 +10,7 @@ diff --git a/inputFiles/solidMechanics/mechanicsWithHeterogeneousMaterials.xml b/inputFiles/solidMechanics/mechanicsWithHeterogeneousMaterials.xml index a13c81842e1..d1dfd7352b2 100644 --- a/inputFiles/solidMechanics/mechanicsWithHeterogeneousMaterials.xml +++ b/inputFiles/solidMechanics/mechanicsWithHeterogeneousMaterials.xml @@ -63,7 +63,7 @@ diff --git a/inputFiles/solidMechanics/plasticCubeReset.xml b/inputFiles/solidMechanics/plasticCubeReset.xml index 78007a7ef20..8f923860899 100644 --- a/inputFiles/solidMechanics/plasticCubeReset.xml +++ b/inputFiles/solidMechanics/plasticCubeReset.xml @@ -19,7 +19,7 @@ @@ -160,4 +160,3 @@ name="restartOutput"/> - diff --git a/inputFiles/solidMechanics/sedov_base.xml b/inputFiles/solidMechanics/sedov_base.xml index 49419832a75..fef292ad48d 100644 --- a/inputFiles/solidMechanics/sedov_base.xml +++ b/inputFiles/solidMechanics/sedov_base.xml @@ -12,7 +12,7 @@ diff --git a/inputFiles/solidMechanics/solidMechBlock.xml b/inputFiles/solidMechanics/solidMechBlock.xml index d3daec92f13..0aaf2aa0255 100644 --- a/inputFiles/solidMechanics/solidMechBlock.xml +++ b/inputFiles/solidMechanics/solidMechBlock.xml @@ -67,7 +67,7 @@ diff --git a/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_base.xml b/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_base.xml index a646a550529..c2e2dbf4da0 100644 --- a/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_base.xml +++ b/inputFiles/solidMechanics/viscoExtendedDruckerPrager_relaxation_base.xml @@ -38,8 +38,7 @@ diff --git a/inputFiles/surfaceGeneration/DryFrac_StaticPenny_PrismElem.xml b/inputFiles/surfaceGeneration/DryFrac_StaticPenny_PrismElem.xml index ffc25136a86..f398d7beb79 100644 --- a/inputFiles/surfaceGeneration/DryFrac_StaticPenny_PrismElem.xml +++ b/inputFiles/surfaceGeneration/DryFrac_StaticPenny_PrismElem.xml @@ -84,7 +84,7 @@ diff --git a/inputFiles/thermalMultiphaseFlow/co2_thermal_obl_3d.xml b/inputFiles/thermalMultiphaseFlow/co2_thermal_obl_3d.xml index 60556a4bbe8..1fe5b4a1b17 100644 --- a/inputFiles/thermalMultiphaseFlow/co2_thermal_obl_3d.xml +++ b/inputFiles/thermalMultiphaseFlow/co2_thermal_obl_3d.xml @@ -78,7 +78,7 @@ diff --git a/inputFiles/thermalSinglePhaseFlowFractures/egsCollab_thermalFlow/egsCollab_thermalFlow_initialCond_base.xml b/inputFiles/thermalSinglePhaseFlowFractures/egsCollab_thermalFlow/egsCollab_thermalFlow_initialCond_base.xml index 0ec3e35393b..e0d4cb7f585 100644 --- a/inputFiles/thermalSinglePhaseFlowFractures/egsCollab_thermalFlow/egsCollab_thermalFlow_initialCond_base.xml +++ b/inputFiles/thermalSinglePhaseFlowFractures/egsCollab_thermalFlow/egsCollab_thermalFlow_initialCond_base.xml @@ -10,7 +10,7 @@ diff --git a/inputFiles/triaxialDriver/triaxialDriver_base.xml b/inputFiles/triaxialDriver/triaxialDriver_base.xml index 3fb0f62fe84..efd380e39d5 100644 --- a/inputFiles/triaxialDriver/triaxialDriver_base.xml +++ b/inputFiles/triaxialDriver/triaxialDriver_base.xml @@ -139,7 +139,7 @@ diff --git a/inputFiles/wavePropagation/acous3D_Q3_firstOrder_small_base.xml b/inputFiles/wavePropagation/acous3D_Q3_firstOrder_small_base.xml index cb071a26703..e68f1e00460 100644 --- a/inputFiles/wavePropagation/acous3D_Q3_firstOrder_small_base.xml +++ b/inputFiles/wavePropagation/acous3D_Q3_firstOrder_small_base.xml @@ -32,7 +32,7 @@ diff --git a/inputFiles/wavePropagation/acous3D_Q3_small_base.xml b/inputFiles/wavePropagation/acous3D_Q3_small_base.xml index 26f0631f8fa..ee89af2f316 100644 --- a/inputFiles/wavePropagation/acous3D_Q3_small_base.xml +++ b/inputFiles/wavePropagation/acous3D_Q3_small_base.xml @@ -31,7 +31,7 @@ diff --git a/inputFiles/wavePropagation/acous3D_Q5_firstOrder_small_base.xml b/inputFiles/wavePropagation/acous3D_Q5_firstOrder_small_base.xml index 32018f54c95..4fd8f1f781e 100644 --- a/inputFiles/wavePropagation/acous3D_Q5_firstOrder_small_base.xml +++ b/inputFiles/wavePropagation/acous3D_Q5_firstOrder_small_base.xml @@ -32,7 +32,7 @@ diff --git a/inputFiles/wavePropagation/acous3D_Q5_small_base.xml b/inputFiles/wavePropagation/acous3D_Q5_small_base.xml index 0ad60b621bf..f6a8afffb11 100644 --- a/inputFiles/wavePropagation/acous3D_Q5_small_base.xml +++ b/inputFiles/wavePropagation/acous3D_Q5_small_base.xml @@ -31,7 +31,7 @@ diff --git a/inputFiles/wavePropagation/acous3D_firstOrder_small_base.xml b/inputFiles/wavePropagation/acous3D_firstOrder_small_base.xml index 90e96ffc053..8bfdbe6f218 100644 --- a/inputFiles/wavePropagation/acous3D_firstOrder_small_base.xml +++ b/inputFiles/wavePropagation/acous3D_firstOrder_small_base.xml @@ -32,7 +32,7 @@ diff --git a/inputFiles/wavePropagation/acous3D_small_base.xml b/inputFiles/wavePropagation/acous3D_small_base.xml index 694ced3e1e0..7a57de721cf 100644 --- a/inputFiles/wavePropagation/acous3D_small_base.xml +++ b/inputFiles/wavePropagation/acous3D_small_base.xml @@ -31,7 +31,7 @@ diff --git a/inputFiles/wavePropagation/acous3D_vti_smoke.xml b/inputFiles/wavePropagation/acous3D_vti_smoke.xml index ef9127fe278..4305ac12319 100644 --- a/inputFiles/wavePropagation/acous3D_vti_smoke.xml +++ b/inputFiles/wavePropagation/acous3D_vti_smoke.xml @@ -114,7 +114,7 @@ diff --git a/inputFiles/wavePropagation/benchmarks/acous3D_benchmark_base.xml b/inputFiles/wavePropagation/benchmarks/acous3D_benchmark_base.xml index d8a475ea54f..15372829ea5 100644 --- a/inputFiles/wavePropagation/benchmarks/acous3D_benchmark_base.xml +++ b/inputFiles/wavePropagation/benchmarks/acous3D_benchmark_base.xml @@ -69,7 +69,7 @@ diff --git a/inputFiles/wavePropagation/benchmarks/elas3D_benchmark_base.xml b/inputFiles/wavePropagation/benchmarks/elas3D_benchmark_base.xml index fc3b967238b..aacd50aca96 100644 --- a/inputFiles/wavePropagation/benchmarks/elas3D_benchmark_base.xml +++ b/inputFiles/wavePropagation/benchmarks/elas3D_benchmark_base.xml @@ -98,7 +98,7 @@ @@ -241,4 +241,3 @@ - diff --git a/inputFiles/wavePropagation/elas3D_DAS_smoke.xml b/inputFiles/wavePropagation/elas3D_DAS_smoke.xml index 916d9a8fc38..cac61db881f 100644 --- a/inputFiles/wavePropagation/elas3D_DAS_smoke.xml +++ b/inputFiles/wavePropagation/elas3D_DAS_smoke.xml @@ -72,7 +72,7 @@ diff --git a/inputFiles/wavePropagation/elas3D_Q3_firstOrder_small_base.xml b/inputFiles/wavePropagation/elas3D_Q3_firstOrder_small_base.xml index 9c833d44be1..aacb0be1d1b 100644 --- a/inputFiles/wavePropagation/elas3D_Q3_firstOrder_small_base.xml +++ b/inputFiles/wavePropagation/elas3D_Q3_firstOrder_small_base.xml @@ -32,7 +32,7 @@ diff --git a/inputFiles/wavePropagation/elas3D_Q3_small_base.xml b/inputFiles/wavePropagation/elas3D_Q3_small_base.xml index c8e1063beb9..13d6a186dbf 100644 --- a/inputFiles/wavePropagation/elas3D_Q3_small_base.xml +++ b/inputFiles/wavePropagation/elas3D_Q3_small_base.xml @@ -81,7 +81,7 @@ diff --git a/inputFiles/wavePropagation/elas3D_Q5_firstOrder_small_base.xml b/inputFiles/wavePropagation/elas3D_Q5_firstOrder_small_base.xml index b360569bb0e..0ce1207ed0b 100644 --- a/inputFiles/wavePropagation/elas3D_Q5_firstOrder_small_base.xml +++ b/inputFiles/wavePropagation/elas3D_Q5_firstOrder_small_base.xml @@ -32,7 +32,7 @@ diff --git a/inputFiles/wavePropagation/elas3D_Q5_small_base.xml b/inputFiles/wavePropagation/elas3D_Q5_small_base.xml index 67e137325f8..0afb065f3c3 100644 --- a/inputFiles/wavePropagation/elas3D_Q5_small_base.xml +++ b/inputFiles/wavePropagation/elas3D_Q5_small_base.xml @@ -81,7 +81,7 @@ diff --git a/inputFiles/wavePropagation/elas3D_firstOrder_small_base.xml b/inputFiles/wavePropagation/elas3D_firstOrder_small_base.xml index 7c3fa5783a6..565d48b0115 100644 --- a/inputFiles/wavePropagation/elas3D_firstOrder_small_base.xml +++ b/inputFiles/wavePropagation/elas3D_firstOrder_small_base.xml @@ -32,7 +32,7 @@ diff --git a/inputFiles/wavePropagation/elas3D_small_base.xml b/inputFiles/wavePropagation/elas3D_small_base.xml index 2f79d894055..3233345e59a 100644 --- a/inputFiles/wavePropagation/elas3D_small_base.xml +++ b/inputFiles/wavePropagation/elas3D_small_base.xml @@ -88,7 +88,7 @@ diff --git a/inputFiles/wellbore/DeviatedElasticWellbore_base.xml b/inputFiles/wellbore/DeviatedElasticWellbore_base.xml index 5327562a25b..00fe17cc3e7 100644 --- a/inputFiles/wellbore/DeviatedElasticWellbore_base.xml +++ b/inputFiles/wellbore/DeviatedElasticWellbore_base.xml @@ -42,7 +42,7 @@ diff --git a/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml b/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml index 787e7e42b5b..c769ceac580 100644 --- a/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml +++ b/inputFiles/wellbore/DeviatedPoroElasticWellbore_Drilling_base.xml @@ -45,7 +45,7 @@ diff --git a/inputFiles/wellbore/DeviatedPoroElasticWellbore_Injection_base.xml b/inputFiles/wellbore/DeviatedPoroElasticWellbore_Injection_base.xml index dbe2957d719..d329375d8ca 100644 --- a/inputFiles/wellbore/DeviatedPoroElasticWellbore_Injection_base.xml +++ b/inputFiles/wellbore/DeviatedPoroElasticWellbore_Injection_base.xml @@ -41,7 +41,7 @@ diff --git a/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml b/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml index 5e4420a8cc4..44cd4c3e971 100644 --- a/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml +++ b/inputFiles/wellbore/ThermoPoroElasticWellbore_base.xml @@ -50,7 +50,7 @@ diff --git a/src/coreComponents/codingUtilities/RTTypes.cpp b/src/coreComponents/codingUtilities/RTTypes.cpp index f84818cb937..6fbf864d253 100644 --- a/src/coreComponents/codingUtilities/RTTypes.cpp +++ b/src/coreComponents/codingUtilities/RTTypes.cpp @@ -179,8 +179,9 @@ rtTypes::RegexMapType rtTypes::createBasicTypesRegexMap() string_view const groupNameDesc = "Input value must be a string that cannot be empty and contains only upper/lower letters, digits, and the characters . - _"; string_view const groupNameRegex = "[a-zA-Z0-9.\\-_]+"; - string_view const groupNameRefDesc = "Input value must be a string that can contain only upper/lower letters, digits, and the characters . - _ / *"; - string_view const groupNameRefRegex = "[a-zA-Z0-9.\\-_/*]*"; + // to reference groups, we need to support the / for paths, and * [ ] for fnmatch patterns. + string_view const groupNameRefDesc = "Input value must be a string that can contain only upper/lower letters, digits, and the characters . - _ / * [ ]"; + string_view const groupNameRefRegex = "[a-zA-Z0-9.\\-_/*\\[\\]]*"; // Build master list of regexes diff --git a/src/coreComponents/common/format/StringUtilities.cpp b/src/coreComponents/common/format/StringUtilities.cpp index e9bffe8c0f8..cd13ba3919e 100644 --- a/src/coreComponents/common/format/StringUtilities.cpp +++ b/src/coreComponents/common/format/StringUtilities.cpp @@ -57,10 +57,10 @@ string_view trimSpaces( string_view str ) } -string removeStringAndFollowingContent( string const & str, - string const & strToRemove ) +string removeStringAndFollowingContent( string_view const str, + string_view const strToRemove ) { - string newStr = str; + string_view newStr = str; // check if the line contains the string to remove std::size_t const pos = newStr.find( strToRemove ); @@ -70,7 +70,7 @@ string removeStringAndFollowingContent( string const & str, // remove the character and everything afterwards newStr = newStr.substr( 0, pos ); } - return newStr; + return string( newStr ); } // put definition here so we can control the allowable values of T and diff --git a/src/coreComponents/common/format/StringUtilities.hpp b/src/coreComponents/common/format/StringUtilities.hpp index d8a2ace618a..8f083816c86 100644 --- a/src/coreComponents/common/format/StringUtilities.hpp +++ b/src/coreComponents/common/format/StringUtilities.hpp @@ -39,11 +39,11 @@ string toLower( string const & input ); /** * @brief Join strings or other printable objects with a delimiter. - * @tparam IT type of iterator into the range of objects to join - * @tparam S type of delimiter, usually char, char const * or string - * @param first iterator to start of the range - * @param last iterator past-the-end of the range - * @param delim delimiter used to glue together strings + * @tparam IT type of iterator into the range of objects to join + * @tparam S type of delimiter, usually char, char const * or string + * @param first iterator to start of the range + * @param last iterator past-the-end of the range + * @param delim delimiter used to glue together strings * @return a string containing input values concatenated with a delimiter */ template< typename IT, typename S = char > @@ -66,14 +66,57 @@ string join( IT first, IT last, S const & delim = S() ) * @brief Join strings or other printable objects with a delimiter. * @tparam CONTAINER type of container to join * @tparam S the type of delimiter, usually char, char const * or string - * @param cont the container to join + * @param container the container to join * @param delim delimiter used to glue together strings * @return a string containing input values concatenated with a delimiter */ template< typename CONTAINER, typename S = char > -string join( CONTAINER const & cont, S const & delim = S() ) +string join( CONTAINER const & container, S const & delim = S() ) +{ + return join( std::begin( container ), std::end( container ), delim ); +} + +/** + * @brief Join strings or other printable objects returned by a formatter functor. + * @tparam IT type of iterator into the range of objects to join + * @tparam S type of delimiter, usually char, char const * or string + * @tparam LAMBDA type of formatter functor, usually `[]( auto it ) -> string` + * @param formattingFunc formatter function to get a formattable value from a IT iterator + * @param first iterator to start of the range + * @param last iterator past-the-end of the range + * @param delim delimiter used to glue together strings + * @return a string containing input values concatenated with a delimiter + */ +template< typename IT, typename S, typename LAMBDA > +string joinLamda( IT first, IT last, S const & delim, LAMBDA formattingFunc ) +{ + if( first == last ) + { + return {}; + } + std::ostringstream oss; + oss << formattingFunc( first ); + while( ++first != last ) + { + oss << delim << formattingFunc( first ); + } + return oss.str(); +} + +/** + * @brief Join strings or other printable objects returned by a formatter functor. + * @tparam CONTAINER type of container to join + * @tparam S type of delimiter, usually char, char const * or string + * @tparam LAMBDA type of formatter functor, usually `[]( auto it ) -> string` + * @param formattingFunc formatter function to get a formattable value from an iterator of the container + * @param container container to join + * @param delim delimiter used to glue together strings + * @return a string containing input values concatenated with a delimiter + */ +template< typename CONTAINER, typename S, typename LAMBDA > +string joinLamda( CONTAINER const & container, S const & delim, LAMBDA formattingFunc ) { - return join( std::begin( cont ), std::end( cont ), delim ); + return joinLamda( std::begin( container ), std::end( container ), delim, formattingFunc ); } /** @@ -181,8 +224,8 @@ string_view trimSpaces( string_view str ); * @param[in] strToRemove the string to search for in the line * @return the new (truncated) string */ -string removeStringAndFollowingContent( string const & str, - string const & strToRemove ); +string removeStringAndFollowingContent( string_view str, + string_view strToRemove ); /** * @brief Take a string, and return a array1d with the cast values diff --git a/src/coreComponents/constitutive/docs/Constitutive.rst b/src/coreComponents/constitutive/docs/Constitutive.rst index 61108c5525d..d1441d78d7b 100644 --- a/src/coreComponents/constitutive/docs/Constitutive.rst +++ b/src/coreComponents/constitutive/docs/Constitutive.rst @@ -51,7 +51,7 @@ A typical ```` and ```` block will look like: diff --git a/src/coreComponents/mesh/CMakeLists.txt b/src/coreComponents/mesh/CMakeLists.txt index 481ef6f243e..f6fbb61e2e3 100644 --- a/src/coreComponents/mesh/CMakeLists.txt +++ b/src/coreComponents/mesh/CMakeLists.txt @@ -2,6 +2,7 @@ set( mesh_headers BufferOps.hpp CellElementRegion.hpp + CellElementRegionSelector.hpp CellElementSubRegion.hpp DomainPartition.hpp EdgeManager.hpp @@ -87,6 +88,7 @@ set( mesh_headers set( mesh_sources BufferOps.cpp CellElementRegion.cpp + CellElementRegionSelector.cpp CellElementSubRegion.cpp DomainPartition.cpp EdgeManager.cpp diff --git a/src/coreComponents/mesh/CellElementRegion.cpp b/src/coreComponents/mesh/CellElementRegion.cpp index e72550b1fc1..da3aabb63b3 100644 --- a/src/coreComponents/mesh/CellElementRegion.cpp +++ b/src/coreComponents/mesh/CellElementRegion.cpp @@ -17,6 +17,8 @@ #include "CellElementSubRegion.hpp" #include "mesh/generators/CellBlockABC.hpp" +#include + namespace geos { using namespace dataRepository; @@ -24,9 +26,24 @@ using namespace dataRepository; CellElementRegion::CellElementRegion( string const & name, Group * const parent ): ElementRegionBase( name, parent ) { + std::vector< string > elementNames; + for( int i = 0; i < numElementTypes(); ++i ) + { + if( getElementDim( (ElementType)i ) == 3 ) + { + elementNames.push_back( getElementTypeName( (ElementType)i ) ); + } + } + registerWrapper( viewKeyStruct::sourceCellBlockNamesString(), &m_cellBlockNames ). setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). - setInputFlag( InputFlags::REQUIRED ); + setInputFlag( InputFlags::REQUIRED ). + setDescription( GEOS_FMT( "List of the desired cell-blocks qualifiers to contain in this {}. Qualifiers can be either cell-block " + "names, region attribute values, or fnmatch pattern." + "The form of loaded cell-block names is of \"regionAttribute_elementType\", so \"1_tetrahedra\" " + " contains the tetrahedric elements for which the regionAttribute is 1.\n" + "The element types are: {}.", + catalogName(), stringutilities::join( elementNames, ", " ) ) ); registerWrapper( viewKeyStruct::coarseningRatioString(), &m_coarseningRatio ). setInputFlag( InputFlags::OPTIONAL ). @@ -38,13 +55,22 @@ CellElementRegion::~CellElementRegion() void CellElementRegion::generateMesh( Group const & cellBlocks ) { - Group & elementSubRegions = this->getGroup( viewKeyStruct::elementSubRegions() ); - - for( string const & cellBlockName : this->m_cellBlockNames ) + GEOS_THROW_IF( m_cellBlockNames.empty(), + GEOS_FMT( "{}: No cellBlock selected in this region.", + getDataContext() ), + InputError ); + Group & subRegions = this->getGroup( viewKeyStruct::elementSubRegions() ); + for( string const & cbName : m_cellBlockNames ) { - CellElementSubRegion & subRegion = elementSubRegions.registerGroup< CellElementSubRegion >( cellBlockName ); - CellBlockABC const & source = cellBlocks.getGroup< CellBlockABC >( subRegion.getName() ); - subRegion.copyFromCellBlock( source ); + CellBlockABC const * cellBlock = cellBlocks.getGroupPointer< CellBlockABC >( cbName ); + GEOS_THROW_IF( cellBlock == nullptr, + GEOS_FMT( "{}: No cellBlock named '{}' found.\nAvailable cellBlock list: {{ {} }}\nNo CellElementRegionSelector has been used to verify the cellBlock selection.", + getDataContext(), cbName, stringutilities::join( m_cellBlockNames, ", " ) ), + InputError ); + + // subRegion name must be the same as the cell-block (so we can match them and reference them in errors). + CellElementSubRegion & subRegion = subRegions.registerGroup< CellElementSubRegion >( cbName ); + subRegion.copyFromCellBlock( *cellBlock ); } } diff --git a/src/coreComponents/mesh/CellElementRegion.hpp b/src/coreComponents/mesh/CellElementRegion.hpp index 8316e9e3b67..e2156ceb805 100644 --- a/src/coreComponents/mesh/CellElementRegion.hpp +++ b/src/coreComponents/mesh/CellElementRegion.hpp @@ -85,16 +85,15 @@ class CellElementRegion : public ElementRegionBase /** - * @brief Getter for m_cellBlockNames - * @return The array of cell block names. + * @return List of user-requested mesh cellBlocks names. + * @note the list may be incomplete / illegible if CellElementRegionSelectorhas not been used on + * the instance. */ arrayView1d< string const > getCellBlockNames() const - { - return m_cellBlockNames.toViewConst(); - } + { return m_cellBlockNames.toViewConst(); } /** - * @brief Add a cellBlockRegion name to the list. + * @brief Select a cellBlock by its name for generateMesh(). * @param cellBlockName string containing the cell block region name. */ void addCellBlockName( string const & cellBlockName ) @@ -103,17 +102,25 @@ class CellElementRegion : public ElementRegionBase } /** - * @brief Add an array cellBlockRegion name to the list. + * @brief Select cellBlocks by their names for generateMesh(). * @param cellBlockNames array of string containing the cell block region names. */ - void addCellBlockNames( arrayView1d< string const > const & cellBlockNames ) + template< typename StringContainerType > + void setCellBlockNames( StringContainerType const & cellBlockNames ) { + m_cellBlockNames.clear(); for( auto const & name: cellBlockNames ) { m_cellBlockNames.emplace_back( name ); } } + /** + * @brief register every cellBlocks that is requested in the cellBlockNames list. + * @note Assume that the cellBlockNames list is filled valid `cellBlocks` names + * (use CellElementRegionSelector to verify & fill this list after the user-requests). + * @param cellBlocks Cell blocks from where the mesh is extracted. + */ virtual void generateMesh( Group const & cellBlocks ) override; ///@} @@ -127,19 +134,26 @@ class CellElementRegion : public ElementRegionBase /// @return String key for the coarsening ratio static constexpr char const * coarseningRatioString() {return "coarseningRatio"; } - /// @return String key for the cell block names + /// @return String key for the user-requested mesh cellBlocks qualifiers: cellblock names, cellblock match patterns, attribute values. static constexpr char const * sourceCellBlockNamesString() {return "cellBlocks"; } }; - private: - // Cell block names + /// @brief List of user-requested mesh cellBlocks qualifiers: cellblock names, cellblock match patterns, attribute values. string_array m_cellBlockNames; - // Coarsening ratio + /// @brief Coarsening ratio real64 m_coarseningRatio; + + /** + * @return all cell-block names entries from m_cellBlockAttributeValues, + * m_cellBlockMatchPatterns and m_cellBlockNames. + * @param cellBlocks the input mesh cell-block list + */ + std::set< string > computeSelectedCellBlocks( std::set< string > const & cellBlocksNames ) const; + }; } /* namespace geos */ diff --git a/src/coreComponents/mesh/CellElementRegionSelector.cpp b/src/coreComponents/mesh/CellElementRegionSelector.cpp new file mode 100644 index 00000000000..80047d71c79 --- /dev/null +++ b/src/coreComponents/mesh/CellElementRegionSelector.cpp @@ -0,0 +1,193 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "mesh/CellElementRegionSelector.hpp" + +#include +#include + + +namespace geos +{ +using namespace dataRepository; +using ViewKeys = CellElementRegion::viewKeyStruct; + + +CellElementRegionSelector::CellElementRegionSelector( + Group const & cellBlocks, + std::map< integer, std::set< string > > const & regionsCellBlocks ) +{ + // The owners lists need to be initialized so we will be able to verify later that it is not empty. + + cellBlocks.forSubGroups< CellBlockABC >( [&] ( CellBlockABC const & cellBlock ) + { + string const name = cellBlock.getName(); + m_cellBlocksOwners.emplace( name, std::vector< CellElementRegion const * >() ); + } ); + + for( auto const & regionCellBlocks : regionsCellBlocks ) + { + string const regionAttributeStr = std::to_string( regionCellBlocks.first ); + m_regionAttributesCellBlocks.emplace( regionAttributeStr, regionCellBlocks.second ); + m_regionAttributesOwners.emplace( regionAttributeStr, std::vector< CellElementRegion const * >() ); + } +} + + +std::set< string > +CellElementRegionSelector::getMatchingCellblocks( CellElementRegion const & region, + string_view matchPattern ) const +{ + std::set< string > matchedCellBlocks; + bool matching = false; + for( auto const & [cellBlockName, owners] : m_cellBlocksOwners ) + { + // if the pattern matches the tested cellBlock name + if( fnmatch( matchPattern.data(), cellBlockName.c_str(), 0 ) == 0 ) + { + matching = true; + matchedCellBlocks.emplace( cellBlockName ); + } + } + + GEOS_THROW_IF( !matching, + GEOS_FMT( "{}: No cellBlock name is satisfying the qualifier '{}'.\n" + "Available cellBlock list: {{ {} }}\nAvailable region attribute list: {{ {} }}", + region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), + matchPattern, + stringutilities::joinLamda( m_regionAttributesOwners, ", ", + []( auto pair ) { return pair->first; } ), + stringutilities::joinLamda( m_cellBlocksOwners, ", ", + []( auto pair ) { return pair->first; } ) ), + InputError ); + return matchedCellBlocks; +} + +void +CellElementRegionSelector::verifyRequestedCellBlocks( CellElementRegion const & region, + std::set< string > const & cellBlockNames ) const +{ + for( string const & requestedCellBlockName : cellBlockNames ) + { + // if cell block does not exist in the mesh + GEOS_THROW_IF( m_cellBlocksOwners.count( requestedCellBlockName ) == 0, + GEOS_FMT( "{}: No cellBlock named '{}'.\nAvailable cellBlock list: {{ {} }}", + region.getWrapperDataContext( ViewKeys::sourceCellBlockNamesString() ), + requestedCellBlockName, + stringutilities::joinLamda( m_cellBlocksOwners, ", ", + []( auto pair ) { return pair->first; } ) ), + InputError ); + } +} + + +void +CellElementRegionSelector::registerRegionSelection( CellElementRegion const & region, + std::set< string > const & cellBlockNames, + std::set< string > const & attributeValues ) +{ + for( string attributeValue : attributeValues ) + { + m_regionAttributesOwners[attributeValue].push_back( ®ion ); + } + + for( string const & cellBlockName : cellBlockNames ) + { + m_cellBlocksOwners[cellBlockName].push_back( ®ion ); + } +} + + +std::set< string > CellElementRegionSelector::buildCellBlocksSelection( CellElementRegion const & region ) +{ + std::set< string > cellBlocksSelection; + std::set< string > regionAttributeSelection; + + auto const qualifiers = region.getCellBlockNames(); + for( string const & qualifier : qualifiers ) + { + auto const regionCellBlocks = m_regionAttributesCellBlocks.find( qualifier ); + if( regionCellBlocks != m_regionAttributesCellBlocks.end() ) + { // if the qualifier is a region attribute value, let's select it + regionAttributeSelection.emplace( regionCellBlocks->first ); + for( string const & cellBlock : regionCellBlocks->second ) + { + cellBlocksSelection.emplace( cellBlock ); + } + } + else + { // the qualifier is a match pattern, or a simple cellblock name, let's select all matching cell-blocks + std::set< string > const matchedCellBlocks = getMatchingCellblocks( region, qualifier ); + cellBlocksSelection.insert( matchedCellBlocks.begin(), matchedCellBlocks.end() ); + } + } + + verifyRequestedCellBlocks( region, cellBlocksSelection ); + registerRegionSelection( region, cellBlocksSelection, regionAttributeSelection ); + + return cellBlocksSelection; +} + +void CellElementRegionSelector::checkSelectionConsistency() const +{ + auto const getRegionStr = []( auto regionPtrIterator ) -> string { + return GEOS_FMT( "- {}", (*regionPtrIterator)->getDataContext() ); + }; + + auto const checkOwnerCount = [&]( string_view qualifierType, + auto const & qualifiersOwners, + auto & orphanList ) { + // Search of never or multiple selected attribute values + std::vector< string > multipleRefsErrors; + for( auto const & [qualifier, owningRegions] : qualifiersOwners ) + { + if( owningRegions.size() == 0 ) + { + orphanList.insert( qualifier ); + } + else if( owningRegions.size() > 1 ) + { + multipleRefsErrors.push_back( + GEOS_FMT( "The {} '{}' has been referenced in multiple {}:\n{}", + qualifierType, qualifier, CellElementRegion::catalogName(), + stringutilities::joinLamda( owningRegions, '\n', getRegionStr ) ) ); + } + } + GEOS_THROW_IF( !multipleRefsErrors.empty(), stringutilities::join( multipleRefsErrors, "\n\n" ), InputError ); + }; + + std::set< string > orphanRegionAttributes; + std::set< string > orphanCellBlockNames; + checkOwnerCount( "region attribute", m_regionAttributesOwners, orphanRegionAttributes ); + checkOwnerCount( "cell-block", m_cellBlocksOwners, orphanCellBlockNames ); + + if( !orphanCellBlockNames.empty() ) + { + std::ostringstream oss; + if( !orphanRegionAttributes.empty() ) + { + oss << GEOS_FMT( "The region attributes {{ {} }} has not been referenced in any {}.\n", + stringutilities::join( orphanRegionAttributes, ", " ), + CellElementRegion::catalogName() ); + } + oss << GEOS_FMT( "The following cell-blocks has not been referenced in any region: {{ {} }}.\n", + stringutilities::join( orphanCellBlockNames, ", " ) ); + oss << GEOS_FMT( "Please add it in an existing {} (through the '{}' attribute), or consider creating a new one to describe your model.", + CellElementRegion::catalogName(), ViewKeys::sourceCellBlockNamesString() ); + GEOS_THROW( oss.str(), InputError ); + } +} + + +} /* namespace geos */ diff --git a/src/coreComponents/mesh/CellElementRegionSelector.hpp b/src/coreComponents/mesh/CellElementRegionSelector.hpp new file mode 100644 index 00000000000..962f99aca1b --- /dev/null +++ b/src/coreComponents/mesh/CellElementRegionSelector.hpp @@ -0,0 +1,124 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file CellElementRegionSelector.hpp + */ + +#ifndef GEOS_MESH_CELLELEMENTREGIONSELECTOR_HPP_ +#define GEOS_MESH_CELLELEMENTREGIONSELECTOR_HPP_ + +#include "mesh/CellElementRegion.hpp" + +namespace geos +{ + +/** + * @class CellElementRegionSelector + * + * CellElementRegionSelector allows a CellElementRegion to safely select cell-blocks according to the user input. + * It handles all user input checks and throws an exception in the event of inconsistency. + */ +class CellElementRegionSelector +{ +public: + + /** + * @brief Construct a new CellElementRegionSelector. + * @param cellBlocks a Group containing all the available cell-blocks. + * @param cellBlocksRegion A map of the cellblocks name lists for each region attributes value. + */ + CellElementRegionSelector( dataRepository::Group const & cellBlocks, + std::map< integer, std::set< string > > const & cellBlocksRegion ); + + /** + * @brief Select the mesh cell-blocks for the specified region following the user inputs. + * @throw an InputError if the user setting are inconsistant. + * @param region the region for which we want to select the cell-blocks. + * @return the selected cell-blocks names. + */ + std::set< string > buildCellBlocksSelection( CellElementRegion const & region ); + + /** + * @throw An InputError if region cell-blocks selections is inconsistent: + * - cell-block is in more than one region, + * - orphan cell-block + * @todo For now, multiple regions per cell is not supported (ElementRegionManager::getCellBlockToSubRegionMap()). + * We could refactor the CellElementRegion & Mesh classes so regions are mapped to cell-blocks IN the mesh (and potentially + * to multiple regions per cell). So, for external meshes, the cell-blocks would no longer be exposed to the final user. + */ + void checkSelectionConsistency() const; + +private: + + /// @brief The separator between the regionAttribute value and the type of the shape in a given cellBlock. + static constexpr string_view cellBlockTypeSeparator = "_"; + + /// @brief A map that link every cell-block name to the CellElementRegion(s) that references it. + std::map< string, std::vector< CellElementRegion const * > > m_cellBlocksOwners; + + /// @brief A map that link every region attribute values to the CellElementRegion(s) that references it. + std::map< string, std::vector< CellElementRegion const * > > m_regionAttributesOwners; + + /** + * @brief A map of the cellblocks name lists for each region attributes value. Internal attribute type + * is integer to facilitate comparison with cellBlock qualifiers. + */ + std::map< string, std::set< string > const & > m_regionAttributesCellBlocks; + + /** + * @return A set of the FNMatch pattern from the provided lists. + * @param region The region for which we collect the match-patterns. + * @param requestedAttributeValues The user requested attribute values. They will get converted to + * match-pattern that select the coresponding cell-blocks. + * @param requestedMatchPatterns The match patterns that the user requested explicitely. + * @throw An InputError if the attribute values does not exist in the mesh. + */ + std::set< string > buildMatchPatterns( CellElementRegion const & region, + std::set< string > const & attributeValues, + std::set< string > const & matchPatterns ) const; + + /** + * @return A set of the cell-blocks that the provided match-patterns select. + * @param region The region for which we collect the cell-blocks. + * @param matchPatterns The FNMatch pattern + * @throw An InputError if a FNMatch pattern does not select any cell-block. + */ + std::set< string > getMatchingCellblocks( CellElementRegion const & region, + string_view matchPattern ) const; + + /** + * @brief A set of the cell-blocks that the provided match-patterns select. + * @param region The region for which we collect the cell-blocks. + * @param matchPatterns The FNMatch pattern set. + * @throw An InputError if a FNMatch pattern does not select any cell-block. + */ + void verifyRequestedCellBlocks( CellElementRegion const & region, + std::set< string > const & cellBlockNames ) const; + + /** + * @brief Effectively select the specified cell-blocks & region attribute for the specified region. + * @param region The region for which when want to select cell-blocks + * @param attributeValues The attribute values we want to select (can be empty). + * @param cellBlockNames The cell-block names we want to select (can be empty). + */ + void registerRegionSelection( CellElementRegion const & region, + std::set< string > const & cellBlockNames, + std::set< string > const & attributeValues ); + +}; + +} /* namespace geos */ + +#endif /* GEOS_MESH_CELLELEMENTREGIONSELECTOR_HPP_ */ diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index a03a70a4075..6f3669a0a19 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -28,6 +28,7 @@ #include "mesh/utilities/MeshMapUtilities.hpp" #include "schema/schemaUtilities.hpp" #include "mesh/generators/LineBlockABC.hpp" +#include "mesh/CellElementRegionSelector.hpp" namespace geos { @@ -77,7 +78,6 @@ Group * ElementRegionManager::createChild( string const & childKey, string const Group & elementRegions = this->getGroup( ElementRegionManager::groupKeyStruct::elementRegionsGroup() ); return &elementRegions.registerGroup( childName, CatalogInterface::factory( childKey, childName, &elementRegions ) ); - } void ElementRegionManager::expandObjectCatalogs() @@ -120,12 +120,23 @@ void ElementRegionManager::setSchemaDeviations( xmlWrapper::xmlNode schemaRoot, } } + void ElementRegionManager::generateMesh( CellBlockManagerABC const & cellBlockManager ) { - this->forElementRegions< CellElementRegion >( [&]( CellElementRegion & elemRegion ) - { - elemRegion.generateMesh( cellBlockManager.getCellBlocks() ); - } ); + { // cellBlocks loading + Group const & cellBlocks = cellBlockManager.getCellBlocks(); + CellElementRegionSelector cellBlockSelector{ cellBlocks, + cellBlockManager.getRegionAttributesCellBlocks() }; + this->forElementRegions< CellElementRegion >( [&]( CellElementRegion & elemRegion ) + { + elemRegion.setCellBlockNames( cellBlockSelector.buildCellBlocksSelection( elemRegion ) ); + elemRegion.generateMesh( cellBlocks ); + } ); + // selecting all cellblocks is mandatory + cellBlockSelector.checkSelectionConsistency(); + } + + this->forElementRegions< SurfaceElementRegion >( [&]( SurfaceElementRegion & elemRegion ) { elemRegion.generateMesh( cellBlockManager.getFaceBlocks() ); @@ -151,7 +162,6 @@ void ElementRegionManager::generateMesh( CellBlockManagerABC const & cellBlockMa tmp, relation ); } ); - } void ElementRegionManager::generateWells( CellBlockManagerABC const & cellBlockManager, diff --git a/src/coreComponents/mesh/ElementRegionManager.hpp b/src/coreComponents/mesh/ElementRegionManager.hpp index 573749ada07..1f3ab30a0c9 100644 --- a/src/coreComponents/mesh/ElementRegionManager.hpp +++ b/src/coreComponents/mesh/ElementRegionManager.hpp @@ -144,7 +144,7 @@ class ElementRegionManager : public ObjectManagerBase } /** - * @brief Generate the mesh. + * @brief Generate the mesh. Produce an error if a required cellBlock doesn't exist in the source mesh. * @param [in,out] cellBlockManager Reference to the abstract cell block manager. */ void generateMesh( CellBlockManagerABC const & cellBlockManager ); @@ -1186,8 +1186,6 @@ class ElementRegionManager : public ObjectManagerBase * @return reference to this object */ ElementRegionManager & operator=( const ElementRegionManager & ); - - }; diff --git a/src/coreComponents/mesh/ElementType.hpp b/src/coreComponents/mesh/ElementType.hpp index 24665ebe987..67208235e3b 100644 --- a/src/coreComponents/mesh/ElementType.hpp +++ b/src/coreComponents/mesh/ElementType.hpp @@ -110,6 +110,36 @@ ENUM_STRINGS( ElementType, "HendecagonalPrism", "Polyhedron" ); +/** + * @brief Returns a string describing the element. + * @param[in] type The element type. + * @return The name. + * @warning This information will be visible in the input file... Consider refactoring with great care. + */ +inline string getElementTypeName( ElementType const type ) +{ + switch( type ) + { + case ElementType::Hexahedron: return "hexahedra"; + case ElementType::Tetrahedron: return "tetrahedra"; + case ElementType::Wedge: return "wedges"; + case ElementType::Pyramid: return "pyramids"; + case ElementType::Prism5: return "pentagonalPrisms"; + case ElementType::Prism6: return "hexagonalPrisms"; + case ElementType::Prism7: return "heptagonalPrisms"; + case ElementType::Prism8: return "octagonalPrisms"; + case ElementType::Prism9: return "nonagonalPrisms"; + case ElementType::Prism10: return "decagonalPrisms"; + case ElementType::Prism11: return "hendecagonalPrisms"; + case ElementType::Polyhedron: return "polyhedra"; + default: + { + GEOS_ERROR( "Element type '" << type << "' is not supported" ); + return {}; + } + } +} + /// String available for mesh errors inline auto constexpr generalMeshErrorAdvice = "Consider checking the validity of your mesh with " "the `mesh_doctor` GEOS python tools (documentation at " diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index 9a3923ed358..b5924f7fde4 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -272,11 +272,7 @@ void FaceManager::sortAllFaceNodes( NodeManager const & nodeManager, if( facesToElements( faceIndex, 0 ) < 0 && facesToElements( faceIndex, 1 ) < 0 ) { GEOS_ERROR( getDataContext() << ": Face " << faceIndex << - " is not connected to any cell.\n" - "You might have:\n" - "- an invalid mesh,\n" - "- not enough CellElementRegions to describe your input mesh (all regions, simulated or not, must be listed),\n" - "- forgotten one cell type in an existing \"" << CellElementRegion::viewKeyStruct::sourceCellBlockNamesString() << "\'." ); + " is not connected to any cell. You might have an invalid mesh." ); } // Take the first defined face-to-(elt/region/sub region) to sorting direction. diff --git a/src/coreComponents/mesh/MeshLevel.cpp b/src/coreComponents/mesh/MeshLevel.cpp index 5ed92c326d7..fe3c98b6eca 100644 --- a/src/coreComponents/mesh/MeshLevel.cpp +++ b/src/coreComponents/mesh/MeshLevel.cpp @@ -204,8 +204,8 @@ MeshLevel::MeshLevel( string const & name, // create element region with the same name as source element region "Region" CellElementRegion & region = *(dynamic_cast< CellElementRegion * >( m_elementManager->createChild( sourceRegion.getCatalogName(), sourceRegion.getName() ) ) ); - // add cell block to the new element region with the same name as cell block name from source element region - region.addCellBlockNames( sourceRegion.getCellBlockNames() ); + // set cell block to the new element region with the same name as cell block name from source element region + region.setCellBlockNames( sourceRegion.getCellBlockNames() ); sourceRegion.forElementSubRegions< CellElementSubRegion >( [&]( CellElementSubRegion const & sourceSubRegion ) { diff --git a/src/coreComponents/mesh/docs/Mesh.rst b/src/coreComponents/mesh/docs/Mesh.rst index cf6e587336e..829d4a9a59d 100644 --- a/src/coreComponents/mesh/docs/Mesh.rst +++ b/src/coreComponents/mesh/docs/Mesh.rst @@ -32,14 +32,14 @@ The following is an example XML ```` block, which will generate a vertical + elementTypes="{ C3D8 }" + xCoords="{ 0, 1 }" + yCoords="{ 0, 1 }" + zCoords="{ 0, 2, 6 }" + nx="{ 1 }" + ny="{ 1 }" + nz="{ 2, 4 }" + cellBlockNames="{ cb1, cb2 }"/> - ``name`` the name of the mesh body @@ -168,7 +168,7 @@ The supported mesh elements for volume elements consist of the following: The mesh can be divided in several regions. These regions are intended to support different physics or to define different constitutive properties. -We usually use the ``attribute`` field is usually considered to define the regions. +By default, we use the ``attribute`` field to define the regions. .. _ImportingExternalMesh: @@ -179,7 +179,7 @@ Importing regions ***************** Several blocks are involved to import an external mesh into GEOS, defined in the XML input file. -These are the ```` block and the ```` block. +These are the ```` block and the ```` block. The mesh block has the following syntax: @@ -189,65 +189,108 @@ The mesh block has the following syntax: + file="/path/to/the/mesh/file.vtk" + regionAttribute="myAttribute" /> -We advise users to use absolute path to the mesh file, and strongly recommend the use of a logLevel -of 1 or more to obtain some information about the mesh import. This information contains for -example the list of regions that are imported with their names, which is particularly useful to -fill the ``cellBlocks`` field of the ``ElementRegions`` block (see below). Some information about the -imported surfaces is also provided. +..note:: + We advise users to use absolute path to the mesh file, and recommend the use of a ``logLevel`` + of 1 or more to obtain some information about the mesh import, including the list of regions that + are imported with their names, which is particularly useful to fill the field of the + ``CellElementRegions`` block (see below). Some information about the imported surfaces is also provided. -GEOS uses ``ElementRegions`` to support different physics -or to define different constitutive properties. -The ``ElementRegions`` block can contain several ``CellElementRegion`` blocks. A ``CellElementRegion`` is defined as a set of ``CellBlocks``. -A ``CellBlock`` is an ensemble of elements with the same element geometry. +GEOS uses ``ElementRegions`` to support different physics or to define different constitutive properties. +The ``ElementRegions`` block can contain several ``CellElementRegion`` blocks. A ``CellElementRegion`` +is defined as a set of cell-blocks, which are sets of elements with the same element +geometry, defined within the ``cellBlocks`` attribute. + +The naming of cell-blocks depends on if the mesh contains a data array which has the +same value as the ``regionAttribute`` of the ``VTKMesh`` (which is ``attribute`` by default). +This attribute is used to define regions in the vtu file and assign the cells to a given region. -The naming of the imported ``cellBlocks`` depends on whether the data array called ``regionAttribute`` is -present in the vtu file or not. This data array is used to define regions in the vtu file and -assign the cells to a given region. The ``regionAttribute`` is a integer and not a string -(unfortunately). +For now, loaded regions has the following limitations: +- The ``regionAttribute`` can only refer to integer values (no texts), +- Each element can belong to only one region. .. figure:: mesh_multi.png :align: center :width: 500 -In the example presented above, the mesh is is composed of two regions (*Top* and *Bot*). -Each region contains 4 ``cellBlocks``. +In GEOS, there are three different ways to select ``cellBlocks`` in a ``CellElementRegion``: -- If the vtu file does not contain ``regionAttribute``, then all the cells are grouped in a single - region, and the cell block names are just constructed from the cell types (hexahedra, wedges, - tetrahedra, etc). Then in the exemple above, the ``ElementRegions`` can be defined as bellow: +- Using a list of the desired ``regionAttribute`` values. + I.e. ``"{ 1, 2 }"`` selects all the cell-blocks of the ``regionAttribute`` 1 and 2. -.. code-block:: xml +- Using a list of the exact cell-blocks names from the mesh to contain in this CellElementRegion. + I.e. ``{ 1_tetrahedra, 1_pyramid, 1_hexahedra, 2_tetrahedra, 2_pyramid, 2_hexahedra }`` - - - +- Using a list of `fnmatch patterns `_ to match cell-block names to add them in this ``CellElementRegion``. + I.e. ``{ * }`` selects every elements, ``{ 1_* }`` selects the ``{ 1_tetrahedra, 1_pyramid, 1_hexahedra }`` cell-blocks. + +In the example presented above, the mesh is is composed of two regions. Each region contains 4 element types. + +- If the vtu file contains an attribute equals to the ``regionAttribute`` of the ``VTKMesh``, + then all ``cellBlock`` are named with this convention: ``regionAttribute_elementType``. Let's assume that + the top region of the exemple above has ``myAttribute`` to 1, and that the bottom region has ``myAttribute`` to 2, -- If the vtu file contains ``regionAttribute``, then the cells are grouped by regions based on their - individual (numeric) ``regionAttribute``. In that case, the naming convention for the ``cellBlocks`` is - ``regionAttribute_elementType``. Let's assume that the top region of the exemple above is identified - by the ``regionAttribute`` 1, and that the bottom region is identified with 2, - * If we want the ``CellElementRegion`` to contain all the cells, we write: .. code-block:: xml + + + + + + - * If we want two CellElementRegion with the top and bottom regions separated, we write: + + + + + + * If we want two ``CellElementRegion`` with the top and bottom regions separated, we write: .. code-block:: xml + + + + + + + + + + + + + +- If the vtu file does not contain any region attribute field, then all the cells are grouped in a single + region, and cellBlock names consist of just the cell types (hexahedra, wedges, tetrahedra, etc). + Then in the exemple above, the ``ElementRegions`` can be defined as bellow: + +.. code-block:: xml + + + + + + + + + + + + + + + + .. warning:: - We remind the user that **all** the imported ``cellBlocks`` must be included in one of the - ``CellElementRegion``. Even if some cells are meant to be inactive during the simulation, - they still have to be included in a ``CellElementRegion`` (this ``CellElementRegion`` should + **All** the imported ``cellBlocks`` must be included in one (and only one) of the ``CellElementRegion``. + Even if some cells are meant to be inactive during the simulation, they still have to be + included in a ``CellElementRegion`` (this ``CellElementRegion`` should simply not be included as a targetRegion of any of the solvers involved in the simulation). -The keywords for the ``cellBlocks`` element types are : +The ``cellBlocks`` element types are : - `hexahedra `_ - `tetrahedra `_ @@ -286,22 +359,26 @@ An example of a ``vtk`` file with all the physical regions defined is used in :r Importing surfaces ****************** -Surfaces are imported through point sets in GEOS. This feature is supported using only the ``vtk`` file format. +Surfaces are imported through point sets in GEOS. This feature is only supported using the ``vtk`` file format. In the same way than the regions, the surfaces of interests can be defined using the `physical entity names`. -The surfaces are automatically import in GEOS if they exist in the ``vtk`` file. +The surfaces are automatically imported in GEOS if they exist in the ``vtk`` file. Within GEOS, the point set will have the same name than the one given in the file. This name can be used -again to impose boundary condition. For instance, if a surface is named "Bottom" and the user wants to -impose a Dirichlet boundary condition of 0 on it, it can be easily done using this syntax. +again to impose boundary condition. + +For instance, if a surface is named "Bottom" and the user wants to +impose a Dirichlet boundary condition of 0 on it, it can be easily done using this syntax: .. code-block:: xml - + + + The name of the surface of interest appears under the keyword ``setNames``. Again, an example of a ``vtk`` file with the surfaces fully defined is available within :ref:`TutorialFieldCase` or :ref:`ExampleIsothermalHystInjection`. diff --git a/src/coreComponents/mesh/generators/CellBlockABC.hpp b/src/coreComponents/mesh/generators/CellBlockABC.hpp index 6ff5d08ca47..9c1427b7a74 100644 --- a/src/coreComponents/mesh/generators/CellBlockABC.hpp +++ b/src/coreComponents/mesh/generators/CellBlockABC.hpp @@ -53,7 +53,7 @@ class CellBlockABC : public dataRepository::Group /** * @brief Get the type of element in this subregion. - * @return a string specifying the type of element in this subregion + * @return the type of element in this subregion * * See class FiniteElementBase for possible element type. */ diff --git a/src/coreComponents/mesh/generators/CellBlockManager.cpp b/src/coreComponents/mesh/generators/CellBlockManager.cpp index 4e51bb0bcfe..2db3b3cfff2 100644 --- a/src/coreComponents/mesh/generators/CellBlockManager.cpp +++ b/src/coreComponents/mesh/generators/CellBlockManager.cpp @@ -769,6 +769,14 @@ CellBlock & CellBlockManager::registerCellBlock( string const & name ) return this->getCellBlocks().registerGroup< CellBlock >( name ); } +CellBlock & CellBlockManager::registerCellBlock( string const & cellBlockName, + integer regionAttribute ) +{ + CellBlock & cb = this->getCellBlocks().registerGroup< CellBlock >( cellBlockName ); + m_regionAttributesCellBlocks[ regionAttribute ].emplace( cellBlockName ); + return cb; +} + FaceBlock & CellBlockManager::registerFaceBlock( string const & name ) { return this->getFaceBlocks().registerGroup< FaceBlock >( name ); diff --git a/src/coreComponents/mesh/generators/CellBlockManager.hpp b/src/coreComponents/mesh/generators/CellBlockManager.hpp index 8664399b9a4..dcb15629251 100644 --- a/src/coreComponents/mesh/generators/CellBlockManager.hpp +++ b/src/coreComponents/mesh/generators/CellBlockManager.hpp @@ -158,6 +158,9 @@ class CellBlockManager : public CellBlockManagerABC Group & getCellBlocks() override; + std::map< integer, std::set< string > > const & getRegionAttributesCellBlocks() const override + { return m_regionAttributesCellBlocks; } + Group const & getFaceBlocks() const override; Group & getFaceBlocks() override; @@ -171,6 +174,14 @@ class CellBlockManager : public CellBlockManagerABC */ CellBlock & registerCellBlock( string const & name ); + /** + * @brief Registers and returns a cell block of name @p name. + * @param cellBlockName The name of the created cell block. + * @param regionAttribute The region attribute of the created cell block. + * @return A reference to the new cell block. The CellBlockManager owns this new instance. + */ + CellBlock & registerCellBlock( string const & cellBlockName, integer regionAttribute ); + /** * @brief Registers and returns a face block of name @p name. * @param name The name of the created face block. @@ -272,6 +283,8 @@ class CellBlockManager : public CellBlockManagerABC std::map< string, SortedArray< localIndex > > m_nodeSets; + std::map< integer, std::set< string > > m_regionAttributesCellBlocks; + real64 m_globalLength; localIndex m_numNodes; diff --git a/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp b/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp index 4dc7c5e048d..3c474520389 100644 --- a/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp +++ b/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp @@ -113,13 +113,18 @@ class CellBlockManagerABC : public dataRepository::Group * @brief Returns a group containing the cell blocks as CellBlockABC instances * @return Const reference to the Group instance. */ - virtual const Group & getCellBlocks() const = 0; + virtual Group const & getCellBlocks() const = 0; /** * @brief Returns a group containing the face blocks as FaceBlockABC instances * @return Const reference to the Group instance. */ - virtual const Group & getFaceBlocks() const = 0; + virtual Group const & getFaceBlocks() const = 0; + + /** + * @return A map of the cellblocks list for each region attribute values. + */ + virtual std::map< integer, std::set< string > > const & getRegionAttributesCellBlocks() const = 0; /** * @brief Total number of nodes across all the cell blocks. diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index 5d98c6449c3..0536ce29fbe 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -96,7 +96,8 @@ InternalMeshGenerator::InternalMeshGenerator( string const & name, Group * const registerWrapper( viewKeyStruct::elementTypesString(), &m_elementType ). setInputFlag( InputFlags::REQUIRED ). setSizedFromParent( 0 ). - setDescription( "Element types of each mesh block" ); + setDescription( GEOS_FMT( "Element types of each mesh block. Use \"C3D8\" for linear brick element. Possible values are: {}.", + stringutilities::join( EnumStrings< ElementType >::get(), ", " ) ) ); registerWrapper( viewKeyStruct::trianglePatternString(), &m_trianglePattern ). setApplyDefaultValue( 0 ). diff --git a/src/coreComponents/mesh/generators/VTKUtilities.cpp b/src/coreComponents/mesh/generators/VTKUtilities.cpp index 81533728d32..72045afa4e5 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.cpp @@ -1817,36 +1817,6 @@ void fillCellBlock( vtkDataSet & mesh, } } -/** - * @brief Returns a string describing the element. - * @param[in] type The element type. - * @return The name. - * @warning This information will be visible in the input file... Consider refactoring with great care. - */ -string getElementTypeName( ElementType const type ) -{ - switch( type ) - { - case ElementType::Hexahedron: return "hexahedra"; - case ElementType::Tetrahedron: return "tetrahedra"; - case ElementType::Wedge: return "wedges"; - case ElementType::Pyramid: return "pyramids"; - case ElementType::Prism5: return "pentagonalPrisms"; - case ElementType::Prism6: return "hexagonalPrisms"; - case ElementType::Prism7: return "heptagonalPrisms"; - case ElementType::Prism8: return "octagonalPrisms"; - case ElementType::Prism9: return "nonagonalPrisms"; - case ElementType::Prism10: return "decagonalPrisms"; - case ElementType::Prism11: return "hendecagonalPrisms"; - case ElementType::Polyhedron: return "polyhedra"; - default: - { - GEOS_ERROR( "Element type '" << type << "' is not supported" ); - return {}; - } - } -} - void importMaterialField( std::vector< vtkIdType > const & cellIds, vtkDataArray * vtkArray, WrapperBase & wrapper ) @@ -2143,7 +2113,7 @@ void writeCells( integer const logLevel, GEOS_LOG_RANK_0_IF( logLevel >= 1, "Importing cell block " << cellBlockName ); // Create and resize the cell block. - CellBlock & cellBlock = cellBlockManager.registerCellBlock( cellBlockName ); + CellBlock & cellBlock = cellBlockManager.registerCellBlock( cellBlockName, regionId ); cellBlock.setElementType( elemType ); cellBlock.resize( LvArray::integerConversion< localIndex >( cellIds.size() ) ); diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 133fb0acdc7..a3d062cbb7f 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -50,12 +50,12 @@ - + - + @@ -1523,7 +1523,7 @@ stress - traction is applied to the faces as specified by the inner product of i - + @@ -1627,7 +1627,7 @@ stress - traction is applied to the faces as specified by the inner product of i - + @@ -6284,7 +6284,8 @@ The expected format is "{ waterMax, oilMax }", in that order--> - + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 215191d89f5..e982b4f9e2b 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -50,12 +50,12 @@ - + - + diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT.xml index aacf9b001c0..cb59ac5f35c 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT.xml @@ -113,7 +113,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine.xml index 12ec4e62d8d..a48e22dfbe5 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2Brine.xml @@ -147,7 +147,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2BrineTables.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2BrineTables.xml index 4a667e05691..4db6d9f6b7a 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2BrineTables.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_CO2BrineTables.xml @@ -96,7 +96,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_PhaseComposition.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT_PhaseComposition.xml index 75d490e6a50..5207c9746d9 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT_PhaseComposition.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_PhaseComposition.xml @@ -149,7 +149,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_docExample.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT_docExample.xml index b1747d41dd3..872a6a54a4c 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT_docExample.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_docExample.xml @@ -70,7 +70,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.xml b/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.xml index 65a3c58cf4f..d37ed605c49 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.xml @@ -74,7 +74,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggCase1.xml b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggCase1.xml index b88f0be473f..f60770dd5e0 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggCase1.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggCase1.xml @@ -66,7 +66,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggCase2.xml b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggCase2.xml index f61bf8507bc..f89a07a98cf 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggCase2.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggCase2.xml @@ -65,7 +65,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggLoadPathDryUseLinear.xml b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggLoadPathDryUseLinear.xml index 4fb6558ae89..10ca3761690 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggLoadPathDryUseLinear.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggLoadPathDryUseLinear.xml @@ -66,7 +66,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggLoadPathWetUseLinear.xml b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggLoadPathWetUseLinear.xml index d365bb0e506..f8e2dd37298 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggLoadPathWetUseLinear.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggLoadPathWetUseLinear.xml @@ -66,7 +66,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggUseLinear.xml b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggUseLinear.xml index 69703b7ad1f..dd42c6b0330 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggUseLinear.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_delftEggUseLinear.xml @@ -66,7 +66,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_druckerPragerExtended.xml b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_druckerPragerExtended.xml index cd4849ab65b..f92445a9639 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_druckerPragerExtended.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_druckerPragerExtended.xml @@ -66,7 +66,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_elasticIsotropic.xml b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_elasticIsotropic.xml index 57beb56efc0..dde6e2b9a66 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_elasticIsotropic.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_elasticIsotropic.xml @@ -61,7 +61,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_elasticIsotropicPressureDependent.xml b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_elasticIsotropicPressureDependent.xml index 585599a36e3..beb0a7f5d99 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_elasticIsotropicPressureDependent.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_elasticIsotropicPressureDependent.xml @@ -57,7 +57,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_modifiedCamClay.xml b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_modifiedCamClay.xml index c1ae1b25dec..03b171303db 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_modifiedCamClay.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_modifiedCamClay.xml @@ -66,7 +66,7 @@ diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_modifiedCamClayVolumetric.xml b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_modifiedCamClayVolumetric.xml index d6075857430..b55ed3a520a 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial_modifiedCamClayVolumetric.xml +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial_modifiedCamClayVolumetric.xml @@ -60,7 +60,7 @@ diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp index d27adf38c87..032d6a191ab 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp @@ -67,7 +67,7 @@ TEST( testGroupPath, testGlobalPaths ) diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp index 18bcdb53c8e..12288b381e0 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp @@ -20,6 +20,7 @@ #include "fieldSpecification/FieldSpecificationManager.hpp" #include "mesh/DomainPartition.hpp" #include "mesh/generators/CellBlockManager.hpp" +#include "mesh/CellElementRegionSelector.hpp" #include "common/GEOS_RAJA_Interface.hpp" #include "common/DataTypes.hpp" #include "common/TimingMacros.hpp" @@ -98,13 +99,15 @@ TEST( FieldSpecification, Recursive ) reg1Tet.setElementType( geos::ElementType::Tetrahedron ); reg1Tet.resize( nbTetReg1 ); + Group const & cellBlocks = cellBlockManager.getCellBlocks(); + reg0.addCellBlockName( reg0Hex.getName() ); reg0.addCellBlockName( reg0Tet.getName() ); - reg0.generateMesh( cellBlockManager.getCellBlocks() ); + reg0.generateMesh( cellBlocks ); reg1.addCellBlockName( reg1Hex.getName() ); reg1.addCellBlockName( reg1Tet.getName() ); - reg1.generateMesh( cellBlockManager.getCellBlocks() ); + reg1.generateMesh( cellBlocks ); // The cell block manager should not be used anymore. domain.deregisterGroup( keys::cellManager ); diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp index 13b6f4acf2d..31f816164e1 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp @@ -68,7 +68,7 @@ char const * xmlInput = - + - + - + diff --git a/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp index 54b1798007d..f0eea49be3a 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp @@ -80,7 +80,7 @@ char const * xmlInput = diff --git a/src/coreComponents/unitTests/meshTests/CMakeLists.txt b/src/coreComponents/unitTests/meshTests/CMakeLists.txt index fe8cca29817..1bd39c09f11 100644 --- a/src/coreComponents/unitTests/meshTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/meshTests/CMakeLists.txt @@ -2,7 +2,8 @@ set( gtest_geosx_tests testMeshEnums.cpp testMeshGeneration.cpp - testNeighborCommunicator.cpp ) + testNeighborCommunicator.cpp + testElementRegions.cpp ) set( gtest_geosx_mpi_tests testNeighborCommunicator.cpp ) diff --git a/src/coreComponents/unitTests/meshTests/box_hybrid_mesh.vtu b/src/coreComponents/unitTests/meshTests/box_hybrid_mesh.vtu new file mode 100644 index 0000000000000000000000000000000000000000..60d2c15b5de3eb1eff604e7f2d75a4496677635e GIT binary patch literal 503362 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 T`Kgb(s+;=qtC#xmuiEFk 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 literal 0 HcmV?d00001 diff --git a/src/coreComponents/unitTests/meshTests/testElementRegions.cpp b/src/coreComponents/unitTests/meshTests/testElementRegions.cpp new file mode 100644 index 00000000000..3202f0b71fb --- /dev/null +++ b/src/coreComponents/unitTests/meshTests/testElementRegions.cpp @@ -0,0 +1,236 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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. + * ------------------------------------------------------------------------------------------------------------ + */ + +// TPL includes +#include + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "dataRepository/xmlWrapper.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mainInterface/initialization.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/generators/CellBlockManagerABC.hpp" +#include "mesh/generators/CellBlockABC.hpp" + +// special CMake-generated include +#include "tests/meshDirName.hpp" + +using namespace geos; +using namespace geos::testing; +using namespace geos::dataRepository; + + +CommandLineOptions g_commandLineOptions; + +struct TestCase +{ + string name; + bool isExpectedToPass = true; + std::vector< string > stringsToMention; + string_view xmlRegions; +}; + +class ElementRegionTestFixture : public ::testing::TestWithParam< TestCase > +{ +public: + ElementRegionTestFixture(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + + virtual ~ElementRegionTestFixture() = default; +private: + GeosxState state; +}; + +TEST_P( ElementRegionTestFixture, testVTKImportRegionSyntaxes ) +{ + TestCase const testCase = GetParam(); + + string const pattern = + R"xml( + + + + + + {} + + + )xml"; + string const xmlInput = GEOS_FMT( pattern, + testMeshDir + "/box_hybrid_mesh.vtu", + testCase.xmlRegions ); + + ProblemManager & problem = getGlobalState().getProblemManager(); + problem.parseInputString( xmlInput ); + + if( testCase.isExpectedToPass ) + { + try + { + EXPECT_NO_FATAL_FAILURE( problem.problemSetup() ) << GEOS_FMT( "Test case '{}' did throw an error.", + testCase.name ); + } + catch( std::exception const & e ) + { + GTEST_FAIL() << GEOS_FMT( "Test case '{}' did throw an exception ({}) but was not expected to :\n{}", + testCase.name, LvArray::system::demangle( typeid( e ).name() ), e.what() ); + } + } + else + { + try + { + EXPECT_NO_FATAL_FAILURE( problem.problemSetup() ) << GEOS_FMT( "Test case '{}' did throw an error.", + testCase.name ); + GTEST_FAIL() << GEOS_FMT( "Test case '{}' did not thrown any exception but was expected to.", + testCase.name ); + } + catch( InputError const & e ) + { + string const expStr = e.what(); + for( auto const & str : testCase.stringsToMention ) + { + bool isExceptionContainingStr = expStr.find( str ) != string::npos; + EXPECT_TRUE( isExceptionContainingStr ) << GEOS_FMT( "Test case '{}' exception did not mention the string '{}'. Exception string:\n{}", + testCase.name, str, e.what() ); + } + } + catch( std::exception const & e ) + { + GTEST_FAIL() << GEOS_FMT( "Test case '{}' did throw an exception ({}) but was not expected to :\n{}", + testCase.name, LvArray::system::demangle( typeid( e ).name() ), e.what() ); + } + catch( ... ) + { + GTEST_FAIL() << GEOS_FMT( "Test case '{}': Unexpected exception.", + testCase.name ); + } + } +} + +TestCase const vtkImportRegionSyntaxCases[] = { + { // should not crash + "regular cell-block list", true, { }, + R"xml( + + + )xml" + }, + { // crash because of not existing primitive (2_pendecagonalPrism) + "non existing 2_pendecagonalPrism", false, { "reservoir", "2_pendecagonalPrism" }, + R"xml( + + + )xml" + }, + { // crash because of not unknown primitive name (helloWorld) + "non existing helloWorld", false, { "overburden", "helloWorld" }, + R"xml( + + + )xml" + }, + { // crash because of lacking one primitive (1_hexahedra) + "lacking 1_hexahedra", false, { "1_hexahedra" }, + R"xml( + + + )xml" + }, + { // mentioning the same cell-blocks in multiple regions (1_hexahedra) + "multiple 1_hexahedra", false, { "overburden", "reservoir", "1_hexahedra" }, + R"xml( + + + )xml" + }, + { // should not crash + "regular region attribute list", true, { }, + R"xml( + + + )xml" + }, + { // mentioning the same region attribute in multiple cellBlocks (6 in overburden & reservoir) + "multiple region 1", false, { "6", "region attribute", "overburden", "reservoir" }, + R"xml( + + + )xml" + }, + { // forgetting a region attribute (5) + "forget region 5", false, { "5", "region attribute" }, + R"xml( + + + )xml" + }, + { // should not crash + "regular * wildcard", true, { }, + R"xml( + + )xml" + }, + { // mentioning the same regions in multiple cellBlocks (because of "*") + "* wildcard + region list", false, { "2", "6", "everything", "reservoir" }, + R"xml( + + + )xml" + }, + { // should not crash + "mixing selection methods on 2 regions", true, { }, + R"xml( + + + )xml" + }, + { // should not crash + "mixing all selection methods on 1 region", true, { }, + R"xml( + + )xml" + } +}; +INSTANTIATE_TEST_SUITE_P( testElementRegions, ElementRegionTestFixture, + ::testing::ValuesIn( vtkImportRegionSyntaxCases ) ); + + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + + int const result = RUN_ALL_TESTS(); + + geos::basicCleanup(); + + return result; +} diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp index 96f14de0bfe..11664efc437 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp @@ -99,7 +99,7 @@ char const * xmlInput = diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp index 983b1c2e1c3..bb9a6eef28e 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp @@ -106,7 +106,7 @@ char const * xmlInput = diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp index 3c9eeb20659..e05e49735ae 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp @@ -104,7 +104,7 @@ char const * xmlInput = diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp index c5884ee9fd1..10fa8cae06f 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp @@ -106,7 +106,7 @@ char const * xmlInput = diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp index 3401166c3ae..0835f9c45c4 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp @@ -97,7 +97,7 @@ char const * PostXmlInput = diff --git a/src/coreComponents/unitTests/xmlTests/basic_input.xml b/src/coreComponents/unitTests/xmlTests/basic_input.xml index 37c611aa479..3735d47c0f4 100644 --- a/src/coreComponents/unitTests/xmlTests/basic_input.xml +++ b/src/coreComponents/unitTests/xmlTests/basic_input.xml @@ -46,7 +46,7 @@ diff --git a/src/coreComponents/unitTests/xmlTests/multifile_input/solver.xml b/src/coreComponents/unitTests/xmlTests/multifile_input/solver.xml index c1e25343bc3..9b2bc1e11e2 100644 --- a/src/coreComponents/unitTests/xmlTests/multifile_input/solver.xml +++ b/src/coreComponents/unitTests/xmlTests/multifile_input/solver.xml @@ -29,7 +29,7 @@ diff --git a/src/coreComponents/unitTests/xmlTests/testXML.cpp b/src/coreComponents/unitTests/xmlTests/testXML.cpp index 5d010686ac1..40fa4f64f9b 100644 --- a/src/coreComponents/unitTests/xmlTests/testXML.cpp +++ b/src/coreComponents/unitTests/xmlTests/testXML.cpp @@ -64,7 +64,7 @@ TEST( testXML, testXMLString ) diff --git a/src/docs/sphinx/basicExamples/co2Injection/Example.rst b/src/docs/sphinx/basicExamples/co2Injection/Example.rst index 63f0c4f0add..d73796de79b 100644 --- a/src/docs/sphinx/basicExamples/co2Injection/Example.rst +++ b/src/docs/sphinx/basicExamples/co2Injection/Example.rst @@ -134,8 +134,9 @@ The **TwoPointFluxApproximation** is chosen for the fluid equation discretizatio Element regions --------------- -We define a **CellElementRegion** pointing to the cell block defining the reservoir mesh, and a **WellElementRegion** for the well. +We define a **CellElementRegion** pointing to all reservoir mesh cells, and a **WellElementRegion** for the well. The two regions contain a list of constitutive model names. +The keyword "all" is used here to automatically select all cells of the mesh. .. literalinclude:: ../../../../../inputFiles/compositionalMultiphaseWell/simpleCo2InjTutorial_base.xml :language: xml diff --git a/src/docs/sphinx/basicExamples/multiphaseFlow/Example.rst b/src/docs/sphinx/basicExamples/multiphaseFlow/Example.rst index b0a8183bfd6..341e7a22d46 100644 --- a/src/docs/sphinx/basicExamples/multiphaseFlow/Example.rst +++ b/src/docs/sphinx/basicExamples/multiphaseFlow/Example.rst @@ -82,7 +82,7 @@ Mesh ------- In this simulation, we define a simple mesh generated internally using the **InternalMesh** generator, as -illustrated in the previous examples. +illustrated in the first tutorial (:ref:`TutorialSinglePhaseFlowWithInternalMesh`). The mesh dimensions and cell sizes are chosen to be those specified in the SPE10 test case, but are limited to the two bottom layers. The mesh description must be done in meters. @@ -173,13 +173,12 @@ Reservoir region In the **ElementRegions** XML block, we define a **CellElementRegion** named ``reservoir`` corresponding to the reservoir mesh. -The attribute ``cellBlocks`` is set to ``block`` to point this element region -to the hexahedral mesh defined internally. +``cellBlocks`` is set to ``{ * }`` to automatically target every cells of the mesh. The **CellElementRegion** must also point to the constitutive models that are used to update the dynamic rock and fluid properties in the cells of the reservoir mesh. The names ``fluid``, ``rock``, and ``relperm`` used for this in the ``materialList`` -correspond to the attribute ``name`` of the **Constitutive** block. +correspond to the **Constitutive** blocks with the coresponding names. .. literalinclude:: ../../../../../inputFiles/compositionalMultiphaseFlow/benchmarks/SPE10/deadOilSpe10Layers84_85_base_iterative.xml :language: xml diff --git a/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst b/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst index 1afb1185816..7fb95a4a927 100644 --- a/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst +++ b/src/docs/sphinx/basicExamples/multiphaseFlowWithWells/Example.rst @@ -242,11 +242,8 @@ In this section of the input file, we follow the procedure described in :ref:`TutorialDeadOilBottomLayersSPE10` for the definition of the reservoir region with multiphase constitutive models. We associate a **CellElementRegion** named ``reservoir`` to the reservoir mesh. -Since we have imported a mesh with one region consisting of hexahedral cells, we -must set the attribute ``cellBlocks`` to ``hexahedra``. - -.. note:: - If you use a name that is not ``hexahedra`` for this attribute, GEOS will throw an error at the beginning of the simulation. +Since we have imported a mesh with only one region, we can set ``cellBlocks`` to ``{ * }`` +(we could also set ``cellBlocks`` to ``{ hexahedra }`` as the mesh has only hexahedral cells). We also associate a **WellElementRegion** to each well. As the **CellElementRegion**, it contains a ``materialList`` that must point (by name) to the constitutive models diff --git a/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst b/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst index 2b09f25e2e4..c08d0890e76 100644 --- a/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst +++ b/src/docs/sphinx/developerGuide/Contributing/Sphinx.rst @@ -5,24 +5,26 @@ Sphinx Documentation Generating the documentation ==================================== -- To generate the documentation files, you will need to install Sphinx using +- To generate the documentation files, you will need to install Sphinx using: .. code-block:: sh - sudo apt install python-sphinx + pip -m install sphinx + pip -m install sphinx-design sphinx-argparse sphinxcontrib-plantuml sphinxcontrib.programoutput sphinx_rtd_theme + pip -m install scipy - Then you can generate the documentation files with the following commands +- Then you can generate the documentation files with the following commands: - .. code-block:: sh + .. code-block:: sh - cd GEOS/build-your-platform-release - make geosx_docs + cd /path/to/GEOS/build-your-platform-release + make geosx_docs - That will create a new folder .. code-block:: sh - GEOS/build-your-platform-release/html/docs/sphinx + /path/to/GEOS/build-your-platform-release/html/docs/sphinx which contains all the html files generated. diff --git a/src/docs/sphinx/tutorials/step01/Tutorial.rst b/src/docs/sphinx/tutorials/step01/Tutorial.rst index cd3c85fcd7a..8c9b5697689 100644 --- a/src/docs/sphinx/tutorials/step01/Tutorial.rst +++ b/src/docs/sphinx/tutorials/step01/Tutorial.rst @@ -202,7 +202,7 @@ Keeping things simple, our element collection has only one type of element: a `` A mesh can contain several geometrical types of elements. For numerical convenience, elements are aggregated by types into ``cellBlocks``. -Here, we only linear 8-node brick elements, so the entire domain is one object called ``cellBlock``. +Here, we only have linear 8-node brick elements, so the entire domain is one object called ``cellBlock``. **xCoords, yCoords, zCoords, nx, ny, nz** @@ -311,7 +311,9 @@ to regions of elements. Here, we use only one **CellElementRegion** to represent the entire domain (user name: ``mainRegion``). It contains all the blocks called ``cellBlock`` defined in the mesh section. We specify the materials contained in that region using a ``materialList``. -Several materials coexist in ``cellBlock``, and we list them using their user-defined names: ``water``, ``rockPorosity``, and ``rockPerm``, etc. What these names mean, and the physical properties that they are attached to are defined next. +Several materials coexist in ``cellBlock``, and we list them using their user-defined names: +``water`` and ``rock`` in this exemple. +Each material is a definition of physical properties. .. literalinclude:: ../../../../../inputFiles/singlePhaseFlow/3D_10x10x10_compressible_base.xml diff --git a/src/docs/sphinx/tutorials/step02/Tutorial.rst b/src/docs/sphinx/tutorials/step02/Tutorial.rst index 06b51144eb7..2682d28d786 100644 --- a/src/docs/sphinx/tutorials/step02/Tutorial.rst +++ b/src/docs/sphinx/tutorials/step02/Tutorial.rst @@ -157,12 +157,11 @@ Here is the ``vtk`` file : GEOS can run different physical solvers on different regions of the mesh at different times. Here, to keep things simple, we run one solver (single-phase flow) on the entire domain throughout the simulation. -Even this is trivial, we need to define and name a region encompassing the entire domain -and assign it to the single-phase flow solver. -We also need to provide material properties to the regions. -This is done by specifying ``ElementRegions``. -Here, the entire field is one region called ``Domain``, -and contains multiple constitutive models, including ``water``, ``rockPorosity``, and ``rockPerm``. +To do so, we need to define a region encompassing the entire domain. +We will name it ``Domain``, as refered to in the single-phase flow solver (in its ``targetRegions``), +and list its constitutive models in the ``materialList``, which are ``water`` and ``rock``. +Since we have imported a mesh with only one region, we can set ``cellBlocks`` to ``{ * }`` +(we have could also set ``cellBlocks`` to ``{ hexahedra }`` as the mesh has only hexahedral cells). .. literalinclude:: ../../../../../inputFiles/singlePhaseFlow/vtk/3D_10x10x10_compressible_hex_gravity_base.xml @@ -171,6 +170,11 @@ and contains multiple constitutive models, including ``water``, ``rockPorosity`` :end-before: +.. note:: + If you use a name that is not ``hexahedra`` or ``all`` for this attribute, or if the mesh is + changed and have not-hexahedral cells, GEOS will throw an error at the beginning of the + simulation. See :ref:`Meshes` for more information. + Running GEOS ---------------------------------------- @@ -326,7 +330,9 @@ And the ``vtk`` file starts as follows (notice the tetrahedral point coordinates :caption: cube_10x10x10_tet.vtk :lines: 1-20 -Again, the entire field is one region called ``Domain`` and contains ``water`` and ``rock`` only. +Again, the entire field is one region called ``Domain`` which contains ``water`` and ``rock``. +Since we have imported a mesh with only one region, we can again set ``cellBlocks`` to ``{ * }`` +(we have could also set ``cellBlocks`` to ``{ tetrahedra }`` as the mesh has only tetrahedric cells). .. literalinclude:: ../../../../../inputFiles/singlePhaseFlow/vtk/3D_10x10x10_compressible_tetra_gravity_base.xml :language: xml diff --git a/src/docs/sphinx/tutorials/step03/Tutorial.rst b/src/docs/sphinx/tutorials/step03/Tutorial.rst index 6d760c3d033..c9aa49fce57 100644 --- a/src/docs/sphinx/tutorials/step03/Tutorial.rst +++ b/src/docs/sphinx/tutorials/step03/Tutorial.rst @@ -38,9 +38,9 @@ We consider the following mesh as a numerical support to the simulations in this This mesh contains three continuous regions: - - a Top region (overburden, elementary tag = `Overburden`) - - a Middle region (reservoir layer, elementary tag = `Reservoir`) - - a Bottom region (underburden, elementary tag = `Underburden`) + - a Bottom region (underburden, elementary tag = `Underburden`, attribute = ``1``) + - a Middle region (reservoir layer, elementary tag = `Reservoir`, attribute = ``2``) + - a Top region (overburden, elementary tag = `Overburden`, attribute = ``3``) .. image:: reservoir_transparent.png :width: 600px @@ -169,31 +169,17 @@ Regions Assuming that the overburden and the underburden are impermeable, and flow only takes place in the reservoir, we need to define regions. -There are two methods to achieve this regional solve. +We need to define all the ``CellElementRegions`` according to the ``attribute`` values of the VTK file +(which are respectively ``1``, ``2`` and ``3`` for each region). As mentioned above, the solvers is only +applied on the reservoir layer, (on region ``2``). In this case, the **ElementRegions** tag is : -- The first solution is to define a unique ``CellElementRegion`` corresponding to the reservoir. - - .. code-block:: xml - - - - - -- The second solution is to define all the ``CellElementRegions`` as they are in the VTK file, but defining the solvers only on the reservoir layer. In this case, the **ElementRegions** tag is : - - .. literalinclude:: ../../../../../inputFiles/singlePhaseFlow/FieldCaseTutorial3_base.xml - :language: xml - :start-after: - :end-before: - -We opt for the latest as it allows to visualize over- and underburdens and to change regions handling in their tag without needing to amend the **ElementRegion** tag. +.. literalinclude:: ../../../../../inputFiles/singlePhaseFlow/FieldCaseTutorial3_base.xml + :language: xml + :start-after: + :end-before: .. note:: - The material list here was set for a single-phase flow problem. This list is subject - to change if the problem is not a single-phase flow problem. + This material list here is subject to change if the problem is not a single-phase flow problem. .. _Constitutive_tag_field_case: diff --git a/src/pygeosx/pyssle.xml b/src/pygeosx/pyssle.xml index 99361955283..82024bb7dc6 100644 --- a/src/pygeosx/pyssle.xml +++ b/src/pygeosx/pyssle.xml @@ -49,7 +49,7 @@ diff --git a/src/pygeosx/unitTests/dataRepositoryTests/pygeosx_only.xml b/src/pygeosx/unitTests/dataRepositoryTests/pygeosx_only.xml index 7625dfd3831..085db97cd7d 100644 --- a/src/pygeosx/unitTests/dataRepositoryTests/pygeosx_only.xml +++ b/src/pygeosx/unitTests/dataRepositoryTests/pygeosx_only.xml @@ -30,7 +30,7 @@ From b43e001aec954f266662b787ea32250b4aaec396 Mon Sep 17 00:00:00 2001 From: MelReyCG <122801580+MelReyCG@users.noreply.github.com> Date: Fri, 18 Oct 2024 19:00:41 +0200 Subject: [PATCH 224/286] fix: Regex validation bugfix & unit test (#3403) --- .../codingUtilities/EnumStrings.hpp | 2 +- .../unitTests/testXmlWrapper.cpp | 27 +++++++ .../dataRepository/xmlWrapper.cpp | 4 +- src/coreComponents/schema/schema.xsd | 70 +++++++++++++++++++ src/coreComponents/schema/schema.xsd.other | 18 +++++ 5 files changed, 118 insertions(+), 3 deletions(-) diff --git a/src/coreComponents/codingUtilities/EnumStrings.hpp b/src/coreComponents/codingUtilities/EnumStrings.hpp index d975e7cbc3e..0c6bc40065d 100644 --- a/src/coreComponents/codingUtilities/EnumStrings.hpp +++ b/src/coreComponents/codingUtilities/EnumStrings.hpp @@ -179,7 +179,7 @@ struct TypeRegex< ENUM, std::enable_if_t< internal::HasEnumStrings< ENUM > > > static Regex get() { return Regex( EnumStrings< ENUM >::concat( "|" ), - "Input value must be one of { " + EnumStrings< ENUM >::concat( ", " ) + "}." ); + "Input value must be one of { " + EnumStrings< ENUM >::concat( ", " ) + " }." ); } }; diff --git a/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp b/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp index ea1676cb17d..32141eb0e28 100644 --- a/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp +++ b/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp @@ -16,6 +16,7 @@ #include #include "dataRepository/xmlWrapper.hpp" +#include "codingUtilities/EnumStrings.hpp" using namespace geos; @@ -328,6 +329,32 @@ INSTANTIATE_TEST_SUITE_P( std::make_tuple( "1 2", 0, true ))); +enum class TestEnum { None, Default, Value, Value2 }; +ENUM_STRINGS( TestEnum, "None", "Default", "Value", "Value2" ); + +class enumAttributeTestFixture : public AttributeReadTestFixture< TestEnum > {}; + +TEST_P( enumAttributeTestFixture, testParsing ) +{ + testParams = GetParam(); + this->test(); +} + +INSTANTIATE_TEST_SUITE_P( + enumAttributeTests, + enumAttributeTestFixture, + ::testing::Values( std::make_tuple( "None", TestEnum::None, false ), + std::make_tuple( "Default", TestEnum::Default, false ), + std::make_tuple( "Value", TestEnum::Value, false ), + std::make_tuple( "Value2", TestEnum::Value2, false ), + std::make_tuple( "0", TestEnum( 0 ), true ), + std::make_tuple( "4.", TestEnum( 0 ), true ), + std::make_tuple( "alpha", TestEnum( 0 ), true ), + std::make_tuple( "Val", TestEnum( 0 ), true ), + std::make_tuple( "Def ault", TestEnum( 0 ), true ), + std::make_tuple( "None123", TestEnum( 0 ), true ) ) ); + + TEST( testXmlWrapper, testGroupNamesFormats ) { struct GroupNameTest diff --git a/src/coreComponents/dataRepository/xmlWrapper.cpp b/src/coreComponents/dataRepository/xmlWrapper.cpp index ddca0c0e8eb..e2e7d85332c 100644 --- a/src/coreComponents/dataRepository/xmlWrapper.cpp +++ b/src/coreComponents/dataRepository/xmlWrapper.cpp @@ -35,8 +35,8 @@ namespace xmlWrapper void validateString( string const & value, Regex const & regex ) { std::smatch m; - bool inputValidated = std::regex_search( value, m, std::regex( regex.m_regexStr ) ); - if( !inputValidated || m.length() != ptrdiff_t( value.length() ) ) + bool inputValidated = std::regex_match( value, m, std::regex( regex.m_regexStr ) ); + if( !inputValidated ) { ptrdiff_t errorId = ( m.size()>0 && m.position( 0 )==0 ) ? m.length() : 0; GEOS_THROW( GEOS_FMT( "Input string validation failed at:\n" diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index a3d062cbb7f..6c137c9f37f 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -437,6 +437,10 @@ + + + + @@ -519,6 +523,10 @@ + + + + @@ -2197,6 +2205,7 @@ the relative residual norm satisfies: + @@ -3912,6 +3921,51 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3927,6 +3981,8 @@ Local- Add jump stabilization on interior of macro elements--> + + @@ -4374,6 +4430,7 @@ Level 0 outputs no specific information for this solver. Higher levels require m + @@ -4554,6 +4611,19 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index e982b4f9e2b..5474981e8d5 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -534,6 +534,7 @@ + @@ -1156,6 +1157,21 @@ + + + + + + + + + + + + + + + @@ -1337,6 +1353,7 @@ + @@ -1366,6 +1383,7 @@ + From 9ee88f74b9ecc99a8176c325be86ed32143f7a80 Mon Sep 17 00:00:00 2001 From: Stefano Frambati Date: Fri, 25 Oct 2024 11:36:41 +0200 Subject: [PATCH 225/286] removed offending free on device (#3409) --- .../isotropic/AcousticFirstOrderWaveEquationSEM.cpp | 2 -- .../secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp | 2 -- .../secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp | 3 +-- .../isotropic/ElasticFirstOrderWaveEquationSEM.cpp | 2 -- .../secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp | 2 -- 5 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 39b2334d532..04acea63db0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -261,8 +261,6 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev baseMesh.getNodeManager().elementList().toView().freeOnDevice(); baseMesh.getFaceManager().nodeList().toView().freeOnDevice(); baseMesh.getNodeManager().referencePosition().freeOnDevice(); - m_sourceCoordinates.freeOnDevice(); - m_receiverCoordinates.freeOnDevice(); facesToNodes.freeOnDevice(); nodesToElements.freeOnDevice(); } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index edf012c68d8..7b31605c01f 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -212,8 +212,6 @@ void AcousticVTIWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & ba baseMesh.getNodeManager().elementList().toView().freeOnDevice(); baseMesh.getFaceManager().nodeList().toView().freeOnDevice(); baseMesh.getNodeManager().referencePosition().freeOnDevice(); - m_sourceCoordinates.freeOnDevice(); - m_receiverCoordinates.freeOnDevice(); facesToNodes.freeOnDevice(); nodesToElements.freeOnDevice(); } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 6e1852d0a55..eb427d14afb 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -221,8 +221,6 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseM baseMesh.getNodeManager().elementList().toView().freeOnDevice(); baseMesh.getFaceManager().nodeList().toView().freeOnDevice(); baseMesh.getNodeManager().referencePosition().freeOnDevice(); - m_sourceCoordinates.freeOnDevice(); - m_receiverCoordinates.freeOnDevice(); facesToNodes.freeOnDevice(); nodesToElements.freeOnDevice(); } @@ -1081,6 +1079,7 @@ void AcousticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, acousticfields::AuxiliaryVar4PML::key() } ); } + CommunicationTools & syncFields = CommunicationTools::getInstance(); syncFields.synchronizeFields( fieldsToBeSync, mesh, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index ff99332815d..56f40118507 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -313,8 +313,6 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve baseMesh.getNodeManager().elementList().toView().freeOnDevice(); baseMesh.getFaceManager().nodeList().toView().freeOnDevice(); baseMesh.getNodeManager().referencePosition().freeOnDevice(); - m_sourceCoordinates.freeOnDevice(); - m_receiverCoordinates.freeOnDevice(); facesToNodes.freeOnDevice(); nodesToElements.freeOnDevice(); } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index b6e28c5f3d5..ba641a8d53f 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -336,8 +336,6 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMe baseMesh.getNodeManager().elementList().toView().freeOnDevice(); baseMesh.getFaceManager().nodeList().toView().freeOnDevice(); baseMesh.getNodeManager().referencePosition().freeOnDevice(); - m_sourceCoordinates.freeOnDevice(); - m_receiverCoordinates.freeOnDevice(); facesToNodes.freeOnDevice(); nodesToElements.freeOnDevice(); } From cd8175d5cef21a82a6558443ddb7f18600d5bb20 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Sat, 26 Oct 2024 10:15:18 -0500 Subject: [PATCH 226/286] fix: Bug fix for residual computation (#3399) --- .../fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp index a27d879c215..d39b7f51ddc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -911,7 +911,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 3 > // step 2: volume residual real64 const valVol = LvArray::math::abs( m_localResidual[stack.localRow + m_numComponents] ) / volumeNormalizer; - if( valVol > stack.localValue[0] ) + if( valVol > stack.localValue[1] ) { stack.localValue[1] = valVol; } @@ -919,7 +919,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 3 > // step 3: energy residual real64 const valEnergy = LvArray::math::abs( m_localResidual[stack.localRow + m_numComponents + 1] ) / energyNormalizer; - if( valEnergy > stack.localValue[1] ) + if( valEnergy > stack.localValue[2] ) { stack.localValue[2] = valEnergy; } From 890c5e756c3163fafd587cac7ea3ce3303cb5c7e Mon Sep 17 00:00:00 2001 From: Tom Byer <149726499+tjb-ltk@users.noreply.github.com> Date: Thu, 31 Oct 2024 11:27:43 -0700 Subject: [PATCH 227/286] feat: feature/byer3/thermal well (#3156) * Add support for mass constraits (inj wells only) * Throw error if massinj constraint and useSurfaceConditions set to 0, fix error message for negative mass rate * thermal devs- 1) energy eqn for perf in/out flows, 2) reservoir well coupling 3) residualnomr calcs, 4) some isothermal , 5) refactoring 6) next focus solution updating/scaling * 1) fix isthermal well field runtime error 2) fix refactored isothermal flux index bug 3) 2 isothermal models tested with refactored code 4) thermal case crashes at 2nd linear solve well internal energy derivative = 0 * thermal well devs - 1) derivative bugfixes 2) added thermal to post linear solve well methods 3) next step verify simple test case results * thermal devs - 1) fixes for > 1 well seg 2) added soln updating/scaling 3) removed debug std::couts 4) next steps a) address constant temp BC b) singlephase thermo dev c) deriv checker * 1) Added simple temperature constraint 2) Fixes from running numerical derivative checker and treating warnings as errors * 1) add iterative solver config for thermal res+well 2) skip well calcs for shutin well 3) call well initialization code for wells that come online at t> 0 * 1) add Aww numerical derivative unit tests, 2) thermal index fix * 1) fix temp constraint eqn setup for well spanning > 1 cores , 2) well debug moved to well_debug branch, 3) stored global indices for well segs, 4) stored global reservoir indices for perfs, 5) added interfaces to access newton iteration number * 1) remove schema addition for current nonlinear stats , 2) remove test code that zeroed energy derivatives if phase not present * 1) for shutin wells zero completion perforation rates for clarity in reporting, 2) initialize seg temps with input inj temp, if user specifed surface+inj temp this caused differences with dev for isothermal runs * Update src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp * 1) dont allocate temperature_n for isothermal run, 2) uncrustify style * perfs global res cell index set with wrong array (node instead of cell values), quantites only used for reporting * Update .integrated_tests.yaml --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../multifluid/CO2Brine/CO2BrineFluid.hpp | 1 - .../constitutive/fluid/multifluid/Layouts.hpp | 40 + .../fluid/singlefluid/SingleFluidBase.hpp | 8 + src/coreComponents/dataRepository/Group.hpp | 2 +- .../linearAlgebra/CMakeLists.txt | 1 + .../interfaces/hypre/HypreMGR.cpp | 6 + ...malCompositionalMultiphaseReservoirFVM.hpp | 131 ++ .../utilities/LinearSolverParameters.hpp | 46 +- src/coreComponents/mesh/PerforationData.cpp | 2 + src/coreComponents/mesh/PerforationData.hpp | 17 + src/coreComponents/mesh/PerforationFields.hpp | 8 + .../mesh/WellElementSubRegion.cpp | 31 +- .../mesh/WellElementSubRegion.hpp | 11 + .../physicsSolvers/KernelLaunchSelectors.hpp | 174 ++ .../physicsSolvers/SolverStatistics.cpp | 1 - .../physicsSolvers/SolverStatistics.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 2 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 48 +- .../CompositionalMultiphaseHybridFVM.cpp | 19 + ...rmalCompositionalMultiphaseBaseKernels.hpp | 103 +- ...rmalCompositionalMultiphaseBaseKernels.hpp | 90 +- .../wells/CompositionalMultiphaseWell.cpp | 1603 ++++++++++------- .../wells/CompositionalMultiphaseWell.hpp | 56 +- .../CompositionalMultiphaseWellFields.hpp | 32 +- .../CompositionalMultiphaseWellKernels.cpp | 1363 ++------------ .../CompositionalMultiphaseWellKernels.hpp | 1411 ++++++++++++--- .../wells/PerforationFluxKernels.hpp | 879 +++++++++ .../fluidFlow/wells/SinglePhaseWell.cpp | 47 +- .../fluidFlow/wells/SinglePhaseWell.hpp | 35 +- ...rmalCompositionalMultiphaseWellKernels.hpp | 1121 ++++++++++++ .../wells/ThermalSinglePhaseWellKernels.hpp | 246 +++ .../fluidFlow/wells/WellFields.hpp | 59 + .../fluidFlow/wells/WellSolverBase.cpp | 178 +- .../fluidFlow/wells/WellSolverBase.hpp | 64 +- .../fluidFlow/wells/WellSolverBaseFields.hpp | 4 +- .../fluidFlow/wells/WellTags.hpp | 110 ++ ...mpositionalMultiphaseReservoirAndWells.cpp | 177 +- ...mpositionalMultiphaseReservoirAndWells.hpp | 2 +- .../CoupledReservoirAndWellKernels.hpp | 592 ++++++ .../SinglePhaseReservoirAndWells.cpp | 105 +- src/coreComponents/schema/schema.xsd | 6 + src/coreComponents/schema/schema.xsd.other | 2 + .../fluidFlowTests/testCompFlowUtils.hpp | 13 + .../unitTests/wellsTests/CMakeLists.txt | 6 +- ...eservoirCompositionalMultiphaseMSWells.cpp | 677 +++++++ ...eservoirCompositionalMultiphaseSSWells.cpp | 769 ++++++++ ...eservoirCompositionalMultiphaseMSWells.cpp | 16 +- .../testReservoirSinglePhaseMSWells.cpp | 6 +- ...eservoirCompositionalMultiphaseMSWells.cpp | 818 +++++++++ ...eservoirCompositionalMultiphaseSSWells.cpp | 807 +++++++++ 52 files changed, 9386 insertions(+), 2567 deletions(-) create mode 100644 src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseReservoirFVM.hpp create mode 100644 src/coreComponents/physicsSolvers/KernelLaunchSelectors.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/wells/PerforationFluxKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalSinglePhaseWellKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/wells/WellFields.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/wells/WellTags.hpp create mode 100644 src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp create mode 100644 src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp create mode 100644 src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp create mode 100644 src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp create mode 100644 src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 2d289765a28..1026f009fb0 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr2878-8188-ed2ded2 + baseline: integratedTests/baseline_integratedTests-pr3156-8366-aa71f2a allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 65cd8d82bd9..51b738f22fa 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3156 (2024-10-29) +==================== +Restart check errors due to 1) schema node added to enable thermal option in well model and 2) arrays removed/added for option. Max difference errors due treatment of shutin wells. Previously non-zero rate value reported for shutin well, new code will set rate arrays to zero. + PR #2878 (2024-10-17) ===================== Sorted region cellBlocks names alphabetically. Therefore affected ordering of: faceManager/elemSubRegionList, nodeManager/elemList, nodeManager/elemSubRegionList, SurfaceElementSubRegion::fractureElementsToCellSubRegions, field::perforation::reservoirElementSubregion. diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp index 62b6c3a1a15..eb31780f4d4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp @@ -386,7 +386,6 @@ CO2BrineFluid< PHASE1, PHASE2, FLASH >::KernelWrapper:: if( m_isThermal ) { - m_phase1.enthalpy.compute( pressure, temperatureInCelsius, phaseCompFraction.value[ip1].toSliceConst(), phaseCompFraction.derivs[ip1].toSliceConst(), diff --git a/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp b/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp index 302b8fd9eb0..626f988104e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp @@ -30,10 +30,23 @@ namespace geos { namespace constitutive { + +namespace singlefluid +{ +struct DerivativeOffset +{ + /// index of derivative wrt pressure + static integer constexpr dP = 0; + /// index of derivative wrt temperature + static integer constexpr dT = 1; + +}; +} namespace multifluid { /// indices of pressure, temperature, and composition derivatives +// Fix me - if the order is changed the code crashes struct DerivativeOffset { /// index of derivative wrt pressure @@ -44,6 +57,33 @@ struct DerivativeOffset static integer constexpr dC = 2; }; +/// indices of pressure, temperature, and composition derivatives +template< integer NC, integer IS_THERMAL > +struct DerivativeOffsetC {}; + +template< integer NC > +struct DerivativeOffsetC< NC, 1 > +{ + /// index of derivative wrt pressure + static integer constexpr dP = 0; + /// index of derivative wrt temperature + static integer constexpr dT = dP + 1; + /// index of first derivative wrt compositions + static integer constexpr dC = dP+2; + /// number of derivatives + static integer constexpr nDer = NC + 2; +}; +template< integer NC > +struct DerivativeOffsetC< NC, 0 > +{ + /// index of derivative wrt pressure + static integer constexpr dP = 0; + /// index of first derivative wrt compositions + static integer constexpr dC = dP+1; + /// number of derivatives + static integer constexpr nDer = NC + 1; +}; + #if defined( GEOS_USE_DEVICE ) /// Constitutive model phase property array layout diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp index 5b1c159f01f..d5f63c8dedb 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp @@ -276,6 +276,14 @@ class SingleFluidBase : public ConstitutiveBase virtual real64 defaultDensity() const = 0; virtual real64 defaultViscosity() const = 0; +/** + * @brief Get the thermal flag. + * @return boolean value indicating whether the model can be used to assemble the energy balance equation or not + * @detail if isThermal is true, the constitutive model compute the enthalpy and internal energy of the phase. + * This can be used to check the compatibility of the constitutive model with the solver + */ + virtual bool isThermal() const { return false; } + protected: virtual void postInputInitialization() override; diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index 3741580fbbb..1cbc00c739a 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -457,7 +457,6 @@ class Group { using T = std::conditional_t< std::is_const< CONTAINERTYPE >::value, CASTTYPE const, CASTTYPE >; T * const castedContainer = dynamic_cast< T * >( &container ); - if( castedContainer != nullptr ) { lambda( *castedContainer ); @@ -598,6 +597,7 @@ class Group void forSubGroups( LOOKUP_CONTAINER const & subGroupKeys, LAMBDA && lambda ) { localIndex counter = 0; + for( auto const & subgroup : subGroupKeys ) { applyLambdaToContainer< GROUPTYPE, GROUPTYPES... >( getGroup( subgroup ), [&]( auto & castedSubGroup ) diff --git a/src/coreComponents/linearAlgebra/CMakeLists.txt b/src/coreComponents/linearAlgebra/CMakeLists.txt index 095544ff4aa..81c3536dfdd 100644 --- a/src/coreComponents/linearAlgebra/CMakeLists.txt +++ b/src/coreComponents/linearAlgebra/CMakeLists.txt @@ -110,6 +110,7 @@ if( ENABLE_HYPRE ) interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp + interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseReservoirFVM.hpp interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp ) list( APPEND linearAlgebra_sources diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp index a14f0ac6b5b..67de2ca96ae 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp @@ -38,6 +38,7 @@ #include "linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp" #include "linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp" #include "linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp" +#include "linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseReservoirFVM.hpp" #include "linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp" #include "linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp" #include "linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp" @@ -112,6 +113,11 @@ void hypre::mgr::createMGR( LinearSolverParameters const & params, setStrategy< ThermalCompositionalMultiphaseFVM >( params.mgr, numComponentsPerField, precond, mgrData ); break; } + case LinearSolverParameters::MGR::StrategyType::thermalCompositionalMultiphaseReservoirFVM: + { + setStrategy< ThermalCompositionalMultiphaseReservoirFVM >( params.mgr, numComponentsPerField, precond, mgrData ); + break; + } case LinearSolverParameters::MGR::StrategyType::hybridSinglePhasePoromechanics: { setStrategy< HybridSinglePhasePoromechanics >( params.mgr, numComponentsPerField, precond, mgrData ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseReservoirFVM.hpp new file mode 100644 index 00000000000..81702aa2f8b --- /dev/null +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseReservoirFVM.hpp @@ -0,0 +1,131 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ThermalCompositionalMultiphaseFVM.hpp + */ + +#ifndef GEOS_LINEARALGEBRA_INTERFACES_HYPREMGRTHERMALCOMPOSITIONALMULTIPHASERESERVOIRFVM_HPP_ +#define GEOS_LINEARALGEBRA_INTERFACES_HYPREMGRTHERMALCOMPOSITIONALMULTIPHASERESERVOIRFVM_HPP_ + +#include "linearAlgebra/interfaces/hypre/HypreMGR.hpp" + +namespace geos +{ + +namespace hypre +{ + +namespace mgr +{ + +/** + * @brief ThermalCompositionalMultiphaseReservoirFVM strategy. + * + * Labels description stored in point_marker_array + * 0 = reservoir pressure + * 1 = reservoir density (component 1 ) + * ... = reservoir densities (# components , NC) + * NC + 1 = reservoir temperature + * + * numResLabels - 1 = reservoir temperature + * numResLabels = well pressure + * numResLabels + 1 = well density + * ... = ... (well densities) + * numResLabels + numWellLabels - 3 = last well density + * numResLabels + numWellLabels - 2 = well rate + * numResLabels + numWellLabels - 1 = well temperature + * + * 3-level MGR reduction strategy + * - 1st level: eliminate the well block + * - 2nd level: eliminate the reservoir density associated with the volume constraint + * - 3rd level: eliminate the remaining the reservoir densities + * - The coarse grid (pressure and temperature system) is solved with BoomerAMG with numFunctions==2. + * + */ + +class ThermalCompositionalMultiphaseReservoirFVM : public MGRStrategyBase< 3 > +{ +public: + /** + * @brief Constructor. + * @param numComponentsPerField array with number of components for each field + */ + explicit ThermalCompositionalMultiphaseReservoirFVM( arrayView1d< int const > const & numComponentsPerField ) + : MGRStrategyBase( LvArray::integerConversion< HYPRE_Int >( numComponentsPerField[0] + numComponentsPerField[1] ) ) + { + HYPRE_Int const numResLabels = LvArray::integerConversion< HYPRE_Int >( numComponentsPerField[0] ); + + // Level 0: eliminate the well block + m_labels[0].resize( numResLabels ); + std::iota( m_labels[0].begin(), m_labels[0].end(), 0 ); + + // Level 1: eliminate last density which corresponds to the volume constraint equation + m_labels[1].resize( numResLabels - 2 ); + std::iota( m_labels[1].begin(), m_labels[1].end(), 0 ); + m_labels[1].push_back( numResLabels-1 ); // keep temperature + // Level 2: eliminate the other densities + m_labels[2].push_back( 0 ); // keep pressure + m_labels[2].push_back( numResLabels-1 ); // keep temperature + + setupLabels(); + + // level 0 + m_levelFRelaxType[0] = MGRFRelaxationType::gsElimWInverse; + m_levelFRelaxIters[0] = 1; + m_levelInterpType[0] = MGRInterpolationType::blockJacobi; + m_levelRestrictType[0] = MGRRestrictionType::injection; + m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::galerkin; + m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; + + m_levelFRelaxType[1] = MGRFRelaxationType::jacobi; + m_levelFRelaxIters[1] = 1; + m_levelInterpType[1] = MGRInterpolationType::jacobi; // Diagonal scaling (Jacobi) + m_levelRestrictType[1] = MGRRestrictionType::injection; + m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkin; // Standard Galerkin + m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::blockGaussSeidel; + m_levelGlobalSmootherIters[1] = 1; + + m_levelFRelaxType[2] = MGRFRelaxationType::jacobi; + m_levelFRelaxIters[2] = 1; + m_levelInterpType[2] = MGRInterpolationType::injection; // Injection + m_levelRestrictType[2] = MGRRestrictionType::injection; + m_levelCoarseGridMethod[2] = MGRCoarseGridMethod::cprLikeBlockDiag; // Non-Galerkin Quasi-IMPES CPR + m_levelGlobalSmootherType[2] = MGRGlobalSmootherType::ilu0; + m_levelGlobalSmootherIters[2] = 1; + } + + /** + * @brief Setup the MGR strategy. + * @param precond preconditioner wrapper + * @param mgrData auxiliary MGR data + */ + void setup( LinearSolverParameters::MGR const &, + HyprePrecWrapper & precond, + HypreMGRData & mgrData ) + { + setReduction( precond, mgrData ); + + // Configure the BoomerAMG solver used as mgr coarse solver for the pressure/temperature reduced system + setPressureTemperatureAMG( mgrData.coarseSolver ); + } +}; + +} // namespace mgr + +} // namespace hypre + +} // namespace geos + +#endif /*GEOS_LINEARALGEBRA_INTERFACES_HYPREMGRCOMPOSITIONALMULTIPHASERESERVOIRFVM_HPP_*/ diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp index 90efd13f7ef..7483a1721a9 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp @@ -271,28 +271,29 @@ struct LinearSolverParameters */ enum class StrategyType : integer { - invalid, ///< default value, to ensure solver sets something - singlePhaseReservoirFVM, ///< finite volume single-phase flow with wells - singlePhaseHybridFVM, ///< hybrid finite volume single-phase flow - singlePhaseReservoirHybridFVM, ///< hybrid finite volume single-phase flow with wells - singlePhasePoromechanics, ///< single phase poromechanics with finite volume single phase flow - thermalSinglePhasePoromechanics, ///< thermal single phase poromechanics with finite volume single phase flow - hybridSinglePhasePoromechanics, ///< single phase poromechanics with hybrid finite volume single phase flow - singlePhasePoromechanicsEmbeddedFractures, ///< single phase poromechanics with FV embedded fractures - singlePhasePoromechanicsConformingFractures, ///< single phase poromechanics with FV conforming fractures - singlePhasePoromechanicsReservoirFVM, ///< single phase poromechanics with finite volume single phase flow with wells - compositionalMultiphaseFVM, ///< finite volume compositional multiphase flow - compositionalMultiphaseHybridFVM, ///< hybrid finite volume compositional multiphase flow - compositionalMultiphaseReservoirFVM, ///< finite volume compositional multiphase flow with wells - compositionalMultiphaseReservoirHybridFVM, ///< hybrid finite volume compositional multiphase flow with wells - reactiveCompositionalMultiphaseOBL, ///< finite volume reactive compositional flow with OBL - thermalCompositionalMultiphaseFVM, ///< finite volume thermal compositional multiphase flow - multiphasePoromechanics, ///< multiphase poromechanics with finite volume compositional multiphase flow - multiphasePoromechanicsReservoirFVM, ///< multiphase poromechanics with finite volume compositional multiphase flow with wells - thermalMultiphasePoromechanics, ///< thermal multiphase poromechanics with finite volume compositional multiphase flow - hydrofracture, ///< hydrofracture - lagrangianContactMechanics, ///< Lagrangian contact mechanics - solidMechanicsEmbeddedFractures ///< Embedded fractures mechanics + invalid, ///< default value, to ensure solver sets something + singlePhaseReservoirFVM, ///< finite volume single-phase flow with wells + singlePhaseHybridFVM, ///< hybrid finite volume single-phase flow + singlePhaseReservoirHybridFVM, ///< hybrid finite volume single-phase flow with wells + singlePhasePoromechanics, ///< single phase poromechanics with finite volume single phase flow + thermalSinglePhasePoromechanics, ///< thermal single phase poromechanics with finite volume single phase flow + hybridSinglePhasePoromechanics, ///< single phase poromechanics with hybrid finite volume single phase flow + singlePhasePoromechanicsEmbeddedFractures, ///< single phase poromechanics with FV embedded fractures + singlePhasePoromechanicsConformingFractures, ///< single phase poromechanics with FV embedded fractures + singlePhasePoromechanicsReservoirFVM, ///< single phase poromechanics with finite volume single phase flow with wells + compositionalMultiphaseFVM, ///< finite volume compositional multiphase flow + compositionalMultiphaseHybridFVM, ///< hybrid finite volume compositional multiphase flow + compositionalMultiphaseReservoirFVM, ///< finite volume compositional multiphase flow with wells + compositionalMultiphaseReservoirHybridFVM, ///< hybrid finite volume compositional multiphase flow with wells + reactiveCompositionalMultiphaseOBL, ///< finite volume reactive compositional flow with OBL + thermalCompositionalMultiphaseFVM, ///< finite volume thermal compositional multiphase flow + thermalCompositionalMultiphaseReservoirFVM,///< finite volume thermal compositional multiphase flow + multiphasePoromechanics, ///< multiphase poromechanics with finite volume compositional multiphase flow + multiphasePoromechanicsReservoirFVM, ///< multiphase poromechanics with finite volume compositional multiphase flow with wells + thermalMultiphasePoromechanics, ///< thermal multiphase poromechanics with finite volume compositional multiphase flow + hydrofracture, ///< hydrofracture + lagrangianContactMechanics, ///< Lagrangian contact mechanics + solidMechanicsEmbeddedFractures ///< Embedded fractures mechanics }; StrategyType strategy = StrategyType::invalid; ///< Predefined MGR solution strategy (solver specific) @@ -379,6 +380,7 @@ ENUM_STRINGS( LinearSolverParameters::MGR::StrategyType, "compositionalMultiphaseReservoirHybridFVM", "reactiveCompositionalMultiphaseOBL", "thermalCompositionalMultiphaseFVM", + "thermalCompositionalMultiphaseReservoirFVM", "multiphasePoromechanics", "multiphasePoromechanicsReservoirFVM", "thermalMultiphasePoromechanics", diff --git a/src/coreComponents/mesh/PerforationData.cpp b/src/coreComponents/mesh/PerforationData.cpp index e91970382c4..536e03f51ad 100644 --- a/src/coreComponents/mesh/PerforationData.cpp +++ b/src/coreComponents/mesh/PerforationData.cpp @@ -39,6 +39,8 @@ PerforationData::PerforationData( string const & name, Group * const parent ) registerField( fields::perforation::reservoirElementRegion{}, &m_toMeshElements.m_toElementRegion ); registerField( fields::perforation::reservoirElementSubRegion{}, &m_toMeshElements.m_toElementSubRegion ); registerField( fields::perforation::reservoirElementIndex{}, &m_toMeshElements.m_toElementIndex ); + registerField( fields::perforation::reservoirElementGlobalIndex{}, &m_reservoirElementGlobalIndex ); + registerField( fields::perforation::wellElementIndex{}, &m_wellElementIndex ); registerField( fields::perforation::location{}, &m_location ); registerField( fields::perforation::wellTransmissibility{}, &m_wellTransmissibility ); diff --git a/src/coreComponents/mesh/PerforationData.hpp b/src/coreComponents/mesh/PerforationData.hpp index 1071d357d77..f8f2e801c40 100644 --- a/src/coreComponents/mesh/PerforationData.hpp +++ b/src/coreComponents/mesh/PerforationData.hpp @@ -150,6 +150,20 @@ class PerforationData : public ObjectManagerBase */ arrayView1d< localIndex const > getWellElements() const { return m_wellElementIndex; } + /** + * @brief Get perforation-to-reservoir-element connectivity. + * @return list of global reservoir element index connected to each perforation + */ + arrayView1d< globalIndex > getReservoirElementGlobalIndex() { return m_reservoirElementGlobalIndex; } + + + + /** + * @brief Provide an immutable accessor to a const perforation-to-reservoir-element connectivity. + * @return list of well element index connected to each perforation + */ + arrayView1d< globalIndex const > getReservoirElementGlobalIndex() const { return m_reservoirElementGlobalIndex; } + /** * @brief Get perforation locations. @@ -275,6 +289,9 @@ class PerforationData : public ObjectManagerBase /// Indices of the well elements to which perforations are attached array1d< localIndex > m_wellElementIndex; + /// Global indices of reservoir cell containing perforation + array1d< globalIndex > m_reservoirElementGlobalIndex; + /// Location of the perforations array2d< real64 > m_location; diff --git a/src/coreComponents/mesh/PerforationFields.hpp b/src/coreComponents/mesh/PerforationFields.hpp index 8d376689a30..263c7254078 100644 --- a/src/coreComponents/mesh/PerforationFields.hpp +++ b/src/coreComponents/mesh/PerforationFields.hpp @@ -58,6 +58,14 @@ DECLARE_FIELD( reservoirElementIndex, WRITE_AND_READ, "For each perforation, element index of the perforated element" ); +DECLARE_FIELD( reservoirElementGlobalIndex, + "reservoirElementGlobalIndex", + array1d< globalIndex >, + 0, + NOPLOT, + WRITE_AND_READ, + "For each perforation, global element index of the perforated element" ); + DECLARE_FIELD( wellElementIndex, "wellElementIndex", array1d< localIndex >, diff --git a/src/coreComponents/mesh/WellElementSubRegion.cpp b/src/coreComponents/mesh/WellElementSubRegion.cpp index 107dcfe80fc..daf53c67621 100644 --- a/src/coreComponents/mesh/WellElementSubRegion.cpp +++ b/src/coreComponents/mesh/WellElementSubRegion.cpp @@ -148,6 +148,7 @@ void collectElementNodes( CellElementSubRegion const & subRegion, * @param[inout] erMatched the region index of the reservoir element that contains "location", if any * @param[inout] esrMatched the subregion index of the reservoir element that contains "location", if any * @param[inout] eiMatched the element index of the reservoir element that contains "location", if any + * @param[inout] giMatched the element global index of the reservoir element that contains "location", if any */ bool visitNeighborElements( MeshLevel const & mesh, real64 const (&location)[3], @@ -155,7 +156,8 @@ bool visitNeighborElements( MeshLevel const & mesh, SortedArray< globalIndex > & elements, localIndex & erMatched, localIndex & esrMatched, - localIndex & eiMatched ) + localIndex & eiMatched, + globalIndex & giMatched ) { ElementRegionManager const & elemManager = mesh.getElemManager(); NodeManager const & nodeManager = mesh.getNodeManager(); @@ -164,7 +166,6 @@ bool visitNeighborElements( MeshLevel const & mesh, ArrayOfArraysView< localIndex const > const & toElementRegionList = nodeManager.elementRegionList(); ArrayOfArraysView< localIndex const > const & toElementSubRegionList = nodeManager.elementSubRegionList(); ArrayOfArraysView< localIndex const > const & toElementList = nodeManager.elementList(); - arrayView2d< real64 const, nodes::REFERENCE_POSITION_USD > const referencePosition = nodeManager.referencePosition().toViewConst(); @@ -183,7 +184,7 @@ bool visitNeighborElements( MeshLevel const & mesh, // that contains only the nodes that have already been visited // the newly added nodes will be added to "nodes" SortedArray< localIndex > currNodes = nodes; - + giMatched = -1; // for all the nodes already visited for( localIndex currNode : currNodes ) { @@ -193,7 +194,6 @@ bool visitNeighborElements( MeshLevel const & mesh, localIndex const er = toElementRegionList[currNode][b]; localIndex const esr = toElementSubRegionList[currNode][b]; localIndex const eiLocal = toElementList[currNode][b]; - CellElementRegion const & region = elemManager.getRegion< CellElementRegion >( er ); CellElementSubRegion const & subRegion = region.getSubRegion< CellElementSubRegion >( esr ); arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList(); @@ -221,6 +221,7 @@ bool visitNeighborElements( MeshLevel const & mesh, erMatched = er; esrMatched = esr; eiMatched = eiLocal; + giMatched = eiGlobal; matched = true; break; } @@ -292,6 +293,7 @@ void initializeLocalSearch( MeshLevel const & mesh, * @param[inout] erMatched the region index of the reservoir element that contains "location", if any * @param[inout] esrMatched the subregion index of the reservoir element that contains "location", if any * @param[inout] eiMatched the element index of the reservoir element that contains "location", if any + * @param[inout] giMatched the element global index of the reservoir element that contains "location", if any */ bool searchLocalElements( MeshLevel const & mesh, real64 const (&location)[3], @@ -301,7 +303,8 @@ bool searchLocalElements( MeshLevel const & mesh, localIndex const & eiInit, localIndex & erMatched, localIndex & esrMatched, - localIndex & eiMatched ) + localIndex & eiMatched, + globalIndex & giMatched ) { // search locally, starting from the location of the previous perforation // the assumption here is that perforations have been entered in order of depth @@ -324,7 +327,6 @@ bool searchLocalElements( MeshLevel const & mesh, // collect the nodes of the current element // they will be used to access the neighbors and check if they contain the perforation collectElementNodes( subRegion, eiInit, nodes ); - // if no match is found, enlarge the neighborhood m_searchDepth'th times for( localIndex d = 0; d < searchDepth; ++d ) { @@ -334,7 +336,7 @@ bool searchLocalElements( MeshLevel const & mesh, // stop if a reservoir element containing the perforation is found // if not, enlarge the set "nodes" resElemFound = visitNeighborElements( mesh, location, nodes, elements, - erMatched, esrMatched, eiMatched ); + erMatched, esrMatched, eiMatched, giMatched ); if( resElemFound || nNodes == nodes.size()) { break; @@ -433,6 +435,14 @@ void WellElementSubRegion::generate( MeshLevel & mesh, // this assumes that the elemToNodes maps has been filled at Step 5) updateNodeManagerNodeToElementMap( mesh ); + // Store local to global index mapping + integer n_localElems = localElems.size(); + m_globalWellElementIndex.resize( n_localElems ); + for( integer i=0; i getGlobalWellElementIndex() const + { + return m_globalWellElementIndex; + } /** * @brief Set the name of the WellControls object of this well. * @param[in] name the name of the WellControls object @@ -394,6 +402,9 @@ class WellElementSubRegion : public ElementSubRegionBase /// Element-to-node relation is one to one relation. NodeMapType m_toNodesRelation; + /// Local indices of the next well element (used in solvers) + array1d< globalIndex > m_globalWellElementIndex; + /// Local indices of the next well element (used in solvers) array1d< localIndex > m_nextWellElementIndex; diff --git a/src/coreComponents/physicsSolvers/KernelLaunchSelectors.hpp b/src/coreComponents/physicsSolvers/KernelLaunchSelectors.hpp new file mode 100644 index 00000000000..6a07386bd79 --- /dev/null +++ b/src/coreComponents/physicsSolvers/KernelLaunchSelectors.hpp @@ -0,0 +1,174 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file KernelLaunchSelectors.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_KERNELLAUNCHSELECTORS_HPP +#define GEOS_PHYSICSSOLVERS_KERNELLAUNCHSELECTORS_HPP + +namespace geos +{ +namespace internal +{ + +template< typename S, typename T, typename LAMBDA > +void invokePhaseDispatchLambda ( S val, T numPhases, LAMBDA && lambda ) +{ + if( numPhases == 1 ) + { + lambda( val, std::integral_constant< T, 1 >()); + return; + } + else if( numPhases == 2 ) + { + lambda( val, std::integral_constant< T, 2 >()); + return; + } + else if( numPhases == 3 ) + { + lambda( val, std::integral_constant< T, 3 >()); + return; + } + else + { + GEOS_ERROR( "Unsupported state: " << numPhases ); + } +} + +template< typename S, typename T, typename LAMBDA > +void invokeThermalDispatchLambda ( S val, T isThermal, LAMBDA && lambda ) +{ + if( isThermal == 1 ) + { + lambda( val, std::integral_constant< T, 1 >()); + return; + } + else if( isThermal == 0 ) + { + lambda( val, std::integral_constant< T, 0 >()); + return; + } + else + { + GEOS_ERROR( "Unsupported state: " << isThermal ); + } +} + +template< typename T, typename LAMBDA > +void kernelLaunchSelectorThermalSwitch( T value, LAMBDA && lambda ) +{ + static_assert( std::is_integral< T >::value, "kernelLaunchSelectorThermalSwitch: type should be integral" ); + + switch( value ) + { + case 0: + { + lambda( std::integral_constant< T, 0 >() ); + return; + } + case 1: + { + lambda( std::integral_constant< T, 1 >() ); + return; + } + default: + { + GEOS_ERROR( "Unsupported thermal state: " << value ); + } + } +} + +template< typename T, typename LAMBDA > +void kernelLaunchSelectorCompThermSwitch( T value, bool const isThermal, LAMBDA && lambda ) +{ + static_assert( std::is_integral< T >::value, "kernelLaunchSelectorCompSwitch: value type should be integral" ); + + + switch( value ) + { + case 1: + { + invokeThermalDispatchLambda( std::integral_constant< T, 1 >(), isThermal, lambda ); return; + } + case 2: + { + invokeThermalDispatchLambda( std::integral_constant< T, 2 >(), isThermal, lambda ); + return; + } + case 3: + { + invokeThermalDispatchLambda( std::integral_constant< T, 3 >(), isThermal, lambda ); + return; + } + case 4: + { + invokeThermalDispatchLambda( std::integral_constant< T, 4 >(), isThermal, lambda ); + return; + } + case 5: + { + invokeThermalDispatchLambda( std::integral_constant< T, 5 >(), isThermal, lambda ); + return; + } + default: + { + GEOS_ERROR( "Unsupported number of components: " << value ); + } + } +} + +template< typename T, typename LAMBDA > +void kernelLaunchSelectorCompPhaseSwitch( T value, T n_phase, LAMBDA && lambda ) +{ + static_assert( std::is_integral< T >::value, "kernelLaunchSelectorCompSwitch: value type should be integral" ); + switch( value ) + { + case 1: + { + invokePhaseDispatchLambda( std::integral_constant< T, 1 >(), n_phase, lambda ); + return; + } + case 2: + { + invokePhaseDispatchLambda( std::integral_constant< T, 2 >(), n_phase, lambda ); + return; + } + case 3: + { + invokePhaseDispatchLambda( std::integral_constant< T, 3 >(), n_phase, lambda ); + return; + } + case 4: + { + invokePhaseDispatchLambda( std::integral_constant< T, 4 >(), n_phase, lambda ); + return; + } + case 5: + { + invokePhaseDispatchLambda( std::integral_constant< T, 5 >(), n_phase, lambda ); + return; + } + default: + { GEOS_ERROR( "Unsupported number of components: " << value ); } + } +} + + +} // end namspace internal +} // end namespace geos + + +#endif // GEOS_PHYSICSSOLVERS_KERNELLAUNCHSELECTORS_HPP diff --git a/src/coreComponents/physicsSolvers/SolverStatistics.cpp b/src/coreComponents/physicsSolvers/SolverStatistics.cpp index 4fce578ebc0..cf3eaf44f14 100644 --- a/src/coreComponents/physicsSolvers/SolverStatistics.cpp +++ b/src/coreComponents/physicsSolvers/SolverStatistics.cpp @@ -38,7 +38,6 @@ SolverStatistics::SolverStatistics( string const & name, Group * const parent ) setApplyDefaultValue( 0 ). setDescription( "Number of time step cuts" ); - registerWrapper( viewKeyStruct::numSuccessfulOuterLoopIterationsString(), &m_numSuccessfulOuterLoopIterations ). setApplyDefaultValue( 0 ). setDescription( "Cumulative number of successful outer loop iterations" ); diff --git a/src/coreComponents/physicsSolvers/SolverStatistics.hpp b/src/coreComponents/physicsSolvers/SolverStatistics.hpp index 64a173a0395..ce8293dbcc0 100644 --- a/src/coreComponents/physicsSolvers/SolverStatistics.hpp +++ b/src/coreComponents/physicsSolvers/SolverStatistics.hpp @@ -128,7 +128,6 @@ class SolverStatistics : public dataRepository::Group integer getNumDiscardedLinearIterations() const { return m_numDiscardedLinearIterations; } -private: /** * @brief Struct to serve as a container for variable strings and keys. @@ -156,6 +155,7 @@ class SolverStatistics : public dataRepository::Group static constexpr char const * numDiscardedLinearIterationsString() { return "numDiscardedLinearIterations"; } }; +private: /// Number of time steps integer m_numTimeSteps; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 24bfc0dbff0..d863e690cc4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -280,6 +280,7 @@ void CompositionalMultiphaseBase::registerDataOnMesh( Group & meshBodies ) MultiFluidBase const & referenceFluid = cm.getConstitutiveRelation< MultiFluidBase >( m_referenceFluidModelName ); m_numPhases = referenceFluid.numFluidPhases(); m_numComponents = referenceFluid.numFluidComponents(); + m_isThermal = referenceFluid.isThermal(); } // n_c components + one pressure ( + one temperature if needed ) @@ -2266,7 +2267,6 @@ void CompositionalMultiphaseBase::computeCFLNumbers( geos::DomainPartition & dom fluxApprox.forAllStencils( mesh, [&] ( auto & stencil ) { - typename TYPEOFREF( stencil ) ::KernelWrapper stencilWrapper = stencil.createKernelWrapper(); // While this kernel is waiting for a factory class, pass all the accessors here diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index d85079eb757..3f850dcd1a5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -13,6 +13,8 @@ * ------------------------------------------------------------------------------------------------------------ */ + + /** * @file CompositionalMultiphaseFVM.cpp */ @@ -486,6 +488,14 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d [&]( localIndex const, ElementSubRegionBase & subRegion ) { + arrayView1d< real64 const > const pressure = subRegion.getField< fields::flow::pressure >(); + arrayView1d< real64 const > const temperature = subRegion.getField< fields::flow::temperature >(); + arrayView2d< real64 const, compflow::USD_COMP > const compDens = subRegion.getField< fields::flow::globalCompDensity >(); + arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::flow::pressureScalingFactor >(); + arrayView1d< real64 > temperatureScalingFactor = subRegion.getField< fields::flow::temperatureScalingFactor >(); + arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); + + const integer temperatureOffset = m_numComponents+1; auto const subRegionData = m_isThermal ? thermalCompositionalMultiphaseBaseKernels:: @@ -495,17 +505,28 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d m_maxRelativeTempChange, m_maxCompFracChange, m_maxRelativeCompDensChange, + pressure, + temperature, + compDens, + pressureScalingFactor, + compDensScalingFactor, + temperatureScalingFactor, dofManager.rankOffset(), m_numComponents, dofKey, subRegion, - localSolution ) + localSolution, + temperatureOffset ) : isothermalCompositionalMultiphaseBaseKernels:: ScalingForSystemSolutionKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxCompFracChange, m_maxRelativeCompDensChange, + pressure, + compDens, + pressureScalingFactor, + compDensScalingFactor, dofManager.rankOffset(), m_numComponents, dofKey, @@ -578,8 +599,18 @@ bool CompositionalMultiphaseFVM::checkSystemSolution( DomainPartition & domain, [&]( localIndex const, ElementSubRegionBase & subRegion ) { + arrayView1d< real64 const > const pressure = + subRegion.getField< fields::flow::pressure >(); + arrayView1d< real64 const > const temperature = + subRegion.getField< fields::flow::temperature >(); + arrayView2d< real64 const, compflow::USD_COMP > const compDens = + subRegion.getField< fields::flow::globalCompDensity >(); + arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::flow::pressureScalingFactor >(); + arrayView1d< real64 > temperatureScalingFactor = subRegion.getField< fields::flow::temperatureScalingFactor >(); + arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); // check that pressure and component densities are non-negative // for thermal, check that temperature is above 273.15 K + const integer temperatureOffset = m_numComponents+1; auto const subRegionData = m_isThermal ? thermalCompositionalMultiphaseBaseKernels:: @@ -588,17 +619,30 @@ bool CompositionalMultiphaseFVM::checkSystemSolution( DomainPartition & domain, m_allowNegativePressure, m_scalingType, scalingFactor, + pressure, + temperature, + compDens, + pressureScalingFactor, + temperatureScalingFactor, + compDensScalingFactor, dofManager.rankOffset(), m_numComponents, dofKey, subRegion, - localSolution ) + localSolution, + temperatureOffset ) : isothermalCompositionalMultiphaseBaseKernels:: SolutionCheckKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_allowCompDensChopping, m_allowNegativePressure, m_scalingType, scalingFactor, + pressure, + + compDens, + pressureScalingFactor, + + compDensScalingFactor, dofManager.rankOffset(), m_numComponents, dofKey, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index dc4b75cfa27..70f9ba9ae8b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -446,6 +446,10 @@ real64 CompositionalMultiphaseHybridFVM::scalingForSystemSolution( DomainPartiti mesh.getElemManager().forElementSubRegions< ElementSubRegionBase >( regionNames, [&]( localIndex const, ElementSubRegionBase & subRegion ) { + arrayView1d< real64 const > const pressure = subRegion.getField< fields::flow::pressure >(); + arrayView2d< real64 const, compflow::USD_COMP > const compDens = subRegion.getField< fields::flow::globalCompDensity >(); + arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::flow::pressureScalingFactor >(); + arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); auto const subRegionData = isothermalCompositionalMultiphaseBaseKernels:: ScalingForSystemSolutionKernelFactory:: @@ -453,6 +457,10 @@ real64 CompositionalMultiphaseHybridFVM::scalingForSystemSolution( DomainPartiti m_maxAbsolutePresChange, m_maxCompFracChange, m_maxRelativeCompDensChange, + pressure, + compDens, + pressureScalingFactor, + compDensScalingFactor, dofManager.rankOffset(), m_numComponents, dofKey, @@ -519,6 +527,13 @@ bool CompositionalMultiphaseHybridFVM::checkSystemSolution( DomainPartition & do mesh.getElemManager().forElementSubRegions< ElementSubRegionBase >( regionNames, [&]( localIndex const, ElementSubRegionBase & subRegion ) { + arrayView1d< real64 const > const pressure = + subRegion.getField< fields::flow::pressure >(); + arrayView2d< real64 const, compflow::USD_COMP > const compDens = + subRegion.getField< fields::flow::globalCompDensity >(); + arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::flow::pressureScalingFactor >(); + arrayView1d< real64 > temperatureScalingFactor = subRegion.getField< fields::flow::temperatureScalingFactor >(); + arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); // check that pressure and component densities are non-negative auto const subRegionData = isothermalCompositionalMultiphaseBaseKernels:: @@ -527,6 +542,10 @@ bool CompositionalMultiphaseHybridFVM::checkSystemSolution( DomainPartition & do m_allowNegativePressure, CompositionalMultiphaseFVM::ScalingType::Global, scalingFactor, + pressure, + compDens, + pressureScalingFactor, + compDensScalingFactor, dofManager.rankOffset(), m_numComponents, elemDofKey, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp index f2edf8c99ed..a7541e66e4f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp @@ -34,10 +34,12 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" #include "physicsSolvers/SolverBaseKernels.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" +#include "physicsSolvers/KernelLaunchSelectors.hpp" namespace geos { + namespace isothermalCompositionalMultiphaseBaseKernels { @@ -113,6 +115,8 @@ class PropertyKernelBase namespace internal { + + template< typename T, typename LAMBDA > void kernelLaunchSelectorCompSwitch( T value, LAMBDA && lambda ) { @@ -1461,20 +1465,17 @@ class ScalingForSystemSolutionKernelFactory real64 const maxAbsolutePresChange, real64 const maxCompFracChange, real64 const maxRelativeCompDensChange, + arrayView1d< real64 const > const pressure, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, globalIndex const rankOffset, integer const numComp, string const dofKey, ElementSubRegionBase & subRegion, arrayView1d< real64 const > const localSolution ) { - arrayView1d< real64 const > const pressure = - subRegion.getField< fields::flow::pressure >(); - arrayView2d< real64 const, compflow::USD_COMP > const compDens = - subRegion.getField< fields::flow::globalCompDensity >(); - arrayView1d< real64 > pressureScalingFactor = - subRegion.getField< fields::flow::pressureScalingFactor >(); - arrayView1d< real64 > compDensScalingFactor = - subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); + ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, maxRelativeCompDensChange, rankOffset, numComp, dofKey, subRegion, localSolution, pressure, compDens, pressureScalingFactor, compDensScalingFactor ); return ScalingForSystemSolutionKernel::launch< POLICY >( subRegion.size(), kernel ); @@ -1516,15 +1517,15 @@ class SolutionCheckKernel : public ScalingAndCheckingSystemSolutionKernelBase< i integer const allowNegativePressure, CompositionalMultiphaseFVM::ScalingType const scalingType, real64 const scalingFactor, + arrayView1d< real64 const > const pressure, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, globalIndex const rankOffset, integer const numComp, string const dofKey, ElementSubRegionBase const & subRegion, - arrayView1d< real64 const > const localSolution, - arrayView1d< real64 const > const pressure, - arrayView2d< real64 const, compflow::USD_COMP > const compDens, - arrayView1d< real64 > pressureScalingFactor, - arrayView1d< real64 > compDensScalingFactor ) + arrayView1d< real64 const > const localSolution ) : Base( rankOffset, numComp, dofKey, @@ -1761,22 +1762,20 @@ class SolutionCheckKernelFactory integer const allowNegativePressure, CompositionalMultiphaseFVM::ScalingType const scalingType, real64 const scalingFactor, + arrayView1d< real64 const > const pressure, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, globalIndex const rankOffset, integer const numComp, string const dofKey, ElementSubRegionBase & subRegion, arrayView1d< real64 const > const localSolution ) { - arrayView1d< real64 const > const pressure = - subRegion.getField< fields::flow::pressure >(); - arrayView2d< real64 const, compflow::USD_COMP > const compDens = - subRegion.getField< fields::flow::globalCompDensity >(); - arrayView1d< real64 > pressureScalingFactor = - subRegion.getField< fields::flow::pressureScalingFactor >(); - arrayView1d< real64 > compDensScalingFactor = - subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); - SolutionCheckKernel kernel( allowCompDensChopping, allowNegativePressure, scalingType, scalingFactor, rankOffset, - numComp, dofKey, subRegion, localSolution, pressure, compDens, pressureScalingFactor, compDensScalingFactor ); + + SolutionCheckKernel kernel( allowCompDensChopping, allowNegativePressure, scalingType, scalingFactor, + pressure, compDens, pressureScalingFactor, compDensScalingFactor, rankOffset, + numComp, dofKey, subRegion, localSolution ); return SolutionCheckKernel::launch< POLICY >( subRegion.size(), kernel ); } @@ -2410,6 +2409,16 @@ struct HydrostaticPressureKernel /******************************** Kernel launch machinery ********************************/ + +template< typename KERNELWRAPPER, typename ... ARGS > +void KernelLaunchSelectorCompTherm( integer const numComp, bool const isThermal, ARGS && ... args ) +{ + geos::internal::kernelLaunchSelectorCompThermSwitch( numComp, isThermal, [&] ( auto NC, auto ISTHERMAL ) + { + KERNELWRAPPER::template launch< NC(), ISTHERMAL() >( std::forward< ARGS >( args )... ); + } ); +} + template< typename KERNELWRAPPER, typename ... ARGS > void KernelLaunchSelector1( integer const numComp, ARGS && ... args ) { @@ -2443,6 +2452,54 @@ void KernelLaunchSelector2( integer const numComp, integer const numPhase, ARGS } } +template< typename KERNELWRAPPER, typename ... ARGS > +void KernelLaunchSelector_NC_NP_THERM( integer const numComp, integer const numPhase, integer const isThermal, ARGS && ... args ) +{ + // Ideally this would be inside the dispatch, but it breaks on Summit with GCC 9.1.0 and CUDA 11.0.3. + if( isThermal ) + { + if( numPhase == 2 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + KERNELWRAPPER::template launch< NC(), 2, 1 >( std::forward< ARGS >( args ) ... ); + } ); + } + else if( numPhase == 3 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + KERNELWRAPPER::template launch< NC(), 3, 1 >( std::forward< ARGS >( args ) ... ); + } ); + } + else + { + GEOS_ERROR( "Unsupported number of phases: " << numPhase ); + } + } + else + { + if( numPhase == 2 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + KERNELWRAPPER::template launch< NC(), 2, 0 >( std::forward< ARGS >( args ) ... ); + } ); + } + else if( numPhase == 3 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + KERNELWRAPPER::template launch< NC(), 3, 0 >( std::forward< ARGS >( args ) ... ); + } ); + } + else + { + GEOS_ERROR( "Unsupported number of phases: " << numPhase ); + } + } +} + } // namespace isothermalCompositionalMultiphaseBaseKernels } // namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp index d39b7f51ddc..f4f5efc15a6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -552,7 +552,8 @@ class ScalingForSystemSolutionKernel : public isothermalCompositionalMultiphaseB arrayView2d< real64 const, compflow::USD_COMP > const compDens, arrayView1d< real64 > pressureScalingFactor, arrayView1d< real64 > compDensScalingFactor, - arrayView1d< real64 > temperatureScalingFactor ) + arrayView1d< real64 > temperatureScalingFactor, + integer const temperatureOffset ) : Base( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, @@ -568,7 +569,8 @@ class ScalingForSystemSolutionKernel : public isothermalCompositionalMultiphaseB compDensScalingFactor ), m_maxRelativeTempChange( maxRelativeTempChange ), m_temperature( temperature ), - m_temperatureScalingFactor( temperatureScalingFactor ) + m_temperatureScalingFactor( temperatureScalingFactor ), + m_temperatureOffset( temperatureOffset ) {} /** @@ -597,7 +599,7 @@ class ScalingForSystemSolutionKernel : public isothermalCompositionalMultiphaseB { // compute the change in temperature real64 const temp = m_temperature[ei]; - real64 const absTempChange = LvArray::math::abs( m_localSolution[stack.localRow + m_numComp + 1] ); + real64 const absTempChange = LvArray::math::abs( m_localSolution[stack.localRow + m_temperatureOffset] ); if( stack.localMaxDeltaTemp < absTempChange ) { stack.localMaxDeltaTemp = absTempChange; @@ -636,11 +638,15 @@ class ScalingForSystemSolutionKernel : public isothermalCompositionalMultiphaseB /// View on the scaling factor arrayView1d< real64 > const m_temperatureScalingFactor; + /// Temperature offset in solution array + integer const m_temperatureOffset; + }; /** * @class ScalingForSystemSolutionKernelFactory */ + class ScalingForSystemSolutionKernelFactory { public: @@ -666,23 +672,27 @@ class ScalingForSystemSolutionKernelFactory real64 const maxRelativeTempChange, real64 const maxCompFracChange, real64 const maxRelativeCompDensChange, + arrayView1d< real64 const > const pressure, + arrayView1d< real64 const > const temperature, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, + arrayView1d< real64 > temperatureScalingFactor, + + globalIndex const rankOffset, integer const numComp, string const dofKey, ElementSubRegionBase & subRegion, - arrayView1d< real64 const > const localSolution ) + arrayView1d< real64 const > const localSolution, + integer const temperatureOffset ) { - arrayView1d< real64 const > const pressure = subRegion.getField< fields::flow::pressure >(); - arrayView1d< real64 const > const temperature = subRegion.getField< fields::flow::temperature >(); - arrayView2d< real64 const, compflow::USD_COMP > const compDens = subRegion.getField< fields::flow::globalCompDensity >(); - arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::flow::pressureScalingFactor >(); - arrayView1d< real64 > temperatureScalingFactor = subRegion.getField< fields::flow::temperatureScalingFactor >(); - arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); + ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxRelativeTempChange, maxCompFracChange, maxRelativeCompDensChange, rankOffset, numComp, dofKey, subRegion, localSolution, pressure, temperature, compDens, pressureScalingFactor, - temperatureScalingFactor, compDensScalingFactor ); + compDensScalingFactor, temperatureScalingFactor, temperatureOffset ); return thermalCompositionalMultiphaseBaseKernels:: ScalingForSystemSolutionKernel::launch< POLICY >( subRegion.size(), kernel ); } @@ -723,32 +733,36 @@ class SolutionCheckKernel : public isothermalCompositionalMultiphaseBaseKernels: integer const allowNegativePressure, CompositionalMultiphaseFVM::ScalingType const scalingType, real64 const scalingFactor, - globalIndex const rankOffset, - integer const numComp, - string const dofKey, - ElementSubRegionBase const & subRegion, - arrayView1d< real64 const > const localSolution, arrayView1d< real64 const > const pressure, arrayView1d< real64 const > const temperature, arrayView2d< real64 const, compflow::USD_COMP > const compDens, arrayView1d< real64 > pressureScalingFactor, arrayView1d< real64 > compDensScalingFactor, - arrayView1d< real64 > temperatureScalingFactor ) + arrayView1d< real64 > temperatureScalingFactor, + globalIndex const rankOffset, + integer const numComp, + string const dofKey, + ElementSubRegionBase const & subRegion, + arrayView1d< real64 const > const localSolution, + + integer const temperatureOffset ) : Base( allowCompDensChopping, allowNegativePressure, scalingType, scalingFactor, + + pressure, + compDens, + pressureScalingFactor, + compDensScalingFactor, rankOffset, numComp, dofKey, subRegion, - localSolution, - pressure, - compDens, - pressureScalingFactor, - compDensScalingFactor ), + localSolution ), m_temperature( temperature ), - m_temperatureScalingFactor( temperatureScalingFactor ) + m_temperatureScalingFactor( temperatureScalingFactor ), + m_temperatureOffset( temperatureOffset ) {} /** @@ -764,7 +778,7 @@ class SolutionCheckKernel : public isothermalCompositionalMultiphaseBaseKernels: { bool const localScaling = m_scalingType == CompositionalMultiphaseFVM::ScalingType::Local; // compute the change in temperature - real64 const newTemp = m_temperature[ei] + (localScaling ? m_temperatureScalingFactor[ei] : m_scalingFactor * m_localSolution[stack.localRow + m_numComp + 1]); + real64 const newTemp = m_temperature[ei] + (localScaling ? m_temperatureScalingFactor[ei] : m_scalingFactor * m_localSolution[stack.localRow + m_temperatureOffset]); if( newTemp < minTemperature ) { stack.localMinVal = 0; @@ -780,6 +794,9 @@ class SolutionCheckKernel : public isothermalCompositionalMultiphaseBaseKernels: /// View on the scaling factor arrayView1d< real64 const > const m_temperatureScalingFactor; + /// Offset to temperature variable + integer m_temperatureOffset; + }; /** @@ -807,24 +824,27 @@ class SolutionCheckKernelFactory integer const allowNegativePressure, CompositionalMultiphaseFVM::ScalingType const scalingType, real64 const scalingFactor, + arrayView1d< real64 const > const pressure, + arrayView1d< real64 const > const temperature, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > temperatureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, + + + globalIndex const rankOffset, integer const numComp, string const dofKey, ElementSubRegionBase & subRegion, - arrayView1d< real64 const > const localSolution ) + arrayView1d< real64 const > const localSolution, + integer temperatureOffset ) { - arrayView1d< real64 const > const pressure = - subRegion.getField< fields::flow::pressure >(); - arrayView1d< real64 const > const temperature = - subRegion.getField< fields::flow::temperature >(); - arrayView2d< real64 const, compflow::USD_COMP > const compDens = - subRegion.getField< fields::flow::globalCompDensity >(); - arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::flow::pressureScalingFactor >(); - arrayView1d< real64 > temperatureScalingFactor = subRegion.getField< fields::flow::temperatureScalingFactor >(); - arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); + SolutionCheckKernel kernel( allowCompDensChopping, allowNegativePressure, scalingType, scalingFactor, + pressure, temperature, compDens, pressureScalingFactor, compDensScalingFactor, temperatureScalingFactor, rankOffset, numComp, dofKey, subRegion, localSolution, - pressure, temperature, compDens, pressureScalingFactor, temperatureScalingFactor, compDensScalingFactor ); + temperatureOffset ); return SolutionCheckKernel::launch< POLICY >( subRegion.size(), kernel ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index ffbef731fcd..08815b83e92 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -35,15 +35,20 @@ #include "mesh/PerforationFields.hpp" #include "mesh/WellElementSubRegion.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "physicsSolvers/fluidFlow/wells/PerforationFluxKernels.hpp" #include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" + +#include "physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" +#include "physicsSolvers/fluidFlow/wells/WellFields.hpp" + #if defined( __INTEL_COMPILER ) #pragma GCC optimize "O0" #endif @@ -59,8 +64,6 @@ CompositionalMultiphaseWell::CompositionalMultiphaseWell( const string & name, Group * const parent ) : WellSolverBase( name, parent ), - m_numPhases( 0 ), - m_numComponents( 0 ), m_useMass( false ), m_useTotalMassEquation( 1 ), m_maxCompFracChange( 1.0 ), @@ -104,6 +107,12 @@ CompositionalMultiphaseWell::CompositionalMultiphaseWell( const string & name, setApplyDefaultValue( -1.0 ). // disabled by default setDescription( "Maximum (absolute) pressure change in a Newton iteration" ); + this->registerWrapper( viewKeyStruct::maxRelativeTempChangeString(), &m_maxRelativeTempChange ). + setSizedFromParent( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 1.0 ). + setDescription( "Maximum (relative) change in temperature between two Newton iterations " ); + this->registerWrapper( viewKeyStruct::allowLocalCompDensChoppingString(), &m_allowCompDensChopping ). setSizedFromParent( 0 ). setInputFlag( InputFlags::OPTIONAL ). @@ -157,8 +166,9 @@ void CompositionalMultiphaseWell::registerDataOnMesh( Group & meshBodies ) m_numPhases = fluid0.numFluidPhases(); m_numComponents = fluid0.numFluidComponents(); } - m_numDofPerWellElement = m_numComponents + 2; // 1 pressure + NC compositions + 1 connectionRate - m_numDofPerResElement = m_numComponents + 1; // 1 pressure + NC compositions + m_numDofPerWellElement = isThermal() ? m_numComponents + 3 : m_numComponents + 2; // 1 pressure + NC compositions + 1 connectionRate + + // temp if thermal + m_numDofPerResElement = isThermal() ? m_numComponents + 2 : m_numComponents + 1; // 1 pressure + NC compositions + temp if thermal // loop over the wells forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, @@ -202,9 +212,8 @@ void CompositionalMultiphaseWell::registerDataOnMesh( Group & meshBodies ) reference().resizeDimension< 1, 2 >( m_numPhases, m_numComponents + 2 ); // dP, dT, dC subRegion.registerField< fields::well::totalMassDensity >( getName() ); - subRegion.registerField< fields::well::dTotalMassDensity_dPressure >( getName() ); - subRegion.registerField< fields::well::dTotalMassDensity_dGlobalCompDensity >( getName() ). - reference().resizeDimension< 1 >( m_numComponents ); + subRegion.registerField< fields::well::dTotalMassDensity >( getName() ). + reference().resizeDimension< 1 >( m_numComponents +2 ); // dP, dT, dC subRegion.registerField< fields::well::phaseVolumeFraction_n >( getName() ). reference().resizeDimension< 1 >( m_numPhases ); @@ -216,46 +225,39 @@ void CompositionalMultiphaseWell::registerDataOnMesh( Group & meshBodies ) PerforationData & perforationData = *subRegion.getPerforationData(); perforationData.registerField< fields::well::compPerforationRate >( getName() ). reference().resizeDimension< 1 >( m_numComponents ); - perforationData.registerField< fields::well::dCompPerforationRate_dPres >( getName() ). - reference().resizeDimension< 1, 2 >( 2, m_numComponents ); - perforationData.registerField< fields::well::dCompPerforationRate_dComp >( getName() ). - reference().resizeDimension< 1, 2, 3 >( 2, m_numComponents, m_numComponents ); + + perforationData.registerField< fields::well::dCompPerforationRate >( getName() ).reference().resizeDimension< 1, 2, 3 >( 2, m_numComponents, m_numComponents+ 2 ); + if( fluid.isThermal() ) + { + perforationData.registerField< fields::well::energyPerforationFlux >( getName() ); + perforationData.registerField< fields::well::dEnergyPerforationFlux >( getName() ). + reference().resizeDimension< 1, 2 >( 2, m_numComponents+2 ); + } WellControls & wellControls = getWellControls( subRegion ); wellControls.registerWrapper< real64 >( viewKeyStruct::currentBHPString() ); - wellControls.registerWrapper< real64 >( viewKeyStruct::dCurrentBHP_dPresString() ). - setRestartFlags( RestartFlags::NO_WRITE ); - wellControls.registerWrapper< array1d< real64 > >( viewKeyStruct::dCurrentBHP_dCompDensString() ). - setRestartFlags( RestartFlags::NO_WRITE ). + + wellControls.registerWrapper< array1d< real64 > >( viewKeyStruct::dCurrentBHPString() ). setSizedFromParent( 0 ). - reference().resizeDimension< 0 >( m_numComponents ); + reference().resizeDimension< 0 >( m_numComponents + 2 ); // dP, dT, dC + wellControls.registerWrapper< array1d< real64 > >( viewKeyStruct::currentPhaseVolRateString() ). setSizedFromParent( 0 ). reference().resizeDimension< 0 >( m_numPhases ); - wellControls.registerWrapper< array1d< real64 > >( viewKeyStruct::dCurrentPhaseVolRate_dPresString() ). - setRestartFlags( RestartFlags::NO_WRITE ). - setSizedFromParent( 0 ). - reference().resizeDimension< 0 >( m_numPhases ); - wellControls.registerWrapper< array2d< real64 > >( viewKeyStruct::dCurrentPhaseVolRate_dCompDensString() ). - setRestartFlags( RestartFlags::NO_WRITE ). - setSizedFromParent( 0 ). - reference().resizeDimension< 0, 1 >( m_numPhases, m_numComponents ); - wellControls.registerWrapper< array1d< real64 > >( viewKeyStruct::dCurrentPhaseVolRate_dRateString() ). - setRestartFlags( RestartFlags::NO_WRITE ). + + wellControls.registerWrapper< array2d< real64 > >( viewKeyStruct::dCurrentPhaseVolRateString() ). setSizedFromParent( 0 ). - reference().resizeDimension< 0 >( m_numPhases ); + reference().resizeDimension< 0, 1 >( m_numPhases, m_numComponents + 3 ); // dP, dT, dC, dQ - wellControls.registerWrapper< real64 >( viewKeyStruct::currentTotalVolRateString() ); wellControls.registerWrapper< real64 >( viewKeyStruct::massDensityString() ); - wellControls.registerWrapper< real64 >( viewKeyStruct::dCurrentTotalVolRate_dPresString() ). - setRestartFlags( RestartFlags::NO_WRITE ); - wellControls.registerWrapper< array1d< real64 > >( viewKeyStruct::dCurrentTotalVolRate_dCompDensString() ). - setRestartFlags( RestartFlags::NO_WRITE ). + + wellControls.registerWrapper< real64 >( viewKeyStruct::currentTotalVolRateString() ); + wellControls.registerWrapper< array1d< real64 > >( viewKeyStruct::dCurrentTotalVolRateString() ). setSizedFromParent( 0 ). - reference().resizeDimension< 0 >( m_numComponents ); - wellControls.registerWrapper< real64 >( viewKeyStruct::dCurrentTotalVolRate_dRateString() ). - setRestartFlags( RestartFlags::NO_WRITE ); + reference().resizeDimension< 0 >( m_numComponents + 3 ); // dP, dT, dC dQ + + wellControls.registerWrapper< real64 >( viewKeyStruct::massDensityString() ); // write rates output header // the rank that owns the reference well element is responsible @@ -560,17 +562,21 @@ void CompositionalMultiphaseWell::updateBHPForConstraint( WellElementSubRegion & { return; } + using Deriv = multifluid::DerivativeOffset; integer const numComp = m_numComponents; localIndex const iwelemRef = subRegion.getTopWellElementIndex(); + string & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); + fluidName = getConstitutiveName< MultiFluidBase >( subRegion ); + MultiFluidBase const & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); + integer isThermal = fluid.isThermal(); // subRegion data arrayView1d< real64 const > const & pres = subRegion.getField< fields::well::pressure >(); arrayView1d< real64 > const & totalMassDens = subRegion.getField< fields::well::totalMassDensity >(); - arrayView1d< real64 > const & dTotalMassDens_dPres = subRegion.getField< fields::well::dTotalMassDensity_dPressure >(); - arrayView2d< real64, compflow::USD_FLUID_DC > const & dTotalMassDens_dCompDens = subRegion.getField< fields::well::dTotalMassDensity_dGlobalCompDensity >(); + arrayView2d< real64, compflow::USD_FLUID_DC > const & dTotalMassDens = subRegion.getField< fields::well::dTotalMassDensity >(); arrayView1d< real64 const > const wellElemGravCoef = subRegion.getField< fields::well::gravityCoefficient >(); @@ -583,31 +589,36 @@ void CompositionalMultiphaseWell::updateBHPForConstraint( WellElementSubRegion & real64 & currentBHP = wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::currentBHPString() ); - real64 & dCurrentBHP_dPres = - wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentBHP_dPresString() ); - arrayView1d< real64 > const & dCurrentBHP_dCompDens = - wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentBHP_dCompDensString() ); - - // bring everything back to host, capture the scalars by reference - forAll< serialPolicy >( 1, [&numComp, - pres, - totalMassDens, - dTotalMassDens_dPres, - dTotalMassDens_dCompDens, - wellElemGravCoef, - ¤tBHP, - &dCurrentBHP_dPres, - dCurrentBHP_dCompDens, - &iwelemRef, - &refGravCoef] ( localIndex const ) + arrayView1d< real64 > const & dCurrentBHP = + wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentBHPString() ); + + geos::internal::kernelLaunchSelectorCompThermSwitch( numComp, isThermal, [&] ( auto NC, auto ISTHERMAL ) { - real64 const diffGravCoef = refGravCoef - wellElemGravCoef[iwelemRef]; - currentBHP = pres[iwelemRef] + totalMassDens[iwelemRef] * diffGravCoef; - dCurrentBHP_dPres = 1 + dTotalMassDens_dPres[iwelemRef] * diffGravCoef; - for( integer ic = 0; ic < numComp; ++ic ) + integer constexpr IS_THERMAL = ISTHERMAL(); + GEOS_UNUSED_VAR( NC ); + // bring everything back to host, capture the scalars by reference + forAll< serialPolicy >( 1, [&numComp, + pres, + totalMassDens, + dTotalMassDens, + wellElemGravCoef, + ¤tBHP, + &dCurrentBHP, + &iwelemRef, + &refGravCoef] ( localIndex const ) { - dCurrentBHP_dCompDens[ic] = dTotalMassDens_dCompDens[iwelemRef][ic] * diffGravCoef; - } + real64 const diffGravCoef = refGravCoef - wellElemGravCoef[iwelemRef]; + currentBHP = pres[iwelemRef] + totalMassDens[iwelemRef] * diffGravCoef; + dCurrentBHP[Deriv::dP] = 1 + dTotalMassDens[iwelemRef][Deriv::dP] * diffGravCoef; + for( integer ic = 0; ic < numComp; ++ic ) + { + dCurrentBHP[Deriv::dC+ic] = dTotalMassDens[iwelemRef][Deriv::dC+ic] * diffGravCoef; + } + if constexpr ( IS_THERMAL ) + { + dCurrentBHP[Deriv::dT] = dTotalMassDens[iwelemRef][Deriv::dT] * diffGravCoef; + } + } ); } ); if( logLevel >= 2 ) @@ -646,7 +657,7 @@ void CompositionalMultiphaseWell::updateVolRatesForConstraint( WellElementSubReg string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); MultiFluidBase & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); - + integer isThermal = fluid.isThermal(); arrayView3d< real64 const, multifluid::USD_PHASE > const & phaseFrac = fluid.phaseFraction(); arrayView4d< real64 const, multifluid::USD_PHASE_DC > const & dPhaseFrac = fluid.dPhaseFraction(); @@ -669,164 +680,170 @@ void CompositionalMultiphaseWell::updateVolRatesForConstraint( WellElementSubReg arrayView1d< real64 > const & currentPhaseVolRate = wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::currentPhaseVolRateString() ); - arrayView1d< real64 > const & dCurrentPhaseVolRate_dPres = - wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentPhaseVolRate_dPresString() ); - arrayView2d< real64 > const & dCurrentPhaseVolRate_dCompDens = - wellControls.getReference< array2d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentPhaseVolRate_dCompDensString() ); - arrayView1d< real64 > const & dCurrentPhaseVolRate_dRate = - wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentPhaseVolRate_dRateString() ); + arrayView2d< real64 > const & dCurrentPhaseVolRate = + wellControls.getReference< array2d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentPhaseVolRateString() ); real64 & currentTotalVolRate = wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::currentTotalVolRateString() ); - real64 & dCurrentTotalVolRate_dPres = - wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dPresString() ); - arrayView1d< real64 > const & dCurrentTotalVolRate_dCompDens = - wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dCompDensString() ); - real64 & dCurrentTotalVolRate_dRate = - wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dRateString() ); + arrayView1d< real64 > const & dCurrentTotalVolRate = + wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRateString() ); + real64 & massDensity = wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::massDensityString() ); constitutive::constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) { typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); - - // bring everything back to host, capture the scalars by reference - forAll< serialPolicy >( 1, [&numComp, - &numPhase, - fluidWrapper, - pres, - temp, - compFrac, - dCompFrac_dCompDens, - connRate, - totalDens, - dTotalDens, - phaseDens, - dPhaseDens, - phaseFrac, - dPhaseFrac, - &useSurfaceConditions, - &surfacePres, - &surfaceTemp, - ¤tTotalVolRate, - &dCurrentTotalVolRate_dPres, - dCurrentTotalVolRate_dCompDens, - &dCurrentTotalVolRate_dRate, - currentPhaseVolRate, - dCurrentPhaseVolRate_dPres, - dCurrentPhaseVolRate_dCompDens, - dCurrentPhaseVolRate_dRate, - &iwelemRef, - &logLevel, - &wellControlsName, - &massUnit, - &massDensity] ( localIndex const ) + geos::internal::kernelLaunchSelectorCompThermSwitch( numComp, isThermal, [&] ( auto NC, auto ISTHERMAL ) { - GEOS_UNUSED_VAR( massUnit ); - using Deriv = multifluid::DerivativeOffset; - - stackArray1d< real64, maxNumComp > work( numComp ); - - // Step 1: evaluate the phase and total density in the reference element - - // We need to evaluate the density as follows: - // - Surface conditions: using the surface pressure provided by the user - // - Reservoir conditions: using the pressure in the top element - if( useSurfaceConditions ) + integer constexpr NUM_COMP = NC(); + integer constexpr IS_THERMAL = ISTHERMAL(); + using COFFSET_WJ = compositionalMultiphaseWellKernels::ColOffset_WellJac< NUM_COMP, IS_THERMAL >; + // bring everything back to host, capture the scalars by reference + forAll< serialPolicy >( 1, [&numComp, + &numPhase, + fluidWrapper, + pres, + temp, + compFrac, + dCompFrac_dCompDens, + connRate, + totalDens, + dTotalDens, + phaseDens, + dPhaseDens, + phaseFrac, + dPhaseFrac, + &useSurfaceConditions, + &surfacePres, + &surfaceTemp, + ¤tTotalVolRate, + dCurrentTotalVolRate, + currentPhaseVolRate, + dCurrentPhaseVolRate, + &iwelemRef, + &logLevel, + &wellControlsName, + &massUnit, + &massDensity] ( localIndex const ) { - // we need to compute the surface density - fluidWrapper.update( iwelemRef, 0, surfacePres, surfaceTemp, compFrac[iwelemRef] ); - if( logLevel >= 2 ) + GEOS_UNUSED_VAR( massUnit ); + using Deriv = multifluid::DerivativeOffset; + stackArray1d< real64, maxNumComp > work( numComp ); + // Step 1: evaluate the phase and total density in the reference element + + // We need to evaluate the density as follows: + // - Surface conditions: using the surface pressure provided by the user + // - Reservoir conditions: using the pressure in the top element + if( useSurfaceConditions ) { - GEOS_LOG_RANK( GEOS_FMT( "{}: surface density computed with P_surface = {} Pa and T_surface = {} K", - wellControlsName, surfacePres, surfaceTemp ) ); + // we need to compute the surface density + fluidWrapper.update( iwelemRef, 0, surfacePres, surfaceTemp, compFrac[iwelemRef] ); + if( logLevel >= 2 ) + { + GEOS_LOG_RANK( GEOS_FMT( "{}: surface density computed with P_surface = {} Pa and T_surface = {} K", + wellControlsName, surfacePres, surfaceTemp ) ); #ifdef GEOS_USE_HIP - GEOS_UNUSED_VAR( wellControlsName ); + GEOS_UNUSED_VAR( wellControlsName ); #endif + } + } + else + { + real64 const refPres = pres[iwelemRef]; + fluidWrapper.update( iwelemRef, 0, refPres, temp[iwelemRef], compFrac[iwelemRef] ); } - } - else - { - real64 const refPres = pres[iwelemRef]; - fluidWrapper.update( iwelemRef, 0, refPres, temp[iwelemRef], compFrac[iwelemRef] ); - } - - // Step 2: update the total volume rate - - real64 const currentTotalRate = connRate[iwelemRef]; - - // Step 2.1: compute the inverse of the total density and derivatives - massDensity = totalDens[iwelemRef][0]; // need to verify this is surface dens - real64 const totalDensInv = 1.0 / totalDens[iwelemRef][0]; - real64 const dTotalDensInv_dPres = -dTotalDens[iwelemRef][0][Deriv::dP] * totalDensInv * totalDensInv; - stackArray1d< real64, maxNumComp > dTotalDensInv_dCompDens( numComp ); - for( integer ic = 0; ic < numComp; ++ic ) - { - dTotalDensInv_dCompDens[ic] = -dTotalDens[iwelemRef][0][Deriv::dC+ic] * totalDensInv * totalDensInv; - } - applyChainRuleInPlace( numComp, dCompFrac_dCompDens[iwelemRef], dTotalDensInv_dCompDens, work.data() ); - - // Step 2.2: divide the total mass/molar rate by the total density to get the total volumetric rate - currentTotalVolRate = currentTotalRate * totalDensInv; - dCurrentTotalVolRate_dPres = ( useSurfaceConditions == 0 ) * currentTotalRate * dTotalDensInv_dPres; - dCurrentTotalVolRate_dRate = totalDensInv; - for( integer ic = 0; ic < numComp; ++ic ) - { - dCurrentTotalVolRate_dCompDens[ic] = currentTotalRate * dTotalDensInv_dCompDens[ic]; - } - if( logLevel >= 2 && useSurfaceConditions ) - { - GEOS_LOG_RANK( GEOS_FMT( "{}: total fluid density at surface conditions = {} {}/sm3, total rate = {} {}/s, total surface volumetric rate = {} sm3/s", - wellControlsName, totalDens[iwelemRef][0], massUnit, currentTotalRate, massUnit, currentTotalVolRate ) ); - } + // Step 2: update the total volume rate - // Step 3: update the phase volume rate - for( integer ip = 0; ip < numPhase; ++ip ) - { + real64 const currentTotalRate = connRate[iwelemRef]; - // Step 3.1: compute the inverse of the (phase density * phase fraction) and derivatives + // Step 2.1: compute the inverse of the total density and derivatives + massDensity = totalDens[iwelemRef][0]; + real64 const totalDensInv = 1.0 / totalDens[iwelemRef][0]; - // skip the rest of this function if phase ip is absent - bool const phaseExists = (phaseFrac[iwelemRef][0][ip] > 0); - if( !phaseExists ) + stackArray1d< real64, maxNumComp > dTotalDensInv_dCompDens( numComp ); + for( integer ic = 0; ic < numComp; ++ic ) { - continue; + dTotalDensInv_dCompDens[ic] = -dTotalDens[iwelemRef][0][Deriv::dC+ic] * totalDensInv * totalDensInv; + } + applyChainRuleInPlace( numComp, dCompFrac_dCompDens[iwelemRef], dTotalDensInv_dCompDens, work.data() ); + + // Step 2.2: divide the total mass/molar rate by the total density to get the total volumetric rate + currentTotalVolRate = currentTotalRate * totalDensInv; + // Compute derivatives dP dT + real64 const dTotalDensInv_dPres = -dTotalDens[iwelemRef][0][Deriv::dP] * totalDensInv * totalDensInv; + dCurrentTotalVolRate[COFFSET_WJ::dP] = ( useSurfaceConditions == 0 ) * currentTotalRate * dTotalDensInv_dPres; + if constexpr ( IS_THERMAL ) + { + dCurrentTotalVolRate[COFFSET_WJ::dT] = ( useSurfaceConditions == 0 ) * currentTotalRate * -dTotalDens[iwelemRef][0][Deriv::dT] * totalDensInv * totalDensInv; } - real64 const phaseDensInv = 1.0 / phaseDens[iwelemRef][0][ip]; - real64 const phaseFracTimesPhaseDensInv = phaseFrac[iwelemRef][0][ip] * phaseDensInv; - real64 const dPhaseFracTimesPhaseDensInv_dPres = dPhaseFrac[iwelemRef][0][ip][Deriv::dP] * phaseDensInv - - dPhaseDens[iwelemRef][0][ip][Deriv::dP] * phaseFracTimesPhaseDensInv * phaseDensInv; - - - // Step 3.2: divide the total mass/molar rate by the (phase density * phase fraction) to get the phase volumetric rate - currentPhaseVolRate[ip] = currentTotalRate * phaseFracTimesPhaseDensInv; - dCurrentPhaseVolRate_dPres[ip] = ( useSurfaceConditions == 0 ) * currentTotalRate * dPhaseFracTimesPhaseDensInv_dPres; - dCurrentPhaseVolRate_dRate[ip] = phaseFracTimesPhaseDensInv; + dCurrentTotalVolRate[COFFSET_WJ::dQ] = totalDensInv; for( integer ic = 0; ic < numComp; ++ic ) { - dCurrentPhaseVolRate_dCompDens[ip][ic] = -phaseFracTimesPhaseDensInv * dPhaseDens[iwelemRef][0][ip][Deriv::dC+ic] * phaseDensInv; - dCurrentPhaseVolRate_dCompDens[ip][ic] += dPhaseFrac[iwelemRef][0][ip][Deriv::dC+ic] * phaseDensInv; - dCurrentPhaseVolRate_dCompDens[ip][ic] *= currentTotalRate; + dCurrentTotalVolRate[COFFSET_WJ::dC+ic] = currentTotalRate * dTotalDensInv_dCompDens[ic]; } - applyChainRuleInPlace( numComp, dCompFrac_dCompDens[iwelemRef], dCurrentPhaseVolRate_dCompDens[ip], work.data() ); if( logLevel >= 2 && useSurfaceConditions ) { - GEOS_LOG_RANK( GEOS_FMT( "{}: density of phase {} at surface conditions = {} {}/sm3, phase surface volumetric rate = {} sm3/s", - wellControlsName, ip, phaseDens[iwelemRef][0][ip], massUnit, currentPhaseVolRate[ip] ) ); + GEOS_LOG_RANK( GEOS_FMT( "{}: total fluid density at surface conditions = {} {}/sm3, total rate = {} {}/s, total surface volumetric rate = {} sm3/s", + wellControlsName, totalDens[iwelemRef][0], massUnit, currentTotalRate, massUnit, currentTotalVolRate ) ); } - } + + // Step 3: update the phase volume rate + for( integer ip = 0; ip < numPhase; ++ip ) + { + + // Step 3.1: compute the inverse of the (phase density * phase fraction) and derivatives + + // skip the rest of this function if phase ip is absent + bool const phaseExists = (phaseFrac[iwelemRef][0][ip] > 0); + if( !phaseExists ) + { + continue; + } + + real64 const phaseDensInv = 1.0 / phaseDens[iwelemRef][0][ip]; + real64 const phaseFracTimesPhaseDensInv = phaseFrac[iwelemRef][0][ip] * phaseDensInv; + real64 const dPhaseFracTimesPhaseDensInv_dPres = dPhaseFrac[iwelemRef][0][ip][Deriv::dP] * phaseDensInv + - dPhaseDens[iwelemRef][0][ip][Deriv::dP] * phaseFracTimesPhaseDensInv * phaseDensInv; + + + // Step 3.2: divide the total mass/molar rate by the (phase density * phase fraction) to get the phase volumetric rate + currentPhaseVolRate[ip] = currentTotalRate * phaseFracTimesPhaseDensInv; + dCurrentPhaseVolRate[ip][COFFSET_WJ::dP] = ( useSurfaceConditions == 0 ) * currentTotalRate * dPhaseFracTimesPhaseDensInv_dPres; + dCurrentPhaseVolRate[ip][COFFSET_WJ::dQ] = phaseFracTimesPhaseDensInv; + if constexpr (IS_THERMAL ) + { + real64 const dPhaseFracTimesPhaseDensInv_dTemp = dPhaseFrac[iwelemRef][0][ip][Deriv::dT] * phaseDensInv + - dPhaseDens[iwelemRef][0][ip][Deriv::dT] * phaseFracTimesPhaseDensInv * phaseDensInv; + dCurrentPhaseVolRate[ip][COFFSET_WJ::dT] = ( useSurfaceConditions == 0 ) * currentTotalRate * dPhaseFracTimesPhaseDensInv_dTemp; + } + + for( integer ic = 0; ic < numComp; ++ic ) + { + dCurrentPhaseVolRate[ip][COFFSET_WJ::dC+ic] = -phaseFracTimesPhaseDensInv * dPhaseDens[iwelemRef][0][ip][Deriv::dC+ic] * phaseDensInv; + dCurrentPhaseVolRate[ip][COFFSET_WJ::dC+ic] += dPhaseFrac[iwelemRef][0][ip][Deriv::dC+ic] * phaseDensInv; + dCurrentPhaseVolRate[ip][COFFSET_WJ::dC+ic] *= currentTotalRate; + } + applyChainRuleInPlace( numComp, dCompFrac_dCompDens[iwelemRef], &dCurrentPhaseVolRate[ip][COFFSET_WJ::dC], work.data() ); + + if( logLevel >= 2 && useSurfaceConditions ) + { + GEOS_LOG_RANK( GEOS_FMT( "{}: density of phase {} at surface conditions = {} {}/sm3, phase surface volumetric rate = {} sm3/s", + wellControlsName, ip, phaseDens[iwelemRef][0][ip], massUnit, currentPhaseVolRate[ip] ) ); + } + } + } ); } ); } ); } + void CompositionalMultiphaseWell::updateFluidModel( WellElementSubRegion & subRegion ) { GEOS_MARK_FUNCTION; - arrayView1d< real64 const > const & pres = subRegion.getField< fields::well::pressure >(); arrayView1d< real64 const > const & temp = subRegion.getField< fields::well::temperature >(); arrayView2d< real64 const, compflow::USD_COMP > const & compFrac = subRegion.getField< fields::well::globalCompFraction >(); @@ -839,7 +856,6 @@ void CompositionalMultiphaseWell::updateFluidModel( WellElementSubRegion & subRe using FluidType = TYPEOFREF( castedFluid ); using ExecPolicy = typename FluidType::exec_policy; typename FluidType::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); - thermalCompositionalMultiphaseBaseKernels:: FluidUpdateKernel:: launch< ExecPolicy >( subRegion.size(), @@ -848,21 +864,32 @@ void CompositionalMultiphaseWell::updateFluidModel( WellElementSubRegion & subRe temp, compFrac ); } ); + } -void CompositionalMultiphaseWell::updatePhaseVolumeFraction( WellElementSubRegion & subRegion ) const +real64 CompositionalMultiphaseWell::updatePhaseVolumeFraction( WellElementSubRegion & subRegion ) const { GEOS_MARK_FUNCTION; string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); MultiFluidBase & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); - isothermalCompositionalMultiphaseBaseKernels:: - PhaseVolumeFractionKernelFactory:: - createAndLaunch< parallelDevicePolicy<> >( m_numComponents, - m_numPhases, - subRegion, - fluid ); + real64 maxDeltaPhaseVolFrac = + m_isThermal ? + thermalCompositionalMultiphaseBaseKernels:: + PhaseVolumeFractionKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( m_numComponents, + m_numPhases, + subRegion, + fluid ) +: isothermalCompositionalMultiphaseBaseKernels:: + PhaseVolumeFractionKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( m_numComponents, + m_numPhases, + subRegion, + fluid ); + + return maxDeltaPhaseVolFrac; } void CompositionalMultiphaseWell::updateTotalMassDensity( WellElementSubRegion & subRegion ) const @@ -871,15 +898,45 @@ void CompositionalMultiphaseWell::updateTotalMassDensity( WellElementSubRegion & string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); MultiFluidBase & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); - + fluid.isThermal() ? + thermalCompositionalMultiphaseWellKernels:: + TotalMassDensityKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( m_numComponents, + m_numPhases, + subRegion, + fluid ) + : TotalMassDensityKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, subRegion, fluid ); + } -void CompositionalMultiphaseWell::updateSubRegionState( WellElementSubRegion & subRegion ) +void CompositionalMultiphaseWell::updateState( DomainPartition & domain ) +{ + GEOS_MARK_FUNCTION; + + real64 maxPhaseVolFrac = 0.0; + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, + WellElementSubRegion & subRegion ) + { + real64 const maxRegionPhaseVolFrac = updateSubRegionState( subRegion ); + maxPhaseVolFrac = LvArray::math::max( maxRegionPhaseVolFrac, maxPhaseVolFrac ); + } ); + } ); + maxPhaseVolFrac = MpiWrapper::max( maxPhaseVolFrac ); + + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max well phase volume fraction change = {}", getName(), fmt::format( "{:.{}f}", maxPhaseVolFrac, 4 ) ) ); + +} + +real64 CompositionalMultiphaseWell::updateSubRegionState( WellElementSubRegion & subRegion ) { // update properties updateGlobalComponentFraction( subRegion ); @@ -889,17 +946,16 @@ void CompositionalMultiphaseWell::updateSubRegionState( WellElementSubRegion & s updateVolRatesForConstraint( subRegion ); // update densities, phase fractions, phase volume fractions - updateFluidModel( subRegion ); - updatePhaseVolumeFraction( subRegion ); - updateTotalMassDensity( subRegion ); + updateFluidModel( subRegion ); // Calculate fluid properties; + real64 maxPhaseVolChange = updatePhaseVolumeFraction( subRegion ); + updateTotalMassDensity( subRegion ); // update the current BHP pressure updateBHPForConstraint( subRegion ); - - // note: the perforation rates are updated separately + return maxPhaseVolChange; } -void CompositionalMultiphaseWell::initializeWells( DomainPartition & domain ) +void CompositionalMultiphaseWell::initializeWells( DomainPartition & domain, real64 const & time_n, real64 const & dt ) { GEOS_MARK_FUNCTION; @@ -924,270 +980,253 @@ void CompositionalMultiphaseWell::initializeWells( DomainPartition & domain ) WellElementSubRegion & subRegion ) { WellControls const & wellControls = getWellControls( subRegion ); - PerforationData const & perforationData = *subRegion.getPerforationData(); - - // get well primary variables on well elements - arrayView1d< real64 > const & wellElemPressure = subRegion.getField< fields::well::pressure >(); - arrayView1d< real64 > const & wellElemTemp = subRegion.getField< fields::well::temperature >(); - arrayView2d< real64, compflow::USD_COMP > const & wellElemCompDens = subRegion.getField< fields::well::globalCompDensity >(); - arrayView1d< real64 > const & connRate = subRegion.getField< fields::well::mixtureConnectionRate >(); - - // get the info stored on well elements - arrayView2d< real64, compflow::USD_COMP > const & wellElemCompFrac = subRegion.getField< fields::well::globalCompFraction >(); - arrayView1d< real64 const > const & wellElemGravCoef = subRegion.getField< fields::well::gravityCoefficient >(); - - // get the element region, subregion, index - arrayView1d< localIndex const > const resElementRegion = perforationData.getField< fields::perforation::reservoirElementRegion >(); - arrayView1d< localIndex const > const resElementSubRegion = perforationData.getField< fields::perforation::reservoirElementSubRegion >(); - arrayView1d< localIndex const > const resElementIndex = perforationData.getField< fields::perforation::reservoirElementIndex >(); - - arrayView1d< real64 const > const & perfGravCoef = perforationData.getField< fields::well::gravityCoefficient >(); - - // 1) Loop over all perforations to compute an average mixture density and component fraction - // 2) Initialize the reference pressure - // 3) Estimate the pressures in the well elements using the average density - PresTempCompFracInitializationKernel:: - launch( perforationData.size(), - subRegion.size(), - numComp, - numPhase, - perforationData.getNumPerforationsGlobal(), - wellControls, - 0.0, // initialization done at t = 0 - resCompFlowAccessors.get( fields::flow::pressure{} ), - resCompFlowAccessors.get( fields::flow::temperature{} ), - resCompFlowAccessors.get( fields::flow::globalCompDensity{} ), - resCompFlowAccessors.get( fields::flow::phaseVolumeFraction{} ), - resMultiFluidAccessors.get( fields::multifluid::phaseMassDensity{} ), - resElementRegion, - resElementSubRegion, - resElementIndex, - perfGravCoef, - wellElemGravCoef, - wellElemPressure, - wellElemTemp, - wellElemCompFrac ); - - // get well secondary variables on well elements - string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); - MultiFluidBase & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); - arrayView3d< real64 const, multifluid::USD_PHASE > const & wellElemPhaseDens = fluid.phaseDensity(); - arrayView2d< real64 const, multifluid::USD_FLUID > const & wellElemTotalDens = fluid.totalDensity(); - // 4) Back calculate component densities - constitutive::constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) + if( time_n <= 0.0 || + ( !wellControls.isWellOpen( time_n ) && wellControls.isWellOpen( time_n + dt ) ) ) { - typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); - - thermalCompositionalMultiphaseBaseKernels:: - FluidUpdateKernel:: - launch< serialPolicy >( subRegion.size(), - fluidWrapper, - wellElemPressure, - wellElemTemp, - wellElemCompFrac ); - } ); - - CompDensInitializationKernel::launch( subRegion.size(), - numComp, - wellElemCompFrac, - wellElemTotalDens, - wellElemCompDens ); - // 5) Recompute the pressure-dependent properties - updateSubRegionState( subRegion ); - - // 6) Estimate the well rates - // TODO: initialize rates using perforation rates - compositionalMultiphaseWellKernels:: - RateInitializationKernel:: - launch( subRegion.size(), - m_targetPhaseIndex, - wellControls, - 0.0, // initialization done at t = 0 - wellElemPhaseDens, - wellElemTotalDens, - connRate ); + PerforationData const & perforationData = *subRegion.getPerforationData(); + + // get well primary variables on well elements + arrayView1d< real64 > const & wellElemPressure = subRegion.getField< fields::well::pressure >(); + arrayView1d< real64 > const & wellElemTemp = subRegion.getField< fields::well::temperature >(); + arrayView2d< real64, compflow::USD_COMP > const & wellElemCompDens = subRegion.getField< fields::well::globalCompDensity >(); + arrayView1d< real64 > const & connRate = subRegion.getField< fields::well::mixtureConnectionRate >(); + + // get the info stored on well elements + arrayView2d< real64, compflow::USD_COMP > const & wellElemCompFrac = subRegion.getField< fields::well::globalCompFraction >(); + arrayView1d< real64 const > const & wellElemGravCoef = subRegion.getField< fields::well::gravityCoefficient >(); + + // get the element region, subregion, index + arrayView1d< localIndex const > const resElementRegion = perforationData.getField< fields::perforation::reservoirElementRegion >(); + arrayView1d< localIndex const > const resElementSubRegion = perforationData.getField< fields::perforation::reservoirElementSubRegion >(); + arrayView1d< localIndex const > const resElementIndex = perforationData.getField< fields::perforation::reservoirElementIndex >(); + + arrayView1d< real64 const > const & perfGravCoef = perforationData.getField< fields::well::gravityCoefficient >(); + + // 1) Loop over all perforations to compute an average mixture density and component fraction + // 2) Initialize the reference pressure + // 3) Estimate the pressures in the well elements using the average density + PresTempCompFracInitializationKernel:: + launch( perforationData.size(), + subRegion.size(), + numComp, + numPhase, + perforationData.getNumPerforationsGlobal(), + wellControls, + 0.0, // initialization done at t = 0 + resCompFlowAccessors.get( fields::flow::pressure{} ), + resCompFlowAccessors.get( fields::flow::temperature{} ), + resCompFlowAccessors.get( fields::flow::globalCompDensity{} ), + resCompFlowAccessors.get( fields::flow::phaseVolumeFraction{} ), + resMultiFluidAccessors.get( fields::multifluid::phaseMassDensity{} ), + resElementRegion, + resElementSubRegion, + resElementIndex, + perfGravCoef, + wellElemGravCoef, + wellElemPressure, + wellElemTemp, + wellElemCompFrac ); + + // get well secondary variables on well elements + string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); + MultiFluidBase & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); + arrayView3d< real64 const, multifluid::USD_PHASE > const & wellElemPhaseDens = fluid.phaseDensity(); + arrayView2d< real64 const, multifluid::USD_FLUID > const & wellElemTotalDens = fluid.totalDensity(); + + // 4) Back calculate component densities + constitutive::constitutiveUpdatePassThru( fluid, [&] ( auto & castedFluid ) + { + typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); + + thermalCompositionalMultiphaseBaseKernels:: + FluidUpdateKernel:: + launch< serialPolicy >( subRegion.size(), + fluidWrapper, + wellElemPressure, + wellElemTemp, + wellElemCompFrac ); + } ); + + CompDensInitializationKernel::launch( subRegion.size(), + numComp, + wellElemCompFrac, + wellElemTotalDens, + wellElemCompDens ); + + // 5) Recompute the pressure-dependent properties + updateSubRegionState( subRegion ); + + // 6) Estimate the well rates + // TODO: initialize rates using perforation rates + compositionalMultiphaseWellKernels:: + RateInitializationKernel:: + launch( subRegion.size(), + m_targetPhaseIndex, + wellControls, + 0.0, // initialization done at t = 0 + wellElemPhaseDens, + wellElemTotalDens, + connRate ); + } } ); } ); } -void CompositionalMultiphaseWell::assembleFluxTerms( real64 const dt, - DomainPartition const & domain, +void CompositionalMultiphaseWell::assembleFluxTerms( real64 const & time, + real64 const & dt, + DomainPartition & domain, DofManager const & dofManager, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; - // loop over the wells - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & regionNames ) - { - ElementRegionManager const & elemManager = mesh.getElemManager(); - elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, - [&]( localIndex const, - WellElementSubRegion const & subRegion ) + string const wellDofKey = dofManager.getKey( wellElementDofName()); + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, + [&]( localIndex const, + WellElementSubRegion & subRegion ) { - WellControls const & wellControls = getWellControls( subRegion ); - - // get a reference to the degree-of-freedom numbers - string const wellDofKey = dofManager.getKey( wellElementDofName() ); - arrayView1d< globalIndex const > const & wellElemDofNumber = - subRegion.getReference< array1d< globalIndex > >( wellDofKey ); - arrayView1d< localIndex const > const & nextWellElemIndex = - subRegion.getReference< array1d< localIndex > >( WellElementSubRegion::viewKeyStruct::nextWellElementIndexString() ); + WellControls const & well_controls = getWellControls( subRegion ); + if( well_controls.isWellOpen( time+ dt ) ) + { + string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString()); + MultiFluidBase const & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); + int numComponents = fluid.numFluidComponents(); - // get a reference to the primary variables on well elements - arrayView1d< real64 const > const & connRate = subRegion.getField< fields::well::mixtureConnectionRate >(); - - // get the info stored on well elements - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompFrac = subRegion.getField< fields::well::globalCompFraction >(); - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens = subRegion.getField< fields::well::dGlobalCompFraction_dGlobalCompDensity >(); - - isothermalCompositionalMultiphaseBaseKernels:: - KernelLaunchSelector1< FluxKernel >( numFluidComponents(), - subRegion.size(), - dofManager.rankOffset(), - m_useTotalMassEquation, - wellControls, - wellElemDofNumber, - nextWellElemIndex, - connRate, - wellElemCompFrac, - dWellElemCompFrac_dCompDens, - dt, - localMatrix, - localRhs ); + if( isThermal() ) + { + thermalCompositionalMultiphaseWellKernels:: + FaceBasedAssemblyKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( numComponents, + dt, + dofManager.rankOffset(), + m_useTotalMassEquation, + wellDofKey, + well_controls, + subRegion, + fluid, + localMatrix, + localRhs ); + } + else + { + compositionalMultiphaseWellKernels:: + FaceBasedAssemblyKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( numComponents, + dt, + dofManager.rankOffset(), + m_useTotalMassEquation, + wellDofKey, + well_controls, + subRegion, + localMatrix, + localRhs ); + } + } } ); } ); + } -void CompositionalMultiphaseWell::assembleAccumulationTerms( DomainPartition const & domain, +void CompositionalMultiphaseWell::assembleAccumulationTerms( real64 const & time, + real64 const & dt, + DomainPartition & domain, DofManager const & dofManager, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; - + GEOS_UNUSED_VAR( time ); + GEOS_UNUSED_VAR( dt ); string const wellDofKey = dofManager.getKey( wellElementDofName() ); - - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & regionNames ) + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { - - ElementRegionManager const & elemManager = mesh.getElemManager(); - - elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, - [&]( localIndex const, - WellElementSubRegion const & subRegion ) + mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, + [&]( localIndex const, + WellElementSubRegion & subRegion ) { + string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString()); + MultiFluidBase const & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); + int numPhases = fluid.numFluidPhases(); + int numComponents = fluid.numFluidComponents(); + WellControls const & wellControls = getWellControls( subRegion ); + if( wellControls.isWellOpen( time+ dt ) ) + { + if( isThermal() ) + { - // get the degrees of freedom and ghosting info - arrayView1d< globalIndex const > const & wellElemDofNumber = - subRegion.getReference< array1d< globalIndex > >( wellDofKey ); - arrayView1d< integer const > const & wellElemGhostRank = subRegion.ghostRank(); - - // get the properties on the well element - arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac = - subRegion.getField< fields::well::phaseVolumeFraction >(); - arrayView3d< real64 const, compflow::USD_PHASE_DC > const & dWellElemPhaseVolFrac = - subRegion.getField< fields::well::dPhaseVolumeFraction >(); - - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens = - subRegion.getField< fields::well::dGlobalCompFraction_dGlobalCompDensity >(); - - arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac_n = - subRegion.getField< fields::well::phaseVolumeFraction_n >(); - - arrayView1d< real64 const > const & wellElemVolume = subRegion.getElementVolume(); + thermalCompositionalMultiphaseWellKernels:: + ElementBasedAssemblyKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( numComponents, + numPhases, + wellControls.isProducer(), + dofManager.rankOffset(), + m_useTotalMassEquation, + wellDofKey, + subRegion, + fluid, + localMatrix, + localRhs ); + } + else + { + compositionalMultiphaseWellKernels:: + ElementBasedAssemblyKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( numComponents, + numPhases, + wellControls.isProducer(), + dofManager.rankOffset(), + m_useTotalMassEquation, + wellDofKey, + subRegion, + fluid, + localMatrix, + localRhs ); + } + } + else + { + //wellControls.setWellOpen(false); + // get the degrees of freedom and ghosting info + arrayView1d< globalIndex const > const & wellElemDofNumber = + subRegion.getReference< array1d< globalIndex > >( wellDofKey ); + arrayView1d< integer const > const & wellElemGhostRank = subRegion.ghostRank(); + localIndex rank_offset = dofManager.rankOffset(); + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( wellElemGhostRank[ei] < 0 ) + { + globalIndex const dofIndex = wellElemDofNumber[ei]; + localIndex const localRow = dofIndex - rank_offset; - string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); - MultiFluidBase const & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); - arrayView3d< real64 const, multifluid::USD_PHASE > const & wellElemPhaseDens = fluid.phaseDensity(); - arrayView4d< real64 const, multifluid::USD_PHASE_DC > const & dWellElemPhaseDens = fluid.dPhaseDensity(); - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac = fluid.phaseCompFraction(); - arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > const & dWellElemPhaseCompFrac = fluid.dPhaseCompFraction(); - arrayView3d< real64 const, multifluid::USD_PHASE > const & wellElemPhaseDens_n = fluid.phaseDensity_n(); - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac_n = fluid.phaseCompFraction_n(); - - isothermalCompositionalMultiphaseBaseKernels:: - KernelLaunchSelector1< AccumulationKernel >( numFluidComponents(), - subRegion.size(), - numFluidPhases(), - dofManager.rankOffset(), - m_useTotalMassEquation, - wellElemDofNumber, - wellElemGhostRank, - wellElemVolume, - wellElemPhaseVolFrac, - dWellElemPhaseVolFrac, - dWellElemCompFrac_dCompDens, - wellElemPhaseDens, - dWellElemPhaseDens, - wellElemPhaseCompFrac, - dWellElemPhaseCompFrac, - wellElemPhaseVolFrac_n, - wellElemPhaseDens_n, - wellElemPhaseCompFrac_n, - localMatrix, - localRhs ); + real64 unity = 1.0; + for( integer i=0; i < m_numDofPerWellElement; i++ ) + { + globalIndex const rindex = localRow+i; + globalIndex const cindex =dofIndex + i; + localMatrix.template addToRow< serialAtomic >( rindex, + &cindex, + &unity, + 1 ); + localRhs[rindex] = 0.0; + } + } + } ); + } } ); } ); -} - - -void CompositionalMultiphaseWell::assembleVolumeBalanceTerms( DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) -{ - GEOS_MARK_FUNCTION; - string const wellDofKey = dofManager.getKey( wellElementDofName() ); - - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & regionNames ) - { - ElementRegionManager const & elemManager = mesh.getElemManager(); - - elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, - [&]( localIndex const, - WellElementSubRegion const & subRegion ) - { - // get the degrees of freedom and ghosting info - arrayView1d< globalIndex const > const & wellElemDofNumber = subRegion.getReference< array1d< globalIndex > >( wellDofKey ); - arrayView1d< integer const > const & wellElemGhostRank = subRegion.ghostRank(); - - // get the properties on the well element - arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac = - subRegion.getField< fields::well::phaseVolumeFraction >(); - arrayView3d< real64 const, compflow::USD_PHASE_DC > const & dWellElemPhaseVolFrac = - subRegion.getField< fields::well::dPhaseVolumeFraction >(); - - arrayView1d< real64 const > const & wellElemVolume = - subRegion.getReference< array1d< real64 > >( ElementSubRegionBase::viewKeyStruct::elementVolumeString() ); - - isothermalCompositionalMultiphaseBaseKernels:: - KernelLaunchSelector1< VolumeBalanceKernel >( numFluidComponents(), - subRegion.size(), - numFluidPhases(), - dofManager.rankOffset(), - wellElemDofNumber, - wellElemGhostRank, - wellElemPhaseVolFrac, - dWellElemPhaseVolFrac, - wellElemVolume, - localMatrix, - localRhs ); - } ); - } ); } @@ -1200,7 +1239,17 @@ CompositionalMultiphaseWell::calculateResidualNorm( real64 const & time_n, { GEOS_MARK_FUNCTION; - real64 localResidualNorm = 0.0; + integer numNorm = 1; // mass balance + array1d< real64 > localResidualNorm; + array1d< real64 > localResidualNormalizer; + + if( isThermal() ) + { + numNorm = 2; // mass balance and energy balance + } + localResidualNorm.resize( numNorm ); + localResidualNormalizer.resize( numNorm ); + globalIndex const rankOffset = dofManager.rankOffset(); string const wellDofKey = dofManager.getKey( wellElementDofName() ); @@ -1217,7 +1266,7 @@ CompositionalMultiphaseWell::calculateResidualNorm( real64 const & time_n, [&]( localIndex const, WellElementSubRegion const & subRegion ) { - real64 subRegionResidualNorm[1]{}; + string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); MultiFluidBase const & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); @@ -1226,40 +1275,87 @@ CompositionalMultiphaseWell::calculateResidualNorm( real64 const & time_n, // step 1: compute the norm in the subRegion - ResidualNormKernelFactory:: - createAndLaunch< parallelDevicePolicy<> >( m_numComponents, - numDofPerWellElement(), - m_targetPhaseIndex, - rankOffset, - wellDofKey, - localRhs, - subRegion, - fluid, - wellControls, - time_n + dt, - dt, - m_nonlinearSolverParameters.m_minNormalizer, - subRegionResidualNorm ); - - // step 2: reduction across meshBodies/regions/subRegions - - if( subRegionResidualNorm[0] > localResidualNorm ) + if( isThermal() ) { - localResidualNorm = subRegionResidualNorm[0]; + real64 subRegionResidualNorm[2]{}; + + thermalCompositionalMultiphaseWellKernels::ResidualNormKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( m_numComponents, + m_targetPhaseIndex, + rankOffset, + wellDofKey, + localRhs, + subRegion, + fluid, + wellControls, + time_n + dt, + dt, + m_nonlinearSolverParameters.m_minNormalizer, + subRegionResidualNorm ); + // step 2: reduction across meshBodies/regions/subRegions + + for( integer i=0; i localResidualNorm[i] ) + { + localResidualNorm[i] = subRegionResidualNorm[i]; + } + } + } + else + { + real64 subRegionResidualNorm[1]{}; + ResidualNormKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( m_numComponents, + numDofPerWellElement(), + m_targetPhaseIndex, + rankOffset, + wellDofKey, + localRhs, + subRegion, + fluid, + wellControls, + time_n + dt, + dt, + m_nonlinearSolverParameters.m_minNormalizer, + subRegionResidualNorm ); + + + // step 2: reduction across meshBodies/regions/subRegions + + if( subRegionResidualNorm[0] > localResidualNorm[0] ) + { + localResidualNorm[0] = subRegionResidualNorm[0]; + } + } } ); } ); // step 3: second reduction across MPI ranks - - real64 const residualNorm = MpiWrapper::max( localResidualNorm ); - - if( getLogLevel() >= 1 && logger::internal::rank == 0 ) + real64 resNorm=localResidualNorm[0]; + if( isThermal() ) + { + real64 globalResidualNorm[2]{}; + globalResidualNorm[0] = MpiWrapper::max( localResidualNorm[0] ); + globalResidualNorm[1] = MpiWrapper::max( localResidualNorm[1] ); + resNorm=sqrt( globalResidualNorm[0] * globalResidualNorm[0] + globalResidualNorm[1] * globalResidualNorm[1] ); + if( getLogLevel() >= 1 && logger::internal::rank == 0 ) + { + std::cout << GEOS_FMT( " ( R{} ) = ( {:4.2e} ) ( Renergy ) = ( {:4.2e} )", + coupledSolverAttributePrefix(), globalResidualNorm[0], globalResidualNorm[1] ); + } + } + else { - std::cout << GEOS_FMT( " ( R{} ) = ( {:4.2e} )", coupledSolverAttributePrefix(), residualNorm ); + resNorm= MpiWrapper::max( resNorm ); + if( getLogLevel() >= 1 && logger::internal::rank == 0 ) + { + std::cout << GEOS_FMT( " ( R{} ) = ( {:4.2e} )", coupledSolverAttributePrefix(), resNorm ); + } } - return residualNorm; + return resNorm; } real64 @@ -1272,34 +1368,104 @@ CompositionalMultiphaseWell::scalingForSystemSolution( DomainPartition & domain, string const wellDofKey = dofManager.getKey( wellElementDofName() ); real64 scalingFactor = 1.0; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + real64 maxDeltaPres = 0.0, maxDeltaCompDens = 0.0, maxDeltaTemp = 0.0; + real64 minPresScalingFactor = 1.0, minCompDensScalingFactor = 1.0, minTempScalingFactor = 1.0; + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { - mesh.getElemManager().forElementSubRegions< ElementSubRegionBase >( regionNames, - [&]( localIndex const, - ElementSubRegionBase & subRegion ) + mesh.getElemManager().forElementSubRegions( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) { - // check that pressure and component densities are non-negative + arrayView1d< real64 const > const pressure = subRegion.getField< fields::well::pressure >(); + arrayView1d< real64 const > const temperature = subRegion.getField< fields::well::temperature >(); + arrayView2d< real64 const, compflow::USD_COMP > const compDens = subRegion.getField< fields::well::globalCompDensity >(); + arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::well::pressureScalingFactor >(); + arrayView1d< real64 > temperatureScalingFactor = subRegion.getField< fields::well::temperatureScalingFactor >(); + arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::well::globalCompDensityScalingFactor >(); + const integer temperatureOffset = m_numComponents+2; auto const subRegionData = - compositionalMultiphaseWellKernels:: + m_isThermal + ? thermalCompositionalMultiphaseBaseKernels:: ScalingForSystemSolutionKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, + m_maxRelativeTempChange, m_maxCompFracChange, m_maxRelativeCompDensChange, + pressure, + temperature, + compDens, + pressureScalingFactor, + compDensScalingFactor, + temperatureScalingFactor, + dofManager.rankOffset(), + m_numComponents, + wellDofKey, + subRegion, + localSolution, + temperatureOffset ) + : isothermalCompositionalMultiphaseBaseKernels:: + ScalingForSystemSolutionKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, + m_maxAbsolutePresChange, + m_maxCompFracChange, + m_maxRelativeCompDensChange, + pressure, + compDens, + pressureScalingFactor, + compDensScalingFactor, dofManager.rankOffset(), m_numComponents, wellDofKey, subRegion, localSolution ); + scalingFactor = std::min( subRegionData.localMinVal, scalingFactor ); - } ); + maxDeltaPres = std::max( maxDeltaPres, subRegionData.localMaxDeltaPres ); + maxDeltaCompDens = std::max( maxDeltaCompDens, subRegionData.localMaxDeltaCompDens ); + maxDeltaTemp = std::max( maxDeltaTemp, subRegionData.localMaxDeltaTemp ); + minPresScalingFactor = std::min( minPresScalingFactor, subRegionData.localMinPresScalingFactor ); + minCompDensScalingFactor = std::min( minCompDensScalingFactor, subRegionData.localMinCompDensScalingFactor ); + minTempScalingFactor = std::min( minTempScalingFactor, subRegionData.localMinTempScalingFactor ); + } ); } ); - return LvArray::math::max( MpiWrapper::min( scalingFactor ), m_minScalingFactor ); + scalingFactor = MpiWrapper::min( scalingFactor ); + maxDeltaPres = MpiWrapper::max( maxDeltaPres ); + maxDeltaCompDens = MpiWrapper::max( maxDeltaCompDens ); + minPresScalingFactor = MpiWrapper::min( minPresScalingFactor ); + minCompDensScalingFactor = MpiWrapper::min( minCompDensScalingFactor ); + + string const massUnit = m_useMass ? "kg/m3" : "mol/m3"; + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max well pressure change: {} Pa (before scaling)", + getName(), GEOS_FMT( "{:.{}f}", maxDeltaPres, 3 ) ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max well component density change: {} {} (before scaling)", + getName(), GEOS_FMT( "{:.{}f}", maxDeltaCompDens, 3 ), massUnit ) ); + + if( m_isThermal ) + { + maxDeltaTemp = MpiWrapper::max( maxDeltaTemp ); + minTempScalingFactor = MpiWrapper::min( minTempScalingFactor ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Max well temperature change: {} K (before scaling)", + getName(), GEOS_FMT( "{:.{}f}", maxDeltaTemp, 3 ) ) ); + } + + + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min well pressure scaling factor: {}", getName(), minPresScalingFactor ) ); + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min well component density scaling factor: {}", getName(), minCompDensScalingFactor ) ); + if( m_isThermal ) + { + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Min well temperature scaling factor: {}", getName(), minTempScalingFactor ) ); + } + + + return LvArray::math::max( scalingFactor, m_minScalingFactor ); + } bool @@ -1312,143 +1478,217 @@ CompositionalMultiphaseWell::checkSystemSolution( DomainPartition & domain, string const wellDofKey = dofManager.getKey( wellElementDofName() ); integer localCheck = 1; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + if( 0 ) { - mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, - [&]( localIndex const, - WellElementSubRegion & subRegion ) - { - auto const subRegionData = - compositionalMultiphaseWellKernels:: - SolutionCheckKernelFactory:: - createAndLaunch< parallelDevicePolicy<> >( m_allowCompDensChopping, - CompositionalMultiphaseFVM::ScalingType::Global, - scalingFactor, - dofManager.rankOffset(), - m_numComponents, - wellDofKey, - subRegion, - localSolution ); - if( !subRegionData.localMinVal ) + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, + [&]( localIndex const, + WellElementSubRegion & subRegion ) { - GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, - GEOS_FMT( "Solution is invalid in well {} (either a negative pressure or a negative component density was found)", subRegion.getName()) ); - } + arrayView1d< real64 const > const pressure = + subRegion.getField< fields::well::pressure >(); + arrayView2d< real64 const, compflow::USD_COMP > const compDens = + subRegion.getField< fields::well::globalCompDensity >(); + arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::well::pressureScalingFactor >(); + arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::well::globalCompDensityScalingFactor >(); + + auto const subRegionData = + compositionalMultiphaseWellKernels:: + SolutionCheckKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( m_allowCompDensChopping, + CompositionalMultiphaseFVM::ScalingType::Global, + scalingFactor, + pressure, + compDens, + pressureScalingFactor, + compDensScalingFactor, + dofManager.rankOffset(), + m_numComponents, + wellDofKey, + subRegion, + localSolution ); + + if( !subRegionData.localMinVal ) + { + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, + GEOS_FMT( "Solution is invalid in well {} (either a negative pressure or a negative component density was found)", subRegion.getName()) ); + } - localCheck = std::min( localCheck, subRegionData.localMinVal ); + localCheck = std::min( localCheck, subRegionData.localMinVal ); + } ); } ); - } ); + } + else + { + + real64 minPres = 0.0, minDens = 0.0, minTotalDens = 0.0; + integer numNegPres = 0, numNegDens = 0, numNegTotalDens = 0; + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions( regionNames, + [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + //integer const m_allowCompDensChopping(true); + integer const m_allowNegativePressure( false ); + CompositionalMultiphaseFVM::ScalingType const m_scalingType( CompositionalMultiphaseFVM::ScalingType::Global ); + arrayView1d< real64 const > const pressure = + subRegion.getField< fields::well::pressure >(); + arrayView1d< real64 const > const temperature = + subRegion.getField< fields::well::temperature >(); + arrayView2d< real64 const, compflow::USD_COMP > const compDens = + subRegion.getField< fields::well::globalCompDensity >(); + arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::well::pressureScalingFactor >(); + arrayView1d< real64 > temperatureScalingFactor = subRegion.getField< fields::well::temperatureScalingFactor >(); + arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::well::globalCompDensityScalingFactor >(); + + // check that pressure and component densities are non-negative + // for thermal, check that temperature is above 273.15 K + const integer temperatureOffset = m_numComponents+2; + auto const subRegionData = + m_isThermal + ? thermalCompositionalMultiphaseBaseKernels:: + SolutionCheckKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( m_allowCompDensChopping, + m_allowNegativePressure, + m_scalingType, + scalingFactor, + pressure, + temperature, + compDens, + pressureScalingFactor, + temperatureScalingFactor, + compDensScalingFactor, + dofManager.rankOffset(), + m_numComponents, + wellDofKey, + subRegion, + localSolution, + temperatureOffset ) + : isothermalCompositionalMultiphaseBaseKernels:: + SolutionCheckKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( m_allowCompDensChopping, + m_allowNegativePressure, + m_scalingType, + scalingFactor, + pressure, + compDens, + pressureScalingFactor, + compDensScalingFactor, + dofManager.rankOffset(), + m_numComponents, + wellDofKey, + subRegion, + localSolution ); + + localCheck = std::min( localCheck, subRegionData.localMinVal ); + + minPres = std::min( minPres, subRegionData.localMinPres ); + minDens = std::min( minDens, subRegionData.localMinDens ); + minTotalDens = std::min( minTotalDens, subRegionData.localMinTotalDens ); + numNegPres += subRegionData.localNumNegPressures; + numNegDens += subRegionData.localNumNegDens; + numNegTotalDens += subRegionData.localNumNegTotalDens; + } ); + } ); + + minPres = MpiWrapper::min( minPres ); + minDens = MpiWrapper::min( minDens ); + minTotalDens = MpiWrapper::min( minTotalDens ); + numNegPres = MpiWrapper::sum( numNegPres ); + numNegDens = MpiWrapper::sum( numNegDens ); + numNegTotalDens = MpiWrapper::sum( numNegTotalDens ); + + if( numNegPres > 0 ) + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Number of negative well pressure values: {}, minimum value: {} Pa", + getName(), numNegPres, fmt::format( "{:.{}f}", minPres, 3 ) ) ); + string const massUnit = m_useMass ? "kg/m3" : "mol/m3"; + if( numNegDens > 0 ) + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Number of negative well component density values: {}, minimum value: {} {} ", + getName(), numNegDens, fmt::format( "{:.{}f}", minDens, 3 ), massUnit ) ); + if( minTotalDens > 0 ) + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( " {}: Number of negative total well density values: {}, minimum value: {} {} ", + getName(), minTotalDens, fmt::format( "{:.{}f}", minDens, 3 ), massUnit ) ); + + } return MpiWrapper::min( localCheck ); } -void CompositionalMultiphaseWell::computePerforationRates( DomainPartition & domain ) +void CompositionalMultiphaseWell::computePerforationRates( real64 const & time_n, real64 const & dt, DomainPartition & domain ) { GEOS_MARK_FUNCTION; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + forDiscretizationOnMeshTargets ( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { // TODO: change the way we access the flowSolver here CompositionalMultiphaseBase const & flowSolver = getParent().getGroup< CompositionalMultiphaseBase >( getFlowSolverName() ); - PerforationKernel::CompFlowAccessors resCompFlowAccessors( mesh.getElemManager(), flowSolver.getName() ); - PerforationKernel::MultiFluidAccessors resMultiFluidAccessors( mesh.getElemManager(), flowSolver.getName() ); - PerforationKernel::RelPermAccessors resRelPermAccessors( mesh.getElemManager(), flowSolver.getName() ); + ElementRegionManager & elemManager = mesh.getElemManager(); - mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, - WellElementSubRegion & subRegion ) + elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, + WellElementSubRegion & subRegion ) { - - WellControls const & wellControls = getWellControls( subRegion ); - bool const disableReservoirToWellFlow = wellControls.isInjector() and !wellControls.isCrossflowEnabled(); - PerforationData * const perforationData = subRegion.getPerforationData(); + WellControls const & wellControls = getWellControls( subRegion ); + if( wellControls.isWellOpen( time_n+ dt ) ) + { - // get depth - arrayView1d< real64 const > const & wellElemGravCoef = subRegion.getField< fields::well::gravityCoefficient >(); + bool const disableReservoirToWellFlow = wellControls.isInjector() and !wellControls.isCrossflowEnabled(); - // get well primary variables on well elements - arrayView1d< real64 const > const & wellElemPres = - subRegion.getField< fields::well::pressure >(); - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompDens = - subRegion.getField< fields::well::globalCompDensity >(); - - arrayView1d< real64 const > const & wellElemTotalMassDens = - subRegion.getField< fields::well::totalMassDensity >(); - arrayView1d< real64 const > const & dWellElemTotalMassDens_dPres = - subRegion.getField< fields::well::dTotalMassDensity_dPressure >(); - arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens_dCompDens = - subRegion.getField< fields::well::dTotalMassDensity_dGlobalCompDensity >(); - - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompFrac = - subRegion.getField< fields::well::globalCompFraction >(); - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens = - subRegion.getField< fields::well::dGlobalCompFraction_dGlobalCompDensity >(); - - // get well variables on perforations - arrayView1d< real64 const > const & perfGravCoef = - perforationData->getField< fields::well::gravityCoefficient >(); - arrayView1d< localIndex const > const perfWellElemIndex = - perforationData->getField< fields::perforation::wellElementIndex >(); - arrayView1d< real64 const > const perfTrans = - perforationData->getField< fields::perforation::wellTransmissibility >(); - - arrayView2d< real64 > const & compPerfRate = - perforationData->getField< fields::well::compPerforationRate >(); - arrayView3d< real64 > const & dCompPerfRate_dPres = - perforationData->getField< fields::well::dCompPerforationRate_dPres >(); - arrayView4d< real64 > const & dCompPerfRate_dComp = - perforationData->getField< fields::well::dCompPerforationRate_dComp >(); - - // get the element region, subregion, index - arrayView1d< localIndex const > const resElementRegion = - perforationData->getField< fields::perforation::reservoirElementRegion >(); - arrayView1d< localIndex const > const resElementSubRegion = - perforationData->getField< fields::perforation::reservoirElementSubRegion >(); - arrayView1d< localIndex const > const resElementIndex = - perforationData->getField< fields::perforation::reservoirElementIndex >(); - - isothermalCompositionalMultiphaseBaseKernels:: - KernelLaunchSelector2< PerforationKernel >( numFluidComponents(), - numFluidPhases(), - perforationData->size(), - disableReservoirToWellFlow, - resCompFlowAccessors.get( fields::flow::pressure{} ), - resCompFlowAccessors.get( fields::flow::phaseVolumeFraction{} ), - resCompFlowAccessors.get( fields::flow::dPhaseVolumeFraction{} ), - resCompFlowAccessors.get( fields::flow::dGlobalCompFraction_dGlobalCompDensity{} ), - resMultiFluidAccessors.get( fields::multifluid::phaseDensity{} ), - resMultiFluidAccessors.get( fields::multifluid::dPhaseDensity{} ), - resMultiFluidAccessors.get( fields::multifluid::phaseViscosity{} ), - resMultiFluidAccessors.get( fields::multifluid::dPhaseViscosity{} ), - resMultiFluidAccessors.get( fields::multifluid::phaseCompFraction{} ), - resMultiFluidAccessors.get( fields::multifluid::dPhaseCompFraction{} ), - resRelPermAccessors.get( fields::relperm::phaseRelPerm{} ), - resRelPermAccessors.get( fields::relperm::dPhaseRelPerm_dPhaseVolFraction{} ), - wellElemGravCoef, - wellElemPres, - wellElemCompDens, - wellElemTotalMassDens, - dWellElemTotalMassDens_dPres, - dWellElemTotalMassDens_dCompDens, - wellElemCompFrac, - dWellElemCompFrac_dCompDens, - perfGravCoef, - perfWellElemIndex, - perfTrans, - resElementRegion, - resElementSubRegion, - resElementIndex, - compPerfRate, - dCompPerfRate_dPres, - dCompPerfRate_dComp ); + string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); + MultiFluidBase const & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); + bool isThermal = fluid.isThermal(); + if( isThermal ) + { + thermalPerforationFluxKernels:: + PerforationFluxKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( m_numComponents, + m_numPhases, + flowSolver.getName(), + perforationData, + subRegion, + fluid, + elemManager, + disableReservoirToWellFlow ); + } + else + { + isothermalPerforationFluxKernels:: + PerforationFluxKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( m_numComponents, + m_numPhases, + flowSolver.getName(), + perforationData, + subRegion, + elemManager, + disableReservoirToWellFlow ); + } + } + else + { + // Zero completion flow rate + arrayView2d< real64 > const compPerfRate = perforationData->getField< fields::well::compPerforationRate >(); + for( integer iperf=0; iperfsize(); iperf++ ) + { + for( integer ic = 0; ic < m_numComponents; ++ic ) + { + compPerfRate[iperf][ic] = 0.0; + } + } + } } ); + } ); } @@ -1461,26 +1701,42 @@ CompositionalMultiphaseWell::applySystemSolution( DofManager const & dofManager, real64 const dt, DomainPartition & domain ) { + + + DofManager::CompMask pressureMask( m_numDofPerWellElement, 0, 1 ); + DofManager::CompMask componentMask( m_numDofPerWellElement, 1, numFluidComponents()+1 ); + DofManager::CompMask connRateMask( m_numDofPerWellElement, numFluidComponents()+1, numFluidComponents()+2 ); GEOS_UNUSED_VAR( dt ); // update all the fields using the global damping coefficients dofManager.addVectorToField( localSolution, wellElementDofName(), fields::well::pressure::key(), scalingFactor, - { m_numDofPerWellElement, 0, 1 } ); + pressureMask ); dofManager.addVectorToField( localSolution, wellElementDofName(), fields::well::globalCompDensity::key(), scalingFactor, - { m_numDofPerWellElement, 1, m_numDofPerWellElement - 1 } ); + componentMask ); dofManager.addVectorToField( localSolution, wellElementDofName(), fields::well::mixtureConnectionRate::key(), scalingFactor, - { m_numDofPerWellElement, m_numDofPerWellElement - 1, m_numDofPerWellElement } ); + connRateMask ); + + if( isThermal() ) + { + DofManager::CompMask temperatureMask( m_numDofPerWellElement, numFluidComponents()+2, numFluidComponents()+3 ); + dofManager.addVectorToField( localSolution, + wellElementDofName(), + fields::well::temperature::key(), + scalingFactor, + temperatureMask ); + + } // if component density chopping is allowed, some component densities may be negative after the update // these negative component densities are set to zero in this function if( m_allowCompDensChopping ) @@ -1494,17 +1750,28 @@ CompositionalMultiphaseWell::applySystemSolution( DofManager const & dofManager, { // synchronize FieldIdentifiers fieldsToBeSync; - - fieldsToBeSync.addElementFields( { fields::well::pressure::key(), - fields::well::globalCompDensity::key(), - fields::well::mixtureConnectionRate::key() }, - regionNames ); - + if( isThermal() ) + { + fieldsToBeSync.addElementFields( { fields::well::pressure::key(), + fields::well::globalCompDensity::key(), + fields::well::mixtureConnectionRate::key(), + fields::well::temperature::key() }, + regionNames ); + } + else + { + fieldsToBeSync.addElementFields( { fields::well::pressure::key(), + fields::well::globalCompDensity::key(), + fields::well::mixtureConnectionRate::key() }, + regionNames ); + } CommunicationTools::getInstance().synchronizeFields( fieldsToBeSync, mesh, domain.getNeighbors(), true ); } ); + + } void CompositionalMultiphaseWell::chopNegativeDensities( DomainPartition & domain ) @@ -1568,6 +1835,15 @@ void CompositionalMultiphaseWell::resetStateToBeginningOfStep( DomainPartition & subRegion.getField< fields::well::pressure_n >(); wellElemPressure.setValues< parallelDevicePolicy<> >( wellElemPressure_n ); + if( isThermal() ) + { + // get a reference to the primary variables on well elements + arrayView1d< real64 > const & wellElemTemperature = + subRegion.getField< fields::well::temperature >(); + arrayView1d< real64 const > const & wellElemTemperature_n = + subRegion.getField< fields::well::temperature_n >(); + wellElemTemperature.setValues< parallelDevicePolicy<> >( wellElemTemperature_n ); + } arrayView2d< real64, compflow::USD_COMP > const & wellElemGlobalCompDensity = subRegion.getField< fields::well::globalCompDensity >(); arrayView2d< real64 const, compflow::USD_COMP > const & wellElemGlobalCompDensity_n = @@ -1608,81 +1884,84 @@ void CompositionalMultiphaseWell::assemblePressureRelations( real64 const & time WellControls & wellControls = getWellControls( subRegion ); - // get the degrees of freedom, depth info, next welem index - string const wellDofKey = dofManager.getKey( wellElementDofName() ); - arrayView1d< globalIndex const > const & wellElemDofNumber = - subRegion.getReference< array1d< globalIndex > >( wellDofKey ); - arrayView1d< real64 const > const & wellElemGravCoef = - subRegion.getField< fields::well::gravityCoefficient >(); - arrayView1d< localIndex const > const & nextWellElemIndex = - subRegion.getReference< array1d< localIndex > >( WellElementSubRegion::viewKeyStruct::nextWellElementIndexString() ); - - // get primary variables on well elements - arrayView1d< real64 const > const & wellElemPres = - subRegion.getField< fields::well::pressure >(); - - // get total mass density on well elements (for potential calculations) - arrayView1d< real64 const > const & wellElemTotalMassDens = - subRegion.getField< fields::well::totalMassDensity >(); - arrayView1d< real64 const > const & dWellElemTotalMassDens_dPres = - subRegion.getField< fields::well::dTotalMassDensity_dPressure >(); - arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens_dCompDens = - subRegion.getField< fields::well::dTotalMassDensity_dGlobalCompDensity >(); - - - bool controlHasSwitched = false; - isothermalCompositionalMultiphaseBaseKernels:: - KernelLaunchSelector1< PressureRelationKernel >( numFluidComponents(), - subRegion.size(), - dofManager.rankOffset(), - subRegion.isLocallyOwned(), - subRegion.getTopWellElementIndex(), - m_targetPhaseIndex, - wellControls, - time_n + dt, // controls evaluated with BHP/rate of the end of step - wellElemDofNumber, - wellElemGravCoef, - nextWellElemIndex, - wellElemPres, - wellElemTotalMassDens, - dWellElemTotalMassDens_dPres, - dWellElemTotalMassDens_dCompDens, - controlHasSwitched, - localMatrix, - localRhs ); - - if( controlHasSwitched ) + if( wellControls.isWellOpen( time_n+ dt ) ) { - // TODO: move the switch logic into wellControls - // TODO: implement a more general switch when more then two constraints per well type are allowed + string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); + MultiFluidBase const & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); + bool isThermal = fluid.isThermal(); + // get the degrees of freedom, depth info, next welem index + string const wellDofKey = dofManager.getKey( wellElementDofName() ); + arrayView1d< globalIndex const > const & wellElemDofNumber = + subRegion.getReference< array1d< globalIndex > >( wellDofKey ); + arrayView1d< real64 const > const & wellElemGravCoef = + subRegion.getField< fields::well::gravityCoefficient >(); + arrayView1d< localIndex const > const & nextWellElemIndex = + subRegion.getReference< array1d< localIndex > >( WellElementSubRegion::viewKeyStruct::nextWellElementIndexString() ); + + // get primary variables on well elements + arrayView1d< real64 const > const & wellElemPres = + subRegion.getField< fields::well::pressure >(); + + // get total mass density on well elements (for potential calculations) + arrayView1d< real64 const > const & wellElemTotalMassDens = + subRegion.getField< fields::well::totalMassDensity >(); + arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens = + subRegion.getField< fields::well::dTotalMassDensity >(); + + bool controlHasSwitched = false; + isothermalCompositionalMultiphaseBaseKernels:: + KernelLaunchSelectorCompTherm< PressureRelationKernel >( numFluidComponents(), + isThermal, + subRegion.size(), + dofManager.rankOffset(), + subRegion.isLocallyOwned(), + subRegion.getTopWellElementIndex(), + m_targetPhaseIndex, + wellControls, + time_n + dt, // controls evaluated with BHP/rate of the end of step + wellElemDofNumber, + wellElemGravCoef, + nextWellElemIndex, + wellElemPres, + wellElemTotalMassDens, + dWellElemTotalMassDens, + controlHasSwitched, + localMatrix, + localRhs ); + + if( controlHasSwitched ) + { + // TODO: move the switch logic into wellControls + // TODO: implement a more general switch when more then two constraints per well type are allowed - real64 const timeAtEndOfStep = time_n + dt; + real64 const timeAtEndOfStep = time_n + dt; - if( wellControls.getControl() == WellControls::Control::BHP ) - { - if( wellControls.isProducer() ) + if( wellControls.getControl() == WellControls::Control::BHP ) { - wellControls.switchToPhaseRateControl( wellControls.getTargetPhaseRate( timeAtEndOfStep ) ); - GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::WellControl, - GEOS_FMT( "Control switch for well {} from BHP constraint to phase volumetric rate constraint", subRegion.getName() ) ); + if( wellControls.isProducer() ) + { + wellControls.switchToPhaseRateControl( wellControls.getTargetPhaseRate( timeAtEndOfStep ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::WellControl, + GEOS_FMT( "Control switch for well {} from BHP constraint to phase volumetric rate constraint", subRegion.getName() ) ); + } + else + { + wellControls.switchToTotalRateControl( wellControls.getTargetTotalRate( timeAtEndOfStep ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::WellControl, + GEOS_FMT( "Control switch for well {} from BHP constraint to total volumetric rate constraint", subRegion.getName()) ); + } } else { - wellControls.switchToTotalRateControl( wellControls.getTargetTotalRate( timeAtEndOfStep ) ); + wellControls.switchToBHPControl( wellControls.getTargetBHP( timeAtEndOfStep ) ); GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::WellControl, - GEOS_FMT( "Control switch for well {} from BHP constraint to total volumetric rate constraint", subRegion.getName()) ); + GEOS_FMT( "Control switch for well {} from rate constraint to BHP constraint", subRegion.getName() ) ); } } - else - { - wellControls.switchToBHPControl( wellControls.getTargetBHP( timeAtEndOfStep ) ); - GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::WellControl, - GEOS_FMT( "Control switch for well {} from rate constraint to BHP constraint", subRegion.getName() ) ); - } } + } ); - } - ); + } ); } void CompositionalMultiphaseWell::shutDownWell( real64 const time_n, @@ -1747,7 +2026,7 @@ void CompositionalMultiphaseWell::shutDownWell( real64 const time_n, rankOffset, localMatrix, rhsValue, - pres[ei], // freeze the current pressure value + pres[ei], // freeze the current pressure value pres[ei] ); localRhs[localRow] = rhsValue; @@ -1758,7 +2037,7 @@ void CompositionalMultiphaseWell::shutDownWell( real64 const time_n, rankOffset, localMatrix, rhsValue, - compDens[ei][ic], // freeze the current component density values + compDens[ei][ic], // freeze the current component density values compDens[ei][ic] ); localRhs[localRow + ic + 1] = rhsValue; } @@ -1768,7 +2047,7 @@ void CompositionalMultiphaseWell::shutDownWell( real64 const time_n, rankOffset, localMatrix, rhsValue, - connRate[ei], // freeze the current pressure value + connRate[ei], // freeze the current pressure value connRate[ei] ); localRhs[localRow + numComp + 1] = rhsValue; @@ -1794,15 +2073,27 @@ void CompositionalMultiphaseWell::implicitStepSetup( real64 const & time_n, [&]( localIndex const, WellElementSubRegion & subRegion ) { + // get a reference to the primary variables on well elements arrayView1d< real64 const > const & wellElemPressure = subRegion.getField< fields::well::pressure >(); + arrayView2d< real64 const, compflow::USD_COMP > const & wellElemGlobalCompDensity = + subRegion.getField< fields::well::globalCompDensity >(); + arrayView1d< real64 const > const & wellElemTemperature = + subRegion.getField< fields::well::temperature >(); + arrayView1d< real64 > const & wellElemPressure_n = subRegion.getField< fields::well::pressure_n >(); wellElemPressure_n.setValues< parallelDevicePolicy<> >( wellElemPressure ); - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemGlobalCompDensity = - subRegion.getField< fields::well::globalCompDensity >(); + if( isThermal() ) + { + + arrayView1d< real64 > const & wellElemTemperature_n = + subRegion.getField< fields::well::temperature_n >(); + wellElemTemperature_n.setValues< parallelDevicePolicy<> >( wellElemTemperature ); + } + arrayView2d< real64, compflow::USD_COMP > const & wellElemGlobalCompDensity_n = subRegion.getField< fields::well::globalCompDensity_n >(); wellElemGlobalCompDensity_n.setValues< parallelDevicePolicy<> >( wellElemGlobalCompDensity ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp index c524575b860..c996896734c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -162,7 +162,7 @@ class CompositionalMultiphaseWell : public WellSolverBase * @param subRegion the well subregion containing all the primary and dependent fields * @param targetIndex the targetIndex of the subRegion */ - void updatePhaseVolumeFraction( WellElementSubRegion & subRegion ) const; + real64 updatePhaseVolumeFraction( WellElementSubRegion & subRegion ) const; /** * @brief Recompute total mass densities from mass density and phase volume fractions @@ -174,13 +174,16 @@ class CompositionalMultiphaseWell : public WellSolverBase * @brief Recompute the perforation rates for all the wells * @param domain the domain containing the mesh and fields */ - virtual void computePerforationRates( DomainPartition & domain ) override; + virtual void computePerforationRates( real64 const & time_n, + real64 const & dt, DomainPartition & domain ) override; /** * @brief Recompute all dependent quantities from primary variables (including constitutive models) * @param subRegion the well subregion containing all the primary and dependent fields */ - virtual void updateSubRegionState( WellElementSubRegion & subRegion ) override; + virtual void updateState( DomainPartition & domain ) override; + + virtual real64 updateSubRegionState( WellElementSubRegion & subRegion ) override; virtual string wellElementDofName() const override { return viewKeyStruct::dofFieldString(); } @@ -190,6 +193,8 @@ class CompositionalMultiphaseWell : public WellSolverBase virtual localIndex numFluidPhases() const override { return m_numPhases; } + integer useTotalMassEquation() const { return m_useTotalMassEquation; } + /** * @brief assembles the flux terms for all connections between well elements * @param time_n previous time value @@ -199,12 +204,13 @@ class CompositionalMultiphaseWell : public WellSolverBase * @param matrix the system matrix * @param rhs the system right-hand side vector */ - virtual void assembleFluxTerms( real64 const dt, - DomainPartition const & domain, + + virtual void assembleFluxTerms( real64 const & time_n, + real64 const & dt, + DomainPartition & domain, DofManager const & dofManager, CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) override; - + arrayView1d< real64 > const & localRhs )override; /** * @brief assembles the accumulation term for all the well elements * @param domain the physical domain object @@ -212,23 +218,13 @@ class CompositionalMultiphaseWell : public WellSolverBase * @param matrix the system matrix * @param rhs the system right-hand side vector */ - virtual void assembleAccumulationTerms( DomainPartition const & domain, + virtual void assembleAccumulationTerms( real64 const & time_n, + real64 const & dt, + DomainPartition & domain, DofManager const & dofManager, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) override; - /** - * @brief assembles the volume balance terms for all well elements - * @param domain the physical domain object - * @param dofManager degree-of-freedom manager associated with the linear system - * @param matrix the system matrix - * @param rhs the system right-hand side vector - */ - virtual void assembleVolumeBalanceTerms( DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) override; - /** * @brief assembles the pressure relations at all connections between well elements except at the well head * @param time_n time at the beginning of the time step @@ -289,18 +285,23 @@ class CompositionalMultiphaseWell : public WellSolverBase static constexpr char const * maxRelativeCompDensChangeString() { return "maxRelativeCompDensChange"; } + static constexpr char const * maxRelativeTempChangeString() { return "maxRelativeTemperatureChange"; } + static constexpr char const * allowLocalCompDensChoppingString() { return CompositionalMultiphaseBase::viewKeyStruct::allowLocalCompDensChoppingString(); } // control data (not registered on the mesh) static constexpr char const * massDensityString() { return "massDensity";} + static constexpr char const * currentBHPString() { return "currentBHP"; } + static constexpr char const * dCurrentBHPString() { return "dCurrentBHP"; } static constexpr char const * dCurrentBHP_dPresString() { return "dCurrentBHP_dPres"; } - static constexpr char const * dCurrentBHP_dCompDensString() { return "dCurrentBHP_dCompDens"; } static constexpr char const * currentPhaseVolRateString() { return "currentPhaseVolumetricRate"; } + static constexpr char const * dCurrentPhaseVolRateString() { return "dCurrentPhaseVolumetricRate"; } + static constexpr char const * dCurrentPhaseVolRate_dPresString() { return "dCurrentPhaseVolumetricRate_dPres"; } @@ -309,6 +310,7 @@ class CompositionalMultiphaseWell : public WellSolverBase static constexpr char const * dCurrentPhaseVolRate_dRateString() { return "dCurrentPhaseVolumetricRate_dRate"; } static constexpr char const * currentTotalVolRateString() { return "currentTotalVolumetricRate"; } + static constexpr char const * dCurrentTotalVolRateString() { return "dCurrentTotalVolumetricRate"; } static constexpr char const * dCurrentTotalVolRate_dPresString() { return "dCurrentTotalVolumetricRate_dPres"; } @@ -369,15 +371,11 @@ class CompositionalMultiphaseWell : public WellSolverBase * @brief Initialize all the primary and secondary variables in all the wells * @param domain the domain containing the well manager to access individual wells */ - void initializeWells( DomainPartition & domain ) override; + void initializeWells( DomainPartition & domain, real64 const & time_n, real64 const & dt ) override; virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const override; - /// the max number of fluid phases - integer m_numPhases; - /// the number of fluid components - integer m_numComponents; /// flag indicating whether mass or molar formulation should be used integer m_useMass; @@ -400,6 +398,9 @@ class CompositionalMultiphaseWell : public WellSolverBase /// maximum (relative) change in component density between two Newton iterations real64 m_maxRelativeCompDensChange; + /// maximum (relative) change in temperature in a Newton iteration + real64 m_maxRelativeTempChange; + /// minimum value of the scaling factor obtained by enforcing maxCompFracChange real64 m_minScalingFactor; @@ -409,8 +410,7 @@ class CompositionalMultiphaseWell : public WellSolverBase /// index of the target phase, used to impose the phase rate constraint localIndex m_targetPhaseIndex; - /// name of the fluid constitutive model used as a reference for component/phase description - string m_referenceFluidModelName; + }; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp index 88d502f7941..be0aa3e48ae 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp @@ -122,21 +122,14 @@ DECLARE_FIELD( totalMassDensity, WRITE_AND_READ, "Total mass density" ); -DECLARE_FIELD( dTotalMassDensity_dPressure, - "dTotalMassDensity_dPressure", - array1d< real64 >, - 0, - NOPLOT, - NO_WRITE, - "Derivative of total mass density with respect to pressure" ); - -DECLARE_FIELD( dTotalMassDensity_dGlobalCompDensity, - "dTotalMassDensity_dComp", // to avoid a rebaseline +DECLARE_FIELD( dTotalMassDensity, + "dTotalMassDensity", array2dLayoutFluid_dC, 0, NOPLOT, NO_WRITE, - "Derivative of total mass density with respect to global component density" ); + "Derivative of total mass density with respect to pressure, temperature, and global component density" ); + DECLARE_FIELD( compPerforationRate, "compPerforationRate", @@ -146,21 +139,15 @@ DECLARE_FIELD( compPerforationRate, WRITE_AND_READ, "Component perforation rate" ); -DECLARE_FIELD( dCompPerforationRate_dPres, - "dCompPerforationRate_dPres", - array3d< real64 >, - 0, - NOPLOT, - NO_WRITE, - "Derivative of component perforation rate with respect to pressure" ); - -DECLARE_FIELD( dCompPerforationRate_dComp, - "dCompPerforationRate_dComp", +DECLARE_FIELD( dCompPerforationRate, + "dCompPerforationRate", array4d< real64 >, 0, NOPLOT, NO_WRITE, - "Derivative of component perforation rate with respect to global component density" ); + "Derivative of component perforation rate with respect to pressure temperature and global component density" ); + + DECLARE_FIELD( globalCompDensityScalingFactor, "globalCompDensityScalingFactor", @@ -170,6 +157,7 @@ DECLARE_FIELD( globalCompDensityScalingFactor, NO_WRITE, "Scaling factors for global component densities" ); + } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp index 4e0d72499a4..7b592d049d5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp @@ -121,7 +121,7 @@ ControlEquationHelper:: } } -template< integer NC > +template< integer NC, integer IS_THERMAL > GEOS_HOST_DEVICE inline void @@ -134,35 +134,30 @@ ControlEquationHelper:: real64 const & targetTotalRate, real64 const & targetMassRate, real64 const & currentBHP, - real64 const & dCurrentBHP_dPres, - arrayView1d< real64 const > const & dCurrentBHP_dCompDens, + arrayView1d< real64 const > const & dCurrentBHP, arrayView1d< real64 const > const & currentPhaseVolRate, - arrayView1d< real64 const > const & dCurrentPhaseVolRate_dPres, - arrayView2d< real64 const > const & dCurrentPhaseVolRate_dCompDens, - arrayView1d< real64 const > const & dCurrentPhaseVolRate_dRate, + arrayView2d< real64 const > const & dCurrentPhaseVolRate, + real64 const & currentTotalVolRate, - real64 const & dCurrentTotalVolRate_dPres, - arrayView1d< real64 const > const & dCurrentTotalVolRate_dCompDens, - real64 const & dCurrentTotalVolRate_dRate, + arrayView1d< real64 const > const & dCurrentTotalVolRate, real64 const & massDensity, globalIndex const dofNumber, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { - localIndex const eqnRowIndex = dofNumber + ROFFSET::CONTROL - rankOffset; - globalIndex const presDofColIndex = dofNumber + COFFSET::DPRES; - globalIndex const rateDofColIndex = dofNumber + COFFSET::DCOMP + NC; - globalIndex compDofColIndices[NC]{}; - for( integer ic = 0; ic < NC; ++ic ) + using COFFSET_WJ = compositionalMultiphaseWellKernels::ColOffset_WellJac< NC, IS_THERMAL >; + using Deriv = multifluid::DerivativeOffset; + + localIndex const eqnRowIndex = dofNumber + ROFFSET::CONTROL - rankOffset; + globalIndex dofColIndices[COFFSET_WJ::nDer]{}; + for( integer ic = 0; ic < COFFSET_WJ::nDer; ++ic ) { - compDofColIndices[ ic ] = presDofColIndex + ic + 1; + dofColIndices[ ic ] = dofNumber + ic; } real64 controlEqn = 0; - real64 dControlEqn_dPres = 0; - real64 dControlEqn_dRate = 0; - real64 dControlEqn_dComp[NC]{}; + real64 dControlEqn[NC+2+IS_THERMAL]{}; // Note: We assume in the computation of currentBHP that the reference elevation // is in the top well element. This is enforced by a check in the solver. @@ -175,392 +170,83 @@ ControlEquationHelper:: { // control equation is a difference between current BHP and target BHP controlEqn = currentBHP - targetBHP; - dControlEqn_dPres = dCurrentBHP_dPres; + dControlEqn[COFFSET_WJ::dP] = dCurrentBHP[Deriv::dP]; for( integer ic = 0; ic < NC; ++ic ) { - dControlEqn_dComp[ic] = dCurrentBHP_dCompDens[ic]; + dControlEqn[COFFSET_WJ::dC+ic] = dCurrentBHP[Deriv::dC+ic]; } + if constexpr ( IS_THERMAL ) + + dControlEqn[COFFSET_WJ::dT] = dCurrentBHP[Deriv::dT]; + } // Oil volumetric rate control else if( currentControl == WellControls::Control::PHASEVOLRATE ) { controlEqn = currentPhaseVolRate[targetPhaseIndex] - targetPhaseRate; - dControlEqn_dPres = dCurrentPhaseVolRate_dPres[targetPhaseIndex]; - dControlEqn_dRate = dCurrentPhaseVolRate_dRate[targetPhaseIndex]; + dControlEqn[COFFSET_WJ::dP] = dCurrentPhaseVolRate[targetPhaseIndex][COFFSET_WJ::dP]; + dControlEqn[COFFSET_WJ::dQ] = dCurrentPhaseVolRate[targetPhaseIndex][COFFSET_WJ::dQ]; for( integer ic = 0; ic < NC; ++ic ) { - dControlEqn_dComp[ic] = dCurrentPhaseVolRate_dCompDens[targetPhaseIndex][ic]; + dControlEqn[COFFSET_WJ::dC+ic] = dCurrentPhaseVolRate[targetPhaseIndex][COFFSET_WJ::dC+ic]; } + if constexpr ( IS_THERMAL ) + dControlEqn[COFFSET_WJ::dT] = dCurrentBHP[Deriv::dT]; } // Total volumetric rate control else if( currentControl == WellControls::Control::TOTALVOLRATE ) { controlEqn = currentTotalVolRate - targetTotalRate; - dControlEqn_dPres = dCurrentTotalVolRate_dPres; - dControlEqn_dRate = dCurrentTotalVolRate_dRate; + dControlEqn[COFFSET_WJ::dP] = dCurrentTotalVolRate[COFFSET_WJ::dP]; + dControlEqn[COFFSET_WJ::dQ] = dCurrentTotalVolRate[COFFSET_WJ::dQ]; for( integer ic = 0; ic < NC; ++ic ) { - dControlEqn_dComp[ic] = dCurrentTotalVolRate_dCompDens[ic]; + dControlEqn[COFFSET_WJ::dC+ic] = dCurrentTotalVolRate[COFFSET_WJ::dC+ic]; } + if constexpr ( IS_THERMAL ) + dControlEqn[COFFSET_WJ::dT] = dCurrentTotalVolRate[COFFSET_WJ::dT]; } // Total mass rate control else if( currentControl == WellControls::Control::MASSRATE ) { controlEqn = massDensity*currentTotalVolRate - targetMassRate; - dControlEqn_dPres = massDensity*dCurrentTotalVolRate_dPres; - dControlEqn_dRate = massDensity*dCurrentTotalVolRate_dRate; + dControlEqn[COFFSET_WJ::dP] = massDensity*dCurrentTotalVolRate[COFFSET_WJ::dP]; + dControlEqn[COFFSET_WJ::dQ] = massDensity*dCurrentTotalVolRate[COFFSET_WJ::dQ]; for( integer ic = 0; ic < NC; ++ic ) { - dControlEqn_dComp[ic] = massDensity*dCurrentTotalVolRate_dCompDens[ic]; + dControlEqn[COFFSET_WJ::dC+ic] = massDensity*dCurrentTotalVolRate[COFFSET_WJ::dC+ic]; } + if constexpr ( IS_THERMAL ) + dControlEqn[COFFSET_WJ::dT] = massDensity*dCurrentTotalVolRate[COFFSET_WJ::dT]; } - else - { - GEOS_ERROR( "This constraint is not supported in CompositionalMultiphaseWell" ); - } - localRhs[eqnRowIndex] += controlEqn; - localMatrix.addToRow< serialAtomic >( eqnRowIndex, - &presDofColIndex, - &dControlEqn_dPres, - 1 ); - localMatrix.addToRow< serialAtomic >( eqnRowIndex, - &rateDofColIndex, - &dControlEqn_dRate, - 1 ); - localMatrix.addToRowBinarySearchUnsorted< serialAtomic >( eqnRowIndex, - compDofColIndices, - dControlEqn_dComp, - NC ); -} - -/******************************** FluxKernel ********************************/ - -template< integer NC > -GEOS_HOST_DEVICE -void -FluxKernel:: - computeExit( real64 const & dt, - real64 const ( &compFlux )[NC], - real64 const ( &dCompFlux_dRate )[NC], - real64 const ( &dCompFlux_dPresUp )[NC], - real64 const ( &dCompFlux_dCompDensUp )[NC][NC], - real64 ( & oneSidedFlux )[NC], - real64 ( & oneSidedFluxJacobian_dRate )[NC][1], - real64 ( & oneSidedFluxJacobian_dPresCompUp )[NC][NC + 1] ) -{ - for( integer ic = 0; ic < NC; ++ic ) + // Total mass rate control + else if( currentControl == WellControls::Control::MASSRATE ) { - oneSidedFlux[ic] = -dt * compFlux[ic]; - - // derivative with respect to rate - oneSidedFluxJacobian_dRate[ic][0] = -dt * dCompFlux_dRate[ic]; - - // derivative with respect to upstream pressure - oneSidedFluxJacobian_dPresCompUp[ic][0] = -dt * dCompFlux_dPresUp[ic]; - - // derivatives with respect to upstream component densities - for( integer jdof = 0; jdof < NC; ++jdof ) + controlEqn = massDensity*currentTotalVolRate - targetMassRate; + dControlEqn[COFFSET_WJ::dP] = massDensity*dCurrentTotalVolRate[COFFSET_WJ::dP]; + dControlEqn[COFFSET_WJ::dQ] = massDensity*dCurrentTotalVolRate[COFFSET_WJ::dQ]; + for( integer ic = 0; ic < NC; ++ic ) { - oneSidedFluxJacobian_dPresCompUp[ic][jdof+1] = -dt * dCompFlux_dCompDensUp[ic][jdof]; + dControlEqn[COFFSET_WJ::dC+ic] = massDensity*dCurrentTotalVolRate[COFFSET_WJ::dC+ic]; } } -} - -template< integer NC > -GEOS_HOST_DEVICE -void -FluxKernel:: - compute( real64 const & dt, - real64 const ( &compFlux )[NC], - real64 const ( &dCompFlux_dRate )[NC], - real64 const ( &dCompFlux_dPresUp )[NC], - real64 const ( &dCompFlux_dCompDensUp )[NC][NC], - real64 ( & localFlux )[2*NC], - real64 ( & localFluxJacobian_dRate )[2*NC][1], - real64 ( & localFluxJacobian_dPresCompUp )[2*NC][NC + 1] ) -{ - // flux terms - for( integer ic = 0; ic < NC; ++ic ) + else { - localFlux[TAG::NEXT *NC+ic] = dt * compFlux[ic]; - localFlux[TAG::CURRENT *NC+ic] = -dt * compFlux[ic]; - - // derivative with respect to rate - localFluxJacobian_dRate[TAG::NEXT *NC+ic][0] = dt * dCompFlux_dRate[ic]; - localFluxJacobian_dRate[TAG::CURRENT *NC+ic][0] = -dt * dCompFlux_dRate[ic]; - - // derivative with respect to upstream pressure - localFluxJacobian_dPresCompUp[TAG::NEXT *NC+ic][0] = dt * dCompFlux_dPresUp[ic]; - localFluxJacobian_dPresCompUp[TAG::CURRENT *NC+ic][0] = -dt * dCompFlux_dPresUp[ic]; - - // derivatives with respect to upstream component densities - for( integer jdof = 0; jdof < NC; ++jdof ) - { - localFluxJacobian_dPresCompUp[TAG::NEXT *NC+ic][jdof+1] = dt * dCompFlux_dCompDensUp[ic][jdof]; - localFluxJacobian_dPresCompUp[TAG::CURRENT *NC+ic][jdof+1] = -dt * dCompFlux_dCompDensUp[ic][jdof]; - } + GEOS_ERROR( "This constraint is not supported in CompositionalMultiphaseWell" ); } -} - -template< integer NC > -void -FluxKernel:: - launch( localIndex const size, - globalIndex const rankOffset, - integer const useTotalMassEquation, - WellControls const & wellControls, - arrayView1d< globalIndex const > const & wellElemDofNumber, - arrayView1d< localIndex const > const & nextWellElemIndex, - arrayView1d< real64 const > const & connRate, - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompFrac, - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) -{ - using namespace compositionalMultiphaseUtilities; - - bool const isProducer = wellControls.isProducer(); - arrayView1d< real64 const > const & injection = wellControls.getInjectionStream(); - - // loop over the well elements to compute the fluxes between elements - forAll< parallelDevicePolicy<> >( size, [=] GEOS_HOST_DEVICE ( localIndex const iwelem ) - { - // create local work arrays - real64 compFracUp[NC]{}; - real64 dCompFrac_dCompDensUp[NC][NC]{}; - - real64 compFlux[NC]{}; - real64 dCompFlux_dRate[NC]{}; - real64 dCompFlux_dPresUp[NC]{}; - real64 dCompFlux_dCompDensUp[NC][NC]{}; - - // Step 1) decide the upwind well element - - /* currentConnRate < 0 flow from iwelem to iwelemNext - * currentConnRate > 0 flow from iwelemNext to iwelem - * With this convention, currentConnRate < 0 at the last connection for a producer - * currentConnRate > 0 at the last connection for a injector - */ - - localIndex const iwelemNext = nextWellElemIndex[iwelem]; - real64 const currentConnRate = connRate[iwelem]; - localIndex iwelemUp = -1; - - if( iwelemNext < 0 && !isProducer ) // exit connection, injector - { - // we still need to define iwelemUp for Jacobian assembly - iwelemUp = iwelem; - - // just copy the injection stream into compFrac - for( integer ic = 0; ic < NC; ++ic ) - { - compFracUp[ic] = injection[ic]; - for( integer jc = 0; jc < NC; ++jc ) - { - dCompFrac_dCompDensUp[ic][jc] = 0.0; - } - } - } - else - { - // first set iwelemUp to the upstream cell - if( ( iwelemNext < 0 && isProducer ) // exit connection, producer - || currentConnRate < 0 ) // not an exit connection, iwelem is upstream - { - iwelemUp = iwelem; - } - else // not an exit connection, iwelemNext is upstream - { - iwelemUp = iwelemNext; - } - - // copy the vars of iwelemUp into compFrac - for( integer ic = 0; ic < NC; ++ic ) - { - compFracUp[ic] = wellElemCompFrac[iwelemUp][ic]; - for( integer jc = 0; jc < NC; ++jc ) - { - dCompFrac_dCompDensUp[ic][jc] = dWellElemCompFrac_dCompDens[iwelemUp][ic][jc]; - } - } - } - - // Step 2) compute upstream transport coefficient - - for( integer ic = 0; ic < NC; ++ic ) - { - compFlux[ic] = compFracUp[ic] * currentConnRate; - dCompFlux_dRate[ic] = compFracUp[ic]; - dCompFlux_dPresUp[ic] = 0.0; // none of these quantities depend on pressure - for( integer jc = 0; jc < NC; ++jc ) - { - dCompFlux_dCompDensUp[ic][jc] = dCompFrac_dCompDensUp[ic][jc] * currentConnRate; - } - } - - globalIndex const offsetUp = wellElemDofNumber[iwelemUp]; - globalIndex const offsetCurrent = wellElemDofNumber[iwelem]; - - if( iwelemNext < 0 ) // exit connection - { - // for this case, we only need NC mass conservation equations - // so we do not use the arrays initialized before the loop - real64 oneSidedFlux[NC]{}; - real64 oneSidedFluxJacobian_dRate[NC][1]{}; - real64 oneSidedFluxJacobian_dPresCompUp[NC][NC+1]{}; - - computeExit< NC >( dt, - compFlux, - dCompFlux_dRate, - dCompFlux_dPresUp, - dCompFlux_dCompDensUp, - oneSidedFlux, - oneSidedFluxJacobian_dRate, - oneSidedFluxJacobian_dPresCompUp ); - - - globalIndex oneSidedEqnRowIndices[NC]{}; - globalIndex oneSidedDofColIndices_dPresCompUp[NC+1]{}; - globalIndex oneSidedDofColIndices_dRate = 0; - - // jacobian indices - for( integer ic = 0; ic < NC; ++ic ) - { - // mass balance equations for all components - oneSidedEqnRowIndices[ic] = offsetUp + ROFFSET::MASSBAL + ic - rankOffset; - } - - // in the dof ordering used in this class, there are 1 pressure dofs - // and NC compDens dofs before the rate dof in this block - localIndex const dRateColOffset = COFFSET::DCOMP + NC; - oneSidedDofColIndices_dRate = offsetCurrent + dRateColOffset; - - for( integer jdof = 0; jdof < NC+1; ++jdof ) - { - // dofs are the **upstream** pressure and component densities - oneSidedDofColIndices_dPresCompUp[jdof] = offsetUp + COFFSET::DPRES + jdof; - } - - if( useTotalMassEquation > 0 ) - { - // Apply equation/variable change transformation(s) - real64 work[NC + 1]{}; - shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( NC, 1, oneSidedFluxJacobian_dRate, work ); - shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( NC, NC + 1, oneSidedFluxJacobian_dPresCompUp, work ); - shiftElementsAheadByOneAndReplaceFirstElementWithSum( NC, oneSidedFlux ); - } - - for( integer i = 0; i < NC; ++i ) - { - if( oneSidedEqnRowIndices[i] >= 0 && oneSidedEqnRowIndices[i] < localMatrix.numRows() ) - { - localMatrix.addToRow< parallelDeviceAtomic >( oneSidedEqnRowIndices[i], - &oneSidedDofColIndices_dRate, - oneSidedFluxJacobian_dRate[i], - 1 ); - localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic >( oneSidedEqnRowIndices[i], - oneSidedDofColIndices_dPresCompUp, - oneSidedFluxJacobian_dPresCompUp[i], - NC+1 ); - RAJA::atomicAdd( parallelDeviceAtomic{}, &localRhs[oneSidedEqnRowIndices[i]], oneSidedFlux[i] ); - } - } - } - else // not an exit connection - { - real64 localFlux[2*NC]{}; - real64 localFluxJacobian_dRate[2*NC][1]{}; - real64 localFluxJacobian_dPresCompUp[2*NC][NC+1]{}; - - compute< NC >( dt, - compFlux, - dCompFlux_dRate, - dCompFlux_dPresUp, - dCompFlux_dCompDensUp, - localFlux, - localFluxJacobian_dRate, - localFluxJacobian_dPresCompUp ); - - - globalIndex eqnRowIndices[2*NC]{}; - globalIndex dofColIndices_dPresCompUp[NC+1]{}; - globalIndex dofColIndices_dRate = 0; - - globalIndex const offsetNext = wellElemDofNumber[iwelemNext]; - - // jacobian indices - for( integer ic = 0; ic < NC; ++ic ) - { - // mass balance equations for all components - eqnRowIndices[TAG::NEXT *NC+ic] = offsetNext + ROFFSET::MASSBAL + ic - rankOffset; - eqnRowIndices[TAG::CURRENT *NC+ic] = offsetCurrent + ROFFSET::MASSBAL + ic - rankOffset; - } - - // in the dof ordering used in this class, there are 1 pressure dofs - // and NC compDens dofs before the rate dof in this block - localIndex const dRateColOffset = COFFSET::DCOMP + NC; - dofColIndices_dRate = offsetCurrent + dRateColOffset; + localRhs[eqnRowIndex] += controlEqn; - for( integer jdof = 0; jdof < NC+1; ++jdof ) - { - // dofs are the **upstream** pressure and component densities - dofColIndices_dPresCompUp[jdof] = offsetUp + COFFSET::DPRES + jdof; - } + localMatrix.addToRowBinarySearchUnsorted< serialAtomic >( eqnRowIndex, + dofColIndices, + dControlEqn, + COFFSET_WJ::nDer ); - if( useTotalMassEquation > 0 ) - { - // Apply equation/variable change transformation(s) - real64 work[NC + 1]{}; - shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( NC, NC, 1, 2, localFluxJacobian_dRate, work ); - shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( NC, NC, NC + 1, 2, localFluxJacobian_dPresCompUp, work ); - shiftBlockElementsAheadByOneAndReplaceFirstElementWithSum( NC, NC, 2, localFlux ); - } - for( integer i = 0; i < 2*NC; ++i ) - { - if( eqnRowIndices[i] >= 0 && eqnRowIndices[i] < localMatrix.numRows() ) - { - localMatrix.addToRow< parallelDeviceAtomic >( eqnRowIndices[i], - &dofColIndices_dRate, - localFluxJacobian_dRate[i], - 1 ); - localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic >( eqnRowIndices[i], - dofColIndices_dPresCompUp, - localFluxJacobian_dPresCompUp[i], - NC+1 ); - RAJA::atomicAdd( parallelDeviceAtomic{}, &localRhs[eqnRowIndices[i]], localFlux[i] ); - } - } - } - } ); } -#define INST_FluxKernel( NC ) \ - template \ - void FluxKernel:: \ - launch< NC >( localIndex const size, \ - globalIndex const rankOffset, \ - integer const useTotalMassEquation, \ - WellControls const & wellControls, \ - arrayView1d< globalIndex const > const & wellElemDofNumber, \ - arrayView1d< localIndex const > const & nextWellElemIndex, \ - arrayView1d< real64 const > const & connRate, \ - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompFrac, \ - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens, \ - real64 const & dt, \ - CRSMatrixView< real64, globalIndex const > const & localMatrix, \ - arrayView1d< real64 > const & localRhs ) - -INST_FluxKernel( 1 ); -INST_FluxKernel( 2 ); -INST_FluxKernel( 3 ); -INST_FluxKernel( 4 ); -INST_FluxKernel( 5 ); - /******************************** PressureRelationKernel ********************************/ -template< integer NC > +template< integer NC, integer IS_THERMAL > GEOS_HOST_DEVICE void PressureRelationKernel:: @@ -570,12 +256,10 @@ PressureRelationKernel:: real64 const & presNext, real64 const & totalMassDens, real64 const & totalMassDensNext, - real64 const & dTotalMassDens_dPres, - real64 const & dTotalMassDens_dPresNext, - arraySlice1d< real64 const, compflow::USD_FLUID_DC - 1 > const & dTotalMassDens_dCompDens, - arraySlice1d< real64 const, compflow::USD_FLUID_DC - 1 > const & dTotalMassDens_dCompDensNext, + arraySlice1d< real64 const, compflow::USD_FLUID_DC - 1 > const & dTotalMassDens, + arraySlice1d< real64 const, compflow::USD_FLUID_DC - 1 > const & dTotalMassDensNext, real64 & localPresRel, - real64 ( & localPresRelJacobian )[2*(NC+1)] ) + real64 ( & localPresRelJacobian )[2*(NC+1 + IS_THERMAL)] ) { // local working variables and arrays real64 dAvgMassDens_dCompCurrent[NC]{}; @@ -583,12 +267,12 @@ PressureRelationKernel:: // compute the average density at the interface between well elements real64 const avgMassDens = 0.5 * ( totalMassDensNext + totalMassDens ); - real64 const dAvgMassDens_dPresNext = 0.5 * dTotalMassDens_dPresNext; - real64 const dAvgMassDens_dPresCurrent = 0.5 * dTotalMassDens_dPres; + real64 const dAvgMassDens_dPresNext = 0.5 * dTotalMassDensNext[Deriv::dP]; + real64 const dAvgMassDens_dPresCurrent = 0.5 * dTotalMassDens[Deriv::dP]; for( integer ic = 0; ic < NC; ++ic ) { - dAvgMassDens_dCompNext[ic] = 0.5 * dTotalMassDens_dCompDensNext[ic]; - dAvgMassDens_dCompCurrent[ic] = 0.5 * dTotalMassDens_dCompDens[ic]; + dAvgMassDens_dCompNext[ic] = 0.5 * dTotalMassDensNext[Deriv::dC+ic]; + dAvgMassDens_dCompCurrent[ic] = 0.5 * dTotalMassDens[Deriv::dC+ic]; } // compute depth diff times acceleration @@ -597,17 +281,25 @@ PressureRelationKernel:: // TODO: add friction and acceleration terms localPresRel = ( presNext - pres - avgMassDens * gravD ); - localPresRelJacobian[TAG::NEXT *(NC+1)] = ( 1 - dAvgMassDens_dPresNext * gravD ); - localPresRelJacobian[TAG::CURRENT *(NC+1)] = ( -1 - dAvgMassDens_dPresCurrent * gravD ); + + // localPresRelJacbain contains dP, dC and potentially dT derivatives for neighboring well elements + // TAG::NEXT is 1, CURRENT is 0 , not sure why indexes are setup as below + localPresRelJacobian[TAG::NEXT *(NC+1+IS_THERMAL)] = ( 1 - dAvgMassDens_dPresNext * gravD ); + localPresRelJacobian[TAG::CURRENT *(NC+1+IS_THERMAL)] = ( -1 - dAvgMassDens_dPresCurrent * gravD ); for( integer ic = 0; ic < NC; ++ic ) { - localPresRelJacobian[TAG::NEXT *(NC+1) + ic+1] = -dAvgMassDens_dCompNext[ic] * gravD; - localPresRelJacobian[TAG::CURRENT *(NC+1) + ic+1] = -dAvgMassDens_dCompCurrent[ic] * gravD; + localPresRelJacobian[TAG::NEXT *(NC+1+IS_THERMAL) + ic+1] = -dAvgMassDens_dCompNext[ic] * gravD; + localPresRelJacobian[TAG::CURRENT *(NC+1+IS_THERMAL) + ic+1] = -dAvgMassDens_dCompCurrent[ic] * gravD; + } + if constexpr ( IS_THERMAL ) + { + localPresRelJacobian[TAG::NEXT *(NC+1+IS_THERMAL)+NC+1] = 0.5 * dTotalMassDensNext[Deriv::dT]; + localPresRelJacobian[TAG::CURRENT *(NC+1+IS_THERMAL)+NC+1] = 0.5 * dTotalMassDens[Deriv::dT]; } } -template< integer NC > +template< integer NC, integer IS_THERMAL > void PressureRelationKernel:: launch( localIndex const size, @@ -622,13 +314,12 @@ PressureRelationKernel:: arrayView1d< localIndex const > const & nextWellElemIndex, arrayView1d< real64 const > const & wellElemPressure, arrayView1d< real64 const > const & wellElemTotalMassDens, - arrayView1d< real64 const > const & dWellElemTotalMassDens_dPres, - arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens_dCompDens, + arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens, bool & controlHasSwitched, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { - + using COFFSET_WJ = compositionalMultiphaseWellKernels::ColOffset_WellJac< NC, IS_THERMAL >; // static well control data bool const isProducer = wellControls.isProducer(); WellControls::Control const currentControl = wellControls.getControl(); @@ -640,28 +331,19 @@ PressureRelationKernel:: // dynamic well control data real64 const & currentBHP = wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::currentBHPString() ); - real64 const & dCurrentBHP_dPres = - wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentBHP_dPresString() ); - arrayView1d< real64 const > const & dCurrentBHP_dCompDens = - wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentBHP_dCompDensString() ); + arrayView1d< real64 const > const & dCurrentBHP = + wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentBHPString() ); arrayView1d< real64 const > const & currentPhaseVolRate = wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::currentPhaseVolRateString() ); - arrayView1d< real64 const > const & dCurrentPhaseVolRate_dPres = - wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentPhaseVolRate_dPresString() ); - arrayView2d< real64 const > const & dCurrentPhaseVolRate_dCompDens = - wellControls.getReference< array2d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentPhaseVolRate_dCompDensString() ); - arrayView1d< real64 const > const & dCurrentPhaseVolRate_dRate = - wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentPhaseVolRate_dRateString() ); + arrayView2d< real64 const > const & dCurrentPhaseVolRate = + wellControls.getReference< array2d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentPhaseVolRateString() ); real64 const & currentTotalVolRate = wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::currentTotalVolRateString() ); - real64 const & dCurrentTotalVolRate_dPres = - wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dPresString() ); - arrayView1d< real64 const > const & dCurrentTotalVolRate_dCompDens = - wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dCompDensString() ); - real64 const & dCurrentTotalVolRate_dRate = - wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRate_dRateString() ); + arrayView1d< real64 const > const & dCurrentTotalVolRate = + wellControls.getReference< array1d< real64 > >( CompositionalMultiphaseWell::viewKeyStruct::dCurrentTotalVolRateString() ); + real64 const & massDensity = wellControls.getReference< real64 >( CompositionalMultiphaseWell::viewKeyStruct::massDensityString() ); @@ -690,30 +372,23 @@ PressureRelationKernel:: { switchControl.max( 1 ); } - - ControlEquationHelper::compute< NC >( rankOffset, - newControl, - targetPhaseIndex, - targetBHP, - targetPhaseRate, - targetTotalRate, - targetMassRate, - currentBHP, - dCurrentBHP_dPres, - dCurrentBHP_dCompDens, - currentPhaseVolRate, - dCurrentPhaseVolRate_dPres, - dCurrentPhaseVolRate_dCompDens, - dCurrentPhaseVolRate_dRate, - currentTotalVolRate, - dCurrentTotalVolRate_dPres, - dCurrentTotalVolRate_dCompDens, - dCurrentTotalVolRate_dRate, - massDensity, - wellElemDofNumber[iwelemControl], - localMatrix, - localRhs ); - + ControlEquationHelper::compute< NC, IS_THERMAL >( rankOffset, + newControl, + targetPhaseIndex, + targetBHP, + targetPhaseRate, + targetTotalRate, + targetMassRate, + currentBHP, + dCurrentBHP, + currentPhaseVolRate, + dCurrentPhaseVolRate, + currentTotalVolRate, + dCurrentTotalVolRate, + massDensity, + wellElemDofNumber[iwelemControl], + localMatrix, + localRhs ); // TODO: for consistency, we should assemble here, not in compute... } @@ -721,41 +396,44 @@ PressureRelationKernel:: { real64 localPresRel = 0; - real64 localPresRelJacobian[2*(NC+1)]{}; - - compute< NC >( wellElemGravCoef[iwelem], - wellElemGravCoef[iwelemNext], - wellElemPressure[iwelem], - wellElemPressure[iwelemNext], - wellElemTotalMassDens[iwelem], - wellElemTotalMassDens[iwelemNext], - dWellElemTotalMassDens_dPres[iwelem], - dWellElemTotalMassDens_dPres[iwelemNext], - dWellElemTotalMassDens_dCompDens[iwelem], - dWellElemTotalMassDens_dCompDens[iwelemNext], - localPresRel, - localPresRelJacobian ); + real64 localPresRelJacobian[2*(NC+1+IS_THERMAL)]{}; + + compute< NC, IS_THERMAL >( + wellElemGravCoef[iwelem], + wellElemGravCoef[iwelemNext], + wellElemPressure[iwelem], + wellElemPressure[iwelemNext], + wellElemTotalMassDens[iwelem], + wellElemTotalMassDens[iwelemNext], + dWellElemTotalMassDens[iwelem], + dWellElemTotalMassDens[iwelemNext], + localPresRel, + localPresRelJacobian ); // local working variables and arrays - globalIndex dofColIndices[2*(NC+1)]; + globalIndex dofColIndices[2*(NC+1+IS_THERMAL)]; globalIndex const eqnRowIndex = wellElemDofNumber[iwelem] + ROFFSET::CONTROL - rankOffset; - dofColIndices[TAG::NEXT *(NC+1)] = wellElemDofNumber[iwelemNext] + COFFSET::DPRES; - dofColIndices[TAG::CURRENT *(NC+1)] = wellElemDofNumber[iwelem] + COFFSET::DPRES; + dofColIndices[TAG::NEXT *(NC+1+IS_THERMAL)] = wellElemDofNumber[iwelemNext] + COFFSET_WJ::dP; + dofColIndices[TAG::CURRENT *(NC+1+IS_THERMAL)] = wellElemDofNumber[iwelem] + COFFSET_WJ::dP; for( integer ic = 0; ic < NC; ++ic ) { - dofColIndices[TAG::NEXT *(NC+1) + ic+1] = wellElemDofNumber[iwelemNext] + COFFSET::DCOMP + ic; - dofColIndices[TAG::CURRENT *(NC+1) + ic+1] = wellElemDofNumber[iwelem] + COFFSET::DCOMP + ic; + dofColIndices[TAG::NEXT *(NC+1+IS_THERMAL) + ic+1] = wellElemDofNumber[iwelemNext] + COFFSET_WJ::dC + ic; + dofColIndices[TAG::CURRENT *(NC+1+IS_THERMAL) + ic+1] = wellElemDofNumber[iwelem] + COFFSET_WJ::dC + ic; + } + if constexpr ( IS_THERMAL ) + { + dofColIndices[TAG::NEXT *(NC+1+IS_THERMAL)+NC+1] = wellElemDofNumber[iwelemNext] + COFFSET_WJ::dT; + dofColIndices[TAG::CURRENT *(NC+1+IS_THERMAL)+NC+1] = wellElemDofNumber[iwelem] + COFFSET_WJ::dT; } - if( eqnRowIndex >= 0 && eqnRowIndex < localMatrix.numRows() ) { localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic >( eqnRowIndex, dofColIndices, localPresRelJacobian, - 2 * (NC+1) ); + 2 * (NC+1+IS_THERMAL) ); RAJA::atomicAdd( parallelDeviceAtomic{}, &localRhs[eqnRowIndex], localPresRel ); } } @@ -763,783 +441,36 @@ PressureRelationKernel:: controlHasSwitched = ( switchControl.get() == 1 ); } -#define INST_PressureRelationKernel( NC ) \ +#define INST_PressureRelationKernel( NC, IS_THERMAL ) \ template \ void PressureRelationKernel:: \ - launch< NC >( localIndex const size, \ - globalIndex const rankOffset, \ - bool const isLocallyOwned, \ - localIndex const iwelemControl, \ - integer const targetPhaseIndex, \ - WellControls const & wellControls, \ - real64 const & timeAtEndOfStep, \ - arrayView1d< globalIndex const > const & wellElemDofNumber, \ - arrayView1d< real64 const > const & wellElemGravCoef, \ - arrayView1d< localIndex const > const & nextWellElemIndex, \ - arrayView1d< real64 const > const & wellElemPressure, \ - arrayView1d< real64 const > const & wellElemTotalMassDens, \ - arrayView1d< real64 const > const & dWellElemTotalMassDens_dPres, \ - arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens_dCompDens, \ - bool & controlHasSwitched, \ - CRSMatrixView< real64, globalIndex const > const & localMatrix, \ - arrayView1d< real64 > const & localRhs ) - -INST_PressureRelationKernel( 1 ); -INST_PressureRelationKernel( 2 ); -INST_PressureRelationKernel( 3 ); -INST_PressureRelationKernel( 4 ); -INST_PressureRelationKernel( 5 ); - - -/******************************** PerforationKernel ********************************/ - -template< integer NC, integer NP > -GEOS_HOST_DEVICE -void -PerforationKernel:: - compute( bool const & disableReservoirToWellFlow, - real64 const & resPres, - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & resPhaseVolFrac, - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const & dResPhaseVolFrac, - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const & dResCompFrac_dCompDens, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const & resPhaseDens, - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const & dResPhaseDens, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const & resPhaseVisc, - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const & dResPhaseVisc, - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > const & resPhaseCompFrac, - arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > const & dResPhaseCompFrac, - arraySlice1d< real64 const, relperm::USD_RELPERM - 2 > const & resPhaseRelPerm, - arraySlice2d< real64 const, relperm::USD_RELPERM_DS - 2 > const & dResPhaseRelPerm_dPhaseVolFrac, - real64 const & wellElemGravCoef, - real64 const & wellElemPres, - arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & wellElemCompDens, - real64 const & wellElemTotalMassDens, - real64 const & dWellElemTotalMassDens_dPres, - arraySlice1d< real64 const, compflow::USD_FLUID_DC - 1 > const & dWellElemTotalMassDens_dCompDens, - arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & wellElemCompFrac, - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const & dWellElemCompFrac_dCompDens, - real64 const & perfGravCoef, - real64 const & trans, - arraySlice1d< real64 > const & compPerfRate, - arraySlice2d< real64 > const & dCompPerfRate_dPres, - arraySlice3d< real64 > const & dCompPerfRate_dComp ) -{ - using Deriv = multifluid::DerivativeOffset; - - // local working variables and arrays - real64 pres[2]{}; - real64 dPres_dP[2]{}; - real64 dPres_dC[2][NC]{}; - real64 dFlux_dP[2]{}; - real64 dFlux_dC[2][NC]{}; - real64 dMult_dP[2]{}; - real64 dMult_dC[2][NC]{}; - real64 dPotDiff_dP[2]{}; - real64 dPotDiff_dC[2][NC]{}; - real64 multiplier[2]{}; - - real64 dResTotalMob_dC[NC]{}; - real64 dDens_dC[NC]{}; - real64 dVisc_dC[NC]{}; - real64 dRelPerm_dC[NC]{}; - real64 dMob_dC[NC]{}; - real64 dCompFrac_dCompDens[NC]{}; - - - // Step 1: reset the perforation rates - - for( integer ic = 0; ic < NC; ++ic ) - { - compPerfRate[ic] = 0.0; - for( integer ke = 0; ke < 2; ++ke ) - { - dCompPerfRate_dPres[ke][ic] = 0.0; - for( integer jc = 0; jc < NC; ++jc ) - { - dCompPerfRate_dComp[ke][ic][jc] = 0.0; - } - } - } - - - // Step 2: copy the variables from the reservoir and well element - - // a) get reservoir variables - - pres[TAG::RES] = resPres; - dPres_dP[TAG::RES] = 1.0; - multiplier[TAG::RES] = 1.0; - - // Here in the absence of a buoyancy term we assume that the reservoir cell is perforated at its center - // TODO: add a buoyancy term for the reservoir side here - - - // b) get well variables - - pres[TAG::WELL] = wellElemPres; - dPres_dP[TAG::WELL] = 1.0; - multiplier[TAG::WELL] = -1.0; - - real64 const gravD = ( perfGravCoef - wellElemGravCoef ); - - pres[TAG::WELL] += wellElemTotalMassDens * gravD; - dPres_dP[TAG::WELL] += dWellElemTotalMassDens_dPres * gravD; - for( integer ic = 0; ic < NC; ++ic ) - { - dPres_dC[TAG::WELL][ic] += dWellElemTotalMassDens_dCompDens[ic] * gravD; - } - - - // Step 3: compute potential difference - - real64 potDiff = 0.0; - for( integer i = 0; i < 2; ++i ) - { - potDiff += multiplier[i] * trans * pres[i]; - dPotDiff_dP[i] += multiplier[i] * trans * dPres_dP[i]; - - for( integer ic = 0; ic < NC; ++ic ) - { - dPotDiff_dC[i][ic] += multiplier[i] * trans * dPres_dC[i][ic]; - } - } - - - // Step 4: upwinding based on the flow direction - - real64 flux = 0.0; - if( potDiff >= 0 ) // ** reservoir cell is upstream ** - { - - // loop over phases, compute and upwind phase flux - // and sum contributions to each component's perforation rate - for( integer ip = 0; ip < NP; ++ip ) - { - - // skip the rest of the calculation if the phase is absent - // or if crossflow is disabled for injectors - bool const phaseExists = (resPhaseVolFrac[ip] > 0); - if( !phaseExists || disableReservoirToWellFlow ) - { - continue; - } - - // here, we have to recompute the reservoir phase mobility (not including density) - - // density - real64 const resDens = resPhaseDens[ip]; - real64 const dResDens_dP = dResPhaseDens[ip][Deriv::dP]; - applyChainRule( NC, dResCompFrac_dCompDens, - dResPhaseDens[ip], - dDens_dC, - Deriv::dC ); - - // viscosity - real64 const resVisc = resPhaseVisc[ip]; - real64 const dResVisc_dP = dResPhaseVisc[ip][Deriv::dP]; - applyChainRule( NC, dResCompFrac_dCompDens, - dResPhaseVisc[ip], - dVisc_dC, - Deriv::dC ); - - // relative permeability - real64 const resRelPerm = resPhaseRelPerm[ip]; - real64 dResRelPerm_dP = 0.0; - for( integer jc = 0; jc < NC; ++jc ) - { - dRelPerm_dC[jc] = 0; - } - - for( integer jp = 0; jp < NP; ++jp ) - { - real64 const dResRelPerm_dS = dResPhaseRelPerm_dPhaseVolFrac[ip][jp]; - dResRelPerm_dP += dResRelPerm_dS * dResPhaseVolFrac[jp][Deriv::dP]; - - for( integer jc = 0; jc < NC; ++jc ) - { - dRelPerm_dC[jc] += dResRelPerm_dS * dResPhaseVolFrac[jp][Deriv::dC+jc]; - } - } - - // compute the reservoir phase mobility, including phase density - real64 const resPhaseMob = resDens * resRelPerm / resVisc; - real64 const dResPhaseMob_dPres = dResRelPerm_dP * resDens / resVisc - + resPhaseMob * (dResDens_dP / resDens - dResVisc_dP / resVisc); - for( integer jc = 0; jc < NC; ++jc ) - { - dMob_dC[jc] = dRelPerm_dC[jc] * resDens / resVisc - + resPhaseMob * (dDens_dC[jc] / resDens - dVisc_dC[jc] / resVisc); - } - - // compute the phase flux and derivatives using upstream cell mobility - flux = resPhaseMob * potDiff; - dFlux_dP[TAG::RES] = dResPhaseMob_dPres * potDiff + resPhaseMob * dPotDiff_dP[TAG::RES]; - dFlux_dP[TAG::WELL] = resPhaseMob * dPotDiff_dP[TAG::WELL]; - - for( integer ic = 0; ic < NC; ++ic ) - { - dFlux_dC[TAG::RES][ic] = dMob_dC[ic] * potDiff + resPhaseMob * dPotDiff_dC[TAG::RES][ic]; - dFlux_dC[TAG::WELL][ic] = resPhaseMob * dPotDiff_dC[TAG::WELL][ic]; - } - - // increment component fluxes - for( integer ic = 0; ic < NC; ++ic ) - { - compPerfRate[ic] += flux * resPhaseCompFrac[ip][ic]; - - dCompPerfRate_dPres[TAG::RES][ic] += resPhaseCompFrac[ip][ic] * dFlux_dP[TAG::RES]; - dCompPerfRate_dPres[TAG::RES][ic] += dResPhaseCompFrac[ip][ic][Deriv::dP] * flux; - dCompPerfRate_dPres[TAG::WELL][ic] += resPhaseCompFrac[ip][ic] * dFlux_dP[TAG::WELL]; - - applyChainRule( NC, - dResCompFrac_dCompDens, - dResPhaseCompFrac[ip][ic], - dCompFrac_dCompDens, - Deriv::dC ); - - for( integer jc = 0; jc < NC; ++jc ) - { - dCompPerfRate_dComp[TAG::RES][ic][jc] += dFlux_dC[TAG::RES][jc] * resPhaseCompFrac[ip][ic]; - dCompPerfRate_dComp[TAG::RES][ic][jc] += flux * dCompFrac_dCompDens[jc]; - dCompPerfRate_dComp[TAG::WELL][ic][jc] += dFlux_dC[TAG::WELL][jc] * resPhaseCompFrac[ip][ic]; - } - } - } - } - else // ** well is upstream ** - { - - real64 resTotalMob = 0.0; - real64 dResTotalMob_dP = 0.0; - - // we re-compute here the total mass (when useMass == 1) or molar (when useMass == 0) density - real64 wellElemTotalDens = 0; - for( integer ic = 0; ic < NC; ++ic ) - { - wellElemTotalDens += wellElemCompDens[ic]; - } - - // first, compute the reservoir total mobility (excluding phase density) - for( integer ip = 0; ip < NP; ++ip ) - { - - // skip the rest of the calculation if the phase is absent - bool const phaseExists = (resPhaseVolFrac[ip] > 0); - if( !phaseExists ) - { - continue; - } - - // viscosity - real64 const resVisc = resPhaseVisc[ip]; - real64 const dResVisc_dP = dResPhaseVisc[ip][Deriv::dP]; - applyChainRule( NC, dResCompFrac_dCompDens, - dResPhaseVisc[ip], - dVisc_dC, - Deriv::dC ); - - // relative permeability - real64 const resRelPerm = resPhaseRelPerm[ip]; - real64 dResRelPerm_dP = 0.0; - for( integer jc = 0; jc < NC; ++jc ) - { - dRelPerm_dC[jc] = 0; - } - - for( integer jp = 0; jp < NP; ++jp ) - { - real64 const dResRelPerm_dS = dResPhaseRelPerm_dPhaseVolFrac[ip][jp]; - dResRelPerm_dP += dResRelPerm_dS * dResPhaseVolFrac[jp][Deriv::dP]; - - for( integer jc = 0; jc < NC; ++jc ) - { - dRelPerm_dC[jc] += dResRelPerm_dS * dResPhaseVolFrac[jp][Deriv::dC+jc]; - } - } - - // increment total mobility - resTotalMob += resRelPerm / resVisc; - dResTotalMob_dP += ( dResRelPerm_dP * resVisc - resRelPerm * dResVisc_dP ) - / ( resVisc * resVisc ); - for( integer ic = 0; ic < NC; ++ic ) - { - dResTotalMob_dC[ic] += ( dRelPerm_dC[ic] * resVisc - resRelPerm * dVisc_dC[ic] ) - / ( resVisc * resVisc ); - } - } - - // compute a potdiff multiplier = wellElemTotalDens * resTotalMob - // wellElemTotalDens is a mass density if useMass == 1 and a molar density otherwise - real64 const mult = wellElemTotalDens * resTotalMob; - dMult_dP[TAG::RES] = wellElemTotalDens * dResTotalMob_dP; - dMult_dP[TAG::WELL] = 0.0; // because totalDens does not depend on pressure - - for( integer ic = 0; ic < NC; ++ic ) - { - dMult_dC[TAG::RES][ic] = wellElemTotalDens * dResTotalMob_dC[ic]; - dMult_dC[TAG::WELL][ic] = resTotalMob; - } - - // compute the volumetric flux and derivatives using upstream cell mobility - flux = mult * potDiff; - dFlux_dP[TAG::RES] = dMult_dP[TAG::RES] * potDiff + mult * dPotDiff_dP[TAG::RES]; - dFlux_dP[TAG::WELL] = dMult_dP[TAG::WELL] * potDiff + mult * dPotDiff_dP[TAG::WELL]; - - for( integer ic = 0; ic < NC; ++ic ) - { - dFlux_dC[TAG::RES][ic] = dMult_dC[TAG::RES][ic] * potDiff + mult * dPotDiff_dC[TAG::RES][ic]; - dFlux_dC[TAG::WELL][ic] = dMult_dC[TAG::WELL][ic] * potDiff + mult * dPotDiff_dC[TAG::WELL][ic]; - } - - // compute component fluxes - for( integer ic = 0; ic < NC; ++ic ) - { - compPerfRate[ic] += wellElemCompFrac[ic] * flux; - dCompPerfRate_dPres[TAG::RES][ic] = wellElemCompFrac[ic] * dFlux_dP[TAG::RES]; - dCompPerfRate_dPres[TAG::WELL][ic] = wellElemCompFrac[ic] * dFlux_dP[TAG::WELL]; - - for( integer jc = 0; jc < NC; ++jc ) - { - dCompPerfRate_dComp[TAG::RES][ic][jc] += wellElemCompFrac[ic] * dFlux_dC[TAG::RES][jc]; - dCompPerfRate_dComp[TAG::WELL][ic][jc] += wellElemCompFrac[ic] * dFlux_dC[TAG::WELL][jc]; - dCompPerfRate_dComp[TAG::WELL][ic][jc] += dWellElemCompFrac_dCompDens[ic][jc] * flux; - } - } - } -} - -template< integer NC, integer NP > -void -PerforationKernel:: - launch( localIndex const size, - bool const disableReservoirToWellFlow, - ElementViewConst< arrayView1d< real64 const > > const & resPres, - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & resPhaseVolFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dResPhaseVolFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dResCompFrac_dCompDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & resPhaseDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dResPhaseDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & resPhaseVisc, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dResPhaseVisc, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & resPhaseCompFrac, - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dResPhaseCompFrac, - ElementViewConst< arrayView3d< real64 const, relperm::USD_RELPERM > > const & resPhaseRelPerm, - ElementViewConst< arrayView4d< real64 const, relperm::USD_RELPERM_DS > > const & dResPhaseRelPerm_dPhaseVolFrac, - arrayView1d< real64 const > const & wellElemGravCoef, - arrayView1d< real64 const > const & wellElemPres, - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompDens, - arrayView1d< real64 const > const & wellElemTotalMassDens, - arrayView1d< real64 const > const & dWellElemTotalMassDens_dPres, - arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens_dCompDens, - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompFrac, - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens, - arrayView1d< real64 const > const & perfGravCoef, - arrayView1d< localIndex const > const & perfWellElemIndex, - arrayView1d< real64 const > const & perfTrans, - arrayView1d< localIndex const > const & resElementRegion, - arrayView1d< localIndex const > const & resElementSubRegion, - arrayView1d< localIndex const > const & resElementIndex, - arrayView2d< real64 > const & compPerfRate, - arrayView3d< real64 > const & dCompPerfRate_dPres, - arrayView4d< real64 > const & dCompPerfRate_dComp ) -{ - - // loop over the perforations to compute the perforation rates - forAll< parallelDevicePolicy<> >( size, [=] GEOS_HOST_DEVICE ( localIndex const iperf ) - { - - // get the index of the reservoir elem - localIndex const er = resElementRegion[iperf]; - localIndex const esr = resElementSubRegion[iperf]; - localIndex const ei = resElementIndex[iperf]; - - // get the index of the well elem - localIndex const iwelem = perfWellElemIndex[iperf]; - - compute< NC, NP >( disableReservoirToWellFlow, - resPres[er][esr][ei], - resPhaseVolFrac[er][esr][ei], - dResPhaseVolFrac[er][esr][ei], - dResCompFrac_dCompDens[er][esr][ei], - resPhaseDens[er][esr][ei][0], - dResPhaseDens[er][esr][ei][0], - resPhaseVisc[er][esr][ei][0], - dResPhaseVisc[er][esr][ei][0], - resPhaseCompFrac[er][esr][ei][0], - dResPhaseCompFrac[er][esr][ei][0], - resPhaseRelPerm[er][esr][ei][0], - dResPhaseRelPerm_dPhaseVolFrac[er][esr][ei][0], - wellElemGravCoef[iwelem], - wellElemPres[iwelem], - wellElemCompDens[iwelem], - wellElemTotalMassDens[iwelem], - dWellElemTotalMassDens_dPres[iwelem], - dWellElemTotalMassDens_dCompDens[iwelem], - wellElemCompFrac[iwelem], - dWellElemCompFrac_dCompDens[iwelem], - perfGravCoef[iperf], - perfTrans[iperf], - compPerfRate[iperf], - dCompPerfRate_dPres[iperf], - dCompPerfRate_dComp[iperf] ); - - } ); -} - -#define INST_PerforationKernel( NC, NP ) \ - template \ - void PerforationKernel:: \ - launch< NC, NP >( localIndex const size, \ - bool const disableReservoirToWellFlow, \ - ElementViewConst< arrayView1d< real64 const > > const & resPres, \ - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & resPhaseVolFrac, \ - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dResPhaseVolFrac, \ - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dResCompFrac_dCompDens, \ - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & resPhaseDens, \ - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dResPhaseDens, \ - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & resPhaseVisc, \ - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dResPhaseVisc, \ - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & resPhaseCompFrac, \ - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dResPhaseCompFrac, \ - ElementViewConst< arrayView3d< real64 const, relperm::USD_RELPERM > > const & resPhaseRelPerm, \ - ElementViewConst< arrayView4d< real64 const, relperm::USD_RELPERM_DS > > const & dResPhaseRelPerm_dPhaseVolFrac, \ - arrayView1d< real64 const > const & wellElemGravCoef, \ - arrayView1d< real64 const > const & wellElemPres, \ - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompDens, \ - arrayView1d< real64 const > const & wellElemTotalMassDens, \ - arrayView1d< real64 const > const & dWellElemTotalMassDens_dPres, \ - arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens_dCompDens, \ - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompFrac, \ - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens, \ - arrayView1d< real64 const > const & perfGravCoef, \ - arrayView1d< localIndex const > const & perfWellElemIndex, \ - arrayView1d< real64 const > const & perfTrans, \ - arrayView1d< localIndex const > const & resElementRegion, \ - arrayView1d< localIndex const > const & resElementSubRegion, \ - arrayView1d< localIndex const > const & resElementIndex, \ - arrayView2d< real64 > const & compPerfRate, \ - arrayView3d< real64 > const & dCompPerfRate_dPres, \ - arrayView4d< real64 > const & dCompPerfRate_dComp ) - -INST_PerforationKernel( 1, 2 ); -INST_PerforationKernel( 2, 2 ); -INST_PerforationKernel( 3, 2 ); -INST_PerforationKernel( 4, 2 ); -INST_PerforationKernel( 5, 2 ); -INST_PerforationKernel( 1, 3 ); -INST_PerforationKernel( 2, 3 ); -INST_PerforationKernel( 3, 3 ); -INST_PerforationKernel( 4, 3 ); -INST_PerforationKernel( 5, 3 ); - -/******************************** AccumulationKernel ********************************/ - -template< integer NC > -GEOS_HOST_DEVICE -void -AccumulationKernel:: - compute( integer const numPhases, - real64 const & volume, - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFrac, - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const & dPhaseVolFrac, - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const & dCompFrac_dCompDens, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const & phaseDens, - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > const & dPhaseDens, - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > const & phaseCompFrac, - arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > const & dPhaseCompFrac, - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFrac_n, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > const & phaseDens_n, - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > const & phaseCompFrac_n, - real64 ( & localAccum )[NC], - real64 ( & localAccumJacobian )[NC][NC + 1] ) -{ - using Deriv = multifluid::DerivativeOffset; - - // temporary work arrays - real64 dPhaseAmount_dC[NC]{}; - real64 dPhaseCompFrac_dC[NC]{}; - - // reset the local values - for( integer i = 0; i < NC; ++i ) - { - localAccum[i] = 0.0; - for( integer j = 0; j < NC+1; ++j ) - { - localAccumJacobian[i][j] = 0.0; - } - } - - // sum contributions to component accumulation from each phase - for( integer ip = 0; ip < numPhases; ++ip ) - { - real64 const phaseAmountNew = volume * phaseVolFrac[ip] * phaseDens[ip]; - real64 const phaseAmount_n = volume * phaseVolFrac_n[ip] * phaseDens_n[ip]; - - real64 const dPhaseAmount_dP = volume * ( dPhaseVolFrac[ip][Deriv::dP] * phaseDens[ip] - + phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dP] ); - - // assemble density dependence - applyChainRule( NC, dCompFrac_dCompDens, dPhaseDens[ip], dPhaseAmount_dC, Deriv::dC ); - for( integer jc = 0; jc < NC; ++jc ) - { - dPhaseAmount_dC[jc] = dPhaseAmount_dC[jc] * phaseVolFrac[ip] - + phaseDens[ip] * dPhaseVolFrac[ip][Deriv::dC+jc]; - dPhaseAmount_dC[jc] *= volume; - } - - // ic - index of component whose conservation equation is assembled - // (i.e. row number in local matrix) - for( integer ic = 0; ic < NC; ++ic ) - { - real64 const phaseCompAmountNew = phaseAmountNew * phaseCompFrac[ip][ic]; - real64 const phaseCompAmount_n = phaseAmount_n * phaseCompFrac_n[ip][ic]; - - real64 const dPhaseCompAmount_dP = dPhaseAmount_dP * phaseCompFrac[ip][ic] - + phaseAmountNew * dPhaseCompFrac[ip][ic][Deriv::dP]; - - localAccum[ic] += phaseCompAmountNew - phaseCompAmount_n; - localAccumJacobian[ic][0] += dPhaseCompAmount_dP; - - // jc - index of component w.r.t. whose compositional var the derivative is being taken - // (i.e. col number in local matrix) - - // assemble phase composition dependence - applyChainRule( NC, dCompFrac_dCompDens, dPhaseCompFrac[ip][ic], dPhaseCompFrac_dC, Deriv::dC ); - for( integer jc = 0; jc < NC; ++jc ) - { - real64 const dPhaseCompAmount_dC = dPhaseCompFrac_dC[jc] * phaseAmountNew - + phaseCompFrac[ip][ic] * dPhaseAmount_dC[jc]; - localAccumJacobian[ic][jc + 1] += dPhaseCompAmount_dC; - } - } - } -} - -template< integer NC > -void -AccumulationKernel:: - launch( localIndex const size, - integer const numPhases, - globalIndex const rankOffset, - integer const useTotalMassEquation, - arrayView1d< globalIndex const > const & wellElemDofNumber, - arrayView1d< integer const > const & wellElemGhostRank, - arrayView1d< real64 const > const & wellElemVolume, - arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac, - arrayView3d< real64 const, compflow::USD_PHASE_DC > const & dWellElemPhaseVolFrac, - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens, - arrayView3d< real64 const, multifluid::USD_PHASE > const & wellElemPhaseDens, - arrayView4d< real64 const, multifluid::USD_PHASE_DC > const & dWellElemPhaseDens, - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac, - arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > const & dWellElemPhaseCompFrac, - arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac_n, - arrayView3d< real64 const, multifluid::USD_PHASE > const & wellElemPhaseDens_n, - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac_n, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) -{ - - using namespace compositionalMultiphaseUtilities; - - forAll< parallelDevicePolicy<> >( size, [=] GEOS_HOST_DEVICE ( localIndex const iwelem ) - { - - if( wellElemGhostRank[iwelem] >= 0 ) - { - return; - } - - real64 localAccum[NC]{}; - real64 localAccumJacobian[NC][NC+1]{}; - - compute< NC >( numPhases, - wellElemVolume[iwelem], - wellElemPhaseVolFrac[iwelem], - dWellElemPhaseVolFrac[iwelem], - dWellElemCompFrac_dCompDens[iwelem], - wellElemPhaseDens[iwelem][0], - dWellElemPhaseDens[iwelem][0], - wellElemPhaseCompFrac[iwelem][0], - dWellElemPhaseCompFrac[iwelem][0], - wellElemPhaseVolFrac_n[iwelem], - wellElemPhaseDens_n[iwelem][0], - wellElemPhaseCompFrac_n[iwelem][0], - localAccum, - localAccumJacobian ); - - // set the equation row indices to be the mass balance equations for all components - localIndex eqnRowIndices[NC]{}; - for( integer ic = 0; ic < NC; ++ic ) - { - eqnRowIndices[ic] = wellElemDofNumber[iwelem] + ROFFSET::MASSBAL + ic - rankOffset; - } - - // set DOF col indices for this block - globalIndex dofColIndices[NC+1]{}; - for( integer idof = 0; idof < NC+1; ++idof ) - { - dofColIndices[idof] = wellElemDofNumber[iwelem] + COFFSET::DPRES + idof; - } - - if( useTotalMassEquation > 0 ) - { - // Apply equation/variable change transformation(s) - real64 work[NC + 1]; - shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( NC, NC + 1, localAccumJacobian, work ); - shiftElementsAheadByOneAndReplaceFirstElementWithSum( NC, localAccum ); - } - - // add contribution to residual and jacobian - for( integer ic = 0; ic < NC; ++ic ) - { - localRhs[eqnRowIndices[ic]] += localAccum[ic]; - localMatrix.addToRow< serialAtomic >( eqnRowIndices[ic], - dofColIndices, - localAccumJacobian[ic], - NC+1 ); - } - } ); -} - -#define INST_AccumulationKernel( NC ) \ - template \ - void AccumulationKernel:: \ - launch< NC >( localIndex const size, \ - integer const numPhases, \ - globalIndex const rankOffset, \ - integer const useTotalMassEquation, \ - arrayView1d< globalIndex const > const & wellElemDofNumber, \ - arrayView1d< integer const > const & wellElemGhostRank, \ - arrayView1d< real64 const > const & wellElemVolume, \ - arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac, \ - arrayView3d< real64 const, compflow::USD_PHASE_DC > const & dWellElemPhaseVolFrac, \ - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens, \ - arrayView3d< real64 const, multifluid::USD_PHASE > const & wellElemPhaseDens, \ - arrayView4d< real64 const, multifluid::USD_PHASE_DC > const & dWellElemPhaseDens, \ - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac, \ - arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > const & dWellElemPhaseCompFrac, \ - arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac_n, \ - arrayView3d< real64 const, multifluid::USD_PHASE > const & wellElemPhaseDens_n, \ - arrayView4d< real64 const, multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac_n, \ - CRSMatrixView< real64, globalIndex const > const & localMatrix, \ - arrayView1d< real64 > const & localRhs ) - -INST_AccumulationKernel( 1 ); -INST_AccumulationKernel( 2 ); -INST_AccumulationKernel( 3 ); -INST_AccumulationKernel( 4 ); -INST_AccumulationKernel( 5 ); - -/******************************** VolumeBalanceKernel ********************************/ - -template< integer NC > -GEOS_HOST_DEVICE -void -VolumeBalanceKernel:: - compute( integer const numPhases, - real64 const & volume, - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFrac, - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const & dPhaseVolFrac, - real64 & localVolBalance, - real64 ( & localVolBalanceJacobian )[NC+1] ) -{ - using Deriv = multifluid::DerivativeOffset; - - localVolBalance = 1.0; - for( integer ic = 0; ic < NC+1; ++ic ) - { - localVolBalanceJacobian[ic] = 0.0; - } - - // sum contributions to component accumulation from each phase - for( integer ip = 0; ip < numPhases; ++ip ) - { - localVolBalance -= phaseVolFrac[ip]; - localVolBalanceJacobian[0] -= dPhaseVolFrac[ip][Deriv::dP]; - - for( integer jc = 0; jc < NC; ++jc ) - { - localVolBalanceJacobian[jc + 1] -= dPhaseVolFrac[ip][Deriv::dC+jc]; - } - } - - // scale saturation-based volume balance by pore volume (for better scaling w.r.t. other equations) - for( integer idof = 0; idof < NC+1; ++idof ) - { - localVolBalanceJacobian[idof] *= volume; - } - localVolBalance *= volume; -} - -template< integer NC > -void -VolumeBalanceKernel:: - launch( localIndex const size, - integer const numPhases, - globalIndex const rankOffset, - arrayView1d< globalIndex const > const & wellElemDofNumber, - arrayView1d< integer const > const & wellElemGhostRank, - arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac, - arrayView3d< real64 const, compflow::USD_PHASE_DC > const & dWellElemPhaseVolFrac, - arrayView1d< real64 const > const & wellElemVolume, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) -{ - forAll< parallelDevicePolicy<> >( size, [=] GEOS_HOST_DEVICE ( localIndex const iwelem ) - { - - if( wellElemGhostRank[iwelem] >= 0 ) - { - return; - } - - real64 localVolBalance = 1.0; - real64 localVolBalanceJacobian[NC+1]{}; - - compute< NC >( numPhases, - wellElemVolume[iwelem], - wellElemPhaseVolFrac[iwelem], - dWellElemPhaseVolFrac[iwelem], - localVolBalance, - localVolBalanceJacobian ); - - // get equation/dof indices - localIndex const localVolBalanceEqnIndex = wellElemDofNumber[iwelem] - rankOffset + ROFFSET::MASSBAL + NC; - globalIndex localVolBalanceDOF[NC+1]{}; - for( integer jdof = 0; jdof < NC+1; ++jdof ) - { - localVolBalanceDOF[jdof] = wellElemDofNumber[iwelem] + COFFSET::DPRES + jdof; - } - - localMatrix.addToRowBinarySearchUnsorted< serialAtomic >( localVolBalanceEqnIndex, - localVolBalanceDOF, - localVolBalanceJacobian, - NC+1 ); - localRhs[localVolBalanceEqnIndex] += localVolBalance; - } ); -} - -#define INST_VolumeBalanceKernel( NC ) \ - template \ - void VolumeBalanceKernel:: \ - launch< NC >( localIndex const size, \ - integer const numPhases, \ - globalIndex const rankOffset, \ - arrayView1d< globalIndex const > const & wellElemDofNumber, \ - arrayView1d< integer const > const & wellElemGhostRank, \ - arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac, \ - arrayView3d< real64 const, compflow::USD_PHASE_DC > const & dWellElemPhaseVolFrac, \ - arrayView1d< real64 const > const & wellElemVolume, \ - CRSMatrixView< real64, globalIndex const > const & localMatrix, \ - arrayView1d< real64 > const & localRhs ) - -INST_VolumeBalanceKernel( 1 ); -INST_VolumeBalanceKernel( 2 ); -INST_VolumeBalanceKernel( 3 ); -INST_VolumeBalanceKernel( 4 ); -INST_VolumeBalanceKernel( 5 ); - -/******************************** PresTempCompFracInitializationKernel ********************************/ + launch< NC, IS_THERMAL >( localIndex const size, \ + globalIndex const rankOffset, \ + bool const isLocallyOwned, \ + localIndex const iwelemControl, \ + integer const targetPhaseIndex, \ + WellControls const & wellControls, \ + real64 const & timeAtEndOfStep, \ + arrayView1d< globalIndex const > const & wellElemDofNumber, \ + arrayView1d< real64 const > const & wellElemGravCoef, \ + arrayView1d< localIndex const > const & nextWellElemIndex, \ + arrayView1d< real64 const > const & wellElemPressure, \ + arrayView1d< real64 const > const & wellElemTotalMassDens, \ + arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens, \ + bool & controlHasSwitched, \ + CRSMatrixView< real64, globalIndex const > const & localMatrix, \ + arrayView1d< real64 > const & localRhs ) + +INST_PressureRelationKernel( 1, 0 ); +INST_PressureRelationKernel( 1, 1 ); +INST_PressureRelationKernel( 2, 0 ); +INST_PressureRelationKernel( 2, 1 ); +INST_PressureRelationKernel( 3, 0 ); +INST_PressureRelationKernel( 3, 1 ); +INST_PressureRelationKernel( 4, 0 ); +INST_PressureRelationKernel( 4, 1 ); +INST_PressureRelationKernel( 5, 0 ); +INST_PressureRelationKernel( 5, 1 ); void PresTempCompFracInitializationKernel:: diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp index f06b27ac202..220df6a5abc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp @@ -29,6 +29,7 @@ #include "constitutive/relativePermeability/RelativePermeabilityFields.hpp" #include "mesh/ElementRegionManager.hpp" #include "mesh/ObjectManagerBase.hpp" +#include "physicsSolvers/KernelLaunchSelectors.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" @@ -40,6 +41,7 @@ namespace geos { + namespace compositionalMultiphaseWellKernels { @@ -66,6 +68,30 @@ struct ColOffset static constexpr integer DCOMP = 1; }; +template< integer NC, integer IS_THERMAL > +struct ColOffset_WellJac; + +template< integer NC > +struct ColOffset_WellJac< NC, 0 > +{ + static constexpr integer dP = 0; + static constexpr integer dC = 1; + static constexpr integer dQ = dC + NC; + static integer constexpr nDer = dQ + 1; + +}; + +template< integer NC > +struct ColOffset_WellJac< NC, 1 > +{ + static constexpr integer dP = 0; + static constexpr integer dC = 1; + static constexpr integer dQ = dC + NC; + static constexpr integer dT = dQ+1; +/// number of derivatives + static integer constexpr nDer = dT + 1; +}; + // define the row offset of the residual equations struct RowOffset { @@ -73,11 +99,31 @@ struct RowOffset static constexpr integer MASSBAL = 1; }; -/******************************** ControlEquationHelper ********************************/ +template< integer NC, integer IS_THERMAL > +struct RowOffset_WellJac; -struct ControlEquationHelper +template< integer NC > +struct RowOffset_WellJac< NC, 0 > +{ + static constexpr integer CONTROL = 0; + static constexpr integer MASSBAL = 1; + static constexpr integer VOLBAL = MASSBAL + NC; + static constexpr integer nEqn = VOLBAL+1; +}; + +template< integer NC > +struct RowOffset_WellJac< NC, 1 > { + static constexpr integer CONTROL = 0; + static constexpr integer MASSBAL = 1; + static constexpr integer VOLBAL = MASSBAL + NC; + static constexpr integer ENERGYBAL = VOLBAL+1; + static constexpr integer nEqn = ENERGYBAL+1; +}; +/******************************** ControlEquationHelper ********************************/ +struct ControlEquationHelper +{ using ROFFSET = compositionalMultiphaseWellKernels::RowOffset; using COFFSET = compositionalMultiphaseWellKernels::ColOffset; @@ -97,7 +143,7 @@ struct ControlEquationHelper real64 const & currentTotalVolRate, WellControls::Control & newControl ); - template< integer NC > + template< integer NC, integer IS_THERMAL > GEOS_HOST_DEVICE inline static void @@ -109,16 +155,11 @@ struct ControlEquationHelper real64 const & targetTotalRate, real64 const & targetMassRate, real64 const & currentBHP, - real64 const & dCurrentBHP_dPres, - arrayView1d< real64 const > const & dCurrentBHP_dCompDens, + arrayView1d< real64 const > const & dCurrentBHP, arrayView1d< real64 const > const & currentPhaseVolRate, - arrayView1d< real64 const > const & dCurrentPhaseVolRate_dPres, - arrayView2d< real64 const > const & dCurrentPhaseVolRate_dCompDens, - arrayView1d< real64 const > const & dCurrentPhaseVolRate_dRate, + arrayView2d< real64 const > const & dCurrentPhaseVolRate, real64 const & currentTotalVolRate, - real64 const & dCurrentTotalVolRate_dPres, - arrayView1d< real64 const > const & dCurrentTotalVolRate_dCompDens, - real64 const & dCurrentTotalVolRate_dRate, + arrayView1d< real64 const > const & dCurrentTotalVolRate, real64 const & massDensity, globalIndex const dofNumber, CRSMatrixView< real64, globalIndex const > const & localMatrix, @@ -126,68 +167,16 @@ struct ControlEquationHelper }; -/******************************** FluxKernel ********************************/ - -struct FluxKernel -{ - - using TAG = compositionalMultiphaseWellKernels::ElemTag; - using ROFFSET = compositionalMultiphaseWellKernels::RowOffset; - using COFFSET = compositionalMultiphaseWellKernels::ColOffset; - - template< integer NC > - GEOS_HOST_DEVICE - inline - static void - computeExit( real64 const & dt, - real64 const ( &compFlux )[NC], - real64 const ( &dCompFlux_dRate )[NC], - real64 const ( &dCompFlux_dPresUp )[NC], - real64 const ( &dCompFlux_dCompDensUp )[NC][NC], - real64 ( &oneSidedFlux )[NC], - real64 ( &oneSidedFluxJacobian_dRate )[NC][1], - real64 ( &oneSidedFluxJacobian_dPresCompUp )[NC][NC + 1] ); - - template< integer NC > - GEOS_HOST_DEVICE - inline - static void - compute( real64 const & dt, - real64 const ( &compFlux )[NC], - real64 const ( &dCompFlux_dRate )[NC], - real64 const ( &dCompFlux_dPresUp )[NC], - real64 const ( &dCompFlux_dCompDensUp )[NC][NC], - real64 ( &localFlux )[2*NC], - real64 ( &localFluxJacobian_dRate )[2*NC][1], - real64 ( &localFluxJacobian_dPresCompUp )[2*NC][NC + 1] ); - - template< integer NC > - static void - launch( localIndex const size, - globalIndex const rankOffset, - integer const useTotalMassEquation, - WellControls const & wellControls, - arrayView1d< globalIndex const > const & wellElemDofNumber, - arrayView1d< localIndex const > const & nextWellElemIndex, - arrayView1d< real64 const > const & connRate, - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompFrac, - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ); - -}; - /******************************** PressureRelationKernel ********************************/ struct PressureRelationKernel { - + using Deriv = constitutive::multifluid::DerivativeOffset; using TAG = compositionalMultiphaseWellKernels::ElemTag; using ROFFSET = compositionalMultiphaseWellKernels::RowOffset; using COFFSET = compositionalMultiphaseWellKernels::ColOffset; - template< integer NC > + template< integer NC, integer IS_THERMAL > GEOS_HOST_DEVICE inline static void @@ -197,14 +186,12 @@ struct PressureRelationKernel real64 const & presNext, real64 const & totalMassDens, real64 const & totalMassDensNext, - real64 const & dTotalMassDens_dPres, - real64 const & dTotalMassDens_dPresNext, - arraySlice1d< real64 const, compflow::USD_FLUID_DC - 1 > const & dTotalMassDens_dCompDens, - arraySlice1d< real64 const, compflow::USD_FLUID_DC - 1 > const & dTotalMassDens_dCompDensNext, + arraySlice1d< real64 const, compflow::USD_FLUID_DC - 1 > const & dTotalMassDens, + arraySlice1d< real64 const, compflow::USD_FLUID_DC - 1 > const & dTotalMassDensNext, real64 & localPresRel, - real64 ( &localPresRelJacobian )[2*(NC+1)] ); + real64 ( &localPresRelJacobian )[2*(NC+1+IS_THERMAL)] ); - template< integer NC > + template< integer NC, integer IS_THERMAL > static void launch( localIndex const size, globalIndex const rankOffset, @@ -218,171 +205,13 @@ struct PressureRelationKernel arrayView1d< localIndex const > const & nextWellElemIndex, arrayView1d< real64 const > const & wellElemPressure, arrayView1d< real64 const > const & wellElemTotalMassDens, - arrayView1d< real64 const > const & dWellElemTotalMassDens_dPres, - arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens_dCompDens, + arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens, bool & controlHasSwitched, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ); }; -/******************************** PerforationKernel ********************************/ - -struct PerforationKernel -{ - - using TAG = compositionalMultiphaseWellKernels::SubRegionTag; - - using CompFlowAccessors = - StencilAccessors< fields::flow::pressure, - fields::flow::phaseVolumeFraction, - fields::flow::dPhaseVolumeFraction, - fields::flow::dGlobalCompFraction_dGlobalCompDensity >; - - using MultiFluidAccessors = - StencilMaterialAccessors< constitutive::MultiFluidBase, - fields::multifluid::phaseDensity, - fields::multifluid::dPhaseDensity, - fields::multifluid::phaseViscosity, - fields::multifluid::dPhaseViscosity, - fields::multifluid::phaseCompFraction, - fields::multifluid::dPhaseCompFraction >; - - using RelPermAccessors = - StencilMaterialAccessors< constitutive::RelativePermeabilityBase, - fields::relperm::phaseRelPerm, - fields::relperm::dPhaseRelPerm_dPhaseVolFraction >; - - - /** - * @brief The type for element-based non-constitutive data parameters. - * Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - - template< integer NC, integer NP > - GEOS_HOST_DEVICE - inline - static void - compute( bool const & disableReservoirToWellFlow, - real64 const & resPres, - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & resPhaseVolFrac, - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const & dResPhaseVolFrac, - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const & dResCompFrac_dCompDens, - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const & resPhaseDens, - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const & dResPhaseDens, - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const & resPhaseVisc, - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const & dResPhaseVisc, - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > const & resPhaseCompFrac, - arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > const & dResPhaseCompFrac, - arraySlice1d< real64 const, constitutive::relperm::USD_RELPERM - 2 > const & resPhaseRelPerm, - arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > const & dResPhaseRelPerm_dPhaseVolFrac, - real64 const & wellElemGravCoef, - real64 const & wellElemPres, - arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & wellElemCompDens, - real64 const & wellElemTotalMassDens, - real64 const & dWellElemTotalMassDens_dPres, - arraySlice1d< real64 const, compflow::USD_FLUID_DC - 1 > const & dWellElemTotalMassDens_dCompDens, - arraySlice1d< real64 const, compflow::USD_COMP - 1 > const & wellElemCompFrac, - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const & dWellElemCompFrac_dCompDens, - real64 const & perfGravCoef, - real64 const & trans, - arraySlice1d< real64 > const & compPerfRate, - arraySlice2d< real64 > const & dCompPerfRate_dPres, - arraySlice3d< real64 > const & dCompPerfRate_dComp ); - - template< integer NC, integer NP > - static void - launch( localIndex const size, - bool const disableReservoirToWellFlow, - ElementViewConst< arrayView1d< real64 const > > const & resPres, - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & resPhaseVolFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dResPhaseVolFrac_dComp, - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dResCompFrac_dCompDens, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & resPhaseDens, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dResPhaseDens, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & resPhaseVisc, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dResPhaseVisc, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & resPhaseCompFrac, - ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dResPhaseCompFrac, - ElementViewConst< arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > > const & resPhaseRelPerm, - ElementViewConst< arrayView4d< real64 const, constitutive::relperm::USD_RELPERM_DS > > const & dResPhaseRelPerm_dPhaseVolFrac, - arrayView1d< real64 const > const & wellElemGravCoef, - arrayView1d< real64 const > const & wellElemPres, - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompDens, - arrayView1d< real64 const > const & wellElemTotalMassDens, - arrayView1d< real64 const > const & dWellElemTotalMassDens_dPres, - arrayView2d< real64 const, compflow::USD_FLUID_DC > const & dWellElemTotalMassDens_dCompDens, - arrayView2d< real64 const, compflow::USD_COMP > const & wellElemCompFrac, - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens, - arrayView1d< real64 const > const & perfGravCoef, - arrayView1d< localIndex const > const & perfWellElemIndex, - arrayView1d< real64 const > const & perfTrans, - arrayView1d< localIndex const > const & resElementRegion, - arrayView1d< localIndex const > const & resElementSubRegion, - arrayView1d< localIndex const > const & resElementIndex, - arrayView2d< real64 > const & compPerfRate, - arrayView3d< real64 > const & dCompPerfRate_dPres, - arrayView4d< real64 > const & dCompPerfRate_dComp ); - -}; - -/******************************** AccumulationKernel ********************************/ - -struct AccumulationKernel -{ - - using ROFFSET = compositionalMultiphaseWellKernels::RowOffset; - using COFFSET = compositionalMultiphaseWellKernels::ColOffset; - - template< integer NC > - GEOS_HOST_DEVICE - inline - static void - compute( integer const numPhases, - real64 const & volume, - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFrac, - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const & dPhaseVolFrac, - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const & dCompFrac_dCompDens, - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const & phaseDens, - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const & dPhaseDens, - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > const & phaseCompFrac, - arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > const & dPhaseCompFrac, - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const & phaseVolFrac_n, - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const & phaseDens_n, - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > const & phaseCompFrac_n, - real64 ( &localAccum )[NC], - real64 ( &localAccumJacobian )[NC][NC + 1] ); - - template< integer NC > - static void - launch( localIndex const size, - integer const numPhases, - globalIndex const rankOffset, - integer const useTotalMassEquation, - arrayView1d< globalIndex const > const & wellElemDofNumber, - arrayView1d< integer const > const & wellElemGhostRank, - arrayView1d< real64 const > const & wellElemVolume, - arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac, - arrayView3d< real64 const, compflow::USD_PHASE_DC > const & dWellElemPhaseVolFrac, - arrayView3d< real64 const, compflow::USD_COMP_DC > const & dWellElemCompFrac_dCompDens, - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const & wellElemPhaseDens, - arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > const & dWellElemPhaseDens, - arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac, - arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > const & dWellElemPhaseCompFrac, - arrayView2d< real64 const, compflow::USD_PHASE > const & wellElemPhaseVolFrac_n, - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const & wellElemPhaseDens_n, - arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const & wellElemPhaseCompFrac_n, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ); - -}; - /******************************** VolumeBalanceKernel ********************************/ struct VolumeBalanceKernel @@ -531,8 +360,7 @@ class TotalMassDensityKernel : public isothermalCompositionalMultiphaseBaseKerne m_phaseMassDens( fluid.phaseMassDensity() ), m_dPhaseMassDens( fluid.dPhaseMassDensity() ), m_totalMassDens( subRegion.getField< fields::well::totalMassDensity >() ), - m_dTotalMassDens_dPres( subRegion.getField< fields::well::dTotalMassDensity_dPressure >() ), - m_dTotalMassDens_dCompDens( subRegion.getField< fields::well::dTotalMassDensity_dGlobalCompDensity >() ) + m_dTotalMassDens( subRegion.getField< fields::well::dTotalMassDensity >() ) {} /** @@ -555,31 +383,31 @@ class TotalMassDensityKernel : public isothermalCompositionalMultiphaseBaseKerne arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseMassDens = m_phaseMassDens[ei][0]; arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseMassDens = m_dPhaseMassDens[ei][0]; real64 & totalMassDens = m_totalMassDens[ei]; - real64 & dTotalMassDens_dPres = m_dTotalMassDens_dPres[ei]; - arraySlice1d< real64, compflow::USD_FLUID_DC - 1 > dTotalMassDens_dCompDens = m_dTotalMassDens_dCompDens[ei]; + arraySlice1d< real64, compflow::USD_FLUID_DC - 1 > dTotalMassDens = m_dTotalMassDens[ei]; real64 dMassDens_dC[numComp]{}; totalMassDens = 0.0; - dTotalMassDens_dPres = 0.0; + + dTotalMassDens[Deriv::dP]=0.0; for( integer ic = 0; ic < numComp; ++ic ) { - dTotalMassDens_dCompDens[ic] = 0.0; + dTotalMassDens[Deriv::dC+ic]=0.0; } for( integer ip = 0; ip < numPhase; ++ip ) { totalMassDens += phaseVolFrac[ip] * phaseMassDens[ip]; - dTotalMassDens_dPres += dPhaseVolFrac[ip][Deriv::dP] * phaseMassDens[ip] + phaseVolFrac[ip] * dPhaseMassDens[ip][Deriv::dP]; + dTotalMassDens[Deriv::dP] += dPhaseVolFrac[ip][Deriv::dP] * phaseMassDens[ip] + phaseVolFrac[ip] * dPhaseMassDens[ip][Deriv::dP]; applyChainRule( numComp, dCompFrac_dCompDens, dPhaseMassDens[ip], dMassDens_dC, Deriv::dC ); for( integer ic = 0; ic < numComp; ++ic ) { - dTotalMassDens_dCompDens[ic] += dPhaseVolFrac[ip][Deriv::dC+ic] * phaseMassDens[ip] + dTotalMassDens[Deriv::dC+ic] += dPhaseVolFrac[ip][Deriv::dC+ic] * phaseMassDens[ip] + phaseVolFrac[ip] * dMassDens_dC[ic]; } - totalMassDensityKernelOp( ip, totalMassDens, dTotalMassDens_dPres, dTotalMassDens_dCompDens ); + totalMassDensityKernelOp( ip ); //, phaseVolFrac, dTotalMassDens_dPres, dTotalMassDens_dCompDens ); } } @@ -601,8 +429,8 @@ class TotalMassDensityKernel : public isothermalCompositionalMultiphaseBaseKerne /// Views on total mass densities arrayView1d< real64 > m_totalMassDens; - arrayView1d< real64 > m_dTotalMassDens_dPres; - arrayView2d< real64, compflow::USD_FLUID_DC > m_dTotalMassDens_dCompDens; + arrayView2d< real64, compflow::USD_FLUID_DC > m_dTotalMassDens; + }; @@ -772,7 +600,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > normalizer = LvArray::math::max( normalizer, m_volume[iwelem] * m_totalDens_n[iwelem][0] ); } // Step 3: compute a normalizer for the volume balance equations - else + else if( idof == ROFFSET::MASSBAL + m_numComp ) { if( m_isProducer ) // only PHASEVOLRATE is supported for now { @@ -792,10 +620,10 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > } - // to make sure that everything still works well if the rate is zero, we add this check - normalizer = LvArray::math::max( normalizer, m_volume[iwelem] ); } - normalizer = LvArray::math::max( m_minNormalizer, normalizer ); + + // to make sure that everything still works well if the rate is zero, we add this check + normalizer = LvArray::math::max( normalizer, m_volume[iwelem] ); // Step 4: compute the contribution to the residual real64 const val = LvArray::math::abs( m_localResidual[stack.localRow + idof] ) / normalizer; @@ -980,19 +808,21 @@ class SolutionCheckKernelFactory createAndLaunch( integer const allowCompDensChopping, CompositionalMultiphaseFVM::ScalingType const scalingType, real64 const scalingFactor, + arrayView1d< real64 const > const pressure, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, globalIndex const rankOffset, integer const numComp, string const dofKey, ElementSubRegionBase & subRegion, arrayView1d< real64 const > const localSolution ) { - arrayView1d< real64 const > const pressure = subRegion.getField< fields::well::pressure >(); - arrayView2d< real64 const, compflow::USD_COMP > const compDens = subRegion.getField< fields::well::globalCompDensity >(); - arrayView1d< real64 > pressureScalingFactor = subRegion.getField< fields::well::pressureScalingFactor >(); - arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::well::globalCompDensityScalingFactor >(); + isothermalCompositionalMultiphaseBaseKernels:: - SolutionCheckKernel kernel( allowCompDensChopping, 0, scalingType, scalingFactor, rankOffset, // no negative pressure - numComp, dofKey, subRegion, localSolution, pressure, compDens, pressureScalingFactor, compDensScalingFactor ); + SolutionCheckKernel kernel( allowCompDensChopping, 0, scalingType, scalingFactor, + pressure, compDens, pressureScalingFactor, compDensScalingFactor, rankOffset, + numComp, dofKey, subRegion, localSolution ); return isothermalCompositionalMultiphaseBaseKernels:: SolutionCheckKernel:: launch< POLICY >( subRegion.size(), kernel ); @@ -1000,7 +830,1086 @@ class SolutionCheckKernelFactory }; +/******************************** ElementBasedAssemblyKernel ********************************/ + +/** + * @class ElementBasedAssemblyKernel + * @tparam NUM_COMP number of fluid components + * @tparam IS_THERMAL thermal switch + * @brief Define the interface for the assembly kernel in charge of accumulation and volume balance + */ +template< integer NUM_COMP, integer IS_THERMAL > +class ElementBasedAssemblyKernel +{ +public: + using COFFSET = compositionalMultiphaseWellKernels::ColOffset; + using ROFFSET = compositionalMultiphaseWellKernels::RowOffset; + + // Well jacobian column and row indicies + // tjb - change NUM_DOF to IS_THERMAL + using FLUID_PROP_COFFSET = constitutive::multifluid::DerivativeOffsetC< NUM_COMP, IS_THERMAL >; + using WJ_COFFSET = compositionalMultiphaseWellKernels::ColOffset_WellJac< NUM_COMP, IS_THERMAL >; + using WJ_ROFFSET = compositionalMultiphaseWellKernels::RowOffset_WellJac< NUM_COMP, IS_THERMAL >; + /// Compile time value for the number of components + static constexpr integer numComp = NUM_COMP; + + /// Number of Dof's set in this kernal - no dQ in accum + static constexpr integer numDof = NUM_COMP + 1 + IS_THERMAL; + + /// Compute time value for the number of equations mass bal + vol bal + energy bal + static constexpr integer numEqn = NUM_COMP + 1 + IS_THERMAL; + + + /** + * @brief Constructor + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + ElementBasedAssemblyKernel( localIndex const numPhases, + integer const isProducer, + globalIndex const rankOffset, + string const dofKey, + WellElementSubRegion const & subRegion, + constitutive::MultiFluidBase const & fluid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > const kernelFlags ) + : m_numPhases( numPhases ), + m_isProducer( isProducer ), + m_rankOffset( rankOffset ), + m_iwelemControl( subRegion.getTopWellElementIndex() ), + m_dofNumber( subRegion.getReference< array1d< globalIndex > >( dofKey ) ), + m_elemGhostRank( subRegion.ghostRank() ), + m_volume( subRegion.getElementVolume() ), + m_dCompFrac_dCompDens( subRegion.getField< fields::flow::dGlobalCompFraction_dGlobalCompDensity >() ), + m_phaseVolFrac_n( subRegion.getField< fields::flow::phaseVolumeFraction_n >() ), + m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), + m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), + m_phaseDens_n( fluid.phaseDensity_n() ), + m_phaseDens( fluid.phaseDensity() ), + m_dPhaseDens( fluid.dPhaseDensity() ), + m_phaseCompFrac_n( fluid.phaseCompFraction_n() ), + m_phaseCompFrac( fluid.phaseCompFraction() ), + m_dPhaseCompFrac( fluid.dPhaseCompFraction() ), + m_compDens( subRegion.getField< fields::flow::globalCompDensity >() ), + m_compDens_n( subRegion.getField< fields::flow::globalCompDensity_n >() ), + m_localMatrix( localMatrix ), + m_localRhs( localRhs ), + m_kernelFlags( kernelFlags ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables + { +public: + + // volume information (used by both accumulation and volume balance) + real64 volume = 0.0; + + // Residual information + + /// Index of the local row corresponding to this element + localIndex localRow = -1; + + /// Indices of the matrix rows/columns corresponding to the dofs in this element + globalIndex dofIndices[numDof]{}; // NC compdens + P + thermal + globalIndex eqnRowIndices[numDof]{}; + globalIndex dofColIndices[numDof]{}; + + /// C-array storage for the element local residual vector (all equations except constraint and momentum) + real64 localResidual[numEqn]{}; + + /// C-array storage for the element local Jacobian matrix (all equations except constraint and momentum) + real64 localJacobian[numEqn][numDof]{}; + + }; + + /** + * @brief Getter for the ghost rank of an element + * @param[in] ei the element index + * @return the ghost rank of the element + */ + GEOS_HOST_DEVICE + integer elemGhostRank( localIndex const ei ) const + { return m_elemGhostRank( ei ); } + + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] ei the element index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + void setup( localIndex const ei, + StackVariables & stack ) const + { + // initialize the volume + stack.volume = m_volume[ei]; + + // Note row/col indices needed to be consistent with layout of stack.localJacobian + // Setup row equation indices for this element ( mass + vol + thermal if valid) + + // 1) Mass Balance + for( integer ic = 0; ic < numComp; ++ic ) + { + stack.eqnRowIndices[ic] = m_dofNumber[ei] + WJ_ROFFSET::MASSBAL + ic - m_rankOffset; + } +// 2) Volume Balance + stack.eqnRowIndices[numComp] = m_dofNumber[ei] + WJ_ROFFSET::VOLBAL - m_rankOffset; + // 3) Energy Balance + if constexpr ( IS_THERMAL ) + { + stack.eqnRowIndices[numComp+1] = m_dofNumber[ei] + WJ_ROFFSET::ENERGYBAL - m_rankOffset; + } + // Setup equation column indices for this element ( P + COMPDENS + THERMAL if valid) + stack.dofColIndices[0] = m_dofNumber[ei] + WJ_COFFSET::dP; + for( integer ic = 0; ic < numComp; ++ic ) + { + stack.dofColIndices[ic+1] = m_dofNumber[ei] + WJ_COFFSET::dC+ic; + } + if constexpr ( IS_THERMAL ) + { + stack.dofColIndices[numComp+1] = m_dofNumber[ei] + WJ_COFFSET::dT; + } + if( 1 ) + for( integer jc = 0; jc < numEqn; ++jc ) + { + stack.localResidual[jc] = 0.0; + for( integer ic = 0; ic < numDof; ++ic ) + { + stack.localJacobian[jc][ic] = 0.0; + } + + } + + } + + /** + * @brief Compute the local accumulation contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + * @param[in] phaseAmountKernelOp the function used to customize the kernel + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void computeAccumulation( localIndex const ei, + StackVariables & stack, + FUNC && phaseAmountKernelOp = NoOpFunc{} ) const + { + + using Deriv = constitutive::multifluid::DerivativeOffset; + + // construct the slices for variables accessed multiple times + arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; + + arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac_n = m_phaseVolFrac_n[ei]; + arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; + arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; + + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseDens_n = m_phaseDens_n[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseDens = m_phaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; + + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > phaseCompFrac_n = m_phaseCompFrac_n[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; + arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; + + // temporary work arrays + real64 dPhaseAmount[FLUID_PROP_COFFSET::nDer]{}; + real64 dPhaseAmount_dC[numComp]{}; + real64 dPhaseCompFrac_dC[numComp]{}; + + // sum contributions to component accumulation from each phase + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + real64 const phaseAmount = stack.volume * phaseVolFrac[ip] * phaseDens[ip]; + real64 const phaseAmount_n = stack.volume * phaseVolFrac_n[ip] * phaseDens_n[ip]; + //remove tjb + real64 const dPhaseAmount_dP = stack.volume * ( dPhaseVolFrac[ip][Deriv::dP] * phaseDens[ip] + + phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dP] ); + dPhaseAmount[FLUID_PROP_COFFSET::dP]=stack.volume * ( dPhaseVolFrac[ip][Deriv::dP] * phaseDens[ip] + + phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dP] ); + + // assemble density dependence + applyChainRule( numComp, dCompFrac_dCompDens, dPhaseDens[ip], dPhaseAmount_dC, Deriv::dC ); + applyChainRule( numComp, dCompFrac_dCompDens, dPhaseDens[ip], &dPhaseAmount[FLUID_PROP_COFFSET::dC], Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + dPhaseAmount_dC[jc] = dPhaseAmount_dC[jc] * phaseVolFrac[ip] + + phaseDens[ip] * dPhaseVolFrac[ip][Deriv::dC+jc]; + dPhaseAmount_dC[jc] *= stack.volume; + dPhaseAmount[FLUID_PROP_COFFSET::dC+jc] = dPhaseAmount[FLUID_PROP_COFFSET::dC+jc] * phaseVolFrac[ip] + + phaseDens[ip] * dPhaseVolFrac[ip][Deriv::dC+jc]; + dPhaseAmount[FLUID_PROP_COFFSET::dC+jc] *= stack.volume; + } +// tjb- remove when safe + for( integer ic = 0; ic < numComp; ic++ ) + { + assert( fabs( dPhaseAmount[FLUID_PROP_COFFSET::dC+ic] -dPhaseAmount_dC[ic] ) < FLT_EPSILON ); + + } + // ic - index of component whose conservation equation is assembled + // (i.e. row number in local matrix) + for( integer ic = 0; ic < numComp; ++ic ) + { + real64 const phaseCompAmount = phaseAmount * phaseCompFrac[ip][ic]; + real64 const phaseCompAmount_n = phaseAmount_n * phaseCompFrac_n[ip][ic]; + + real64 const dPhaseCompAmount_dP = dPhaseAmount_dP * phaseCompFrac[ip][ic] + + phaseAmount * dPhaseCompFrac[ip][ic][Deriv::dP]; + + stack.localResidual[ic] += phaseCompAmount - phaseCompAmount_n; + stack.localJacobian[ic][0] += dPhaseCompAmount_dP; + + // jc - index of component w.r.t. whose compositional var the derivative is being taken + // (i.e. col number in local matrix) + + // assemble phase composition dependence + applyChainRule( numComp, dCompFrac_dCompDens, dPhaseCompFrac[ip][ic], dPhaseCompFrac_dC, Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + real64 const dPhaseCompAmount_dC = dPhaseCompFrac_dC[jc] * phaseAmount + + phaseCompFrac[ip][ic] * dPhaseAmount[FLUID_PROP_COFFSET::dC+jc]; + + stack.localJacobian[ic][jc + 1] += dPhaseCompAmount_dC; + } + } + if constexpr ( IS_THERMAL ) + { + dPhaseAmount[FLUID_PROP_COFFSET::dT] = stack.volume * (dPhaseVolFrac[ip][Deriv::dT] * phaseDens[ip] + phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dT] ); + for( integer ic = 0; ic < numComp; ++ic ) + { + // assemble the derivatives of the component mass balance equations with respect to temperature + stack.localJacobian[ic][numComp+1] += dPhaseAmount[FLUID_PROP_COFFSET::dT] * phaseCompFrac[ip][ic] + + phaseAmount * dPhaseCompFrac[ip][ic][Deriv::dT]; + } + } + // call the lambda in the phase loop to allow the reuse of the phase amounts and their derivatives + // possible use: assemble accumulation term of the energy equation for this phase + phaseAmountKernelOp( ip, phaseAmount, phaseAmount_n, dPhaseAmount ); + + } + + // check zero diagonal (works only in debug) + /* + for( integer ic = 0; ic < numComp; ++ic ) + { + GEOS_ASSERT_MSG ( LvArray::math::abs( stack.localJacobian[ic][ic] ) > minDensForDivision, + GEOS_FMT( "Zero diagonal in Jacobian: equation {}, value = {}", ic, stack.localJacobian[ic][ic] ) ); + } + */ + } + + + /** + * @brief Compute the local volume balance contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + * @param[in] phaseVolFractionSumKernelOp the function used to customize the kernel + */ + + GEOS_HOST_DEVICE + void computeVolumeBalance( localIndex const ei, + StackVariables & stack ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; + arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; + + real64 oneMinusPhaseVolFracSum = 1.0; + + // sum contributions to component accumulation from each phase +// Note localJacobian stores equation balances in order of component/vol/enerqy + // These are mapped to solver orderings with indicies setup in stack variables + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + oneMinusPhaseVolFracSum -= phaseVolFrac[ip]; + stack.localJacobian[numComp][0] -= dPhaseVolFrac[ip][Deriv::dP]; + + for( integer jc = 0; jc < numComp; ++jc ) + { + stack.localJacobian[numComp][jc+1] -= dPhaseVolFrac[ip][Deriv::dC+jc]; + } + if constexpr ( IS_THERMAL) + { + stack.localJacobian[numComp][numComp+1] -= dPhaseVolFrac[ip][Deriv::dT]; + } + + } + // scale saturation-based volume balance by pore volume (for better scaling w.r.t. other equations) + stack.localResidual[numComp] = stack.volume * oneMinusPhaseVolFracSum; + for( integer idof = 0; idof < numComp+1+IS_THERMAL; ++idof ) + { + stack.localJacobian[numComp][idof] *= stack.volume; + } + + } + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void complete( localIndex const ei, //GEOS_UNUSED_PARAM( ei ), + StackVariables & stack ) const + { + using namespace compositionalMultiphaseUtilities; + + integer const numRows = numComp+1+ IS_THERMAL; + + if constexpr ( IS_THERMAL) + { + if( ei == m_iwelemControl && !m_isProducer ) + { + // For top segment energy balance eqn replaced with T(n+1) - T = 0 + // No other energy balance derivatives + // Assumption is global index == 0 is top segment with fixed temp BC + + for( integer i=0; i < numComp+1+IS_THERMAL; i++ ) + { + stack.localJacobian[numRows-1][i] = 0.0; + } + // constant Temperature + for( integer i=0; i < numComp+1+IS_THERMAL; i++ ) + stack.localJacobian[i][numRows-1] = 0.0; + stack.localJacobian[numRows-1][numRows-1] = 1.0; + + stack.localResidual[numRows-1]=0.0; + } + } + + if( m_kernelFlags.isSet( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ) ) + { + // apply equation/variable change transformation to the component mass balance equations + real64 work[numComp + 1 + IS_THERMAL]{}; + shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComp, numComp+1+ IS_THERMAL, stack.localJacobian, work ); + shiftElementsAheadByOneAndReplaceFirstElementWithSum( numComp, stack.localResidual ); + } + + // add contribution to residual and jacobian into: + // - the component mass balance equations (i = 0 to i = numComp-1) + // - the volume balance equations (i = numComp) + // note that numDof includes derivatives wrt temperature if this class is derived in ThermalKernels + + for( integer i = 0; i < numRows; ++i ) + { + m_localRhs[stack.eqnRowIndices[i]] += stack.localResidual[i]; + m_localMatrix.addToRow< serialAtomic >( stack.eqnRowIndices[i], + stack.dofColIndices, + stack.localJacobian[i], + numComp+1+ IS_THERMAL ); + } + + } + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElems the number of elements + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + + forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( kernelComponent.elemGhostRank( ei ) >= 0 ) + { + return; + } + + typename KERNEL_TYPE::StackVariables stack; + + kernelComponent.setup( ei, stack ); + kernelComponent.computeAccumulation( ei, stack ); + kernelComponent.computeVolumeBalance( ei, stack ); + kernelComponent.complete( ei, stack ); + } ); + } + +protected: + + /// Number of fluid phases + integer const m_numPhases; + + /// Well type + integer const m_isProducer; + + /// Offset for my MPI rank + globalIndex const m_rankOffset; + + /// Index of the element where the control is enforced + localIndex const m_iwelemControl; + + /// View on the dof numbers + arrayView1d< globalIndex const > const m_dofNumber; + + /// View on the ghost ranks + arrayView1d< integer const > const m_elemGhostRank; + + /// View on the element volumes + arrayView1d< real64 const > const m_volume; + + /// Views on the porosity + arrayView2d< real64 const > const m_porosity_n; + arrayView2d< real64 const > const m_porosity; + arrayView2d< real64 const > const m_dPoro_dPres; + + /// Views on the derivatives of comp fractions wrt component density + arrayView3d< real64 const, compflow::USD_COMP_DC > const m_dCompFrac_dCompDens; + + /// Views on the phase volume fractions + arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFrac_n; + arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFrac; + arrayView3d< real64 const, compflow::USD_PHASE_DC > const m_dPhaseVolFrac; + + /// Views on the phase densities + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseDens_n; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseDens; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > const m_dPhaseDens; + + /// Views on the phase component fraction + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const m_phaseCompFrac_n; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const m_phaseCompFrac; + arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > const m_dPhaseCompFrac; + + // Views on component densities + arrayView2d< real64 const, compflow::USD_COMP > m_compDens; + arrayView2d< real64 const, compflow::USD_COMP > m_compDens_n; + + /// View on the local CRS matrix + CRSMatrixView< real64, globalIndex const > const m_localMatrix; + /// View on the local RHS + arrayView1d< real64 > const m_localRhs; + + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > const m_kernelFlags; +}; + + +/** + * @class ElementBasedAssemblyKernelFactory + */ +class ElementBasedAssemblyKernelFactory +{ +public: + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComps the number of fluid components + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( localIndex const numComps, + localIndex const numPhases, + integer const isProducer, + globalIndex const rankOffset, + integer const useTotalMassEquation, + string const dofKey, + WellElementSubRegion const & subRegion, + constitutive::MultiFluidBase const & fluid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + geos::internal::kernelLaunchSelectorCompThermSwitch( numComps, 0, [&]( auto NC, auto IS_THERMAL ) + { + localIndex constexpr NUM_COMP = NC(); + + integer constexpr istherm = IS_THERMAL(); + + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + + ElementBasedAssemblyKernel< NUM_COMP, istherm > + kernel( numPhases, isProducer, rankOffset, dofKey, subRegion, fluid, localMatrix, localRhs, kernelFlags ); + ElementBasedAssemblyKernel< NUM_COMP, istherm >::template + launch< POLICY, ElementBasedAssemblyKernel< NUM_COMP, istherm > >( subRegion.size(), kernel ); + } ); + } +}; +/** + * @class FaceBasedAssemblyKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_DOF number of degrees of freedom + * @brief Define the interface for the assembly kernel in charge of flux terms + */ + + +template< integer NC, integer IS_THERMAL > +class FaceBasedAssemblyKernel +{ +public: + + using COFFSET = compositionalMultiphaseWellKernels::ColOffset; + using ROFFSET = compositionalMultiphaseWellKernels::RowOffset; + using TAG = compositionalMultiphaseWellKernels::ElemTag; + + using FLUID_PROP_COFFSET = constitutive::multifluid::DerivativeOffsetC< NC, IS_THERMAL >; + using WJ_COFFSET = compositionalMultiphaseWellKernels::ColOffset_WellJac< NC, IS_THERMAL >; + using WJ_ROFFSET = compositionalMultiphaseWellKernels::RowOffset_WellJac< NC, IS_THERMAL >; + + using CP_Deriv = constitutive::multifluid::DerivativeOffsetC< NC, IS_THERMAL >; + /// Compile time value for the number of components + static constexpr integer numComp = NC; + + /// Number of Dof's set in this kernal + static constexpr integer numDof = WJ_COFFSET::nDer; + + /// Compile time value for the number of equations except rate, momentum, energy + static constexpr integer numEqn = NC; + + static constexpr integer maxNumElems = 2; + static constexpr integer maxStencilSize = 2; + /** + * @brief Constructor for the kernel interface + * @param[in] rankOffset the offset of my MPI rank + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dofNumberAccessor + * @param[in] compFlowAccessors + * @param[in] multiFluidAccessors + * @param[in] capPressureAccessors + * @param[in] permeabilityAccessors + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + * @param[in] kernelFlags flags packed together + */ + FaceBasedAssemblyKernel( real64 const dt, + globalIndex const rankOffset, + string const wellDofKey, + WellControls const & wellControls, + WellElementSubRegion const & subRegion, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags ) + : + m_dt( dt ), + m_rankOffset( rankOffset ), + m_wellElemDofNumber ( subRegion.getReference< array1d< globalIndex > >( wellDofKey ) ), + m_nextWellElemIndex ( subRegion.getReference< array1d< localIndex > >( WellElementSubRegion::viewKeyStruct::nextWellElementIndexString()) ), + m_connRate ( subRegion.getField< fields::well::mixtureConnectionRate >() ), + m_wellElemCompFrac ( subRegion.getField< fields::well::globalCompFraction >() ), + m_dWellElemCompFrac_dCompDens ( subRegion.getField< fields::well::dGlobalCompFraction_dGlobalCompDensity >() ), + m_localMatrix( localMatrix ), + m_localRhs ( localRhs ), + m_useTotalMassEquation ( kernelFlags.isSet( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ) ), + m_isProducer ( wellControls.isProducer() ), + m_injection ( wellControls.getInjectionStream() ) + {} + + struct StackVariables + { +public: + + /** + * @brief Constructor for the stack variables + * @param[in] size size of the stencil for this connection + * @param[in] numElems number of elements for this connection + */ + GEOS_HOST_DEVICE + StackVariables( localIndex const size ) + : stencilSize( size ), + numConnectedElems( 2 ), + dofColIndices( size * numDof ) + {} + + // Stencil information + localIndex const stencilSize; + /// Number of elements connected at a given connection + localIndex numConnectedElems; + + + // edge indexes + localIndex iwelemUp; + localIndex iwelemNext; + localIndex iwelemCurrent; + globalIndex offsetUp; + globalIndex offsetCurrent; + globalIndex offsetNext; + // Local degrees of freedom and local residual/jacobian + + /// Indices of the matrix rows/columns corresponding to the dofs in this face + stackArray1d< globalIndex, maxNumElems * numDof > dofColIndices; + + /// Storage for the face local residual vector (all mass bal equations) + stackArray1d< real64, maxNumElems * numEqn > localFlux; + /// Storage for the face local Jacobian matrix dC dP dT + stackArray2d< real64, maxNumElems * numEqn * maxStencilSize * CP_Deriv::nDer > localFluxJacobian; + /// Storage for the face local Jacobian matrix dQ only + stackArray2d< real64, maxNumElems * numEqn * maxStencilSize > localFluxJacobian_dQ; + }; + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] iconn the connection index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const iconn, + StackVariables & stack ) const + { + stack.numConnectedElems=2; + if( m_nextWellElemIndex[iconn] <0 ) + { + stack.numConnectedElems = 1; + } + stack.localFlux.resize( stack.numConnectedElems*numEqn ); + stack.localFluxJacobian.resize( stack.numConnectedElems * numEqn, stack.stencilSize * numDof ); + stack.localFluxJacobian_dQ.resize( stack.numConnectedElems * numEqn, 1 ); + + } + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] iconn the connection index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + inline + void complete( localIndex const iconn, + StackVariables & stack ) const + { + GEOS_UNUSED_VAR( iconn ); + using namespace compositionalMultiphaseUtilities; + if( stack.numConnectedElems ==1 ) + { + // Setup Jacobian global row indicies + // equations for COMPONENT + ENERGY balances + globalIndex oneSidedEqnRowIndices[numEqn]{}; + for( integer ic = 0; ic < NC; ++ic ) + { + oneSidedEqnRowIndices[ic] = stack.offsetUp + WJ_ROFFSET::MASSBAL + ic - m_rankOffset; + } + + // Setup Jacobian global col indicies ( Mapping from local jac order to well jac order) + globalIndex oneSidedDofColIndices_dPresCompTempUp[CP_Deriv::nDer]{}; + globalIndex oneSidedDofColIndices_dRate = stack.offsetCurrent + WJ_COFFSET::dQ; + // Note localFluxJacobian cols are stored using CP_Deriv order (dP dC or dP dT dC) + int ioff=0; + oneSidedDofColIndices_dPresCompTempUp[ioff++] = stack.offsetUp + WJ_COFFSET::dP; + + if constexpr ( IS_THERMAL ) + { + oneSidedDofColIndices_dPresCompTempUp[ioff++] = stack.offsetUp + WJ_COFFSET::dT; + } + for( integer jdof = 0; jdof < NC; ++jdof ) + { + oneSidedDofColIndices_dPresCompTempUp[ioff++] = stack.offsetUp + WJ_COFFSET::dC+ jdof; + } + if( m_useTotalMassEquation > 0 ) + { + // Apply equation/variable change transformation(s) + real64 work[CP_Deriv::nDer]{}; + shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( numEqn, 1, stack.localFluxJacobian_dQ, work ); + shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( numEqn, CP_Deriv::nDer, stack.localFluxJacobian, work ); + shiftElementsAheadByOneAndReplaceFirstElementWithSum( numEqn, stack.localFlux ); + } + for( integer i = 0; i < numEqn; ++i ) + { + if( oneSidedEqnRowIndices[i] >= 0 && oneSidedEqnRowIndices[i] < m_localMatrix.numRows() ) + { + m_localMatrix.addToRow< parallelDeviceAtomic >( oneSidedEqnRowIndices[i], + &oneSidedDofColIndices_dRate, + stack.localFluxJacobian_dQ[i], + 1 ); + m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic >( oneSidedEqnRowIndices[i], + oneSidedDofColIndices_dPresCompTempUp, + stack.localFluxJacobian[i], + CP_Deriv::nDer ); + RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[oneSidedEqnRowIndices[i]], stack.localFlux[i] ); + } + } + } + else + { + // Setup Jacobian global row indicies + // equations for COMPONENT + ENERGY balances + globalIndex eqnRowIndices[2*numEqn]{}; + + for( integer ic = 0; ic < NC; ++ic ) + { + // mass balance equations for all components + eqnRowIndices[TAG::NEXT *numEqn+ic] = stack.offsetNext + WJ_ROFFSET::MASSBAL + ic - m_rankOffset; + eqnRowIndices[TAG::CURRENT *numEqn+ic] = stack.offsetCurrent + WJ_ROFFSET::MASSBAL + ic - m_rankOffset; + } + + // Setup Jacobian global col indicies ( Mapping from local jac order to well jac order) + globalIndex dofColIndices_dPresCompUp[CP_Deriv::nDer]{}; + globalIndex dofColIndices_dRate = stack.offsetCurrent + WJ_COFFSET::dQ; + + int ioff=0; + // Indice storage order reflects local jac col storage order CP::Deriv order P T DENS + dofColIndices_dPresCompUp[ioff++] = stack.offsetUp + WJ_COFFSET::dP; + + if constexpr ( IS_THERMAL ) + { + dofColIndices_dPresCompUp[ioff++] = stack.offsetUp + WJ_COFFSET::dT; + } + for( integer jdof = 0; jdof < NC; ++jdof ) + { + dofColIndices_dPresCompUp[ioff++] = stack.offsetUp + WJ_COFFSET::dC+ jdof; + } + + + if( m_useTotalMassEquation > 0 ) + { + // Apply equation/variable change transformation(s) + real64 work[CP_Deriv::nDer]{}; + shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( numEqn, numEqn, 1, 2, stack.localFluxJacobian_dQ, work ); + shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( numEqn, numEqn, CP_Deriv::nDer, 2, stack.localFluxJacobian, work ); + shiftBlockElementsAheadByOneAndReplaceFirstElementWithSum( numEqn, numEqn, 2, stack.localFlux ); + } + // Note this updates diag and offdiag + for( integer i = 0; i < 2*NC; ++i ) + { + if( eqnRowIndices[i] >= 0 && eqnRowIndices[i] < m_localMatrix.numRows() ) + { + m_localMatrix.addToRow< parallelDeviceAtomic >( eqnRowIndices[i], + &dofColIndices_dRate, + stack.localFluxJacobian_dQ[i], + 1 ); + m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic >( eqnRowIndices[i], + dofColIndices_dPresCompUp, + stack.localFluxJacobian[i], + CP_Deriv::nDer ); + RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[eqnRowIndices[i]], stack.localFlux[i] ); + + } + } + } + } + + GEOS_HOST_DEVICE + inline + void + computeExit( real64 const & dt, + real64 const ( &compFlux )[NC ], + StackVariables & stack, + real64 ( & dCompFlux)[NC][numDof] ) const + { + for( integer ic = 0; ic < NC; ++ic ) + { + stack.localFlux[ic] = -dt * compFlux[ic]; + // derivative with respect to rate + stack.localFluxJacobian_dQ[ic][0] = -dt * dCompFlux[ic][WJ_COFFSET::dQ]; + // derivative with respect to upstream pressure + stack.localFluxJacobian[ic][CP_Deriv::dP] = -dt * dCompFlux[ic][WJ_COFFSET::dP]; + // derivatives with respect to upstream component densities + for( integer jdof = 0; jdof < NC; ++jdof ) + { + stack.localFluxJacobian[ic][CP_Deriv::dC+jdof] = -dt * dCompFlux[ic][WJ_COFFSET::dC+jdof]; + } + if constexpr ( IS_THERMAL ) + { + stack.localFluxJacobian[ic][CP_Deriv::dT] = -dt * dCompFlux[ic][WJ_COFFSET::dT]; + } + } + } + + GEOS_HOST_DEVICE + inline + void + compute( real64 const & dt, + real64 const ( &compFlux )[NC ], + StackVariables & stack, + real64 ( & dCompFlux)[(NC )][numDof] ) const + { + // flux terms + for( integer ic = 0; ic < NC; ++ic ) + { + stack.localFlux[TAG::NEXT * NC +ic] = dt * compFlux[ic]; + stack.localFlux[TAG::CURRENT * NC +ic] = -dt * compFlux[ic]; + // derivative with respect to rate + stack.localFluxJacobian_dQ[TAG::NEXT * NC+ ic][0] = dt * dCompFlux[ic][WJ_COFFSET::dQ]; + stack.localFluxJacobian_dQ[TAG::CURRENT * NC + +ic][0] = -dt * dCompFlux[ic][WJ_COFFSET::dQ]; + + // derivative with respect to upstream pressure + stack.localFluxJacobian[TAG::NEXT * NC +ic][CP_Deriv::dP] = dt * dCompFlux[ic][WJ_COFFSET::dP]; + stack.localFluxJacobian[TAG::CURRENT * NC+ ic][CP_Deriv::dP] = -dt * dCompFlux[ic][WJ_COFFSET::dP]; + + if constexpr ( IS_THERMAL ) + { + stack.localFluxJacobian[TAG::NEXT * NC +ic][CP_Deriv::dT] = dt * dCompFlux[ic][WJ_COFFSET::dT]; + stack.localFluxJacobian[TAG::CURRENT * NC +ic][CP_Deriv::dT] = -dt * dCompFlux[ic][WJ_COFFSET::dT]; + } + + // derivatives with respect to upstream component densities + for( integer jdof = 0; jdof < NC; ++jdof ) + { + stack.localFluxJacobian[TAG::NEXT * NC +ic][CP_Deriv::dC+jdof] = dt * dCompFlux[ic][WJ_COFFSET::dC+jdof]; + stack.localFluxJacobian[TAG::CURRENT * NC +ic][CP_Deriv::dC+jdof] = -dt * dCompFlux[ic][WJ_COFFSET::dC+jdof]; + } + } + } + + /** + * @brief Compute the local flux contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes + * @param[in] ie the element index + * @param[inout] stack the stack variables + * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + inline + void computeFlux( localIndex const iwelem, + StackVariables & stack, + FUNC && compFluxKernelOp = NoOpFunc{} ) const + { + + using namespace compositionalMultiphaseUtilities; + + // create local work arrays + real64 compFracUp[NC]{}; + real64 compFlux[NC]{}; + real64 dComp[NC][NC]; + real64 dCompFlux[NC][numDof]{}; + for( integer ic = 0; ic < NC; ++ic ) + { + for( integer jc = 0; jc < NC; ++jc ) + { + dComp[ic][jc]=0.0; + } + } + // Step 1) decide the upwind well element + + /* currentConnRate < 0 flow from iwelem to iwelemNext + * currentConnRate > 0 flow from iwelemNext to iwelem + * With this convention, currentConnRate < 0 at the last connection for a producer + * currentConnRate > 0 at the last connection for a injector + */ + + localIndex const iwelemNext = m_nextWellElemIndex[iwelem]; + real64 const currentConnRate = m_connRate[iwelem]; + localIndex iwelemUp = -1; + + if( iwelemNext < 0 && !m_isProducer ) // exit connection, injector + { + // we still need to define iwelemUp for Jacobian assembly + iwelemUp = iwelem; + + // just copy the injection stream into compFrac + for( integer ic = 0; ic < NC; ++ic ) + { + compFracUp[ic] = m_injection[ic]; + for( integer jc = 0; jc < NC; ++jc ) + { + dComp[ic][jc] = m_dWellElemCompFrac_dCompDens[iwelemUp][ic][jc]; + } + for( integer jc = 0; jc < NC; ++jc ) + { + dCompFlux[ic][WJ_COFFSET::dC+jc] = 0.0; + } + } + } + else + { + // first set iwelemUp to the upstream cell + if( ( iwelemNext < 0 && m_isProducer ) // exit connection, producer + || currentConnRate < 0 ) // not an exit connection, iwelem is upstream + { + iwelemUp = iwelem; + } + else // not an exit connection, iwelemNext is upstream + { + iwelemUp = iwelemNext; + } + + // copy the vars of iwelemUp into compFrac + for( integer ic = 0; ic < NC; ++ic ) + { + compFracUp[ic] = m_wellElemCompFrac[iwelemUp][ic]; + for( integer jc = 0; jc < NC; ++jc ) + { + dCompFlux[ic][WJ_COFFSET::dC+jc] = m_dWellElemCompFrac_dCompDens[iwelemUp][ic][jc]; + dComp[ic][jc] = m_dWellElemCompFrac_dCompDens[iwelemUp][ic][jc]; + } + } + } + + // Step 2) compute upstream transport coefficient + + for( integer ic = 0; ic < NC; ++ic ) + { + compFlux[ic] = compFracUp[ic] * currentConnRate; + dCompFlux[ic][WJ_COFFSET::dQ] = compFracUp[ic]; + // none of these quantities depend on pressure + dCompFlux[ic][WJ_COFFSET::dP] = 0.0; + if constexpr ( IS_THERMAL ) + { + dCompFlux[ic][WJ_COFFSET::dT] = 0.0; + } + for( integer jc = 0; jc < NC; ++jc ) + { + dCompFlux[ic][WJ_COFFSET::dC+jc] = dCompFlux[ic][WJ_COFFSET::dC+jc] * currentConnRate; + } + } + + stack.offsetUp = m_wellElemDofNumber[iwelemUp]; + stack.iwelemUp = iwelemUp; + stack.offsetCurrent = m_wellElemDofNumber[iwelem]; + stack.iwelemCurrent= iwelem; + + + if( iwelemNext < 0 ) // exit connection + { + // for this case, we only need NC mass conservation equations + computeExit ( m_dt, + compFlux, + stack, + dCompFlux ); + + } + else // not an exit connection + { + compute( m_dt, + compFlux, + stack, + dCompFlux + ); + stack.offsetNext = m_wellElemDofNumber[iwelemNext]; + } + stack.iwelemNext = iwelemNext; + compFluxKernelOp( iwelemNext, iwelemUp, currentConnRate, dComp ); + } + + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElements the number of elements + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numElements, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + forAll< POLICY >( numElements, [=] GEOS_HOST_DEVICE ( localIndex const ie ) + { + typename KERNEL_TYPE::StackVariables stack( 1 ); + + kernelComponent.setup( ie, stack ); + kernelComponent.computeFlux( ie, stack ); + kernelComponent.complete( ie, stack ); + } ); + } + +protected: + /// Time step size + real64 const m_dt; + /// Rank offset for calculating row/col Jacobian indices + integer const m_rankOffset; + + /// Reference to the degree-of-freedom numbers + arrayView1d< globalIndex const > const m_wellElemDofNumber; + /// Next element index, needed since iterating over element nodes, not edges + arrayView1d< localIndex const > const m_nextWellElemIndex; + + /// Connection rate + arrayView1d< real64 const > const m_connRate; + + + /// Element component fraction + arrayView2d< real64 const, compflow::USD_COMP > const m_wellElemCompFrac; + /// Element component fraction derivatives + arrayView3d< real64 const, compflow::USD_COMP_DC > const m_dWellElemCompFrac_dCompDens; + + /// View on the local CRS matrix + CRSMatrixView< real64, globalIndex const > const m_localMatrix; + /// View on the local RHS + arrayView1d< real64 > const m_localRhs; + + /// Kernel option flag + integer const m_useTotalMassEquation; + + /// Well type + bool const m_isProducer; + + /// Injection stream composition + arrayView1d< real64 const > const m_injection; + + +}; + +/** + * @class FaceBasedAssemblyKernelFactory + */ +class FaceBasedAssemblyKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComps the number of fluid components + * @param[in] dt time step size + * @param[in] rankOffset the offset of my MPI rank + * @param[in] useTotalMassEquation flag specifying whether to replace one component bal eqn with total mass eqn + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] wellControls object holding well control/constraint information + * @param[in] subregion well subregion + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComps, + real64 const dt, + globalIndex const rankOffset, + integer const useTotalMassEquation, + string const dofKey, + WellControls const & wellControls, + WellElementSubRegion const & subRegion, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) + { + integer constexpr NUM_COMP = NC(); + + + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + + using kernelType = FaceBasedAssemblyKernel< NUM_COMP, 0 >; + + + kernelType kernel( dt, rankOffset, dofKey, wellControls, subRegion, localMatrix, localRhs, kernelFlags ); + kernelType::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } +}; } // end namespace compositionalMultiphaseWellKernels } // end namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/PerforationFluxKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/PerforationFluxKernels.hpp new file mode 100644 index 00000000000..6c042f18d34 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/PerforationFluxKernels.hpp @@ -0,0 +1,879 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file PerforationFluxKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_PERFORATIONFLUXLKERNELS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_PERFORATIONFLUXLKERNELS_HPP + +#include "codingUtilities/Utilities.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" +#include "constitutive/relativePermeability/RelativePermeabilityBase.hpp" +#include "constitutive/relativePermeability/RelativePermeabilityFields.hpp" +#include "mesh/ElementRegionManager.hpp" +#include "mesh/ObjectManagerBase.hpp" +#include "physicsSolvers/KernelLaunchSelectors.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" +#include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/wells/WellTags.hpp" +#include "physicsSolvers/fluidFlow/wells/WellFields.hpp" + + +namespace geos +{ + +struct NoOpStuct +{ + NoOpStuct(){} +}; + +namespace isothermalPerforationFluxKernels +{ + + + +/******************************** PerforationFluxKernel ********************************/ + +template< integer NC, integer NP, integer IS_THERMAL > +class PerforationFluxKernel +{ +public: + /// Compile time value for the number of components + static constexpr integer numComp = NC; + + /// Compile time value for the number of phases + static constexpr integer numPhase = NP; + + /// Compile time value for thermal option + static constexpr integer isThermal = IS_THERMAL; + + using TAG = wellTags::SubRegionTag; + + using CompFlowAccessors = + StencilAccessors< fields::flow::pressure, + fields::flow::phaseVolumeFraction, + fields::flow::dPhaseVolumeFraction, + fields::flow::dGlobalCompFraction_dGlobalCompDensity >; + + using MultiFluidAccessors = + StencilMaterialAccessors< constitutive::MultiFluidBase, + fields::multifluid::phaseDensity, + fields::multifluid::dPhaseDensity, + fields::multifluid::phaseViscosity, + fields::multifluid::dPhaseViscosity, + fields::multifluid::phaseCompFraction, + fields::multifluid::dPhaseCompFraction >; + + using RelPermAccessors = + StencilMaterialAccessors< constitutive::RelativePermeabilityBase, + fields::relperm::phaseRelPerm, + fields::relperm::dPhaseRelPerm_dPhaseVolFraction >; + + + /** + * @brief The type for element-based non-constitutive data parameters. + * Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + PerforationFluxKernel ( PerforationData * const perforationData, + ElementSubRegionBase const & subRegion, + CompFlowAccessors const & compFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + RelPermAccessors const & relPermAccessors, + bool const disableReservoirToWellFlow ): + m_resPres( compFlowAccessors.get( fields::flow::pressure {} )), + m_resPhaseVolFrac( compFlowAccessors.get( fields::flow::phaseVolumeFraction {} )), + m_dResPhaseVolFrac( compFlowAccessors.get( fields::flow::dPhaseVolumeFraction {} )), + m_dResCompFrac_dCompDens( compFlowAccessors.get( fields::flow::dGlobalCompFraction_dGlobalCompDensity {} )), + m_resPhaseDens( multiFluidAccessors.get( fields::multifluid::phaseDensity {} )), + m_dResPhaseDens( multiFluidAccessors.get( fields::multifluid::dPhaseDensity {} )), + m_resPhaseVisc( multiFluidAccessors.get( fields::multifluid::phaseViscosity {} )), + m_dResPhaseVisc( multiFluidAccessors.get( fields::multifluid::dPhaseViscosity {} )), + m_resPhaseCompFrac( multiFluidAccessors.get( fields::multifluid::phaseCompFraction {} )), + m_dResPhaseCompFrac( multiFluidAccessors.get( fields::multifluid::dPhaseCompFraction {} )), + m_resPhaseRelPerm( relPermAccessors.get( fields::relperm::phaseRelPerm {} )), + m_dResPhaseRelPerm_dPhaseVolFrac( relPermAccessors.get( fields::relperm::dPhaseRelPerm_dPhaseVolFraction {} )), + m_wellElemGravCoef( subRegion.getField< fields::well::gravityCoefficient >()), + m_wellElemPres( subRegion.getField< fields::well::pressure >()), + m_wellElemCompDens( subRegion.getField< fields::well::globalCompDensity >()), + m_wellElemTotalMassDens( subRegion.getField< fields::well::totalMassDensity >()), + m_dWellElemTotalMassDens( subRegion.getField< fields::well::dTotalMassDensity >()), + m_wellElemCompFrac( subRegion.getField< fields::well::globalCompFraction >()), + m_dWellElemCompFrac_dCompDens( subRegion.getField< fields::well::dGlobalCompFraction_dGlobalCompDensity >()), + m_perfGravCoef( perforationData->getField< fields::well::gravityCoefficient >()), + m_perfWellElemIndex( perforationData->getField< fields::perforation::wellElementIndex >()), + m_perfTrans( perforationData->getField< fields::perforation::wellTransmissibility >()), + m_resElementRegion( perforationData->getField< fields::perforation::reservoirElementRegion >()), + m_resElementSubRegion( perforationData->getField< fields::perforation::reservoirElementSubRegion >()), + m_resElementIndex( perforationData->getField< fields::perforation::reservoirElementIndex >()), + m_compPerfRate( perforationData->getField< fields::well::compPerforationRate >()), + m_dCompPerfRate( perforationData->getField< fields::well::dCompPerforationRate >()), + m_disableReservoirToWellFlow( disableReservoirToWellFlow ) + {} + + struct StackVariables + { +public: + /** + * @brief Constructor for the stack variables + */ + + GEOS_HOST_DEVICE + StackVariables() {} + + }; + + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + inline + void + computeFlux( localIndex const iperf, FUNC && fluxKernelOp= NoOpFunc {} ) const + { + // get the index of the reservoir elem + localIndex const er = m_resElementRegion[iperf]; + localIndex const esr = m_resElementSubRegion[iperf]; + localIndex const ei = m_resElementIndex[iperf]; + + // get the index of the well elem + localIndex const iwelem = m_perfWellElemIndex[iperf]; + + using Deriv = constitutive::multifluid::DerivativeOffset; + using CP_Deriv = constitutive::multifluid::DerivativeOffsetC< NC, IS_THERMAL >; + + // local working variables and arrays + real64 pres[2]{}; + real64 multiplier[2]{}; + + // local working variables - compact + // All derivative quantiites generated are stored in arrays using CP_Deriv offsets + // The input well/reservoir quantites use the Deriv offsets + // The arrays using the deriv offsets have extra column for dT in isothermal cases + + real64 dPres[2][CP_Deriv::nDer]{}; + real64 dFlux[2][CP_Deriv::nDer]{}; + real64 dMob[CP_Deriv::nDer]{}; + real64 dPotDiff[2][CP_Deriv::nDer]{}; + real64 dCompFrac[CP_Deriv::nDer]{}; + + // Step 1: reset the perforation rates + for( integer ic = 0; ic < NC; ++ic ) + { + m_compPerfRate[iperf][ic] = 0.0; + for( integer ke = 0; ke < 2; ++ke ) + { + for( integer jc = 0; jc < CP_Deriv::nDer; ++jc ) + { + m_dCompPerfRate[iperf][ke][ic][jc] = 0.0; + } + } + } + + // Step 2: copy the variables from the reservoir and well element + + // a) get reservoir variables + + pres[TAG::RES] = m_resPres[er][esr][ei]; + dPres[TAG::RES][CP_Deriv::dP] = 1.0; + multiplier[TAG::RES] = 1.0; + + // Here in the absence of a buoyancy term we assume that the reservoir cell is perforated at its center + // TODO: add a buoyancy term for the reservoir side here + + + // b) get well variables + + pres[TAG::WELL] = m_wellElemPres[iwelem]; + dPres[TAG::WELL][CP_Deriv::dP] = 1.0; + multiplier[TAG::WELL] = -1.0; + + real64 const gravD = ( m_perfGravCoef[iperf] - m_wellElemGravCoef[iwelem] ); + + pres[TAG::WELL] += m_wellElemTotalMassDens[iwelem] * gravD; + // Note LHS uses CP_Deriv while RHS uses Deriv !!! + dPres[TAG::WELL][CP_Deriv::dP] += m_dWellElemTotalMassDens[iwelem][Deriv::dP] * gravD; + if constexpr ( IS_THERMAL ) + { + dPres[TAG::WELL][CP_Deriv::dT] += m_dWellElemTotalMassDens[iwelem][Deriv::dT] * gravD; + } + for( integer ic = 0; ic < NC; ++ic ) + { + dPres[TAG::WELL][CP_Deriv::dC+ic] += m_dWellElemTotalMassDens[iwelem][Deriv::dC+ic] * gravD; + } + + // Step 3: compute potential difference + + real64 potDiff = 0.0; + for( integer i = 0; i < 2; ++i ) + { + potDiff += multiplier[i] * m_perfTrans[iperf] * pres[i]; + // LHS & RHS both use CP_Deriv + for( integer ic = 0; ic < CP_Deriv::nDer; ++ic ) + { + dPotDiff[i][ic] += multiplier[i] * m_perfTrans[iperf] * dPres[i][ic]; + } + } + // Step 4: upwinding based on the flow direction + + real64 flux = 0.0; + if( potDiff >= 0 ) // ** reservoir cell is upstream ** + { + + // loop over phases, compute and upwind phase flux + // and sum contributions to each component's perforation rate + for( integer ip = 0; ip < NP; ++ip ) + { + // skip the rest of the calculation if the phase is absent + // or if crossflow is disabled for injectors + bool const phaseExists = (m_resPhaseVolFrac[er][esr][ei][ip] > 0); + if( !phaseExists || m_disableReservoirToWellFlow ) + { + continue; + } + + // here, we have to recompute the reservoir phase mobility (not including density) + + // density + real64 const resDens = m_resPhaseDens[er][esr][ei][0][ip]; + real64 dDens[CP_Deriv::nDer]{}; + + dDens[CP_Deriv::dP] = m_dResPhaseDens[er][esr][ei][0][ip][Deriv::dP]; + if constexpr ( IS_THERMAL ) + { + dDens[CP_Deriv::dT] = m_dResPhaseDens[er][esr][ei][0][ip][Deriv::dT]; + } + applyChainRule( NC, m_dResCompFrac_dCompDens[er][esr][ei], + m_dResPhaseDens[er][esr][ei][0][ip], + &dDens[CP_Deriv::dC], + Deriv::dC ); + // viscosity + real64 const resVisc = m_resPhaseVisc[er][esr][ei][0][ip]; + real64 dVisc[CP_Deriv::nDer]{}; + dVisc[CP_Deriv::dP] = m_dResPhaseVisc[er][esr][ei][0][ip][Deriv::dP]; + if constexpr ( IS_THERMAL ) + { + dVisc[CP_Deriv::dT] = m_dResPhaseVisc[er][esr][ei][0][ip][Deriv::dT]; + } + + applyChainRule( NC, m_dResCompFrac_dCompDens[er][esr][ei], + m_dResPhaseVisc[er][esr][ei][0][ip], + &dVisc[CP_Deriv::dC], + Deriv::dC ); + + // relative permeability + real64 const resRelPerm = m_resPhaseRelPerm[er][esr][ei][0][ip]; + real64 dRelPerm[CP_Deriv::nDer]{}; + for( integer jc = 0; jc < CP_Deriv::nDer; ++jc ) + { + dRelPerm[jc]=0; + } + for( integer jp = 0; jp < NP; ++jp ) + { + real64 const dResRelPerm_dS = m_dResPhaseRelPerm_dPhaseVolFrac[er][esr][ei][0][ip][jp]; + dRelPerm[CP_Deriv::dP] += dResRelPerm_dS * m_dResPhaseVolFrac[er][esr][ei][jp][Deriv::dP]; + if constexpr ( IS_THERMAL ) + { + dRelPerm[CP_Deriv::dT] += dResRelPerm_dS * m_dResPhaseVolFrac[er][esr][ei][jp][Deriv::dT]; + } + for( integer jc = 0; jc < NC; ++jc ) + { + dRelPerm[CP_Deriv::dC+jc] += dResRelPerm_dS * m_dResPhaseVolFrac[er][esr][ei][jp][Deriv::dC+jc]; + } + } + + // compute the reservoir phase mobility, including phase density + real64 const resPhaseMob = resDens * resRelPerm / resVisc; + + // Handles all dependencies + for( integer jc = 0; jc < CP_Deriv::nDer; ++jc ) + { + dMob[jc] = dRelPerm[jc] * resDens / resVisc + + resPhaseMob * (dDens[jc] / resDens - dVisc[jc] / resVisc); + } + // compute the phase flux and derivatives using upstream cell mobility + flux = resPhaseMob * potDiff; + // Handles all dependencies + for( integer jc = 0; jc < CP_Deriv::nDer; ++jc ) + { + dFlux[TAG::RES][jc] = dMob[jc] * potDiff + resPhaseMob * dPotDiff[TAG::RES][jc]; + dFlux[TAG::WELL][jc] = resPhaseMob * dPotDiff[TAG::WELL][jc]; + } + + // increment component fluxes + for( integer ic = 0; ic < NC; ++ic ) + { + // Note this needs to be uncommented out + m_compPerfRate[iperf][ic] += flux * m_resPhaseCompFrac[er][esr][ei][0][ip][ic]; + dCompFrac[CP_Deriv::dP] = m_dResPhaseCompFrac[er][esr][ei][0][ip][ic][Deriv::dP]; + if constexpr (IS_THERMAL) + { + dCompFrac[CP_Deriv::dT] = m_dResPhaseCompFrac[er][esr][ei][0][ip][ic][Deriv::dT]; + } + + applyChainRule( NC, + m_dResCompFrac_dCompDens[er][esr][ei], + m_dResPhaseCompFrac[er][esr][ei][0][ip][ic], + &dCompFrac[CP_Deriv::dC], + Deriv::dC ); + + for( integer jc = 0; jc < CP_Deriv::nDer; ++jc ) + { + m_dCompPerfRate[iperf][TAG::RES][ic][jc] += dFlux[TAG::RES][jc] * m_resPhaseCompFrac[er][esr][ei][0][ip][ic]; + m_dCompPerfRate[iperf][TAG::RES][ic][jc] += flux * dCompFrac[jc]; + m_dCompPerfRate[iperf][TAG::WELL][ic][jc] += dFlux[TAG::WELL][jc] * m_resPhaseCompFrac[er][esr][ei][0][ip][ic]; + } + } + if constexpr ( IS_THERMAL ) + { + fluxKernelOp( iwelem, er, esr, ei, ip, potDiff, flux, dFlux ); + } + + } // end resevoir is upstream phase loop + + } + else // ** well is upstream ** + { + + real64 resTotalMob = 0.0; + + // we re-compute here the total mass (when useMass == 1) or molar (when useMass == 0) density + real64 wellElemTotalDens = 0; + for( integer ic = 0; ic < NC; ++ic ) + { + wellElemTotalDens += m_wellElemCompDens[iwelem][ic]; + } + + // first, compute the reservoir total mobility (excluding phase density) + for( integer ip = 0; ip < NP; ++ip ) + { + + // skip the rest of the calculation if the phase is absent + bool const phaseExists = (m_resPhaseVolFrac[er][esr][ei][ip] > 0); + if( !phaseExists ) + { + continue; + } + + // viscosity + real64 const resVisc = m_resPhaseVisc[er][esr][ei][0][ip]; + real64 dVisc[CP_Deriv::nDer]{}; + dVisc[CP_Deriv::dP] = m_dResPhaseVisc[er][esr][ei][0][ip][Deriv::dP]; + if constexpr ( IS_THERMAL ) + { + dVisc[CP_Deriv::dT] = m_dResPhaseVisc[er][esr][ei][0][ip][Deriv::dT]; + } + + applyChainRule( NC, m_dResCompFrac_dCompDens[er][esr][ei], + m_dResPhaseVisc[er][esr][ei][0][ip], + &dVisc[CP_Deriv::dC], + Deriv::dC ); + + + // relative permeability + real64 const resRelPerm = m_resPhaseRelPerm[er][esr][ei][0][ip]; + real64 dRelPerm[CP_Deriv::nDer]{}; + for( integer jc = 0; jc < CP_Deriv::nDer; ++jc ) + { + dRelPerm[jc]=0; + } + for( integer jp = 0; jp < NP; ++jp ) + { + real64 const dResRelPerm_dS = m_dResPhaseRelPerm_dPhaseVolFrac[er][esr][ei][0][ip][jp]; + dRelPerm[CP_Deriv::dP] += dResRelPerm_dS * m_dResPhaseVolFrac[er][esr][ei][jp][Deriv::dP]; + if constexpr ( IS_THERMAL ) + { + dRelPerm[CP_Deriv::dT] += dResRelPerm_dS * m_dResPhaseVolFrac[er][esr][ei][jp][Deriv::dT]; + } + for( integer jc = 0; jc < NC; ++jc ) + { + dRelPerm[CP_Deriv::dC+jc] += dResRelPerm_dS * m_dResPhaseVolFrac[er][esr][ei][jp][Deriv::dC+jc]; + } + } + // increment total mobility + resTotalMob += resRelPerm / resVisc; + // Handles all dependencies + for( integer jc = 0; jc < CP_Deriv::nDer; ++jc ) + { + dMob[jc] += (dRelPerm[jc] *resVisc - resRelPerm * dVisc[jc] ) + / ( resVisc * resVisc); + } + } // end well is upstream phase loop + + // compute a potdiff multiplier = wellElemTotalDens * resTotalMob + // wellElemTotalDens is a mass density if useMass == 1 and a molar density otherwise + real64 const mult = wellElemTotalDens * resTotalMob; + + real64 dMult[2][CP_Deriv::nDer]{}; + dMult[TAG::WELL][CP_Deriv::dP] = 0.0; + if constexpr ( IS_THERMAL ) + { + dMult[TAG::WELL][CP_Deriv::dT] = 0.0; + } + for( integer ic = 0; ic < NC; ++ic ) + { + dMult[TAG::WELL][CP_Deriv::dC+ic] = resTotalMob; + } + for( integer jc = 0; jc < CP_Deriv::nDer; ++jc ) + { + dMult[TAG::RES][jc] = wellElemTotalDens * dMob[jc]; + } + + + // compute the volumetric flux and derivatives using upstream cell mobility + flux = mult * potDiff; + + for( integer ic = 0; ic < CP_Deriv::nDer; ++ic ) + { + dFlux[TAG::RES][ic] = dMult[TAG::RES][ic] * potDiff + mult * dPotDiff[TAG::RES][ic]; + dFlux[TAG::WELL][ic] = dMult[TAG::WELL][ic] * potDiff + mult * dPotDiff[TAG::WELL][ic]; + } + // compute component fluxes + for( integer ic = 0; ic < NC; ++ic ) + { + m_compPerfRate[iperf][ic] += m_wellElemCompFrac[iwelem][ic] * flux; + for( integer jc = 0; jc < CP_Deriv::nDer; ++jc ) + { + m_dCompPerfRate[iperf][TAG::RES][ic][jc] = m_wellElemCompFrac[iwelem][ic] * dFlux[TAG::RES][jc]; + } + } + for( integer ic = 0; ic < NC; ++ic ) + { + m_dCompPerfRate[iperf][TAG::WELL][ic][CP_Deriv::dP] = m_wellElemCompFrac[iwelem][ic] * dFlux[TAG::WELL][CP_Deriv::dP]; + if constexpr ( IS_THERMAL ) + { + m_dCompPerfRate[iperf][TAG::WELL][ic][CP_Deriv::dT] = m_wellElemCompFrac[iwelem][ic] * dFlux[TAG::WELL][CP_Deriv::dT]; + } + for( integer jc = 0; jc < NC; ++jc ) + { + m_dCompPerfRate[iperf][TAG::WELL][ic][CP_Deriv::dC+jc] += m_wellElemCompFrac[iwelem][ic] * dFlux[TAG::WELL][CP_Deriv::dC+jc]; + m_dCompPerfRate[iperf][TAG::WELL][ic][CP_Deriv::dC+jc] += m_dWellElemCompFrac_dCompDens[iwelem][ic][jc] * flux; + } + } + if constexpr ( IS_THERMAL ) + { + fluxKernelOp( iwelem, er, esr, ei, -1, potDiff, flux, dFlux ); + } + } // end upstream + } + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElements the number of elements + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numElements, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + forAll< POLICY >( numElements, [=] GEOS_HOST_DEVICE ( localIndex const iperf ) + { + + kernelComponent.computeFlux( iperf ); + + } ); + } + + + StackVariables m_stackVariables; + +protected: + ElementViewConst< arrayView1d< real64 const > > const m_resPres; + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const m_resPhaseVolFrac; + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const m_dResPhaseVolFrac; + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const m_dResCompFrac_dCompDens; + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_resPhaseDens; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dResPhaseDens; + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_resPhaseVisc; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dResPhaseVisc; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const m_resPhaseCompFrac; + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const m_dResPhaseCompFrac; + ElementViewConst< arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > > const m_resPhaseRelPerm; + ElementViewConst< arrayView4d< real64 const, constitutive::relperm::USD_RELPERM_DS > > const m_dResPhaseRelPerm_dPhaseVolFrac; + arrayView1d< real64 const > const m_wellElemGravCoef; + arrayView1d< real64 const > const m_wellElemPres; + arrayView2d< real64 const, compflow::USD_COMP > const m_wellElemCompDens; + arrayView1d< real64 const > const m_wellElemTotalMassDens; + arrayView2d< real64 const, compflow::USD_FLUID_DC > const m_dWellElemTotalMassDens; + arrayView2d< real64 const, compflow::USD_COMP > const m_wellElemCompFrac; + arrayView3d< real64 const, compflow::USD_COMP_DC > const m_dWellElemCompFrac_dCompDens; + arrayView1d< real64 const > const m_perfGravCoef; + arrayView1d< localIndex const > const m_perfWellElemIndex; + arrayView1d< real64 const > const m_perfTrans; + arrayView1d< localIndex const > const m_resElementRegion; + arrayView1d< localIndex const > const m_resElementSubRegion; + arrayView1d< localIndex const > const m_resElementIndex; + arrayView2d< real64 > const m_compPerfRate; + arrayView4d< real64 > const m_dCompPerfRate; + arrayView3d< real64 > const m_dCompPerfRate_dPres; + arrayView4d< real64 > const m_dCompPerfRate_dComp; + + bool const m_disableReservoirToWellFlow; + + +}; + +/** + * @class PerforationKernelFactory + */ +class PerforationFluxKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComps the number of fluid components + * @param[in] dt time step size + * @param[in] rankOffset the offset of my MPI rank + * @param[in] useTotalMassEquation flag specifying whether to replace one component bal eqn with total mass eqn + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] wellControls object holding well control/constraint information + * @param[in] subregion well subregion + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComp, + integer const numPhases, + string const flowSolverName, + PerforationData * const perforationData, + ElementSubRegionBase const & subRegion, + ElementRegionManager & elemManager, + integer const disableReservoirToWellFlow ) + { + geos::internal::kernelLaunchSelectorCompPhaseSwitch( numComp, numPhases, [&]( auto NC, auto NP ) + { + integer constexpr NUM_COMP = NC(); + integer constexpr NUM_PHASE = NP(); + integer constexpr IS_THERMAL = 0; + + using kernelType = PerforationFluxKernel< NUM_COMP, NUM_PHASE, IS_THERMAL >; + typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, flowSolverName ); + typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, flowSolverName ); + typename kernelType::RelPermAccessors relPermAccessors( elemManager, flowSolverName ); + + kernelType kernel( perforationData, subRegion, compFlowAccessors, multiFluidAccessors, relPermAccessors, disableReservoirToWellFlow ); + kernelType::template launch< POLICY >( perforationData->size(), kernel ); + } ); + } +}; + +} // end namespace isothermalPerforationFluxKernels + +namespace thermalPerforationFluxKernels +{ + +using namespace constitutive; + +/******************************** PerforationFluxKernel ********************************/ + +template< integer NC, integer NP, integer IS_THERMAL > +class PerforationFluxKernel : public isothermalPerforationFluxKernels::PerforationFluxKernel< NC, NP, IS_THERMAL > +{ +public: + + using Base = isothermalPerforationFluxKernels::PerforationFluxKernel< NC, NP, IS_THERMAL >; + //using AbstractBase::m_dPhaseVolFrac; + using Base::m_resPhaseCompFrac; + using Base::m_dResCompFrac_dCompDens; + using Base::m_dWellElemCompFrac_dCompDens; + //using AbstractBase::m_dPhaseCompFrac; + //using AbstractBase::m_dCompFrac_dCompDens; + /// Compile time value for the number of components + static constexpr integer numComp = NC; + + /// Compile time value for the number of phases + static constexpr integer numPhase = NP; + + /// Compile time value for thermal option + static constexpr integer isThermal = IS_THERMAL; + + using TAG = typename Base::TAG; + using CompFlowAccessors = typename Base::CompFlowAccessors; + using MultiFluidAccessors = typename Base::MultiFluidAccessors; + using RelPermAccessors = typename Base::RelPermAccessors; + + + using ThermalCompFlowAccessors = + StencilAccessors< fields::flow::temperature >; + + using ThermalMultiFluidAccessors = + StencilMaterialAccessors< MultiFluidBase, + fields::multifluid::phaseEnthalpy, + fields::multifluid::dPhaseEnthalpy >; + + //using ThermalConductivityAccessors = + // StencilMaterialAccessors< MultiPhaseThermalConductivityBase, + // fields::thermalconductivity::effectiveConductivity >; + + /** + * @brief The type for element-based non-constitutive data parameters. + * Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + PerforationFluxKernel ( PerforationData * const perforationData, + ElementSubRegionBase const & subRegion, + MultiFluidBase const & fluid, + CompFlowAccessors const & compFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + RelPermAccessors const & relPermAccessors, + bool const disableReservoirToWellFlow, + ThermalCompFlowAccessors const & thermalCompFlowAccessors, + ThermalMultiFluidAccessors const & thermalMultiFluidAccessors ) + : Base( perforationData, + subRegion, + compFlowAccessors, + multiFluidAccessors, + relPermAccessors, + disableReservoirToWellFlow ), + m_wellElemPhaseFrac( fluid.phaseFraction() ), + m_dPhaseFrac( fluid.dPhaseFraction() ), + m_wellElemPhaseEnthalpy( fluid.phaseEnthalpy()), + m_dWellElemPhaseEnthalpy( fluid.dPhaseEnthalpy()), + m_energyPerfFlux( perforationData->getField< fields::well::energyPerforationFlux >()), + m_dEnergyPerfFlux( perforationData->getField< fields::well::dEnergyPerforationFlux >()), + m_temp( thermalCompFlowAccessors.get( fields::flow::temperature {} ) ), + m_resPhaseEnthalpy( thermalMultiFluidAccessors.get( fields::multifluid::phaseEnthalpy {} ) ), + m_dResPhaseEnthalpy( thermalMultiFluidAccessors.get( fields::multifluid::dPhaseEnthalpy {} ) ) + + {} + + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + inline + void + computeFlux( localIndex const iperf ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + using CP_Deriv =constitutive::multifluid::DerivativeOffsetC< NC, IS_THERMAL >; + // initialize outputs + m_energyPerfFlux[iperf]=0; + for( integer ke = 0; ke < 2; ++ke ) + { + for( integer i = 0; i < CP_Deriv::nDer; ++i ) + { + m_dEnergyPerfFlux[iperf][ke][i]=0; + } + } + + Base::computeFlux ( iperf, [&]( localIndex const iwelem, localIndex const er, localIndex const esr, localIndex const ei, localIndex const ip, + real64 const potDiff, real64 const flux, real64 const (&dFlux)[2][CP_Deriv::nDer] ) + { + if( potDiff >= 0 ) // ** reservoir cell is upstream ** + { + + real64 const res_enthalpy = m_resPhaseEnthalpy[er][esr][ei][0][ip]; + + m_energyPerfFlux[iperf] += flux * res_enthalpy; + + // energy equation derivatives WRT res P & T + m_dEnergyPerfFlux[iperf][TAG::RES][CP_Deriv::dP] += dFlux[TAG::RES][CP_Deriv::dP] * res_enthalpy + + flux * m_dResPhaseEnthalpy[er][esr][ei][0][ip][Deriv::dP]; + m_dEnergyPerfFlux[iperf][TAG::RES][CP_Deriv::dT] += dFlux[TAG::RES][CP_Deriv::dT] * res_enthalpy + + flux * m_dResPhaseEnthalpy[er][esr][ei][0][ip][Deriv::dT]; + // energy equation derivatives WRT well P + m_dEnergyPerfFlux[iperf][TAG::WELL][CP_Deriv::dP] += dFlux[TAG::WELL][CP_Deriv::dP] * res_enthalpy; + m_dEnergyPerfFlux[iperf][TAG::WELL][CP_Deriv::dT] += dFlux[TAG::WELL][CP_Deriv::dT] * res_enthalpy; + + + // energy equation derivatives WRT reservoir dens + real64 dProp_dC[numComp]{}; + applyChainRule( NC, + m_dResCompFrac_dCompDens[er][esr][ei], + m_dResPhaseEnthalpy[er][esr][ei][0][ip], + dProp_dC, + Deriv::dC ); + + for( integer jc = 0; jc < NC; ++jc ) + { + m_dEnergyPerfFlux[iperf][TAG::RES][CP_Deriv::dC+jc] += flux * dProp_dC[jc]; + } + } + else // ** reservoir cell is downstream + { + for( integer iphase = 0; iphase < NP; ++iphase ) + { + bool const phaseExists = m_wellElemPhaseFrac[iwelem][0][iphase] > 0.0; + if( !phaseExists ) + continue; + double pflux = m_wellElemPhaseFrac[iwelem][0][iphase]*flux; + real64 const wellelem_enthalpy = m_wellElemPhaseEnthalpy[iwelem][0][iphase]; + m_energyPerfFlux[iperf] += pflux * wellelem_enthalpy; + + // energy equation derivatives WRT res P & T + m_dEnergyPerfFlux[iperf][TAG::RES][CP_Deriv::dP] += dFlux[TAG::RES][CP_Deriv::dP] * wellelem_enthalpy; + m_dEnergyPerfFlux[iperf][TAG::RES][CP_Deriv::dT] += dFlux[TAG::RES][CP_Deriv::dT] * wellelem_enthalpy; + + m_dEnergyPerfFlux[iperf][TAG::WELL][CP_Deriv::dP] += dFlux[TAG::WELL][CP_Deriv::dP] * wellelem_enthalpy + + pflux * m_dWellElemPhaseEnthalpy[iwelem][0][iphase][Deriv::dP] + + pflux * wellelem_enthalpy * m_dPhaseFrac[iwelem][0][iphase][Deriv::dP]; + m_dEnergyPerfFlux[iperf][TAG::WELL][CP_Deriv::dT] += dFlux[TAG::WELL][CP_Deriv::dT] * wellelem_enthalpy + + pflux * m_dWellElemPhaseEnthalpy[iwelem][0][iphase][Deriv::dT] + + pflux * wellelem_enthalpy * m_dPhaseFrac[iwelem][0][iphase][Deriv::dT]; + + //energy e + real64 dPVF_dC[numComp]{}; + applyChainRule( NC, + m_dWellElemCompFrac_dCompDens[iwelem], + m_dPhaseFrac[iwelem][0][iphase], + dPVF_dC, + Deriv::dC ); + for( integer ic=0; ic + static void + launch( localIndex const numElements, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + forAll< POLICY >( numElements, [=] GEOS_HOST_DEVICE ( localIndex const iperf ) + { + kernelComponent.computeFlux( iperf ); + + } ); + } + +protected: + + /// Views on well element properties + /// Element phase fraction + arrayView3d< real64 const, multifluid::USD_PHASE > const m_wellElemPhaseFrac; + arrayView4d< real64 const, multifluid::USD_PHASE_DC > const m_dPhaseFrac; + arrayView3d< real64 const, multifluid::USD_PHASE > const m_wellElemPhaseEnthalpy; + arrayView4d< real64 const, multifluid::USD_PHASE_DC > const m_dWellElemPhaseEnthalpy; + + /// Views on energy flux + arrayView1d< real64 > const m_energyPerfFlux; + arrayView3d< real64 > const m_dEnergyPerfFlux; + + /// Views on temperature + ElementViewConst< arrayView1d< real64 const > > const m_temp; + + /// Views on phase enthalpies + ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const m_resPhaseEnthalpy; + ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const m_dResPhaseEnthalpy; + + +}; + +/** + * @class PerforationKernelFactory + */ +class PerforationFluxKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComps the number of fluid components + * @param[in] dt time step size + * @param[in] rankOffset the offset of my MPI rank + * @param[in] useTotalMassEquation flag specifying whether to replace one component bal eqn with total mass eqn + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] wellControls object holding well control/constraint information + * @param[in] subregion well subregion + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComp, + integer const numPhases, + string const flowSolverName, + PerforationData * const perforationData, + ElementSubRegionBase const & subRegion, + MultiFluidBase const & fluid, + ElementRegionManager & elemManager, + integer const disableReservoirToWellFlow ) + { + geos::internal::kernelLaunchSelectorCompPhaseSwitch( numComp, numPhases, [&]( auto NC, auto NP ) + { + integer constexpr NUM_COMP = NC(); + integer constexpr NUM_PHASE = NP(); + integer constexpr IS_THERMAL = 1; + + using kernelType = PerforationFluxKernel< NUM_COMP, NUM_PHASE, IS_THERMAL >; + typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, flowSolverName ); + typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, flowSolverName ); + typename kernelType::RelPermAccessors relPermAccessors( elemManager, flowSolverName ); + typename kernelType::ThermalCompFlowAccessors thermalCompFlowAccessors( elemManager, flowSolverName ); + typename kernelType::ThermalMultiFluidAccessors thermalMultiFluidAccessors( elemManager, flowSolverName ); + + kernelType kernel( perforationData, subRegion, fluid, compFlowAccessors, multiFluidAccessors, + relPermAccessors, disableReservoirToWellFlow, + thermalCompFlowAccessors, + thermalMultiFluidAccessors ); + kernelType::template launch< POLICY >( perforationData->size(), kernel ); + } ); + } +}; + +} // end namespace thermalPerforationFluxKernels + +} // end namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_PERFORATIONFLUXLKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index e06f25cd3eb..0c8fac303ba 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -50,6 +50,8 @@ SinglePhaseWell::SinglePhaseWell( const string & name, { m_numDofPerWellElement = 2; m_numDofPerResElement = 1; + m_numPhases = 1; + m_numComponents = 1; this->registerWrapper( FlowSolverBase::viewKeyStruct::allowNegativePressureString(), &m_allowNegativePressure ). setApplyDefaultValue( 1 ). // negative pressure is allowed by default @@ -313,7 +315,7 @@ void SinglePhaseWell::updateFluidModel( WellElementSubRegion & subRegion ) const } ); } -void SinglePhaseWell::updateSubRegionState( WellElementSubRegion & subRegion ) +real64 SinglePhaseWell::updateSubRegionState( WellElementSubRegion & subRegion ) { // update volumetric rates for the well constraints // Warning! This must be called before updating the fluid model @@ -326,12 +328,21 @@ void SinglePhaseWell::updateSubRegionState( WellElementSubRegion & subRegion ) updateBHPForConstraint( subRegion ); // note: the perforation rates are updated separately + return 0.0; // change in phasevolume fraction doesnt apply } -void SinglePhaseWell::initializeWells( DomainPartition & domain ) +void SinglePhaseWell::initializeWells( DomainPartition & domain, real64 const & time_n, real64 const & dt ) { GEOS_MARK_FUNCTION; - + GEOS_UNUSED_VAR( time_n ); + GEOS_UNUSED_VAR( dt ); + // different functionality than for compositional + // compositional has better treatment of well initialization in cases where well starts later in sim + // logic will be incorporated into single phase in different push + if( time_n > 0 ) + { + return; + } // loop over the wells forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & meshLevel, @@ -380,7 +391,7 @@ void SinglePhaseWell::initializeWells( DomainPartition & domain ) subRegion.size(), perforationData.getNumPerforationsGlobal(), wellControls, - 0.0, // initialization done at t = 0 + 0.0, // initialization done at t = 0 resSinglePhaseFlowAccessors.get( fields::flow::pressure{} ), resSingleFluidAccessors.get( fields::singlefluid::density{} ), resElementRegion, @@ -402,7 +413,7 @@ void SinglePhaseWell::initializeWells( DomainPartition & domain ) // 5) Estimate the well rates RateInitializationKernel::launch( subRegion.size(), wellControls, - 0.0, // initialization done at t = 0 + 0.0, // initialization done at t = 0 wellElemDens, connRate ); @@ -411,14 +422,16 @@ void SinglePhaseWell::initializeWells( DomainPartition & domain ) } ); } -void SinglePhaseWell::assembleFluxTerms( real64 const dt, - DomainPartition const & domain, +void SinglePhaseWell::assembleFluxTerms( real64 const & time_n, + real64 const & dt, + DomainPartition & domain, DofManager const & dofManager, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; - + GEOS_UNUSED_VAR( time_n ); + GEOS_UNUSED_VAR( dt ); // loop over the wells forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -505,7 +518,7 @@ void SinglePhaseWell::assemblePressureRelations( real64 const & time_n, subRegion.isLocallyOwned(), subRegion.getTopWellElementIndex(), wellControls, - time_n + dt, // controls evaluated with BHP/rate of the end of the time interval + time_n + dt, // controls evaluated with BHP/rate of the end of the time interval wellElemDofNumber, wellElemGravCoef, nextWellElemIndex, @@ -538,13 +551,16 @@ void SinglePhaseWell::assemblePressureRelations( real64 const & time_n, } ); } -void SinglePhaseWell::assembleAccumulationTerms( DomainPartition const & domain, +void SinglePhaseWell::assembleAccumulationTerms( real64 const & time_n, + real64 const & dt, + DomainPartition & domain, DofManager const & dofManager, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { GEOS_MARK_FUNCTION; - + GEOS_UNUSED_VAR( time_n ); + GEOS_UNUSED_VAR( dt ); forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel const & mesh, arrayView1d< string const > const & regionNames ) @@ -583,7 +599,8 @@ void SinglePhaseWell::assembleAccumulationTerms( DomainPartition const & domain, } ); } ); - + // then assemble the volume balance equations + assembleVolumeBalanceTerms( domain, dofManager, localMatrix, localRhs ); } void SinglePhaseWell::assembleVolumeBalanceTerms( DomainPartition const & GEOS_UNUSED_PARAM( domain ), @@ -671,10 +688,12 @@ void SinglePhaseWell::shutDownWell( real64 const time_n, } -void SinglePhaseWell::computePerforationRates( DomainPartition & domain ) +void SinglePhaseWell::computePerforationRates( real64 const & time_n, + real64 const & dt, DomainPartition & domain ) { GEOS_MARK_FUNCTION; - + GEOS_UNUSED_VAR( time_n ); + GEOS_UNUSED_VAR( dt ); forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp index 144a4de033f..bd95ac6d2d4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp @@ -160,13 +160,14 @@ class SinglePhaseWell : public WellSolverBase * @brief Recompute the perforation rates for all the wells * @param domain the domain containing the mesh and fields */ - virtual void computePerforationRates( DomainPartition & domain ) override; + virtual void computePerforationRates( real64 const & time_n, + real64 const & dt, DomainPartition & domain ) override; /** * @brief Recompute all dependent quantities from primary variables (including constitutive models) on the well * @param subRegion the well subRegion containing the well elements and their associated fields */ - virtual void updateSubRegionState( WellElementSubRegion & subRegion ) override; + virtual real64 updateSubRegionState( WellElementSubRegion & subRegion ) override; /** * @brief assembles the flux terms for all connections between well elements @@ -177,11 +178,12 @@ class SinglePhaseWell : public WellSolverBase * @param matrix the system matrix * @param rhs the system right-hand side vector */ - void assembleFluxTerms( real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) override; + virtual void assembleFluxTerms( real64 const & time_n, + real64 const & dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) override; /** * @brief assembles the accumulation term for all the well elements @@ -190,10 +192,11 @@ class SinglePhaseWell : public WellSolverBase * @param matrix the system matrix * @param rhs the system right-hand side vector */ - void assembleAccumulationTerms( DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) override; + virtual void assembleAccumulationTerms( real64 const & time_n, + real64 const & dt, DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) override; /** * @brief assembles the volume balance terms for all well elements @@ -202,10 +205,10 @@ class SinglePhaseWell : public WellSolverBase * @param matrix the system matrix * @param rhs the system right-hand side vector */ - virtual void assembleVolumeBalanceTerms( DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) override; + void assembleVolumeBalanceTerms( DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ); /** * @brief assembles the pressure relations at all connections between well elements except at the well head @@ -269,7 +272,7 @@ class SinglePhaseWell : public WellSolverBase * @brief Initialize all the primary and secondary variables in all the wells * @param domain the domain containing the well manager to access individual wells */ - void initializeWells( DomainPartition & domain ) override; + void initializeWells( DomainPartition & domain, real64 const & time_n, real64 const & dt ) override; /** * @brief Make sure that the well constraints are compatible diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp new file mode 100644 index 00000000000..280dc6c0959 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp @@ -0,0 +1,1121 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ThermalCompositionalMultiphaseWellKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_THERMALCOMPOSITIONALMULTIPHASEWELLKERNELS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_THERMALCOMPOSITIONALMULTIPHASEWELLKERNELS_HPP + +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/SolverBaseKernels.hpp" +namespace geos +{ + +namespace thermalCompositionalMultiphaseWellKernels +{ + +using namespace constitutive; + +/******************************** TotalMassDensityKernel ****************************/ + +/** + * @class TotalMassDensityKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_PHASE number of fluid phases + * @brief Define the interface for the property kernel in charge of computing the total mass density + */ +template< integer NUM_COMP, integer NUM_PHASE > +class TotalMassDensityKernel : public compositionalMultiphaseWellKernels::TotalMassDensityKernel< NUM_COMP, NUM_PHASE > +{ +public: + using Base = compositionalMultiphaseWellKernels::TotalMassDensityKernel< NUM_COMP, NUM_PHASE >; + using Base::m_dCompFrac_dCompDens; + using Base::m_dPhaseMassDens; + using Base::m_dPhaseVolFrac; + using Base::m_dTotalMassDens; + using Base::m_phaseMassDens; + using Base::m_phaseVolFrac; + using Base::m_totalMassDens; + using Base::numComp; + using Base::numPhase; + + /** + * @brief Constructor + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + */ + TotalMassDensityKernel( ObjectManagerBase & subRegion, + MultiFluidBase const & fluid ) + : Base( subRegion, fluid ) + {} + + /** + * @brief Compute the total mass density in an element + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[in] totalMassDensityKernelOp the function used to customize the kernel + */ + GEOS_HOST_DEVICE inline void compute( localIndex const ei ) const + { + using Deriv = multifluid::DerivativeOffset; + + arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; + arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; + arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseMassDens = m_phaseMassDens[ei][0]; + arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseMassDens = m_dPhaseMassDens[ei][0]; + + real64 & dTotalMassDens_dT = m_dTotalMassDens[ei][Deriv::dT]; + + // Call the base compute the compute the total mass density and derivatives + return Base::compute( ei, [&]( localIndex const ip ) + { + dTotalMassDens_dT += dPhaseVolFrac[ip][Deriv::dT] * phaseMassDens[ip] + phaseVolFrac[ip] * dPhaseMassDens[ip][Deriv::dT]; + } ); + } + +protected: + // outputs + arrayView1d< real64 > m_dTotalMassDens_dTemp; +}; + +/** + * @class TotalMassDensityKernelFactory + */ +class TotalMassDensityKernelFactory +{ +public: + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComp the number of fluid components + * @param[in] numPhase the number of fluid phases + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComp, + integer const numPhase, + ObjectManagerBase & subRegion, + MultiFluidBase const & fluid ) + { + if( numPhase == 2 ) + { + isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComp, [&]( auto NC ) + { + integer constexpr NUM_COMP = NC(); + TotalMassDensityKernel< NUM_COMP, 2 > kernel( subRegion, fluid ); + TotalMassDensityKernel< NUM_COMP, 2 >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + else if( numPhase == 3 ) + { + isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComp, [&]( auto NC ) + { + integer constexpr NUM_COMP = NC(); + TotalMassDensityKernel< NUM_COMP, 3 > kernel( subRegion, fluid ); + TotalMassDensityKernel< NUM_COMP, 3 >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + } +}; + +/******************************** ResidualNormKernel ********************************/ + +/** + * @class ResidualNormKernel + */ +template< localIndex NUM_COMP > +class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > +{ +public: + + /// Compile time value for the number of components + static constexpr integer numComp = NUM_COMP; + + + using WJ_ROFFSET = compositionalMultiphaseWellKernels::RowOffset_WellJac< NUM_COMP, 1 >; + + using Base = solverBaseKernels::ResidualNormKernelBase< 2 >; + using Base::m_minNormalizer; + using Base::m_rankOffset; + using Base::m_localResidual; + using Base::m_dofNumber; + + ResidualNormKernel( globalIndex const rankOffset, + arrayView1d< real64 const > const & localResidual, + arrayView1d< globalIndex const > const & dofNumber, + arrayView1d< localIndex const > const & ghostRank, + integer const targetPhaseIndex, + WellElementSubRegion const & subRegion, + MultiFluidBase const & fluid, + WellControls const & wellControls, + real64 const timeAtEndOfStep, + real64 const dt, + real64 const minNormalizer ) + : Base( rankOffset, + localResidual, + dofNumber, + ghostRank, + minNormalizer ), + m_numPhases( fluid.numFluidPhases()), + m_targetPhaseIndex( targetPhaseIndex ), + m_dt( dt ), + m_isLocallyOwned( subRegion.isLocallyOwned() ), + m_iwelemControl( subRegion.getTopWellElementIndex() ), + m_isProducer( wellControls.isProducer() ), + m_currentControl( wellControls.getControl() ), + m_targetBHP( wellControls.getTargetBHP( timeAtEndOfStep ) ), + m_targetTotalRate( wellControls.getTargetTotalRate( timeAtEndOfStep ) ), + m_targetPhaseRate( wellControls.getTargetPhaseRate( timeAtEndOfStep ) ), + m_targetMassRate( wellControls.getTargetMassRate( timeAtEndOfStep ) ), + m_volume( subRegion.getElementVolume() ), + m_phaseDens_n( fluid.phaseDensity_n() ), + m_totalDens_n( fluid.totalDensity_n() ), + m_phaseVolFraction_n( subRegion.getField< fields::well::phaseVolumeFraction_n >()), + m_phaseInternalEnergy_n( fluid.phaseInternalEnergy_n() ) + {} + + + GEOS_HOST_DEVICE + void computeMassEnergyNormalizers( localIndex const iwelem, + real64 & massNormalizer, + real64 & energyNormalizer ) const + { + massNormalizer = LvArray::math::max( m_minNormalizer, m_totalDens_n[iwelem][0] * m_volume[iwelem] ); + + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + energyNormalizer += m_phaseInternalEnergy_n[iwelem][0][ip] * m_phaseDens_n[iwelem][0][ip] * m_phaseVolFraction_n[iwelem][ip] * m_volume[iwelem]; + } + // warning: internal energy can be negative + energyNormalizer = LvArray::math::max( m_minNormalizer, LvArray::math::abs( energyNormalizer ) ); + } + + GEOS_HOST_DEVICE + virtual void computeLinf( localIndex const iwelem, + LinfStackVariables & stack ) const override + { + real64 normalizer = 0.0; + for( integer idof = 0; idof < WJ_ROFFSET::nEqn; ++idof ) + { + + // Step 1: compute a normalizer for the control or pressure equation + + // for the control equation, we distinguish two cases + if( idof == WJ_ROFFSET::CONTROL ) + { + + // for the top well element, normalize using the current control + if( m_isLocallyOwned && iwelem == m_iwelemControl ) + { + if( m_currentControl == WellControls::Control::BHP ) + { + // the residual entry is in pressure units + normalizer = m_targetBHP; + } + else if( m_currentControl == WellControls::Control::TOTALVOLRATE ) + { + // the residual entry is in volume / time units + normalizer = LvArray::math::max( LvArray::math::abs( m_targetTotalRate ), m_minNormalizer ); + } + else if( m_currentControl == WellControls::Control::PHASEVOLRATE ) + { + // the residual entry is in volume / time units + normalizer = LvArray::math::max( LvArray::math::abs( m_targetPhaseRate ), m_minNormalizer ); + } + else if( m_currentControl == WellControls::Control::MASSRATE ) + { + // the residual entry is in volume / time units + normalizer = LvArray::math::max( LvArray::math::abs( m_targetMassRate ), m_minNormalizer ); + } + } + // for the pressure difference equation, always normalize by the BHP + else + { + normalizer = m_targetBHP; + } + } + // Step 2: compute a normalizer for the mass balance equations + else if( idof >= WJ_ROFFSET::MASSBAL && idof < WJ_ROFFSET::MASSBAL + numComp ) + { + if( m_isProducer ) // only PHASEVOLRATE is supported for now + { + // the residual is in mass units + normalizer = m_dt * LvArray::math::abs( m_targetPhaseRate ) * m_phaseDens_n[iwelem][0][m_targetPhaseIndex]; + } + else // Type::INJECTOR, only TOTALVOLRATE is supported for now + { + if( m_currentControl == WellControls::Control::MASSRATE ) + { + normalizer = m_dt * LvArray::math::abs( m_targetMassRate ); + } + else + { + // the residual is in mass units + normalizer = m_dt * LvArray::math::abs( m_targetTotalRate ) * m_totalDens_n[iwelem][0]; + } + + } + + // to make sure that everything still works well if the rate is zero, we add this check + normalizer = LvArray::math::max( normalizer, m_volume[iwelem] * m_totalDens_n[iwelem][0] ); + } + // Step 3: compute a normalizer for the volume balance equations + else if( idof == WJ_ROFFSET::VOLBAL ) + { + if( m_isProducer ) // only PHASEVOLRATE is supported for now + { + // the residual is in volume units + normalizer = m_dt * LvArray::math::abs( m_targetPhaseRate ); + } + else // Type::INJECTOR, only TOTALVOLRATE is supported for now + { + if( m_currentControl == WellControls::Control::MASSRATE ) + { + normalizer = m_dt * LvArray::math::abs( m_targetMassRate/ m_totalDens_n[iwelem][0] ); + } + else + { + normalizer = m_dt * LvArray::math::abs( m_targetTotalRate ); + } + + } + // to make sure that everything still works well if the rate is zero, we add this check + normalizer = LvArray::math::max( normalizer, m_volume[iwelem] ); + } + // step 3: energy residual + if( idof == WJ_ROFFSET::ENERGYBAL ) + { + real64 massNormalizer = 0.0, energyNormalizer = 0.0; + computeMassEnergyNormalizers( iwelem, massNormalizer, energyNormalizer ); + real64 const valEnergy = LvArray::math::abs( m_localResidual[stack.localRow + WJ_ROFFSET::ENERGYBAL] ) / energyNormalizer; + if( valEnergy > stack.localValue[1] ) + { + stack.localValue[1] = valEnergy; + } + + } + else + { + normalizer = LvArray::math::max( m_minNormalizer, normalizer ); + // Step 4: compute the contribution to the residual + real64 const val = LvArray::math::abs( m_localResidual[stack.localRow + idof] ) / normalizer; + if( val > stack.localValue[0] ) + { + stack.localValue[0] = val; + } + } + } + } + + GEOS_HOST_DEVICE + virtual void computeL2( localIndex const iwelem, + L2StackVariables & stack ) const override + { + GEOS_UNUSED_VAR( iwelem, stack ); + GEOS_ERROR( "The L2 norm is not implemented for CompositionalMultiphaseWell" ); + } + + +protected: + + /// Number of fluid phases + integer const m_numPhases; + + /// Index of the target phase + integer const m_targetPhaseIndex; + + /// Time step size + real64 const m_dt; + + /// Flag indicating whether the well is locally owned or not + bool const m_isLocallyOwned; + + /// Index of the element where the control is enforced + localIndex const m_iwelemControl; + + /// Flag indicating whether the well is a producer or an injector + bool const m_isProducer; + + /// Controls + WellControls::Control const m_currentControl; + real64 const m_targetBHP; + real64 const m_targetTotalRate; + real64 const m_targetPhaseRate; + real64 const m_targetMassRate; + + /// View on the volume + arrayView1d< real64 const > const m_volume; + + /// View on phase/total density at the previous converged time step + arrayView3d< real64 const, multifluid::USD_PHASE > const m_phaseDens_n; + arrayView2d< real64 const, multifluid::USD_FLUID > const m_totalDens_n; + arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFraction_n; + arrayView3d< real64 const, multifluid::USD_PHASE > const m_phaseInternalEnergy_n; + +}; + +/* + *@class ResidualNormKernelFactory + */ +class ResidualNormKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComp number of fluid components + * @param[in] numDof number of dofs per well element + * @param[in] targetPhaseIndex the index of the target phase (for phase volume control) + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] localResidual the residual vector on my MPI rank + * @param[in] subRegion the well element subregion + * @param[in] fluid the fluid model + * @param[in] wellControls the controls + * @param[in] timeAtEndOfStep the time at the end of the step (time_n + dt) + * @param[in] dt the time step size + * @param[out] residualNorm the residual norm on the subRegion + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComp, + integer const targetPhaseIndex, + globalIndex const rankOffset, + string const & dofKey, + arrayView1d< real64 const > const & localResidual, + WellElementSubRegion const & subRegion, + MultiFluidBase const & fluid, + WellControls const & wellControls, + real64 const timeAtEndOfStep, + real64 const dt, + real64 const minNormalizer, + real64 (& residualNorm)[2] ) + { + isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch ( numComp, [&]( auto NC ) + { + + integer constexpr NUM_COMP = NC(); + using kernelType = ResidualNormKernel< NUM_COMP >; + arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); + arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); + + kernelType kernel( rankOffset, localResidual, dofNumber, ghostRank, + targetPhaseIndex, subRegion, fluid, wellControls, timeAtEndOfStep, dt, minNormalizer ); + kernelType::template launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); + } ); + } + +}; + +/******************************** ElementBasedAssemblyKernel ********************************/ + +/** + * @class ElementBasedAssemblyKernel + * @tparam NUM_COMP number of fluid components + * @tparam IS_THERMAL thermal flag + * @brief Define the interface for the assembly kernel in charge of thermal accumulation and volume balance + */ +template< localIndex NUM_COMP > +class ElementBasedAssemblyKernel : public compositionalMultiphaseWellKernels::ElementBasedAssemblyKernel< NUM_COMP, 1 > +{ +public: + using Base = compositionalMultiphaseWellKernels::ElementBasedAssemblyKernel< NUM_COMP, 1 >; + using Base::m_dCompFrac_dCompDens; + using Base::m_dofNumber; + using Base::m_dPhaseCompFrac; + using Base::m_dPhaseDens; + using Base::m_dPhaseVolFrac; + using Base::m_dPoro_dPres; + using Base::m_elemGhostRank; + using Base::m_localMatrix; + using Base::m_localRhs; + using Base::m_numPhases; + using Base::m_phaseCompFrac; + using Base::m_phaseCompFrac_n; + using Base::m_phaseDens; + using Base::m_phaseDens_n; + using Base::m_phaseVolFrac; + using Base::m_phaseVolFrac_n; + using Base::m_porosity; + using Base::m_porosity_n; + using Base::m_rankOffset; + using Base::m_volume; + using Base::numComp; + using Base::numDof; + using Base::numEqn; + + using FLUID_PROP_COFFSET = multifluid::DerivativeOffsetC< NUM_COMP, 1 >; + + + /** + * @brief Constructor + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + ElementBasedAssemblyKernel( localIndex const numPhases, + integer const isProducer, + globalIndex const rankOffset, + string const dofKey, + WellElementSubRegion const & subRegion, + MultiFluidBase const & fluid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > const kernelFlags ) + : Base( numPhases, isProducer, rankOffset, dofKey, subRegion, fluid, localMatrix, localRhs, kernelFlags ), + m_phaseInternalEnergy_n( fluid.phaseInternalEnergy_n()), + m_phaseInternalEnergy( fluid.phaseInternalEnergy()), + m_dPhaseInternalEnergy( fluid.dPhaseInternalEnergy()) + {} + + struct StackVariables : public Base::StackVariables + { +public: + GEOS_HOST_DEVICE + StackVariables() + : Base::StackVariables() + {} + using Base::StackVariables::eqnRowIndices; + using Base::StackVariables::dofColIndices; + using Base::StackVariables::localJacobian; + using Base::StackVariables::localResidual; + using Base::StackVariables::localRow; + using Base::StackVariables::volume; + + + + }; + /** + * @brief Performs the setup phase for the kernel. + * @param[in] ei the element index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + void setup( localIndex const ei, + StackVariables & stack ) const + { + Base::setup( ei, stack ); + + + + } + + /** + * @brief Compute the local accumulation contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void computeAccumulation( localIndex const ei, + StackVariables & stack ) const + { + using Deriv = multifluid::DerivativeOffset; + + Base::computeAccumulation( ei, stack, [&]( integer const ip + , real64 const & phaseAmount + , real64 const & phaseAmount_n + , real64 const (&dPhaseAmount)[FLUID_PROP_COFFSET::nDer] ) + { + // We are in the loop over phases, ip provides the current phase index. + // We have to do two things: + // 1- Assemble the derivatives of the component mass balance equations with respect to temperature + // 2- Assemble the phase-dependent part of the accumulation term of the energy equation + + real64 dPhaseInternalEnergy_dC[numComp]{}; + + // construct the slices + arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; + arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseInternalEnergy_n = m_phaseInternalEnergy_n[ei][0]; + arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseInternalEnergy = m_phaseInternalEnergy[ei][0]; + arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseInternalEnergy = m_dPhaseInternalEnergy[ei][0]; + + // Step 1: assemble the phase-dependent part of the accumulation term of the energy equation + + real64 const phaseEnergy = phaseAmount * phaseInternalEnergy[ip]; + real64 const phaseEnergy_n = phaseAmount_n * phaseInternalEnergy_n[ip]; + real64 const dPhaseEnergy_dP = dPhaseAmount[FLUID_PROP_COFFSET::dP] * phaseInternalEnergy[ip] + + phaseAmount * dPhaseInternalEnergy[ip][Deriv::dP]; + real64 const dPhaseEnergy_dT = dPhaseAmount[FLUID_PROP_COFFSET::dT] * phaseInternalEnergy[ip] + + phaseAmount * dPhaseInternalEnergy[ip][Deriv::dT]; + // local accumulation + stack.localResidual[numEqn-1] += phaseEnergy - phaseEnergy_n; + + // derivatives w.r.t. pressure and temperature + stack.localJacobian[numEqn-1][0] += dPhaseEnergy_dP; + stack.localJacobian[numEqn-1][numDof-1] += dPhaseEnergy_dT; + + // derivatives w.r.t. component densities + applyChainRule( numComp, dCompFrac_dCompDens, dPhaseInternalEnergy[ip], dPhaseInternalEnergy_dC, Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + stack.localJacobian[numEqn-1][jc + 1] += phaseInternalEnergy[ip] * dPhaseAmount[FLUID_PROP_COFFSET::dC+jc] + + dPhaseInternalEnergy_dC[jc] * phaseAmount; + } + } ); + + + } + + /** + * @brief Compute the local volume balance contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void computeVolumeBalance( localIndex const ei, + StackVariables & stack ) const + { + Base::computeVolumeBalance( ei, stack ); + + } + + GEOS_HOST_DEVICE + void complete( localIndex const ei, + StackVariables & stack ) const + { + // Assemble the component mass balance equations and volume balance equations + // Energy balance equation updates to solver matrices included in Base class + Base::complete( ei, stack ); + + } + +protected: + /// View on derivative of porosity w.r.t temperature + arrayView2d< real64 const > const m_dPoro_dTemp; + + /// Views on phase internal energy + arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseInternalEnergy_n; + arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseInternalEnergy; + arrayView4d< real64 const, multifluid::USD_PHASE_DC > m_dPhaseInternalEnergy; + +}; + +/** + * @class ElementBasedAssemblyKernelFactory + */ +class ElementBasedAssemblyKernelFactory +{ +public: + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComps the number of fluid components + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( localIndex const numComps, + localIndex const numPhases, + integer const isProducer, + globalIndex const rankOffset, + integer const useTotalMassEquation, + string const dofKey, + WellElementSubRegion const & subRegion, + MultiFluidBase const & fluid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + isothermalCompositionalMultiphaseBaseKernels:: + internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) + { + localIndex constexpr NUM_COMP = NC(); + + + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + + ElementBasedAssemblyKernel< NUM_COMP > + kernel( numPhases, isProducer, rankOffset, dofKey, subRegion, fluid, localMatrix, localRhs, kernelFlags ); + ElementBasedAssemblyKernel< NUM_COMP >::template + launch< POLICY, ElementBasedAssemblyKernel< NUM_COMP > >( subRegion.size(), kernel ); + } ); + } +}; +/** + * @class FaceBasedAssemblyKernel + * @tparam NUM_COMP number of fluid components + * @brief Define the interface for the assembly kernel in charge of flux terms + */ +template< integer NC > +class FaceBasedAssemblyKernel : public compositionalMultiphaseWellKernels::FaceBasedAssemblyKernel< NC, 1 > +{ +public: + static constexpr integer IS_THERMAL = 1; + using Base = compositionalMultiphaseWellKernels::FaceBasedAssemblyKernel< NC, IS_THERMAL >; + + // Well jacobian column and row indicies + using WJ_COFFSET = compositionalMultiphaseWellKernels::ColOffset_WellJac< NC, IS_THERMAL >; + using WJ_ROFFSET = compositionalMultiphaseWellKernels::RowOffset_WellJac< NC, IS_THERMAL >; + + using CP_Deriv = multifluid::DerivativeOffsetC< NC, IS_THERMAL >; + + using TAG = compositionalMultiphaseWellKernels::ElemTag; + + + using Base::m_isProducer; + using Base::m_dt; + using Base::m_localRhs; + using Base::m_localMatrix; + using Base::m_rankOffset; + using Base::maxNumElems; + using Base::maxStencilSize; + using Base::m_useTotalMassEquation; + + /// Compile time value for the number of components + static constexpr integer numComp = NC; + + /// Compute time value for the number of degrees of freedom + static constexpr integer numDof = WJ_COFFSET::nDer; + +/// Compile time value for the number of equations except volume and momentum + static constexpr integer numEqn = WJ_ROFFSET::nEqn - 2; + + /** + * @brief Constructor for the kernel interface + * @param[in] rankOffset the offset of my MPI rank + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dofNumberAccessor + * @param[in] compFlowAccessors + * @param[in] multiFluidAccessors + * @param[in] capPressureAccessors + * @param[in] permeabilityAccessors + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + * @param[in] kernelFlags flags packed together + */ + FaceBasedAssemblyKernel( real64 const dt, + globalIndex const rankOffset, + string const wellDofKey, + WellControls const & wellControls, + WellElementSubRegion const & subRegion, + MultiFluidBase const & fluid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags ) + : Base( dt + , rankOffset + , wellDofKey + , wellControls + , subRegion + , localMatrix + , localRhs + , kernelFlags ), + m_numPhases ( fluid.numFluidPhases()), + m_globalWellElementIndex( subRegion.getGlobalWellElementIndex() ), + m_phaseFraction( fluid.phaseFraction()), + m_dPhaseFraction( fluid.dPhaseFraction()), + m_phaseEnthalpy( fluid.phaseEnthalpy()), + m_dPhaseEnthalpy( fluid.dPhaseEnthalpy()) + { } + + struct StackVariables : public Base::StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables( localIndex const size ) + : Base::StackVariables( size ) + {} + + /// Storage for the face local residual vector (energy equation) + stackArray1d< real64, maxNumElems > localEnergyFlux; + /// Storage for the face local energy Jacobian matrix dC dP dT + stackArray2d< real64, maxNumElems * maxStencilSize * CP_Deriv::nDer > localEnergyFluxJacobian; + /// Storage for the face local Jacobian matrix dQ only + stackArray2d< real64, maxNumElems * maxStencilSize > localEnergyFluxJacobian_dQ; + }; + + GEOS_HOST_DEVICE + inline + void setup( localIndex const iwelem, StackVariables & stack ) const + { + Base::setup ( iwelem, stack ); + stack.localEnergyFlux.resize( stack.numConnectedElems ); + stack.localEnergyFluxJacobian.resize( stack.numConnectedElems, stack.stencilSize * numDof ); + stack.localEnergyFluxJacobian_dQ.resize( stack.numConnectedElems, 1 ); + for( integer i=0; i= 0 && oneSidedEqnRowIndices < m_localMatrix.numRows() ) + { + + if( !m_isProducer && m_globalWellElementIndex[iwelem] == 0 ) + { + // For top segment energy balance eqn replaced with T(n+1) - T = 0 + // No other energy balance derivatives + // Assumption is global index == 0 is top segment with fixed temp BC + for( integer i=0; i< CP_Deriv::nDer; i++ ) + { + stack.localEnergyFluxJacobian[0][i] = 0.0; + } + stack.localEnergyFluxJacobian_dQ[0][0]=0; + stack.localEnergyFlux[0]=0; + } + + + // Setup Jacobian global col indicies ( Mapping from local jac order to well jac order) + globalIndex oneSidedDofColIndices_dRate = stack.offsetCurrent + WJ_COFFSET::dQ; + globalIndex oneSidedDofColIndices_dPresCompTempUp[CP_Deriv::nDer]{}; + + int ioff=0; + oneSidedDofColIndices_dPresCompTempUp[ioff++] = stack.offsetUp + WJ_COFFSET::dP; + oneSidedDofColIndices_dPresCompTempUp[ioff++] = stack.offsetUp + WJ_COFFSET::dT; + for( integer jdof = 0; jdof < NC; ++jdof ) + { + oneSidedDofColIndices_dPresCompTempUp[ioff++] = stack.offsetUp + WJ_COFFSET::dC+ jdof; + } + + m_localMatrix.template addToRow< parallelDeviceAtomic >( oneSidedEqnRowIndices, + &oneSidedDofColIndices_dRate, + stack.localEnergyFluxJacobian_dQ[0], + 1 ); + m_localMatrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( oneSidedEqnRowIndices, + oneSidedDofColIndices_dPresCompTempUp, + stack.localEnergyFluxJacobian[0], + CP_Deriv::nDer ); + RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[oneSidedEqnRowIndices], stack.localEnergyFlux[0] ); + } + } + else // if ( stack.numConnectedElems == 2 ) + { + globalIndex row_current = stack.offsetCurrent + WJ_ROFFSET::ENERGYBAL - m_rankOffset; + globalIndex row_next = stack.offsetNext + WJ_ROFFSET::ENERGYBAL - m_rankOffset; + + if( !m_isProducer ) + { + if( row_next >= 0 && row_next < m_localMatrix.numRows() ) + { + if( m_globalWellElementIndex[stack.iwelemNext] == 0 ) + { + for( integer i=0; i= 0 && eqnRowIndices[i] < m_localMatrix.numRows() ) + { + m_localMatrix.template addToRow< parallelDeviceAtomic >( eqnRowIndices[i], + &dofColIndices_dRate, + stack.localEnergyFluxJacobian_dQ[i], + 1 ); + m_localMatrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( eqnRowIndices[i], + dofColIndices, + stack.localEnergyFluxJacobian[i], + CP_Deriv::nDer ); + RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[eqnRowIndices[i]], stack.localEnergyFlux[i] ); + } + } + } + + } + + /** + * @brief Compute the local flux contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes + * @param[in] ie the element index + * @param[inout] stack the stack variables + * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes + */ + + GEOS_HOST_DEVICE + inline + void computeFlux( localIndex const iwelem, StackVariables & stack ) const + { + Base::computeFlux ( iwelem, stack, [&] ( localIndex const & iwelemNext + , localIndex const & iwelemUp + , real64 const & currentConnRate + , real64 const (&dCompFrac_dCompDens)[NC][NC] ) + { + + if( iwelemNext < 0 && !m_isProducer ) // exit connection, injector + { + real64 eflux=0; + real64 eflux_dq=0; + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + eflux += m_phaseEnthalpy[iwelemUp][0][ip]* m_phaseFraction[iwelemUp][0][ip]; + eflux_dq += m_phaseEnthalpy[iwelemUp][0][ip] * m_phaseFraction[iwelemUp][0][ip]; + + stack.localEnergyFluxJacobian[0] [CP_Deriv::dP] += m_phaseEnthalpy[iwelemUp][0][ip]*m_dPhaseFraction[iwelemUp][0][ip][CP_Deriv::dP] + + m_dPhaseEnthalpy[iwelemUp][0][ip][CP_Deriv::dP]*m_phaseFraction[iwelemUp][0][ip]; + stack.localEnergyFluxJacobian[0] [CP_Deriv::dT] += m_phaseEnthalpy[iwelemUp][0][ip]*m_dPhaseFraction[iwelemUp][0][ip][CP_Deriv::dT] + + m_dPhaseEnthalpy[iwelemUp][0][ip][CP_Deriv::dT]*m_phaseFraction[iwelemUp][0][ip]; + + real64 dProp1_dC[numComp]{}; + applyChainRule( numComp, dCompFrac_dCompDens, m_dPhaseEnthalpy[iwelemUp][0][ip], dProp1_dC, CP_Deriv::dC ); + real64 dProp2_dC[numComp]{}; + applyChainRule( numComp, dCompFrac_dCompDens, m_dPhaseFraction[iwelemUp][0][ip], dProp2_dC, CP_Deriv::dC ); + for( integer dof=0; dof < numComp; dof++ ) + { + stack.localEnergyFluxJacobian[0] [CP_Deriv::dC+dof] += m_phaseEnthalpy[iwelemUp][0][ip]*dProp2_dC[dof] + + dProp1_dC[dof]*m_phaseFraction[iwelemUp][0][ip]; + } + } + for( integer dof=0; dof < CP_Deriv::nDer; dof++ ) + { + stack.localEnergyFluxJacobian[0] [dof] *= -m_dt*currentConnRate; + } + // Energy equation + stack.localEnergyFlux[0] = -m_dt * eflux * currentConnRate; + stack.localEnergyFluxJacobian_dQ[0][0] = -m_dt * eflux_dq; + } + else if( ( iwelemNext < 0 && m_isProducer ) || currentConnRate < 0 ) // exit connection, producer + { + real64 eflux=0; + real64 eflux_dq=0; + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + eflux += m_phaseEnthalpy[iwelemUp][0][ip]* m_phaseFraction[iwelemUp][0][ip]; + eflux_dq += m_phaseEnthalpy[iwelemUp][0][ip] * m_phaseFraction[iwelemUp][0][ip]; + stack.localEnergyFluxJacobian[0] [CP_Deriv::dP] += m_phaseEnthalpy[iwelemUp][0][ip]*m_dPhaseFraction[iwelemUp][0][ip][CP_Deriv::dP] + + m_dPhaseEnthalpy[iwelemUp][0][ip][CP_Deriv::dP]*m_phaseFraction[iwelemUp][0][ip]; + stack.localEnergyFluxJacobian[0] [CP_Deriv::dT] += m_phaseEnthalpy[iwelemUp][0][ip]*m_dPhaseFraction[iwelemUp][0][ip][CP_Deriv::dT] + + m_dPhaseEnthalpy[iwelemUp][0][ip][CP_Deriv::dT]*m_phaseFraction[iwelemUp][0][ip]; + + real64 dProp1_dC[numComp]{}; + applyChainRule( numComp, dCompFrac_dCompDens, m_dPhaseEnthalpy[iwelemUp][0][ip], dProp1_dC, CP_Deriv::dC ); + real64 dProp2_dC[numComp]{}; + applyChainRule( numComp, dCompFrac_dCompDens, m_dPhaseFraction[iwelemUp][0][ip], dProp2_dC, CP_Deriv::dC ); + for( integer dof=0; dof < numComp; dof++ ) + { + stack.localEnergyFluxJacobian[0] [CP_Deriv::dC+dof] += m_phaseEnthalpy[iwelemUp][0][ip]*dProp2_dC[dof] + + dProp1_dC[dof]*m_phaseFraction[iwelemUp][0][ip]; + } + + } + + for( integer dof=0; dof < CP_Deriv::nDer; dof++ ) + { + stack.localEnergyFluxJacobian[0][dof] *= -m_dt*currentConnRate; + } + stack.localEnergyFlux[0] = -m_dt * eflux * currentConnRate; + stack.localEnergyFluxJacobian_dQ[0][0] = -m_dt*eflux_dq; + } + else + { + real64 eflux=0; + real64 eflux_dq=0; + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + eflux += m_phaseEnthalpy[iwelemUp][0][ip]* m_phaseFraction[iwelemUp][0][ip]; + eflux_dq += m_phaseEnthalpy[iwelemUp][0][ip] * m_phaseFraction[iwelemUp][0][ip]; + + real64 dprop_dp = m_phaseEnthalpy[iwelemUp][0][ip]*m_dPhaseFraction[iwelemUp][0][ip][CP_Deriv::dP] + + m_dPhaseEnthalpy[iwelemUp][0][ip][CP_Deriv::dP]*m_phaseFraction[iwelemUp][0][ip]; + real64 dprop_dt = m_phaseEnthalpy[iwelemUp][0][ip]*m_dPhaseFraction[iwelemUp][0][ip][CP_Deriv::dT] + + m_dPhaseEnthalpy[iwelemUp][0][ip][CP_Deriv::dT]*m_phaseFraction[iwelemUp][0][ip]; + + stack.localEnergyFluxJacobian[TAG::NEXT ] [CP_Deriv::dP] += dprop_dp; + stack.localEnergyFluxJacobian[TAG::NEXT] [CP_Deriv::dT] += dprop_dt; + + stack.localEnergyFluxJacobian[TAG::CURRENT ] [CP_Deriv::dP] += dprop_dp; + stack.localEnergyFluxJacobian[TAG::CURRENT] [CP_Deriv::dT] += dprop_dt; + + real64 dPE_dC[numComp]{}; + applyChainRule( numComp, dCompFrac_dCompDens, m_dPhaseEnthalpy[iwelemUp][0][ip], dPE_dC, CP_Deriv::dC ); + real64 dPF_dC[numComp]{}; + applyChainRule( numComp, dCompFrac_dCompDens, m_dPhaseFraction[iwelemUp][0][ip], dPF_dC, CP_Deriv::dC ); + + for( integer dof=0; dof < numComp; dof++ ) + { + stack.localEnergyFluxJacobian[TAG::NEXT ][CP_Deriv::dC+dof] += m_phaseEnthalpy[iwelemUp][0][ip]*dPF_dC[dof] + +dPE_dC[dof]*m_phaseFraction[iwelemUp][0][ip]; + stack.localEnergyFluxJacobian[TAG::CURRENT ][CP_Deriv::dC+dof] += m_phaseEnthalpy[iwelemUp][0][ip]*dPF_dC[dof] + +dPE_dC[dof]*m_phaseFraction[iwelemUp][0][ip]; + } + } + stack.localEnergyFlux[TAG::NEXT ] = m_dt * eflux * currentConnRate; + stack.localEnergyFlux[TAG::CURRENT ] = -m_dt * eflux * currentConnRate; + stack.localEnergyFluxJacobian_dQ [TAG::NEXT ][0] = m_dt * eflux_dq; + stack.localEnergyFluxJacobian_dQ [TAG::CURRENT][0] = -m_dt * eflux_dq; + for( integer dof=0; dof < CP_Deriv::nDer; dof++ ) + { + stack.localEnergyFluxJacobian[TAG::NEXT ][dof] *= m_dt*currentConnRate; + stack.localEnergyFluxJacobian[TAG::CURRENT ][dof] *= -m_dt*currentConnRate; + } + } + + } ); + + } + + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElements the number of elements + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack + * variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numElements, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + forAll< POLICY >( numElements, [=] GEOS_HOST_DEVICE ( localIndex const ie ) + { + typename KERNEL_TYPE::StackVariables stack( 1 ); + + kernelComponent.setup( ie, stack ); + kernelComponent.computeFlux( ie, stack ); + kernelComponent.complete( ie, stack ); + } ); + } + +protected: + /// Number of phases + integer const m_numPhases; + + /// Global index of local element + arrayView1d< globalIndex const > m_globalWellElementIndex; + + /// Element phase fraction + arrayView3d< real64 const, multifluid::USD_PHASE > const m_phaseFraction; + arrayView4d< real64 const, multifluid::USD_PHASE_DC > const m_dPhaseFraction; + + /// Views on phase enthalpy + arrayView3d< real64 const, multifluid::USD_PHASE > m_phaseEnthalpy; + arrayView4d< real64 const, multifluid::USD_PHASE_DC > m_dPhaseEnthalpy; + + +}; + +/** + * @class FaceBasedAssemblyKernelFactory + */ +class FaceBasedAssemblyKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComps the number of fluid components + * @param[in] dt time step size + * @param[in] rankOffset the offset of my MPI rank + * @param[in] useTotalMassEquation flag specifying whether to replace one component bal eqn with total mass eqn + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] wellControls object holding well control/constraint information + * @param[in] subregion well subregion + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComps, + real64 const dt, + globalIndex const rankOffset, + integer const useTotalMassEquation, + string const dofKey, + WellControls const & wellControls, + WellElementSubRegion const & subRegion, + MultiFluidBase const & fluid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) + { + integer constexpr NUM_COMP = NC(); + + + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + + + using kernelType = FaceBasedAssemblyKernel< NUM_COMP >; + + + kernelType kernel( dt, rankOffset, dofKey, wellControls, subRegion, fluid, localMatrix, localRhs, kernelFlags ); + kernelType::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } +}; + +} // end namespace thermalCompositionalMultiphaseWellKernels + +} // end namespace geos + +#endif // GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_THERMALCOMPOSITIONALMULTIPHASEWELLKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalSinglePhaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalSinglePhaseWellKernels.hpp new file mode 100644 index 00000000000..c55a1f2991e --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalSinglePhaseWellKernels.hpp @@ -0,0 +1,246 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file SinglePhaseWellKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_THERMALSINGLEPHASEWELLKERNELS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_THERMALSINGLEPHASEWELLKERNELS_HPP + +#include "constitutive/fluid/singlefluid/SingleFluidFields.hpp" +#include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "mesh/ElementRegionManager.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "physicsSolvers/fluidFlow/wells/WellControls.hpp" +#include "physicsSolvers/SolverBaseKernels.hpp" + +namespace geos +{ + +namespace thermalSinglePhaseWellKernels +{ + + + +/******************************** ElementBasedAssemblyKernel ********************************/ + +/** + * @class ElementBasedAssemblyKernel + * @tparam NUM_DOF number of degrees of freedom + * @brief Define the interface for the assembly kernel in charge of accumulation and volume balance + */ +template< integer NUM_DOF > +class ElementBasedAssemblyKernel : public singlePhaseWellKernels::ElementBasedAssemblyKernel< NUM_DOF > +{ +public: + using Base = singlePhaseWellKernels::ElementBasedAssemblyKernel< NUM_DOF >; + using Base::m_rankOffset; + using Base::m_wellElemDofNumber; + using Base::m_elemGhostRank; + using Base::m_wellElemVolume; + using Base::m_wellElemDensity; + using Base::m_wellElemDensity_n; + using Base::m_dWellElemDensity_dPressure; + using Base::m_localMatrix; + using Base::m_localRhs; + using ROFFSET = singlePhaseWellKernels::RowOffset; + using COFFSET = singlePhaseWellKernels::ColOffset; + + /// Compute time value for the number of degrees of freedom + static constexpr integer numDof = NUM_DOF; + + /// Compute time value for the number of equations + static constexpr integer numEqn = NUM_DOF; + + /** + * @brief Constructor + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + ElementBasedAssemblyKernel( globalIndex const rankOffset, + string const dofKey, + ElementSubRegionBase const & subRegion, + constitutive::SingleFluidBase const & fluid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + : Base( rankOffset, dofKey, subRegion, fluid, localMatrix, localRhs ), + m_dWellElemDensity_dTemperature( fluid.dDensity_dTemperature() ), + m_internalEnergy( fluid.internalEnergy() ), + m_internalEnergy_n( fluid.internalEnergy_n() ), + m_dInternalEnergy_dPres( fluid.dInternalEnergy_dPressure() ), + m_dInternalEnergy_dTemp( fluid.dInternalEnergy_dTemperature() ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables : public Base::StackVariables + { +public: + GEOS_HOST_DEVICE + StackVariables() + : Base::StackVariables() + {} + using Base::StackVariables::eqnRowIndices; + using Base::StackVariables::dofColIndices; + using Base::StackVariables::localJacobian; + using Base::StackVariables::localResidual; + using Base::StackVariables::localRow; + using Base::StackVariables::volume; + using Base::StackVariables::density; + using Base::StackVariables::density_n; + using Base::StackVariables::dDensity_dPres; + + }; + /** + * @brief Getter for the ghost rank of an element + * @param[in] ei the element index + * @return the ghost rank of the element + */ + GEOS_HOST_DEVICE + integer elemGhostRank( localIndex const ei ) const + { return m_elemGhostRank( ei ); } + + + + /** + * @brief Compute the local accumulation contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + * @param[in] phaseAmountKernelOp the function used to customize the kernel + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void computeAccumulation( localIndex const iwelem, + StackVariables & stack ) const + { + Base::computeAccumulation( iwelem, stack, [&]( ) + { + + // Step 1: assemble the derivatives of the mass balance equation w.r.t temperature + stack.localJacobian[0][numDof-1] = stack.volume * m_dWellElemDensity_dTemperature[iwelem][0]; + + // Step 2: assemble the fluid part of the accumulation term of the energy equation + real64 const fluidEnergy = stack.volume * stack.density * m_internalEnergy[iwelem][0]; + real64 const fluidEnergy_n = stack.volume * stack.density_n * m_internalEnergy_n[iwelem][0]; + + real64 const dFluidEnergy_dP = stack.volume * stack.dDensity_dPres * m_internalEnergy[iwelem][0] + + stack.volume * stack.density * m_dInternalEnergy_dPres[iwelem][0]; + + + real64 const dFluidEnergy_dT = stack.volume * m_dWellElemDensity_dTemperature[iwelem][0] * m_internalEnergy[iwelem][0] + + stack.volume * stack.density * m_dInternalEnergy_dTemp[iwelem][0]; + + // local accumulation + stack.localResidual[numEqn-1] = fluidEnergy - fluidEnergy_n; + + // derivatives w.r.t. pressure and temperature + stack.localJacobian[numEqn-1][0] = dFluidEnergy_dP; + stack.localJacobian[numEqn-1][numDof-1] = dFluidEnergy_dT; + } ); + } + + + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElems the number of elements + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + + forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const iwelem ) + { + if( kernelComponent.elemGhostRank( iwelem ) >= 0 ) + { + return; + } + typename KERNEL_TYPE::StackVariables stack; + kernelComponent.setup( iwelem, stack ); + kernelComponent.computeAccumulation( iwelem, stack ); + kernelComponent.complete( iwelem, stack ); + + } ); + } + +protected: + + /// View on derivative of fluid density w.r.t temperature + arrayView2d< real64 const > const m_dWellElemDensity_dTemperature; + + /// Views on fluid internal energy + arrayView2d< real64 const > const m_internalEnergy; + arrayView2d< real64 const > const m_internalEnergy_n; + arrayView2d< real64 const > const m_dInternalEnergy_dPres; + arrayView2d< real64 const > const m_dInternalEnergy_dTemp; + +}; + + +/** + * @class ElementBasedAssemblyKernelFactory + */ +class ElementBasedAssemblyKernelFactory +{ +public: + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( globalIndex const rankOffset, + string const dofKey, + ElementSubRegionBase const & subRegion, + constitutive::SingleFluidBase const & fluid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + integer constexpr NUM_DOF = 2; + ElementBasedAssemblyKernel< NUM_DOF > + kernel( rankOffset, dofKey, subRegion, fluid, localMatrix, localRhs ); + ElementBasedAssemblyKernel< NUM_DOF >::template + launch< POLICY, ElementBasedAssemblyKernel< NUM_DOF > >( subRegion.size(), kernel ); + + } +}; +} // end namespace singlePhaseWellKernels + +} // end namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_SINGLEPHASEWELLKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellFields.hpp new file mode 100644 index 00000000000..2c6549958b0 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellFields.hpp @@ -0,0 +1,59 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file WellFields.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_WELLFIELDS_HPP_ +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_WELLFIELDS_HPP_ + +#include "common/DataLayouts.hpp" +#include "mesh/MeshFields.hpp" + +namespace geos +{ +/** + * A scope for field traits. + */ +namespace fields +{ + +namespace well +{ + +DECLARE_FIELD( energyPerforationFlux, + "energyPerforationFlux", + array1d< real64 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Energy perforation flux" ); + +DECLARE_FIELD( dEnergyPerforationFlux, + "dEnergyPerforationFlux", + array3d< real64 >, + 0, + NOPLOT, + NO_WRITE, + "Derivative of energy perforation flux with respect to pressure temperature and global component density" ); + + +} + +} + +} + +#endif // GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_WELLFIELDS_HPP_ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index 2b114b13f70..b87c37c7dd3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -28,6 +28,7 @@ #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" +#include "physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp" #include "fileIO/Outputs/OutputBase.hpp" namespace geos @@ -39,10 +40,18 @@ using namespace constitutive; WellSolverBase::WellSolverBase( string const & name, Group * const parent ) : SolverBase( name, parent ), + m_numPhases( 0 ), + m_numComponents( 0 ), m_numDofPerWellElement( 0 ), m_numDofPerResElement( 0 ), - m_ratesOutputDir( joinPath( OutputBase::getOutputDirectory(), name + "_rates" ) ) + m_isThermal( 0 ), + m_ratesOutputDir( joinPath( OutputBase::getOutputDirectory(), name + "_rates" )) { + registerWrapper( viewKeyStruct::isThermalString(), &m_isThermal ). + setApplyDefaultValue( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Flag indicating whether the problem is thermal or not." ); + this->getWrapper< string >( viewKeyStruct::discretizationString() ). setInputFlag( InputFlags::FALSE ); @@ -55,9 +64,9 @@ WellSolverBase::WellSolverBase( string const & name, addLogLevel< logInfo::Crossflow >(); } -Group * WellSolverBase::createChild( string const & childKey, string const & childName ) +Group *WellSolverBase::createChild( string const & childKey, string const & childName ) { - Group * rval = nullptr; + Group *rval = nullptr; if( childKey == keys::wellControls ) { @@ -75,13 +84,17 @@ void WellSolverBase::expandObjectCatalogs() createChild( keys::wellControls, keys::wellControls ); } - WellSolverBase::~WellSolverBase() = default; void WellSolverBase::postInputInitialization() { SolverBase::postInputInitialization(); + // 1. Set key dimensions of the problem + m_numDofPerWellElement = m_isThermal ? m_numComponents + 2 : m_numComponents + 1; // 1 pressure connectionRate + temp if thermal + m_numDofPerResElement = m_isThermal ? m_numComponents + 1: m_numComponents; // 1 pressure + temp if thermal + + // create dir for rates output if( m_writeCSV > 0 ) { @@ -113,7 +126,10 @@ void WellSolverBase::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< fields::well::pressure_n >( getName() ); subRegion.registerField< fields::well::temperature >( getName() ); - subRegion.registerField< fields::well::temperature_n >( getName() ); + if( isThermal() ) + { + subRegion.registerField< fields::well::temperature_n >( getName() ); + } subRegion.registerField< fields::well::gravityCoefficient >( getName() ); @@ -148,19 +164,16 @@ void WellSolverBase::initializePostSubGroups() void WellSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const { SolverBase::setConstitutiveNamesCallSuper( subRegion ); - subRegion.registerWrapper< string >( viewKeyStruct::fluidNamesString() ). - setPlotLevel( PlotLevel::NOPLOT ). - setRestartFlags( RestartFlags::NO_WRITE ). - setSizedFromParent( 0 ); + subRegion.registerWrapper< string >( viewKeyStruct::fluidNamesString()).setPlotLevel( PlotLevel::NOPLOT ).setRestartFlags( RestartFlags::NO_WRITE ).setSizedFromParent( 0 ); } void WellSolverBase::setupDofs( DomainPartition const & domain, DofManager & dofManager ) const { map< std::pair< string, string >, array1d< string > > meshTargets; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshBodyName, - MeshLevel const & meshLevel, - arrayView1d< string const > const & regionNames ) + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const & meshBodyName, + MeshLevel const & meshLevel, + arrayView1d< string const > const & regionNames ) { array1d< string > regions; ElementRegionManager const & elementRegionManager = meshLevel.getElemManager(); @@ -185,58 +198,114 @@ void WellSolverBase::setupDofs( DomainPartition const & domain, } void WellSolverBase::implicitStepSetup( real64 const & time_n, - real64 const & GEOS_UNUSED_PARAM( dt ), + real64 const & dt, DomainPartition & domain ) { // Initialize the primary and secondary variables for the first time step - if( time_n <= 0.0 ) - { - initializeWells( domain ); - } + + initializeWells( domain, time_n, dt ); } -void WellSolverBase::assembleSystem( real64 const time, - real64 const dt, - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) + +void WellSolverBase::shutInWell( real64 const time_n, + real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) { - // assemble the accumulation term in the mass balance equations - assembleAccumulationTerms( domain, dofManager, localMatrix, localRhs ); + GEOS_MARK_FUNCTION; + GEOS_UNUSED_VAR( time_n ); + GEOS_UNUSED_VAR( dt ); - // then assemble the flux terms in the mass balance equations - assembleFluxTerms( dt, domain, dofManager, localMatrix, localRhs ); + string const wellDofKey = dofManager.getKey( wellElementDofName() ); - // then assemble the volume balance equations - assembleVolumeBalanceTerms( domain, dofManager, localMatrix, localRhs ); + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) + { - // then assemble the pressure relations between well elements - assemblePressureRelations( time, dt, domain, dofManager, localMatrix, localRhs ); + ElementRegionManager const & elemManager = mesh.getElemManager(); - // then compute the perforation rates (later assembled by the coupled solver) - computePerforationRates( domain ); + elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, + [&]( localIndex const, + WellElementSubRegion const & subRegion ) + { + + globalIndex const rankOffset = dofManager.rankOffset(); + + arrayView1d< integer const > const ghostRank = + subRegion.getReference< array1d< integer > >( ObjectManagerBase::viewKeyStruct::ghostRankString() ); + arrayView1d< globalIndex const > const dofNumber = + subRegion.getReference< array1d< globalIndex > >( wellDofKey ); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( ghostRank[ei] >= 0 ) + { + return; + } + + globalIndex const dofIndex = dofNumber[ei]; + localIndex const localRow = dofIndex - rankOffset; + + + real64 unity = 1.0; + for( integer i=0; i < m_numDofPerWellElement; i++ ) + { + globalIndex const cindex = dofNumber[ei] + i; + globalIndex const rindex = localRow+i; + localMatrix.template addToRow< serialAtomic >( rindex, + &cindex, + &unity, + 1 ); + localRhs[cindex] = 0.0; + } - // then apply a special treatment to the wells that are shut - shutDownWell( time, dt, domain, dofManager, localMatrix, localRhs ); + } ); + } ); + } ); } + void WellSolverBase::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, WellElementSubRegion & subRegion ) - { - updateSubRegionState( subRegion ); - } ); + { updateSubRegionState( subRegion ); } ); } ); } +void WellSolverBase::assembleSystem( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + string const wellDofKey = dofManager.getKey( wellElementDofName()); + + // assemble the accumulation term in the mass balance equations + assembleAccumulationTerms( time, dt, domain, dofManager, localMatrix, localRhs ); + + // then assemble the pressure relations between well elements + assemblePressureRelations( time, dt, domain, dofManager, localMatrix, localRhs ); + // then compute the perforation rates (later assembled by the coupled solver) + computePerforationRates( time, dt, domain ); + + // then assemble the flux terms in the mass balance equations + // get a reference to the degree-of-freedom numbers + // then assemble the flux terms in the mass balance equations + assembleFluxTerms( time, dt, domain, dofManager, localMatrix, localRhs ); + +} + void WellSolverBase::initializePostInitialConditionsPreSubGroups() { SolverBase::initializePostInitialConditionsPreSubGroups(); @@ -244,15 +313,13 @@ void WellSolverBase::initializePostInitialConditionsPreSubGroups() DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); // make sure that nextWellElementIndex is up-to-date (will be used in well initialization and assembly) - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, WellElementSubRegion & subRegion ) - { - subRegion.reconstructLocalConnectivity(); - } ); + { subRegion.reconstructLocalConnectivity(); } ); } ); // Precompute solver-specific constant data (e.g. gravity-coefficient) @@ -262,9 +329,9 @@ void WellSolverBase::initializePostInitialConditionsPreSubGroups() void WellSolverBase::precomputeData( DomainPartition & domain ) { R1Tensor const gravVector = gravityVector(); - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, WellElementSubRegion & subRegion ) @@ -292,16 +359,19 @@ void WellSolverBase::precomputeData( DomainPartition & domain ) } ); // set the reference well element where the BHP control is applied - wellControls.setReferenceGravityCoef( refElev * gravVector[ 2 ] ); - + wellControls.setReferenceGravityCoef( refElev * gravVector[2] ); } ); } ); } WellControls & WellSolverBase::getWellControls( WellElementSubRegion const & subRegion ) -{ return this->getGroup< WellControls >( subRegion.getWellControlsName() ); } +{ + return this->getGroup< WellControls >( subRegion.getWellControlsName()); +} WellControls const & WellSolverBase::getWellControls( WellElementSubRegion const & subRegion ) const -{ return this->getGroup< WellControls >( subRegion.getWellControlsName() ); } +{ + return this->getGroup< WellControls >( subRegion.getWellControlsName()); +} } // namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp index 1397512189e..628db6681cf 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp @@ -98,6 +98,12 @@ class WellSolverBase : public SolverBase */ localIndex numDofPerResElement() const { return m_numDofPerResElement; } + /** + * @brief getter for iso/thermal switch + * @return True if thermal + */ + integer isThermal() const { return m_isThermal; } + /** * @brief get the name of DOF defined on well elements * @return name of the DOF field used by derived solver type @@ -191,8 +197,9 @@ class WellSolverBase : public SolverBase * @param matrix the system matrix * @param rhs the system right-hand side vector */ - virtual void assembleFluxTerms( real64 const dt, - DomainPartition const & domain, + virtual void assembleFluxTerms( real64 const & time_n, + real64 const & dt, + DomainPartition & domain, DofManager const & dofManager, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) = 0; @@ -204,23 +211,13 @@ class WellSolverBase : public SolverBase * @param matrix the system matrix * @param rhs the system right-hand side vector */ - virtual void assembleAccumulationTerms( DomainPartition const & domain, + virtual void assembleAccumulationTerms( real64 const & time_n, + real64 const & dt, + DomainPartition & domain, DofManager const & dofManager, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) = 0; - /** - * @brief assembles the volume balance terms for all well elements - * @param domain the physical domain object - * @param dofManager degree-of-freedom manager associated with the linear system - * @param matrix the system matrix - * @param rhs the system right-hand side vector - */ - virtual void assembleVolumeBalanceTerms( DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) = 0; - /** * @brief assembles the pressure relations at all connections between well elements except at the well head * @param time_n time at the beginning of the time step @@ -237,6 +234,23 @@ class WellSolverBase : public SolverBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) = 0; + + /** + * @brief apply a special treatment to the wells that are shut (set Aww=I , Awr=Arw=0) + * @param time_n the time at the previous converged time step + * @param dt the time step size + * @param domain the physical domain object + * @param dofManager degree-of-freedom manager associated with the linear system + * @param matrix the system matrix + * @param rhs the system right-hand side vector + */ + void shutInWell( real64 const time_n, + real64 const dt, + DomainPartition const & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ); + /** * @brief apply a special treatment to the wells that are shut * @param time_n the time at the previous converged time step @@ -263,17 +277,20 @@ class WellSolverBase : public SolverBase * @brief Recompute all dependent quantities from primary variables (including constitutive models) * @param subRegion the well subRegion containing the well elements and their associated fields */ - virtual void updateSubRegionState( WellElementSubRegion & subRegion ) = 0; + virtual real64 updateSubRegionState( WellElementSubRegion & subRegion ) = 0; /** * @brief Recompute the perforation rates for all the wells * @param domain the domain containing the mesh and fields */ - virtual void computePerforationRates( DomainPartition & domain ) = 0; + virtual void computePerforationRates( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) = 0; struct viewKeyStruct : SolverBase::viewKeyStruct { static constexpr char const * fluidNamesString() { return "fluidNames"; } + static constexpr char const * isThermalString() { return "isThermal"; } static constexpr char const * writeCSVFlagString() { return "writeCSV"; } }; @@ -300,7 +317,7 @@ class WellSolverBase : public SolverBase * @brief Initialize all the primary and secondary variables in all the wells * @param domain the domain containing the well manager to access individual wells */ - virtual void initializeWells( DomainPartition & domain ) = 0; + virtual void initializeWells( DomainPartition & domain, real64 const & time_n, real64 const & dt ) = 0; /** * @brief Make sure that the well constraints are compatible @@ -319,15 +336,26 @@ class WellSolverBase : public SolverBase /// name of the flow solver string m_flowSolverName; + /// the max number of fluid phases + integer m_numPhases; + + /// the number of fluid components + integer m_numComponents; + /// the number of Degrees of Freedom per well element integer m_numDofPerWellElement; /// the number of Degrees of Freedom per reservoir element integer m_numDofPerResElement; + /// flag indicating whether thermal formulation is used + integer m_isThermal; + integer m_writeCSV; string const m_ratesOutputDir; +/// name of the fluid constitutive model used as a reference for component/phase description + string m_referenceFluidModelName; }; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp index 244b24d4ec4..1c6f4d4a748 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp @@ -50,7 +50,7 @@ DECLARE_FIELD( pressure_n, "Pressure at the previous converged time step" ); DECLARE_FIELD( temperature, - "wellTemperature", + "temperature", array1d< real64 >, 0, LEVEL_0, @@ -58,7 +58,7 @@ DECLARE_FIELD( temperature, "Temperature" ); DECLARE_FIELD( temperature_n, - "wellTemperature_n", + "temperature_n", array1d< real64 >, 0, NOPLOT, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellTags.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellTags.hpp new file mode 100644 index 00000000000..dc75bcbdc9a --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellTags.hpp @@ -0,0 +1,110 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file WellTags.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_WELLTAGS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_WELLTAGS_HPP + + +namespace geos +{ + +namespace wellTags +{ + +static constexpr real64 minDensForDivision = 1e-10; + +// tag to access well and reservoir elements in perforation rates computation +struct SubRegionTag +{ + static constexpr integer RES = 0; + static constexpr integer WELL = 1; +}; + +// tag to access the next and current well elements of a connection +struct ElemTag +{ + static constexpr integer CURRENT = 0; + static constexpr integer NEXT = 1; +}; + +// define the column offset of the derivatives +struct ColOffset +{ + static constexpr integer DPRES = 0; + static constexpr integer DCOMP = 1; +}; + +template< integer NC, integer IS_THERMAL > +struct ColOffset_WellJac; + +template< integer NC > +struct ColOffset_WellJac< NC, 0 > +{ + static constexpr integer dP = 0; + static constexpr integer dC = 1; + static constexpr integer dQ = dC + NC; + static integer constexpr nDer = dQ + 1; + +}; + +template< integer NC > +struct ColOffset_WellJac< NC, 1 > +{ + static constexpr integer dP = 0; + static constexpr integer dC = 1; + static constexpr integer dQ = dC + NC; + static constexpr integer dT = dQ+1; + /// number of derivatives + static integer constexpr nDer = dT + 1; +}; + +// define the row offset of the residual equations +struct RowOffset +{ + static constexpr integer CONTROL = 0; + static constexpr integer MASSBAL = 1; +}; + +template< integer NC, integer IS_THERMAL > +struct RowOffset_WellJac; + +template< integer NC > +struct RowOffset_WellJac< NC, 0 > +{ + static constexpr integer CONTROL = 0; + static constexpr integer MASSBAL = 1; + static constexpr integer VOLBAL = MASSBAL + NC; + static constexpr integer nEqn = VOLBAL+1; +}; + +template< integer NC > +struct RowOffset_WellJac< NC, 1 > +{ + static constexpr integer CONTROL = 0; + static constexpr integer MASSBAL = 1; + static constexpr integer VOLBAL = MASSBAL + NC; + static constexpr integer ENERGYBAL = VOLBAL+1; + static constexpr integer nEqn = ENERGYBAL+1; + +}; + +} // end namespace wellTags + +} // end namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_WELLTAGS_HPP diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index 5853f513231..fcc7bdf2227 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -24,6 +24,7 @@ #include "dataRepository/LogLevelsInfo.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "mesh/PerforationFields.hpp" +#include "physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" @@ -34,6 +35,7 @@ #include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" #include "physicsSolvers/multiphysics/MultiphasePoromechanics.hpp" + namespace geos { @@ -80,6 +82,11 @@ setMGRStrategy() // add Reservoir m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirHybridFVM; } + else if( isThermal() ) + { + m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::thermalCompositionalMultiphaseReservoirFVM; + + } else { // add Reservoir @@ -155,7 +162,7 @@ addCouplingSparsityPattern( DomainPartition const & domain, integer const wellNDOF = Base::wellSolver()->numDofPerWellElement(); integer constexpr maxNumComp = MultiFluidBase::MAX_NUM_COMPONENTS; - integer constexpr maxNumDof = maxNumComp + 1; + integer constexpr maxNumDof = maxNumComp + 2; string const wellDofKey = dofManager.getKey( Base::wellSolver()->wellElementDofName() ); string const resDofKey = dofManager.getKey( Base::wellSolver()->resElementDofName() ); @@ -251,10 +258,6 @@ assembleCouplingTerms( real64 const time_n, { using namespace compositionalMultiphaseUtilities; - using TAG = compositionalMultiphaseWellKernels::SubRegionTag; - using ROFFSET = compositionalMultiphaseWellKernels::RowOffset; - using COFFSET = compositionalMultiphaseWellKernels::ColOffset; - GEOS_THROW_IF( !Base::m_isWellTransmissibilityComputed, GEOS_FMT( "{} {}: The well transmissibility has not been computed yet", this->getCatalogName(), this->getName() ), @@ -268,11 +271,7 @@ assembleCouplingTerms( real64 const time_n, ElementRegionManager const & elemManager = mesh.getElemManager(); - integer constexpr MAX_NUM_COMP = MultiFluidBase::MAX_NUM_COMPONENTS; - integer constexpr MAX_NUM_DOF = MAX_NUM_COMP + 1; - integer const numComps = Base::wellSolver()->numFluidComponents(); - integer const resNumDofs = Base::wellSolver()->numDofPerResElement(); string const resDofKey = dofManager.getKey( Base::wellSolver()->resElementDofName() ); ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > const resDofNumberAccessor = @@ -284,6 +283,8 @@ assembleCouplingTerms( real64 const time_n, elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, WellElementSubRegion const & subRegion ) { + string const & fluidName = this->flowSolver()->template getConstitutiveName< MultiFluidBase >( subRegion ); + MultiFluidBase const & fluid = subRegion.getConstitutiveModel< MultiFluidBase >( fluidName ); // if the well is shut, we neglect reservoir-well flow that may occur despite the zero rate // therefore, we do not want to compute perforation rates and we simply assume they are zero @@ -297,123 +298,55 @@ assembleCouplingTerms( real64 const time_n, return; } - areWellsShut = 0; - PerforationData const * const perforationData = subRegion.getPerforationData(); // get the degrees of freedom string const wellDofKey = dofManager.getKey( Base::wellSolver()->wellElementDofName() ); - arrayView1d< globalIndex const > const & wellElemDofNumber = - subRegion.getReference< array1d< globalIndex > >( wellDofKey ); - - // get well variables on perforations - arrayView2d< real64 const > const & compPerfRate = - perforationData->getField< fields::well::compPerforationRate >(); - arrayView3d< real64 const > const & dCompPerfRate_dPres = - perforationData->getField< fields::well::dCompPerforationRate_dPres >(); - arrayView4d< real64 const > const & dCompPerfRate_dComp = - perforationData->getField< fields::well::dCompPerforationRate_dComp >(); - - arrayView1d< localIndex const > const & perfWellElemIndex = - perforationData->getField< fields::perforation::wellElementIndex >(); - - // get the element region, subregion, index - arrayView1d< localIndex const > const & resElementRegion = - perforationData->getField< fields::perforation::reservoirElementRegion >(); - arrayView1d< localIndex const > const & resElementSubRegion = - perforationData->getField< fields::perforation::reservoirElementSubRegion >(); - arrayView1d< localIndex const > const & resElementIndex = - perforationData->getField< fields::perforation::reservoirElementIndex >(); - - bool const useTotalMassEquation = this->flowSolver()->useTotalMassEquation() > 0; - - RAJA::ReduceSum< parallelDeviceReduce, integer > numCrossflowPerforations( 0 ); + areWellsShut = 0; - // loop over the perforations and add the rates to the residual and jacobian - forAll< parallelDevicePolicy<> >( perforationData->size(), [=] GEOS_HOST_DEVICE ( localIndex const iperf ) + integer useTotalMassEquation=Base::wellSolver()->useTotalMassEquation(); + integer numCrossflowPerforations=0; + if( isThermal ( ) ) { - // local working variables and arrays - stackArray1d< localIndex, 2 * MAX_NUM_COMP > eqnRowIndices( 2 * numComps ); - stackArray1d< globalIndex, 2 * MAX_NUM_DOF > dofColIndices( 2 * resNumDofs ); - - stackArray1d< real64, 2 * MAX_NUM_COMP > localPerf( 2 * numComps ); - stackArray2d< real64, 2 * MAX_NUM_COMP * 2 * MAX_NUM_DOF > localPerfJacobian( 2 * numComps, 2 * resNumDofs ); - - // get the reservoir (sub)region and element indices - localIndex const er = resElementRegion[iperf]; - localIndex const esr = resElementSubRegion[iperf]; - localIndex const ei = resElementIndex[iperf]; - - // get the well element index for this perforation - localIndex const iwelem = perfWellElemIndex[iperf]; - globalIndex const resOffset = resDofNumber[er][esr][ei]; - globalIndex const wellElemOffset = wellElemDofNumber[iwelem]; - - for( integer ic = 0; ic < numComps; ++ic ) - { - eqnRowIndices[TAG::RES * numComps + ic] = LvArray::integerConversion< localIndex >( resOffset - rankOffset ) + ic; - eqnRowIndices[TAG::WELL * numComps + ic] = LvArray::integerConversion< localIndex >( wellElemOffset - rankOffset ) + ROFFSET::MASSBAL + ic; - } - for( integer jdof = 0; jdof < resNumDofs; ++jdof ) - { - dofColIndices[TAG::RES * resNumDofs + jdof] = resOffset + jdof; - dofColIndices[TAG::WELL * resNumDofs + jdof] = wellElemOffset + COFFSET::DPRES + jdof; - } - - // populate local flux vector and derivatives - for( integer ic = 0; ic < numComps; ++ic ) - { - localPerf[TAG::RES * numComps + ic] = dt * compPerfRate[iperf][ic]; - localPerf[TAG::WELL * numComps + ic] = -dt * compPerfRate[iperf][ic]; - - if( detectCrossflow ) - { - if( compPerfRate[iperf][ic] > LvArray::NumericLimits< real64 >::epsilon ) - { - numCrossflowPerforations += 1; - } - } - - for( integer ke = 0; ke < 2; ++ke ) - { - localIndex const localDofIndexPres = ke * resNumDofs; - localPerfJacobian[TAG::RES * numComps + ic][localDofIndexPres] = dt * dCompPerfRate_dPres[iperf][ke][ic]; - localPerfJacobian[TAG::WELL * numComps + ic][localDofIndexPres] = -dt * dCompPerfRate_dPres[iperf][ke][ic]; - - for( integer jc = 0; jc < numComps; ++jc ) - { - localIndex const localDofIndexComp = localDofIndexPres + jc + 1; - localPerfJacobian[TAG::RES * numComps + ic][localDofIndexComp] = dt * dCompPerfRate_dComp[iperf][ke][ic][jc]; - localPerfJacobian[TAG::WELL * numComps + ic][localDofIndexComp] = -dt * dCompPerfRate_dComp[iperf][ke][ic][jc]; - } - } - } - - if( useTotalMassEquation ) - { - // Apply equation/variable change transformation(s) - stackArray1d< real64, 2 * MAX_NUM_DOF > work( 2 * resNumDofs ); - shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComps, numComps, resNumDofs * 2, 2, localPerfJacobian, work ); - shiftBlockElementsAheadByOneAndReplaceFirstElementWithSum( numComps, numComps, 2, localPerf ); - } - - for( localIndex i = 0; i < localPerf.size(); ++i ) - { - if( eqnRowIndices[i] >= 0 && eqnRowIndices[i] < localMatrix.numRows() ) - { - localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic >( eqnRowIndices[i], - dofColIndices.data(), - localPerfJacobian[i].dataIfContiguous(), - 2 * resNumDofs ); - RAJA::atomicAdd( parallelDeviceAtomic{}, &localRhs[eqnRowIndices[i]], localPerf[i] ); - } - } - } ); - + coupledReservoirAndWellKernels:: + ThermalCompositionalMultiPhaseFluxKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( numComps, + wellControls.isProducer(), + dt, + rankOffset, + wellDofKey, + subRegion, + resDofNumber, + perforationData, + fluid, + useTotalMassEquation, + detectCrossflow, + numCrossflowPerforations, + localRhs, + localMatrix ); + } + else + { + coupledReservoirAndWellKernels:: + IsothermalCompositionalMultiPhaseFluxKernelFactory:: + createAndLaunch< parallelDevicePolicy<> >( numComps, + dt, + rankOffset, + wellDofKey, + subRegion, + resDofNumber, + perforationData, + fluid, + useTotalMassEquation, + detectCrossflow, + numCrossflowPerforations, + localRhs, + localMatrix ); + } - if( detectCrossflow ) // check to avoid communications if not needed + if( detectCrossflow ) // check to avoid communications if not needed { - globalIndex const totalNumCrossflowPerforations = MpiWrapper::sum( numCrossflowPerforations.get() ); + globalIndex const totalNumCrossflowPerforations = MpiWrapper::sum( numCrossflowPerforations ); if( totalNumCrossflowPerforations > 0 ) { GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Crossflow, GEOS_FMT( "CompositionalMultiphaseReservoir '{}': Warning! Crossflow detected at {} perforations in well {}" @@ -422,12 +355,12 @@ assembleCouplingTerms( real64 const time_n, WellControls::viewKeyStruct::enableCrossflowString(), wellControls.getName() )); } } - } ); - // update dynamically the MGR recipe to optimize the linear solve if all wells are shut - areWellsShut = MpiWrapper::min( areWellsShut ); - m_linearSolverParameters.get().mgr.areWellsShut = areWellsShut; + // update dynamically the MGR recipe to optimize the linear solve if all wells are shut + areWellsShut = MpiWrapper::min( areWellsShut ); + m_linearSolverParameters.get().mgr.areWellsShut = areWellsShut; + } ); } ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index 4904148cef4..5aae361b31d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -84,7 +84,7 @@ class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWells DofManager const & dofManager, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) override; - + integer isThermal() { return flowSolver()->isThermal(); } integer useSimpleAccumulation() const { return flowSolver()->useSimpleAccumulation(); } integer useTotalMassEquation() const { return flowSolver()->useTotalMassEquation(); } integer numFluidPhases() { return flowSolver()->numFluidPhases(); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp new file mode 100644 index 00000000000..91b568e6eab --- /dev/null +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp @@ -0,0 +1,592 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ThermalCompositionalMultiphaseWellKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_COUPLEDRESERVOIRANDWELLS_HPP +#define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_COUPLEDRESERVOIRANDWELLS_HPP + + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" +#include "physicsSolvers/fluidFlow/wells/WellTags.hpp" +#include "physicsSolvers/fluidFlow/wells/WellFields.hpp" +namespace geos +{ + +namespace coupledReservoirAndWellKernels +{ + +using namespace constitutive; + +/** + * @class FaceBasedAssemblyKernel + * @tparam NUM_COMP number of fluid components + * @brief Define the interface for the assembly kernel in charge of flux terms + */ +template< integer NC, integer IS_THERMAL > +class IsothermalCompositionalMultiPhaseFluxKernel +{ +public: + + /// Compile time value for the number of components + static constexpr integer numComp = NC; + static constexpr integer resNumDOF = NC+1+IS_THERMAL; + + // Well jacobian column and row indicies + using WJ_COFFSET = compositionalMultiphaseWellKernels::ColOffset_WellJac< NC, IS_THERMAL >; + using WJ_ROFFSET = compositionalMultiphaseWellKernels::RowOffset_WellJac< NC, IS_THERMAL >; + + using ROFFSET = compositionalMultiphaseWellKernels::RowOffset; + using COFFSET = compositionalMultiphaseWellKernels::ColOffset; + + using CP_Deriv = multifluid::DerivativeOffsetC< NC, IS_THERMAL >; + + using TAG = compositionalMultiphaseWellKernels::SubRegionTag; + + + + /// Compute time value for the number of degrees of freedom + static constexpr integer numDof = WJ_COFFSET::nDer; + + /// Compile time value for the number of equations except volume and momentum + static constexpr integer numEqn = WJ_ROFFSET::nEqn - 2; + + /** + * @brief Constructor for the kernel interface + * @param[in] rankOffset the offset of my MPI rank + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dofNumberAccessor + * @param[in] compFlowAccessors + * @param[in] multiFluidAccessors + * @param[in] capPressureAccessors + * @param[in] permeabilityAccessors + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + * @param[in] kernelFlags flags packed together + */ + IsothermalCompositionalMultiPhaseFluxKernel( real64 const dt, + globalIndex const rankOffset, + string const wellDofKey, + WellElementSubRegion const & subRegion, + ElementRegionManager::ElementViewConst< arrayView1d< globalIndex const > > const resDofNumber, + PerforationData const * const perforationData, + MultiFluidBase const & fluid, + + arrayView1d< real64 > const & localRhs, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + bool const & detectCrossflow, + integer & numCrossFlowPerforations, + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags ) + : + m_dt( dt ), + m_numPhases ( fluid.numFluidPhases()), + m_rankOffset( rankOffset ), + m_compPerfRate( perforationData->getField< fields::well::compPerforationRate >() ), + m_dCompPerfRate( perforationData->getField< fields::well::dCompPerforationRate >() ), + m_perfWellElemIndex( perforationData->getField< fields::perforation::wellElementIndex >() ), + m_wellElemDofNumber( subRegion.getReference< array1d< globalIndex > >( wellDofKey ) ), + m_resElemDofNumber( resDofNumber ), + m_resElementRegion( perforationData->getField< fields::perforation::reservoirElementRegion >() ), + m_resElementSubRegion( perforationData->getField< fields::perforation::reservoirElementSubRegion >() ), + m_resElementIndex( perforationData->getField< fields::perforation::reservoirElementIndex >() ), + m_localRhs( localRhs ), + m_localMatrix( localMatrix ), + m_detectCrossflow( detectCrossflow ), + m_numCrossFlowPerforations( numCrossFlowPerforations ), + m_useTotalMassEquation ( kernelFlags.isSet( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ) ) + { } + + + /** + * @brief Compute the local flux contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes + * @param[in] ie the element index + * @param[inout] stack the stack variables + * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes + */ + + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + inline + void computeFlux( localIndex const iperf, + FUNC && compFluxKernelOp = NoOpFunc{} ) const + { + + using namespace compositionalMultiphaseUtilities; + // local working variables and arrays + stackArray1d< localIndex, 2* numComp > eqnRowIndices( 2 * numComp ); + stackArray1d< globalIndex, 2*resNumDOF > dofColIndices( 2 * resNumDOF ); + + stackArray1d< real64, 2 * numComp > localPerf( 2 * numComp ); + stackArray2d< real64, 2 * resNumDOF * 2 * numComp > localPerfJacobian( 2 * numComp, 2 * resNumDOF ); + + // get the reservoir (sub)region and element indices + localIndex const er = m_resElementRegion[iperf]; + localIndex const esr = m_resElementSubRegion[iperf]; + localIndex const ei = m_resElementIndex[iperf]; + + // get the well element index for this perforation + localIndex const iwelem = m_perfWellElemIndex[iperf]; + globalIndex const resOffset = m_resElemDofNumber[er][esr][ei]; + globalIndex const wellElemOffset = m_wellElemDofNumber[iwelem]; + + for( integer ic = 0; ic < numComp; ++ic ) + { + eqnRowIndices[TAG::RES * numComp + ic] = LvArray::integerConversion< localIndex >( resOffset - m_rankOffset ) + ic; + eqnRowIndices[TAG::WELL * numComp + ic] = LvArray::integerConversion< localIndex >( wellElemOffset - m_rankOffset ) + WJ_ROFFSET::MASSBAL + ic; + } + // Note res and well have same col lineup for P and compdens + for( integer jdof = 0; jdof < NC+1; ++jdof ) + { + dofColIndices[TAG::RES * resNumDOF + jdof] = resOffset + jdof; + dofColIndices[TAG::WELL * resNumDOF + jdof] = wellElemOffset + WJ_COFFSET::dP + jdof; + } + // For temp its different + if constexpr ( IS_THERMAL ) + { + dofColIndices[TAG::RES * resNumDOF + NC+1 ] = resOffset + NC+1; + dofColIndices[TAG::WELL * resNumDOF + NC+1 ] = wellElemOffset + WJ_COFFSET::dT; + } + // populate local flux vector and derivatives + for( integer ic = 0; ic < numComp; ++ic ) + { + localPerf[TAG::RES * numComp + ic] = m_dt * m_compPerfRate[iperf][ic]; + localPerf[TAG::WELL * numComp + ic] = -m_dt * m_compPerfRate[iperf][ic]; + + if( m_detectCrossflow ) + { + if( m_compPerfRate[iperf][ic] > LvArray::NumericLimits< real64 >::epsilon ) + { + m_numCrossFlowPerforations += 1; + } + } + for( integer ke = 0; ke < 2; ++ke ) + { + localIndex localDofIndexPres = ke * resNumDOF; + + localPerfJacobian[TAG::RES * numComp + ic][localDofIndexPres] = m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dP]; + localPerfJacobian[TAG::WELL * numComp + ic][localDofIndexPres] = -m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dP]; + for( integer jc = 0; jc < numComp; ++jc ) + { + localIndex const localDofIndexComp = localDofIndexPres + jc + 1; + + localPerfJacobian[TAG::RES * numComp + ic][localDofIndexComp] = m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dC+jc]; + localPerfJacobian[TAG::WELL * numComp + ic][localDofIndexComp] = -m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dC+jc]; + } + if constexpr ( IS_THERMAL ) + { + localIndex localDofIndexTemp = localDofIndexPres + NC + 1; + localPerfJacobian[TAG::RES * numComp + ic][localDofIndexTemp] = m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dT]; + localPerfJacobian[TAG::WELL * numComp + ic][localDofIndexTemp] = -m_dt * m_dCompPerfRate[iperf][ke][ic][CP_Deriv::dT]; + } + } + } + + if( m_useTotalMassEquation ) + { + // Apply equation/variable change transformation(s) + stackArray1d< real64, 2 * resNumDOF > work( 2 * resNumDOF ); + shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComp, numComp, resNumDOF * 2, 2, localPerfJacobian, work ); + shiftBlockElementsAheadByOneAndReplaceFirstElementWithSum( numComp, numComp, 2, localPerf ); + } + + for( localIndex i = 0; i < localPerf.size(); ++i ) + { + if( eqnRowIndices[i] >= 0 && eqnRowIndices[i] < m_localMatrix.numRows() ) + { + m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic >( eqnRowIndices[i], + dofColIndices.data(), + localPerfJacobian[i].dataIfContiguous(), + 2 * resNumDOF ); + RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[eqnRowIndices[i]], localPerf[i] ); + } + } + compFluxKernelOp( resOffset, wellElemOffset, dofColIndices, iwelem ); + + } + + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElements the number of elements + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack + * variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numElements, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + forAll< POLICY >( numElements, [=] GEOS_HOST_DEVICE ( localIndex const ie ) + { + kernelComponent.computeFlux( ie ); + + } ); + } + +protected: + + /// Time step size + real64 const m_dt; + + /// Number of phases + integer const m_numPhases; + + globalIndex const m_rankOffset; + // Perfoation variables + arrayView2d< real64 const > const m_compPerfRate; + arrayView4d< real64 const > const m_dCompPerfRate; + arrayView1d< localIndex const > const m_perfWellElemIndex; + + // Element region, subregion, index + arrayView1d< globalIndex const > const m_wellElemDofNumber; + ElementRegionManager::ElementViewConst< arrayView1d< globalIndex const > > const m_resElemDofNumber; + arrayView1d< localIndex const > const m_resElementRegion; + arrayView1d< localIndex const > const m_resElementSubRegion; + arrayView1d< localIndex const > const m_resElementIndex; + + // RHS and Jacobian + arrayView1d< real64 > const m_localRhs; + CRSMatrixView< real64, globalIndex const > m_localMatrix; + + bool const m_detectCrossflow; + integer & m_numCrossFlowPerforations; + integer const m_useTotalMassEquation; +}; + +/** + * @class FaceBasedAssemblyKernelFactory + */ +class IsothermalCompositionalMultiPhaseFluxKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComps the number of fluid components + * @param[in] dt time step size + * @param[in] rankOffset the offset of my MPI rank + * @param[in] useTotalMassEquation flag specifying whether to replace one component bal eqn with total mass eqn + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] wellControls object holding well control/constraint information + * @param[in] subregion well subregion + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComps, + real64 const dt, + globalIndex const rankOffset, + string const wellDofKey, + WellElementSubRegion const & subRegion, + ElementRegionManager::ElementViewConst< arrayView1d< globalIndex const > > const resDofNumber, + PerforationData const * const perforationData, + MultiFluidBase const & fluid, + integer const & useTotalMassEquation, + bool const & detectCrossflow, + integer & numCrossFlowPerforations, + arrayView1d< real64 > const & localRhs, + CRSMatrixView< real64, globalIndex const > const & localMatrix + ) + { + isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) + { + integer constexpr NUM_COMP = NC(); + + + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + + + using kernelType = IsothermalCompositionalMultiPhaseFluxKernel< NUM_COMP, 0 >; + + + kernelType kernel( dt, rankOffset, wellDofKey, subRegion, resDofNumber, perforationData, fluid, localRhs, localMatrix, detectCrossflow, numCrossFlowPerforations, kernelFlags ); + kernelType::template launch< POLICY >( perforationData->size(), kernel ); + } ); + + } +}; + + +/** + * @class FaceBasedAssemblyKernel + * @tparam NUM_COMP number of fluid components + * @brief Define the interface for the assembly kernel in charge of flux terms + */ +template< integer NC, integer IS_THERMAL > +class ThermalCompositionalMultiPhaseFluxKernel : public IsothermalCompositionalMultiPhaseFluxKernel< NC, IS_THERMAL > +{ +public: + using Base = IsothermalCompositionalMultiPhaseFluxKernel< NC, IS_THERMAL >; + /// Compile time value for the number of components + static constexpr integer numComp = NC; + static constexpr integer resNumDOF = NC+1+IS_THERMAL; + + // Well jacobian column and row indicies + using WJ_COFFSET = compositionalMultiphaseWellKernels::ColOffset_WellJac< NC, IS_THERMAL >; + using WJ_ROFFSET = compositionalMultiphaseWellKernels::RowOffset_WellJac< NC, IS_THERMAL >; + + using ROFFSET = compositionalMultiphaseWellKernels::RowOffset; + using COFFSET = compositionalMultiphaseWellKernels::ColOffset; + + using CP_Deriv = multifluid::DerivativeOffsetC< NC, IS_THERMAL >; + + using TAG = compositionalMultiphaseWellKernels::SubRegionTag; + + using Base::m_dt; + using Base::m_localRhs; + using Base::m_localMatrix; + using Base::m_rankOffset; + + + + /// Compute time value for the number of degrees of freedom + static constexpr integer numDof = WJ_COFFSET::nDer; + + /// Compile time value for the number of equations except volume and momentum + static constexpr integer numEqn = WJ_ROFFSET::nEqn - 2; + + /** + * @brief Constructor for the kernel interface + * @param[in] rankOffset the offset of my MPI rank + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dofNumberAccessor + * @param[in] compFlowAccessors + * @param[in] multiFluidAccessors + * @param[in] capPressureAccessors + * @param[in] permeabilityAccessors + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + * @param[in] kernelFlags flags packed together + */ + ThermalCompositionalMultiPhaseFluxKernel( real64 const dt, + integer const isProducer, + globalIndex const rankOffset, + string const wellDofKey, + WellElementSubRegion const & subRegion, + ElementRegionManager::ElementViewConst< arrayView1d< globalIndex const > > const resDofNumber, + PerforationData const * const perforationData, + MultiFluidBase const & fluid, + arrayView1d< real64 > const & localRhs, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + bool const & detectCrossflow, + integer & numCrossFlowPerforations, + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags ) + : Base( dt, + rankOffset, + wellDofKey, + subRegion, + resDofNumber, + perforationData, + fluid, + localRhs, + localMatrix, + detectCrossflow, + numCrossFlowPerforations, + kernelFlags ), + m_isProducer( isProducer ), + m_globalWellElementIndex( subRegion.getGlobalWellElementIndex() ), + m_energyPerfFlux( perforationData->getField< fields::well::energyPerforationFlux >()), + m_dEnergyPerfFlux( perforationData->getField< fields::well::dEnergyPerforationFlux >()) + + { } + + + /** + * @brief Compute the local flux contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes + * @param[in] ie the element index + * @param[inout] stack the stack variables + * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes + */ + + GEOS_HOST_DEVICE + inline + void computeFlux( localIndex const iperf ) const + { + Base::computeFlux( iperf, [&] ( globalIndex const & resOffset, + globalIndex const & wellElemOffset, + stackArray1d< globalIndex, 2*resNumDOF > & dofColIndices, + localIndex const iwelem ) + { + // No energy equation if top element and Injector + // Top element defined by global index == 0 + // Assumption is global index == 0 is top segment with fixed temp BC + if( !m_isProducer ) + { + if( m_globalWellElementIndex[iwelem] == 0 ) + return; + } + // local working variables and arrays + stackArray1d< localIndex, 2* numComp > eqnRowIndices( 2 ); + + stackArray1d< real64, 2 * numComp > localPerf( 2 ); + stackArray2d< real64, 2 * resNumDOF * 2 * numComp > localPerfJacobian( 2, 2 * resNumDOF ); + + + // equantion offsets - note res and well have different equation lineups + eqnRowIndices[TAG::RES ] = LvArray::integerConversion< localIndex >( resOffset - m_rankOffset ) + NC + 1; + eqnRowIndices[TAG::WELL ] = LvArray::integerConversion< localIndex >( wellElemOffset - m_rankOffset ) + WJ_ROFFSET::ENERGYBAL; + + // populate local flux vector and derivatives + localPerf[TAG::RES ] = m_dt * m_energyPerfFlux[iperf]; + localPerf[TAG::WELL ] = -m_dt * m_energyPerfFlux[iperf]; + + for( integer ke = 0; ke < 2; ++ke ) + { + localIndex localDofIndexPres = ke * resNumDOF; + localPerfJacobian[TAG::RES ][localDofIndexPres] = m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dP]; + localPerfJacobian[TAG::WELL ][localDofIndexPres] = -m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dP]; + + // populate local flux vector and derivatives + for( integer ic = 0; ic < numComp; ++ic ) + { + localIndex const localDofIndexComp = localDofIndexPres + ic + 1; + localPerfJacobian[TAG::RES ][localDofIndexComp] = m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dC+ic]; + localPerfJacobian[TAG::WELL][localDofIndexComp] = -m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dC+ic]; + } + localPerfJacobian[TAG::RES ][localDofIndexPres+NC+1] = m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dT]; + localPerfJacobian[TAG::WELL][localDofIndexPres+NC+1] = -m_dt * m_dEnergyPerfFlux[iperf][ke][CP_Deriv::dT]; + } + + + for( localIndex i = 0; i < localPerf.size(); ++i ) + { + if( eqnRowIndices[i] >= 0 && eqnRowIndices[i] < m_localMatrix.numRows() ) + { + m_localMatrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( eqnRowIndices[i], + dofColIndices.data(), + localPerfJacobian[i].dataIfContiguous(), + 2 * resNumDOF ); + RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[eqnRowIndices[i]], localPerf[i] ); + } + } + } ); + + + } + + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElements the number of elements + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack + * variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numElements, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + forAll< POLICY >( numElements, [=] GEOS_HOST_DEVICE ( localIndex const ie ) + { + kernelComponent.computeFlux( ie ); + + } ); + } + +protected: + + /// Well type + integer const m_isProducer; + + /// Global index of local element + arrayView1d< globalIndex const > m_globalWellElementIndex; + + /// Views on energy flux + arrayView1d< real64 const > const m_energyPerfFlux; + arrayView3d< real64 const > const m_dEnergyPerfFlux; +}; + +/** + * @class ThermalCompositionalMultiPhaseFluxKernelFactory + */ +class ThermalCompositionalMultiPhaseFluxKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComps the number of fluid components + * @param[in] dt time step size + * @param[in] rankOffset the offset of my MPI rank + * @param[in] useTotalMassEquation flag specifying whether to replace one component bal eqn with total mass eqn + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] wellControls object holding well control/constraint information + * @param[in] subregion well subregion + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComps, + integer const isProducer, + real64 const dt, + globalIndex const rankOffset, + string const wellDofKey, + WellElementSubRegion const & subRegion, + ElementRegionManager::ElementViewConst< arrayView1d< globalIndex const > > const resDofNumber, + PerforationData const * const perforationData, + MultiFluidBase const & fluid, + integer const & useTotalMassEquation, + bool const & detectCrossflow, + integer & numCrossFlowPerforations, + arrayView1d< real64 > const & localRhs, + CRSMatrixView< real64, globalIndex const > const & localMatrix + ) + { + isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) + { + integer constexpr NUM_COMP = NC(); + + + BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + + + using kernelType = ThermalCompositionalMultiPhaseFluxKernel< NUM_COMP, 1 >; + + + kernelType kernel( dt, isProducer, rankOffset, wellDofKey, subRegion, resDofNumber, perforationData, fluid, localRhs, localMatrix, detectCrossflow, numCrossFlowPerforations, kernelFlags ); + kernelType::template launch< POLICY >( perforationData->size(), kernel ); + } ); + + } +}; + +} // end namespace coupledReservoirAndWellKernels + +} // end namespace geos + +#endif // GEOS_PHYSICSSOLVERS_MULTIPHYSICS_COUPLEDRESERVOIRANDWELLS_HPP diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index 34932b61aba..4e3dacbd699 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -22,6 +22,7 @@ #include "common/TimingMacros.hpp" #include "mesh/PerforationFields.hpp" +#include "physicsSolvers/KernelLaunchSelectors.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseFVM.hpp" #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp" @@ -137,73 +138,75 @@ addCouplingSparsityPattern( DomainPartition const & domain, string const resDofKey = dofManager.getKey( Base::wellSolver()->resElementDofName() ); string const wellDofKey = dofManager.getKey( Base::wellSolver()->wellElementDofName() ); - + integer isThermal = Base::wellSolver()->isThermal(); integer const wellNDOF = Base::wellSolver()->numDofPerWellElement(); ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > const & resDofNumber = elemManager.constructArrayViewAccessor< globalIndex, 1 >( resDofKey ); globalIndex const rankOffset = dofManager.rankOffset(); - - elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, - WellElementSubRegion const & subRegion ) - { - PerforationData const * const perforationData = subRegion.getPerforationData(); - - // get the well degrees of freedom and ghosting info - arrayView1d< globalIndex const > const & wellElemDofNumber = - subRegion.getReference< array1d< globalIndex > >( wellDofKey ); - - // get the well element indices corresponding to each perforation - arrayView1d< localIndex const > const & perfWellElemIndex = - perforationData->getField< fields::perforation::wellElementIndex >(); - - // get the element region, subregion, index - arrayView1d< localIndex const > const & resElementRegion = - perforationData->getField< fields::perforation::reservoirElementRegion >(); - arrayView1d< localIndex const > const & resElementSubRegion = - perforationData->getField< fields::perforation::reservoirElementSubRegion >(); - arrayView1d< localIndex const > const & resElementIndex = - perforationData->getField< fields::perforation::reservoirElementIndex >(); - - // Insert the entries corresponding to reservoir-well perforations - // This will fill J_WR, and J_RW - forAll< serialPolicy >( perforationData->size(), [=] ( localIndex const iperf ) + geos::internal::kernelLaunchSelectorThermalSwitch( isThermal, [&] ( auto ISTHERMAL ) { + integer constexpr IS_THERMAL = ISTHERMAL(); + elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, + WellElementSubRegion const & subRegion ) { - // Get the reservoir (sub)region and element indices - localIndex const er = resElementRegion[iperf]; - localIndex const esr = resElementSubRegion[iperf]; - localIndex const ei = resElementIndex[iperf]; - localIndex const iwelem = perfWellElemIndex[iperf]; + PerforationData const * const perforationData = subRegion.getPerforationData(); + + // get the well degrees of freedom and ghosting info + arrayView1d< globalIndex const > const & wellElemDofNumber = + subRegion.getReference< array1d< globalIndex > >( wellDofKey ); + + // get the well element indices corresponding to each perforation + arrayView1d< localIndex const > const & perfWellElemIndex = + perforationData->getField< fields::perforation::wellElementIndex >(); + + // get the element region, subregion, index + arrayView1d< localIndex const > const & resElementRegion = + perforationData->getField< fields::perforation::reservoirElementRegion >(); + arrayView1d< localIndex const > const & resElementSubRegion = + perforationData->getField< fields::perforation::reservoirElementSubRegion >(); + arrayView1d< localIndex const > const & resElementIndex = + perforationData->getField< fields::perforation::reservoirElementIndex >(); + + // Insert the entries corresponding to reservoir-well perforations + // This will fill J_WR, and J_RW + forAll< serialPolicy >( perforationData->size(), [=] ( localIndex const iperf ) + { + // Get the reservoir (sub)region and element indices + localIndex const er = resElementRegion[iperf]; + localIndex const esr = resElementSubRegion[iperf]; + localIndex const ei = resElementIndex[iperf]; + localIndex const iwelem = perfWellElemIndex[iperf]; - globalIndex const eqnRowIndexRes = resDofNumber[er][esr][ei] - rankOffset; - globalIndex const dofColIndexRes = resDofNumber[er][esr][ei]; + globalIndex const eqnRowIndexRes = resDofNumber[er][esr][ei] - rankOffset; + globalIndex const dofColIndexRes = resDofNumber[er][esr][ei]; - // working arrays - stackArray1d< globalIndex, 2 > eqnRowIndicesWell( wellNDOF ); - stackArray1d< globalIndex, 2 > dofColIndicesWell( wellNDOF ); + // working arrays - tjb previously dim was 2 + stackArray1d< globalIndex, 2+IS_THERMAL > eqnRowIndicesWell( wellNDOF ); + stackArray1d< globalIndex, 2+IS_THERMAL > dofColIndicesWell( wellNDOF ); - for( integer idof = 0; idof < wellNDOF; ++idof ) - { - eqnRowIndicesWell[idof] = wellElemDofNumber[iwelem] + idof - rankOffset; - dofColIndicesWell[idof] = wellElemDofNumber[iwelem] + idof; - } + for( integer idof = 0; idof < wellNDOF; ++idof ) + { + eqnRowIndicesWell[idof] = wellElemDofNumber[iwelem] + idof - rankOffset; + dofColIndicesWell[idof] = wellElemDofNumber[iwelem] + idof; + } - if( eqnRowIndexRes >= 0 && eqnRowIndexRes < pattern.numRows() ) - { - for( localIndex j = 0; j < dofColIndicesWell.size(); ++j ) + if( eqnRowIndexRes >= 0 && eqnRowIndexRes < pattern.numRows() ) { - pattern.insertNonZero( eqnRowIndexRes, dofColIndicesWell[j] ); + for( localIndex j = 0; j < dofColIndicesWell.size(); ++j ) + { + pattern.insertNonZero( eqnRowIndexRes, dofColIndicesWell[j] ); + } } - } - for( localIndex i = 0; i < eqnRowIndicesWell.size(); ++i ) - { - if( eqnRowIndicesWell[i] >= 0 && eqnRowIndicesWell[i] < pattern.numRows() ) + for( localIndex i = 0; i < eqnRowIndicesWell.size(); ++i ) { - pattern.insertNonZero( eqnRowIndicesWell[i], dofColIndexRes ); + if( eqnRowIndicesWell[i] >= 0 && eqnRowIndicesWell[i] < pattern.numRows() ) + { + pattern.insertNonZero( eqnRowIndicesWell[i], dofColIndexRes ); + } } - } + } ); } ); } ); } ); diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 6c137c9f37f..f6d771d5a78 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -2758,6 +2758,8 @@ Local- Add jump stabilization on interior of macro elements--> + + + + @@ -3987,6 +3991,8 @@ Local- Add jump stabilization on interior of macro elements--> + + + + diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp index a69995c1166..791e5fe8607 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp @@ -50,6 +50,19 @@ void fillNumericalJacobian( arrayView1d< real64 const > const & residual, } ); } +inline +void setNumericalJacobianValue( localIndex const rowIndex, + globalIndex const colIndex, + real64 const val, + CRSMatrixView< real64, const globalIndex > const jacobian ) +{ + forAll< parallelDevicePolicy<> >( 1, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + GEOS_UNUSED_VAR( k ); + jacobian.addToRow< parallelDeviceAtomic >( rowIndex, &colIndex, &val, 1 ); + } ); +} + inline void setupProblemFromXML( ProblemManager & problemManager, char const * const xmlInput ) { diff --git a/src/coreComponents/unitTests/wellsTests/CMakeLists.txt b/src/coreComponents/unitTests/wellsTests/CMakeLists.txt index 988582e06a6..1420b47ec78 100644 --- a/src/coreComponents/unitTests/wellsTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wellsTests/CMakeLists.txt @@ -9,7 +9,11 @@ set( dependencyList mainInterface ) if( ENABLE_PVTPackage ) list( APPEND gtest_geosx_tests - testReservoirCompositionalMultiphaseMSWells.cpp ) + testReservoirCompositionalMultiphaseMSWells.cpp + testIsothermalReservoirCompositionalMultiphaseMSWells.cpp + testIsothermalReservoirCompositionalMultiphaseSSWells.cpp + testThermalReservoirCompositionalMultiphaseSSWells.cpp + testThermalReservoirCompositionalMultiphaseMSWells.cpp ) endif() geos_decorate_link_dependencies( LIST decoratedDependencies diff --git a/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp new file mode 100644 index 00000000000..84362ec0698 --- /dev/null +++ b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp @@ -0,0 +1,677 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" + +#include "common/DataTypes.hpp" +#include "mainInterface/initialization.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mesh/WellElementSubRegion.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" +#include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::constitutive; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; +void writeTableToFile( string const & filename, char const * str ) +{ + std::ofstream os( filename ); + ASSERT_TRUE( os.is_open() ); + os << str; + os.close(); +} + +void removeFile( string const & filename ) +{ + int const ret = std::remove( filename.c_str() ); + ASSERT_TRUE( ret == 0 ); +} +char const * co2flash = "FlashModel CO2Solubility 1e6 7.5e7 5e5 299.15 369.15 10 0"; +char const * pvtLiquid = "DensityFun PhillipsBrineDensity 1e6 7.5e7 5e5 299.15 369.15 10 0\n" + "ViscosityFun PhillipsBrineViscosity 0\n" + "EnthalpyFun BrineEnthalpy 1e6 7.5e7 5e5 299.15 369.15 10 0\n"; + +char const * pvtGas = "DensityFun SpanWagnerCO2Density 1e6 7.5e7 5e5 299.15 369.15 10\n" + "ViscosityFun FenghourCO2Viscosity 1e6 7.5e7 5e5 299.15 369.15 10\n" + "EnthalpyFun CO2Enthalpy 1e6 7.5e7 5e5 299.15 369.15 10\n"; +char const * xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )xml"; + +template< typename LAMBDA > +void testNumericalJacobian( CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > & solver, + DomainPartition & domain, + real64 const perturbParameter, + real64 const relTol, + LAMBDA && assembleFunction ) +{ + CompositionalMultiphaseWell & wellSolver = *solver.wellSolver(); + CompositionalMultiphaseFVM & flowSolver = dynamicCast< CompositionalMultiphaseFVM & >( *solver.reservoirSolver() ); + + localIndex const NC = flowSolver.numFluidComponents(); + + CRSMatrix< real64, globalIndex > const & jacobian = solver.getLocalMatrix(); + array1d< real64 > residual( jacobian.numRows() ); + DofManager const & dofManager = solver.getDofManager(); + + // assemble the analytical residual + solver.resetStateToBeginningOfStep( domain ); + + residual.zero(); + jacobian.zero(); + + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + residual.move( hostMemorySpace, false ); + + // copy the analytical residual + array1d< real64 > residualOrig( residual ); + + // create the numerical jacobian + jacobian.move( hostMemorySpace ); + CRSMatrix< real64, globalIndex > jacobianFD( jacobian ); + jacobianFD.zero(); + + string const resDofKey = dofManager.getKey( wellSolver.resElementDofName() ); + string const wellDofKey = dofManager.getKey( wellSolver.wellElementDofName() ); + + // at this point we start assembling the finite-difference block by block + + //////////////////////////////////////////////// + // Step 1) Compute the terms in J_RR and J_WR // + //////////////////////////////////////////////// + domain.forMeshBodies( [&] ( MeshBody & meshBody ) + { + meshBody.forMeshLevels( [&] ( MeshLevel & mesh ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + for( localIndex er = 0; er < elemManager.numRegions(); ++er ) + { + ElementRegionBase & elemRegion = elemManager.getRegion( er ); + elemRegion.forElementSubRegionsIndex< CellElementSubRegion >( [&]( localIndex const, CellElementSubRegion & subRegion ) + { + // get the degrees of freedom and ghosting information + arrayView1d< globalIndex const > const & dofNumber = + subRegion.getReference< array1d< globalIndex > >( resDofKey ); + + // get the primary variables on the reservoir elements + arrayView1d< real64 > const & pres = + subRegion.getField< fields::well::pressure >(); + pres.move( hostMemorySpace, false ); + + arrayView2d< real64, compflow::USD_COMP > const & compDens = + subRegion.getField< fields::well::globalCompDensity >(); + compDens.move( hostMemorySpace, false ); + + // a) compute all the derivatives wrt to the pressure in RESERVOIR elem ei + for( localIndex ei = 0; ei < subRegion.size(); ++ei ) + { + real64 totalDensity = 0.0; + for( localIndex ic = 0; ic < NC; ++ic ) + { + totalDensity += compDens[ei][ic]; + } + + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the pressure of the element + real64 const dP = perturbParameter * (pres[ei] + perturbParameter); + pres.move( hostMemorySpace, true ); + pres[ei] += dP; + + // after perturbing, update the pressure-dependent quantities in the reservoir + flowSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh2, + arrayView1d< string const > const & regionNames2 ) + { + mesh2.getElemManager().forElementSubRegions( regionNames2, + [&]( localIndex const, + ElementSubRegionBase & subRegion2 ) + { + flowSolver.updateFluidState( subRegion2 ); + } ); + } ); + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + dofNumber[ei], + dP, + jacobianFD.toViewConstSizes() ); + } + + for( localIndex jc = 0; jc < NC; ++jc ) + { + solver.resetStateToBeginningOfStep( domain ); + + real64 const dRho = perturbParameter * totalDensity; + compDens.move( hostMemorySpace, true ); + compDens[ei][jc] += dRho; + + flowSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh2, + arrayView1d< string const > const & regionNames2 ) + { + mesh2.getElemManager().forElementSubRegions( regionNames2, + [&]( localIndex const, + ElementSubRegionBase & subRegion2 ) + { + flowSolver.updateFluidState( subRegion2 ); + } ); + } ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + dofNumber[ei] + jc + 1, + dRho, + jacobianFD.toViewConstSizes() ); + } + } + } ); + } + } ); + } ); + + ///////////////////////////////////////////////// + // Step 2) Compute the terms in J_RW and J_WW // + ///////////////////////////////////////////////// + + // loop over the wells + wellSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, + [&]( localIndex const, + WellElementSubRegion & subRegion ) + { + // get the degrees of freedom, ghosting info and next well elem index + arrayView1d< globalIndex const > const & wellElemDofNumber = + subRegion.getReference< array1d< globalIndex > >( wellDofKey ); + + // get the primary variables on the well elements + arrayView1d< real64 > const & wellElemPressure = + subRegion.getField< fields::well::pressure >(); + wellElemPressure.move( hostMemorySpace, false ); + + arrayView2d< real64, compflow::USD_COMP > const & wellElemCompDens = + subRegion.getField< fields::well::globalCompDensity >(); + wellElemCompDens.move( hostMemorySpace, false ); + + arrayView1d< real64 > const & connRate = + subRegion.getField< fields::well::mixtureConnectionRate >(); + connRate.move( hostMemorySpace, false ); + + // a) compute all the derivatives wrt to the pressure in WELL elem iwelem + for( localIndex iwelem = 0; iwelem < subRegion.size(); ++iwelem ) + { + real64 wellElemTotalDensity = 0.0; + for( localIndex ic = 0; ic < NC; ++ic ) + { + wellElemTotalDensity += wellElemCompDens[iwelem][ic]; + } + + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the pressure of the well element + real64 const dP = perturbParameter * ( wellElemPressure[iwelem] + perturbParameter ); + wellElemPressure.move( hostMemorySpace, true ); + wellElemPressure[iwelem] += dP; + + // after perturbing, update the pressure-dependent quantities in the well + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DPRES, + dP, + jacobianFD.toViewConstSizes() ); + } + + for( localIndex jc = 0; jc < NC; ++jc ) + { + solver.resetStateToBeginningOfStep( domain ); + + real64 const dRho = perturbParameter * wellElemTotalDensity; + wellElemCompDens.move( hostMemorySpace, true ); + wellElemCompDens[iwelem][jc] += dRho; + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + jc, + dRho, + jacobianFD.toViewConstSizes() ); + } + } + + // b) compute all the derivatives wrt to the connection in WELL elem iwelem + for( localIndex iwelem = 0; iwelem < subRegion.size(); ++iwelem ) + { + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the rate of the well element + real64 const dRate = perturbParameter * ( connRate[iwelem] + perturbParameter ); + connRate.move( hostMemorySpace, true ); + connRate[iwelem] += dRate; + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC, + dRate, + jacobianFD.toViewConstSizes() ); + } + } + } ); + } ); + + // assemble the analytical jacobian + solver.resetStateToBeginningOfStep( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + //printCompareLocalMatrices( jacobian.toViewConst(), jacobianFD.toViewConst()); + compareLocalMatrices( jacobian.toViewConst(), jacobianFD.toViewConst(), relTol ); +} + +class CompositionalMultiphaseReservoirSolverTest : public ::testing::Test +{ +public: + + CompositionalMultiphaseReservoirSolverTest(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + +protected: + + void SetUp() override + { + setupProblemFromXML( state.getProblemManager(), xmlInput ); + solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > >( "reservoirSystem" ); + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + solver->setupSystem( domain, + solver->getDofManager(), + solver->getLocalMatrix(), + solver->getSystemRhs(), + solver->getSystemSolution() ); + + solver->implicitStepSetup( time, dt, domain ); + } + + static real64 constexpr time = 0.0; + static real64 constexpr dt = 1e4; + static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); + + GeosxState state; + CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > * solver; +}; + +real64 constexpr CompositionalMultiphaseReservoirSolverTest::time; +real64 constexpr CompositionalMultiphaseReservoirSolverTest::dt; +real64 constexpr CompositionalMultiphaseReservoirSolverTest::eps; + +#if 0 + +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Perforation ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = *state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->assembleCouplingTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} + +#endif + +#if 0 +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Flux ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assembleFluxTerms( dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} +#endif + +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Accum ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assembleAccumulationTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} + +#if 0 +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_PressureRel ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assemblePressureRelations( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} +#endif + +int main( int argc, char * * argv ) +{ + writeTableToFile( "co2flash.txt", co2flash ); + writeTableToFile( "pvtliquid.txt", pvtLiquid ); + writeTableToFile( "pvtgas.txt", pvtGas ); + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + removeFile( "co2flash.txt" ); + removeFile( "pvtliquid.txt" ); + removeFile( "pvtgas.txt" ); + return result; +} diff --git a/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp new file mode 100644 index 00000000000..b7b63b1033e --- /dev/null +++ b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp @@ -0,0 +1,769 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" + +#include "common/DataTypes.hpp" +#include "mainInterface/initialization.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mesh/WellElementSubRegion.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" +#include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::constitutive; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; +void writeTableToFile( string const & filename, char const * str ) +{ + std::ofstream os( filename ); + ASSERT_TRUE( os.is_open() ); + os << str; + os.close(); +} + +void removeFile( string const & filename ) +{ + int const ret = std::remove( filename.c_str() ); + ASSERT_TRUE( ret == 0 ); +} +char const * co2flash = "FlashModel CO2Solubility 1e6 7.5e7 5e5 299.15 369.15 10 0"; +char const * pvtLiquid = "DensityFun PhillipsBrineDensity 1e6 7.5e7 5e5 299.15 369.15 10 0\n" + "ViscosityFun PhillipsBrineViscosity 0\n" + "EnthalpyFun BrineEnthalpy 1e6 7.5e7 5e5 299.15 369.15 10 0\n"; + +char const * pvtGas = "DensityFun SpanWagnerCO2Density 1e6 7.5e7 5e5 299.15 369.15 10\n" + "ViscosityFun FenghourCO2Viscosity 1e6 7.5e7 5e5 299.15 369.15 10\n" + "EnthalpyFun CO2Enthalpy 1e6 7.5e7 5e5 299.15 369.15 10\n"; +char const * xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )xml"; + + + +template< typename LAMBDA > +void testNumericalJacobian( CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > & solver, + DomainPartition & domain, + real64 const perturbParameter, + real64 const relTol, + LAMBDA && assembleFunction ) +{ + CompositionalMultiphaseWell & wellSolver = *solver.wellSolver(); + CompositionalMultiphaseFVM & flowSolver = dynamicCast< CompositionalMultiphaseFVM & >( *solver.reservoirSolver() ); + + localIndex const NC = flowSolver.numFluidComponents(); + + CRSMatrix< real64, globalIndex > const & jacobian = solver.getLocalMatrix(); + array1d< real64 > residual( jacobian.numRows() ); + DofManager const & dofManager = solver.getDofManager(); + + // assemble the analytical residual + solver.resetStateToBeginningOfStep( domain ); + + residual.zero(); + jacobian.zero(); + + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + residual.move( hostMemorySpace, false ); + + // copy the analytical residual + array1d< real64 > residualOrig( residual ); + + // create the numerical jacobian + jacobian.move( hostMemorySpace ); + CRSMatrix< real64, globalIndex > jacobianFD( jacobian ); + jacobianFD.zero(); + + string const resDofKey = dofManager.getKey( wellSolver.resElementDofName() ); + string const wellDofKey = dofManager.getKey( wellSolver.wellElementDofName() ); + + // at this point we start assembling the finite-difference block by block + + //////////////////////////////////////////////// + // Step 1) Compute the terms in J_RR and J_WR // + //////////////////////////////////////////////// + if( 1 ) + domain.forMeshBodies( [&] ( MeshBody & meshBody ) + { + meshBody.forMeshLevels( [&] ( MeshLevel & mesh ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + for( localIndex er = 0; er < elemManager.numRegions(); ++er ) + { + ElementRegionBase & elemRegion = elemManager.getRegion( er ); + elemRegion.forElementSubRegionsIndex< CellElementSubRegion >( [&]( localIndex const, CellElementSubRegion & subRegion ) + { + // get the degrees of freedom and ghosting information + arrayView1d< globalIndex const > const & dofNumber = + subRegion.getReference< array1d< globalIndex > >( resDofKey ); + + // get the primary variables on the reservoir elements + arrayView1d< real64 > const & pres = + subRegion.getField< fields::well::pressure >(); + pres.move( hostMemorySpace, false ); + + arrayView1d< real64 > const & temp = + subRegion.getField< fields::well::temperature >(); + temp.move( hostMemorySpace, false ); + + arrayView2d< real64, compflow::USD_COMP > const & compDens = + subRegion.getField< fields::well::globalCompDensity >(); + compDens.move( hostMemorySpace, false ); + + // a) compute all the derivatives wrt to the pressure in RESERVOIR elem ei + for( localIndex ei = 0; ei < subRegion.size(); ++ei ) + { + real64 totalDensity = 0.0; + for( localIndex ic = 0; ic < NC; ++ic ) + { + totalDensity += compDens[ei][ic]; + } + + if( 1 ) + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the pressure of the element + real64 const dP = perturbParameter * (pres[ei] + perturbParameter); + pres.move( hostMemorySpace, true ); + pres[ei] += dP; + + // after perturbing, update the pressure-dependent quantities in the reservoir + flowSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh2, + arrayView1d< string const > const & regionNames2 ) + { + mesh2.getElemManager().forElementSubRegions( regionNames2, + [&]( localIndex const, + ElementSubRegionBase & subRegion2 ) + { + flowSolver.updateFluidState( subRegion2 ); + } ); + } ); + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + dofNumber[ei], + dP, + jacobianFD.toViewConstSizes() ); + } + + if( 0 ) + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the temperature of the element + real64 const dT = perturbParameter * (temp[ei] + perturbParameter); + temp.move( hostMemorySpace, true ); + temp[ei] += dT; + + // after perturbing, update the pressure-dependent quantities in the reservoir + flowSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh2, + arrayView1d< string const > const & regionNames2 ) + { + mesh2.getElemManager().forElementSubRegions( regionNames2, + [&]( localIndex const, + ElementSubRegionBase & subRegion2 ) + { + flowSolver.updateFluidState( subRegion2 ); + } ); + } ); + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + dofNumber[ei], + dT, + jacobianFD.toViewConstSizes() ); + } + + + for( localIndex jc = 0; jc < NC; ++jc ) + { + solver.resetStateToBeginningOfStep( domain ); + + real64 const dRho = perturbParameter * totalDensity; + compDens.move( hostMemorySpace, true ); + compDens[ei][jc] += dRho; + + flowSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh2, + arrayView1d< string const > const & regionNames2 ) + { + mesh2.getElemManager().forElementSubRegions( regionNames2, + [&]( localIndex const, + ElementSubRegionBase & subRegion2 ) + { + flowSolver.updateFluidState( subRegion2 ); + } ); + } ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + dofNumber[ei] + jc + 1, + dRho, + jacobianFD.toViewConstSizes() ); + } + } + } ); + } + } ); + } ); + + ///////////////////////////////////////////////// + // Step 2) Compute the terms in J_RW and J_WW // + ///////////////////////////////////////////////// + + // loop over the wells + wellSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, + [&]( localIndex const, + WellElementSubRegion & subRegion ) + { + // get the degrees of freedom, ghosting info and next well elem index + arrayView1d< globalIndex const > const & wellElemDofNumber = + subRegion.getReference< array1d< globalIndex > >( wellDofKey ); + + // get the primary variables on the well elements + arrayView1d< real64 > const & wellElemPressure = + subRegion.getField< fields::well::pressure >(); + wellElemPressure.move( hostMemorySpace, false ); + + arrayView1d< real64 > const & wellElemTemperature = + subRegion.getField< fields::well::temperature >(); + wellElemTemperature.move( hostMemorySpace, false ); + + arrayView2d< real64, compflow::USD_COMP > const & wellElemCompDens = + subRegion.getField< fields::well::globalCompDensity >(); + wellElemCompDens.move( hostMemorySpace, false ); + + arrayView1d< real64 > const & connRate = + subRegion.getField< fields::well::mixtureConnectionRate >(); + connRate.move( hostMemorySpace, false ); + + // a) compute all the derivatives wrt to the pressure in WELL elem iwelem + for( localIndex iwelem = 0; iwelem < subRegion.size(); ++iwelem ) + { + + real64 wellElemTotalDensity = 0.0; + for( localIndex ic = 0; ic < NC; ++ic ) + { + wellElemTotalDensity += wellElemCompDens[iwelem][ic]; + } + + if( 1 ) + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the pressure of the well element + real64 const dP = perturbParameter * ( wellElemPressure[iwelem] + perturbParameter ); + wellElemPressure.move( hostMemorySpace, true ); + wellElemPressure[iwelem] += dP; + + // after perturbing, update the pressure-dependent quantities in the well + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DPRES, + dP, + jacobianFD.toViewConstSizes() ); + } + + for( localIndex jc = 0; jc < NC; ++jc ) + { + solver.resetStateToBeginningOfStep( domain ); + + real64 const dRho = perturbParameter*wellElemTotalDensity; + wellElemCompDens.move( hostMemorySpace, true ); + wellElemCompDens[iwelem][jc] += dRho; + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + jc, + dRho, + jacobianFD.toViewConstSizes() ); + } + if( 0 ) + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the pressure of the well element + real64 const dT = perturbParameter * ( wellElemTemperature[iwelem] + perturbParameter ); + wellElemTemperature.move( hostMemorySpace, true ); + wellElemTemperature[iwelem] += dT; + + // after perturbing, update the pressure-dependent quantities in the well + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC+1, + dT, + jacobianFD.toViewConstSizes() ); + } + } + + // b) compute all the derivatives wrt to the connection in WELL elem iwelem + if( 1 ) + for( localIndex iwelem = 0; iwelem < subRegion.size(); ++iwelem ) + { + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the rate of the well element + real64 const dRate = perturbParameter * ( connRate[iwelem] + perturbParameter ); + connRate.move( hostMemorySpace, true ); + connRate[iwelem] += dRate; + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC, + dRate, + jacobianFD.toViewConstSizes() ); + } + } + } ); + } ); + + // assemble the analytical jacobian + solver.resetStateToBeginningOfStep( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + //printCompareLocalMatrices( jacobian.toViewConst(), jacobianFD.toViewConst()); + compareLocalMatrices( jacobian.toViewConst(), jacobianFD.toViewConst(), relTol ); +} + +class CompositionalMultiphaseReservoirSolverTest : public ::testing::Test +{ +public: + + CompositionalMultiphaseReservoirSolverTest(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + +protected: + + void SetUp() override + { + setupProblemFromXML( state.getProblemManager(), xmlInput ); + solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > >( "reservoirSystem" ); + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + solver->setupSystem( domain, + solver->getDofManager(), + solver->getLocalMatrix(), + solver->getSystemRhs(), + solver->getSystemSolution() ); + + solver->implicitStepSetup( time, dt, domain ); + } + + static real64 constexpr time = 0.0; + static real64 constexpr dt = 1e4; + static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); + + GeosxState state; + CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > * solver; +}; + +real64 constexpr CompositionalMultiphaseReservoirSolverTest::time; +real64 constexpr CompositionalMultiphaseReservoirSolverTest::dt; +real64 constexpr CompositionalMultiphaseReservoirSolverTest::eps; + +#if 0 + +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Perforation ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + //solver->assembleCouplingTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + solver->assembleSystem( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + //solver->assembleCouplingTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} + +#endif + +#if 1 +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Accum ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assembleAccumulationTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} +#endif + +#if 0 +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Flux ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assembleFluxTerms( dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} + +#endif +#if 0 + +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_VolumeBalance ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assembleVolumeBalanceTerms( domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} +#endif +#if 0 +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_PressureRel ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assemblePressureRelations( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} +#endif +int main( int argc, char * * argv ) +{ + writeTableToFile( "co2flash.txt", co2flash ); + writeTableToFile( "pvtliquid.txt", pvtLiquid ); + writeTableToFile( "pvtgas.txt", pvtGas ); + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + removeFile( "co2flash.txt" ); + removeFile( "pvtliquid.txt" ); + removeFile( "pvtgas.txt" ); + return result; +} diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp index 4d3b4e775ba..f69e0b5cb2c 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp @@ -528,25 +528,11 @@ TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Flux [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { - solver->wellSolver()->assembleFluxTerms( dt, domain, solver->getDofManager(), localMatrix, localRhs ); + solver->wellSolver()->assembleFluxTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); } ); } -TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_VolumeBalance ) -{ - real64 const perturb = std::sqrt( eps ); - real64 const tol = 1e-1; // 10% error margin - - DomainPartition & domain = state.getProblemManager().getDomainPartition(); - - testNumericalJacobian( *solver, domain, perturb, tol, - [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - solver->wellSolver()->assembleVolumeBalanceTerms( domain, solver->getDofManager(), localMatrix, localRhs ); - } ); -} TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_PressureRel ) { diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp index 0835f9c45c4..c54c1419c40 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp @@ -385,7 +385,7 @@ class SinglePhaseReservoirSolverTest : public ::testing::Test [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { - solver->wellSolver()->assembleFluxTerms( DT, domain, solver->getDofManager(), localMatrix, localRhs ); + solver->wellSolver()->assembleFluxTerms( TIME, DT, domain, solver->getDofManager(), localMatrix, localRhs ); } ); } @@ -415,7 +415,7 @@ class SinglePhaseReservoirSolverTest : public ::testing::Test [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { - solver->wellSolver()->assembleAccumulationTerms( domain, solver->getDofManager(), localMatrix, localRhs ); + solver->wellSolver()->assembleAccumulationTerms( TIME, DT, domain, solver->getDofManager(), localMatrix, localRhs ); } ); } @@ -497,7 +497,7 @@ TEST_F( SinglePhaseReservoirSolverInternalWellTest, jacobianNumericalCheck_Flux [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) { - solver->wellSolver()->assembleFluxTerms( DT, domain, solver->getDofManager(), localMatrix, localRhs ); + solver->wellSolver()->assembleFluxTerms( TIME, DT, domain, solver->getDofManager(), localMatrix, localRhs ); } ); } diff --git a/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp new file mode 100644 index 00000000000..3e6114d9c18 --- /dev/null +++ b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp @@ -0,0 +1,818 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" + +#include "common/DataTypes.hpp" +#include "mainInterface/initialization.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mesh/WellElementSubRegion.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" +#include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::constitutive; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; + +void writeTableToFile( string const & filename, char const * str ) +{ + std::ofstream os( filename ); + ASSERT_TRUE( os.is_open() ); + os << str; + os.close(); +} + +void removeFile( string const & filename ) +{ + int const ret = std::remove( filename.c_str() ); + ASSERT_TRUE( ret == 0 ); +} +char const * co2flash = "FlashModel CO2Solubility 1e6 7.5e7 5e5 299.15 369.15 10 0"; +char const * pvtLiquid = "DensityFun PhillipsBrineDensity 1e6 7.5e7 5e5 299.15 369.15 10 0\n" + "ViscosityFun PhillipsBrineViscosity 0\n" + "EnthalpyFun BrineEnthalpy 1e6 7.5e7 5e5 299.15 369.15 10 0\n"; + +char const * pvtGas = "DensityFun SpanWagnerCO2Density 1e6 7.5e7 5e5 299.15 369.15 10\n" + "ViscosityFun FenghourCO2Viscosity 1e6 7.5e7 5e5 299.15 369.15 10\n" + "EnthalpyFun CO2Enthalpy 1e6 7.5e7 5e5 299.15 369.15 10\n"; +char const * xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )xml"; + + + +template< typename LAMBDA > +void testNumericalJacobian( CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > & solver, + DomainPartition & domain, + real64 const perturbParameter, + real64 const relTol, bool diag_check, + LAMBDA && assembleFunction ) +{ + CompositionalMultiphaseWell & wellSolver = *solver.wellSolver(); + CompositionalMultiphaseFVM & flowSolver = dynamicCast< CompositionalMultiphaseFVM & >( *solver.reservoirSolver() ); + + localIndex const NC = flowSolver.numFluidComponents(); + + CRSMatrix< real64, globalIndex > const & jacobian = solver.getLocalMatrix(); + array1d< real64 > residual( jacobian.numRows() ); + DofManager const & dofManager = solver.getDofManager(); + + // assemble the analytical residual + solver.resetStateToBeginningOfStep( domain ); + + residual.zero(); + jacobian.zero(); + + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + residual.move( hostMemorySpace, false ); + + // copy the analytical residual + array1d< real64 > residualOrig( residual ); + + // create the numerical jacobian + jacobian.move( hostMemorySpace ); + CRSMatrix< real64, globalIndex > jacobianFD( jacobian ); + jacobianFD.zero(); + + string const resDofKey = dofManager.getKey( wellSolver.resElementDofName() ); + string const wellDofKey = dofManager.getKey( wellSolver.wellElementDofName() ); + + // at this point we start assembling the finite-difference block by block + + //////////////////////////////////////////////// + // Step 1) Compute the terms in J_RR and J_WR // + //////////////////////////////////////////////// + if( 1 ) + domain.forMeshBodies( [&] ( MeshBody & meshBody ) + { + meshBody.forMeshLevels( [&] ( MeshLevel & mesh ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + for( localIndex er = 0; er < elemManager.numRegions(); ++er ) + { + ElementRegionBase & elemRegion = elemManager.getRegion( er ); + elemRegion.forElementSubRegionsIndex< CellElementSubRegion >( [&]( localIndex const, CellElementSubRegion & subRegion ) + { + // get the degrees of freedom and ghosting information + arrayView1d< globalIndex const > const & dofNumber = + subRegion.getReference< array1d< globalIndex > >( resDofKey ); + + // get the primary variables on the reservoir elements + arrayView1d< real64 > const & pres = + subRegion.getField< fields::flow::pressure >(); + pres.move( hostMemorySpace, false ); + + arrayView2d< real64, compflow::USD_COMP > const & compDens = + subRegion.getField< fields::flow::globalCompDensity >(); + compDens.move( hostMemorySpace, false ); + + arrayView1d< real64 > const & temp = + subRegion.getField< fields::flow::temperature >(); + temp.move( hostMemorySpace, false ); + + // a) compute all the derivatives wrt to the pressure in RESERVOIR elem ei + for( localIndex ei = 0; ei < subRegion.size(); ++ei ) + { + if( ei !=0 ) + break; + real64 totalDensity = 0.0; + for( localIndex ic = 0; ic < NC; ++ic ) + { + totalDensity += compDens[ei][ic]; + } + + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the pressure of the element + real64 const dP = perturbParameter * (pres[ei] + perturbParameter); + pres.move( hostMemorySpace, true ); + pres[ei] += dP; + + // after perturbing, update the pressure-dependent quantities in the reservoir + flowSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh2, + arrayView1d< string const > const & regionNames2 ) + { + mesh2.getElemManager().forElementSubRegions( regionNames2, + [&]( localIndex const, + ElementSubRegionBase & subRegion2 ) + { + flowSolver.updateFluidState( subRegion2 ); + } ); + } ); + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + dofNumber[ei], + dP, + jacobianFD.toViewConstSizes() ); + } + + for( localIndex jc = 0; jc < NC; ++jc ) + { + solver.resetStateToBeginningOfStep( domain ); + + real64 const dRho = perturbParameter * totalDensity; + compDens.move( hostMemorySpace, true ); + compDens[ei][jc] += dRho; + + flowSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh2, + arrayView1d< string const > const & regionNames2 ) + { + mesh2.getElemManager().forElementSubRegions( regionNames2, + [&]( localIndex const, + ElementSubRegionBase & subRegion2 ) + { + flowSolver.updateFluidState( subRegion2 ); + } ); + } ); + wellSolver.updateState( domain ); + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + dofNumber[ei] + jc + 1, + dRho, + jacobianFD.toViewConstSizes() ); + } + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the pressure of the element + real64 const dTemp = perturbParameter * (temp[ei] + perturbParameter); + temp.move( hostMemorySpace, true ); + temp[ei] += dTemp; + + // after perturbing, update the pressure-dependent quantities in the reservoir + flowSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh2, + arrayView1d< string const > const & regionNames2 ) + { + mesh2.getElemManager().forElementSubRegions( regionNames2, + [&]( localIndex const, + ElementSubRegionBase & subRegion2 ) + { + flowSolver.updateFluidState( subRegion2 ); + } ); + } ); + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + dofNumber[ei]+NC+1, + dTemp, + jacobianFD.toViewConstSizes() ); + } + } + } ); + } + } ); + return; + } ); + + ///////////////////////////////////////////////// + // Step 2) Compute the terms in J_RW and J_WW // + ///////////////////////////////////////////////// + + // loop over the wells + if( 1 ) + wellSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, + [&]( localIndex const, + WellElementSubRegion & subRegion ) + { + // get the degrees of freedom, ghosting info and next well elem index + arrayView1d< globalIndex const > const & wellElemDofNumber = + subRegion.getReference< array1d< globalIndex > >( wellDofKey ); + + // get the primary variables on the well elements + arrayView1d< real64 > const & wellElemPressure = + subRegion.getField< fields::well::pressure >(); + wellElemPressure.move( hostMemorySpace, false ); + + arrayView1d< real64 > const & wellElemTemperature = + subRegion.getField< fields::well::temperature >(); + wellElemTemperature.move( hostMemorySpace, false ); + + arrayView2d< real64, compflow::USD_COMP > const & wellElemCompDens = + subRegion.getField< fields::well::globalCompDensity >(); + wellElemCompDens.move( hostMemorySpace, false ); + + arrayView1d< real64 > const & connRate = + subRegion.getField< fields::well::mixtureConnectionRate >(); + connRate.move( hostMemorySpace, false ); + + // a) compute all the derivatives wrt to the pressure in WELL elem iwelem + for( localIndex iwelem = 0; iwelem < subRegion.size(); ++iwelem ) + { + + real64 wellElemTotalDensity = 0.0; + for( localIndex ic = 0; ic < NC; ++ic ) + { + wellElemTotalDensity += wellElemCompDens[iwelem][ic]; + } + + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the pressure of the well element + real64 const dP = perturbParameter * ( wellElemPressure[iwelem] + perturbParameter ); + wellElemPressure.move( hostMemorySpace, true ); + wellElemPressure[iwelem] += dP; + + // after perturbing, update the pressure-dependent quantities in the well + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DPRES, + dP, + jacobianFD.toViewConstSizes() ); + } + + for( localIndex jc = 0; jc < NC; ++jc ) + { + solver.resetStateToBeginningOfStep( domain ); + + real64 const dRho = perturbParameter * wellElemTotalDensity; + wellElemCompDens.move( hostMemorySpace, true ); + wellElemCompDens[iwelem][jc] += dRho; + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + jc, + dRho, + jacobianFD.toViewConstSizes() ); + } + { + solver.resetStateToBeginningOfStep( domain ); + residual.zero(); + jacobian.zero(); + if( diag_check || iwelem > 0 ) + { + // here is the perturbation in the temperature of the well element + real64 const dT = perturbParameter * ( wellElemTemperature[iwelem] + perturbParameter ); + wellElemTemperature.move( hostMemorySpace, true ); + wellElemTemperature[iwelem] += dT; + + // after perturbing, update the pressure-dependent quantities in the well + wellSolver.updateState( domain ); + + + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC+1, + dT, + jacobianFD.toViewConstSizes() ); + if( iwelem == 1 ) + { + real64 dRdX = 0.0; + localIndex rowIndex = wellElemDofNumber[0] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC+1;; + for( integer ider=0; ider< 3; ider++ ) + { + globalIndex colIndex = wellElemDofNumber[0]+ ider; + setNumericalJacobianValue( rowIndex, colIndex, dRdX, jacobianFD.toViewConstSizes() ); + } + globalIndex colIndex = wellElemDofNumber[1]+3; + setNumericalJacobianValue( rowIndex, colIndex, dRdX, jacobianFD.toViewConstSizes() ); + } + } + else + { + localIndex rowIndex = wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC+1;; + globalIndex colIndex = wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC+1;; + setNumericalJacobianValue( rowIndex, colIndex, 1.0, jacobianFD.toViewConstSizes() ); + } + + } + } + + + // b) compute all the derivatives wrt to the connection in WELL elem + // iwelem + for( localIndex iwelem = 0; iwelem < subRegion.size(); ++iwelem ) + { + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the rate of the well element + real64 const dRate = perturbParameter * ( connRate[iwelem] + perturbParameter ); + connRate.move( hostMemorySpace, true ); + connRate[iwelem] += dRate; + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC, + dRate, + jacobianFD.toViewConstSizes() ); + } + } + } ); + } ); + + // assemble the analytical jacobian + solver.resetStateToBeginningOfStep( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + //printCompareLocalMatrices( jacobian.toViewConst(), jacobianFD.toViewConst()); + compareLocalMatrices( jacobian.toViewConst(), jacobianFD.toViewConst(), relTol ); +} + +class CompositionalMultiphaseReservoirSolverTest : public ::testing::Test +{ +public: + + CompositionalMultiphaseReservoirSolverTest(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + +protected: + + void SetUp() override + { + setupProblemFromXML( state.getProblemManager(), xmlInput ); + solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > >( "reservoirSystem" ); + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + solver->setupSystem( domain, + solver->getDofManager(), + solver->getLocalMatrix(), + solver->getSystemRhs(), + solver->getSystemSolution() ); + + solver->implicitStepSetup( time, dt, domain ); + } + + static real64 constexpr time = 0.0; + static real64 constexpr dt = 1e4; + static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); + + GeosxState state; + CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > * solver; +}; + +real64 constexpr CompositionalMultiphaseReservoirSolverTest::time; +real64 constexpr CompositionalMultiphaseReservoirSolverTest::dt; +real64 constexpr CompositionalMultiphaseReservoirSolverTest::eps; + +#if 0 + +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Perforation ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->assembleCouplingTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + //solver->assembleSystem( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} + +#endif + +#if 0 +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Flux ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, false, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assembleSystem( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + //solver->assembleSystem( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + //solver->assembleCouplingTerms( time,dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} + +#endif +#if 0 + +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_flux ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, true, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->computePerforationRates( time, dt, domain ); + solver->wellSolver()->assembleFluxTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + solver->assembleCouplingTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} +#endif +#if 1 + +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Accum_Vol_Energy_Bal ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, false, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assembleAccumulationTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_PressureRel ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, true, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assemblePressureRelations( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} +#endif +int main( int argc, char * * argv ) +{ + writeTableToFile( "co2flash.txt", co2flash ); + writeTableToFile( "pvtliquid.txt", pvtLiquid ); + writeTableToFile( "pvtgas.txt", pvtGas ); + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + removeFile( "co2flash.txt" ); + removeFile( "pvtliquid.txt" ); + removeFile( "pvtgas.txt" ); + + return result; +} diff --git a/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp new file mode 100644 index 00000000000..47c0503a29c --- /dev/null +++ b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp @@ -0,0 +1,807 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" + +#include "common/DataTypes.hpp" +#include "mainInterface/initialization.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" +#include "mainInterface/GeosxState.hpp" +#include "mesh/WellElementSubRegion.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" +#include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::constitutive; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; + +void writeTableToFile( string const & filename, char const * str ) +{ + std::ofstream os( filename ); + ASSERT_TRUE( os.is_open() ); + os << str; + os.close(); +} + +void removeFile( string const & filename ) +{ + int const ret = std::remove( filename.c_str() ); + ASSERT_TRUE( ret == 0 ); +} +char const * co2flash = "FlashModel CO2Solubility 1e6 7.5e7 5e5 299.15 369.15 10 0"; +char const * pvtLiquid = "DensityFun PhillipsBrineDensity 1e6 7.5e7 5e5 299.15 369.15 10 0\n" + "ViscosityFun PhillipsBrineViscosity 0\n" + "EnthalpyFun BrineEnthalpy 1e6 7.5e7 5e5 299.15 369.15 10 0\n"; + +char const * pvtGas = "DensityFun SpanWagnerCO2Density 1e6 7.5e7 5e5 299.15 369.15 10\n" + "ViscosityFun FenghourCO2Viscosity 1e6 7.5e7 5e5 299.15 369.15 10\n" + "EnthalpyFun CO2Enthalpy 1e6 7.5e7 5e5 299.15 369.15 10\n"; + +char const * xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )xml"; + + + +template< typename LAMBDA > +void testNumericalJacobian( CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > & solver, + DomainPartition & domain, + real64 const perturbParameter, + real64 const relTol, bool diag_check, + LAMBDA && assembleFunction ) +{ + CompositionalMultiphaseWell & wellSolver = *solver.wellSolver(); + CompositionalMultiphaseFVM & flowSolver = dynamicCast< CompositionalMultiphaseFVM & >( *solver.reservoirSolver() ); + + localIndex const NC = flowSolver.numFluidComponents(); + + CRSMatrix< real64, globalIndex > const & jacobian = solver.getLocalMatrix(); + array1d< real64 > residual( jacobian.numRows() ); + DofManager const & dofManager = solver.getDofManager(); + + // assemble the analytical residual + solver.resetStateToBeginningOfStep( domain ); + + residual.zero(); + jacobian.zero(); + + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + residual.move( hostMemorySpace, false ); + + // copy the analytical residual + array1d< real64 > residualOrig( residual ); + + // create the numerical jacobian + jacobian.move( hostMemorySpace ); + CRSMatrix< real64, globalIndex > jacobianFD( jacobian ); + jacobianFD.zero(); + + string const resDofKey = dofManager.getKey( wellSolver.resElementDofName() ); + string const wellDofKey = dofManager.getKey( wellSolver.wellElementDofName() ); + + // at this point we start assembling the finite-difference block by block + + //////////////////////////////////////////////// + // Step 1) Compute the terms in J_RR and J_WR // + //////////////////////////////////////////////// + if( 1 ) + domain.forMeshBodies( [&] ( MeshBody & meshBody ) + { + meshBody.forMeshLevels( [&] ( MeshLevel & mesh ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + for( localIndex er = 0; er < elemManager.numRegions(); ++er ) + { + ElementRegionBase & elemRegion = elemManager.getRegion( er ); + elemRegion.forElementSubRegionsIndex< CellElementSubRegion >( [&]( localIndex const, CellElementSubRegion & subRegion ) + { + // get the degrees of freedom and ghosting information + arrayView1d< globalIndex const > const & dofNumber = + subRegion.getReference< array1d< globalIndex > >( resDofKey ); + + // get the primary variables on the reservoir elements + arrayView1d< real64 > const & pres = + subRegion.getField< fields::flow::pressure >(); + pres.move( hostMemorySpace, false ); + + arrayView2d< real64, compflow::USD_COMP > const & compDens = + subRegion.getField< fields::flow::globalCompDensity >(); + compDens.move( hostMemorySpace, false ); + + arrayView1d< real64 > const & temp = + subRegion.getField< fields::flow::temperature >(); + temp.move( hostMemorySpace, false ); + + // a) compute all the derivatives wrt to the pressure in RESERVOIR elem ei + for( localIndex ei = 0; ei < subRegion.size(); ++ei ) + { + if( ei ==0 ) + { + real64 totalDensity = 0.0; + for( localIndex ic = 0; ic < NC; ++ic ) + { + totalDensity += compDens[ei][ic]; + } + + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the pressure of the element + real64 const dP = perturbParameter * (pres[ei] + perturbParameter); + pres.move( hostMemorySpace, true ); + pres[ei] += dP; + + // after perturbing, update the pressure-dependent quantities in the reservoir + flowSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh2, + arrayView1d< string const > const & regionNames2 ) + { + mesh2.getElemManager().forElementSubRegions( regionNames2, + [&]( localIndex const, + ElementSubRegionBase & subRegion2 ) + { + flowSolver.updateFluidState( subRegion2 ); + } ); + } ); + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + dofNumber[ei], + dP, + jacobianFD.toViewConstSizes() ); + } + + for( localIndex jc = 0; jc < NC; ++jc ) + { + solver.resetStateToBeginningOfStep( domain ); + + real64 const dRho = perturbParameter * totalDensity; + compDens.move( hostMemorySpace, true ); + compDens[ei][jc] += dRho; + + flowSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh2, + arrayView1d< string const > const & regionNames2 ) + { + mesh2.getElemManager().forElementSubRegions( regionNames2, + [&]( localIndex const, + ElementSubRegionBase & subRegion2 ) + { + flowSolver.updateFluidState( subRegion2 ); + } ); + } ); + wellSolver.updateState( domain ); + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + dofNumber[ei] + jc + 1, + dRho, + jacobianFD.toViewConstSizes() ); + } + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the pressure of the element + real64 const dTemp = perturbParameter * (temp[ei] + perturbParameter); + temp.move( hostMemorySpace, true ); + temp[ei] += dTemp; + + // after perturbing, update the pressure-dependent quantities in the reservoir + flowSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh2, + arrayView1d< string const > const & regionNames2 ) + { + mesh2.getElemManager().forElementSubRegions( regionNames2, + [&]( localIndex const, + ElementSubRegionBase & subRegion2 ) + { + flowSolver.updateFluidState( subRegion2 ); + } ); + } ); + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + dofNumber[ei]+NC+1, + dTemp, + jacobianFD.toViewConstSizes() ); + } + } + } + } ); + } + } ); + return; + } ); + + ///////////////////////////////////////////////// + // Step 2) Compute the terms in J_RW and J_WW // + ///////////////////////////////////////////////// + + // loop over the wells + if( 1 ) + wellSolver.forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions< WellElementSubRegion >( regionNames, + [&]( localIndex const, + WellElementSubRegion & subRegion ) + { + // get the degrees of freedom, ghosting info and next well elem index + arrayView1d< globalIndex const > const & wellElemDofNumber = + subRegion.getReference< array1d< globalIndex > >( wellDofKey ); + + // get the primary variables on the well elements + arrayView1d< real64 > const & wellElemPressure = + subRegion.getField< fields::well::pressure >(); + wellElemPressure.move( hostMemorySpace, false ); + + arrayView1d< real64 > const & wellElemTemperature = + subRegion.getField< fields::well::temperature >(); + wellElemTemperature.move( hostMemorySpace, false ); + + arrayView2d< real64, compflow::USD_COMP > const & wellElemCompDens = + subRegion.getField< fields::well::globalCompDensity >(); + wellElemCompDens.move( hostMemorySpace, false ); + + arrayView1d< real64 > const & connRate = + subRegion.getField< fields::well::mixtureConnectionRate >(); + connRate.move( hostMemorySpace, false ); + + // a) compute all the derivatives wrt to the pressure in WELL elem iwelem + for( localIndex iwelem = 0; iwelem < subRegion.size(); ++iwelem ) + { + + real64 wellElemTotalDensity = 0.0; + for( localIndex ic = 0; ic < NC; ++ic ) + { + wellElemTotalDensity += wellElemCompDens[iwelem][ic]; + } + + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the pressure of the well element + real64 const dP = perturbParameter * ( wellElemPressure[iwelem] + perturbParameter ); + wellElemPressure.move( hostMemorySpace, true ); + wellElemPressure[iwelem] += dP; + + // after perturbing, update the pressure-dependent quantities in the well + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DPRES, + dP, + jacobianFD.toViewConstSizes() ); + } + + for( localIndex jc = 0; jc < NC; ++jc ) + { + solver.resetStateToBeginningOfStep( domain ); + + real64 const dRho = perturbParameter * wellElemTotalDensity; + wellElemCompDens.move( hostMemorySpace, true ); + wellElemCompDens[iwelem][jc] += dRho; + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + jc, + dRho, + jacobianFD.toViewConstSizes() ); + } + { + solver.resetStateToBeginningOfStep( domain ); + residual.zero(); + jacobian.zero(); + if( diag_check || iwelem > 0 ) + { + // here is the perturbation in the temperature of the well element + real64 const dT = perturbParameter * ( wellElemTemperature[iwelem] + perturbParameter ); + wellElemTemperature.move( hostMemorySpace, true ); + wellElemTemperature[iwelem] += dT; + + // after perturbing, update the pressure-dependent quantities in the well + wellSolver.updateState( domain ); + + + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC+1, + dT, + jacobianFD.toViewConstSizes() ); + } + else + { + localIndex rowIndex = wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC+1;; + globalIndex colIndex = wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC+1;; + setNumericalJacobianValue( rowIndex, colIndex, 1.0, jacobianFD.toViewConstSizes() ); + } + } + } + + + // b) compute all the derivatives wrt to the connection in WELL elem + // iwelem + for( localIndex iwelem = 0; iwelem < subRegion.size(); ++iwelem ) + { + { + solver.resetStateToBeginningOfStep( domain ); + + // here is the perturbation in the rate of the well element + real64 const dRate = perturbParameter * ( connRate[iwelem] + perturbParameter ); + connRate.move( hostMemorySpace, true ); + connRate[iwelem] += dRate; + + wellSolver.updateState( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + + fillNumericalJacobian( residual.toViewConst(), + residualOrig.toViewConst(), + wellElemDofNumber[iwelem] + compositionalMultiphaseWellKernels::ColOffset::DCOMP + NC, + dRate, + jacobianFD.toViewConstSizes() ); + } + } + } ); + } ); + + // assemble the analytical jacobian + solver.resetStateToBeginningOfStep( domain ); + + residual.zero(); + jacobian.zero(); + assembleFunction( jacobian.toViewConstSizes(), residual.toView() ); + //printCompareLocalMatrices( jacobian.toViewConst(), jacobianFD.toViewConst()); + compareLocalMatrices( jacobian.toViewConst(), jacobianFD.toViewConst(), relTol ); +} + +class CompositionalMultiphaseReservoirSolverTest : public ::testing::Test +{ +public: + + CompositionalMultiphaseReservoirSolverTest(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + +protected: + + void SetUp() override + { + setupProblemFromXML( state.getProblemManager(), xmlInput ); + solver = &state.getProblemManager().getPhysicsSolverManager().getGroup< CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > >( "reservoirSystem" ); + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + solver->setupSystem( domain, + solver->getDofManager(), + solver->getLocalMatrix(), + solver->getSystemRhs(), + solver->getSystemSolution() ); + + solver->implicitStepSetup( time, dt, domain ); + } + + static real64 constexpr time = 0.0; + static real64 constexpr dt = 1e4; + static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); + + GeosxState state; + CompositionalMultiphaseReservoirAndWells< CompositionalMultiphaseBase > * solver; +}; + +real64 constexpr CompositionalMultiphaseReservoirSolverTest::time; +real64 constexpr CompositionalMultiphaseReservoirSolverTest::dt; +real64 constexpr CompositionalMultiphaseReservoirSolverTest::eps; + +#if 0 + +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Perforation ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->assembleCouplingTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + //solver->assembleSystem( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} + +#endif + +#if 1 +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Flux ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, false, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assembleSystem( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + //solver->assembleSystem( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + //solver->assembleCouplingTerms( time,dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} + +#endif +#if 0 + +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_flux ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, true, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->computePerforationRates( time, dt, domain ); + solver->wellSolver()->assembleFluxTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + solver->assembleCouplingTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} +#endif +#if 1 + +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_Accum_Vol_Energy_Bal ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, false, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assembleAccumulationTerms( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} +TEST_F( CompositionalMultiphaseReservoirSolverTest, jacobianNumericalCheck_PressureRel ) +{ + real64 const perturb = std::sqrt( eps ); + real64 const tol = 1e-1; // 10% error margin + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + + testNumericalJacobian( *solver, domain, perturb, tol, true, + [&] ( CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + solver->wellSolver()->assemblePressureRelations( time, dt, domain, solver->getDofManager(), localMatrix, localRhs ); + } ); +} +#endif +int main( int argc, char * * argv ) +{ + writeTableToFile( "co2flash.txt", co2flash ); + writeTableToFile( "pvtliquid.txt", pvtLiquid ); + writeTableToFile( "pvtgas.txt", pvtGas ); + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + removeFile( "co2flash.txt" ); + removeFile( "pvtliquid.txt" ); + removeFile( "pvtgas.txt" ); + + return result; +} From d19bdd729a9b968df84526dfeb073c35bc4d90b4 Mon Sep 17 00:00:00 2001 From: acitrain <60715545+acitrain@users.noreply.github.com> Date: Fri, 1 Nov 2024 23:56:02 +0100 Subject: [PATCH 228/286] feat: Add option for automatic timestep computation in wave solvers (#2909) * First implementation of power iteration to compute time-step * change coeff for ComputeDT + uncrustify * Fix dotProduct function to be able to run on GPU * Add MpiWrapper::min to get the minimum time-step on all subdomain * Add automatic computation for elastic case (need to be tested) + fix little bug in acoustic * Add option to trigger computation of the time-step + new function to make it usable with pygeosx without exiting the code * Power iteration routine for first order acoustic wave solver * Modify file after last merge with develop * Modify computeTimeStep prototype + add call to test power iteration on first order acoustic solver * Add dt computation for first order elastic wave solver * Add routine for dotProduct on 2d array + change routine for automatic dt in elastic first order solver * Remove unused code + fix some const * Change abs into LvArray::math;;abs * Move computeDt routine inside cpp file (sumplify kernel call) NEED TO BE TESTED * Reunable timestep computation for second order elastic solver + uncrusrify * New way to call the automatic time-step computation without a need of restarting the code * Propagate changes from second order acoustic solver to second order elastic solver for automatic timestep computation * added table functions for sources--to be tested --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 10 +- inputFiles/wavePropagation/AcousticSEM.ats | 8 + .../acous3D_Q1_srcTable_dtCFL_smoke.xml | 176 ++ inputFiles/wavePropagation/source1.txt | 1501 +++++++++++++++++ inputFiles/wavePropagation/source2.txt | 1501 +++++++++++++++++ inputFiles/wavePropagation/time.txt | 1501 +++++++++++++++++ .../AcousticFirstOrderWaveEquationSEM.cpp | 40 +- .../AcousticFirstOrderWaveEquationSEM.hpp | 2 + ...cousticFirstOrderWaveEquationSEMKernel.hpp | 20 +- .../AcousticVTIWaveEquationSEM.cpp | 44 +- .../AcousticVTIWaveEquationSEM.hpp | 5 +- .../AcousticVTIWaveEquationSEMKernel.hpp | 16 +- .../isotropic/AcousticWaveEquationSEM.cpp | 182 +- .../isotropic/AcousticWaveEquationSEM.hpp | 10 +- .../AcousticElasticWaveEquationSEM.cpp | 10 +- .../ElasticFirstOrderWaveEquationSEM.cpp | 46 +- .../ElasticFirstOrderWaveEquationSEM.hpp | 2 + ...ElasticFirstOrderWaveEquationSEMKernel.hpp | 18 +- .../ElasticVTIWaveEquationSEMKernel.hpp | 288 ++++ .../isotropic/ElasticWaveEquationSEM.cpp | 238 ++- .../isotropic/ElasticWaveEquationSEM.hpp | 8 +- .../PrecomputeSourcesAndReceiversKernel.hpp | 48 +- .../wavePropagation/shared/WaveSolverBase.cpp | 53 +- .../wavePropagation/shared/WaveSolverBase.hpp | 30 +- .../shared/WaveSolverUtils.hpp | 28 + .../testWavePropagation.cpp | 11 +- .../testWavePropagationDAS.cpp | 8 +- 28 files changed, 5524 insertions(+), 282 deletions(-) create mode 100755 inputFiles/wavePropagation/acous3D_Q1_srcTable_dtCFL_smoke.xml create mode 100644 inputFiles/wavePropagation/source1.txt create mode 100644 inputFiles/wavePropagation/source2.txt create mode 100644 inputFiles/wavePropagation/time.txt diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 1026f009fb0..c236ea8a83a 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3156-8366-aa71f2a + baseline: integratedTests/baseline_integratedTests-pr2909-8386-3a7b08d allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 51b738f22fa..e9745cb89a9 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #2909 (2024-10-30) +===================== +Add routine for automatic time steps in waveSolvers with new attributes + PR #3156 (2024-10-29) ==================== Restart check errors due to 1) schema node added to enable thermal option in well model and 2) arrays removed/added for option. Max difference errors due treatment of shutin wells. Previously non-zero rate value reported for shutin well, new code will set rate arrays to zero. @@ -52,7 +56,7 @@ Added restartcheks to hydrofrac cases and reduced time of cases that were too lo PR #3135 (2024-09-04) ====================== -Temperature dependent single phase thermal conductivity. Rebaseline all thermal cases. +Temperature dependent single phase thermal conductivity. Rebaseline all thermal cases. PR #3294 (2024-09-01) ====================== @@ -68,11 +72,11 @@ Reuse computeSinglePhaseFlux. Rebaseline due to minor numerical diffs. PR #3249 (2024-08-14) ====================== -Two initialization options for poromechanical models. Rebaseline the corresponding cases. +Two initialization options for poromechanical models. Rebaseline the corresponding cases. PR #3278 (2024-08-12) ====================== -Renamed GEOSX to GEOS in enternal mesh import, so rebaseline to change these names is the baselines. +Renamed GEOSX to GEOS in enternal mesh import, so rebaseline to change these names is the baselines. 202 (2024-08-03) ====================== diff --git a/inputFiles/wavePropagation/AcousticSEM.ats b/inputFiles/wavePropagation/AcousticSEM.ats index 96ddf177bd2..0aceac62888 100644 --- a/inputFiles/wavePropagation/AcousticSEM.ats +++ b/inputFiles/wavePropagation/AcousticSEM.ats @@ -50,6 +50,14 @@ decks = [ partitions=((1, 1, 1), (2, 2, 2)), restart_step=100, check_step=200, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="acous3D_Q1_srcTable_dtCFL_smoke", + description= + 'Acoustic wave solver, first-order FE, source tables and automatic CFL limit', + partitions=((1, 1, 1), (2, 2, 2)), + restart_step=100, + check_step=200, restartcheck_params=RestartcheckParameters(**restartcheck_params)) ] diff --git a/inputFiles/wavePropagation/acous3D_Q1_srcTable_dtCFL_smoke.xml b/inputFiles/wavePropagation/acous3D_Q1_srcTable_dtCFL_smoke.xml new file mode 100755 index 00000000000..81b503d592f --- /dev/null +++ b/inputFiles/wavePropagation/acous3D_Q1_srcTable_dtCFL_smoke.xml @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/wavePropagation/source1.txt b/inputFiles/wavePropagation/source1.txt new file mode 100644 index 00000000000..511fd3179f0 --- /dev/null +++ b/inputFiles/wavePropagation/source1.txt @@ -0,0 +1,1501 @@ +3.72008e-44 +1.0087e-43 +2.72143e-43 +7.30573e-43 +1.95145e-42 +5.18658e-42 +1.37161e-41 +3.60921e-41 +9.44975e-41 +2.46183e-40 +6.3815e-40 +1.64595e-39 +4.22415e-39 +1.07868e-38 +2.74076e-38 +6.92912e-38 +1.74307e-37 +4.36295e-37 +1.08661e-36 +2.69275e-36 +6.63968e-36 +1.62902e-35 +3.9768e-35 +9.65985e-35 +2.33472e-34 +5.61473e-34 +1.34354e-33 +3.1989e-33 +7.57845e-33 +1.78644e-32 +4.19009e-32 +9.77886e-32 +2.27081e-31 +5.2469e-31 +1.20629e-30 +2.75951e-30 +6.28115e-30 +1.42257e-29 +3.20582e-29 +7.18839e-29 +1.60381e-28 +3.56043e-28 +7.86469e-28 +1.72858e-27 +3.78028e-27 +8.22598e-27 +1.78107e-26 +3.83708e-26 +8.22528e-26 +1.7544e-25 +3.72336e-25 +7.86268e-25 +1.65209e-24 +3.45403e-24 +7.18534e-24 +1.48729e-23 +3.06319e-23 +6.27741e-23 +1.28002e-22 +2.59704e-22 +5.24289e-22 +1.05315e-21 +2.10494e-21 +4.18617e-21 +8.28368e-21 +1.63101e-20 +3.19537e-20 +6.22891e-20 +1.20818e-19 +2.33174e-19 +4.47773e-19 +8.55586e-19 +1.62666e-18 +3.07724e-18 +5.79231e-18 +1.08486e-17 +2.02172e-17 +3.74884e-17 +6.91675e-17 +1.2698e-16 +2.31952e-16 +4.21589e-16 +7.62446e-16 +1.37201e-15 +2.4566e-15 +4.37662e-15 +7.7584e-15 +1.36847e-14 +2.40173e-14 +4.19415e-14 +7.28772e-14 +1.25999e-13 +2.16757e-13 +3.71028e-13 +6.31929e-13 +1.07092e-12 +1.80583e-12 +3.02987e-12 +5.05825e-12 +8.40243e-12 +1.38879e-11 +2.28402e-11 +3.73757e-11 +6.08567e-11 +9.85951e-11 +1.58939e-10 +2.54938e-10 +4.06881e-10 +6.46143e-10 +1.02098e-09 +1.60523e-09 +2.51121e-09 +3.90894e-09 +6.05428e-09 +9.33029e-09 +1.43072e-08 +2.18296e-08 +3.31408e-08 +5.00622e-08 +7.52462e-08 +1.12535e-07 +1.67464e-07 +2.4796e-07 +3.65317e-07 +5.35535e-07 +7.81149e-07 +1.13373e-06 +1.63724e-06 +2.35258e-06 +3.3636e-06 +4.78512e-06 +6.77345e-06 +9.54016e-06 +1.337e-05 +1.86437e-05 +2.58681e-05 +3.57128e-05 +4.90584e-05 +6.70548e-05 +9.1196e-05 +0.00012341 +0.00016617 +0.00022263 +0.000296786 +0.000393669 +0.000519575 +0.000682328 +0.000891594 +0.00115923 +0.00149969 +0.00193045 +0.00247256 +0.00315111 +0.00399585 +0.00504176 +0.00632972 +0.00790705 +0.00982819 +0.0121552 +0.0149581 +0.0183156 +0.0223149 +0.0270518 +0.0326308 +0.0391639 +0.0467706 +0.0555762 +0.0657103 +0.0773047 +0.0904914 +0.105399 +0.122151 +0.140858 +0.161621 +0.18452 +0.209611 +0.236928 +0.266468 +0.298197 +0.33204 +0.367879 +0.405555 +0.444858 +0.485537 +0.527292 +0.569783 +0.612626 +0.655406 +0.697676 +0.738968 +0.778801 +0.816686 +0.852144 +0.884706 +0.913931 +0.939413 +0.960789 +0.977751 +0.99005 +0.997503 +1 +0.997503 +0.99005 +0.977751 +0.960789 +0.939413 +0.913931 +0.884706 +0.852144 +0.816686 +0.778801 +0.738968 +0.697676 +0.655406 +0.612626 +0.569783 +0.527292 +0.485537 +0.444858 +0.405555 +0.367879 +0.33204 +0.298197 +0.266468 +0.236928 +0.209611 +0.18452 +0.161621 +0.140858 +0.122151 +0.105399 +0.0904914 +0.0773047 +0.0657103 +0.0555762 +0.0467706 +0.0391639 +0.0326308 +0.0270518 +0.0223149 +0.0183156 +0.0149581 +0.0121552 +0.00982819 +0.00790705 +0.00632972 +0.00504176 +0.00399585 +0.00315111 +0.00247256 +0.00193045 +0.00149969 +0.00115923 +0.000891594 +0.000682328 +0.000519575 +0.000393669 +0.000296786 +0.00022263 +0.00016617 +0.00012341 +9.1196e-05 +6.70548e-05 +4.90584e-05 +3.57128e-05 +2.58681e-05 +1.86437e-05 +1.337e-05 +9.54016e-06 +6.77345e-06 +4.78512e-06 +3.3636e-06 +2.35258e-06 +1.63724e-06 +1.13373e-06 +7.81149e-07 +5.35535e-07 +3.65317e-07 +2.4796e-07 +1.67464e-07 +1.12535e-07 +7.52462e-08 +5.00622e-08 +3.31408e-08 +2.18296e-08 +1.43072e-08 +9.33029e-09 +6.05428e-09 +3.90894e-09 +2.51121e-09 +1.60523e-09 +1.02098e-09 +6.46143e-10 +4.06881e-10 +2.54938e-10 +1.58939e-10 +9.85951e-11 +6.08567e-11 +3.73757e-11 +2.28402e-11 +1.38879e-11 +8.40243e-12 +5.05825e-12 +3.02987e-12 +1.80583e-12 +1.07092e-12 +6.31929e-13 +3.71028e-13 +2.16757e-13 +1.25999e-13 +7.28772e-14 +4.19415e-14 +2.40173e-14 +1.36847e-14 +7.7584e-15 +4.37662e-15 +2.4566e-15 +1.37201e-15 +7.62446e-16 +4.21589e-16 +2.31952e-16 +1.2698e-16 +6.91675e-17 +3.74884e-17 +2.02172e-17 +1.08486e-17 +5.79231e-18 +3.07724e-18 +1.62666e-18 +8.55586e-19 +4.47773e-19 +2.33174e-19 +1.20818e-19 +6.22891e-20 +3.19537e-20 +1.63101e-20 +8.28368e-21 +4.18617e-21 +2.10494e-21 +1.05315e-21 +5.24289e-22 +2.59704e-22 +1.28002e-22 +6.27741e-23 +3.06319e-23 +1.48729e-23 +7.18534e-24 +3.45403e-24 +1.65209e-24 +7.86268e-25 +3.72336e-25 +1.7544e-25 +8.22528e-26 +3.83708e-26 +1.78107e-26 +8.22598e-27 +3.78028e-27 +1.72858e-27 +7.86469e-28 +3.56043e-28 +1.60381e-28 +7.18839e-29 +3.20582e-29 +1.42257e-29 +6.28115e-30 +2.75951e-30 +1.20629e-30 +5.2469e-31 +2.27081e-31 +9.77886e-32 +4.19009e-32 +1.78644e-32 +7.57845e-33 +3.1989e-33 +1.34354e-33 +5.61473e-34 +2.33472e-34 +9.65985e-35 +3.9768e-35 +1.62902e-35 +6.63968e-36 +2.69275e-36 +1.08661e-36 +4.36295e-37 +1.74307e-37 +6.92912e-38 +2.74076e-38 +1.07868e-38 +4.22415e-39 +1.64595e-39 +6.3815e-40 +2.46183e-40 +9.44975e-41 +3.60921e-41 +1.37161e-41 +5.18658e-42 +1.95145e-42 +7.30573e-43 +2.72143e-43 +1.0087e-43 +3.72008e-44 +1.36512e-44 +4.98448e-45 +1.81091e-45 +6.54639e-46 +2.3547e-46 +8.42749e-47 +3.00116e-47 +1.06343e-47 +3.74936e-48 +1.31533e-48 +4.59133e-49 +1.59467e-49 +5.51105e-50 +1.89507e-50 +6.48401e-51 +2.20745e-51 +7.4777e-52 +2.52042e-52 +8.4529e-53 +2.82077e-53 +9.36608e-54 +3.0944e-54 +1.01724e-54 +3.32736e-55 +1.08294e-55 +3.50701e-56 +1.13005e-56 +3.62317e-57 +1.15587e-57 +3.66906e-58 +1.15886e-58 +3.64195e-59 +1.13885e-59 +3.54347e-60 +1.09703e-60 +3.37937e-61 +1.03582e-61 +3.15906e-62 +9.58655e-63 +2.89464e-63 +8.69672e-64 +2.59983e-64 +7.73326e-65 +2.28881e-65 +6.74038e-66 +1.97509e-66 +5.75864e-67 +1.67063e-67 +4.82247e-68 +1.38512e-68 +3.95852e-69 +1.12566e-69 +3.18501e-70 +8.96691e-71 +2.51191e-71 +7.00152e-72 +1.94182e-72 +5.35865e-73 +1.4714e-73 +4.02006e-74 +1.09286e-74 +2.95613e-75 +7.95632e-76 +2.13074e-76 +5.67773e-77 +1.50539e-77 +3.97147e-78 +1.04252e-78 +2.72297e-79 +7.0767e-80 +1.82998e-80 +4.70861e-81 +1.2055e-81 +3.07092e-82 +7.78394e-83 +1.96317e-83 +4.92659e-84 +1.23016e-84 +3.05639e-85 +7.55582e-86 +1.85859e-86 +4.54898e-87 +1.10783e-87 +2.68448e-88 +6.47257e-89 +1.55282e-89 +3.70676e-90 +8.80433e-91 +2.08078e-91 +4.89311e-92 +1.14491e-92 +2.66556e-93 +6.17494e-94 +1.42333e-94 +3.26443e-95 +7.44966e-96 +1.69159e-96 +3.82192e-97 +8.59207e-98 +1.92195e-98 +4.27774e-99 +9.4736e-100 +2.08759e-100 +4.57723e-101 +9.98595e-102 +2.16773e-102 +4.68218e-103 +1.00628e-103 +2.1519e-104 +4.57879e-105 +9.69412e-106 +2.04218e-106 +4.28065e-107 +8.92798e-108 +1.85279e-108 +3.82583e-109 +7.86058e-110 +1.60699e-110 +3.26887e-111 +6.61626e-112 +1.33246e-112 +2.6701e-113 +5.32387e-114 +1.05622e-114 +2.08504e-115 +4.09543e-116 +8.00412e-117 +1.55653e-117 +3.01181e-118 +5.79866e-119 +1.11085e-119 +2.11745e-120 +4.01604e-121 +7.579e-122 +1.42316e-122 +2.65904e-123 +4.94339e-124 +9.14435e-125 +1.6831e-125 +3.08244e-126 +5.61705e-127 +1.01848e-127 +1.83747e-128 +3.29853e-129 +5.8918e-130 +1.04714e-130 +1.85178e-131 +3.25839e-132 +5.70485e-133 +9.93836e-134 +1.72272e-134 +2.97126e-135 +5.09914e-136 +8.70727e-137 +1.47943e-137 +2.50113e-138 +4.20733e-139 +7.04215e-140 +1.17282e-140 +1.94351e-141 +3.20459e-142 +5.25757e-143 +8.58274e-144 +1.39411e-144 +2.25317e-145 +3.62344e-146 +5.79797e-147 +9.23124e-148 +1.46242e-148 +2.30523e-149 +3.61562e-150 +5.64262e-151 +8.76209e-152 +1.35383e-152 +2.08136e-153 +3.18389e-154 +4.84617e-155 +7.33953e-156 +1.10603e-156 +1.65841e-157 +2.47427e-158 +3.67308e-159 +5.42553e-160 +7.97411e-161 +1.16614e-161 +1.69687e-162 +2.45683e-163 +3.53939e-164 +5.07355e-165 +7.23641e-166 +1.02698e-166 +1.45021e-167 +2.03765e-168 +2.84875e-169 +3.96286e-170 +5.48519e-171 +7.55444e-172 +1.03524e-172 +1.4116e-173 +1.91517e-174 +2.58543e-175 +3.47285e-176 +4.64161e-177 +6.17276e-178 +8.16806e-179 +1.07544e-179 +1.40891e-180 +1.83657e-181 +2.38211e-182 +3.07428e-183 +3.94779e-184 +5.04422e-185 +6.413e-186 +8.11255e-187 +1.02113e-187 +1.2789e-188 +1.59374e-189 +1.97618e-190 +2.43818e-191 +2.99318e-192 +3.65619e-193 +4.44379e-194 +5.37411e-195 +6.46678e-196 +7.7428e-197 +9.22437e-198 +1.09346e-198 +1.28973e-199 +1.51364e-200 +1.76757e-201 +2.05379e-202 +2.37447e-203 +2.73152e-204 +3.12659e-205 +3.56096e-206 +4.03544e-207 +4.55033e-208 +5.10533e-209 +5.69945e-210 +6.33098e-211 +6.99741e-212 +7.69542e-213 +8.42084e-214 +9.1687e-215 +9.93317e-216 +1.07077e-216 +1.14851e-217 +1.22575e-218 +1.30165e-219 +1.37537e-220 +1.44601e-221 +1.51269e-222 +1.57456e-223 +1.63078e-224 +1.68059e-225 +1.72328e-226 +1.75824e-227 +1.78497e-228 +1.80306e-229 +1.81225e-230 +1.81241e-231 +1.80352e-232 +1.78573e-233 +1.75929e-234 +1.7246e-235 +1.68217e-236 +1.63259e-237 +1.57657e-238 +1.51488e-239 +1.44835e-240 +1.37783e-241 +1.3042e-242 +1.22836e-243 +1.15115e-244 +1.07342e-245 +9.95941e-247 +9.19448e-248 +8.44596e-249 +7.71968e-250 +7.02067e-251 +6.3531e-252 +5.72034e-253 +5.12491e-254 +4.56856e-255 +4.0523e-256 +3.57644e-257 +3.14073e-258 +2.74434e-259 +2.38601e-260 +2.06413e-261 +1.77677e-262 +1.52178e-263 +1.29688e-264 +1.09971e-265 +9.27868e-267 +7.78972e-268 +6.50707e-269 +5.40852e-270 +4.473e-271 +3.68086e-272 +3.01389e-273 +2.45546e-274 +1.99053e-275 +1.60558e-276 +1.28862e-277 +1.02907e-278 +8.17701e-280 +6.46505e-281 +5.08602e-282 +3.98119e-283 +3.10082e-284 +2.40308e-285 +1.85306e-286 +1.4218e-287 +1.08546e-288 +8.24558e-290 +6.2324e-291 +4.68726e-292 +3.5076e-293 +2.61174e-294 +1.93499e-295 +1.42645e-296 +1.04631e-297 +7.63653e-299 +5.54573e-300 +4.00728e-301 +2.88117e-302 +2.06119e-303 +1.46722e-304 +1.0392e-305 +7.32376e-307 +5.13566e-308 +3.58333e-309 +2.48775e-310 +1.71852e-311 +1.18122e-312 +8.0786e-314 +5.49756e-315 +3.72248e-316 +2.50797e-317 +1.68129e-318 +1.12148e-319 +7.44557e-321 +4.89125e-322 +3.45846e-323 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/inputFiles/wavePropagation/source2.txt b/inputFiles/wavePropagation/source2.txt new file mode 100644 index 00000000000..0de4a75cb17 --- /dev/null +++ b/inputFiles/wavePropagation/source2.txt @@ -0,0 +1,1501 @@ +1.24003e-44 +3.36233e-44 +9.07143e-44 +2.43524e-43 +6.50483e-43 +1.72886e-42 +4.57203e-42 +1.20307e-41 +3.14992e-41 +8.2061e-41 +2.12717e-40 +5.4865e-40 +1.40805e-39 +3.5956e-39 +9.13587e-39 +2.30971e-38 +5.81023e-38 +1.45432e-37 +3.62203e-37 +8.97583e-37 +2.21323e-36 +5.43007e-36 +1.3256e-35 +3.21995e-35 +7.7824e-35 +1.87158e-34 +4.47847e-34 +1.0663e-33 +2.52615e-33 +5.9548e-33 +1.3967e-32 +3.25962e-32 +7.56937e-32 +1.74897e-31 +4.02097e-31 +9.19837e-31 +2.09372e-30 +4.7419e-30 +1.06861e-29 +2.39613e-29 +5.34603e-29 +1.18681e-28 +2.62156e-28 +5.76193e-28 +1.26009e-27 +2.74199e-27 +5.9369e-27 +1.27903e-26 +2.74176e-26 +5.848e-26 +1.24112e-25 +2.62089e-25 +5.50697e-25 +1.15134e-24 +2.39511e-24 +4.95763e-24 +1.02106e-23 +2.09247e-23 +4.26673e-23 +8.6568e-23 +1.74763e-22 +3.5105e-22 +7.01647e-22 +1.39539e-21 +2.76123e-21 +5.4367e-21 +1.06512e-20 +2.0763e-20 +4.02727e-20 +7.77247e-20 +1.49258e-19 +2.85195e-19 +5.4222e-19 +1.02575e-18 +1.93077e-18 +3.6162e-18 +6.73907e-18 +1.24961e-17 +2.30558e-17 +4.23267e-17 +7.73173e-17 +1.4053e-16 +2.54149e-16 +4.57337e-16 +8.18867e-16 +1.45887e-15 +2.58613e-15 +4.56157e-15 +8.00577e-15 +1.39805e-14 +2.42924e-14 +4.19997e-14 +7.22523e-14 +1.23676e-13 +2.10643e-13 +3.56973e-13 +6.01943e-13 +1.00996e-12 +1.68608e-12 +2.80081e-12 +4.6293e-12 +7.6134e-12 +1.24586e-11 +2.02856e-11 +3.2865e-11 +5.29797e-11 +8.49793e-11 +1.35627e-10 +2.15381e-10 +3.40327e-10 +5.35077e-10 +8.3707e-10 +1.30298e-09 +2.01809e-09 +3.1101e-09 +4.76907e-09 +7.27653e-09 +1.10469e-08 +1.66874e-08 +2.50821e-08 +3.75117e-08 +5.58213e-08 +8.26533e-08 +1.21772e-07 +1.78512e-07 +2.60383e-07 +3.7791e-07 +5.45747e-07 +7.84193e-07 +1.1212e-06 +1.59504e-06 +2.25782e-06 +3.18005e-06 +4.45667e-06 +6.21457e-06 +8.6227e-06 +1.19043e-05 +1.63528e-05 +2.23516e-05 +3.03987e-05 +4.11367e-05 +5.539e-05 +7.421e-05 +9.89287e-05 +0.000131223 +0.000173192 +0.000227443 +0.000297198 +0.00038641 +0.000499897 +0.000643483 +0.000824187 +0.00105037 +0.00133195 +0.00168059 +0.00210991 +0.00263568 +0.00327606 +0.00405173 +0.00498603 +0.0061052 +0.0074383 +0.00901727 +0.0108769 +0.0130546 +0.0155902 +0.0185254 +0.0219034 +0.0257682 +0.0301638 +0.035133 +0.040717 +0.0469527 +0.0538737 +0.0615067 +0.0698703 +0.078976 +0.0888227 +0.099399 +0.11068 +0.122626 +0.135185 +0.148286 +0.161846 +0.175764 +0.189928 +0.204209 +0.218469 +0.232559 +0.246323 +0.2596 +0.272229 +0.284048 +0.294902 +0.304644 +0.313138 +0.320263 +0.325917 +0.330017 +0.332501 +0.333333 +0.332501 +0.330017 +0.325917 +0.320263 +0.313138 +0.304644 +0.294902 +0.284048 +0.272229 +0.2596 +0.246323 +0.232559 +0.218469 +0.204209 +0.189928 +0.175764 +0.161846 +0.148286 +0.135185 +0.122626 +0.11068 +0.099399 +0.0888227 +0.078976 +0.0698703 +0.0615067 +0.0538737 +0.0469527 +0.040717 +0.035133 +0.0301638 +0.0257682 +0.0219034 +0.0185254 +0.0155902 +0.0130546 +0.0108769 +0.00901727 +0.0074383 +0.0061052 +0.00498603 +0.00405173 +0.00327606 +0.00263568 +0.00210991 +0.00168059 +0.00133195 +0.00105037 +0.000824187 +0.000643483 +0.000499897 +0.00038641 +0.000297198 +0.000227443 +0.000173192 +0.000131223 +9.89287e-05 +7.421e-05 +5.539e-05 +4.11367e-05 +3.03987e-05 +2.23516e-05 +1.63528e-05 +1.19043e-05 +8.6227e-06 +6.21457e-06 +4.45667e-06 +3.18005e-06 +2.25782e-06 +1.59504e-06 +1.1212e-06 +7.84193e-07 +5.45747e-07 +3.7791e-07 +2.60383e-07 +1.78512e-07 +1.21772e-07 +8.26533e-08 +5.58213e-08 +3.75117e-08 +2.50821e-08 +1.66874e-08 +1.10469e-08 +7.27653e-09 +4.76907e-09 +3.1101e-09 +2.01809e-09 +1.30298e-09 +8.3707e-10 +5.35077e-10 +3.40327e-10 +2.15381e-10 +1.35627e-10 +8.49793e-11 +5.29797e-11 +3.2865e-11 +2.02856e-11 +1.24586e-11 +7.6134e-12 +4.6293e-12 +2.80081e-12 +1.68608e-12 +1.00996e-12 +6.01943e-13 +3.56973e-13 +2.10643e-13 +1.23676e-13 +7.22523e-14 +4.19997e-14 +2.42924e-14 +1.39805e-14 +8.00577e-15 +4.56157e-15 +2.58613e-15 +1.45887e-15 +8.18867e-16 +4.57337e-16 +2.54149e-16 +1.4053e-16 +7.73173e-17 +4.23267e-17 +2.30558e-17 +1.24961e-17 +6.73907e-18 +3.6162e-18 +1.93077e-18 +1.02575e-18 +5.4222e-19 +2.85195e-19 +1.49258e-19 +7.77247e-20 +4.02727e-20 +2.0763e-20 +1.06512e-20 +5.4367e-21 +2.76123e-21 +1.39539e-21 +7.01647e-22 +3.5105e-22 +1.74763e-22 +8.6568e-23 +4.26673e-23 +2.09247e-23 +1.02106e-23 +4.95763e-24 +2.39511e-24 +1.15134e-24 +5.50697e-25 +2.62089e-25 +1.24112e-25 +5.848e-26 +2.74176e-26 +1.27903e-26 +5.9369e-27 +2.74199e-27 +1.26009e-27 +5.76193e-28 +2.62156e-28 +1.18681e-28 +5.34603e-29 +2.39613e-29 +1.06861e-29 +4.7419e-30 +2.09372e-30 +9.19837e-31 +4.02097e-31 +1.74897e-31 +7.56937e-32 +3.25962e-32 +1.3967e-32 +5.9548e-33 +2.52615e-33 +1.0663e-33 +4.47847e-34 +1.87158e-34 +7.7824e-35 +3.21995e-35 +1.3256e-35 +5.43007e-36 +2.21323e-36 +8.97583e-37 +3.62203e-37 +1.45432e-37 +5.81023e-38 +2.30971e-38 +9.13587e-39 +3.5956e-39 +1.40805e-39 +5.4865e-40 +2.12717e-40 +8.2061e-41 +3.14992e-41 +1.20307e-41 +4.57203e-42 +1.72886e-42 +6.50483e-43 +2.43524e-43 +9.07143e-44 +3.36233e-44 +1.24003e-44 +4.5504e-45 +1.66149e-45 +6.03637e-46 +2.18213e-46 +7.849e-47 +2.80916e-47 +1.00039e-47 +3.54477e-48 +1.24979e-48 +4.38443e-49 +1.53044e-49 +5.31557e-50 +1.83702e-50 +6.3169e-51 +2.16134e-51 +7.35817e-52 +2.49257e-52 +8.4014e-53 +2.81763e-53 +9.40257e-54 +3.12203e-54 +1.03147e-54 +3.3908e-55 +1.10912e-55 +3.6098e-56 +1.169e-56 +3.76683e-57 +1.20772e-57 +3.8529e-58 +1.22302e-58 +3.86287e-59 +1.21398e-59 +3.79617e-60 +1.18116e-60 +3.65677e-61 +1.12646e-61 +3.45273e-62 +1.05302e-62 +3.19552e-63 +9.6488e-64 +2.89891e-64 +8.6661e-65 +2.57775e-65 +7.62937e-66 +2.24679e-66 +6.58363e-67 +1.91955e-67 +5.56877e-68 +1.60749e-68 +4.61707e-69 +1.31951e-69 +3.7522e-70 +1.06167e-70 +2.98897e-71 +8.37303e-72 +2.33384e-72 +6.47273e-73 +1.78622e-73 +4.90467e-74 +1.34002e-74 +3.64287e-75 +9.85377e-76 +2.65211e-76 +7.10247e-77 +1.89258e-77 +5.01797e-78 +1.32382e-78 +3.47507e-79 +9.07657e-80 +2.3589e-80 +6.09993e-81 +1.56954e-81 +4.01833e-82 +1.02364e-82 +2.59465e-83 +6.5439e-84 +1.6422e-84 +4.10053e-85 +1.0188e-85 +2.51861e-86 +6.1953e-87 +1.51633e-87 +3.69277e-88 +8.94827e-89 +2.15752e-89 +5.17607e-90 +1.23559e-90 +2.93478e-91 +6.93593e-92 +1.63104e-92 +3.81637e-93 +8.8852e-94 +2.05831e-94 +4.74443e-95 +1.08814e-95 +2.48322e-96 +5.63863e-97 +1.27397e-97 +2.86402e-98 +6.4065e-99 +1.42591e-99 +3.15787e-100 +6.95863e-101 +1.52574e-101 +3.32865e-102 +7.22577e-103 +1.56073e-103 +3.35427e-104 +7.173e-105 +1.52626e-105 +3.23137e-106 +6.80727e-107 +1.42688e-107 +2.97599e-108 +6.17597e-109 +1.27528e-109 +2.62019e-110 +5.35663e-111 +1.08962e-111 +2.20542e-112 +4.44153e-113 +8.90033e-114 +1.77462e-114 +3.52073e-115 +6.95013e-116 +1.36514e-116 +2.66804e-117 +5.18843e-118 +1.00394e-118 +1.93289e-119 +3.70283e-120 +7.05817e-121 +1.33868e-121 +2.52633e-122 +4.74387e-123 +8.86347e-124 +1.6478e-124 +3.04812e-125 +5.61033e-126 +1.02748e-126 +1.87235e-127 +3.39493e-128 +6.1249e-129 +1.09951e-129 +1.96393e-130 +3.49047e-131 +6.1726e-132 +1.08613e-132 +1.90162e-133 +3.31279e-134 +5.7424e-135 +9.9042e-136 +1.69971e-136 +2.90242e-137 +4.93143e-138 +8.3371e-139 +1.40244e-139 +2.34738e-140 +3.9094e-141 +6.47837e-142 +1.0682e-142 +1.75252e-143 +2.86091e-144 +4.64703e-145 +7.51057e-146 +1.20781e-146 +1.93266e-147 +3.07708e-148 +4.87473e-149 +7.6841e-150 +1.20521e-150 +1.88087e-151 +2.9207e-152 +4.51277e-153 +6.93787e-154 +1.0613e-154 +1.61539e-155 +2.44651e-156 +3.68677e-157 +5.52803e-158 +8.24757e-159 +1.22436e-159 +1.80851e-160 +2.65804e-161 +3.88713e-162 +5.65623e-163 +8.18943e-164 +1.1798e-164 +1.69118e-165 +2.41214e-166 +3.42327e-167 +4.83403e-168 +6.79217e-169 +9.49583e-170 +1.32095e-170 +1.8284e-171 +2.51815e-172 +3.4508e-173 +4.70533e-174 +6.3839e-175 +8.6181e-176 +1.15762e-176 +1.5472e-177 +2.05759e-178 +2.72269e-179 +3.5848e-180 +4.69637e-181 +6.1219e-182 +7.94037e-183 +1.02476e-183 +1.31593e-184 +1.68141e-185 +2.13767e-186 +2.70418e-187 +3.40377e-188 +4.263e-189 +5.31247e-190 +6.58727e-191 +8.12727e-192 +9.97727e-193 +1.21873e-193 +1.48126e-194 +1.79137e-195 +2.15559e-196 +2.58093e-197 +3.07479e-198 +3.64487e-199 +4.2991e-200 +5.04547e-201 +5.8919e-202 +6.84597e-203 +7.9149e-204 +9.10507e-205 +1.0422e-205 +1.18699e-206 +1.34515e-207 +1.51678e-208 +1.70178e-209 +1.89982e-210 +2.11033e-211 +2.33247e-212 +2.56514e-213 +2.80695e-214 +3.05623e-215 +3.31106e-216 +3.56923e-217 +3.82837e-218 +4.08583e-219 +4.33883e-220 +4.58457e-221 +4.82003e-222 +5.0423e-223 +5.24853e-224 +5.43593e-225 +5.60197e-226 +5.74427e-227 +5.8608e-228 +5.9499e-229 +6.0102e-230 +6.04083e-231 +6.04137e-232 +6.01173e-233 +5.95243e-234 +5.8643e-235 +5.74867e-236 +5.60723e-237 +5.44197e-238 +5.25523e-239 +5.0496e-240 +4.82783e-241 +4.59277e-242 +4.34733e-243 +4.09453e-244 +3.83717e-245 +3.57807e-246 +3.3198e-247 +3.06483e-248 +2.81532e-249 +2.57323e-250 +2.34022e-251 +2.1177e-252 +1.90678e-253 +1.7083e-254 +1.52285e-255 +1.35077e-256 +1.19215e-257 +1.04691e-258 +9.1478e-260 +7.95337e-261 +6.88043e-262 +5.92257e-263 +5.0726e-264 +4.32293e-265 +3.6657e-266 +3.09289e-267 +2.59657e-268 +2.16902e-269 +1.80284e-270 +1.491e-271 +1.22695e-272 +1.00463e-273 +8.18487e-275 +6.6351e-276 +5.35193e-277 +4.2954e-278 +3.43023e-279 +2.72567e-280 +2.15502e-281 +1.69534e-282 +1.32706e-283 +1.03361e-284 +8.01027e-286 +6.17687e-287 +4.73933e-288 +3.6182e-289 +2.74853e-290 +2.07747e-291 +1.56242e-292 +1.1692e-293 +8.7058e-295 +6.44997e-296 +4.75483e-297 +3.4877e-298 +2.54551e-299 +1.84858e-300 +1.33576e-301 +9.6039e-303 +6.87063e-304 +4.89073e-305 +3.464e-306 +2.44125e-307 +1.71189e-308 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/inputFiles/wavePropagation/time.txt b/inputFiles/wavePropagation/time.txt new file mode 100644 index 00000000000..fef6bc55b33 --- /dev/null +++ b/inputFiles/wavePropagation/time.txt @@ -0,0 +1,1501 @@ +0.000 +0.001 +0.002 +0.003 +0.004 +0.005 +0.006 +0.007 +0.008 +0.009 +0.010 +0.011 +0.012 +0.013 +0.014 +0.015 +0.016 +0.017 +0.018 +0.019 +0.020 +0.021 +0.022 +0.023 +0.024 +0.025 +0.026 +0.027 +0.028 +0.029 +0.030 +0.031 +0.032 +0.033 +0.034 +0.035 +0.036 +0.037 +0.038 +0.039 +0.040 +0.041 +0.042 +0.043 +0.044 +0.045 +0.046 +0.047 +0.048 +0.049 +0.050 +0.051 +0.052 +0.053 +0.054 +0.055 +0.056 +0.057 +0.058 +0.059 +0.060 +0.061 +0.062 +0.063 +0.064 +0.065 +0.066 +0.067 +0.068 +0.069 +0.070 +0.071 +0.072 +0.073 +0.074 +0.075 +0.076 +0.077 +0.078 +0.079 +0.080 +0.081 +0.082 +0.083 +0.084 +0.085 +0.086 +0.087 +0.088 +0.089 +0.090 +0.091 +0.092 +0.093 +0.094 +0.095 +0.096 +0.097 +0.098 +0.099 +0.100 +0.101 +0.102 +0.103 +0.104 +0.105 +0.106 +0.107 +0.108 +0.109 +0.110 +0.111 +0.112 +0.113 +0.114 +0.115 +0.116 +0.117 +0.118 +0.119 +0.120 +0.121 +0.122 +0.123 +0.124 +0.125 +0.126 +0.127 +0.128 +0.129 +0.130 +0.131 +0.132 +0.133 +0.134 +0.135 +0.136 +0.137 +0.138 +0.139 +0.140 +0.141 +0.142 +0.143 +0.144 +0.145 +0.146 +0.147 +0.148 +0.149 +0.150 +0.151 +0.152 +0.153 +0.154 +0.155 +0.156 +0.157 +0.158 +0.159 +0.160 +0.161 +0.162 +0.163 +0.164 +0.165 +0.166 +0.167 +0.168 +0.169 +0.170 +0.171 +0.172 +0.173 +0.174 +0.175 +0.176 +0.177 +0.178 +0.179 +0.180 +0.181 +0.182 +0.183 +0.184 +0.185 +0.186 +0.187 +0.188 +0.189 +0.190 +0.191 +0.192 +0.193 +0.194 +0.195 +0.196 +0.197 +0.198 +0.199 +0.200 +0.201 +0.202 +0.203 +0.204 +0.205 +0.206 +0.207 +0.208 +0.209 +0.210 +0.211 +0.212 +0.213 +0.214 +0.215 +0.216 +0.217 +0.218 +0.219 +0.220 +0.221 +0.222 +0.223 +0.224 +0.225 +0.226 +0.227 +0.228 +0.229 +0.230 +0.231 +0.232 +0.233 +0.234 +0.235 +0.236 +0.237 +0.238 +0.239 +0.240 +0.241 +0.242 +0.243 +0.244 +0.245 +0.246 +0.247 +0.248 +0.249 +0.250 +0.251 +0.252 +0.253 +0.254 +0.255 +0.256 +0.257 +0.258 +0.259 +0.260 +0.261 +0.262 +0.263 +0.264 +0.265 +0.266 +0.267 +0.268 +0.269 +0.270 +0.271 +0.272 +0.273 +0.274 +0.275 +0.276 +0.277 +0.278 +0.279 +0.280 +0.281 +0.282 +0.283 +0.284 +0.285 +0.286 +0.287 +0.288 +0.289 +0.290 +0.291 +0.292 +0.293 +0.294 +0.295 +0.296 +0.297 +0.298 +0.299 +0.300 +0.301 +0.302 +0.303 +0.304 +0.305 +0.306 +0.307 +0.308 +0.309 +0.310 +0.311 +0.312 +0.313 +0.314 +0.315 +0.316 +0.317 +0.318 +0.319 +0.320 +0.321 +0.322 +0.323 +0.324 +0.325 +0.326 +0.327 +0.328 +0.329 +0.330 +0.331 +0.332 +0.333 +0.334 +0.335 +0.336 +0.337 +0.338 +0.339 +0.340 +0.341 +0.342 +0.343 +0.344 +0.345 +0.346 +0.347 +0.348 +0.349 +0.350 +0.351 +0.352 +0.353 +0.354 +0.355 +0.356 +0.357 +0.358 +0.359 +0.360 +0.361 +0.362 +0.363 +0.364 +0.365 +0.366 +0.367 +0.368 +0.369 +0.370 +0.371 +0.372 +0.373 +0.374 +0.375 +0.376 +0.377 +0.378 +0.379 +0.380 +0.381 +0.382 +0.383 +0.384 +0.385 +0.386 +0.387 +0.388 +0.389 +0.390 +0.391 +0.392 +0.393 +0.394 +0.395 +0.396 +0.397 +0.398 +0.399 +0.400 +0.401 +0.402 +0.403 +0.404 +0.405 +0.406 +0.407 +0.408 +0.409 +0.410 +0.411 +0.412 +0.413 +0.414 +0.415 +0.416 +0.417 +0.418 +0.419 +0.420 +0.421 +0.422 +0.423 +0.424 +0.425 +0.426 +0.427 +0.428 +0.429 +0.430 +0.431 +0.432 +0.433 +0.434 +0.435 +0.436 +0.437 +0.438 +0.439 +0.440 +0.441 +0.442 +0.443 +0.444 +0.445 +0.446 +0.447 +0.448 +0.449 +0.450 +0.451 +0.452 +0.453 +0.454 +0.455 +0.456 +0.457 +0.458 +0.459 +0.460 +0.461 +0.462 +0.463 +0.464 +0.465 +0.466 +0.467 +0.468 +0.469 +0.470 +0.471 +0.472 +0.473 +0.474 +0.475 +0.476 +0.477 +0.478 +0.479 +0.480 +0.481 +0.482 +0.483 +0.484 +0.485 +0.486 +0.487 +0.488 +0.489 +0.490 +0.491 +0.492 +0.493 +0.494 +0.495 +0.496 +0.497 +0.498 +0.499 +0.500 +0.501 +0.502 +0.503 +0.504 +0.505 +0.506 +0.507 +0.508 +0.509 +0.510 +0.511 +0.512 +0.513 +0.514 +0.515 +0.516 +0.517 +0.518 +0.519 +0.520 +0.521 +0.522 +0.523 +0.524 +0.525 +0.526 +0.527 +0.528 +0.529 +0.530 +0.531 +0.532 +0.533 +0.534 +0.535 +0.536 +0.537 +0.538 +0.539 +0.540 +0.541 +0.542 +0.543 +0.544 +0.545 +0.546 +0.547 +0.548 +0.549 +0.550 +0.551 +0.552 +0.553 +0.554 +0.555 +0.556 +0.557 +0.558 +0.559 +0.560 +0.561 +0.562 +0.563 +0.564 +0.565 +0.566 +0.567 +0.568 +0.569 +0.570 +0.571 +0.572 +0.573 +0.574 +0.575 +0.576 +0.577 +0.578 +0.579 +0.580 +0.581 +0.582 +0.583 +0.584 +0.585 +0.586 +0.587 +0.588 +0.589 +0.590 +0.591 +0.592 +0.593 +0.594 +0.595 +0.596 +0.597 +0.598 +0.599 +0.600 +0.601 +0.602 +0.603 +0.604 +0.605 +0.606 +0.607 +0.608 +0.609 +0.610 +0.611 +0.612 +0.613 +0.614 +0.615 +0.616 +0.617 +0.618 +0.619 +0.620 +0.621 +0.622 +0.623 +0.624 +0.625 +0.626 +0.627 +0.628 +0.629 +0.630 +0.631 +0.632 +0.633 +0.634 +0.635 +0.636 +0.637 +0.638 +0.639 +0.640 +0.641 +0.642 +0.643 +0.644 +0.645 +0.646 +0.647 +0.648 +0.649 +0.650 +0.651 +0.652 +0.653 +0.654 +0.655 +0.656 +0.657 +0.658 +0.659 +0.660 +0.661 +0.662 +0.663 +0.664 +0.665 +0.666 +0.667 +0.668 +0.669 +0.670 +0.671 +0.672 +0.673 +0.674 +0.675 +0.676 +0.677 +0.678 +0.679 +0.680 +0.681 +0.682 +0.683 +0.684 +0.685 +0.686 +0.687 +0.688 +0.689 +0.690 +0.691 +0.692 +0.693 +0.694 +0.695 +0.696 +0.697 +0.698 +0.699 +0.700 +0.701 +0.702 +0.703 +0.704 +0.705 +0.706 +0.707 +0.708 +0.709 +0.710 +0.711 +0.712 +0.713 +0.714 +0.715 +0.716 +0.717 +0.718 +0.719 +0.720 +0.721 +0.722 +0.723 +0.724 +0.725 +0.726 +0.727 +0.728 +0.729 +0.730 +0.731 +0.732 +0.733 +0.734 +0.735 +0.736 +0.737 +0.738 +0.739 +0.740 +0.741 +0.742 +0.743 +0.744 +0.745 +0.746 +0.747 +0.748 +0.749 +0.750 +0.751 +0.752 +0.753 +0.754 +0.755 +0.756 +0.757 +0.758 +0.759 +0.760 +0.761 +0.762 +0.763 +0.764 +0.765 +0.766 +0.767 +0.768 +0.769 +0.770 +0.771 +0.772 +0.773 +0.774 +0.775 +0.776 +0.777 +0.778 +0.779 +0.780 +0.781 +0.782 +0.783 +0.784 +0.785 +0.786 +0.787 +0.788 +0.789 +0.790 +0.791 +0.792 +0.793 +0.794 +0.795 +0.796 +0.797 +0.798 +0.799 +0.800 +0.801 +0.802 +0.803 +0.804 +0.805 +0.806 +0.807 +0.808 +0.809 +0.810 +0.811 +0.812 +0.813 +0.814 +0.815 +0.816 +0.817 +0.818 +0.819 +0.820 +0.821 +0.822 +0.823 +0.824 +0.825 +0.826 +0.827 +0.828 +0.829 +0.830 +0.831 +0.832 +0.833 +0.834 +0.835 +0.836 +0.837 +0.838 +0.839 +0.840 +0.841 +0.842 +0.843 +0.844 +0.845 +0.846 +0.847 +0.848 +0.849 +0.850 +0.851 +0.852 +0.853 +0.854 +0.855 +0.856 +0.857 +0.858 +0.859 +0.860 +0.861 +0.862 +0.863 +0.864 +0.865 +0.866 +0.867 +0.868 +0.869 +0.870 +0.871 +0.872 +0.873 +0.874 +0.875 +0.876 +0.877 +0.878 +0.879 +0.880 +0.881 +0.882 +0.883 +0.884 +0.885 +0.886 +0.887 +0.888 +0.889 +0.890 +0.891 +0.892 +0.893 +0.894 +0.895 +0.896 +0.897 +0.898 +0.899 +0.900 +0.901 +0.902 +0.903 +0.904 +0.905 +0.906 +0.907 +0.908 +0.909 +0.910 +0.911 +0.912 +0.913 +0.914 +0.915 +0.916 +0.917 +0.918 +0.919 +0.920 +0.921 +0.922 +0.923 +0.924 +0.925 +0.926 +0.927 +0.928 +0.929 +0.930 +0.931 +0.932 +0.933 +0.934 +0.935 +0.936 +0.937 +0.938 +0.939 +0.940 +0.941 +0.942 +0.943 +0.944 +0.945 +0.946 +0.947 +0.948 +0.949 +0.950 +0.951 +0.952 +0.953 +0.954 +0.955 +0.956 +0.957 +0.958 +0.959 +0.960 +0.961 +0.962 +0.963 +0.964 +0.965 +0.966 +0.967 +0.968 +0.969 +0.970 +0.971 +0.972 +0.973 +0.974 +0.975 +0.976 +0.977 +0.978 +0.979 +0.980 +0.981 +0.982 +0.983 +0.984 +0.985 +0.986 +0.987 +0.988 +0.989 +0.990 +0.991 +0.992 +0.993 +0.994 +0.995 +0.996 +0.997 +0.998 +0.999 +1.000 +1.001 +1.002 +1.003 +1.004 +1.005 +1.006 +1.007 +1.008 +1.009 +1.010 +1.011 +1.012 +1.013 +1.014 +1.015 +1.016 +1.017 +1.018 +1.019 +1.020 +1.021 +1.022 +1.023 +1.024 +1.025 +1.026 +1.027 +1.028 +1.029 +1.030 +1.031 +1.032 +1.033 +1.034 +1.035 +1.036 +1.037 +1.038 +1.039 +1.040 +1.041 +1.042 +1.043 +1.044 +1.045 +1.046 +1.047 +1.048 +1.049 +1.050 +1.051 +1.052 +1.053 +1.054 +1.055 +1.056 +1.057 +1.058 +1.059 +1.060 +1.061 +1.062 +1.063 +1.064 +1.065 +1.066 +1.067 +1.068 +1.069 +1.070 +1.071 +1.072 +1.073 +1.074 +1.075 +1.076 +1.077 +1.078 +1.079 +1.080 +1.081 +1.082 +1.083 +1.084 +1.085 +1.086 +1.087 +1.088 +1.089 +1.090 +1.091 +1.092 +1.093 +1.094 +1.095 +1.096 +1.097 +1.098 +1.099 +1.100 +1.101 +1.102 +1.103 +1.104 +1.105 +1.106 +1.107 +1.108 +1.109 +1.110 +1.111 +1.112 +1.113 +1.114 +1.115 +1.116 +1.117 +1.118 +1.119 +1.120 +1.121 +1.122 +1.123 +1.124 +1.125 +1.126 +1.127 +1.128 +1.129 +1.130 +1.131 +1.132 +1.133 +1.134 +1.135 +1.136 +1.137 +1.138 +1.139 +1.140 +1.141 +1.142 +1.143 +1.144 +1.145 +1.146 +1.147 +1.148 +1.149 +1.150 +1.151 +1.152 +1.153 +1.154 +1.155 +1.156 +1.157 +1.158 +1.159 +1.160 +1.161 +1.162 +1.163 +1.164 +1.165 +1.166 +1.167 +1.168 +1.169 +1.170 +1.171 +1.172 +1.173 +1.174 +1.175 +1.176 +1.177 +1.178 +1.179 +1.180 +1.181 +1.182 +1.183 +1.184 +1.185 +1.186 +1.187 +1.188 +1.189 +1.190 +1.191 +1.192 +1.193 +1.194 +1.195 +1.196 +1.197 +1.198 +1.199 +1.200 +1.201 +1.202 +1.203 +1.204 +1.205 +1.206 +1.207 +1.208 +1.209 +1.210 +1.211 +1.212 +1.213 +1.214 +1.215 +1.216 +1.217 +1.218 +1.219 +1.220 +1.221 +1.222 +1.223 +1.224 +1.225 +1.226 +1.227 +1.228 +1.229 +1.230 +1.231 +1.232 +1.233 +1.234 +1.235 +1.236 +1.237 +1.238 +1.239 +1.240 +1.241 +1.242 +1.243 +1.244 +1.245 +1.246 +1.247 +1.248 +1.249 +1.250 +1.251 +1.252 +1.253 +1.254 +1.255 +1.256 +1.257 +1.258 +1.259 +1.260 +1.261 +1.262 +1.263 +1.264 +1.265 +1.266 +1.267 +1.268 +1.269 +1.270 +1.271 +1.272 +1.273 +1.274 +1.275 +1.276 +1.277 +1.278 +1.279 +1.280 +1.281 +1.282 +1.283 +1.284 +1.285 +1.286 +1.287 +1.288 +1.289 +1.290 +1.291 +1.292 +1.293 +1.294 +1.295 +1.296 +1.297 +1.298 +1.299 +1.300 +1.301 +1.302 +1.303 +1.304 +1.305 +1.306 +1.307 +1.308 +1.309 +1.310 +1.311 +1.312 +1.313 +1.314 +1.315 +1.316 +1.317 +1.318 +1.319 +1.320 +1.321 +1.322 +1.323 +1.324 +1.325 +1.326 +1.327 +1.328 +1.329 +1.330 +1.331 +1.332 +1.333 +1.334 +1.335 +1.336 +1.337 +1.338 +1.339 +1.340 +1.341 +1.342 +1.343 +1.344 +1.345 +1.346 +1.347 +1.348 +1.349 +1.350 +1.351 +1.352 +1.353 +1.354 +1.355 +1.356 +1.357 +1.358 +1.359 +1.360 +1.361 +1.362 +1.363 +1.364 +1.365 +1.366 +1.367 +1.368 +1.369 +1.370 +1.371 +1.372 +1.373 +1.374 +1.375 +1.376 +1.377 +1.378 +1.379 +1.380 +1.381 +1.382 +1.383 +1.384 +1.385 +1.386 +1.387 +1.388 +1.389 +1.390 +1.391 +1.392 +1.393 +1.394 +1.395 +1.396 +1.397 +1.398 +1.399 +1.400 +1.401 +1.402 +1.403 +1.404 +1.405 +1.406 +1.407 +1.408 +1.409 +1.410 +1.411 +1.412 +1.413 +1.414 +1.415 +1.416 +1.417 +1.418 +1.419 +1.420 +1.421 +1.422 +1.423 +1.424 +1.425 +1.426 +1.427 +1.428 +1.429 +1.430 +1.431 +1.432 +1.433 +1.434 +1.435 +1.436 +1.437 +1.438 +1.439 +1.440 +1.441 +1.442 +1.443 +1.444 +1.445 +1.446 +1.447 +1.448 +1.449 +1.450 +1.451 +1.452 +1.453 +1.454 +1.455 +1.456 +1.457 +1.458 +1.459 +1.460 +1.461 +1.462 +1.463 +1.464 +1.465 +1.466 +1.467 +1.468 +1.469 +1.470 +1.471 +1.472 +1.473 +1.474 +1.475 +1.476 +1.477 +1.478 +1.479 +1.480 +1.481 +1.482 +1.483 +1.484 +1.485 +1.486 +1.487 +1.488 +1.489 +1.490 +1.491 +1.492 +1.493 +1.494 +1.495 +1.496 +1.497 +1.498 +1.499 +1.500 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 04acea63db0..9b052d67d84 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -183,18 +183,6 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev receiverConstants.setValues< EXEC_POLICY >( -1 ); receiverIsLocal.zero(); - arrayView2d< real32 > const sourceValue = m_sourceValue.toView(); - real64 dt = 0; - EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); - for( localIndex numSubEvent = 0; numSubEvent < event.numSubGroups(); ++numSubEvent ) - { - EventBase const * subEvent = static_cast< EventBase const * >( event.getSubGroups()[numSubEvent] ); - if( subEvent->getEventName() == "/Solvers/" + getName() ) - { - dt = subEvent->getReference< real64 >( EventBase::viewKeyStruct::forceDtString() ); - } - } - mesh.getElemManager().forElementSubRegionsComplete< CellElementSubRegion >( regionNames, [&]( localIndex const, localIndex const regionIndex, localIndex const esr, @@ -244,12 +232,7 @@ void AcousticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLev receiverElem, receiverNodeIds, receiverConstants, - receiverRegion, - sourceValue, - dt, - m_timeSourceFrequency, - m_timeSourceDelay, - m_rickerOrder ); + receiverRegion ); } ); elementSubRegion.faceList().freeOnDevice(); baseMesh.getElemManager().getRegion( regionIndex ).getSubRegion< CellElementSubRegion >( esr ).nodeList().freeOnDevice(); @@ -342,6 +325,12 @@ void AcousticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGro WaveSolverUtils::initTrace( "seismoTraceReceiver", getName(), m_outputSeismoTrace, m_receiverConstants.size( 0 ), m_receiverIsLocal ); } +real64 AcousticFirstOrderWaveEquationSEM::computeTimeStep( real64 & dtOut ) +{ + GEOS_ERROR( getDataContext() << ": Time-Step computation for the first order acoustic wave propagator not yet implemented" ); + return dtOut; +} + void AcousticFirstOrderWaveEquationSEM::applyFreeSurfaceBC( real64 const time, DomainPartition & domain ) { @@ -440,7 +429,6 @@ real64 AcousticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & t arrayView1d< localIndex const > const sourceIsAccessible = m_sourceIsAccessible.toView(); arrayView1d< localIndex const > const sourceElem = m_sourceElem.toView(); arrayView1d< localIndex const > const sourceRegion = m_sourceRegion.toView(); - arrayView2d< real32 const > const sourceValue = m_sourceValue.toView(); GEOS_LOG_RANK_0_IF( dt < epsilonLoc, "Warning! Value for dt: " << dt << "s is smaller than local threshold: " << epsilonLoc ); @@ -474,12 +462,6 @@ real64 AcousticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & t { using FE_TYPE = TYPEOFREF( finiteElement ); - //Modification of cycleNember useful when minTime < 0 - EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); - real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); - integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); - - acousticFirstOrderWaveEquationSEMKernels:: VelocityComputation< FE_TYPE > kernel( finiteElement ); kernel.template launch< EXEC_POLICY, ATOMIC_POLICY > @@ -506,12 +488,16 @@ real64 AcousticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & t mass, damping, sourceConstants, - sourceValue, sourceIsAccessible, sourceElem, sourceRegion, dt, - cycleForSource, + time_n, + m_timeSourceFrequency, + m_timeSourceDelay, + m_rickerOrder, + m_useSourceWaveletTables, + m_sourceWaveletTableWrappers, p_np1 ); } ); arrayView2d< real32 > const uxReceivers = m_uxNp1AtReceivers.toView(); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp index eb6e72d1212..8b69c355e6f 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp @@ -138,6 +138,8 @@ class AcousticFirstOrderWaveEquationSEM : public WaveSolverBase */ virtual void applyPML( real64 const time, DomainPartition & domain ) override; + virtual real64 computeTimeStep( real64 & dtOut ) override; + /// Pressure_np1 at the receiver location for each time step for each receiver array2d< real32 > m_pressureNp1AtReceivers; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp index 2fb89ae9908..ccc359a55ee 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp @@ -159,11 +159,12 @@ struct PressureComputation * @param[in] mass the mass matrix * @param[in] damping the damping matrix * @param[in] sourceConstants constant part of the source terms - * @param[in] sourceValue value of the temporal source (eg. Ricker) * @param[in] sourceIsAccessible flag indicating whether the source is accessible or not * @param[in] sourceElem element where a source is located - * @param[in] cycleNumber the number of cycle * @param[in] dt time-step + * @param[in] timeSourceFrequency the central frequency of the source + * @param[in] timeSourceDelay the time delay of the source + * @param[in] rickerOrder order of the Ricker wavelet * @param[out] p_np1 pressure array (updated here) */ @@ -180,12 +181,16 @@ struct PressureComputation arrayView1d< real32 const > const mass, arrayView1d< real32 const > const damping, arrayView2d< real64 const > const sourceConstants, - arrayView2d< real32 const > const sourceValue, arrayView1d< localIndex const > const sourceIsAccessible, arrayView1d< localIndex const > const sourceElem, arrayView1d< localIndex const > const sourceRegion, real64 const dt, - integer const cycleNumber, + real64 const time_n, + real32 const timeSourceFrequency, + real32 const timeSourceDelay, + localIndex const rickerOrder, + bool const useSourceWaveletTables, + arrayView1d< TableFunction::KernelWrapper const > const sourceWaveletTableWrappers, arrayView1d< real32 > const p_np1 ) { @@ -196,6 +201,10 @@ struct PressureComputation p_np1[a] *= 1.0-((dt/2)*(damping[a]/mass[a])); } ); + //Source initialization + + real64 const rickerValue = useSourceWaveletTables ? 0 : WaveSolverUtils::evaluateRicker( time_n, timeSourceFrequency, timeSourceDelay, rickerOrder ); + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) { // only the eight corners of the mesh cell are needed to compute the Jacobian @@ -263,9 +272,10 @@ struct PressureComputation { if( sourceElem[isrc]==k && sourceRegion[isrc] == regionIndex ) { + real64 const srcValue = useSourceWaveletTables ? sourceWaveletTableWrappers[ isrc ].compute( &time_n ) : rickerValue; for( localIndex i = 0; i < numNodesPerElem; ++i ) { - real32 const localIncrement2 = dt*(sourceConstants[isrc][i]*sourceValue[cycleNumber][isrc])/(mass[elemsToNodes[k][i]]); + real32 const localIncrement2 = dt*(sourceConstants[isrc][i]*srcValue)/(mass[elemsToNodes[k][i]]); RAJA::atomicAdd< ATOMIC_POLICY >( &p_np1[elemsToNodes[k][i]], localIncrement2 ); } } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index 7b31605c01f..b8c8219179f 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -139,18 +139,6 @@ void AcousticVTIWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & ba receiverConstants.setValues< EXEC_POLICY >( -1 ); receiverIsLocal.zero(); - arrayView2d< real32 > const sourceValue = m_sourceValue.toView(); - real64 dt = 0; - EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); - for( localIndex numSubEvent = 0; numSubEvent < event.numSubGroups(); ++numSubEvent ) - { - EventBase const * subEvent = static_cast< EventBase const * >( event.getSubGroups()[numSubEvent] ); - if( subEvent->getEventName() == "/Solvers/" + getName() ) - { - dt = subEvent->getReference< real64 >( EventBase::viewKeyStruct::forceDtString() ); - } - } - mesh.getElemManager().forElementSubRegionsComplete< CellElementSubRegion >( regionNames, [&]( localIndex const, localIndex const er, localIndex const esr, @@ -195,12 +183,7 @@ void AcousticVTIWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & ba receiverCoordinates, receiverIsLocal, receiverNodeIds, - receiverConstants, - sourceValue, - dt, - m_timeSourceFrequency, - m_timeSourceDelay, - m_rickerOrder ); + receiverConstants ); } ); elementSubRegion.faceList().freeOnDevice(); baseMesh.getElemManager().getRegion( er ).getSubRegion< CellElementSubRegion >( esr ).nodeList().freeOnDevice(); @@ -216,21 +199,22 @@ void AcousticVTIWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & ba nodesToElements.freeOnDevice(); } -void AcousticVTIWaveEquationSEM::addSourceToRightHandSide( integer const & cycleNumber, arrayView1d< real32 > const rhs ) +void AcousticVTIWaveEquationSEM::addSourceToRightHandSide( real64 const & time_n, arrayView1d< real32 > const rhs ) { arrayView2d< localIndex const > const sourceNodeIds = m_sourceNodeIds.toViewConst(); arrayView2d< real64 const > const sourceConstants = m_sourceConstants.toViewConst(); arrayView1d< localIndex const > const sourceIsAccessible = m_sourceIsAccessible.toViewConst(); - arrayView2d< real32 const > const sourceValue = m_sourceValue.toViewConst(); - - GEOS_THROW_IF( cycleNumber > sourceValue.size( 0 ), "Too many steps compared to array size", std::runtime_error ); + bool useSourceWaveletTables = m_useSourceWaveletTables; + real64 const rickerValue = useSourceWaveletTables ? 0 : WaveSolverUtils::evaluateRicker( time_n, m_timeSourceFrequency, m_timeSourceDelay, m_rickerOrder ); + arrayView1d< TableFunction::KernelWrapper const > const sourceWaveletTableWrappers = m_sourceWaveletTableWrappers.toViewConst(); forAll< EXEC_POLICY >( sourceConstants.size( 0 ), [=] GEOS_HOST_DEVICE ( localIndex const isrc ) { if( sourceIsAccessible[isrc] == 1 ) { + real64 const srcValue = useSourceWaveletTables ? sourceWaveletTableWrappers[ isrc ].compute( &time_n ) : rickerValue; for( localIndex inode = 0; inode < sourceConstants.size( 1 ); ++inode ) { - real32 const localIncrement = sourceConstants[isrc][inode] * sourceValue[cycleNumber][isrc]; + real32 const localIncrement = sourceConstants[isrc][inode] * srcValue; RAJA::atomicAdd< ATOMIC_POLICY >( &rhs[sourceNodeIds[isrc][inode]], localIncrement ); } } @@ -332,6 +316,13 @@ void AcousticVTIWaveEquationSEM::initializePostInitialConditionsPreSubGroups() WaveSolverUtils::initTrace( "seismoTraceReceiver", getName(), m_outputSeismoTrace, m_receiverConstants.size( 0 ), m_receiverIsLocal ); } +real64 AcousticVTIWaveEquationSEM::computeTimeStep( real64 & dtOut ) +{ + GEOS_ERROR( getDataContext() << ": Time-Step computation for the second order acoustic vti wave propagator not yet implemented" ); + return dtOut; +} + + void AcousticVTIWaveEquationSEM::precomputeSurfaceFieldIndicator( DomainPartition & domain ) { real64 const time = 0.0; @@ -489,11 +480,11 @@ void AcousticVTIWaveEquationSEM::applyFreeSurfaceBC( real64 time, DomainPartitio real64 AcousticVTIWaveEquationSEM::explicitStepForward( real64 const & time_n, real64 const & dt, - integer cycleNumber, + integer, DomainPartition & domain, bool computeGradient ) { - real64 dtOut = explicitStepInternal( time_n, dt, cycleNumber, domain ); + real64 dtOut = explicitStepInternal( time_n, dt, domain ); forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -554,7 +545,6 @@ real64 AcousticVTIWaveEquationSEM::explicitStepBackward( real64 const & GEOS_UNU real64 AcousticVTIWaveEquationSEM::explicitStepInternal( real64 const & time_n, real64 const & dt, - integer cycleNumber, DomainPartition & domain ) { GEOS_MARK_FUNCTION; @@ -600,7 +590,7 @@ real64 AcousticVTIWaveEquationSEM::explicitStepInternal( real64 const & time_n, "", kernelFactory ); - addSourceToRightHandSide( cycleNumber, rhs ); + addSourceToRightHandSide( time_n, rhs ); /// calculate your time integrators diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp index 373ace7cb4c..1689e91574b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp @@ -76,7 +76,7 @@ class AcousticVTIWaveEquationSEM : public WaveSolverBase * @param cycleNumber the cycle number/step number of evaluation of the source * @param rhs the right hand side vector to be computed */ - virtual void addSourceToRightHandSide( integer const & cycleNumber, arrayView1d< real32 > const rhs ); + virtual void addSourceToRightHandSide( real64 const & time_n, arrayView1d< real32 > const rhs ); /** * @brief Overridden from ExecutableGroup. Used to write last seismogram if needed. @@ -101,7 +101,6 @@ class AcousticVTIWaveEquationSEM : public WaveSolverBase */ real64 explicitStepInternal( real64 const & time_n, real64 const & dt, - integer const cycleNumber, DomainPartition & domain ); /** @@ -145,6 +144,8 @@ class AcousticVTIWaveEquationSEM : public WaveSolverBase */ virtual void applyFreeSurfaceBC( real64 const time, DomainPartition & domain ) override; + virtual real64 computeTimeStep( real64 & dtOut ) override; + /// Pressure_p_np1 at the receiver location for each time step for each receiver array2d< real32 > m_pressureNp1AtReceivers; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp index 3a711540091..3c388de273a 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp @@ -57,11 +57,6 @@ struct PrecomputeSourceAndReceiverKernel * @param[out] receiverIsLocal flag indicating whether the receiver is local or not * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located * @param[out] receiverConstants constant part of the receiver term - * @param[out] sourceValue value of the temporal source (eg. Ricker) - * @param[in] dt time-step - * @param[in] timeSourceFrequency the central frequency of the source - * @param[in] timeSourceDelay the time delay of the source - * @param[in] rickerOrder order of the Ricker wavelet */ template< typename EXEC_POLICY, typename FE_TYPE > static void @@ -83,12 +78,7 @@ struct PrecomputeSourceAndReceiverKernel arrayView2d< real64 const > const receiverCoordinates, arrayView1d< localIndex > const receiverIsLocal, arrayView2d< localIndex > const receiverNodeIds, - arrayView2d< real64 > const receiverConstants, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder ) + arrayView2d< real64 > const receiverConstants ) { constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; @@ -139,10 +129,6 @@ struct PrecomputeSourceAndReceiverKernel sourceConstants[isrc][a] = Ntest[a]; } - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } } } } // end loop over all sources diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index eb427d14afb..d1b72a08fd2 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -145,18 +145,6 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseM receiverConstants.setValues< EXEC_POLICY >( -1 ); receiverIsLocal.zero(); - arrayView2d< real32 > const sourceValue = m_sourceValue.toView(); - real64 dt = 0; - EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); - for( localIndex numSubEvent = 0; numSubEvent < event.numSubGroups(); ++numSubEvent ) - { - EventBase const * subEvent = static_cast< EventBase const * >( event.getSubGroups()[numSubEvent] ); - if( subEvent->getEventName() == "/Solvers/" + getName() ) - { - dt = subEvent->getReference< real64 >( EventBase::viewKeyStruct::forceDtString() ); - } - } - mesh.getElemManager().forElementSubRegionsComplete< CellElementSubRegion >( regionNames, [&]( localIndex const, localIndex const er, localIndex const esr, @@ -203,12 +191,7 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseM receiverCoordinates, receiverIsLocal, receiverNodeIds, - receiverConstants, - sourceValue, - dt, - m_timeSourceFrequency, - m_timeSourceDelay, - m_rickerOrder ); + receiverConstants ); } } ); elementSubRegion.faceList().freeOnDevice(); @@ -225,23 +208,25 @@ void AcousticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseM nodesToElements.freeOnDevice(); } -void AcousticWaveEquationSEM::addSourceToRightHandSide( integer const & cycleNumber, arrayView1d< real32 > const rhs ) +void AcousticWaveEquationSEM::addSourceToRightHandSide( real64 const & time_n, arrayView1d< real32 > const rhs ) { arrayView2d< localIndex const > const sourceNodeIds = m_sourceNodeIds.toViewConst(); arrayView2d< real64 const > const sourceConstants = m_sourceConstants.toViewConst(); arrayView1d< localIndex const > const sourceIsAccessible = m_sourceIsAccessible.toViewConst(); - arrayView2d< real32 const > const sourceValue = m_sourceValue.toViewConst(); - - GEOS_THROW_IF( cycleNumber > sourceValue.size( 0 ), - getDataContext() << ": Too many steps compared to array size", - std::runtime_error ); + real32 const timeSourceFrequency = m_timeSourceFrequency; + real32 const timeSourceDelay = m_timeSourceDelay; + localIndex const rickerOrder = m_rickerOrder; + bool useSourceWaveletTables = m_useSourceWaveletTables; + arrayView1d< TableFunction::KernelWrapper const > const sourceWaveletTableWrappers = m_sourceWaveletTableWrappers.toViewConst(); forAll< EXEC_POLICY >( sourceConstants.size( 0 ), [=] GEOS_HOST_DEVICE ( localIndex const isrc ) { if( sourceIsAccessible[isrc] == 1 ) { + real64 const srcValue = + useSourceWaveletTables ? sourceWaveletTableWrappers[ isrc ].compute( &time_n ) : WaveSolverUtils::evaluateRicker( time_n, timeSourceFrequency, timeSourceDelay, rickerOrder ); for( localIndex inode = 0; inode < sourceConstants.size( 1 ); ++inode ) { - real32 const localIncrement = sourceConstants[isrc][inode] * sourceValue[cycleNumber][isrc]; + real32 const localIncrement = sourceConstants[isrc][inode] * srcValue; RAJA::atomicAdd< ATOMIC_POLICY >( &rhs[sourceNodeIds[isrc][inode]], localIncrement ); } } @@ -311,6 +296,7 @@ void AcousticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() /// Partial gradient if gradient as to be computed arrayView1d< real32 > grad = elementSubRegion.getField< acousticfields::PartialGradient >(); + grad.zero(); finiteElement::FiniteElementDispatchHandler< SEM_FE_TYPES >::dispatch3D( fe, [&] ( auto const finiteElement ) @@ -341,9 +327,130 @@ void AcousticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() } ); } ); + if( m_timestepStabilityLimit==1 ) + { + real64 dtOut = 0.0; + computeTimeStep( dtOut ); + m_timestepStabilityLimit = 0; + m_timeStep=dtOut; + } + + WaveSolverUtils::initTrace( "seismoTraceReceiver", getName(), m_outputSeismoTrace, m_receiverConstants.size( 0 ), m_receiverIsLocal ); } +//This function is only to give an easy accesss to the computation of the time-step for Pygeosx interface and avoid to exit the code when +// using Pygeosx + +real64 AcousticWaveEquationSEM::computeTimeStep( real64 & dtOut ) +{ + + DomainPartition & domain = getGroupByPath< DomainPartition >( "/Problem/domain" ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + + NodeManager & nodeManager = mesh.getNodeManager(); + + arrayView1d< real32 > const mass = nodeManager.getField< acousticfields::AcousticMassVector >(); + arrayView1d< real32 > const p = nodeManager.getField< acousticfields::Pressure_n >(); + arrayView1d< real32 > const stiffnessVector = nodeManager.getField< acousticfields::StiffnessVector >(); + + localIndex const sizeNode = nodeManager.size(); + + real64 const epsilon = 0.00001; + localIndex const nIterMax = 10000; + localIndex numberIter = 0; + localIndex counter = 0; + real64 lambdaNew = 0.0; + + //Randomize p values + srand( time( NULL )); + for( localIndex a = 0; a < sizeNode; ++a ) + { + p[a] = (real64)rand()/(real64) RAND_MAX; + } + + //Step 1: Normalize randomized pressure + real64 normP= 0.0; + WaveSolverUtils::dotProduct( sizeNode, p, p, normP ); + + forAll< EXEC_POLICY >( sizeNode, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + p[a]/= sqrt( normP ); + } ); + + //Step 2: Iterations of M^{-1}K)p until we found the max eigenvalues + auto kernelFactory = acousticWaveEquationSEMKernels::ExplicitAcousticSEMFactory( dtOut ); + real64 dotProductPPaux = 0.0; + real64 normPaux = 0.0; + real64 lambdaOld = lambdaNew; + do + { + stiffnessVector.zero(); + + finiteElement:: + regionBasedKernelApplication< EXEC_POLICY, + constitutive::NullModel, + CellElementSubRegion >( mesh, + regionNames, + getDiscretizationName(), + "", + kernelFactory ); + + forAll< EXEC_POLICY >( sizeNode, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + stiffnessVector[a]/= mass[a]; + } ); + + lambdaOld = lambdaNew; + + dotProductPPaux = 0.0; + normP=0.0; + WaveSolverUtils::dotProduct( sizeNode, p, stiffnessVector, dotProductPPaux ); + WaveSolverUtils::dotProduct( sizeNode, p, p, normP ); + + lambdaNew = dotProductPPaux/normP; + + normPaux = 0.0; + WaveSolverUtils::dotProduct( sizeNode, stiffnessVector, stiffnessVector, normPaux ); + + forAll< EXEC_POLICY >( sizeNode, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + p[a] = stiffnessVector[a]/( normPaux ); + } ); + + if( LvArray::math::abs( lambdaNew-lambdaOld )/LvArray::math::abs( lambdaNew )<= epsilon ) + { + counter++; + } + else + { + counter=0; + } + + numberIter++; + + + } + while (counter < 10 && numberIter < nIterMax); + + GEOS_THROW_IF( numberIter> nIterMax, "Power Iteration algorithm does not converge", std::runtime_error ); + + // We use 1.99 instead of 2 to have a 5% margin error + real64 dt = 1.99/sqrt( LvArray::math::abs( lambdaNew )); + + dtOut = MpiWrapper::min( dt ); + + stiffnessVector.zero(); + p.zero(); + } ); + return m_timeStep * m_cflFactor; +} + + void AcousticWaveEquationSEM::applyFreeSurfaceBC( real64 time, DomainPartition & domain ) { @@ -765,7 +872,7 @@ real64 AcousticWaveEquationSEM::explicitStepForward( real64 const & time_n, DomainPartition & domain, bool computeGradient ) { - real64 dtOut = explicitStepInternal( time_n, dt, cycleNumber, domain ); + real64 dtCompute = explicitStepInternal( time_n, dt, domain ); forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -834,7 +941,7 @@ real64 AcousticWaveEquationSEM::explicitStepForward( real64 const & time_n, prepareNextTimestep( mesh ); } ); - return dtOut; + return dtCompute; } @@ -844,7 +951,7 @@ real64 AcousticWaveEquationSEM::explicitStepBackward( real64 const & time_n, DomainPartition & domain, bool computeGradient ) { - real64 dtOut = explicitStepInternal( time_n, dt, cycleNumber, domain ); + real64 dtCompute = explicitStepInternal( time_n, dt, domain ); forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, @@ -916,7 +1023,7 @@ real64 AcousticWaveEquationSEM::explicitStepBackward( real64 const & time_n, prepareNextTimestep( mesh ); } ); - return dtOut; + return dtCompute; } void AcousticWaveEquationSEM::prepareNextTimestep( MeshLevel & mesh ) @@ -945,7 +1052,6 @@ void AcousticWaveEquationSEM::prepareNextTimestep( MeshLevel & mesh ) void AcousticWaveEquationSEM::computeUnknowns( real64 const & time_n, real64 const & dt, - integer cycleNumber, DomainPartition & domain, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) @@ -974,10 +1080,7 @@ void AcousticWaveEquationSEM::computeUnknowns( real64 const & time_n, "", kernelFactory ); //Modification of cycleNember useful when minTime < 0 - EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); - real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); - integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); - addSourceToRightHandSide( cycleForSource, rhs ); + addSourceToRightHandSide( time_n, rhs ); /// calculate your time integrators real64 const dt2 = pow( dt, 2 ); @@ -1055,7 +1158,6 @@ void AcousticWaveEquationSEM::computeUnknowns( real64 const & time_n, void AcousticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, real64 const & dt, - integer const, DomainPartition & domain, MeshLevel & mesh, arrayView1d< string const > const & ) @@ -1102,22 +1204,24 @@ void AcousticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, real64 AcousticWaveEquationSEM::explicitStepInternal( real64 const & time_n, real64 const & dt, - integer const cycleNumber, DomainPartition & domain ) { GEOS_MARK_FUNCTION; GEOS_LOG_RANK_0_IF( dt < epsilonLoc, "Warning! Value for dt: " << dt << "s is smaller than local threshold: " << epsilonLoc ); + real64 dtCompute; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - computeUnknowns( time_n, dt, cycleNumber, domain, mesh, regionNames ); - synchronizeUnknowns( time_n, dt, cycleNumber, domain, mesh, regionNames ); + localIndex nSubSteps = (int) ceil( dt/m_timeStep ); + dtCompute = dt/nSubSteps; + computeUnknowns( time_n, dtCompute, domain, mesh, regionNames ); + synchronizeUnknowns( time_n, dtCompute, domain, mesh, regionNames ); } ); - return dt; + return dtCompute; } void AcousticWaveEquationSEM::cleanup( real64 const time_n, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp index 57134c292a9..71f4c46c499 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp @@ -87,7 +87,7 @@ class AcousticWaveEquationSEM : public WaveSolverBase * @param cycleNumber the cycle number/step number of evaluation of the source * @param rhs the right hand side vector to be computed */ - virtual void addSourceToRightHandSide( integer const & cycleNumber, arrayView1d< real32 > const rhs ); + virtual void addSourceToRightHandSide( real64 const & time_n, arrayView1d< real32 > const rhs ); /** @@ -95,6 +95,11 @@ class AcousticWaveEquationSEM : public WaveSolverBase */ virtual void initializePML() override; + /** + */ + virtual real64 computeTimeStep( real64 & dtOut ) override; + + /** * @brief Overridden from ExecutableGroup. Used to write last seismogram if needed. @@ -118,19 +123,16 @@ class AcousticWaveEquationSEM : public WaveSolverBase */ real64 explicitStepInternal( real64 const & time_n, real64 const & dt, - integer const cycleNumber, DomainPartition & domain ); void computeUnknowns( real64 const & time_n, real64 const & dt, - integer const cycleNumber, DomainPartition & domain, MeshLevel & mesh, arrayView1d< string const > const & regionNames ); void synchronizeUnknowns( real64 const & time_n, real64 const & dt, - integer const cycleNumber, DomainPartition & domain, MeshLevel & mesh, arrayView1d< string const > const & regionNames ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp index 605a30383b4..ab324c4fe43 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp @@ -129,7 +129,7 @@ void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups real64 AcousticElasticWaveEquationSEM::solverStep( real64 const & time_n, real64 const & dt, - int const cycleNumber, + int const, DomainPartition & domain ) { GEOS_MARK_FUNCTION; @@ -167,14 +167,14 @@ real64 AcousticElasticWaveEquationSEM::solverStep( real64 const & time_n, arrayView1d< real32 > const uy_np1 = nodeManager.getField< elasticfields::Displacementy_np1 >(); arrayView1d< real32 > const uz_np1 = nodeManager.getField< elasticfields::Displacementz_np1 >(); - elasSolver->computeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_elasRegions ); + elasSolver->computeUnknowns( time_n, dt, domain, mesh, m_elasRegions ); AcoustoElasticTimeSchemeSEM::LeapFrog( dt, ux_np1, uy_np1, uz_np1, p_n, elasticMass, atoex, atoey, atoez, elasticFSNodeIndicator, interfaceNodesSet ); - elasSolver->synchronizeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_elasRegions ); + elasSolver->synchronizeUnknowns( time_n, dt, domain, mesh, m_elasRegions ); - acousSolver->computeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_acousRegions ); + acousSolver->computeUnknowns( time_n, dt, domain, mesh, m_acousRegions ); forAll< EXEC_POLICY >( interfaceNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const in ) { @@ -191,7 +191,7 @@ real64 AcousticElasticWaveEquationSEM::solverStep( real64 const & time_n, RAJA::atomicAdd< ATOMIC_POLICY >( &p_np1[n], localIncrement ); } ); - acousSolver->synchronizeUnknowns( time_n, dt, cycleNumber, domain, mesh, m_acousRegions ); + acousSolver->synchronizeUnknowns( time_n, dt, domain, mesh, m_acousRegions ); acousSolver->prepareNextTimestep( mesh ); elasSolver->prepareNextTimestep( mesh ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index 56f40118507..5f1c56c582d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -233,19 +233,6 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve receiverConstants.setValues< serialPolicy >( -1 ); receiverIsLocal.zero(); - arrayView2d< real32 > const sourceValue = m_sourceValue.toView(); - real64 dt = 0; - EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); - - for( localIndex numSubEvent = 0; numSubEvent < event.numSubGroups(); ++numSubEvent ) - { - EventBase const * subEvent = static_cast< EventBase const * >( event.getSubGroups()[numSubEvent] ); - if( subEvent->getEventName() == "/Solvers/" + getName() ) - { - dt = subEvent->getReference< real64 >( EventBase::viewKeyStruct::forceDtString() ); - } - } - mesh.getElemManager().forElementSubRegionsComplete< CellElementSubRegion >( regionNames, [&]( localIndex const, localIndex const regionIndex, localIndex const esr, @@ -296,12 +283,7 @@ void ElasticFirstOrderWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLeve receiverElem, receiverNodeIds, receiverConstants, - receiverRegion, - sourceValue, - dt, - m_timeSourceFrequency, - m_timeSourceDelay, - m_rickerOrder ); + receiverRegion ); } ); elementSubRegion.faceList().freeOnDevice(); baseMesh.getElemManager().getRegion( regionIndex ).getSubRegion< CellElementSubRegion >( esr ).nodeList().freeOnDevice(); @@ -365,9 +347,11 @@ void ElasticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGrou arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes = elementSubRegion.nodeList(); arrayView2d< localIndex const > const elemsToFaces = elementSubRegion.faceList(); - arrayView1d< real32 > const density = elementSubRegion.getField< elasticfields::ElasticDensity >(); - arrayView1d< real32 > const velocityVp = elementSubRegion.getField< elasticfields::ElasticVelocityVp >(); - arrayView1d< real32 > const velocityVs = elementSubRegion.getField< elasticfields::ElasticVelocityVs >(); + arrayView1d< real32 const > const density = elementSubRegion.getField< elasticfields::ElasticDensity >(); + arrayView1d< real32 const > const velocityVp = elementSubRegion.getField< elasticfields::ElasticVelocityVp >(); + arrayView1d< real32 const > const velocityVs = elementSubRegion.getField< elasticfields::ElasticVelocityVs >(); + arrayView1d< real32 > const lambda = elementSubRegion.getField< elasticfields::Lambda >(); + arrayView1d< real32 > const mu = elementSubRegion.getField< elasticfields::Mu >(); finiteElement::FiniteElementBase const & fe = elementSubRegion.getReference< finiteElement::FiniteElementBase >( getDiscretizationName() ); @@ -386,6 +370,7 @@ void ElasticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGrou density, mass ); + ElasticMatricesSEM::DampingMatrix< FE_TYPE > kernelD( finiteElement ); kernelD.template computeDampingMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), @@ -406,6 +391,11 @@ void ElasticFirstOrderWaveEquationSEM::initializePostInitialConditionsPreSubGrou } ); } +real64 ElasticFirstOrderWaveEquationSEM::computeTimeStep( real64 & dtOut ) +{ + GEOS_ERROR( getDataContext() << ": Time-Step computation for the first order elastic wave propagator not yet implemented" ); + return dtOut; +} void ElasticFirstOrderWaveEquationSEM::applyFreeSurfaceBC( real64 const time, DomainPartition & domain ) { @@ -507,7 +497,6 @@ real64 ElasticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & ti arrayView1d< localIndex const > const sourceIsAccessible = m_sourceIsAccessible.toView(); arrayView1d< localIndex const > const sourceElem = m_sourceElem.toView(); arrayView1d< localIndex const > const sourceRegion = m_sourceRegion.toView(); - arrayView2d< real32 const > const sourceValue = m_sourceValue.toView(); forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -558,9 +547,6 @@ real64 ElasticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & ti using FE_TYPE = TYPEOFREF( finiteElement ); //Modification of cycleNember useful when minTime < 0 - EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); - real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); - integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); elasticFirstOrderWaveEquationSEMKernels:: StressComputation< FE_TYPE > kernel( finiteElement ); @@ -581,9 +567,13 @@ real64 ElasticFirstOrderWaveEquationSEM::explicitStepInternal( real64 const & ti sourceIsAccessible, sourceElem, sourceRegion, - sourceValue, dt, - cycleForSource, + time_n, + m_timeSourceFrequency, + m_timeSourceDelay, + m_rickerOrder, + m_useSourceWaveletTables, + m_sourceWaveletTableWrappers, stressxx, stressyy, stresszz, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp index f6164876340..f7cc37d74ef 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp @@ -145,6 +145,8 @@ class ElasticFirstOrderWaveEquationSEM : public WaveSolverBase */ virtual void applyPML( real64 const time, DomainPartition & domain ) override; + virtual real64 computeTimeStep( real64 & dtOut ) override; + /// Displacement_np1 at the receiver location for each time step for each receiver array2d< real32 > m_displacementxNp1AtReceivers; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp index fc07cd1151a..2ff51cb6488 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp @@ -58,9 +58,11 @@ struct StressComputation * @param[in] sourceIsLocal flag indicating whether the source is accessible or not * @param[in] sourceElem element where a source is located * @param[in] sourceRegion region where the source is located - * @param[in] sourceValue value of the temporal source (eg. Ricker) * @param[in] dt time-step - * @param[in] cycleNumber the number of cycle + * @param[in] time_n current time + * @param[in] timeSourceFrequency the central frequency of the source + * @param[in] timeSourceDelay the time delay of the source + * @param[in] rickerOrder order of the Ricker wavelet * @param[out] stressxx xx-component of the strain tensor array (updated here) * @param[out] stressyy yy-component of the strain tensor array (updated here) * @param[out] stresszz zz-component of the strain tensor array (updated here) @@ -87,9 +89,13 @@ struct StressComputation arrayView1d< localIndex const > const sourceIsLocal, arrayView1d< localIndex const > const sourceElem, arrayView1d< localIndex const > const sourceRegion, - arrayView2d< real32 const > const sourceValue, real64 const dt, - integer const cycleNumber, + real64 const time_n, + real32 const timeSourceFrequency, + real32 const timeSourceDelay, + localIndex const rickerOrder, + bool const useSourceWaveletTables, + arrayView1d< TableFunction::KernelWrapper const > const sourceWaveletTableWrappers, arrayView2d< real32 > const stressxx, arrayView2d< real32 > const stressyy, arrayView2d< real32 > const stresszz, @@ -98,6 +104,7 @@ struct StressComputation arrayView2d< real32 > const stressyz ) { + real64 const rickerValue = useSourceWaveletTables ? 0 : WaveSolverUtils::evaluateRicker( time_n, timeSourceFrequency, timeSourceDelay, rickerOrder ); forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) { // only the eight corners of the mesh cell are needed to compute the Jacobian @@ -214,10 +221,11 @@ struct StressComputation { if( sourceElem[isrc]==k && sourceRegion[isrc] == regionIndex ) { + real64 const srcValue = useSourceWaveletTables ? sourceWaveletTableWrappers[ isrc ].compute( &time_n ) : rickerValue; for( localIndex i = 0; i < numNodesPerElem; ++i ) { real32 massLoc = m_finiteElement.computeMassTerm( i, xLocal ); - real32 const localIncrement = dt*(sourceConstants[isrc][i]*sourceValue[cycleNumber][isrc])/massLoc; + real32 const localIncrement = dt*(sourceConstants[isrc][i]*srcValue)/massLoc; RAJA::atomicAdd< ATOMIC_POLICY >( &stressxx[k][i], localIncrement ); RAJA::atomicAdd< ATOMIC_POLICY >( &stressyy[k][i], localIncrement ); RAJA::atomicAdd< ATOMIC_POLICY >( &stresszz[k][i], localIncrement ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp index 68d105e6292..02f2c3618c4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp @@ -32,6 +32,294 @@ namespace geos namespace elasticVTIWaveEquationSEMKernels { +template< typename FE_TYPE > +struct ComputeTimeStep +{ + + ComputeTimeStep( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Compute timestep using power iteration method + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + real64 + launch( localIndex const sizeElem, + localIndex const sizeNode, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView1d< real32 const > const density, + arrayView1d< real32 const > const Vp, + arrayView1d< real32 const > const Vs, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes, + arrayView1d< real32 > const mass ) + { + + constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; + + real64 const epsilon = 0.00001; + localIndex const nIterMax = 10000; + localIndex numberIter = 0; + localIndex counter = 0; + real64 lambdaNew = 0.0; + + array1d< real32 > const ux( sizeNode ); + array1d< real32 > const uy( sizeNode ); + array1d< real32 > const uz( sizeNode ); + array1d< real32 > const uxAux( sizeNode ); + array1d< real32 > const uyAux( sizeNode ); + array1d< real32 > const uzAux( sizeNode ); + + + + arrayView1d< real32 > const uxView = ux; + arrayView1d< real32 > const uyView = uy; + arrayView1d< real32 > const uzView = uz; + arrayView1d< real32 > const uxAuxView = uxAux; + arrayView1d< real32 > const uyAuxView = uyAux; + arrayView1d< real32 > const uzAuxView = uzAux; + + //Randomize p values + srand( time( NULL )); + for( localIndex a = 0; a < sizeNode; ++a ) + { + uxView[a] = (real64)rand()/(real64) RAND_MAX; + uyView[a] = (real64)rand()/(real64) RAND_MAX; + uzView[a] = (real64)rand()/(real64) RAND_MAX; + } + + //Step 1: Normalize randomized pressure + real64 normUx= 0.0; + real64 normUy= 0.0; + real64 normUz= 0.0; + WaveSolverUtils::dotProduct( sizeNode, uxView, uxView, normUx ); + WaveSolverUtils::dotProduct( sizeNode, uyView, uyView, normUy ); + WaveSolverUtils::dotProduct( sizeNode, uzView, uzView, normUz ); + real64 normUtot = normUx+normUy+normUz; + + + forAll< EXEC_POLICY >( sizeNode, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + uxView[a]/= sqrt( normUtot ); + uyView[a]/= sqrt( normUtot ); + uzView[a]/= sqrt( normUtot ); + } ); + + //Step 2: Initial iteration of (M^{-1}K)p + uxAuxView.zero(); + uyAuxView.zero(); + uzAuxView.zero(); + forAll< EXEC_POLICY >( sizeElem, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + + real64 mu = density[k]*Vs[k]*Vs[k]; + real64 lambda = density[k]*Vp[k]*Vp[k]-2*mu; + + real64 xLocal[8][3]; + for( localIndex a=0; a< 8; ++a ) + { + localIndex const nodeIndex = elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( localIndex i=0; i<3; ++i ) + { + xLocal[a][i] = nodeCoords[ nodeIndex ][ i ]; + } + } + for( localIndex q = 0; q < numNodesPerElem; ++q ) + { + m_finiteElement.computeFirstOrderStiffnessTerm( q, xLocal, [&] ( int i, int j, real64 val, real64 J[3][3], int p, int r ) + { + real32 const Rxx_ij = val*((lambda+2.0*mu)*J[p][0]*J[r][0]+mu*(J[p][1]*J[r][1]+J[p][2]*J[r][2])); + real32 const Ryy_ij = val*((lambda+2.0*mu)*J[p][1]*J[r][1]+mu*(J[p][0]*J[r][0]+J[p][2]*J[r][2])); + real32 const Rzz_ij = val*((lambda+2.0*mu)*J[p][2]*J[r][2]+mu*(J[p][0]*J[r][0]+J[p][1]*J[r][1])); + real32 const Rxy_ij = val*(lambda*J[p][0]*J[r][1]+mu*J[p][1]*J[r][0]); + real32 const Ryx_ij = val*(mu*J[p][0]*J[r][1]+lambda*J[p][1]*J[r][0]); + real32 const Rxz_ij = val*(lambda*J[p][0]*J[r][2]+mu*J[p][2]*J[r][0]); + real32 const Rzx_ij = val*(mu*J[p][0]*J[r][2]+lambda*J[p][2]*J[r][0]); + real32 const Ryz_ij = val*(lambda*J[p][1]*J[r][2]+mu*J[p][2]*J[r][1]); + real32 const Rzy_ij = val*(mu*J[p][1]*J[r][2]+lambda*J[p][2]*J[r][1]); + + real32 const localIncrementx = (Rxx_ij * uxView[elemsToNodes[k][j]] + Rxy_ij*uyView[elemsToNodes[k][j]] + Rxz_ij*uzView[elemsToNodes[k][j]]); + real32 const localIncrementy = (Ryx_ij * uxView[elemsToNodes[k][j]] + Ryy_ij*uyView[elemsToNodes[k][j]] + Ryz_ij*uzView[elemsToNodes[k][j]]); + real32 const localIncrementz = (Rzx_ij * uxView[elemsToNodes[k][j]] + Rzy_ij*uyView[elemsToNodes[k][j]] + Rzz_ij*uzView[elemsToNodes[k][j]]); + + RAJA::atomicAdd< parallelDeviceAtomic >( &uxAuxView[elemsToNodes[k][i]], localIncrementx ); + RAJA::atomicAdd< parallelDeviceAtomic >( &uyAuxView[elemsToNodes[k][i]], localIncrementy ); + RAJA::atomicAdd< parallelDeviceAtomic >( &uzAuxView[elemsToNodes[k][i]], localIncrementz ); + } ); + + } + + } ); + + forAll< EXEC_POLICY >( sizeNode, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + uxAuxView[a]/= mass[a]; + uyAuxView[a]/= mass[a]; + uzAuxView[a]/= mass[a]; + } ); + real64 lambdaOld = lambdaNew; + + //Compute lambdaNew using two dotProducts + real64 dotProductUxUxaux = 0.0; + real64 dotProductUyUyaux = 0.0; + real64 dotProductUzUzaux = 0.0; + + WaveSolverUtils::dotProduct( sizeNode, uxView, uxAuxView, dotProductUxUxaux ); + WaveSolverUtils::dotProduct( sizeNode, uyView, uyAuxView, dotProductUyUyaux ); + WaveSolverUtils::dotProduct( sizeNode, uzView, uzAuxView, dotProductUzUzaux ); + real64 dotProductUtotUtotAux = dotProductUxUxaux+dotProductUyUyaux+dotProductUzUzaux; + + normUx = 0.0; + normUy = 0.0; + normUz = 0.0; + + WaveSolverUtils::dotProduct( sizeNode, uxView, uxView, normUx ); + WaveSolverUtils::dotProduct( sizeNode, uyView, uyView, normUy ); + WaveSolverUtils::dotProduct( sizeNode, uzView, uzView, normUz ); + normUtot = normUx+normUy+normUz; + + + lambdaNew = dotProductUtotUtotAux/normUtot; + + real64 normUxaux = 0.0; + real64 normUyaux = 0.0; + real64 normUzaux = 0.0; + WaveSolverUtils::dotProduct( sizeNode, uxAuxView, uxAuxView, normUxaux ); + WaveSolverUtils::dotProduct( sizeNode, uyAuxView, uyAuxView, normUyaux ); + WaveSolverUtils::dotProduct( sizeNode, uzAuxView, uzAuxView, normUzaux ); + + real64 normUtotAux = normUxaux+normUyaux+normUzaux; + + + forAll< EXEC_POLICY >( sizeNode, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + uxView[a]= uxAuxView[a]/sqrt( normUtotAux ); + uyView[a]= uyAuxView[a]/sqrt( normUtotAux ); + uzView[a]= uzAuxView[a]/sqrt( normUtotAux ); + } ); + + //Step 3: Do previous algorithm until we found the max eigenvalues + do + { + uxAuxView.zero(); + uyAuxView.zero(); + uzAuxView.zero(); + forAll< EXEC_POLICY >( sizeElem, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + + real64 mu = density[k]*Vs[k]*Vs[k]; + real64 lambda = density[k]*Vp[k]*Vp[k]-2*mu; + + real64 xLocal[8][3]; + for( localIndex a=0; a< 8; ++a ) + { + localIndex const nodeIndex = elemsToNodes( k, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( localIndex i=0; i<3; ++i ) + { + xLocal[a][i] = nodeCoords[ nodeIndex ][ i ]; + } + } + for( localIndex q = 0; q < numNodesPerElem; ++q ) + { + m_finiteElement.computeFirstOrderStiffnessTerm( q, xLocal, [&] ( int i, int j, real64 val, real64 J[3][3], int p, int r ) + { + real32 const Rxx_ij = val*((lambda+2.0*mu)*J[p][0]*J[r][0]+mu*(J[p][1]*J[r][1]+J[p][2]*J[r][2])); + real32 const Ryy_ij = val*((lambda+2.0*mu)*J[p][1]*J[r][1]+mu*(J[p][0]*J[r][0]+J[p][2]*J[r][2])); + real32 const Rzz_ij = val*((lambda+2.0*mu)*J[p][2]*J[r][2]+mu*(J[p][0]*J[r][0]+J[p][1]*J[r][1])); + real32 const Rxy_ij = val*(lambda*J[p][0]*J[r][1]+mu*J[p][1]*J[r][0]); + real32 const Ryx_ij = val*(mu*J[p][0]*J[r][1]+lambda*J[p][1]*J[r][0]); + real32 const Rxz_ij = val*(lambda*J[p][0]*J[r][2]+mu*J[p][2]*J[r][0]); + real32 const Rzx_ij = val*(mu*J[p][0]*J[r][2]+lambda*J[p][2]*J[r][0]); + real32 const Ryz_ij = val*(lambda*J[p][1]*J[r][2]+mu*J[p][2]*J[r][1]); + real32 const Rzy_ij = val*(mu*J[p][1]*J[r][2]+lambda*J[p][2]*J[r][1]); + + real32 const localIncrementx = (Rxx_ij * uxView[elemsToNodes[k][j]] + Rxy_ij*uyView[elemsToNodes[k][j]] + Rxz_ij*uzView[elemsToNodes[k][j]]); + real32 const localIncrementy = (Ryx_ij * uxView[elemsToNodes[k][j]] + Ryy_ij*uyView[elemsToNodes[k][j]] + Ryz_ij*uzView[elemsToNodes[k][j]]); + real32 const localIncrementz = (Rzx_ij * uxView[elemsToNodes[k][j]] + Rzy_ij*uyView[elemsToNodes[k][j]] + Rzz_ij*uzView[elemsToNodes[k][j]]); + + RAJA::atomicAdd< parallelDeviceAtomic >( &uxAuxView[elemsToNodes[k][i]], localIncrementx ); + RAJA::atomicAdd< parallelDeviceAtomic >( &uyAuxView[elemsToNodes[k][i]], localIncrementy ); + RAJA::atomicAdd< parallelDeviceAtomic >( &uzAuxView[elemsToNodes[k][i]], localIncrementz ); + } ); + + } + + } ); + + forAll< EXEC_POLICY >( sizeNode, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + uxAuxView[a]/= mass[a]; + uyAuxView[a]/= mass[a]; + uzAuxView[a]/= mass[a]; + } ); + lambdaOld = lambdaNew; + + //Compute lambdaNew using two dotProducts + dotProductUxUxaux = 0.0; + dotProductUyUyaux = 0.0; + dotProductUzUzaux = 0.0; + + WaveSolverUtils::dotProduct( sizeNode, uxView, uxAuxView, dotProductUxUxaux ); + WaveSolverUtils::dotProduct( sizeNode, uyView, uyAuxView, dotProductUyUyaux ); + WaveSolverUtils::dotProduct( sizeNode, uzView, uzAuxView, dotProductUzUzaux ); + dotProductUtotUtotAux = dotProductUxUxaux+dotProductUyUyaux+dotProductUzUzaux; + + normUx = 0.0; + normUy = 0.0; + normUz = 0.0; + + WaveSolverUtils::dotProduct( sizeNode, uxView, uxView, normUx ); + WaveSolverUtils::dotProduct( sizeNode, uyView, uyView, normUy ); + WaveSolverUtils::dotProduct( sizeNode, uzView, uzView, normUz ); + normUtot = normUx+normUy+normUz; + + + lambdaNew = dotProductUtotUtotAux/normUtot; + + normUxaux = 0.0; + normUyaux = 0.0; + normUzaux = 0.0; + WaveSolverUtils::dotProduct( sizeNode, uxAuxView, uxAuxView, normUxaux ); + WaveSolverUtils::dotProduct( sizeNode, uyAuxView, uyAuxView, normUyaux ); + WaveSolverUtils::dotProduct( sizeNode, uzAuxView, uzAuxView, normUzaux ); + + normUtotAux = normUxaux+normUyaux+normUzaux; + + + forAll< EXEC_POLICY >( sizeNode, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + uxView[a]= uxAuxView[a]/sqrt( normUtotAux ); + uyView[a]= uyAuxView[a]/sqrt( normUtotAux ); + uzView[a]= uzAuxView[a]/sqrt( normUtotAux ); + } ); + + if( LvArray::math::abs( lambdaNew-lambdaOld )/LvArray::math::abs( lambdaNew )<= epsilon ) + { + counter++; + } + else + { + counter=0; + } + + numberIter++; + + + } + while (counter < 10 && numberIter < nIterMax); + + GEOS_THROW_IF( numberIter> nIterMax, "Power Iteration algorithm does not converge", std::runtime_error ); + + real64 dt = 1.99/sqrt( LvArray::math::abs( lambdaNew )); + + return dt; + + } + + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; +}; + /** * @brief Implements kernels for solving the elastic wave equations * explicit central FD method and SEM in the Vertical Transverse Isotropic (VTI) case diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index ba641a8d53f..bb254286d05 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -254,19 +254,6 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMe receiverConstants.setValues< EXEC_POLICY >( 0 ); receiverIsLocal.zero(); - arrayView2d< real32 > const sourceValue = m_sourceValue.toView(); - - real64 dt = 0; - EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); - for( localIndex numSubEvent = 0; numSubEvent < event.numSubGroups(); ++numSubEvent ) - { - EventBase const * subEvent = static_cast< EventBase const * >( event.getSubGroups()[numSubEvent] ); - if( subEvent->getEventName() == "/Solvers/" + getName() ) - { - dt = subEvent->getReference< real64 >( EventBase::viewKeyStruct::forceDtString() ); - } - } - mesh.getElemManager().forElementSubRegionsComplete< CellElementSubRegion >( regionNames, [&]( localIndex const, localIndex const er, localIndex const esr, @@ -315,11 +302,6 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMe receiverIsLocal, receiverNodeIds, receiverConstants, - sourceValue, - dt, - m_timeSourceFrequency, - m_timeSourceDelay, - m_rickerOrder, m_useDAS, m_linearDASSamples, m_linearDASGeometry.toViewConst(), @@ -340,7 +322,7 @@ void ElasticWaveEquationSEM::precomputeSourceAndReceiverTerm( MeshLevel & baseMe nodesToElements.freeOnDevice(); } -void ElasticWaveEquationSEM::addSourceToRightHandSide( integer const & cycleNumber, +void ElasticWaveEquationSEM::addSourceToRightHandSide( real64 const & time_n, arrayView1d< real32 > const rhsx, arrayView1d< real32 > const rhsy, arrayView1d< real32 > const rhsz ) @@ -349,22 +331,25 @@ void ElasticWaveEquationSEM::addSourceToRightHandSide( integer const & cycleNumb arrayView2d< real64 const > const sourceConstantsx = m_sourceConstantsx.toViewConst(); arrayView2d< real64 const > const sourceConstantsy = m_sourceConstantsy.toViewConst(); arrayView2d< real64 const > const sourceConstantsz = m_sourceConstantsz.toViewConst(); - arrayView1d< localIndex const > const sourceIsAccessible = m_sourceIsAccessible.toViewConst(); - arrayView2d< real32 const > const sourceValue = m_sourceValue.toViewConst(); - - GEOS_THROW_IF( cycleNumber > sourceValue.size( 0 ), getDataContext() << ": Too many steps compared to array size", std::runtime_error ); + real32 const timeSourceFrequency = m_timeSourceFrequency; + real32 const timeSourceDelay = m_timeSourceDelay; + localIndex const rickerOrder = m_rickerOrder; + bool useSourceWaveletTables = m_useSourceWaveletTables; + arrayView1d< TableFunction::KernelWrapper const > const sourceWaveletTableWrappers = m_sourceWaveletTableWrappers.toViewConst(); forAll< EXEC_POLICY >( m_sourceConstantsx.size( 0 ), [=] GEOS_HOST_DEVICE ( localIndex const isrc ) { if( sourceIsAccessible[isrc] == 1 ) { + real64 const srcValue = + useSourceWaveletTables ? sourceWaveletTableWrappers[ isrc ].compute( &time_n ) : WaveSolverUtils::evaluateRicker( time_n, timeSourceFrequency, timeSourceDelay, rickerOrder ); for( localIndex inode = 0; inode < sourceConstantsx.size( 1 ); ++inode ) { - real32 const localIncrementx = sourceConstantsx[isrc][inode] * sourceValue[cycleNumber][isrc]; + real32 const localIncrementx = sourceConstantsx[isrc][inode] * srcValue; RAJA::atomicAdd< ATOMIC_POLICY >( &rhsx[sourceNodeIds[isrc][inode]], localIncrementx ); - real32 const localIncrementy = sourceConstantsy[isrc][inode] * sourceValue[cycleNumber][isrc]; + real32 const localIncrementy = sourceConstantsy[isrc][inode] * srcValue; RAJA::atomicAdd< ATOMIC_POLICY >( &rhsy[sourceNodeIds[isrc][inode]], localIncrementy ); - real32 const localIncrementz = sourceConstantsz[isrc][inode] * sourceValue[cycleNumber][isrc]; + real32 const localIncrementz = sourceConstantsz[isrc][inode] * srcValue; RAJA::atomicAdd< ATOMIC_POLICY >( &rhsz[sourceNodeIds[isrc][inode]], localIncrementz ); } } @@ -436,6 +421,8 @@ void ElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() density, mass ); + + ElasticMatricesSEM::DampingMatrix< FE_TYPE > kernelD( finiteElement ); kernelD.template computeDampingMatrix< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), nodeCoords, @@ -472,10 +459,178 @@ void ElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() } ); + if( m_timestepStabilityLimit==1 ) + { + real64 dtOut = 0.0; + computeTimeStep( dtOut ); + m_timestepStabilityLimit = 0; + m_timeStep=dtOut; + } + WaveSolverUtils::initTrace( "seismoTraceReceiver", getName(), m_outputSeismoTrace, m_receiverConstants.size( 0 ), m_receiverIsLocal ); WaveSolverUtils::initTrace( "dasTraceReceiver", getName(), m_outputSeismoTrace, m_linearDASGeometry.size( 0 ), m_receiverIsLocal ); } +real64 ElasticWaveEquationSEM::computeTimeStep( real64 & dtOut ) +{ + + DomainPartition & domain = getGroupByPath< DomainPartition >( "/Problem/domain" ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + + NodeManager & nodeManager = mesh.getNodeManager(); + + // mass matrix to be computed in this function + arrayView1d< real32 > const mass = nodeManager.getField< elasticfields::ElasticMassVector >(); + arrayView1d< real32 > const stiffnessVectorx = nodeManager.getField< elasticfields::StiffnessVectorx >(); + arrayView1d< real32 > const stiffnessVectory = nodeManager.getField< elasticfields::StiffnessVectory >(); + arrayView1d< real32 > const stiffnessVectorz = nodeManager.getField< elasticfields::StiffnessVectorz >(); + + arrayView1d< real32 > const ux_n = nodeManager.getField< elasticfields::Displacementx_n >(); + arrayView1d< real32 > const uy_n = nodeManager.getField< elasticfields::Displacementy_n >(); + arrayView1d< real32 > const uz_n = nodeManager.getField< elasticfields::Displacementz_n >(); + + localIndex const sizeNode = nodeManager.size(); + + real64 const epsilon = 0.00001; + localIndex const nIterMax = 10000; + localIndex numberIter = 0; + localIndex counter = 0; + real64 lambdaNew = 0.0; + + //Randomize p values + srand( time( NULL )); + for( localIndex a = 0; a < sizeNode; ++a ) + { + ux_n[a] = (real64)rand()/(real64) RAND_MAX; + uy_n[a] = (real64)rand()/(real64) RAND_MAX; + uy_n[a] = (real64)rand()/(real64) RAND_MAX; + } + + //Step 1: Normalize randomized pressure + real64 normUx= 0.0; + real64 normUy= 0.0; + real64 normUz= 0.0; + WaveSolverUtils::dotProduct( sizeNode, ux_n, ux_n, normUx ); + WaveSolverUtils::dotProduct( sizeNode, uy_n, uy_n, normUy ); + WaveSolverUtils::dotProduct( sizeNode, uz_n, uz_n, normUz ); + real64 normUtot = normUx+normUy+normUz; + + forAll< EXEC_POLICY >( sizeNode, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + ux_n[a]/= sqrt( normUtot ); + uy_n[a]/= sqrt( normUtot ); + uz_n[a]/= sqrt( normUtot ); + } ); + + //Step 2: Iterations of M^{-1}K)p until we found the max eigenvalues + auto kernelFactory = elasticWaveEquationSEMKernels::ExplicitElasticSEMFactory( dtOut ); + real64 lambdaOld = lambdaNew; + real64 dotProductUxUxaux = 0.0; + real64 dotProductUyUyaux = 0.0; + real64 dotProductUzUzaux = 0.0; + real64 dotProductUtotUtotAux = dotProductUxUxaux+dotProductUyUyaux+dotProductUzUzaux; + real64 normUxaux = 0.0; + real64 normUyaux = 0.0; + real64 normUzaux = 0.0; + real64 normUtotAux = normUxaux+normUyaux+normUzaux; + + do + { + + stiffnessVectorx.zero(); + stiffnessVectory.zero(); + stiffnessVectorz.zero(); + + finiteElement:: + regionBasedKernelApplication< EXEC_POLICY, + constitutive::NullModel, + CellElementSubRegion >( mesh, + regionNames, + getDiscretizationName(), + "", + kernelFactory ); + + + + forAll< EXEC_POLICY >( sizeNode, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + stiffnessVectorx[a]/= mass[a]; + stiffnessVectory[a]/= mass[a]; + stiffnessVectorz[a]/= mass[a]; + } ); + lambdaOld = lambdaNew; + + //Compute lambdaNew using two dotProducts + dotProductUzUzaux = 0.0; + dotProductUxUxaux = 0.0; + dotProductUyUyaux = 0.0; + normUx= 0.0; + normUy= 0.0; + normUz= 0.0; + + WaveSolverUtils::dotProduct( sizeNode, ux_n, stiffnessVectorx, dotProductUxUxaux ); + WaveSolverUtils::dotProduct( sizeNode, uy_n, stiffnessVectory, dotProductUyUyaux ); + WaveSolverUtils::dotProduct( sizeNode, ux_n, stiffnessVectorz, dotProductUzUzaux ); + dotProductUtotUtotAux = dotProductUxUxaux+dotProductUyUyaux+dotProductUzUzaux; + WaveSolverUtils::dotProduct( sizeNode, ux_n, ux_n, normUx ); + WaveSolverUtils::dotProduct( sizeNode, uy_n, ux_n, normUy ); + WaveSolverUtils::dotProduct( sizeNode, uz_n, ux_n, normUz ); + normUtot = normUx+normUy+normUz; + + lambdaNew = dotProductUtotUtotAux/normUtot; + + normUxaux = 0.0; + normUyaux = 0.0; + normUzaux = 0.0; + WaveSolverUtils::dotProduct( sizeNode, stiffnessVectorx, stiffnessVectorx, normUxaux ); + WaveSolverUtils::dotProduct( sizeNode, stiffnessVectory, stiffnessVectory, normUyaux ); + WaveSolverUtils::dotProduct( sizeNode, stiffnessVectorz, stiffnessVectorz, normUzaux ); + + normUtotAux = normUxaux+normUyaux+normUzaux; + + forAll< EXEC_POLICY >( sizeNode, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + ux_n[a] = stiffnessVectorx[a]/( normUtotAux ); + uy_n[a] = stiffnessVectory[a]/( normUtotAux ); + uz_n[a] = stiffnessVectorz[a]/( normUtotAux ); + } ); + + if( LvArray::math::abs( lambdaNew-lambdaOld )/LvArray::math::abs( lambdaNew )<= epsilon ) + { + counter++; + } + else + { + counter=0; + } + + numberIter++; + + + } + while (counter < 10 && numberIter < nIterMax); + + GEOS_THROW_IF( numberIter> nIterMax, "Power Iteration algorithm does not converge", std::runtime_error ); + + //We use 1.99 instead of 2 to have a 5% margin error + real64 dt = 1.99/sqrt( LvArray::math::abs( lambdaNew )); + + dtOut = MpiWrapper::min( dt ); + + stiffnessVectorx.zero(); + stiffnessVectory.zero(); + stiffnessVectorz.zero(); + ux_n.zero(); + uy_n.zero(); + uz_n.zero(); + } ); + return m_timeStep * m_cflFactor; +} + real32 ElasticWaveEquationSEM::computeGlobalMinQFactor() { RAJA::ReduceMin< ReducePolicy< EXEC_POLICY >, real32 > minQ( LvArray::NumericLimits< real32 >::max ); @@ -576,30 +731,29 @@ void ElasticWaveEquationSEM::applyFreeSurfaceBC( real64 const time, DomainPartit real64 ElasticWaveEquationSEM::explicitStepForward( real64 const & time_n, real64 const & dt, - integer cycleNumber, + integer, DomainPartition & domain, bool GEOS_UNUSED_PARAM( computeGradient ) ) { - real64 dtOut = explicitStepInternal( time_n, dt, cycleNumber, domain ); - return dtOut; + real64 dtCompute = explicitStepInternal( time_n, dt, domain ); + return dtCompute; } real64 ElasticWaveEquationSEM::explicitStepBackward( real64 const & time_n, real64 const & dt, - integer cycleNumber, + integer, DomainPartition & domain, bool GEOS_UNUSED_PARAM( computeGradient ) ) { GEOS_ERROR( getDataContext() << ": Backward propagation for the elastic wave propagator not yet implemented" ); - real64 dtOut = explicitStepInternal( time_n, dt, cycleNumber, domain ); + real64 dtOut = explicitStepInternal( time_n, dt, domain ); return dtOut; } -void ElasticWaveEquationSEM::computeUnknowns( real64 const &, +void ElasticWaveEquationSEM::computeUnknowns( real64 const & time_n, real64 const & dt, - integer const cycleNumber, DomainPartition &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) @@ -666,12 +820,7 @@ void ElasticWaveEquationSEM::computeUnknowns( real64 const &, kernelFactory ); } - //Modification of cycleNember useful when minTime < 0 - EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); - real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); - integer const cycleForSource = int(round( -minTime / dt + cycleNumber )); - - addSourceToRightHandSide( cycleForSource, rhsx, rhsy, rhsz ); + addSourceToRightHandSide( time_n, rhsx, rhsy, rhsz ); SortedArrayView< localIndex const > const solverTargetNodesSet = m_solverTargetNodesSet.toViewConst(); if( m_attenuationType == WaveSolverUtils::AttenuationType::sls ) @@ -701,7 +850,6 @@ void ElasticWaveEquationSEM::computeUnknowns( real64 const &, void ElasticWaveEquationSEM::synchronizeUnknowns( real64 const & time_n, real64 const & dt, - integer const, DomainPartition & domain, MeshLevel & mesh, arrayView1d< string const > const & ) @@ -804,23 +952,25 @@ void ElasticWaveEquationSEM::prepareNextTimestep( MeshLevel & mesh ) real64 ElasticWaveEquationSEM::explicitStepInternal( real64 const & time_n, real64 const & dt, - integer const cycleNumber, DomainPartition & domain ) { GEOS_MARK_FUNCTION; GEOS_LOG_RANK_0_IF( dt < epsilonLoc, "Warning! Value for dt: " << dt << "s is smaller than local threshold: " << epsilonLoc ); + real64 dtCompute; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) { - computeUnknowns( time_n, dt, cycleNumber, domain, mesh, regionNames ); - synchronizeUnknowns( time_n, dt, cycleNumber, domain, mesh, regionNames ); + localIndex nSubSteps = (int) ceil( dt/m_timeStep ); + dtCompute = dt/nSubSteps; + computeUnknowns( time_n, dtCompute, domain, mesh, regionNames ); + synchronizeUnknowns( time_n, dtCompute, domain, mesh, regionNames ); prepareNextTimestep( mesh ); } ); - return dt; + return dtCompute; } void ElasticWaveEquationSEM::cleanup( real64 const time_n, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp index f3c0b14396f..dbb31405477 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp @@ -88,7 +88,7 @@ class ElasticWaveEquationSEM : public WaveSolverBase * @param rhsy the right hand side vector to be computed (y-component) * @param rhsz the right hand side vector to be computed (z-component) */ - void addSourceToRightHandSide( integer const & cycleNumber, arrayView1d< real32 > const rhsx, arrayView1d< real32 > const rhsy, arrayView1d< real32 > const rhsz ); + void addSourceToRightHandSide( real64 const & time_n, arrayView1d< real32 > const rhsx, arrayView1d< real32 > const rhsy, arrayView1d< real32 > const rhsz ); /** * TODO: move implementation into WaveSolverBase once 'm_receiverIsLocal' is also moved @@ -102,6 +102,9 @@ class ElasticWaveEquationSEM : public WaveSolverBase arrayView2d< real32 > const yCompRcv, arrayView2d< real32 > const zCompRcv ); + virtual real64 computeTimeStep( real64 & dtOut ) override; + + /** * @brief Overridden from ExecutableGroup. Used to write last seismogram if needed. */ @@ -138,19 +141,16 @@ class ElasticWaveEquationSEM : public WaveSolverBase */ real64 explicitStepInternal( real64 const & time_n, real64 const & dt, - integer const cycleNumber, DomainPartition & domain ); void computeUnknowns( real64 const & time_n, real64 const & dt, - integer const cycleNumber, DomainPartition & domain, MeshLevel & mesh, arrayView1d< string const > const & regionNames ); void synchronizeUnknowns( real64 const & time_n, real64 const & dt, - integer const cycleNumber, DomainPartition & domain, MeshLevel & mesh, arrayView1d< string const > const & regionNames ); diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp index 7115ac0fbb1..761569c7fe0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp @@ -51,11 +51,6 @@ struct PreComputeSourcesAndReceivers * @param[out] receiverIsLocal flag indicating whether the receiver is local or not * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located * @param[out] receiverConstants constant part of the receiver term - * @param[out] sourceValue value of the temporal source (eg. Ricker) - * @param[in] dt time-step - * @param[in] timeSourceFrequency the central frequency of the source - * @param[in] timeSourceDelay the time delay of the source - * @param[in] rickerOrder order of the Ricker wavelet */ template< typename EXEC_POLICY, typename FE_TYPE > static void @@ -77,12 +72,7 @@ struct PreComputeSourcesAndReceivers arrayView2d< real64 const > const receiverCoordinates, arrayView1d< localIndex > const receiverIsLocal, arrayView2d< localIndex > const receiverNodeIds, - arrayView2d< real64 > const receiverConstants, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder ) + arrayView2d< real64 > const receiverConstants ) { constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; @@ -131,11 +121,6 @@ struct PreComputeSourcesAndReceivers sourceNodeIds[isrc][a] = elemsToNodes( k, a ); sourceConstants[isrc][a] = Ntest[a]; } - - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } } } } // end loop over all sources @@ -216,11 +201,6 @@ struct PreComputeSourcesAndReceivers * @param[out] receiverElem element where a receiver is located * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located * @param[out] receiverConstants constant part of the receiver term - * @param[out] sourceValue value of the temporal source (eg. Ricker) - * @param[in] dt time-step - * @param[in] timeSourceFrequency the central frequency of the source - * @param[in] timeSourceDelay the time delay of the source - * @param[in] rickerOrder order of the Ricker wavelet */ template< typename EXEC_POLICY, typename FE_TYPE > static void @@ -247,12 +227,7 @@ struct PreComputeSourcesAndReceivers arrayView1d< localIndex > const receiverElem, arrayView2d< localIndex > const receiverNodeIds, arrayView2d< real64 > const receiverConstants, - arrayView1d< localIndex > const receiverRegion, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder ) + arrayView1d< localIndex > const receiverRegion ) { constexpr localIndex numNodesPerElem = FE_TYPE::numNodes; @@ -304,10 +279,6 @@ struct PreComputeSourcesAndReceivers sourceConstants[isrc][a] = Ntest[a]; } - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } } } } // end loop over all sources @@ -390,11 +361,6 @@ struct PreComputeSourcesAndReceivers * @param[out] receiverIsLocal flag indicating whether the receiver is local or not * @param[out] receiverNodeIds indices of the nodes of the element where the receiver is located * @param[out] receiverConstants constant part of the receiver term - * @param[out] sourceValue array containing the value of the time dependent source (Ricker for e.g) - * @param[in] dt time-step - * @param[in] timeSourceFrequency Peak frequency of the source - * @param[in] timeSourceDelay Delay of the source - * @param[in] rickerOrder Order of the Ricker wavelet * @param[in] useDAS parameter that determines which kind of receiver needs to be modeled (DAS or not, and which type) * @param[in] linearDASSamples parameter that gives the number of integration points to be used when computing the DAS signal via strain * integration @@ -425,11 +391,6 @@ struct PreComputeSourcesAndReceivers arrayView1d< localIndex > const receiverIsLocal, arrayView2d< localIndex > const receiverNodeIds, arrayView2d< real64 > const receiverConstants, - arrayView2d< real32 > const sourceValue, - real64 const dt, - real32 const timeSourceFrequency, - real32 const timeSourceDelay, - localIndex const rickerOrder, WaveSolverUtils::DASType useDAS, integer linearDASSamples, arrayView2d< real64 const > const linearDASGeometry, @@ -512,11 +473,6 @@ struct PreComputeSourcesAndReceivers sourceConstantsz[isrc][q] += inc[2]; } - for( localIndex cycle = 0; cycle < sourceValue.size( 0 ); ++cycle ) - { - sourceValue[cycle][isrc] = WaveSolverUtils::evaluateRicker( cycle * dt, timeSourceFrequency, timeSourceDelay, rickerOrder ); - } - } } } // end loop over all sources diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index d15555e75a9..2d47951446a 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -54,12 +54,6 @@ WaveSolverBase::WaveSolverBase( const std::string & name, setSizedFromParent( 0 ). setDescription( "Coordinates (x,y,z) of the receivers" ); - registerWrapper( viewKeyStruct::sourceValueString(), &m_sourceValue ). - setInputFlag( InputFlags::FALSE ). - setRestartFlags( RestartFlags::NO_WRITE ). - setSizedFromParent( 0 ). - setDescription( "Source Value of the sources" ); - registerWrapper( viewKeyStruct::timeSourceDelayString(), &m_timeSourceDelay ). setInputFlag( InputFlags::OPTIONAL ). setApplyDefaultValue( -1 ). @@ -191,6 +185,18 @@ WaveSolverBase::WaveSolverBase( const std::string & name, setSizedFromParent( 0 ). setDescription( "Flag that indicates whether the receiver is local to this MPI rank" ); + registerWrapper( viewKeyStruct::timestepStabilityLimitString(), &m_timestepStabilityLimit ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 0 ). + setDescription( "Set to 1 to apply a stability limit to the simulation timestep. The timestep used is that given by the CFL condition times the cflFactor parameter." ); + + registerWrapper( viewKeyStruct::timeStepString(), &m_timeStep ). + setInputFlag( InputFlags::FALSE ). + setSizedFromParent( 0 ). + setApplyDefaultValue( 1 ). + setDescription( "TimeStep computed with the power iteration method (if we don't want to compute it, it is initialized with the XML value" ); + + registerWrapper( viewKeyStruct::receiverRegionString(), &m_receiverRegion ). setInputFlag( InputFlags::FALSE ). setSizedFromParent( 0 ). @@ -220,6 +226,11 @@ WaveSolverBase::WaveSolverBase( const std::string & name, setApplyDefaultValue( WaveSolverUtils::AttenuationType::none ). setDescription( "Flag to indicate which attenuation model to use: \"none\" for no attenuation, \"sls\\" " for the standard-linear-solid (SLS) model (Fichtner, 2014)." ); + registerWrapper( viewKeyStruct::sourceWaveletTableNames(), &m_sourceWaveletTableNames ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Names of the table functions, one for each source, that are used to define the source wavelets. If a list is given, it overrides the Ricker wavelet definitions." + "The default value is an empty list, which means that a Ricker wavelet is used everywhere." ); + } WaveSolverBase::~WaveSolverBase() @@ -273,6 +284,17 @@ void WaveSolverBase::initializePreSubGroups() m_receiverConstants.resize( numReceiversGlobal, numNodesPerElem ); m_receiverIsLocal.resize( numReceiversGlobal ); + if( m_useSourceWaveletTables ) + { + FunctionManager const & functionManager = FunctionManager::getInstance(); + m_sourceWaveletTableWrappers.clear(); + for( integer i = 0; i < m_sourceWaveletTableNames.size(); i++ ) + { + TableFunction const & sourceWaveletTable = functionManager.getGroup< TableFunction >( m_sourceWaveletTableNames[ i ] ); + m_sourceWaveletTableWrappers.emplace_back( sourceWaveletTable.createKernelWrapper() ); + } + } + } void WaveSolverBase::postInputInitialization() @@ -359,18 +381,6 @@ void WaveSolverBase::postInputInitialization() EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); real64 const & maxTime = event.getReference< real64 >( EventManager::viewKeyStruct::maxTimeString() ); - real64 const & minTime = event.getReference< real64 >( EventManager::viewKeyStruct::minTimeString() ); - real64 dt = 0; - for( localIndex numSubEvent = 0; numSubEvent < event.numSubGroups(); ++numSubEvent ) - { - EventBase const * subEvent = static_cast< EventBase const * >( event.getSubGroups()[numSubEvent] ); - if( subEvent->getEventName() == "/Solvers/" + this->getName() ) - { - dt = subEvent->getReference< real64 >( EventBase::viewKeyStruct::forceDtString() ); - } - } - - GEOS_THROW_IF( dt < epsilonLoc * maxTime, getDataContext() << ": Value for dt: " << dt <<" is smaller than local threshold: " << epsilonLoc, std::runtime_error ); if( m_dtSeismoTrace > 0 ) { @@ -380,10 +390,11 @@ void WaveSolverBase::postInputInitialization() { m_nsamplesSeismoTrace = 0; } - localIndex const nsamples = int( (maxTime - minTime) / dt) + 1; - localIndex const numSourcesGlobal = m_sourceCoordinates.size( 0 ); - m_sourceValue.resize( nsamples, numSourcesGlobal ); + GEOS_THROW_IF( m_sourceWaveletTableNames.size() > 0 && m_sourceWaveletTableNames.size() != m_sourceCoordinates.size( 0 ), + "Invalid number of source wavelet table names. The number of table functions must be equal to the number of sources", + InputError ); + m_useSourceWaveletTables = m_sourceWaveletTableNames.size() > 0; } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp index 6c6ce292243..26610228889 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp @@ -25,6 +25,7 @@ #include "mesh/MeshFields.hpp" #include "physicsSolvers/SolverBase.hpp" #include "common/LifoStorage.hpp" +#include "functions/TableFunction.hpp" #if !defined( GEOS_USE_HIP ) #include "finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp" #endif @@ -82,7 +83,6 @@ class WaveSolverBase : public SolverBase struct viewKeyStruct : SolverBase::viewKeyStruct { static constexpr char const * sourceCoordinatesString() { return "sourceCoordinates"; } - static constexpr char const * sourceValueString() { return "sourceValue"; } static constexpr char const * timeSourceFrequencyString() { return "timeSourceFrequency"; } static constexpr char const * timeSourceDelayString() { return "timeSourceDelay"; } @@ -123,9 +123,14 @@ class WaveSolverBase : public SolverBase static constexpr char const * receiverRegionString() { return "receiverRegion"; } static constexpr char const * freeSurfaceString() { return "FreeSurface"; } + static constexpr char const * timestepStabilityLimitString() { return "timestepStabilityLimit"; } + static constexpr char const * timeStepString() { return "timeStep"; } + static constexpr char const * attenuationTypeString() { return "attenuationType"; } static constexpr char const * slsReferenceAngularFrequenciesString() { return "slsReferenceAngularFrequencies"; } static constexpr char const * slsAnelasticityCoefficientsString() { return "slsAnelasticityCoefficients"; } + + static constexpr char const * sourceWaveletTableNames() { return "sourceWaveletTableNames"; } }; /** @@ -157,6 +162,9 @@ class WaveSolverBase : public SolverBase */ virtual void applyFreeSurfaceBC( real64 const time, DomainPartition & domain ) = 0; + /** + */ + virtual real64 computeTimeStep( real64 & dtOut ) = 0; /** * @brief Initialize Perfectly Matched Layer (PML) information @@ -249,9 +257,6 @@ class WaveSolverBase : public SolverBase /// Coordinates of the sources in the mesh array2d< real64 > m_sourceCoordinates; - /// Precomputed value of the source terms - array2d< real32 > m_sourceValue; - /// Central frequency for the Ricker time source real32 m_timeSourceFrequency; @@ -315,6 +320,14 @@ class WaveSolverBase : public SolverBase /// Flag to apply PML integer m_usePML; + /// Flag to precompute the time-step + /// usage: the time-step is computed then the code exit and you can + /// copy paste the time-step inside the XML then deactivate the option + integer m_timestepStabilityLimit; + + //Time step computed with power iteration + real64 m_timeStep; + /// Indices of the nodes (in the right order) for each source point array2d< localIndex > m_sourceNodeIds; @@ -357,6 +370,15 @@ class WaveSolverBase : public SolverBase /// A set of target nodes IDs that will be handled by the current solver SortedArray< localIndex > m_solverTargetNodesSet; + /// Names of table functions for source wavelet (time dependency) + array1d< string > m_sourceWaveletTableNames; + + /// Flag to indicate if source wavelet table functions are used + bool m_useSourceWaveletTables; + + /// Wrappers of table functions for source wavelet (time dependency) + array1d< TableFunction::KernelWrapper > m_sourceWaveletTableWrappers; + struct parametersPML { /// Mininum (x,y,z) coordinates of inner PML boundaries diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp index 0e43aa4a69f..17287299fe3 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp @@ -396,6 +396,34 @@ struct WaveSolverUtils } } + /** + * @brief Compute dotProduct between two vectors + * @param numFacesPerElem number of face on an element + * @param elemCenter array containing the center of the elements + * @param faceNormal array containing the normal of all faces + * @param faceCenter array containing the center of all faces + * @param elemsToFaces map to get the global faces from element index and local face index + * @param coords coordinate of the point + * @return true if coords is inside the element + */ + + + static void dotProduct( localIndex const size, + arrayView1d< real32 > const & vector1, + arrayView1d< real32 > const & vector2, + real64 & res ) + { + + RAJA::ReduceSum< parallelDeviceReduce, real64 > tmp( 0.0 ); + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + tmp+= vector1[a]*vector2[a]; + } ); + + res = tmp.get(); + + } + /** * @brief Converts the DAS direction from dip/azimuth to a 3D unit vector * @param[in] dip the dip of the linear DAS diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp index 11664efc437..f2e52c68305 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp @@ -16,6 +16,8 @@ // using some utility classes from the following unit test #include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" +#include +#include #include "common/DataTypes.hpp" #include "mainInterface/initialization.hpp" #include "mainInterface/ProblemManager.hpp" @@ -41,7 +43,6 @@ char const * xmlInput = @@ -191,6 +194,12 @@ TEST_F( AcousticWaveEquationSEMTest, SeismoTrace ) DomainPartition & domain = state.getProblemManager().getDomainPartition(); propagator = &state.getProblemManager().getPhysicsSolverManager().getGroup< AcousticWaveEquationSEM >( "acousticSolver" ); + + + //Assert on time-step computed with the automatci time-step routine + real64 const dtOut = propagator->getReference< real64 >( AcousticWaveEquationSEM::viewKeyStruct::timeStepString() ); + ASSERT_TRUE( dtOut < 0.04 ); + real64 time_n = time; // run for 1s (10 steps) for( int i=0; i<10; i++ ) diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp index e05e49735ae..4446ac3a945 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp @@ -41,7 +41,6 @@ char const * xmlInput = @@ -185,6 +186,11 @@ TEST_F( ElasticWaveEquationSEMTest, SeismoTrace ) // cleanup (triggers calculation of the remaining seismograms data points) propagator->cleanup( 1.0, 10, 0, 0, domain ); + //Assert on time-step computed with the automatci time-step routine + real64 const dtOut = propagator->getReference< real64 >( ElasticWaveEquationSEM::viewKeyStruct::timeStepString() ); + ASSERT_TRUE( dtOut < 0.04 ); + + // retrieve seismo arrayView2d< real32 > const dasReceivers = propagator->getReference< array2d< real32 > >( ElasticWaveEquationSEM::viewKeyStruct::dasSignalNp1AtReceiversString() ).toView(); From 0e726ceb4e56f1ec3e37ab7732ff1b712cc285ef Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Mon, 4 Nov 2024 15:26:44 -0800 Subject: [PATCH 229/286] refactor: Change "SolverBase" to "PhysicsSolverBase" (#3365) * change SolverBase to PhysicsSolverBase * remove camp as a specific dependency in LvArray to avoid duplicate lib messages since it already is an inherited dependency from RAJA --------- Co-authored-by: Matteo Cusini --- src/coreComponents/LvArray | 2 +- src/coreComponents/events/EventBase.hpp | 2 +- .../mainInterface/ProblemManager.cpp | 6 +- src/coreComponents/mesh/MeshManager.hpp | 1 - .../physicsSolvers/CMakeLists.txt | 6 +- .../NonlinearSolverParameters.cpp | 4 +- .../NonlinearSolverParameters.hpp | 6 +- .../{SolverBase.cpp => PhysicsSolverBase.cpp} | 310 +++++++++--------- .../{SolverBase.hpp => PhysicsSolverBase.hpp} | 48 +-- ...rnels.hpp => PhysicsSolverBaseKernels.hpp} | 6 +- .../physicsSolvers/PhysicsSolverManager.cpp | 10 +- .../physicsSolvers/PhysicsSolverManager.hpp | 1 - .../contact/ContactSolverBase.cpp | 2 +- ...lidMechanicsAugmentedLagrangianContact.cpp | 2 +- ...lidMechanicsAugmentedLagrangianContact.hpp | 2 +- .../SolidMechanicsEmbeddedFractures.cpp | 2 +- .../SolidMechanicsEmbeddedFractures.hpp | 2 +- .../contact/SolidMechanicsLagrangeContact.cpp | 4 +- .../contact/SolidMechanicsLagrangeContact.hpp | 2 +- .../contact/SolidMechanicsPenaltyContact.cpp | 4 +- .../contact/SolidMechanicsPenaltyContact.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 2 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 22 +- .../fluidFlow/CompositionalMultiphaseFVM.hpp | 2 +- .../CompositionalMultiphaseHybridFVM.cpp | 14 +- .../CompositionalMultiphaseHybridFVM.hpp | 2 +- ...ompositionalMultiphaseHybridFVMKernels.hpp | 8 +- .../fluidFlow/FlowSolverBase.cpp | 12 +- .../fluidFlow/FlowSolverBase.hpp | 6 +- ...rmalCompositionalMultiphaseBaseKernels.hpp | 10 +- .../ReactiveCompositionalMultiphaseOBL.cpp | 4 +- .../ReactiveCompositionalMultiphaseOBL.hpp | 2 +- .../fluidFlow/SinglePhaseBaseKernels.hpp | 10 +- .../fluidFlow/SinglePhaseFVM.cpp | 30 +- .../fluidFlow/SinglePhaseFVM.hpp | 4 +- .../fluidFlow/SinglePhaseHybridFVM.cpp | 14 +- .../fluidFlow/SinglePhaseHybridFVM.hpp | 2 +- .../fluidFlow/SinglePhaseHybridFVMKernels.hpp | 10 +- .../fluidFlow/SinglePhaseProppantBase.cpp | 2 +- ...rmalCompositionalMultiphaseBaseKernels.hpp | 6 +- .../ThermalSinglePhaseBaseKernels.hpp | 8 +- .../proppantTransport/ProppantTransport.cpp | 12 +- .../proppantTransport/ProppantTransport.hpp | 2 +- .../ProppantTransportKernels.hpp | 10 +- .../wells/CompositionalMultiphaseWell.cpp | 4 +- .../wells/CompositionalMultiphaseWell.hpp | 2 +- .../CompositionalMultiphaseWellKernels.hpp | 4 +- .../fluidFlow/wells/SinglePhaseWell.cpp | 2 +- .../fluidFlow/wells/SinglePhaseWell.hpp | 2 +- .../wells/SinglePhaseWellKernels.hpp | 6 +- ...rmalCompositionalMultiphaseWellKernels.hpp | 6 +- .../wells/ThermalSinglePhaseWellKernels.hpp | 2 +- .../fluidFlow/wells/WellSolverBase.cpp | 17 +- .../fluidFlow/wells/WellSolverBase.hpp | 6 +- .../inducedSeismicity/SeismicityRate.cpp | 10 +- .../inducedSeismicity/SeismicityRate.hpp | 8 +- ...mpositionalMultiphaseReservoirAndWells.cpp | 6 +- ...mpositionalMultiphaseReservoirAndWells.hpp | 2 +- .../CoupledReservoirAndWellsBase.cpp | 6 +- .../CoupledReservoirAndWellsBase.hpp | 4 +- .../multiphysics/CoupledSolver.hpp | 14 +- .../FlowProppantTransportSolver.cpp | 2 +- .../FlowProppantTransportSolver.hpp | 2 +- .../multiphysics/HydrofractureSolver.cpp | 4 +- .../multiphysics/HydrofractureSolver.hpp | 2 +- .../multiphysics/MultiphasePoromechanics.cpp | 10 +- .../multiphysics/MultiphasePoromechanics.hpp | 4 +- .../multiphysics/PhaseFieldFractureSolver.cpp | 2 +- .../multiphysics/PhaseFieldFractureSolver.hpp | 2 +- .../multiphysics/PoromechanicsSolver.hpp | 26 +- .../multiphysics/SinglePhasePoromechanics.cpp | 10 +- .../multiphysics/SinglePhasePoromechanics.hpp | 4 +- ...ePhasePoromechanicsConformingFractures.cpp | 4 +- ...ePhasePoromechanicsConformingFractures.hpp | 2 +- ...glePhasePoromechanicsEmbeddedFractures.cpp | 2 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 2 +- .../SinglePhaseReservoirAndWells.cpp | 8 +- .../SinglePhaseReservoirAndWells.hpp | 2 +- .../physicsSolvers/python/PySolver.cpp | 4 +- .../physicsSolvers/python/PySolver.hpp | 2 +- .../simplePDE/LaplaceBaseH1.cpp | 10 +- .../simplePDE/LaplaceBaseH1.hpp | 10 +- .../physicsSolvers/simplePDE/LaplaceFEM.cpp | 6 +- .../physicsSolvers/simplePDE/LaplaceFEM.hpp | 6 +- .../simplePDE/PhaseFieldDamageFEM.cpp | 8 +- .../simplePDE/PhaseFieldDamageFEM.hpp | 8 +- .../SolidMechanicsLagrangianFEM.cpp | 18 +- .../SolidMechanicsLagrangianFEM.hpp | 12 +- .../SolidMechanicsLagrangianSSLE.cpp | 2 +- .../SolidMechanicsLagrangianSSLE.hpp | 2 +- .../solidMechanics/SolidMechanicsMPM.cpp | 14 +- .../solidMechanics/SolidMechanicsMPM.hpp | 10 +- .../EmbeddedSurfaceGenerator.cpp | 4 +- .../EmbeddedSurfaceGenerator.hpp | 8 +- .../surfaceGeneration/SurfaceGenerator.cpp | 4 +- .../surfaceGeneration/SurfaceGenerator.hpp | 8 +- .../AcousticFirstOrderWaveEquationSEM.cpp | 2 +- .../AcousticFirstOrderWaveEquationSEM.hpp | 2 +- .../AcousticVTIWaveEquationSEM.cpp | 4 +- .../AcousticVTIWaveEquationSEM.hpp | 4 +- .../isotropic/AcousticWaveEquationSEM.cpp | 4 +- .../isotropic/AcousticWaveEquationSEM.hpp | 4 +- .../AcousticElasticWaveEquationSEM.cpp | 10 +- .../AcousticElasticWaveEquationSEM.hpp | 10 +- .../ElasticFirstOrderWaveEquationSEM.cpp | 4 +- .../ElasticFirstOrderWaveEquationSEM.hpp | 4 +- .../isotropic/ElasticWaveEquationSEM.cpp | 4 +- .../isotropic/ElasticWaveEquationSEM.hpp | 4 +- .../wavePropagation/shared/WaveSolverBase.cpp | 8 +- .../wavePropagation/shared/WaveSolverBase.hpp | 6 +- src/coreComponents/schema/schema.xsd | 4 +- src/coreComponents/schema/schema.xsd.other | 4 +- .../fluidFlowTests/testFlowStatistics.cpp | 4 +- src/docs/doxygen/Doxyfile.in | 2 +- src/docs/sphinx/Doxygen.rst | 2 +- .../KeyComponents/AddingNewSolver.rst | 8 +- .../KeyComponents/WorkingWithData.rst | 2 +- .../developerGuide/KeyComponents/XML.rst | 12 +- .../newComponentTemplate/src/NewComponent.cpp | 4 +- .../newComponentTemplate/src/NewComponent.hpp | 4 +- 120 files changed, 530 insertions(+), 529 deletions(-) rename src/coreComponents/physicsSolvers/{SolverBase.cpp => PhysicsSolverBase.cpp} (79%) rename src/coreComponents/physicsSolvers/{SolverBase.hpp => PhysicsSolverBase.hpp} (96%) rename src/coreComponents/physicsSolvers/{SolverBaseKernels.hpp => PhysicsSolverBaseKernels.hpp} (98%) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 355e8d987fb..becf1405278 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 355e8d987fbf15c9ac07442bda28bc52a8e80480 +Subproject commit becf14052782f37f95f8e49d92cb8837883d57c7 diff --git a/src/coreComponents/events/EventBase.hpp b/src/coreComponents/events/EventBase.hpp index 25a13175ffc..6e9651c5e4e 100644 --- a/src/coreComponents/events/EventBase.hpp +++ b/src/coreComponents/events/EventBase.hpp @@ -170,7 +170,7 @@ class EventBase : public ExecutableGroup /** * @brief Update the event progress for the event/sub-events. * @note This method is used to determine how to handle the timestamp for an event - * @note If the event occurs after anything targeting a SolverBase object, then + * @note If the event occurs after anything targeting a PhysicsSolverBase object, then * set the m_isPostSolverEvent flag. If set, then the time passed to the target * will be time + dt. * @param eventCounters The event count for each event/sub-event. diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 0a134a6bcea..7e811191bb4 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -46,7 +46,7 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "mesh/mpiCommunications/SpatialPartition.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "schema/schemaUtilities.hpp" // System includes @@ -766,7 +766,7 @@ ProblemManager::getDiscretizations() const DomainPartition const & domain = getDomainPartition(); Group const & meshBodies = domain.getMeshBodies(); - m_physicsSolverManager->forSubGroups< SolverBase >( [&]( SolverBase & solver ) + m_physicsSolverManager->forSubGroups< PhysicsSolverBase >( [&]( PhysicsSolverBase & solver ) { solver.generateMeshTargetsFromTargetRegions( meshBodies ); @@ -902,7 +902,7 @@ map< std::tuple< string, string, string, string >, localIndex > ProblemManager:: for( localIndex solverIndex=0; solverIndexnumSubGroups(); ++solverIndex ) { - SolverBase const * const solver = m_physicsSolverManager->getGroupPointer< SolverBase >( solverIndex ); + PhysicsSolverBase const * const solver = m_physicsSolverManager->getGroupPointer< PhysicsSolverBase >( solverIndex ); if( solver != nullptr ) { diff --git a/src/coreComponents/mesh/MeshManager.hpp b/src/coreComponents/mesh/MeshManager.hpp index 793eaee775d..c00c8cc093b 100644 --- a/src/coreComponents/mesh/MeshManager.hpp +++ b/src/coreComponents/mesh/MeshManager.hpp @@ -25,7 +25,6 @@ namespace geos { -class SolverBase; /** * @class MeshManager diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index 6bc42626602..3a8c812dab6 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -3,8 +3,8 @@ set( physicsSolvers_headers LinearSolverParameters.hpp NonlinearSolverParameters.hpp PhysicsSolverManager.hpp - SolverBase.hpp - SolverBaseKernels.hpp + PhysicsSolverBase.hpp + PhysicsSolverBaseKernels.hpp SolverStatistics.hpp FieldStatisticsBase.hpp LogLevelsInfo.hpp ) @@ -14,7 +14,7 @@ set( physicsSolvers_sources LinearSolverParameters.cpp NonlinearSolverParameters.cpp PhysicsSolverManager.cpp - SolverBase.cpp + PhysicsSolverBase.cpp SolverStatistics.cpp ) if( GEOS_ENABLE_CONTACT ) diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp index 94d3f9658dc..c8438212f63 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp @@ -69,9 +69,9 @@ NonlinearSolverParameters::NonlinearSolverParameters( string const & name, registerWrapper( viewKeysStruct::normTypeString(), &m_normType ). setInputFlag( InputFlags::FALSE ). - setApplyDefaultValue( solverBaseKernels::NormType::Linf ). + setApplyDefaultValue( physicsSolverBaseKernels::NormType::Linf ). setDescription( "Norm used by the flow solver to check nonlinear convergence. " - "Valid options:\n* " + EnumStrings< solverBaseKernels::NormType >::concat( "\n* " ) ); + "Valid options:\n* " + EnumStrings< physicsSolverBaseKernels::NormType >::concat( "\n* " ) ); registerWrapper( viewKeysStruct::minNormalizerString(), &m_minNormalizer ). setInputFlag( dataRepository::InputFlags::OPTIONAL ). diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp index 4678b3c38d2..0d68e7e6787 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp @@ -18,7 +18,7 @@ #include "codingUtilities/EnumStrings.hpp" #include "dataRepository/Group.hpp" -#include "physicsSolvers/SolverBaseKernels.hpp" +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" namespace geos { @@ -241,7 +241,7 @@ class NonlinearSolverParameters : public dataRepository::Group * @brief Getter for the norm type used to check convergence in the flow/well solvers * @return the norm type */ - solverBaseKernels::NormType normType() const + physicsSolverBaseKernels::NormType normType() const { return m_normType; } @@ -283,7 +283,7 @@ class NonlinearSolverParameters : public dataRepository::Group real64 m_lineSearchResidualFactor; /// Norm used to check the nonlinear loop convergence - solverBaseKernels::NormType m_normType; + physicsSolverBaseKernels::NormType m_normType; /// The tolerance for the nonlinear convergence check. real64 m_newtonTol; diff --git a/src/coreComponents/physicsSolvers/SolverBase.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp similarity index 79% rename from src/coreComponents/physicsSolvers/SolverBase.cpp rename to src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp index 1420ce45fd2..1e2ef81d5a9 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp @@ -13,7 +13,7 @@ * ------------------------------------------------------------------------------------------------------------ */ -#include "SolverBase.hpp" +#include "PhysicsSolverBase.hpp" #include "PhysicsSolverManager.hpp" #include "common/TimingMacros.hpp" @@ -33,8 +33,8 @@ namespace geos using namespace dataRepository; -SolverBase::SolverBase( string const & name, - Group * const parent ) +PhysicsSolverBase::PhysicsSolverBase( string const & name, + Group * const parent ) : ExecutableGroup( name, parent ), m_cflFactor(), @@ -113,16 +113,16 @@ SolverBase::SolverBase( string const & name, m_matrix.setDofManager( &m_dofManager ); } -SolverBase::~SolverBase() = default; +PhysicsSolverBase::~PhysicsSolverBase() = default; -void SolverBase::initialize_postMeshGeneration() +void PhysicsSolverBase::initialize_postMeshGeneration() { ExecutableGroup::initialize_postMeshGeneration(); DomainPartition const & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); generateMeshTargetsFromTargetRegions( domain.getMeshBodies()); } -void SolverBase::generateMeshTargetsFromTargetRegions( Group const & meshBodies ) +void PhysicsSolverBase::generateMeshTargetsFromTargetRegions( Group const & meshBodies ) { for( auto const & target : m_targetRegionNames ) { @@ -133,7 +133,7 @@ void SolverBase::generateMeshTargetsFromTargetRegions( Group const & meshBodies { GEOS_ERROR_IF( meshBodies.numSubGroups() != 1, getDataContext() << ": No MeshBody information is specified in" << - " SolverBase::meshTargets, but there are multiple MeshBody objects" ); + " PhysicsSolverBase::meshTargets, but there are multiple MeshBody objects" ); MeshBody const & meshBody = meshBodies.getGroup< MeshBody >( 0 ); string const meshBodyName = meshBody.getName(); @@ -166,7 +166,7 @@ void SolverBase::generateMeshTargetsFromTargetRegions( Group const & meshBodies } -void SolverBase::registerDataOnMesh( Group & meshBodies ) +void PhysicsSolverBase::registerDataOnMesh( Group & meshBodies ) { ExecutableGroup::registerDataOnMesh( meshBodies ); @@ -189,18 +189,18 @@ void SolverBase::registerDataOnMesh( Group & meshBodies ) -Group * SolverBase::createChild( string const & GEOS_UNUSED_PARAM( childKey ), string const & GEOS_UNUSED_PARAM( childName ) ) +Group * PhysicsSolverBase::createChild( string const & GEOS_UNUSED_PARAM( childKey ), string const & GEOS_UNUSED_PARAM( childName ) ) { return nullptr; } -SolverBase::CatalogInterface::CatalogType & SolverBase::getCatalog() +PhysicsSolverBase::CatalogInterface::CatalogType & PhysicsSolverBase::getCatalog() { - static SolverBase::CatalogInterface::CatalogType catalog; + static PhysicsSolverBase::CatalogInterface::CatalogType catalog; return catalog; } -localIndex SolverBase::targetRegionIndex( string const & regionName ) const +localIndex PhysicsSolverBase::targetRegionIndex( string const & regionName ) const { auto const pos = std::find( m_targetRegionNames.begin(), m_targetRegionNames.end(), regionName ); GEOS_ERROR_IF( pos == m_targetRegionNames.end(), @@ -209,7 +209,7 @@ localIndex SolverBase::targetRegionIndex( string const & regionName ) const return std::distance( m_targetRegionNames.begin(), pos ); } -bool SolverBase::registerCallback( void * func, const std::type_info & funcType ) +bool PhysicsSolverBase::registerCallback( void * func, const std::type_info & funcType ) { if( std::type_index( funcType ) == std::type_index( typeid( std::function< void( CRSMatrix< real64, globalIndex >, array1d< real64 > ) > ) ) ) { @@ -220,10 +220,10 @@ bool SolverBase::registerCallback( void * func, const std::type_info & funcType return false; } -real64 SolverBase::solverStep( real64 const & time_n, - real64 const & dt, - const integer cycleNumber, - DomainPartition & domain ) +real64 PhysicsSolverBase::solverStep( real64 const & time_n, + real64 const & dt, + const integer cycleNumber, + DomainPartition & domain ) { GEOS_MARK_FUNCTION; @@ -251,12 +251,12 @@ real64 SolverBase::solverStep( real64 const & time_n, return dt_return; } -bool SolverBase::execute( real64 const time_n, - real64 const dt, - integer const cycleNumber, - integer const GEOS_UNUSED_PARAM( eventCounter ), - real64 const GEOS_UNUSED_PARAM( eventProgress ), - DomainPartition & domain ) +bool PhysicsSolverBase::execute( real64 const time_n, + real64 const dt, + integer const cycleNumber, + integer const GEOS_UNUSED_PARAM( eventCounter ), + real64 const GEOS_UNUSED_PARAM( eventProgress ), + DomainPartition & domain ) { GEOS_MARK_FUNCTION; @@ -345,9 +345,9 @@ bool SolverBase::execute( real64 const time_n, return false; } -void SolverBase::logEndOfCycleInformation( integer const cycleNumber, - integer const numOfSubSteps, - std::vector< real64 > const & subStepDt ) const +void PhysicsSolverBase::logEndOfCycleInformation( integer const cycleNumber, + integer const numOfSubSteps, + std::vector< real64 > const & subStepDt ) const { // The formating here is a work in progress. GEOS_LOG_RANK_0( "\n------------------------- TIMESTEP END -------------------------" ); @@ -363,8 +363,8 @@ void SolverBase::logEndOfCycleInformation( integer const cycleNumber, GEOS_LOG_RANK_0( "------------------------------------------------------------------\n" ); } -real64 SolverBase::setNextDt( real64 const & currentDt, - DomainPartition & domain ) +real64 PhysicsSolverBase::setNextDt( real64 const & currentDt, + DomainPartition & domain ) { integer const minTimeStepIncreaseInterval = m_nonlinearSolverParameters.minTimeStepIncreaseInterval(); real64 const nextDtNewton = setNextDtBasedOnNewtonIter( currentDt ); @@ -421,14 +421,14 @@ real64 SolverBase::setNextDt( real64 const & currentDt, return std::min( nextDtNewton, nextDtStateChange ); } -real64 SolverBase::setNextDtBasedOnStateChange( real64 const & currentDt, - DomainPartition & domain ) +real64 PhysicsSolverBase::setNextDtBasedOnStateChange( real64 const & currentDt, + DomainPartition & domain ) { GEOS_UNUSED_VAR( currentDt, domain ); return LvArray::NumericLimits< real64 >::max; // i.e., not implemented } -real64 SolverBase::setNextDtBasedOnNewtonIter( real64 const & currentDt ) +real64 PhysicsSolverBase::setNextDtBasedOnNewtonIter( real64 const & currentDt ) { integer & newtonIter = m_nonlinearSolverParameters.m_numNewtonIterations; integer const iterDecreaseLimit = m_nonlinearSolverParameters.timeStepDecreaseIterLimit(); @@ -459,7 +459,7 @@ real64 SolverBase::setNextDtBasedOnNewtonIter( real64 const & currentDt ) } -real64 SolverBase::setNextDtBasedOnCFL( const geos::real64 & currentDt, geos::DomainPartition & domain ) +real64 PhysicsSolverBase::setNextDtBasedOnCFL( const geos::real64 & currentDt, geos::DomainPartition & domain ) { GEOS_UNUSED_VAR( currentDt, domain ); return LvArray::NumericLimits< real64 >::max; // i.e., not implemented @@ -467,10 +467,10 @@ real64 SolverBase::setNextDtBasedOnCFL( const geos::real64 & currentDt, geos::Do -real64 SolverBase::linearImplicitStep( real64 const & time_n, - real64 const & dt, - integer const GEOS_UNUSED_PARAM( cycleNumber ), - DomainPartition & domain ) +real64 PhysicsSolverBase::linearImplicitStep( real64 const & time_n, + real64 const & dt, + integer const GEOS_UNUSED_PARAM( cycleNumber ), + DomainPartition & domain ) { // call setup for physics solver. Pre step allocations etc. // TODO: Nonlinear step does not call its own setup, need to decide on consistent behavior @@ -563,16 +563,16 @@ real64 SolverBase::linearImplicitStep( real64 const & time_n, } -bool SolverBase::lineSearch( real64 const & time_n, - real64 const & dt, - integer const GEOS_UNUSED_PARAM( cycleNumber ), - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - ParallelVector & rhs, - ParallelVector & solution, - real64 const scaleFactor, - real64 & lastResidual ) +bool PhysicsSolverBase::lineSearch( real64 const & time_n, + real64 const & dt, + integer const GEOS_UNUSED_PARAM( cycleNumber ), + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + ParallelVector & rhs, + ParallelVector & solution, + real64 const scaleFactor, + real64 & lastResidual ) { Timer timer( m_timers["line search"] ); @@ -637,17 +637,17 @@ bool SolverBase::lineSearch( real64 const & time_n, return lineSearchSuccess; } -bool SolverBase::lineSearchWithParabolicInterpolation( real64 const & time_n, - real64 const & dt, - integer const GEOS_UNUSED_PARAM( cycleNumber ), - DomainPartition & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - ParallelVector & rhs, - ParallelVector & solution, - real64 const scaleFactor, - real64 & lastResidual, - real64 & residualNormT ) +bool PhysicsSolverBase::lineSearchWithParabolicInterpolation( real64 const & time_n, + real64 const & dt, + integer const GEOS_UNUSED_PARAM( cycleNumber ), + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + ParallelVector & rhs, + ParallelVector & solution, + real64 const scaleFactor, + real64 & lastResidual, + real64 & residualNormT ) { Timer timer( m_timers["line search"] ); @@ -739,9 +739,9 @@ bool SolverBase::lineSearchWithParabolicInterpolation( real64 const & time_n, } -real64 SolverBase::eisenstatWalker( real64 const newNewtonNorm, - real64 const oldNewtonNorm, - LinearSolverParameters::Krylov const & krylovParams ) +real64 PhysicsSolverBase::eisenstatWalker( real64 const newNewtonNorm, + real64 const oldNewtonNorm, + LinearSolverParameters::Krylov const & krylovParams ) { real64 normRatio = std::min( newNewtonNorm / oldNewtonNorm, 1.0 ); real64 newKrylovTol = krylovParams.adaptiveGamma * std::pow( normRatio, krylovParams.adaptiveExponent ); @@ -760,10 +760,10 @@ real64 SolverBase::eisenstatWalker( real64 const newNewtonNorm, return krylovTol; } -real64 SolverBase::nonlinearImplicitStep( real64 const & time_n, - real64 const & dt, - integer const cycleNumber, - DomainPartition & domain ) +real64 PhysicsSolverBase::nonlinearImplicitStep( real64 const & time_n, + real64 const & dt, + integer const cycleNumber, + DomainPartition & domain ) { GEOS_MARK_FUNCTION; // dt may be cut during the course of this step, so we are keeping a local @@ -875,10 +875,10 @@ real64 SolverBase::nonlinearImplicitStep( real64 const & time_n, return stepDt; } -bool SolverBase::solveNonlinearSystem( real64 const & time_n, - real64 const & stepDt, - integer const cycleNumber, - DomainPartition & domain ) +bool PhysicsSolverBase::solveNonlinearSystem( real64 const & time_n, + real64 const & stepDt, + integer const cycleNumber, + DomainPartition & domain ) { integer const maxNewtonIter = m_nonlinearSolverParameters.m_maxIterNewton; integer & dtAttempt = m_nonlinearSolverParameters.m_numTimeStepAttempts; @@ -1088,34 +1088,34 @@ bool SolverBase::solveNonlinearSystem( real64 const & time_n, return isNewtonConverged; } -real64 SolverBase::explicitStep( real64 const & GEOS_UNUSED_PARAM( time_n ), - real64 const & GEOS_UNUSED_PARAM( dt ), - integer const GEOS_UNUSED_PARAM( cycleNumber ), - DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +real64 PhysicsSolverBase::explicitStep( real64 const & GEOS_UNUSED_PARAM( time_n ), + real64 const & GEOS_UNUSED_PARAM( dt ), + integer const GEOS_UNUSED_PARAM( cycleNumber ), + DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { - GEOS_THROW( "SolverBase::ExplicitStep called!. Should be overridden.", std::runtime_error ); + GEOS_THROW( "PhysicsSolverBase::ExplicitStep called!. Should be overridden.", std::runtime_error ); return 0; } -void SolverBase::implicitStepSetup( real64 const & GEOS_UNUSED_PARAM( time_n ), - real64 const & GEOS_UNUSED_PARAM( dt ), - DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +void PhysicsSolverBase::implicitStepSetup( real64 const & GEOS_UNUSED_PARAM( time_n ), + real64 const & GEOS_UNUSED_PARAM( dt ), + DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { - GEOS_THROW( "SolverBase::ImplicitStepSetup called!. Should be overridden.", std::runtime_error ); + GEOS_THROW( "PhysicsSolverBase::ImplicitStepSetup called!. Should be overridden.", std::runtime_error ); } -void SolverBase::setupDofs( DomainPartition const & GEOS_UNUSED_PARAM( domain ), - DofManager & GEOS_UNUSED_PARAM( dofManager ) ) const +void PhysicsSolverBase::setupDofs( DomainPartition const & GEOS_UNUSED_PARAM( domain ), + DofManager & GEOS_UNUSED_PARAM( dofManager ) ) const { - GEOS_ERROR( "SolverBase::setupDofs called!. Should be overridden." ); + GEOS_ERROR( "PhysicsSolverBase::setupDofs called!. Should be overridden." ); } -void SolverBase::setupSystem( DomainPartition & domain, - DofManager & dofManager, - CRSMatrix< real64, globalIndex > & localMatrix, - ParallelVector & rhs, - ParallelVector & solution, - bool const setSparsity ) +void PhysicsSolverBase::setupSystem( DomainPartition & domain, + DofManager & dofManager, + CRSMatrix< real64, globalIndex > & localMatrix, + ParallelVector & rhs, + ParallelVector & solution, + bool const setSparsity ) { GEOS_MARK_FUNCTION; @@ -1139,24 +1139,24 @@ void SolverBase::setupSystem( DomainPartition & domain, solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); } -void SolverBase::assembleSystem( real64 const GEOS_UNUSED_PARAM( time ), - real64 const GEOS_UNUSED_PARAM( dt ), - DomainPartition & GEOS_UNUSED_PARAM( domain ), - DofManager const & GEOS_UNUSED_PARAM( dofManager ), - CRSMatrixView< real64, globalIndex const > const & GEOS_UNUSED_PARAM( localMatrix ), - arrayView1d< real64 > const & GEOS_UNUSED_PARAM( localRhs ) ) +void PhysicsSolverBase::assembleSystem( real64 const GEOS_UNUSED_PARAM( time ), + real64 const GEOS_UNUSED_PARAM( dt ), + DomainPartition & GEOS_UNUSED_PARAM( domain ), + DofManager const & GEOS_UNUSED_PARAM( dofManager ), + CRSMatrixView< real64, globalIndex const > const & GEOS_UNUSED_PARAM( localMatrix ), + arrayView1d< real64 > const & GEOS_UNUSED_PARAM( localRhs ) ) { - GEOS_ERROR( "SolverBase::Assemble called!. Should be overridden." ); + GEOS_ERROR( "PhysicsSolverBase::Assemble called!. Should be overridden." ); } -void SolverBase::applyBoundaryConditions( real64 const GEOS_UNUSED_PARAM( time ), - real64 const GEOS_UNUSED_PARAM( dt ), - DomainPartition & GEOS_UNUSED_PARAM( domain ), - DofManager const & GEOS_UNUSED_PARAM( dofManager ), - CRSMatrixView< real64, globalIndex const > const & GEOS_UNUSED_PARAM( localMatrix ), - arrayView1d< real64 > const & GEOS_UNUSED_PARAM( localRhs ) ) +void PhysicsSolverBase::applyBoundaryConditions( real64 const GEOS_UNUSED_PARAM( time ), + real64 const GEOS_UNUSED_PARAM( dt ), + DomainPartition & GEOS_UNUSED_PARAM( domain ), + DofManager const & GEOS_UNUSED_PARAM( dofManager ), + CRSMatrixView< real64, globalIndex const > const & GEOS_UNUSED_PARAM( localMatrix ), + arrayView1d< real64 > const & GEOS_UNUSED_PARAM( localRhs ) ) { - GEOS_ERROR( "SolverBase::applyBoundaryConditions called!. Should be overridden." ); + GEOS_ERROR( "PhysicsSolverBase::applyBoundaryConditions called!. Should be overridden." ); } namespace @@ -1200,11 +1200,11 @@ void debugOutputLAObject( T const & obj, } -void SolverBase::debugOutputSystem( real64 const & time, - integer const cycleNumber, - integer const nonlinearIteration, - ParallelMatrix const & matrix, - ParallelVector const & rhs ) const +void PhysicsSolverBase::debugOutputSystem( real64 const & time, + integer const cycleNumber, + integer const nonlinearIteration, + ParallelMatrix const & matrix, + ParallelVector const & rhs ) const { // special case when flag value > 2 if( m_writeLinearSystem > 2 && cycleNumber < m_writeLinearSystem ) @@ -1229,10 +1229,10 @@ void SolverBase::debugOutputSystem( real64 const & time, m_writeLinearSystem >= 2 ); } -void SolverBase::debugOutputSolution( real64 const & time, - integer const cycleNumber, - integer const nonlinearIteration, - ParallelVector const & solution ) const +void PhysicsSolverBase::debugOutputSolution( real64 const & time, + integer const cycleNumber, + integer const nonlinearIteration, + ParallelVector const & solution ) const { // special case when flag value > 2 if( m_writeLinearSystem > 2 && cycleNumber < m_writeLinearSystem ) @@ -1249,20 +1249,20 @@ void SolverBase::debugOutputSolution( real64 const & time, } real64 -SolverBase::calculateResidualNorm( real64 const & GEOS_UNUSED_PARAM( time ), - real64 const & GEOS_UNUSED_PARAM( dt ), - DomainPartition const & GEOS_UNUSED_PARAM( domain ), - DofManager const & GEOS_UNUSED_PARAM( dofManager ), - arrayView1d< real64 const > const & GEOS_UNUSED_PARAM( localRhs ) ) +PhysicsSolverBase::calculateResidualNorm( real64 const & GEOS_UNUSED_PARAM( time ), + real64 const & GEOS_UNUSED_PARAM( dt ), + DomainPartition const & GEOS_UNUSED_PARAM( domain ), + DofManager const & GEOS_UNUSED_PARAM( dofManager ), + arrayView1d< real64 const > const & GEOS_UNUSED_PARAM( localRhs ) ) { - GEOS_ERROR( "SolverBase::calculateResidualNorm called!. Should be overridden." ); + GEOS_ERROR( "PhysicsSolverBase::calculateResidualNorm called!. Should be overridden." ); return 0; } -void SolverBase::solveLinearSystem( DofManager const & dofManager, - ParallelMatrix & matrix, - ParallelVector & rhs, - ParallelVector & solution ) +void PhysicsSolverBase::solveLinearSystem( DofManager const & dofManager, + ParallelMatrix & matrix, + ParallelVector & rhs, + ParallelVector & solution ) { GEOS_MARK_FUNCTION; @@ -1313,73 +1313,73 @@ void SolverBase::solveLinearSystem( DofManager const & dofManager, } } -bool SolverBase::checkSystemSolution( DomainPartition & GEOS_UNUSED_PARAM( domain ), - DofManager const & GEOS_UNUSED_PARAM( dofManager ), - arrayView1d< real64 const > const & GEOS_UNUSED_PARAM( localSolution ), - real64 const GEOS_UNUSED_PARAM( scalingFactor ) ) +bool PhysicsSolverBase::checkSystemSolution( DomainPartition & GEOS_UNUSED_PARAM( domain ), + DofManager const & GEOS_UNUSED_PARAM( dofManager ), + arrayView1d< real64 const > const & GEOS_UNUSED_PARAM( localSolution ), + real64 const GEOS_UNUSED_PARAM( scalingFactor ) ) { return true; } -real64 SolverBase::scalingForSystemSolution( DomainPartition & GEOS_UNUSED_PARAM( domain ), - DofManager const & GEOS_UNUSED_PARAM( dofManager ), - arrayView1d< real64 const > const & GEOS_UNUSED_PARAM( localSolution ) ) +real64 PhysicsSolverBase::scalingForSystemSolution( DomainPartition & GEOS_UNUSED_PARAM( domain ), + DofManager const & GEOS_UNUSED_PARAM( dofManager ), + arrayView1d< real64 const > const & GEOS_UNUSED_PARAM( localSolution ) ) { return 1.0; } -void SolverBase::applySystemSolution( DofManager const & GEOS_UNUSED_PARAM( dofManager ), - arrayView1d< real64 const > const & GEOS_UNUSED_PARAM( localSolution ), - real64 const GEOS_UNUSED_PARAM( scalingFactor ), - real64 const GEOS_UNUSED_PARAM( dt ), - DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +void PhysicsSolverBase::applySystemSolution( DofManager const & GEOS_UNUSED_PARAM( dofManager ), + arrayView1d< real64 const > const & GEOS_UNUSED_PARAM( localSolution ), + real64 const GEOS_UNUSED_PARAM( scalingFactor ), + real64 const GEOS_UNUSED_PARAM( dt ), + DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { - GEOS_ERROR( "SolverBase::applySystemSolution called!. Should be overridden." ); + GEOS_ERROR( "PhysicsSolverBase::applySystemSolution called!. Should be overridden." ); } -void SolverBase::updateState( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +void PhysicsSolverBase::updateState( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { - GEOS_ERROR( "SolverBase::updateState called!. Should be overridden." ); + GEOS_ERROR( "PhysicsSolverBase::updateState called!. Should be overridden." ); } -bool SolverBase::updateConfiguration( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +bool PhysicsSolverBase::updateConfiguration( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { return true; } -void SolverBase::outputConfigurationStatistics( DomainPartition const & GEOS_UNUSED_PARAM( domain ) ) const +void PhysicsSolverBase::outputConfigurationStatistics( DomainPartition const & GEOS_UNUSED_PARAM( domain ) ) const { // For most solvers there is nothing to do. } -void SolverBase::resetConfigurationToBeginningOfStep( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +void PhysicsSolverBase::resetConfigurationToBeginningOfStep( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { // For most solvers there is nothing to do. } -void SolverBase::resetStateToBeginningOfStep( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +void PhysicsSolverBase::resetStateToBeginningOfStep( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { - GEOS_ERROR( "SolverBase::ResetStateToBeginningOfStep called!. Should be overridden." ); + GEOS_ERROR( "PhysicsSolverBase::ResetStateToBeginningOfStep called!. Should be overridden." ); } -bool SolverBase::resetConfigurationToDefault( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) const +bool PhysicsSolverBase::resetConfigurationToDefault( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) const { // for most solvers it just breaks the loop. return true; } -void SolverBase::implicitStepComplete( real64 const & GEOS_UNUSED_PARAM( time ), - real64 const & GEOS_UNUSED_PARAM( dt ), - DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +void PhysicsSolverBase::implicitStepComplete( real64 const & GEOS_UNUSED_PARAM( time ), + real64 const & GEOS_UNUSED_PARAM( dt ), + DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { - GEOS_ERROR( "SolverBase::ImplicitStepComplete called!. Should be overridden." ); + GEOS_ERROR( "PhysicsSolverBase::ImplicitStepComplete called!. Should be overridden." ); } -void SolverBase::cleanup( real64 const GEOS_UNUSED_PARAM( time_n ), - integer const GEOS_UNUSED_PARAM( cycleNumber ), - integer const GEOS_UNUSED_PARAM( eventCounter ), - real64 const GEOS_UNUSED_PARAM( eventProgress ), - DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +void PhysicsSolverBase::cleanup( real64 const GEOS_UNUSED_PARAM( time_n ), + integer const GEOS_UNUSED_PARAM( cycleNumber ), + integer const GEOS_UNUSED_PARAM( eventCounter ), + real64 const GEOS_UNUSED_PARAM( eventProgress ), + DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { m_solverStatistics.outputStatistics(); @@ -1396,7 +1396,7 @@ void SolverBase::cleanup( real64 const GEOS_UNUSED_PARAM( time_n ), } -Timestamp SolverBase::getMeshModificationTimestamp( DomainPartition & domain ) const +Timestamp PhysicsSolverBase::getMeshModificationTimestamp( DomainPartition & domain ) const { Timestamp meshModificationTimestamp = 0; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, @@ -1411,7 +1411,7 @@ Timestamp SolverBase::getMeshModificationTimestamp( DomainPartition & domain ) c return meshModificationTimestamp; } -R1Tensor const SolverBase::gravityVector() const +R1Tensor const PhysicsSolverBase::gravityVector() const { R1Tensor rval; if( dynamicCast< PhysicsSolverManager const * >( &getParent() ) != nullptr ) @@ -1425,20 +1425,20 @@ R1Tensor const SolverBase::gravityVector() const return rval; } -bool SolverBase::checkSequentialSolutionIncrements( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) const +bool PhysicsSolverBase::checkSequentialSolutionIncrements( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) const { // default behavior - assume converged return true; } -void SolverBase::saveSequentialIterationState( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +void PhysicsSolverBase::saveSequentialIterationState( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { // up to specific solver to save what is needed - GEOS_ERROR( "Call to SolverBase::saveSequentialIterationState. Method should be overloaded by the solver" ); + GEOS_ERROR( "Call to PhysicsSolverBase::saveSequentialIterationState. Method should be overloaded by the solver" ); } #if defined(GEOS_USE_PYGEOSX) -PyTypeObject * SolverBase::getPythonType() const +PyTypeObject * PhysicsSolverBase::getPythonType() const { return python::getPySolverType(); } #endif diff --git a/src/coreComponents/physicsSolvers/SolverBase.hpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.hpp similarity index 96% rename from src/coreComponents/physicsSolvers/SolverBase.hpp rename to src/coreComponents/physicsSolvers/PhysicsSolverBase.hpp index 98bd390ef9c..c6b8866343a 100644 --- a/src/coreComponents/physicsSolvers/SolverBase.hpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.hpp @@ -14,11 +14,11 @@ */ /** - * @file SolverBase.hpp + * @file PhysicsSolverBase.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_SOLVERBASE_HPP_ -#define GEOS_PHYSICSSOLVERS_SOLVERBASE_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_PHYSICSSOLVERBASE_HPP_ +#define GEOS_PHYSICSSOLVERS_PHYSICSSOLVERBASE_HPP_ #include "codingUtilities/traits.hpp" #include "common/DataTypes.hpp" @@ -40,54 +40,54 @@ namespace geos class DomainPartition; /** - * @class SolverBase + * @class PhysicsSolverBase * @brief Base class for all physics solvers * * This class provides the base interface for all physics solvers. It provides the basic * functionality for setting up and solving a linear system, as well as the interface for * performing a timestep. */ -class SolverBase : public ExecutableGroup +class PhysicsSolverBase : public ExecutableGroup { public: /** - * @brief Constructor for SolverBase - * @param name the name of this instantiation of SolverBase - * @param parent the parent group of this instantiation of SolverBase + * @brief Constructor for PhysicsSolverBase + * @param name the name of this instantiation of PhysicsSolverBase + * @param parent the parent group of this instantiation of PhysicsSolverBase */ - explicit SolverBase( string const & name, - Group * const parent ); + explicit PhysicsSolverBase( string const & name, + Group * const parent ); /** - * @brief Move constructor for SolverBase + * @brief Move constructor for PhysicsSolverBase */ - SolverBase( SolverBase && ) = default; + PhysicsSolverBase( PhysicsSolverBase && ) = default; /** - * @brief Destructor for SolverBase + * @brief Destructor for PhysicsSolverBase */ - virtual ~SolverBase() override; + virtual ~PhysicsSolverBase() override; /** * @brief Deleted constructor */ - SolverBase() = delete; + PhysicsSolverBase() = delete; /** * @brief Deleted copy constructor */ - SolverBase( SolverBase const & ) = delete; + PhysicsSolverBase( PhysicsSolverBase const & ) = delete; /** * @brief Deleted copy assignment operator */ - SolverBase & operator=( SolverBase const & ) = delete; + PhysicsSolverBase & operator=( PhysicsSolverBase const & ) = delete; /** * @brief Deleted move assignment operator */ - SolverBase & operator=( SolverBase && ) = delete; + PhysicsSolverBase & operator=( PhysicsSolverBase && ) = delete; /** * @return Get the final class Catalog name @@ -658,7 +658,7 @@ class SolverBase : public ExecutableGroup {return m_nextDt;}; /** - * @brief creates a child group of of this SolverBase instantiation + * @brief creates a child group of of this PhysicsSolverBase instantiation * @param childKey the key of the child type * @param childName the name of the child * @return a pointer to the child group @@ -668,10 +668,10 @@ class SolverBase : public ExecutableGroup /** * @brief Type alias for catalog interface used by this class. See CatalogInterface. */ - using CatalogInterface = dataRepository::CatalogInterface< SolverBase, string const &, Group * const >; + using CatalogInterface = dataRepository::CatalogInterface< PhysicsSolverBase, string const &, Group * const >; /** - * @brief Get the singleton catalog for SolverBase. + * @brief Get the singleton catalog for PhysicsSolverBase. * @return reference to the catalog object */ static CatalogInterface::CatalogType & getCatalog(); @@ -1101,7 +1101,7 @@ class SolverBase : public ExecutableGroup }; template< typename CONSTITUTIVE_BASE_TYPE > -string SolverBase::getConstitutiveName( ElementSubRegionBase const & subRegion ) +string PhysicsSolverBase::getConstitutiveName( ElementSubRegionBase const & subRegion ) { string validName; dataRepository::Group const & constitutiveModels = subRegion.getConstitutiveModels(); @@ -1115,7 +1115,7 @@ string SolverBase::getConstitutiveName( ElementSubRegionBase const & subRegion ) } template< typename CONSTITUTIVE_BASE_TYPE > -string SolverBase::getConstitutiveName( ParticleSubRegionBase const & subRegion ) // particle overload +string PhysicsSolverBase::getConstitutiveName( ParticleSubRegionBase const & subRegion ) // particle overload { string validName; dataRepository::Group const & constitutiveModels = subRegion.getConstitutiveModels(); @@ -1132,4 +1132,4 @@ string SolverBase::getConstitutiveName( ParticleSubRegionBase const & subRegion } // namespace geos -#endif /* GEOS_PHYSICSSOLVERS_SOLVERBASE_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_PHYSICSSOLVERBASE_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp b/src/coreComponents/physicsSolvers/PhysicsSolverBaseKernels.hpp similarity index 98% rename from src/coreComponents/physicsSolvers/SolverBaseKernels.hpp rename to src/coreComponents/physicsSolvers/PhysicsSolverBaseKernels.hpp index 6f48675d698..d8583904996 100644 --- a/src/coreComponents/physicsSolvers/SolverBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBaseKernels.hpp @@ -14,7 +14,7 @@ */ /** - * @file SolverBaseKernels.hpp + * @file PhysicsSolverBaseKernels.hpp */ #ifndef GEOS_PHYSICSSOLVERS_SOLVERBASEKERNELS_HPP @@ -27,7 +27,7 @@ namespace geos { -namespace solverBaseKernels +namespace physicsSolverBaseKernels { /******************************** ResidualNormKernelBase ********************************/ @@ -342,7 +342,7 @@ ENUM_STRINGS( NormType, "L2" ); -} // namespace solverBaseKernels +} // namespace physicsSolverBaseKernels } // namespace geos diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp index 6820cffbe84..5c199154f30 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp @@ -19,7 +19,7 @@ #include "PhysicsSolverManager.hpp" -#include "SolverBase.hpp" +#include "PhysicsSolverBase.hpp" namespace geos { @@ -47,11 +47,11 @@ PhysicsSolverManager::~PhysicsSolverManager() Group * PhysicsSolverManager::createChild( string const & childKey, string const & childName ) { Group * rval = nullptr; - if( SolverBase::CatalogInterface::hasKeyName( childKey ) ) + if( PhysicsSolverBase::CatalogInterface::hasKeyName( childKey ) ) { GEOS_LOG_RANK_0( "Adding Solver of type " << childKey << ", named " << childName ); rval = ®isterGroup( childName, - SolverBase::CatalogInterface::factory( childKey, childName, this ) ); + PhysicsSolverBase::CatalogInterface::factory( childKey, childName, this ) ); } return rval; } @@ -59,8 +59,8 @@ Group * PhysicsSolverManager::createChild( string const & childKey, string const void PhysicsSolverManager::expandObjectCatalogs() { - // During schema generation, register one of each type derived from SolverBase here - for( auto & catalogIter: SolverBase::getCatalog()) + // During schema generation, register one of each type derived from PhysicsSolverBase here + for( auto & catalogIter: PhysicsSolverBase::getCatalog()) { createChild( catalogIter.first, catalogIter.first ); } diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp b/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp index ed1234b5d35..6c4e66c3127 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp @@ -25,7 +25,6 @@ class xml_node; namespace geos { -class SolverBase; class PhysicsSolverManager : public dataRepository::Group { diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index 11d40de0558..63210cb686c 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -245,7 +245,7 @@ void ContactSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & su setSizedFromParent( 0 ); string & frictionLawName = subRegion.getReference< string >( viewKeyStruct::frictionLawNameString() ); - frictionLawName = SolverBase::getConstitutiveName< FrictionBase >( subRegion ); + frictionLawName = PhysicsSolverBase::getConstitutiveName< FrictionBase >( subRegion ); GEOS_ERROR_IF( frictionLawName.empty(), GEOS_FMT( "{}: FrictionBase model not found on subregion {}", getDataContext(), subRegion.getDataContext() ) ); } diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp index c9e13392126..6ace1301164 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -1719,5 +1719,5 @@ void SolidMechanicsAugmentedLagrangianContact::computeTolerances( DomainPartitio } ); } -REGISTER_CATALOG_ENTRY( SolverBase, SolidMechanicsAugmentedLagrangianContact, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SolidMechanicsAugmentedLagrangianContact, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp index 54ffa40bab7..c9f517d7403 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp @@ -43,7 +43,7 @@ class SolidMechanicsAugmentedLagrangianContact : public ContactSolverBase return "SolidMechanicsAugmentedLagrangianContact"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index 90f33a650e0..0beb4428f2b 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -812,5 +812,5 @@ bool SolidMechanicsEmbeddedFractures::updateConfiguration( DomainPartition & dom return hasConfigurationConvergedGlobally; } -REGISTER_CATALOG_ENTRY( SolverBase, SolidMechanicsEmbeddedFractures, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SolidMechanicsEmbeddedFractures, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index 669d9ce541b..d9c0e113851 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -43,7 +43,7 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase return "SolidMechanicsEmbeddedFractures"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index bdb83a14ed6..08d5fec172e 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -187,7 +187,7 @@ void SolidMechanicsLagrangeContact::setupSystem( DomainPartition & domain, } // setup monolithic coupled system - SolverBase::setupSystem( domain, dofManager, localMatrix, rhs, solution, true ); // "true" is to force setSparsity + PhysicsSolverBase::setupSystem( domain, dofManager, localMatrix, rhs, solution, true ); // "true" is to force setSparsity if( !m_precond && m_linearSolverParameters.get().solverType != LinearSolverParameters::SolverType::direct ) { @@ -2363,6 +2363,6 @@ real64 SolidMechanicsLagrangeContact::setNextDt( real64 const & currentDt, return currentDt; } -REGISTER_CATALOG_ENTRY( SolverBase, SolidMechanicsLagrangeContact, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SolidMechanicsLagrangeContact, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index 1e7483cd6c3..bfb2b7656b0 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -46,7 +46,7 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase return "SolidMechanicsLagrangeContact"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp index b635abb1b52..167c23fd1b9 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp @@ -58,7 +58,7 @@ void SolidMechanicsPenaltyContact::setupSystem( DomainPartition & domain, bool const setSparsity ) { GEOS_MARK_FUNCTION; - SolverBase::setupSystem( domain, dofManager, localMatrix, rhs, solution, false ); + PhysicsSolverBase::setupSystem( domain, dofManager, localMatrix, rhs, solution, false ); SparsityPattern< globalIndex > sparsityPattern( dofManager.numLocalDofs(), dofManager.numGlobalDofs(), @@ -230,6 +230,6 @@ void SolidMechanicsPenaltyContact::assembleContact( DomainPartition & domain, } -REGISTER_CATALOG_ENTRY( SolverBase, SolidMechanicsPenaltyContact, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SolidMechanicsPenaltyContact, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp index d368fc15ebc..231d0b9159d 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp @@ -47,7 +47,7 @@ class SolidMechanicsPenaltyContact : public ContactSolverBase return "SolidMechanicsPenaltyContact"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index d863e690cc4..8352cf9df02 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -2630,7 +2630,7 @@ real64 CompositionalMultiphaseBase::setNextDt( const geos::real64 & currentDt, g { if( m_targetFlowCFL < 0 ) - return SolverBase::setNextDt( currentDt, domain ); + return PhysicsSolverBase::setNextDt( currentDt, domain ); else return setNextDtBasedOnCFL( currentDt, domain ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 3f850dcd1a5..6cc16ac80d2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -336,7 +336,7 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN localResidualNorm.resize( numNorm ); localResidualNormalizer.resize( numNorm ); - solverBaseKernels::NormType const normType = getNonlinearSolverParameters().normType(); + physicsSolverBaseKernels::NormType const normType = getNonlinearSolverParameters().normType(); globalIndex const rankOffset = dofManager.rankOffset(); string const dofKey = dofManager.getKey( viewKeyStruct::elemDofFieldString() ); @@ -408,14 +408,14 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN // step 2: first reduction across meshBodies/regions/subRegions - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { - solverBaseKernels::LinfResidualNormHelper:: + physicsSolverBaseKernels::LinfResidualNormHelper:: updateLocalNorm< numNorm >( subRegionResidualNorm, localResidualNorm ); } else { - solverBaseKernels::L2ResidualNormHelper:: + physicsSolverBaseKernels::L2ResidualNormHelper:: updateLocalNorm< numNorm >( subRegionResidualNorm, subRegionResidualNormalizer, localResidualNorm, localResidualNormalizer ); } } ); @@ -428,14 +428,14 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN { array1d< real64 > globalResidualNorm; globalResidualNorm.resize( numNorm ); - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { - solverBaseKernels::LinfResidualNormHelper:: + physicsSolverBaseKernels::LinfResidualNormHelper:: computeGlobalNorm( localResidualNorm, globalResidualNorm ); } else { - solverBaseKernels::L2ResidualNormHelper:: + physicsSolverBaseKernels::L2ResidualNormHelper:: computeGlobalNorm( localResidualNorm, localResidualNormalizer, globalResidualNorm ); } residualNorm = sqrt( globalResidualNorm[0] * globalResidualNorm[0] + globalResidualNorm[1] * globalResidualNorm[1] + globalResidualNorm[2] * globalResidualNorm[2] ); @@ -447,14 +447,14 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN { array1d< real64 > globalResidualNorm; globalResidualNorm.resize( numNorm - 1 ); - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { - solverBaseKernels::LinfResidualNormHelper:: + physicsSolverBaseKernels::LinfResidualNormHelper:: computeGlobalNorm( localResidualNorm, globalResidualNorm ); } else { - solverBaseKernels::L2ResidualNormHelper:: + physicsSolverBaseKernels::L2ResidualNormHelper:: computeGlobalNorm( localResidualNorm, localResidualNormalizer, globalResidualNorm ); } residualNorm = sqrt( globalResidualNorm[0] * globalResidualNorm[0] + globalResidualNorm[1] * globalResidualNorm[1] ); @@ -1156,6 +1156,6 @@ void CompositionalMultiphaseFVM::applyAquiferBC( real64 const time, } //START_SPHINX_INCLUDE_01 -REGISTER_CATALOG_ENTRY( SolverBase, CompositionalMultiphaseFVM, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, CompositionalMultiphaseFVM, string const &, Group * const ) //END_SPHINX_INCLUDE_01 }// namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp index 93b54d898a7..88249873115 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp @@ -73,7 +73,7 @@ class CompositionalMultiphaseFVM : public CompositionalMultiphaseBase */ static string catalogName() { return "CompositionalMultiphaseFVM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } //END_SPHINX_INCLUDE_01 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index 70f9ba9ae8b..de26c964a42 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -607,7 +607,7 @@ real64 CompositionalMultiphaseHybridFVM::calculateResidualNorm( real64 const & G real64 localResidualNorm = 0.0; real64 localResidualNormalizer = 0.0; - solverBaseKernels::NormType const normType = getNonlinearSolverParameters().normType(); + physicsSolverBaseKernels::NormType const normType = getNonlinearSolverParameters().normType(); // local residual globalIndex const rankOffset = dofManager.rankOffset(); @@ -657,7 +657,7 @@ real64 CompositionalMultiphaseHybridFVM::calculateResidualNorm( real64 const & G // step 1.2: reduction across meshBodies/regions/subRegions - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { // take max between mass and volume residual subRegionResidualNorm[0] = LvArray::math::max( subRegionResidualNorm[0], subRegionResidualNorm[1] ); @@ -699,7 +699,7 @@ real64 CompositionalMultiphaseHybridFVM::calculateResidualNorm( real64 const & G // step 2.2: reduction across meshBodies/regions/subRegions - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { if( faceResidualNorm[0] > localResidualNorm ) { @@ -716,13 +716,13 @@ real64 CompositionalMultiphaseHybridFVM::calculateResidualNorm( real64 const & G // step 3: second reduction across MPI ranks real64 residualNorm = 0.0; - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { - solverBaseKernels::LinfResidualNormHelper::computeGlobalNorm( localResidualNorm, residualNorm ); + physicsSolverBaseKernels::LinfResidualNormHelper::computeGlobalNorm( localResidualNorm, residualNorm ); } else { - solverBaseKernels::L2ResidualNormHelper::computeGlobalNorm( localResidualNorm, localResidualNormalizer, residualNorm ); + physicsSolverBaseKernels::L2ResidualNormHelper::computeGlobalNorm( localResidualNorm, localResidualNormalizer, residualNorm ); } if( getLogLevel() >= 1 && logger::internal::rank == 0 ) @@ -835,5 +835,5 @@ void CompositionalMultiphaseHybridFVM::updatePhaseMobility( ObjectManagerBase & relperm ); } -REGISTER_CATALOG_ENTRY( SolverBase, CompositionalMultiphaseHybridFVM, std::string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, CompositionalMultiphaseHybridFVM, std::string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp index 5562f6202c9..45bea1e810e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp @@ -69,7 +69,7 @@ class CompositionalMultiphaseHybridFVM : public CompositionalMultiphaseBase */ static string catalogName() { return "CompositionalMultiphaseHybridFVM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp index 6953bfb7be2..76c203e1087 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp @@ -840,11 +840,11 @@ class PhaseMobilityKernelFactory /** * @class ResidualNormKernel */ -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 1 > { public: - using Base = solverBaseKernels::ResidualNormKernelBase< 1 >; + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 1 >; using Base::m_minNormalizer; using Base::m_rankOffset; using Base::m_localResidual; @@ -1001,7 +1001,7 @@ class ResidualNormKernelFactory */ template< typename POLICY > static void - createAndLaunch( solverBaseKernels::NormType const normType, + createAndLaunch( physicsSolverBaseKernels::NormType const normType, globalIndex const rankOffset, string const & dofKey, arrayView1d< real64 const > const & localResidual, @@ -1024,7 +1024,7 @@ class ResidualNormKernelFactory ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, regionFilter, faceManager, flowAccessors, fluidAccessors, poroAccessors, dt, minNormalizer ); - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { ResidualNormKernel::launchLinf< POLICY >( faceManager.size(), kernel, residualNorm ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 041b30899e8..febda3b3305 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -88,7 +88,7 @@ void updatePorosityAndPermeabilityFromPressureAndAperture( POROUSWRAPPER_TYPE po FlowSolverBase::FlowSolverBase( string const & name, Group * const parent ): - SolverBase( name, parent ), + PhysicsSolverBase( name, parent ), m_numDofPerCell( 0 ), m_isThermal( 0 ), m_keepFlowVariablesConstantDuringInitStep( 0 ), @@ -125,12 +125,12 @@ FlowSolverBase::FlowSolverBase( string const & name, setDescription( "Maximum (absolute) temperature change in a sequential iteration, used for outer loop convergence check" ); // allow the user to select a norm - getNonlinearSolverParameters().getWrapper< solverBaseKernels::NormType >( NonlinearSolverParameters::viewKeysStruct::normTypeString() ).setInputFlag( InputFlags::OPTIONAL ); + getNonlinearSolverParameters().getWrapper< physicsSolverBaseKernels::NormType >( NonlinearSolverParameters::viewKeysStruct::normTypeString() ).setInputFlag( InputFlags::OPTIONAL ); } void FlowSolverBase::registerDataOnMesh( Group & meshBodies ) { - SolverBase::registerDataOnMesh( meshBodies ); + PhysicsSolverBase::registerDataOnMesh( meshBodies ); forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, MeshLevel & mesh, @@ -298,7 +298,7 @@ void FlowSolverBase::enableJumpStabilization() void FlowSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const { - SolverBase::setConstitutiveNamesCallSuper( subRegion ); + PhysicsSolverBase::setConstitutiveNamesCallSuper( subRegion ); subRegion.registerWrapper< string >( viewKeyStruct::fluidNamesString() ). setPlotLevel( PlotLevel::NOPLOT ). @@ -349,7 +349,7 @@ void FlowSolverBase::setConstitutiveNames( ElementSubRegionBase & subRegion ) co void FlowSolverBase::initializePreSubGroups() { - SolverBase::initializePreSubGroups(); + PhysicsSolverBase::initializePreSubGroups(); DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); @@ -446,7 +446,7 @@ void FlowSolverBase::validatePoreVolumes( DomainPartition const & domain ) const void FlowSolverBase::initializePostInitialConditionsPreSubGroups() { - SolverBase::initializePostInitialConditionsPreSubGroups(); + PhysicsSolverBase::initializePostInitialConditionsPreSubGroups(); DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index 883661f25a0..16d08c7e91f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FINITEVOLUME_FLOWSOLVERBASE_HPP_ #define GEOS_PHYSICSSOLVERS_FINITEVOLUME_FLOWSOLVERBASE_HPP_ -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "common/Units.hpp" namespace geos @@ -32,7 +32,7 @@ namespace geos * Base class for finite volume fluid flow solvers. * Provides some common features */ -class FlowSolverBase : public SolverBase +class FlowSolverBase : public PhysicsSolverBase { public: @@ -65,7 +65,7 @@ class FlowSolverBase : public SolverBase virtual void registerDataOnMesh( Group & MeshBodies ) override; - struct viewKeyStruct : SolverBase::viewKeyStruct + struct viewKeyStruct : PhysicsSolverBase::viewKeyStruct { // misc inputs static constexpr char const * fluidNamesString() { return "fluidNames"; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp index a7541e66e4f..3af97cde06b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp @@ -32,7 +32,7 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" -#include "physicsSolvers/SolverBaseKernels.hpp" +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" #include "physicsSolvers/KernelLaunchSelectors.hpp" @@ -1786,11 +1786,11 @@ class SolutionCheckKernelFactory /** * @class ResidualNormKernel */ -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 2 > { public: - using Base = solverBaseKernels::ResidualNormKernelBase< 2 >; + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 2 >; using Base::m_minNormalizer; using Base::m_rankOffset; using Base::m_localResidual; @@ -1908,7 +1908,7 @@ class ResidualNormKernelFactory */ template< typename POLICY > static void - createAndLaunch( solverBaseKernels::NormType const normType, + createAndLaunch( physicsSolverBaseKernels::NormType const normType, integer const numComps, globalIndex const rankOffset, string const dofKey, @@ -1924,7 +1924,7 @@ class ResidualNormKernelFactory arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, numComps, subRegion, fluid, solid, minNormalizer ); - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index 4e7e14b7ac0..e7fdcab4e33 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -189,7 +189,7 @@ void ReactiveCompositionalMultiphaseOBL::implicitStepComplete( real64 const & ti void ReactiveCompositionalMultiphaseOBL::postInputInitialization() { // need to override to skip the check for fluidModel, which is enabled in FlowSolverBase - SolverBase::postInputInitialization(); + PhysicsSolverBase::postInputInitialization(); GEOS_THROW_IF_GT_MSG( m_maxCompFracChange, 1.0, GEOS_FMT( "{}: The maximum absolute change in component fraction is set to {}, while it must not be greater than 1.0", @@ -1365,6 +1365,6 @@ void ReactiveCompositionalMultiphaseOBL::updateState( DomainPartition & domain ) //START_SPHINX_INCLUDE_01 -REGISTER_CATALOG_ENTRY( SolverBase, ReactiveCompositionalMultiphaseOBL, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, ReactiveCompositionalMultiphaseOBL, string const &, Group * const ) //END_SPHINX_INCLUDE_01 }// namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp index 8e12090e9aa..5f615600d9f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp @@ -91,7 +91,7 @@ class ReactiveCompositionalMultiphaseOBL : public FlowSolverBase */ static string catalogName() { return "ReactiveCompositionalMultiphaseOBL"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp index ddbf08c4080..2141e538b27 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp @@ -27,7 +27,7 @@ #include "finiteVolume/FluxApproximationBase.hpp" #include "linearAlgebra/interfaces/InterfaceTypes.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/SolverBaseKernels.hpp" +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" namespace geos { @@ -452,11 +452,11 @@ class ElementBasedAssemblyKernelFactory /** * @class ResidualNormKernel */ -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 1 > { public: - using Base = solverBaseKernels::ResidualNormKernelBase< 1 >; + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 1 >; using Base::m_minNormalizer; using Base::m_rankOffset; using Base::m_localResidual; @@ -527,7 +527,7 @@ class ResidualNormKernelFactory */ template< typename POLICY > static void - createAndLaunch( solverBaseKernels::NormType const normType, + createAndLaunch( physicsSolverBaseKernels::NormType const normType, globalIndex const rankOffset, string const dofKey, arrayView1d< real64 const > const & localResidual, @@ -540,7 +540,7 @@ class ResidualNormKernelFactory arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, subRegion, minNormalizer ); - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index c5f10cd5f7f..c8d92164d2d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -133,7 +133,7 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED localResidualNorm.resize( numNorm ); localResidualNormalizer.resize( numNorm ); - solverBaseKernels::NormType const normType = BASE::getNonlinearSolverParameters().normType(); + physicsSolverBaseKernels::NormType const normType = BASE::getNonlinearSolverParameters().normType(); globalIndex const rankOffset = dofManager.rankOffset(); string const dofKey = dofManager.getKey( BASE::viewKeyStruct::elemDofFieldString() ); @@ -150,17 +150,17 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED real64 subRegionResidualNormalizer[numNorm]{}; string const & fluidName = subRegion.template getReference< string >( BASE::viewKeyStruct::fluidNamesString() ); - SingleFluidBase const & fluid = SolverBase::getConstitutiveModel< SingleFluidBase >( subRegion, fluidName ); + SingleFluidBase const & fluid = PhysicsSolverBase::getConstitutiveModel< SingleFluidBase >( subRegion, fluidName ); // step 1: compute the norm in the subRegion if( m_isThermal ) { string const & solidName = subRegion.template getReference< string >( BASE::viewKeyStruct::solidNamesString() ); - CoupledSolidBase const & solid = SolverBase::getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); + CoupledSolidBase const & solid = PhysicsSolverBase::getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); string const & solidInternalEnergyName = subRegion.template getReference< string >( BASE::viewKeyStruct::solidInternalEnergyNamesString() ); - SolidInternalEnergy const & solidInternalEnergy = SolverBase::getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); + SolidInternalEnergy const & solidInternalEnergy = PhysicsSolverBase::getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); thermalSinglePhaseBaseKernels:: ResidualNormKernelFactory:: @@ -196,14 +196,14 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED // step 2: first reduction across meshBodies/regions/subRegions - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { - solverBaseKernels::LinfResidualNormHelper:: + physicsSolverBaseKernels::LinfResidualNormHelper:: updateLocalNorm< numNorm >( subRegionResidualNorm, localResidualNorm ); } else { - solverBaseKernels::L2ResidualNormHelper:: + physicsSolverBaseKernels::L2ResidualNormHelper:: updateLocalNorm< numNorm >( subRegionResidualNorm, subRegionResidualNormalizer, localResidualNorm, localResidualNormalizer ); } } ); @@ -216,14 +216,14 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED { array1d< real64 > globalResidualNorm; globalResidualNorm.resize( numNorm ); - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { - solverBaseKernels::LinfResidualNormHelper:: + physicsSolverBaseKernels::LinfResidualNormHelper:: computeGlobalNorm( localResidualNorm, globalResidualNorm ); } else { - solverBaseKernels::L2ResidualNormHelper:: + physicsSolverBaseKernels::L2ResidualNormHelper:: computeGlobalNorm( localResidualNorm, localResidualNormalizer, globalResidualNorm ); } residualNorm = sqrt( globalResidualNorm[0] * globalResidualNorm[0] + globalResidualNorm[1] * globalResidualNorm[1] ); @@ -234,13 +234,13 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED else { - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { - solverBaseKernels::LinfResidualNormHelper::computeGlobalNorm( localResidualNorm[0], residualNorm ); + physicsSolverBaseKernels::LinfResidualNormHelper::computeGlobalNorm( localResidualNorm[0], residualNorm ); } else { - solverBaseKernels::L2ResidualNormHelper::computeGlobalNorm( localResidualNorm[0], localResidualNormalizer[0], residualNorm ); + physicsSolverBaseKernels::L2ResidualNormHelper::computeGlobalNorm( localResidualNorm[0], localResidualNormalizer[0], residualNorm ); } GEOS_LOG_LEVEL_INFO_RANK_0_NLR( logInfo::Convergence, @@ -950,8 +950,8 @@ void SinglePhaseFVM<>::applyAquiferBC( real64 const time, namespace { typedef SinglePhaseFVM< SinglePhaseProppantBase > SinglePhaseFVMProppant; -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseFVMProppant, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhaseFVMProppant, string const &, Group * const ) typedef SinglePhaseFVM<> SinglePhaseFVM; -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseFVM, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhaseFVM, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp index 882ae4c7e8b..b93ce7e6b33 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp @@ -44,7 +44,7 @@ class SinglePhaseFVM : public BASE // have to use this->member etc. using BASE::getLogLevel; - // Aliasing public/protected members/methods of SolverBase so we don't + // Aliasing public/protected members/methods of PhysicsSolverBase so we don't // have to use this->member etc. using BASE::forDiscretizationOnMeshTargets; using BASE::m_cflFactor; @@ -114,7 +114,7 @@ class SinglePhaseFVM : public BASE } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 6cbabf723f7..463e3107052 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -472,7 +472,7 @@ real64 SinglePhaseHybridFVM::calculateResidualNorm( real64 const & GEOS_UNUSED_P real64 localResidualNorm = 0.0; real64 localResidualNormalizer = 0.0; - solverBaseKernels::NormType const normType = getNonlinearSolverParameters().normType(); + physicsSolverBaseKernels::NormType const normType = getNonlinearSolverParameters().normType(); globalIndex const rankOffset = dofManager.rankOffset(); string const elemDofKey = dofManager.getKey( viewKeyStruct::elemDofFieldString() ); @@ -516,7 +516,7 @@ real64 SinglePhaseHybridFVM::calculateResidualNorm( real64 const & GEOS_UNUSED_P // step 1.2: reduction across meshBodies/regions/subRegions - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { if( subRegionResidualNorm[0] > localResidualNorm ) { @@ -558,7 +558,7 @@ real64 SinglePhaseHybridFVM::calculateResidualNorm( real64 const & GEOS_UNUSED_P // step 2.2: reduction across meshBodies/regions/subRegions - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { if( faceResidualNorm[0] > localResidualNorm ) { @@ -575,13 +575,13 @@ real64 SinglePhaseHybridFVM::calculateResidualNorm( real64 const & GEOS_UNUSED_P // step 3: second reduction across MPI ranks real64 residualNorm = 0.0; - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { - solverBaseKernels::LinfResidualNormHelper::computeGlobalNorm( localResidualNorm, residualNorm ); + physicsSolverBaseKernels::LinfResidualNormHelper::computeGlobalNorm( localResidualNorm, residualNorm ); } else { - solverBaseKernels::L2ResidualNormHelper::computeGlobalNorm( localResidualNorm, localResidualNormalizer, residualNorm ); + physicsSolverBaseKernels::L2ResidualNormHelper::computeGlobalNorm( localResidualNorm, localResidualNormalizer, residualNorm ); } if( getLogLevel() >= 1 && logger::internal::rank == 0 ) @@ -669,5 +669,5 @@ void SinglePhaseHybridFVM::updatePressureGradient( DomainPartition & domain ) } ); } -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseHybridFVM, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhaseHybridFVM, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp index 21c1bcaf09d..a1ae07fb5b5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp @@ -72,7 +72,7 @@ class SinglePhaseHybridFVM : public SinglePhaseBase static string catalogName() { return "SinglePhaseHybridFVM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp index 2d05cc82c43..70561588c2b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp @@ -39,7 +39,7 @@ #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/SolverBaseKernels.hpp" +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" namespace geos { @@ -747,11 +747,11 @@ class ElementBasedAssemblyKernelFactory /** * @class ResidualNormKernel */ -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 1 > { public: - using Base = solverBaseKernels::ResidualNormKernelBase< 1 >; + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 1 >; using Base::m_minNormalizer; using Base::m_rankOffset; using Base::m_localResidual; @@ -918,7 +918,7 @@ class ResidualNormKernelFactory */ template< typename POLICY > static void - createAndLaunch( solverBaseKernels::NormType const normType, + createAndLaunch( physicsSolverBaseKernels::NormType const normType, globalIndex const rankOffset, string const & dofKey, arrayView1d< real64 const > const & localResidual, @@ -942,7 +942,7 @@ class ResidualNormKernelFactory ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, regionFilter, faceManager, flowAccessors, fluidAccessors, poroAccessors, defaultViscosity, dt, minNormalizer ); - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { ResidualNormKernel::launchLinf< POLICY >( faceManager.size(), kernel, residualNorm ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp index 38d95f212e5..b366754090f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp @@ -66,7 +66,7 @@ SinglePhaseProppantBase::~SinglePhaseProppantBase() void SinglePhaseProppantBase::setConstitutiveNames( ElementSubRegionBase & subRegion ) const { string & fluidMaterialName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); - fluidMaterialName = SolverBase::getConstitutiveName< SlurryFluidBase >( subRegion ); + fluidMaterialName = PhysicsSolverBase::getConstitutiveName< SlurryFluidBase >( subRegion ); GEOS_ERROR_IF( fluidMaterialName.empty(), GEOS_FMT( "{}: Fluid model not found on subregion {}", getDataContext(), subRegion.getName() ) ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp index f4f5efc15a6..319e07ff5a1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -856,7 +856,7 @@ class SolutionCheckKernelFactory /** * @class ResidualNormKernel */ -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 3 > +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 3 > { public: @@ -1024,7 +1024,7 @@ class ResidualNormKernelFactory */ template< typename POLICY > static void - createAndLaunch( solverBaseKernels::NormType const normType, + createAndLaunch( physicsSolverBaseKernels::NormType const normType, integer const numComps, integer const numPhases, globalIndex const rankOffset, @@ -1043,7 +1043,7 @@ class ResidualNormKernelFactory ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, numComps, numPhases, subRegion, fluid, solid, solidInternalEnergy, minNormalizer ); - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp index d3d678d6239..81af9cf471e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp @@ -466,11 +466,11 @@ struct SolidInternalEnergyUpdateKernel /** * @class ResidualNormKernel */ -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 2 > { public: - using Base = solverBaseKernels::ResidualNormKernelBase< 2 >; + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 2 >; using Base::m_minNormalizer; using Base::m_rankOffset; using Base::m_localResidual; @@ -591,7 +591,7 @@ class ResidualNormKernelFactory */ template< typename POLICY > static void - createAndLaunch( solverBaseKernels::NormType const normType, + createAndLaunch( physicsSolverBaseKernels::NormType const normType, globalIndex const rankOffset, string const & dofKey, arrayView1d< real64 const > const & localResidual, @@ -607,7 +607,7 @@ class ResidualNormKernelFactory arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, subRegion, fluid, solid, solidInternalEnergy, minNormalizer ); - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp index 57ea2675a45..2d5b26f4f3d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp @@ -835,7 +835,7 @@ ProppantTransport::calculateResidualNorm( real64 const & GEOS_UNUSED_PARAM( time real64 localResidualNorm = 0.0; real64 localResidualNormalizer = 0.0; - solverBaseKernels::NormType const normType = getNonlinearSolverParameters().normType(); + physicsSolverBaseKernels::NormType const normType = getNonlinearSolverParameters().normType(); localIndex const rankOffset = dofManager.rankOffset(); string const dofKey = dofManager.getKey( fields::proppant::proppantConcentration::key() ); @@ -867,7 +867,7 @@ ProppantTransport::calculateResidualNorm( real64 const & GEOS_UNUSED_PARAM( time // step 2: first reduction across meshBodies/regions/subRegions - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { if( subRegionResidualNorm[0] > localResidualNorm ) { @@ -885,13 +885,13 @@ ProppantTransport::calculateResidualNorm( real64 const & GEOS_UNUSED_PARAM( time // step 3: second reduction across MPI ranks real64 residualNorm = 0.0; - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { - solverBaseKernels::LinfResidualNormHelper::computeGlobalNorm( localResidualNorm, residualNorm ); + physicsSolverBaseKernels::LinfResidualNormHelper::computeGlobalNorm( localResidualNorm, residualNorm ); } else { - solverBaseKernels::L2ResidualNormHelper::computeGlobalNorm( localResidualNorm, localResidualNormalizer, residualNorm ); + physicsSolverBaseKernels::L2ResidualNormHelper::computeGlobalNorm( localResidualNorm, localResidualNormalizer, residualNorm ); } if( getLogLevel() >= 1 && logger::internal::rank == 0 ) @@ -1141,5 +1141,5 @@ void ProppantTransport::updateProppantPackVolume( real64 const GEOS_UNUSED_PARAM } -REGISTER_CATALOG_ENTRY( SolverBase, ProppantTransport, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, ProppantTransport, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp index dc352b9cef0..269926e83d2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp @@ -82,7 +82,7 @@ class ProppantTransport : public FlowSolverBase */ static string catalogName() { return "ProppantTransport"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp index 35baef938f0..89fcbef5c9c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp @@ -33,7 +33,7 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/SolverBaseKernels.hpp" +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" namespace geos { @@ -459,11 +459,11 @@ struct ProppantPackVolumeKernel /** * @class ResidualNormKernel */ -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 1 > { public: - using Base = solverBaseKernels::ResidualNormKernelBase< 1 >; + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 1 >; using Base::m_minNormalizer; using Base::m_rankOffset; using Base::m_localResidual; @@ -543,7 +543,7 @@ class ResidualNormKernelFactory */ template< typename POLICY > static void - createAndLaunch( solverBaseKernels::NormType const normType, + createAndLaunch( physicsSolverBaseKernels::NormType const normType, integer const numComp, globalIndex const rankOffset, string const & dofKey, @@ -558,7 +558,7 @@ class ResidualNormKernelFactory ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, numComp, subRegion, minNormalizer ); - if( normType == solverBaseKernels::NormType::Linf ) + if( normType == physicsSolverBaseKernels::NormType::Linf ) { ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 08815b83e92..a8497caee6a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -2239,5 +2239,5 @@ void CompositionalMultiphaseWell::printRates( real64 const & time_n, } ); } -REGISTER_CATALOG_ENTRY( SolverBase, CompositionalMultiphaseWell, string const &, Group * const ) -} // namespace geos +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, CompositionalMultiphaseWell, string const &, Group * const ) +} // namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp index c996896734c..25bec02179c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -75,7 +75,7 @@ class CompositionalMultiphaseWell : public WellSolverBase */ static string catalogName() { return "CompositionalMultiphaseWell"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp index 220df6a5abc..c49d68e836d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp @@ -483,11 +483,11 @@ class TotalMassDensityKernelFactory /** * @class ResidualNormKernel */ -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 1 > { public: - using Base = solverBaseKernels::ResidualNormKernelBase< 1 >; + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 1 >; using Base::m_minNormalizer; using Base::m_rankOffset; using Base::m_localResidual; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index 0c8fac303ba..2d33e7ca6e5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -1098,5 +1098,5 @@ void SinglePhaseWell::printRates( real64 const & time_n, } ); } -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseWell, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhaseWell, string const &, Group * const ) }// namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp index bd95ac6d2d4..8de8d0479fd 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp @@ -82,7 +82,7 @@ class SinglePhaseWell : public WellSolverBase */ static string catalogName() { return "SinglePhaseWell"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp index 4c4a249aa82..91590ed1d6b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp @@ -28,7 +28,7 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" -#include "physicsSolvers/SolverBaseKernels.hpp" +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" namespace geos { @@ -310,11 +310,11 @@ struct RateInitializationKernel /** * @class ResidualNormKernel */ -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 1 > +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 1 > { public: - using Base = solverBaseKernels::ResidualNormKernelBase< 1 >; + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 1 >; using Base::m_minNormalizer; using Base::m_rankOffset; using Base::m_localResidual; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp index 280dc6c0959..dd2f72d1b6e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp @@ -20,7 +20,7 @@ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_THERMALCOMPOSITIONALMULTIPHASEWELLKERNELS_HPP #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" -#include "physicsSolvers/SolverBaseKernels.hpp" +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" namespace geos { @@ -139,7 +139,7 @@ class TotalMassDensityKernelFactory * @class ResidualNormKernel */ template< localIndex NUM_COMP > -class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 2 > { public: @@ -149,7 +149,7 @@ class ResidualNormKernel : public solverBaseKernels::ResidualNormKernelBase< 2 > using WJ_ROFFSET = compositionalMultiphaseWellKernels::RowOffset_WellJac< NUM_COMP, 1 >; - using Base = solverBaseKernels::ResidualNormKernelBase< 2 >; + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 2 >; using Base::m_minNormalizer; using Base::m_rankOffset; using Base::m_localResidual; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalSinglePhaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalSinglePhaseWellKernels.hpp index c55a1f2991e..cbd0ae0b423 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalSinglePhaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalSinglePhaseWellKernels.hpp @@ -27,7 +27,7 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" -#include "physicsSolvers/SolverBaseKernels.hpp" +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index b87c37c7dd3..51b3e2f12b6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -39,7 +39,7 @@ using namespace constitutive; WellSolverBase::WellSolverBase( string const & name, Group * const parent ) - : SolverBase( name, parent ), + : PhysicsSolverBase( name, parent ), m_numPhases( 0 ), m_numComponents( 0 ), m_numDofPerWellElement( 0 ), @@ -74,7 +74,7 @@ Group *WellSolverBase::createChild( string const & childKey, string const & chil } else { - SolverBase::createChild( childKey, childName ); + PhysicsSolverBase::createChild( childKey, childName ); } return rval; } @@ -88,7 +88,7 @@ WellSolverBase::~WellSolverBase() = default; void WellSolverBase::postInputInitialization() { - SolverBase::postInputInitialization(); + PhysicsSolverBase::postInputInitialization(); // 1. Set key dimensions of the problem m_numDofPerWellElement = m_isThermal ? m_numComponents + 2 : m_numComponents + 1; // 1 pressure connectionRate + temp if thermal @@ -109,7 +109,7 @@ void WellSolverBase::postInputInitialization() void WellSolverBase::registerDataOnMesh( Group & meshBodies ) { - SolverBase::registerDataOnMesh( meshBodies ); + PhysicsSolverBase::registerDataOnMesh( meshBodies ); // loop over the wells forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, @@ -163,8 +163,11 @@ void WellSolverBase::initializePostSubGroups() void WellSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const { - SolverBase::setConstitutiveNamesCallSuper( subRegion ); - subRegion.registerWrapper< string >( viewKeyStruct::fluidNamesString()).setPlotLevel( PlotLevel::NOPLOT ).setRestartFlags( RestartFlags::NO_WRITE ).setSizedFromParent( 0 ); + PhysicsSolverBase::setConstitutiveNamesCallSuper( subRegion ); + subRegion.registerWrapper< string >( viewKeyStruct::fluidNamesString() ). + setPlotLevel( PlotLevel::NOPLOT ). + setRestartFlags( RestartFlags::NO_WRITE ). + setSizedFromParent( 0 ); } void WellSolverBase::setupDofs( DomainPartition const & domain, @@ -308,7 +311,7 @@ void WellSolverBase::assembleSystem( real64 const time, void WellSolverBase::initializePostInitialConditionsPreSubGroups() { - SolverBase::initializePostInitialConditionsPreSubGroups(); + PhysicsSolverBase::initializePostInitialConditionsPreSubGroups(); DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp index 628db6681cf..63743f65dfb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_WELLSOLVERBASE_HPP_ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_WELLSOLVERBASE_HPP_ -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" namespace geos { @@ -35,7 +35,7 @@ class WellElementSubRegion; * Base class for well solvers. * Provides some common features */ -class WellSolverBase : public SolverBase +class WellSolverBase : public PhysicsSolverBase { public: @@ -287,7 +287,7 @@ class WellSolverBase : public SolverBase real64 const & dt, DomainPartition & domain ) = 0; - struct viewKeyStruct : SolverBase::viewKeyStruct + struct viewKeyStruct : PhysicsSolverBase::viewKeyStruct { static constexpr char const * fluidNamesString() { return "fluidNames"; } static constexpr char const * isThermalString() { return "isThermal"; } diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp index c35871c173b..3552e9eb91f 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp @@ -35,7 +35,7 @@ using namespace constitutive; SeismicityRate::SeismicityRate( const string & name, Group * const parent ): - SolverBase( name, parent ), + PhysicsSolverBase( name, parent ), m_stressSolver( nullptr ) { this->registerWrapper( viewKeyStruct::directEffectString(), &m_directEffect ). @@ -79,10 +79,10 @@ void SeismicityRate::postInputInitialization() // Initialize member stress solver as specified in XML input if( !m_stressSolverName.empty() ) { - m_stressSolver = &this->getParent().getGroup< SolverBase >( m_stressSolverName ); + m_stressSolver = &this->getParent().getGroup< PhysicsSolverBase >( m_stressSolverName ); } - SolverBase::postInputInitialization(); + PhysicsSolverBase::postInputInitialization(); } SeismicityRate::~SeismicityRate() @@ -92,7 +92,7 @@ SeismicityRate::~SeismicityRate() void SeismicityRate::registerDataOnMesh( Group & meshBodies ) { - SolverBase::registerDataOnMesh( meshBodies ); + PhysicsSolverBase::registerDataOnMesh( meshBodies ); forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, MeshLevel & mesh, @@ -412,5 +412,5 @@ void SeismicityRate::integralSolverStep( real64 const & time_n, } } -REGISTER_CATALOG_ENTRY( SolverBase, SeismicityRate, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SeismicityRate, string const &, dataRepository::Group * const ) } // namespace geos diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp index f99582b6c12..f5703d7fca7 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp @@ -17,7 +17,7 @@ #define GEOS_PHYSICSSOLVERS_INDUCED_SEISMICITY_SEISMICITYRATE_HPP #include "codingUtilities/EnumStrings.hpp" // facilities for enum-string conversion (for reading enum values from XML input) -#include "physicsSolvers/SolverBase.hpp" // an abstraction class shared by all physics solvers +#include "physicsSolvers/PhysicsSolverBase.hpp" // an abstraction class shared by all physics solvers #include "fieldSpecification/FieldSpecificationManager.hpp" // a manager that can access and set values on the discretized domain #include "physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp" @@ -27,7 +27,7 @@ namespace geos { -class SeismicityRate : public SolverBase +class SeismicityRate : public PhysicsSolverBase { public: /// The default nullary constructor is disabled to avoid compiler auto-generation: @@ -50,7 +50,7 @@ class SeismicityRate : public SolverBase /// This method ties properties with their supporting mesh virtual void registerDataOnMesh( Group & meshBodies ) override; - struct viewKeyStruct : public SolverBase::viewKeyStruct + struct viewKeyStruct : public PhysicsSolverBase::viewKeyStruct { static constexpr char const * stressSolverNameString() { return "stressSolverName"; } static constexpr char const * initialFaultNormalTractionString() { return "initialFaultNormalTraction"; } @@ -139,7 +139,7 @@ class SeismicityRate : public SolverBase virtual void postInputInitialization() override; /// pointer to stress solver - SolverBase * m_stressSolver; + PhysicsSolverBase *m_stressSolver; /// stress solver name string string m_stressSolverName; diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index fcc7bdf2227..50a08208ff5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -154,7 +154,7 @@ addCouplingSparsityPattern( DomainPartition const & domain, { ElementRegionManager const & elemManager = mesh.getElemManager(); - // TODO: remove this and just call SolverBase::setupSystem when DofManager can handle the coupling + // TODO: remove this and just call PhysicsSolverBase::setupSystem when DofManager can handle the coupling // Populate off-diagonal sparsity between well and reservoir @@ -371,8 +371,8 @@ namespace { typedef CompositionalMultiphaseReservoirAndWells<> CompositionalMultiphaseFlowAndWells; typedef CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> > CompositionalMultiphasePoromechanicsAndWells; -REGISTER_CATALOG_ENTRY( SolverBase, CompositionalMultiphaseFlowAndWells, string const &, Group * const ) -REGISTER_CATALOG_ENTRY( SolverBase, CompositionalMultiphasePoromechanicsAndWells, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, CompositionalMultiphaseFlowAndWells, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, CompositionalMultiphasePoromechanicsAndWells, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index 5aae361b31d..5471165b05b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -70,7 +70,7 @@ class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWells } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp index 4314a716444..e981e5048c2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp @@ -27,7 +27,7 @@ namespace coupledReservoirAndWellsInternal { void -addCouplingNumNonzeros( SolverBase const * const solver, +addCouplingNumNonzeros( PhysicsSolverBase const * const solver, DomainPartition & domain, DofManager & dofManager, arrayView1d< localIndex > const & rowLengths, @@ -111,14 +111,14 @@ addCouplingNumNonzeros( SolverBase const * const solver, } ); } -bool validateWellPerforations( SolverBase const * const reservoirSolver, +bool validateWellPerforations( PhysicsSolverBase const * const reservoirSolver, WellSolverBase const * const wellSolver, DomainPartition const & domain ) { std::pair< string, string > badPerforation; arrayView1d< string const > const flowTargetRegionNames = - reservoirSolver->getReference< array1d< string > >( SolverBase::viewKeyStruct::targetRegionsString() ); + reservoirSolver->getReference< array1d< string > >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); wellSolver->forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel const & meshLevel, diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index ab65f9eef38..38a5cf9e85b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -48,7 +48,7 @@ namespace coupledReservoirAndWellsInternal * @param wellElemDofName name of the well element dofs */ void -addCouplingNumNonzeros( SolverBase const * const solver, +addCouplingNumNonzeros( PhysicsSolverBase const * const solver, DomainPartition & domain, DofManager & dofManager, arrayView1d< localIndex > const & rowLengths, @@ -64,7 +64,7 @@ addCouplingNumNonzeros( SolverBase const * const solver, * @param wellSolver the well solver * @param domain the physical domain object */ -bool validateWellPerforations( SolverBase const * const reservoirSolver, +bool validateWellPerforations( PhysicsSolverBase const * const reservoirSolver, WellSolverBase const * const wellSolver, DomainPartition const & domain ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index cf04bbabc94..c83c224b86a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -21,7 +21,7 @@ #ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_COUPLEDSOLVER_HPP_ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_COUPLEDSOLVER_HPP_ -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "physicsSolvers/multiphysics/LogLevelsInfo.hpp" #include @@ -30,7 +30,7 @@ namespace geos { template< typename ... SOLVERS > -class CoupledSolver : public SolverBase +class CoupledSolver : public PhysicsSolverBase { public: @@ -42,7 +42,7 @@ class CoupledSolver : public SolverBase */ CoupledSolver( const string & name, Group * const parent ) - : SolverBase( name, parent ) + : PhysicsSolverBase( name, parent ) { forEachArgInTuple( m_solvers, [&]( auto solver, auto idx ) { @@ -54,7 +54,7 @@ class CoupledSolver : public SolverBase setDescription( "Name of the " + SolverType::coupledSolverAttributePrefix() + " solver used by the coupled solver" ); } ); - this->getWrapper< string >( SolverBase::viewKeyStruct::discretizationString() ). + this->getWrapper< string >( PhysicsSolverBase::viewKeyStruct::discretizationString() ). setInputFlag( dataRepository::InputFlags::FALSE ); addLogLevel< logInfo::Coupling >(); @@ -324,7 +324,7 @@ class CoupledSolver : public SolverBase virtual real64 setNextDtBasedOnNewtonIter( real64 const & currentDt ) override { - real64 nextDt = SolverBase::setNextDtBasedOnNewtonIter( currentDt ); + real64 nextDt = PhysicsSolverBase::setNextDtBasedOnNewtonIter( currentDt ); forEachArgInTuple( m_solvers, [&]( auto & solver, auto ) { real64 const singlePhysicsNextDt = @@ -344,7 +344,7 @@ class CoupledSolver : public SolverBase { solver->cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); } ); - SolverBase::cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); + PhysicsSolverBase::cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); } /**@}*/ @@ -411,7 +411,7 @@ class CoupledSolver : public SolverBase int const cycleNumber, DomainPartition & domain ) { - return SolverBase::solverStep( time_n, dt, cycleNumber, domain ); + return PhysicsSolverBase::solverStep( time_n, dt, cycleNumber, domain ); } /** diff --git a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp index b0b07f0c2b0..933c8afa977 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp @@ -140,6 +140,6 @@ real64 FlowProppantTransportSolver::sequentiallyCoupledSolverStep( real64 const return dtReturn; } -REGISTER_CATALOG_ENTRY( SolverBase, FlowProppantTransportSolver, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, FlowProppantTransportSolver, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp index 3f81dceeeb2..270c13b179f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp @@ -63,7 +63,7 @@ class FlowProppantTransportSolver : public CoupledSolver< ProppantTransport, */ static string catalogName() { return "FlowProppantTransport"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index dfb47daebbe..44f214e2de8 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -1169,9 +1169,9 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( D namespace { typedef HydrofractureSolver<> SinglePhaseHydrofracture; -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseHydrofracture, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhaseHydrofracture, string const &, Group * const ) // typedef HydrofractureSolver< MultiphasePoromechanics<> > MultiphaseHydrofracture; -// REGISTER_CATALOG_ENTRY( SolverBase, MultiphaseHydrofracture, string const &, Group * const ) +// REGISTER_CATALOG_ENTRY( PhysicsSolverBase, MultiphaseHydrofracture, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index 952415312d7..d3e08989f95 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -84,7 +84,7 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER // } } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 1f4f06d0db3..4a03fb51aab 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -256,11 +256,11 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIni Base::initializePostInitialConditionsPreSubGroups(); arrayView1d< string const > const & poromechanicsTargetRegionNames = - this->template getReference< array1d< string > >( SolverBase::viewKeyStruct::targetRegionsString() ); + this->template getReference< array1d< string > >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); arrayView1d< string const > const & solidMechanicsTargetRegionNames = - this->solidMechanicsSolver()->template getReference< array1d< string > >( SolverBase::viewKeyStruct::targetRegionsString() ); + this->solidMechanicsSolver()->template getReference< array1d< string > >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); arrayView1d< string const > const & flowTargetRegionNames = - this->flowSolver()->template getReference< array1d< string > >( SolverBase::viewKeyStruct::targetRegionsString() ); + this->flowSolver()->template getReference< array1d< string > >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); for( integer i = 0; i < poromechanicsTargetRegionNames.size(); ++i ) { GEOS_THROW_IF( std::find( solidMechanicsTargetRegionNames.begin(), solidMechanicsTargetRegionNames.end(), @@ -311,9 +311,9 @@ template class MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells namespace { typedef MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells<> > MultiphaseReservoirPoromechanics; -REGISTER_CATALOG_ENTRY( SolverBase, MultiphaseReservoirPoromechanics, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, MultiphaseReservoirPoromechanics, string const &, Group * const ) typedef MultiphasePoromechanics<> MultiphasePoromechanics; -REGISTER_CATALOG_ENTRY( SolverBase, MultiphasePoromechanics, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, MultiphasePoromechanics, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index 578df76e3cf..7cce059248a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -71,7 +71,7 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANI } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } @@ -154,7 +154,7 @@ real64 MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assemblyLaunch( string const dofKey = dofManager.getKey( fields::solidMechanics::totalDisplacement::key() ); arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey ); - real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( SolverBase::gravityVector() ); + real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( PhysicsSolverBase::gravityVector() ); KERNEL_WRAPPER kernelWrapper( dofNumber, dofManager.rankOffset(), diff --git a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp index 0057e882ca2..447cdc1f1b1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp @@ -107,6 +107,6 @@ void PhaseFieldFractureSolver::mapSolutionBetweenSolvers( DomainPartition & doma } } -REGISTER_CATALOG_ENTRY( SolverBase, PhaseFieldFractureSolver, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, PhaseFieldFractureSolver, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp index 68ff98950c2..b9625e1f41d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp @@ -53,7 +53,7 @@ class PhaseFieldFractureSolver : public CoupledSolver< SolidMechanicsLagrangianF return "PhaseFieldFracture"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index b2fd6d4a603..db180e45aa7 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -130,7 +130,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER setSizedFromParent( 0 ); string & hydraulicApertureModelName = subRegion.getReference< string >( viewKeyStruct::hydraulicApertureRelationNameString() ); - hydraulicApertureModelName = SolverBase::getConstitutiveName< constitutive::HydraulicApertureBase >( subRegion ); + hydraulicApertureModelName = PhysicsSolverBase::getConstitutiveName< constitutive::HydraulicApertureBase >( subRegion ); GEOS_ERROR_IF( hydraulicApertureModelName.empty(), GEOS_FMT( "{}: HydraulicApertureBase model not found on subregion {}", this->getDataContext(), subRegion.getDataContext() ) ); } @@ -183,7 +183,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER virtual void registerDataOnMesh( dataRepository::Group & meshBodies ) override { - SolverBase::registerDataOnMesh( meshBodies ); + PhysicsSolverBase::registerDataOnMesh( meshBodies ); if( this->getNonlinearSolverParameters().m_couplingType == NonlinearSolverParameters::CouplingType::Sequential ) { @@ -198,9 +198,9 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER flowSolver()->enableJumpStabilization(); } - SolverBase::forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) + PhysicsSolverBase::forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { ElementRegionManager & elemManager = mesh.getElemManager(); @@ -401,14 +401,14 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER array1d< real64 > & averageMeanTotalStressIncrement ) { averageMeanTotalStressIncrement.resize( 0 ); - SolverBase::forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) { + PhysicsSolverBase::forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, auto & subRegion ) { // get the solid model (to access stress increment) string const solidName = subRegion.template getReference< string >( "porousMaterialNames" ); - constitutive::CoupledSolidBase & solid = SolverBase::getConstitutiveModel< constitutive::CoupledSolidBase >( + constitutive::CoupledSolidBase & solid = PhysicsSolverBase::getConstitutiveModel< constitutive::CoupledSolidBase >( subRegion, solidName ); arrayView1d< const real64 > const & averageMeanTotalStressIncrement_k = solid.getAverageMeanTotalStressIncrement_k(); @@ -424,14 +424,14 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER array1d< real64 > & averageMeanTotalStressIncrement ) { integer i = 0; - SolverBase::forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) { + PhysicsSolverBase::forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) { mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, auto & subRegion ) { // get the solid model (to access stress increment) string const solidName = subRegion.template getReference< string >( "porousMaterialNames" ); - constitutive::CoupledSolidBase & solid = SolverBase::getConstitutiveModel< constitutive::CoupledSolidBase >( + constitutive::CoupledSolidBase & solid = PhysicsSolverBase::getConstitutiveModel< constitutive::CoupledSolidBase >( subRegion, solidName ); auto & porosityModel = dynamic_cast< constitutive::BiotPorosity const & >( solid.getBasePorosityModel()); arrayView1d< real64 > const & averageMeanTotalStressIncrement_k = solid.getAverageMeanTotalStressIncrement_k(); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 6411c8f190e..7b6d7dbbcb6 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -89,7 +89,7 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::setupSystem( Dom } // setup monolithic coupled system - SolverBase::setupSystem( domain, dofManager, localMatrix, rhs, solution, setSparsity ); + PhysicsSolverBase::setupSystem( domain, dofManager, localMatrix, rhs, solution, setSparsity ); if( !this->m_precond && this->m_linearSolverParameters.get().solverType != LinearSolverParameters::SolverType::direct ) { @@ -103,9 +103,9 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIn Base::initializePostInitialConditionsPreSubGroups(); arrayView1d< string const > const & poromechanicsTargetRegionNames = - this->template getReference< array1d< string > >( SolverBase::viewKeyStruct::targetRegionsString() ); + this->template getReference< array1d< string > >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); arrayView1d< string const > const & flowTargetRegionNames = - this->flowSolver()->template getReference< array1d< string > >( SolverBase::viewKeyStruct::targetRegionsString() ); + this->flowSolver()->template getReference< array1d< string > >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); for( integer i = 0; i < poromechanicsTargetRegionNames.size(); ++i ) { GEOS_THROW_IF( std::find( flowTargetRegionNames.begin(), flowTargetRegionNames.end(), poromechanicsTargetRegionNames[i] ) @@ -345,9 +345,9 @@ template class SinglePhasePoromechanics< SinglePhaseReservoirAndWells<>, SolidMe namespace { typedef SinglePhasePoromechanics< SinglePhaseReservoirAndWells<> > SinglePhaseReservoirPoromechanics; -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseReservoirPoromechanics, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhaseReservoirPoromechanics, string const &, Group * const ) typedef SinglePhasePoromechanics<> SinglePhasePoromechanics; -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanics, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhasePoromechanics, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index ed8cf47b964..dd9110fb79b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -70,7 +70,7 @@ class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHAN } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } @@ -164,7 +164,7 @@ real64 SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assemblyLaunch string const dofKey = dofManager.getKey( fields::solidMechanics::totalDisplacement::key() ); arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey ); - real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( SolverBase::gravityVector() ); + real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( PhysicsSolverBase::gravityVector() ); KERNEL_WRAPPER kernelWrapper( dofNumber, dofManager.rankOffset(), diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 7f5f69c81a5..48deed2cf6a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -804,9 +804,9 @@ template class SinglePhasePoromechanicsConformingFractures< SinglePhaseReservoir namespace { typedef SinglePhasePoromechanicsConformingFractures< SinglePhaseReservoirAndWells<> > SinglePhaseReservoirPoromechanicsConformingFractures; -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseReservoirPoromechanicsConformingFractures, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhaseReservoirPoromechanicsConformingFractures, string const &, Group * const ) typedef SinglePhasePoromechanicsConformingFractures<> SinglePhasePoromechanicsConformingFractures; -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsConformingFractures, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhasePoromechanicsConformingFractures, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp index a522d389b86..7d0b4f121ea 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp @@ -73,7 +73,7 @@ class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechan } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index d2c1c2ddecb..0bb0a6319c6 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -545,6 +545,6 @@ void SinglePhasePoromechanicsEmbeddedFractures::updateState( DomainPartition & d } ); } -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsEmbeddedFractures, std::string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhasePoromechanicsEmbeddedFractures, std::string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp index 1094ae5f678..a6d72b4f728 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -44,7 +44,7 @@ class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanic */ static string catalogName() { return Base::catalogName() + "EmbeddedFractures"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index 4e3dacbd699..8a70deb0ab2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -132,7 +132,7 @@ addCouplingSparsityPattern( DomainPartition const & domain, { ElementRegionManager const & elemManager = mesh.getElemManager(); - // TODO: remove this and just call SolverBase::setupSystem when DofManager can handle the coupling + // TODO: remove this and just call PhysicsSolverBase::setupSystem when DofManager can handle the coupling // Populate off-diagonal sparsity between well and reservoir @@ -352,11 +352,11 @@ template class SinglePhaseReservoirAndWells< SinglePhasePoromechanicsConformingF namespace { typedef SinglePhaseReservoirAndWells<> SinglePhaseFlowAndWells; -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhaseFlowAndWells, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhaseFlowAndWells, string const &, Group * const ) typedef SinglePhaseReservoirAndWells< SinglePhasePoromechanics<> > SinglePhasePoromechanicsAndWells; -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsAndWells, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhasePoromechanicsAndWells, string const &, Group * const ) typedef SinglePhaseReservoirAndWells< SinglePhasePoromechanicsConformingFractures<> > SinglePhasePoromechanicsConformingFracturesAndWells; -REGISTER_CATALOG_ENTRY( SolverBase, SinglePhasePoromechanicsConformingFracturesAndWells, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhasePoromechanicsConformingFracturesAndWells, string const &, Group * const ) } } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 3ad673bbb21..28caba5410e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -69,7 +69,7 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERV } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/python/PySolver.cpp b/src/coreComponents/physicsSolvers/python/PySolver.cpp index e65db753aa2..0d84b780736 100644 --- a/src/coreComponents/physicsSolvers/python/PySolver.cpp +++ b/src/coreComponents/physicsSolvers/python/PySolver.cpp @@ -38,9 +38,9 @@ struct PySolver PyObject_HEAD static constexpr char const * docString = - "A Python interface to geos::SolverBase."; + "A Python interface to geos::PhysicsSolverBase."; - geos::SolverBase * group; + geos::PhysicsSolverBase *group; }; diff --git a/src/coreComponents/physicsSolvers/python/PySolver.hpp b/src/coreComponents/physicsSolvers/python/PySolver.hpp index 1b922e108f5..2c15ace10e5 100644 --- a/src/coreComponents/physicsSolvers/python/PySolver.hpp +++ b/src/coreComponents/physicsSolvers/python/PySolver.hpp @@ -16,6 +16,6 @@ #ifndef GEOS_PYTHON_PYSOLVER_HPP_ #define GEOS_PYTHON_PYSOLVER_HPP_ -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #endif diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp index f32f270e88e..e1f2411f56a 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp @@ -32,7 +32,7 @@ using namespace dataRepository; //START_SPHINX_INCLUDE_CONSTRUCTOR LaplaceBaseH1::LaplaceBaseH1( const string & name, Group * const parent ): - SolverBase( name, parent ), + PhysicsSolverBase( name, parent ), m_fieldName( "primaryField" ), m_timeIntegrationOption( TimeIntegrationOption::ImplicitTransient ) { @@ -89,8 +89,8 @@ void LaplaceBaseH1::registerDataOnMesh( Group & meshBodies ) Here, we decide how we march in time in the resolutions based on the possible two options set in the XML file (Steady state or Implicit transient). In the case of Implicit transient, we perform an implicit step (backward Euler). The implementation of the Implicit Step is found in the - SolverBase. From now on, we oscillate between specific Laplace solver operations if implemented - and more generic SolverBase operations. The initial values of the solver step are all at time_n, + PhysicsSolverBase. From now on, we oscillate between specific Laplace solver operations if implemented + and more generic PhysicsSolverBase operations. The initial values of the solver step are all at time_n, and the solver attempts to advance by a time step of dt. This dt time step size is specified initially by the user and the solverStep method also returns its value. */ @@ -105,7 +105,7 @@ real64 LaplaceBaseH1::solverStep( real64 const & time_n, /* IMPLICIT STEP SETUP - This method uses the system setup from SolverBase (see below). + This method uses the system setup from PhysicsSolverBase (see below). The current system of this class does not use the time variable. The macro GEOS_UNUSED_PARAM is therefore used here to avoid a compilation error. */ @@ -175,7 +175,7 @@ void LaplaceBaseH1::updateState( DomainPartition & domain ) /* APPLY BOUNDARY CONDITIONS - Here, this call is the generic call from SolverBase. + Here, this call is the generic call from PhysicsSolverBase. All it does is to call a specific Dirichlet boundary condition implemented for this solver */ void LaplaceBaseH1::applyBoundaryConditions( real64 const time_n, diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp index 164b54ee5d9..e3f10b22eea 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp @@ -17,17 +17,17 @@ #define GEOS_PHYSICSSOLVERS_SIMPLEPDE_LAPLACE_BASE_HPP #include "codingUtilities/EnumStrings.hpp" // facilities for enum-string conversion (for reading enum values from XML input) -#include "physicsSolvers/SolverBase.hpp" // an abstraction class shared by all physics solvers +#include "physicsSolvers/PhysicsSolverBase.hpp" // an abstraction class shared by all physics solvers #include "fieldSpecification/FieldSpecificationManager.hpp" // a manager that can access and set values on the discretized domain namespace geos { -// Like most physics solvers, the Laplace solver derives from a generic SolverBase class. +// Like most physics solvers, the Laplace solver derives from a generic PhysicsSolverBase class. // The base class is densely Doxygen-commented and worth a look if you have not done so already. // Most important system assembly steps, linear and non-linear resolutions, and time-stepping mechanisms -// are implemented at the SolverBase class level and can thus be used in Laplace without needing reimplementation. -class LaplaceBaseH1 : public SolverBase +// are implemented at the PhysicsSolverBase class level and can thus be used in Laplace without needing reimplementation. +class LaplaceBaseH1 : public PhysicsSolverBase { public: /// The default nullary constructor is disabled to avoid compiler auto-generation: @@ -111,7 +111,7 @@ class LaplaceBaseH1 : public SolverBase /// This structure stores ``dataRepository::ViewKey`` objects used as binding between the input /// XML tags and source code variables (here, timeIntegrationOption and fieldVarName) //START_SPHINX_INCLUDE_VIEWKEY - struct viewKeyStruct : public SolverBase::viewKeyStruct + struct viewKeyStruct : public PhysicsSolverBase::viewKeyStruct { static constexpr char const * timeIntegrationOption() { return "timeIntegrationOption"; } static constexpr char const * fieldVarName() { return "fieldName"; } diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp index 7c0d4e1a6d4..4cc4abfd4bf 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp @@ -67,7 +67,7 @@ using namespace dataRepository; /* CONSTRUCTOR First, let us inspect the constructor of a "LaplaceFEM" object. This constructor does three important things: - 1 - It constructs an instance of the LaplaceFEM class (here: using the SolverBase constructor and passing through the arguments). + 1 - It constructs an instance of the LaplaceFEM class (here: using the PhysicsSolverBase constructor and passing through the arguments). 2 - It sets some default values for the LaplaceFEM-specific private variables (here: m_fieldName and m_timeIntegrationOption). 3 - It creates and activates a "registerWrapper" for each private variable. This is where the private variables are declared either as REQUIRED or OPTIONAL. @@ -99,7 +99,7 @@ void LaplaceFEM::setupSystem( DomainPartition & domain, bool const setSparsity ) { GEOS_MARK_FUNCTION; - SolverBase::setupSystem( domain, dofManager, localMatrix, rhs, solution, setSparsity ); + PhysicsSolverBase::setupSystem( domain, dofManager, localMatrix, rhs, solution, setSparsity ); forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, MeshLevel & mesh, @@ -179,6 +179,6 @@ void LaplaceFEM::assembleSystem( real64 const GEOS_UNUSED_PARAM( time_n ), //END_SPHINX_INCLUDE_ASSEMBLY //START_SPHINX_INCLUDE_REGISTER -REGISTER_CATALOG_ENTRY( SolverBase, LaplaceFEM, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, LaplaceFEM, string const &, Group * const ) //END_SPHINX_INCLUDE_REGISTER } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp index 054ba3e2a72..6e0d8422cd8 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp @@ -21,10 +21,10 @@ namespace geos { -// Like most physics solvers, the Laplace solver derives from a generic SolverBase class. +// Like most physics solvers, the Laplace solver derives from a generic PhysicsSolverBase class. // The base class is densely Doxygen-commented and worth a look if you have not done so already. // Most important system assembly steps, linear and non-linear resolutions, and time-stepping mechanisms -// are implemented at the SolverBase class level and can thus be used in Laplace without needing reimplementation. +// are implemented at the PhysicsSolverBase class level and can thus be used in Laplace without needing reimplementation. //START_SPHINX_INCLUDE_BEGINCLASS class LaplaceFEM : public LaplaceBaseH1 @@ -45,7 +45,7 @@ class LaplaceFEM : public LaplaceBaseH1 /// this C++ classes. This is important. static string catalogName() { return "LaplaceFEM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp index a3d41bbef67..8ac607f7c67 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp @@ -55,7 +55,7 @@ using namespace constitutive; PhaseFieldDamageFEM::PhaseFieldDamageFEM( const string & name, Group * const parent ): - SolverBase( name, parent ), + PhysicsSolverBase( name, parent ), m_fieldName( "primaryField" ) { @@ -117,7 +117,7 @@ void PhaseFieldDamageFEM::registerDataOnMesh( Group & meshBodies ) setSizedFromParent( 0 ); string & solidMaterialName = subRegion.getReference< string >( viewKeyStruct::solidModelNamesString() ); - solidMaterialName = SolverBase::getConstitutiveName< SolidBase >( subRegion ); + solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); GEOS_ERROR_IF( solidMaterialName.empty(), GEOS_FMT( "{}: SolidBase model not found on subregion {}", getDataContext(), subRegion.getName() ) ); @@ -127,7 +127,7 @@ void PhaseFieldDamageFEM::registerDataOnMesh( Group & meshBodies ) void PhaseFieldDamageFEM::postInputInitialization() { - SolverBase::postInputInitialization(); + PhysicsSolverBase::postInputInitialization(); // Set basic parameters for solver // m_linearSolverParameters.logLevel = 0; @@ -651,6 +651,6 @@ void PhaseFieldDamageFEM::saveSequentialIterationState( DomainPartition & GEOS_U // nothing to save yet } -REGISTER_CATALOG_ENTRY( SolverBase, PhaseFieldDamageFEM, string const &, +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, PhaseFieldDamageFEM, string const &, Group * const ) } // namespace geos diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp index 01aed10c16f..ce1de6db454 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp @@ -23,7 +23,7 @@ #include "linearAlgebra/DofManager.hpp" #include "linearAlgebra/interfaces/InterfaceTypes.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" struct stabledt { @@ -40,7 +40,7 @@ class FieldSpecificationBase; class FiniteElementBase; class DomainPartition; -class PhaseFieldDamageFEM : public SolverBase +class PhaseFieldDamageFEM : public PhysicsSolverBase { public: PhaseFieldDamageFEM( const string & name, Group * const parent ); @@ -52,7 +52,7 @@ class PhaseFieldDamageFEM : public SolverBase return "PhaseFieldDamageFEM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } @@ -147,7 +147,7 @@ class PhaseFieldDamageFEM : public SolverBase Quadratic, }; - struct viewKeyStruct : public SolverBase::viewKeyStruct + struct viewKeyStruct : public PhysicsSolverBase::viewKeyStruct { static constexpr char const * coeffNameString() { return "coeffField"; } static constexpr char const * localDissipationOptionString() { return "localDissipation"; } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 1c1c5cf9785..c2f1cff9940 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -50,7 +50,7 @@ using namespace fields; SolidMechanicsLagrangianFEM::SolidMechanicsLagrangianFEM( const string & name, Group * const parent ): - SolverBase( name, parent ), + PhysicsSolverBase( name, parent ), m_newmarkGamma( 0.5 ), m_newmarkBeta( 0.25 ), m_massDamping( 0.0 ), @@ -128,14 +128,14 @@ SolidMechanicsLagrangianFEM::SolidMechanicsLagrangianFEM( const string & name, void SolidMechanicsLagrangianFEM::postInputInitialization() { - SolverBase::postInputInitialization(); + PhysicsSolverBase::postInputInitialization(); LinearSolverParameters & linParams = m_linearSolverParameters.get(); linParams.isSymmetric = true; linParams.dofsPerNode = 3; linParams.amg.separateComponents = true; - m_surfaceGenerator = this->getParent().getGroupPointer< SolverBase >( m_surfaceGeneratorName ); + m_surfaceGenerator = this->getParent().getGroupPointer< PhysicsSolverBase >( m_surfaceGeneratorName ); } SolidMechanicsLagrangianFEM::~SolidMechanicsLagrangianFEM() @@ -228,7 +228,7 @@ void SolidMechanicsLagrangianFEM::registerDataOnMesh( Group & meshBodies ) void SolidMechanicsLagrangianFEM::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const { - SolverBase::setConstitutiveNamesCallSuper( subRegion ); + PhysicsSolverBase::setConstitutiveNamesCallSuper( subRegion ); subRegion.registerWrapper< string >( viewKeyStruct::solidMaterialNamesString() ). setPlotLevel( PlotLevel::NOPLOT ). @@ -236,7 +236,7 @@ void SolidMechanicsLagrangianFEM::setConstitutiveNamesCallSuper( ElementSubRegio setSizedFromParent( 0 ); string & solidMaterialName = subRegion.getReference< string >( viewKeyStruct::solidMaterialNamesString() ); - solidMaterialName = SolverBase::getConstitutiveName< SolidBase >( subRegion ); + solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); GEOS_ERROR_IF( solidMaterialName.empty(), GEOS_FMT( "{}: SolidBase model not found on subregion {}", getDataContext(), subRegion.getDataContext() ) ); @@ -244,7 +244,7 @@ void SolidMechanicsLagrangianFEM::setConstitutiveNamesCallSuper( ElementSubRegio void SolidMechanicsLagrangianFEM::initializePreSubGroups() { - SolverBase::initializePreSubGroups(); + PhysicsSolverBase::initializePreSubGroups(); DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); @@ -259,7 +259,7 @@ void SolidMechanicsLagrangianFEM::initializePreSubGroups() CellElementSubRegion & subRegion ) { string & solidMaterialName = subRegion.getReference< string >( viewKeyStruct::solidMaterialNamesString() ); - solidMaterialName = SolverBase::getConstitutiveName< SolidBase >( subRegion ); + solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); } ); } ); @@ -990,7 +990,7 @@ void SolidMechanicsLagrangianFEM::setupSystem( DomainPartition & domain, bool const setSparsity ) { GEOS_MARK_FUNCTION; - SolverBase::setupSystem( domain, dofManager, localMatrix, rhs, solution, setSparsity ); + PhysicsSolverBase::setupSystem( domain, dofManager, localMatrix, rhs, solution, setSparsity ); SparsityPattern< globalIndex > sparsityPattern( dofManager.numLocalDofs(), dofManager.numGlobalDofs(), @@ -1480,5 +1480,5 @@ void SolidMechanicsLagrangianFEM::saveSequentialIterationState( DomainPartition // nothing to save } -REGISTER_CATALOG_ENTRY( SolverBase, SolidMechanicsLagrangianFEM, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SolidMechanicsLagrangianFEM, string const &, dataRepository::Group * const ) } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index 31060180229..fb5fd9def7a 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -27,7 +27,7 @@ #include "mesh/MeshForLoopInterface.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "mesh/mpiCommunications/MPI_iCommData.hpp" -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBase.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" @@ -40,7 +40,7 @@ namespace geos * * This class implements a finite element solution to the equations of motion. */ -class SolidMechanicsLagrangianFEM : public SolverBase +class SolidMechanicsLagrangianFEM : public PhysicsSolverBase { public: @@ -80,11 +80,11 @@ class SolidMechanicsLagrangianFEM : public SolverBase virtual ~SolidMechanicsLagrangianFEM() override; /** - * @return The string that may be used to generate a new instance from the SolverBase::CatalogInterface::CatalogType + * @return The string that may be used to generate a new instance from the PhysicsSolverBase::CatalogInterface::CatalogType */ static string catalogName() { return "SolidMechanics_LagrangianFEM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } @@ -230,7 +230,7 @@ class SolidMechanicsLagrangianFEM : public SolverBase virtual void saveSequentialIterationState( DomainPartition & domain ) override; - struct viewKeyStruct : SolverBase::viewKeyStruct + struct viewKeyStruct : PhysicsSolverBase::viewKeyStruct { static constexpr char const * newmarkGammaString() { return "newmarkGamma"; } static constexpr char const * newmarkBetaString() { return "newmarkBeta"; } @@ -306,7 +306,7 @@ class SolidMechanicsLagrangianFEM : public SolverBase string m_contactRelationName; - SolverBase * m_surfaceGenerator; + PhysicsSolverBase *m_surfaceGenerator; string m_surfaceGeneratorName; }; diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp index 841ef5f448b..de86e0c4ab8 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp @@ -35,5 +35,5 @@ SolidMechanicsLagrangianSSLE::~SolidMechanicsLagrangianSSLE() {} -REGISTER_CATALOG_ENTRY( SolverBase, SolidMechanicsLagrangianSSLE, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SolidMechanicsLagrangianSSLE, string const &, dataRepository::Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp index 464bbea3300..3a316fa2ace 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp @@ -40,7 +40,7 @@ class SolidMechanicsLagrangianSSLE : public SolidMechanicsLagrangianFEM static string catalogName() { return "SolidMechanicsLagrangianSSLE"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp index a08777484ff..c59481ecbfe 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp @@ -55,7 +55,7 @@ using namespace constitutive; SolidMechanicsMPM::SolidMechanicsMPM( const string & name, Group * const parent ): - SolverBase( name, parent ), + PhysicsSolverBase( name, parent ), m_solverProfiling( 0 ), m_timeIntegrationOption( TimeIntegrationOption::ExplicitDynamic ), // m_iComm( CommunicationTools::getInstance().getCommID() ), @@ -292,7 +292,7 @@ SolidMechanicsMPM::SolidMechanicsMPM( const string & name, void SolidMechanicsMPM::postInputInitialization() { - SolverBase::postInputInitialization(); + PhysicsSolverBase::postInputInitialization(); // Activate neighbor list if necessary if( m_damageFieldPartitioning == 1 || m_surfaceDetection == 1 /*|| m_directionalOverlapCorrection == 1*/ ) @@ -467,7 +467,7 @@ void SolidMechanicsMPM::registerDataOnMesh( Group & meshBodies ) void SolidMechanicsMPM::initializePreSubGroups() { - SolverBase::initializePreSubGroups(); + PhysicsSolverBase::initializePreSubGroups(); DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); @@ -487,7 +487,7 @@ void SolidMechanicsMPM::initializePreSubGroups() ParticleSubRegion & subRegion ) { string & solidMaterialName = subRegion.getReference< string >( viewKeyStruct::solidMaterialNamesString() ); - solidMaterialName = SolverBase::getConstitutiveName< SolidBase >( subRegion ); + solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); } ); } } ); @@ -528,7 +528,7 @@ real64 SolidMechanicsMPM::solverStep( real64 const & time_n, GEOS_MARK_FUNCTION; real64 dtReturn = dt; - SolverBase * const surfaceGenerator = this->getParent().getGroupPointer< SolverBase >( "SurfaceGen" ); + PhysicsSolverBase * const surfaceGenerator = this->getParent().getGroupPointer< PhysicsSolverBase >( "SurfaceGen" ); if( m_timeIntegrationOption == TimeIntegrationOption::ExplicitDynamic ) { @@ -1978,7 +1978,7 @@ void SolidMechanicsMPM::setParticlesConstitutiveNames( ParticleSubRegionBase & s setSizedFromParent( 0 ); string & solidMaterialName = subRegion.getReference< string >( viewKeyStruct::solidMaterialNamesString() ); - solidMaterialName = SolverBase::getConstitutiveName< SolidBase >( subRegion ); + solidMaterialName = PhysicsSolverBase::getConstitutiveName< SolidBase >( subRegion ); GEOS_ERROR_IF( solidMaterialName.empty(), GEOS_FMT( "SolidBase model not found on subregion {}", subRegion.getName() ) ); } @@ -4063,5 +4063,5 @@ void SolidMechanicsMPM::populateMappingArrays( ParticleManager & particleManager } ); } -REGISTER_CATALOG_ENTRY( SolverBase, SolidMechanicsMPM, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SolidMechanicsMPM, string const &, dataRepository::Group * const ) } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp index 0a30807e0fe..71200129938 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp @@ -27,7 +27,7 @@ #include "mesh/MeshForLoopInterface.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "mesh/mpiCommunications/MPI_iCommData.hpp" -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" #include "MPMSolverFields.hpp" @@ -42,7 +42,7 @@ class SpatialPartition; * * This class implements a material point method solution to the equations of motion. */ -class SolidMechanicsMPM : public SolverBase +class SolidMechanicsMPM : public PhysicsSolverBase { public: @@ -90,11 +90,11 @@ class SolidMechanicsMPM : public SolverBase virtual ~SolidMechanicsMPM() override; /** - * @return The string that may be used to generate a new instance from the SolverBase::CatalogInterface::CatalogType + * @return The string that may be used to generate a new instance from the PhysicsSolverBase::CatalogInterface::CatalogType */ static string catalogName() { return "SolidMechanics_MPM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } @@ -166,7 +166,7 @@ class SolidMechanicsMPM : public SolverBase * @param solution the solution vector */ - struct viewKeyStruct : SolverBase::viewKeyStruct + struct viewKeyStruct : PhysicsSolverBase::viewKeyStruct { static constexpr char const * cflFactorString() { return "cflFactor"; } static constexpr char const * timeIntegrationOptionString() { return "timeIntegrationOption"; } diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp index 7b13c4618d5..a0ce1d96de9 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp @@ -64,7 +64,7 @@ void NewObjectLists::insert( NewObjectLists const & newObjects ) EmbeddedSurfaceGenerator::EmbeddedSurfaceGenerator( const string & name, Group * const parent ): - SolverBase( name, parent ), + PhysicsSolverBase( name, parent ), m_fractureRegionName(), m_mpiCommOrder( 0 ) { @@ -425,7 +425,7 @@ void EmbeddedSurfaceGenerator::addEmbeddedElementsToSets( ElementRegionManager c } ); } -REGISTER_CATALOG_ENTRY( SolverBase, +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, EmbeddedSurfaceGenerator, string const &, dataRepository::Group * const ) diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp index d8377b89dc6..043530d94ad 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp @@ -21,7 +21,7 @@ #define GEOS_PHYSICSSOLVERS_SURFACEGENERATION_EMBEDDEDSURFACEGENERATOR_HPP_ #include "mesh/mpiCommunications/NeighborCommunicator.hpp" -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "mesh/DomainPartition.hpp" @@ -51,7 +51,7 @@ class ElementRegionBase; * This solver manages the mesh topology splitting methods. * */ -class EmbeddedSurfaceGenerator : public SolverBase +class EmbeddedSurfaceGenerator : public PhysicsSolverBase { public: EmbeddedSurfaceGenerator( const string & name, @@ -61,7 +61,7 @@ class EmbeddedSurfaceGenerator : public SolverBase static string catalogName() { return "EmbeddedSurfaceGenerator"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } @@ -118,7 +118,7 @@ class EmbeddedSurfaceGenerator : public SolverBase /** * @struct viewKeyStruct holds char strings and viewKeys for fast lookup */ - struct viewKeyStruct : SolverBase::viewKeyStruct + struct viewKeyStruct : PhysicsSolverBase::viewKeyStruct { constexpr static char const * solidMaterialNameString() {return "solidMaterialNames"; } constexpr static char const * fractureRegionNameString() {return "fractureRegion"; } diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index 1c8aed78104..26089417c74 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -175,7 +175,7 @@ static void CheckForAndRemoveDeadEndPath( const localIndex edgeIndex, SurfaceGenerator::SurfaceGenerator( const string & name, Group * const parent ): - SolverBase( name, parent ), + PhysicsSolverBase( name, parent ), m_failCriterion( 1 ), // m_maxTurnAngle(91.0), m_nodeBasedSIF( 1 ), @@ -4563,7 +4563,7 @@ SurfaceGenerator::calculateRuptureRate( SurfaceElementRegion & faceElementRegion -REGISTER_CATALOG_ENTRY( SolverBase, +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SurfaceGenerator, string const &, dataRepository::Group * const ) diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp index 09e37170f2e..1064fe5f6b0 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp @@ -20,7 +20,7 @@ #define GEOS_PHYSICSSOLVERS_SURFACEGENERATION_SURFACEGENERATOR_HPP_ #include "mesh/mpiCommunications/NeighborCommunicator.hpp" -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "mesh/DomainPartition.hpp" namespace geos @@ -57,7 +57,7 @@ class ElementRegionBase; * This solver manages the mesh topology splitting methods. * */ -class SurfaceGenerator : public SolverBase +class SurfaceGenerator : public PhysicsSolverBase { public: SurfaceGenerator( const string & name, @@ -67,7 +67,7 @@ class SurfaceGenerator : public SolverBase static string catalogName() { return "SurfaceGenerator"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } @@ -506,7 +506,7 @@ class SurfaceGenerator : public SolverBase /** * @struct viewKeyStruct holds char strings and viewKeys for fast lookup */ - struct viewKeyStruct : SolverBase::viewKeyStruct + struct viewKeyStruct : PhysicsSolverBase::viewKeyStruct { constexpr static char const * failCriterionString() { return "failCriterion"; } constexpr static char const * solidMaterialNameString() { return "solidMaterialNames"; } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index 9b052d67d84..e6be717bb30 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -576,6 +576,6 @@ void AcousticFirstOrderWaveEquationSEM::applyPML( real64 const, DomainPartition GEOS_ERROR( getDataContext() << ": PML for the first order acoustic wave propagator not yet implemented" ); } -REGISTER_CATALOG_ENTRY( SolverBase, AcousticFirstOrderWaveEquationSEM, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, AcousticFirstOrderWaveEquationSEM, string const &, dataRepository::Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp index 8b69c355e6f..18daccacb08 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp @@ -42,7 +42,7 @@ class AcousticFirstOrderWaveEquationSEM : public WaveSolverBase static string catalogName() { return "AcousticFirstOrderSEM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index b8c8219179f..1257b0ef41a 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -638,7 +638,7 @@ void AcousticVTIWaveEquationSEM::cleanup( real64 const time_n, DomainPartition & domain ) { // call the base class cleanup (for reporting purposes) - SolverBase::cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); + PhysicsSolverBase::cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); // compute the remaining seismic traces, if needed forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -656,6 +656,6 @@ void AcousticVTIWaveEquationSEM::cleanup( real64 const time_n, } ); } -REGISTER_CATALOG_ENTRY( SolverBase, AcousticVTIWaveEquationSEM, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, AcousticVTIWaveEquationSEM, string const &, dataRepository::Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp index 1689e91574b..df6d248581f 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp @@ -22,7 +22,7 @@ #define GEOS_PHYSICSSOLVERS_WAVEPROPAGATION_ACOUSTICVTIWAVEEQUATIONSEM_HPP_ #include "mesh/MeshFields.hpp" -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" #include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp" #include "AcousticVTIFields.hpp" @@ -42,7 +42,7 @@ class AcousticVTIWaveEquationSEM : public WaveSolverBase static string catalogName() { return "AcousticVTISEM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index d1b72a08fd2..059259cb12b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -1231,7 +1231,7 @@ void AcousticWaveEquationSEM::cleanup( real64 const time_n, DomainPartition & domain ) { // call the base class cleanup (for reporting purposes) - SolverBase::cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); + PhysicsSolverBase::cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); // compute the remaining seismic traces, if needed forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -1249,6 +1249,6 @@ void AcousticWaveEquationSEM::cleanup( real64 const time_n, } ); } -REGISTER_CATALOG_ENTRY( SolverBase, AcousticWaveEquationSEM, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, AcousticWaveEquationSEM, string const &, dataRepository::Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp index 71f4c46c499..a51bb5a1f31 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp @@ -23,7 +23,7 @@ #include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" #include "mesh/MeshFields.hpp" -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp" namespace geos @@ -53,7 +53,7 @@ class AcousticWaveEquationSEM : public WaveSolverBase static string catalogName() { return "AcousticSEM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp index ab324c4fe43..f833c9dc8c5 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp @@ -32,7 +32,7 @@ using namespace fields; void AcousticElasticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) { - SolverBase::registerDataOnMesh( meshBodies ); + PhysicsSolverBase::registerDataOnMesh( meshBodies ); forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, MeshLevel & mesh, @@ -47,7 +47,7 @@ void AcousticElasticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() { - SolverBase::initializePostInitialConditionsPreSubGroups(); + PhysicsSolverBase::initializePostInitialConditionsPreSubGroups(); auto acousSolver = acousticSolver(); auto elasSolver = elasticSolver(); @@ -63,8 +63,8 @@ void AcousticElasticWaveEquationSEM::initializePostInitialConditionsPreSubGroups localIndex const numInterfaceNodes = MpiWrapper::sum( m_interfaceNodesSet.size() ); GEOS_THROW_IF( numInterfaceNodes == 0, "Failed to compute interface: check xml input (solver order)", std::runtime_error ); - m_acousRegions = acousSolver->getReference< array1d< string > >( SolverBase::viewKeyStruct::targetRegionsString() ); - m_elasRegions = elasSolver->getReference< array1d< string > >( SolverBase::viewKeyStruct::targetRegionsString() ); + m_acousRegions = acousSolver->getReference< array1d< string > >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); + m_elasRegions = elasSolver->getReference< array1d< string > >( PhysicsSolverBase::viewKeyStruct::targetRegionsString() ); DomainPartition & domain = getGroupByPath< DomainPartition >( "/Problem/domain" ); @@ -210,6 +210,6 @@ void AcousticElasticWaveEquationSEM::cleanup( real64 const time_n, acousticSolver()->cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); } -REGISTER_CATALOG_ENTRY( SolverBase, AcousticElasticWaveEquationSEM, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, AcousticElasticWaveEquationSEM, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp index ca9325909c4..bfbb8edf88b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp @@ -23,7 +23,7 @@ #include "physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp" #include "physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp" -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "AcoustoElasticFields.hpp" #include @@ -31,7 +31,7 @@ namespace geos { template< typename ... SOLVERS > -class CoupledWaveSolver : public SolverBase +class CoupledWaveSolver : public PhysicsSolverBase { public: @@ -43,7 +43,7 @@ class CoupledWaveSolver : public SolverBase */ CoupledWaveSolver( const string & name, Group * const parent ) - : SolverBase( name, parent ) + : PhysicsSolverBase( name, parent ) { forEachArgInTuple( m_solvers, [&]( auto solver, auto idx ) { @@ -71,7 +71,7 @@ class CoupledWaveSolver : public SolverBase virtual void postInputInitialization() override final { - SolverBase::postInputInitialization(); + PhysicsSolverBase::postInputInitialization(); forEachArgInTuple( m_solvers, [&]( auto & solver, auto idx ) { @@ -136,7 +136,7 @@ class AcousticElasticWaveEquationSEM : public CoupledWaveSolver< AcousticWaveEqu static string catalogName() { return "AcousticElasticSEM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index 5f1c56c582d..da2b95f5f38 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -656,7 +656,7 @@ void ElasticFirstOrderWaveEquationSEM::cleanup( real64 const time_n, real64 const eventProgress, DomainPartition & domain ) { - SolverBase::cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); + PhysicsSolverBase::cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); // compute the remaining seismic traces, if needed forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -723,6 +723,6 @@ void ElasticFirstOrderWaveEquationSEM::applyPML( real64 const, DomainPartition & GEOS_ERROR( getDataContext() << ": PML for the first order elastic wave propagator not yet implemented" ); } -REGISTER_CATALOG_ENTRY( SolverBase, ElasticFirstOrderWaveEquationSEM, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, ElasticFirstOrderWaveEquationSEM, string const &, dataRepository::Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp index f7cc37d74ef..a687653c332 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp @@ -43,7 +43,7 @@ class ElasticFirstOrderWaveEquationSEM : public WaveSolverBase static string catalogName() { return "ElasticFirstOrderSEM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } @@ -83,7 +83,7 @@ class ElasticFirstOrderWaveEquationSEM : public WaveSolverBase virtual void cleanup( real64 const time_n, integer const cycleNumber, integer const eventCounter, real64 const eventProgress, DomainPartition & domain ) override; - struct viewKeyStruct : SolverBase::viewKeyStruct + struct viewKeyStruct : PhysicsSolverBase::viewKeyStruct { static constexpr char const * displacementxNp1AtReceiversString() { return "displacementxNp1AtReceivers"; } static constexpr char const * displacementyNp1AtReceiversString() { return "displacementyNp1AtReceivers"; } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index bb254286d05..46868959436 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -980,7 +980,7 @@ void ElasticWaveEquationSEM::cleanup( real64 const time_n, DomainPartition & domain ) { // call the base class cleanup (for reporting purposes) - SolverBase::cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); + PhysicsSolverBase::cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); // compute the remaining seismic traces, if needed forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, @@ -1034,6 +1034,6 @@ void ElasticWaveEquationSEM::applyPML( real64 const, DomainPartition & ) GEOS_ERROR( getDataContext() << ": PML for the elastic wave propagator not yet implemented" ); } -REGISTER_CATALOG_ENTRY( SolverBase, ElasticWaveEquationSEM, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, ElasticWaveEquationSEM, string const &, dataRepository::Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp index dbb31405477..15d2d0429ec 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp @@ -23,7 +23,7 @@ #include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" #include "mesh/MeshFields.hpp" -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp" namespace geos @@ -53,7 +53,7 @@ class ElasticWaveEquationSEM : public WaveSolverBase static string catalogName() { return "ElasticSEM"; } /** - * @copydoc SolverBase::getCatalogName() + * @copydoc PhysicsSolverBase::getCatalogName() */ string getCatalogName() const override { return catalogName(); } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index 2d47951446a..c5baf9c7983 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -40,8 +40,8 @@ using namespace dataRepository; WaveSolverBase::WaveSolverBase( const std::string & name, Group * const parent ): - SolverBase( name, - parent ) + PhysicsSolverBase( name, + parent ) { registerWrapper( viewKeyStruct::sourceCoordinatesString(), &m_sourceCoordinates ). @@ -270,7 +270,7 @@ void WaveSolverBase::registerDataOnMesh( Group & meshBodies ) void WaveSolverBase::initializePreSubGroups() { - SolverBase::initializePreSubGroups(); + PhysicsSolverBase::initializePreSubGroups(); localIndex const numNodesPerElem = WaveSolverBase::getNumNodesPerElem(); @@ -299,7 +299,7 @@ void WaveSolverBase::initializePreSubGroups() void WaveSolverBase::postInputInitialization() { - SolverBase::postInputInitialization(); + PhysicsSolverBase::postInputInitialization(); /// set flag PML to one if a PML field is specified in the xml /// if counter>1, an error will be thrown as one single PML field is allowed diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp index 26610228889..dec7284f70d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp @@ -23,7 +23,7 @@ #include "mesh/MeshFields.hpp" -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" #include "common/LifoStorage.hpp" #include "functions/TableFunction.hpp" #if !defined( GEOS_USE_HIP ) @@ -47,7 +47,7 @@ namespace geos { -class WaveSolverBase : public SolverBase +class WaveSolverBase : public PhysicsSolverBase { public: @@ -80,7 +80,7 @@ class WaveSolverBase : public SolverBase integer const cycleNumber, DomainPartition & domain ) override; - struct viewKeyStruct : SolverBase::viewKeyStruct + struct viewKeyStruct : PhysicsSolverBase::viewKeyStruct { static constexpr char const * sourceCoordinatesString() { return "sourceCoordinates"; } diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index f6d771d5a78..3d9983d8b23 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -1970,7 +1970,7 @@ the relative residual norm satisfies: - + @@ -2574,7 +2574,7 @@ Level 0 outputs no specific information for this solver. Higher levels require m - + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index b64551f8938..7542e5ea4f1 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -443,9 +443,9 @@ - + - + diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp index 4d7c67bb7bf..4ac4c12786f 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp @@ -195,7 +195,7 @@ void setRateTable( array2d< real64 > & rateTable, std::initializer_list< std::in real64 getTotalFluidMass( ProblemManager & problem, string_view flowSolverPath ) { real64 totalMass = 0.0; - SolverBase const & solver = problem.getGroupByPath< SolverBase >( string( flowSolverPath ) ); + PhysicsSolverBase const & solver = problem.getGroupByPath< PhysicsSolverBase >( string( flowSolverPath ) ); solver.forDiscretizationOnMeshTargets( problem.getDomainPartition().getMeshBodies(), [&] ( string const &, MeshLevel & mesh, @@ -343,7 +343,7 @@ void checkWholeSimTimeStepStats( ProblemManager & problem, { EXPECT_EQ( timeStepChecker.getTestedTimeStepCount(), testSet.timestepCount ) << "The tested time-step were different than expected."; - SolverBase const & solver = problem.getGroupByPath< SolverBase >( testSet.inputs.flowSolverPath ); + PhysicsSolverBase const & solver = problem.getGroupByPath< PhysicsSolverBase >( testSet.inputs.flowSolverPath ); SolverStatistics const & solverStats = solver.getSolverStatistics(); EXPECT_GE( solverStats.getNumTimeStepCuts(), testSet.inputs.requiredSubTimeStep ) << "The test did not encountered any timestep cut, but were expected to. " "Consider adapting the simulation so a timestep cut occurs to check they work as expected."; diff --git a/src/docs/doxygen/Doxyfile.in b/src/docs/doxygen/Doxyfile.in index 7038c667890..f3869f78f70 100644 --- a/src/docs/doxygen/Doxyfile.in +++ b/src/docs/doxygen/Doxyfile.in @@ -767,7 +767,7 @@ INPUT = @PROJECT_SOURCE_DIR@/coreComponents/common \ @PROJECT_SOURCE_DIR@/coreComponents/finiteElement/elementFormulations \ @PROJECT_SOURCE_DIR@/coreComponents/finiteElement/kernelInterface \ @PROJECT_SOURCE_DIR@/coreComponents/mesh/MeshFields.hpp \ - @PROJECT_SOURCE_DIR@/coreComponents/physicsSolvers/SolverBase.hpp \ + @PROJECT_SOURCE_DIR@/coreComponents/physicsSolvers/PhysicsSolverBase.hpp \ @PROJECT_SOURCE_DIR@/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp \ @PROJECT_SOURCE_DIR@/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp \ @PROJECT_SOURCE_DIR@/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp \ diff --git a/src/docs/sphinx/Doxygen.rst b/src/docs/sphinx/Doxygen.rst index 217411e6083..bd23a682dab 100644 --- a/src/docs/sphinx/Doxygen.rst +++ b/src/docs/sphinx/Doxygen.rst @@ -15,4 +15,4 @@ Some key doxygen pages are linked below: `ObjectManagerBase API <../../doxygen_output/html/classgeos_1_1_object_manager_base.html>`_ -`SolverBase API <../../doxygen_output/html/classgeos_1_1_solver_base.html>`_ \ No newline at end of file +`PhysicsSolverBase API <../../doxygen_output/html/classgeos_1_1_physics_solver_base.html>`_ \ No newline at end of file diff --git a/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst b/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst index 38c122242b0..f7db38efaca 100644 --- a/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst +++ b/src/docs/sphinx/developerGuide/KeyComponents/AddingNewSolver.rst @@ -33,7 +33,7 @@ Declaration file (reference) The included header is ``physicsSolvers/simplePDE/LaplaceBaseH1.hpp`` which declares the base class ``LaplaceBaseH1``, shared by all Laplace solvers. Moreover, ``physicsSolver/simplePDE/LaplaceBaseH1.hpp`` includes the following headers: - ``common/EnumStrings.hpp`` which includes facilities for enum-string conversion (useful for reading enum values from input); - - ``physicsSolver/SolverBase.hpp`` which declares the abstraction class shared by all physics solvers. + - ``physicsSolver/PhysicsSolverBase.hpp`` which declares the abstraction class shared by all physics solvers. - ``managers/FieldSpecification/FieldSpecificationManager.hpp`` which declares a manager used to access and to set field on the discretized domain. Let us jump forward to the class enum and variable as they contain the data used @@ -114,12 +114,12 @@ Furthermore, the following functions are inherited from the base class. Eventually, ``applyDirichletBCImplicit()`` is the working specialized member functions called when ``applyBoundaryConditions()`` is called in this particular class override. -Browsing the base class ``SolverBase``, it can be noted that most of the solver interface functions are called during -either ``SolverBase::linearImplicitStep()`` or ``SolverBase::nonlinearImplicitStep()`` depending on the solver strategy chosen. +Browsing the base class ``PhysicsSolverBase``, it can be noted that most of the solver interface functions are called during +either ``PhysicsSolverBase::linearImplicitStep()`` or ``PhysicsSolverBase::nonlinearImplicitStep()`` depending on the solver strategy chosen. Switching to protected members, ``postInputInitialization()`` is a central member function and will be called by ``Group`` object after input is read from XML entry file. -It will set and dispatch solver variables from the base class ``SolverBase`` to the most derived class. +It will set and dispatch solver variables from the base class ``PhysicsSolverBase`` to the most derived class. For ``LaplaceFEM``, it will allow us to set the right time integration scheme based on the XML value as will be further explored in the next :ref:`Implementation` section. diff --git a/src/docs/sphinx/developerGuide/KeyComponents/WorkingWithData.rst b/src/docs/sphinx/developerGuide/KeyComponents/WorkingWithData.rst index fc629b83af9..3a2023dd733 100644 --- a/src/docs/sphinx/developerGuide/KeyComponents/WorkingWithData.rst +++ b/src/docs/sphinx/developerGuide/KeyComponents/WorkingWithData.rst @@ -81,7 +81,7 @@ We will use the example of registering a ``totalDisplacement`` on the ``NodeMana from the ``SolidMechanics`` solver. The most general approach is to define a string key and call one of the `Group::registerWrapper() <../../../doxygen_output/html/classgeos_1_1data_repository_1_1_group.html#a741c3b5728fc47b33fbaad6c4f124991>`_ -functions from ``SolverBase::registerDataOnMesh()``. +functions from ``PhysicsSolverBase::registerDataOnMesh()``. Then when you want to use the data, you can call ``Group::getReference()``. For example this would look something like: diff --git a/src/docs/sphinx/developerGuide/KeyComponents/XML.rst b/src/docs/sphinx/developerGuide/KeyComponents/XML.rst index 442dd65da46..ddbd3cd1b69 100644 --- a/src/docs/sphinx/developerGuide/KeyComponents/XML.rst +++ b/src/docs/sphinx/developerGuide/KeyComponents/XML.rst @@ -66,7 +66,7 @@ You can have several objects of the same class and hence the same ``catalogName` **How can I add my new externally-accessible class to the ObjectCatalog?** -Let us consider a flow solver class derived from ``FlowSolverBase``, that itself is derived from ``SolverBase``. +Let us consider a flow solver class derived from ``FlowSolverBase``, that itself is derived from ``PhysicsSolverBase``. To instantiate and use this solver, the developer needs to make the derived flow solver class reachable from the XML file, via an XML tag. Internally, this requires adding the derived class information to ``ObjectCatalog``, which is achieved with two main ingredients: 1) a ``CatalogName()`` method in the class that lets GEOS know *what* to search for in the internal ``ObjectCatalog`` to instantiate an object of this class, 2) a macro that specifies *where* to search in the ``ObjectCatalog``. @@ -89,7 +89,7 @@ Internally, this requires adding the derived class information to ``ObjectCatalo 2. To let GEOS know where to search in the ``ObjectCatalog``, a macro needs to be added at the end of the .cpp file implementing the class. - This macro (illustrated below) must contain the type of the base class (in this case, ``SolverBase``), and the name of the derived class (continuing with the example used above, this is ``CompositionalMultiphaseFlow``). + This macro (illustrated below) must contain the type of the base class (in this case, ``PhysicsSolverBase``), and the name of the derived class (continuing with the example used above, this is ``CompositionalMultiphaseFlow``). As a result of this construct, the ``ObjectCatalog`` is not a flat list of ``string`` s mapping the C++ classes. Instead, the ``ObjectCatalog`` forms a tree that reproduces locally the structure of the class diagram, from the base class to the derived classes. @@ -196,7 +196,7 @@ To do this, the method ``CreateChild`` of the ``PhysicsSolverManager`` class is // -------------------------------- // childKey = "XmlNameOfMySolver" (string) // childName = "nameOfThisSolverInstance" (string) - // SolverBase::CatalogInterface = the Catalog attached to the base Solver class + // PhysicsSolverBase::CatalogInterface = the Catalog attached to the base Solver class // hasKeyName = bool method to test if the childKey string is present in the Catalog // registerGroup = method to create a new instance of the solver and add it to the group tree @@ -207,11 +207,11 @@ To do this, the method ``CreateChild`` of the ``PhysicsSolverManager`` class is *[Source: src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp]* -In the code listing above, we see that in the ``PhysicsSolverManager`` class, the ``ObjectCatalog`` is searched to find the ``catalogName`` "CompositionalMultiphaseFlow" in the scope of the ``SolverBase`` class. -Then, the factory function of the base class ``SolverBase`` is called. +In the code listing above, we see that in the ``PhysicsSolverManager`` class, the ``ObjectCatalog`` is searched to find the ``catalogName`` "CompositionalMultiphaseFlow" in the scope of the ``PhysicsSolverBase`` class. +Then, the factory function of the base class ``PhysicsSolverBase`` is called. The ``catalogName`` (stored in ``childKey``) is passed as an argument of the factory function to ensure that it instantiates an object of the desired derived class. -As explained above, this is working because 1) the XML tag matches the ``catalogName`` of the ``CompositionalMultiphaseFlow`` class and 2) a macro is placed at the end of the .cpp file implementing the ``CompositionalMultiphaseFlow`` class to let the ``ObjectCatalog`` know that ``CompositionalMultiphaseFlow`` is a derived class of ``SolverBase``. +As explained above, this is working because 1) the XML tag matches the ``catalogName`` of the ``CompositionalMultiphaseFlow`` class and 2) a macro is placed at the end of the .cpp file implementing the ``CompositionalMultiphaseFlow`` class to let the ``ObjectCatalog`` know that ``CompositionalMultiphaseFlow`` is a derived class of ``PhysicsSolverBase``. Note that several instances of the same type of solver can be created, as long as they each have a different name. diff --git a/src/externalComponents/newComponentTemplate/src/NewComponent.cpp b/src/externalComponents/newComponentTemplate/src/NewComponent.cpp index f9ec9069792..2ce2383e178 100644 --- a/src/externalComponents/newComponentTemplate/src/NewComponent.cpp +++ b/src/externalComponents/newComponentTemplate/src/NewComponent.cpp @@ -24,7 +24,7 @@ namespace geos NewComponent::NewComponent( string const & name, Group * const parent ): - SolverBase(name,parent) + PhysicsSolverBase(name,parent) { } @@ -44,6 +44,6 @@ real64 NewComponent::solverStep( real64 const & /*time_n*/, return 0; } -REGISTER_CATALOG_ENTRY( SolverBase, NewComponent, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, NewComponent, string const &, dataRepository::Group * const ) } /* namespace geos */ diff --git a/src/externalComponents/newComponentTemplate/src/NewComponent.hpp b/src/externalComponents/newComponentTemplate/src/NewComponent.hpp index 41af5f7503b..2dbfa595d0c 100644 --- a/src/externalComponents/newComponentTemplate/src/NewComponent.hpp +++ b/src/externalComponents/newComponentTemplate/src/NewComponent.hpp @@ -19,7 +19,7 @@ #ifndef COMPONENTS_NEWCOMPONENTTEMPLATE_SRC_NEWCOMPONENT_HPP_ #define COMPONENTS_NEWCOMPONENTTEMPLATE_SRC_NEWCOMPONENT_HPP_ -#include "physicsSolvers/SolverBase.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" namespace geos @@ -30,7 +30,7 @@ class Group; } class DomainPartition; -class NewComponent final : public SolverBase +class NewComponent final : public PhysicsSolverBase { public: NewComponent( string const & name, From 62b70a7a9302910746e4f10bdcfa7710c069cc6b Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Tue, 5 Nov 2024 08:13:11 -0800 Subject: [PATCH 230/286] feat: add rate- and state-dependent friction model & quasi-dynamic solver. (#3280) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: add rate- and state-dependent friction model. * 1D spring slider with 2-component slip/sliprate working * rebaseline --------- Co-authored-by: Vidar Stiernström --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../inducedSeismicity/SpringSlider_base.xml | 167 +++++++++ .../inducedSeismicity/SpringSlider_smoke.xml | 32 ++ .../inducedSeismicity/inducedSeismicity.ats | 13 +- src/coreComponents/LvArray | 2 +- .../constitutive/CMakeLists.txt | 2 + .../constitutive/contact/CoulombFriction.cpp | 1 - .../constitutive/contact/CoulombFriction.hpp | 14 - .../contact/RateAndStateFriction.cpp | 116 ++++++ .../contact/RateAndStateFriction.hpp | 329 ++++++++++++++++++ .../inducedSeismicity/CMakeLists.txt | 6 +- .../inducedSeismicity/QuasiDynamicEQ.cpp | 285 +++++++++++++++ .../inducedSeismicity/QuasiDynamicEQ.hpp | 135 +++++++ .../inducedSeismicity/SeismicityRate.cpp | 7 +- .../inducedSeismicity/SeismicityRate.hpp | 8 +- .../inducedSeismicityFields.hpp | 1 - .../kernels/RateAndStateKernels.hpp | 209 +++++++++++ .../{ => kernels}/SeismicityRateKernels.hpp | 0 .../inducedSeismicity/rateAndStateFields.hpp | 82 +++++ src/coreComponents/schema/schema.xsd | 40 +++ src/coreComponents/schema/schema.xsd.other | 16 + 22 files changed, 1441 insertions(+), 30 deletions(-) create mode 100644 inputFiles/inducedSeismicity/SpringSlider_base.xml create mode 100644 inputFiles/inducedSeismicity/SpringSlider_smoke.xml create mode 100644 src/coreComponents/constitutive/contact/RateAndStateFriction.cpp create mode 100644 src/coreComponents/constitutive/contact/RateAndStateFriction.hpp create mode 100644 src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp create mode 100644 src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp create mode 100644 src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp rename src/coreComponents/physicsSolvers/inducedSeismicity/{ => kernels}/SeismicityRateKernels.hpp (100%) create mode 100644 src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index c236ea8a83a..b1c3cc5d477 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr2909-8386-3a7b08d + baseline: integratedTests/baseline_integratedTests-pr3280-8463-4595d21 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index e9745cb89a9..ff9e76e27f3 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3280 (2024-11-05) +==================== +Added Sprig-slider test. + PR #2909 (2024-10-30) ===================== Add routine for automatic time steps in waveSolvers with new attributes diff --git a/inputFiles/inducedSeismicity/SpringSlider_base.xml b/inputFiles/inducedSeismicity/SpringSlider_base.xml new file mode 100644 index 00000000000..9f141031607 --- /dev/null +++ b/inputFiles/inducedSeismicity/SpringSlider_base.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inputFiles/inducedSeismicity/SpringSlider_smoke.xml b/inputFiles/inducedSeismicity/SpringSlider_smoke.xml new file mode 100644 index 00000000000..b10580131d8 --- /dev/null +++ b/inputFiles/inducedSeismicity/SpringSlider_smoke.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inputFiles/inducedSeismicity/inducedSeismicity.ats b/inputFiles/inducedSeismicity/inducedSeismicity.ats index 58a28bf9c40..08b031177f0 100644 --- a/inputFiles/inducedSeismicity/inducedSeismicity.ats +++ b/inputFiles/inducedSeismicity/inducedSeismicity.ats @@ -15,12 +15,19 @@ decks = [ restart_step=20, check_step=30, restartcheck_params=RestartcheckParameters(atol=1e-4, rtol=1e-3)), - TestDeck( + TestDeck( name="SeismicityRate_analytical_verification_smoke", description="Prescribed logarithmic stressing history", partitions=((1, 1, 1), ), restart_step=0, check_step=100, - curvecheck_params=CurveCheckParameters(**curvecheck_params)) - ] + curvecheck_params=CurveCheckParameters(**curvecheck_params)), + TestDeck( + name="SpringSlider_smoke", + description="Spring slider 0D system", + partitions=((1, 1, 1), ), + restart_step=0, + check_step=3262, + restartcheck_params=RestartcheckParameters(atol=1e-4, rtol=1e-3)) + ] generate_geos_tests(decks) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index becf1405278..c9d97b4676d 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit becf14052782f37f95f8e49d92cb8837883d57c7 +Subproject commit c9d97b4676d47d1da7d2a63a1a5cbf31f7b54965 diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index 69a953f361a..cc9093e1174 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -25,6 +25,7 @@ set( constitutive_headers contact/HydraulicApertureBase.hpp contact/HydraulicApertureRelationSelector.hpp contact/HydraulicApertureTable.hpp + contact/RateAndStateFriction.hpp diffusion/ConstantDiffusion.hpp diffusion/DiffusionBase.hpp diffusion/DiffusionFields.hpp @@ -194,6 +195,7 @@ set( constitutive_sources contact/FrictionlessContact.cpp contact/HydraulicApertureBase.cpp contact/HydraulicApertureTable.cpp + contact/RateAndStateFriction.cpp diffusion/ConstantDiffusion.cpp diffusion/DiffusionBase.cpp dispersion/DispersionBase.cpp diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.cpp b/src/coreComponents/constitutive/contact/CoulombFriction.cpp index 1199f652d7e..a7bc27300dc 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.cpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.cpp @@ -50,7 +50,6 @@ CoulombFriction::CoulombFriction( string const & name, Group * const parent ): registerWrapper( viewKeyStruct::elasticSlipString(), &m_elasticSlip ). setApplyDefaultValue( 0.0 ). setDescription( "Elastic Slip" ); - } CoulombFriction::~CoulombFriction() diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.hpp b/src/coreComponents/constitutive/contact/CoulombFriction.hpp index 2ed7d182536..d117d8895e5 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.hpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.hpp @@ -169,20 +169,6 @@ class CoulombFriction : public FrictionBase virtual void allocateConstitutiveData( dataRepository::Group & parent, localIndex const numConstitutivePointsPerParentIndex ) override final; - /** - * @brief Const accessor for cohesion - * @return A const reference to arrayView1d containing the - * cohesions (at every element). - */ - real64 const & cohesion() const { return m_cohesion; } - - /** - * @brief Const accessor for friction angle - * @return A const reference to arrayView1d containing the - * friction coefficient (at every element). - */ - real64 const & frictionCoefficient() const { return m_frictionCoefficient; } - /// Type of kernel wrapper for in-kernel update using KernelWrapper = CoulombFrictionUpdates; diff --git a/src/coreComponents/constitutive/contact/RateAndStateFriction.cpp b/src/coreComponents/constitutive/contact/RateAndStateFriction.cpp new file mode 100644 index 00000000000..f26954a3316 --- /dev/null +++ b/src/coreComponents/constitutive/contact/RateAndStateFriction.cpp @@ -0,0 +1,116 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 RateAndStateFriction.cpp + */ + +#include "RateAndStateFriction.hpp" + +namespace geos +{ + +using namespace dataRepository; + +namespace constitutive +{ + +RateAndStateFriction::RateAndStateFriction( string const & name, Group * const parent ): + FrictionBase( name, parent ) +{ + registerWrapper( viewKeyStruct::aCoefficientString(), &m_a ). + setDescription( "Rate- and State-dependent friction coefficient a." ); + + registerWrapper( viewKeyStruct::bCoefficientString(), &m_b ). + setDescription( "Rate- and State-dependent friction coefficient b." ); + + registerWrapper( viewKeyStruct::DcCoefficientString(), &m_Dc ). + setDescription( "Rate- and State-dependent friction characteristic length." ); + + registerWrapper( viewKeyStruct::referenceVelocityString(), &m_V0 ). + setDescription( "Rate- and State-dependent friction reference slip rate." ); + + registerWrapper( viewKeyStruct::referenceFrictionCoefficientString(), &m_mu0 ). + setDescription( "Rate- and State-dependent friction reference friction coefficient." ); + + registerWrapper( viewKeyStruct::frictionCoefficientString(), &m_frictionCoefficient ). + setApplyDefaultValue( 0.0 ). + setDescription( "Friction coefficient" ); + + /// Default values + registerWrapper( viewKeyStruct::defaultACoefficientString(), &m_defaultA ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Default value of the Rate- and State-dependent friction coefficient a." ); + + registerWrapper( viewKeyStruct::defaultBCoefficientString(), &m_defaultB ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Default value of the Rate- and State-dependent friction coefficient b." ); + + registerWrapper( viewKeyStruct::defaultDcCoefficientString(), &m_defaultDc ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Default value of the Rate- and State-dependent friction characteristic length." ); + + registerWrapper( viewKeyStruct::defaultReferenceVelocityString(), &m_defaultV0 ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Default value of the Rate- and State-dependent friction reference slip rate." ); + + registerWrapper( viewKeyStruct::defaultReferenceFrictionCoefficientString(), &m_defaultMu0 ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Default value of the Rate- and State-dependent friction reference friction coefficient." ); +} + +RateAndStateFriction::~RateAndStateFriction() +{} + +void RateAndStateFriction::postInputInitialization() +{ + this->getWrapper< array1d< real64 > >( viewKeyStruct::aCoefficientString() ). + setApplyDefaultValue( m_defaultA ); + + this->getWrapper< array1d< real64 > >( viewKeyStruct::bCoefficientString() ). + setApplyDefaultValue( m_defaultB ); + + this->getWrapper< array1d< real64 > >( viewKeyStruct::DcCoefficientString() ). + setApplyDefaultValue( m_defaultDc ); + + this->getWrapper< array1d< real64 > >( viewKeyStruct::referenceVelocityString() ). + setApplyDefaultValue( m_defaultV0 ); + + this->getWrapper< array1d< real64 > >( viewKeyStruct::referenceFrictionCoefficientString() ). + setApplyDefaultValue( m_defaultMu0 ); + + this->getWrapper< array1d< real64 > >( viewKeyStruct::frictionCoefficientString() ). + setApplyDefaultValue( m_defaultMu0 ); +} + +void RateAndStateFriction::allocateConstitutiveData( Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) +{ + FrictionBase::allocateConstitutiveData( parent, numConstitutivePointsPerParentIndex ); +} + +using RateAndStateFrictionUpdates = RateAndStateFriction::KernelWrapper; +RateAndStateFrictionUpdates RateAndStateFriction::createKernelUpdates() const +{ + return RateAndStateFrictionUpdates( m_displacementJumpThreshold, + m_frictionCoefficient, m_a, m_b, + m_Dc, m_V0, m_mu0 ); +} + +REGISTER_CATALOG_ENTRY( ConstitutiveBase, RateAndStateFriction, string const &, Group * const ) + +} /* namespace constitutive */ + +} /* namespace geos */ diff --git a/src/coreComponents/constitutive/contact/RateAndStateFriction.hpp b/src/coreComponents/constitutive/contact/RateAndStateFriction.hpp new file mode 100644 index 00000000000..9b9341ce1aa --- /dev/null +++ b/src/coreComponents/constitutive/contact/RateAndStateFriction.hpp @@ -0,0 +1,329 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file RateAndStateFriction.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_CONTACT_RATEANDSTATEFRICTION_HPP_ +#define GEOS_CONSTITUTIVE_CONTACT_RATEANDSTATEFRICTION_HPP_ + +#include "FrictionBase.hpp" + +namespace geos +{ + +namespace constitutive +{ + +/** + * @class RateAndStateFrictionUpdates + * + * This class is used for in-kernel contact relation updates + */ + + +/** + * @class RateAndStateFriction + * + * Class to provide a RateAndStateFriction friction model. + */ +class RateAndStateFriction : public FrictionBase +{ +public: + + /** + * constructor + * @param[in] name name of the instance in the catalog + * @param[in] parent the group which contains this instance + */ + RateAndStateFriction( string const & name, Group * const parent ); + + /** + * Default Destructor + */ + virtual ~RateAndStateFriction() override; + + static string catalogName() { return "RateAndStateFriction"; } + + virtual string getCatalogName() const override { return catalogName(); } + + ///@} + + virtual void allocateConstitutiveData( dataRepository::Group & parent, + localIndex const numConstitutivePointsPerParentIndex ) override final; + + class KernelWrapper : public FrictionBaseUpdates + { +public: + KernelWrapper( real64 const displacementJumpThreshold, + arrayView1d< real64 > frictionCoefficient, + arrayView1d< real64 const > a, + arrayView1d< real64 const > b, + arrayView1d< real64 const > Dc, + arrayView1d< real64 const > V0, + arrayView1d< real64 const > mu0 ) + : FrictionBaseUpdates( displacementJumpThreshold ), + m_frictionCoefficient( frictionCoefficient ), + m_a( a ), + m_b( b ), + m_Dc( Dc ), + m_V0( V0 ), + m_mu0( mu0 ) + {} + + /// Default copy constructor + KernelWrapper( KernelWrapper const & ) = default; + + /// Default move constructor + KernelWrapper( KernelWrapper && ) = default; + + /// Deleted default constructor + KernelWrapper() = delete; + + /// Deleted copy assignment operator + KernelWrapper & operator=( KernelWrapper const & ) = delete; + + /// Deleted move assignment operator + KernelWrapper & operator=( KernelWrapper && ) = delete; + + GEOS_HOST_DEVICE + real64 getACoefficient( localIndex const k ) const { return m_a[k]; } + + GEOS_HOST_DEVICE + real64 getBCoefficient( localIndex const k ) const { return m_b[k]; } + + GEOS_HOST_DEVICE + real64 getDcCoefficient( localIndex const k ) const { return m_Dc[k]; } + + GEOS_HOST_DEVICE + inline + virtual void updateFractureState( localIndex const k, + arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & tractionVector, + integer & fractureState ) const override final; + + GEOS_HOST_DEVICE + inline real64 frictionCoefficient( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const; + + GEOS_HOST_DEVICE + inline real64 dFrictionCoefficient_dSlipRate( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const; + + GEOS_HOST_DEVICE + inline real64 dFrictionCoefficient_dStateVariable( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const; + + GEOS_HOST_DEVICE + inline real64 stateEvolution( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const; + + GEOS_HOST_DEVICE + inline real64 dStateEvolution_dStateVariable( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const; + + GEOS_HOST_DEVICE + inline real64 dStateEvolution_dSlipRate( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const; +private: + /// The friction coefficient + arrayView1d< real64 > m_frictionCoefficient; + + /// Rate and State coefficient a + arrayView1d< real64 const > m_a; + + /// Rate and State coefficient b + arrayView1d< real64 const > m_b; + + /// Rate and State characteristic length + arrayView1d< real64 const > m_Dc; + + /// Rate and State reference velocity + arrayView1d< real64 const > m_V0; + + /// Rate and State reference friction coefficient + arrayView1d< real64 const > m_mu0; + }; + + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelUpdates() const; + +private: + + virtual void postInputInitialization() override; + + /// The friction coefficient for each upper level dimension (i.e. cell) of *this + array1d< real64 > m_frictionCoefficient; + + /// Rate and State coefficient a + array1d< real64 > m_a; + + /// Rate and State coefficient b + array1d< real64 > m_b; + + /// Rate and State characteristic length + array1d< real64 > m_Dc; + + /// Rate and State reference velocity + array1d< real64 > m_V0; + + /// Rate and State reference friction coefficient + array1d< real64 > m_mu0; + + /// Default value of Rate and State coefficient a + real64 m_defaultA; + /// Default value of Rate and State coefficient b + real64 m_defaultB; + + /// Default value of Rate and State characteristic length + real64 m_defaultDc; + + /// Default value of Rate and State reference velocity + real64 m_defaultV0; + + /// Default value of Rate and State reference friction coefficient + real64 m_defaultMu0; + +/** + * @struct Set of "char const *" and keys for data specified in this class. + */ + struct viewKeyStruct : public FrictionBase::viewKeyStruct + { + /// string/key for friction coefficient + static constexpr char const * frictionCoefficientString() { return "frictionCoefficient"; } + /// string/key for Rate and State coefficient a + static constexpr char const * aCoefficientString() { return "a"; } + /// string/key for Rate and State coefficient b + static constexpr char const * bCoefficientString() { return "b"; } + /// string/key for Rate and State characteristic length + static constexpr char const * DcCoefficientString() { return "Dc"; } + /// string/key for reference slip rate + static constexpr char const * referenceVelocityString() { return "referenceVelocity"; } + /// string/key for reference friction coefficient + static constexpr char const * referenceFrictionCoefficientString() { return "referenceFrictionCoefficient"; } + /// string/key for the default value of Rate and State coefficient a + static constexpr char const * defaultACoefficientString() { return "defaultA"; } + /// string/key for the default value of Rate and State coefficient b + static constexpr char const * defaultBCoefficientString() { return "defaultB"; } + /// string/key for the default value of Rate and State characteristic length + static constexpr char const * defaultDcCoefficientString() { return "defaultDc"; } + /// string/key for the default value ofreference slip rate + static constexpr char const * defaultReferenceVelocityString() { return "defaultReferenceVelocity"; } + /// string/key for the default value of reference friction coefficient + static constexpr char const * defaultReferenceFrictionCoefficientString() { return "defaultReferenceFrictionCoefficient"; } + }; + +}; + +GEOS_HOST_DEVICE +inline void RateAndStateFriction::KernelWrapper::updateFractureState( localIndex const k, + arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & tractionVector, + integer & fractureState ) const +{ + + GEOS_UNUSED_VAR( tractionVector, k ); + using namespace fields::contact; + + if( dispJump[0] > -m_displacementJumpThreshold ) + { + fractureState = FractureState::Open; + } + else + { + fractureState = FractureState::Slip; + } +} + +GEOS_HOST_DEVICE +inline real64 RateAndStateFriction::KernelWrapper::frictionCoefficient( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const +{ + + real64 const arg = ( slipRate / (2 * m_V0[k]) ) * LvArray::math::exp( stateVariable / m_a[k] ); + m_frictionCoefficient[k] = m_a[k] * LvArray::math::asinh( arg ); + + return m_frictionCoefficient[k]; +} + +GEOS_HOST_DEVICE +inline real64 RateAndStateFriction::KernelWrapper::dFrictionCoefficient_dSlipRate( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const +{ + + real64 const arg = ( slipRate / (2 * m_V0[k]) ) * LvArray::math::exp( stateVariable / m_a[k] ); + + return ( m_a[k] * LvArray::math::exp( stateVariable / m_a[k] ) ) / (2 * m_V0[k] * LvArray::math::sqrt( 1 + arg * arg )); +} + +GEOS_HOST_DEVICE +inline real64 RateAndStateFriction::KernelWrapper::dFrictionCoefficient_dStateVariable( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const +{ + + real64 const arg = ( slipRate / (2 * m_V0[k]) ) * LvArray::math::exp( stateVariable / m_a[k] ); + + return ( slipRate * LvArray::math::exp( stateVariable / m_a[k] ) ) / (2 * m_V0[k] * LvArray::math::sqrt( 1 + arg * arg )); +} + +GEOS_HOST_DEVICE +inline real64 RateAndStateFriction::KernelWrapper::stateEvolution( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const +{ + real64 const mu = frictionCoefficient( k, slipRate, stateVariable ); + + return -slipRate / m_Dc[k] * (mu - m_mu0[k] + (m_b[k] - m_a[k]) * LvArray::math::log( slipRate / m_V0[k] )); +} + +GEOS_HOST_DEVICE +inline real64 RateAndStateFriction::KernelWrapper::dStateEvolution_dStateVariable( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const +{ + return -slipRate / m_Dc[k] * dFrictionCoefficient_dStateVariable( k, slipRate, stateVariable ); +} + +GEOS_HOST_DEVICE +inline real64 RateAndStateFriction::KernelWrapper::dStateEvolution_dSlipRate( localIndex const k, + real64 const slipRate, + real64 const stateVariable ) const +{ + real64 const part1 = frictionCoefficient( k, slipRate, stateVariable ) - m_mu0[k] + (m_b[k] - m_a[k]) * LvArray::math::log( slipRate / m_V0[k] ); + + real64 const part2 = dFrictionCoefficient_dSlipRate( k, slipRate, stateVariable ) * slipRate + (m_b[k] - m_a[k]); + + return -1.0 / m_Dc[k] * ( part1 + part2 ); +} + +} /* namespace constitutive */ + +} /* namespace geos */ + +#endif /* GEOS_CONSTITUTIVE_CONTACT_RATEANDSTATEFRICTION_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt b/src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt index e4a805314ac..7edf040454d 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt @@ -2,12 +2,16 @@ set( physicsSolvers_headers ${physicsSolvers_headers} inducedSeismicity/inducedSeismicityFields.hpp + inducedSeismicity/rateAndStateFields.hpp + inducedSeismicity/QuasiDynamicEQ.hpp inducedSeismicity/SeismicityRate.hpp - inducedSeismicity/SeismicityRateKernels.hpp + inducedSeismicity/kernels/RateAndStateKernels.hpp + inducedSeismicity/kernels/SeismicityRateKernels.hpp PARENT_SCOPE ) # Specify solver sources set( physicsSolvers_sources ${physicsSolvers_sources} + inducedSeismicity/QuasiDynamicEQ.cpp inducedSeismicity/SeismicityRate.cpp PARENT_SCOPE ) diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp new file mode 100644 index 00000000000..059fa9d33e1 --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp @@ -0,0 +1,285 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 QuasiDynamicEQ.cpp + */ + +#include "QuasiDynamicEQ.hpp" + +#include "dataRepository/InputFlags.hpp" +#include "mesh/DomainPartition.hpp" +#include "kernels/RateAndStateKernels.hpp" +#include "rateAndStateFields.hpp" +#include "physicsSolvers/contact/ContactFields.hpp" +#include "fieldSpecification/FieldSpecificationManager.hpp" + +namespace geos +{ + +using namespace dataRepository; +using namespace fields; +using namespace constitutive; + +QuasiDynamicEQ::QuasiDynamicEQ( const string & name, + Group * const parent ): + PhysicsSolverBase( name, parent ), + m_stressSolver( nullptr ), + m_stressSolverName( "SpringSlider" ), + m_shearImpedance( 0.0 ), + m_targetSlipIncrement( 1.0e-7 ) +{ + this->registerWrapper( viewKeyStruct::shearImpedanceString(), &m_shearImpedance ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Shear impedance." ); + + this->registerWrapper( viewKeyStruct::stressSolverNameString(), &m_stressSolverName ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Name of solver for computing stress. If empty, the spring-slider model is run." ); + + this->registerWrapper( viewKeyStruct::targetSlipIncrementString(), &m_targetSlipIncrement ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 1.0e-7 ). + setDescription( "Target slip incrmeent for timestep size selction" ); +} + +void QuasiDynamicEQ::postInputInitialization() +{ + + // Initialize member stress solver as specified in XML input + if( !m_stressSolverName.empty() ) + { + m_stressSolver = &this->getParent().getGroup< PhysicsSolverBase >( m_stressSolverName ); + } + + PhysicsSolverBase::postInputInitialization(); +} + +QuasiDynamicEQ::~QuasiDynamicEQ() +{ + // TODO Auto-generated destructor stub +} + +void QuasiDynamicEQ::registerDataOnMesh( Group & meshBodies ) +{ + PhysicsSolverBase::registerDataOnMesh( meshBodies ); + + forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + + elemManager.forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) + { + // Scalar functions on fault + subRegion.registerField< rateAndState::stateVariable >( getName() ); + subRegion.registerField< rateAndState::stateVariable_n >( getName() ); + subRegion.registerField< rateAndState::slipRate >( getName() ); + + // Tangent (2-component) functions on fault + string const labels2Comp[2] = {"tangent1", "tangent2" }; + subRegion.registerField< rateAndState::slipVelocity >( getName() ). + setDimLabels( 1, labels2Comp ).reference().resizeDimension< 1 >( 2 ); + subRegion.registerField< rateAndState::deltaSlip >( getName() ). + setDimLabels( 1, labels2Comp ).reference().resizeDimension< 1 >( 2 ); + + if( !subRegion.hasWrapper( contact::dispJump::key() )) + { + // 3-component functions on fault + string const labels3Comp[3] = { "normal", "tangent1", "tangent2" }; + subRegion.registerField< contact::dispJump >( getName() ). + setDimLabels( 1, labels3Comp ). + reference().resizeDimension< 1 >( 3 ); + subRegion.registerField< contact::traction >( getName() ). + setDimLabels( 1, labels3Comp ). + reference().resizeDimension< 1 >( 3 ); + + subRegion.registerWrapper< string >( viewKeyStruct::frictionLawNameString() ). + setPlotLevel( PlotLevel::NOPLOT ). + setRestartFlags( RestartFlags::NO_WRITE ). + setSizedFromParent( 0 ); + + string & frictionLawName = subRegion.getReference< string >( viewKeyStruct::frictionLawNameString() ); + frictionLawName =PhysicsSolverBase::getConstitutiveName< FrictionBase >( subRegion ); + GEOS_ERROR_IF( frictionLawName.empty(), GEOS_FMT( "{}: FrictionBase model not found on subregion {}", + getDataContext(), subRegion.getDataContext() ) ); + } + } ); + } ); +} + +real64 QuasiDynamicEQ::solverStep( real64 const & time_n, + real64 const & dt, + int const cycleNumber, + DomainPartition & domain ) +{ + if( cycleNumber == 0 ) + { + /// Apply initial conditions to the Fault + FieldSpecificationManager & fieldSpecificationManager = FieldSpecificationManager::getInstance(); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + + { + fieldSpecificationManager.applyInitialConditions( mesh ); + } ); + } + + /// 1. Compute shear and normal tractions + GEOS_LOG_LEVEL_RANK_0( 1, "Stress solver" ); + + real64 const dtStress = updateStresses( time_n, dt, cycleNumber, domain ); + + /// 2. Solve for slip rate and state variable and, compute slip + GEOS_LOG_LEVEL_RANK_0( 1, "Rate and State solver" ); + + integer const maxNewtonIter = m_nonlinearSolverParameters.m_maxIterNewton; + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) + { + // solve rate and state equations. + rateAndStateKernels::createAndLaunch< parallelDevicePolicy<> >( subRegion, viewKeyStruct::frictionLawNameString(), m_shearImpedance, maxNewtonIter, time_n, dtStress ); + // save old state + saveOldStateAndUpdateSlip( subRegion, dtStress ); + } ); + } ); + + // return time step size achieved by stress solver + return dtStress; +} + +real64 QuasiDynamicEQ::updateStresses( real64 const & time_n, + real64 const & dt, + const int cycleNumber, + DomainPartition & domain ) const +{ + // Call member variable stress solver to update the stress state + if( m_stressSolver ) + { + // 1. Solve the momentum balance + real64 const dtStress = m_stressSolver->solverStep( time_n, dt, cycleNumber, domain ); + + return dtStress; + } + else + { + // Spring-slider shear traction computation + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) + { + + arrayView2d< real64 const > const deltaSlip = subRegion.getField< rateAndState::deltaSlip >(); + arrayView2d< real64 > const traction = subRegion.getField< fields::contact::traction >(); + + string const & fricitonLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + RateAndStateFriction const & frictionLaw = getConstitutiveModel< RateAndStateFriction >( subRegion, fricitonLawName ); + + RateAndStateFriction::KernelWrapper frictionKernelWrapper = frictionLaw.createKernelUpdates(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + SpringSliderParameters springSliderParameters = SpringSliderParameters( traction[k][0], + frictionKernelWrapper.getACoefficient( k ), + frictionKernelWrapper.getBCoefficient( k ), + frictionKernelWrapper.getDcCoefficient( k ) ); + + + traction[k][1] = traction[k][1] + springSliderParameters.tauRate * dt + - springSliderParameters.springStiffness * deltaSlip[k][0]; + traction[k][2] = traction[k][2] + springSliderParameters.tauRate * dt + - springSliderParameters.springStiffness * deltaSlip[k][1]; + } ); + } ); + } ); + return dt; + } +} + +void QuasiDynamicEQ::saveOldStateAndUpdateSlip( ElementSubRegionBase & subRegion, real64 const dt ) const +{ + arrayView1d< real64 > const stateVariable = subRegion.getField< rateAndState::stateVariable >(); + arrayView1d< real64 > const stateVariable_n = subRegion.getField< rateAndState::stateVariable_n >(); + arrayView2d< real64 > const slipVelocity = subRegion.getField< rateAndState::slipVelocity >(); + arrayView2d< real64 > const deltaSlip = subRegion.getField< rateAndState::deltaSlip >(); + + arrayView2d< real64 > const dispJump = subRegion.getField< contact::dispJump >(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + stateVariable_n[k] = stateVariable[k]; + deltaSlip[k][0] = slipVelocity[k][0] * dt; + deltaSlip[k][1] = slipVelocity[k][1] * dt; + // Update tangential components of the displacement jump + dispJump[k][1] = dispJump[k][1] + slipVelocity[k][0] * dt; + dispJump[k][2] = dispJump[k][2] + slipVelocity[k][1] * dt; + } ); +} + +real64 QuasiDynamicEQ::setNextDt( real64 const & currentDt, DomainPartition & domain ) +{ + GEOS_UNUSED_VAR( currentDt ); + + real64 maxSlipRate = 0.0; + // Spring-slider shear traction computation + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) + + { + real64 maxSlipRateOnThisRank = 0.0; + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion const & subRegion ) + { + arrayView1d< real64 const > const slipRate = subRegion.getField< rateAndState::slipRate >(); + + RAJA::ReduceMax< parallelDeviceReduce, real64 > maximumSlipRateOnThisRegion( 0.0 ); + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + maximumSlipRateOnThisRegion.max( slipRate[k] ); + } ); + if( maximumSlipRateOnThisRegion.get() > maxSlipRateOnThisRank ) + maxSlipRateOnThisRank = maximumSlipRateOnThisRegion.get(); + } ); + maxSlipRate = MpiWrapper::max( maxSlipRateOnThisRank ); + } ); + + real64 const nextDt = m_targetSlipIncrement / maxSlipRate; + + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "The next dt will be {:.2e} s", nextDt )); + + return nextDt; +} + +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, QuasiDynamicEQ, string const &, dataRepository::Group * const ) + +} // namespace geos diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp new file mode 100644 index 00000000000..edff334c003 --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp @@ -0,0 +1,135 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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. + * ------------------------------------------------------------------------------------------------------------ + */ + +#ifndef GEOS_PHYSICSSOLVERS_INDUCED_QUASIDYNAMICEQ_HPP +#define GEOS_PHYSICSSOLVERS_INDUCED_QUASIDYNAMICEQ_HPP + +#include "physicsSolvers/PhysicsSolverBase.hpp" + +namespace geos +{ + +class QuasiDynamicEQ : public PhysicsSolverBase +{ +public: + /// The default nullary constructor is disabled to avoid compiler auto-generation: + QuasiDynamicEQ() = delete; + + /// The constructor needs a user-defined "name" and a parent Group (to place this instance in the tree structure of classes) + QuasiDynamicEQ( const string & name, + Group * const parent ); + + /// Destructor + virtual ~QuasiDynamicEQ() override; + + static string catalogName() { return "QuasiDynamicEQ"; } + + /** + * @return Get the final class Catalog name + */ + virtual string getCatalogName() const override { return catalogName(); } + + /// This method ties properties with their supporting mesh + virtual void registerDataOnMesh( Group & meshBodies ) override; + + struct viewKeyStruct : public PhysicsSolverBase::viewKeyStruct + { + /// stress solver name + static constexpr char const * stressSolverNameString() { return "stressSolverName"; } + /// Friction law name string + constexpr static char const * frictionLawNameString() { return "frictionLawName"; } + /// Friction law name string + constexpr static char const * shearImpedanceString() { return "shearImpedance"; } + /// target slip increment + constexpr static char const * targetSlipIncrementString() { return "targetSlipIncrement"; } + }; + + virtual real64 solverStep( real64 const & time_n, + real64 const & dt, + integer const cycleNumber, + DomainPartition & domain ) override final; + + virtual real64 setNextDt( real64 const & currentDt, + DomainPartition & domain ) override final; + + real64 updateStresses( real64 const & time_n, + real64 const & dt, + const int cycleNumber, + DomainPartition & domain ) const; + + /** + * @brief save the old state + * @param subRegion + */ + void saveOldStateAndUpdateSlip( ElementSubRegionBase & subRegion, real64 const dt ) const; + + +private: + + + + virtual void postInputInitialization() override; + + + + /// pointer to stress solver + PhysicsSolverBase * m_stressSolver; + + /// stress solver name + string m_stressSolverName; + + /// shear impedance + real64 m_shearImpedance; + + /// target slip rate + real64 m_targetSlipIncrement; + + class SpringSliderParameters + { +public: + + GEOS_HOST_DEVICE + SpringSliderParameters( real64 const normalTraction, real64 const a, real64 const b, real64 const Dc ): + tauRate( 1e-4 ), + springStiffness( 0.0 ) + { + real64 const criticalStiffness = normalTraction * (b - a) / Dc; + springStiffness = 0.9 * criticalStiffness; + } + + /// Default copy constructor + SpringSliderParameters( SpringSliderParameters const & ) = default; + + /// Default move constructor + SpringSliderParameters( SpringSliderParameters && ) = default; + + /// Deleted default constructor + SpringSliderParameters() = delete; + + /// Deleted copy assignment operator + SpringSliderParameters & operator=( SpringSliderParameters const & ) = delete; + + /// Deleted move assignment operator + SpringSliderParameters & operator=( SpringSliderParameters && ) = delete; + + real64 tauRate; + + real64 springStiffness; + }; +}; + +} /* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_INDUCED_QUASIDYNAMICEQ_HPP */ diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp index 3552e9eb91f..2c7e663567f 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp @@ -24,7 +24,12 @@ #include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" -#include "SeismicityRateKernels.hpp" +#include "kernels/SeismicityRateKernels.hpp" +#include "physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" + +#include "fieldSpecification/FieldSpecificationManager.hpp" + namespace geos { diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp index f5703d7fca7..722edd7e8c5 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp @@ -16,13 +16,7 @@ #ifndef GEOS_PHYSICSSOLVERS_INDUCED_SEISMICITY_SEISMICITYRATE_HPP #define GEOS_PHYSICSSOLVERS_INDUCED_SEISMICITY_SEISMICITYRATE_HPP -#include "codingUtilities/EnumStrings.hpp" // facilities for enum-string conversion (for reading enum values from XML input) -#include "physicsSolvers/PhysicsSolverBase.hpp" // an abstraction class shared by all physics solvers -#include "fieldSpecification/FieldSpecificationManager.hpp" // a manager that can access and set values on the discretized domain - -#include "physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp" - -#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/PhysicsSolverBase.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp index 756f0d09e5d..370951e101a 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp @@ -95,7 +95,6 @@ DECLARE_FIELD( logDenom, LEVEL_2, WRITE_AND_READ, "Log of the denominator of the integral form of the seismicity rate" ); - } } diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp new file mode 100644 index 00000000000..cf2fc306b6b --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp @@ -0,0 +1,209 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#ifndef GEOS_PHYSICSSOLVERS_RATEANDSTATEKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_RATEANDSTATEKERNELS_HPP_ + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/contact/RateAndStateFriction.hpp" +#include "physicsSolvers/inducedSeismicity/rateAndStateFields.hpp" +#include "denseLinearAlgebra/denseLASolvers.hpp" + +namespace geos +{ + +namespace rateAndStateKernels +{ +/** + * @class RateAndStateKernel + * + * @brief + * + * @details + */ +class RateAndStateKernel +{ +public: + + RateAndStateKernel( SurfaceElementSubRegion & subRegion, + constitutive::RateAndStateFriction const & frictionLaw, + real64 const shearImpedance ): + m_slipRate( subRegion.getField< fields::rateAndState::slipRate >() ), + m_stateVariable( subRegion.getField< fields::rateAndState::stateVariable >() ), + m_stateVariable_n( subRegion.getField< fields::rateAndState::stateVariable_n >() ), + m_traction( subRegion.getField< fields::contact::traction >() ), + m_slipVelocity( subRegion.getField< fields::rateAndState::slipVelocity >() ), + m_shearImpedance( shearImpedance ), + m_frictionLaw( frictionLaw.createKernelUpdates() ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables located on the stack + */ + struct StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables( ) + {} + + real64 jacobian[2][2]{}; + + real64 rhs[2]{}; + + }; + + GEOS_HOST_DEVICE + void setup( localIndex const k, + real64 const dt, + StackVariables & stack ) const + { + real64 const normalTraction = m_traction[k][0]; + real64 const shearTractionMagnitude = LvArray::math::sqrt( m_traction[k][1] * m_traction[k][1] + m_traction[k][2] * m_traction[k][2] ); + // Eq 1: Scalar force balance for slipRate and shear traction magnitude + stack.rhs[0] = shearTractionMagnitude - m_shearImpedance * m_slipRate[k] + - normalTraction * m_frictionLaw.frictionCoefficient( k, m_slipRate[k], m_stateVariable[k] ); + real64 const dFriction[2] = { -normalTraction * m_frictionLaw.dFrictionCoefficient_dStateVariable( k, m_slipRate[k], m_stateVariable[k] ), + -m_shearImpedance - normalTraction * m_frictionLaw.dFrictionCoefficient_dSlipRate( k, m_slipRate[k], m_stateVariable[k] ) }; + + // Eq 2: slip law + stack.rhs[1] = (m_stateVariable[k] - m_stateVariable_n[k]) / dt - m_frictionLaw.stateEvolution( k, m_slipRate[k], m_stateVariable[k] ); + real64 const dStateEvolutionLaw[2] = { 1 / dt - m_frictionLaw.dStateEvolution_dStateVariable( k, m_slipRate[k], m_stateVariable[k] ), + -m_frictionLaw.dStateEvolution_dSlipRate( k, m_slipRate[k], m_stateVariable[k] ) }; + + // Assemble Jacobian matrix + stack.jacobian[0][0] = dFriction[0]; // derivative of Eq 1 w.r.t. stateVariable + stack.jacobian[0][1] = dFriction[1]; // derivative of Eq 1 w.r.t. slipRate + stack.jacobian[1][0] = dStateEvolutionLaw[0]; // derivative of Eq 2 w.r.t. stateVariable + stack.jacobian[1][1] = dStateEvolutionLaw[1]; // derivative of Eq 2 w.r.t. m_slipRate + } + + GEOS_HOST_DEVICE + void solve( localIndex const k, + StackVariables & stack ) const + { + /// Solve 2x2 system + real64 solution[2] = {0.0, 0.0}; + denseLinearAlgebra::solve< 2 >( stack.jacobian, stack.rhs, solution ); + + // Update variables + m_stateVariable[k] -= solution[0]; + m_slipRate[k] -= solution[1]; + } + + GEOS_HOST_DEVICE + void projectSlipRate( localIndex const k ) const + { + // Project slip rate onto shear traction to get slip velocity components + real64 const frictionForce = m_traction[k][0] * m_frictionLaw.frictionCoefficient( k, m_slipRate[k], m_stateVariable[k] ); + real64 const projectionScaling = 1.0 / ( m_shearImpedance + frictionForce / m_slipRate[k] ); + m_slipVelocity[k][0] = projectionScaling * m_traction[k][1]; + m_slipVelocity[k][1] = projectionScaling * m_traction[k][2]; + } + + GEOS_HOST_DEVICE + camp::tuple< int, real64 > checkConvergence( StackVariables const & stack, + real64 const tol ) const + { + real64 const residualNorm = LvArray::tensorOps::l2Norm< 2 >( stack.rhs ); + int const converged = residualNorm < tol ? 1 : 0; + camp::tuple< int, real64 > result { converged, residualNorm }; + return result; + } + +private: + + arrayView1d< real64 > const m_slipRate; + + arrayView1d< real64 > const m_stateVariable; + + arrayView1d< real64 const > const m_stateVariable_n; + + arrayView2d< real64 const > const m_traction; + + arrayView2d< real64 > const m_slipVelocity; + + real64 const m_shearImpedance; + + constitutive::RateAndStateFriction::KernelWrapper m_frictionLaw; + +}; + + + +/** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + */ +template< typename POLICY > +static void +createAndLaunch( SurfaceElementSubRegion & subRegion, + string const & frictionLawNameKey, + real64 const shearImpedance, + integer const maxNewtonIter, + real64 const time_n, + real64 const dt ) +{ + GEOS_MARK_FUNCTION; + + GEOS_UNUSED_VAR( time_n ); + + string const & frictionaLawName = subRegion.getReference< string >( frictionLawNameKey ); + constitutive::RateAndStateFriction const & frictionLaw = subRegion.getConstitutiveModel< constitutive::RateAndStateFriction >( frictionaLawName ); + RateAndStateKernel kernel( subRegion, frictionLaw, shearImpedance ); + + // Newton loop (outside of the kernel launch) + bool allConverged = false; + for( integer iter = 0; iter < maxNewtonIter; iter++ ) + { + RAJA::ReduceMin< parallelDeviceReduce, int > converged( 1 ); + RAJA::ReduceMax< parallelDeviceReduce, real64 > residualNorm( 0.0 ); + forAll< POLICY >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + RateAndStateKernel::StackVariables stack; + kernel.setup( k, dt, stack ); + kernel.solve( k, stack ); + auto const [elementConverged, elementResidualNorm] = kernel.checkConvergence( stack, 1.0e-6 ); + converged.min( elementConverged ); + residualNorm.max( elementResidualNorm ); + } ); + + real64 const maxResidualNorm = MpiWrapper::max( residualNorm.get() ); + GEOS_LOG_RANK_0( GEOS_FMT( "-----iter {} : residual = {:.10e} ", iter, maxResidualNorm ) ); + + if( converged.get() ) + { + allConverged = true; + break; + } + } + if( !allConverged ) + { + GEOS_ERROR( " Failed to converge" ); + } + forAll< POLICY >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + kernel.projectSlipRate( k ); + } ); +} + +} /* namespace rateAndStateKernels */ + +}/* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_RATEANDSTATEKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/SeismicityRateKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRateKernels.hpp rename to src/coreComponents/physicsSolvers/inducedSeismicity/kernels/SeismicityRateKernels.hpp diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp new file mode 100644 index 00000000000..8031ab1c344 --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp @@ -0,0 +1,82 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file rateAndStateFields.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_INDUCEDSEISMICITY_RATEANDSTATEFIELDS_HPP_ +#define GEOS_PHYSICSSOLVERS_INDUCEDSEISMICITY_RATEANDSTATEFIELDS_HPP_ + +#include "common/DataLayouts.hpp" +#include "mesh/MeshFields.hpp" + +namespace geos +{ + +namespace fields +{ + +namespace rateAndState +{ + +DECLARE_FIELD( slipRate, + "slipRate", + array1d< real64 >, + 1.0e-6, + LEVEL_0, + WRITE_AND_READ, + "Slip rate" ); + +DECLARE_FIELD( stateVariable, + "stateVariable", + array1d< real64 >, + 0.6, + LEVEL_0, + WRITE_AND_READ, + "Rate- and state-dependent friction state variable" ); + +DECLARE_FIELD( slipVelocity, + "slipVelocity", + array2d< real64 >, + 1.0e-6, + LEVEL_0, + WRITE_AND_READ, + "Slip velocity" ); + +DECLARE_FIELD( stateVariable_n, + "stateVariable_n", + array1d< real64 >, + 0.6, + NOPLOT, + WRITE_AND_READ, + "Rate- and state-dependent friction state variable at previous time step" ); + +DECLARE_FIELD( deltaSlip, + "deltaSlip", + array2d< real64 >, + 0.0, + LEVEL_0, + WRITE_AND_READ, + "Slip increment" ); + + +} + +} + +} + +#endif // GEOS_PHYSICSSOLVERS_INDUCEDSEISMICITY_INDUCEDSEISMICITYFIELDS_HPP_ diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 3d9983d8b23..6150e54825e 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -389,6 +389,10 @@ + + + + @@ -825,6 +829,10 @@ + + + + @@ -2193,6 +2201,7 @@ the relative residual norm satisfies: + @@ -3411,6 +3420,30 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + + + + + + + + + + + + + + + + + + + + + + + @@ -4806,6 +4839,7 @@ Level 0 outputs no specific information for this solver. Higher levels require m + @@ -6019,6 +6053,12 @@ If you want to do a three-phase simulation, please use instead wettingIntermedia + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 7542e5ea4f1..3a9252a6e69 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -522,6 +522,7 @@ + @@ -1001,6 +1002,19 @@ + + + + + + + + + + + + + @@ -1496,6 +1510,7 @@ + @@ -2572,6 +2587,7 @@ + From 05d7a0d4b51ea29cf3576fa9e9469348136254e5 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 5 Nov 2024 11:59:21 -0600 Subject: [PATCH 231/286] refactor: Move flow and well kernels into "kernels" subfolders and clean up includes (#3369) --- .../physicsSolvers/fluidFlow/CMakeLists.txt | 52 +++++++++---------- .../fluidFlow/CompositionalMultiphaseBase.cpp | 6 +-- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 14 ++--- .../CompositionalMultiphaseHybridFVM.cpp | 7 ++- .../CompositionalMultiphaseStatistics.cpp | 4 +- .../fluidFlow/FlowSolverBase.cpp | 4 +- .../ReactiveCompositionalMultiphaseOBL.cpp | 4 +- .../fluidFlow/SinglePhaseBase.cpp | 4 +- .../fluidFlow/SinglePhaseBase.hpp | 4 +- .../fluidFlow/SinglePhaseFVM.cpp | 13 +++-- .../fluidFlow/SinglePhaseHybridFVM.cpp | 2 +- .../fluidFlow/SinglePhaseProppantBase.cpp | 2 +- .../fluidFlow/SinglePhaseStatistics.cpp | 4 +- ...ompositionalMultiphaseHybridFVMKernels.cpp | 4 +- ...ompositionalMultiphaseHybridFVMKernels.hpp | 2 +- ...ationCompositionalMultiphaseFVMKernels.hpp | 0 .../{ => kernels}/FlowSolverBaseKernels.hpp | 0 .../{ => kernels}/FluxKernelsHelper.hpp | 1 + .../{ => kernels}/HybridFVMHelperKernels.hpp | 0 ...rmalCompositionalMultiphaseBaseKernels.hpp | 0 ...positionalMultiphaseFVMKernelUtilities.hpp | 0 ...ermalCompositionalMultiphaseFVMKernels.cpp | 2 +- ...ermalCompositionalMultiphaseFVMKernels.hpp | 6 +-- ...ctiveCompositionalMultiphaseOBLKernels.hpp | 0 .../{ => kernels}/SinglePhaseBaseKernels.hpp | 0 .../{ => kernels}/SinglePhaseFVMKernels.hpp | 4 +- .../SinglePhaseHybridFVMKernels.hpp | 4 +- .../SinglePhaseProppantBaseKernels.hpp | 0 .../SinglePhaseProppantFluxKernels.cpp | 4 +- .../SinglePhaseProppantFluxKernels.hpp | 8 +-- ...lizedCompositionalMultiphaseFVMKernels.hpp | 2 +- .../StabilizedSinglePhaseFVMKernels.hpp | 2 +- ...rmalCompositionalMultiphaseBaseKernels.hpp | 4 +- ...ermalCompositionalMultiphaseFVMKernels.hpp | 3 +- .../ThermalSinglePhaseBaseKernels.hpp | 2 +- .../ThermalSinglePhaseFVMKernels.hpp | 3 +- .../wells/CompositionalMultiphaseWell.cpp | 18 +++---- .../fluidFlow/wells/SinglePhaseWell.cpp | 3 +- .../fluidFlow/wells/SinglePhaseWell.hpp | 2 - .../fluidFlow/wells/WellSolverBase.cpp | 2 +- .../CompositionalMultiphaseWellKernels.cpp | 0 .../CompositionalMultiphaseWellKernels.hpp | 2 +- .../{ => kernels}/PerforationFluxKernels.hpp | 0 .../{ => kernels}/SinglePhaseWellKernels.cpp | 2 +- .../{ => kernels}/SinglePhaseWellKernels.hpp | 0 ...rmalCompositionalMultiphaseWellKernels.hpp | 3 +- .../ThermalSinglePhaseWellKernels.hpp | 0 ...mpositionalMultiphaseReservoirAndWells.cpp | 2 +- ...mpositionalMultiphaseReservoirAndWells.hpp | 1 + .../CoupledReservoirAndWellKernels.hpp | 2 +- .../SinglePhaseReservoirAndWells.cpp | 2 +- .../SinglePhaseReservoirAndWells.hpp | 1 + ...ePhasePoromechanicsConformingFractures.hpp | 4 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 4 +- .../testSinglePhaseBaseKernels.cpp | 2 +- ...eservoirCompositionalMultiphaseMSWells.cpp | 2 +- ...eservoirCompositionalMultiphaseSSWells.cpp | 2 +- ...eservoirCompositionalMultiphaseMSWells.cpp | 2 +- .../testReservoirSinglePhaseMSWells.cpp | 2 +- ...eservoirCompositionalMultiphaseMSWells.cpp | 2 +- ...eservoirCompositionalMultiphaseSSWells.cpp | 2 +- 61 files changed, 113 insertions(+), 120 deletions(-) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/CompositionalMultiphaseHybridFVMKernels.cpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/CompositionalMultiphaseHybridFVMKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/DissipationCompositionalMultiphaseFVMKernels.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/FlowSolverBaseKernels.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/FluxKernelsHelper.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/HybridFVMHelperKernels.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/IsothermalCompositionalMultiphaseBaseKernels.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/IsothermalCompositionalMultiphaseFVMKernels.cpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/IsothermalCompositionalMultiphaseFVMKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/ReactiveCompositionalMultiphaseOBLKernels.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/SinglePhaseBaseKernels.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/SinglePhaseFVMKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/SinglePhaseHybridFVMKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/SinglePhaseProppantBaseKernels.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/SinglePhaseProppantFluxKernels.cpp (98%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/SinglePhaseProppantFluxKernels.hpp (95%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/StabilizedCompositionalMultiphaseFVMKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/StabilizedSinglePhaseFVMKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/ThermalCompositionalMultiphaseBaseKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/ThermalCompositionalMultiphaseFVMKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/ThermalSinglePhaseBaseKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/{ => kernels}/ThermalSinglePhaseFVMKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/wells/{ => kernels}/CompositionalMultiphaseWellKernels.cpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/wells/{ => kernels}/CompositionalMultiphaseWellKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/wells/{ => kernels}/PerforationFluxKernels.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/wells/{ => kernels}/SinglePhaseWellKernels.cpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/wells/{ => kernels}/SinglePhaseWellKernels.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/wells/{ => kernels}/ThermalCompositionalMultiphaseWellKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/wells/{ => kernels}/ThermalSinglePhaseWellKernels.hpp (100%) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt index 0f9bb90d40e..8fae050093f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt @@ -4,51 +4,51 @@ set( physicsSolvers_headers fluidFlow/CompositionalMultiphaseBase.hpp fluidFlow/CompositionalMultiphaseBaseFields.hpp fluidFlow/CompositionalMultiphaseStatistics.hpp - fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp - fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp + fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp + fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp fluidFlow/CompositionalMultiphaseFVM.hpp - fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp - fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp - fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp + fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp + fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp + fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp fluidFlow/CompositionalMultiphaseHybridFVM.hpp - fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp + fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.hpp fluidFlow/CompositionalMultiphaseUtilities.hpp fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp - fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp + fluidFlow/kernels/ReactiveCompositionalMultiphaseOBLKernels.hpp fluidFlow/FlowSolverBase.hpp fluidFlow/FlowSolverBaseFields.hpp - fluidFlow/FlowSolverBaseKernels.hpp - fluidFlow/FluxKernelsHelper.hpp - fluidFlow/HybridFVMHelperKernels.hpp + fluidFlow/kernels/FlowSolverBaseKernels.hpp + fluidFlow/kernels/FluxKernelsHelper.hpp + fluidFlow/kernels/HybridFVMHelperKernels.hpp fluidFlow/SourceFluxStatistics.hpp fluidFlow/proppantTransport/ProppantTransport.hpp fluidFlow/proppantTransport/ProppantTransportFields.hpp fluidFlow/proppantTransport/ProppantTransportKernels.hpp fluidFlow/SinglePhaseBase.hpp fluidFlow/SinglePhaseBaseFields.hpp - fluidFlow/SinglePhaseBaseKernels.hpp + fluidFlow/kernels/SinglePhaseBaseKernels.hpp fluidFlow/SinglePhaseStatistics.hpp fluidFlow/SinglePhaseFVM.hpp - fluidFlow/SinglePhaseFVMKernels.hpp + fluidFlow/kernels/SinglePhaseFVMKernels.hpp fluidFlow/SinglePhaseHybridFVM.hpp - fluidFlow/SinglePhaseHybridFVMKernels.hpp + fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp fluidFlow/SinglePhaseProppantBase.hpp - fluidFlow/SinglePhaseProppantBaseKernels.hpp - fluidFlow/SinglePhaseProppantFluxKernels.hpp - fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp - fluidFlow/StabilizedSinglePhaseFVMKernels.hpp + fluidFlow/kernels/SinglePhaseProppantBaseKernels.hpp + fluidFlow/kernels/SinglePhaseProppantFluxKernels.hpp + fluidFlow/kernels/StabilizedCompositionalMultiphaseFVMKernels.hpp + fluidFlow/kernels/StabilizedSinglePhaseFVMKernels.hpp fluidFlow/StencilAccessors.hpp fluidFlow/StencilDataCollection.hpp - fluidFlow/ThermalSinglePhaseBaseKernels.hpp - fluidFlow/ThermalSinglePhaseFVMKernels.hpp + fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp + fluidFlow/kernels/ThermalSinglePhaseFVMKernels.hpp fluidFlow/LogLevelsInfo.hpp fluidFlow/wells/CompositionalMultiphaseWell.hpp fluidFlow/wells/CompositionalMultiphaseWellFields.hpp - fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp + fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp fluidFlow/wells/SinglePhaseWell.hpp fluidFlow/wells/SinglePhaseWellFields.hpp - fluidFlow/wells/SinglePhaseWellKernels.hpp + fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp fluidFlow/wells/WellConstants.hpp fluidFlow/wells/WellControls.hpp fluidFlow/wells/WellSolverBase.hpp @@ -62,9 +62,9 @@ set( physicsSolvers_sources fluidFlow/CompositionalMultiphaseBase.cpp fluidFlow/CompositionalMultiphaseFVM.cpp fluidFlow/CompositionalMultiphaseStatistics.cpp - fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp + fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.cpp fluidFlow/CompositionalMultiphaseHybridFVM.cpp - fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp + fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.cpp fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp fluidFlow/FlowSolverBase.cpp fluidFlow/proppantTransport/ProppantTransport.cpp @@ -74,13 +74,13 @@ set( physicsSolvers_sources fluidFlow/SinglePhaseFVM.cpp fluidFlow/SinglePhaseHybridFVM.cpp fluidFlow/SinglePhaseProppantBase.cpp - fluidFlow/SinglePhaseProppantFluxKernels.cpp + fluidFlow/kernels/SinglePhaseProppantFluxKernels.cpp fluidFlow/SourceFluxStatistics.cpp fluidFlow/StencilDataCollection.cpp fluidFlow/wells/CompositionalMultiphaseWell.cpp - fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp + fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp fluidFlow/wells/SinglePhaseWell.cpp - fluidFlow/wells/SinglePhaseWellKernels.cpp + fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp fluidFlow/wells/WellControls.cpp fluidFlow/wells/WellSolverBase.cpp PARENT_SCOPE ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 8352cf9df02..f2df0543a0e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -41,9 +41,9 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp" // TODO this should not be here +#include "physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp" #if defined( __INTEL_COMPILER ) #pragma GCC optimize "O0" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 6cc16ac80d2..1c271ce6203 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -34,14 +34,14 @@ #include "finiteVolume/FluxApproximationBase.hpp" #include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/StabilizedCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/DissipationCompositionalMultiphaseFVMKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index de26c964a42..4d85ccd30ab 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -28,11 +28,10 @@ #include "finiteVolume/HybridMimeticDiscretization.hpp" #include "finiteVolume/MimeticInnerProductDispatch.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" /** * @namespace the geos namespace that encapsulates the majority of the code diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp index c40cd769f20..b485cc60657 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp @@ -30,8 +30,8 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp" #include "physicsSolvers/fluidFlow/LogLevelsInfo.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index febda3b3305..9ef380dc47f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -31,9 +31,9 @@ #include "finiteVolume/FiniteVolumeManager.hpp" #include "finiteVolume/FluxApproximationBase.hpp" #include "mesh/DomainPartition.hpp" -#include "physicsSolvers/fluidFlow/FluxKernelsHelper.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/FlowSolverBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index e7fdcab4e33..494a15a73bd 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -29,9 +29,9 @@ #include "finiteVolume/FluxApproximationBase.hpp" #include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" -#include "physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp" +#include "physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp" +#include "physicsSolvers/fluidFlow/kernels/ReactiveCompositionalMultiphaseOBLKernels.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 29bb60d7ad2..71f9fd1a279 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -40,8 +40,8 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index 59ad25124b4..36fff6b6f1d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -21,8 +21,8 @@ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEBASE_HPP_ #include "physicsSolvers/fluidFlow/FlowSolverBase.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "constitutive/solid/CoupledSolidBase.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index c8d92164d2d..190a3e717de 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -33,13 +33,12 @@ #include "fieldSpecification/AquiferBoundaryCondition.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp" - -#include "physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/StabilizedSinglePhaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 463e3107052..e822c19735d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -28,7 +28,7 @@ #include "mainInterface/ProblemManager.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp" /** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp index b366754090f..8019edb5d63 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp @@ -27,7 +27,7 @@ #include "constitutive/solid/ProppantSolid.hpp" #include "constitutive/solid/porosity/ProppantPorosity.hpp" #include "physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseProppantBaseKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp index 44be8ac53ac..3b08616102f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp @@ -22,9 +22,9 @@ #include "mainInterface/ProblemManager.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/LogLevelsInfo.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.cpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.cpp index 5ad239a5a1b..4e698041b4c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.cpp @@ -18,14 +18,14 @@ */ #include "CompositionalMultiphaseHybridFVMKernels.hpp" -#include "CompositionalMultiphaseUtilities.hpp" #include "finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp" #include "finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp" #include "finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" +#include "physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.hpp index 76c203e1087..eb147ed4e92 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.hpp @@ -31,8 +31,8 @@ #include "mesh/ElementRegionManager.hpp" #include "mesh/ObjectManagerBase.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/DissipationCompositionalMultiphaseFVMKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/DissipationCompositionalMultiphaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/DissipationCompositionalMultiphaseFVMKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/FlowSolverBaseKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/FlowSolverBaseKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FluxKernelsHelper.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/FluxKernelsHelper.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp index 5a61816e13c..0e4ae5ba2b4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FluxKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp @@ -25,6 +25,7 @@ #include "finiteVolume/BoundaryStencil.hpp" #include "linearAlgebra/interfaces/InterfaceTypes.hpp" #include "mesh/ElementRegionManager.hpp" +#include "fieldSpecification/AquiferBoundaryCondition.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.cpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.cpp index 6670a649a03..0f878628377 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.cpp @@ -18,7 +18,7 @@ */ #include "IsothermalCompositionalMultiphaseFVMKernels.hpp" -#include "CompositionalMultiphaseUtilities.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" #include "finiteVolume/CellElementStencilTPFA.hpp" #include "finiteVolume/SurfaceElementStencil.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp index 08359bc0d6a..a4c30ca1f43 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp @@ -39,16 +39,16 @@ #include "constitutive/solid/porosity/PorosityBase.hpp" #include "constitutive/solid/porosity/PorosityFields.hpp" #include "fieldSpecification/AquiferBoundaryCondition.hpp" +#include "finiteVolume/FluxApproximationBase.hpp" #include "finiteVolume/BoundaryStencil.hpp" #include "mesh/ElementRegionManager.hpp" #include "mesh/utilities/MeshMapUtilities.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "finiteVolume/FluxApproximationBase.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ReactiveCompositionalMultiphaseOBLKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/ReactiveCompositionalMultiphaseOBLKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp index 0a04b330ae9..aedfd20f7a7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp @@ -35,9 +35,9 @@ #include "linearAlgebra/interfaces/InterfaceTypes.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/FluxKernelsHelper.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp index 70561588c2b..e625abbc7b8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp @@ -35,10 +35,10 @@ #include "denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp" #include "mesh/MeshLevel.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/HybridFVMHelperKernels.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp" #include "physicsSolvers/PhysicsSolverBaseKernels.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantBaseKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBaseKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantBaseKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.cpp similarity index 98% rename from src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.cpp index 63f3f538b8e..193fc117989 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.cpp @@ -17,10 +17,10 @@ * @file singlePhaseProppantFluxKernels.cpp */ -#include "physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/FluxKernelsHelper.hpp" #include "SinglePhaseProppantFluxKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" + namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.hpp similarity index 95% rename from src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.hpp index d64e374f9d2..69b50bb2f82 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantFluxKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.hpp @@ -21,12 +21,8 @@ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEPROPPANTFLUXKERNELS_HPP #include "common/DataTypes.hpp" -#include "finiteVolume/BoundaryStencil.hpp" -#include "finiteVolume/FluxApproximationBase.hpp" -#include "common/GEOS_RAJA_Interface.hpp" -#include "linearAlgebra/interfaces/InterfaceTypes.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp" - +#include "mesh/ElementRegionManager.hpp" +#include "finiteVolume/SurfaceElementStencil.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedCompositionalMultiphaseFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedCompositionalMultiphaseFVMKernels.hpp index 7da02f8d6e2..7e249ed0ab7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedCompositionalMultiphaseFVMKernels.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedSinglePhaseFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedSinglePhaseFVMKernels.hpp index 23dcfafea9d..98963a98ea2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StabilizedSinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedSinglePhaseFVMKernels.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDSINGLEPHASEFVMKERNELS_HPP #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDSINGLEPHASEFVMKERNELS_HPP -#include "physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp index 319e07ff5a1..717ff1a3e60 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -20,9 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEBASEKERNELS_HPP #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEBASEKERNELS_HPP -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" - -#include "common/Units.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp index 98d4be4d813..1ac47cb3ba6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp @@ -20,10 +20,11 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp" + #include "constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp" #include "constitutive/thermalConductivity/ThermalConductivityFields.hpp" #include "constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseFVMKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp index 81af9cf471e..d17b79e308c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALSINGLEPHASEBASEKERNELS_HPP #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALSINGLEPHASEBASEKERNELS_HPP -#include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseFVMKernels.hpp index b108ae79339..ec28bf14e5b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ThermalSinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseFVMKernels.hpp @@ -20,10 +20,11 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALSINGLEPHASEFVMKERNELS_HPP #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALSINGLEPHASEFVMKERNELS_HPP +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" + #include "constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp" #include "constitutive/thermalConductivity/ThermalConductivityFields.hpp" #include "constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index a8497caee6a..d77669b68d1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -19,7 +19,6 @@ #include "CompositionalMultiphaseWell.hpp" - #include "codingUtilities/Utilities.hpp" #include "common/DataTypes.hpp" #include "common/FieldSpecificationOps.hpp" @@ -35,19 +34,16 @@ #include "mesh/PerforationFields.hpp" #include "mesh/WellElementSubRegion.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" -#include "physicsSolvers/fluidFlow/wells/PerforationFluxKernels.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/ThermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" -#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" - -#include "physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp" -#include "physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/wells/WellFields.hpp" +#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" - -#include "physicsSolvers/fluidFlow/wells/WellFields.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/PerforationFluxKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp" #if defined( __INTEL_COMPILER ) #pragma GCC optimize "O0" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index 2d33e7ca6e5..6cf1a348ca1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -30,11 +30,12 @@ #include "mesh/WellElementSubRegion.hpp" #include "mesh/PerforationFields.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp" -#include "physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp index 8de8d0479fd..0efd50fe286 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp @@ -21,8 +21,6 @@ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_SINGLEPHASEWELL_HPP_ #include "WellSolverBase.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index 51b3e2f12b6..cabe5524cac 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -28,7 +28,7 @@ #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" -#include "physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp" #include "fileIO/Outputs/OutputBase.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.cpp rename to src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp index c49d68e836d..422d4d2f75c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp @@ -32,8 +32,8 @@ #include "physicsSolvers/KernelLaunchSelectors.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/IsothermalCompositionalMultiphaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/PerforationFluxKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/PerforationFluxKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/wells/PerforationFluxKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/PerforationFluxKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp rename to src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp index f006802654c..a2446c60b6a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp @@ -20,7 +20,7 @@ #include "SinglePhaseWellKernels.hpp" // TODO: move keys to WellControls -#include "SinglePhaseWell.hpp" +#include "physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp index dd2f72d1b6e..bbef327079f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalCompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp @@ -19,8 +19,9 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_THERMALCOMPOSITIONALMULTIPHASEWELLKERNELS_HPP #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_THERMALCOMPOSITIONALMULTIPHASEWELLKERNELS_HPP -#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/PhysicsSolverBaseKernels.hpp" + namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalSinglePhaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalSinglePhaseWellKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/wells/ThermalSinglePhaseWellKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalSinglePhaseWellKernels.hpp diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index 50a08208ff5..9cb0333497d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -30,8 +30,8 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" -#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" #include "physicsSolvers/multiphysics/MultiphasePoromechanics.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index 5471165b05b..7b3a25a82a5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -22,6 +22,7 @@ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_COMPOSITIONALMULTIPHASERESERVOIRANDWELLS_HPP_ #include "physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp index 91b568e6eab..9899606e970 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp @@ -23,7 +23,7 @@ #include "common/DataTypes.hpp" #include "common/GEOS_RAJA_Interface.hpp" #include "constitutive/fluid/multifluid/Layouts.hpp" -#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellTags.hpp" #include "physicsSolvers/fluidFlow/wells/WellFields.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index 8a70deb0ab2..0ccdd95f91a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -25,8 +25,8 @@ #include "physicsSolvers/KernelLaunchSelectors.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseFVM.hpp" #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp" -#include "physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 28caba5410e..9e4cc906a9f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -22,6 +22,7 @@ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_SINGLEPHASERESERVOIRANDWELLS_HPP_ #include "physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp" +#include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp index d7e85611e44..ee3a42f03ba 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp @@ -20,8 +20,8 @@ #ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_SINGLEPHASEPOROMECHANICSCONFORMINGFRACTURES_HPP #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_SINGLEPHASEPOROMECHANICSCONFORMINGFRACTURES_HPP -#include "physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/FluxKernelsHelper.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp index 4597b737554..cbede85d1d3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -20,8 +20,8 @@ #ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_SINGLEPHASEPOROMECHANICSEMBEDDEDFRACTURES_HPP #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_SINGLEPHASEPOROMECHANICSEMBEDDEDFRACTURES_HPP -#include "physicsSolvers/fluidFlow/SinglePhaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/FluxKernelsHelper.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" namespace geos { diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp index 03f0b903e14..cb4c3c98944 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp @@ -15,7 +15,7 @@ // Source includes #include "mainInterface/initialization.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" // TPL includes #include diff --git a/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp index 84362ec0698..a84c14960a7 100644 --- a/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp @@ -25,9 +25,9 @@ #include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp" -#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" using namespace geos; using namespace geos::dataRepository; diff --git a/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp index b7b63b1033e..59bf3765590 100644 --- a/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp @@ -25,9 +25,9 @@ #include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp" -#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" using namespace geos; using namespace geos::dataRepository; diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp index f69e0b5cb2c..bc18b9af46d 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp @@ -26,7 +26,7 @@ #include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp" -#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp index c54c1419c40..7441e826c27 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp @@ -27,7 +27,7 @@ #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseFVM.hpp" #include "physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp" -#include "physicsSolvers/fluidFlow/wells/SinglePhaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" diff --git a/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp index 3e6114d9c18..e87c1c823e5 100644 --- a/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp @@ -25,9 +25,9 @@ #include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp" -#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" using namespace geos; using namespace geos::dataRepository; diff --git a/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp index 47c0503a29c..11d96b731fd 100644 --- a/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp @@ -25,9 +25,9 @@ #include "physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp" -#include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" using namespace geos; using namespace geos::dataRepository; From 6d72301875a7d9ed129a64c6266a4e9996d648b2 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 5 Nov 2024 14:23:10 -0600 Subject: [PATCH 232/286] refactor: Remove NoOpFunc duplicates (#3370) * move into folder and clean up includes * Remove duplicates of NoOpFunc * Update SinglePhasePoromechanicsEmbeddedFractures.hpp --------- Co-authored-by: Pavel Tomin --- .../kernels/SinglePhaseBaseKernels.hpp | 14 +------------- .../kernels/SinglePhaseFVMKernels.hpp | 17 +++++++++-------- .../kernels/SinglePhaseHybridFVMKernels.hpp | 5 +++-- .../MultiphasePoromechanics.hpp | 6 +++--- ...ePhasePoromechanicsConformingFractures.hpp | 9 +++++---- .../SinglePhasePoromechanicsEFEM.hpp | 19 +++---------------- ...glePhasePoromechanicsEmbeddedFractures.hpp | 5 +++-- 7 files changed, 27 insertions(+), 48 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp index 2141e538b27..d51885d0443 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp @@ -28,6 +28,7 @@ #include "linearAlgebra/interfaces/InterfaceTypes.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/PhysicsSolverBaseKernels.hpp" +#include "codingUtilities/Utilities.hpp" namespace geos { @@ -100,19 +101,6 @@ struct MobilityKernel /******************************** ElementBasedAssemblyKernel ********************************/ -/** - * @brief Internal struct to provide no-op defaults used in the inclusion - * of lambda functions into kernel component functions. - * @struct NoOpFunc - */ -struct NoOpFunc -{ - template< typename ... Ts > - GEOS_HOST_DEVICE - constexpr void - operator()( Ts && ... ) const {} -}; - /** * @class ElementBasedAssemblyKernel * @brief Define the interface for the assembly kernel in charge of accumulation diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp index aedfd20f7a7..cd1e04516c1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp @@ -38,6 +38,7 @@ #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" #include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" +#include "codingUtilities/Utilities.hpp" namespace geos { @@ -326,11 +327,11 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase * @param[inout] stack the stack variables * @param[in] NoOpFunc the function used to customize the computation of the flux */ - template< typename FUNC = singlePhaseBaseKernels::NoOpFunc > + template< typename FUNC = NoOpFunc > GEOS_HOST_DEVICE void computeFlux( localIndex const iconn, StackVariables & stack, - FUNC && kernelOp = singlePhaseBaseKernels::NoOpFunc{} ) const + FUNC && kernelOp = NoOpFunc{} ) const { // first, compute the transmissibilities at this face m_stencilWrapper.computeWeights( iconn, @@ -398,11 +399,11 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase * @param[in] iconn the connection index * @param[inout] stack the stack variables */ - template< typename FUNC = singlePhaseBaseKernels::NoOpFunc > + template< typename FUNC = NoOpFunc > GEOS_HOST_DEVICE void complete( localIndex const iconn, StackVariables & stack, - FUNC && kernelOp = singlePhaseBaseKernels::NoOpFunc{} ) const + FUNC && kernelOp = NoOpFunc{} ) const { // add contribution to residual and jacobian into: // - the mass balance equation @@ -658,11 +659,11 @@ class DirichletFaceBasedAssemblyKernel : public FaceBasedAssemblyKernel< NUM_EQN * @param[inout] stack the stack variables * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes */ - template< typename FUNC = singlePhaseBaseKernels::NoOpFunc > + template< typename FUNC = NoOpFunc > GEOS_HOST_DEVICE void computeFlux( localIndex const iconn, StackVariables & stack, - FUNC && compFluxKernelOp = singlePhaseBaseKernels::NoOpFunc{} ) const + FUNC && compFluxKernelOp = NoOpFunc{} ) const { using Order = BoundaryStencil::Order; localIndex constexpr numElems = BoundaryStencil::maxNumPointsInFlux; @@ -724,11 +725,11 @@ class DirichletFaceBasedAssemblyKernel : public FaceBasedAssemblyKernel< NUM_EQN * @param[in] iconn the connection index * @param[inout] stack the stack variables */ - template< typename FUNC = singlePhaseBaseKernels::NoOpFunc > + template< typename FUNC = NoOpFunc > GEOS_HOST_DEVICE void complete( localIndex const iconn, StackVariables & stack, - FUNC && assemblyKernelOp = singlePhaseBaseKernels::NoOpFunc{} ) const + FUNC && assemblyKernelOp = NoOpFunc{} ) const { using Order = BoundaryStencil::Order; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp index e625abbc7b8..d2fc6b39da9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp @@ -40,6 +40,7 @@ #include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp" #include "physicsSolvers/PhysicsSolverBaseKernels.hpp" +#include "codingUtilities/Utilities.hpp" namespace geos { @@ -479,11 +480,11 @@ class ElementBasedAssemblyKernel * @param[inout] stack the stack variables * @param[in] kernelOp the function used to customize the kernel */ - template< typename FUNC = singlePhaseBaseKernels::NoOpFunc > + template< typename FUNC = NoOpFunc > GEOS_HOST_DEVICE void compute( localIndex const ei, StackVariables & stack, - FUNC && kernelOp = singlePhaseBaseKernels::NoOpFunc{} ) const + FUNC && kernelOp = NoOpFunc{} ) const { GEOS_UNUSED_VAR( ei, stack, kernelOp ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp index a0f81fce935..b3079a9e8c5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp @@ -20,10 +20,10 @@ #ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_MULTIPHASEPOROMECHANICS_HPP_ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_MULTIPHASEPOROMECHANICS_HPP_ -#include "codingUtilities/Utilities.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" -#include "physicsSolvers/multiphysics/PoromechanicsFields.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp" +#include "physicsSolvers/multiphysics/PoromechanicsFields.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" +#include "codingUtilities/Utilities.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp index ee3a42f03ba..84e68734d4a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp @@ -22,6 +22,7 @@ #include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" #include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" +#include "codingUtilities/Utilities.hpp" namespace geos { @@ -155,11 +156,11 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse * @param[inout] stack the stack variables * @param[in] NoOpFunc the function used to customize the computation of the flux */ - template< typename FUNC = singlePhaseBaseKernels::NoOpFunc > + template< typename FUNC = NoOpFunc > GEOS_HOST_DEVICE void computeFlux( localIndex const iconn, StackVariables & stack, - FUNC && kernelOp = singlePhaseBaseKernels::NoOpFunc{} ) const + FUNC && kernelOp = NoOpFunc{} ) const { @@ -235,11 +236,11 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse * @param[in] iconn the connection index * @param[inout] stack the stack variables */ - template< typename FUNC = singlePhaseBaseKernels::NoOpFunc > + template< typename FUNC = NoOpFunc > GEOS_HOST_DEVICE void complete( localIndex const iconn, StackVariables & stack, - FUNC && kernelOp = singlePhaseBaseKernels::NoOpFunc{} ) const + FUNC && kernelOp = NoOpFunc{} ) const { // Call Base::complete to assemble the mass balance equations // In the lambda, fill the dR_dAper matrix diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp index 3f614829d9a..5f8fcdac2a5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp @@ -21,6 +21,7 @@ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_SINGLEPHASEPOROMECHANICSEFEM_HPP_ #include "finiteElement/kernelInterface/ImplicitKernelBase.hpp" +#include "codingUtilities/Utilities.hpp" namespace geos { @@ -28,20 +29,6 @@ namespace geos namespace poromechanicsEFEMKernels { -/** - * @brief Internal struct to provide no-op defaults used in the inclusion - * of lambda functions into kernel component functions. - * @struct NoOpFunc - */ -struct NoOpFunc -{ - template< typename ... Ts > - GEOS_HOST_DEVICE - constexpr void - operator()( Ts && ... ) const {} -}; - - template< typename SUBREGION_TYPE, typename CONSTITUTIVE_TYPE, typename FE_TYPE > @@ -220,12 +207,12 @@ class SinglePhasePoromechanicsEFEM : void setup( localIndex const k, StackVariables & stack ) const; - template< typename FUNC = poromechanicsEFEMKernels::NoOpFunc > + template< typename FUNC = NoOpFunc > GEOS_HOST_DEVICE void quadraturePointKernel( localIndex const k, localIndex const q, StackVariables & stack, - FUNC && kernelOp = poromechanicsEFEMKernels::NoOpFunc{} ) const; + FUNC && kernelOp = NoOpFunc{} ) const; /** * @copydoc geos::finiteElement::ImplicitKernelBase::complete diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp index cbede85d1d3..5092012e423 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -22,6 +22,7 @@ #include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" #include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" +#include "codingUtilities/Utilities.hpp" namespace geos { @@ -150,11 +151,11 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse * @param[inout] stack the stack variables * @param[in] NoOpFunc the function used to customize the computation of the flux */ - template< typename FUNC = singlePhaseBaseKernels::NoOpFunc > + template< typename FUNC = NoOpFunc > GEOS_HOST_DEVICE void computeFlux( localIndex const iconn, StackVariables & stack, - FUNC && kernelOp = singlePhaseBaseKernels::NoOpFunc{} ) const + FUNC && kernelOp = NoOpFunc{} ) const { From e3445a3148f2cb342c6d3ff6318ca712294fe631 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 5 Nov 2024 19:08:01 -0600 Subject: [PATCH 233/286] fix: two hard crash fixes (#3382) --- .../constitutive/fluid/multifluid/MultiFluidBase.cpp | 6 ++++++ .../constitutive/fluid/multifluid/MultiFluidBase.hpp | 2 ++ src/coreComponents/events/EventManager.cpp | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp index a0d1157a022..1afc822b97b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp @@ -180,6 +180,12 @@ void MultiFluidBase::postInputInitialization() GEOS_THROW_IF_NE_MSG( m_componentMolarWeight.size(), numComp, GEOS_FMT( "{}: invalid number of values in attribute '{}'", getFullName(), viewKeyStruct::componentMolarWeightString() ), InputError ); + for( integer ic = 0; ic < numComp; ++ic ) + { + GEOS_THROW_IF_LT_MSG( m_componentMolarWeight[ic], LvArray::NumericLimits< real64 >::epsilon, + GEOS_FMT( "{}: zero molecular weight found for component {}", getFullName(), m_componentNames[ic] ), + InputError ); + } // call to correctly set member array tertiary sizes on the 'main' material object resizeFields( 0, 0 ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp index 802f9a921bf..97a3acff8a5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp @@ -783,12 +783,14 @@ MultiFluidBase::KernelWrapper:: real64 totalMolality = 0.0; for( integer ic = 0; ic < numComps; ++ic ) { + // component weight can not be zero, checked in MultiFluidBase::postInputInitialization real64 const mwInv = 1.0 / m_componentMolarWeight[ic]; compMoleFrac[ic] = composition[ic] * mwInv; // this is molality (units of mole/mass) dCompMoleFrac_dCompMassFrac[ic][ic] = mwInv; totalMolality += compMoleFrac[ic]; } + GEOS_ERROR_IF( totalMolality < LvArray::NumericLimits< real64 >::epsilon, "Zero total molality, all component concentrations are equal to zero." ); real64 const totalMolalityInv = 1.0 / totalMolality; for( integer ic = 0; ic < numComps; ++ic ) { diff --git a/src/coreComponents/events/EventManager.cpp b/src/coreComponents/events/EventManager.cpp index 11515e27574..8e176f41d4a 100644 --- a/src/coreComponents/events/EventManager.cpp +++ b/src/coreComponents/events/EventManager.cpp @@ -54,7 +54,7 @@ EventManager::EventManager( string const & name, setDescription( "Start simulation time for the global event loop." ); registerWrapper( viewKeyStruct::maxTimeString(), &m_maxTime ). - setApplyDefaultValue( std::numeric_limits< real64 >::max() ). + setApplyDefaultValue( 10000 * units::YearSeconds ). // 10000 years setInputFlag( InputFlags::OPTIONAL ). setDescription( "Maximum simulation time for the global event loop. Disabled by default." ); From 9db5dbf49e3062c4583ca91d893c8452523afcc0 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Wed, 6 Nov 2024 07:58:46 -0800 Subject: [PATCH 234/286] fix: EFEM bugfixes - effective traction + oldStress (#3408) Co-authored-by: Guotong-Ren <133127368+Guotong-Ren@users.noreply.github.com> --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 +++ .../constitutive/solid/CoupledSolidBase.hpp | 8 ++++++ .../TwoPointFluxApproximation.cpp | 2 +- .../contact/SolidMechanicsEFEMKernels.hpp | 3 +- .../contact/SolidMechanicsEFEMKernelsBase.hpp | 16 +++++++++++ ...glePhasePoromechanicsEmbeddedFractures.cpp | 7 ++--- .../SinglePhasePoromechanicsEFEM.hpp | 28 +++++++++++-------- .../SinglePhasePoromechanicsEFEM_impl.hpp | 27 +++++++++++++++--- 9 files changed, 74 insertions(+), 23 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index b1c3cc5d477..10e550a6c13 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3280-8463-4595d21 + baseline: integratedTests/baseline_integratedTests-pr3408-8504-5db9ba0 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index ff9e76e27f3..cc7aecdfb34 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3408 (2024-11-06) +==================== +EFEM bugfixes: effective traction + oldStress. + PR #3280 (2024-11-05) ==================== Added Sprig-slider test. diff --git a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp index 0facab675ca..abeb42ffb23 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp +++ b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp @@ -170,6 +170,14 @@ class CoupledSolidBase : public ConstitutiveBase return getBaseSolidModel().getDensity(); } + /* + * @brief get the current solid effective stress + * return a constant arrayView3d to effective stress in Voigt form + */ + arrayView3d< real64 const, solid::STRESS_USD > const getEffectiveStress() const + { + return getBaseSolidModel().getStress(); + } /* * @brief get the current biot coefficient diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp index 7ce80ad8d6d..ab28f40a6ea 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp @@ -591,7 +591,7 @@ void TwoPointFluxApproximation::addFractureMatrixConnectionsEDFM( MeshLevel & me stencilCellsRegionIndex[1] = fractureRegionIndex; stencilCellsSubRegionIndex[1] = 0; stencilCellsIndex[1] = kes; - stencilWeights[1] = 4. * faceArea[fractureRegionIndex] / hydraulicAperture[fractureRegionIndex][0][kes]; + stencilWeights[1] = 4. * faceArea[kes] / hydraulicAperture[fractureRegionIndex][0][kes]; edfmStencil.add( 2, stencilCellsRegionIndex.data(), diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp index 236637a6e35..f683446af4b 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp @@ -220,8 +220,9 @@ class EFEM : // Compute the local residuals LvArray::tensorOps::Ri_add_AijBj< 3, 3 >( stack.localRw, stack.localKww, stack.wLocal ); - LvArray::tensorOps::Ri_add_AijBj< 3, nUdof >( stack.localRw, stack.localKwu, stack.uLocal ); LvArray::tensorOps::Ri_add_AijBj< nUdof, 3 >( stack.localRu, stack.localKuw, stack.wLocal ); + // add EqM * effStress into the residual of enrichment nodes + LvArray::tensorOps::add< 3 >( stack.localRw, stack.localEqMStress ); // Add traction contribution LvArray::tensorOps::scaledAdd< 3 >( stack.localRw, stack.tractionVec, -1 ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp index f04b533fb39..5f1c22b7c19 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp @@ -107,6 +107,7 @@ class EFEMKernelsBase : inputDt, inputGravityVector ), m_w( embeddedSurfSubRegion.getField< fields::contact::dispJump >().toView() ), + m_effStress( inputConstitutiveType.getStress()), m_tractionVec( embeddedSurfSubRegion.getField< fields::contact::traction >().toViewConst() ), m_dTraction_dJump( embeddedSurfSubRegion.getField< fields::contact::dTraction_dJump >().toViewConst() ), m_nVec( embeddedSurfSubRegion.getNormalVector().toViewConst() ), @@ -144,6 +145,7 @@ class EFEMKernelsBase : localKww{ { 0.0 } }, localKwu{ { 0.0 } }, localKuw{ { 0.0 } }, + localEqMStress{ 0.0 }, wLocal(), uLocal(), hInv(), @@ -171,6 +173,9 @@ class EFEMKernelsBase : /// C-array storage for the element local Kuw matrix. real64 localKuw[numUdofs][numWdofs]; + /// C-array storage for the element local EqM*effStress vector. + real64 localEqMStress[numWdofs]; + /// Stack storage for the element local jump vector real64 wLocal[3]; @@ -249,6 +254,9 @@ class EFEMKernelsBase : // Gauss contribution to Kww, Kwu and Kuw blocks real64 Kww_gauss[3][3], Kwu_gauss[3][nUdof], Kuw_gauss[nUdof][3]; + // Gauss contirbution to eqMStress which is EqMatrix*effStress, all stresses are in Voigt notation + real64 eqMStress_gauss[3]{}; + // Compatibility, equilibrium and strain operators. The compatibility operator is constructed as // a 3 x 6 because it is more convenient for construction purposes (reduces number of local var). real64 compMatrix[3][6], strainMatrix[6][nUdof], eqMatrix[3][6]; @@ -292,17 +300,25 @@ class EFEMKernelsBase : LvArray::tensorOps::Rij_eq_AikBkj< 3, nUdof, 6 >( Kwu_gauss, matED, strainMatrix ); // transp(B)DB LvArray::tensorOps::Rij_eq_AikBjk< nUdof, 3, 6 >( Kuw_gauss, matBD, compMatrix ); + // EqMatrix * effStress + LvArray::tensorOps::Ri_eq_AijBj< 3, 6 >( eqMStress_gauss, eqMatrix, m_effStress[k][q] ); + + /// FIX: add old Equilibrium operator times oldStress (in Voigt notation) // multiply by determinant and add to element matrix LvArray::tensorOps::scaledAdd< 3, 3 >( stack.localKww, Kww_gauss, -detJ ); LvArray::tensorOps::scaledAdd< 3, nUdof >( stack.localKwu, Kwu_gauss, -detJ ); LvArray::tensorOps::scaledAdd< nUdof, 3 >( stack.localKuw, Kuw_gauss, -detJ ); + LvArray::tensorOps::scaledAdd< 3 >( stack.localEqMStress, eqMStress_gauss, -detJ ); } protected: arrayView2d< real64 > const m_w; + /// The effective stress at the current time + arrayView3d< real64 const, solid::STRESS_USD > m_effStress; + arrayView2d< real64 const > const m_tractionVec; arrayView3d< real64 const > const m_dTraction_dJump; diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 0bb0a6319c6..41541b5c375 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -489,9 +489,7 @@ void SinglePhasePoromechanicsEmbeddedFractures::updateState( DomainPartition & d arrayView1d< real64 const > const area = subRegion.getElementArea().toViewConst(); - arrayView2d< real64 > const & fractureTraction = subRegion.template getField< fields::contact::traction >(); - - arrayView1d< real64 > const & dTdpf = subRegion.template getField< fields::contact::dTraction_dPressure >(); + arrayView2d< real64 > const & fractureContactTraction = subRegion.template getField< fields::contact::traction >(); arrayView1d< real64 const > const & pressure = subRegion.template getField< fields::flow::pressure >(); @@ -524,8 +522,7 @@ void SinglePhasePoromechanicsEmbeddedFractures::updateState( DomainPartition & d aperture, oldHydraulicAperture, hydraulicAperture, - fractureTraction, - dTdpf ); + fractureContactTraction ); } ); } ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp index 5f8fcdac2a5..ad5ccf38ab1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp @@ -115,6 +115,7 @@ class SinglePhasePoromechanicsEFEM : localKww{ { 0.0 } }, localKwu{ { 0.0 } }, localKuw{ { 0.0 } }, + localEqMStress { 0.0 }, localKwpm{ 0.0 }, localKwpf( 0.0 ), wLocal(), @@ -154,6 +155,9 @@ class SinglePhasePoromechanicsEFEM : /// C-array storage for the element local Kuw matrix. real64 localKuw[numUdofs][numWdofs]; + /// C-array storage for the element local EqM*effStress vector. + real64 localEqMStress[numWdofs]; + /// C-array storage for the element local Kwpm matrix. real64 localKwpm[numWdofs]; @@ -233,6 +237,9 @@ class SinglePhasePoromechanicsEFEM : arrayView2d< real64 const > const m_w; + /// The effective stress at the current time + arrayView3d< real64 const, solid::STRESS_USD > m_effStress; + /// The global degree of freedom number arrayView1d< globalIndex const > const m_matrixPresDofNumber; @@ -249,6 +256,9 @@ class SinglePhasePoromechanicsEFEM : /// The rank-global fluid pressure array. arrayView1d< real64 const > const m_matrixPressure; + /// The rank-global fluid pressure array. + arrayView1d< real64 const > const m_fracturePressure; + /// The rank-global delta-fluid pressure array. arrayView2d< real64 const > const m_porosity_n; @@ -314,8 +324,7 @@ struct StateUpdateKernel * @param[out] deltaVolume the change in volume * @param[out] aperture the aperture * @param[out] hydraulicAperture the effecture aperture - * @param[out] fractureTraction the fracture traction - * @param[out] dFractureTraction_dPressure the derivative of the fracture traction wrt pressure + * @param[out] fractureContactTraction the fracture contact traction */ template< typename POLICY, typename POROUS_WRAPPER, typename CONTACT_WRAPPER > static void @@ -330,8 +339,7 @@ struct StateUpdateKernel arrayView1d< real64 > const & aperture, arrayView1d< real64 const > const & oldHydraulicAperture, arrayView1d< real64 > const & hydraulicAperture, - arrayView2d< real64 > const & fractureTraction, - arrayView1d< real64 > const & dFractureTraction_dPressure ) + arrayView2d< real64 > const & fractureEffectiveTraction ) { forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) { @@ -341,23 +349,21 @@ struct StateUpdateKernel real64 dHydraulicAperture_dNormalJump = 0.0; real64 dHydraulicAperture_dNormalTraction = 0.0; hydraulicAperture[k] = contactWrapper.computeHydraulicAperture( aperture[k], - fractureTraction[k][0], + fractureEffectiveTraction[k][0], dHydraulicAperture_dNormalJump, dHydraulicAperture_dNormalTraction ); deltaVolume[k] = hydraulicAperture[k] * area[k] - volume[k]; - // traction on the fracture to include the pressure contribution - fractureTraction[k][0] -= pressure[k]; - dFractureTraction_dPressure[k] = -1.0; - real64 const jump[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3 ( dispJump[k] ); - real64 const traction[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3 ( fractureTraction[k] ); + real64 const effectiveTraction[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3 ( fractureEffectiveTraction[k] ); + // all perm update models below should need effective traction instead of total traction + // (total traction is combined forces of fluid pressure and effective traction) porousMaterialWrapper.updateStateFromPressureApertureJumpAndTraction( k, 0, pressure[k], oldHydraulicAperture[k], hydraulicAperture[k], dHydraulicAperture_dNormalJump, - jump, traction ); + jump, effectiveTraction ); } ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp index 6904a047202..0aac71f9acb 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp @@ -71,6 +71,7 @@ SinglePhasePoromechanicsEFEM( NodeManager const & nodeManager, m_disp( nodeManager.getField< fields::solidMechanics::totalDisplacement >() ), m_deltaDisp( nodeManager.getField< fields::solidMechanics::incrementalDisplacement >() ), m_w( embeddedSurfSubRegion.getField< fields::contact::dispJump >() ), + m_effStress( inputConstitutiveType.getEffectiveStress()), m_matrixPresDofNumber( elementSubRegion.template getReference< array1d< globalIndex > >( inputFlowDofKey ) ), m_fracturePresDofNumber( embeddedSurfSubRegion.template getReference< array1d< globalIndex > >( inputFlowDofKey ) ), m_wDofNumber( jumpDofNumber ), @@ -80,6 +81,7 @@ SinglePhasePoromechanicsEFEM( NodeManager const & nodeManager, m_dFluidDensity_dPressure( embeddedSurfSubRegion.template getConstitutiveModel< constitutive::SingleFluidBase >( elementSubRegion.template getReference< string >( fluidModelKey ) ).dDensity_dPressure() ), m_matrixPressure( elementSubRegion.template getField< fields::flow::pressure >() ), + m_fracturePressure( embeddedSurfSubRegion.template getField< fields::flow::pressure >() ), m_porosity_n( inputConstitutiveType.getPorosity_n() ), m_tractionVec( embeddedSurfSubRegion.getField< fields::contact::traction >() ), m_dTraction_dJump( embeddedSurfSubRegion.getField< fields::contact::dTraction_dJump >() ), @@ -188,6 +190,12 @@ quadraturePointKernel( localIndex const k, FUNC && kernelOp ) const { + // The quarature kernal deals with the fracture force balance (eq. 29 in https://onlinelibrary.wiley.com/doi/epdf/10.1002/nag.3168) + // The total stress in matrix: sigma_tau = simga_eff_old + sigma_eff_incr - biot * p_m = sigma_eff_new - biot * p_m + // We can either use formulation: sigma_eff_old + stiffness_matrix * incremental_strain - biot * p_m or directly effective_stress_current + // - biot * p_m + // The latter one is adopted here. + localIndex const embSurfIndex = m_cellsToEmbeddedSurfaces[k][0]; // Get displacement: (i) basis functions (N), (ii) basis function @@ -202,6 +210,9 @@ quadraturePointKernel( localIndex const k, // Gauss contribution to Kww, Kwu and Kuw blocks real64 Kww_gauss[3][3]{}, Kwu_gauss[3][nUdof]{}, Kuw_gauss[nUdof][3]{}, Kwpm_gauss[3]{}; + // Gauss contirbution to eqMStress which is EqMatrix*effStress, all stresses are in Voigt notation + real64 eqMStress_gauss[3]{}; + // Compatibility, equilibrium and strain operators. The compatibility operator is constructed as // a 3 x 6 because it is more convenient for construction purposes (reduces number of local var). real64 compMatrix[3][6]{}, strainMatrix[6][nUdof]{}, eqMatrix[3][6]{}; @@ -247,6 +258,8 @@ quadraturePointKernel( localIndex const k, LvArray::tensorOps::Rij_eq_AikBkj< 3, nUdof, 6 >( Kwu_gauss, matED, strainMatrix ); // transp(B)DB LvArray::tensorOps::Rij_eq_AikBjk< nUdof, 3, 6 >( Kuw_gauss, matBD, compMatrix ); + // EqMatrix * effStress + LvArray::tensorOps::Ri_eq_AijBj< 3, 6 >( eqMStress_gauss, eqMatrix, m_effStress[k][q] ); LvArray::tensorOps::fill< 3 >( Kwpm_gauss, 0 ); for( int i=0; i < 3; ++i ) @@ -260,6 +273,7 @@ quadraturePointKernel( localIndex const k, LvArray::tensorOps::scaledAdd< 3, 3 >( stack.localKww, Kww_gauss, -detJ ); LvArray::tensorOps::scaledAdd< 3, nUdof >( stack.localKwu, Kwu_gauss, -detJ ); LvArray::tensorOps::scaledAdd< nUdof, 3 >( stack.localKuw, Kuw_gauss, -detJ ); + LvArray::tensorOps::scaledAdd< 3 >( stack.localEqMStress, eqMStress_gauss, -detJ ); /// TODO: should this be negative??? // I had No neg coz the total stress = effective stress - porePressure @@ -285,20 +299,25 @@ complete( localIndex const k, // Compute the local residuals LvArray::tensorOps::Ri_add_AijBj< 3, 3 >( stack.localJumpResidual, stack.localKww, stack.wLocal ); - LvArray::tensorOps::Ri_add_AijBj< 3, nUdof >( stack.localJumpResidual, stack.localKwu, stack.dispLocal ); LvArray::tensorOps::Ri_add_AijBj< nUdof, 3 >( stack.localDispResidual, stack.localKuw, stack.wLocal ); + // add EqM * effStress into the residual of enrichment nodes + LvArray::tensorOps::add< 3 >( stack.localJumpResidual, stack.localEqMStress ); // add pore pressure contribution LvArray::tensorOps::scaledAdd< 3 >( stack.localJumpResidual, stack.localKwpm, m_matrixPressure[ k ] ); localIndex const embSurfIndex = m_cellsToEmbeddedSurfaces[k][0]; - // Add traction contribution tranction + // Add total traction contribution from penalty force and fracture pressure + // total traction is T_total = -k * dispJump + pf (where dispJump < 0) + // -1 is because k*dispJump was saved in tractionVec LvArray::tensorOps::scaledAdd< 3 >( stack.localJumpResidual, stack.tractionVec, -1 ); LvArray::tensorOps::scaledAdd< 3, 3 >( stack.localKww, stack.dTractiondw, -1 ); - // JumpFractureFlowJacobian - real64 const localJumpFracPressureJacobian = -m_dTraction_dPressure[embSurfIndex] * m_surfaceArea[embSurfIndex]; + // fracture pressure only affects normal direction + stack.localJumpResidual[0] += m_fracturePressure[embSurfIndex] * m_surfaceArea[embSurfIndex]; + // fracture force balance residual w.r.t. fracture pressure + real64 const localJumpFracPressureJacobian = m_surfaceArea[embSurfIndex]; // Mass balance accumulation real64 const newVolume = m_elementVolume( embSurfIndex ) + m_deltaVolume( embSurfIndex ); From 3baea1378770e8cf7f82845f4f6d29b27efb50e6 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 6 Nov 2024 11:52:01 -0600 Subject: [PATCH 235/286] feat: keep well variables constant during poromechanics initizaliation (#3383) --- .../fluidFlow/CompositionalMultiphaseBase.cpp | 18 ++-- .../fluidFlow/CompositionalMultiphaseBase.hpp | 14 +-- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 2 +- .../fluidFlow/FlowSolverBase.cpp | 2 +- .../fluidFlow/FlowSolverBase.hpp | 8 +- .../fluidFlow/SinglePhaseBase.cpp | 18 ++-- .../fluidFlow/SinglePhaseBase.hpp | 14 +-- .../fluidFlow/SinglePhaseFVM.cpp | 2 +- .../fluidFlow/SinglePhaseHybridFVM.cpp | 2 +- .../wells/CompositionalMultiphaseWell.cpp | 100 +----------------- .../wells/CompositionalMultiphaseWell.hpp | 16 --- .../fluidFlow/wells/SinglePhaseWell.cpp | 77 -------------- .../fluidFlow/wells/SinglePhaseWell.hpp | 17 --- .../fluidFlow/wells/WellSolverBase.cpp | 66 +----------- .../fluidFlow/wells/WellSolverBase.hpp | 47 +++----- .../CoupledReservoirAndWellsBase.hpp | 7 +- .../multiphysics/PoromechanicsSolver.hpp | 2 +- 17 files changed, 65 insertions(+), 347 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index f2df0543a0e..d13a85770c1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -1451,13 +1451,13 @@ void CompositionalMultiphaseBase::applyBoundaryConditions( real64 const time_n, { GEOS_MARK_FUNCTION; - if( m_keepFlowVariablesConstantDuringInitStep ) + if( m_keepVariablesConstantDuringInitStep ) { // this function is going to force the current flow state to be constant during the time step // this is used when the poromechanics solver is performing the stress initialization // TODO: in the future, a dedicated poromechanics kernel should eliminate the flow vars to construct a reduced system // which will remove the need for this brittle passing aroung of flag - keepFlowVariablesConstantDuringInitStep( time_n, dt, dofManager, domain, localMatrix.toViewConstSizes(), localRhs.toView() ); + keepVariablesConstantDuringInitStep( time_n, dt, dofManager, domain, localMatrix.toViewConstSizes(), localRhs.toView() ); } else { @@ -1959,12 +1959,12 @@ void CompositionalMultiphaseBase::applyDirichletBC( real64 const time_n, } ); } -void CompositionalMultiphaseBase::keepFlowVariablesConstantDuringInitStep( real64 const time, - real64 const dt, - DofManager const & dofManager, - DomainPartition & domain, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const +void CompositionalMultiphaseBase::keepVariablesConstantDuringInitStep( real64 const time, + real64 const dt, + DofManager const & dofManager, + DomainPartition & domain, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) const { GEOS_MARK_FUNCTION; @@ -2447,7 +2447,7 @@ void CompositionalMultiphaseBase::implicitStepComplete( real64 const & time, // Step 3: save the converged solid state string const & solidName = subRegion.getReference< string >( viewKeyStruct::solidNamesString() ); CoupledSolidBase const & porousMaterial = getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); - if( m_keepFlowVariablesConstantDuringInitStep ) + if( m_keepVariablesConstantDuringInitStep ) { porousMaterial.ignoreConvergedState(); // newPorosity <- porosity_n } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index 55dcb3460b6..cfd06428707 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -345,15 +345,15 @@ class CompositionalMultiphaseBase : public FlowSolverBase * @param[in] domain the domain * @param[in] localMatrix local system matrix * @param[in] localRhs local system right-hand side vector - * @detail This function is meant to be called when the flag m_keepFlowVariablesConstantDuringInitStep is on + * @detail This function is meant to be called when the flag m_keepVariablesConstantDuringInitStep is on * The main use case is the initialization step in coupled problems during which we solve an elastic problem for a fixed pressure */ - void keepFlowVariablesConstantDuringInitStep( real64 const time, - real64 const dt, - DofManager const & dofManager, - DomainPartition & domain, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const; + void keepVariablesConstantDuringInitStep( real64 const time, + real64 const dt, + DofManager const & dofManager, + DomainPartition & domain, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) const; /** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 1c271ce6203..5cb1ecf2a15 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -814,7 +814,7 @@ void CompositionalMultiphaseFVM::applyBoundaryConditions( real64 time_n, { GEOS_MARK_FUNCTION; CompositionalMultiphaseBase::applyBoundaryConditions( time_n, dt, domain, dofManager, localMatrix, localRhs ); - if( !m_keepFlowVariablesConstantDuringInitStep ) + if( !m_keepVariablesConstantDuringInitStep ) { applyFaceDirichletBC( time_n, dt, dofManager, domain, localMatrix, localRhs ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 9ef380dc47f..98ca2b6213a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -91,7 +91,7 @@ FlowSolverBase::FlowSolverBase( string const & name, PhysicsSolverBase( name, parent ), m_numDofPerCell( 0 ), m_isThermal( 0 ), - m_keepFlowVariablesConstantDuringInitStep( 0 ), + m_keepVariablesConstantDuringInitStep( 0 ), m_isFixedStressPoromechanicsUpdate( false ), m_isJumpStabilized( false ), m_isLaggingFractureStencilWeightsUpdate( 0 ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index 16d08c7e91f..7ce927b19ad 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -150,11 +150,11 @@ class FlowSolverBase : public PhysicsSolverBase /** * @brief Utility function to keep the flow variables during a time step (used in poromechanics simulations) - * @param[in] keepFlowVariablesConstantDuringInitStep flag to tell the solver to freeze its primary variables during a time step + * @param[in] keepVariablesConstantDuringInitStep flag to tell the solver to freeze its primary variables during a time step * @detail This function is meant to be called by a specific task before/after the initialization step */ - void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { m_keepFlowVariablesConstantDuringInitStep = keepFlowVariablesConstantDuringInitStep; } + void setKeepVariablesConstantDuringInitStep( bool const keepVariablesConstantDuringInitStep ) + { m_keepVariablesConstantDuringInitStep = keepVariablesConstantDuringInitStep; } virtual bool checkSequentialSolutionIncrements( DomainPartition & domain ) const override; @@ -206,7 +206,7 @@ class FlowSolverBase : public PhysicsSolverBase real64 m_inputTemperature; /// flag to freeze the initial state during initialization in coupled problems - integer m_keepFlowVariablesConstantDuringInitStep; + integer m_keepVariablesConstantDuringInitStep; /// enable the fixed stress poromechanics update of porosity bool m_isFixedStressPoromechanicsUpdate; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 71f9fd1a279..1acf5ced456 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -763,7 +763,7 @@ void SinglePhaseBase::implicitStepComplete( real64 const & time, CoupledSolidBase const & porousSolid = getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); - if( m_keepFlowVariablesConstantDuringInitStep ) + if( m_keepVariablesConstantDuringInitStep ) { porousSolid.ignoreConvergedState(); // newPorosity <- porosity_n } @@ -877,13 +877,13 @@ void SinglePhaseBase::applyBoundaryConditions( real64 time_n, { GEOS_MARK_FUNCTION; - if( m_keepFlowVariablesConstantDuringInitStep ) + if( m_keepVariablesConstantDuringInitStep ) { // this function is going to force the current flow state to be constant during the time step // this is used when the poromechanics solver is performing the stress initialization // TODO: in the future, a dedicated poromechanics kernel should eliminate the flow vars to construct a reduced system // which will remove the need for this brittle passing aroung of flag - keepFlowVariablesConstantDuringInitStep( time_n, dt, dofManager, domain, localMatrix.toViewConstSizes(), localRhs.toView() ); + keepVariablesConstantDuringInitStep( time_n, dt, dofManager, domain, localMatrix.toViewConstSizes(), localRhs.toView() ); } else { @@ -1184,12 +1184,12 @@ void SinglePhaseBase::applySourceFluxBC( real64 const time_n, } ); } -void SinglePhaseBase::keepFlowVariablesConstantDuringInitStep( real64 const time, - real64 const dt, - DofManager const & dofManager, - DomainPartition & domain, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const +void SinglePhaseBase::keepVariablesConstantDuringInitStep( real64 const time, + real64 const dt, + DofManager const & dofManager, + DomainPartition & domain, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) const { GEOS_MARK_FUNCTION; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index 36fff6b6f1d..e32196fc9f1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -356,15 +356,15 @@ class SinglePhaseBase : public FlowSolverBase * @param[in] domain the domain * @param[in] localMatrix local system matrix * @param[in] localRhs local system right-hand side vector - * @detail This function is meant to be called when the flag m_keepFlowVariablesConstantDuringInitStep is on + * @detail This function is meant to be called when the flag m_keepVariablesConstantDuringInitStep is on * The main use case is the initialization step in coupled problems during which we solve an elastic problem for a fixed pressure */ - void keepFlowVariablesConstantDuringInitStep( real64 const time, - real64 const dt, - DofManager const & dofManager, - DomainPartition & domain, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) const; + void keepVariablesConstantDuringInitStep( real64 const time, + real64 const dt, + DofManager const & dofManager, + DomainPartition & domain, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) const; protected: diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index 190a3e717de..e69e9d9994a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -650,7 +650,7 @@ SinglePhaseFVM< BASE >::applyBoundaryConditions( real64 const time_n, GEOS_MARK_FUNCTION; BASE::applyBoundaryConditions( time_n, dt, domain, dofManager, localMatrix, localRhs ); - if( !BASE::m_keepFlowVariablesConstantDuringInitStep ) + if( !BASE::m_keepVariablesConstantDuringInitStep ) { applyFaceDirichletBC( time_n, dt, dofManager, domain, localMatrix, localRhs ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index e822c19735d..b9bfd4d43de 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -336,7 +336,7 @@ void SinglePhaseHybridFVM::applyBoundaryConditions( real64 const time_n, GEOS_MARK_FUNCTION; SinglePhaseBase::applyBoundaryConditions( time_n, dt, domain, dofManager, localMatrix, localRhs ); - if( !m_keepFlowVariablesConstantDuringInitStep ) + if( !m_keepVariablesConstantDuringInitStep ) { applyFaceDirichletBC( time_n, dt, dofManager, domain, localMatrix, localRhs ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index d77669b68d1..14e891c87ae 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -1091,7 +1091,7 @@ void CompositionalMultiphaseWell::assembleFluxTerms( real64 const & time, WellElementSubRegion & subRegion ) { WellControls const & well_controls = getWellControls( subRegion ); - if( well_controls.isWellOpen( time+ dt ) ) + if( well_controls.isWellOpen( time + dt ) && !m_keepVariablesConstantDuringInitStep ) { string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString()); MultiFluidBase const & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); @@ -1156,7 +1156,7 @@ void CompositionalMultiphaseWell::assembleAccumulationTerms( real64 const & time int numPhases = fluid.numFluidPhases(); int numComponents = fluid.numFluidComponents(); WellControls const & wellControls = getWellControls( subRegion ); - if( wellControls.isWellOpen( time+ dt ) ) + if( wellControls.isWellOpen( time+ dt ) && !m_keepVariablesConstantDuringInitStep ) { if( isThermal() ) { @@ -1636,7 +1636,7 @@ void CompositionalMultiphaseWell::computePerforationRates( real64 const & time_n { PerforationData * const perforationData = subRegion.getPerforationData(); WellControls const & wellControls = getWellControls( subRegion ); - if( wellControls.isWellOpen( time_n+ dt ) ) + if( wellControls.isWellOpen( time_n + dt ) && !m_keepVariablesConstantDuringInitStep ) { bool const disableReservoirToWellFlow = wellControls.isInjector() and !wellControls.isCrossflowEnabled(); @@ -1880,7 +1880,7 @@ void CompositionalMultiphaseWell::assemblePressureRelations( real64 const & time WellControls & wellControls = getWellControls( subRegion ); - if( wellControls.isWellOpen( time_n+ dt ) ) + if( wellControls.isWellOpen( time_n + dt ) && !m_keepVariablesConstantDuringInitStep ) { string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); MultiFluidBase const & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); @@ -1960,98 +1960,6 @@ void CompositionalMultiphaseWell::assemblePressureRelations( real64 const & time } ); } -void CompositionalMultiphaseWell::shutDownWell( real64 const time_n, - real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) -{ - GEOS_MARK_FUNCTION; - - string const wellDofKey = dofManager.getKey( wellElementDofName() ); - - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & regionNames ) - { - - ElementRegionManager const & elemManager = mesh.getElemManager(); - - elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, - [&]( localIndex const, - WellElementSubRegion const & subRegion ) - { - - // if the well is open, we don't have to do anything, so we just return - WellControls const & wellControls = getWellControls( subRegion ); - if( wellControls.isWellOpen( time_n + dt ) ) - { - return; - } - - globalIndex const rankOffset = dofManager.rankOffset(); - - arrayView1d< integer const > const ghostRank = - subRegion.getReference< array1d< integer > >( ObjectManagerBase::viewKeyStruct::ghostRankString() ); - arrayView1d< globalIndex const > const dofNumber = - subRegion.getReference< array1d< globalIndex > >( wellDofKey ); - - arrayView1d< real64 const > const pres = - subRegion.getField< fields::well::pressure >(); - arrayView2d< real64 const, compflow::USD_COMP > const compDens = - subRegion.getField< fields::well::globalCompDensity >(); - arrayView1d< real64 const > const connRate = - subRegion.getField< fields::well::mixtureConnectionRate >(); - - integer const numComp = m_numComponents; - - forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( ghostRank[ei] >= 0 ) - { - return; - } - - globalIndex const dofIndex = dofNumber[ei]; - localIndex const localRow = dofIndex - rankOffset; - real64 rhsValue; - - // 4.1. Apply pressure value to the matrix/rhs - FieldSpecificationEqual::SpecifyFieldValue( dofIndex, - rankOffset, - localMatrix, - rhsValue, - pres[ei], // freeze the current pressure value - pres[ei] ); - localRhs[localRow] = rhsValue; - - // 4.2. For each component, apply target global density value - for( integer ic = 0; ic < numComp; ++ic ) - { - FieldSpecificationEqual::SpecifyFieldValue( dofIndex + ic + 1, - rankOffset, - localMatrix, - rhsValue, - compDens[ei][ic], // freeze the current component density values - compDens[ei][ic] ); - localRhs[localRow + ic + 1] = rhsValue; - } - - // 4.3. Apply rate value to the matrix/rhs - FieldSpecificationEqual::SpecifyFieldValue( dofIndex + numComp + 1, - rankOffset, - localMatrix, - rhsValue, - connRate[ei], // freeze the current pressure value - connRate[ei] ); - localRhs[localRow + numComp + 1] = rhsValue; - - } ); - } ); - } ); -} - void CompositionalMultiphaseWell::implicitStepSetup( real64 const & time_n, real64 const & dt, DomainPartition & domain ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp index 25bec02179c..a09420b5e81 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -241,22 +241,6 @@ class CompositionalMultiphaseWell : public WellSolverBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) override; - /** - * @brief apply a special treatment to the wells that are shut - * @param time_n the time at the previous converged time step - * @param dt the time step size - * @param domain the physical domain object - * @param dofManager degree-of-freedom manager associated with the linear system - * @param matrix the system matrix - * @param rhs the system right-hand side vector - */ - virtual void shutDownWell( real64 const time_n, - real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) override; - /** * @brief Sets all the negative component densities (if any) to zero. * @param domain the physical domain object diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index 6cf1a348ca1..9834ceb56ee 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -612,83 +612,6 @@ void SinglePhaseWell::assembleVolumeBalanceTerms( DomainPartition const & GEOS_U // not implemented for single phase flow } -void SinglePhaseWell::shutDownWell( real64 const time_n, - real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) -{ - GEOS_MARK_FUNCTION; - - string const wellDofKey = dofManager.getKey( wellElementDofName() ); - - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & regionNames ) - { - - ElementRegionManager const & elemManager = mesh.getElemManager(); - - elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, - [&]( localIndex const, - WellElementSubRegion const & subRegion ) - { - - // if the well is open, we don't have to do anything, so we just return - WellControls const & wellControls = getWellControls( subRegion ); - if( wellControls.isWellOpen( time_n + dt ) ) - { - return; - } - - globalIndex const rankOffset = dofManager.rankOffset(); - - arrayView1d< integer const > const ghostRank = - subRegion.getReference< array1d< integer > >( ObjectManagerBase::viewKeyStruct::ghostRankString() ); - arrayView1d< globalIndex const > const dofNumber = - subRegion.getReference< array1d< globalIndex > >( wellDofKey ); - - arrayView1d< real64 const > const pres = - subRegion.getField< fields::well::pressure >(); - arrayView1d< real64 const > const connRate = - subRegion.getField< fields::well::connectionRate >(); - - forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( ghostRank[ei] >= 0 ) - { - return; - } - - globalIndex const dofIndex = dofNumber[ei]; - localIndex const localRow = dofIndex - rankOffset; - real64 rhsValue; - - // 4.1. Apply pressure value to the matrix/rhs - FieldSpecificationEqual::SpecifyFieldValue( dofIndex, - rankOffset, - localMatrix, - rhsValue, - pres[ei], // freeze the current pressure value - pres[ei] ); - localRhs[localRow] = rhsValue; - - // 4.2. Apply rate value to the matrix/rhs - FieldSpecificationEqual::SpecifyFieldValue( dofIndex + 1, - rankOffset, - localMatrix, - rhsValue, - connRate[ei], // freeze the current pressure value - connRate[ei] ); - localRhs[localRow + 1] = rhsValue; - - } ); - } ); - } ); -} - - void SinglePhaseWell::computePerforationRates( real64 const & time_n, real64 const & dt, DomainPartition & domain ) { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp index 0efd50fe286..df677346ab6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp @@ -224,23 +224,6 @@ class SinglePhaseWell : public WellSolverBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) override; - /* - * @brief apply a special treatment to the wells that are shut - * @param time_n the time at the previous converged time step - * @param dt the time step size - * @param domain the physical domain object - * @param dofManager degree-of-freedom manager associated with the linear system - * @param matrix the system matrix - * @param rhs the system right-hand side vector - */ - virtual void shutDownWell( real64 const time_n, - real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) override; - - struct viewKeyStruct : WellSolverBase::viewKeyStruct { static constexpr char const * dofFieldString() { return "singlePhaseWellVars"; } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index cabe5524cac..a8e271ea2e9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -45,7 +45,8 @@ WellSolverBase::WellSolverBase( string const & name, m_numDofPerWellElement( 0 ), m_numDofPerResElement( 0 ), m_isThermal( 0 ), - m_ratesOutputDir( joinPath( OutputBase::getOutputDirectory(), name + "_rates" )) + m_ratesOutputDir( joinPath( OutputBase::getOutputDirectory(), name + "_rates" ) ), + m_keepVariablesConstantDuringInitStep( 0 ) { registerWrapper( viewKeyStruct::isThermalString(), &m_isThermal ). setApplyDefaultValue( 0 ). @@ -209,68 +210,6 @@ void WellSolverBase::implicitStepSetup( real64 const & time_n, initializeWells( domain, time_n, dt ); } - -void WellSolverBase::shutInWell( real64 const time_n, - real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) -{ - GEOS_MARK_FUNCTION; - GEOS_UNUSED_VAR( time_n ); - GEOS_UNUSED_VAR( dt ); - - string const wellDofKey = dofManager.getKey( wellElementDofName() ); - - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel const & mesh, - arrayView1d< string const > const & regionNames ) - { - - ElementRegionManager const & elemManager = mesh.getElemManager(); - - elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, - [&]( localIndex const, - WellElementSubRegion const & subRegion ) - { - - globalIndex const rankOffset = dofManager.rankOffset(); - - arrayView1d< integer const > const ghostRank = - subRegion.getReference< array1d< integer > >( ObjectManagerBase::viewKeyStruct::ghostRankString() ); - arrayView1d< globalIndex const > const dofNumber = - subRegion.getReference< array1d< globalIndex > >( wellDofKey ); - - forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( ghostRank[ei] >= 0 ) - { - return; - } - - globalIndex const dofIndex = dofNumber[ei]; - localIndex const localRow = dofIndex - rankOffset; - - - real64 unity = 1.0; - for( integer i=0; i < m_numDofPerWellElement; i++ ) - { - globalIndex const cindex = dofNumber[ei] + i; - globalIndex const rindex = localRow+i; - localMatrix.template addToRow< serialAtomic >( rindex, - &cindex, - &unity, - 1 ); - localRhs[cindex] = 0.0; - } - - } ); - } ); - } ); -} - - void WellSolverBase::updateState( DomainPartition & domain ) { GEOS_MARK_FUNCTION; @@ -306,7 +245,6 @@ void WellSolverBase::assembleSystem( real64 const time, // get a reference to the degree-of-freedom numbers // then assemble the flux terms in the mass balance equations assembleFluxTerms( time, dt, domain, dofManager, localMatrix, localRhs ); - } void WellSolverBase::initializePostInitialConditionsPreSubGroups() diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp index 63743f65dfb..b8a007d203c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp @@ -234,39 +234,6 @@ class WellSolverBase : public PhysicsSolverBase CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ) = 0; - - /** - * @brief apply a special treatment to the wells that are shut (set Aww=I , Awr=Arw=0) - * @param time_n the time at the previous converged time step - * @param dt the time step size - * @param domain the physical domain object - * @param dofManager degree-of-freedom manager associated with the linear system - * @param matrix the system matrix - * @param rhs the system right-hand side vector - */ - void shutInWell( real64 const time_n, - real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ); - - /** - * @brief apply a special treatment to the wells that are shut - * @param time_n the time at the previous converged time step - * @param dt the time step size - * @param domain the physical domain object - * @param dofManager degree-of-freedom manager associated with the linear system - * @param matrix the system matrix - * @param rhs the system right-hand side vector - */ - virtual void shutDownWell( real64 const time_n, - real64 const dt, - DomainPartition const & domain, - DofManager const & dofManager, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) = 0; - /** * @brief Recompute all dependent quantities from primary variables (including constitutive models) * @param domain the domain containing the mesh and fields @@ -287,6 +254,14 @@ class WellSolverBase : public PhysicsSolverBase real64 const & dt, DomainPartition & domain ) = 0; + /** + * @brief Utility function to keep the well variables during a time step (used in poromechanics simulations) + * @param[in] keepVariablesConstantDuringInitStep flag to tell the solver to freeze its primary variables during a time step + * @detail This function is meant to be called by a specific task before/after the initialization step + */ + void setKeepVariablesConstantDuringInitStep( bool const keepVariablesConstantDuringInitStep ) + { m_keepVariablesConstantDuringInitStep = keepVariablesConstantDuringInitStep; } + struct viewKeyStruct : PhysicsSolverBase::viewKeyStruct { static constexpr char const * fluidNamesString() { return "fluidNames"; } @@ -351,10 +326,14 @@ class WellSolverBase : public PhysicsSolverBase /// flag indicating whether thermal formulation is used integer m_isThermal; + /// rates output integer m_writeCSV; string const m_ratesOutputDir; -/// name of the fluid constitutive model used as a reference for component/phase description + /// flag to freeze the initial state during initialization in coupled problems + integer m_keepVariablesConstantDuringInitStep; + + /// name of the fluid constitutive model used as a reference for component/phase description string m_referenceFluidModelName; }; diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index 38a5cf9e85b..264525673e3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -254,8 +254,11 @@ class CoupledReservoirAndWellsBase : public CoupledSolver< RESERVOIR_SOLVER, WEL void enableFixedStressPoromechanicsUpdate() { reservoirSolver()->enableFixedStressPoromechanicsUpdate(); } - void setKeepFlowVariablesConstantDuringInitStep( bool const keepFlowVariablesConstantDuringInitStep ) - { reservoirSolver()->setKeepFlowVariablesConstantDuringInitStep( keepFlowVariablesConstantDuringInitStep ); } + void setKeepVariablesConstantDuringInitStep( bool const keepVariablesConstantDuringInitStep ) + { + reservoirSolver()->setKeepVariablesConstantDuringInitStep( keepVariablesConstantDuringInitStep ); + wellSolver()->setKeepVariablesConstantDuringInitStep( keepVariablesConstantDuringInitStep ); + } virtual void saveSequentialIterationState( DomainPartition & domain ) override { reservoirSolver()->saveSequentialIterationState( domain ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index db180e45aa7..7053aec0d07 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -239,7 +239,7 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER real64 const & dt, DomainPartition & domain ) override { - flowSolver()->setKeepFlowVariablesConstantDuringInitStep( m_performStressInitialization ); + flowSolver()->setKeepVariablesConstantDuringInitStep( m_performStressInitialization ); if( this->m_stabilizationType == stabilization::StabilizationType::Global || this->m_stabilizationType == stabilization::StabilizationType::Local ) { From 77bab14a847f3e45eafc13794e74b36b1a7a79f7 Mon Sep 17 00:00:00 2001 From: Arnaud DUDES <155963334+arng40@users.noreply.github.com> Date: Wed, 6 Nov 2024 20:32:09 +0100 Subject: [PATCH 236/286] refactor: boundary conditions warning message (#3417) Co-authored-by: MelReyCG <122801580+MelReyCG@users.noreply.github.com> --- .../fluidFlow/CompositionalMultiphaseBase.cpp | 43 ++++++++---- .../fluidFlow/FlowSolverBase.cpp | 67 ++++++++++++++++++- .../fluidFlow/FlowSolverBase.hpp | 35 ++++++++++ .../ReactiveCompositionalMultiphaseOBL.cpp | 41 ++++++++---- 4 files changed, 159 insertions(+), 27 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index d13a85770c1..464785fcaba 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -1684,7 +1684,8 @@ bool CompositionalMultiphaseBase::validateDirichletBC( DomainPartition & domain, if( subRegionSetMap.count( setName ) > 0 ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Conflicting pressure boundary conditions on set {}/{}/{}", regionName, subRegionName, setName ) ); + GEOS_WARNING( BCMessage::pressureConflict( regionName, subRegionName, setName, + fields::flow::pressure::key() ) ); } subRegionSetMap[setName].setNumComp( m_numComponents ); } ); @@ -1709,7 +1710,8 @@ bool CompositionalMultiphaseBase::validateDirichletBC( DomainPartition & domain, if( tempSubRegionSetMap.count( setName ) > 0 ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Conflicting temperature boundary conditions on set {}/{}/{}", regionName, subRegionName, setName ) ); + GEOS_WARNING( BCMessage::temperatureConflict( regionName, subRegionName, setName, + fields::flow::temperature::key() ) ); } tempSubRegionSetMap.insert( setName ); } ); @@ -1726,7 +1728,7 @@ bool CompositionalMultiphaseBase::validateDirichletBC( DomainPartition & domain, string const & ) { // 3.1 Check pressure, temperature, and record composition bc application - string const & subRegionName = subRegion.getName(); + string const & subRegionName = subRegion.getName( ); string const & regionName = subRegion.getParent().getParent().getName(); integer const comp = fs.getComponent(); @@ -1734,7 +1736,8 @@ bool CompositionalMultiphaseBase::validateDirichletBC( DomainPartition & domain, if( subRegionSetMap.count( setName ) == 0 ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Pressure boundary condition not prescribed on set {}/{}/{}", regionName, subRegionName, setName ) ); + GEOS_WARNING( BCMessage::missingPressure( regionName, subRegionName, setName, + fields::flow::pressure::key() ) ); } if( m_isThermal ) { @@ -1742,13 +1745,15 @@ bool CompositionalMultiphaseBase::validateDirichletBC( DomainPartition & domain, if( tempSubRegionSetMap.count( setName ) == 0 ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Temperature boundary condition not prescribed on set {}/{}/{}", regionName, subRegionName, setName ) ); + GEOS_WARNING( BCMessage::missingTemperature( regionName, subRegionName, setName, + fields::flow::temperature::key() ) ); } } if( comp < 0 || comp >= m_numComponents ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Invalid component index [{}] in composition boundary condition {}", comp, fs.getName() ) ); + GEOS_WARNING( BCMessage::invalidComponentIndex( comp, fs.getName(), + fields::flow::globalCompFraction::key() ) ); return; // can't check next part with invalid component id } @@ -1756,7 +1761,13 @@ bool CompositionalMultiphaseBase::validateDirichletBC( DomainPartition & domain, if( compMask[comp] ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Conflicting composition[{}] boundary conditions on set {}/{}/{}", comp, regionName, subRegionName, setName ) ); + fsManager.forSubGroups< EquilibriumInitialCondition >( [&] ( EquilibriumInitialCondition const & bc ) + { + arrayView1d< string const > componentNames = bc.getComponentNames(); + GEOS_WARNING( BCMessage::conflictingComposition( comp, componentNames[comp], + regionName, subRegionName, setName, + fields::flow::globalCompFraction::key() ) ); + } ); } compMask.set( comp ); } ); @@ -1770,15 +1781,21 @@ bool CompositionalMultiphaseBase::validateDirichletBC( DomainPartition & domain, for( auto const & setEntry : subRegionEntry.second ) { ComponentMask< MAX_NC > const & compMask = setEntry.second; - for( integer ic = 0; ic < m_numComponents; ++ic ) + + fsManager.forSubGroups< EquilibriumInitialCondition >( [&] ( EquilibriumInitialCondition const & fs ) { - if( !compMask[ic] ) + arrayView1d< string const > componentNames = fs.getComponentNames(); + for( int ic = 0; ic < componentNames.size(); ic++ ) { - bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Boundary condition not applied to composition[{}] on set {}/{}/{}", - ic, regionEntry.first, subRegionEntry.first, setEntry.first ) ); + if( !compMask[ic] ) + { + bcConsistent = false; + GEOS_WARNING( BCMessage::notAppliedOnRegion( ic, componentNames[ic], + regionEntry.first, subRegionEntry.first, setEntry.first, + fields::flow::globalCompFraction::key() ) ); + } } - } + } ); } } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 98ca2b6213a..13e98e59f00 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -796,15 +796,78 @@ bool FlowSolverBase::checkSequentialSolutionIncrements( DomainPartition & GEOS_U { GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, GEOS_FMT( " {}: Max pressure change during outer iteration: {} Pa", - getName(), fmt::format( "{:.{}f}", m_sequentialPresChange, 3 ) ) ); + getName(), GEOS_FMT( "{:.{}f}", m_sequentialPresChange, 3 ) ) ); if( m_isThermal ) { GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Convergence, GEOS_FMT( " {}: Max temperature change during outer iteration: {} K", - getName(), fmt::format( "{:.{}f}", m_sequentialTempChange, 3 ) ) ); + getName(), GEOS_FMT( "{:.{}f}", m_sequentialTempChange, 3 ) ) ); } return (m_sequentialPresChange < m_maxSequentialPresChange) && (m_sequentialTempChange < m_maxSequentialTempChange); } +string FlowSolverBase::BCMessage::generateMessage( string_view baseMessage, + string_view fieldName, string_view setName ) +{ + return GEOS_FMT( "{}\nCheck if you have added or applied the appropriate fields to " + "the FieldSpecification component with fieldName=\"{}\" " + "and setNames=\"{}\"\n", baseMessage, fieldName, setName ); +} + +string FlowSolverBase::BCMessage::pressureConflict( string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ) +{ + return generateMessage( GEOS_FMT( "Conflicting pressure boundary conditions on set {}/{}/{}", + regionName, subRegionName, setName ), fieldName, setName ); +} + +string FlowSolverBase::BCMessage::temperatureConflict( string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ) +{ + return generateMessage( GEOS_FMT( "Conflicting temperature boundary conditions on set {}/{}/{}", + regionName, subRegionName, setName ), fieldName, setName ); +} + +string FlowSolverBase::BCMessage::missingPressure( string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ) +{ + return generateMessage( GEOS_FMT( "Pressure boundary condition not prescribed on set {}/{}/{}", + regionName, subRegionName, setName ), fieldName, setName ); +} + +string FlowSolverBase::BCMessage::missingTemperature( string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ) +{ + return generateMessage( GEOS_FMT( "Temperature boundary condition not prescribed on set {}/{}/{}", + regionName, subRegionName, setName ), fieldName, setName ); +} + +string FlowSolverBase::BCMessage::conflictingComposition( int comp, string_view componentName, + string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ) +{ + return generateMessage( GEOS_FMT( "Conflicting {} composition (no.{}) for boundary conditions on set {}/{}/{}", + componentName, comp, regionName, subRegionName, setName ), + fieldName, setName ); +} + +string FlowSolverBase::BCMessage::invalidComponentIndex( int comp, + string_view fsName, + string_view fieldName ) +{ + return generateMessage( GEOS_FMT( "Invalid component index no.{} in boundary condition {}", + comp, fsName ), fieldName, fsName ); +} + +string FlowSolverBase::BCMessage::notAppliedOnRegion( int componentIndex, string_view componentName, + string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ) +{ + return generateMessage( GEOS_FMT( "Boundary condition not applied to {} component (no.{})" + "on region {}/{}/{}\n", + componentName, componentIndex, regionName, subRegionName, setName ), + fieldName, setName ); +} + } // namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index 7ce927b19ad..ae1054fdd89 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -228,6 +228,41 @@ class FlowSolverBase : public PhysicsSolverBase real64 m_sequentialTempChange; real64 m_maxSequentialTempChange; + /** + * @brief Class used for displaying boundary warning message + */ + class BCMessage + { +public: + static string pressureConflict( string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ); + + static string temperatureConflict( string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ); + + static string missingPressure( string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ); + + static string missingTemperature( string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ); + + static string conflictingComposition( int comp, string_view componentName, + string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ); + + static string invalidComponentIndex( int comp, + string_view fsName, string_view fieldName ); + + static string notAppliedOnRegion( int componentIndex, string_view componentName, + string_view regionName, string_view subRegionName, + string_view setName, string_view fieldName ); +private: + static string generateMessage( string_view baseMessage, + string_view fieldName, string_view setName ); + + BCMessage(); + }; + private: virtual void setConstitutiveNames( ElementSubRegionBase & subRegion ) const override; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index 494a15a73bd..df64cbd846c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -24,6 +24,7 @@ #include "discretizationMethods/NumericalMethodsManager.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" +#include "fieldSpecification/EquilibriumInitialCondition.hpp" #include "physicsSolvers/fluidFlow/SourceFluxStatistics.hpp" #include "finiteVolume/FiniteVolumeManager.hpp" #include "finiteVolume/FluxApproximationBase.hpp" @@ -957,7 +958,8 @@ bool ReactiveCompositionalMultiphaseOBL::validateDirichletBC( DomainPartition & if( subRegionSetMap.count( setName ) > 0 ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Conflicting pressure boundary conditions on set {}/{}/{}", regionName, subRegionName, setName ) ); + GEOS_WARNING( BCMessage::pressureConflict( regionName, subRegionName, setName, + fields::flow::pressure::key() ) ); } subRegionSetMap[setName].setNumComp( numCompWithEnergy ); } ); @@ -981,12 +983,14 @@ bool ReactiveCompositionalMultiphaseOBL::validateDirichletBC( DomainPartition & if( subRegionSetMap.count( setName ) == 0 ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Pressure boundary condition not prescribed on set {}/{}/{}", regionName, subRegionName, setName ) ); + GEOS_WARNING( BCMessage::missingPressure( regionName, subRegionName, setName, + fields::flow::pressure::key() ) ); } if( comp < 0 || comp >= numComp ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Invalid component index [{}] in composition boundary condition {}", comp, fs.getName() ) ); + GEOS_WARNING( BCMessage::invalidComponentIndex( comp, fs.getName(), + fields::flow::globalCompFraction::key() ) ); return; // can't check next part with invalid component id } @@ -994,7 +998,13 @@ bool ReactiveCompositionalMultiphaseOBL::validateDirichletBC( DomainPartition & if( compMask[comp] ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Conflicting composition[{}] boundary conditions on set {}/{}/{}", comp, regionName, subRegionName, setName ) ); + fsManager.forSubGroups< EquilibriumInitialCondition >( [&] ( EquilibriumInitialCondition const & bc ) + { + arrayView1d< string const > componentNames = bc.getComponentNames(); + GEOS_WARNING( BCMessage::conflictingComposition( comp, componentNames[comp], + regionName, subRegionName, setName, + fields::flow::globalCompFraction::key() ) ); + } ); } compMask.set( comp ); } ); @@ -1019,7 +1029,8 @@ bool ReactiveCompositionalMultiphaseOBL::validateDirichletBC( DomainPartition & if( subRegionSetMap.count( setName ) == 0 ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Pressure boundary condition not prescribed on set {}/{}/{}", regionName, subRegionName, setName ) ); + GEOS_WARNING( BCMessage::pressureConflict( regionName, subRegionName, setName, + fields::flow::pressure::key() ) ); } ComponentMask< MAX_NC > & compMask = subRegionSetMap[setName]; @@ -1027,7 +1038,8 @@ bool ReactiveCompositionalMultiphaseOBL::validateDirichletBC( DomainPartition & if( compMask[numComp] ) { bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Conflicting temperature boundary conditions on set {}/{}/{}", regionName, subRegionName, setName ) ); + GEOS_WARNING( BCMessage::temperatureConflict( regionName, subRegionName, setName, + fields::flow::temperature::key() )); } compMask.set( numComp ); } ); @@ -1041,15 +1053,20 @@ bool ReactiveCompositionalMultiphaseOBL::validateDirichletBC( DomainPartition & for( auto const & setEntry : subRegionEntry.second ) { ComponentMask< MAX_NC > const & compMask = setEntry.second; - for( integer ic = 0; ic < numComp; ++ic ) + fsManager.forSubGroups< EquilibriumInitialCondition >( [&] ( EquilibriumInitialCondition const & fs ) { - if( !compMask[ic] ) + arrayView1d< string const > componentNames = fs.getComponentNames(); + for( int ic = 0; ic < componentNames.size(); ic++ ) { - bcConsistent = false; - GEOS_WARNING( GEOS_FMT( "Boundary condition not applied to composition[{}] on set {}/{}/{}", - ic, regionEntry.first, subRegionEntry.first, setEntry.first ) ); + if( !compMask[ic] ) + { + bcConsistent = false; + GEOS_WARNING( BCMessage::notAppliedOnRegion( ic, componentNames[ic], + regionEntry.first, subRegionEntry.first, setEntry.first, + fields::flow::globalCompFraction::key() ) ); + } } - } + } ); } } } From 61ef0e06cac39c3c36a04f45a0dbfca2d1ac638c Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 7 Nov 2024 08:48:02 -0600 Subject: [PATCH 237/286] fix: try this density treatment for gravity (#3337) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + ...positionalMultiphaseFVMKernelUtilities.hpp | 77 ++++++++++++++++--- ...ermalCompositionalMultiphaseFVMKernels.cpp | 17 +++- ...ermalCompositionalMultiphaseFVMKernels.hpp | 13 ++-- ...ermalCompositionalMultiphaseFVMKernels.hpp | 28 ++++--- 6 files changed, 113 insertions(+), 28 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 10e550a6c13..85dd1523a2b 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3408-8504-5db9ba0 + baseline: integratedTests/baseline_integratedTests-pr3337-8529-a3e5cb6 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index cc7aecdfb34..89f53d9f0c0 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3337 (2024-11-06) +==================== +Change density treatment for gravity in multiphase flow solver. + PR #3408 (2024-11-06) ==================== EFEM bugfixes: effective traction + oldStress. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp index 7284f48d985..323f3e362d0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp @@ -56,6 +56,7 @@ struct PotGrad real64 const ( &dTrans_dPres )[numFluxSupportPoints], ElementViewConst< arrayView1d< real64 const > > const & pres, ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, @@ -92,12 +93,19 @@ struct PotGrad real64 dProp_dC[numComp]{}; // calculate quantities on primary connected cells + integer denom = 0; for( integer i = 0; i < numFluxSupportPoints; ++i ) { localIndex const er = seri[i]; localIndex const esr = sesri[i]; localIndex const ei = sei[i]; + bool const phaseExists = (phaseVolFrac[er][esr][ei][ip] > 0); + if( !phaseExists ) + { + continue; + } + // density real64 const density = phaseMassDens[er][esr][ei][0][ip]; real64 const dDens_dP = dPhaseMassDens[er][esr][ei][0][ip][Deriv::dP]; @@ -109,11 +117,24 @@ struct PotGrad Deriv::dC ); // average density and derivatives - densMean += 0.5 * density; - dDensMean_dP[i] = 0.5 * dDens_dP; + densMean += density; + dDensMean_dP[i] = dDens_dP; for( integer jc = 0; jc < numComp; ++jc ) { - dDensMean_dC[i][jc] = 0.5 * dProp_dC[jc]; + dDensMean_dC[i][jc] = dProp_dC[jc]; + } + denom++; + } + if( denom > 1 ) + { + densMean /= denom; + for( integer i = 0; i < numFluxSupportPoints; ++i ) + { + dDensMean_dP[i] /= denom; + for( integer jc = 0; jc < numComp; ++jc ) + { + dDensMean_dC[i][jc] /= denom; + } } } @@ -316,6 +337,7 @@ struct PPUPhaseFlux ElementViewConst< arrayView1d< real64 const > > const & gravCoef, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, @@ -338,7 +360,7 @@ struct PPUPhaseFlux real64 dGravHead_dP[numFluxSupportPoints]{}; real64 dGravHead_dC[numFluxSupportPoints][numComp]{}; PotGrad::compute< numComp, numFluxSupportPoints >( numPhase, ip, hasCapPressure, seri, sesri, sei, trans, dTrans_dPres, pres, - gravCoef, dPhaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, + gravCoef, phaseVolFrac, dPhaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, potGrad, dPresGrad_dP, dPresGrad_dC, dGravHead_dP, dGravHead_dC ); @@ -430,6 +452,7 @@ struct C1PPUPhaseFlux ElementViewConst< arrayView1d< real64 const > > const & gravCoef, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, @@ -452,7 +475,7 @@ struct C1PPUPhaseFlux real64 dGravHead_dP[numFluxSupportPoints]{}; real64 dGravHead_dC[numFluxSupportPoints][numComp]{}; PotGrad::compute< numComp, numFluxSupportPoints >( numPhase, ip, hasCapPressure, seri, sesri, sei, trans, dTrans_dPres, pres, - gravCoef, dPhaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, + gravCoef, phaseVolFrac, dPhaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, potGrad, dPresGrad_dP, dPresGrad_dC, dGravHead_dP, dGravHead_dC ); @@ -660,6 +683,7 @@ upwindMobilityGravity( localIndex const numPhase, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, @@ -694,6 +718,7 @@ upwindMobilityGravity( localIndex const numPhase, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, + phaseVolFrac, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, @@ -924,6 +949,7 @@ computeFractionalFlowGravity( localIndex const numPhase, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, @@ -973,6 +999,7 @@ computeFractionalFlowGravity( localIndex const numPhase, dPhaseMassDens, phaseMob, dPhaseMob, + phaseVolFrac, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, @@ -1192,6 +1219,7 @@ struct computePotentialGravity ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & GEOS_UNUSED_PARAM( dPhaseVolFrac ), ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & @@ -1221,12 +1249,19 @@ struct computePotentialGravity } //inner loop to get average density + integer denom = 0; for( localIndex i = 0; i < numFluxSupportPoints; ++i ) { localIndex const er = seri[i]; localIndex const esr = sesri[i]; localIndex const ei = sei[i]; + bool const phaseExists = (phaseVolFrac[er][esr][ei][ip] > 0); + if( !phaseExists ) + { + continue; + } + // density real64 const density = phaseMassDens[er][esr][ei][0][ip]; real64 const dDens_dPres = dPhaseMassDens[er][esr][ei][0][ip][Deriv::dP]; @@ -1238,11 +1273,24 @@ struct computePotentialGravity Deriv::dC ); // average density and derivatives - densMean += 0.5 * density; - dDensMean_dPres[i] = 0.5 * dDens_dPres; + densMean += density; + dDensMean_dPres[i] = dDens_dPres; for( localIndex jc = 0; jc < numComp; ++jc ) { - dDensMean_dComp[i][jc] = 0.5 * dProp_dComp[jc]; + dDensMean_dComp[i][jc] = dProp_dComp[jc]; + } + denom++; + } + if( denom > 1 ) + { + densMean /= denom; + for( localIndex i = 0; i < numFluxSupportPoints; ++i ) + { + dDensMean_dPres[i] /= denom; + for( integer jc = 0; jc < numComp; ++jc ) + { + dDensMean_dComp[i][jc] /= denom; + } } } @@ -1356,6 +1404,7 @@ static void computePotentialFluxesGravity( localIndex const numPhase, ElementViewConst< arrayView1d< real64 const > > const & gravCoef, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, @@ -1392,6 +1441,7 @@ static void computePotentialFluxesGravity( localIndex const numPhase, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, + phaseVolFrac, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, @@ -1421,6 +1471,7 @@ static void computePotentialFluxesGravity( localIndex const numPhase, dPhaseMassDens, phaseMob, dPhaseMob, + phaseVolFrac, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, @@ -1454,6 +1505,7 @@ static void computePotentialFluxesGravity( localIndex const numPhase, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, + phaseVolFrac, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, @@ -1485,6 +1537,7 @@ static void computePotentialFluxesGravity( localIndex const numPhase, dPhaseMassDens, phaseMob, dPhaseMob, + phaseVolFrac, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, @@ -1814,6 +1867,7 @@ class UpwindScheme ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, @@ -1839,6 +1893,7 @@ class UpwindScheme dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, + phaseVolFrac, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, @@ -2036,6 +2091,7 @@ class HybridUpwind : public UpwindScheme ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, @@ -2069,6 +2125,7 @@ class HybridUpwind : public UpwindScheme dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, + phaseVolFrac, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, @@ -2194,6 +2251,7 @@ struct IHUPhaseFlux ElementViewConst< arrayView1d< real64 const > > const & gravCoef, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, @@ -2236,7 +2294,7 @@ struct IHUPhaseFlux trans, dTrans_dPres, pres, gravCoef, phaseMob, dPhaseMob, - dPhaseVolFrac, + phaseVolFrac, dPhaseVolFrac, phaseCompFrac, dPhaseCompFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, @@ -2379,6 +2437,7 @@ struct IHUPhaseFlux gravCoef, phaseMob, dPhaseMob, + phaseVolFrac, dPhaseVolFrac, dCompFrac_dCompDens, phaseMassDens, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.cpp index 0f878628377..ebceae552f0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.cpp @@ -51,8 +51,9 @@ FaceBasedAssemblyKernelBase::FaceBasedAssemblyKernelBase( integer const numPhase m_ghostRank( compFlowAccessors.get( fields::ghostRank {} ) ), m_gravCoef( compFlowAccessors.get( fields::flow::gravityCoefficient {} ) ), m_pres( compFlowAccessors.get( fields::flow::pressure {} ) ), - m_dCompFrac_dCompDens( compFlowAccessors.get( fields::flow::dGlobalCompFraction_dGlobalCompDensity {} ) ), + m_phaseVolFrac( compFlowAccessors.get( fields::flow::phaseVolumeFraction {} ) ), m_dPhaseVolFrac( compFlowAccessors.get( fields::flow::dPhaseVolumeFraction {} ) ), + m_dCompFrac_dCompDens( compFlowAccessors.get( fields::flow::dGlobalCompFraction_dGlobalCompDensity {} ) ), m_phaseCompFrac( multiFluidAccessors.get( fields::multifluid::phaseCompFraction {} ) ), m_dPhaseCompFrac( multiFluidAccessors.get( fields::multifluid::dPhaseCompFraction {} ) ), m_localMatrix( localMatrix ), @@ -97,14 +98,26 @@ CFLFluxKernel:: real64 gravHead{}; // calculate quantities on primary connected cells + integer denom = 0; for( localIndex i = 0; i < NUM_ELEMS; ++i ) { localIndex const er = seri[i]; localIndex const esr = sesri[i]; localIndex const ei = sei[i]; + bool const phaseExists = (phaseVolFrac[er][esr][ei][ip] > 0); + if( !phaseExists ) + { + continue; + } + // average density across the face - densMean += 0.5 * phaseMassDens[er][esr][ei][0][ip]; + densMean += phaseMassDens[er][esr][ei][0][ip]; + denom++; + } + if( denom > 1 ) + { + densMean /= denom; } //***** calculation of phase volumetric flux ***** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp index a4c30ca1f43..4332a3caca9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp @@ -373,10 +373,13 @@ class FaceBasedAssemblyKernelBase /// Views on pressure ElementViewConst< arrayView1d< real64 const > > const m_pres; - /// Views on derivatives of phase volume fractions and comp fractions - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const m_dCompFrac_dCompDens; + /// Views on phase volume fractions + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const m_phaseVolFrac; ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const m_dPhaseVolFrac; + /// Views on derivatives of comp fractions + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const m_dCompFrac_dCompDens; + /// Views on phase component fractions ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const m_phaseCompFrac; ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const m_dPhaseCompFrac; @@ -632,7 +635,7 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase m_pres, m_gravCoef, m_phaseMob, m_dPhaseMob, - m_dPhaseVolFrac, + m_phaseVolFrac, m_dPhaseVolFrac, m_phaseCompFrac, m_dPhaseCompFrac, m_dCompFrac_dCompDens, m_phaseMassDens, m_dPhaseMassDens, @@ -658,7 +661,7 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase m_pres, m_gravCoef, m_phaseMob, m_dPhaseMob, - m_dPhaseVolFrac, + m_phaseVolFrac, m_dPhaseVolFrac, m_phaseCompFrac, m_dPhaseCompFrac, m_dCompFrac_dCompDens, m_phaseMassDens, m_dPhaseMassDens, @@ -684,7 +687,7 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase m_pres, m_gravCoef, m_phaseMob, m_dPhaseMob, - m_dPhaseVolFrac, + m_phaseVolFrac, m_dPhaseVolFrac, m_phaseCompFrac, m_dPhaseCompFrac, m_dCompFrac_dCompDens, m_phaseMassDens, m_dPhaseMassDens, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp index 1ac47cb3ba6..6926c0f10a8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp @@ -48,7 +48,6 @@ class PhaseMobilityKernel : public isothermalCompositionalMultiphaseFVMKernels:: using Base = isothermalCompositionalMultiphaseFVMKernels::PhaseMobilityKernel< NUM_COMP, NUM_PHASE >; using Base::numPhase; using Base::m_dPhaseVolFrac; - using Base::m_dPhaseMob; using Base::m_phaseDens; using Base::m_dPhaseDens; using Base::m_phaseVisc; @@ -183,9 +182,8 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne using AbstractBase::m_dt; using AbstractBase::m_numPhases; - using AbstractBase::m_rankOffset; - using AbstractBase::m_dofNumber; using AbstractBase::m_gravCoef; + using AbstractBase::m_phaseVolFrac; using AbstractBase::m_dPhaseVolFrac; using AbstractBase::m_phaseCompFrac; using AbstractBase::m_dPhaseCompFrac; @@ -195,9 +193,7 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne using Base::numComp; using Base::numDof; using Base::numEqn; - using Base::maxNumElems; using Base::maxNumConns; - using Base::maxStencilSize; using Base::numFluxSupportPoints; using Base::m_phaseMob; using Base::m_dPhaseMob; @@ -344,14 +340,28 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne real64 dConvectiveEnergyFlux_dC[numFluxSupportPoints][numComp]{}; real64 dCompFlux_dT[numFluxSupportPoints][numComp]{}; + integer denom = 0; for( integer i = 0; i < numFluxSupportPoints; ++i ) { localIndex const er = seri[i]; localIndex const esr = sesri[i]; localIndex const ei = sei[i]; - real64 const dDens_dT = m_dPhaseMassDens[er][esr][ei][0][ip][Deriv::dT]; - dDensMean_dT[i] = 0.5 * dDens_dT; + bool const phaseExists = (m_phaseVolFrac[er_up][esr_up][ei_up][ip] > 0); + if( !phaseExists ) + { + continue; + } + + dDensMean_dT[i] = 0.5 * m_dPhaseMassDens[er][esr][ei][0][ip][Deriv::dT]; + denom++; + } + if( denom > 1 ) + { + for( integer i = 0; i < numFluxSupportPoints; ++i ) + { + dDensMean_dT[i] /= denom; + } } // Step 2: compute the derivatives of the phase potential difference wrt temperature @@ -1017,9 +1027,6 @@ class DirichletFaceBasedAssemblyKernel : public isothermalCompositionalMultiphas using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; using AbstractBase::m_dt; - using AbstractBase::m_numPhases; - using AbstractBase::m_rankOffset; - using AbstractBase::m_dofNumber; using AbstractBase::m_gravCoef; using AbstractBase::m_phaseCompFrac; using AbstractBase::m_dPhaseCompFrac; @@ -1032,7 +1039,6 @@ class DirichletFaceBasedAssemblyKernel : public isothermalCompositionalMultiphas using Base::m_phaseMob; using Base::m_dPhaseMob; using Base::m_dPhaseMassDens; - using Base::m_dPhaseCapPressure_dPhaseVolFrac; using Base::m_stencilWrapper; using Base::m_seri; using Base::m_sesri; From feb8f6cab1bf2edaa8d5cb1c44d3eac71dfa89c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Nov 2024 09:23:42 -0800 Subject: [PATCH 238/286] build(deps): bump the github-actions group across 1 directory with 4 updates (#3421) Bumps the github-actions group with 4 updates in the / directory: [actions/checkout](https://github.com/actions/checkout), [google-github-actions/auth](https://github.com/google-github-actions/auth), [google-github-actions/setup-gcloud](https://github.com/google-github-actions/setup-gcloud) and [codecov/codecov-action](https://github.com/codecov/codecov-action). Updates `actions/checkout` from 4.1.7 to 4.2.2 - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4.1.7...v4.2.2) Updates `google-github-actions/auth` from 2.1.5 to 2.1.7 - [Release notes](https://github.com/google-github-actions/auth/releases) - [Changelog](https://github.com/google-github-actions/auth/blob/main/CHANGELOG.md) - [Commits](https://github.com/google-github-actions/auth/compare/v2.1.5...v2.1.7) Updates `google-github-actions/setup-gcloud` from 2.1.1 to 2.1.2 - [Release notes](https://github.com/google-github-actions/setup-gcloud/releases) - [Changelog](https://github.com/google-github-actions/setup-gcloud/blob/main/CHANGELOG.md) - [Commits](https://github.com/google-github-actions/setup-gcloud/compare/v2.1.1...v2.1.2) Updates `codecov/codecov-action` from 4.5.0 to 4.6.0 - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4.5.0...v4.6.0) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions - dependency-name: google-github-actions/auth dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: google-github-actions/setup-gcloud dependency-type: direct:production update-type: version-update:semver-patch dependency-group: github-actions - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-minor dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Randolph Settgast Co-authored-by: Pavel Tomin --- .github/workflows/build_and_test.yml | 8 ++++---- .github/workflows/ci_tests.yml | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 80debbb603a..970fb02d01f 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -103,7 +103,7 @@ jobs: ls -la ./ - name: Checkout Repository - uses: actions/checkout@v4.1.7 + uses: actions/checkout@v4.2.2 with: submodules: true lfs: ${{ inputs.BUILD_TYPE == 'integrated_tests' }} @@ -111,14 +111,14 @@ jobs: - id: 'auth' if: ${{ inputs.GCP_BUCKET || inputs.USE_SCCACHE }} - uses: 'google-github-actions/auth@v2.1.5' + uses: 'google-github-actions/auth@v2.1.7' with: credentials_json: '${{ secrets.GOOGLE_CLOUD_GCP }}' create_credentials_file: true - name: 'Set up Cloud SDK' if: inputs.GCP_BUCKET - uses: 'google-github-actions/setup-gcloud@v2.1.1' + uses: 'google-github-actions/setup-gcloud@v2.1.2' with: version: '>= 363.0.0' @@ -334,7 +334,7 @@ jobs: - name: Upload coverage to Codecov if: inputs.CODE_COVERAGE - uses: codecov/codecov-action@v4.5.0 + uses: codecov/codecov-action@v4.6.0 with: files: ${GITHUB_WORKSPACE}/geos_coverage.info.cleaned fail_ci_if_error: true diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index bf62843e07b..a1803a9e008 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -69,7 +69,7 @@ jobs: # The TPL tag is contained in the codespaces configuration to avoid duplications. - name: Checkout .devcontainer/devcontainer.json - uses: actions/checkout@v4.1.7 + uses: actions/checkout@v4.2.2 with: sparse-checkout: | .devcontainer/devcontainer.json @@ -105,7 +105,7 @@ jobs: # The integrated test submodule repository contains large data (using git lfs). # To save time (and money) we do not let Github Actions automatically clone all our (lfs) subrepositories and do it by hand. - name: Checkout Repository - uses: actions/checkout@v4.1.7 + uses: actions/checkout@v4.2.2 with: # Let script update submodules; Github Actions submodule history causes error submodules: false @@ -225,7 +225,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Checkout Repository - uses: actions/checkout@v4.1.7 + uses: actions/checkout@v4.2.2 with: submodules: false lfs: false From cf4b7f0e0c05590bcde796d3bd5fb40832e66374 Mon Sep 17 00:00:00 2001 From: Jian Huang <53012159+jhuang2601@users.noreply.github.com> Date: Thu, 7 Nov 2024 16:05:39 -0600 Subject: [PATCH 239/286] feat: enable THM coupling with plastic models (#3413) * add a testing case for THM coupling with MCC model * dispatch models in PoromechanicsKernels * add smoke tests for different plastic models * add add smoke tests to integratedTest --------- Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 +- ...oPoroDruckerPrager_consolidation_smoke.xml | 166 +++++++++++++++ ...endedDruckerPrager_consolidation_smoke.xml | 167 +++++++++++++++ .../ThermoPoroMCC_consolidation_smoke.xml | 168 +++++++++++++++ .../ThermoPoroPlastic_consolidation_base.xml | 196 ++++++++++++++++++ .../thermoPoromechanics.ats | 24 +++ .../multiphysics/MultiphasePoromechanics.cpp | 2 +- .../multiphysics/SinglePhasePoromechanics.cpp | 2 +- .../PoromechanicsKernels.cmake | 46 +--- 10 files changed, 731 insertions(+), 48 deletions(-) create mode 100644 inputFiles/thermoPoromechanics/ThermoPoroDruckerPrager_consolidation_smoke.xml create mode 100644 inputFiles/thermoPoromechanics/ThermoPoroExtendedDruckerPrager_consolidation_smoke.xml create mode 100644 inputFiles/thermoPoromechanics/ThermoPoroMCC_consolidation_smoke.xml create mode 100644 inputFiles/thermoPoromechanics/ThermoPoroPlastic_consolidation_base.xml diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 85dd1523a2b..2920bb10e8d 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3337-8529-a3e5cb6 + baseline: integratedTests/baseline_integratedTests-pr3413-8558-9f4af7c allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 89f53d9f0c0..896431de55b 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3413 (2024-11-07) +==================== +Add tests for poro-thermo-plastic model. + PR #3337 (2024-11-06) ==================== Change density treatment for gravity in multiphase flow solver. @@ -90,7 +94,7 @@ PR #3278 (2024-08-12) ====================== Renamed GEOSX to GEOS in enternal mesh import, so rebaseline to change these names is the baselines. -202 (2024-08-03) +PR #3202 (2024-08-03) ====================== Acoustic VTI tests needed rebaselining after update in source and receiver location algorithm. diff --git a/inputFiles/thermoPoromechanics/ThermoPoroDruckerPrager_consolidation_smoke.xml b/inputFiles/thermoPoromechanics/ThermoPoroDruckerPrager_consolidation_smoke.xml new file mode 100644 index 00000000000..70c9671e992 --- /dev/null +++ b/inputFiles/thermoPoromechanics/ThermoPoroDruckerPrager_consolidation_smoke.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/thermoPoromechanics/ThermoPoroExtendedDruckerPrager_consolidation_smoke.xml b/inputFiles/thermoPoromechanics/ThermoPoroExtendedDruckerPrager_consolidation_smoke.xml new file mode 100644 index 00000000000..f45d88ffb3e --- /dev/null +++ b/inputFiles/thermoPoromechanics/ThermoPoroExtendedDruckerPrager_consolidation_smoke.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/thermoPoromechanics/ThermoPoroMCC_consolidation_smoke.xml b/inputFiles/thermoPoromechanics/ThermoPoroMCC_consolidation_smoke.xml new file mode 100644 index 00000000000..d3151c11cfd --- /dev/null +++ b/inputFiles/thermoPoromechanics/ThermoPoroMCC_consolidation_smoke.xml @@ -0,0 +1,168 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/thermoPoromechanics/ThermoPoroPlastic_consolidation_base.xml b/inputFiles/thermoPoromechanics/ThermoPoroPlastic_consolidation_base.xml new file mode 100644 index 00000000000..950f7158f7e --- /dev/null +++ b/inputFiles/thermoPoromechanics/ThermoPoroPlastic_consolidation_base.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/thermoPoromechanics/thermoPoromechanics.ats b/inputFiles/thermoPoromechanics/thermoPoromechanics.ats index 7fd79868bbb..81b0072a4e8 100644 --- a/inputFiles/thermoPoromechanics/thermoPoromechanics.ats +++ b/inputFiles/thermoPoromechanics/thermoPoromechanics.ats @@ -24,6 +24,30 @@ decks = [ partitions=((1, 1, 1), (2, 2, 1)), restart_step=22, check_step=33, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="ThermoPoroDruckerPrager_consolidation_smoke", + description= + '1D thermo poro consolidation problem with Drucker Prager model', + partitions=((1, 1, 1), (1, 2, 1)), + restart_step=633, + check_step=683, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="ThermoPoroExtendedDruckerPrager_consolidation_smoke", + description= + '1D thermo poro consolidation problem with Extended Drucker Prager model', + partitions=((1, 1, 1), (1, 2, 1)), + restart_step=633, + check_step=683, + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="ThermoPoroMCC_consolidation_smoke", + description= + '1D thermo poro consolidation problem with Modified Cam-Clay model', + partitions=((1, 1, 1), (1, 2, 1)), + restart_step=633, + check_step=683, restartcheck_params=RestartcheckParameters(**restartcheck_params)) ] diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 4a03fb51aab..aaa5864dd0d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -142,7 +142,7 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementBa if( this->m_isThermal ) { poromechanicsMaxForce = - assemblyLaunch< constitutive::PorousSolid< ElasticIsotropic >, // TODO: change once there is a cmake solution + assemblyLaunch< constitutive::PorousSolidBase, thermalPoromechanicsKernels::ThermalMultiphasePoromechanicsKernelFactory >( mesh, dofManager, regionNames, diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 7b6d7dbbcb6..53dee4f6bab 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -195,7 +195,7 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementB if( this->m_isThermal ) { poromechanicsMaxForce = - assemblyLaunch< constitutive::PorousSolid< ElasticIsotropic >, // TODO: change once there is a cmake solution + assemblyLaunch< constitutive::PorousSolidBase, thermalPoromechanicsKernels::ThermalSinglePhasePoromechanicsKernelFactory >( mesh, dofManager, regionNames, diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake index 422e50380c3..c3aa48ddb39 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cmake @@ -11,7 +11,7 @@ set( ThermalSinglePhasePoromechanicsEFEMPolicy "geos::parallelDevicePolicy< ${GE configure_file( ${CMAKE_SOURCE_DIR}/${kernelPath}/policies.hpp.in ${CMAKE_BINARY_DIR}/generatedSrc/${kernelPath}/policies.hpp ) -set( kernelNames PoromechanicsKernels ) +set( kernelNames PoromechanicsKernels ThermoPoromechanicsKernels ) set( subregionList CellElementSubRegion ) set( porousSolidDispatch PorousSolid PorousSolid @@ -59,7 +59,7 @@ endif( ) string(REPLACE "," "-" filename ${filename}) string(REPLACE " " "" filename ${filename}) message( " -- Generating file: ${filename}") - configure_file( ${CMAKE_SOURCE_DIR}/${kernelPath}/PoromechanicsKernels.cpp.template + configure_file( ${CMAKE_SOURCE_DIR}/${kernelPath}/${KERNELNAME}.cpp.template ${filename} ) list( APPEND physicsSolvers_sources ${filename} ) @@ -111,45 +111,3 @@ endif( ) endforeach() endforeach() -set( kernelNames ThermoPoromechanicsKernels ) -set( subregionList CellElementSubRegion ) -set( porousSolidDispatch PorousSolid ) - -set( finiteElementDispatch H1_Hexahedron_Lagrange1_GaussLegendre2 - H1_Wedge_Lagrange1_Gauss6 - H1_Tetrahedron_Lagrange1_Gauss1 - H1_Pyramid_Lagrange1_Gauss5 - H1_Tetrahedron_VEM_Gauss1 - H1_Prism5_VEM_Gauss1 - H1_Prism6_VEM_Gauss1 - H1_Prism7_VEM_Gauss1 - H1_Prism8_VEM_Gauss1 - H1_Prism9_VEM_Gauss1 - H1_Prism10_VEM_Gauss1 ) - -if ( NOT ${ENABLE_HIP} ) - list(APPEND finiteElementDispatch - H1_Hexahedron_VEM_Gauss1 - H1_Wedge_VEM_Gauss1 - H1_Prism11_VEM_Gauss1 ) -endif( ) - - foreach( KERNELNAME ${kernelNames} ) - foreach( SUBREGION_TYPE ${subregionList} ) - foreach( CONSTITUTIVE_TYPE ${porousSolidDispatch} ) - foreach( FE_TYPE ${finiteElementDispatch} ) - - set( filename "${CMAKE_BINARY_DIR}/generatedSrc/${kernelPath}/${KERNELNAME}_${SUBREGION_TYPE}_${CONSTITUTIVE_TYPE}_${FE_TYPE}.cpp" ) - string(REPLACE "<" "-" filename ${filename}) - string(REPLACE ">" "-" filename ${filename}) - string(REPLACE "," "-" filename ${filename}) - string(REPLACE " " "" filename ${filename}) - message( " -- Generating file: ${filename}") - configure_file( ${CMAKE_SOURCE_DIR}/${kernelPath}/ThermoPoromechanicsKernels.cpp.template - ${filename} ) - - list( APPEND physicsSolvers_sources ${filename} ) - endforeach() - endforeach() - endforeach() - endforeach() From 48fe31703350809df15c7053df6cece63fb21fac Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Thu, 7 Nov 2024 14:45:16 -0800 Subject: [PATCH 240/286] chore: Update CODEOWNERS (#3423) * Update CODEOWNERS --------- Co-authored-by: Pavel Tomin Co-authored-by: Jian Huang <53012159+jhuang2601@users.noreply.github.com> Co-authored-by: Ryan Aronson Co-authored-by: Randolph Settgast Co-authored-by: MelReyCG <122801580+MelReyCG@users.noreply.github.com> --- .github/CODEOWNERS | 79 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 61 insertions(+), 18 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1048325b177..58e544196ff 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -10,37 +10,80 @@ /.github/ @rrsettgast /BASELINE_NOTES.md -/.integrated_tests.yaml @CusiniM @cssherman @rrsettgast @wrtobin @castelletto1 @jhuang2601 @paveltomin -/inputFiles/ @CusiniM @cssherman @jhuang2601 @rrsettgast -/src/coreComponents/LvArray @rrsettgast @wrtobin @corbett5 @CusiniM -/src/coreComponents/codingUtilities @rrsettgast @untereiner @corbett5 @wrtobin +/.integrated_tests.yaml @rrsettgast @CusiniM @cssherman @wrtobin @castelletto1 @jhuang2601 @paveltomin +/inputFiles @rrsettgast @CusiniM @cssherman @paveltomin @jhuang2601 +/inputFiles/compositionalMultiphaseFlow @paveltomin @dkachuma +/inputFiles/compositionalMultiphaseWell @CusiniM @paveltomin @tjb-ltk @dkachuma +/inputFiles/efemFractureMechanics @CusiniM @matteofrigo5 @Guotong-Ren +/inputFiles/hydraulicFracturing @CusiniM @rrsettgast @frankfeifan @Guotong-Ren @cssherman @jhuang2601 +/inputFiles/inducedSeismicity @CusiniM @matteofrigo5 @VidarStiernstrom +/inputFiles/initialization @rrsettgast @jhuang2601 +/inputFiles/lagrangianContactMechanics @CusiniM @jhuang2601 @matteofrigo5 +/inputFiles/materialPointMethod @homel1 @cmcrook5 +/inputFiles/meshGeneration @rrsettgast @cssherman +/inputFiles/multiphaseFlowFractures @CusiniM @paveltomin @jhuang2601 +/inputFiles/multipleMeshBodies @rrsettgast @wrtobin +/inputFiles/phaseField @CusiniM @frankfeifan +/inputFiles/poromechanics @CusiniM @castelletto1 @paveltomin @jhuang2601 @ryar9534 +/inputFiles/poromechanicsFractures @CusiniM @castelletto1 @paveltomin @jhuang2601 +/inputFiles/proppant @rrsettgast @jhuang2601 +/inputFiles/relpermDriver @dkachuma @paveltomin @jafranc +/inputFiles/simplePDE @rrsettgast @castelletto1 +/inputFiles/singlePhaseFlow @CusiniM @castelletto1 @paveltomin +/inputFiles/singlePhaseFlowFractures @CusiniM @castelletto1 @paveltomin @jhuang2601 +/inputFiles/singlePhaseWell @CusiniM @paveltomin @tjb-ltk +/inputFiles/solidMechanics @CusiniM @castelletto1 @jhuang2601 +/inputFiles/surfaceGeneration @CusiniM @castelletto1 @rrsettgast +/inputFiles/thermalMultiphaseFlow @paveltomin @dkachuma +/inputFiles/thermalSinglePhaseFlowFractures @CusiniM @castelletto1 @paveltomin @jhuang2601 @frankfeifan +/inputFiles/thermoPoromechanics @paveltomin @jhuang2601 @castelletto1 @frankfeifan +/inputFiles/thermoPoromechanicsFractures @CusiniM @castelletto1 @paveltomin @jhuang2601 +/inputFiles/triaxialDriver @rrsettgast @jhuang2601 +/inputFiles/wavePropagation @acitrain @sframba +/inputFiles/wellbore @rrsettgast @jhuang2601 +/inputFiles/wellboreECP @rrsettgast +/src/coreComponents/LvArray @rrsettgast @CusiniM @wrtobin @corbett5 +/src/coreComponents/codingUtilities @rrsettgast @untereiner @corbett5 @wrtobin @MelReyCG /src/coreComponents/common @rrsettgast @MelReyCG @corbett5 @wrtobin -/src/coreComponents/constitutive @rrsettgast @CusiniM @dkachuma @paveltomin @joshua-white -/src/coreComponents/dataRepository @rrsettgast @wrtobin @corbett5 +/src/coreComponents/constitutive @rrsettgast @CusiniM @dkachuma @paveltomin @castelletto1 +/src/coreComponents/constitutive/capillaryPressure @CusiniM @dkachuma @paveltomin +/src/coreComponents/constitutive/contact @rrsettgast @CusiniM @matteofrigo5 @Guotong-Ren @jhuang2601 +/src/coreComponents/constitutive/diffusion @CusiniM @dkachuma @paveltomin +/src/coreComponents/constitutive/dispersion @CusiniM @dkachuma @paveltomin +/src/coreComponents/constitutive/docs +/src/coreComponents/constitutive/fluid @CusiniM @dkachuma @paveltomin +/src/coreComponents/constitutive/permeability @CusiniM @dkachuma @paveltomin @jhuang2601 +/src/coreComponents/constitutive/pvtPackage @CusiniM @dkachuma @paveltomin +/src/coreComponents/constitutive/relativePermeability @dkachuma @paveltomin +/src/coreComponents/constitutive/solid @rrsettgast @CusiniM @paveltomin @castelletto1 @jhuang2601 +/src/coreComponents/constitutive/thermalConductivity @CusiniM @dkachuma @paveltomin @jhuang2601 +/src/coreComponents/constitutive/unitTests @rrsettgast @CusiniM @dkachuma @paveltomin +/src/coreComponents/constitutiveDrivers @rrsettgast @CusiniM @dkachuma @jhuang2601 +/src/coreComponents/dataRepository @rrsettgast @wrtobin @corbett5 @MelReyCG /src/coreComponents/denseLinearAlgebra @rrsettgast @CusiniM @castelletto1 /src/coreComponents/discretizationMethods @rrsettgast @CusiniM @castelletto1 /src/coreComponents/events @rrsettgast @corbett5 @cssherman /src/coreComponents/fieldSpecification @rrsettgast @CusiniM @corbett5 @cssherman /src/coreComponents/fileIO @rrsettgast @wrtobin @MelReyCG @untereiner /src/coreComponents/finiteElement @rrsettgast @castelletto1 @andrea-borio @CusiniM -/src/coreComponents/finiteVolume @rrsettgast @castelletto1 @CusiniM @paveltomin -/src/coreComponents/functions @cssherman @wrtobin @rrsettgast -/src/coreComponents/linearAlgebra @rrsettgast @castelletto1 @victorapm +/src/coreComponents/finiteVolume @rrsettgast @castelletto1 @CusiniM @paveltomin @ryar9534 +/src/coreComponents/functions @rrsettgast @cssherman @wrtobin +/src/coreComponents/linearAlgebra @rrsettgast @CusiniM @castelletto1 @victorapm /src/coreComponents/mainInterface @rrsettgast @corbett5 @wrtobin /src/coreComponents/math @rrsettgast @corbett5 @wrtobin -/src/coreComponents/mesh @rrsettgast @wrtobin @untereiner @CusiniM +/src/coreComponents/mesh @rrsettgast @CusiniM @wrtobin @untereiner /src/coreComponents/physicsSolvers @rrsettgast @CusiniM -/src/coreComponents/physicsSolvers/contact @CusiniM @rrsettgast @matteofrigo5 -/src/coreComponents/physicsSolvers/fluidFlow @CusiniM @paveltomin @klevzoff @francoishamon -/src/coreComponents/physicsSolvers/inducedSeismicity @CusiniM @rrsettgast -/src/coreComponents/physicsSolvers/multiphysics @CusiniM @paveltomin @castelletto1 @rrsettgast -/src/coreComponents/physicsSolvers/python @cssherman @corbett5 -/src/coreComponents/physicsSolvers/simplePDE @castelletto1 @rrsettgast @CusiniM -/src/coreComponents/physicsSolvers/solidMechanics @rrsettgast @castelletto1 @CusiniM +/src/coreComponents/physicsSolvers/contact @rrsettgast @CusiniM @matteofrigo5 @Guotong-Ren +/src/coreComponents/physicsSolvers/fluidFlow @CusiniM @paveltomin @ryar9534 +/src/coreComponents/physicsSolvers/inducedSeismicity @rrsettgast @CusiniM @matteofrigo5 @VidarStiernstrom +/src/coreComponents/physicsSolvers/multiphysics @rrsettgast @CusiniM @paveltomin @castelletto1 @frankfeifan @ryar9534 @jhuang2601 +/src/coreComponents/physicsSolvers/python @cssherman @corbett5 @alexbenedicto +/src/coreComponents/physicsSolvers/simplePDE @CusiniM @castelletto1 @rrsettgast @frankfeifan +/src/coreComponents/physicsSolvers/solidMechanics @rrsettgast @CusiniM @castelletto1 @jhuang2601 /src/coreComponents/physicsSolvers/surfaceGeneration @rrsettgast @CusiniM @jhuang2601 /src/coreComponents/physicsSolvers/wavePropagation @sframba @acitrain /src/coreComponents/schema -/src/coreComponents/unitTests @rrsettgast @corbett5 @wrtobin +/src/coreComponents/unitTests @rrsettgast @CusiniM @corbett5 @wrtobin # Here is a list of GEOS-DEV members as of 2024-07-02 # username name From fae1d01f1b1f97161aa6cb817e086bc5e1455516 Mon Sep 17 00:00:00 2001 From: Guotong <133127368+Guotong-Ren@users.noreply.github.com> Date: Fri, 8 Nov 2024 20:06:44 -0600 Subject: [PATCH 241/286] fix: reset accumulation in fracture when time step cut occurs in hydrofrac solver (#3426) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 3 +++ inputFiles/hydraulicFracturing/kgdEdgeBased_C3D6_base.xml | 2 +- inputFiles/hydraulicFracturing/kgdNodeBased_C3D6_base.xml | 2 +- .../physicsSolvers/multiphysics/HydrofractureSolver.cpp | 8 +++++++- .../physicsSolvers/multiphysics/HydrofractureSolver.hpp | 3 +++ 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 2920bb10e8d..9e1edda941d 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3413-8558-9f4af7c + baseline: integratedTests/baseline_integratedTests-pr3426-8601-e33a77f allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 896431de55b..9608f0ed42a 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,9 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3426 (2024-11-08) +Bugfix: reset accumulation in fracture when time step cut occurs in hydrofrac solver. + PR #3413 (2024-11-07) ==================== Add tests for poro-thermo-plastic model. diff --git a/inputFiles/hydraulicFracturing/kgdEdgeBased_C3D6_base.xml b/inputFiles/hydraulicFracturing/kgdEdgeBased_C3D6_base.xml index c775276de50..cc461b52ba3 100644 --- a/inputFiles/hydraulicFracturing/kgdEdgeBased_C3D6_base.xml +++ b/inputFiles/hydraulicFracturing/kgdEdgeBased_C3D6_base.xml @@ -17,7 +17,7 @@ + lineSearchAction="None"/> diff --git a/inputFiles/hydraulicFracturing/kgdNodeBased_C3D6_base.xml b/inputFiles/hydraulicFracturing/kgdNodeBased_C3D6_base.xml index 07c0fbf8373..d7fbbd5d077 100644 --- a/inputFiles/hydraulicFracturing/kgdNodeBased_C3D6_base.xml +++ b/inputFiles/hydraulicFracturing/kgdNodeBased_C3D6_base.xml @@ -18,7 +18,7 @@ + lineSearchAction="None"/> diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 44f214e2de8..545d55cfec2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -211,7 +211,6 @@ real64 HydrofractureSolver< POROMECHANICS_SOLVER >::fullyCoupledSolverStep( real // currently the only method is implicit time integration dtReturn = nonlinearImplicitStep( time_n, dt, cycleNumber, domain ); - if( !this->m_performStressInitialization && m_surfaceGenerator->solverStep( time_n, dt, cycleNumber, domain ) > 0 ) { locallyFractured = 1; @@ -905,6 +904,13 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::implicitStepComplete( real64 c } } +template< typename POROMECHANICS_SOLVER > +void HydrofractureSolver< POROMECHANICS_SOLVER >::resetStateToBeginningOfStep( DomainPartition & domain ) +{ + Base::resetStateToBeginningOfStep( domain ); + updateState( domain ); +} + template< typename POROMECHANICS_SOLVER > real64 HydrofractureSolver< POROMECHANICS_SOLVER >::setNextDt( real64 const & currentDt, DomainPartition & domain ) diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index d3e08989f95..8ea2ddc1d8b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -57,6 +57,7 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER using Base::flowSolver; using Base::solidMechanicsSolver; using Base::assembleElementBasedTerms; + using Base::resetStateToBeginningOfStep; /** @@ -130,6 +131,8 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER real64 const & dt, DomainPartition & domain ) override final; + virtual void resetStateToBeginningOfStep( DomainPartition & domain ) override final; + /**@}*/ void updateHydraulicApertureAndFracturePermeability( DomainPartition & domain ); From ef1421526f937cddb9b66279a002502a18a0b8dd Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Sat, 9 Nov 2024 13:41:10 -0600 Subject: [PATCH 242/286] fix: Single phase kernels - split into separate files and fix a bug related to mass and energy updates for poromechanics (#3372) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 + .../constitutive/CMakeLists.txt | 1 - .../SinglePhaseThermalConductivityBase.cpp | 1 - .../SinglePhaseThermalConductivityFields.hpp | 49 - .../physicsSolvers/fluidFlow/CMakeLists.txt | 75 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 6 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 12 +- .../CompositionalMultiphaseHybridFVM.cpp | 4 +- .../CompositionalMultiphaseStatistics.cpp | 4 +- .../fluidFlow/FlowSolverBase.cpp | 62 +- .../fluidFlow/FlowSolverBase.hpp | 13 + .../ReactiveCompositionalMultiphaseOBL.cpp | 2 +- .../fluidFlow/SinglePhaseBase.cpp | 35 +- .../fluidFlow/SinglePhaseBase.hpp | 8 +- .../fluidFlow/SinglePhaseFVM.cpp | 156 ++- .../fluidFlow/SinglePhaseHybridFVM.cpp | 6 +- .../fluidFlow/SinglePhaseProppantBase.cpp | 3 +- .../fluidFlow/SinglePhaseStatistics.cpp | 3 +- .../kernels/HybridFVMHelperKernels.hpp | 10 +- ...hpp => MinPoreVolumeMaxPorosityKernel.hpp} | 50 +- .../kernels/SinglePhaseBaseKernels.hpp | 897 ---------------- .../kernels/SinglePhaseFVMKernels.hpp | 962 ------------------ .../kernels/StencilWeightsUpdateKernel.hpp | 79 ++ .../kernels/ThermalSinglePhaseBaseKernels.hpp | 626 ------------ ...ompositionalMultiphaseHybridFVMKernels.cpp | 0 ...ompositionalMultiphaseHybridFVMKernels.hpp | 2 +- ...ationCompositionalMultiphaseFVMKernels.hpp | 0 ...rmalCompositionalMultiphaseBaseKernels.hpp | 2 +- ...positionalMultiphaseFVMKernelUtilities.hpp | 0 ...ermalCompositionalMultiphaseFVMKernels.cpp | 0 ...ermalCompositionalMultiphaseFVMKernels.hpp | 4 +- ...ctiveCompositionalMultiphaseOBLKernels.hpp | 0 ...lizedCompositionalMultiphaseFVMKernels.hpp | 2 +- ...rmalCompositionalMultiphaseBaseKernels.hpp | 2 +- ...ermalCompositionalMultiphaseFVMKernels.hpp | 2 +- .../singlePhase/AccumulationKernels.hpp | 361 +++++++ .../kernels/singlePhase/AquiferBCKernel.hpp | 152 +++ .../DirichletFluxComputeKernel.hpp | 362 +++++++ .../kernels/singlePhase/FluidUpdateKernel.hpp | 55 + .../kernels/singlePhase/FluxComputeKernel.hpp | 383 +++++++ .../singlePhase/FluxComputeKernelBase.hpp | 173 ++++ .../{ => singlePhase}/FluxKernelsHelper.hpp | 81 +- .../singlePhase/HydrostaticPressureKernel.hpp | 213 ++++ .../kernels/singlePhase/MobilityKernel.hpp | 149 +++ .../singlePhase/ResidualNormKernel.hpp | 268 +++++ .../SinglePhaseHybridFVMKernels.hpp | 8 +- .../SolidInternalEnergyUpdateKernel.hpp | 54 + .../singlePhase/SolutionCheckKernel.hpp | 72 ++ .../singlePhase/SolutionScalingKernel.hpp | 75 ++ .../StabilizedFluxComputeKernel.hpp} | 49 +- .../kernels/singlePhase/StatisticsKernel.hpp | 133 +++ .../ThermalAccumulationKernels.hpp | 338 ++++++ .../ThermalDirichletFluxComputeKernel.hpp | 393 +++++++ .../ThermalFluxComputeKernel.hpp} | 407 +------- .../proppant/ProppantBaseKernels.hpp} | 6 +- .../proppant/ProppantFluxKernels.cpp} | 8 +- .../proppant/ProppantFluxKernels.hpp} | 0 .../wells/CompositionalMultiphaseWell.cpp | 5 +- .../fluidFlow/wells/SinglePhaseWell.cpp | 4 +- .../CompositionalMultiphaseWellKernels.hpp | 2 +- .../multiphysics/HydrofractureSolver.cpp | 3 +- .../multiphysics/MultiphasePoromechanics.cpp | 31 - .../multiphysics/MultiphasePoromechanics.hpp | 2 - .../multiphysics/SinglePhasePoromechanics.cpp | 25 - .../multiphysics/SinglePhasePoromechanics.hpp | 2 - ...ePhasePoromechanicsConformingFractures.cpp | 3 +- ...glePhasePoromechanicsEmbeddedFractures.cpp | 1 + ...ePhasePoromechanicsConformingFractures.hpp | 40 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 40 +- ...ePhasePoromechanicsConformingFractures.hpp | 45 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 44 +- .../unitTests/fluidFlowTests/CMakeLists.txt | 2 +- ....cpp => testSinglePhaseMobilityKernel.cpp} | 2 +- 74 files changed, 3682 insertions(+), 3394 deletions(-) delete mode 100644 src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{FlowSolverBaseKernels.hpp => MinPoreVolumeMaxPorosityKernel.hpp} (74%) delete mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp delete mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/StencilWeightsUpdateKernel.hpp delete mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => compositional}/CompositionalMultiphaseHybridFVMKernels.cpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => compositional}/CompositionalMultiphaseHybridFVMKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => compositional}/DissipationCompositionalMultiphaseFVMKernels.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => compositional}/IsothermalCompositionalMultiphaseBaseKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => compositional}/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => compositional}/IsothermalCompositionalMultiphaseFVMKernels.cpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => compositional}/IsothermalCompositionalMultiphaseFVMKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => compositional}/ReactiveCompositionalMultiphaseOBLKernels.hpp (100%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => compositional}/StabilizedCompositionalMultiphaseFVMKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => compositional}/ThermalCompositionalMultiphaseBaseKernels.hpp (99%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => compositional}/ThermalCompositionalMultiphaseFVMKernels.hpp (99%) create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AquiferBCKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/DirichletFluxComputeKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluidUpdateKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernelBase.hpp rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => singlePhase}/FluxKernelsHelper.hpp (75%) create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/HydrostaticPressureKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ => singlePhase}/SinglePhaseHybridFVMKernels.hpp (99%) create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolidInternalEnergyUpdateKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionScalingKernel.hpp rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{StabilizedSinglePhaseFVMKernels.hpp => singlePhase/StabilizedFluxComputeKernel.hpp} (86%) create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StatisticsKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalDirichletFluxComputeKernel.hpp rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{ThermalSinglePhaseFVMKernels.hpp => singlePhase/ThermalFluxComputeKernel.hpp} (52%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{SinglePhaseProppantBaseKernels.hpp => singlePhase/proppant/ProppantBaseKernels.hpp} (90%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{SinglePhaseProppantFluxKernels.cpp => singlePhase/proppant/ProppantFluxKernels.cpp} (98%) rename src/coreComponents/physicsSolvers/fluidFlow/kernels/{SinglePhaseProppantFluxKernels.hpp => singlePhase/proppant/ProppantFluxKernels.hpp} (100%) rename src/coreComponents/unitTests/fluidFlowTests/{testSinglePhaseBaseKernels.cpp => testSinglePhaseMobilityKernel.cpp} (96%) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 9e1edda941d..733e3a80147 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3426-8601-e33a77f + baseline: integratedTests/baseline_integratedTests-pr3372-8610-4b9a7b3 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 9608f0ed42a..d9bc0a2e825 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,7 +6,12 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3372 (2024-11-09) +==================== +Fix a bug related to mass and energy updates for poromechanics. + PR #3426 (2024-11-08) +==================== Bugfix: reset accumulation in fracture when time step cut occurs in hydrofrac solver. PR #3413 (2024-11-07) diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index cc9093e1174..c6e3fd499e9 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -172,7 +172,6 @@ set( constitutive_headers thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp thermalConductivity/SinglePhaseThermalConductivity.hpp thermalConductivity/SinglePhaseThermalConductivityBase.hpp - thermalConductivity/SinglePhaseThermalConductivityFields.hpp thermalConductivity/SinglePhaseThermalConductivitySelector.hpp thermalConductivity/ThermalConductivityFields.hpp ) diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp index d4760a4d871..2ee0fa4a908 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp @@ -19,7 +19,6 @@ #include "SinglePhaseThermalConductivityBase.hpp" #include "ThermalConductivityFields.hpp" -#include "SinglePhaseThermalConductivityFields.hpp" namespace geos { diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp deleted file mode 100644 index 267183f85c3..00000000000 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * 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 SinglePhaseThermalConductivityFields.hpp - */ - -#ifndef GEOS_CONSTITUTIVE_SINGLEPHASE_THERMALCONDUCTIVITY_THERMALCONDUCTIVITYFIELDS_HPP_ -#define GEOS_CONSTITUTIVE_SINGLEPHASE_THERMALCONDUCTIVITY_THERMALCONDUCTIVITYFIELDS_HPP_ - -#include "constitutive/relativePermeability/layouts.hpp" -#include "mesh/MeshFields.hpp" - -namespace geos -{ - -namespace fields -{ - -namespace thermalconductivity -{ - -DECLARE_FIELD( dEffectiveConductivity_dPorosity, - "dEffectiveConductivity_dPorosity", - array3d< real64 >, - 0, - NOPLOT, - NO_WRITE, - "Derivative of effective conductivity with respect to porosity" ); - -} - -} - -} - -#endif // GEOS_CONSTITUTIVE_SINGLEPHASE_THERMALCONDUCTIVITY_THERMALCONDUCTIVITYFIELDS_HPP_ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt index 8fae050093f..46712916a82 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt @@ -1,59 +1,72 @@ # Specify solver headers set( physicsSolvers_headers ${physicsSolvers_headers} + fluidFlow/FlowSolverBase.hpp + fluidFlow/FlowSolverBaseFields.hpp fluidFlow/CompositionalMultiphaseBase.hpp fluidFlow/CompositionalMultiphaseBaseFields.hpp fluidFlow/CompositionalMultiphaseStatistics.hpp - fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp - fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp fluidFlow/CompositionalMultiphaseFVM.hpp - fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp - fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp - fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp fluidFlow/CompositionalMultiphaseHybridFVM.hpp - fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.hpp fluidFlow/CompositionalMultiphaseUtilities.hpp fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp - fluidFlow/kernels/ReactiveCompositionalMultiphaseOBLKernels.hpp - fluidFlow/FlowSolverBase.hpp - fluidFlow/FlowSolverBaseFields.hpp - fluidFlow/kernels/FlowSolverBaseKernels.hpp - fluidFlow/kernels/FluxKernelsHelper.hpp - fluidFlow/kernels/HybridFVMHelperKernels.hpp fluidFlow/SourceFluxStatistics.hpp - fluidFlow/proppantTransport/ProppantTransport.hpp - fluidFlow/proppantTransport/ProppantTransportFields.hpp - fluidFlow/proppantTransport/ProppantTransportKernels.hpp fluidFlow/SinglePhaseBase.hpp fluidFlow/SinglePhaseBaseFields.hpp - fluidFlow/kernels/SinglePhaseBaseKernels.hpp fluidFlow/SinglePhaseStatistics.hpp fluidFlow/SinglePhaseFVM.hpp - fluidFlow/kernels/SinglePhaseFVMKernels.hpp fluidFlow/SinglePhaseHybridFVM.hpp - fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp fluidFlow/SinglePhaseProppantBase.hpp - fluidFlow/kernels/SinglePhaseProppantBaseKernels.hpp - fluidFlow/kernels/SinglePhaseProppantFluxKernels.hpp - fluidFlow/kernels/StabilizedCompositionalMultiphaseFVMKernels.hpp - fluidFlow/kernels/StabilizedSinglePhaseFVMKernels.hpp fluidFlow/StencilAccessors.hpp fluidFlow/StencilDataCollection.hpp - fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp - fluidFlow/kernels/ThermalSinglePhaseFVMKernels.hpp fluidFlow/LogLevelsInfo.hpp + fluidFlow/kernels/MinPoreVolumeMaxPorosityKernel.hpp + fluidFlow/kernels/StencilWeightsUpdateKernel.hpp + fluidFlow/kernels/HybridFVMHelperKernels.hpp + fluidFlow/kernels/singlePhase/AccumulationKernels.hpp + fluidFlow/kernels/singlePhase/AquiferBCKernel.hpp + fluidFlow/kernels/singlePhase/DirichletFluxComputeKernel.hpp + fluidFlow/kernels/singlePhase/FluidUpdateKernel.hpp + fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp + fluidFlow/kernels/singlePhase/FluxComputeKernelBase.hpp + fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp + fluidFlow/kernels/singlePhase/HydrostaticPressureKernel.hpp + fluidFlow/kernels/singlePhase/MobilityKernel.hpp + fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp + fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp + fluidFlow/kernels/singlePhase/SolidInternalEnergyUpdateKernel.hpp + fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp + fluidFlow/kernels/singlePhase/SolutionScalingKernel.hpp + fluidFlow/kernels/singlePhase/StabilizedFluxComputeKernel.hpp + fluidFlow/kernels/singlePhase/StatisticsKernel.hpp + fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp + fluidFlow/kernels/singlePhase/ThermalDirichletFluxComputeKernel.hpp + fluidFlow/kernels/singlePhase/ThermalFluxComputeKernel.hpp + fluidFlow/kernels/singlePhase/proppant/ProppantBaseKernels.hpp + fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.hpp + fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp + fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp + fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp + fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp + fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseFVMKernels.hpp + fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp + fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp + fluidFlow/kernels/compositional/StabilizedCompositionalMultiphaseFVMKernels.hpp fluidFlow/wells/CompositionalMultiphaseWell.hpp fluidFlow/wells/CompositionalMultiphaseWellFields.hpp - fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp fluidFlow/wells/SinglePhaseWell.hpp fluidFlow/wells/SinglePhaseWellFields.hpp - fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp fluidFlow/wells/WellConstants.hpp fluidFlow/wells/WellControls.hpp fluidFlow/wells/WellSolverBase.hpp fluidFlow/wells/WellSolverBaseFields.hpp fluidFlow/wells/LogLevelsInfo.hpp + fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp + fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp + fluidFlow/proppantTransport/ProppantTransport.hpp + fluidFlow/proppantTransport/ProppantTransportFields.hpp + fluidFlow/proppantTransport/ProppantTransportKernels.hpp PARENT_SCOPE ) # Specify solver sources @@ -62,27 +75,27 @@ set( physicsSolvers_sources fluidFlow/CompositionalMultiphaseBase.cpp fluidFlow/CompositionalMultiphaseFVM.cpp fluidFlow/CompositionalMultiphaseStatistics.cpp - fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.cpp fluidFlow/CompositionalMultiphaseHybridFVM.cpp - fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.cpp fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp fluidFlow/FlowSolverBase.cpp - fluidFlow/proppantTransport/ProppantTransport.cpp - fluidFlow/proppantTransport/ProppantTransportKernels.cpp fluidFlow/SinglePhaseBase.cpp fluidFlow/SinglePhaseStatistics.cpp fluidFlow/SinglePhaseFVM.cpp fluidFlow/SinglePhaseHybridFVM.cpp fluidFlow/SinglePhaseProppantBase.cpp - fluidFlow/kernels/SinglePhaseProppantFluxKernels.cpp fluidFlow/SourceFluxStatistics.cpp fluidFlow/StencilDataCollection.cpp + fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.cpp + fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.cpp + fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.cpp fluidFlow/wells/CompositionalMultiphaseWell.cpp fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp fluidFlow/wells/SinglePhaseWell.cpp fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp fluidFlow/wells/WellControls.cpp fluidFlow/wells/WellSolverBase.cpp + fluidFlow/proppantTransport/ProppantTransport.cpp + fluidFlow/proppantTransport/ProppantTransportKernels.cpp PARENT_SCOPE ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 464785fcaba..62097a5b9ea 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -41,9 +41,9 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp" // TODO this should not be here -#include "physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp" // TODO this should not be here +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp" #if defined( __INTEL_COMPILER ) #pragma GCC optimize "O0" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 5cb1ecf2a15..7c640319397 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -36,12 +36,12 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/StabilizedCompositionalMultiphaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/DissipationCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/StabilizedCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/DissipationCompositionalMultiphaseFVMKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index 4d85ccd30ab..1901b5570c4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -30,8 +30,8 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" /** * @namespace the geos namespace that encapsulates the majority of the code diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp index b485cc60657..a065a32ca64 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp @@ -30,8 +30,8 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp" #include "physicsSolvers/fluidFlow/LogLevelsInfo.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 13e98e59f00..f803e7c7e1e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -32,8 +32,8 @@ #include "finiteVolume/FluxApproximationBase.hpp" #include "mesh/DomainPartition.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/FlowSolverBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" +#include "physicsSolvers/fluidFlow/kernels/MinPoreVolumeMaxPorosityKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/StencilWeightsUpdateKernel.hpp" namespace geos { @@ -709,14 +709,13 @@ void FlowSolverBase::saveAquiferConvergedState( real64 const & time, elemManager.constructFieldAccessor< fields::flow::gravityCoefficient >(); gravCoef.setName( getName() + "/accessors/" + fields::flow::gravityCoefficient::key() ); - real64 const targetSetSumFluxes = - fluxKernelsHelper::AquiferBCKernel::sumFluxes( stencil, - aquiferBCWrapper, - pressure.toNestedViewConst(), - pressure_n.toNestedViewConst(), - gravCoef.toNestedViewConst(), - time, - dt ); + real64 const targetSetSumFluxes = sumAquiferFluxes( stencil, + aquiferBCWrapper, + pressure.toNestedViewConst(), + pressure_n.toNestedViewConst(), + gravCoef.toNestedViewConst(), + time, + dt ); localIndex const aquiferIndex = aquiferNameToAquiferId.at( bc.getName() ); localSumFluxes[aquiferIndex] += targetSetSumFluxes; @@ -744,6 +743,49 @@ void FlowSolverBase::saveAquiferConvergedState( real64 const & time, } ); } +/** + * @brief Function to sum the aquiferBC fluxes (as later save them) at the end of the time step + * This function is applicable for both single-phase and multiphase flow + */ +real64 +FlowSolverBase::sumAquiferFluxes( BoundaryStencil const & stencil, + AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper, + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & presOld, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + real64 const & timeAtBeginningOfStep, + real64 const & dt ) +{ + using Order = BoundaryStencil::Order; + + BoundaryStencil::IndexContainerViewConstType const & seri = stencil.getElementRegionIndices(); + BoundaryStencil::IndexContainerViewConstType const & sesri = stencil.getElementSubRegionIndices(); + BoundaryStencil::IndexContainerViewConstType const & sefi = stencil.getElementIndices(); + BoundaryStencil::WeightContainerViewConstType const & weight = stencil.getWeights(); + + RAJA::ReduceSum< parallelDeviceReduce, real64 > targetSetSumFluxes( 0.0 ); + + forAll< parallelDevicePolicy<> >( stencil.size(), [=] GEOS_HOST_DEVICE ( localIndex const iconn ) + { + localIndex const er = seri( iconn, Order::ELEM ); + localIndex const esr = sesri( iconn, Order::ELEM ); + localIndex const ei = sefi( iconn, Order::ELEM ); + real64 const areaFraction = weight( iconn, Order::ELEM ); + + // compute the aquifer influx rate using the pressure influence function and the aquifer props + real64 dAquiferVolFlux_dPres = 0.0; + real64 const aquiferVolFlux = aquiferBCWrapper.compute( timeAtBeginningOfStep, + dt, + pres[er][esr][ei], + presOld[er][esr][ei], + gravCoef[er][esr][ei], + areaFraction, + dAquiferVolFlux_dPres ); + targetSetSumFluxes += aquiferVolFlux; + } ); + return targetSetSumFluxes.get(); +} + void FlowSolverBase::prepareStencilWeights( DomainPartition & domain ) const { forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index ae1054fdd89..6b65e91e979 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -22,6 +22,8 @@ #include "physicsSolvers/PhysicsSolverBase.hpp" #include "common/Units.hpp" +#include "finiteVolume/BoundaryStencil.hpp" +#include "fieldSpecification/AquiferBoundaryCondition.hpp" namespace geos { @@ -34,6 +36,9 @@ namespace geos */ class FlowSolverBase : public PhysicsSolverBase { + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + public: /// String used to form the solverName used to register single-physics solvers in CoupledSolver @@ -160,6 +165,14 @@ class FlowSolverBase : public PhysicsSolverBase void enableLaggingFractureStencilWeightsUpdate(){ m_isLaggingFractureStencilWeightsUpdate = 1; }; + real64 sumAquiferFluxes( BoundaryStencil const & stencil, + AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper, + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & presOld, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + real64 const & timeAtBeginningOfStep, + real64 const & dt ); + protected: /** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index df64cbd846c..ff324042411 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -32,7 +32,7 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/ReactiveCompositionalMultiphaseOBLKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 1acf5ced456..8261e822868 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -40,8 +40,15 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/SolutionScalingKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/StatisticsKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/HydrostaticPressureKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluidUpdateKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/SolidInternalEnergyUpdateKernel.hpp" namespace geos @@ -258,7 +265,7 @@ void SinglePhaseBase::updateFluidModel( ObjectManagerBase & dataGroup ) const constitutiveUpdatePassThru( fluid, [&]( auto & castedFluid ) { typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); - thermalSinglePhaseBaseKernels::FluidUpdateKernel::launch( fluidWrapper, pres, temp ); + singlePhaseBaseKernels::FluidUpdateKernel::launch( fluidWrapper, pres, temp ); } ); } @@ -368,16 +375,16 @@ void SinglePhaseBase::updateMobility( ObjectManagerBase & dataGroup ) const ThermalFluidPropViews thermalFluidProps = getThermalFluidProperties( fluid ); - thermalSinglePhaseBaseKernels::MobilityKernel::launch< parallelDevicePolicy<> >( dataGroup.size(), - fluidProps.dens, - fluidProps.dDens_dPres, - thermalFluidProps.dDens_dTemp, - fluidProps.visc, - fluidProps.dVisc_dPres, - thermalFluidProps.dVisc_dTemp, - mob, - dMob_dPres, - dMob_dTemp ); + singlePhaseBaseKernels::MobilityKernel::launch< parallelDevicePolicy<> >( dataGroup.size(), + fluidProps.dens, + fluidProps.dDens_dPres, + thermalFluidProps.dDens_dTemp, + fluidProps.visc, + fluidProps.dVisc_dPres, + thermalFluidProps.dVisc_dTemp, + mob, + dMob_dPres, + dMob_dTemp ); } else { @@ -1328,7 +1335,7 @@ real64 SinglePhaseBase::scalingForSystemSolution( DomainPartition & domain, arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); auto const subRegionData = - singlePhaseBaseKernels::ScalingForSystemSolutionKernel:: + singlePhaseBaseKernels::SolutionScalingKernel:: launch< parallelDevicePolicy<> >( localSolution, rankOffset, dofNumber, ghostRank, m_maxAbsolutePresChange ); scalingFactor = std::min( scalingFactor, subRegionData.first ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index e32196fc9f1..bf1cd19eadd 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -21,8 +21,8 @@ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEBASE_HPP_ #include "physicsSolvers/fluidFlow/FlowSolverBase.hpp" -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "constitutive/solid/CoupledSolidBase.hpp" @@ -446,7 +446,7 @@ void SinglePhaseBase::accumulationAssemblyLaunch( DofManager const & dofManager, if( m_isThermal ) { thermalSinglePhaseBaseKernels:: - ElementBasedAssemblyKernelFactory:: + AccumulationKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), dofKey, subRegion, @@ -458,7 +458,7 @@ void SinglePhaseBase::accumulationAssemblyLaunch( DofManager const & dofManager, else { singlePhaseBaseKernels:: - ElementBasedAssemblyKernelFactory:: + AccumulationKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), dofKey, subRegion, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index e69e9d9994a..b87ce6bcf75 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -33,12 +33,16 @@ #include "fieldSpecification/AquiferBoundaryCondition.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/StabilizedSinglePhaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/ThermalFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/DirichletFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/ThermalDirichletFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/StabilizedFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/AquiferBCKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp" @@ -148,29 +152,17 @@ real64 SinglePhaseFVM< BASE >::calculateResidualNorm( real64 const & GEOS_UNUSED real64 subRegionResidualNorm[numNorm]{}; real64 subRegionResidualNormalizer[numNorm]{}; - string const & fluidName = subRegion.template getReference< string >( BASE::viewKeyStruct::fluidNamesString() ); - SingleFluidBase const & fluid = PhysicsSolverBase::getConstitutiveModel< SingleFluidBase >( subRegion, fluidName ); - // step 1: compute the norm in the subRegion if( m_isThermal ) { - string const & solidName = subRegion.template getReference< string >( BASE::viewKeyStruct::solidNamesString() ); - CoupledSolidBase const & solid = PhysicsSolverBase::getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); - - string const & solidInternalEnergyName = subRegion.template getReference< string >( BASE::viewKeyStruct::solidInternalEnergyNamesString() ); - SolidInternalEnergy const & solidInternalEnergy = PhysicsSolverBase::getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); - - thermalSinglePhaseBaseKernels:: + singlePhaseBaseKernels:: ResidualNormKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( normType, rankOffset, dofKey, localRhs, subRegion, - fluid, - solid, - solidInternalEnergy, m_nonlinearSolverParameters.m_minNormalizer, subRegionResidualNorm, subRegionResidualNormalizer ); @@ -328,26 +320,26 @@ void SinglePhaseFVM<>::assembleFluxTerms( real64 const dt, if( m_isThermal ) { thermalSinglePhaseFVMKernels:: - FaceBasedAssemblyKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), - dofKey, - getName(), - mesh.getElemManager(), - stencilWrapper, - dt, - localMatrix.toViewConstSizes(), - localRhs.toView() ); + FluxComputeKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), + dofKey, + getName(), + mesh.getElemManager(), + stencilWrapper, + dt, + localMatrix.toViewConstSizes(), + localRhs.toView() ); } else { singlePhaseFVMKernels:: - FaceBasedAssemblyKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), - dofKey, - getName(), - mesh.getElemManager(), - stencilWrapper, - dt, - localMatrix.toViewConstSizes(), - localRhs.toView() ); + FluxComputeKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), + dofKey, + getName(), + mesh.getElemManager(), + stencilWrapper, + dt, + localMatrix.toViewConstSizes(), + localRhs.toView() ); } @@ -381,14 +373,14 @@ void SinglePhaseFVM< SinglePhaseBase >::assembleStabilizedFluxTerms( real64 cons typename TYPEOFREF( stencil ) ::KernelWrapper stencilWrapper = stencil.createKernelWrapper(); // No thermal support yet - stabilizedSinglePhaseFVMKernels::FaceBasedAssemblyKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), - dofKey, - getName(), - mesh.getElemManager(), - stencilWrapper, - dt, - localMatrix.toViewConstSizes(), - localRhs.toView() ); + stabilizedSinglePhaseFVMKernels::FluxComputeKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), + dofKey, + getName(), + mesh.getElemManager(), + stencilWrapper, + dt, + localMatrix.toViewConstSizes(), + localRhs.toView() ); } ); } ); @@ -425,9 +417,9 @@ void SinglePhaseFVM< SinglePhaseProppantBase >::assembleFluxTerms( real64 const { typename TYPEOFREF( stencil ) ::KernelWrapper stencilWrapper = stencil.createKernelWrapper(); - typename FaceBasedAssemblyKernelBase::SinglePhaseFlowAccessors flowAccessors( elemManager, getName() ); - typename FaceBasedAssemblyKernelBase::SlurryFluidAccessors fluidAccessors( elemManager, getName() ); - typename FaceBasedAssemblyKernelBase::ProppantPermeabilityAccessors permAccessors( elemManager, getName() ); + typename FluxComputeKernelBase::SinglePhaseFlowAccessors flowAccessors( elemManager, getName() ); + typename FluxComputeKernelBase::SlurryFluidAccessors fluidAccessors( elemManager, getName() ); + typename FluxComputeKernelBase::ProppantPermeabilityAccessors permAccessors( elemManager, getName() ); singlePhaseProppantFluxKernels::FaceElementFluxKernel::launch( stencilWrapper, dt, @@ -490,26 +482,26 @@ void SinglePhaseFVM< BASE >::assembleEDFMFluxTerms( real64 const GEOS_UNUSED_PAR if( m_isThermal ) { thermalSinglePhaseFVMKernels:: - FaceBasedAssemblyKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), - dofKey, - this->getName(), - mesh.getElemManager(), - stencilWrapper, - dt, - localMatrix.toViewConstSizes(), - localRhs.toView() ); + FluxComputeKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), + dofKey, + this->getName(), + mesh.getElemManager(), + stencilWrapper, + dt, + localMatrix.toViewConstSizes(), + localRhs.toView() ); } else { singlePhaseFVMKernels:: - FaceBasedAssemblyKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), - dofKey, - this->getName(), - mesh.getElemManager(), - stencilWrapper, - dt, - localMatrix.toViewConstSizes(), - localRhs.toView() ); + FluxComputeKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), + dofKey, + this->getName(), + mesh.getElemManager(), + stencilWrapper, + dt, + localMatrix.toViewConstSizes(), + localRhs.toView() ); } } ); @@ -579,26 +571,26 @@ void SinglePhaseFVM< BASE >::assembleHydrofracFluxTerms( real64 const GEOS_UNUSE if( m_isThermal ) { thermalSinglePhaseFVMKernels:: - FaceBasedAssemblyKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), - dofKey, - this->getName(), - mesh.getElemManager(), - stencilWrapper, - dt, - localMatrix.toViewConstSizes(), - localRhs.toView() ); + FluxComputeKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), + dofKey, + this->getName(), + mesh.getElemManager(), + stencilWrapper, + dt, + localMatrix.toViewConstSizes(), + localRhs.toView() ); } else { singlePhaseFVMKernels:: - FaceBasedAssemblyKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), - dofKey, - this->getName(), - mesh.getElemManager(), - stencilWrapper, - dt, - localMatrix.toViewConstSizes(), - localRhs.toView() ); + FluxComputeKernelFactory::createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), + dofKey, + this->getName(), + mesh.getElemManager(), + stencilWrapper, + dt, + localMatrix.toViewConstSizes(), + localRhs.toView() ); } } ); @@ -787,7 +779,7 @@ void SinglePhaseFVM< BASE >::applyFaceDirichletBC( real64 const time_n, SingleFluidBase & fluidBase = subRegion.getConstitutiveModel< SingleFluidBase >( fluidName ); thermalSinglePhaseFVMKernels:: - DirichletFaceBasedAssemblyKernelFactory:: + DirichletFluxComputeKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), dofKey, this->getName(), @@ -848,7 +840,7 @@ void SinglePhaseFVM< BASE >::applyFaceDirichletBC( real64 const time_n, BoundaryStencilWrapper const stencilWrapper = stencil.createKernelWrapper(); singlePhaseFVMKernels:: - DirichletFaceBasedAssemblyKernelFactory:: + DirichletFluxComputeKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( dofManager.rankOffset(), dofKey, this->getName(), @@ -903,8 +895,8 @@ void SinglePhaseFVM<>::applyAquiferBC( real64 const time, elemManager.constructArrayViewAccessor< globalIndex, 1 >( elemDofKey ); elemDofNumber.setName( this->getName() + "/accessors/" + elemDofKey ); - typename FaceBasedAssemblyKernelBase::SinglePhaseFlowAccessors flowAccessors( elemManager, this->getName() ); - typename FaceBasedAssemblyKernelBase::SinglePhaseFluidAccessors fluidAccessors( elemManager, this->getName() ); + typename FluxComputeKernelBase::SinglePhaseFlowAccessors flowAccessors( elemManager, this->getName() ); + typename FluxComputeKernelBase::SinglePhaseFluidAccessors fluidAccessors( elemManager, this->getName() ); fsManager.apply< FaceManager, AquiferBoundaryCondition >( time + dt, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index b9bfd4d43de..233eb1d1363 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -23,12 +23,16 @@ #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" #include "fieldSpecification/AquiferBoundaryCondition.hpp" #include "fieldSpecification/FieldSpecificationManager.hpp" +#include "discretizationMethods/NumericalMethodsManager.hpp" +#include "finiteVolume/FiniteVolumeManager.hpp" #include "finiteVolume/HybridMimeticDiscretization.hpp" #include "finiteVolume/MimeticInnerProductDispatch.hpp" #include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp" /** diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp index 8019edb5d63..0a5ccd5d41e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp @@ -20,6 +20,7 @@ #include "SinglePhaseProppantBase.hpp" +#include "mesh/DomainPartition.hpp" #include "constitutive/ConstitutivePassThru.hpp" #include "constitutive/fluid/singlefluid/SlurryFluidSelector.hpp" #include "constitutive/fluid/singlefluid/SingleFluidFields.hpp" @@ -27,7 +28,7 @@ #include "constitutive/solid/ProppantSolid.hpp" #include "constitutive/solid/porosity/ProppantPorosity.hpp" #include "physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseProppantBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantBaseKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp index 3b08616102f..fca8f4cfc99 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp @@ -19,12 +19,13 @@ #include "SinglePhaseStatistics.hpp" +#include "mesh/DomainPartition.hpp" #include "mainInterface/ProblemManager.hpp" #include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/StatisticsKernel.hpp" #include "physicsSolvers/fluidFlow/LogLevelsInfo.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp index 8aff3af7d74..c3eb3805be3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp @@ -14,15 +14,13 @@ */ /** - * @file CompositionalMultiphaseHybridFVMHelperKernels.hpp + * @file HybridFVMHelperKernels.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_HYBRIDFVMUPWINDINGHELPERKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_HYBRIDFVMUPWINDINGHELPERKERNELS_HPP +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_HYBRIDFVMHELPERKERNELS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_HYBRIDFVMHELPERKERNELS_HPP #include "common/DataTypes.hpp" -#include "linearAlgebra/interfaces/InterfaceTypes.hpp" -#include "mesh/MeshLevel.hpp" namespace geos { @@ -91,4 +89,4 @@ struct CellConnectivity } // namespace geos -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONALMULTIPHASEHYBRIDFVMUPWINDINGHELPERKERNELS_HPP +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_HYBRIDFVMHELPERKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/FlowSolverBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/MinPoreVolumeMaxPorosityKernel.hpp similarity index 74% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/FlowSolverBaseKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/MinPoreVolumeMaxPorosityKernel.hpp index 4c3b0f0df36..6d930e5d592 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/FlowSolverBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/MinPoreVolumeMaxPorosityKernel.hpp @@ -14,11 +14,11 @@ */ /** - * @file FlowSolverBaseKernels.hpp + * @file MinPoreVolumeMaxPorosityKernel.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_FLOWSOLVERBASEKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_FLOWSOLVERBASEKERNELS_HPP +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_MINPOREVOLUMEMAXPOROSITYKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_MINPOREVOLUMEMAXPOROSITYKERNEL_HPP #include "common/DataTypes.hpp" #include "common/GEOS_RAJA_Interface.hpp" @@ -33,9 +33,6 @@ namespace flowSolverBaseKernels /// Threshold for the min pore volume (below, a warning is issued) static constexpr real64 poreVolumeThreshold = 1e-4; -template< typename VIEWTYPE > -using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - /** * @struct MinPoreVolumeMaxPorosityKernel * @brief Kernel to compute the min pore volume and the max porosity in a subRegion @@ -106,47 +103,8 @@ struct MinPoreVolumeMaxPorosityKernel } }; -/** - * @brief - * - * @tparam STENCILWRAPPER - */ -template< typename STENCILWRAPPER > -struct stencilWeightsUpdateKernel -{ - /** - * @brief - * - * @param stencilWrappper - * @param hydraulicAperture - */ - inline static void prepareStencilWeights( STENCILWRAPPER & stencilWrapper, - ElementViewConst< arrayView1d< real64 const > > const hydraulicAperture ) - { - forAll< parallelDevicePolicy<> >( stencilWrapper.size(), [=] GEOS_HOST_DEVICE ( localIndex const iconn ) - { - stencilWrapper.removeHydraulicApertureContribution( iconn, hydraulicAperture ); - } ); - } - - /** - * @brief - * - * @param stencilWrappper - * @param hydraulicAperture - */ - inline static void updateStencilWeights( STENCILWRAPPER & stencilWrapper, - ElementViewConst< arrayView1d< real64 const > > const hydraulicAperture ) - { - forAll< parallelDevicePolicy<> >( stencilWrapper.size(), [=] GEOS_HOST_DEVICE ( localIndex const iconn ) - { - stencilWrapper.addHydraulicApertureContribution( iconn, hydraulicAperture ); - } ); - } -}; - } // namespace flowSolverBaseKernels } // namespace geos -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_FLOWSOLVERBASEKERNELS_HPP +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_MINPOREVOLUMEMAXPOROSITYKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp deleted file mode 100644 index d51885d0443..00000000000 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp +++ /dev/null @@ -1,897 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * 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 SinglePhaseBaseKernels.hpp - */ - -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEBASEKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEBASEKERNELS_HPP - -#include "common/DataTypes.hpp" -#include "common/GEOS_RAJA_Interface.hpp" -#include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" -#include "constitutive/solid/CoupledSolidBase.hpp" -#include "finiteVolume/FluxApproximationBase.hpp" -#include "linearAlgebra/interfaces/InterfaceTypes.hpp" -#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" -#include "codingUtilities/Utilities.hpp" - -namespace geos -{ - -namespace singlePhaseBaseKernels -{ - -/******************************** MobilityKernel ********************************/ - -struct MobilityKernel -{ - GEOS_HOST_DEVICE - inline - static void - compute( real64 const & dens, - real64 const & dDens_dPres, - real64 const & visc, - real64 const & dVisc_dPres, - real64 & mob, - real64 & dMob_dPres ) - { - mob = dens / visc; - dMob_dPres = dDens_dPres / visc - mob / visc * dVisc_dPres; - } - - GEOS_HOST_DEVICE - inline - static void - compute( real64 const & dens, - real64 const & visc, - real64 & mob ) - { - mob = dens / visc; - } - - template< typename POLICY > - static void launch( localIndex const size, - arrayView2d< real64 const > const & dens, - arrayView2d< real64 const > const & dDens_dPres, - arrayView2d< real64 const > const & visc, - arrayView2d< real64 const > const & dVisc_dPres, - arrayView1d< real64 > const & mob, - arrayView1d< real64 > const & dMob_dPres ) - { - forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const a ) - { - compute( dens[a][0], - dDens_dPres[a][0], - visc[a][0], - dVisc_dPres[a][0], - mob[a], - dMob_dPres[a] ); - } ); - } - - template< typename POLICY > - static void launch( localIndex const size, - arrayView2d< real64 const > const & dens, - arrayView2d< real64 const > const & visc, - arrayView1d< real64 > const & mob ) - { - forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const a ) - { - compute( dens[a][0], - visc[a][0], - mob[a] ); - } ); - } -}; - -/******************************** ElementBasedAssemblyKernel ********************************/ - -/** - * @class ElementBasedAssemblyKernel - * @brief Define the interface for the assembly kernel in charge of accumulation - */ -template< typename SUBREGION_TYPE, integer NUM_DOF > -class ElementBasedAssemblyKernel -{ - -public: - - /// Compute time value for the number of degrees of freedom - static constexpr integer numDof = NUM_DOF; - - /// Compute time value for the number of equations - static constexpr integer numEqn = NUM_DOF; - - /** - * @brief Constructor - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - ElementBasedAssemblyKernel( globalIndex const rankOffset, - string const dofKey, - SUBREGION_TYPE const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - : - m_rankOffset( rankOffset ), - m_dofNumber( subRegion.template getReference< array1d< globalIndex > >( dofKey ) ), - m_elemGhostRank( subRegion.ghostRank() ), - m_volume( subRegion.getElementVolume() ), - m_deltaVolume( subRegion.template getField< fields::flow::deltaVolume >() ), - m_porosity( solid.getPorosity() ), - m_dPoro_dPres( solid.getDporosity_dPressure() ), - m_density( fluid.density() ), - m_dDensity_dPres( fluid.dDensity_dPressure() ), - m_mass_n( subRegion.template getField< fields::flow::mass_n >() ), - m_localMatrix( localMatrix ), - m_localRhs( localRhs ) - {} - - /** - * @struct StackVariables - * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack - */ - struct StackVariables - { -public: - - // Pore volume information - - /// Pore volume at time n+1 - real64 poreVolume = 0.0; - - /// Derivative of pore volume with respect to pressure - real64 dPoreVolume_dPres = 0.0; - - // Residual information - - /// Index of the local row corresponding to this element - localIndex localRow = -1; - - /// Index of the matrix row/column corresponding to the dof in this element - globalIndex dofIndices[numDof]{}; - - /// Storage for the element local residual vector - real64 localResidual[numEqn]{}; - - /// Storage for the element local Jacobian matrix - real64 localJacobian[numEqn][numDof]{}; - - }; - - /** - * @brief Getter for the ghost rank of an element - * @param[in] ei the element index - * @return the ghost rank of the element - */ - GEOS_HOST_DEVICE - integer elemGhostRank( localIndex const ei ) const - { return m_elemGhostRank( ei ); } - - - /** - * @brief Performs the setup phase for the kernel. - * @param[in] ei the element index - * @param[in] stack the stack variables - */ - GEOS_HOST_DEVICE - void setup( localIndex const ei, - StackVariables & stack ) const - { - // initialize the pore volume - stack.poreVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * m_porosity[ei][0]; - stack.dPoreVolume_dPres = ( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dPres[ei][0]; - - // set row index and degrees of freedom indices for this element - stack.localRow = m_dofNumber[ei] - m_rankOffset; - for( integer idof = 0; idof < numDof; ++idof ) - { - stack.dofIndices[idof] = m_dofNumber[ei] + idof; - } - } - - /** - * @brief Compute the local accumulation contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[inout] stack the stack variables - * @param[in] kernelOp the function used to customize the kernel - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void computeAccumulation( localIndex const ei, - StackVariables & stack, - FUNC && kernelOp = NoOpFunc{} ) const - { - // Residual contribution is mass conservation in the cell - stack.localResidual[0] = stack.poreVolume * m_density[ei][0] - m_mass_n[ei]; - - // Derivative of residual wrt to pressure in the cell - stack.localJacobian[0][0] = stack.dPoreVolume_dPres * m_density[ei][0] + m_dDensity_dPres[ei][0] * stack.poreVolume; - - // Customize the kernel with this lambda - kernelOp(); - } - - /** - * @brief Performs the complete phase for the kernel. - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void complete( localIndex const GEOS_UNUSED_PARAM( ei ), - StackVariables & stack ) const - { - // add contribution to global residual and jacobian (no need for atomics here) - m_localMatrix.template addToRow< serialAtomic >( stack.localRow, - stack.dofIndices, - stack.localJacobian[0], - numDof ); - m_localRhs[stack.localRow] += stack.localResidual[0]; - - } - - /** - * @brief Performs the kernel launch - * @tparam POLICY the policy used in the RAJA kernels - * @tparam KERNEL_TYPE the kernel type - * @param[in] numElems the number of elements - * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables - */ - template< typename POLICY, typename KERNEL_TYPE > - static void - launch( localIndex const numElems, - KERNEL_TYPE const & kernelComponent ) - { - GEOS_MARK_FUNCTION; - - forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( kernelComponent.elemGhostRank( ei ) >= 0 ) - { - return; - } - - typename KERNEL_TYPE::StackVariables stack; - - kernelComponent.setup( ei, stack ); - kernelComponent.computeAccumulation( ei, stack ); - kernelComponent.complete( ei, stack ); - } ); - } - -protected: - - /// Offset for my MPI rank - globalIndex const m_rankOffset; - - /// View on the dof numbers - arrayView1d< globalIndex const > const m_dofNumber; - - /// View on the ghost ranks - arrayView1d< integer const > const m_elemGhostRank; - - /// View on the element volumes - arrayView1d< real64 const > const m_volume; - arrayView1d< real64 const > const m_deltaVolume; - - /// Views on the porosity - arrayView2d< real64 const > const m_porosity; - arrayView2d< real64 const > const m_dPoro_dPres; - - /// Views on density - arrayView2d< real64 const > const m_density; - arrayView2d< real64 const > const m_dDensity_dPres; - - /// View on mass - arrayView1d< real64 const > const m_mass_n; - - /// View on the local CRS matrix - CRSMatrixView< real64, globalIndex const > const m_localMatrix; - /// View on the local RHS - arrayView1d< real64 > const m_localRhs; - -}; - -/** - * @class SurfaceElementBasedAssemblyKernel - * @brief Define the interface for the assembly kernel in charge of accumulation in SurfaceElementSubRegion - */ -class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< SurfaceElementSubRegion, 1 > -{ - -public: - - using Base = ElementBasedAssemblyKernel< SurfaceElementSubRegion, 1 >; - - /** - * @brief Constructor - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - SurfaceElementBasedAssemblyKernel( globalIndex const rankOffset, - string const dofKey, - SurfaceElementSubRegion const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ) - , m_creationMass( subRegion.getField< fields::flow::massCreated >() ) - {} - - /** - * @brief Compute the local accumulation contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void computeAccumulation( localIndex const ei, - Base::StackVariables & stack ) const - { - Base::computeAccumulation( ei, stack, [&] () - { - if( Base::m_mass_n[ei] > 1.1 * m_creationMass[ei] ) - { - stack.localResidual[0] += m_creationMass[ei] * 0.25; - } - } ); - } - -protected: - - arrayView1d< real64 const > const m_creationMass; - -}; - -/** - * @class ElementBasedAssemblyKernelFactory - */ -class ElementBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY > - static void - createAndLaunch( globalIndex const rankOffset, - string const dofKey, - CellElementSubRegion const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - integer constexpr NUM_DOF = 1; - - ElementBasedAssemblyKernel< CellElementSubRegion, NUM_DOF > - kernel( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ); - ElementBasedAssemblyKernel< CellElementSubRegion, NUM_DOF >::template launch< POLICY >( subRegion.size(), kernel ); - } - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY > - static void - createAndLaunch( globalIndex const rankOffset, - string const dofKey, - SurfaceElementSubRegion const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - SurfaceElementBasedAssemblyKernel - kernel( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ); - SurfaceElementBasedAssemblyKernel::launch< POLICY >( subRegion.size(), kernel ); - } - -}; - -/******************************** ResidualNormKernel ********************************/ - -/** - * @class ResidualNormKernel - */ -class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 1 > -{ -public: - - using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 1 >; - using Base::m_minNormalizer; - using Base::m_rankOffset; - using Base::m_localResidual; - using Base::m_dofNumber; - - ResidualNormKernel( globalIndex const rankOffset, - arrayView1d< real64 const > const & localResidual, - arrayView1d< globalIndex const > const & dofNumber, - arrayView1d< localIndex const > const & ghostRank, - ElementSubRegionBase const & subRegion, - real64 const minNormalizer ) - : Base( rankOffset, - localResidual, - dofNumber, - ghostRank, - minNormalizer ), - m_mass_n( subRegion.template getField< fields::flow::mass_n >() ) - {} - - GEOS_HOST_DEVICE - virtual void computeLinf( localIndex const ei, - LinfStackVariables & stack ) const override - { - real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_mass_n[ei] ); - real64 const valMass = LvArray::math::abs( m_localResidual[stack.localRow] ) / massNormalizer; - if( valMass > stack.localValue[0] ) - { - stack.localValue[0] = valMass; - } - } - - GEOS_HOST_DEVICE - virtual void computeL2( localIndex const ei, - L2StackVariables & stack ) const override - { - real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_mass_n[ei] ); - stack.localValue[0] += m_localResidual[stack.localRow] * m_localResidual[stack.localRow]; - stack.localNormalizer[0] += massNormalizer; - } - - -protected: - - /// View on mass at the previous converged time step - arrayView1d< real64 const > const m_mass_n; - -}; - -/** - * @class ResidualNormKernelFactory - */ -class ResidualNormKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] normType the type of norm used (Linf or L2) - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] localResidual the residual vector on my MPI rank - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[out] residualNorm the residual norm on the subRegion - * @param[out] residualNormalizer the residual normalizer on the subRegion - */ - template< typename POLICY > - static void - createAndLaunch( physicsSolverBaseKernels::NormType const normType, - globalIndex const rankOffset, - string const dofKey, - arrayView1d< real64 const > const & localResidual, - ElementSubRegionBase const & subRegion, - real64 const minNormalizer, - real64 (& residualNorm)[1], - real64 (& residualNormalizer)[1] ) - { - arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); - arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); - - ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, subRegion, minNormalizer ); - if( normType == physicsSolverBaseKernels::NormType::Linf ) - { - ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); - } - else // L2 norm - { - ResidualNormKernel::launchL2< POLICY >( subRegion.size(), kernel, residualNorm, residualNormalizer ); - } - } - -}; - -/******************************** SolutionCheckKernel ********************************/ - -struct SolutionCheckKernel -{ - template< typename POLICY > - static std::pair< integer, real64 > launch( arrayView1d< real64 const > const & localSolution, - globalIndex const rankOffset, - arrayView1d< globalIndex const > const & dofNumber, - arrayView1d< integer const > const & ghostRank, - arrayView1d< real64 const > const & pres, - real64 const scalingFactor ) - { - RAJA::ReduceSum< ReducePolicy< POLICY >, integer > numNegativePressures( 0 ); - RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minPres( 0.0 ); - - forAll< POLICY >( dofNumber.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( ghostRank[ei] < 0 && dofNumber[ei] >= 0 ) - { - localIndex const lid = dofNumber[ei] - rankOffset; - real64 const newPres = pres[ei] + scalingFactor * localSolution[lid]; - - if( newPres < 0.0 ) - { - numNegativePressures += 1; - minPres.min( newPres ); - } - } - - } ); - - return { numNegativePressures.get(), minPres.get() }; - } - -}; - -/******************************** ScalingForSystemSolutionKernel ********************************/ - -struct ScalingForSystemSolutionKernel -{ - template< typename POLICY > - static std::pair< real64, real64 > launch( arrayView1d< real64 const > const & localSolution, - globalIndex const rankOffset, - arrayView1d< globalIndex const > const & dofNumber, - arrayView1d< integer const > const & ghostRank, - real64 const maxAbsolutePresChange ) - { - RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > scalingFactor( 1.0 ); - RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaPres( 0.0 ); - - forAll< POLICY >( dofNumber.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) mutable - { - if( ghostRank[ei] < 0 && dofNumber[ei] >= 0 ) - { - localIndex const lid = dofNumber[ei] - rankOffset; - - // compute the change in pressure - real64 const absPresChange = LvArray::math::abs( localSolution[lid] ); - maxDeltaPres.max( absPresChange ); - - // maxAbsolutePresChange <= 0.0 means that scaling is disabled, and we are only collecting maxDeltaPres in this kernel - if( maxAbsolutePresChange > 0.0 && absPresChange > maxAbsolutePresChange ) - { - real64 const presScalingFactor = maxAbsolutePresChange / absPresChange; - scalingFactor.min( presScalingFactor ); - } - } - - } ); - - return { scalingFactor.get(), maxDeltaPres.get() }; - } - -}; - -/******************************** StatisticsKernel ********************************/ - -struct StatisticsKernel -{ - static void - saveDeltaPressure( localIndex const size, - arrayView1d< real64 const > const & pres, - arrayView1d< real64 const > const & initPres, - arrayView1d< real64 > const & deltaPres ) - { - forAll< parallelDevicePolicy<> >( size, [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - deltaPres[ei] = pres[ei] - initPres[ei]; - } ); - } - - static void - launch( localIndex const size, - arrayView1d< integer const > const & elemGhostRank, - arrayView1d< real64 const > const & volume, - arrayView1d< real64 const > const & pres, - arrayView1d< real64 const > const & deltaPres, - arrayView1d< real64 const > const & temp, - arrayView1d< real64 const > const & refPorosity, - arrayView2d< real64 const > const & porosity, - arrayView2d< real64 const > const & density, - real64 & minPres, - real64 & avgPresNumerator, - real64 & maxPres, - real64 & minDeltaPres, - real64 & maxDeltaPres, - real64 & minTemp, - real64 & avgTempNumerator, - real64 & maxTemp, - real64 & totalUncompactedPoreVol, - real64 & totalPoreVol, - real64 & totalMass ) - { - RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinPres( LvArray::NumericLimits< real64 >::max ); - RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionAvgPresNumerator( 0.0 ); - RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxPres( -LvArray::NumericLimits< real64 >::max ); - - RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinDeltaPres( LvArray::NumericLimits< real64 >::max ); - RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxDeltaPres( -LvArray::NumericLimits< real64 >::max ); - - RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinTemp( LvArray::NumericLimits< real64 >::max ); - RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionAvgTempNumerator( 0.0 ); - RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxTemp( -LvArray::NumericLimits< real64 >::max ); - - RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionTotalUncompactedPoreVol( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionTotalPoreVol( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionTotalMass( 0.0 ); - - forAll< parallelDevicePolicy<> >( size, [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( elemGhostRank[ei] >= 0 ) - { - return; - } - - // To match our "reference", we have to use reference porosity here, not the actual porosity when we compute averages - real64 const uncompactedPoreVol = volume[ei] * refPorosity[ei]; - real64 const dynamicPoreVol = volume[ei] * porosity[ei][0]; - - subRegionMinPres.min( pres[ei] ); - subRegionAvgPresNumerator += uncompactedPoreVol * pres[ei]; - subRegionMaxPres.max( pres[ei] ); - - subRegionMinDeltaPres.min( deltaPres[ei] ); - subRegionMaxDeltaPres.max( deltaPres[ei] ); - - subRegionMinTemp.min( temp[ei] ); - subRegionAvgTempNumerator += uncompactedPoreVol * temp[ei]; - subRegionMaxTemp.max( temp[ei] ); - - subRegionTotalUncompactedPoreVol += uncompactedPoreVol; - subRegionTotalPoreVol += dynamicPoreVol; - subRegionTotalMass += dynamicPoreVol * density[ei][0]; - } ); - - minPres = subRegionMinPres.get(); - avgPresNumerator = subRegionAvgPresNumerator.get(); - maxPres = subRegionMaxPres.get(); - - minDeltaPres = subRegionMinDeltaPres.get(); - maxDeltaPres = subRegionMaxDeltaPres.get(); - - minTemp = subRegionMinTemp.get(); - avgTempNumerator = subRegionAvgTempNumerator.get(); - maxTemp = subRegionMaxTemp.get(); - - totalUncompactedPoreVol = subRegionTotalUncompactedPoreVol.get(); - totalPoreVol = subRegionTotalPoreVol.get(); - totalMass = subRegionTotalMass.get(); - } -}; - - -/******************************** HydrostaticPressureKernel ********************************/ - -struct HydrostaticPressureKernel -{ - - template< typename FLUID_WRAPPER > - static bool - computeHydrostaticPressure( integer const maxNumEquilIterations, - real64 const & equilTolerance, - real64 const (&gravVector)[ 3 ], - FLUID_WRAPPER fluidWrapper, - real64 const & refElevation, - real64 const & refPres, - real64 const & refDens, - real64 const & newElevation, - real64 & newPres, - real64 & newDens ) - { - // Step 1: guess the pressure with the refDensity - - real64 const gravCoef = gravVector[2] * ( refElevation - newElevation ); - real64 pres0 = refPres - refDens * gravCoef; - real64 pres1 = 0.0; - - // Step 2: compute the mass density at this elevation using the guess, and update pressure - - real64 dens = 0.0; - real64 visc = 0.0; - constitutive::SingleFluidBaseUpdate::computeValues( fluidWrapper, - pres0, - dens, - visc ); - pres1 = refPres - 0.5 * ( refDens + dens ) * gravCoef; - - // Step 3: fixed-point iteration until convergence - - bool equilHasConverged = false; - for( localIndex eqIter = 0; eqIter < maxNumEquilIterations; ++eqIter ) - { - - // check convergence - equilHasConverged = ( LvArray::math::abs( pres0 - pres1 ) < equilTolerance ); - pres0 = pres1; - - // if converged, move on - if( equilHasConverged ) - { - break; - } - - // compute the density at this elevation using the previous pressure, and compute the new pressure - constitutive::SingleFluidBaseUpdate::computeValues( fluidWrapper, - pres0, - dens, - visc ); - pres1 = refPres - 0.5 * ( refDens + dens ) * gravCoef; - } - - // Step 4: save the hydrostatic pressure and the corresponding density - - newPres = pres1; - newDens = dens; - - return equilHasConverged; - } - - - template< typename FLUID_WRAPPER > - static bool - launch( localIndex const size, - integer const maxNumEquilIterations, - real64 const equilTolerance, - real64 const (&gravVector)[ 3 ], - real64 const & minElevation, - real64 const & elevationIncrement, - real64 const & datumElevation, - real64 const & datumPres, - FLUID_WRAPPER fluidWrapper, - arrayView1d< arrayView1d< real64 > const > elevationValues, - arrayView1d< real64 > pressureValues ) - { - bool hasConverged = true; - - // Step 1: compute the mass density at the datum elevation - - real64 datumDens = 0.0; - real64 datumVisc = 0.0; - - constitutive::SingleFluidBaseUpdate::computeValues( fluidWrapper, - datumPres, - datumDens, - datumVisc ); - - // Step 2: find the closest elevation to datumElevation - - forAll< parallelHostPolicy >( size, [=] ( localIndex const i ) - { - real64 const elevation = minElevation + i * elevationIncrement; - elevationValues[0][i] = elevation; - } ); - integer const iRef = LvArray::sortedArrayManipulation::find( elevationValues[0].begin(), - elevationValues[0].size(), - datumElevation ); - - - // Step 3: compute the mass density and pressure at the reference elevation - - array1d< real64 > dens( pressureValues.size() ); - - bool const hasConvergedRef = - computeHydrostaticPressure( maxNumEquilIterations, - equilTolerance, - gravVector, - fluidWrapper, - datumElevation, - datumPres, - datumDens, - elevationValues[0][iRef], - pressureValues[iRef], - dens[iRef] ); - if( !hasConvergedRef ) - { - return false; - } - - - // Step 4: for each elevation above the reference elevation, compute the pressure - - localIndex const numEntriesAboveRef = size - iRef - 1; - forAll< serialPolicy >( numEntriesAboveRef, [=, &hasConverged] ( localIndex const i ) - { - bool const hasConvergedAboveRef = - computeHydrostaticPressure( maxNumEquilIterations, - equilTolerance, - gravVector, - fluidWrapper, - elevationValues[0][iRef+i], - pressureValues[iRef+i], - dens[iRef+i], - elevationValues[0][iRef+i+1], - pressureValues[iRef+i+1], - dens[iRef+i+1] ); - if( !hasConvergedAboveRef ) - { - hasConverged = false; - } - - - } ); - - // Step 5: for each elevation below the reference elevation, compute the pressure - - localIndex const numEntriesBelowRef = iRef; - forAll< serialPolicy >( numEntriesBelowRef, [=, &hasConverged] ( localIndex const i ) - { - bool const hasConvergedBelowRef = - computeHydrostaticPressure( maxNumEquilIterations, - equilTolerance, - gravVector, - fluidWrapper, - elevationValues[0][iRef-i], - pressureValues[iRef-i], - dens[iRef-i], - elevationValues[0][iRef-i-1], - pressureValues[iRef-i-1], - dens[iRef-i-1] ); - if( !hasConvergedBelowRef ) - { - hasConverged = false; - } - } ); - - return hasConverged; - } -}; - - -} // namespace singlePhaseBaseKernels - -} // namespace geos - -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEBASEKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp deleted file mode 100644 index cd1e04516c1..00000000000 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp +++ /dev/null @@ -1,962 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * 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 SinglePhaseFVMKernels.hpp - */ - -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEFVMKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEFVMKERNELS_HPP - -#include "common/DataLayouts.hpp" -#include "common/DataTypes.hpp" -#include "common/GEOS_RAJA_Interface.hpp" -#include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" -#include "constitutive/fluid/singlefluid/SingleFluidFields.hpp" -#include "constitutive/fluid/singlefluid/SlurryFluidBase.hpp" -#include "constitutive/fluid/singlefluid/SlurryFluidFields.hpp" -#include "constitutive/permeability/PermeabilityBase.hpp" -#include "constitutive/permeability/PermeabilityFields.hpp" -#include "fieldSpecification/AquiferBoundaryCondition.hpp" -#include "finiteVolume/BoundaryStencil.hpp" -#include "finiteVolume/FluxApproximationBase.hpp" -#include "linearAlgebra/interfaces/InterfaceTypes.hpp" -#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" -#include "codingUtilities/Utilities.hpp" - -namespace geos -{ - -namespace singlePhaseFVMKernels -{ - -/******************************** FaceBasedAssemblyKernelBase ********************************/ - -/** - * @brief Base class for FaceBasedAssemblyKernel that holds all data not dependent - * on template parameters (like stencil type and number of dofs). - */ -class FaceBasedAssemblyKernelBase -{ -public: - - /** - * @brief The type for element-based data. Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewConstAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - using DofNumberAccessor = ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > >; - - using SinglePhaseFlowAccessors = - StencilAccessors< fields::ghostRank, - fields::flow::pressure, - fields::flow::pressure_n, - fields::flow::gravityCoefficient, - fields::flow::mobility, - fields::flow::dMobility_dPressure >; - - using SinglePhaseFluidAccessors = - StencilMaterialAccessors< constitutive::SingleFluidBase, - fields::singlefluid::density, - fields::singlefluid::dDensity_dPressure >; - - using SlurryFluidAccessors = - StencilMaterialAccessors< constitutive::SlurryFluidBase, - fields::singlefluid::density, - fields::singlefluid::dDensity_dPressure >; - - using PermeabilityAccessors = - StencilMaterialAccessors< constitutive::PermeabilityBase, - fields::permeability::permeability, - fields::permeability::dPerm_dPressure >; - - using ProppantPermeabilityAccessors = - StencilMaterialAccessors< constitutive::PermeabilityBase, - fields::permeability::permeability, - fields::permeability::dPerm_dPressure, - fields::permeability::dPerm_dDispJump, - fields::permeability::permeabilityMultiplier >; - - /** - * @brief Constructor for the kernel interface - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofNumberAccessor accessor for the dof numbers - * @param[in] singleFlowAccessors accessor for wrappers registered by the solver - * @param[in] singlePhaseFluidAccessors accessor for wrappers registered by the singlefluid model - * @param[in] permeabilityAccessors accessor for wrappers registered by the permeability model - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - FaceBasedAssemblyKernelBase( globalIndex const rankOffset, - DofNumberAccessor const & dofNumberAccessor, - SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, - SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, - PermeabilityAccessors const & permeabilityAccessors, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - : m_rankOffset( rankOffset ), - m_dt( dt ), - m_dofNumber( dofNumberAccessor.toNestedViewConst() ), - m_permeability( permeabilityAccessors.get( fields::permeability::permeability {} ) ), - m_dPerm_dPres( permeabilityAccessors.get( fields::permeability::dPerm_dPressure {} ) ), - m_ghostRank( singlePhaseFlowAccessors.get( fields::ghostRank {} ) ), - m_gravCoef( singlePhaseFlowAccessors.get( fields::flow::gravityCoefficient {} ) ), - m_pres( singlePhaseFlowAccessors.get( fields::flow::pressure {} ) ), - m_mob( singlePhaseFlowAccessors.get( fields::flow::mobility {} ) ), - m_dMob_dPres( singlePhaseFlowAccessors.get( fields::flow::dMobility_dPressure {} ) ), - m_dens( singlePhaseFluidAccessors.get( fields::singlefluid::density {} ) ), - m_dDens_dPres( singlePhaseFluidAccessors.get( fields::singlefluid::dDensity_dPressure {} ) ), - m_localMatrix( localMatrix ), - m_localRhs( localRhs ) - {} - -protected: - - /// Offset for my MPI rank - globalIndex const m_rankOffset; - - /// Time step size - real64 const m_dt; - - /// Views on dof numbers - ElementViewConst< arrayView1d< globalIndex const > > const m_dofNumber; - - /// Views on permeability - ElementViewConst< arrayView3d< real64 const > > m_permeability; - ElementViewConst< arrayView3d< real64 const > > m_dPerm_dPres; - - /// Views on ghost rank numbers and gravity coefficients - ElementViewConst< arrayView1d< integer const > > const m_ghostRank; - ElementViewConst< arrayView1d< real64 const > > const m_gravCoef; - - // Primary and secondary variables - /// Views on pressure - ElementViewConst< arrayView1d< real64 const > > const m_pres; - - /// Views on fluid mobility - ElementViewConst< arrayView1d< real64 const > > const m_mob; - ElementViewConst< arrayView1d< real64 const > > const m_dMob_dPres; - - /// Views on fluid density - ElementViewConst< arrayView2d< real64 const > > const m_dens; - ElementViewConst< arrayView2d< real64 const > > const m_dDens_dPres; - - // Residual and jacobian - - /// View on the local CRS matrix - CRSMatrixView< real64, globalIndex const > const m_localMatrix; - /// View on the local RHS - arrayView1d< real64 > const m_localRhs; -}; - -/** - * @class FaceBasedAssemblyKernel - * @tparam NUM_DOF number of degrees of freedom - * @tparam STENCILWRAPPER the type of the stencil wrapper - * @brief Define the interface for the assembly kernel in charge of flux terms - */ -template< integer NUM_EQN, integer NUM_DOF, typename STENCILWRAPPER > -class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase -{ -public: - - /// Compute time value for the number of degrees of freedom - static constexpr integer numDof = NUM_DOF; - - /// Compute time value for the number of equations - static constexpr integer numEqn = NUM_EQN; - - /// Maximum number of elements at the face - static constexpr localIndex maxNumElems = STENCILWRAPPER::maxNumPointsInFlux; - - /// Maximum number of connections at the face - static constexpr localIndex maxNumConns = STENCILWRAPPER::maxNumConnections; - - /// Maximum number of points in the stencil - static constexpr localIndex maxStencilSize = STENCILWRAPPER::maxStencilSize; - - /** - * @brief Constructor for the kernel interface - * @param[in] rankOffset the offset of my MPI rank - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] dofNumberAccessor - * @param[in] singlePhaseFlowAccessors - * @param[in] singlePhaseFluidAccessors - * @param[in] permeabilityAccessors - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - FaceBasedAssemblyKernel( globalIndex const rankOffset, - STENCILWRAPPER const & stencilWrapper, - DofNumberAccessor const & dofNumberAccessor, - SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, - SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, - PermeabilityAccessors const & permeabilityAccessors, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - : FaceBasedAssemblyKernelBase( rankOffset, - dofNumberAccessor, - singlePhaseFlowAccessors, - singlePhaseFluidAccessors, - permeabilityAccessors, - dt, - localMatrix, - localRhs ), - m_stencilWrapper( stencilWrapper ), - m_seri( stencilWrapper.getElementRegionIndices() ), - m_sesri( stencilWrapper.getElementSubRegionIndices() ), - m_sei( stencilWrapper.getElementIndices() ) - {} - - /** - * @struct StackVariables - * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack - */ - struct StackVariables - { -public: - - /** - * @brief Constructor for the stack variables - * @param[in] size size of the stencil for this connection - * @param[in] numElems number of elements for this connection - */ - GEOS_HOST_DEVICE - StackVariables( localIndex const size, localIndex numElems ) - : stencilSize( size ), - numFluxElems( numElems ), - dofColIndices( size * numDof ), - localFlux( numElems * numEqn ), - localFluxJacobian( numElems * numEqn, size * numDof ) - {} - - // Stencil information - - /// Stencil size for a given connection - localIndex const stencilSize; - - /// Number of elements for a given connection - localIndex const numFluxElems; - - // Transmissibility and derivatives - - /// Transmissibility - real64 transmissibility[maxNumConns][2]{}; - /// Derivatives of transmissibility with respect to pressure - real64 dTrans_dPres[maxNumConns][2]{}; - - // Local degrees of freedom and local residual/jacobian - - /// Indices of the matrix rows/columns corresponding to the dofs in this face - stackArray1d< globalIndex, maxNumElems * numDof > dofColIndices; - - /// Storage for the face local residual vector (all equations except volume balance) - stackArray1d< real64, maxNumElems * numEqn > localFlux; - /// Storage for the face local Jacobian matrix - stackArray2d< real64, maxNumElems * numEqn * maxStencilSize * numDof > localFluxJacobian; - - }; - - /** - * @brief Getter for the stencil size at this connection - * @param[in] iconn the connection index - * @return the size of the stencil at this connection - */ - GEOS_HOST_DEVICE - localIndex stencilSize( localIndex const iconn ) const - { return m_sei[iconn].size(); } - - /** - * @brief Getter for the number of elements at this connection - * @param[in] iconn the connection index - * @return the number of elements at this connection - */ - GEOS_HOST_DEVICE - localIndex numPointsInFlux( localIndex const iconn ) const - { return m_stencilWrapper.numPointsInFlux( iconn ); } - - /** - * @brief Performs the setup phase for the kernel. - * @param[in] iconn the connection index - * @param[in] stack the stack variables - */ - GEOS_HOST_DEVICE - void setup( localIndex const iconn, - StackVariables & stack ) const - { - // set degrees of freedom indices for this face - for( integer i = 0; i < stack.stencilSize; ++i ) - { - globalIndex const offset = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; - - for( integer jdof = 0; jdof < numDof; ++jdof ) - { - stack.dofColIndices[i * numDof + jdof] = offset + jdof; - } - } - } - - /** - * @brief Compute the local flux contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the computation of the flux - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - * @param[in] NoOpFunc the function used to customize the computation of the flux - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void computeFlux( localIndex const iconn, - StackVariables & stack, - FUNC && kernelOp = NoOpFunc{} ) const - { - // first, compute the transmissibilities at this face - m_stencilWrapper.computeWeights( iconn, - m_permeability, - m_dPerm_dPres, - stack.transmissibility, - stack.dTrans_dPres ); - - localIndex k[2]; - localIndex connectionIndex = 0; - - for( k[0] = 0; k[0] < stack.numFluxElems; ++k[0] ) - { - for( k[1] = k[0] + 1; k[1] < stack.numFluxElems; ++k[1] ) - { - real64 fluxVal = 0.0; - 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] )}; - - 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; - stack.localFlux[k[1]*numEqn] -= m_dt * fluxVal; - - for( integer ke = 0; ke < 2; ++ke ) - { - localIndex const localDofIndexPres = k[ke] * numDof; - stack.localFluxJacobian[k[0]*numEqn][localDofIndexPres] += m_dt * dFlux_dP[ke]; - stack.localFluxJacobian[k[1]*numEqn][localDofIndexPres] -= m_dt * dFlux_dP[ke]; - } - - // Customize the kernel with this lambda - kernelOp( k, regionIndex, subRegionIndex, elementIndex, connectionIndex, alpha, mobility, potGrad, fluxVal, dFlux_dP ); - - connectionIndex++; - } - } - } - - /** - * @brief Performs the complete phase for the kernel. - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void complete( localIndex const iconn, - StackVariables & stack, - FUNC && kernelOp = NoOpFunc{} ) const - { - // add contribution to residual and jacobian into: - // - the mass balance equation - // note that numDof includes derivatives wrt temperature if this class is derived in ThermalKernels - for( integer i = 0; i < stack.numFluxElems; ++i ) - { - if( m_ghostRank[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )] < 0 ) - { - globalIndex const globalRow = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; - localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - m_rankOffset ); - GEOS_ASSERT_GE( localRow, 0 ); - GEOS_ASSERT_GT( m_localMatrix.numRows(), localRow ); - - RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[localRow], stack.localFlux[i * numEqn] ); - m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic >( localRow, - stack.dofColIndices.data(), - stack.localFluxJacobian[i * numEqn].dataIfContiguous(), - stack.stencilSize * numDof ); - - // call the lambda to assemble additional terms, such as thermal terms - kernelOp( i, localRow ); - } - } - } - - /** - * @brief Performs the kernel launch - * @tparam POLICY the policy used in the RAJA kernels - * @tparam KERNEL_TYPE the kernel type - * @param[in] numConnections the number of connections - * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables - */ - template< typename POLICY, typename KERNEL_TYPE > - static void - launch( localIndex const numConnections, - KERNEL_TYPE const & kernelComponent ) - { - GEOS_MARK_FUNCTION; - - forAll< POLICY >( numConnections, [=] GEOS_HOST_DEVICE ( localIndex const iconn ) - { - typename KERNEL_TYPE::StackVariables stack( kernelComponent.stencilSize( iconn ), - kernelComponent.numPointsInFlux( iconn ) ); - - kernelComponent.setup( iconn, stack ); - kernelComponent.computeFlux( iconn, stack ); - kernelComponent.complete( iconn, stack ); - } ); - } - - -protected: - - // Stencil information - - /// Reference to the stencil wrapper - STENCILWRAPPER const m_stencilWrapper; - - /// Connection to element maps - typename STENCILWRAPPER::IndexContainerViewConstType const m_seri; - typename STENCILWRAPPER::IndexContainerViewConstType const m_sesri; - typename STENCILWRAPPER::IndexContainerViewConstType const m_sei; -}; - -/** - * @class FaceBasedAssemblyKernelFactory - */ -class FaceBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @tparam STENCILWRAPPER the type of the stencil wrapper - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey string to get the element degrees of freedom numbers - * @param[in] solverName name of the solver (to name accessors) - * @param[in] elemManager reference to the element region manager - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY, typename STENCILWRAPPER > - static void - createAndLaunch( globalIndex const rankOffset, - string const & dofKey, - string const & solverName, - ElementRegionManager const & elemManager, - STENCILWRAPPER const & stencilWrapper, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - integer constexpr NUM_EQN = 1; - integer constexpr NUM_DOF = 1; - - ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = - elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); - dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - - using kernelType = FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; - typename kernelType::SinglePhaseFlowAccessors flowAccessors( elemManager, solverName ); - typename kernelType::SinglePhaseFluidAccessors fluidAccessors( elemManager, solverName ); - typename kernelType::PermeabilityAccessors permAccessors( elemManager, solverName ); - - kernelType kernel( rankOffset, stencilWrapper, dofNumberAccessor, - flowAccessors, fluidAccessors, permAccessors, - dt, localMatrix, localRhs ); - kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); - } -}; - -/******************************** DirichletFaceBasedAssemblyKernel ********************************/ - -/** - * @class DirichFaceBasedAssemblyKernel - * @tparam FLUIDWRAPPER the type of the fluid wrapper - * @brief Define the interface for the assembly kernel in charge of Dirichlet face flux terms - */ -template< integer NUM_EQN, integer NUM_DOF, typename FLUIDWRAPPER > -class DirichletFaceBasedAssemblyKernel : public FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, - BoundaryStencilWrapper > -{ -public: - - using AbstractBase = singlePhaseFVMKernels::FaceBasedAssemblyKernelBase; - using DofNumberAccessor = AbstractBase::DofNumberAccessor; - using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; - using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; - using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; - - using AbstractBase::m_dt; - using AbstractBase::m_rankOffset; - using AbstractBase::m_dofNumber; - using AbstractBase::m_ghostRank; - using AbstractBase::m_gravCoef; - using AbstractBase::m_pres; - using AbstractBase::m_mob; - using AbstractBase::m_dMob_dPres; - using AbstractBase::m_dens; - using AbstractBase::m_dDens_dPres; - using AbstractBase::m_permeability; - using AbstractBase::m_dPerm_dPres; - - using AbstractBase::m_localMatrix; - using AbstractBase::m_localRhs; - - using Base = singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, - BoundaryStencilWrapper >; - using Base::numDof; - using Base::numEqn; - using Base::m_stencilWrapper; - using Base::m_seri; - using Base::m_sesri; - using Base::m_sei; - - /** - * @brief Constructor for the kernel interface - * @param[in] rankOffset the offset of my MPI rank - * @param[in] faceManager the face manager - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] fluidWrapper reference to the fluid wrapper - * @param[in] dofNumberAccessor - * @param[in] singlePhaseFlowAccessors - * @param[in] singlePhaseFluidAccessors - * @param[in] permeabilityAccessors - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - DirichletFaceBasedAssemblyKernel( globalIndex const rankOffset, - FaceManager const & faceManager, - BoundaryStencilWrapper const & stencilWrapper, - FLUIDWRAPPER const & fluidWrapper, - DofNumberAccessor const & dofNumberAccessor, - SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, - SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, - PermeabilityAccessors const & permeabilityAccessors, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - : Base( rankOffset, - stencilWrapper, - dofNumberAccessor, - singlePhaseFlowAccessors, - singlePhaseFluidAccessors, - permeabilityAccessors, - dt, - localMatrix, - localRhs ), - m_facePres( faceManager.getField< fields::flow::facePressure >() ), - m_faceGravCoef( faceManager.getField< fields::flow::gravityCoefficient >() ), - m_fluidWrapper( fluidWrapper ) - {} - - /** - * @struct StackVariables - * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack - */ - struct StackVariables - { -public: - - /** - * @brief Constructor for the stack variables - * @param[in] size size of the stencil for this connection - * @param[in] numElems number of elements for this connection - */ - GEOS_HOST_DEVICE - StackVariables( localIndex const GEOS_UNUSED_PARAM( size ), - localIndex GEOS_UNUSED_PARAM( numElems ) ) - {} - - /// Transmissibility - real64 transmissibility = 0.0; - - /// Indices of the matrix rows/columns corresponding to the dofs in this face - globalIndex dofColIndices[numDof]{}; - - /// Storage for the face local residual - real64 localFlux[numEqn]{}; - - /// Storage for the face local Jacobian - real64 localFluxJacobian[numEqn][numDof]{}; - - }; - - - /** - * @brief Performs the setup phase for the kernel. - * @param[in] iconn the connection index - * @param[in] stack the stack variables - */ - GEOS_HOST_DEVICE - void setup( localIndex const iconn, - StackVariables & stack ) const - { - globalIndex const offset = - m_dofNumber[m_seri( iconn, BoundaryStencil::Order::ELEM )][m_sesri( iconn, BoundaryStencil::Order::ELEM )][m_sei( iconn, BoundaryStencil::Order::ELEM )]; - - for( integer jdof = 0; jdof < numDof; ++jdof ) - { - stack.dofColIndices[jdof] = offset + jdof; - } - } - - /** - * @brief Compute the local Dirichlet face flux contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void computeFlux( localIndex const iconn, - StackVariables & stack, - FUNC && compFluxKernelOp = NoOpFunc{} ) const - { - using Order = BoundaryStencil::Order; - localIndex constexpr numElems = BoundaryStencil::maxNumPointsInFlux; - - stackArray1d< real64, numElems > mobility( numElems ); - stackArray1d< real64, numElems > dMobility_dP( numElems ); - - localIndex const er = m_seri( iconn, Order::ELEM ); - localIndex const esr = m_sesri( iconn, Order::ELEM ); - localIndex const ei = m_sei( iconn, Order::ELEM ); - localIndex const kf = m_sei( iconn, Order::FACE ); - - // Get flow quantities on the elem/face - real64 faceDens, faceVisc; - constitutive::SingleFluidBaseUpdate::computeValues( m_fluidWrapper, m_facePres[kf], faceDens, faceVisc ); - - mobility[Order::ELEM] = m_mob[er][esr][ei]; - singlePhaseBaseKernels::MobilityKernel::compute( faceDens, faceVisc, mobility[Order::FACE] ); - - dMobility_dP[Order::ELEM] = m_dMob_dPres[er][esr][ei]; - dMobility_dP[Order::FACE] = 0.0; - - // Compute average density - real64 const densMean = 0.5 * ( m_dens[er][esr][ei][0] + faceDens ); - real64 const dDens_dP = 0.5 * m_dDens_dPres[er][esr][ei][0]; - - // Evaluate potential difference - real64 const potDif = (m_pres[er][esr][ei] - m_facePres[kf]) - - densMean * (m_gravCoef[er][esr][ei] - m_faceGravCoef[kf]); - real64 const dPotDif_dP = 1.0 - dDens_dP * m_gravCoef[er][esr][ei]; - - real64 dTrans_dPerm[3]; - m_stencilWrapper.computeWeights( iconn, m_permeability, stack.transmissibility, dTrans_dPerm ); - real64 const dTrans_dPres = LvArray::tensorOps::AiBi< 3 >( dTrans_dPerm, m_dPerm_dPres[er][esr][ei][0] ); - - real64 const f = stack.transmissibility * potDif; - real64 const dF_dP = stack.transmissibility * dPotDif_dP + dTrans_dPres * potDif; - - // Upwind mobility - localIndex const k_up = ( potDif >= 0 ) ? Order::ELEM : Order::FACE; - real64 const mobility_up = mobility[k_up]; - real64 const dMobility_dP_up = dMobility_dP[k_up]; - - // call the lambda in the phase loop to allow the reuse of the fluxes and their derivatives - // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase - - compFluxKernelOp( er, esr, ei, kf, f, dF_dP, mobility_up, dMobility_dP_up ); - - // *** end of upwinding - - // Populate local flux vector and derivatives - - stack.localFlux[0] = m_dt * mobility[k_up] * f; - stack.localFluxJacobian[0][0] = m_dt * ( mobility_up * dF_dP + dMobility_dP_up * f ); - } - - /** - * @brief Performs the complete phase for the kernel. - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void complete( localIndex const iconn, - StackVariables & stack, - FUNC && assemblyKernelOp = NoOpFunc{} ) const - { - using Order = BoundaryStencil::Order; - - localIndex const er = m_seri( iconn, Order::ELEM ); - localIndex const esr = m_sesri( iconn, Order::ELEM ); - localIndex const ei = m_sei( iconn, Order::ELEM ); - - if( m_ghostRank[er][esr][ei] < 0 ) - { - // Add to global residual/jacobian - globalIndex const dofIndex = m_dofNumber[er][esr][ei]; - localIndex const localRow = LvArray::integerConversion< localIndex >( dofIndex - m_rankOffset ); - - RAJA::atomicAdd( parallelDeviceAtomic{}, &AbstractBase::m_localRhs[localRow], stack.localFlux[0] ); - - AbstractBase::m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > - ( localRow, - stack.dofColIndices, - stack.localFluxJacobian[0], - numDof ); - - assemblyKernelOp( localRow ); - } - } - -protected: - - /// Views on face pressure, temperature, and composition - arrayView1d< real64 const > const m_facePres; - - /// View on the face gravity coefficient - arrayView1d< real64 const > const m_faceGravCoef; - - /// Reference to the fluid wrapper - FLUIDWRAPPER const m_fluidWrapper; - -}; - - -/** - * @class DirichletFaceBasedAssemblyKernelFactory - */ -class DirichletFaceBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey string to get the element degrees of freedom numbers - * @param[in] solverName name of the solver (to name accessors) - * @param[in] faceManager reference to the face manager - * @param[in] elemManager reference to the element region manager - * @param[in] stencilWrapper reference to the boundary stencil wrapper - * @param[in] fluidBase the single phase fluid constitutive model - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY > - static void - createAndLaunch( globalIndex const rankOffset, - string const & dofKey, - string const & solverName, - FaceManager const & faceManager, - ElementRegionManager const & elemManager, - BoundaryStencilWrapper const & stencilWrapper, - constitutive::SingleFluidBase & fluidBase, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - constitutiveUpdatePassThru( fluidBase, [&]( auto & fluid ) - { - using FluidType = TYPEOFREF( fluid ); - typename FluidType::KernelWrapper fluidWrapper = fluid.createKernelWrapper(); - - integer constexpr NUM_DOF = 1; - integer constexpr NUM_EQN = 1; - using kernelType = DirichletFaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, typename FluidType::KernelWrapper >; - - ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = - elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); - - dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - - typename kernelType::SinglePhaseFlowAccessors singlePhaseFlowAccessors( elemManager, solverName ); - typename kernelType::SinglePhaseFluidAccessors singlePhaseFluidAccessors( elemManager, solverName ); - typename kernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); - - kernelType kernel( rankOffset, - faceManager, - stencilWrapper, - fluidWrapper, - dofNumberAccessor, - singlePhaseFlowAccessors, - singlePhaseFluidAccessors, - permeabilityAccessors, - dt, - localMatrix, - localRhs ); - - kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); - } ); - } - -}; - - -/******************************** AquiferBCKernel ********************************/ - -/** - * @brief Functions to assemble aquifer boundary condition contributions to residual and Jacobian - */ -struct AquiferBCKernel -{ - - /** - * @brief The type for element-based data. Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewConstAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - GEOS_HOST_DEVICE - static void - compute( real64 const & aquiferVolFlux, - real64 const & dAquiferVolFlux_dPres, - real64 const & aquiferDens, - real64 const & dens, - real64 const & dDens_dPres, - real64 const & dt, - real64 & localFlux, - real64 & localFluxJacobian ) - { - if( aquiferVolFlux > 0 ) // aquifer is upstream - { - localFlux -= dt * aquiferVolFlux * aquiferDens; - localFluxJacobian -= dt * dAquiferVolFlux_dPres * aquiferDens; - } - else // reservoir is upstream - { - localFlux -= dt * aquiferVolFlux * dens; - localFluxJacobian -= dt * (dAquiferVolFlux_dPres * dens + aquiferVolFlux * dDens_dPres); - } - } - - static void - launch( BoundaryStencil const & stencil, - globalIndex const rankOffset, - ElementViewConst< arrayView1d< globalIndex const > > const & dofNumber, - ElementViewConst< arrayView1d< integer const > > const & ghostRank, - AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper, - real64 const & aquiferDens, - ElementViewConst< arrayView1d< real64 const > > const & pres, - ElementViewConst< arrayView1d< real64 const > > const & pres_n, - ElementViewConst< arrayView1d< real64 const > > const & gravCoef, - ElementViewConst< arrayView2d< real64 const > > const & dens, - ElementViewConst< arrayView2d< real64 const > > const & dDens_dPres, - real64 const & timeAtBeginningOfStep, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - using Order = BoundaryStencil::Order; - - BoundaryStencil::IndexContainerViewConstType const & seri = stencil.getElementRegionIndices(); - BoundaryStencil::IndexContainerViewConstType const & sesri = stencil.getElementSubRegionIndices(); - BoundaryStencil::IndexContainerViewConstType const & sefi = stencil.getElementIndices(); - BoundaryStencil::WeightContainerViewConstType const & weight = stencil.getWeights(); - - forAll< parallelDevicePolicy<> >( stencil.size(), [=] GEOS_HOST_DEVICE ( localIndex const iconn ) - { - // working variables - real64 localFlux = 0.0; - real64 localFluxJacobian = 0.0; - - localIndex const er = seri( iconn, Order::ELEM ); - localIndex const esr = sesri( iconn, Order::ELEM ); - localIndex const ei = sefi( iconn, Order::ELEM ); - real64 const areaFraction = weight( iconn, Order::ELEM ); - - // compute the aquifer influx rate using the pressure influence function and the aquifer props - real64 dAquiferVolFlux_dPres = 0.0; - real64 const aquiferVolFlux = aquiferBCWrapper.compute( timeAtBeginningOfStep, - dt, - pres[er][esr][ei], - pres_n[er][esr][ei], - gravCoef[er][esr][ei], - areaFraction, - dAquiferVolFlux_dPres ); - - // compute the phase/component aquifer flux - AquiferBCKernel::compute( aquiferVolFlux, - dAquiferVolFlux_dPres, - aquiferDens, - dens[er][esr][ei][0], - dDens_dPres[er][esr][ei][0], - dt, - localFlux, - localFluxJacobian ); - - // Add to residual/jacobian - if( ghostRank[er][esr][ei] < 0 ) - { - globalIndex const globalRow = dofNumber[er][esr][ei]; - localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - rankOffset ); - GEOS_ASSERT_GE( localRow, 0 ); - GEOS_ASSERT_GT( localMatrix.numRows(), localRow ); - - RAJA::atomicAdd( parallelDeviceAtomic{}, &localRhs[localRow], localFlux ); - localMatrix.addToRow< parallelDeviceAtomic >( localRow, - &dofNumber[er][esr][ei], - &localFluxJacobian, - 1 ); - } - } ); - } - -}; - - -} // namespace singlePhaseFVMKernels - -} // namespace geos - -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEFVMKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/StencilWeightsUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/StencilWeightsUpdateKernel.hpp new file mode 100644 index 00000000000..d61b9d379dd --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/StencilWeightsUpdateKernel.hpp @@ -0,0 +1,79 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 StencilWeightsUpdateKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_STENCILWEIGHTSUPDATEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_STENCILWEIGHTSUPDATEKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "mesh/ElementRegionManager.hpp" + +namespace geos +{ + +namespace flowSolverBaseKernels +{ + +template< typename VIEWTYPE > +using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + +/** + * @brief + * + * @tparam STENCILWRAPPER + */ +template< typename STENCILWRAPPER > +struct stencilWeightsUpdateKernel +{ + /** + * @brief + * + * @param stencilWrappper + * @param hydraulicAperture + */ + inline static void prepareStencilWeights( STENCILWRAPPER & stencilWrapper, + ElementViewConst< arrayView1d< real64 const > > const hydraulicAperture ) + { + forAll< parallelDevicePolicy<> >( stencilWrapper.size(), [=] GEOS_HOST_DEVICE ( localIndex const iconn ) + { + stencilWrapper.removeHydraulicApertureContribution( iconn, hydraulicAperture ); + } ); + } + + /** + * @brief + * + * @param stencilWrappper + * @param hydraulicAperture + */ + inline static void updateStencilWeights( STENCILWRAPPER & stencilWrapper, + ElementViewConst< arrayView1d< real64 const > > const hydraulicAperture ) + { + forAll< parallelDevicePolicy<> >( stencilWrapper.size(), [=] GEOS_HOST_DEVICE ( localIndex const iconn ) + { + stencilWrapper.addHydraulicApertureContribution( iconn, hydraulicAperture ); + } ); + } +}; + +} // namespace flowSolverBaseKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_STENCILWEIGHTSUPDATEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp deleted file mode 100644 index d17b79e308c..00000000000 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseBaseKernels.hpp +++ /dev/null @@ -1,626 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * 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 ThermalSinglePhaseBaseKernels.hpp - */ - -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALSINGLEPHASEBASEKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALSINGLEPHASEBASEKERNELS_HPP - -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" - -namespace geos -{ - -namespace thermalSinglePhaseBaseKernels -{ - -/******************************** MobilityKernel ********************************/ - -struct MobilityKernel -{ - GEOS_HOST_DEVICE - inline - static void - compute( real64 const & dens, - real64 const & dDens_dPres, - real64 const & dDens_dTemp, - real64 const & visc, - real64 const & dVisc_dPres, - real64 const & dVisc_dTemp, - real64 & mob, - real64 & dMob_dPres, - real64 & dMob_dTemp ) - { - mob = dens / visc; - dMob_dPres = dDens_dPres / visc - mob / visc * dVisc_dPres; - dMob_dTemp = dDens_dTemp / visc - mob / visc * dVisc_dTemp; - } - - GEOS_HOST_DEVICE - inline - static void - compute( real64 const & dens, - real64 const & visc, - real64 & mob ) - { - mob = dens / visc; - } - - template< typename POLICY > - static void launch( localIndex const size, - arrayView2d< real64 const > const & dens, - arrayView2d< real64 const > const & dDens_dPres, - arrayView2d< real64 const > const & dDens_dTemp, - arrayView2d< real64 const > const & visc, - arrayView2d< real64 const > const & dVisc_dPres, - arrayView2d< real64 const > const & dVisc_dTemp, - arrayView1d< real64 > const & mob, - arrayView1d< real64 > const & dMob_dPres, - arrayView1d< real64 > const & dMob_dTemp ) - { - forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const a ) - { - compute( dens[a][0], - dDens_dPres[a][0], - dDens_dTemp[a][0], - visc[a][0], - dVisc_dPres[a][0], - dVisc_dTemp[a][0], - mob[a], - dMob_dPres[a], - dMob_dTemp[a] ); - } ); - } - - template< typename POLICY > - static void launch( localIndex const size, - arrayView2d< real64 const > const & dens, - arrayView2d< real64 const > const & visc, - arrayView1d< real64 > const & mob ) - { - forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const a ) - { - compute( dens[a][0], - visc[a][0], - mob[a] ); - } ); - } -}; - -/******************************** ElementBasedAssemblyKernel ********************************/ - -/** - * @class ElementBasedAssemblyKernel - * @brief Define the interface for the assembly kernel in charge of accumulation - */ -template< typename SUBREGION_TYPE, integer NUM_DOF > -class ElementBasedAssemblyKernel : public singlePhaseBaseKernels::ElementBasedAssemblyKernel< SUBREGION_TYPE, NUM_DOF > -{ - -public: - - using Base = singlePhaseBaseKernels::ElementBasedAssemblyKernel< SUBREGION_TYPE, NUM_DOF >; - using Base::numDof; - using Base::numEqn; - using Base::m_rankOffset; - using Base::m_dofNumber; - using Base::m_elemGhostRank; - using Base::m_volume; - using Base::m_deltaVolume; - using Base::m_porosity; - using Base::m_dPoro_dPres; - using Base::m_density; - using Base::m_dDensity_dPres; - using Base::m_localMatrix; - using Base::m_localRhs; - - /** - * @brief Constructor - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - ElementBasedAssemblyKernel( globalIndex const rankOffset, - string const dofKey, - SUBREGION_TYPE const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ), - m_dDensity_dTemp( fluid.dDensity_dTemperature() ), - m_dPoro_dTemp( solid.getDporosity_dTemperature() ), - m_internalEnergy( fluid.internalEnergy() ), - m_dInternalEnergy_dPres( fluid.dInternalEnergy_dPressure() ), - m_dInternalEnergy_dTemp( fluid.dInternalEnergy_dTemperature() ), - m_rockInternalEnergy( solid.getInternalEnergy() ), - m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ), - m_energy_n( subRegion.template getField< fields::flow::energy_n >() ) - {} - - /** - * @struct StackVariables - * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack - */ - struct StackVariables : public Base::StackVariables - { -public: - - GEOS_HOST_DEVICE - StackVariables() - : Base::StackVariables() - {} - - using Base::StackVariables::poreVolume; - using Base::StackVariables::dPoreVolume_dPres; - using Base::StackVariables::localRow; - using Base::StackVariables::dofIndices; - using Base::StackVariables::localResidual; - using Base::StackVariables::localJacobian; - - /// Derivative of pore volume with respect to temperature - real64 dPoreVolume_dTemp = 0.0; - - // Solid energy - - /// Solid energy at time n+1 - real64 solidEnergy = 0.0; - - /// Derivative of solid internal energy with respect to pressure - real64 dSolidEnergy_dPres = 0.0; - - /// Derivative of solid internal energy with respect to temperature - real64 dSolidEnergy_dTemp = 0.0; - }; - - - /** - * @brief Performs the setup phase for the kernel. - * @param[in] ei the element index - * @param[in] stack the stack variables - */ - GEOS_HOST_DEVICE - void setup( localIndex const ei, - StackVariables & stack ) const - { - Base::setup( ei, stack ); - - stack.dPoreVolume_dTemp = ( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dTemp[ei][0]; - - // initialize the solid volume - real64 const solidVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * ( 1.0 - m_porosity[ei][0] ); - real64 const dSolidVolume_dPres = -( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dPres[ei][0]; - real64 const dSolidVolume_dTemp = -( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dTemp[ei][0]; - - // initialize the solid internal energy - stack.solidEnergy = solidVolume * m_rockInternalEnergy[ei][0]; - stack.dSolidEnergy_dPres = dSolidVolume_dPres * m_rockInternalEnergy[ei][0]; - stack.dSolidEnergy_dTemp = solidVolume * m_dRockInternalEnergy_dTemp[ei][0] + dSolidVolume_dTemp * m_rockInternalEnergy[ei][0]; - } - - /** - * @brief Compute the local accumulation contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[inout] stack the stack variables - * @param[in] kernelOp the function used to customize the kernel - */ - GEOS_HOST_DEVICE - void computeAccumulation( localIndex const ei, - StackVariables & stack ) const - { - stack.localResidual[numEqn-1] = -m_energy_n[ei]; - - Base::computeAccumulation( ei, stack, [&] () - { - // Step 1: assemble the derivatives of the mass balance equation w.r.t temperature - stack.localJacobian[0][numDof-1] = stack.poreVolume * m_dDensity_dTemp[ei][0] + stack.dPoreVolume_dTemp * m_density[ei][0]; - - // Step 2: assemble the fluid part of the accumulation term of the energy equation - real64 const fluidEnergy = stack.poreVolume * m_density[ei][0] * m_internalEnergy[ei][0]; - - real64 const dFluidEnergy_dP = stack.dPoreVolume_dPres * m_density[ei][0] * m_internalEnergy[ei][0] - + stack.poreVolume * m_dDensity_dPres[ei][0] * m_internalEnergy[ei][0] - + stack.poreVolume * m_density[ei][0] * m_dInternalEnergy_dPres[ei][0]; - - real64 const dFluidEnergy_dT = stack.poreVolume * m_dDensity_dTemp[ei][0] * m_internalEnergy[ei][0] - + stack.poreVolume * m_density[ei][0] * m_dInternalEnergy_dTemp[ei][0] - + stack.dPoreVolume_dTemp * m_density[ei][0] * m_internalEnergy[ei][0]; - - // local accumulation - stack.localResidual[numEqn-1] += fluidEnergy; - - // derivatives w.r.t. pressure and temperature - stack.localJacobian[numEqn-1][0] = dFluidEnergy_dP; - stack.localJacobian[numEqn-1][numDof-1] = dFluidEnergy_dT; - } ); - - // Step 3: assemble the solid part of the accumulation term of the energy equation - stack.localResidual[numEqn-1] += stack.solidEnergy; - stack.localJacobian[numEqn-1][0] += stack.dSolidEnergy_dPres; - stack.localJacobian[numEqn-1][numDof-1] += stack.dSolidEnergy_dTemp; - } - - /** - * @brief Performs the complete phase for the kernel. - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void complete( localIndex const ei, - StackVariables & stack ) const - { - // Step 1: assemble the mass balance equation - Base::complete( ei, stack ); - - // Step 2: assemble the energy equation - m_localRhs[stack.localRow + numEqn-1] += stack.localResidual[numEqn-1]; - m_localMatrix.template addToRow< serialAtomic >( stack.localRow + numEqn-1, - stack.dofIndices, - stack.localJacobian[numEqn-1], - numDof ); - - - } - -protected: - - /// View on derivative of fluid density w.r.t temperature - arrayView2d< real64 const > const m_dDensity_dTemp; - - /// View on derivative of porosity w.r.t temperature - arrayView2d< real64 const > const m_dPoro_dTemp; - - /// Views on fluid internal energy - arrayView2d< real64 const > const m_internalEnergy; - arrayView2d< real64 const > const m_dInternalEnergy_dPres; - arrayView2d< real64 const > const m_dInternalEnergy_dTemp; - - /// Views on rock internal energy - arrayView2d< real64 const > const m_rockInternalEnergy; - arrayView2d< real64 const > const m_dRockInternalEnergy_dTemp; - - /// View on energy - arrayView1d< real64 const > const m_energy_n; - -}; - -/** - * @class SurfaceElementBasedAssemblyKernel - * @brief Define the interface for the assembly kernel in charge of accumulation in SurfaceElementSubRegion - */ -class SurfaceElementBasedAssemblyKernel : public ElementBasedAssemblyKernel< SurfaceElementSubRegion, 2 > -{ - -public: - - using Base = ElementBasedAssemblyKernel< SurfaceElementSubRegion, 2 >; - - /** - * @brief Constructor - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - SurfaceElementBasedAssemblyKernel( globalIndex const rankOffset, - string const dofKey, - SurfaceElementSubRegion const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ), - m_creationMass( subRegion.getField< fields::flow::massCreated >() ) - {} - - /** - * @brief Compute the local accumulation contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void computeAccumulation( localIndex const ei, - Base::StackVariables & stack ) const - { - Base::computeAccumulation( ei, stack ); - if( Base::m_mass_n[ei] > 1.1 * m_creationMass[ei] ) - { - stack.localResidual[0] += m_creationMass[ei] * 0.25; - } - } - -protected: - - arrayView1d< real64 const > const m_creationMass; - -}; - -/** - * @class ElementBasedAssemblyKernelFactory - */ -class ElementBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY > - static void - createAndLaunch( globalIndex const rankOffset, - string const dofKey, - CellElementSubRegion const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - integer constexpr NUM_DOF = 2; - - ElementBasedAssemblyKernel< CellElementSubRegion, NUM_DOF > - kernel( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ); - ElementBasedAssemblyKernel< CellElementSubRegion, NUM_DOF >::template - launch< POLICY, ElementBasedAssemblyKernel< CellElementSubRegion, NUM_DOF > >( subRegion.size(), kernel ); - } - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY > - static void - createAndLaunch( globalIndex const rankOffset, - string const dofKey, - SurfaceElementSubRegion const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - SurfaceElementBasedAssemblyKernel - kernel( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ); - SurfaceElementBasedAssemblyKernel::launch< POLICY >( subRegion.size(), kernel ); - } - - -}; - - -/******************************** FluidUpdateKernel ********************************/ - -struct FluidUpdateKernel -{ - template< typename FLUID_WRAPPER > - static void launch( FLUID_WRAPPER const & fluidWrapper, - arrayView1d< real64 const > const & pres, - arrayView1d< real64 const > const & temp ) - { - forAll< parallelDevicePolicy<> >( fluidWrapper.numElems(), [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - for( localIndex q = 0; q < fluidWrapper.numGauss(); ++q ) - { - fluidWrapper.update( k, q, pres[k], temp[k] ); - } - } ); - } -}; - -/******************************** SolidInternalEnergyUpdateKernel ********************************/ - -struct SolidInternalEnergyUpdateKernel -{ - - template< typename POLICY, typename SOLID_INTERNAL_ENERGY_WRAPPER > - static void - launch( localIndex const size, - SOLID_INTERNAL_ENERGY_WRAPPER const & solidInternalEnergyWrapper, - arrayView1d< real64 const > const & temp ) - { - forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - solidInternalEnergyWrapper.update( k, temp[k] ); - } ); - } -}; - -/******************************** ResidualNormKernel ********************************/ - -/** - * @class ResidualNormKernel - */ -class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 2 > -{ -public: - - using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 2 >; - using Base::m_minNormalizer; - using Base::m_rankOffset; - using Base::m_localResidual; - using Base::m_dofNumber; - - ResidualNormKernel( globalIndex const rankOffset, - arrayView1d< real64 const > const & localResidual, - arrayView1d< globalIndex const > const & dofNumber, - arrayView1d< localIndex const > const & ghostRank, - ElementSubRegionBase const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - constitutive::SolidInternalEnergy const & solidInternalEnergy, - real64 const minNormalizer ) - : Base( rankOffset, - localResidual, - dofNumber, - ghostRank, - minNormalizer ), - m_volume( subRegion.getElementVolume() ), - m_porosity_n( solid.getPorosity_n() ), - m_density_n( fluid.density_n() ), - m_fluidInternalEnergy_n( fluid.internalEnergy_n() ), - m_solidInternalEnergy_n( solidInternalEnergy.getInternalEnergy_n() ) - {} - - GEOS_HOST_DEVICE - void computeMassEnergyNormalizers( localIndex const ei, - real64 & massNormalizer, - real64 & energyNormalizer ) const - { - massNormalizer = LvArray::math::max( m_minNormalizer, m_density_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ); - energyNormalizer = - LvArray::math::max( m_minNormalizer, - LvArray::math::abs( m_solidInternalEnergy_n[ei][0] * ( 1.0 - m_porosity_n[ei][0] ) * m_volume[ei] - + m_fluidInternalEnergy_n[ei][0] * m_density_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ) ); - } - - GEOS_HOST_DEVICE - virtual void computeLinf( localIndex const ei, - LinfStackVariables & stack ) const override - { - real64 massNormalizer = 0.0, energyNormalizer = 0.0; - computeMassEnergyNormalizers( ei, massNormalizer, energyNormalizer ); - - // step 1: mass residual - - real64 const valMass = LvArray::math::abs( m_localResidual[stack.localRow] ) / massNormalizer; - if( valMass > stack.localValue[0] ) - { - stack.localValue[0] = valMass; - } - - // step 2: energy residual - real64 const valEnergy = LvArray::math::abs( m_localResidual[stack.localRow + 1] ) / energyNormalizer; - if( valEnergy > stack.localValue[1] ) - { - stack.localValue[1] = valEnergy; - } - } - - GEOS_HOST_DEVICE - virtual void computeL2( localIndex const ei, - L2StackVariables & stack ) const override - { - real64 massNormalizer = 0.0, energyNormalizer = 0.0; - computeMassEnergyNormalizers( ei, massNormalizer, energyNormalizer ); - - // step 1: mass residual - - stack.localValue[0] += m_localResidual[stack.localRow] * m_localResidual[stack.localRow]; - stack.localNormalizer[0] += massNormalizer; - - // step 2: energy residual - - stack.localValue[1] += m_localResidual[stack.localRow + 1] * m_localResidual[stack.localRow + 1]; - stack.localNormalizer[1] += energyNormalizer; - } - - -protected: - - /// View on the volume - arrayView1d< real64 const > const m_volume; - - /// View on porosity at the previous converged time step - arrayView2d< real64 const > const m_porosity_n; - - /// View on total mass/molar density at the previous converged time step - arrayView2d< real64 const > const m_density_n; - arrayView2d< real64 const > const m_fluidInternalEnergy_n; - - /// View on solid internal energy at the previous converged time step - arrayView2d< real64 const > const m_solidInternalEnergy_n; - -}; - -/** - * @class ResidualNormKernelFactory - */ -class ResidualNormKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] normType the type of norm used (Linf or L2) - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] localResidual the residual vector on my MPI rank - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[in] solidInternalEnergy the solid internal energy model - * @param[out] residualNorm the residual norm on the subRegion - * @param[out] residualNormalizer the residual normalizer on the subRegion - */ - template< typename POLICY > - static void - createAndLaunch( physicsSolverBaseKernels::NormType const normType, - globalIndex const rankOffset, - string const & dofKey, - arrayView1d< real64 const > const & localResidual, - ElementSubRegionBase const & subRegion, - constitutive::SingleFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - constitutive::SolidInternalEnergy const & solidInternalEnergy, - real64 const minNormalizer, - real64 (& residualNorm)[2], - real64 (& residualNormalizer)[2] ) - { - arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); - arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); - - ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, subRegion, fluid, solid, solidInternalEnergy, minNormalizer ); - if( normType == physicsSolverBaseKernels::NormType::Linf ) - { - ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); - } - else // L2 norm - { - ResidualNormKernel::launchL2< POLICY >( subRegion.size(), kernel, residualNorm, residualNormalizer ); - } - } - -}; - -} // namespace thermalSinglePhaseBaseKernels - -} // namespace geos - -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALSINGLEPHASEBASEKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.cpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.cpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.cpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp index eb147ed4e92..14b19626972 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/CompositionalMultiphaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp @@ -32,7 +32,7 @@ #include "mesh/ObjectManagerBase.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/DissipationCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationCompositionalMultiphaseFVMKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/DissipationCompositionalMultiphaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationCompositionalMultiphaseFVMKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp index 3af97cde06b..a80f991003f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp @@ -992,7 +992,7 @@ class ElementBasedAssemblyKernelFactory }; -/******************************** ScalingForSystemSolutionKernel ********************************/ +/******************************** SolutionScalingKernelKernel ********************************/ /** * @class ScalingAndCheckingSystemSolutionKernelBase diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.cpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.cpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.cpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp index 4332a3caca9..3cad40cf9fe 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp @@ -47,8 +47,8 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/ReactiveCompositionalMultiphaseOBLKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/ReactiveCompositionalMultiphaseOBLKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedCompositionalMultiphaseFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedCompositionalMultiphaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedCompositionalMultiphaseFVMKernels.hpp index 7e249ed0ab7..62bab9f3a23 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedCompositionalMultiphaseFVMKernels.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp index 717ff1a3e60..4b07977241c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEBASEKERNELS_HPP #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEBASEKERNELS_HPP -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseFVMKernels.hpp index 6926c0f10a8..bec2c3217c4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseFVMKernels.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp" #include "constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp" #include "constitutive/thermalConductivity/ThermalConductivityFields.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp new file mode 100644 index 00000000000..d7bcb6068f1 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp @@ -0,0 +1,361 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 AccumulationKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_ACCUMULATIONKERNELS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_ACCUMULATIONKERNELS_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" +#include "constitutive/solid/CoupledSolidBase.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "codingUtilities/Utilities.hpp" + +namespace geos +{ + +namespace singlePhaseBaseKernels +{ + +/******************************** AccumulationKernel ********************************/ + +/** + * @class AccumulationKernel + * @brief Define the interface for the assembly kernel in charge of accumulation + */ +template< typename SUBREGION_TYPE, integer NUM_DOF > +class AccumulationKernel +{ + +public: + + /// Compute time value for the number of degrees of freedom + static constexpr integer numDof = NUM_DOF; + + /// Compute time value for the number of equations + static constexpr integer numEqn = NUM_DOF; + + /** + * @brief Constructor + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + AccumulationKernel( globalIndex const rankOffset, + string const dofKey, + SUBREGION_TYPE const & subRegion, + constitutive::SingleFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + : + m_rankOffset( rankOffset ), + m_dofNumber( subRegion.template getReference< array1d< globalIndex > >( dofKey ) ), + m_elemGhostRank( subRegion.ghostRank() ), + m_volume( subRegion.getElementVolume() ), + m_deltaVolume( subRegion.template getField< fields::flow::deltaVolume >() ), + m_porosity( solid.getPorosity() ), + m_dPoro_dPres( solid.getDporosity_dPressure() ), + m_density( fluid.density() ), + m_dDensity_dPres( fluid.dDensity_dPressure() ), + m_mass_n( subRegion.template getField< fields::flow::mass_n >() ), + m_localMatrix( localMatrix ), + m_localRhs( localRhs ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables + { +public: + + // Pore volume information + + /// Pore volume at time n+1 + real64 poreVolume = 0.0; + + /// Derivative of pore volume with respect to pressure + real64 dPoreVolume_dPres = 0.0; + + // Residual information + + /// Index of the local row corresponding to this element + localIndex localRow = -1; + + /// Index of the matrix row/column corresponding to the dof in this element + globalIndex dofIndices[numDof]{}; + + /// Storage for the element local residual vector + real64 localResidual[numEqn]{}; + + /// Storage for the element local Jacobian matrix + real64 localJacobian[numEqn][numDof]{}; + + }; + + /** + * @brief Getter for the ghost rank of an element + * @param[in] ei the element index + * @return the ghost rank of the element + */ + GEOS_HOST_DEVICE + integer elemGhostRank( localIndex const ei ) const + { return m_elemGhostRank( ei ); } + + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] ei the element index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + void setup( localIndex const ei, + StackVariables & stack ) const + { + // initialize the pore volume + stack.poreVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * m_porosity[ei][0]; + stack.dPoreVolume_dPres = ( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dPres[ei][0]; + + // set row index and degrees of freedom indices for this element + stack.localRow = m_dofNumber[ei] - m_rankOffset; + for( integer idof = 0; idof < numDof; ++idof ) + { + stack.dofIndices[idof] = m_dofNumber[ei] + idof; + } + } + + /** + * @brief Compute the local accumulation contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + * @param[in] kernelOp the function used to customize the kernel + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void computeAccumulation( localIndex const ei, + StackVariables & stack, + FUNC && kernelOp = NoOpFunc{} ) const + { + // Residual contribution is mass conservation in the cell + stack.localResidual[0] = stack.poreVolume * m_density[ei][0] - m_mass_n[ei]; + + // Derivative of residual wrt to pressure in the cell + stack.localJacobian[0][0] = stack.dPoreVolume_dPres * m_density[ei][0] + m_dDensity_dPres[ei][0] * stack.poreVolume; + + // Customize the kernel with this lambda + kernelOp(); + } + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void complete( localIndex const GEOS_UNUSED_PARAM( ei ), + StackVariables & stack ) const + { + // add contribution to global residual and jacobian (no need for atomics here) + m_localMatrix.template addToRow< serialAtomic >( stack.localRow, + stack.dofIndices, + stack.localJacobian[0], + numDof ); + m_localRhs[stack.localRow] += stack.localResidual[0]; + + } + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElems the number of elements + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + + forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( kernelComponent.elemGhostRank( ei ) >= 0 ) + { + return; + } + + typename KERNEL_TYPE::StackVariables stack; + + kernelComponent.setup( ei, stack ); + kernelComponent.computeAccumulation( ei, stack ); + kernelComponent.complete( ei, stack ); + } ); + } + +protected: + + /// Offset for my MPI rank + globalIndex const m_rankOffset; + + /// View on the dof numbers + arrayView1d< globalIndex const > const m_dofNumber; + + /// View on the ghost ranks + arrayView1d< integer const > const m_elemGhostRank; + + /// View on the element volumes + arrayView1d< real64 const > const m_volume; + arrayView1d< real64 const > const m_deltaVolume; + + /// Views on the porosity + arrayView2d< real64 const > const m_porosity; + arrayView2d< real64 const > const m_dPoro_dPres; + + /// Views on density + arrayView2d< real64 const > const m_density; + arrayView2d< real64 const > const m_dDensity_dPres; + + /// View on mass + arrayView1d< real64 const > const m_mass_n; + + /// View on the local CRS matrix + CRSMatrixView< real64, globalIndex const > const m_localMatrix; + /// View on the local RHS + arrayView1d< real64 > const m_localRhs; + +}; + +/** + * @class SurfaceElementAccumulationKernel + * @brief Define the interface for the assembly kernel in charge of accumulation in SurfaceElementSubRegion + */ +class SurfaceElementAccumulationKernel : public AccumulationKernel< SurfaceElementSubRegion, 1 > +{ + +public: + + using Base = AccumulationKernel< SurfaceElementSubRegion, 1 >; + + /** + * @brief Constructor + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + SurfaceElementAccumulationKernel( globalIndex const rankOffset, + string const dofKey, + SurfaceElementSubRegion const & subRegion, + constitutive::SingleFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ) + , m_creationMass( subRegion.getField< fields::flow::massCreated >() ) + {} + + /** + * @brief Compute the local accumulation contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void computeAccumulation( localIndex const ei, + Base::StackVariables & stack ) const + { + Base::computeAccumulation( ei, stack, [&] () + { + if( Base::m_mass_n[ei] > 1.1 * m_creationMass[ei] ) + { + stack.localResidual[0] += m_creationMass[ei] * 0.25; + } + } ); + } + +protected: + + arrayView1d< real64 const > const m_creationMass; + +}; + +/** + * @class AccumulationKernelFactory + */ +class AccumulationKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY, typename SUBREGION_TYPE > + static void + createAndLaunch( globalIndex const rankOffset, + string const dofKey, + SUBREGION_TYPE const & subRegion, + constitutive::SingleFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + if constexpr ( std::is_base_of_v< CellElementSubRegion, SUBREGION_TYPE > ) + { + integer constexpr NUM_DOF = 1; + AccumulationKernel< CellElementSubRegion, NUM_DOF > kernel( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ); + AccumulationKernel< CellElementSubRegion, NUM_DOF >::template launch< POLICY >( subRegion.size(), kernel ); + } + else if constexpr ( std::is_base_of_v< SurfaceElementSubRegion, SUBREGION_TYPE > ) + { + SurfaceElementAccumulationKernel kernel( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ); + SurfaceElementAccumulationKernel::launch< POLICY >( subRegion.size(), kernel ); + } + else + { + GEOS_UNUSED_VAR( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ); + GEOS_ERROR( "Unsupported subregion type: " << typeid(SUBREGION_TYPE).name() ); + } + } + +}; + +} // namespace singlePhaseBaseKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_ACCUMULATIONKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AquiferBCKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AquiferBCKernel.hpp new file mode 100644 index 00000000000..733a7013ac2 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AquiferBCKernel.hpp @@ -0,0 +1,152 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 AquiferBCKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_AQUIFERBCKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_AQUIFERBCKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "fieldSpecification/AquiferBoundaryCondition.hpp" +#include "finiteVolume/BoundaryStencil.hpp" + +namespace geos +{ + +namespace singlePhaseFVMKernels +{ + +/******************************** AquiferBCKernel ********************************/ + +/** + * @brief Functions to assemble aquifer boundary condition contributions to residual and Jacobian + */ +struct AquiferBCKernel +{ + + /** + * @brief The type for element-based data. Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewConstAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + GEOS_HOST_DEVICE + static void + compute( real64 const & aquiferVolFlux, + real64 const & dAquiferVolFlux_dPres, + real64 const & aquiferDens, + real64 const & dens, + real64 const & dDens_dPres, + real64 const & dt, + real64 & localFlux, + real64 & localFluxJacobian ) + { + if( aquiferVolFlux > 0 ) // aquifer is upstream + { + localFlux -= dt * aquiferVolFlux * aquiferDens; + localFluxJacobian -= dt * dAquiferVolFlux_dPres * aquiferDens; + } + else // reservoir is upstream + { + localFlux -= dt * aquiferVolFlux * dens; + localFluxJacobian -= dt * (dAquiferVolFlux_dPres * dens + aquiferVolFlux * dDens_dPres); + } + } + + static void + launch( BoundaryStencil const & stencil, + globalIndex const rankOffset, + ElementViewConst< arrayView1d< globalIndex const > > const & dofNumber, + ElementViewConst< arrayView1d< integer const > > const & ghostRank, + AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper, + real64 const & aquiferDens, + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & pres_n, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const > > const & dens, + ElementViewConst< arrayView2d< real64 const > > const & dDens_dPres, + real64 const & timeAtBeginningOfStep, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + using Order = BoundaryStencil::Order; + + BoundaryStencil::IndexContainerViewConstType const & seri = stencil.getElementRegionIndices(); + BoundaryStencil::IndexContainerViewConstType const & sesri = stencil.getElementSubRegionIndices(); + BoundaryStencil::IndexContainerViewConstType const & sefi = stencil.getElementIndices(); + BoundaryStencil::WeightContainerViewConstType const & weight = stencil.getWeights(); + + forAll< parallelDevicePolicy<> >( stencil.size(), [=] GEOS_HOST_DEVICE ( localIndex const iconn ) + { + // working variables + real64 localFlux = 0.0; + real64 localFluxJacobian = 0.0; + + localIndex const er = seri( iconn, Order::ELEM ); + localIndex const esr = sesri( iconn, Order::ELEM ); + localIndex const ei = sefi( iconn, Order::ELEM ); + real64 const areaFraction = weight( iconn, Order::ELEM ); + + // compute the aquifer influx rate using the pressure influence function and the aquifer props + real64 dAquiferVolFlux_dPres = 0.0; + real64 const aquiferVolFlux = aquiferBCWrapper.compute( timeAtBeginningOfStep, + dt, + pres[er][esr][ei], + pres_n[er][esr][ei], + gravCoef[er][esr][ei], + areaFraction, + dAquiferVolFlux_dPres ); + + // compute the phase/component aquifer flux + AquiferBCKernel::compute( aquiferVolFlux, + dAquiferVolFlux_dPres, + aquiferDens, + dens[er][esr][ei][0], + dDens_dPres[er][esr][ei][0], + dt, + localFlux, + localFluxJacobian ); + + // Add to residual/jacobian + if( ghostRank[er][esr][ei] < 0 ) + { + globalIndex const globalRow = dofNumber[er][esr][ei]; + localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - rankOffset ); + GEOS_ASSERT_GE( localRow, 0 ); + GEOS_ASSERT_GT( localMatrix.numRows(), localRow ); + + RAJA::atomicAdd( parallelDeviceAtomic{}, &localRhs[localRow], localFlux ); + localMatrix.addToRow< parallelDeviceAtomic >( localRow, + &dofNumber[er][esr][ei], + &localFluxJacobian, + 1 ); + } + } ); + } + +}; + +} // namespace singlePhaseFVMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_AQUIFERBCKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/DirichletFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/DirichletFluxComputeKernel.hpp new file mode 100644 index 00000000000..e2a33419262 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/DirichletFluxComputeKernel.hpp @@ -0,0 +1,362 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 DirichletFluxComputeKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_DIRICHLETFLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_DIRICHLETFLUXCOMPUTEKERNEL_HPP + +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" +#include "finiteVolume/BoundaryStencil.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp" +#include "codingUtilities/Utilities.hpp" + +namespace geos +{ + +namespace singlePhaseFVMKernels +{ + +/******************************** DirichletFluxComputeKernel ********************************/ + +/** + * @class DirichletFluxComputeKernel + * @tparam FLUIDWRAPPER the type of the fluid wrapper + * @brief Define the interface for the assembly kernel in charge of Dirichlet face flux terms + */ +template< integer NUM_EQN, integer NUM_DOF, typename FLUIDWRAPPER > +class DirichletFluxComputeKernel : public FluxComputeKernel< NUM_EQN, NUM_DOF, + BoundaryStencilWrapper > +{ +public: + + using AbstractBase = singlePhaseFVMKernels::FluxComputeKernelBase; + using DofNumberAccessor = AbstractBase::DofNumberAccessor; + using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; + using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; + using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; + using AbstractBase::m_dt; + using AbstractBase::m_rankOffset; + using AbstractBase::m_dofNumber; + using AbstractBase::m_ghostRank; + using AbstractBase::m_gravCoef; + using AbstractBase::m_pres; + using AbstractBase::m_mob; + using AbstractBase::m_dMob_dPres; + using AbstractBase::m_dens; + using AbstractBase::m_dDens_dPres; + using AbstractBase::m_permeability; + using AbstractBase::m_dPerm_dPres; + using AbstractBase::m_localMatrix; + using AbstractBase::m_localRhs; + + using Base = singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, + BoundaryStencilWrapper >; + using Base::numDof; + using Base::numEqn; + using Base::m_stencilWrapper; + using Base::m_seri; + using Base::m_sesri; + using Base::m_sei; + + /** + * @brief Constructor for the kernel interface + * @param[in] rankOffset the offset of my MPI rank + * @param[in] faceManager the face manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] fluidWrapper reference to the fluid wrapper + * @param[in] dofNumberAccessor + * @param[in] singlePhaseFlowAccessors + * @param[in] singlePhaseFluidAccessors + * @param[in] permeabilityAccessors + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + DirichletFluxComputeKernel( globalIndex const rankOffset, + FaceManager const & faceManager, + BoundaryStencilWrapper const & stencilWrapper, + FLUIDWRAPPER const & fluidWrapper, + DofNumberAccessor const & dofNumberAccessor, + SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, + SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, + PermeabilityAccessors const & permeabilityAccessors, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + : Base( rankOffset, + stencilWrapper, + dofNumberAccessor, + singlePhaseFlowAccessors, + singlePhaseFluidAccessors, + permeabilityAccessors, + dt, + localMatrix, + localRhs ), + m_facePres( faceManager.getField< fields::flow::facePressure >() ), + m_faceGravCoef( faceManager.getField< fields::flow::gravityCoefficient >() ), + m_fluidWrapper( fluidWrapper ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables + { +public: + + /** + * @brief Constructor for the stack variables + * @param[in] size size of the stencil for this connection + * @param[in] numElems number of elements for this connection + */ + GEOS_HOST_DEVICE + StackVariables( localIndex const GEOS_UNUSED_PARAM( size ), + localIndex GEOS_UNUSED_PARAM( numElems ) ) + {} + + /// Transmissibility + real64 transmissibility = 0.0; + + /// Indices of the matrix rows/columns corresponding to the dofs in this face + globalIndex dofColIndices[numDof]{}; + + /// Storage for the face local residual + real64 localFlux[numEqn]{}; + + /// Storage for the face local Jacobian + real64 localFluxJacobian[numEqn][numDof]{}; + + }; + + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] iconn the connection index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + void setup( localIndex const iconn, + StackVariables & stack ) const + { + globalIndex const offset = + m_dofNumber[m_seri( iconn, BoundaryStencil::Order::ELEM )][m_sesri( iconn, BoundaryStencil::Order::ELEM )][m_sei( iconn, BoundaryStencil::Order::ELEM )]; + + for( integer jdof = 0; jdof < numDof; ++jdof ) + { + stack.dofColIndices[jdof] = offset + jdof; + } + } + + /** + * @brief Compute the local Dirichlet face flux contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void computeFlux( localIndex const iconn, + StackVariables & stack, + FUNC && compFluxKernelOp = NoOpFunc{} ) const + { + using Order = BoundaryStencil::Order; + localIndex constexpr numElems = BoundaryStencil::maxNumPointsInFlux; + + stackArray1d< real64, numElems > mobility( numElems ); + stackArray1d< real64, numElems > dMobility_dP( numElems ); + + localIndex const er = m_seri( iconn, Order::ELEM ); + localIndex const esr = m_sesri( iconn, Order::ELEM ); + localIndex const ei = m_sei( iconn, Order::ELEM ); + localIndex const kf = m_sei( iconn, Order::FACE ); + + // Get flow quantities on the elem/face + real64 faceDens, faceVisc; + constitutive::SingleFluidBaseUpdate::computeValues( m_fluidWrapper, m_facePres[kf], faceDens, faceVisc ); + + mobility[Order::ELEM] = m_mob[er][esr][ei]; + singlePhaseBaseKernels::MobilityKernel::compute( faceDens, faceVisc, mobility[Order::FACE] ); + + dMobility_dP[Order::ELEM] = m_dMob_dPres[er][esr][ei]; + dMobility_dP[Order::FACE] = 0.0; + + // Compute average density + real64 const densMean = 0.5 * ( m_dens[er][esr][ei][0] + faceDens ); + real64 const dDens_dP = 0.5 * m_dDens_dPres[er][esr][ei][0]; + + // Evaluate potential difference + real64 const potDif = (m_pres[er][esr][ei] - m_facePres[kf]) + - densMean * (m_gravCoef[er][esr][ei] - m_faceGravCoef[kf]); + real64 const dPotDif_dP = 1.0 - dDens_dP * m_gravCoef[er][esr][ei]; + + real64 dTrans_dPerm[3]; + m_stencilWrapper.computeWeights( iconn, m_permeability, stack.transmissibility, dTrans_dPerm ); + real64 const dTrans_dPres = LvArray::tensorOps::AiBi< 3 >( dTrans_dPerm, m_dPerm_dPres[er][esr][ei][0] ); + + real64 const f = stack.transmissibility * potDif; + real64 const dF_dP = stack.transmissibility * dPotDif_dP + dTrans_dPres * potDif; + + // Upwind mobility + localIndex const k_up = ( potDif >= 0 ) ? Order::ELEM : Order::FACE; + real64 const mobility_up = mobility[k_up]; + real64 const dMobility_dP_up = dMobility_dP[k_up]; + + // call the lambda in the phase loop to allow the reuse of the fluxes and their derivatives + // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase + + compFluxKernelOp( er, esr, ei, kf, f, dF_dP, mobility_up, dMobility_dP_up ); + + // *** end of upwinding + + // Populate local flux vector and derivatives + + stack.localFlux[0] = m_dt * mobility[k_up] * f; + stack.localFluxJacobian[0][0] = m_dt * ( mobility_up * dF_dP + dMobility_dP_up * f ); + } + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void complete( localIndex const iconn, + StackVariables & stack, + FUNC && assemblyKernelOp = NoOpFunc{} ) const + { + using Order = BoundaryStencil::Order; + + localIndex const er = m_seri( iconn, Order::ELEM ); + localIndex const esr = m_sesri( iconn, Order::ELEM ); + localIndex const ei = m_sei( iconn, Order::ELEM ); + + if( m_ghostRank[er][esr][ei] < 0 ) + { + // Add to global residual/jacobian + globalIndex const dofIndex = m_dofNumber[er][esr][ei]; + localIndex const localRow = LvArray::integerConversion< localIndex >( dofIndex - m_rankOffset ); + + RAJA::atomicAdd( parallelDeviceAtomic{}, &AbstractBase::m_localRhs[localRow], stack.localFlux[0] ); + + AbstractBase::m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > + ( localRow, + stack.dofColIndices, + stack.localFluxJacobian[0], + numDof ); + + assemblyKernelOp( localRow ); + } + } + +protected: + + /// Views on face pressure, temperature, and composition + arrayView1d< real64 const > const m_facePres; + + /// View on the face gravity coefficient + arrayView1d< real64 const > const m_faceGravCoef; + + /// Reference to the fluid wrapper + FLUIDWRAPPER const m_fluidWrapper; + +}; + + +/** + * @class DirichletFluxComputeKernelFactory + */ +class DirichletFluxComputeKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] solverName name of the solver (to name accessors) + * @param[in] faceManager reference to the face manager + * @param[in] elemManager reference to the element region manager + * @param[in] stencilWrapper reference to the boundary stencil wrapper + * @param[in] fluidBase the single phase fluid constitutive model + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( globalIndex const rankOffset, + string const & dofKey, + string const & solverName, + FaceManager const & faceManager, + ElementRegionManager const & elemManager, + BoundaryStencilWrapper const & stencilWrapper, + constitutive::SingleFluidBase & fluidBase, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + constitutiveUpdatePassThru( fluidBase, [&]( auto & fluid ) + { + using FluidType = TYPEOFREF( fluid ); + typename FluidType::KernelWrapper fluidWrapper = fluid.createKernelWrapper(); + + integer constexpr NUM_DOF = 1; + integer constexpr NUM_EQN = 1; + using kernelType = DirichletFluxComputeKernel< NUM_EQN, NUM_DOF, typename FluidType::KernelWrapper >; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + typename kernelType::SinglePhaseFlowAccessors singlePhaseFlowAccessors( elemManager, solverName ); + typename kernelType::SinglePhaseFluidAccessors singlePhaseFluidAccessors( elemManager, solverName ); + typename kernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); + + kernelType kernel( rankOffset, + faceManager, + stencilWrapper, + fluidWrapper, + dofNumberAccessor, + singlePhaseFlowAccessors, + singlePhaseFluidAccessors, + permeabilityAccessors, + dt, + localMatrix, + localRhs ); + + kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); + } ); + } + +}; + +} // namespace singlePhaseFVMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_DIRICHLETFLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluidUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluidUpdateKernel.hpp new file mode 100644 index 00000000000..9ee7550c9b7 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluidUpdateKernel.hpp @@ -0,0 +1,55 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 FluidUpdateKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUIDUPDATEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUIDUPDATEKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace singlePhaseBaseKernels +{ + +/******************************** FluidUpdateKernel ********************************/ + +struct FluidUpdateKernel +{ + template< typename FLUID_WRAPPER > + static void launch( FLUID_WRAPPER const & fluidWrapper, + arrayView1d< real64 const > const & pres, + arrayView1d< real64 const > const & temp ) + { + forAll< parallelDevicePolicy<> >( fluidWrapper.numElems(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + for( localIndex q = 0; q < fluidWrapper.numGauss(); ++q ) + { + fluidWrapper.update( k, q, pres[k], temp[k] ); + } + } ); + } +}; + +} // namespace singlePhaseBaseKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUIDUPDATEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp new file mode 100644 index 00000000000..8083ad10746 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp @@ -0,0 +1,383 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 FluxComputeKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUXCOMPUTEKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernelBase.hpp" + + +namespace geos +{ + +namespace singlePhaseFVMKernels +{ + +/** + * @class FluxComputeKernel + * @tparam NUM_DOF number of degrees of freedom + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @brief Define the interface for the assembly kernel in charge of flux terms + */ +template< integer NUM_EQN, integer NUM_DOF, typename STENCILWRAPPER > +class FluxComputeKernel : public FluxComputeKernelBase +{ +public: + + /// Compute time value for the number of degrees of freedom + static constexpr integer numDof = NUM_DOF; + + /// Compute time value for the number of equations + static constexpr integer numEqn = NUM_EQN; + + /// Maximum number of elements at the face + static constexpr localIndex maxNumElems = STENCILWRAPPER::maxNumPointsInFlux; + + /// Maximum number of connections at the face + static constexpr localIndex maxNumConns = STENCILWRAPPER::maxNumConnections; + + /// Maximum number of points in the stencil + static constexpr localIndex maxStencilSize = STENCILWRAPPER::maxStencilSize; + + /** + * @brief Constructor for the kernel interface + * @param[in] rankOffset the offset of my MPI rank + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dofNumberAccessor + * @param[in] singlePhaseFlowAccessors + * @param[in] singlePhaseFluidAccessors + * @param[in] permeabilityAccessors + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + FluxComputeKernel( globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, + SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, + PermeabilityAccessors const & permeabilityAccessors, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + : FluxComputeKernelBase( rankOffset, + dofNumberAccessor, + singlePhaseFlowAccessors, + singlePhaseFluidAccessors, + permeabilityAccessors, + dt, + localMatrix, + localRhs ), + m_stencilWrapper( stencilWrapper ), + m_seri( stencilWrapper.getElementRegionIndices() ), + m_sesri( stencilWrapper.getElementSubRegionIndices() ), + m_sei( stencilWrapper.getElementIndices() ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables + { +public: + + /** + * @brief Constructor for the stack variables + * @param[in] size size of the stencil for this connection + * @param[in] numElems number of elements for this connection + */ + GEOS_HOST_DEVICE + StackVariables( localIndex const size, localIndex numElems ) + : stencilSize( size ), + numFluxElems( numElems ), + dofColIndices( size * numDof ), + localFlux( numElems * numEqn ), + localFluxJacobian( numElems * numEqn, size * numDof ) + {} + + // Stencil information + + /// Stencil size for a given connection + localIndex const stencilSize; + + /// Number of elements for a given connection + localIndex const numFluxElems; + + // Transmissibility and derivatives + + /// Transmissibility + real64 transmissibility[maxNumConns][2]{}; + /// Derivatives of transmissibility with respect to pressure + real64 dTrans_dPres[maxNumConns][2]{}; + + // Local degrees of freedom and local residual/jacobian + + /// Indices of the matrix rows/columns corresponding to the dofs in this face + stackArray1d< globalIndex, maxNumElems * numDof > dofColIndices; + + /// Storage for the face local residual vector (all equations except volume balance) + stackArray1d< real64, maxNumElems * numEqn > localFlux; + /// Storage for the face local Jacobian matrix + stackArray2d< real64, maxNumElems * numEqn * maxStencilSize * numDof > localFluxJacobian; + + }; + + /** + * @brief Getter for the stencil size at this connection + * @param[in] iconn the connection index + * @return the size of the stencil at this connection + */ + GEOS_HOST_DEVICE + localIndex stencilSize( localIndex const iconn ) const + { return m_sei[iconn].size(); } + + /** + * @brief Getter for the number of elements at this connection + * @param[in] iconn the connection index + * @return the number of elements at this connection + */ + GEOS_HOST_DEVICE + localIndex numPointsInFlux( localIndex const iconn ) const + { return m_stencilWrapper.numPointsInFlux( iconn ); } + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] iconn the connection index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + void setup( localIndex const iconn, + StackVariables & stack ) const + { + // set degrees of freedom indices for this face + for( integer i = 0; i < stack.stencilSize; ++i ) + { + globalIndex const offset = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; + + for( integer jdof = 0; jdof < numDof; ++jdof ) + { + stack.dofColIndices[i * numDof + jdof] = offset + jdof; + } + } + } + + /** + * @brief Compute the local flux contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the computation of the flux + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + * @param[in] NoOpFunc the function used to customize the computation of the flux + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void computeFlux( localIndex const iconn, + StackVariables & stack, + FUNC && kernelOp = NoOpFunc{} ) const + { + // first, compute the transmissibilities at this face + m_stencilWrapper.computeWeights( iconn, + m_permeability, + m_dPerm_dPres, + stack.transmissibility, + stack.dTrans_dPres ); + + localIndex k[2]; + localIndex connectionIndex = 0; + + for( k[0] = 0; k[0] < stack.numFluxElems; ++k[0] ) + { + for( k[1] = k[0] + 1; k[1] < stack.numFluxElems; ++k[1] ) + { + real64 fluxVal = 0.0; + 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] )}; + + singlePhaseFluxKernelsHelper::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; + stack.localFlux[k[1]*numEqn] -= m_dt * fluxVal; + + for( integer ke = 0; ke < 2; ++ke ) + { + localIndex const localDofIndexPres = k[ke] * numDof; + stack.localFluxJacobian[k[0]*numEqn][localDofIndexPres] += m_dt * dFlux_dP[ke]; + stack.localFluxJacobian[k[1]*numEqn][localDofIndexPres] -= m_dt * dFlux_dP[ke]; + } + + // Customize the kernel with this lambda + kernelOp( k, regionIndex, subRegionIndex, elementIndex, connectionIndex, alpha, mobility, potGrad, fluxVal, dFlux_dP ); + + connectionIndex++; + } + } + } + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void complete( localIndex const iconn, + StackVariables & stack, + FUNC && kernelOp = NoOpFunc{} ) const + { + // add contribution to residual and jacobian into: + // - the mass balance equation + // note that numDof includes derivatives wrt temperature if this class is derived in ThermalKernels + for( integer i = 0; i < stack.numFluxElems; ++i ) + { + if( m_ghostRank[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )] < 0 ) + { + globalIndex const globalRow = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; + localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - m_rankOffset ); + GEOS_ASSERT_GE( localRow, 0 ); + GEOS_ASSERT_GT( m_localMatrix.numRows(), localRow ); + + RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[localRow], stack.localFlux[i * numEqn] ); + m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic >( localRow, + stack.dofColIndices.data(), + stack.localFluxJacobian[i * numEqn].dataIfContiguous(), + stack.stencilSize * numDof ); + + // call the lambda to assemble additional terms, such as thermal terms + kernelOp( i, localRow ); + } + } + } + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numConnections the number of connections + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numConnections, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + + forAll< POLICY >( numConnections, [=] GEOS_HOST_DEVICE ( localIndex const iconn ) + { + typename KERNEL_TYPE::StackVariables stack( kernelComponent.stencilSize( iconn ), + kernelComponent.numPointsInFlux( iconn ) ); + + kernelComponent.setup( iconn, stack ); + kernelComponent.computeFlux( iconn, stack ); + kernelComponent.complete( iconn, stack ); + } ); + } + + +protected: + + // Stencil information + + /// Reference to the stencil wrapper + STENCILWRAPPER const m_stencilWrapper; + + /// Connection to element maps + typename STENCILWRAPPER::IndexContainerViewConstType const m_seri; + typename STENCILWRAPPER::IndexContainerViewConstType const m_sesri; + typename STENCILWRAPPER::IndexContainerViewConstType const m_sei; +}; + +/** + * @class FluxComputeKernelFactory + */ +class FluxComputeKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] solverName name of the solver (to name accessors) + * @param[in] elemManager reference to the element region manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY, typename STENCILWRAPPER > + static void + createAndLaunch( globalIndex const rankOffset, + string const & dofKey, + string const & solverName, + ElementRegionManager const & elemManager, + STENCILWRAPPER const & stencilWrapper, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + integer constexpr NUM_EQN = 1; + integer constexpr NUM_DOF = 1; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + using kernelType = FluxComputeKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; + typename kernelType::SinglePhaseFlowAccessors flowAccessors( elemManager, solverName ); + typename kernelType::SinglePhaseFluidAccessors fluidAccessors( elemManager, solverName ); + typename kernelType::PermeabilityAccessors permAccessors( elemManager, solverName ); + + kernelType kernel( rankOffset, stencilWrapper, dofNumberAccessor, + flowAccessors, fluidAccessors, permAccessors, + dt, localMatrix, localRhs ); + kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); + } +}; + +} // namespace singlePhaseFVMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernelBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernelBase.hpp new file mode 100644 index 00000000000..5a3896fdd79 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernelBase.hpp @@ -0,0 +1,173 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 FluxComputeKernelBase.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUXCOMPUTEKERNELBASE_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUXCOMPUTEKERNELBASE_HPP + +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" +#include "constitutive/fluid/singlefluid/SingleFluidFields.hpp" +#include "constitutive/fluid/singlefluid/SlurryFluidBase.hpp" +#include "constitutive/fluid/singlefluid/SlurryFluidFields.hpp" +#include "constitutive/permeability/PermeabilityBase.hpp" +#include "constitutive/permeability/PermeabilityFields.hpp" +#include "linearAlgebra/interfaces/InterfaceTypes.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp" + +namespace geos +{ + +namespace singlePhaseFVMKernels +{ + +/******************************** FluxComputeKernelBase ********************************/ + +/** + * @brief Base class for FluxComputeKernel that holds all data not dependent + * on template parameters (like stencil type and number of dofs). + */ +class FluxComputeKernelBase +{ +public: + + /** + * @brief The type for element-based data. Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewConstAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + using DofNumberAccessor = ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > >; + + using SinglePhaseFlowAccessors = + StencilAccessors< fields::ghostRank, + fields::flow::pressure, + fields::flow::pressure_n, + fields::flow::gravityCoefficient, + fields::flow::mobility, + fields::flow::dMobility_dPressure >; + + using SinglePhaseFluidAccessors = + StencilMaterialAccessors< constitutive::SingleFluidBase, + fields::singlefluid::density, + fields::singlefluid::dDensity_dPressure >; + + using SlurryFluidAccessors = + StencilMaterialAccessors< constitutive::SlurryFluidBase, + fields::singlefluid::density, + fields::singlefluid::dDensity_dPressure >; + + using PermeabilityAccessors = + StencilMaterialAccessors< constitutive::PermeabilityBase, + fields::permeability::permeability, + fields::permeability::dPerm_dPressure >; + + using ProppantPermeabilityAccessors = + StencilMaterialAccessors< constitutive::PermeabilityBase, + fields::permeability::permeability, + fields::permeability::dPerm_dPressure, + fields::permeability::dPerm_dDispJump, + fields::permeability::permeabilityMultiplier >; + + /** + * @brief Constructor for the kernel interface + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofNumberAccessor accessor for the dof numbers + * @param[in] singleFlowAccessors accessor for wrappers registered by the solver + * @param[in] singlePhaseFluidAccessors accessor for wrappers registered by the singlefluid model + * @param[in] permeabilityAccessors accessor for wrappers registered by the permeability model + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + FluxComputeKernelBase( globalIndex const rankOffset, + DofNumberAccessor const & dofNumberAccessor, + SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, + SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, + PermeabilityAccessors const & permeabilityAccessors, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + : m_rankOffset( rankOffset ), + m_dt( dt ), + m_dofNumber( dofNumberAccessor.toNestedViewConst() ), + m_permeability( permeabilityAccessors.get( fields::permeability::permeability {} ) ), + m_dPerm_dPres( permeabilityAccessors.get( fields::permeability::dPerm_dPressure {} ) ), + m_ghostRank( singlePhaseFlowAccessors.get( fields::ghostRank {} ) ), + m_gravCoef( singlePhaseFlowAccessors.get( fields::flow::gravityCoefficient {} ) ), + m_pres( singlePhaseFlowAccessors.get( fields::flow::pressure {} ) ), + m_mob( singlePhaseFlowAccessors.get( fields::flow::mobility {} ) ), + m_dMob_dPres( singlePhaseFlowAccessors.get( fields::flow::dMobility_dPressure {} ) ), + m_dens( singlePhaseFluidAccessors.get( fields::singlefluid::density {} ) ), + m_dDens_dPres( singlePhaseFluidAccessors.get( fields::singlefluid::dDensity_dPressure {} ) ), + m_localMatrix( localMatrix ), + m_localRhs( localRhs ) + {} + +protected: + + /// Offset for my MPI rank + globalIndex const m_rankOffset; + + /// Time step size + real64 const m_dt; + + /// Views on dof numbers + ElementViewConst< arrayView1d< globalIndex const > > const m_dofNumber; + + /// Views on permeability + ElementViewConst< arrayView3d< real64 const > > m_permeability; + ElementViewConst< arrayView3d< real64 const > > m_dPerm_dPres; + + /// Views on ghost rank numbers and gravity coefficients + ElementViewConst< arrayView1d< integer const > > const m_ghostRank; + ElementViewConst< arrayView1d< real64 const > > const m_gravCoef; + + // Primary and secondary variables + /// Views on pressure + ElementViewConst< arrayView1d< real64 const > > const m_pres; + + /// Views on fluid mobility + ElementViewConst< arrayView1d< real64 const > > const m_mob; + ElementViewConst< arrayView1d< real64 const > > const m_dMob_dPres; + + /// Views on fluid density + ElementViewConst< arrayView2d< real64 const > > const m_dens; + ElementViewConst< arrayView2d< real64 const > > const m_dDens_dPres; + + // Residual and jacobian + + /// View on the local CRS matrix + CRSMatrixView< real64, globalIndex const > const m_localMatrix; + /// View on the local RHS + arrayView1d< real64 > const m_localRhs; +}; + +} // namespace singlePhaseFVMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUXCOMPUTEKERNELBASE_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp similarity index 75% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp index 0e4ae5ba2b4..07f81dfd2f0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp @@ -17,22 +17,24 @@ * @file FluxKernelsHelper.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_FLUXKERNELSHELPER_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_FLUXKERNELSHELPER_HPP +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUXKERNELSHELPER_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUXKERNELSHELPER_HPP #include "common/DataTypes.hpp" -#include "common/GEOS_RAJA_Interface.hpp" -#include "finiteVolume/BoundaryStencil.hpp" -#include "linearAlgebra/interfaces/InterfaceTypes.hpp" #include "mesh/ElementRegionManager.hpp" -#include "fieldSpecification/AquiferBoundaryCondition.hpp" namespace geos { -namespace fluxKernelsHelper +namespace singlePhaseFluxKernelsHelper { +/** + * @brief The type for element-based data. Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewConstAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ template< typename VIEWTYPE > using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; @@ -283,69 +285,8 @@ void computeConductiveFlux( localIndex const ( &seri )[2], } } -/******************************** AquiferBCKernel ********************************/ - -/** - * @brief Function to sum the aquiferBC fluxes (as later save them) at the end of the time step - * This function is applicable for both single-phase and multiphase flow - */ -struct AquiferBCKernel -{ - - /** - * @brief The type for element-based data. Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewConstAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - - static real64 - sumFluxes( BoundaryStencil const & stencil, - AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper, - ElementViewConst< arrayView1d< real64 const > > const & pres, - ElementViewConst< arrayView1d< real64 const > > const & presOld, - ElementViewConst< arrayView1d< real64 const > > const & gravCoef, - real64 const & timeAtBeginningOfStep, - real64 const & dt ) - { - using Order = BoundaryStencil::Order; - - BoundaryStencil::IndexContainerViewConstType const & seri = stencil.getElementRegionIndices(); - BoundaryStencil::IndexContainerViewConstType const & sesri = stencil.getElementSubRegionIndices(); - BoundaryStencil::IndexContainerViewConstType const & sefi = stencil.getElementIndices(); - BoundaryStencil::WeightContainerViewConstType const & weight = stencil.getWeights(); - - RAJA::ReduceSum< parallelDeviceReduce, real64 > targetSetSumFluxes( 0.0 ); - - forAll< parallelDevicePolicy<> >( stencil.size(), [=] GEOS_HOST_DEVICE ( localIndex const iconn ) - { - localIndex const er = seri( iconn, Order::ELEM ); - localIndex const esr = sesri( iconn, Order::ELEM ); - localIndex const ei = sefi( iconn, Order::ELEM ); - real64 const areaFraction = weight( iconn, Order::ELEM ); - - // compute the aquifer influx rate using the pressure influence function and the aquifer props - real64 dAquiferVolFlux_dPres = 0.0; - real64 const aquiferVolFlux = aquiferBCWrapper.compute( timeAtBeginningOfStep, - dt, - pres[er][esr][ei], - presOld[er][esr][ei], - gravCoef[er][esr][ei], - areaFraction, - dAquiferVolFlux_dPres ); - targetSetSumFluxes += aquiferVolFlux; - } ); - return targetSetSumFluxes.get(); - } - -}; - - -} // namespace fluxKernelsHelper +} // namespace singlePhaseFluxKernelsHelper } // namespace geos -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_FLUXKERNELSHELPER_HPP +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_FLUXKERNELSHELPER_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/HydrostaticPressureKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/HydrostaticPressureKernel.hpp new file mode 100644 index 00000000000..fe08f309833 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/HydrostaticPressureKernel.hpp @@ -0,0 +1,213 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 HydrostaticPressureKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_HYDROSTATICPRESSUREKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_HYDROSTATICPRESSUREKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" + +namespace geos +{ + +namespace singlePhaseBaseKernels +{ + +/******************************** HydrostaticPressureKernel ********************************/ + +struct HydrostaticPressureKernel +{ + + template< typename FLUID_WRAPPER > + static bool + computeHydrostaticPressure( integer const maxNumEquilIterations, + real64 const & equilTolerance, + real64 const (&gravVector)[ 3 ], + FLUID_WRAPPER fluidWrapper, + real64 const & refElevation, + real64 const & refPres, + real64 const & refDens, + real64 const & newElevation, + real64 & newPres, + real64 & newDens ) + { + // Step 1: guess the pressure with the refDensity + + real64 const gravCoef = gravVector[2] * ( refElevation - newElevation ); + real64 pres0 = refPres - refDens * gravCoef; + real64 pres1 = 0.0; + + // Step 2: compute the mass density at this elevation using the guess, and update pressure + + real64 dens = 0.0; + real64 visc = 0.0; + constitutive::SingleFluidBaseUpdate::computeValues( fluidWrapper, + pres0, + dens, + visc ); + pres1 = refPres - 0.5 * ( refDens + dens ) * gravCoef; + + // Step 3: fixed-point iteration until convergence + + bool equilHasConverged = false; + for( localIndex eqIter = 0; eqIter < maxNumEquilIterations; ++eqIter ) + { + + // check convergence + equilHasConverged = ( LvArray::math::abs( pres0 - pres1 ) < equilTolerance ); + pres0 = pres1; + + // if converged, move on + if( equilHasConverged ) + { + break; + } + + // compute the density at this elevation using the previous pressure, and compute the new pressure + constitutive::SingleFluidBaseUpdate::computeValues( fluidWrapper, + pres0, + dens, + visc ); + pres1 = refPres - 0.5 * ( refDens + dens ) * gravCoef; + } + + // Step 4: save the hydrostatic pressure and the corresponding density + + newPres = pres1; + newDens = dens; + + return equilHasConverged; + } + + + template< typename FLUID_WRAPPER > + static bool + launch( localIndex const size, + integer const maxNumEquilIterations, + real64 const equilTolerance, + real64 const (&gravVector)[ 3 ], + real64 const & minElevation, + real64 const & elevationIncrement, + real64 const & datumElevation, + real64 const & datumPres, + FLUID_WRAPPER fluidWrapper, + arrayView1d< arrayView1d< real64 > const > elevationValues, + arrayView1d< real64 > pressureValues ) + { + bool hasConverged = true; + + // Step 1: compute the mass density at the datum elevation + + real64 datumDens = 0.0; + real64 datumVisc = 0.0; + + constitutive::SingleFluidBaseUpdate::computeValues( fluidWrapper, + datumPres, + datumDens, + datumVisc ); + + // Step 2: find the closest elevation to datumElevation + + forAll< parallelHostPolicy >( size, [=] ( localIndex const i ) + { + real64 const elevation = minElevation + i * elevationIncrement; + elevationValues[0][i] = elevation; + } ); + integer const iRef = LvArray::sortedArrayManipulation::find( elevationValues[0].begin(), + elevationValues[0].size(), + datumElevation ); + + + // Step 3: compute the mass density and pressure at the reference elevation + + array1d< real64 > dens( pressureValues.size() ); + + bool const hasConvergedRef = + computeHydrostaticPressure( maxNumEquilIterations, + equilTolerance, + gravVector, + fluidWrapper, + datumElevation, + datumPres, + datumDens, + elevationValues[0][iRef], + pressureValues[iRef], + dens[iRef] ); + if( !hasConvergedRef ) + { + return false; + } + + + // Step 4: for each elevation above the reference elevation, compute the pressure + + localIndex const numEntriesAboveRef = size - iRef - 1; + forAll< serialPolicy >( numEntriesAboveRef, [=, &hasConverged] ( localIndex const i ) + { + bool const hasConvergedAboveRef = + computeHydrostaticPressure( maxNumEquilIterations, + equilTolerance, + gravVector, + fluidWrapper, + elevationValues[0][iRef+i], + pressureValues[iRef+i], + dens[iRef+i], + elevationValues[0][iRef+i+1], + pressureValues[iRef+i+1], + dens[iRef+i+1] ); + if( !hasConvergedAboveRef ) + { + hasConverged = false; + } + + + } ); + + // Step 5: for each elevation below the reference elevation, compute the pressure + + localIndex const numEntriesBelowRef = iRef; + forAll< serialPolicy >( numEntriesBelowRef, [=, &hasConverged] ( localIndex const i ) + { + bool const hasConvergedBelowRef = + computeHydrostaticPressure( maxNumEquilIterations, + equilTolerance, + gravVector, + fluidWrapper, + elevationValues[0][iRef-i], + pressureValues[iRef-i], + dens[iRef-i], + elevationValues[0][iRef-i-1], + pressureValues[iRef-i-1], + dens[iRef-i-1] ); + if( !hasConvergedBelowRef ) + { + hasConverged = false; + } + } ); + + return hasConverged; + } +}; + +} // namespace singlePhaseBaseKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_HYDROSTATICPRESSUREKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp new file mode 100644 index 00000000000..22f6470f5f3 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp @@ -0,0 +1,149 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 MobilityKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_MOBILITYKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_MOBILITYKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace singlePhaseBaseKernels +{ + +/******************************** MobilityKernel ********************************/ + +struct MobilityKernel +{ + // Isothermal version + GEOS_HOST_DEVICE + inline + static void + compute( real64 const & dens, + real64 const & dDens_dPres, + real64 const & visc, + real64 const & dVisc_dPres, + real64 & mob, + real64 & dMob_dPres ) + { + mob = dens / visc; + dMob_dPres = dDens_dPres / visc - mob / visc * dVisc_dPres; + } + +// Thermal version + GEOS_HOST_DEVICE + inline + static void + compute( real64 const & dens, + real64 const & dDens_dPres, + real64 const & dDens_dTemp, + real64 const & visc, + real64 const & dVisc_dPres, + real64 const & dVisc_dTemp, + real64 & mob, + real64 & dMob_dPres, + real64 & dMob_dTemp ) + { + mob = dens / visc; + dMob_dPres = dDens_dPres / visc - mob / visc * dVisc_dPres; + dMob_dTemp = dDens_dTemp / visc - mob / visc * dVisc_dTemp; + } + +// Value-only (no derivatives) version + GEOS_HOST_DEVICE + inline + static void + compute( real64 const & dens, + real64 const & visc, + real64 & mob ) + { + mob = dens / visc; + } + + // Isothermal version + template< typename POLICY > + static void launch( localIndex const size, + arrayView2d< real64 const > const & dens, + arrayView2d< real64 const > const & dDens_dPres, + arrayView2d< real64 const > const & visc, + arrayView2d< real64 const > const & dVisc_dPres, + arrayView1d< real64 > const & mob, + arrayView1d< real64 > const & dMob_dPres ) + { + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + compute( dens[a][0], + dDens_dPres[a][0], + visc[a][0], + dVisc_dPres[a][0], + mob[a], + dMob_dPres[a] ); + } ); + } + + // Thermal version + template< typename POLICY > + static void launch( localIndex const size, + arrayView2d< real64 const > const & dens, + arrayView2d< real64 const > const & dDens_dPres, + arrayView2d< real64 const > const & dDens_dTemp, + arrayView2d< real64 const > const & visc, + arrayView2d< real64 const > const & dVisc_dPres, + arrayView2d< real64 const > const & dVisc_dTemp, + arrayView1d< real64 > const & mob, + arrayView1d< real64 > const & dMob_dPres, + arrayView1d< real64 > const & dMob_dTemp ) + { + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + compute( dens[a][0], + dDens_dPres[a][0], + dDens_dTemp[a][0], + visc[a][0], + dVisc_dPres[a][0], + dVisc_dTemp[a][0], + mob[a], + dMob_dPres[a], + dMob_dTemp[a] ); + } ); + } + +// Value-only (no derivatives) version + template< typename POLICY > + static void launch( localIndex const size, + arrayView2d< real64 const > const & dens, + arrayView2d< real64 const > const & visc, + arrayView1d< real64 > const & mob ) + { + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + compute( dens[a][0], + visc[a][0], + mob[a] ); + } ); + } +}; + +} // namespace singlePhaseBaseKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_MOBILITYKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp new file mode 100644 index 00000000000..f88ef04eb96 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp @@ -0,0 +1,268 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ResidualNormKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_RESIDUALNORMKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_RESIDUALNORMKERNEL_HPP + +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" + +namespace geos +{ + +namespace singlePhaseBaseKernels +{ + +/******************************** ResidualNormKernel ********************************/ + +/** + * @class IsothermalResidualNormKernel + */ +class IsothermalResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 1 > +{ +public: + + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 1 >; + using Base::m_minNormalizer; + using Base::m_rankOffset; + using Base::m_localResidual; + using Base::m_dofNumber; + + IsothermalResidualNormKernel( globalIndex const rankOffset, + arrayView1d< real64 const > const & localResidual, + arrayView1d< globalIndex const > const & dofNumber, + arrayView1d< localIndex const > const & ghostRank, + ElementSubRegionBase const & subRegion, + real64 const minNormalizer ) + : Base( rankOffset, + localResidual, + dofNumber, + ghostRank, + minNormalizer ), + m_mass_n( subRegion.template getField< fields::flow::mass_n >() ) + {} + + GEOS_HOST_DEVICE + virtual void computeLinf( localIndex const ei, + LinfStackVariables & stack ) const override + { + real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_mass_n[ei] ); + real64 const valMass = LvArray::math::abs( m_localResidual[stack.localRow] ) / massNormalizer; + if( valMass > stack.localValue[0] ) + { + stack.localValue[0] = valMass; + } + } + + GEOS_HOST_DEVICE + virtual void computeL2( localIndex const ei, + L2StackVariables & stack ) const override + { + real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_mass_n[ei] ); + stack.localValue[0] += m_localResidual[stack.localRow] * m_localResidual[stack.localRow]; + stack.localNormalizer[0] += massNormalizer; + } + + +protected: + + /// View on mass at the previous converged time step + arrayView1d< real64 const > const m_mass_n; + +}; + +/** + * @class ThermalResidualNormKernel + */ +class ThermalResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 2 > +{ +public: + + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 2 >; + using Base::m_minNormalizer; + using Base::m_rankOffset; + using Base::m_localResidual; + using Base::m_dofNumber; + + ThermalResidualNormKernel( globalIndex const rankOffset, + arrayView1d< real64 const > const & localResidual, + arrayView1d< globalIndex const > const & dofNumber, + arrayView1d< localIndex const > const & ghostRank, + ElementSubRegionBase const & subRegion, + real64 const minNormalizer ) + : Base( rankOffset, + localResidual, + dofNumber, + ghostRank, + minNormalizer ), + m_mass_n( subRegion.template getField< fields::flow::mass_n >() ), + m_energy_n( subRegion.template getField< fields::flow::energy_n >() ) + {} + + GEOS_HOST_DEVICE + void computeMassEnergyNormalizers( localIndex const ei, + real64 & massNormalizer, + real64 & energyNormalizer ) const + { + massNormalizer = LvArray::math::max( m_minNormalizer, m_mass_n[ei] ); + energyNormalizer = LvArray::math::max( m_minNormalizer, LvArray::math::abs( m_energy_n[ei] ) ); // energy can be negative + } + + GEOS_HOST_DEVICE + virtual void computeLinf( localIndex const ei, + LinfStackVariables & stack ) const override + { + real64 massNormalizer = 0.0, energyNormalizer = 0.0; + computeMassEnergyNormalizers( ei, massNormalizer, energyNormalizer ); + + // step 1: mass residual + + real64 const valMass = LvArray::math::abs( m_localResidual[stack.localRow] ) / massNormalizer; + if( valMass > stack.localValue[0] ) + { + stack.localValue[0] = valMass; + } + + // step 2: energy residual + real64 const valEnergy = LvArray::math::abs( m_localResidual[stack.localRow + 1] ) / energyNormalizer; + if( valEnergy > stack.localValue[1] ) + { + stack.localValue[1] = valEnergy; + } + } + + GEOS_HOST_DEVICE + virtual void computeL2( localIndex const ei, + L2StackVariables & stack ) const override + { + real64 massNormalizer = 0.0, energyNormalizer = 0.0; + computeMassEnergyNormalizers( ei, massNormalizer, energyNormalizer ); + + // step 1: mass residual + + stack.localValue[0] += m_localResidual[stack.localRow] * m_localResidual[stack.localRow]; + stack.localNormalizer[0] += massNormalizer; + + // step 2: energy residual + + stack.localValue[1] += m_localResidual[stack.localRow + 1] * m_localResidual[stack.localRow + 1]; + stack.localNormalizer[1] += energyNormalizer; + } + + +protected: + + /// View on mass at the previous converged time step + arrayView1d< real64 const > const m_mass_n; + + /// View on energy at the previous converged time step + arrayView1d< real64 const > const m_energy_n; + +}; + +/** + * @class ResidualNormKernelFactory + */ +class ResidualNormKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch (isothermal version) + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] normType the type of norm used (Linf or L2) + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] localResidual the residual vector on my MPI rank + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[out] residualNorm the residual norm on the subRegion + * @param[out] residualNormalizer the residual normalizer on the subRegion + */ + template< typename POLICY > + static void + createAndLaunch( physicsSolverBaseKernels::NormType const normType, + globalIndex const rankOffset, + string const dofKey, + arrayView1d< real64 const > const & localResidual, + ElementSubRegionBase const & subRegion, + real64 const minNormalizer, + real64 (& residualNorm)[1], + real64 (& residualNormalizer)[1] ) + { + arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); + arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); + + IsothermalResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, subRegion, minNormalizer ); + if( normType == physicsSolverBaseKernels::NormType::Linf ) + { + IsothermalResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); + } + else // L2 norm + { + IsothermalResidualNormKernel::launchL2< POLICY >( subRegion.size(), kernel, residualNorm, residualNormalizer ); + } + } + + /** + * @brief Create a new kernel and launch (thermal version) + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] normType the type of norm used (Linf or L2) + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] localResidual the residual vector on my MPI rank + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[in] solidInternalEnergy the solid internal energy model + * @param[out] residualNorm the residual norm on the subRegion + * @param[out] residualNormalizer the residual normalizer on the subRegion + */ + template< typename POLICY > + static void + createAndLaunch( physicsSolverBaseKernels::NormType const normType, + globalIndex const rankOffset, + string const & dofKey, + arrayView1d< real64 const > const & localResidual, + ElementSubRegionBase const & subRegion, + real64 const minNormalizer, + real64 (& residualNorm)[2], + real64 (& residualNormalizer)[2] ) + { + arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); + arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); + + ThermalResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, subRegion, minNormalizer ); + if( normType == physicsSolverBaseKernels::NormType::Linf ) + { + ThermalResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); + } + else // L2 norm + { + ThermalResidualNormKernel::launchL2< POLICY >( subRegion.size(), kernel, residualNorm, residualNormalizer ); + } + } + +}; + +} // namespace singlePhaseBaseKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_RESIDUALNORMKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp similarity index 99% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp index d2fc6b39da9..13e5eeabfcb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp @@ -17,8 +17,8 @@ * @file SinglePhaseHybridFVMKernels.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEHYBRIDFVMKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEHYBRIDFVMKERNELS_HPP +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_HYBRIDFVMKERNELS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_HYBRIDFVMKERNELS_HPP #include "common/DataTypes.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" @@ -37,7 +37,7 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp" #include "physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp" #include "physicsSolvers/PhysicsSolverBaseKernels.hpp" #include "codingUtilities/Utilities.hpp" @@ -959,4 +959,4 @@ class ResidualNormKernelFactory } // namespace geos -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEHYBRIDFVMKERNELS_HPP +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_HYBRIDFVMKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolidInternalEnergyUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolidInternalEnergyUpdateKernel.hpp new file mode 100644 index 00000000000..4ed3658e569 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolidInternalEnergyUpdateKernel.hpp @@ -0,0 +1,54 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SolidInternalEnergyUpdateKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SOLIDINTERNALENERGYUPDATEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SOLIDINTERNALENERGYUPDATEKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace thermalSinglePhaseBaseKernels +{ + +/******************************** SolidInternalEnergyUpdateKernel ********************************/ + +struct SolidInternalEnergyUpdateKernel +{ + + template< typename POLICY, typename SOLID_INTERNAL_ENERGY_WRAPPER > + static void + launch( localIndex const size, + SOLID_INTERNAL_ENERGY_WRAPPER const & solidInternalEnergyWrapper, + arrayView1d< real64 const > const & temp ) + { + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + solidInternalEnergyWrapper.update( k, temp[k] ); + } ); + } +}; + +} // namespace thermalSinglePhaseBaseKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SOLIDINTERNALENERGYUPDATEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp new file mode 100644 index 00000000000..29a22e422f7 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp @@ -0,0 +1,72 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SolutionCheckKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_SOLUTIONCHECKKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_SOLUTIONCHECKKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace singlePhaseBaseKernels +{ + +/******************************** SolutionCheckKernel ********************************/ + +struct SolutionCheckKernel +{ + template< typename POLICY > + static std::pair< integer, real64 > launch( arrayView1d< real64 const > const & localSolution, + globalIndex const rankOffset, + arrayView1d< globalIndex const > const & dofNumber, + arrayView1d< integer const > const & ghostRank, + arrayView1d< real64 const > const & pres, + real64 const scalingFactor ) + { + RAJA::ReduceSum< ReducePolicy< POLICY >, integer > numNegativePressures( 0 ); + RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minPres( 0.0 ); + + forAll< POLICY >( dofNumber.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( ghostRank[ei] < 0 && dofNumber[ei] >= 0 ) + { + localIndex const lid = dofNumber[ei] - rankOffset; + real64 const newPres = pres[ei] + scalingFactor * localSolution[lid]; + + if( newPres < 0.0 ) + { + numNegativePressures += 1; + minPres.min( newPres ); + } + } + + } ); + + return { numNegativePressures.get(), minPres.get() }; + } + +}; + +} // namespace singlePhaseBaseKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_SOLUTIONCHECKKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionScalingKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionScalingKernel.hpp new file mode 100644 index 00000000000..5994d972e3b --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionScalingKernel.hpp @@ -0,0 +1,75 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SolutionScalingKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_SOLUTIONSCALINGKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_SOLUTIONSCALINGKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace singlePhaseBaseKernels +{ + +/******************************** SolutionScalingKernel ********************************/ + +struct SolutionScalingKernel +{ + template< typename POLICY > + static std::pair< real64, real64 > launch( arrayView1d< real64 const > const & localSolution, + globalIndex const rankOffset, + arrayView1d< globalIndex const > const & dofNumber, + arrayView1d< integer const > const & ghostRank, + real64 const maxAbsolutePresChange ) + { + RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > scalingFactor( 1.0 ); + RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaPres( 0.0 ); + + forAll< POLICY >( dofNumber.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) mutable + { + if( ghostRank[ei] < 0 && dofNumber[ei] >= 0 ) + { + localIndex const lid = dofNumber[ei] - rankOffset; + + // compute the change in pressure + real64 const absPresChange = LvArray::math::abs( localSolution[lid] ); + maxDeltaPres.max( absPresChange ); + + // maxAbsolutePresChange <= 0.0 means that scaling is disabled, and we are only collecting maxDeltaPres in this kernel + if( maxAbsolutePresChange > 0.0 && absPresChange > maxAbsolutePresChange ) + { + real64 const presScalingFactor = maxAbsolutePresChange / absPresChange; + scalingFactor.min( presScalingFactor ); + } + } + + } ); + + return { scalingFactor.get(), maxDeltaPres.get() }; + } + +}; + +} // namespace singlePhaseBaseKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_SOLUTIONSCALINGKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StabilizedFluxComputeKernel.hpp similarity index 86% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedSinglePhaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StabilizedFluxComputeKernel.hpp index 98963a98ea2..88d4cc4ce73 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/StabilizedSinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StabilizedFluxComputeKernel.hpp @@ -14,13 +14,13 @@ */ /** - * @file StabilizedSinglePhaseFVMKernels.hpp + * @file StabilizedFluxComputeKernel.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDSINGLEPHASEFVMKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDSINGLEPHASEFVMKERNELS_HPP +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_STABILIZEDFLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_STABILIZEDFLUXCOMPUTEKERNEL_HPP -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp" namespace geos { @@ -28,24 +28,23 @@ namespace geos namespace stabilizedSinglePhaseFVMKernels { - -/******************************** FaceBasedAssemblyKernel ********************************/ +/******************************** FluxComputeKernel ********************************/ /** - * @class FaceBasedAssemblyKernel + * @class FluxComputeKernel * @tparam NUM_DOF number of degrees of freedom * @tparam STENCILWRAPPER the type of the stencil wrapper * @brief Define the interface for the assembly kernel in charge of flux terms */ template< integer NUM_EQN, integer NUM_DOF, typename STENCILWRAPPER > -class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER > +class FluxComputeKernel : public singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER > { public: template< typename VIEWTYPE > using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - using AbstractBase = singlePhaseFVMKernels::FaceBasedAssemblyKernelBase; + using AbstractBase = singlePhaseFVMKernels::FluxComputeKernelBase; using DofNumberAccessor = AbstractBase::DofNumberAccessor; using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; @@ -67,7 +66,7 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK using AbstractBase::m_gravCoef; using AbstractBase::m_pres; - using Base = singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; + using Base = singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; using Base::numDof; using Base::numEqn; using Base::maxNumElems; @@ -92,17 +91,17 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK * @param[inout] localMatrix the local CRS matrix * @param[inout] localRhs the local right-hand side vector */ - FaceBasedAssemblyKernel( globalIndex const rankOffset, - STENCILWRAPPER const & stencilWrapper, - DofNumberAccessor const & dofNumberAccessor, - SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, - StabSinglePhaseFlowAccessors const & stabSinglePhaseFlowAccessors, - SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, - StabSinglePhaseFluidAccessors const & stabSinglePhaseFluidAccessors, - PermeabilityAccessors const & permeabilityAccessors, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) + FluxComputeKernel( globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, + StabSinglePhaseFlowAccessors const & stabSinglePhaseFlowAccessors, + SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, + StabSinglePhaseFluidAccessors const & stabSinglePhaseFluidAccessors, + PermeabilityAccessors const & permeabilityAccessors, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) : Base( rankOffset, stencilWrapper, dofNumberAccessor, @@ -248,9 +247,9 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK }; /** - * @class FaceBasedAssemblyKernelFactory + * @class FluxComputeKernelFactory */ -class FaceBasedAssemblyKernelFactory +class FluxComputeKernelFactory { public: @@ -286,7 +285,7 @@ class FaceBasedAssemblyKernelFactory elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - using KERNEL_TYPE = FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; + using KERNEL_TYPE = FluxComputeKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; typename KERNEL_TYPE::SinglePhaseFlowAccessors singlePhaseFlowAccessors( elemManager, solverName ); typename KERNEL_TYPE::SinglePhaseFluidAccessors singlePhaseFluidAccessors( elemManager, solverName ); typename KERNEL_TYPE::StabSinglePhaseFlowAccessors stabSinglePhaseFlowAccessors( elemManager, solverName ); @@ -306,4 +305,4 @@ class FaceBasedAssemblyKernelFactory } // namespace geos -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDSINGLEPHASEFVMKERNELS_HPP +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_STABILIZEDFLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StatisticsKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StatisticsKernel.hpp new file mode 100644 index 00000000000..59e0d267dc8 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StatisticsKernel.hpp @@ -0,0 +1,133 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 StatisticsKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_STATISTICSKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_STATISTICSKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace singlePhaseBaseKernels +{ + +/******************************** StatisticsKernel ********************************/ + +struct StatisticsKernel +{ + static void + saveDeltaPressure( localIndex const size, + arrayView1d< real64 const > const & pres, + arrayView1d< real64 const > const & initPres, + arrayView1d< real64 > const & deltaPres ) + { + forAll< parallelDevicePolicy<> >( size, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + deltaPres[ei] = pres[ei] - initPres[ei]; + } ); + } + + static void + launch( localIndex const size, + arrayView1d< integer const > const & elemGhostRank, + arrayView1d< real64 const > const & volume, + arrayView1d< real64 const > const & pres, + arrayView1d< real64 const > const & deltaPres, + arrayView1d< real64 const > const & temp, + arrayView1d< real64 const > const & refPorosity, + arrayView2d< real64 const > const & porosity, + arrayView2d< real64 const > const & density, + real64 & minPres, + real64 & avgPresNumerator, + real64 & maxPres, + real64 & minDeltaPres, + real64 & maxDeltaPres, + real64 & minTemp, + real64 & avgTempNumerator, + real64 & maxTemp, + real64 & totalUncompactedPoreVol, + real64 & totalPoreVol, + real64 & totalMass ) + { + RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinPres( LvArray::NumericLimits< real64 >::max ); + RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionAvgPresNumerator( 0.0 ); + RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxPres( -LvArray::NumericLimits< real64 >::max ); + + RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinDeltaPres( LvArray::NumericLimits< real64 >::max ); + RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxDeltaPres( -LvArray::NumericLimits< real64 >::max ); + + RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinTemp( LvArray::NumericLimits< real64 >::max ); + RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionAvgTempNumerator( 0.0 ); + RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxTemp( -LvArray::NumericLimits< real64 >::max ); + + RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionTotalUncompactedPoreVol( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionTotalPoreVol( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionTotalMass( 0.0 ); + + forAll< parallelDevicePolicy<> >( size, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( elemGhostRank[ei] >= 0 ) + { + return; + } + + // To match our "reference", we have to use reference porosity here, not the actual porosity when we compute averages + real64 const uncompactedPoreVol = volume[ei] * refPorosity[ei]; + real64 const dynamicPoreVol = volume[ei] * porosity[ei][0]; + + subRegionMinPres.min( pres[ei] ); + subRegionAvgPresNumerator += uncompactedPoreVol * pres[ei]; + subRegionMaxPres.max( pres[ei] ); + + subRegionMinDeltaPres.min( deltaPres[ei] ); + subRegionMaxDeltaPres.max( deltaPres[ei] ); + + subRegionMinTemp.min( temp[ei] ); + subRegionAvgTempNumerator += uncompactedPoreVol * temp[ei]; + subRegionMaxTemp.max( temp[ei] ); + + subRegionTotalUncompactedPoreVol += uncompactedPoreVol; + subRegionTotalPoreVol += dynamicPoreVol; + subRegionTotalMass += dynamicPoreVol * density[ei][0]; + } ); + + minPres = subRegionMinPres.get(); + avgPresNumerator = subRegionAvgPresNumerator.get(); + maxPres = subRegionMaxPres.get(); + + minDeltaPres = subRegionMinDeltaPres.get(); + maxDeltaPres = subRegionMaxDeltaPres.get(); + + minTemp = subRegionMinTemp.get(); + avgTempNumerator = subRegionAvgTempNumerator.get(); + maxTemp = subRegionMaxTemp.get(); + + totalUncompactedPoreVol = subRegionTotalUncompactedPoreVol.get(); + totalPoreVol = subRegionTotalPoreVol.get(); + totalMass = subRegionTotalMass.get(); + } +}; + +} // namespace singlePhaseBaseKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_STATISTICSKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp new file mode 100644 index 00000000000..792558b5b2e --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp @@ -0,0 +1,338 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ThermalAccumulationKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALACCUMULATIONKERNELS_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALACCUMULATIONKERNELS_HPP + +#include "physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp" + +namespace geos +{ + +namespace thermalSinglePhaseBaseKernels +{ + +/******************************** AccumulationKernel ********************************/ + +/** + * @class AccumulationKernel + * @brief Define the interface for the assembly kernel in charge of accumulation + */ +template< typename SUBREGION_TYPE, integer NUM_DOF > +class AccumulationKernel : public singlePhaseBaseKernels::AccumulationKernel< SUBREGION_TYPE, NUM_DOF > +{ + +public: + + using Base = singlePhaseBaseKernels::AccumulationKernel< SUBREGION_TYPE, NUM_DOF >; + using Base::numDof; + using Base::numEqn; + using Base::m_rankOffset; + using Base::m_dofNumber; + using Base::m_elemGhostRank; + using Base::m_volume; + using Base::m_deltaVolume; + using Base::m_porosity; + using Base::m_dPoro_dPres; + using Base::m_density; + using Base::m_dDensity_dPres; + using Base::m_localMatrix; + using Base::m_localRhs; + + /** + * @brief Constructor + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + AccumulationKernel( globalIndex const rankOffset, + string const dofKey, + SUBREGION_TYPE const & subRegion, + constitutive::SingleFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ), + m_dDensity_dTemp( fluid.dDensity_dTemperature() ), + m_dPoro_dTemp( solid.getDporosity_dTemperature() ), + m_internalEnergy( fluid.internalEnergy() ), + m_dInternalEnergy_dPres( fluid.dInternalEnergy_dPressure() ), + m_dInternalEnergy_dTemp( fluid.dInternalEnergy_dTemperature() ), + m_rockInternalEnergy( solid.getInternalEnergy() ), + m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ), + m_energy_n( subRegion.template getField< fields::flow::energy_n >() ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables : public Base::StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables() + : Base::StackVariables() + {} + + using Base::StackVariables::poreVolume; + using Base::StackVariables::dPoreVolume_dPres; + using Base::StackVariables::localRow; + using Base::StackVariables::dofIndices; + using Base::StackVariables::localResidual; + using Base::StackVariables::localJacobian; + + /// Derivative of pore volume with respect to temperature + real64 dPoreVolume_dTemp = 0.0; + + // Solid energy + + /// Solid energy at time n+1 + real64 solidEnergy = 0.0; + + /// Derivative of solid internal energy with respect to pressure + real64 dSolidEnergy_dPres = 0.0; + + /// Derivative of solid internal energy with respect to temperature + real64 dSolidEnergy_dTemp = 0.0; + }; + + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] ei the element index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + void setup( localIndex const ei, + StackVariables & stack ) const + { + Base::setup( ei, stack ); + + stack.dPoreVolume_dTemp = ( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dTemp[ei][0]; + + // initialize the solid volume + real64 const solidVolume = ( m_volume[ei] + m_deltaVolume[ei] ) * ( 1.0 - m_porosity[ei][0] ); + real64 const dSolidVolume_dPres = -( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dPres[ei][0]; + real64 const dSolidVolume_dTemp = -( m_volume[ei] + m_deltaVolume[ei] ) * m_dPoro_dTemp[ei][0]; + + // initialize the solid internal energy + stack.solidEnergy = solidVolume * m_rockInternalEnergy[ei][0]; + stack.dSolidEnergy_dPres = dSolidVolume_dPres * m_rockInternalEnergy[ei][0]; + stack.dSolidEnergy_dTemp = solidVolume * m_dRockInternalEnergy_dTemp[ei][0] + dSolidVolume_dTemp * m_rockInternalEnergy[ei][0]; + } + + /** + * @brief Compute the local accumulation contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + * @param[in] kernelOp the function used to customize the kernel + */ + GEOS_HOST_DEVICE + void computeAccumulation( localIndex const ei, + StackVariables & stack ) const + { + stack.localResidual[numEqn-1] = -m_energy_n[ei]; + + Base::computeAccumulation( ei, stack, [&] () + { + // Step 1: assemble the derivatives of the mass balance equation w.r.t temperature + stack.localJacobian[0][numDof-1] = stack.poreVolume * m_dDensity_dTemp[ei][0] + stack.dPoreVolume_dTemp * m_density[ei][0]; + + // Step 2: assemble the fluid part of the accumulation term of the energy equation + real64 const fluidEnergy = stack.poreVolume * m_density[ei][0] * m_internalEnergy[ei][0]; + + real64 const dFluidEnergy_dP = stack.dPoreVolume_dPres * m_density[ei][0] * m_internalEnergy[ei][0] + + stack.poreVolume * m_dDensity_dPres[ei][0] * m_internalEnergy[ei][0] + + stack.poreVolume * m_density[ei][0] * m_dInternalEnergy_dPres[ei][0]; + + real64 const dFluidEnergy_dT = stack.poreVolume * m_dDensity_dTemp[ei][0] * m_internalEnergy[ei][0] + + stack.poreVolume * m_density[ei][0] * m_dInternalEnergy_dTemp[ei][0] + + stack.dPoreVolume_dTemp * m_density[ei][0] * m_internalEnergy[ei][0]; + + // local accumulation + stack.localResidual[numEqn-1] += fluidEnergy; + + // derivatives w.r.t. pressure and temperature + stack.localJacobian[numEqn-1][0] = dFluidEnergy_dP; + stack.localJacobian[numEqn-1][numDof-1] = dFluidEnergy_dT; + } ); + + // Step 3: assemble the solid part of the accumulation term of the energy equation + stack.localResidual[numEqn-1] += stack.solidEnergy; + stack.localJacobian[numEqn-1][0] += stack.dSolidEnergy_dPres; + stack.localJacobian[numEqn-1][numDof-1] += stack.dSolidEnergy_dTemp; + } + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void complete( localIndex const ei, + StackVariables & stack ) const + { + // Step 1: assemble the mass balance equation + Base::complete( ei, stack ); + + // Step 2: assemble the energy equation + m_localRhs[stack.localRow + numEqn-1] += stack.localResidual[numEqn-1]; + m_localMatrix.template addToRow< serialAtomic >( stack.localRow + numEqn-1, + stack.dofIndices, + stack.localJacobian[numEqn-1], + numDof ); + } + +protected: + + /// View on derivative of fluid density w.r.t temperature + arrayView2d< real64 const > const m_dDensity_dTemp; + + /// View on derivative of porosity w.r.t temperature + arrayView2d< real64 const > const m_dPoro_dTemp; + + /// Views on fluid internal energy + arrayView2d< real64 const > const m_internalEnergy; + arrayView2d< real64 const > const m_dInternalEnergy_dPres; + arrayView2d< real64 const > const m_dInternalEnergy_dTemp; + + /// Views on rock internal energy + arrayView2d< real64 const > const m_rockInternalEnergy; + arrayView2d< real64 const > const m_dRockInternalEnergy_dTemp; + + /// View on energy + arrayView1d< real64 const > const m_energy_n; + +}; + +/** + * @class SurfaceElementAccumulationKernel + * @brief Define the interface for the assembly kernel in charge of accumulation in SurfaceElementSubRegion + */ +class SurfaceElementAccumulationKernel : public AccumulationKernel< SurfaceElementSubRegion, 2 > +{ + +public: + + using Base = AccumulationKernel< SurfaceElementSubRegion, 2 >; + + /** + * @brief Constructor + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + SurfaceElementAccumulationKernel( globalIndex const rankOffset, + string const dofKey, + SurfaceElementSubRegion const & subRegion, + constitutive::SingleFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + : Base( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ), + m_creationMass( subRegion.getField< fields::flow::massCreated >() ) + {} + + /** + * @brief Compute the local accumulation contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void computeAccumulation( localIndex const ei, + Base::StackVariables & stack ) const + { + Base::computeAccumulation( ei, stack ); + if( Base::m_mass_n[ei] > 1.1 * m_creationMass[ei] ) + { + stack.localResidual[0] += m_creationMass[ei] * 0.25; + } + } + +protected: + + arrayView1d< real64 const > const m_creationMass; + +}; + +/** + * @class AccumulationKernelFactory + */ +class AccumulationKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY, typename SUBREGION_TYPE > + static void + createAndLaunch( globalIndex const rankOffset, + string const dofKey, + SUBREGION_TYPE const & subRegion, + constitutive::SingleFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + if constexpr ( std::is_base_of_v< CellElementSubRegion, SUBREGION_TYPE > ) + { + integer constexpr NUM_DOF = 2; + AccumulationKernel< CellElementSubRegion, NUM_DOF > kernel( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ); + AccumulationKernel< CellElementSubRegion, NUM_DOF >::template launch< POLICY >( subRegion.size(), kernel ); + } + else if constexpr ( std::is_base_of_v< SurfaceElementSubRegion, SUBREGION_TYPE > ) + { + SurfaceElementAccumulationKernel kernel( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ); + SurfaceElementAccumulationKernel::launch< POLICY >( subRegion.size(), kernel ); + } + else + { + GEOS_UNUSED_VAR( rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs ); + GEOS_ERROR( "Unsupported subregion type: " << typeid(SUBREGION_TYPE).name() ); + } + } + +}; + +} // namespace thermalSinglePhaseBaseKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALACCUMULATIONKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalDirichletFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalDirichletFluxComputeKernel.hpp new file mode 100644 index 00000000000..8e6bc1ba8fe --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalDirichletFluxComputeKernel.hpp @@ -0,0 +1,393 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ThermalDirichletFluxComputeKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALDIRICHLETFLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALDIRICHLETFLUXCOMPUTEKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp" + +#include "constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp" +#include "constitutive/thermalConductivity/ThermalConductivityFields.hpp" + +namespace geos +{ + +namespace thermalSinglePhaseFVMKernels +{ + +/******************************** DirichletFluxComputeKernel ********************************/ + +/** + * @class DirichletFluxComputeKernel + * @tparam FLUIDWRAPPER the type of the fluid wrapper + * @brief Define the interface for the assembly kernel in charge of Dirichlet face flux terms + */ +template< integer NUM_EQN, integer NUM_DOF, typename FLUIDWRAPPER > +class DirichletFluxComputeKernel : public singlePhaseFVMKernels::DirichletFluxComputeKernel< NUM_EQN, NUM_DOF, FLUIDWRAPPER > +{ +public: + +/** + * @brief The type for element-based data. Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewConstAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + using AbstractBase = singlePhaseFVMKernels::FluxComputeKernelBase; + using DofNumberAccessor = AbstractBase::DofNumberAccessor; + using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; + using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; + using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; + + using AbstractBase::m_dt; + using AbstractBase::m_rankOffset; + using AbstractBase::m_dofNumber; + using AbstractBase::m_ghostRank; + using AbstractBase::m_gravCoef; + using AbstractBase::m_mob; + using AbstractBase::m_pres; + using AbstractBase::m_permeability; + using AbstractBase::m_dPerm_dPres; + + using AbstractBase::m_localMatrix; + using AbstractBase::m_localRhs; + + using Base = singlePhaseFVMKernels::DirichletFluxComputeKernel< NUM_EQN, NUM_DOF, FLUIDWRAPPER >; + using Base::numDof; + using Base::numEqn; + using Base::m_stencilWrapper; + using Base::m_seri; + using Base::m_sesri; + using Base::m_sei; + using Base::m_facePres; + using Base::m_faceGravCoef; + + using ThermalSinglePhaseFlowAccessors = + StencilAccessors< fields::flow::temperature, + fields::flow::dMobility_dTemperature >; + + using ThermalSinglePhaseFluidAccessors = + StencilMaterialAccessors< constitutive::SingleFluidBase, + fields::singlefluid::dDensity_dTemperature, + fields::singlefluid::enthalpy, + fields::singlefluid::dEnthalpy_dPressure, + fields::singlefluid::dEnthalpy_dTemperature >; + + using ThermalConductivityAccessors = + StencilMaterialAccessors< constitutive::SinglePhaseThermalConductivityBase, + fields::thermalconductivity::effectiveConductivity, + fields::thermalconductivity::dEffectiveConductivity_dT >; + + /** + * @brief Constructor for the kernel interface + * @param[in] rankOffset the offset of the MPI rank + * @param[in] faceManager the face manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] fluidWrapper reference to the fluid wrapper + * @param[in] dofNumberAccessor the degree of freedom number accessor + * @param[in] singlePhaseFlowAccessors the single phase flow accessor + * @param[in] thermalSinglePhaseFlowAccessors the thermal single phase flow accessor + * @param[in] singlePhaseFluidAccessors the single phase fluid accessor + * @param[in] thermalSinglePhaseFluidAccessors the thermal single phase fluid accessor + * @param[in] permeabilityAccessors the permeability accessor + * @param[in] thermalConductivityAccessors the thermal conductivity accessor + * @param[in] dt the time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + DirichletFluxComputeKernel( globalIndex const rankOffset, + FaceManager const & faceManager, + BoundaryStencilWrapper const & stencilWrapper, + FLUIDWRAPPER const & fluidWrapper, + DofNumberAccessor const & dofNumberAccessor, + SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, + ThermalSinglePhaseFlowAccessors const & thermalSinglePhaseFlowAccessors, + SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, + ThermalSinglePhaseFluidAccessors const & thermalSinglePhaseFluidAccessors, + PermeabilityAccessors const & permeabilityAccessors, + ThermalConductivityAccessors const & thermalConductivityAccessors, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + + : Base( rankOffset, + faceManager, + stencilWrapper, + fluidWrapper, + dofNumberAccessor, + singlePhaseFlowAccessors, + singlePhaseFluidAccessors, + permeabilityAccessors, + dt, + localMatrix, + localRhs ), + m_temp( thermalSinglePhaseFlowAccessors.get( fields::flow::temperature {} ) ), + m_faceTemp( faceManager.getField< fields::flow::faceTemperature >() ), + m_dMob_dTemp( thermalSinglePhaseFlowAccessors.get( fields::flow::dMobility_dTemperature {} ) ), + m_dDens_dTemp( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dDensity_dTemperature {} ) ), + m_enthalpy( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::enthalpy {} ) ), + m_dEnthalpy_dPres( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dEnthalpy_dPressure {} ) ), + m_dEnthalpy_dTemp( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dEnthalpy_dTemperature {} ) ), + m_thermalConductivity( thermalConductivityAccessors.get( fields::thermalconductivity::effectiveConductivity {} ) ), + m_dThermalCond_dT( thermalConductivityAccessors.get( fields::thermalconductivity::dEffectiveConductivity_dT {} ) ) + {} + + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables : Base::StackVariables + { +public: + + /** + * @brief Constructor for the stack variables + * @param[in] size size of the stencil for this connection + * @param[in] numElems number of elements for this connection + */ + GEOS_HOST_DEVICE + StackVariables( localIndex const size, + localIndex numElems ): + Base::StackVariables( size, + numElems ) + {} + + using Base::StackVariables::localFlux; + using Base::StackVariables::localFluxJacobian; + using Base::StackVariables::dofColIndices; + using Base::StackVariables::transmissibility; + + /// Energy fluxes and derivatives wrt pressure and temperature + real64 energyFlux = 0.0; + real64 dEnergyFlux_dP = 0.0; + real64 dEnergyFlux_dT = 0.0; + }; + + /** + * @brief Compute the local Dirichlet face flux contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes + */ + GEOS_HOST_DEVICE + void computeFlux( localIndex const iconn, + StackVariables & stack ) const + { + Base::computeFlux( iconn, stack, [&] ( localIndex const er, + localIndex const esr, + localIndex const ei, + localIndex const kf, + real64 const & f, + real64 const & dF_dP, + real64 const & mobility_up, + real64 const & dMobility_dP_up ) + { + + // Compute the derivatives of the density wrt temperature + + real64 const dDens_dT = 0.5 * m_dDens_dTemp[er][esr][ei][0]; + + // Compute the derivatives of the phase potential difference wrt temperature + + real64 const dF_dT = -stack.transmissibility * dDens_dT * ( m_gravCoef[er][esr][ei] - m_faceGravCoef[kf] ); + + // Compute the (upwinded) energy flux + + real64 const flux = mobility_up * f; + real64 const enthalpy = m_enthalpy[er][esr][ei][0]; + stack.energyFlux += flux * enthalpy; + + // Compute the derivatives of the (upwinded) energy flux wrt pressure and temperature + + if( f >= 0 ) // the element is upstream + { + real64 const dFlux_dP = mobility_up * dF_dP + dMobility_dP_up * f; + real64 const dFlux_dT = mobility_up * dF_dT + m_dMob_dTemp[er][esr][ei] * f; + + stack.dEnergyFlux_dP += dFlux_dP * enthalpy + flux * m_dEnthalpy_dPres[er][esr][ei][0]; + stack.dEnergyFlux_dT += dFlux_dT * enthalpy + flux * m_dEnthalpy_dTemp[er][esr][ei][0]; + } + else + { + real64 const dFlux_dP = mobility_up * dF_dP; + real64 const dFlux_dT = mobility_up * dF_dT; + + stack.dEnergyFlux_dP += dFlux_dP * enthalpy; + stack.dEnergyFlux_dT += dFlux_dT * enthalpy; + } + + // Contribution of energy conduction through the solid phase + real64 thermalTrans = 0.0; + real64 dThermalTrans_dThermalCond[3]{}; + m_stencilWrapper.computeWeights( iconn, + m_thermalConductivity, + thermalTrans, + dThermalTrans_dThermalCond ); + + real64 const dThermalTrans_dT = LvArray::tensorOps::AiBi< 3 >( dThermalTrans_dThermalCond, m_dThermalCond_dT[er][esr][ei][0] ); + + real64 const deltaT = m_temp[er][esr][ei] - m_faceTemp[kf]; + stack.energyFlux += thermalTrans * deltaT; + stack.dEnergyFlux_dT += thermalTrans + dThermalTrans_dT * deltaT; + + // Add energyFlux and its derivatives to localFlux and localFluxJacobian + integer const localRowIndexEnergy = numEqn - 1; + stack.localFlux[localRowIndexEnergy] = m_dt * stack.energyFlux; + + stack.localFluxJacobian[localRowIndexEnergy][0] = m_dt * stack.dEnergyFlux_dP; + stack.localFluxJacobian[localRowIndexEnergy][numDof-1] = m_dt * stack.dEnergyFlux_dT; + } ); + + } + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void complete( localIndex const iconn, + StackVariables & stack ) const + { + Base::complete( iconn, stack, [&] ( localIndex const localRow ) + { + RAJA::atomicAdd( parallelDeviceAtomic{}, &AbstractBase::m_localRhs[localRow + numEqn - 1], stack.localFlux[numEqn-1] ); + + AbstractBase::m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > + ( localRow + numEqn - 1, + stack.dofColIndices, + stack.localFluxJacobian[numEqn-1], + numDof ); + } ); + } + +protected: + + /// Views on temperature + ElementViewConst< arrayView1d< real64 const > > const m_temp; + + /// Views on face temperature + arrayView1d< real64 const > const m_faceTemp; + + /// Views on derivatives of fluid mobilities + ElementViewConst< arrayView1d< real64 const > > const m_dMob_dTemp; + + /// Views on derivatives of fluid densities + ElementViewConst< arrayView2d< real64 const > > const m_dDens_dTemp; + + /// Views on enthalpies + ElementViewConst< arrayView2d< real64 const > > const m_enthalpy; + ElementViewConst< arrayView2d< real64 const > > const m_dEnthalpy_dPres; + ElementViewConst< arrayView2d< real64 const > > const m_dEnthalpy_dTemp; + + /// View on thermal conductivity + ElementViewConst< arrayView3d< real64 const > > m_thermalConductivity; + + /// View on derivatives of thermal conductivity w.r.t. temperature + ElementViewConst< arrayView3d< real64 const > > m_dThermalCond_dT; + +}; + +/** + * @class DirichletFluxComputeKernelFactory + */ +class DirichletFluxComputeKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] solverName name of the solver (to name accessors) + * @param[in] faceManager reference to the face manager + * @param[in] elemManager reference to the element region manager + * @param[in] stencilWrapper reference to the boundary stencil wrapper + * @param[in] fluidBase the single phase fluid constitutive model + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( globalIndex const rankOffset, + string const & dofKey, + string const & solverName, + FaceManager const & faceManager, + ElementRegionManager const & elemManager, + BoundaryStencilWrapper const & stencilWrapper, + constitutive::SingleFluidBase & fluidBase, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + constitutiveUpdatePassThru( fluidBase, [&]( auto & fluid ) + { + using FluidType = TYPEOFREF( fluid ); + typename FluidType::KernelWrapper fluidWrapper = fluid.createKernelWrapper(); + + integer constexpr NUM_DOF = 2; + integer constexpr NUM_EQN = 2; + + using kernelType = DirichletFluxComputeKernel< NUM_EQN, NUM_DOF, typename FluidType::KernelWrapper >; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + typename kernelType::SinglePhaseFlowAccessors singlePhaseFlowAccessors( elemManager, solverName ); + typename kernelType::ThermalSinglePhaseFlowAccessors thermalSinglePhaseFlowAccessors( elemManager, solverName ); + typename kernelType::SinglePhaseFluidAccessors singlePhaseFluidAccessors( elemManager, solverName ); + typename kernelType::ThermalSinglePhaseFluidAccessors thermalSinglePhaseFluidAccessors( elemManager, solverName ); + typename kernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); + typename kernelType::ThermalConductivityAccessors thermalConductivityAccessors( elemManager, solverName ); + + kernelType kernel( rankOffset, + faceManager, + stencilWrapper, + fluidWrapper, + dofNumberAccessor, + singlePhaseFlowAccessors, + thermalSinglePhaseFlowAccessors, + singlePhaseFluidAccessors, + thermalSinglePhaseFluidAccessors, + permeabilityAccessors, + thermalConductivityAccessors, + dt, + localMatrix, + localRhs ); + + kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); + } ); + } + +}; + +} // namespace thermalSinglePhaseFVMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALDIRICHLETFLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalFluxComputeKernel.hpp similarity index 52% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalFluxComputeKernel.hpp index ec28bf14e5b..cba7c440e09 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/ThermalSinglePhaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalFluxComputeKernel.hpp @@ -14,33 +14,32 @@ */ /** - * @file ThermalSinglePhaseFVMKernels.hpp + * @file ThermalFluxComputeKernel.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALSINGLEPHASEFVMKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALSINGLEPHASEFVMKERNELS_HPP +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALFLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALFLUXCOMPUTEKERNEL_HPP -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp" #include "constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp" #include "constitutive/thermalConductivity/ThermalConductivityFields.hpp" -#include "constitutive/thermalConductivity/SinglePhaseThermalConductivityFields.hpp" namespace geos { namespace thermalSinglePhaseFVMKernels { -/******************************** FaceBasedAssemblyKernel ********************************/ +/******************************** FluxComputeKernel ********************************/ /** - * @class FaceBasedAssemblyKernel + * @class FluxComputeKernel * @tparam NUM_DOF number of degrees of freedom * @tparam STENCILWRAPPER the type of the stencil wrapper * @brief Define the interface for the assembly kernel in charge of flux terms */ template< integer NUM_EQN, integer NUM_DOF, typename STENCILWRAPPER > -class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER > +class FluxComputeKernel : public singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER > { public: @@ -53,7 +52,7 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK template< typename VIEWTYPE > using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - using AbstractBase = singlePhaseFVMKernels::FaceBasedAssemblyKernelBase; + using AbstractBase = singlePhaseFVMKernels::FluxComputeKernelBase; using DofNumberAccessor = AbstractBase::DofNumberAccessor; using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; @@ -66,7 +65,7 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK using AbstractBase::m_mob; using AbstractBase::m_dens; - using Base = singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; + using Base = singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; using Base::numDof; using Base::numEqn; using Base::maxNumElems; @@ -109,18 +108,18 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK * @param[inout] localMatrix the local CRS matrix * @param[inout] localRhs the local right-hand side vector */ - FaceBasedAssemblyKernel( globalIndex const rankOffset, - STENCILWRAPPER const & stencilWrapper, - DofNumberAccessor const & dofNumberAccessor, - SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, - ThermalSinglePhaseFlowAccessors const & thermalSinglePhaseFlowAccessors, - SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, - ThermalSinglePhaseFluidAccessors const & thermalSinglePhaseFluidAccessors, - PermeabilityAccessors const & permeabilityAccessors, - ThermalConductivityAccessors const & thermalConductivityAccessors, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) + FluxComputeKernel( globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, + ThermalSinglePhaseFlowAccessors const & thermalSinglePhaseFlowAccessors, + SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, + ThermalSinglePhaseFluidAccessors const & thermalSinglePhaseFluidAccessors, + PermeabilityAccessors const & permeabilityAccessors, + ThermalConductivityAccessors const & thermalConductivityAccessors, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) : Base( rankOffset, stencilWrapper, dofNumberAccessor, @@ -433,9 +432,9 @@ class FaceBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyK }; /** - * @class FaceBasedAssemblyKernelFactory + * @class FluxComputeKernelFactory */ -class FaceBasedAssemblyKernelFactory +class FluxComputeKernelFactory { public: @@ -470,7 +469,7 @@ class FaceBasedAssemblyKernelFactory elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - using KernelType = FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; + using KernelType = FluxComputeKernel< NUM_EQN, NUM_DOF, STENCILWRAPPER >; typename KernelType::SinglePhaseFlowAccessors flowAccessors( elemManager, solverName ); typename KernelType::ThermalSinglePhaseFlowAccessors thermalFlowAccessors( elemManager, solverName ); typename KernelType::SinglePhaseFluidAccessors fluidAccessors( elemManager, solverName ); @@ -486,364 +485,8 @@ class FaceBasedAssemblyKernelFactory } }; -/******************************** DirichletFaceBasedAssemblyKernel ********************************/ - -/** - * @class DirichFaceBasedAssemblyKernel - * @tparam FLUIDWRAPPER the type of the fluid wrapper - * @brief Define the interface for the assembly kernel in charge of Dirichlet face flux terms - */ -template< integer NUM_EQN, integer NUM_DOF, typename FLUIDWRAPPER > -class DirichletFaceBasedAssemblyKernel : public singlePhaseFVMKernels::DirichletFaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, FLUIDWRAPPER > -{ -public: - -/** - * @brief The type for element-based data. Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewConstAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - using AbstractBase = singlePhaseFVMKernels::FaceBasedAssemblyKernelBase; - using DofNumberAccessor = AbstractBase::DofNumberAccessor; - using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; - using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; - using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; - - using AbstractBase::m_dt; - using AbstractBase::m_rankOffset; - using AbstractBase::m_dofNumber; - using AbstractBase::m_ghostRank; - using AbstractBase::m_gravCoef; - using AbstractBase::m_mob; - using AbstractBase::m_pres; - using AbstractBase::m_permeability; - using AbstractBase::m_dPerm_dPres; - - using AbstractBase::m_localMatrix; - using AbstractBase::m_localRhs; - - using Base = singlePhaseFVMKernels::DirichletFaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, FLUIDWRAPPER >; - using Base::numDof; - using Base::numEqn; - using Base::m_stencilWrapper; - using Base::m_seri; - using Base::m_sesri; - using Base::m_sei; - using Base::m_facePres; - using Base::m_faceGravCoef; - - using ThermalSinglePhaseFlowAccessors = - StencilAccessors< fields::flow::temperature, - fields::flow::dMobility_dTemperature >; - - using ThermalSinglePhaseFluidAccessors = - StencilMaterialAccessors< constitutive::SingleFluidBase, - fields::singlefluid::dDensity_dTemperature, - fields::singlefluid::enthalpy, - fields::singlefluid::dEnthalpy_dPressure, - fields::singlefluid::dEnthalpy_dTemperature >; - - using ThermalConductivityAccessors = - StencilMaterialAccessors< constitutive::SinglePhaseThermalConductivityBase, - fields::thermalconductivity::effectiveConductivity, - fields::thermalconductivity::dEffectiveConductivity_dT >; - - /** - * @brief Constructor for the kernel interface - * @param[in] rankOffset the offset of the MPI rank - * @param[in] faceManager the face manager - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] fluidWrapper reference to the fluid wrapper - * @param[in] dofNumberAccessor the degree of freedom number accessor - * @param[in] singlePhaseFlowAccessors the single phase flow accessor - * @param[in] thermalSinglePhaseFlowAccessors the thermal single phase flow accessor - * @param[in] singlePhaseFluidAccessors the single phase fluid accessor - * @param[in] thermalSinglePhaseFluidAccessors the thermal single phase fluid accessor - * @param[in] permeabilityAccessors the permeability accessor - * @param[in] thermalConductivityAccessors the thermal conductivity accessor - * @param[in] dt the time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - DirichletFaceBasedAssemblyKernel( globalIndex const rankOffset, - FaceManager const & faceManager, - BoundaryStencilWrapper const & stencilWrapper, - FLUIDWRAPPER const & fluidWrapper, - DofNumberAccessor const & dofNumberAccessor, - SinglePhaseFlowAccessors const & singlePhaseFlowAccessors, - ThermalSinglePhaseFlowAccessors const & thermalSinglePhaseFlowAccessors, - SinglePhaseFluidAccessors const & singlePhaseFluidAccessors, - ThermalSinglePhaseFluidAccessors const & thermalSinglePhaseFluidAccessors, - PermeabilityAccessors const & permeabilityAccessors, - ThermalConductivityAccessors const & thermalConductivityAccessors, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - - : Base( rankOffset, - faceManager, - stencilWrapper, - fluidWrapper, - dofNumberAccessor, - singlePhaseFlowAccessors, - singlePhaseFluidAccessors, - permeabilityAccessors, - dt, - localMatrix, - localRhs ), - m_temp( thermalSinglePhaseFlowAccessors.get( fields::flow::temperature {} ) ), - m_faceTemp( faceManager.getField< fields::flow::faceTemperature >() ), - m_dMob_dTemp( thermalSinglePhaseFlowAccessors.get( fields::flow::dMobility_dTemperature {} ) ), - m_dDens_dTemp( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dDensity_dTemperature {} ) ), - m_enthalpy( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::enthalpy {} ) ), - m_dEnthalpy_dPres( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dEnthalpy_dPressure {} ) ), - m_dEnthalpy_dTemp( thermalSinglePhaseFluidAccessors.get( fields::singlefluid::dEnthalpy_dTemperature {} ) ), - m_thermalConductivity( thermalConductivityAccessors.get( fields::thermalconductivity::effectiveConductivity {} ) ), - m_dThermalCond_dT( thermalConductivityAccessors.get( fields::thermalconductivity::dEffectiveConductivity_dT {} ) ) - {} - - - /** - * @struct StackVariables - * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack - */ - struct StackVariables : Base::StackVariables - { -public: - - /** - * @brief Constructor for the stack variables - * @param[in] size size of the stencil for this connection - * @param[in] numElems number of elements for this connection - */ - GEOS_HOST_DEVICE - StackVariables( localIndex const size, - localIndex numElems ): - Base::StackVariables( size, - numElems ) - {} - - using Base::StackVariables::localFlux; - using Base::StackVariables::localFluxJacobian; - using Base::StackVariables::dofColIndices; - using Base::StackVariables::transmissibility; - - /// Energy fluxes and derivatives wrt pressure and temperature - real64 energyFlux = 0.0; - real64 dEnergyFlux_dP = 0.0; - real64 dEnergyFlux_dT = 0.0; - }; - - /** - * @brief Compute the local Dirichlet face flux contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes - */ - GEOS_HOST_DEVICE - void computeFlux( localIndex const iconn, - StackVariables & stack ) const - { - Base::computeFlux( iconn, stack, [&] ( localIndex const er, - localIndex const esr, - localIndex const ei, - localIndex const kf, - real64 const & f, - real64 const & dF_dP, - real64 const & mobility_up, - real64 const & dMobility_dP_up ) - { - - // Compute the derivatives of the density wrt temperature - - real64 const dDens_dT = 0.5 * m_dDens_dTemp[er][esr][ei][0]; - - // Compute the derivatives of the phase potential difference wrt temperature - - real64 const dF_dT = -stack.transmissibility * dDens_dT * ( m_gravCoef[er][esr][ei] - m_faceGravCoef[kf] ); - - // Compute the (upwinded) energy flux - - real64 const flux = mobility_up * f; - real64 const enthalpy = m_enthalpy[er][esr][ei][0]; - stack.energyFlux += flux * enthalpy; - - // Compute the derivatives of the (upwinded) energy flux wrt pressure and temperature - - if( f >= 0 ) // the element is upstream - { - real64 const dFlux_dP = mobility_up * dF_dP + dMobility_dP_up * f; - real64 const dFlux_dT = mobility_up * dF_dT + m_dMob_dTemp[er][esr][ei] * f; - - stack.dEnergyFlux_dP += dFlux_dP * enthalpy + flux * m_dEnthalpy_dPres[er][esr][ei][0]; - stack.dEnergyFlux_dT += dFlux_dT * enthalpy + flux * m_dEnthalpy_dTemp[er][esr][ei][0]; - } - else - { - real64 const dFlux_dP = mobility_up * dF_dP; - real64 const dFlux_dT = mobility_up * dF_dT; - - stack.dEnergyFlux_dP += dFlux_dP * enthalpy; - stack.dEnergyFlux_dT += dFlux_dT * enthalpy; - } - - // Contribution of energy conduction through the solid phase - real64 thermalTrans = 0.0; - real64 dThermalTrans_dThermalCond[3]{}; - m_stencilWrapper.computeWeights( iconn, - m_thermalConductivity, - thermalTrans, - dThermalTrans_dThermalCond ); - - real64 const dThermalTrans_dT = LvArray::tensorOps::AiBi< 3 >( dThermalTrans_dThermalCond, m_dThermalCond_dT[er][esr][ei][0] ); - - real64 const deltaT = m_temp[er][esr][ei] - m_faceTemp[kf]; - stack.energyFlux += thermalTrans * deltaT; - stack.dEnergyFlux_dT += thermalTrans + dThermalTrans_dT * deltaT; - - // Add energyFlux and its derivatives to localFlux and localFluxJacobian - integer const localRowIndexEnergy = numEqn - 1; - stack.localFlux[localRowIndexEnergy] = m_dt * stack.energyFlux; - - stack.localFluxJacobian[localRowIndexEnergy][0] = m_dt * stack.dEnergyFlux_dP; - stack.localFluxJacobian[localRowIndexEnergy][numDof-1] = m_dt * stack.dEnergyFlux_dT; - } ); - - } - - /** - * @brief Performs the complete phase for the kernel. - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void complete( localIndex const iconn, - StackVariables & stack ) const - { - Base::complete( iconn, stack, [&] ( localIndex const localRow ) - { - RAJA::atomicAdd( parallelDeviceAtomic{}, &AbstractBase::m_localRhs[localRow + numEqn - 1], stack.localFlux[numEqn-1] ); - - AbstractBase::m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > - ( localRow + numEqn - 1, - stack.dofColIndices, - stack.localFluxJacobian[numEqn-1], - numDof ); - } ); - } - -protected: - - /// Views on temperature - ElementViewConst< arrayView1d< real64 const > > const m_temp; - - /// Views on face temperature - arrayView1d< real64 const > const m_faceTemp; - - /// Views on derivatives of fluid mobilities - ElementViewConst< arrayView1d< real64 const > > const m_dMob_dTemp; - - /// Views on derivatives of fluid densities - ElementViewConst< arrayView2d< real64 const > > const m_dDens_dTemp; - - /// Views on enthalpies - ElementViewConst< arrayView2d< real64 const > > const m_enthalpy; - ElementViewConst< arrayView2d< real64 const > > const m_dEnthalpy_dPres; - ElementViewConst< arrayView2d< real64 const > > const m_dEnthalpy_dTemp; - - /// View on thermal conductivity - ElementViewConst< arrayView3d< real64 const > > m_thermalConductivity; - - /// View on derivatives of thermal conductivity w.r.t. temperature - ElementViewConst< arrayView3d< real64 const > > m_dThermalCond_dT; - -}; - - -/** - * @class DirichletFaceBasedAssemblyKernelFactory - */ -class DirichletFaceBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey string to get the element degrees of freedom numbers - * @param[in] solverName name of the solver (to name accessors) - * @param[in] faceManager reference to the face manager - * @param[in] elemManager reference to the element region manager - * @param[in] stencilWrapper reference to the boundary stencil wrapper - * @param[in] fluidBase the single phase fluid constitutive model - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY > - static void - createAndLaunch( globalIndex const rankOffset, - string const & dofKey, - string const & solverName, - FaceManager const & faceManager, - ElementRegionManager const & elemManager, - BoundaryStencilWrapper const & stencilWrapper, - constitutive::SingleFluidBase & fluidBase, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - constitutiveUpdatePassThru( fluidBase, [&]( auto & fluid ) - { - using FluidType = TYPEOFREF( fluid ); - typename FluidType::KernelWrapper fluidWrapper = fluid.createKernelWrapper(); - - integer constexpr NUM_DOF = 2; - integer constexpr NUM_EQN = 2; - - using kernelType = DirichletFaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, typename FluidType::KernelWrapper >; - - ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = - elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); - - dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - - typename kernelType::SinglePhaseFlowAccessors singlePhaseFlowAccessors( elemManager, solverName ); - typename kernelType::ThermalSinglePhaseFlowAccessors thermalSinglePhaseFlowAccessors( elemManager, solverName ); - typename kernelType::SinglePhaseFluidAccessors singlePhaseFluidAccessors( elemManager, solverName ); - typename kernelType::ThermalSinglePhaseFluidAccessors thermalSinglePhaseFluidAccessors( elemManager, solverName ); - typename kernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); - typename kernelType::ThermalConductivityAccessors thermalConductivityAccessors( elemManager, solverName ); - - kernelType kernel( rankOffset, - faceManager, - stencilWrapper, - fluidWrapper, - dofNumberAccessor, - singlePhaseFlowAccessors, - thermalSinglePhaseFlowAccessors, - singlePhaseFluidAccessors, - thermalSinglePhaseFluidAccessors, - permeabilityAccessors, - thermalConductivityAccessors, - dt, - localMatrix, - localRhs ); - - kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); - } ); - } - -}; - } // namespace thermalSinglePhaseFVMKernels } // namespace geos -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALSINGLEPHASEFVMKERNELS_HPP +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_THERMALFLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantBaseKernels.hpp similarity index 90% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantBaseKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantBaseKernels.hpp index 6f3395bad2e..9e36375b45c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantBaseKernels.hpp @@ -16,8 +16,8 @@ /** * @file SinglePhaseProppantBaseKernels.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEPROPPANTBASEKERNELS_HPP_ -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEPROPPANTBASEKERNELS_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_PROPPANTBASEKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_PROPPANTBASEKERNELS_HPP_ #include "common/DataTypes.hpp" #include "common/GEOS_RAJA_Interface.hpp" @@ -61,4 +61,4 @@ struct FluidUpdateKernel } //namespace geos -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASEPROPPANTBASEKERNELS_HPP_ +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_SINGLEPHASE_PROPPANTBASEKERNELS_HPP_ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.cpp similarity index 98% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.cpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.cpp index 193fc117989..22dec62d10f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.cpp @@ -14,12 +14,12 @@ */ /** - * @file singlePhaseProppantFluxKernels.cpp + * @file ProppantFluxKernels.cpp */ -#include "SinglePhaseProppantFluxKernels.hpp" +#include "ProppantFluxKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp" namespace geos { @@ -27,7 +27,7 @@ namespace geos namespace singlePhaseProppantFluxKernels { -using namespace fluxKernelsHelper; +using namespace singlePhaseFluxKernelsHelper; void FaceElementFluxKernel:: diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.hpp similarity index 100% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/SinglePhaseProppantFluxKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.hpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 14e891c87ae..40257ddf2fd 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -42,8 +42,9 @@ #include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/kernels/PerforationFluxKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/ThermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" #if defined( __INTEL_COMPILER ) #pragma GCC optimize "O0" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index 9834ceb56ee..4671f593665 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -36,6 +36,8 @@ #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluidUpdateKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp" #include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" namespace geos @@ -312,7 +314,7 @@ void SinglePhaseWell::updateFluidModel( WellElementSubRegion & subRegion ) const constitutiveUpdatePassThru( fluid, [&]( auto & castedFluid ) { typename TYPEOFREF( castedFluid ) ::KernelWrapper fluidWrapper = castedFluid.createKernelWrapper(); - thermalSinglePhaseBaseKernels::FluidUpdateKernel::launch( fluidWrapper, pres, temp ); + singlePhaseBaseKernels::FluidUpdateKernel::launch( fluidWrapper, pres, temp ); } ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp index 422d4d2f75c..c82ea94e590 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp @@ -33,7 +33,7 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 545d55cfec2..d3322e839ff 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -21,6 +21,7 @@ #include "constitutive/contact/HydraulicApertureRelationSelector.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" +#include "constitutive/fluid/singlefluid/SingleFluidFields.hpp" #include "physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" #include "physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp" @@ -29,7 +30,7 @@ #include "physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp" #include "dataRepository/LogLevelsInfo.hpp" #include "mesh/MeshFields.hpp" -#include "constitutive/fluid/singlefluid/SingleFluidFields.hpp" +#include "finiteVolume/FluxApproximationBase.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index aaa5864dd0d..4d1e0114728 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -219,37 +219,6 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementBa this->solidMechanicsSolver()->getMaxForce() = LvArray::math::max( mechanicsMaxForce, poromechanicsMaxForce ); } -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateState( DomainPartition & domain ) -{ - GEOS_MARK_FUNCTION; - - real64 maxDeltaPhaseVolFrac = 0.0; - this->template forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) - { - ElementRegionManager & elemManager = mesh.getElemManager(); - elemManager.forElementSubRegions< CellElementSubRegion >( regionNames, - [&]( localIndex const, - CellElementSubRegion & subRegion ) - { - real64 const deltaPhaseVolFrac = this->flowSolver()->updateFluidState( subRegion ); - maxDeltaPhaseVolFrac = LvArray::math::max( maxDeltaPhaseVolFrac, deltaPhaseVolFrac ); - if( this->m_isThermal ) - { - this->flowSolver()->updateSolidInternalEnergyModel( subRegion ); - } - } ); - } ); - - maxDeltaPhaseVolFrac = MpiWrapper::max( maxDeltaPhaseVolFrac ); - - GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, - GEOS_FMT( " {}: Max phase volume fraction change = {}", - this->getName(), GEOS_FMT( "{:.{}f}", maxDeltaPhaseVolFrac, 4 ) ) ); -} - template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostInitialConditionsPreSubGroups() { diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index 7cce059248a..9251d86dac1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -101,8 +101,6 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANI CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ); - virtual void updateState( DomainPartition & domain ) override; - /**@}*/ protected: diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 53dee4f6bab..46233badae0 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -291,31 +291,6 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::createPreconditi } } -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateState( DomainPartition & domain ) -{ - GEOS_MARK_FUNCTION; - - this->template forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) - { - - ElementRegionManager & elemManager = mesh.getElemManager(); - - elemManager.forElementSubRegions< CellElementSubRegion >( regionNames, - [&]( localIndex const, - CellElementSubRegion & subRegion ) - { - this->flowSolver()->updateFluidState( subRegion ); - if( this->m_isThermal ) - { - this->flowSolver()->updateSolidInternalEnergyModel( subRegion ); - } - } ); - } ); -} - template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateBulkDensity( ElementSubRegionBase & subRegion ) { diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index dd9110fb79b..f311b786c38 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -107,8 +107,6 @@ class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHAN CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs ); - virtual void updateState( DomainPartition & domain ) override; - /**@}*/ struct viewKeyStruct : Base::viewKeyStruct diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 48deed2cf6a..77bbc8fdeab 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -22,15 +22,16 @@ #include "dataRepository/LogLevelsInfo.hpp" #include "constitutive/solid/PorousSolid.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" +#include "constitutive/contact/HydraulicApertureRelationSelector.hpp" #include "linearAlgebra/solvers/BlockPreconditioner.hpp" #include "linearAlgebra/solvers/SeparateComponentPreconditioner.hpp" -#include "constitutive/contact/HydraulicApertureRelationSelector.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" +#include "finiteVolume/FluxApproximationBase.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 41541b5c375..67aa66cb051 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -28,6 +28,7 @@ #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" +#include "finiteVolume/FluxApproximationBase.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp index 84e68734d4a..5befe3e9aa7 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp @@ -20,8 +20,8 @@ #ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_SINGLEPHASEPOROMECHANICSCONFORMINGFRACTURES_HPP #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_SINGLEPHASEPOROMECHANICSCONFORMINGFRACTURES_HPP -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp" #include "codingUtilities/Utilities.hpp" namespace geos @@ -31,7 +31,7 @@ namespace singlePhasePoromechanicsConformingFracturesKernels { template< integer NUM_EQN, integer NUM_DOF > -class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper > +class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper > { public: @@ -44,7 +44,7 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse template< typename VIEWTYPE > using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - using AbstractBase = singlePhaseFVMKernels::FaceBasedAssemblyKernelBase; + using AbstractBase = singlePhaseFVMKernels::FluxComputeKernelBase; using DofNumberAccessor = AbstractBase::DofNumberAccessor; using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; @@ -64,7 +64,7 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse using AbstractBase::m_dens; using AbstractBase::m_dDens_dPres; - using Base = singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper >; + using Base = singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper >; using Base::numDof; using Base::numEqn; using Base::maxNumElems; @@ -191,21 +191,21 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse 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]]}; - 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 ); + singlePhaseFluxKernelsHelper::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]* numDof] += m_dt * fluxVal; diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp index 5092012e423..654ee0b3594 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -20,8 +20,8 @@ #ifndef GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_SINGLEPHASEPOROMECHANICSEMBEDDEDFRACTURES_HPP #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_SINGLEPHASEPOROMECHANICSEMBEDDEDFRACTURES_HPP -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/FluxKernelsHelper.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp" #include "codingUtilities/Utilities.hpp" namespace geos @@ -31,7 +31,7 @@ namespace singlePhasePoromechanicsEmbeddedFracturesKernels { template< integer NUM_EQN, integer NUM_DOF > -class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper > +class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper > { public: @@ -44,7 +44,7 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse template< typename VIEWTYPE > using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - using AbstractBase = singlePhaseFVMKernels::FaceBasedAssemblyKernelBase; + using AbstractBase = singlePhaseFVMKernels::FluxComputeKernelBase; using DofNumberAccessor = AbstractBase::DofNumberAccessor; using SinglePhaseFlowAccessors = AbstractBase::SinglePhaseFlowAccessors; using SinglePhaseFluidAccessors = AbstractBase::SinglePhaseFluidAccessors; @@ -63,7 +63,7 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse using AbstractBase::m_dens; using AbstractBase::m_dDens_dPres; - using Base = singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper >; + using Base = singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper >; using Base::numDof; using Base::numEqn; using Base::maxNumElems; @@ -181,21 +181,21 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FaceBasedAsse real64 mobility = 0.0; real64 potGrad = 0.0; - 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 ); + singlePhaseFluxKernelsHelper::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 ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp index 0621ec04d46..e82a918fa09 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp @@ -21,6 +21,7 @@ #define GEOS_PHYSICSSOLVERS_MULTIPHYSICS_POROMECHANICSKERNELS_THERMALSINGLEPHASEPOROMECHANICSCONFORMINGFRACTURES_HPP #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernelBase.hpp" namespace geos { @@ -42,7 +43,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsConformingFr template< typename VIEWTYPE > using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - using SinglePhaseFVMAbstractBase = singlePhaseFVMKernels::FaceBasedAssemblyKernelBase; + using SinglePhaseFVMAbstractBase = singlePhaseFVMKernels::FluxComputeKernelBase; using DofNumberAccessor = SinglePhaseFVMAbstractBase::DofNumberAccessor; using SinglePhaseFlowAccessors = SinglePhaseFVMAbstractBase::SinglePhaseFlowAccessors; using SinglePhaseFluidAccessors = SinglePhaseFVMAbstractBase::SinglePhaseFluidAccessors; @@ -56,7 +57,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsConformingFr using SinglePhaseFVMAbstractBase::m_mob; using SinglePhaseFVMAbstractBase::m_dens; - using SinglePhaseFVMBase = singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper >; + using SinglePhaseFVMBase = singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper >; using SinglePhaseFVMBase::numDof; using SinglePhaseFVMBase::numEqn; using SinglePhaseFVMBase::maxNumElems; @@ -205,25 +206,25 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsConformingFr real64 trans[2] = {stack.transmissibility[0][0], stack.transmissibility[0][1]}; real64 dMassFlux_dT[2]{}; - fluxKernelsHelper::computeEnthalpyFlux( seri, sesri, sei, - trans, - m_enthalpy, - m_dEnthalpy_dPres, - m_dEnthalpy_dTemp, - m_gravCoef, - m_dDens_dTemp, - m_dMob_dTemp, - alpha, - mobility, - potGrad, - massFlux, - dMassFlux_dTrans, - dMassFlux_dP, - dMassFlux_dT, - stack.energyFlux, - stack.dEnergyFlux_dTrans, - stack.dEnergyFlux_dP, - stack.dEnergyFlux_dT ); + singlePhaseFluxKernelsHelper::computeEnthalpyFlux( seri, sesri, sei, + trans, + m_enthalpy, + m_dEnthalpy_dPres, + m_dEnthalpy_dTemp, + m_gravCoef, + m_dDens_dTemp, + m_dMob_dTemp, + alpha, + mobility, + potGrad, + massFlux, + dMassFlux_dTrans, + dMassFlux_dP, + dMassFlux_dT, + stack.energyFlux, + stack.dEnergyFlux_dTrans, + stack.dEnergyFlux_dP, + stack.dEnergyFlux_dT ); // add dMassFlux_dT to localFluxJacobian for( integer ke = 0; ke < 2; ++ke ) @@ -260,7 +261,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsConformingFr localIndex const sei[2] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; // Step 2: compute temperature difference at the interface - fluxKernelsHelper::computeConductiveFlux( seri, sesri, sei, m_temp, thermalTrans, stack.energyFlux, stack.dEnergyFlux_dT ); + singlePhaseFluxKernelsHelper::computeConductiveFlux( seri, sesri, sei, m_temp, thermalTrans, stack.energyFlux, stack.dEnergyFlux_dT ); // add energyFlux and its derivatives to localFlux and localFluxJacobian stack.localFlux[k[0]*numEqn + numEqn - 1] += m_dt * stack.energyFlux; diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp index d62a283e364..1b39b1b44cb 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp @@ -42,7 +42,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsEmbeddedFrac template< typename VIEWTYPE > using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - using SinglePhaseFVMAbstractBase = singlePhaseFVMKernels::FaceBasedAssemblyKernelBase; + using SinglePhaseFVMAbstractBase = singlePhaseFVMKernels::FluxComputeKernelBase; using DofNumberAccessor = SinglePhaseFVMAbstractBase::DofNumberAccessor; using SinglePhaseFlowAccessors = SinglePhaseFVMAbstractBase::SinglePhaseFlowAccessors; using SinglePhaseFluidAccessors = SinglePhaseFVMAbstractBase::SinglePhaseFluidAccessors; @@ -56,7 +56,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsEmbeddedFrac using SinglePhaseFVMAbstractBase::m_mob; using SinglePhaseFVMAbstractBase::m_dens; - using SinglePhaseFVMBase = singlePhaseFVMKernels::FaceBasedAssemblyKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper >; + using SinglePhaseFVMBase = singlePhaseFVMKernels::FluxComputeKernel< NUM_EQN, NUM_DOF, SurfaceElementStencilWrapper >; using SinglePhaseFVMBase::numDof; using SinglePhaseFVMBase::numEqn; using SinglePhaseFVMBase::maxNumElems; @@ -204,25 +204,25 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsEmbeddedFrac real64 trans[2] = {stack.transmissibility[0][0], stack.transmissibility[0][1]}; real64 dMassFlux_dT[2]{}; - fluxKernelsHelper::computeEnthalpyFlux( seri, sesri, sei, - trans, - m_enthalpy, - m_dEnthalpy_dPres, - m_dEnthalpy_dTemp, - m_gravCoef, - m_dDens_dTemp, - m_dMob_dTemp, - alpha, - mobility, - potGrad, - massFlux, - dMassFlux_dTrans, - dMassFlux_dP, - dMassFlux_dT, - stack.energyFlux, - stack.dEnergyFlux_dTrans, - stack.dEnergyFlux_dP, - stack.dEnergyFlux_dT ); + singlePhaseFluxKernelsHelper::computeEnthalpyFlux( seri, sesri, sei, + trans, + m_enthalpy, + m_dEnthalpy_dPres, + m_dEnthalpy_dTemp, + m_gravCoef, + m_dDens_dTemp, + m_dMob_dTemp, + alpha, + mobility, + potGrad, + massFlux, + dMassFlux_dTrans, + dMassFlux_dP, + dMassFlux_dT, + stack.energyFlux, + stack.dEnergyFlux_dTrans, + stack.dEnergyFlux_dP, + stack.dEnergyFlux_dT ); for( localIndex i=0; i < 3; i++ ) { @@ -271,7 +271,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsEmbeddedFrac localIndex const sei[2] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; // Step 2: compute temperature difference at the interface - fluxKernelsHelper::computeConductiveFlux( seri, sesri, sei, m_temp, thermalTrans, stack.energyFlux, stack.dEnergyFlux_dT ); + singlePhaseFluxKernelsHelper::computeConductiveFlux( seri, sesri, sei, m_temp, thermalTrans, stack.energyFlux, stack.dEnergyFlux_dT ); // add energyFlux and its derivatives to localFlux and localFluxJacobian stack.localFlux[k[0]*numEqn + numEqn - 1] += m_dt * stack.energyFlux; diff --git a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt index c21190560cf..800fae6f0db 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/fluidFlowTests/CMakeLists.txt @@ -1,6 +1,6 @@ # Specify list of tests set( gtest_geosx_tests - testSinglePhaseBaseKernels.cpp + testSinglePhaseMobilityKernel.cpp testThermalCompMultiphaseFlow.cpp testThermalSinglePhaseFlow.cpp testFlowStatistics.cpp diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseMobilityKernel.cpp similarity index 96% rename from src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp rename to src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseMobilityKernel.cpp index cb4c3c98944..b48cb9d4cf8 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseMobilityKernel.cpp @@ -15,7 +15,7 @@ // Source includes #include "mainInterface/initialization.hpp" -#include "physicsSolvers/fluidFlow/kernels/SinglePhaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp" // TPL includes #include From c70e8c0054043a123a4ff50dc431b82fe0623165 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Sun, 10 Nov 2024 07:47:56 -0800 Subject: [PATCH 243/286] fix changed file path in docs (#3435) --- src/docs/sphinx/developerGuide/Contributing/UnitTests.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/docs/sphinx/developerGuide/Contributing/UnitTests.rst b/src/docs/sphinx/developerGuide/Contributing/UnitTests.rst index 4d8c48baf17..45712596faa 100644 --- a/src/docs/sphinx/developerGuide/Contributing/UnitTests.rst +++ b/src/docs/sphinx/developerGuide/Contributing/UnitTests.rst @@ -11,12 +11,12 @@ GEOS Specific Recommendations An informative example is ``testSinglePhaseBaseKernels`` which tests the single phase flow mobility and accumulation kernels on a variety of inputs. -.. literalinclude:: ../../../../coreComponents/unitTests/fluidFlowTests/testSinglePhaseBaseKernels.cpp +.. literalinclude:: ../../../../coreComponents/unitTests/fluidFlowTests/testSinglePhaseMobilityKernel.cpp :language: c++ :start-after: // Sphinx start after test mobility :end-before: // Sphinx end before test mobility -*[Source: coreComponents/physicsSolvers/fluidFlow/unitTests/testSinglePhaseBaseKernels.cpp]* +*[Source: coreComponents/physicsSolvers/fluidFlow/unitTests/testSinglePhaseMobilityKernel.cpp]* What makes this such a good test is that it depends on very little other than kernels themselves. There is no need to involve the data repository or parse an XML file. Sometimes however this is not possible, or at least not without a significant duplication of code. In this case it is better to embed the XML file into the test source as a string instead of creating a separate XML file and passing it to the test as a command line argument or hard coding the path. One example of this is ``testLaplaceFEM`` which tests the laplacian solver. The embedded XML is shown below. From 3b0d90740a1c4c4e5ddd2062542988d4aee049ca Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Sun, 10 Nov 2024 18:46:26 -0600 Subject: [PATCH 244/286] fix: Compositional flow kernels - split into separate files, bugfix for gravity treatment in flux for thermal (#3374) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../fluid/multifluid/MultiFluidSelector.hpp | 2 +- .../physicsSolvers/fluidFlow/CMakeLists.txt | 50 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 22 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 47 +- .../CompositionalMultiphaseHybridFVM.cpp | 7 +- .../CompositionalMultiphaseStatistics.cpp | 8 +- .../ReactiveCompositionalMultiphaseOBL.cpp | 2 +- .../compositional/AccumulationKernel.hpp | 510 ++++ .../kernels/compositional/AquiferBCKernel.cpp | 268 ++ .../kernels/compositional/AquiferBCKernel.hpp | 131 + .../kernels/compositional/C1PPUPhaseFlux.hpp | 228 ++ ...MultiphaseFVMKernels.cpp => CFLKernel.cpp} | 270 +- .../kernels/compositional/CFLKernel.hpp | 184 ++ .../CapillaryPressureUpdateKernel.hpp | 73 + ...ompositionalMultiphaseHybridFVMKernels.hpp | 5 +- .../DiffusionDispersionFluxComputeKernel.hpp | 775 +++++ .../DirichletFluxComputeKernel.hpp | 558 ++++ ...s.hpp => DissipationFluxComputeKernel.hpp} | 73 +- .../compositional/FluidUpdateKernel.hpp | 77 + .../compositional/FluxComputeKernel.hpp | 575 ++++ .../compositional/FluxComputeKernelBase.cpp | 65 + .../compositional/FluxComputeKernelBase.hpp | 181 ++ .../GlobalComponentFractionKernel.hpp | 144 + .../HydrostaticPressureKernel.hpp | 356 +++ ...VMKernelUtilities.hpp => IHUPhaseFlux.hpp} | 569 +--- ...rmalCompositionalMultiphaseBaseKernels.hpp | 2508 ----------------- ...ermalCompositionalMultiphaseFVMKernels.hpp | 2388 ---------------- .../compositional/KernelLaunchSelectors.hpp | 159 ++ .../kernels/compositional/PPUPhaseFlux.hpp | 162 ++ .../compositional/PhaseComponentFlux.hpp | 128 + .../compositional/PhaseMobilityKernel.hpp | 241 ++ .../PhaseVolumeFractionKernel.hpp | 256 ++ .../kernels/compositional/PotGrad.hpp | 208 ++ .../compositional/PropertyKernelBase.hpp | 91 + ...ctiveCompositionalMultiphaseOBLKernels.hpp | 68 +- .../RelativePermeabilityUpdateKernel.hpp | 73 + .../compositional/ResidualNormKernel.hpp | 191 ++ .../SolidInternalEnergyUpdateKernel.hpp | 55 + .../compositional/SolutionCheckKernel.hpp | 334 +++ .../SolutionScalingAndCheckingKernelBase.hpp | 182 ++ .../compositional/SolutionScalingKernel.hpp | 383 +++ ...ls.hpp => StabilizedFluxComputeKernel.hpp} | 64 +- .../compositional/StatisticsKernel.hpp | 194 ++ .../ThermalAccumulationKernel.hpp | 345 +++ ...rmalCompositionalMultiphaseBaseKernels.hpp | 1062 ------- ...ermalCompositionalMultiphaseFVMKernels.hpp | 1444 ---------- ...alDiffusionDispersionFluxComputeKernel.hpp | 352 +++ .../ThermalDirichletFluxComputeKernel.hpp | 484 ++++ .../ThermalFluxComputeKernel.hpp | 572 ++++ .../ThermalPhaseMobilityKernel.hpp | 154 + .../ThermalPhaseVolumeFractionKernel.hpp | 140 + .../ThermalResidualNormKernel.hpp | 241 ++ .../ThermalSolutionCheckKernel.hpp | 181 ++ .../ThermalSolutionScalingKernel.hpp | 226 ++ .../wells/CompositionalMultiphaseWell.cpp | 17 +- .../CompositionalMultiphaseWellKernels.hpp | 37 +- ...rmalCompositionalMultiphaseWellKernels.hpp | 12 +- .../CoupledReservoirAndWellKernels.hpp | 14 +- ...ePhasePoromechanicsConformingFractures.hpp | 2 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 2 +- ...ePhasePoromechanicsConformingFractures.hpp | 2 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 2 +- 64 files changed, 9742 insertions(+), 8418 deletions(-) create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.cpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp rename src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/{IsothermalCompositionalMultiphaseFVMKernels.cpp => CFLKernel.cpp} (58%) create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CapillaryPressureUpdateKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp rename src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/{DissipationCompositionalMultiphaseFVMKernels.hpp => DissipationFluxComputeKernel.hpp} (86%) create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluidUpdateKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.cpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/HydrostaticPressureKernel.hpp rename src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/{IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp => IHUPhaseFlux.hpp} (82%) delete mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp delete mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/RelativePermeabilityUpdateKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolidInternalEnergyUpdateKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp rename src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/{StabilizedCompositionalMultiphaseFVMKernels.hpp => StabilizedFluxComputeKernel.hpp} (86%) create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StatisticsKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp delete mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp delete mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseFVMKernels.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDiffusionDispersionFluxComputeKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDirichletFluxComputeKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseVolumeFractionKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalResidualNormKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionCheckKernel.hpp create mode 100644 src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 733e3a80147..71364ebb802 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3372-8610-4b9a7b3 + baseline: integratedTests/baseline_integratedTests-pr3374-8621-bbb3cb2 allow_fail: all: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index d9bc0a2e825..3af18f0dec8 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3374 (2024-11-09) +==================== +Bugfix for gravity treatment in flux for thermal. + PR #3372 (2024-11-09) ==================== Fix a bug related to mass and energy updates for poromechanics. diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index 7d54ed3e3c4..580a965061b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -14,7 +14,7 @@ */ /** - * @file multiFluidSelector.hpp + * @file MultiFluidSelector.hpp */ #ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUIDSELECTOR_HPP_ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUIDSELECTOR_HPP_ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt index 46712916a82..651d9135e08 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/fluidFlow/CMakeLists.txt @@ -45,14 +45,48 @@ set( physicsSolvers_headers fluidFlow/kernels/singlePhase/ThermalFluxComputeKernel.hpp fluidFlow/kernels/singlePhase/proppant/ProppantBaseKernels.hpp fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.hpp - fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp - fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp - fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp - fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp - fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseFVMKernels.hpp + fluidFlow/kernels/compositional/AccumulationKernel.hpp + fluidFlow/kernels/compositional/AquiferBCKernel.hpp + fluidFlow/kernels/compositional/PPUPhaseFlux.hpp + fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp + fluidFlow/kernels/compositional/CapillaryPressureUpdateKernel.hpp + fluidFlow/kernels/compositional/CFLKernel.hpp fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp + fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp + fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp + fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp + fluidFlow/kernels/compositional/FluidUpdateKernel.hpp + fluidFlow/kernels/compositional/FluidUpdateKernel.hpp + fluidFlow/kernels/compositional/FluxComputeKernel.hpp + fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp + fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp + fluidFlow/kernels/compositional/HydrostaticPressureKernel.hpp + fluidFlow/kernels/compositional/IHUPhaseFlux.hpp + fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp + fluidFlow/kernels/compositional/PhaseComponentFlux.hpp + fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp + fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp + fluidFlow/kernels/compositional/PotGrad.hpp + fluidFlow/kernels/compositional/PPUPhaseFlux.hpp + fluidFlow/kernels/compositional/PropertyKernelBase.hpp fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp - fluidFlow/kernels/compositional/StabilizedCompositionalMultiphaseFVMKernels.hpp + fluidFlow/kernels/compositional/RelativePermeabilityUpdateKernel.hpp + fluidFlow/kernels/compositional/ResidualNormKernel.hpp + fluidFlow/kernels/compositional/SolidInternalEnergyUpdateKernel.hpp + fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp + fluidFlow/kernels/compositional/SolutionCheckKernel.hpp + fluidFlow/kernels/compositional/SolutionScalingKernel.hpp + fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp + fluidFlow/kernels/compositional/StatisticsKernel.hpp + fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp + fluidFlow/kernels/compositional/ThermalDiffusionDispersionFluxComputeKernel.hpp + fluidFlow/kernels/compositional/ThermalDirichletFluxComputeKernel.hpp + fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp + fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp + fluidFlow/kernels/compositional/ThermalPhaseVolumeFractionKernel.hpp + fluidFlow/kernels/compositional/ThermalResidualNormKernel.hpp + fluidFlow/kernels/compositional/ThermalSolutionCheckKernel.hpp + fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp fluidFlow/wells/CompositionalMultiphaseWell.hpp fluidFlow/wells/CompositionalMultiphaseWellFields.hpp fluidFlow/wells/SinglePhaseWell.hpp @@ -86,7 +120,9 @@ set( physicsSolvers_sources fluidFlow/SourceFluxStatistics.cpp fluidFlow/StencilDataCollection.cpp fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.cpp - fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.cpp + fluidFlow/kernels/compositional/AquiferBCKernel.cpp + fluidFlow/kernels/compositional/CFLKernel.cpp + fluidFlow/kernels/compositional/FluxComputeKernelBase.cpp fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.cpp fluidFlow/wells/CompositionalMultiphaseWell.cpp fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 62097a5b9ea..08e7176fdbe 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -36,14 +36,24 @@ #include "fieldSpecification/AquiferBoundaryCondition.hpp" #include "fieldSpecification/EquilibriumInitialCondition.hpp" #include "fieldSpecification/SourceFluxBoundaryCondition.hpp" -#include "physicsSolvers/fluidFlow/SourceFluxStatistics.hpp" +#include "finiteVolume/FluxApproximationBase.hpp" #include "mesh/DomainPartition.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp" // TODO this should not be here -#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/SourceFluxStatistics.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseVolumeFractionKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/FluidUpdateKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/RelativePermeabilityUpdateKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/CapillaryPressureUpdateKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/SolidInternalEnergyUpdateKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/HydrostaticPressureKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/StatisticsKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp" #if defined( __INTEL_COMPILER ) #pragma GCC optimize "O0" @@ -1410,7 +1420,7 @@ void CompositionalMultiphaseBase::assembleAccumulationAndVolumeBalanceTerms( Dom if( m_isThermal ) { thermalCompositionalMultiphaseBaseKernels:: - ElementBasedAssemblyKernelFactory:: + AccumulationKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, dofManager.rankOffset(), @@ -1425,7 +1435,7 @@ void CompositionalMultiphaseBase::assembleAccumulationAndVolumeBalanceTerms( Dom else { isothermalCompositionalMultiphaseBaseKernels:: - ElementBasedAssemblyKernelFactory:: + AccumulationKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, dofManager.rankOffset(), diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 7c640319397..784c7810169 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -36,12 +36,25 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/StabilizedCompositionalMultiphaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/DissipationCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalResidualNormKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionCheckKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalDiffusionDispersionFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalDirichletFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.hpp" namespace geos { @@ -171,7 +184,7 @@ void CompositionalMultiphaseFVM::assembleFluxTerms( real64 const dt, if( m_isThermal ) { thermalCompositionalMultiphaseFVMKernels:: - FaceBasedAssemblyKernelFactory:: + FluxComputeKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, dofManager.rankOffset(), @@ -190,7 +203,7 @@ void CompositionalMultiphaseFVM::assembleFluxTerms( real64 const dt, if( m_dbcParams.useDBC ) { dissipationCompositionalMultiphaseFVMKernels:: - FaceBasedAssemblyKernelFactory:: + FluxComputeKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, dofManager.rankOffset(), @@ -213,7 +226,7 @@ void CompositionalMultiphaseFVM::assembleFluxTerms( real64 const dt, else { isothermalCompositionalMultiphaseFVMKernels:: - FaceBasedAssemblyKernelFactory:: + FluxComputeKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, dofManager.rankOffset(), @@ -237,7 +250,7 @@ void CompositionalMultiphaseFVM::assembleFluxTerms( real64 const dt, if( m_isThermal ) { thermalCompositionalMultiphaseFVMKernels:: - DiffusionDispersionFaceBasedAssemblyKernelFactory:: + DiffusionDispersionFluxComputeKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, dofManager.rankOffset(), @@ -255,7 +268,7 @@ void CompositionalMultiphaseFVM::assembleFluxTerms( real64 const dt, else { isothermalCompositionalMultiphaseFVMKernels:: - DiffusionDispersionFaceBasedAssemblyKernelFactory:: + DiffusionDispersionFluxComputeKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, dofManager.rankOffset(), @@ -304,7 +317,7 @@ void CompositionalMultiphaseFVM::assembleStabilizedFluxTerms( real64 const dt, // Thermal implementation not supported yet stabilizedCompositionalMultiphaseFVMKernels:: - FaceBasedAssemblyKernelFactory:: + FluxComputeKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, dofManager.rankOffset(), @@ -499,7 +512,7 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d auto const subRegionData = m_isThermal ? thermalCompositionalMultiphaseBaseKernels:: - ScalingForSystemSolutionKernelFactory:: + SolutionScalingKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxRelativeTempChange, @@ -518,7 +531,7 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d localSolution, temperatureOffset ) : isothermalCompositionalMultiphaseBaseKernels:: - ScalingForSystemSolutionKernelFactory:: + SolutionScalingKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxCompFracChange, @@ -638,10 +651,8 @@ bool CompositionalMultiphaseFVM::checkSystemSolution( DomainPartition & domain, m_scalingType, scalingFactor, pressure, - compDens, pressureScalingFactor, - compDensScalingFactor, dofManager.rankOffset(), m_numComponents, @@ -1025,7 +1036,7 @@ void CompositionalMultiphaseFVM::applyFaceDirichletBC( real64 const time_n, { //todo (jafranc) extend upwindScheme name if satisfied in isothermalCase thermalCompositionalMultiphaseFVMKernels:: - DirichletFaceBasedAssemblyKernelFactory:: + DirichletFluxComputeKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, dofManager.rankOffset(), @@ -1043,7 +1054,7 @@ void CompositionalMultiphaseFVM::applyFaceDirichletBC( real64 const time_n, else { isothermalCompositionalMultiphaseFVMKernels:: - DirichletFaceBasedAssemblyKernelFactory:: + DirichletFluxComputeKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, dofManager.rankOffset(), diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index 1901b5570c4..bedfa0c3261 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -31,7 +31,10 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp" /** * @namespace the geos namespace that encapsulates the majority of the code @@ -451,7 +454,7 @@ real64 CompositionalMultiphaseHybridFVM::scalingForSystemSolution( DomainPartiti arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); auto const subRegionData = isothermalCompositionalMultiphaseBaseKernels:: - ScalingForSystemSolutionKernelFactory:: + SolutionScalingKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxCompFracChange, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp index a065a32ca64..1aea8723fd8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp @@ -19,19 +19,15 @@ #include "CompositionalMultiphaseStatistics.hpp" +#include "mesh/DomainPartition.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/relativePermeability/RelativePermeabilityBase.hpp" #include "constitutive/solid/CoupledSolidBase.hpp" -#include "finiteVolume/FiniteVolumeManager.hpp" -#include "finiteVolume/FluxApproximationBase.hpp" -#include "mainInterface/ProblemManager.hpp" -#include "physicsSolvers/PhysicsSolverManager.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/StatisticsKernel.hpp" #include "physicsSolvers/fluidFlow/LogLevelsInfo.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index ff324042411..3d8143e0d83 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -737,7 +737,7 @@ void ReactiveCompositionalMultiphaseOBL::assembleFluxTerms( real64 const dt, { typename TYPEOFREF( stencil ) ::KernelWrapper stencilWrapper = stencil.createKernelWrapper(); - FaceBasedAssemblyKernelFactory:: + FluxComputeKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numPhases, m_numComponents, m_enableEnergyBalance, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp new file mode 100644 index 00000000000..f749853ad6f --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp @@ -0,0 +1,510 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 AccumulationKernels.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_ACCUMULATIONKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_ACCUMULATIONKERNEL_HPP + +#include "codingUtilities/Utilities.hpp" +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/solid/CoupledSolidBase.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "mesh/ElementSubRegionBase.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +static constexpr real64 minDensForDivision = 1e-10; + +enum class KernelFlags +{ + SimpleAccumulation = 1 << 0, // 1 + TotalMassEquation = 1 << 1, // 2 + /// Add more flags like that if needed: + // Flag3 = 1 << 2, // 4 + // Flag4 = 1 << 3, // 8 + // Flag5 = 1 << 4, // 16 + // Flag6 = 1 << 5, // 32 + // Flag7 = 1 << 6, // 64 + // Flag8 = 1 << 7 //128 +}; + +/******************************** AccumulationKernel ********************************/ + +/** + * @class AccumulationKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_DOF number of degrees of freedom + * @brief Define the interface for the assembly kernel in charge of accumulation and volume balance + */ +template< integer NUM_COMP, integer NUM_DOF > +class AccumulationKernel +{ +public: + + /// Compile time value for the number of components + static constexpr integer numComp = NUM_COMP; + + /// Compute time value for the number of degrees of freedom + static constexpr integer numDof = NUM_DOF; + + /// Compute time value for the number of equations + static constexpr integer numEqn = NUM_DOF; + + /** + * @brief Constructor + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + AccumulationKernel( localIndex const numPhases, + globalIndex const rankOffset, + string const dofKey, + ElementSubRegionBase const & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< KernelFlags > const kernelFlags ) + : m_numPhases( numPhases ), + m_rankOffset( rankOffset ), + m_dofNumber( subRegion.getReference< array1d< globalIndex > >( dofKey ) ), + m_elemGhostRank( subRegion.ghostRank() ), + m_volume( subRegion.getElementVolume() ), + m_porosity( solid.getPorosity() ), + m_dPoro_dPres( solid.getDporosity_dPressure() ), + m_dCompFrac_dCompDens( subRegion.getField< fields::flow::dGlobalCompFraction_dGlobalCompDensity >() ), + m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), + m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), + m_phaseDens( fluid.phaseDensity() ), + m_dPhaseDens( fluid.dPhaseDensity() ), + m_phaseCompFrac( fluid.phaseCompFraction() ), + m_dPhaseCompFrac( fluid.dPhaseCompFraction() ), + m_compDens( subRegion.getField< fields::flow::globalCompDensity >() ), + m_compAmount_n( subRegion.getField< fields::flow::compAmount_n >() ), + m_localMatrix( localMatrix ), + m_localRhs( localRhs ), + m_kernelFlags( kernelFlags ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables + { +public: + + // Pore volume information (used by both accumulation and volume balance) + + /// Pore volume at time n+1 + real64 poreVolume = 0.0; + + /// Derivative of pore volume with respect to pressure + real64 dPoreVolume_dPres = 0.0; + + // Residual information + + /// Index of the local row corresponding to this element + localIndex localRow = -1; + + /// Indices of the matrix rows/columns corresponding to the dofs in this element + globalIndex dofIndices[numDof]{}; + + /// C-array storage for the element local residual vector (all equations except volume balance) + real64 localResidual[numEqn]{}; + + /// C-array storage for the element local Jacobian matrix (all equations except volume balance, all dofs) + real64 localJacobian[numEqn][numDof]{}; + + }; + + /** + * @brief Getter for the ghost rank of an element + * @param[in] ei the element index + * @return the ghost rank of the element + */ + GEOS_HOST_DEVICE + integer elemGhostRank( localIndex const ei ) const + { return m_elemGhostRank( ei ); } + + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] ei the element index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + void setup( localIndex const ei, + StackVariables & stack ) const + { + // initialize the pore volume + stack.poreVolume = m_volume[ei] * m_porosity[ei][0]; + stack.dPoreVolume_dPres = m_volume[ei] * m_dPoro_dPres[ei][0]; + + // set row index and degrees of freedom indices for this element + stack.localRow = m_dofNumber[ei] - m_rankOffset; + for( integer idof = 0; idof < numDof; ++idof ) + { + stack.dofIndices[idof] = m_dofNumber[ei] + idof; + } + } + + /** + * @brief Compute the local accumulation contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + * @param[in] phaseAmountKernelOp the function used to customize the kernel + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void computeAccumulation( localIndex const ei, + StackVariables & stack, + FUNC && phaseAmountKernelOp = NoOpFunc{} ) const + { + if( m_kernelFlags.isSet( KernelFlags::SimpleAccumulation ) ) + { + // ic - index of component whose conservation equation is assembled + // (i.e. row number in local matrix) + for( integer ic = 0; ic < numComp; ++ic ) + { + real64 const compAmount = stack.poreVolume * m_compDens[ei][ic]; + real64 const compAmount_n = m_compAmount_n[ei][ic]; + + stack.localResidual[ic] += compAmount - compAmount_n; + + // Pavel: commented below is some experiment, needs to be re-tested + //real64 const compDens = (ic == 0 && m_compDens[ei][ic] < 1e-6) ? 1e-3 : m_compDens[ei][ic]; + real64 const dCompAmount_dP = stack.dPoreVolume_dPres * m_compDens[ei][ic]; + stack.localJacobian[ic][0] += dCompAmount_dP; + + real64 const dCompAmount_dC = stack.poreVolume; + stack.localJacobian[ic][ic + 1] += dCompAmount_dC; + } + } + else + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + // construct the slices for variables accessed multiple times + arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; + + arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; + arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; + + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseDens = m_phaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; + + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; + arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; + + // temporary work arrays + real64 dPhaseAmount_dC[numComp]{}; + real64 dPhaseCompFrac_dC[numComp]{}; + + // start with old time step values + for( integer ic = 0; ic < numComp; ++ic ) + { + stack.localResidual[ic] = -m_compAmount_n[ei][ic]; + } + + // sum contributions to component accumulation from each phase + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + real64 const phaseAmount = stack.poreVolume * phaseVolFrac[ip] * phaseDens[ip]; + + real64 const dPhaseAmount_dP = stack.dPoreVolume_dPres * phaseVolFrac[ip] * phaseDens[ip] + + stack.poreVolume * ( dPhaseVolFrac[ip][Deriv::dP] * phaseDens[ip] + + phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dP] ); + + // assemble density dependence + applyChainRule( numComp, dCompFrac_dCompDens, dPhaseDens[ip], dPhaseAmount_dC, Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + dPhaseAmount_dC[jc] = dPhaseAmount_dC[jc] * phaseVolFrac[ip] + + phaseDens[ip] * dPhaseVolFrac[ip][Deriv::dC + jc]; + dPhaseAmount_dC[jc] *= stack.poreVolume; + } + + // ic - index of component whose conservation equation is assembled + // (i.e. row number in local matrix) + for( integer ic = 0; ic < numComp; ++ic ) + { + real64 const phaseCompAmount = phaseAmount * phaseCompFrac[ip][ic]; + + real64 const dPhaseCompAmount_dP = dPhaseAmount_dP * phaseCompFrac[ip][ic] + + phaseAmount * dPhaseCompFrac[ip][ic][Deriv::dP]; + + stack.localResidual[ic] += phaseCompAmount; + stack.localJacobian[ic][0] += dPhaseCompAmount_dP; + + // jc - index of component w.r.t. whose compositional var the derivative is being taken + // (i.e. col number in local matrix) + + // assemble phase composition dependence + applyChainRule( numComp, dCompFrac_dCompDens, dPhaseCompFrac[ip][ic], dPhaseCompFrac_dC, Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + real64 const dPhaseCompAmount_dC = dPhaseCompFrac_dC[jc] * phaseAmount + + phaseCompFrac[ip][ic] * dPhaseAmount_dC[jc]; + + stack.localJacobian[ic][jc + 1] += dPhaseCompAmount_dC; + } + } + + // call the lambda in the phase loop to allow the reuse of the phase amounts and their derivatives + // possible use: assemble the derivatives wrt temperature, and the accumulation term of the energy equation for this phase + phaseAmountKernelOp( ip, phaseAmount, dPhaseAmount_dP, dPhaseAmount_dC ); + + } + } + } + + /** + * @brief Compute the local volume balance contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + * @param[in] phaseVolFractionSumKernelOp the function used to customize the kernel + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void computeVolumeBalance( localIndex const ei, + StackVariables & stack, + FUNC && phaseVolFractionSumKernelOp = NoOpFunc{} ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; + arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; + + real64 oneMinusPhaseVolFracSum = 1.0; + + // sum contributions to component accumulation from each phase + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + oneMinusPhaseVolFracSum -= phaseVolFrac[ip]; + stack.localJacobian[numComp][0] -= dPhaseVolFrac[ip][Deriv::dP]; + + for( integer jc = 0; jc < numComp; ++jc ) + { + stack.localJacobian[numComp][jc+1] -= dPhaseVolFrac[ip][Deriv::dC+jc]; + } + } + + // call the lambda in the phase loop to allow the reuse of the phase amounts and their derivatives + // possible use: assemble the derivatives wrt temperature, and use oneMinusPhaseVolFracSum if poreVolume depends on temperature + phaseVolFractionSumKernelOp( oneMinusPhaseVolFracSum ); + + // scale saturation-based volume balance by pore volume (for better scaling w.r.t. other equations) + stack.localResidual[numComp] = stack.poreVolume * oneMinusPhaseVolFracSum; + for( integer idof = 0; idof < numDof; ++idof ) + { + stack.localJacobian[numComp][idof] *= stack.poreVolume; + } + stack.localJacobian[numComp][0] += stack.dPoreVolume_dPres * oneMinusPhaseVolFracSum; + } + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void complete( localIndex const GEOS_UNUSED_PARAM( ei ), + StackVariables & stack ) const + { + using namespace compositionalMultiphaseUtilities; + + if( m_kernelFlags.isSet( KernelFlags::TotalMassEquation ) ) + { + // apply equation/variable change transformation to the component mass balance equations + real64 work[numDof]{}; + shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComp, numDof, stack.localJacobian, work ); + shiftElementsAheadByOneAndReplaceFirstElementWithSum( numComp, stack.localResidual ); + } + + // add contribution to residual and jacobian into: + // - the component mass balance equations (i = 0 to i = numComp-1) + // - the volume balance equations (i = numComp) + // note that numDof includes derivatives wrt temperature if this class is derived in ThermalKernels + integer const numRows = numComp+1; + for( integer i = 0; i < numRows; ++i ) + { + m_localRhs[stack.localRow + i] += stack.localResidual[i]; + m_localMatrix.addToRow< serialAtomic >( stack.localRow + i, + stack.dofIndices, + stack.localJacobian[i], + numDof ); + } + } + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElems the number of elements + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + + forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( kernelComponent.elemGhostRank( ei ) >= 0 ) + { + return; + } + + typename KERNEL_TYPE::StackVariables stack; + + kernelComponent.setup( ei, stack ); + kernelComponent.computeAccumulation( ei, stack ); + kernelComponent.computeVolumeBalance( ei, stack ); + kernelComponent.complete( ei, stack ); + } ); + } + +protected: + + /// Number of fluid phases + integer const m_numPhases; + + /// Offset for my MPI rank + globalIndex const m_rankOffset; + + /// View on the dof numbers + arrayView1d< globalIndex const > const m_dofNumber; + + /// View on the ghost ranks + arrayView1d< integer const > const m_elemGhostRank; + + /// View on the element volumes + arrayView1d< real64 const > const m_volume; + + /// Views on the porosity + arrayView2d< real64 const > const m_porosity; + arrayView2d< real64 const > const m_dPoro_dPres; + + /// Views on the derivatives of comp fractions wrt component density + arrayView3d< real64 const, compflow::USD_COMP_DC > const m_dCompFrac_dCompDens; + + /// Views on the phase volume fractions + arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFrac; + arrayView3d< real64 const, compflow::USD_PHASE_DC > const m_dPhaseVolFrac; + + /// Views on the phase densities + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseDens; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > const m_dPhaseDens; + + /// Views on the phase component fraction + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const m_phaseCompFrac; + arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > const m_dPhaseCompFrac; + + // View on component densities + arrayView2d< real64 const, compflow::USD_COMP > m_compDens; + + // View on component amount (mass/moles) from previous time step + arrayView2d< real64 const, compflow::USD_COMP > m_compAmount_n; + + /// View on the local CRS matrix + CRSMatrixView< real64, globalIndex const > const m_localMatrix; + /// View on the local RHS + arrayView1d< real64 > const m_localRhs; + + BitFlags< KernelFlags > const m_kernelFlags; +}; + +/** + * @class AccumulationKernelFactory + */ +class AccumulationKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComps the number of fluid components + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComps, + integer const numPhases, + globalIndex const rankOffset, + integer const useTotalMassEquation, + integer const useSimpleAccumulation, + string const dofKey, + ElementSubRegionBase const & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + internal::kernelLaunchSelectorCompSwitch( numComps, [&] ( auto NC ) + { + integer constexpr NUM_COMP = NC(); + integer constexpr NUM_DOF = NC()+1; + + BitFlags< KernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( KernelFlags::TotalMassEquation ); + if( useSimpleAccumulation ) + kernelFlags.set( KernelFlags::SimpleAccumulation ); + + AccumulationKernel< NUM_COMP, NUM_DOF > kernel( numPhases, rankOffset, dofKey, subRegion, + fluid, solid, localMatrix, localRhs, kernelFlags ); + AccumulationKernel< NUM_COMP, NUM_DOF >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_ACCUMULATIONKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.cpp new file mode 100644 index 00000000000..36ea1aa3226 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.cpp @@ -0,0 +1,268 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 AquiferBCKernel.cpp + */ + +#include "physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" +#include "finiteVolume/BoundaryStencil.hpp" + +namespace geos +{ +using namespace constitutive; + +namespace isothermalCompositionalMultiphaseFVMKernels +{ + +/******************************** AquiferBCKernel ********************************/ + +template< integer NC > +GEOS_HOST_DEVICE +void +AquiferBCKernel:: + compute( integer const numPhases, + integer const ipWater, + bool const allowAllPhasesIntoAquifer, + real64 const aquiferVolFlux, + real64 const dAquiferVolFlux_dPres, + real64 const aquiferWaterPhaseDens, + arrayView1d< real64 const > const & aquiferWaterPhaseCompFrac, + arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseDens, + arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseDens, + arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac, + arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac, + arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > phaseCompFrac, + arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac, + arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens, + real64 const dt, + real64 (& localFlux)[NC], + real64 (& localFluxJacobian)[NC][NC+1] ) +{ + using Deriv = multifluid::DerivativeOffset; + + real64 dProp_dC[NC]{}; + real64 dPhaseFlux_dCompDens[NC]{}; + + if( aquiferVolFlux > 0 ) // aquifer is upstream + { + // in this case, we assume that: + // - only the water phase is present in the aquifer + // - the aquifer water phase composition is constant + + for( integer ic = 0; ic < NC; ++ic ) + { + real64 const phaseFlux = aquiferVolFlux * aquiferWaterPhaseDens; + localFlux[ic] -= dt * phaseFlux * aquiferWaterPhaseCompFrac[ic]; + localFluxJacobian[ic][0] -= dt * dAquiferVolFlux_dPres * aquiferWaterPhaseDens * aquiferWaterPhaseCompFrac[ic]; + } + } + else // reservoir is upstream + { + for( integer ip = 0; ip < numPhases; ++ip ) + { + + // Why two options below: + // - The aquifer model assumes single-phase water flow, so ideally, we should only allow water phase flow from the reservoir to the + // aquifer + // - But, if/when the CO2 plume reaches the reservoir cell connected to the aquifer and saturates it, the aquifer flux becomes zero + // if we don't let some CO2 go into the aquifer + + if( ip == ipWater || allowAllPhasesIntoAquifer ) + { + real64 const phaseDensVolFrac = phaseDens[ip] * phaseVolFrac[ip]; + real64 const phaseFlux = aquiferVolFlux * phaseDensVolFrac; + real64 const dPhaseFlux_dPres = dAquiferVolFlux_dPres * phaseDensVolFrac + + aquiferVolFlux * ( dPhaseDens[ip][Deriv::dP] * phaseVolFrac[ip] + phaseDens[ip] * dPhaseVolFrac[ip][Deriv::dP] ); + + applyChainRule( NC, dCompFrac_dCompDens, dPhaseDens[ip], dProp_dC, Deriv::dC ); + for( integer ic = 0; ic < NC; ++ic ) + { + dPhaseFlux_dCompDens[ic] = aquiferVolFlux * ( dProp_dC[ic] * phaseVolFrac[ip] + phaseDens[ip] * dPhaseVolFrac[ip][Deriv::dC+ic] ); + } + + for( integer ic = 0; ic < NC; ++ic ) + { + localFlux[ic] -= dt * phaseFlux * phaseCompFrac[ip][ic]; + localFluxJacobian[ic][0] -= dt * ( dPhaseFlux_dPres * phaseCompFrac[ip][ic] + phaseFlux * dPhaseCompFrac[ip][ic][Deriv::dP] ); + + applyChainRule( NC, dCompFrac_dCompDens, dPhaseCompFrac[ip][ic], dProp_dC, Deriv::dC ); + for( integer jc = 0; jc < NC; ++jc ) + { + localFluxJacobian[ic][jc+1] -= dt * ( dPhaseFlux_dCompDens[jc] * phaseCompFrac[ip][ic] + phaseFlux * dProp_dC[jc] ); + } + } + } + } + } +} + +template< integer NC > +void +AquiferBCKernel:: + launch( integer const numPhases, + integer const ipWater, + bool const allowAllPhasesIntoAquifer, + integer const useTotalMassEquation, + BoundaryStencil const & stencil, + globalIndex const rankOffset, + ElementViewConst< arrayView1d< globalIndex const > > const & dofNumber, + AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper, + real64 const aquiferWaterPhaseDens, + arrayView1d< real64 const > const & aquiferWaterPhaseCompFrac, + ElementViewConst< arrayView1d< integer const > > const & ghostRank, + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & presOld, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseDens, + ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + real64 const timeAtBeginningOfStep, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + + using namespace compositionalMultiphaseUtilities; + using Order = BoundaryStencil::Order; + + BoundaryStencil::IndexContainerViewConstType const & seri = stencil.getElementRegionIndices(); + BoundaryStencil::IndexContainerViewConstType const & sesri = stencil.getElementSubRegionIndices(); + BoundaryStencil::IndexContainerViewConstType const & sefi = stencil.getElementIndices(); + BoundaryStencil::WeightContainerViewConstType const & weight = stencil.getWeights(); + + forAll< parallelDevicePolicy<> >( stencil.size(), [=] GEOS_HOST_DEVICE ( localIndex const iconn ) + { + constexpr integer NDOF = NC + 1; + + // working arrays + globalIndex dofColIndices[NDOF]{}; + real64 localFlux[NC]{}; + real64 localFluxJacobian[NC][NDOF]{}; + + localIndex const er = seri( iconn, Order::ELEM ); + localIndex const esr = sesri( iconn, Order::ELEM ); + localIndex const ei = sefi( iconn, Order::ELEM ); + real64 const areaFraction = weight( iconn, Order::ELEM ); + + // compute the aquifer influx rate using the pressure influence function and the aquifer props + real64 dAquiferVolFlux_dPres = 0.0; + real64 const aquiferVolFlux = aquiferBCWrapper.compute( timeAtBeginningOfStep, + dt, + pres[er][esr][ei], + presOld[er][esr][ei], + gravCoef[er][esr][ei], + areaFraction, + dAquiferVolFlux_dPres ); + + // compute the phase/component aquifer flux + AquiferBCKernel::compute< NC >( numPhases, + ipWater, + allowAllPhasesIntoAquifer, + aquiferVolFlux, + dAquiferVolFlux_dPres, + aquiferWaterPhaseDens, + aquiferWaterPhaseCompFrac, + phaseDens[er][esr][ei][0], + dPhaseDens[er][esr][ei][0], + phaseVolFrac[er][esr][ei], + dPhaseVolFrac[er][esr][ei], + phaseCompFrac[er][esr][ei][0], + dPhaseCompFrac[er][esr][ei][0], + dCompFrac_dCompDens[er][esr][ei], + dt, + localFlux, + localFluxJacobian ); + + // populate dof indices + globalIndex const offset = dofNumber[er][esr][ei]; + for( integer jdof = 0; jdof < NDOF; ++jdof ) + { + dofColIndices[jdof] = offset + jdof; + } + + if( useTotalMassEquation > 0 ) + { + // Apply equation/variable change transformation(s) + real64 work[NDOF]; + shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( NC, NDOF, localFluxJacobian, work ); + shiftElementsAheadByOneAndReplaceFirstElementWithSum( NC, localFlux ); + } + + // Add to residual/jacobian + if( ghostRank[er][esr][ei] < 0 ) + { + globalIndex const globalRow = dofNumber[er][esr][ei]; + localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - rankOffset ); + GEOS_ASSERT_GE( localRow, 0 ); + GEOS_ASSERT_GT( localMatrix.numRows(), localRow + NC ); + + for( integer ic = 0; ic < NC; ++ic ) + { + RAJA::atomicAdd( parallelDeviceAtomic{}, &localRhs[localRow + ic], localFlux[ic] ); + localMatrix.addToRow< parallelDeviceAtomic >( localRow + ic, + dofColIndices, + localFluxJacobian[ic], + NDOF ); + } + } + } ); +} + +#define INST_AquiferBCKernel( NC ) \ + template \ + void AquiferBCKernel:: \ + launch< NC >( integer const numPhases, \ + integer const ipWater, \ + bool const allowAllPhasesIntoAquifer, \ + integer const useTotalMassEquation, \ + BoundaryStencil const & stencil, \ + globalIndex const rankOffset, \ + ElementViewConst< arrayView1d< globalIndex const > > const & dofNumber, \ + AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper, \ + real64 const aquiferWaterPhaseDens, \ + arrayView1d< real64 const > const & aquiferWaterPhaseCompFrac, \ + ElementViewConst< arrayView1d< integer const > > const & ghostRank, \ + ElementViewConst< arrayView1d< real64 const > > const & pres, \ + ElementViewConst< arrayView1d< real64 const > > const & dPres, \ + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, \ + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, \ + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, \ + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, \ + ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, \ + ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseDens, \ + ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, \ + ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, \ + real64 const timeAtBeginningOfStep, \ + real64 const dt, \ + CRSMatrixView< real64, globalIndex const > const & localMatrix, \ + arrayView1d< real64 > const & localRhs ) + +INST_AquiferBCKernel( 1 ); +INST_AquiferBCKernel( 2 ); +INST_AquiferBCKernel( 3 ); +INST_AquiferBCKernel( 4 ); +INST_AquiferBCKernel( 5 ); + +#undef INST_AquiferBCKernel + +} // namespace isothermalCompositionalMultiphaseFVMKernels + +} // namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.hpp new file mode 100644 index 00000000000..b1729589b30 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.hpp @@ -0,0 +1,131 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 AquiferBCKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_AQUIFERBCKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_AQUIFERBCKERNEL_HPP + +#include "codingUtilities/Utilities.hpp" +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" +#include "fieldSpecification/AquiferBoundaryCondition.hpp" +#include "finiteVolume/BoundaryStencil.hpp" +#include "mesh/ElementRegionManager.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseFVMKernels +{ + +/******************************** AquiferBCKernel ********************************/ + +/** + * @brief Functions to assemble aquifer boundary condition contributions to residual and Jacobian + */ +struct AquiferBCKernel +{ + + /** + * @brief The type for element-based data. Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewConstAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + using CompFlowAccessors = + StencilAccessors< fields::ghostRank, + fields::flow::pressure, + fields::flow::pressure_n, + fields::flow::gravityCoefficient, + fields::flow::phaseVolumeFraction, + fields::flow::dPhaseVolumeFraction, + fields::flow::dGlobalCompFraction_dGlobalCompDensity >; + + using MultiFluidAccessors = + StencilMaterialAccessors< constitutive::MultiFluidBase, + fields::multifluid::phaseDensity, + fields::multifluid::dPhaseDensity, + fields::multifluid::phaseCompFraction, + fields::multifluid::dPhaseCompFraction >; + + template< integer NC > + GEOS_HOST_DEVICE + inline + static void + compute( integer const numPhases, + integer const ipWater, + bool const allowAllPhasesIntoAquifer, + real64 const aquiferVolFlux, + real64 const dAquiferVolFlux_dPres, + real64 const aquiferWaterPhaseDens, + arrayView1d< real64 const > const & aquiferWaterPhaseCompFrac, + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseDens, + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseDens, + arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac, + arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac, + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > phaseCompFrac, + arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac, + arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens, + real64 const dt, + real64 ( &localFlux )[NC], + real64 ( &localFluxJacobian )[NC][NC+1] ); + + template< integer NC > + static void + launch( integer const numPhases, + integer const ipWater, + bool const allowAllPhasesIntoAquifer, + integer const useTotalMassEquation, + BoundaryStencil const & stencil, + globalIndex const rankOffset, + ElementViewConst< arrayView1d< globalIndex const > > const & dofNumber, + AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper, + real64 const aquiferWaterPhaseDens, + arrayView1d< real64 const > const & aquiferWaterPhaseCompFrac, + ElementViewConst< arrayView1d< integer const > > const & ghostRank, + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & pres_n, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + real64 const timeAtBeginningOfStep, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ); + +}; + +} // namespace isothermalCompositionalMultiphaseFVMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_AQUIFERBCKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp new file mode 100644 index 00000000000..a254aa9f97d --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp @@ -0,0 +1,228 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 C1PPUPhaseFlux.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_C1PPUPHASEFLUX_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_C1PPUPHASEFLUX_HPP + +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" +#include "constitutive/capillaryPressure/layouts.hpp" +#include "mesh/ElementRegionManager.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp" + + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseFVMKernelUtilities +{ + +// TODO make input parameter +static constexpr real64 epsC1PPU = 5000; + +template< typename VIEWTYPE > +using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + +using Deriv = constitutive::multifluid::DerivativeOffset; + +struct C1PPUPhaseFlux +{ + /** + * @brief Form the PhasePotentialUpwind from pressure gradient and gravitational head + * @tparam numComp number of components + * @tparam numFluxSupportPoints number of flux support points + * @param numPhase number of phases + * @param ip phase index + * @param hasCapPressure flag indicating if there is capillary pressure + * @param seri arraySlice of the stencil-implied element region index + * @param sesri arraySlice of the stencil-implied element subregion index + * @param sei arraySlice of the stencil-implied element index + * @param trans transmissibility at the connection + * @param dTrans_dPres derivative of transmissibility wrt pressure + * @param pres pressure + * @param gravCoef gravitational coefficient + * @param phaseMob phase mobility + * @param dPhaseMob derivative of phase mobility wrt pressure, temperature, comp density + * @param dPhaseVolFrac derivative of phase volume fraction wrt pressure, temperature, comp density + * @param dCompFrac_dCompDens derivative of component fraction wrt component density + * @param phaseMassDens phase mass density + * @param dPhaseMassDens derivative of phase mass density wrt pressure, temperature, comp fraction + * @param phaseCapPressure phase capillary pressure + * @param dPhaseCapPressure_dPhaseVolFrac derivative of phase capillary pressure wrt phase volume fraction + * @param k_up uptream index for this phase + * @param potGrad potential gradient for this phase + * @param phaseFlux phase flux + * @param dPhaseFlux_dP derivative of phase flux wrt pressure + * @param dPhaseFlux_dC derivative of phase flux wrt comp density + */ + template< integer numComp, integer numFluxSupportPoints > + GEOS_HOST_DEVICE + static void + compute( integer const numPhase, + integer const ip, + integer const hasCapPressure, + localIndex const ( &seri )[numFluxSupportPoints], + localIndex const ( &sesri )[numFluxSupportPoints], + localIndex const ( &sei )[numFluxSupportPoints], + real64 const ( &trans )[2], + real64 const ( &dTrans_dPres )[2], + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + localIndex & k_up, + real64 & potGrad, + real64 ( &phaseFlux ), + real64 ( & dPhaseFlux_dP )[numFluxSupportPoints], + real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp], + real64 ( & compFlux )[numComp], + real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp], + real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp] ) + { + real64 dPresGrad_dP[numFluxSupportPoints]{}; + real64 dPresGrad_dC[numFluxSupportPoints][numComp]{}; + real64 dGravHead_dP[numFluxSupportPoints]{}; + real64 dGravHead_dC[numFluxSupportPoints][numComp]{}; + PotGrad::compute< numComp, numFluxSupportPoints >( numPhase, ip, hasCapPressure, seri, sesri, sei, trans, dTrans_dPres, pres, + gravCoef, phaseVolFrac, dPhaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, + phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, potGrad, dPresGrad_dP, + dPresGrad_dC, dGravHead_dP, dGravHead_dC ); + + // gravity head + real64 gravHead = 0.0; + for( integer i = 0; i < numFluxSupportPoints; i++ ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + real64 const gravD = trans[i] * gravCoef[er][esr][ei]; + + gravHead += gravD; + } + + // *** upwinding *** + + // phase flux and derivatives + + // assuming TPFA in the code below + + real64 Ttrans = fabs( trans[0] ); + potGrad = potGrad / Ttrans; + + real64 const mobility_i = phaseMob[seri[0]][sesri[0]][sei[0]][ip]; + real64 const mobility_j = phaseMob[seri[1]][sesri[1]][sei[1]][ip]; + + // compute phase flux, see Eqs. (66) and (69) from the reference above + real64 smoEps = epsC1PPU; + if( fabs( gravHead ) <= 1e-20 ) + smoEps = 1000; + real64 const tmpSqrt = sqrt( potGrad * potGrad + smoEps * smoEps ); + real64 const smoMax = 0.5 * (-potGrad + tmpSqrt); + + phaseFlux = Ttrans * ( potGrad * mobility_i - smoMax * (mobility_j - mobility_i) ); + + // derivativess + + // first part, mobility derivative + + // dP + { + real64 const dMob_dP = dPhaseMob[seri[0]][sesri[0]][sei[0]][ip][Deriv::dP]; + dPhaseFlux_dP[0] += Ttrans * potGrad * dMob_dP; + } + + // dC + { + arraySlice1d< real64 const, compflow::USD_PHASE_DC - 2 > + dPhaseMobSub = dPhaseMob[seri[0]][sesri[0]][sei[0]][ip]; + for( integer jc = 0; jc < numComp; ++jc ) + { + dPhaseFlux_dC[0][jc] += Ttrans * potGrad * dPhaseMobSub[Deriv::dC + jc]; + } + } + + real64 const tmpInv = 1.0 / tmpSqrt; + real64 const dSmoMax_x = 0.5 * (1.0 - potGrad * tmpInv); + + // pressure gradient and mobility difference depend on all points in the stencil + real64 const dMobDiff_sign[numFluxSupportPoints] = {-1.0, 1.0}; + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + // dP + + real64 const dPotGrad_dP = dPresGrad_dP[ke] - dGravHead_dP[ke]; + + // first part + dPhaseFlux_dP[ke] += dPotGrad_dP * mobility_i; + + // second part + real64 const dSmoMax_dP = -dPotGrad_dP * dSmoMax_x; + dPhaseFlux_dP[ke] += -dSmoMax_dP * (mobility_j - mobility_i); + + real64 const dMob_dP = dPhaseMob[seri[ke]][sesri[ke]][sei[ke]][ip][Deriv::dP]; + dPhaseFlux_dP[ke] += -Ttrans * smoMax * dMobDiff_sign[ke] * dMob_dP; + + // dC + + arraySlice1d< real64 const, compflow::USD_PHASE_DC - 2 > + dPhaseMobSub = dPhaseMob[seri[ke]][sesri[ke]][sei[ke]][ip]; + + for( integer jc = 0; jc < numComp; ++jc ) + { + real64 const dPotGrad_dC = dPresGrad_dC[ke][jc] - dGravHead_dC[ke][jc]; + + // first part + dPhaseFlux_dC[ke][jc] += dPotGrad_dC * mobility_i; + + // second part + real64 const dSmoMax_dC = -dPotGrad_dC * dSmoMax_x; + dPhaseFlux_dC[ke][jc] += -dSmoMax_dC * (mobility_j - mobility_i); + dPhaseFlux_dC[ke][jc] += -Ttrans * smoMax * dMobDiff_sign[ke] * dPhaseMobSub[Deriv::dC + jc]; + } + } + + potGrad = potGrad * Ttrans; + + // choose upstream cell for composition upwinding + k_up = (phaseFlux >= 0) ? 0 : 1; + + //distribute on phaseComponentFlux here + PhaseComponentFlux::compute( ip, k_up, seri, sesri, sei, phaseCompFrac, dPhaseCompFrac, dCompFrac_dCompDens, phaseFlux + , dPhaseFlux_dP, dPhaseFlux_dC, compFlux, dCompFlux_dP, dCompFlux_dC ); + } +}; + +} // namespace isothermalCompositionalMultiPhaseFVMKernelUtilities + +} // namespace geos + + +#endif // GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_C1PPUPHASEFLUX_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.cpp similarity index 58% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.cpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.cpp index ebceae552f0..b416573af0b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.cpp @@ -14,17 +14,14 @@ */ /** - * @file IsothermalCompositionalMultiphaseFVMKernels.cpp + * @file CFLKernel.cpp */ -#include "IsothermalCompositionalMultiphaseFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" - +#include "physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp" #include "finiteVolume/CellElementStencilTPFA.hpp" #include "finiteVolume/SurfaceElementStencil.hpp" #include "finiteVolume/EmbeddedSurfaceToCellStencil.hpp" #include "finiteVolume/FaceElementToCellStencil.hpp" -#include "mesh/utilities/MeshMapUtilities.hpp" namespace geos { @@ -33,34 +30,6 @@ using namespace constitutive; namespace isothermalCompositionalMultiphaseFVMKernels { -/******************************** FaceBasedAssemblyKernel ********************************/ - -FaceBasedAssemblyKernelBase::FaceBasedAssemblyKernelBase( integer const numPhases, - globalIndex const rankOffset, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - MultiFluidAccessors const & multiFluidAccessors, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< FaceBasedAssemblyKernelFlags > kernelFlags ) - : m_numPhases( numPhases ), - m_rankOffset( rankOffset ), - m_dt( dt ), - m_dofNumber( dofNumberAccessor.toNestedViewConst() ), - m_ghostRank( compFlowAccessors.get( fields::ghostRank {} ) ), - m_gravCoef( compFlowAccessors.get( fields::flow::gravityCoefficient {} ) ), - m_pres( compFlowAccessors.get( fields::flow::pressure {} ) ), - m_phaseVolFrac( compFlowAccessors.get( fields::flow::phaseVolumeFraction {} ) ), - m_dPhaseVolFrac( compFlowAccessors.get( fields::flow::dPhaseVolumeFraction {} ) ), - m_dCompFrac_dCompDens( compFlowAccessors.get( fields::flow::dGlobalCompFraction_dGlobalCompDensity {} ) ), - m_phaseCompFrac( multiFluidAccessors.get( fields::multifluid::phaseCompFraction {} ) ), - m_dPhaseCompFrac( multiFluidAccessors.get( fields::multifluid::dPhaseCompFraction {} ) ), - m_localMatrix( localMatrix ), - m_localRhs( localRhs ), - m_kernelFlags( kernelFlags ) -{} - /******************************** CFLFluxKernel ********************************/ template< integer NC, localIndex NUM_ELEMS, localIndex maxStencilSize > @@ -470,241 +439,6 @@ INST_CFLKernel( 5, 3 ); #undef INST_CFLKernel -/******************************** AquiferBCKernel ********************************/ - -template< integer NC > -GEOS_HOST_DEVICE -void -AquiferBCKernel:: - compute( integer const numPhases, - integer const ipWater, - bool const allowAllPhasesIntoAquifer, - real64 const aquiferVolFlux, - real64 const dAquiferVolFlux_dPres, - real64 const aquiferWaterPhaseDens, - arrayView1d< real64 const > const & aquiferWaterPhaseCompFrac, - arraySlice1d< real64 const, multifluid::USD_PHASE - 2 > phaseDens, - arraySlice2d< real64 const, multifluid::USD_PHASE_DC - 2 > dPhaseDens, - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac, - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac, - arraySlice2d< real64 const, multifluid::USD_PHASE_COMP - 2 > phaseCompFrac, - arraySlice3d< real64 const, multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac, - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens, - real64 const dt, - real64 (& localFlux)[NC], - real64 (& localFluxJacobian)[NC][NC+1] ) -{ - using Deriv = multifluid::DerivativeOffset; - - real64 dProp_dC[NC]{}; - real64 dPhaseFlux_dCompDens[NC]{}; - - if( aquiferVolFlux > 0 ) // aquifer is upstream - { - // in this case, we assume that: - // - only the water phase is present in the aquifer - // - the aquifer water phase composition is constant - - for( integer ic = 0; ic < NC; ++ic ) - { - real64 const phaseFlux = aquiferVolFlux * aquiferWaterPhaseDens; - localFlux[ic] -= dt * phaseFlux * aquiferWaterPhaseCompFrac[ic]; - localFluxJacobian[ic][0] -= dt * dAquiferVolFlux_dPres * aquiferWaterPhaseDens * aquiferWaterPhaseCompFrac[ic]; - } - } - else // reservoir is upstream - { - for( integer ip = 0; ip < numPhases; ++ip ) - { - - // Why two options below: - // - The aquifer model assumes single-phase water flow, so ideally, we should only allow water phase flow from the reservoir to the - // aquifer - // - But, if/when the CO2 plume reaches the reservoir cell connected to the aquifer and saturates it, the aquifer flux becomes zero - // if we don't let some CO2 go into the aquifer - - if( ip == ipWater || allowAllPhasesIntoAquifer ) - { - real64 const phaseDensVolFrac = phaseDens[ip] * phaseVolFrac[ip]; - real64 const phaseFlux = aquiferVolFlux * phaseDensVolFrac; - real64 const dPhaseFlux_dPres = dAquiferVolFlux_dPres * phaseDensVolFrac - + aquiferVolFlux * ( dPhaseDens[ip][Deriv::dP] * phaseVolFrac[ip] + phaseDens[ip] * dPhaseVolFrac[ip][Deriv::dP] ); - - applyChainRule( NC, dCompFrac_dCompDens, dPhaseDens[ip], dProp_dC, Deriv::dC ); - for( integer ic = 0; ic < NC; ++ic ) - { - dPhaseFlux_dCompDens[ic] = aquiferVolFlux * ( dProp_dC[ic] * phaseVolFrac[ip] + phaseDens[ip] * dPhaseVolFrac[ip][Deriv::dC+ic] ); - } - - for( integer ic = 0; ic < NC; ++ic ) - { - localFlux[ic] -= dt * phaseFlux * phaseCompFrac[ip][ic]; - localFluxJacobian[ic][0] -= dt * ( dPhaseFlux_dPres * phaseCompFrac[ip][ic] + phaseFlux * dPhaseCompFrac[ip][ic][Deriv::dP] ); - - applyChainRule( NC, dCompFrac_dCompDens, dPhaseCompFrac[ip][ic], dProp_dC, Deriv::dC ); - for( integer jc = 0; jc < NC; ++jc ) - { - localFluxJacobian[ic][jc+1] -= dt * ( dPhaseFlux_dCompDens[jc] * phaseCompFrac[ip][ic] + phaseFlux * dProp_dC[jc] ); - } - } - } - } - } -} - -template< integer NC > -void -AquiferBCKernel:: - launch( integer const numPhases, - integer const ipWater, - bool const allowAllPhasesIntoAquifer, - integer const useTotalMassEquation, - BoundaryStencil const & stencil, - globalIndex const rankOffset, - ElementViewConst< arrayView1d< globalIndex const > > const & dofNumber, - AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper, - real64 const aquiferWaterPhaseDens, - arrayView1d< real64 const > const & aquiferWaterPhaseCompFrac, - ElementViewConst< arrayView1d< integer const > > const & ghostRank, - ElementViewConst< arrayView1d< real64 const > > const & pres, - ElementViewConst< arrayView1d< real64 const > > const & presOld, - ElementViewConst< arrayView1d< real64 const > > const & gravCoef, - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseDens, - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, - real64 const timeAtBeginningOfStep, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) -{ - - using namespace compositionalMultiphaseUtilities; - using Order = BoundaryStencil::Order; - - BoundaryStencil::IndexContainerViewConstType const & seri = stencil.getElementRegionIndices(); - BoundaryStencil::IndexContainerViewConstType const & sesri = stencil.getElementSubRegionIndices(); - BoundaryStencil::IndexContainerViewConstType const & sefi = stencil.getElementIndices(); - BoundaryStencil::WeightContainerViewConstType const & weight = stencil.getWeights(); - - forAll< parallelDevicePolicy<> >( stencil.size(), [=] GEOS_HOST_DEVICE ( localIndex const iconn ) - { - constexpr integer NDOF = NC + 1; - - // working arrays - globalIndex dofColIndices[NDOF]{}; - real64 localFlux[NC]{}; - real64 localFluxJacobian[NC][NDOF]{}; - - localIndex const er = seri( iconn, Order::ELEM ); - localIndex const esr = sesri( iconn, Order::ELEM ); - localIndex const ei = sefi( iconn, Order::ELEM ); - real64 const areaFraction = weight( iconn, Order::ELEM ); - - // compute the aquifer influx rate using the pressure influence function and the aquifer props - real64 dAquiferVolFlux_dPres = 0.0; - real64 const aquiferVolFlux = aquiferBCWrapper.compute( timeAtBeginningOfStep, - dt, - pres[er][esr][ei], - presOld[er][esr][ei], - gravCoef[er][esr][ei], - areaFraction, - dAquiferVolFlux_dPres ); - - // compute the phase/component aquifer flux - AquiferBCKernel::compute< NC >( numPhases, - ipWater, - allowAllPhasesIntoAquifer, - aquiferVolFlux, - dAquiferVolFlux_dPres, - aquiferWaterPhaseDens, - aquiferWaterPhaseCompFrac, - phaseDens[er][esr][ei][0], - dPhaseDens[er][esr][ei][0], - phaseVolFrac[er][esr][ei], - dPhaseVolFrac[er][esr][ei], - phaseCompFrac[er][esr][ei][0], - dPhaseCompFrac[er][esr][ei][0], - dCompFrac_dCompDens[er][esr][ei], - dt, - localFlux, - localFluxJacobian ); - - // populate dof indices - globalIndex const offset = dofNumber[er][esr][ei]; - for( integer jdof = 0; jdof < NDOF; ++jdof ) - { - dofColIndices[jdof] = offset + jdof; - } - - if( useTotalMassEquation > 0 ) - { - // Apply equation/variable change transformation(s) - real64 work[NDOF]; - shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( NC, NDOF, localFluxJacobian, work ); - shiftElementsAheadByOneAndReplaceFirstElementWithSum( NC, localFlux ); - } - - // Add to residual/jacobian - if( ghostRank[er][esr][ei] < 0 ) - { - globalIndex const globalRow = dofNumber[er][esr][ei]; - localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - rankOffset ); - GEOS_ASSERT_GE( localRow, 0 ); - GEOS_ASSERT_GT( localMatrix.numRows(), localRow + NC ); - - for( integer ic = 0; ic < NC; ++ic ) - { - RAJA::atomicAdd( parallelDeviceAtomic{}, &localRhs[localRow + ic], localFlux[ic] ); - localMatrix.addToRow< parallelDeviceAtomic >( localRow + ic, - dofColIndices, - localFluxJacobian[ic], - NDOF ); - } - } - } ); -} - -#define INST_AquiferBCKernel( NC ) \ - template \ - void AquiferBCKernel:: \ - launch< NC >( integer const numPhases, \ - integer const ipWater, \ - bool const allowAllPhasesIntoAquifer, \ - integer const useTotalMassEquation, \ - BoundaryStencil const & stencil, \ - globalIndex const rankOffset, \ - ElementViewConst< arrayView1d< globalIndex const > > const & dofNumber, \ - AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper, \ - real64 const aquiferWaterPhaseDens, \ - arrayView1d< real64 const > const & aquiferWaterPhaseCompFrac, \ - ElementViewConst< arrayView1d< integer const > > const & ghostRank, \ - ElementViewConst< arrayView1d< real64 const > > const & pres, \ - ElementViewConst< arrayView1d< real64 const > > const & dPres, \ - ElementViewConst< arrayView1d< real64 const > > const & gravCoef, \ - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, \ - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, \ - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, \ - ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseDens, \ - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_DC > > const & dPhaseDens, \ - ElementViewConst< arrayView4d< real64 const, multifluid::USD_PHASE_COMP > > const & phaseCompFrac, \ - ElementViewConst< arrayView5d< real64 const, multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, \ - real64 const timeAtBeginningOfStep, \ - real64 const dt, \ - CRSMatrixView< real64, globalIndex const > const & localMatrix, \ - arrayView1d< real64 > const & localRhs ) - -INST_AquiferBCKernel( 1 ); -INST_AquiferBCKernel( 2 ); -INST_AquiferBCKernel( 3 ); -INST_AquiferBCKernel( 4 ); -INST_AquiferBCKernel( 5 ); - -#undef INST_AquiferBCKernel - } // namespace isothermalCompositionalMultiphaseFVMKernels } // namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp new file mode 100644 index 00000000000..8449d57e43e --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp @@ -0,0 +1,184 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 CFLKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_CFLKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_CFLKERNEL_HPP + +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" +#include "constitutive/permeability/PermeabilityBase.hpp" +#include "constitutive/permeability/PermeabilityFields.hpp" +#include "constitutive/relativePermeability/RelativePermeabilityBase.hpp" +#include "constitutive/relativePermeability/RelativePermeabilityFields.hpp" +#include "mesh/ElementRegionManager.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseFVMKernels +{ + +/******************************** CFLFluxKernel ********************************/ + +/** + * @brief Functions to compute the (outflux) total volumetric flux needed in the calculation of CFL numbers + */ +struct CFLFluxKernel +{ + + /** + * @brief The type for element-based data. Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewConstAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + template< typename VIEWTYPE > + using ElementView = ElementRegionManager::ElementView< VIEWTYPE >; + + using CompFlowAccessors = + StencilAccessors< fields::flow::pressure, + fields::flow::gravityCoefficient, + fields::flow::phaseVolumeFraction, + fields::flow::phaseOutflux, + fields::flow::componentOutflux >; + + using MultiFluidAccessors = + StencilMaterialAccessors< constitutive::MultiFluidBase, + fields::multifluid::phaseViscosity, + fields::multifluid::phaseDensity, + fields::multifluid::phaseMassDensity, + fields::multifluid::phaseCompFraction >; + + using PermeabilityAccessors = + StencilMaterialAccessors< constitutive::PermeabilityBase, + fields::permeability::permeability, + fields::permeability::dPerm_dPressure >; + + + using RelPermAccessors = + StencilMaterialAccessors< constitutive::RelativePermeabilityBase, fields::relperm::phaseRelPerm >; + + template< integer NC, localIndex NUM_ELEMS, localIndex maxStencilSize > + GEOS_HOST_DEVICE + inline + static void + compute( integer const numPhases, + localIndex const stencilSize, + real64 const dt, + arraySlice1d< localIndex const > const seri, + arraySlice1d< localIndex const > const sesri, + arraySlice1d< localIndex const > const sei, + real64 const (&transmissibility)[2], + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > > const & phaseRelPerm, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseVisc, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementView< arrayView2d< real64, compflow::USD_PHASE > > const & phaseOutflux, + ElementView< arrayView2d< real64, compflow::USD_COMP > > const & compOutflux ); + + template< integer NC, typename STENCILWRAPPER_TYPE > + static void + launch( integer const numPhases, + real64 const dt, + STENCILWRAPPER_TYPE const & stencil, + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, + ElementViewConst< arrayView3d< real64 const > > const & permeability, + ElementViewConst< arrayView3d< real64 const > > const & dPerm_dPres, + ElementViewConst< arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > > const & phaseRelPerm, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseVisc, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementView< arrayView2d< real64, compflow::USD_PHASE > > const & phaseOutflux, + ElementView< arrayView2d< real64, compflow::USD_COMP > > const & compOutflux ); +}; + +/******************************** CFLKernel ********************************/ + +/** + * @brief Functions to compute the CFL number using the phase volumetric outflux and the component mass outflux in each cell + */ +struct CFLKernel +{ + + static constexpr real64 minPhaseMobility = 1e-12; + static constexpr real64 minComponentFraction = 1e-12; + + template< integer NP > + GEOS_HOST_DEVICE + inline + static void + computePhaseCFL( real64 const poreVol, + arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac, + arraySlice1d< real64 const, constitutive::relperm::USD_RELPERM - 2 > phaseRelPerm, + arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > dPhaseRelPerm_dPhaseVolFrac, + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseVisc, + arraySlice1d< real64 const, compflow::USD_PHASE- 1 > phaseOutflux, + real64 & phaseCFLNumber ); + + template< integer NC > + GEOS_HOST_DEVICE + inline + static void + computeCompCFL( real64 const poreVol, + arraySlice1d< real64 const, compflow::USD_COMP - 1 > compDens, + arraySlice1d< real64 const, compflow::USD_COMP - 1 > compFrac, + arraySlice1d< real64 const, compflow::USD_COMP - 1 > compOutflux, + real64 & compCFLNumber ); + + template< integer NC, integer NP > + static void + launch( localIndex const size, + arrayView1d< real64 const > const & volume, + arrayView2d< real64 const > const & porosity, + arrayView2d< real64 const, compflow::USD_COMP > const & compDens, + arrayView2d< real64 const, compflow::USD_COMP > const & compFrac, + arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac, + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > const & phaseRelPerm, + arrayView4d< real64 const, constitutive::relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const & phaseVisc, + arrayView2d< real64 const, compflow::USD_PHASE > const & phaseOutflux, + arrayView2d< real64 const, compflow::USD_COMP > const & compOutflux, + arrayView1d< real64 > const & phaseCFLNumber, + arrayView1d< real64 > const & compCFLNumber, + real64 & maxPhaseCFLNumber, + real64 & maxCompCFLNumber ); + +}; + +} // namespace isothermalCompositionalMultiphaseFVMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_CFLKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CapillaryPressureUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CapillaryPressureUpdateKernel.hpp new file mode 100644 index 00000000000..7842c859189 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CapillaryPressureUpdateKernel.hpp @@ -0,0 +1,73 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 CapillaryPressureUpdateKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_CAPILLARYPRESSUREUPDATEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_CAPILLARYPRESSUREUPDATEKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/******************************** CapillaryPressureUpdateKernel ********************************/ + +struct CapillaryPressureUpdateKernel +{ + template< typename POLICY, typename CAPPRES_WRAPPER > + static void + launch( localIndex const size, + CAPPRES_WRAPPER const & capPresWrapper, + arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac ) + { + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + for( localIndex q = 0; q < capPresWrapper.numGauss(); ++q ) + { + capPresWrapper.update( k, q, phaseVolFrac[k] ); + } + } ); + } + + template< typename POLICY, typename CAPPRES_WRAPPER > + static void + launch( SortedArrayView< localIndex const > const & targetSet, + CAPPRES_WRAPPER const & capPresWrapper, + arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac ) + { + forAll< POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + localIndex const k = targetSet[a]; + for( localIndex q = 0; q < capPresWrapper.numGauss(); ++q ) + { + capPresWrapper.update( k, q, phaseVolFrac[k] ); + } + } ); + } +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_CAPILLARYPRESSUREUPDATEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp index 14b19626972..c388cad6da5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp @@ -30,9 +30,12 @@ #include "constitutive/relativePermeability/RelativePermeabilityBase.hpp" #include "mesh/ElementRegionManager.hpp" #include "mesh/ObjectManagerBase.hpp" +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp new file mode 100644 index 00000000000..ac5ab4265da --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp @@ -0,0 +1,775 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 DiffusionDispersionFluxComputeKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_DIFFUSIONDISPERSIONFLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_DIFFUSIONDISPERSIONFLUXCOMPUTEKERNEL_HPP + +#include "codingUtilities/Utilities.hpp" +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/diffusion/DiffusionFields.hpp" +#include "constitutive/diffusion/DiffusionBase.hpp" +#include "constitutive/dispersion/DispersionFields.hpp" +#include "constitutive/dispersion/DispersionBase.hpp" +#include "constitutive/solid/porosity/PorosityBase.hpp" +#include "constitutive/solid/porosity/PorosityFields.hpp" +#include "mesh/ElementRegionManager.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" +#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseFVMKernels +{ + +/******************************** DiffusionDispersionFluxComputeKernel ********************************/ + +/** + * @class DiffusionDispersionFluxComputeKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_DOF number of degrees of freedom + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @brief Define the interface for the assembly kernel in charge of diffusion/dispersion flux terms + */ +template< integer NUM_COMP, integer NUM_DOF, typename STENCILWRAPPER > +class DiffusionDispersionFluxComputeKernel : public FluxComputeKernelBase +{ +public: + + /// Compile time value for the number of components + static constexpr integer numComp = NUM_COMP; + + /// Compute time value for the number of degrees of freedom + static constexpr integer numDof = NUM_DOF; + + /// Compute time value for the number of equations (all of them, except the volume balance equation) + static constexpr integer numEqn = NUM_DOF-1; + + /// Maximum number of elements at the face + static constexpr localIndex maxNumElems = STENCILWRAPPER::maxNumPointsInFlux; + + /// Maximum number of connections at the face + static constexpr localIndex maxNumConns = STENCILWRAPPER::maxNumConnections; + + /// Maximum number of points in the stencil + static constexpr localIndex maxStencilSize = STENCILWRAPPER::maxStencilSize; + + /// Number of flux support points (hard-coded for TFPA) + static constexpr integer numFluxSupportPoints = 2; + + using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernelBase; + using AbstractBase::m_dPhaseVolFrac; + using AbstractBase::m_kernelFlags; + + using DiffusionAccessors = + StencilMaterialAccessors< constitutive::DiffusionBase, + fields::diffusion::diffusivity, + fields::diffusion::dDiffusivity_dTemperature, + fields::diffusion::phaseDiffusivityMultiplier >; + + using DispersionAccessors = + StencilMaterialAccessors< constitutive::DispersionBase, + fields::dispersion::dispersivity >; + + using PorosityAccessors = + StencilMaterialAccessors< constitutive::PorosityBase, + fields::porosity::referencePorosity >; + + /** + * @brief Constructor for the kernel interface + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dofNumberAccessor + * @param[in] compFlowAccessors + * @param[in] multiFluidAccessors + * @param[in] diffusionAccessors + * @param[in] dispersionAccessors + * @param[in] porosityAccessors + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + * @param[in] kernelFlags flags packed together + */ + DiffusionDispersionFluxComputeKernel( integer const numPhases, + globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + DiffusionAccessors const & diffusionAccessors, + DispersionAccessors const & dispersionAccessors, + PorosityAccessors const & porosityAccessors, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< KernelFlags > kernelFlags ) + : FluxComputeKernelBase( numPhases, + rankOffset, + dofNumberAccessor, + compFlowAccessors, + multiFluidAccessors, + dt, + localMatrix, + localRhs, + kernelFlags ), + m_phaseVolFrac( compFlowAccessors.get( fields::flow::phaseVolumeFraction {} ) ), + m_phaseDens( multiFluidAccessors.get( fields::multifluid::phaseDensity {} ) ), + m_dPhaseDens( multiFluidAccessors.get( fields::multifluid::dPhaseDensity {} ) ), + m_diffusivity( diffusionAccessors.get( fields::diffusion::diffusivity {} ) ), + m_dDiffusivity_dTemp( diffusionAccessors.get( fields::diffusion::dDiffusivity_dTemperature {} ) ), + m_phaseDiffusivityMultiplier( diffusionAccessors.get( fields::diffusion::phaseDiffusivityMultiplier {} ) ), + m_dispersivity( dispersionAccessors.get( fields::dispersion::dispersivity {} ) ), + m_referencePorosity( porosityAccessors.get( fields::porosity::referencePorosity {} ) ), + m_stencilWrapper( stencilWrapper ), + m_seri( stencilWrapper.getElementRegionIndices() ), + m_sesri( stencilWrapper.getElementSubRegionIndices() ), + m_sei( stencilWrapper.getElementIndices() ) + { } + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables + { +public: + + /** + * @brief Constructor for the stack variables + * @param[in] size size of the stencil for this connection + * @param[in] numElems number of elements for this connection + */ + GEOS_HOST_DEVICE + StackVariables( localIndex const size, localIndex numElems ) + : stencilSize( size ), + numConnectedElems( numElems ), + dofColIndices( size * numDof ), + localFlux( numElems * numEqn ), + localFluxJacobian( numElems * numEqn, size * numDof ) + {} + + // Stencil information + + /// Stencil size for a given connection + localIndex const stencilSize; + /// Number of elements connected at a given connection + localIndex const numConnectedElems; + + /// Transmissibility + real64 transmissibility[maxNumConns][numFluxSupportPoints]{}; + /// Derivatives of transmissibility with respect to pressure + real64 dTrans_dTemp[maxNumConns][numFluxSupportPoints]{}; + + // Local degrees of freedom and local residual/jacobian + + /// Indices of the matrix rows/columns corresponding to the dofs in this face + stackArray1d< globalIndex, maxNumElems * numDof > dofColIndices; + + /// Storage for the face local residual vector (all equations except volume balance) + stackArray1d< real64, maxNumElems * numEqn > localFlux; + /// Storage for the face local Jacobian matrix + stackArray2d< real64, maxNumElems * numEqn * maxStencilSize * numDof > localFluxJacobian; + }; + + + /** + * @brief Getter for the stencil size at this connection + * @param[in] iconn the connection index + * @return the size of the stencil at this connection + */ + GEOS_HOST_DEVICE + inline + localIndex stencilSize( localIndex const iconn ) const + { return m_sei[iconn].size(); } + + /** + * @brief Getter for the number of elements at this connection + * @param[in] iconn the connection index + * @return the number of elements at this connection + */ + GEOS_HOST_DEVICE + inline + localIndex numPointsInFlux( localIndex const iconn ) const + { return m_stencilWrapper.numPointsInFlux( iconn ); } + + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] iconn the connection index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const iconn, + StackVariables & stack ) const + { + // set degrees of freedom indices for this face + for( integer i = 0; i < stack.stencilSize; ++i ) + { + globalIndex const offset = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; + + for( integer jdof = 0; jdof < numDof; ++jdof ) + { + stack.dofColIndices[i * numDof + jdof] = offset + jdof; + } + } + } + + /** + * @brief Compute the local diffusion flux contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + * @param[in] diffusionFluxKernelOp the function used to customize the computation of the component fluxes + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + inline + void computeDiffusionFlux( localIndex const iconn, + StackVariables & stack, + FUNC && diffusionFluxKernelOp = NoOpFunc{} ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + // first, compute the transmissibilities at this face + m_stencilWrapper.computeWeights( iconn, + m_diffusivity, + m_dDiffusivity_dTemp, + stack.transmissibility, + stack.dTrans_dTemp ); + + + localIndex k[numFluxSupportPoints]{}; + localIndex connectionIndex = 0; + for( k[0] = 0; k[0] < stack.numConnectedElems; ++k[0] ) + { + for( k[1] = k[0] + 1; k[1] < stack.numConnectedElems; ++k[1] ) + { + /// cell indices + localIndex const seri[numFluxSupportPoints] = {m_seri( iconn, k[0] ), m_seri( iconn, k[1] )}; + localIndex const sesri[numFluxSupportPoints] = {m_sesri( iconn, k[0] ), m_sesri( iconn, k[1] )}; + localIndex const sei[numFluxSupportPoints] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; + + // clear working arrays + real64 diffusionFlux[numComp]{}; + real64 dDiffusionFlux_dP[numFluxSupportPoints][numComp]{}; + real64 dDiffusionFlux_dC[numFluxSupportPoints][numComp][numComp]{}; + real64 dDens_dC[numComp]{}; + + real64 const trans[numFluxSupportPoints] = { stack.transmissibility[connectionIndex][0], + stack.transmissibility[connectionIndex][1] }; + + //***** calculation of flux ***** + // loop over phases, compute and upwind phase flux and sum contributions to each component's flux + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + + // loop over components + for( integer ic = 0; ic < numComp; ++ic ) + { + + real64 compFracGrad = 0.0; + real64 dCompFracGrad_dP[numFluxSupportPoints]{}; + real64 dCompFracGrad_dC[numFluxSupportPoints][numComp]{}; + + // compute the component fraction gradient using the diffusion transmissibility + computeCompFractionGradient( ip, ic, + seri, sesri, sei, + trans, + compFracGrad, + dCompFracGrad_dP, + dCompFracGrad_dC ); + + // choose upstream cell for composition upwinding + localIndex const k_up = (compFracGrad >= 0) ? 0 : 1; + + localIndex const er_up = seri[k_up]; + localIndex const esr_up = sesri[k_up]; + localIndex const ei_up = sei[k_up]; + + // computation of the upwinded mass flux + real64 const upwindCoefficient = + m_referencePorosity[er_up][esr_up][ei_up] * + m_phaseDiffusivityMultiplier[er_up][esr_up][ei_up][0][ip] * + m_phaseDens[er_up][esr_up][ei_up][0][ip] * m_phaseVolFrac[er_up][esr_up][ei_up][ip]; + diffusionFlux[ic] += upwindCoefficient * compFracGrad; + + // add contributions of the derivatives of component fractions wrt pressure/component fractions + for( integer ke = 0; ke < numFluxSupportPoints; ke++ ) + { + dDiffusionFlux_dP[ke][ic] += upwindCoefficient * dCompFracGrad_dP[ke]; + for( integer jc = 0; jc < numComp; ++jc ) + { + dDiffusionFlux_dC[ke][ic][jc] += upwindCoefficient * dCompFracGrad_dC[ke][jc]; + } + } + + // add contributions of the derivatives of upwind coefficient wrt pressure/component fractions + real64 const dUpwindCoefficient_dP = + m_referencePorosity[er_up][esr_up][ei_up] * + m_phaseDiffusivityMultiplier[er_up][esr_up][ei_up][0][ip] * + ( m_dPhaseDens[er_up][esr_up][ei_up][0][ip][Deriv::dP] * m_phaseVolFrac[er_up][esr_up][ei_up][ip] + + m_phaseDens[er_up][esr_up][ei_up][0][ip] * m_dPhaseVolFrac[er_up][esr_up][ei_up][ip][Deriv::dP] ); + dDiffusionFlux_dP[k_up][ic] += dUpwindCoefficient_dP * compFracGrad; + + applyChainRule( numComp, + m_dCompFrac_dCompDens[er_up][esr_up][ei_up], + m_dPhaseDens[er_up][esr_up][ei_up][0][ip], + dDens_dC, + Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + real64 const dUpwindCoefficient_dC = + m_referencePorosity[er_up][esr_up][ei_up] * + m_phaseDiffusivityMultiplier[er_up][esr_up][ei_up][0][ip] * + ( dDens_dC[jc] * m_phaseVolFrac[er_up][esr_up][ei_up][ip] + + m_phaseDens[er_up][esr_up][ei_up][0][ip] * m_dPhaseVolFrac[er_up][esr_up][ei_up][ip][Deriv::dC+jc] ); + dDiffusionFlux_dC[k_up][ic][jc] += dUpwindCoefficient_dC * compFracGrad; + } + + // call the lambda in the phase loop to allow the reuse of the phase fluxes and their derivatives + // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase + diffusionFluxKernelOp( ip, ic, k, seri, sesri, sei, connectionIndex, + k_up, seri[k_up], sesri[k_up], sei[k_up], + compFracGrad, upwindCoefficient ); + + } // loop over components + } // loop over phases + + // add diffusion flux to local flux and local flux jacobian + addToLocalFluxAndJacobian( k, + stack, + diffusionFlux, + dDiffusionFlux_dP, + dDiffusionFlux_dC ); + + connectionIndex++; + } // loop over k[1] + } // loop over k[0] + } + + /** + * @brief Compute the local dispersion flux contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + * @param[in] dispersionFluxKernelOp the function used to customize the computation of the component fluxes + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + inline + void computeDispersionFlux( localIndex const iconn, + StackVariables & stack, + FUNC && dispersionFluxKernelOp = NoOpFunc{} ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + // first, compute the transmissibilities at this face + // note that the dispersion tensor is lagged in iteration + m_stencilWrapper.computeWeights( iconn, + m_dispersivity, + m_dispersivity, // this is just to pass something, but the resulting derivative won't be used + stack.transmissibility, + stack.dTrans_dTemp ); // will not be used + + + localIndex k[numFluxSupportPoints]{}; + localIndex connectionIndex = 0; + for( k[0] = 0; k[0] < stack.numConnectedElems; ++k[0] ) + { + for( k[1] = k[0] + 1; k[1] < stack.numConnectedElems; ++k[1] ) + { + /// cell indices + localIndex const seri[numFluxSupportPoints] = {m_seri( iconn, k[0] ), m_seri( iconn, k[1] )}; + localIndex const sesri[numFluxSupportPoints] = {m_sesri( iconn, k[0] ), m_sesri( iconn, k[1] )}; + localIndex const sei[numFluxSupportPoints] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; + + // clear working arrays + real64 dispersionFlux[numComp]{}; + real64 dDispersionFlux_dP[numFluxSupportPoints][numComp]{}; + real64 dDispersionFlux_dC[numFluxSupportPoints][numComp][numComp]{}; + real64 dDens_dC[numComp]{}; + + real64 const trans[numFluxSupportPoints] = { stack.transmissibility[connectionIndex][0], + stack.transmissibility[connectionIndex][1] }; + + //***** calculation of flux ***** + // loop over phases, compute and upwind phase flux and sum contributions to each component's flux + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + + // loop over components + for( integer ic = 0; ic < numComp; ++ic ) + { + + real64 compFracGrad = 0.0; + real64 dCompFracGrad_dP[numFluxSupportPoints]{}; + real64 dCompFracGrad_dC[numFluxSupportPoints][numComp]{}; + + // compute the component fraction gradient using the dispersion transmissibility + computeCompFractionGradient( ip, ic, + seri, sesri, sei, + trans, + compFracGrad, + dCompFracGrad_dP, + dCompFracGrad_dC ); + + // choose upstream cell for composition upwinding + localIndex const k_up = (compFracGrad >= 0) ? 0 : 1; + + localIndex const er_up = seri[k_up]; + localIndex const esr_up = sesri[k_up]; + localIndex const ei_up = sei[k_up]; + + // computation of the upwinded mass flux + dispersionFlux[ic] += m_phaseDens[er_up][esr_up][ei_up][0][ip] * compFracGrad; + + // add contributions of the derivatives of component fractions wrt pressure/component fractions + for( integer ke = 0; ke < numFluxSupportPoints; ke++ ) + { + dDispersionFlux_dP[ke][ic] += m_phaseDens[er_up][esr_up][ei_up][0][ip] * dCompFracGrad_dP[ke]; + for( integer jc = 0; jc < numComp; ++jc ) + { + dDispersionFlux_dC[ke][ic][jc] += m_phaseDens[er_up][esr_up][ei_up][0][ip] * dCompFracGrad_dC[ke][jc]; + } + } + + // add contributions of the derivatives of upwind coefficient wrt pressure/component fractions + dDispersionFlux_dP[k_up][ic] += m_dPhaseDens[er_up][esr_up][ei_up][0][ip][Deriv::dP] * compFracGrad; + + applyChainRule( numComp, + m_dCompFrac_dCompDens[er_up][esr_up][ei_up], + m_dPhaseDens[er_up][esr_up][ei_up][0][ip], + dDens_dC, + Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + dDispersionFlux_dC[k_up][ic][jc] += dDens_dC[jc] * compFracGrad; + } + + // call the lambda in the phase loop to allow the reuse of the phase fluxes and their derivatives + // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase + dispersionFluxKernelOp( ip, ic, k, seri, sesri, sei, connectionIndex, + k_up, seri[k_up], sesri[k_up], sei[k_up], + compFracGrad ); + + } // loop over components + } // loop over phases + + // add dispersion flux to local flux and local flux jacobian + addToLocalFluxAndJacobian( k, + stack, + dispersionFlux, + dDispersionFlux_dP, + dDispersionFlux_dC ); + + connectionIndex++; + } // loop over k[1] + } // loop over k[0] + } + + /** + * @brief Compute the component fraction gradient at this interface + * @param[in] ip the phase index + * @param[in] ic the component index + * @param[in] seri the region indices + * @param[in] sesri the subregion indices + * @param[in] sei the element indices + * @param[out] compFracGrad the component fraction gradient + * @param[out] dCompFracGrad_dP the derivatives of the component fraction gradient wrt pressure + * @param[out] dCompFracGrad_dC the derivatives of the component fraction gradient wrt component densities + */ + GEOS_HOST_DEVICE + inline + void computeCompFractionGradient( integer const ip, + integer const ic, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + real64 const (&trans)[numFluxSupportPoints], + real64 & compFracGrad, + real64 (& dCompFracGrad_dP)[numFluxSupportPoints], + real64 (& dCompFracGrad_dC)[numFluxSupportPoints][numComp] ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + real64 dCompFrac_dC[numComp]{}; + + for( integer i = 0; i < numFluxSupportPoints; i++ ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + compFracGrad += trans[i] * m_phaseCompFrac[er][esr][ei][0][ip][ic]; + dCompFracGrad_dP[i] += trans[i] * m_dPhaseCompFrac[er][esr][ei][0][ip][ic][Deriv::dP]; + + applyChainRule( numComp, + m_dCompFrac_dCompDens[er][esr][ei], + m_dPhaseCompFrac[er][esr][ei][0][ip][ic], + dCompFrac_dC, + Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + dCompFracGrad_dC[i][jc] += trans[i] * dCompFrac_dC[jc]; + } + } + } + + /** + * @brief Add the local diffusion/dispersion flux contributions to the residual and Jacobian + * @param[in] k the cell indices + * @param[in] stack the stack variables + * @param[in] flux the diffusion/dispersion flux + * @param[in] dFlux_dP the derivative of the diffusion/dispersion flux wrt pressure + * @param[in] dFlux_dC the derivative of the diffusion/dispersion flux wrt compositions + */ + GEOS_HOST_DEVICE + inline + void addToLocalFluxAndJacobian( localIndex const (&k)[numFluxSupportPoints], + StackVariables & stack, + real64 const (&flux)[numComp], + real64 const (&dFlux_dP)[numFluxSupportPoints][numComp], + real64 const (&dFlux_dC)[numFluxSupportPoints][numComp][numComp] ) const + { + // loop over components + for( integer ic = 0; ic < numComp; ++ic ) + { + // finally, increment local flux and local Jacobian + integer const eqIndex0 = k[0] * numEqn + ic; + integer const eqIndex1 = k[1] * numEqn + ic; + + stack.localFlux[eqIndex0] += m_dt * flux[ic]; + stack.localFlux[eqIndex1] -= m_dt * flux[ic]; + + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + localIndex const localDofIndexPres = k[ke] * numDof; + stack.localFluxJacobian[eqIndex0][localDofIndexPres] += m_dt * dFlux_dP[ke][ic]; + stack.localFluxJacobian[eqIndex1][localDofIndexPres] -= m_dt * dFlux_dP[ke][ic]; + + for( integer jc = 0; jc < numComp; ++jc ) + { + localIndex const localDofIndexComp = localDofIndexPres + jc + 1; + stack.localFluxJacobian[eqIndex0][localDofIndexComp] += m_dt * dFlux_dC[ke][ic][jc]; + stack.localFluxJacobian[eqIndex1][localDofIndexComp] -= m_dt * dFlux_dC[ke][ic][jc]; + } + } + } + } + + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + inline + void complete( localIndex const iconn, + StackVariables & stack, + FUNC && assemblyKernelOp = NoOpFunc{} ) const + { + using namespace compositionalMultiphaseUtilities; + + if( m_kernelFlags.isSet( KernelFlags::TotalMassEquation ) ) + { + // Apply equation/variable change transformation(s) + stackArray1d< real64, maxStencilSize * numDof > work( stack.stencilSize * numDof ); + shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComp, numEqn, numDof*stack.stencilSize, stack.numConnectedElems, + stack.localFluxJacobian, work ); + shiftBlockElementsAheadByOneAndReplaceFirstElementWithSum( numComp, numEqn, stack.numConnectedElems, + stack.localFlux ); + } + + // add contribution to residual and jacobian into: + // - the component mass balance equations (i = 0 to i = numComp-1) + // note that numDof includes derivatives wrt temperature if this class is derived in ThermalKernels + for( integer i = 0; i < stack.numConnectedElems; ++i ) + { + if( m_ghostRank[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )] < 0 ) + { + globalIndex const globalRow = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; + localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - m_rankOffset ); + GEOS_ASSERT_GE( localRow, 0 ); + GEOS_ASSERT_GT( m_localMatrix.numRows(), localRow + numComp ); + + for( integer ic = 0; ic < numComp; ++ic ) + { + RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[localRow + ic], stack.localFlux[i * numEqn + ic] ); + m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > + ( localRow + ic, + stack.dofColIndices.data(), + stack.localFluxJacobian[i * numEqn + ic].dataIfContiguous(), + stack.stencilSize * numDof ); + } + + // call the lambda to assemble additional terms, such as thermal terms + assemblyKernelOp( i, localRow ); + } + } + } + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numConnections the number of connections + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numConnections, + integer const hasDiffusion, + integer const hasDispersion, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + forAll< POLICY >( numConnections, [=] GEOS_HOST_DEVICE ( localIndex const iconn ) + { + typename KERNEL_TYPE::StackVariables stack( kernelComponent.stencilSize( iconn ), + kernelComponent.numPointsInFlux( iconn ) ); + + kernelComponent.setup( iconn, stack ); + if( hasDiffusion ) + { + kernelComponent.computeDiffusionFlux( iconn, stack ); + } + if( hasDispersion ) + { + kernelComponent.computeDispersionFlux( iconn, stack ); + } + kernelComponent.complete( iconn, stack ); + } ); + } + +protected: + + /// Views on phase volume fraction + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const m_phaseVolFrac; + + /// Views on phase densities + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseDens; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseDens; + + /// Views on diffusivity + ElementViewConst< arrayView3d< real64 const > > const m_diffusivity; + ElementViewConst< arrayView3d< real64 const > > const m_dDiffusivity_dTemp; + ElementViewConst< arrayView3d< real64 const > > const m_phaseDiffusivityMultiplier; + + /// Views on dispersivity + ElementViewConst< arrayView3d< real64 const > > const m_dispersivity; + + /// View on the reference porosity + ElementViewConst< arrayView1d< real64 const > > const m_referencePorosity; + + // Stencil information + + /// Reference to the stencil wrapper + STENCILWRAPPER const m_stencilWrapper; + + /// Connection to element maps + typename STENCILWRAPPER::IndexContainerViewConstType const m_seri; + typename STENCILWRAPPER::IndexContainerViewConstType const m_sesri; + typename STENCILWRAPPER::IndexContainerViewConstType const m_sei; + +}; + +/** + * @class DiffusionDispersionFluxComputeKernelFactory + */ +class DiffusionDispersionFluxComputeKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @param[in] numComps the number of fluid components + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] hasDiffusion flag specifying whether diffusion is used or not + * @param[in] hasDispersion flag specifying whether dispersion is used or not + * @param[in] solverName the name of the solver + * @param[in] elemManager reference to the element region manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY, typename STENCILWRAPPER > + static void + createAndLaunch( integer const numComps, + integer const numPhases, + globalIndex const rankOffset, + string const & dofKey, + integer const hasDiffusion, + integer const hasDispersion, + integer const useTotalMassEquation, + string const & solverName, + ElementRegionManager const & elemManager, + STENCILWRAPPER const & stencilWrapper, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) + { + integer constexpr NUM_COMP = NC(); + integer constexpr NUM_DOF = NC() + 1; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + BitFlags< KernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( KernelFlags::TotalMassEquation ); + + using kernelType = DiffusionDispersionFluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; + typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); + typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); + typename kernelType::DiffusionAccessors diffusionAccessors( elemManager, solverName ); + typename kernelType::DispersionAccessors dispersionAccessors( elemManager, solverName ); + typename kernelType::PorosityAccessors porosityAccessors( elemManager, solverName ); + + kernelType kernel( numPhases, rankOffset, stencilWrapper, + dofNumberAccessor, compFlowAccessors, multiFluidAccessors, + diffusionAccessors, dispersionAccessors, porosityAccessors, + dt, localMatrix, localRhs, kernelFlags ); + kernelType::template launch< POLICY >( stencilWrapper.size(), + hasDiffusion, hasDispersion, + kernel ); + } ); + } +}; + +} // namespace isothermalCompositionalMultiphaseFVMKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_DIFFUSIONDISPERSIONFLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp new file mode 100644 index 00000000000..420d8538f1b --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp @@ -0,0 +1,558 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 DirichletFluxComputeKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_DIRICHLETFLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_DIRICHLETFLUXCOMPUTEKERNEL_HPP + +#include "codingUtilities/Utilities.hpp" +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "constitutive/fluid/multifluid/MultiFluidSelector.hpp" +#include "finiteVolume/BoundaryStencil.hpp" +#include "mesh/ElementRegionManager.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" +#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" + + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseFVMKernels +{ + +/******************************** DirichletFluxComputeKernel ********************************/ + +/** + * @class DirichletFluxComputeKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_DOF number of degrees of freedom + * @tparam FLUIDWRAPPER the type of the fluid wrapper + * @brief Define the interface for the assembly kernel in charge of Dirichlet face flux terms + */ +template< integer NUM_COMP, integer NUM_DOF, typename FLUIDWRAPPER > +class DirichletFluxComputeKernel : public FluxComputeKernel< NUM_COMP, + NUM_DOF, + BoundaryStencilWrapper > +{ +public: + + /** + * @brief The type for element-based data. Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewConstAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernelBase; + using DofNumberAccessor = AbstractBase::DofNumberAccessor; + using CompFlowAccessors = AbstractBase::CompFlowAccessors; + using MultiFluidAccessors = AbstractBase::MultiFluidAccessors; + using CapPressureAccessors = AbstractBase::CapPressureAccessors; + using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; + + using AbstractBase::m_dt; + using AbstractBase::m_numPhases; + using AbstractBase::m_rankOffset; + using AbstractBase::m_dofNumber; + using AbstractBase::m_ghostRank; + using AbstractBase::m_gravCoef; + using AbstractBase::m_pres; + using AbstractBase::m_phaseCompFrac; + using AbstractBase::m_dPhaseCompFrac; + using AbstractBase::m_dCompFrac_dCompDens; + using AbstractBase::m_localMatrix; + using AbstractBase::m_localRhs; + using AbstractBase::m_kernelFlags; + + using Base = isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernel< NUM_COMP, NUM_DOF, BoundaryStencilWrapper >; + using Base::numComp; + using Base::numDof; + using Base::numEqn; + using Base::m_stencilWrapper; + using Base::m_phaseMob; + using Base::m_dPhaseMob; + using Base::m_phaseMassDens; + using Base::m_dPhaseMassDens; + using Base::m_permeability; + using Base::m_dPerm_dPres; + using Base::m_seri; + using Base::m_sesri; + using Base::m_sei; + + /** + * @brief Constructor for the kernel interface + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] faceManager the face manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] fluidWrapper reference to the fluid wrapper + * @param[in] dofNumberAccessor + * @param[in] compFlowAccessors + * @param[in] multiFluidAccessors + * @param[in] capPressureAccessors + * @param[in] permeabilityAccessors + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + * @param[in] kernelFlags flags packed together + */ + DirichletFluxComputeKernel( integer const numPhases, + globalIndex const rankOffset, + FaceManager const & faceManager, + BoundaryStencilWrapper const & stencilWrapper, + FLUIDWRAPPER const & fluidWrapper, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + CapPressureAccessors const & capPressureAccessors, + PermeabilityAccessors const & permeabilityAccessors, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< KernelFlags > kernelFlags ) + : Base( numPhases, + rankOffset, + stencilWrapper, + dofNumberAccessor, + compFlowAccessors, + multiFluidAccessors, + capPressureAccessors, + permeabilityAccessors, + dt, + localMatrix, + localRhs, + kernelFlags ), + m_facePres( faceManager.getField< fields::flow::facePressure >() ), + m_faceTemp( faceManager.getField< fields::flow::faceTemperature >() ), + m_faceCompFrac( faceManager.getField< fields::flow::faceGlobalCompFraction >() ), + m_faceGravCoef( faceManager.getField< fields::flow::gravityCoefficient >() ), + m_fluidWrapper( fluidWrapper ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables + { +public: + + /** + * @brief Constructor for the stack variables + * @param[in] size size of the stencil for this connection + * @param[in] numElems number of elements for this connection + */ + GEOS_HOST_DEVICE + StackVariables( localIndex const GEOS_UNUSED_PARAM( size ), + localIndex GEOS_UNUSED_PARAM( numElems )) {} + + // Transmissibility + real64 transmissibility = 0.0; + + // Component fluxes and derivatives + + /// Component fluxes + real64 compFlux[numComp]{}; + /// Derivatives of component fluxes wrt pressure + real64 dCompFlux_dP[numComp]{}; + /// Derivatives of component fluxes wrt component densities + real64 dCompFlux_dC[numComp][numComp]{}; + + // Local degrees of freedom and local residual/jacobian + + /// Indices of the matrix rows/columns corresponding to the dofs in this face + globalIndex dofColIndices[numDof]{}; + + /// Storage for the face local residual vector + real64 localFlux[numEqn]{}; + /// Storage for the face local Jacobian matrix + real64 localFluxJacobian[numEqn][numDof]{}; + + }; + + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] iconn the connection index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + void setup( localIndex const iconn, + StackVariables & stack ) const + { + globalIndex const offset = + m_dofNumber[m_seri( iconn, BoundaryStencil::Order::ELEM )][m_sesri( iconn, BoundaryStencil::Order::ELEM )][m_sei( iconn, BoundaryStencil::Order::ELEM )]; + + for( integer jdof = 0; jdof < numDof; ++jdof ) + { + stack.dofColIndices[jdof] = offset + jdof; + } + } + + + /** + * @brief Compute the local Dirichlet face flux contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void computeFlux( localIndex const iconn, + StackVariables & stack, + FUNC && compFluxKernelOp = NoOpFunc{} ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + using Order = BoundaryStencil::Order; + + localIndex const er = m_seri( iconn, Order::ELEM ); + localIndex const esr = m_sesri( iconn, Order::ELEM ); + localIndex const ei = m_sei( iconn, Order::ELEM ); + localIndex const kf = m_sei( iconn, Order::FACE ); + + // Step 1: compute the transmissibility at the boundary face + + real64 dTrans_dPerm[3]{}; + m_stencilWrapper.computeWeights( iconn, + m_permeability, + stack.transmissibility, + dTrans_dPerm ); + real64 const dTrans_dPres = LvArray::tensorOps::AiBi< 3 >( dTrans_dPerm, m_dPerm_dPres[er][esr][ei][0] ); + + // Step 2: compute the fluid properties on the face + // This is needed to get the phase mass density and the phase comp fraction at the face + // Because we approximate the face mobility using the total element mobility + + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseFrac( 1, 1, m_numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseDens( 1, 1, m_numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseMassDens( 1, 1, m_numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseVisc( 1, 1, m_numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseEnthalpy( 1, 1, m_numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseInternalEnergy( 1, 1, m_numPhases ); + StackArray< real64, 4, constitutive::MultiFluidBase::MAX_NUM_PHASES * NUM_COMP, + constitutive::multifluid::LAYOUT_PHASE_COMP > facePhaseCompFrac( 1, 1, m_numPhases, NUM_COMP ); + real64 faceTotalDens = 0.0; + + constitutive::MultiFluidBase::KernelWrapper::computeValues( m_fluidWrapper, + m_facePres[kf], + m_faceTemp[kf], + m_faceCompFrac[kf], + facePhaseFrac[0][0], + facePhaseDens[0][0], + facePhaseMassDens[0][0], + facePhaseVisc[0][0], + facePhaseEnthalpy[0][0], + facePhaseInternalEnergy[0][0], + facePhaseCompFrac[0][0], + faceTotalDens ); + + // Step 3: loop over phases, compute and upwind phase flux and sum contributions to each component's flux + + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + + // working variables + real64 dDensMean_dC[numComp]{}; + real64 dF_dC[numComp]{}; + real64 dProp_dC[numComp]{}; + + real64 phaseFlux = 0.0; // for the lambda + real64 dPhaseFlux_dP = 0.0; + real64 dPhaseFlux_dC[numComp]{}; + + + // Step 3.1: compute the average phase mass density at the face + + applyChainRule( numComp, + m_dCompFrac_dCompDens[er][esr][ei], + m_dPhaseMassDens[er][esr][ei][0][ip], + dProp_dC, + Deriv::dC ); + + // average density and derivatives + real64 const densMean = 0.5 * ( m_phaseMassDens[er][esr][ei][0][ip] + facePhaseMassDens[0][0][ip] ); + real64 const dDensMean_dP = 0.5 * m_dPhaseMassDens[er][esr][ei][0][ip][Deriv::dP]; + for( integer jc = 0; jc < numComp; ++jc ) + { + dDensMean_dC[jc] = 0.5 * dProp_dC[jc]; + } + + + // Step 3.2: compute the (TPFA) potential difference at the face + + real64 const gravTimesDz = m_gravCoef[er][esr][ei] - m_faceGravCoef[kf]; + real64 const potDif = m_pres[er][esr][ei] - m_facePres[kf] - densMean * gravTimesDz; + real64 const f = stack.transmissibility * potDif; + real64 const dF_dP = stack.transmissibility * ( 1.0 - dDensMean_dP * gravTimesDz ) + dTrans_dPres * potDif; + for( integer jc = 0; jc < numComp; ++jc ) + { + dF_dC[jc] = -stack.transmissibility * dDensMean_dC[jc] * gravTimesDz; + } + + // Step 3.3: computation of the mobility + // We do that before the if/else statement to be able to pass it to the compFluxOpKernel + + // recomputing the exact mobility at the face would be quite complex, as it would require: + // 1) computing the saturation + // 2) computing the relperm + // 3) computing the mobility as \lambda_p = \rho_p kr_p( S_p ) / \mu_p + // the second step in particular would require yet another dispatch to get the relperm model + // so, for simplicity, we approximate the face mobility as + // \lambda^approx_p = \rho_p S_p / \mu_p + // = \rho_p ( (nu_p / rho_p) * rho_t ) / \mu_p (plugging the expression of saturation) + // = \nu_p * rho_t / \mu_p + // fortunately, we don't need the derivatives + real64 const facePhaseMob = ( facePhaseFrac[0][0][ip] > 0.0 ) + ? facePhaseFrac[0][0][ip] * faceTotalDens / facePhaseVisc[0][0][ip] + : 0.0; + + // *** upwinding *** + // Step 3.4: upwinding based on the sign of the phase potential gradient + // It is easier to hard-code the if/else because it is difficult to address elem and face variables in a uniform way + + if( potDif >= 0 ) // the element is upstream + { + + // compute the phase flux and derivatives using the element mobility + phaseFlux = m_phaseMob[er][esr][ei][ip] * f; + dPhaseFlux_dP = m_phaseMob[er][esr][ei][ip] * dF_dP + m_dPhaseMob[er][esr][ei][ip][Deriv::dP] * f; + for( integer jc = 0; jc < numComp; ++jc ) + { + dPhaseFlux_dC[jc] = + m_phaseMob[er][esr][ei][ip] * dF_dC[jc] + m_dPhaseMob[er][esr][ei][ip][Deriv::dC+jc] * f; + } + + // slice some constitutive arrays to avoid too much indexing in component loop + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP-3 > phaseCompFracSub = + m_phaseCompFrac[er][esr][ei][0][ip]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC-3 > dPhaseCompFracSub = + m_dPhaseCompFrac[er][esr][ei][0][ip]; + + // compute component fluxes and derivatives using element composition + for( integer ic = 0; ic < numComp; ++ic ) + { + real64 const ycp = phaseCompFracSub[ic]; + stack.compFlux[ic] += phaseFlux * ycp; + stack.dCompFlux_dP[ic] += dPhaseFlux_dP * ycp + phaseFlux * dPhaseCompFracSub[ic][Deriv::dP]; + + applyChainRule( numComp, + m_dCompFrac_dCompDens[er][esr][ei], + dPhaseCompFracSub[ic], + dProp_dC, + Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + stack.dCompFlux_dC[ic][jc] += dPhaseFlux_dC[jc] * ycp + phaseFlux * dProp_dC[jc]; + } + } + + } + else // the face is upstream + { + + // compute the phase flux and derivatives using the approximated face mobility + // we only have to take derivatives of the potential gradient in this case + phaseFlux = facePhaseMob * f; + dPhaseFlux_dP = facePhaseMob * dF_dP; + for( integer jc = 0; jc < numComp; ++jc ) + { + dPhaseFlux_dC[jc] = facePhaseMob * dF_dC[jc]; + } + + // compute component fluxes and derivatives using the face composition + for( integer ic = 0; ic < numComp; ++ic ) + { + real64 const ycp = facePhaseCompFrac[0][0][ip][ic]; + stack.compFlux[ic] += phaseFlux * ycp; + stack.dCompFlux_dP[ic] += dPhaseFlux_dP * ycp; + for( integer jc = 0; jc < numComp; ++jc ) + { + stack.dCompFlux_dC[ic][jc] += dPhaseFlux_dC[jc] * ycp; + } + } + } + + // call the lambda in the phase loop to allow the reuse of the phase fluxes and their derivatives + // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase + compFluxKernelOp( ip, er, esr, ei, kf, f, + facePhaseMob, facePhaseEnthalpy[0][0], facePhaseCompFrac[0][0], + phaseFlux, dPhaseFlux_dP, dPhaseFlux_dC ); + + } + + // *** end of upwinding + + // Step 4: populate local flux vector and derivatives + for( integer ic = 0; ic < numComp; ++ic ) + { + stack.localFlux[ic] = m_dt * stack.compFlux[ic]; + stack.localFluxJacobian[ic][0] = m_dt * stack.dCompFlux_dP[ic]; + for( integer jc = 0; jc < numComp; ++jc ) + { + stack.localFluxJacobian[ic][jc+1] = m_dt * stack.dCompFlux_dC[ic][jc]; + } + } + } + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void complete( localIndex const iconn, + StackVariables & stack, + FUNC && assemblyKernelOp = NoOpFunc{} ) const + { + using namespace compositionalMultiphaseUtilities; + using Order = BoundaryStencil::Order; + + if( AbstractBase::m_kernelFlags.isSet( KernelFlags::TotalMassEquation ) ) + { + // Apply equation/variable change transformation(s) + real64 work[numDof]{}; + shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComp, numDof, stack.localFluxJacobian, work ); + shiftElementsAheadByOneAndReplaceFirstElementWithSum( numComp, stack.localFlux ); + } + + // add contribution to residual and jacobian into: + // - the component mass balance equations (i = 0 to i = numComp-1) + // note that numDof includes derivatives wrt temperature if this class is derived in ThermalKernels + if( m_ghostRank[m_seri( iconn, Order::ELEM )][m_sesri( iconn, Order::ELEM )][m_sei( iconn, Order::ELEM )] < 0 ) + { + globalIndex const globalRow = m_dofNumber[m_seri( iconn, Order::ELEM )][m_sesri( iconn, Order::ELEM )][m_sei( iconn, Order::ELEM )]; + localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - m_rankOffset ); + GEOS_ASSERT_GE( localRow, 0 ); + GEOS_ASSERT_GT( AbstractBase::m_localMatrix.numRows(), localRow + numComp ); + + for( integer ic = 0; ic < numComp; ++ic ) + { + RAJA::atomicAdd( parallelDeviceAtomic{}, &AbstractBase::m_localRhs[localRow + ic], stack.localFlux[ic] ); + AbstractBase::m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > + ( localRow + ic, + stack.dofColIndices, + stack.localFluxJacobian[ic], + numDof ); + } + + // call the lambda to assemble additional terms, such as thermal terms + assemblyKernelOp( localRow ); + } + } + +protected: + + /// Views on face pressure, temperature, and composition + arrayView1d< real64 const > const m_facePres; + arrayView1d< real64 const > const m_faceTemp; + arrayView2d< real64 const, compflow::USD_COMP > const m_faceCompFrac; + + /// View on the face gravity coefficient + arrayView1d< real64 const > const m_faceGravCoef; + + /// Reference to the fluid wrapper + FLUIDWRAPPER const m_fluidWrapper; + +}; + + +/** + * @class DirichletFluxComputeKernelFactory + */ +class DirichletFluxComputeKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComps the number of fluid components + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] solverName name of the solver (to name accessors) + * @param[in] faceManager reference to the face manager + * @param[in] elemManager reference to the element region manager + * @param[in] stencilWrapper reference to the boundary stencil wrapper + * @param[in] fluidBase the multifluid constitutive model + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComps, + integer const numPhases, + globalIndex const rankOffset, + integer const useTotalMassEquation, + string const & dofKey, + string const & solverName, + FaceManager const & faceManager, + ElementRegionManager const & elemManager, + BoundaryStencilWrapper const & stencilWrapper, + constitutive::MultiFluidBase & fluidBase, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + constitutive::constitutiveComponentUpdatePassThru( fluidBase, numComps, [&]( auto & fluid, auto NC ) + { + using FluidType = TYPEOFREF( fluid ); + typename FluidType::KernelWrapper const fluidWrapper = fluid.createKernelWrapper(); + + integer constexpr NUM_COMP = NC(); + integer constexpr NUM_DOF = NC() + 1; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + // for now, we neglect capillary pressure in the kernel + BitFlags< KernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( KernelFlags::TotalMassEquation ); + + using kernelType = DirichletFluxComputeKernel< NUM_COMP, NUM_DOF, typename FluidType::KernelWrapper >; + typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); + typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); + typename kernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); + typename kernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); + + kernelType kernel( numPhases, rankOffset, faceManager, stencilWrapper, fluidWrapper, + dofNumberAccessor, compFlowAccessors, multiFluidAccessors, capPressureAccessors, permeabilityAccessors, + dt, localMatrix, localRhs, kernelFlags ); + kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); + } ); + } +}; + +} // namespace isothermalCompositionalMultiphaseFVMKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_DIRICHLETFLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp similarity index 86% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationCompositionalMultiphaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp index 7a316a92355..1b4183c8c1a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp @@ -14,13 +14,14 @@ */ /** - * @file DissipationCompositionalMultiphaseFVMKernels.hpp + * @file DissipationFluxComputeKernel.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_DISSIPATIONCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_DISSIPATIONCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_DISSIPATIONFLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_DISSIPATIONFLUXCOMPUTEKERNEL_HPP -#include "IsothermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "constitutive/solid/porosity/PorosityBase.hpp" #include "constitutive/solid/porosity/PorosityFields.hpp" @@ -34,17 +35,17 @@ static constexpr integer newtonContinuationCutoffIteration = 5; static constexpr real64 initialDirectionalCoef = 100; static constexpr real64 multiplierDirectionalCoef = 1000; -/******************************** FaceBasedAssemblyKernel ********************************/ +/******************************** FluxComputeKernel ********************************/ /** - * @class FaceBasedAssemblyKernel + * @class FluxComputeKernel * @tparam NUM_COMP number of fluid components * @tparam NUM_DOF number of degrees of freedom * @tparam STENCILWRAPPER the type of the stencil wrapper * @brief Define the interface for the assembly kernel in charge of flux terms */ template< integer NUM_COMP, integer NUM_DOF, typename STENCILWRAPPER > -class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER > +class FluxComputeKernel : public isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER > { public: @@ -57,7 +58,7 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne template< typename VIEWTYPE > using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelBase; + using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernelBase; using DofNumberAccessor = AbstractBase::DofNumberAccessor; using CompFlowAccessors = AbstractBase::CompFlowAccessors; using MultiFluidAccessors = AbstractBase::MultiFluidAccessors; @@ -68,7 +69,7 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne using AbstractBase::m_gravCoef; using AbstractBase::m_dCompFrac_dCompDens; - using Base = isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; + using Base = isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; using Base::numComp; using Base::numDof; using Base::numEqn; @@ -110,26 +111,26 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne * @param[in] kappamin minimum value for kappa coefficient in DBC * @param[in] contMultiplier continuation multiplier factor (should be < 1) */ - FaceBasedAssemblyKernel( integer const numPhases, - globalIndex const rankOffset, - STENCILWRAPPER const & stencilWrapper, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - DissCompFlowAccessors const & dissCompFlowAccessors, - MultiFluidAccessors const & multiFluidAccessors, - CapPressureAccessors const & capPressureAccessors, - PermeabilityAccessors const & permeabilityAccessors, - PorosityAccessors const & porosityAccessors, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags, - real64 const omega, - integer const curNewton, - integer const continuation, - integer const miscible, - real64 const kappamin, - real64 const contMultiplier ) + FluxComputeKernel( integer const numPhases, + globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + DissCompFlowAccessors const & dissCompFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + CapPressureAccessors const & capPressureAccessors, + PermeabilityAccessors const & permeabilityAccessors, + PorosityAccessors const & porosityAccessors, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< isothermalCompositionalMultiphaseFVMKernels::KernelFlags > kernelFlags, + real64 const omega, + integer const curNewton, + integer const continuation, + integer const miscible, + real64 const kappamin, + real64 const contMultiplier ) : Base( numPhases, rankOffset, stencilWrapper, @@ -319,9 +320,9 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne }; /** - * @class FaceBasedAssemblyKernelFactory + * @class FluxComputeKernelFactory */ -class FaceBasedAssemblyKernelFactory +class FluxComputeKernelFactory { public: @@ -372,13 +373,13 @@ class FaceBasedAssemblyKernelFactory elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags; + BitFlags< isothermalCompositionalMultiphaseFVMKernels::KernelFlags > kernelFlags; if( hasCapPressure ) - kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags::CapPressure ); + kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::KernelFlags::CapPressure ); if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags::TotalMassEquation ); + kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::KernelFlags::TotalMassEquation ); - using KERNEL_TYPE = FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; + using KERNEL_TYPE = FluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; typename KERNEL_TYPE::CompFlowAccessors compFlowAccessors( elemManager, solverName ); typename KERNEL_TYPE::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); typename KERNEL_TYPE::CapPressureAccessors capPressureAccessors( elemManager, solverName ); @@ -399,4 +400,4 @@ class FaceBasedAssemblyKernelFactory } // namespace geos -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_DISSIPATIONCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_DISSIPATIONFLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluidUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluidUpdateKernel.hpp new file mode 100644 index 00000000000..9389da529de --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluidUpdateKernel.hpp @@ -0,0 +1,77 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 FluidUpdateKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_FLUIDUPDATEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_FLUIDUPDATEKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace thermalCompositionalMultiphaseBaseKernels +{ + +/******************************** FluidUpdateKernel ********************************/ + +struct FluidUpdateKernel +{ + template< typename POLICY, typename FLUID_WRAPPER > + static void + launch( localIndex const size, + FLUID_WRAPPER const & fluidWrapper, + arrayView1d< real64 const > const & pres, + arrayView1d< real64 const > const & temp, + arrayView2d< real64 const, compflow::USD_COMP > const & compFrac ) + { + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + for( localIndex q = 0; q < fluidWrapper.numGauss(); ++q ) + { + fluidWrapper.update( k, q, pres[k], temp[k], compFrac[k] ); + } + } ); + } + + template< typename POLICY, typename FLUID_WRAPPER > + static void + launch( SortedArrayView< localIndex const > const & targetSet, + FLUID_WRAPPER const & fluidWrapper, + arrayView1d< real64 const > const & pres, + arrayView1d< real64 const > const & temp, + arrayView2d< real64 const, compflow::USD_COMP > const & compFrac ) + { + forAll< POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + localIndex const k = targetSet[a]; + for( localIndex q = 0; q < fluidWrapper.numGauss(); ++q ) + { + fluidWrapper.update( k, q, pres[k], temp[k], compFrac[k] ); + } + } ); + } +}; + +} // namespace thermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEBASEKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp new file mode 100644 index 00000000000..d28ecf41b41 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp @@ -0,0 +1,575 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 FluxComputeKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_FLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_FLUXCOMPUTEKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp" + +#include "codingUtilities/Utilities.hpp" +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" +#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseFVMKernels +{ + +/** + * @class FluxComputeKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_DOF number of degrees of freedom + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @brief Define the interface for the assembly kernel in charge of flux terms + */ +template< integer NUM_COMP, integer NUM_DOF, typename STENCILWRAPPER > +class FluxComputeKernel : public FluxComputeKernelBase +{ +public: + + /// Compile time value for the number of components + static constexpr integer numComp = NUM_COMP; + + /// Compute time value for the number of degrees of freedom + static constexpr integer numDof = NUM_DOF; + + /// Compute time value for the number of equations (all of them, except the volume balance equation) + static constexpr integer numEqn = NUM_DOF-1; + + /// Maximum number of elements at the face + static constexpr localIndex maxNumElems = STENCILWRAPPER::maxNumPointsInFlux; + + /// Maximum number of connections at the face + static constexpr localIndex maxNumConns = STENCILWRAPPER::maxNumConnections; + + /// Maximum number of points in the stencil + static constexpr localIndex maxStencilSize = STENCILWRAPPER::maxStencilSize; + + /// Number of flux support points (hard-coded for TFPA) + static constexpr integer numFluxSupportPoints = 2; + + /** + * @brief Constructor for the kernel interface + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dofNumberAccessor + * @param[in] compFlowAccessors + * @param[in] multiFluidAccessors + * @param[in] capPressureAccessors + * @param[in] permeabilityAccessors + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + * @param[in] kernelFlags flags packed together + */ + FluxComputeKernel( integer const numPhases, + globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + CapPressureAccessors const & capPressureAccessors, + PermeabilityAccessors const & permeabilityAccessors, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< KernelFlags > kernelFlags ) + : FluxComputeKernelBase( numPhases, + rankOffset, + dofNumberAccessor, + compFlowAccessors, + multiFluidAccessors, + dt, + localMatrix, + localRhs, + kernelFlags ), + m_permeability( permeabilityAccessors.get( fields::permeability::permeability {} ) ), + m_dPerm_dPres( permeabilityAccessors.get( fields::permeability::dPerm_dPressure {} ) ), + m_phaseMob( compFlowAccessors.get( fields::flow::phaseMobility {} ) ), + m_dPhaseMob( compFlowAccessors.get( fields::flow::dPhaseMobility {} ) ), + m_phaseMassDens( multiFluidAccessors.get( fields::multifluid::phaseMassDensity {} ) ), + m_dPhaseMassDens( multiFluidAccessors.get( fields::multifluid::dPhaseMassDensity {} ) ), + m_phaseCapPressure( capPressureAccessors.get( fields::cappres::phaseCapPressure {} ) ), + m_dPhaseCapPressure_dPhaseVolFrac( capPressureAccessors.get( fields::cappres::dPhaseCapPressure_dPhaseVolFraction {} ) ), + m_stencilWrapper( stencilWrapper ), + m_seri( stencilWrapper.getElementRegionIndices() ), + m_sesri( stencilWrapper.getElementSubRegionIndices() ), + m_sei( stencilWrapper.getElementIndices() ) + { } + + /** + * @struct StackVariables + * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack + */ + struct StackVariables + { +public: + + /** + * @brief Constructor for the stack variables + * @param[in] size size of the stencil for this connection + * @param[in] numElems number of elements for this connection + */ + GEOS_HOST_DEVICE + StackVariables( localIndex const size, localIndex numElems ) + : stencilSize( size ), + numConnectedElems( numElems ), + dofColIndices( size * numDof ), + localFlux( numElems * numEqn ), + localFluxJacobian( numElems * numEqn, size * numDof ) + {} + + // Stencil information + + /// Stencil size for a given connection + localIndex const stencilSize; + /// Number of elements connected at a given connection + localIndex const numConnectedElems; + + // Transmissibility and derivatives + + /// Transmissibility + real64 transmissibility[maxNumConns][numFluxSupportPoints]{}; + /// Derivatives of transmissibility with respect to pressure + real64 dTrans_dPres[maxNumConns][numFluxSupportPoints]{}; + + // Local degrees of freedom and local residual/jacobian + + /// Indices of the matrix rows/columns corresponding to the dofs in this face + stackArray1d< globalIndex, maxNumElems * numDof > dofColIndices; + + /// Storage for the face local residual vector (all equations except volume balance) + stackArray1d< real64, maxNumElems * numEqn > localFlux; + /// Storage for the face local Jacobian matrix + stackArray2d< real64, maxNumElems * numEqn * maxStencilSize * numDof > localFluxJacobian; + }; + + + /** + * @brief Getter for the stencil size at this connection + * @param[in] iconn the connection index + * @return the size of the stencil at this connection + */ + GEOS_HOST_DEVICE + inline + localIndex stencilSize( localIndex const iconn ) const { return m_sei[iconn].size(); } + + /** + * @brief Getter for the number of elements at this connection + * @param[in] iconn the connection index + * @return the number of elements at this connection + */ + GEOS_HOST_DEVICE + inline + localIndex numPointsInFlux( localIndex const iconn ) const { return m_stencilWrapper.numPointsInFlux( iconn ); } + + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] iconn the connection index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const iconn, + StackVariables & stack ) const + { + // set degrees of freedom indices for this face + for( integer i = 0; i < stack.stencilSize; ++i ) + { + globalIndex const offset = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; + + for( integer jdof = 0; jdof < numDof; ++jdof ) + { + stack.dofColIndices[i * numDof + jdof] = offset + jdof; + } + } + } + + /** + * @brief Compute the local flux contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + inline + void computeFlux( localIndex const iconn, + StackVariables & stack, + FUNC && compFluxKernelOp = NoOpFunc{} ) const + { + + // first, compute the transmissibilities at this face + m_stencilWrapper.computeWeights( iconn, + m_permeability, + m_dPerm_dPres, + stack.transmissibility, + stack.dTrans_dPres ); + + + localIndex k[numFluxSupportPoints]; + localIndex connectionIndex = 0; + for( k[0] = 0; k[0] < stack.numConnectedElems; ++k[0] ) + { + for( k[1] = k[0] + 1; k[1] < stack.numConnectedElems; ++k[1] ) + { + /// cell indices + localIndex const seri[numFluxSupportPoints] = {m_seri( iconn, k[0] ), m_seri( iconn, k[1] )}; + localIndex const sesri[numFluxSupportPoints] = {m_sesri( iconn, k[0] ), m_sesri( iconn, k[1] )}; + localIndex const sei[numFluxSupportPoints] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; + + // clear working arrays + real64 compFlux[numComp]{}; + real64 dCompFlux_dP[numFluxSupportPoints][numComp]{}; + real64 dCompFlux_dC[numFluxSupportPoints][numComp][numComp]{}; + + real64 const trans[numFluxSupportPoints] = { stack.transmissibility[connectionIndex][0], + stack.transmissibility[connectionIndex][1] }; + + real64 const dTrans_dPres[numFluxSupportPoints] = { stack.dTrans_dPres[connectionIndex][0], + stack.dTrans_dPres[connectionIndex][1] }; + + //***** calculation of flux ***** + // loop over phases, compute and upwind phase flux and sum contributions to each component's flux + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + // create local work arrays + real64 potGrad = 0.0; + real64 phaseFlux = 0.0; + real64 dPhaseFlux_dP[numFluxSupportPoints]{}; + real64 dPhaseFlux_dC[numFluxSupportPoints][numComp]{}; + + localIndex k_up = -1; + + if( m_kernelFlags.isSet( KernelFlags::C1PPU ) ) + { + isothermalCompositionalMultiphaseFVMKernelUtilities::C1PPUPhaseFlux::compute< numComp, numFluxSupportPoints > + ( m_numPhases, + ip, + m_kernelFlags.isSet( KernelFlags::CapPressure ), + seri, sesri, sei, + trans, + dTrans_dPres, + m_pres, + m_gravCoef, + m_phaseMob, m_dPhaseMob, + m_phaseVolFrac, m_dPhaseVolFrac, + m_phaseCompFrac, m_dPhaseCompFrac, + m_dCompFrac_dCompDens, + m_phaseMassDens, m_dPhaseMassDens, + m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac, + k_up, + potGrad, + phaseFlux, + dPhaseFlux_dP, + dPhaseFlux_dC, + compFlux, + dCompFlux_dP, + dCompFlux_dC ); + } + else if( m_kernelFlags.isSet( KernelFlags::IHU ) ) + { + isothermalCompositionalMultiphaseFVMKernelUtilities::IHUPhaseFlux::compute< numComp, numFluxSupportPoints > + ( m_numPhases, + ip, + m_kernelFlags.isSet( KernelFlags::CapPressure ), + seri, sesri, sei, + trans, + dTrans_dPres, + m_pres, + m_gravCoef, + m_phaseMob, m_dPhaseMob, + m_phaseVolFrac, m_dPhaseVolFrac, + m_phaseCompFrac, m_dPhaseCompFrac, + m_dCompFrac_dCompDens, + m_phaseMassDens, m_dPhaseMassDens, + m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac, + k_up, + potGrad, + phaseFlux, + dPhaseFlux_dP, + dPhaseFlux_dC, + compFlux, + dCompFlux_dP, + dCompFlux_dC ); + } + else + { + isothermalCompositionalMultiphaseFVMKernelUtilities::PPUPhaseFlux::compute< numComp, numFluxSupportPoints > + ( m_numPhases, + ip, + m_kernelFlags.isSet( KernelFlags::CapPressure ), + seri, sesri, sei, + trans, + dTrans_dPres, + m_pres, + m_gravCoef, + m_phaseMob, m_dPhaseMob, + m_phaseVolFrac, m_dPhaseVolFrac, + m_phaseCompFrac, m_dPhaseCompFrac, + m_dCompFrac_dCompDens, + m_phaseMassDens, m_dPhaseMassDens, + m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac, + k_up, + potGrad, + phaseFlux, + dPhaseFlux_dP, + dPhaseFlux_dC, + compFlux, + dCompFlux_dP, + dCompFlux_dC ); + } + + // call the lambda in the phase loop to allow the reuse of the phase fluxes and their derivatives + // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase + compFluxKernelOp( ip, k, seri, sesri, sei, connectionIndex, + k_up, seri[k_up], sesri[k_up], sei[k_up], potGrad, + phaseFlux, dPhaseFlux_dP, dPhaseFlux_dC ); + + } // loop over phases + + /// populate local flux vector and derivatives + for( integer ic = 0; ic < numComp; ++ic ) + { + integer const eqIndex0 = k[0] * numEqn + ic; + integer const eqIndex1 = k[1] * numEqn + ic; + + stack.localFlux[eqIndex0] += m_dt * compFlux[ic]; + stack.localFlux[eqIndex1] -= m_dt * compFlux[ic]; + + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + localIndex const localDofIndexPres = k[ke] * numDof; + stack.localFluxJacobian[eqIndex0][localDofIndexPres] += m_dt * dCompFlux_dP[ke][ic]; + stack.localFluxJacobian[eqIndex1][localDofIndexPres] -= m_dt * dCompFlux_dP[ke][ic]; + + for( integer jc = 0; jc < numComp; ++jc ) + { + localIndex const localDofIndexComp = localDofIndexPres + jc + 1; + stack.localFluxJacobian[eqIndex0][localDofIndexComp] += m_dt * dCompFlux_dC[ke][ic][jc]; + stack.localFluxJacobian[eqIndex1][localDofIndexComp] -= m_dt * dCompFlux_dC[ke][ic][jc]; + } + } + } + connectionIndex++; + } // loop over k[1] + } // loop over k[0] + + } + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + inline + void complete( localIndex const iconn, + StackVariables & stack, + FUNC && assemblyKernelOp = NoOpFunc{} ) const + { + using namespace compositionalMultiphaseUtilities; + + if( m_kernelFlags.isSet( KernelFlags::TotalMassEquation ) ) + { + // Apply equation/variable change transformation(s) + stackArray1d< real64, maxStencilSize * numDof > work( stack.stencilSize * numDof ); + shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComp, numEqn, numDof * stack.stencilSize, stack.numConnectedElems, + stack.localFluxJacobian, work ); + shiftBlockElementsAheadByOneAndReplaceFirstElementWithSum( numComp, numEqn, stack.numConnectedElems, + stack.localFlux ); + } + + // add contribution to residual and jacobian into: + // - the component mass balance equations (i = 0 to i = numComp-1) + // note that numDof includes derivatives wrt temperature if this class is derived in ThermalKernels + for( integer i = 0; i < stack.numConnectedElems; ++i ) + { + if( m_ghostRank[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )] < 0 ) + { + globalIndex const globalRow = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; + localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - m_rankOffset ); + GEOS_ASSERT_GE( localRow, 0 ); + GEOS_ASSERT_GT( m_localMatrix.numRows(), localRow + numComp ); + + for( integer ic = 0; ic < numComp; ++ic ) + { + RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[localRow + ic], + stack.localFlux[i * numEqn + ic] ); + m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > + ( localRow + ic, + stack.dofColIndices.data(), + stack.localFluxJacobian[i * numEqn + ic].dataIfContiguous(), + stack.stencilSize * numDof ); + } + + // call the lambda to assemble additional terms, such as thermal terms + assemblyKernelOp( i, localRow ); + } + } + } + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numConnections the number of connections + * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numConnections, + KERNEL_TYPE const & kernelComponent ) + { + GEOS_MARK_FUNCTION; + forAll< POLICY >( numConnections, [=] GEOS_HOST_DEVICE ( localIndex const iconn ) + { + typename KERNEL_TYPE::StackVariables stack( kernelComponent.stencilSize( iconn ), + kernelComponent.numPointsInFlux( iconn ) ); + + kernelComponent.setup( iconn, stack ); + kernelComponent.computeFlux( iconn, stack ); + kernelComponent.complete( iconn, stack ); + } ); + } + +protected: + + /// Views on permeability + ElementViewConst< arrayView3d< real64 const > > const m_permeability; + ElementViewConst< arrayView3d< real64 const > > const m_dPerm_dPres; + + /// Views on phase mobilities + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const m_phaseMob; + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const m_dPhaseMob; + + /// Views on phase mass densities + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseMassDens; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseMassDens; + + /// Views on phase capillary pressure + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const m_phaseCapPressure; + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const m_dPhaseCapPressure_dPhaseVolFrac; + + // Stencil information + + /// Reference to the stencil wrapper + STENCILWRAPPER const m_stencilWrapper; + + /// Connection to element maps + typename STENCILWRAPPER::IndexContainerViewConstType const m_seri; + typename STENCILWRAPPER::IndexContainerViewConstType const m_sesri; + typename STENCILWRAPPER::IndexContainerViewConstType const m_sei; + +}; + +/** + * @class FluxComputeKernelFactory + */ +class FluxComputeKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @param[in] numComps the number of fluid components + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] hasCapPressure flag specifying whether capillary pressure is used or not + * @param[in] solverName name of the solver (to name accessors) + * @param[in] elemManager reference to the element region manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY, typename STENCILWRAPPER > + static void + createAndLaunch( integer const numComps, + integer const numPhases, + globalIndex const rankOffset, + string const & dofKey, + integer const hasCapPressure, + integer const useTotalMassEquation, + UpwindingParameters upwindingParams, + string const & solverName, + ElementRegionManager const & elemManager, + STENCILWRAPPER const & stencilWrapper, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) + { + integer constexpr NUM_COMP = NC(); + integer constexpr NUM_DOF = NC() + 1; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + BitFlags< KernelFlags > kernelFlags; + if( hasCapPressure ) + kernelFlags.set( KernelFlags::CapPressure ); + if( useTotalMassEquation ) + kernelFlags.set( KernelFlags::TotalMassEquation ); + if( upwindingParams.upwindingScheme == UpwindingScheme::C1PPU && + isothermalCompositionalMultiphaseFVMKernelUtilities::epsC1PPU > 0 ) + kernelFlags.set( KernelFlags::C1PPU ); + else if( upwindingParams.upwindingScheme == UpwindingScheme::IHU ) + kernelFlags.set( KernelFlags::IHU ); + + + using kernelType = FluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; + typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); + typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); + typename kernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); + typename kernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); + + kernelType kernel( numPhases, rankOffset, stencilWrapper, dofNumberAccessor, + compFlowAccessors, multiFluidAccessors, capPressureAccessors, permeabilityAccessors, + dt, localMatrix, localRhs, kernelFlags ); + kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); + } ); + } +}; + +} // namespace isothermalCompositionalMultiphaseFVMKernels + +} // namespace geos + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_FLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.cpp new file mode 100644 index 00000000000..f3f33c92d69 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.cpp @@ -0,0 +1,65 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 FluxComputeKernelBase.cpp + */ + +#include "physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp" + +#include "finiteVolume/CellElementStencilTPFA.hpp" +#include "finiteVolume/SurfaceElementStencil.hpp" +#include "finiteVolume/EmbeddedSurfaceToCellStencil.hpp" +#include "finiteVolume/FaceElementToCellStencil.hpp" +#include "mesh/utilities/MeshMapUtilities.hpp" + +namespace geos +{ +using namespace constitutive; + +namespace isothermalCompositionalMultiphaseFVMKernels +{ + +/******************************** FluxComputeKernelBase ********************************/ + +FluxComputeKernelBase::FluxComputeKernelBase( integer const numPhases, + globalIndex const rankOffset, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< KernelFlags > kernelFlags ) + : m_numPhases( numPhases ), + m_rankOffset( rankOffset ), + m_dt( dt ), + m_dofNumber( dofNumberAccessor.toNestedViewConst() ), + m_ghostRank( compFlowAccessors.get( fields::ghostRank {} ) ), + m_gravCoef( compFlowAccessors.get( fields::flow::gravityCoefficient {} ) ), + m_pres( compFlowAccessors.get( fields::flow::pressure {} ) ), + m_phaseVolFrac( compFlowAccessors.get( fields::flow::phaseVolumeFraction {} ) ), + m_dPhaseVolFrac( compFlowAccessors.get( fields::flow::dPhaseVolumeFraction {} ) ), + m_dCompFrac_dCompDens( compFlowAccessors.get( fields::flow::dGlobalCompFraction_dGlobalCompDensity {} ) ), + m_phaseCompFrac( multiFluidAccessors.get( fields::multifluid::phaseCompFraction {} ) ), + m_dPhaseCompFrac( multiFluidAccessors.get( fields::multifluid::dPhaseCompFraction {} ) ), + m_localMatrix( localMatrix ), + m_localRhs( localRhs ), + m_kernelFlags( kernelFlags ) +{} + +} // namespace isothermalCompositionalMultiphaseFVMKernels + +} // namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp new file mode 100644 index 00000000000..f36124d6ed6 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp @@ -0,0 +1,181 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 FluxComputeKernelBase.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_FLUXCOMPUTEKERNELBASE_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_FLUXCOMPUTEKERNELBASE_HPP + +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/capillaryPressure/CapillaryPressureFields.hpp" +#include "constitutive/capillaryPressure/CapillaryPressureBase.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" +#include "constitutive/permeability/PermeabilityBase.hpp" +#include "constitutive/permeability/PermeabilityFields.hpp" +#include "mesh/ElementRegionManager.hpp" +#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" +#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" + + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseFVMKernels +{ + +enum class KernelFlags +{ + /// Flag to specify whether capillary pressure is used or not + CapPressure = 1 << 0, // 1 + /// Flag indicating whether total mass equation is formed or not + TotalMassEquation = 1 << 1, // 2 + /// Flag indicating whether C1-PPU is used or not + C1PPU = 1 << 2, // 4 + /// Flag indicating whether IHU is used or not + IHU = 1 << 3 // 8 + /// Add more flags like that if needed: + // Flag5 = 1 << 4, // 16 + // Flag6 = 1 << 5, // 32 + // Flag7 = 1 << 6, // 64 + // Flag8 = 1 << 7 //128 +}; + +/******************************** FluxComputeKernelBase ********************************/ + +/** + * @brief Base class for FluxComputeKernel that holds all data not dependent + * on template parameters (like stencil type and number of components/dofs). + */ +class FluxComputeKernelBase +{ +public: + + /** + * @brief The type for element-based data. Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewConstAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + using DofNumberAccessor = ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > >; + + using CompFlowAccessors = + StencilAccessors< fields::ghostRank, + fields::flow::gravityCoefficient, + fields::flow::pressure, + fields::flow::dGlobalCompFraction_dGlobalCompDensity, + fields::flow::phaseVolumeFraction, + fields::flow::dPhaseVolumeFraction, + fields::flow::phaseMobility, + fields::flow::dPhaseMobility >; + using MultiFluidAccessors = + StencilMaterialAccessors< constitutive::MultiFluidBase, + fields::multifluid::phaseDensity, + fields::multifluid::dPhaseDensity, + fields::multifluid::phaseMassDensity, + fields::multifluid::dPhaseMassDensity, + fields::multifluid::phaseCompFraction, + fields::multifluid::dPhaseCompFraction >; + + using CapPressureAccessors = + StencilMaterialAccessors< constitutive::CapillaryPressureBase, + fields::cappres::phaseCapPressure, + fields::cappres::dPhaseCapPressure_dPhaseVolFraction >; + + using PermeabilityAccessors = + StencilMaterialAccessors< constitutive::PermeabilityBase, + fields::permeability::permeability, + fields::permeability::dPerm_dPressure >; + + /** + * @brief Constructor for the kernel interface + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofNumberAccessor accessor for the dof numbers + * @param[in] compFlowAccessors accessor for wrappers registered by the solver + * @param[in] multiFluidAccessors accessor for wrappers registered by the multifluid model + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + * @param[in] kernelFlags flags packed all together + */ + FluxComputeKernelBase( integer const numPhases, + globalIndex const rankOffset, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< KernelFlags > kernelFlags ); + +protected: + + /// Number of fluid phases + integer const m_numPhases; + + /// Offset for my MPI rank + globalIndex const m_rankOffset; + + /// Time step size + real64 const m_dt; + + /// Views on dof numbers + ElementViewConst< arrayView1d< globalIndex const > > const m_dofNumber; + + /// Views on ghost rank numbers and gravity coefficients + ElementViewConst< arrayView1d< integer const > > const m_ghostRank; + ElementViewConst< arrayView1d< real64 const > > const m_gravCoef; + + // Primary and secondary variables + + /// Views on pressure + ElementViewConst< arrayView1d< real64 const > > const m_pres; + + /// Views on phase volume fractions + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const m_phaseVolFrac; + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const m_dPhaseVolFrac; + + /// Views on derivatives of comp fractions + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const m_dCompFrac_dCompDens; + + /// Views on phase component fractions + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const m_phaseCompFrac; + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const m_dPhaseCompFrac; + + // Residual and jacobian + + /// View on the local CRS matrix + CRSMatrixView< real64, globalIndex const > const m_localMatrix; + /// View on the local RHS + arrayView1d< real64 > const m_localRhs; + + BitFlags< KernelFlags > const m_kernelFlags; +}; + +} // namespace isothermalCompositionalMultiphaseFVMKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_FLUXCOMPUTEKERNELBASE_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp new file mode 100644 index 00000000000..e8d53a625ba --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp @@ -0,0 +1,144 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 GlobalComponentFractionKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_GLOBALCOMPONENTFRACTIONKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_GLOBALCOMPONENTFRACTIONKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/******************************** GlobalComponentFractionKernel ********************************/ + +/** + * @class GlobalComponentFractionKernel + * @tparam NUM_COMP number of fluid components + * @brief Define the interface for the update kernel in charge of computing the phase volume fractions + */ +template< integer NUM_COMP > +class GlobalComponentFractionKernel : public PropertyKernelBase< NUM_COMP > +{ +public: + + using Base = PropertyKernelBase< NUM_COMP >; + using Base::numComp; + + /** + * @brief Constructor + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + */ + GlobalComponentFractionKernel( ObjectManagerBase & subRegion ) + : Base(), + m_compDens( subRegion.getField< fields::flow::globalCompDensity >() ), + m_compFrac( subRegion.getField< fields::flow::globalCompFraction >() ), + m_dCompFrac_dCompDens( subRegion.getField< fields::flow::dGlobalCompFraction_dGlobalCompDensity >() ) + {} + + /** + * @brief Compute the phase volume fractions in an element + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[in] phaseVolFractionKernelOp the function used to customize the kernel + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void compute( localIndex const ei, + FUNC && compFractionKernelOp = NoOpFunc{} ) const + { + arraySlice1d< real64 const, compflow::USD_COMP - 1 > const compDens = m_compDens[ei]; + arraySlice1d< real64, compflow::USD_COMP - 1 > const compFrac = m_compFrac[ei]; + arraySlice2d< real64, compflow::USD_COMP_DC - 1 > const dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; + + real64 totalDensity = 0.0; + + for( integer ic = 0; ic < numComp; ++ic ) + { + totalDensity += compDens[ic]; + } + + real64 const totalDensityInv = 1.0 / totalDensity; + + for( integer ic = 0; ic < numComp; ++ic ) + { + compFrac[ic] = compDens[ic] * totalDensityInv; + for( integer jc = 0; jc < numComp; ++jc ) + { + dCompFrac_dCompDens[ic][jc] = -compFrac[ic] * totalDensityInv; + } + dCompFrac_dCompDens[ic][ic] += totalDensityInv; + } + + compFractionKernelOp( compFrac, dCompFrac_dCompDens ); + } + +protected: + + // inputs + + // Views on component densities + arrayView2d< real64 const, compflow::USD_COMP > m_compDens; + + // outputs + + // Views on component fraction + arrayView2d< real64, compflow::USD_COMP > m_compFrac; + arrayView3d< real64, compflow::USD_COMP_DC > m_dCompFrac_dCompDens; + +}; + +/** + * @class GlobalComponentFractionKernelFactory + */ +class GlobalComponentFractionKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComp the number of fluid components + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComp, + ObjectManagerBase & subRegion ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + integer constexpr NUM_COMP = NC(); + GlobalComponentFractionKernel< NUM_COMP > kernel( subRegion ); + GlobalComponentFractionKernel< NUM_COMP >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_GLOBALCOMPONENTFRACTIONKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/HydrostaticPressureKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/HydrostaticPressureKernel.hpp new file mode 100644 index 00000000000..65b6bde6360 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/HydrostaticPressureKernel.hpp @@ -0,0 +1,356 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 HydrostaticPressureKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_HYDROSTATICPRESSUREKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_HYDROSTATICPRESSUREKERNEL_HPP + +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "functions/TableFunction.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/******************************** HydrostaticPressureKernel ********************************/ + +struct HydrostaticPressureKernel +{ + + // TODO: this type of constants should be centralized somewhere or provided by fluid model + static real64 constexpr MIN_FOR_PHASE_PRESENCE = 1e-12; + + enum class ReturnType : integer + { + FAILED_TO_CONVERGE = 0, + DETECTED_MULTIPHASE_FLOW = 1, + SUCCESS = 2 + }; + + template< typename FLUID_WRAPPER > + static ReturnType + computeHydrostaticPressure( integer const numComps, + integer const numPhases, + integer const ipInit, + integer const maxNumEquilIterations, + real64 const & equilTolerance, + real64 const (&gravVector)[ 3 ], + FLUID_WRAPPER fluidWrapper, + arrayView1d< TableFunction::KernelWrapper const > compFracTableWrappers, + TableFunction::KernelWrapper tempTableWrapper, + real64 const & refElevation, + real64 const & refPres, + arraySlice1d< real64 const > const & refPhaseMassDens, + real64 const & newElevation, + real64 & newPres, + arraySlice1d< real64 > const & newPhaseMassDens ) + { + // fluid properties at this elevation + StackArray< real64, 2, constitutive::MultiFluidBase::MAX_NUM_COMPONENTS, compflow::LAYOUT_COMP > compFrac( 1, numComps ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseFrac( 1, 1, numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseDens( 1, 1, numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseMassDens( 1, 1, numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseVisc( 1, 1, numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseEnthalpy( 1, 1, numPhases ); + StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseInternalEnergy( 1, 1, numPhases ); + StackArray< real64, 4, constitutive::MultiFluidBase::MAX_NUM_PHASES *constitutive::MultiFluidBase::MAX_NUM_COMPONENTS, + constitutive::multifluid::LAYOUT_PHASE_COMP > phaseCompFrac( 1, 1, numPhases, numComps ); + real64 totalDens = 0.0; + + bool isSinglePhaseFlow = true; + + // Step 1: compute the hydrostatic pressure at the current elevation + + real64 const gravCoef = gravVector[2] * ( refElevation - newElevation ); + real64 const temp = tempTableWrapper.compute( &newElevation ); + for( integer ic = 0; ic < numComps; ++ic ) + { + compFrac[0][ic] = compFracTableWrappers[ic].compute( &newElevation ); + } + + // Step 2: guess the pressure with the refPhaseMassDensity + + real64 pres0 = refPres - refPhaseMassDens[ipInit] * gravCoef; + real64 pres1 = 0.0; + + // Step 3: compute the mass density at this elevation using the guess, and update pressure + + constitutive::MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, + pres0, + temp, + compFrac[0], + phaseFrac[0][0], + phaseDens[0][0], + phaseMassDens[0][0], + phaseVisc[0][0], + phaseEnthalpy[0][0], + phaseInternalEnergy[0][0], + phaseCompFrac[0][0], + totalDens ); + pres1 = refPres - 0.5 * ( refPhaseMassDens[ipInit] + phaseMassDens[0][0][ipInit] ) * gravCoef; + + // Step 4: fixed-point iteration until convergence + + bool equilHasConverged = false; + for( integer eqIter = 0; eqIter < maxNumEquilIterations; ++eqIter ) + { + + // check convergence + equilHasConverged = ( LvArray::math::abs( pres0 - pres1 ) < equilTolerance ); + pres0 = pres1; + + // if converged, check number of phases and move on + if( equilHasConverged ) + { + // make sure that the fluid is single-phase, other we have to issue a warning (for now) + // if only one phase is mobile, we are in good shape (unfortunately it is hard to access relperm from here) + localIndex numberOfPhases = 0; + for( integer ip = 0; ip < numPhases; ++ip ) + { + if( phaseFrac[0][0][ip] > MIN_FOR_PHASE_PRESENCE ) + { + numberOfPhases++; + } + } + if( numberOfPhases > 1 ) + { + isSinglePhaseFlow = false; + } + + break; + } + + // compute the mass density at this elevation using the previous pressure, and compute the new pressure + constitutive::MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, + pres0, + temp, + compFrac[0], + phaseFrac[0][0], + phaseDens[0][0], + phaseMassDens[0][0], + phaseVisc[0][0], + phaseEnthalpy[0][0], + phaseInternalEnergy[0][0], + phaseCompFrac[0][0], + totalDens ); + pres1 = refPres - 0.5 * ( refPhaseMassDens[ipInit] + phaseMassDens[0][0][ipInit] ) * gravCoef; + } + + // Step 5: save the hydrostatic pressure and the corresponding density + + newPres = pres1; + for( integer ip = 0; ip < numPhases; ++ip ) + { + newPhaseMassDens[ip] = phaseMassDens[0][0][ip]; + } + + if( !equilHasConverged ) + { + return ReturnType::FAILED_TO_CONVERGE; + } + else if( !isSinglePhaseFlow ) + { + return ReturnType::DETECTED_MULTIPHASE_FLOW; + } + else + { + return ReturnType::SUCCESS; + } + } + + template< typename FLUID_WRAPPER > + static ReturnType + launch( localIndex const size, + integer const numComps, + integer const numPhases, + integer const ipInit, + integer const maxNumEquilIterations, + real64 const equilTolerance, + real64 const (&gravVector)[ 3 ], + real64 const & minElevation, + real64 const & elevationIncrement, + real64 const & datumElevation, + real64 const & datumPres, + FLUID_WRAPPER fluidWrapper, + arrayView1d< TableFunction::KernelWrapper const > compFracTableWrappers, + TableFunction::KernelWrapper tempTableWrapper, + arrayView1d< arrayView1d< real64 > const > elevationValues, + arrayView1d< real64 > pressureValues ) + { + + ReturnType returnVal = ReturnType::SUCCESS; + + // Step 1: compute the phase mass densities at datum + + // datum fluid properties + array2d< real64, compflow::LAYOUT_COMP > datumCompFrac( 1, numComps ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseFrac( 1, 1, numPhases ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseDens( 1, 1, numPhases ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseMassDens( 1, 1, numPhases ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseVisc( 1, 1, numPhases ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseEnthalpy( 1, 1, numPhases ); + array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseInternalEnergy( 1, 1, numPhases ); + array4d< real64, constitutive::multifluid::LAYOUT_PHASE_COMP > datumPhaseCompFrac( 1, 1, numPhases, numComps ); + real64 datumTotalDens = 0.0; + + real64 const datumTemp = tempTableWrapper.compute( &datumElevation ); + for( integer ic = 0; ic < numComps; ++ic ) + { + datumCompFrac[0][ic] = compFracTableWrappers[ic].compute( &datumElevation ); + } + constitutive::MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, + datumPres, + datumTemp, + datumCompFrac[0], + datumPhaseFrac[0][0], + datumPhaseDens[0][0], + datumPhaseMassDens[0][0], + datumPhaseVisc[0][0], + datumPhaseEnthalpy[0][0], + datumPhaseInternalEnergy[0][0], + datumPhaseCompFrac[0][0], + datumTotalDens ); + + // Step 2: find the closest elevation to datumElevation + + forAll< parallelHostPolicy >( size, [=] ( localIndex const i ) + { + real64 const elevation = minElevation + i * elevationIncrement; + elevationValues[0][i] = elevation; + } ); + integer const iRef = LvArray::sortedArrayManipulation::find( elevationValues[0].begin(), + elevationValues[0].size(), + datumElevation ); + + // Step 3: compute the mass density and pressure at the reference elevation + + array2d< real64 > phaseMassDens( pressureValues.size(), numPhases ); + // temporary array without permutation to compile on Lassen + array1d< real64 > datumPhaseMassDensTmp( numPhases ); + for( integer ip = 0; ip < numPhases; ++ip ) + { + datumPhaseMassDensTmp[ip] = datumPhaseMassDens[0][0][ip]; + } + + ReturnType const refReturnVal = + computeHydrostaticPressure( numComps, + numPhases, + ipInit, + maxNumEquilIterations, + equilTolerance, + gravVector, + fluidWrapper, + compFracTableWrappers, + tempTableWrapper, + datumElevation, + datumPres, + datumPhaseMassDensTmp, + elevationValues[0][iRef], + pressureValues[iRef], + phaseMassDens[iRef] ); + if( refReturnVal == ReturnType::FAILED_TO_CONVERGE ) + { + return ReturnType::FAILED_TO_CONVERGE; + } + else if( refReturnVal == ReturnType::DETECTED_MULTIPHASE_FLOW ) + { + returnVal = ReturnType::DETECTED_MULTIPHASE_FLOW; + } + + // Step 4: for each elevation above the reference elevation, compute the pressure + + localIndex const numEntriesAboveRef = size - iRef - 1; + forAll< serialPolicy >( numEntriesAboveRef, [=, &returnVal] ( localIndex const i ) + { + ReturnType const returnValAboveRef = + computeHydrostaticPressure( numComps, + numPhases, + ipInit, + maxNumEquilIterations, + equilTolerance, + gravVector, + fluidWrapper, + compFracTableWrappers, + tempTableWrapper, + elevationValues[0][iRef+i], + pressureValues[iRef+i], + phaseMassDens[iRef+i], + elevationValues[0][iRef+i+1], + pressureValues[iRef+i+1], + phaseMassDens[iRef+i+1] ); + if( returnValAboveRef == ReturnType::FAILED_TO_CONVERGE ) + { + returnVal = ReturnType::FAILED_TO_CONVERGE; + } + else if( ( returnValAboveRef == ReturnType::DETECTED_MULTIPHASE_FLOW ) && + ( returnVal != ReturnType::FAILED_TO_CONVERGE ) ) + { + returnVal = ReturnType::DETECTED_MULTIPHASE_FLOW; + } + + } ); + + // Step 5: for each elevation below the reference elevation, compute the pressure + + localIndex const numEntriesBelowRef = iRef; + forAll< serialPolicy >( numEntriesBelowRef, [=, &returnVal] ( localIndex const i ) + { + ReturnType const returnValBelowRef = + computeHydrostaticPressure( numComps, + numPhases, + ipInit, + maxNumEquilIterations, + equilTolerance, + gravVector, + fluidWrapper, + compFracTableWrappers, + tempTableWrapper, + elevationValues[0][iRef-i], + pressureValues[iRef-i], + phaseMassDens[iRef-i], + elevationValues[0][iRef-i-1], + pressureValues[iRef-i-1], + phaseMassDens[iRef-i-1] ); + if( returnValBelowRef == ReturnType::FAILED_TO_CONVERGE ) + { + returnVal = ReturnType::FAILED_TO_CONVERGE; + } + else if( ( returnValBelowRef == ReturnType::DETECTED_MULTIPHASE_FLOW ) && + ( returnVal != ReturnType::FAILED_TO_CONVERGE ) ) + { + returnVal = ReturnType::DETECTED_MULTIPHASE_FLOW; + } + + } ); + + return returnVal; + } + +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_HYDROSTATICPRESSUREKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp similarity index 82% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp index 323f3e362d0..ec9b3c55783 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp @@ -14,11 +14,11 @@ */ /** - * @file IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp + * @file IHUPhaseFlux.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELUTILITIES_HPP_ -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELUTILITIES_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_IHUPHASEFLUX_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_IHUPHASEFLUX_HPP #include "common/DataLayouts.hpp" #include "common/DataTypes.hpp" @@ -33,559 +33,11 @@ namespace geos namespace isothermalCompositionalMultiphaseFVMKernelUtilities { -// TODO make input parameter -static constexpr real64 epsC1PPU = 5000; - template< typename VIEWTYPE > using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; using Deriv = constitutive::multifluid::DerivativeOffset; -struct PotGrad -{ - template< integer numComp, integer numFluxSupportPoints > - GEOS_HOST_DEVICE - static void - compute ( integer const numPhase, - integer const ip, - integer const hasCapPressure, - localIndex const ( &seri )[numFluxSupportPoints], - localIndex const ( &sesri )[numFluxSupportPoints], - localIndex const ( &sei )[numFluxSupportPoints], - real64 const ( &trans )[numFluxSupportPoints], - real64 const ( &dTrans_dPres )[numFluxSupportPoints], - ElementViewConst< arrayView1d< real64 const > > const & pres, - ElementViewConst< arrayView1d< real64 const > > const & gravCoef, - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, - ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, - ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - real64 & potGrad, - real64 ( & dPresGrad_dP )[numFluxSupportPoints], - real64 ( & dPresGrad_dC )[numFluxSupportPoints][numComp], - real64 ( & dGravHead_dP )[numFluxSupportPoints], - real64 ( & dGravHead_dC )[numFluxSupportPoints][numComp] ) - { - // assign derivatives arrays to zero - for( integer i = 0; i < numFluxSupportPoints; ++i ) - { - dPresGrad_dP[i] = 0.0; - dGravHead_dP[i] = 0.0; - for( integer jc = 0; jc < numComp; ++jc ) - { - dPresGrad_dC[i][jc] = 0.0; - dGravHead_dC[i][jc] = 0.0; - } - } - - // create local work arrays - real64 densMean = 0.0; - real64 dDensMean_dP[numFluxSupportPoints]{}; - real64 dDensMean_dC[numFluxSupportPoints][numComp]{}; - - real64 presGrad = 0.0; - real64 gravHead = 0.0; - real64 dCapPressure_dC[numComp]{}; - - real64 dProp_dC[numComp]{}; - - // calculate quantities on primary connected cells - integer denom = 0; - for( integer i = 0; i < numFluxSupportPoints; ++i ) - { - localIndex const er = seri[i]; - localIndex const esr = sesri[i]; - localIndex const ei = sei[i]; - - bool const phaseExists = (phaseVolFrac[er][esr][ei][ip] > 0); - if( !phaseExists ) - { - continue; - } - - // density - real64 const density = phaseMassDens[er][esr][ei][0][ip]; - real64 const dDens_dP = dPhaseMassDens[er][esr][ei][0][ip][Deriv::dP]; - - applyChainRule( numComp, - dCompFrac_dCompDens[er][esr][ei], - dPhaseMassDens[er][esr][ei][0][ip], - dProp_dC, - Deriv::dC ); - - // average density and derivatives - densMean += density; - dDensMean_dP[i] = dDens_dP; - for( integer jc = 0; jc < numComp; ++jc ) - { - dDensMean_dC[i][jc] = dProp_dC[jc]; - } - denom++; - } - if( denom > 1 ) - { - densMean /= denom; - for( integer i = 0; i < numFluxSupportPoints; ++i ) - { - dDensMean_dP[i] /= denom; - for( integer jc = 0; jc < numComp; ++jc ) - { - dDensMean_dC[i][jc] /= denom; - } - } - } - - /// compute the TPFA potential difference - for( integer i = 0; i < numFluxSupportPoints; i++ ) - { - localIndex const er = seri[i]; - localIndex const esr = sesri[i]; - localIndex const ei = sei[i]; - - // capillary pressure - real64 capPressure = 0.0; - real64 dCapPressure_dP = 0.0; - - for( integer ic = 0; ic < numComp; ++ic ) - { - dCapPressure_dC[ic] = 0.0; - } - - if( hasCapPressure ) - { - capPressure = phaseCapPressure[er][esr][ei][0][ip]; - - for( integer jp = 0; jp < numPhase; ++jp ) - { - real64 const dCapPressure_dS = dPhaseCapPressure_dPhaseVolFrac[er][esr][ei][0][ip][jp]; - dCapPressure_dP += dCapPressure_dS * dPhaseVolFrac[er][esr][ei][jp][Deriv::dP]; - - for( integer jc = 0; jc < numComp; ++jc ) - { - dCapPressure_dC[jc] += dCapPressure_dS * dPhaseVolFrac[er][esr][ei][jp][Deriv::dC+jc]; - } - } - } - - presGrad += trans[i] * (pres[er][esr][ei] - capPressure); - dPresGrad_dP[i] += trans[i] * (1 - dCapPressure_dP) - + dTrans_dPres[i] * (pres[er][esr][ei] - capPressure); - for( integer jc = 0; jc < numComp; ++jc ) - { - dPresGrad_dC[i][jc] += -trans[i] * dCapPressure_dC[jc]; - } - - real64 const gravD = trans[i] * gravCoef[er][esr][ei]; - real64 const dGravD_dP = dTrans_dPres[i] * gravCoef[er][esr][ei]; - - // the density used in the potential difference is always a mass density - // unlike the density used in the phase mobility, which is a mass density - // if useMass == 1 and a molar density otherwise - gravHead += densMean * gravD; - - // need to add contributions from both cells the mean density depends on - for( integer j = 0; j < numFluxSupportPoints; ++j ) - { - dGravHead_dP[j] += dDensMean_dP[j] * gravD + dGravD_dP * densMean; - for( integer jc = 0; jc < numComp; ++jc ) - { - dGravHead_dC[j][jc] += dDensMean_dC[j][jc] * gravD; - } - } - } - - // compute phase potential gradient - potGrad = presGrad - gravHead; - - } - -}; - -struct PhaseComponentFlux -{ - /** - * @brief Compute the component flux for a given phase - * @tparam numComp number of components - * @tparam numFluxSupportPoints number of flux support points - * @param ip phase index - * @param k_up uptream index for this phase - * @param seri arraySlice of the stencil-implied element region index - * @param sesri arraySlice of the stencil-implied element subregion index - * @param sei arraySlice of the stencil-implied element index - * @param phaseCompFrac phase component fraction - * @param dPhaseCompFrac derivative of phase component fraction wrt pressure, temperature, component fraction - * @param dCompFrac_dCompDens derivative of component fraction wrt component density - * @param phaseFlux phase flux - * @param dPhaseFlux_dP derivative of phase flux wrt pressure - * @param dPhaseFlux_dC derivative of phase flux wrt comp density - * @param compFlux component flux - * @param dCompFlux_dP derivative of phase flux wrt pressure - * @param dCompFlux_dC derivative of phase flux wrt comp density - */ - template< localIndex numComp, localIndex numFluxSupportPoints > - GEOS_HOST_DEVICE - static void - compute( localIndex const ip, - localIndex const k_up, - localIndex const ( &seri )[numFluxSupportPoints], - localIndex const ( &sesri )[numFluxSupportPoints], - localIndex const ( &sei )[numFluxSupportPoints], - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - real64 const & phaseFlux, - real64 const ( &dPhaseFlux_dP )[numFluxSupportPoints], - real64 const ( &dPhaseFlux_dC )[numFluxSupportPoints][numComp], - real64 ( & compFlux )[numComp], - real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp], - real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp] ) - { - localIndex const er_up = seri[k_up]; - localIndex const esr_up = sesri[k_up]; - localIndex const ei_up = sei[k_up]; - - real64 dProp_dC[numComp]{}; - - // slice some constitutive arrays to avoid too much indexing in component loop - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP-3 > phaseCompFracSub = - phaseCompFrac[er_up][esr_up][ei_up][0][ip]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC-3 > dPhaseCompFracSub = - dPhaseCompFrac[er_up][esr_up][ei_up][0][ip]; - - // compute component fluxes and derivatives using upstream cell composition - for( integer ic = 0; ic < numComp; ++ic ) - { - real64 const ycp = phaseCompFracSub[ic]; - compFlux[ic] += phaseFlux * ycp; - - // derivatives stemming from phase flux - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - dCompFlux_dP[ke][ic] += dPhaseFlux_dP[ke] * ycp; - for( integer jc = 0; jc < numComp; ++jc ) - { - dCompFlux_dC[ke][ic][jc] += dPhaseFlux_dC[ke][jc] * ycp; - } - } - - // additional derivatives stemming from upstream cell phase composition - dCompFlux_dP[k_up][ic] += phaseFlux * dPhaseCompFracSub[ic][Deriv::dP]; - - // convert derivatives of comp fraction w.r.t. comp fractions to derivatives w.r.t. comp densities - applyChainRule( numComp, - dCompFrac_dCompDens[er_up][esr_up][ei_up], - dPhaseCompFracSub[ic], - dProp_dC, - Deriv::dC ); - for( integer jc = 0; jc < numComp; ++jc ) - { - dCompFlux_dC[k_up][ic][jc] += phaseFlux * dProp_dC[jc]; - } - } - - - - } - -}; - -struct PPUPhaseFlux -{ - /** - * @brief Form the PhasePotentialUpwind from pressure gradient and gravitational head - * @tparam numComp number of components - * @tparam numFluxSupportPoints number of flux support points - * @param numPhase number of phases - * @param ip phase index - * @param hasCapPressure flag indicating if there is capillary pressure - * @param seri arraySlice of the stencil-implied element region index - * @param sesri arraySlice of the stencil-implied element subregion index - * @param sei arraySlice of the stencil-implied element index - * @param trans transmissibility at the connection - * @param dTrans_dPres derivative of transmissibility wrt pressure - * @param pres pressure - * @param gravCoef gravitational coefficient - * @param phaseMob phase mobility - * @param dPhaseMob derivative of phase mobility wrt pressure, temperature, comp density - * @param dPhaseVolFrac derivative of phase volume fraction wrt pressure, temperature, comp density - * @param dCompFrac_dCompDens derivative of component fraction wrt component density - * @param phaseMassDens phase mass density - * @param dPhaseMassDens derivative of phase mass density wrt pressure, temperature, comp fraction - * @param phaseCapPressure phase capillary pressure - * @param dPhaseCapPressure_dPhaseVolFrac derivative of phase capillary pressure wrt phase volume fraction - * @param k_up uptream index for this phase - * @param potGrad potential gradient for this phase - * @param phaseFlux phase flux - * @param dPhaseFlux_dP derivative of phase flux wrt pressure - * @param dPhaseFlux_dC derivative of phase flux wrt comp density - */ - template< integer numComp, integer numFluxSupportPoints > - GEOS_HOST_DEVICE - static void - compute( integer const numPhase, - integer const ip, - integer const hasCapPressure, - localIndex const ( &seri )[numFluxSupportPoints], - localIndex const ( &sesri )[numFluxSupportPoints], - localIndex const ( &sei )[numFluxSupportPoints], - real64 const ( &trans )[2], - real64 const ( &dTrans_dPres )[2], - ElementViewConst< arrayView1d< real64 const > > const & pres, - ElementViewConst< arrayView1d< real64 const > > const & gravCoef, - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, - ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, - ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - localIndex & k_up, - real64 & potGrad, - real64 ( &phaseFlux ), - real64 ( & dPhaseFlux_dP )[numFluxSupportPoints], - real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp], - real64 ( & compFlux )[numComp], - real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp], - real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp] ) - { - real64 dPresGrad_dP[numFluxSupportPoints]{}; - real64 dPresGrad_dC[numFluxSupportPoints][numComp]{}; - real64 dGravHead_dP[numFluxSupportPoints]{}; - real64 dGravHead_dC[numFluxSupportPoints][numComp]{}; - PotGrad::compute< numComp, numFluxSupportPoints >( numPhase, ip, hasCapPressure, seri, sesri, sei, trans, dTrans_dPres, pres, - gravCoef, phaseVolFrac, dPhaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, - phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, potGrad, dPresGrad_dP, - dPresGrad_dC, dGravHead_dP, dGravHead_dC ); - - // *** upwinding *** - - // choose upstream cell - k_up = (potGrad >= 0) ? 0 : 1; - - localIndex const er_up = seri[k_up]; - localIndex const esr_up = sesri[k_up]; - localIndex const ei_up = sei[k_up]; - - real64 const mobility = phaseMob[er_up][esr_up][ei_up][ip]; - - // pressure gradient depends on all points in the stencil - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - dPhaseFlux_dP[ke] += dPresGrad_dP[ke] - dGravHead_dP[ke]; - dPhaseFlux_dP[ke] *= mobility; - for( integer jc = 0; jc < numComp; ++jc ) - { - dPhaseFlux_dC[ke][jc] += dPresGrad_dC[ke][jc] - dGravHead_dC[ke][jc]; - dPhaseFlux_dC[ke][jc] *= mobility; - } - } - // compute phase flux using upwind mobility. - phaseFlux = mobility * potGrad; - - real64 const dMob_dP = dPhaseMob[er_up][esr_up][ei_up][ip][Deriv::dP]; - arraySlice1d< real64 const, compflow::USD_PHASE_DC - 2 > dPhaseMobSub = - dPhaseMob[er_up][esr_up][ei_up][ip]; - - // add contribution from upstream cell mobility derivatives - dPhaseFlux_dP[k_up] += dMob_dP * potGrad; - for( integer jc = 0; jc < numComp; ++jc ) - { - dPhaseFlux_dC[k_up][jc] += dPhaseMobSub[Deriv::dC+jc] * potGrad; - } - - //distribute on phaseComponentFlux here - PhaseComponentFlux::compute( ip, k_up, seri, sesri, sei, phaseCompFrac, dPhaseCompFrac, dCompFrac_dCompDens, phaseFlux - , dPhaseFlux_dP, dPhaseFlux_dC, compFlux, dCompFlux_dP, dCompFlux_dC ); - - } -}; - -struct C1PPUPhaseFlux -{ - /** - * @brief Form the PhasePotentialUpwind from pressure gradient and gravitational head - * @tparam numComp number of components - * @tparam numFluxSupportPoints number of flux support points - * @param numPhase number of phases - * @param ip phase index - * @param hasCapPressure flag indicating if there is capillary pressure - * @param seri arraySlice of the stencil-implied element region index - * @param sesri arraySlice of the stencil-implied element subregion index - * @param sei arraySlice of the stencil-implied element index - * @param trans transmissibility at the connection - * @param dTrans_dPres derivative of transmissibility wrt pressure - * @param pres pressure - * @param gravCoef gravitational coefficient - * @param phaseMob phase mobility - * @param dPhaseMob derivative of phase mobility wrt pressure, temperature, comp density - * @param dPhaseVolFrac derivative of phase volume fraction wrt pressure, temperature, comp density - * @param dCompFrac_dCompDens derivative of component fraction wrt component density - * @param phaseMassDens phase mass density - * @param dPhaseMassDens derivative of phase mass density wrt pressure, temperature, comp fraction - * @param phaseCapPressure phase capillary pressure - * @param dPhaseCapPressure_dPhaseVolFrac derivative of phase capillary pressure wrt phase volume fraction - * @param k_up uptream index for this phase - * @param potGrad potential gradient for this phase - * @param phaseFlux phase flux - * @param dPhaseFlux_dP derivative of phase flux wrt pressure - * @param dPhaseFlux_dC derivative of phase flux wrt comp density - */ - template< integer numComp, integer numFluxSupportPoints > - GEOS_HOST_DEVICE - static void - compute( integer const numPhase, - integer const ip, - integer const hasCapPressure, - localIndex const ( &seri )[numFluxSupportPoints], - localIndex const ( &sesri )[numFluxSupportPoints], - localIndex const ( &sei )[numFluxSupportPoints], - real64 const ( &trans )[2], - real64 const ( &dTrans_dPres )[2], - ElementViewConst< arrayView1d< real64 const > > const & pres, - ElementViewConst< arrayView1d< real64 const > > const & gravCoef, - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, - ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, - ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - localIndex & k_up, - real64 & potGrad, - real64 ( &phaseFlux ), - real64 ( & dPhaseFlux_dP )[numFluxSupportPoints], - real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp], - real64 ( & compFlux )[numComp], - real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp], - real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp] ) - { - real64 dPresGrad_dP[numFluxSupportPoints]{}; - real64 dPresGrad_dC[numFluxSupportPoints][numComp]{}; - real64 dGravHead_dP[numFluxSupportPoints]{}; - real64 dGravHead_dC[numFluxSupportPoints][numComp]{}; - PotGrad::compute< numComp, numFluxSupportPoints >( numPhase, ip, hasCapPressure, seri, sesri, sei, trans, dTrans_dPres, pres, - gravCoef, phaseVolFrac, dPhaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, - phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, potGrad, dPresGrad_dP, - dPresGrad_dC, dGravHead_dP, dGravHead_dC ); - - // gravity head - real64 gravHead = 0.0; - for( integer i = 0; i < numFluxSupportPoints; i++ ) - { - localIndex const er = seri[i]; - localIndex const esr = sesri[i]; - localIndex const ei = sei[i]; - - real64 const gravD = trans[i] * gravCoef[er][esr][ei]; - - gravHead += gravD; - } - - // *** upwinding *** - - // phase flux and derivatives - - // assuming TPFA in the code below - - real64 Ttrans = fabs( trans[0] ); - potGrad = potGrad / Ttrans; - - real64 const mobility_i = phaseMob[seri[0]][sesri[0]][sei[0]][ip]; - real64 const mobility_j = phaseMob[seri[1]][sesri[1]][sei[1]][ip]; - - // compute phase flux, see Eqs. (66) and (69) from the reference above - real64 smoEps = epsC1PPU; - if( fabs( gravHead ) <= 1e-20 ) - smoEps = 1000; - real64 const tmpSqrt = sqrt( potGrad * potGrad + smoEps * smoEps ); - real64 const smoMax = 0.5 * (-potGrad + tmpSqrt); - - phaseFlux = Ttrans * ( potGrad * mobility_i - smoMax * (mobility_j - mobility_i) ); - - // derivativess - - // first part, mobility derivative - - // dP - { - real64 const dMob_dP = dPhaseMob[seri[0]][sesri[0]][sei[0]][ip][Deriv::dP]; - dPhaseFlux_dP[0] += Ttrans * potGrad * dMob_dP; - } - - // dC - { - arraySlice1d< real64 const, compflow::USD_PHASE_DC - 2 > - dPhaseMobSub = dPhaseMob[seri[0]][sesri[0]][sei[0]][ip]; - for( integer jc = 0; jc < numComp; ++jc ) - { - dPhaseFlux_dC[0][jc] += Ttrans * potGrad * dPhaseMobSub[Deriv::dC + jc]; - } - } - - real64 const tmpInv = 1.0 / tmpSqrt; - real64 const dSmoMax_x = 0.5 * (1.0 - potGrad * tmpInv); - - // pressure gradient and mobility difference depend on all points in the stencil - real64 const dMobDiff_sign[numFluxSupportPoints] = {-1.0, 1.0}; - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - // dP - - real64 const dPotGrad_dP = dPresGrad_dP[ke] - dGravHead_dP[ke]; - - // first part - dPhaseFlux_dP[ke] += dPotGrad_dP * mobility_i; - - // second part - real64 const dSmoMax_dP = -dPotGrad_dP * dSmoMax_x; - dPhaseFlux_dP[ke] += -dSmoMax_dP * (mobility_j - mobility_i); - - real64 const dMob_dP = dPhaseMob[seri[ke]][sesri[ke]][sei[ke]][ip][Deriv::dP]; - dPhaseFlux_dP[ke] += -Ttrans * smoMax * dMobDiff_sign[ke] * dMob_dP; - - // dC - - arraySlice1d< real64 const, compflow::USD_PHASE_DC - 2 > - dPhaseMobSub = dPhaseMob[seri[ke]][sesri[ke]][sei[ke]][ip]; - - for( integer jc = 0; jc < numComp; ++jc ) - { - real64 const dPotGrad_dC = dPresGrad_dC[ke][jc] - dGravHead_dC[ke][jc]; - - // first part - dPhaseFlux_dC[ke][jc] += dPotGrad_dC * mobility_i; - - // second part - real64 const dSmoMax_dC = -dPotGrad_dC * dSmoMax_x; - dPhaseFlux_dC[ke][jc] += -dSmoMax_dC * (mobility_j - mobility_i); - dPhaseFlux_dC[ke][jc] += -Ttrans * smoMax * dMobDiff_sign[ke] * dPhaseMobSub[Deriv::dC + jc]; - } - } - - potGrad = potGrad * Ttrans; - - // choose upstream cell for composition upwinding - k_up = (phaseFlux >= 0) ? 0 : 1; - - //distribute on phaseComponentFlux here - PhaseComponentFlux::compute( ip, k_up, seri, sesri, sei, phaseCompFrac, dPhaseCompFrac, dCompFrac_dCompDens, phaseFlux - , dPhaseFlux_dP, dPhaseFlux_dC, compFlux, dCompFlux_dP, dCompFlux_dC ); - } -}; - - - /************************* HELPERS ******************/ namespace UpwindHelpers { @@ -1040,7 +492,6 @@ computeFractionalFlowGravity( localIndex const numPhase, } } - template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > GEOS_HOST_DEVICE static void @@ -1091,7 +542,6 @@ computeFractionalFlowCapillary( localIndex const numPhase, } } - localIndex k_up; real64 mob{}; real64 dMob_dP{}; @@ -1121,7 +571,6 @@ computeFractionalFlowCapillary( localIndex const numPhase, dMob_dP, dMob_dC ); - k_up_main = k_up; mainMob = mob; dMMob_dP = dMob_dP; @@ -1375,15 +824,11 @@ struct computePotentialCapillary dPot_dComp[i][jc] += transmissibility[i] * dCapPressure_dS * dPhaseVolFrac[er][esr][ei][jp][Deriv::dC + jc]; } - } - } - } }; - /// Form potential-related parts of fluxes template< localIndex numComp, localIndex numFluxSupportPoints, class UPWIND > @@ -1765,10 +1210,8 @@ static void computePotentialFluxesCapillary( localIndex const numPhase, } } } - } - }//end of struct UpwindHelpers /************************* UPWIND ******************/ @@ -2320,8 +1763,6 @@ struct IHUPhaseFlux dPhaseFlux_dC[ke][jc] = 0.; } } - - } //fractional flow loop with IHU @@ -2536,11 +1977,9 @@ struct IHUPhaseFlux }; - - } // namespace isothermalCompositionalMultiPhaseFVMKernelUtilities } // namespace geos -#endif // GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELUTILITIES_HPP_ +#endif // GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_IHUPHASEFLUX_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp deleted file mode 100644 index a80f991003f..00000000000 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp +++ /dev/null @@ -1,2508 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * 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 IsothermalCompositionalMultiphaseBaseKernels.hpp - */ - -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEBASEKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEBASEKERNELS_HPP - -#include "codingUtilities/Utilities.hpp" -#include "common/DataLayouts.hpp" -#include "common/DataTypes.hpp" -#include "common/GEOS_RAJA_Interface.hpp" -#include "constitutive/solid/CoupledSolidBase.hpp" -#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" -#include "functions/TableFunction.hpp" -#include "mesh/ElementSubRegionBase.hpp" -#include "mesh/ObjectManagerBase.hpp" -#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" -#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" -#include "physicsSolvers/KernelLaunchSelectors.hpp" - -namespace geos -{ - - -namespace isothermalCompositionalMultiphaseBaseKernels -{ - -static constexpr real64 minDensForDivision = 1e-10; - -enum class ElementBasedAssemblyKernelFlags -{ - SimpleAccumulation = 1 << 0, // 1 - TotalMassEquation = 1 << 1, // 2 - /// Add more flags like that if needed: - // Flag3 = 1 << 2, // 4 - // Flag4 = 1 << 3, // 8 - // Flag5 = 1 << 4, // 16 - // Flag6 = 1 << 5, // 32 - // Flag7 = 1 << 6, // 64 - // Flag8 = 1 << 7 //128 -}; - -/******************************** PropertyKernelBase ********************************/ - -/** - * @class PropertyKernelBase - * @tparam NUM_COMP number of fluid components - * @brief Define the base interface for the property update kernels - */ -template< integer NUM_COMP > -class PropertyKernelBase -{ -public: - - /// Compile time value for the number of components - static constexpr integer numComp = NUM_COMP; - - /** - * @brief Performs the kernel launch - * @tparam POLICY the policy used in the RAJA kernels - * @tparam KERNEL_TYPE the kernel type - * @param[in] numElems the number of elements - * @param[inout] kernelComponent the kernel component providing access to the compute function - */ - template< typename POLICY, typename KERNEL_TYPE > - static void - launch( localIndex const numElems, - KERNEL_TYPE const & kernelComponent ) - { - forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - kernelComponent.compute( ei ); - } ); - } - - /** - * @brief Performs the kernel launch on a sorted array - * @tparam POLICY the policy used in the RAJA kernels - * @tparam KERNEL_TYPE the kernel type - * @param[in] targetSet the indices of the elements in which we compute the property - * @param[inout] kernelComponent the kernel component providing access to the compute function - */ - template< typename POLICY, typename KERNEL_TYPE > - static void - launch( SortedArrayView< localIndex const > const & targetSet, - KERNEL_TYPE const & kernelComponent ) - { - forAll< POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const i ) - { - localIndex const ei = targetSet[ i ]; - kernelComponent.compute( ei ); - } ); - } - -}; - -namespace internal -{ - - - -template< typename T, typename LAMBDA > -void kernelLaunchSelectorCompSwitch( T value, LAMBDA && lambda ) -{ - static_assert( std::is_integral< T >::value, "kernelLaunchSelectorCompSwitch: type should be integral" ); - - switch( value ) - { - case 1: - { lambda( std::integral_constant< T, 1 >() ); return; } - case 2: - { lambda( std::integral_constant< T, 2 >() ); return; } - case 3: - { lambda( std::integral_constant< T, 3 >() ); return; } - case 4: - { lambda( std::integral_constant< T, 4 >() ); return; } - case 5: - { lambda( std::integral_constant< T, 5 >() ); return; } - default: - { GEOS_ERROR( "Unsupported number of components: " << value ); } - } -} - -} // namespace internal - - -/******************************** GlobalComponentFractionKernel ********************************/ - -/** - * @class GlobalComponentFractionKernel - * @tparam NUM_COMP number of fluid components - * @brief Define the interface for the update kernel in charge of computing the phase volume fractions - */ -template< integer NUM_COMP > -class GlobalComponentFractionKernel : public PropertyKernelBase< NUM_COMP > -{ -public: - - using Base = PropertyKernelBase< NUM_COMP >; - using Base::numComp; - - /** - * @brief Constructor - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - */ - GlobalComponentFractionKernel( ObjectManagerBase & subRegion ) - : Base(), - m_compDens( subRegion.getField< fields::flow::globalCompDensity >() ), - m_compFrac( subRegion.getField< fields::flow::globalCompFraction >() ), - m_dCompFrac_dCompDens( subRegion.getField< fields::flow::dGlobalCompFraction_dGlobalCompDensity >() ) - {} - - /** - * @brief Compute the phase volume fractions in an element - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[in] phaseVolFractionKernelOp the function used to customize the kernel - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void compute( localIndex const ei, - FUNC && compFractionKernelOp = NoOpFunc{} ) const - { - arraySlice1d< real64 const, compflow::USD_COMP - 1 > const compDens = m_compDens[ei]; - arraySlice1d< real64, compflow::USD_COMP - 1 > const compFrac = m_compFrac[ei]; - arraySlice2d< real64, compflow::USD_COMP_DC - 1 > const dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; - - real64 totalDensity = 0.0; - - for( integer ic = 0; ic < numComp; ++ic ) - { - totalDensity += compDens[ic]; - } - - real64 const totalDensityInv = 1.0 / totalDensity; - - for( integer ic = 0; ic < numComp; ++ic ) - { - compFrac[ic] = compDens[ic] * totalDensityInv; - for( integer jc = 0; jc < numComp; ++jc ) - { - dCompFrac_dCompDens[ic][jc] = -compFrac[ic] * totalDensityInv; - } - dCompFrac_dCompDens[ic][ic] += totalDensityInv; - } - - compFractionKernelOp( compFrac, dCompFrac_dCompDens ); - } - -protected: - - // inputs - - // Views on component densities - arrayView2d< real64 const, compflow::USD_COMP > m_compDens; - - // outputs - - // Views on component fraction - arrayView2d< real64, compflow::USD_COMP > m_compFrac; - arrayView3d< real64, compflow::USD_COMP_DC > m_dCompFrac_dCompDens; - -}; - -/** - * @class GlobalComponentFractionKernelFactory - */ -class GlobalComponentFractionKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] numComp the number of fluid components - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - */ - template< typename POLICY > - static void - createAndLaunch( integer const numComp, - ObjectManagerBase & subRegion ) - { - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - integer constexpr NUM_COMP = NC(); - GlobalComponentFractionKernel< NUM_COMP > kernel( subRegion ); - GlobalComponentFractionKernel< NUM_COMP >::template launch< POLICY >( subRegion.size(), kernel ); - } ); - } - -}; - -/******************************** PhaseVolumeFractionKernel ********************************/ - -/** - * @class PhaseVolumeFractionKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_PHASE number of fluid phases - * @brief Define the interface for the property kernel in charge of computing the phase volume fractions - */ -template< integer NUM_COMP, integer NUM_PHASE > -class PhaseVolumeFractionKernel : public PropertyKernelBase< NUM_COMP > -{ -public: - - using Base = PropertyKernelBase< NUM_COMP >; - using Base::numComp; - - /// Compile time value for the number of phases - static constexpr integer numPhase = NUM_PHASE; - - /** - * @brief Constructor - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - */ - PhaseVolumeFractionKernel( ObjectManagerBase & subRegion, - constitutive::MultiFluidBase const & fluid ) - : Base(), - m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), - m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), - m_compDens( subRegion.getField< fields::flow::globalCompDensity >() ), - m_dCompFrac_dCompDens( subRegion.getField< fields::flow::dGlobalCompFraction_dGlobalCompDensity >() ), - m_phaseFrac( fluid.phaseFraction() ), - m_dPhaseFrac( fluid.dPhaseFraction() ), - m_phaseDens( fluid.phaseDensity() ), - m_dPhaseDens( fluid.dPhaseDensity() ) - {} - - /** - * @brief Compute the phase volume fractions in an element - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[in] phaseVolFractionKernelOp the function used to customize the kernel - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - real64 compute( localIndex const ei, - FUNC && phaseVolFractionKernelOp = NoOpFunc{} ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - arraySlice1d< real64 const, compflow::USD_COMP - 1 > const compDens = m_compDens[ei]; - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseFrac = m_phaseFrac[ei][0]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseFrac = m_dPhaseFrac[ei][0]; - arraySlice1d< real64, compflow::USD_PHASE - 1 > const phaseVolFrac = m_phaseVolFrac[ei]; - arraySlice2d< real64, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; - - real64 work[numComp]{}; - - // compute total density from component partial densities - real64 totalDensity = 0.0; - real64 const dTotalDens_dCompDens = 1.0; - for( integer ic = 0; ic < numComp; ++ic ) - { - totalDensity += compDens[ic]; - } - - real64 maxDeltaPhaseVolFrac = 0.0; - - for( integer ip = 0; ip < numPhase; ++ip ) - { - - // set the saturation to zero if the phase is absent - bool const phaseExists = (phaseFrac[ip] > 0); - if( !phaseExists ) - { - phaseVolFrac[ip] = 0.; - for( integer jc = 0; jc < numComp+2; ++jc ) - { - dPhaseVolFrac[ip][jc] = 0.; - } - continue; - } - - // Expression for volume fractions: S_p = (nu_p / rho_p) * rho_t - real64 const phaseDensInv = 1.0 / phaseDens[ip]; - - // store old saturation to compute change later - real64 const satOld = phaseVolFrac[ip]; - - // compute saturation and derivatives except multiplying by the total density - phaseVolFrac[ip] = phaseFrac[ip] * phaseDensInv; - - dPhaseVolFrac[ip][Deriv::dP] = - (dPhaseFrac[ip][Deriv::dP] - phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dP]) * phaseDensInv; - - for( integer jc = 0; jc < numComp; ++jc ) - { - dPhaseVolFrac[ip][Deriv::dC+jc] = - (dPhaseFrac[ip][Deriv::dC+jc] - phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dC+jc]) * phaseDensInv; - } - - // apply chain rule to convert derivatives from global component fractions to densities - applyChainRuleInPlace( numComp, dCompFrac_dCompDens, dPhaseVolFrac[ip], work, Deriv::dC ); - - // call the lambda in the phase loop to allow the reuse of the phaseVolFrac and totalDensity - // possible use: assemble the derivatives wrt temperature - phaseVolFractionKernelOp( ip, phaseVolFrac[ip], phaseDensInv, totalDensity ); - - // now finalize the computation by multiplying by total density - for( integer jc = 0; jc < numComp; ++jc ) - { - dPhaseVolFrac[ip][Deriv::dC+jc] *= totalDensity; - dPhaseVolFrac[ip][Deriv::dC+jc] += phaseVolFrac[ip] * dTotalDens_dCompDens; - } - - phaseVolFrac[ip] *= totalDensity; - dPhaseVolFrac[ip][Deriv::dP] *= totalDensity; - - real64 const deltaPhaseVolFrac = LvArray::math::abs( phaseVolFrac[ip] - satOld ); - if( maxDeltaPhaseVolFrac < deltaPhaseVolFrac ) - { - maxDeltaPhaseVolFrac = deltaPhaseVolFrac; - } - } - return maxDeltaPhaseVolFrac; - } - - /** - * @brief Performs the kernel launch - * @tparam POLICY the policy used in the RAJA kernels - * @tparam KERNEL_TYPE the kernel type - * @param[in] numElems the number of elements - * @param[inout] kernelComponent the kernel component providing access to the compute function - */ - template< typename POLICY, typename KERNEL_TYPE > - static real64 - launch( localIndex const numElems, - KERNEL_TYPE const & kernelComponent ) - { - RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaPhaseVolFrac( 0.0 ); - forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - real64 const deltaPhaseVolFrac = kernelComponent.compute( ei ); - maxDeltaPhaseVolFrac.max( deltaPhaseVolFrac ); - } ); - return maxDeltaPhaseVolFrac.get(); - } - -protected: - - // outputs - - /// Views on phase volume fractions - arrayView2d< real64, compflow::USD_PHASE > m_phaseVolFrac; - arrayView3d< real64, compflow::USD_PHASE_DC > m_dPhaseVolFrac; - - // inputs - - /// Views on component densities - arrayView2d< real64 const, compflow::USD_COMP > m_compDens; - arrayView3d< real64 const, compflow::USD_COMP_DC > m_dCompFrac_dCompDens; - - /// Views on phase fractions - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseFrac; - arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseFrac; - - /// Views on phase densities - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseDens; - arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseDens; - -}; - -/** - * @class PhaseVolumeFractionKernelFactory - */ -class PhaseVolumeFractionKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] numComp the number of fluid components - * @param[in] numPhase the number of fluid phases - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - */ - template< typename POLICY > - static real64 - createAndLaunch( integer const numComp, - integer const numPhase, - ObjectManagerBase & subRegion, - constitutive::MultiFluidBase const & fluid ) - { - real64 maxDeltaPhaseVolFrac = 0.0; - if( numPhase == 2 ) - { - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - integer constexpr NUM_COMP = NC(); - PhaseVolumeFractionKernel< NUM_COMP, 2 > kernel( subRegion, fluid ); - maxDeltaPhaseVolFrac = PhaseVolumeFractionKernel< NUM_COMP, 2 >::template launch< POLICY >( subRegion.size(), kernel ); - } ); - } - else if( numPhase == 3 ) - { - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - integer constexpr NUM_COMP = NC(); - PhaseVolumeFractionKernel< NUM_COMP, 3 > kernel( subRegion, fluid ); - maxDeltaPhaseVolFrac = PhaseVolumeFractionKernel< NUM_COMP, 3 >::template launch< POLICY >( subRegion.size(), kernel ); - } ); - } - return maxDeltaPhaseVolFrac; - } -}; - - -/******************************** RelativePermeabilityUpdateKernel ********************************/ - -struct RelativePermeabilityUpdateKernel -{ - template< typename POLICY, typename RELPERM_WRAPPER > - static void - launch( localIndex const size, - RELPERM_WRAPPER const & relPermWrapper, - arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac ) - { - forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - for( localIndex q = 0; q < relPermWrapper.numGauss(); ++q ) - { - relPermWrapper.update( k, q, phaseVolFrac[k] ); - } - } ); - } - - template< typename POLICY, typename RELPERM_WRAPPER > - static void - launch( SortedArrayView< localIndex const > const & targetSet, - RELPERM_WRAPPER const & relPermWrapper, - arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac ) - { - forAll< POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const a ) - { - localIndex const k = targetSet[a]; - for( localIndex q = 0; q < relPermWrapper.numGauss(); ++q ) - { - relPermWrapper.update( k, q, phaseVolFrac[k] ); - } - } ); - } -}; - -/******************************** CapillaryPressureUpdateKernel ********************************/ - -struct CapillaryPressureUpdateKernel -{ - template< typename POLICY, typename CAPPRES_WRAPPER > - static void - launch( localIndex const size, - CAPPRES_WRAPPER const & capPresWrapper, - arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac ) - { - forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - for( localIndex q = 0; q < capPresWrapper.numGauss(); ++q ) - { - capPresWrapper.update( k, q, phaseVolFrac[k] ); - } - } ); - } - - template< typename POLICY, typename CAPPRES_WRAPPER > - static void - launch( SortedArrayView< localIndex const > const & targetSet, - CAPPRES_WRAPPER const & capPresWrapper, - arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac ) - { - forAll< POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const a ) - { - localIndex const k = targetSet[a]; - for( localIndex q = 0; q < capPresWrapper.numGauss(); ++q ) - { - capPresWrapper.update( k, q, phaseVolFrac[k] ); - } - } ); - } -}; - -/******************************** ElementBasedAssemblyKernel ********************************/ - -/** - * @class ElementBasedAssemblyKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_DOF number of degrees of freedom - * @brief Define the interface for the assembly kernel in charge of accumulation and volume balance - */ -template< integer NUM_COMP, integer NUM_DOF > -class ElementBasedAssemblyKernel -{ -public: - - /// Compile time value for the number of components - static constexpr integer numComp = NUM_COMP; - - /// Compute time value for the number of degrees of freedom - static constexpr integer numDof = NUM_DOF; - - /// Compute time value for the number of equations - static constexpr integer numEqn = NUM_DOF; - - /** - * @brief Constructor - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - ElementBasedAssemblyKernel( localIndex const numPhases, - globalIndex const rankOffset, - string const dofKey, - ElementSubRegionBase const & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< ElementBasedAssemblyKernelFlags > const kernelFlags ) - : m_numPhases( numPhases ), - m_rankOffset( rankOffset ), - m_dofNumber( subRegion.getReference< array1d< globalIndex > >( dofKey ) ), - m_elemGhostRank( subRegion.ghostRank() ), - m_volume( subRegion.getElementVolume() ), - m_porosity( solid.getPorosity() ), - m_dPoro_dPres( solid.getDporosity_dPressure() ), - m_dCompFrac_dCompDens( subRegion.getField< fields::flow::dGlobalCompFraction_dGlobalCompDensity >() ), - m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), - m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), - m_phaseDens( fluid.phaseDensity() ), - m_dPhaseDens( fluid.dPhaseDensity() ), - m_phaseCompFrac( fluid.phaseCompFraction() ), - m_dPhaseCompFrac( fluid.dPhaseCompFraction() ), - m_compDens( subRegion.getField< fields::flow::globalCompDensity >() ), - m_compAmount_n( subRegion.getField< fields::flow::compAmount_n >() ), - m_localMatrix( localMatrix ), - m_localRhs( localRhs ), - m_kernelFlags( kernelFlags ) - {} - - /** - * @struct StackVariables - * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack - */ - struct StackVariables - { -public: - - // Pore volume information (used by both accumulation and volume balance) - - /// Pore volume at time n+1 - real64 poreVolume = 0.0; - - /// Derivative of pore volume with respect to pressure - real64 dPoreVolume_dPres = 0.0; - - // Residual information - - /// Index of the local row corresponding to this element - localIndex localRow = -1; - - /// Indices of the matrix rows/columns corresponding to the dofs in this element - globalIndex dofIndices[numDof]{}; - - /// C-array storage for the element local residual vector (all equations except volume balance) - real64 localResidual[numEqn]{}; - - /// C-array storage for the element local Jacobian matrix (all equations except volume balance, all dofs) - real64 localJacobian[numEqn][numDof]{}; - - }; - - /** - * @brief Getter for the ghost rank of an element - * @param[in] ei the element index - * @return the ghost rank of the element - */ - GEOS_HOST_DEVICE - integer elemGhostRank( localIndex const ei ) const - { return m_elemGhostRank( ei ); } - - - /** - * @brief Performs the setup phase for the kernel. - * @param[in] ei the element index - * @param[in] stack the stack variables - */ - GEOS_HOST_DEVICE - void setup( localIndex const ei, - StackVariables & stack ) const - { - // initialize the pore volume - stack.poreVolume = m_volume[ei] * m_porosity[ei][0]; - stack.dPoreVolume_dPres = m_volume[ei] * m_dPoro_dPres[ei][0]; - - // set row index and degrees of freedom indices for this element - stack.localRow = m_dofNumber[ei] - m_rankOffset; - for( integer idof = 0; idof < numDof; ++idof ) - { - stack.dofIndices[idof] = m_dofNumber[ei] + idof; - } - } - - /** - * @brief Compute the local accumulation contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[inout] stack the stack variables - * @param[in] phaseAmountKernelOp the function used to customize the kernel - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void computeAccumulation( localIndex const ei, - StackVariables & stack, - FUNC && phaseAmountKernelOp = NoOpFunc{} ) const - { - if( m_kernelFlags.isSet( ElementBasedAssemblyKernelFlags::SimpleAccumulation ) ) - { - // ic - index of component whose conservation equation is assembled - // (i.e. row number in local matrix) - for( integer ic = 0; ic < numComp; ++ic ) - { - real64 const compAmount = stack.poreVolume * m_compDens[ei][ic]; - real64 const compAmount_n = m_compAmount_n[ei][ic]; - - stack.localResidual[ic] += compAmount - compAmount_n; - - // Pavel: commented below is some experiment, needs to be re-tested - //real64 const compDens = (ic == 0 && m_compDens[ei][ic] < 1e-6) ? 1e-3 : m_compDens[ei][ic]; - real64 const dCompAmount_dP = stack.dPoreVolume_dPres * m_compDens[ei][ic]; - stack.localJacobian[ic][0] += dCompAmount_dP; - - real64 const dCompAmount_dC = stack.poreVolume; - stack.localJacobian[ic][ic + 1] += dCompAmount_dC; - } - } - else - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - // construct the slices for variables accessed multiple times - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; - - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; - - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseDens = m_phaseDens[ei][0]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; - - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; - arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; - - // temporary work arrays - real64 dPhaseAmount_dC[numComp]{}; - real64 dPhaseCompFrac_dC[numComp]{}; - - // start with old time step values - for( integer ic = 0; ic < numComp; ++ic ) - { - stack.localResidual[ic] = -m_compAmount_n[ei][ic]; - } - - // sum contributions to component accumulation from each phase - for( integer ip = 0; ip < m_numPhases; ++ip ) - { - real64 const phaseAmount = stack.poreVolume * phaseVolFrac[ip] * phaseDens[ip]; - - real64 const dPhaseAmount_dP = stack.dPoreVolume_dPres * phaseVolFrac[ip] * phaseDens[ip] - + stack.poreVolume * ( dPhaseVolFrac[ip][Deriv::dP] * phaseDens[ip] - + phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dP] ); - - // assemble density dependence - applyChainRule( numComp, dCompFrac_dCompDens, dPhaseDens[ip], dPhaseAmount_dC, Deriv::dC ); - for( integer jc = 0; jc < numComp; ++jc ) - { - dPhaseAmount_dC[jc] = dPhaseAmount_dC[jc] * phaseVolFrac[ip] - + phaseDens[ip] * dPhaseVolFrac[ip][Deriv::dC + jc]; - dPhaseAmount_dC[jc] *= stack.poreVolume; - } - - // ic - index of component whose conservation equation is assembled - // (i.e. row number in local matrix) - for( integer ic = 0; ic < numComp; ++ic ) - { - real64 const phaseCompAmount = phaseAmount * phaseCompFrac[ip][ic]; - - real64 const dPhaseCompAmount_dP = dPhaseAmount_dP * phaseCompFrac[ip][ic] - + phaseAmount * dPhaseCompFrac[ip][ic][Deriv::dP]; - - stack.localResidual[ic] += phaseCompAmount; - stack.localJacobian[ic][0] += dPhaseCompAmount_dP; - - // jc - index of component w.r.t. whose compositional var the derivative is being taken - // (i.e. col number in local matrix) - - // assemble phase composition dependence - applyChainRule( numComp, dCompFrac_dCompDens, dPhaseCompFrac[ip][ic], dPhaseCompFrac_dC, Deriv::dC ); - for( integer jc = 0; jc < numComp; ++jc ) - { - real64 const dPhaseCompAmount_dC = dPhaseCompFrac_dC[jc] * phaseAmount - + phaseCompFrac[ip][ic] * dPhaseAmount_dC[jc]; - - stack.localJacobian[ic][jc + 1] += dPhaseCompAmount_dC; - } - } - - // call the lambda in the phase loop to allow the reuse of the phase amounts and their derivatives - // possible use: assemble the derivatives wrt temperature, and the accumulation term of the energy equation for this phase - phaseAmountKernelOp( ip, phaseAmount, dPhaseAmount_dP, dPhaseAmount_dC ); - - } - } - } - - /** - * @brief Compute the local volume balance contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[inout] stack the stack variables - * @param[in] phaseVolFractionSumKernelOp the function used to customize the kernel - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void computeVolumeBalance( localIndex const ei, - StackVariables & stack, - FUNC && phaseVolFractionSumKernelOp = NoOpFunc{} ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; - - real64 oneMinusPhaseVolFracSum = 1.0; - - // sum contributions to component accumulation from each phase - for( integer ip = 0; ip < m_numPhases; ++ip ) - { - oneMinusPhaseVolFracSum -= phaseVolFrac[ip]; - stack.localJacobian[numComp][0] -= dPhaseVolFrac[ip][Deriv::dP]; - - for( integer jc = 0; jc < numComp; ++jc ) - { - stack.localJacobian[numComp][jc+1] -= dPhaseVolFrac[ip][Deriv::dC+jc]; - } - } - - // call the lambda in the phase loop to allow the reuse of the phase amounts and their derivatives - // possible use: assemble the derivatives wrt temperature, and use oneMinusPhaseVolFracSum if poreVolume depends on temperature - phaseVolFractionSumKernelOp( oneMinusPhaseVolFracSum ); - - // scale saturation-based volume balance by pore volume (for better scaling w.r.t. other equations) - stack.localResidual[numComp] = stack.poreVolume * oneMinusPhaseVolFracSum; - for( integer idof = 0; idof < numDof; ++idof ) - { - stack.localJacobian[numComp][idof] *= stack.poreVolume; - } - stack.localJacobian[numComp][0] += stack.dPoreVolume_dPres * oneMinusPhaseVolFracSum; - } - - /** - * @brief Performs the complete phase for the kernel. - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void complete( localIndex const GEOS_UNUSED_PARAM( ei ), - StackVariables & stack ) const - { - using namespace compositionalMultiphaseUtilities; - - if( m_kernelFlags.isSet( ElementBasedAssemblyKernelFlags::TotalMassEquation ) ) - { - // apply equation/variable change transformation to the component mass balance equations - real64 work[numDof]{}; - shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComp, numDof, stack.localJacobian, work ); - shiftElementsAheadByOneAndReplaceFirstElementWithSum( numComp, stack.localResidual ); - } - - // add contribution to residual and jacobian into: - // - the component mass balance equations (i = 0 to i = numComp-1) - // - the volume balance equations (i = numComp) - // note that numDof includes derivatives wrt temperature if this class is derived in ThermalKernels - integer const numRows = numComp+1; - for( integer i = 0; i < numRows; ++i ) - { - m_localRhs[stack.localRow + i] += stack.localResidual[i]; - m_localMatrix.addToRow< serialAtomic >( stack.localRow + i, - stack.dofIndices, - stack.localJacobian[i], - numDof ); - } - } - - /** - * @brief Performs the kernel launch - * @tparam POLICY the policy used in the RAJA kernels - * @tparam KERNEL_TYPE the kernel type - * @param[in] numElems the number of elements - * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables - */ - template< typename POLICY, typename KERNEL_TYPE > - static void - launch( localIndex const numElems, - KERNEL_TYPE const & kernelComponent ) - { - GEOS_MARK_FUNCTION; - - forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( kernelComponent.elemGhostRank( ei ) >= 0 ) - { - return; - } - - typename KERNEL_TYPE::StackVariables stack; - - kernelComponent.setup( ei, stack ); - kernelComponent.computeAccumulation( ei, stack ); - kernelComponent.computeVolumeBalance( ei, stack ); - kernelComponent.complete( ei, stack ); - } ); - } - -protected: - - /// Number of fluid phases - integer const m_numPhases; - - /// Offset for my MPI rank - globalIndex const m_rankOffset; - - /// View on the dof numbers - arrayView1d< globalIndex const > const m_dofNumber; - - /// View on the ghost ranks - arrayView1d< integer const > const m_elemGhostRank; - - /// View on the element volumes - arrayView1d< real64 const > const m_volume; - - /// Views on the porosity - arrayView2d< real64 const > const m_porosity; - arrayView2d< real64 const > const m_dPoro_dPres; - - /// Views on the derivatives of comp fractions wrt component density - arrayView3d< real64 const, compflow::USD_COMP_DC > const m_dCompFrac_dCompDens; - - /// Views on the phase volume fractions - arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFrac; - arrayView3d< real64 const, compflow::USD_PHASE_DC > const m_dPhaseVolFrac; - - /// Views on the phase densities - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseDens; - arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > const m_dPhaseDens; - - /// Views on the phase component fraction - arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const m_phaseCompFrac; - arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > const m_dPhaseCompFrac; - - // View on component densities - arrayView2d< real64 const, compflow::USD_COMP > m_compDens; - - // View on component amount (mass/moles) from previous time step - arrayView2d< real64 const, compflow::USD_COMP > m_compAmount_n; - - /// View on the local CRS matrix - CRSMatrixView< real64, globalIndex const > const m_localMatrix; - /// View on the local RHS - arrayView1d< real64 > const m_localRhs; - - BitFlags< ElementBasedAssemblyKernelFlags > const m_kernelFlags; -}; - -/** - * @class ElementBasedAssemblyKernelFactory - */ -class ElementBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] numComps the number of fluid components - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY > - static void - createAndLaunch( integer const numComps, - integer const numPhases, - globalIndex const rankOffset, - integer const useTotalMassEquation, - integer const useSimpleAccumulation, - string const dofKey, - ElementSubRegionBase const & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - internal::kernelLaunchSelectorCompSwitch( numComps, [&] ( auto NC ) - { - integer constexpr NUM_COMP = NC(); - integer constexpr NUM_DOF = NC()+1; - - BitFlags< ElementBasedAssemblyKernelFlags > kernelFlags; - if( useTotalMassEquation ) - kernelFlags.set( ElementBasedAssemblyKernelFlags::TotalMassEquation ); - if( useSimpleAccumulation ) - kernelFlags.set( ElementBasedAssemblyKernelFlags::SimpleAccumulation ); - - ElementBasedAssemblyKernel< NUM_COMP, NUM_DOF > - kernel( numPhases, rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs, kernelFlags ); - ElementBasedAssemblyKernel< NUM_COMP, NUM_DOF >::template launch< POLICY >( subRegion.size(), kernel ); - } ); - } - -}; - -/******************************** SolutionScalingKernelKernel ********************************/ - -/** - * @class ScalingAndCheckingSystemSolutionKernelBase - * @brief Define the kernel for scaling the solution and check its validity - */ -template< typename TYPE > -class ScalingAndCheckingSystemSolutionKernelBase -{ -public: - - /** - * @brief Create a new kernel instance - * @param[in] rankOffset the rank offset - * @param[in] numComp the number of components - * @param[in] dofKey the dof key to get dof numbers - * @param[in] subRegion the subRegion - * @param[in] localSolution the Newton update - * @param[in] pressure the pressure vector - * @param[in] compDens the component density vector - * @param[in] pressureScalingFactor the pressure local scaling factor - * @param[in] compDensScalingFactor the component local scaling factor - */ - ScalingAndCheckingSystemSolutionKernelBase( globalIndex const rankOffset, - integer const numComp, - string const dofKey, - ElementSubRegionBase const & subRegion, - arrayView1d< real64 const > const localSolution, - arrayView1d< real64 const > const pressure, - arrayView2d< real64 const, compflow::USD_COMP > const compDens, - arrayView1d< real64 > pressureScalingFactor, - arrayView1d< real64 > compDensScalingFactor ) - : m_rankOffset( rankOffset ), - m_numComp( numComp ), - m_dofNumber( subRegion.getReference< array1d< globalIndex > >( dofKey ) ), - m_ghostRank( subRegion.ghostRank() ), - m_localSolution( localSolution ), - m_pressure( pressure ), // not passed with fields::flow to be able to reuse this for wells - m_compDens( compDens ), // same here - m_pressureScalingFactor( pressureScalingFactor ), - m_compDensScalingFactor( compDensScalingFactor ) - { } - - /** - * @struct StackVariables - * @brief Kernel variables located on the stack - */ - struct StackVariables - { - GEOS_HOST_DEVICE - StackVariables() - { } - - StackVariables( real64 _localMinVal ) - : - localMinVal( _localMinVal ) - { } - - /// Index of the local row corresponding to this element - localIndex localRow; - - /// The local value - TYPE localMinVal; - }; - - /** - * @brief Performs the setup phase for the kernel. - * @param[in] ei the element index - * @param[in] stack the stack variables - */ - GEOS_HOST_DEVICE - void setup( localIndex const ei, - StackVariables & stack ) const - { - stack.localMinVal = 1; - - // set row index and degrees of freedom indices for this element - stack.localRow = m_dofNumber[ei] - m_rankOffset; - } - - /** - * @brief Getter for the ghost rank - * @param[in] i the looping index of the element/node/face - * @return the ghost rank of the element/node/face - */ - GEOS_HOST_DEVICE - integer ghostRank( localIndex const i ) const - { return m_ghostRank( i ); } - - /** - * @brief Performs the kernel launch - * @tparam POLICY the policy used in the RAJA kernels - * @tparam KERNEL_TYPE the kernel type - * @param[in] numElems the number of elements - * @param[inout] kernelComponent the kernel component providing access to the compute function - */ - template< typename POLICY, typename KERNEL_TYPE > - static TYPE - launch( localIndex const numElems, - KERNEL_TYPE const & kernelComponent ) - { - RAJA::ReduceMin< ReducePolicy< POLICY >, TYPE > minVal( 1 ); - forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( kernelComponent.ghostRank( ei ) >= 0 ) - { - return; - } - - StackVariables stack; - kernelComponent.setup( ei, stack ); - kernelComponent.compute( ei, stack ); - minVal.min( stack.localMinVal ); - } ); - - return minVal.get(); - } - -protected: - - /// Offset for my MPI rank - globalIndex const m_rankOffset; - - /// Number of components - real64 const m_numComp; - - /// View on the dof numbers - arrayView1d< globalIndex const > const m_dofNumber; - - /// View on the ghost ranks - arrayView1d< integer const > const m_ghostRank; - - /// View on the local residual - arrayView1d< real64 const > const m_localSolution; - - /// View on the primary variables - arrayView1d< real64 const > const m_pressure; - arrayView2d< real64 const, compflow::USD_COMP > const m_compDens; - - /// View on the scaling factors - arrayView1d< real64 > const m_pressureScalingFactor; - arrayView1d< real64 > const m_compDensScalingFactor; - -}; - -/** - * @class ScalingForSystemSolutionKernel - * @brief Define the kernel for scaling the Newton update - */ -class ScalingForSystemSolutionKernel : public ScalingAndCheckingSystemSolutionKernelBase< real64 > -{ -public: - - using Base = ScalingAndCheckingSystemSolutionKernelBase< real64 >; - using Base::m_rankOffset; - using Base::m_numComp; - using Base::m_dofNumber; - using Base::m_ghostRank; - using Base::m_localSolution; - using Base::m_pressure; - using Base::m_compDens; - using Base::m_pressureScalingFactor; - using Base::m_compDensScalingFactor; - - /** - * @brief Create a new kernel instance - * @param[in] maxRelativePresChange the max allowed relative pressure change - * @param[in] maxAbsolutePresChange the max allowed absolute pressure change - * @param[in] maxCompFracChange the max allowed comp fraction change - * @param[in] maxRelativeCompDensChange the max allowed comp density change - * @param[in] rankOffset the rank offset - * @param[in] numComp the number of components - * @param[in] dofKey the dof key to get dof numbers - * @param[in] subRegion the subRegion - * @param[in] localSolution the Newton update - * @param[in] pressure the pressure vector - * @param[in] compDens the component density vector - * @param[in] pressureScalingFactor the pressure local scaling factor - * @param[in] compDensScalingFactor the component density local scaling factor - */ - ScalingForSystemSolutionKernel( real64 const maxRelativePresChange, - real64 const maxAbsolutePresChange, - real64 const maxCompFracChange, - real64 const maxRelativeCompDensChange, - globalIndex const rankOffset, - integer const numComp, - string const dofKey, - ElementSubRegionBase const & subRegion, - arrayView1d< real64 const > const localSolution, - arrayView1d< real64 const > const pressure, - arrayView2d< real64 const, compflow::USD_COMP > const compDens, - arrayView1d< real64 > pressureScalingFactor, - arrayView1d< real64 > compDensScalingFactor ) - : Base( rankOffset, - numComp, - dofKey, - subRegion, - localSolution, - pressure, - compDens, - pressureScalingFactor, - compDensScalingFactor ), - m_maxRelativePresChange( maxRelativePresChange ), - m_maxAbsolutePresChange( maxAbsolutePresChange ), - m_maxCompFracChange( maxCompFracChange ), - m_maxRelativeCompDensChange( maxRelativeCompDensChange ) - {} - - /** - * @struct StackVariables - * @brief Kernel variables located on the stack - */ - struct StackVariables : public Base::StackVariables - { - GEOS_HOST_DEVICE - StackVariables() - { } - - StackVariables( real64 _localMinVal, - real64 _localMaxDeltaPres, - real64 _localMaxDeltaTemp, - real64 _localMaxDeltaCompDens, - real64 _localMinPresScalingFactor, - real64 _localMinTempScalingFactor, - real64 _localMinCompDensScalingFactor ) - : - Base::StackVariables( _localMinVal ), - localMaxDeltaPres( _localMaxDeltaPres ), - localMaxDeltaTemp( _localMaxDeltaTemp ), - localMaxDeltaCompDens( _localMaxDeltaCompDens ), - localMinPresScalingFactor( _localMinPresScalingFactor ), - localMinTempScalingFactor( _localMinTempScalingFactor ), - localMinCompDensScalingFactor( _localMinCompDensScalingFactor ) - { } - - real64 localMaxDeltaPres; - real64 localMaxDeltaTemp; - real64 localMaxDeltaCompDens; - - real64 localMinPresScalingFactor; - real64 localMinTempScalingFactor; - real64 localMinCompDensScalingFactor; - - }; - - /** - * @brief Performs the kernel launch - * @tparam POLICY the policy used in the RAJA kernels - * @tparam KERNEL_TYPE the kernel type - * @param[in] numElems the number of elements - * @param[inout] kernelComponent the kernel component providing access to the compute function - */ - template< typename POLICY, typename KERNEL_TYPE > - static StackVariables - launch( localIndex const numElems, - KERNEL_TYPE const & kernelComponent ) - { - RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > globalScalingFactor( 1.0 ); - - RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaPres( 0.0 ); - RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaTemp( 0.0 ); - RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaCompDens( 0.0 ); - - RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minPresScalingFactor( 1.0 ); - RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minTempScalingFactor( 1.0 ); - RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minCompDensScalingFactor( 1.0 ); - - forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( kernelComponent.ghostRank( ei ) >= 0 ) - { - return; - } - - StackVariables stack; - kernelComponent.setup( ei, stack ); - kernelComponent.compute( ei, stack ); - - globalScalingFactor.min( stack.localMinVal ); - - maxDeltaPres.max( stack.localMaxDeltaPres ); - maxDeltaTemp.max( stack.localMaxDeltaTemp ); - maxDeltaCompDens.max( stack.localMaxDeltaCompDens ); - - minPresScalingFactor.min( stack.localMinPresScalingFactor ); - minTempScalingFactor.min( stack.localMinTempScalingFactor ); - minCompDensScalingFactor.min( stack.localMinCompDensScalingFactor ); - } ); - - return StackVariables( globalScalingFactor.get(), - maxDeltaPres.get(), - maxDeltaTemp.get(), - maxDeltaCompDens.get(), - minPresScalingFactor.get(), - minTempScalingFactor.get(), - minCompDensScalingFactor.get() ); - } - - GEOS_HOST_DEVICE - void setup( localIndex const ei, - StackVariables & stack ) const - { - Base::setup( ei, stack ); - - stack.localMaxDeltaPres = 0.0; - stack.localMaxDeltaTemp = 0.0; - stack.localMaxDeltaCompDens = 0.0; - - stack.localMinPresScalingFactor = 1.0; - stack.localMinTempScalingFactor = 1.0; - stack.localMinCompDensScalingFactor = 1.0; - } - - /** - * @brief Compute the local value - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void compute( localIndex const ei, - StackVariables & stack ) const - { - computeScalingFactor( ei, stack ); - } - - /** - * @brief Compute the local value of the scaling factor - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[inout] stack the stack variables - * @param[in] kernelOp the function used to customize the kernel - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void computeScalingFactor( localIndex const ei, - StackVariables & stack, - FUNC && kernelOp = NoOpFunc{} ) const - { - real64 constexpr eps = minDensForDivision; - - // compute the change in pressure - real64 const pres = m_pressure[ei]; - real64 const absPresChange = LvArray::math::abs( m_localSolution[stack.localRow] ); - if( stack.localMaxDeltaPres < absPresChange ) - { - stack.localMaxDeltaPres = absPresChange; - } - - // compute pressure scaling factor - real64 presScalingFactor = 1.0; - // when enabled, absolute change scaling has a priority over relative change - if( m_maxAbsolutePresChange > 0.0 ) // maxAbsolutePresChange <= 0.0 means that absolute scaling is disabled - { - if( absPresChange > m_maxAbsolutePresChange ) - { - presScalingFactor = m_maxAbsolutePresChange / absPresChange; - } - } - else if( pres > eps ) - { - real64 const relativePresChange = absPresChange / pres; - if( relativePresChange > m_maxRelativePresChange ) - { - presScalingFactor = m_maxRelativePresChange / relativePresChange; - } - } - m_pressureScalingFactor[ei] = presScalingFactor; - if( stack.localMinVal > presScalingFactor ) - { - stack.localMinVal = presScalingFactor; - } - if( stack.localMinPresScalingFactor > presScalingFactor ) - { - stack.localMinPresScalingFactor = presScalingFactor; - } - - real64 prevTotalDens = 0; - for( integer ic = 0; ic < m_numComp; ++ic ) - { - prevTotalDens += m_compDens[ei][ic]; - } - - m_compDensScalingFactor[ei] = 1.0; - - // compute the change in component densities and component fractions - for( integer ic = 0; ic < m_numComp; ++ic ) - { - // compute scaling factor based on relative change in component densities - real64 const absCompDensChange = LvArray::math::abs( m_localSolution[stack.localRow + ic + 1] ); - if( stack.localMaxDeltaCompDens < absCompDensChange ) - { - stack.localMaxDeltaCompDens = absCompDensChange; - } - - // This actually checks the change in component fraction, using a lagged total density - // Indeed we can rewrite the following check as: - // | prevCompDens / prevTotalDens - newCompDens / prevTotalDens | > maxCompFracChange - // Note that the total density in the second term is lagged (i.e, we use prevTotalDens) - // because I found it more robust than using directly newTotalDens (which can vary also - // wildly when the compDens change is large) - real64 const maxAbsCompDensChange = m_maxCompFracChange * prevTotalDens; - if( absCompDensChange > maxAbsCompDensChange && absCompDensChange > eps ) - { - real64 const compScalingFactor = maxAbsCompDensChange / absCompDensChange; - m_compDensScalingFactor[ei] = LvArray::math::min( m_compDensScalingFactor[ei], compScalingFactor ); - if( stack.localMinVal > compScalingFactor ) - { - stack.localMinVal = compScalingFactor; - } - if( stack.localMinCompDensScalingFactor > compScalingFactor ) - { - stack.localMinCompDensScalingFactor = compScalingFactor; - } - } - - // switch from relative to absolute when value is < 1.0 - real64 const maxRelCompDensChange = m_maxRelativeCompDensChange * LvArray::math::max( m_compDens[ei][ic], 1.0 ); - if( absCompDensChange > maxRelCompDensChange && absCompDensChange > eps ) - { - real64 const compScalingFactor = maxRelCompDensChange / absCompDensChange; - m_compDensScalingFactor[ei] = LvArray::math::min( m_compDensScalingFactor[ei], compScalingFactor ); - if( stack.localMinVal > compScalingFactor ) - { - stack.localMinVal = compScalingFactor; - } - if( stack.localMinCompDensScalingFactor > compScalingFactor ) - { - stack.localMinCompDensScalingFactor = compScalingFactor; - } - } - } - - // compute the scaling factor for other vars, such as temperature - kernelOp(); - } - -protected: - - /// Max allowed changes in primary variables - real64 const m_maxRelativePresChange; - real64 const m_maxAbsolutePresChange; - real64 const m_maxCompFracChange; - real64 const m_maxRelativeCompDensChange; - -}; - -/** - * @class ScalingForSystemSolutionKernelFactory - */ -class ScalingForSystemSolutionKernelFactory -{ -public: - - /* - * @brief Create and launch the kernel computing the scaling factor - * @tparam POLICY the kernel policy - * @param[in] maxRelativePresChange the max allowed relative pressure change - * @param[in] maxAbsolutePresChange the max allowed absolute pressure change - * @param[in] maxCompFracChange the max allowed comp fraction change - * @param[in] maxRelativeCompDensChange the max allowed comp density change - * @param[in] rankOffset the rank offset - * @param[in] numComp the number of components - * @param[in] dofKey the dof key to get dof numbers - * @param[in] subRegion the subRegion - * @param[in] localSolution the Newton update - * @return the scaling factor - */ - template< typename POLICY > - static ScalingForSystemSolutionKernel::StackVariables - createAndLaunch( real64 const maxRelativePresChange, - real64 const maxAbsolutePresChange, - real64 const maxCompFracChange, - real64 const maxRelativeCompDensChange, - arrayView1d< real64 const > const pressure, - arrayView2d< real64 const, compflow::USD_COMP > const compDens, - arrayView1d< real64 > pressureScalingFactor, - arrayView1d< real64 > compDensScalingFactor, - globalIndex const rankOffset, - integer const numComp, - string const dofKey, - ElementSubRegionBase & subRegion, - arrayView1d< real64 const > const localSolution ) - { - - ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, maxRelativeCompDensChange, rankOffset, - numComp, dofKey, subRegion, localSolution, pressure, compDens, pressureScalingFactor, compDensScalingFactor ); - return ScalingForSystemSolutionKernel::launch< POLICY >( subRegion.size(), kernel ); - } -}; - -/******************************** SolutionCheckKernel ********************************/ - -/** - * @class SolutionCheckKernel - * @brief Define the kernel for checking the updated solution - */ -class SolutionCheckKernel : public ScalingAndCheckingSystemSolutionKernelBase< integer > -{ -public: - - using Base = ScalingAndCheckingSystemSolutionKernelBase< integer >; - using Base::m_rankOffset; - using Base::m_numComp; - using Base::m_dofNumber; - using Base::m_ghostRank; - using Base::m_localSolution; - using Base::m_pressure; - using Base::m_compDens; - - /** - * @brief Create a new kernel instance - * @param[in] allowCompDensChopping flag to allow the component density chopping - * @param[in] scalingFactor the scaling factor - * @param[in] rankOffset the rank offset - * @param[in] numComp the number of components - * @param[in] dofKey the dof key to get dof numbers - * @param[in] subRegion the subRegion - * @param[in] localSolution the Newton update - * @param[in] pressure the pressure vector - * @param[in] compDens the component density vector - */ - SolutionCheckKernel( integer const allowCompDensChopping, - integer const allowNegativePressure, - CompositionalMultiphaseFVM::ScalingType const scalingType, - real64 const scalingFactor, - arrayView1d< real64 const > const pressure, - arrayView2d< real64 const, compflow::USD_COMP > const compDens, - arrayView1d< real64 > pressureScalingFactor, - arrayView1d< real64 > compDensScalingFactor, - globalIndex const rankOffset, - integer const numComp, - string const dofKey, - ElementSubRegionBase const & subRegion, - arrayView1d< real64 const > const localSolution ) - : Base( rankOffset, - numComp, - dofKey, - subRegion, - localSolution, - pressure, - compDens, - pressureScalingFactor, - compDensScalingFactor ), - m_allowCompDensChopping( allowCompDensChopping ), - m_allowNegativePressure( allowNegativePressure ), - m_scalingFactor( scalingFactor ), - m_scalingType( scalingType ) - {} - - /** - * @struct StackVariables - * @brief Kernel variables located on the stack - */ - struct StackVariables : public Base::StackVariables - { - GEOS_HOST_DEVICE - StackVariables() - { } - - StackVariables( real64 _localMinVal, - real64 _localMinPres, - real64 _localMinDens, - real64 _localMinTotalDens, - integer _localNumNegPressures, - integer _localNumNegDens, - integer _localNumNegTotalDens ) - : - Base::StackVariables( _localMinVal ), - localMinPres( _localMinPres ), - localMinDens( _localMinDens ), - localMinTotalDens( _localMinTotalDens ), - localNumNegPressures( _localNumNegPressures ), - localNumNegDens( _localNumNegDens ), - localNumNegTotalDens( _localNumNegTotalDens ) - { } - - real64 localMinPres; - real64 localMinDens; - real64 localMinTotalDens; - - integer localNumNegPressures; - integer localNumNegDens; - integer localNumNegTotalDens; - - }; - - /** - * @brief Performs the kernel launch - * @tparam POLICY the policy used in the RAJA kernels - * @tparam KERNEL_TYPE the kernel type - * @param[in] numElems the number of elements - * @param[inout] kernelComponent the kernel component providing access to the compute function - */ - template< typename POLICY, typename KERNEL_TYPE > - static StackVariables - launch( localIndex const numElems, - KERNEL_TYPE const & kernelComponent ) - { - RAJA::ReduceMin< ReducePolicy< POLICY >, integer > globalMinVal( 1 ); - - RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minPres( 0.0 ); - RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minDens( 0.0 ); - RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minTotalDens( 0.0 ); - - RAJA::ReduceSum< ReducePolicy< POLICY >, integer > numNegPressures( 0 ); - RAJA::ReduceSum< ReducePolicy< POLICY >, integer > numNegDens( 0 ); - RAJA::ReduceSum< ReducePolicy< POLICY >, integer > numNegTotalDens( 0 ); - - forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( kernelComponent.ghostRank( ei ) >= 0 ) - { - return; - } - - StackVariables stack; - kernelComponent.setup( ei, stack ); - kernelComponent.compute( ei, stack ); - - globalMinVal.min( stack.localMinVal ); - - minPres.min( stack.localMinPres ); - minDens.min( stack.localMinDens ); - minTotalDens.min( stack.localMinTotalDens ); - - numNegPressures += stack.localNumNegPressures; - numNegDens += stack.localNumNegDens; - numNegTotalDens += stack.localNumNegTotalDens; - } ); - - return StackVariables( globalMinVal.get(), - minPres.get(), - minDens.get(), - minTotalDens.get(), - numNegPressures.get(), - numNegDens.get(), - numNegTotalDens.get() ); - } - - GEOS_HOST_DEVICE - void setup( localIndex const ei, - StackVariables & stack ) const - { - Base::setup( ei, stack ); - - stack.localMinPres = 0.0; - stack.localMinDens = 0.0; - stack.localMinTotalDens = 0.0; - - stack.localNumNegPressures = 0; - stack.localNumNegDens = 0; - stack.localNumNegTotalDens = 0; - } - - /** - * @brief Compute the local value - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void compute( localIndex const ei, - StackVariables & stack ) const - { - computeSolutionCheck( ei, stack ); - } - - /** - * @brief Compute the local value of the check - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[inout] stack the stack variables - * @param[in] kernelOp the function used to customize the kernel - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void computeSolutionCheck( localIndex const ei, - StackVariables & stack, - FUNC && kernelOp = NoOpFunc{} ) const - { - bool const localScaling = m_scalingType == CompositionalMultiphaseFVM::ScalingType::Local; - - real64 const newPres = m_pressure[ei] + (localScaling ? m_pressureScalingFactor[ei] : m_scalingFactor) * m_localSolution[stack.localRow]; - if( newPres < 0 ) - { - if( !m_allowNegativePressure ) - { - stack.localMinVal = 0; - } - stack.localNumNegPressures += 1; - if( newPres < stack.localMinPres ) - stack.localMinPres = newPres; - } - - // if component density chopping is not allowed, the time step fails if a component density is negative - // otherwise, we just check that the total density is positive, and negative component densities - // will be chopped (i.e., set to zero) in ApplySystemSolution) - if( !m_allowCompDensChopping ) - { - for( integer ic = 0; ic < m_numComp; ++ic ) - { - real64 const newDens = m_compDens[ei][ic] + (localScaling ? m_compDensScalingFactor[ei] : m_scalingFactor) * m_localSolution[stack.localRow + ic + 1]; - if( newDens < 0 ) - { - stack.localMinVal = 0; - stack.localNumNegDens += 1; - if( newDens < stack.localMinDens ) - stack.localMinDens = newDens; - } - } - } - else - { - real64 totalDens = 0.0; - for( integer ic = 0; ic < m_numComp; ++ic ) - { - real64 const newDens = m_compDens[ei][ic] + (localScaling ? m_compDensScalingFactor[ei] : m_scalingFactor) * m_localSolution[stack.localRow + ic + 1]; - totalDens += ( newDens > 0.0 ) ? newDens : 0.0; - } - if( totalDens < 0 ) - { - stack.localMinVal = 0; - stack.localNumNegTotalDens += 1; - if( totalDens < stack.localMinTotalDens ) - stack.localMinTotalDens = totalDens; - } - } - - kernelOp(); - } - -protected: - - /// flag to allow the component density chopping - integer const m_allowCompDensChopping; - - /// flag to allow negative pressure values - integer const m_allowNegativePressure; - - /// scaling factor - real64 const m_scalingFactor; - - /// scaling type (global or local) - CompositionalMultiphaseFVM::ScalingType const m_scalingType; - -}; - -/** - * @class SolutionCheckKernelFactory - */ -class SolutionCheckKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] allowCompDensChopping flag to allow the component density chopping - * @param[in] scalingFactor the scaling factor - * @param[in] rankOffset the rank offset - * @param[in] numComp the number of components - * @param[in] dofKey the dof key to get dof numbers - * @param[in] subRegion the subRegion - * @param[in] localSolution the Newton update - */ - template< typename POLICY > - static SolutionCheckKernel::StackVariables - createAndLaunch( integer const allowCompDensChopping, - integer const allowNegativePressure, - CompositionalMultiphaseFVM::ScalingType const scalingType, - real64 const scalingFactor, - arrayView1d< real64 const > const pressure, - arrayView2d< real64 const, compflow::USD_COMP > const compDens, - arrayView1d< real64 > pressureScalingFactor, - arrayView1d< real64 > compDensScalingFactor, - globalIndex const rankOffset, - integer const numComp, - string const dofKey, - ElementSubRegionBase & subRegion, - arrayView1d< real64 const > const localSolution ) - { - - SolutionCheckKernel kernel( allowCompDensChopping, allowNegativePressure, scalingType, scalingFactor, - pressure, compDens, pressureScalingFactor, compDensScalingFactor, rankOffset, - numComp, dofKey, subRegion, localSolution ); - return SolutionCheckKernel::launch< POLICY >( subRegion.size(), kernel ); - } - -}; - -/******************************** ResidualNormKernel ********************************/ - -/** - * @class ResidualNormKernel - */ -class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 2 > -{ -public: - - using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 2 >; - using Base::m_minNormalizer; - using Base::m_rankOffset; - using Base::m_localResidual; - using Base::m_dofNumber; - - ResidualNormKernel( globalIndex const rankOffset, - arrayView1d< real64 const > const & localResidual, - arrayView1d< globalIndex const > const & dofNumber, - arrayView1d< localIndex const > const & ghostRank, - integer const numComponents, - ElementSubRegionBase const & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - real64 const minNormalizer ) - : Base( rankOffset, - localResidual, - dofNumber, - ghostRank, - minNormalizer ), - m_numComponents( numComponents ), - m_volume( subRegion.getElementVolume() ), - m_porosity_n( solid.getPorosity_n() ), - m_totalDens_n( fluid.totalDensity_n() ) - {} - - GEOS_HOST_DEVICE - virtual void computeLinf( localIndex const ei, - LinfStackVariables & stack ) const override - { - // this should never be zero if the simulation is set up correctly, but we never know - real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_totalDens_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ); - real64 const volumeNormalizer = LvArray::math::max( m_minNormalizer, m_porosity_n[ei][0] * m_volume[ei] ); - - // step 1: mass residuals - - for( integer idof = 0; idof < m_numComponents; ++idof ) - { - real64 const valMass = LvArray::math::abs( m_localResidual[stack.localRow + idof] ) / massNormalizer; - if( valMass > stack.localValue[0] ) - { - stack.localValue[0] = valMass; - } - } - - // step 2: volume residual - - real64 const valVol = LvArray::math::abs( m_localResidual[stack.localRow + m_numComponents] ) / volumeNormalizer; - if( valVol > stack.localValue[1] ) - { - stack.localValue[1] = valVol; - } - } - - GEOS_HOST_DEVICE - virtual void computeL2( localIndex const ei, - L2StackVariables & stack ) const override - { - // note: for the L2 norm, we bundle the volume and mass residuals/normalizers - - real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_totalDens_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ); - - // step 1: mass residuals - - for( integer idof = 0; idof < m_numComponents; ++idof ) - { - stack.localValue[0] += m_localResidual[stack.localRow + idof] * m_localResidual[stack.localRow + idof]; - stack.localNormalizer[0] += massNormalizer; - } - - // step 2: volume residual - - real64 const val = m_localResidual[stack.localRow + m_numComponents] * m_totalDens_n[ei][0]; // we need a mass here, hence the - // multiplication - stack.localValue[1] += val * val; - stack.localNormalizer[1] += massNormalizer; - } - - -protected: - - /// Number of fluid coponents - integer const m_numComponents; - - /// View on the volume - arrayView1d< real64 const > const m_volume; - - /// View on porosity at the previous converged time step - arrayView2d< real64 const > const m_porosity_n; - - /// View on total mass/molar density at the previous converged time step - arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > const m_totalDens_n; - -}; - -/** - * @class ResidualNormKernelFactory - */ -class ResidualNormKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] normType the type of norm used (Linf or L2) - * @param[in] numComps the number of fluid components - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] localResidual the residual vector on my MPI rank - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[out] residualNorm the residual norm on the subRegion - * @param[out] residualNormalizer the residual normalizer on the subRegion - */ - template< typename POLICY > - static void - createAndLaunch( physicsSolverBaseKernels::NormType const normType, - integer const numComps, - globalIndex const rankOffset, - string const dofKey, - arrayView1d< real64 const > const & localResidual, - ElementSubRegionBase const & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - real64 const minNormalizer, - real64 (& residualNorm)[2], - real64 (& residualNormalizer)[2] ) - { - arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); - arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); - - ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, numComps, subRegion, fluid, solid, minNormalizer ); - if( normType == physicsSolverBaseKernels::NormType::Linf ) - { - ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); - } - else // L2 norm - { - ResidualNormKernel::launchL2< POLICY >( subRegion.size(), kernel, residualNorm, residualNormalizer ); - } - } - -}; - -/******************************** StatisticsKernel ********************************/ - -struct StatisticsKernel -{ - template< typename POLICY > - static void - saveDeltaPressure( localIndex const size, - arrayView1d< real64 const > const & pres, - arrayView1d< real64 const > const & initPres, - arrayView1d< real64 > const & deltaPres ) - { - forAll< parallelDevicePolicy<> >( size, [=] GEOS_HOST_DEVICE ( localIndex const ei ) - { - deltaPres[ei] = pres[ei] - initPres[ei]; - } ); - } - - template< typename POLICY > - static void - launch( localIndex const size, - integer const numComps, - integer const numPhases, - real64 const relpermThreshold, - arrayView1d< integer const > const & elemGhostRank, - arrayView1d< real64 const > const & volume, - arrayView1d< real64 const > const & pres, - arrayView1d< real64 const > const & deltaPres, - arrayView1d< real64 const > const & temp, - arrayView1d< real64 const > const & refPorosity, - arrayView2d< real64 const > const & porosity, - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const & phaseDensity, - arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const & phaseCompFraction, - arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac, - arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > const & phaseTrappedVolFrac, - arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > const & phaseRelperm, - real64 & minPres, - real64 & avgPresNumerator, - real64 & maxPres, - real64 & minDeltaPres, - real64 & maxDeltaPres, - real64 & minTemp, - real64 & avgTempNumerator, - real64 & maxTemp, - real64 & totalUncompactedPoreVol, - arrayView1d< real64 > const & phaseDynamicPoreVol, - arrayView1d< real64 > const & phaseMass, - arrayView1d< real64 > const & trappedPhaseMass, - arrayView1d< real64 > const & immobilePhaseMass, - arrayView2d< real64 > const & dissolvedComponentMass ) - { - RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinPres( LvArray::NumericLimits< real64 >::max ); - RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionAvgPresNumerator( 0.0 ); - RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxPres( -LvArray::NumericLimits< real64 >::max ); - RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinDeltaPres( LvArray::NumericLimits< real64 >::max ); - RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxDeltaPres( -LvArray::NumericLimits< real64 >::max ); - RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinTemp( LvArray::NumericLimits< real64 >::max ); - RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionAvgTempNumerator( 0.0 ); - RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxTemp( 0.0 ); - RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionTotalUncompactedPoreVol( 0.0 ); - - // For this arrays phaseDynamicPoreVol, phaseMass, dissolvedComponentMass, - // using an array of ReduceSum leads to a formal parameter overflow in CUDA. - // As a workaround, we use a slice with RAJA::atomicAdd instead - - forAll< parallelDevicePolicy<> >( size, [numComps, - numPhases, - relpermThreshold, - elemGhostRank, - volume, - refPorosity, - porosity, - pres, - deltaPres, - temp, - phaseDensity, - phaseVolFrac, - phaseTrappedVolFrac, - phaseRelperm, - phaseCompFraction, - subRegionMinPres, - subRegionAvgPresNumerator, - subRegionMaxPres, - subRegionMinDeltaPres, - subRegionMaxDeltaPres, - subRegionMinTemp, - subRegionAvgTempNumerator, - subRegionMaxTemp, - subRegionTotalUncompactedPoreVol, - phaseDynamicPoreVol, - phaseMass, - trappedPhaseMass, - immobilePhaseMass, - dissolvedComponentMass] GEOS_HOST_DEVICE ( localIndex const ei ) - { - if( elemGhostRank[ei] >= 0 ) - { - return; - } - - // To match our "reference", we have to use reference porosity here, not the actual porosity when we compute averages - real64 const uncompactedPoreVol = volume[ei] * refPorosity[ei]; - real64 const dynamicPoreVol = volume[ei] * porosity[ei][0]; - - subRegionMinPres.min( pres[ei] ); - subRegionAvgPresNumerator += uncompactedPoreVol * pres[ei]; - subRegionMaxPres.max( pres[ei] ); - - subRegionMaxDeltaPres.max( deltaPres[ei] ); - subRegionMinDeltaPres.min( deltaPres[ei] ); - - subRegionMinTemp.min( temp[ei] ); - subRegionAvgTempNumerator += uncompactedPoreVol * temp[ei]; - subRegionMaxTemp.max( temp[ei] ); - subRegionTotalUncompactedPoreVol += uncompactedPoreVol; - for( integer ip = 0; ip < numPhases; ++ip ) - { - real64 const elemPhaseVolume = dynamicPoreVol * phaseVolFrac[ei][ip]; - real64 const elemPhaseMass = phaseDensity[ei][0][ip] * elemPhaseVolume; - real64 const elemTrappedPhaseMass = phaseDensity[ei][0][ip] * dynamicPoreVol * phaseTrappedVolFrac[ei][0][ip]; - // RAJA::atomicAdd used here because we do not use ReduceSum here (for the reason explained above) - RAJA::atomicAdd( parallelDeviceAtomic{}, &phaseDynamicPoreVol[ip], elemPhaseVolume ); - RAJA::atomicAdd( parallelDeviceAtomic{}, &phaseMass[ip], elemPhaseMass ); - RAJA::atomicAdd( parallelDeviceAtomic{}, &trappedPhaseMass[ip], elemTrappedPhaseMass ); - if( phaseRelperm[ei][0][ip] < relpermThreshold ) - { - RAJA::atomicAdd( parallelDeviceAtomic{}, &immobilePhaseMass[ip], elemPhaseMass ); - } - for( integer ic = 0; ic < numComps; ++ic ) - { - // RAJA::atomicAdd used here because we do not use ReduceSum here (for the reason explained above) - RAJA::atomicAdd( parallelDeviceAtomic{}, &dissolvedComponentMass[ip][ic], phaseCompFraction[ei][0][ip][ic] * elemPhaseMass ); - } - } - - } ); - - minPres = subRegionMinPres.get(); - avgPresNumerator = subRegionAvgPresNumerator.get(); - maxPres = subRegionMaxPres.get(); - minDeltaPres = subRegionMinDeltaPres.get(); - maxDeltaPres = subRegionMaxDeltaPres.get(); - minTemp = subRegionMinTemp.get(); - avgTempNumerator = subRegionAvgTempNumerator.get(); - maxTemp = subRegionMaxTemp.get(); - totalUncompactedPoreVol = subRegionTotalUncompactedPoreVol.get(); - - // dummy loop to bring data back to the CPU - forAll< serialPolicy >( 1, [phaseDynamicPoreVol, phaseMass, trappedPhaseMass, immobilePhaseMass, dissolvedComponentMass] ( localIndex const ) - { - GEOS_UNUSED_VAR( phaseDynamicPoreVol, phaseMass, trappedPhaseMass, immobilePhaseMass, dissolvedComponentMass ); - } ); - } -}; - -/******************************** HydrostaticPressureKernel ********************************/ - -struct HydrostaticPressureKernel -{ - - // TODO: this type of constants should be centralized somewhere or provided by fluid model - static real64 constexpr MIN_FOR_PHASE_PRESENCE = 1e-12; - - enum class ReturnType : integer - { - FAILED_TO_CONVERGE = 0, - DETECTED_MULTIPHASE_FLOW = 1, - SUCCESS = 2 - }; - - template< typename FLUID_WRAPPER > - static ReturnType - computeHydrostaticPressure( integer const numComps, - integer const numPhases, - integer const ipInit, - integer const maxNumEquilIterations, - real64 const & equilTolerance, - real64 const (&gravVector)[ 3 ], - FLUID_WRAPPER fluidWrapper, - arrayView1d< TableFunction::KernelWrapper const > compFracTableWrappers, - TableFunction::KernelWrapper tempTableWrapper, - real64 const & refElevation, - real64 const & refPres, - arraySlice1d< real64 const > const & refPhaseMassDens, - real64 const & newElevation, - real64 & newPres, - arraySlice1d< real64 > const & newPhaseMassDens ) - { - // fluid properties at this elevation - StackArray< real64, 2, constitutive::MultiFluidBase::MAX_NUM_COMPONENTS, compflow::LAYOUT_COMP > compFrac( 1, numComps ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseFrac( 1, 1, numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseDens( 1, 1, numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseMassDens( 1, 1, numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseVisc( 1, 1, numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseEnthalpy( 1, 1, numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > phaseInternalEnergy( 1, 1, numPhases ); - StackArray< real64, 4, constitutive::MultiFluidBase::MAX_NUM_PHASES *constitutive::MultiFluidBase::MAX_NUM_COMPONENTS, - constitutive::multifluid::LAYOUT_PHASE_COMP > phaseCompFrac( 1, 1, numPhases, numComps ); - real64 totalDens = 0.0; - - bool isSinglePhaseFlow = true; - - // Step 1: compute the hydrostatic pressure at the current elevation - - real64 const gravCoef = gravVector[2] * ( refElevation - newElevation ); - real64 const temp = tempTableWrapper.compute( &newElevation ); - for( integer ic = 0; ic < numComps; ++ic ) - { - compFrac[0][ic] = compFracTableWrappers[ic].compute( &newElevation ); - } - - // Step 2: guess the pressure with the refPhaseMassDensity - - real64 pres0 = refPres - refPhaseMassDens[ipInit] * gravCoef; - real64 pres1 = 0.0; - - // Step 3: compute the mass density at this elevation using the guess, and update pressure - - constitutive::MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, - pres0, - temp, - compFrac[0], - phaseFrac[0][0], - phaseDens[0][0], - phaseMassDens[0][0], - phaseVisc[0][0], - phaseEnthalpy[0][0], - phaseInternalEnergy[0][0], - phaseCompFrac[0][0], - totalDens ); - pres1 = refPres - 0.5 * ( refPhaseMassDens[ipInit] + phaseMassDens[0][0][ipInit] ) * gravCoef; - - // Step 4: fixed-point iteration until convergence - - bool equilHasConverged = false; - for( integer eqIter = 0; eqIter < maxNumEquilIterations; ++eqIter ) - { - - // check convergence - equilHasConverged = ( LvArray::math::abs( pres0 - pres1 ) < equilTolerance ); - pres0 = pres1; - - // if converged, check number of phases and move on - if( equilHasConverged ) - { - // make sure that the fluid is single-phase, other we have to issue a warning (for now) - // if only one phase is mobile, we are in good shape (unfortunately it is hard to access relperm from here) - localIndex numberOfPhases = 0; - for( integer ip = 0; ip < numPhases; ++ip ) - { - if( phaseFrac[0][0][ip] > MIN_FOR_PHASE_PRESENCE ) - { - numberOfPhases++; - } - } - if( numberOfPhases > 1 ) - { - isSinglePhaseFlow = false; - } - - break; - } - - // compute the mass density at this elevation using the previous pressure, and compute the new pressure - constitutive::MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, - pres0, - temp, - compFrac[0], - phaseFrac[0][0], - phaseDens[0][0], - phaseMassDens[0][0], - phaseVisc[0][0], - phaseEnthalpy[0][0], - phaseInternalEnergy[0][0], - phaseCompFrac[0][0], - totalDens ); - pres1 = refPres - 0.5 * ( refPhaseMassDens[ipInit] + phaseMassDens[0][0][ipInit] ) * gravCoef; - } - - // Step 5: save the hydrostatic pressure and the corresponding density - - newPres = pres1; - for( integer ip = 0; ip < numPhases; ++ip ) - { - newPhaseMassDens[ip] = phaseMassDens[0][0][ip]; - } - - if( !equilHasConverged ) - { - return ReturnType::FAILED_TO_CONVERGE; - } - else if( !isSinglePhaseFlow ) - { - return ReturnType::DETECTED_MULTIPHASE_FLOW; - } - else - { - return ReturnType::SUCCESS; - } - } - - template< typename FLUID_WRAPPER > - static ReturnType - launch( localIndex const size, - integer const numComps, - integer const numPhases, - integer const ipInit, - integer const maxNumEquilIterations, - real64 const equilTolerance, - real64 const (&gravVector)[ 3 ], - real64 const & minElevation, - real64 const & elevationIncrement, - real64 const & datumElevation, - real64 const & datumPres, - FLUID_WRAPPER fluidWrapper, - arrayView1d< TableFunction::KernelWrapper const > compFracTableWrappers, - TableFunction::KernelWrapper tempTableWrapper, - arrayView1d< arrayView1d< real64 > const > elevationValues, - arrayView1d< real64 > pressureValues ) - { - - ReturnType returnVal = ReturnType::SUCCESS; - - // Step 1: compute the phase mass densities at datum - - // datum fluid properties - array2d< real64, compflow::LAYOUT_COMP > datumCompFrac( 1, numComps ); - array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseFrac( 1, 1, numPhases ); - array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseDens( 1, 1, numPhases ); - array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseMassDens( 1, 1, numPhases ); - array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseVisc( 1, 1, numPhases ); - array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseEnthalpy( 1, 1, numPhases ); - array3d< real64, constitutive::multifluid::LAYOUT_PHASE > datumPhaseInternalEnergy( 1, 1, numPhases ); - array4d< real64, constitutive::multifluid::LAYOUT_PHASE_COMP > datumPhaseCompFrac( 1, 1, numPhases, numComps ); - real64 datumTotalDens = 0.0; - - real64 const datumTemp = tempTableWrapper.compute( &datumElevation ); - for( integer ic = 0; ic < numComps; ++ic ) - { - datumCompFrac[0][ic] = compFracTableWrappers[ic].compute( &datumElevation ); - } - constitutive::MultiFluidBase::KernelWrapper::computeValues( fluidWrapper, - datumPres, - datumTemp, - datumCompFrac[0], - datumPhaseFrac[0][0], - datumPhaseDens[0][0], - datumPhaseMassDens[0][0], - datumPhaseVisc[0][0], - datumPhaseEnthalpy[0][0], - datumPhaseInternalEnergy[0][0], - datumPhaseCompFrac[0][0], - datumTotalDens ); - - // Step 2: find the closest elevation to datumElevation - - forAll< parallelHostPolicy >( size, [=] ( localIndex const i ) - { - real64 const elevation = minElevation + i * elevationIncrement; - elevationValues[0][i] = elevation; - } ); - integer const iRef = LvArray::sortedArrayManipulation::find( elevationValues[0].begin(), - elevationValues[0].size(), - datumElevation ); - - // Step 3: compute the mass density and pressure at the reference elevation - - array2d< real64 > phaseMassDens( pressureValues.size(), numPhases ); - // temporary array without permutation to compile on Lassen - array1d< real64 > datumPhaseMassDensTmp( numPhases ); - for( integer ip = 0; ip < numPhases; ++ip ) - { - datumPhaseMassDensTmp[ip] = datumPhaseMassDens[0][0][ip]; - } - - ReturnType const refReturnVal = - computeHydrostaticPressure( numComps, - numPhases, - ipInit, - maxNumEquilIterations, - equilTolerance, - gravVector, - fluidWrapper, - compFracTableWrappers, - tempTableWrapper, - datumElevation, - datumPres, - datumPhaseMassDensTmp, - elevationValues[0][iRef], - pressureValues[iRef], - phaseMassDens[iRef] ); - if( refReturnVal == ReturnType::FAILED_TO_CONVERGE ) - { - return ReturnType::FAILED_TO_CONVERGE; - } - else if( refReturnVal == ReturnType::DETECTED_MULTIPHASE_FLOW ) - { - returnVal = ReturnType::DETECTED_MULTIPHASE_FLOW; - } - - // Step 4: for each elevation above the reference elevation, compute the pressure - - localIndex const numEntriesAboveRef = size - iRef - 1; - forAll< serialPolicy >( numEntriesAboveRef, [=, &returnVal] ( localIndex const i ) - { - ReturnType const returnValAboveRef = - computeHydrostaticPressure( numComps, - numPhases, - ipInit, - maxNumEquilIterations, - equilTolerance, - gravVector, - fluidWrapper, - compFracTableWrappers, - tempTableWrapper, - elevationValues[0][iRef+i], - pressureValues[iRef+i], - phaseMassDens[iRef+i], - elevationValues[0][iRef+i+1], - pressureValues[iRef+i+1], - phaseMassDens[iRef+i+1] ); - if( returnValAboveRef == ReturnType::FAILED_TO_CONVERGE ) - { - returnVal = ReturnType::FAILED_TO_CONVERGE; - } - else if( ( returnValAboveRef == ReturnType::DETECTED_MULTIPHASE_FLOW ) && - ( returnVal != ReturnType::FAILED_TO_CONVERGE ) ) - { - returnVal = ReturnType::DETECTED_MULTIPHASE_FLOW; - } - - } ); - - // Step 5: for each elevation below the reference elevation, compute the pressure - - localIndex const numEntriesBelowRef = iRef; - forAll< serialPolicy >( numEntriesBelowRef, [=, &returnVal] ( localIndex const i ) - { - ReturnType const returnValBelowRef = - computeHydrostaticPressure( numComps, - numPhases, - ipInit, - maxNumEquilIterations, - equilTolerance, - gravVector, - fluidWrapper, - compFracTableWrappers, - tempTableWrapper, - elevationValues[0][iRef-i], - pressureValues[iRef-i], - phaseMassDens[iRef-i], - elevationValues[0][iRef-i-1], - pressureValues[iRef-i-1], - phaseMassDens[iRef-i-1] ); - if( returnValBelowRef == ReturnType::FAILED_TO_CONVERGE ) - { - returnVal = ReturnType::FAILED_TO_CONVERGE; - } - else if( ( returnValBelowRef == ReturnType::DETECTED_MULTIPHASE_FLOW ) && - ( returnVal != ReturnType::FAILED_TO_CONVERGE ) ) - { - returnVal = ReturnType::DETECTED_MULTIPHASE_FLOW; - } - - } ); - - return returnVal; - } - -}; - - -/******************************** Kernel launch machinery ********************************/ - - -template< typename KERNELWRAPPER, typename ... ARGS > -void KernelLaunchSelectorCompTherm( integer const numComp, bool const isThermal, ARGS && ... args ) -{ - geos::internal::kernelLaunchSelectorCompThermSwitch( numComp, isThermal, [&] ( auto NC, auto ISTHERMAL ) - { - KERNELWRAPPER::template launch< NC(), ISTHERMAL() >( std::forward< ARGS >( args )... ); - } ); -} - -template< typename KERNELWRAPPER, typename ... ARGS > -void KernelLaunchSelector1( integer const numComp, ARGS && ... args ) -{ - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - KERNELWRAPPER::template launch< NC() >( std::forward< ARGS >( args )... ); - } ); -} - -template< typename KERNELWRAPPER, typename ... ARGS > -void KernelLaunchSelector2( integer const numComp, integer const numPhase, ARGS && ... args ) -{ - // Ideally this would be inside the dispatch, but it breaks on Summit with GCC 9.1.0 and CUDA 11.0.3. - if( numPhase == 2 ) - { - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - KERNELWRAPPER::template launch< NC(), 2 >( std::forward< ARGS >( args ) ... ); - } ); - } - else if( numPhase == 3 ) - { - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - KERNELWRAPPER::template launch< NC(), 3 >( std::forward< ARGS >( args ) ... ); - } ); - } - else - { - GEOS_ERROR( "Unsupported number of phases: " << numPhase ); - } -} - -template< typename KERNELWRAPPER, typename ... ARGS > -void KernelLaunchSelector_NC_NP_THERM( integer const numComp, integer const numPhase, integer const isThermal, ARGS && ... args ) -{ - // Ideally this would be inside the dispatch, but it breaks on Summit with GCC 9.1.0 and CUDA 11.0.3. - if( isThermal ) - { - if( numPhase == 2 ) - { - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - KERNELWRAPPER::template launch< NC(), 2, 1 >( std::forward< ARGS >( args ) ... ); - } ); - } - else if( numPhase == 3 ) - { - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - KERNELWRAPPER::template launch< NC(), 3, 1 >( std::forward< ARGS >( args ) ... ); - } ); - } - else - { - GEOS_ERROR( "Unsupported number of phases: " << numPhase ); - } - } - else - { - if( numPhase == 2 ) - { - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - KERNELWRAPPER::template launch< NC(), 2, 0 >( std::forward< ARGS >( args ) ... ); - } ); - } - else if( numPhase == 3 ) - { - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - KERNELWRAPPER::template launch< NC(), 3, 0 >( std::forward< ARGS >( args ) ... ); - } ); - } - else - { - GEOS_ERROR( "Unsupported number of phases: " << numPhase ); - } - } -} - -} // namespace isothermalCompositionalMultiphaseBaseKernels - -} // namespace geos - - -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEBASEKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp deleted file mode 100644 index 3cad40cf9fe..00000000000 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp +++ /dev/null @@ -1,2388 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * 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 IsothermalCompositionalMultiphaseFVMKernels.hpp - */ - -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP - -#include "codingUtilities/Utilities.hpp" -#include "common/DataLayouts.hpp" -#include "common/DataTypes.hpp" -#include "common/GEOS_RAJA_Interface.hpp" -#include "constitutive/capillaryPressure/CapillaryPressureFields.hpp" -#include "constitutive/capillaryPressure/CapillaryPressureBase.hpp" -#include "constitutive/diffusion/DiffusionFields.hpp" -#include "constitutive/diffusion/DiffusionBase.hpp" -#include "constitutive/dispersion/DispersionFields.hpp" -#include "constitutive/dispersion/DispersionBase.hpp" -#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" -#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" -#include "constitutive/fluid/multifluid/MultiFluidSelector.hpp" -#include "constitutive/permeability/PermeabilityFields.hpp" -#include "constitutive/relativePermeability/RelativePermeabilityBase.hpp" -#include "constitutive/relativePermeability/RelativePermeabilityFields.hpp" -#include "constitutive/solid/porosity/PorosityBase.hpp" -#include "constitutive/solid/porosity/PorosityFields.hpp" -#include "fieldSpecification/AquiferBoundaryCondition.hpp" -#include "finiteVolume/FluxApproximationBase.hpp" -#include "finiteVolume/BoundaryStencil.hpp" -#include "mesh/ElementRegionManager.hpp" -#include "mesh/utilities/MeshMapUtilities.hpp" -#include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" -#include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernelUtilities.hpp" - -namespace geos -{ - -namespace isothermalCompositionalMultiphaseFVMKernels -{ - -enum class FaceBasedAssemblyKernelFlags -{ - /// Flag to specify whether capillary pressure is used or not - CapPressure = 1 << 0, // 1 - /// Flag indicating whether total mass equation is formed or not - TotalMassEquation = 1 << 1, // 2 - /// Flag indicating whether C1-PPU is used or not - C1PPU = 1 << 2, // 4 - /// Flag indicating whether IHU is used or not - IHU = 1 << 3 // 8 - /// Add more flags like that if needed: - // Flag5 = 1 << 4, // 16 - // Flag6 = 1 << 5, // 32 - // Flag7 = 1 << 6, // 64 - // Flag8 = 1 << 7 //128 -}; - -/******************************** PhaseMobilityKernel ********************************/ - -/** - * @class PhaseMobilityKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_PHASE number of fluid phases - * @brief Define the interface for the property kernel in charge of computing the phase mobilities - */ -template< integer NUM_COMP, integer NUM_PHASE > -class PhaseMobilityKernel : public isothermalCompositionalMultiphaseBaseKernels::PropertyKernelBase< NUM_COMP > -{ -public: - - using Base = isothermalCompositionalMultiphaseBaseKernels::PropertyKernelBase< NUM_COMP >; - using Base::numComp; - - /// Compile time value for the number of phases - static constexpr integer numPhase = NUM_PHASE; - - /** - * @brief Constructor - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] relperm the relperm model - */ - PhaseMobilityKernel( ObjectManagerBase & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::RelativePermeabilityBase const & relperm ) - : Base(), - m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), - m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), - m_dCompFrac_dCompDens( subRegion.getField< fields::flow::dGlobalCompFraction_dGlobalCompDensity >() ), - m_phaseDens( fluid.phaseDensity() ), - m_dPhaseDens( fluid.dPhaseDensity() ), - m_phaseVisc( fluid.phaseViscosity() ), - m_dPhaseVisc( fluid.dPhaseViscosity() ), - m_phaseRelPerm( relperm.phaseRelPerm() ), - m_dPhaseRelPerm_dPhaseVolFrac( relperm.dPhaseRelPerm_dPhaseVolFraction() ), - m_phaseMob( subRegion.getField< fields::flow::phaseMobility >() ), - m_dPhaseMob( subRegion.getField< fields::flow::dPhaseMobility >() ) - {} - - /** - * @brief Compute the phase mobilities in an element - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[in] phaseMobilityKernelOp the function used to customize the kernel - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void compute( localIndex const ei, - FUNC && phaseMobilityKernelOp = NoOpFunc{} ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseVisc = m_phaseVisc[ei][0]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseVisc = m_dPhaseVisc[ei][0]; - arraySlice1d< real64 const, constitutive::relperm::USD_RELPERM - 2 > const phaseRelPerm = m_phaseRelPerm[ei][0]; - arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > const dPhaseRelPerm_dPhaseVolFrac = m_dPhaseRelPerm_dPhaseVolFrac[ei][0]; - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const phaseVolFrac = m_phaseVolFrac[ei]; - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; - arraySlice1d< real64, compflow::USD_PHASE - 1 > const phaseMob = m_phaseMob[ei]; - arraySlice2d< real64, compflow::USD_PHASE_DC - 1 > const dPhaseMob = m_dPhaseMob[ei]; - - real64 dRelPerm_dC[numComp]{}; - real64 dDens_dC[numComp]{}; - real64 dVisc_dC[numComp]{}; - - for( integer ip = 0; ip < numPhase; ++ip ) - { - - // compute the phase mobility only if the phase is present - bool const phaseExists = (phaseVolFrac[ip] > 0); - if( !phaseExists ) - { - phaseMob[ip] = 0.0; - for( integer jc = 0; jc < numComp + 2; ++jc ) - { - dPhaseMob[ip][jc] = 0.0; - } - continue; - } - - real64 const density = phaseDens[ip]; - real64 const dDens_dP = dPhaseDens[ip][Deriv::dP]; - applyChainRule( numComp, dCompFrac_dCompDens, dPhaseDens[ip], dDens_dC, Deriv::dC ); - - real64 const viscosity = phaseVisc[ip]; - real64 const dVisc_dP = dPhaseVisc[ip][Deriv::dP]; - applyChainRule( numComp, dCompFrac_dCompDens, dPhaseVisc[ip], dVisc_dC, Deriv::dC ); - - real64 const relPerm = phaseRelPerm[ip]; - real64 dRelPerm_dP = 0.0; - for( integer ic = 0; ic < numComp; ++ic ) - { - dRelPerm_dC[ic] = 0.0; - } - - for( integer jp = 0; jp < numPhase; ++jp ) - { - real64 const dRelPerm_dS = dPhaseRelPerm_dPhaseVolFrac[ip][jp]; - dRelPerm_dP += dRelPerm_dS * dPhaseVolFrac[jp][Deriv::dP]; - - for( integer jc = 0; jc < numComp; ++jc ) - { - dRelPerm_dC[jc] += dRelPerm_dS * dPhaseVolFrac[jp][Deriv::dC+jc]; - } - } - - real64 const mobility = relPerm * density / viscosity; - - phaseMob[ip] = mobility; - dPhaseMob[ip][Deriv::dP] = dRelPerm_dP * density / viscosity - + mobility * (dDens_dP / density - dVisc_dP / viscosity); - - // compositional derivatives - for( integer jc = 0; jc < numComp; ++jc ) - { - dPhaseMob[ip][Deriv::dC+jc] = dRelPerm_dC[jc] * density / viscosity - + mobility * (dDens_dC[jc] / density - dVisc_dC[jc] / viscosity); - } - - // call the lambda in the phase loop to allow the reuse of the relperm, density, viscosity, and mobility - // possible use: assemble the derivatives wrt temperature - phaseMobilityKernelOp( ip, phaseMob[ip], dPhaseMob[ip] ); - } - } - -protected: - - // inputs - - /// Views on the phase volume fractions - arrayView2d< real64 const, compflow::USD_PHASE > m_phaseVolFrac; - arrayView3d< real64 const, compflow::USD_PHASE_DC > m_dPhaseVolFrac; - arrayView3d< real64 const, compflow::USD_COMP_DC > m_dCompFrac_dCompDens; - - /// Views on the phase densities - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseDens; - arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseDens; - - /// Views on the phase viscosities - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseVisc; - arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseVisc; - - /// Views on the phase relative permeabilities - arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > m_phaseRelPerm; - arrayView4d< real64 const, constitutive::relperm::USD_RELPERM_DS > m_dPhaseRelPerm_dPhaseVolFrac; - - // outputs - - /// Views on the phase mobilities - arrayView2d< real64, compflow::USD_PHASE > m_phaseMob; - arrayView3d< real64, compflow::USD_PHASE_DC > m_dPhaseMob; - -}; - -/** - * @class PhaseMobilityKernelFactory - */ -class PhaseMobilityKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] numComp the number of fluid components - * @param[in] numPhase the number of fluid phases - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] relperm the relperm model - */ - template< typename POLICY > - static void - createAndLaunch( integer const numComp, - integer const numPhase, - ObjectManagerBase & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::RelativePermeabilityBase const & relperm ) - { - if( numPhase == 2 ) - { - isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - integer constexpr NUM_COMP = NC(); - PhaseMobilityKernel< NUM_COMP, 2 > kernel( subRegion, fluid, relperm ); - PhaseMobilityKernel< NUM_COMP, 2 >::template launch< POLICY >( subRegion.size(), kernel ); - } ); - } - else if( numPhase == 3 ) - { - isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - integer constexpr NUM_COMP = NC(); - PhaseMobilityKernel< NUM_COMP, 3 > kernel( subRegion, fluid, relperm ); - PhaseMobilityKernel< NUM_COMP, 3 >::template launch< POLICY >( subRegion.size(), kernel ); - } ); - } - } -}; - - -/******************************** FaceBasedAssemblyKernel ********************************/ - -/** - * @brief Base class for FaceBasedAssemblyKernel that holds all data not dependent - * on template parameters (like stencil type and number of components/dofs). - */ -class FaceBasedAssemblyKernelBase -{ -public: - - /** - * @brief The type for element-based data. Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewConstAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - using DofNumberAccessor = ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > >; - - using CompFlowAccessors = - StencilAccessors< fields::ghostRank, - fields::flow::gravityCoefficient, - fields::flow::pressure, - fields::flow::dGlobalCompFraction_dGlobalCompDensity, - fields::flow::phaseVolumeFraction, - fields::flow::dPhaseVolumeFraction, - fields::flow::phaseMobility, - fields::flow::dPhaseMobility >; - using MultiFluidAccessors = - StencilMaterialAccessors< constitutive::MultiFluidBase, - fields::multifluid::phaseDensity, - fields::multifluid::dPhaseDensity, - fields::multifluid::phaseMassDensity, - fields::multifluid::dPhaseMassDensity, - fields::multifluid::phaseCompFraction, - fields::multifluid::dPhaseCompFraction >; - - using CapPressureAccessors = - StencilMaterialAccessors< constitutive::CapillaryPressureBase, - fields::cappres::phaseCapPressure, - fields::cappres::dPhaseCapPressure_dPhaseVolFraction >; - - using PermeabilityAccessors = - StencilMaterialAccessors< constitutive::PermeabilityBase, - fields::permeability::permeability, - fields::permeability::dPerm_dPressure >; - - /** - * @brief Constructor for the kernel interface - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofNumberAccessor accessor for the dof numbers - * @param[in] compFlowAccessors accessor for wrappers registered by the solver - * @param[in] multiFluidAccessors accessor for wrappers registered by the multifluid model - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - * @param[in] kernelFlags flags packed all together - */ - FaceBasedAssemblyKernelBase( integer const numPhases, - globalIndex const rankOffset, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - MultiFluidAccessors const & multiFluidAccessors, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< FaceBasedAssemblyKernelFlags > kernelFlags ); - -protected: - - /// Number of fluid phases - integer const m_numPhases; - - /// Offset for my MPI rank - globalIndex const m_rankOffset; - - /// Time step size - real64 const m_dt; - - /// Views on dof numbers - ElementViewConst< arrayView1d< globalIndex const > > const m_dofNumber; - - /// Views on ghost rank numbers and gravity coefficients - ElementViewConst< arrayView1d< integer const > > const m_ghostRank; - ElementViewConst< arrayView1d< real64 const > > const m_gravCoef; - - // Primary and secondary variables - - /// Views on pressure - ElementViewConst< arrayView1d< real64 const > > const m_pres; - - /// Views on phase volume fractions - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const m_phaseVolFrac; - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const m_dPhaseVolFrac; - - /// Views on derivatives of comp fractions - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const m_dCompFrac_dCompDens; - - /// Views on phase component fractions - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const m_phaseCompFrac; - ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const m_dPhaseCompFrac; - - // Residual and jacobian - - /// View on the local CRS matrix - CRSMatrixView< real64, globalIndex const > const m_localMatrix; - /// View on the local RHS - arrayView1d< real64 > const m_localRhs; - - BitFlags< FaceBasedAssemblyKernelFlags > const m_kernelFlags; -}; - -/** - * @class FaceBasedAssemblyKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_DOF number of degrees of freedom - * @tparam STENCILWRAPPER the type of the stencil wrapper - * @brief Define the interface for the assembly kernel in charge of flux terms - */ -template< integer NUM_COMP, integer NUM_DOF, typename STENCILWRAPPER > -class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase -{ -public: - - /// Compile time value for the number of components - static constexpr integer numComp = NUM_COMP; - - /// Compute time value for the number of degrees of freedom - static constexpr integer numDof = NUM_DOF; - - /// Compute time value for the number of equations (all of them, except the volume balance equation) - static constexpr integer numEqn = NUM_DOF-1; - - /// Maximum number of elements at the face - static constexpr localIndex maxNumElems = STENCILWRAPPER::maxNumPointsInFlux; - - /// Maximum number of connections at the face - static constexpr localIndex maxNumConns = STENCILWRAPPER::maxNumConnections; - - /// Maximum number of points in the stencil - static constexpr localIndex maxStencilSize = STENCILWRAPPER::maxStencilSize; - - /// Number of flux support points (hard-coded for TFPA) - static constexpr integer numFluxSupportPoints = 2; - - /** - * @brief Constructor for the kernel interface - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] dofNumberAccessor - * @param[in] compFlowAccessors - * @param[in] multiFluidAccessors - * @param[in] capPressureAccessors - * @param[in] permeabilityAccessors - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - * @param[in] kernelFlags flags packed together - */ - FaceBasedAssemblyKernel( integer const numPhases, - globalIndex const rankOffset, - STENCILWRAPPER const & stencilWrapper, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - MultiFluidAccessors const & multiFluidAccessors, - CapPressureAccessors const & capPressureAccessors, - PermeabilityAccessors const & permeabilityAccessors, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< FaceBasedAssemblyKernelFlags > kernelFlags ) - : FaceBasedAssemblyKernelBase( numPhases, - rankOffset, - dofNumberAccessor, - compFlowAccessors, - multiFluidAccessors, - dt, - localMatrix, - localRhs, - kernelFlags ), - m_permeability( permeabilityAccessors.get( fields::permeability::permeability {} ) ), - m_dPerm_dPres( permeabilityAccessors.get( fields::permeability::dPerm_dPressure {} ) ), - m_phaseMob( compFlowAccessors.get( fields::flow::phaseMobility {} ) ), - m_dPhaseMob( compFlowAccessors.get( fields::flow::dPhaseMobility {} ) ), - m_phaseMassDens( multiFluidAccessors.get( fields::multifluid::phaseMassDensity {} ) ), - m_dPhaseMassDens( multiFluidAccessors.get( fields::multifluid::dPhaseMassDensity {} ) ), - m_phaseCapPressure( capPressureAccessors.get( fields::cappres::phaseCapPressure {} ) ), - m_dPhaseCapPressure_dPhaseVolFrac( capPressureAccessors.get( fields::cappres::dPhaseCapPressure_dPhaseVolFraction {} ) ), - m_stencilWrapper( stencilWrapper ), - m_seri( stencilWrapper.getElementRegionIndices() ), - m_sesri( stencilWrapper.getElementSubRegionIndices() ), - m_sei( stencilWrapper.getElementIndices() ) - { } - - /** - * @struct StackVariables - * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack - */ - struct StackVariables - { -public: - - /** - * @brief Constructor for the stack variables - * @param[in] size size of the stencil for this connection - * @param[in] numElems number of elements for this connection - */ - GEOS_HOST_DEVICE - StackVariables( localIndex const size, localIndex numElems ) - : stencilSize( size ), - numConnectedElems( numElems ), - dofColIndices( size * numDof ), - localFlux( numElems * numEqn ), - localFluxJacobian( numElems * numEqn, size * numDof ) - {} - - // Stencil information - - /// Stencil size for a given connection - localIndex const stencilSize; - /// Number of elements connected at a given connection - localIndex const numConnectedElems; - - // Transmissibility and derivatives - - /// Transmissibility - real64 transmissibility[maxNumConns][numFluxSupportPoints]{}; - /// Derivatives of transmissibility with respect to pressure - real64 dTrans_dPres[maxNumConns][numFluxSupportPoints]{}; - - // Local degrees of freedom and local residual/jacobian - - /// Indices of the matrix rows/columns corresponding to the dofs in this face - stackArray1d< globalIndex, maxNumElems * numDof > dofColIndices; - - /// Storage for the face local residual vector (all equations except volume balance) - stackArray1d< real64, maxNumElems * numEqn > localFlux; - /// Storage for the face local Jacobian matrix - stackArray2d< real64, maxNumElems * numEqn * maxStencilSize * numDof > localFluxJacobian; - }; - - - /** - * @brief Getter for the stencil size at this connection - * @param[in] iconn the connection index - * @return the size of the stencil at this connection - */ - GEOS_HOST_DEVICE - inline - localIndex stencilSize( localIndex const iconn ) const { return m_sei[iconn].size(); } - - /** - * @brief Getter for the number of elements at this connection - * @param[in] iconn the connection index - * @return the number of elements at this connection - */ - GEOS_HOST_DEVICE - inline - localIndex numPointsInFlux( localIndex const iconn ) const { return m_stencilWrapper.numPointsInFlux( iconn ); } - - - /** - * @brief Performs the setup phase for the kernel. - * @param[in] iconn the connection index - * @param[in] stack the stack variables - */ - GEOS_HOST_DEVICE - inline - void setup( localIndex const iconn, - StackVariables & stack ) const - { - // set degrees of freedom indices for this face - for( integer i = 0; i < stack.stencilSize; ++i ) - { - globalIndex const offset = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; - - for( integer jdof = 0; jdof < numDof; ++jdof ) - { - stack.dofColIndices[i * numDof + jdof] = offset + jdof; - } - } - } - - /** - * @brief Compute the local flux contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - inline - void computeFlux( localIndex const iconn, - StackVariables & stack, - FUNC && compFluxKernelOp = NoOpFunc{} ) const - { - - // first, compute the transmissibilities at this face - m_stencilWrapper.computeWeights( iconn, - m_permeability, - m_dPerm_dPres, - stack.transmissibility, - stack.dTrans_dPres ); - - - localIndex k[numFluxSupportPoints]; - localIndex connectionIndex = 0; - for( k[0] = 0; k[0] < stack.numConnectedElems; ++k[0] ) - { - for( k[1] = k[0] + 1; k[1] < stack.numConnectedElems; ++k[1] ) - { - /// cell indices - localIndex const seri[numFluxSupportPoints] = {m_seri( iconn, k[0] ), m_seri( iconn, k[1] )}; - localIndex const sesri[numFluxSupportPoints] = {m_sesri( iconn, k[0] ), m_sesri( iconn, k[1] )}; - localIndex const sei[numFluxSupportPoints] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; - - // clear working arrays - real64 compFlux[numComp]{}; - real64 dCompFlux_dP[numFluxSupportPoints][numComp]{}; - real64 dCompFlux_dC[numFluxSupportPoints][numComp][numComp]{}; - - real64 const trans[numFluxSupportPoints] = { stack.transmissibility[connectionIndex][0], - stack.transmissibility[connectionIndex][1] }; - - real64 const dTrans_dPres[numFluxSupportPoints] = { stack.dTrans_dPres[connectionIndex][0], - stack.dTrans_dPres[connectionIndex][1] }; - - //***** calculation of flux ***** - // loop over phases, compute and upwind phase flux and sum contributions to each component's flux - for( integer ip = 0; ip < m_numPhases; ++ip ) - { - // create local work arrays - real64 potGrad = 0.0; - real64 phaseFlux = 0.0; - real64 dPhaseFlux_dP[numFluxSupportPoints]{}; - real64 dPhaseFlux_dC[numFluxSupportPoints][numComp]{}; - - localIndex k_up = -1; - - if( m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::C1PPU ) ) - { - isothermalCompositionalMultiphaseFVMKernelUtilities::C1PPUPhaseFlux::compute< numComp, numFluxSupportPoints > - ( m_numPhases, - ip, - m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::CapPressure ), - seri, sesri, sei, - trans, - dTrans_dPres, - m_pres, - m_gravCoef, - m_phaseMob, m_dPhaseMob, - m_phaseVolFrac, m_dPhaseVolFrac, - m_phaseCompFrac, m_dPhaseCompFrac, - m_dCompFrac_dCompDens, - m_phaseMassDens, m_dPhaseMassDens, - m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac, - k_up, - potGrad, - phaseFlux, - dPhaseFlux_dP, - dPhaseFlux_dC, - compFlux, - dCompFlux_dP, - dCompFlux_dC ); - } - else if( m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::IHU ) ) - { - isothermalCompositionalMultiphaseFVMKernelUtilities::IHUPhaseFlux::compute< numComp, numFluxSupportPoints > - ( m_numPhases, - ip, - m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::CapPressure ), - seri, sesri, sei, - trans, - dTrans_dPres, - m_pres, - m_gravCoef, - m_phaseMob, m_dPhaseMob, - m_phaseVolFrac, m_dPhaseVolFrac, - m_phaseCompFrac, m_dPhaseCompFrac, - m_dCompFrac_dCompDens, - m_phaseMassDens, m_dPhaseMassDens, - m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac, - k_up, - potGrad, - phaseFlux, - dPhaseFlux_dP, - dPhaseFlux_dC, - compFlux, - dCompFlux_dP, - dCompFlux_dC ); - } - else - { - isothermalCompositionalMultiphaseFVMKernelUtilities::PPUPhaseFlux::compute< numComp, numFluxSupportPoints > - ( m_numPhases, - ip, - m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::CapPressure ), - seri, sesri, sei, - trans, - dTrans_dPres, - m_pres, - m_gravCoef, - m_phaseMob, m_dPhaseMob, - m_phaseVolFrac, m_dPhaseVolFrac, - m_phaseCompFrac, m_dPhaseCompFrac, - m_dCompFrac_dCompDens, - m_phaseMassDens, m_dPhaseMassDens, - m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac, - k_up, - potGrad, - phaseFlux, - dPhaseFlux_dP, - dPhaseFlux_dC, - compFlux, - dCompFlux_dP, - dCompFlux_dC ); - } - - // call the lambda in the phase loop to allow the reuse of the phase fluxes and their derivatives - // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase - compFluxKernelOp( ip, k, seri, sesri, sei, connectionIndex, - k_up, seri[k_up], sesri[k_up], sei[k_up], potGrad, - phaseFlux, dPhaseFlux_dP, dPhaseFlux_dC ); - - } // loop over phases - - /// populate local flux vector and derivatives - for( integer ic = 0; ic < numComp; ++ic ) - { - integer const eqIndex0 = k[0] * numEqn + ic; - integer const eqIndex1 = k[1] * numEqn + ic; - - stack.localFlux[eqIndex0] += m_dt * compFlux[ic]; - stack.localFlux[eqIndex1] -= m_dt * compFlux[ic]; - - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - localIndex const localDofIndexPres = k[ke] * numDof; - stack.localFluxJacobian[eqIndex0][localDofIndexPres] += m_dt * dCompFlux_dP[ke][ic]; - stack.localFluxJacobian[eqIndex1][localDofIndexPres] -= m_dt * dCompFlux_dP[ke][ic]; - - for( integer jc = 0; jc < numComp; ++jc ) - { - localIndex const localDofIndexComp = localDofIndexPres + jc + 1; - stack.localFluxJacobian[eqIndex0][localDofIndexComp] += m_dt * dCompFlux_dC[ke][ic][jc]; - stack.localFluxJacobian[eqIndex1][localDofIndexComp] -= m_dt * dCompFlux_dC[ke][ic][jc]; - } - } - } - connectionIndex++; - } // loop over k[1] - } // loop over k[0] - - } - - /** - * @brief Performs the complete phase for the kernel. - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - inline - void complete( localIndex const iconn, - StackVariables & stack, - FUNC && assemblyKernelOp = NoOpFunc{} ) const - { - using namespace compositionalMultiphaseUtilities; - - if( m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::TotalMassEquation ) ) - { - // Apply equation/variable change transformation(s) - stackArray1d< real64, maxStencilSize * numDof > work( stack.stencilSize * numDof ); - shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComp, numEqn, numDof * stack.stencilSize, stack.numConnectedElems, - stack.localFluxJacobian, work ); - shiftBlockElementsAheadByOneAndReplaceFirstElementWithSum( numComp, numEqn, stack.numConnectedElems, - stack.localFlux ); - } - - // add contribution to residual and jacobian into: - // - the component mass balance equations (i = 0 to i = numComp-1) - // note that numDof includes derivatives wrt temperature if this class is derived in ThermalKernels - for( integer i = 0; i < stack.numConnectedElems; ++i ) - { - if( m_ghostRank[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )] < 0 ) - { - globalIndex const globalRow = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; - localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - m_rankOffset ); - GEOS_ASSERT_GE( localRow, 0 ); - GEOS_ASSERT_GT( m_localMatrix.numRows(), localRow + numComp ); - - for( integer ic = 0; ic < numComp; ++ic ) - { - RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[localRow + ic], - stack.localFlux[i * numEqn + ic] ); - m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > - ( localRow + ic, - stack.dofColIndices.data(), - stack.localFluxJacobian[i * numEqn + ic].dataIfContiguous(), - stack.stencilSize * numDof ); - } - - // call the lambda to assemble additional terms, such as thermal terms - assemblyKernelOp( i, localRow ); - } - } - } - - /** - * @brief Performs the kernel launch - * @tparam POLICY the policy used in the RAJA kernels - * @tparam KERNEL_TYPE the kernel type - * @param[in] numConnections the number of connections - * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables - */ - template< typename POLICY, typename KERNEL_TYPE > - static void - launch( localIndex const numConnections, - KERNEL_TYPE const & kernelComponent ) - { - GEOS_MARK_FUNCTION; - forAll< POLICY >( numConnections, [=] GEOS_HOST_DEVICE ( localIndex const iconn ) - { - typename KERNEL_TYPE::StackVariables stack( kernelComponent.stencilSize( iconn ), - kernelComponent.numPointsInFlux( iconn ) ); - - kernelComponent.setup( iconn, stack ); - kernelComponent.computeFlux( iconn, stack ); - kernelComponent.complete( iconn, stack ); - } ); - } - -protected: - - /// Views on permeability - ElementViewConst< arrayView3d< real64 const > > const m_permeability; - ElementViewConst< arrayView3d< real64 const > > const m_dPerm_dPres; - - /// Views on phase mobilities - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const m_phaseMob; - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const m_dPhaseMob; - - /// Views on phase mass densities - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseMassDens; - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseMassDens; - - /// Views on phase capillary pressure - ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const m_phaseCapPressure; - ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const m_dPhaseCapPressure_dPhaseVolFrac; - - // Stencil information - - /// Reference to the stencil wrapper - STENCILWRAPPER const m_stencilWrapper; - - /// Connection to element maps - typename STENCILWRAPPER::IndexContainerViewConstType const m_seri; - typename STENCILWRAPPER::IndexContainerViewConstType const m_sesri; - typename STENCILWRAPPER::IndexContainerViewConstType const m_sei; - -}; - -/** - * @class FaceBasedAssemblyKernelFactory - */ -class FaceBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @tparam STENCILWRAPPER the type of the stencil wrapper - * @param[in] numComps the number of fluid components - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey string to get the element degrees of freedom numbers - * @param[in] hasCapPressure flag specifying whether capillary pressure is used or not - * @param[in] solverName name of the solver (to name accessors) - * @param[in] elemManager reference to the element region manager - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY, typename STENCILWRAPPER > - static void - createAndLaunch( integer const numComps, - integer const numPhases, - globalIndex const rankOffset, - string const & dofKey, - integer const hasCapPressure, - integer const useTotalMassEquation, - UpwindingParameters upwindingParams, - string const & solverName, - ElementRegionManager const & elemManager, - STENCILWRAPPER const & stencilWrapper, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) - { - integer constexpr NUM_COMP = NC(); - integer constexpr NUM_DOF = NC() + 1; - - ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = - elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); - dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - - BitFlags< FaceBasedAssemblyKernelFlags > kernelFlags; - if( hasCapPressure ) - kernelFlags.set( FaceBasedAssemblyKernelFlags::CapPressure ); - if( useTotalMassEquation ) - kernelFlags.set( FaceBasedAssemblyKernelFlags::TotalMassEquation ); - if( upwindingParams.upwindingScheme == UpwindingScheme::C1PPU && - isothermalCompositionalMultiphaseFVMKernelUtilities::epsC1PPU > 0 ) - kernelFlags.set( FaceBasedAssemblyKernelFlags::C1PPU ); - else if( upwindingParams.upwindingScheme == UpwindingScheme::IHU ) - kernelFlags.set( FaceBasedAssemblyKernelFlags::IHU ); - - - using kernelType = FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; - typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); - typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); - typename kernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); - typename kernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); - - kernelType kernel( numPhases, rankOffset, stencilWrapper, dofNumberAccessor, - compFlowAccessors, multiFluidAccessors, capPressureAccessors, permeabilityAccessors, - dt, localMatrix, localRhs, kernelFlags ); - kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); - } ); - } -}; - -/******************************** DiffusionDispersionFaceBasedAssemblyKernel ********************************/ - -/** - * @class DiffusionDispersionFaceBasedAssemblyKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_DOF number of degrees of freedom - * @tparam STENCILWRAPPER the type of the stencil wrapper - * @brief Define the interface for the assembly kernel in charge of diffusion/dispersion flux terms - */ -template< integer NUM_COMP, integer NUM_DOF, typename STENCILWRAPPER > -class DiffusionDispersionFaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase -{ -public: - - /// Compile time value for the number of components - static constexpr integer numComp = NUM_COMP; - - /// Compute time value for the number of degrees of freedom - static constexpr integer numDof = NUM_DOF; - - /// Compute time value for the number of equations (all of them, except the volume balance equation) - static constexpr integer numEqn = NUM_DOF-1; - - /// Maximum number of elements at the face - static constexpr localIndex maxNumElems = STENCILWRAPPER::maxNumPointsInFlux; - - /// Maximum number of connections at the face - static constexpr localIndex maxNumConns = STENCILWRAPPER::maxNumConnections; - - /// Maximum number of points in the stencil - static constexpr localIndex maxStencilSize = STENCILWRAPPER::maxStencilSize; - - /// Number of flux support points (hard-coded for TFPA) - static constexpr integer numFluxSupportPoints = 2; - - using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelBase; - using AbstractBase::m_dPhaseVolFrac; - using AbstractBase::m_kernelFlags; - - using DiffusionAccessors = - StencilMaterialAccessors< constitutive::DiffusionBase, - fields::diffusion::diffusivity, - fields::diffusion::dDiffusivity_dTemperature, - fields::diffusion::phaseDiffusivityMultiplier >; - - using DispersionAccessors = - StencilMaterialAccessors< constitutive::DispersionBase, - fields::dispersion::dispersivity >; - - using PorosityAccessors = - StencilMaterialAccessors< constitutive::PorosityBase, - fields::porosity::referencePorosity >; - - /** - * @brief Constructor for the kernel interface - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] dofNumberAccessor - * @param[in] compFlowAccessors - * @param[in] multiFluidAccessors - * @param[in] diffusionAccessors - * @param[in] dispersionAccessors - * @param[in] porosityAccessors - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - * @param[in] kernelFlags flags packed together - */ - DiffusionDispersionFaceBasedAssemblyKernel( integer const numPhases, - globalIndex const rankOffset, - STENCILWRAPPER const & stencilWrapper, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - MultiFluidAccessors const & multiFluidAccessors, - DiffusionAccessors const & diffusionAccessors, - DispersionAccessors const & dispersionAccessors, - PorosityAccessors const & porosityAccessors, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< FaceBasedAssemblyKernelFlags > kernelFlags ) - : FaceBasedAssemblyKernelBase( numPhases, - rankOffset, - dofNumberAccessor, - compFlowAccessors, - multiFluidAccessors, - dt, - localMatrix, - localRhs, - kernelFlags ), - m_phaseVolFrac( compFlowAccessors.get( fields::flow::phaseVolumeFraction {} ) ), - m_phaseDens( multiFluidAccessors.get( fields::multifluid::phaseDensity {} ) ), - m_dPhaseDens( multiFluidAccessors.get( fields::multifluid::dPhaseDensity {} ) ), - m_diffusivity( diffusionAccessors.get( fields::diffusion::diffusivity {} ) ), - m_dDiffusivity_dTemp( diffusionAccessors.get( fields::diffusion::dDiffusivity_dTemperature {} ) ), - m_phaseDiffusivityMultiplier( diffusionAccessors.get( fields::diffusion::phaseDiffusivityMultiplier {} ) ), - m_dispersivity( dispersionAccessors.get( fields::dispersion::dispersivity {} ) ), - m_referencePorosity( porosityAccessors.get( fields::porosity::referencePorosity {} ) ), - m_stencilWrapper( stencilWrapper ), - m_seri( stencilWrapper.getElementRegionIndices() ), - m_sesri( stencilWrapper.getElementSubRegionIndices() ), - m_sei( stencilWrapper.getElementIndices() ) - { } - - /** - * @struct StackVariables - * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack - */ - struct StackVariables - { -public: - - /** - * @brief Constructor for the stack variables - * @param[in] size size of the stencil for this connection - * @param[in] numElems number of elements for this connection - */ - GEOS_HOST_DEVICE - StackVariables( localIndex const size, localIndex numElems ) - : stencilSize( size ), - numConnectedElems( numElems ), - dofColIndices( size * numDof ), - localFlux( numElems * numEqn ), - localFluxJacobian( numElems * numEqn, size * numDof ) - {} - - // Stencil information - - /// Stencil size for a given connection - localIndex const stencilSize; - /// Number of elements connected at a given connection - localIndex const numConnectedElems; - - /// Transmissibility - real64 transmissibility[maxNumConns][numFluxSupportPoints]{}; - /// Derivatives of transmissibility with respect to pressure - real64 dTrans_dTemp[maxNumConns][numFluxSupportPoints]{}; - - // Local degrees of freedom and local residual/jacobian - - /// Indices of the matrix rows/columns corresponding to the dofs in this face - stackArray1d< globalIndex, maxNumElems * numDof > dofColIndices; - - /// Storage for the face local residual vector (all equations except volume balance) - stackArray1d< real64, maxNumElems * numEqn > localFlux; - /// Storage for the face local Jacobian matrix - stackArray2d< real64, maxNumElems * numEqn * maxStencilSize * numDof > localFluxJacobian; - }; - - - /** - * @brief Getter for the stencil size at this connection - * @param[in] iconn the connection index - * @return the size of the stencil at this connection - */ - GEOS_HOST_DEVICE - inline - localIndex stencilSize( localIndex const iconn ) const - { return m_sei[iconn].size(); } - - /** - * @brief Getter for the number of elements at this connection - * @param[in] iconn the connection index - * @return the number of elements at this connection - */ - GEOS_HOST_DEVICE - inline - localIndex numPointsInFlux( localIndex const iconn ) const - { return m_stencilWrapper.numPointsInFlux( iconn ); } - - - /** - * @brief Performs the setup phase for the kernel. - * @param[in] iconn the connection index - * @param[in] stack the stack variables - */ - GEOS_HOST_DEVICE - inline - void setup( localIndex const iconn, - StackVariables & stack ) const - { - // set degrees of freedom indices for this face - for( integer i = 0; i < stack.stencilSize; ++i ) - { - globalIndex const offset = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; - - for( integer jdof = 0; jdof < numDof; ++jdof ) - { - stack.dofColIndices[i * numDof + jdof] = offset + jdof; - } - } - } - - /** - * @brief Compute the local diffusion flux contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - * @param[in] diffusionFluxKernelOp the function used to customize the computation of the component fluxes - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - inline - void computeDiffusionFlux( localIndex const iconn, - StackVariables & stack, - FUNC && diffusionFluxKernelOp = NoOpFunc{} ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - // first, compute the transmissibilities at this face - m_stencilWrapper.computeWeights( iconn, - m_diffusivity, - m_dDiffusivity_dTemp, - stack.transmissibility, - stack.dTrans_dTemp ); - - - localIndex k[numFluxSupportPoints]{}; - localIndex connectionIndex = 0; - for( k[0] = 0; k[0] < stack.numConnectedElems; ++k[0] ) - { - for( k[1] = k[0] + 1; k[1] < stack.numConnectedElems; ++k[1] ) - { - /// cell indices - localIndex const seri[numFluxSupportPoints] = {m_seri( iconn, k[0] ), m_seri( iconn, k[1] )}; - localIndex const sesri[numFluxSupportPoints] = {m_sesri( iconn, k[0] ), m_sesri( iconn, k[1] )}; - localIndex const sei[numFluxSupportPoints] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; - - // clear working arrays - real64 diffusionFlux[numComp]{}; - real64 dDiffusionFlux_dP[numFluxSupportPoints][numComp]{}; - real64 dDiffusionFlux_dC[numFluxSupportPoints][numComp][numComp]{}; - real64 dDens_dC[numComp]{}; - - real64 const trans[numFluxSupportPoints] = { stack.transmissibility[connectionIndex][0], - stack.transmissibility[connectionIndex][1] }; - - //***** calculation of flux ***** - // loop over phases, compute and upwind phase flux and sum contributions to each component's flux - for( integer ip = 0; ip < m_numPhases; ++ip ) - { - - // loop over components - for( integer ic = 0; ic < numComp; ++ic ) - { - - real64 compFracGrad = 0.0; - real64 dCompFracGrad_dP[numFluxSupportPoints]{}; - real64 dCompFracGrad_dC[numFluxSupportPoints][numComp]{}; - - // compute the component fraction gradient using the diffusion transmissibility - computeCompFractionGradient( ip, ic, - seri, sesri, sei, - trans, - compFracGrad, - dCompFracGrad_dP, - dCompFracGrad_dC ); - - // choose upstream cell for composition upwinding - localIndex const k_up = (compFracGrad >= 0) ? 0 : 1; - - localIndex const er_up = seri[k_up]; - localIndex const esr_up = sesri[k_up]; - localIndex const ei_up = sei[k_up]; - - // computation of the upwinded mass flux - real64 const upwindCoefficient = - m_referencePorosity[er_up][esr_up][ei_up] * - m_phaseDiffusivityMultiplier[er_up][esr_up][ei_up][0][ip] * - m_phaseDens[er_up][esr_up][ei_up][0][ip] * m_phaseVolFrac[er_up][esr_up][ei_up][ip]; - diffusionFlux[ic] += upwindCoefficient * compFracGrad; - - // add contributions of the derivatives of component fractions wrt pressure/component fractions - for( integer ke = 0; ke < numFluxSupportPoints; ke++ ) - { - dDiffusionFlux_dP[ke][ic] += upwindCoefficient * dCompFracGrad_dP[ke]; - for( integer jc = 0; jc < numComp; ++jc ) - { - dDiffusionFlux_dC[ke][ic][jc] += upwindCoefficient * dCompFracGrad_dC[ke][jc]; - } - } - - // add contributions of the derivatives of upwind coefficient wrt pressure/component fractions - real64 const dUpwindCoefficient_dP = - m_referencePorosity[er_up][esr_up][ei_up] * - m_phaseDiffusivityMultiplier[er_up][esr_up][ei_up][0][ip] * - ( m_dPhaseDens[er_up][esr_up][ei_up][0][ip][Deriv::dP] * m_phaseVolFrac[er_up][esr_up][ei_up][ip] - + m_phaseDens[er_up][esr_up][ei_up][0][ip] * m_dPhaseVolFrac[er_up][esr_up][ei_up][ip][Deriv::dP] ); - dDiffusionFlux_dP[k_up][ic] += dUpwindCoefficient_dP * compFracGrad; - - applyChainRule( numComp, - m_dCompFrac_dCompDens[er_up][esr_up][ei_up], - m_dPhaseDens[er_up][esr_up][ei_up][0][ip], - dDens_dC, - Deriv::dC ); - for( integer jc = 0; jc < numComp; ++jc ) - { - real64 const dUpwindCoefficient_dC = - m_referencePorosity[er_up][esr_up][ei_up] * - m_phaseDiffusivityMultiplier[er_up][esr_up][ei_up][0][ip] * - ( dDens_dC[jc] * m_phaseVolFrac[er_up][esr_up][ei_up][ip] - + m_phaseDens[er_up][esr_up][ei_up][0][ip] * m_dPhaseVolFrac[er_up][esr_up][ei_up][ip][Deriv::dC+jc] ); - dDiffusionFlux_dC[k_up][ic][jc] += dUpwindCoefficient_dC * compFracGrad; - } - - // call the lambda in the phase loop to allow the reuse of the phase fluxes and their derivatives - // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase - diffusionFluxKernelOp( ip, ic, k, seri, sesri, sei, connectionIndex, - k_up, seri[k_up], sesri[k_up], sei[k_up], - compFracGrad, upwindCoefficient ); - - } // loop over components - } // loop over phases - - // add diffusion flux to local flux and local flux jacobian - addToLocalFluxAndJacobian( k, - stack, - diffusionFlux, - dDiffusionFlux_dP, - dDiffusionFlux_dC ); - - connectionIndex++; - } // loop over k[1] - } // loop over k[0] - } - - /** - * @brief Compute the local dispersion flux contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - * @param[in] dispersionFluxKernelOp the function used to customize the computation of the component fluxes - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - inline - void computeDispersionFlux( localIndex const iconn, - StackVariables & stack, - FUNC && dispersionFluxKernelOp = NoOpFunc{} ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - // first, compute the transmissibilities at this face - // note that the dispersion tensor is lagged in iteration - m_stencilWrapper.computeWeights( iconn, - m_dispersivity, - m_dispersivity, // this is just to pass something, but the resulting derivative won't be used - stack.transmissibility, - stack.dTrans_dTemp ); // will not be used - - - localIndex k[numFluxSupportPoints]{}; - localIndex connectionIndex = 0; - for( k[0] = 0; k[0] < stack.numConnectedElems; ++k[0] ) - { - for( k[1] = k[0] + 1; k[1] < stack.numConnectedElems; ++k[1] ) - { - /// cell indices - localIndex const seri[numFluxSupportPoints] = {m_seri( iconn, k[0] ), m_seri( iconn, k[1] )}; - localIndex const sesri[numFluxSupportPoints] = {m_sesri( iconn, k[0] ), m_sesri( iconn, k[1] )}; - localIndex const sei[numFluxSupportPoints] = {m_sei( iconn, k[0] ), m_sei( iconn, k[1] )}; - - // clear working arrays - real64 dispersionFlux[numComp]{}; - real64 dDispersionFlux_dP[numFluxSupportPoints][numComp]{}; - real64 dDispersionFlux_dC[numFluxSupportPoints][numComp][numComp]{}; - real64 dDens_dC[numComp]{}; - - real64 const trans[numFluxSupportPoints] = { stack.transmissibility[connectionIndex][0], - stack.transmissibility[connectionIndex][1] }; - - //***** calculation of flux ***** - // loop over phases, compute and upwind phase flux and sum contributions to each component's flux - for( integer ip = 0; ip < m_numPhases; ++ip ) - { - - // loop over components - for( integer ic = 0; ic < numComp; ++ic ) - { - - real64 compFracGrad = 0.0; - real64 dCompFracGrad_dP[numFluxSupportPoints]{}; - real64 dCompFracGrad_dC[numFluxSupportPoints][numComp]{}; - - // compute the component fraction gradient using the dispersion transmissibility - computeCompFractionGradient( ip, ic, - seri, sesri, sei, - trans, - compFracGrad, - dCompFracGrad_dP, - dCompFracGrad_dC ); - - // choose upstream cell for composition upwinding - localIndex const k_up = (compFracGrad >= 0) ? 0 : 1; - - localIndex const er_up = seri[k_up]; - localIndex const esr_up = sesri[k_up]; - localIndex const ei_up = sei[k_up]; - - // computation of the upwinded mass flux - dispersionFlux[ic] += m_phaseDens[er_up][esr_up][ei_up][0][ip] * compFracGrad; - - // add contributions of the derivatives of component fractions wrt pressure/component fractions - for( integer ke = 0; ke < numFluxSupportPoints; ke++ ) - { - dDispersionFlux_dP[ke][ic] += m_phaseDens[er_up][esr_up][ei_up][0][ip] * dCompFracGrad_dP[ke]; - for( integer jc = 0; jc < numComp; ++jc ) - { - dDispersionFlux_dC[ke][ic][jc] += m_phaseDens[er_up][esr_up][ei_up][0][ip] * dCompFracGrad_dC[ke][jc]; - } - } - - // add contributions of the derivatives of upwind coefficient wrt pressure/component fractions - dDispersionFlux_dP[k_up][ic] += m_dPhaseDens[er_up][esr_up][ei_up][0][ip][Deriv::dP] * compFracGrad; - - applyChainRule( numComp, - m_dCompFrac_dCompDens[er_up][esr_up][ei_up], - m_dPhaseDens[er_up][esr_up][ei_up][0][ip], - dDens_dC, - Deriv::dC ); - for( integer jc = 0; jc < numComp; ++jc ) - { - dDispersionFlux_dC[k_up][ic][jc] += dDens_dC[jc] * compFracGrad; - } - - // call the lambda in the phase loop to allow the reuse of the phase fluxes and their derivatives - // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase - dispersionFluxKernelOp( ip, ic, k, seri, sesri, sei, connectionIndex, - k_up, seri[k_up], sesri[k_up], sei[k_up], - compFracGrad ); - - } // loop over components - } // loop over phases - - // add dispersion flux to local flux and local flux jacobian - addToLocalFluxAndJacobian( k, - stack, - dispersionFlux, - dDispersionFlux_dP, - dDispersionFlux_dC ); - - connectionIndex++; - } // loop over k[1] - } // loop over k[0] - } - - /** - * @brief Compute the component fraction gradient at this interface - * @param[in] ip the phase index - * @param[in] ic the component index - * @param[in] seri the region indices - * @param[in] sesri the subregion indices - * @param[in] sei the element indices - * @param[out] compFracGrad the component fraction gradient - * @param[out] dCompFracGrad_dP the derivatives of the component fraction gradient wrt pressure - * @param[out] dCompFracGrad_dC the derivatives of the component fraction gradient wrt component densities - */ - GEOS_HOST_DEVICE - inline - void computeCompFractionGradient( integer const ip, - integer const ic, - localIndex const (&seri)[numFluxSupportPoints], - localIndex const (&sesri)[numFluxSupportPoints], - localIndex const (&sei)[numFluxSupportPoints], - real64 const (&trans)[numFluxSupportPoints], - real64 & compFracGrad, - real64 (& dCompFracGrad_dP)[numFluxSupportPoints], - real64 (& dCompFracGrad_dC)[numFluxSupportPoints][numComp] ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - real64 dCompFrac_dC[numComp]{}; - - for( integer i = 0; i < numFluxSupportPoints; i++ ) - { - localIndex const er = seri[i]; - localIndex const esr = sesri[i]; - localIndex const ei = sei[i]; - - compFracGrad += trans[i] * m_phaseCompFrac[er][esr][ei][0][ip][ic]; - dCompFracGrad_dP[i] += trans[i] * m_dPhaseCompFrac[er][esr][ei][0][ip][ic][Deriv::dP]; - - applyChainRule( numComp, - m_dCompFrac_dCompDens[er][esr][ei], - m_dPhaseCompFrac[er][esr][ei][0][ip][ic], - dCompFrac_dC, - Deriv::dC ); - for( integer jc = 0; jc < numComp; ++jc ) - { - dCompFracGrad_dC[i][jc] += trans[i] * dCompFrac_dC[jc]; - } - } - } - - /** - * @brief Add the local diffusion/dispersion flux contributions to the residual and Jacobian - * @param[in] k the cell indices - * @param[in] stack the stack variables - * @param[in] flux the diffusion/dispersion flux - * @param[in] dFlux_dP the derivative of the diffusion/dispersion flux wrt pressure - * @param[in] dFlux_dC the derivative of the diffusion/dispersion flux wrt compositions - */ - GEOS_HOST_DEVICE - inline - void addToLocalFluxAndJacobian( localIndex const (&k)[numFluxSupportPoints], - StackVariables & stack, - real64 const (&flux)[numComp], - real64 const (&dFlux_dP)[numFluxSupportPoints][numComp], - real64 const (&dFlux_dC)[numFluxSupportPoints][numComp][numComp] ) const - { - // loop over components - for( integer ic = 0; ic < numComp; ++ic ) - { - // finally, increment local flux and local Jacobian - integer const eqIndex0 = k[0] * numEqn + ic; - integer const eqIndex1 = k[1] * numEqn + ic; - - stack.localFlux[eqIndex0] += m_dt * flux[ic]; - stack.localFlux[eqIndex1] -= m_dt * flux[ic]; - - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - localIndex const localDofIndexPres = k[ke] * numDof; - stack.localFluxJacobian[eqIndex0][localDofIndexPres] += m_dt * dFlux_dP[ke][ic]; - stack.localFluxJacobian[eqIndex1][localDofIndexPres] -= m_dt * dFlux_dP[ke][ic]; - - for( integer jc = 0; jc < numComp; ++jc ) - { - localIndex const localDofIndexComp = localDofIndexPres + jc + 1; - stack.localFluxJacobian[eqIndex0][localDofIndexComp] += m_dt * dFlux_dC[ke][ic][jc]; - stack.localFluxJacobian[eqIndex1][localDofIndexComp] -= m_dt * dFlux_dC[ke][ic][jc]; - } - } - } - } - - - /** - * @brief Performs the complete phase for the kernel. - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - inline - void complete( localIndex const iconn, - StackVariables & stack, - FUNC && assemblyKernelOp = NoOpFunc{} ) const - { - using namespace compositionalMultiphaseUtilities; - - if( m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::TotalMassEquation ) ) - { - // Apply equation/variable change transformation(s) - stackArray1d< real64, maxStencilSize * numDof > work( stack.stencilSize * numDof ); - shiftBlockRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComp, numEqn, numDof*stack.stencilSize, stack.numConnectedElems, - stack.localFluxJacobian, work ); - shiftBlockElementsAheadByOneAndReplaceFirstElementWithSum( numComp, numEqn, stack.numConnectedElems, - stack.localFlux ); - } - - // add contribution to residual and jacobian into: - // - the component mass balance equations (i = 0 to i = numComp-1) - // note that numDof includes derivatives wrt temperature if this class is derived in ThermalKernels - for( integer i = 0; i < stack.numConnectedElems; ++i ) - { - if( m_ghostRank[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )] < 0 ) - { - globalIndex const globalRow = m_dofNumber[m_seri( iconn, i )][m_sesri( iconn, i )][m_sei( iconn, i )]; - localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - m_rankOffset ); - GEOS_ASSERT_GE( localRow, 0 ); - GEOS_ASSERT_GT( m_localMatrix.numRows(), localRow + numComp ); - - for( integer ic = 0; ic < numComp; ++ic ) - { - RAJA::atomicAdd( parallelDeviceAtomic{}, &m_localRhs[localRow + ic], stack.localFlux[i * numEqn + ic] ); - m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > - ( localRow + ic, - stack.dofColIndices.data(), - stack.localFluxJacobian[i * numEqn + ic].dataIfContiguous(), - stack.stencilSize * numDof ); - } - - // call the lambda to assemble additional terms, such as thermal terms - assemblyKernelOp( i, localRow ); - } - } - } - - /** - * @brief Performs the kernel launch - * @tparam POLICY the policy used in the RAJA kernels - * @tparam KERNEL_TYPE the kernel type - * @param[in] numConnections the number of connections - * @param[inout] kernelComponent the kernel component providing access to setup/compute/complete functions and stack variables - */ - template< typename POLICY, typename KERNEL_TYPE > - static void - launch( localIndex const numConnections, - integer const hasDiffusion, - integer const hasDispersion, - KERNEL_TYPE const & kernelComponent ) - { - GEOS_MARK_FUNCTION; - forAll< POLICY >( numConnections, [=] GEOS_HOST_DEVICE ( localIndex const iconn ) - { - typename KERNEL_TYPE::StackVariables stack( kernelComponent.stencilSize( iconn ), - kernelComponent.numPointsInFlux( iconn ) ); - - kernelComponent.setup( iconn, stack ); - if( hasDiffusion ) - { - kernelComponent.computeDiffusionFlux( iconn, stack ); - } - if( hasDispersion ) - { - kernelComponent.computeDispersionFlux( iconn, stack ); - } - kernelComponent.complete( iconn, stack ); - } ); - } - -protected: - - /// Views on phase volume fraction - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const m_phaseVolFrac; - - /// Views on phase densities - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseDens; - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseDens; - - /// Views on diffusivity - ElementViewConst< arrayView3d< real64 const > > const m_diffusivity; - ElementViewConst< arrayView3d< real64 const > > const m_dDiffusivity_dTemp; - ElementViewConst< arrayView3d< real64 const > > const m_phaseDiffusivityMultiplier; - - /// Views on dispersivity - ElementViewConst< arrayView3d< real64 const > > const m_dispersivity; - - /// View on the reference porosity - ElementViewConst< arrayView1d< real64 const > > const m_referencePorosity; - - // Stencil information - - /// Reference to the stencil wrapper - STENCILWRAPPER const m_stencilWrapper; - - /// Connection to element maps - typename STENCILWRAPPER::IndexContainerViewConstType const m_seri; - typename STENCILWRAPPER::IndexContainerViewConstType const m_sesri; - typename STENCILWRAPPER::IndexContainerViewConstType const m_sei; - -}; - -/** - * @class DiffusionDispersionFaceBasedAssemblyKernelFactory - */ -class DiffusionDispersionFaceBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @tparam STENCILWRAPPER the type of the stencil wrapper - * @param[in] numComps the number of fluid components - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey string to get the element degrees of freedom numbers - * @param[in] hasDiffusion flag specifying whether diffusion is used or not - * @param[in] hasDispersion flag specifying whether dispersion is used or not - * @param[in] solverName the name of the solver - * @param[in] elemManager reference to the element region manager - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY, typename STENCILWRAPPER > - static void - createAndLaunch( integer const numComps, - integer const numPhases, - globalIndex const rankOffset, - string const & dofKey, - integer const hasDiffusion, - integer const hasDispersion, - integer const useTotalMassEquation, - string const & solverName, - ElementRegionManager const & elemManager, - STENCILWRAPPER const & stencilWrapper, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) - { - integer constexpr NUM_COMP = NC(); - integer constexpr NUM_DOF = NC() + 1; - - ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = - elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); - dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - - BitFlags< FaceBasedAssemblyKernelFlags > kernelFlags; - if( useTotalMassEquation ) - kernelFlags.set( FaceBasedAssemblyKernelFlags::TotalMassEquation ); - - using kernelType = DiffusionDispersionFaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; - typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); - typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); - typename kernelType::DiffusionAccessors diffusionAccessors( elemManager, solverName ); - typename kernelType::DispersionAccessors dispersionAccessors( elemManager, solverName ); - typename kernelType::PorosityAccessors porosityAccessors( elemManager, solverName ); - - kernelType kernel( numPhases, rankOffset, stencilWrapper, - dofNumberAccessor, compFlowAccessors, multiFluidAccessors, - diffusionAccessors, dispersionAccessors, porosityAccessors, - dt, localMatrix, localRhs, kernelFlags ); - kernelType::template launch< POLICY >( stencilWrapper.size(), - hasDiffusion, hasDispersion, - kernel ); - } ); - } -}; - - -/******************************** DirichletFaceBasedAssemblyKernel ********************************/ - -/** - * @class DirichFaceBasedAssemblyKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_DOF number of degrees of freedom - * @tparam FLUIDWRAPPER the type of the fluid wrapper - * @brief Define the interface for the assembly kernel in charge of Dirichlet face flux terms - */ -template< integer NUM_COMP, integer NUM_DOF, typename FLUIDWRAPPER > -class DirichletFaceBasedAssemblyKernel : public FaceBasedAssemblyKernel< NUM_COMP, - NUM_DOF, - BoundaryStencilWrapper > -{ -public: - - /** - * @brief The type for element-based data. Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewConstAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelBase; - using DofNumberAccessor = AbstractBase::DofNumberAccessor; - using CompFlowAccessors = AbstractBase::CompFlowAccessors; - using MultiFluidAccessors = AbstractBase::MultiFluidAccessors; - using CapPressureAccessors = AbstractBase::CapPressureAccessors; - using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; - - using AbstractBase::m_dt; - using AbstractBase::m_numPhases; - using AbstractBase::m_rankOffset; - using AbstractBase::m_dofNumber; - using AbstractBase::m_ghostRank; - using AbstractBase::m_gravCoef; - using AbstractBase::m_pres; - using AbstractBase::m_phaseCompFrac; - using AbstractBase::m_dPhaseCompFrac; - using AbstractBase::m_dCompFrac_dCompDens; - using AbstractBase::m_localMatrix; - using AbstractBase::m_localRhs; - using AbstractBase::m_kernelFlags; - - using Base = isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, BoundaryStencilWrapper >; - using Base::numComp; - using Base::numDof; - using Base::numEqn; - using Base::m_stencilWrapper; - using Base::m_phaseMob; - using Base::m_dPhaseMob; - using Base::m_phaseMassDens; - using Base::m_dPhaseMassDens; - using Base::m_permeability; - using Base::m_dPerm_dPres; - using Base::m_seri; - using Base::m_sesri; - using Base::m_sei; - - /** - * @brief Constructor for the kernel interface - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] faceManager the face manager - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] fluidWrapper reference to the fluid wrapper - * @param[in] dofNumberAccessor - * @param[in] compFlowAccessors - * @param[in] multiFluidAccessors - * @param[in] capPressureAccessors - * @param[in] permeabilityAccessors - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - * @param[in] kernelFlags flags packed together - */ - DirichletFaceBasedAssemblyKernel( integer const numPhases, - globalIndex const rankOffset, - FaceManager const & faceManager, - BoundaryStencilWrapper const & stencilWrapper, - FLUIDWRAPPER const & fluidWrapper, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - MultiFluidAccessors const & multiFluidAccessors, - CapPressureAccessors const & capPressureAccessors, - PermeabilityAccessors const & permeabilityAccessors, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< FaceBasedAssemblyKernelFlags > kernelFlags ) - : Base( numPhases, - rankOffset, - stencilWrapper, - dofNumberAccessor, - compFlowAccessors, - multiFluidAccessors, - capPressureAccessors, - permeabilityAccessors, - dt, - localMatrix, - localRhs, - kernelFlags ), - m_facePres( faceManager.getField< fields::flow::facePressure >() ), - m_faceTemp( faceManager.getField< fields::flow::faceTemperature >() ), - m_faceCompFrac( faceManager.getField< fields::flow::faceGlobalCompFraction >() ), - m_faceGravCoef( faceManager.getField< fields::flow::gravityCoefficient >() ), - m_fluidWrapper( fluidWrapper ) - {} - - /** - * @struct StackVariables - * @brief Kernel variables (dof numbers, jacobian and residual) located on the stack - */ - struct StackVariables - { -public: - - /** - * @brief Constructor for the stack variables - * @param[in] size size of the stencil for this connection - * @param[in] numElems number of elements for this connection - */ - GEOS_HOST_DEVICE - StackVariables( localIndex const GEOS_UNUSED_PARAM( size ), - localIndex GEOS_UNUSED_PARAM( numElems )) {} - - // Transmissibility - real64 transmissibility = 0.0; - - // Component fluxes and derivatives - - /// Component fluxes - real64 compFlux[numComp]{}; - /// Derivatives of component fluxes wrt pressure - real64 dCompFlux_dP[numComp]{}; - /// Derivatives of component fluxes wrt component densities - real64 dCompFlux_dC[numComp][numComp]{}; - - // Local degrees of freedom and local residual/jacobian - - /// Indices of the matrix rows/columns corresponding to the dofs in this face - globalIndex dofColIndices[numDof]{}; - - /// Storage for the face local residual vector - real64 localFlux[numEqn]{}; - /// Storage for the face local Jacobian matrix - real64 localFluxJacobian[numEqn][numDof]{}; - - }; - - - /** - * @brief Performs the setup phase for the kernel. - * @param[in] iconn the connection index - * @param[in] stack the stack variables - */ - GEOS_HOST_DEVICE - void setup( localIndex const iconn, - StackVariables & stack ) const - { - globalIndex const offset = - m_dofNumber[m_seri( iconn, BoundaryStencil::Order::ELEM )][m_sesri( iconn, BoundaryStencil::Order::ELEM )][m_sei( iconn, BoundaryStencil::Order::ELEM )]; - - for( integer jdof = 0; jdof < numDof; ++jdof ) - { - stack.dofColIndices[jdof] = offset + jdof; - } - } - - - /** - * @brief Compute the local Dirichlet face flux contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the computation of the phase fluxes - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - * @param[in] compFluxKernelOp the function used to customize the computation of the component fluxes - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void computeFlux( localIndex const iconn, - StackVariables & stack, - FUNC && compFluxKernelOp = NoOpFunc{} ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - using Order = BoundaryStencil::Order; - - localIndex const er = m_seri( iconn, Order::ELEM ); - localIndex const esr = m_sesri( iconn, Order::ELEM ); - localIndex const ei = m_sei( iconn, Order::ELEM ); - localIndex const kf = m_sei( iconn, Order::FACE ); - - // Step 1: compute the transmissibility at the boundary face - - real64 dTrans_dPerm[3]{}; - m_stencilWrapper.computeWeights( iconn, - m_permeability, - stack.transmissibility, - dTrans_dPerm ); - real64 const dTrans_dPres = LvArray::tensorOps::AiBi< 3 >( dTrans_dPerm, m_dPerm_dPres[er][esr][ei][0] ); - - // Step 2: compute the fluid properties on the face - // This is needed to get the phase mass density and the phase comp fraction at the face - // Because we approximate the face mobility using the total element mobility - - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseFrac( 1, 1, m_numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseDens( 1, 1, m_numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseMassDens( 1, 1, m_numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseVisc( 1, 1, m_numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseEnthalpy( 1, 1, m_numPhases ); - StackArray< real64, 3, constitutive::MultiFluidBase::MAX_NUM_PHASES, constitutive::multifluid::LAYOUT_PHASE > facePhaseInternalEnergy( 1, 1, m_numPhases ); - StackArray< real64, 4, constitutive::MultiFluidBase::MAX_NUM_PHASES * NUM_COMP, - constitutive::multifluid::LAYOUT_PHASE_COMP > facePhaseCompFrac( 1, 1, m_numPhases, NUM_COMP ); - real64 faceTotalDens = 0.0; - - constitutive::MultiFluidBase::KernelWrapper::computeValues( m_fluidWrapper, - m_facePres[kf], - m_faceTemp[kf], - m_faceCompFrac[kf], - facePhaseFrac[0][0], - facePhaseDens[0][0], - facePhaseMassDens[0][0], - facePhaseVisc[0][0], - facePhaseEnthalpy[0][0], - facePhaseInternalEnergy[0][0], - facePhaseCompFrac[0][0], - faceTotalDens ); - - // Step 3: loop over phases, compute and upwind phase flux and sum contributions to each component's flux - - for( integer ip = 0; ip < m_numPhases; ++ip ) - { - - // working variables - real64 dDensMean_dC[numComp]{}; - real64 dF_dC[numComp]{}; - real64 dProp_dC[numComp]{}; - - real64 phaseFlux = 0.0; // for the lambda - real64 dPhaseFlux_dP = 0.0; - real64 dPhaseFlux_dC[numComp]{}; - - - // Step 3.1: compute the average phase mass density at the face - - applyChainRule( numComp, - m_dCompFrac_dCompDens[er][esr][ei], - m_dPhaseMassDens[er][esr][ei][0][ip], - dProp_dC, - Deriv::dC ); - - // average density and derivatives - real64 const densMean = 0.5 * ( m_phaseMassDens[er][esr][ei][0][ip] + facePhaseMassDens[0][0][ip] ); - real64 const dDensMean_dP = 0.5 * m_dPhaseMassDens[er][esr][ei][0][ip][Deriv::dP]; - for( integer jc = 0; jc < numComp; ++jc ) - { - dDensMean_dC[jc] = 0.5 * dProp_dC[jc]; - } - - - // Step 3.2: compute the (TPFA) potential difference at the face - - real64 const gravTimesDz = m_gravCoef[er][esr][ei] - m_faceGravCoef[kf]; - real64 const potDif = m_pres[er][esr][ei] - m_facePres[kf] - densMean * gravTimesDz; - real64 const f = stack.transmissibility * potDif; - real64 const dF_dP = stack.transmissibility * ( 1.0 - dDensMean_dP * gravTimesDz ) + dTrans_dPres * potDif; - for( integer jc = 0; jc < numComp; ++jc ) - { - dF_dC[jc] = -stack.transmissibility * dDensMean_dC[jc] * gravTimesDz; - } - - // Step 3.3: computation of the mobility - // We do that before the if/else statement to be able to pass it to the compFluxOpKernel - - // recomputing the exact mobility at the face would be quite complex, as it would require: - // 1) computing the saturation - // 2) computing the relperm - // 3) computing the mobility as \lambda_p = \rho_p kr_p( S_p ) / \mu_p - // the second step in particular would require yet another dispatch to get the relperm model - // so, for simplicity, we approximate the face mobility as - // \lambda^approx_p = \rho_p S_p / \mu_p - // = \rho_p ( (nu_p / rho_p) * rho_t ) / \mu_p (plugging the expression of saturation) - // = \nu_p * rho_t / \mu_p - // fortunately, we don't need the derivatives - real64 const facePhaseMob = ( facePhaseFrac[0][0][ip] > 0.0 ) - ? facePhaseFrac[0][0][ip] * faceTotalDens / facePhaseVisc[0][0][ip] - : 0.0; - - // *** upwinding *** - // Step 3.4: upwinding based on the sign of the phase potential gradient - // It is easier to hard-code the if/else because it is difficult to address elem and face variables in a uniform way - - if( potDif >= 0 ) // the element is upstream - { - - // compute the phase flux and derivatives using the element mobility - phaseFlux = m_phaseMob[er][esr][ei][ip] * f; - dPhaseFlux_dP = m_phaseMob[er][esr][ei][ip] * dF_dP + m_dPhaseMob[er][esr][ei][ip][Deriv::dP] * f; - for( integer jc = 0; jc < numComp; ++jc ) - { - dPhaseFlux_dC[jc] = - m_phaseMob[er][esr][ei][ip] * dF_dC[jc] + m_dPhaseMob[er][esr][ei][ip][Deriv::dC+jc] * f; - } - - // slice some constitutive arrays to avoid too much indexing in component loop - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP-3 > phaseCompFracSub = - m_phaseCompFrac[er][esr][ei][0][ip]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC-3 > dPhaseCompFracSub = - m_dPhaseCompFrac[er][esr][ei][0][ip]; - - // compute component fluxes and derivatives using element composition - for( integer ic = 0; ic < numComp; ++ic ) - { - real64 const ycp = phaseCompFracSub[ic]; - stack.compFlux[ic] += phaseFlux * ycp; - stack.dCompFlux_dP[ic] += dPhaseFlux_dP * ycp + phaseFlux * dPhaseCompFracSub[ic][Deriv::dP]; - - applyChainRule( numComp, - m_dCompFrac_dCompDens[er][esr][ei], - dPhaseCompFracSub[ic], - dProp_dC, - Deriv::dC ); - for( integer jc = 0; jc < numComp; ++jc ) - { - stack.dCompFlux_dC[ic][jc] += dPhaseFlux_dC[jc] * ycp + phaseFlux * dProp_dC[jc]; - } - } - - } - else // the face is upstream - { - - // compute the phase flux and derivatives using the approximated face mobility - // we only have to take derivatives of the potential gradient in this case - phaseFlux = facePhaseMob * f; - dPhaseFlux_dP = facePhaseMob * dF_dP; - for( integer jc = 0; jc < numComp; ++jc ) - { - dPhaseFlux_dC[jc] = facePhaseMob * dF_dC[jc]; - } - - // compute component fluxes and derivatives using the face composition - for( integer ic = 0; ic < numComp; ++ic ) - { - real64 const ycp = facePhaseCompFrac[0][0][ip][ic]; - stack.compFlux[ic] += phaseFlux * ycp; - stack.dCompFlux_dP[ic] += dPhaseFlux_dP * ycp; - for( integer jc = 0; jc < numComp; ++jc ) - { - stack.dCompFlux_dC[ic][jc] += dPhaseFlux_dC[jc] * ycp; - } - } - } - - // call the lambda in the phase loop to allow the reuse of the phase fluxes and their derivatives - // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase - compFluxKernelOp( ip, er, esr, ei, kf, f, - facePhaseMob, facePhaseEnthalpy[0][0], facePhaseCompFrac[0][0], - phaseFlux, dPhaseFlux_dP, dPhaseFlux_dC ); - - } - - // *** end of upwinding - - // Step 4: populate local flux vector and derivatives - for( integer ic = 0; ic < numComp; ++ic ) - { - stack.localFlux[ic] = m_dt * stack.compFlux[ic]; - stack.localFluxJacobian[ic][0] = m_dt * stack.dCompFlux_dP[ic]; - for( integer jc = 0; jc < numComp; ++jc ) - { - stack.localFluxJacobian[ic][jc+1] = m_dt * stack.dCompFlux_dC[ic][jc]; - } - } - } - - /** - * @brief Performs the complete phase for the kernel. - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - template< typename FUNC = NoOpFunc > - GEOS_HOST_DEVICE - void complete( localIndex const iconn, - StackVariables & stack, - FUNC && assemblyKernelOp = NoOpFunc{} ) const - { - using namespace compositionalMultiphaseUtilities; - using Order = BoundaryStencil::Order; - - if( AbstractBase::m_kernelFlags.isSet( FaceBasedAssemblyKernelFlags::TotalMassEquation ) ) - { - // Apply equation/variable change transformation(s) - real64 work[numDof]{}; - shiftRowsAheadByOneAndReplaceFirstRowWithColumnSum( numComp, numDof, stack.localFluxJacobian, work ); - shiftElementsAheadByOneAndReplaceFirstElementWithSum( numComp, stack.localFlux ); - } - - // add contribution to residual and jacobian into: - // - the component mass balance equations (i = 0 to i = numComp-1) - // note that numDof includes derivatives wrt temperature if this class is derived in ThermalKernels - if( m_ghostRank[m_seri( iconn, Order::ELEM )][m_sesri( iconn, Order::ELEM )][m_sei( iconn, Order::ELEM )] < 0 ) - { - globalIndex const globalRow = m_dofNumber[m_seri( iconn, Order::ELEM )][m_sesri( iconn, Order::ELEM )][m_sei( iconn, Order::ELEM )]; - localIndex const localRow = LvArray::integerConversion< localIndex >( globalRow - m_rankOffset ); - GEOS_ASSERT_GE( localRow, 0 ); - GEOS_ASSERT_GT( AbstractBase::m_localMatrix.numRows(), localRow + numComp ); - - for( integer ic = 0; ic < numComp; ++ic ) - { - RAJA::atomicAdd( parallelDeviceAtomic{}, &AbstractBase::m_localRhs[localRow + ic], stack.localFlux[ic] ); - AbstractBase::m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > - ( localRow + ic, - stack.dofColIndices, - stack.localFluxJacobian[ic], - numDof ); - } - - // call the lambda to assemble additional terms, such as thermal terms - assemblyKernelOp( localRow ); - } - } - -protected: - - /// Views on face pressure, temperature, and composition - arrayView1d< real64 const > const m_facePres; - arrayView1d< real64 const > const m_faceTemp; - arrayView2d< real64 const, compflow::USD_COMP > const m_faceCompFrac; - - /// View on the face gravity coefficient - arrayView1d< real64 const > const m_faceGravCoef; - - /// Reference to the fluid wrapper - FLUIDWRAPPER const m_fluidWrapper; - -}; - - -/** - * @class DirichletFaceBasedAssemblyKernelFactory - */ -class DirichletFaceBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] numComps the number of fluid components - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey string to get the element degrees of freedom numbers - * @param[in] solverName name of the solver (to name accessors) - * @param[in] faceManager reference to the face manager - * @param[in] elemManager reference to the element region manager - * @param[in] stencilWrapper reference to the boundary stencil wrapper - * @param[in] fluidBase the multifluid constitutive model - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY > - static void - createAndLaunch( integer const numComps, - integer const numPhases, - globalIndex const rankOffset, - integer const useTotalMassEquation, - string const & dofKey, - string const & solverName, - FaceManager const & faceManager, - ElementRegionManager const & elemManager, - BoundaryStencilWrapper const & stencilWrapper, - constitutive::MultiFluidBase & fluidBase, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - constitutive::constitutiveComponentUpdatePassThru( fluidBase, numComps, [&]( auto & fluid, auto NC ) - { - using FluidType = TYPEOFREF( fluid ); - typename FluidType::KernelWrapper const fluidWrapper = fluid.createKernelWrapper(); - - integer constexpr NUM_COMP = NC(); - integer constexpr NUM_DOF = NC() + 1; - - ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = - elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); - dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - - // for now, we neglect capillary pressure in the kernel - BitFlags< FaceBasedAssemblyKernelFlags > kernelFlags; - if( useTotalMassEquation ) - kernelFlags.set( FaceBasedAssemblyKernelFlags::TotalMassEquation ); - - using kernelType = DirichletFaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, typename FluidType::KernelWrapper >; - typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); - typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); - typename kernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); - typename kernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); - - kernelType kernel( numPhases, rankOffset, faceManager, stencilWrapper, fluidWrapper, - dofNumberAccessor, compFlowAccessors, multiFluidAccessors, capPressureAccessors, permeabilityAccessors, - dt, localMatrix, localRhs, kernelFlags ); - kernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); - } ); - } -}; - - -/******************************** CFLFluxKernel ********************************/ - -/** - * @brief Functions to compute the (outflux) total volumetric flux needed in the calculation of CFL numbers - */ -struct CFLFluxKernel -{ - - /** - * @brief The type for element-based data. Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewConstAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - template< typename VIEWTYPE > - using ElementView = ElementRegionManager::ElementView< VIEWTYPE >; - - using CompFlowAccessors = - StencilAccessors< fields::flow::pressure, - fields::flow::gravityCoefficient, - fields::flow::phaseVolumeFraction, - fields::flow::phaseOutflux, - fields::flow::componentOutflux >; - - using MultiFluidAccessors = - StencilMaterialAccessors< constitutive::MultiFluidBase, - fields::multifluid::phaseViscosity, - fields::multifluid::phaseDensity, - fields::multifluid::phaseMassDensity, - fields::multifluid::phaseCompFraction >; - - using PermeabilityAccessors = - StencilMaterialAccessors< constitutive::PermeabilityBase, - fields::permeability::permeability, - fields::permeability::dPerm_dPressure >; - - - using RelPermAccessors = - StencilMaterialAccessors< constitutive::RelativePermeabilityBase, fields::relperm::phaseRelPerm >; - - template< integer NC, localIndex NUM_ELEMS, localIndex maxStencilSize > - GEOS_HOST_DEVICE - inline - static void - compute( integer const numPhases, - localIndex const stencilSize, - real64 const dt, - arraySlice1d< localIndex const > const seri, - arraySlice1d< localIndex const > const sesri, - arraySlice1d< localIndex const > const sei, - real64 const (&transmissibility)[2], - ElementViewConst< arrayView1d< real64 const > > const & pres, - ElementViewConst< arrayView1d< real64 const > > const & gravCoef, - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, - ElementViewConst< arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > > const & phaseRelPerm, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseVisc, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementView< arrayView2d< real64, compflow::USD_PHASE > > const & phaseOutflux, - ElementView< arrayView2d< real64, compflow::USD_COMP > > const & compOutflux ); - - template< integer NC, typename STENCILWRAPPER_TYPE > - static void - launch( integer const numPhases, - real64 const dt, - STENCILWRAPPER_TYPE const & stencil, - ElementViewConst< arrayView1d< real64 const > > const & pres, - ElementViewConst< arrayView1d< real64 const > > const & gravCoef, - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, - ElementViewConst< arrayView3d< real64 const > > const & permeability, - ElementViewConst< arrayView3d< real64 const > > const & dPerm_dPres, - ElementViewConst< arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > > const & phaseRelPerm, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseVisc, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementView< arrayView2d< real64, compflow::USD_PHASE > > const & phaseOutflux, - ElementView< arrayView2d< real64, compflow::USD_COMP > > const & compOutflux ); -}; - -/******************************** CFLKernel ********************************/ - -/** - * @brief Functions to compute the CFL number using the phase volumetric outflux and the component mass outflux in each cell - */ -struct CFLKernel -{ - - static constexpr real64 minPhaseMobility = 1e-12; - static constexpr real64 minComponentFraction = 1e-12; - - template< integer NP > - GEOS_HOST_DEVICE - inline - static void - computePhaseCFL( real64 const poreVol, - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac, - arraySlice1d< real64 const, constitutive::relperm::USD_RELPERM - 2 > phaseRelPerm, - arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > dPhaseRelPerm_dPhaseVolFrac, - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseVisc, - arraySlice1d< real64 const, compflow::USD_PHASE- 1 > phaseOutflux, - real64 & phaseCFLNumber ); - - template< integer NC > - GEOS_HOST_DEVICE - inline - static void - computeCompCFL( real64 const poreVol, - arraySlice1d< real64 const, compflow::USD_COMP - 1 > compDens, - arraySlice1d< real64 const, compflow::USD_COMP - 1 > compFrac, - arraySlice1d< real64 const, compflow::USD_COMP - 1 > compOutflux, - real64 & compCFLNumber ); - - template< integer NC, integer NP > - static void - launch( localIndex const size, - arrayView1d< real64 const > const & volume, - arrayView2d< real64 const > const & porosity, - arrayView2d< real64 const, compflow::USD_COMP > const & compDens, - arrayView2d< real64 const, compflow::USD_COMP > const & compFrac, - arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac, - arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > const & phaseRelPerm, - arrayView4d< real64 const, constitutive::relperm::USD_RELPERM_DS > const & dPhaseRelPerm_dPhaseVolFrac, - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const & phaseVisc, - arrayView2d< real64 const, compflow::USD_PHASE > const & phaseOutflux, - arrayView2d< real64 const, compflow::USD_COMP > const & compOutflux, - arrayView1d< real64 > const & phaseCFLNumber, - arrayView1d< real64 > const & compCFLNumber, - real64 & maxPhaseCFLNumber, - real64 & maxCompCFLNumber ); - -}; - -/******************************** AquiferBCKernel ********************************/ - -/** - * @brief Functions to assemble aquifer boundary condition contributions to residual and Jacobian - */ -struct AquiferBCKernel -{ - - /** - * @brief The type for element-based data. Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewConstAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - using CompFlowAccessors = - StencilAccessors< fields::ghostRank, - fields::flow::pressure, - fields::flow::pressure_n, - fields::flow::gravityCoefficient, - fields::flow::phaseVolumeFraction, - fields::flow::dPhaseVolumeFraction, - fields::flow::dGlobalCompFraction_dGlobalCompDensity >; - - using MultiFluidAccessors = - StencilMaterialAccessors< constitutive::MultiFluidBase, - fields::multifluid::phaseDensity, - fields::multifluid::dPhaseDensity, - fields::multifluid::phaseCompFraction, - fields::multifluid::dPhaseCompFraction >; - - template< integer NC > - GEOS_HOST_DEVICE - inline - static void - compute( integer const numPhases, - integer const ipWater, - bool const allowAllPhasesIntoAquifer, - real64 const aquiferVolFlux, - real64 const dAquiferVolFlux_dPres, - real64 const aquiferWaterPhaseDens, - arrayView1d< real64 const > const & aquiferWaterPhaseCompFrac, - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseDens, - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseDens, - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac, - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac, - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > phaseCompFrac, - arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac, - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens, - real64 const dt, - real64 ( &localFlux )[NC], - real64 ( &localFluxJacobian )[NC][NC+1] ); - - template< integer NC > - static void - launch( integer const numPhases, - integer const ipWater, - bool const allowAllPhasesIntoAquifer, - integer const useTotalMassEquation, - BoundaryStencil const & stencil, - globalIndex const rankOffset, - ElementViewConst< arrayView1d< globalIndex const > > const & dofNumber, - AquiferBoundaryCondition::KernelWrapper const & aquiferBCWrapper, - real64 const aquiferWaterPhaseDens, - arrayView1d< real64 const > const & aquiferWaterPhaseCompFrac, - ElementViewConst< arrayView1d< integer const > > const & ghostRank, - ElementViewConst< arrayView1d< real64 const > > const & pres, - ElementViewConst< arrayView1d< real64 const > > const & pres_n, - ElementViewConst< arrayView1d< real64 const > > const & gravCoef, - ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, - ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseDens, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseDens, - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, - ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, - real64 const timeAtBeginningOfStep, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ); - -}; - -} // namespace isothermalCompositionalMultiphaseFVMKernels - -} // namespace geos - - -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_ISOTHERMALCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp new file mode 100644 index 00000000000..0e7b2b84dc3 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp @@ -0,0 +1,159 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 KernelLaunchSelector.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_KERNELLAUNCHSELECTOR_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_KERNELLAUNCHSELECTOR_HPP + +#include "physicsSolvers/KernelLaunchSelectors.hpp" +#include "codingUtilities/Utilities.hpp" +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/******************************** Kernel launch machinery ********************************/ + +namespace internal +{ + +template< typename T, typename LAMBDA > +void kernelLaunchSelectorCompSwitch( T value, LAMBDA && lambda ) +{ + static_assert( std::is_integral< T >::value, "kernelLaunchSelectorCompSwitch: type should be integral" ); + + switch( value ) + { + case 1: + { lambda( std::integral_constant< T, 1 >() ); return; } + case 2: + { lambda( std::integral_constant< T, 2 >() ); return; } + case 3: + { lambda( std::integral_constant< T, 3 >() ); return; } + case 4: + { lambda( std::integral_constant< T, 4 >() ); return; } + case 5: + { lambda( std::integral_constant< T, 5 >() ); return; } + default: + { GEOS_ERROR( "Unsupported number of components: " << value ); } + } +} + +} // namespace internal + +template< typename KERNELWRAPPER, typename ... ARGS > +void KernelLaunchSelectorCompTherm( integer const numComp, bool const isThermal, ARGS && ... args ) +{ + geos::internal::kernelLaunchSelectorCompThermSwitch( numComp, isThermal, [&] ( auto NC, auto ISTHERMAL ) + { + KERNELWRAPPER::template launch< NC(), ISTHERMAL() >( std::forward< ARGS >( args )... ); + } ); +} + +template< typename KERNELWRAPPER, typename ... ARGS > +void KernelLaunchSelector1( integer const numComp, ARGS && ... args ) +{ + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + KERNELWRAPPER::template launch< NC() >( std::forward< ARGS >( args )... ); + } ); +} + +template< typename KERNELWRAPPER, typename ... ARGS > +void KernelLaunchSelector2( integer const numComp, integer const numPhase, ARGS && ... args ) +{ + // Ideally this would be inside the dispatch, but it breaks on Summit with GCC 9.1.0 and CUDA 11.0.3. + if( numPhase == 2 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + KERNELWRAPPER::template launch< NC(), 2 >( std::forward< ARGS >( args ) ... ); + } ); + } + else if( numPhase == 3 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + KERNELWRAPPER::template launch< NC(), 3 >( std::forward< ARGS >( args ) ... ); + } ); + } + else + { + GEOS_ERROR( "Unsupported number of phases: " << numPhase ); + } +} + +template< typename KERNELWRAPPER, typename ... ARGS > +void KernelLaunchSelector_NC_NP_THERM( integer const numComp, integer const numPhase, integer const isThermal, ARGS && ... args ) +{ + // Ideally this would be inside the dispatch, but it breaks on Summit with GCC 9.1.0 and CUDA 11.0.3. + if( isThermal ) + { + if( numPhase == 2 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + KERNELWRAPPER::template launch< NC(), 2, 1 >( std::forward< ARGS >( args ) ... ); + } ); + } + else if( numPhase == 3 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + KERNELWRAPPER::template launch< NC(), 3, 1 >( std::forward< ARGS >( args ) ... ); + } ); + } + else + { + GEOS_ERROR( "Unsupported number of phases: " << numPhase ); + } + } + else + { + if( numPhase == 2 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + KERNELWRAPPER::template launch< NC(), 2, 0 >( std::forward< ARGS >( args ) ... ); + } ); + } + else if( numPhase == 3 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + KERNELWRAPPER::template launch< NC(), 3, 0 >( std::forward< ARGS >( args ) ... ); + } ); + } + else + { + GEOS_ERROR( "Unsupported number of phases: " << numPhase ); + } + } +} + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_KERNELLAUNCHSELECTOR_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp new file mode 100644 index 00000000000..c8ac5256d98 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp @@ -0,0 +1,162 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 PPUPhaseFlux.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PPUPHASEFLUX_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PPUPHASEFLUX_HPP + +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" +#include "constitutive/capillaryPressure/layouts.hpp" +#include "mesh/ElementRegionManager.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseFVMKernelUtilities +{ + +template< typename VIEWTYPE > +using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + +using Deriv = constitutive::multifluid::DerivativeOffset; + +struct PPUPhaseFlux +{ + /** + * @brief Form the PhasePotentialUpwind from pressure gradient and gravitational head + * @tparam numComp number of components + * @tparam numFluxSupportPoints number of flux support points + * @param numPhase number of phases + * @param ip phase index + * @param hasCapPressure flag indicating if there is capillary pressure + * @param seri arraySlice of the stencil-implied element region index + * @param sesri arraySlice of the stencil-implied element subregion index + * @param sei arraySlice of the stencil-implied element index + * @param trans transmissibility at the connection + * @param dTrans_dPres derivative of transmissibility wrt pressure + * @param pres pressure + * @param gravCoef gravitational coefficient + * @param phaseMob phase mobility + * @param dPhaseMob derivative of phase mobility wrt pressure, temperature, comp density + * @param dPhaseVolFrac derivative of phase volume fraction wrt pressure, temperature, comp density + * @param dCompFrac_dCompDens derivative of component fraction wrt component density + * @param phaseMassDens phase mass density + * @param dPhaseMassDens derivative of phase mass density wrt pressure, temperature, comp fraction + * @param phaseCapPressure phase capillary pressure + * @param dPhaseCapPressure_dPhaseVolFrac derivative of phase capillary pressure wrt phase volume fraction + * @param k_up uptream index for this phase + * @param potGrad potential gradient for this phase + * @param phaseFlux phase flux + * @param dPhaseFlux_dP derivative of phase flux wrt pressure + * @param dPhaseFlux_dC derivative of phase flux wrt comp density + */ + template< integer numComp, integer numFluxSupportPoints > + GEOS_HOST_DEVICE + static void + compute( integer const numPhase, + integer const ip, + integer const hasCapPressure, + localIndex const ( &seri )[numFluxSupportPoints], + localIndex const ( &sesri )[numFluxSupportPoints], + localIndex const ( &sei )[numFluxSupportPoints], + real64 const ( &trans )[2], + real64 const ( &dTrans_dPres )[2], + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseMob, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + localIndex & k_up, + real64 & potGrad, + real64 ( &phaseFlux ), + real64 ( & dPhaseFlux_dP )[numFluxSupportPoints], + real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp], + real64 ( & compFlux )[numComp], + real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp], + real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp] ) + { + real64 dPresGrad_dP[numFluxSupportPoints]{}; + real64 dPresGrad_dC[numFluxSupportPoints][numComp]{}; + real64 dGravHead_dP[numFluxSupportPoints]{}; + real64 dGravHead_dC[numFluxSupportPoints][numComp]{}; + PotGrad::compute< numComp, numFluxSupportPoints >( numPhase, ip, hasCapPressure, seri, sesri, sei, trans, dTrans_dPres, pres, + gravCoef, phaseVolFrac, dPhaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, + phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, potGrad, dPresGrad_dP, + dPresGrad_dC, dGravHead_dP, dGravHead_dC ); + + // *** upwinding *** + + // choose upstream cell + k_up = (potGrad >= 0) ? 0 : 1; + + localIndex const er_up = seri[k_up]; + localIndex const esr_up = sesri[k_up]; + localIndex const ei_up = sei[k_up]; + + real64 const mobility = phaseMob[er_up][esr_up][ei_up][ip]; + + // pressure gradient depends on all points in the stencil + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dPhaseFlux_dP[ke] += dPresGrad_dP[ke] - dGravHead_dP[ke]; + dPhaseFlux_dP[ke] *= mobility; + for( integer jc = 0; jc < numComp; ++jc ) + { + dPhaseFlux_dC[ke][jc] += dPresGrad_dC[ke][jc] - dGravHead_dC[ke][jc]; + dPhaseFlux_dC[ke][jc] *= mobility; + } + } + // compute phase flux using upwind mobility. + phaseFlux = mobility * potGrad; + + real64 const dMob_dP = dPhaseMob[er_up][esr_up][ei_up][ip][Deriv::dP]; + arraySlice1d< real64 const, compflow::USD_PHASE_DC - 2 > dPhaseMobSub = + dPhaseMob[er_up][esr_up][ei_up][ip]; + + // add contribution from upstream cell mobility derivatives + dPhaseFlux_dP[k_up] += dMob_dP * potGrad; + for( integer jc = 0; jc < numComp; ++jc ) + { + dPhaseFlux_dC[k_up][jc] += dPhaseMobSub[Deriv::dC+jc] * potGrad; + } + + //distribute on phaseComponentFlux here + PhaseComponentFlux::compute( ip, k_up, seri, sesri, sei, phaseCompFrac, dPhaseCompFrac, dCompFrac_dCompDens, phaseFlux + , dPhaseFlux_dP, dPhaseFlux_dC, compFlux, dCompFlux_dP, dCompFlux_dC ); + + } +}; + +} // namespace isothermalCompositionalMultiPhaseFVMKernelUtilities + +} // namespace geos + + +#endif // GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PPUPHASEFLUX_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp new file mode 100644 index 00000000000..812cc19eb3d --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp @@ -0,0 +1,128 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 PhaseComponentFlux.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PHASECOMPONENTFLUX_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PHASECOMPONENTFLUX_HPP + +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" +#include "mesh/ElementRegionManager.hpp" + + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseFVMKernelUtilities +{ + +template< typename VIEWTYPE > +using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + +using Deriv = constitutive::multifluid::DerivativeOffset; + +struct PhaseComponentFlux +{ + /** + * @brief Compute the component flux for a given phase + * @tparam numComp number of components + * @tparam numFluxSupportPoints number of flux support points + * @param ip phase index + * @param k_up uptream index for this phase + * @param seri arraySlice of the stencil-implied element region index + * @param sesri arraySlice of the stencil-implied element subregion index + * @param sei arraySlice of the stencil-implied element index + * @param phaseCompFrac phase component fraction + * @param dPhaseCompFrac derivative of phase component fraction wrt pressure, temperature, component fraction + * @param dCompFrac_dCompDens derivative of component fraction wrt component density + * @param phaseFlux phase flux + * @param dPhaseFlux_dP derivative of phase flux wrt pressure + * @param dPhaseFlux_dC derivative of phase flux wrt comp density + * @param compFlux component flux + * @param dCompFlux_dP derivative of phase flux wrt pressure + * @param dCompFlux_dC derivative of phase flux wrt comp density + */ + template< localIndex numComp, localIndex numFluxSupportPoints > + GEOS_HOST_DEVICE + static void + compute( localIndex const ip, + localIndex const k_up, + localIndex const ( &seri )[numFluxSupportPoints], + localIndex const ( &sesri )[numFluxSupportPoints], + localIndex const ( &sei )[numFluxSupportPoints], + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac, + ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + real64 const & phaseFlux, + real64 const ( &dPhaseFlux_dP )[numFluxSupportPoints], + real64 const ( &dPhaseFlux_dC )[numFluxSupportPoints][numComp], + real64 ( & compFlux )[numComp], + real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp], + real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp] ) + { + localIndex const er_up = seri[k_up]; + localIndex const esr_up = sesri[k_up]; + localIndex const ei_up = sei[k_up]; + + real64 dProp_dC[numComp]{}; + + // slice some constitutive arrays to avoid too much indexing in component loop + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP-3 > phaseCompFracSub = + phaseCompFrac[er_up][esr_up][ei_up][0][ip]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC-3 > dPhaseCompFracSub = + dPhaseCompFrac[er_up][esr_up][ei_up][0][ip]; + + // compute component fluxes and derivatives using upstream cell composition + for( integer ic = 0; ic < numComp; ++ic ) + { + real64 const ycp = phaseCompFracSub[ic]; + compFlux[ic] += phaseFlux * ycp; + + // derivatives stemming from phase flux + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dCompFlux_dP[ke][ic] += dPhaseFlux_dP[ke] * ycp; + for( integer jc = 0; jc < numComp; ++jc ) + { + dCompFlux_dC[ke][ic][jc] += dPhaseFlux_dC[ke][jc] * ycp; + } + } + + // additional derivatives stemming from upstream cell phase composition + dCompFlux_dP[k_up][ic] += phaseFlux * dPhaseCompFracSub[ic][Deriv::dP]; + + // convert derivatives of comp fraction w.r.t. comp fractions to derivatives w.r.t. comp densities + applyChainRule( numComp, + dCompFrac_dCompDens[er_up][esr_up][ei_up], + dPhaseCompFracSub[ic], + dProp_dC, + Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + dCompFlux_dC[k_up][ic][jc] += phaseFlux * dProp_dC[jc]; + } + } + } +}; + +} // namespace isothermalCompositionalMultiPhaseFVMKernelUtilities + +} // namespace geos + +#endif // GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PHASECOMPONENTFLUX_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp new file mode 100644 index 00000000000..1886cdbe4f5 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp @@ -0,0 +1,241 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 PhaseMobilityKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PHASEMOBILITYKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PHASEMOBILITYKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseFVMKernels +{ + +/******************************** PhaseMobilityKernel ********************************/ + +/** + * @class PhaseMobilityKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_PHASE number of fluid phases + * @brief Defines the interface for the property kernel in charge of computing the phase mobilities + */ +template< integer NUM_COMP, integer NUM_PHASE > +class PhaseMobilityKernel : public isothermalCompositionalMultiphaseBaseKernels::PropertyKernelBase< NUM_COMP > +{ +public: + + using Base = isothermalCompositionalMultiphaseBaseKernels::PropertyKernelBase< NUM_COMP >; + using Base::numComp; + + /// Compile time value for the number of phases + static constexpr integer numPhase = NUM_PHASE; + + /** + * @brief Constructor + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] relperm the relperm model + */ + PhaseMobilityKernel( ObjectManagerBase & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::RelativePermeabilityBase const & relperm ) + : Base(), + m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), + m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), + m_dCompFrac_dCompDens( subRegion.getField< fields::flow::dGlobalCompFraction_dGlobalCompDensity >() ), + m_phaseDens( fluid.phaseDensity() ), + m_dPhaseDens( fluid.dPhaseDensity() ), + m_phaseVisc( fluid.phaseViscosity() ), + m_dPhaseVisc( fluid.dPhaseViscosity() ), + m_phaseRelPerm( relperm.phaseRelPerm() ), + m_dPhaseRelPerm_dPhaseVolFrac( relperm.dPhaseRelPerm_dPhaseVolFraction() ), + m_phaseMob( subRegion.getField< fields::flow::phaseMobility >() ), + m_dPhaseMob( subRegion.getField< fields::flow::dPhaseMobility >() ) + {} + + /** + * @brief Compute the phase mobilities in an element + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[in] phaseMobilityKernelOp the function used to customize the kernel + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void compute( localIndex const ei, + FUNC && phaseMobilityKernelOp = NoOpFunc{} ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseVisc = m_phaseVisc[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseVisc = m_dPhaseVisc[ei][0]; + arraySlice1d< real64 const, constitutive::relperm::USD_RELPERM - 2 > const phaseRelPerm = m_phaseRelPerm[ei][0]; + arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > const dPhaseRelPerm_dPhaseVolFrac = m_dPhaseRelPerm_dPhaseVolFrac[ei][0]; + arraySlice1d< real64 const, compflow::USD_PHASE - 1 > const phaseVolFrac = m_phaseVolFrac[ei]; + arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; + arraySlice1d< real64, compflow::USD_PHASE - 1 > const phaseMob = m_phaseMob[ei]; + arraySlice2d< real64, compflow::USD_PHASE_DC - 1 > const dPhaseMob = m_dPhaseMob[ei]; + + real64 dRelPerm_dC[numComp]{}; + real64 dDens_dC[numComp]{}; + real64 dVisc_dC[numComp]{}; + + for( integer ip = 0; ip < numPhase; ++ip ) + { + + // compute the phase mobility only if the phase is present + bool const phaseExists = (phaseVolFrac[ip] > 0); + if( !phaseExists ) + { + phaseMob[ip] = 0.0; + for( integer jc = 0; jc < numComp + 2; ++jc ) + { + dPhaseMob[ip][jc] = 0.0; + } + continue; + } + + real64 const density = phaseDens[ip]; + real64 const dDens_dP = dPhaseDens[ip][Deriv::dP]; + applyChainRule( numComp, dCompFrac_dCompDens, dPhaseDens[ip], dDens_dC, Deriv::dC ); + + real64 const viscosity = phaseVisc[ip]; + real64 const dVisc_dP = dPhaseVisc[ip][Deriv::dP]; + applyChainRule( numComp, dCompFrac_dCompDens, dPhaseVisc[ip], dVisc_dC, Deriv::dC ); + + real64 const relPerm = phaseRelPerm[ip]; + real64 dRelPerm_dP = 0.0; + for( integer ic = 0; ic < numComp; ++ic ) + { + dRelPerm_dC[ic] = 0.0; + } + + for( integer jp = 0; jp < numPhase; ++jp ) + { + real64 const dRelPerm_dS = dPhaseRelPerm_dPhaseVolFrac[ip][jp]; + dRelPerm_dP += dRelPerm_dS * dPhaseVolFrac[jp][Deriv::dP]; + + for( integer jc = 0; jc < numComp; ++jc ) + { + dRelPerm_dC[jc] += dRelPerm_dS * dPhaseVolFrac[jp][Deriv::dC+jc]; + } + } + + real64 const mobility = relPerm * density / viscosity; + + phaseMob[ip] = mobility; + dPhaseMob[ip][Deriv::dP] = dRelPerm_dP * density / viscosity + + mobility * (dDens_dP / density - dVisc_dP / viscosity); + + // compositional derivatives + for( integer jc = 0; jc < numComp; ++jc ) + { + dPhaseMob[ip][Deriv::dC+jc] = dRelPerm_dC[jc] * density / viscosity + + mobility * (dDens_dC[jc] / density - dVisc_dC[jc] / viscosity); + } + + // call the lambda in the phase loop to allow the reuse of the relperm, density, viscosity, and mobility + // possible use: assemble the derivatives wrt temperature + phaseMobilityKernelOp( ip, phaseMob[ip], dPhaseMob[ip] ); + } + } + +protected: + + // inputs + + /// Views on the phase volume fractions + arrayView2d< real64 const, compflow::USD_PHASE > m_phaseVolFrac; + arrayView3d< real64 const, compflow::USD_PHASE_DC > m_dPhaseVolFrac; + arrayView3d< real64 const, compflow::USD_COMP_DC > m_dCompFrac_dCompDens; + + /// Views on the phase densities + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseDens; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseDens; + + /// Views on the phase viscosities + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseVisc; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseVisc; + + /// Views on the phase relative permeabilities + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > m_phaseRelPerm; + arrayView4d< real64 const, constitutive::relperm::USD_RELPERM_DS > m_dPhaseRelPerm_dPhaseVolFrac; + + // outputs + + /// Views on the phase mobilities + arrayView2d< real64, compflow::USD_PHASE > m_phaseMob; + arrayView3d< real64, compflow::USD_PHASE_DC > m_dPhaseMob; + +}; + +/** + * @class PhaseMobilityKernelFactory + */ +class PhaseMobilityKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComp the number of fluid components + * @param[in] numPhase the number of fluid phases + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] relperm the relperm model + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComp, + integer const numPhase, + ObjectManagerBase & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::RelativePermeabilityBase const & relperm ) + { + if( numPhase == 2 ) + { + isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + integer constexpr NUM_COMP = NC(); + PhaseMobilityKernel< NUM_COMP, 2 > kernel( subRegion, fluid, relperm ); + PhaseMobilityKernel< NUM_COMP, 2 >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + else if( numPhase == 3 ) + { + isothermalCompositionalMultiphaseBaseKernels::internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + integer constexpr NUM_COMP = NC(); + PhaseMobilityKernel< NUM_COMP, 3 > kernel( subRegion, fluid, relperm ); + PhaseMobilityKernel< NUM_COMP, 3 >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + } +}; + +} // namespace isothermalCompositionalMultiphaseFVMKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PHASEMOBILITYKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp new file mode 100644 index 00000000000..875bfe07c8e --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp @@ -0,0 +1,256 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 PhaseVolumeFractionKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PHASEVOLUMEFRACTIONKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PHASEVOLUMEFRACTIONKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/******************************** PhaseVolumeFractionKernel ********************************/ + +/** + * @class PhaseVolumeFractionKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_PHASE number of fluid phases + * @brief Define the interface for the property kernel in charge of computing the phase volume fractions + */ +template< integer NUM_COMP, integer NUM_PHASE > +class PhaseVolumeFractionKernel : public PropertyKernelBase< NUM_COMP > +{ +public: + + using Base = PropertyKernelBase< NUM_COMP >; + using Base::numComp; + + /// Compile time value for the number of phases + static constexpr integer numPhase = NUM_PHASE; + + /** + * @brief Constructor + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + */ + PhaseVolumeFractionKernel( ObjectManagerBase & subRegion, + constitutive::MultiFluidBase const & fluid ) + : Base(), + m_phaseVolFrac( subRegion.getField< fields::flow::phaseVolumeFraction >() ), + m_dPhaseVolFrac( subRegion.getField< fields::flow::dPhaseVolumeFraction >() ), + m_compDens( subRegion.getField< fields::flow::globalCompDensity >() ), + m_dCompFrac_dCompDens( subRegion.getField< fields::flow::dGlobalCompFraction_dGlobalCompDensity >() ), + m_phaseFrac( fluid.phaseFraction() ), + m_dPhaseFrac( fluid.dPhaseFraction() ), + m_phaseDens( fluid.phaseDensity() ), + m_dPhaseDens( fluid.dPhaseDensity() ) + {} + + /** + * @brief Compute the phase volume fractions in an element + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[in] phaseVolFractionKernelOp the function used to customize the kernel + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + real64 compute( localIndex const ei, + FUNC && phaseVolFractionKernelOp = NoOpFunc{} ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + arraySlice1d< real64 const, compflow::USD_COMP - 1 > const compDens = m_compDens[ei]; + arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > const dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseFrac = m_phaseFrac[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseFrac = m_dPhaseFrac[ei][0]; + arraySlice1d< real64, compflow::USD_PHASE - 1 > const phaseVolFrac = m_phaseVolFrac[ei]; + arraySlice2d< real64, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; + + real64 work[numComp]{}; + + // compute total density from component partial densities + real64 totalDensity = 0.0; + real64 const dTotalDens_dCompDens = 1.0; + for( integer ic = 0; ic < numComp; ++ic ) + { + totalDensity += compDens[ic]; + } + + real64 maxDeltaPhaseVolFrac = 0.0; + + for( integer ip = 0; ip < numPhase; ++ip ) + { + + // set the saturation to zero if the phase is absent + bool const phaseExists = (phaseFrac[ip] > 0); + if( !phaseExists ) + { + phaseVolFrac[ip] = 0.; + for( integer jc = 0; jc < numComp+2; ++jc ) + { + dPhaseVolFrac[ip][jc] = 0.; + } + continue; + } + + // Expression for volume fractions: S_p = (nu_p / rho_p) * rho_t + real64 const phaseDensInv = 1.0 / phaseDens[ip]; + + // store old saturation to compute change later + real64 const satOld = phaseVolFrac[ip]; + + // compute saturation and derivatives except multiplying by the total density + phaseVolFrac[ip] = phaseFrac[ip] * phaseDensInv; + + dPhaseVolFrac[ip][Deriv::dP] = + (dPhaseFrac[ip][Deriv::dP] - phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dP]) * phaseDensInv; + + for( integer jc = 0; jc < numComp; ++jc ) + { + dPhaseVolFrac[ip][Deriv::dC+jc] = + (dPhaseFrac[ip][Deriv::dC+jc] - phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dC+jc]) * phaseDensInv; + } + + // apply chain rule to convert derivatives from global component fractions to densities + applyChainRuleInPlace( numComp, dCompFrac_dCompDens, dPhaseVolFrac[ip], work, Deriv::dC ); + + // call the lambda in the phase loop to allow the reuse of the phaseVolFrac and totalDensity + // possible use: assemble the derivatives wrt temperature + phaseVolFractionKernelOp( ip, phaseVolFrac[ip], phaseDensInv, totalDensity ); + + // now finalize the computation by multiplying by total density + for( integer jc = 0; jc < numComp; ++jc ) + { + dPhaseVolFrac[ip][Deriv::dC+jc] *= totalDensity; + dPhaseVolFrac[ip][Deriv::dC+jc] += phaseVolFrac[ip] * dTotalDens_dCompDens; + } + + phaseVolFrac[ip] *= totalDensity; + dPhaseVolFrac[ip][Deriv::dP] *= totalDensity; + + real64 const deltaPhaseVolFrac = LvArray::math::abs( phaseVolFrac[ip] - satOld ); + if( maxDeltaPhaseVolFrac < deltaPhaseVolFrac ) + { + maxDeltaPhaseVolFrac = deltaPhaseVolFrac; + } + } + return maxDeltaPhaseVolFrac; + } + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElems the number of elements + * @param[inout] kernelComponent the kernel component providing access to the compute function + */ + template< typename POLICY, typename KERNEL_TYPE > + static real64 + launch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaPhaseVolFrac( 0.0 ); + forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + real64 const deltaPhaseVolFrac = kernelComponent.compute( ei ); + maxDeltaPhaseVolFrac.max( deltaPhaseVolFrac ); + } ); + return maxDeltaPhaseVolFrac.get(); + } + +protected: + + // outputs + + /// Views on phase volume fractions + arrayView2d< real64, compflow::USD_PHASE > m_phaseVolFrac; + arrayView3d< real64, compflow::USD_PHASE_DC > m_dPhaseVolFrac; + + // inputs + + /// Views on component densities + arrayView2d< real64 const, compflow::USD_COMP > m_compDens; + arrayView3d< real64 const, compflow::USD_COMP_DC > m_dCompFrac_dCompDens; + + /// Views on phase fractions + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseFrac; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseFrac; + + /// Views on phase densities + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseDens; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseDens; + +}; + +/** + * @class PhaseVolumeFractionKernelFactory + */ +class PhaseVolumeFractionKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComp the number of fluid components + * @param[in] numPhase the number of fluid phases + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + */ + template< typename POLICY > + static real64 + createAndLaunch( integer const numComp, + integer const numPhase, + ObjectManagerBase & subRegion, + constitutive::MultiFluidBase const & fluid ) + { + real64 maxDeltaPhaseVolFrac = 0.0; + if( numPhase == 2 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + integer constexpr NUM_COMP = NC(); + PhaseVolumeFractionKernel< NUM_COMP, 2 > kernel( subRegion, fluid ); + maxDeltaPhaseVolFrac = PhaseVolumeFractionKernel< NUM_COMP, 2 >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + else if( numPhase == 3 ) + { + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + integer constexpr NUM_COMP = NC(); + PhaseVolumeFractionKernel< NUM_COMP, 3 > kernel( subRegion, fluid ); + maxDeltaPhaseVolFrac = PhaseVolumeFractionKernel< NUM_COMP, 3 >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + return maxDeltaPhaseVolFrac; + } +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PHASEVOLUMEFRACTIONKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp new file mode 100644 index 00000000000..14f702792db --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp @@ -0,0 +1,208 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 PotGrad.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_POTGRAD_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_POTGRAD_HPP + +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" +#include "constitutive/capillaryPressure/layouts.hpp" +#include "mesh/ElementRegionManager.hpp" + + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseFVMKernelUtilities +{ + +template< typename VIEWTYPE > +using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + +using Deriv = constitutive::multifluid::DerivativeOffset; + +struct PotGrad +{ + template< integer numComp, integer numFluxSupportPoints > + GEOS_HOST_DEVICE + static void + compute ( integer const numPhase, + integer const ip, + integer const hasCapPressure, + localIndex const ( &seri )[numFluxSupportPoints], + localIndex const ( &sesri )[numFluxSupportPoints], + localIndex const ( &sei )[numFluxSupportPoints], + real64 const ( &trans )[numFluxSupportPoints], + real64 const ( &dTrans_dPres )[numFluxSupportPoints], + ElementViewConst< arrayView1d< real64 const > > const & pres, + ElementViewConst< arrayView1d< real64 const > > const & gravCoef, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, + ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, + real64 & potGrad, + real64 ( & dPresGrad_dP )[numFluxSupportPoints], + real64 ( & dPresGrad_dC )[numFluxSupportPoints][numComp], + real64 ( & dGravHead_dP )[numFluxSupportPoints], + real64 ( & dGravHead_dC )[numFluxSupportPoints][numComp] ) + { + // assign derivatives arrays to zero + for( integer i = 0; i < numFluxSupportPoints; ++i ) + { + dPresGrad_dP[i] = 0.0; + dGravHead_dP[i] = 0.0; + for( integer jc = 0; jc < numComp; ++jc ) + { + dPresGrad_dC[i][jc] = 0.0; + dGravHead_dC[i][jc] = 0.0; + } + } + + // create local work arrays + real64 densMean = 0.0; + real64 dDensMean_dP[numFluxSupportPoints]{}; + real64 dDensMean_dC[numFluxSupportPoints][numComp]{}; + + real64 presGrad = 0.0; + real64 gravHead = 0.0; + real64 dCapPressure_dC[numComp]{}; + + real64 dProp_dC[numComp]{}; + + // calculate quantities on primary connected cells + integer denom = 0; + for( integer i = 0; i < numFluxSupportPoints; ++i ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + bool const phaseExists = (phaseVolFrac[er][esr][ei][ip] > 0); + if( !phaseExists ) + { + continue; + } + + // density + real64 const density = phaseMassDens[er][esr][ei][0][ip]; + real64 const dDens_dP = dPhaseMassDens[er][esr][ei][0][ip][Deriv::dP]; + + applyChainRule( numComp, + dCompFrac_dCompDens[er][esr][ei], + dPhaseMassDens[er][esr][ei][0][ip], + dProp_dC, + Deriv::dC ); + + // average density and derivatives + densMean += density; + dDensMean_dP[i] = dDens_dP; + for( integer jc = 0; jc < numComp; ++jc ) + { + dDensMean_dC[i][jc] = dProp_dC[jc]; + } + denom++; + } + if( denom > 1 ) + { + densMean /= denom; + for( integer i = 0; i < numFluxSupportPoints; ++i ) + { + dDensMean_dP[i] /= denom; + for( integer jc = 0; jc < numComp; ++jc ) + { + dDensMean_dC[i][jc] /= denom; + } + } + } + + /// compute the TPFA potential difference + for( integer i = 0; i < numFluxSupportPoints; i++ ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + // capillary pressure + real64 capPressure = 0.0; + real64 dCapPressure_dP = 0.0; + + for( integer ic = 0; ic < numComp; ++ic ) + { + dCapPressure_dC[ic] = 0.0; + } + + if( hasCapPressure ) + { + capPressure = phaseCapPressure[er][esr][ei][0][ip]; + + for( integer jp = 0; jp < numPhase; ++jp ) + { + real64 const dCapPressure_dS = dPhaseCapPressure_dPhaseVolFrac[er][esr][ei][0][ip][jp]; + dCapPressure_dP += dCapPressure_dS * dPhaseVolFrac[er][esr][ei][jp][Deriv::dP]; + + for( integer jc = 0; jc < numComp; ++jc ) + { + dCapPressure_dC[jc] += dCapPressure_dS * dPhaseVolFrac[er][esr][ei][jp][Deriv::dC+jc]; + } + } + } + + presGrad += trans[i] * (pres[er][esr][ei] - capPressure); + dPresGrad_dP[i] += trans[i] * (1 - dCapPressure_dP) + + dTrans_dPres[i] * (pres[er][esr][ei] - capPressure); + for( integer jc = 0; jc < numComp; ++jc ) + { + dPresGrad_dC[i][jc] += -trans[i] * dCapPressure_dC[jc]; + } + + real64 const gravD = trans[i] * gravCoef[er][esr][ei]; + real64 const dGravD_dP = dTrans_dPres[i] * gravCoef[er][esr][ei]; + + // the density used in the potential difference is always a mass density + // unlike the density used in the phase mobility, which is a mass density + // if useMass == 1 and a molar density otherwise + gravHead += densMean * gravD; + + // need to add contributions from both cells the mean density depends on + for( integer j = 0; j < numFluxSupportPoints; ++j ) + { + dGravHead_dP[j] += dDensMean_dP[j] * gravD + dGravD_dP * densMean; + for( integer jc = 0; jc < numComp; ++jc ) + { + dGravHead_dC[j][jc] += dDensMean_dC[j][jc] * gravD; + } + } + } + + // compute phase potential gradient + potGrad = presGrad - gravHead; + + } + +}; + +} // namespace isothermalCompositionalMultiPhaseFVMKernelUtilities + +} // namespace geos + +#endif // GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_POTGRAD_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp new file mode 100644 index 00000000000..4390ad8a34b --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp @@ -0,0 +1,91 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 PropertyKernelBase.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PROPERTYKERNELBASE_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PROPERTYKERNELBASE_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/******************************** PropertyKernelBase ********************************/ + +/** + * @class PropertyKernelBase + * @tparam NUM_COMP number of fluid components + * @brief Define the base interface for the property update kernels + */ +template< integer NUM_COMP > +class PropertyKernelBase +{ +public: + + /// Compile time value for the number of components + static constexpr integer numComp = NUM_COMP; + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElems the number of elements + * @param[inout] kernelComponent the kernel component providing access to the compute function + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + kernelComponent.compute( ei ); + } ); + } + + /** + * @brief Performs the kernel launch on a sorted array + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] targetSet the indices of the elements in which we compute the property + * @param[inout] kernelComponent the kernel component providing access to the compute function + */ + template< typename POLICY, typename KERNEL_TYPE > + static void + launch( SortedArrayView< localIndex const > const & targetSet, + KERNEL_TYPE const & kernelComponent ) + { + forAll< POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const i ) + { + localIndex const ei = targetSet[ i ]; + kernelComponent.compute( ei ); + } ); + } + +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PROPERTYKERNELBASE_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp index 168bb83da93..bc76898511d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp @@ -584,13 +584,13 @@ class ElementBasedAssemblyKernelFactory }; -/******************************** FaceBasedAssemblyKernel ********************************/ +/******************************** FluxComputeKernel ********************************/ /** - * @brief Base class for FaceBasedAssemblyKernel that holds all data not dependent + * @brief Base class for FluxComputeKernel that holds all data not dependent * on template parameters (like stencil type and number of components/dofs). * - * FaceBasedAssemblyKernel is used for flux terms calculation. + * FluxComputeKernel is used for flux terms calculation. * In case mesh geometry/configuration is not changing during simulation, * all connections can be pre-computed, sorted by element, and stored. * Then, ElementBasedAssemblyKernel can be used for flux calculation: every flux will be computed twice, @@ -598,7 +598,7 @@ class ElementBasedAssemblyKernelFactory * and therefore overall performance can significantly improve * */ -class FaceBasedAssemblyKernelBase +class FluxComputeKernelBase { public: @@ -656,14 +656,14 @@ class FaceBasedAssemblyKernelBase * @param[inout] localMatrix the local CRS matrix * @param[inout] localRhs the local right-hand side vector */ - FaceBasedAssemblyKernelBase( globalIndex const rankOffset, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - PermeabilityAccessors const & permeabilityAccessors, - real64 const & dt, - real64 const & transMultExp, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) + FluxComputeKernelBase( globalIndex const rankOffset, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + PermeabilityAccessors const & permeabilityAccessors, + real64 const & dt, + real64 const & transMultExp, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) : m_rankOffset( rankOffset ), m_dt( dt * secondsToDaysMult ), m_transMultExp ( transMultExp ), @@ -724,7 +724,7 @@ class FaceBasedAssemblyKernelBase }; /** - * @class FaceBasedAssemblyKernel + * @class FluxComputeKernel * @tparam NUM_PHASES number of phases * @tparam NUM_COMPS number of components * @tparam ENABLE_ENERGY flag if energy balance equation is assembled @@ -732,7 +732,7 @@ class FaceBasedAssemblyKernelBase * @brief Compute flux term for an element */ template< integer NUM_PHASES, integer NUM_COMPS, bool ENABLE_ENERGY, typename STENCILWRAPPER > -class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase +class FluxComputeKernel : public FluxComputeKernelBase { public: @@ -790,23 +790,23 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase * @param[inout] localMatrix the local CRS matrix * @param[inout] localRhs the local right-hand side vector */ - FaceBasedAssemblyKernel( globalIndex const rankOffset, - STENCILWRAPPER const & stencilWrapper, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - PermeabilityAccessors const & permeabilityAccessors, - real64 const & dt, - real64 const & transMultExp, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - : FaceBasedAssemblyKernelBase( rankOffset, - dofNumberAccessor, - compFlowAccessors, - permeabilityAccessors, - dt, - transMultExp, - localMatrix, - localRhs ), + FluxComputeKernel( globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + PermeabilityAccessors const & permeabilityAccessors, + real64 const & dt, + real64 const & transMultExp, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + : FluxComputeKernelBase( rankOffset, + dofNumberAccessor, + compFlowAccessors, + permeabilityAccessors, + dt, + transMultExp, + localMatrix, + localRhs ), m_stencilWrapper( stencilWrapper ), m_seri( stencilWrapper.getElementRegionIndices() ), m_sesri( stencilWrapper.getElementSubRegionIndices() ), @@ -1168,9 +1168,9 @@ class FaceBasedAssemblyKernel : public FaceBasedAssemblyKernelBase }; /** - * @class FaceBasedAssemblyKernelFactory + * @class FluxComputeKernelFactory */ -class FaceBasedAssemblyKernelFactory +class FluxComputeKernelFactory { public: @@ -1216,7 +1216,7 @@ class FaceBasedAssemblyKernelFactory elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - using KERNEL_TYPE = FaceBasedAssemblyKernel< NUM_PHASES, NUM_COMPS, ENABLE_ENERGY, STENCILWRAPPER >; + using KERNEL_TYPE = FluxComputeKernel< NUM_PHASES, NUM_COMPS, ENABLE_ENERGY, STENCILWRAPPER >; typename KERNEL_TYPE::CompFlowAccessors compFlowAccessors( elemManager, solverName ); typename KERNEL_TYPE::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/RelativePermeabilityUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/RelativePermeabilityUpdateKernel.hpp new file mode 100644 index 00000000000..7706d28b679 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/RelativePermeabilityUpdateKernel.hpp @@ -0,0 +1,73 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 RelativePermeabilityUpdateKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_RELATIVEPERMEABILITYUPDATEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_RELATIVEPERMEABILITYUPDATEKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/******************************** RelativePermeabilityUpdateKernel ********************************/ + +struct RelativePermeabilityUpdateKernel +{ + template< typename POLICY, typename RELPERM_WRAPPER > + static void + launch( localIndex const size, + RELPERM_WRAPPER const & relPermWrapper, + arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac ) + { + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + for( localIndex q = 0; q < relPermWrapper.numGauss(); ++q ) + { + relPermWrapper.update( k, q, phaseVolFrac[k] ); + } + } ); + } + + template< typename POLICY, typename RELPERM_WRAPPER > + static void + launch( SortedArrayView< localIndex const > const & targetSet, + RELPERM_WRAPPER const & relPermWrapper, + arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac ) + { + forAll< POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const a ) + { + localIndex const k = targetSet[a]; + for( localIndex q = 0; q < relPermWrapper.numGauss(); ++q ) + { + relPermWrapper.update( k, q, phaseVolFrac[k] ); + } + } ); + } +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_RELATIVEPERMEABILITYUPDATEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp new file mode 100644 index 00000000000..b5d4d8c0ae0 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp @@ -0,0 +1,191 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ResidualNormKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_RESIDUALNORMKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_RESIDUALNORMKERNEL_HPP + +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/******************************** ResidualNormKernel ********************************/ + +/** + * @class ResidualNormKernel + */ +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 2 > +{ +public: + + using Base = physicsSolverBaseKernels::ResidualNormKernelBase< 2 >; + using Base::m_minNormalizer; + using Base::m_rankOffset; + using Base::m_localResidual; + using Base::m_dofNumber; + + ResidualNormKernel( globalIndex const rankOffset, + arrayView1d< real64 const > const & localResidual, + arrayView1d< globalIndex const > const & dofNumber, + arrayView1d< localIndex const > const & ghostRank, + integer const numComponents, + ElementSubRegionBase const & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + real64 const minNormalizer ) + : Base( rankOffset, + localResidual, + dofNumber, + ghostRank, + minNormalizer ), + m_numComponents( numComponents ), + m_volume( subRegion.getElementVolume() ), + m_porosity_n( solid.getPorosity_n() ), + m_totalDens_n( fluid.totalDensity_n() ) + {} + + GEOS_HOST_DEVICE + virtual void computeLinf( localIndex const ei, + LinfStackVariables & stack ) const override + { + // this should never be zero if the simulation is set up correctly, but we never know + real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_totalDens_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ); + real64 const volumeNormalizer = LvArray::math::max( m_minNormalizer, m_porosity_n[ei][0] * m_volume[ei] ); + + // step 1: mass residuals + + for( integer idof = 0; idof < m_numComponents; ++idof ) + { + real64 const valMass = LvArray::math::abs( m_localResidual[stack.localRow + idof] ) / massNormalizer; + if( valMass > stack.localValue[0] ) + { + stack.localValue[0] = valMass; + } + } + + // step 2: volume residual + + real64 const valVol = LvArray::math::abs( m_localResidual[stack.localRow + m_numComponents] ) / volumeNormalizer; + if( valVol > stack.localValue[1] ) + { + stack.localValue[1] = valVol; + } + } + + GEOS_HOST_DEVICE + virtual void computeL2( localIndex const ei, + L2StackVariables & stack ) const override + { + // note: for the L2 norm, we bundle the volume and mass residuals/normalizers + + real64 const massNormalizer = LvArray::math::max( m_minNormalizer, m_totalDens_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ); + + // step 1: mass residuals + + for( integer idof = 0; idof < m_numComponents; ++idof ) + { + stack.localValue[0] += m_localResidual[stack.localRow + idof] * m_localResidual[stack.localRow + idof]; + stack.localNormalizer[0] += massNormalizer; + } + + // step 2: volume residual + + real64 const val = m_localResidual[stack.localRow + m_numComponents] * m_totalDens_n[ei][0]; // we need a mass here, hence the + // multiplication + stack.localValue[1] += val * val; + stack.localNormalizer[1] += massNormalizer; + } + + +protected: + + /// Number of fluid coponents + integer const m_numComponents; + + /// View on the volume + arrayView1d< real64 const > const m_volume; + + /// View on porosity at the previous converged time step + arrayView2d< real64 const > const m_porosity_n; + + /// View on total mass/molar density at the previous converged time step + arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > const m_totalDens_n; + +}; + +/** + * @class ResidualNormKernelFactory + */ +class ResidualNormKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] normType the type of norm used (Linf or L2) + * @param[in] numComps the number of fluid components + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] localResidual the residual vector on my MPI rank + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[out] residualNorm the residual norm on the subRegion + * @param[out] residualNormalizer the residual normalizer on the subRegion + */ + template< typename POLICY > + static void + createAndLaunch( physicsSolverBaseKernels::NormType const normType, + integer const numComps, + globalIndex const rankOffset, + string const dofKey, + arrayView1d< real64 const > const & localResidual, + ElementSubRegionBase const & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + real64 const minNormalizer, + real64 (& residualNorm)[2], + real64 (& residualNormalizer)[2] ) + { + arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); + arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); + + ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, numComps, subRegion, fluid, solid, minNormalizer ); + if( normType == physicsSolverBaseKernels::NormType::Linf ) + { + ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); + } + else // L2 norm + { + ResidualNormKernel::launchL2< POLICY >( subRegion.size(), kernel, residualNorm, residualNormalizer ); + } + } + +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_RESIDUALNORMKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolidInternalEnergyUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolidInternalEnergyUpdateKernel.hpp new file mode 100644 index 00000000000..67a37d81282 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolidInternalEnergyUpdateKernel.hpp @@ -0,0 +1,55 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SolidInternalEnergyUpdateKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLIDINTERNALENERGYUPDATEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLIDINTERNALENERGYUPDATEKERNEL_HPP + +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" + +namespace geos +{ + +namespace thermalCompositionalMultiphaseBaseKernels +{ + +/******************************** SolidInternalEnergyUpdateKernel ********************************/ + +struct SolidInternalEnergyUpdateKernel +{ + + template< typename POLICY, typename SOLID_INTERNAL_ENERGY_WRAPPER > + static void + launch( localIndex const size, + SOLID_INTERNAL_ENERGY_WRAPPER const & solidInternalEnergyWrapper, + arrayView1d< real64 const > const & temp ) + { + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + solidInternalEnergyWrapper.update( k, temp[k] ); + } ); + } +}; + +} // namespace thermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLIDINTERNALENERGYUPDATEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp new file mode 100644 index 00000000000..63b5975dd7a --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp @@ -0,0 +1,334 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SolutionCheckKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONCHECKKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONCHECKKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/******************************** SolutionCheckKernel ********************************/ + +/** + * @class SolutionCheckKernel + * @brief Define the kernel for checking the updated solution + */ +class SolutionCheckKernel : public SolutionScalingAndCheckingKernelBase< integer > +{ +public: + + using Base = SolutionScalingAndCheckingKernelBase< integer >; + using Base::m_rankOffset; + using Base::m_numComp; + using Base::m_dofNumber; + using Base::m_ghostRank; + using Base::m_localSolution; + using Base::m_pressure; + using Base::m_compDens; + + /** + * @brief Create a new kernel instance + * @param[in] allowCompDensChopping flag to allow the component density chopping + * @param[in] scalingFactor the scaling factor + * @param[in] rankOffset the rank offset + * @param[in] numComp the number of components + * @param[in] dofKey the dof key to get dof numbers + * @param[in] subRegion the subRegion + * @param[in] localSolution the Newton update + * @param[in] pressure the pressure vector + * @param[in] compDens the component density vector + */ + SolutionCheckKernel( integer const allowCompDensChopping, + integer const allowNegativePressure, + CompositionalMultiphaseFVM::ScalingType const scalingType, + real64 const scalingFactor, + arrayView1d< real64 const > const pressure, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, + globalIndex const rankOffset, + integer const numComp, + string const dofKey, + ElementSubRegionBase const & subRegion, + arrayView1d< real64 const > const localSolution ) + : Base( rankOffset, + numComp, + dofKey, + subRegion, + localSolution, + pressure, + compDens, + pressureScalingFactor, + compDensScalingFactor ), + m_allowCompDensChopping( allowCompDensChopping ), + m_allowNegativePressure( allowNegativePressure ), + m_scalingFactor( scalingFactor ), + m_scalingType( scalingType ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables located on the stack + */ + struct StackVariables : public Base::StackVariables + { + GEOS_HOST_DEVICE + StackVariables() + { } + + StackVariables( real64 _localMinVal, + real64 _localMinPres, + real64 _localMinDens, + real64 _localMinTotalDens, + integer _localNumNegPressures, + integer _localNumNegDens, + integer _localNumNegTotalDens ) + : + Base::StackVariables( _localMinVal ), + localMinPres( _localMinPres ), + localMinDens( _localMinDens ), + localMinTotalDens( _localMinTotalDens ), + localNumNegPressures( _localNumNegPressures ), + localNumNegDens( _localNumNegDens ), + localNumNegTotalDens( _localNumNegTotalDens ) + { } + + real64 localMinPres; + real64 localMinDens; + real64 localMinTotalDens; + + integer localNumNegPressures; + integer localNumNegDens; + integer localNumNegTotalDens; + + }; + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElems the number of elements + * @param[inout] kernelComponent the kernel component providing access to the compute function + */ + template< typename POLICY, typename KERNEL_TYPE > + static StackVariables + launch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + RAJA::ReduceMin< ReducePolicy< POLICY >, integer > globalMinVal( 1 ); + + RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minPres( 0.0 ); + RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minDens( 0.0 ); + RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minTotalDens( 0.0 ); + + RAJA::ReduceSum< ReducePolicy< POLICY >, integer > numNegPressures( 0 ); + RAJA::ReduceSum< ReducePolicy< POLICY >, integer > numNegDens( 0 ); + RAJA::ReduceSum< ReducePolicy< POLICY >, integer > numNegTotalDens( 0 ); + + forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( kernelComponent.ghostRank( ei ) >= 0 ) + { + return; + } + + StackVariables stack; + kernelComponent.setup( ei, stack ); + kernelComponent.compute( ei, stack ); + + globalMinVal.min( stack.localMinVal ); + + minPres.min( stack.localMinPres ); + minDens.min( stack.localMinDens ); + minTotalDens.min( stack.localMinTotalDens ); + + numNegPressures += stack.localNumNegPressures; + numNegDens += stack.localNumNegDens; + numNegTotalDens += stack.localNumNegTotalDens; + } ); + + return StackVariables( globalMinVal.get(), + minPres.get(), + minDens.get(), + minTotalDens.get(), + numNegPressures.get(), + numNegDens.get(), + numNegTotalDens.get() ); + } + + GEOS_HOST_DEVICE + void setup( localIndex const ei, + StackVariables & stack ) const + { + Base::setup( ei, stack ); + + stack.localMinPres = 0.0; + stack.localMinDens = 0.0; + stack.localMinTotalDens = 0.0; + + stack.localNumNegPressures = 0; + stack.localNumNegDens = 0; + stack.localNumNegTotalDens = 0; + } + + /** + * @brief Compute the local value + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void compute( localIndex const ei, + StackVariables & stack ) const + { + computeSolutionCheck( ei, stack ); + } + + /** + * @brief Compute the local value of the check + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + * @param[in] kernelOp the function used to customize the kernel + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void computeSolutionCheck( localIndex const ei, + StackVariables & stack, + FUNC && kernelOp = NoOpFunc{} ) const + { + bool const localScaling = m_scalingType == CompositionalMultiphaseFVM::ScalingType::Local; + + real64 const newPres = m_pressure[ei] + (localScaling ? m_pressureScalingFactor[ei] : m_scalingFactor) * m_localSolution[stack.localRow]; + if( newPres < 0 ) + { + if( !m_allowNegativePressure ) + { + stack.localMinVal = 0; + } + stack.localNumNegPressures += 1; + if( newPres < stack.localMinPres ) + stack.localMinPres = newPres; + } + + // if component density chopping is not allowed, the time step fails if a component density is negative + // otherwise, we just check that the total density is positive, and negative component densities + // will be chopped (i.e., set to zero) in ApplySystemSolution) + if( !m_allowCompDensChopping ) + { + for( integer ic = 0; ic < m_numComp; ++ic ) + { + real64 const newDens = m_compDens[ei][ic] + (localScaling ? m_compDensScalingFactor[ei] : m_scalingFactor) * m_localSolution[stack.localRow + ic + 1]; + if( newDens < 0 ) + { + stack.localMinVal = 0; + stack.localNumNegDens += 1; + if( newDens < stack.localMinDens ) + stack.localMinDens = newDens; + } + } + } + else + { + real64 totalDens = 0.0; + for( integer ic = 0; ic < m_numComp; ++ic ) + { + real64 const newDens = m_compDens[ei][ic] + (localScaling ? m_compDensScalingFactor[ei] : m_scalingFactor) * m_localSolution[stack.localRow + ic + 1]; + totalDens += ( newDens > 0.0 ) ? newDens : 0.0; + } + if( totalDens < 0 ) + { + stack.localMinVal = 0; + stack.localNumNegTotalDens += 1; + if( totalDens < stack.localMinTotalDens ) + stack.localMinTotalDens = totalDens; + } + } + + kernelOp(); + } + +protected: + + /// flag to allow the component density chopping + integer const m_allowCompDensChopping; + + /// flag to allow negative pressure values + integer const m_allowNegativePressure; + + /// scaling factor + real64 const m_scalingFactor; + + /// scaling type (global or local) + CompositionalMultiphaseFVM::ScalingType const m_scalingType; + +}; + +/** + * @class SolutionCheckKernelFactory + */ +class SolutionCheckKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] allowCompDensChopping flag to allow the component density chopping + * @param[in] scalingFactor the scaling factor + * @param[in] rankOffset the rank offset + * @param[in] numComp the number of components + * @param[in] dofKey the dof key to get dof numbers + * @param[in] subRegion the subRegion + * @param[in] localSolution the Newton update + */ + template< typename POLICY > + static SolutionCheckKernel::StackVariables + createAndLaunch( integer const allowCompDensChopping, + integer const allowNegativePressure, + CompositionalMultiphaseFVM::ScalingType const scalingType, + real64 const scalingFactor, + arrayView1d< real64 const > const pressure, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, + globalIndex const rankOffset, + integer const numComp, + string const dofKey, + ElementSubRegionBase & subRegion, + arrayView1d< real64 const > const localSolution ) + { + SolutionCheckKernel kernel( allowCompDensChopping, allowNegativePressure, scalingType, scalingFactor, + pressure, compDens, pressureScalingFactor, compDensScalingFactor, rankOffset, + numComp, dofKey, subRegion, localSolution ); + return SolutionCheckKernel::launch< POLICY >( subRegion.size(), kernel ); + } + +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONCHECKKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp new file mode 100644 index 00000000000..ff03cf15f71 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp @@ -0,0 +1,182 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SolutionScalingAndCheckingKernelBase.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONSCALINGANDCHECKINGKERNELBASE_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONSCALINGANDCHECKINGKERNELBASE_HPP + +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "mesh/ElementSubRegionBase.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/** + * @class SolutionScalingAndCheckingKernelBase + * @brief Define the kernel for scaling the solution and check its validity + */ +template< typename TYPE > +class SolutionScalingAndCheckingKernelBase +{ +public: + + /** + * @brief Create a new kernel instance + * @param[in] rankOffset the rank offset + * @param[in] numComp the number of components + * @param[in] dofKey the dof key to get dof numbers + * @param[in] subRegion the subRegion + * @param[in] localSolution the Newton update + * @param[in] pressure the pressure vector + * @param[in] compDens the component density vector + * @param[in] pressureScalingFactor the pressure local scaling factor + * @param[in] compDensScalingFactor the component local scaling factor + */ + SolutionScalingAndCheckingKernelBase( globalIndex const rankOffset, + integer const numComp, + string const dofKey, + ElementSubRegionBase const & subRegion, + arrayView1d< real64 const > const localSolution, + arrayView1d< real64 const > const pressure, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor ) + : m_rankOffset( rankOffset ), + m_numComp( numComp ), + m_dofNumber( subRegion.getReference< array1d< globalIndex > >( dofKey ) ), + m_ghostRank( subRegion.ghostRank() ), + m_localSolution( localSolution ), + m_pressure( pressure ), // not passed with fields::flow to be able to reuse this for wells + m_compDens( compDens ), // same here + m_pressureScalingFactor( pressureScalingFactor ), + m_compDensScalingFactor( compDensScalingFactor ) + { } + + /** + * @struct StackVariables + * @brief Kernel variables located on the stack + */ + struct StackVariables + { + GEOS_HOST_DEVICE + StackVariables() + { } + + StackVariables( real64 _localMinVal ) + : + localMinVal( _localMinVal ) + { } + + /// Index of the local row corresponding to this element + localIndex localRow; + + /// The local value + TYPE localMinVal; + }; + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] ei the element index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + void setup( localIndex const ei, + StackVariables & stack ) const + { + stack.localMinVal = 1; + + // set row index and degrees of freedom indices for this element + stack.localRow = m_dofNumber[ei] - m_rankOffset; + } + + /** + * @brief Getter for the ghost rank + * @param[in] i the looping index of the element/node/face + * @return the ghost rank of the element/node/face + */ + GEOS_HOST_DEVICE + integer ghostRank( localIndex const i ) const + { return m_ghostRank( i ); } + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElems the number of elements + * @param[inout] kernelComponent the kernel component providing access to the compute function + */ + template< typename POLICY, typename KERNEL_TYPE > + static TYPE + launch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + RAJA::ReduceMin< ReducePolicy< POLICY >, TYPE > minVal( 1 ); + forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( kernelComponent.ghostRank( ei ) >= 0 ) + { + return; + } + + StackVariables stack; + kernelComponent.setup( ei, stack ); + kernelComponent.compute( ei, stack ); + minVal.min( stack.localMinVal ); + } ); + + return minVal.get(); + } + +protected: + + /// Offset for my MPI rank + globalIndex const m_rankOffset; + + /// Number of components + real64 const m_numComp; + + /// View on the dof numbers + arrayView1d< globalIndex const > const m_dofNumber; + + /// View on the ghost ranks + arrayView1d< integer const > const m_ghostRank; + + /// View on the local residual + arrayView1d< real64 const > const m_localSolution; + + /// View on the primary variables + arrayView1d< real64 const > const m_pressure; + arrayView2d< real64 const, compflow::USD_COMP > const m_compDens; + + /// View on the scaling factors + arrayView1d< real64 > const m_pressureScalingFactor; + arrayView1d< real64 > const m_compDensScalingFactor; + +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONSCALINGANDCHECKINGKERNELBASE_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp new file mode 100644 index 00000000000..3158d2f7537 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp @@ -0,0 +1,383 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SolutionScalingKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONSCALINGKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONSCALINGKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/******************************** SolutionScalingKernel ********************************/ + +/** + * @class SolutionScalingKernel + * @brief Define the kernel for scaling the Newton update + */ +class SolutionScalingKernel : public SolutionScalingAndCheckingKernelBase< real64 > +{ +public: + + using Base = SolutionScalingAndCheckingKernelBase< real64 >; + using Base::m_rankOffset; + using Base::m_numComp; + using Base::m_dofNumber; + using Base::m_ghostRank; + using Base::m_localSolution; + using Base::m_pressure; + using Base::m_compDens; + using Base::m_pressureScalingFactor; + using Base::m_compDensScalingFactor; + + /** + * @brief Create a new kernel instance + * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change + * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompDensChange the max allowed comp density change + * @param[in] rankOffset the rank offset + * @param[in] numComp the number of components + * @param[in] dofKey the dof key to get dof numbers + * @param[in] subRegion the subRegion + * @param[in] localSolution the Newton update + * @param[in] pressure the pressure vector + * @param[in] compDens the component density vector + * @param[in] pressureScalingFactor the pressure local scaling factor + * @param[in] compDensScalingFactor the component density local scaling factor + */ + SolutionScalingKernel( real64 const maxRelativePresChange, + real64 const maxAbsolutePresChange, + real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, + globalIndex const rankOffset, + integer const numComp, + string const dofKey, + ElementSubRegionBase const & subRegion, + arrayView1d< real64 const > const localSolution, + arrayView1d< real64 const > const pressure, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor ) + : Base( rankOffset, + numComp, + dofKey, + subRegion, + localSolution, + pressure, + compDens, + pressureScalingFactor, + compDensScalingFactor ), + m_maxRelativePresChange( maxRelativePresChange ), + m_maxAbsolutePresChange( maxAbsolutePresChange ), + m_maxCompFracChange( maxCompFracChange ), + m_maxRelativeCompDensChange( maxRelativeCompDensChange ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables located on the stack + */ + struct StackVariables : public Base::StackVariables + { + GEOS_HOST_DEVICE + StackVariables() + { } + + StackVariables( real64 _localMinVal, + real64 _localMaxDeltaPres, + real64 _localMaxDeltaTemp, + real64 _localMaxDeltaCompDens, + real64 _localMinPresScalingFactor, + real64 _localMinTempScalingFactor, + real64 _localMinCompDensScalingFactor ) + : + Base::StackVariables( _localMinVal ), + localMaxDeltaPres( _localMaxDeltaPres ), + localMaxDeltaTemp( _localMaxDeltaTemp ), + localMaxDeltaCompDens( _localMaxDeltaCompDens ), + localMinPresScalingFactor( _localMinPresScalingFactor ), + localMinTempScalingFactor( _localMinTempScalingFactor ), + localMinCompDensScalingFactor( _localMinCompDensScalingFactor ) + { } + + real64 localMaxDeltaPres; + real64 localMaxDeltaTemp; + real64 localMaxDeltaCompDens; + + real64 localMinPresScalingFactor; + real64 localMinTempScalingFactor; + real64 localMinCompDensScalingFactor; + + }; + + /** + * @brief Performs the kernel launch + * @tparam POLICY the policy used in the RAJA kernels + * @tparam KERNEL_TYPE the kernel type + * @param[in] numElems the number of elements + * @param[inout] kernelComponent the kernel component providing access to the compute function + */ + template< typename POLICY, typename KERNEL_TYPE > + static StackVariables + launch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > globalScalingFactor( 1.0 ); + + RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaPres( 0.0 ); + RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaTemp( 0.0 ); + RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaCompDens( 0.0 ); + + RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minPresScalingFactor( 1.0 ); + RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minTempScalingFactor( 1.0 ); + RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minCompDensScalingFactor( 1.0 ); + + forAll< POLICY >( numElems, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( kernelComponent.ghostRank( ei ) >= 0 ) + { + return; + } + + StackVariables stack; + kernelComponent.setup( ei, stack ); + kernelComponent.compute( ei, stack ); + + globalScalingFactor.min( stack.localMinVal ); + + maxDeltaPres.max( stack.localMaxDeltaPres ); + maxDeltaTemp.max( stack.localMaxDeltaTemp ); + maxDeltaCompDens.max( stack.localMaxDeltaCompDens ); + + minPresScalingFactor.min( stack.localMinPresScalingFactor ); + minTempScalingFactor.min( stack.localMinTempScalingFactor ); + minCompDensScalingFactor.min( stack.localMinCompDensScalingFactor ); + } ); + + return StackVariables( globalScalingFactor.get(), + maxDeltaPres.get(), + maxDeltaTemp.get(), + maxDeltaCompDens.get(), + minPresScalingFactor.get(), + minTempScalingFactor.get(), + minCompDensScalingFactor.get() ); + } + + GEOS_HOST_DEVICE + void setup( localIndex const ei, + StackVariables & stack ) const + { + Base::setup( ei, stack ); + + stack.localMaxDeltaPres = 0.0; + stack.localMaxDeltaTemp = 0.0; + stack.localMaxDeltaCompDens = 0.0; + + stack.localMinPresScalingFactor = 1.0; + stack.localMinTempScalingFactor = 1.0; + stack.localMinCompDensScalingFactor = 1.0; + } + + /** + * @brief Compute the local value + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void compute( localIndex const ei, + StackVariables & stack ) const + { + computeScalingFactor( ei, stack ); + } + + /** + * @brief Compute the local value of the scaling factor + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + * @param[in] kernelOp the function used to customize the kernel + */ + template< typename FUNC = NoOpFunc > + GEOS_HOST_DEVICE + void computeScalingFactor( localIndex const ei, + StackVariables & stack, + FUNC && kernelOp = NoOpFunc{} ) const + { + real64 constexpr eps = minDensForDivision; + + // compute the change in pressure + real64 const pres = m_pressure[ei]; + real64 const absPresChange = LvArray::math::abs( m_localSolution[stack.localRow] ); + if( stack.localMaxDeltaPres < absPresChange ) + { + stack.localMaxDeltaPres = absPresChange; + } + + // compute pressure scaling factor + real64 presScalingFactor = 1.0; + // when enabled, absolute change scaling has a priority over relative change + if( m_maxAbsolutePresChange > 0.0 ) // maxAbsolutePresChange <= 0.0 means that absolute scaling is disabled + { + if( absPresChange > m_maxAbsolutePresChange ) + { + presScalingFactor = m_maxAbsolutePresChange / absPresChange; + } + } + else if( pres > eps ) + { + real64 const relativePresChange = absPresChange / pres; + if( relativePresChange > m_maxRelativePresChange ) + { + presScalingFactor = m_maxRelativePresChange / relativePresChange; + } + } + m_pressureScalingFactor[ei] = presScalingFactor; + if( stack.localMinVal > presScalingFactor ) + { + stack.localMinVal = presScalingFactor; + } + if( stack.localMinPresScalingFactor > presScalingFactor ) + { + stack.localMinPresScalingFactor = presScalingFactor; + } + + real64 prevTotalDens = 0; + for( integer ic = 0; ic < m_numComp; ++ic ) + { + prevTotalDens += m_compDens[ei][ic]; + } + + m_compDensScalingFactor[ei] = 1.0; + + // compute the change in component densities and component fractions + for( integer ic = 0; ic < m_numComp; ++ic ) + { + // compute scaling factor based on relative change in component densities + real64 const absCompDensChange = LvArray::math::abs( m_localSolution[stack.localRow + ic + 1] ); + if( stack.localMaxDeltaCompDens < absCompDensChange ) + { + stack.localMaxDeltaCompDens = absCompDensChange; + } + + // This actually checks the change in component fraction, using a lagged total density + // Indeed we can rewrite the following check as: + // | prevCompDens / prevTotalDens - newCompDens / prevTotalDens | > maxCompFracChange + // Note that the total density in the second term is lagged (i.e, we use prevTotalDens) + // because I found it more robust than using directly newTotalDens (which can vary also + // wildly when the compDens change is large) + real64 const maxAbsCompDensChange = m_maxCompFracChange * prevTotalDens; + if( absCompDensChange > maxAbsCompDensChange && absCompDensChange > eps ) + { + real64 const compScalingFactor = maxAbsCompDensChange / absCompDensChange; + m_compDensScalingFactor[ei] = LvArray::math::min( m_compDensScalingFactor[ei], compScalingFactor ); + if( stack.localMinVal > compScalingFactor ) + { + stack.localMinVal = compScalingFactor; + } + if( stack.localMinCompDensScalingFactor > compScalingFactor ) + { + stack.localMinCompDensScalingFactor = compScalingFactor; + } + } + + // switch from relative to absolute when value is < 1.0 + real64 const maxRelCompDensChange = m_maxRelativeCompDensChange * LvArray::math::max( m_compDens[ei][ic], 1.0 ); + if( absCompDensChange > maxRelCompDensChange && absCompDensChange > eps ) + { + real64 const compScalingFactor = maxRelCompDensChange / absCompDensChange; + m_compDensScalingFactor[ei] = LvArray::math::min( m_compDensScalingFactor[ei], compScalingFactor ); + if( stack.localMinVal > compScalingFactor ) + { + stack.localMinVal = compScalingFactor; + } + if( stack.localMinCompDensScalingFactor > compScalingFactor ) + { + stack.localMinCompDensScalingFactor = compScalingFactor; + } + } + } + + // compute the scaling factor for other vars, such as temperature + kernelOp(); + } + +protected: + + /// Max allowed changes in primary variables + real64 const m_maxRelativePresChange; + real64 const m_maxAbsolutePresChange; + real64 const m_maxCompFracChange; + real64 const m_maxRelativeCompDensChange; + +}; + +/** + * @class SolutionScalingKernelFactory + */ +class SolutionScalingKernelFactory +{ +public: + + /* + * @brief Create and launch the kernel computing the scaling factor + * @tparam POLICY the kernel policy + * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change + * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompDensChange the max allowed comp density change + * @param[in] rankOffset the rank offset + * @param[in] numComp the number of components + * @param[in] dofKey the dof key to get dof numbers + * @param[in] subRegion the subRegion + * @param[in] localSolution the Newton update + * @return the scaling factor + */ + template< typename POLICY > + static SolutionScalingKernel::StackVariables + createAndLaunch( real64 const maxRelativePresChange, + real64 const maxAbsolutePresChange, + real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, + arrayView1d< real64 const > const pressure, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, + globalIndex const rankOffset, + integer const numComp, + string const dofKey, + ElementSubRegionBase & subRegion, + arrayView1d< real64 const > const localSolution ) + { + SolutionScalingKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, maxRelativeCompDensChange, rankOffset, + numComp, dofKey, subRegion, localSolution, pressure, compDens, pressureScalingFactor, compDensScalingFactor ); + return SolutionScalingKernel::launch< POLICY >( subRegion.size(), kernel ); + } +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONSCALINGKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp similarity index 86% rename from src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedCompositionalMultiphaseFVMKernels.hpp rename to src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp index 62bab9f3a23..de9e92c8b80 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedCompositionalMultiphaseFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp @@ -14,13 +14,15 @@ */ /** - * @file StabilizedCompositionalMultiphaseFVMKernels.hpp + * @file StabilizedFluxComputeKernel.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_STABILIZEDFLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_STABILIZEDFLUXCOMPUTEKERNEL_HPP -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp" +#include "constitutive/relativePermeability/RelativePermeabilityBase.hpp" +#include "constitutive/relativePermeability/RelativePermeabilityFields.hpp" namespace geos { @@ -28,17 +30,17 @@ namespace geos namespace stabilizedCompositionalMultiphaseFVMKernels { -/******************************** FaceBasedAssemblyKernel ********************************/ +/******************************** FluxComputeKernel ********************************/ /** - * @class FaceBasedAssemblyKernel + * @class FluxComputeKernel * @tparam NUM_COMP number of fluid components * @tparam NUM_DOF number of degrees of freedom * @tparam STENCILWRAPPER the type of the stencil wrapper * @brief Define the interface for the assembly kernel in charge of flux terms */ template< integer NUM_COMP, integer NUM_DOF, typename STENCILWRAPPER > -class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER > +class FluxComputeKernel : public isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER > { public: @@ -51,7 +53,7 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne template< typename VIEWTYPE > using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelBase; + using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernelBase; using DofNumberAccessor = AbstractBase::DofNumberAccessor; using CompFlowAccessors = AbstractBase::CompFlowAccessors; using MultiFluidAccessors = AbstractBase::MultiFluidAccessors; @@ -82,7 +84,7 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne using AbstractBase::m_dCompFrac_dCompDens; using AbstractBase::m_pres; - using Base = isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; + using Base = isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; using Base::numComp; using Base::numDof; using Base::numEqn; @@ -115,21 +117,21 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne * @param[inout] localRhs the local right-hand side vector * @param[in] kernelFlags flags packed together */ - FaceBasedAssemblyKernel( integer const numPhases, - globalIndex const rankOffset, - STENCILWRAPPER const & stencilWrapper, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - StabCompFlowAccessors const & stabCompFlowAccessors, - MultiFluidAccessors const & multiFluidAccessors, - StabMultiFluidAccessors const & stabMultiFluidAccessors, - CapPressureAccessors const & capPressureAccessors, - PermeabilityAccessors const & permeabilityAccessors, - RelPermAccessors const & relPermAccessors, - real64 const & dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags ) + FluxComputeKernel( integer const numPhases, + globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + StabCompFlowAccessors const & stabCompFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + StabMultiFluidAccessors const & stabMultiFluidAccessors, + CapPressureAccessors const & capPressureAccessors, + PermeabilityAccessors const & permeabilityAccessors, + RelPermAccessors const & relPermAccessors, + real64 const & dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< isothermalCompositionalMultiphaseFVMKernels::KernelFlags > kernelFlags ) : Base( numPhases, rankOffset, stencilWrapper, @@ -296,9 +298,9 @@ class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKerne }; /** - * @class FaceBasedAssemblyKernelFactory + * @class FluxComputeKernelFactory */ -class FaceBasedAssemblyKernelFactory +class FluxComputeKernelFactory { public: @@ -343,13 +345,13 @@ class FaceBasedAssemblyKernelFactory elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags; + BitFlags< isothermalCompositionalMultiphaseFVMKernels::KernelFlags > kernelFlags; if( hasCapPressure ) - kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags::CapPressure ); + kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::KernelFlags::CapPressure ); if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags::TotalMassEquation ); + kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::KernelFlags::TotalMassEquation ); - using KERNEL_TYPE = FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; + using KERNEL_TYPE = FluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; typename KERNEL_TYPE::CompFlowAccessors compFlowAccessors( elemManager, solverName ); typename KERNEL_TYPE::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); typename KERNEL_TYPE::StabCompFlowAccessors stabCompFlowAccessors( elemManager, solverName ); @@ -372,4 +374,4 @@ class FaceBasedAssemblyKernelFactory } // namespace geos -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_STABILIZEDCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_STABILIZEDFLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StatisticsKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StatisticsKernel.hpp new file mode 100644 index 00000000000..ae7c91fcc6e --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StatisticsKernel.hpp @@ -0,0 +1,194 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 StatisticsKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_STATISTICSKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_STATISTICSKERNEL_HPP + +#include "common/DataLayouts.hpp" +#include "common/DataTypes.hpp" +#include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/relativePermeability/layouts.hpp" + + +namespace geos +{ + +namespace isothermalCompositionalMultiphaseBaseKernels +{ + +/******************************** StatisticsKernel ********************************/ + +struct StatisticsKernel +{ + template< typename POLICY > + static void + saveDeltaPressure( localIndex const size, + arrayView1d< real64 const > const & pres, + arrayView1d< real64 const > const & initPres, + arrayView1d< real64 > const & deltaPres ) + { + forAll< parallelDevicePolicy<> >( size, [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + deltaPres[ei] = pres[ei] - initPres[ei]; + } ); + } + + template< typename POLICY > + static void + launch( localIndex const size, + integer const numComps, + integer const numPhases, + real64 const relpermThreshold, + arrayView1d< integer const > const & elemGhostRank, + arrayView1d< real64 const > const & volume, + arrayView1d< real64 const > const & pres, + arrayView1d< real64 const > const & deltaPres, + arrayView1d< real64 const > const & temp, + arrayView1d< real64 const > const & refPorosity, + arrayView2d< real64 const > const & porosity, + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const & phaseDensity, + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > const & phaseCompFraction, + arrayView2d< real64 const, compflow::USD_PHASE > const & phaseVolFrac, + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > const & phaseTrappedVolFrac, + arrayView3d< real64 const, constitutive::relperm::USD_RELPERM > const & phaseRelperm, + real64 & minPres, + real64 & avgPresNumerator, + real64 & maxPres, + real64 & minDeltaPres, + real64 & maxDeltaPres, + real64 & minTemp, + real64 & avgTempNumerator, + real64 & maxTemp, + real64 & totalUncompactedPoreVol, + arrayView1d< real64 > const & phaseDynamicPoreVol, + arrayView1d< real64 > const & phaseMass, + arrayView1d< real64 > const & trappedPhaseMass, + arrayView1d< real64 > const & immobilePhaseMass, + arrayView2d< real64 > const & dissolvedComponentMass ) + { + RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinPres( LvArray::NumericLimits< real64 >::max ); + RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionAvgPresNumerator( 0.0 ); + RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxPres( -LvArray::NumericLimits< real64 >::max ); + RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinDeltaPres( LvArray::NumericLimits< real64 >::max ); + RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxDeltaPres( -LvArray::NumericLimits< real64 >::max ); + RAJA::ReduceMin< parallelDeviceReduce, real64 > subRegionMinTemp( LvArray::NumericLimits< real64 >::max ); + RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionAvgTempNumerator( 0.0 ); + RAJA::ReduceMax< parallelDeviceReduce, real64 > subRegionMaxTemp( 0.0 ); + RAJA::ReduceSum< parallelDeviceReduce, real64 > subRegionTotalUncompactedPoreVol( 0.0 ); + + // For this arrays phaseDynamicPoreVol, phaseMass, dissolvedComponentMass, + // using an array of ReduceSum leads to a formal parameter overflow in CUDA. + // As a workaround, we use a slice with RAJA::atomicAdd instead + + forAll< parallelDevicePolicy<> >( size, [numComps, + numPhases, + relpermThreshold, + elemGhostRank, + volume, + refPorosity, + porosity, + pres, + deltaPres, + temp, + phaseDensity, + phaseVolFrac, + phaseTrappedVolFrac, + phaseRelperm, + phaseCompFraction, + subRegionMinPres, + subRegionAvgPresNumerator, + subRegionMaxPres, + subRegionMinDeltaPres, + subRegionMaxDeltaPres, + subRegionMinTemp, + subRegionAvgTempNumerator, + subRegionMaxTemp, + subRegionTotalUncompactedPoreVol, + phaseDynamicPoreVol, + phaseMass, + trappedPhaseMass, + immobilePhaseMass, + dissolvedComponentMass] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( elemGhostRank[ei] >= 0 ) + { + return; + } + + // To match our "reference", we have to use reference porosity here, not the actual porosity when we compute averages + real64 const uncompactedPoreVol = volume[ei] * refPorosity[ei]; + real64 const dynamicPoreVol = volume[ei] * porosity[ei][0]; + + subRegionMinPres.min( pres[ei] ); + subRegionAvgPresNumerator += uncompactedPoreVol * pres[ei]; + subRegionMaxPres.max( pres[ei] ); + + subRegionMaxDeltaPres.max( deltaPres[ei] ); + subRegionMinDeltaPres.min( deltaPres[ei] ); + + subRegionMinTemp.min( temp[ei] ); + subRegionAvgTempNumerator += uncompactedPoreVol * temp[ei]; + subRegionMaxTemp.max( temp[ei] ); + subRegionTotalUncompactedPoreVol += uncompactedPoreVol; + for( integer ip = 0; ip < numPhases; ++ip ) + { + real64 const elemPhaseVolume = dynamicPoreVol * phaseVolFrac[ei][ip]; + real64 const elemPhaseMass = phaseDensity[ei][0][ip] * elemPhaseVolume; + real64 const elemTrappedPhaseMass = phaseDensity[ei][0][ip] * dynamicPoreVol * phaseTrappedVolFrac[ei][0][ip]; + // RAJA::atomicAdd used here because we do not use ReduceSum here (for the reason explained above) + RAJA::atomicAdd( parallelDeviceAtomic{}, &phaseDynamicPoreVol[ip], elemPhaseVolume ); + RAJA::atomicAdd( parallelDeviceAtomic{}, &phaseMass[ip], elemPhaseMass ); + RAJA::atomicAdd( parallelDeviceAtomic{}, &trappedPhaseMass[ip], elemTrappedPhaseMass ); + if( phaseRelperm[ei][0][ip] < relpermThreshold ) + { + RAJA::atomicAdd( parallelDeviceAtomic{}, &immobilePhaseMass[ip], elemPhaseMass ); + } + for( integer ic = 0; ic < numComps; ++ic ) + { + // RAJA::atomicAdd used here because we do not use ReduceSum here (for the reason explained above) + RAJA::atomicAdd( parallelDeviceAtomic{}, &dissolvedComponentMass[ip][ic], phaseCompFraction[ei][0][ip][ic] * elemPhaseMass ); + } + } + + } ); + + minPres = subRegionMinPres.get(); + avgPresNumerator = subRegionAvgPresNumerator.get(); + maxPres = subRegionMaxPres.get(); + minDeltaPres = subRegionMinDeltaPres.get(); + maxDeltaPres = subRegionMaxDeltaPres.get(); + minTemp = subRegionMinTemp.get(); + avgTempNumerator = subRegionAvgTempNumerator.get(); + maxTemp = subRegionMaxTemp.get(); + totalUncompactedPoreVol = subRegionTotalUncompactedPoreVol.get(); + + // dummy loop to bring data back to the CPU + forAll< serialPolicy >( 1, [phaseDynamicPoreVol, phaseMass, trappedPhaseMass, immobilePhaseMass, dissolvedComponentMass] ( localIndex const ) + { + GEOS_UNUSED_VAR( phaseDynamicPoreVol, phaseMass, trappedPhaseMass, immobilePhaseMass, dissolvedComponentMass ); + } ); + } +}; + +} // namespace isothermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_STATISTICSKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp new file mode 100644 index 00000000000..1dcaf7acbe4 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp @@ -0,0 +1,345 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ThermalAccumulationKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALACCUMULATIONKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALACCUMULATIONKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" + +namespace geos +{ + +namespace thermalCompositionalMultiphaseBaseKernels +{ + +/******************************** AccumulationKernel ********************************/ + +/** + * @class AccumulationKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_DOF number of degrees of freedom + * @brief Define the interface for the assembly kernel in charge of thermal accumulation and volume balance + */ +template< localIndex NUM_COMP, localIndex NUM_DOF > +class AccumulationKernel : public isothermalCompositionalMultiphaseBaseKernels::AccumulationKernel< NUM_COMP, NUM_DOF > +{ +public: + + using Base = isothermalCompositionalMultiphaseBaseKernels::AccumulationKernel< NUM_COMP, NUM_DOF >; + using Base::numComp; + using Base::numDof; + using Base::numEqn; + using Base::m_numPhases; + using Base::m_rankOffset; + using Base::m_dofNumber; + using Base::m_elemGhostRank; + using Base::m_volume; + using Base::m_porosity; + using Base::m_dPoro_dPres; + using Base::m_dCompFrac_dCompDens; + using Base::m_phaseVolFrac; + using Base::m_dPhaseVolFrac; + using Base::m_phaseDens; + using Base::m_dPhaseDens; + using Base::m_phaseCompFrac; + using Base::m_dPhaseCompFrac; + using Base::m_localMatrix; + using Base::m_localRhs; + + /** + * @brief Constructor + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + AccumulationKernel( localIndex const numPhases, + globalIndex const rankOffset, + string const dofKey, + ElementSubRegionBase const & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > const kernelFlags ) + : Base( numPhases, rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs, kernelFlags ), + m_dPoro_dTemp( solid.getDporosity_dTemperature() ), + m_phaseInternalEnergy( fluid.phaseInternalEnergy() ), + m_dPhaseInternalEnergy( fluid.dPhaseInternalEnergy() ), + m_rockInternalEnergy( solid.getInternalEnergy() ), + m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ), + m_energy_n( subRegion.getField< fields::flow::energy_n >() ) + {} + + struct StackVariables : public Base::StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables() + : Base::StackVariables() + {} + + using Base::StackVariables::localRow; + using Base::StackVariables::dofIndices; + using Base::StackVariables::localResidual; + using Base::StackVariables::localJacobian; + + // derivative of pore volume wrt temperature + real64 dPoreVolume_dTemp = 0.0; + + // Solid energy + + /// Solid energy at time n+1 + real64 solidEnergy = 0.0; + + /// Derivative of solid internal energy with respect to pressure + real64 dSolidEnergy_dPres = 0.0; + + /// Derivative of solid internal energy with respect to temperature + real64 dSolidEnergy_dTemp = 0.0; + + }; + + /** + * @brief Performs the setup phase for the kernel. + * @param[in] ei the element index + * @param[in] stack the stack variables + */ + GEOS_HOST_DEVICE + void setup( localIndex const ei, + StackVariables & stack ) const + { + Base::setup( ei, stack ); + + // derivative of pore volume wrt temperature + stack.dPoreVolume_dTemp = m_volume[ei] * m_dPoro_dTemp[ei][0]; + + // initialize the solid volume + real64 const solidVolume = m_volume[ei] * ( 1.0 - m_porosity[ei][0] ); + real64 const dSolidVolume_dPres = -m_volume[ei] * m_dPoro_dPres[ei][0]; + real64 const dSolidVolume_dTemp = -stack.dPoreVolume_dTemp; + + // initialize the solid internal energy + stack.solidEnergy = solidVolume * m_rockInternalEnergy[ei][0]; + stack.dSolidEnergy_dPres = dSolidVolume_dPres * m_rockInternalEnergy[ei][0]; + stack.dSolidEnergy_dTemp = solidVolume * m_dRockInternalEnergy_dTemp[ei][0] + + dSolidVolume_dTemp * m_rockInternalEnergy[ei][0]; + } + + /** + * @brief Compute the local accumulation contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void computeAccumulation( localIndex const ei, + StackVariables & stack ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + // start with old time step value + stack.localResidual[numEqn-1] = -m_energy_n[ei]; + + Base::computeAccumulation( ei, stack, [&] ( integer const ip, + real64 const & phaseAmount, + real64 const & dPhaseAmount_dP, + real64 const (&dPhaseAmount_dC)[numComp] ) + { + // We are in the loop over phases, ip provides the current phase index. + // We have to do two things: + // 1- Assemble the derivatives of the component mass balance equations with respect to temperature + // 2- Assemble the phase-dependent part of the accumulation term of the energy equation + + real64 dPhaseInternalEnergy_dC[numComp]{}; + + // construct the slices + arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; + arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; + arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseDens = m_phaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; + arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseInternalEnergy = m_phaseInternalEnergy[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseInternalEnergy = m_dPhaseInternalEnergy[ei][0]; + + // Step 1: assemble the derivatives of the component mass balance equations with respect to temperature + + real64 const dPhaseAmount_dT = stack.dPoreVolume_dTemp * phaseVolFrac[ip] * phaseDens[ip] + + stack.poreVolume * (dPhaseVolFrac[ip][Deriv::dT] * phaseDens[ip] + phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dT] ); + for( integer ic = 0; ic < numComp; ++ic ) + { + stack.localJacobian[ic][numDof-1] += dPhaseAmount_dT * phaseCompFrac[ip][ic] + + phaseAmount * dPhaseCompFrac[ip][ic][Deriv::dT]; + } + + // Step 2: assemble the phase-dependent part of the accumulation term of the energy equation + + real64 const phaseEnergy = phaseAmount * phaseInternalEnergy[ip]; + real64 const dPhaseEnergy_dP = dPhaseAmount_dP * phaseInternalEnergy[ip] + + phaseAmount * dPhaseInternalEnergy[ip][Deriv::dP]; + real64 const dPhaseEnergy_dT = dPhaseAmount_dT * phaseInternalEnergy[ip] + + phaseAmount * dPhaseInternalEnergy[ip][Deriv::dT]; + + // local accumulation + stack.localResidual[numEqn-1] += phaseEnergy; + + // derivatives w.r.t. pressure and temperature + stack.localJacobian[numEqn-1][0] += dPhaseEnergy_dP; + stack.localJacobian[numEqn-1][numDof-1] += dPhaseEnergy_dT; + + // derivatives w.r.t. component densities + applyChainRule( numComp, dCompFrac_dCompDens, dPhaseInternalEnergy[ip], dPhaseInternalEnergy_dC, Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + stack.localJacobian[numEqn-1][jc + 1] += phaseInternalEnergy[ip] * dPhaseAmount_dC[jc] + + dPhaseInternalEnergy_dC[jc] * phaseAmount; + } + } ); + + // Step 3: assemble the solid part of the accumulation term + + // local accumulation and derivatives w.r.t. pressure and temperature + stack.localResidual[numEqn-1] += stack.solidEnergy; + stack.localJacobian[numEqn-1][0] += stack.dSolidEnergy_dPres; + stack.localJacobian[numEqn-1][numDof-1] += stack.dSolidEnergy_dTemp; + + } + + /** + * @brief Compute the local volume balance contributions to the residual and Jacobian + * @tparam FUNC the type of the function that can be used to customize the kernel + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void computeVolumeBalance( localIndex const ei, + StackVariables & stack ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + Base::computeVolumeBalance( ei, stack, [&] ( real64 const & oneMinusPhaseVolFraction ) + { + GEOS_UNUSED_VAR( oneMinusPhaseVolFraction ); + + arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; + + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + stack.localJacobian[numEqn-2][numDof-1] -= dPhaseVolFrac[ip][Deriv::dT]; + } + } ); + } + + GEOS_HOST_DEVICE + void complete( localIndex const ei, + StackVariables & stack ) const + { + // Step 1: assemble the component mass balance equations and volume balance equations + Base::complete( ei, stack ); + + // Step 2: assemble the energy equation + m_localRhs[stack.localRow + numEqn-1] += stack.localResidual[numEqn-1]; + m_localMatrix.template addToRow< serialAtomic >( stack.localRow + numEqn-1, + stack.dofIndices, + stack.localJacobian[numEqn-1], + numDof ); + } + +protected: + + /// View on derivative of porosity w.r.t temperature + arrayView2d< real64 const > const m_dPoro_dTemp; + + /// Views on phase internal energy + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseInternalEnergy; + arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseInternalEnergy; + + /// Views on rock internal energy + arrayView2d< real64 const > m_rockInternalEnergy; + arrayView2d< real64 const > m_dRockInternalEnergy_dTemp; + + /// Views on energy + arrayView1d< real64 const > m_energy_n; + +}; + +/** + * @class AccumulationKernelFactory + */ +class AccumulationKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComps the number of fluid components + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY > + static void + createAndLaunch( localIndex const numComps, + localIndex const numPhases, + globalIndex const rankOffset, + integer const useTotalMassEquation, + string const dofKey, + ElementSubRegionBase const & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + isothermalCompositionalMultiphaseBaseKernels:: + internal::kernelLaunchSelectorCompSwitch( numComps, [&] ( auto NC ) + { + localIndex constexpr NUM_COMP = NC(); + localIndex constexpr NUM_DOF = NC()+2; + + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation ); + + AccumulationKernel< NUM_COMP, NUM_DOF > kernel( numPhases, rankOffset, dofKey, subRegion, + fluid, solid, localMatrix, localRhs, kernelFlags ); + AccumulationKernel< NUM_COMP, NUM_DOF >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + +}; + +} // namespace thermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALACCUMULATIONKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp deleted file mode 100644 index 4b07977241c..00000000000 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp +++ /dev/null @@ -1,1062 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * 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 ThermalCompositionalMultiphaseBaseKernels.hpp - */ - -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEBASEKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEBASEKERNELS_HPP - -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" - -namespace geos -{ - -namespace thermalCompositionalMultiphaseBaseKernels -{ - - -/******************************** PhaseVolumeFractionKernel ********************************/ - -/** - * @class PhaseVolumeFractionKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_PHASE number of fluid phases - * @brief Define the interface for the property kernel in charge of computing the phase volume fractions - */ -template< integer NUM_COMP, integer NUM_PHASE > -class PhaseVolumeFractionKernel : public isothermalCompositionalMultiphaseBaseKernels::PhaseVolumeFractionKernel< NUM_COMP, NUM_PHASE > -{ -public: - - using Base = isothermalCompositionalMultiphaseBaseKernels::PhaseVolumeFractionKernel< NUM_COMP, NUM_PHASE >; - using Base::m_dPhaseDens; - using Base::m_dPhaseFrac; - using Base::m_dPhaseVolFrac; - - /** - * @brief Constructor - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - */ - PhaseVolumeFractionKernel( ObjectManagerBase & subRegion, - constitutive::MultiFluidBase const & fluid ) - : Base( subRegion, fluid ) - {} - - /** - * @brief Compute the phase volume fractions in an element - * @param[in] ei the element index - */ - GEOS_HOST_DEVICE - real64 compute( localIndex const ei ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseFrac = m_dPhaseFrac[ei][0]; - - arraySlice2d< real64, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; - - // Call the base compute the compute the phase volume fraction - return Base::compute( ei, [&] ( localIndex const ip, - real64 const & phaseVolFrac, - real64 const & phaseDensInv, - real64 const & totalDensity ) - { - // when this lambda is called, we are in the phase loop - // for each phase ip, compute the derivative of phase volume fraction wrt temperature - dPhaseVolFrac[ip][Deriv::dT] = (dPhaseFrac[ip][Deriv::dT] - phaseVolFrac * dPhaseDens[ip][Deriv::dT]) * phaseDensInv; - dPhaseVolFrac[ip][Deriv::dT] *= totalDensity; - } ); - } - -}; - -/** - * @class PhaseVolumeFractionKernelFactory - */ -class PhaseVolumeFractionKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] numComp the number of fluid components - * @param[in] numPhase the number of fluid phases - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - */ - template< typename POLICY > - static real64 - createAndLaunch( integer const numComp, - integer const numPhase, - ObjectManagerBase & subRegion, - constitutive::MultiFluidBase const & fluid ) - { - real64 maxDeltaPhaseVolFrac = 0.0; - if( numPhase == 2 ) - { - isothermalCompositionalMultiphaseBaseKernels:: - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - integer constexpr NUM_COMP = NC(); - PhaseVolumeFractionKernel< NUM_COMP, 2 > kernel( subRegion, fluid ); - maxDeltaPhaseVolFrac = PhaseVolumeFractionKernel< NUM_COMP, 2 >::template launch< POLICY >( subRegion.size(), kernel ); - } ); - } - else if( numPhase == 3 ) - { - isothermalCompositionalMultiphaseBaseKernels:: - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - integer constexpr NUM_COMP = NC(); - PhaseVolumeFractionKernel< NUM_COMP, 3 > kernel( subRegion, fluid ); - maxDeltaPhaseVolFrac = PhaseVolumeFractionKernel< NUM_COMP, 3 >::template launch< POLICY >( subRegion.size(), kernel ); - } ); - } - return maxDeltaPhaseVolFrac; - } -}; - - -/******************************** ElementBasedAssemblyKernel ********************************/ - -/** - * @class ElementBasedAssemblyKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_DOF number of degrees of freedom - * @brief Define the interface for the assembly kernel in charge of thermal accumulation and volume balance - */ -template< localIndex NUM_COMP, localIndex NUM_DOF > -class ElementBasedAssemblyKernel : public isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernel< NUM_COMP, NUM_DOF > -{ -public: - - using Base = isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernel< NUM_COMP, NUM_DOF >; - using Base::numComp; - using Base::numDof; - using Base::numEqn; - using Base::m_numPhases; - using Base::m_rankOffset; - using Base::m_dofNumber; - using Base::m_elemGhostRank; - using Base::m_volume; - using Base::m_porosity; - using Base::m_dPoro_dPres; - using Base::m_dCompFrac_dCompDens; - using Base::m_phaseVolFrac; - using Base::m_dPhaseVolFrac; - using Base::m_phaseDens; - using Base::m_dPhaseDens; - using Base::m_phaseCompFrac; - using Base::m_dPhaseCompFrac; - using Base::m_localMatrix; - using Base::m_localRhs; - - /** - * @brief Constructor - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - ElementBasedAssemblyKernel( localIndex const numPhases, - globalIndex const rankOffset, - string const dofKey, - ElementSubRegionBase const & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > const kernelFlags ) - : Base( numPhases, rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs, kernelFlags ), - m_dPoro_dTemp( solid.getDporosity_dTemperature() ), - m_phaseInternalEnergy( fluid.phaseInternalEnergy() ), - m_dPhaseInternalEnergy( fluid.dPhaseInternalEnergy() ), - m_rockInternalEnergy( solid.getInternalEnergy() ), - m_dRockInternalEnergy_dTemp( solid.getDinternalEnergy_dTemperature() ), - m_energy_n( subRegion.getField< fields::flow::energy_n >() ) - {} - - struct StackVariables : public Base::StackVariables - { -public: - - GEOS_HOST_DEVICE - StackVariables() - : Base::StackVariables() - {} - - using Base::StackVariables::localRow; - using Base::StackVariables::dofIndices; - using Base::StackVariables::localResidual; - using Base::StackVariables::localJacobian; - - // derivative of pore volume wrt temperature - real64 dPoreVolume_dTemp = 0.0; - - // Solid energy - - /// Solid energy at time n+1 - real64 solidEnergy = 0.0; - - /// Derivative of solid internal energy with respect to pressure - real64 dSolidEnergy_dPres = 0.0; - - /// Derivative of solid internal energy with respect to temperature - real64 dSolidEnergy_dTemp = 0.0; - - }; - - /** - * @brief Performs the setup phase for the kernel. - * @param[in] ei the element index - * @param[in] stack the stack variables - */ - GEOS_HOST_DEVICE - void setup( localIndex const ei, - StackVariables & stack ) const - { - Base::setup( ei, stack ); - - // derivative of pore volume wrt temperature - stack.dPoreVolume_dTemp = m_volume[ei] * m_dPoro_dTemp[ei][0]; - - // initialize the solid volume - real64 const solidVolume = m_volume[ei] * ( 1.0 - m_porosity[ei][0] ); - real64 const dSolidVolume_dPres = -m_volume[ei] * m_dPoro_dPres[ei][0]; - real64 const dSolidVolume_dTemp = -stack.dPoreVolume_dTemp; - - // initialize the solid internal energy - stack.solidEnergy = solidVolume * m_rockInternalEnergy[ei][0]; - stack.dSolidEnergy_dPres = dSolidVolume_dPres * m_rockInternalEnergy[ei][0]; - stack.dSolidEnergy_dTemp = solidVolume * m_dRockInternalEnergy_dTemp[ei][0] - + dSolidVolume_dTemp * m_rockInternalEnergy[ei][0]; - } - - /** - * @brief Compute the local accumulation contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void computeAccumulation( localIndex const ei, - StackVariables & stack ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - // start with old time step value - stack.localResidual[numEqn-1] = -m_energy_n[ei]; - - Base::computeAccumulation( ei, stack, [&] ( integer const ip, - real64 const & phaseAmount, - real64 const & dPhaseAmount_dP, - real64 const (&dPhaseAmount_dC)[numComp] ) - { - // We are in the loop over phases, ip provides the current phase index. - // We have to do two things: - // 1- Assemble the derivatives of the component mass balance equations with respect to temperature - // 2- Assemble the phase-dependent part of the accumulation term of the energy equation - - real64 dPhaseInternalEnergy_dC[numComp]{}; - - // construct the slices - arraySlice2d< real64 const, compflow::USD_COMP_DC - 1 > dCompFrac_dCompDens = m_dCompFrac_dCompDens[ei]; - arraySlice1d< real64 const, compflow::USD_PHASE - 1 > phaseVolFrac = m_phaseVolFrac[ei]; - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseDens = m_phaseDens[ei][0]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 2 > phaseCompFrac = m_phaseCompFrac[ei][0]; - arraySlice3d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 2 > dPhaseCompFrac = m_dPhaseCompFrac[ei][0]; - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > phaseInternalEnergy = m_phaseInternalEnergy[ei][0]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > dPhaseInternalEnergy = m_dPhaseInternalEnergy[ei][0]; - - // Step 1: assemble the derivatives of the component mass balance equations with respect to temperature - - real64 const dPhaseAmount_dT = stack.dPoreVolume_dTemp * phaseVolFrac[ip] * phaseDens[ip] - + stack.poreVolume * (dPhaseVolFrac[ip][Deriv::dT] * phaseDens[ip] + phaseVolFrac[ip] * dPhaseDens[ip][Deriv::dT] ); - for( integer ic = 0; ic < numComp; ++ic ) - { - stack.localJacobian[ic][numDof-1] += dPhaseAmount_dT * phaseCompFrac[ip][ic] - + phaseAmount * dPhaseCompFrac[ip][ic][Deriv::dT]; - } - - // Step 2: assemble the phase-dependent part of the accumulation term of the energy equation - - real64 const phaseEnergy = phaseAmount * phaseInternalEnergy[ip]; - real64 const dPhaseEnergy_dP = dPhaseAmount_dP * phaseInternalEnergy[ip] - + phaseAmount * dPhaseInternalEnergy[ip][Deriv::dP]; - real64 const dPhaseEnergy_dT = dPhaseAmount_dT * phaseInternalEnergy[ip] - + phaseAmount * dPhaseInternalEnergy[ip][Deriv::dT]; - - // local accumulation - stack.localResidual[numEqn-1] += phaseEnergy; - - // derivatives w.r.t. pressure and temperature - stack.localJacobian[numEqn-1][0] += dPhaseEnergy_dP; - stack.localJacobian[numEqn-1][numDof-1] += dPhaseEnergy_dT; - - // derivatives w.r.t. component densities - applyChainRule( numComp, dCompFrac_dCompDens, dPhaseInternalEnergy[ip], dPhaseInternalEnergy_dC, Deriv::dC ); - for( integer jc = 0; jc < numComp; ++jc ) - { - stack.localJacobian[numEqn-1][jc + 1] += phaseInternalEnergy[ip] * dPhaseAmount_dC[jc] - + dPhaseInternalEnergy_dC[jc] * phaseAmount; - } - } ); - - // Step 3: assemble the solid part of the accumulation term - - // local accumulation and derivatives w.r.t. pressure and temperature - stack.localResidual[numEqn-1] += stack.solidEnergy; - stack.localJacobian[numEqn-1][0] += stack.dSolidEnergy_dPres; - stack.localJacobian[numEqn-1][numDof-1] += stack.dSolidEnergy_dTemp; - - } - - /** - * @brief Compute the local volume balance contributions to the residual and Jacobian - * @tparam FUNC the type of the function that can be used to customize the kernel - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void computeVolumeBalance( localIndex const ei, - StackVariables & stack ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - Base::computeVolumeBalance( ei, stack, [&] ( real64 const & oneMinusPhaseVolFraction ) - { - GEOS_UNUSED_VAR( oneMinusPhaseVolFraction ); - - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > dPhaseVolFrac = m_dPhaseVolFrac[ei]; - - for( integer ip = 0; ip < m_numPhases; ++ip ) - { - stack.localJacobian[numEqn-2][numDof-1] -= dPhaseVolFrac[ip][Deriv::dT]; - } - } ); - } - - GEOS_HOST_DEVICE - void complete( localIndex const ei, - StackVariables & stack ) const - { - // Step 1: assemble the component mass balance equations and volume balance equations - Base::complete( ei, stack ); - - // Step 2: assemble the energy equation - m_localRhs[stack.localRow + numEqn-1] += stack.localResidual[numEqn-1]; - m_localMatrix.template addToRow< serialAtomic >( stack.localRow + numEqn-1, - stack.dofIndices, - stack.localJacobian[numEqn-1], - numDof ); - } - -protected: - - /// View on derivative of porosity w.r.t temperature - arrayView2d< real64 const > const m_dPoro_dTemp; - - /// Views on phase internal energy - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > m_phaseInternalEnergy; - arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > m_dPhaseInternalEnergy; - - /// Views on rock internal energy - arrayView2d< real64 const > m_rockInternalEnergy; - arrayView2d< real64 const > m_dRockInternalEnergy_dTemp; - - /// Views on energy - arrayView1d< real64 const > m_energy_n; - -}; - -/** - * @class ElementBasedAssemblyKernelFactory - */ -class ElementBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] numComps the number of fluid components - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY > - static void - createAndLaunch( localIndex const numComps, - localIndex const numPhases, - globalIndex const rankOffset, - integer const useTotalMassEquation, - string const dofKey, - ElementSubRegionBase const & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - isothermalCompositionalMultiphaseBaseKernels:: - internal::kernelLaunchSelectorCompSwitch( numComps, [&] ( auto NC ) - { - localIndex constexpr NUM_COMP = NC(); - localIndex constexpr NUM_DOF = NC()+2; - - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; - if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); - - ElementBasedAssemblyKernel< NUM_COMP, NUM_DOF > - kernel( numPhases, rankOffset, dofKey, subRegion, fluid, solid, localMatrix, localRhs, kernelFlags ); - ElementBasedAssemblyKernel< NUM_COMP, NUM_DOF >::template - launch< POLICY, ElementBasedAssemblyKernel< NUM_COMP, NUM_DOF > >( subRegion.size(), kernel ); - } ); - } - -}; - -/******************************** FluidUpdateKernel ********************************/ - -struct FluidUpdateKernel -{ - template< typename POLICY, typename FLUID_WRAPPER > - static void - launch( localIndex const size, - FLUID_WRAPPER const & fluidWrapper, - arrayView1d< real64 const > const & pres, - arrayView1d< real64 const > const & temp, - arrayView2d< real64 const, compflow::USD_COMP > const & compFrac ) - { - forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - for( localIndex q = 0; q < fluidWrapper.numGauss(); ++q ) - { - fluidWrapper.update( k, q, pres[k], temp[k], compFrac[k] ); - } - } ); - } - - template< typename POLICY, typename FLUID_WRAPPER > - static void - launch( SortedArrayView< localIndex const > const & targetSet, - FLUID_WRAPPER const & fluidWrapper, - arrayView1d< real64 const > const & pres, - arrayView1d< real64 const > const & temp, - arrayView2d< real64 const, compflow::USD_COMP > const & compFrac ) - { - forAll< POLICY >( targetSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const a ) - { - localIndex const k = targetSet[a]; - for( localIndex q = 0; q < fluidWrapper.numGauss(); ++q ) - { - fluidWrapper.update( k, q, pres[k], temp[k], compFrac[k] ); - } - } ); - } -}; - -/******************************** SolidInternalEnergyUpdateKernel ********************************/ - -struct SolidInternalEnergyUpdateKernel -{ - - template< typename POLICY, typename SOLID_INTERNAL_ENERGY_WRAPPER > - static void - launch( localIndex const size, - SOLID_INTERNAL_ENERGY_WRAPPER const & solidInternalEnergyWrapper, - arrayView1d< real64 const > const & temp ) - { - forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - solidInternalEnergyWrapper.update( k, temp[k] ); - } ); - } -}; - -/******************************** ScalingForSystemSolutionKernel ********************************/ - -/** - * @class ScalingForSystemSolutionKernel - * @brief Define the kernel for scaling the Newton update - */ -class ScalingForSystemSolutionKernel : public isothermalCompositionalMultiphaseBaseKernels::ScalingForSystemSolutionKernel -{ -public: - - using Base = isothermalCompositionalMultiphaseBaseKernels::ScalingForSystemSolutionKernel; - using Base::m_numComp; - using Base::m_localSolution; - - /** - * @brief Create a new kernel instance - * @param[in] maxRelativePresChange the max allowed relative pressure change - * @param[in] maxAbsolutePresChange the max allowed absolute pressure change - * @param[in] maxRelativeTempChange the max allowed relative temperature change - * @param[in] maxCompFracChange the max allowed comp fraction change - * @param[in] maxRelativeCompDensChange the max allowed comp density change - * @param[in] rankOffset the rank offset - * @param[in] numComp the number of components - * @param[in] dofKey the dof key to get dof numbers - * @param[in] subRegion the subRegion - * @param[in] localSolution the Newton update - * @param[in] pressure the pressure vector - * @param[in] temperature the temperature vector - * @param[in] compDens the component density vector - * @param[in] pressureScalingFactor the pressure local scaling factor - * @param[in] compDensScalingFactor the component density local scaling factor - * @param[in] temperatureFactor the temperature local scaling factor - */ - ScalingForSystemSolutionKernel( real64 const maxRelativePresChange, - real64 const maxAbsolutePresChange, - real64 const maxRelativeTempChange, - real64 const maxCompFracChange, - real64 const maxRelativeCompDensChange, - globalIndex const rankOffset, - integer const numComp, - string const dofKey, - ElementSubRegionBase const & subRegion, - arrayView1d< real64 const > const localSolution, - arrayView1d< real64 const > const pressure, - arrayView1d< real64 const > const temperature, - arrayView2d< real64 const, compflow::USD_COMP > const compDens, - arrayView1d< real64 > pressureScalingFactor, - arrayView1d< real64 > compDensScalingFactor, - arrayView1d< real64 > temperatureScalingFactor, - integer const temperatureOffset ) - : Base( maxRelativePresChange, - maxAbsolutePresChange, - maxCompFracChange, - maxRelativeCompDensChange, - rankOffset, - numComp, - dofKey, - subRegion, - localSolution, - pressure, - compDens, - pressureScalingFactor, - compDensScalingFactor ), - m_maxRelativeTempChange( maxRelativeTempChange ), - m_temperature( temperature ), - m_temperatureScalingFactor( temperatureScalingFactor ), - m_temperatureOffset( temperatureOffset ) - {} - - /** - * @brief Compute the local value - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void compute( localIndex const ei, - StackVariables & stack ) const - { - computeScalingFactor( ei, stack ); - } - - /** - * @brief Compute the local value of the scaling factor - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void computeScalingFactor( localIndex const ei, - StackVariables & stack ) const - { - real64 constexpr eps = isothermalCompositionalMultiphaseBaseKernels::minDensForDivision; - Base::computeScalingFactor( ei, stack, [&] () - { - // compute the change in temperature - real64 const temp = m_temperature[ei]; - real64 const absTempChange = LvArray::math::abs( m_localSolution[stack.localRow + m_temperatureOffset] ); - if( stack.localMaxDeltaTemp < absTempChange ) - { - stack.localMaxDeltaTemp = absTempChange; - } - - m_temperatureScalingFactor[ei] = 1.0; - - if( temp > eps ) - { - real64 const relativeTempChange = absTempChange / temp; - if( relativeTempChange > m_maxRelativeTempChange ) - { - real64 const tempScalingFactor = m_maxRelativeTempChange / relativeTempChange; - m_temperatureScalingFactor[ei] = tempScalingFactor; - if( stack.localMinVal > tempScalingFactor ) - { - stack.localMinVal = tempScalingFactor; - } - if( stack.localMinTempScalingFactor > tempScalingFactor ) - { - stack.localMinTempScalingFactor = tempScalingFactor; - } - } - } - } ); - } - -protected: - - /// Max allowed changes in primary variables - real64 const m_maxRelativeTempChange; - - /// View on the primary variables - arrayView1d< real64 const > const m_temperature; - - /// View on the scaling factor - arrayView1d< real64 > const m_temperatureScalingFactor; - - /// Temperature offset in solution array - integer const m_temperatureOffset; - -}; - -/** - * @class ScalingForSystemSolutionKernelFactory - */ - -class ScalingForSystemSolutionKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] maxRelativePresChange the max allowed relative pressure change - * @param[in] maxAbsolutePresChange the max allowed absolute pressure change - * @param[in] maxRelativeTempChange the max allowed relative temperature change - * @param[in] maxCompFracChange the max allowed comp fraction change - * @param[in] maxRelativeCompdensChange the max allowed relative component density change - * @param[in] rankOffset the rank offset - * @param[in] numComp the number of components - * @param[in] dofKey the dof key to get dof numbers - * @param[in] subRegion the subRegion - * @param[in] localSolution the Newton update - */ - template< typename POLICY > - static ScalingForSystemSolutionKernel::StackVariables - createAndLaunch( real64 const maxRelativePresChange, - real64 const maxAbsolutePresChange, - real64 const maxRelativeTempChange, - real64 const maxCompFracChange, - real64 const maxRelativeCompDensChange, - arrayView1d< real64 const > const pressure, - arrayView1d< real64 const > const temperature, - arrayView2d< real64 const, compflow::USD_COMP > const compDens, - arrayView1d< real64 > pressureScalingFactor, - arrayView1d< real64 > compDensScalingFactor, - arrayView1d< real64 > temperatureScalingFactor, - - - globalIndex const rankOffset, - integer const numComp, - string const dofKey, - ElementSubRegionBase & subRegion, - arrayView1d< real64 const > const localSolution, - integer const temperatureOffset ) - { - - ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxRelativeTempChange, - maxCompFracChange, maxRelativeCompDensChange, - rankOffset, numComp, dofKey, subRegion, localSolution, - pressure, temperature, compDens, pressureScalingFactor, - compDensScalingFactor, temperatureScalingFactor, temperatureOffset ); - return thermalCompositionalMultiphaseBaseKernels:: - ScalingForSystemSolutionKernel::launch< POLICY >( subRegion.size(), kernel ); - } - -}; - -/******************************** SolutionCheckKernel ********************************/ - -/** - * @class SolutionCheckKernel - * @brief Define the kernel for checking the updated solution - */ -class SolutionCheckKernel : public isothermalCompositionalMultiphaseBaseKernels::SolutionCheckKernel -{ -public: - - using Base = isothermalCompositionalMultiphaseBaseKernels::SolutionCheckKernel; - using Base::m_numComp; - using Base::m_localSolution; - using Base::m_scalingFactor; - - static real64 constexpr minTemperature = constants::zeroDegreesCelsiusInKelvin; - - /** - * @brief Create a new kernel instance - * @param[in] allowCompDensChopping flag to allow the component density chopping - * @param[in] scalingFactor the scaling factor - * @param[in] rankOffset the rank offset - * @param[in] numComp the number of components - * @param[in] dofKey the dof key to get dof numbers - * @param[in] subRegion the subRegion - * @param[in] localSolution the Newton update - * @param[in] pressure the pressure vector - * @param[in] temperature the temperature vector - * @param[in] compDens the component density vector - */ - SolutionCheckKernel( integer const allowCompDensChopping, - integer const allowNegativePressure, - CompositionalMultiphaseFVM::ScalingType const scalingType, - real64 const scalingFactor, - arrayView1d< real64 const > const pressure, - arrayView1d< real64 const > const temperature, - arrayView2d< real64 const, compflow::USD_COMP > const compDens, - arrayView1d< real64 > pressureScalingFactor, - arrayView1d< real64 > compDensScalingFactor, - arrayView1d< real64 > temperatureScalingFactor, - globalIndex const rankOffset, - integer const numComp, - string const dofKey, - ElementSubRegionBase const & subRegion, - arrayView1d< real64 const > const localSolution, - - integer const temperatureOffset ) - : Base( allowCompDensChopping, - allowNegativePressure, - scalingType, - scalingFactor, - - pressure, - compDens, - pressureScalingFactor, - compDensScalingFactor, - rankOffset, - numComp, - dofKey, - subRegion, - localSolution ), - m_temperature( temperature ), - m_temperatureScalingFactor( temperatureScalingFactor ), - m_temperatureOffset( temperatureOffset ) - {} - - /** - * @brief Compute the local value of the solution check - * @param[in] ei the element index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void computeSolutionCheck( localIndex const ei, - StackVariables & stack ) const - { - Base::computeSolutionCheck( ei, stack, [&] () - { - bool const localScaling = m_scalingType == CompositionalMultiphaseFVM::ScalingType::Local; - // compute the change in temperature - real64 const newTemp = m_temperature[ei] + (localScaling ? m_temperatureScalingFactor[ei] : m_scalingFactor * m_localSolution[stack.localRow + m_temperatureOffset]); - if( newTemp < minTemperature ) - { - stack.localMinVal = 0; - } - } ); - } - -protected: - - /// View on the primary variables - arrayView1d< real64 const > const m_temperature; - - /// View on the scaling factor - arrayView1d< real64 const > const m_temperatureScalingFactor; - - /// Offset to temperature variable - integer m_temperatureOffset; - -}; - -/** - * @class SolutionCheckKernelFactory - */ -class SolutionCheckKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] maxRelativePresChange the max allowed relative pressure change - * @param[in] maxRelativeTempChange the max allowed relative temperature change - * @param[in] maxCompFracChange the max allowed comp fraction change - * @param[in] rankOffset the rank offset - * @param[in] numComp the number of components - * @param[in] dofKey the dof key to get dof numbers - * @param[in] subRegion the subRegion - * @param[in] localSolution the Newton update - */ - template< typename POLICY > - static SolutionCheckKernel::StackVariables - createAndLaunch( integer const allowCompDensChopping, - integer const allowNegativePressure, - CompositionalMultiphaseFVM::ScalingType const scalingType, - real64 const scalingFactor, - arrayView1d< real64 const > const pressure, - arrayView1d< real64 const > const temperature, - arrayView2d< real64 const, compflow::USD_COMP > const compDens, - arrayView1d< real64 > pressureScalingFactor, - arrayView1d< real64 > temperatureScalingFactor, - arrayView1d< real64 > compDensScalingFactor, - - - - globalIndex const rankOffset, - integer const numComp, - string const dofKey, - ElementSubRegionBase & subRegion, - arrayView1d< real64 const > const localSolution, - integer temperatureOffset ) - { - - SolutionCheckKernel kernel( allowCompDensChopping, allowNegativePressure, scalingType, scalingFactor, - pressure, temperature, compDens, pressureScalingFactor, compDensScalingFactor, temperatureScalingFactor, - rankOffset, numComp, dofKey, subRegion, localSolution, - temperatureOffset ); - return SolutionCheckKernel::launch< POLICY >( subRegion.size(), kernel ); - } - -}; - - -/******************************** ResidualNormKernel ********************************/ - -/** - * @class ResidualNormKernel - */ -class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 3 > -{ -public: - - using Base = ResidualNormKernelBase< 3 >; - using Base::m_minNormalizer; - using Base::m_rankOffset; - using Base::m_localResidual; - using Base::m_dofNumber; - - ResidualNormKernel( globalIndex const rankOffset, - arrayView1d< real64 const > const & localResidual, - arrayView1d< globalIndex const > const & dofNumber, - arrayView1d< localIndex const > const & ghostRank, - integer const numComponents, - integer const numPhases, - ElementSubRegionBase const & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - constitutive::SolidInternalEnergy const & solidInternalEnergy, - real64 const minNormalizer ) - : Base( rankOffset, - localResidual, - dofNumber, - ghostRank, - minNormalizer ), - m_numComponents( numComponents ), - m_numPhases( numPhases ), - m_volume( subRegion.getElementVolume() ), - m_porosity_n( solid.getPorosity_n() ), - m_phaseVolFrac_n( subRegion.getField< fields::flow::phaseVolumeFraction_n >() ), - m_totalDens_n( fluid.totalDensity_n() ), - m_phaseDens_n( fluid.phaseDensity_n() ), - m_phaseInternalEnergy_n( fluid.phaseInternalEnergy_n() ), - m_solidInternalEnergy_n( solidInternalEnergy.getInternalEnergy_n() ) - {} - - GEOS_HOST_DEVICE - void computeMassEnergyNormalizers( localIndex const ei, - real64 & massNormalizer, - real64 & energyNormalizer ) const - { - massNormalizer = LvArray::math::max( m_minNormalizer, m_totalDens_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ); - real64 const poreVolume = m_porosity_n[ei][0] * m_volume[ei]; - energyNormalizer = m_solidInternalEnergy_n[ei][0] * ( 1.0 - m_porosity_n[ei][0] ) * m_volume[ei]; - for( integer ip = 0; ip < m_numPhases; ++ip ) - { - energyNormalizer += m_phaseInternalEnergy_n[ei][0][ip] * m_phaseDens_n[ei][0][ip] * m_phaseVolFrac_n[ei][ip] * poreVolume; - } - // warning: internal energy can be negative - energyNormalizer = LvArray::math::max( m_minNormalizer, LvArray::math::abs( energyNormalizer ) ); - } - - GEOS_HOST_DEVICE - virtual void computeLinf( localIndex const ei, - LinfStackVariables & stack ) const override - { - real64 massNormalizer = 0.0, energyNormalizer = 0.0; - computeMassEnergyNormalizers( ei, massNormalizer, energyNormalizer ); - real64 const volumeNormalizer = LvArray::math::max( m_minNormalizer, m_porosity_n[ei][0] * m_volume[ei] ); - - // step 1: mass residual - - for( integer idof = 0; idof < m_numComponents; ++idof ) - { - real64 const valMass = LvArray::math::abs( m_localResidual[stack.localRow + idof] ) / massNormalizer; - if( valMass > stack.localValue[0] ) - { - stack.localValue[0] = valMass; - } - } - - // step 2: volume residual - - real64 const valVol = LvArray::math::abs( m_localResidual[stack.localRow + m_numComponents] ) / volumeNormalizer; - if( valVol > stack.localValue[1] ) - { - stack.localValue[1] = valVol; - } - - // step 3: energy residual - - real64 const valEnergy = LvArray::math::abs( m_localResidual[stack.localRow + m_numComponents + 1] ) / energyNormalizer; - if( valEnergy > stack.localValue[2] ) - { - stack.localValue[2] = valEnergy; - } - } - - GEOS_HOST_DEVICE - virtual void computeL2( localIndex const ei, - L2StackVariables & stack ) const override - { - // note: for the L2 norm, we bundle the volume and mass residuals/normalizers - real64 massNormalizer = 0.0, energyNormalizer = 0.0; - computeMassEnergyNormalizers( ei, massNormalizer, energyNormalizer ); - - // step 1: mass residual - - for( integer idof = 0; idof < m_numComponents; ++idof ) - { - stack.localValue[0] += m_localResidual[stack.localRow + idof] * m_localResidual[stack.localRow + idof]; - stack.localNormalizer[0] += massNormalizer; - } - - // step 2: volume residual - - real64 const valVol = m_localResidual[stack.localRow + m_numComponents] * m_totalDens_n[ei][0]; // we need a mass here, hence the - // multiplication - stack.localValue[1] += valVol * valVol; - stack.localNormalizer[1] += massNormalizer; - - // step 3: energy residual - - stack.localValue[2] += m_localResidual[stack.localRow + m_numComponents + 1] * m_localResidual[stack.localRow + m_numComponents + 1]; - stack.localNormalizer[2] += energyNormalizer; - } - -protected: - - /// Number of fluid components - integer const m_numComponents; - - /// Number of fluid phases - integer const m_numPhases; - - /// View on the volume - arrayView1d< real64 const > const m_volume; - - /// View on porosity at the previous converged time step - arrayView2d< real64 const > const m_porosity_n; - - /// View on phase properties at the previous converged time step - arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFrac_n; - arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > const m_totalDens_n; - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseDens_n; - arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseInternalEnergy_n; - - /// View on solid properties at the previous converged time step - arrayView2d< real64 const > const m_solidInternalEnergy_n; - -}; - -/** - * @class ResidualNormKernelFactory - */ -class ResidualNormKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] normType the type of norm used (Linf or L2) - * @param[in] numComps the number of fluid components - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey the string key to retrieve the degress of freedom numbers - * @param[in] localResidual the residual vector on my MPI rank - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] solid the solid model - * @param[in] solidInternalEnergy the solid internal energy model - * @param[out] residualNorm the residual norm on the subRegion - * @param[out] residualNormalizer the residual normalizer on the subRegion - */ - template< typename POLICY > - static void - createAndLaunch( physicsSolverBaseKernels::NormType const normType, - integer const numComps, - integer const numPhases, - globalIndex const rankOffset, - string const & dofKey, - arrayView1d< real64 const > const & localResidual, - ElementSubRegionBase const & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::CoupledSolidBase const & solid, - constitutive::SolidInternalEnergy const & solidInternalEnergy, - real64 const minNormalizer, - real64 (& residualNorm)[3], - real64 (& residualNormalizer)[3] ) - { - arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); - arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); - - ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, - numComps, numPhases, subRegion, fluid, solid, solidInternalEnergy, minNormalizer ); - if( normType == physicsSolverBaseKernels::NormType::Linf ) - { - ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); - } - else // L2 norm - { - ResidualNormKernel::launchL2< POLICY >( subRegion.size(), kernel, residualNorm, residualNormalizer ); - } - - } -}; - - -} // namespace thermalCompositionalMultiphaseBaseKernels - -} // namespace geos - - -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEBASEKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseFVMKernels.hpp deleted file mode 100644 index bec2c3217c4..00000000000 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseFVMKernels.hpp +++ /dev/null @@ -1,1444 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * 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 ThermalCompositionalMultiphaseFVMKernels.hpp - */ - -#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP -#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP - -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseFVMKernels.hpp" - -#include "constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp" -#include "constitutive/thermalConductivity/ThermalConductivityFields.hpp" -#include "constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp" - -namespace geos -{ - -namespace thermalCompositionalMultiphaseFVMKernels -{ - -/******************************** PhaseMobilityKernel ********************************/ - -/** - * @class PhaseMobilityKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_PHASE number of fluid phases - * @brief Define the interface for the property kernel in charge of computing the phase mobilities - */ -template< integer NUM_COMP, integer NUM_PHASE > -class PhaseMobilityKernel : public isothermalCompositionalMultiphaseFVMKernels::PhaseMobilityKernel< NUM_COMP, NUM_PHASE > -{ -public: - - using Base = isothermalCompositionalMultiphaseFVMKernels::PhaseMobilityKernel< NUM_COMP, NUM_PHASE >; - using Base::numPhase; - using Base::m_dPhaseVolFrac; - using Base::m_phaseDens; - using Base::m_dPhaseDens; - using Base::m_phaseVisc; - using Base::m_dPhaseVisc; - using Base::m_dPhaseRelPerm_dPhaseVolFrac; - - /** - * @brief Constructor - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] relperm the relperm model - */ - PhaseMobilityKernel( ObjectManagerBase & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::RelativePermeabilityBase const & relperm ) - : Base( subRegion, fluid, relperm ) - {} - - /** - * @brief Compute the phase mobilities in an element - * @param[in] ei the element index - */ - GEOS_HOST_DEVICE - inline - void compute( localIndex const ei ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseVisc = m_phaseVisc[ei][0]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseVisc = m_dPhaseVisc[ei][0]; - arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > const dPhaseRelPerm_dPhaseVolFrac = m_dPhaseRelPerm_dPhaseVolFrac[ei][0]; - arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; - - Base::compute( ei, [&] ( localIndex const ip, - real64 const & phaseMob, - arraySlice1d< real64, compflow::USD_PHASE_DC - 2 > const & dPhaseMob ) - { - // Step 1: compute the derivative of relPerm[ip] wrt temperature - real64 dRelPerm_dT = 0.0; - for( integer jp = 0; jp < numPhase; ++jp ) - { - dRelPerm_dT += dPhaseRelPerm_dPhaseVolFrac[ip][jp] * dPhaseVolFrac[jp][Deriv::dT]; - } - - // Step 2: compute the derivative of phaseMob[ip] wrt temperature - dPhaseMob[Deriv::dT] = dRelPerm_dT * phaseDens[ip] / phaseVisc[ip] - + phaseMob * (dPhaseDens[ip][Deriv::dT] / phaseDens[ip] - dPhaseVisc[ip][Deriv::dT] / phaseVisc[ip] ); - } ); - } - -}; - -/** - * @class PhaseMobilityKernelFactory - */ -class PhaseMobilityKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @param[in] numComp the number of fluid components - * @param[in] numPhase the number of fluid phases - * @param[in] subRegion the element subregion - * @param[in] fluid the fluid model - * @param[in] relperm the relperm model - */ - template< typename POLICY > - static void - createAndLaunch( integer const numComp, - integer const numPhase, - ObjectManagerBase & subRegion, - constitutive::MultiFluidBase const & fluid, - constitutive::RelativePermeabilityBase const & relperm ) - { - if( numPhase == 2 ) - { - isothermalCompositionalMultiphaseBaseKernels:: - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - integer constexpr NUM_COMP = NC(); - PhaseMobilityKernel< NUM_COMP, 2 > kernel( subRegion, fluid, relperm ); - PhaseMobilityKernel< NUM_COMP, 2 >::template launch< POLICY >( subRegion.size(), kernel ); - } ); - } - else if( numPhase == 3 ) - { - isothermalCompositionalMultiphaseBaseKernels:: - internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) - { - integer constexpr NUM_COMP = NC(); - PhaseMobilityKernel< NUM_COMP, 3 > kernel( subRegion, fluid, relperm ); - PhaseMobilityKernel< NUM_COMP, 3 >::template launch< POLICY >( subRegion.size(), kernel ); - } ); - } - } -}; - - -/******************************** FaceBasedAssemblyKernel ********************************/ - -/** - * @class FaceBasedAssemblyKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_DOF number of degrees of freedom - * @tparam STENCILWRAPPER the type of the stencil wrapper - * @brief Define the interface for the assembly kernel in charge of flux terms - */ -template< integer NUM_COMP, integer NUM_DOF, typename STENCILWRAPPER > -class FaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER > -{ -public: - - /** - * @brief The type for element-based data. Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewConstAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelBase; - using DofNumberAccessor = AbstractBase::DofNumberAccessor; - using CompFlowAccessors = AbstractBase::CompFlowAccessors; - using MultiFluidAccessors = AbstractBase::MultiFluidAccessors; - using CapPressureAccessors = AbstractBase::CapPressureAccessors; - using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; - - using AbstractBase::m_dt; - using AbstractBase::m_numPhases; - using AbstractBase::m_gravCoef; - using AbstractBase::m_phaseVolFrac; - using AbstractBase::m_dPhaseVolFrac; - using AbstractBase::m_phaseCompFrac; - using AbstractBase::m_dPhaseCompFrac; - using AbstractBase::m_dCompFrac_dCompDens; - - using Base = isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; - using Base::numComp; - using Base::numDof; - using Base::numEqn; - using Base::maxNumConns; - using Base::numFluxSupportPoints; - using Base::m_phaseMob; - using Base::m_dPhaseMob; - using Base::m_dPhaseMassDens; - using Base::m_dPhaseCapPressure_dPhaseVolFrac; - using Base::m_stencilWrapper; - using Base::m_seri; - using Base::m_sesri; - using Base::m_sei; - - using ThermalCompFlowAccessors = - StencilAccessors< fields::flow::temperature >; - - using ThermalMultiFluidAccessors = - StencilMaterialAccessors< constitutive::MultiFluidBase, - fields::multifluid::phaseEnthalpy, - fields::multifluid::dPhaseEnthalpy >; - - using ThermalConductivityAccessors = - StencilMaterialAccessors< constitutive::MultiPhaseThermalConductivityBase, - fields::thermalconductivity::effectiveConductivity >; - // for now, we treat thermal conductivity explicitly - - /** - * @brief Constructor for the kernel interface - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] dofNumberAccessor accessor for the dofs numbers - * @param[in] compFlowAccessor accessor for wrappers registered by the solver - * @param[in] thermalCompFlowAccessors accessor for *thermal* wrappers registered by the solver - * @param[in] multiFluidAccessor accessor for wrappers registered by the multifluid model - * @param[in] thermalMultiFluidAccessors accessor for *thermal* wrappers registered by the multifluid model - * @param[in] capPressureAccessors accessor for wrappers registered by the cap pressure model - * @param[in] permeabilityAccessors accessor for wrappers registered by the permeability model - * @param[in] thermalConductivityAccessors accessor for wrappers registered by the thermal conductivity model - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - * @param[in] kernelFlags flags packed all together - */ - FaceBasedAssemblyKernel( integer const numPhases, - globalIndex const rankOffset, - STENCILWRAPPER const & stencilWrapper, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - ThermalCompFlowAccessors const & thermalCompFlowAccessors, - MultiFluidAccessors const & multiFluidAccessors, - ThermalMultiFluidAccessors const & thermalMultiFluidAccessors, - CapPressureAccessors const & capPressureAccessors, - PermeabilityAccessors const & permeabilityAccessors, - ThermalConductivityAccessors const & thermalConductivityAccessors, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags ) - : Base( numPhases, - rankOffset, - stencilWrapper, - dofNumberAccessor, - compFlowAccessors, - multiFluidAccessors, - capPressureAccessors, - permeabilityAccessors, - dt, - localMatrix, - localRhs, - kernelFlags ), - m_temp( thermalCompFlowAccessors.get( fields::flow::temperature {} ) ), - m_phaseEnthalpy( thermalMultiFluidAccessors.get( fields::multifluid::phaseEnthalpy {} ) ), - m_dPhaseEnthalpy( thermalMultiFluidAccessors.get( fields::multifluid::dPhaseEnthalpy {} ) ), - m_thermalConductivity( thermalConductivityAccessors.get( fields::thermalconductivity::effectiveConductivity {} ) ) - {} - - struct StackVariables : public Base::StackVariables - { -public: - - GEOS_HOST_DEVICE - StackVariables( localIndex const size, localIndex numElems ) - : Base::StackVariables( size, numElems ) - {} - - using Base::StackVariables::stencilSize; - using Base::StackVariables::numConnectedElems; - using Base::StackVariables::transmissibility; - using Base::StackVariables::dTrans_dPres; - using Base::StackVariables::dofColIndices; - using Base::StackVariables::localFlux; - using Base::StackVariables::localFluxJacobian; - - // Thermal transmissibility (for now, no derivatives) - - real64 thermalTransmissibility[maxNumConns][2]{}; - }; - - /** - * @brief Compute the local flux contributions to the residual and Jacobian - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - inline - void computeFlux( localIndex const iconn, - StackVariables & stack ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - // *********************************************** - // First, we call the base computeFlux to compute: - // 1) compFlux and its derivatives (including derivatives wrt temperature), - // 2) enthalpy part of convectiveEnergyFlux and its derivatives (including derivatives wrt temperature) - // - // Computing dCompFlux_dT and the enthalpy flux requires quantities already computed in the base computeFlux, - // such as potGrad, phaseFlux, and the indices of the upwind cell - // We use the lambda below (called **inside** the phase loop of the base computeFlux) to access these variables - Base::computeFlux( iconn, stack, [&] ( integer const ip, - localIndex const (&k)[2], - localIndex const (&seri)[2], - localIndex const (&sesri)[2], - localIndex const (&sei)[2], - localIndex const connectionIndex, - localIndex const k_up, - localIndex const er_up, - localIndex const esr_up, - localIndex const ei_up, - real64 const potGrad, - real64 const phaseFlux, - real64 const (&dPhaseFlux_dP)[2], - real64 const (&dPhaseFlux_dC)[2][numComp] ) - { - // We are in the loop over phases, ip provides the current phase index. - - // Step 1: compute the derivatives of the mean density at the interface wrt temperature - - real64 dDensMean_dT[numFluxSupportPoints]{}; - - real64 const trans[numFluxSupportPoints] = { stack.transmissibility[connectionIndex][0], - stack.transmissibility[connectionIndex][1] }; - - real64 convectiveEnergyFlux = 0.0; - real64 dConvectiveEnergyFlux_dP[numFluxSupportPoints]{}; - real64 dConvectiveEnergyFlux_dT[numFluxSupportPoints]{}; - real64 dConvectiveEnergyFlux_dC[numFluxSupportPoints][numComp]{}; - real64 dCompFlux_dT[numFluxSupportPoints][numComp]{}; - - integer denom = 0; - for( integer i = 0; i < numFluxSupportPoints; ++i ) - { - localIndex const er = seri[i]; - localIndex const esr = sesri[i]; - localIndex const ei = sei[i]; - - bool const phaseExists = (m_phaseVolFrac[er_up][esr_up][ei_up][ip] > 0); - if( !phaseExists ) - { - continue; - } - - dDensMean_dT[i] = 0.5 * m_dPhaseMassDens[er][esr][ei][0][ip][Deriv::dT]; - denom++; - } - if( denom > 1 ) - { - for( integer i = 0; i < numFluxSupportPoints; ++i ) - { - dDensMean_dT[i] /= denom; - } - } - - // Step 2: compute the derivatives of the phase potential difference wrt temperature - //***** calculation of flux ***** - - real64 dPresGrad_dT[numFluxSupportPoints]{}; - real64 dGravHead_dT[numFluxSupportPoints]{}; - - // compute potential difference MPFA-style - for( integer i = 0; i < numFluxSupportPoints; ++i ) - { - localIndex const er = seri[i]; - localIndex const esr = sesri[i]; - localIndex const ei = sei[i]; - - // Step 2.1: compute derivative of capillary pressure wrt temperature - real64 dCapPressure_dT = 0.0; - if( AbstractBase::m_kernelFlags.isSet( isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags::CapPressure ) ) - { - for( integer jp = 0; jp < m_numPhases; ++jp ) - { - real64 const dCapPressure_dS = m_dPhaseCapPressure_dPhaseVolFrac[er][esr][ei][0][ip][jp]; - dCapPressure_dT += dCapPressure_dS * m_dPhaseVolFrac[er][esr][ei][jp][Deriv::dT]; - } - } - - // Step 2.2: compute derivative of phase pressure difference wrt temperature - dPresGrad_dT[i] -= trans[i] * dCapPressure_dT; - real64 const gravD = trans[i] * m_gravCoef[er][esr][ei]; - - // Step 2.3: compute derivative of gravity potential difference wrt temperature - for( integer j = 0; j < numFluxSupportPoints; ++j ) - { - dGravHead_dT[j] += dDensMean_dT[j] * gravD; - } - } - - // Step 3: compute the derivatives of the (upwinded) compFlux wrt temperature - // *** upwinding *** - - // note: the upwinding is done in the base class, which is in charge of - // computing the following quantities: potGrad, phaseFlux, k_up, er_up, esr_up, ei_up - - real64 dPhaseFlux_dT[numFluxSupportPoints]{}; - - // Step 3.1: compute the derivative of phase flux wrt temperature - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - dPhaseFlux_dT[ke] += dPresGrad_dT[ke]; - } - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - dPhaseFlux_dT[ke] -= dGravHead_dT[ke]; - } - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - dPhaseFlux_dT[ke] *= m_phaseMob[er_up][esr_up][ei_up][ip]; - } - dPhaseFlux_dT[k_up] += m_dPhaseMob[er_up][esr_up][ei_up][ip][Deriv::dT] * potGrad; - - // Step 3.2: compute the derivative of component flux wrt temperature - - // slice some constitutive arrays to avoid too much indexing in component loop - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 3 > phaseCompFracSub = - m_phaseCompFrac[er_up][esr_up][ei_up][0][ip]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 3 > dPhaseCompFracSub = - m_dPhaseCompFrac[er_up][esr_up][ei_up][0][ip]; - - for( integer ic = 0; ic < numComp; ++ic ) - { - real64 const ycp = phaseCompFracSub[ic]; - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - dCompFlux_dT[ke][ic] += dPhaseFlux_dT[ke] * ycp; - } - dCompFlux_dT[k_up][ic] += phaseFlux * dPhaseCompFracSub[ic][Deriv::dT]; - } - - // Step 4: add dCompFlux_dTemp to localFluxJacobian - for( integer ic = 0; ic < numComp; ++ic ) - { - integer const eqIndex0 = k[0]* numEqn + ic; - integer const eqIndex1 = k[1]* numEqn + ic; - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - integer const localDofIndexTemp = k[ke] * numDof + numDof - 1; - stack.localFluxJacobian[eqIndex0][localDofIndexTemp] += m_dt * dCompFlux_dT[ke][ic]; - stack.localFluxJacobian[eqIndex1][localDofIndexTemp] -= m_dt * dCompFlux_dT[ke][ic]; - } - } - - // Step 5: compute the enthalpy flux - real64 const enthalpy = m_phaseEnthalpy[er_up][esr_up][ei_up][0][ip]; - convectiveEnergyFlux += phaseFlux * enthalpy; - - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - dConvectiveEnergyFlux_dP[ke] += dPhaseFlux_dP[ke] * enthalpy; - dConvectiveEnergyFlux_dT[ke] += dPhaseFlux_dT[ke] * enthalpy; - - for( integer jc = 0; jc < numComp; ++jc ) - { - dConvectiveEnergyFlux_dC[ke][jc] += dPhaseFlux_dC[ke][jc] * enthalpy; - } - } - - dConvectiveEnergyFlux_dP[k_up] += phaseFlux * m_dPhaseEnthalpy[er_up][esr_up][ei_up][0][ip][Deriv::dP]; - dConvectiveEnergyFlux_dT[k_up] += phaseFlux * m_dPhaseEnthalpy[er_up][esr_up][ei_up][0][ip][Deriv::dT]; - - real64 dProp_dC[numComp]{}; - applyChainRule( numComp, - m_dCompFrac_dCompDens[er_up][esr_up][ei_up], - m_dPhaseEnthalpy[er_up][esr_up][ei_up][0][ip], - dProp_dC, - Deriv::dC ); - for( integer jc = 0; jc < numComp; ++jc ) - { - dConvectiveEnergyFlux_dC[k_up][jc] += phaseFlux * dProp_dC[jc]; - } - - // Step 6: add convectiveFlux and its derivatives to localFlux and localFluxJacobian - integer const localRowIndexEnergy0 = k[0] * numEqn + numEqn - 1; - integer const localRowIndexEnergy1 = k[1] * numEqn + numEqn - 1; - stack.localFlux[localRowIndexEnergy0] += m_dt * convectiveEnergyFlux; - stack.localFlux[localRowIndexEnergy1] -= m_dt * convectiveEnergyFlux; - - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - integer const localDofIndexPres = k[ke] * numDof; - stack.localFluxJacobian[localRowIndexEnergy0][localDofIndexPres] += m_dt * dConvectiveEnergyFlux_dP[ke]; - stack.localFluxJacobian[localRowIndexEnergy1][localDofIndexPres] -= m_dt * dConvectiveEnergyFlux_dP[ke]; - integer const localDofIndexTemp = localDofIndexPres + numDof - 1; - stack.localFluxJacobian[localRowIndexEnergy0][localDofIndexTemp] += m_dt * dConvectiveEnergyFlux_dT[ke]; - stack.localFluxJacobian[localRowIndexEnergy1][localDofIndexTemp] -= m_dt * dConvectiveEnergyFlux_dT[ke]; - - for( integer jc = 0; jc < numComp; ++jc ) - { - integer const localDofIndexComp = localDofIndexPres + jc + 1; - stack.localFluxJacobian[localRowIndexEnergy0][localDofIndexComp] += m_dt * dConvectiveEnergyFlux_dC[ke][jc]; - stack.localFluxJacobian[localRowIndexEnergy1][localDofIndexComp] -= m_dt * dConvectiveEnergyFlux_dC[ke][jc]; - } - } - } ); - - // ***************************************************** - // Computation of the conduction term in the energy flux - // Note that the phase enthalpy term in the energy was computed above - // Note that this term is computed using an explicit treatment of conductivity for now - - // Step 1: compute the thermal transmissibilities at this face - // Below, the thermal conductivity used to compute (explicitly) the thermal conducivity - // To avoid modifying the signature of the "computeWeights" function for now, we pass m_thermalConductivity twice - // TODO: modify computeWeights to accomodate explicit coefficients - m_stencilWrapper.computeWeights( iconn, - m_thermalConductivity, - m_thermalConductivity, // we have to pass something here, so we just use thermal conductivity - stack.thermalTransmissibility, - stack.dTrans_dPres ); // again, we have to pass something here, but this is unused for now - - - - localIndex k[2]{}; - localIndex connectionIndex = 0; - - for( k[0] = 0; k[0] < stack.numConnectedElems; ++k[0] ) - { - for( k[1] = k[0] + 1; k[1] < stack.numConnectedElems; ++k[1] ) - { - real64 const thermalTrans[2] = { stack.thermalTransmissibility[connectionIndex][0], stack.thermalTransmissibility[connectionIndex][1] }; - 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] )}; - - real64 conductiveEnergyFlux = 0.0; - real64 dConductiveEnergyFlux_dT[numFluxSupportPoints]{}; - - // Step 2: compute temperature difference at the interface - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - localIndex const er = seri[ke]; - localIndex const esr = sesri[ke]; - localIndex const ei = sei[ke]; - - conductiveEnergyFlux += thermalTrans[ke] * m_temp[er][esr][ei]; - dConductiveEnergyFlux_dT[ke] += thermalTrans[ke]; - } - - // Step 3: add conductiveFlux and its derivatives to localFlux and localFluxJacobian - integer const localRowIndexEnergy0 = k[0] * numEqn + numEqn - 1; - integer const localRowIndexEnergy1 = k[1] * numEqn + numEqn - 1; - stack.localFlux[localRowIndexEnergy0] += m_dt * conductiveEnergyFlux; - stack.localFlux[localRowIndexEnergy1] -= m_dt * conductiveEnergyFlux; - - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - integer const localDofIndexTemp = k[ke] * numDof + numDof - 1; - stack.localFluxJacobian[localRowIndexEnergy0][localDofIndexTemp] += m_dt * dConductiveEnergyFlux_dT[ke]; - stack.localFluxJacobian[localRowIndexEnergy1][localDofIndexTemp] -= m_dt * dConductiveEnergyFlux_dT[ke]; - } - } - } - } - - /** - * @brief Performs the complete phase for the kernel. - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - inline - void complete( localIndex const iconn, - StackVariables & stack ) const - { - // Call Case::complete to assemble the component mass balance equations (i = 0 to i = numDof-2) - // In the lambda, add contribution to residual and jacobian into the energy balance equation - Base::complete( iconn, stack, [&] ( integer const i, - localIndex const localRow ) - { - // beware, there is volume balance eqn in m_localRhs and m_localMatrix! - RAJA::atomicAdd( parallelDeviceAtomic{}, &AbstractBase::m_localRhs[localRow + numEqn], stack.localFlux[i * numEqn + numEqn-1] ); - AbstractBase::m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > - ( localRow + numEqn, - stack.dofColIndices.data(), - stack.localFluxJacobian[i * numEqn + numEqn-1].dataIfContiguous(), - stack.stencilSize * numDof ); - - } ); - } - -protected: - - /// Views on temperature - ElementViewConst< arrayView1d< real64 const > > const m_temp; - - /// Views on phase enthalpies - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseEnthalpy; - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseEnthalpy; - - /// View on thermal conductivity - ElementViewConst< arrayView3d< real64 const > > const m_thermalConductivity; - // for now, we treat thermal conductivity explicitly - -}; - -/** - * @class FaceBasedAssemblyKernelFactory - */ -class FaceBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @tparam STENCILWRAPPER the type of the stencil wrapper - * @param[in] numComps the number of fluid components - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey string to get the element degrees of freedom numbers - * @param[in] hasCapPressure flag specifying whether capillary pressure is used or not - * @param[in] solverName name of the solver (to name accessors) - * @param[in] elemManager reference to the element region manager - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY, typename STENCILWRAPPER > - static void - createAndLaunch( integer const numComps, - integer const numPhases, - globalIndex const rankOffset, - string const & dofKey, - integer const hasCapPressure, - integer const useTotalMassEquation, - string const & solverName, - ElementRegionManager const & elemManager, - STENCILWRAPPER const & stencilWrapper, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - isothermalCompositionalMultiphaseBaseKernels:: - internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) - { - integer constexpr NUM_COMP = NC(); - integer constexpr NUM_DOF = NC() + 2; - - ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = - elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); - dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - - BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags; - if( hasCapPressure ) - kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags::CapPressure ); - if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags::TotalMassEquation ); - - using KernelType = FaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; - typename KernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); - typename KernelType::ThermalCompFlowAccessors thermalCompFlowAccessors( elemManager, solverName ); - typename KernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); - typename KernelType::ThermalMultiFluidAccessors thermalMultiFluidAccessors( elemManager, solverName ); - typename KernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); - typename KernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); - typename KernelType::ThermalConductivityAccessors thermalConductivityAccessors( elemManager, solverName ); - - KernelType kernel( numPhases, rankOffset, stencilWrapper, dofNumberAccessor, - compFlowAccessors, thermalCompFlowAccessors, multiFluidAccessors, thermalMultiFluidAccessors, - capPressureAccessors, permeabilityAccessors, thermalConductivityAccessors, - dt, localMatrix, localRhs, kernelFlags ); - KernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); - } ); - } -}; - -/******************************** DiffusionDispersionFaceBasedAssemblyKernel ********************************/ - -/** - * @class DiffusionDispersionFaceBasedAssemblyKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_DOF number of degrees of freedom - * @tparam STENCILWRAPPER the type of the stencil wrapper - * @brief Define the interface for the assembly kernel in charge of diffusion/dispersion flux terms - */ -template< integer NUM_COMP, integer NUM_DOF, typename STENCILWRAPPER > -class DiffusionDispersionFaceBasedAssemblyKernel : - public isothermalCompositionalMultiphaseFVMKernels::DiffusionDispersionFaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER > -{ -public: - - /** - * @brief The type for element-based data. Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewConstAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelBase; - using DofNumberAccessor = AbstractBase::DofNumberAccessor; - using CompFlowAccessors = AbstractBase::CompFlowAccessors; - using MultiFluidAccessors = AbstractBase::MultiFluidAccessors; - using AbstractBase::m_dt; - using AbstractBase::m_dPhaseCompFrac; - using AbstractBase::m_dPhaseVolFrac; - - using Base = typename isothermalCompositionalMultiphaseFVMKernels::DiffusionDispersionFaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; - using DiffusionAccessors = typename Base::DiffusionAccessors; - using DispersionAccessors = typename Base::DispersionAccessors; - using PorosityAccessors = typename Base::PorosityAccessors; - using Base::numFluxSupportPoints; - using Base::numEqn; - using Base::numComp; - using Base::numDof; - using Base::m_referencePorosity; - using Base::m_phaseVolFrac; - using Base::m_phaseDens; - using Base::m_dPhaseDens; - using Base::m_phaseDiffusivityMultiplier; - - /** - * @brief Constructor for the kernel interface - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] dofNumberAccessor - * @param[in] compFlowAccessors - * @param[in] multiFluidAccessors - * @param[in] diffusionAccessors - * @param[in] dispersionAccessors - * @param[in] porosityAccessors - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - * @param[in] kernelFlags flags packed together - */ - DiffusionDispersionFaceBasedAssemblyKernel( integer const numPhases, - globalIndex const rankOffset, - STENCILWRAPPER const & stencilWrapper, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - MultiFluidAccessors const & multiFluidAccessors, - DiffusionAccessors const & diffusionAccessors, - DispersionAccessors const & dispersionAccessors, - PorosityAccessors const & porosityAccessors, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags ) - : Base( numPhases, - rankOffset, - stencilWrapper, - dofNumberAccessor, - compFlowAccessors, - multiFluidAccessors, - diffusionAccessors, - dispersionAccessors, - porosityAccessors, - dt, - localMatrix, - localRhs, - kernelFlags ) - {} - - struct StackVariables : public Base::StackVariables - { -public: - - GEOS_HOST_DEVICE - StackVariables( localIndex const size, localIndex numElems ) - : Base::StackVariables( size, numElems ) - {} - - using Base::StackVariables::transmissibility; - using Base::StackVariables::localFlux; - using Base::StackVariables::localFluxJacobian; - - }; - - /** - * @brief Compute the local diffusion flux contributions to the residual and Jacobian - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - inline - void computeDiffusionFlux( localIndex const iconn, - StackVariables & stack ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - // *********************************************** - // First, we call the base computeFlux to compute the diffusionFlux and its derivatives (including derivatives wrt temperature), - // - // We use the lambda below (called **inside** the phase loop of the base computeFlux) to access these variables - Base::computeDiffusionFlux( iconn, stack, [&] ( integer const ip, - integer const ic, - localIndex const (&k)[2], - localIndex const (&seri)[2], - localIndex const (&sesri)[2], - localIndex const (&sei)[2], - localIndex const connectionIndex, - localIndex const k_up, - localIndex const er_up, - localIndex const esr_up, - localIndex const ei_up, - real64 const compFracGrad, - real64 const upwindCoefficient ) - { - // We are in the loop over phases and components, ip provides the current phase index. - - real64 dCompFracGrad_dT[numFluxSupportPoints]{}; - real64 dDiffusionFlux_dT[numFluxSupportPoints]{}; - - /// compute the TPFA component difference - for( integer i = 0; i < numFluxSupportPoints; i++ ) - { - localIndex const er = seri[i]; - localIndex const esr = sesri[i]; - localIndex const ei = sei[i]; - - dCompFracGrad_dT[i] += stack.transmissibility[connectionIndex][i] * m_dPhaseCompFrac[er][esr][ei][0][ip][ic][Deriv::dT]; - } - - // add contributions of the derivatives of component fractions wrt pressure/component fractions - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - dDiffusionFlux_dT[ke] += upwindCoefficient * dCompFracGrad_dT[ke]; - } - - // add contributions of the derivatives of upwind coefficient wrt temperature - real64 const dUpwindCoefficient_dT = - m_referencePorosity[er_up][esr_up][ei_up] * - m_phaseDiffusivityMultiplier[er_up][esr_up][ei_up][0][ip] * - ( m_dPhaseDens[er_up][esr_up][ei_up][0][ip][Deriv::dT] * m_phaseVolFrac[er_up][esr_up][ei_up][ip] - + m_phaseDens[er_up][esr_up][ei_up][0][ip] * m_dPhaseVolFrac[er_up][esr_up][ei_up][ip][Deriv::dT] ); - dDiffusionFlux_dT[k_up] += dUpwindCoefficient_dT * compFracGrad; - - // finally, increment local flux and local Jacobian - integer const eqIndex0 = k[0] * numEqn + ic; - integer const eqIndex1 = k[1] * numEqn + ic; - - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - localIndex const localDofIndexTemp = k[ke] * numDof + numComp + 1; - stack.localFluxJacobian[eqIndex0][localDofIndexTemp] += m_dt * dDiffusionFlux_dT[ke]; - stack.localFluxJacobian[eqIndex1][localDofIndexTemp] -= m_dt * dDiffusionFlux_dT[ke]; - } - } ); - } - - /** - * @brief Compute the local dispersion flux contributions to the residual and Jacobian - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - inline - void computeDispersionFlux( localIndex const iconn, - StackVariables & stack ) const - { - using Deriv = constitutive::multifluid::DerivativeOffset; - - // *********************************************** - // First, we call the base computeFlux to compute the dispersionFlux and its derivatives (including derivatives wrt temperature), - // - // We use the lambda below (called **inside** the phase loop of the base computeFlux) to access these variables - Base::computeDispersionFlux( iconn, stack, [&] ( integer const ip, - integer const ic, - localIndex const (&k)[2], - localIndex const (&seri)[2], - localIndex const (&sesri)[2], - localIndex const (&sei)[2], - localIndex const connectionIndex, - localIndex const k_up, - localIndex const er_up, - localIndex const esr_up, - localIndex const ei_up, - real64 const compFracGrad ) - { - // We are in the loop over phases and components, ip provides the current phase index. - - real64 dCompFracGrad_dT[numFluxSupportPoints]{}; - real64 dDispersionFlux_dT[numFluxSupportPoints]{}; - - /// compute the TPFA component difference - for( integer i = 0; i < numFluxSupportPoints; i++ ) - { - localIndex const er = seri[i]; - localIndex const esr = sesri[i]; - localIndex const ei = sei[i]; - - dCompFracGrad_dT[i] += stack.transmissibility[connectionIndex][i] * m_dPhaseCompFrac[er][esr][ei][0][ip][ic][Deriv::dT]; - } - - // add contributions of the derivatives of component fractions wrt pressure/component fractions - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - dDispersionFlux_dT[ke] += m_phaseDens[er_up][esr_up][ei_up][0][ip] * dCompFracGrad_dT[ke]; - } - - // add contributions of the derivatives of upwind coefficient wrt temperature - dDispersionFlux_dT[k_up] += m_dPhaseDens[er_up][esr_up][ei_up][0][ip][Deriv::dT] * compFracGrad; - - // finally, increment local flux and local Jacobian - integer const eqIndex0 = k[0] * numEqn + ic; - integer const eqIndex1 = k[1] * numEqn + ic; - - for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) - { - localIndex const localDofIndexTemp = k[ke] * numDof + numComp + 1; - stack.localFluxJacobian[eqIndex0][localDofIndexTemp] += m_dt * dDispersionFlux_dT[ke]; - stack.localFluxJacobian[eqIndex1][localDofIndexTemp] -= m_dt * dDispersionFlux_dT[ke]; - } - } ); - } -}; - -/** - * @class DiffusionDispersionFaceBasedAssemblyKernelFactory - */ -class DiffusionDispersionFaceBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @tparam STENCILWRAPPER the type of the stencil wrapper - * @param[in] numComps the number of fluid components - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey string to get the element degrees of freedom numbers - * @param[in] hasDiffusion flag specifying whether diffusion is used or not - * @param[in] hasDispersion flag specifying whether dispersion is used or not - * @param[in] solverName the name of the solver - * @param[in] elemManager reference to the element region manager - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY, typename STENCILWRAPPER > - static void - createAndLaunch( integer const numComps, - integer const numPhases, - globalIndex const rankOffset, - string const & dofKey, - integer const hasDiffusion, - integer const hasDispersion, - integer const useTotalMassEquation, - string const & solverName, - ElementRegionManager const & elemManager, - STENCILWRAPPER const & stencilWrapper, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - isothermalCompositionalMultiphaseBaseKernels:: - internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) - { - integer constexpr NUM_COMP = NC(); - integer constexpr NUM_DOF = NC() + 2; - - ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = - elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); - dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - - BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags; - if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags::TotalMassEquation ); - - using kernelType = DiffusionDispersionFaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; - typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); - typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); - typename kernelType::DiffusionAccessors diffusionAccessors( elemManager, solverName ); - typename kernelType::DispersionAccessors dispersionAccessors( elemManager, solverName ); - typename kernelType::PorosityAccessors porosityAccessors( elemManager, solverName ); - - kernelType kernel( numPhases, rankOffset, stencilWrapper, - dofNumberAccessor, compFlowAccessors, multiFluidAccessors, - diffusionAccessors, dispersionAccessors, porosityAccessors, - dt, localMatrix, localRhs, kernelFlags ); - kernelType::template launch< POLICY >( stencilWrapper.size(), - hasDiffusion, hasDispersion, - kernel ); - } ); - } -}; - -/******************************** DirichletFaceBasedAssemblyKernel ********************************/ - -/** - * @class DirichletFaceBasedAssemblyKernel - * @tparam NUM_COMP number of fluid components - * @tparam NUM_DOF number of degrees of freedom - * @tparam FLUIDWRAPPER the type of the fluid wrapper - * @brief Define the interface for the assembly kernel in charge of Dirichlet face flux terms - */ -template< integer NUM_COMP, integer NUM_DOF, typename FLUIDWRAPPER > -class DirichletFaceBasedAssemblyKernel : public isothermalCompositionalMultiphaseFVMKernels::DirichletFaceBasedAssemblyKernel< NUM_COMP, - NUM_DOF, - FLUIDWRAPPER > -{ -public: - - /** - * @brief The type for element-based data. Consists entirely of ArrayView's. - * - * Can be converted from ElementRegionManager::ElementViewConstAccessor - * by calling .toView() or .toViewConst() on an accessor instance - */ - template< typename VIEWTYPE > - using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; - - using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelBase; - using DofNumberAccessor = AbstractBase::DofNumberAccessor; - using CompFlowAccessors = AbstractBase::CompFlowAccessors; - using MultiFluidAccessors = AbstractBase::MultiFluidAccessors; - using CapPressureAccessors = AbstractBase::CapPressureAccessors; - using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; - - using AbstractBase::m_dt; - using AbstractBase::m_gravCoef; - using AbstractBase::m_phaseCompFrac; - using AbstractBase::m_dPhaseCompFrac; - using AbstractBase::m_dCompFrac_dCompDens; - - using Base = isothermalCompositionalMultiphaseFVMKernels::DirichletFaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, FLUIDWRAPPER >; - using Base::numComp; - using Base::numDof; - using Base::numEqn; - using Base::m_phaseMob; - using Base::m_dPhaseMob; - using Base::m_dPhaseMassDens; - using Base::m_stencilWrapper; - using Base::m_seri; - using Base::m_sesri; - using Base::m_sei; - using Base::m_faceTemp; - using Base::m_faceGravCoef; - - - using ThermalCompFlowAccessors = - StencilAccessors< fields::flow::temperature >; - - using ThermalMultiFluidAccessors = - StencilMaterialAccessors< constitutive::MultiFluidBase, - fields::multifluid::phaseEnthalpy, - fields::multifluid::dPhaseEnthalpy >; - - using ThermalConductivityAccessors = - StencilMaterialAccessors< constitutive::MultiPhaseThermalConductivityBase, - fields::thermalconductivity::effectiveConductivity >; - // for now, we treat thermal conductivity explicitly - - /** - * @brief Constructor for the kernel interface - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] faceManager the face manager - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] fluidWrapper reference to the fluid wrapper - * @param[in] dofNumberAccessor accessor for the dofs numbers - * @param[in] compFlowAccessor accessor for wrappers registered by the solver - * @param[in] thermalCompFlowAccessors accessor for *thermal* wrappers registered by the solver - * @param[in] multiFluidAccessor accessor for wrappers registered by the multifluid model - * @param[in] thermalMultiFluidAccessors accessor for *thermal* wrappers registered by the multifluid model - * @param[in] capPressureAccessors accessor for wrappers registered by the cap pressure model - * @param[in] permeabilityAccessors accessor for wrappers registered by the permeability model - * @param[in] thermalConductivityAccessors accessor for wrappers registered by the thermal conductivity model - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - * @param[in] kernelFlags flags packed together - */ - DirichletFaceBasedAssemblyKernel( integer const numPhases, - globalIndex const rankOffset, - FaceManager const & faceManager, - BoundaryStencilWrapper const & stencilWrapper, - FLUIDWRAPPER const & fluidWrapper, - DofNumberAccessor const & dofNumberAccessor, - CompFlowAccessors const & compFlowAccessors, - ThermalCompFlowAccessors const & thermalCompFlowAccessors, - MultiFluidAccessors const & multiFluidAccessors, - ThermalMultiFluidAccessors const & thermalMultiFluidAccessors, - CapPressureAccessors const & capPressureAccessors, - PermeabilityAccessors const & permeabilityAccessors, - ThermalConductivityAccessors const & thermalConductivityAccessors, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags ) - : Base( numPhases, - rankOffset, - faceManager, - stencilWrapper, - fluidWrapper, - dofNumberAccessor, - compFlowAccessors, - multiFluidAccessors, - capPressureAccessors, - permeabilityAccessors, - dt, - localMatrix, - localRhs, - kernelFlags ), - m_temp( thermalCompFlowAccessors.get( fields::flow::temperature {} ) ), - m_phaseEnthalpy( thermalMultiFluidAccessors.get( fields::multifluid::phaseEnthalpy {} ) ), - m_dPhaseEnthalpy( thermalMultiFluidAccessors.get( fields::multifluid::dPhaseEnthalpy {} ) ), - m_thermalConductivity( thermalConductivityAccessors.get( fields::thermalconductivity::effectiveConductivity {} ) ) - {} - - struct StackVariables : public Base::StackVariables - { -public: - - /** - * @brief Constructor for the stack variables - * @param[in] size size of the stencil for this connection - * @param[in] numElems number of elements for this connection - */ - GEOS_HOST_DEVICE - StackVariables( localIndex const size, localIndex numElems ) - : Base::StackVariables( size, numElems ) - {} - - using Base::StackVariables::transmissibility; - using Base::StackVariables::dofColIndices; - using Base::StackVariables::localFlux; - using Base::StackVariables::localFluxJacobian; - - // Component fluxes and derivatives - - /// Derivatives of component fluxes wrt temperature - real64 dCompFlux_dT[numComp]{}; - - - // Energy fluxes and derivatives - - /// Energy fluxes - real64 energyFlux = 0.0; - /// Derivative of energy fluxes wrt pressure - real64 dEnergyFlux_dP = 0.0; - /// Derivative of energy fluxes wrt temperature - real64 dEnergyFlux_dT = 0.0; - /// Derivatives of energy fluxes wrt component densities - real64 dEnergyFlux_dC[numComp]{}; - - }; - - /** - * @brief Compute the local flux contributions to the residual and Jacobian - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void computeFlux( localIndex const iconn, - StackVariables & stack ) const - { - using Order = BoundaryStencil::Order; - using Deriv = constitutive::multifluid::DerivativeOffset; - - // *********************************************** - // First, we call the base computeFlux to compute: - // 1) compFlux and its derivatives (including derivatives wrt temperature), - // 2) enthalpy part of energyFlux and its derivatives (including derivatives wrt temperature) - // - // Computing dCompFlux_dT and the enthalpy flux requires quantities already computed in the base computeFlux, - // such as potGrad, phaseFlux, and the indices of the upwind cell - // We use the lambda below (called **inside** the phase loop of the base computeFlux) to access these variables - Base::computeFlux( iconn, stack, [&] ( integer const ip, - localIndex const er, - localIndex const esr, - localIndex const ei, - localIndex const kf, - real64 const f, // potGrad times trans - real64 const facePhaseMob, - arraySlice1d< const real64, constitutive::multifluid::USD_PHASE - 2 > const & facePhaseEnthalpy, - arraySlice2d< const real64, constitutive::multifluid::USD_PHASE_COMP-2 > const & facePhaseCompFrac, - real64 const phaseFlux, - real64 const dPhaseFlux_dP, - real64 const (&dPhaseFlux_dC)[numComp] ) - { - // We are in the loop over phases, ip provides the current phase index. - - // Step 1: compute the derivatives of the mean density at the interface wrt temperature - - real64 const dDensMean_dT = 0.5 * m_dPhaseMassDens[er][esr][ei][0][ip][Deriv::dT]; - - // Step 2: compute the derivatives of the phase potential difference wrt temperature - //***** calculation of flux ***** - - real64 const dF_dT = -stack.transmissibility * dDensMean_dT * ( m_gravCoef[er][esr][ei] - m_faceGravCoef[kf] ); - - // Step 3: compute the derivatives of the (upwinded) compFlux wrt temperature - // *** upwinding *** - - // note: the upwinding is done in the base class, which is in charge of - // computing the following quantities: potGrad, phaseFlux - // It is easier to hard-code the if/else because it is difficult to address elem and face variables in a uniform way - - - if( f >= 0 ) // the element is upstream - { - - // Step 3.1.a: compute the derivative of phase flux wrt temperature - real64 const dPhaseFlux_dT = m_phaseMob[er][esr][ei][ip] * dF_dT + m_dPhaseMob[er][esr][ei][ip][Deriv::dT] * f; - - // Step 3.2.a: compute the derivative of component flux wrt temperature - - // slice some constitutive arrays to avoid too much indexing in component loop - arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 3 > phaseCompFracSub = - m_phaseCompFrac[er][esr][ei][0][ip]; - arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 3 > dPhaseCompFracSub = - m_dPhaseCompFrac[er][esr][ei][0][ip]; - - for( integer ic = 0; ic < numComp; ++ic ) - { - real64 const ycp = phaseCompFracSub[ic]; - stack.dCompFlux_dT[ic] += dPhaseFlux_dT * ycp + phaseFlux * dPhaseCompFracSub[ic][Deriv::dT]; - } - - // Step 3.3.a: compute the enthalpy flux - - real64 const enthalpy = m_phaseEnthalpy[er][esr][ei][0][ip]; - stack.energyFlux += phaseFlux * enthalpy; - stack.dEnergyFlux_dP += dPhaseFlux_dP * enthalpy + phaseFlux * m_dPhaseEnthalpy[er][esr][ei][0][ip][Deriv::dP]; - stack.dEnergyFlux_dT += dPhaseFlux_dT * enthalpy + phaseFlux * m_dPhaseEnthalpy[er][esr][ei][0][ip][Deriv::dT]; - - real64 dProp_dC[numComp]{}; - applyChainRule( numComp, - m_dCompFrac_dCompDens[er][esr][ei], - m_dPhaseEnthalpy[er][esr][ei][0][ip], - dProp_dC, - Deriv::dC ); - for( integer jc = 0; jc < numComp; ++jc ) - { - stack.dEnergyFlux_dC[jc] += dPhaseFlux_dC[jc] * enthalpy + phaseFlux * dProp_dC[jc]; - } - - } - else // the face is upstream - { - - // Step 3.1.b: compute the derivative of phase flux wrt temperature - real64 const dPhaseFlux_dT = facePhaseMob * dF_dT; - - // Step 3.2.b: compute the derivative of component flux wrt temperature - - for( integer ic = 0; ic < numComp; ++ic ) - { - real64 const ycp = facePhaseCompFrac[ip][ic]; - stack.dCompFlux_dT[ic] += dPhaseFlux_dT * ycp; - } - - // Step 3.3.b: compute the enthalpy flux - - real64 const enthalpy = facePhaseEnthalpy[ip]; - stack.energyFlux += phaseFlux * enthalpy; - stack.dEnergyFlux_dP += dPhaseFlux_dP * enthalpy; - stack.dEnergyFlux_dT += dPhaseFlux_dT * enthalpy; - for( integer jc = 0; jc < numComp; ++jc ) - { - stack.dEnergyFlux_dC[jc] += dPhaseFlux_dC[jc] * enthalpy; - } - - } - - } ); - - // ***************************************************** - // Computation of the conduction term in the energy flux - // Note that the phase enthalpy term in the energy was computed above - // Note that this term is computed using an explicit treatment of conductivity for now - - // Step 1: compute the thermal transmissibilities at this face - // Below, the thermal conductivity used to compute (explicitly) the thermal conducivity - // To avoid modifying the signature of the "computeWeights" function for now, we pass m_thermalConductivity twice - // TODO: modify computeWeights to accomodate explicit coefficients - real64 thermalTrans = 0.0; - real64 dThermalTrans_dPerm[3]{}; // not used - m_stencilWrapper.computeWeights( iconn, - m_thermalConductivity, - thermalTrans, - dThermalTrans_dPerm ); - - // Step 2: compute temperature difference at the interface - stack.energyFlux += thermalTrans - * ( m_temp[m_seri( iconn, Order::ELEM )][m_sesri( iconn, Order::ELEM )][m_sei( iconn, Order::ELEM )] - m_faceTemp[m_sei( iconn, Order::FACE )] ); - stack.dEnergyFlux_dT += thermalTrans; - - - // ********************************************************************************** - // At this point, we have computed the energyFlux and the compFlux for all components - // We have to do two things here: - // 1) Add dCompFlux_dTemp to the localFluxJacobian of the component mass balance equations - // 2) Add energyFlux and its derivatives to the localFlux(Jacobian) of the energy balance equation - - // Step 1: add dCompFlux_dTemp to localFluxJacobian - for( integer ic = 0; ic < numComp; ++ic ) - { - stack.localFluxJacobian[ic][numDof-1] = m_dt * stack.dCompFlux_dT[ic]; - } - - // Step 2: add energyFlux and its derivatives to localFlux and localFluxJacobian - integer const localRowIndexEnergy = numEqn-1; - stack.localFlux[localRowIndexEnergy] = m_dt * stack.energyFlux; - - stack.localFluxJacobian[localRowIndexEnergy][0] = m_dt * stack.dEnergyFlux_dP; - stack.localFluxJacobian[localRowIndexEnergy][numDof-1] = m_dt * stack.dEnergyFlux_dT; - for( integer jc = 0; jc < numComp; ++jc ) - { - stack.localFluxJacobian[localRowIndexEnergy][jc+1] = m_dt * stack.dEnergyFlux_dC[jc]; - } - } - - /** - * @brief Performs the complete phase for the kernel. - * @param[in] iconn the connection index - * @param[inout] stack the stack variables - */ - GEOS_HOST_DEVICE - void complete( localIndex const iconn, - StackVariables & stack ) const - { - // Call Case::complete to assemble the component mass balance equations (i = 0 to i = numDof-2) - // In the lambda, add contribution to residual and jacobian into the energy balance equation - Base::complete( iconn, stack, [&] ( localIndex const localRow ) - { - // beware, there is volume balance eqn in m_localRhs and m_localMatrix! - RAJA::atomicAdd( parallelDeviceAtomic{}, &AbstractBase::m_localRhs[localRow + numEqn], stack.localFlux[numEqn-1] ); - AbstractBase::m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > - ( localRow + numEqn, - stack.dofColIndices, - stack.localFluxJacobian[numEqn-1], - numDof ); - - } ); - } - -protected: - - /// Views on temperature - ElementViewConst< arrayView1d< real64 const > > const m_temp; - - /// Views on phase enthalpies - ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseEnthalpy; - ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseEnthalpy; - - /// View on thermal conductivity - ElementViewConst< arrayView3d< real64 const > > const m_thermalConductivity; - // for now, we treat thermal conductivity explicitly - -}; - -/** - * @class DirichletFaceBasedAssemblyKernelFactory - */ -class DirichletFaceBasedAssemblyKernelFactory -{ -public: - - /** - * @brief Create a new kernel and launch - * @tparam POLICY the policy used in the RAJA kernel - * @tparam STENCILWRAPPER the type of the stencil wrapper - * @param[in] numComps the number of fluid components - * @param[in] numPhases the number of fluid phases - * @param[in] rankOffset the offset of my MPI rank - * @param[in] dofKey string to get the element degrees of freedom numbers - * @param[in] solverName name of the solver (to name accessors) - * @param[in] faceManager reference to the face manager - * @param[in] elemManager reference to the element region manager - * @param[in] stencilWrapper reference to the stencil wrapper - * @param[in] fluidBase the multifluid constitutive model - * @param[in] dt time step size - * @param[inout] localMatrix the local CRS matrix - * @param[inout] localRhs the local right-hand side vector - */ - template< typename POLICY, typename STENCILWRAPPER > - static void - createAndLaunch( integer const numComps, - integer const numPhases, - globalIndex const rankOffset, - integer const useTotalMassEquation, - string const & dofKey, - string const & solverName, - FaceManager const & faceManager, - ElementRegionManager const & elemManager, - STENCILWRAPPER const & stencilWrapper, - constitutive::MultiFluidBase & fluidBase, - real64 const dt, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs ) - { - constitutive::constitutiveComponentUpdatePassThru< true >( fluidBase, numComps, [&]( auto & fluid, auto NC ) - { - using FluidType = TYPEOFREF( fluid ); - typename FluidType::KernelWrapper const fluidWrapper = fluid.createKernelWrapper(); - - integer constexpr NUM_COMP = NC(); - integer constexpr NUM_DOF = NC() + 2; - - ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = - elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); - dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); - - // for now, we neglect capillary pressure in the kernel - BitFlags< isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags > kernelFlags; - if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::FaceBasedAssemblyKernelFlags::TotalMassEquation ); - - using KernelType = DirichletFaceBasedAssemblyKernel< NUM_COMP, NUM_DOF, typename FluidType::KernelWrapper >; - typename KernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); - typename KernelType::ThermalCompFlowAccessors thermalCompFlowAccessors( elemManager, solverName ); - typename KernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); - typename KernelType::ThermalMultiFluidAccessors thermalMultiFluidAccessors( elemManager, solverName ); - typename KernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); - typename KernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); - typename KernelType::ThermalConductivityAccessors thermalConductivityAccessors( elemManager, solverName ); - - KernelType kernel( numPhases, rankOffset, faceManager, stencilWrapper, fluidWrapper, - dofNumberAccessor, compFlowAccessors, thermalCompFlowAccessors, multiFluidAccessors, thermalMultiFluidAccessors, - capPressureAccessors, permeabilityAccessors, thermalConductivityAccessors, - dt, localMatrix, localRhs, kernelFlags ); - KernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); - } ); - } -}; - - -} // namespace thermalCompositionalMultiphaseFVMKernels - -} // namespace geos - - -#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_THERMALCOMPOSITIONALMULTIPHASEFVMKERNELS_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDiffusionDispersionFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDiffusionDispersionFluxComputeKernel.hpp new file mode 100644 index 00000000000..9dd607a5d0c --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDiffusionDispersionFluxComputeKernel.hpp @@ -0,0 +1,352 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ThermalDiffusionDispersionFluxComputeKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALDIFFUSIONDISPERSIONFLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALDIFFUSIONDISPERSIONFLUXCOMPUTEKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp" + +namespace geos +{ + +namespace thermalCompositionalMultiphaseFVMKernels +{ + +/******************************** DiffusionDispersionFluxComputeKernel ********************************/ + +/** + * @class DiffusionDispersionFluxComputeKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_DOF number of degrees of freedom + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @brief Define the interface for the assembly kernel in charge of diffusion/dispersion flux terms + */ +template< integer NUM_COMP, integer NUM_DOF, typename STENCILWRAPPER > +class DiffusionDispersionFluxComputeKernel : + public isothermalCompositionalMultiphaseFVMKernels::DiffusionDispersionFluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER > +{ +public: + + /** + * @brief The type for element-based data. Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewConstAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernelBase; + using DofNumberAccessor = AbstractBase::DofNumberAccessor; + using CompFlowAccessors = AbstractBase::CompFlowAccessors; + using MultiFluidAccessors = AbstractBase::MultiFluidAccessors; + using AbstractBase::m_dt; + using AbstractBase::m_dPhaseCompFrac; + using AbstractBase::m_dPhaseVolFrac; + + using Base = typename isothermalCompositionalMultiphaseFVMKernels::DiffusionDispersionFluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; + using DiffusionAccessors = typename Base::DiffusionAccessors; + using DispersionAccessors = typename Base::DispersionAccessors; + using PorosityAccessors = typename Base::PorosityAccessors; + using Base::numFluxSupportPoints; + using Base::numEqn; + using Base::numComp; + using Base::numDof; + using Base::m_referencePorosity; + using Base::m_phaseVolFrac; + using Base::m_phaseDens; + using Base::m_dPhaseDens; + using Base::m_phaseDiffusivityMultiplier; + + /** + * @brief Constructor for the kernel interface + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dofNumberAccessor + * @param[in] compFlowAccessors + * @param[in] multiFluidAccessors + * @param[in] diffusionAccessors + * @param[in] dispersionAccessors + * @param[in] porosityAccessors + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + * @param[in] kernelFlags flags packed together + */ + DiffusionDispersionFluxComputeKernel( integer const numPhases, + globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + DiffusionAccessors const & diffusionAccessors, + DispersionAccessors const & dispersionAccessors, + PorosityAccessors const & porosityAccessors, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< isothermalCompositionalMultiphaseFVMKernels::KernelFlags > kernelFlags ) + : Base( numPhases, + rankOffset, + stencilWrapper, + dofNumberAccessor, + compFlowAccessors, + multiFluidAccessors, + diffusionAccessors, + dispersionAccessors, + porosityAccessors, + dt, + localMatrix, + localRhs, + kernelFlags ) + {} + + struct StackVariables : public Base::StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables( localIndex const size, localIndex numElems ) + : Base::StackVariables( size, numElems ) + {} + + using Base::StackVariables::transmissibility; + using Base::StackVariables::localFlux; + using Base::StackVariables::localFluxJacobian; + + }; + + /** + * @brief Compute the local diffusion flux contributions to the residual and Jacobian + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + inline + void computeDiffusionFlux( localIndex const iconn, + StackVariables & stack ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + // *********************************************** + // First, we call the base computeFlux to compute the diffusionFlux and its derivatives (including derivatives wrt temperature), + // + // We use the lambda below (called **inside** the phase loop of the base computeFlux) to access these variables + Base::computeDiffusionFlux( iconn, stack, [&] ( integer const ip, + integer const ic, + localIndex const (&k)[2], + localIndex const (&seri)[2], + localIndex const (&sesri)[2], + localIndex const (&sei)[2], + localIndex const connectionIndex, + localIndex const k_up, + localIndex const er_up, + localIndex const esr_up, + localIndex const ei_up, + real64 const compFracGrad, + real64 const upwindCoefficient ) + { + // We are in the loop over phases and components, ip provides the current phase index. + + real64 dCompFracGrad_dT[numFluxSupportPoints]{}; + real64 dDiffusionFlux_dT[numFluxSupportPoints]{}; + + /// compute the TPFA component difference + for( integer i = 0; i < numFluxSupportPoints; i++ ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + dCompFracGrad_dT[i] += stack.transmissibility[connectionIndex][i] * m_dPhaseCompFrac[er][esr][ei][0][ip][ic][Deriv::dT]; + } + + // add contributions of the derivatives of component fractions wrt pressure/component fractions + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dDiffusionFlux_dT[ke] += upwindCoefficient * dCompFracGrad_dT[ke]; + } + + // add contributions of the derivatives of upwind coefficient wrt temperature + real64 const dUpwindCoefficient_dT = + m_referencePorosity[er_up][esr_up][ei_up] * + m_phaseDiffusivityMultiplier[er_up][esr_up][ei_up][0][ip] * + ( m_dPhaseDens[er_up][esr_up][ei_up][0][ip][Deriv::dT] * m_phaseVolFrac[er_up][esr_up][ei_up][ip] + + m_phaseDens[er_up][esr_up][ei_up][0][ip] * m_dPhaseVolFrac[er_up][esr_up][ei_up][ip][Deriv::dT] ); + dDiffusionFlux_dT[k_up] += dUpwindCoefficient_dT * compFracGrad; + + // finally, increment local flux and local Jacobian + integer const eqIndex0 = k[0] * numEqn + ic; + integer const eqIndex1 = k[1] * numEqn + ic; + + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + localIndex const localDofIndexTemp = k[ke] * numDof + numComp + 1; + stack.localFluxJacobian[eqIndex0][localDofIndexTemp] += m_dt * dDiffusionFlux_dT[ke]; + stack.localFluxJacobian[eqIndex1][localDofIndexTemp] -= m_dt * dDiffusionFlux_dT[ke]; + } + } ); + } + + /** + * @brief Compute the local dispersion flux contributions to the residual and Jacobian + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + inline + void computeDispersionFlux( localIndex const iconn, + StackVariables & stack ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + // *********************************************** + // First, we call the base computeFlux to compute the dispersionFlux and its derivatives (including derivatives wrt temperature), + // + // We use the lambda below (called **inside** the phase loop of the base computeFlux) to access these variables + Base::computeDispersionFlux( iconn, stack, [&] ( integer const ip, + integer const ic, + localIndex const (&k)[2], + localIndex const (&seri)[2], + localIndex const (&sesri)[2], + localIndex const (&sei)[2], + localIndex const connectionIndex, + localIndex const k_up, + localIndex const er_up, + localIndex const esr_up, + localIndex const ei_up, + real64 const compFracGrad ) + { + // We are in the loop over phases and components, ip provides the current phase index. + + real64 dCompFracGrad_dT[numFluxSupportPoints]{}; + real64 dDispersionFlux_dT[numFluxSupportPoints]{}; + + /// compute the TPFA component difference + for( integer i = 0; i < numFluxSupportPoints; i++ ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + dCompFracGrad_dT[i] += stack.transmissibility[connectionIndex][i] * m_dPhaseCompFrac[er][esr][ei][0][ip][ic][Deriv::dT]; + } + + // add contributions of the derivatives of component fractions wrt pressure/component fractions + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dDispersionFlux_dT[ke] += m_phaseDens[er_up][esr_up][ei_up][0][ip] * dCompFracGrad_dT[ke]; + } + + // add contributions of the derivatives of upwind coefficient wrt temperature + dDispersionFlux_dT[k_up] += m_dPhaseDens[er_up][esr_up][ei_up][0][ip][Deriv::dT] * compFracGrad; + + // finally, increment local flux and local Jacobian + integer const eqIndex0 = k[0] * numEqn + ic; + integer const eqIndex1 = k[1] * numEqn + ic; + + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + localIndex const localDofIndexTemp = k[ke] * numDof + numComp + 1; + stack.localFluxJacobian[eqIndex0][localDofIndexTemp] += m_dt * dDispersionFlux_dT[ke]; + stack.localFluxJacobian[eqIndex1][localDofIndexTemp] -= m_dt * dDispersionFlux_dT[ke]; + } + } ); + } +}; + +/** + * @class DiffusionDispersionFluxComputeKernelFactory + */ +class DiffusionDispersionFluxComputeKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @param[in] numComps the number of fluid components + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] hasDiffusion flag specifying whether diffusion is used or not + * @param[in] hasDispersion flag specifying whether dispersion is used or not + * @param[in] solverName the name of the solver + * @param[in] elemManager reference to the element region manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY, typename STENCILWRAPPER > + static void + createAndLaunch( integer const numComps, + integer const numPhases, + globalIndex const rankOffset, + string const & dofKey, + integer const hasDiffusion, + integer const hasDispersion, + integer const useTotalMassEquation, + string const & solverName, + ElementRegionManager const & elemManager, + STENCILWRAPPER const & stencilWrapper, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + isothermalCompositionalMultiphaseBaseKernels:: + internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) + { + integer constexpr NUM_COMP = NC(); + integer constexpr NUM_DOF = NC() + 2; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + BitFlags< isothermalCompositionalMultiphaseFVMKernels::KernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::KernelFlags::TotalMassEquation ); + + using kernelType = DiffusionDispersionFluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; + typename kernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); + typename kernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); + typename kernelType::DiffusionAccessors diffusionAccessors( elemManager, solverName ); + typename kernelType::DispersionAccessors dispersionAccessors( elemManager, solverName ); + typename kernelType::PorosityAccessors porosityAccessors( elemManager, solverName ); + + kernelType kernel( numPhases, rankOffset, stencilWrapper, + dofNumberAccessor, compFlowAccessors, multiFluidAccessors, + diffusionAccessors, dispersionAccessors, porosityAccessors, + dt, localMatrix, localRhs, kernelFlags ); + kernelType::template launch< POLICY >( stencilWrapper.size(), + hasDiffusion, hasDispersion, + kernel ); + } ); + } +}; + +} // namespace thermalCompositionalMultiphaseFVMKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALDIFFUSIONDISPERSIONFLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDirichletFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDirichletFluxComputeKernel.hpp new file mode 100644 index 00000000000..edd4df9f192 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDirichletFluxComputeKernel.hpp @@ -0,0 +1,484 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ThermalDirichletFluxComputeKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALDIRICHLETFLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALDIRICHLETFLUXCOMPUTEKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" +#include "constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp" +#include "constitutive/thermalConductivity/ThermalConductivityFields.hpp" + +namespace geos +{ + +namespace thermalCompositionalMultiphaseFVMKernels +{ + +/******************************** DirichletFluxComputeKernel ********************************/ + +/** + * @class DirichletFluxComputeKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_DOF number of degrees of freedom + * @tparam FLUIDWRAPPER the type of the fluid wrapper + * @brief Define the interface for the assembly kernel in charge of Dirichlet face flux terms + */ +template< integer NUM_COMP, integer NUM_DOF, typename FLUIDWRAPPER > +class DirichletFluxComputeKernel : public isothermalCompositionalMultiphaseFVMKernels::DirichletFluxComputeKernel< NUM_COMP, + NUM_DOF, + FLUIDWRAPPER > +{ +public: + + /** + * @brief The type for element-based data. Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewConstAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernelBase; + using DofNumberAccessor = AbstractBase::DofNumberAccessor; + using CompFlowAccessors = AbstractBase::CompFlowAccessors; + using MultiFluidAccessors = AbstractBase::MultiFluidAccessors; + using CapPressureAccessors = AbstractBase::CapPressureAccessors; + using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; + + using AbstractBase::m_dt; + using AbstractBase::m_numPhases; + using AbstractBase::m_rankOffset; + using AbstractBase::m_dofNumber; + using AbstractBase::m_gravCoef; + using AbstractBase::m_phaseCompFrac; + using AbstractBase::m_dPhaseCompFrac; + using AbstractBase::m_dCompFrac_dCompDens; + + using Base = isothermalCompositionalMultiphaseFVMKernels::DirichletFluxComputeKernel< NUM_COMP, NUM_DOF, FLUIDWRAPPER >; + using Base::numComp; + using Base::numDof; + using Base::numEqn; + using Base::m_phaseMob; + using Base::m_dPhaseMob; + using Base::m_dPhaseMassDens; + using Base::m_stencilWrapper; + using Base::m_seri; + using Base::m_sesri; + using Base::m_sei; + using Base::m_faceTemp; + using Base::m_faceGravCoef; + + + using ThermalCompFlowAccessors = + StencilAccessors< fields::flow::temperature >; + + using ThermalMultiFluidAccessors = + StencilMaterialAccessors< constitutive::MultiFluidBase, + fields::multifluid::phaseEnthalpy, + fields::multifluid::dPhaseEnthalpy >; + + using ThermalConductivityAccessors = + StencilMaterialAccessors< constitutive::MultiPhaseThermalConductivityBase, + fields::thermalconductivity::effectiveConductivity >; + // for now, we treat thermal conductivity explicitly + + /** + * @brief Constructor for the kernel interface + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] faceManager the face manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] fluidWrapper reference to the fluid wrapper + * @param[in] dofNumberAccessor accessor for the dofs numbers + * @param[in] compFlowAccessor accessor for wrappers registered by the solver + * @param[in] thermalCompFlowAccessors accessor for *thermal* wrappers registered by the solver + * @param[in] multiFluidAccessor accessor for wrappers registered by the multifluid model + * @param[in] thermalMultiFluidAccessors accessor for *thermal* wrappers registered by the multifluid model + * @param[in] capPressureAccessors accessor for wrappers registered by the cap pressure model + * @param[in] permeabilityAccessors accessor for wrappers registered by the permeability model + * @param[in] thermalConductivityAccessors accessor for wrappers registered by the thermal conductivity model + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + * @param[in] kernelFlags flags packed together + */ + DirichletFluxComputeKernel( integer const numPhases, + globalIndex const rankOffset, + FaceManager const & faceManager, + BoundaryStencilWrapper const & stencilWrapper, + FLUIDWRAPPER const & fluidWrapper, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + ThermalCompFlowAccessors const & thermalCompFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + ThermalMultiFluidAccessors const & thermalMultiFluidAccessors, + CapPressureAccessors const & capPressureAccessors, + PermeabilityAccessors const & permeabilityAccessors, + ThermalConductivityAccessors const & thermalConductivityAccessors, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< isothermalCompositionalMultiphaseFVMKernels::KernelFlags > kernelFlags ) + : Base( numPhases, + rankOffset, + faceManager, + stencilWrapper, + fluidWrapper, + dofNumberAccessor, + compFlowAccessors, + multiFluidAccessors, + capPressureAccessors, + permeabilityAccessors, + dt, + localMatrix, + localRhs, + kernelFlags ), + m_temp( thermalCompFlowAccessors.get( fields::flow::temperature {} ) ), + m_phaseEnthalpy( thermalMultiFluidAccessors.get( fields::multifluid::phaseEnthalpy {} ) ), + m_dPhaseEnthalpy( thermalMultiFluidAccessors.get( fields::multifluid::dPhaseEnthalpy {} ) ), + m_thermalConductivity( thermalConductivityAccessors.get( fields::thermalconductivity::effectiveConductivity {} ) ) + {} + + struct StackVariables : public Base::StackVariables + { +public: + + /** + * @brief Constructor for the stack variables + * @param[in] size size of the stencil for this connection + * @param[in] numElems number of elements for this connection + */ + GEOS_HOST_DEVICE + StackVariables( localIndex const size, localIndex numElems ) + : Base::StackVariables( size, numElems ) + {} + + using Base::StackVariables::transmissibility; + using Base::StackVariables::dofColIndices; + using Base::StackVariables::localFlux; + using Base::StackVariables::localFluxJacobian; + + // Component fluxes and derivatives + + /// Derivatives of component fluxes wrt temperature + real64 dCompFlux_dT[numComp]{}; + + + // Energy fluxes and derivatives + + /// Energy fluxes + real64 energyFlux = 0.0; + /// Derivative of energy fluxes wrt pressure + real64 dEnergyFlux_dP = 0.0; + /// Derivative of energy fluxes wrt temperature + real64 dEnergyFlux_dT = 0.0; + /// Derivatives of energy fluxes wrt component densities + real64 dEnergyFlux_dC[numComp]{}; + + }; + + /** + * @brief Compute the local flux contributions to the residual and Jacobian + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void computeFlux( localIndex const iconn, + StackVariables & stack ) const + { + using Order = BoundaryStencil::Order; + using Deriv = constitutive::multifluid::DerivativeOffset; + + // *********************************************** + // First, we call the base computeFlux to compute: + // 1) compFlux and its derivatives (including derivatives wrt temperature), + // 2) enthalpy part of energyFlux and its derivatives (including derivatives wrt temperature) + // + // Computing dCompFlux_dT and the enthalpy flux requires quantities already computed in the base computeFlux, + // such as potGrad, phaseFlux, and the indices of the upwind cell + // We use the lambda below (called **inside** the phase loop of the base computeFlux) to access these variables + Base::computeFlux( iconn, stack, [&] ( integer const ip, + localIndex const er, + localIndex const esr, + localIndex const ei, + localIndex const kf, + real64 const f, // potGrad times trans + real64 const facePhaseMob, + arraySlice1d< const real64, constitutive::multifluid::USD_PHASE - 2 > const & facePhaseEnthalpy, + arraySlice2d< const real64, constitutive::multifluid::USD_PHASE_COMP-2 > const & facePhaseCompFrac, + real64 const phaseFlux, + real64 const dPhaseFlux_dP, + real64 const (&dPhaseFlux_dC)[numComp] ) + { + // We are in the loop over phases, ip provides the current phase index. + + // Step 1: compute the derivatives of the mean density at the interface wrt temperature + + real64 const dDensMean_dT = 0.5 * m_dPhaseMassDens[er][esr][ei][0][ip][Deriv::dT]; + + // Step 2: compute the derivatives of the phase potential difference wrt temperature + //***** calculation of flux ***** + + real64 const dF_dT = -stack.transmissibility * dDensMean_dT * ( m_gravCoef[er][esr][ei] - m_faceGravCoef[kf] ); + + // Step 3: compute the derivatives of the (upwinded) compFlux wrt temperature + // *** upwinding *** + + // note: the upwinding is done in the base class, which is in charge of + // computing the following quantities: potGrad, phaseFlux + // It is easier to hard-code the if/else because it is difficult to address elem and face variables in a uniform way + + + if( f >= 0 ) // the element is upstream + { + + // Step 3.1.a: compute the derivative of phase flux wrt temperature + real64 const dPhaseFlux_dT = m_phaseMob[er][esr][ei][ip] * dF_dT + m_dPhaseMob[er][esr][ei][ip][Deriv::dT] * f; + + // Step 3.2.a: compute the derivative of component flux wrt temperature + + // slice some constitutive arrays to avoid too much indexing in component loop + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 3 > phaseCompFracSub = + m_phaseCompFrac[er][esr][ei][0][ip]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 3 > dPhaseCompFracSub = + m_dPhaseCompFrac[er][esr][ei][0][ip]; + + for( integer ic = 0; ic < numComp; ++ic ) + { + real64 const ycp = phaseCompFracSub[ic]; + stack.dCompFlux_dT[ic] += dPhaseFlux_dT * ycp + phaseFlux * dPhaseCompFracSub[ic][Deriv::dT]; + } + + // Step 3.3.a: compute the enthalpy flux + + real64 const enthalpy = m_phaseEnthalpy[er][esr][ei][0][ip]; + stack.energyFlux += phaseFlux * enthalpy; + stack.dEnergyFlux_dP += dPhaseFlux_dP * enthalpy + phaseFlux * m_dPhaseEnthalpy[er][esr][ei][0][ip][Deriv::dP]; + stack.dEnergyFlux_dT += dPhaseFlux_dT * enthalpy + phaseFlux * m_dPhaseEnthalpy[er][esr][ei][0][ip][Deriv::dT]; + + real64 dProp_dC[numComp]{}; + applyChainRule( numComp, + m_dCompFrac_dCompDens[er][esr][ei], + m_dPhaseEnthalpy[er][esr][ei][0][ip], + dProp_dC, + Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + stack.dEnergyFlux_dC[jc] += dPhaseFlux_dC[jc] * enthalpy + phaseFlux * dProp_dC[jc]; + } + + } + else // the face is upstream + { + + // Step 3.1.b: compute the derivative of phase flux wrt temperature + real64 const dPhaseFlux_dT = facePhaseMob * dF_dT; + + // Step 3.2.b: compute the derivative of component flux wrt temperature + + for( integer ic = 0; ic < numComp; ++ic ) + { + real64 const ycp = facePhaseCompFrac[ip][ic]; + stack.dCompFlux_dT[ic] += dPhaseFlux_dT * ycp; + } + + // Step 3.3.b: compute the enthalpy flux + + real64 const enthalpy = facePhaseEnthalpy[ip]; + stack.energyFlux += phaseFlux * enthalpy; + stack.dEnergyFlux_dP += dPhaseFlux_dP * enthalpy; + stack.dEnergyFlux_dT += dPhaseFlux_dT * enthalpy; + for( integer jc = 0; jc < numComp; ++jc ) + { + stack.dEnergyFlux_dC[jc] += dPhaseFlux_dC[jc] * enthalpy; + } + + } + + } ); + + // ***************************************************** + // Computation of the conduction term in the energy flux + // Note that the phase enthalpy term in the energy was computed above + // Note that this term is computed using an explicit treatment of conductivity for now + + // Step 1: compute the thermal transmissibilities at this face + // Below, the thermal conductivity used to compute (explicitly) the thermal conducivity + // To avoid modifying the signature of the "computeWeights" function for now, we pass m_thermalConductivity twice + // TODO: modify computeWeights to accomodate explicit coefficients + real64 thermalTrans = 0.0; + real64 dThermalTrans_dPerm[3]{}; // not used + m_stencilWrapper.computeWeights( iconn, + m_thermalConductivity, + thermalTrans, + dThermalTrans_dPerm ); + + // Step 2: compute temperature difference at the interface + stack.energyFlux += thermalTrans + * ( m_temp[m_seri( iconn, Order::ELEM )][m_sesri( iconn, Order::ELEM )][m_sei( iconn, Order::ELEM )] - m_faceTemp[m_sei( iconn, Order::FACE )] ); + stack.dEnergyFlux_dT += thermalTrans; + + + // ********************************************************************************** + // At this point, we have computed the energyFlux and the compFlux for all components + // We have to do two things here: + // 1) Add dCompFlux_dTemp to the localFluxJacobian of the component mass balance equations + // 2) Add energyFlux and its derivatives to the localFlux(Jacobian) of the energy balance equation + + // Step 1: add dCompFlux_dTemp to localFluxJacobian + for( integer ic = 0; ic < numComp; ++ic ) + { + stack.localFluxJacobian[ic][numDof-1] = m_dt * stack.dCompFlux_dT[ic]; + } + + // Step 2: add energyFlux and its derivatives to localFlux and localFluxJacobian + integer const localRowIndexEnergy = numEqn-1; + stack.localFlux[localRowIndexEnergy] = m_dt * stack.energyFlux; + + stack.localFluxJacobian[localRowIndexEnergy][0] = m_dt * stack.dEnergyFlux_dP; + stack.localFluxJacobian[localRowIndexEnergy][numDof-1] = m_dt * stack.dEnergyFlux_dT; + for( integer jc = 0; jc < numComp; ++jc ) + { + stack.localFluxJacobian[localRowIndexEnergy][jc+1] = m_dt * stack.dEnergyFlux_dC[jc]; + } + } + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void complete( localIndex const iconn, + StackVariables & stack ) const + { + // Call Case::complete to assemble the component mass balance equations (i = 0 to i = numDof-2) + // In the lambda, add contribution to residual and jacobian into the energy balance equation + Base::complete( iconn, stack, [&] ( localIndex const localRow ) + { + // beware, there is volume balance eqn in m_localRhs and m_localMatrix! + RAJA::atomicAdd( parallelDeviceAtomic{}, &AbstractBase::m_localRhs[localRow + numEqn], stack.localFlux[numEqn-1] ); + AbstractBase::m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > + ( localRow + numEqn, + stack.dofColIndices, + stack.localFluxJacobian[numEqn-1], + numDof ); + + } ); + } + +protected: + + /// Views on temperature + ElementViewConst< arrayView1d< real64 const > > const m_temp; + + /// Views on phase enthalpies + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseEnthalpy; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseEnthalpy; + + /// View on thermal conductivity + ElementViewConst< arrayView3d< real64 const > > const m_thermalConductivity; + // for now, we treat thermal conductivity explicitly + +}; + +/** + * @class DirichletFluxComputeKernelFactory + */ +class DirichletFluxComputeKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @param[in] numComps the number of fluid components + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] solverName name of the solver (to name accessors) + * @param[in] faceManager reference to the face manager + * @param[in] elemManager reference to the element region manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] fluidBase the multifluid constitutive model + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY, typename STENCILWRAPPER > + static void + createAndLaunch( integer const numComps, + integer const numPhases, + globalIndex const rankOffset, + integer const useTotalMassEquation, + string const & dofKey, + string const & solverName, + FaceManager const & faceManager, + ElementRegionManager const & elemManager, + STENCILWRAPPER const & stencilWrapper, + constitutive::MultiFluidBase & fluidBase, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + constitutive::constitutiveComponentUpdatePassThru< true >( fluidBase, numComps, [&]( auto & fluid, auto NC ) + { + using FluidType = TYPEOFREF( fluid ); + typename FluidType::KernelWrapper const fluidWrapper = fluid.createKernelWrapper(); + + integer constexpr NUM_COMP = NC(); + integer constexpr NUM_DOF = NC() + 2; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + // for now, we neglect capillary pressure in the kernel + BitFlags< isothermalCompositionalMultiphaseFVMKernels::KernelFlags > kernelFlags; + if( useTotalMassEquation ) + kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::KernelFlags::TotalMassEquation ); + + using KernelType = DirichletFluxComputeKernel< NUM_COMP, NUM_DOF, typename FluidType::KernelWrapper >; + typename KernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); + typename KernelType::ThermalCompFlowAccessors thermalCompFlowAccessors( elemManager, solverName ); + typename KernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); + typename KernelType::ThermalMultiFluidAccessors thermalMultiFluidAccessors( elemManager, solverName ); + typename KernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); + typename KernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); + typename KernelType::ThermalConductivityAccessors thermalConductivityAccessors( elemManager, solverName ); + + KernelType kernel( numPhases, rankOffset, faceManager, stencilWrapper, fluidWrapper, + dofNumberAccessor, compFlowAccessors, thermalCompFlowAccessors, multiFluidAccessors, thermalMultiFluidAccessors, + capPressureAccessors, permeabilityAccessors, thermalConductivityAccessors, + dt, localMatrix, localRhs, kernelFlags ); + KernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); + } ); + } +}; + +} // namespace thermalCompositionalMultiphaseFVMKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALDIRICHLETFLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp new file mode 100644 index 00000000000..17395f62324 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp @@ -0,0 +1,572 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ThermalFluxComputeKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALFLUXCOMPUTEKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALFLUXCOMPUTEKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp" +#include "constitutive/fluid/multifluid/MultiFluidBase.hpp" +#include "constitutive/fluid/multifluid/MultiFluidFields.hpp" +#include "constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp" +#include "constitutive/thermalConductivity/ThermalConductivityFields.hpp" + +namespace geos +{ + +namespace thermalCompositionalMultiphaseFVMKernels +{ + +/******************************** FluxComputeKernel ********************************/ + +/** + * @class FluxComputeKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_DOF number of degrees of freedom + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @brief Define the interface for the assembly kernel in charge of flux terms + */ +template< integer NUM_COMP, integer NUM_DOF, typename STENCILWRAPPER > +class FluxComputeKernel : public isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER > +{ +public: + + /** + * @brief The type for element-based data. Consists entirely of ArrayView's. + * + * Can be converted from ElementRegionManager::ElementViewConstAccessor + * by calling .toView() or .toViewConst() on an accessor instance + */ + template< typename VIEWTYPE > + using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >; + + using AbstractBase = isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernelBase; + using DofNumberAccessor = AbstractBase::DofNumberAccessor; + using CompFlowAccessors = AbstractBase::CompFlowAccessors; + using MultiFluidAccessors = AbstractBase::MultiFluidAccessors; + using CapPressureAccessors = AbstractBase::CapPressureAccessors; + using PermeabilityAccessors = AbstractBase::PermeabilityAccessors; + + using AbstractBase::m_dt; + using AbstractBase::m_numPhases; + using AbstractBase::m_rankOffset; + using AbstractBase::m_dofNumber; + using AbstractBase::m_gravCoef; + using AbstractBase::m_phaseVolFrac; + using AbstractBase::m_dPhaseVolFrac; + using AbstractBase::m_phaseCompFrac; + using AbstractBase::m_dPhaseCompFrac; + using AbstractBase::m_dCompFrac_dCompDens; + + using Base = isothermalCompositionalMultiphaseFVMKernels::FluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; + using Base::numComp; + using Base::numDof; + using Base::numEqn; + using Base::maxNumElems; + using Base::maxNumConns; + using Base::maxStencilSize; + using Base::numFluxSupportPoints; + using Base::m_phaseMob; + using Base::m_dPhaseMob; + using Base::m_dPhaseMassDens; + using Base::m_dPhaseCapPressure_dPhaseVolFrac; + using Base::m_stencilWrapper; + using Base::m_seri; + using Base::m_sesri; + using Base::m_sei; + + using ThermalCompFlowAccessors = + StencilAccessors< fields::flow::temperature >; + + using ThermalMultiFluidAccessors = + StencilMaterialAccessors< constitutive::MultiFluidBase, + fields::multifluid::phaseEnthalpy, + fields::multifluid::dPhaseEnthalpy >; + + using ThermalConductivityAccessors = + StencilMaterialAccessors< constitutive::MultiPhaseThermalConductivityBase, + fields::thermalconductivity::effectiveConductivity >; + // for now, we treat thermal conductivity explicitly + + /** + * @brief Constructor for the kernel interface + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dofNumberAccessor accessor for the dofs numbers + * @param[in] compFlowAccessor accessor for wrappers registered by the solver + * @param[in] thermalCompFlowAccessors accessor for *thermal* wrappers registered by the solver + * @param[in] multiFluidAccessor accessor for wrappers registered by the multifluid model + * @param[in] thermalMultiFluidAccessors accessor for *thermal* wrappers registered by the multifluid model + * @param[in] capPressureAccessors accessor for wrappers registered by the cap pressure model + * @param[in] permeabilityAccessors accessor for wrappers registered by the permeability model + * @param[in] thermalConductivityAccessors accessor for wrappers registered by the thermal conductivity model + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + * @param[in] kernelFlags flags packed all together + */ + FluxComputeKernel( integer const numPhases, + globalIndex const rankOffset, + STENCILWRAPPER const & stencilWrapper, + DofNumberAccessor const & dofNumberAccessor, + CompFlowAccessors const & compFlowAccessors, + ThermalCompFlowAccessors const & thermalCompFlowAccessors, + MultiFluidAccessors const & multiFluidAccessors, + ThermalMultiFluidAccessors const & thermalMultiFluidAccessors, + CapPressureAccessors const & capPressureAccessors, + PermeabilityAccessors const & permeabilityAccessors, + ThermalConductivityAccessors const & thermalConductivityAccessors, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + BitFlags< isothermalCompositionalMultiphaseFVMKernels::KernelFlags > kernelFlags ) + : Base( numPhases, + rankOffset, + stencilWrapper, + dofNumberAccessor, + compFlowAccessors, + multiFluidAccessors, + capPressureAccessors, + permeabilityAccessors, + dt, + localMatrix, + localRhs, + kernelFlags ), + m_temp( thermalCompFlowAccessors.get( fields::flow::temperature {} ) ), + m_phaseEnthalpy( thermalMultiFluidAccessors.get( fields::multifluid::phaseEnthalpy {} ) ), + m_dPhaseEnthalpy( thermalMultiFluidAccessors.get( fields::multifluid::dPhaseEnthalpy {} ) ), + m_thermalConductivity( thermalConductivityAccessors.get( fields::thermalconductivity::effectiveConductivity {} ) ) + {} + + struct StackVariables : public Base::StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables( localIndex const size, localIndex numElems ) + : Base::StackVariables( size, numElems ) + {} + + using Base::StackVariables::stencilSize; + using Base::StackVariables::numConnectedElems; + using Base::StackVariables::transmissibility; + using Base::StackVariables::dTrans_dPres; + using Base::StackVariables::dofColIndices; + using Base::StackVariables::localFlux; + using Base::StackVariables::localFluxJacobian; + + // Thermal transmissibility (for now, no derivatives) + + real64 thermalTransmissibility[maxNumConns][2]{}; + }; + + /** + * @brief Compute the local flux contributions to the residual and Jacobian + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + inline + void computeFlux( localIndex const iconn, + StackVariables & stack ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + // *********************************************** + // First, we call the base computeFlux to compute: + // 1) compFlux and its derivatives (including derivatives wrt temperature), + // 2) enthalpy part of convectiveEnergyFlux and its derivatives (including derivatives wrt temperature) + // + // Computing dCompFlux_dT and the enthalpy flux requires quantities already computed in the base computeFlux, + // such as potGrad, phaseFlux, and the indices of the upwind cell + // We use the lambda below (called **inside** the phase loop of the base computeFlux) to access these variables + Base::computeFlux( iconn, stack, [&] ( integer const ip, + localIndex const (&k)[2], + localIndex const (&seri)[2], + localIndex const (&sesri)[2], + localIndex const (&sei)[2], + localIndex const connectionIndex, + localIndex const k_up, + localIndex const er_up, + localIndex const esr_up, + localIndex const ei_up, + real64 const potGrad, + real64 const phaseFlux, + real64 const (&dPhaseFlux_dP)[2], + real64 const (&dPhaseFlux_dC)[2][numComp] ) + { + // We are in the loop over phases, ip provides the current phase index. + + // Step 1: compute the derivatives of the mean density at the interface wrt temperature + + real64 dDensMean_dT[numFluxSupportPoints]{}; + + real64 const trans[numFluxSupportPoints] = { stack.transmissibility[connectionIndex][0], + stack.transmissibility[connectionIndex][1] }; + + real64 convectiveEnergyFlux = 0.0; + real64 dConvectiveEnergyFlux_dP[numFluxSupportPoints]{}; + real64 dConvectiveEnergyFlux_dT[numFluxSupportPoints]{}; + real64 dConvectiveEnergyFlux_dC[numFluxSupportPoints][numComp]{}; + real64 dCompFlux_dT[numFluxSupportPoints][numComp]{}; + + integer denom = 0; + for( integer i = 0; i < numFluxSupportPoints; ++i ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + bool const phaseExists = (m_phaseVolFrac[er_up][esr_up][ei_up][ip] > 0); + if( !phaseExists ) + { + continue; + } + + dDensMean_dT[i] = m_dPhaseMassDens[er][esr][ei][0][ip][Deriv::dT]; + denom++; + } + if( denom > 1 ) + { + for( integer i = 0; i < numFluxSupportPoints; ++i ) + { + dDensMean_dT[i] /= denom; + } + } + + // Step 2: compute the derivatives of the phase potential difference wrt temperature + //***** calculation of flux ***** + + real64 dPresGrad_dT[numFluxSupportPoints]{}; + real64 dGravHead_dT[numFluxSupportPoints]{}; + + // compute potential difference MPFA-style + for( integer i = 0; i < numFluxSupportPoints; ++i ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + // Step 2.1: compute derivative of capillary pressure wrt temperature + real64 dCapPressure_dT = 0.0; + if( AbstractBase::m_kernelFlags.isSet( isothermalCompositionalMultiphaseFVMKernels::KernelFlags::CapPressure ) ) + { + for( integer jp = 0; jp < m_numPhases; ++jp ) + { + real64 const dCapPressure_dS = m_dPhaseCapPressure_dPhaseVolFrac[er][esr][ei][0][ip][jp]; + dCapPressure_dT += dCapPressure_dS * m_dPhaseVolFrac[er][esr][ei][jp][Deriv::dT]; + } + } + + // Step 2.2: compute derivative of phase pressure difference wrt temperature + dPresGrad_dT[i] -= trans[i] * dCapPressure_dT; + real64 const gravD = trans[i] * m_gravCoef[er][esr][ei]; + + // Step 2.3: compute derivative of gravity potential difference wrt temperature + for( integer j = 0; j < numFluxSupportPoints; ++j ) + { + dGravHead_dT[j] += dDensMean_dT[j] * gravD; + } + } + + // Step 3: compute the derivatives of the (upwinded) compFlux wrt temperature + // *** upwinding *** + + // note: the upwinding is done in the base class, which is in charge of + // computing the following quantities: potGrad, phaseFlux, k_up, er_up, esr_up, ei_up + + real64 dPhaseFlux_dT[numFluxSupportPoints]{}; + + // Step 3.1: compute the derivative of phase flux wrt temperature + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dPhaseFlux_dT[ke] += dPresGrad_dT[ke]; + } + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dPhaseFlux_dT[ke] -= dGravHead_dT[ke]; + } + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dPhaseFlux_dT[ke] *= m_phaseMob[er_up][esr_up][ei_up][ip]; + } + dPhaseFlux_dT[k_up] += m_dPhaseMob[er_up][esr_up][ei_up][ip][Deriv::dT] * potGrad; + + // Step 3.2: compute the derivative of component flux wrt temperature + + // slice some constitutive arrays to avoid too much indexing in component loop + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE_COMP - 3 > phaseCompFracSub = + m_phaseCompFrac[er_up][esr_up][ei_up][0][ip]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC - 3 > dPhaseCompFracSub = + m_dPhaseCompFrac[er_up][esr_up][ei_up][0][ip]; + + for( integer ic = 0; ic < numComp; ++ic ) + { + real64 const ycp = phaseCompFracSub[ic]; + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dCompFlux_dT[ke][ic] += dPhaseFlux_dT[ke] * ycp; + } + dCompFlux_dT[k_up][ic] += phaseFlux * dPhaseCompFracSub[ic][Deriv::dT]; + } + + // Step 4: add dCompFlux_dTemp to localFluxJacobian + for( integer ic = 0; ic < numComp; ++ic ) + { + integer const eqIndex0 = k[0]* numEqn + ic; + integer const eqIndex1 = k[1]* numEqn + ic; + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + integer const localDofIndexTemp = k[ke] * numDof + numDof - 1; + stack.localFluxJacobian[eqIndex0][localDofIndexTemp] += m_dt * dCompFlux_dT[ke][ic]; + stack.localFluxJacobian[eqIndex1][localDofIndexTemp] -= m_dt * dCompFlux_dT[ke][ic]; + } + } + + // Step 5: compute the enthalpy flux + real64 const enthalpy = m_phaseEnthalpy[er_up][esr_up][ei_up][0][ip]; + convectiveEnergyFlux += phaseFlux * enthalpy; + + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + dConvectiveEnergyFlux_dP[ke] += dPhaseFlux_dP[ke] * enthalpy; + dConvectiveEnergyFlux_dT[ke] += dPhaseFlux_dT[ke] * enthalpy; + + for( integer jc = 0; jc < numComp; ++jc ) + { + dConvectiveEnergyFlux_dC[ke][jc] += dPhaseFlux_dC[ke][jc] * enthalpy; + } + } + + dConvectiveEnergyFlux_dP[k_up] += phaseFlux * m_dPhaseEnthalpy[er_up][esr_up][ei_up][0][ip][Deriv::dP]; + dConvectiveEnergyFlux_dT[k_up] += phaseFlux * m_dPhaseEnthalpy[er_up][esr_up][ei_up][0][ip][Deriv::dT]; + + real64 dProp_dC[numComp]{}; + applyChainRule( numComp, + m_dCompFrac_dCompDens[er_up][esr_up][ei_up], + m_dPhaseEnthalpy[er_up][esr_up][ei_up][0][ip], + dProp_dC, + Deriv::dC ); + for( integer jc = 0; jc < numComp; ++jc ) + { + dConvectiveEnergyFlux_dC[k_up][jc] += phaseFlux * dProp_dC[jc]; + } + + // Step 6: add convectiveFlux and its derivatives to localFlux and localFluxJacobian + integer const localRowIndexEnergy0 = k[0] * numEqn + numEqn - 1; + integer const localRowIndexEnergy1 = k[1] * numEqn + numEqn - 1; + stack.localFlux[localRowIndexEnergy0] += m_dt * convectiveEnergyFlux; + stack.localFlux[localRowIndexEnergy1] -= m_dt * convectiveEnergyFlux; + + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + integer const localDofIndexPres = k[ke] * numDof; + stack.localFluxJacobian[localRowIndexEnergy0][localDofIndexPres] += m_dt * dConvectiveEnergyFlux_dP[ke]; + stack.localFluxJacobian[localRowIndexEnergy1][localDofIndexPres] -= m_dt * dConvectiveEnergyFlux_dP[ke]; + integer const localDofIndexTemp = localDofIndexPres + numDof - 1; + stack.localFluxJacobian[localRowIndexEnergy0][localDofIndexTemp] += m_dt * dConvectiveEnergyFlux_dT[ke]; + stack.localFluxJacobian[localRowIndexEnergy1][localDofIndexTemp] -= m_dt * dConvectiveEnergyFlux_dT[ke]; + + for( integer jc = 0; jc < numComp; ++jc ) + { + integer const localDofIndexComp = localDofIndexPres + jc + 1; + stack.localFluxJacobian[localRowIndexEnergy0][localDofIndexComp] += m_dt * dConvectiveEnergyFlux_dC[ke][jc]; + stack.localFluxJacobian[localRowIndexEnergy1][localDofIndexComp] -= m_dt * dConvectiveEnergyFlux_dC[ke][jc]; + } + } + } ); + + // ***************************************************** + // Computation of the conduction term in the energy flux + // Note that the phase enthalpy term in the energy was computed above + // Note that this term is computed using an explicit treatment of conductivity for now + + // Step 1: compute the thermal transmissibilities at this face + // Below, the thermal conductivity used to compute (explicitly) the thermal conducivity + // To avoid modifying the signature of the "computeWeights" function for now, we pass m_thermalConductivity twice + // TODO: modify computeWeights to accomodate explicit coefficients + m_stencilWrapper.computeWeights( iconn, + m_thermalConductivity, + m_thermalConductivity, // we have to pass something here, so we just use thermal conductivity + stack.thermalTransmissibility, + stack.dTrans_dPres ); // again, we have to pass something here, but this is unused for now + + + + localIndex k[2]{}; + localIndex connectionIndex = 0; + + for( k[0] = 0; k[0] < stack.numConnectedElems; ++k[0] ) + { + for( k[1] = k[0] + 1; k[1] < stack.numConnectedElems; ++k[1] ) + { + real64 const thermalTrans[2] = { stack.thermalTransmissibility[connectionIndex][0], stack.thermalTransmissibility[connectionIndex][1] }; + 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] )}; + + real64 conductiveEnergyFlux = 0.0; + real64 dConductiveEnergyFlux_dT[numFluxSupportPoints]{}; + + // Step 2: compute temperature difference at the interface + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + localIndex const er = seri[ke]; + localIndex const esr = sesri[ke]; + localIndex const ei = sei[ke]; + + conductiveEnergyFlux += thermalTrans[ke] * m_temp[er][esr][ei]; + dConductiveEnergyFlux_dT[ke] += thermalTrans[ke]; + } + + // Step 3: add conductiveFlux and its derivatives to localFlux and localFluxJacobian + integer const localRowIndexEnergy0 = k[0] * numEqn + numEqn - 1; + integer const localRowIndexEnergy1 = k[1] * numEqn + numEqn - 1; + stack.localFlux[localRowIndexEnergy0] += m_dt * conductiveEnergyFlux; + stack.localFlux[localRowIndexEnergy1] -= m_dt * conductiveEnergyFlux; + + for( integer ke = 0; ke < numFluxSupportPoints; ++ke ) + { + integer const localDofIndexTemp = k[ke] * numDof + numDof - 1; + stack.localFluxJacobian[localRowIndexEnergy0][localDofIndexTemp] += m_dt * dConductiveEnergyFlux_dT[ke]; + stack.localFluxJacobian[localRowIndexEnergy1][localDofIndexTemp] -= m_dt * dConductiveEnergyFlux_dT[ke]; + } + } + } + } + + /** + * @brief Performs the complete phase for the kernel. + * @param[in] iconn the connection index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + inline + void complete( localIndex const iconn, + StackVariables & stack ) const + { + // Call Case::complete to assemble the component mass balance equations (i = 0 to i = numDof-2) + // In the lambda, add contribution to residual and jacobian into the energy balance equation + Base::complete( iconn, stack, [&] ( integer const i, + localIndex const localRow ) + { + // beware, there is volume balance eqn in m_localRhs and m_localMatrix! + RAJA::atomicAdd( parallelDeviceAtomic{}, &AbstractBase::m_localRhs[localRow + numEqn], stack.localFlux[i * numEqn + numEqn-1] ); + AbstractBase::m_localMatrix.addToRowBinarySearchUnsorted< parallelDeviceAtomic > + ( localRow + numEqn, + stack.dofColIndices.data(), + stack.localFluxJacobian[i * numEqn + numEqn-1].dataIfContiguous(), + stack.stencilSize * numDof ); + + } ); + } + +protected: + + /// Views on temperature + ElementViewConst< arrayView1d< real64 const > > const m_temp; + + /// Views on phase enthalpies + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const m_phaseEnthalpy; + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const m_dPhaseEnthalpy; + + /// View on thermal conductivity + ElementViewConst< arrayView3d< real64 const > > const m_thermalConductivity; + // for now, we treat thermal conductivity explicitly + +}; + +/** + * @class FluxComputeKernelFactory + */ +class FluxComputeKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @tparam STENCILWRAPPER the type of the stencil wrapper + * @param[in] numComps the number of fluid components + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey string to get the element degrees of freedom numbers + * @param[in] hasCapPressure flag specifying whether capillary pressure is used or not + * @param[in] solverName name of the solver (to name accessors) + * @param[in] elemManager reference to the element region manager + * @param[in] stencilWrapper reference to the stencil wrapper + * @param[in] dt time step size + * @param[inout] localMatrix the local CRS matrix + * @param[inout] localRhs the local right-hand side vector + */ + template< typename POLICY, typename STENCILWRAPPER > + static void + createAndLaunch( integer const numComps, + integer const numPhases, + globalIndex const rankOffset, + string const & dofKey, + integer const hasCapPressure, + integer const useTotalMassEquation, + string const & solverName, + ElementRegionManager const & elemManager, + STENCILWRAPPER const & stencilWrapper, + real64 const dt, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) + { + isothermalCompositionalMultiphaseBaseKernels:: + internal::kernelLaunchSelectorCompSwitch( numComps, [&]( auto NC ) + { + integer constexpr NUM_COMP = NC(); + integer constexpr NUM_DOF = NC() + 2; + + ElementRegionManager::ElementViewAccessor< arrayView1d< globalIndex const > > dofNumberAccessor = + elemManager.constructArrayViewAccessor< globalIndex, 1 >( dofKey ); + dofNumberAccessor.setName( solverName + "/accessors/" + dofKey ); + + BitFlags< isothermalCompositionalMultiphaseFVMKernels::KernelFlags > kernelFlags; + if( hasCapPressure ) + kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::KernelFlags::CapPressure ); + if( useTotalMassEquation ) + kernelFlags.set( isothermalCompositionalMultiphaseFVMKernels::KernelFlags::TotalMassEquation ); + + using KernelType = FluxComputeKernel< NUM_COMP, NUM_DOF, STENCILWRAPPER >; + typename KernelType::CompFlowAccessors compFlowAccessors( elemManager, solverName ); + typename KernelType::ThermalCompFlowAccessors thermalCompFlowAccessors( elemManager, solverName ); + typename KernelType::MultiFluidAccessors multiFluidAccessors( elemManager, solverName ); + typename KernelType::ThermalMultiFluidAccessors thermalMultiFluidAccessors( elemManager, solverName ); + typename KernelType::CapPressureAccessors capPressureAccessors( elemManager, solverName ); + typename KernelType::PermeabilityAccessors permeabilityAccessors( elemManager, solverName ); + typename KernelType::ThermalConductivityAccessors thermalConductivityAccessors( elemManager, solverName ); + + KernelType kernel( numPhases, rankOffset, stencilWrapper, dofNumberAccessor, + compFlowAccessors, thermalCompFlowAccessors, multiFluidAccessors, thermalMultiFluidAccessors, + capPressureAccessors, permeabilityAccessors, thermalConductivityAccessors, + dt, localMatrix, localRhs, kernelFlags ); + KernelType::template launch< POLICY >( stencilWrapper.size(), kernel ); + } ); + } +}; + +} // namespace thermalCompositionalMultiphaseFVMKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALFLUXCOMPUTEKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp new file mode 100644 index 00000000000..f6be6b2cf55 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp @@ -0,0 +1,154 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ThermalPhaseMobilityKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALPHASEMOBILITYKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALPHASEMOBILITYKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp" + +namespace geos +{ + +namespace thermalCompositionalMultiphaseFVMKernels +{ + +/******************************** PhaseMobilityKernel ********************************/ + +/** + * @class PhaseMobilityKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_PHASE number of fluid phases + * @brief Define the interface for the property kernel in charge of computing the phase mobilities + */ +template< integer NUM_COMP, integer NUM_PHASE > +class PhaseMobilityKernel : public isothermalCompositionalMultiphaseFVMKernels::PhaseMobilityKernel< NUM_COMP, NUM_PHASE > +{ +public: + + using Base = isothermalCompositionalMultiphaseFVMKernels::PhaseMobilityKernel< NUM_COMP, NUM_PHASE >; + using Base::numPhase; + using Base::m_dPhaseVolFrac; + using Base::m_dPhaseMob; + using Base::m_phaseDens; + using Base::m_dPhaseDens; + using Base::m_phaseVisc; + using Base::m_dPhaseVisc; + using Base::m_dPhaseRelPerm_dPhaseVolFrac; + + /** + * @brief Constructor + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] relperm the relperm model + */ + PhaseMobilityKernel( ObjectManagerBase & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::RelativePermeabilityBase const & relperm ) + : Base( subRegion, fluid, relperm ) + {} + + /** + * @brief Compute the phase mobilities in an element + * @param[in] ei the element index + */ + GEOS_HOST_DEVICE + inline + void compute( localIndex const ei ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseDens = m_phaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; + arraySlice1d< real64 const, constitutive::multifluid::USD_PHASE - 2 > const phaseVisc = m_phaseVisc[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseVisc = m_dPhaseVisc[ei][0]; + arraySlice2d< real64 const, constitutive::relperm::USD_RELPERM_DS - 2 > const dPhaseRelPerm_dPhaseVolFrac = m_dPhaseRelPerm_dPhaseVolFrac[ei][0]; + arraySlice2d< real64 const, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; + + Base::compute( ei, [&] ( localIndex const ip, + real64 const & phaseMob, + arraySlice1d< real64, compflow::USD_PHASE_DC - 2 > const & dPhaseMob ) + { + // Step 1: compute the derivative of relPerm[ip] wrt temperature + real64 dRelPerm_dT = 0.0; + for( integer jp = 0; jp < numPhase; ++jp ) + { + dRelPerm_dT += dPhaseRelPerm_dPhaseVolFrac[ip][jp] * dPhaseVolFrac[jp][Deriv::dT]; + } + + // Step 2: compute the derivative of phaseMob[ip] wrt temperature + dPhaseMob[Deriv::dT] = dRelPerm_dT * phaseDens[ip] / phaseVisc[ip] + + phaseMob * (dPhaseDens[ip][Deriv::dT] / phaseDens[ip] - dPhaseVisc[ip][Deriv::dT] / phaseVisc[ip] ); + } ); + } + +}; + +/** + * @class PhaseMobilityKernelFactory + */ +class PhaseMobilityKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComp the number of fluid components + * @param[in] numPhase the number of fluid phases + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] relperm the relperm model + */ + template< typename POLICY > + static void + createAndLaunch( integer const numComp, + integer const numPhase, + ObjectManagerBase & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::RelativePermeabilityBase const & relperm ) + { + if( numPhase == 2 ) + { + isothermalCompositionalMultiphaseBaseKernels:: + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + integer constexpr NUM_COMP = NC(); + PhaseMobilityKernel< NUM_COMP, 2 > kernel( subRegion, fluid, relperm ); + PhaseMobilityKernel< NUM_COMP, 2 >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + else if( numPhase == 3 ) + { + isothermalCompositionalMultiphaseBaseKernels:: + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + integer constexpr NUM_COMP = NC(); + PhaseMobilityKernel< NUM_COMP, 3 > kernel( subRegion, fluid, relperm ); + PhaseMobilityKernel< NUM_COMP, 3 >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + } +}; + +} // namespace thermalCompositionalMultiphaseFVMKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALPHASEMOBILITYKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseVolumeFractionKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseVolumeFractionKernel.hpp new file mode 100644 index 00000000000..375fecd1cea --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseVolumeFractionKernel.hpp @@ -0,0 +1,140 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ThermalPhaseVolumeFractionKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALPHASEVOLUMEFRACTIONKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALPHASEVOLUMEFRACTIONKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp" + +namespace geos +{ + +namespace thermalCompositionalMultiphaseBaseKernels +{ + +/******************************** PhaseVolumeFractionKernel ********************************/ + +/** + * @class PhaseVolumeFractionKernel + * @tparam NUM_COMP number of fluid components + * @tparam NUM_PHASE number of fluid phases + * @brief Define the interface for the property kernel in charge of computing the phase volume fractions + */ +template< integer NUM_COMP, integer NUM_PHASE > +class PhaseVolumeFractionKernel : public isothermalCompositionalMultiphaseBaseKernels::PhaseVolumeFractionKernel< NUM_COMP, NUM_PHASE > +{ +public: + + using Base = isothermalCompositionalMultiphaseBaseKernels::PhaseVolumeFractionKernel< NUM_COMP, NUM_PHASE >; + using Base::m_dPhaseDens; + using Base::m_dPhaseFrac; + using Base::m_dPhaseVolFrac; + + /** + * @brief Constructor + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + */ + PhaseVolumeFractionKernel( ObjectManagerBase & subRegion, + constitutive::MultiFluidBase const & fluid ) + : Base( subRegion, fluid ) + {} + + /** + * @brief Compute the phase volume fractions in an element + * @param[in] ei the element index + */ + GEOS_HOST_DEVICE + real64 compute( localIndex const ei ) const + { + using Deriv = constitutive::multifluid::DerivativeOffset; + + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseDens = m_dPhaseDens[ei][0]; + arraySlice2d< real64 const, constitutive::multifluid::USD_PHASE_DC - 2 > const dPhaseFrac = m_dPhaseFrac[ei][0]; + + arraySlice2d< real64, compflow::USD_PHASE_DC - 1 > const dPhaseVolFrac = m_dPhaseVolFrac[ei]; + + // Call the base compute the compute the phase volume fraction + return Base::compute( ei, [&] ( localIndex const ip, + real64 const & phaseVolFrac, + real64 const & phaseDensInv, + real64 const & totalDensity ) + { + // when this lambda is called, we are in the phase loop + // for each phase ip, compute the derivative of phase volume fraction wrt temperature + dPhaseVolFrac[ip][Deriv::dT] = (dPhaseFrac[ip][Deriv::dT] - phaseVolFrac * dPhaseDens[ip][Deriv::dT]) * phaseDensInv; + dPhaseVolFrac[ip][Deriv::dT] *= totalDensity; + } ); + } + +}; + +/** + * @class PhaseVolumeFractionKernelFactory + */ +class PhaseVolumeFractionKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] numComp the number of fluid components + * @param[in] numPhase the number of fluid phases + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + */ + template< typename POLICY > + static real64 + createAndLaunch( integer const numComp, + integer const numPhase, + ObjectManagerBase & subRegion, + constitutive::MultiFluidBase const & fluid ) + { + real64 maxDeltaPhaseVolFrac = 0.0; + if( numPhase == 2 ) + { + isothermalCompositionalMultiphaseBaseKernels:: + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + integer constexpr NUM_COMP = NC(); + PhaseVolumeFractionKernel< NUM_COMP, 2 > kernel( subRegion, fluid ); + maxDeltaPhaseVolFrac = PhaseVolumeFractionKernel< NUM_COMP, 2 >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + else if( numPhase == 3 ) + { + isothermalCompositionalMultiphaseBaseKernels:: + internal::kernelLaunchSelectorCompSwitch( numComp, [&] ( auto NC ) + { + integer constexpr NUM_COMP = NC(); + PhaseVolumeFractionKernel< NUM_COMP, 3 > kernel( subRegion, fluid ); + maxDeltaPhaseVolFrac = PhaseVolumeFractionKernel< NUM_COMP, 3 >::template launch< POLICY >( subRegion.size(), kernel ); + } ); + } + return maxDeltaPhaseVolFrac; + } +}; + +} // namespace thermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALPHASEVOLUMEFRACTIONKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalResidualNormKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalResidualNormKernel.hpp new file mode 100644 index 00000000000..7dbb7bab2f9 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalResidualNormKernel.hpp @@ -0,0 +1,241 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ThermalResidualNormKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALRESIDUALNORMKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALRESIDUALNORMKERNEL_HPP + +#include "physicsSolvers/PhysicsSolverBaseKernels.hpp" + +namespace geos +{ + +namespace thermalCompositionalMultiphaseBaseKernels +{ + +/******************************** ResidualNormKernel ********************************/ + +/** + * @class ResidualNormKernel + */ +class ResidualNormKernel : public physicsSolverBaseKernels::ResidualNormKernelBase< 3 > +{ +public: + + using Base = ResidualNormKernelBase< 3 >; + using Base::m_minNormalizer; + using Base::m_rankOffset; + using Base::m_localResidual; + using Base::m_dofNumber; + + ResidualNormKernel( globalIndex const rankOffset, + arrayView1d< real64 const > const & localResidual, + arrayView1d< globalIndex const > const & dofNumber, + arrayView1d< localIndex const > const & ghostRank, + integer const numComponents, + integer const numPhases, + ElementSubRegionBase const & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + constitutive::SolidInternalEnergy const & solidInternalEnergy, + real64 const minNormalizer ) + : Base( rankOffset, + localResidual, + dofNumber, + ghostRank, + minNormalizer ), + m_numComponents( numComponents ), + m_numPhases( numPhases ), + m_volume( subRegion.getElementVolume() ), + m_porosity_n( solid.getPorosity_n() ), + m_phaseVolFrac_n( subRegion.getField< fields::flow::phaseVolumeFraction_n >() ), + m_totalDens_n( fluid.totalDensity_n() ), + m_phaseDens_n( fluid.phaseDensity_n() ), + m_phaseInternalEnergy_n( fluid.phaseInternalEnergy_n() ), + m_solidInternalEnergy_n( solidInternalEnergy.getInternalEnergy_n() ) + {} + + GEOS_HOST_DEVICE + void computeMassEnergyNormalizers( localIndex const ei, + real64 & massNormalizer, + real64 & energyNormalizer ) const + { + massNormalizer = LvArray::math::max( m_minNormalizer, m_totalDens_n[ei][0] * m_porosity_n[ei][0] * m_volume[ei] ); + real64 const poreVolume = m_porosity_n[ei][0] * m_volume[ei]; + energyNormalizer = m_solidInternalEnergy_n[ei][0] * ( 1.0 - m_porosity_n[ei][0] ) * m_volume[ei]; + for( integer ip = 0; ip < m_numPhases; ++ip ) + { + energyNormalizer += m_phaseInternalEnergy_n[ei][0][ip] * m_phaseDens_n[ei][0][ip] * m_phaseVolFrac_n[ei][ip] * poreVolume; + } + // warning: internal energy can be negative + energyNormalizer = LvArray::math::max( m_minNormalizer, LvArray::math::abs( energyNormalizer ) ); + } + + GEOS_HOST_DEVICE + virtual void computeLinf( localIndex const ei, + LinfStackVariables & stack ) const override + { + real64 massNormalizer = 0.0, energyNormalizer = 0.0; + computeMassEnergyNormalizers( ei, massNormalizer, energyNormalizer ); + real64 const volumeNormalizer = LvArray::math::max( m_minNormalizer, m_porosity_n[ei][0] * m_volume[ei] ); + + // step 1: mass residual + + for( integer idof = 0; idof < m_numComponents; ++idof ) + { + real64 const valMass = LvArray::math::abs( m_localResidual[stack.localRow + idof] ) / massNormalizer; + if( valMass > stack.localValue[0] ) + { + stack.localValue[0] = valMass; + } + } + + // step 2: volume residual + + real64 const valVol = LvArray::math::abs( m_localResidual[stack.localRow + m_numComponents] ) / volumeNormalizer; + if( valVol > stack.localValue[1] ) + { + stack.localValue[1] = valVol; + } + + // step 3: energy residual + + real64 const valEnergy = LvArray::math::abs( m_localResidual[stack.localRow + m_numComponents + 1] ) / energyNormalizer; + if( valEnergy > stack.localValue[2] ) + { + stack.localValue[2] = valEnergy; + } + } + + GEOS_HOST_DEVICE + virtual void computeL2( localIndex const ei, + L2StackVariables & stack ) const override + { + // note: for the L2 norm, we bundle the volume and mass residuals/normalizers + real64 massNormalizer = 0.0, energyNormalizer = 0.0; + computeMassEnergyNormalizers( ei, massNormalizer, energyNormalizer ); + + // step 1: mass residual + + for( integer idof = 0; idof < m_numComponents; ++idof ) + { + stack.localValue[0] += m_localResidual[stack.localRow + idof] * m_localResidual[stack.localRow + idof]; + stack.localNormalizer[0] += massNormalizer; + } + + // step 2: volume residual + + real64 const valVol = m_localResidual[stack.localRow + m_numComponents] * m_totalDens_n[ei][0]; // we need a mass here, hence the + // multiplication + stack.localValue[1] += valVol * valVol; + stack.localNormalizer[1] += massNormalizer; + + // step 3: energy residual + + stack.localValue[2] += m_localResidual[stack.localRow + m_numComponents + 1] * m_localResidual[stack.localRow + m_numComponents + 1]; + stack.localNormalizer[2] += energyNormalizer; + } + +protected: + + /// Number of fluid components + integer const m_numComponents; + + /// Number of fluid phases + integer const m_numPhases; + + /// View on the volume + arrayView1d< real64 const > const m_volume; + + /// View on porosity at the previous converged time step + arrayView2d< real64 const > const m_porosity_n; + + /// View on phase properties at the previous converged time step + arrayView2d< real64 const, compflow::USD_PHASE > const m_phaseVolFrac_n; + arrayView2d< real64 const, constitutive::multifluid::USD_FLUID > const m_totalDens_n; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseDens_n; + arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > const m_phaseInternalEnergy_n; + + /// View on solid properties at the previous converged time step + arrayView2d< real64 const > const m_solidInternalEnergy_n; + +}; + +/** + * @class ResidualNormKernelFactory + */ +class ResidualNormKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] normType the type of norm used (Linf or L2) + * @param[in] numComps the number of fluid components + * @param[in] numPhases the number of fluid phases + * @param[in] rankOffset the offset of my MPI rank + * @param[in] dofKey the string key to retrieve the degress of freedom numbers + * @param[in] localResidual the residual vector on my MPI rank + * @param[in] subRegion the element subregion + * @param[in] fluid the fluid model + * @param[in] solid the solid model + * @param[in] solidInternalEnergy the solid internal energy model + * @param[out] residualNorm the residual norm on the subRegion + * @param[out] residualNormalizer the residual normalizer on the subRegion + */ + template< typename POLICY > + static void + createAndLaunch( physicsSolverBaseKernels::NormType const normType, + integer const numComps, + integer const numPhases, + globalIndex const rankOffset, + string const & dofKey, + arrayView1d< real64 const > const & localResidual, + ElementSubRegionBase const & subRegion, + constitutive::MultiFluidBase const & fluid, + constitutive::CoupledSolidBase const & solid, + constitutive::SolidInternalEnergy const & solidInternalEnergy, + real64 const minNormalizer, + real64 (& residualNorm)[3], + real64 (& residualNormalizer)[3] ) + { + arrayView1d< globalIndex const > const dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); + arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); + + ResidualNormKernel kernel( rankOffset, localResidual, dofNumber, ghostRank, + numComps, numPhases, subRegion, fluid, solid, solidInternalEnergy, minNormalizer ); + if( normType == physicsSolverBaseKernels::NormType::Linf ) + { + ResidualNormKernel::launchLinf< POLICY >( subRegion.size(), kernel, residualNorm ); + } + else // L2 norm + { + ResidualNormKernel::launchL2< POLICY >( subRegion.size(), kernel, residualNorm, residualNormalizer ); + } + + } +}; + + +} // namespace thermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALRESIDUALNORMKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionCheckKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionCheckKernel.hpp new file mode 100644 index 00000000000..57007c9f673 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionCheckKernel.hpp @@ -0,0 +1,181 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ThermalSolutionCheckKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALSOLUTIONCHECKKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALSOLUTIONCHECKKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp" + +namespace geos +{ + +namespace thermalCompositionalMultiphaseBaseKernels +{ + +/******************************** SolutionCheckKernel ********************************/ + +/** + * @class SolutionCheckKernel + * @brief Define the kernel for checking the updated solution + */ +class SolutionCheckKernel : public isothermalCompositionalMultiphaseBaseKernels::SolutionCheckKernel +{ +public: + + using Base = isothermalCompositionalMultiphaseBaseKernels::SolutionCheckKernel; + using Base::m_numComp; + using Base::m_localSolution; + using Base::m_scalingFactor; + + static real64 constexpr minTemperature = constants::zeroDegreesCelsiusInKelvin; + + /** + * @brief Create a new kernel instance + * @param[in] allowCompDensChopping flag to allow the component density chopping + * @param[in] scalingFactor the scaling factor + * @param[in] rankOffset the rank offset + * @param[in] numComp the number of components + * @param[in] dofKey the dof key to get dof numbers + * @param[in] subRegion the subRegion + * @param[in] localSolution the Newton update + * @param[in] pressure the pressure vector + * @param[in] temperature the temperature vector + * @param[in] compDens the component density vector + */ + SolutionCheckKernel( integer const allowCompDensChopping, + integer const allowNegativePressure, + CompositionalMultiphaseFVM::ScalingType const scalingType, + real64 const scalingFactor, + arrayView1d< real64 const > const pressure, + arrayView1d< real64 const > const temperature, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, + arrayView1d< real64 > temperatureScalingFactor, + globalIndex const rankOffset, + integer const numComp, + string const dofKey, + ElementSubRegionBase const & subRegion, + arrayView1d< real64 const > const localSolution, + integer const temperatureOffset ) + : Base( allowCompDensChopping, + allowNegativePressure, + scalingType, + scalingFactor, + pressure, + compDens, + pressureScalingFactor, + compDensScalingFactor, + rankOffset, + numComp, + dofKey, + subRegion, + localSolution ), + m_temperature( temperature ), + m_temperatureScalingFactor( temperatureScalingFactor ), + m_temperatureOffset( temperatureOffset ) + {} + + /** + * @brief Compute the local value of the solution check + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void computeSolutionCheck( localIndex const ei, + StackVariables & stack ) const + { + Base::computeSolutionCheck( ei, stack, [&] () + { + bool const localScaling = m_scalingType == CompositionalMultiphaseFVM::ScalingType::Local; + // compute the change in temperature + real64 const newTemp = m_temperature[ei] + (localScaling ? m_temperatureScalingFactor[ei] : m_scalingFactor * m_localSolution[stack.localRow + m_temperatureOffset]); + if( newTemp < minTemperature ) + { + stack.localMinVal = 0; + } + } ); + } + +protected: + + /// View on the primary variables + arrayView1d< real64 const > const m_temperature; + + /// View on the scaling factor + arrayView1d< real64 const > const m_temperatureScalingFactor; + + /// Offset to temperature variable + integer m_temperatureOffset; + +}; + +/** + * @class SolutionCheckKernelFactory + */ +class SolutionCheckKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxRelativeTempChange the max allowed relative temperature change + * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] rankOffset the rank offset + * @param[in] numComp the number of components + * @param[in] dofKey the dof key to get dof numbers + * @param[in] subRegion the subRegion + * @param[in] localSolution the Newton update + */ + template< typename POLICY > + static SolutionCheckKernel::StackVariables + createAndLaunch( integer const allowCompDensChopping, + integer const allowNegativePressure, + CompositionalMultiphaseFVM::ScalingType const scalingType, + real64 const scalingFactor, + arrayView1d< real64 const > const pressure, + arrayView1d< real64 const > const temperature, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > temperatureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, + globalIndex const rankOffset, + integer const numComp, + string const dofKey, + ElementSubRegionBase & subRegion, + arrayView1d< real64 const > const localSolution, + integer temperatureOffset ) + { + SolutionCheckKernel kernel( allowCompDensChopping, allowNegativePressure, scalingType, scalingFactor, + pressure, temperature, compDens, pressureScalingFactor, compDensScalingFactor, temperatureScalingFactor, + rankOffset, numComp, dofKey, subRegion, localSolution, + temperatureOffset ); + return SolutionCheckKernel::launch< POLICY >( subRegion.size(), kernel ); + } + +}; + +} // namespace thermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALSOLUTIONCHECKKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp new file mode 100644 index 00000000000..00af7a5eca4 --- /dev/null +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp @@ -0,0 +1,226 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ThermalSolutionScalingKernel.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALSOLUTIONSCALINGKERNEL_HPP +#define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALSOLUTIONSCALINGKERNEL_HPP + +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp" + +namespace geos +{ + +namespace thermalCompositionalMultiphaseBaseKernels +{ + +/******************************** SolutionScalingKernel ********************************/ + +/** + * @class SolutionScalingKernel + * @brief Define the kernel for scaling the Newton update + */ +class SolutionScalingKernel : public isothermalCompositionalMultiphaseBaseKernels::SolutionScalingKernel +{ +public: + + using Base = isothermalCompositionalMultiphaseBaseKernels::SolutionScalingKernel; + using Base::m_numComp; + using Base::m_localSolution; + + /** + * @brief Create a new kernel instance + * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change + * @param[in] maxRelativeTempChange the max allowed relative temperature change + * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompDensChange the max allowed comp density change + * @param[in] rankOffset the rank offset + * @param[in] numComp the number of components + * @param[in] dofKey the dof key to get dof numbers + * @param[in] subRegion the subRegion + * @param[in] localSolution the Newton update + * @param[in] pressure the pressure vector + * @param[in] temperature the temperature vector + * @param[in] compDens the component density vector + * @param[in] pressureScalingFactor the pressure local scaling factor + * @param[in] compDensScalingFactor the component density local scaling factor + * @param[in] temperatureFactor the temperature local scaling factor + */ + SolutionScalingKernel( real64 const maxRelativePresChange, + real64 const maxAbsolutePresChange, + real64 const maxRelativeTempChange, + real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, + globalIndex const rankOffset, + integer const numComp, + string const dofKey, + ElementSubRegionBase const & subRegion, + arrayView1d< real64 const > const localSolution, + arrayView1d< real64 const > const pressure, + arrayView1d< real64 const > const temperature, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, + arrayView1d< real64 > temperatureScalingFactor, + integer const temperatureOffset ) + : Base( maxRelativePresChange, + maxAbsolutePresChange, + maxCompFracChange, + maxRelativeCompDensChange, + rankOffset, + numComp, + dofKey, + subRegion, + localSolution, + pressure, + compDens, + pressureScalingFactor, + compDensScalingFactor ), + m_maxRelativeTempChange( maxRelativeTempChange ), + m_temperature( temperature ), + m_temperatureScalingFactor( temperatureScalingFactor ), + m_temperatureOffset( temperatureOffset ) + {} + + /** + * @brief Compute the local value + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void compute( localIndex const ei, + StackVariables & stack ) const + { + computeScalingFactor( ei, stack ); + } + + /** + * @brief Compute the local value of the scaling factor + * @param[in] ei the element index + * @param[inout] stack the stack variables + */ + GEOS_HOST_DEVICE + void computeScalingFactor( localIndex const ei, + StackVariables & stack ) const + { + real64 constexpr eps = isothermalCompositionalMultiphaseBaseKernels::minDensForDivision; + Base::computeScalingFactor( ei, stack, [&] () + { + // compute the change in temperature + real64 const temp = m_temperature[ei]; + real64 const absTempChange = LvArray::math::abs( m_localSolution[stack.localRow + m_temperatureOffset] ); + if( stack.localMaxDeltaTemp < absTempChange ) + { + stack.localMaxDeltaTemp = absTempChange; + } + + m_temperatureScalingFactor[ei] = 1.0; + + if( temp > eps ) + { + real64 const relativeTempChange = absTempChange / temp; + if( relativeTempChange > m_maxRelativeTempChange ) + { + real64 const tempScalingFactor = m_maxRelativeTempChange / relativeTempChange; + m_temperatureScalingFactor[ei] = tempScalingFactor; + if( stack.localMinVal > tempScalingFactor ) + { + stack.localMinVal = tempScalingFactor; + } + if( stack.localMinTempScalingFactor > tempScalingFactor ) + { + stack.localMinTempScalingFactor = tempScalingFactor; + } + } + } + } ); + } + +protected: + + /// Max allowed changes in primary variables + real64 const m_maxRelativeTempChange; + + /// View on the primary variables + arrayView1d< real64 const > const m_temperature; + + /// View on the scaling factor + arrayView1d< real64 > const m_temperatureScalingFactor; + + /// Temperature offset in solution array + integer const m_temperatureOffset; +}; + +/** + * @class SolutionScalingKernelFactory + */ +class SolutionScalingKernelFactory +{ +public: + + /** + * @brief Create a new kernel and launch + * @tparam POLICY the policy used in the RAJA kernel + * @param[in] maxRelativePresChange the max allowed relative pressure change + * @param[in] maxAbsolutePresChange the max allowed absolute pressure change + * @param[in] maxRelativeTempChange the max allowed relative temperature change + * @param[in] maxCompFracChange the max allowed comp fraction change + * @param[in] maxRelativeCompdensChange the max allowed relative component density change + * @param[in] rankOffset the rank offset + * @param[in] numComp the number of components + * @param[in] dofKey the dof key to get dof numbers + * @param[in] subRegion the subRegion + * @param[in] localSolution the Newton update + */ + template< typename POLICY > + static SolutionScalingKernel::StackVariables + createAndLaunch( real64 const maxRelativePresChange, + real64 const maxAbsolutePresChange, + real64 const maxRelativeTempChange, + real64 const maxCompFracChange, + real64 const maxRelativeCompDensChange, + arrayView1d< real64 const > const pressure, + arrayView1d< real64 const > const temperature, + arrayView2d< real64 const, compflow::USD_COMP > const compDens, + arrayView1d< real64 > pressureScalingFactor, + arrayView1d< real64 > compDensScalingFactor, + arrayView1d< real64 > temperatureScalingFactor, + globalIndex const rankOffset, + integer const numComp, + string const dofKey, + ElementSubRegionBase & subRegion, + arrayView1d< real64 const > const localSolution, + integer const temperatureOffset ) + { + SolutionScalingKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxRelativeTempChange, + maxCompFracChange, maxRelativeCompDensChange, + rankOffset, numComp, dofKey, subRegion, localSolution, + pressure, temperature, compDens, pressureScalingFactor, + compDensScalingFactor, temperatureScalingFactor, temperatureOffset ); + return thermalCompositionalMultiphaseBaseKernels:: + SolutionScalingKernel::launch< POLICY >( subRegion.size(), kernel ); + } + +}; + +} // namespace thermalCompositionalMultiphaseBaseKernels + +} // namespace geos + + +#endif //GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_THERMALSOLUTIONSCALINGKERNEL_HPP diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 40257ddf2fd..95f59c179ec 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -42,9 +42,16 @@ #include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/kernels/PerforationFluxKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalCompositionalMultiphaseBaseKernels.hpp" -#include "physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionCheckKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseVolumeFractionKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/FluidUpdateKernel.hpp" #if defined( __INTEL_COMPILER ) #pragma GCC optimize "O0" @@ -1386,7 +1393,7 @@ CompositionalMultiphaseWell::scalingForSystemSolution( DomainPartition & domain, auto const subRegionData = m_isThermal ? thermalCompositionalMultiphaseBaseKernels:: - ScalingForSystemSolutionKernelFactory:: + SolutionScalingKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxRelativeTempChange, @@ -1405,7 +1412,7 @@ CompositionalMultiphaseWell::scalingForSystemSolution( DomainPartition & domain, localSolution, temperatureOffset ) : isothermalCompositionalMultiphaseBaseKernels:: - ScalingForSystemSolutionKernelFactory:: + SolutionScalingKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_maxRelativePresChange, m_maxAbsolutePresChange, m_maxCompFracChange, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp index c82ea94e590..1ca6ebac997 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp @@ -33,7 +33,10 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/IsothermalCompositionalMultiphaseBaseKernels.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp" #include "physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp" @@ -731,12 +734,12 @@ class ResidualNormKernelFactory }; -/******************************** ScalingForSystemSolutionKernel ********************************/ +/******************************** SolutionScalingKernel ********************************/ /** - * @class ScalingForSystemSolutionKernelFactory + * @class SolutionScalingKernelFactory */ -class ScalingForSystemSolutionKernelFactory +class SolutionScalingKernelFactory { public: @@ -754,7 +757,7 @@ class ScalingForSystemSolutionKernelFactory * @param[in] localSolution the Newton update */ template< typename POLICY > - static isothermalCompositionalMultiphaseBaseKernels::ScalingForSystemSolutionKernel::StackVariables + static isothermalCompositionalMultiphaseBaseKernels::SolutionScalingKernel::StackVariables createAndLaunch( real64 const maxRelativePresChange, real64 const maxAbsolutePresChange, real64 const maxCompFracChange, @@ -774,10 +777,10 @@ class ScalingForSystemSolutionKernelFactory arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::well::globalCompDensityScalingFactor >(); isothermalCompositionalMultiphaseBaseKernels:: - ScalingForSystemSolutionKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, maxRelativeCompDensChange, rankOffset, - numComp, dofKey, subRegion, localSolution, pressure, compDens, pressureScalingFactor, compDensScalingFactor ); + SolutionScalingKernel kernel( maxRelativePresChange, maxAbsolutePresChange, maxCompFracChange, maxRelativeCompDensChange, rankOffset, + numComp, dofKey, subRegion, localSolution, pressure, compDens, pressureScalingFactor, compDensScalingFactor ); return isothermalCompositionalMultiphaseBaseKernels:: - ScalingForSystemSolutionKernel:: + SolutionScalingKernel:: launch< POLICY >( subRegion.size(), kernel ); } @@ -879,7 +882,7 @@ class ElementBasedAssemblyKernel constitutive::MultiFluidBase const & fluid, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs, - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > const kernelFlags ) + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > const kernelFlags ) : m_numPhases( numPhases ), m_isProducer( isProducer ), m_rankOffset( rankOffset ), @@ -1192,7 +1195,7 @@ class ElementBasedAssemblyKernel } } - if( m_kernelFlags.isSet( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ) ) + if( m_kernelFlags.isSet( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation ) ) { // apply equation/variable change transformation to the component mass balance equations real64 work[numComp + 1 + IS_THERMAL]{}; @@ -1301,7 +1304,7 @@ class ElementBasedAssemblyKernel /// View on the local RHS arrayView1d< real64 > const m_localRhs; - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > const m_kernelFlags; + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > const m_kernelFlags; }; @@ -1342,9 +1345,9 @@ class ElementBasedAssemblyKernelFactory integer constexpr istherm = IS_THERMAL(); - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags; if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation ); ElementBasedAssemblyKernel< NUM_COMP, istherm > kernel( numPhases, isProducer, rankOffset, dofKey, subRegion, fluid, localMatrix, localRhs, kernelFlags ); @@ -1407,7 +1410,7 @@ class FaceBasedAssemblyKernel WellElementSubRegion const & subRegion, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs, - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags ) + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags ) : m_dt( dt ), m_rankOffset( rankOffset ), @@ -1418,7 +1421,7 @@ class FaceBasedAssemblyKernel m_dWellElemCompFrac_dCompDens ( subRegion.getField< fields::well::dGlobalCompFraction_dGlobalCompDensity >() ), m_localMatrix( localMatrix ), m_localRhs ( localRhs ), - m_useTotalMassEquation ( kernelFlags.isSet( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ) ), + m_useTotalMassEquation ( kernelFlags.isSet( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation ) ), m_isProducer ( wellControls.isProducer() ), m_injection ( wellControls.getInjectionStream() ) {} @@ -1898,9 +1901,9 @@ class FaceBasedAssemblyKernelFactory integer constexpr NUM_COMP = NC(); - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags; if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation ); using kernelType = FaceBasedAssemblyKernel< NUM_COMP, 0 >; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp index bbef327079f..3c3b9a2b9d6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp @@ -482,7 +482,7 @@ class ElementBasedAssemblyKernel : public compositionalMultiphaseWellKernels::El MultiFluidBase const & fluid, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs, - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > const kernelFlags ) + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > const kernelFlags ) : Base( numPhases, isProducer, rankOffset, dofKey, subRegion, fluid, localMatrix, localRhs, kernelFlags ), m_phaseInternalEnergy_n( fluid.phaseInternalEnergy_n()), m_phaseInternalEnergy( fluid.phaseInternalEnergy()), @@ -650,9 +650,9 @@ class ElementBasedAssemblyKernelFactory localIndex constexpr NUM_COMP = NC(); - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags; if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation ); ElementBasedAssemblyKernel< NUM_COMP > kernel( numPhases, isProducer, rankOffset, dofKey, subRegion, fluid, localMatrix, localRhs, kernelFlags ); @@ -722,7 +722,7 @@ class FaceBasedAssemblyKernel : public compositionalMultiphaseWellKernels::FaceB MultiFluidBase const & fluid, CRSMatrixView< real64, globalIndex const > const & localMatrix, arrayView1d< real64 > const & localRhs, - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags ) + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags ) : Base( dt , rankOffset , wellDofKey @@ -1101,9 +1101,9 @@ class FaceBasedAssemblyKernelFactory integer constexpr NUM_COMP = NC(); - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags; if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation ); using kernelType = FaceBasedAssemblyKernel< NUM_COMP >; diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp index 9899606e970..6aba3bc91f3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp @@ -94,7 +94,7 @@ class IsothermalCompositionalMultiPhaseFluxKernel CRSMatrixView< real64, globalIndex const > const & localMatrix, bool const & detectCrossflow, integer & numCrossFlowPerforations, - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags ) + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags ) : m_dt( dt ), m_numPhases ( fluid.numFluidPhases()), @@ -111,7 +111,7 @@ class IsothermalCompositionalMultiPhaseFluxKernel m_localMatrix( localMatrix ), m_detectCrossflow( detectCrossflow ), m_numCrossFlowPerforations( numCrossFlowPerforations ), - m_useTotalMassEquation ( kernelFlags.isSet( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ) ) + m_useTotalMassEquation ( kernelFlags.isSet( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation ) ) { } @@ -317,9 +317,9 @@ class IsothermalCompositionalMultiPhaseFluxKernelFactory integer constexpr NUM_COMP = NC(); - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags; if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation ); using kernelType = IsothermalCompositionalMultiPhaseFluxKernel< NUM_COMP, 0 >; @@ -397,7 +397,7 @@ class ThermalCompositionalMultiPhaseFluxKernel : public IsothermalCompositionalM CRSMatrixView< real64, globalIndex const > const & localMatrix, bool const & detectCrossflow, integer & numCrossFlowPerforations, - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags ) + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags ) : Base( dt, rankOffset, wellDofKey, @@ -570,9 +570,9 @@ class ThermalCompositionalMultiPhaseFluxKernelFactory integer constexpr NUM_COMP = NC(); - BitFlags< isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags > kernelFlags; + BitFlags< isothermalCompositionalMultiphaseBaseKernels::KernelFlags > kernelFlags; if( useTotalMassEquation ) - kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::ElementBasedAssemblyKernelFlags::TotalMassEquation ); + kernelFlags.set( isothermalCompositionalMultiphaseBaseKernels::KernelFlags::TotalMassEquation ); using kernelType = ThermalCompositionalMultiPhaseFluxKernel< NUM_COMP, 1 >; diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp index 5befe3e9aa7..d2a2b413126 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp @@ -269,7 +269,7 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FluxComputeKe /** - * @class FaceBasedAssemblyKernelFactory + * @class ConnectorBasedAssemblyKernelFactory */ class ConnectorBasedAssemblyKernelFactory { diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp index 654ee0b3594..2cb1dec4ecc 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -239,7 +239,7 @@ class ConnectorBasedAssemblyKernel : public singlePhaseFVMKernels::FluxComputeKe /** - * @class FaceBasedAssemblyKernelFactory + * @class ConnectorBasedAssemblyKernelFactory */ class ConnectorBasedAssemblyKernelFactory { diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp index e82a918fa09..c9eb1dcafaf 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp @@ -332,7 +332,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsConformingFr /** - * @class FaceBasedAssemblyKernelFactory + * @class ConnectorBasedAssemblyKernelFactory */ class ConnectorBasedAssemblyKernelFactory { diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp index 1b39b1b44cb..03690cbf27d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp @@ -343,7 +343,7 @@ class ConnectorBasedAssemblyKernel : public singlePhasePoromechanicsEmbeddedFrac /** - * @class FaceBasedAssemblyKernelFactory + * @class ConnectorBasedAssemblyKernelFactory */ class ConnectorBasedAssemblyKernelFactory { From 1c896193b5dab945dc9ebdd94f3c256f3465bd83 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 12 Nov 2024 12:34:43 -0800 Subject: [PATCH 245/286] fix: Restart files contain incorrect types for ArrayOfArrays (#3434) * add conduit write/read for ArrayOfArrays * update baseline --- .integrated_tests.yaml | 3 +- BASELINE_NOTES.md | 4 + .../dataRepository/wrapperHelpers.hpp | 127 +++++++++++++ src/coreComponents/schema/schema.xsd | 55 +++++- src/coreComponents/schema/schema.xsd.other | 169 ++++++++++-------- 5 files changed, 271 insertions(+), 87 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 71364ebb802..94c95c593c7 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,7 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3374-8621-bbb3cb2 - + baseline: integratedTests/baseline_integratedTests-pr3434-8663-1be8ad2 allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 3af18f0dec8..5c416ca2820 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3434 (2024-11-09) +===================== +Bugfix: Fixed output of ArrayOfArray objects to restart files. + PR #3374 (2024-11-09) ==================== Bugfix for gravity treatment in flux for thermal. diff --git a/src/coreComponents/dataRepository/wrapperHelpers.hpp b/src/coreComponents/dataRepository/wrapperHelpers.hpp index 021dbf018e3..fcbaea7ab97 100644 --- a/src/coreComponents/dataRepository/wrapperHelpers.hpp +++ b/src/coreComponents/dataRepository/wrapperHelpers.hpp @@ -490,6 +490,133 @@ pullDataFromConduitNode( Array< T, NDIM, PERMUTATION > & var, std::memcpy( var.data(), valuesNode.data_ptr(), numBytesFromArray ); } + + +template< typename T, typename INDEX_TYPE > +std::enable_if_t< bufferOps::can_memcpy< T > > +pushDataToConduitNode( ArrayOfArrays< T, INDEX_TYPE > const & var2, + conduit::Node & node ) +{ + ArrayOfArraysView< T const, INDEX_TYPE > const & var = var2.toViewConst(); + internal::logOutputType( LvArray::system::demangleType( var ), "Output array via external pointer: " ); + + // ArrayOfArrays::m_numArrays + INDEX_TYPE const numArrays = var.size(); + conduit::DataType const numArraysType( conduitTypeInfo< INDEX_TYPE >::id, 1 ); + node[ "__numberOfArrays__" ].set( numArraysType, const_cast< void * >( static_cast< void const * >(&numArrays) ) ); + + // ArrayOfArrays::m_offsets + INDEX_TYPE const * const offsets = var.getOffsets(); + conduit::DataType const offsetsType( conduitTypeInfo< INDEX_TYPE >::id, numArrays+1 ); + node[ "__offsets__" ].set_external( offsetsType, const_cast< void * >( static_cast< void const * >( offsets ) ) ); + + // ArrayOfArrays::m_sizes + INDEX_TYPE const * const sizes = var.getSizes(); + conduit::DataType const sizesType( conduitTypeInfo< INDEX_TYPE >::id, numArrays ); + node[ "__sizes__" ].set_external( sizesType, const_cast< void * >( static_cast< void const * >( sizes ) ) ); + + // **** WARNING: alters the uninitialized values in the ArrayOfArrays **** + T * const values = const_cast< T * >(var.getValues()); + for( INDEX_TYPE i = 0; i < numArrays; ++i ) + { + INDEX_TYPE const curOffset = offsets[ i ]; + INDEX_TYPE const nextOffset = offsets[ i + 1 ]; + for( INDEX_TYPE j = curOffset + var.sizeOfArray( i ); j < nextOffset; ++j ) + { + if constexpr ( std::is_arithmetic< T >::value ) + { + values[ j ] = 0; + } + else + { + values[ j ] = T(); + } + } + } + + constexpr int conduitTypeID = conduitTypeInfo< T >::id; + constexpr int sizeofConduitType = conduitTypeInfo< T >::sizeOfConduitType; + conduit::DataType const dtype( conduitTypeID, offsets[numArrays] * sizeof( T ) / sizeofConduitType ); + + // Push the data into conduit + node[ "__values__" ].set_external( dtype, values ); +} + +template< typename T, typename INDEX_TYPE > +std::enable_if_t< bufferOps::can_memcpy< T > > +pullDataFromConduitNode( ArrayOfArrays< T, INDEX_TYPE > & var, + conduit::Node const & node ) +{ + + // numArrays node + conduit::Node const & numArraysNode = node.fetch_existing( "__numberOfArrays__" ); + INDEX_TYPE const * const numArrays = numArraysNode.value(); + + // offsets node + conduit::Node const & offsetsNode = node.fetch_existing( "__offsets__" ); + conduit::DataType const & offsetsDataType = offsetsNode.dtype(); + INDEX_TYPE const * const offsets = offsetsNode.value(); + INDEX_TYPE const sizeOffsets = offsetsDataType.number_of_elements(); + + // sizes node + conduit::Node const & sizesNode = node.fetch_existing( "__sizes__" ); + conduit::DataType const & sizesDataType = sizesNode.dtype(); + INDEX_TYPE const * const sizes = sizesNode.value(); + INDEX_TYPE const sizeSizes = sizesDataType.number_of_elements(); + + // Check that the numArrays, sizes and offsets are consistent. + GEOS_ERROR_IF_NE( *numArrays, sizeSizes ); + GEOS_ERROR_IF_NE( *numArrays+1, sizeOffsets ); + + // values node + conduit::Node const & valuesNode = node.fetch_existing( "__values__" ); + conduit::DataType const & valuesDataType = valuesNode.dtype(); + const INDEX_TYPE valuesSize = valuesDataType.number_of_elements(); + + // should preallocate var.m_values with estimated sizes + INDEX_TYPE const arraySizeEstimate = (*numArrays)==0 ? 0 : valuesSize / (*numArrays); + var.resize( *numArrays, arraySizeEstimate ); + var.reserveValues( valuesSize ); + + // correctly set the sizes and capacities of each sub-array + localIndex allocatedSize = 0; + for( INDEX_TYPE i = 0; i < *numArrays; ++i ) + { + INDEX_TYPE const arrayAllocation = offsets[i+1] - offsets[i]; + var.setCapacityOfArray( i, arrayAllocation ); + var.resizeArray( i, sizes[ i ] ); + allocatedSize += arrayAllocation; + } + + // make sure that the allocated size is the same as the number of values read + GEOS_ERROR_IF_NE( valuesSize, allocatedSize ); + + // make sure the allocatedSize is consistent wit the last offset + GEOS_ERROR_IF_NE( allocatedSize, offsets[sizeOffsets-1] ); + + // get a view because the ArrayOfArraysView data accessors are protected + ArrayOfArraysView< T const, INDEX_TYPE > const & varView = var.toViewConst(); + INDEX_TYPE const * const varOffsets = varView.getOffsets(); + INDEX_TYPE const * const varSizes = varView.getSizes(); + + // check that the offsets that are read are the same as the ones that were allocated + GEOS_ERROR_IF_NE( varOffsets[0], offsets[0] ); + + // check each subarray has the identical capacity and size + for( INDEX_TYPE i = 0; i<*numArrays; ++i ) + { + GEOS_ERROR_IF_NE( varOffsets[i+1], offsets[i+1] ); + GEOS_ERROR_IF_NE( varSizes[i], sizes[i] ); + } + + // copy the values + localIndex numBytesFromArray = allocatedSize * sizeof( T ); + GEOS_ERROR_IF_NE( numBytesFromArray, valuesDataType.strided_bytes() ); + std::memcpy( const_cast< T * >(varView.getValues()), valuesNode.data_ptr(), numBytesFromArray ); +} + + + template< typename T > void pushDataToConduitNode( InterObjectRelation< T > const & var, conduit::Node & node ) diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 6150e54825e..fa48a1f1975 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -965,7 +965,7 @@ - + @@ -2325,12 +2325,16 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + + + @@ -2406,12 +2410,16 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + + + @@ -2477,12 +2485,16 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + + + @@ -2934,12 +2946,16 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + + + @@ -3009,12 +3025,16 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + + + @@ -3130,7 +3150,7 @@ Level 0 outputs no specific information for this solver. Higher levels require m - + @@ -3153,7 +3173,7 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3427,18 +3447,31 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + - + - - + + @@ -6054,6 +6087,16 @@ If you want to do a three-phase simulation, please use instead wettingIntermedia + + + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 3a9252a6e69..13a5b5ed3b9 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -471,7 +471,7 @@ - + @@ -555,7 +555,7 @@ - + @@ -592,7 +592,7 @@ - + @@ -615,8 +615,8 @@ - - + + @@ -643,7 +643,7 @@ - + @@ -662,8 +662,8 @@ - - + + @@ -684,7 +684,7 @@ - + @@ -703,8 +703,8 @@ - - + + @@ -717,7 +717,7 @@ - + @@ -728,7 +728,7 @@ - + @@ -741,7 +741,7 @@ - + @@ -754,7 +754,7 @@ - + @@ -770,7 +770,7 @@ - + @@ -804,7 +804,7 @@ - + @@ -837,8 +837,8 @@ - - + + @@ -867,7 +867,7 @@ - + @@ -884,8 +884,8 @@ - - + + @@ -898,7 +898,7 @@ - + @@ -911,7 +911,7 @@ - + @@ -924,7 +924,7 @@ - + @@ -937,7 +937,7 @@ - + @@ -950,7 +950,7 @@ - + @@ -965,7 +965,7 @@ - + @@ -976,7 +976,7 @@ - + @@ -989,7 +989,7 @@ - + @@ -1000,7 +1000,7 @@ - + @@ -1008,8 +1008,6 @@ - - @@ -1024,7 +1022,7 @@ - + @@ -1037,7 +1035,7 @@ - + @@ -1048,7 +1046,7 @@ - + @@ -1059,7 +1057,7 @@ - + @@ -1072,7 +1070,7 @@ - + @@ -1087,7 +1085,7 @@ - + @@ -1102,7 +1100,7 @@ - + @@ -1115,7 +1113,7 @@ - + @@ -1130,7 +1128,7 @@ - + @@ -1141,7 +1139,7 @@ - + @@ -1154,7 +1152,7 @@ - + @@ -1167,7 +1165,7 @@ - + @@ -1182,7 +1180,7 @@ - + @@ -1198,7 +1196,7 @@ - + @@ -1213,7 +1211,7 @@ - + @@ -1230,7 +1228,7 @@ - + @@ -1247,7 +1245,7 @@ - + @@ -1262,7 +1260,7 @@ - + @@ -1275,7 +1273,7 @@ - + @@ -1314,7 +1312,7 @@ - + @@ -1343,7 +1341,7 @@ - + @@ -1436,7 +1434,7 @@ - + @@ -2587,7 +2585,20 @@ - + + + + + + + + + + + + + + @@ -2992,7 +3003,7 @@ - + @@ -3020,7 +3031,7 @@ - + @@ -3039,11 +3050,11 @@ - + - + @@ -3053,7 +3064,7 @@ - + @@ -3063,11 +3074,11 @@ - + - + @@ -3077,7 +3088,7 @@ - + @@ -3087,7 +3098,7 @@ - + @@ -3097,7 +3108,7 @@ - + @@ -3121,7 +3132,7 @@ - + @@ -3139,7 +3150,7 @@ - + @@ -3151,7 +3162,7 @@ - + @@ -3163,7 +3174,7 @@ - + @@ -3171,11 +3182,11 @@ - + - + @@ -3198,7 +3209,7 @@ - + @@ -3224,7 +3235,7 @@ - + @@ -3245,7 +3256,7 @@ - + @@ -3275,7 +3286,7 @@ - + @@ -3289,7 +3300,7 @@ - + @@ -3316,7 +3327,7 @@ - + @@ -3355,7 +3366,7 @@ - + From 73d86e8610b69f6c7f2967a29ba22087515da162 Mon Sep 17 00:00:00 2001 From: MelReyCG <122801580+MelReyCG@users.noreply.github.com> Date: Wed, 13 Nov 2024 04:24:13 +0100 Subject: [PATCH 246/286] refactor: EnumStrings.hpp from codingUtilities to common/format (#3267) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * todos * DataTypes.hpp now only manage static types - no runtime types nor Mpi constants - DataTypes.cpp is not useful anymore. * removing common -> fileIO * last common->fileIO ref * removing common->codingUtilities * logger has now a dedicated folder for upcoming files (future PRs) * 📝 missed docs (where not previously catched by the CI) * Moving EnumStrings.hpp from codingUtilities to common/format * moving the regex in codingUtilities as it is related to rtTypes / regexes * removing dependency with TypeName --- .../codingUtilities/CMakeLists.txt | 1 - .../codingUtilities/RTTypes.hpp | 26 ++++++++++- src/coreComponents/common/CMakeLists.txt | 1 + .../format}/EnumStrings.hpp | 43 +++++++++---------- .../constitutive/ExponentialRelation.hpp | 2 +- .../JFunctionCapillaryPressure.hpp | 2 +- .../multifluid/CO2Brine/CO2BrineFluid.hpp | 2 +- .../compositional/models/EquationOfState.hpp | 2 +- .../models/LohrenzBrayClarkViscosity.hpp | 2 +- .../reactive/ReactiveBrineFluid.hpp | 2 +- .../reactive/ReactiveMultiFluid.hpp | 2 +- .../fluid/singlefluid/ParticleFluid.hpp | 2 +- .../RelativePermeabilityBase.hpp | 2 +- .../dataRepository/ExecutableGroup.hpp | 2 +- .../unitTests/testXmlWrapper.cpp | 2 +- .../fileIO/vtk/VTKPolyDataWriterInterface.hpp | 2 +- .../finiteElement/PDEUtilities.hpp | 2 +- .../functions/MultivariableTableFunction.hpp | 2 +- .../functions/TableFunction.hpp | 2 +- .../utilities/LinearSolverParameters.hpp | 2 +- src/coreComponents/mesh/ElementType.hpp | 2 +- src/coreComponents/mesh/MeshObjectPath.hpp | 2 +- src/coreComponents/mesh/ParticleType.hpp | 2 +- .../mesh/SurfaceElementRegion.hpp | 2 +- .../mesh/generators/InternalMeshGenerator.hpp | 2 +- .../generators/InternalWellboreGenerator.hpp | 2 +- .../mesh/generators/ParticleMeshGenerator.hpp | 2 +- .../NonlinearSolverParameters.hpp | 2 +- .../PhysicsSolverBaseKernels.hpp | 2 +- .../physicsSolvers/contact/ContactFields.hpp | 2 +- .../fluidFlow/wells/WellControls.hpp | 2 +- .../simplePDE/LaplaceBaseH1.hpp | 2 +- .../SolidMechanicsLagrangianFEM.hpp | 2 +- .../solidMechanics/SolidMechanicsMPM.hpp | 2 +- src/coreComponents/schema/schema.xsd.other | 2 +- 35 files changed, 77 insertions(+), 56 deletions(-) rename src/coreComponents/{codingUtilities => common/format}/EnumStrings.hpp (88%) diff --git a/src/coreComponents/codingUtilities/CMakeLists.txt b/src/coreComponents/codingUtilities/CMakeLists.txt index fdccb254f5e..424a0abc3a9 100644 --- a/src/coreComponents/codingUtilities/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/CMakeLists.txt @@ -2,7 +2,6 @@ # Specify all headers # set( codingUtilities_headers - EnumStrings.hpp RTTypes.hpp Parsing.hpp SFINAE_Macros.hpp diff --git a/src/coreComponents/codingUtilities/RTTypes.hpp b/src/coreComponents/codingUtilities/RTTypes.hpp index ea1bed2bdc6..93f6d89aed8 100644 --- a/src/coreComponents/codingUtilities/RTTypes.hpp +++ b/src/coreComponents/codingUtilities/RTTypes.hpp @@ -24,6 +24,7 @@ #define GEOS_CODINGUTILITIES_RTTYPES_HPP #include "common/DataTypes.hpp" +#include "common/format/EnumStrings.hpp" #include "common/format/Format.hpp" #include "common/logger/Logger.hpp" @@ -232,7 +233,30 @@ struct TypeName } }; -} +/** + * @brief Base types TypeRegex specializations + */ +///@{ + +/** + * @brief Specialization of TypeRegex for enumeration types with strings attached (pun intended). + * @tparam ENUM the type of enumeration + */ +template< typename ENUM > +struct TypeRegex< ENUM, std::enable_if_t< internal::HasEnumStrings< ENUM > > > +{ + /** + * @brief @return Regex for validating enumeration inputs for @p ENUM type. + */ + static Regex get() + { + return Regex( EnumStrings< ENUM >::concat( "|" ), + "Input value must be one of { " + EnumStrings< ENUM >::concat( ", " ) + " }." ); + } +}; + +///@} +} #endif /* GEOS_CODINGUTILITIES_RTTYPES_HPP */ diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index 32e5a412824..13d55c0cf18 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -6,6 +6,7 @@ set( common_headers format/table/TableLayout.hpp format/table/TableFormatter.hpp format/table/TableData.hpp + format/EnumStrings.hpp format/Format.hpp format/StringUtilities.hpp logger/Logger.hpp diff --git a/src/coreComponents/codingUtilities/EnumStrings.hpp b/src/coreComponents/common/format/EnumStrings.hpp similarity index 88% rename from src/coreComponents/codingUtilities/EnumStrings.hpp rename to src/coreComponents/common/format/EnumStrings.hpp index 0c6bc40065d..4d4c2eaa6ce 100644 --- a/src/coreComponents/codingUtilities/EnumStrings.hpp +++ b/src/coreComponents/common/format/EnumStrings.hpp @@ -22,11 +22,11 @@ * of these strings, like stream insertion/extraction operators. */ -#ifndef GEOS_CODINGUTILITIES_ENUMSTRINGS_HPP -#define GEOS_CODINGUTILITIES_ENUMSTRINGS_HPP +#ifndef GEOS_COMMON_FORMAT_ENUMSTRINGS_HPP +#define GEOS_COMMON_FORMAT_ENUMSTRINGS_HPP #include "common/format/StringUtilities.hpp" -#include "codingUtilities/RTTypes.hpp" +// #include "codingUtilities/RTTypes.hpp" #include "common/DataTypes.hpp" #include "common/logger/Logger.hpp" #include "common/format/Format.hpp" @@ -66,6 +66,15 @@ constexpr int countArgs( ARGS ... ) * may be used to get access to strings at runtime. While not strictly necessary, * it is recommended that macro call immediately follows the enum definition * (or the class definition, if enum is defined inside a class). + * + * enum struct VTKOutputMode + * { + * BINARY, + * ASCII + * }; + * ENUM_STRINGS( VTKOutputMode, + * "binary", + * "ascii" ); */ #define ENUM_STRINGS( ENUM, ... ) \ inline auto const & getEnumStrings( ENUM const ) \ @@ -74,6 +83,11 @@ constexpr int countArgs( ARGS ... ) return ss; \ } \ \ + inline auto const & getEnumTypeNameString( ENUM const ) \ + { \ + return #ENUM; \ + } \ + \ inline std::ostream & operator<<( std::ostream & os, ENUM const e ) \ { \ os << EnumStrings< ENUM >::toString( e ); \ @@ -139,7 +153,7 @@ struct EnumStrings std::size_t size = std::distance( std::begin( strings ), std::end( strings ) ); base_type const index = static_cast< base_type >( e ); GEOS_THROW_IF( index >= LvArray::integerConversion< base_type >( size ), - "Invalid value " << index << " of type " << TypeName< ENUM >::brief() << ". Valid range is 0.." << size - 1, + "Invalid value " << index << " of type " << getEnumTypeNameString( enum_type{} ) << ". Valid range is 0.." << size - 1, InputError ); return strings[ index ]; } @@ -154,7 +168,7 @@ struct EnumStrings auto const & strings = get(); auto const it = std::find( std::begin( strings ), std::end( strings ), s ); GEOS_THROW_IF( it == std::end( strings ), - "Invalid value '" << s << "' of type " << TypeName< enum_type >::brief() << ". Valid options are: " << concat( ", " ), + "Invalid value '" << s << "' of type " << getEnumTypeNameString( enum_type{} ) << ". Valid options are: " << concat( ", " ), InputError ); enum_type const e = static_cast< enum_type >( LvArray::integerConversion< base_type >( std::distance( std::begin( strings ), it ) ) ); return e; @@ -166,23 +180,6 @@ namespace internal IS_VALID_EXPRESSION( HasEnumStrings, ENUM, getEnumStrings( std::declval< ENUM >() ) ); } -/** - * @brief Specialization of TypeRegex for enumeration types with strings attached (pun intended). - * @tparam ENUM the type of enumeration - */ -template< typename ENUM > -struct TypeRegex< ENUM, std::enable_if_t< internal::HasEnumStrings< ENUM > > > -{ - /** - * @brief @return Regex for validating enumeration inputs for @p ENUM type. - */ - static Regex get() - { - return Regex( EnumStrings< ENUM >::concat( "|" ), - "Input value must be one of { " + EnumStrings< ENUM >::concat( ", " ) + " }." ); - } -}; - } // namespace geos // Formatter specialization for enums @@ -209,4 +206,4 @@ struct GEOS_FMT_NS::formatter< Enum, std::enable_if_t< std::is_enum< Enum >::val } }; -#endif //GEOS_CODINGUTILITIES_ENUMSTRINGS_HPP +#endif //GEOS_COMMON_FORMAT_ENUMSTRINGS_HPP diff --git a/src/coreComponents/constitutive/ExponentialRelation.hpp b/src/coreComponents/constitutive/ExponentialRelation.hpp index 64866627cbd..e2215b23f1b 100644 --- a/src/coreComponents/constitutive/ExponentialRelation.hpp +++ b/src/coreComponents/constitutive/ExponentialRelation.hpp @@ -21,7 +21,7 @@ #define GEOS_CONSITUTIVE_EXPONENTIALRELATION_HPP_ #include "common/DataTypes.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp index 270adb15902..58ceb90ab73 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp @@ -22,7 +22,7 @@ #include "constitutive/capillaryPressure/CapillaryPressureBase.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "functions/TableFunction.hpp" namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp index eb31780f4d4..3675ff4ac81 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_CO2BRINEFLUID_HPP_ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_CO2BRINE_CO2BRINEFLUID_HPP_ -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" #include "constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp" diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp index dd6b3d294c7..f88b8608b39 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp @@ -23,7 +23,7 @@ #include "ModelParameters.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "dataRepository/InputFlags.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" namespace geos { diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp index e87373c09a6..95cb6644d9f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp @@ -22,7 +22,7 @@ #include "FunctionBase.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" namespace geos { diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp index 9ba08387cf6..2ee7cf86687 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_CONSTITUTIVE_FLUID_REACTIVEBRINEFLUID_HPP_ #define GEOS_CONSTITUTIVE_FLUID_REACTIVEBRINEFLUID_HPP_ -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp" #include "constitutive/fluid/multifluid/MultiFluidUtils.hpp" #include "constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp" diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp index 460f45c2c35..3a9cd32f95c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp @@ -21,7 +21,7 @@ #define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_REACTIVE_REACTIVEMULTIFLUID_HPP_ -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp" #include "constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp" diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp index 3d621f888d0..c218ffbbad4 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_CONSTITUTIVE_FLUID_SINGLEFLUID_PARTICLEFLUID_HPP_ #define GEOS_CONSTITUTIVE_FLUID_SINGLEFLUID_PARTICLEFLUID_HPP_ -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "constitutive/fluid/singlefluid/ParticleFluidBase.hpp" namespace geos diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp index da634a6ac48..16100d449d2 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp @@ -24,7 +24,7 @@ #include "constitutive/ConstitutiveBase.hpp" #include "constitutive/relativePermeability/layouts.hpp" #include "common/GEOS_RAJA_Interface.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" namespace geos { diff --git a/src/coreComponents/dataRepository/ExecutableGroup.hpp b/src/coreComponents/dataRepository/ExecutableGroup.hpp index dd3da89af5b..201b6642227 100644 --- a/src/coreComponents/dataRepository/ExecutableGroup.hpp +++ b/src/coreComponents/dataRepository/ExecutableGroup.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_DATAREPOSITORY_EXECUTABLEGROUP_HPP_ #define GEOS_DATAREPOSITORY_EXECUTABLEGROUP_HPP_ -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "common/DataTypes.hpp" #include "Group.hpp" diff --git a/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp b/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp index 32141eb0e28..ce1dbaf3e7e 100644 --- a/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp +++ b/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp @@ -16,7 +16,7 @@ #include #include "dataRepository/xmlWrapper.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" using namespace geos; diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp index 526c8e3fb77..77c6b90e8aa 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp @@ -21,7 +21,7 @@ #include "dataRepository/Wrapper.hpp" #include "fileIO/vtk/VTKPVDWriter.hpp" #include "fileIO/vtk/VTKVTMWriter.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" class vtkUnstructuredGrid; class vtkPointData; diff --git a/src/coreComponents/finiteElement/PDEUtilities.hpp b/src/coreComponents/finiteElement/PDEUtilities.hpp index 015a68f92f1..e060d4d339d 100644 --- a/src/coreComponents/finiteElement/PDEUtilities.hpp +++ b/src/coreComponents/finiteElement/PDEUtilities.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_FINITEELEMENT_PDEUTILITIES_HPP_ #define GEOS_FINITEELEMENT_PDEUTILITIES_HPP_ -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" namespace geos { diff --git a/src/coreComponents/functions/MultivariableTableFunction.hpp b/src/coreComponents/functions/MultivariableTableFunction.hpp index fd6e99c891d..cc924974f49 100644 --- a/src/coreComponents/functions/MultivariableTableFunction.hpp +++ b/src/coreComponents/functions/MultivariableTableFunction.hpp @@ -22,7 +22,7 @@ #include "FunctionBase.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "LvArray/src/tensorOps.hpp" namespace geos diff --git a/src/coreComponents/functions/TableFunction.hpp b/src/coreComponents/functions/TableFunction.hpp index 676807847a7..bd1fe75903a 100644 --- a/src/coreComponents/functions/TableFunction.hpp +++ b/src/coreComponents/functions/TableFunction.hpp @@ -22,7 +22,7 @@ #include "FunctionBase.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "LvArray/src/tensorOps.hpp" #include "common/format/table/TableFormatter.hpp" #include "common/Units.hpp" diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp index 7483a1721a9..3c47e40e370 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_LINEARALGEBRA_UTILITIES_LINEARSOLVERPARAMETERS_HPP_ #define GEOS_LINEARALGEBRA_UTILITIES_LINEARSOLVERPARAMETERS_HPP_ -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" namespace geos { diff --git a/src/coreComponents/mesh/ElementType.hpp b/src/coreComponents/mesh/ElementType.hpp index 67208235e3b..0dd913402cd 100644 --- a/src/coreComponents/mesh/ElementType.hpp +++ b/src/coreComponents/mesh/ElementType.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_MESH_ELEMENTTYPE_HPP #define GEOS_MESH_ELEMENTTYPE_HPP -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" namespace geos { diff --git a/src/coreComponents/mesh/MeshObjectPath.hpp b/src/coreComponents/mesh/MeshObjectPath.hpp index b6cb34adb75..832ef9a5548 100644 --- a/src/coreComponents/mesh/MeshObjectPath.hpp +++ b/src/coreComponents/mesh/MeshObjectPath.hpp @@ -21,7 +21,7 @@ #define GEOS_MESH_MESHOBJECTPATH_HPP_ -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "MeshLevel.hpp" namespace geos diff --git a/src/coreComponents/mesh/ParticleType.hpp b/src/coreComponents/mesh/ParticleType.hpp index 000546a381d..b221f538084 100644 --- a/src/coreComponents/mesh/ParticleType.hpp +++ b/src/coreComponents/mesh/ParticleType.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_MESH_PARTICLETYPE_HPP #define GEOS_MESH_PARTICLETYPE_HPP -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" namespace geos { diff --git a/src/coreComponents/mesh/SurfaceElementRegion.hpp b/src/coreComponents/mesh/SurfaceElementRegion.hpp index 182d4f730b0..9abd8a6ed06 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.hpp @@ -22,7 +22,7 @@ #define GEOS_MESH_SURFACEELEMENTREGION_HPP_ #include "ElementRegionBase.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" namespace geos { diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp index e358b6c2aff..40b0b01ee90 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_MESH_GENERATORS_INTERNALMESHGENERATOR_HPP #define GEOS_MESH_GENERATORS_INTERNALMESHGENERATOR_HPP -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "mesh/generators/MeshGeneratorBase.hpp" #include "mesh/generators/CellBlockManager.hpp" #include "mesh/mpiCommunications/SpatialPartition.hpp" diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp index e9d86c930e6..c4b63aec5ac 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_MESHUTILITIES_INTERNALWELLBOREGENERATOR_HPP #define GEOS_MESHUTILITIES_INTERNALWELLBOREGENERATOR_HPP -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "dataRepository/Group.hpp" #include "InternalMeshGenerator.hpp" diff --git a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp index 0306f1931bd..e6060f0b854 100644 --- a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp @@ -22,7 +22,7 @@ #include "mesh/generators/MeshGeneratorBase.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp index 0d68e7e6787..a084b693774 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp @@ -16,7 +16,7 @@ #ifndef GEOS_PHYSICSSOLVERS_NONLINEARSOLVERPARAMETERS_HPP_ #define GEOS_PHYSICSSOLVERS_NONLINEARSOLVERPARAMETERS_HPP_ -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "dataRepository/Group.hpp" #include "physicsSolvers/PhysicsSolverBaseKernels.hpp" diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBaseKernels.hpp b/src/coreComponents/physicsSolvers/PhysicsSolverBaseKernels.hpp index d8583904996..e085177bae8 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBaseKernels.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_SOLVERBASEKERNELS_HPP #define GEOS_PHYSICSSOLVERS_SOLVERBASEKERNELS_HPP -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "common/DataTypes.hpp" #include "common/MpiWrapper.hpp" diff --git a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp index 4792ca2d019..f86521ffd75 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp @@ -21,7 +21,7 @@ #define GEOS_PHYSICSSOLVERS_CONTACT_CONTACTFIELDS_HPP_ #include "mesh/MeshFields.hpp" -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp index 107c013cfd3..fefa7e4435b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp @@ -21,7 +21,7 @@ #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_WELLCONTROLS_HPP #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_WELLS_WELLCONTROLS_HPP -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "dataRepository/Group.hpp" #include "functions/TableFunction.hpp" diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp index e3f10b22eea..70a3165b0f1 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp @@ -16,7 +16,7 @@ #ifndef GEOS_PHYSICSSOLVERS_SIMPLEPDE_LAPLACE_BASE_HPP #define GEOS_PHYSICSSOLVERS_SIMPLEPDE_LAPLACE_BASE_HPP -#include "codingUtilities/EnumStrings.hpp" // facilities for enum-string conversion (for reading enum values from XML input) +#include "common/format/EnumStrings.hpp" // facilities for enum-string conversion (for reading enum values from XML input) #include "physicsSolvers/PhysicsSolverBase.hpp" // an abstraction class shared by all physics solvers #include "fieldSpecification/FieldSpecificationManager.hpp" // a manager that can access and set values on the discretized domain diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index fb5fd9def7a..6d331793e7b 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_SOLIDMECHANICSLAGRANGIANFEM_HPP_ #define GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_SOLIDMECHANICSLAGRANGIANFEM_HPP_ -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "common/TimingMacros.hpp" #include "kernels/SolidMechanicsLagrangianFEMKernels.hpp" #include "kernels/StrainHelper.hpp" diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp index 71200129938..b528b6d9e7f 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp @@ -20,7 +20,7 @@ #ifndef GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_MPM_HPP_ #define GEOS_PHYSICSSOLVERS_SOLIDMECHANICS_MPM_HPP_ -#include "codingUtilities/EnumStrings.hpp" +#include "common/format/EnumStrings.hpp" #include "common/TimingMacros.hpp" #include "kernels/SolidMechanicsLagrangianFEMKernels.hpp" #include "kernels/ExplicitMPM.hpp" diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 13a5b5ed3b9..c2a891421d3 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1011,7 +1011,7 @@ - + From 4bcf7dffd2827808d6ad65e53e9988f855c92722 Mon Sep 17 00:00:00 2001 From: paloma-martinez <104762252+paloma-martinez@users.noreply.github.com> Date: Thu, 14 Nov 2024 19:10:49 +0100 Subject: [PATCH 247/286] docs: Adding brief documentation to coreComponent packages (#3352) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Adding documentation on mesh package * Adding documentation on physicsSolver package * Adding SPDX and changing format following review comments * Update formulation for denselinearAlgebra * 📝 Adding brief for coreComponents/unitTests --------- Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Co-authored-by: MelReyCG --- .../codingUtilities/CMakeLists.txt | 19 ++++++++++++ src/coreComponents/common/CMakeLists.txt | 22 +++++++++++++ .../constitutive/CMakeLists.txt | 29 ++++++++++++++--- .../constitutiveDrivers/CMakeLists.txt | 20 ++++++++++++ .../dataRepository/CMakeLists.txt | 24 ++++++++++++++ .../denseLinearAlgebra/CMakeLists.txt | 25 ++++++++++++++- .../discretizationMethods/CMakeLists.txt | 19 ++++++++++++ src/coreComponents/events/CMakeLists.txt | 20 ++++++++++++ .../fieldSpecification/CMakeLists.txt | 21 +++++++++++++ src/coreComponents/fileIO/CMakeLists.txt | 31 +++++++++++++++++-- .../finiteElement/CMakeLists.txt | 19 ++++++++++++ .../finiteVolume/CMakeLists.txt | 20 ++++++++++++ src/coreComponents/functions/CMakeLists.txt | 19 ++++++++++++ .../linearAlgebra/CMakeLists.txt | 28 ++++++++++++++++- .../mainInterface/CMakeLists.txt | 22 +++++++++++++ src/coreComponents/math/CMakeLists.txt | 25 +++++++++++++-- src/coreComponents/mesh/CMakeLists.txt | 31 +++++++++++++++++-- .../physicsSolvers/CMakeLists.txt | 28 ++++++++++++++++- src/coreComponents/schema/CMakeLists.txt | 17 ++++++++++ src/coreComponents/unitTests/CMakeLists.txt | 20 ++++++++++++ 20 files changed, 443 insertions(+), 16 deletions(-) diff --git a/src/coreComponents/codingUtilities/CMakeLists.txt b/src/coreComponents/codingUtilities/CMakeLists.txt index 424a0abc3a9..d25e033e688 100644 --- a/src/coreComponents/codingUtilities/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/CMakeLists.txt @@ -1,3 +1,22 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ + Package: codingUtilities + + Contains definition of runtime types. Also contains common traits. +#]] + # # Specify all headers # diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index 13d55c0cf18..ec9e350db1d 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -1,3 +1,25 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: common + +Contains the definition of the basic static types of GEOS. +Also provides commonly used components for such as logging, formatting, memory and wrapper of + dependencies. +#]] + + # # Specify all headers # diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index c6e3fd499e9..c763fd49e49 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -1,3 +1,22 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: constitutive + +Contains the implementation of constitutive models for fluid and rock properties. +#]] + # # Specify all headers # @@ -33,7 +52,7 @@ set( constitutive_headers dispersion/DispersionBase.hpp dispersion/DispersionFields.hpp dispersion/DispersionSelector.hpp - dispersion/LinearIsotropicDispersion.hpp + dispersion/LinearIsotropicDispersion.hpp fluid/multifluid/Layouts.hpp fluid/multifluid/MultiFluidSelector.hpp fluid/multifluid/MultiFluidBase.hpp @@ -64,9 +83,9 @@ set( constitutive_headers fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp fluid/multifluid/CO2Brine/functions/WaterDensity.hpp - fluid/multifluid/compositional/functions/CompositionalProperties.hpp - fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp - fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp + fluid/multifluid/compositional/functions/CompositionalProperties.hpp + fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp + fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp fluid/multifluid/compositional/functions/FugacityCalculator.hpp fluid/multifluid/compositional/functions/KValueInitialization.hpp fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -147,7 +166,7 @@ set( constitutive_headers solid/ElasticTransverseIsotropic.hpp solid/ElasticOrthotropic.hpp solid/InvariantDecompositions.hpp - solid/PerfectlyPlastic.hpp + solid/PerfectlyPlastic.hpp solid/PorousSolid.hpp solid/PropertyConversions.hpp solid/SolidBase.hpp diff --git a/src/coreComponents/constitutiveDrivers/CMakeLists.txt b/src/coreComponents/constitutiveDrivers/CMakeLists.txt index 41e4a946d28..376d4d34573 100644 --- a/src/coreComponents/constitutiveDrivers/CMakeLists.txt +++ b/src/coreComponents/constitutiveDrivers/CMakeLists.txt @@ -1,3 +1,23 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: constitutiveDrivers + +Contains fluid and rock constitutive model tests to calibrate constitutive model parameters to + experimental data. +#]] + # # Specify all headers # diff --git a/src/coreComponents/dataRepository/CMakeLists.txt b/src/coreComponents/dataRepository/CMakeLists.txt index f3e4e82628e..49f4404cbd6 100644 --- a/src/coreComponents/dataRepository/CMakeLists.txt +++ b/src/coreComponents/dataRepository/CMakeLists.txt @@ -1,4 +1,26 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: dataRepository + +Provides the building blocks for the data structure of GEOS objects. +Also contains a wrapper to process entries from an xml file into data types. +#]] + +# # Specify all headers +# set( dataRepository_headers BufferOps.hpp BufferOpsDevice.hpp @@ -26,7 +48,9 @@ set( dataRepository_headers GroupContext.hpp WrapperContext.hpp ) +# # Specify all sources +# set( dataRepository_sources BufferOpsDevice.cpp ConduitRestart.cpp diff --git a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt index 1d15320355c..259a0ab9ff1 100644 --- a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt +++ b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt @@ -1,11 +1,34 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: denseLinearAlgebra + +Contains dense linear algebra functions and interfaces to BLAS and LAPACK packages. +#]] + +# # Specify all headers +# set( denseLinearAlgebra_headers common/layouts.hpp denseLASolvers.hpp interfaces/blaslapack/BlasLapackFunctions.h interfaces/blaslapack/BlasLapackLA.hpp ) +# # Specify all sources +# set( denseLinearAlgebra_sources interfaces/blaslapack/BlasLapackLA.cpp ) @@ -18,7 +41,7 @@ blt_add_library( NAME denseLinearAlgebra SOURCES ${denseLinearAlgebra_sources} HEADERS ${denseLinearAlgebra_headers} DEPENDS_ON ${decoratedDependencies} - OBJECT ${GEOS_BUILD_OBJ_LIBS} + OBJECT ${GEOS_BUILD_OBJ_LIBS} SHARED ${GEOS_BUILD_SHARED_LIBS} ) diff --git a/src/coreComponents/discretizationMethods/CMakeLists.txt b/src/coreComponents/discretizationMethods/CMakeLists.txt index 06d03ca8fa9..ae7cff10390 100644 --- a/src/coreComponents/discretizationMethods/CMakeLists.txt +++ b/src/coreComponents/discretizationMethods/CMakeLists.txt @@ -1,3 +1,22 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: discretizationMethods + +Gives access to the discretization methods and their components for applications to the mesh. +#]] + # # Specify all headers # diff --git a/src/coreComponents/events/CMakeLists.txt b/src/coreComponents/events/CMakeLists.txt index 3a7fe6a7a92..4f80fe771ab 100644 --- a/src/coreComponents/events/CMakeLists.txt +++ b/src/coreComponents/events/CMakeLists.txt @@ -1,3 +1,23 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: events + +Contains GEOS event types. +Manages the events and tasks. +#]] + # # Specify all headers # diff --git a/src/coreComponents/fieldSpecification/CMakeLists.txt b/src/coreComponents/fieldSpecification/CMakeLists.txt index 943e95ab809..d93d54fe702 100644 --- a/src/coreComponents/fieldSpecification/CMakeLists.txt +++ b/src/coreComponents/fieldSpecification/CMakeLists.txt @@ -1,3 +1,24 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: fieldSpecification + +Contains: + - field specification objects definition. + - an interface to manage these objects. +#]] + # # Specify all headers # diff --git a/src/coreComponents/fileIO/CMakeLists.txt b/src/coreComponents/fileIO/CMakeLists.txt index 3b70d456190..95ffd8fcb63 100644 --- a/src/coreComponents/fileIO/CMakeLists.txt +++ b/src/coreComponents/fileIO/CMakeLists.txt @@ -1,4 +1,27 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: fileIO + +Contains: + - I/O interfaces for the packing components and supported outputs and their python wrappers. + - a coupler for data exchange with CHOMBO. +#]] + +# # Specify all headers +# set( fileIO_headers Outputs/BlueprintOutput.hpp Outputs/OutputBase.hpp @@ -14,7 +37,9 @@ set( fileIO_headers timeHistory/HDFHistoryIO.hpp timeHistory/HistoryCollection.hpp ) +# # Specify all sources +# set( fileIO_sources Outputs/BlueprintOutput.cpp Outputs/OutputBase.cpp @@ -51,10 +76,10 @@ endif() if( ENABLE_SILO ) list( APPEND dependencyList silo HDF5::HDF5) - list( APPEND fileIO_headers - silo/SiloFile.hpp + list( APPEND fileIO_headers + silo/SiloFile.hpp Outputs/SiloOutput.hpp ) - list( APPEND fileIO_sources + list( APPEND fileIO_sources silo/SiloFile.cpp Outputs/SiloOutput.cpp ) endif( ) diff --git a/src/coreComponents/finiteElement/CMakeLists.txt b/src/coreComponents/finiteElement/CMakeLists.txt index 3343eb53258..5d7c38fa465 100644 --- a/src/coreComponents/finiteElement/CMakeLists.txt +++ b/src/coreComponents/finiteElement/CMakeLists.txt @@ -1,3 +1,22 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: finiteElement + +Contains the interface and implementation of finite element formulations. +#]] + # # Specify all headers # diff --git a/src/coreComponents/finiteVolume/CMakeLists.txt b/src/coreComponents/finiteVolume/CMakeLists.txt index 39dd4450445..b561b024d73 100644 --- a/src/coreComponents/finiteVolume/CMakeLists.txt +++ b/src/coreComponents/finiteVolume/CMakeLists.txt @@ -1,3 +1,23 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: finiteVolume + +Implementation and access to finite volume method. The main data structures of this package are + the stencils: connection values at the interfaces of the volume elements. +#]] + # # Specify all headers # diff --git a/src/coreComponents/functions/CMakeLists.txt b/src/coreComponents/functions/CMakeLists.txt index 8e73070438c..bf8eed9b134 100644 --- a/src/coreComponents/functions/CMakeLists.txt +++ b/src/coreComponents/functions/CMakeLists.txt @@ -1,3 +1,22 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package : functions + +Contains classes for storing and computing arbitrary N-dimensional functions. +#]] + # # Specify all headers # diff --git a/src/coreComponents/linearAlgebra/CMakeLists.txt b/src/coreComponents/linearAlgebra/CMakeLists.txt index 81c3536dfdd..0b62b22690a 100644 --- a/src/coreComponents/linearAlgebra/CMakeLists.txt +++ b/src/coreComponents/linearAlgebra/CMakeLists.txt @@ -1,4 +1,29 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: linearAlgebra + +Contains: + - management implementations to handle all degrees of freedom associated with field element on + mesh elements. + - linear solvers implementations. + - interfaces to different external linear solvers libraries (hypre, Petsc, trilinos). +#]] + +# # Specify all headers +# set( linearAlgebra_headers DofManager.hpp DofManagerHelpers.hpp @@ -35,8 +60,9 @@ set( linearAlgebra_headers utilities/NormalOperator.hpp utilities/ReverseCutHillMcKeeOrdering.hpp utilities/TransposeOperator.hpp ) - +# # Specify all sources +# set( linearAlgebra_sources DofManager.cpp solvers/BicgstabSolver.cpp diff --git a/src/coreComponents/mainInterface/CMakeLists.txt b/src/coreComponents/mainInterface/CMakeLists.txt index af6b85e76cf..1e21b437bc0 100644 --- a/src/coreComponents/mainInterface/CMakeLists.txt +++ b/src/coreComponents/mainInterface/CMakeLists.txt @@ -1,3 +1,25 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: mainInterface + +Contains: + - GEOS `main` entry point. + - the class managing the operation flow of the problem being ran in GEOS. + - basic initialization and environment setup routines. +#]] + # # Specify all headers # diff --git a/src/coreComponents/math/CMakeLists.txt b/src/coreComponents/math/CMakeLists.txt index 53c52e1abdb..1afa1d60688 100644 --- a/src/coreComponents/math/CMakeLists.txt +++ b/src/coreComponents/math/CMakeLists.txt @@ -1,3 +1,22 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package : math + +Contains interpolation and extrapolation math functions. +#]] + # # Specify all headers # @@ -6,12 +25,12 @@ set( math_headers extrapolation/Extrapolation.hpp) blt_add_library( NAME math - SOURCES + SOURCES HEADERS ${math_headers} - DEPENDS_ON + DEPENDS_ON SHARED FALSE ) - + target_include_directories( math INTERFACE ${CMAKE_SOURCE_DIR}/coreComponents ) install( TARGETS math LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib ) diff --git a/src/coreComponents/mesh/CMakeLists.txt b/src/coreComponents/mesh/CMakeLists.txt index f6fbb61e2e3..d9a9e24b6b5 100644 --- a/src/coreComponents/mesh/CMakeLists.txt +++ b/src/coreComponents/mesh/CMakeLists.txt @@ -1,4 +1,29 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: mesh + +Contains: + - components allowing to import, store and access the mesh. + - partitioning and communication tools (ParMETIS, Scotch and VTK interfaces). + - GEOS components defining simple geometric objects. + - basic geometric and mesh utilities. +#]] + +# # Specify all headers +# set( mesh_headers BufferOps.hpp CellElementRegion.hpp @@ -78,13 +103,15 @@ set( mesh_headers simpleGeometricObjects/SimpleGeometricObjectBase.hpp simpleGeometricObjects/PlanarGeometricObject.hpp simpleGeometricObjects/ThickPlane.hpp - utilities/AverageOverQuadraturePointsKernel.hpp + utilities/AverageOverQuadraturePointsKernel.hpp utilities/CIcomputationKernel.hpp utilities/ComputationalGeometry.hpp utilities/MeshMapUtilities.hpp utilities/StructuredGridUtilities.hpp ) +# # Specify all sources +# set( mesh_sources BufferOps.cpp CellElementRegion.cpp @@ -169,7 +196,7 @@ if( ENABLE_VTK ) generators/VTKMeshGeneratorTools.cpp generators/VTKWellGenerator.cpp generators/VTKUtilities.cpp - ) + ) list( APPEND dependencyList VTK::IOLegacy VTK::FiltersParallelDIY2 ) if( ENABLE_MPI ) list( APPEND dependencyList VTK::IOParallelXML VTK::ParallelMPI ) diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index 3a8c812dab6..64487629fd3 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -1,4 +1,28 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: physicsSolvers + +Contains: + - physics solvers base and manager classes. + - implementations of different physics models. + - physics solver wrapper designed for PyGEOSX interface. +#]] + +# # Specify solver headers +# set( physicsSolvers_headers LinearSolverParameters.hpp NonlinearSolverParameters.hpp @@ -9,7 +33,9 @@ set( physicsSolvers_headers FieldStatisticsBase.hpp LogLevelsInfo.hpp ) +# # Specify solver sources +# set( physicsSolvers_sources LinearSolverParameters.cpp NonlinearSolverParameters.cpp @@ -37,7 +63,7 @@ endif() if( GEOS_ENABLE_SIMPLEPDE ) add_subdirectory( simplePDE ) endif() - + if( GEOS_ENABLE_SOLIDMECHANICS ) add_subdirectory( solidMechanics ) include( solidMechanics/kernels/SolidMechanicsKernels.cmake) diff --git a/src/coreComponents/schema/CMakeLists.txt b/src/coreComponents/schema/CMakeLists.txt index c62fba76b07..344f72e6234 100644 --- a/src/coreComponents/schema/CMakeLists.txt +++ b/src/coreComponents/schema/CMakeLists.txt @@ -1,4 +1,21 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: schema +Contains XML schema definition and functions to generate it. +#]] # # Specify all headers diff --git a/src/coreComponents/unitTests/CMakeLists.txt b/src/coreComponents/unitTests/CMakeLists.txt index e9072bbbc1e..e270b21da1c 100644 --- a/src/coreComponents/unitTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/CMakeLists.txt @@ -1,3 +1,23 @@ +# SPDX-License-Identifier: LGPL-2.1-only +# +# Copyright (c) 2016-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 Total, S.A +# 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. +# +#-------------------------------------------------------------------------------------------------- + +#[[ +Package: mainInterface + +Contains high-level unit tests that depends typically depends on mainInterface components like the +ProblemManager. +#]] + add_subdirectory( toolchain ) add_subdirectory( testingUtilities ) add_subdirectory( xmlTests ) From e3904f239f046a56a25fa9163b71879068d78a16 Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" <50467563+victorapm@users.noreply.github.com> Date: Thu, 14 Nov 2024 16:26:22 -0500 Subject: [PATCH 248/286] feat: hypre improvements (#3339) Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .devcontainer/devcontainer.json | 2 +- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 ++ src/coreComponents/LvArray | 2 +- .../common/format/StringUtilities.cpp | 23 +++++++ .../common/format/StringUtilities.hpp | 9 +++ .../interfaces/hypre/HypreInterface.cpp | 24 +++++-- .../interfaces/hypre/HypreMGR.hpp | 27 ++++---- .../interfaces/hypre/HyprePreconditioner.cpp | 35 +--------- .../interfaces/hypre/HyprePreconditioner.hpp | 29 --------- .../interfaces/hypre/HypreSolver.cpp | 24 +++---- .../interfaces/hypre/HypreSolver.hpp | 5 -- .../interfaces/hypre/HypreUtils.hpp | 2 + .../HybridSinglePhasePoromechanics.hpp | 5 +- .../hypre/mgrStrategies/Hydrofracture.hpp | 5 +- .../LagrangianContactMechanics.hpp | 5 +- .../mgrStrategies/MultiphasePoromechanics.hpp | 29 +++++---- .../MultiphasePoromechanicsReservoirFVM.hpp | 4 +- .../SinglePhasePoromechanics.hpp | 5 +- .../SinglePhasePoromechanicsReservoirFVM.hpp | 5 +- .../SolidMechanicsEmbeddedFractures.hpp | 5 +- .../ThermalMultiphasePoromechanics.hpp | 30 ++++----- .../ThermalSinglePhasePoromechanics.hpp | 6 +- .../utilities/LinearSolverParameters.hpp | 15 +++-- src/coreComponents/mesh/DomainPartition.cpp | 64 +++++++------------ ...lidMechanicsAugmentedLagrangianContact.cpp | 11 ++-- .../SolidMechanicsEmbeddedFractures.cpp | 3 +- .../contact/SolidMechanicsLagrangeContact.cpp | 1 - ...mpositionalMultiphaseReservoirAndWells.cpp | 16 ++++- .../multiphysics/HydrofractureSolver.cpp | 3 +- .../multiphysics/MultiphasePoromechanics.cpp | 1 - .../multiphysics/SinglePhasePoromechanics.cpp | 1 - ...ePhasePoromechanicsConformingFractures.cpp | 3 +- ...glePhasePoromechanicsEmbeddedFractures.cpp | 3 +- .../SolidMechanicsLagrangianFEM.cpp | 1 + src/coreComponents/schema/schema.xsd | 4 +- 36 files changed, 203 insertions(+), 211 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 5757d8230fa..216993fba02 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "284-535" + "GEOS_TPL_TAG": "286-547" } }, "runArgs": [ diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 94c95c593c7..00502a919e4 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3434-8663-1be8ad2 + baseline: integratedTests/baseline_integratedTests-pr3339-8707-7c55c70 allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 5c416ca2820..f4dcac6a76e 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). + +PR #3339 (2024-11-14) +===================== +Hypre improvements, rebaseline is due to field value change (amgNumFunctions). + PR #3434 (2024-11-09) ===================== Bugfix: Fixed output of ArrayOfArray objects to restart files. diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index c9d97b4676d..9b1c0049497 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit c9d97b4676d47d1da7d2a63a1a5cbf31f7b54965 +Subproject commit 9b1c00494974c73ff38f8590f010f624efe9964c diff --git a/src/coreComponents/common/format/StringUtilities.cpp b/src/coreComponents/common/format/StringUtilities.cpp index cd13ba3919e..83afce1cf87 100644 --- a/src/coreComponents/common/format/StringUtilities.cpp +++ b/src/coreComponents/common/format/StringUtilities.cpp @@ -73,6 +73,29 @@ string removeStringAndFollowingContent( string_view const str, return string( newStr ); } +// Add comma separators for thousands +template< typename T > +string addCommaSeparators( T const & num ) +{ + static_assert( std::is_integral< T >::value, "addCommaSeparators only supports integral types" ); + + string const numStr = std::to_string( num ); + string result; + + for( std::size_t i = 0; i < numStr.size(); ++i ) + { + result += numStr[i]; + if((numStr.size() - i - 1) % 3 == 0 && i != numStr.size() - 1 ) + { + result += ","; + } + } + return result; +} + +template string addCommaSeparators( localIndex const & num ); +template string addCommaSeparators( globalIndex const & num ); + // put definition here so we can control the allowable values of T and // modication of this function triggers a whole code recompile...which // should be avoided. diff --git a/src/coreComponents/common/format/StringUtilities.hpp b/src/coreComponents/common/format/StringUtilities.hpp index 8f083816c86..b98f03afef9 100644 --- a/src/coreComponents/common/format/StringUtilities.hpp +++ b/src/coreComponents/common/format/StringUtilities.hpp @@ -227,6 +227,15 @@ string_view trimSpaces( string_view str ); string removeStringAndFollowingContent( string_view str, string_view strToRemove ); +/** + * @brief Add comma separators to an integral number for readability. + * @tparam T the integral type of the number to format. + * @param[in] num the integral number to format. + * @return a string representation of the number with comma separators. + */ +template< typename T > +string addCommaSeparators( T const & num ); + /** * @brief Take a string, and return a array1d with the cast values * @tparam T the type to which the string will be cast diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp index 5b056df8de7..70591e59973 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp @@ -40,12 +40,19 @@ namespace geos void HypreInterface::initialize() { -#ifdef GEOS_USE_OPENMP - GEOS_LOG_RANK_0_IF( omp_get_max_threads()>1, - "OMP_NUM_THREADS > 1 may not be optimal for certain hypre preconditioning options. " ); +#if defined(GEOS_USE_OPENMP) && defined(HYPRE_USING_OPENMP) + GEOS_LOG_RANK_0_IF( omp_get_max_threads() > 1, + "\n" + "********************************************************************\n" + "* *\n" + "* WARNING: OMP_NUM_THREADS > 1 MAY NOT BE OPTIMAL FOR CERTAIN *\n" + "* HYPRE PRECONDITIONING OPTIONS! *\n" + "* *\n" + "********************************************************************\n" + ); #endif - HYPRE_Init(); + HYPRE_Initialize(); #if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP HYPRE_SetExecutionPolicy( HYPRE_EXEC_DEVICE ); HYPRE_SetSpGemmUseVendor( 0 ); @@ -53,6 +60,15 @@ void HypreInterface::initialize() #endif HYPRE_SetMemoryLocation( hypre::memoryLocation ); HYPRE_SetPrintErrorMode( 1 ); + +#if defined(HYPRE_USING_UMPIRE) + HYPRE_SetUmpireUMPoolName( "HYPRE_UM" ); + HYPRE_SetUmpireHostPoolName( "HYPRE_HOST" ); + HYPRE_SetUmpireDevicePoolName( "HYPRE_DEVICE" ); + HYPRE_SetUmpirePinnedPoolName( "HYPRE_PINNED" ); +#endif + + HYPRE_SetLogLevel( getenv( "HYPRE_LOG_LEVEL" ) ? atoi( getenv( "HYPRE_LOG_LEVEL" ) ) : 0 ); } void HypreInterface::finalize() diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp index eef5b70b45b..feca89dd6d0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp @@ -91,11 +91,7 @@ class MGRStrategyBase MGRCoarseGridMethod m_levelCoarseGridMethod[numLevels]; ///< Coarse grid method for each level MGRGlobalSmootherType m_levelGlobalSmootherType[numLevels]; ///< Global smoother type for each level HYPRE_Int m_levelGlobalSmootherIters[numLevels]{ -1 }; ///< Number of global smoother iterations for each level -#if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CPU HYPRE_Real m_coarseGridThreshold{ 1.0e-20 }; ///< Coarse grid truncation threshold -#else - HYPRE_Real m_coarseGridThreshold{ 0.0 }; ///< Coarse grid truncation threshold -#endif // TODO: the following options are currently commented out in MGR's code. // Let's consider their use when re-enable in hypre @@ -167,21 +163,24 @@ class MGRStrategyBase GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetLevelSmoothIters( precond.ptr, m_levelGlobalSmootherIters ) ); GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetTruncateCoarseGridThreshold( precond.ptr, m_coarseGridThreshold ) ); GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetNonCpointsToFpoints( precond.ptr, 1 )); + GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetNonGalerkinMaxElmts( precond.ptr, 1 )); } /** * @brief Set up BoomerAMG to perform the solve for the displacement system * @param solver the solver wrapper + * @param separateComponents flag controlling the use of the separate displacement component (SDC) approximation */ - void setDisplacementAMG( HyprePrecWrapper & solver ) + void setDisplacementAMG( HyprePrecWrapper & solver, + integer const & separateComponents ) { GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGCreate( &solver.ptr ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetTol( solver.ptr, 0.0 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetMaxIter( solver.ptr, 1 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetMaxRowSum( solver.ptr, 1.0 ) ); - GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetStrongThreshold( solver.ptr, 0.8 ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetStrongThreshold( solver.ptr, 0.6 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetPrintLevel( solver.ptr, 0 ) ); - + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetInterpType( solver.ptr, hypre::getAMGInterpolationType( LinearSolverParameters::AMG::InterpType::modifiedExtendedE )) ); #if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetCoarsenType( solver.ptr, hypre::getAMGCoarseningType( LinearSolverParameters::AMG::CoarseningType::PMIS ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxType( solver.ptr, hypre::getAMGRelaxationType( LinearSolverParameters::AMG::SmootherType::chebyshev ) ) ); @@ -191,6 +190,7 @@ class MGRStrategyBase #endif GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumFunctions( solver.ptr, 3 ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetFilterFunctions( solver.ptr, separateComponents ) ); solver.setup = HYPRE_BoomerAMGSetup; solver.solve = HYPRE_BoomerAMGSolve; @@ -207,11 +207,12 @@ class MGRStrategyBase GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetPrintLevel( solver.ptr, 0 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetMaxIter( solver.ptr, 1 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( solver.ptr, 1 ) ); - GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggPMaxElmts( solver.ptr, 16 ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggPMaxElmts( solver.ptr, 20 ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggInterpType( solver.ptr, hypre::getAMGAggressiveInterpolationType( LinearSolverParameters::AMG::AggInterpType::multipass ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetTol( solver.ptr, 0.0 ) ); #if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP - GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggNumLevels( solver.ptr, 0 ) ); - GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetCoarsenType( solver.ptr, toUnderlying( AMGCoarseningType::PMIS ) ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetAggInterpType( solver.ptr, hypre::getAMGAggressiveInterpolationType( LinearSolverParameters::AMG::AggInterpType::modifiedExtendedE ) ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetCoarsenType( solver.ptr, hypre::getAMGCoarseningType( LinearSolverParameters::AMG::CoarseningType::PMIS ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetRelaxType( solver.ptr, getAMGRelaxationType( LinearSolverParameters::AMG::SmootherType::l1jacobi ) ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumSweeps( solver.ptr, 2 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetMaxRowSum( solver.ptr, 1.0 ) ); @@ -256,14 +257,16 @@ class MGRStrategyBase * @brief Set up BoomerAMG to perform the mechanics F-solve for the first F-relaxation * @param precond the preconditioner wrapper * @param mgrData auxiliary MGR data + * @param separateComponents flag controlling the use of the separate displacement component (SDC) approximation * * @note This function should be rethought once MGR allows for customizing boomerAMG (or * any other solver) for F-relaxation at any level */ void setMechanicsFSolver( HyprePrecWrapper & precond, - HypreMGRData & mgrData ) + HypreMGRData & mgrData, + integer const & separateComponents ) { - setDisplacementAMG( mgrData.mechSolver ); + setDisplacementAMG( mgrData.mechSolver, separateComponents ); HYPRE_MGRSetFSolver( precond.ptr, mgrData.mechSolver.solve, mgrData.mechSolver.setup, mgrData.mechSolver.ptr ); } diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp index cd4bc6321e9..0d76b175eab 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp @@ -88,7 +88,6 @@ void createAMG( LinearSolverParameters const & params, GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetTol( precond.ptr, 0.0 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetMaxIter( precond.ptr, 1 ) ); GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetPrintLevel( precond.ptr, logLevel ) ); - GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumFunctions( precond.ptr, params.dofsPerNode ) ); // Set maximum number of multigrid levels (default 25) GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetMaxLevels( precond.ptr, LvArray::integerConversion< HYPRE_Int >( params.amg.maxLevels ) ) ); @@ -174,7 +173,9 @@ void createAMG( LinearSolverParameters const & params, GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetPMaxElmts( precond.ptr, params.amg.interpolationMaxNonZeros ) ); } + // Unknown-based AMG parameters GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetNumFunctions( precond.ptr, params.amg.numFunctions ) ); + GEOS_LAI_CHECK_ERROR( HYPRE_BoomerAMGSetFilterFunctions( precond.ptr, params.amg.separateComponents ) ); if( params.amg.aggressiveNumLevels ) { @@ -340,32 +341,6 @@ void HyprePreconditioner::create( DofManager const * const dofManager ) HypreMatrix const & HyprePreconditioner::setupPreconditioningMatrix( HypreMatrix const & mat ) { - GEOS_MARK_FUNCTION; - - if( m_params.preconditionerType == LinearSolverParameters::PreconditionerType::mgr && m_params.mgr.separateComponents ) - { - GEOS_LAI_ASSERT_MSG( mat.dofManager() != nullptr, "MGR preconditioner requires a DofManager instance" ); - HypreMatrix Pu; - HypreMatrix Auu; - { - Stopwatch timer( m_makeRestrictorTime ); - mat.dofManager()->makeRestrictor( { { m_params.mgr.displacementFieldName, { 3, true } } }, mat.comm(), true, Pu ); - } - { - Stopwatch timer( m_computeAuuTime ); - mat.multiplyPtAP( Pu, Auu ); - } - { - Stopwatch timer( m_componentFilterTime ); - Auu.separateComponentFilter( m_precondMatrix, m_params.dofsPerNode ); - } - } - else if( m_params.preconditionerType == LinearSolverParameters::PreconditionerType::amg && m_params.amg.separateComponents ) - { - Stopwatch timer( m_componentFilterTime ); - mat.separateComponentFilter( m_precondMatrix, m_params.dofsPerNode ); - return m_precondMatrix; - } return mat; } @@ -385,12 +360,6 @@ void HyprePreconditioner::setup( Matrix const & mat ) { LvArray::system::FloatingPointExceptionGuard guard( FE_ALL_EXCEPT ); - // Perform setup of the MGR mechanics F-solver with SDC matrix, if used - if( m_mgrData && m_mgrData->mechSolver.ptr && m_mgrData->mechSolver.setup ) - { -// GEOS_LAI_CHECK_ERROR( m_mgrData->mechSolver.setup( m_mgrData->mechSolver.ptr, m_precondMatrix.unwrapped(), nullptr, nullptr ) ); - } - // Perform setup of the main solver, if needed if( m_precond->setup ) { diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp index 1f13028f4e1..ee7382f8ae3 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp @@ -95,26 +95,6 @@ class HyprePreconditioner final : public PreconditionerBase< HypreInterface > */ HyprePrecWrapper const & unwrapped() const; - /** - * @brief @return time spent setting up separate component matrix. - */ - real64 componentFilterTime() const - { - return m_componentFilterTime; - } - - /// @return time to construct restrictor matrix. - real64 makeRestrictorTime() const - { - return m_makeRestrictorTime; - } - - /// @return time to apply restrictor matrix. - real64 computeAuuTime() const - { - return m_computeAuuTime; - } - private: /** @@ -144,15 +124,6 @@ class HyprePreconditioner final : public PreconditionerBase< HypreInterface > /// Null space vectors std::unique_ptr< HypreNullSpace > m_nullSpace; - - /// Timing of separate component matrix construction - real64 m_componentFilterTime = 0.0; - - /// Timing of the restrictor matrix construction - real64 m_makeRestrictorTime = 0.0; - - /// Timing of the cost of applying the restrictor matrix to the system - real64 m_computeAuuTime = 0.0; }; } diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp index e882d55faba..a3f87354ed6 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp @@ -201,11 +201,7 @@ void HypreSolver::setup( HypreMatrix const & mat ) clear(); Base::setup( mat ); Stopwatch timer( m_result.setupTime ); - m_precond.setup( mat ); - m_componentFilterTime = m_precond.componentFilterTime(); - m_makeRestrictorTime = m_precond.makeRestrictorTime(); - m_computeAuuTime = m_precond.computeAuuTime(); m_solver = std::make_unique< HypreSolverWrapper >(); createHypreKrylovSolver( m_params, mat.comm(), *m_solver ); @@ -276,14 +272,18 @@ void HypreSolver::solve( HypreVector const & rhs, if( m_params.logLevel >= 1 ) { - GEOS_LOG_RANK_0( " Linear Solver | " << m_result.status << - " | Iterations: " << m_result.numIterations << - " | Final Rel Res: " << m_result.residualReduction << - " | Make Restrictor Time: " << m_makeRestrictorTime << - " | Compute Auu Time: " << m_computeAuuTime << - " | SC Filter Time: " << m_componentFilterTime << - " | Setup Time: " << m_result.setupTime << " s" << - " | Solve Time: " << m_result.solveTime << " s" ); + HYPRE_BigInt global_num_rows, global_num_nonzeros; + + // This involves an MPI collective call, and therefore we call it only when necessary + GEOS_LAI_CHECK_ERROR( HYPRE_IJMatrixGetGlobalInfo( matrix().unwrappedIJ(), + &global_num_rows, + &global_num_rows, // This is intentional and assuming the matrix is square + &global_num_nonzeros ) ); + + GEOS_LOG_RANK_0( GEOS_FMT( " Linear Solver | {} | Unknowns: {} | Nonzeros: {} | Iterations: {} | Final Rel Res: {:.4e} | Setup Time: {:.3f} s | Solve Time: {:.3f} s", + m_result.status, stringutilities::addCommaSeparators( global_num_rows ), + stringutilities::addCommaSeparators( global_num_nonzeros ), m_result.numIterations, + m_result.residualReduction, m_result.setupTime, m_result.solveTime ) ); } } diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp index 40364992a06..7cc8c5b5738 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp @@ -93,11 +93,6 @@ class HypreSolver final : public LinearSolverBase< HypreInterface > /// Pointers to hypre functions for the krylov solver std::unique_ptr< HypreSolverWrapper > m_solver; - - /// Time of the most recent SC matrix construction - real64 m_componentFilterTime; - real64 m_makeRestrictorTime; - real64 m_computeAuuTime; }; } // end geos namespace diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp index a205fe074c7..a309557dd81 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp @@ -399,6 +399,8 @@ inline HYPRE_Int getAMGCoarseType( LinearSolverParameters::AMG::CoarseType const { LinearSolverParameters::AMG::CoarseType::direct, 9 }, { LinearSolverParameters::AMG::CoarseType::chebyshev, 16 }, { LinearSolverParameters::AMG::CoarseType::l1jacobi, 18 }, + { LinearSolverParameters::AMG::CoarseType::gsElimWPivoting, 99 }, + { LinearSolverParameters::AMG::CoarseType::gsElimWInverse, 199 }, }; return findOption( typeMap, type, "multigrid coarse solver", "HyprePreconditioner" ); } diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp index f79ad85fb27..687be08785a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp @@ -84,10 +84,11 @@ class HybridSinglePhasePoromechanics : public MGRStrategyBase< 2 > /** * @brief Setup the MGR strategy. + * @param mgrParams MGR configuration parameters * @param precond preconditioner wrapper * @param mgrData auxiliary MGR data */ - void setup( LinearSolverParameters::MGR const &, + void setup( LinearSolverParameters::MGR const & mgrParams, HyprePrecWrapper & precond, HypreMGRData & mgrData ) { @@ -96,7 +97,7 @@ class HybridSinglePhasePoromechanics : public MGRStrategyBase< 2 > GEOS_LAI_CHECK_ERROR( HYPRE_MGRSetPMaxElmts( precond.ptr, 0 )); // Configure the BoomerAMG solver used as F-relaxation for the first level - setMechanicsFSolver( precond, mgrData ); + setMechanicsFSolver( precond, mgrData, mgrParams.separateComponents ); // Configure the BoomerAMG solver used as mgr coarse solver for the pressure reduced system setPressureAMG( mgrData.coarseSolver ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp index faf44e8adaf..6983d364a89 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp @@ -70,17 +70,18 @@ class Hydrofracture : public MGRStrategyBase< 1 > /** * @brief Setup the MGR strategy. + * @param mgrParams MGR configuration parameters * @param precond preconditioner wrapper * @param mgrData auxiliary MGR data */ - void setup( LinearSolverParameters::MGR const &, + void setup( LinearSolverParameters::MGR const & mgrParams, HyprePrecWrapper & precond, HypreMGRData & mgrData ) { setReduction( precond, mgrData ); // Configure the BoomerAMG solver used as F-relaxation for the first level - setMechanicsFSolver( precond, mgrData ); + setMechanicsFSolver( precond, mgrData, mgrParams.separateComponents ); // Configure the BoomerAMG solver used as mgr coarse solver for the pressure reduced system setPressureAMG( mgrData.coarseSolver ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp index 2ad38a87132..68dd3e5c837 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp @@ -76,10 +76,11 @@ class LagrangianContactMechanics : public MGRStrategyBase< 1 > /** * @brief Setup the MGR strategy. + * @param mgrParams MGR configuration parameters * @param precond preconditioner wrapper * @param mgrData auxiliary MGR data */ - void setup( LinearSolverParameters::MGR const &, + void setup( LinearSolverParameters::MGR const & mgrParams, HyprePrecWrapper & precond, HypreMGRData & mgrData ) { @@ -87,7 +88,7 @@ class LagrangianContactMechanics : public MGRStrategyBase< 1 > // Configure the BoomerAMG solver used as mgr coarse solver for the displacement reduced system // (note that no separate displacement component approach is used here) - setDisplacementAMG( mgrData.coarseSolver ); + setDisplacementAMG( mgrData.coarseSolver, mgrParams.separateComponents ); } }; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp index dcbe732e90e..cfeca18d3f1 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp @@ -72,20 +72,20 @@ class MultiphasePoromechanics : public MGRStrategyBase< 3 > setupLabels(); // Level 0 - m_levelFRelaxType[0] = MGRFRelaxationType::amgVCycle; - m_levelFRelaxIters[0] = 1; - m_levelInterpType[0] = MGRInterpolationType::jacobi; - m_levelRestrictType[0] = MGRRestrictionType::injection; - m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::nonGalerkin; - m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; + m_levelFRelaxType[0] = MGRFRelaxationType::amgVCycle; + m_levelFRelaxIters[0] = 1; + m_levelInterpType[0] = MGRInterpolationType::jacobi; + m_levelRestrictType[0] = MGRRestrictionType::injection; + m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::nonGalerkin; + m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; // Level 1 - m_levelFRelaxType[1] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[1] = 1; - m_levelInterpType[1] = MGRInterpolationType::jacobi; - m_levelRestrictType[1] = MGRRestrictionType::injection; - m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkin; - m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; + m_levelFRelaxType[1] = MGRFRelaxationType::jacobi; + m_levelFRelaxIters[1] = 1; + m_levelInterpType[1] = MGRInterpolationType::jacobi; + m_levelRestrictType[1] = MGRRestrictionType::injection; + m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkin; + m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // Level 2 m_levelFRelaxType[2] = MGRFRelaxationType::none; @@ -98,17 +98,18 @@ class MultiphasePoromechanics : public MGRStrategyBase< 3 > /** * @brief Setup the MGR strategy. + * @param mgrParams MGR configuration parameters * @param precond preconditioner wrapper * @param mgrData auxiliary MGR data */ - void setup( LinearSolverParameters::MGR const &, + void setup( LinearSolverParameters::MGR const & mgrParams, HyprePrecWrapper & precond, HypreMGRData & mgrData ) { setReduction( precond, mgrData ); // Configure the BoomerAMG solver used as F-relaxation for the first level - setMechanicsFSolver( precond, mgrData ); + setMechanicsFSolver( precond, mgrData, mgrParams.separateComponents ); // Configure the BoomerAMG solver used as mgr coarse solver for the pressure reduced system setPressureAMG( mgrData.coarseSolver ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp index 69038faa599..18293db1f12 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp @@ -118,7 +118,7 @@ class MultiphasePoromechanicsReservoirFVM : public MGRStrategyBase< 4 > /** * @brief Setup the MGR strategy. - * @param mgrParams parameters for the configuration of the MGR recipe + * @param mgrParams MGR configuration parameters * @param precond preconditioner wrapper * @param mgrData auxiliary MGR data */ @@ -136,7 +136,7 @@ class MultiphasePoromechanicsReservoirFVM : public MGRStrategyBase< 4 > setReduction( precond, mgrData ); // Configure the BoomerAMG solver used as F-relaxation for the first level - setMechanicsFSolver( precond, mgrData ); + setMechanicsFSolver( precond, mgrData, mgrParams.separateComponents ); // Configure the BoomerAMG solver used as mgr coarse solver for the pressure reduced system setPressureAMG( mgrData.coarseSolver ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp index 6a4994b90a7..da9b9b8e2d8 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp @@ -70,17 +70,18 @@ class SinglePhasePoromechanics : public MGRStrategyBase< 1 > /** * @brief Setup the MGR strategy. + * @param mgrParams MGR configuration parameters * @param precond preconditioner wrapper * @param mgrData auxiliary MGR data */ - void setup( LinearSolverParameters::MGR const &, + void setup( LinearSolverParameters::MGR const & mgrParams, HyprePrecWrapper & precond, HypreMGRData & mgrData ) { setReduction( precond, mgrData ); // Configure the BoomerAMG solver used as F-relaxation for the first level - setMechanicsFSolver( precond, mgrData ); + setMechanicsFSolver( precond, mgrData, mgrParams.separateComponents ); // Configure the BoomerAMG solver used as mgr coarse solver for the pressure reduced system setPressureAMG( mgrData.coarseSolver ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp index 26b054f9a2d..88be6a13d9b 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp @@ -85,17 +85,18 @@ class SinglePhasePoromechanicsReservoirFVM : public MGRStrategyBase< 2 > /** * @brief Setup the MGR strategy. + * @param mgrParams MGR configuration parameters * @param precond preconditioner wrapper * @param mgrData auxiliary MGR data */ - void setup( LinearSolverParameters::MGR const &, + void setup( LinearSolverParameters::MGR const & mgrParams, HyprePrecWrapper & precond, HypreMGRData & mgrData ) { setReduction( precond, mgrData ); // Configure the BoomerAMG solver used as F-relaxation for the first level - setMechanicsFSolver( precond, mgrData ); + setMechanicsFSolver( precond, mgrData, mgrParams.separateComponents ); // Configure the BoomerAMG solver used as mgr coarse solver for the pressure reduced system setPressureAMG( mgrData.coarseSolver ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp index 7da6fb6229f..52324cc6ba1 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp @@ -75,17 +75,18 @@ class SolidMechanicsEmbeddedFractures : public MGRStrategyBase< 1 > /** * @brief Setup the MGR strategy. + * @param mgrParams MGR configuration parameters * @param precond preconditioner wrapper * @param mgrData auxiliary MGR data */ - void setup( LinearSolverParameters::MGR const &, + void setup( LinearSolverParameters::MGR const & mgrParams, HyprePrecWrapper & precond, HypreMGRData & mgrData ) { setReduction( precond, mgrData ); // Configure the BoomerAMG solver used as mgr coarse solver for the displacement reduced system - setDisplacementAMG( mgrData.coarseSolver ); + setDisplacementAMG( mgrData.coarseSolver, mgrParams.separateComponents ); } }; diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp index 129e2b4abd0..1abf2f77d94 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp @@ -75,20 +75,20 @@ class ThermalMultiphasePoromechanics : public MGRStrategyBase< 3 > setupLabels(); // Level 0 - m_levelFRelaxType[0] = MGRFRelaxationType::amgVCycle; - m_levelFRelaxIters[0] = 1; - m_levelInterpType[0] = MGRInterpolationType::jacobi; - m_levelRestrictType[0] = MGRRestrictionType::injection; - m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::nonGalerkin; - m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; + m_levelFRelaxType[0] = MGRFRelaxationType::amgVCycle; + m_levelFRelaxIters[0] = 1; + m_levelInterpType[0] = MGRInterpolationType::jacobi; + m_levelRestrictType[0] = MGRRestrictionType::injection; + m_levelCoarseGridMethod[0] = MGRCoarseGridMethod::nonGalerkin; + m_levelGlobalSmootherType[0] = MGRGlobalSmootherType::none; // Level 1 - m_levelFRelaxType[1] = MGRFRelaxationType::jacobi; - m_levelFRelaxIters[1] = 1; - m_levelInterpType[1] = MGRInterpolationType::jacobi; - m_levelRestrictType[1] = MGRRestrictionType::injection; - m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkin; - m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; + m_levelFRelaxType[1] = MGRFRelaxationType::jacobi; + m_levelFRelaxIters[1] = 1; + m_levelInterpType[1] = MGRInterpolationType::jacobi; + m_levelRestrictType[1] = MGRRestrictionType::injection; + m_levelCoarseGridMethod[1] = MGRCoarseGridMethod::galerkin; + m_levelGlobalSmootherType[1] = MGRGlobalSmootherType::none; // Level 2 m_levelFRelaxType[2] = MGRFRelaxationType::none; @@ -101,18 +101,18 @@ class ThermalMultiphasePoromechanics : public MGRStrategyBase< 3 > /** * @brief Setup the MGR strategy. + * @param mgrParams MGR configuration parameters * @param precond preconditioner wrapper * @param mgrData auxiliary MGR data */ - void setup( LinearSolverParameters::MGR const &, + void setup( LinearSolverParameters::MGR const & mgrParams, HyprePrecWrapper & precond, HypreMGRData & mgrData ) { setReduction( precond, mgrData ); - // CHECK: the mechanics solver setup was missing: was there a reason? // Configure the BoomerAMG solver used as F-relaxation for the first level - setMechanicsFSolver( precond, mgrData ); + setMechanicsFSolver( precond, mgrData, mgrParams.separateComponents ); // Configure the BoomerAMG solver used as mgr coarse solver for the pressure/temperature reduced system setPressureTemperatureAMG( mgrData.coarseSolver ); diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp index af5889fc7cd..d14919e57ee 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp @@ -72,18 +72,18 @@ class ThermalSinglePhasePoromechanics : public MGRStrategyBase< 1 > /** * @brief Setup the MGR strategy. + * @param mgrParams MGR configuration parameters * @param precond preconditioner wrapper * @param mgrData auxiliary MGR data */ - void setup( LinearSolverParameters::MGR const &, + void setup( LinearSolverParameters::MGR const & mgrParams, HyprePrecWrapper & precond, HypreMGRData & mgrData ) { setReduction( precond, mgrData ); - // CHECK: the mechanics solver setup was missing: was there a reason? // Configure the BoomerAMG solver used as F-relaxation for the first level - setMechanicsFSolver( precond, mgrData ); + setMechanicsFSolver( precond, mgrData, mgrParams.separateComponents ); // Configure the BoomerAMG solver used as mgr coarse solver for the pressure/temperature reduced system setPressureTemperatureAMG( mgrData.coarseSolver ); diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp index 3c47e40e370..cd0aecfc572 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp @@ -118,7 +118,7 @@ struct LinearSolverParameters real64 relTolerance = 1e-6; ///< Relative convergence tolerance for iterative solvers integer maxIterations = 200; ///< Max iterations before declaring convergence failure #if GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_CUDA || GEOS_USE_HYPRE_DEVICE == GEOS_USE_HYPRE_HIP - integer maxRestart = 50; ///< Max number of vectors in Krylov basis before restarting (GPUs) + integer maxRestart = 100; ///< Max number of vectors in Krylov basis before restarting (GPUs) #else integer maxRestart = 200; ///< Max number of vectors in Krylov basis before restarting (CPUs) #endif @@ -184,7 +184,9 @@ struct LinearSolverParameters l1sgs, ///< l1-Symmetric Gauss-Seidel chebyshev, ///< Chebyshev polynomial (GPU support in hypre) direct, ///< Direct solver as preconditioner - bgs ///< Gauss-Seidel smoothing (backward sweep) + bgs, ///< Gauss-Seidel smoothing (backward sweep) + gsElimWPivoting, ///< Gaussian Elimination with pivoting direct solver + gsElimWInverse ///< Direct inverse with Gaussian Elimination }; /// AMG coarsening types (HYPRE only) @@ -298,9 +300,8 @@ struct LinearSolverParameters StrategyType strategy = StrategyType::invalid; ///< Predefined MGR solution strategy (solver specific) integer separateComponents = false; ///< Apply a separate displacement component (SDC) filter before AMG construction - string displacementFieldName; ///< Displacement field name need for SDC filter - integer areWellsShut = false; ///< Flag to let MGR know that wells are shut, and that jacobi can be applied to the - ///< well block + integer areWellsShut = false; ///< Flag to let MGR know that wells are shut, and that jacobi can be applied to the + ///< well block } mgr; ///< Multigrid reduction (MGR) parameters @@ -424,7 +425,9 @@ ENUM_STRINGS( LinearSolverParameters::AMG::CoarseType, "l1sgs", "chebyshev", "direct", - "bgs" ); + "bgs", + "gsElimWPivoting", + "gsElimWInverse" ); /// Declare strings associated with enumeration values. ENUM_STRINGS( LinearSolverParameters::AMG::CoarseningType, diff --git a/src/coreComponents/mesh/DomainPartition.cpp b/src/coreComponents/mesh/DomainPartition.cpp index 0dd8a8a3623..9604c30932c 100644 --- a/src/coreComponents/mesh/DomainPartition.cpp +++ b/src/coreComponents/mesh/DomainPartition.cpp @@ -328,24 +328,8 @@ void DomainPartition::outputPartitionInformation() const return std::make_pair( objectManager.getNumberOfLocalIndices(), objectManager.getNumberOfGhosts() ); }; - auto addCommaSeparators = []( localIndex const num ) - { - std::string const numStr = std::to_string( num ); - std::string result; - for( std::size_t i = 0; i < numStr.size(); ++i ) - { - result += numStr[i]; - if( ( numStr.size() - i - 1 ) % 3 == 0 && i != numStr.size() - 1 ) - { - result += ","; - } - } - return result; - }; - GEOS_LOG_RANK_0( "MPI Partition information:" ); - forMeshBodies( [&]( MeshBody const & meshBody ) { meshBody.getMeshLevels().forSubGroupsIndex< MeshLevel >( [&]( int const level, MeshLevel const & meshLevel ) @@ -427,24 +411,24 @@ void DomainPartition::outputPartitionInformation() const GEOS_LOG_RANK_0( GEOS_FMT( " | min | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} |", - addCommaSeparators( minNumLocalNodes ), - addCommaSeparators( minNumGhostNodes ), - addCommaSeparators( minNumLocalEdges ), - addCommaSeparators( minNumGhostEdges ), - addCommaSeparators( minNumLocalFaces ), - addCommaSeparators( minNumGhostFaces ), - addCommaSeparators( minNumLocalElems ), - addCommaSeparators( minNumGhostElems ) ) ); + stringutilities::addCommaSeparators( minNumLocalNodes ), + stringutilities::addCommaSeparators( minNumGhostNodes ), + stringutilities::addCommaSeparators( minNumLocalEdges ), + stringutilities::addCommaSeparators( minNumGhostEdges ), + stringutilities::addCommaSeparators( minNumLocalFaces ), + stringutilities::addCommaSeparators( minNumGhostFaces ), + stringutilities::addCommaSeparators( minNumLocalElems ), + stringutilities::addCommaSeparators( minNumGhostElems ) ) ); GEOS_LOG_RANK_0( GEOS_FMT( " | max | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} |", - addCommaSeparators( maxNumLocalNodes ), - addCommaSeparators( maxNumGhostNodes ), - addCommaSeparators( maxNumLocalEdges ), - addCommaSeparators( maxNumGhostEdges ), - addCommaSeparators( maxNumLocalFaces ), - addCommaSeparators( maxNumGhostFaces ), - addCommaSeparators( maxNumLocalElems ), - addCommaSeparators( maxNumGhostElems ) ) ); + stringutilities::addCommaSeparators( maxNumLocalNodes ), + stringutilities::addCommaSeparators( maxNumGhostNodes ), + stringutilities::addCommaSeparators( maxNumLocalEdges ), + stringutilities::addCommaSeparators( maxNumGhostEdges ), + stringutilities::addCommaSeparators( maxNumLocalFaces ), + stringutilities::addCommaSeparators( maxNumGhostFaces ), + stringutilities::addCommaSeparators( maxNumLocalElems ), + stringutilities::addCommaSeparators( maxNumGhostElems ) ) ); GEOS_LOG_RANK_0( " |------------------------------------------------------------------------------------------------------------------------------------------------|" ); @@ -456,14 +440,14 @@ void DomainPartition::outputPartitionInformation() const { GEOS_LOG( GEOS_FMT( " | {:14} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | {:>13} | ", rank, - addCommaSeparators( numLocalNodes ), - addCommaSeparators( numGhostNodes ), - addCommaSeparators( numLocalEdges ), - addCommaSeparators( numGhostEdges ), - addCommaSeparators( numLocalFaces ), - addCommaSeparators( numGhostFaces ), - addCommaSeparators( numLocalElems ), - addCommaSeparators( numGhostElems ) ) ); + stringutilities::addCommaSeparators( numLocalNodes ), + stringutilities::addCommaSeparators( numGhostNodes ), + stringutilities::addCommaSeparators( numLocalEdges ), + stringutilities::addCommaSeparators( numGhostEdges ), + stringutilities::addCommaSeparators( numLocalFaces ), + stringutilities::addCommaSeparators( numGhostFaces ), + stringutilities::addCommaSeparators( numLocalElems ), + stringutilities::addCommaSeparators( numGhostElems ) ) ); } MpiWrapper::barrier(); } diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp index 6ace1301164..fee37cee7b9 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -44,15 +44,14 @@ SolidMechanicsAugmentedLagrangianContact::SolidMechanicsAugmentedLagrangianConta m_faceTypeToFiniteElements["Quadrilateral"] = std::make_unique< finiteElement::H1_QuadrilateralFace_Lagrange1_GaussLegendre2 >(); m_faceTypeToFiniteElements["Triangle"] = std::make_unique< finiteElement::H1_TriangleFace_Lagrange1_Gauss1 >(); + LinearSolverParameters & linParams = m_linearSolverParameters.get(); addLogLevel< logInfo::Configuration >(); + linParams.isSymmetric = true; + linParams.dofsPerNode = 3; + linParams.mgr.separateComponents = true; // TODO Implement the MGR strategy - - // Set the default linear solver parameters - //LinearSolverParameters & linParams = m_linearSolverParameters.get(); - //linParams.dofsPerNode = 3; - //linParams.isSymmetric = true; - //linParams.amg.separateComponents = true; + //linParams.mgr.strategy = LinearSolverParameters::MGR::StrategyType::solidMechanicsAugumentedLagrangianContact; } SolidMechanicsAugmentedLagrangianContact::~SolidMechanicsAugmentedLagrangianContact() diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index 0beb4428f2b..65584046e5c 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -68,15 +68,16 @@ void SolidMechanicsEmbeddedFractures::postInputInitialization() LinearSolverParameters & linParams = m_linearSolverParameters.get(); + linParams.dofsPerNode = 3; if( m_useStaticCondensation ) { - linParams.dofsPerNode = 3; linParams.isSymmetric = true; linParams.amg.separateComponents = true; } else { linParams.mgr.strategy = LinearSolverParameters::MGR::StrategyType::solidMechanicsEmbeddedFractures; + linParams.mgr.separateComponents = true; } } diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 08d5fec172e..003ed8cb7f7 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -77,7 +77,6 @@ SolidMechanicsLagrangeContact::SolidMechanicsLagrangeContact( const string & nam LinearSolverParameters & linSolParams = m_linearSolverParameters.get(); linSolParams.mgr.strategy = LinearSolverParameters::MGR::StrategyType::lagrangianContactMechanics; linSolParams.mgr.separateComponents = true; - linSolParams.mgr.displacementFieldName = solidMechanics::totalDisplacement::key(); linSolParams.dofsPerNode = 3; } diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index 9cb0333497d..560569a8b63 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -77,10 +77,15 @@ void CompositionalMultiphaseReservoirAndWells<>:: setMGRStrategy() { + LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; + if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM ) { // add Reservoir - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirHybridFVM; + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirHybridFVM; } else if( isThermal() ) { @@ -90,7 +95,7 @@ setMGRStrategy() else { // add Reservoir - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirFVM; + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirFVM; } } @@ -99,6 +104,11 @@ void CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> >:: setMGRStrategy() { + LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; + // flow solver here is indeed flow solver, not poromechanics solver if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM ) { @@ -107,7 +117,7 @@ setMGRStrategy() else { // add Reservoir - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanicsReservoirFVM; + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanicsReservoirFVM; } } diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index d3322e839ff..61529778ea6 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -84,8 +84,7 @@ HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & // This may need to be different depending on whether poroelasticity is on or not. m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::hydrofracture; - m_linearSolverParameters.get().mgr.separateComponents = false; - m_linearSolverParameters.get().mgr.displacementFieldName = solidMechanics::totalDisplacement::key(); + m_linearSolverParameters.get().mgr.separateComponents = true; m_linearSolverParameters.get().dofsPerNode = 3; } diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 4d1e0114728..c477f2b83d3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -49,7 +49,6 @@ MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::MultiphasePoromechanic LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanics; linearSolverParameters.mgr.separateComponents = true; - linearSolverParameters.mgr.displacementFieldName = solidMechanics::totalDisplacement::key(); linearSolverParameters.dofsPerNode = 3; } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 46233badae0..8026c45a80a 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -49,7 +49,6 @@ SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::SinglePhasePoromechan LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanics; linearSolverParameters.mgr.separateComponents = true; - linearSolverParameters.mgr.displacementFieldName = solidMechanics::totalDisplacement::key(); linearSolverParameters.dofsPerNode = 3; } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 77bbc8fdeab..a2a258ac5bc 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -47,8 +47,7 @@ SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::SinglePhasePoromecha { LinearSolverParameters & params = this->m_linearSolverParameters.get(); params.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsConformingFractures; - params.mgr.separateComponents = false; - params.mgr.displacementFieldName = solidMechanics::totalDisplacement::key(); + params.mgr.separateComponents = true; params.dofsPerNode = 3; } diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 67aa66cb051..394b95d08d3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -44,8 +44,7 @@ SinglePhasePoromechanicsEmbeddedFractures::SinglePhasePoromechanicsEmbeddedFract { LinearSolverParameters & params = m_linearSolverParameters.get(); params.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsEmbeddedFractures; - params.mgr.separateComponents = false; - params.mgr.displacementFieldName = solidMechanics::totalDisplacement::key(); + params.mgr.separateComponents = true; params.dofsPerNode = 3; } diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index c2f1cff9940..17f7f3517f6 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -133,6 +133,7 @@ void SolidMechanicsLagrangianFEM::postInputInitialization() LinearSolverParameters & linParams = m_linearSolverParameters.get(); linParams.isSymmetric = true; linParams.dofsPerNode = 3; + linParams.amg.numFunctions = linParams.dofsPerNode; linParams.amg.separateComponents = true; m_surfaceGenerator = this->getParent().getGroupPointer< PhysicsSolverBase >( m_surfaceGeneratorName ); diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index fa48a1f1975..6617fd74792 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -1796,7 +1796,7 @@ stress - traction is applied to the faces as specified by the inner product of i - + @@ -1867,7 +1867,7 @@ the relative residual norm satisfies: - + From fe987d81a61349139915b1d1beef8028d9a7b2c3 Mon Sep 17 00:00:00 2001 From: alexbenedicto Date: Thu, 14 Nov 2024 13:27:48 -0800 Subject: [PATCH 249/286] fix: out of date python package names correction (#3438) --- scripts/setupPythonEnvironment.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/setupPythonEnvironment.bash b/scripts/setupPythonEnvironment.bash index 2faf325275e..9e7babb894a 100755 --- a/scripts/setupPythonEnvironment.bash +++ b/scripts/setupPythonEnvironment.bash @@ -11,8 +11,7 @@ PIP_CMD="pip --disable-pip-version-check" PACKAGE_BRANCH=main -declare -a TARGET_PACKAGES=("geos-mesh-tools" - "geos-mesh-doctor" +declare -a TARGET_PACKAGES=("geos-mesh" "geos-xml-tools" "hdf5-wrapper" "pygeos-tools" @@ -25,6 +24,7 @@ declare -a LINK_SCRIPTS=("preprocess_xml" "geos_ats_log_check" "geos_ats_restart_check" "geos_ats_curve_check" + "mesh-doctor" "activate" "python") From e9492b5354039ac641c27996b65b502d006e6883 Mon Sep 17 00:00:00 2001 From: Tom Byer <149726499+tjb-ltk@users.noreply.github.com> Date: Fri, 15 Nov 2024 06:56:18 -0800 Subject: [PATCH 250/286] feat: Nonlinear Max Change Reporting to include cell location (#3327) --- src/coreComponents/common/MpiWrapper.hpp | 35 +++++++++ src/coreComponents/mesh/ObjectManagerBase.cpp | 2 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 73 ++++++++++++++----- .../fluidFlow/CompositionalMultiphaseFVM.hpp | 13 ++++ .../compositional/SolutionScalingKernel.hpp | 27 +++++-- 5 files changed, 124 insertions(+), 26 deletions(-) diff --git a/src/coreComponents/common/MpiWrapper.hpp b/src/coreComponents/common/MpiWrapper.hpp index 998524d3b13..f6f0136eb55 100644 --- a/src/coreComponents/common/MpiWrapper.hpp +++ b/src/coreComponents/common/MpiWrapper.hpp @@ -608,6 +608,16 @@ struct MpiWrapper */ template< typename T > static void max( Span< T const > src, Span< T > dst, MPI_Comm comm = MPI_COMM_GEOS ); + + + /** + * @brief Convenience function for MPI_Gather using a MPI_MAX operation on struct of value and location + * @brief Max is performed on value and location (global index) is returned + * @param[in] struct to send into the max gather. + * @return struct with max val and location + */ + template< typename T > static T maxValLoc( T localValueLocation, MPI_Comm comm = MPI_COMM_GEOS ); + }; namespace internal @@ -1115,7 +1125,32 @@ void MpiWrapper::reduce( Span< T const > const src, Span< T > const dst, Reducti reduce( src.data(), dst.data(), LvArray::integerConversion< int >( src.size() ), getMpiOp( op ), root, comm ); } +// Mpi helper function to return struct containing the max value and location across ranks +template< typename T > +T MpiWrapper::maxValLoc( T localValueLocation, MPI_Comm comm ) +{ + // Ensure T is trivially copyable + static_assert( std::is_trivially_copyable< T >::value, "maxValLoc requires a trivially copyable type" ); + // T to have only 2 data members named value and location + static_assert( (sizeof(T::value)+sizeof(T::location)) == sizeof(T) ); + + // Ensure T has value and location members are scalars + static_assert( std::is_scalar_v< decltype(T::value) > || std::is_scalar_v< decltype(T::location) >, "members of struct should be scalar" ); + static_assert( !std::is_pointer_v< decltype(T::value) > && !std::is_pointer_v< decltype(T::location) >, "members of struct should not be pointers" ); + + // receive "buffer" + int const numProcs = commSize( comm ); + std::vector< T > recvValLoc( numProcs ); + + MPI_Allgather( &localValueLocation, sizeof(T), MPI_BYTE, recvValLoc.data(), sizeof(T), MPI_BYTE, comm ); + + T maxValLoc= *std::max_element( recvValLoc.begin(), + recvValLoc.end(), + []( auto & lhs, auto & rhs ) -> bool {return lhs.value < rhs.value; } ); + + return maxValLoc; +} } /* namespace geos */ #endif /* GEOS_COMMON_MPIWRAPPER_HPP_ */ diff --git a/src/coreComponents/mesh/ObjectManagerBase.cpp b/src/coreComponents/mesh/ObjectManagerBase.cpp index aaa209044cf..3928a2002ad 100644 --- a/src/coreComponents/mesh/ObjectManagerBase.cpp +++ b/src/coreComponents/mesh/ObjectManagerBase.cpp @@ -43,7 +43,7 @@ ObjectManagerBase::ObjectManagerBase( string const & name, registerGroup( groupKeyStruct::neighborDataString(), &m_neighborGroup ); registerWrapper( viewKeyStruct::localToGlobalMapString(), &m_localToGlobalMap ). - setApplyDefaultValue( -1 ). + setApplyDefaultValue( -1 ).setPlotLevel( PlotLevel::LEVEL_0 ). setDescription( "Array that contains a map from localIndex to globalIndex." ); registerWrapper( viewKeyStruct::globalToLocalMapString(), &m_globalToLocalMap ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 784c7810169..41415b53c6a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -490,9 +490,13 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d string const dofKey = dofManager.getKey( viewKeyStruct::elemDofFieldString() ); real64 scalingFactor = 1.0; - real64 maxDeltaPres = 0.0, maxDeltaCompDens = 0.0, maxDeltaTemp = 0.0; real64 minPresScalingFactor = 1.0, minCompDensScalingFactor = 1.0, minTempScalingFactor = 1.0; + + std::vector< valueAndLocationType > regionDeltaPresMaxLoc; + std::vector< valueAndLocationType > regionDeltaTempMaxLoc; + std::vector< valueAndLocationType > regionDeltaCompDensMaxLoc; + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) @@ -501,6 +505,7 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d [&]( localIndex const, ElementSubRegionBase & subRegion ) { + arrayView1d< globalIndex const > const localToGlobalMap = subRegion.localToGlobalMap(); arrayView1d< real64 const > const pressure = subRegion.getField< fields::flow::pressure >(); arrayView1d< real64 const > const temperature = subRegion.getField< fields::flow::temperature >(); arrayView2d< real64 const, compflow::USD_COMP > const compDens = subRegion.getField< fields::flow::globalCompDensity >(); @@ -509,6 +514,7 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d arrayView1d< real64 > compDensScalingFactor = subRegion.getField< fields::flow::globalCompDensityScalingFactor >(); const integer temperatureOffset = m_numComponents+1; + auto const subRegionData = m_isThermal ? thermalCompositionalMultiphaseBaseKernels:: @@ -545,38 +551,67 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d dofKey, subRegion, localSolution ); - - if( m_scalingType == ScalingType::Global ) + if( subRegion.size() > 0 || subRegion.size() != subRegion.getNumberOfGhosts() ) { - scalingFactor = std::min( scalingFactor, subRegionData.localMinVal ); + if( m_scalingType == ScalingType::Global ) + { + scalingFactor = std::min( scalingFactor, subRegionData.localMinVal ); + } + + regionDeltaPresMaxLoc.push_back( valueAndLocationType( subRegionData.localMaxDeltaPres, localToGlobalMap[subRegionData.localMaxDeltaPresLoc] ) ); + minPresScalingFactor = std::min( minPresScalingFactor, subRegionData.localMinPresScalingFactor ); + + regionDeltaCompDensMaxLoc.push_back( valueAndLocationType( subRegionData.localMaxDeltaCompDens, localToGlobalMap[subRegionData.localMaxDeltaCompDensLoc] ) ); + minCompDensScalingFactor = std::min( minCompDensScalingFactor, subRegionData.localMinCompDensScalingFactor ); + + if( m_isThermal ) + { + regionDeltaTempMaxLoc.push_back( valueAndLocationType( subRegionData.localMaxDeltaTemp, localToGlobalMap[subRegionData.localMaxDeltaTempLoc] ) ); + minTempScalingFactor = std::min( minTempScalingFactor, subRegionData.localMinTempScalingFactor ); + } } - maxDeltaPres = std::max( maxDeltaPres, subRegionData.localMaxDeltaPres ); - maxDeltaCompDens = std::max( maxDeltaCompDens, subRegionData.localMaxDeltaCompDens ); - maxDeltaTemp = std::max( maxDeltaTemp, subRegionData.localMaxDeltaTemp ); - minPresScalingFactor = std::min( minPresScalingFactor, subRegionData.localMinPresScalingFactor ); - minCompDensScalingFactor = std::min( minCompDensScalingFactor, subRegionData.localMinCompDensScalingFactor ); - minTempScalingFactor = std::min( minTempScalingFactor, subRegionData.localMinTempScalingFactor ); } ); } ); + auto [localDeltaPresMax, localPresMaxLoc] = *std::max_element( begin( regionDeltaPresMaxLoc ), end( regionDeltaPresMaxLoc ), []( auto & lhs, auto & rhs ) { + return lhs.value < rhs.value; + } ); + auto globalDeltaPresMax = MpiWrapper::maxValLoc( valueAndLocationType( localDeltaPresMax, localPresMaxLoc )); + auto [ localDeltaCompDensMax, localCompDensMaxLoc ] = *std::max_element( begin( regionDeltaCompDensMaxLoc ), end( regionDeltaCompDensMaxLoc ), []( auto & lhs, auto & rhs ) { + return lhs.value < rhs.value; + } ); + auto globalDeltaCompDensMax = MpiWrapper::maxValLoc( valueAndLocationType( localDeltaCompDensMax, localCompDensMaxLoc )); + scalingFactor = MpiWrapper::min( scalingFactor ); - maxDeltaPres = MpiWrapper::max( maxDeltaPres ); - maxDeltaCompDens = MpiWrapper::max( maxDeltaCompDens ); minPresScalingFactor = MpiWrapper::min( minPresScalingFactor ); minCompDensScalingFactor = MpiWrapper::min( minCompDensScalingFactor ); string const massUnit = m_useMass ? "kg/m3" : "mol/m3"; - GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Max pressure change = {} Pa (before scaling)", - getName(), GEOS_FMT( "{:.{}f}", maxDeltaPres, 3 ) ) ); - GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Max component density change = {} {} (before scaling)", - getName(), GEOS_FMT( "{:.{}f}", maxDeltaCompDens, 3 ), massUnit ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, + GEOS_FMT( " {}: Max pressure change = {:.3f} Pa (before scaling) at cell {}", + getName(), + globalDeltaPresMax.value, + globalDeltaPresMax.location ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, + GEOS_FMT( " {}: Max component density change = {:.3f} (before scaling) at cell {}", + getName(), + globalDeltaCompDensMax.value, + massUnit, + globalDeltaCompDensMax.location ) ); if( m_isThermal ) { - maxDeltaTemp = MpiWrapper::max( maxDeltaTemp ); + auto [localDeltaTempMax, localDeltaTempMaxLoc ] = *std::max_element( begin( regionDeltaTempMaxLoc ), end( regionDeltaTempMaxLoc ), []( auto & lhs, auto & rhs ) { + return lhs.value < rhs.value; + } ); + auto globalMaxDeltaTemp = MpiWrapper::maxValLoc( valueAndLocationType( localDeltaTempMax, localDeltaTempMaxLoc )); + minTempScalingFactor = MpiWrapper::min( minTempScalingFactor ); - GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, GEOS_FMT( " {}: Max temperature change = {} K (before scaling)", - getName(), GEOS_FMT( "{:.{}f}", maxDeltaTemp, 3 ) ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, + GEOS_FMT( " {}: Max temperature change = {:.3f} K (before scaling) at cell maxRegionDeltaTempLoc {}", + getName(), + globalMaxDeltaTemp.value, + globalMaxDeltaTemp.location ) ); } if( m_scalingType == ScalingType::Local ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp index 88249873115..48efd363a96 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp @@ -174,6 +174,19 @@ class CompositionalMultiphaseFVM : public CompositionalMultiphaseBase Local ///< Scale the Newton update locally (modifies the Newton direction) }; + /** + * @brief Storage for value and element location, used to determine global max + location + */ + template< typename VALUE_TYPE, typename INDEX_TYPE > + struct valueAndLocation + { + valueAndLocation(){} + valueAndLocation( VALUE_TYPE val, INDEX_TYPE loc ): value( val ), location( loc ){} + VALUE_TYPE value; + INDEX_TYPE location; + }; + typedef valueAndLocation< real64, globalIndex > valueAndLocationType; + protected: virtual void postInputInitialization() override; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp index 3158d2f7537..399ccaaa6bc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp @@ -106,24 +106,33 @@ class SolutionScalingKernel : public SolutionScalingAndCheckingKernelBase< real6 StackVariables( real64 _localMinVal, real64 _localMaxDeltaPres, + localIndex _localMaxDeltaPresLoc, real64 _localMaxDeltaTemp, + localIndex _localMaxDeltaTempLoc, real64 _localMaxDeltaCompDens, + localIndex _localMaxDeltaCompDensLoc, real64 _localMinPresScalingFactor, real64 _localMinTempScalingFactor, real64 _localMinCompDensScalingFactor ) : Base::StackVariables( _localMinVal ), localMaxDeltaPres( _localMaxDeltaPres ), + localMaxDeltaPresLoc( _localMaxDeltaPresLoc ), localMaxDeltaTemp( _localMaxDeltaTemp ), + localMaxDeltaTempLoc( _localMaxDeltaTempLoc ), localMaxDeltaCompDens( _localMaxDeltaCompDens ), + localMaxDeltaCompDensLoc( _localMaxDeltaCompDensLoc ), localMinPresScalingFactor( _localMinPresScalingFactor ), localMinTempScalingFactor( _localMinTempScalingFactor ), localMinCompDensScalingFactor( _localMinCompDensScalingFactor ) { } real64 localMaxDeltaPres; + localIndex localMaxDeltaPresLoc; real64 localMaxDeltaTemp; + localIndex localMaxDeltaTempLoc; real64 localMaxDeltaCompDens; + localIndex localMaxDeltaCompDensLoc; real64 localMinPresScalingFactor; real64 localMinTempScalingFactor; @@ -145,9 +154,9 @@ class SolutionScalingKernel : public SolutionScalingAndCheckingKernelBase< real6 { RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > globalScalingFactor( 1.0 ); - RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaPres( 0.0 ); - RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaTemp( 0.0 ); - RAJA::ReduceMax< ReducePolicy< POLICY >, real64 > maxDeltaCompDens( 0.0 ); + RAJA::ReduceMaxLoc< ReducePolicy< POLICY >, real64 > maxDeltaPres( std::numeric_limits< real64 >::min(), -1 ); + RAJA::ReduceMaxLoc< ReducePolicy< POLICY >, real64 > maxDeltaTemp( std::numeric_limits< real64 >::min(), -1 ); + RAJA::ReduceMaxLoc< ReducePolicy< POLICY >, real64 > maxDeltaCompDens( std::numeric_limits< real64 >::min(), -1 ); RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minPresScalingFactor( 1.0 ); RAJA::ReduceMin< ReducePolicy< POLICY >, real64 > minTempScalingFactor( 1.0 ); @@ -166,9 +175,9 @@ class SolutionScalingKernel : public SolutionScalingAndCheckingKernelBase< real6 globalScalingFactor.min( stack.localMinVal ); - maxDeltaPres.max( stack.localMaxDeltaPres ); - maxDeltaTemp.max( stack.localMaxDeltaTemp ); - maxDeltaCompDens.max( stack.localMaxDeltaCompDens ); + maxDeltaPres.maxloc( stack.localMaxDeltaPres, ei ); + maxDeltaTemp.maxloc( stack.localMaxDeltaTemp, ei ); + maxDeltaCompDens.maxloc( stack.localMaxDeltaCompDens, ei ); minPresScalingFactor.min( stack.localMinPresScalingFactor ); minTempScalingFactor.min( stack.localMinTempScalingFactor ); @@ -177,8 +186,11 @@ class SolutionScalingKernel : public SolutionScalingAndCheckingKernelBase< real6 return StackVariables( globalScalingFactor.get(), maxDeltaPres.get(), + maxDeltaPres.getLoc(), maxDeltaTemp.get(), + maxDeltaTemp.getLoc(), maxDeltaCompDens.get(), + maxDeltaCompDens.getLoc(), minPresScalingFactor.get(), minTempScalingFactor.get(), minCompDensScalingFactor.get() ); @@ -191,8 +203,11 @@ class SolutionScalingKernel : public SolutionScalingAndCheckingKernelBase< real6 Base::setup( ei, stack ); stack.localMaxDeltaPres = 0.0; + stack.localMaxDeltaPresLoc = -1; stack.localMaxDeltaTemp = 0.0; + stack.localMaxDeltaTempLoc = -1; stack.localMaxDeltaCompDens = 0.0; + stack.localMaxDeltaCompDensLoc =-1; stack.localMinPresScalingFactor = 1.0; stack.localMinTempScalingFactor = 1.0; From 6b07357f8127c836077be2b29bcede5479ec6059 Mon Sep 17 00:00:00 2001 From: Stefano Frambati Date: Tue, 19 Nov 2024 17:27:20 +0100 Subject: [PATCH 251/286] switched from raw log to log based on log-level for timestep summary logging (#3444) --- .../physicsSolvers/PhysicsSolverBase.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp index 1e2ef81d5a9..13066188e5c 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp @@ -350,17 +350,17 @@ void PhysicsSolverBase::logEndOfCycleInformation( integer const cycleNumber, std::vector< real64 > const & subStepDt ) const { // The formating here is a work in progress. - GEOS_LOG_RANK_0( "\n------------------------- TIMESTEP END -------------------------" ); - GEOS_LOG_RANK_0( GEOS_FMT( " - Cycle: {}", cycleNumber ) ); - GEOS_LOG_RANK_0( GEOS_FMT( " - N substeps: {}", numOfSubSteps ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, "\n------------------------- TIMESTEP END -------------------------" ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( " - Cycle: {}", cycleNumber ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, GEOS_FMT( " - N substeps: {}", numOfSubSteps ) ); std::string logMessage = " - dt:"; for( integer i = 0; i < numOfSubSteps; ++i ) { logMessage += " " + units::TimeFormatInfo::fromSeconds( subStepDt[i] ).toString(); } // Log the complete message once - GEOS_LOG_RANK_0( logMessage ); - GEOS_LOG_RANK_0( "------------------------------------------------------------------\n" ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, logMessage ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::TimeStep, "------------------------------------------------------------------\n" ); } real64 PhysicsSolverBase::setNextDt( real64 const & currentDt, From 6d285d2a8ecebb86bcc1459a3ccee179e4ce85ea Mon Sep 17 00:00:00 2001 From: Dickson Kachuma <81433670+dkachuma@users.noreply.github.com> Date: Tue, 19 Nov 2024 11:53:00 -0600 Subject: [PATCH 252/286] feat: Immiscible water model (#3236) --- .../constitutive/CMakeLists.txt | 4 + .../fluid/multifluid/MultiFluidSelector.hpp | 2 + .../CompositionalMultiphaseFluid.cpp | 44 ++- .../CompositionalMultiphaseFluid.hpp | 20 ++ .../CompositionalMultiphaseFluidUpdates.hpp | 66 ++-- .../models/ImmiscibleWaterDensity.cpp | 82 +++++ .../models/ImmiscibleWaterDensity.hpp | 140 +++++++++ .../models/ImmiscibleWaterParameters.cpp | 54 +++- .../models/ImmiscibleWaterParameters.hpp | 21 ++ .../models/ImmiscibleWaterViscosity.cpp | 75 +++++ .../models/ImmiscibleWaterViscosity.hpp | 130 ++++++++ .../constitutive/unitTests/CMakeLists.txt | 1 + .../testImmiscibleWaterProperties.cpp | 285 ++++++++++++++++++ .../constitutiveDrivers/CMakeLists.txt | 1 + ...nalThreePhaseLohrenzBrayClarkViscosity.cpp | 27 ++ src/coreComponents/schema/schema.xsd | 54 ++++ src/coreComponents/schema/schema.xsd.other | 55 ++++ .../constitutiveTests/CMakeLists.txt | 1 + .../testPVT_ThreePhaseCompositional.xml | 83 +++++ ...stPVT_ThreePhaseCompositional_blackOil.txt | 113 +++++++ 20 files changed, 1225 insertions(+), 33 deletions(-) create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.cpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.hpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.cpp create mode 100644 src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.hpp create mode 100644 src/coreComponents/constitutive/unitTests/testImmiscibleWaterProperties.cpp create mode 100644 src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalThreePhaseLohrenzBrayClarkViscosity.cpp create mode 100644 src/coreComponents/unitTests/constitutiveTests/testPVT_ThreePhaseCompositional.xml create mode 100644 src/coreComponents/unitTests/constitutiveTests/testPVT_ThreePhaseCompositional_blackOil.txt diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index c763fd49e49..b8a3d02c811 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -97,8 +97,10 @@ set( constitutive_headers fluid/multifluid/compositional/models/CriticalVolume.hpp fluid/multifluid/compositional/models/EquationOfState.hpp fluid/multifluid/compositional/models/FunctionBase.hpp + fluid/multifluid/compositional/models/ImmiscibleWaterDensity.hpp fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp + fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.hpp fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -242,8 +244,10 @@ set( constitutive_sources fluid/multifluid/compositional/models/CompositionalDensity.cpp fluid/multifluid/compositional/models/ConstantViscosity.cpp fluid/multifluid/compositional/models/CriticalVolume.cpp + fluid/multifluid/compositional/models/ImmiscibleWaterDensity.cpp fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp + fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.cpp fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index 580a965061b..7ca5afe50cc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -53,6 +53,7 @@ void constitutiveUpdatePassThru( constitutive::MultiFluidBase const & fluid, #if !defined(GEOS_DEVICE_COMPILE) CO2BrineEzrokhiThermalFluid, CompositionalTwoPhaseLohrenzBrayClarkViscosity, + CompositionalThreePhaseLohrenzBrayClarkViscosity, #endif CompositionalTwoPhaseConstantViscosity >::execute( fluid, std::forward< LAMBDA >( lambda ) ); @@ -75,6 +76,7 @@ void constitutiveUpdatePassThru( constitutive::MultiFluidBase & fluid, #if !defined(GEOS_DEVICE_COMPILE) CO2BrineEzrokhiThermalFluid, CompositionalTwoPhaseLohrenzBrayClarkViscosity, + CompositionalThreePhaseLohrenzBrayClarkViscosity, #endif CompositionalTwoPhaseConstantViscosity >::execute( fluid, std::forward< LAMBDA >( lambda ) ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp index aa91a802388..6e95fed3f4c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp @@ -22,6 +22,7 @@ #include "constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp" #include "constitutive/fluid/multifluid/MultiFluidFields.hpp" #include "codingUtilities/Utilities.hpp" +#include "common/format/StringUtilities.hpp" namespace geos { @@ -51,6 +52,7 @@ CompositionalMultiphaseFluid( string const & name, Group * const parent ) m_parameters( createModelParameters() ) { using InputFlags = dataRepository::InputFlags; + using RestartFlags = dataRepository::RestartFlags; getWrapperBase( viewKeyStruct::componentNamesString() ).setInputFlag( InputFlags::REQUIRED ); getWrapperBase( viewKeyStruct::componentMolarWeightString() ).setInputFlag( InputFlags::REQUIRED ); @@ -80,13 +82,18 @@ CompositionalMultiphaseFluid( string const & name, Group * const parent ) // Link parameters specific to each model m_parameters->registerParameters( this ); + + // Register extra wrappers to enable auto-cloning + registerWrapper( "phaseOrder", &m_phaseOrder ) + .setSizedFromParent( 0 ) + .setRestartFlags( RestartFlags::NO_WRITE ); } template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > integer CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::getWaterPhaseIndex() const { - string const expectedWaterPhaseNames[] = { "water" }; - return PVTProps::PVTFunctionHelpers::findName( m_phaseNames, expectedWaterPhaseNames, viewKeyStruct::phaseNamesString() ); + integer const aqueous = static_cast< integer >(PhaseType::AQUEOUS); + return m_phaseOrder.size() > aqueous ? m_phaseOrder[aqueous] : -1; } template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > @@ -170,6 +177,12 @@ void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::postInputIni } } + // Determine the phase ordering + m_phaseOrder.resize( 3 ); + m_phaseOrder[PhaseType::LIQUID] = findPhaseIndex( "oil,liq,liquid" ); + m_phaseOrder[PhaseType::VAPOUR] = findPhaseIndex( "gas,vap,vapor,vapour" ); + m_phaseOrder[PhaseType::AQUEOUS] = findPhaseIndex( "wat,water,aqueous" ); + m_parameters->postInputInitialization( this, *m_componentProperties ); } @@ -210,6 +223,7 @@ CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createKernelWrapp *m_phase1, *m_phase2, *m_phase3, + m_phaseOrder.toViewConst(), m_componentMolarWeight, m_useMass, m_phaseFraction.toView(), @@ -247,6 +261,22 @@ void CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::createModels *m_parameters ); } +template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > +integer CompositionalMultiphaseFluid< FLASH, PHASE1, PHASE2, PHASE3 >::findPhaseIndex( string names ) const +{ + auto const nameContainer = stringutilities::tokenize( names, ",", true, false ); + + for( integer ip = 0; ip < numFluidPhases(); ++ip ) + { + std::string const phaseName = stringutilities::toLower( m_phaseNames[ip] ); + if( std::find( nameContainer.begin(), nameContainer.end(), phaseName ) != nameContainer.end()) + { + return ip; + } + } + return -1; +} + // Create the fluid models template< typename FLASH, typename PHASE1, typename PHASE2, typename PHASE3 > std::unique_ptr< compositional::ModelParameters > @@ -269,6 +299,11 @@ template class CompositionalMultiphaseFluid< compositional::NegativeTwoPhaseFlashModel, compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; +template class CompositionalMultiphaseFluid< + compositional::ImmiscibleWaterFlashModel, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::ImmiscibleWaterDensity, compositional::ImmiscibleWaterViscosity, compositional::NullModel > >; REGISTER_CATALOG_ENTRY( ConstitutiveBase, CompositionalTwoPhaseConstantViscosity, @@ -280,6 +315,11 @@ REGISTER_CATALOG_ENTRY( ConstitutiveBase, string const &, dataRepository::Group * const ) +REGISTER_CATALOG_ENTRY( ConstitutiveBase, + CompositionalThreePhaseLohrenzBrayClarkViscosity, + string const &, + dataRepository::Group * const ) + } // namespace constitutive } // namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp index a8f846aac39..b43047ade63 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp @@ -23,6 +23,9 @@ #include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp" #include "constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp" #include "constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp" +#include "constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.hpp" +#include "constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp" +#include "constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.hpp" #include "constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp" #include "constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp" #include "constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp" @@ -110,15 +113,27 @@ class CompositionalMultiphaseFluid : public MultiFluidBase virtual void resizeFields( localIndex const size, localIndex const numPts ) override; + enum PhaseType : integer + { + LIQUID = 0, + VAPOUR = 1, + AQUEOUS = 2, + }; + private: // Create the fluid models void createModels(); + integer findPhaseIndex( string names ) const; + static std::unique_ptr< compositional::ModelParameters > createModelParameters(); // Flash model std::unique_ptr< FLASH > m_flash{}; + // Phase ordering + array1d< integer > m_phaseOrder; + // Phase models std::unique_ptr< PHASE1 > m_phase1{}; std::unique_ptr< PHASE2 > m_phase2{}; @@ -142,6 +157,11 @@ using CompositionalTwoPhaseLohrenzBrayClarkViscosity = CompositionalMultiphaseFl compositional::NegativeTwoPhaseFlashModel, compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel > >; +using CompositionalThreePhaseLohrenzBrayClarkViscosity = CompositionalMultiphaseFluid< + compositional::ImmiscibleWaterFlashModel, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::CompositionalDensity, compositional::LohrenzBrayClarkViscosity, compositional::NullModel >, + compositional::PhaseModel< compositional::ImmiscibleWaterDensity, compositional::ImmiscibleWaterViscosity, compositional::NullModel > >; } /* namespace constitutive */ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp index 1567f4b4c46..c3a301e98a5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp @@ -46,6 +46,7 @@ class CompositionalMultiphaseFluidUpdates final : public MultiFluidBase::KernelW PHASE1 const & phase1, PHASE2 const & phase2, PHASE3 const & phase3, + arrayView1d< integer const > const & phaseOrder, arrayView1d< real64 const > const & componentMolarWeight, bool const useMass, MultiFluidBase::PhaseProp::ViewType phaseFrac, @@ -122,6 +123,9 @@ class CompositionalMultiphaseFluidUpdates final : public MultiFluidBase::KernelW // Flash kernel wrapper typename FLASH::KernelWrapper m_flash; + // The ordering of phases + arrayView1d< integer const > const m_phaseOrder; + // Phase model kernel wrappers typename PHASE1::KernelWrapper m_phase1; typename PHASE2::KernelWrapper m_phase2; @@ -138,6 +142,7 @@ CompositionalMultiphaseFluidUpdates( compositional::ComponentProperties const & PHASE1 const & phase1, PHASE2 const & phase2, PHASE3 const & phase3, + arrayView1d< integer const > const & phaseOrder, arrayView1d< real64 const > const & componentMolarWeight, bool const useMass, MultiFluidBase::PhaseProp::ViewType phaseFrac, @@ -161,6 +166,7 @@ CompositionalMultiphaseFluidUpdates( compositional::ComponentProperties const & std::move( totalDensity ) ), m_componentProperties( componentProperties.createKernelWrapper() ), m_flash( flash.createKernelWrapper() ), + m_phaseOrder( phaseOrder ), m_phase1( phase1.createKernelWrapper() ), m_phase2( phase2.createKernelWrapper() ), m_phase3( phase3.createKernelWrapper() ), @@ -262,31 +268,31 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( m_phase1.density.compute( m_componentProperties, pressure, temperature, - phaseCompFrac.value[0].toSliceConst(), - phaseDens.value[0], - phaseDens.derivs[0], - phaseMassDensity.value[0], - phaseMassDensity.derivs[0], + phaseCompFrac.value[m_phaseOrder[0]].toSliceConst(), + phaseDens.value[m_phaseOrder[0]], + phaseDens.derivs[m_phaseOrder[0]], + phaseMassDensity.value[m_phaseOrder[0]], + phaseMassDensity.derivs[m_phaseOrder[0]], m_useMass ); m_phase2.density.compute( m_componentProperties, pressure, temperature, - phaseCompFrac.value[1].toSliceConst(), - phaseDens.value[1], - phaseDens.derivs[1], - phaseMassDensity.value[1], - phaseMassDensity.derivs[1], + phaseCompFrac.value[m_phaseOrder[1]].toSliceConst(), + phaseDens.value[m_phaseOrder[1]], + phaseDens.derivs[m_phaseOrder[1]], + phaseMassDensity.value[m_phaseOrder[1]], + phaseMassDensity.derivs[m_phaseOrder[1]], m_useMass ); if constexpr (2 < FLASH::KernelWrapper::getNumberOfPhases()) { m_phase3.density.compute( m_componentProperties, pressure, temperature, - phaseCompFrac.value[2].toSliceConst(), - phaseDens.value[2], - phaseDens.derivs[2], - phaseMassDensity.value[2], - phaseMassDensity.derivs[2], + phaseCompFrac.value[m_phaseOrder[2]].toSliceConst(), + phaseDens.value[m_phaseOrder[2]], + phaseDens.derivs[m_phaseOrder[2]], + phaseMassDensity.value[m_phaseOrder[2]], + phaseMassDensity.derivs[m_phaseOrder[2]], m_useMass ); } @@ -294,31 +300,31 @@ CompositionalMultiphaseFluidUpdates< FLASH, PHASE1, PHASE2, PHASE3 >::compute( m_phase1.viscosity.compute( m_componentProperties, pressure, temperature, - phaseCompFrac.value[0].toSliceConst(), - phaseMassDensity.value[0], - phaseMassDensity.derivs[0].toSliceConst(), - phaseVisc.value[0], - phaseVisc.derivs[0], + phaseCompFrac.value[m_phaseOrder[0]].toSliceConst(), + phaseMassDensity.value[m_phaseOrder[0]], + phaseMassDensity.derivs[m_phaseOrder[0]].toSliceConst(), + phaseVisc.value[m_phaseOrder[0]], + phaseVisc.derivs[m_phaseOrder[0]], m_useMass ); m_phase2.viscosity.compute( m_componentProperties, pressure, temperature, - phaseCompFrac.value[1].toSliceConst(), - phaseMassDensity.value[1], - phaseMassDensity.derivs[1].toSliceConst(), - phaseVisc.value[1], - phaseVisc.derivs[1], + phaseCompFrac.value[m_phaseOrder[1]].toSliceConst(), + phaseMassDensity.value[m_phaseOrder[1]], + phaseMassDensity.derivs[m_phaseOrder[1]].toSliceConst(), + phaseVisc.value[m_phaseOrder[1]], + phaseVisc.derivs[m_phaseOrder[1]], m_useMass ); if constexpr (2 < FLASH::KernelWrapper::getNumberOfPhases()) { m_phase3.viscosity.compute( m_componentProperties, pressure, temperature, - phaseCompFrac.value[2].toSliceConst(), - phaseMassDensity.value[2], - phaseMassDensity.derivs[2].toSliceConst(), - phaseVisc.value[2], - phaseVisc.derivs[2], + phaseCompFrac.value[m_phaseOrder[2]].toSliceConst(), + phaseMassDensity.value[m_phaseOrder[2]], + phaseMassDensity.derivs[m_phaseOrder[2]].toSliceConst(), + phaseVisc.value[m_phaseOrder[2]], + phaseVisc.derivs[m_phaseOrder[2]], m_useMass ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.cpp new file mode 100644 index 00000000000..e257b3b984a --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.cpp @@ -0,0 +1,82 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ImmiscibleWaterDensity.cpp + */ + +#include "ImmiscibleWaterDensity.hpp" +#include "ImmiscibleWaterParameters.hpp" +#include "dataRepository/InputFlags.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +ImmiscibleWaterDensityUpdate::ImmiscibleWaterDensityUpdate( real64 const waterMolecularWeight, + real64 const referencePressure, + real64 const referenceTemperature, + real64 const density, + real64 const compressibility, + real64 const expansionCoefficient ): + m_waterMolecularWeight( waterMolecularWeight ), + m_referencePressure( referencePressure ), + m_referenceTemperature( referenceTemperature ), + m_density( density ), + m_compressibility( compressibility ), + m_expansionCoefficient( expansionCoefficient ) +{} + +ImmiscibleWaterDensity::ImmiscibleWaterDensity( string const & name, + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ): + FunctionBase( name, componentProperties ), + m_parameters( modelParameters ) +{ + GEOS_UNUSED_VAR( phaseIndex ); + integer const h2oIndex = ImmiscibleWaterParameters::getWaterComponentIndex( componentProperties ); + GEOS_THROW_IF_LT_MSG( h2oIndex, 0, "Water component not found", InputError ); + m_waterMolecularWeight = componentProperties.getComponentMolarWeight()[h2oIndex]; +} + +ImmiscibleWaterDensity::KernelWrapper +ImmiscibleWaterDensity::createKernelWrapper() const +{ + ImmiscibleWaterParameters const * waterParameters = m_parameters.get< ImmiscibleWaterParameters >(); + return KernelWrapper( m_waterMolecularWeight, + waterParameters->m_waterReferencePressure, + waterParameters->m_waterReferenceTemperature, + waterParameters->m_waterDensity, + waterParameters->m_waterCompressibility, + waterParameters->m_waterExpansionCoefficient ); +} + +std::unique_ptr< ModelParameters > +ImmiscibleWaterDensity::createParameters( std::unique_ptr< ModelParameters > parameters ) +{ + return ImmiscibleWaterParameters::create( std::move( parameters ) ); +} + +} // namespace compositional + +} // namespace constitutive + +} // namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.hpp new file mode 100644 index 00000000000..9d258085649 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.hpp @@ -0,0 +1,140 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ImmiscibleWaterDensity.cpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERDENSITY_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERDENSITY_HPP_ + +#include "FunctionBase.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +class ImmiscibleWaterDensityUpdate final : public FunctionBaseUpdate +{ + using Deriv = geos::constitutive::multifluid::DerivativeOffset; +public: + ImmiscibleWaterDensityUpdate( real64 const waterMolecularWeight, + real64 const referencePressure, + real64 const referenceTemperature, + real64 const density, + real64 const compressibility, + real64 const expansionCoefficient ); + + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void compute( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 & molarDensity, + arraySlice1d< real64, USD2 > const & dMolarDensity, + real64 & massDensity, + arraySlice1d< real64, USD2 > const & dMassDensity, + bool useMass ) const; + +private: + real64 const m_waterMolecularWeight; + real64 const m_referencePressure; + real64 const m_referenceTemperature; + real64 const m_density; + real64 const m_compressibility; + real64 const m_expansionCoefficient; +}; + +class ImmiscibleWaterDensity : public FunctionBase +{ +public: + ImmiscibleWaterDensity( string const & name, + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ); + + static string catalogName() { return "ImmiscibleWaterDensity"; } + + virtual FunctionType functionType() const override + { + return FunctionType::DENSITY; + } + + /// Type of kernel wrapper for in-kernel update + using KernelWrapper = ImmiscibleWaterDensityUpdate; + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelWrapper() const; + + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ); + +private: + ModelParameters const & m_parameters; + real64 m_waterMolecularWeight{0.0}; +}; + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +void ImmiscibleWaterDensityUpdate::compute( + ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 & molarDensity, + arraySlice1d< real64, USD2 > const & dMolarDensity, + real64 & massDensity, + arraySlice1d< real64, USD2 > const & dMassDensity, + bool useMass ) const +{ + GEOS_UNUSED_VAR( componentProperties ); + GEOS_UNUSED_VAR( phaseComposition ); + GEOS_UNUSED_VAR( useMass ); + + LvArray::forValuesInSlice( dMolarDensity, setZero ); + LvArray::forValuesInSlice( dMassDensity, setZero ); + + real64 const density = m_density * + LvArray::math::exp( m_compressibility * (pressure - m_referencePressure) ) * + LvArray::math::exp( -m_expansionCoefficient * (temperature - m_referenceTemperature) ); + real64 const dDensity_dp = m_compressibility * density; + real64 const dDensity_dT = -m_expansionCoefficient * density; + + massDensity = density; + dMassDensity[Deriv::dP] = dDensity_dp; + dMassDensity[Deriv::dT] = dDensity_dT; + + molarDensity = density / m_waterMolecularWeight; + dMolarDensity[Deriv::dP] = dDensity_dp / m_waterMolecularWeight; + dMolarDensity[Deriv::dT] = dDensity_dT / m_waterMolecularWeight; +} + +} // end namespace compositional + +} // end namespace constitutive + +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERDENSITY_HPP_ diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp index 87c1d659435..ddb64316270 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp @@ -63,7 +63,41 @@ integer ImmiscibleWaterParameters::getWaterComponentIndex( ComponentProperties c void ImmiscibleWaterParameters::registerParametersImpl( MultiFluidBase * fluid ) { - GEOS_UNUSED_VAR( fluid ); + fluid->registerWrapper( viewKeyStruct::waterReferencePressureString(), &m_waterReferencePressure ). + setInputFlag( dataRepository::InputFlags::REQUIRED ). + setDescription( "The reference pressure for water density and viscosity" ); + + fluid->registerWrapper( viewKeyStruct::waterReferenceTemperatureString(), &m_waterReferenceTemperature ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDefaultValue( m_waterReferenceTemperature ). + setDescription( "The reference temperature for water density and viscosity" ); + + fluid->registerWrapper( viewKeyStruct::waterDensityString(), &m_waterDensity ). + setInputFlag( dataRepository::InputFlags::REQUIRED ). + setDescription( "The water density at the reference pressure and temperature" ); + + fluid->registerWrapper( viewKeyStruct::waterViscosityString(), &m_waterViscosity ). + setInputFlag( dataRepository::InputFlags::REQUIRED ). + setDescription( "The water viscosity at the reference pressure and temperature" ); + + fluid->registerWrapper( viewKeyStruct::waterCompressibilityString(), &m_waterCompressibility ). + setInputFlag( dataRepository::InputFlags::REQUIRED ). + setDescription( "The compressibility of water" ); + + fluid->registerWrapper( viewKeyStruct::waterViscosityCompressibilityString(), &m_waterViscosityCompressibility ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDefaultValue( m_waterViscosityCompressibility ). + setDescription( "The compressibility (normalized derivative with respect to pressure) of the water viscosity" ); + + fluid->registerWrapper( viewKeyStruct::waterExpansionCoefficientString(), &m_waterExpansionCoefficient ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDefaultValue( m_waterExpansionCoefficient ). + setDescription( "The volumetric coefficient of thermal expansion of water" ); + + fluid->registerWrapper( viewKeyStruct::waterViscosityExpansionCoefficientString(), &m_waterViscosityExpansionCoefficient ). + setInputFlag( dataRepository::InputFlags::OPTIONAL ). + setDefaultValue( m_waterViscosityExpansionCoefficient ). + setDescription( "The coefficient of thermal expansion (normalized derivative with respect to temperature) of water viscosity" ); } void ImmiscibleWaterParameters::postInputInitializationImpl( MultiFluidBase const * fluid, @@ -80,6 +114,24 @@ void ImmiscibleWaterParameters::postInputInitializationImpl( MultiFluidBase cons GEOS_FMT( "{}: water component not found '{}'", fluid->getFullName(), MultiFluidBase::viewKeyStruct::componentNamesString() ), InputError ); + + // Pretty much everything should be positive + auto const checkLowerBound = [&]( real64 const & value, real64 const & bound, string const & attribute ) + { + GEOS_THROW_IF_LT_MSG( value, bound, + GEOS_FMT( "{}: invalid number of value in attribute '{}'. Should be greater than {}", + fluid->getFullName(), bound, attribute ), + InputError ); + }; + + real64 constexpr epsilon = MultiFluidConstants::epsilon; + + checkLowerBound( m_waterDensity, epsilon, viewKeyStruct::waterDensityString()); + checkLowerBound( m_waterViscosity, epsilon, viewKeyStruct::waterViscosityString()); + checkLowerBound( m_waterCompressibility, 0.0, viewKeyStruct::waterCompressibilityString()); + checkLowerBound( m_waterViscosityCompressibility, 0.0, viewKeyStruct::waterViscosityCompressibilityString()); + checkLowerBound( m_waterExpansionCoefficient, 0.0, viewKeyStruct::waterExpansionCoefficientString()); + checkLowerBound( m_waterViscosityExpansionCoefficient, 0.0, viewKeyStruct::waterViscosityExpansionCoefficientString()); } } // end namespace compositional diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp index 9404e565f83..da1e0e4ddf4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp @@ -44,6 +44,27 @@ class ImmiscibleWaterParameters : public ModelParameters static integer getWaterComponentIndex( ComponentProperties const & componentProperties ); + struct viewKeyStruct + { + static constexpr char const * waterReferencePressureString() { return "waterReferencePressure"; } + static constexpr char const * waterReferenceTemperatureString() { return "waterReferenceTemperature"; } + static constexpr char const * waterDensityString() { return "waterDensity"; } + static constexpr char const * waterViscosityString() { return "waterViscosity"; } + static constexpr char const * waterCompressibilityString() { return "waterCompressibility"; } + static constexpr char const * waterViscosityCompressibilityString() { return "waterViscosityCompressibility"; } + static constexpr char const * waterExpansionCoefficientString() { return "waterExpansionCoefficient"; } + static constexpr char const * waterViscosityExpansionCoefficientString() { return "waterViscosityExpansionCoefficient"; } + }; + + real64 m_waterReferencePressure; + real64 m_waterReferenceTemperature{293.15}; + real64 m_waterDensity; + real64 m_waterViscosity; + real64 m_waterCompressibility; + real64 m_waterViscosityCompressibility{0.0}; + real64 m_waterExpansionCoefficient{0.0}; + real64 m_waterViscosityExpansionCoefficient{0.0}; + protected: void registerParametersImpl( MultiFluidBase * fluid ) override; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.cpp new file mode 100644 index 00000000000..d1e5cd30867 --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.cpp @@ -0,0 +1,75 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ImmiscibleWaterViscosity.cpp + */ + +#include "ImmiscibleWaterViscosity.hpp" +#include "ImmiscibleWaterParameters.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +ImmiscibleWaterViscosityUpdate::ImmiscibleWaterViscosityUpdate( real64 const referencePressure, + real64 const referenceTemperature, + real64 const viscosity, + real64 const compressibility, + real64 const expansionCoefficient ): + m_referencePressure( referencePressure ), + m_referenceTemperature( referenceTemperature ), + m_viscosity( viscosity ), + m_compressibility( compressibility ), + m_expansionCoefficient( expansionCoefficient ) +{} + +ImmiscibleWaterViscosity::ImmiscibleWaterViscosity( string const & name, + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ): + FunctionBase( name, componentProperties ), + m_parameters( modelParameters ) +{ + GEOS_UNUSED_VAR( phaseIndex ); +} + +ImmiscibleWaterViscosity::KernelWrapper +ImmiscibleWaterViscosity::createKernelWrapper() const +{ + ImmiscibleWaterParameters const * waterParameters = m_parameters.get< ImmiscibleWaterParameters >(); + return KernelWrapper( waterParameters->m_waterReferencePressure, + waterParameters->m_waterReferenceTemperature, + waterParameters->m_waterViscosity, + waterParameters->m_waterViscosityCompressibility, + waterParameters->m_waterViscosityExpansionCoefficient ); +} + +std::unique_ptr< ModelParameters > +ImmiscibleWaterViscosity::createParameters( std::unique_ptr< ModelParameters > parameters ) +{ + return ImmiscibleWaterParameters::create( std::move( parameters ) ); +} + +} // namespace compositional + +} // namespace constitutive + +} // end namespace geos diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.hpp new file mode 100644 index 00000000000..815769110ab --- /dev/null +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.hpp @@ -0,0 +1,130 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ImmiscibleWaterViscosity.hpp + */ + +#ifndef GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERVISCOSITY_HPP_ +#define GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERVISCOSITY_HPP_ + +#include "FunctionBase.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" + +namespace geos +{ + +namespace constitutive +{ + +namespace compositional +{ + +class ImmiscibleWaterViscosityUpdate final : public FunctionBaseUpdate +{ + using Deriv = geos::constitutive::multifluid::DerivativeOffset; +public: + ImmiscibleWaterViscosityUpdate( real64 const referencePressure, + real64 const referenceTemperature, + real64 const viscosity, + real64 const compressibility, + real64 const expansionCoefficient ); + + template< integer USD1, integer USD2 > + GEOS_HOST_DEVICE + void compute( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 const & density, + arraySlice1d< real64 const, USD2 > const & dDensity, + real64 & viscosity, + arraySlice1d< real64, USD2 > const & dViscosity, + bool useMass ) const; + +private: + real64 const m_referencePressure; + real64 const m_referenceTemperature; + real64 const m_viscosity; + real64 const m_compressibility; + real64 const m_expansionCoefficient; +}; + +class ImmiscibleWaterViscosity : public FunctionBase +{ +public: + ImmiscibleWaterViscosity( string const & name, + ComponentProperties const & componentProperties, + integer const phaseIndex, + ModelParameters const & modelParameters ); + + static string catalogName() { return ""; } + + FunctionType functionType() const override + { + return FunctionType::VISCOSITY; + } + + /// Type of kernel wrapper for in-kernel update + using KernelWrapper = ImmiscibleWaterViscosityUpdate; + + /** + * @brief Create an update kernel wrapper. + * @return the wrapper + */ + KernelWrapper createKernelWrapper() const; + + // Create parameters unique to this model + static std::unique_ptr< ModelParameters > createParameters( std::unique_ptr< ModelParameters > parameters ); + +private: + ModelParameters const & m_parameters; +}; + +template< integer USD1, integer USD2 > +GEOS_HOST_DEVICE +GEOS_FORCE_INLINE +void ImmiscibleWaterViscosityUpdate::compute( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & phaseComposition, + real64 const & density, + arraySlice1d< real64 const, USD2 > const & dDensity, + real64 & viscosity, + arraySlice1d< real64, USD2 > const & dViscosity, + bool useMass ) const +{ + GEOS_UNUSED_VAR( componentProperties ); + GEOS_UNUSED_VAR( phaseComposition ); + GEOS_UNUSED_VAR( density ); + GEOS_UNUSED_VAR( dDensity ); + GEOS_UNUSED_VAR( useMass ); + + LvArray::forValuesInSlice( dViscosity, setZero ); + + viscosity = m_viscosity * + LvArray::math::exp( m_compressibility * (pressure - m_referencePressure) ) * + LvArray::math::exp( -m_expansionCoefficient * (temperature - m_referenceTemperature) ); + dViscosity[Deriv::dP] = m_compressibility * viscosity; + dViscosity[Deriv::dT] = -m_expansionCoefficient * viscosity; +} + +} // end namespace compositional + +} // end namespace constitutive + +} // end namespace geos + +#endif //GEOS_CONSTITUTIVE_FLUID_MULTIFLUID_COMPOSITIONAL_MODELS_IMMISCIBLEWATERVISCOSITY_HPP_ diff --git a/src/coreComponents/constitutive/unitTests/CMakeLists.txt b/src/coreComponents/constitutive/unitTests/CMakeLists.txt index d357ad9290c..aa095d493c8 100644 --- a/src/coreComponents/constitutive/unitTests/CMakeLists.txt +++ b/src/coreComponents/constitutive/unitTests/CMakeLists.txt @@ -8,6 +8,7 @@ set( gtest_geosx_tests testElasticIsotropic.cpp testKValueInitialization.cpp testImmiscibleWaterFlashModel.cpp + testImmiscibleWaterProperties.cpp testLohrenzBrayClarkViscosity.cpp testModifiedCamClay.cpp testMultiFluidSelector.cpp diff --git a/src/coreComponents/constitutive/unitTests/testImmiscibleWaterProperties.cpp b/src/coreComponents/constitutive/unitTests/testImmiscibleWaterProperties.cpp new file mode 100644 index 00000000000..6b31ceffc9e --- /dev/null +++ b/src/coreComponents/constitutive/unitTests/testImmiscibleWaterProperties.cpp @@ -0,0 +1,285 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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. + * ------------------------------------------------------------------------------------------------------------ + */ + +// Source includes +#include "codingUtilities/UnitTestUtilities.hpp" +#include "constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp" +#include "constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.hpp" +#include "constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.hpp" +#include "TestFluid.hpp" +#include "TestFluidUtilities.hpp" + +using namespace geos::constitutive::compositional; + +namespace geos +{ +namespace testing +{ + +template< int NC > +using TestData = std::tuple< + real64 const, // pressure + real64 const, // temperature + Feed< NC > const, // phase composition + real64 const, // expected molar density + real64 const, // expected mass density + real64 const // expected viscosity + >; + +template< int NC > +struct FluidData {}; + +template<> +struct FluidData< 3 > +{ + static std::unique_ptr< TestFluid< 3 > > createFluid() + { + auto fluid = TestFluid< 3 >::create( {Fluid::C1, Fluid::C10, Fluid::H2O} ); + std::array< real64, 3 > const bics = {0.25, 0.0, 0.0}; + fluid->setBinaryCoefficients( bics ); + return fluid; + } +}; + +template< int NC > +class ImmiscibleWaterPropertiesTestFixture : public ::testing::TestWithParam< TestData< NC > > +{ + static constexpr real64 relTol = 1.0e-5; + static constexpr real64 absTol = 1.0e-7; + static constexpr int numComps = NC; + static constexpr int numDofs = NC + 2; + using Deriv = geos::constitutive::multifluid::DerivativeOffset; +public: + ImmiscibleWaterPropertiesTestFixture() + : m_fluid( FluidData< NC >::createFluid() ) + { + ComponentProperties const & componentProperties = this->m_fluid->getComponentProperties(); + + m_parameters = ImmiscibleWaterDensity::createParameters( std::make_unique< ModelParameters >() ); + m_parameters = ImmiscibleWaterViscosity::createParameters( std::move( m_parameters ) ); + + auto * waterParameters = const_cast< ImmiscibleWaterParameters * >(m_parameters->get< ImmiscibleWaterParameters >()); + waterParameters->m_waterReferencePressure = 215.0e5; + waterParameters->m_waterDensity = 1020.0; + waterParameters->m_waterCompressibility = 4.1483E-10; + waterParameters->m_waterViscosityCompressibility = 2.0E-11; + waterParameters->m_waterViscosity = 0.32929e-3; + + m_density = std::make_unique< ImmiscibleWaterDensity >( "PhaseDensity", componentProperties, 0, *m_parameters ); + m_viscosity = std::make_unique< ImmiscibleWaterViscosity >( "PhaseViscosity", componentProperties, 0, *m_parameters ); + } + + ~ImmiscibleWaterPropertiesTestFixture() = default; + + void testProperties( TestData< NC > const & data ) + { + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > phaseComposition; + TestFluid< NC >::createArray( phaseComposition, std::get< 2 >( data )); + real64 const expectedMolarDensity = std::get< 3 >( data ); + real64 const expectedMassDensity = std::get< 4 >( data ); + real64 const expectedViscosity = std::get< 5 >( data ); + + real64 molarDensity = 0.0; + real64 massDensity = 0.0; + real64 viscosity = 0.0; + stackArray1d< real64, numDofs > tempDerivs( numDofs ); + + auto componentProperties = m_fluid->createKernelWrapper(); + auto densityKernelWrapper = m_density->createKernelWrapper(); + auto viscosityKernelWrapper = m_viscosity->createKernelWrapper(); + + densityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + molarDensity, + tempDerivs.toSlice(), + massDensity, + tempDerivs.toSlice(), + false ); + + viscosityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + massDensity, + tempDerivs.toSliceConst(), + viscosity, + tempDerivs.toSlice(), + false ); + + checkRelativeError( molarDensity, expectedMolarDensity, relTol, absTol ); + checkRelativeError( massDensity, expectedMassDensity, relTol, absTol ); + checkRelativeError( viscosity, expectedViscosity, relTol, absTol ); + } + + void testPropertyDerivatives( TestData< NC > const & data ) + { + real64 const pressure = std::get< 0 >( data ); + real64 const temperature = std::get< 1 >( data ); + stackArray1d< real64, numComps > phaseComposition; + TestFluid< NC >::createArray( phaseComposition, std::get< 2 >( data )); + + auto componentProperties = m_fluid->createKernelWrapper(); + auto densityKernelWrapper = m_density->createKernelWrapper(); + auto viscosityKernelWrapper = m_viscosity->createKernelWrapper(); + + real64 molarDensity = 0.0; + real64 massDensity = 0.0; + real64 viscosity = 0.0; + stackArray1d< real64, numDofs > molarDensityDerivs( numDofs ); + stackArray1d< real64, numDofs > massDensityDerivs( numDofs ); + stackArray1d< real64, numDofs > viscosityDerivs( numDofs ); + stackArray1d< real64, 3 > derivatives( 3 ); + + densityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + molarDensity, + molarDensityDerivs.toSlice(), + massDensity, + massDensityDerivs.toSlice(), + false ); + + viscosityKernelWrapper.compute( componentProperties, + pressure, + temperature, + phaseComposition.toSliceConst(), + massDensity, + massDensityDerivs.toSliceConst(), + viscosity, + viscosityDerivs.toSlice(), + false ); + + // Viscosity values are very small so we will inflate the values to avoid false positives due + // to the absolute value check + real64 constexpr viscosityScale = 1.0e6; + + auto calculateProperties = [&]( real64 const p, real64 const t, auto const & zmf, auto & values ) { + stackArray1d< real64, numDofs > tempDerivs( numDofs ); + densityKernelWrapper.compute( componentProperties, p, t, zmf.toSliceConst(), + values[0], tempDerivs.toSlice(), values[1], tempDerivs.toSlice(), false ); + viscosityKernelWrapper.compute( componentProperties, p, t, zmf.toSliceConst(), + values[1], tempDerivs.toSliceConst(), values[2], tempDerivs.toSlice(), false ); + values[2] *= viscosityScale; + }; + + auto concatDerivatives = [&]( int idof ){ + derivatives[0] = molarDensityDerivs[idof]; + derivatives[1] = massDensityDerivs[idof]; + derivatives[2] = viscosityScale * viscosityDerivs[idof]; + }; + + // Compare against numerical derivatives + // -- Pressure derivative + concatDerivatives( Deriv::dP ); + real64 const dp = 1.0e-4 * pressure; + internal::testNumericalDerivative< 3 >( pressure, dp, derivatives.toSliceConst(), + [&]( real64 const p, auto & values ) { + calculateProperties( p, temperature, phaseComposition, values ); + }, absTol, relTol ); + + // -- Temperature derivative + concatDerivatives( Deriv::dT ); + real64 const dT = 1.0e-6 * temperature; + internal::testNumericalDerivative< 3 >( temperature, dT, derivatives.toSliceConst(), + [&]( real64 const t, auto & values ) { + calculateProperties( pressure, t, phaseComposition, values ); + }, absTol, relTol ); + + // -- Composition derivatives derivative + real64 const dz = 1.0e-7; + for( integer ic = 0; ic < NC; ++ic ) + { + concatDerivatives( Deriv::dC+ic ); + internal::testNumericalDerivative< 3 >( 0.0, dz, derivatives.toSliceConst(), + [&]( real64 const z, auto & values ) { + stackArray1d< real64, numComps > zmf( numComps ); + for( integer jc = 0; jc < numComps; ++jc ) + { + zmf[jc] = phaseComposition[jc]; + } + zmf[ic] += z; + calculateProperties( pressure, temperature, zmf, values ); + }, absTol, relTol ); + } + } + +protected: + std::unique_ptr< TestFluid< NC > > m_fluid{}; + std::unique_ptr< ImmiscibleWaterDensity > m_density{}; + std::unique_ptr< ImmiscibleWaterViscosity > m_viscosity{}; + std::unique_ptr< ModelParameters > m_parameters{}; +}; + +using ImmiscibleWaterProperties3 = ImmiscibleWaterPropertiesTestFixture< 3 >; + +TEST_P( ImmiscibleWaterProperties3, testProperties ) +{ + testProperties( GetParam() ); +} + +TEST_P( ImmiscibleWaterProperties3, testPropertyDerivatives ) +{ + testPropertyDerivatives( GetParam() ); +} + +//------------------------------------------------------------------------------- +// Data +//------------------------------------------------------------------------------- + +/* UNCRUSTIFY-OFF */ + +INSTANTIATE_TEST_SUITE_P( + ImmiscibleWaterProperties, ImmiscibleWaterProperties3, + ::testing::Values( + TestData< 3 >( 2.0e+06, 293.15, { 0.30, 0.30, 0.40 }, 5.616333e+04, 1.011782e+03, 3.291616e-04 ), + TestData< 3 >( 1.5e+07, 293.15, { 0.30, 0.30, 0.40 }, 5.646702e+04, 1.017253e+03, 3.292472e-04 ), + TestData< 3 >( 6.0e+07, 293.15, { 0.30, 0.30, 0.40 }, 5.753101e+04, 1.036421e+03, 3.295437e-04 ), + TestData< 3 >( 2.0e+06, 353.15, { 0.30, 0.30, 0.40 }, 5.616333e+04, 1.011782e+03, 3.291616e-04 ), + TestData< 3 >( 1.5e+07, 353.15, { 0.30, 0.30, 0.40 }, 5.646702e+04, 1.017253e+03, 3.292472e-04 ), + TestData< 3 >( 6.0e+07, 353.15, { 0.30, 0.30, 0.40 }, 5.753101e+04, 1.036421e+03, 3.295437e-04 ), + TestData< 3 >( 2.0e+06, 573.15, { 0.30, 0.30, 0.40 }, 5.616333e+04, 1.011782e+03, 3.291616e-04 ), + TestData< 3 >( 1.5e+07, 573.15, { 0.30, 0.30, 0.40 }, 5.646702e+04, 1.017253e+03, 3.292472e-04 ), + TestData< 3 >( 6.0e+07, 573.15, { 0.30, 0.30, 0.40 }, 5.753101e+04, 1.036421e+03, 3.295437e-04 ), + TestData< 3 >( 2.0e+06, 293.15, { 0.00, 0.00, 1.00 }, 5.616333e+04, 1.011782e+03, 3.291616e-04 ), + TestData< 3 >( 1.5e+07, 293.15, { 0.00, 0.00, 1.00 }, 5.646702e+04, 1.017253e+03, 3.292472e-04 ), + TestData< 3 >( 6.0e+07, 293.15, { 0.00, 0.00, 1.00 }, 5.753101e+04, 1.036421e+03, 3.295437e-04 ), + TestData< 3 >( 2.0e+06, 353.15, { 0.00, 0.00, 1.00 }, 5.616333e+04, 1.011782e+03, 3.291616e-04 ), + TestData< 3 >( 1.5e+07, 353.15, { 0.00, 0.00, 1.00 }, 5.646702e+04, 1.017253e+03, 3.292472e-04 ), + TestData< 3 >( 6.0e+07, 353.15, { 0.00, 0.00, 1.00 }, 5.753101e+04, 1.036421e+03, 3.295437e-04 ), + TestData< 3 >( 2.0e+06, 573.15, { 0.00, 0.00, 1.00 }, 5.616333e+04, 1.011782e+03, 3.291616e-04 ), + TestData< 3 >( 1.5e+07, 573.15, { 0.00, 0.00, 1.00 }, 5.646702e+04, 1.017253e+03, 3.292472e-04 ), + TestData< 3 >( 6.0e+07, 573.15, { 0.00, 0.00, 1.00 }, 5.753101e+04, 1.036421e+03, 3.295437e-04 ), + TestData< 3 >( 2.0e+06, 293.15, { 0.20, 0.80, 0.00 }, 5.616333e+04, 1.011782e+03, 3.291616e-04 ), + TestData< 3 >( 1.5e+07, 293.15, { 0.20, 0.80, 0.00 }, 5.646702e+04, 1.017253e+03, 3.292472e-04 ), + TestData< 3 >( 6.0e+07, 293.15, { 0.20, 0.80, 0.00 }, 5.753101e+04, 1.036421e+03, 3.295437e-04 ), + TestData< 3 >( 2.0e+06, 353.15, { 0.20, 0.80, 0.00 }, 5.616333e+04, 1.011782e+03, 3.291616e-04 ), + TestData< 3 >( 1.5e+07, 353.15, { 0.20, 0.80, 0.00 }, 5.646702e+04, 1.017253e+03, 3.292472e-04 ), + TestData< 3 >( 6.0e+07, 353.15, { 0.20, 0.80, 0.00 }, 5.753101e+04, 1.036421e+03, 3.295437e-04 ), + TestData< 3 >( 2.0e+06, 573.15, { 0.20, 0.80, 0.00 }, 5.616333e+04, 1.011782e+03, 3.291616e-04 ), + TestData< 3 >( 1.5e+07, 573.15, { 0.20, 0.80, 0.00 }, 5.646702e+04, 1.017253e+03, 3.292472e-04 ), + TestData< 3 >( 6.0e+07, 573.15, { 0.20, 0.80, 0.00 }, 5.753101e+04, 1.036421e+03, 3.295437e-04 ) + ) +); + +/* UNCRUSTIFY-ON */ + +} // testing + +} // geos diff --git a/src/coreComponents/constitutiveDrivers/CMakeLists.txt b/src/coreComponents/constitutiveDrivers/CMakeLists.txt index 376d4d34573..4cc69dd4935 100644 --- a/src/coreComponents/constitutiveDrivers/CMakeLists.txt +++ b/src/coreComponents/constitutiveDrivers/CMakeLists.txt @@ -39,6 +39,7 @@ set( constitutiveDrivers_sources fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp + fluid/multiFluid/compositional/PVTDriverRunTestCompositionalThreePhaseLohrenzBrayClarkViscosity.cpp fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp fluid/multiFluid/reactive/ReactiveFluidDriver.cpp diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalThreePhaseLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalThreePhaseLohrenzBrayClarkViscosity.cpp new file mode 100644 index 00000000000..c7ae9568177 --- /dev/null +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalThreePhaseLohrenzBrayClarkViscosity.cpp @@ -0,0 +1,27 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2024 Chevron + * Copyright (c) 2019- GEOS/GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/* + * PVTDriverRunTestCompositionalThreePhaseLohrenzBrayClarkViscosity.cpp + */ + +#include "constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp" +#include "constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp" + +namespace geos +{ +template void PVTDriver::runTest< constitutive::CompositionalThreePhaseLohrenzBrayClarkViscosity >( + constitutive::CompositionalThreePhaseLohrenzBrayClarkViscosity &, arrayView2d< real64 > const & ); +} diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 6617fd74792..3235c8a9794 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -609,6 +609,10 @@ + + + + @@ -4817,6 +4821,7 @@ Level 0 outputs no specific information for this solver. Higher levels require m + @@ -5149,6 +5154,55 @@ The expected format is "{ waterMax, oilMax }", in that order--> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index c2a891421d3..5de00ab14f2 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1453,6 +1453,7 @@ + @@ -1931,6 +1932,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1970,6 +2021,8 @@ + + @@ -2018,6 +2071,8 @@ + + diff --git a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt index 523c6c89500..f59c739a956 100644 --- a/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/constitutiveTests/CMakeLists.txt @@ -28,6 +28,7 @@ set( gtest_pvt_xmls testPVT_CO2Brine.xml testPVT_CO2BrineTables.xml testPVT_PhaseComposition.xml + testPVT_ThreePhaseCompositional.xml ) set( gtest_reactivefluid_xmls diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_ThreePhaseCompositional.xml b/src/coreComponents/unitTests/constitutiveTests/testPVT_ThreePhaseCompositional.xml new file mode 100644 index 00000000000..79c4892078e --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_ThreePhaseCompositional.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT_ThreePhaseCompositional_blackOil.txt b/src/coreComponents/unitTests/constitutiveTests/testPVT_ThreePhaseCompositional_blackOil.txt new file mode 100644 index 00000000000..53e20dce320 --- /dev/null +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT_ThreePhaseCompositional_blackOil.txt @@ -0,0 +1,113 @@ +# column 1 = time +# column 2 = pressure +# column 3 = temperature +# column 4 = density +# column 5 = total compressibility +# columns 6-8 = phase fractions +# columns 9-11 = phase densities +# columns 12-14 = phase mass densities +# columns 15-17 = phase viscosities +# columns 18-20 = oil phase fractions [C1, C7+, H2O] +# columns 21-23 = gas phase fractions [C1, C7+, H2O] +# columns 24-26 = water phase fractions [C1, C7+, H2O] +0.0000e+00 3.5000e+07 5.5315e+02 6.1560e+03 6.0169e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.5295e+03 5.5295e+03 5.6953e+04 5.2265e+02 5.2265e+02 1.0257e+03 1.0240e-04 1.0240e-04 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +2.0000e-02 3.4000e+07 5.5315e+02 6.1183e+03 6.2707e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.4953e+03 5.4953e+03 5.6930e+04 5.1941e+02 5.1941e+02 1.0253e+03 1.0027e-04 1.0027e-04 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +4.0000e-02 3.3000e+07 5.5315e+02 6.0792e+03 6.5439e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.4598e+03 5.4598e+03 5.6906e+04 5.1606e+02 5.1606e+02 1.0249e+03 9.8135e-05 9.8135e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +6.0000e-02 3.2000e+07 5.5315e+02 6.0387e+03 6.8385e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.4230e+03 5.4230e+03 5.6882e+04 5.1258e+02 5.1258e+02 1.0245e+03 9.6007e-05 9.6007e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +8.0000e-02 3.1000e+07 5.5315e+02 5.9966e+03 7.1573e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.3847e+03 5.3847e+03 5.6859e+04 5.0896e+02 5.0896e+02 1.0240e+03 9.3883e-05 9.3883e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.0000e-01 3.0000e+07 5.5315e+02 5.9528e+03 7.5032e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.3450e+03 5.3450e+03 5.6835e+04 5.0521e+02 5.0521e+02 1.0236e+03 9.1761e-05 9.1761e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.2000e-01 2.9000e+07 5.5315e+02 5.9072e+03 7.8796e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.3036e+03 5.3036e+03 5.6812e+04 5.0129e+02 5.0129e+02 1.0232e+03 8.9642e-05 8.9642e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.4000e-01 2.8000e+07 5.5315e+02 5.8597e+03 8.2906e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.2604e+03 5.2604e+03 5.6788e+04 4.9721e+02 4.9721e+02 1.0228e+03 8.7525e-05 8.7525e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.6000e-01 2.7000e+07 5.5315e+02 5.8100e+03 8.7412e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.2153e+03 5.2153e+03 5.6765e+04 4.9295e+02 4.9295e+02 1.0223e+03 8.5409e-05 8.5409e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.8000e-01 2.6000e+07 5.5315e+02 5.7580e+03 9.2370e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.1682e+03 5.1682e+03 5.6741e+04 4.8849e+02 4.8849e+02 1.0219e+03 8.3293e-05 8.3293e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +2.0000e-01 2.5000e+07 5.5315e+02 5.7036e+03 9.7851e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.1187e+03 5.1187e+03 5.6717e+04 4.8382e+02 4.8382e+02 1.0215e+03 8.1175e-05 8.1175e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +2.2000e-01 2.4000e+07 5.5315e+02 5.6174e+03 1.7179e-08 8.8110e-01 6.1877e-03 1.1271e-01 5.0414e+03 4.9180e+03 5.6694e+04 4.8521e+02 1.3086e+02 1.0211e+03 8.1572e-05 2.1495e-05 3.2929e-04 4.8901e-01 5.1099e-01 0.0000e+00 9.3267e-01 6.7327e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +2.4000e-01 2.3000e+07 5.5315e+02 5.5204e+03 1.7647e-08 8.7325e-01 1.4036e-02 1.1271e-01 4.9562e+03 4.7398e+03 5.6670e+04 4.8864e+02 1.2549e+02 1.0206e+03 8.2813e-05 2.1134e-05 3.2929e-04 4.7405e-01 5.2595e-01 0.0000e+00 9.3352e-01 6.6484e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +2.6000e-01 2.2000e+07 5.5315e+02 5.4225e+03 1.8162e-08 8.6581e-01 2.1475e-02 1.1271e-01 4.8719e+03 4.5585e+03 5.6647e+04 4.9205e+02 1.2016e+02 1.0202e+03 8.4061e-05 2.0788e-05 3.2929e-04 4.5873e-01 5.4127e-01 0.0000e+00 9.3426e-01 6.5741e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +2.8000e-01 2.1000e+07 5.5315e+02 5.3234e+03 1.8732e-08 8.5874e-01 2.8551e-02 1.1271e-01 4.7885e+03 4.3743e+03 5.6623e+04 4.9543e+02 1.1486e+02 1.0198e+03 8.5316e-05 2.0456e-05 3.2929e-04 4.4303e-01 5.5697e-01 0.0000e+00 9.3490e-01 6.5103e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +3.0000e-01 2.0000e+07 5.5315e+02 5.2230e+03 1.9369e-08 8.5198e-01 3.5311e-02 1.1271e-01 4.7061e+03 4.1872e+03 5.6600e+04 4.9880e+02 1.0961e+02 1.0194e+03 8.6578e-05 2.0139e-05 3.2929e-04 4.2693e-01 5.7307e-01 0.0000e+00 9.3542e-01 6.4579e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +3.2000e-01 1.9000e+07 5.5315e+02 5.1210e+03 2.0089e-08 8.4549e-01 4.1796e-02 1.1271e-01 4.6246e+03 3.9973e+03 5.6576e+04 5.0214e+02 1.0438e+02 1.0189e+03 8.7844e-05 1.9835e-05 3.2929e-04 4.1042e-01 5.8958e-01 0.0000e+00 9.3582e-01 6.4178e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +3.4000e-01 1.8000e+07 5.5315e+02 5.0171e+03 2.0911e-08 8.3924e-01 4.8049e-02 1.1271e-01 4.5439e+03 3.8047e+03 5.6553e+04 5.0547e+02 9.9197e+01 1.0185e+03 8.9115e-05 1.9544e-05 3.2929e-04 3.9347e-01 6.0653e-01 0.0000e+00 9.3609e-01 6.3914e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +3.6000e-01 1.7000e+07 5.5315e+02 4.9110e+03 2.1861e-08 8.3318e-01 5.4111e-02 1.1271e-01 4.4641e+03 3.6096e+03 5.6530e+04 5.0878e+02 9.4045e+01 1.0181e+03 9.0389e-05 1.9265e-05 3.2929e-04 3.7608e-01 6.2392e-01 0.0000e+00 9.3620e-01 6.3802e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +3.8000e-01 1.6000e+07 5.5315e+02 4.8022e+03 2.2976e-08 8.2726e-01 6.0026e-02 1.1271e-01 4.3852e+03 3.4119e+03 5.6506e+04 5.1208e+02 8.8928e+01 1.0177e+03 9.1664e-05 1.8998e-05 3.2929e-04 3.5822e-01 6.4178e-01 0.0000e+00 9.3614e-01 6.3864e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +4.0000e-01 1.5000e+07 5.5315e+02 4.6901e+03 2.4303e-08 8.2145e-01 6.5840e-02 1.1271e-01 4.3071e+03 3.2118e+03 5.6483e+04 5.1536e+02 8.3846e+01 1.0173e+03 9.2939e-05 1.8741e-05 3.2929e-04 3.3987e-01 6.6013e-01 0.0000e+00 9.3587e-01 6.4127e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +4.2000e-01 1.4000e+07 5.5315e+02 4.5740e+03 2.5910e-08 8.1568e-01 7.1608e-02 1.1271e-01 4.2299e+03 3.0095e+03 5.6459e+04 5.1864e+02 7.8800e+01 1.0168e+03 9.4210e-05 1.8494e-05 3.2929e-04 3.2102e-01 6.7898e-01 0.0000e+00 9.3537e-01 6.4625e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +4.4000e-01 1.3000e+07 5.5315e+02 4.4527e+03 2.7893e-08 8.0990e-01 7.7391e-02 1.1271e-01 4.1535e+03 2.8050e+03 5.6436e+04 5.2190e+02 7.3789e+01 1.0164e+03 9.5475e-05 1.8255e-05 3.2929e-04 3.0163e-01 6.9837e-01 0.0000e+00 9.3459e-01 6.5406e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +4.6000e-01 1.2000e+07 5.5315e+02 4.3251e+03 3.0392e-08 8.0402e-01 8.3265e-02 1.1271e-01 4.0779e+03 2.5984e+03 5.6412e+04 5.2516e+02 6.8814e+01 1.0160e+03 9.6732e-05 1.8022e-05 3.2929e-04 2.8170e-01 7.1830e-01 0.0000e+00 9.3347e-01 6.6532e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +4.8000e-01 1.1000e+07 5.5315e+02 4.1891e+03 3.3618e-08 7.9796e-01 8.9328e-02 1.1271e-01 4.0031e+03 2.3899e+03 5.6389e+04 5.2841e+02 6.3876e+01 1.0156e+03 9.7975e-05 1.7795e-05 3.2929e-04 2.6120e-01 7.3880e-01 0.0000e+00 9.3191e-01 6.8088e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +5.0000e-01 1.0000e+07 5.5315e+02 4.0424e+03 3.7901e-08 7.9158e-01 9.5711e-02 1.1271e-01 3.9291e+03 2.1796e+03 5.6366e+04 5.3165e+02 5.8976e+01 1.0151e+03 9.9202e-05 1.7569e-05 3.2929e-04 2.4011e-01 7.5989e-01 0.0000e+00 9.2981e-01 7.0194e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +5.2000e-01 9.6040e+06 5.5315e+02 3.9806e+03 3.9996e-08 7.8892e-01 9.8365e-02 1.1271e-01 3.9000e+03 2.0959e+03 5.6356e+04 5.3293e+02 5.7046e+01 1.0150e+03 9.9682e-05 1.7479e-05 3.2929e-04 2.3159e-01 7.6841e-01 0.0000e+00 9.2878e-01 7.1215e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +5.4000e-01 9.2080e+06 5.5315e+02 3.9162e+03 4.2382e-08 7.8618e-01 1.0111e-01 1.1271e-01 3.8710e+03 2.0119e+03 5.6347e+04 5.3421e+02 5.5122e+01 1.0148e+03 1.0016e-04 1.7389e-05 3.2929e-04 2.2297e-01 7.7703e-01 0.0000e+00 9.2764e-01 7.2363e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +5.6000e-01 8.8120e+06 5.5315e+02 3.8490e+03 4.5115e-08 7.8332e-01 1.0397e-01 1.1271e-01 3.8422e+03 1.9277e+03 5.6338e+04 5.3549e+02 5.3205e+01 1.0146e+03 1.0063e-04 1.7299e-05 3.2929e-04 2.1425e-01 7.8575e-01 0.0000e+00 9.2635e-01 7.3653e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +5.8000e-01 8.4160e+06 5.5315e+02 3.7785e+03 4.8266e-08 7.8033e-01 1.0696e-01 1.1271e-01 3.8135e+03 1.8432e+03 5.6329e+04 5.3677e+02 5.1293e+01 1.0145e+03 1.0110e-04 1.7207e-05 3.2929e-04 2.0543e-01 7.9457e-01 0.0000e+00 9.2489e-01 7.5105e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +6.0000e-01 8.0200e+06 5.5315e+02 3.7044e+03 5.1924e-08 7.7719e-01 1.1010e-01 1.1271e-01 3.7849e+03 1.7585e+03 5.6319e+04 5.3805e+02 4.9388e+01 1.0143e+03 1.0156e-04 1.7113e-05 3.2929e-04 1.9650e-01 8.0350e-01 0.0000e+00 9.2326e-01 7.6743e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +6.2000e-01 7.6240e+06 5.5315e+02 3.6260e+03 5.6202e-08 7.7386e-01 1.1343e-01 1.1271e-01 3.7565e+03 1.6736e+03 5.6310e+04 5.3933e+02 4.7489e+01 1.0141e+03 1.0202e-04 1.7018e-05 3.2929e-04 1.8748e-01 8.1252e-01 0.0000e+00 9.2141e-01 7.8594e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +6.4000e-01 7.2280e+06 5.5315e+02 3.5428e+03 6.1247e-08 7.7031e-01 1.1698e-01 1.1271e-01 3.7281e+03 1.5884e+03 5.6301e+04 5.4061e+02 4.5597e+01 1.0140e+03 1.0247e-04 1.6920e-05 3.2929e-04 1.7834e-01 8.2166e-01 0.0000e+00 9.1931e-01 8.0692e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +6.6000e-01 6.8320e+06 5.5315e+02 3.4539e+03 6.7247e-08 7.6650e-01 1.2079e-01 1.1271e-01 3.6999e+03 1.5031e+03 5.6292e+04 5.4188e+02 4.3711e+01 1.0138e+03 1.0292e-04 1.6818e-05 3.2929e-04 1.6910e-01 8.3090e-01 0.0000e+00 9.1692e-01 8.3080e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +6.8000e-01 6.4360e+06 5.5315e+02 3.3585e+03 7.4453e-08 7.6236e-01 1.2493e-01 1.1271e-01 3.6718e+03 1.4176e+03 5.6282e+04 5.4316e+02 4.1832e+01 1.0136e+03 1.0335e-04 1.6713e-05 3.2929e-04 1.5975e-01 8.4025e-01 0.0000e+00 9.1419e-01 8.5810e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +7.0000e-01 6.0400e+06 5.5315e+02 3.2554e+03 8.3199e-08 7.5783e-01 1.2946e-01 1.1271e-01 3.6438e+03 1.3319e+03 5.6273e+04 5.4443e+02 3.9959e+01 1.0135e+03 1.0379e-04 1.6602e-05 3.2929e-04 1.5029e-01 8.4971e-01 0.0000e+00 9.1105e-01 8.8948e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +7.2000e-01 5.6440e+06 5.5315e+02 3.1435e+03 9.3938e-08 7.5281e-01 1.3448e-01 1.1271e-01 3.6160e+03 1.2460e+03 5.6264e+04 5.4570e+02 3.8093e+01 1.0133e+03 1.0421e-04 1.6485e-05 3.2929e-04 1.4071e-01 8.5929e-01 0.0000e+00 9.0742e-01 9.2579e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +7.4000e-01 5.2480e+06 5.5315e+02 3.0210e+03 1.0730e-07 7.4718e-01 1.4011e-01 1.1271e-01 3.5883e+03 1.1600e+03 5.6255e+04 5.4698e+02 3.6233e+01 1.0131e+03 1.0463e-04 1.6359e-05 3.2929e-04 1.3102e-01 8.6898e-01 0.0000e+00 9.0319e-01 9.6812e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +7.6000e-01 4.8520e+06 5.5315e+02 2.8861e+03 1.2415e-07 7.4077e-01 1.4652e-01 1.1271e-01 3.5607e+03 1.0738e+03 5.6245e+04 5.4825e+02 3.4381e+01 1.0130e+03 1.0503e-04 1.6224e-05 3.2929e-04 1.2122e-01 8.7878e-01 0.0000e+00 8.9821e-01 1.0179e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +7.8000e-01 4.4560e+06 5.5315e+02 2.7364e+03 1.4578e-07 7.3336e-01 1.5393e-01 1.1271e-01 3.5332e+03 9.8750e+02 5.6236e+04 5.4952e+02 3.2535e+01 1.0128e+03 1.0543e-04 1.6076e-05 3.2929e-04 1.1129e-01 8.8871e-01 0.0000e+00 8.9228e-01 1.0772e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +8.0000e-01 4.0600e+06 5.5315e+02 2.5691e+03 1.7403e-07 7.2461e-01 1.6268e-01 1.1271e-01 3.5058e+03 9.0104e+02 5.6227e+04 5.5079e+02 3.0696e+01 1.0126e+03 1.0582e-04 1.5911e-05 3.2929e-04 1.0125e-01 8.9875e-01 0.0000e+00 8.8514e-01 1.1486e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +8.2000e-01 3.6640e+06 5.5315e+02 2.3811e+03 2.1172e-07 7.1406e-01 1.7323e-01 1.1271e-01 3.4786e+03 8.1446e+02 5.6218e+04 5.5206e+02 2.8865e+01 1.0125e+03 1.0619e-04 1.5725e-05 3.2929e-04 9.1082e-02 9.0892e-01 0.0000e+00 8.7640e-01 1.2360e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +8.4000e-01 3.2680e+06 5.5315e+02 2.1686e+03 2.6326e-07 7.0095e-01 1.8634e-01 1.1271e-01 3.4515e+03 7.2776e+02 5.6208e+04 5.5333e+02 2.7040e+01 1.0123e+03 1.0656e-04 1.5512e-05 3.2929e-04 8.0792e-02 9.1921e-01 0.0000e+00 8.6548e-01 1.3452e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +8.6000e-01 2.8720e+06 5.5315e+02 1.9276e+03 3.3583e-07 6.8411e-01 2.0318e-01 1.1271e-01 3.4245e+03 6.4096e+02 5.6199e+04 5.5460e+02 2.5222e+01 1.0121e+03 1.0691e-04 1.5261e-05 3.2929e-04 7.0376e-02 9.2962e-01 0.0000e+00 8.5148e-01 1.4852e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +8.8000e-01 2.4760e+06 5.5315e+02 1.6549e+03 4.4172e-07 6.6146e-01 2.2583e-01 1.1271e-01 3.3976e+03 5.5407e+02 5.6190e+04 5.5587e+02 2.3412e+01 1.0120e+03 1.0725e-04 1.4958e-05 3.2929e-04 5.9832e-02 9.4017e-01 0.0000e+00 8.3298e-01 1.6702e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +9.0000e-01 2.0800e+06 5.5315e+02 1.3487e+03 6.0350e-07 6.2908e-01 2.5821e-01 1.1271e-01 3.3708e+03 4.6709e+02 5.6181e+04 5.5714e+02 2.1609e+01 1.0118e+03 1.0757e-04 1.4583e-05 3.2929e-04 4.9159e-02 9.5084e-01 0.0000e+00 8.0745e-01 1.9255e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +9.2000e-01 1.6840e+06 5.5315e+02 1.0126e+03 8.6704e-07 5.7850e-01 3.0879e-01 1.1271e-01 3.3442e+03 3.8004e+02 5.6172e+04 5.5841e+02 1.9813e+01 1.0116e+03 1.0788e-04 1.4097e-05 3.2929e-04 3.8354e-02 9.6165e-01 0.0000e+00 7.7004e-01 2.2996e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +9.4000e-01 1.2880e+06 5.5315e+02 6.6052e+02 1.3428e-06 4.8744e-01 3.9985e-01 1.1271e-01 3.3176e+03 2.9292e+02 5.6162e+04 5.5968e+02 1.8025e+01 1.0115e+03 1.0818e-04 1.3437e-05 3.2929e-04 2.7415e-02 9.7259e-01 0.0000e+00 7.1015e-01 2.8985e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +9.6000e-01 8.9200e+05 5.5315e+02 3.2534e+02 2.3985e-06 2.7229e-01 6.1500e-01 1.1271e-01 3.2912e+03 2.0575e+02 5.6153e+04 5.6094e+02 1.6244e+01 1.0113e+03 1.0845e-04 1.2477e-05 3.2929e-04 1.6340e-02 9.8366e-01 0.0000e+00 5.9920e-01 4.0080e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +9.8000e-01 4.9600e+05 5.5315e+02 1.2779e+02 2.1211e-06 8.8729e-01 0.0000e+00 1.1271e-01 1.1342e+02 1.1342e+02 5.6144e+04 1.0720e+01 1.0720e+01 1.0112e+03 1.1716e-05 1.1716e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.0000e+00 1.0000e+05 5.5315e+02 2.4746e+01 1.0099e-05 8.8729e-01 0.0000e+00 1.1271e-01 2.1958e+01 2.1958e+01 5.6135e+04 2.0755e+00 2.0755e+00 1.0110e+03 1.1560e-05 1.1560e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.0200e+00 4.9600e+05 5.8315e+02 1.2012e+02 2.1009e-06 8.8729e-01 0.0000e+00 1.1271e-01 1.0660e+02 1.0660e+02 5.6144e+04 1.0076e+01 1.0076e+01 1.0112e+03 1.2221e-05 1.2221e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.0400e+00 8.9200e+05 5.8315e+02 2.2354e+02 1.2093e-06 8.8729e-01 0.0000e+00 1.1271e-01 1.9843e+02 1.9843e+02 5.6153e+04 1.8756e+01 1.8756e+01 1.0113e+03 1.2405e-05 1.2405e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.0600e+00 1.2880e+06 5.8315e+02 3.4774e+02 1.7667e-06 4.3627e-02 8.4366e-01 1.1271e-01 3.0621e+03 2.9504e+02 5.6162e+04 5.1804e+02 2.7265e+01 1.0115e+03 8.2939e-05 1.2695e-05 3.2929e-04 2.4366e-02 9.7563e-01 0.0000e+00 5.1344e-01 4.8656e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.0800e+00 1.6840e+06 5.8315e+02 6.0704e+02 1.1265e-06 3.0186e-01 5.8543e-01 1.1271e-01 3.0890e+03 3.7828e+02 5.6172e+04 5.1649e+02 2.9209e+01 1.0116e+03 8.2756e-05 1.3409e-05 3.2929e-04 3.6932e-02 9.6307e-01 0.0000e+00 6.1026e-01 3.8974e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.1000e+00 2.0800e+06 5.8315e+02 8.8181e+02 7.8965e-07 4.2838e-01 4.5891e-01 1.1271e-01 3.1161e+03 4.6143e+02 5.6181e+04 5.1495e+02 3.1163e+01 1.0118e+03 8.2556e-05 1.3965e-05 3.2929e-04 4.9339e-02 9.5066e-01 0.0000e+00 6.7192e-01 3.2808e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.1200e+00 2.4760e+06 5.8315e+02 1.1539e+03 5.8364e-07 5.0379e-01 3.8350e-01 1.1271e-01 3.1432e+03 5.4447e+02 5.6190e+04 5.1339e+02 3.3128e+01 1.0120e+03 8.2339e-05 1.4414e-05 3.2929e-04 6.1589e-02 9.3841e-01 0.0000e+00 7.1454e-01 2.8546e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.1400e+00 2.8720e+06 5.8315e+02 1.4127e+03 4.4720e-07 5.5409e-01 3.3320e-01 1.1271e-01 3.1706e+03 6.2740e+02 5.6199e+04 5.1184e+02 3.5105e+01 1.0121e+03 8.2106e-05 1.4788e-05 3.2929e-04 7.3685e-02 9.2632e-01 0.0000e+00 7.4571e-01 2.5429e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.1600e+00 3.2680e+06 5.8315e+02 1.6532e+03 3.5221e-07 5.9019e-01 2.9710e-01 1.1271e-01 3.1980e+03 7.1021e+02 5.6208e+04 5.1028e+02 3.7093e+01 1.0123e+03 8.1860e-05 1.5107e-05 3.2929e-04 8.5630e-02 9.1437e-01 0.0000e+00 7.6944e-01 2.3056e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.1800e+00 3.6640e+06 5.8315e+02 1.8738e+03 2.8372e-07 6.1751e-01 2.6978e-01 1.1271e-01 3.2257e+03 7.9289e+02 5.6218e+04 5.0871e+02 3.9092e+01 1.0125e+03 8.1599e-05 1.5383e-05 3.2929e-04 9.7426e-02 9.0257e-01 0.0000e+00 7.8808e-01 2.1192e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.2000e+00 4.0600e+06 5.8315e+02 2.0746e+03 2.3298e-07 6.3902e-01 2.4827e-01 1.1271e-01 3.2534e+03 8.7543e+02 5.6227e+04 5.0714e+02 4.1103e+01 1.0126e+03 8.1325e-05 1.5628e-05 3.2929e-04 1.0908e-01 8.9092e-01 0.0000e+00 8.0306e-01 1.9694e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.2200e+00 4.4560e+06 5.8315e+02 2.2571e+03 1.9456e-07 6.5648e-01 2.3081e-01 1.1271e-01 3.2813e+03 9.5783e+02 5.6236e+04 5.0557e+02 4.3124e+01 1.0128e+03 8.1039e-05 1.5847e-05 3.2929e-04 1.2058e-01 8.7942e-01 0.0000e+00 8.1535e-01 1.8465e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.2400e+00 4.8520e+06 5.8315e+02 2.4230e+03 1.6492e-07 6.7102e-01 2.1627e-01 1.1271e-01 3.3094e+03 1.0401e+03 5.6245e+04 5.0399e+02 4.5158e+01 1.0130e+03 8.0742e-05 1.6047e-05 3.2929e-04 1.3195e-01 8.6805e-01 0.0000e+00 8.2557e-01 1.7443e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.2600e+00 5.2480e+06 5.8315e+02 2.5742e+03 1.4168e-07 6.8338e-01 2.0390e-01 1.1271e-01 3.3376e+03 1.1221e+03 5.6255e+04 5.0240e+02 4.7203e+01 1.0131e+03 8.0433e-05 1.6230e-05 3.2929e-04 1.4318e-01 8.5682e-01 0.0000e+00 8.3419e-01 1.6581e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.2800e+00 5.6440e+06 5.8315e+02 2.7125e+03 1.2319e-07 6.9409e-01 1.9320e-01 1.1271e-01 3.3660e+03 1.2040e+03 5.6264e+04 5.0081e+02 4.9259e+01 1.0133e+03 8.0115e-05 1.6401e-05 3.2929e-04 1.5427e-01 8.4573e-01 0.0000e+00 8.4154e-01 1.5846e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.3000e+00 6.0400e+06 5.8315e+02 2.8394e+03 1.0830e-07 7.0351e-01 1.8378e-01 1.1271e-01 3.3945e+03 1.2857e+03 5.6273e+04 4.9921e+02 5.1327e+01 1.0135e+03 7.9786e-05 1.6561e-05 3.2929e-04 1.6523e-01 8.3477e-01 0.0000e+00 8.4786e-01 1.5214e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.3200e+00 6.4360e+06 5.8315e+02 2.9565e+03 9.6164e-08 7.1191e-01 1.7538e-01 1.1271e-01 3.4232e+03 1.3673e+03 5.6282e+04 4.9761e+02 5.3407e+01 1.0136e+03 7.9448e-05 1.6713e-05 3.2929e-04 1.7606e-01 8.2394e-01 0.0000e+00 8.5333e-01 1.4667e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.3400e+00 6.8320e+06 5.8315e+02 3.0649e+03 8.6168e-08 7.1948e-01 1.6781e-01 1.1271e-01 3.4520e+03 1.4486e+03 5.6292e+04 4.9600e+02 5.5498e+01 1.0138e+03 7.9102e-05 1.6858e-05 3.2929e-04 1.8676e-01 8.1324e-01 0.0000e+00 8.5811e-01 1.4189e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.3600e+00 7.2280e+06 5.8315e+02 3.1660e+03 7.7854e-08 7.2640e-01 1.6089e-01 1.1271e-01 3.4809e+03 1.5297e+03 5.6301e+04 4.9439e+02 5.7601e+01 1.0140e+03 7.8748e-05 1.6997e-05 3.2929e-04 1.9733e-01 8.0267e-01 0.0000e+00 8.6229e-01 1.3771e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.3800e+00 7.6240e+06 5.8315e+02 3.2605e+03 7.0879e-08 7.3276e-01 1.5453e-01 1.1271e-01 3.5101e+03 1.6106e+03 5.6310e+04 4.9277e+02 5.9717e+01 1.0141e+03 7.8386e-05 1.7132e-05 3.2929e-04 2.0778e-01 7.9222e-01 0.0000e+00 8.6597e-01 1.3403e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.4000e+00 8.0200e+06 5.8315e+02 3.3492e+03 6.4979e-08 7.3868e-01 1.4861e-01 1.1271e-01 3.5394e+03 1.6913e+03 5.6319e+04 4.9114e+02 6.1844e+01 1.0143e+03 7.8016e-05 1.7263e-05 3.2929e-04 2.1811e-01 7.8189e-01 0.0000e+00 8.6923e-01 1.3077e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.4200e+00 8.4160e+06 5.8315e+02 3.4330e+03 5.9949e-08 7.4422e-01 1.4307e-01 1.1271e-01 3.5688e+03 1.7717e+03 5.6329e+04 4.8951e+02 6.3983e+01 1.0145e+03 7.7640e-05 1.7391e-05 3.2929e-04 2.2831e-01 7.7169e-01 0.0000e+00 8.7211e-01 1.2789e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.4400e+00 8.8120e+06 5.8315e+02 3.5124e+03 5.5632e-08 7.4946e-01 1.3783e-01 1.1271e-01 3.5984e+03 1.8519e+03 5.6338e+04 4.8787e+02 6.6135e+01 1.0146e+03 7.7258e-05 1.7517e-05 3.2929e-04 2.3840e-01 7.6160e-01 0.0000e+00 8.7467e-01 1.2533e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.4600e+00 9.2080e+06 5.8315e+02 3.5880e+03 5.1902e-08 7.5444e-01 1.3285e-01 1.1271e-01 3.6282e+03 1.9319e+03 5.6347e+04 4.8623e+02 6.8299e+01 1.0148e+03 7.6869e-05 1.7641e-05 3.2929e-04 2.4838e-01 7.5162e-01 0.0000e+00 8.7695e-01 1.2305e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.4800e+00 9.6040e+06 5.8315e+02 3.6601e+03 4.8659e-08 7.5920e-01 1.2809e-01 1.1271e-01 3.6581e+03 2.0115e+03 5.6356e+04 4.8457e+02 7.0476e+01 1.0150e+03 7.6475e-05 1.7765e-05 3.2929e-04 2.5824e-01 7.4176e-01 0.0000e+00 8.7898e-01 1.2102e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.5000e+00 1.0000e+07 5.8315e+02 3.7291e+03 4.5824e-08 7.6378e-01 1.2351e-01 1.1271e-01 3.6882e+03 2.0910e+03 5.6366e+04 4.8291e+02 7.2665e+01 1.0151e+03 7.6075e-05 1.7888e-05 3.2929e-04 2.6799e-01 7.3201e-01 0.0000e+00 8.8078e-01 1.1922e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.5200e+00 1.1000e+07 5.8315e+02 3.8922e+03 4.0073e-08 7.7474e-01 1.1254e-01 1.1271e-01 3.7648e+03 2.2903e+03 5.6389e+04 4.7869e+02 7.8250e+01 1.0156e+03 7.5043e-05 1.8197e-05 3.2929e-04 2.9214e-01 7.0786e-01 0.0000e+00 8.8451e-01 1.1549e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.5400e+00 1.2000e+07 5.8315e+02 4.0423e+03 3.5793e-08 7.8515e-01 1.0214e-01 1.1271e-01 3.8426e+03 2.4877e+03 5.6412e+04 4.7441e+02 8.3920e+01 1.0160e+03 7.3984e-05 1.8510e-05 3.2929e-04 3.1562e-01 6.8438e-01 0.0000e+00 8.8727e-01 1.1273e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.5600e+00 1.3000e+07 5.8315e+02 4.1824e+03 3.2518e-08 7.9527e-01 9.2016e-02 1.1271e-01 3.9214e+03 2.6831e+03 5.6436e+04 4.7007e+02 8.9678e+01 1.0164e+03 7.2901e-05 1.8830e-05 3.2929e-04 3.3847e-01 6.6153e-01 0.0000e+00 8.8925e-01 1.1075e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.5800e+00 1.4000e+07 5.8315e+02 4.3149e+03 2.9952e-08 8.0535e-01 8.1944e-02 1.1271e-01 4.0014e+03 2.8763e+03 5.6459e+04 4.6568e+02 9.5527e+01 1.0168e+03 7.1797e-05 1.9161e-05 3.2929e-04 3.6073e-01 6.3927e-01 0.0000e+00 8.9060e-01 1.0940e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.6000e+00 1.5000e+07 5.8315e+02 4.4414e+03 2.7899e-08 8.1555e-01 7.1735e-02 1.1271e-01 4.0824e+03 3.0673e+03 5.6483e+04 4.6121e+02 1.0147e+02 1.0173e+03 7.0674e-05 1.9505e-05 3.2929e-04 3.8242e-01 6.1758e-01 0.0000e+00 8.9143e-01 1.0857e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.6200e+00 1.6000e+07 5.8315e+02 4.5631e+03 2.6223e-08 8.2607e-01 6.1222e-02 1.1271e-01 4.1647e+03 3.2559e+03 5.6506e+04 4.5668e+02 1.0752e+02 1.0177e+03 6.9535e-05 1.9866e-05 3.2929e-04 4.0358e-01 5.9642e-01 0.0000e+00 8.9180e-01 1.0820e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.6400e+00 1.7000e+07 5.8315e+02 4.6810e+03 2.4832e-08 8.3705e-01 5.0240e-02 1.1271e-01 4.2481e+03 3.4420e+03 5.6530e+04 4.5206e+02 1.1367e+02 1.0181e+03 6.8382e-05 2.0245e-05 3.2929e-04 4.2423e-01 5.7577e-01 0.0000e+00 8.9179e-01 1.0821e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.6600e+00 1.8000e+07 5.8315e+02 4.7958e+03 2.3660e-08 8.4867e-01 3.8624e-02 1.1271e-01 4.3328e+03 3.6254e+03 5.6553e+04 4.4735e+02 1.1994e+02 1.0185e+03 6.7214e-05 2.0645e-05 3.2929e-04 4.4441e-01 5.5559e-01 0.0000e+00 8.9142e-01 1.0858e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.6800e+00 1.9000e+07 5.8315e+02 4.9081e+03 2.2657e-08 8.6110e-01 2.6192e-02 1.1271e-01 4.4188e+03 3.8061e+03 5.6576e+04 4.4254e+02 1.2633e+02 1.0189e+03 6.6034e-05 2.1068e-05 3.2929e-04 4.6414e-01 5.3586e-01 0.0000e+00 8.9072e-01 1.0928e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.7000e+00 2.0000e+07 5.8315e+02 5.0183e+03 2.1788e-08 8.7455e-01 1.2742e-02 1.1271e-01 4.5061e+03 3.9839e+03 5.6600e+04 4.3761e+02 1.3286e+02 1.0194e+03 6.4840e-05 2.1517e-05 3.2929e-04 4.8347e-01 5.1653e-01 0.0000e+00 8.8972e-01 1.1028e-01 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.7200e+00 2.1000e+07 5.8315e+02 5.1233e+03 1.5507e-08 8.8729e-01 0.0000e+00 1.1271e-01 4.5927e+03 4.5927e+03 5.6623e+04 4.3410e+02 4.3410e+02 1.0198e+03 6.4038e-05 6.4038e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.7400e+00 2.2000e+07 5.8315e+02 5.2003e+03 1.4379e-08 8.8729e-01 0.0000e+00 1.1271e-01 4.6625e+03 4.6625e+03 5.6647e+04 4.4069e+02 4.4069e+02 1.0202e+03 6.5972e-05 6.5972e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.7600e+00 2.3000e+07 5.8315e+02 5.2730e+03 1.3388e-08 8.8729e-01 0.0000e+00 1.1271e-01 4.7283e+03 4.7283e+03 5.6670e+04 4.4691e+02 4.4691e+02 1.0206e+03 6.7891e-05 6.7891e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.7800e+00 2.4000e+07 5.8315e+02 5.3417e+03 1.2511e-08 8.8729e-01 0.0000e+00 1.1271e-01 4.7905e+03 4.7905e+03 5.6694e+04 4.5280e+02 4.5280e+02 1.0211e+03 6.9797e-05 6.9797e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.8000e+00 2.5000e+07 5.8315e+02 5.4068e+03 1.1730e-08 8.8729e-01 0.0000e+00 1.1271e-01 4.8495e+03 4.8495e+03 5.6717e+04 4.5837e+02 4.5837e+02 1.0215e+03 7.1695e-05 7.1695e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.8200e+00 2.6000e+07 5.8315e+02 5.4686e+03 1.1031e-08 8.8729e-01 0.0000e+00 1.1271e-01 4.9055e+03 4.9055e+03 5.6741e+04 4.6367e+02 4.6367e+02 1.0219e+03 7.3587e-05 7.3587e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.8400e+00 2.7000e+07 5.8315e+02 5.5275e+03 1.0402e-08 8.8729e-01 0.0000e+00 1.1271e-01 4.9589e+03 4.9589e+03 5.6765e+04 4.6872e+02 4.6872e+02 1.0223e+03 7.5475e-05 7.5475e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.8600e+00 2.8000e+07 5.8315e+02 5.5837e+03 9.8334e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.0099e+03 5.0099e+03 5.6788e+04 4.7353e+02 4.7353e+02 1.0228e+03 7.7360e-05 7.7360e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.8800e+00 2.9000e+07 5.8315e+02 5.6374e+03 9.3169e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.0586e+03 5.0586e+03 5.6812e+04 4.7814e+02 4.7814e+02 1.0232e+03 7.9245e-05 7.9245e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.9000e+00 3.0000e+07 5.8315e+02 5.6888e+03 8.8460e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.1052e+03 5.1052e+03 5.6835e+04 4.8254e+02 4.8254e+02 1.0236e+03 8.1131e-05 8.1131e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.9200e+00 3.1000e+07 5.8315e+02 5.7381e+03 8.4151e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.1499e+03 5.1499e+03 5.6859e+04 4.8677e+02 4.8677e+02 1.0240e+03 8.3018e-05 8.3018e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.9400e+00 3.2000e+07 5.8315e+02 5.7854e+03 8.0196e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.1929e+03 5.1929e+03 5.6882e+04 4.9083e+02 4.9083e+02 1.0245e+03 8.4907e-05 8.4907e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.9600e+00 3.3000e+07 5.8315e+02 5.8309e+03 7.6552e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.2342e+03 5.2342e+03 5.6906e+04 4.9473e+02 4.9473e+02 1.0249e+03 8.6800e-05 8.6800e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +1.9800e+00 3.4000e+07 5.8315e+02 5.8747e+03 7.3187e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.2739e+03 5.2739e+03 5.6930e+04 4.9849e+02 4.9849e+02 1.0253e+03 8.8696e-05 8.8696e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 +2.0000e+00 3.5000e+07 5.8315e+02 5.9169e+03 7.0071e-09 8.8729e-01 0.0000e+00 1.1271e-01 5.3122e+03 5.3122e+03 5.6953e+04 5.0211e+02 5.0211e+02 1.0257e+03 9.0597e-05 9.0597e-05 3.2929e-04 5.0000e-01 5.0000e-01 0.0000e+00 9.1515e-01 8.4850e-02 0.0000e+00 0.0000e+00 0.0000e+00 1.0000e+00 From bce74544815e79238b75b7b92d2414c72d662c76 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 19 Nov 2024 12:02:10 -0600 Subject: [PATCH 253/286] refactor: update aquiferBoundaryCondition.cpp (#3454) * Update comments to remove unwanted references. --------- Co-authored-by: Pavel Tomin Co-authored-by: Omar Duran --- src/coreComponents/constitutive/PVTPackage | 2 +- .../CO2Brine/functions/EzrokhiBrineDensity.cpp | 2 +- .../CO2Brine/functions/EzrokhiBrineViscosity.cpp | 2 +- .../CO2Brine/functions/PVTFunctionHelpers.cpp | 2 +- .../fluid/multifluid/blackOil/BlackOilFluid.cpp | 2 +- .../fluid/multifluid/blackOil/BlackOilFluid.hpp | 2 +- .../fluid/multifluid/blackOil/BlackOilFluidBase.hpp | 2 +- .../fluid/multifluid/blackOil/DeadOilFluid.hpp | 2 +- .../BrooksCoreyBakerRelativePermeability.hpp | 2 +- .../BrooksCoreyStone2RelativePermeability.hpp | 2 +- .../RelativePermeabilityInterpolators.hpp | 5 ++--- .../TableRelativePermeabilityHysteresis.cpp | 2 +- .../TableRelativePermeabilityHysteresis.hpp | 12 +++++------- .../VanGenuchtenBakerRelativePermeability.hpp | 2 +- .../VanGenuchtenStone2RelativePermeability.hpp | 2 +- .../fieldSpecification/AquiferBoundaryCondition.cpp | 5 ++--- .../fieldSpecification/AquiferBoundaryCondition.hpp | 8 ++++---- .../fluidFlow/CompositionalMultiphaseStatistics.cpp | 2 +- .../ReactiveCompositionalMultiphaseOBLKernels.hpp | 2 +- .../testAquiferBoundaryCondition.cpp | 4 ++-- 20 files changed, 30 insertions(+), 34 deletions(-) diff --git a/src/coreComponents/constitutive/PVTPackage b/src/coreComponents/constitutive/PVTPackage index 59d81b149e3..a67739ff53e 160000 --- a/src/coreComponents/constitutive/PVTPackage +++ b/src/coreComponents/constitutive/PVTPackage @@ -1 +1 @@ -Subproject commit 59d81b149e35ea5db0d715e608217d8bd56e9291 +Subproject commit a67739ff53eed4c391dbd42bc12f960a6b66f8c2 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp index 7ba7020fa9e..a1a7c238df4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp @@ -59,7 +59,7 @@ EzrokhiBrineDensity::EzrokhiBrineDensity( string const & name, void EzrokhiBrineDensity::makeCoefficients( string_array const & inputPara ) { - // compute brine density following Ezrokhi`s method (referenced in Eclipse TD, Aqueous phase properties) + // compute brine density following Ezrokhi`s method // Reference : Zaytsev, I.D. and Aseyev, G.G. Properties of Aqueous Solutions of Electrolytes, Boca Raton, Florida, USA CRC Press (1993). m_waterCompressibility = 4.5e-10; // Pa-1 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp index c300237899a..c0411ad922b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp @@ -57,7 +57,7 @@ EzrokhiBrineViscosity::EzrokhiBrineViscosity( string const & name, void EzrokhiBrineViscosity::makeCoefficients( string_array const & inputPara ) { - // compute brine viscosity following Ezrokhi`s method (referenced in Eclipse TD, Aqueous phase properties) + // compute brine viscosity following Ezrokhi`s method // Reference : Zaytsev, I.D. and Aseyev, G.G. Properties of Aqueous Solutions of Electrolytes, Boca Raton, Florida, USA CRC Press (1993). GEOS_THROW_IF_LT_MSG( inputPara.size(), 5, GEOS_FMT( "{}: insufficient number of model parameters", m_functionName ), diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp index a05497483eb..b0297d9b00e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp @@ -45,7 +45,7 @@ BlackOilTables::readTable( string const & fileName, // Remove whitespace and end-of-line characters, if any str = stringutilities::trim( str, " \r" ); - // Remove # and -- (Eclipse-style) comments + // Remove # and -- comments str = stringutilities::removeStringAndFollowingContent( str, "#" ); str = stringutilities::removeStringAndFollowingContent( str, "--" ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp index 4a4118c1cbf..66e017b23fe 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp @@ -49,7 +49,7 @@ void BlackOilFluid::postInputInitialization() void BlackOilFluid::readInputDataFromTableFunctions() { - GEOS_THROW( GEOS_FMT( "{}: this option is not implemented yet, please provide PVT files in standard Eclipse format", getFullName() ), + GEOS_THROW( GEOS_FMT( "{}: this option is not implemented yet, please provide PVT files in standard text format", getFullName() ), InputError ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp index 112c677bad3..f789a7a82c2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp @@ -276,7 +276,7 @@ class BlackOilFluid : public BlackOilFluidBase virtual void readInputDataFromPVTFiles() override; /** - * @brief Read all the PVT table provided by the user in Eclipse format + * @brief Read all the PVT table provided by the user in text format * @param[in] oilTable the oil table data read from file * @param[in] oilSurfaceMassDensity the oil phase surface mass density * @param[in] oilSurfaceMolecularWeight the oil phase surface molecular weight diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp index dbca6083fca..eb7215a8361 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp @@ -144,7 +144,7 @@ class BlackOilFluidBase : public MultiFluidBase virtual void readInputDataFromTableFunctions() = 0; /** - * @brief Read all the PVT table provided by the user in Eclipse format + * @brief Read all the PVT table provided by the user in text format */ virtual void readInputDataFromPVTFiles() = 0; diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp index 69311e692f2..86d82b50114 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp @@ -148,7 +148,7 @@ class DeadOilFluid : public BlackOilFluidBase virtual void readInputDataFromTableFunctions() override; /** - * @brief Read all the PVT table provided by the user in Eclipse format + * @brief Read all the PVT table provided by the user in text format */ virtual void readInputDataFromPVTFiles() override; diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp index 57181e7f726..723abef4df9 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp @@ -86,7 +86,7 @@ class BrooksCoreyBakerRelativePermeabilityUpdate final : public RelativePermeabi * @param[in] maxValue the endpoint relative permeability value * * This function evaluates the relperm function and its derivative at a given phase saturation - * Reference: Eclipse technical description and Petrowiki + * Reference: Petrowiki */ GEOS_HOST_DEVICE GEOS_FORCE_INLINE diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp index 99e6caff614..c6486d65551 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp @@ -86,7 +86,7 @@ class BrooksCoreyStone2RelativePermeabilityUpdate final : public RelativePermeab * @param[in] maxValue the endpoint relative permeability value * * This function evaluates the relperm function and its derivative at a given phase saturation - * Reference: Eclipse technical description and Petrowiki + * Reference: Petrowiki */ GEOS_HOST_DEVICE inline diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp index eae8eb8b394..b2e18b9df9a 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp @@ -46,8 +46,8 @@ struct Baker * @param[in] dGoRelPerm_dOilVolFrac * * This function interpolates the two-phase relperms to compute the three-phase relperm - * The interpolation is based on the modified Baker method, also used as default in Eclipse - * Reference: Eclipse technical description and PetroWiki + * The interpolation is based on the modified Baker method + * Reference: PetroWiki */ GEOS_HOST_DEVICE GEOS_FORCE_INLINE @@ -131,7 +131,6 @@ struct Stone2 * * This function interpolates the two-phase relperms to compute the three-phase relperm * The interpolation is based on the modified Stone 2 method - * Reference: Eclipse technical description */ GEOS_HOST_DEVICE GEOS_FORCE_INLINE diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp index 4eb224bb5e2..5fda6ae4c6a 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp @@ -488,7 +488,7 @@ void TableRelativePermeabilityHysteresis::computeLandCoefficient() ipNonWetting = m_phaseOrder[PhaseType::GAS]; } - // Note: for simplicity, the notations are taken from IX documentation (although this breaks our phaseVolFrac naming convention) + // Note: for simplicity, the notations are taken reservoir simulation literature (although this breaks our phaseVolFrac naming convention) // Step 1: Land parameter for the wetting phase diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp index 1ecd09e95f7..7e5edb71292 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp @@ -568,7 +568,7 @@ class TableRelativePermeabilityHysteresis : public RelativePermeabilityBase /// Max krwo value (unique as krwo and krgo are considred non hysteretical in our implementation) real64 m_waterOilMaxRelPerm; - /// enum class to dispatch interpolator (Baker/Eclipse,StoneII) + /// enum class to dispatch interpolator (Baker,StoneII) ThreePhaseInterpolator m_threePhaseInterpolator; }; @@ -711,11 +711,11 @@ TableRelativePermeabilityHysteresis::KernelWrapper:: real64 & phaseRelPerm, real64 & dPhaseRelPerm_dPhaseVolFrac ) const { - // note: for simplicity, the notations are taken from IX documentation (although this breaks our phaseVolFrac naming convention) + // note: for simplicity, the notations are taken from reservoir simulation literature (although this breaks our phaseVolFrac naming + // convention) // Step 1: for a given value of the max historical saturation, Shy, compute the trapped critical saturation, Scrt, - // using Land's method. The calculation includes the modifications from Jerauld. This is equation 2.162 from - // the IX technical description. + // using Land's method. The calculation includes the modifications from Jerauld. real64 const S = phaseVolFraction; real64 const Scri = imbibitionPhaseMinVolFraction; real64 const Scrd = drainagePhaseMinVolFraction; @@ -744,9 +744,8 @@ TableRelativePermeabilityHysteresis::KernelWrapper:: else { // Step 2: compute the normalized saturation, S_norm, at which the imbibition relperm curve will be evaluated. - // This is equation 2.166 from the IX technical description. real64 const ratio = ( Smx - Scri ) / ( Shy - Scrt ); - real64 const Snorm = Scri + ( S - Scrt ) * ratio; // normalized saturation from equation 2.166 + real64 const Snorm = Scri + ( S - Scrt ) * ratio; // normalized saturation real64 const dSnorm_dS = ratio; // Step 3: evaluate the imbibition relperm, kri(Snorm), at the normalized saturation, Snorm. @@ -761,7 +760,6 @@ TableRelativePermeabilityHysteresis::KernelWrapper:: real64 const krdAtSmx = drainageRelPermEndPoint; // Step 6: apply the formula blending drainage and imbibition relperms from the Killough model. - // This equation 2.165 from the IX technical description. real64 const drainageRelPermRatio = krdAtShy / krdAtSmx; phaseRelPerm = kriAtSnorm * drainageRelPermRatio; dPhaseRelPerm_dPhaseVolFrac = dkriAtSnorm_dS * drainageRelPermRatio; diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp index 88ac8c2eafc..cf3d399f2ef 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp @@ -87,7 +87,7 @@ class VanGenuchtenBakerRelativePermeabilityUpdate final : public RelativePermeab * @return (void) * * This function evaluates the relperm function and its derivative at a given phase saturation - * Reference: Eclipse technical description and Petrowiki + * Reference: Petrowiki */ GEOS_HOST_DEVICE GEOS_FORCE_INLINE diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp index 9896b892950..28c9adda0b7 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp @@ -87,7 +87,7 @@ class VanGenuchtenStone2RelativePermeabilityUpdate final : public RelativePermea * @return (void) * * This function evaluates the relperm function and its derivative at a given phase saturation - * Reference: Eclipse technical description and Petrowiki + * Reference: Petrowiki */ GEOS_HOST_DEVICE inline diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp index dffd783e997..afaa450a27e 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp @@ -163,7 +163,7 @@ void AquiferBoundaryCondition::postInputInitialization() void AquiferBoundaryCondition::setupDefaultPressureInfluenceFunction() { - // default table; see Eclipse or Intersect documentation + // default table array1d< array1d< real64 > > dimensionlessTime; dimensionlessTime.resize( 1 ); @@ -281,14 +281,13 @@ void AquiferBoundaryCondition::setGravityVector( R1Tensor const & gravityVector void AquiferBoundaryCondition::computeTimeConstant() { - // equation 5.3 of the Eclipse TD m_timeConstant = m_viscosity * m_porosity * m_totalCompressibility * m_innerRadius * m_innerRadius; m_timeConstant /= m_permeability; } void AquiferBoundaryCondition::computeInfluxConstant() { - // equation 5.4 of the Eclipse TD, including the constant 6.283 of the Carter-Tracy model + // 6.283 is the constant of the Carter-Tracy model m_influxConstant = 6.283 * m_thickness * ( m_angle / 360.0 ) * m_porosity * m_totalCompressibility * m_innerRadius * m_innerRadius; } diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp index 9ee270df074..00333656f74 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp @@ -357,7 +357,7 @@ AquiferBoundaryCondition::KernelWrapper:: real64 const & areaFraction, real64 & dAquiferVolFlux_dPres ) const { - // compute the dimensionless time (equation 5.5 of the Eclipse TD) + // compute the dimensionless time real64 const dimensionlessTimeAtBeginningOfStep = timeAtBeginningOfStep / m_timeConstant; real64 const dimensionlessTimeAtEndOfStep = ( timeAtBeginningOfStep + dt ) / m_timeConstant; @@ -368,15 +368,15 @@ AquiferBoundaryCondition::KernelWrapper:: // compute the potential difference between the reservoir (old pressure) and the aquifer real64 const potDiff = m_initialPressure - reservoirPressure_n - m_density * ( m_gravCoef - reservoirGravCoef ); - // compute the a (equation 5.8 of the Eclipse TD) + // compute the a real64 const timeConstantInv = 1.0 / m_timeConstant; real64 const denom = presInfluence - dimensionlessTimeAtBeginningOfStep * dPresInfluence_dTime; real64 const a = timeConstantInv * ( m_influxConstant * potDiff - m_cumulativeFlux * dPresInfluence_dTime ) / denom; - // compute the b (equation 5.9 of the Eclipse TD) + // compute the b real64 const b = timeConstantInv * m_influxConstant / denom; - // compute the average inflow rate Q (equation 5.7 of the Eclipse TD) + // compute the average inflow rate Q real64 const aquiferVolFlux = areaFraction * ( a - b * ( reservoirPressure - reservoirPressure_n ) ); dAquiferVolFlux_dPres = -areaFraction * b; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp index 1aea8723fd8..4e9337b4368 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp @@ -427,7 +427,7 @@ void CompositionalMultiphaseStatistics::computeRegionStatistics( real64 const ti GEOS_FMT( "{} Phase mass: {} {}", statPrefix, regionStatistics.phaseMass, massUnit ) ); - // metric 1: trapping computed with the Land trapping coefficient (similar to Eclipse) + // metric 1: trapping computed with the Land trapping coefficient GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Statistics, GEOS_FMT( "{} Trapped phase mass (metric 1): {} {}", statPrefix, regionStatistics.trappedPhaseMass, massUnit ) ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp index bc76898511d..362fc17a562 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp @@ -606,7 +606,7 @@ class FluxComputeKernelBase static constexpr real64 secondsToDaysMult = 1.0 / (60 * 60 * 24); - // transmissibility in DARTS is the same as in Eclipse (Metric): + // transmissibility in DARTS is Metric: // T = c * (k * A) / d, where c is Darcy constant, k is permeability [mD], A is area [m2] and d is distance [m] // Darcy constant takes care of unit translation (from SI to Metric), it includes conversion of [s]->[day], [cp->Pa * s], [Pa]->[bar] and // [mD->m2]: diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp index 05de91b1a60..e894ca9b92a 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp @@ -37,7 +37,7 @@ TEST( FieldSpecification, Aquifer ) AquiferBoundaryCondition & aquiferBC = dynamicCast< AquiferBoundaryCondition & >( *fieldSpecificationManager.createChild( "Aquifer", "aquiferBoundaryCondition" ) ); - // set up the aquifer as in the simulation matched against IX + // set up the aquifer auto & aquiferPorosity = aquiferBC.getReference< real64 >( AquiferBoundaryCondition::viewKeyStruct::aquiferPorosityString() ); aquiferPorosity = 2e-1; @@ -89,7 +89,7 @@ TEST( FieldSpecification, Aquifer ) areaFraction, dAquiferVolFlux_dPres ); - // observed flux value in the simulation matched against IX + // observed flux value real64 const refAquiferVolFlux = -0.2043541482797776; ASSERT_NEAR( refAquiferVolFlux, aquiferVolFlux, 1e-10 ); From d7bb7a5967b5ab62c5c18ba043805e50abb0e72a Mon Sep 17 00:00:00 2001 From: Omar Duran Date: Tue, 19 Nov 2024 18:39:25 -0800 Subject: [PATCH 254/286] fix: feature/omarduran/remove darwing clang cmake config file (#3451) * fix: Remove obsolete darwin-clang.cmake * refactor: update PVTPackage hash --------- Co-authored-by: Pavel Tomin --- host-configs/apple/darwin-clang.cmake | 38 ---------------------- scripts/test_submodule_updated.sh | 2 +- src/coreComponents/constitutive/PVTPackage | 2 +- 3 files changed, 2 insertions(+), 40 deletions(-) delete mode 100644 host-configs/apple/darwin-clang.cmake diff --git a/host-configs/apple/darwin-clang.cmake b/host-configs/apple/darwin-clang.cmake deleted file mode 100644 index cdf690c0e5a..00000000000 --- a/host-configs/apple/darwin-clang.cmake +++ /dev/null @@ -1,38 +0,0 @@ -site_name(HOST_NAME) -set(CONFIG_NAME "${HOST_NAME}-darwin-x86_64-clang@apple-mp" CACHE PATH "") -message("CONFIG_NAME = ${CONFIG_NAME}") - -set(CMAKE_C_COMPILER "/usr/bin/clang" CACHE PATH "") -set(CMAKE_CXX_COMPILER "/usr/bin/clang++" CACHE PATH "") -set(ENABLE_FORTRAN OFF CACHE BOOL "" FORCE) - -set(ENABLE_MPI ON CACHE PATH "") -set(MPI_C_COMPILER "/usr/local/bin/mpicc" CACHE PATH "") -set(MPI_CXX_COMPILER "/usr/local/bin/mpicxx" CACHE PATH "") -set(MPIEXEC "/usr/local/bin/mpirun" CACHE PATH "") - -set(ENABLE_GTEST_DEATH_TESTS ON CACHE BOOL "" FORCE) - -set(ENABLE_PVTPackage ON CACHE BOOL "" FORCE) - -set(ENABLE_CUDA "OFF" CACHE PATH "" FORCE) -set(ENABLE_OPENMP "OFF" CACHE PATH "" FORCE) - -set(ENABLE_CALIPER "OFF" CACHE PATH "" FORCE ) - -#set(GEOS_BUILD_OBJ_LIBS ON CACHE BOOL "" FORCE) - -set( BLAS_LIBRARIES /usr/local/opt/openblas/lib/libblas.dylib CACHE PATH "" FORCE ) -set( LAPACK_LIBRARIES /usr/local/opt/openblas/lib/liblapack.dylib CACHE PATH "" FORCE ) - -set(ENABLE_DOXYGEN OFF CACHE BOOL "" FORCE) - -#set( DOXYGEN_EXECUTABLE /usr/local/bin/doxygen CACHE PATH "" FORCE ) -#set( SPHINX_EXECUTABLE /usr/local/bin/sphinx-build CACHE PATH "" FORCE ) - -set(GEOS_TPL_DIR "/usr/local/GEOSX/GEOS_TPL" CACHE PATH "" FORCE ) -if(NOT ( EXISTS "${GEOS_TPL_DIR}" AND IS_DIRECTORY "${GEOS_TPL_DIR}" ) ) - set(GEOS_TPL_DIR "${CMAKE_SOURCE_DIR}/../../thirdPartyLibs/install-darwin-clang-release" CACHE PATH "" FORCE ) -endif() - -include(${CMAKE_CURRENT_LIST_DIR}/tpls.cmake) diff --git a/scripts/test_submodule_updated.sh b/scripts/test_submodule_updated.sh index e2668a41f60..604d95f2f80 100755 --- a/scripts/test_submodule_updated.sh +++ b/scripts/test_submodule_updated.sh @@ -30,7 +30,7 @@ declare -Ar main_branches=( ["LvArray"]="origin/develop" ["integratedTests"]="origin/develop" ["hdf5_interface"]="origin/master" - ["PVTPackage"]="origin/master" + ["PVTPackage"]="origin/develop" ) diff --git a/src/coreComponents/constitutive/PVTPackage b/src/coreComponents/constitutive/PVTPackage index a67739ff53e..3bf1c021569 160000 --- a/src/coreComponents/constitutive/PVTPackage +++ b/src/coreComponents/constitutive/PVTPackage @@ -1 +1 @@ -Subproject commit a67739ff53eed4c391dbd42bc12f960a6b66f8c2 +Subproject commit 3bf1c02156911768f022fc2954939ee1c1c2f66d From d9bdfe715b6eb89674298a50bc43d8b1a3021d86 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 20 Nov 2024 10:31:18 -0600 Subject: [PATCH 255/286] bugfix about norm vector size (#3445) Co-authored-by: Thomas Byer --- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 41415b53c6a..bc923341c91 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -437,10 +437,10 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN // step 3: second reduction across MPI ranks real64 residualNorm = 0.0; + array1d< real64 > globalResidualNorm; + globalResidualNorm.resize( numNorm ); if( m_isThermal ) { - array1d< real64 > globalResidualNorm; - globalResidualNorm.resize( numNorm ); if( normType == physicsSolverBaseKernels::NormType::Linf ) { physicsSolverBaseKernels::LinfResidualNormHelper:: @@ -458,8 +458,6 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN } else { - array1d< real64 > globalResidualNorm; - globalResidualNorm.resize( numNorm - 1 ); if( normType == physicsSolverBaseKernels::NormType::Linf ) { physicsSolverBaseKernels::LinfResidualNormHelper:: @@ -472,11 +470,8 @@ real64 CompositionalMultiphaseFVM::calculateResidualNorm( real64 const & GEOS_UN } residualNorm = sqrt( globalResidualNorm[0] * globalResidualNorm[0] + globalResidualNorm[1] * globalResidualNorm[1] ); - if( getLogLevel() >= 1 && logger::internal::rank == 0 ) - { - std::cout << GEOS_FMT( " ( Rmass Rvol ) = ( {:4.2e} {:4.2e} )", - globalResidualNorm[0], globalResidualNorm[1] ); - } + GEOS_LOG_LEVEL_INFO_RANK_0_NLR( logInfo::Convergence, GEOS_FMT( " ( Rmass Rvol ) = ( {:4.2e} {:4.2e} )", + globalResidualNorm[0], globalResidualNorm[1] ) ); } return residualNorm; From d99fb8ef66936a5fda41ce2f4a3366399c0a5fea Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Wed, 20 Nov 2024 17:06:39 -0800 Subject: [PATCH 256/286] feat: Add Lagrange contact solver with bubble stabilization (stick only) (#3440) * feat: Add Lagrange contact solver with bubble stabilization (stick only) * add curvecheck * Update .integrated_tests.yaml --------- Co-authored-by: Pavel Tomin --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + ...grangeContactBubbleStab_FixedSlip_base.xml | 132 + ...rangeContactBubbleStab_FixedSlip_smoke.xml | 94 + ...tBubbleStab_singleFracCompression_base.xml | 137 + ...BubbleStab_singleFracCompression_smoke.xml | 66 + .../contactMechanics.ats | 22 +- .../dataTables/gaussianSlip.csv | 10000 ++++++++++++++++ .../dataTables/singularCrackSlip.csv | 10000 ++++++++++++++++ .../dataTables/x.csv | 10000 ++++++++++++++++ .../dataTables/y.csv | 1 + .../dataTables/z.csv | 1 + .../scripts/fixedFaultSlip.py | 213 + .../constitutive/ConstitutivePassThru.hpp | 18 + .../constitutive/contact/CoulombFriction.hpp | 16 +- .../constitutive/contact/FrictionBase.hpp | 6 +- .../constitutive/contact/FrictionSelector.hpp | 7 +- .../physicsSolvers/contact/CMakeLists.txt | 22 +- .../physicsSolvers/contact/ContactFields.hpp | 16 + .../contact/ContactSolverBase.cpp | 4 +- ...lidMechanicsAugmentedLagrangianContact.cpp | 76 +- .../SolidMechanicsEmbeddedFractures.cpp | 6 +- .../contact/SolidMechanicsLagrangeContact.cpp | 6 +- ...olidMechanicsLagrangeContactBubbleStab.cpp | 1180 ++ ...olidMechanicsLagrangeContactBubbleStab.hpp | 240 + .../SolidMechanicsALMKernels.hpp | 69 +- .../kernels/SolidMechanicsALMKernelsBase.hpp | 173 + .../SolidMechanicsALMSimultaneousKernels.hpp | 59 +- ...MechanicsConformingContactKernelsBase.hpp} | 249 +- ...chanicsConformingContactKernelsHelper.hpp} | 12 +- ...olidMechanicsContactFaceBubbleKernels.hpp} | 64 +- ...echanicsDisplacementJumpUpdateKernels.hpp} | 115 +- .../SolidMechanicsEFEMJumpUpdateKernels.hpp | 6 +- .../SolidMechanicsEFEMKernels.hpp | 6 +- .../SolidMechanicsEFEMKernelsBase.hpp | 6 +- .../SolidMechanicsEFEMKernelsHelper.hpp | 6 +- ...MechanicsEFEMStaticCondensationKernels.hpp | 6 +- .../SolidMechanicsLagrangeContactKernels.hpp | 438 + ...glePhasePoromechanicsEmbeddedFractures.cpp | 2 +- .../SinglePhasePoromechanicsEFEM_impl.hpp | 2 +- 40 files changed, 33063 insertions(+), 419 deletions(-) create mode 100644 inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_base.xml create mode 100644 inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_smoke.xml create mode 100644 inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_base.xml create mode 100644 inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_smoke.xml create mode 100644 inputFiles/lagrangianContactMechanics/dataTables/gaussianSlip.csv create mode 100644 inputFiles/lagrangianContactMechanics/dataTables/singularCrackSlip.csv create mode 100644 inputFiles/lagrangianContactMechanics/dataTables/x.csv create mode 100644 inputFiles/lagrangianContactMechanics/dataTables/y.csv create mode 100644 inputFiles/lagrangianContactMechanics/dataTables/z.csv create mode 100644 inputFiles/lagrangianContactMechanics/scripts/fixedFaultSlip.py create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp create mode 100644 src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.hpp rename src/coreComponents/physicsSolvers/contact/{ => kernels}/SolidMechanicsALMKernels.hpp (88%) create mode 100644 src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernelsBase.hpp rename src/coreComponents/physicsSolvers/contact/{ => kernels}/SolidMechanicsALMSimultaneousKernels.hpp (87%) rename src/coreComponents/physicsSolvers/contact/{SolidMechanicsALMKernelsBase.hpp => kernels/SolidMechanicsConformingContactKernelsBase.hpp} (52%) rename src/coreComponents/physicsSolvers/contact/{SolidMechanicsALMKernelsHelper.hpp => kernels/SolidMechanicsConformingContactKernelsHelper.hpp} (82%) rename src/coreComponents/physicsSolvers/contact/{SolidMechanicsALMBubbleKernels.hpp => kernels/SolidMechanicsContactFaceBubbleKernels.hpp} (85%) rename src/coreComponents/physicsSolvers/contact/{SolidMechanicsALMJumpUpdateKernels.hpp => kernels/SolidMechanicsDisplacementJumpUpdateKernels.hpp} (71%) rename src/coreComponents/physicsSolvers/contact/{ => kernels}/SolidMechanicsEFEMJumpUpdateKernels.hpp (97%) rename src/coreComponents/physicsSolvers/contact/{ => kernels}/SolidMechanicsEFEMKernels.hpp (98%) rename src/coreComponents/physicsSolvers/contact/{ => kernels}/SolidMechanicsEFEMKernelsBase.hpp (98%) rename src/coreComponents/physicsSolvers/contact/{ => kernels}/SolidMechanicsEFEMKernelsHelper.hpp (94%) rename src/coreComponents/physicsSolvers/contact/{ => kernels}/SolidMechanicsEFEMStaticCondensationKernels.hpp (97%) create mode 100644 src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsLagrangeContactKernels.hpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 00502a919e4..55c31ad3c7a 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3339-8707-7c55c70 + baseline: integratedTests/baseline_integratedTests-pr3440-8913-0e506ec allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index f4dcac6a76e..abedd2d24dc 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 ##3440 (2024-11-18) +===================== +Added Lagrange multiplier with bubble functions stabilization (sli only) and possibility to specify a slip. + PR #3339 (2024-11-14) ===================== Hypre improvements, rebaseline is due to field value change (amgNumFunctions). diff --git a/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_base.xml b/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_base.xml new file mode 100644 index 00000000000..91a143df5b2 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_base.xml @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_smoke.xml b/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_smoke.xml new file mode 100644 index 00000000000..8258d2cc4a3 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_smoke.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_base.xml b/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_base.xml new file mode 100644 index 00000000000..09ec110a624 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_base.xml @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_smoke.xml b/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_smoke.xml new file mode 100644 index 00000000000..bb51f950d38 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_smoke.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/lagrangianContactMechanics/contactMechanics.ats b/inputFiles/lagrangianContactMechanics/contactMechanics.ats index bc4a2e43d0e..6f35259f76c 100644 --- a/inputFiles/lagrangianContactMechanics/contactMechanics.ats +++ b/inputFiles/lagrangianContactMechanics/contactMechanics.ats @@ -1,9 +1,19 @@ -from geos.ats.test_builder import TestDeck, RestartcheckParameters, generate_geos_tests +from geos.ats.test_builder import TestDeck, RestartcheckParameters, CurveCheckParameters, generate_geos_tests restartcheck_params = {} restartcheck_params["atol"] = 2.0E-4 restartcheck_params["rtol"] = 1.0E-7 + +curvecheck_params = {} +curvecheck_params["filename"] = "traction.hdf5" +curvecheck_params["tolerance"] = [1e-1] +curvecheck_params["script_instructions"] = [[ + "./scripts/fixedFaultSlip.py", "curve_check_solution", + "traction" +]] +curvecheck_params["curves"] = "traction" + decks = [ TestDeck( name="ContactMechanics_SimpleCubes_smoke", @@ -90,7 +100,15 @@ decks = [ partitions=((1, 1, 1), ), restart_step=1, check_step=2, - restartcheck_params=RestartcheckParameters(**restartcheck_params)) + restartcheck_params=RestartcheckParameters(**restartcheck_params)), + TestDeck( + name="LagrangeContactBubbleStab_FixedSlip_smoke", + description="Lagrange multiplier with bubble stab and fixed jump on the fault. " + "Fault with imposed slip", + partitions=((1, 1, 1), (2, 2, 1)), + restart_step=1, + check_step=2, + restartcheck_params=RestartcheckParameters(**restartcheck_params)) ] generate_geos_tests(decks) diff --git a/inputFiles/lagrangianContactMechanics/dataTables/gaussianSlip.csv b/inputFiles/lagrangianContactMechanics/dataTables/gaussianSlip.csv new file mode 100644 index 00000000000..9d62405dcb4 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/dataTables/gaussianSlip.csv @@ -0,0 +1,10000 @@ +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000006 +0.000006 +0.000006 +0.000006 +0.000006 +0.000006 +0.000006 +0.000006 +0.000006 +0.000007 +0.000007 +0.000007 +0.000007 +0.000007 +0.000007 +0.000007 +0.000008 +0.000008 +0.000008 +0.000008 +0.000008 +0.000008 +0.000008 +0.000009 +0.000009 +0.000009 +0.000009 +0.000009 +0.000010 +0.000010 +0.000010 +0.000010 +0.000010 +0.000010 +0.000011 +0.000011 +0.000011 +0.000011 +0.000011 +0.000012 +0.000012 +0.000012 +0.000012 +0.000013 +0.000013 +0.000013 +0.000013 +0.000014 +0.000014 +0.000014 +0.000014 +0.000015 +0.000015 +0.000015 +0.000016 +0.000016 +0.000016 +0.000016 +0.000017 +0.000017 +0.000017 +0.000018 +0.000018 +0.000018 +0.000019 +0.000019 +0.000019 +0.000020 +0.000020 +0.000021 +0.000021 +0.000021 +0.000022 +0.000022 +0.000023 +0.000023 +0.000023 +0.000024 +0.000024 +0.000025 +0.000025 +0.000026 +0.000026 +0.000027 +0.000027 +0.000028 +0.000028 +0.000029 +0.000029 +0.000030 +0.000030 +0.000031 +0.000031 +0.000032 +0.000033 +0.000033 +0.000034 +0.000034 +0.000035 +0.000036 +0.000036 +0.000037 +0.000038 +0.000038 +0.000039 +0.000040 +0.000040 +0.000041 +0.000042 +0.000043 +0.000043 +0.000044 +0.000045 +0.000046 +0.000047 +0.000048 +0.000048 +0.000049 +0.000050 +0.000051 +0.000052 +0.000053 +0.000054 +0.000055 +0.000056 +0.000057 +0.000058 +0.000059 +0.000060 +0.000061 +0.000062 +0.000063 +0.000064 +0.000065 +0.000067 +0.000068 +0.000069 +0.000070 +0.000071 +0.000073 +0.000074 +0.000075 +0.000077 +0.000078 +0.000079 +0.000081 +0.000082 +0.000084 +0.000085 +0.000087 +0.000088 +0.000090 +0.000091 +0.000093 +0.000094 +0.000096 +0.000098 +0.000099 +0.000101 +0.000103 +0.000105 +0.000107 +0.000108 +0.000110 +0.000112 +0.000114 +0.000116 +0.000118 +0.000120 +0.000122 +0.000124 +0.000126 +0.000129 +0.000131 +0.000133 +0.000135 +0.000138 +0.000140 +0.000142 +0.000145 +0.000147 +0.000150 +0.000152 +0.000155 +0.000158 +0.000160 +0.000163 +0.000166 +0.000169 +0.000172 +0.000174 +0.000177 +0.000180 +0.000183 +0.000187 +0.000190 +0.000193 +0.000196 +0.000199 +0.000203 +0.000206 +0.000210 +0.000213 +0.000217 +0.000220 +0.000224 +0.000228 +0.000232 +0.000235 +0.000239 +0.000243 +0.000247 +0.000252 +0.000256 +0.000260 +0.000264 +0.000269 +0.000273 +0.000278 +0.000282 +0.000287 +0.000292 +0.000296 +0.000301 +0.000306 +0.000311 +0.000316 +0.000321 +0.000327 +0.000332 +0.000338 +0.000343 +0.000349 +0.000354 +0.000360 +0.000366 +0.000372 +0.000378 +0.000384 +0.000390 +0.000397 +0.000403 +0.000410 +0.000416 +0.000423 +0.000430 +0.000437 +0.000444 +0.000451 +0.000458 +0.000465 +0.000473 +0.000481 +0.000488 +0.000496 +0.000504 +0.000512 +0.000520 +0.000529 +0.000537 +0.000545 +0.000554 +0.000563 +0.000572 +0.000581 +0.000590 +0.000599 +0.000609 +0.000619 +0.000628 +0.000638 +0.000648 +0.000659 +0.000669 +0.000679 +0.000690 +0.000701 +0.000712 +0.000723 +0.000734 +0.000746 +0.000757 +0.000769 +0.000781 +0.000793 +0.000806 +0.000818 +0.000831 +0.000844 +0.000857 +0.000870 +0.000884 +0.000897 +0.000911 +0.000925 +0.000939 +0.000954 +0.000968 +0.000983 +0.000998 +0.001014 +0.001029 +0.001045 +0.001061 +0.001077 +0.001094 +0.001110 +0.001127 +0.001144 +0.001162 +0.001179 +0.001197 +0.001215 +0.001234 +0.001252 +0.001271 +0.001290 +0.001310 +0.001330 +0.001350 +0.001370 +0.001390 +0.001411 +0.001432 +0.001454 +0.001476 +0.001498 +0.001520 +0.001543 +0.001566 +0.001589 +0.001613 +0.001637 +0.001661 +0.001686 +0.001711 +0.001736 +0.001761 +0.001788 +0.001814 +0.001841 +0.001868 +0.001895 +0.001923 +0.001951 +0.001980 +0.002009 +0.002038 +0.002068 +0.002098 +0.002129 +0.002160 +0.002191 +0.002223 +0.002256 +0.002288 +0.002322 +0.002355 +0.002389 +0.002424 +0.002459 +0.002494 +0.002530 +0.002567 +0.002604 +0.002641 +0.002679 +0.002717 +0.002756 +0.002796 +0.002836 +0.002876 +0.002917 +0.002959 +0.003001 +0.003044 +0.003087 +0.003131 +0.003175 +0.003220 +0.003266 +0.003312 +0.003359 +0.003406 +0.003454 +0.003503 +0.003552 +0.003602 +0.003652 +0.003704 +0.003756 +0.003808 +0.003861 +0.003915 +0.003970 +0.004025 +0.004081 +0.004138 +0.004195 +0.004254 +0.004313 +0.004372 +0.004433 +0.004494 +0.004556 +0.004619 +0.004682 +0.004747 +0.004812 +0.004878 +0.004945 +0.005013 +0.005081 +0.005151 +0.005221 +0.005292 +0.005364 +0.005437 +0.005511 +0.005586 +0.005662 +0.005739 +0.005816 +0.005895 +0.005975 +0.006055 +0.006137 +0.006220 +0.006303 +0.006388 +0.006474 +0.006560 +0.006648 +0.006737 +0.006827 +0.006918 +0.007011 +0.007104 +0.007198 +0.007294 +0.007391 +0.007489 +0.007588 +0.007688 +0.007790 +0.007893 +0.007997 +0.008102 +0.008209 +0.008317 +0.008426 +0.008536 +0.008648 +0.008761 +0.008876 +0.008992 +0.009109 +0.009227 +0.009348 +0.009469 +0.009592 +0.009716 +0.009842 +0.009969 +0.010098 +0.010229 +0.010360 +0.010494 +0.010629 +0.010765 +0.010904 +0.011043 +0.011185 +0.011328 +0.011473 +0.011619 +0.011767 +0.011917 +0.012068 +0.012222 +0.012377 +0.012534 +0.012692 +0.012853 +0.013015 +0.013179 +0.013345 +0.013513 +0.013683 +0.013855 +0.014029 +0.014204 +0.014382 +0.014562 +0.014744 +0.014927 +0.015113 +0.015301 +0.015491 +0.015684 +0.015878 +0.016074 +0.016273 +0.016474 +0.016677 +0.016883 +0.017091 +0.017301 +0.017513 +0.017728 +0.017945 +0.018165 +0.018387 +0.018611 +0.018838 +0.019067 +0.019299 +0.019533 +0.019770 +0.020010 +0.020252 +0.020497 +0.020744 +0.020995 +0.021247 +0.021503 +0.021761 +0.022022 +0.022286 +0.022553 +0.022823 +0.023095 +0.023371 +0.023649 +0.023930 +0.024215 +0.024502 +0.024793 +0.025086 +0.025383 +0.025682 +0.025985 +0.026291 +0.026601 +0.026913 +0.027229 +0.027548 +0.027871 +0.028197 +0.028526 +0.028859 +0.029195 +0.029534 +0.029878 +0.030224 +0.030575 +0.030929 +0.031286 +0.031647 +0.032012 +0.032381 +0.032753 +0.033130 +0.033510 +0.033894 +0.034282 +0.034673 +0.035069 +0.035469 +0.035873 +0.036281 +0.036693 +0.037109 +0.037529 +0.037954 +0.038382 +0.038815 +0.039253 +0.039694 +0.040141 +0.040591 +0.041046 +0.041506 +0.041970 +0.042438 +0.042912 +0.043389 +0.043872 +0.044359 +0.044851 +0.045348 +0.045850 +0.046357 +0.046868 +0.047384 +0.047906 +0.048432 +0.048964 +0.049501 +0.050043 +0.050590 +0.051142 +0.051700 +0.052262 +0.052831 +0.053404 +0.053983 +0.054568 +0.055158 +0.055754 +0.056355 +0.056962 +0.057575 +0.058193 +0.058818 +0.059448 +0.060084 +0.060726 +0.061374 +0.062027 +0.062687 +0.063353 +0.064026 +0.064704 +0.065389 +0.066080 +0.066777 +0.067480 +0.068191 +0.068907 +0.069630 +0.070360 +0.071096 +0.071839 +0.072589 +0.073345 +0.074108 +0.074878 +0.075655 +0.076439 +0.077230 +0.078028 +0.078833 +0.079646 +0.080465 +0.081292 +0.082126 +0.082967 +0.083816 +0.084672 +0.085536 +0.086407 +0.087286 +0.088173 +0.089067 +0.089969 +0.090879 +0.091797 +0.092723 +0.093656 +0.094598 +0.095548 +0.096506 +0.097472 +0.098446 +0.099429 +0.100420 +0.101420 +0.102428 +0.103444 +0.104469 +0.105503 +0.106545 +0.107596 +0.108656 +0.109725 +0.110803 +0.111889 +0.112985 +0.114090 +0.115204 +0.116327 +0.117459 +0.118601 +0.119752 +0.120912 +0.122082 +0.123261 +0.124450 +0.125649 +0.126858 +0.128076 +0.129304 +0.130542 +0.131789 +0.133047 +0.134315 +0.135593 +0.136881 +0.138180 +0.139488 +0.140808 +0.142137 +0.143477 +0.144828 +0.146189 +0.147561 +0.148943 +0.150336 +0.151740 +0.153155 +0.154581 +0.156018 +0.157467 +0.158926 +0.160396 +0.161878 +0.163371 +0.164875 +0.166391 +0.167919 +0.169458 +0.171008 +0.172570 +0.174144 +0.175730 +0.177328 +0.178938 +0.180559 +0.182193 +0.183839 +0.185497 +0.187167 +0.188850 +0.190545 +0.192252 +0.193972 +0.195704 +0.197449 +0.199207 +0.200978 +0.202761 +0.204557 +0.206366 +0.208188 +0.210023 +0.211872 +0.213733 +0.215608 +0.217495 +0.219397 +0.221311 +0.223240 +0.225181 +0.227137 +0.229106 +0.231089 +0.233085 +0.235095 +0.237120 +0.239158 +0.241210 +0.243277 +0.245357 +0.247452 +0.249561 +0.251684 +0.253822 +0.255974 +0.258141 +0.260322 +0.262518 +0.264729 +0.266954 +0.269195 +0.271450 +0.273720 +0.276005 +0.278305 +0.280620 +0.282951 +0.285296 +0.287657 +0.290033 +0.292425 +0.294832 +0.297254 +0.299693 +0.302146 +0.304616 +0.307101 +0.309602 +0.312119 +0.314652 +0.317201 +0.319765 +0.322346 +0.324943 +0.327556 +0.330186 +0.332832 +0.335494 +0.338172 +0.340867 +0.343578 +0.346306 +0.349051 +0.351812 +0.354590 +0.357385 +0.360197 +0.363025 +0.365870 +0.368733 +0.371612 +0.374508 +0.377422 +0.380353 +0.383301 +0.386266 +0.389248 +0.392248 +0.395265 +0.398300 +0.401352 +0.404422 +0.407509 +0.410614 +0.413737 +0.416877 +0.420036 +0.423212 +0.426405 +0.429617 +0.432847 +0.436094 +0.439360 +0.442643 +0.445945 +0.449265 +0.452603 +0.455959 +0.459334 +0.462727 +0.466138 +0.469567 +0.473015 +0.476481 +0.479966 +0.483469 +0.486991 +0.490531 +0.494090 +0.497668 +0.501264 +0.504879 +0.508513 +0.512165 +0.515836 +0.519526 +0.523235 +0.526962 +0.530709 +0.534474 +0.538259 +0.542062 +0.545884 +0.549726 +0.553586 +0.557465 +0.561364 +0.565281 +0.569218 +0.573174 +0.577148 +0.581143 +0.585156 +0.589188 +0.593240 +0.597311 +0.601401 +0.605510 +0.609639 +0.613787 +0.617954 +0.622140 +0.626346 +0.630571 +0.634816 +0.639080 +0.643363 +0.647665 +0.651987 +0.656328 +0.660689 +0.665069 +0.669468 +0.673886 +0.678324 +0.682781 +0.687258 +0.691754 +0.696269 +0.700804 +0.705358 +0.709931 +0.714524 +0.719136 +0.723767 +0.728418 +0.733088 +0.737777 +0.742485 +0.747213 +0.751960 +0.756726 +0.761511 +0.766315 +0.771139 +0.775982 +0.780844 +0.785725 +0.790625 +0.795544 +0.800482 +0.805439 +0.810415 +0.815410 +0.820424 +0.825457 +0.830509 +0.835580 +0.840669 +0.845777 +0.850904 +0.856050 +0.861214 +0.866397 +0.871598 +0.876818 +0.882057 +0.887314 +0.892589 +0.897883 +0.903195 +0.908526 +0.913875 +0.919242 +0.924627 +0.930030 +0.935451 +0.940890 +0.946347 +0.951822 +0.957315 +0.962826 +0.968354 +0.973900 +0.979464 +0.985045 +0.990644 +0.996260 +1.001893 +1.007544 +1.013212 +1.018897 +1.024599 +1.030319 +1.036055 +1.041808 +1.047578 +1.053364 +1.059167 +1.064987 +1.070823 +1.076676 +1.082545 +1.088430 +1.094332 +1.100249 +1.106183 +1.112132 +1.118098 +1.124079 +1.130075 +1.136087 +1.142115 +1.148158 +1.154217 +1.160290 +1.166379 +1.172483 +1.178601 +1.184735 +1.190883 +1.197045 +1.203223 +1.209414 +1.215620 +1.221840 +1.228074 +1.234322 +1.240584 +1.246860 +1.253149 +1.259452 +1.265768 +1.272097 +1.278440 +1.284796 +1.291164 +1.297546 +1.303940 +1.310347 +1.316766 +1.323197 +1.329641 +1.336097 +1.342564 +1.349044 +1.355535 +1.362037 +1.368551 +1.375077 +1.381613 +1.388161 +1.394719 +1.401288 +1.407868 +1.414458 +1.421058 +1.427669 +1.434289 +1.440919 +1.447560 +1.454209 +1.460868 +1.467537 +1.474214 +1.480901 +1.487596 +1.494300 +1.501013 +1.507734 +1.514463 +1.521200 +1.527945 +1.534697 +1.541458 +1.548225 +1.555000 +1.561782 +1.568571 +1.575366 +1.582169 +1.588977 +1.595792 +1.602613 +1.609439 +1.616272 +1.623110 +1.629953 +1.636801 +1.643655 +1.650513 +1.657376 +1.664244 +1.671115 +1.677991 +1.684871 +1.691755 +1.698642 +1.705532 +1.712426 +1.719323 +1.726222 +1.733124 +1.740029 +1.746936 +1.753845 +1.760755 +1.767668 +1.774582 +1.781497 +1.788413 +1.795330 +1.802248 +1.809167 +1.816085 +1.823004 +1.829923 +1.836841 +1.843759 +1.850676 +1.857592 +1.864508 +1.871421 +1.878334 +1.885244 +1.892153 +1.899059 +1.905964 +1.912865 +1.919764 +1.926660 +1.933553 +1.940442 +1.947328 +1.954210 +1.961087 +1.967961 +1.974830 +1.981695 +1.988554 +1.995409 +2.002258 +2.009101 +2.015939 +2.022771 +2.029597 +2.036416 +2.043229 +2.050034 +2.056833 +2.063624 +2.070408 +2.077185 +2.083953 +2.090713 +2.097465 +2.104208 +2.110942 +2.117667 +2.124383 +2.131089 +2.137786 +2.144472 +2.151149 +2.157815 +2.164470 +2.171115 +2.177748 +2.184370 +2.190981 +2.197580 +2.204166 +2.210741 +2.217303 +2.223853 +2.230389 +2.236913 +2.243423 +2.249919 +2.256402 +2.262871 +2.269325 +2.275765 +2.282190 +2.288600 +2.294996 +2.301375 +2.307739 +2.314087 +2.320419 +2.326735 +2.333034 +2.339317 +2.345582 +2.351831 +2.358061 +2.364274 +2.370470 +2.376647 +2.382805 +2.388946 +2.395067 +2.401169 +2.407252 +2.413316 +2.419360 +2.425384 +2.431387 +2.437371 +2.443334 +2.449276 +2.455197 +2.461096 +2.466974 +2.472831 +2.478665 +2.484478 +2.490268 +2.496035 +2.501780 +2.507501 +2.513200 +2.518874 +2.524525 +2.530153 +2.535756 +2.541335 +2.546889 +2.552418 +2.557923 +2.563402 +2.568856 +2.574284 +2.579687 +2.585063 +2.590413 +2.595737 +2.601034 +2.606304 +2.611547 +2.616763 +2.621951 +2.627112 +2.632245 +2.637349 +2.642426 +2.647473 +2.652493 +2.657483 +2.662444 +2.667376 +2.672278 +2.677150 +2.681993 +2.686806 +2.691588 +2.696340 +2.701061 +2.705751 +2.710411 +2.715039 +2.719635 +2.724200 +2.728734 +2.733235 +2.737704 +2.742141 +2.746545 +2.750917 +2.755255 +2.759561 +2.763833 +2.768072 +2.772278 +2.776449 +2.780587 +2.784691 +2.788760 +2.792795 +2.796795 +2.800761 +2.804692 +2.808587 +2.812447 +2.816272 +2.820062 +2.823815 +2.827533 +2.831215 +2.834860 +2.838469 +2.842042 +2.845578 +2.849077 +2.852539 +2.855964 +2.859352 +2.862703 +2.866016 +2.869291 +2.872529 +2.875729 +2.878890 +2.882014 +2.885099 +2.888146 +2.891154 +2.894123 +2.897053 +2.899945 +2.902798 +2.905611 +2.908385 +2.911119 +2.913814 +2.916470 +2.919085 +2.921661 +2.924196 +2.926692 +2.929147 +2.931562 +2.933936 +2.936270 +2.938564 +2.940816 +2.943028 +2.945199 +2.947329 +2.949418 +2.951465 +2.953472 +2.955436 +2.957360 +2.959242 +2.961082 +2.962881 +2.964638 +2.966353 +2.968026 +2.969657 +2.971246 +2.972793 +2.974298 +2.975760 +2.977180 +2.978558 +2.979893 +2.981186 +2.982436 +2.983644 +2.984809 +2.985931 +2.987010 +2.988047 +2.989041 +2.989992 +2.990900 +2.991765 +2.992587 +2.993366 +2.994101 +2.994794 +2.995444 +2.996050 +2.996613 +2.997133 +2.997610 +2.998043 +2.998434 +2.998780 +2.999084 +2.999344 +2.999561 +2.999734 +2.999864 +2.999951 +2.999995 +2.999995 +2.999951 +2.999864 +2.999734 +2.999561 +2.999344 +2.999084 +2.998780 +2.998434 +2.998043 +2.997610 +2.997133 +2.996613 +2.996050 +2.995444 +2.994794 +2.994101 +2.993366 +2.992587 +2.991765 +2.990900 +2.989992 +2.989041 +2.988047 +2.987010 +2.985931 +2.984809 +2.983644 +2.982436 +2.981186 +2.979893 +2.978558 +2.977180 +2.975760 +2.974298 +2.972793 +2.971246 +2.969657 +2.968026 +2.966353 +2.964638 +2.962881 +2.961082 +2.959242 +2.957360 +2.955436 +2.953472 +2.951465 +2.949418 +2.947329 +2.945199 +2.943028 +2.940816 +2.938564 +2.936270 +2.933936 +2.931562 +2.929147 +2.926692 +2.924196 +2.921661 +2.919085 +2.916470 +2.913814 +2.911119 +2.908385 +2.905611 +2.902798 +2.899945 +2.897053 +2.894123 +2.891154 +2.888146 +2.885099 +2.882014 +2.878890 +2.875729 +2.872529 +2.869291 +2.866016 +2.862703 +2.859352 +2.855964 +2.852539 +2.849077 +2.845578 +2.842042 +2.838469 +2.834860 +2.831215 +2.827533 +2.823815 +2.820062 +2.816272 +2.812447 +2.808587 +2.804692 +2.800761 +2.796795 +2.792795 +2.788760 +2.784691 +2.780587 +2.776449 +2.772278 +2.768072 +2.763833 +2.759561 +2.755255 +2.750917 +2.746545 +2.742141 +2.737704 +2.733235 +2.728734 +2.724200 +2.719635 +2.715039 +2.710411 +2.705751 +2.701061 +2.696340 +2.691588 +2.686806 +2.681993 +2.677150 +2.672278 +2.667376 +2.662444 +2.657483 +2.652493 +2.647473 +2.642426 +2.637349 +2.632245 +2.627112 +2.621951 +2.616763 +2.611547 +2.606304 +2.601034 +2.595737 +2.590413 +2.585063 +2.579687 +2.574284 +2.568856 +2.563402 +2.557923 +2.552418 +2.546889 +2.541335 +2.535756 +2.530153 +2.524525 +2.518874 +2.513200 +2.507501 +2.501780 +2.496035 +2.490268 +2.484478 +2.478665 +2.472831 +2.466974 +2.461096 +2.455197 +2.449276 +2.443334 +2.437371 +2.431387 +2.425384 +2.419360 +2.413316 +2.407252 +2.401169 +2.395067 +2.388946 +2.382805 +2.376647 +2.370470 +2.364274 +2.358061 +2.351831 +2.345582 +2.339317 +2.333034 +2.326735 +2.320419 +2.314087 +2.307739 +2.301375 +2.294996 +2.288600 +2.282190 +2.275765 +2.269325 +2.262871 +2.256402 +2.249919 +2.243423 +2.236913 +2.230389 +2.223853 +2.217303 +2.210741 +2.204166 +2.197580 +2.190981 +2.184370 +2.177748 +2.171115 +2.164470 +2.157815 +2.151149 +2.144472 +2.137786 +2.131089 +2.124383 +2.117667 +2.110942 +2.104208 +2.097465 +2.090713 +2.083953 +2.077185 +2.070408 +2.063624 +2.056833 +2.050034 +2.043229 +2.036416 +2.029597 +2.022771 +2.015939 +2.009101 +2.002258 +1.995409 +1.988554 +1.981695 +1.974830 +1.967961 +1.961087 +1.954210 +1.947328 +1.940442 +1.933553 +1.926660 +1.919764 +1.912865 +1.905964 +1.899059 +1.892153 +1.885244 +1.878334 +1.871421 +1.864508 +1.857592 +1.850676 +1.843759 +1.836841 +1.829923 +1.823004 +1.816085 +1.809167 +1.802248 +1.795330 +1.788413 +1.781497 +1.774582 +1.767668 +1.760755 +1.753845 +1.746936 +1.740029 +1.733124 +1.726222 +1.719323 +1.712426 +1.705532 +1.698642 +1.691755 +1.684871 +1.677991 +1.671115 +1.664244 +1.657376 +1.650513 +1.643655 +1.636801 +1.629953 +1.623110 +1.616272 +1.609439 +1.602613 +1.595792 +1.588977 +1.582169 +1.575366 +1.568571 +1.561782 +1.555000 +1.548225 +1.541458 +1.534697 +1.527945 +1.521200 +1.514463 +1.507734 +1.501013 +1.494300 +1.487596 +1.480901 +1.474214 +1.467537 +1.460868 +1.454209 +1.447560 +1.440919 +1.434289 +1.427669 +1.421058 +1.414458 +1.407868 +1.401288 +1.394719 +1.388161 +1.381613 +1.375077 +1.368551 +1.362037 +1.355535 +1.349044 +1.342564 +1.336097 +1.329641 +1.323197 +1.316766 +1.310347 +1.303940 +1.297546 +1.291164 +1.284796 +1.278440 +1.272097 +1.265768 +1.259452 +1.253149 +1.246860 +1.240584 +1.234322 +1.228074 +1.221840 +1.215620 +1.209414 +1.203223 +1.197045 +1.190883 +1.184735 +1.178601 +1.172483 +1.166379 +1.160290 +1.154217 +1.148158 +1.142115 +1.136087 +1.130075 +1.124079 +1.118098 +1.112132 +1.106183 +1.100249 +1.094332 +1.088430 +1.082545 +1.076676 +1.070823 +1.064987 +1.059167 +1.053364 +1.047578 +1.041808 +1.036055 +1.030319 +1.024599 +1.018897 +1.013212 +1.007544 +1.001893 +0.996260 +0.990644 +0.985045 +0.979464 +0.973900 +0.968354 +0.962826 +0.957315 +0.951822 +0.946347 +0.940890 +0.935451 +0.930030 +0.924627 +0.919242 +0.913875 +0.908526 +0.903195 +0.897883 +0.892589 +0.887314 +0.882057 +0.876818 +0.871598 +0.866397 +0.861214 +0.856050 +0.850904 +0.845777 +0.840669 +0.835580 +0.830509 +0.825457 +0.820424 +0.815410 +0.810415 +0.805439 +0.800482 +0.795544 +0.790625 +0.785725 +0.780844 +0.775982 +0.771139 +0.766315 +0.761511 +0.756726 +0.751960 +0.747213 +0.742485 +0.737777 +0.733088 +0.728418 +0.723767 +0.719136 +0.714524 +0.709931 +0.705358 +0.700804 +0.696269 +0.691754 +0.687258 +0.682781 +0.678324 +0.673886 +0.669468 +0.665069 +0.660689 +0.656328 +0.651987 +0.647665 +0.643363 +0.639080 +0.634816 +0.630571 +0.626346 +0.622140 +0.617954 +0.613787 +0.609639 +0.605510 +0.601401 +0.597311 +0.593240 +0.589188 +0.585156 +0.581143 +0.577148 +0.573174 +0.569218 +0.565281 +0.561364 +0.557465 +0.553586 +0.549726 +0.545884 +0.542062 +0.538259 +0.534474 +0.530709 +0.526962 +0.523235 +0.519526 +0.515836 +0.512165 +0.508513 +0.504879 +0.501264 +0.497668 +0.494090 +0.490531 +0.486991 +0.483469 +0.479966 +0.476481 +0.473015 +0.469567 +0.466138 +0.462727 +0.459334 +0.455959 +0.452603 +0.449265 +0.445945 +0.442643 +0.439360 +0.436094 +0.432847 +0.429617 +0.426405 +0.423212 +0.420036 +0.416877 +0.413737 +0.410614 +0.407509 +0.404422 +0.401352 +0.398300 +0.395265 +0.392248 +0.389248 +0.386266 +0.383301 +0.380353 +0.377422 +0.374508 +0.371612 +0.368733 +0.365870 +0.363025 +0.360197 +0.357385 +0.354590 +0.351812 +0.349051 +0.346306 +0.343578 +0.340867 +0.338172 +0.335494 +0.332832 +0.330186 +0.327556 +0.324943 +0.322346 +0.319765 +0.317201 +0.314652 +0.312119 +0.309602 +0.307101 +0.304616 +0.302146 +0.299693 +0.297254 +0.294832 +0.292425 +0.290033 +0.287657 +0.285296 +0.282951 +0.280620 +0.278305 +0.276005 +0.273720 +0.271450 +0.269195 +0.266954 +0.264729 +0.262518 +0.260322 +0.258141 +0.255974 +0.253822 +0.251684 +0.249561 +0.247452 +0.245357 +0.243277 +0.241210 +0.239158 +0.237120 +0.235095 +0.233085 +0.231089 +0.229106 +0.227137 +0.225181 +0.223240 +0.221311 +0.219397 +0.217495 +0.215608 +0.213733 +0.211872 +0.210023 +0.208188 +0.206366 +0.204557 +0.202761 +0.200978 +0.199207 +0.197449 +0.195704 +0.193972 +0.192252 +0.190545 +0.188850 +0.187167 +0.185497 +0.183839 +0.182193 +0.180559 +0.178938 +0.177328 +0.175730 +0.174144 +0.172570 +0.171008 +0.169458 +0.167919 +0.166391 +0.164875 +0.163371 +0.161878 +0.160396 +0.158926 +0.157467 +0.156018 +0.154581 +0.153155 +0.151740 +0.150336 +0.148943 +0.147561 +0.146189 +0.144828 +0.143477 +0.142137 +0.140808 +0.139488 +0.138180 +0.136881 +0.135593 +0.134315 +0.133047 +0.131789 +0.130542 +0.129304 +0.128076 +0.126858 +0.125649 +0.124450 +0.123261 +0.122082 +0.120912 +0.119752 +0.118601 +0.117459 +0.116327 +0.115204 +0.114090 +0.112985 +0.111889 +0.110803 +0.109725 +0.108656 +0.107596 +0.106545 +0.105503 +0.104469 +0.103444 +0.102428 +0.101420 +0.100420 +0.099429 +0.098446 +0.097472 +0.096506 +0.095548 +0.094598 +0.093656 +0.092723 +0.091797 +0.090879 +0.089969 +0.089067 +0.088173 +0.087286 +0.086407 +0.085536 +0.084672 +0.083816 +0.082967 +0.082126 +0.081292 +0.080465 +0.079646 +0.078833 +0.078028 +0.077230 +0.076439 +0.075655 +0.074878 +0.074108 +0.073345 +0.072589 +0.071839 +0.071096 +0.070360 +0.069630 +0.068907 +0.068191 +0.067480 +0.066777 +0.066080 +0.065389 +0.064704 +0.064026 +0.063353 +0.062687 +0.062027 +0.061374 +0.060726 +0.060084 +0.059448 +0.058818 +0.058193 +0.057575 +0.056962 +0.056355 +0.055754 +0.055158 +0.054568 +0.053983 +0.053404 +0.052831 +0.052262 +0.051700 +0.051142 +0.050590 +0.050043 +0.049501 +0.048964 +0.048432 +0.047906 +0.047384 +0.046868 +0.046357 +0.045850 +0.045348 +0.044851 +0.044359 +0.043872 +0.043389 +0.042912 +0.042438 +0.041970 +0.041506 +0.041046 +0.040591 +0.040141 +0.039694 +0.039253 +0.038815 +0.038382 +0.037954 +0.037529 +0.037109 +0.036693 +0.036281 +0.035873 +0.035469 +0.035069 +0.034673 +0.034282 +0.033894 +0.033510 +0.033130 +0.032753 +0.032381 +0.032012 +0.031647 +0.031286 +0.030929 +0.030575 +0.030224 +0.029878 +0.029534 +0.029195 +0.028859 +0.028526 +0.028197 +0.027871 +0.027548 +0.027229 +0.026913 +0.026601 +0.026291 +0.025985 +0.025682 +0.025383 +0.025086 +0.024793 +0.024502 +0.024215 +0.023930 +0.023649 +0.023371 +0.023095 +0.022823 +0.022553 +0.022286 +0.022022 +0.021761 +0.021503 +0.021247 +0.020995 +0.020744 +0.020497 +0.020252 +0.020010 +0.019770 +0.019533 +0.019299 +0.019067 +0.018838 +0.018611 +0.018387 +0.018165 +0.017945 +0.017728 +0.017513 +0.017301 +0.017091 +0.016883 +0.016677 +0.016474 +0.016273 +0.016074 +0.015878 +0.015684 +0.015491 +0.015301 +0.015113 +0.014927 +0.014744 +0.014562 +0.014382 +0.014204 +0.014029 +0.013855 +0.013683 +0.013513 +0.013345 +0.013179 +0.013015 +0.012853 +0.012692 +0.012534 +0.012377 +0.012222 +0.012068 +0.011917 +0.011767 +0.011619 +0.011473 +0.011328 +0.011185 +0.011043 +0.010904 +0.010765 +0.010629 +0.010494 +0.010360 +0.010229 +0.010098 +0.009969 +0.009842 +0.009716 +0.009592 +0.009469 +0.009348 +0.009227 +0.009109 +0.008992 +0.008876 +0.008761 +0.008648 +0.008536 +0.008426 +0.008317 +0.008209 +0.008102 +0.007997 +0.007893 +0.007790 +0.007688 +0.007588 +0.007489 +0.007391 +0.007294 +0.007198 +0.007104 +0.007011 +0.006918 +0.006827 +0.006737 +0.006648 +0.006560 +0.006474 +0.006388 +0.006303 +0.006220 +0.006137 +0.006055 +0.005975 +0.005895 +0.005816 +0.005739 +0.005662 +0.005586 +0.005511 +0.005437 +0.005364 +0.005292 +0.005221 +0.005151 +0.005081 +0.005013 +0.004945 +0.004878 +0.004812 +0.004747 +0.004682 +0.004619 +0.004556 +0.004494 +0.004433 +0.004372 +0.004313 +0.004254 +0.004195 +0.004138 +0.004081 +0.004025 +0.003970 +0.003915 +0.003861 +0.003808 +0.003756 +0.003704 +0.003652 +0.003602 +0.003552 +0.003503 +0.003454 +0.003406 +0.003359 +0.003312 +0.003266 +0.003220 +0.003175 +0.003131 +0.003087 +0.003044 +0.003001 +0.002959 +0.002917 +0.002876 +0.002836 +0.002796 +0.002756 +0.002717 +0.002679 +0.002641 +0.002604 +0.002567 +0.002530 +0.002494 +0.002459 +0.002424 +0.002389 +0.002355 +0.002322 +0.002288 +0.002256 +0.002223 +0.002191 +0.002160 +0.002129 +0.002098 +0.002068 +0.002038 +0.002009 +0.001980 +0.001951 +0.001923 +0.001895 +0.001868 +0.001841 +0.001814 +0.001788 +0.001761 +0.001736 +0.001711 +0.001686 +0.001661 +0.001637 +0.001613 +0.001589 +0.001566 +0.001543 +0.001520 +0.001498 +0.001476 +0.001454 +0.001432 +0.001411 +0.001390 +0.001370 +0.001350 +0.001330 +0.001310 +0.001290 +0.001271 +0.001252 +0.001234 +0.001215 +0.001197 +0.001179 +0.001162 +0.001144 +0.001127 +0.001110 +0.001094 +0.001077 +0.001061 +0.001045 +0.001029 +0.001014 +0.000998 +0.000983 +0.000968 +0.000954 +0.000939 +0.000925 +0.000911 +0.000897 +0.000884 +0.000870 +0.000857 +0.000844 +0.000831 +0.000818 +0.000806 +0.000793 +0.000781 +0.000769 +0.000757 +0.000746 +0.000734 +0.000723 +0.000712 +0.000701 +0.000690 +0.000679 +0.000669 +0.000659 +0.000648 +0.000638 +0.000628 +0.000619 +0.000609 +0.000599 +0.000590 +0.000581 +0.000572 +0.000563 +0.000554 +0.000545 +0.000537 +0.000529 +0.000520 +0.000512 +0.000504 +0.000496 +0.000488 +0.000481 +0.000473 +0.000465 +0.000458 +0.000451 +0.000444 +0.000437 +0.000430 +0.000423 +0.000416 +0.000410 +0.000403 +0.000397 +0.000390 +0.000384 +0.000378 +0.000372 +0.000366 +0.000360 +0.000354 +0.000349 +0.000343 +0.000338 +0.000332 +0.000327 +0.000321 +0.000316 +0.000311 +0.000306 +0.000301 +0.000296 +0.000292 +0.000287 +0.000282 +0.000278 +0.000273 +0.000269 +0.000264 +0.000260 +0.000256 +0.000252 +0.000247 +0.000243 +0.000239 +0.000235 +0.000232 +0.000228 +0.000224 +0.000220 +0.000217 +0.000213 +0.000210 +0.000206 +0.000203 +0.000199 +0.000196 +0.000193 +0.000190 +0.000187 +0.000183 +0.000180 +0.000177 +0.000174 +0.000172 +0.000169 +0.000166 +0.000163 +0.000160 +0.000158 +0.000155 +0.000152 +0.000150 +0.000147 +0.000145 +0.000142 +0.000140 +0.000138 +0.000135 +0.000133 +0.000131 +0.000129 +0.000126 +0.000124 +0.000122 +0.000120 +0.000118 +0.000116 +0.000114 +0.000112 +0.000110 +0.000108 +0.000107 +0.000105 +0.000103 +0.000101 +0.000099 +0.000098 +0.000096 +0.000094 +0.000093 +0.000091 +0.000090 +0.000088 +0.000087 +0.000085 +0.000084 +0.000082 +0.000081 +0.000079 +0.000078 +0.000077 +0.000075 +0.000074 +0.000073 +0.000071 +0.000070 +0.000069 +0.000068 +0.000067 +0.000065 +0.000064 +0.000063 +0.000062 +0.000061 +0.000060 +0.000059 +0.000058 +0.000057 +0.000056 +0.000055 +0.000054 +0.000053 +0.000052 +0.000051 +0.000050 +0.000049 +0.000048 +0.000048 +0.000047 +0.000046 +0.000045 +0.000044 +0.000043 +0.000043 +0.000042 +0.000041 +0.000040 +0.000040 +0.000039 +0.000038 +0.000038 +0.000037 +0.000036 +0.000036 +0.000035 +0.000034 +0.000034 +0.000033 +0.000033 +0.000032 +0.000031 +0.000031 +0.000030 +0.000030 +0.000029 +0.000029 +0.000028 +0.000028 +0.000027 +0.000027 +0.000026 +0.000026 +0.000025 +0.000025 +0.000024 +0.000024 +0.000023 +0.000023 +0.000023 +0.000022 +0.000022 +0.000021 +0.000021 +0.000021 +0.000020 +0.000020 +0.000019 +0.000019 +0.000019 +0.000018 +0.000018 +0.000018 +0.000017 +0.000017 +0.000017 +0.000016 +0.000016 +0.000016 +0.000016 +0.000015 +0.000015 +0.000015 +0.000014 +0.000014 +0.000014 +0.000014 +0.000013 +0.000013 +0.000013 +0.000013 +0.000012 +0.000012 +0.000012 +0.000012 +0.000011 +0.000011 +0.000011 +0.000011 +0.000011 +0.000010 +0.000010 +0.000010 +0.000010 +0.000010 +0.000010 +0.000009 +0.000009 +0.000009 +0.000009 +0.000009 +0.000008 +0.000008 +0.000008 +0.000008 +0.000008 +0.000008 +0.000008 +0.000007 +0.000007 +0.000007 +0.000007 +0.000007 +0.000007 +0.000007 +0.000006 +0.000006 +0.000006 +0.000006 +0.000006 +0.000006 +0.000006 +0.000006 +0.000006 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000005 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000004 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000003 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000002 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000001 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 diff --git a/inputFiles/lagrangianContactMechanics/dataTables/singularCrackSlip.csv b/inputFiles/lagrangianContactMechanics/dataTables/singularCrackSlip.csv new file mode 100644 index 00000000000..edf811e7742 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/dataTables/singularCrackSlip.csv @@ -0,0 +1,10000 @@ +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.128977 +0.225371 +0.291349 +0.344835 +0.390990 +0.432169 +0.469683 +0.504350 +0.536722 +0.567193 +0.596053 +0.623527 +0.649790 +0.674984 +0.699225 +0.722608 +0.745213 +0.767111 +0.788359 +0.809010 +0.829106 +0.848689 +0.867793 +0.886448 +0.904683 +0.922522 +0.939988 +0.957101 +0.973881 +0.990343 +1.006504 +1.022377 +1.037977 +1.053314 +1.068401 +1.083248 +1.097864 +1.112259 +1.126442 +1.140419 +1.154199 +1.167789 +1.181194 +1.194422 +1.207478 +1.220368 +1.233097 +1.245670 +1.258091 +1.270365 +1.282496 +1.294488 +1.306346 +1.318072 +1.329670 +1.341143 +1.352496 +1.363729 +1.374848 +1.385854 +1.396749 +1.407538 +1.418221 +1.428802 +1.439282 +1.449664 +1.459950 +1.470142 +1.480242 +1.490251 +1.500172 +1.510006 +1.519756 +1.529422 +1.539006 +1.548509 +1.557934 +1.567281 +1.576553 +1.585749 +1.594872 +1.603923 +1.612903 +1.621814 +1.630655 +1.639429 +1.648137 +1.656779 +1.665357 +1.673872 +1.682324 +1.690714 +1.699044 +1.707315 +1.715526 +1.723680 +1.731776 +1.739816 +1.747800 +1.755730 +1.763605 +1.771427 +1.779196 +1.786914 +1.794580 +1.802195 +1.809760 +1.817276 +1.824744 +1.832163 +1.839534 +1.846858 +1.854136 +1.861368 +1.868555 +1.875696 +1.882794 +1.889847 +1.896857 +1.903824 +1.910749 +1.917632 +1.924473 +1.931273 +1.938033 +1.944752 +1.951432 +1.958072 +1.964673 +1.971235 +1.977760 +1.984246 +1.990695 +1.997107 +2.003482 +2.009821 +2.016123 +2.022390 +2.028622 +2.034818 +2.040980 +2.047107 +2.053200 +2.059259 +2.065285 +2.071277 +2.077237 +2.083164 +2.089058 +2.094921 +2.100751 +2.106550 +2.112318 +2.118055 +2.123760 +2.129436 +2.135080 +2.140695 +2.146280 +2.151836 +2.157361 +2.162858 +2.168326 +2.173765 +2.179176 +2.184558 +2.189913 +2.195239 +2.200538 +2.205809 +2.211053 +2.216270 +2.221460 +2.226623 +2.231760 +2.236870 +2.241954 +2.247013 +2.252045 +2.257052 +2.262033 +2.266989 +2.271920 +2.276826 +2.281707 +2.286564 +2.291396 +2.296204 +2.300987 +2.305747 +2.310482 +2.315194 +2.319882 +2.324547 +2.329189 +2.333807 +2.338402 +2.342975 +2.347525 +2.352052 +2.356556 +2.361038 +2.365498 +2.369936 +2.374352 +2.378746 +2.383118 +2.387468 +2.391797 +2.396105 +2.400391 +2.404656 +2.408901 +2.413124 +2.417326 +2.421508 +2.425669 +2.429809 +2.433929 +2.438029 +2.442108 +2.446168 +2.450207 +2.454227 +2.458227 +2.462207 +2.466167 +2.470108 +2.474029 +2.477932 +2.481814 +2.485678 +2.489523 +2.493349 +2.497155 +2.500943 +2.504713 +2.508463 +2.512195 +2.515909 +2.519604 +2.523281 +2.526940 +2.530581 +2.534203 +2.537808 +2.541394 +2.544963 +2.548514 +2.552047 +2.555563 +2.559061 +2.562542 +2.566005 +2.569451 +2.572880 +2.576292 +2.579686 +2.583063 +2.586424 +2.589767 +2.593094 +2.596404 +2.599697 +2.602973 +2.606233 +2.609476 +2.612703 +2.615913 +2.619107 +2.622285 +2.625447 +2.628592 +2.631721 +2.634834 +2.637931 +2.641013 +2.644078 +2.647127 +2.650161 +2.653179 +2.656181 +2.659168 +2.662139 +2.665094 +2.668034 +2.670959 +2.673868 +2.676762 +2.679641 +2.682505 +2.685353 +2.688186 +2.691004 +2.693807 +2.696595 +2.699369 +2.702127 +2.704870 +2.707599 +2.710313 +2.713012 +2.715697 +2.718367 +2.721022 +2.723663 +2.726289 +2.728901 +2.731499 +2.734082 +2.736651 +2.739205 +2.741746 +2.744272 +2.746783 +2.749281 +2.751765 +2.754235 +2.756690 +2.759132 +2.761560 +2.763973 +2.766373 +2.768759 +2.771132 +2.773490 +2.775835 +2.778166 +2.780484 +2.782788 +2.785078 +2.787355 +2.789618 +2.791868 +2.794104 +2.796327 +2.798536 +2.800732 +2.802915 +2.805085 +2.807241 +2.809384 +2.811514 +2.813630 +2.815734 +2.817824 +2.819901 +2.821966 +2.824017 +2.826055 +2.828080 +2.830092 +2.832092 +2.834078 +2.836052 +2.838013 +2.839960 +2.841896 +2.843818 +2.845728 +2.847625 +2.849509 +2.851381 +2.853240 +2.855086 +2.856920 +2.858741 +2.860550 +2.862346 +2.864130 +2.865901 +2.867660 +2.869407 +2.871141 +2.872862 +2.874572 +2.876269 +2.877953 +2.879626 +2.881286 +2.882934 +2.884570 +2.886193 +2.887804 +2.889404 +2.890991 +2.892565 +2.894128 +2.895679 +2.897218 +2.898744 +2.900259 +2.901762 +2.903252 +2.904731 +2.906198 +2.907652 +2.909095 +2.910526 +2.911945 +2.913353 +2.914748 +2.916132 +2.917503 +2.918863 +2.920212 +2.921548 +2.922873 +2.924186 +2.925487 +2.926777 +2.928055 +2.929321 +2.930576 +2.931819 +2.933050 +2.934270 +2.935478 +2.936675 +2.937860 +2.939033 +2.940195 +2.941345 +2.942484 +2.943612 +2.944728 +2.945832 +2.946925 +2.948007 +2.949077 +2.950136 +2.951183 +2.952219 +2.953244 +2.954257 +2.955259 +2.956250 +2.957229 +2.958197 +2.959153 +2.960098 +2.961032 +2.961955 +2.962867 +2.963767 +2.964656 +2.965533 +2.966400 +2.967255 +2.968099 +2.968932 +2.969754 +2.970564 +2.971363 +2.972152 +2.972929 +2.973694 +2.974449 +2.975193 +2.975925 +2.976647 +2.977357 +2.978056 +2.978744 +2.979421 +2.980087 +2.980742 +2.981386 +2.982019 +2.982640 +2.983251 +2.983851 +2.984439 +2.985017 +2.985584 +2.986139 +2.986684 +2.987218 +2.987740 +2.988252 +2.988753 +2.989243 +2.989721 +2.990189 +2.990646 +2.991092 +2.991527 +2.991951 +2.992364 +2.992766 +2.993158 +2.993538 +2.993908 +2.994266 +2.994614 +2.994950 +2.995276 +2.995591 +2.995895 +2.996188 +2.996471 +2.996742 +2.997003 +2.997252 +2.997491 +2.997719 +2.997936 +2.998142 +2.998337 +2.998522 +2.998695 +2.998858 +2.999010 +2.999151 +2.999281 +2.999401 +2.999509 +2.999607 +2.999693 +2.999769 +2.999834 +2.999889 +2.999932 +2.999964 +2.999986 +2.999997 +2.999997 +2.999986 +2.999964 +2.999932 +2.999889 +2.999834 +2.999769 +2.999693 +2.999607 +2.999509 +2.999401 +2.999281 +2.999151 +2.999010 +2.998858 +2.998695 +2.998522 +2.998337 +2.998142 +2.997936 +2.997719 +2.997491 +2.997252 +2.997003 +2.996742 +2.996471 +2.996188 +2.995895 +2.995591 +2.995276 +2.994950 +2.994614 +2.994266 +2.993908 +2.993538 +2.993158 +2.992766 +2.992364 +2.991951 +2.991527 +2.991092 +2.990646 +2.990189 +2.989721 +2.989243 +2.988753 +2.988252 +2.987740 +2.987218 +2.986684 +2.986139 +2.985584 +2.985017 +2.984439 +2.983851 +2.983251 +2.982640 +2.982019 +2.981386 +2.980742 +2.980087 +2.979421 +2.978744 +2.978056 +2.977357 +2.976647 +2.975925 +2.975193 +2.974449 +2.973694 +2.972929 +2.972152 +2.971363 +2.970564 +2.969754 +2.968932 +2.968099 +2.967255 +2.966400 +2.965533 +2.964656 +2.963767 +2.962867 +2.961955 +2.961032 +2.960098 +2.959153 +2.958197 +2.957229 +2.956250 +2.955259 +2.954257 +2.953244 +2.952219 +2.951183 +2.950136 +2.949077 +2.948007 +2.946925 +2.945832 +2.944728 +2.943612 +2.942484 +2.941345 +2.940195 +2.939033 +2.937860 +2.936675 +2.935478 +2.934270 +2.933050 +2.931819 +2.930576 +2.929321 +2.928055 +2.926777 +2.925487 +2.924186 +2.922873 +2.921548 +2.920212 +2.918863 +2.917503 +2.916132 +2.914748 +2.913353 +2.911945 +2.910526 +2.909095 +2.907652 +2.906198 +2.904731 +2.903252 +2.901762 +2.900259 +2.898744 +2.897218 +2.895679 +2.894128 +2.892565 +2.890991 +2.889404 +2.887804 +2.886193 +2.884570 +2.882934 +2.881286 +2.879626 +2.877953 +2.876269 +2.874572 +2.872862 +2.871141 +2.869407 +2.867660 +2.865901 +2.864130 +2.862346 +2.860550 +2.858741 +2.856920 +2.855086 +2.853240 +2.851381 +2.849509 +2.847625 +2.845728 +2.843818 +2.841896 +2.839960 +2.838013 +2.836052 +2.834078 +2.832092 +2.830092 +2.828080 +2.826055 +2.824017 +2.821966 +2.819901 +2.817824 +2.815734 +2.813630 +2.811514 +2.809384 +2.807241 +2.805085 +2.802915 +2.800732 +2.798536 +2.796327 +2.794104 +2.791868 +2.789618 +2.787355 +2.785078 +2.782788 +2.780484 +2.778166 +2.775835 +2.773490 +2.771132 +2.768759 +2.766373 +2.763973 +2.761560 +2.759132 +2.756690 +2.754235 +2.751765 +2.749281 +2.746783 +2.744272 +2.741746 +2.739205 +2.736651 +2.734082 +2.731499 +2.728901 +2.726289 +2.723663 +2.721022 +2.718367 +2.715697 +2.713012 +2.710313 +2.707599 +2.704870 +2.702127 +2.699369 +2.696595 +2.693807 +2.691004 +2.688186 +2.685353 +2.682505 +2.679641 +2.676762 +2.673868 +2.670959 +2.668034 +2.665094 +2.662139 +2.659168 +2.656181 +2.653179 +2.650161 +2.647127 +2.644078 +2.641013 +2.637931 +2.634834 +2.631721 +2.628592 +2.625447 +2.622285 +2.619107 +2.615913 +2.612703 +2.609476 +2.606233 +2.602973 +2.599697 +2.596404 +2.593094 +2.589767 +2.586424 +2.583063 +2.579686 +2.576292 +2.572880 +2.569451 +2.566005 +2.562542 +2.559061 +2.555563 +2.552047 +2.548514 +2.544963 +2.541394 +2.537808 +2.534203 +2.530581 +2.526940 +2.523281 +2.519604 +2.515909 +2.512195 +2.508463 +2.504713 +2.500943 +2.497155 +2.493349 +2.489523 +2.485678 +2.481814 +2.477932 +2.474029 +2.470108 +2.466167 +2.462207 +2.458227 +2.454227 +2.450207 +2.446168 +2.442108 +2.438029 +2.433929 +2.429809 +2.425669 +2.421508 +2.417326 +2.413124 +2.408901 +2.404656 +2.400391 +2.396105 +2.391797 +2.387468 +2.383118 +2.378746 +2.374352 +2.369936 +2.365498 +2.361038 +2.356556 +2.352052 +2.347525 +2.342975 +2.338402 +2.333807 +2.329189 +2.324547 +2.319882 +2.315194 +2.310482 +2.305747 +2.300987 +2.296204 +2.291396 +2.286564 +2.281707 +2.276826 +2.271920 +2.266989 +2.262033 +2.257052 +2.252045 +2.247013 +2.241954 +2.236870 +2.231760 +2.226623 +2.221460 +2.216270 +2.211053 +2.205809 +2.200538 +2.195239 +2.189913 +2.184558 +2.179176 +2.173765 +2.168326 +2.162858 +2.157361 +2.151836 +2.146280 +2.140695 +2.135080 +2.129436 +2.123760 +2.118055 +2.112318 +2.106550 +2.100751 +2.094921 +2.089058 +2.083164 +2.077237 +2.071277 +2.065285 +2.059259 +2.053200 +2.047107 +2.040980 +2.034818 +2.028622 +2.022390 +2.016123 +2.009821 +2.003482 +1.997107 +1.990695 +1.984246 +1.977760 +1.971235 +1.964673 +1.958072 +1.951432 +1.944752 +1.938033 +1.931273 +1.924473 +1.917632 +1.910749 +1.903824 +1.896857 +1.889847 +1.882794 +1.875696 +1.868555 +1.861368 +1.854136 +1.846858 +1.839534 +1.832163 +1.824744 +1.817276 +1.809760 +1.802195 +1.794580 +1.786914 +1.779196 +1.771427 +1.763605 +1.755730 +1.747800 +1.739816 +1.731776 +1.723680 +1.715526 +1.707315 +1.699044 +1.690714 +1.682324 +1.673872 +1.665357 +1.656779 +1.648137 +1.639429 +1.630655 +1.621814 +1.612903 +1.603923 +1.594872 +1.585749 +1.576553 +1.567281 +1.557934 +1.548509 +1.539006 +1.529422 +1.519756 +1.510006 +1.500172 +1.490251 +1.480242 +1.470142 +1.459950 +1.449664 +1.439282 +1.428802 +1.418221 +1.407538 +1.396749 +1.385854 +1.374848 +1.363729 +1.352496 +1.341143 +1.329670 +1.318072 +1.306346 +1.294488 +1.282496 +1.270365 +1.258091 +1.245670 +1.233097 +1.220368 +1.207478 +1.194422 +1.181194 +1.167789 +1.154199 +1.140419 +1.126442 +1.112259 +1.097864 +1.083248 +1.068401 +1.053314 +1.037977 +1.022377 +1.006504 +0.990343 +0.973881 +0.957101 +0.939988 +0.922522 +0.904683 +0.886448 +0.867793 +0.848689 +0.829106 +0.809010 +0.788359 +0.767111 +0.745213 +0.722608 +0.699225 +0.674984 +0.649790 +0.623527 +0.596053 +0.567193 +0.536722 +0.504350 +0.469683 +0.432169 +0.390990 +0.344835 +0.291349 +0.225371 +0.128977 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 +0.000000 diff --git a/inputFiles/lagrangianContactMechanics/dataTables/x.csv b/inputFiles/lagrangianContactMechanics/dataTables/x.csv new file mode 100644 index 00000000000..aef9f0ca8b1 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/dataTables/x.csv @@ -0,0 +1,10000 @@ +-19.010000 +-19.006198 +-19.002395 +-18.998593 +-18.994790 +-18.990988 +-18.987186 +-18.983383 +-18.979581 +-18.975779 +-18.971976 +-18.968174 +-18.964371 +-18.960569 +-18.956767 +-18.952964 +-18.949162 +-18.945360 +-18.941557 +-18.937755 +-18.933952 +-18.930150 +-18.926348 +-18.922545 +-18.918743 +-18.914940 +-18.911138 +-18.907336 +-18.903533 +-18.899731 +-18.895929 +-18.892126 +-18.888324 +-18.884521 +-18.880719 +-18.876917 +-18.873114 +-18.869312 +-18.865510 +-18.861707 +-18.857905 +-18.854102 +-18.850300 +-18.846498 +-18.842695 +-18.838893 +-18.835091 +-18.831288 +-18.827486 +-18.823683 +-18.819881 +-18.816079 +-18.812276 +-18.808474 +-18.804671 +-18.800869 +-18.797067 +-18.793264 +-18.789462 +-18.785660 +-18.781857 +-18.778055 +-18.774252 +-18.770450 +-18.766648 +-18.762845 +-18.759043 +-18.755241 +-18.751438 +-18.747636 +-18.743833 +-18.740031 +-18.736229 +-18.732426 +-18.728624 +-18.724821 +-18.721019 +-18.717217 +-18.713414 +-18.709612 +-18.705810 +-18.702007 +-18.698205 +-18.694402 +-18.690600 +-18.686798 +-18.682995 +-18.679193 +-18.675391 +-18.671588 +-18.667786 +-18.663983 +-18.660181 +-18.656379 +-18.652576 +-18.648774 +-18.644971 +-18.641169 +-18.637367 +-18.633564 +-18.629762 +-18.625960 +-18.622157 +-18.618355 +-18.614552 +-18.610750 +-18.606948 +-18.603145 +-18.599343 +-18.595541 +-18.591738 +-18.587936 +-18.584133 +-18.580331 +-18.576529 +-18.572726 +-18.568924 +-18.565122 +-18.561319 +-18.557517 +-18.553714 +-18.549912 +-18.546110 +-18.542307 +-18.538505 +-18.534702 +-18.530900 +-18.527098 +-18.523295 +-18.519493 +-18.515691 +-18.511888 +-18.508086 +-18.504283 +-18.500481 +-18.496679 +-18.492876 +-18.489074 +-18.485272 +-18.481469 +-18.477667 +-18.473864 +-18.470062 +-18.466260 +-18.462457 +-18.458655 +-18.454852 +-18.451050 +-18.447248 +-18.443445 +-18.439643 +-18.435841 +-18.432038 +-18.428236 +-18.424433 +-18.420631 +-18.416829 +-18.413026 +-18.409224 +-18.405422 +-18.401619 +-18.397817 +-18.394014 +-18.390212 +-18.386410 +-18.382607 +-18.378805 +-18.375003 +-18.371200 +-18.367398 +-18.363595 +-18.359793 +-18.355991 +-18.352188 +-18.348386 +-18.344583 +-18.340781 +-18.336979 +-18.333176 +-18.329374 +-18.325572 +-18.321769 +-18.317967 +-18.314164 +-18.310362 +-18.306560 +-18.302757 +-18.298955 +-18.295153 +-18.291350 +-18.287548 +-18.283745 +-18.279943 +-18.276141 +-18.272338 +-18.268536 +-18.264733 +-18.260931 +-18.257129 +-18.253326 +-18.249524 +-18.245722 +-18.241919 +-18.238117 +-18.234314 +-18.230512 +-18.226710 +-18.222907 +-18.219105 +-18.215303 +-18.211500 +-18.207698 +-18.203895 +-18.200093 +-18.196291 +-18.192488 +-18.188686 +-18.184883 +-18.181081 +-18.177279 +-18.173476 +-18.169674 +-18.165872 +-18.162069 +-18.158267 +-18.154464 +-18.150662 +-18.146860 +-18.143057 +-18.139255 +-18.135453 +-18.131650 +-18.127848 +-18.124045 +-18.120243 +-18.116441 +-18.112638 +-18.108836 +-18.105034 +-18.101231 +-18.097429 +-18.093626 +-18.089824 +-18.086022 +-18.082219 +-18.078417 +-18.074614 +-18.070812 +-18.067010 +-18.063207 +-18.059405 +-18.055603 +-18.051800 +-18.047998 +-18.044195 +-18.040393 +-18.036591 +-18.032788 +-18.028986 +-18.025184 +-18.021381 +-18.017579 +-18.013776 +-18.009974 +-18.006172 +-18.002369 +-17.998567 +-17.994764 +-17.990962 +-17.987160 +-17.983357 +-17.979555 +-17.975753 +-17.971950 +-17.968148 +-17.964345 +-17.960543 +-17.956741 +-17.952938 +-17.949136 +-17.945334 +-17.941531 +-17.937729 +-17.933926 +-17.930124 +-17.926322 +-17.922519 +-17.918717 +-17.914914 +-17.911112 +-17.907310 +-17.903507 +-17.899705 +-17.895903 +-17.892100 +-17.888298 +-17.884495 +-17.880693 +-17.876891 +-17.873088 +-17.869286 +-17.865484 +-17.861681 +-17.857879 +-17.854076 +-17.850274 +-17.846472 +-17.842669 +-17.838867 +-17.835065 +-17.831262 +-17.827460 +-17.823657 +-17.819855 +-17.816053 +-17.812250 +-17.808448 +-17.804645 +-17.800843 +-17.797041 +-17.793238 +-17.789436 +-17.785634 +-17.781831 +-17.778029 +-17.774226 +-17.770424 +-17.766622 +-17.762819 +-17.759017 +-17.755215 +-17.751412 +-17.747610 +-17.743807 +-17.740005 +-17.736203 +-17.732400 +-17.728598 +-17.724795 +-17.720993 +-17.717191 +-17.713388 +-17.709586 +-17.705784 +-17.701981 +-17.698179 +-17.694376 +-17.690574 +-17.686772 +-17.682969 +-17.679167 +-17.675365 +-17.671562 +-17.667760 +-17.663957 +-17.660155 +-17.656353 +-17.652550 +-17.648748 +-17.644945 +-17.641143 +-17.637341 +-17.633538 +-17.629736 +-17.625934 +-17.622131 +-17.618329 +-17.614526 +-17.610724 +-17.606922 +-17.603119 +-17.599317 +-17.595515 +-17.591712 +-17.587910 +-17.584107 +-17.580305 +-17.576503 +-17.572700 +-17.568898 +-17.565096 +-17.561293 +-17.557491 +-17.553688 +-17.549886 +-17.546084 +-17.542281 +-17.538479 +-17.534676 +-17.530874 +-17.527072 +-17.523269 +-17.519467 +-17.515665 +-17.511862 +-17.508060 +-17.504257 +-17.500455 +-17.496653 +-17.492850 +-17.489048 +-17.485246 +-17.481443 +-17.477641 +-17.473838 +-17.470036 +-17.466234 +-17.462431 +-17.458629 +-17.454826 +-17.451024 +-17.447222 +-17.443419 +-17.439617 +-17.435815 +-17.432012 +-17.428210 +-17.424407 +-17.420605 +-17.416803 +-17.413000 +-17.409198 +-17.405396 +-17.401593 +-17.397791 +-17.393988 +-17.390186 +-17.386384 +-17.382581 +-17.378779 +-17.374976 +-17.371174 +-17.367372 +-17.363569 +-17.359767 +-17.355965 +-17.352162 +-17.348360 +-17.344557 +-17.340755 +-17.336953 +-17.333150 +-17.329348 +-17.325546 +-17.321743 +-17.317941 +-17.314138 +-17.310336 +-17.306534 +-17.302731 +-17.298929 +-17.295127 +-17.291324 +-17.287522 +-17.283719 +-17.279917 +-17.276115 +-17.272312 +-17.268510 +-17.264707 +-17.260905 +-17.257103 +-17.253300 +-17.249498 +-17.245696 +-17.241893 +-17.238091 +-17.234288 +-17.230486 +-17.226684 +-17.222881 +-17.219079 +-17.215277 +-17.211474 +-17.207672 +-17.203869 +-17.200067 +-17.196265 +-17.192462 +-17.188660 +-17.184857 +-17.181055 +-17.177253 +-17.173450 +-17.169648 +-17.165846 +-17.162043 +-17.158241 +-17.154438 +-17.150636 +-17.146834 +-17.143031 +-17.139229 +-17.135427 +-17.131624 +-17.127822 +-17.124019 +-17.120217 +-17.116415 +-17.112612 +-17.108810 +-17.105008 +-17.101205 +-17.097403 +-17.093600 +-17.089798 +-17.085996 +-17.082193 +-17.078391 +-17.074588 +-17.070786 +-17.066984 +-17.063181 +-17.059379 +-17.055577 +-17.051774 +-17.047972 +-17.044169 +-17.040367 +-17.036565 +-17.032762 +-17.028960 +-17.025158 +-17.021355 +-17.017553 +-17.013750 +-17.009948 +-17.006146 +-17.002343 +-16.998541 +-16.994738 +-16.990936 +-16.987134 +-16.983331 +-16.979529 +-16.975727 +-16.971924 +-16.968122 +-16.964319 +-16.960517 +-16.956715 +-16.952912 +-16.949110 +-16.945308 +-16.941505 +-16.937703 +-16.933900 +-16.930098 +-16.926296 +-16.922493 +-16.918691 +-16.914888 +-16.911086 +-16.907284 +-16.903481 +-16.899679 +-16.895877 +-16.892074 +-16.888272 +-16.884469 +-16.880667 +-16.876865 +-16.873062 +-16.869260 +-16.865458 +-16.861655 +-16.857853 +-16.854050 +-16.850248 +-16.846446 +-16.842643 +-16.838841 +-16.835039 +-16.831236 +-16.827434 +-16.823631 +-16.819829 +-16.816027 +-16.812224 +-16.808422 +-16.804619 +-16.800817 +-16.797015 +-16.793212 +-16.789410 +-16.785608 +-16.781805 +-16.778003 +-16.774200 +-16.770398 +-16.766596 +-16.762793 +-16.758991 +-16.755189 +-16.751386 +-16.747584 +-16.743781 +-16.739979 +-16.736177 +-16.732374 +-16.728572 +-16.724769 +-16.720967 +-16.717165 +-16.713362 +-16.709560 +-16.705758 +-16.701955 +-16.698153 +-16.694350 +-16.690548 +-16.686746 +-16.682943 +-16.679141 +-16.675339 +-16.671536 +-16.667734 +-16.663931 +-16.660129 +-16.656327 +-16.652524 +-16.648722 +-16.644919 +-16.641117 +-16.637315 +-16.633512 +-16.629710 +-16.625908 +-16.622105 +-16.618303 +-16.614500 +-16.610698 +-16.606896 +-16.603093 +-16.599291 +-16.595489 +-16.591686 +-16.587884 +-16.584081 +-16.580279 +-16.576477 +-16.572674 +-16.568872 +-16.565070 +-16.561267 +-16.557465 +-16.553662 +-16.549860 +-16.546058 +-16.542255 +-16.538453 +-16.534650 +-16.530848 +-16.527046 +-16.523243 +-16.519441 +-16.515639 +-16.511836 +-16.508034 +-16.504231 +-16.500429 +-16.496627 +-16.492824 +-16.489022 +-16.485220 +-16.481417 +-16.477615 +-16.473812 +-16.470010 +-16.466208 +-16.462405 +-16.458603 +-16.454800 +-16.450998 +-16.447196 +-16.443393 +-16.439591 +-16.435789 +-16.431986 +-16.428184 +-16.424381 +-16.420579 +-16.416777 +-16.412974 +-16.409172 +-16.405370 +-16.401567 +-16.397765 +-16.393962 +-16.390160 +-16.386358 +-16.382555 +-16.378753 +-16.374950 +-16.371148 +-16.367346 +-16.363543 +-16.359741 +-16.355939 +-16.352136 +-16.348334 +-16.344531 +-16.340729 +-16.336927 +-16.333124 +-16.329322 +-16.325520 +-16.321717 +-16.317915 +-16.314112 +-16.310310 +-16.306508 +-16.302705 +-16.298903 +-16.295101 +-16.291298 +-16.287496 +-16.283693 +-16.279891 +-16.276089 +-16.272286 +-16.268484 +-16.264681 +-16.260879 +-16.257077 +-16.253274 +-16.249472 +-16.245670 +-16.241867 +-16.238065 +-16.234262 +-16.230460 +-16.226658 +-16.222855 +-16.219053 +-16.215251 +-16.211448 +-16.207646 +-16.203843 +-16.200041 +-16.196239 +-16.192436 +-16.188634 +-16.184831 +-16.181029 +-16.177227 +-16.173424 +-16.169622 +-16.165820 +-16.162017 +-16.158215 +-16.154412 +-16.150610 +-16.146808 +-16.143005 +-16.139203 +-16.135401 +-16.131598 +-16.127796 +-16.123993 +-16.120191 +-16.116389 +-16.112586 +-16.108784 +-16.104981 +-16.101179 +-16.097377 +-16.093574 +-16.089772 +-16.085970 +-16.082167 +-16.078365 +-16.074562 +-16.070760 +-16.066958 +-16.063155 +-16.059353 +-16.055551 +-16.051748 +-16.047946 +-16.044143 +-16.040341 +-16.036539 +-16.032736 +-16.028934 +-16.025132 +-16.021329 +-16.017527 +-16.013724 +-16.009922 +-16.006120 +-16.002317 +-15.998515 +-15.994712 +-15.990910 +-15.987108 +-15.983305 +-15.979503 +-15.975701 +-15.971898 +-15.968096 +-15.964293 +-15.960491 +-15.956689 +-15.952886 +-15.949084 +-15.945282 +-15.941479 +-15.937677 +-15.933874 +-15.930072 +-15.926270 +-15.922467 +-15.918665 +-15.914862 +-15.911060 +-15.907258 +-15.903455 +-15.899653 +-15.895851 +-15.892048 +-15.888246 +-15.884443 +-15.880641 +-15.876839 +-15.873036 +-15.869234 +-15.865432 +-15.861629 +-15.857827 +-15.854024 +-15.850222 +-15.846420 +-15.842617 +-15.838815 +-15.835013 +-15.831210 +-15.827408 +-15.823605 +-15.819803 +-15.816001 +-15.812198 +-15.808396 +-15.804593 +-15.800791 +-15.796989 +-15.793186 +-15.789384 +-15.785582 +-15.781779 +-15.777977 +-15.774174 +-15.770372 +-15.766570 +-15.762767 +-15.758965 +-15.755163 +-15.751360 +-15.747558 +-15.743755 +-15.739953 +-15.736151 +-15.732348 +-15.728546 +-15.724743 +-15.720941 +-15.717139 +-15.713336 +-15.709534 +-15.705732 +-15.701929 +-15.698127 +-15.694324 +-15.690522 +-15.686720 +-15.682917 +-15.679115 +-15.675313 +-15.671510 +-15.667708 +-15.663905 +-15.660103 +-15.656301 +-15.652498 +-15.648696 +-15.644893 +-15.641091 +-15.637289 +-15.633486 +-15.629684 +-15.625882 +-15.622079 +-15.618277 +-15.614474 +-15.610672 +-15.606870 +-15.603067 +-15.599265 +-15.595463 +-15.591660 +-15.587858 +-15.584055 +-15.580253 +-15.576451 +-15.572648 +-15.568846 +-15.565044 +-15.561241 +-15.557439 +-15.553636 +-15.549834 +-15.546032 +-15.542229 +-15.538427 +-15.534624 +-15.530822 +-15.527020 +-15.523217 +-15.519415 +-15.515613 +-15.511810 +-15.508008 +-15.504205 +-15.500403 +-15.496601 +-15.492798 +-15.488996 +-15.485194 +-15.481391 +-15.477589 +-15.473786 +-15.469984 +-15.466182 +-15.462379 +-15.458577 +-15.454774 +-15.450972 +-15.447170 +-15.443367 +-15.439565 +-15.435763 +-15.431960 +-15.428158 +-15.424355 +-15.420553 +-15.416751 +-15.412948 +-15.409146 +-15.405344 +-15.401541 +-15.397739 +-15.393936 +-15.390134 +-15.386332 +-15.382529 +-15.378727 +-15.374924 +-15.371122 +-15.367320 +-15.363517 +-15.359715 +-15.355913 +-15.352110 +-15.348308 +-15.344505 +-15.340703 +-15.336901 +-15.333098 +-15.329296 +-15.325494 +-15.321691 +-15.317889 +-15.314086 +-15.310284 +-15.306482 +-15.302679 +-15.298877 +-15.295075 +-15.291272 +-15.287470 +-15.283667 +-15.279865 +-15.276063 +-15.272260 +-15.268458 +-15.264655 +-15.260853 +-15.257051 +-15.253248 +-15.249446 +-15.245644 +-15.241841 +-15.238039 +-15.234236 +-15.230434 +-15.226632 +-15.222829 +-15.219027 +-15.215225 +-15.211422 +-15.207620 +-15.203817 +-15.200015 +-15.196213 +-15.192410 +-15.188608 +-15.184805 +-15.181003 +-15.177201 +-15.173398 +-15.169596 +-15.165794 +-15.161991 +-15.158189 +-15.154386 +-15.150584 +-15.146782 +-15.142979 +-15.139177 +-15.135375 +-15.131572 +-15.127770 +-15.123967 +-15.120165 +-15.116363 +-15.112560 +-15.108758 +-15.104955 +-15.101153 +-15.097351 +-15.093548 +-15.089746 +-15.085944 +-15.082141 +-15.078339 +-15.074536 +-15.070734 +-15.066932 +-15.063129 +-15.059327 +-15.055525 +-15.051722 +-15.047920 +-15.044117 +-15.040315 +-15.036513 +-15.032710 +-15.028908 +-15.025106 +-15.021303 +-15.017501 +-15.013698 +-15.009896 +-15.006094 +-15.002291 +-14.998489 +-14.994686 +-14.990884 +-14.987082 +-14.983279 +-14.979477 +-14.975675 +-14.971872 +-14.968070 +-14.964267 +-14.960465 +-14.956663 +-14.952860 +-14.949058 +-14.945256 +-14.941453 +-14.937651 +-14.933848 +-14.930046 +-14.926244 +-14.922441 +-14.918639 +-14.914836 +-14.911034 +-14.907232 +-14.903429 +-14.899627 +-14.895825 +-14.892022 +-14.888220 +-14.884417 +-14.880615 +-14.876813 +-14.873010 +-14.869208 +-14.865406 +-14.861603 +-14.857801 +-14.853998 +-14.850196 +-14.846394 +-14.842591 +-14.838789 +-14.834986 +-14.831184 +-14.827382 +-14.823579 +-14.819777 +-14.815975 +-14.812172 +-14.808370 +-14.804567 +-14.800765 +-14.796963 +-14.793160 +-14.789358 +-14.785556 +-14.781753 +-14.777951 +-14.774148 +-14.770346 +-14.766544 +-14.762741 +-14.758939 +-14.755137 +-14.751334 +-14.747532 +-14.743729 +-14.739927 +-14.736125 +-14.732322 +-14.728520 +-14.724717 +-14.720915 +-14.717113 +-14.713310 +-14.709508 +-14.705706 +-14.701903 +-14.698101 +-14.694298 +-14.690496 +-14.686694 +-14.682891 +-14.679089 +-14.675287 +-14.671484 +-14.667682 +-14.663879 +-14.660077 +-14.656275 +-14.652472 +-14.648670 +-14.644867 +-14.641065 +-14.637263 +-14.633460 +-14.629658 +-14.625856 +-14.622053 +-14.618251 +-14.614448 +-14.610646 +-14.606844 +-14.603041 +-14.599239 +-14.595437 +-14.591634 +-14.587832 +-14.584029 +-14.580227 +-14.576425 +-14.572622 +-14.568820 +-14.565018 +-14.561215 +-14.557413 +-14.553610 +-14.549808 +-14.546006 +-14.542203 +-14.538401 +-14.534598 +-14.530796 +-14.526994 +-14.523191 +-14.519389 +-14.515587 +-14.511784 +-14.507982 +-14.504179 +-14.500377 +-14.496575 +-14.492772 +-14.488970 +-14.485168 +-14.481365 +-14.477563 +-14.473760 +-14.469958 +-14.466156 +-14.462353 +-14.458551 +-14.454748 +-14.450946 +-14.447144 +-14.443341 +-14.439539 +-14.435737 +-14.431934 +-14.428132 +-14.424329 +-14.420527 +-14.416725 +-14.412922 +-14.409120 +-14.405318 +-14.401515 +-14.397713 +-14.393910 +-14.390108 +-14.386306 +-14.382503 +-14.378701 +-14.374898 +-14.371096 +-14.367294 +-14.363491 +-14.359689 +-14.355887 +-14.352084 +-14.348282 +-14.344479 +-14.340677 +-14.336875 +-14.333072 +-14.329270 +-14.325468 +-14.321665 +-14.317863 +-14.314060 +-14.310258 +-14.306456 +-14.302653 +-14.298851 +-14.295049 +-14.291246 +-14.287444 +-14.283641 +-14.279839 +-14.276037 +-14.272234 +-14.268432 +-14.264629 +-14.260827 +-14.257025 +-14.253222 +-14.249420 +-14.245618 +-14.241815 +-14.238013 +-14.234210 +-14.230408 +-14.226606 +-14.222803 +-14.219001 +-14.215199 +-14.211396 +-14.207594 +-14.203791 +-14.199989 +-14.196187 +-14.192384 +-14.188582 +-14.184779 +-14.180977 +-14.177175 +-14.173372 +-14.169570 +-14.165768 +-14.161965 +-14.158163 +-14.154360 +-14.150558 +-14.146756 +-14.142953 +-14.139151 +-14.135349 +-14.131546 +-14.127744 +-14.123941 +-14.120139 +-14.116337 +-14.112534 +-14.108732 +-14.104929 +-14.101127 +-14.097325 +-14.093522 +-14.089720 +-14.085918 +-14.082115 +-14.078313 +-14.074510 +-14.070708 +-14.066906 +-14.063103 +-14.059301 +-14.055499 +-14.051696 +-14.047894 +-14.044091 +-14.040289 +-14.036487 +-14.032684 +-14.028882 +-14.025080 +-14.021277 +-14.017475 +-14.013672 +-14.009870 +-14.006068 +-14.002265 +-13.998463 +-13.994660 +-13.990858 +-13.987056 +-13.983253 +-13.979451 +-13.975649 +-13.971846 +-13.968044 +-13.964241 +-13.960439 +-13.956637 +-13.952834 +-13.949032 +-13.945230 +-13.941427 +-13.937625 +-13.933822 +-13.930020 +-13.926218 +-13.922415 +-13.918613 +-13.914810 +-13.911008 +-13.907206 +-13.903403 +-13.899601 +-13.895799 +-13.891996 +-13.888194 +-13.884391 +-13.880589 +-13.876787 +-13.872984 +-13.869182 +-13.865380 +-13.861577 +-13.857775 +-13.853972 +-13.850170 +-13.846368 +-13.842565 +-13.838763 +-13.834960 +-13.831158 +-13.827356 +-13.823553 +-13.819751 +-13.815949 +-13.812146 +-13.808344 +-13.804541 +-13.800739 +-13.796937 +-13.793134 +-13.789332 +-13.785530 +-13.781727 +-13.777925 +-13.774122 +-13.770320 +-13.766518 +-13.762715 +-13.758913 +-13.755111 +-13.751308 +-13.747506 +-13.743703 +-13.739901 +-13.736099 +-13.732296 +-13.728494 +-13.724691 +-13.720889 +-13.717087 +-13.713284 +-13.709482 +-13.705680 +-13.701877 +-13.698075 +-13.694272 +-13.690470 +-13.686668 +-13.682865 +-13.679063 +-13.675261 +-13.671458 +-13.667656 +-13.663853 +-13.660051 +-13.656249 +-13.652446 +-13.648644 +-13.644841 +-13.641039 +-13.637237 +-13.633434 +-13.629632 +-13.625830 +-13.622027 +-13.618225 +-13.614422 +-13.610620 +-13.606818 +-13.603015 +-13.599213 +-13.595411 +-13.591608 +-13.587806 +-13.584003 +-13.580201 +-13.576399 +-13.572596 +-13.568794 +-13.564991 +-13.561189 +-13.557387 +-13.553584 +-13.549782 +-13.545980 +-13.542177 +-13.538375 +-13.534572 +-13.530770 +-13.526968 +-13.523165 +-13.519363 +-13.515561 +-13.511758 +-13.507956 +-13.504153 +-13.500351 +-13.496549 +-13.492746 +-13.488944 +-13.485142 +-13.481339 +-13.477537 +-13.473734 +-13.469932 +-13.466130 +-13.462327 +-13.458525 +-13.454722 +-13.450920 +-13.447118 +-13.443315 +-13.439513 +-13.435711 +-13.431908 +-13.428106 +-13.424303 +-13.420501 +-13.416699 +-13.412896 +-13.409094 +-13.405292 +-13.401489 +-13.397687 +-13.393884 +-13.390082 +-13.386280 +-13.382477 +-13.378675 +-13.374872 +-13.371070 +-13.367268 +-13.363465 +-13.359663 +-13.355861 +-13.352058 +-13.348256 +-13.344453 +-13.340651 +-13.336849 +-13.333046 +-13.329244 +-13.325442 +-13.321639 +-13.317837 +-13.314034 +-13.310232 +-13.306430 +-13.302627 +-13.298825 +-13.295023 +-13.291220 +-13.287418 +-13.283615 +-13.279813 +-13.276011 +-13.272208 +-13.268406 +-13.264603 +-13.260801 +-13.256999 +-13.253196 +-13.249394 +-13.245592 +-13.241789 +-13.237987 +-13.234184 +-13.230382 +-13.226580 +-13.222777 +-13.218975 +-13.215173 +-13.211370 +-13.207568 +-13.203765 +-13.199963 +-13.196161 +-13.192358 +-13.188556 +-13.184753 +-13.180951 +-13.177149 +-13.173346 +-13.169544 +-13.165742 +-13.161939 +-13.158137 +-13.154334 +-13.150532 +-13.146730 +-13.142927 +-13.139125 +-13.135323 +-13.131520 +-13.127718 +-13.123915 +-13.120113 +-13.116311 +-13.112508 +-13.108706 +-13.104903 +-13.101101 +-13.097299 +-13.093496 +-13.089694 +-13.085892 +-13.082089 +-13.078287 +-13.074484 +-13.070682 +-13.066880 +-13.063077 +-13.059275 +-13.055473 +-13.051670 +-13.047868 +-13.044065 +-13.040263 +-13.036461 +-13.032658 +-13.028856 +-13.025054 +-13.021251 +-13.017449 +-13.013646 +-13.009844 +-13.006042 +-13.002239 +-12.998437 +-12.994634 +-12.990832 +-12.987030 +-12.983227 +-12.979425 +-12.975623 +-12.971820 +-12.968018 +-12.964215 +-12.960413 +-12.956611 +-12.952808 +-12.949006 +-12.945204 +-12.941401 +-12.937599 +-12.933796 +-12.929994 +-12.926192 +-12.922389 +-12.918587 +-12.914784 +-12.910982 +-12.907180 +-12.903377 +-12.899575 +-12.895773 +-12.891970 +-12.888168 +-12.884365 +-12.880563 +-12.876761 +-12.872958 +-12.869156 +-12.865354 +-12.861551 +-12.857749 +-12.853946 +-12.850144 +-12.846342 +-12.842539 +-12.838737 +-12.834934 +-12.831132 +-12.827330 +-12.823527 +-12.819725 +-12.815923 +-12.812120 +-12.808318 +-12.804515 +-12.800713 +-12.796911 +-12.793108 +-12.789306 +-12.785504 +-12.781701 +-12.777899 +-12.774096 +-12.770294 +-12.766492 +-12.762689 +-12.758887 +-12.755085 +-12.751282 +-12.747480 +-12.743677 +-12.739875 +-12.736073 +-12.732270 +-12.728468 +-12.724665 +-12.720863 +-12.717061 +-12.713258 +-12.709456 +-12.705654 +-12.701851 +-12.698049 +-12.694246 +-12.690444 +-12.686642 +-12.682839 +-12.679037 +-12.675235 +-12.671432 +-12.667630 +-12.663827 +-12.660025 +-12.656223 +-12.652420 +-12.648618 +-12.644815 +-12.641013 +-12.637211 +-12.633408 +-12.629606 +-12.625804 +-12.622001 +-12.618199 +-12.614396 +-12.610594 +-12.606792 +-12.602989 +-12.599187 +-12.595385 +-12.591582 +-12.587780 +-12.583977 +-12.580175 +-12.576373 +-12.572570 +-12.568768 +-12.564965 +-12.561163 +-12.557361 +-12.553558 +-12.549756 +-12.545954 +-12.542151 +-12.538349 +-12.534546 +-12.530744 +-12.526942 +-12.523139 +-12.519337 +-12.515535 +-12.511732 +-12.507930 +-12.504127 +-12.500325 +-12.496523 +-12.492720 +-12.488918 +-12.485116 +-12.481313 +-12.477511 +-12.473708 +-12.469906 +-12.466104 +-12.462301 +-12.458499 +-12.454696 +-12.450894 +-12.447092 +-12.443289 +-12.439487 +-12.435685 +-12.431882 +-12.428080 +-12.424277 +-12.420475 +-12.416673 +-12.412870 +-12.409068 +-12.405266 +-12.401463 +-12.397661 +-12.393858 +-12.390056 +-12.386254 +-12.382451 +-12.378649 +-12.374846 +-12.371044 +-12.367242 +-12.363439 +-12.359637 +-12.355835 +-12.352032 +-12.348230 +-12.344427 +-12.340625 +-12.336823 +-12.333020 +-12.329218 +-12.325416 +-12.321613 +-12.317811 +-12.314008 +-12.310206 +-12.306404 +-12.302601 +-12.298799 +-12.294996 +-12.291194 +-12.287392 +-12.283589 +-12.279787 +-12.275985 +-12.272182 +-12.268380 +-12.264577 +-12.260775 +-12.256973 +-12.253170 +-12.249368 +-12.245566 +-12.241763 +-12.237961 +-12.234158 +-12.230356 +-12.226554 +-12.222751 +-12.218949 +-12.215147 +-12.211344 +-12.207542 +-12.203739 +-12.199937 +-12.196135 +-12.192332 +-12.188530 +-12.184727 +-12.180925 +-12.177123 +-12.173320 +-12.169518 +-12.165716 +-12.161913 +-12.158111 +-12.154308 +-12.150506 +-12.146704 +-12.142901 +-12.139099 +-12.135297 +-12.131494 +-12.127692 +-12.123889 +-12.120087 +-12.116285 +-12.112482 +-12.108680 +-12.104877 +-12.101075 +-12.097273 +-12.093470 +-12.089668 +-12.085866 +-12.082063 +-12.078261 +-12.074458 +-12.070656 +-12.066854 +-12.063051 +-12.059249 +-12.055447 +-12.051644 +-12.047842 +-12.044039 +-12.040237 +-12.036435 +-12.032632 +-12.028830 +-12.025028 +-12.021225 +-12.017423 +-12.013620 +-12.009818 +-12.006016 +-12.002213 +-11.998411 +-11.994608 +-11.990806 +-11.987004 +-11.983201 +-11.979399 +-11.975597 +-11.971794 +-11.967992 +-11.964189 +-11.960387 +-11.956585 +-11.952782 +-11.948980 +-11.945178 +-11.941375 +-11.937573 +-11.933770 +-11.929968 +-11.926166 +-11.922363 +-11.918561 +-11.914758 +-11.910956 +-11.907154 +-11.903351 +-11.899549 +-11.895747 +-11.891944 +-11.888142 +-11.884339 +-11.880537 +-11.876735 +-11.872932 +-11.869130 +-11.865328 +-11.861525 +-11.857723 +-11.853920 +-11.850118 +-11.846316 +-11.842513 +-11.838711 +-11.834908 +-11.831106 +-11.827304 +-11.823501 +-11.819699 +-11.815897 +-11.812094 +-11.808292 +-11.804489 +-11.800687 +-11.796885 +-11.793082 +-11.789280 +-11.785478 +-11.781675 +-11.777873 +-11.774070 +-11.770268 +-11.766466 +-11.762663 +-11.758861 +-11.755059 +-11.751256 +-11.747454 +-11.743651 +-11.739849 +-11.736047 +-11.732244 +-11.728442 +-11.724639 +-11.720837 +-11.717035 +-11.713232 +-11.709430 +-11.705628 +-11.701825 +-11.698023 +-11.694220 +-11.690418 +-11.686616 +-11.682813 +-11.679011 +-11.675209 +-11.671406 +-11.667604 +-11.663801 +-11.659999 +-11.656197 +-11.652394 +-11.648592 +-11.644789 +-11.640987 +-11.637185 +-11.633382 +-11.629580 +-11.625778 +-11.621975 +-11.618173 +-11.614370 +-11.610568 +-11.606766 +-11.602963 +-11.599161 +-11.595359 +-11.591556 +-11.587754 +-11.583951 +-11.580149 +-11.576347 +-11.572544 +-11.568742 +-11.564939 +-11.561137 +-11.557335 +-11.553532 +-11.549730 +-11.545928 +-11.542125 +-11.538323 +-11.534520 +-11.530718 +-11.526916 +-11.523113 +-11.519311 +-11.515509 +-11.511706 +-11.507904 +-11.504101 +-11.500299 +-11.496497 +-11.492694 +-11.488892 +-11.485090 +-11.481287 +-11.477485 +-11.473682 +-11.469880 +-11.466078 +-11.462275 +-11.458473 +-11.454670 +-11.450868 +-11.447066 +-11.443263 +-11.439461 +-11.435659 +-11.431856 +-11.428054 +-11.424251 +-11.420449 +-11.416647 +-11.412844 +-11.409042 +-11.405240 +-11.401437 +-11.397635 +-11.393832 +-11.390030 +-11.386228 +-11.382425 +-11.378623 +-11.374820 +-11.371018 +-11.367216 +-11.363413 +-11.359611 +-11.355809 +-11.352006 +-11.348204 +-11.344401 +-11.340599 +-11.336797 +-11.332994 +-11.329192 +-11.325390 +-11.321587 +-11.317785 +-11.313982 +-11.310180 +-11.306378 +-11.302575 +-11.298773 +-11.294970 +-11.291168 +-11.287366 +-11.283563 +-11.279761 +-11.275959 +-11.272156 +-11.268354 +-11.264551 +-11.260749 +-11.256947 +-11.253144 +-11.249342 +-11.245540 +-11.241737 +-11.237935 +-11.234132 +-11.230330 +-11.226528 +-11.222725 +-11.218923 +-11.215121 +-11.211318 +-11.207516 +-11.203713 +-11.199911 +-11.196109 +-11.192306 +-11.188504 +-11.184701 +-11.180899 +-11.177097 +-11.173294 +-11.169492 +-11.165690 +-11.161887 +-11.158085 +-11.154282 +-11.150480 +-11.146678 +-11.142875 +-11.139073 +-11.135271 +-11.131468 +-11.127666 +-11.123863 +-11.120061 +-11.116259 +-11.112456 +-11.108654 +-11.104851 +-11.101049 +-11.097247 +-11.093444 +-11.089642 +-11.085840 +-11.082037 +-11.078235 +-11.074432 +-11.070630 +-11.066828 +-11.063025 +-11.059223 +-11.055421 +-11.051618 +-11.047816 +-11.044013 +-11.040211 +-11.036409 +-11.032606 +-11.028804 +-11.025002 +-11.021199 +-11.017397 +-11.013594 +-11.009792 +-11.005990 +-11.002187 +-10.998385 +-10.994582 +-10.990780 +-10.986978 +-10.983175 +-10.979373 +-10.975571 +-10.971768 +-10.967966 +-10.964163 +-10.960361 +-10.956559 +-10.952756 +-10.948954 +-10.945152 +-10.941349 +-10.937547 +-10.933744 +-10.929942 +-10.926140 +-10.922337 +-10.918535 +-10.914732 +-10.910930 +-10.907128 +-10.903325 +-10.899523 +-10.895721 +-10.891918 +-10.888116 +-10.884313 +-10.880511 +-10.876709 +-10.872906 +-10.869104 +-10.865302 +-10.861499 +-10.857697 +-10.853894 +-10.850092 +-10.846290 +-10.842487 +-10.838685 +-10.834882 +-10.831080 +-10.827278 +-10.823475 +-10.819673 +-10.815871 +-10.812068 +-10.808266 +-10.804463 +-10.800661 +-10.796859 +-10.793056 +-10.789254 +-10.785452 +-10.781649 +-10.777847 +-10.774044 +-10.770242 +-10.766440 +-10.762637 +-10.758835 +-10.755033 +-10.751230 +-10.747428 +-10.743625 +-10.739823 +-10.736021 +-10.732218 +-10.728416 +-10.724613 +-10.720811 +-10.717009 +-10.713206 +-10.709404 +-10.705602 +-10.701799 +-10.697997 +-10.694194 +-10.690392 +-10.686590 +-10.682787 +-10.678985 +-10.675183 +-10.671380 +-10.667578 +-10.663775 +-10.659973 +-10.656171 +-10.652368 +-10.648566 +-10.644763 +-10.640961 +-10.637159 +-10.633356 +-10.629554 +-10.625752 +-10.621949 +-10.618147 +-10.614344 +-10.610542 +-10.606740 +-10.602937 +-10.599135 +-10.595333 +-10.591530 +-10.587728 +-10.583925 +-10.580123 +-10.576321 +-10.572518 +-10.568716 +-10.564913 +-10.561111 +-10.557309 +-10.553506 +-10.549704 +-10.545902 +-10.542099 +-10.538297 +-10.534494 +-10.530692 +-10.526890 +-10.523087 +-10.519285 +-10.515483 +-10.511680 +-10.507878 +-10.504075 +-10.500273 +-10.496471 +-10.492668 +-10.488866 +-10.485064 +-10.481261 +-10.477459 +-10.473656 +-10.469854 +-10.466052 +-10.462249 +-10.458447 +-10.454644 +-10.450842 +-10.447040 +-10.443237 +-10.439435 +-10.435633 +-10.431830 +-10.428028 +-10.424225 +-10.420423 +-10.416621 +-10.412818 +-10.409016 +-10.405214 +-10.401411 +-10.397609 +-10.393806 +-10.390004 +-10.386202 +-10.382399 +-10.378597 +-10.374794 +-10.370992 +-10.367190 +-10.363387 +-10.359585 +-10.355783 +-10.351980 +-10.348178 +-10.344375 +-10.340573 +-10.336771 +-10.332968 +-10.329166 +-10.325364 +-10.321561 +-10.317759 +-10.313956 +-10.310154 +-10.306352 +-10.302549 +-10.298747 +-10.294944 +-10.291142 +-10.287340 +-10.283537 +-10.279735 +-10.275933 +-10.272130 +-10.268328 +-10.264525 +-10.260723 +-10.256921 +-10.253118 +-10.249316 +-10.245514 +-10.241711 +-10.237909 +-10.234106 +-10.230304 +-10.226502 +-10.222699 +-10.218897 +-10.215095 +-10.211292 +-10.207490 +-10.203687 +-10.199885 +-10.196083 +-10.192280 +-10.188478 +-10.184675 +-10.180873 +-10.177071 +-10.173268 +-10.169466 +-10.165664 +-10.161861 +-10.158059 +-10.154256 +-10.150454 +-10.146652 +-10.142849 +-10.139047 +-10.135245 +-10.131442 +-10.127640 +-10.123837 +-10.120035 +-10.116233 +-10.112430 +-10.108628 +-10.104825 +-10.101023 +-10.097221 +-10.093418 +-10.089616 +-10.085814 +-10.082011 +-10.078209 +-10.074406 +-10.070604 +-10.066802 +-10.062999 +-10.059197 +-10.055395 +-10.051592 +-10.047790 +-10.043987 +-10.040185 +-10.036383 +-10.032580 +-10.028778 +-10.024975 +-10.021173 +-10.017371 +-10.013568 +-10.009766 +-10.005964 +-10.002161 +-9.998359 +-9.994556 +-9.990754 +-9.986952 +-9.983149 +-9.979347 +-9.975545 +-9.971742 +-9.967940 +-9.964137 +-9.960335 +-9.956533 +-9.952730 +-9.948928 +-9.945126 +-9.941323 +-9.937521 +-9.933718 +-9.929916 +-9.926114 +-9.922311 +-9.918509 +-9.914706 +-9.910904 +-9.907102 +-9.903299 +-9.899497 +-9.895695 +-9.891892 +-9.888090 +-9.884287 +-9.880485 +-9.876683 +-9.872880 +-9.869078 +-9.865276 +-9.861473 +-9.857671 +-9.853868 +-9.850066 +-9.846264 +-9.842461 +-9.838659 +-9.834856 +-9.831054 +-9.827252 +-9.823449 +-9.819647 +-9.815845 +-9.812042 +-9.808240 +-9.804437 +-9.800635 +-9.796833 +-9.793030 +-9.789228 +-9.785426 +-9.781623 +-9.777821 +-9.774018 +-9.770216 +-9.766414 +-9.762611 +-9.758809 +-9.755007 +-9.751204 +-9.747402 +-9.743599 +-9.739797 +-9.735995 +-9.732192 +-9.728390 +-9.724587 +-9.720785 +-9.716983 +-9.713180 +-9.709378 +-9.705576 +-9.701773 +-9.697971 +-9.694168 +-9.690366 +-9.686564 +-9.682761 +-9.678959 +-9.675157 +-9.671354 +-9.667552 +-9.663749 +-9.659947 +-9.656145 +-9.652342 +-9.648540 +-9.644737 +-9.640935 +-9.637133 +-9.633330 +-9.629528 +-9.625726 +-9.621923 +-9.618121 +-9.614318 +-9.610516 +-9.606714 +-9.602911 +-9.599109 +-9.595307 +-9.591504 +-9.587702 +-9.583899 +-9.580097 +-9.576295 +-9.572492 +-9.568690 +-9.564887 +-9.561085 +-9.557283 +-9.553480 +-9.549678 +-9.545876 +-9.542073 +-9.538271 +-9.534468 +-9.530666 +-9.526864 +-9.523061 +-9.519259 +-9.515457 +-9.511654 +-9.507852 +-9.504049 +-9.500247 +-9.496445 +-9.492642 +-9.488840 +-9.485038 +-9.481235 +-9.477433 +-9.473630 +-9.469828 +-9.466026 +-9.462223 +-9.458421 +-9.454618 +-9.450816 +-9.447014 +-9.443211 +-9.439409 +-9.435607 +-9.431804 +-9.428002 +-9.424199 +-9.420397 +-9.416595 +-9.412792 +-9.408990 +-9.405188 +-9.401385 +-9.397583 +-9.393780 +-9.389978 +-9.386176 +-9.382373 +-9.378571 +-9.374768 +-9.370966 +-9.367164 +-9.363361 +-9.359559 +-9.355757 +-9.351954 +-9.348152 +-9.344349 +-9.340547 +-9.336745 +-9.332942 +-9.329140 +-9.325338 +-9.321535 +-9.317733 +-9.313930 +-9.310128 +-9.306326 +-9.302523 +-9.298721 +-9.294918 +-9.291116 +-9.287314 +-9.283511 +-9.279709 +-9.275907 +-9.272104 +-9.268302 +-9.264499 +-9.260697 +-9.256895 +-9.253092 +-9.249290 +-9.245488 +-9.241685 +-9.237883 +-9.234080 +-9.230278 +-9.226476 +-9.222673 +-9.218871 +-9.215069 +-9.211266 +-9.207464 +-9.203661 +-9.199859 +-9.196057 +-9.192254 +-9.188452 +-9.184649 +-9.180847 +-9.177045 +-9.173242 +-9.169440 +-9.165638 +-9.161835 +-9.158033 +-9.154230 +-9.150428 +-9.146626 +-9.142823 +-9.139021 +-9.135219 +-9.131416 +-9.127614 +-9.123811 +-9.120009 +-9.116207 +-9.112404 +-9.108602 +-9.104799 +-9.100997 +-9.097195 +-9.093392 +-9.089590 +-9.085788 +-9.081985 +-9.078183 +-9.074380 +-9.070578 +-9.066776 +-9.062973 +-9.059171 +-9.055369 +-9.051566 +-9.047764 +-9.043961 +-9.040159 +-9.036357 +-9.032554 +-9.028752 +-9.024949 +-9.021147 +-9.017345 +-9.013542 +-9.009740 +-9.005938 +-9.002135 +-8.998333 +-8.994530 +-8.990728 +-8.986926 +-8.983123 +-8.979321 +-8.975519 +-8.971716 +-8.967914 +-8.964111 +-8.960309 +-8.956507 +-8.952704 +-8.948902 +-8.945100 +-8.941297 +-8.937495 +-8.933692 +-8.929890 +-8.926088 +-8.922285 +-8.918483 +-8.914680 +-8.910878 +-8.907076 +-8.903273 +-8.899471 +-8.895669 +-8.891866 +-8.888064 +-8.884261 +-8.880459 +-8.876657 +-8.872854 +-8.869052 +-8.865250 +-8.861447 +-8.857645 +-8.853842 +-8.850040 +-8.846238 +-8.842435 +-8.838633 +-8.834830 +-8.831028 +-8.827226 +-8.823423 +-8.819621 +-8.815819 +-8.812016 +-8.808214 +-8.804411 +-8.800609 +-8.796807 +-8.793004 +-8.789202 +-8.785400 +-8.781597 +-8.777795 +-8.773992 +-8.770190 +-8.766388 +-8.762585 +-8.758783 +-8.754980 +-8.751178 +-8.747376 +-8.743573 +-8.739771 +-8.735969 +-8.732166 +-8.728364 +-8.724561 +-8.720759 +-8.716957 +-8.713154 +-8.709352 +-8.705550 +-8.701747 +-8.697945 +-8.694142 +-8.690340 +-8.686538 +-8.682735 +-8.678933 +-8.675131 +-8.671328 +-8.667526 +-8.663723 +-8.659921 +-8.656119 +-8.652316 +-8.648514 +-8.644711 +-8.640909 +-8.637107 +-8.633304 +-8.629502 +-8.625700 +-8.621897 +-8.618095 +-8.614292 +-8.610490 +-8.606688 +-8.602885 +-8.599083 +-8.595281 +-8.591478 +-8.587676 +-8.583873 +-8.580071 +-8.576269 +-8.572466 +-8.568664 +-8.564861 +-8.561059 +-8.557257 +-8.553454 +-8.549652 +-8.545850 +-8.542047 +-8.538245 +-8.534442 +-8.530640 +-8.526838 +-8.523035 +-8.519233 +-8.515431 +-8.511628 +-8.507826 +-8.504023 +-8.500221 +-8.496419 +-8.492616 +-8.488814 +-8.485012 +-8.481209 +-8.477407 +-8.473604 +-8.469802 +-8.466000 +-8.462197 +-8.458395 +-8.454592 +-8.450790 +-8.446988 +-8.443185 +-8.439383 +-8.435581 +-8.431778 +-8.427976 +-8.424173 +-8.420371 +-8.416569 +-8.412766 +-8.408964 +-8.405162 +-8.401359 +-8.397557 +-8.393754 +-8.389952 +-8.386150 +-8.382347 +-8.378545 +-8.374742 +-8.370940 +-8.367138 +-8.363335 +-8.359533 +-8.355731 +-8.351928 +-8.348126 +-8.344323 +-8.340521 +-8.336719 +-8.332916 +-8.329114 +-8.325312 +-8.321509 +-8.317707 +-8.313904 +-8.310102 +-8.306300 +-8.302497 +-8.298695 +-8.294892 +-8.291090 +-8.287288 +-8.283485 +-8.279683 +-8.275881 +-8.272078 +-8.268276 +-8.264473 +-8.260671 +-8.256869 +-8.253066 +-8.249264 +-8.245462 +-8.241659 +-8.237857 +-8.234054 +-8.230252 +-8.226450 +-8.222647 +-8.218845 +-8.215043 +-8.211240 +-8.207438 +-8.203635 +-8.199833 +-8.196031 +-8.192228 +-8.188426 +-8.184623 +-8.180821 +-8.177019 +-8.173216 +-8.169414 +-8.165612 +-8.161809 +-8.158007 +-8.154204 +-8.150402 +-8.146600 +-8.142797 +-8.138995 +-8.135193 +-8.131390 +-8.127588 +-8.123785 +-8.119983 +-8.116181 +-8.112378 +-8.108576 +-8.104773 +-8.100971 +-8.097169 +-8.093366 +-8.089564 +-8.085762 +-8.081959 +-8.078157 +-8.074354 +-8.070552 +-8.066750 +-8.062947 +-8.059145 +-8.055343 +-8.051540 +-8.047738 +-8.043935 +-8.040133 +-8.036331 +-8.032528 +-8.028726 +-8.024923 +-8.021121 +-8.017319 +-8.013516 +-8.009714 +-8.005912 +-8.002109 +-7.998307 +-7.994504 +-7.990702 +-7.986900 +-7.983097 +-7.979295 +-7.975493 +-7.971690 +-7.967888 +-7.964085 +-7.960283 +-7.956481 +-7.952678 +-7.948876 +-7.945074 +-7.941271 +-7.937469 +-7.933666 +-7.929864 +-7.926062 +-7.922259 +-7.918457 +-7.914654 +-7.910852 +-7.907050 +-7.903247 +-7.899445 +-7.895643 +-7.891840 +-7.888038 +-7.884235 +-7.880433 +-7.876631 +-7.872828 +-7.869026 +-7.865224 +-7.861421 +-7.857619 +-7.853816 +-7.850014 +-7.846212 +-7.842409 +-7.838607 +-7.834804 +-7.831002 +-7.827200 +-7.823397 +-7.819595 +-7.815793 +-7.811990 +-7.808188 +-7.804385 +-7.800583 +-7.796781 +-7.792978 +-7.789176 +-7.785374 +-7.781571 +-7.777769 +-7.773966 +-7.770164 +-7.766362 +-7.762559 +-7.758757 +-7.754954 +-7.751152 +-7.747350 +-7.743547 +-7.739745 +-7.735943 +-7.732140 +-7.728338 +-7.724535 +-7.720733 +-7.716931 +-7.713128 +-7.709326 +-7.705524 +-7.701721 +-7.697919 +-7.694116 +-7.690314 +-7.686512 +-7.682709 +-7.678907 +-7.675105 +-7.671302 +-7.667500 +-7.663697 +-7.659895 +-7.656093 +-7.652290 +-7.648488 +-7.644685 +-7.640883 +-7.637081 +-7.633278 +-7.629476 +-7.625674 +-7.621871 +-7.618069 +-7.614266 +-7.610464 +-7.606662 +-7.602859 +-7.599057 +-7.595255 +-7.591452 +-7.587650 +-7.583847 +-7.580045 +-7.576243 +-7.572440 +-7.568638 +-7.564835 +-7.561033 +-7.557231 +-7.553428 +-7.549626 +-7.545824 +-7.542021 +-7.538219 +-7.534416 +-7.530614 +-7.526812 +-7.523009 +-7.519207 +-7.515405 +-7.511602 +-7.507800 +-7.503997 +-7.500195 +-7.496393 +-7.492590 +-7.488788 +-7.484985 +-7.481183 +-7.477381 +-7.473578 +-7.469776 +-7.465974 +-7.462171 +-7.458369 +-7.454566 +-7.450764 +-7.446962 +-7.443159 +-7.439357 +-7.435555 +-7.431752 +-7.427950 +-7.424147 +-7.420345 +-7.416543 +-7.412740 +-7.408938 +-7.405136 +-7.401333 +-7.397531 +-7.393728 +-7.389926 +-7.386124 +-7.382321 +-7.378519 +-7.374716 +-7.370914 +-7.367112 +-7.363309 +-7.359507 +-7.355705 +-7.351902 +-7.348100 +-7.344297 +-7.340495 +-7.336693 +-7.332890 +-7.329088 +-7.325286 +-7.321483 +-7.317681 +-7.313878 +-7.310076 +-7.306274 +-7.302471 +-7.298669 +-7.294866 +-7.291064 +-7.287262 +-7.283459 +-7.279657 +-7.275855 +-7.272052 +-7.268250 +-7.264447 +-7.260645 +-7.256843 +-7.253040 +-7.249238 +-7.245436 +-7.241633 +-7.237831 +-7.234028 +-7.230226 +-7.226424 +-7.222621 +-7.218819 +-7.215017 +-7.211214 +-7.207412 +-7.203609 +-7.199807 +-7.196005 +-7.192202 +-7.188400 +-7.184597 +-7.180795 +-7.176993 +-7.173190 +-7.169388 +-7.165586 +-7.161783 +-7.157981 +-7.154178 +-7.150376 +-7.146574 +-7.142771 +-7.138969 +-7.135167 +-7.131364 +-7.127562 +-7.123759 +-7.119957 +-7.116155 +-7.112352 +-7.108550 +-7.104747 +-7.100945 +-7.097143 +-7.093340 +-7.089538 +-7.085736 +-7.081933 +-7.078131 +-7.074328 +-7.070526 +-7.066724 +-7.062921 +-7.059119 +-7.055317 +-7.051514 +-7.047712 +-7.043909 +-7.040107 +-7.036305 +-7.032502 +-7.028700 +-7.024897 +-7.021095 +-7.017293 +-7.013490 +-7.009688 +-7.005886 +-7.002083 +-6.998281 +-6.994478 +-6.990676 +-6.986874 +-6.983071 +-6.979269 +-6.975467 +-6.971664 +-6.967862 +-6.964059 +-6.960257 +-6.956455 +-6.952652 +-6.948850 +-6.945048 +-6.941245 +-6.937443 +-6.933640 +-6.929838 +-6.926036 +-6.922233 +-6.918431 +-6.914628 +-6.910826 +-6.907024 +-6.903221 +-6.899419 +-6.895617 +-6.891814 +-6.888012 +-6.884209 +-6.880407 +-6.876605 +-6.872802 +-6.869000 +-6.865198 +-6.861395 +-6.857593 +-6.853790 +-6.849988 +-6.846186 +-6.842383 +-6.838581 +-6.834778 +-6.830976 +-6.827174 +-6.823371 +-6.819569 +-6.815767 +-6.811964 +-6.808162 +-6.804359 +-6.800557 +-6.796755 +-6.792952 +-6.789150 +-6.785348 +-6.781545 +-6.777743 +-6.773940 +-6.770138 +-6.766336 +-6.762533 +-6.758731 +-6.754928 +-6.751126 +-6.747324 +-6.743521 +-6.739719 +-6.735917 +-6.732114 +-6.728312 +-6.724509 +-6.720707 +-6.716905 +-6.713102 +-6.709300 +-6.705498 +-6.701695 +-6.697893 +-6.694090 +-6.690288 +-6.686486 +-6.682683 +-6.678881 +-6.675079 +-6.671276 +-6.667474 +-6.663671 +-6.659869 +-6.656067 +-6.652264 +-6.648462 +-6.644659 +-6.640857 +-6.637055 +-6.633252 +-6.629450 +-6.625648 +-6.621845 +-6.618043 +-6.614240 +-6.610438 +-6.606636 +-6.602833 +-6.599031 +-6.595229 +-6.591426 +-6.587624 +-6.583821 +-6.580019 +-6.576217 +-6.572414 +-6.568612 +-6.564809 +-6.561007 +-6.557205 +-6.553402 +-6.549600 +-6.545798 +-6.541995 +-6.538193 +-6.534390 +-6.530588 +-6.526786 +-6.522983 +-6.519181 +-6.515379 +-6.511576 +-6.507774 +-6.503971 +-6.500169 +-6.496367 +-6.492564 +-6.488762 +-6.484959 +-6.481157 +-6.477355 +-6.473552 +-6.469750 +-6.465948 +-6.462145 +-6.458343 +-6.454540 +-6.450738 +-6.446936 +-6.443133 +-6.439331 +-6.435529 +-6.431726 +-6.427924 +-6.424121 +-6.420319 +-6.416517 +-6.412714 +-6.408912 +-6.405110 +-6.401307 +-6.397505 +-6.393702 +-6.389900 +-6.386098 +-6.382295 +-6.378493 +-6.374690 +-6.370888 +-6.367086 +-6.363283 +-6.359481 +-6.355679 +-6.351876 +-6.348074 +-6.344271 +-6.340469 +-6.336667 +-6.332864 +-6.329062 +-6.325260 +-6.321457 +-6.317655 +-6.313852 +-6.310050 +-6.306248 +-6.302445 +-6.298643 +-6.294840 +-6.291038 +-6.287236 +-6.283433 +-6.279631 +-6.275829 +-6.272026 +-6.268224 +-6.264421 +-6.260619 +-6.256817 +-6.253014 +-6.249212 +-6.245410 +-6.241607 +-6.237805 +-6.234002 +-6.230200 +-6.226398 +-6.222595 +-6.218793 +-6.214990 +-6.211188 +-6.207386 +-6.203583 +-6.199781 +-6.195979 +-6.192176 +-6.188374 +-6.184571 +-6.180769 +-6.176967 +-6.173164 +-6.169362 +-6.165560 +-6.161757 +-6.157955 +-6.154152 +-6.150350 +-6.146548 +-6.142745 +-6.138943 +-6.135141 +-6.131338 +-6.127536 +-6.123733 +-6.119931 +-6.116129 +-6.112326 +-6.108524 +-6.104721 +-6.100919 +-6.097117 +-6.093314 +-6.089512 +-6.085710 +-6.081907 +-6.078105 +-6.074302 +-6.070500 +-6.066698 +-6.062895 +-6.059093 +-6.055291 +-6.051488 +-6.047686 +-6.043883 +-6.040081 +-6.036279 +-6.032476 +-6.028674 +-6.024871 +-6.021069 +-6.017267 +-6.013464 +-6.009662 +-6.005860 +-6.002057 +-5.998255 +-5.994452 +-5.990650 +-5.986848 +-5.983045 +-5.979243 +-5.975441 +-5.971638 +-5.967836 +-5.964033 +-5.960231 +-5.956429 +-5.952626 +-5.948824 +-5.945022 +-5.941219 +-5.937417 +-5.933614 +-5.929812 +-5.926010 +-5.922207 +-5.918405 +-5.914602 +-5.910800 +-5.906998 +-5.903195 +-5.899393 +-5.895591 +-5.891788 +-5.887986 +-5.884183 +-5.880381 +-5.876579 +-5.872776 +-5.868974 +-5.865172 +-5.861369 +-5.857567 +-5.853764 +-5.849962 +-5.846160 +-5.842357 +-5.838555 +-5.834752 +-5.830950 +-5.827148 +-5.823345 +-5.819543 +-5.815741 +-5.811938 +-5.808136 +-5.804333 +-5.800531 +-5.796729 +-5.792926 +-5.789124 +-5.785322 +-5.781519 +-5.777717 +-5.773914 +-5.770112 +-5.766310 +-5.762507 +-5.758705 +-5.754902 +-5.751100 +-5.747298 +-5.743495 +-5.739693 +-5.735891 +-5.732088 +-5.728286 +-5.724483 +-5.720681 +-5.716879 +-5.713076 +-5.709274 +-5.705472 +-5.701669 +-5.697867 +-5.694064 +-5.690262 +-5.686460 +-5.682657 +-5.678855 +-5.675053 +-5.671250 +-5.667448 +-5.663645 +-5.659843 +-5.656041 +-5.652238 +-5.648436 +-5.644633 +-5.640831 +-5.637029 +-5.633226 +-5.629424 +-5.625622 +-5.621819 +-5.618017 +-5.614214 +-5.610412 +-5.606610 +-5.602807 +-5.599005 +-5.595203 +-5.591400 +-5.587598 +-5.583795 +-5.579993 +-5.576191 +-5.572388 +-5.568586 +-5.564783 +-5.560981 +-5.557179 +-5.553376 +-5.549574 +-5.545772 +-5.541969 +-5.538167 +-5.534364 +-5.530562 +-5.526760 +-5.522957 +-5.519155 +-5.515353 +-5.511550 +-5.507748 +-5.503945 +-5.500143 +-5.496341 +-5.492538 +-5.488736 +-5.484933 +-5.481131 +-5.477329 +-5.473526 +-5.469724 +-5.465922 +-5.462119 +-5.458317 +-5.454514 +-5.450712 +-5.446910 +-5.443107 +-5.439305 +-5.435503 +-5.431700 +-5.427898 +-5.424095 +-5.420293 +-5.416491 +-5.412688 +-5.408886 +-5.405084 +-5.401281 +-5.397479 +-5.393676 +-5.389874 +-5.386072 +-5.382269 +-5.378467 +-5.374664 +-5.370862 +-5.367060 +-5.363257 +-5.359455 +-5.355653 +-5.351850 +-5.348048 +-5.344245 +-5.340443 +-5.336641 +-5.332838 +-5.329036 +-5.325234 +-5.321431 +-5.317629 +-5.313826 +-5.310024 +-5.306222 +-5.302419 +-5.298617 +-5.294814 +-5.291012 +-5.287210 +-5.283407 +-5.279605 +-5.275803 +-5.272000 +-5.268198 +-5.264395 +-5.260593 +-5.256791 +-5.252988 +-5.249186 +-5.245384 +-5.241581 +-5.237779 +-5.233976 +-5.230174 +-5.226372 +-5.222569 +-5.218767 +-5.214964 +-5.211162 +-5.207360 +-5.203557 +-5.199755 +-5.195953 +-5.192150 +-5.188348 +-5.184545 +-5.180743 +-5.176941 +-5.173138 +-5.169336 +-5.165534 +-5.161731 +-5.157929 +-5.154126 +-5.150324 +-5.146522 +-5.142719 +-5.138917 +-5.135115 +-5.131312 +-5.127510 +-5.123707 +-5.119905 +-5.116103 +-5.112300 +-5.108498 +-5.104695 +-5.100893 +-5.097091 +-5.093288 +-5.089486 +-5.085684 +-5.081881 +-5.078079 +-5.074276 +-5.070474 +-5.066672 +-5.062869 +-5.059067 +-5.055265 +-5.051462 +-5.047660 +-5.043857 +-5.040055 +-5.036253 +-5.032450 +-5.028648 +-5.024845 +-5.021043 +-5.017241 +-5.013438 +-5.009636 +-5.005834 +-5.002031 +-4.998229 +-4.994426 +-4.990624 +-4.986822 +-4.983019 +-4.979217 +-4.975415 +-4.971612 +-4.967810 +-4.964007 +-4.960205 +-4.956403 +-4.952600 +-4.948798 +-4.944995 +-4.941193 +-4.937391 +-4.933588 +-4.929786 +-4.925984 +-4.922181 +-4.918379 +-4.914576 +-4.910774 +-4.906972 +-4.903169 +-4.899367 +-4.895565 +-4.891762 +-4.887960 +-4.884157 +-4.880355 +-4.876553 +-4.872750 +-4.868948 +-4.865146 +-4.861343 +-4.857541 +-4.853738 +-4.849936 +-4.846134 +-4.842331 +-4.838529 +-4.834726 +-4.830924 +-4.827122 +-4.823319 +-4.819517 +-4.815715 +-4.811912 +-4.808110 +-4.804307 +-4.800505 +-4.796703 +-4.792900 +-4.789098 +-4.785296 +-4.781493 +-4.777691 +-4.773888 +-4.770086 +-4.766284 +-4.762481 +-4.758679 +-4.754876 +-4.751074 +-4.747272 +-4.743469 +-4.739667 +-4.735865 +-4.732062 +-4.728260 +-4.724457 +-4.720655 +-4.716853 +-4.713050 +-4.709248 +-4.705446 +-4.701643 +-4.697841 +-4.694038 +-4.690236 +-4.686434 +-4.682631 +-4.678829 +-4.675027 +-4.671224 +-4.667422 +-4.663619 +-4.659817 +-4.656015 +-4.652212 +-4.648410 +-4.644607 +-4.640805 +-4.637003 +-4.633200 +-4.629398 +-4.625596 +-4.621793 +-4.617991 +-4.614188 +-4.610386 +-4.606584 +-4.602781 +-4.598979 +-4.595177 +-4.591374 +-4.587572 +-4.583769 +-4.579967 +-4.576165 +-4.572362 +-4.568560 +-4.564757 +-4.560955 +-4.557153 +-4.553350 +-4.549548 +-4.545746 +-4.541943 +-4.538141 +-4.534338 +-4.530536 +-4.526734 +-4.522931 +-4.519129 +-4.515327 +-4.511524 +-4.507722 +-4.503919 +-4.500117 +-4.496315 +-4.492512 +-4.488710 +-4.484907 +-4.481105 +-4.477303 +-4.473500 +-4.469698 +-4.465896 +-4.462093 +-4.458291 +-4.454488 +-4.450686 +-4.446884 +-4.443081 +-4.439279 +-4.435477 +-4.431674 +-4.427872 +-4.424069 +-4.420267 +-4.416465 +-4.412662 +-4.408860 +-4.405058 +-4.401255 +-4.397453 +-4.393650 +-4.389848 +-4.386046 +-4.382243 +-4.378441 +-4.374638 +-4.370836 +-4.367034 +-4.363231 +-4.359429 +-4.355627 +-4.351824 +-4.348022 +-4.344219 +-4.340417 +-4.336615 +-4.332812 +-4.329010 +-4.325208 +-4.321405 +-4.317603 +-4.313800 +-4.309998 +-4.306196 +-4.302393 +-4.298591 +-4.294788 +-4.290986 +-4.287184 +-4.283381 +-4.279579 +-4.275777 +-4.271974 +-4.268172 +-4.264369 +-4.260567 +-4.256765 +-4.252962 +-4.249160 +-4.245358 +-4.241555 +-4.237753 +-4.233950 +-4.230148 +-4.226346 +-4.222543 +-4.218741 +-4.214938 +-4.211136 +-4.207334 +-4.203531 +-4.199729 +-4.195927 +-4.192124 +-4.188322 +-4.184519 +-4.180717 +-4.176915 +-4.173112 +-4.169310 +-4.165508 +-4.161705 +-4.157903 +-4.154100 +-4.150298 +-4.146496 +-4.142693 +-4.138891 +-4.135089 +-4.131286 +-4.127484 +-4.123681 +-4.119879 +-4.116077 +-4.112274 +-4.108472 +-4.104669 +-4.100867 +-4.097065 +-4.093262 +-4.089460 +-4.085658 +-4.081855 +-4.078053 +-4.074250 +-4.070448 +-4.066646 +-4.062843 +-4.059041 +-4.055239 +-4.051436 +-4.047634 +-4.043831 +-4.040029 +-4.036227 +-4.032424 +-4.028622 +-4.024819 +-4.021017 +-4.017215 +-4.013412 +-4.009610 +-4.005808 +-4.002005 +-3.998203 +-3.994400 +-3.990598 +-3.986796 +-3.982993 +-3.979191 +-3.975389 +-3.971586 +-3.967784 +-3.963981 +-3.960179 +-3.956377 +-3.952574 +-3.948772 +-3.944969 +-3.941167 +-3.937365 +-3.933562 +-3.929760 +-3.925958 +-3.922155 +-3.918353 +-3.914550 +-3.910748 +-3.906946 +-3.903143 +-3.899341 +-3.895539 +-3.891736 +-3.887934 +-3.884131 +-3.880329 +-3.876527 +-3.872724 +-3.868922 +-3.865120 +-3.861317 +-3.857515 +-3.853712 +-3.849910 +-3.846108 +-3.842305 +-3.838503 +-3.834700 +-3.830898 +-3.827096 +-3.823293 +-3.819491 +-3.815689 +-3.811886 +-3.808084 +-3.804281 +-3.800479 +-3.796677 +-3.792874 +-3.789072 +-3.785270 +-3.781467 +-3.777665 +-3.773862 +-3.770060 +-3.766258 +-3.762455 +-3.758653 +-3.754850 +-3.751048 +-3.747246 +-3.743443 +-3.739641 +-3.735839 +-3.732036 +-3.728234 +-3.724431 +-3.720629 +-3.716827 +-3.713024 +-3.709222 +-3.705420 +-3.701617 +-3.697815 +-3.694012 +-3.690210 +-3.686408 +-3.682605 +-3.678803 +-3.675001 +-3.671198 +-3.667396 +-3.663593 +-3.659791 +-3.655989 +-3.652186 +-3.648384 +-3.644581 +-3.640779 +-3.636977 +-3.633174 +-3.629372 +-3.625570 +-3.621767 +-3.617965 +-3.614162 +-3.610360 +-3.606558 +-3.602755 +-3.598953 +-3.595151 +-3.591348 +-3.587546 +-3.583743 +-3.579941 +-3.576139 +-3.572336 +-3.568534 +-3.564731 +-3.560929 +-3.557127 +-3.553324 +-3.549522 +-3.545720 +-3.541917 +-3.538115 +-3.534312 +-3.530510 +-3.526708 +-3.522905 +-3.519103 +-3.515301 +-3.511498 +-3.507696 +-3.503893 +-3.500091 +-3.496289 +-3.492486 +-3.488684 +-3.484881 +-3.481079 +-3.477277 +-3.473474 +-3.469672 +-3.465870 +-3.462067 +-3.458265 +-3.454462 +-3.450660 +-3.446858 +-3.443055 +-3.439253 +-3.435451 +-3.431648 +-3.427846 +-3.424043 +-3.420241 +-3.416439 +-3.412636 +-3.408834 +-3.405032 +-3.401229 +-3.397427 +-3.393624 +-3.389822 +-3.386020 +-3.382217 +-3.378415 +-3.374612 +-3.370810 +-3.367008 +-3.363205 +-3.359403 +-3.355601 +-3.351798 +-3.347996 +-3.344193 +-3.340391 +-3.336589 +-3.332786 +-3.328984 +-3.325182 +-3.321379 +-3.317577 +-3.313774 +-3.309972 +-3.306170 +-3.302367 +-3.298565 +-3.294762 +-3.290960 +-3.287158 +-3.283355 +-3.279553 +-3.275751 +-3.271948 +-3.268146 +-3.264343 +-3.260541 +-3.256739 +-3.252936 +-3.249134 +-3.245332 +-3.241529 +-3.237727 +-3.233924 +-3.230122 +-3.226320 +-3.222517 +-3.218715 +-3.214912 +-3.211110 +-3.207308 +-3.203505 +-3.199703 +-3.195901 +-3.192098 +-3.188296 +-3.184493 +-3.180691 +-3.176889 +-3.173086 +-3.169284 +-3.165482 +-3.161679 +-3.157877 +-3.154074 +-3.150272 +-3.146470 +-3.142667 +-3.138865 +-3.135063 +-3.131260 +-3.127458 +-3.123655 +-3.119853 +-3.116051 +-3.112248 +-3.108446 +-3.104643 +-3.100841 +-3.097039 +-3.093236 +-3.089434 +-3.085632 +-3.081829 +-3.078027 +-3.074224 +-3.070422 +-3.066620 +-3.062817 +-3.059015 +-3.055213 +-3.051410 +-3.047608 +-3.043805 +-3.040003 +-3.036201 +-3.032398 +-3.028596 +-3.024793 +-3.020991 +-3.017189 +-3.013386 +-3.009584 +-3.005782 +-3.001979 +-2.998177 +-2.994374 +-2.990572 +-2.986770 +-2.982967 +-2.979165 +-2.975363 +-2.971560 +-2.967758 +-2.963955 +-2.960153 +-2.956351 +-2.952548 +-2.948746 +-2.944943 +-2.941141 +-2.937339 +-2.933536 +-2.929734 +-2.925932 +-2.922129 +-2.918327 +-2.914524 +-2.910722 +-2.906920 +-2.903117 +-2.899315 +-2.895513 +-2.891710 +-2.887908 +-2.884105 +-2.880303 +-2.876501 +-2.872698 +-2.868896 +-2.865094 +-2.861291 +-2.857489 +-2.853686 +-2.849884 +-2.846082 +-2.842279 +-2.838477 +-2.834674 +-2.830872 +-2.827070 +-2.823267 +-2.819465 +-2.815663 +-2.811860 +-2.808058 +-2.804255 +-2.800453 +-2.796651 +-2.792848 +-2.789046 +-2.785244 +-2.781441 +-2.777639 +-2.773836 +-2.770034 +-2.766232 +-2.762429 +-2.758627 +-2.754824 +-2.751022 +-2.747220 +-2.743417 +-2.739615 +-2.735813 +-2.732010 +-2.728208 +-2.724405 +-2.720603 +-2.716801 +-2.712998 +-2.709196 +-2.705394 +-2.701591 +-2.697789 +-2.693986 +-2.690184 +-2.686382 +-2.682579 +-2.678777 +-2.674974 +-2.671172 +-2.667370 +-2.663567 +-2.659765 +-2.655963 +-2.652160 +-2.648358 +-2.644555 +-2.640753 +-2.636951 +-2.633148 +-2.629346 +-2.625544 +-2.621741 +-2.617939 +-2.614136 +-2.610334 +-2.606532 +-2.602729 +-2.598927 +-2.595125 +-2.591322 +-2.587520 +-2.583717 +-2.579915 +-2.576113 +-2.572310 +-2.568508 +-2.564705 +-2.560903 +-2.557101 +-2.553298 +-2.549496 +-2.545694 +-2.541891 +-2.538089 +-2.534286 +-2.530484 +-2.526682 +-2.522879 +-2.519077 +-2.515275 +-2.511472 +-2.507670 +-2.503867 +-2.500065 +-2.496263 +-2.492460 +-2.488658 +-2.484855 +-2.481053 +-2.477251 +-2.473448 +-2.469646 +-2.465844 +-2.462041 +-2.458239 +-2.454436 +-2.450634 +-2.446832 +-2.443029 +-2.439227 +-2.435425 +-2.431622 +-2.427820 +-2.424017 +-2.420215 +-2.416413 +-2.412610 +-2.408808 +-2.405006 +-2.401203 +-2.397401 +-2.393598 +-2.389796 +-2.385994 +-2.382191 +-2.378389 +-2.374586 +-2.370784 +-2.366982 +-2.363179 +-2.359377 +-2.355575 +-2.351772 +-2.347970 +-2.344167 +-2.340365 +-2.336563 +-2.332760 +-2.328958 +-2.325156 +-2.321353 +-2.317551 +-2.313748 +-2.309946 +-2.306144 +-2.302341 +-2.298539 +-2.294736 +-2.290934 +-2.287132 +-2.283329 +-2.279527 +-2.275725 +-2.271922 +-2.268120 +-2.264317 +-2.260515 +-2.256713 +-2.252910 +-2.249108 +-2.245306 +-2.241503 +-2.237701 +-2.233898 +-2.230096 +-2.226294 +-2.222491 +-2.218689 +-2.214886 +-2.211084 +-2.207282 +-2.203479 +-2.199677 +-2.195875 +-2.192072 +-2.188270 +-2.184467 +-2.180665 +-2.176863 +-2.173060 +-2.169258 +-2.165456 +-2.161653 +-2.157851 +-2.154048 +-2.150246 +-2.146444 +-2.142641 +-2.138839 +-2.135037 +-2.131234 +-2.127432 +-2.123629 +-2.119827 +-2.116025 +-2.112222 +-2.108420 +-2.104617 +-2.100815 +-2.097013 +-2.093210 +-2.089408 +-2.085606 +-2.081803 +-2.078001 +-2.074198 +-2.070396 +-2.066594 +-2.062791 +-2.058989 +-2.055187 +-2.051384 +-2.047582 +-2.043779 +-2.039977 +-2.036175 +-2.032372 +-2.028570 +-2.024767 +-2.020965 +-2.017163 +-2.013360 +-2.009558 +-2.005756 +-2.001953 +-1.998151 +-1.994348 +-1.990546 +-1.986744 +-1.982941 +-1.979139 +-1.975337 +-1.971534 +-1.967732 +-1.963929 +-1.960127 +-1.956325 +-1.952522 +-1.948720 +-1.944917 +-1.941115 +-1.937313 +-1.933510 +-1.929708 +-1.925906 +-1.922103 +-1.918301 +-1.914498 +-1.910696 +-1.906894 +-1.903091 +-1.899289 +-1.895487 +-1.891684 +-1.887882 +-1.884079 +-1.880277 +-1.876475 +-1.872672 +-1.868870 +-1.865068 +-1.861265 +-1.857463 +-1.853660 +-1.849858 +-1.846056 +-1.842253 +-1.838451 +-1.834648 +-1.830846 +-1.827044 +-1.823241 +-1.819439 +-1.815637 +-1.811834 +-1.808032 +-1.804229 +-1.800427 +-1.796625 +-1.792822 +-1.789020 +-1.785218 +-1.781415 +-1.777613 +-1.773810 +-1.770008 +-1.766206 +-1.762403 +-1.758601 +-1.754798 +-1.750996 +-1.747194 +-1.743391 +-1.739589 +-1.735787 +-1.731984 +-1.728182 +-1.724379 +-1.720577 +-1.716775 +-1.712972 +-1.709170 +-1.705368 +-1.701565 +-1.697763 +-1.693960 +-1.690158 +-1.686356 +-1.682553 +-1.678751 +-1.674948 +-1.671146 +-1.667344 +-1.663541 +-1.659739 +-1.655937 +-1.652134 +-1.648332 +-1.644529 +-1.640727 +-1.636925 +-1.633122 +-1.629320 +-1.625518 +-1.621715 +-1.617913 +-1.614110 +-1.610308 +-1.606506 +-1.602703 +-1.598901 +-1.595099 +-1.591296 +-1.587494 +-1.583691 +-1.579889 +-1.576087 +-1.572284 +-1.568482 +-1.564679 +-1.560877 +-1.557075 +-1.553272 +-1.549470 +-1.545668 +-1.541865 +-1.538063 +-1.534260 +-1.530458 +-1.526656 +-1.522853 +-1.519051 +-1.515249 +-1.511446 +-1.507644 +-1.503841 +-1.500039 +-1.496237 +-1.492434 +-1.488632 +-1.484829 +-1.481027 +-1.477225 +-1.473422 +-1.469620 +-1.465818 +-1.462015 +-1.458213 +-1.454410 +-1.450608 +-1.446806 +-1.443003 +-1.439201 +-1.435399 +-1.431596 +-1.427794 +-1.423991 +-1.420189 +-1.416387 +-1.412584 +-1.408782 +-1.404979 +-1.401177 +-1.397375 +-1.393572 +-1.389770 +-1.385968 +-1.382165 +-1.378363 +-1.374560 +-1.370758 +-1.366956 +-1.363153 +-1.359351 +-1.355549 +-1.351746 +-1.347944 +-1.344141 +-1.340339 +-1.336537 +-1.332734 +-1.328932 +-1.325130 +-1.321327 +-1.317525 +-1.313722 +-1.309920 +-1.306118 +-1.302315 +-1.298513 +-1.294710 +-1.290908 +-1.287106 +-1.283303 +-1.279501 +-1.275699 +-1.271896 +-1.268094 +-1.264291 +-1.260489 +-1.256687 +-1.252884 +-1.249082 +-1.245280 +-1.241477 +-1.237675 +-1.233872 +-1.230070 +-1.226268 +-1.222465 +-1.218663 +-1.214860 +-1.211058 +-1.207256 +-1.203453 +-1.199651 +-1.195849 +-1.192046 +-1.188244 +-1.184441 +-1.180639 +-1.176837 +-1.173034 +-1.169232 +-1.165430 +-1.161627 +-1.157825 +-1.154022 +-1.150220 +-1.146418 +-1.142615 +-1.138813 +-1.135011 +-1.131208 +-1.127406 +-1.123603 +-1.119801 +-1.115999 +-1.112196 +-1.108394 +-1.104591 +-1.100789 +-1.096987 +-1.093184 +-1.089382 +-1.085580 +-1.081777 +-1.077975 +-1.074172 +-1.070370 +-1.066568 +-1.062765 +-1.058963 +-1.055161 +-1.051358 +-1.047556 +-1.043753 +-1.039951 +-1.036149 +-1.032346 +-1.028544 +-1.024741 +-1.020939 +-1.017137 +-1.013334 +-1.009532 +-1.005730 +-1.001927 +-0.998125 +-0.994322 +-0.990520 +-0.986718 +-0.982915 +-0.979113 +-0.975311 +-0.971508 +-0.967706 +-0.963903 +-0.960101 +-0.956299 +-0.952496 +-0.948694 +-0.944891 +-0.941089 +-0.937287 +-0.933484 +-0.929682 +-0.925880 +-0.922077 +-0.918275 +-0.914472 +-0.910670 +-0.906868 +-0.903065 +-0.899263 +-0.895461 +-0.891658 +-0.887856 +-0.884053 +-0.880251 +-0.876449 +-0.872646 +-0.868844 +-0.865042 +-0.861239 +-0.857437 +-0.853634 +-0.849832 +-0.846030 +-0.842227 +-0.838425 +-0.834622 +-0.830820 +-0.827018 +-0.823215 +-0.819413 +-0.815611 +-0.811808 +-0.808006 +-0.804203 +-0.800401 +-0.796599 +-0.792796 +-0.788994 +-0.785192 +-0.781389 +-0.777587 +-0.773784 +-0.769982 +-0.766180 +-0.762377 +-0.758575 +-0.754772 +-0.750970 +-0.747168 +-0.743365 +-0.739563 +-0.735761 +-0.731958 +-0.728156 +-0.724353 +-0.720551 +-0.716749 +-0.712946 +-0.709144 +-0.705342 +-0.701539 +-0.697737 +-0.693934 +-0.690132 +-0.686330 +-0.682527 +-0.678725 +-0.674922 +-0.671120 +-0.667318 +-0.663515 +-0.659713 +-0.655911 +-0.652108 +-0.648306 +-0.644503 +-0.640701 +-0.636899 +-0.633096 +-0.629294 +-0.625492 +-0.621689 +-0.617887 +-0.614084 +-0.610282 +-0.606480 +-0.602677 +-0.598875 +-0.595073 +-0.591270 +-0.587468 +-0.583665 +-0.579863 +-0.576061 +-0.572258 +-0.568456 +-0.564653 +-0.560851 +-0.557049 +-0.553246 +-0.549444 +-0.545642 +-0.541839 +-0.538037 +-0.534234 +-0.530432 +-0.526630 +-0.522827 +-0.519025 +-0.515223 +-0.511420 +-0.507618 +-0.503815 +-0.500013 +-0.496211 +-0.492408 +-0.488606 +-0.484803 +-0.481001 +-0.477199 +-0.473396 +-0.469594 +-0.465792 +-0.461989 +-0.458187 +-0.454384 +-0.450582 +-0.446780 +-0.442977 +-0.439175 +-0.435373 +-0.431570 +-0.427768 +-0.423965 +-0.420163 +-0.416361 +-0.412558 +-0.408756 +-0.404953 +-0.401151 +-0.397349 +-0.393546 +-0.389744 +-0.385942 +-0.382139 +-0.378337 +-0.374534 +-0.370732 +-0.366930 +-0.363127 +-0.359325 +-0.355523 +-0.351720 +-0.347918 +-0.344115 +-0.340313 +-0.336511 +-0.332708 +-0.328906 +-0.325104 +-0.321301 +-0.317499 +-0.313696 +-0.309894 +-0.306092 +-0.302289 +-0.298487 +-0.294684 +-0.290882 +-0.287080 +-0.283277 +-0.279475 +-0.275673 +-0.271870 +-0.268068 +-0.264265 +-0.260463 +-0.256661 +-0.252858 +-0.249056 +-0.245254 +-0.241451 +-0.237649 +-0.233846 +-0.230044 +-0.226242 +-0.222439 +-0.218637 +-0.214834 +-0.211032 +-0.207230 +-0.203427 +-0.199625 +-0.195823 +-0.192020 +-0.188218 +-0.184415 +-0.180613 +-0.176811 +-0.173008 +-0.169206 +-0.165404 +-0.161601 +-0.157799 +-0.153996 +-0.150194 +-0.146392 +-0.142589 +-0.138787 +-0.134984 +-0.131182 +-0.127380 +-0.123577 +-0.119775 +-0.115973 +-0.112170 +-0.108368 +-0.104565 +-0.100763 +-0.096961 +-0.093158 +-0.089356 +-0.085554 +-0.081751 +-0.077949 +-0.074146 +-0.070344 +-0.066542 +-0.062739 +-0.058937 +-0.055135 +-0.051332 +-0.047530 +-0.043727 +-0.039925 +-0.036123 +-0.032320 +-0.028518 +-0.024715 +-0.020913 +-0.017111 +-0.013308 +-0.009506 +-0.005704 +-0.001901 +0.001901 +0.005704 +0.009506 +0.013308 +0.017111 +0.020913 +0.024715 +0.028518 +0.032320 +0.036123 +0.039925 +0.043727 +0.047530 +0.051332 +0.055135 +0.058937 +0.062739 +0.066542 +0.070344 +0.074146 +0.077949 +0.081751 +0.085554 +0.089356 +0.093158 +0.096961 +0.100763 +0.104565 +0.108368 +0.112170 +0.115973 +0.119775 +0.123577 +0.127380 +0.131182 +0.134984 +0.138787 +0.142589 +0.146392 +0.150194 +0.153996 +0.157799 +0.161601 +0.165404 +0.169206 +0.173008 +0.176811 +0.180613 +0.184415 +0.188218 +0.192020 +0.195823 +0.199625 +0.203427 +0.207230 +0.211032 +0.214834 +0.218637 +0.222439 +0.226242 +0.230044 +0.233846 +0.237649 +0.241451 +0.245254 +0.249056 +0.252858 +0.256661 +0.260463 +0.264265 +0.268068 +0.271870 +0.275673 +0.279475 +0.283277 +0.287080 +0.290882 +0.294684 +0.298487 +0.302289 +0.306092 +0.309894 +0.313696 +0.317499 +0.321301 +0.325104 +0.328906 +0.332708 +0.336511 +0.340313 +0.344115 +0.347918 +0.351720 +0.355523 +0.359325 +0.363127 +0.366930 +0.370732 +0.374534 +0.378337 +0.382139 +0.385942 +0.389744 +0.393546 +0.397349 +0.401151 +0.404953 +0.408756 +0.412558 +0.416361 +0.420163 +0.423965 +0.427768 +0.431570 +0.435373 +0.439175 +0.442977 +0.446780 +0.450582 +0.454384 +0.458187 +0.461989 +0.465792 +0.469594 +0.473396 +0.477199 +0.481001 +0.484803 +0.488606 +0.492408 +0.496211 +0.500013 +0.503815 +0.507618 +0.511420 +0.515223 +0.519025 +0.522827 +0.526630 +0.530432 +0.534234 +0.538037 +0.541839 +0.545642 +0.549444 +0.553246 +0.557049 +0.560851 +0.564653 +0.568456 +0.572258 +0.576061 +0.579863 +0.583665 +0.587468 +0.591270 +0.595073 +0.598875 +0.602677 +0.606480 +0.610282 +0.614084 +0.617887 +0.621689 +0.625492 +0.629294 +0.633096 +0.636899 +0.640701 +0.644503 +0.648306 +0.652108 +0.655911 +0.659713 +0.663515 +0.667318 +0.671120 +0.674922 +0.678725 +0.682527 +0.686330 +0.690132 +0.693934 +0.697737 +0.701539 +0.705342 +0.709144 +0.712946 +0.716749 +0.720551 +0.724353 +0.728156 +0.731958 +0.735761 +0.739563 +0.743365 +0.747168 +0.750970 +0.754772 +0.758575 +0.762377 +0.766180 +0.769982 +0.773784 +0.777587 +0.781389 +0.785192 +0.788994 +0.792796 +0.796599 +0.800401 +0.804203 +0.808006 +0.811808 +0.815611 +0.819413 +0.823215 +0.827018 +0.830820 +0.834622 +0.838425 +0.842227 +0.846030 +0.849832 +0.853634 +0.857437 +0.861239 +0.865042 +0.868844 +0.872646 +0.876449 +0.880251 +0.884053 +0.887856 +0.891658 +0.895461 +0.899263 +0.903065 +0.906868 +0.910670 +0.914472 +0.918275 +0.922077 +0.925880 +0.929682 +0.933484 +0.937287 +0.941089 +0.944891 +0.948694 +0.952496 +0.956299 +0.960101 +0.963903 +0.967706 +0.971508 +0.975311 +0.979113 +0.982915 +0.986718 +0.990520 +0.994322 +0.998125 +1.001927 +1.005730 +1.009532 +1.013334 +1.017137 +1.020939 +1.024741 +1.028544 +1.032346 +1.036149 +1.039951 +1.043753 +1.047556 +1.051358 +1.055161 +1.058963 +1.062765 +1.066568 +1.070370 +1.074172 +1.077975 +1.081777 +1.085580 +1.089382 +1.093184 +1.096987 +1.100789 +1.104591 +1.108394 +1.112196 +1.115999 +1.119801 +1.123603 +1.127406 +1.131208 +1.135011 +1.138813 +1.142615 +1.146418 +1.150220 +1.154022 +1.157825 +1.161627 +1.165430 +1.169232 +1.173034 +1.176837 +1.180639 +1.184441 +1.188244 +1.192046 +1.195849 +1.199651 +1.203453 +1.207256 +1.211058 +1.214860 +1.218663 +1.222465 +1.226268 +1.230070 +1.233872 +1.237675 +1.241477 +1.245280 +1.249082 +1.252884 +1.256687 +1.260489 +1.264291 +1.268094 +1.271896 +1.275699 +1.279501 +1.283303 +1.287106 +1.290908 +1.294710 +1.298513 +1.302315 +1.306118 +1.309920 +1.313722 +1.317525 +1.321327 +1.325130 +1.328932 +1.332734 +1.336537 +1.340339 +1.344141 +1.347944 +1.351746 +1.355549 +1.359351 +1.363153 +1.366956 +1.370758 +1.374560 +1.378363 +1.382165 +1.385968 +1.389770 +1.393572 +1.397375 +1.401177 +1.404979 +1.408782 +1.412584 +1.416387 +1.420189 +1.423991 +1.427794 +1.431596 +1.435399 +1.439201 +1.443003 +1.446806 +1.450608 +1.454410 +1.458213 +1.462015 +1.465818 +1.469620 +1.473422 +1.477225 +1.481027 +1.484829 +1.488632 +1.492434 +1.496237 +1.500039 +1.503841 +1.507644 +1.511446 +1.515249 +1.519051 +1.522853 +1.526656 +1.530458 +1.534260 +1.538063 +1.541865 +1.545668 +1.549470 +1.553272 +1.557075 +1.560877 +1.564679 +1.568482 +1.572284 +1.576087 +1.579889 +1.583691 +1.587494 +1.591296 +1.595099 +1.598901 +1.602703 +1.606506 +1.610308 +1.614110 +1.617913 +1.621715 +1.625518 +1.629320 +1.633122 +1.636925 +1.640727 +1.644529 +1.648332 +1.652134 +1.655937 +1.659739 +1.663541 +1.667344 +1.671146 +1.674948 +1.678751 +1.682553 +1.686356 +1.690158 +1.693960 +1.697763 +1.701565 +1.705368 +1.709170 +1.712972 +1.716775 +1.720577 +1.724379 +1.728182 +1.731984 +1.735787 +1.739589 +1.743391 +1.747194 +1.750996 +1.754798 +1.758601 +1.762403 +1.766206 +1.770008 +1.773810 +1.777613 +1.781415 +1.785218 +1.789020 +1.792822 +1.796625 +1.800427 +1.804229 +1.808032 +1.811834 +1.815637 +1.819439 +1.823241 +1.827044 +1.830846 +1.834648 +1.838451 +1.842253 +1.846056 +1.849858 +1.853660 +1.857463 +1.861265 +1.865068 +1.868870 +1.872672 +1.876475 +1.880277 +1.884079 +1.887882 +1.891684 +1.895487 +1.899289 +1.903091 +1.906894 +1.910696 +1.914498 +1.918301 +1.922103 +1.925906 +1.929708 +1.933510 +1.937313 +1.941115 +1.944917 +1.948720 +1.952522 +1.956325 +1.960127 +1.963929 +1.967732 +1.971534 +1.975337 +1.979139 +1.982941 +1.986744 +1.990546 +1.994348 +1.998151 +2.001953 +2.005756 +2.009558 +2.013360 +2.017163 +2.020965 +2.024767 +2.028570 +2.032372 +2.036175 +2.039977 +2.043779 +2.047582 +2.051384 +2.055187 +2.058989 +2.062791 +2.066594 +2.070396 +2.074198 +2.078001 +2.081803 +2.085606 +2.089408 +2.093210 +2.097013 +2.100815 +2.104617 +2.108420 +2.112222 +2.116025 +2.119827 +2.123629 +2.127432 +2.131234 +2.135037 +2.138839 +2.142641 +2.146444 +2.150246 +2.154048 +2.157851 +2.161653 +2.165456 +2.169258 +2.173060 +2.176863 +2.180665 +2.184467 +2.188270 +2.192072 +2.195875 +2.199677 +2.203479 +2.207282 +2.211084 +2.214886 +2.218689 +2.222491 +2.226294 +2.230096 +2.233898 +2.237701 +2.241503 +2.245306 +2.249108 +2.252910 +2.256713 +2.260515 +2.264317 +2.268120 +2.271922 +2.275725 +2.279527 +2.283329 +2.287132 +2.290934 +2.294736 +2.298539 +2.302341 +2.306144 +2.309946 +2.313748 +2.317551 +2.321353 +2.325156 +2.328958 +2.332760 +2.336563 +2.340365 +2.344167 +2.347970 +2.351772 +2.355575 +2.359377 +2.363179 +2.366982 +2.370784 +2.374586 +2.378389 +2.382191 +2.385994 +2.389796 +2.393598 +2.397401 +2.401203 +2.405006 +2.408808 +2.412610 +2.416413 +2.420215 +2.424017 +2.427820 +2.431622 +2.435425 +2.439227 +2.443029 +2.446832 +2.450634 +2.454436 +2.458239 +2.462041 +2.465844 +2.469646 +2.473448 +2.477251 +2.481053 +2.484855 +2.488658 +2.492460 +2.496263 +2.500065 +2.503867 +2.507670 +2.511472 +2.515275 +2.519077 +2.522879 +2.526682 +2.530484 +2.534286 +2.538089 +2.541891 +2.545694 +2.549496 +2.553298 +2.557101 +2.560903 +2.564705 +2.568508 +2.572310 +2.576113 +2.579915 +2.583717 +2.587520 +2.591322 +2.595125 +2.598927 +2.602729 +2.606532 +2.610334 +2.614136 +2.617939 +2.621741 +2.625544 +2.629346 +2.633148 +2.636951 +2.640753 +2.644555 +2.648358 +2.652160 +2.655963 +2.659765 +2.663567 +2.667370 +2.671172 +2.674974 +2.678777 +2.682579 +2.686382 +2.690184 +2.693986 +2.697789 +2.701591 +2.705394 +2.709196 +2.712998 +2.716801 +2.720603 +2.724405 +2.728208 +2.732010 +2.735813 +2.739615 +2.743417 +2.747220 +2.751022 +2.754824 +2.758627 +2.762429 +2.766232 +2.770034 +2.773836 +2.777639 +2.781441 +2.785244 +2.789046 +2.792848 +2.796651 +2.800453 +2.804255 +2.808058 +2.811860 +2.815663 +2.819465 +2.823267 +2.827070 +2.830872 +2.834674 +2.838477 +2.842279 +2.846082 +2.849884 +2.853686 +2.857489 +2.861291 +2.865094 +2.868896 +2.872698 +2.876501 +2.880303 +2.884105 +2.887908 +2.891710 +2.895513 +2.899315 +2.903117 +2.906920 +2.910722 +2.914524 +2.918327 +2.922129 +2.925932 +2.929734 +2.933536 +2.937339 +2.941141 +2.944943 +2.948746 +2.952548 +2.956351 +2.960153 +2.963955 +2.967758 +2.971560 +2.975363 +2.979165 +2.982967 +2.986770 +2.990572 +2.994374 +2.998177 +3.001979 +3.005782 +3.009584 +3.013386 +3.017189 +3.020991 +3.024793 +3.028596 +3.032398 +3.036201 +3.040003 +3.043805 +3.047608 +3.051410 +3.055213 +3.059015 +3.062817 +3.066620 +3.070422 +3.074224 +3.078027 +3.081829 +3.085632 +3.089434 +3.093236 +3.097039 +3.100841 +3.104643 +3.108446 +3.112248 +3.116051 +3.119853 +3.123655 +3.127458 +3.131260 +3.135063 +3.138865 +3.142667 +3.146470 +3.150272 +3.154074 +3.157877 +3.161679 +3.165482 +3.169284 +3.173086 +3.176889 +3.180691 +3.184493 +3.188296 +3.192098 +3.195901 +3.199703 +3.203505 +3.207308 +3.211110 +3.214912 +3.218715 +3.222517 +3.226320 +3.230122 +3.233924 +3.237727 +3.241529 +3.245332 +3.249134 +3.252936 +3.256739 +3.260541 +3.264343 +3.268146 +3.271948 +3.275751 +3.279553 +3.283355 +3.287158 +3.290960 +3.294762 +3.298565 +3.302367 +3.306170 +3.309972 +3.313774 +3.317577 +3.321379 +3.325182 +3.328984 +3.332786 +3.336589 +3.340391 +3.344193 +3.347996 +3.351798 +3.355601 +3.359403 +3.363205 +3.367008 +3.370810 +3.374612 +3.378415 +3.382217 +3.386020 +3.389822 +3.393624 +3.397427 +3.401229 +3.405032 +3.408834 +3.412636 +3.416439 +3.420241 +3.424043 +3.427846 +3.431648 +3.435451 +3.439253 +3.443055 +3.446858 +3.450660 +3.454462 +3.458265 +3.462067 +3.465870 +3.469672 +3.473474 +3.477277 +3.481079 +3.484881 +3.488684 +3.492486 +3.496289 +3.500091 +3.503893 +3.507696 +3.511498 +3.515301 +3.519103 +3.522905 +3.526708 +3.530510 +3.534312 +3.538115 +3.541917 +3.545720 +3.549522 +3.553324 +3.557127 +3.560929 +3.564731 +3.568534 +3.572336 +3.576139 +3.579941 +3.583743 +3.587546 +3.591348 +3.595151 +3.598953 +3.602755 +3.606558 +3.610360 +3.614162 +3.617965 +3.621767 +3.625570 +3.629372 +3.633174 +3.636977 +3.640779 +3.644581 +3.648384 +3.652186 +3.655989 +3.659791 +3.663593 +3.667396 +3.671198 +3.675001 +3.678803 +3.682605 +3.686408 +3.690210 +3.694012 +3.697815 +3.701617 +3.705420 +3.709222 +3.713024 +3.716827 +3.720629 +3.724431 +3.728234 +3.732036 +3.735839 +3.739641 +3.743443 +3.747246 +3.751048 +3.754850 +3.758653 +3.762455 +3.766258 +3.770060 +3.773862 +3.777665 +3.781467 +3.785270 +3.789072 +3.792874 +3.796677 +3.800479 +3.804281 +3.808084 +3.811886 +3.815689 +3.819491 +3.823293 +3.827096 +3.830898 +3.834700 +3.838503 +3.842305 +3.846108 +3.849910 +3.853712 +3.857515 +3.861317 +3.865120 +3.868922 +3.872724 +3.876527 +3.880329 +3.884131 +3.887934 +3.891736 +3.895539 +3.899341 +3.903143 +3.906946 +3.910748 +3.914550 +3.918353 +3.922155 +3.925958 +3.929760 +3.933562 +3.937365 +3.941167 +3.944969 +3.948772 +3.952574 +3.956377 +3.960179 +3.963981 +3.967784 +3.971586 +3.975389 +3.979191 +3.982993 +3.986796 +3.990598 +3.994400 +3.998203 +4.002005 +4.005808 +4.009610 +4.013412 +4.017215 +4.021017 +4.024819 +4.028622 +4.032424 +4.036227 +4.040029 +4.043831 +4.047634 +4.051436 +4.055239 +4.059041 +4.062843 +4.066646 +4.070448 +4.074250 +4.078053 +4.081855 +4.085658 +4.089460 +4.093262 +4.097065 +4.100867 +4.104669 +4.108472 +4.112274 +4.116077 +4.119879 +4.123681 +4.127484 +4.131286 +4.135089 +4.138891 +4.142693 +4.146496 +4.150298 +4.154100 +4.157903 +4.161705 +4.165508 +4.169310 +4.173112 +4.176915 +4.180717 +4.184519 +4.188322 +4.192124 +4.195927 +4.199729 +4.203531 +4.207334 +4.211136 +4.214938 +4.218741 +4.222543 +4.226346 +4.230148 +4.233950 +4.237753 +4.241555 +4.245358 +4.249160 +4.252962 +4.256765 +4.260567 +4.264369 +4.268172 +4.271974 +4.275777 +4.279579 +4.283381 +4.287184 +4.290986 +4.294788 +4.298591 +4.302393 +4.306196 +4.309998 +4.313800 +4.317603 +4.321405 +4.325208 +4.329010 +4.332812 +4.336615 +4.340417 +4.344219 +4.348022 +4.351824 +4.355627 +4.359429 +4.363231 +4.367034 +4.370836 +4.374638 +4.378441 +4.382243 +4.386046 +4.389848 +4.393650 +4.397453 +4.401255 +4.405058 +4.408860 +4.412662 +4.416465 +4.420267 +4.424069 +4.427872 +4.431674 +4.435477 +4.439279 +4.443081 +4.446884 +4.450686 +4.454488 +4.458291 +4.462093 +4.465896 +4.469698 +4.473500 +4.477303 +4.481105 +4.484907 +4.488710 +4.492512 +4.496315 +4.500117 +4.503919 +4.507722 +4.511524 +4.515327 +4.519129 +4.522931 +4.526734 +4.530536 +4.534338 +4.538141 +4.541943 +4.545746 +4.549548 +4.553350 +4.557153 +4.560955 +4.564757 +4.568560 +4.572362 +4.576165 +4.579967 +4.583769 +4.587572 +4.591374 +4.595177 +4.598979 +4.602781 +4.606584 +4.610386 +4.614188 +4.617991 +4.621793 +4.625596 +4.629398 +4.633200 +4.637003 +4.640805 +4.644607 +4.648410 +4.652212 +4.656015 +4.659817 +4.663619 +4.667422 +4.671224 +4.675027 +4.678829 +4.682631 +4.686434 +4.690236 +4.694038 +4.697841 +4.701643 +4.705446 +4.709248 +4.713050 +4.716853 +4.720655 +4.724457 +4.728260 +4.732062 +4.735865 +4.739667 +4.743469 +4.747272 +4.751074 +4.754876 +4.758679 +4.762481 +4.766284 +4.770086 +4.773888 +4.777691 +4.781493 +4.785296 +4.789098 +4.792900 +4.796703 +4.800505 +4.804307 +4.808110 +4.811912 +4.815715 +4.819517 +4.823319 +4.827122 +4.830924 +4.834726 +4.838529 +4.842331 +4.846134 +4.849936 +4.853738 +4.857541 +4.861343 +4.865146 +4.868948 +4.872750 +4.876553 +4.880355 +4.884157 +4.887960 +4.891762 +4.895565 +4.899367 +4.903169 +4.906972 +4.910774 +4.914576 +4.918379 +4.922181 +4.925984 +4.929786 +4.933588 +4.937391 +4.941193 +4.944995 +4.948798 +4.952600 +4.956403 +4.960205 +4.964007 +4.967810 +4.971612 +4.975415 +4.979217 +4.983019 +4.986822 +4.990624 +4.994426 +4.998229 +5.002031 +5.005834 +5.009636 +5.013438 +5.017241 +5.021043 +5.024845 +5.028648 +5.032450 +5.036253 +5.040055 +5.043857 +5.047660 +5.051462 +5.055265 +5.059067 +5.062869 +5.066672 +5.070474 +5.074276 +5.078079 +5.081881 +5.085684 +5.089486 +5.093288 +5.097091 +5.100893 +5.104695 +5.108498 +5.112300 +5.116103 +5.119905 +5.123707 +5.127510 +5.131312 +5.135115 +5.138917 +5.142719 +5.146522 +5.150324 +5.154126 +5.157929 +5.161731 +5.165534 +5.169336 +5.173138 +5.176941 +5.180743 +5.184545 +5.188348 +5.192150 +5.195953 +5.199755 +5.203557 +5.207360 +5.211162 +5.214964 +5.218767 +5.222569 +5.226372 +5.230174 +5.233976 +5.237779 +5.241581 +5.245384 +5.249186 +5.252988 +5.256791 +5.260593 +5.264395 +5.268198 +5.272000 +5.275803 +5.279605 +5.283407 +5.287210 +5.291012 +5.294814 +5.298617 +5.302419 +5.306222 +5.310024 +5.313826 +5.317629 +5.321431 +5.325234 +5.329036 +5.332838 +5.336641 +5.340443 +5.344245 +5.348048 +5.351850 +5.355653 +5.359455 +5.363257 +5.367060 +5.370862 +5.374664 +5.378467 +5.382269 +5.386072 +5.389874 +5.393676 +5.397479 +5.401281 +5.405084 +5.408886 +5.412688 +5.416491 +5.420293 +5.424095 +5.427898 +5.431700 +5.435503 +5.439305 +5.443107 +5.446910 +5.450712 +5.454514 +5.458317 +5.462119 +5.465922 +5.469724 +5.473526 +5.477329 +5.481131 +5.484933 +5.488736 +5.492538 +5.496341 +5.500143 +5.503945 +5.507748 +5.511550 +5.515353 +5.519155 +5.522957 +5.526760 +5.530562 +5.534364 +5.538167 +5.541969 +5.545772 +5.549574 +5.553376 +5.557179 +5.560981 +5.564783 +5.568586 +5.572388 +5.576191 +5.579993 +5.583795 +5.587598 +5.591400 +5.595203 +5.599005 +5.602807 +5.606610 +5.610412 +5.614214 +5.618017 +5.621819 +5.625622 +5.629424 +5.633226 +5.637029 +5.640831 +5.644633 +5.648436 +5.652238 +5.656041 +5.659843 +5.663645 +5.667448 +5.671250 +5.675053 +5.678855 +5.682657 +5.686460 +5.690262 +5.694064 +5.697867 +5.701669 +5.705472 +5.709274 +5.713076 +5.716879 +5.720681 +5.724483 +5.728286 +5.732088 +5.735891 +5.739693 +5.743495 +5.747298 +5.751100 +5.754902 +5.758705 +5.762507 +5.766310 +5.770112 +5.773914 +5.777717 +5.781519 +5.785322 +5.789124 +5.792926 +5.796729 +5.800531 +5.804333 +5.808136 +5.811938 +5.815741 +5.819543 +5.823345 +5.827148 +5.830950 +5.834752 +5.838555 +5.842357 +5.846160 +5.849962 +5.853764 +5.857567 +5.861369 +5.865172 +5.868974 +5.872776 +5.876579 +5.880381 +5.884183 +5.887986 +5.891788 +5.895591 +5.899393 +5.903195 +5.906998 +5.910800 +5.914602 +5.918405 +5.922207 +5.926010 +5.929812 +5.933614 +5.937417 +5.941219 +5.945022 +5.948824 +5.952626 +5.956429 +5.960231 +5.964033 +5.967836 +5.971638 +5.975441 +5.979243 +5.983045 +5.986848 +5.990650 +5.994452 +5.998255 +6.002057 +6.005860 +6.009662 +6.013464 +6.017267 +6.021069 +6.024871 +6.028674 +6.032476 +6.036279 +6.040081 +6.043883 +6.047686 +6.051488 +6.055291 +6.059093 +6.062895 +6.066698 +6.070500 +6.074302 +6.078105 +6.081907 +6.085710 +6.089512 +6.093314 +6.097117 +6.100919 +6.104721 +6.108524 +6.112326 +6.116129 +6.119931 +6.123733 +6.127536 +6.131338 +6.135141 +6.138943 +6.142745 +6.146548 +6.150350 +6.154152 +6.157955 +6.161757 +6.165560 +6.169362 +6.173164 +6.176967 +6.180769 +6.184571 +6.188374 +6.192176 +6.195979 +6.199781 +6.203583 +6.207386 +6.211188 +6.214990 +6.218793 +6.222595 +6.226398 +6.230200 +6.234002 +6.237805 +6.241607 +6.245410 +6.249212 +6.253014 +6.256817 +6.260619 +6.264421 +6.268224 +6.272026 +6.275829 +6.279631 +6.283433 +6.287236 +6.291038 +6.294840 +6.298643 +6.302445 +6.306248 +6.310050 +6.313852 +6.317655 +6.321457 +6.325260 +6.329062 +6.332864 +6.336667 +6.340469 +6.344271 +6.348074 +6.351876 +6.355679 +6.359481 +6.363283 +6.367086 +6.370888 +6.374690 +6.378493 +6.382295 +6.386098 +6.389900 +6.393702 +6.397505 +6.401307 +6.405110 +6.408912 +6.412714 +6.416517 +6.420319 +6.424121 +6.427924 +6.431726 +6.435529 +6.439331 +6.443133 +6.446936 +6.450738 +6.454540 +6.458343 +6.462145 +6.465948 +6.469750 +6.473552 +6.477355 +6.481157 +6.484959 +6.488762 +6.492564 +6.496367 +6.500169 +6.503971 +6.507774 +6.511576 +6.515379 +6.519181 +6.522983 +6.526786 +6.530588 +6.534390 +6.538193 +6.541995 +6.545798 +6.549600 +6.553402 +6.557205 +6.561007 +6.564809 +6.568612 +6.572414 +6.576217 +6.580019 +6.583821 +6.587624 +6.591426 +6.595229 +6.599031 +6.602833 +6.606636 +6.610438 +6.614240 +6.618043 +6.621845 +6.625648 +6.629450 +6.633252 +6.637055 +6.640857 +6.644659 +6.648462 +6.652264 +6.656067 +6.659869 +6.663671 +6.667474 +6.671276 +6.675079 +6.678881 +6.682683 +6.686486 +6.690288 +6.694090 +6.697893 +6.701695 +6.705498 +6.709300 +6.713102 +6.716905 +6.720707 +6.724509 +6.728312 +6.732114 +6.735917 +6.739719 +6.743521 +6.747324 +6.751126 +6.754928 +6.758731 +6.762533 +6.766336 +6.770138 +6.773940 +6.777743 +6.781545 +6.785348 +6.789150 +6.792952 +6.796755 +6.800557 +6.804359 +6.808162 +6.811964 +6.815767 +6.819569 +6.823371 +6.827174 +6.830976 +6.834778 +6.838581 +6.842383 +6.846186 +6.849988 +6.853790 +6.857593 +6.861395 +6.865198 +6.869000 +6.872802 +6.876605 +6.880407 +6.884209 +6.888012 +6.891814 +6.895617 +6.899419 +6.903221 +6.907024 +6.910826 +6.914628 +6.918431 +6.922233 +6.926036 +6.929838 +6.933640 +6.937443 +6.941245 +6.945048 +6.948850 +6.952652 +6.956455 +6.960257 +6.964059 +6.967862 +6.971664 +6.975467 +6.979269 +6.983071 +6.986874 +6.990676 +6.994478 +6.998281 +7.002083 +7.005886 +7.009688 +7.013490 +7.017293 +7.021095 +7.024897 +7.028700 +7.032502 +7.036305 +7.040107 +7.043909 +7.047712 +7.051514 +7.055317 +7.059119 +7.062921 +7.066724 +7.070526 +7.074328 +7.078131 +7.081933 +7.085736 +7.089538 +7.093340 +7.097143 +7.100945 +7.104747 +7.108550 +7.112352 +7.116155 +7.119957 +7.123759 +7.127562 +7.131364 +7.135167 +7.138969 +7.142771 +7.146574 +7.150376 +7.154178 +7.157981 +7.161783 +7.165586 +7.169388 +7.173190 +7.176993 +7.180795 +7.184597 +7.188400 +7.192202 +7.196005 +7.199807 +7.203609 +7.207412 +7.211214 +7.215017 +7.218819 +7.222621 +7.226424 +7.230226 +7.234028 +7.237831 +7.241633 +7.245436 +7.249238 +7.253040 +7.256843 +7.260645 +7.264447 +7.268250 +7.272052 +7.275855 +7.279657 +7.283459 +7.287262 +7.291064 +7.294866 +7.298669 +7.302471 +7.306274 +7.310076 +7.313878 +7.317681 +7.321483 +7.325286 +7.329088 +7.332890 +7.336693 +7.340495 +7.344297 +7.348100 +7.351902 +7.355705 +7.359507 +7.363309 +7.367112 +7.370914 +7.374716 +7.378519 +7.382321 +7.386124 +7.389926 +7.393728 +7.397531 +7.401333 +7.405136 +7.408938 +7.412740 +7.416543 +7.420345 +7.424147 +7.427950 +7.431752 +7.435555 +7.439357 +7.443159 +7.446962 +7.450764 +7.454566 +7.458369 +7.462171 +7.465974 +7.469776 +7.473578 +7.477381 +7.481183 +7.484985 +7.488788 +7.492590 +7.496393 +7.500195 +7.503997 +7.507800 +7.511602 +7.515405 +7.519207 +7.523009 +7.526812 +7.530614 +7.534416 +7.538219 +7.542021 +7.545824 +7.549626 +7.553428 +7.557231 +7.561033 +7.564835 +7.568638 +7.572440 +7.576243 +7.580045 +7.583847 +7.587650 +7.591452 +7.595255 +7.599057 +7.602859 +7.606662 +7.610464 +7.614266 +7.618069 +7.621871 +7.625674 +7.629476 +7.633278 +7.637081 +7.640883 +7.644685 +7.648488 +7.652290 +7.656093 +7.659895 +7.663697 +7.667500 +7.671302 +7.675105 +7.678907 +7.682709 +7.686512 +7.690314 +7.694116 +7.697919 +7.701721 +7.705524 +7.709326 +7.713128 +7.716931 +7.720733 +7.724535 +7.728338 +7.732140 +7.735943 +7.739745 +7.743547 +7.747350 +7.751152 +7.754954 +7.758757 +7.762559 +7.766362 +7.770164 +7.773966 +7.777769 +7.781571 +7.785374 +7.789176 +7.792978 +7.796781 +7.800583 +7.804385 +7.808188 +7.811990 +7.815793 +7.819595 +7.823397 +7.827200 +7.831002 +7.834804 +7.838607 +7.842409 +7.846212 +7.850014 +7.853816 +7.857619 +7.861421 +7.865224 +7.869026 +7.872828 +7.876631 +7.880433 +7.884235 +7.888038 +7.891840 +7.895643 +7.899445 +7.903247 +7.907050 +7.910852 +7.914654 +7.918457 +7.922259 +7.926062 +7.929864 +7.933666 +7.937469 +7.941271 +7.945074 +7.948876 +7.952678 +7.956481 +7.960283 +7.964085 +7.967888 +7.971690 +7.975493 +7.979295 +7.983097 +7.986900 +7.990702 +7.994504 +7.998307 +8.002109 +8.005912 +8.009714 +8.013516 +8.017319 +8.021121 +8.024923 +8.028726 +8.032528 +8.036331 +8.040133 +8.043935 +8.047738 +8.051540 +8.055343 +8.059145 +8.062947 +8.066750 +8.070552 +8.074354 +8.078157 +8.081959 +8.085762 +8.089564 +8.093366 +8.097169 +8.100971 +8.104773 +8.108576 +8.112378 +8.116181 +8.119983 +8.123785 +8.127588 +8.131390 +8.135193 +8.138995 +8.142797 +8.146600 +8.150402 +8.154204 +8.158007 +8.161809 +8.165612 +8.169414 +8.173216 +8.177019 +8.180821 +8.184623 +8.188426 +8.192228 +8.196031 +8.199833 +8.203635 +8.207438 +8.211240 +8.215043 +8.218845 +8.222647 +8.226450 +8.230252 +8.234054 +8.237857 +8.241659 +8.245462 +8.249264 +8.253066 +8.256869 +8.260671 +8.264473 +8.268276 +8.272078 +8.275881 +8.279683 +8.283485 +8.287288 +8.291090 +8.294892 +8.298695 +8.302497 +8.306300 +8.310102 +8.313904 +8.317707 +8.321509 +8.325312 +8.329114 +8.332916 +8.336719 +8.340521 +8.344323 +8.348126 +8.351928 +8.355731 +8.359533 +8.363335 +8.367138 +8.370940 +8.374742 +8.378545 +8.382347 +8.386150 +8.389952 +8.393754 +8.397557 +8.401359 +8.405162 +8.408964 +8.412766 +8.416569 +8.420371 +8.424173 +8.427976 +8.431778 +8.435581 +8.439383 +8.443185 +8.446988 +8.450790 +8.454592 +8.458395 +8.462197 +8.466000 +8.469802 +8.473604 +8.477407 +8.481209 +8.485012 +8.488814 +8.492616 +8.496419 +8.500221 +8.504023 +8.507826 +8.511628 +8.515431 +8.519233 +8.523035 +8.526838 +8.530640 +8.534442 +8.538245 +8.542047 +8.545850 +8.549652 +8.553454 +8.557257 +8.561059 +8.564861 +8.568664 +8.572466 +8.576269 +8.580071 +8.583873 +8.587676 +8.591478 +8.595281 +8.599083 +8.602885 +8.606688 +8.610490 +8.614292 +8.618095 +8.621897 +8.625700 +8.629502 +8.633304 +8.637107 +8.640909 +8.644711 +8.648514 +8.652316 +8.656119 +8.659921 +8.663723 +8.667526 +8.671328 +8.675131 +8.678933 +8.682735 +8.686538 +8.690340 +8.694142 +8.697945 +8.701747 +8.705550 +8.709352 +8.713154 +8.716957 +8.720759 +8.724561 +8.728364 +8.732166 +8.735969 +8.739771 +8.743573 +8.747376 +8.751178 +8.754980 +8.758783 +8.762585 +8.766388 +8.770190 +8.773992 +8.777795 +8.781597 +8.785400 +8.789202 +8.793004 +8.796807 +8.800609 +8.804411 +8.808214 +8.812016 +8.815819 +8.819621 +8.823423 +8.827226 +8.831028 +8.834830 +8.838633 +8.842435 +8.846238 +8.850040 +8.853842 +8.857645 +8.861447 +8.865250 +8.869052 +8.872854 +8.876657 +8.880459 +8.884261 +8.888064 +8.891866 +8.895669 +8.899471 +8.903273 +8.907076 +8.910878 +8.914680 +8.918483 +8.922285 +8.926088 +8.929890 +8.933692 +8.937495 +8.941297 +8.945100 +8.948902 +8.952704 +8.956507 +8.960309 +8.964111 +8.967914 +8.971716 +8.975519 +8.979321 +8.983123 +8.986926 +8.990728 +8.994530 +8.998333 +9.002135 +9.005938 +9.009740 +9.013542 +9.017345 +9.021147 +9.024949 +9.028752 +9.032554 +9.036357 +9.040159 +9.043961 +9.047764 +9.051566 +9.055369 +9.059171 +9.062973 +9.066776 +9.070578 +9.074380 +9.078183 +9.081985 +9.085788 +9.089590 +9.093392 +9.097195 +9.100997 +9.104799 +9.108602 +9.112404 +9.116207 +9.120009 +9.123811 +9.127614 +9.131416 +9.135219 +9.139021 +9.142823 +9.146626 +9.150428 +9.154230 +9.158033 +9.161835 +9.165638 +9.169440 +9.173242 +9.177045 +9.180847 +9.184649 +9.188452 +9.192254 +9.196057 +9.199859 +9.203661 +9.207464 +9.211266 +9.215069 +9.218871 +9.222673 +9.226476 +9.230278 +9.234080 +9.237883 +9.241685 +9.245488 +9.249290 +9.253092 +9.256895 +9.260697 +9.264499 +9.268302 +9.272104 +9.275907 +9.279709 +9.283511 +9.287314 +9.291116 +9.294918 +9.298721 +9.302523 +9.306326 +9.310128 +9.313930 +9.317733 +9.321535 +9.325338 +9.329140 +9.332942 +9.336745 +9.340547 +9.344349 +9.348152 +9.351954 +9.355757 +9.359559 +9.363361 +9.367164 +9.370966 +9.374768 +9.378571 +9.382373 +9.386176 +9.389978 +9.393780 +9.397583 +9.401385 +9.405188 +9.408990 +9.412792 +9.416595 +9.420397 +9.424199 +9.428002 +9.431804 +9.435607 +9.439409 +9.443211 +9.447014 +9.450816 +9.454618 +9.458421 +9.462223 +9.466026 +9.469828 +9.473630 +9.477433 +9.481235 +9.485038 +9.488840 +9.492642 +9.496445 +9.500247 +9.504049 +9.507852 +9.511654 +9.515457 +9.519259 +9.523061 +9.526864 +9.530666 +9.534468 +9.538271 +9.542073 +9.545876 +9.549678 +9.553480 +9.557283 +9.561085 +9.564887 +9.568690 +9.572492 +9.576295 +9.580097 +9.583899 +9.587702 +9.591504 +9.595307 +9.599109 +9.602911 +9.606714 +9.610516 +9.614318 +9.618121 +9.621923 +9.625726 +9.629528 +9.633330 +9.637133 +9.640935 +9.644737 +9.648540 +9.652342 +9.656145 +9.659947 +9.663749 +9.667552 +9.671354 +9.675157 +9.678959 +9.682761 +9.686564 +9.690366 +9.694168 +9.697971 +9.701773 +9.705576 +9.709378 +9.713180 +9.716983 +9.720785 +9.724587 +9.728390 +9.732192 +9.735995 +9.739797 +9.743599 +9.747402 +9.751204 +9.755007 +9.758809 +9.762611 +9.766414 +9.770216 +9.774018 +9.777821 +9.781623 +9.785426 +9.789228 +9.793030 +9.796833 +9.800635 +9.804437 +9.808240 +9.812042 +9.815845 +9.819647 +9.823449 +9.827252 +9.831054 +9.834856 +9.838659 +9.842461 +9.846264 +9.850066 +9.853868 +9.857671 +9.861473 +9.865276 +9.869078 +9.872880 +9.876683 +9.880485 +9.884287 +9.888090 +9.891892 +9.895695 +9.899497 +9.903299 +9.907102 +9.910904 +9.914706 +9.918509 +9.922311 +9.926114 +9.929916 +9.933718 +9.937521 +9.941323 +9.945126 +9.948928 +9.952730 +9.956533 +9.960335 +9.964137 +9.967940 +9.971742 +9.975545 +9.979347 +9.983149 +9.986952 +9.990754 +9.994556 +9.998359 +10.002161 +10.005964 +10.009766 +10.013568 +10.017371 +10.021173 +10.024975 +10.028778 +10.032580 +10.036383 +10.040185 +10.043987 +10.047790 +10.051592 +10.055395 +10.059197 +10.062999 +10.066802 +10.070604 +10.074406 +10.078209 +10.082011 +10.085814 +10.089616 +10.093418 +10.097221 +10.101023 +10.104825 +10.108628 +10.112430 +10.116233 +10.120035 +10.123837 +10.127640 +10.131442 +10.135245 +10.139047 +10.142849 +10.146652 +10.150454 +10.154256 +10.158059 +10.161861 +10.165664 +10.169466 +10.173268 +10.177071 +10.180873 +10.184675 +10.188478 +10.192280 +10.196083 +10.199885 +10.203687 +10.207490 +10.211292 +10.215095 +10.218897 +10.222699 +10.226502 +10.230304 +10.234106 +10.237909 +10.241711 +10.245514 +10.249316 +10.253118 +10.256921 +10.260723 +10.264525 +10.268328 +10.272130 +10.275933 +10.279735 +10.283537 +10.287340 +10.291142 +10.294944 +10.298747 +10.302549 +10.306352 +10.310154 +10.313956 +10.317759 +10.321561 +10.325364 +10.329166 +10.332968 +10.336771 +10.340573 +10.344375 +10.348178 +10.351980 +10.355783 +10.359585 +10.363387 +10.367190 +10.370992 +10.374794 +10.378597 +10.382399 +10.386202 +10.390004 +10.393806 +10.397609 +10.401411 +10.405214 +10.409016 +10.412818 +10.416621 +10.420423 +10.424225 +10.428028 +10.431830 +10.435633 +10.439435 +10.443237 +10.447040 +10.450842 +10.454644 +10.458447 +10.462249 +10.466052 +10.469854 +10.473656 +10.477459 +10.481261 +10.485064 +10.488866 +10.492668 +10.496471 +10.500273 +10.504075 +10.507878 +10.511680 +10.515483 +10.519285 +10.523087 +10.526890 +10.530692 +10.534494 +10.538297 +10.542099 +10.545902 +10.549704 +10.553506 +10.557309 +10.561111 +10.564913 +10.568716 +10.572518 +10.576321 +10.580123 +10.583925 +10.587728 +10.591530 +10.595333 +10.599135 +10.602937 +10.606740 +10.610542 +10.614344 +10.618147 +10.621949 +10.625752 +10.629554 +10.633356 +10.637159 +10.640961 +10.644763 +10.648566 +10.652368 +10.656171 +10.659973 +10.663775 +10.667578 +10.671380 +10.675183 +10.678985 +10.682787 +10.686590 +10.690392 +10.694194 +10.697997 +10.701799 +10.705602 +10.709404 +10.713206 +10.717009 +10.720811 +10.724613 +10.728416 +10.732218 +10.736021 +10.739823 +10.743625 +10.747428 +10.751230 +10.755033 +10.758835 +10.762637 +10.766440 +10.770242 +10.774044 +10.777847 +10.781649 +10.785452 +10.789254 +10.793056 +10.796859 +10.800661 +10.804463 +10.808266 +10.812068 +10.815871 +10.819673 +10.823475 +10.827278 +10.831080 +10.834882 +10.838685 +10.842487 +10.846290 +10.850092 +10.853894 +10.857697 +10.861499 +10.865302 +10.869104 +10.872906 +10.876709 +10.880511 +10.884313 +10.888116 +10.891918 +10.895721 +10.899523 +10.903325 +10.907128 +10.910930 +10.914732 +10.918535 +10.922337 +10.926140 +10.929942 +10.933744 +10.937547 +10.941349 +10.945152 +10.948954 +10.952756 +10.956559 +10.960361 +10.964163 +10.967966 +10.971768 +10.975571 +10.979373 +10.983175 +10.986978 +10.990780 +10.994582 +10.998385 +11.002187 +11.005990 +11.009792 +11.013594 +11.017397 +11.021199 +11.025002 +11.028804 +11.032606 +11.036409 +11.040211 +11.044013 +11.047816 +11.051618 +11.055421 +11.059223 +11.063025 +11.066828 +11.070630 +11.074432 +11.078235 +11.082037 +11.085840 +11.089642 +11.093444 +11.097247 +11.101049 +11.104851 +11.108654 +11.112456 +11.116259 +11.120061 +11.123863 +11.127666 +11.131468 +11.135271 +11.139073 +11.142875 +11.146678 +11.150480 +11.154282 +11.158085 +11.161887 +11.165690 +11.169492 +11.173294 +11.177097 +11.180899 +11.184701 +11.188504 +11.192306 +11.196109 +11.199911 +11.203713 +11.207516 +11.211318 +11.215121 +11.218923 +11.222725 +11.226528 +11.230330 +11.234132 +11.237935 +11.241737 +11.245540 +11.249342 +11.253144 +11.256947 +11.260749 +11.264551 +11.268354 +11.272156 +11.275959 +11.279761 +11.283563 +11.287366 +11.291168 +11.294970 +11.298773 +11.302575 +11.306378 +11.310180 +11.313982 +11.317785 +11.321587 +11.325390 +11.329192 +11.332994 +11.336797 +11.340599 +11.344401 +11.348204 +11.352006 +11.355809 +11.359611 +11.363413 +11.367216 +11.371018 +11.374820 +11.378623 +11.382425 +11.386228 +11.390030 +11.393832 +11.397635 +11.401437 +11.405240 +11.409042 +11.412844 +11.416647 +11.420449 +11.424251 +11.428054 +11.431856 +11.435659 +11.439461 +11.443263 +11.447066 +11.450868 +11.454670 +11.458473 +11.462275 +11.466078 +11.469880 +11.473682 +11.477485 +11.481287 +11.485090 +11.488892 +11.492694 +11.496497 +11.500299 +11.504101 +11.507904 +11.511706 +11.515509 +11.519311 +11.523113 +11.526916 +11.530718 +11.534520 +11.538323 +11.542125 +11.545928 +11.549730 +11.553532 +11.557335 +11.561137 +11.564939 +11.568742 +11.572544 +11.576347 +11.580149 +11.583951 +11.587754 +11.591556 +11.595359 +11.599161 +11.602963 +11.606766 +11.610568 +11.614370 +11.618173 +11.621975 +11.625778 +11.629580 +11.633382 +11.637185 +11.640987 +11.644789 +11.648592 +11.652394 +11.656197 +11.659999 +11.663801 +11.667604 +11.671406 +11.675209 +11.679011 +11.682813 +11.686616 +11.690418 +11.694220 +11.698023 +11.701825 +11.705628 +11.709430 +11.713232 +11.717035 +11.720837 +11.724639 +11.728442 +11.732244 +11.736047 +11.739849 +11.743651 +11.747454 +11.751256 +11.755059 +11.758861 +11.762663 +11.766466 +11.770268 +11.774070 +11.777873 +11.781675 +11.785478 +11.789280 +11.793082 +11.796885 +11.800687 +11.804489 +11.808292 +11.812094 +11.815897 +11.819699 +11.823501 +11.827304 +11.831106 +11.834908 +11.838711 +11.842513 +11.846316 +11.850118 +11.853920 +11.857723 +11.861525 +11.865328 +11.869130 +11.872932 +11.876735 +11.880537 +11.884339 +11.888142 +11.891944 +11.895747 +11.899549 +11.903351 +11.907154 +11.910956 +11.914758 +11.918561 +11.922363 +11.926166 +11.929968 +11.933770 +11.937573 +11.941375 +11.945178 +11.948980 +11.952782 +11.956585 +11.960387 +11.964189 +11.967992 +11.971794 +11.975597 +11.979399 +11.983201 +11.987004 +11.990806 +11.994608 +11.998411 +12.002213 +12.006016 +12.009818 +12.013620 +12.017423 +12.021225 +12.025028 +12.028830 +12.032632 +12.036435 +12.040237 +12.044039 +12.047842 +12.051644 +12.055447 +12.059249 +12.063051 +12.066854 +12.070656 +12.074458 +12.078261 +12.082063 +12.085866 +12.089668 +12.093470 +12.097273 +12.101075 +12.104877 +12.108680 +12.112482 +12.116285 +12.120087 +12.123889 +12.127692 +12.131494 +12.135297 +12.139099 +12.142901 +12.146704 +12.150506 +12.154308 +12.158111 +12.161913 +12.165716 +12.169518 +12.173320 +12.177123 +12.180925 +12.184727 +12.188530 +12.192332 +12.196135 +12.199937 +12.203739 +12.207542 +12.211344 +12.215147 +12.218949 +12.222751 +12.226554 +12.230356 +12.234158 +12.237961 +12.241763 +12.245566 +12.249368 +12.253170 +12.256973 +12.260775 +12.264577 +12.268380 +12.272182 +12.275985 +12.279787 +12.283589 +12.287392 +12.291194 +12.294996 +12.298799 +12.302601 +12.306404 +12.310206 +12.314008 +12.317811 +12.321613 +12.325416 +12.329218 +12.333020 +12.336823 +12.340625 +12.344427 +12.348230 +12.352032 +12.355835 +12.359637 +12.363439 +12.367242 +12.371044 +12.374846 +12.378649 +12.382451 +12.386254 +12.390056 +12.393858 +12.397661 +12.401463 +12.405266 +12.409068 +12.412870 +12.416673 +12.420475 +12.424277 +12.428080 +12.431882 +12.435685 +12.439487 +12.443289 +12.447092 +12.450894 +12.454696 +12.458499 +12.462301 +12.466104 +12.469906 +12.473708 +12.477511 +12.481313 +12.485116 +12.488918 +12.492720 +12.496523 +12.500325 +12.504127 +12.507930 +12.511732 +12.515535 +12.519337 +12.523139 +12.526942 +12.530744 +12.534546 +12.538349 +12.542151 +12.545954 +12.549756 +12.553558 +12.557361 +12.561163 +12.564965 +12.568768 +12.572570 +12.576373 +12.580175 +12.583977 +12.587780 +12.591582 +12.595385 +12.599187 +12.602989 +12.606792 +12.610594 +12.614396 +12.618199 +12.622001 +12.625804 +12.629606 +12.633408 +12.637211 +12.641013 +12.644815 +12.648618 +12.652420 +12.656223 +12.660025 +12.663827 +12.667630 +12.671432 +12.675235 +12.679037 +12.682839 +12.686642 +12.690444 +12.694246 +12.698049 +12.701851 +12.705654 +12.709456 +12.713258 +12.717061 +12.720863 +12.724665 +12.728468 +12.732270 +12.736073 +12.739875 +12.743677 +12.747480 +12.751282 +12.755085 +12.758887 +12.762689 +12.766492 +12.770294 +12.774096 +12.777899 +12.781701 +12.785504 +12.789306 +12.793108 +12.796911 +12.800713 +12.804515 +12.808318 +12.812120 +12.815923 +12.819725 +12.823527 +12.827330 +12.831132 +12.834934 +12.838737 +12.842539 +12.846342 +12.850144 +12.853946 +12.857749 +12.861551 +12.865354 +12.869156 +12.872958 +12.876761 +12.880563 +12.884365 +12.888168 +12.891970 +12.895773 +12.899575 +12.903377 +12.907180 +12.910982 +12.914784 +12.918587 +12.922389 +12.926192 +12.929994 +12.933796 +12.937599 +12.941401 +12.945204 +12.949006 +12.952808 +12.956611 +12.960413 +12.964215 +12.968018 +12.971820 +12.975623 +12.979425 +12.983227 +12.987030 +12.990832 +12.994634 +12.998437 +13.002239 +13.006042 +13.009844 +13.013646 +13.017449 +13.021251 +13.025054 +13.028856 +13.032658 +13.036461 +13.040263 +13.044065 +13.047868 +13.051670 +13.055473 +13.059275 +13.063077 +13.066880 +13.070682 +13.074484 +13.078287 +13.082089 +13.085892 +13.089694 +13.093496 +13.097299 +13.101101 +13.104903 +13.108706 +13.112508 +13.116311 +13.120113 +13.123915 +13.127718 +13.131520 +13.135323 +13.139125 +13.142927 +13.146730 +13.150532 +13.154334 +13.158137 +13.161939 +13.165742 +13.169544 +13.173346 +13.177149 +13.180951 +13.184753 +13.188556 +13.192358 +13.196161 +13.199963 +13.203765 +13.207568 +13.211370 +13.215173 +13.218975 +13.222777 +13.226580 +13.230382 +13.234184 +13.237987 +13.241789 +13.245592 +13.249394 +13.253196 +13.256999 +13.260801 +13.264603 +13.268406 +13.272208 +13.276011 +13.279813 +13.283615 +13.287418 +13.291220 +13.295023 +13.298825 +13.302627 +13.306430 +13.310232 +13.314034 +13.317837 +13.321639 +13.325442 +13.329244 +13.333046 +13.336849 +13.340651 +13.344453 +13.348256 +13.352058 +13.355861 +13.359663 +13.363465 +13.367268 +13.371070 +13.374872 +13.378675 +13.382477 +13.386280 +13.390082 +13.393884 +13.397687 +13.401489 +13.405292 +13.409094 +13.412896 +13.416699 +13.420501 +13.424303 +13.428106 +13.431908 +13.435711 +13.439513 +13.443315 +13.447118 +13.450920 +13.454722 +13.458525 +13.462327 +13.466130 +13.469932 +13.473734 +13.477537 +13.481339 +13.485142 +13.488944 +13.492746 +13.496549 +13.500351 +13.504153 +13.507956 +13.511758 +13.515561 +13.519363 +13.523165 +13.526968 +13.530770 +13.534572 +13.538375 +13.542177 +13.545980 +13.549782 +13.553584 +13.557387 +13.561189 +13.564991 +13.568794 +13.572596 +13.576399 +13.580201 +13.584003 +13.587806 +13.591608 +13.595411 +13.599213 +13.603015 +13.606818 +13.610620 +13.614422 +13.618225 +13.622027 +13.625830 +13.629632 +13.633434 +13.637237 +13.641039 +13.644841 +13.648644 +13.652446 +13.656249 +13.660051 +13.663853 +13.667656 +13.671458 +13.675261 +13.679063 +13.682865 +13.686668 +13.690470 +13.694272 +13.698075 +13.701877 +13.705680 +13.709482 +13.713284 +13.717087 +13.720889 +13.724691 +13.728494 +13.732296 +13.736099 +13.739901 +13.743703 +13.747506 +13.751308 +13.755111 +13.758913 +13.762715 +13.766518 +13.770320 +13.774122 +13.777925 +13.781727 +13.785530 +13.789332 +13.793134 +13.796937 +13.800739 +13.804541 +13.808344 +13.812146 +13.815949 +13.819751 +13.823553 +13.827356 +13.831158 +13.834960 +13.838763 +13.842565 +13.846368 +13.850170 +13.853972 +13.857775 +13.861577 +13.865380 +13.869182 +13.872984 +13.876787 +13.880589 +13.884391 +13.888194 +13.891996 +13.895799 +13.899601 +13.903403 +13.907206 +13.911008 +13.914810 +13.918613 +13.922415 +13.926218 +13.930020 +13.933822 +13.937625 +13.941427 +13.945230 +13.949032 +13.952834 +13.956637 +13.960439 +13.964241 +13.968044 +13.971846 +13.975649 +13.979451 +13.983253 +13.987056 +13.990858 +13.994660 +13.998463 +14.002265 +14.006068 +14.009870 +14.013672 +14.017475 +14.021277 +14.025080 +14.028882 +14.032684 +14.036487 +14.040289 +14.044091 +14.047894 +14.051696 +14.055499 +14.059301 +14.063103 +14.066906 +14.070708 +14.074510 +14.078313 +14.082115 +14.085918 +14.089720 +14.093522 +14.097325 +14.101127 +14.104929 +14.108732 +14.112534 +14.116337 +14.120139 +14.123941 +14.127744 +14.131546 +14.135349 +14.139151 +14.142953 +14.146756 +14.150558 +14.154360 +14.158163 +14.161965 +14.165768 +14.169570 +14.173372 +14.177175 +14.180977 +14.184779 +14.188582 +14.192384 +14.196187 +14.199989 +14.203791 +14.207594 +14.211396 +14.215199 +14.219001 +14.222803 +14.226606 +14.230408 +14.234210 +14.238013 +14.241815 +14.245618 +14.249420 +14.253222 +14.257025 +14.260827 +14.264629 +14.268432 +14.272234 +14.276037 +14.279839 +14.283641 +14.287444 +14.291246 +14.295049 +14.298851 +14.302653 +14.306456 +14.310258 +14.314060 +14.317863 +14.321665 +14.325468 +14.329270 +14.333072 +14.336875 +14.340677 +14.344479 +14.348282 +14.352084 +14.355887 +14.359689 +14.363491 +14.367294 +14.371096 +14.374898 +14.378701 +14.382503 +14.386306 +14.390108 +14.393910 +14.397713 +14.401515 +14.405318 +14.409120 +14.412922 +14.416725 +14.420527 +14.424329 +14.428132 +14.431934 +14.435737 +14.439539 +14.443341 +14.447144 +14.450946 +14.454748 +14.458551 +14.462353 +14.466156 +14.469958 +14.473760 +14.477563 +14.481365 +14.485168 +14.488970 +14.492772 +14.496575 +14.500377 +14.504179 +14.507982 +14.511784 +14.515587 +14.519389 +14.523191 +14.526994 +14.530796 +14.534598 +14.538401 +14.542203 +14.546006 +14.549808 +14.553610 +14.557413 +14.561215 +14.565018 +14.568820 +14.572622 +14.576425 +14.580227 +14.584029 +14.587832 +14.591634 +14.595437 +14.599239 +14.603041 +14.606844 +14.610646 +14.614448 +14.618251 +14.622053 +14.625856 +14.629658 +14.633460 +14.637263 +14.641065 +14.644867 +14.648670 +14.652472 +14.656275 +14.660077 +14.663879 +14.667682 +14.671484 +14.675287 +14.679089 +14.682891 +14.686694 +14.690496 +14.694298 +14.698101 +14.701903 +14.705706 +14.709508 +14.713310 +14.717113 +14.720915 +14.724717 +14.728520 +14.732322 +14.736125 +14.739927 +14.743729 +14.747532 +14.751334 +14.755137 +14.758939 +14.762741 +14.766544 +14.770346 +14.774148 +14.777951 +14.781753 +14.785556 +14.789358 +14.793160 +14.796963 +14.800765 +14.804567 +14.808370 +14.812172 +14.815975 +14.819777 +14.823579 +14.827382 +14.831184 +14.834986 +14.838789 +14.842591 +14.846394 +14.850196 +14.853998 +14.857801 +14.861603 +14.865406 +14.869208 +14.873010 +14.876813 +14.880615 +14.884417 +14.888220 +14.892022 +14.895825 +14.899627 +14.903429 +14.907232 +14.911034 +14.914836 +14.918639 +14.922441 +14.926244 +14.930046 +14.933848 +14.937651 +14.941453 +14.945256 +14.949058 +14.952860 +14.956663 +14.960465 +14.964267 +14.968070 +14.971872 +14.975675 +14.979477 +14.983279 +14.987082 +14.990884 +14.994686 +14.998489 +15.002291 +15.006094 +15.009896 +15.013698 +15.017501 +15.021303 +15.025106 +15.028908 +15.032710 +15.036513 +15.040315 +15.044117 +15.047920 +15.051722 +15.055525 +15.059327 +15.063129 +15.066932 +15.070734 +15.074536 +15.078339 +15.082141 +15.085944 +15.089746 +15.093548 +15.097351 +15.101153 +15.104955 +15.108758 +15.112560 +15.116363 +15.120165 +15.123967 +15.127770 +15.131572 +15.135375 +15.139177 +15.142979 +15.146782 +15.150584 +15.154386 +15.158189 +15.161991 +15.165794 +15.169596 +15.173398 +15.177201 +15.181003 +15.184805 +15.188608 +15.192410 +15.196213 +15.200015 +15.203817 +15.207620 +15.211422 +15.215225 +15.219027 +15.222829 +15.226632 +15.230434 +15.234236 +15.238039 +15.241841 +15.245644 +15.249446 +15.253248 +15.257051 +15.260853 +15.264655 +15.268458 +15.272260 +15.276063 +15.279865 +15.283667 +15.287470 +15.291272 +15.295075 +15.298877 +15.302679 +15.306482 +15.310284 +15.314086 +15.317889 +15.321691 +15.325494 +15.329296 +15.333098 +15.336901 +15.340703 +15.344505 +15.348308 +15.352110 +15.355913 +15.359715 +15.363517 +15.367320 +15.371122 +15.374924 +15.378727 +15.382529 +15.386332 +15.390134 +15.393936 +15.397739 +15.401541 +15.405344 +15.409146 +15.412948 +15.416751 +15.420553 +15.424355 +15.428158 +15.431960 +15.435763 +15.439565 +15.443367 +15.447170 +15.450972 +15.454774 +15.458577 +15.462379 +15.466182 +15.469984 +15.473786 +15.477589 +15.481391 +15.485194 +15.488996 +15.492798 +15.496601 +15.500403 +15.504205 +15.508008 +15.511810 +15.515613 +15.519415 +15.523217 +15.527020 +15.530822 +15.534624 +15.538427 +15.542229 +15.546032 +15.549834 +15.553636 +15.557439 +15.561241 +15.565044 +15.568846 +15.572648 +15.576451 +15.580253 +15.584055 +15.587858 +15.591660 +15.595463 +15.599265 +15.603067 +15.606870 +15.610672 +15.614474 +15.618277 +15.622079 +15.625882 +15.629684 +15.633486 +15.637289 +15.641091 +15.644893 +15.648696 +15.652498 +15.656301 +15.660103 +15.663905 +15.667708 +15.671510 +15.675313 +15.679115 +15.682917 +15.686720 +15.690522 +15.694324 +15.698127 +15.701929 +15.705732 +15.709534 +15.713336 +15.717139 +15.720941 +15.724743 +15.728546 +15.732348 +15.736151 +15.739953 +15.743755 +15.747558 +15.751360 +15.755163 +15.758965 +15.762767 +15.766570 +15.770372 +15.774174 +15.777977 +15.781779 +15.785582 +15.789384 +15.793186 +15.796989 +15.800791 +15.804593 +15.808396 +15.812198 +15.816001 +15.819803 +15.823605 +15.827408 +15.831210 +15.835013 +15.838815 +15.842617 +15.846420 +15.850222 +15.854024 +15.857827 +15.861629 +15.865432 +15.869234 +15.873036 +15.876839 +15.880641 +15.884443 +15.888246 +15.892048 +15.895851 +15.899653 +15.903455 +15.907258 +15.911060 +15.914862 +15.918665 +15.922467 +15.926270 +15.930072 +15.933874 +15.937677 +15.941479 +15.945282 +15.949084 +15.952886 +15.956689 +15.960491 +15.964293 +15.968096 +15.971898 +15.975701 +15.979503 +15.983305 +15.987108 +15.990910 +15.994712 +15.998515 +16.002317 +16.006120 +16.009922 +16.013724 +16.017527 +16.021329 +16.025132 +16.028934 +16.032736 +16.036539 +16.040341 +16.044143 +16.047946 +16.051748 +16.055551 +16.059353 +16.063155 +16.066958 +16.070760 +16.074562 +16.078365 +16.082167 +16.085970 +16.089772 +16.093574 +16.097377 +16.101179 +16.104981 +16.108784 +16.112586 +16.116389 +16.120191 +16.123993 +16.127796 +16.131598 +16.135401 +16.139203 +16.143005 +16.146808 +16.150610 +16.154412 +16.158215 +16.162017 +16.165820 +16.169622 +16.173424 +16.177227 +16.181029 +16.184831 +16.188634 +16.192436 +16.196239 +16.200041 +16.203843 +16.207646 +16.211448 +16.215251 +16.219053 +16.222855 +16.226658 +16.230460 +16.234262 +16.238065 +16.241867 +16.245670 +16.249472 +16.253274 +16.257077 +16.260879 +16.264681 +16.268484 +16.272286 +16.276089 +16.279891 +16.283693 +16.287496 +16.291298 +16.295101 +16.298903 +16.302705 +16.306508 +16.310310 +16.314112 +16.317915 +16.321717 +16.325520 +16.329322 +16.333124 +16.336927 +16.340729 +16.344531 +16.348334 +16.352136 +16.355939 +16.359741 +16.363543 +16.367346 +16.371148 +16.374950 +16.378753 +16.382555 +16.386358 +16.390160 +16.393962 +16.397765 +16.401567 +16.405370 +16.409172 +16.412974 +16.416777 +16.420579 +16.424381 +16.428184 +16.431986 +16.435789 +16.439591 +16.443393 +16.447196 +16.450998 +16.454800 +16.458603 +16.462405 +16.466208 +16.470010 +16.473812 +16.477615 +16.481417 +16.485220 +16.489022 +16.492824 +16.496627 +16.500429 +16.504231 +16.508034 +16.511836 +16.515639 +16.519441 +16.523243 +16.527046 +16.530848 +16.534650 +16.538453 +16.542255 +16.546058 +16.549860 +16.553662 +16.557465 +16.561267 +16.565070 +16.568872 +16.572674 +16.576477 +16.580279 +16.584081 +16.587884 +16.591686 +16.595489 +16.599291 +16.603093 +16.606896 +16.610698 +16.614500 +16.618303 +16.622105 +16.625908 +16.629710 +16.633512 +16.637315 +16.641117 +16.644919 +16.648722 +16.652524 +16.656327 +16.660129 +16.663931 +16.667734 +16.671536 +16.675339 +16.679141 +16.682943 +16.686746 +16.690548 +16.694350 +16.698153 +16.701955 +16.705758 +16.709560 +16.713362 +16.717165 +16.720967 +16.724769 +16.728572 +16.732374 +16.736177 +16.739979 +16.743781 +16.747584 +16.751386 +16.755189 +16.758991 +16.762793 +16.766596 +16.770398 +16.774200 +16.778003 +16.781805 +16.785608 +16.789410 +16.793212 +16.797015 +16.800817 +16.804619 +16.808422 +16.812224 +16.816027 +16.819829 +16.823631 +16.827434 +16.831236 +16.835039 +16.838841 +16.842643 +16.846446 +16.850248 +16.854050 +16.857853 +16.861655 +16.865458 +16.869260 +16.873062 +16.876865 +16.880667 +16.884469 +16.888272 +16.892074 +16.895877 +16.899679 +16.903481 +16.907284 +16.911086 +16.914888 +16.918691 +16.922493 +16.926296 +16.930098 +16.933900 +16.937703 +16.941505 +16.945308 +16.949110 +16.952912 +16.956715 +16.960517 +16.964319 +16.968122 +16.971924 +16.975727 +16.979529 +16.983331 +16.987134 +16.990936 +16.994738 +16.998541 +17.002343 +17.006146 +17.009948 +17.013750 +17.017553 +17.021355 +17.025158 +17.028960 +17.032762 +17.036565 +17.040367 +17.044169 +17.047972 +17.051774 +17.055577 +17.059379 +17.063181 +17.066984 +17.070786 +17.074588 +17.078391 +17.082193 +17.085996 +17.089798 +17.093600 +17.097403 +17.101205 +17.105008 +17.108810 +17.112612 +17.116415 +17.120217 +17.124019 +17.127822 +17.131624 +17.135427 +17.139229 +17.143031 +17.146834 +17.150636 +17.154438 +17.158241 +17.162043 +17.165846 +17.169648 +17.173450 +17.177253 +17.181055 +17.184857 +17.188660 +17.192462 +17.196265 +17.200067 +17.203869 +17.207672 +17.211474 +17.215277 +17.219079 +17.222881 +17.226684 +17.230486 +17.234288 +17.238091 +17.241893 +17.245696 +17.249498 +17.253300 +17.257103 +17.260905 +17.264707 +17.268510 +17.272312 +17.276115 +17.279917 +17.283719 +17.287522 +17.291324 +17.295127 +17.298929 +17.302731 +17.306534 +17.310336 +17.314138 +17.317941 +17.321743 +17.325546 +17.329348 +17.333150 +17.336953 +17.340755 +17.344557 +17.348360 +17.352162 +17.355965 +17.359767 +17.363569 +17.367372 +17.371174 +17.374976 +17.378779 +17.382581 +17.386384 +17.390186 +17.393988 +17.397791 +17.401593 +17.405396 +17.409198 +17.413000 +17.416803 +17.420605 +17.424407 +17.428210 +17.432012 +17.435815 +17.439617 +17.443419 +17.447222 +17.451024 +17.454826 +17.458629 +17.462431 +17.466234 +17.470036 +17.473838 +17.477641 +17.481443 +17.485246 +17.489048 +17.492850 +17.496653 +17.500455 +17.504257 +17.508060 +17.511862 +17.515665 +17.519467 +17.523269 +17.527072 +17.530874 +17.534676 +17.538479 +17.542281 +17.546084 +17.549886 +17.553688 +17.557491 +17.561293 +17.565096 +17.568898 +17.572700 +17.576503 +17.580305 +17.584107 +17.587910 +17.591712 +17.595515 +17.599317 +17.603119 +17.606922 +17.610724 +17.614526 +17.618329 +17.622131 +17.625934 +17.629736 +17.633538 +17.637341 +17.641143 +17.644945 +17.648748 +17.652550 +17.656353 +17.660155 +17.663957 +17.667760 +17.671562 +17.675365 +17.679167 +17.682969 +17.686772 +17.690574 +17.694376 +17.698179 +17.701981 +17.705784 +17.709586 +17.713388 +17.717191 +17.720993 +17.724795 +17.728598 +17.732400 +17.736203 +17.740005 +17.743807 +17.747610 +17.751412 +17.755215 +17.759017 +17.762819 +17.766622 +17.770424 +17.774226 +17.778029 +17.781831 +17.785634 +17.789436 +17.793238 +17.797041 +17.800843 +17.804645 +17.808448 +17.812250 +17.816053 +17.819855 +17.823657 +17.827460 +17.831262 +17.835065 +17.838867 +17.842669 +17.846472 +17.850274 +17.854076 +17.857879 +17.861681 +17.865484 +17.869286 +17.873088 +17.876891 +17.880693 +17.884495 +17.888298 +17.892100 +17.895903 +17.899705 +17.903507 +17.907310 +17.911112 +17.914914 +17.918717 +17.922519 +17.926322 +17.930124 +17.933926 +17.937729 +17.941531 +17.945334 +17.949136 +17.952938 +17.956741 +17.960543 +17.964345 +17.968148 +17.971950 +17.975753 +17.979555 +17.983357 +17.987160 +17.990962 +17.994764 +17.998567 +18.002369 +18.006172 +18.009974 +18.013776 +18.017579 +18.021381 +18.025184 +18.028986 +18.032788 +18.036591 +18.040393 +18.044195 +18.047998 +18.051800 +18.055603 +18.059405 +18.063207 +18.067010 +18.070812 +18.074614 +18.078417 +18.082219 +18.086022 +18.089824 +18.093626 +18.097429 +18.101231 +18.105034 +18.108836 +18.112638 +18.116441 +18.120243 +18.124045 +18.127848 +18.131650 +18.135453 +18.139255 +18.143057 +18.146860 +18.150662 +18.154464 +18.158267 +18.162069 +18.165872 +18.169674 +18.173476 +18.177279 +18.181081 +18.184883 +18.188686 +18.192488 +18.196291 +18.200093 +18.203895 +18.207698 +18.211500 +18.215303 +18.219105 +18.222907 +18.226710 +18.230512 +18.234314 +18.238117 +18.241919 +18.245722 +18.249524 +18.253326 +18.257129 +18.260931 +18.264733 +18.268536 +18.272338 +18.276141 +18.279943 +18.283745 +18.287548 +18.291350 +18.295153 +18.298955 +18.302757 +18.306560 +18.310362 +18.314164 +18.317967 +18.321769 +18.325572 +18.329374 +18.333176 +18.336979 +18.340781 +18.344583 +18.348386 +18.352188 +18.355991 +18.359793 +18.363595 +18.367398 +18.371200 +18.375003 +18.378805 +18.382607 +18.386410 +18.390212 +18.394014 +18.397817 +18.401619 +18.405422 +18.409224 +18.413026 +18.416829 +18.420631 +18.424433 +18.428236 +18.432038 +18.435841 +18.439643 +18.443445 +18.447248 +18.451050 +18.454852 +18.458655 +18.462457 +18.466260 +18.470062 +18.473864 +18.477667 +18.481469 +18.485272 +18.489074 +18.492876 +18.496679 +18.500481 +18.504283 +18.508086 +18.511888 +18.515691 +18.519493 +18.523295 +18.527098 +18.530900 +18.534702 +18.538505 +18.542307 +18.546110 +18.549912 +18.553714 +18.557517 +18.561319 +18.565122 +18.568924 +18.572726 +18.576529 +18.580331 +18.584133 +18.587936 +18.591738 +18.595541 +18.599343 +18.603145 +18.606948 +18.610750 +18.614552 +18.618355 +18.622157 +18.625960 +18.629762 +18.633564 +18.637367 +18.641169 +18.644971 +18.648774 +18.652576 +18.656379 +18.660181 +18.663983 +18.667786 +18.671588 +18.675391 +18.679193 +18.682995 +18.686798 +18.690600 +18.694402 +18.698205 +18.702007 +18.705810 +18.709612 +18.713414 +18.717217 +18.721019 +18.724821 +18.728624 +18.732426 +18.736229 +18.740031 +18.743833 +18.747636 +18.751438 +18.755241 +18.759043 +18.762845 +18.766648 +18.770450 +18.774252 +18.778055 +18.781857 +18.785660 +18.789462 +18.793264 +18.797067 +18.800869 +18.804671 +18.808474 +18.812276 +18.816079 +18.819881 +18.823683 +18.827486 +18.831288 +18.835091 +18.838893 +18.842695 +18.846498 +18.850300 +18.854102 +18.857905 +18.861707 +18.865510 +18.869312 +18.873114 +18.876917 +18.880719 +18.884521 +18.888324 +18.892126 +18.895929 +18.899731 +18.903533 +18.907336 +18.911138 +18.914940 +18.918743 +18.922545 +18.926348 +18.930150 +18.933952 +18.937755 +18.941557 +18.945360 +18.949162 +18.952964 +18.956767 +18.960569 +18.964371 +18.968174 +18.971976 +18.975779 +18.979581 +18.983383 +18.987186 +18.990988 +18.994790 +18.998593 +19.002395 +19.006198 +19.010000 diff --git a/inputFiles/lagrangianContactMechanics/dataTables/y.csv b/inputFiles/lagrangianContactMechanics/dataTables/y.csv new file mode 100644 index 00000000000..1d65b3e555f --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/dataTables/y.csv @@ -0,0 +1 @@ +0.00 \ No newline at end of file diff --git a/inputFiles/lagrangianContactMechanics/dataTables/z.csv b/inputFiles/lagrangianContactMechanics/dataTables/z.csv new file mode 100644 index 00000000000..1d65b3e555f --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/dataTables/z.csv @@ -0,0 +1 @@ +0.00 \ No newline at end of file diff --git a/inputFiles/lagrangianContactMechanics/scripts/fixedFaultSlip.py b/inputFiles/lagrangianContactMechanics/scripts/fixedFaultSlip.py new file mode 100644 index 00000000000..64cbb7e5575 --- /dev/null +++ b/inputFiles/lagrangianContactMechanics/scripts/fixedFaultSlip.py @@ -0,0 +1,213 @@ +import numpy as np +import os +import sys +import xml.etree.ElementTree as ElementTree +import matplotlib +import matplotlib.pyplot as plt +import argparse + +class SingularCrackSlip: + + def __init__(self, mechanicalParameters, length ): + K = mechanicalParameters["bulkModulus"] + G = mechanicalParameters["shearModulus"] + poisson_ratio= (3 * K - 2 * G) / (2 * (3 * K + G)) + + mu_star = G /( 1 - poisson_ratio) + self.tau_0 = 0.0 + self.tau_r = -1.0 + + self.scaling = 2*(self.tau_0 - self.tau_r)/mu_star + self.halfLength = length + + def computeSlip(self, x): + return self.scaling * np.sqrt(self.halfLength**2 - x**2) + + def computeTraction(self, x): + if x < -self.halfLength or x > self.halfLength: + return self.tau_0 + (self.tau_0-self.tau_r) * ( np.abs(x)/np.sqrt(x**2 - self.halfLength**2) - 1 ) + else: + return self.tau_r +class GaussianSlip: + + def __init__(self, peakStrength, length ): + self.scaling = peakStrength + self.halfLength = length + + def computeSlip(self, x): + denom = 1 / (self.halfLength/2) + return self.scaling*np.exp(-0.5*((x)/denom)**2) + +def getMechanicalParametersFromXML(xmlFilePath): + tree = ElementTree.parse(xmlFilePath) + + param = tree.find('Constitutive/ElasticIsotropic') + + mechanicalParameters = dict.fromkeys(["bulkModulus", "shearModulus"]) + mechanicalParameters["bulkModulus"] = float(param.get("defaultBulkModulus")) + mechanicalParameters["shearModulus"] = float(param.get("defaultShearModulus")) + return mechanicalParameters + +def getFractureLengthFromXML(xmlFilePath): + tree = ElementTree.parse(xmlFilePath) + + rectangle = tree.find('Geometry/Box') + xmin = rectangle.get("xMin") + xmax = rectangle.get("xMax") + xmin = [float(i) for i in xmin[1:-1].split(",")] + xmax = [float(i) for i in xmax[1:-1].split(",")] + length = ( xmax[0] - xmin[0] ) / 2 + origin = 0.0 + + return length, origin + +def curve_check_solution(**kwargs): + #-------- Extract info from XML + xmlFilePath = f'./LagrangeContactBubbleStab_FixedSlip_base.xml' + + mechanicalParameters = getMechanicalParametersFromXML(xmlFilePath) + + # Get length of the fracture + xmlFilePath = f'./LagrangeContactBubbleStab_FixedSlip_smoke.xml' + totalHalfLength, originShift = getFractureLengthFromXML(xmlFilePath) + halfLength = 2.0 + + x = kwargs['traction elementCenter'] + x_geos = x[0, :, 0] + + return analytical_solution(x, mechanicalParameters, totalHalfLength, halfLength) + +def analytical_solution(x, mechanicalParameters, totalHalfLength, halfLength): + + singularCrackSlipSolution = SingularCrackSlip(mechanicalParameters, halfLength) + x = np.linspace(-totalHalfLength, totalHalfLength, 10000, endpoint=True) + traction_analytical = np.zeros(len(x)) + i = 0 + for xCell in x: + traction_analytical[i] = singularCrackSlipSolution.computeTraction(xCell) + i += 1 + return traction_analytical + +def plot_traction_solution(inputFileDirectory, outputDirectory): + # Read HDF5 + import hdf5_wrapper + hdf5File1Path = f'outputDirectory/traction.hdf5' + + # Read HDF5 + data = hdf5_wrapper.hdf5_wrapper(hdf5File1Path).get_copy() + traction = data['traction'] + traction = np.asarray(traction) + traction_geos = traction[0, :, 1] + x = data['traction elementCenter'] + x_geos = x[0, :, 0] + + #-------- Extract info from XML + xmlFilePath = f'{inputFileDirectory}/lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_base.xml' + + mechanicalParameters = getMechanicalParametersFromXML(xmlFilePath) + + # Get length of the fracture + xmlFilePath = f'{inputFileDirectory}lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_smoke.xml' + totalHalfLength, originShift = getFractureLengthFromXML(xmlFilePath) + halfLength = 2.0 + + traction_analytical = analytical_solution(x, mechanicalParameters, totalHalfLength, halfLength) + + fsize = 30 + msize = 15 + lw = 2 + fig, ax = plt.subplots(1, figsize=(16, 12)) + cmap = plt.get_cmap("tab10") + + # Plot analytical (continuous line) and numerical (markers) aperture solution + ax.plot(x, traction_analytical, color='r', label='Traction analytical', lw=lw) + ax.plot(x_geos, traction_geos, color='k', label='geos', marker="o", lw=lw) + + ax.set_xlabel('Fault coordinate [m]', size=fsize, weight="bold") + ax.set_ylabel('Shear traction', size=fsize, weight="bold") + ax.legend(bbox_to_anchor=(0.75, 0.9), loc='center', borderaxespad=0., fontsize=fsize) + ax.xaxis.set_tick_params(labelsize=fsize) + ax.yaxis.set_tick_params(labelsize=fsize) + plt.savefig("traction.png") + +def output_tables(x, slip, name): + # Save x to x.csv with one value per row + np.savetxt('x.csv', x, fmt='%f') + + # Save aperture_analytical to jump.csv with one value per row + np.savetxt(f'{name}.csv', slip, fmt='%f') + + +def generate_tables(inputFileDirectory): + #-------- Extract info from XML + xmlFilePath = f'{inputFileDirectory}/lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_base.xml' + + mechanicalParameters = getMechanicalParametersFromXML(xmlFilePath) + appliedPressure = 1.0 + + # Get length of the fracture + xmlFilePath = f'{inputFileDirectory}/lagrangianContactMechanics/LagrangeContactBubbleStab_FixedSlip_smoke.xml' + totalHalfLength, originShift = getFractureLengthFromXML(xmlFilePath) + halfLength = 2.0 + + # Initialize Sneddon's analytical solution + singularCrackSlipSolution = SingularCrackSlip(mechanicalParameters, halfLength ) + peakStrength = 3.0 + gaussianSlipSolution = GaussianSlip( peakStrength, halfLength) + + # Plot analytical (continuous line) and numerical (markers) aperture solution + x = np.linspace(-totalHalfLength, totalHalfLength, 10000, endpoint=True) + singularCrackSlip = np.zeros(len(x)) + gaussianSlip = np.zeros(len(x)) + i = 0 + for xCell in x: + if xCell > -halfLength and xCell < halfLength: + singularCrackSlip[i] = singularCrackSlipSolution.computeSlip(xCell) + gaussianSlip[i] = gaussianSlipSolution.computeSlip(xCell) + i += 1 + + fsize = 24 + msize = 15 + lw = 6 + fig, ax = plt.subplots(1, figsize=(16, 12)) + cmap = plt.get_cmap("tab10") + + ax.plot(x, singularCrackSlip , color='k', label='Analytical Solution', lw=lw) + ax.grid() + ax.set_xlabel('Fault coordinate [m]', size=fsize, weight="bold") + ax.set_ylabel('slip [m]', size=fsize, weight="bold") + ax.legend(bbox_to_anchor=(0.7, 1), loc='center', borderaxespad=0., fontsize=fsize) + ax.xaxis.set_tick_params(labelsize=fsize) + ax.yaxis.set_tick_params(labelsize=fsize) + plt.savefig("singularCrackSlip.png") + + fig, ax = plt.subplots(1, figsize=(16, 12)) + cmap = plt.get_cmap("tab10") + + ax.plot(x, gaussianSlip , color='k', label='Analytical Solution', lw=lw) + ax.grid() + ax.set_xlabel('Fault coordinate [m]', size=fsize, weight="bold") + ax.set_ylabel('slip [m]', size=fsize, weight="bold") + ax.legend(bbox_to_anchor=(0.75, 0.9), loc='center', borderaxespad=0., fontsize=fsize) + ax.xaxis.set_tick_params(labelsize=fsize) + ax.yaxis.set_tick_params(labelsize=fsize) + plt.savefig("gaussianSlip.png") + + output_tables(x, singularCrackSlip, "singularCrackSlip") + output_tables(x, gaussianSlip, "gaussianSlip") + +if __name__ == "__main__": + + parser = argparse.ArgumentParser() + parser.add_argument('-a', '--action', type=str, choices=['generate_tables', 'plotTractions'], required=True, help='Action to perform: generate_tables or plotTractions') + parser.add_argument('-i', '--input-files-path', type=str, required=True, help='Path to the inputFilesFolder') + parser.add_argument('-o', '--output-dir', type=str, help='Directory containing the output files') + + args = parser.parse_args() + + if args.action == 'generate_tables': + print("Generating tables...") + generate_tables(os.path.normpath(args.input_files_path)) + elif args.action == 'plotTractions': + print("Plotting tractions...") + plot_traction_solution(os.path.normpath(args.input_files_path), os.path.normpath(args.output_dir)) diff --git a/src/coreComponents/constitutive/ConstitutivePassThru.hpp b/src/coreComponents/constitutive/ConstitutivePassThru.hpp index decabffbb6a..3ec1b954192 100644 --- a/src/coreComponents/constitutive/ConstitutivePassThru.hpp +++ b/src/coreComponents/constitutive/ConstitutivePassThru.hpp @@ -50,6 +50,7 @@ #include "permeability/SlipDependentPermeability.hpp" #include "permeability/WillisRichardsPermeability.hpp" #include "contact/CoulombFriction.hpp" +#include "contact/RateAndStateFriction.hpp" namespace geos @@ -84,6 +85,23 @@ struct ConstitutivePassThru< ElasticIsotropic > } }; +/** + * Specialization for models that derive from FrictionBase. + */ +template<> +struct ConstitutivePassThru< FrictionBase > +{ + template< typename LAMBDA > + static + void execute( ConstitutiveBase & constitutiveRelation, LAMBDA && lambda ) + { + ConstitutivePassThruHandler< CoulombFriction, + RateAndStateFriction >::execute( constitutiveRelation, + std::forward< LAMBDA >( lambda ) ); + } +}; + + /** * Specialization for models that derive from CoulombFriction. */ diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.hpp b/src/coreComponents/constitutive/contact/CoulombFriction.hpp index d117d8895e5..3851000dd13 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.hpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.hpp @@ -96,6 +96,7 @@ class CoulombFrictionUpdates : public FrictionBaseUpdates arraySlice1d< real64 const > const & dispJump, arraySlice1d< real64 const > const & penalty, arraySlice1d< real64 const > const & traction, + real64 const faceArea, bool const symmetric, bool const fixedLimitTau, real64 const normalTractionTolerance, @@ -111,6 +112,7 @@ class CoulombFrictionUpdates : public FrictionBaseUpdates arraySlice1d< real64 const > const & deltaDispJump, arraySlice1d< real64 const > const & penalty, arraySlice1d< real64 const > const & traction, + real64 const faceArea, arraySlice1d< real64 > const & tractionNew ) const override final; GEOS_HOST_DEVICE @@ -328,6 +330,7 @@ inline void CoulombFrictionUpdates::updateTraction( arraySlice1d< real64 const > arraySlice1d< real64 const > const & dispJump, arraySlice1d< real64 const > const & penalty, arraySlice1d< real64 const > const & traction, + real64 const faceArea, bool const symmetric, bool const fixedLimitTau, real64 const normalTractionTolerance, @@ -344,9 +347,9 @@ inline void CoulombFrictionUpdates::updateTraction( arraySlice1d< real64 const > // Compute the trial traction real64 tractionTrial[ 3 ]; - tractionTrial[ 0 ] = traction[0] + penalty[0] * dispJump[0]; - tractionTrial[ 1 ] = traction[1] + penalty[1] * (dispJump[1] - oldDispJump[1]); - tractionTrial[ 2 ] = traction[2] + penalty[1] * (dispJump[2] - oldDispJump[2]); + tractionTrial[ 0 ] = traction[0] + penalty[0] * dispJump[0] * faceArea; + tractionTrial[ 1 ] = traction[1] + penalty[1] * (dispJump[1] - oldDispJump[1]) * faceArea; + tractionTrial[ 2 ] = traction[2] + penalty[1] * (dispJump[2] - oldDispJump[2]) * faceArea; // Compute tangential trial traction norm real64 const tau[2] = { tractionTrial[1], @@ -462,15 +465,16 @@ inline void CoulombFrictionUpdates::updateTractionOnly( arraySlice1d< real64 con arraySlice1d< real64 const > const & deltaDispJump, arraySlice1d< real64 const > const & penalty, arraySlice1d< real64 const > const & traction, + real64 const faceArea, arraySlice1d< real64 > const & tractionNew ) const { // TODO: Pass this tol as an argument or define a new class member real64 const zero = LvArray::NumericLimits< real64 >::epsilon; - tractionNew[0] = traction[0] + penalty[0] * dispJump[0]; - tractionNew[1] = traction[1] + penalty[1] * deltaDispJump[1]; - tractionNew[2] = traction[2] + penalty[1] * deltaDispJump[2]; + tractionNew[0] = traction[0] + penalty[0] * dispJump[0] * faceArea; + tractionNew[1] = traction[1] + penalty[1] * deltaDispJump[1] * faceArea; + tractionNew[2] = traction[2] + penalty[1] * deltaDispJump[2] * faceArea; real64 const tau[2] = { tractionNew[1], tractionNew[2] }; diff --git a/src/coreComponents/constitutive/contact/FrictionBase.hpp b/src/coreComponents/constitutive/contact/FrictionBase.hpp index e05923f2998..28629920af0 100644 --- a/src/coreComponents/constitutive/contact/FrictionBase.hpp +++ b/src/coreComponents/constitutive/contact/FrictionBase.hpp @@ -109,6 +109,7 @@ class FrictionBaseUpdates arraySlice1d< real64 const > const & dispJump, arraySlice1d< real64 const > const & penalty, arraySlice1d< real64 const > const & traction, + real64 const faceArea, bool const symmetric, bool const fixedLimitTau, real64 const normalTractionTolerance, @@ -117,7 +118,7 @@ class FrictionBaseUpdates real64 ( & tractionNew )[3], integer & fractureState ) const { - GEOS_UNUSED_VAR( oldDispJump, dispJump, penalty, traction, symmetric, fixedLimitTau, + GEOS_UNUSED_VAR( oldDispJump, dispJump, penalty, traction, faceArea, symmetric, fixedLimitTau, normalTractionTolerance, tangentialTractionTolerance, dTraction_dDispJump, tractionNew, fractureState ); } @@ -136,8 +137,9 @@ class FrictionBaseUpdates arraySlice1d< real64 const > const & deltaDispJump, arraySlice1d< real64 const > const & penalty, arraySlice1d< real64 const > const & traction, + real64 const faceArea, arraySlice1d< real64 > const & tractionNew ) const - { GEOS_UNUSED_VAR( dispJump, deltaDispJump, penalty, traction, tractionNew ); } + { GEOS_UNUSED_VAR( dispJump, deltaDispJump, penalty, traction, faceArea, tractionNew ); } /** * @brief Check for the constraint satisfaction diff --git a/src/coreComponents/constitutive/contact/FrictionSelector.hpp b/src/coreComponents/constitutive/contact/FrictionSelector.hpp index 8eab7ff72dd..08b7a232a1b 100644 --- a/src/coreComponents/constitutive/contact/FrictionSelector.hpp +++ b/src/coreComponents/constitutive/contact/FrictionSelector.hpp @@ -23,6 +23,7 @@ #include "constitutive/ConstitutivePassThruHandler.hpp" #include "constitutive/contact/CoulombFriction.hpp" #include "constitutive/contact/FrictionlessContact.hpp" +#include "constitutive/contact/RateAndStateFriction.hpp" namespace geos { @@ -35,7 +36,8 @@ void constitutiveUpdatePassThru( FrictionBase const & contact, LAMBDA && lambda ) { ConstitutivePassThruHandler< FrictionlessContact, - CoulombFriction >::execute( contact, std::forward< LAMBDA >( lambda ) ); + CoulombFriction, + RateAndStateFriction >::execute( contact, std::forward< LAMBDA >( lambda ) ); } template< typename LAMBDA > @@ -43,7 +45,8 @@ void constitutiveUpdatePassThru( FrictionBase & contact, LAMBDA && lambda ) { ConstitutivePassThruHandler< FrictionlessContact, - CoulombFriction >::execute( contact, std::forward< LAMBDA >( lambda ) ); + CoulombFriction, + RateAndStateFriction >::execute( contact, std::forward< LAMBDA >( lambda ) ); } } /* namespace constitutive */ diff --git a/src/coreComponents/physicsSolvers/contact/CMakeLists.txt b/src/coreComponents/physicsSolvers/contact/CMakeLists.txt index c9bf75bec3e..ac5fbe3bc1a 100644 --- a/src/coreComponents/physicsSolvers/contact/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/contact/CMakeLists.txt @@ -3,18 +3,21 @@ set( physicsSolvers_headers ${physicsSolvers_headers} contact/ContactSolverBase.hpp contact/ContactFields.hpp - contact/SolidMechanicsEFEMKernelsBase.hpp - contact/SolidMechanicsEFEMKernels.hpp - contact/SolidMechanicsEFEMStaticCondensationKernels.hpp - contact/SolidMechanicsEFEMKernelsHelper.hpp contact/SolidMechanicsEmbeddedFractures.hpp contact/SolidMechanicsLagrangeContact.hpp + contact/SolidMechanicsLagrangeContactBubbleStab.hpp contact/SolidMechanicsAugmentedLagrangianContact.hpp - contact/SolidMechanicsALMKernelsBase.hpp - contact/SolidMechanicsALMKernels.hpp - contact/SolidMechanicsALMKernelsHelper.hpp - contact/SolidMechanicsALMJumpUpdateKernels.hpp - contact/SolidMechanicsALMBubbleKernels.hpp + contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp + contact/kernels/SolidMechanicsDisplacementJumpUpdateKernels.hpp + contact/kernels/SolidMechanicsEFEMKernelsBase.hpp + contact/kernels/SolidMechanicsEFEMKernels.hpp + contact/kernels/SolidMechanicsEFEMStaticCondensationKernels.hpp + contact/kernels/SolidMechanicsEFEMKernelsHelper.hpp + contact/kernels/SolidMechanicsALMKernelsBase.hpp + contact/kernels/SolidMechanicsALMKernels.hpp + contact/kernels/SolidMechanicsConformingContactKernelsHelper.hpp + contact/kernels/SolidMechanicsContactFaceBubbleKernels.hpp + contact/kernels/SolidMechanicsLagrangeContactKernels.hpp contact/LogLevelsInfo.hpp PARENT_SCOPE ) @@ -25,5 +28,6 @@ set( physicsSolvers_sources contact/ContactSolverBase.cpp contact/SolidMechanicsEmbeddedFractures.cpp contact/SolidMechanicsLagrangeContact.cpp + contact/SolidMechanicsLagrangeContactBubbleStab.cpp contact/SolidMechanicsAugmentedLagrangianContact.cpp PARENT_SCOPE ) \ No newline at end of file diff --git a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp index f86521ffd75..59671a5ad6b 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp @@ -82,6 +82,14 @@ DECLARE_FIELD( slip, NO_WRITE, "Slip." ); +DECLARE_FIELD( deltaSlip, + "deltaSlip", + array2d< real64 >, + 0.0, + LEVEL_0, + WRITE_AND_READ, + "Slip increment" ); + DECLARE_FIELD( deltaDispJump, "deltaDisplacementJump", array2d< real64 >, @@ -146,6 +154,14 @@ DECLARE_FIELD( oldFractureState, NO_WRITE, "Fracture state at the previous timestep." ); +DECLARE_FIELD( targetIncrementalJump, + "targetIncrementalJump", + array2d< real64 >, + 0, + NOPLOT, + WRITE_AND_READ, + "It's the target incremental jump in a timestep (e.g., slip coming from RS)." ); + ENUM_STRINGS( FractureState::State, "stick", "new_slip", "slip", "open" ); diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index 63210cb686c..4b6aaef3599 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -92,6 +92,8 @@ void ContactSolverBase::registerDataOnMesh( dataRepository::Group & meshBodies ) subRegion.registerField< fields::contact::oldFractureState >( getName() ); subRegion.registerField< fields::contact::slip >( getName() ); + + subRegion.registerField< fields::contact::deltaSlip >( getName() ); } ); } ); @@ -251,4 +253,4 @@ void ContactSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & su } } -} /* namespace geos */ +} /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp index fee37cee7b9..466438795b6 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -20,10 +20,12 @@ #include "mesh/DomainPartition.hpp" #include "SolidMechanicsAugmentedLagrangianContact.hpp" -#include "physicsSolvers/contact/SolidMechanicsALMKernels.hpp" -#include "physicsSolvers/contact/SolidMechanicsALMSimultaneousKernels.hpp" -#include "physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp" -#include "physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsALMKernels.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsALMKernelsBase.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsALMSimultaneousKernels.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsDisplacementJumpUpdateKernels.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsContactFaceBubbleKernels.hpp" #include "physicsSolvers/contact/LogLevelsInfo.hpp" #include "constitutive/ConstitutiveManager.hpp" @@ -81,26 +83,13 @@ void SolidMechanicsAugmentedLagrangianContact::registerDataOnMesh( dataRepositor { fractureRegion.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion & subRegion ) { + subRegion.registerField< fields::contact::deltaTraction >( getName() ). + reference().resizeDimension< 1 >( 3 ); + // Register the rotation matrix subRegion.registerField< contact::rotationMatrix >( this->getName() ). reference().resizeDimension< 1, 2 >( 3, 3 ); - // Register the traction field - subRegion.registerField< contact::traction >( this->getName() ). - reference().resizeDimension< 1 >( 3 ); - - // Register the displacement jump - subRegion.registerField< contact::dispJump >( this->getName() ). - reference().resizeDimension< 1 >( 3 ); - - // Register the delta displacement jump - subRegion.registerField< contact::deltaDispJump >( this->getName() ). - reference().resizeDimension< 1 >( 3 ); - - // Register the displacement jump old - subRegion.registerField< contact::oldDispJump >( this->getName() ). - reference().resizeDimension< 1 >( 3 ); - // Register the penalty coefficients for the iterative procedure subRegion.registerField< contact::iterativePenalty >( this->getName() ). reference().resizeDimension< 1 >( 5 ); @@ -252,12 +241,19 @@ void SolidMechanicsAugmentedLagrangianContact::implicitStepSetup( real64 const & arrayView3d< real64 > const rotationMatrix = subRegion.getField< fields::contact::rotationMatrix >().toView(); + arrayView2d< real64 > const unitNormal = subRegion.getNormalVector(); + arrayView2d< real64 > const unitTangent1 = subRegion.getTangentVector1(); + arrayView2d< real64 > const unitTangent2 = subRegion.getTangentVector2(); + // Compute rotation matrices - solidMechanicsALMKernels::ComputeRotationMatricesKernel:: + solidMechanicsConformingContactKernels::ComputeRotationMatricesKernel:: launch< parallelDevicePolicy<> >( subRegion.size(), faceNormal, elemsToFaces, - rotationMatrix ); + rotationMatrix, + unitNormal, + unitTangent1, + unitTangent2 ); // Set the tollerances computeTolerances( domain ); @@ -492,13 +488,13 @@ void SolidMechanicsAugmentedLagrangianContact::assembleSystem( real64 const time real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( gravityVector() ); - solidMechanicsALMKernels::ALMBubbleFactory kernelFactory( dispDofNumber, - bubbleDofNumber, - dofManager.rankOffset(), - localMatrix, - localRhs, - dt, - gravityVectorData ); + solidMechanicsConformingContactKernels::FaceBubbleFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + localMatrix, + localRhs, + dt, + gravityVectorData ); real64 maxTraction = finiteElement:: regionBasedKernelApplication @@ -699,13 +695,13 @@ void SolidMechanicsAugmentedLagrangianContact::applySystemSolution( DofManager c arrayView1d< localIndex const > const & faceElementList ) { - solidMechanicsALMKernels::ALMJumpUpdateFactory kernelFactory( dispDofNumber, - bubbleDofNumber, - dofManager.rankOffset(), - voidMatrix.toViewConstSizes(), - voidRhs.toView(), - dt, - faceElementList ); + solidMechanicsConformingContactKernels::DispJumpUpdateFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + voidMatrix.toViewConstSizes(), + voidRhs.toView(), + dt, + faceElementList ); real64 maxTraction = finiteElement:: interfaceBasedKernelApplication @@ -787,7 +783,7 @@ bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartit arrayView1d< real64 const > const & normalTractionTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ); - arrayView1d< real64 const > const area = subRegion.getElementArea().toViewConst(); + arrayView1d< real64 const > const faceElementArea = subRegion.getElementArea().toViewConst(); std::ptrdiff_t const sizes[ 2 ] = {subRegion.size(), 3}; traction_new.resize( 2, sizes ); @@ -810,6 +806,7 @@ bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartit traction, dispJump, deltaDispJump, + faceElementArea, traction_new_v ); } else @@ -821,6 +818,7 @@ bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartit traction, dispJump, deltaDispJump, + faceElementArea, traction_new_v ); } } ); @@ -843,7 +841,6 @@ bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartit normalDisplacementTolerance, slidingTolerance, slidingCheckTolerance, - area, fractureState, condConv_v ); } ); @@ -967,6 +964,8 @@ bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartit arrayView2d< real64 const > const deltaDispJump = subRegion.getField< contact::deltaDispJump >(); + arrayView1d< real64 const > const faceElementArea = subRegion.getField< fields::elementArea >(); + constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) { using FrictionType = TYPEOFREF( castedFrictionLaw ); @@ -978,6 +977,7 @@ bool SolidMechanicsAugmentedLagrangianContact::updateConfiguration( DomainPartit oldDispJump, dispJump, iterativePenalty, + faceElementArea, m_symmetric, normalTractionTolerance, traction, diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index 65584046e5c..e25682f1a13 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -32,9 +32,9 @@ #include "mesh/SurfaceElementRegion.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp" -#include "physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp" -#include "physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp" -#include "physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsEFEMKernels.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsEFEMStaticCondensationKernels.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsEFEMJumpUpdateKernels.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 003ed8cb7f7..c9a9ae4aac2 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -504,9 +504,9 @@ void SolidMechanicsLagrangeContact::computeFaceDisplacementJump( DomainPartition ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); arrayView1d< real64 const > const & area = subRegion.getElementArea().toViewConst(); - arrayView2d< real64 > const & dispJump = subRegion.getField< contact::dispJump >(); - arrayView1d< real64 > const & slip = subRegion.getField< fields::contact::slip >(); - arrayView1d< real64 > const & aperture = subRegion.getField< fields::elementAperture >(); + arrayView2d< real64 > const dispJump = subRegion.getField< contact::dispJump >(); + arrayView1d< real64 > const slip = subRegion.getField< fields::contact::slip >(); + arrayView1d< real64 > const aperture = subRegion.getField< fields::elementAperture >(); forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp new file mode 100644 index 00000000000..88f575a8c88 --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp @@ -0,0 +1,1180 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SolidMechanicsLagrangeContactBubbleStab.cpp + * + */ + +#include "mesh/DomainPartition.hpp" +#include "SolidMechanicsLagrangeContactBubbleStab.hpp" + +#include "physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsLagrangeContactKernels.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsDisplacementJumpUpdateKernels.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsContactFaceBubbleKernels.hpp" +#include "physicsSolvers/contact/LogLevelsInfo.hpp" + +#include "constitutive/ConstitutiveManager.hpp" +#include "constitutive/contact/FrictionSelector.hpp" +#include "fieldSpecification/FieldSpecificationManager.hpp" + + +namespace geos +{ + +using namespace constitutive; +using namespace dataRepository; +using namespace fields; + +SolidMechanicsLagrangeContactBubbleStab::SolidMechanicsLagrangeContactBubbleStab( const string & name, + Group * const parent ): + ContactSolverBase( name, parent ) +{ + m_faceTypeToFiniteElements["Quadrilateral"] = std::make_unique< finiteElement::H1_QuadrilateralFace_Lagrange1_GaussLegendre2 >(); + m_faceTypeToFiniteElements["Triangle"] = std::make_unique< finiteElement::H1_TriangleFace_Lagrange1_Gauss1 >(); + +} + +SolidMechanicsLagrangeContactBubbleStab::~SolidMechanicsLagrangeContactBubbleStab() +{ + // TODO Auto-generated destructor stub +} + +real64 SolidMechanicsLagrangeContactBubbleStab::solverStep( real64 const & time_n, + real64 const & dt, + const integer cycleNumber, + DomainPartition & domain ) +{ + if( cycleNumber == 0 ) + { + /// Apply initial conditions to the Fault + FieldSpecificationManager & fieldSpecificationManager = FieldSpecificationManager::getInstance(); + + forDiscretizationOnMeshTargets ( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + + { + fieldSpecificationManager.applyInitialConditions( mesh ); + // Would like to do it like this but it is not working. There is a cast in Object path that tries to cast + // all objects that derive from ElementSubRegionBase to the specified type so this obviously fails. + // fieldSpecificationManager.forSubGroups< FieldSpecificationBase >( [&] ( FieldSpecificationBase const & fs ) + // { + // if( fs.initialCondition() ) + // { + // fs.apply< SurfaceElementSubRegion >( mesh, + // [&]( FieldSpecificationBase const & bc, + // string const &, + // SortedArrayView< localIndex const > const & targetSet, + // SurfaceElementSubRegion & targetGroup, + // string const fieldName ) + // { + // bc.applyFieldValue< FieldSpecificationEqual >( targetSet, 0.0, targetGroup, fieldName ); + // } ); + // } + // } ); + } ); + } + + return ContactSolverBase::solverStep( time_n, dt, cycleNumber, domain ); +} + +void SolidMechanicsLagrangeContactBubbleStab::registerDataOnMesh( Group & meshBodies ) +{ + ContactSolverBase::registerDataOnMesh( meshBodies ); + + forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, + MeshLevel & meshLevel, + arrayView1d< string const > const & ) + { + FaceManager & faceManager = meshLevel.getFaceManager(); + + // Register the total bubble displacement + faceManager.registerField< solidMechanics::totalBubbleDisplacement >( this->getName() ). + reference().resizeDimension< 1 >( 3 ); + + // Register the incremental bubble displacement + faceManager.registerField< solidMechanics::incrementalBubbleDisplacement >( this->getName() ). + reference().resizeDimension< 1 >( 3 ); + } ); + + forFractureRegionOnMeshTargets( meshBodies, [&] ( SurfaceElementRegion & fractureRegion ) + { + fractureRegion.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion & subRegion ) + { + // Register the rotation matrix + subRegion.registerField< contact::rotationMatrix >( this->getName() ). + reference().resizeDimension< 1, 2 >( 3, 3 ); + + subRegion.registerField< fields::contact::deltaTraction >( getName() ). + reference().resizeDimension< 1 >( 3 ); + + subRegion.registerField< fields::contact::targetIncrementalJump >( getName() ). + reference().resizeDimension< 1 >( 3 ); + } ); + } ); +} + +void SolidMechanicsLagrangeContactBubbleStab::setupDofs( DomainPartition const & domain, + DofManager & dofManager ) const +{ + GEOS_MARK_FUNCTION; + + SolidMechanicsLagrangianFEM::setupDofs( domain, dofManager ); + + map< std::pair< string, string >, array1d< string > > meshTargets; + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshBodyName, + MeshLevel const & meshLevel, + arrayView1d< string const > const & regionNames ) + { + array1d< string > regions; + ElementRegionManager const & elementRegionManager = meshLevel.getElemManager(); + elementRegionManager.forElementRegions< SurfaceElementRegion >( regionNames, + [&]( localIndex const, + SurfaceElementRegion const & region ) + { + regions.emplace_back( region.getName() ); + } ); + meshTargets[std::make_pair( meshBodyName, meshLevel.getName())] = std::move( regions ); + } ); + + dofManager.addField( solidMechanics::totalBubbleDisplacement::key(), + FieldLocation::Face, + 3, + meshTargets ); + + dofManager.addField( contact::traction::key(), + FieldLocation::Elem, + 3, + meshTargets ); + + // Add coupling between bubble + dofManager.addCoupling( solidMechanics::totalBubbleDisplacement::key(), + solidMechanics::totalBubbleDisplacement::key(), + DofManager::Connector::Elem ); + + dofManager.addCoupling( contact::traction::key(), + contact::traction::key(), + DofManager::Connector::Elem ); + + dofManager.addCoupling( solidMechanics::totalDisplacement::key(), + contact::traction::key(), + DofManager::Connector::Elem, + meshTargets ); + + dofManager.addCoupling( solidMechanics::totalBubbleDisplacement::key(), + contact::traction::key(), + DofManager::Connector::Elem, + meshTargets ); + + dofManager.addCoupling( solidMechanics::totalDisplacement::key(), + solidMechanics::totalBubbleDisplacement::key(), + DofManager::Connector::Elem, + meshTargets ); +} + +void SolidMechanicsLagrangeContactBubbleStab::setupSystem( DomainPartition & domain, + DofManager & dofManager, + CRSMatrix< real64, globalIndex > & localMatrix, + ParallelVector & rhs, + ParallelVector & solution, + bool const GEOS_UNUSED_PARAM( setSparsity ) ) +{ + + + // setup monolithic coupled system + + // Create the lists of interface elements that have same type. + createFaceTypeList( domain ); + + // Create the lists of interface elements that have same type and same fracture state. + updateStickSlipList( domain ); + + // Create the list of cell elements that they are enriched with bubble functions. + createBubbleCellList( domain ); + + dofManager.setDomain( domain ); + setupDofs( domain, dofManager ); + dofManager.reorderByRank(); + + // Set the sparsity pattern without the Abu and Aub blocks. + SparsityPattern< globalIndex > patternDiag; + dofManager.setSparsityPattern( patternDiag ); + + // Get the original row lengths (diagonal blocks only) + array1d< localIndex > rowLengths( patternDiag.numRows() ); + for( localIndex localRow = 0; localRow < patternDiag.numRows(); ++localRow ) + { + rowLengths[localRow] = patternDiag.numNonZeros( localRow ); + } + + // Add the number of nonzeros induced by coupling + this->addCouplingNumNonzeros( domain, dofManager, rowLengths.toView() ); + + // Create a new pattern with enough capacity for coupled matrix + SparsityPattern< globalIndex > pattern; + pattern.resizeFromRowCapacities< parallelHostPolicy >( patternDiag.numRows(), patternDiag.numColumns(), rowLengths.data() ); + + // Copy the original nonzeros + for( localIndex localRow = 0; localRow < patternDiag.numRows(); ++localRow ) + { + globalIndex const * cols = patternDiag.getColumns( localRow ).dataIfContiguous(); + pattern.insertNonZeros( localRow, cols, cols + patternDiag.numNonZeros( localRow ) ); + } + + // Add the nonzeros from coupling + this->addCouplingSparsityPattern( domain, dofManager, pattern.toView() ); + + // Finally, steal the pattern into a CRS matrix + localMatrix.assimilate< parallelDevicePolicy<> >( std::move( pattern ) ); + localMatrix.setName( this->getName() + "/localMatrix" ); + + rhs.setName( this->getName() + "/rhs" ); + rhs.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); + + solution.setName( this->getName() + "/solution" ); + solution.create( dofManager.numLocalDofs(), MPI_COMM_GEOS ); + + computeRotationMatrices( domain ); +} + +void SolidMechanicsLagrangeContactBubbleStab::computeRotationMatrices( DomainPartition & domain ) const +{ + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + + FaceManager & faceManager = mesh.getFaceManager(); + ElementRegionManager & elemManager = mesh.getElemManager(); + + SurfaceElementRegion & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + + arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); + ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + + arrayView2d< real64 > const incrBubbleDisp = + faceManager.getField< fields::solidMechanics::incrementalBubbleDisplacement >(); + + arrayView3d< real64 > const rotationMatrix = + subRegion.getField< fields::contact::rotationMatrix >().toView(); + + arrayView2d< real64 > const unitNormal = subRegion.getNormalVector(); + arrayView2d< real64 > const unitTangent1 = subRegion.getTangentVector1(); + arrayView2d< real64 > const unitTangent2 = subRegion.getTangentVector2(); + + // Compute rotation matrices + solidMechanicsConformingContactKernels::ComputeRotationMatricesKernel::launch< parallelDevicePolicy<> >( subRegion.size(), + faceNormal, + elemsToFaces, + rotationMatrix, + unitNormal, + unitTangent1, + unitTangent2 ); + + forAll< parallelDevicePolicy<> >( subRegion.size(), + [ = ] + GEOS_HOST_DEVICE ( localIndex const k ) + { + localIndex const kf0 = elemsToFaces[k][0]; + localIndex const kf1 = elemsToFaces[k][1]; + LvArray::tensorOps::fill< 3 >( incrBubbleDisp[kf0], 0.0 ); + LvArray::tensorOps::fill< 3 >( incrBubbleDisp[kf1], 0.0 ); + } ); + } ); +} + +void SolidMechanicsLagrangeContactBubbleStab::implicitStepSetup( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) +{ + SolidMechanicsLagrangianFEM::implicitStepSetup( time_n, dt, domain ); +} + +void SolidMechanicsLagrangeContactBubbleStab::assembleSystem( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + GEOS_MARK_FUNCTION; + + SolidMechanicsLagrangianFEM::assembleSystem( time, + dt, + domain, + dofManager, + localMatrix, + localRhs ); + + assembleStabilization( dt, domain, dofManager, localMatrix, localRhs ); + + assembleContact( dt, domain, dofManager, localMatrix, localRhs ); + + // parallel_matrix.create( localMatrix.toViewConst(), dofManager.numLocalDofs(), MPI_COMM_GEOS ); + // parallel_matrix.write("newMatrix.mtx"); + // std::cout << localRhs << std::endl; +} + +void SolidMechanicsLagrangeContactBubbleStab::assembleStabilization( real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + // Loop for assembling contributes of bubble elements (Abb, Abu, Aub) + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + NodeManager const & nodeManager = mesh.getNodeManager(); + FaceManager const & faceManager = mesh.getFaceManager(); + + string const & dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + string const & bubbleDofKey = dofManager.getKey( solidMechanics::totalBubbleDisplacement::key() ); + + arrayView1d< globalIndex const > const dispDofNumber = nodeManager.getReference< globalIndex_array >( dispDofKey ); + arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); + + real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( gravityVector() ); + + + solidMechanicsConformingContactKernels::FaceBubbleFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + localMatrix, + localRhs, + dt, + gravityVectorData ); + + real64 maxTraction = finiteElement:: + regionBasedKernelApplication + < parallelDevicePolicy< >, + constitutive::ElasticIsotropic, + CellElementSubRegion >( mesh, + regionNames, + getDiscretizationName(), + SolidMechanicsLagrangianFEM::viewKeyStruct::solidMaterialNamesString(), + kernelFactory ); + + GEOS_UNUSED_VAR( maxTraction ); + + } ); +} + +void SolidMechanicsLagrangeContactBubbleStab::assembleContact( real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshName, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + NodeManager const & nodeManager = mesh.getNodeManager(); + FaceManager const & faceManager = mesh.getFaceManager(); + + string const & dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + string const & bubbleDofKey = dofManager.getKey( solidMechanics::totalBubbleDisplacement::key() ); + string const & tractionDofKey = dofManager.getKey( contact::traction::key() ); + + arrayView1d< globalIndex const > const dispDofNumber = nodeManager.getReference< globalIndex_array >( dispDofKey ); + arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); + + string const & fractureRegionName = this->getUniqueFractureRegionName(); + + forFiniteElementOnStickFractureSubRegions( meshName, [&] ( string const &, + finiteElement::FiniteElementBase const & subRegionFE, + arrayView1d< localIndex const > const & faceElementList, + bool const ) + { + solidMechanicsLagrangeContactKernels::LagrangeContactFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + localMatrix, + localRhs, + dt, + faceElementList, + tractionDofKey ); + + real64 maxTraction = finiteElement:: + interfaceBasedKernelApplication + < parallelDevicePolicy< >, + constitutive::FrictionBase >( mesh, + fractureRegionName, + faceElementList, + subRegionFE, + viewKeyStruct::frictionLawNameString(), + kernelFactory ); + + GEOS_UNUSED_VAR( maxTraction ); + } ); + } ); +} + +void SolidMechanicsLagrangeContactBubbleStab::implicitStepComplete( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) +{ + SolidMechanicsLagrangianFEM::implicitStepComplete( time_n, dt, domain ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + mesh.getElemManager().forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) + { + arrayView2d< real64 > const deltaTraction = subRegion.getField< contact::deltaTraction >(); + arrayView2d< real64 > const deltaDispJump = subRegion.getField< contact::deltaDispJump >(); + arrayView2d< real64 const > const dispJump = subRegion.getField< contact::dispJump >(); + arrayView2d< real64 > const oldDispJump = subRegion.getField< contact::oldDispJump >(); + + forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) + { + LvArray::tensorOps::fill< 3 >( deltaDispJump[kfe], 0.0 ); + LvArray::tensorOps::fill< 3 >( deltaTraction[kfe], 0.0 ); + LvArray::tensorOps::copy< 3 >( oldDispJump[kfe], dispJump[kfe] ); + } ); + } ); + } ); +} + +real64 SolidMechanicsLagrangeContactBubbleStab::calculateResidualNorm( real64 const & time, + real64 const & dt, + DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ) +{ + GEOS_MARK_FUNCTION; + + real64 const solidResidual = SolidMechanicsLagrangianFEM::calculateResidualNorm( time, dt, domain, dofManager, localRhs ); + + real64 const contactResidual = calculateContactResidualNorm( domain, dofManager, localRhs ); + + return sqrt( solidResidual * solidResidual + contactResidual * contactResidual ); +} + +real64 SolidMechanicsLagrangeContactBubbleStab::calculateContactResidualNorm( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ) +{ + string const & dofKey = dofManager.getKey( contact::traction::key() ); + globalIndex const rankOffset = dofManager.rankOffset(); + + real64 stickResidual = 0.0; + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) + { + mesh.getElemManager().forElementSubRegions< FaceElementSubRegion >( regionNames, + [&]( localIndex const, FaceElementSubRegion const & subRegion ) + { + arrayView1d< globalIndex const > const & dofNumber = subRegion.getReference< array1d< globalIndex > >( dofKey ); + arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); + arrayView1d< real64 const > const & area = subRegion.getElementArea(); + + RAJA::ReduceSum< parallelHostReduce, real64 > stickSum( 0.0 ); + forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const k ) + { + if( ghostRank[k] < 0 ) + { + localIndex const localRow = LvArray::integerConversion< localIndex >( dofNumber[k] - rankOffset ); + for( localIndex dim = 0; dim < 3; ++dim ) + { + real64 const norm = localRhs[localRow + dim] / area[k]; + stickSum += norm * norm; + } + } + } ); + + stickResidual += stickSum.get(); + } ); + } ); + + stickResidual = MpiWrapper::sum( stickResidual ); + stickResidual = sqrt( stickResidual ); + + if( getLogLevel() >= 1 && logger::internal::rank==0 ) + { + std::cout << GEOS_FMT( " ( Rt ) = ( {:15.6e} )", stickResidual ); + } + + return sqrt( stickResidual * stickResidual ); +} + + +void SolidMechanicsLagrangeContactBubbleStab::applySystemSolution( DofManager const & dofManager, + arrayView1d< real64 const > const & localSolution, + real64 const scalingFactor, + real64 const dt, + DomainPartition & domain ) +{ + GEOS_MARK_FUNCTION; + + SolidMechanicsLagrangianFEM::applySystemSolution( dofManager, localSolution, scalingFactor, dt, domain ); + + dofManager.addVectorToField( localSolution, + contact::traction::key(), + contact::deltaTraction::key(), + scalingFactor ); + + dofManager.addVectorToField( localSolution, + contact::traction::key(), + contact::traction::key(), + scalingFactor ); + + dofManager.addVectorToField( localSolution, + solidMechanics::totalBubbleDisplacement::key(), + solidMechanics::totalBubbleDisplacement::key(), + scalingFactor ); + + dofManager.addVectorToField( localSolution, + solidMechanics::totalBubbleDisplacement::key(), + solidMechanics::incrementalBubbleDisplacement::key(), + scalingFactor ); + + + // Loop for updating the displacement jump + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshName, + MeshLevel & mesh, + arrayView1d< string const > const & ) + + { + + NodeManager const & nodeManager = mesh.getNodeManager(); + FaceManager const & faceManager = mesh.getFaceManager(); + + string const & dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + string const & bubbleDofKey = dofManager.getKey( solidMechanics::totalBubbleDisplacement::key() ); + + arrayView1d< globalIndex const > const dispDofNumber = nodeManager.getReference< globalIndex_array >( dispDofKey ); + arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); + + string const & fractureRegionName = this->getUniqueFractureRegionName(); + + CRSMatrix< real64, globalIndex > const voidMatrix; + array1d< real64 > const voidRhs; + + forFiniteElementOnFractureSubRegions( meshName, [&] ( string const &, + finiteElement::FiniteElementBase const & subRegionFE, + arrayView1d< localIndex const > const & faceElementList ) + { + + solidMechanicsConformingContactKernels::DispJumpUpdateFactory kernelFactory( dispDofNumber, + bubbleDofNumber, + dofManager.rankOffset(), + voidMatrix.toViewConstSizes(), + voidRhs.toView(), + dt, + faceElementList ); + + real64 maxTraction = finiteElement:: + interfaceBasedKernelApplication + < parallelDevicePolicy< >, + constitutive::NullModel >( mesh, + fractureRegionName, + faceElementList, + subRegionFE, + "", + kernelFactory ); + + GEOS_UNUSED_VAR( maxTraction ); + + } ); + } ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + { + FieldIdentifiers fieldsToBeSync; + + fieldsToBeSync.addFields( FieldLocation::Face, + { solidMechanics::incrementalBubbleDisplacement::key(), + solidMechanics::totalBubbleDisplacement::key() } ); + + fieldsToBeSync.addElementFields( { contact::traction::key(), + contact::deltaTraction::key(), + contact::dispJump::key() }, + { getUniqueFractureRegionName() } ); + + CommunicationTools::getInstance().synchronizeFields( fieldsToBeSync, + mesh, + domain.getNeighbors(), + true ); + } ); +} + +void SolidMechanicsLagrangeContactBubbleStab::addCouplingNumNonzeros( DomainPartition & domain, + DofManager & dofManager, + arrayView1d< localIndex > const & rowLengths ) const +{ + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) + { + + ElementRegionManager const & elemManager = mesh.getElemManager(); + NodeManager const & nodeManager = mesh.getNodeManager(); + FaceManager const & faceManager = mesh.getFaceManager(); + + ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); + + globalIndex const rankOffset = dofManager.rankOffset(); + + string const bubbleDofKey = dofManager.getKey( solidMechanics::totalBubbleDisplacement::key() ); + string const dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + + arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); + arrayView1d< globalIndex const > const dispDofNumber = nodeManager.getReference< globalIndex_array >( dispDofKey ); + + elemManager.forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, CellElementSubRegion const & cellElementSubRegion ) + { + + arrayView1d< localIndex const > const bubbleElemsList = cellElementSubRegion.bubbleElementsList(); + arrayView2d< localIndex const > const faceElemsList = cellElementSubRegion.faceElementsList(); + + localIndex const numDispDof = 3*cellElementSubRegion.numNodesPerElement(); + + for( localIndex bi=0; bi( bubbleDofNumber[k] - rankOffset ); + + if( localRow >= 0 && localRow < rowLengths.size() ) + { + for( localIndex i=0; i<3; ++i ) + { + rowLengths[localRow + i] += numDispDof; + } + } + + for( localIndex a=0; a( dispDofNumber[node] - rankOffset ); + + if( localDispRow >= 0 && localDispRow < rowLengths.size() ) + { + for( int d=0; d<3; ++d ) + { + rowLengths[localDispRow + d] += 3; + } + } + } + } + + } ); + + SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + + for( localIndex kfe=0; kfe( bubbleDofNumber[kf] - rankOffset ); + + if( localRow >= 0 && localRow < rowLengths.size() ) + { + for( localIndex i=0; i<3; ++i ) + { + rowLengths[localRow + i] += numDispDof; + } + } + + for( localIndex a=0; a( dispDofNumber[node] - rankOffset ); + + if( localDispRow >= 0 && localDispRow < rowLengths.size() ) + { + for( int d=0; d<3; ++d ) + { + rowLengths[localDispRow + d] += 3; + } + } + } + } + + } + + } ); +} + +void SolidMechanicsLagrangeContactBubbleStab::addCouplingSparsityPattern( DomainPartition const & domain, + DofManager const & dofManager, + SparsityPatternView< globalIndex > const & pattern ) const +{ + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) + { + + ElementRegionManager const & elemManager = mesh.getElemManager(); + NodeManager const & nodeManager = mesh.getNodeManager(); + FaceManager const & faceManager = mesh.getFaceManager(); + + globalIndex const rankOffset = dofManager.rankOffset(); + + string const bubbleDofKey = dofManager.getKey( solidMechanics::totalBubbleDisplacement::key() ); + string const dispDofKey = dofManager.getKey( solidMechanics::totalDisplacement::key() ); + + arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); + arrayView1d< globalIndex const > const dispDofNumber = nodeManager.getReference< globalIndex_array >( dispDofKey ); + + static constexpr int maxNumDispDof = 3 * 8; + + elemManager.forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, CellElementSubRegion const & cellElementSubRegion ) + { + + arrayView1d< localIndex const > const bubbleElemsList = cellElementSubRegion.bubbleElementsList(); + arrayView2d< localIndex const > const faceElemsList = cellElementSubRegion.faceElementsList(); + + localIndex const numDispDof = 3*cellElementSubRegion.numNodesPerElement(); + + for( localIndex bi=0; bi eqnRowIndicesDisp ( numDispDof ); + stackArray1d< globalIndex, 3 > eqnRowIndicesBubble( 3 ); + stackArray1d< globalIndex, maxNumDispDof > dofColIndicesDisp ( numDispDof ); + stackArray1d< globalIndex, 3 > dofColIndicesBubble( 3 ); + + for( localIndex idof = 0; idof < 3; ++idof ) + { + eqnRowIndicesBubble[idof] = bubbleDofNumber[k] + idof - rankOffset; + dofColIndicesBubble[idof] = bubbleDofNumber[k] + idof; + } + + for( localIndex a=0; a= 0 && eqnRowIndicesDisp[i] < pattern.numRows() ) + { + for( localIndex j = 0; j < dofColIndicesBubble.size(); ++j ) + { + pattern.insertNonZero( eqnRowIndicesDisp[i], dofColIndicesBubble[j] ); + } + } + } + + for( localIndex i = 0; i < eqnRowIndicesBubble.size(); ++i ) + { + if( eqnRowIndicesBubble[i] >= 0 && eqnRowIndicesBubble[i] < pattern.numRows() ) + { + for( localIndex j=0; j < dofColIndicesDisp.size(); ++j ) + { + pattern.insertNonZero( eqnRowIndicesBubble[i], dofColIndicesDisp[j] ); + } + } + } + + } + + } ); + + SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); + + static constexpr int maxNumDispFaceDof = 3 * 4; + + for( localIndex kfe=0; kfe eqnRowIndicesDisp ( numDispDof ); + stackArray1d< globalIndex, 3 > eqnRowIndicesBubble( 3 ); + stackArray1d< globalIndex, maxNumDispFaceDof > dofColIndicesDisp ( numDispDof ); + stackArray1d< globalIndex, 3 > dofColIndicesBubble( 3 ); + + for( localIndex idof = 0; idof < 3; ++idof ) + { + eqnRowIndicesBubble[idof] = bubbleDofNumber[kf] + idof - rankOffset; + dofColIndicesBubble[idof] = bubbleDofNumber[kf] + idof; + } + + for( localIndex a=0; a= 0 && eqnRowIndicesDisp[i] < pattern.numRows() ) + { + for( localIndex j = 0; j < dofColIndicesBubble.size(); ++j ) + { + pattern.insertNonZero( eqnRowIndicesDisp[i], dofColIndicesBubble[j] ); + } + } + } + + for( localIndex i = 0; i < eqnRowIndicesBubble.size(); ++i ) + { + if( eqnRowIndicesBubble[i] >= 0 && eqnRowIndicesBubble[i] < pattern.numRows() ) + { + for( localIndex j=0; j < dofColIndicesDisp.size(); ++j ) + { + pattern.insertNonZero( eqnRowIndicesBubble[i], dofColIndicesDisp[j] ); + } + } + } + + } + } + } ); + +} + +void SolidMechanicsLagrangeContactBubbleStab::updateStickSlipList( DomainPartition const & domain ) +{ + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshName, + MeshLevel const & mesh, + arrayView1d< string const > const & ) + + { + + ElementRegionManager const & elemManager = mesh.getElemManager(); + SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + + arrayView1d< integer const > const fractureState = subRegion.getField< contact::fractureState >(); + + forFiniteElementOnFractureSubRegions( meshName, [&] ( string const & finiteElementName, + finiteElement::FiniteElementBase const &, + arrayView1d< localIndex const > const & faceElementList ) + { + + array1d< localIndex > keys( subRegion.size()); + array1d< localIndex > vals( subRegion.size()); + array1d< localIndex > stickList; + array1d< localIndex > slipList; + RAJA::ReduceSum< ReducePolicy< parallelDevicePolicy<> >, localIndex > nStick_r( 0 ); + RAJA::ReduceSum< ReducePolicy< parallelDevicePolicy<> >, localIndex > nSlip_r( 0 ); + + arrayView1d< localIndex > const keys_v = keys.toView(); + arrayView1d< localIndex > const vals_v = vals.toView(); + forAll< parallelDevicePolicy<> >( faceElementList.size(), + [ = ] + GEOS_HOST_DEVICE ( localIndex const kfe ) + { + + localIndex const faceIndex = faceElementList[kfe]; + if( fractureState[faceIndex] == contact::FractureState::Stick ) + { + keys_v[kfe]=0; + vals_v[kfe]=faceIndex; + nStick_r += 1; + } + else if(( fractureState[faceIndex] == contact::FractureState::Slip ) || + (fractureState[faceIndex] == contact::FractureState::NewSlip)) + { + keys_v[kfe]=1; + vals_v[kfe]=faceIndex; + nSlip_r += 1; + } + else + { + keys_v[kfe] = 2; + } + + } ); + + localIndex nStick = static_cast< localIndex >(nStick_r.get()); + localIndex nSlip = static_cast< localIndex >(nSlip_r.get()); + + // Sort vals according to keys to ensure that + // elements of the same type are adjacent in the vals list. + // This arrangement allows for efficient copying into the container + // by leveraging parallelism. + RAJA::sort_pairs< parallelDevicePolicy<> >( keys_v, vals_v ); + + stickList.resize( nStick ); + slipList.resize( nSlip ); + arrayView1d< localIndex > const stickList_v = stickList.toView(); + arrayView1d< localIndex > const slipList_v = slipList.toView(); + + forAll< parallelDevicePolicy<> >( nStick, [ = ] + GEOS_HOST_DEVICE ( localIndex const kfe ) + { + stickList_v[kfe] = vals_v[kfe]; + } ); + + forAll< parallelDevicePolicy<> >( nSlip, [ = ] + GEOS_HOST_DEVICE ( localIndex const kfe ) + { + slipList_v[kfe] = vals_v[nStick+kfe]; + } ); + + this->m_faceTypesToFaceElementsStick[meshName][finiteElementName] = stickList; + this->m_faceTypesToFaceElementsSlip[meshName][finiteElementName] = slipList; + + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Configuration, GEOS_FMT( "# stick elements: {}, # slip elements: {}", nStick, nSlip )) + } ); + } ); + +} + +void SolidMechanicsLagrangeContactBubbleStab::createFaceTypeList( DomainPartition const & domain ) +{ + + // Generate lists containing elements of various face types + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const & meshName, + MeshLevel const & mesh, + arrayView1d< string const > const ) + { + FaceManager const & faceManager = mesh.getFaceManager(); + ElementRegionManager const & elemManager = mesh.getElemManager(); + ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); + + SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + + array1d< localIndex > keys( subRegion.size()); + array1d< localIndex > vals( subRegion.size()); + array1d< localIndex > quadList; + array1d< localIndex > triList; + RAJA::ReduceSum< ReducePolicy< parallelDevicePolicy<> >, localIndex > nTri_r( 0 ); + RAJA::ReduceSum< ReducePolicy< parallelDevicePolicy<> >, localIndex > nQuad_r( 0 ); + + arrayView1d< localIndex > const keys_v = keys.toView(); + arrayView1d< localIndex > const vals_v = vals.toView(); + // Determine the size of the lists and generate the vector keys and vals for parallel indexing into lists. + // (With RAJA, parallelizing this operation seems the most viable approach.) + forAll< parallelDevicePolicy<> >( subRegion.size(), + [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + + localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( kfe ); + if( numNodesPerFace == 3 ) + { + keys_v[kfe]=0; + vals_v[kfe]=kfe; + nTri_r += 1; + } + else if( numNodesPerFace == 4 ) + { + keys_v[kfe]=1; + vals_v[kfe]=kfe; + nQuad_r += 1; + } + else + { + GEOS_ERROR( "SolidMechanicsLagrangeContactBubbleStab:: invalid face type" ); + } + } ); + + localIndex nQuad = static_cast< localIndex >(nQuad_r.get()); + localIndex nTri = static_cast< localIndex >(nTri_r.get()); + + // Sort vals according to keys to ensure that + // elements of the same type are adjacent in the vals list. + // This arrangement allows for efficient copying into the container + // by leveraging parallelism. + RAJA::sort_pairs< parallelDevicePolicy<> >( keys_v, vals_v ); + + quadList.resize( nQuad ); + triList.resize( nTri ); + arrayView1d< localIndex > const quadList_v = quadList.toView(); + arrayView1d< localIndex > const triList_v = triList.toView(); + + forAll< parallelDevicePolicy<> >( nTri, [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + triList_v[kfe] = vals_v[kfe]; + } ); + + forAll< parallelDevicePolicy<> >( nQuad, [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + quadList_v[kfe] = vals_v[nTri+kfe]; + } ); + + this->m_faceTypesToFaceElements[meshName]["Quadrilateral"] = quadList; + this->m_faceTypesToFaceElements[meshName]["Triangle"] = triList; + } ); + +} + +void SolidMechanicsLagrangeContactBubbleStab::createBubbleCellList( DomainPartition & domain ) const +{ + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + + SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); + FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); + // Array to store face indexes + array1d< localIndex > tmpSpace( 2*subRegion.size()); + SortedArray< localIndex > faceIdList; + + arrayView1d< localIndex > const tmpSpace_v = tmpSpace.toView(); + // Store indexes of faces in the temporany array. + { + ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + + localIndex const kf0 = elemsToFaces[kfe][0], kf1 = elemsToFaces[kfe][1]; + tmpSpace_v[2*kfe] = kf0, tmpSpace_v[2*kfe+1] = kf1; + + } ); + } + + // Sort indexes to enable efficient searching using binary search. + RAJA::stable_sort< parallelDevicePolicy<> >( tmpSpace_v ); + faceIdList.insert( tmpSpace_v.begin(), tmpSpace_v.end()); + + // Search for bubble element on each CellElementSubRegion and + // store element indexes, global and local face indexes. + elemManager.forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, CellElementSubRegion & cellElementSubRegion ) + { + + arrayView2d< localIndex const > const elemsToFaces = cellElementSubRegion.faceList().toViewConst(); + + RAJA::ReduceSum< ReducePolicy< parallelDevicePolicy<> >, localIndex > nBubElems_r( 0 ); + + localIndex const n_max = cellElementSubRegion.size() * elemsToFaces.size( 1 ); + array1d< localIndex > keys( n_max ); + array1d< localIndex > perms( n_max ); + array1d< localIndex > vals( n_max ); + array1d< localIndex > localFaceIds( n_max ); + + arrayView1d< localIndex > const keys_v = keys.toView(); + arrayView1d< localIndex > const perms_v = perms.toView(); + arrayView1d< localIndex > const vals_v = vals.toView(); + arrayView1d< localIndex > const localFaceIds_v = localFaceIds.toView(); + SortedArrayView< localIndex const > const faceIdList_v = faceIdList.toViewConst(); + + forAll< parallelDevicePolicy<> >( cellElementSubRegion.size(), + [ = ] + GEOS_HOST_DEVICE ( localIndex const kfe ) + { + for( int i=0; i < elemsToFaces.size( 1 ); ++i ) + { + perms_v[kfe*elemsToFaces.size( 1 )+i] = kfe*elemsToFaces.size( 1 )+i; + if( faceIdList_v.contains( elemsToFaces[kfe][i] )) + { + keys_v[kfe*elemsToFaces.size( 1 )+i] = 0; + vals_v[kfe*elemsToFaces.size( 1 )+i] = kfe; + localFaceIds_v[kfe*elemsToFaces.size( 1 )+i] = i; + nBubElems_r += 1; + } + else + { + keys_v[kfe*elemsToFaces.size( 1 )+i] = 1; + vals_v[kfe*elemsToFaces.size( 1 )+i] = -1; + localFaceIds_v[kfe*elemsToFaces.size( 1 )+i] = -1; + } + } + } ); + + // Sort perms according to keys to ensure that bubble elements are adjacent + // and occupy the first positions of the list. + // This arrangement allows for efficient copying into the container + // by leveraging parallelism. + localIndex nBubElems = static_cast< localIndex >(nBubElems_r.get()); + RAJA::sort_pairs< parallelDevicePolicy<> >( keys_v, perms_v ); + + array1d< localIndex > bubbleElemsList; + bubbleElemsList.resize( nBubElems ); + + arrayView1d< localIndex > const bubbleElemsList_v = bubbleElemsList.toView(); + + forAll< parallelDevicePolicy<> >( n_max, [ = ] GEOS_HOST_DEVICE ( localIndex const k ) + { + keys_v[k] = vals_v[perms_v[k]]; + } ); + + forAll< parallelDevicePolicy<> >( nBubElems, [ = ] GEOS_HOST_DEVICE ( localIndex const k ) + { + bubbleElemsList_v[k] = keys_v[k]; + } ); + cellElementSubRegion.setBubbleElementsList( bubbleElemsList.toViewConst()); + + forAll< parallelDevicePolicy<> >( n_max, [ = ] GEOS_HOST_DEVICE ( localIndex const k ) + { + keys_v[k] = localFaceIds_v[perms_v[k]]; + } ); + + array2d< localIndex > faceElemsList; + faceElemsList.resize( nBubElems, 2 ); + + arrayView2d< localIndex > const faceElemsList_v = faceElemsList.toView(); + + forAll< parallelDevicePolicy<> >( nBubElems, + [ = ] + GEOS_HOST_DEVICE ( localIndex const k ) + { + localIndex const kfe = bubbleElemsList_v[k]; + faceElemsList_v[k][0] = elemsToFaces[kfe][keys_v[k]]; + faceElemsList_v[k][1] = keys_v[k]; + } ); + cellElementSubRegion.setFaceElementsList( faceElemsList.toViewConst()); + + } ); + + } ); + +} + +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SolidMechanicsLagrangeContactBubbleStab, string const &, Group * const ) + +} /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.hpp new file mode 100644 index 00000000000..b1256f47d1f --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.hpp @@ -0,0 +1,240 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SolidMechanicsLagrangeContactBubbleStab.hpp + * + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSLAGRANGECONTACTBUBBLESTAB_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSLAGRANGECONTACTBUBBLESTAB_HPP_ + +#include "physicsSolvers/contact/ContactSolverBase.hpp" + +namespace geos +{ + +class NumericalMethodsManager; + +class SolidMechanicsLagrangeContactBubbleStab : public ContactSolverBase +{ +public: + + SolidMechanicsLagrangeContactBubbleStab( const string & name, + Group * const parent ); + + ~SolidMechanicsLagrangeContactBubbleStab() override; + + /** + * @brief name of the node manager in the object catalog + * @return string that contains the catalog name to generate a new NodeManager object through the object catalog. + */ + static string catalogName() + { + return "SolidMechanicsLagrangeContactBubbleStab"; + } + /** + * @copydoc SolverBase::getCatalogName() + */ + string getCatalogName() const override { return catalogName(); } + + virtual void registerDataOnMesh( Group & MeshBodies ) override final; + + real64 solverStep( real64 const & time_n, + real64 const & dt, + const integer cycleNumber, + DomainPartition & domain ) override final; + + virtual void + setupDofs( DomainPartition const & domain, + DofManager & dofManager ) const override; + + virtual void + setupSystem( DomainPartition & domain, + DofManager & dofManager, + CRSMatrix< real64, globalIndex > & localMatrix, + ParallelVector & rhs, + ParallelVector & solution, + bool const setSparsity = true ) override final; + + virtual void + implicitStepSetup( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) override final; + + virtual void + implicitStepComplete( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) override final; + + virtual void + assembleSystem( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) override; + + virtual real64 + calculateResidualNorm( real64 const & time, + real64 const & dt, + DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ) override; + + virtual void + applySystemSolution( DofManager const & dofManager, + arrayView1d< real64 const > const & localSolution, + real64 const scalingFactor, + real64 const dt, + DomainPartition & domain ) override; + + void assembleContact( real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ); + + void assembleStabilization( real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ); + + real64 calculateContactResidualNorm( DomainPartition const & domain, + DofManager const & dofManager, + arrayView1d< real64 const > const & localRhs ); + + /** + * @brief Loop over the finite element type on the fracture subregions of meshName and apply callback. + * @tparam LAMBDA The callback function type + * @param meshName The mesh name. + * @param lambda The callback function. Take the finite element type name and + * the list of face element of the same type. + */ + template< typename LAMBDA > + void forFiniteElementOnFractureSubRegions( string const & meshName, LAMBDA && lambda ) const + { + std::map< string, + array1d< localIndex > > const & faceTypesToFaceElements = m_faceTypesToFaceElements.at( meshName ); + + for( const auto & [finiteElementName, faceElementList] : faceTypesToFaceElements ) + { + arrayView1d< localIndex const > const faceElemList = faceElementList.toViewConst(); + + finiteElement::FiniteElementBase const & subRegionFE = *(m_faceTypeToFiniteElements.at( finiteElementName )); + + lambda( finiteElementName, subRegionFE, faceElemList ); + } + } + + /** + * @brief Loop over the finite element type on the stick fracture subregions of meshName and apply callback. + * @tparam LAMBDA The callback function type + * @param meshName The mesh name. + * @param lambda The callback function. Take the finite element type name and + * the list of face element of the same type. + */ + template< typename LAMBDA > + void forFiniteElementOnStickFractureSubRegions( string const & meshName, LAMBDA && lambda ) const + { + bool const isStickState = true; + + std::map< string, array1d< localIndex > > const & + faceTypesToFaceElements = m_faceTypesToFaceElementsStick.at( meshName ); + + for( const auto & [finiteElementName, faceElementList] : faceTypesToFaceElements ) + { + arrayView1d< localIndex const > const faceElemList = faceElementList.toViewConst(); + + finiteElement::FiniteElementBase const & subRegionFE = *(m_faceTypeToFiniteElements.at( finiteElementName )); + + lambda( finiteElementName, subRegionFE, faceElemList, isStickState ); + } + } + +/** + * @brief Create the list of finite elements of the same type + * for each FaceElementSubRegion (Triangle or Quadrilateral) + * and of the same fracture state (Stick or Slip). + * @param domain The physical domain object + */ + void updateStickSlipList( DomainPartition const & domain ); + + /** + * @brief Create the list of finite elements of the same type + * for each FaceElementSubRegion (Triangle or Quadrilateral). + * @param domain The physical domain object + */ + void createFaceTypeList( DomainPartition const & domain ); + + /** + * @brief Create the list of elements belonging to CellElementSubRegion + * that are enriched with the bubble basis functions + * @param domain The physical domain object + */ + void createBubbleCellList( DomainPartition & domain ) const; + + /** + * @brief Compute rotation matrices and unit normal vectors for Face elements. + * @param domain The domain partition object + */ + void computeRotationMatrices( DomainPartition & domain ) const; + + +private: + /** + * @brief add the number of non-zero elements induced by the coupling between + * nodal and bubble displacement. + * @param domain the physical domain object + * @param dofManager degree-of-freedom manager associated with the linear system + * @param rowLengths the array containing the number of non-zero elements for each row + */ + void addCouplingNumNonzeros( DomainPartition & domain, + DofManager & dofManager, + arrayView1d< localIndex > const & rowLengths ) const; + + /** + * @Brief add the sparsity pattern induced by the coupling + * @param domain the physical domain object + * @param dofManager degree-of-freedom manager associated with the linear system + * @param pattern the sparsity pattern + */ + void addCouplingSparsityPattern( DomainPartition const & domain, + DofManager const & dofManager, + SparsityPatternView< globalIndex > const & pattern ) const; + + /// Finite element type to face element index map + std::map< string, std::map< string, array1d< localIndex > > > m_faceTypesToFaceElements; + + /// Finite element type to face element index map (stick mode) + std::map< string, std::map< string, array1d< localIndex > > > m_faceTypesToFaceElementsStick; + + /// Finite element type to face element index map (slip mode) + std::map< string, std::map< string, array1d< localIndex > > > m_faceTypesToFaceElementsSlip; + + /// Finite element type to finite element object map + std::map< string, std::unique_ptr< geos::finiteElement::FiniteElementBase > > m_faceTypeToFiniteElements; + + struct viewKeyStruct : ContactSolverBase::viewKeyStruct + { + constexpr static char const * rotationMatrixString() { return "rotationMatrix"; } + }; + +}; + +} /* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSLAGRANGECONTACTBUBBLESTAB_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernels.hpp similarity index 88% rename from src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp rename to src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernels.hpp index 9f5c53f5132..4f50212c5be 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernels.hpp @@ -17,10 +17,12 @@ * @file SolidMechanicsALMKernels.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELS_HPP_ -#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELS_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSALMKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSALMKERNELS_HPP_ + +#include "SolidMechanicsConformingContactKernelsBase.hpp" +#include "mesh/MeshFields.hpp" -#include "SolidMechanicsALMKernelsBase.hpp" namespace geos { @@ -34,13 +36,13 @@ namespace solidMechanicsALMKernels template< typename CONSTITUTIVE_TYPE, typename FE_TYPE > class ALM : - public ALMKernelsBase< CONSTITUTIVE_TYPE, - FE_TYPE > + public solidMechanicsConformingContactKernels::ConformingContactKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE > { public: /// Alias for the base class. - using Base = ALMKernelsBase< CONSTITUTIVE_TYPE, - FE_TYPE >; + using Base = solidMechanicsConformingContactKernels::ConformingContactKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE >; /// Maximum number of nodes per element, which is equal to the maxNumTestSupportPointPerElem and /// maxNumTrialSupportPointPerElem by definition. @@ -49,6 +51,15 @@ class ALM : /// Compile time value for the number of quadrature points per element. static constexpr int numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + /// The number of displacement dofs per element. + static constexpr int numUdofs = Base::numUdofs; + + /// The number of bubble dofs per element. + static constexpr int numBdofs = Base::numBdofs; + + /// The number of lagrange multiplier dofs per element. + static constexpr int numTdofs = Base::numTdofs; + using Base::m_elemsToFaces; using Base::m_faceToNodes; using Base::m_finiteElementSpace; @@ -58,7 +69,6 @@ class ALM : using Base::m_dofRankOffset; using Base::m_X; using Base::m_rotationMatrix; - using Base::m_penalty; using Base::m_dispJump; using Base::m_oldDispJump; using Base::m_matrix; @@ -98,7 +108,9 @@ class ALM : inputDt, faceElementList ), m_traction( elementSubRegion.getField< fields::contact::traction >().toViewConst()), - m_symmetric( isSymmetric ) + m_symmetric( isSymmetric ), + m_penalty( elementSubRegion.getField< fields::contact::iterativePenalty >().toViewConst() ), + m_faceArea( elementSubRegion.getField< fields::elementArea >().toViewConst() ) {} //*************************************************************************** @@ -109,27 +121,18 @@ class ALM : struct StackVariables : public Base::StackVariables { - /// The number of displacement dofs per element. - static constexpr int numUdofs = numNodesPerElem * 3 * 2; - - /// The number of lagrange multiplier dofs per element. - static constexpr int numTdofs = 3; - - /// The number of bubble dofs per element. - static constexpr int numBdofs = 3*2; - public: GEOS_HOST_DEVICE StackVariables(): Base::StackVariables(), - dispEqnRowIndices{}, - dispColIndices{}, - bEqnRowIndices{}, - bColIndices{}, - localRu{}, - localRb{}, - localAutAtu{ {} }, + dispEqnRowIndices{}, + dispColIndices{}, + bEqnRowIndices{}, + bColIndices{}, + localRu{}, + localRb{}, + localAutAtu{ {} }, localAbtAtb{ {} }, localAbtAtu{ {} }, localAutAtb{ {} }, @@ -196,8 +199,6 @@ class ALM : { constexpr int shift = numNodesPerElem * 3; - constexpr int numTdofs = 3; - int permutation[numNodesPerElem]; m_finiteElementSpace.getPermutation( permutation ); @@ -251,10 +252,6 @@ class ALM : GEOS_UNUSED_VAR( k ); constexpr real64 zero = LvArray::NumericLimits< real64 >::epsilon; - constexpr int numUdofs = numNodesPerElem * 3 * 2; - - constexpr int numBdofs = 3*2; - real64 matRRtAtu[3][numUdofs], matDRtAtu[3][numUdofs]; real64 matRRtAtb[3][numBdofs], matDRtAtb[3][numBdofs]; @@ -268,6 +265,7 @@ class ALM : m_dispJump[k], m_penalty[k], m_traction[k], + m_faceArea[k], m_symmetric, m_symmetric, zero, @@ -372,6 +370,10 @@ class ALM : bool const m_symmetric; + /// The array containing the penalty coefficients for each element. + arrayView2d< real64 const > const m_penalty; + + arrayView1d< real64 const > const m_faceArea; }; /// The factory used to construct the kernel. @@ -410,6 +412,7 @@ struct ComputeTractionKernel arrayView2d< real64 const > const & traction, arrayView2d< real64 const > const & dispJump, arrayView2d< real64 const > const & deltaDispJump, + arrayView1d< real64 const > const & faceArea, arrayView2d< real64 > const & tractionNew ) { @@ -417,7 +420,7 @@ struct ComputeTractionKernel { contactWrapper.updateTractionOnly( dispJump[k], deltaDispJump[k], - penalty[k], traction[k], tractionNew[k] ); + penalty[k], traction[k], faceArea[k], tractionNew[k] ); } ); } @@ -428,4 +431,4 @@ struct ComputeTractionKernel } // namespace geos -#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELS_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSALMKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernelsBase.hpp new file mode 100644 index 00000000000..18e5c3b1a4d --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernelsBase.hpp @@ -0,0 +1,173 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SolidMechanicsALMKernelsBase.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSALMKERNELSBASE_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSALMKERNELSBASE_HPP_ + +#include "finiteElement/kernelInterface/InterfaceKernelBase.hpp" +#include "SolidMechanicsConformingContactKernelsHelper.hpp" + +namespace geos +{ + +namespace solidMechanicsALMKernels +{ + +/** + * @brief A struct to check for constraint satisfaction + */ +struct ConstraintCheckKernel +{ + + /** + * @brief Launch the kernel function to check the constraint satisfaction + * @tparam POLICY the type of policy used in the kernel launch + * @tparam CONTACT_WRAPPER the type of contact wrapper doing the fracture traction updates + * @param[in] size the size of the subregion + * @param[in] traction the array containing the current traction + * @param[in] dispJump the array containing the displacement jump + * @param[in] deltaDispJump the array containing the delta displacement jump + * @param[in] normalTractionTolerance Check tolerance (normal traction) + * @param[in] normalDisplacementTolerance Check tolerance (compenetration) + * @param[in] slidingTolerance Check tolerance (sliding) + * @param[in] slidingCheckTolerance Check tolerance (if shear strass exceeds tauLim) + * @param[in] area interface element area + * @param[in] fractureState the array containing the fracture state + * @param[out] condConv the array containing the convergence flag: + * 0: Constraint conditions satisfied + * 1: Open + * 2: Compenetration + * 3: Slip exceeds sliding tolerance + * 4: Shear stress exceeds tauLim + */ + template< typename POLICY, typename CONTACT_WRAPPER > + static void + launch( localIndex const size, + CONTACT_WRAPPER const & contactWrapper, + arrayView1d< integer const > const & ghostRank, + arrayView2d< real64 > const & traction, + arrayView2d< real64 const > const & dispJump, + arrayView2d< real64 const > const & deltaDispJump, + arrayView1d< real64 const > const & normalTractionTolerance, + arrayView1d< real64 const > const & normalDisplacementTolerance, + arrayView1d< real64 const > const & slidingTolerance, + real64 const slidingCheckTolerance, + arrayView1d< integer const > const & fractureState, + arrayView1d< integer > const & condConv ) + { + + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + if( ghostRank[k] < 0 ) + { + contactWrapper.constraintCheck( dispJump[k], + deltaDispJump[k], + traction[k], + fractureState[k], + normalTractionTolerance[k], + normalDisplacementTolerance[k], + slidingTolerance[k], + slidingCheckTolerance, + condConv[k] ); + } + + } ); + } +}; + +/** + * @brief A struct to check for constraint satisfaction + */ +struct UpdateStateKernel +{ + + /** + * @brief Launch the kernel function to check the constraint satisfaction + * @tparam POLICY the type of policy used in the kernel launch + * @tparam CONTACT_WRAPPER the type of contact wrapper doing the fracture traction updates + * @param[in] size the size of the subregion + * @param[in] oldDispJump the array containing the old displacement jump (previous time step) + * @param[in] dispJump the array containing the displacement jump + * @param[in] penalty the array containing the penalty coefficients + * @param[in] symmetric flag to compute symmetric penalty matrix + * @param[in] normalTractionTolerance Check tolerance (normal traction) + * @param[in] traction the array containing the current traction + * @param[in] fractureState the array containing the fracture state + */ + template< typename POLICY, typename CONTACT_WRAPPER > + static void + launch( localIndex const size, + CONTACT_WRAPPER const & contactWrapper, + arrayView2d< real64 const > const & oldDispJump, + arrayView2d< real64 const > const & dispJump, + arrayView2d< real64 > const & penalty, + arrayView1d< real64 const > const & faceArea, + bool const symmetric, + arrayView1d< real64 const > const & normalTractionTolerance, + arrayView2d< real64 > const & traction, + arrayView1d< integer > const & fractureState ) + + { + forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + + real64 const zero = LvArray::NumericLimits< real64 >::epsilon; + + real64 localPenalty[3][3]{}; + real64 localTractionNew[3]{}; + contactWrapper.updateTraction( oldDispJump[k], + dispJump[k], + penalty[k], + traction[k], + faceArea[k], + symmetric, + false, + normalTractionTolerance[k], + zero, + localPenalty, + localTractionNew, + fractureState[k] ); + + if( fractureState[k] == fields::contact::FractureState::Open ) + { + + LvArray::tensorOps::fill< 3 >( localTractionNew, 0.0 ); + } + else if( LvArray::math::abs( localTractionNew[ 0 ] ) < normalTractionTolerance[k] ) + { + LvArray::tensorOps::fill< 3 >( localTractionNew, 0.0 ); + fractureState[k] = fields::contact::FractureState::Slip; + } + + LvArray::tensorOps::copy< 3 >( traction[k], localTractionNew ); + penalty[k][2] = -localPenalty[1][1]; + penalty[k][3] = -localPenalty[2][2]; + penalty[k][4] = -localPenalty[1][2]; + + } ); + } + +}; + +} // namespace SolidMechanicsALMKernels + +} // namespace geos + + +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSALMKERNELSBASE_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMSimultaneousKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMSimultaneousKernels.hpp similarity index 87% rename from src/coreComponents/physicsSolvers/contact/SolidMechanicsALMSimultaneousKernels.hpp rename to src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMSimultaneousKernels.hpp index f9cd307b6fe..4a39f3580ee 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMSimultaneousKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMSimultaneousKernels.hpp @@ -16,10 +16,11 @@ * @file SolidMechanicsALMSimultaneousKernels.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMSIMULTANEOUSKERNELS_HPP_ -#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMSIMULTANEOUSKERNELS_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSALMSIMULTANEOUSKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSALMSIMULTANEOUSKERNELS_HPP_ -#include "SolidMechanicsALMKernelsBase.hpp" +#include "SolidMechanicsConformingContactKernelsBase.hpp" +#include "mesh/MeshFields.hpp" namespace geos { @@ -33,13 +34,13 @@ namespace solidMechanicsALMKernels template< typename CONSTITUTIVE_TYPE, typename FE_TYPE > class ALMSimultaneous : - public ALMKernelsBase< CONSTITUTIVE_TYPE, - FE_TYPE > + public solidMechanicsConformingContactKernels::ConformingContactKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE > { public: /// Alias for the base class. - using Base = ALMKernelsBase< CONSTITUTIVE_TYPE, - FE_TYPE >; + using Base = solidMechanicsConformingContactKernels::ConformingContactKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE >; /// Maximum number of nodes per element, which is equal to the maxNumTestSupportPointPerElem and /// maxNumTrialSupportPointPerElem by definition. @@ -48,6 +49,15 @@ class ALMSimultaneous : /// Compile time value for the number of quadrature points per element. static constexpr int numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + /// The number of displacement dofs per element. + static constexpr int numUdofs = Base::numUdofs; + + /// The number of bubble dofs per element. + static constexpr int numBdofs = Base::numBdofs; + + /// The number of lagrange multiplier dofs per element. + static constexpr int numTdofs = Base::numTdofs; + using Base::m_elemsToFaces; using Base::m_faceToNodes; using Base::m_finiteElementSpace; @@ -56,7 +66,6 @@ class ALMSimultaneous : using Base::m_dofRankOffset; using Base::m_X; using Base::m_rotationMatrix; - using Base::m_penalty; using Base::m_dispJump; using Base::m_oldDispJump; using Base::m_matrix; @@ -94,7 +103,9 @@ class ALMSimultaneous : inputRhs, inputDt, faceElementList ), - m_traction( elementSubRegion.getField< fields::contact::traction >().toViewConst()) + m_traction( elementSubRegion.getField< fields::contact::traction >().toViewConst()), + m_penalty( elementSubRegion.getField< fields::contact::iterativePenalty >().toViewConst() ), + m_faceArea( elementSubRegion.getField< fields::elementArea >().toViewConst() ) {} //*************************************************************************** @@ -192,8 +203,6 @@ class ALMSimultaneous : { constexpr int shift = numNodesPerElem * 3; - constexpr int numTdofs = 3; - int permutation[numNodesPerElem]; m_finiteElementSpace.getPermutation( permutation ); @@ -255,10 +264,6 @@ class ALMSimultaneous : GEOS_UNUSED_VAR( k ); //constexpr real64 zero = 1.e-10; - constexpr int numUdofs = numNodesPerElem * 3 * 2; - - constexpr int numBdofs = 3*2; - real64 matRRtAtu[3][numUdofs], matDRtAtu[3][numUdofs]; real64 matRRtAtb[3][numBdofs], matDRtAtb[3][numBdofs]; @@ -270,9 +275,9 @@ class ALMSimultaneous : // Compute the trial traction real64 dispJump[ 3 ]; - dispJump[0] = stack.dispJumpLocal[0]; - dispJump[1] = stack.dispJumpLocal[1] - stack.oldDispJumpLocal[1]; - dispJump[2] = stack.dispJumpLocal[2] - stack.oldDispJumpLocal[2]; + dispJump[0] = stack.dispJumpLocal[0] * m_faceArea[k]; + dispJump[1] = ( stack.dispJumpLocal[1] - stack.oldDispJumpLocal[1] ) * m_faceArea[k]; + dispJump[2] = ( stack.dispJumpLocal[2] - stack.oldDispJumpLocal[2] ) * m_faceArea[k]; LvArray::tensorOps::scaledCopy< 3 >( tractionNew, stack.tLocal, -1.0 ); LvArray::tensorOps::Ri_add_AijBj< 3, 3 >( tractionNew, stack.localPenalty, dispJump ); @@ -377,6 +382,11 @@ class ALMSimultaneous : protected: arrayView2d< real64 const > const m_traction; + + /// The array containing the penalty coefficients for each element. + arrayView2d< real64 const > const m_penalty; + + arrayView1d< real64 const > const m_faceArea; }; /// The factory used to construct the kernel. @@ -412,16 +422,17 @@ struct ComputeTractionSimultaneousKernel arrayView2d< real64 const > const & traction, arrayView2d< real64 const > const & dispJump, arrayView2d< real64 const > const & deltaDispJump, + arrayView1d< real64 const > const & faceElementArea, arrayView2d< real64 > const & tractionNew ) { forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const kfe ) { - tractionNew[kfe][0] = traction[kfe][0] + penalty[kfe][0] * dispJump[kfe][0]; - tractionNew[kfe][1] = traction[kfe][1] + penalty[kfe][2] * deltaDispJump[kfe][1] + - penalty[kfe][4] * deltaDispJump[kfe][2]; - tractionNew[kfe][2] = traction[kfe][2] + penalty[kfe][3] * deltaDispJump[kfe][2] + - penalty[kfe][4] * deltaDispJump[kfe][1]; + tractionNew[kfe][0] = traction[kfe][0] + penalty[kfe][0] * dispJump[kfe][0] * faceElementArea[kfe]; + tractionNew[kfe][1] = traction[kfe][1] + ( penalty[kfe][2] * deltaDispJump[kfe][1]+ + penalty[kfe][4] * deltaDispJump[kfe][2] ) * faceElementArea[kfe]; + tractionNew[kfe][2] = traction[kfe][2] + ( penalty[kfe][3] * deltaDispJump[kfe][2] + + penalty[kfe][4] * deltaDispJump[kfe][1] ) * faceElementArea[kfe]; } ); } @@ -432,4 +443,4 @@ struct ComputeTractionSimultaneousKernel } // namespace geos -#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELS_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSALMKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp similarity index 52% rename from src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp rename to src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp index 4f3504e3d5f..28079e6fc51 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp @@ -17,16 +17,17 @@ * @file SolidMechanicsALMKernelsBase.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSBASE_HPP_ -#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSBASE_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSCONFORMINGCONTACTKERNELSBASE_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSCONFORMINGCONTACTKERNELSBASE_HPP_ #include "finiteElement/kernelInterface/InterfaceKernelBase.hpp" -#include "SolidMechanicsALMKernelsHelper.hpp" +#include "SolidMechanicsConformingContactKernelsHelper.hpp" +#include "codingUtilities/Utilities.hpp" namespace geos { -namespace solidMechanicsALMKernels +namespace solidMechanicsConformingContactKernels { /** @@ -36,7 +37,7 @@ namespace solidMechanicsALMKernels */ template< typename CONSTITUTIVE_TYPE, typename FE_TYPE > -class ALMKernelsBase : +class ConformingContactKernelsBase : public finiteElement::InterfaceKernelBase< CONSTITUTIVE_TYPE, FE_TYPE, 3, 3 > @@ -54,6 +55,15 @@ class ALMKernelsBase : /// Compile time value for the number of quadrature points per element. static constexpr int numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + /// The number of displacement dofs per element. + static constexpr int numUdofs = numNodesPerElem * 3 * 2; + + /// The number of lagrange multiplier dofs per element. + static constexpr int numTdofs = 3; + + /// The number of bubble dofs per element. + static constexpr int numBdofs = 3*2; + using Base::m_dofNumber; using Base::m_dofRankOffset; using Base::m_finiteElementSpace; @@ -64,20 +74,20 @@ class ALMKernelsBase : * @brief Constructor * @copydoc geos::finiteElement::InterfaceKernelBase::InterfaceKernelBase */ - ALMKernelsBase( NodeManager const & nodeManager, - EdgeManager const & edgeManager, - FaceManager const & faceManager, - localIndex const targetRegionIndex, - FaceElementSubRegion & elementSubRegion, - FE_TYPE const & finiteElementSpace, - CONSTITUTIVE_TYPE & inputConstitutiveType, - arrayView1d< globalIndex const > const uDofNumber, - arrayView1d< globalIndex const > const bDofNumber, - globalIndex const rankOffset, - CRSMatrixView< real64, globalIndex const > const inputMatrix, - arrayView1d< real64 > const inputRhs, - real64 const inputDt, - arrayView1d< localIndex const > const & faceElementList ): + ConformingContactKernelsBase( NodeManager const & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + FaceElementSubRegion & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + arrayView1d< globalIndex const > const uDofNumber, + arrayView1d< globalIndex const > const bDofNumber, + globalIndex const rankOffset, + CRSMatrixView< real64, globalIndex const > const inputMatrix, + arrayView1d< real64 > const inputRhs, + real64 const inputDt, + arrayView1d< localIndex const > const & faceElementList ): Base( nodeManager, edgeManager, faceManager, @@ -97,8 +107,7 @@ class ALMKernelsBase : m_bDofNumber( bDofNumber ), m_rotationMatrix( elementSubRegion.getField< fields::contact::rotationMatrix >().toViewConst()), m_dispJump( elementSubRegion.getField< fields::contact::dispJump >().toView() ), - m_oldDispJump( elementSubRegion.getField< fields::contact::oldDispJump >().toViewConst() ), - m_penalty( elementSubRegion.getField< fields::contact::iterativePenalty >().toViewConst() ) + m_oldDispJump( elementSubRegion.getField< fields::contact::oldDispJump >().toViewConst() ) {} //*************************************************************************** @@ -107,14 +116,7 @@ class ALMKernelsBase : */ struct StackVariables { - /// The number of displacement dofs per element. - static constexpr int numUdofs = numNodesPerElem * 3 * 2; - - /// The number of lagrange multiplier dofs per element. - static constexpr int numTdofs = 3; - /// The number of bubble dofs per element. - static constexpr int numBdofs = 3*2; public: @@ -191,20 +193,16 @@ class ALMKernelsBase : } //END_kernelLauncher + template< typename LAMBDA = NoOpFunc > GEOS_HOST_DEVICE inline void quadraturePointKernel( localIndex const k, localIndex const q, - StackVariables & stack ) const + StackVariables & stack, + LAMBDA && lambda = NoOpFunc{} ) const { GEOS_UNUSED_VAR( k ); - constexpr int numUdofs = numNodesPerElem * 3 * 2; - - constexpr int numTdofs = 3; - - constexpr int numBdofs = 3*2; - real64 const detJ = m_finiteElementSpace.transformedQuadratureWeight( q, stack.X ); real64 N[ numNodesPerElem ]; @@ -220,19 +218,21 @@ class ALMKernelsBase : m_finiteElementSpace.getPermutation( permutation ); // TODO: Try using bilinear utilities to perform these two operations - solidMechanicsALMKernelsHelper::accumulateAtuLocalOperator< numTdofs, - numUdofs, - numNodesPerElem >( stack.localAtu, - N, - permutation, + solidMechanicsConformingContactKernelsHelper::accumulateAtuLocalOperator< numTdofs, + numUdofs, + numNodesPerElem >( stack.localAtu, + N, + permutation, + detJ ); + + solidMechanicsConformingContactKernelsHelper::accumulateAtuLocalOperator< numTdofs, + numBdofs, + 1 >( stack.localAtb, + BubbleN, + bperm, detJ ); - solidMechanicsALMKernelsHelper::accumulateAtuLocalOperator< numTdofs, - numBdofs, - 1 >( stack.localAtb, - BubbleN, - bperm, - detJ ); + lambda( detJ ); } protected: @@ -260,12 +260,9 @@ class ALMKernelsBase : /// The array containing the displacement jump of previus time step. arrayView2d< real64 const > const m_oldDispJump; - - /// The array containing the penalty coefficients for each element. - arrayView2d< real64 const > const m_penalty; - }; + /** * @brief A struct to compute rotation matrices */ @@ -285,7 +282,10 @@ struct ComputeRotationMatricesKernel launch( localIndex const size, arrayView2d< real64 const > const & faceNormal, ArrayOfArraysView< localIndex const > const & elemsToFaces, - arrayView3d< real64 > const & rotationMatrix ) + arrayView3d< real64 > const & rotationMatrix, + arrayView2d< real64 > const & unitNormal, + arrayView2d< real64 > const & unitTangent1, + arrayView2d< real64 > const & unitTangent2 ) { forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) @@ -302,149 +302,26 @@ struct ComputeRotationMatricesKernel LvArray::tensorOps::normalize< 3 >( Nbar ); computationalGeometry::RotationMatrix_3D( Nbar, rotationMatrix[k] ); - } ); - } + real64 const columnVector1[3] = { rotationMatrix[k][ 0 ][ 1 ], + rotationMatrix[k][ 1 ][ 1 ], + rotationMatrix[k][ 2 ][ 1 ] }; -}; - -/** - * @brief A struct to check for constraint satisfaction - */ -struct ConstraintCheckKernel -{ - - /** - * @brief Launch the kernel function to check the constraint satisfaction - * @tparam POLICY the type of policy used in the kernel launch - * @tparam CONTACT_WRAPPER the type of contact wrapper doing the fracture traction updates - * @param[in] size the size of the subregion - * @param[in] traction the array containing the current traction - * @param[in] dispJump the array containing the displacement jump - * @param[in] deltaDispJump the array containing the delta displacement jump - * @param[in] normalTractionTolerance Check tolerance (normal traction) - * @param[in] normalDisplacementTolerance Check tolerance (compenetration) - * @param[in] slidingTolerance Check tolerance (sliding) - * @param[in] slidingCheckTolerance Check tolerance (if shear strass exceeds tauLim) - * @param[in] area interface element area - * @param[in] fractureState the array containing the fracture state - * @param[out] condConv the array containing the convergence flag: - * 0: Constraint conditions satisfied - * 1: Open - * 2: Compenetration - * 3: Slip exceeds sliding tolerance - * 4: Shear stress exceeds tauLim - */ - template< typename POLICY, typename CONTACT_WRAPPER > - static void - launch( localIndex const size, - CONTACT_WRAPPER const & contactWrapper, - arrayView1d< integer const > const & ghostRank, - arrayView2d< real64 > const & traction, - arrayView2d< real64 const > const & dispJump, - arrayView2d< real64 const > const & deltaDispJump, - arrayView1d< real64 const > const & normalTractionTolerance, - arrayView1d< real64 const > const & normalDisplacementTolerance, - arrayView1d< real64 const > const & slidingTolerance, - real64 const slidingCheckTolerance, - arrayView1d< real64 const > const & area, - arrayView1d< integer const > const & fractureState, - arrayView1d< integer > const & condConv ) - { - - forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - if( ghostRank[k] < 0 ) - { - contactWrapper.constraintCheck( dispJump[k], - deltaDispJump[k], - traction[k], - fractureState[k], - normalTractionTolerance[k], - normalDisplacementTolerance[k]*area[k], - slidingTolerance[k]*area[k], - slidingCheckTolerance, - condConv[k] ); - } - - } ); - } -}; - -/** - * @brief A struct to check for constraint satisfaction - */ -struct UpdateStateKernel -{ - - /** - * @brief Launch the kernel function to check the constraint satisfaction - * @tparam POLICY the type of policy used in the kernel launch - * @tparam CONTACT_WRAPPER the type of contact wrapper doing the fracture traction updates - * @param[in] size the size of the subregion - * @param[in] oldDispJump the array containing the old displacement jump (previous time step) - * @param[in] dispJump the array containing the displacement jump - * @param[in] penalty the array containing the penalty coefficients - * @param[in] symmetric flag to compute symmetric penalty matrix - * @param[in] normalTractionTolerance Check tolerance (normal traction) - * @param[in] traction the array containing the current traction - * @param[in] fractureState the array containing the fracture state - */ - template< typename POLICY, typename CONTACT_WRAPPER > - static void - launch( localIndex const size, - CONTACT_WRAPPER const & contactWrapper, - arrayView2d< real64 const > const & oldDispJump, - arrayView2d< real64 const > const & dispJump, - arrayView2d< real64 > const & penalty, - bool const symmetric, - arrayView1d< real64 const > const & normalTractionTolerance, - arrayView2d< real64 > const & traction, - arrayView1d< integer > const & fractureState ) - - { - forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const k ) - { - - real64 const zero = LvArray::NumericLimits< real64 >::epsilon; - - real64 localPenalty[3][3]{}; - real64 localTractionNew[3]{}; - contactWrapper.updateTraction( oldDispJump[k], - dispJump[k], - penalty[k], - traction[k], - symmetric, - false, - normalTractionTolerance[k], - zero, - localPenalty, - localTractionNew, - fractureState[k] ); - - if( fractureState[k] == fields::contact::FractureState::Open ) - { - - LvArray::tensorOps::fill< 3 >( localTractionNew, 0.0 ); - } - else if( LvArray::math::abs( localTractionNew[ 0 ] ) < normalTractionTolerance[k] ) - { - LvArray::tensorOps::fill< 3 >( localTractionNew, 0.0 ); - fractureState[k] = fields::contact::FractureState::Slip; - } - - LvArray::tensorOps::copy< 3 >( traction[k], localTractionNew ); - penalty[k][2] = -localPenalty[1][1]; - penalty[k][3] = -localPenalty[2][2]; - penalty[k][4] = -localPenalty[1][2]; + real64 const columnVector2[3] = { rotationMatrix[k][ 0 ][ 2 ], + rotationMatrix[k][ 1 ][ 2 ], + rotationMatrix[k][ 2 ][ 2 ] }; + LvArray::tensorOps::copy< 3 >( unitNormal[k], Nbar ); + LvArray::tensorOps::copy< 3 >( unitTangent1[k], columnVector1 ); + LvArray::tensorOps::copy< 3 >( unitTangent2[k], columnVector2 ); } ); } }; -} // namespace SolidMechanicsALMKernels + +} // namespace solidMechanicsConformingContactKernels } // namespace geos -#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSBASE_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSCONFORMINGCONTACTKERNELSBASE_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsHelper.hpp similarity index 82% rename from src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp rename to src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsHelper.hpp index 02250a60170..fc8fb5f6f72 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsHelper.hpp @@ -15,18 +15,18 @@ /** - * @file SolidMechanicsALMKernelsHelper.hpp + * @file SolidMechanicsConformingContactKernelsHelper.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSHELPER_HPP_ -#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSHELPER_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSCONFORMINGCONTACTKERNELSHELPER_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSCONFORMINGCONTACTKERNELSHELPER_HPP_ #include "common/GeosxMacros.hpp" namespace geos { -namespace solidMechanicsALMKernelsHelper +namespace solidMechanicsConformingContactKernelsHelper { template< int I_SIZE, @@ -76,8 +76,8 @@ void assembleStrainOperator( real64 ( & strainMatrix )[I_SIZE][J_SIZE], } } -} // solidMechanicsALMKernelsHelper +} // solidMechanicsConformingContactKernelsHelper } // geos -#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMKERNELSHELPER_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSCONFORMINGCONTACTKERNELSHELPER_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsContactFaceBubbleKernels.hpp similarity index 85% rename from src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp rename to src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsContactFaceBubbleKernels.hpp index 4b76b7a4a3d..0d622571def 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMBubbleKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsContactFaceBubbleKernels.hpp @@ -14,14 +14,14 @@ */ /** - * @file SolidMechanicsALMBubbleKernels.hpp + * @file SolidMechanicsContactFaceBubbleKernels.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMBUBBLEKERNELS_HPP_ -#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMBUBBLEKERNELS_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSCONTACTFACEBUBBLEKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSCONTACTFACEBUBBLEKERNELS_HPP_ #include "physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp" -#include "SolidMechanicsALMKernelsHelper.hpp" +#include "SolidMechanicsConformingContactKernelsHelper.hpp" // TODO: Use the bilinear form utilities //#include "finiteElement/BilinearFormUtilities.hpp" @@ -29,7 +29,7 @@ namespace geos { -namespace solidMechanicsALMKernels +namespace solidMechanicsConformingContactKernels { /** @@ -40,7 +40,7 @@ namespace solidMechanicsALMKernels template< typename SUBREGION_TYPE, typename CONSTITUTIVE_TYPE, typename FE_TYPE > -class ALMBubbleKernels : +class FaceBubbleKernels : public solidMechanicsLagrangianFEMKernels::ImplicitSmallStrainQuasiStatic< SUBREGION_TYPE, CONSTITUTIVE_TYPE, FE_TYPE > @@ -75,20 +75,20 @@ class ALMBubbleKernels : * @brief Constructor * @copydoc geos::finiteElement::ImplicitKernelBase::ImplicitKernelBase */ - ALMBubbleKernels( NodeManager const & nodeManager, - EdgeManager const & edgeManager, - FaceManager const & faceManager, - localIndex const targetRegionIndex, - SUBREGION_TYPE const & elementSubRegion, - FE_TYPE const & finiteElementSpace, - CONSTITUTIVE_TYPE & inputConstitutiveType, - arrayView1d< globalIndex const > const uDofNumber, - arrayView1d< globalIndex const > const bDofNumber, - globalIndex const rankOffset, - CRSMatrixView< real64, globalIndex const > const inputMatrix, - arrayView1d< real64 > const inputRhs, - real64 const inputDt, - real64 const (&inputGravityVector)[3] ): + FaceBubbleKernels( NodeManager const & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + SUBREGION_TYPE const & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + arrayView1d< globalIndex const > const uDofNumber, + arrayView1d< globalIndex const > const bDofNumber, + globalIndex const rankOffset, + CRSMatrixView< real64, globalIndex const > const inputMatrix, + arrayView1d< real64 > const inputRhs, + real64 const inputDt, + real64 const (&inputGravityVector)[3] ): Base( nodeManager, edgeManager, faceManager, @@ -280,10 +280,10 @@ class ALMBubbleKernels : m_constitutiveUpdate.getElasticStiffness( k, q, stack.constitutiveStiffness ); real64 strainMatrix[6][nUdof]; - solidMechanicsALMKernelsHelper::assembleStrainOperator< 6, nUdof, numNodesPerElem >( strainMatrix, dNdX ); + solidMechanicsConformingContactKernelsHelper::assembleStrainOperator< 6, nUdof, numNodesPerElem >( strainMatrix, dNdX ); real64 strainBubbleMatrix[6][nBubbleUdof]; - solidMechanicsALMKernelsHelper::assembleStrainOperator< 6, nBubbleUdof, numFacesPerElem >( strainBubbleMatrix, dBubbleNdX ); + solidMechanicsConformingContactKernelsHelper::assembleStrainOperator< 6, nBubbleUdof, numFacesPerElem >( strainBubbleMatrix, dBubbleNdX ); // TODO: It would be nice use BilinearFormUtilities::compute @@ -425,18 +425,18 @@ class ALMBubbleKernels : }; /// The factory used to construct a QuasiStatic kernel. -using ALMBubbleFactory = finiteElement::KernelFactory< ALMBubbleKernels, - arrayView1d< globalIndex const > const, - arrayView1d< globalIndex const > const, - globalIndex const, - CRSMatrixView< real64, globalIndex const > const, - arrayView1d< real64 > const, - real64 const, - real64 const (&) [3] >; +using FaceBubbleFactory = finiteElement::KernelFactory< FaceBubbleKernels, + arrayView1d< globalIndex const > const, + arrayView1d< globalIndex const > const, + globalIndex const, + CRSMatrixView< real64, globalIndex const > const, + arrayView1d< real64 > const, + real64 const, + real64 const (&) [3] >; -} // namespace SolidMechanicsALMBubbleKernels +} // namespace SolidMechanicsContactFaceBubbleKernels } // namespace geos -#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMBUBBLEKERNELS_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSCONTACTFACEBUBBLEKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsDisplacementJumpUpdateKernels.hpp similarity index 71% rename from src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp rename to src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsDisplacementJumpUpdateKernels.hpp index 1f434b3a13e..ba0bc23272a 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsALMJumpUpdateKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsDisplacementJumpUpdateKernels.hpp @@ -17,15 +17,16 @@ * @file SolidMechanicsALMUpdateKernels.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMUPDATEKERNELS_HPP_ -#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMUPDATEKERNELS_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSDISPLACEMENTJUPDATEKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSDISPLACEMENTJUPDATEKERNELS_HPP_ -#include "SolidMechanicsALMKernelsBase.hpp" +#include "SolidMechanicsConformingContactKernelsBase.hpp" +#include "mesh/MeshFields.hpp" namespace geos { -namespace solidMechanicsALMKernels +namespace solidMechanicsConformingContactKernels { /** @@ -33,19 +34,28 @@ namespace solidMechanicsALMKernels */ template< typename CONSTITUTIVE_TYPE, typename FE_TYPE > -class ALMJumpUpdate : - public ALMKernelsBase< CONSTITUTIVE_TYPE, - FE_TYPE > +class DispJumpUpdate : + public ConformingContactKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE > { public: /// Alias for the base class; - using Base = ALMKernelsBase< CONSTITUTIVE_TYPE, - FE_TYPE >; + using Base = ConformingContactKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE >; /// Maximum number of nodes per element, which is equal to the maxNumTestSupportPointPerElem and /// maxNumTrialSupportPointPerElem by definition. static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; + /// The number of displacement dofs per element. + static constexpr int numUdofs = Base::numUdofs; + + /// The number of bubble dofs per element. + static constexpr int numBdofs = Base::numBdofs; + + /// The number of lagrange multiplier dofs per element. + static constexpr int numTdofs = Base::numTdofs; + using Base::m_X; using Base::m_finiteElementSpace; using Base::m_dofNumber; @@ -59,20 +69,20 @@ class ALMJumpUpdate : * @brief Constructor * @copydoc geos::finiteElement::InterfaceKernelBase::InterfaceKernelBase */ - ALMJumpUpdate( NodeManager const & nodeManager, - EdgeManager const & edgeManager, - FaceManager const & faceManager, - localIndex const targetRegionIndex, - FaceElementSubRegion & elementSubRegion, - FE_TYPE const & finiteElementSpace, - CONSTITUTIVE_TYPE & inputConstitutiveType, - arrayView1d< globalIndex const > const uDofNumber, - arrayView1d< globalIndex const > const bDofNumber, - globalIndex const rankOffset, - CRSMatrixView< real64, globalIndex const > const inputMatrix, - arrayView1d< real64 > const inputRhs, - real64 const inputDt, - arrayView1d< localIndex const > const & faceElementList ): + DispJumpUpdate( NodeManager const & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + FaceElementSubRegion & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + arrayView1d< globalIndex const > const uDofNumber, + arrayView1d< globalIndex const > const bDofNumber, + globalIndex const rankOffset, + CRSMatrixView< real64, globalIndex const > const inputMatrix, + arrayView1d< real64 > const inputRhs, + real64 const inputDt, + arrayView1d< localIndex const > const & faceElementList ): Base( nodeManager, edgeManager, faceManager, @@ -91,7 +101,9 @@ class ALMJumpUpdate : m_bubbleDisp( faceManager.getField< fields::solidMechanics::totalBubbleDisplacement >() ), m_incrDisp( nodeManager.getField< fields::solidMechanics::incrementalDisplacement >() ), m_incrBubbleDisp( faceManager.getField< fields::solidMechanics::incrementalBubbleDisplacement >() ), - m_deltaDispJump( elementSubRegion.getField< fields::contact::deltaDispJump >().toView() ) + m_deltaDispJump( elementSubRegion.getField< fields::contact::deltaDispJump >().toView() ), + m_elementArea( elementSubRegion.getField< fields::elementArea >().toView() ), + m_slip( elementSubRegion.getField< fields::contact::slip >().toView() ) {} //*************************************************************************** @@ -102,25 +114,16 @@ class ALMJumpUpdate : struct StackVariables : public Base::StackVariables { - /// The number of displacement dofs per element. - static constexpr int numUdofs = numNodesPerElem * 3 * 2; - - /// The number of bubble dofs per element. - static constexpr int numBdofs = 3 * 2; - - /// The number of lagrange multiplier dofs per element. - static constexpr int numTdofs = 3; - public: GEOS_HOST_DEVICE StackVariables(): Base::StackVariables(), - uLocal{}, - bLocal{}, - duLocal{}, - dbLocal{}, - deltaDispJumpLocal{} + uLocal{}, + bLocal{}, + duLocal{}, + dbLocal{}, + deltaDispJumpLocal{} {} /// Stack storage for the element local displacement vector @@ -208,11 +211,6 @@ class ALMJumpUpdate : real64 complete( localIndex const k, StackVariables & stack ) const { - - constexpr int numUdofs = numNodesPerElem * 3 * 2; - - constexpr int numBdofs = 3 * 2; - real64 matRtAtu[3][numUdofs]; real64 matRtAtb[3][numBdofs]; @@ -232,12 +230,17 @@ class ALMJumpUpdate : LvArray::tensorOps::Ri_add_AijBj< 3, numBdofs >( stack.deltaDispJumpLocal, matRtAtb, stack.dbLocal ); // Store the results + real64 const scale = 1 / m_elementArea[k]; + for( int i=0; i<3; ++i ) { - m_dispJump[ k ][ i ] = stack.dispJumpLocal[ i ]; - m_deltaDispJump[ k ][ i ] = stack.deltaDispJumpLocal[ i ]; + m_dispJump[ k ][ i ] = scale * stack.dispJumpLocal[ i ]; + m_deltaDispJump[ k ][ i ] = scale * stack.deltaDispJumpLocal[ i ]; } + m_slip[k] = LvArray::math::sqrt( LvArray::math::square( m_dispJump( k, 1 ) ) + LvArray::math::square( m_dispJump( k, 2 ) ) ); + + return 0.0; } @@ -258,19 +261,23 @@ class ALMJumpUpdate : /// The rank-global delta displacement jump array. arrayView2d< real64 > const m_deltaDispJump; + arrayView1d< real64 const > const m_elementArea; + + arrayView1d< real64 > const m_slip; + }; -using ALMJumpUpdateFactory = finiteElement::InterfaceKernelFactory< ALMJumpUpdate, - arrayView1d< globalIndex const > const, - arrayView1d< globalIndex const > const, - globalIndex const, - CRSMatrixView< real64, globalIndex const > const, - arrayView1d< real64 > const, - real64 const, - arrayView1d< localIndex const > const >; +using DispJumpUpdateFactory = finiteElement::InterfaceKernelFactory< DispJumpUpdate, + arrayView1d< globalIndex const > const, + arrayView1d< globalIndex const > const, + globalIndex const, + CRSMatrixView< real64, globalIndex const > const, + arrayView1d< real64 > const, + real64 const, + arrayView1d< localIndex const > const >; } // namespace SolidMechanicsALMKernels } // namespace geos -#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSALMUPDATEKERNELS_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSDISPLACEMENTJUPDATEKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMJumpUpdateKernels.hpp similarity index 97% rename from src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp rename to src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMJumpUpdateKernels.hpp index 26e6ea5abe0..cca58c08ddd 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMJumpUpdateKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMJumpUpdateKernels.hpp @@ -18,8 +18,8 @@ * @file SolidMechanicsEFEMKernels.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMJUMPUPDATEKERNELS_HPP_ -#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMJUMPUPDATEKERNELS_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMJUMPUPDATEKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMJUMPUPDATEKERNELS_HPP_ #include "SolidMechanicsEFEMKernelsBase.hpp" @@ -246,4 +246,4 @@ using EFEMJumpUpdateFactory = finiteElement::KernelFactory< EFEMJumpUpdate, } // namespace geos -#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMJUMPUPDATEKERNELS_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMJUMPUPDATEKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernels.hpp similarity index 98% rename from src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp rename to src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernels.hpp index f683446af4b..ff06f6137c1 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernels.hpp @@ -18,8 +18,8 @@ * @file SolidMechanicsEFEMKernels.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMKERNELS_HPP_ -#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMKERNELS_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMKERNELS_HPP_ #include "SolidMechanicsEFEMKernelsBase.hpp" @@ -347,4 +347,4 @@ struct StateUpdateKernel } // namespace geos -#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMKERNELS_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsBase.hpp similarity index 98% rename from src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp rename to src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsBase.hpp index 5f1c22b7c19..dd3d95d49b9 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsBase.hpp @@ -18,8 +18,8 @@ * @file SolidMechanicsEFEMKernels.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMKERNELSBASE_HPP_ -#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMKERNELSBASE_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMKERNELSBASE_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMKERNELSBASE_HPP_ #include "physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp" #include "SolidMechanicsEFEMKernelsHelper.hpp" @@ -345,4 +345,4 @@ class EFEMKernelsBase : } // namespace geos -#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMKERNELSBASE_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMKERNELSBASE_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsHelper.hpp similarity index 94% rename from src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp rename to src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsHelper.hpp index 3018fb975c7..dc5232d75ee 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsHelper.hpp @@ -18,8 +18,8 @@ * @file EFEMKernelsHelper.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMKERNELSHELPER_HPP_ -#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMKERNELSHELPER_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMKERNELSHELPER_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMKERNELSHELPER_HPP_ #include "common/DataTypes.hpp" @@ -152,4 +152,4 @@ void assembleEquilibriumOperator( real64 ( & eqMatrix )[3][6], } // geos -#endif /* SRC_CORECOMPONENTS_PHYSICSSOLVERS_CONTACT_EFEMKERNELSHELPER_HPP_ */ +#endif /* SRC_CORECOMPONENTS_PHYSICSSOLVERS_CONTACT_KERNELS_EFEMKERNELSHELPER_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMStaticCondensationKernels.hpp similarity index 97% rename from src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp rename to src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMStaticCondensationKernels.hpp index 83dfa5fd884..980d6d61892 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEFEMStaticCondensationKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMStaticCondensationKernels.hpp @@ -18,8 +18,8 @@ * @file SolidMechanicsEFEMKernels.hpp */ -#ifndef GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMSTATICCONDENSATIONKERNELS_HPP_ -#define GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMSTATICCONDENSATIONKERNELS_HPP_ +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMSTATICCONDENSATIONKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMSTATICCONDENSATIONKERNELS_HPP_ #include "SolidMechanicsEFEMKernelsBase.hpp" @@ -252,4 +252,4 @@ using EFEMStaticCondensationFactory = finiteElement::KernelFactory< EFEMStaticCo } // namespace geos -#endif /* GEOS_PHYSICSSOLVERS_CONTACT_SOLIDMECHANICSEFEMSTATICCONDENSATIONKERNELS_HPP_ */ +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSEFEMSTATICCONDENSATIONKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsLagrangeContactKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsLagrangeContactKernels.hpp new file mode 100644 index 00000000000..90fdec8ec4f --- /dev/null +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsLagrangeContactKernels.hpp @@ -0,0 +1,438 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 SolidMechanicsALMKernelsBase.hpp + */ + +#ifndef GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSLAGRANGECONTACTKERNELS_HPP_ +#define GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSLAGRANGECONTACTKERNELS_HPP_ + +#include "finiteElement/kernelInterface/InterfaceKernelBase.hpp" +#include "SolidMechanicsConformingContactKernelsBase.hpp" + +namespace geos +{ + +namespace solidMechanicsLagrangeContactKernels +{ + +/** + * @copydoc geos::finiteElement::ImplicitKernelBase + */ +template< typename CONSTITUTIVE_TYPE, + typename FE_TYPE > +class LagrangeContact : + public solidMechanicsConformingContactKernels::ConformingContactKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE > +{ +public: + /// Alias for the base class. + using Base = solidMechanicsConformingContactKernels::ConformingContactKernelsBase< CONSTITUTIVE_TYPE, + FE_TYPE >; + + /// Maximum number of nodes per element, which is equal to the maxNumTestSupportPointPerElem and + /// maxNumTrialSupportPointPerElem by definition. + static constexpr int numNodesPerElem = Base::maxNumTestSupportPointsPerElem; + + /// Compile time value for the number of quadrature points per element. + static constexpr int numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + + using Base::numUdofs; + using Base::numTdofs; + using Base::numBdofs; + + using Base::m_elemsToFaces; + using Base::m_faceToNodes; + using Base::m_finiteElementSpace; + using Base::m_constitutiveUpdate; + using Base::m_dofNumber; + using Base::m_bDofNumber; + using Base::m_dofRankOffset; + using Base::m_X; + using Base::m_rotationMatrix; + using Base::m_dispJump; + using Base::m_oldDispJump; + using Base::m_matrix; + using Base::m_rhs; + + /** + * @brief Constructor + * @copydoc geos::finiteElement::InterfaceKernelBase::InterfaceKernelBase + */ + LagrangeContact( NodeManager const & nodeManager, + EdgeManager const & edgeManager, + FaceManager const & faceManager, + localIndex const targetRegionIndex, + FaceElementSubRegion & elementSubRegion, + FE_TYPE const & finiteElementSpace, + CONSTITUTIVE_TYPE & inputConstitutiveType, + arrayView1d< globalIndex const > const uDofNumber, + arrayView1d< globalIndex const > const bDofNumber, + globalIndex const rankOffset, + CRSMatrixView< real64, globalIndex const > const inputMatrix, + arrayView1d< real64 > const inputRhs, + real64 const inputDt, + arrayView1d< localIndex const > const & faceElementList, + string const tractionDofKey ): + Base( nodeManager, + edgeManager, + faceManager, + targetRegionIndex, + elementSubRegion, + finiteElementSpace, + inputConstitutiveType, + uDofNumber, + bDofNumber, + rankOffset, + inputMatrix, + inputRhs, + inputDt, + faceElementList ), + m_traction( elementSubRegion.getField< fields::contact::traction >().toViewConst() ), + m_tDofNumber( elementSubRegion.getReference< globalIndex_array >( tractionDofKey ).toViewConst() ), + m_incrDisp( nodeManager.getField< fields::solidMechanics::incrementalDisplacement >() ), + m_incrBubbleDisp( faceManager.getField< fields::solidMechanics::incrementalBubbleDisplacement >() ), + m_targetIncrementalJump( elementSubRegion.getField< fields::contact::targetIncrementalJump >().toViewConst() ) + {} + + /** + * @copydoc finiteElement::KernelBase::StackVariables + */ + struct StackVariables : public Base::StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables(): + Base::StackVariables(), + dispEqnRowIndices{}, + dispColIndices{}, + bEqnRowIndices{}, + bColIndices{}, + tColIndices{}, + localRu{}, + localRb{}, + localRt{}, + localAtt{ {} }, + localAut{ {} }, + localAbt{ {} }, + duLocal{}, + dbLocal{} + {} + + /// C-array storage for the element local row degrees of freedom. + localIndex dispEqnRowIndices[numUdofs]; + + /// C-array storage for the element local column degrees of freedom. + globalIndex dispColIndices[numUdofs]; + + /// C-array storage for the element local row degrees of freedom. + localIndex bEqnRowIndices[numBdofs]; + + /// C-array storage for the element local column degrees of freedom. + globalIndex bColIndices[numBdofs]; + + /// C-array storage for the traction local row degrees of freedom. + localIndex tEqnRowIndices[numTdofs]; + + /// C-array storage for the element local column degrees of freedom. + globalIndex tColIndices[numTdofs]; + + /// C-array storage for the element local Ru residual vector. + real64 localRu[numUdofs]; + + /// C-array storage for the element local Rb residual vector. + real64 localRb[numBdofs]; + + /// C-array storage for the element local Rt residual vector. + real64 localRt[numTdofs]; + + /// C-array storage for the element local Att matrix. + real64 localAtt[numTdofs][numTdofs]; + + /// C-array storage for the element local Aut matrix. + real64 localAut[numUdofs][numTdofs]; + + /// C-array storage for the element local Abt matrix. + real64 localAbt[numBdofs][numTdofs]; + + /// Stack storage for the element local incremental displacement vector + real64 duLocal[numUdofs]; + + /// Stack storage for the element local incremental bubble displacement vector + real64 dbLocal[numBdofs]; + }; + + //*************************************************************************** + + //START_kernelLauncher + template< typename POLICY, + typename KERNEL_TYPE > + static + real64 + kernelLaunch( localIndex const numElems, + KERNEL_TYPE const & kernelComponent ) + { + return Base::template kernelLaunch< POLICY, KERNEL_TYPE >( numElems, kernelComponent ); + } + //END_kernelLauncher + + /** + * @brief Copy global values from primary field to a local stack array. + * @copydoc ::geos::finiteElement::InterfaceKernelBase::setup + */ + GEOS_HOST_DEVICE + inline + void setup( localIndex const k, + StackVariables & stack ) const + { + constexpr int shift = numNodesPerElem * 3; + + int permutation[numNodesPerElem]; + m_finiteElementSpace.getPermutation( permutation ); + + localIndex const kf0 = m_elemsToFaces[k][0]; + localIndex const kf1 = m_elemsToFaces[k][1]; + for( localIndex a=0; a( matRRtAtu, stack.localRotationMatrix, stack.localAtu ); + // transp(R) * Atb + LvArray::tensorOps::Rij_eq_AkiBkj< 3, numBdofs, 3 >( matRRtAtb, stack.localRotationMatrix, stack.localAtb ); + + LvArray::tensorOps::copy< numTdofs, numUdofs >( stack.localAtu, matRRtAtu ); + LvArray::tensorOps::copy< numTdofs, numBdofs >( stack.localAtb, matRRtAtb ); + + LvArray::tensorOps::scale< numTdofs, numUdofs >( stack.localAtu, -1.0 ); + LvArray::tensorOps::scale< numTdofs, numBdofs >( stack.localAtb, -1.0 ); + + LvArray::tensorOps::transpose< numUdofs, numTdofs >( stack.localAut, stack.localAtu ); + LvArray::tensorOps::transpose< numBdofs, numTdofs >( stack.localAbt, stack.localAtb ); + + // Compute the traction contribute of the local residuals + LvArray::tensorOps::Ri_eq_AijBj< numUdofs, numTdofs >( tractionR, stack.localAut, m_traction[k] ); + LvArray::tensorOps::Ri_eq_AijBj< numBdofs, numTdofs >( tractionRb, stack.localAbt, m_traction[k] ); + + // Compute the local residuals + // Force Balance for nodal displacement dofs + LvArray::tensorOps::scaledAdd< numUdofs >( stack.localRu, tractionR, 1.0 ); + // Force Balance for the bubble dofs + LvArray::tensorOps::scaledAdd< numBdofs >( stack.localRb, tractionRb, 1.0 ); + + fillGlobalMatrix( stack ); + + return 0.0; + } + +protected: + + arrayView2d< real64 const > const m_traction; + + arrayView1d< globalIndex const > const m_tDofNumber; + + arrayView2d< real64 const, nodes::INCR_DISPLACEMENT_USD > const m_incrDisp; + + arrayView2d< real64 const > const m_incrBubbleDisp; + + arrayView2d< real64 const > const m_targetIncrementalJump; + + /** + * @brief Create the list of finite elements of the same type + * for each FaceElementSubRegion (Triangle or Quadrilateral) + * and of the same fracture state (Stick or Slip). + * @param domain The physical domain object + */ + void updateStickSlipList( DomainPartition const & domain ); + + /** + * @brief Create the list of finite elements of the same type + * for each FaceElementSubRegion (Triangle or Quadrilateral). + * @param domain The physical domain object + */ + void createFaceTypeList( DomainPartition const & domain ); + + /** + * @brief Create the list of elements belonging to CellElementSubRegion + * that are enriched with the bubble basis functions + * @param domain The physical domain object + */ + void createBubbleCellList( DomainPartition & domain ) const; + + /** + * @brief Fill global matrix and residual vector + * + * @param stack stack variables + */ + GEOS_HOST_DEVICE + void fillGlobalMatrix( StackVariables & stack ) const + { + + for( localIndex i=0; i < numTdofs; ++i ) + { + localIndex const dof = LvArray::integerConversion< localIndex >( stack.tEqnRowIndices[ i ] ); + + if( dof < 0 || dof >= m_matrix.numRows() ) continue; + + // TODO: May not need to be an atomic operation + RAJA::atomicAdd< parallelDeviceAtomic >( &m_rhs[dof], stack.localRt[i] ); + + // Fill in matrix block Att + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.tColIndices, + stack.localAtt[i], + numTdofs ); + + // Fill in matrix block Atu + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.dispColIndices, + stack.localAtu[i], + numUdofs ); + + // Fill in matrix block Atb + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.bColIndices, + stack.localAtb[i], + numBdofs ); + } + + for( localIndex i=0; i < numUdofs; ++i ) + { + localIndex const dof = LvArray::integerConversion< localIndex >( stack.dispEqnRowIndices[ i ] ); + + if( dof < 0 || dof >= m_matrix.numRows() ) continue; + + // Is it necessary? Each row should be indepenedent + RAJA::atomicAdd< parallelDeviceAtomic >( &m_rhs[dof], stack.localRu[i] ); + + // Fill in matrix + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.tColIndices, + stack.localAut[i], + numTdofs ); + + } + + for( localIndex i=0; i < numBdofs; ++i ) + { + localIndex const dof = LvArray::integerConversion< localIndex >( stack.bEqnRowIndices[ i ] ); + + if( dof < 0 || dof >= m_matrix.numRows() ) continue; + + // Is it necessary? Each row should be indepenedent + RAJA::atomicAdd< parallelDeviceAtomic >( &m_rhs[dof], stack.localRb[i] ); + + // Fill in matrix + m_matrix.template addToRowBinarySearchUnsorted< parallelDeviceAtomic >( dof, + stack.tColIndices, + stack.localAbt[i], + numTdofs ); + } + } + +}; + +/// The factory used to construct the kernel. +using LagrangeContactFactory = finiteElement::InterfaceKernelFactory< LagrangeContact, + arrayView1d< globalIndex const > const, + arrayView1d< globalIndex const > const, + globalIndex const, + CRSMatrixView< real64, globalIndex const > const, + arrayView1d< real64 > const, + real64 const, + arrayView1d< localIndex const > const, + string const >; + +} // namespace solidMechanicsLagrangeContactKernels + +} // namespace geos + + +#endif /* GEOS_PHYSICSSOLVERS_CONTACT_KERNELS_SOLIDMECHANICSLAGRANGECONTACTKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 394b95d08d3..0e1c3dd7198 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -20,7 +20,7 @@ #include "SinglePhasePoromechanicsEmbeddedFractures.hpp" #include "constitutive/contact/HydraulicApertureRelationSelector.hpp" #include "constitutive/fluid/singlefluid/SingleFluidBase.hpp" -#include "physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsHelper.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBase.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp" diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp index 0aac71f9acb..cfae8a2e7d8 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp @@ -26,7 +26,7 @@ #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp" -#include "physicsSolvers/contact/SolidMechanicsEFEMKernelsHelper.hpp" +#include "physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsHelper.hpp" namespace geos { From 2e8a2fcf3d4c886e6adad234e919afd0454be0be Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 21 Nov 2024 06:51:22 -0600 Subject: [PATCH 257/286] fix: EDFM bugfixes, part of #3348 (#3439) Authored-by: Sohail Waziri and Guotong Ren --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 3 +++ ...alDecayPermeability_conformingFracture_base.xml | 4 ++-- .../ExponentialDecayPermeability_edfm_base.xml | 4 ++-- .../SlipPermeability_embeddedFrac.xml | 4 ++-- .../SlipPermeability_pEDFM_base.xml | 4 ++-- .../WillisRichardsPermeability_efem-edfm_base.xml | 4 ++-- .../constitutive/contact/CoulombFriction.hpp | 6 +++--- .../constitutive/contact/FrictionBase.hpp | 6 +++++- .../constitutive/contact/FrictionlessContact.hpp | 14 -------------- .../contact/SolidMechanicsLagrangeContact.cpp | 4 ++-- .../physicsSolvers/fluidFlow/SinglePhaseBase.cpp | 12 ++++++------ .../SinglePhasePoromechanicsEFEM.hpp | 4 +++- .../SinglePhasePoromechanicsEFEM_impl.hpp | 13 +++++++------ .../ThermalSinglePhasePoromechanicsEFEM.hpp | 2 +- .../ThermalSinglePhasePoromechanicsEFEM_impl.hpp | 4 ++-- 16 files changed, 43 insertions(+), 47 deletions(-) mode change 100755 => 100644 inputFiles/poromechanicsFractures/ExponentialDecayPermeability_edfm_base.xml mode change 100755 => 100644 inputFiles/poromechanicsFractures/SlipPermeability_embeddedFrac.xml mode change 100755 => 100644 inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml mode change 100755 => 100644 inputFiles/poromechanicsFractures/WillisRichardsPermeability_efem-edfm_base.xml diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 55c31ad3c7a..0a3900f23a9 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3440-8913-0e506ec + baseline: integratedTests/baseline_integratedTests-pr3439-8919-b09db43 allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index abedd2d24dc..8e9abcd6c27 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,9 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3439 (2024-11-20) +===================== +EDFM bugfixes: derivatives sign, frac/cell element volume, fix apertures inconsistency in test cases. PR ##3440 (2024-11-18) ===================== diff --git a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml index 133e70876ff..d21f7f7fb80 100644 --- a/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml +++ b/inputFiles/poromechanicsFractures/ExponentialDecayPermeability_conformingFracture_base.xml @@ -89,7 +89,7 @@ name="Fracture" faceBlock="FractureSubRegion" materialList="{ water, fractureFilling, fractureContact, rock, hApertureModel}" - defaultAperture="1e-3"/> + defaultAperture="1.0e-3"/> @@ -265,7 +265,7 @@ + values="{ 1.0e-6, 1.0e-3 }"/> + defaultAperture="1.0e-3"/> @@ -131,7 +131,7 @@ + values="{ 1.0e-6, 1.0e-3 }"/> diff --git a/inputFiles/poromechanicsFractures/SlipPermeability_embeddedFrac.xml b/inputFiles/poromechanicsFractures/SlipPermeability_embeddedFrac.xml old mode 100755 new mode 100644 index 27a00a1005d..b0426e12899 --- a/inputFiles/poromechanicsFractures/SlipPermeability_embeddedFrac.xml +++ b/inputFiles/poromechanicsFractures/SlipPermeability_embeddedFrac.xml @@ -173,7 +173,7 @@ faceBlock="embeddedSurfaceSubRegion" subRegionType="embeddedElement" materialList="{ water, fractureFilling, fractureContact, hApertureModel }" - defaultAperture="1e-3"/> + defaultAperture="1.0e-3"/> @@ -249,7 +249,7 @@ + values="{ 1.0e-6, 1.0e-3 }"/> diff --git a/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml b/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml old mode 100755 new mode 100644 index 0d8af6099a1..089a856d6a7 --- a/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml +++ b/inputFiles/poromechanicsFractures/SlipPermeability_pEDFM_base.xml @@ -65,7 +65,7 @@ faceBlock="embeddedSurfaceSubRegion" subRegionType="embeddedElement" materialList="{ water, fractureFilling, fractureContact, hApertureModel}" - defaultAperture="1e-3"/> + defaultAperture="1.0e-3"/> @@ -132,7 +132,7 @@ + values="{ 1.0e-6, 1.0e-3 }"/> diff --git a/inputFiles/poromechanicsFractures/WillisRichardsPermeability_efem-edfm_base.xml b/inputFiles/poromechanicsFractures/WillisRichardsPermeability_efem-edfm_base.xml old mode 100755 new mode 100644 index 5227b229979..03f827efd1d --- a/inputFiles/poromechanicsFractures/WillisRichardsPermeability_efem-edfm_base.xml +++ b/inputFiles/poromechanicsFractures/WillisRichardsPermeability_efem-edfm_base.xml @@ -68,7 +68,7 @@ faceBlock="embeddedSurfaceSubRegion" subRegionType="embeddedElement" materialList="{ water, fractureFilling, fractureContact, hApertureModel }" - defaultAperture="1e-3"/> + defaultAperture="1.0e-3"/> @@ -135,7 +135,7 @@ + values="{ 1.0e-6, 1.0e-3 }"/> diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.hpp b/src/coreComponents/constitutive/contact/CoulombFriction.hpp index 3851000dd13..575aef0d3fe 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.hpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.hpp @@ -223,7 +223,7 @@ GEOS_HOST_DEVICE real64 CoulombFrictionUpdates::computeLimitTangentialTractionNorm( real64 const & normalTraction, real64 & dLimitTangentialTractionNorm_dTraction ) const { - dLimitTangentialTractionNorm_dTraction = m_frictionCoefficient; + dLimitTangentialTractionNorm_dTraction = -m_frictionCoefficient; return ( m_cohesion - normalTraction * m_frictionCoefficient ); } @@ -276,10 +276,10 @@ inline void CoulombFrictionUpdates::computeShearTraction( localIndex const k, dTractionVector_dJump[1][0] = dTractionVector_dJump[0][0] * dLimitTau_dNormalTraction * slip[0] / slipNorm; dTractionVector_dJump[1][1] = limitTau * pow( slip[1], 2 ) / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); - dTractionVector_dJump[1][2] = limitTau * slip[0] * slip[1] / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); + dTractionVector_dJump[1][2] = -limitTau * slip[0] * slip[1] / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); dTractionVector_dJump[2][0] = dTractionVector_dJump[0][0] * dLimitTau_dNormalTraction * slip[1] / slipNorm; - dTractionVector_dJump[2][1] = limitTau * slip[0] * slip[1] / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); + dTractionVector_dJump[2][1] = -limitTau * slip[0] * slip[1] / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); dTractionVector_dJump[2][2] = limitTau * pow( slip[0], 2 ) / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); // Compute elastic component of the slip for this case diff --git a/src/coreComponents/constitutive/contact/FrictionBase.hpp b/src/coreComponents/constitutive/contact/FrictionBase.hpp index 28629920af0..b41547880c5 100644 --- a/src/coreComponents/constitutive/contact/FrictionBase.hpp +++ b/src/coreComponents/constitutive/contact/FrictionBase.hpp @@ -177,7 +177,11 @@ class FrictionBaseUpdates inline virtual real64 computeLimitTangentialTractionNorm( real64 const & normalTraction, real64 & dLimitTangentialTractionNorm_dTraction ) const - { GEOS_UNUSED_VAR( normalTraction, dLimitTangentialTractionNorm_dTraction ); return 0; }; + { + GEOS_UNUSED_VAR( normalTraction ); + dLimitTangentialTractionNorm_dTraction = 0.0; + return 0; + } protected: diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp index 83e53fd8e14..6b3552acf75 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp @@ -63,20 +63,6 @@ class FrictionlessContactUpdates : public FrictionBaseUpdates arraySlice1d< real64 const > const & tractionVector, integer & fractureState ) const override final; - - /** - * @brief Evaluate the limit tangential traction norm and return the derivative wrt normal traction - * @param[in] normalTraction the normal traction - * @param[out] dLimitTangentialTractionNorm_dTraction the derivative of the limit tangential traction norm wrt normal traction - * @return the limit tangential traction norm - */ - GEOS_HOST_DEVICE - inline - virtual real64 computeLimitTangentialTractionNorm( real64 const & normalTraction, - real64 & dLimitTangentialTractionNorm_dTraction ) const override final - { GEOS_UNUSED_VAR( normalTraction, dLimitTangentialTractionNorm_dTraction ); return 0.0; } - -private: }; diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index c9a9ae4aac2..3c1537f9c8f 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -1593,7 +1593,7 @@ void SolidMechanicsLagrangeContact:: { elemRHS[i] = Ja * ( traction[kfe][i] - limitTau * sliding[ i-1 ] / slidingNorm ); - dRdT( i, 0 ) = Ja * dLimitTau_dNormalTraction * sliding[ i-1 ] / slidingNorm; + dRdT( i, 0 ) = -Ja * dLimitTau_dNormalTraction * sliding[ i-1 ] / slidingNorm; dRdT( i, i ) = Ja; } @@ -1641,7 +1641,7 @@ void SolidMechanicsLagrangeContact:: { elemRHS[i] = Ja * traction[kfe][i] * ( 1.0 - limitTau / vauxNorm ); - dRdT( i, 0 ) = Ja * traction[kfe][i] * dLimitTau_dNormalTraction / vauxNorm; + dRdT( i, 0 ) = -Ja * traction[kfe][i] * dLimitTau_dNormalTraction / vauxNorm; dRdT( i, i ) = Ja; } } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 8261e822868..429ea336ab7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -471,7 +471,7 @@ void SinglePhaseBase::initializePostInitialConditionsPreSubGroups() [&]( localIndex const, SurfaceElementRegion & region ) { - region.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) + region.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion & subRegion ) { subRegion.getWrapper< real64_array >( fields::flow::hydraulicAperture::key() ). setApplyDefaultValue( region.getDefaultAperture() ); @@ -707,8 +707,8 @@ void SinglePhaseBase::implicitStepSetup( real64 const & GEOS_UNUSED_PARAM( time_ } ); - mesh.getElemManager().forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, - FaceElementSubRegion & subRegion ) + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) { arrayView1d< real64 const > const aper = subRegion.getField< fields::flow::hydraulicAperture >(); arrayView1d< real64 > const aper0 = subRegion.getField< fields::flow::aperture0 >(); @@ -728,6 +728,7 @@ void SinglePhaseBase::implicitStepSetup( real64 const & GEOS_UNUSED_PARAM( time_ fluid.saveConvergedState(); } ); + } ); } @@ -791,8 +792,8 @@ void SinglePhaseBase::implicitStepComplete( real64 const & time, } ); - mesh.getElemManager().forElementSubRegions< FaceElementSubRegion >( regionNames, [&]( localIndex const, - FaceElementSubRegion & subRegion ) + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) { arrayView1d< integer const > const elemGhostRank = subRegion.ghostRank(); arrayView1d< real64 const > const volume = subRegion.getElementVolume(); @@ -817,7 +818,6 @@ void SinglePhaseBase::implicitStepComplete( real64 const & time, } } ); } ); - } ); } diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp index ad5ccf38ab1..e88ce14509f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp @@ -278,7 +278,9 @@ class SinglePhasePoromechanicsEFEM : arrayView1d< real64 const > const m_surfaceArea; - arrayView1d< real64 const > const m_elementVolume; + arrayView1d< real64 const > const m_elementVolumeCell; + + arrayView1d< real64 const > const m_elementVolumeFrac; arrayView1d< real64 const > const m_deltaVolume; diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp index cfae8a2e7d8..9229f1ff774 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp @@ -91,8 +91,9 @@ SinglePhasePoromechanicsEFEM( NodeManager const & nodeManager, m_tVec2( embeddedSurfSubRegion.getTangentVector2() ), m_surfaceCenter( embeddedSurfSubRegion.getElementCenter() ), m_surfaceArea( embeddedSurfSubRegion.getElementArea() ), - m_elementVolume( elementSubRegion.getElementVolume() ), - m_deltaVolume( elementSubRegion.template getField< fields::flow::deltaVolume >() ), + m_elementVolumeCell( elementSubRegion.getElementVolume() ), + m_elementVolumeFrac( embeddedSurfSubRegion.getElementVolume() ), + m_deltaVolume( embeddedSurfSubRegion.template getField< fields::flow::deltaVolume >() ), m_fracturedElems( elementSubRegion.fracturedElementsList() ), m_cellsToEmbeddedSurfaces( elementSubRegion.embeddedSurfacesList().toViewConst() ), m_gravityVector{ inputGravityVector[0], inputGravityVector[1], inputGravityVector[2] }, @@ -148,7 +149,7 @@ setup( localIndex const k, { localIndex const embSurfIndex = m_cellsToEmbeddedSurfaces[k][0]; - stack.hInv = m_surfaceArea[embSurfIndex] / m_elementVolume[k]; + stack.hInv = m_surfaceArea[embSurfIndex] / m_elementVolumeCell[k]; for( localIndex a=0; a Date: Thu, 21 Nov 2024 10:25:26 -0500 Subject: [PATCH 258/286] fix: bug in GEOS build (#3449) Co-authored-by: Randolph Settgast --- src/cmake/thirdparty/SetupGeosxThirdParty.cmake | 2 +- src/coreComponents/common/format/StringUtilities.cpp | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake index e30dbd937bc..28549eb8927 100644 --- a/src/cmake/thirdparty/SetupGeosxThirdParty.cmake +++ b/src/cmake/thirdparty/SetupGeosxThirdParty.cmake @@ -670,7 +670,7 @@ if(DEFINED HYPRE_DIR AND ENABLE_HYPRE) find_package( rocsolver REQUIRED ) find_package( rocsparse REQUIRED ) find_package( rocrand REQUIRED ) - append( APPEND HYPRE_DEPENDS roc::rocblas roc::rocsparse roc::rocsolver roc::rocrand ) + list( APPEND HYPRE_DEPENDS roc::rocblas roc::rocsparse roc::rocsolver roc::rocrand ) endif( ) find_and_import( NAME hypre diff --git a/src/coreComponents/common/format/StringUtilities.cpp b/src/coreComponents/common/format/StringUtilities.cpp index 83afce1cf87..cfc00307781 100644 --- a/src/coreComponents/common/format/StringUtilities.cpp +++ b/src/coreComponents/common/format/StringUtilities.cpp @@ -93,8 +93,9 @@ string addCommaSeparators( T const & num ) return result; } -template string addCommaSeparators( localIndex const & num ); -template string addCommaSeparators( globalIndex const & num ); +template string addCommaSeparators( int const & num ); +template string addCommaSeparators( long int const & num ); +template string addCommaSeparators( long long int const & num ); // put definition here so we can control the allowable values of T and // modication of this function triggers a whole code recompile...which From 70e46b3df9f1f607766d7a2555484e31117016c9 Mon Sep 17 00:00:00 2001 From: Lionel Untereiner Date: Thu, 21 Nov 2024 22:36:26 +0100 Subject: [PATCH 259/286] feat: choose the number of output vtu files (#2637) Co-authored-by: MelReyCG --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../fileIO/Outputs/VTKOutput.cpp | 15 ++- .../fileIO/Outputs/VTKOutput.hpp | 4 + .../fileIO/vtk/VTKPolyDataWriterInterface.cpp | 94 +++++++++++++------ .../fileIO/vtk/VTKPolyDataWriterInterface.hpp | 55 ++++++++--- src/coreComponents/schema/schema.xsd | 2 + 7 files changed, 131 insertions(+), 45 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 0a3900f23a9..7aad59dc92f 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3439-8919-b09db43 + baseline: integratedTests/baseline_integratedTests-pr2637-8940-3c0fc5c allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 8e9abcd6c27..15417af0b13 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #2637 (2024-11-21) +===================== +Added numberOfTargetProcesses. + PR #3439 (2024-11-20) ===================== EDFM bugfixes: derivatives sign, frac/cell element volume, fix apertures inconsistency in test cases. diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp index da364d0e4db..15e4b1dac13 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp @@ -18,7 +18,7 @@ */ #include "VTKOutput.hpp" - +#include "common/MpiWrapper.hpp" #if defined(GEOS_USE_PYGEOSX) #include "fileIO/python/PyVTKOutputType.hpp" @@ -56,6 +56,11 @@ VTKOutput::VTKOutput( string const & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Level detail plot. Only fields with lower of equal plot level will be output." ); + registerWrapper( viewKeysStruct::numberOfTargetProcesses, &m_numberOfTargetProcesses ). + setApplyDefaultValue( MpiWrapper::commSize() ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Number of output aggregate files to be written." ); + registerWrapper( viewKeysStruct::writeGhostCells, &m_writeGhostCells ). setApplyDefaultValue( 0 ). setInputFlag( InputFlags::OPTIONAL ). @@ -102,6 +107,14 @@ void VTKOutput::postInputInitialization() m_writer.setLevelNames( m_levelNames.toViewConst() ); m_writer.setOnlyPlotSpecifiedFieldNamesFlag( m_onlyPlotSpecifiedFieldNames ); + GEOS_ERROR_IF_LT_MSG( m_numberOfTargetProcesses, 1, + GEOS_FMT( "{}: processes count cannot be less than 1.", + getWrapperDataContext( viewKeysStruct::numberOfTargetProcesses ) ) ); + GEOS_ERROR_IF_GT_MSG( m_numberOfTargetProcesses, MpiWrapper::commSize(), + GEOS_FMT( "{}: processes count cannot exceed the launched ranks count.", + getWrapperDataContext( viewKeysStruct::numberOfTargetProcesses ) ) ); + m_writer.setNumberOfTargetProcesses( m_numberOfTargetProcesses ); + string const fieldNamesString = viewKeysStruct::fieldNames; string const onlyPlotSpecifiedFieldNamesString = viewKeysStruct::onlyPlotSpecifiedFieldNames; diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp index 871a6497569..5b167dc66d6 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp @@ -97,6 +97,7 @@ class VTKOutput : public OutputBase static constexpr auto onlyPlotSpecifiedFieldNames = "onlyPlotSpecifiedFieldNames"; static constexpr auto fieldNames = "fieldNames"; static constexpr auto levelNames = "levelNames"; + static constexpr auto numberOfTargetProcesses = "numberOfTargetProcesses"; } vtkOutputViewKeys; /// @endcond @@ -114,6 +115,9 @@ class VTKOutput : public OutputBase integer m_writeFaceMesh; integer m_plotLevel; + /// Aggregate output data to be written + integer m_numberOfTargetProcesses; + /// Should the vtk files contain the ghost cells or not. integer m_writeGhostCells; diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp index be65508921b..5f063a4e3ca 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp @@ -33,11 +33,14 @@ #include #include #include - +#include // System includes #include #include +#include "mesh/generators/VTKUtilities.hpp" + + namespace geos { @@ -1041,7 +1044,7 @@ void VTKPolyDataWriterInterface::writeElementFields( ElementRegionBase const & r void VTKPolyDataWriterInterface::writeCellElementRegions( real64 const time, ElementRegionManager const & elemManager, NodeManager const & nodeManager, - string const & path ) const + string const & path ) { elemManager.forElementRegions< CellElementRegion >( [&]( CellElementRegion const & region ) { @@ -1055,15 +1058,13 @@ void VTKPolyDataWriterInterface::writeCellElementRegions( real64 const time, writeTimestamp( ug.GetPointer(), time ); writeElementFields( region, ug->GetCellData() ); writeNodeFields( nodeManager, VTKCells.nodes, ug->GetPointData() ); - - string const regionDir = joinPath( path, region.getName() ); - writeUnstructuredGrid( regionDir, ug.GetPointer() ); + writeUnstructuredGrid( path, region, ug.GetPointer() ); } ); } void VTKPolyDataWriterInterface::writeParticleRegions( real64 const time, ParticleManager const & particleManager, - string const & path ) const + string const & path ) { particleManager.forParticleRegions< ParticleRegion >( [&]( ParticleRegion const & region ) { @@ -1077,15 +1078,15 @@ void VTKPolyDataWriterInterface::writeParticleRegions( real64 const time, writeTimestamp( ug.GetPointer(), time ); writeParticleFields( region, ug->GetCellData() ); - string const regionDir = joinPath( path, region.getName() ); - writeUnstructuredGrid( regionDir, ug.GetPointer() ); + // string const regionDir = joinPath( path, region.getName() ); + writeUnstructuredGrid( path, region, ug.GetPointer() ); } ); } void VTKPolyDataWriterInterface::writeWellElementRegions( real64 const time, ElementRegionManager const & elemManager, NodeManager const & nodeManager, - string const & path ) const + string const & path ) { elemManager.forElementRegions< WellElementRegion >( [&]( WellElementRegion const & region ) { @@ -1098,9 +1099,7 @@ void VTKPolyDataWriterInterface::writeWellElementRegions( real64 const time, writeTimestamp( ug.GetPointer(), time ); writeElementFields( region, ug->GetCellData() ); - - string const regionDir = joinPath( path, region.getName() ); - writeUnstructuredGrid( regionDir, ug.GetPointer() ); + writeUnstructuredGrid( path, region, ug.GetPointer() ); } ); } @@ -1109,7 +1108,7 @@ void VTKPolyDataWriterInterface::writeSurfaceElementRegions( real64 const time, NodeManager const & nodeManager, EmbeddedSurfaceNodeManager const & embSurfNodeManager, FaceManager const & faceManager, - string const & path ) const + string const & path ) { elemManager.forElementRegions< SurfaceElementRegion >( [&]( SurfaceElementRegion const & region ) { @@ -1140,9 +1139,7 @@ void VTKPolyDataWriterInterface::writeSurfaceElementRegions( real64 const time, writeTimestamp( ug.GetPointer(), time ); writeElementFields( region, ug->GetCellData() ); - - string const regionDir = joinPath( path, region.getName() ); - writeUnstructuredGrid( regionDir, ug.GetPointer() ); + writeUnstructuredGrid( path, region, ug.GetPointer() ); } ); } @@ -1188,13 +1185,13 @@ void VTKPolyDataWriterInterface::writeVtmFile( integer const cycle, string const meshPath = joinPath( getCycleSubFolder( cycle ), meshBodyName, meshLevelName ); - int const mpiSize = MpiWrapper::commSize(); + // int const mpiSize = MpiWrapper::commSize(); auto addElementRegion = [&]( ElementRegionBase const & region ) { std::vector< string > const blockPath{ meshBody.getName(), meshLevel.getName(), region.getCatalogName(), region.getName() }; string const regionPath = joinPath( meshPath, region.getName() ); - for( int i = 0; i < mpiSize; i++ ) + for( const auto & i : m_targetProcessesId.at( region.getName()) ) { string const dataSetName = getRankFileName( i ); string const dataSetFile = joinPath( regionPath, dataSetName + ".vtu" ); @@ -1207,7 +1204,7 @@ void VTKPolyDataWriterInterface::writeVtmFile( integer const cycle, string const & regionName = region.getName(); std::vector< string > const blockPath{ meshBodyName, meshLevelName, region.getCatalogName(), regionName }; string const regionPath = joinPath( meshPath, regionName ); - for( int i = 0; i < mpiSize; i++ ) + for( const auto & i : m_targetProcessesId.at( region.getName()) ) { string const dataSetName = getRankFileName( i ); string const dataSetFile = joinPath( regionPath, dataSetName + ".vtu" ); @@ -1256,8 +1253,11 @@ int toVtkOutputMode( VTKOutputMode const mode ) } void VTKPolyDataWriterInterface::writeUnstructuredGrid( string const & path, - vtkUnstructuredGrid * ug ) const + ObjectManagerBase const & region, + vtkUnstructuredGrid * ug ) { + string const regionDir = joinPath( path, region.getName() ); + vtkSmartPointer< vtkAlgorithm > filter; // If we want to get rid of the ghost ranks, we use the appropriate `vtkThreshold` filter. @@ -1279,15 +1279,51 @@ void VTKPolyDataWriterInterface::writeUnstructuredGrid( string const & path, } filter->SetInputDataObject( ug ); - filter->Update(); - - makeDirectory( path ); - string const vtuFilePath = joinPath( path, getRankFileName( MpiWrapper::commRank() ) + ".vtu" ); - auto const vtuWriter = vtkSmartPointer< vtkXMLUnstructuredGridWriter >::New(); - vtuWriter->SetInputData( filter->GetOutputDataObject( 0 ) ); - vtuWriter->SetFileName( vtuFilePath.c_str() ); - vtuWriter->SetDataMode( toVtkOutputMode( m_outputMode ) ); - vtuWriter->Write(); + + vtkSmartPointer< vtkMultiProcessController > controller = vtk::getController(); + vtkMultiProcessController::SetGlobalController( controller ); + + // In case of m_numberOfTargetProcesses == GetNumberOfProcesses the filter returns a shallow copy + // The behavior is the same as previously in this case. The rank number is computed instead of implicitly written + vtkNew< vtkAggregateDataSetFilter > aggregate; + aggregate->SetInputConnection( filter->GetOutputPort()); + aggregate->SetNumberOfTargetProcesses( m_numberOfTargetProcesses ); + aggregate->SetMergePoints( false ); + aggregate->Update(); + + int localCommRank = -1; + if( vtkDataSet::SafeDownCast( aggregate->GetOutput())->GetNumberOfPoints() != 0 ) + { + localCommRank = MpiWrapper::commRank(); + makeDirectory( regionDir ); + string const vtuFilePath = joinPath( regionDir, getRankFileName( localCommRank ) + ".vtu" ); + auto const vtuWriter = vtkSmartPointer< vtkXMLUnstructuredGridWriter >::New(); + vtuWriter->SetInputData( aggregate->GetOutput() ); + vtuWriter->SetFileName( vtuFilePath.c_str() ); + vtuWriter->SetDataMode( toVtkOutputMode( m_outputMode ) ); + vtuWriter->Write(); + } + + const int size = MpiWrapper::commSize( MPI_COMM_GEOS ); + std::vector< int > globalValues( size ); + + // Everything is done on rank 0 + MpiWrapper::gather( &localCommRank, + 1, + globalValues.data(), + 1, + 0, + MPI_COMM_GEOS ); + + if( MpiWrapper::commRank() == 0 ) + { + // any rank that does not hold data will not participate in the output + globalValues.erase( std::remove_if( globalValues.begin(), + globalValues.end(), + []( int x ) { return x == -1; } ), + globalValues.end()); + m_targetProcessesId[region.getName()] = globalValues; + } } void VTKPolyDataWriterInterface::write( real64 const time, diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp index 77c6b90e8aa..44bb86e3c71 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp @@ -17,6 +17,7 @@ #define GEOS_FILEIO_VTK_VTKPOLYDATAWRITERINTERFACE_HPP_ #include "common/DataTypes.hpp" +#include "mesh/ObjectManagerBase.hpp" #include "dataRepository/WrapperBase.hpp" #include "dataRepository/Wrapper.hpp" #include "fileIO/vtk/VTKPVDWriter.hpp" @@ -167,6 +168,14 @@ class VTKPolyDataWriterInterface { m_levelNames.insert( levelNames.begin(), levelNames.end() ); } + /** + * @brief Set the Number Of Target Processes + * @param[in] numberOfTargetProcesses the number of processes + */ + void setNumberOfTargetProcesses( integer const numberOfTargetProcesses ) + { + m_numberOfTargetProcesses = numberOfTargetProcesses; + } /** * @brief Main method of this class. Write all the files for one time step. @@ -223,33 +232,38 @@ class VTKPolyDataWriterInterface * @brief Writes the files for all the CellElementRegions. * @details There will be one file written per CellElementRegion and per rank. * @param[in] time the time-step - * @param[in] cycle the current cycle number * @param[in] elemManager the ElementRegionManager containing the CellElementRegions to be output * @param[in] nodeManager the NodeManager containing the nodes of the domain to be output - * @param[in] meshLevelName the name of the MeshLevel containing the nodes and elements to be output - * @param[in] meshBodyName the name of the MeshBody containing the nodes and elements to be output + * @param[in] path the root path where the mesh will be written */ void writeCellElementRegions( real64 time, ElementRegionManager const & elemManager, NodeManager const & nodeManager, - string const & path ) const; - - void writeParticleRegions( real64 const time, - ParticleManager const & particleManager, - string const & path ) const; + string const & path ); /** * @brief Writes the files containing the well representation * @details There will be one file written per WellElementRegion and per rank * @param[in] time the time-step - * @param[in] cycle the current cycle number * @param[in] elemManager the ElementRegionManager containing the WellElementRegions to be output * @param[in] nodeManager the NodeManager containing the nodes of the domain to be output + * @param[in] path the root path where the mesh will be written */ void writeWellElementRegions( real64 time, ElementRegionManager const & elemManager, NodeManager const & nodeManager, - string const & path ) const; + string const & path ); + + /** + * @brief Writes the files containing the particle representation + * @details There will be one file written per ParticleRegion and per rank + * @param[in] time the time-step + * @param[in] particleManager the ParticleManager containing the ParticleRegions to be output + * @param[in] path the root path where the mesh will be written + */ + void writeParticleRegions( real64 const time, + ParticleManager const & particleManager, + string const & path ); /** * @brief Writes the files containing the faces elements @@ -266,13 +280,13 @@ class VTKPolyDataWriterInterface NodeManager const & nodeManager, EmbeddedSurfaceNodeManager const & embSurfNodeManager, FaceManager const & faceManager, - string const & path ) const; + string const & path ); /** * @brief Writes a VTM file for the time-step \p time. * @details a VTM file is a VTK Multiblock file. It contains relative path to different files organized in blocks. * @param[in] cycle the current cycle number - * @param[in] elemManager the ElementRegionManager containing all the regions to be output and referred to in the VTM file + * @param[in] domain the DomainPartition containing all the regions to be output and referred to in the VTM file * @param[in] vtmWriter a writer specialized for the VTM file format */ @@ -297,6 +311,11 @@ class VTKPolyDataWriterInterface void writeElementFields( ElementRegionBase const & subRegion, vtkCellData * cellData ) const; + /** + * @brief Writes all the fields associated to the elements of \p er if their plotlevel is <= m_plotLevel + * @param[in] region ParticleRegion being written + * @param[in] cellData a VTK object containing all the fields associated with the elements + */ void writeParticleFields( ParticleRegionBase const & region, vtkCellData * cellData ) const; @@ -305,11 +324,13 @@ class VTKPolyDataWriterInterface * @details The unstructured grid is the last element in the hierarchy of the output, * it contains the cells connectivities and the vertices coordinates as long as the * data fields associated with it - * @param[in] ug a VTK SmartPointer to the VTK unstructured grid. * @param[in] path directory path for the grid file + * @param[in] region ElementRegionBase beeing written + * @param[in] ug a VTK SmartPointer to the VTK unstructured grid. */ void writeUnstructuredGrid( string const & path, - vtkUnstructuredGrid * ug ) const; + ObjectManagerBase const & region, + vtkUnstructuredGrid * ug ); private: @@ -352,6 +373,12 @@ class VTKPolyDataWriterInterface /// Defines whether to plot a faceElement as a 3D volumetric element or not. bool m_writeFaceElementsAs3D; + + /// Number of target processes to aggregate the data to be written + integer m_numberOfTargetProcesses; + + /// Map a region name to the array of ranks outputed for it + std::map< string, std::vector< integer > > m_targetProcessesId; }; } // namespace vtk diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 3235c8a9794..e013bde4576 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -2149,6 +2149,8 @@ the relative residual norm satisfies: + + From b23c80eeddc9ed47249d77c064550ffe3400215f Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Tue, 26 Nov 2024 14:34:43 -0800 Subject: [PATCH 260/286] fix: change FaceElementSubRegion maps to volume elements back to fixed size relations (#3448) * change m_2dElemToElems back to a FixedToManyElementRelation * change FaceElementSubRegion::m_toFacesRelation back to array2d * disable unmapped check in fixUpDownMaps * fixed error with registration of relation * comments for new trait and resizeDefault functions * add code to delete both face connector entries in cell stencil when a fracture is created. complete but not required since the second face is new * update baselines * update BASELINE_NOTES --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 + src/coreComponents/codingUtilities/traits.hpp | 8 + .../dataRepository/BufferOps_inline.hpp | 8 +- src/coreComponents/dataRepository/Wrapper.hpp | 2 +- .../dataRepository/wrapperHelpers.hpp | 39 ++- .../TwoPointFluxApproximation.cpp | 12 +- .../mesh/ElementRegionManager.cpp | 27 +- .../mesh/EmbeddedSurfaceSubRegion.cpp | 18 +- .../mesh/EmbeddedSurfaceSubRegion.hpp | 21 ++ .../mesh/FaceElementSubRegion.cpp | 248 +++++++++--------- .../mesh/FaceElementSubRegion.hpp | 22 +- src/coreComponents/mesh/FaceManager.cpp | 47 ++-- src/coreComponents/mesh/MeshLevel.cpp | 7 +- src/coreComponents/mesh/ObjectManagerBase.hpp | 5 +- .../mesh/SurfaceElementRegion.cpp | 13 +- .../mesh/SurfaceElementSubRegion.cpp | 15 -- .../mesh/SurfaceElementSubRegion.hpp | 20 -- ...lidMechanicsAugmentedLagrangianContact.cpp | 14 +- .../contact/SolidMechanicsLagrangeContact.cpp | 35 +-- ...olidMechanicsLagrangeContactBubbleStab.cpp | 8 +- .../contact/SolidMechanicsPenaltyContact.cpp | 2 +- ...dMechanicsConformingContactKernelsBase.hpp | 4 +- .../multiphysics/HydrofractureSolver.cpp | 12 +- .../HydrofractureSolverKernels.hpp | 8 +- ...ePhasePoromechanicsConformingFractures.cpp | 12 +- .../SolidMechanicsLagrangianFEM.cpp | 2 +- .../ParallelTopologyChange.cpp | 2 +- .../surfaceGeneration/SurfaceGenerator.cpp | 2 +- src/coreComponents/schema/schema.xsd.other | 2 +- 30 files changed, 350 insertions(+), 272 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 7aad59dc92f..b1fd9206047 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr2637-8940-3c0fc5c + baseline: integratedTests/baseline_integratedTests-pr3448-8959-1ff97b3 allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 15417af0b13..3fefeb622b4 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3448 (2024-11-21) +===================== +Switched the FaceElementSubRegion::m_toFacesRelation and FaceElementSubRegion::m_2dElemToElems back to array2d instead of ArrayOfArray. This results in a reordering m_toFacesRelation back to the "correct" assumed order of "original face first". This fixes a bug that failed to remove the CellStencil entry when a FaceElement splits two cells. + + PR #2637 (2024-11-21) ===================== Added numberOfTargetProcesses. diff --git a/src/coreComponents/codingUtilities/traits.hpp b/src/coreComponents/codingUtilities/traits.hpp index 8ab60cddd52..740430a56d3 100644 --- a/src/coreComponents/codingUtilities/traits.hpp +++ b/src/coreComponents/codingUtilities/traits.hpp @@ -96,6 +96,14 @@ HAS_MEMBER_FUNCTION( capacity, localIndex, ); */ HAS_MEMBER_FUNCTION_NO_RTYPE( resize, 0 ); +/** + * @brief Defines a static constexpr bool HasMemberFunction_resizeDefault< @p CLASS > + * that is true iff the method @p CLASS ::resizeDefault( int, int, int) exists. + * @tparam CLASS The type to test. + */ +HAS_MEMBER_FUNCTION_NO_RTYPE( resizeDefault, 0, 0 ); + + /** * @brief Defines a static constexpr bool HasMemberFunction_reserve< @p CLASS > * that is true iff the method @p CLASS ::reserve( localIndex ) exists. diff --git a/src/coreComponents/dataRepository/BufferOps_inline.hpp b/src/coreComponents/dataRepository/BufferOps_inline.hpp index cd87b74e7eb..80486db5f5e 100644 --- a/src/coreComponents/dataRepository/BufferOps_inline.hpp +++ b/src/coreComponents/dataRepository/BufferOps_inline.hpp @@ -1762,7 +1762,11 @@ Pack( buffer_unit_type * & buffer, arraySlice1d< globalIndex const > const & relatedObjectLocalToGlobalMap ) { localIndex sizeOfPackedChars = 0; - array1d< globalIndex > junk; + array1d< globalIndex > invalidGlobalIndices( var.size( 1 ) ); + for( localIndex a=0; a( buffer, indices.size() ); for( localIndex a=0; a const & unmappedGI = iterUnmappedGI==unmappedGlobalIndices.end() ? - junk : + invalidGlobalIndices : iterUnmappedGI->second; sizeOfPackedChars += Pack< DO_PACKING >( buffer, diff --git a/src/coreComponents/dataRepository/Wrapper.hpp b/src/coreComponents/dataRepository/Wrapper.hpp index 881d9df2a6c..a75bf3cb9c5 100644 --- a/src/coreComponents/dataRepository/Wrapper.hpp +++ b/src/coreComponents/dataRepository/Wrapper.hpp @@ -411,7 +411,7 @@ class Wrapper final : public WrapperBase virtual void resize( localIndex const newSize ) override { wrapperHelpers::move( *m_data, hostMemorySpace, true ); - wrapperHelpers::resizeDefault( reference(), newSize, m_default ); + wrapperHelpers::resizeDefault( reference(), newSize, m_default, this->getName() ); } /// @cond DO_NOT_DOCUMENT diff --git a/src/coreComponents/dataRepository/wrapperHelpers.hpp b/src/coreComponents/dataRepository/wrapperHelpers.hpp index fcbaea7ab97..c77b178d5f2 100644 --- a/src/coreComponents/dataRepository/wrapperHelpers.hpp +++ b/src/coreComponents/dataRepository/wrapperHelpers.hpp @@ -33,6 +33,7 @@ #include "common/GeosxMacros.hpp" #include "common/Span.hpp" #include "codingUtilities/traits.hpp" +#include "LvArray/src/system.hpp" #if defined(GEOS_USE_PYGEOSX) #include "LvArray/src/python/python.hpp" @@ -188,18 +189,40 @@ resize( T & GEOS_UNUSED_PARAM( value ), localIndex const GEOS_UNUSED_PARAM( newSize ) ) {} - -template< typename T, int NDIM, typename PERMUTATION > -inline std::enable_if_t< DefaultValue< Array< T, NDIM, PERMUTATION > >::has_default_value > -resizeDefault( Array< T, NDIM, PERMUTATION > & value, +template< typename T > +inline std::enable_if_t< traits::HasMemberFunction_resizeDefault< T > && + DefaultValue< T >::has_default_value > +resizeDefault( T & value, localIndex const newSize, - DefaultValue< Array< T, NDIM, PERMUTATION > > const & defaultValue ) + DefaultValue< T > const & defaultValue, + string const & ) { value.resizeDefault( newSize, defaultValue.value ); } template< typename T > -inline void -resizeDefault( T & value, localIndex const newSize, DefaultValue< T > const & GEOS_UNUSED_PARAM( defaultValue ) ) -{ resize( value, newSize ); } +inline std::enable_if_t< !( traits::HasMemberFunction_resizeDefault< T > && + DefaultValue< T >::has_default_value ) > +resizeDefault( T & value, + localIndex const newSize, + DefaultValue< T > const & GEOS_UNUSED_PARAM( defaultValue ), + string const & name ) +{ +#if !defined(NDEBUG) + GEOS_LOG_RANK_0( GEOS_FMT( "Warning: For Wrapper<{}>::name() = {}:\n" + " wrapperHelpers::resizeDefault<{}>() called, but the SFINAE filter failed:\n" + " traits::HasMemberFunction_resizeDefault< {} > = {}\n " + " DefaultValue< {} >::has_default_value = {}", + LvArray::system::demangleType< T >(), + name, + LvArray::system::demangleType< T >(), + LvArray::system::demangleType< T >(), + traits::HasMemberFunction_resizeDefault< T >, + LvArray::system::demangleType< T >(), + DefaultValue< T >::has_default_value ) ); +#else + GEOS_UNUSED_VAR( name ); +#endif + resize( value, newSize ); +} template< typename T, int NDIM, typename PERMUTATION > diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp index ab28f40a6ea..4b1178bb545 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp @@ -384,6 +384,7 @@ void TwoPointFluxApproximation::cleanMatrixMatrixConnectionsDFM( MeshLevel & mes // This is there to shut off previously connected cells // that are not connected anymore due to dynamic fracturing. cellStencil.zero( faceMap[kfe][0] ); + cellStencil.zero( faceMap[kfe][1] ); } ); } @@ -418,14 +419,14 @@ void TwoPointFluxApproximation::addFractureMatrixConnectionsDFM( MeshLevel & mes SurfaceElementRegion & fractureRegion = elemManager.getRegion< SurfaceElementRegion >( faceElementRegionName ); localIndex const fractureRegionIndex = fractureRegion.getIndexInParent(); FaceElementSubRegion & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); - OrderedVariableToManyElementRelation const & elems2dToElems3d = fractureSubRegion.getToCellRelation(); + FixedToManyElementRelation const & elems2dToElems3d = fractureSubRegion.getToCellRelation(); SortedArrayView< localIndex const > const new2dElems = fractureSubRegion.m_newFaceElements.toViewConst(); FaceElementSubRegion::FaceMapType const & faceMap = fractureSubRegion.faceList(); - ArrayOfArraysView< localIndex const > elemRegionList = elems2dToElems3d.m_toElementRegion.toViewConst(); - ArrayOfArraysView< localIndex const > elemSubRegionList = elems2dToElems3d.m_toElementSubRegion.toViewConst(); - ArrayOfArraysView< localIndex const > elemList = elems2dToElems3d.m_toElementIndex.toViewConst(); + arrayView2d< localIndex const > const elemRegionList = elems2dToElems3d.m_toElementRegion.toViewConst(); + arrayView2d< localIndex const > const elemSubRegionList = elems2dToElems3d.m_toElementSubRegion.toViewConst(); + arrayView2d< localIndex const > const elemList = elems2dToElems3d.m_toElementIndex.toViewConst(); // reserve memory for the connections of this region if( cellStencil.size() != 0 ) @@ -447,7 +448,6 @@ void TwoPointFluxApproximation::addFractureMatrixConnectionsDFM( MeshLevel & mes forAll< serialPolicy >( new2dElems.size(), [ new2dElems, - &elems2dToElems3d, &faceToCellStencil, &faceMap, elemRegionList, @@ -465,7 +465,7 @@ void TwoPointFluxApproximation::addFractureMatrixConnectionsDFM( MeshLevel & mes { localIndex const kfe = new2dElems[k]; { - localIndex const numElems = elems2dToElems3d.m_toElementSubRegion.sizeOfArray( kfe ); + localIndex const numElems = 2; GEOS_ERROR_IF( numElems > maxElems, "Max stencil size exceeded by fracture-cell connector " << kfe ); diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index 6f3669a0a19..756da19f7ce 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -149,18 +149,31 @@ void ElementRegionManager::generateMesh( CellBlockManagerABC const & cellBlockMa array2d< localIndex > const blockToSubRegion = this->getCellBlockToSubRegionMap( cellBlockManager ); this->forElementRegions< SurfaceElementRegion >( [&]( SurfaceElementRegion & elemRegion ) { - SurfaceElementSubRegion & subRegion = elemRegion.getUniqueSubRegion< SurfaceElementSubRegion >(); + SurfaceElementSubRegion & surfaceSubRegion = elemRegion.getUniqueSubRegion< SurfaceElementSubRegion >(); // While indicated as containing element subregion information, // `relation` currently contains cell block information // that will be transformed into element subregion information. // This is why we copy the information into a temporary, // which frees space for the final information (of same size). - OrderedVariableToManyElementRelation & relation = subRegion.getToCellRelation(); - ToCellRelation< ArrayOfArrays< localIndex > > const tmp( relation.m_toElementSubRegion, - relation.m_toElementIndex ); - meshMapUtilities::transformCellBlockToRegionMap< parallelHostPolicy >( blockToSubRegion.toViewConst(), - tmp, - relation ); + if( auto * const faceElementSubRegion = dynamic_cast< FaceElementSubRegion * >( &surfaceSubRegion ) ) + { + FixedToManyElementRelation & relation = faceElementSubRegion->getToCellRelation(); + ToCellRelation< array2d< localIndex > > const tmp( relation.m_toElementSubRegion, + relation.m_toElementIndex ); + + meshMapUtilities::transformCellBlockToRegionMap< parallelHostPolicy >( blockToSubRegion.toViewConst(), + tmp, + relation ); + } + else if( auto * const embeddedSurfaceSubRegion = dynamic_cast< EmbeddedSurfaceSubRegion * >( &surfaceSubRegion ) ) + { + OrderedVariableToManyElementRelation & relation = embeddedSurfaceSubRegion->getToCellRelation(); + ToCellRelation< ArrayOfArrays< localIndex > > const tmp( relation.m_toElementSubRegion, + relation.m_toElementIndex ); + meshMapUtilities::transformCellBlockToRegionMap< parallelHostPolicy >( blockToSubRegion.toViewConst(), + tmp, + relation ); + } } ); } diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp index 83f603d9992..ab0714cfc42 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp @@ -43,7 +43,8 @@ EmbeddedSurfaceSubRegion::EmbeddedSurfaceSubRegion( string const & name, SurfaceElementSubRegion( name, parent ), m_numOfJumpEnrichments( 3 ), m_connectivityIndex(), - m_parentPlaneName() + m_parentPlaneName(), + m_2dElemToElems() { m_elementType = ElementType::Polygon; @@ -63,10 +64,25 @@ EmbeddedSurfaceSubRegion::EmbeddedSurfaceSubRegion( string const & name, setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). setDescription( "A map of surface element to the parent fracture name" ); + registerWrapper( viewKeyStruct::surfaceElementsToCellRegionsString(), &m_2dElemToElems.m_toElementRegion ). + setPlotLevel( PlotLevel::NOPLOT ). + setDescription( "A map of face element local indices to the cell local indices" ); + + registerWrapper( viewKeyStruct::surfaceElementsToCellSubRegionsString(), &m_2dElemToElems.m_toElementSubRegion ). + setPlotLevel( PlotLevel::NOPLOT ). + setDescription( "A map of face element local indices to the cell local indices" ); + + registerWrapper( viewKeyStruct::surfaceElementsToCellIndexString(), &m_2dElemToElems.m_toElementIndex ). + setPlotLevel( PlotLevel::NOPLOT ). + setDescription( "A map of face element local indices to the cell local indices" ); + m_normalVector.resizeDimension< 1 >( 3 ); m_tangentVector1.resizeDimension< 1 >( 3 ); m_tangentVector2.resizeDimension< 1 >( 3 ); m_2dElemToElems.resize( 0, 1 ); + + m_2dElemToElems.setElementRegionManager( dynamicCast< ElementRegionManager & >( getParent().getParent().getParent().getParent() ) ); + } void EmbeddedSurfaceSubRegion::calculateElementGeometricQuantities( NodeManager const & GEOS_UNUSED_PARAM( nodeManager ), diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp index 311b8aec610..85dbf465049 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp @@ -232,6 +232,23 @@ class EmbeddedSurfaceSubRegion : public SurfaceElementSubRegion */ std::vector< struct surfaceWithGhostNodes > surfaceWithGhostNodes() { return m_surfaceWithGhostNodes; } + /** + * @brief Get the surface element to cells map. + * @return The surface element to cells map + */ + OrderedVariableToManyElementRelation & getToCellRelation() + { + return m_2dElemToElems; + } + + /** + * @copydoc getToCellRelation() + */ + OrderedVariableToManyElementRelation const & getToCellRelation() const + { + return m_2dElemToElems; + } + ///@} private: @@ -258,6 +275,10 @@ class EmbeddedSurfaceSubRegion : public SurfaceElementSubRegion /// Surfaces with ghost nodes std::vector< struct surfaceWithGhostNodes > m_surfaceWithGhostNodes; + + /// Map between the surface elements and the cells + OrderedVariableToManyElementRelation m_2dElemToElems; + }; diff --git a/src/coreComponents/mesh/FaceElementSubRegion.cpp b/src/coreComponents/mesh/FaceElementSubRegion.cpp index 31c0dcce7c0..7593d4004e4 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.cpp @@ -33,7 +33,8 @@ FaceElementSubRegion::FaceElementSubRegion( string const & name, m_unmappedGlobalIndicesInToEdges(), m_unmappedGlobalIndicesInToFaces(), m_newFaceElements(), - m_toFacesRelation() + m_toFacesRelation(), + m_2dElemToElems() { m_elementType = ElementType::Hexahedron; @@ -42,6 +43,7 @@ FaceElementSubRegion::FaceElementSubRegion( string const & name, registerWrapper( viewKeyStruct::detJString(), &m_detJ ).setSizedFromParent( 1 ).reference(); registerWrapper( viewKeyStruct::faceListString(), &m_toFacesRelation ). + setApplyDefaultValue( -1 ). setDescription( "Map to the faces attached to each FaceElement." ). reference().resize( 0, 2 ); @@ -65,6 +67,21 @@ FaceElementSubRegion::FaceElementSubRegion( string const & name, setDescription( "A map eventually containing all the collocated nodes." ). setSizedFromParent( 1 ); + registerWrapper( viewKeyStruct::surfaceElementsToCellRegionsString(), &m_2dElemToElems.m_toElementRegion ). + setApplyDefaultValue( -1 ). + setPlotLevel( PlotLevel::NOPLOT ). + setDescription( "A map of face element local indices to the cell local indices" ); + + registerWrapper( viewKeyStruct::surfaceElementsToCellSubRegionsString(), &m_2dElemToElems.m_toElementSubRegion ). + setApplyDefaultValue( -1 ). + setPlotLevel( PlotLevel::NOPLOT ). + setDescription( "A map of face element local indices to the cell local indices" ); + + registerWrapper( viewKeyStruct::surfaceElementsToCellIndexString(), &m_2dElemToElems.m_toElementIndex ). + setApplyDefaultValue( -1 ). + setPlotLevel( PlotLevel::NOPLOT ). + setDescription( "A map of face element local indices to the cell local indices" ); + #ifdef GEOS_USE_SEPARATION_COEFFICIENT registerWrapper( viewKeyStruct::separationCoeffString(), &m_separationCoefficient ). setApplyDefaultValue( 0.0 ). @@ -77,12 +94,16 @@ FaceElementSubRegion::FaceElementSubRegion( string const & name, m_2dElemToElems.resize( 0, 2 ); m_numNodesPerElement = 8; + + + m_2dElemToElems.setElementRegionManager( dynamicCast< ElementRegionManager & >( getParent().getParent().getParent().getParent() ) ); + } void FaceElementSubRegion::copyFromCellBlock( FaceBlockABC const & faceBlock ) { localIndex const num2dElements = faceBlock.num2dElements(); - resize( faceBlock.num2dElements() ); + resize( num2dElements ); m_toNodesRelation.base() = faceBlock.get2dElemToNodes(); m_toEdgesRelation.base() = faceBlock.get2dElemToEdges(); @@ -156,22 +177,26 @@ void FaceElementSubRegion::copyFromCellBlock( FaceBlockABC const & faceBlock ) // we store the cell block mapping at the sub region mapping location. // It will later be transformed into a sub regions mapping. // Last, we fill the regions mapping with dummy -1 values that should all be replaced eventually. - auto const elem2dToElems = faceBlock.get2dElemToElems(); - m_2dElemToElems.resize( num2dElements, 2 ); - for( int i = 0; i < num2dElements; ++i ) + auto const & elem2dToElems = faceBlock.get2dElemToElems(); + for( int kfe = 0; kfe < num2dElements; ++kfe ) { - for( localIndex const & j: elem2dToElems.toCellIndex[i] ) + for( localIndex k=0; k const & elem2dToFaces = faceBlock.get2dElemToFaces(); + + for( localIndex kfe = 0; kfe < num2dElements; ++kfe ) + { + for( localIndex kf=0; kf const sizes{ - elem2dToFaces[e2d].size(), - elem2dToElems3d.m_toElementRegion[e2d].size(), - elem2dToElems3d.m_toElementSubRegion[e2d].size(), - elem2dToElems3d.m_toElementIndex[e2d].size() - }; - - if( sizes.size() != 1 || sizes.find( 2 ) == sizes.cend() ) - { - continue; - } - - localIndex const f0 = elem2dToFaces[e2d][0]; - localIndex const er0 = elem2dToElems3d.m_toElementRegion[e2d][0]; - localIndex const esr0 = elem2dToElems3d.m_toElementSubRegion[e2d][0]; - localIndex const ei0 = elem2dToElems3d.m_toElementIndex[e2d][0]; - auto const & faces0 = elem2dToElems3d.getElementRegionManager()->getRegion( er0 ).getSubRegion< CellElementSubRegion >( esr0 ).faceList()[ei0]; - - localIndex const f1 = elem2dToFaces[e2d][1]; - localIndex const er1 = elem2dToElems3d.m_toElementRegion[e2d][1]; - localIndex const esr1 = elem2dToElems3d.m_toElementSubRegion[e2d][1]; - localIndex const ei1 = elem2dToElems3d.m_toElementIndex[e2d][1]; - auto const & faces1 = elem2dToElems3d.getElementRegionManager()->getRegion( er1 ).getSubRegion< CellElementSubRegion >( esr1 ).faceList()[ei1]; - - bool const match00 = std::find( faces0.begin(), faces0.end(), f0 ) != faces0.end(); - bool const match11 = std::find( faces1.begin(), faces1.end(), f1 ) != faces1.end(); - bool const match01 = std::find( faces0.begin(), faces0.end(), f1 ) != faces0.end(); - bool const match10 = std::find( faces1.begin(), faces1.end(), f0 ) != faces1.end(); - - bool const matchCrossed = !match00 && !match11 && match01 && match10; - bool const matchStraight = match00 && match11 && !match01 && !match10; - - if( matchCrossed ) - { - std::swap( elem2dToFaces[e2d][0], elem2dToFaces[e2d][1] ); - } - else if( !matchStraight ) + if( !( elem2dToFaces[e2d][0] == -1 || elem2dToFaces[e2d][1] == -1 || + elem2dToElems3d.m_toElementRegion[e2d][0] == -1 || elem2dToElems3d.m_toElementRegion[e2d][1] == -1 || + elem2dToElems3d.m_toElementSubRegion[e2d][0] == -1 || elem2dToElems3d.m_toElementSubRegion[e2d][1] == -1 || + elem2dToElems3d.m_toElementSubRegion[e2d][0] == -1 || elem2dToElems3d.m_toElementSubRegion[e2d][1] == -1 ) ) { - GEOS_ERROR( "Mapping neighbor inconsistency detected for fracture " << fractureName ); + localIndex const f0 = elem2dToFaces[e2d][0]; + localIndex const er0 = elem2dToElems3d.m_toElementRegion[e2d][0]; + localIndex const esr0 = elem2dToElems3d.m_toElementSubRegion[e2d][0]; + localIndex const ei0 = elem2dToElems3d.m_toElementIndex[e2d][0]; + auto const & faces0 = elem2dToElems3d.getElementRegionManager()->getRegion( er0 ).getSubRegion< CellElementSubRegion >( esr0 ).faceList()[ei0]; + + localIndex const f1 = elem2dToFaces[e2d][1]; + localIndex const er1 = elem2dToElems3d.m_toElementRegion[e2d][1]; + localIndex const esr1 = elem2dToElems3d.m_toElementSubRegion[e2d][1]; + localIndex const ei1 = elem2dToElems3d.m_toElementIndex[e2d][1]; + auto const & faces1 = elem2dToElems3d.getElementRegionManager()->getRegion( er1 ).getSubRegion< CellElementSubRegion >( esr1 ).faceList()[ei1]; + + bool const match00 = std::find( faces0.begin(), faces0.end(), f0 ) != faces0.end(); + bool const match11 = std::find( faces1.begin(), faces1.end(), f1 ) != faces1.end(); + bool const match01 = std::find( faces0.begin(), faces0.end(), f1 ) != faces0.end(); + bool const match10 = std::find( faces1.begin(), faces1.end(), f0 ) != faces1.end(); + + bool const matchCrossed = !match00 && !match11 && match01 && match10; + bool const matchStraight = match00 && match11 && !match01 && !match10; + + if( matchCrossed ) + { + std::swap( elem2dToFaces[e2d][0], elem2dToFaces[e2d][1] ); + } + else if( !matchStraight ) + { + GEOS_ERROR( "Mapping neighbor inconsistency detected for fracture " << fractureName ); + } } } } @@ -827,7 +846,7 @@ map< localIndex, localIndex > buildEdgesToFace2d( arrayView1d< localIndex const * Even if we should have a more explicit design, * the current function resets this implicit information in our mappings. */ -void fixNodesOrder( ArrayOfArraysView< localIndex const > const elem2dToFaces, +void fixNodesOrder( arrayView2d< localIndex const > const elem2dToFaces, ArrayOfArraysView< localIndex const > const facesToNodes, ArrayOfArrays< localIndex > & elem2dToNodes ) { @@ -837,9 +856,12 @@ void fixNodesOrder( ArrayOfArraysView< localIndex const > const elem2dToFaces, std::vector< localIndex > nodesOfFace; for( localIndex fi: elem2dToFaces[e2d] ) { - for( localIndex ni: facesToNodes[fi] ) + if( fi != -1 ) { - nodesOfFace.push_back( ni ); + for( localIndex ni: facesToNodes[fi] ) + { + nodesOfFace.push_back( ni ); + } } } elem2dToNodes.clearArray( e2d ); @@ -937,10 +959,6 @@ void FaceElementSubRegion::fixSecondaryMappings( NodeManager const & nodeManager // When there's neighbor missing, we search for a face that would lie on the collocated nodes of the fracture element. for( int e2d = 0; e2d < num2dElems; ++e2d ) { - if( m_2dElemToElems.m_toElementIndex.sizeOfArray( e2d ) >= 2 ) // All the neighbors are known. - { - continue; - } std::set< globalIndex > refNodes; if( m_toNodesRelation[e2d].size() != 0 ) @@ -977,12 +995,12 @@ void FaceElementSubRegion::fixSecondaryMappings( NodeManager const & nodeManager for( ElemPath const & path: match->second ) { // This `if` prevents from storing the same data twice. - if( m_2dElemToElems.m_toElementIndex.sizeOfArray( e2d ) == 0 || m_2dElemToElems.m_toElementIndex[e2d][0] != path.ei ) + if( m_2dElemToElems.m_toElementIndex.size( 1 ) == 0 || m_2dElemToElems.m_toElementIndex[e2d][0] != path.ei ) { - m_2dElemToElems.m_toElementRegion.emplaceBack( e2d, path.er ); - m_2dElemToElems.m_toElementSubRegion.emplaceBack( e2d, path.esr ); - m_2dElemToElems.m_toElementIndex.emplaceBack( e2d, path.ei ); - m_toFacesRelation.emplaceBack( e2d, path.face ); + m_2dElemToElems.m_toElementRegion( e2d, 1 ) = path.er; + m_2dElemToElems.m_toElementSubRegion( e2d, 1 ) = path.esr; + m_2dElemToElems.m_toElementIndex( e2d, 1 ) = path.ei; + m_toFacesRelation( e2d, 1 ) = path.face; for( localIndex const & n: path.nodes ) { auto currentNodes = m_toNodesRelation[e2d]; @@ -1001,7 +1019,7 @@ void FaceElementSubRegion::fixSecondaryMappings( NodeManager const & nodeManager std::vector< localIndex > isolatedFractureElements; for( int e2d = 0; e2d < num2dElems; ++e2d ) { - if( m_2dElemToElems.m_toElementIndex.sizeOfArray( e2d ) < 2 && m_ghostRank[e2d] < 0 ) + if( m_2dElemToElems.m_toElementIndex.size( 1 )< 2 && m_ghostRank[e2d] < 0 ) { isolatedFractureElements.push_back( e2d ); } @@ -1053,7 +1071,7 @@ std::set< std::set< globalIndex > > FaceElementSubRegion::getCollocatedNodes() c void FaceElementSubRegion::flipFaceMap( FaceManager & faceManager, ElementRegionManager const & elemManager ) { - ArrayOfArraysView< localIndex > const & elems2dToFaces = faceList().toView(); + arrayView2d< localIndex > const & elems2dToFaces = faceList().toView(); arrayView2d< localIndex const > const & faceToElementRegionIndex = faceManager.elementRegionList(); arrayView2d< localIndex const > const & faceToElementSubRegionIndex = faceManager.elementSubRegionList(); arrayView2d< localIndex const > const & faceToElementIndex = faceManager.elementList(); @@ -1063,28 +1081,26 @@ void FaceElementSubRegion::flipFaceMap( FaceManager & faceManager, forAll< parallelHostPolicy >( this->size(), [=]( localIndex const kfe ) { - if( elems2dToFaces.sizeOfArray( kfe ) != 2 ) + if( !( elems2dToFaces[kfe][0] == -1 || elems2dToFaces[kfe][1] == -1 ) ) { - return; - } - - localIndex & f0 = elems2dToFaces[kfe][0]; - localIndex & f1 = elems2dToFaces[kfe][1]; + localIndex & f0 = elems2dToFaces[kfe][0]; + localIndex & f1 = elems2dToFaces[kfe][1]; - localIndex const er0 = faceToElementRegionIndex[f0][0]; - localIndex const esr0 = faceToElementSubRegionIndex[f0][0]; - localIndex const ek0 = faceToElementIndex[f0][0]; + localIndex const er0 = faceToElementRegionIndex[f0][0]; + localIndex const esr0 = faceToElementSubRegionIndex[f0][0]; + localIndex const ek0 = faceToElementIndex[f0][0]; - localIndex const er1 = faceToElementRegionIndex[f1][0]; - localIndex const esr1 = faceToElementSubRegionIndex[f1][0]; - localIndex const ek1 = faceToElementIndex[f1][0]; + localIndex const er1 = faceToElementRegionIndex[f1][0]; + localIndex const esr1 = faceToElementSubRegionIndex[f1][0]; + localIndex const ek1 = faceToElementIndex[f1][0]; - globalIndex const globalIndexElem0 = cellElemGlobalIndex[er0][esr0][ek0]; - globalIndex const globalIndexElem1 = cellElemGlobalIndex[er1][esr1][ek1]; + globalIndex const globalIndexElem0 = cellElemGlobalIndex[er0][esr0][ek0]; + globalIndex const globalIndexElem1 = cellElemGlobalIndex[er1][esr1][ek1]; - if( globalIndexElem0 > globalIndexElem1 ) - { - std::swap( f0, f1 ); + if( globalIndexElem0 > globalIndexElem1 ) + { + std::swap( f0, f1 ); + } } } ); @@ -1093,7 +1109,7 @@ void FaceElementSubRegion::flipFaceMap( FaceManager & faceManager, void FaceElementSubRegion::fixNeighboringFacesNormals( FaceManager & faceManager, ElementRegionManager const & elemManager ) { - ArrayOfArraysView< localIndex > const & elems2dToFaces = faceList().toView(); + arrayView2d< localIndex > const & elems2dToFaces = faceList().toView(); arrayView2d< localIndex const > const & faceToElementRegionIndex = faceManager.elementRegionList(); arrayView2d< localIndex const > const & faceToElementSubRegionIndex = faceManager.elementSubRegionList(); arrayView2d< localIndex const > const & faceToElementIndex = faceManager.elementList(); @@ -1107,44 +1123,42 @@ void FaceElementSubRegion::fixNeighboringFacesNormals( FaceManager & faceManager arrayView2d< real64 > const faceNormal = faceManager.faceNormal(); forAll< parallelHostPolicy >( this->size(), [=, &faceToNodes]( localIndex const kfe ) { - if( elems2dToFaces.sizeOfArray( kfe ) != 2 ) + if( !( elems2dToFaces[kfe][0] == -1 || elems2dToFaces[kfe][1] == -1 ) ) { - return; - } + localIndex const f0 = elems2dToFaces[kfe][0]; + localIndex const f1 = elems2dToFaces[kfe][1]; - localIndex const f0 = elems2dToFaces[kfe][0]; - localIndex const f1 = elems2dToFaces[kfe][1]; + /// Note: I am assuming that the 0 element is the elementSubregion one for faces + /// touching both a 3D and a 2D cell. + localIndex const er0 = faceToElementRegionIndex[f0][0]; + localIndex const esr0 = faceToElementSubRegionIndex[f0][0]; + localIndex const ek0 = faceToElementIndex[f0][0]; - /// Note: I am assuming that the 0 element is the elementSubregion one for faces - /// touching both a 3D and a 2D cell. - localIndex const er0 = faceToElementRegionIndex[f0][0]; - localIndex const esr0 = faceToElementSubRegionIndex[f0][0]; - localIndex const ek0 = faceToElementIndex[f0][0]; + localIndex const er1 = faceToElementRegionIndex[f1][0]; + localIndex const esr1 = faceToElementSubRegionIndex[f1][0]; + localIndex const ek1 = faceToElementIndex[f1][0]; - localIndex const er1 = faceToElementRegionIndex[f1][0]; - localIndex const esr1 = faceToElementSubRegionIndex[f1][0]; - localIndex const ek1 = faceToElementIndex[f1][0]; + real64 f0e0vector[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceCenter[f0] ); + real64 f1e1vector[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceCenter[f1] ); - real64 f0e0vector[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceCenter[f0] ); - real64 f1e1vector[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( faceCenter[f1] ); + LvArray::tensorOps::subtract< 3 >( f0e0vector, elemCenter[er0][esr0][ek0] ); + LvArray::tensorOps::subtract< 3 >( f1e1vector, elemCenter[er1][esr1][ek1] ); - LvArray::tensorOps::subtract< 3 >( f0e0vector, elemCenter[er0][esr0][ek0] ); - LvArray::tensorOps::subtract< 3 >( f1e1vector, elemCenter[er1][esr1][ek1] ); - - // If the vector connecting the face center and the elem center is in the same - // direction as the unit normal, we flip the normal coz it should be pointing outward - // (i.e., towards the fracture element). - if( LvArray::tensorOps::AiBi< 3 >( faceNormal[f0], f0e0vector ) < 0.0 ) - { - GEOS_WARNING( GEOS_FMT( "For fracture element {}, I had to flip the normal nf0 of face {}", kfe, f0 ) ); - LvArray::tensorOps::scale< 3 >( faceNormal[f0], -1.0 ); - std::reverse( faceToNodes[f0].begin(), faceToNodes[f0].end() ); - } - if( LvArray::tensorOps::AiBi< 3 >( faceNormal[f1], f1e1vector ) < 0.0 ) - { - GEOS_WARNING( GEOS_FMT( "For fracture element {}, I had to flip the normal nf1 of face {}", kfe, f1 ) ); - LvArray::tensorOps::scale< 3 >( faceNormal[f1], -1.0 ); - std::reverse( faceToNodes[f1].begin(), faceToNodes[f1].end() ); + // If the vector connecting the face center and the elem center is in the same + // direction as the unit normal, we flip the normal coz it should be pointing outward + // (i.e., towards the fracture element). + if( LvArray::tensorOps::AiBi< 3 >( faceNormal[f0], f0e0vector ) < 0.0 ) + { + GEOS_WARNING( GEOS_FMT( "For fracture element {}, I had to flip the normal nf0 of face {}", kfe, f0 ) ); + LvArray::tensorOps::scale< 3 >( faceNormal[f0], -1.0 ); + std::reverse( faceToNodes[f0].begin(), faceToNodes[f0].end() ); + } + if( LvArray::tensorOps::AiBi< 3 >( faceNormal[f1], f1e1vector ) < 0.0 ) + { + GEOS_WARNING( GEOS_FMT( "For fracture element {}, I had to flip the normal nf1 of face {}", kfe, f1 ) ); + LvArray::tensorOps::scale< 3 >( faceNormal[f1], -1.0 ); + std::reverse( faceToNodes[f1].begin(), faceToNodes[f1].end() ); + } } } ); diff --git a/src/coreComponents/mesh/FaceElementSubRegion.hpp b/src/coreComponents/mesh/FaceElementSubRegion.hpp index 88edf84dec2..5f9546f5160 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.hpp @@ -39,7 +39,7 @@ class FaceElementSubRegion : public SurfaceElementSubRegion public: /// Face element to faces map type - using FaceMapType = InterObjectRelation< ArrayOfArrays< localIndex > >; + using FaceMapType = FixedOneToManyRelation; /** * @name Static factory catalog functions @@ -311,6 +311,23 @@ class FaceElementSubRegion : public SurfaceElementSubRegion return m_2dElemToCollocatedNodesBuckets.toViewConst(); } + /** + * @brief Get the surface element to cells map. + * @return The surface element to cells map + */ + FixedToManyElementRelation & getToCellRelation() + { + return m_2dElemToElems; + } + + /** + * @copydoc getToCellRelation() + */ + FixedToManyElementRelation const & getToCellRelation() const + { + return m_2dElemToElems; + } + private: /** @@ -339,6 +356,9 @@ class FaceElementSubRegion : public SurfaceElementSubRegion */ ArrayOfArrays< array1d< globalIndex > > m_2dElemToCollocatedNodesBuckets; + /// Map between the surface elements and the cells + FixedToManyElementRelation m_2dElemToElems; + #ifdef GEOS_USE_SEPARATION_COEFFICIENT /// Separation coefficient array1d< real64 > m_separationCoefficient; diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index b5924f7fde4..57db3425c2d 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -22,6 +22,7 @@ #include "common/GEOS_RAJA_Interface.hpp" #include "common/logger/Logger.hpp" #include "common/TimingMacros.hpp" +#include "common/MpiWrapper.hpp" #include "LvArray/src/tensorOps.hpp" #include "mesh/BufferOps.hpp" #include "mesh/ElementRegionManager.hpp" @@ -123,17 +124,18 @@ void FaceManager::setDomainBoundaryObjects( ElementRegionManager const & elemReg } FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); - ArrayOfArraysView< localIndex const > const elem2dToFaces = subRegion.faceList().toViewConst(); - for( int ei = 0; ei < elem2dToFaces.size(); ++ei ) + arrayView2d< localIndex const > const elem2dToFaces = subRegion.faceList().toViewConst(); + for( int ei = 0; ei < elem2dToFaces.size( 0 ); ++ei ) { - if( elem2dToFaces.sizeOfArray( ei ) == 2 ) + if( elem2dToFaces[ei][0] == -1 || elem2dToFaces[ei][1] == -1 ) { - continue; - } - - for( localIndex const & face: elem2dToFaces[ei] ) - { - isFaceOnDomainBoundary[face] = 1; + for( localIndex const & face: elem2dToFaces[ei] ) + { + if( face != -1 ) + { + isFaceOnDomainBoundary[face] = 1; + } + } } } }; @@ -179,22 +181,25 @@ void FaceManager::setGeometricalRelations( CellBlockManagerABC const & cellBlock // The fracture subregion knows the faces it's connected to. // And since a 2d element is connected to a given face, and since a face can only have 2 neighbors, // then the second neighbor of the face is bound to be undefined (i.e. -1). - ArrayOfArraysView< localIndex const > const & elem2dToFaces = subRegion.faceList().toViewConst(); - for( localIndex ei = 0; ei < elem2dToFaces.size(); ++ei ) + arrayView2d< localIndex const > const & elem2dToFaces = subRegion.faceList().toViewConst(); + for( localIndex ei = 0; ei < elem2dToFaces.size( 0 ); ++ei ) { - for( localIndex const & face: elem2dToFaces[ei] ) + for( localIndex const & faceIndex: elem2dToFaces[ei] ) { - GEOS_ERROR_IF_EQ_MSG( m_toElements.m_toElementRegion( face, 0 ), -1, GEOS_FMT( err, face ) ); - GEOS_ERROR_IF_EQ_MSG( m_toElements.m_toElementSubRegion( face, 0 ), -1, GEOS_FMT( err, face ) ); - GEOS_ERROR_IF_EQ_MSG( m_toElements.m_toElementIndex( face, 0 ), -1, GEOS_FMT( err, face ) ); + if( faceIndex != -1 ) + { + GEOS_ERROR_IF_EQ_MSG( m_toElements.m_toElementRegion( faceIndex, 0 ), -1, GEOS_FMT( err, faceIndex ) ); + GEOS_ERROR_IF_EQ_MSG( m_toElements.m_toElementSubRegion( faceIndex, 0 ), -1, GEOS_FMT( err, faceIndex ) ); + GEOS_ERROR_IF_EQ_MSG( m_toElements.m_toElementIndex( faceIndex, 0 ), -1, GEOS_FMT( err, faceIndex ) ); - GEOS_ERROR_IF_NE_MSG( m_toElements.m_toElementRegion( face, 1 ), -1, GEOS_FMT( err, face ) ); - GEOS_ERROR_IF_NE_MSG( m_toElements.m_toElementSubRegion( face, 1 ), -1, GEOS_FMT( err, face ) ); - GEOS_ERROR_IF_NE_MSG( m_toElements.m_toElementIndex( face, 1 ), -1, GEOS_FMT( err, face ) ); + GEOS_ERROR_IF_NE_MSG( m_toElements.m_toElementRegion( faceIndex, 1 ), -1, GEOS_FMT( err, faceIndex ) ); + GEOS_ERROR_IF_NE_MSG( m_toElements.m_toElementSubRegion( faceIndex, 1 ), -1, GEOS_FMT( err, faceIndex ) ); + GEOS_ERROR_IF_NE_MSG( m_toElements.m_toElementIndex( faceIndex, 1 ), -1, GEOS_FMT( err, faceIndex ) ); - m_toElements.m_toElementRegion( face, 1 ) = er; - m_toElements.m_toElementSubRegion( face, 1 ) = esr; - m_toElements.m_toElementIndex( face, 1 ) = ei; + m_toElements.m_toElementRegion( faceIndex, 1 ) = er; + m_toElements.m_toElementSubRegion( faceIndex, 1 ) = esr; + m_toElements.m_toElementIndex( faceIndex, 1 ) = ei; + } } } }; diff --git a/src/coreComponents/mesh/MeshLevel.cpp b/src/coreComponents/mesh/MeshLevel.cpp index fe3c98b6eca..626f88f2af6 100644 --- a/src/coreComponents/mesh/MeshLevel.cpp +++ b/src/coreComponents/mesh/MeshLevel.cpp @@ -339,7 +339,7 @@ void MeshLevel::generateAdjacencyLists( arrayView1d< localIndex const > const & { ArrayOfArraysView< localIndex const > const elems2dToNodes = subRegion.nodeList().toViewConst(); ArrayOfArraysView< localIndex const > const elem2dToEdges = subRegion.edgeList().toViewConst(); - ArrayOfArraysView< localIndex const > const elems2dToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elems2dToFaces = subRegion.faceList().toViewConst(); for( localIndex const ei: elementAdjacencySet[er][esr] ) { @@ -353,7 +353,10 @@ void MeshLevel::generateAdjacencyLists( arrayView1d< localIndex const > const & } for( localIndex const & fi: elems2dToFaces[ei] ) { - faceAdjacencySet.insert( fi ); + if( fi != -1 ) + { + faceAdjacencySet.insert( fi ); + } } } }; diff --git a/src/coreComponents/mesh/ObjectManagerBase.hpp b/src/coreComponents/mesh/ObjectManagerBase.hpp index 1cc67026b84..0ba8692e3c5 100644 --- a/src/coreComponents/mesh/ObjectManagerBase.hpp +++ b/src/coreComponents/mesh/ObjectManagerBase.hpp @@ -1001,7 +1001,10 @@ void ObjectManagerBase::fixUpDownMaps( TYPE_RELATION & relation, allValuesMapped = false; } } - GEOS_ERROR_IF( relation[li][a] == unmappedLocalIndexValue, "Index not set" ); + // temporarily disabled this check to allow for the case where the index is not set + // this entire fixUpDownMaps will be removed in a future PR as the unpacking is modified + // s.t. there are no invalid unpacked values that are not expected. + //GEOS_ERROR_IF( relation[li][a] == unmappedLocalIndexValue, "Index not set" ); } } GEOS_ERROR_IF( !allValuesMapped, "some values of unmappedIndices were not used" ); diff --git a/src/coreComponents/mesh/SurfaceElementRegion.cpp b/src/coreComponents/mesh/SurfaceElementRegion.cpp index 78233703bd1..0734ee3a06e 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.cpp @@ -20,6 +20,7 @@ #include "MeshFields.hpp" #include "EdgeManager.hpp" #include "SurfaceElementRegion.hpp" +#include "common/MpiWrapper.hpp" namespace geos @@ -124,7 +125,6 @@ localIndex SurfaceElementRegion::addToFractureMesh( real64 const time_np1, LvArray::tensorOps::copy< 3 >( elemCenter[ kfe ], faceCenter[ faceIndices[ 0 ] ] ); - faceMap.resizeArray( kfe, 2 ); faceMap[kfe][0] = faceIndices[0]; faceMap[kfe][1] = faceIndices[1]; @@ -168,19 +168,20 @@ localIndex SurfaceElementRegion::addToFractureMesh( real64 const time_np1, } // Add the cell region/subregion/index to the faceElementToCells map - OrderedVariableToManyElementRelation & faceElementsToCells = subRegion.getToCellRelation(); + FixedToManyElementRelation & faceElementsToCells = subRegion.getToCellRelation(); for( localIndex ke = 0; ke < 2; ++ke ) { + localIndex const er = faceToElementRegion[faceIndices[ke]][ke]; localIndex const esr = faceToElementSubRegion[faceIndices[ke]][ke]; localIndex const ei = faceToElementIndex[faceIndices[ke]][ke]; if( er != -1 && esr != -1 && ei != -1 ) { - faceElementsToCells.m_toElementRegion.emplaceBack( kfe, er ); - faceElementsToCells.m_toElementSubRegion.emplaceBack( kfe, esr ); - faceElementsToCells.m_toElementIndex.emplaceBack( kfe, ei ); + faceElementsToCells.m_toElementRegion[kfe][ke] = er; + faceElementsToCells.m_toElementSubRegion[kfe][ke] = esr; + faceElementsToCells.m_toElementIndex[kfe][ke] = ei; } } @@ -214,7 +215,7 @@ localIndex SurfaceElementRegion::addToFractureMesh( real64 const time_np1, { SortedArrayView< localIndex const > const & faceSet = faceManager->sets().getReference< SortedArray< localIndex > >( setIter.first ); SortedArray< localIndex > & faceElementSet = subRegion.sets().registerWrapper< SortedArray< localIndex > >( setIter.first ).reference(); - for( localIndex a = 0; a < faceMap.size(); ++a ) + for( localIndex a = 0; a < faceMap.size( 0 ); ++a ) { if( faceSet.count( faceMap[a][0] ) ) { diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp index d763dfe41ba..9f946de082f 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp @@ -31,7 +31,6 @@ using namespace dataRepository; SurfaceElementSubRegion::SurfaceElementSubRegion( string const & name, dataRepository::Group * const parent ): ElementSubRegionBase( name, parent ), - m_2dElemToElems(), m_unmappedGlobalIndicesInToNodes(), m_toNodesRelation(), m_toEdgesRelation(), @@ -47,18 +46,6 @@ SurfaceElementSubRegion::SurfaceElementSubRegion( string const & name, registerWrapper( viewKeyStruct::edgeListString(), &m_toEdgesRelation ). setDescription( "Map to the edges attached to each SurfaceElement." ); - registerWrapper( viewKeyStruct::surfaceElementsToCellRegionsString(), &m_2dElemToElems.m_toElementRegion ). - setPlotLevel( PlotLevel::NOPLOT ). - setDescription( "A map of face element local indices to the cell local indices" ); - - registerWrapper( viewKeyStruct::surfaceElementsToCellSubRegionsString(), &m_2dElemToElems.m_toElementSubRegion ). - setPlotLevel( PlotLevel::NOPLOT ). - setDescription( "A map of face element local indices to the cell local indices" ); - - registerWrapper( viewKeyStruct::surfaceElementsToCellIndexString(), &m_2dElemToElems.m_toElementIndex ). - setPlotLevel( PlotLevel::NOPLOT ). - setDescription( "A map of face element local indices to the cell local indices" ); - registerField( fields::elementAperture{}, &m_elementAperture ); registerField( fields::elementArea{}, &m_elementArea ); @@ -78,8 +65,6 @@ SurfaceElementSubRegion::SurfaceElementSubRegion( string const & name, viewKeyStruct::surfaceElementsToCellSubRegionsString(), viewKeyStruct::surfaceElementsToCellIndexString() } ); - // TODO there has to be a cleaner way than this. - m_2dElemToElems.setElementRegionManager( dynamicCast< ElementRegionManager & >( getParent().getParent().getParent().getParent() ) ); } diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp index 0860c98d574..0ec1adba3a2 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp @@ -154,23 +154,6 @@ class SurfaceElementSubRegion : public ElementSubRegionBase localIndex numNodesPerElement( localIndex const k ) const final { return m_toNodesRelation[k].size(); } - /** - * @brief Get the surface element to cells map. - * @return The surface element to cells map - */ - OrderedVariableToManyElementRelation & getToCellRelation() - { - return m_2dElemToElems; - } - - /** - * @copydoc getToCellRelation() - */ - OrderedVariableToManyElementRelation const & getToCellRelation() const - { - return m_2dElemToElems; - } - ///@} @@ -283,9 +266,6 @@ class SurfaceElementSubRegion : public ElementSubRegionBase protected: - /// Map between the surface elements and the cells - OrderedVariableToManyElementRelation m_2dElemToElems; - /// Unmapped surface elements to nodes map map< localIndex, array1d< globalIndex > > m_unmappedGlobalIndicesInToNodes; diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp index 466438795b6..852370c6371 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -233,7 +233,7 @@ void SolidMechanicsAugmentedLagrangianContact::implicitStepSetup( real64 const & FaceElementSubRegion & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); arrayView2d< real64 > const incrBubbleDisp = faceManager.getField< fields::solidMechanics::incrementalBubbleDisplacement >(); @@ -581,7 +581,7 @@ real64 SolidMechanicsAugmentedLagrangianContact::calculateResidualNorm( real64 c arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); arrayView1d< globalIndex const > const bubbleDofNumber = faceManager.getReference< globalIndex_array >( bubbleDofKey ); @@ -1195,7 +1195,7 @@ void SolidMechanicsAugmentedLagrangianContact::createBubbleCellList( DomainParti arrayView1d< localIndex > const tmpSpace_v = tmpSpace.toView(); // Store indexes of faces in the temporany array. { - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); forAll< parallelDevicePolicy<> >( subRegion.size(), [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) { @@ -1369,7 +1369,7 @@ void SolidMechanicsAugmentedLagrangianContact::addCouplingNumNonzeros( DomainPar SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); for( localIndex kfe=0; kfe( getUniqueFractureRegionName() ); FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); static constexpr int maxNumDispFaceDof = 3 * 4; @@ -1606,7 +1606,7 @@ void SolidMechanicsAugmentedLagrangianContact::computeTolerances( DomainPartitio { arrayView1d< real64 const > const faceArea = subRegion.getElementArea().toViewConst(); arrayView3d< real64 const > const faceRotationMatrix = subRegion.getField< fields::contact::rotationMatrix >().toView(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); arrayView1d< real64 > const normalTractionTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ); @@ -1635,7 +1635,7 @@ void SolidMechanicsAugmentedLagrangianContact::computeTolerances( DomainPartitio real64 averageConstrainedModulus = 0.0; real64 averageBoxSize0 = 0.0; - for( localIndex i = 0; i < elemsToFaces.sizeOfArray( kfe ); ++i ) + for( localIndex i = 0; i < 2; ++i ) { localIndex const faceIndex = elemsToFaces[kfe][i]; localIndex const er = faceToElemRegion[faceIndex][0]; diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 3c1537f9c8f..bcde95cdb7a 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -303,7 +303,7 @@ void SolidMechanicsLagrangeContact::computeTolerances( DomainPartition & domain arrayView1d< integer const > const & ghostRank = subRegion.ghostRank(); arrayView1d< real64 const > const & faceArea = subRegion.getElementArea().toViewConst(); arrayView3d< real64 const > const & faceRotationMatrix = subRegion.getReference< array3d< real64 > >( viewKeyStruct::rotationMatrixString() ); - ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); arrayView1d< real64 > const & normalTractionTolerance = subRegion.getReference< array1d< real64 > >( viewKeyStruct::normalTractionToleranceString() ); @@ -333,7 +333,7 @@ void SolidMechanicsLagrangeContact::computeTolerances( DomainPartition & domain real64 averageConstrainedModulus = 0.0; real64 averageBoxSize0 = 0.0; - for( localIndex i = 0; i < elemsToFaces.sizeOfArray( kfe ); ++i ) + for( localIndex i = 0; i < 2; ++i ) { localIndex const faceIndex = elemsToFaces[kfe][i]; localIndex const er = faceToElemRegion[faceIndex][0]; @@ -501,7 +501,7 @@ void SolidMechanicsLagrangeContact::computeFaceDisplacementJump( DomainPartition { arrayView3d< real64 > const & rotationMatrix = subRegion.getReference< array3d< real64 > >( viewKeyStruct::rotationMatrixString() ); - ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); arrayView1d< real64 const > const & area = subRegion.getElementArea().toViewConst(); arrayView2d< real64 > const dispJump = subRegion.getField< contact::dispJump >(); @@ -510,10 +510,6 @@ void SolidMechanicsLagrangeContact::computeFaceDisplacementJump( DomainPartition forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { - if( elemsToFaces.sizeOfArray( kfe ) != 2 ) - { - return; - } // Contact constraints localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elemsToFaces[kfe][0] ); @@ -690,7 +686,7 @@ void SolidMechanicsLagrangeContact:: FaceElementSubRegion const & subRegion ) { arrayView1d< real64 const > const & pressure = subRegion.getReference< array1d< real64 > >( flow::pressure::key() ); - ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); forAll< serialPolicy >( subRegion.size(), [=]( localIndex const kfe ) { @@ -947,7 +943,7 @@ void SolidMechanicsLagrangeContact::computeRotationMatrices( DomainPartition & d [&]( localIndex const, FaceElementSubRegion & subRegion ) { - ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); arrayView3d< real64 > const & rotationMatrix = subRegion.getReference< array3d< real64 > >( viewKeyStruct::rotationMatrixString() ); @@ -957,10 +953,7 @@ void SolidMechanicsLagrangeContact::computeRotationMatrices( DomainPartition & d forAll< parallelHostPolicy >( subRegion.size(), [=]( localIndex const kfe ) { - if( elemsToFaces.sizeOfArray( kfe ) != 2 ) - { - return; - } + localIndex const f0 = elemsToFaces[kfe][0]; localIndex const f1 = elemsToFaces[kfe][1]; @@ -1348,14 +1341,11 @@ void SolidMechanicsLagrangeContact:: arrayView1d< globalIndex const > const & tracDofNumber = subRegion.getReference< globalIndex_array >( tracDofKey ); arrayView2d< real64 const > const & traction = subRegion.getReference< array2d< real64 > >( contact::traction::key() ); arrayView3d< real64 const > const & rotationMatrix = subRegion.getReference< array3d< real64 > >( viewKeyStruct::rotationMatrixString() ); - ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { - if( elemsToFaces.sizeOfArray( kfe ) != 2 ) - { - return; - } + localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elemsToFaces[kfe][0] ); globalIndex rowDOF[3 * m_maxFaceNodes]; // this needs to be changed when dealing with arbitrary element types @@ -1469,7 +1459,7 @@ void SolidMechanicsLagrangeContact:: arrayView1d< real64 const > const & area = subRegion.getElementArea(); arrayView3d< real64 const > const & rotationMatrix = subRegion.getReference< array3d< real64 > >( viewKeyStruct::rotationMatrixString() ); - ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); arrayView2d< real64 const > const & traction = subRegion.getField< contact::traction >(); arrayView1d< integer const > const & fractureState = subRegion.getField< contact::fractureState >(); arrayView2d< real64 const > const & dispJump = subRegion.getField< contact::dispJump >(); @@ -1483,10 +1473,7 @@ void SolidMechanicsLagrangeContact:: forAll< parallelHostPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { - if( elemsToFaces.sizeOfArray( kfe ) != 2 ) - { - return; - } + if( ghostRank[kfe] < 0 ) { @@ -1728,7 +1715,7 @@ void SolidMechanicsLagrangeContact::assembleStabilization( MeshLevel const & mes FaceElementSubRegion const & fractureSubRegion = fractureRegion.getUniqueSubRegion< FaceElementSubRegion >(); GEOS_ERROR_IF( !fractureSubRegion.hasField< contact::traction >(), "The fracture subregion must contain traction field." ); - ArrayOfArraysView< localIndex const > const elem2dToFaces = fractureSubRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elem2dToFaces = fractureSubRegion.faceList().toViewConst(); // Get the state of fracture elements arrayView1d< integer const > const & fractureState = diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp index 88f575a8c88..086139a90f3 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp @@ -265,7 +265,7 @@ void SolidMechanicsLagrangeContactBubbleStab::computeRotationMatrices( DomainPar FaceElementSubRegion & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); arrayView2d< real64 > const incrBubbleDisp = faceManager.getField< fields::solidMechanics::incrementalBubbleDisplacement >(); @@ -686,7 +686,7 @@ void SolidMechanicsLagrangeContactBubbleStab::addCouplingNumNonzeros( DomainPart SurfaceElementRegion const & region = elemManager.getRegion< SurfaceElementRegion >( getUniqueFractureRegionName() ); FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); for( localIndex kfe=0; kfe( getUniqueFractureRegionName() ); FaceElementSubRegion const & subRegion = region.getUniqueSubRegion< FaceElementSubRegion >(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); static constexpr int maxNumDispFaceDof = 3 * 4; @@ -1067,7 +1067,7 @@ void SolidMechanicsLagrangeContactBubbleStab::createBubbleCellList( DomainPartit arrayView1d< localIndex > const tmpSpace_v = tmpSpace.toView(); // Store indexes of faces in the temporany array. { - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); forAll< parallelDevicePolicy<> >( subRegion.size(), [ = ] GEOS_HOST_DEVICE ( localIndex const kfe ) { diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp index 167c23fd1b9..c1c3ec434d7 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp @@ -159,7 +159,7 @@ void SolidMechanicsPenaltyContact::assembleContact( DomainPartition & domain, real64 const contactStiffness = m_contactPenaltyStiffness; arrayView1d< real64 > const area = subRegion.getElementArea(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); // TODO: use parallel policy? forAll< serialPolicy >( subRegion.size(), [=] ( localIndex const kfe ) diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp index 28079e6fc51..495e4fa677b 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp @@ -244,7 +244,7 @@ class ConformingContactKernelsBase : ArrayOfArraysView< localIndex const > const m_faceToNodes; /// The array of array containing the element to face map. - ArrayOfArraysView< localIndex const > const m_elemsToFaces; + arrayView2d< localIndex const > const m_elemsToFaces; /// The array containing the list of face element of the same type. arrayView1d< localIndex const > const m_faceElementList; @@ -281,7 +281,7 @@ struct ComputeRotationMatricesKernel static void launch( localIndex const size, arrayView2d< real64 const > const & faceNormal, - ArrayOfArraysView< localIndex const > const & elemsToFaces, + arrayView2d< localIndex const > const & elemsToFaces, arrayView3d< real64 > const & rotationMatrix, arrayView2d< real64 > const & unitNormal, arrayView2d< real64 > const & unitTangent1, diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 61529778ea6..fc1e3798cd4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -292,7 +292,7 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::updateHydraulicApertureAndFrac arrayView1d< real64 const > const volume = subRegion.getElementVolume(); arrayView1d< real64 > const deltaVolume = subRegion.getField< flow::deltaVolume >(); arrayView1d< real64 const > const area = subRegion.getElementArea(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); string const porousSolidName = subRegion.template getReference< string >( FlowSolverBase::viewKeyStruct::solidNamesString() ); CoupledSolidBase const & porousSolid = subRegion.template getConstitutiveModel< CoupledSolidBase >( porousSolidName ); @@ -706,16 +706,12 @@ assembleForceResidualDerivativeWrtPressure( DomainPartition & domain, { arrayView1d< real64 const > const & fluidPressure = subRegion.getField< flow::pressure >(); arrayView1d< real64 const > const & area = subRegion.getElementArea(); - ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); // if matching on lassen/crusher, move to device policy using execPolicy = serialPolicy; forAll< execPolicy >( subRegion.size(), [=] ( localIndex const kfe ) { - if( elemsToFaces.sizeOfArray( kfe ) != 2 ) - { - return; - } constexpr int kfSign[2] = { -1, 1 }; @@ -819,7 +815,7 @@ assembleFluidMassResidualDerivativeWrtDisplacement( DomainPartition const & doma arrayView1d< real64 const > const aperture = subRegion.getElementAperture(); arrayView1d< real64 const > const area = subRegion.getElementArea(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); ArrayOfArraysView< localIndex const > const faceToNodeMap = faceManager.nodeList().toViewConst(); arrayView2d< real64 const > const faceNormal = faceManager.faceNormal(); @@ -1024,7 +1020,7 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::initializeNewFractureFields( D ArrayOfArraysView< localIndex const > const & fractureConnectorsToFaceElements = subRegion.m_2dFaceTo2dElems.toViewConst(); map< localIndex, localIndex > const & edgesToConnectorEdges = subRegion.m_edgesTo2dFaces; - ArrayOfArraysView< localIndex const > const faceMap = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const faceMap = subRegion.faceList().toViewConst(); arrayView1d< real64 > const fluidPressure_n = subRegion.getField< fields::flow::pressure_n >(); arrayView1d< real64 > const fluidPressure = subRegion.getField< fields::flow::pressure >(); diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp index 18416ef2083..41f959bf396 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp @@ -40,7 +40,7 @@ struct DeformationUpdateKernel arrayView2d< real64 const, nodes::TOTAL_DISPLACEMENT_USD > const & u, arrayView2d< real64 const > const & faceNormal, ArrayOfArraysView< localIndex const > const & faceToNodeMap, - ArrayOfArraysView< localIndex const > const & elemsToFaces, + arrayView2d< localIndex const > const & elemsToFaces, arrayView1d< real64 const > const & area, arrayView1d< real64 const > const & volume, arrayView1d< real64 > const & deltaVolume, @@ -66,8 +66,6 @@ struct DeformationUpdateKernel forAll< POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const kfe ) mutable { - if( elemsToFaces.sizeOfArray( kfe ) != 2 ) - { return; } localIndex const kf0 = elemsToFaces[kfe][0]; localIndex const kf1 = elemsToFaces[kfe][1]; @@ -184,7 +182,7 @@ struct FluidMassResidualDerivativeAssemblyKernel localIndex const numNodesPerFace, arraySlice1d< localIndex const > const & columns, arraySlice1d< real64 const > const & values, - ArrayOfArraysView< localIndex const > const elemsToFaces, + arrayView2d< localIndex const > const elemsToFaces, ArrayOfArraysView< localIndex const > const faceToNodeMap, arrayView1d< globalIndex const > const dispDofNumber, real64 const (&Nbar)[ 3 ], @@ -218,7 +216,7 @@ struct FluidMassResidualDerivativeAssemblyKernel globalIndex const rankOffset, HYDRAULICAPERTURE_WRAPPER const & hydraulicApertureWrapper, integer const useQuasiNewton, - ArrayOfArraysView< localIndex const > const elemsToFaces, + arrayView2d< localIndex const > const elemsToFaces, ArrayOfArraysView< localIndex const > const faceToNodeMap, arrayView2d< real64 const > const faceNormal, arrayView1d< real64 const > const area, diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index a2a258ac5bc..bf257cda107 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -377,15 +377,13 @@ addTransmissibilityCouplingPattern( DomainPartition const & domain, GEOS_ERROR_IF( !fractureSubRegion.hasWrapper( flow::pressure::key() ), this->getDataContext() << ": The fracture subregion must contain pressure field." ); - ArrayOfArraysView< localIndex const > const elem2dToFaces = fractureSubRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elem2dToFaces = fractureSubRegion.faceList().toViewConst(); arrayView1d< globalIndex const > const & presDofNumber = fractureSubRegion.getReference< globalIndex_array >( presDofKey ); globalIndex const rankOffset = dofManager.rankOffset(); - ArrayOfArraysView< localIndex const > const & elemsToFaces = fractureSubRegion.faceList().toViewConst(); - fvDiscretization.forStencils< SurfaceElementStencil >( mesh, [&]( SurfaceElementStencil const & stencil ) { forAll< serialPolicy >( stencil.size(), [=] ( localIndex const iconn ) @@ -412,11 +410,9 @@ addTransmissibilityCouplingPattern( DomainPartition const & domain, localIndex const fractureIndex = sei[iconn][kf]; // Get the number of nodes - localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elemsToFaces[fractureIndex][0] ); + localIndex const numNodesPerFace = faceToNodeMap.sizeOfArray( elem2dToFaces[fractureIndex][0] ); // Loop over the two sides of each fracture element - GEOS_ERROR_IF( elem2dToFaces.sizeOfArray( fractureIndex ) != 2, - "Fracture face " << fractureIndex << " has to be shared by two cells." ); for( localIndex kf1 = 0; kf1 < 2; ++kf1 ) { localIndex const faceIndex = elem2dToFaces[fractureIndex][kf1]; @@ -478,7 +474,7 @@ assembleForceResidualDerivativeWrtPressure( MeshLevel const & mesh, arrayView1d< globalIndex const > const & presDofNumber = subRegion.getReference< globalIndex_array >( presDofKey ); arrayView1d< real64 const > const & pressure = subRegion.getReference< array1d< real64 > >( flow::pressure::key() ); - ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); forAll< serialPolicy >( subRegion.size(), [=]( localIndex const kfe ) { @@ -592,7 +588,7 @@ assembleFluidMassResidualDerivativeWrtDisplacement( MeshLevel const & mesh, arrayView1d< globalIndex const > const & presDofNumber = subRegion.getReference< array1d< globalIndex > >( presDofKey ); - ArrayOfArraysView< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const & elemsToFaces = subRegion.faceList().toViewConst(); arrayView1d< real64 const > const & area = subRegion.getElementArea().toViewConst(); arrayView1d< integer const > const & fractureState = subRegion.getField< fields::contact::fractureState >(); diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 17f7f3517f6..79230a70970 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -1388,7 +1388,7 @@ void SolidMechanicsLagrangianFEM::applyContactConstraint( DofManager const & dof real64 const contactStiffness = m_contactPenaltyStiffness; arrayView1d< real64 > const area = subRegion.getElementArea(); - ArrayOfArraysView< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const elemsToFaces = subRegion.faceList().toViewConst(); // TODO: use parallel policy? forAll< serialPolicy >( subRegion.size(), [=] ( localIndex const kfe ) diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp index 8cdac92ae68..1d1611346e9 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp @@ -507,7 +507,7 @@ void packNewModifiedObjectsToGhosts( NeighborCommunicator * const neighbor, elemRegion.forElementSubRegionsIndex< FaceElementSubRegion >( [&]( localIndex const esr, FaceElementSubRegion & subRegion ) { - ArrayOfArraysView< localIndex const > const faceList = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const faceList = subRegion.faceList().toViewConst(); localIndex_array & elemGhostsToSend = subRegion.getNeighborData( neighbor->neighborRank() ).ghostsToSend(); elemGhostsToSend.move( hostMemorySpace ); for( localIndex const & k : receivedObjects.newElements.at( {er, esr} ) ) diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index 26089417c74..1aedffecdb3 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -722,7 +722,7 @@ int SurfaceGenerator::separationDriver( DomainPartition & domain, elementManager.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) { FaceElementSubRegion::NodeMapType & nodeMap = subRegion.nodeList(); - ArrayOfArraysView< localIndex const > const faceMap = subRegion.faceList().toViewConst(); + arrayView2d< localIndex const > const faceMap = subRegion.faceList().toViewConst(); for( localIndex kfe=0; kfe Value of the Maximum Stable Timestep for this solver.--> - + From 89a606661fbef6aa72920943087e48400a90cedd Mon Sep 17 00:00:00 2001 From: Lionel Untereiner Date: Thu, 28 Nov 2024 01:03:13 +0100 Subject: [PATCH 261/286] feat: Add ExternalDataRepository (#2957) Co-authored-by: Pavel Tomin Co-authored-by: MelReyCG --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../FieldCaseTutorial3_composite_smoke.xml | 47 ++++ inputFiles/singlePhaseFlow/synthetic.vtpc | 17 ++ .../synthetic/synthetic_0_0.vtu | 23 ++ .../synthetic/synthetic_1_0.vtu | 23 ++ .../synthetic/synthetic_2_0.vtu | 23 ++ .../fileIO/vtk/VTKPolyDataWriterInterface.cpp | 3 - .../fileIO/vtk/VTKPolyDataWriterInterface.hpp | 11 +- .../mainInterface/ProblemManager.cpp | 3 + .../mainInterface/ProblemManager.hpp | 1 + src/coreComponents/mesh/CMakeLists.txt | 11 +- .../mesh/ExternalDataSourceBase.cpp | 54 +++++ .../mesh/ExternalDataSourceBase.hpp | 77 +++++++ .../mesh/ExternalDataSourceManager.cpp | 63 ++++++ .../mesh/ExternalDataSourceManager.hpp | 76 +++++++ src/coreComponents/mesh/MeshManager.cpp | 4 +- .../mesh/generators/InternalWellGenerator.cpp | 2 +- .../mesh/generators/MeshComponentBase.cpp | 39 ++++ .../mesh/generators/MeshComponentBase.hpp | 70 ++++++ .../mesh/generators/MeshGeneratorBase.cpp | 10 +- src/coreComponents/mesh/generators/Region.cpp | 46 ++++ src/coreComponents/mesh/generators/Region.hpp | 76 +++++++ .../generators/VTKHierarchicalDataSource.cpp | 72 ++++++ .../generators/VTKHierarchicalDataSource.hpp | 93 ++++++++ .../mesh/generators/VTKMeshGenerator.cpp | 102 ++++++++- .../mesh/generators/VTKMeshGenerator.hpp | 34 ++- .../mesh/generators/VTKWellGenerator.cpp | 2 +- .../mesh/generators/WellGeneratorABC.hpp | 205 ------------------ .../mesh/generators/WellGeneratorBase.cpp | 10 +- .../mesh/generators/WellGeneratorBase.hpp | 62 +++--- src/coreComponents/schema/schema.xsd | 52 ++++- src/coreComponents/schema/schema.xsd.other | 15 ++ 33 files changed, 1050 insertions(+), 282 deletions(-) create mode 100644 inputFiles/singlePhaseFlow/FieldCaseTutorial3_composite_smoke.xml create mode 100644 inputFiles/singlePhaseFlow/synthetic.vtpc create mode 100644 inputFiles/singlePhaseFlow/synthetic/synthetic_0_0.vtu create mode 100644 inputFiles/singlePhaseFlow/synthetic/synthetic_1_0.vtu create mode 100644 inputFiles/singlePhaseFlow/synthetic/synthetic_2_0.vtu create mode 100644 src/coreComponents/mesh/ExternalDataSourceBase.cpp create mode 100644 src/coreComponents/mesh/ExternalDataSourceBase.hpp create mode 100644 src/coreComponents/mesh/ExternalDataSourceManager.cpp create mode 100644 src/coreComponents/mesh/ExternalDataSourceManager.hpp create mode 100644 src/coreComponents/mesh/generators/MeshComponentBase.cpp create mode 100644 src/coreComponents/mesh/generators/MeshComponentBase.hpp create mode 100644 src/coreComponents/mesh/generators/Region.cpp create mode 100644 src/coreComponents/mesh/generators/Region.hpp create mode 100644 src/coreComponents/mesh/generators/VTKHierarchicalDataSource.cpp create mode 100644 src/coreComponents/mesh/generators/VTKHierarchicalDataSource.hpp delete mode 100644 src/coreComponents/mesh/generators/WellGeneratorABC.hpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index b1fd9206047..2db739c29a8 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3448-8959-1ff97b3 + baseline: integratedTests/baseline_integratedTests-pr2957-9029-ff99ac0 allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 3fefeb622b4..6169d1bc987 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #2957 (2024-11-27) +===================== +Added ExternalDataRepository. + PR #3448 (2024-11-21) ===================== Switched the FaceElementSubRegion::m_toFacesRelation and FaceElementSubRegion::m_2dElemToElems back to array2d instead of ArrayOfArray. This results in a reordering m_toFacesRelation back to the "correct" assumed order of "original face first". This fixes a bug that failed to remove the CellStencil entry when a FaceElement splits two cells. diff --git a/inputFiles/singlePhaseFlow/FieldCaseTutorial3_composite_smoke.xml b/inputFiles/singlePhaseFlow/FieldCaseTutorial3_composite_smoke.xml new file mode 100644 index 00000000000..dd43e24c23a --- /dev/null +++ b/inputFiles/singlePhaseFlow/FieldCaseTutorial3_composite_smoke.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/inputFiles/singlePhaseFlow/synthetic.vtpc b/inputFiles/singlePhaseFlow/synthetic.vtpc new file mode 100644 index 00000000000..6fa5973442a --- /dev/null +++ b/inputFiles/singlePhaseFlow/synthetic.vtpc @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + PD94bWwgdmVyc2lvbj0iMS4wIj8+CjxSb290IHR5cGU9InZ0a0RhdGFBc3NlbWJseSIgdmVyc2lvbj0iMS4wIiBpZD0iMCIgdnRrX3R5cGU9IjM4IiB2dGtfY2F0ZWdvcnk9Inhmb3JtZWRfaGllcmFyY2h5IiBsYWJlbD0iZGF0YSI+CiAgPE1lc2ggaWQ9IjEiIGxhYmVsPSJTeW50aGV0aWNNZXNoIj4KICAgIDxSZWdpb24xIGlkPSIyIiBsYWJlbD0iUmVnaW9uMSIgbnVtYmVyX29mX3BhcnRpdGlvbnM9IjEiPgogICAgICA8ZGF0YXNldCBpZD0iMCIgLz4KICAgIDwvUmVnaW9uMT4KICAgIDxSZWdpb24yIGlkPSIzIiBsYWJlbD0iUmVnaW9uMiIgbnVtYmVyX29mX3BhcnRpdGlvbnM9IjEiPgogICAgICA8ZGF0YXNldCBpZD0iMSIgLz4KICAgIDwvUmVnaW9uMj4KICAgIDxSZWdpb24zIGlkPSI0IiBsYWJlbD0iUmVnaW9uMyIgbnVtYmVyX29mX3BhcnRpdGlvbnM9IjEiPgogICAgICA8ZGF0YXNldCBpZD0iMiIgLz4KICAgIDwvUmVnaW9uMz4KICA8L01lc2g+CjwvUm9vdD4K + + + diff --git a/inputFiles/singlePhaseFlow/synthetic/synthetic_0_0.vtu b/inputFiles/singlePhaseFlow/synthetic/synthetic_0_0.vtu new file mode 100644 index 00000000000..f3c0c2da30a --- /dev/null +++ b/inputFiles/singlePhaseFlow/synthetic/synthetic_0_0.vtu @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + _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cc8DjzzxzAuvvPHOB5988c3Pn4HOv/9LgEGGGGaEUcYY5zcTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz5/OOCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754dc/+CXAIEMMM8IoY4zzmwkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnz8ccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zw6//7JcAgQwwzwihjjPObCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfPxxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDPQH+AQYYYZoRRxhjnNxNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPn844JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvn5s8jxD38JMMgQw4wwyhjj/GaCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OcPBxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PpHvwQYZIhhRhhljHF+M8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvs84cDDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9+/eNfAgwyxDAjjDLGOL+ZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfb5wwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND/8s8gUYZIhhRhhljHF+M8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvs84cDDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnim58/C5z/5JcAgwwxzAijjDHObyaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPff5wwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDr3/6S4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHXP/slwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88M8Cf4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHXP/8lwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88Otf/BJgkCGGGWGUMcb5zQSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzx8OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3749S9/CTDIEMOMMMoY4/xmgkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjnDwcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/wT3BNgkCGGGWGUMcb5zQSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzx8OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3749a9+CTDIEMOMMMoY4/xmgkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjnDwcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/z6178EGGSIYUYYZYxxfjPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577POHAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffv2bXwIMMsQwI4wyxji/mWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32+cMBhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ//BPYFGGSIYUYYZYxxfjPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577POHAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffv3bXwIMMsQwI4wyxji/mWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32+cMBhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//t0vAQYZYpgRRhljnN9MMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvv84YBDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1///pcAgwwxzAijjDHObyaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPff5wwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDP0G9AQYZYpgRRhljnN9MMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvv84YBDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1//4ZcAgwwxzAijjDHObyaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPff5wwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDr//4S4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHXf/olwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88E9Af4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHX//9LgEGGGGaEUcYY5zcTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz5/OOCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754dd//iXAIEMMM8IoY4zzmwkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnz8ccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zw67/8EmCQIYYZYZQxxvnNBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPHw445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745ItvfvjnME+AQYYYZoRRxhjnNxNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPn844JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnh13/9JcAgQwwzwihjjPObCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfPxxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDrv/0SYJAhhhlhlDHG+c0Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8fDjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++PXffwkwyBDDjDDKGOP8ZoJJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY5w8HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/8c5AvwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88Ot//BJgkCGGGWGUMcb5zQSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzx8OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3749T9/CTDIEMOMMMoY4/xmgkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjnDwcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/z6X78EGGSIYUYYZYxxfjPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577POHAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psf/jnEG2CQIYYZYZQxxvnNBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPHw445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvj1v38JMMgQw4wwyhjj/GaCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OcPBxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//Po/vwQYZIhhRhhljHF+M8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvs84cDDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9+/d9fAgwyxDAjjDLGOL+ZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfb5wwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND79yv/w/dLzYyHicLcUhuAEAACBmQRAEQRAEQRAEQRAEd7OdbbbZZnd2ZzvbbLPNNtvczW7uThCEFwRBEARBEARBEARBEF4QBEEQBEEQhBf2ffP/5Q8WAv+/kMOOOOqY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JF/PPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux9++uW3P/5z4B98CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xz4h9+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6db0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8DxW9Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//ut6BDDjviqGOOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChR/7x2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjpl9/++M+Bf+9b0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/858A/+hZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/85UPoWdMhhRxx1zHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIPx574qlnnnvhpVdee+Otd9774KNP/vXZF199890PP/3y2x//OfDvfws65LAjjjrmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuQfjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757oeffvntj/8c+A++BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw78h9+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B8rfgg457IijjjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYce+cdjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774adffvvjPwf+o29Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//xt6BDDjviqGOOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChR/7x2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjpl9/++M+B/+Rb0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/850DlW9Ahhx1x1DHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI/947ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/z0y29//OfAf/ot6JDDjjjqmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRfzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsffvrltz/+c+A/+xZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858J9/CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xyofgs65LAjjjrmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuQfjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757oeffvntj/8c+C++BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw78429Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//kW9Ahhx1x1DHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI/947ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/z0y29//OdA7VvQIYcdcdQxx51w0imnnXHWOeddcNEll11x1TXX3XDTLbfdcdc99z3w0CP/eOyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/89Mtvf/znwH/5LeiQw4446pjjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokX889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H3765bc//nPgn34LOuSwI4465rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrkH4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6Hn3757Y//HPhn34IOOeyIo4457oSTTjntjLPOOe+Ciy657Iqrrrnuhptuue2Ou+6574GHHvnHY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++GnX3774z8H6t+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6rb0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8D//W3oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4F//i3okMOOOOqY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JF/PPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux9++uW3P/5zoPEt6JDDjjjqmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRfzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsffvrltz/+c+C/+RZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858N9+CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xz4774FHXLYEUcdc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3yj8eeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDT7/89sd/DjS/BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw7899+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6Hb0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8D/+O3oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4HWt6BDDjviqGOOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChR/7x2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjpl9/++M+B/+lb0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/858D//C3okMOOOOqY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JF/PPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux9++uW3P/5z4H/5FnTIYUccdcxxJ5x0ymlnnHXOeRdcdMllV1x1zXU33HTLbXfcdc99Dzz0yD8ee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdDz/98tsf/znQ/hZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858L9+CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xz4374FHXLYEUcdc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3yj8eeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDT7/89sd/Dvzv34IOOeyIo4457oSTTjntjLPOOe+Ciy657Iqrrrnuhptuue2Ou+6574GHHvnHY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++GnX3774z8HOt+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6Pb0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8D/+e3oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4H/61vQIYcdcdQxx51w0imnnXHWOeddcNEll11x1TXX3XDTLbfdcdc99z3w0CP/eOyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/89Mtvf/znQPdb0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/858C/+BZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858C+/BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw7839+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B3rfgg457IijjjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYce+cdjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774adffvvjPwf+n29Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//qW9Ahhx1x1DHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI/947ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/z0y29//OfA//st6JDDjjjqmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRfzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsffvrltz/+c6D/LeiQw4446pjjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokX889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H3765bc//nPgX38LOuSwI4465rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrkH4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6Hn3757Y//HPg334IOOeyIo4457oSTTjntjLPOOe+Ciy657Iqrrrnuhptuue2Ou+6574GHHvnHY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++GnX3774z8H/u23oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4HBt/8PdlHZBHicLcUhuAEAACBmQRAEQXhBEARBEARBEARBEARBEARBEARBsJu7s80222yzzTa7s5vtbOfubLPN3QRBEF4QBEEQhBcEQRD2ffP/5Q/2A/+/kMOOOOofxxx3wkmnnHbGWeecd8FFl1x2xVXXXHfDTbfcdsdd99z3wEOPPPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux/+89Mvv/1x4N/5FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jjwD74FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/Dvy734IOOeyIo/5xzHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++E/P/3y2x8HBt+CDjnsiKP+ccxxJ5x0ymlnnHXOeRdcdMllV1x1zXU33HTLbXfcdc99Dzz0yGNPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhPz/98tsfB/7ht6BDDjviqH8cc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3y2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjPT7/89seBf/Qt6JDDjjjqH8ccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDjzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsf/vPTL7/9ceAffws65LAjjvrHMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAjjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757of//PTLb38cGH4LOuSwI476xzHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6H//z0y29/HPj3vgUdctgRR/3jmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRx5546pnnXnjpldfeeOud9z746JN/ffbFV99898N/fvrltz8O/Pvfgg457Iij/nHMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889MhjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774T8//fLbHwf+g29Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA6NvQYccdsRR/zjmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuSxJ5565rkXXnrltTfeeue9Dz765F+fffHVN9/98J+ffvntjwP/4begQw474qh/HHPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898tgTTz3z3AsvvfLaG2+9894HH33yr8+++Oqb7374z0+//PbHgf/oW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAf/wt6JDDjjjqH8ccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDjzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsf/vPTL7/9cWD8LeiQw4446h/HHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H/7z0y+//XHgP/kWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OPCffgs65LAjjvrHMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAjjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757of//PTLb38c+M++BR1y2BFH/eOY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JHHnnjqmedeeOmV19546533Pvjok3999sVX33z3w39++uW3Pw5MvgUdctgRR/3jmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRx5546pnnXnjpldfeeOud9z746JN/ffbFV99898N/fvrltz8O/Offgg457Iij/nHMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889MhjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774T8//fLbHwf+i29Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA//lt6BDDjviqH8cc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3y2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjPT7/89seB6begQw474qh/HHPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898tgTTz3z3AsvvfLaG2+9894HH33yr8+++Oqb7374z0+//PbHgf/qW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAf/0t6JDDjjjqH8ccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDjzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsf/vPTL7/9ceC/+RZ0yGFHHPWPY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFHHnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q//+emX3/44MPsWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OPDffgs65LAjjvrHMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAjjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757of//PTLb38c+O++BR1y2BFH/eOY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JHHnnjqmedeeOmV19546533Pvjok3999sVX33z3w39++uW3Pw7899+CDjnsiKP+ccxxJ5x0ymlnnHXOeRdcdMllV1x1zXU33HTLbXfcdc99Dzz0yGNPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhPz/98tsfB+bfgg457Iij/nHMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889MhjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774T8//fLbHwf+h29Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA//kW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAP/0WdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OLD4FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jjwP34LOuSwI476xzHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6H//z0y29/HPhn34IOOeyIo/5xzHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++E/P/3y2x8H/qdvQYccdsRR/zjmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuSxJ5565rkXXnrltTfeeue9Dz765F+fffHVN9/98J+ffvntjwPLb0GHHHbEUf845rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrksSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fCfn3757Y8D//O3oEMOO+Kofxxz3AknnXLaGWedc94FF11y2RVXXXPdDTfdctsdd91z3wMPPfLYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++M9Pv/z2x4H/5VvQIYcdcdQ/jjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYceeeyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/856dffvvjwD//FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jiw+hZ0yGFHHPWPY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFHHnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q//+emX3/448L9+CzrksCOO+scxx51w0imnnXHWOeddcNEll11x1TXX3XDTLbfdcdc99z3w0COPPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh//89Mtvfxz4374FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/DvyLb0GHHHbEUf845rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrksSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fCfn3757Y8D629Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA//yW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAv/oWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OPCvvwUdctgRR/3jmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRx5546pnnXnjpldfeeOud9z746JN/ffbFV99898N/fvrltz8ObL4FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/Dvzv34IOOeyIo/5xzHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++E/P/3y2x8H/o9vQYccdsRR/zjmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuSxJ5565rkXXnrltTfeeue9Dz765F+fffHVN9/98J+ffvntjwP/57egQw474qh/HHPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898tgTTz3z3AsvvfLaG2+9894HH33yr8+++Oqb7374z0+//PbHge23oEMOO+Kofxxz3AknnXLaGWedc94FF11y2RVXXXPdDTfdctsdd91z3wMPPfLYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++M9Pv/z2x4H/61vQIYcdcdQ/jjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYceeeyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/856dffvvjwP/9LeiQw4446h/HHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H/7z0y+//XHg//kWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OLD7FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jjwb74FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/Dvzbb0GHHHbEUf845rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrksSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fCfn3757Y8D/++3oEMOO+Kofxxz3AknnXLaGWedc94FF11y2RVXXXPdDTfdctsdd91z3wMPPfLYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++M9Pv/z2x4H9t/8Pd+bZQHicLcUv2AEAAOBnex5BEARBEARBEARBEARBEAThC8IXBEEQBEEQBEEQBEEQBEEQBEFwN9tss83dbLOd29zNNtu5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EsussMof1vjLOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/8MvB//hFkiGFGGGWMcSaYZIppZphljnkWWGSJZVZY5Q9r/GWdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH34Z+PwRZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWOUPa/xlnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9+GfjXfwQZYpgRRhljnAkmmWKaGWaZY54FFllimRVW+cMaf1lng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh18G/q8/ggwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqv8YY2/rLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDLwP/9x9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVf6wxl/W2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXge8fQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVX+sMZf1tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhl4H/548gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKn9Y4y/rbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLwP/7R5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVP6zxl3U22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++GXg//sjyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMof1vjLOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/8MhD4t/7N/39ygdh9eJwt1yETAgCXllFWPxUVlVVUVFR0UVFRUVFRUQkEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEFz9zi3nBzwz78z9Q+BPAv/v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IYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+vv4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sdAVH8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgH+jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/EP9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX+kP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MRDTn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPjH+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/RH8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgn+rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38MxPVnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/pn+DDLEMCOM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GWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375YyCrP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfDf9WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+h/4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfA/9SfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4YyOnPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/C/9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgf+tP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfB/9GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwbyf/T/AtC86Mh4nC3RoRcBAIDYYXvvgiAIgiAIgiAIgiDYZpttdrOb3dlmm2222WZ3ttmd22wTBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEHY27vvV74/4PcH+b8W+P8FGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgr/+Vf8AgQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8Df8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bv+k/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxUPCfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Fv+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/bfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Dv+M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888MvfwwU/WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+rv8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfA3/OfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Pv+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfAyX/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX/gP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfCH/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/0H8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WOg7D+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwj/xnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/sh/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4B/7zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DFT8Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv6J/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8Af+88gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8if8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sdA1X8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgn/rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/DP/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX/uP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MVDzn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPgX/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/0n8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgX/nPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M1P1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/rX/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwL/xn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPi3/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMN/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/5z+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHw7/1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/oP/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQNN/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4D/6zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPwn/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4H/7D+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHQ8p9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4L/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsus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YpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Cf+s8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8M/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bf+4/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxMPOfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Bf+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/qP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfAv/WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwbm/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/yn8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgX/vPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/Bv/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgYX/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwL/1n0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPh3/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/3n8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WNg6T+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwH/xnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/qP/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwH/yn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GFj5zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPxn/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4H/4j+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwX/1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G1v4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8Df+Y/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8N/8Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv67/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8DGfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+B/+M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8T/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+B/+U/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxsPWfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+N/+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/uP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfAX/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwM7/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/9J9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4P/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8D/9d/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvljYP9X/j/T5ulAeJwt0a8fAQCA3mG3zwVBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBsM0229zNNttss80227nNbbZzm23247PtecP7/AHfP9z/QeD/LsgQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/5//uHDDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwF/Rn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPir+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMH/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/pj+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHw1/VnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/ob+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwFF/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4G/qzyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPwt/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/rT+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DFw0p9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4I/0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+BP9afQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Dv6M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA2f9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgb+rP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfD39GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+vv4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfARX8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgH+jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/EP9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX+kP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MXDVn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPjH+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/RH8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgn+rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M3PRnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/pn+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwD/Xn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPgX+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwN3/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/qT+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwr/RnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/rX+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwEN/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsu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cy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgb+kP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfCX9WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+iv4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sc/f/j/P39gkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/qr+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwF/Tn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPjr+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMh/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/oT+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwN/VnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/pb+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQFh/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4E/1Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv62/gwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8Df0Z9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hiI6M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8Xf0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bv6c/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8Pf1Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/BqL6M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA/9AfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Af6s8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8I/0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+BmP4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAP9afQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Cf6M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA/9UfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375YyCuP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfDP9GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+uf4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAn+nPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38MJPRnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/oX+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xy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vPLGOx988sU3P/zyx0BOfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+B/6c8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8b/0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+B/6M/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxkP+j/xcsy/jIeJwt0aEXAQCA2GFv74IgCIIgCIIgCIIg2GabbXazm93ZZpttttlmd7bZndtsEwRBEARBEARBEARBEARBEARBEARBEARB2Nu771e+P+D3B/m/Fvj/BRlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4K//lX/AIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/A3/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgb/pP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MVDwn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPhb/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwN/238GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPg7/jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38MFP1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/q7/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwN/zn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPj7/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMl/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/4D+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwh/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8D/9B/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvljoOw/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8I/8Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv7IfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Af+88gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888MvfwxU/GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+if8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAH/vPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/In/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQNV/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4J/6zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPwz/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/7j+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DFQ859BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4F/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8D/9J/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4F/5zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DNT9Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv61/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8C/8Z9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4t/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8DDf8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bf+c/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8O/9Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv6D/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx0DTfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+A/+s8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8J/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+B/+w/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx0PKfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+C/+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/qP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfBn/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwNt/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4H/6j+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHw3/xnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/rv/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQMd/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4H/4zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPy5/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8Bf+M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwx0/WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+0n8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgf/rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/C//GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgZ7/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwP/2n0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPg//jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/138GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WOg/1f+Py5g+QR4nC3RIRMBAIKAUXOzQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRDcrd1zt/bO7toZQRAEQRAEQRAEQRAEQRAEQRAEQbjZufeV9wO+P/T/LfCvggwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8O//7x8YZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+B//CfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+KP/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwMB/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4E/+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/2n0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPhP/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4Gh/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8B/+c8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8t/8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAX/xnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8GRv4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8Df/WfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+B//GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgf/1n0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GBj7zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPzNfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Dv/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/8J9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hiY+M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8038GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjni/wG4JJNeAgAAAACAAABjJQAANQAAACEAAAA=eJztwSEBAAAAgKDu/8EeAQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGME7AEx4nO3BMQEAAADCoH/9A5vABkABAAAAAAAAAABwDE9gde4= + + diff --git a/inputFiles/singlePhaseFlow/synthetic/synthetic_1_0.vtu b/inputFiles/singlePhaseFlow/synthetic/synthetic_1_0.vtu new file mode 100644 index 00000000000..5f6097344cb --- /dev/null +++ b/inputFiles/singlePhaseFlow/synthetic/synthetic_1_0.vtu @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + _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cc8DjzzxzAuvvPHOB5988c3Pn4HOv/9LgEGGGGaEUcYY5zcTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz5/OOCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754dc/+CXAIEMMM8IoY4zzmwkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnz8ccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zw6//7JcAgQwwzwihjjPObCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfPxxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDPQH+AQYYYZoRRxhjnNxNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPn844JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvn5s8jxD38JMMgQw4wwyhjj/GaCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OcPBxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PpHvwQYZIhhRhhljHF+M8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvs84cDDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9+/eNfAgwyxDAjjDLGOL+ZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfb5wwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND/8s8gUYZIhhRhhljHF+M8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvs84cDDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnim58/C5z/5JcAgwwxzAijjDHObyaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPff5wwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDr3/6S4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHXP/slwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88M8Cf4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHXP/8lwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88Otf/BJgkCGGGWGUMcb5zQSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzx8OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3749S9/CTDIEMOMMMoY4/xmgkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjnDwcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/wT3BNgkCGGGWGUMcb5zQSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzx8OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3749a9+CTDIEMOMMMoY4/xmgkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjnDwcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/z6178EGGSIYUYYZYxxfjPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577POHAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffv2bXwIMMsQwI4wyxji/mWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32+cMBhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ//BPYFGGSIYUYYZYxxfjPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577POHAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffv3bXwIMMsQwI4wyxji/mWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32+cMBhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//t0vAQYZYpgRRhljnN9MMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvv84YBDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1///pcAgwwxzAijjDHObyaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPff5wwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDP0G9AQYZYpgRRhljnN9MMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvv84YBDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1//4ZcAgwwxzAijjDHObyaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPff5wwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDr//4S4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHXf/olwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88E9Af4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHX//9LgEGGGGaEUcYY5zcTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz5/OOCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754dd//iXAIEMMM8IoY4zzmwkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnz8ccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zw67/8EmCQIYYZYZQxxvnNBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPHw445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745ItvfvjnME+AQYYYZoRRxhjnNxNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPn844JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnh13/9JcAgQwwzwihjjPObCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfPxxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDrv/0SYJAhhhlhlDHG+c0Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8fDjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++PXffwkwyBDDjDDKGOP8ZoJJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY5w8HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/8c5AvwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88Ot//BJgkCGGGWGUMcb5zQSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzx8OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3749T9/CTDIEMOMMMoY4/xmgkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjnDwcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/z6X78EGGSIYUYYZYxxfjPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577POHAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psf/jnEG2CQIYYZYZQxxvnNBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPHw445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvj1v38JMMgQw4wwyhjj/GaCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OcPBxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//Po/vwQYZIhhRhhljHF+M8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvs84cDDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9+/d9fAgwyxDAjjDLGOL+ZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfb5wwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND79yv/w/dLzYyHicLcUhuAEAACBmQRAEQRAEQRAEQRAEd7OdbbbZZnd2ZzvbbLPNNtvczW7uThCEFwRBEARBEARBEARBEF4QBEEQBEEQhBf2ffP/5Q8WAv+/kMOOOOqY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JF/PPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux9++uW3P/5z4B98CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xz4h9+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6db0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8DxW9Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//ut6BDDjviqGOOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChR/7x2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjpl9/++M+Bf+9b0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/858A/+hZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/85UPoWdMhhRxx1zHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIPx574qlnnnvhpVdee+Otd9774KNP/vXZF199890PP/3y2x//OfDvfws65LAjjjrmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuQfjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757oeffvntj/8c+A++BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw78h9+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B8rfgg457IijjjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYce+cdjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774adffvvjPwf+o29Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//xt6BDDjviqGOOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChR/7x2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjpl9/++M+B/+Rb0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/850DlW9Ahhx1x1DHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI/947ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/z0y29//OfAf/ot6JDDjjjqmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRfzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsffvrltz/+c+A/+xZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858J9/CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xyofgs65LAjjjrmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuQfjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757oeffvntj/8c+C++BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw78429Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//kW9Ahhx1x1DHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI/947ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/z0y29//OdA7VvQIYcdcdQxx51w0imnnXHWOeddcNEll11x1TXX3XDTLbfdcdc99z3w0CP/eOyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/89Mtvf/znwH/5LeiQw4446pjjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokX889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H3765bc//nPgn34LOuSwI4465rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrkH4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6Hn3757Y//HPhn34IOOeyIo4457oSTTjntjLPOOe+Ciy657Iqrrrnuhptuue2Ou+6574GHHvnHY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++GnX3774z8H6t+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6rb0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8D//W3oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4F//i3okMOOOOqY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JF/PPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux9++uW3P/5zoPEt6JDDjjjqmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRfzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsffvrltz/+c+C/+RZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858N9+CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xz4774FHXLYEUcdc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3yj8eeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDT7/89sd/DjS/BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw7899+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6Hb0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8D/+O3oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4HWt6BDDjviqGOOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChR/7x2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjpl9/++M+B/+lb0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/858D//C3okMOOOOqY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JF/PPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux9++uW3P/5z4H/5FnTIYUccdcxxJ5x0ymlnnHXOeRdcdMllV1x1zXU33HTLbXfcdc99Dzz0yD8ee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdDz/98tsf/znQ/hZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858L9+CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xz4374FHXLYEUcdc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3yj8eeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDT7/89sd/Dvzv34IOOeyIo4457oSTTjntjLPOOe+Ciy657Iqrrrnuhptuue2Ou+6574GHHvnHY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++GnX3774z8HOt+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6Pb0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8D/+e3oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4H/61vQIYcdcdQxx51w0imnnXHWOeddcNEll11x1TXX3XDTLbfdcdc99z3w0CP/eOyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/89Mtvf/znQPdb0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/858C/+BZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858C+/BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw7839+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B3rfgg457IijjjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYce+cdjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774adffvvjPwf+n29Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//qW9Ahhx1x1DHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI/947ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/z0y29//OfA//st6JDDjjjqmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRfzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsffvrltz/+c6D/LeiQw4446pjjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokX889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H3765bc//nPgX38LOuSwI4465rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrkH4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6Hn3757Y//HPg334IOOeyIo4457oSTTjntjLPOOe+Ciy657Iqrrrnuhptuue2Ou+6574GHHvnHY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++GnX3774z8H/u23oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4HBt/8PdlHZBHicLcUhuAEAACBmQRAEQXhBEARBEARBEARBEARBEARBEARBsJu7s80222yzzTa7s5vtbOfubLPN3QRBEF4QBEEQhBcEQRD2ffP/5Q/2A/+/kMOOOOofxxx3wkmnnHbGWeecd8FFl1x2xVXXXHfDTbfcdsdd99z3wEOPPPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux/+89Mvv/1x4N/5FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jjwD74FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/Dvy734IOOeyIo/5xzHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++E/P/3y2x8HBt+CDjnsiKP+ccxxJ5x0ymlnnHXOeRdcdMllV1x1zXU33HTLbXfcdc99Dzz0yGNPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhPz/98tsfB/7ht6BDDjviqH8cc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3y2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjPT7/89seBf/Qt6JDDjjjqH8ccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDjzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsf/vPTL7/9ceAffws65LAjjvrHMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAjjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757of//PTLb38cGH4LOuSwI476xzHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6H//z0y29/HPj3vgUdctgRR/3jmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRx5546pnnXnjpldfeeOud9z746JN/ffbFV99898N/fvrltz8O/Pvfgg457Iij/nHMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889MhjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774T8//fLbHwf+g29Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA6NvQYccdsRR/zjmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuSxJ5565rkXXnrltTfeeue9Dz765F+fffHVN9/98J+ffvntjwP/4begQw474qh/HHPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898tgTTz3z3AsvvfLaG2+9894HH33yr8+++Oqb7374z0+//PbHgf/oW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAf/wt6JDDjjjqH8ccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDjzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsf/vPTL7/9cWD8LeiQw4446h/HHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H/7z0y+//XHgP/kWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OPCffgs65LAjjvrHMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAjjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757of//PTLb38c+M++BR1y2BFH/eOY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JHHnnjqmedeeOmV19546533Pvjok3999sVX33z3w39++uW3Pw5MvgUdctgRR/3jmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRx5546pnnXnjpldfeeOud9z746JN/ffbFV99898N/fvrltz8O/Offgg457Iij/nHMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889MhjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774T8//fLbHwf+i29Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA//lt6BDDjviqH8cc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3y2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjPT7/89seB6begQw474qh/HHPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898tgTTz3z3AsvvfLaG2+9894HH33yr8+++Oqb7374z0+//PbHgf/qW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAf/0t6JDDjjjqH8ccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDjzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsf/vPTL7/9ceC/+RZ0yGFHHPWPY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFHHnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q//+emX3/44MPsWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OPDffgs65LAjjvrHMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAjjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757of//PTLb38c+O++BR1y2BFH/eOY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JHHnnjqmedeeOmV19546533Pvjok3999sVX33z3w39++uW3Pw7899+CDjnsiKP+ccxxJ5x0ymlnnHXOeRdcdMllV1x1zXU33HTLbXfcdc99Dzz0yGNPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhPz/98tsfB+bfgg457Iij/nHMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889MhjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774T8//fLbHwf+h29Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA//kW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAP/0WdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OLD4FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jjwP34LOuSwI476xzHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6H//z0y29/HPhn34IOOeyIo/5xzHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++E/P/3y2x8H/qdvQYccdsRR/zjmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuSxJ5565rkXXnrltTfeeue9Dz765F+fffHVN9/98J+ffvntjwPLb0GHHHbEUf845rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrksSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fCfn3757Y8D//O3oEMOO+Kofxxz3AknnXLaGWedc94FF11y2RVXXXPdDTfdctsdd91z3wMPPfLYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++M9Pv/z2x4H/5VvQIYcdcdQ/jjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYceeeyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/856dffvvjwD//FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jiw+hZ0yGFHHPWPY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFHHnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q//+emX3/448L9+CzrksCOO+scxx51w0imnnXHWOeddcNEll11x1TXX3XDTLbfdcdc99z3w0COPPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh//89Mtvfxz4374FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/DvyLb0GHHHbEUf845rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrksSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fCfn3757Y8D629Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA//yW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAv/oWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OPCvvwUdctgRR/3jmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRx5546pnnXnjpldfeeOud9z746JN/ffbFV99898N/fvrltz8ObL4FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/Dvzv34IOOeyIo/5xzHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++E/P/3y2x8H/o9vQYccdsRR/zjmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuSxJ5565rkXXnrltTfeeue9Dz765F+fffHVN9/98J+ffvntjwP/57egQw474qh/HHPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898tgTTz3z3AsvvfLaG2+9894HH33yr8+++Oqb7374z0+//PbHge23oEMOO+Kofxxz3AknnXLaGWedc94FF11y2RVXXXPdDTfdctsdd91z3wMPPfLYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++M9Pv/z2x4H/61vQIYcdcdQ/jjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYceeeyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/856dffvvjwP/9LeiQw4446h/HHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H/7z0y+//XHg//kWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OLD7FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jjwb74FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/Dvzbb0GHHHbEUf845rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrksSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fCfn3757Y8D/++3oEMOO+Kofxxz3AknnXLaGWedc94FF11y2RVXXXPdDTfdctsdd91z3wMPPfLYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++M9Pv/z2x4H9t/8Pd+bZQHicLcUv2AEAAOBnex5BEARBEARBEARBEARBEAThC8IXBEEQBEEQBEEQBEEQBEEQBEFwN9tss83dbLOd29zNNtu5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EsussMof1vjLOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/8MvB//hFkiGFGGGWMcSaYZIppZphljnkWWGSJZVZY5Q9r/GWdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH34Z+PwRZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWOUPa/xlnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9+GfjXfwQZYpgRRhljnAkmmWKaGWaZY54FFllimRVW+cMaf1lng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh18G/q8/ggwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqv8YY2/rLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDLwP/9x9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVf6wxl/W2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXge8fQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVX+sMZf1tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhl4H/548gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKn9Y4y/rbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLwP/7R5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVP6zxl3U22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++GXg//sjyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMof1vjLOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/8MhD4t/7N/39ygdh9eJwt1yETAgCXllFWPxUVlVVUVFR0UVFRUVFRUQkEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEFz9zi3nBzwz78z9Q+BPAv/v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IYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+vv4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sdAVH8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgH+jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/EP9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX+kP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MRDTn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPjH+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/RH8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgn+rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38MxPVnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/pn+DDLEMCOM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GWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375YyCrP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfDf9WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+h/4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfA/9SfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4YyOnPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/C/9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgf+tP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfB/9GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwbyf/T/AtC86Mh4nC3RoRcBAIDYYXvvgiAIgiAIgiAIgiDYZpttdrOb3dlmm2222WZ3ttmd22wTBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEHY27vvV74/4PcH+b8W+P8FGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgr/+Vf8AgQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8Df8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bv+k/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxUPCfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Fv+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/bfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Dv+M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888MvfwwU/WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+rv8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfA3/OfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Pv+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfAyX/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX/gP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfCH/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/0H8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WOg7D+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwj/xnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/sh/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4B/7zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DFT8Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv6J/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8Af+88gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8if8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sdA1X8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgn/rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/DP/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX/uP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MVDzn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPgX/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/0n8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgX/nPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M1P1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/rX/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwL/xn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPi3/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMN/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/5z+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHw7/1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/oP/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQNN/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4D/6zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPwn/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4H/7D+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHQ8p9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4L/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsus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YpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Cf+s8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8M/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bf+4/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxMPOfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Bf+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/qP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfAv/WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwbm/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/yn8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgX/vPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/Bv/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgYX/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwL/1n0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPh3/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/3n8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WNg6T+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwH/xnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/qP/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwH/yn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GFj5zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPxn/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4H/4j+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwX/1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G1v4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8Df+Y/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8N/8Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv67/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8DGfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+B/+M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8T/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+B/+U/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxsPWfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+N/+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/uP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfAX/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwM7/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/9J9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4P/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8D/9d/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvljYP9X/j/T5ulAeJwt0a8fAQCA3mG3zwVBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBsM0229zNNttss80227nNbbZzm23247PtecP7/AHfP9z/QeD/LsgQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/5//uHDDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwF/Rn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPir+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMH/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/pj+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHw1/VnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/ob+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwFF/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4G/qzyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPwt/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/rT+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DFw0p9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4I/0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+BP9afQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Dv6M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA2f9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgb+rP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfD39GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+vv4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfARX8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgH+jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/EP9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX+kP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MXDVn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPjH+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/RH8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgn+rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M3PRnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/pn+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwD/Xn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPgX+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwN3/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/qT+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwr/RnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/rX+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwEN/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsu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cy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgb+kP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfCX9WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+iv4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sc/f/j/P39gkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/qr+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwF/Tn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPjr+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMh/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/oT+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwN/VnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/pb+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQFh/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4E/1Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv62/gwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8Df0Z9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hiI6M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8Xf0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bv6c/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8Pf1Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/BqL6M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA/9AfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Af6s8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8I/0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+BmP4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAP9afQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Cf6M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA/9UfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375YyCuP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfDP9GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+uf4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAn+nPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38MJPRnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/oX+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xy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vPLGOx988sU3P/zyx0BOfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+B/6c8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8b/0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+B/6M/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxkP+j/xcsy/jIeJwt0aEXAQCA2GFv74IgCIIgCIIgCIIg2GabbXazm93ZZpttttlmd7bZndtsEwRBEARBEARBEARBEARBEARBEARBEARB2Nu771e+P+D3B/m/Fvj/BRlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4K//lX/AIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/A3/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgb/pP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MVDwn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPhb/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwN/238GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPg7/jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38MFP1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/q7/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwN/zn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPj7/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMl/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/4D+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwh/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8D/9B/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvljoOw/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8I/8Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv7IfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Af+88gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888MvfwxU/GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+if8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAH/vPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/In/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQNV/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4J/6zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPwz/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/7j+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DFQ859BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4F/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8D/9J/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4F/5zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DNT9Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv61/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8C/8Z9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4t/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8DDf8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bf+c/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8O/9Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv6D/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx0DTfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+A/+s8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8J/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+B/+w/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx0PKfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+C/+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/qP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfBn/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwNt/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4H/6j+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHw3/xnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/rv/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQMd/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4H/4zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPy5/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8Bf+M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwx0/WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+0n8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgf/rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/C//GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgZ7/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwP/2n0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPg//jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/138GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WOg/1f+Py5g+QR4nC3RoRcBAIDYYe/eBUEQBEEQBEEQBEEQBEEQBEEQBEEQBEGwzXa2c5ttttlmN9tss802t9lmd24TBEEQBEEQBEEQBEHY27vvV74/4PeH/T8I/P+CDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHw1/7KP2SQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+uv8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfA3/CfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4YGPjPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/E3/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgb/lP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfBH/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwND/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/7T+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwd/xnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/th/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvljYOQ/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8Cf+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/XfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Dv+c8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888MvfwyM/WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+vv8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAP/CfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+If+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfAxP/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX/kP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfCP/WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+if8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfA1H8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgn/rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/DP/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX/uP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MTDzn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPgX/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwN/6j+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwL/1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G5v4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8D/8p/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4F/7zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPwb/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4GF/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8C/9Z9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4d/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8D/95/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvljYOk/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8B/8Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv6j/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8B/8p9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hhY+c8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8Z/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+B/+I/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8F/9Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Btb+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/mP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfDf/GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+u/8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAxn8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgf/jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/E//GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgf/lP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MbD1n0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPjf/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwN/7j+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwF/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8DO/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bv/SfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+D/+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA//XfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y2D/V/4/L/X5QHicLdGvHwEAgN5hn9sFQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQRAEQbDNNtvczTbbbLPNNtu5zW22c5tt9uOz7XnD+/wB3z/c/0Hg/y7IEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwN/+f/7hwwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8Bf0Z9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4q/ozyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8DB/0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bv6Y/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8Nf1Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv6G/gwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8BRfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Bv6s8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8Lf0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bv60/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxcNKfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+CP9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgT/Wn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPg7+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwNn/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/qz+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHw9/RnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/r7+DDLEMCOMMsY4E0wy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ssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwL/Tn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPj3+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMv/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4E/059BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4D/ozyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8D/1F/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4K0/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8J/0Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv6z/gwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8Cf688gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwx89GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+Qn8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgv+jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/Ff9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPga/+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwH/Tn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPjv+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/Q38GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgpz+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwP/VnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/pf+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwP/Wn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhn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nQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPg3/RnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/l1/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4D/0Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/BqL6M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA/+pP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfBf+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/rT+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DEQ059BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4H/0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimv+L/DvIhI=AgAAAACAAABsRwAANQAAACkAAAA=eJztwSEBAAAAgKDu/8EeAQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGME7AEx4nO3BMQ0AAADDoL/+Bc/HAhQAAAAAAAAAAAAAAAAAAAAAAHwb7zDKVw== + + diff --git a/inputFiles/singlePhaseFlow/synthetic/synthetic_2_0.vtu b/inputFiles/singlePhaseFlow/synthetic/synthetic_2_0.vtu new file mode 100644 index 00000000000..d6b77b62910 --- /dev/null +++ b/inputFiles/singlePhaseFlow/synthetic/synthetic_2_0.vtu @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + _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cc8DjzzxzAuvvPHOB5988c3Pn4HOv/9LgEGGGGaEUcYY5zcTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz5/OOCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754dc/+CXAIEMMM8IoY4zzmwkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnz8ccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zw6//7JcAgQwwzwihjjPObCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfPxxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDPQH+AQYYYZoRRxhjnNxNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPn844JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvn5s8jxD38JMMgQw4wwyhjj/GaCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OcPBxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PpHvwQYZIhhRhhljHF+M8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvs84cDDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9+/eNfAgwyxDAjjDLGOL+ZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfb5wwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND/8s8gUYZIhhRhhljHF+M8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvs84cDDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnim58/C5z/5JcAgwwxzAijjDHObyaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPff5wwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDr3/6S4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHXP/slwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88M8Cf4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHXP/8lwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88Otf/BJgkCGGGWGUMcb5zQSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzx8OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3749S9/CTDIEMOMMMoY4/xmgkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjnDwcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/wT3BNgkCGGGWGUMcb5zQSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzx8OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3749a9+CTDIEMOMMMoY4/xmgkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjnDwcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/z6178EGGSIYUYYZYxxfjPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577POHAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffv2bXwIMMsQwI4wyxji/mWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32+cMBhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ//BPYFGGSIYUYYZYxxfjPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577POHAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffv3bXwIMMsQwI4wyxji/mWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32+cMBhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//t0vAQYZYpgRRhljnN9MMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvv84YBDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1///pcAgwwxzAijjDHObyaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPff5wwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDP0G9AQYZYpgRRhljnN9MMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvv84YBDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1//4ZcAgwwxzAijjDHObyaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPff5wwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDr//4S4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHXf/olwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88E9Af4BBhhhmhFHGGOc3E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+fzjgkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eHX//9LgEGGGGaEUcYY5zcTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz5/OOCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754dd//iXAIEMMM8IoY4zzmwkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnz8ccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zw67/8EmCQIYYZYZQxxvnNBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPHw445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745ItvfvjnME+AQYYYZoRRxhjnNxNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPn844JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnh13/9JcAgQwwzwihjjPObCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfPxxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDrv/0SYJAhhhlhlDHG+c0Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8fDjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++PXffwkwyBDDjDDKGOP8ZoJJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY5w8HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/8c5AvwCBDDDPCKGOM85sJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58/HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88Ot//BJgkCGGGWGUMcb5zQSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzx8OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3749T9/CTDIEMOMMMoY4/xmgkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjnDwcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/z6X78EGGSIYUYYZYxxfjPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577POHAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psf/jnEG2CQIYYZYZQxxvnNBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPHw445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvj1v38JMMgQw4wwyhjj/GaCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OcPBxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//Po/vwQYZIhhRhhljHF+M8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvs84cDDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9+/d9fAgwyxDAjjDLGOL+ZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfb5wwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND79yv/w/dLzYyHicLcUhuAEAACBmQRAEQRAEQRAEQRAEd7OdbbbZZnd2ZzvbbLPNNtvczW7uThCEFwRBEARBEARBEARBEF4QBEEQBEEQhBf2ffP/5Q8WAv+/kMOOOOqY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JF/PPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux9++uW3P/5z4B98CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xz4h9+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6db0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8DxW9Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//ut6BDDjviqGOOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChR/7x2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjpl9/++M+Bf+9b0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/858A/+hZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/85UPoWdMhhRxx1zHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIPx574qlnnnvhpVdee+Otd9774KNP/vXZF199890PP/3y2x//OfDvfws65LAjjjrmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuQfjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757oeffvntj/8c+A++BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw78h9+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B8rfgg457IijjjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYce+cdjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774adffvvjPwf+o29Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//xt6BDDjviqGOOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChR/7x2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjpl9/++M+B/+Rb0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/850DlW9Ahhx1x1DHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI/947ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/z0y29//OfAf/ot6JDDjjjqmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRfzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsffvrltz/+c+A/+xZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858J9/CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xyofgs65LAjjjrmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuQfjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757oeffvntj/8c+C++BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw78429Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//kW9Ahhx1x1DHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI/947ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/z0y29//OdA7VvQIYcdcdQxx51w0imnnXHWOeddcNEll11x1TXX3XDTLbfdcdc99z3w0CP/eOyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/89Mtvf/znwH/5LeiQw4446pjjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokX889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H3765bc//nPgn34LOuSwI4465rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrkH4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6Hn3757Y//HPhn34IOOeyIo4457oSTTjntjLPOOe+Ciy657Iqrrrnuhptuue2Ou+6574GHHvnHY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++GnX3774z8H6t+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6rb0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8D//W3oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4F//i3okMOOOOqY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JF/PPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux9++uW3P/5zoPEt6JDDjjjqmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRfzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsffvrltz/+c+C/+RZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858N9+CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xz4774FHXLYEUcdc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3yj8eeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDT7/89sd/DjS/BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw7899+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6Hb0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8D/+O3oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4HWt6BDDjviqGOOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChR/7x2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjpl9/++M+B/+lb0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/858D//C3okMOOOOqY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JF/PPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux9++uW3P/5z4H/5FnTIYUccdcxxJ5x0ymlnnHXOeRdcdMllV1x1zXU33HTLbXfcdc99Dzz0yD8ee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdDz/98tsf/znQ/hZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858L9+CzrksCOOOua4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565B+PPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh59++e2P/xz4374FHXLYEUcdc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3yj8eeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDT7/89sd/Dvzv34IOOeyIo4457oSTTjntjLPOOe+Ciy657Iqrrrnuhptuue2Ou+6574GHHvnHY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++GnX3774z8HOt+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B/6Pb0GHHHbEUcccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDj/zjsSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fDTL7/98Z8D/+e3oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4H/61vQIYcdcdQxx51w0imnnXHWOeddcNEll11x1TXX3XDTLbfdcdc99z3w0CP/eOyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/89Mtvf/znQPdb0CGHHXHUMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAj/3jsiaeeee6Fl1557Y233nnvg48++ddnX3z1zXc//PTLb3/858C/+BZ0yGFHHHXMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889Mg/HnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q8//fLbH/858C+/BR1y2BFHHXPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898o/HnnjqmedeeOmV19546533Pvjok3999sVX33z3w0+//PbHfw7839+CDjnsiKOOOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx75x2NPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhp19+++M/B3rfgg457IijjjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYce+cdjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774adffvvjPwf+n29Bhxx2xFHHHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4/847EnnnrmuRdeeuW1N956570PPvrkX5998dU33/3w0y+//fGfA//qW9Ahhx1x1DHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI/947ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/z0y29//OfA//st6JDDjjjqmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRfzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsffvrltz/+c6D/LeiQw4446pjjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokX889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H3765bc//nPgX38LOuSwI4465rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrkH4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6Hn3757Y//HPg334IOOeyIo4457oSTTjntjLPOOe+Ciy657Iqrrrnuhptuue2Ou+6574GHHvnHY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++GnX3774z8H/u23oEMOO+KoY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFH/vHYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++OmX3/74z4HBt/8PdlHZBHicLcUhuAEAACBmQRAEQXhBEARBEARBEARBEARBEARBEARBsJu7s80222yzzTa7s5vtbOfubLPN3QRBEF4QBEEQhBcEQRD2ffP/5Q/2A/+/kMOOOOofxxx3wkmnnHbGWeecd8FFl1x2xVXXXHfDTbfcdsdd99z3wEOPPPbEU88898JLr7z2xlvvvPfBR5/867Mvvvrmux/+89Mvv/1x4N/5FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jjwD74FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/Dvy734IOOeyIo/5xzHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++E/P/3y2x8HBt+CDjnsiKP+ccxxJ5x0ymlnnHXOeRdcdMllV1x1zXU33HTLbXfcdc99Dzz0yGNPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhPz/98tsfB/7ht6BDDjviqH8cc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3y2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjPT7/89seBf/Qt6JDDjjjqH8ccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDjzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsf/vPTL7/9ceAffws65LAjjvrHMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAjjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757of//PTLb38cGH4LOuSwI476xzHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6H//z0y29/HPj3vgUdctgRR/3jmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRx5546pnnXnjpldfeeOud9z746JN/ffbFV99898N/fvrltz8O/Pvfgg457Iij/nHMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889MhjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774T8//fLbHwf+g29Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA6NvQYccdsRR/zjmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuSxJ5565rkXXnrltTfeeue9Dz765F+fffHVN9/98J+ffvntjwP/4begQw474qh/HHPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898tgTTz3z3AsvvfLaG2+9894HH33yr8+++Oqb7374z0+//PbHgf/oW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAf/wt6JDDjjjqH8ccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDjzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsf/vPTL7/9cWD8LeiQw4446h/HHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H/7z0y+//XHgP/kWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OPCffgs65LAjjvrHMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAjjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757of//PTLb38c+M++BR1y2BFH/eOY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JHHnnjqmedeeOmV19546533Pvjok3999sVX33z3w39++uW3Pw5MvgUdctgRR/3jmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRx5546pnnXnjpldfeeOud9z746JN/ffbFV99898N/fvrltz8O/Offgg457Iij/nHMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889MhjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774T8//fLbHwf+i29Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA//lt6BDDjviqH8cc9wJJ51y2hlnnXPeBRddctkVV11z3Q033XLbHXfdc98DDz3y2BNPPfPcCy+98tobb73z3gcfffKvz7746pvvfvjPT7/89seB6begQw474qh/HHPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898tgTTz3z3AsvvfLaG2+9894HH33yr8+++Oqb7374z0+//PbHgf/qW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAf/0t6JDDjjjqH8ccd8JJp5x2xlnnnHfBRZdcdsVV11x3w0233HbHXffc98BDjzz2xFPPPPfCS6+89sZb77z3wUef/OuzL7765rsf/vPTL7/9ceC/+RZ0yGFHHPWPY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFHHnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q//+emX3/44MPsWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OPDffgs65LAjjvrHMcedcNIpp51x1jnnXXDRJZddcdU1191w0y233XHXPfc98NAjjz3x1DPPvfDSK6+98dY7733w0Sf/+uyLr7757of//PTLb38c+O++BR1y2BFH/eOY40446ZTTzjjrnPMuuOiSy6646prrbrjpltvuuOue+x546JHHnnjqmedeeOmV19546533Pvjok3999sVX33z3w39++uW3Pw7899+CDjnsiKP+ccxxJ5x0ymlnnHXOeRdcdMllV1x1zXU33HTLbXfcdc99Dzz0yGNPPPXMcy+89Mprb7z1znsffPTJvz774qtvvvvhPz/98tsfB+bfgg457Iij/nHMcSecdMppZ5x1znkXXHTJZVdcdc11N9x0y2133HXPfQ889MhjTzz1zHMvvPTKa2+89c57H3z0yb8+++Krb7774T8//fLbHwf+h29Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA//kW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAP/0WdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OLD4FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jjwP34LOuSwI476xzHHnXDSKaedcdY5511w0SWXXXHVNdfdcNMtt91x1z33PfDQI4898dQzz73w0iuvvfHWO+998NEn//rsi6+++e6H//z0y29/HPhn34IOOeyIo/5xzHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++E/P/3y2x8H/qdvQYccdsRR/zjmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuSxJ5565rkXXnrltTfeeue9Dz765F+fffHVN9/98J+ffvntjwPLb0GHHHbEUf845rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrksSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fCfn3757Y8D//O3oEMOO+Kofxxz3AknnXLaGWedc94FF11y2RVXXXPdDTfdctsdd91z3wMPPfLYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++M9Pv/z2x4H/5VvQIYcdcdQ/jjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYceeeyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/856dffvvjwD//FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jiw+hZ0yGFHHPWPY4474aRTTjvjrHPOu+CiSy674qprrrvhpltuu+Oue+574KFHHnviqWeee+GlV15746133vvgo0/+9dkXX33z3Q//+emX3/448L9+CzrksCOO+scxx51w0imnnXHWOeddcNEll11x1TXX3XDTLbfdcdc99z3w0COPPfHUM8+98NIrr73x1jvvffDRJ//67Iuvvvnuh//89Mtvfxz4374FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/DvyLb0GHHHbEUf845rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrksSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fCfn3757Y8D629Bhxx2xFH/OOa4E0465bQzzjrnvAsuuuSyK6665robbrrltjvuuue+Bx565LEnnnrmuRdeeuW1N956570PPvrkX5998dU33/3wn59++e2PA//yW9Ahhx1x1D+OOe6Ek0457YyzzjnvgosuueyKq6657oabbrntjrvuue+Bhx557ImnnnnuhZdeee2Nt95574OPPvnXZ1989c13P/znp19+++PAv/oWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OPCvvwUdctgRR/3jmONOOOmU084465zzLrjoksuuuOqa62646Zbb7rjrnvseeOiRx5546pnnXnjpldfeeOud9z746JN/ffbFV99898N/fvrltz8ObL4FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/Dvzv34IOOeyIo/5xzHEnnHTKaWecdc55F1x0yWVXXHXNdTfcdMttd9x1z30PPPTIY0889cxzL7z0ymtvvPXOex989Mm/Pvviq2++++E/P/3y2x8H/o9vQYccdsRR/zjmuBNOOuW0M84657wLLrrksiuuuua6G2665bY77rrnvgceeuSxJ5565rkXXnrltTfeeue9Dz765F+fffHVN9/98J+ffvntjwP/57egQw474qh/HHPcCSedctoZZ51z3gUXXXLZFVddc90NN91y2x133XPfAw898tgTTz3z3AsvvfLaG2+9894HH33yr8+++Oqb7374z0+//PbHge23oEMOO+Kofxxz3AknnXLaGWedc94FF11y2RVXXXPdDTfdctsdd91z3wMPPfLYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++M9Pv/z2x4H/61vQIYcdcdQ/jjnuhJNOOe2Ms84574KLLrnsiquuue6Gm2657Y677rnvgYceeeyJp5557oWXXnntjbfeee+Djz7512dffPXNdz/856dffvvjwP/9LeiQw4446h/HHHfCSaecdsZZ55x3wUWXXHbFVddcd8NNt9x2x1333PfAQ4889sRTzzz3wkuvvPbGW++898FHn/zrsy+++ua7H/7z0y+//XHg//kWdMhhRxz1j2OOO+GkU04746xzzrvgoksuu+Kqa6674aZbbrvjrnvue+ChRx574qlnnnvhpVdee+Otd9774KNP/vXZF199890P//npl9/+OLD7FnTIYUcc9Y9jjjvhpFNOO+Osc8674KJLLrviqmuuu+GmW26746577nvgoUcee+KpZ5574aVXXnvjrXfe++CjT/712RdfffPdD//56Zff/jjwb74FHXLYEUf945jjTjjplNPOOOuc8y646JLLrrjqmutuuOmW2+646577HnjokceeeOqZ51546ZXX3njrnfc++OiTf332xVfffPfDf3765bc/Dvzbb0GHHHbEUf845rgTTjrltDPOOue8Cy665LIrrrrmuhtuuuW2O+66574HHnrksSeeeua5F1565bU33nrnvQ8++uRfn33x1Tff/fCfn3757Y8D/++3oEMOO+Kofxxz3AknnXLaGWedc94FF11y2RVXXXPdDTfdctsdd91z3wMPPfLYE08989wLL73y2htvvfPeBx998q/Pvvjqm+9++M9Pv/z2x4H9t/8Pd+bZQHicLcUv2AEAAOBnex5BEARBEARBEARBEARBEAThC8IXBEEQBEEQBEEQBEEQBEEQBEFwN9tss83dbLOd29zNNtu5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EsussMof1vjLOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/8MvB//hFkiGFGGGWMcSaYZIppZphljnkWWGSJZVZY5Q9r/GWdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH34Z+PwRZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWOUPa/xlnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9+GfjXfwQZYpgRRhljnAkmmWKaGWaZY54FFllimRVW+cMaf1lng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh18G/q8/ggwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqv8YY2/rLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDLwP/9x9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVf6wxl/W2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXge8fQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVX+sMZf1tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhl4H/548gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKn9Y4y/rbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLwP/7R5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVP6zxl3U22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++GXg//sjyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMof1vjLOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/8MhD4t/7N/39ygdh9eJwt1yETAgCXllFWPxUVlVVUVFR0UVFRUVFRUQkEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEFz9zi3nBzwz78z9Q+BPAv/v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IYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+vv4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sdAVH8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgH+jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/EP9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX+kP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MRDTn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPjH+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/RH8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgn+rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38MxPVnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/pn+DDLEMCOM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GWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375YyCrP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfDf9WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+h/4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfA/9SfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4YyOnPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/C/9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgf+tP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfB/9GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwbyf/T/AtC86Mh4nC3RoRcBAIDYYXvvgiAIgiAIgiAIgiDYZpttdrOb3dlmm2222WZ3ttmd22wTBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEHY27vvV74/4PcH+b8W+P8FGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgr/+Vf8AgQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8Df8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bv+k/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxUPCfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Fv+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/bfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Dv+M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888MvfwwU/WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+rv8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfA3/OfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Pv+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfAyX/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX/gP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfCH/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/0H8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WOg7D+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwj/xnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/sh/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4B/7zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DFT8Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv6J/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8Af+88gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8if8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sdA1X8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgn/rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/DP/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX/uP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MVDzn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPgX/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/0n8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgX/nPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M1P1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/rX/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwL/xn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPi3/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMN/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/5z+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHw7/1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/oP/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQNN/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4D/6zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPwn/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4H/7D+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHQ8p9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4L/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsus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YpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Cf+s8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8M/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bf+4/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxMPOfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Bf+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/qP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfAv/WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwbm/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/yn8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgX/vPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/Bv/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgYX/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwL/1n0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPh3/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/3n8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WNg6T+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwH/xnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/qP/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwH/yn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GFj5zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPxn/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4H/4j+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwX/1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G1v4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8Df+Y/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8N/8Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv67/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8DGfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+B/+M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8T/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+B/+U/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxsPWfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+N/+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/uP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfAX/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwM7/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/9J9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4P/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8D/9d/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvljYP9X/j/T5ulAeJwt0a8fAQCA3mG3zwVBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBEARBsM0229zNNttss80227nNbbZzm23247PtecP7/AHfP9z/QeD/LsgQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA3/5//uHDDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwF/Rn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPir+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMH/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/pj+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHw1/VnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/ob+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwFF/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4G/qzyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPwt/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/rT+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DFw0p9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4I/0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+BP9afQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Dv6M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA2f9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgb+rP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfD39GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+vv4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfARX8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgH+jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/EP9GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgX+kP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MXDVn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPjH+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/RH8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgn+rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M3PRnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/pn+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwD/Xn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPgX+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwN3/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/qT+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwr/RnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/rX+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwEN/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsu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cy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgb+kP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfCX9WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+iv4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sc/f/j/P39gkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/qr+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwF/Tn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPjr+jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMh/RlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4G/oT+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwN/VnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/pb+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQFh/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4E/1Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv62/gwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8Df0Z9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hiI6M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8Xf0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bv6c/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8Pf1Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/BqL6M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA/9AfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Af6s8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8I/0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+BmP4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAP9afQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Cf6M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA/9UfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375YyCuP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfDP9GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+uf4MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAn+nPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38MJPRnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/oX+DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xy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vPLGOx988sU3P/zyx0BOfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+B/6c8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwz8b/0ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+B/6M/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wxkP+j/xcsy/jIeJwt0aEXAQCA2GFv74IgCIIgCIIgCIIg2GabbXazm93ZZpttttlmd7bZndtsEwRBEARBEARBEARBEARBEARBEARBEARB2Nu771e+P+D3B/m/Fvj/BRlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4K//lX/AIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/A3/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgb/pP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MVDwn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPhb/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwN/238GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPg7/jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38MFP1nkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/q7/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwN/zn0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPj7/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwMl/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/4D+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+88c4Hn3zxzQ+//DHwh/4zyBDDjDDKGONMMMkU08wwyxzzLLDIEsussMoa62ywyRbb7LDLHvsccMgRx5xwyhnnXHDJFdfccMsd9zzwyBPPvPDKG+988MkX3/zwyx8D/9B/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvljoOw/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8I/8Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv7IfwYZYpgRRhljnAkmmWKaGWaZY54FFllimRVWWWOdDTbZYpsddtljnwMOOeKYE04545wLLrnimhtuueOeBx554pkXXnnjnQ8++eKbH375Y+Af+88gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888MvfwxU/GeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+if8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAH/vPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/In/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQNV/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4J/6zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPwz/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/7j+DDDHMCKOMMc4Ek0wxzQyzzDHPAossscwKq6yxzgabbLHNDrvssc8BhxxxzAmnnHHOBZdccc0Nt9xxzwOPPPHMC6+8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/DHw3/xnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/rv/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHQMd/BhlimBFGGWOcCSaZYpoZZpljngUWWWKZFVZZY50NNtlimx122WOfAw454pgTTjnjnAsuueKaG265454HHnnimRdeeeOdDz754psffvlj4H/4zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DPy5/wwyxDAjjDLGOBNMMsU0M8wyxzwLLLLEMiusssY6G2yyxTY77LLHPgcccsQxJ5xyxjkXXHLFNTfccsc9DzzyxDMvvPLGOx988sU3P/zyx8Bf+M8gQwwzwihjjDPBJFNMM8Msc8yzwCJLLLPCKmuss8EmW2yzwy577HPAIUccc8IpZ5xzwSVXXHPDLXfc88AjTzzzwitvvPPBJ19888Mvfwx0/WeQIYYZYZQxxplgkimmmWGWOeZZYJEllllhlTXW2WCTLbbZYZc99jngkCOOOeGUM8654JIrrrnhljvueeCRJ5554ZU33vngky+++eGXPwb+0n8GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WPgf/rPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/C//GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgZ7/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwP/2n0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPg//jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwP/138GGWKYEUYZY5wJJplimhlmmWOeBRZZYpkVVlljnQ022WKbHXbZY58DDjnimBNOOeOcCy654pobbrnjngceeeKZF155450PPvnimx9++WOg/1f+Py5g+QR4nC3RoRcBAGLAYW/vgiAIgiAIgiAIgiAIgiAIgiAIgiAIgiC4zd1s5zbbbLP3BEEQBEEQBEEQBEEQBEEQBEEQhL179/3K9wf8/tD/h8DfCjLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwB//7h8YZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bf/SfQYYYZoRRxhhngkmmmGaGWeaYZ4FFllhmhVXWWGeDTbbYZodd9tjngEOOOOaEU84454JLrrjmhlvuuOeBR5545oVX3njng0+++OaHX/4Y+Cf/GWSIYUYYZYxxJphkimlmmGWOeRZYZIllVlhljXU22GSLbXbYZY99DjjkiGNOOOWMcy645IprbrjljnseeOSJZ1545Y13Pvjki29++OWPgYH/DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwJ/8Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv7sP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MfDP/jPIEMOMMMoY40wwyRTTzDDLHPMssMgSy6ywyhrrbLDJFtvssMse+xxwyBHHnHDKGedccMkV19xwyx33PPDIE8+88Mob73zwyRff/PDLHwND/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4F/8Z9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4V/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bv/jPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38MjPxnkCGGGWGUMcaZYJIppplhljnmWWCRJZZZYZU11tlgky222WGXPfY54JAjjjnhlDPOueCSK6654ZY77nngkSeeeeGVN9754JMvvvnhlz8G/uo/gwwxzAijjDHOBJNMMc0Ms8wxzwKLLLHMCqussc4Gm2yxzQ677LHPAYccccwJp5xxzgWXXHHNDbfccc8DjzzxzAuvvPHOB5988c0Pv/wx8G/+M8gQw4wwyhjjTDDJFNPMMMsc8yywyBLLrLDKGutssMkW2+ywyx77HHDIEceccMoZ51xwyRXX3HDLHfc88MgTz7zwyhvvfPDJF9/88MsfA//uP4MMMcwIo4wxzgSTTDHNDLPMMc8CiyyxzAqrrLHOBptssc0Ou+yxzwGHHHHMCaeccc4Fl1xxzQ233HHPA4888cwLr7zxzgeffPHND7/8MTD2n0GGGGaEUcYYZ4JJpphmhlnmmGeBRZZYZoVV1lhng0222GaHXfbY54BDjjjmhFPOOOeCS6645oZb7rjngUeeeOaFV95454NPvvjmh1/+GPgP/xlkiGFGGGWMcSaYZIppZphljnkWWGSJZVZYZY11Nthki2122GWPfQ445IhjTjjljHMuuOSKa2645Y57HnjkiWdeeOWNdz745Itvfvjlj4H/9J9BhhhmhFHGGGeCSaaYZoZZ5phngUWWWGaFVdZYZ4NNtthmh1322OeAQ4445oRTzjjngkuuuOaGW+6454FHnnjmhVfeeOeDT7745odf/hj4L/8ZZIhhRhhljHEmmGSKaWaYZY55FlhkiWVWWGWNdTbYZIttdthlj30OOOSIY0445YxzLrjkimtuuOWOex545IlnXnjljXc++OSLb3745Y+Bif8MMsQwI4wyxjgTTDLFNDPMMsc8CyyyxDIrrLLGOhtsssU2O+yyxz4HHHLEMSeccsY5F1xyxTU33HLHPQ888sQzL7zyxjsffPLFNz/88sfAf/vPIEMMM8IoY4wzwSRTTDPDLHPMs8AiSyyzwiprrLPBJltss8Mue+xzwCFHHHPCKWecc8ElV1xzwy133PPAI08888Irb7zzwSdffPPDL38M/I//DDLEMCOMMsY4E0wyxTQzzDLHPAssssQyK6yyxjobbLLFNjvsssc+BxxyxDEnnHLGORdccsU1N9xyxz0PPPLEMy+88sY7H3zyxTc//PLHwP/6zyBDDDPCKGOMM8EkU0wzwyxzzLPAIksss8Iqa6yzwSZbbLPDLnvsc8AhRxxzwilnnHPBJVdcc8Mtd9zzwCNPPPPCK2+888EnX3zzwy9/DEz9Z5AhhhlhlDHGmWCSKaaZYZY55llgkSWWWWGVNdbZYJMtttlhlz32OeCQI4454ZQzzrngkiuuueGWO+554JEnnnnhlTfe+eCTL7754Zc/Bv7PfwYZYpgRRvn/KGWPag==AgAAAACAAABGJgAANQAAACAAAAA=eJztwSEBAAAAgKDu/8EeAQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGME7AEx4nO3BMQEAAADCoH/9AxtEoAAAAAAAAAAAAPg12pp+zA== + + diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp index 5f063a4e3ca..bafc1bf89da 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp @@ -1078,7 +1078,6 @@ void VTKPolyDataWriterInterface::writeParticleRegions( real64 const time, writeTimestamp( ug.GetPointer(), time ); writeParticleFields( region, ug->GetCellData() ); - // string const regionDir = joinPath( path, region.getName() ); writeUnstructuredGrid( path, region, ug.GetPointer() ); } ); } @@ -1185,8 +1184,6 @@ void VTKPolyDataWriterInterface::writeVtmFile( integer const cycle, string const meshPath = joinPath( getCycleSubFolder( cycle ), meshBodyName, meshLevelName ); - // int const mpiSize = MpiWrapper::commSize(); - auto addElementRegion = [&]( ElementRegionBase const & region ) { std::vector< string > const blockPath{ meshBody.getName(), meshLevel.getName(), region.getCatalogName(), region.getName() }; diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp index 44bb86e3c71..20bbc54923a 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp @@ -219,7 +219,7 @@ class VTKPolyDataWriterInterface void clearData(); -private: +protected: /** * @brief Check if plotting is enabled for this field @@ -234,7 +234,7 @@ class VTKPolyDataWriterInterface * @param[in] time the time-step * @param[in] elemManager the ElementRegionManager containing the CellElementRegions to be output * @param[in] nodeManager the NodeManager containing the nodes of the domain to be output - * @param[in] path the root path where the mesh will be written + * @param[in] path the path to the file to output */ void writeCellElementRegions( real64 time, ElementRegionManager const & elemManager, @@ -247,7 +247,7 @@ class VTKPolyDataWriterInterface * @param[in] time the time-step * @param[in] elemManager the ElementRegionManager containing the WellElementRegions to be output * @param[in] nodeManager the NodeManager containing the nodes of the domain to be output - * @param[in] path the root path where the mesh will be written + * @param[in] path The path to the file to output */ void writeWellElementRegions( real64 time, ElementRegionManager const & elemManager, @@ -289,7 +289,6 @@ class VTKPolyDataWriterInterface * @param[in] domain the DomainPartition containing all the regions to be output and referred to in the VTM file * @param[in] vtmWriter a writer specialized for the VTM file format */ - void writeVtmFile( integer const cycle, DomainPartition const & domain, VTKVTMWriter const & vtmWriter ) const; @@ -312,7 +311,7 @@ class VTKPolyDataWriterInterface vtkCellData * cellData ) const; /** - * @brief Writes all the fields associated to the elements of \p er if their plotlevel is <= m_plotLevel + * @brief Writes all the fields associated to the elements of \p region if their plotlevel is <= m_plotLevel * @param[in] region ParticleRegion being written * @param[in] cellData a VTK object containing all the fields associated with the elements */ @@ -332,7 +331,7 @@ class VTKPolyDataWriterInterface ObjectManagerBase const & region, vtkUnstructuredGrid * ug ); -private: +protected: /// Output directory name string m_outputDir; diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index 7e811191bb4..d60a61663b7 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -39,6 +39,7 @@ #include "fileIO/Outputs/OutputBase.hpp" #include "fileIO/Outputs/OutputManager.hpp" #include "functions/FunctionManager.hpp" +#include "mesh/ExternalDataSourceManager.hpp" #include "mesh/DomainPartition.hpp" #include "mesh/MeshBody.hpp" #include "mesh/MeshManager.hpp" @@ -73,6 +74,8 @@ ProblemManager::ProblemManager( conduit::Node & root ): setInputFlags( InputFlags::PROBLEM_ROOT ); + registerGroup< ExternalDataSourceManager >( groupKeys.externalDataSourceManager ); + m_fieldSpecificationManager = ®isterGroup< FieldSpecificationManager >( groupKeys.fieldSpecificationManager ); m_eventManager = ®isterGroup< EventManager >( groupKeys.eventManager ); diff --git a/src/coreComponents/mainInterface/ProblemManager.hpp b/src/coreComponents/mainInterface/ProblemManager.hpp index 7787b31bffd..6067f1b4391 100644 --- a/src/coreComponents/mainInterface/ProblemManager.hpp +++ b/src/coreComponents/mainInterface/ProblemManager.hpp @@ -243,6 +243,7 @@ class ProblemManager : public dataRepository::Group dataRepository::GroupKey constitutiveManager = { "Constitutive" }; ///< Constitutive key dataRepository::GroupKey domain = { "domain" }; ///< Domain key dataRepository::GroupKey eventManager = { "Events" }; ///< Events key + dataRepository::GroupKey externalDataSourceManager = { "ExternalDataSource" }; ///< External Data Source key dataRepository::GroupKey fieldSpecificationManager = { "FieldSpecifications" }; ///< Field specification key dataRepository::GroupKey functionManager = { "Functions" }; ///< Functions key dataRepository::GroupKey geometricObjectManager = { "Geometry" }; ///< Geometry key diff --git a/src/coreComponents/mesh/CMakeLists.txt b/src/coreComponents/mesh/CMakeLists.txt index d9a9e24b6b5..277df76bc4a 100644 --- a/src/coreComponents/mesh/CMakeLists.txt +++ b/src/coreComponents/mesh/CMakeLists.txt @@ -35,6 +35,8 @@ set( mesh_headers ElementRegionManager.hpp ElementSubRegionBase.hpp ElementType.hpp + ExternalDataSourceBase.hpp + ExternalDataSourceManager.hpp EmbeddedSurfaceNodeManager.hpp EmbeddedSurfaceSubRegion.hpp MeshFields.hpp @@ -80,12 +82,13 @@ set( mesh_headers generators/InternalMeshGenerator.hpp generators/InternalWellGenerator.hpp generators/InternalWellboreGenerator.hpp + generators/MeshComponentBase.hpp generators/MeshGeneratorBase.hpp generators/ParMETISInterface.hpp generators/ParticleMeshGenerator.hpp generators/PartitionDescriptor.hpp generators/PrismUtilities.hpp - generators/WellGeneratorABC.hpp + generators/Region.hpp generators/WellGeneratorBase.hpp mpiCommunications/CommID.hpp mpiCommunications/CommunicationTools.hpp @@ -124,6 +127,8 @@ set( mesh_sources ElementSubRegionBase.cpp EmbeddedSurfaceNodeManager.cpp EmbeddedSurfaceSubRegion.cpp + ExternalDataSourceBase.cpp + ExternalDataSourceManager.cpp FaceElementSubRegion.cpp FaceManager.cpp MeshBody.cpp @@ -156,9 +161,11 @@ set( mesh_sources generators/InternalMeshGenerator.cpp generators/InternalWellGenerator.cpp generators/InternalWellboreGenerator.cpp + generators/MeshComponentBase.cpp generators/MeshGeneratorBase.cpp generators/ParMETISInterface.cpp generators/ParticleMeshGenerator.cpp + generators/Region.cpp generators/WellGeneratorBase.cpp mpiCommunications/CommID.cpp mpiCommunications/CommunicationTools.cpp @@ -184,6 +191,7 @@ if( ENABLE_VTK ) set( mesh_headers ${mesh_headers} generators/CollocatedNodes.hpp generators/VTKFaceBlockUtilities.hpp + generators/VTKHierarchicalDataSource.hpp generators/VTKMeshGenerator.hpp generators/VTKMeshGeneratorTools.hpp generators/VTKWellGenerator.hpp @@ -192,6 +200,7 @@ if( ENABLE_VTK ) set( mesh_sources ${mesh_sources} generators/CollocatedNodes.cpp generators/VTKFaceBlockUtilities.cpp + generators/VTKHierarchicalDataSource.cpp generators/VTKMeshGenerator.cpp generators/VTKMeshGeneratorTools.cpp generators/VTKWellGenerator.cpp diff --git a/src/coreComponents/mesh/ExternalDataSourceBase.cpp b/src/coreComponents/mesh/ExternalDataSourceBase.cpp new file mode 100644 index 00000000000..a3b8fd0c1b2 --- /dev/null +++ b/src/coreComponents/mesh/ExternalDataSourceBase.cpp @@ -0,0 +1,54 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +#include "ExternalDataSourceBase.hpp" + +namespace geos +{ +using namespace dataRepository; + +ExternalDataSourceBase::ExternalDataSourceBase( string const & name, Group * const parent ): + Group( name, parent ) +{ + setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); +} + +Group * ExternalDataSourceBase::createChild( string const & childKey, string const & childName ) +{ + GEOS_LOG_RANK_0( "Adding External Data Source: " << childKey << ", " << childName ); + std::unique_ptr< ExternalDataSourceBase > event = ExternalDataSourceBase::CatalogInterface::factory( childKey, childName, this ); + return &this->registerGroup< ExternalDataSourceBase >( childName, std::move( event ) ); +} + +void ExternalDataSourceBase::expandObjectCatalogs() +{ + // Only add children if the parent is of type EventManager + // otherwise, this would fall into a loop + if( strcmp( this->getParent().getName().c_str(), "ExternalDataSource" ) == 0 ) + { + for( auto & catalogIter: ExternalDataSourceBase::getCatalog()) + { + createChild( catalogIter.first, catalogIter.first ); + } + } +} + +ExternalDataSourceBase::CatalogInterface::CatalogType & ExternalDataSourceBase::getCatalog() +{ + static ExternalDataSourceBase::CatalogInterface::CatalogType catalog; + return catalog; +} + + +} diff --git a/src/coreComponents/mesh/ExternalDataSourceBase.hpp b/src/coreComponents/mesh/ExternalDataSourceBase.hpp new file mode 100644 index 00000000000..8dabca1abe0 --- /dev/null +++ b/src/coreComponents/mesh/ExternalDataSourceBase.hpp @@ -0,0 +1,77 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University + * Copyright (c) 2018-2020 TotalEnergies + * Copyright (c) 2019- GEOSX Contributors + * All rights reserved + * + * See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. + * ------------------------------------------------------------------------------------------------------------ + */ + +/** + * @file ExternalDataSourceBase.hpp + */ + +#ifndef GEOS_MESH_EXTERNALDATASOURCEBASE_HPP +#define GEOS_MESH_EXTERNALDATASOURCEBASE_HPP + +#include "dataRepository/Group.hpp" +#include "dataRepository/WrapperBase.hpp" +#include "codingUtilities/Utilities.hpp" +#include "common/DataTypes.hpp" + + +namespace geos +{ + +/** + * @class ExternalDataSourceBase + * @brief The ExternalDataSourceBase class provides an abstract base class implementation for different mesh types. + * The ExternalDataSourceBase is the Group specialization for different type of mesh handling. + */ +class ExternalDataSourceBase : public dataRepository::Group +{ +public: + + /** + * @brief Main constructor for ExternalDataSourceBase base class. + * @param[in] name of the ExternalDataSourceBase object + * @param[in] parent the parent Group pointer for the ExternalDataSourceBase object + */ + explicit ExternalDataSourceBase( string const & name, + Group * const parent ); + + /// This function is used to expand any catalogs in the data structure + virtual void expandObjectCatalogs() override; + + /// using alias for templated Catalog ExternalDataSourceBase type + using CatalogInterface = dataRepository::CatalogInterface< ExternalDataSourceBase, string const &, Group * const >; + + /** + * @brief Create a new geometric object (box, plane, etc) as a child of this group. + * @param childKey the catalog key of the new geometric object to create + * @param childName the name of the new geometric object in the repository + * @return the group child + */ + virtual Group * createChild( string const & childKey, string const & childName ) override; + + /** + * @brief Accessor for the singleton Catalog object + * @return a static reference to the Catalog object + */ + static CatalogInterface::CatalogType & getCatalog(); + + /** + * @brief This function provides the capability to open an external data repository + * from another component whatever its format. + */ + virtual void open() = 0; +}; + +} + +#endif /* GEOS_MESH_EXTERNALDATASOURCEBASE_HPP */ diff --git a/src/coreComponents/mesh/ExternalDataSourceManager.cpp b/src/coreComponents/mesh/ExternalDataSourceManager.cpp new file mode 100644 index 00000000000..c8259594713 --- /dev/null +++ b/src/coreComponents/mesh/ExternalDataSourceManager.cpp @@ -0,0 +1,63 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 "ExternalDataSourceManager.hpp" +#include "ExternalDataSourceBase.hpp" + + +namespace geos +{ + +using namespace dataRepository; + +ExternalDataSourceManager::ExternalDataSourceManager( string const & name, + Group * const parent ): + Group( name, parent ) +{ + setInputFlags( InputFlags::REQUIRED ); +} + +ExternalDataSourceManager::~ExternalDataSourceManager() +{} + +Group * ExternalDataSourceManager::createChild( string const & childKey, string const & childName ) +{ + GEOS_LOG_RANK_0( "Adding External Data Source: " << childKey << ", " << childName ); + std::unique_ptr< ExternalDataSourceBase > externalDataSource = ExternalDataSourceBase::CatalogInterface::factory( childKey, childName, this ); + return &this->registerGroup< ExternalDataSourceBase >( childName, std::move( externalDataSource ) ); +} + + +void ExternalDataSourceManager::expandObjectCatalogs() +{ + // During schema generation, register one of each type derived from ExternalDataSourceBase here + for( auto & catalogIter: ExternalDataSourceBase::getCatalog()) + { + createChild( catalogIter.first, catalogIter.first ); + } +} + + +void ExternalDataSourceManager::open( DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +{ + forSubGroups< ExternalDataSourceBase >( []( ExternalDataSourceBase & external ) + { + external.open(); + } ); +} + + +} /* namespace geos */ diff --git a/src/coreComponents/mesh/ExternalDataSourceManager.hpp b/src/coreComponents/mesh/ExternalDataSourceManager.hpp new file mode 100644 index 00000000000..2e6141af4e3 --- /dev/null +++ b/src/coreComponents/mesh/ExternalDataSourceManager.hpp @@ -0,0 +1,76 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ExternalDataSourceManager.hpp + */ + +#ifndef GEOS_MESH_EXTERNALDATASOURCEMANAGER_HPP_ +#define GEOS_MESH_EXTERNALDATASOURCEMANAGER_HPP_ + +#include "dataRepository/Group.hpp" +#include "mesh/DomainPartition.hpp" + +namespace geos +{ + +/** + * @class ExternalDataSourceManager + * @brief This class manages a data repository whereof objects can be imported to GEOS (reservoir mesh, well mesh) + */ +class ExternalDataSourceManager : public dataRepository::Group +{ +public: + + /** + * @brief Constructor for the ExternalDataSourceManager object. + * @param[in] name the name of the ExternalDataSourceManager object in the repository + * @param[in] parent the parent group of the ExternalDataSourceManager object being constructed + */ + ExternalDataSourceManager( string const & name, + Group * const parent ); + + virtual ~ExternalDataSourceManager() override; + + + /** + * @brief Create a new sub data repository. + * @param[in] childKey the key of the new object in the ObjectCatalog + * @param[in] childName the name of the new object in the collection of sub-meshes + * @return A pointer to the Group node in the dataRepository of the new object created + */ + virtual Group * createChild( string const & childKey, string const & childName ) override; + + /// This function is used to expand any catalogs in the data structure + virtual void expandObjectCatalogs() override; + + /** + * @brief Generate the meshes of the physical DomainPartition. + * @param[in] domain a reference to the physical domain + */ + void open( DomainPartition & domain ); + +private: + + /** + * @brief Deleted default constructor of the ExternalDataSourceManager + */ + ExternalDataSourceManager() = delete; + +}; + +} /* namespace geos */ + +#endif /* GEOS_MESH_EXTERNALDATASOURCEMANAGER_HPP_ */ diff --git a/src/coreComponents/mesh/MeshManager.cpp b/src/coreComponents/mesh/MeshManager.cpp index 3fa5ab4825a..b88a4ca9a31 100644 --- a/src/coreComponents/mesh/MeshManager.cpp +++ b/src/coreComponents/mesh/MeshManager.cpp @@ -44,8 +44,8 @@ MeshManager::~MeshManager() Group * MeshManager::createChild( string const & childKey, string const & childName ) { GEOS_LOG_RANK_0( "Adding Mesh: " << childKey << ", " << childName ); - std::unique_ptr< MeshGeneratorBase > solver = MeshGeneratorBase::CatalogInterface::factory( childKey, childName, this ); - return &this->registerGroup< MeshGeneratorBase >( childName, std::move( solver ) ); + std::unique_ptr< MeshGeneratorBase > mesh = MeshGeneratorBase::CatalogInterface::factory( childKey, childName, this ); + return &this->registerGroup< MeshGeneratorBase >( childName, std::move( mesh ) ); } diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp index ae15917ebc1..81fc219dbbc 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp @@ -63,5 +63,5 @@ void InternalWellGenerator::postInputInitialization() } -REGISTER_CATALOG_ENTRY( WellGeneratorBase, InternalWellGenerator, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( MeshComponentBase, InternalWellGenerator, string const &, Group * const ) } diff --git a/src/coreComponents/mesh/generators/MeshComponentBase.cpp b/src/coreComponents/mesh/generators/MeshComponentBase.cpp new file mode 100644 index 00000000000..896bb0745a0 --- /dev/null +++ b/src/coreComponents/mesh/generators/MeshComponentBase.cpp @@ -0,0 +1,39 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 "MeshComponentBase.hpp" + +namespace geos +{ + +using namespace dataRepository; + +MeshComponentBase::MeshComponentBase( const string & name, + Group * const parent ) + : Group( name, parent ) +{ + setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); +} + +MeshComponentBase::~MeshComponentBase() +{} + +MeshComponentBase::CatalogInterface::CatalogType & MeshComponentBase::getCatalog() +{ + static CatalogInterface::CatalogType catalog; + return catalog; +} + +} diff --git a/src/coreComponents/mesh/generators/MeshComponentBase.hpp b/src/coreComponents/mesh/generators/MeshComponentBase.hpp new file mode 100644 index 00000000000..3f1553dd449 --- /dev/null +++ b/src/coreComponents/mesh/generators/MeshComponentBase.hpp @@ -0,0 +1,70 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 MeshComponentBase.hpp + * + */ + +#ifndef GEOS_MESH_GENERATORS_MESHCOMPONENTBASE_HPP_ +#define GEOS_MESH_GENERATORS_MESHCOMPONENTBASE_HPP_ + +#include "dataRepository/Group.hpp" +#include "codingUtilities/Utilities.hpp" +#include "common/DataTypes.hpp" + + +namespace geos +{ + +/** + * @class MeshComponentBase + * + * Abstract base class defining the information provided by any the well generator class. + */ +class MeshComponentBase : public dataRepository::Group +{ +public: + + /** + * @brief Constructor. + * @param name name of the object in the data hierarchy. + * @param parent pointer to the parent group in the data hierarchy. + */ + MeshComponentBase( string const & name, + Group * const parent ); + + /** + * @brief Default destructor. + */ + virtual ~MeshComponentBase(); + + /** + * @brief Get the catalog name. + * @return the name of this type in the catalog + */ + static string catalogName() { return "MeshComponentBase"; } + + /** + * @brief Type alias for catalog interface used by this class. See CatalogInterface. + */ + using CatalogInterface = dataRepository::CatalogInterface< MeshComponentBase, string const &, Group * const >; + + /// @copydoc dataRepository::Group::getCatalog() + static CatalogInterface::CatalogType & getCatalog(); +}; + +} +#endif /* GEOS_MESH_GENERATORS_MESHCOMPONENTBASE_HPP_ */ diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp index b4de9e8fc33..8a474eaf09f 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp @@ -16,7 +16,7 @@ #include "MeshGeneratorBase.hpp" #include "mesh/generators/CellBlockManager.hpp" #include "mesh/generators/ParticleBlockManager.hpp" - +#include "mesh/generators/MeshComponentBase.hpp" namespace geos { using namespace dataRepository; @@ -30,14 +30,14 @@ MeshGeneratorBase::MeshGeneratorBase( string const & name, Group * const parent Group * MeshGeneratorBase::createChild( string const & childKey, string const & childName ) { GEOS_LOG_RANK_0( "Adding Mesh attribute: " << childKey << ", " << childName ); - std::unique_ptr< WellGeneratorBase > wellGen = WellGeneratorBase::CatalogInterface::factory( childKey, childName, this ); - return &this->registerGroup< WellGeneratorBase >( childName, std::move( wellGen ) ); + std::unique_ptr< MeshComponentBase > comp = MeshComponentBase::CatalogInterface::factory( childKey, childName, this ); + return &this->registerGroup< MeshComponentBase >( childName, std::move( comp ) ); } void MeshGeneratorBase::expandObjectCatalogs() { - // During schema generation, register one of each type derived from WellGeneratorBase here - for( auto & catalogIter: WellGeneratorBase::getCatalog()) + // During schema generation, register one of each type derived from MeshComponentBase here + for( auto & catalogIter: MeshComponentBase::getCatalog()) { createChild( catalogIter.first, catalogIter.first ); } diff --git a/src/coreComponents/mesh/generators/Region.cpp b/src/coreComponents/mesh/generators/Region.cpp new file mode 100644 index 00000000000..05212f599d8 --- /dev/null +++ b/src/coreComponents/mesh/generators/Region.cpp @@ -0,0 +1,46 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 Region.cpp + */ + +#include "Region.hpp" + + +namespace geos +{ + +using namespace dataRepository; + +Region::Region( string const & name, + Group * const parent ) + : MeshComponentBase( name, parent ) +{ + registerWrapper( viewKeyStruct::idString(), &m_id ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Interval region identifier" ); + + registerWrapper( viewKeyStruct::pathInRepositoryString(), &m_pathInRepository ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Path of the dataset in the repository" ); +} + +Region::~Region() +{} + +REGISTER_CATALOG_ENTRY( MeshComponentBase, Region, string const &, Group * const ) + +} diff --git a/src/coreComponents/mesh/generators/Region.hpp b/src/coreComponents/mesh/generators/Region.hpp new file mode 100644 index 00000000000..4fce224a0a5 --- /dev/null +++ b/src/coreComponents/mesh/generators/Region.hpp @@ -0,0 +1,76 @@ + +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 Region.hpp + */ + +#ifndef GEOS_MESH_GENERATORS_REGION_HPP +#define GEOS_MESH_GENERATORS_REGION_HPP + +#include "MeshComponentBase.hpp" + +namespace geos +{ + +/** + * @brief Region parameters with Group capabilities + * + * This class has dataRepository::Group capabilities to allow for XML input. + * + */ +class Region : public MeshComponentBase +{ +public: + /** + * @brief Constructor. + * @param name name of the object in the data hierarchy. + * @param parent pointer to the parent group in the data hierarchy. + */ + Region( const string & name, Group * const parent ); + + /** + * @brief Default destructor. + */ + ~Region() override; + + /** + * @brief Get the catalog name. + * @return the name of this type in the catalog + */ + static string catalogName() { return "Region"; } + + ///@cond DO_NOT_DOCUMENT + /// Keys appearing in XML + struct viewKeyStruct + { + static constexpr char const * idString() { return "id"; } + static constexpr char const * pathInRepositoryString() { return "pathInRepository"; } + }; + /// @endcond + +private: + + /// Interval region identifier + integer m_id = 0; + + /// Path of the dataset in the repository + string m_pathInRepository = ""; +}; + +} // namespace GEOS + +#endif diff --git a/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.cpp b/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.cpp new file mode 100644 index 00000000000..cd7c1ce27ba --- /dev/null +++ b/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.cpp @@ -0,0 +1,72 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 VTKHierarchicalDataSource.cpp + */ + +#include "mesh/generators/VTKHierarchicalDataSource.hpp" +#include "mesh/generators/VTKUtilities.hpp" +#include + +namespace geos +{ +using namespace dataRepository; + +VTKHierarchicalDataSource::VTKHierarchicalDataSource( string const & name, + Group * const parent ) + : ExternalDataSourceBase( name, parent ) +{ + registerWrapper( viewKeyStruct::filePathString(), &m_filePath ). + setRTTypeName( rtTypes::CustomTypes::groupNameRef ). + setInputFlag( InputFlags::REQUIRED ). + setApplyDefaultValue( "attribute" ). + setDescription( "Path to the mesh file" ); +} + +void VTKHierarchicalDataSource::open() +{ + string const extension = m_filePath.extension(); + GEOS_ERROR_IF( extension != "vtpc", "Unsupported vtk extension. File must be a vtpc file" ); + + vtkNew< vtkXMLPartitionedDataSetCollectionReader > reader; + reader->SetFileName( m_filePath.c_str()); + reader->Update(); + + m_collection = vtkSmartPointer< vtkPartitionedDataSetCollection >( vtkPartitionedDataSetCollection::SafeDownCast( reader->GetOutput())); + m_dataAssembly = vtkSmartPointer< vtkDataAssembly >( m_collection->GetDataAssembly() ); + + GEOS_ERROR_IF( m_dataAssembly == nullptr, "No data Assembly attached to this collection" ); +} + +vtkSmartPointer< vtkPartitionedDataSet > +VTKHierarchicalDataSource::search( string const & path ) +{ + int node = m_dataAssembly->GetFirstNodeByPath( path.c_str()); + GEOS_ERROR_IF( node == -1, "Node doesn't exist" ); + GEOS_ERROR_IF( m_dataAssembly->GetNumberOfChildren( node ) > 0, "Only leaf nodes can be queried." ); + + std::vector< unsigned int > indices = m_dataAssembly->GetDataSetIndices( node, false ); + + GEOS_ERROR_IF( indices.size() == 0, "Queried node has no dataset attached." ); + GEOS_ERROR_IF( indices.size() > 1, "Current constraint each tree node has only one dataset." ); + + return m_collection->GetPartitionedDataSet( indices[0] ); +} + +REGISTER_CATALOG_ENTRY( ExternalDataSourceBase, VTKHierarchicalDataSource, string const &, Group * const ) + + +} diff --git a/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.hpp b/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.hpp new file mode 100644 index 00000000000..bf737d4913b --- /dev/null +++ b/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.hpp @@ -0,0 +1,93 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 VTKHierarchicalDataSource.hpp + */ + +#ifndef GEOS_MESH_GENERATORS_VTKHIERARCHICALDATASOURCE_HPP +#define GEOS_MESH_GENERATORS_VTKHIERARCHICALDATASOURCE_HPP + +#include "dataRepository/Group.hpp" +#include "mesh/ExternalDataSourceBase.hpp" + +#include +#include +#include +#include +#include + +namespace geos +{ + +/** + * @class VTKHierarchicalDataSource + * @brief This class provides an API to access VTKPartitionedDataSetCollection through a vtkDataAssembly + */ +class VTKHierarchicalDataSource : public ExternalDataSourceBase +{ +public: + + /** + * @brief Main constructor for VTKHierarchicalDataSource base class. + * @param[in] name of the VTKHierarchicalDataSource object + * @param[in] parent the parent Group pointer for the VTKHierarchicalDataSource object + */ + VTKHierarchicalDataSource( string const & name, Group * const parent ); + + virtual ~VTKHierarchicalDataSource() override = default; + + /** + * @brief Return the name of the MeshGenerator in object catalog. + * @return string that contains the catalog name of the MeshGenerator + */ + static string catalogName() { return "VTKHierarchicalDataSource"; } + + /** + * @brief Opens a vtkPartitionedDataSetCollection and gets the colletion and the associated dataAssembly + * + */ + void open() override; + + /** + * @brief Performs a search in the dataAssembly to find a node of PartitionedDataSets + * + * @param path the path in the data assembly tree + * @return the found dataset + */ + vtkSmartPointer< vtkPartitionedDataSet > search( string const & path ); + +private: + + ///@cond DO_NOT_DOCUMENT + struct viewKeyStruct + { + constexpr static char const * filePathString() { return "file"; } + }; + /// @endcond + + /// Path to the mesh file + Path m_filePath; + + /// DataAssembly to query the dataset collection + vtkSmartPointer< vtkDataAssembly > m_dataAssembly; + + /// Collection of datasets + vtkSmartPointer< vtkPartitionedDataSetCollection > m_collection; +}; + +} + +#endif diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp index d1402d21821..7ed1c0ae2df 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp @@ -19,22 +19,30 @@ #include "VTKMeshGenerator.hpp" +#include "mesh/ExternalDataSourceManager.hpp" #include "mesh/generators/VTKFaceBlockUtilities.hpp" #include "mesh/generators/VTKMeshGeneratorTools.hpp" #include "mesh/generators/CellBlockManager.hpp" +#include "mesh/generators/Region.hpp" #include "common/DataTypes.hpp" #include +#include +#include +#include namespace geos { using namespace dataRepository; - VTKMeshGenerator::VTKMeshGenerator( string const & name, Group * const parent ) - : ExternalMeshGeneratorBase( name, parent ) + : ExternalMeshGeneratorBase( name, parent ), + m_dataSource( nullptr ) { + getWrapperBase( ExternalMeshGeneratorBase::viewKeyStruct::filePathString()). + setInputFlag( InputFlags::OPTIONAL ); + registerWrapper( viewKeyStruct::regionAttributeString(), &m_attributeName ). setRTTypeName( rtTypes::CustomTypes::groupNameRef ). setInputFlag( InputFlags::OPTIONAL ). @@ -75,6 +83,34 @@ VTKMeshGenerator::VTKMeshGenerator( string const & name, " If set to 0 (default value), the GlobalId arrays in the input mesh are used if available, and generated otherwise." " If set to a negative value, the GlobalId arrays in the input mesh are not used, and generated global Ids are automatically generated." " If set to a positive value, the GlobalId arrays in the input mesh are used and required, and the simulation aborts if they are not available" ); + + registerWrapper( viewKeyStruct::dataSourceString(), &m_dataSourceName ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Name of the VTK data source" ); +} + +void VTKMeshGenerator::postInputInitialization() +{ + ExternalMeshGeneratorBase::postInputInitialization(); + + GEOS_ERROR_IF( !this->m_filePath.empty() && !m_dataSourceName.empty(), + getDataContext() << ": Access to the mesh via file or data source are mutually exclusive. " + "You can't set " << viewKeyStruct::dataSourceString() << " or " << viewKeyStruct::meshPathString() << " and " << + ExternalMeshGeneratorBase::viewKeyStruct::filePathString() ); + + if( !m_dataSourceName.empty()) + { + ExternalDataSourceManager & externalDataManager = this->getGroupByPath< ExternalDataSourceManager >( "/Problem/ExternalDataSource" ); + + m_dataSource = externalDataManager.getGroupPointer< VTKHierarchicalDataSource >( m_dataSourceName ); + + GEOS_THROW_IF( m_dataSource == nullptr, + getDataContext() << ": VTK Data Object Source not found: " << m_dataSourceName, + InputError ); + + m_dataSource->open(); + } + } void VTKMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockManager, SpatialPartition & partition ) @@ -86,10 +122,67 @@ void VTKMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockManager vtkSmartPointer< vtkMultiProcessController > controller = vtk::getController(); vtkMultiProcessController::SetGlobalController( controller ); - GEOS_LOG_RANK_0( GEOS_FMT( "{} '{}': reading mesh from {}", catalogName(), getName(), m_filePath ) ); { + vtk::AllMeshes allMeshes; + GEOS_LOG_LEVEL_RANK_0( 2, " reading the dataset..." ); - vtk::AllMeshes allMeshes = vtk::loadAllMeshes( m_filePath, m_mainBlockName, m_faceBlockNames ); + + if( !m_filePath.empty()) + { + GEOS_LOG_RANK_0( GEOS_FMT( "{} '{}': reading mesh from {}", catalogName(), getName(), m_filePath ) ); + allMeshes = vtk::loadAllMeshes( m_filePath, m_mainBlockName, m_faceBlockNames ); + } + else if( !m_dataSourceName.empty()) + { + if( MpiWrapper::commRank() == 0 ) + { + std::vector< vtkSmartPointer< vtkPartitionedDataSet > > partitions; + vtkNew< vtkAppendFilter > appender; + appender->MergePointsOn(); + for( auto & [key, value] : this->getSubGroups()) + { + Region const & region = this->getGroup< Region >( key ); + + string path = region.getWrapper< string >( Region::viewKeyStruct::pathInRepositoryString()).reference(); + integer region_id = region.getWrapper< integer >( Region::viewKeyStruct::idString()).reference(); + + GEOS_LOG_RANK_0( GEOS_FMT( "{} '{}': reading partition from {}", catalogName(), getName(), path ) ); + vtkPartitionedDataSet * p = m_dataSource->search( path ); + + //load the grid + vtkDataObject * block = p->GetPartition( 0 ); + if( block->IsA( "vtkDataSet" ) ) + { + vtkSmartPointer< vtkDataSet > dataset = vtkDataSet::SafeDownCast( block ); + + vtkIntArray * arr = vtkIntArray::New(); + arr->SetName( m_attributeName.c_str()); + arr->SetNumberOfComponents( 1 ); + arr->SetNumberOfTuples( dataset->GetNumberOfCells()); + + arr->FillValue( region_id ); + + dataset->GetCellData()->AddArray( arr ); + appender->AddInputDataObject( dataset ); + } + } + appender->Update(); + vtkUnstructuredGrid * result = vtkUnstructuredGrid::SafeDownCast( appender->GetOutputDataObject( 0 ) ); + allMeshes.setMainMesh( result ); + + //DEBUG code + vtkNew< vtkXMLUnstructuredGridWriter > writer; + writer->SetFileName( "tmp_output.vtu" ); + writer->SetInputData( result ); + writer->Write(); + } + else + { + vtkUnstructuredGrid * result = vtkUnstructuredGrid::New(); + allMeshes.setMainMesh( result ); + } + } + GEOS_LOG_LEVEL_RANK_0( 2, " redistributing mesh..." ); vtk::AllMeshes redistributedMeshes = vtk::redistributeMeshes( getLogLevel(), allMeshes.getMainMesh(), allMeshes.getFaceBlocks(), comm, m_partitionMethod, m_partitionRefinement, m_useGlobalIds ); @@ -215,6 +308,7 @@ void VTKMeshGenerator::freeResources() m_faceBlockMeshes.clear(); } + REGISTER_CATALOG_ENTRY( MeshGeneratorBase, VTKMeshGenerator, string const &, Group * const ) } // namespace geos diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp index 6d2eabe911f..cad9378dde4 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp @@ -22,8 +22,8 @@ #include "mesh/generators/ExternalMeshGeneratorBase.hpp" #include "mesh/generators/VTKUtilities.hpp" +#include "mesh/generators/VTKHierarchicalDataSource.hpp" #include "mesh/mpiCommunications/SpatialPartition.hpp" - #include namespace geos @@ -45,10 +45,10 @@ class VTKMeshGenerator : public ExternalMeshGeneratorBase VTKMeshGenerator( const string & name, Group * const parent ); -/** - * @brief Return the name of the VTKMeshGenerator in object Catalog. - * @return string that contains the key name to VTKMeshGenerator in the Catalog - */ + /** + * @brief Return the name of the VTKMeshGenerator in object Catalog. + * @return string that contains the key name to VTKMeshGenerator in the Catalog + */ static string catalogName() { return "VTKMesh"; } /** @@ -88,7 +88,7 @@ class VTKMeshGenerator : public ExternalMeshGeneratorBase * surfaces of interest, with triangles and/or quads holding an attribute value * of 1, 2 or 3, three node sets named "1", "2" and "3" will be instantiated by this method */ - virtual void fillCellBlockManager( CellBlockManager & cellBlockManager, SpatialPartition & partition ) override; + void fillCellBlockManager( CellBlockManager & cellBlockManager, SpatialPartition & partition ) override; void importFieldOnArray( Block block, string const & blockName, @@ -96,7 +96,10 @@ class VTKMeshGenerator : public ExternalMeshGeneratorBase bool isMaterialField, dataRepository::WrapperBase & wrapper ) const override; - virtual void freeResources() override; + void freeResources() override; + +protected: + void postInputInitialization() override; private: @@ -110,6 +113,13 @@ class VTKMeshGenerator : public ExternalMeshGeneratorBase constexpr static char const * partitionRefinementString() { return "partitionRefinement"; } constexpr static char const * partitionMethodString() { return "partitionMethod"; } constexpr static char const * useGlobalIdsString() { return "useGlobalIds"; } + constexpr static char const * dataSourceString() { return "dataSourceName"; } + constexpr static char const * meshPathString() { return "meshPath"; } + }; + + struct groupKeyStruct + { + constexpr static char const * regionString() { return "VTKRegion"; } }; /// @endcond @@ -155,6 +165,16 @@ class VTKMeshGenerator : public ExternalMeshGeneratorBase /// Lists of VTK cell ids, organized by element type, then by region vtk::CellMapType m_cellMap; + + /// Repository name + string m_dataSourceName; + + /// path to the mesh in the repository + string m_meshPath; + + /// Repository of VTK objects + VTKHierarchicalDataSource * m_dataSource; + }; } // namespace geos diff --git a/src/coreComponents/mesh/generators/VTKWellGenerator.cpp b/src/coreComponents/mesh/generators/VTKWellGenerator.cpp index c6294c35683..173412ca23b 100644 --- a/src/coreComponents/mesh/generators/VTKWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKWellGenerator.cpp @@ -101,5 +101,5 @@ void VTKWellGenerator::fillPolylineDataStructure( ) } } -REGISTER_CATALOG_ENTRY( WellGeneratorBase, VTKWellGenerator, string const &, Group * const ) +REGISTER_CATALOG_ENTRY( MeshComponentBase, VTKWellGenerator, string const &, Group * const ) } diff --git a/src/coreComponents/mesh/generators/WellGeneratorABC.hpp b/src/coreComponents/mesh/generators/WellGeneratorABC.hpp deleted file mode 100644 index c1719d5badf..00000000000 --- a/src/coreComponents/mesh/generators/WellGeneratorABC.hpp +++ /dev/null @@ -1,205 +0,0 @@ -/* - * ------------------------------------------------------------------------------------------------------------ - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A - * 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 WellGeneratorABC.hpp - * - */ - -#ifndef GEOS_MESH_GENERATORS_WELLGENERATORABC_HPP_ -#define GEOS_MESH_GENERATORS_WELLGENERATORABC_HPP_ - -#include "dataRepository/Group.hpp" -#include "codingUtilities/Utilities.hpp" -#include "common/DataTypes.hpp" - - -namespace geos -{ - -/** - * @class WellGeneratorABC - * - * Abstract base class defining the information provided by any the well generator class. - */ -class WellGeneratorABC : public dataRepository::Group -{ -public: - - /** - * @brief Constructor. - * @param name name of the object in the data hierarchy. - * @param parent pointer to the parent group in the data hierarchy. - */ - WellGeneratorABC( const string & name, - Group * const parent ) - : - Group( name, parent ) - { } - - /** - * @brief Main function of the class that generates the well geometry - */ - virtual void generateWellGeometry( ) = 0; - - /** - * @name Getters / Setters - */ - ///@{ - - // getters for element data - - /** - * @brief Get the global number of well elements. - * @return the global number of elements - */ - virtual globalIndex numElements() const = 0; - - /** - * @brief Getter to the Segment to PolyNode mapping - * @return The Segment to PolyNode mapping as a 2D array - */ - virtual const array2d< globalIndex > & getSegmentToPolyNodeMap() const = 0; - - /** - * @brief Get the number of nodes per well element - * @return the number of nodes per well element - */ - virtual globalIndex numNodesPerElement() const = 0; - - /** - * @brief Get the Coordinates of the polyline nodes - * @return the Coordinates of the polyline nodes - */ - virtual const array2d< real64 > & getPolyNodeCoord() const = 0; - - /** - * @return The minimum segment length - */ - virtual real64 getMinSegmentLength() const = 0; - - /** - * @return The minimum element length - */ - virtual real64 getMinElemLength() const = 0; - - /** - * @return The list of perforation names - */ - virtual const string_array & getPerforationList() const = 0; - - /** - * @brief Get the physical location of the centers of well elements. - * @return list of center locations of the well elements - */ - virtual arrayView2d< real64 const > getElemCoords() const = 0; - - /** - * @brief Get the global indices mapping an element to the next. - * @return list providing the global index of the next element for each element - */ - virtual arrayView1d< globalIndex const > getNextElemIndex() const = 0; - - /** - * @brief Get the global indices mapping an element to the previous ones. - * @return list providing the global indices of the previous elements for each element - */ - virtual arrayView1d< arrayView1d< globalIndex const > const > getPrevElemIndices() const = 0; - - /** - * @brief Get the global indices of the well nodes nodes connected to each element. - * @return list providing the global index of the well nodes for each well element - */ - virtual arrayView2d< globalIndex const > getElemToNodesMap() const = 0; - - /** - * @brief Get the volume of the well elements. - * @return list of volumes of the well elements - */ - virtual arrayView1d< real64 const > getElemVolume() const = 0; - - /** - * @brief Get the radius in the well. - * @return the radius in the well - */ - virtual real64 getElementRadius() const = 0; - - // getters for node data - - /** - * @brief Get the global number of well nodes. - * @return the global number of nodes - */ - virtual globalIndex numNodes() const = 0; - - /** - * @brief Get the physical location of the centers of well elements. - * @return list of center locations of the well elements - */ - virtual arrayView2d< real64 const > getNodeCoords() const = 0; - - - - // getters for perforation data - /** - * @brief Get the global number of perforations on this well. - * @return the global number of elements - */ - virtual globalIndex numPerforations() const = 0; - - /** - * @brief Get the locations of the perforations. - * @return list of locations of all the perforations on the well - */ - virtual arrayView2d< real64 const > getPerfCoords() const = 0; - - /** - * @brief Get the well transmissibility at the perforations. - * @return list of well transmissibility at all the perforations on the well - */ - virtual arrayView1d< real64 const > getPerfTransmissibility() const = 0; - - /** - * @brief Get the skin factor at a perforation. - * @return the skin factor at a perforation - */ - virtual arrayView1d< real64 const > getPerfSkinFactor() const = 0; - - /** - * @brief Get the global indices of the well elements connected to each perforation. - * @return list providing the global index of the connected well element for each perforation - */ - virtual arrayView1d< globalIndex const > getPerfElemIndex() const = 0; - - /** - * @returns The number of physical dimensions - */ - virtual int getPhysicalDimensionsNumber() const = 0; - - /** - * Getter for the associated well region name - * @return the associated well region name - */ - virtual const string getWellRegionName() const = 0; - - /** - * Getter for the associated well control name - * @return the associated well control name - */ - virtual const string getWellControlsName() const = 0; - ///@} -}; -} -#endif /* GEOS_MESH_GENERATORS_WELLGENERATORABC_HPP_ */ diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index 1617aa3fdb4..5e8efb4bc61 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -25,7 +25,7 @@ namespace geos using namespace dataRepository; WellGeneratorBase::WellGeneratorBase( string const & name, Group * const parent ): - WellGeneratorABC( name, parent ) + MeshComponentBase( name, parent ) , m_numPerforations( 0 ) , m_numElemsPerSegment( 0 ) , m_minSegmentLength( 1e-2 ) @@ -39,8 +39,6 @@ WellGeneratorBase::WellGeneratorBase( string const & name, Group * const parent , m_nDims( 3 ) , m_polylineHeadNodeId( -1 ) { - setInputFlags( InputFlags::OPTIONAL_NONUNIQUE ); - registerWrapper( viewKeyStruct::radiusString(), &m_radius ). setInputFlag( InputFlags::REQUIRED ). setSizedFromParent( 0 ). @@ -97,12 +95,6 @@ void WellGeneratorBase::expandObjectCatalogs() createChild( viewKeyStruct::perforationString(), viewKeyStruct::perforationString() ); } -WellGeneratorBase::CatalogInterface::CatalogType & WellGeneratorBase::getCatalog() -{ - static WellGeneratorBase::CatalogInterface::CatalogType catalog; - return catalog; -} - void WellGeneratorBase::generateWellGeometry( ) { fillPolylineDataStructure(); diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp index 99f1af95924..ca29973ae36 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp @@ -21,7 +21,7 @@ #ifndef GEOS_MESH_GENERATORS_WELLGENERATORBASE_HPP_ #define GEOS_MESH_GENERATORS_WELLGENERATORBASE_HPP_ -#include "mesh/generators/WellGeneratorABC.hpp" +#include "mesh/generators/MeshComponentBase.hpp" #include "dataRepository/Group.hpp" #include "codingUtilities/Utilities.hpp" #include "common/DataTypes.hpp" @@ -35,7 +35,7 @@ namespace geos * * This class processes the data of a single well from the XML and generates the well geometry */ -class WellGeneratorBase : public WellGeneratorABC +class WellGeneratorBase : public MeshComponentBase { public: @@ -50,10 +50,6 @@ class WellGeneratorBase : public WellGeneratorABC /// This function is used to expand any catalogs in the data structure virtual void expandObjectCatalogs() override; - /// using alias for templated Catalog meshGenerator type - using CatalogInterface = dataRepository::CatalogInterface< WellGeneratorBase, string const &, Group * const >; - - /** * @brief Create a new geometric object (box, plane, etc) as a child of this group. * @param childKey the catalog key of the new geometric object to create @@ -62,16 +58,10 @@ class WellGeneratorBase : public WellGeneratorABC */ virtual Group * createChild( string const & childKey, string const & childName ) override; - /** - * @brief Accessor for the singleton Catalog object - * @return a static reference to the Catalog object - */ - static CatalogInterface::CatalogType & getCatalog(); - /** * @brief Main function of the class that generates the well geometry */ - void generateWellGeometry( ) override; + void generateWellGeometry( ); /** @@ -85,76 +75,76 @@ class WellGeneratorBase : public WellGeneratorABC * @brief Get the global number of well elements. * @return the global number of elements */ - globalIndex numElements() const override { return m_numElems; } + globalIndex numElements() const { return m_numElems; } /** * @brief Getter to the Segment to PolyNode mapping * @return The Segment to PolyNode mapping as a 2D array */ - const array2d< globalIndex > & getSegmentToPolyNodeMap() const override { return m_segmentToPolyNodeMap; }; + const array2d< globalIndex > & getSegmentToPolyNodeMap() const { return m_segmentToPolyNodeMap; }; /** * @brief Get the number of nodes per well element * @return the number of nodes per well element */ - globalIndex numNodesPerElement() const override { return m_numNodesPerElem; } + globalIndex numNodesPerElement() const { return m_numNodesPerElem; } /** * @brief Get the Coordinates of the polyline nodes * @return the Coordinates of the polyline nodes */ - const array2d< real64 > & getPolyNodeCoord() const override { return m_polyNodeCoords; } + const array2d< real64 > & getPolyNodeCoord() const { return m_polyNodeCoords; } /** * @return The minimum segment length */ - real64 getMinSegmentLength() const override { return m_minSegmentLength; } + real64 getMinSegmentLength() const { return m_minSegmentLength; } /** * @return The minimum element length */ - real64 getMinElemLength() const override { return m_minElemLength; } + real64 getMinElemLength() const { return m_minElemLength; } /** * @return The list of perforation names */ - const string_array & getPerforationList() const override { return m_perforationList; } + const string_array & getPerforationList() const { return m_perforationList; } /** * @brief Get the physical location of the centers of well elements. * @return list of center locations of the well elements */ - arrayView2d< real64 const > getElemCoords() const override { return m_elemCenterCoords; } + arrayView2d< real64 const > getElemCoords() const { return m_elemCenterCoords; } /** * @brief Get the global indices mapping an element to the next. * @return list providing the global index of the next element for each element */ - arrayView1d< globalIndex const > getNextElemIndex() const override { return m_nextElemId; } + arrayView1d< globalIndex const > getNextElemIndex() const { return m_nextElemId; } /** * @brief Get the global indices mapping an element to the previous ones. * @return list providing the global indices of the previous elements for each element */ - arrayView1d< arrayView1d< globalIndex const > const > getPrevElemIndices() const override { return m_prevElemId.toNestedViewConst(); } + arrayView1d< arrayView1d< globalIndex const > const > getPrevElemIndices() const { return m_prevElemId.toNestedViewConst(); } /** * @brief Get the global indices of the well nodes nodes connected to each element. * @return list providing the global index of the well nodes for each well element */ - arrayView2d< globalIndex const > getElemToNodesMap() const override { return m_elemToNodesMap; } + arrayView2d< globalIndex const > getElemToNodesMap() const { return m_elemToNodesMap; } /** * @brief Get the volume of the well elements. * @return list of volumes of the well elements */ - arrayView1d< real64 const > getElemVolume() const override { return m_elemVolume; } + arrayView1d< real64 const > getElemVolume() const { return m_elemVolume; } /** * @brief Get the radius in the well. * @return the radius in the well */ - real64 getElementRadius() const override { return m_radius; } + real64 getElementRadius() const { return m_radius; } // getters for node data @@ -162,61 +152,61 @@ class WellGeneratorBase : public WellGeneratorABC * @brief Get the global number of well nodes. * @return the global number of nodes */ - globalIndex numNodes() const override { return m_numNodes; } + globalIndex numNodes() const { return m_numNodes; } /** * @brief Get the physical location of the centers of well elements. * @return list of center locations of the well elements */ - arrayView2d< real64 const > getNodeCoords() const override { return m_nodeCoords; } + arrayView2d< real64 const > getNodeCoords() const { return m_nodeCoords; } // getters for perforation data /** * @brief Get the global number of perforations on this well. * @return the global number of elements */ - globalIndex numPerforations() const override { return m_numPerforations; } + globalIndex numPerforations() const { return m_numPerforations; } /** * @brief Get the locations of the perforations. * @return list of locations of all the perforations on the well */ - arrayView2d< real64 const > getPerfCoords() const override { return m_perfCoords; } + arrayView2d< real64 const > getPerfCoords() const { return m_perfCoords; } /** * @brief Get the well transmissibility at the perforations. * @return list of well transmissibility at all the perforations on the well */ - arrayView1d< real64 const > getPerfTransmissibility() const override { return m_perfTransmissibility; } + arrayView1d< real64 const > getPerfTransmissibility() const { return m_perfTransmissibility; } /** * @brief Get the skin factor at a perforation. * @return the skin factor at a perforation */ - arrayView1d< real64 const > getPerfSkinFactor() const override { return m_perfSkinFactor; }; + arrayView1d< real64 const > getPerfSkinFactor() const { return m_perfSkinFactor; }; /** * @brief Get the global indices of the well elements connected to each perforation. * @return list providing the global index of the connected well element for each perforation */ - arrayView1d< globalIndex const > getPerfElemIndex() const override { return m_perfElemId; } + arrayView1d< globalIndex const > getPerfElemIndex() const { return m_perfElemId; } /** * @returns The number of physical dimensions */ - int getPhysicalDimensionsNumber() const override { return m_nDims; } + int getPhysicalDimensionsNumber() const { return m_nDims; } /** * Getter for the associated well region name * @return the associated well region name */ - const string getWellRegionName() const override { return m_wellRegionName; } + const string getWellRegionName() const { return m_wellRegionName; } /** * Getter for the associated well control name * @return the associated well control name */ - const string getWellControlsName() const override { return m_wellControlsName; } + const string getWellControlsName() const { return m_wellControlsName; } ///@cond DO_NOT_DOCUMENT struct viewKeyStruct diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index e013bde4576..4703fed31e6 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -185,6 +185,12 @@ + + + + + + @@ -1079,6 +1085,25 @@ + + + + + + + + + + + + + + + + + + + @@ -1498,6 +1523,10 @@ stress - traction is applied to the faces as specified by the inner product of i + + + + @@ -1508,6 +1537,10 @@ stress - traction is applied to the faces as specified by the inner product of i + + + + @@ -1519,6 +1552,10 @@ stress - traction is applied to the faces as specified by the inner product of i + + + + @@ -1534,6 +1571,7 @@ stress - traction is applied to the faces as specified by the inner product of i + @@ -1605,6 +1643,14 @@ stress - traction is applied to the faces as specified by the inner product of i + + + + + + + + @@ -1634,6 +1680,7 @@ stress - traction is applied to the faces as specified by the inner product of i + @@ -1702,6 +1749,7 @@ stress - traction is applied to the faces as specified by the inner product of i + @@ -1716,7 +1764,7 @@ stress - traction is applied to the faces as specified by the inner product of i - + @@ -1729,6 +1777,8 @@ stress - traction is applied to the faces as specified by the inner product of i + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 3b8b7a2e739..288b8135d13 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -173,6 +173,7 @@ + @@ -279,6 +280,16 @@ + + + + + + + + + + @@ -380,6 +391,7 @@ + @@ -390,6 +402,7 @@ + @@ -398,6 +411,7 @@ + @@ -418,6 +432,7 @@ + From ae05f34001b6c67ed77308bcfccbb5bbff1d563f Mon Sep 17 00:00:00 2001 From: acitrain <60715545+acitrain@users.noreply.github.com> Date: Thu, 28 Nov 2024 13:50:40 +0100 Subject: [PATCH 262/286] fix: Little bug fix for automatic timestep computation for elastic wave solver (#3464) * Fix bug in automatic timestep computation for second order elastic wave solver * Bugfix * Change tolerance after bugfix * Add theoritical timestep computation in acoustic unit test * uncrustify --------- Co-authored-by: Stefano Frambati --- .../isotropic/ElasticWaveEquationSEM.cpp | 10 +- src/coreComponents/schema/schema.xsd | 63 +++++++- src/coreComponents/schema/schema.xsd.other | 150 ++++++++++-------- .../testWavePropagation.cpp | 6 +- .../testWavePropagationDAS.cpp | 2 +- 5 files changed, 155 insertions(+), 76 deletions(-) diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 46868959436..361f927d5d5 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -507,7 +507,7 @@ real64 ElasticWaveEquationSEM::computeTimeStep( real64 & dtOut ) { ux_n[a] = (real64)rand()/(real64) RAND_MAX; uy_n[a] = (real64)rand()/(real64) RAND_MAX; - uy_n[a] = (real64)rand()/(real64) RAND_MAX; + uz_n[a] = (real64)rand()/(real64) RAND_MAX; } //Step 1: Normalize randomized pressure @@ -565,20 +565,20 @@ real64 ElasticWaveEquationSEM::computeTimeStep( real64 & dtOut ) lambdaOld = lambdaNew; //Compute lambdaNew using two dotProducts - dotProductUzUzaux = 0.0; dotProductUxUxaux = 0.0; dotProductUyUyaux = 0.0; + dotProductUzUzaux = 0.0; normUx= 0.0; normUy= 0.0; normUz= 0.0; WaveSolverUtils::dotProduct( sizeNode, ux_n, stiffnessVectorx, dotProductUxUxaux ); WaveSolverUtils::dotProduct( sizeNode, uy_n, stiffnessVectory, dotProductUyUyaux ); - WaveSolverUtils::dotProduct( sizeNode, ux_n, stiffnessVectorz, dotProductUzUzaux ); + WaveSolverUtils::dotProduct( sizeNode, uz_n, stiffnessVectorz, dotProductUzUzaux ); dotProductUtotUtotAux = dotProductUxUxaux+dotProductUyUyaux+dotProductUzUzaux; WaveSolverUtils::dotProduct( sizeNode, ux_n, ux_n, normUx ); - WaveSolverUtils::dotProduct( sizeNode, uy_n, ux_n, normUy ); - WaveSolverUtils::dotProduct( sizeNode, uz_n, ux_n, normUz ); + WaveSolverUtils::dotProduct( sizeNode, uy_n, uy_n, normUy ); + WaveSolverUtils::dotProduct( sizeNode, uz_n, uz_n, normUz ); normUtot = normUx+normUy+normUz; lambdaNew = dotProductUtotUtotAux/normUtot; diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 4703fed31e6..394f021a29e 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -467,6 +467,10 @@ + + + + @@ -2199,7 +2203,7 @@ the relative residual norm satisfies: - + @@ -2280,6 +2284,7 @@ the relative residual norm satisfies: + @@ -3206,7 +3211,7 @@ Level 0 outputs no specific information for this solver. Higher levels require m - + @@ -3229,7 +3234,7 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -4301,6 +4306,58 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 288b8135d13..b9864791b44 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -486,7 +486,7 @@ - + @@ -555,6 +555,7 @@ + @@ -570,7 +571,7 @@ - + @@ -607,7 +608,7 @@ - + @@ -658,7 +659,7 @@ - + @@ -699,7 +700,7 @@ - + @@ -732,7 +733,7 @@ - + @@ -743,7 +744,7 @@ - + @@ -756,7 +757,7 @@ - + @@ -769,7 +770,7 @@ - + @@ -785,7 +786,7 @@ - + @@ -819,7 +820,7 @@ - + @@ -882,7 +883,7 @@ - + @@ -913,7 +914,7 @@ - + @@ -926,7 +927,7 @@ - + @@ -939,7 +940,7 @@ - + @@ -952,7 +953,7 @@ - + @@ -965,7 +966,7 @@ - + @@ -980,7 +981,7 @@ - + @@ -991,7 +992,7 @@ - + @@ -1004,7 +1005,7 @@ - + @@ -1015,7 +1016,7 @@ - + @@ -1037,7 +1038,7 @@ - + @@ -1050,7 +1051,7 @@ - + @@ -1061,7 +1062,7 @@ - + @@ -1072,7 +1073,7 @@ - + @@ -1085,7 +1086,7 @@ - + @@ -1100,7 +1101,7 @@ - + @@ -1115,7 +1116,7 @@ - + @@ -1128,7 +1129,7 @@ - + @@ -1143,7 +1144,7 @@ - + @@ -1154,7 +1155,7 @@ - + @@ -1167,7 +1168,7 @@ - + @@ -1180,7 +1181,7 @@ - + @@ -1195,7 +1196,7 @@ - + @@ -1211,7 +1212,7 @@ - + @@ -1226,7 +1227,7 @@ - + @@ -1243,7 +1244,7 @@ - + @@ -1260,7 +1261,24 @@ - + + + + + + + + + + + + + + + + + + @@ -1275,7 +1293,7 @@ - + @@ -1288,7 +1306,7 @@ - + @@ -1327,7 +1345,7 @@ - + @@ -1356,7 +1374,7 @@ - + @@ -1449,7 +1467,7 @@ - + @@ -3073,7 +3091,7 @@ - + @@ -3101,7 +3119,7 @@ - + @@ -3120,11 +3138,11 @@ - + - + @@ -3134,7 +3152,7 @@ - + @@ -3144,11 +3162,11 @@ - + - + @@ -3158,7 +3176,7 @@ - + @@ -3168,7 +3186,7 @@ - + @@ -3178,7 +3196,7 @@ - + @@ -3202,7 +3220,7 @@ - + @@ -3220,7 +3238,7 @@ - + @@ -3232,7 +3250,7 @@ - + @@ -3244,7 +3262,7 @@ - + @@ -3252,11 +3270,11 @@ - + - + @@ -3279,7 +3297,7 @@ - + @@ -3305,7 +3323,7 @@ - + @@ -3326,7 +3344,7 @@ - + @@ -3356,7 +3374,7 @@ - + @@ -3370,7 +3388,7 @@ - + @@ -3397,7 +3415,7 @@ - + @@ -3436,7 +3454,7 @@ - + diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp index f2e52c68305..f1cb6261cfe 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp @@ -198,7 +198,11 @@ TEST_F( AcousticWaveEquationSEMTest, SeismoTrace ) //Assert on time-step computed with the automatci time-step routine real64 const dtOut = propagator->getReference< real64 >( AcousticWaveEquationSEM::viewKeyStruct::timeStepString() ); - ASSERT_TRUE( dtOut < 0.04 ); + real64 const Vp = 1500.0; + real64 const h = 100.0; + real64 const cflConstant = 1/sqrt( 3 ); + real64 const dtTheo = (cflConstant*h)/Vp; + ASSERT_TRUE( dtOut < dtTheo ); real64 time_n = time; // run for 1s (10 steps) diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp index 4446ac3a945..f36795c930d 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp @@ -188,7 +188,7 @@ TEST_F( ElasticWaveEquationSEMTest, SeismoTrace ) //Assert on time-step computed with the automatci time-step routine real64 const dtOut = propagator->getReference< real64 >( ElasticWaveEquationSEM::viewKeyStruct::timeStepString() ); - ASSERT_TRUE( dtOut < 0.04 ); + ASSERT_TRUE( dtOut < 0.05 ); // retrieve seismo From 657ac022aa208f0283f8cbaaf7d2d38139855f1f Mon Sep 17 00:00:00 2001 From: Tom Byer <149726499+tjb-ltk@users.noreply.github.com> Date: Thu, 28 Nov 2024 07:55:26 -0800 Subject: [PATCH 263/286] fix: format statement for reporting location of max compdens change (#3465) --- .../physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index bc923341c91..4c9dde33e1b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -587,8 +587,9 @@ real64 CompositionalMultiphaseFVM::scalingForSystemSolution( DomainPartition & d getName(), globalDeltaPresMax.value, globalDeltaPresMax.location ) ); + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::Solution, - GEOS_FMT( " {}: Max component density change = {:.3f} (before scaling) at cell {}", + GEOS_FMT( " {}: Max component density change = {:.3f} {} (before scaling) at cell {}", getName(), globalDeltaCompDensMax.value, massUnit, From a50339b44220048daa2daf48986a8c5ee5efab26 Mon Sep 17 00:00:00 2001 From: sohailwaziri <90070246+sohailwaziri@users.noreply.github.com> Date: Thu, 28 Nov 2024 10:37:53 -0600 Subject: [PATCH 264/286] fix: plastic/elastic slip fix for EFEM (#3348) Co-authored-by: Guotong-Ren <133127368+Guotong-Ren@users.noreply.github.com> Co-authored-by: Pavel Tomin Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .../constitutive/contact/CoulombFriction.hpp | 83 ++++++++++++++----- .../constitutive/contact/FrictionBase.hpp | 21 ++++- .../contact/FrictionlessContact.hpp | 8 +- .../contact/RateAndStateFriction.hpp | 8 +- .../SolidMechanicsEmbeddedFractures.cpp | 30 ++++++- .../SolidMechanicsEmbeddedFractures.hpp | 8 ++ 6 files changed, 121 insertions(+), 37 deletions(-) diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.hpp b/src/coreComponents/constitutive/contact/CoulombFriction.hpp index 575aef0d3fe..a43fdcbbdc0 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.hpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.hpp @@ -85,11 +85,18 @@ class CoulombFrictionUpdates : public FrictionBaseUpdates GEOS_HOST_DEVICE inline - virtual void updateFractureState( localIndex const k, - arraySlice1d< real64 const > const & dispJump, + virtual void updateFractureState( arraySlice1d< real64 const > const & dispJump, arraySlice1d< real64 const > const & tractionVector, integer & fractureState ) const override final; + GEOS_HOST_DEVICE + inline + virtual void updateElasticSlip( localIndex const k, + arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & oldDispJump, + arraySlice1d< real64 const > const & tractionVector, + integer const & fractureState ) const override final; + GEOS_HOST_DEVICE inline virtual void updateTraction( arraySlice1d< real64 const > const & oldDispJump, @@ -240,15 +247,15 @@ inline void CoulombFrictionUpdates::computeShearTraction( localIndex const k, real64 const slip[2] = { dispJump[1] - oldDispJump[1], dispJump[2] - oldDispJump[2] }; - - real64 const tau[2] = { m_shearStiffness * ( slip[0] + m_elasticSlip[k][0] ), - m_shearStiffness * ( slip[1] + m_elasticSlip[k][1] ) }; - switch( fractureState ) { case fields::contact::FractureState::Stick: { - // Elastic slip case + // Elastic tangential deformation + + real64 const tau[2] = { m_shearStiffness * ( slip[0] + m_elasticSlip[k][0] ), + m_shearStiffness * ( slip[1] + m_elasticSlip[k][1] ) }; + // Tangential components of the traction are equal to tau tractionVector[1] = tau[0]; tractionVector[2] = tau[1]; @@ -256,14 +263,12 @@ inline void CoulombFrictionUpdates::computeShearTraction( localIndex const k, dTractionVector_dJump[1][1] = m_shearStiffness; dTractionVector_dJump[2][2] = m_shearStiffness; - // The slip is only elastic: we add the full slip to the elastic one - LvArray::tensorOps::add< 2 >( m_elasticSlip[k], slip ); - break; } case fields::contact::FractureState::Slip: { - // Plastic slip case + // Plastic tangential deformation + real64 dLimitTau_dNormalTraction; real64 const limitTau = computeLimitTangentialTractionNorm( tractionVector[0], dLimitTau_dNormalTraction ); @@ -282,21 +287,13 @@ inline void CoulombFrictionUpdates::computeShearTraction( localIndex const k, dTractionVector_dJump[2][1] = -limitTau * slip[0] * slip[1] / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); dTractionVector_dJump[2][2] = limitTau * pow( slip[0], 2 ) / pow( LvArray::tensorOps::l2NormSquared< 2 >( slip ), 1.5 ); - // Compute elastic component of the slip for this case - real64 const plasticSlip[2] = { tractionVector[1] / m_shearStiffness, - tractionVector[2] / m_shearStiffness }; - - LvArray::tensorOps::copy< 2 >( m_elasticSlip[k], slip ); - LvArray::tensorOps::subtract< 2 >( m_elasticSlip[k], plasticSlip ); - break; } } } GEOS_HOST_DEVICE -inline void CoulombFrictionUpdates::updateFractureState( localIndex const k, - arraySlice1d< real64 const > const & dispJump, +inline void CoulombFrictionUpdates::updateFractureState( arraySlice1d< real64 const > const & dispJump, arraySlice1d< real64 const > const & tractionVector, integer & fractureState ) const { @@ -305,8 +302,6 @@ inline void CoulombFrictionUpdates::updateFractureState( localIndex const k, if( dispJump[0] > -m_displacementJumpThreshold ) { fractureState = FractureState::Open; - m_elasticSlip[k][0] = 0.0; - m_elasticSlip[k][1] = 0.0; } else { @@ -321,7 +316,45 @@ inline void CoulombFrictionUpdates::updateFractureState( localIndex const k, // Yield function (not necessary but makes it clearer) real64 const yield = tauNorm - limitTau; - fractureState = yield < 0 ? FractureState::Stick : FractureState::Slip; + if( yield < 0 ) + { + fractureState = FractureState::Stick; + } + else + { + fractureState = FractureState::Slip; + } + } +} + +GEOS_HOST_DEVICE +inline void CoulombFrictionUpdates::updateElasticSlip( localIndex const k, + arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & oldDispJump, + arraySlice1d< real64 const > const & tractionVector, + integer const & fractureState ) const +{ + using namespace fields::contact; + + if( fractureState == FractureState::Open ) + { + m_elasticSlip[k][0] = 0.0; + m_elasticSlip[k][1] = 0.0; + } + else + { + if( fractureState == FractureState::Stick ) + { + // The slip is only elastic: we add the full slip to the elastic one + real64 const slip[2] = { dispJump[1] - oldDispJump[1], + dispJump[2] - oldDispJump[2] }; + LvArray::tensorOps::add< 2 >( m_elasticSlip[k], slip ); + } + else if( fractureState == FractureState::Slip ) + { + m_elasticSlip[k][0] = tractionVector[1] / m_shearStiffness; + m_elasticSlip[k][1] = tractionVector[2] / m_shearStiffness; + } } } @@ -392,7 +425,9 @@ inline void CoulombFrictionUpdates::updateTraction( arraySlice1d< real64 const > tractionNew[2] = tractionTrial[2]; if( fractureState != FractureState::Open ) + { fractureState = FractureState::Stick; + } } else if( limitTau <= tangentialTractionTolerance ) { @@ -403,7 +438,9 @@ inline void CoulombFrictionUpdates::updateTraction( arraySlice1d< real64 const > tractionNew[2] = (fixedLimitTau) ? tractionTrial[2] : 0.0; if( fractureState != FractureState::Open ) + { fractureState = FractureState::Slip; + } } else { diff --git a/src/coreComponents/constitutive/contact/FrictionBase.hpp b/src/coreComponents/constitutive/contact/FrictionBase.hpp index b41547880c5..2011310ee6e 100644 --- a/src/coreComponents/constitutive/contact/FrictionBase.hpp +++ b/src/coreComponents/constitutive/contact/FrictionBase.hpp @@ -83,11 +83,26 @@ class FrictionBaseUpdates */ GEOS_HOST_DEVICE inline - virtual void updateFractureState( localIndex const k, - arraySlice1d< real64 const > const & dispJump, + virtual void updateFractureState( arraySlice1d< real64 const > const & dispJump, arraySlice1d< real64 const > const & tractionVector, integer & fractureState ) const - { GEOS_UNUSED_VAR( k, dispJump, tractionVector, fractureState ); } + { GEOS_UNUSED_VAR( dispJump, tractionVector, fractureState ); } + + /** + * @brief Evaluate and store the elastic slip + * @param[in] dispJump the displacement jump + * @param[in] oldDispJump the previous displacement jump + * @param[in] tractionVector the traction vector + * @param[out] fractureState the fracture state + */ + GEOS_HOST_DEVICE + inline + virtual void updateElasticSlip( localIndex const k, + arraySlice1d< real64 const > const & dispJump, + arraySlice1d< real64 const > const & oldDispJump, + arraySlice1d< real64 const > const & tractionVector, + integer const & fractureState ) const + { GEOS_UNUSED_VAR( k, dispJump, oldDispJump, tractionVector, fractureState ); } /** * @brief Update the trial traction vector ( return mapping ) diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp index 6b3552acf75..31a13a088c2 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp @@ -58,8 +58,7 @@ class FrictionlessContactUpdates : public FrictionBaseUpdates GEOS_HOST_DEVICE inline - virtual void updateFractureState( localIndex const k, - arraySlice1d< real64 const > const & dispJump, + virtual void updateFractureState( arraySlice1d< real64 const > const & dispJump, arraySlice1d< real64 const > const & tractionVector, integer & fractureState ) const override final; @@ -118,12 +117,11 @@ class FrictionlessContact : public FrictionBase GEOS_HOST_DEVICE -inline void FrictionlessContactUpdates::updateFractureState( localIndex const k, - arraySlice1d< real64 const > const & dispJump, +inline void FrictionlessContactUpdates::updateFractureState( arraySlice1d< real64 const > const & dispJump, arraySlice1d< real64 const > const & tractionVector, integer & fractureState ) const { - GEOS_UNUSED_VAR( k, tractionVector ); + GEOS_UNUSED_VAR( tractionVector ); using namespace fields::contact; fractureState = dispJump[0] > m_displacementJumpThreshold ? FractureState::Open : FractureState::Stick; } diff --git a/src/coreComponents/constitutive/contact/RateAndStateFriction.hpp b/src/coreComponents/constitutive/contact/RateAndStateFriction.hpp index 9b9341ce1aa..bab0684bca6 100644 --- a/src/coreComponents/constitutive/contact/RateAndStateFriction.hpp +++ b/src/coreComponents/constitutive/contact/RateAndStateFriction.hpp @@ -110,8 +110,7 @@ class RateAndStateFriction : public FrictionBase GEOS_HOST_DEVICE inline - virtual void updateFractureState( localIndex const k, - arraySlice1d< real64 const > const & dispJump, + virtual void updateFractureState( arraySlice1d< real64 const > const & dispJump, arraySlice1d< real64 const > const & tractionVector, integer & fractureState ) const override final; @@ -239,13 +238,12 @@ class RateAndStateFriction : public FrictionBase }; GEOS_HOST_DEVICE -inline void RateAndStateFriction::KernelWrapper::updateFractureState( localIndex const k, - arraySlice1d< real64 const > const & dispJump, +inline void RateAndStateFriction::KernelWrapper::updateFractureState( arraySlice1d< real64 const > const & dispJump, arraySlice1d< real64 const > const & tractionVector, integer & fractureState ) const { - GEOS_UNUSED_VAR( tractionVector, k ); + GEOS_UNUSED_VAR( tractionVector ); using namespace fields::contact; if( dispJump[0] > -m_displacementJumpThreshold ) diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index e25682f1a13..5c1ff768efc 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -154,6 +154,20 @@ void SolidMechanicsEmbeddedFractures::implicitStepComplete( real64 const & time_ arrayView2d< real64 > oldDispJump = subRegion.getField< contact::oldDispJump >(); arrayView2d< real64 const > const dispJump = subRegion.getField< contact::dispJump >(); + // update elastic slip before copying dispJump to oldDispJump + string const & frictionLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + FrictionBase const & frictionLaw = getConstitutiveModel< FrictionBase >( subRegion, frictionLawName ); + arrayView2d< real64 const > const & traction = subRegion.getField< fields::contact::traction >(); + arrayView1d< integer > const & fractureState = subRegion.getField< fields::contact::fractureState >(); + constitutiveUpdatePassThru( frictionLaw, [&] ( auto & castedFrictionLaw ) + { + using FrictionType = TYPEOFREF( castedFrictionLaw ); + typename FrictionType::KernelWrapper frictionWrapper = castedFrictionLaw.createKernelUpdates(); + + updateElasticSlip( subRegion, frictionWrapper, dispJump, oldDispJump, traction, fractureState ); + } ); + + // now update oldDispJump = dispJump forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) { @@ -162,6 +176,20 @@ void SolidMechanicsEmbeddedFractures::implicitStepComplete( real64 const & time_ } ); } +template< typename WRAPPER_TYPE > +void SolidMechanicsEmbeddedFractures::updateElasticSlip( EmbeddedSurfaceSubRegion const & subRegion, + WRAPPER_TYPE & frictionWrapper, + arrayView2d< real64 const > const & dispJump, + arrayView2d< real64 const > const & oldDispJump, + arrayView2d< real64 const > const & traction, + arrayView1d< integer > const & fractureState ) +{ + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const kfe ) + { + frictionWrapper.updateElasticSlip( kfe, dispJump[kfe], oldDispJump[kfe], traction[kfe], fractureState[kfe] ); + } ); +} + void SolidMechanicsEmbeddedFractures::setupDofs( DomainPartition const & domain, DofManager & dofManager ) const { @@ -786,7 +814,7 @@ bool SolidMechanicsEmbeddedFractures::updateConfiguration( DomainPartition & dom if( ghostRank[kfe] < 0 ) { integer const originalFractureState = fractureState[kfe]; - frictionWrapper.updateFractureState( kfe, dispJump[kfe], traction[kfe], fractureState[kfe] ); + frictionWrapper.updateFractureState( dispJump[kfe], traction[kfe], fractureState[kfe] ); checkActiveSetSub.min( compareFractureStates( originalFractureState, fractureState[kfe] ) ); } } ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index d9c0e113851..64aed9bd227 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -63,6 +63,14 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase real64 const & dt, DomainPartition & domain ) override final; + template< typename WRAPPER_TYPE > + static void updateElasticSlip( EmbeddedSurfaceSubRegion const & subRegion, + WRAPPER_TYPE & frictionWrapper, + arrayView2d< real64 const > const & dispJump, + arrayView2d< real64 const > const & oldDispJump, + arrayView2d< real64 const > const & traction, + arrayView1d< integer > const & fractureState ); + virtual void assembleSystem( real64 const time, real64 const dt, DomainPartition & domain, From 47fffbcad13cad89102a6559ae26c08c2c157a38 Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Sun, 1 Dec 2024 20:31:27 -0800 Subject: [PATCH 265/286] refactor: Clean up ghost unpacking (#3381) * unpack ghost objects and their data separately in CommunicationTools::setupGhosts * new version of ParallelTopologyChange. that unpacks all objects first before their data and maps. * added persistent packing lists for the packToGhosts phase * Change mac builds to static linking to avoid runtime casting errors * re-enable fixup steps for fault import inconsistency fixes. these should be deleted after the fault import is fixed. * update baselines * update BASELINE_NOTES.md --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 5 + host-configs/apple/macOS_base.cmake | 2 +- inputFiles/surfaceGeneration/cube_8.vtu | 84 ++ inputFiles/surfaceGeneration/cube_8.xml | 235 +++ .../dataRepository/BufferOps_inline.hpp | 10 +- .../mesh/CellElementSubRegion.cpp | 5 + src/coreComponents/mesh/EdgeManager.cpp | 1 + .../mesh/ElementRegionManager.cpp | 190 ++- .../mesh/ElementRegionManager.hpp | 40 + .../mesh/FaceElementSubRegion.cpp | 63 + .../mesh/FaceElementSubRegion.hpp | 37 + src/coreComponents/mesh/FaceManager.cpp | 3 + src/coreComponents/mesh/NodeManager.cpp | 89 +- src/coreComponents/mesh/NodeManager.hpp | 7 + src/coreComponents/mesh/ObjectManagerBase.cpp | 3 +- src/coreComponents/mesh/ObjectManagerBase.hpp | 9 + .../mpiCommunications/CommunicationTools.cpp | 80 + .../mpiCommunications/CommunicationTools.hpp | 3 + .../mesh/mpiCommunications/MPI_iCommData.cpp | 32 +- .../NeighborCommunicator.cpp | 65 +- .../NeighborCommunicator.hpp | 18 +- .../surfaceGeneration/CMakeLists.txt | 1 + .../ParallelTopologyChange.cpp | 3 +- .../ParallelTopologyChange.hpp | 55 + .../ParallelTopologyChangeNoFixup.cpp | 1291 +++++++++++++++++ .../surfaceGeneration/SurfaceGenerator.cpp | 9 +- src/coreComponents/schema/schema.xsd.other | 17 + 28 files changed, 2294 insertions(+), 65 deletions(-) create mode 100644 inputFiles/surfaceGeneration/cube_8.vtu create mode 100644 inputFiles/surfaceGeneration/cube_8.xml create mode 100644 src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChangeNoFixup.cpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 2db739c29a8..0ebe2652f98 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr2957-9029-ff99ac0 + baseline: integratedTests/baseline_integratedTests-pr3381-9063-399123c allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 6169d1bc987..1fbd4cbfa9d 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3381 (2024-12-01) +===================== +A few baseline diffs for order FaceElementSubRegion::m_toFacesRelation map. Not sure why this was changed by this PR, but the previous order seems incorrect for a couple of cases. + + PR #2957 (2024-11-27) ===================== Added ExternalDataRepository. diff --git a/host-configs/apple/macOS_base.cmake b/host-configs/apple/macOS_base.cmake index 836e2b15936..ec74d15b9c1 100644 --- a/host-configs/apple/macOS_base.cmake +++ b/host-configs/apple/macOS_base.cmake @@ -29,7 +29,7 @@ set(ENABLE_DOXYGEN ON CACHE BOOL "" FORCE) set(ENABLE_SPHINX ON CACHE BOOL "" FORCE) set(ENABLE_MATHPRESSO ON CACHE BOOL "" FORCE ) -set(GEOS_BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE) +set(GEOS_BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) diff --git a/inputFiles/surfaceGeneration/cube_8.vtu b/inputFiles/surfaceGeneration/cube_8.vtu new file mode 100644 index 00000000000..150d23b3b1a --- /dev/null +++ b/inputFiles/surfaceGeneration/cube_8.vtu @@ -0,0 +1,84 @@ + + + + + + 0 1 2 + 3 4 5 + 6 7 8 + 9 10 11 + 12 13 14 + 15 16 17 + 18 19 20 + 21 22 23 + 24 25 26 + + + + + 0 1 2 3 4 5 6 7 + + + 3 3 3 3 3 3 + 3 3 3 3 3 3 + + + + + -1 -1 -1 + 0 -1 -1 + 1 -1 -1 + -1 0 -1 + 0 0 -1 + 1 0 -1 + -1 1 -1 + 0 1 -1 + 1 1 -1 + -1 -1 0 + 0 -1 0 + 1 -1 0 + -1 0 0 + 0 0 0 + 1 0 0 + -1 1 0 + 0 1 0 + 1 1 0 + -1 -1 1 + 0 -1 1 + 1 -1 1 + -1 0 1 + 0 0 1 + 1 0 1 + -1 1 1 + 0 1 1 + 1 1 1 + + + + + 0 1 4 3 9 10 13 12 + 1 2 5 4 10 11 14 13 + 3 4 7 6 12 13 16 15 + 4 5 8 7 13 14 17 16 + 9 10 13 12 18 19 22 21 + 10 11 14 13 19 20 23 22 + 12 13 16 15 21 22 25 24 + 13 14 17 16 22 23 26 25 + + + 8 + 16 + 24 + 32 + 40 + 48 + 56 + 64 + + + 12 12 12 12 12 12 12 12 + + + + + diff --git a/inputFiles/surfaceGeneration/cube_8.xml b/inputFiles/surfaceGeneration/cube_8.xml new file mode 100644 index 00000000000..2f002bb34b9 --- /dev/null +++ b/inputFiles/surfaceGeneration/cube_8.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/dataRepository/BufferOps_inline.hpp b/src/coreComponents/dataRepository/BufferOps_inline.hpp index 80486db5f5e..14b16a04402 100644 --- a/src/coreComponents/dataRepository/BufferOps_inline.hpp +++ b/src/coreComponents/dataRepository/BufferOps_inline.hpp @@ -1527,7 +1527,10 @@ Unpack( buffer_unit_type const * & buffer, relatedObjectGlobalToLocalMap, clearFlag ); - unmappedGlobalIndices[li].insert( unmappedIndices.data(), unmappedIndices.size() ); + if( unmappedIndices.size() > 0 ) + { + unmappedGlobalIndices[li].insert( unmappedIndices.data(), unmappedIndices.size() ); + } } return sizeOfUnpackedChars; } @@ -1644,7 +1647,10 @@ Unpack( buffer_unit_type const * & buffer, // insert unknown global indices related to the local index into an additional mapping to resolve externally unmapped.resize( LvArray::sortedArrayManipulation::makeSortedUnique( unmapped.begin(), unmapped.end() ) ); - unmappedGlobalIndices[li].insert( unmapped.begin(), unmapped.end() ); + if( unmapped.size() > 0 ) + { + unmappedGlobalIndices[li].insert( unmapped.begin(), unmapped.end() ); + } } // If there were element lists that didn't fit in the map, rebuild the whole thing diff --git a/src/coreComponents/mesh/CellElementSubRegion.cpp b/src/coreComponents/mesh/CellElementSubRegion.cpp index 0b13ba2dea2..255e732c8e3 100644 --- a/src/coreComponents/mesh/CellElementSubRegion.cpp +++ b/src/coreComponents/mesh/CellElementSubRegion.cpp @@ -192,6 +192,11 @@ localIndex CellElementSubRegion::unpackUpDownMaps( buffer_unit_type const * & bu this->globalToLocalMap(), faceList().relatedObjectGlobalToLocal() ); + + GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInNodelist.size(), 0 ); + GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInEdgelist.size(), 0 ); + GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInFacelist.size(), 0 ); + return unPackedSize; } diff --git a/src/coreComponents/mesh/EdgeManager.cpp b/src/coreComponents/mesh/EdgeManager.cpp index 6ef8d9daf97..e751cd61729 100644 --- a/src/coreComponents/mesh/EdgeManager.cpp +++ b/src/coreComponents/mesh/EdgeManager.cpp @@ -270,6 +270,7 @@ localIndex EdgeManager::unpackUpDownMaps( buffer_unit_type const * & buffer, m_toFacesRelation.relatedObjectGlobalToLocal(), overwriteUpMaps ); + GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInToNodes.size(), 0 ); return unPackedSize; } diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index 756da19f7ce..e953e42de03 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -18,6 +18,7 @@ #include "ElementRegionManager.hpp" +#include "common/DataLayouts.hpp" #include "common/TimingMacros.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "SurfaceElementRegion.hpp" @@ -30,6 +31,7 @@ #include "mesh/generators/LineBlockABC.hpp" #include "mesh/CellElementRegionSelector.hpp" + namespace geos { using namespace dataRepository; @@ -534,14 +536,6 @@ int ElementRegionManager::packUpDownMapsImpl( buffer_unit_type * & buffer, return packedSize; } -//template int -//ElementRegionManager:: -//PackUpDownMapsImpl( buffer_unit_type * & buffer, -// ElementViewAccessor> const & packList ) const; -//template int -//ElementRegionManager:: -//PackUpDownMapsImpl( buffer_unit_type * & buffer, -// ElementViewAccessor> const & packList ) const; int ElementRegionManager::unpackUpDownMaps( buffer_unit_type const * & buffer, @@ -577,6 +571,98 @@ ElementRegionManager::unpackUpDownMaps( buffer_unit_type const * & buffer, return unpackedSize; } +int ElementRegionManager::packFaceElementToFaceSize( ElementViewAccessor< arrayView1d< localIndex > > const & packList ) const +{ + buffer_unit_type * junk = nullptr; + return packFaceElementToFaceImpl< false >( junk, packList ); +} + +int ElementRegionManager::packFaceElementToFace( buffer_unit_type * & buffer, + ElementViewAccessor< arrayView1d< localIndex > > const & packList ) const +{ + return packFaceElementToFaceImpl< true >( buffer, packList ); +} + +template< bool DO_PACKING, typename T > +int ElementRegionManager::packFaceElementToFaceImpl( buffer_unit_type * & buffer, + T const & packList ) const +{ + int packedSize = 0; + + packedSize += bufferOps::Pack< DO_PACKING >( buffer, numRegions() ); + + for( typename dataRepository::indexType kReg=0; kReg( buffer, elemRegion.getName() ); + + + + localIndex numFaceElementSubregions = 0; + elemRegion.forElementSubRegionsIndex< FaceElementSubRegion >( + [&]( localIndex const, FaceElementSubRegion const & ) + { + ++numFaceElementSubregions; + } ); + + + packedSize += bufferOps::Pack< DO_PACKING >( buffer, numFaceElementSubregions ); + + elemRegion.forElementSubRegionsIndex< FaceElementSubRegion >( + [&]( localIndex const esr, FaceElementSubRegion const & subRegion ) + { + packedSize += bufferOps::Pack< DO_PACKING >( buffer, subRegion.getName() ); + + arrayView1d< localIndex > const elemList = packList[kReg][esr]; + if( DO_PACKING ) + { + packedSize += subRegion.packToFaceRelation( buffer, elemList ); + } + else + { + packedSize += subRegion.packToFaceRelationSize( elemList ); + } + } ); + } + + return packedSize; +} + + +int +ElementRegionManager::unpackFaceElementToFace( buffer_unit_type const * & buffer, + ElementReferenceAccessor< localIndex_array > & packList, + bool const overwriteMap ) +{ + int unpackedSize = 0; + + localIndex numRegionsRead; + unpackedSize += bufferOps::Unpack( buffer, numRegionsRead ); + for( localIndex kReg=0; kReg( + [&]( localIndex const kSubReg, FaceElementSubRegion & subRegion ) + { + string subRegionName; + unpackedSize += bufferOps::Unpack( buffer, subRegionName ); + GEOS_ERROR_IF( subRegionName != subRegion.getName(), + "Unpacked subregion name (" << subRegionName << ") does not equal object name (" << subRegion.getName() << ")" ); + + localIndex_array & elemList = packList[kReg][kSubReg]; + unpackedSize += subRegion.unpackToFaceRelation( buffer, elemList, false, overwriteMap ); + } ); + } + + return unpackedSize; +} + + int ElementRegionManager::packFracturedElementsSize( ElementViewAccessor< arrayView1d< localIndex > > const & packList, string const fractureRegionName ) const { @@ -706,6 +792,94 @@ ElementRegionManager::getCellBlockToSubRegionMap( CellBlockManagerABC const & ce return blockMap; } +void ElementRegionManager::outputObjectConnectivity() const +{ + int const numRanks = MpiWrapper::commSize(); + int const thisRank = MpiWrapper::commRank(); + + for( int rank=0; rankgetName().c_str() ); + + forElementRegions< CellElementRegion >( [&]( CellElementRegion const & elemRegion ) + { + elemRegion.forElementSubRegions< CellElementSubRegion >( [&]( CellElementSubRegion const & subRegion ) + { + printf( " %s\n", subRegion.getName().c_str() ); + + CellElementSubRegion::NodeMapType const & elemToNodeRelation = subRegion.nodeList(); + arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemToNode = elemToNodeRelation; + arrayView1d< globalIndex const > const & elemLocalToGlobal = subRegion.localToGlobalMap(); + auto const & elemGlobalToLocal = subRegion.globalToLocalMap(); + arrayView1d< globalIndex const > const & nodeLocalToGlobal = elemToNodeRelation.relatedObjectLocalToGlobal(); + auto const & refCoords = getParent().getGroup< NodeManager >( "nodeManager" ).referencePosition(); + + printf( " ElementToNodes map:\n" ); + for( localIndex k=0; k const sortedGlobalToLocalMap( elemGlobalToLocal.begin(), + elemGlobalToLocal.end()); + for( auto indexPair : sortedGlobalToLocalMap ) + { + globalIndex const gk = indexPair.first; + localIndex const k = indexPair.second; + + printf( " %3d( %3lld ): ", k, gk ); + for( localIndex a=0; a & packList, bool const overwriteMap ); + + /** + * @brief Get the buffer size needed to pack element-to-node and element-to-face maps. + * @param packList list of indices to pack + * @return the size of data packed. + */ + int packFaceElementToFaceSize( ElementViewAccessor< arrayView1d< localIndex > > const & packList ) const; + + /** + * @brief Pack element-to-node and element-to-face maps. + * @param buffer pointer to the buffer to be packed + * @param packList list of indices to pack + * @return the size of data packed. + */ + int packFaceElementToFace( buffer_unit_type * & buffer, + ElementViewAccessor< arrayView1d< localIndex > > const & packList ) const; + + /** + * @brief Unpack element-to-node and element-to-face maps. + * @param buffer pointer to the buffer to be unpacked + * @param packList list of indices to pack + * @param overwriteMap flag to indicate whether to overwrite the local map + * @return the size of data packed. + */ + int unpackFaceElementToFace( buffer_unit_type const * & buffer, + ElementReferenceAccessor< localIndex_array > & packList, + bool const overwriteMap ); + /** * @brief Get the buffer size needed to pack the set of fractured elements and the map toEmbSurfaces. * @param packList list of indices to pack @@ -1121,6 +1149,12 @@ class ElementRegionManager : public ObjectManagerBase ElementReferenceAccessor< localIndex_array > & packList, string const fractureRegionName ); + /** + * @brief Function to output connectivity in order to assist debugging issues + * with object connectivity. + */ + virtual void outputObjectConnectivity() const override final; + private: @@ -1154,6 +1188,12 @@ class ElementRegionManager : public ObjectManagerBase int packUpDownMapsImpl( buffer_unit_type * & buffer, T const & packList ) const; + + template< bool DO_PACKING, typename T > + int + packFaceElementToFaceImpl( buffer_unit_type * & buffer, + T const & packList ) const; + /** * @brief Unpack element-to-node and element-to-face maps. * @param buffer pointer to the buffer to be unpacked diff --git a/src/coreComponents/mesh/FaceElementSubRegion.cpp b/src/coreComponents/mesh/FaceElementSubRegion.cpp index 7593d4004e4..3537ca4fba4 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.cpp @@ -380,6 +380,64 @@ localIndex FaceElementSubRegion::unpackUpDownMaps( buffer_unit_type const * & bu packList, this->globalToLocalMap() ); + + GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInToNodes.size(), 0 ); + GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInToEdges.size(), 0 ); +// GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInToFaces.size(), 0 ); + + return unPackedSize; +} + +localIndex FaceElementSubRegion::packToFaceRelationSize( arrayView1d< localIndex const > const & packList ) const +{ + buffer_unit_type * junk = nullptr; + return packToFaceRelationImpl< false >( junk, packList ); +} + +localIndex FaceElementSubRegion::packToFaceRelation( buffer_unit_type * & buffer, + arrayView1d< localIndex const > const & packList ) const +{ + return packToFaceRelationImpl< true >( buffer, packList ); +} + + +template< bool DO_PACKING > +localIndex FaceElementSubRegion::packToFaceRelationImpl( buffer_unit_type * & buffer, + arrayView1d< localIndex const > const & packList ) const +{ + arrayView1d< globalIndex const > const localToGlobal = this->localToGlobalMap(); + arrayView1d< globalIndex const > const faceLocalToGlobal = m_toFacesRelation.relatedObjectLocalToGlobal(); + + localIndex packedSize = 0; + packedSize += bufferOps::Pack< DO_PACKING >( buffer, string( viewKeyStruct::faceListString() ) ); + packedSize += bufferOps::Pack< DO_PACKING >( buffer, + m_toFacesRelation.toViewConst(), + m_unmappedGlobalIndicesInToFaces, + packList, + localToGlobal, + faceLocalToGlobal ); + return packedSize; +} + + +localIndex FaceElementSubRegion::unpackToFaceRelation( buffer_unit_type const * & buffer, + localIndex_array & packList, + bool const GEOS_UNUSED_PARAM( overwriteUpMaps ), + bool const GEOS_UNUSED_PARAM( overwriteDownMaps ) ) +{ + localIndex unPackedSize = 0; + + string faceListString; + unPackedSize += bufferOps::Unpack( buffer, faceListString ); + GEOS_ERROR_IF_NE( faceListString, viewKeyStruct::faceListString() ); + + unPackedSize += bufferOps::Unpack( buffer, + m_toFacesRelation, + packList, + m_unmappedGlobalIndicesInToFaces, + this->globalToLocalMap(), + m_toFacesRelation.relatedObjectGlobalToLocal() ); + return unPackedSize; } @@ -452,6 +510,11 @@ void FaceElementSubRegion::fixUpDownMaps( bool const clearIfUnmapped ) clearIfUnmapped ); fixNeighborMappingsInconsistency( getName(), m_2dElemToElems, m_toFacesRelation ); + + GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInToNodes.size(), 0 ); + GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInToEdges.size(), 0 ); + GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInToFaces.size(), 0 ); + } /** diff --git a/src/coreComponents/mesh/FaceElementSubRegion.hpp b/src/coreComponents/mesh/FaceElementSubRegion.hpp index 5f9546f5160..41b4d298d94 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.hpp @@ -110,6 +110,38 @@ class FaceElementSubRegion : public SurfaceElementSubRegion bool const overwriteUpMaps, bool const overwriteDownMaps ) override; + + /** + * @brief Size of packing of the FaceElement to face relation. + * @param packList The list of face elements to pack + * @return The size of the packed data + */ + localIndex packToFaceRelationSize( arrayView1d< localIndex const > const & packList ) const; + + /** + * @brief Pack the FaceElement to face relation. + * @param buffer The buffer to pack the data into + * @param packList The list of face elements to pack + * @return The size of the packed data + */ + localIndex packToFaceRelation( buffer_unit_type * & buffer, + arrayView1d< localIndex const > const & packList ) const; + + /** + * @brief Unpack the FaceElement to face relation. + * @param buffer The buffer to unpack the data from + * @param packList The list of face elements to unpack + * @param overwriteUpMaps Flag to overwrite the up maps + * @param overwriteDownMaps Flag to overwrite the down maps + * @return The size of the unpacked data + */ + localIndex unpackToFaceRelation( buffer_unit_type const * & buffer, + array1d< localIndex > & packList, + bool const overwriteUpMaps, + bool const overwriteDownMaps ); + + + virtual void fixUpDownMaps( bool const clearIfUnmapped ) override; /** @@ -341,6 +373,11 @@ class FaceElementSubRegion : public SurfaceElementSubRegion localIndex packUpDownMapsImpl( buffer_unit_type * & buffer, arrayView1d< localIndex const > const & packList ) const; + + template< bool DO_PACKING > + localIndex packToFaceRelationImpl( buffer_unit_type * & buffer, + arrayView1d< localIndex const > const & packList ) const; + /// The array of shape function derivaties. array4d< real64 > m_dNdX; diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index 57db3425c2d..710e3d5d47b 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -518,6 +518,9 @@ localIndex FaceManager::unpackUpDownMaps( buffer_unit_type const * & buffer, m_toElements.getElementRegionManager(), overwriteUpMaps ); + GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInToNodes.size(), 0 ); + GEOS_ERROR_IF_NE( m_unmappedGlobalIndicesInToEdges.size(), 0 ); + return unPackedSize; } diff --git a/src/coreComponents/mesh/NodeManager.cpp b/src/coreComponents/mesh/NodeManager.cpp index d59752f09da..aa839d8cf4a 100644 --- a/src/coreComponents/mesh/NodeManager.cpp +++ b/src/coreComponents/mesh/NodeManager.cpp @@ -26,6 +26,7 @@ #include "mesh/FaceManager.hpp" #include "mesh/ToElementRelation.hpp" #include "mesh/utilities/MeshMapUtilities.hpp" +#include "common/MpiWrapper.hpp" namespace geos { @@ -271,7 +272,7 @@ localIndex NodeManager::unpackUpDownMaps( buffer_unit_type const * & buffer, string temp; unPackedSize += bufferOps::Unpack( buffer, temp ); - GEOS_ERROR_IF( temp != viewKeyStruct::edgeListString(), "" ); + GEOS_ERROR_IF_NE( temp, viewKeyStruct::edgeListString() ); unPackedSize += bufferOps::Unpack( buffer, m_toEdgesRelation, packList, @@ -360,6 +361,90 @@ void NodeManager::depopulateUpMaps( std::set< localIndex > const & receivedNodes } } -REGISTER_CATALOG_ENTRY( ObjectManagerBase, NodeManager, string const &, Group * const ) +void NodeManager::outputObjectConnectivity() const +{ + + int const numRanks = MpiWrapper::commSize(); + int const thisRank = MpiWrapper::commRank(); + + for( int rank=0; rankgetName().c_str() ); + + printf( " Reference positions:\n" ); + for( localIndex a=0; asize(); ++a ) + { + printf( " %3d( %3lld ): %6.2f, %6.2f, %6.2f \n", a, m_localToGlobalMap( a ), m_referencePosition( a, 0 ), m_referencePosition( a, 1 ), m_referencePosition( a, 2 ) ); + } + + printf( "\n Reference positions (sorted by global):\n" ); + map< globalIndex, localIndex > const sortedGlobalToLocalMap( m_globalToLocalMap.begin(), m_globalToLocalMap.end()); + for( auto indexPair : sortedGlobalToLocalMap ) + { + localIndex const a = indexPair.second; + printf( " %3d( %3lld ): %6.2f, %6.2f, %6.2f \n", a, m_localToGlobalMap( a ), m_referencePosition( a, 0 ), m_referencePosition( a, 1 ), m_referencePosition( a, 2 ) ); + } + + printf( " toEdgesRelation: \n" ); + arrayView1d< globalIndex const > const & edgeLocalToGlobal = m_toEdgesRelation.relatedObjectLocalToGlobal(); + for( localIndex a=0; asize(); ++a ) + { + printf( " %3d(%3lld): ", a, m_localToGlobalMap( a ) ); + + for( localIndex b=0; b const & faceLocalToGlobal = m_toFacesRelation.relatedObjectLocalToGlobal(); + for( localIndex a=0; asize(); ++a ) + { + printf( " %3d(%3lld): ", a, m_localToGlobalMap( a ) ); + + for( localIndex b=0; b & neighbors ) +{ + MPI_iCommData commData; + commData.resize( neighbors.size() ); + arrayView1d< globalIndex const > const & localToGlobal = objectManager.localToGlobalMap(); + + std::cout< const ghostsToSend = objectManager.getNeighborData( neighborRank ).ghostsToSend(); + array1d< globalIndex > ghostsToSendGlobal( ghostsToSend.size() ); + + std::cout<<" Rank "< ghostThatAreSentToMeGlobal; + + MpiWrapper::recv( ghostThatAreSentToMeGlobal, + neighborRank, + tag, + MPI_COMM_GEOS, + &commData.mpiRecvBufferStatus( i ) ); + + arrayView1d< localIndex const > const ghostsToRecv = objectManager.getNeighborData( neighborRank ).ghostsToReceive(); + array1d< globalIndex > ghostToRecvGlobal( ghostsToRecv.size() ); + + + std::cout<<" Rank "< & neighbors ); + private: std::set< int > m_freeCommIDs; static CommunicationTools * m_instance; diff --git a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp index 2e0d7920437..91160261987 100644 --- a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp +++ b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp @@ -37,14 +37,14 @@ MPI_iCommData::~MPI_iCommData() { for( int neighbor=0; neighbor >; -using ElemAdjListRefWrapType = ElementRegionManager::ElementViewAccessor< ReferenceWrapper< localIndex_array > >; -using ElemAdjListRefType = ElementRegionManager::ElementReferenceAccessor< localIndex_array >; inline int GhostSize( NodeManager & nodeManager, arrayView1d< localIndex const > const nodeAdjacencyList, EdgeManager & edgeManager, arrayView1d< localIndex const > const edgeAdjacencyList, FaceManager & faceManager, arrayView1d< localIndex const > const faceAdjacencyList, - ElementRegionManager & elemManager, ElemAdjListViewType const & elementAdjacencyList ) + ElementRegionManager & elemManager, NeighborCommunicator::ElemAdjListViewType const & elementAdjacencyList ) { int bufferSize = 0; bufferSize += nodeManager.packGlobalMapsSize( nodeAdjacencyList, 0 ); @@ -211,7 +208,7 @@ inline int PackGhosts( buffer_unit_type * sendBufferPtr, NodeManager & nodeManager, arrayView1d< localIndex const > const nodeAdjacencyList, EdgeManager & edgeManager, arrayView1d< localIndex const > const edgeAdjacencyList, FaceManager & faceManager, arrayView1d< localIndex const > const faceAdjacencyList, - ElementRegionManager & elemManager, ElemAdjListViewType const & elementAdjacencyList ) + ElementRegionManager & elemManager, NeighborCommunicator::ElemAdjListViewType const & elementAdjacencyList ) { int packedSize = 0; packedSize += nodeManager.packGlobalMaps( sendBufferPtr, nodeAdjacencyList, 0 ); @@ -301,43 +298,55 @@ void NeighborCommunicator::unpackGhosts( MeshLevel & mesh, ElementRegionManager & elemManager = mesh.getElemManager(); buffer_type const & receiveBuff = receiveBuffer( commID ); - buffer_unit_type const * receiveBufferPtr = receiveBuff.data(); + m_receiveBufferPtr = receiveBuff.data(); + + m_unpackedSize = 0; - buffer_type::size_type unpackedSize = 0; + m_nodeUnpackList.resize( 0 ); + m_unpackedSize += nodeManager.unpackGlobalMaps( m_receiveBufferPtr, m_nodeUnpackList, 0 ); - localIndex_array nodeUnpackList; - unpackedSize += nodeManager.unpackGlobalMaps( receiveBufferPtr, nodeUnpackList, 0 ); + m_edgeUnpackList.resize( 0 ); + m_unpackedSize += edgeManager.unpackGlobalMaps( m_receiveBufferPtr, m_edgeUnpackList, 0 ); - localIndex_array edgeUnpackList; - unpackedSize += edgeManager.unpackGlobalMaps( receiveBufferPtr, edgeUnpackList, 0 ); + m_faceUnpackList.resize( 0 ); + m_unpackedSize += faceManager.unpackGlobalMaps( m_receiveBufferPtr, m_faceUnpackList, 0 ); - localIndex_array faceUnpackList; - unpackedSize += faceManager.unpackGlobalMaps( receiveBufferPtr, faceUnpackList, 0 ); + m_elementAdjacencyReceiveListArray = elemManager.constructReferenceAccessor< localIndex_array >( ObjectManagerBase::viewKeyStruct::ghostsToReceiveString(), + std::to_string( this->m_neighborRank ) ); - ElemAdjListRefType elementAdjacencyReceiveListArray = - elemManager.constructReferenceAccessor< localIndex_array >( ObjectManagerBase::viewKeyStruct::ghostsToReceiveString(), - std::to_string( this->m_neighborRank ) ); - unpackedSize += elemManager.unpackGlobalMaps( receiveBufferPtr, - elementAdjacencyReceiveListArray ); + m_unpackedSize += elemManager.unpackGlobalMaps( m_receiveBufferPtr, + m_elementAdjacencyReceiveListArray ); + +} + +void NeighborCommunicator::unpackGhostsData( MeshLevel & mesh, + int const commID ) +{ + NodeManager & nodeManager = mesh.getNodeManager(); + EdgeManager & edgeManager = mesh.getEdgeManager(); + FaceManager & faceManager = mesh.getFaceManager(); + ElementRegionManager & elemManager = mesh.getElemManager(); ElemAdjListViewType elementAdjacencyReceiveList = elemManager.constructViewAccessor< array1d< localIndex >, arrayView1d< localIndex > >( ObjectManagerBase::viewKeyStruct::ghostsToReceiveString(), std::to_string( this->m_neighborRank ) ); - unpackedSize += nodeManager.unpackUpDownMaps( receiveBufferPtr, nodeUnpackList, false, false ); - unpackedSize += edgeManager.unpackUpDownMaps( receiveBufferPtr, edgeUnpackList, false, false ); - unpackedSize += faceManager.unpackUpDownMaps( receiveBufferPtr, faceUnpackList, false, false ); - unpackedSize += elemManager.unpackUpDownMaps( receiveBufferPtr, elementAdjacencyReceiveListArray, false ); + + m_unpackedSize += nodeManager.unpackUpDownMaps( m_receiveBufferPtr, m_nodeUnpackList, false, false ); + m_unpackedSize += edgeManager.unpackUpDownMaps( m_receiveBufferPtr, m_edgeUnpackList, false, false ); + m_unpackedSize += faceManager.unpackUpDownMaps( m_receiveBufferPtr, m_faceUnpackList, false, false ); + m_unpackedSize += elemManager.unpackUpDownMaps( m_receiveBufferPtr, m_elementAdjacencyReceiveListArray, false ); parallelDeviceEvents events; - unpackedSize += nodeManager.unpack( receiveBufferPtr, nodeUnpackList, 0, false, events ); - unpackedSize += edgeManager.unpack( receiveBufferPtr, edgeUnpackList, 0, false, events ); - unpackedSize += faceManager.unpack( receiveBufferPtr, faceUnpackList, 0, false, events ); - unpackedSize += elemManager.unpack( receiveBufferPtr, elementAdjacencyReceiveList ); - waitAllDeviceEvents( events ); + m_unpackedSize += nodeManager.unpack( m_receiveBufferPtr, m_nodeUnpackList, 0, false, events ); + m_unpackedSize += edgeManager.unpack( m_receiveBufferPtr, m_edgeUnpackList, 0, false, events ); + m_unpackedSize += faceManager.unpack( m_receiveBufferPtr, m_faceUnpackList, 0, false, events ); + m_unpackedSize += elemManager.unpack( m_receiveBufferPtr, elementAdjacencyReceiveList ); - GEOS_ERROR_IF_NE( receiveBuff.size(), unpackedSize ); + waitAllDeviceEvents( events ); + buffer_type const & receiveBuff = receiveBuffer( commID ); + GEOS_ERROR_IF_NE( receiveBuff.size(), m_unpackedSize ); } void NeighborCommunicator::prepareAndSendSyncLists( MeshLevel const & mesh, diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp index 43314f693a6..f5d52efd988 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp @@ -22,6 +22,7 @@ #include "common/GEOS_RAJA_Interface.hpp" #include "dataRepository/ReferenceWrapper.hpp" #include "LvArray/src/limits.hpp" +#include "../ElementRegionManager.hpp" namespace geos { @@ -41,6 +42,9 @@ class MPI_iCommData; class NeighborCommunicator { public: + using ElemAdjListViewType = ElementRegionManager::ElementViewAccessor< arrayView1d< localIndex > >; + using ElemAdjListRefWrapType = ElementRegionManager::ElementViewAccessor< ReferenceWrapper< localIndex_array > >; + using ElemAdjListRefType = ElementRegionManager::ElementReferenceAccessor< localIndex_array >; explicit NeighborCommunicator( int rank ); @@ -193,6 +197,9 @@ class NeighborCommunicator void unpackGhosts( MeshLevel & meshLevel, int const commID ); + void unpackGhostsData( MeshLevel & meshLevel, + int const commID ); + /** * Posts non-blocking sends to m_neighborRank for * both the size and regular communication buffers @@ -210,7 +217,7 @@ class NeighborCommunicator /** * Unpack the receive buffer and process synchronization - * list information recieved from m_neighborRank. + * list information received from m_neighborRank. * This must be called after PostRecv is called, and * the request associated with that recv has * completed (retrieve the request using GetRecvRequest) @@ -294,6 +301,15 @@ class NeighborCommunicator std::vector< buffer_type > m_sendBuffer; std::vector< buffer_type > m_receiveBuffer; + localIndex_array m_nodeUnpackList; + localIndex_array m_edgeUnpackList; + localIndex_array m_faceUnpackList; + ElemAdjListRefType m_elementAdjacencyReceiveListArray; + buffer_type::size_type m_unpackedSize = 0; + buffer_unit_type const * m_receiveBufferPtr = nullptr; + + + }; template< typename T > diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt b/src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt index 9bcfd8fdc9b..eb2b85d0357 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/CMakeLists.txt @@ -17,5 +17,6 @@ set( physicsSolvers_sources surfaceGeneration/EmbeddedSurfaceGenerator.cpp surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp surfaceGeneration/ParallelTopologyChange.cpp + surfaceGeneration/ParallelTopologyChangeNoFixup.cpp surfaceGeneration/SurfaceGenerator.cpp PARENT_SCOPE ) \ No newline at end of file diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp index 1d1611346e9..1c7a39796fb 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp @@ -26,7 +26,7 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "mesh/mpiCommunications/MPI_iCommData.hpp" - +#if PARALLEL_TOPOLOGY_CHANGE_METHOD==0 namespace geos { @@ -1024,3 +1024,4 @@ void parallelTopologyChange::synchronizeTopologyChange( MeshLevel * const mesh, } /* namespace geos */ +#endif // PARALLEL_TOPOLOGY_CHANGE_METHOD==0 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp index 901a12b30af..5d7f42debf3 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp @@ -22,6 +22,8 @@ #include "physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp" +#define PARALLEL_TOPOLOGY_CHANGE_METHOD 1 + namespace geos { class MeshLevel; @@ -37,6 +39,59 @@ void synchronizeTopologyChange( MeshLevel * const mesh, ModifiedObjectLists & receivedObjects, int mpiCommOrder ); + + +struct TopologyChangeStepData +{ + void init( ElementRegionManager const & elemManager ) + { + m_nodes.resize( 0 ); + m_edges.resize( 0 ); + m_faces.resize( 0 ); + m_elements.resize( elemManager.numRegions() ); + m_elementsView.resize( elemManager.numRegions() ); + m_elementsData.resize( elemManager.numRegions() ); + m_size = 0; + + for( localIndex er=0; er m_elements; + ElementRegionManager::ElementViewAccessor< arrayView1d< localIndex > > m_elementsView; + + array1d< array1d< localIndex_array > > m_elementsData; + buffer_type::size_type m_size; + +}; + +struct TopologyChangeUnpackStepData : public TopologyChangeStepData +{ + void init( buffer_type const & receiveBuffer, + ElementRegionManager const & elemManager ) + { + m_bufferPtr = receiveBuffer.data(); + TopologyChangeStepData::init( elemManager ); + } + + buffer_unit_type const * m_bufferPtr; +}; + } } diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChangeNoFixup.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChangeNoFixup.cpp new file mode 100644 index 00000000000..174f4f701ad --- /dev/null +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChangeNoFixup.cpp @@ -0,0 +1,1291 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 ParallelTopologyChange.cpp + */ + +#include "ParallelTopologyChange.hpp" + +#include "common/GeosxMacros.hpp" +#include "common/TimingMacros.hpp" +#include "mesh/ElementRegionManager.hpp" +#include "mesh/MeshFields.hpp" +#include "mesh/mpiCommunications/CommunicationTools.hpp" +#include "mesh/mpiCommunications/MPI_iCommData.hpp" + +#if PARALLEL_TOPOLOGY_CHANGE_METHOD==1 +namespace geos +{ + +using namespace dataRepository; + +namespace parallelTopologyChange +{ + + +template< typename T > +void filterNonOwnedFromContainer( array1d< localIndex > & newList, + T const & container, + arrayView1d< localIndex const > const & ghostRank, + integer const neighborRank ) +{ + newList.resize( container.size()); + { + localIndex a=0; + for( auto index : container ) + { + if( ghostRank[index] == neighborRank ) + { + newList[a] = index; + ++a; + } + } + newList.resize( a ); + } +} + +template< typename T > +void filterNonOwnedFromContainer( array1d< localIndex > & newList, + T const & container, + arrayView1d< localIndex const > const & parentIndices, + arrayView1d< localIndex const > const & ghostRank, + integer const neighborRank ) +{ + newList.resize( container.size()); + { + localIndex a=0; + for( auto index : container ) + { + localIndex const parentIndex = ObjectManagerBase::getParentRecursive( parentIndices, index ); + if( ghostRank[parentIndex] == neighborRank ) + { + newList[a] = index; + ++a; + } + } + newList.resize( a ); + } +} + +void filterNewObjectsForPackToGhosts( std::set< localIndex > const & objectList, + arrayView1d< localIndex > const & parentIndices, + localIndex_array & ghostsToSend, + localIndex_array & objectsToSend ) +{ + + ghostsToSend.move( hostMemorySpace ); + //TODO this needs to be inverted since the ghostToSend list should be much longer.... + // and the objectList is a searchable set. + for( auto const index : objectList ) + { + localIndex const parentIndex = parentIndices[index]; + for( localIndex a=0; a const & objectList, + localIndex_array const & ghostsToSend, + localIndex_array & objectsToSend ) +{ + ghostsToSend.move( hostMemorySpace ); + for( localIndex a=0; a 0 ) + { + objectsToSend.emplace_back( ghostsToSend[a] ); + } + } +} + + + +//***** 1A *****// +void packNewAndModifiedObjectsToOwningRanks( NeighborCommunicator & neighbor, + MeshLevel * const meshLevel, + ModifiedObjectLists const & modifiedObjects, + int const commID ) +{ + int bufferSize = 0; + + NodeManager & nodeManager = meshLevel->getNodeManager(); + EdgeManager & edgeManager = meshLevel->getEdgeManager(); + FaceManager & faceManager = meshLevel->getFaceManager(); + ElementRegionManager & elemManager = meshLevel->getElemManager(); + + arrayView1d< integer const > const & nodeGhostRank = nodeManager.ghostRank(); + arrayView1d< integer const > const & edgeGhostRank = edgeManager.ghostRank(); + arrayView1d< integer const > const & faceGhostRank = faceManager.ghostRank(); + + arrayView1d< localIndex const > const & parentNodeIndices = nodeManager.getField< fields::parentIndex >(); + arrayView1d< localIndex const > const & parentEdgeIndices = edgeManager.getField< fields::parentIndex >(); + arrayView1d< localIndex const > const & parentFaceIndices = faceManager.getField< fields::parentIndex >(); + + int const neighborRank = neighbor.neighborRank(); + + array1d< localIndex > newNodePackListArray; filterNonOwnedFromContainer( newNodePackListArray, modifiedObjects.newNodes, parentNodeIndices, nodeGhostRank, neighborRank ); + array1d< localIndex > modNodePackListArray; filterNonOwnedFromContainer( modNodePackListArray, modifiedObjects.modifiedNodes, parentNodeIndices, nodeGhostRank, neighborRank ); + array1d< localIndex > newEdgePackListArray; filterNonOwnedFromContainer( newEdgePackListArray, modifiedObjects.newEdges, parentEdgeIndices, edgeGhostRank, neighborRank ); + array1d< localIndex > modEdgePackListArray; filterNonOwnedFromContainer( modEdgePackListArray, modifiedObjects.modifiedEdges, parentEdgeIndices, edgeGhostRank, neighborRank ); + array1d< localIndex > newFacePackListArray; filterNonOwnedFromContainer( newFacePackListArray, modifiedObjects.newFaces, parentFaceIndices, faceGhostRank, neighborRank ); + array1d< localIndex > modFacePackListArray; filterNonOwnedFromContainer( modFacePackListArray, modifiedObjects.modifiedFaces, parentFaceIndices, faceGhostRank, neighborRank ); + + + ElementRegionManager::ElementViewAccessor< arrayView1d< localIndex > > newElemPackList; + array1d< array1d< localIndex_array > > newElemData; + ElementRegionManager::ElementReferenceAccessor< localIndex_array > modElemPackList; + array1d< array1d< localIndex_array > > modElemData; + newElemPackList.resize( elemManager.numRegions()); + newElemData.resize( elemManager.numRegions()); + modElemPackList.resize( elemManager.numRegions()); + modElemData.resize( elemManager.numRegions()); + for( localIndex er=0; er const & subRegionGhostRank = subRegion.ghostRank(); + if( modifiedObjects.modifiedElements.count( {er, esr} ) > 0 ) + { + std::set< localIndex > const & elemList = modifiedObjects.modifiedElements.at( {er, esr} ); + filterNonOwnedFromContainer( modElemData[er][esr], elemList, subRegionGhostRank, neighborRank ); + } + + if( modifiedObjects.newElements.count( {er, esr} ) > 0 ) + { + std::set< localIndex > const & elemList = modifiedObjects.newElements.at( {er, esr} ); + filterNonOwnedFromContainer( newElemData[er][esr], elemList, subRegionGhostRank, neighborRank ); + } + + newElemPackList[er][esr] = newElemData[er][esr]; + modElemPackList[er][esr].set( modElemData[er][esr] ); + } + } + + // if we start packing sizing on device + async, poll for completion + parallelDeviceEvents sizeEvents; + bufferSize += nodeManager.packGlobalMapsSize( newNodePackListArray, 0 ); + bufferSize += edgeManager.packGlobalMapsSize( newEdgePackListArray, 0 ); + bufferSize += faceManager.packGlobalMapsSize( newFacePackListArray, 0 ); + bufferSize += elemManager.packGlobalMapsSize( newElemPackList ); + + bufferSize += nodeManager.packParentChildMapsSize( newNodePackListArray ); + bufferSize += edgeManager.packParentChildMapsSize( newEdgePackListArray ); + bufferSize += faceManager.packParentChildMapsSize( newFacePackListArray ); + bufferSize += elemManager.packFaceElementToFaceSize( newElemPackList ); + + bufferSize += nodeManager.packUpDownMapsSize( newNodePackListArray ); + bufferSize += edgeManager.packUpDownMapsSize( newEdgePackListArray ); + bufferSize += faceManager.packUpDownMapsSize( newFacePackListArray ); + bufferSize += elemManager.packUpDownMapsSize( newElemPackList ); + + bufferSize += nodeManager.packSize( newNodePackListArray, 0, false, sizeEvents ); + bufferSize += edgeManager.packSize( newEdgePackListArray, 0, false, sizeEvents ); + bufferSize += faceManager.packSize( newFacePackListArray, 0, false, sizeEvents ); + bufferSize += elemManager.packSize( newElemPackList ); + + bufferSize += nodeManager.packUpDownMapsSize( modNodePackListArray ); + bufferSize += edgeManager.packUpDownMapsSize( modEdgePackListArray ); + bufferSize += faceManager.packUpDownMapsSize( modFacePackListArray ); + bufferSize += elemManager.packUpDownMapsSize( modElemPackList ); + + bufferSize += nodeManager.packParentChildMapsSize( modNodePackListArray ); + bufferSize += edgeManager.packParentChildMapsSize( modEdgePackListArray ); + bufferSize += faceManager.packParentChildMapsSize( modFacePackListArray ); + + bufferSize += nodeManager.packSize( modNodePackListArray, 0, false, sizeEvents ); + bufferSize += edgeManager.packSize( modEdgePackListArray, 0, false, sizeEvents ); + bufferSize += faceManager.packSize( modFacePackListArray, 0, false, sizeEvents ); + + waitAllDeviceEvents( sizeEvents ); + neighbor.resizeSendBuffer( commID, bufferSize ); + + buffer_type & sendBuffer = neighbor.sendBuffer( commID ); + buffer_unit_type * sendBufferPtr = sendBuffer.data(); + + // empty event buffer + int packedSize = 0; + parallelDeviceEvents packEvents; + + packedSize += nodeManager.packGlobalMaps( sendBufferPtr, newNodePackListArray, 0 ); + packedSize += edgeManager.packGlobalMaps( sendBufferPtr, newEdgePackListArray, 0 ); + packedSize += faceManager.packGlobalMaps( sendBufferPtr, newFacePackListArray, 0 ); + packedSize += elemManager.packGlobalMaps( sendBufferPtr, newElemPackList ); + + packedSize += nodeManager.packParentChildMaps( sendBufferPtr, newNodePackListArray ); + packedSize += edgeManager.packParentChildMaps( sendBufferPtr, newEdgePackListArray ); + packedSize += faceManager.packParentChildMaps( sendBufferPtr, newFacePackListArray ); + packedSize += elemManager.packFaceElementToFace( sendBufferPtr, newElemPackList ); + + packedSize += nodeManager.packUpDownMaps( sendBufferPtr, newNodePackListArray ); + packedSize += edgeManager.packUpDownMaps( sendBufferPtr, newEdgePackListArray ); + packedSize += faceManager.packUpDownMaps( sendBufferPtr, newFacePackListArray ); + packedSize += elemManager.packUpDownMaps( sendBufferPtr, newElemPackList ); + + packedSize += nodeManager.pack( sendBufferPtr, newNodePackListArray, 0, false, packEvents ); + packedSize += edgeManager.pack( sendBufferPtr, newEdgePackListArray, 0, false, packEvents ); + packedSize += faceManager.pack( sendBufferPtr, newFacePackListArray, 0, false, packEvents ); + packedSize += elemManager.pack( sendBufferPtr, newElemPackList ); + + packedSize += nodeManager.packUpDownMaps( sendBufferPtr, modNodePackListArray ); + packedSize += edgeManager.packUpDownMaps( sendBufferPtr, modEdgePackListArray ); + packedSize += faceManager.packUpDownMaps( sendBufferPtr, modFacePackListArray ); + packedSize += elemManager.packUpDownMaps( sendBufferPtr, modElemPackList ); + + packedSize += nodeManager.packParentChildMaps( sendBufferPtr, modNodePackListArray ); + packedSize += edgeManager.packParentChildMaps( sendBufferPtr, modEdgePackListArray ); + packedSize += faceManager.packParentChildMaps( sendBufferPtr, modFacePackListArray ); + + packedSize += nodeManager.pack( sendBufferPtr, modNodePackListArray, 0, false, packEvents ); + packedSize += edgeManager.pack( sendBufferPtr, modEdgePackListArray, 0, false, packEvents ); + packedSize += faceManager.pack( sendBufferPtr, modFacePackListArray, 0, false, packEvents ); + + // poll for pack completion here + waitAllDeviceEvents( packEvents ); + GEOS_ERROR_IF( bufferSize != packedSize, + "Allocated Buffer Size ("<getNodeManager(); + EdgeManager & edgeManager = mesh->getEdgeManager(); + FaceManager & faceManager = mesh->getFaceManager(); + ElementRegionManager & elemManager = mesh->getElemManager(); + + unpackStateData.init( neighbor.receiveBuffer( commID ), elemManager ); + buffer_unit_type const * & receiveBufferPtr = unpackStateData.m_bufferPtr; + + localIndex_array & newLocalNodes = unpackStateData.m_nodes; + localIndex_array & newLocalEdges = unpackStateData.m_edges; + localIndex_array & newLocalFaces = unpackStateData.m_faces; + ElementRegionManager::ElementReferenceAccessor< array1d< localIndex > > & newLocalElements = unpackStateData.m_elements; + array1d< array1d< localIndex_array > > & newLocalElementsData = unpackStateData.m_elementsData; + + newLocalNodes.resize( 0 ); + newLocalEdges.resize( 0 ); + newLocalFaces.resize( 0 ); + + + newLocalElements.resize( elemManager.numRegions()); + newLocalElementsData.resize( elemManager.numRegions()); + for( localIndex er=0; er & allNewNodes = receivedObjects.newNodes; + std::set< localIndex > & allNewEdges = receivedObjects.newEdges; + std::set< localIndex > & allNewFaces = receivedObjects.newFaces; + map< std::pair< localIndex, localIndex >, std::set< localIndex > > & allNewElements = receivedObjects.newElements; + + allNewNodes.insert( newLocalNodes.begin(), newLocalNodes.end() ); + allNewEdges.insert( newLocalEdges.begin(), newLocalEdges.end() ); + allNewFaces.insert( newLocalFaces.begin(), newLocalFaces.end() ); + + for( localIndex er=0; ergetNodeManager(); + EdgeManager & edgeManager = mesh->getEdgeManager(); + FaceManager & faceManager = mesh->getFaceManager(); + ElementRegionManager & elemManager = mesh->getElemManager(); + + localIndex_array & newNodesToSend = packData.m_nodes; + localIndex_array & newEdgesToSend = packData.m_edges; + localIndex_array & newFacesToSend = packData.m_faces; + ElementRegionManager::ElementViewAccessor< arrayView1d< localIndex > > & newElemsToSend = packData.m_elementsView; + array1d< array1d< localIndex_array > > & newElemsToSendData = packData.m_elementsData; + + + localIndex_array & nodeGhostsToSend = nodeManager.getNeighborData( neighbor.neighborRank() ).ghostsToSend(); + localIndex_array & edgeGhostsToSend = edgeManager.getNeighborData( neighbor.neighborRank() ).ghostsToSend(); + localIndex_array & faceGhostsToSend = faceManager.getNeighborData( neighbor.neighborRank() ).ghostsToSend(); + + arrayView1d< localIndex > const & nodalParentIndices = nodeManager.getField< fields::parentIndex >(); + arrayView1d< localIndex > const & edgeParentIndices = edgeManager.getField< fields::parentIndex >(); + arrayView1d< localIndex > const & faceParentIndices = faceManager.getField< fields::parentIndex >(); + + filterNewObjectsForPackToGhosts( modifiedObjects.newNodes, nodalParentIndices, nodeGhostsToSend, newNodesToSend ); + filterNewObjectsForPackToGhosts( modifiedObjects.newEdges, edgeParentIndices, edgeGhostsToSend, newEdgesToSend ); + filterNewObjectsForPackToGhosts( modifiedObjects.newFaces, faceParentIndices, faceGhostsToSend, newFacesToSend ); + + SortedArray< localIndex > faceGhostsToSendSet; + for( localIndex const & kf : faceGhostsToSend ) + { + faceGhostsToSendSet.insert( kf ); + } + + newElemsToSendData.resize( elemManager.numRegions() ); + newElemsToSend.resize( elemManager.numRegions() ); + for( localIndex er=0; er( [&]( localIndex const esr, + FaceElementSubRegion & subRegion ) + { + arrayView2d< localIndex const > const faceList = subRegion.faceList().toViewConst(); + localIndex_array & elemGhostsToSend = subRegion.getNeighborData( neighbor.neighborRank() ).ghostsToSend(); + elemGhostsToSend.move( hostMemorySpace ); + for( localIndex const & k : modifiedObjects.newElements.at( {er, esr} ) ) + { + if( faceGhostsToSendSet.count( faceList( k, 0 ) ) ) + { + newElemsToSendData[er][esr].emplace_back( k ); + elemGhostsToSend.emplace_back( k ); + } + } + newElemsToSend[er][esr] = newElemsToSendData[er][esr]; + } ); + } + + int bufferSize = 0; + + bufferSize += nodeManager.packGlobalMapsSize( newNodesToSend, 0 ); + bufferSize += edgeManager.packGlobalMapsSize( newEdgesToSend, 0 ); + bufferSize += faceManager.packGlobalMapsSize( newFacesToSend, 0 ); + bufferSize += elemManager.packGlobalMapsSize( newElemsToSend ); + bufferSize += elemManager.packFaceElementToFaceSize( newElemsToSend ); + + neighbor.resizeSendBuffer( commID, bufferSize ); + + buffer_type & sendBuffer = neighbor.sendBuffer( commID ); + buffer_unit_type * sendBufferPtr = sendBuffer.data(); + + int packedSize = 0; + + packedSize += nodeManager.packGlobalMaps( sendBufferPtr, newNodesToSend, 0 ); + packedSize += edgeManager.packGlobalMaps( sendBufferPtr, newEdgesToSend, 0 ); + packedSize += faceManager.packGlobalMaps( sendBufferPtr, newFacesToSend, 0 ); + packedSize += elemManager.packGlobalMaps( sendBufferPtr, newElemsToSend ); + packedSize += elemManager.packFaceElementToFace( sendBufferPtr, newElemsToSend ); + + GEOS_ERROR_IF( bufferSize != packedSize, "Allocated Buffer Size is not equal to packed buffer size" ); +} + + +//***** 2b *****// +void unpackNewObjectsOnGhosts( NeighborCommunicator & neighbor, + int commID, + MeshLevel * const mesh, + ModifiedObjectLists & receivedObjects ) +{ + + NodeManager & nodeManager = mesh->getNodeManager(); + EdgeManager & edgeManager = mesh->getEdgeManager(); + FaceManager & faceManager = mesh->getFaceManager(); + ElementRegionManager & elemManager = mesh->getElemManager(); + + localIndex_array & nodeGhostsToRecv = nodeManager.getNeighborData( neighbor.neighborRank() ).ghostsToReceive(); + localIndex_array & edgeGhostsToRecv = edgeManager.getNeighborData( neighbor.neighborRank() ).ghostsToReceive(); + localIndex_array & faceGhostsToRecv = faceManager.getNeighborData( neighbor.neighborRank() ).ghostsToReceive(); + + buffer_type const & receiveBuffer = neighbor.receiveBuffer( commID ); + buffer_unit_type const * receiveBufferPtr = receiveBuffer.data(); + + localIndex_array newGhostNodes; + localIndex_array newGhostEdges; + localIndex_array newGhostFaces; + + ElementRegionManager::ElementReferenceAccessor< localIndex_array > newGhostElems; + array1d< array1d< localIndex_array > > newGhostElemsData; + newGhostElems.resize( elemManager.numRegions() ); + newGhostElemsData.resize( elemManager.numRegions() ); + for( localIndex er=0; er 0 ) + { + nodeGhostsToRecv.move( hostMemorySpace ); + for( localIndex a=0; a 0 ) + { + edgeGhostsToRecv.move( hostMemorySpace ); + for( localIndex a=0; a 0 ) + { + faceGhostsToRecv.move( hostMemorySpace ); + for( localIndex a=0; a( + [&]( localIndex const er, localIndex const esr, ElementRegionBase &, ElementSubRegionBase & subRegion ) + { + localIndex_array & elemGhostsToReceive = subRegion.getNeighborData( neighbor.neighborRank() ).ghostsToReceive(); + if( newGhostElemsData[er][esr].size() > 0 ) + { + elemGhostsToReceive.move( hostMemorySpace ); + + for( localIndex const & newElemIndex : newGhostElemsData[er][esr] ) + { + elemGhostsToReceive.emplace_back( newElemIndex ); + receivedObjects.newElements[ { er, esr } ].insert( newElemIndex ); + } + } + } ); + + receivedObjects.newNodes.insert( newGhostNodes.begin(), newGhostNodes.end() ); + receivedObjects.newEdges.insert( newGhostEdges.begin(), newGhostEdges.end() ); + receivedObjects.newFaces.insert( newGhostFaces.begin(), newGhostFaces.end() ); +} + + + +//***** 3a *****// +localIndex unpackNewAndModifiedObjectsDataOnOwningRanks( MeshLevel * const mesh, + ModifiedObjectLists & receivedObjects, + TopologyChangeUnpackStepData & unpackStateData ) +{ + GEOS_MARK_FUNCTION; + + NodeManager & nodeManager = mesh->getNodeManager(); + EdgeManager & edgeManager = mesh->getEdgeManager(); + FaceManager & faceManager = mesh->getFaceManager(); + ElementRegionManager & elemManager = mesh->getElemManager(); + + buffer_unit_type const * & receiveBufferPtr = unpackStateData.m_bufferPtr; + + localIndex_array & newLocalNodes = unpackStateData.m_nodes; + localIndex_array & newLocalEdges = unpackStateData.m_edges; + localIndex_array & newLocalFaces = unpackStateData.m_faces; + + ElementRegionManager::ElementReferenceAccessor< array1d< localIndex > > & newLocalElements = unpackStateData.m_elements; + + localIndex_array modifiedLocalNodes; + localIndex_array modifiedLocalEdges; + localIndex_array modifiedLocalFaces; + + ElementRegionManager::ElementReferenceAccessor< localIndex_array > modifiedLocalElements; + array1d< array1d< localIndex_array > > modifiedLocalElementsData; + + modifiedLocalElements.resize( elemManager.numRegions()); + modifiedLocalElementsData.resize( elemManager.numRegions()); + for( localIndex er=0; er & allModifiedNodes = receivedObjects.modifiedNodes; + std::set< localIndex > & allModifiedEdges = receivedObjects.modifiedEdges; + std::set< localIndex > & allModifiedFaces = receivedObjects.modifiedFaces; + map< std::pair< localIndex, localIndex >, std::set< localIndex > > & allModifiedElements = receivedObjects.modifiedElements; + + allModifiedNodes.insert( modifiedLocalNodes.begin(), modifiedLocalNodes.end() ); + + allModifiedEdges.insert( modifiedLocalEdges.begin(), modifiedLocalEdges.end() ); + + allModifiedFaces.insert( modifiedLocalFaces.begin(), modifiedLocalFaces.end() ); + + for( localIndex er=0; ergetNodeManager(); + EdgeManager & edgeManager = mesh->getEdgeManager(); + FaceManager & faceManager = mesh->getFaceManager(); + ElementRegionManager & elemManager = mesh->getElemManager(); + + localIndex_array & newNodesToSend = packData.m_nodes; + localIndex_array & newEdgesToSend = packData.m_edges; + localIndex_array & newFacesToSend = packData.m_faces; + ElementRegionManager::ElementViewAccessor< arrayView1d< localIndex > > & newElemsToSend = packData.m_elementsView; + // array1d< array1d< localIndex_array > > & newElemsToSendData = packData.m_elementsData; + + localIndex_array modNodesToSend; + localIndex_array modEdgesToSend; + localIndex_array modFacesToSend; + ElementRegionManager::ElementReferenceAccessor< localIndex_array > modElemsToSend; + array1d< array1d< localIndex_array > > modElemsToSendData; + + localIndex_array & nodeGhostsToSend = nodeManager.getNeighborData( neighbor.neighborRank() ).ghostsToSend(); + localIndex_array & edgeGhostsToSend = edgeManager.getNeighborData( neighbor.neighborRank() ).ghostsToSend(); + localIndex_array & faceGhostsToSend = faceManager.getNeighborData( neighbor.neighborRank() ).ghostsToSend(); + + filterModObjectsForPackToGhosts( receivedObjects.modifiedNodes, nodeGhostsToSend, modNodesToSend ); + filterModObjectsForPackToGhosts( receivedObjects.modifiedEdges, edgeGhostsToSend, modEdgesToSend ); + filterModObjectsForPackToGhosts( receivedObjects.modifiedFaces, faceGhostsToSend, modFacesToSend ); + + // newElemsToSendData.resize( elemManager.numRegions() ); + // newElemsToSend.resize( elemManager.numRegions() ); + modElemsToSendData.resize( elemManager.numRegions() ); + modElemsToSend.resize( elemManager.numRegions() ); + for( localIndex er=0; er( [&]( localIndex const esr, + // FaceElementSubRegion & subRegion ) + // { + // ArrayOfArraysView< localIndex const > const faceList = subRegion.faceList().toViewConst(); + // localIndex_array & elemGhostsToSend = subRegion.getNeighborData( neighbor.neighborRank() ).ghostsToSend(); + // elemGhostsToSend.move( hostMemorySpace ); + // for( localIndex const & k : receivedObjects.newElements.at( {er, esr} ) ) + // { + // if( faceGhostsToSendSet.count( faceList( k, 0 ) ) ) + // { + // newElemsToSendData[er][esr].emplace_back( k ); + // elemGhostsToSend.emplace_back( k ); + // } + // } + // newElemsToSend[er][esr] = newElemsToSendData[er][esr]; + // } ); + + elemRegion.forElementSubRegionsIndex< ElementSubRegionBase >( [&]( localIndex const esr, + ElementSubRegionBase const & subRegion ) + { + modElemsToSend[er][esr].set( modElemsToSendData[er][esr] ); + arrayView1d< localIndex const > const & elemGhostsToSend = subRegion.getNeighborData( neighbor.neighborRank() ).ghostsToSend(); + for( localIndex const ghostToSend : elemGhostsToSend ) + { + if( receivedObjects.modifiedElements.at( { er, esr } ).count( ghostToSend ) > 0 ) + { + modElemsToSendData[er][esr].emplace_back( ghostToSend ); + } + } + } ); + } + + parallelDeviceEvents sizeEvents; + int bufferSize = 0; + + + bufferSize += nodeManager.packUpDownMapsSize( newNodesToSend ); + bufferSize += edgeManager.packUpDownMapsSize( newEdgesToSend ); + bufferSize += faceManager.packUpDownMapsSize( newFacesToSend ); + bufferSize += elemManager.packUpDownMapsSize( newElemsToSend ); + + bufferSize += nodeManager.packParentChildMapsSize( newNodesToSend ); + bufferSize += edgeManager.packParentChildMapsSize( newEdgesToSend ); + bufferSize += faceManager.packParentChildMapsSize( newFacesToSend ); + + bufferSize += nodeManager.packSize( newNodesToSend, 0, false, sizeEvents ); + bufferSize += edgeManager.packSize( newEdgesToSend, 0, false, sizeEvents ); + bufferSize += faceManager.packSize( newFacesToSend, 0, false, sizeEvents ); + bufferSize += elemManager.packSize( newElemsToSend ); + + bufferSize += nodeManager.packUpDownMapsSize( modNodesToSend ); + bufferSize += edgeManager.packUpDownMapsSize( modEdgesToSend ); + bufferSize += faceManager.packUpDownMapsSize( modFacesToSend ); + bufferSize += elemManager.packUpDownMapsSize( modElemsToSend ); + + bufferSize += nodeManager.packParentChildMapsSize( modNodesToSend ); + bufferSize += edgeManager.packParentChildMapsSize( modEdgesToSend ); + bufferSize += faceManager.packParentChildMapsSize( modFacesToSend ); + + waitAllDeviceEvents( sizeEvents ); + neighbor.resizeSendBuffer( commID, bufferSize ); + + buffer_type & sendBuffer = neighbor.sendBuffer( commID ); + buffer_unit_type * sendBufferPtr = sendBuffer.data(); + + parallelDeviceEvents packEvents; + int packedSize = 0; + + packedSize += nodeManager.packUpDownMaps( sendBufferPtr, newNodesToSend ); + packedSize += edgeManager.packUpDownMaps( sendBufferPtr, newEdgesToSend ); + packedSize += faceManager.packUpDownMaps( sendBufferPtr, newFacesToSend ); + packedSize += elemManager.packUpDownMaps( sendBufferPtr, newElemsToSend ); + + packedSize += nodeManager.packParentChildMaps( sendBufferPtr, newNodesToSend ); + packedSize += edgeManager.packParentChildMaps( sendBufferPtr, newEdgesToSend ); + packedSize += faceManager.packParentChildMaps( sendBufferPtr, newFacesToSend ); + + packedSize += nodeManager.pack( sendBufferPtr, newNodesToSend, 0, false, packEvents ); + packedSize += edgeManager.pack( sendBufferPtr, newEdgesToSend, 0, false, packEvents ); + packedSize += faceManager.pack( sendBufferPtr, newFacesToSend, 0, false, packEvents ); + packedSize += elemManager.pack( sendBufferPtr, newElemsToSend ); + + packedSize += nodeManager.packUpDownMaps( sendBufferPtr, modNodesToSend ); + packedSize += edgeManager.packUpDownMaps( sendBufferPtr, modEdgesToSend ); + packedSize += faceManager.packUpDownMaps( sendBufferPtr, modFacesToSend ); + packedSize += elemManager.packUpDownMaps( sendBufferPtr, modElemsToSend ); + + packedSize += nodeManager.packParentChildMaps( sendBufferPtr, modNodesToSend ); + packedSize += edgeManager.packParentChildMaps( sendBufferPtr, modEdgesToSend ); + packedSize += faceManager.packParentChildMaps( sendBufferPtr, modFacesToSend ); + + GEOS_ERROR_IF( bufferSize != packedSize, "Allocated Buffer Size is not equal to packed buffer size" ); + + waitAllDeviceEvents( packEvents ); +} + + +//***** 3c ***** +void unpackNewAndModifiedObjectsDataOnGhosts( NeighborCommunicator & neighbor, + int commID, + MeshLevel * const mesh, + ModifiedObjectLists & receivedObjects ) +{ + + NodeManager & nodeManager = mesh->getNodeManager(); + EdgeManager & edgeManager = mesh->getEdgeManager(); + FaceManager & faceManager = mesh->getFaceManager(); + ElementRegionManager & elemManager = mesh->getElemManager(); + + buffer_type const & receiveBuffer = neighbor.receiveBuffer( commID ); + buffer_unit_type const * receiveBufferPtr = receiveBuffer.data(); + + localIndex_array newGhostNodes; + localIndex_array newGhostEdges; + localIndex_array newGhostFaces; + + localIndex_array modGhostNodes; + localIndex_array modGhostEdges; + localIndex_array modGhostFaces; + + ElementRegionManager::ElementReferenceAccessor< localIndex_array > newGhostElems; + array1d< array1d< localIndex_array > > newGhostElemsData; + newGhostElems.resize( elemManager.numRegions() ); + newGhostElemsData.resize( elemManager.numRegions() ); + ElementRegionManager::ElementReferenceAccessor< localIndex_array > modGhostElems; + array1d< array1d< localIndex_array > > modGhostElemsData; + modGhostElems.resize( elemManager.numRegions() ); + modGhostElemsData.resize( elemManager.numRegions() ); + for( localIndex er=0; er( + [&]( localIndex const er, localIndex const esr, ElementRegionBase &, ElementSubRegionBase & ) + { + receivedObjects.modifiedElements[ { er, esr } ].insert( modGhostElemsData[er][esr].begin(), + modGhostElemsData[er][esr].end() ); + } ); + + receivedObjects.modifiedNodes.insert( modGhostNodes.begin(), modGhostNodes.end() ); + receivedObjects.modifiedEdges.insert( modGhostEdges.begin(), modGhostEdges.end() ); + receivedObjects.modifiedFaces.insert( modGhostFaces.begin(), modGhostFaces.end() ); + +} + + + +void updateConnectorsToFaceElems( std::set< localIndex > const & newFaceElements, + FaceElementSubRegion & faceElemSubRegion ) +{ + ArrayOfArrays< localIndex > & connectorToElem = faceElemSubRegion.m_2dFaceTo2dElems; + map< localIndex, localIndex > & edgesToConnectorEdges = faceElemSubRegion.m_edgesTo2dFaces; + array1d< localIndex > & connectorEdgesToEdges = faceElemSubRegion.m_2dFaceToEdge; + + ArrayOfArraysView< localIndex const > const facesToEdges = faceElemSubRegion.edgeList().toViewConst(); + + for( localIndex const & kfe : newFaceElements ) + { + arraySlice1d< localIndex const > const faceToEdges = facesToEdges[kfe]; + for( localIndex ke=0; ke & neighbors, + ModifiedObjectLists & modifiedObjects, + ModifiedObjectLists & receivedObjects, + int mpiCommOrder ) +{ + + NodeManager & nodeManager = mesh->getNodeManager(); + EdgeManager & edgeManager = mesh->getEdgeManager(); + FaceManager & faceManager = mesh->getFaceManager(); + ElementRegionManager & elemManager = mesh->getElemManager(); + + + /************************************************************************************************ + * The goal is to synchronize the changes from the rank that has topology changes to + * ranks that have copies of the objects that were changed. In this "original" implementation, we + * do this without map unpacking optimizations intended to reduce communications. + * + * Nomenclature is key to understanding the process: + * - "New" objects are objects that have just been created on by the "active color rank (ACR)" + * - "Modified" objects are objects that have been modified by the ACR. + * + * - ACR (active color rank) is the rank that has created the topology changes. Given the way we + * map the colors to ranks, the ACR are NOT neighbors...i.e. do not communicate with each other. + * - OR (Owning rank/s) is the rank that owns the "new/modified" objects. This may or may not be + * the ACR. + * - GR (Ghosted rank/s) is the rank that has a ghost copy of the "new/modified" object. + * + * note: object parents define the owning rank. + * note: for any receive/unpack operation, the current rank is the rank performing the operation + * from each neighbor...i.e. the current rank is the OR and the GR. + * + * The sequence of steps are: + * 1a) On the ACR, pack the new/modified objects that are not owned by the ACR and send them to + * their OR. + * 1b) On the OR, unpack the new objects that are owned by the rank that has the changes. DO NOT + * unpack the maps as they will potentially contain indices that are not on the OR. + * + * At this point the OR has all the new objects that it owns...but not the maps or the fields. + * + * 2a) On the OR, pack the new objects that are owned by the rank and send them to the ranks + * where they are ghosted (GR). DO NOT PACK THE MAPS as they are incomplete. + * 2b) On the GR, unpack the new objects. + * + * Now everyone has all the objects and we can pack/send/receive/unpack the maps. + * + * 3a) On the OR, unpack the map modification on owning ranks from 1b). + * + * Now the OR has the correct maps. + * + * 3b) On the OR, pack the map/field modification and send to the GR. + * 3c) On the GR, unpack the map/field modifications. + * + ***********************************************************************************************/ + + + + //*********************************************************************************************** + // 1a) On the ACR, pack the new/modified objects that are not owned by the ACR and send them to + // their OR. + //*********************************************************************************************** + +// std::cout<<"***** Step 1a *****"< step1bUnpackData( neighbors.size() ); + for( unsigned int count=0; count( [&]( localIndex const er, + localIndex const esr, + ElementRegionBase &, + FaceElementSubRegion & subRegion ) + { + subRegion.inheritGhostRankFromParentFace( faceManager, receivedObjects.newElements[{er, esr}] ); + } ); + + MpiWrapper::waitAll( commData1.size(), + commData1.mpiSendBufferSizeRequest(), + commData1.mpiSendBufferSizeStatus() ); + + MpiWrapper::waitAll( commData1.size(), + commData1.mpiSendBufferRequest(), + commData1.mpiSendBufferSizeStatus() ); + + modifiedObjects.insert( receivedObjects ); + + + //************************************************************************************************ + // 2a) On the OR, pack the new objects that are owned by the rank and send them to the ranks + // where they are ghosted (GR). DO NOT PACK THE MAPS as they are incomplete. + //************************************************************************************************ + + MpiWrapper::barrier(); +// std::cout<<"***** Step 2a *****"< step2and3PackData( neighbors.size() ); + + // pack the new objects to send to ghost ranks + for( unsigned int neighborIndex=0; neighborIndex( [&]( localIndex const er, + localIndex const esr, + ElementRegionBase const &, + FaceElementSubRegion & subRegion ) + { + updateConnectorsToFaceElems( receivedObjects.newElements.at( {er, esr} ), subRegion ); + } ); + + + std::set< localIndex > allTouchedNodes; + allTouchedNodes.insert( modifiedObjects.newNodes.begin(), modifiedObjects.newNodes.end() ); + allTouchedNodes.insert( modifiedObjects.modifiedNodes.begin(), modifiedObjects.modifiedNodes.end() ); + nodeManager.depopulateUpMaps( allTouchedNodes, + edgeManager.nodeList(), + faceManager.nodeList().toViewConst(), + elemManager ); + + std::set< localIndex > allTouchedEdges; + allTouchedEdges.insert( modifiedObjects.newEdges.begin(), modifiedObjects.newEdges.end() ); + allTouchedEdges.insert( modifiedObjects.modifiedEdges.begin(), modifiedObjects.modifiedEdges.end() ); + edgeManager.depopulateUpMaps( allTouchedEdges, + faceManager.edgeList().toViewConst() ); + + std::set< localIndex > allTouchedFaces; + allTouchedFaces.insert( modifiedObjects.newFaces.begin(), modifiedObjects.newFaces.end() ); + allTouchedFaces.insert( modifiedObjects.modifiedFaces.begin(), modifiedObjects.modifiedFaces.end() ); + faceManager.depopulateUpMaps( allTouchedFaces, elemManager ); + + nodeManager.enforceStateFieldConsistencyPostTopologyChange( modifiedObjects.modifiedNodes ); + edgeManager.enforceStateFieldConsistencyPostTopologyChange( modifiedObjects.modifiedEdges ); + faceManager.enforceStateFieldConsistencyPostTopologyChange( modifiedObjects.modifiedFaces ); + + +} + +} + + + +} /* namespace geos */ +#endif // PARALLEL_TOPOLOGY_CHANGE_METHOD==1 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index 1aedffecdb3..add1dc1f8e7 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -18,7 +18,6 @@ */ #include "SurfaceGenerator.hpp" -#include "ParallelTopologyChange.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "mesh/mpiCommunications/NeighborCommunicator.hpp" @@ -36,6 +35,7 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "kernels/surfaceGenerationKernels.hpp" +#include "ParallelTopologyChange.hpp" #include @@ -1013,9 +1013,9 @@ bool SurfaceGenerator::findFracturePlanes( localIndex const nodeID, ArrayOfArraysView< localIndex const > const & faceToEdgeMap = faceManager.edgeList().toViewConst(); - arraySlice1d< localIndex const > const & nodeToRegionMap = nodeManager.elementRegionList()[nodeID]; - arraySlice1d< localIndex const > const & nodeToSubRegionMap = nodeManager.elementSubRegionList()[nodeID]; - arraySlice1d< localIndex const > const & nodeToElementMap = nodeManager.elementList()[nodeID]; + arraySlice1d< localIndex const > const nodeToRegionMap = nodeManager.elementRegionList()[nodeID]; + arraySlice1d< localIndex const > const nodeToSubRegionMap = nodeManager.elementSubRegionList()[nodeID]; + arraySlice1d< localIndex const > const nodeToElementMap = nodeManager.elementList()[nodeID]; // BACKWARDS COMPATIBILITY HACK! // @@ -1936,6 +1936,7 @@ void SurfaceGenerator::performFracture( const localIndex nodeID, this->m_originalFaceToEdges.toViewConst(), faceIndices ); m_faceElemsRupturedThisSolve.insert( newFaceElement ); + GEOS_LOG_LEVEL_INFO_BY_RANK( logInfo::SurfaceGenerator, GEOS_FMT ( "Created new FaceElement {} when creating face {} from {}", newFaceElement, newFaceIndex, faceIndex ) ); modifiedObjects.newElements[ {fractureElementRegion.getIndexInParent(), 0} ].insert( newFaceElement ); } } // if( faceManager.SplitObject( faceIndex, newFaceIndex ) ) diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index b9864791b44..6488245af14 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1282,6 +1282,23 @@ + + + + + + + + + + + + + + + + + From d2417244208fe89652204b06080ac33b34eccb3e Mon Sep 17 00:00:00 2001 From: MelReyCG <122801580+MelReyCG@users.noreply.github.com> Date: Mon, 2 Dec 2024 19:24:13 +0100 Subject: [PATCH 266/286] fix: Schema update & examples validation quickfix (#3470) --- ...tBubbleStab_singleFracCompression_base.xml | 4 ++-- .../FieldCaseTutorial3_composite_smoke.xml | 2 +- src/coreComponents/schema/schema.xsd | 4 ++-- src/coreComponents/schema/schema.xsd.other | 19 +------------------ 4 files changed, 6 insertions(+), 23 deletions(-) diff --git a/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_base.xml b/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_base.xml index 09ec110a624..854136ed032 100644 --- a/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_base.xml +++ b/inputFiles/lagrangianContactMechanics/LagrangeContactBubbleStab_singleFracCompression_base.xml @@ -130,8 +130,8 @@ plotLevel="2" format="binary" plotFileRoot="bubbleStab"/> - - + + diff --git a/inputFiles/singlePhaseFlow/FieldCaseTutorial3_composite_smoke.xml b/inputFiles/singlePhaseFlow/FieldCaseTutorial3_composite_smoke.xml index dd43e24c23a..9312ecaae37 100644 --- a/inputFiles/singlePhaseFlow/FieldCaseTutorial3_composite_smoke.xml +++ b/inputFiles/singlePhaseFlow/FieldCaseTutorial3_composite_smoke.xml @@ -15,7 +15,7 @@ + dataSourceName="synthetic"> + + @@ -1781,8 +1783,6 @@ stress - traction is applied to the faces as specified by the inner product of i - - diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 6488245af14..33386f19956 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -1027,7 +1027,7 @@ - + @@ -1282,23 +1282,6 @@ - - - - - - - - - - - - - - - - - From da8185ab20f63e253e9819420a4dd2316c4de52f Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Mon, 2 Dec 2024 13:35:36 -0600 Subject: [PATCH 267/286] docs: add short description for adaptive tolerance option in linear solver (#3469) --- .../linearAlgebra/docs/DofManager.rst | 2 -- .../linearAlgebra/docs/LinearSolvers.rst | 25 ++++++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/coreComponents/linearAlgebra/docs/DofManager.rst b/src/coreComponents/linearAlgebra/docs/DofManager.rst index d13e2ee7c9c..6948b36f1ae 100644 --- a/src/coreComponents/linearAlgebra/docs/DofManager.rst +++ b/src/coreComponents/linearAlgebra/docs/DofManager.rst @@ -2,8 +2,6 @@ DoF Manager ############################################################################### -This will contains a description of the DoF manager in GEOS. - Brief description ======================== diff --git a/src/coreComponents/linearAlgebra/docs/LinearSolvers.rst b/src/coreComponents/linearAlgebra/docs/LinearSolvers.rst index b4b68dfc682..6f68efac64d 100644 --- a/src/coreComponents/linearAlgebra/docs/LinearSolvers.rst +++ b/src/coreComponents/linearAlgebra/docs/LinearSolvers.rst @@ -14,14 +14,14 @@ Any physics solver relying on standard finite element and finite volume techniqu \mathsf{A} \mathsf{x} = \mathsf{b} -with a :math:`\mathsf{A}` a square sparse matrix, :math:`\mathsf{x}` the solution vector, and :math:`\mathsf{b}` the right-hand side. +where :math:`\mathsf{A}` is the square sparse matrix, :math:`\mathsf{x}` the solution vector, and :math:`\mathsf{b}` the right-hand side. For example, in a classical linear elastostatics problem :math:`\mathsf{A}` is the stiffness matrix, and :math:`\mathsf{x}` and :math:`\mathsf{b}` are the displacement and nodal force vectors, respectively. This solution stage represents the most computationally expensive portion of a typical simulation. Solution algorithms generally belong to two families of methods: direct methods and iterative methods. In GEOS both options are made available wrapping around well-established open-source linear algebra libraries, namely -`HYPRE `__, +`HYPRE `__, `PETSc `__, `SuperLU `__, and `Trilinos `__. @@ -38,7 +38,7 @@ Irrespective of the selected direct solver implementation, three stages can be i (#) **Solve Stage**: the solution to the linear systems involving the factorized matrix is computed (#) **Finalize Stage**: the systems involving the factorized matrix have been solved and the direct solver lifetime ends -The default option in GEOS relies on `SuperLU `__, a general purpose library for the direct solution of large, sparse, nonsymmetric systems of linear equations, that is called taking advantage of the interface provided in `HYPRE `__. +The default option in GEOS relies on `SuperLU `__, a general purpose library for the direct solution of large, sparse, nonsymmetric systems of linear equations, that is called taking advantage of the interface provided in `HYPRE `__. ****************** Iterative methods @@ -110,8 +110,8 @@ This section provides a brief description of the available preconditioners. - `PETSc documentation `__, - `Trilinos documentation `__. -* **MGR**: multigrid reduction. Available through *hypre* interface only. Specific documentation coming soon. - Further details can be found in `MGR documentation `__. +* **MGR**: multigrid reduction. Available through *hypre* interface only. + Further details can be found in `MGR documentation `__, also see section below. * **Block**: custom preconditioner designed for a 2 x 2 block matrix. @@ -119,7 +119,7 @@ This section provides a brief description of the available preconditioners. HYPRE MGR Preconditioner ************************ -MGR stands for multigrid reduction, a multigrid method that uses the interpolation, restriction operators, and the Galerkin triple product, to reduce a linear system to a smaller one, similar to a Schur complement approach. As such, it is designed to target block linear systems resulting from discretizations of multiphysics problems. GEOS uses MGR through an implementation in `HYPRE `__. More information regarding MGR can be found `here `__. Currently, MGR strategies are implemented for hydraulic fracturing, poroelastic, compositional flow with and without wells. More multiphysics solvers with MGR will be enabled in the future. +MGR stands for multigrid reduction, a multigrid method that uses the interpolation, restriction operators, and the Galerkin triple product, to reduce a linear system to a smaller one, similar to a Schur complement approach. As such, it is designed to target block linear systems resulting from discretizations of multiphysics problems. GEOS uses MGR through an implementation in `HYPRE `__. More information regarding MGR can be found `here `__. Currently, MGR strategies are implemented for hydraulic fracturing, singlephase and multiphase poromechanics, singlephase poromechanics with fractures, compositional flow with and without wells. More multiphysics solvers with MGR will be enabled in the future. To use MGR for a specific block system, several components need to be specified. @@ -157,3 +157,16 @@ Moreover, a block scaling is available. Feasible options are: * none: keep the original scaling; * Frobenius norm: equilibrate Frobenius norm of the diagonal blocks; * user provided. + +******************** +Adaptive tolerance +******************** + +This feature is available for iterative solvers and can be enabled using `krylovAdaptiveTol` flag in `LinearSolverParameters`. It follows the Eisenstat-Walker inexact Newton approach described in [Eisenstat and Walker 1996]. The key idea is to relax the linear solver tolerance at the beginning of the nonlinear iterations loop and tighten it when getting closer to the final solution. The initial tolerance is defined by `krylovWeakestTol` and starting from second nonlinear iteration the tolerance is chosen using the following steps: + +- compute the current to previous nonlinear norm ratio: :math:`\mathsf{nr} = \mathsf{min}( \mathsf{norm}^{curr} / \mathsf{norm}^{prev}, 1.0 )` +- estimate the new linear solver tolerance: :math:`\mathsf{tol}_{new} = \mathsf{\gamma} \cdot \mathsf{nr}^{ax}` +- compute a safeguard to avoid too sharp tolerance reduction: :math:`\mathsf{tol}_{alt} = \mathsf{tol}_{old}^{2}` (the bound is the quadratic reduction with respect to the previous tolerance value) +- apply safeguards and compute the final tolerance: :math:`\mathsf{tol} = \mathsf{max}( \mathsf{tol}_{new}, \mathsf{tol}_{alt} )`, :math:`\mathsf{tol} = \mathsf{min}( \mathsf{tol}_{max}, \mathsf{max}( \mathsf{tol}_{min}, \mathsf{tol} ) )` + +Here :math:`\mathsf{\gamma}` is the forcing term, :math:`ax` is the adaptivity exponent, :math:`\mathsf{tol}_{min}` and :math:`\mathsf{tol}_{max}` are prescribed tolerance bounds (defined by `krylovStrongestTol` and `krylovWeakestTol`, respectively). From 2586344b486fc37c6c0baffc647a22e45651f50d Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Mon, 2 Dec 2024 14:38:22 -0600 Subject: [PATCH 268/286] refactor: compositional includes cleanup (#3447) --- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 6 +- .../CompositionalMultiphaseHybridFVM.cpp | 1 - .../fluidFlow/SinglePhaseBase.cpp | 2 - .../fluidFlow/SinglePhaseFVM.cpp | 2 - ...ompositionalMultiphaseHybridFVMKernels.hpp | 1 - .../DiffusionDispersionFluxComputeKernel.hpp | 1 - .../compositional/SolutionScalingKernel.hpp | 1 + .../SinglePhaseHybridFVMKernels.hpp | 1 - .../wells/CompositionalMultiphaseWell.cpp | 65 ++++++++++--------- .../CompositionalMultiphaseWellKernels.hpp | 1 - 10 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 4c9dde33e1b..2e99cfe6f48 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -36,8 +36,6 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/ThermalResidualNormKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp" @@ -50,10 +48,10 @@ #include "physicsSolvers/fluidFlow/kernels/compositional/ThermalDiffusionDispersionFluxComputeKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/ThermalDirichletFluxComputeKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index bedfa0c3261..d6a0c9568d6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -31,7 +31,6 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 429ea336ab7..f1a77c2001d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -40,8 +40,6 @@ #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp" #include "physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/singlePhase/SolutionScalingKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index b87ce6bcf75..760394bb02b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -33,8 +33,6 @@ #include "fieldSpecification/AquiferBoundaryCondition.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" -#include "physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp" #include "physicsSolvers/fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/singlePhase/ThermalFluxComputeKernel.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp index c388cad6da5..ea1f4ec0d12 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp @@ -33,7 +33,6 @@ #include "physicsSolvers/PhysicsSolverBaseKernels.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp index ac5ab4265da..e8ea185c993 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp @@ -33,7 +33,6 @@ #include "mesh/ElementRegionManager.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp" namespace geos { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp index 399ccaaa6bc..7cdbd3456cb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp @@ -21,6 +21,7 @@ #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_SOLUTIONSCALINGKERNEL_HPP #include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp" +#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp" namespace geos diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp index 13e5eeabfcb..124e454d90f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp @@ -37,7 +37,6 @@ #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp" #include "physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp" #include "physicsSolvers/PhysicsSolverBaseKernels.hpp" #include "codingUtilities/Utilities.hpp" diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index 95f59c179ec..dbd4637d01b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -42,8 +42,6 @@ #include "physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp" #include "physicsSolvers/fluidFlow/wells/kernels/PerforationFluxKernels.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp" @@ -62,7 +60,6 @@ namespace geos using namespace dataRepository; using namespace constitutive; -using namespace compositionalMultiphaseWellKernels; CompositionalMultiphaseWell::CompositionalMultiphaseWell( const string & name, Group * const parent ) @@ -910,7 +907,8 @@ void CompositionalMultiphaseWell::updateTotalMassDensity( WellElementSubRegion & subRegion, fluid ) : - TotalMassDensityKernelFactory:: + compositionalMultiphaseWellKernels:: + TotalMassDensityKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, m_numPhases, subRegion, @@ -976,8 +974,10 @@ void CompositionalMultiphaseWell::initializeWells( DomainPartition & domain, rea { ElementRegionManager & elemManager = mesh.getElemManager(); - PresTempCompFracInitializationKernel::CompFlowAccessors resCompFlowAccessors( mesh.getElemManager(), flowSolver.getName() ); - PresTempCompFracInitializationKernel::MultiFluidAccessors resMultiFluidAccessors( mesh.getElemManager(), flowSolver.getName() ); + compositionalMultiphaseWellKernels::PresTempCompFracInitializationKernel::CompFlowAccessors + resCompFlowAccessors( mesh.getElemManager(), flowSolver.getName() ); + compositionalMultiphaseWellKernels::PresTempCompFracInitializationKernel::MultiFluidAccessors + resMultiFluidAccessors( mesh.getElemManager(), flowSolver.getName() ); elemManager.forElementSubRegions< WellElementSubRegion >( regionNames, [&]( localIndex const, @@ -1011,7 +1011,8 @@ void CompositionalMultiphaseWell::initializeWells( DomainPartition & domain, rea // 1) Loop over all perforations to compute an average mixture density and component fraction // 2) Initialize the reference pressure // 3) Estimate the pressures in the well elements using the average density - PresTempCompFracInitializationKernel:: + compositionalMultiphaseWellKernels:: + PresTempCompFracInitializationKernel:: launch( perforationData.size(), subRegion.size(), numComp, @@ -1053,11 +1054,12 @@ void CompositionalMultiphaseWell::initializeWells( DomainPartition & domain, rea wellElemCompFrac ); } ); - CompDensInitializationKernel::launch( subRegion.size(), - numComp, - wellElemCompFrac, - wellElemTotalDens, - wellElemCompDens ); + compositionalMultiphaseWellKernels:: + CompDensInitializationKernel::launch( subRegion.size(), + numComp, + wellElemCompFrac, + wellElemTotalDens, + wellElemCompDens ); // 5) Recompute the pressure-dependent properties updateSubRegionState( subRegion ); @@ -1310,7 +1312,7 @@ CompositionalMultiphaseWell::calculateResidualNorm( real64 const & time_n, else { real64 subRegionResidualNorm[1]{}; - ResidualNormKernelFactory:: + compositionalMultiphaseWellKernels::ResidualNormKernelFactory:: createAndLaunch< parallelDevicePolicy<> >( m_numComponents, numDofPerWellElement(), m_targetPhaseIndex, @@ -1914,24 +1916,25 @@ void CompositionalMultiphaseWell::assemblePressureRelations( real64 const & time bool controlHasSwitched = false; isothermalCompositionalMultiphaseBaseKernels:: - KernelLaunchSelectorCompTherm< PressureRelationKernel >( numFluidComponents(), - isThermal, - subRegion.size(), - dofManager.rankOffset(), - subRegion.isLocallyOwned(), - subRegion.getTopWellElementIndex(), - m_targetPhaseIndex, - wellControls, - time_n + dt, // controls evaluated with BHP/rate of the end of step - wellElemDofNumber, - wellElemGravCoef, - nextWellElemIndex, - wellElemPres, - wellElemTotalMassDens, - dWellElemTotalMassDens, - controlHasSwitched, - localMatrix, - localRhs ); + KernelLaunchSelectorCompTherm< compositionalMultiphaseWellKernels::PressureRelationKernel > + ( numFluidComponents(), + isThermal, + subRegion.size(), + dofManager.rankOffset(), + subRegion.isLocallyOwned(), + subRegion.getTopWellElementIndex(), + m_targetPhaseIndex, + wellControls, + time_n + dt, // controls evaluated with BHP/rate of the end of step + wellElemDofNumber, + wellElemGravCoef, + nextWellElemIndex, + wellElemPres, + wellElemTotalMassDens, + dWellElemTotalMassDens, + controlHasSwitched, + localMatrix, + localRhs ); if( controlHasSwitched ) { diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp index 1ca6ebac997..1995119e9f4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp @@ -33,7 +33,6 @@ #include "physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/StencilAccessors.hpp" -#include "physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp" #include "physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp" From 470921ff28312a4bf0039bc2f9acb50941541457 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 3 Dec 2024 09:36:54 -0600 Subject: [PATCH 269/286] fix: detangle and unify flow initialization, fix netToGross bug (#3393) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 247 +++++++----------- .../fluidFlow/CompositionalMultiphaseBase.hpp | 8 +- .../fluidFlow/FlowSolverBase.cpp | 107 +++++++- .../fluidFlow/FlowSolverBase.hpp | 73 +++--- .../fluidFlow/SinglePhaseBase.cpp | 139 ++++------ .../fluidFlow/SinglePhaseBase.hpp | 14 +- .../fluidFlow/SinglePhaseHybridFVM.cpp | 17 -- .../fluidFlow/SinglePhaseHybridFVM.hpp | 2 - 10 files changed, 296 insertions(+), 319 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 0ebe2652f98..92b83368c51 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3381-9063-399123c + baseline: integratedTests/baseline_integratedTests-pr3393-9089-c187f5d allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 1fbd4cbfa9d..46193312093 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,11 +6,14 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3393 (2024-12-2) +===================== +Fix netToGross bug. + PR #3381 (2024-12-01) ===================== A few baseline diffs for order FaceElementSubRegion::m_toFacesRelation map. Not sure why this was changed by this PR, but the previous order seems incorrect for a couple of cases. - PR #2957 (2024-11-27) ===================== Added ExternalDataRepository. @@ -19,7 +22,6 @@ PR #3448 (2024-11-21) ===================== Switched the FaceElementSubRegion::m_toFacesRelation and FaceElementSubRegion::m_2dElemToElems back to array2d instead of ArrayOfArray. This results in a reordering m_toFacesRelation back to the "correct" assumed order of "original face first". This fixes a bug that failed to remove the CellStencil entry when a FaceElement splits two cells. - PR #2637 (2024-11-21) ===================== Added numberOfTargetProcesses. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 08e7176fdbe..5e59ba4bc2c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -831,30 +831,25 @@ real64 CompositionalMultiphaseBase::updateFluidState( ElementSubRegionBase & sub } void CompositionalMultiphaseBase::initializeFluidState( MeshLevel & mesh, - DomainPartition & domain, arrayView1d< string const > const & regionNames ) { GEOS_MARK_FUNCTION; integer const numComp = m_numComponents; - // 1. Compute hydrostatic equilibrium in the regions for which corresponding field specification tag has been specified - computeHydrostaticEquilibrium(); - mesh.getElemManager().forElementSubRegions( regionNames, [&]( localIndex const, ElementSubRegionBase & subRegion ) { - // 2. Assume global component fractions have been prescribed. + // Assume global component fractions have been prescribed. // Initialize constitutive state to get fluid density. updateFluidModel( subRegion ); - // 3. Back-calculate global component densities from fractions and total fluid density + // Back-calculate global component densities from fractions and total fluid density // in order to initialize the primary solution variables - string const & fluidName = subRegion.getReference< string >( viewKeyStruct::fluidNamesString() ); + string const & fluidName = subRegion.template getReference< string >( viewKeyStruct::fluidNamesString() ); MultiFluidBase const & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); arrayView2d< real64 const, multifluid::USD_FLUID > const totalDens = fluid.totalDensity(); - arrayView2d< real64 const, compflow::USD_COMP > const compFrac = subRegion.getField< fields::flow::globalCompFraction >(); arrayView2d< real64, compflow::USD_COMP > const compDens = @@ -867,10 +862,13 @@ void CompositionalMultiphaseBase::initializeFluidState( MeshLevel & mesh, compDens[ei][ic] = totalDens[ei][0] * compFrac[ei][ic]; } } ); - } ); - // with initial component densities defined - check if they need to be corrected to avoid zero diags etc - chopNegativeDensities( domain ); + // with initial component densities defined - check if they need to be corrected to avoid zero diags etc + if( m_allowCompDensChopping ) + { + chopNegativeDensities( subRegion ); + } + } ); // for some reason CUDA does not want the host_device lambda to be defined inside the generic lambda // I need the exact type of the subRegion for updateSolidflowProperties to work well. @@ -878,115 +876,65 @@ void CompositionalMultiphaseBase::initializeFluidState( MeshLevel & mesh, SurfaceElementSubRegion >( regionNames, [&]( localIndex const, auto & subRegion ) { - // 4. Initialize/update dependent state quantities + // Initialize/update dependent state quantities - // 4.1 Update the constitutive models that only depend on - // - the primary variables - // - the fluid constitutive quantities (as they have already been updated) - // We postpone the other constitutive models for now - // In addition, to avoid multiplying permeability/porosity bay netToGross in the assembly kernel, we do it once and for all here - arrayView1d< real64 const > const netToGross = subRegion.template getField< fields::flow::netToGross >(); - CoupledSolidBase const & porousSolid = - getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); - PermeabilityBase const & permeabilityModel = - getConstitutiveModel< PermeabilityBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::permeabilityNamesString() ) ); - permeabilityModel.scaleHorizontalPermeability( netToGross ); - porousSolid.scaleReferencePorosity( netToGross ); - saveConvergedState( subRegion ); // necessary for a meaningful porosity update in sequential schemes - updatePorosityAndPermeability( subRegion ); updateCompAmount( subRegion ); updatePhaseVolumeFraction( subRegion ); - // Now, we initialize and update each constitutive model one by one + // Update the constitutive models that only depend on + // - the primary variables + // - the fluid constitutive quantities (as they have already been updated) + // We postpone the other constitutive models for now - // 4.2 Save the computed porosity into the old porosity - // - // Note: - // - This must be called after updatePorosityAndPermeability - // - This step depends on porosity - string const & solidName = subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ); - CoupledSolidBase const & porousMaterial = getConstitutiveModel< CoupledSolidBase >( subRegion, solidName ); - porousMaterial.initializeState(); - - // 4.3 Initialize/update the relative permeability model using the initial phase volume fraction - // This is needed to handle relative permeability hysteresis - // Also, initialize the fluid model - // - // Note: - // - This must be called after updatePhaseVolumeFraction - // - This step depends on phaseVolFraction + // Now, we initialize and update each constitutive model one by one // initialized phase volume fraction arrayView2d< real64 const, compflow::USD_PHASE > const phaseVolFrac = subRegion.template getField< fields::flow::phaseVolumeFraction >(); - string const & relpermName = subRegion.template getReference< string >( viewKeyStruct::relPermNamesString() ); - RelativePermeabilityBase & relPermMaterial = - getConstitutiveModel< RelativePermeabilityBase >( subRegion, relpermName ); - relPermMaterial.saveConvergedPhaseVolFractionState( phaseVolFrac ); // this needs to happen before calling updateRelPermModel + // Initialize/update the relative permeability model using the initial phase volume fraction + // Note: + // - This must be called after updatePhaseVolumeFraction + // - This step depends on phaseVolFraction + RelativePermeabilityBase & relPerm = + getConstitutiveModel< RelativePermeabilityBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::relPermNamesString() ) ); + relPerm.saveConvergedPhaseVolFractionState( phaseVolFrac ); // this needs to happen before calling updateRelPermModel updateRelPermModel( subRegion ); - relPermMaterial.saveConvergedState(); // this needs to happen after calling updateRelPermModel + relPerm.saveConvergedState(); // this needs to happen after calling updateRelPermModel string const & fluidName = subRegion.template getReference< string >( viewKeyStruct::fluidNamesString() ); - MultiFluidBase & fluidMaterial = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); - fluidMaterial.initializeState(); + MultiFluidBase & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); + fluid.initializeState(); + + // Update the phase mobility + // Note: + // - This must be called after updateRelPermModel + // - This step depends phaseRelPerm + updatePhaseMobility( subRegion ); - // 4.4 Then, we initialize/update the capillary pressure model - // + // Initialize/update the capillary pressure model // Note: - // - This must be called after updatePorosityAndPermeability - // - This step depends on porosity and permeability + // - This must be called after updatePorosityAndPermeability and updatePhaseVolumeFraction + // - This step depends on porosity, permeability, and phaseVolFraction if( m_hasCapPressure ) { // initialized porosity - arrayView2d< real64 const > const porosity = porousMaterial.getPorosity(); + CoupledSolidBase const & porousSolid = + getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); + arrayView2d< real64 const > const porosity = porousSolid.getPorosity(); - string const & permName = subRegion.template getReference< string >( viewKeyStruct::permeabilityNamesString() ); - PermeabilityBase const & permeabilityMaterial = - getConstitutiveModel< PermeabilityBase >( subRegion, permName ); // initialized permeability + PermeabilityBase const & permeabilityMaterial = + getConstitutiveModel< PermeabilityBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::permeabilityNamesString() ) ); arrayView3d< real64 const > const permeability = permeabilityMaterial.permeability(); - string const & capPressureName = subRegion.template getReference< string >( viewKeyStruct::capPressureNamesString() ); - CapillaryPressureBase const & capPressureMaterial = - getConstitutiveModel< CapillaryPressureBase >( subRegion, capPressureName ); - capPressureMaterial.initializeRockState( porosity, permeability ); // this needs to happen before calling updateCapPressureModel + CapillaryPressureBase const & capPressure = + getConstitutiveModel< CapillaryPressureBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::capPressureNamesString() ) ); + capPressure.initializeRockState( porosity, permeability ); // this needs to happen before calling updateCapPressureModel updateCapPressureModel( subRegion ); } - // 4.5 Update the phase mobility - // - // Note: - // - This must be called after updateRelPermModel - // - This step depends phaseRelPerm - updatePhaseMobility( subRegion ); - - // 4.6 We initialize the rock thermal quantities: conductivity and solid internal energy - // - // Note: - // - This must be called after updatePorosityAndPermeability and updatePhaseVolumeFraction - // - This step depends on porosity and phaseVolFraction - if( m_isThermal ) - { - // initialized porosity - arrayView2d< real64 const > const porosity = porousMaterial.getPorosity(); - - string const & thermalConductivityName = subRegion.template getReference< string >( viewKeyStruct::thermalConductivityNamesString() ); - MultiPhaseThermalConductivityBase const & conductivityMaterial = - getConstitutiveModel< MultiPhaseThermalConductivityBase >( subRegion, thermalConductivityName ); - conductivityMaterial.initializeRockFluidState( porosity, phaseVolFrac ); - // note that there is nothing to update here because thermal conductivity is explicit for now - - updateSolidInternalEnergyModel( subRegion ); - string const & solidInternalEnergyName = subRegion.template getReference< string >( viewKeyStruct::solidInternalEnergyNamesString() ); - SolidInternalEnergy const & solidInternalEnergyMaterial = - getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); - solidInternalEnergyMaterial.saveConvergedState(); - - updateEnergy( subRegion ); - } - - // Step 4.7: if the diffusion and/or dispersion is/are supported, initialize the two models + // If the diffusion and/or dispersion is/are supported, initialize the two models if( m_hasDiffusion ) { string const & diffusionName = subRegion.template getReference< string >( viewKeyStruct::diffusionNamesString() ); @@ -1004,24 +952,42 @@ void CompositionalMultiphaseBase::initializeFluidState( MeshLevel & mesh, } } ); +} - // 5. Save initial pressure - mesh.getElemManager().forElementSubRegions( regionNames, [&]( localIndex const, - ElementSubRegionBase & subRegion ) +void CompositionalMultiphaseBase::initializeThermalState( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) +{ + mesh.getElemManager().forElementSubRegions< CellElementSubRegion, + SurfaceElementSubRegion >( regionNames, [&]( localIndex const, + auto & subRegion ) { - arrayView1d< real64 const > const pres = subRegion.getField< fields::flow::pressure >(); - arrayView1d< real64 > const initPres = subRegion.getField< fields::flow::initialPressure >(); - arrayView1d< real64 const > const temp = subRegion.getField< fields::flow::temperature >(); - arrayView1d< real64 > const initTemp = subRegion.template getField< fields::flow::initialTemperature >(); - initPres.setValues< parallelDevicePolicy<> >( pres ); - initTemp.setValues< parallelDevicePolicy<> >( temp ); + // initialized porosity + CoupledSolidBase const & porousSolid = + getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); + arrayView2d< real64 const > const porosity = porousSolid.getPorosity(); + + // initialized phase volume fraction + arrayView2d< real64 const, compflow::USD_PHASE > const phaseVolFrac = + subRegion.template getField< fields::flow::phaseVolumeFraction >(); + + string const & thermalConductivityName = subRegion.template getReference< string >( viewKeyStruct::thermalConductivityNamesString()); + MultiPhaseThermalConductivityBase const & conductivityMaterial = + getConstitutiveModel< MultiPhaseThermalConductivityBase >( subRegion, thermalConductivityName ); + conductivityMaterial.initializeRockFluidState( porosity, phaseVolFrac ); + // note that there is nothing to update here because thermal conductivity is explicit for now + + updateSolidInternalEnergyModel( subRegion ); + string const & solidInternalEnergyName = subRegion.template getReference< string >( viewKeyStruct::solidInternalEnergyNamesString()); + SolidInternalEnergy const & solidInternalEnergyMaterial = + getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); + solidInternalEnergyMaterial.saveConvergedState(); + + updateEnergy( subRegion ); } ); } -void CompositionalMultiphaseBase::computeHydrostaticEquilibrium() +void CompositionalMultiphaseBase::computeHydrostaticEquilibrium( DomainPartition & domain ) { FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); - DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); integer const numComps = m_numComponents; integer const numPhases = m_numPhases; @@ -1281,8 +1247,7 @@ void CompositionalMultiphaseBase::initializePostInitialConditionsPreSubGroups() arrayView1d< string const > const & regionNames ) { FieldIdentifiers fieldsToBeSync; - fieldsToBeSync.addElementFields( { fields::flow::pressure::key(), - fields::flow::globalCompDensity::key() }, + fieldsToBeSync.addElementFields( { fields::flow::globalCompDensity::key() }, regionNames ); CommunicationTools::getInstance().synchronizeFields( fieldsToBeSync, mesh, domain.getNeighbors(), false ); @@ -1295,35 +1260,10 @@ void CompositionalMultiphaseBase::initializePostInitialConditionsPreSubGroups() string const & fluidName = subRegion.template getReference< string >( viewKeyStruct::fluidNamesString() ); MultiFluidBase & fluid = getConstitutiveModel< MultiFluidBase >( subRegion, fluidName ); fluid.setMassFlag( m_useMass ); - - saveConvergedState( subRegion ); // necessary for a meaningful porosity update in sequential schemes - updatePorosityAndPermeability( subRegion ); - - CoupledSolidBase const & porousSolid = - getConstitutiveModel< CoupledSolidBase >( subRegion, - subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); - porousSolid.initializeState(); } ); - - // Initialize primary variables from applied initial conditions - initializeFluidState( mesh, domain, regionNames ); - - mesh.getElemManager().forElementRegions< SurfaceElementRegion >( regionNames, - [&]( localIndex const, - SurfaceElementRegion & region ) - { - region.forElementSubRegions< FaceElementSubRegion >( [&]( FaceElementSubRegion & subRegion ) - { - subRegion.getWrapper< real64_array >( fields::flow::hydraulicAperture::key() ). - setApplyDefaultValue( region.getDefaultAperture() ); - } ); - } ); - } ); - // report to the user if some pore volumes are very small - // note: this function is here because: 1) porosity has been initialized and 2) NTG has been applied - validatePoreVolumes( domain ); + initialize( domain ); } void @@ -2071,9 +2011,6 @@ void CompositionalMultiphaseBase::chopNegativeDensities( DomainPartition & domai using namespace isothermalCompositionalMultiphaseBaseKernels; - integer const numComp = m_numComponents; - real64 const minCompDens = m_minCompDens; - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) @@ -2082,25 +2019,33 @@ void CompositionalMultiphaseBase::chopNegativeDensities( DomainPartition & domai [&]( localIndex const, ElementSubRegionBase & subRegion ) { - arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); + chopNegativeDensities( subRegion ); + } ); + } ); +} - arrayView2d< real64, compflow::USD_COMP > const compDens = - subRegion.getField< fields::flow::globalCompDensity >(); +void CompositionalMultiphaseBase::chopNegativeDensities( ElementSubRegionBase & subRegion ) +{ + integer const numComp = m_numComponents; + real64 const minCompDens = m_minCompDens; - forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + arrayView1d< integer const > const ghostRank = subRegion.ghostRank(); + + arrayView2d< real64, compflow::USD_COMP > const compDens = + subRegion.getField< fields::flow::globalCompDensity >(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const ei ) + { + if( ghostRank[ei] < 0 ) + { + for( integer ic = 0; ic < numComp; ++ic ) { - if( ghostRank[ei] < 0 ) + if( compDens[ei][ic] < minCompDens ) { - for( integer ic = 0; ic < numComp; ++ic ) - { - if( compDens[ei][ic] < minCompDens ) - { - compDens[ei][ic] = minCompDens; - } - } + compDens[ei][ic] = minCompDens; } - } ); - } ); + } + } } ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index cfd06428707..278d8d6b453 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -282,12 +282,14 @@ class CompositionalMultiphaseBase : public FlowSolverBase * from prescribed intermediate values (i.e. global densities from global fractions) * and any applicable hydrostatic equilibration of the domain */ - void initializeFluidState( MeshLevel & mesh, DomainPartition & domain, arrayView1d< string const > const & regionNames ); + virtual void initializeFluidState( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; + + virtual void initializeThermalState( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; /** * @brief Compute the hydrostatic equilibrium using the compositions and temperature input tables */ - void computeHydrostaticEquilibrium(); + virtual void computeHydrostaticEquilibrium( DomainPartition & domain ) override; /** * @brief Function to perform the Application of Dirichlet type BC's @@ -362,6 +364,8 @@ class CompositionalMultiphaseBase : public FlowSolverBase */ void chopNegativeDensities( DomainPartition & domain ); + void chopNegativeDensities( ElementSubRegionBase & subRegion ); + virtual real64 setNextDtBasedOnStateChange( real64 const & currentDt, DomainPartition & domain ) override; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index f803e7c7e1e..bfbbbf368cd 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -286,16 +286,6 @@ void FlowSolverBase::saveSequentialIterationState( DomainPartition & domain ) m_sequentialTempChange = m_isThermal ? MpiWrapper::max( maxTempChange ) : 0.0; } -void FlowSolverBase::enableFixedStressPoromechanicsUpdate() -{ - m_isFixedStressPoromechanicsUpdate = true; -} - -void FlowSolverBase::enableJumpStabilization() -{ - m_isJumpStabilized = true; -} - void FlowSolverBase::setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const { PhysicsSolverBase::setConstitutiveNamesCallSuper( subRegion ); @@ -455,6 +445,12 @@ void FlowSolverBase::initializePostInitialConditionsPreSubGroups() arrayView1d< string const > const & regionNames ) { precomputeData( mesh, regionNames ); + + FieldIdentifiers fieldsToBeSync; + fieldsToBeSync.addElementFields( { fields::flow::pressure::key(), fields::flow::temperature::key() }, + regionNames ); + + CommunicationTools::getInstance().synchronizeFields( fieldsToBeSync, mesh, domain.getNeighbors(), false ); } ); } @@ -491,6 +487,97 @@ void FlowSolverBase::precomputeData( MeshLevel & mesh, } } +void FlowSolverBase::initialize( DomainPartition & domain ) +{ + // Compute hydrostatic equilibrium in the regions for which corresponding field specification tag has been specified + computeHydrostaticEquilibrium( domain ); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + initializePorosityAndPermeability( mesh, regionNames ); + initializeHydraulicAperture( mesh, regionNames ); + + // Initialize primary variables from applied initial conditions + initializeFluidState( mesh, regionNames ); + + // Initialize the rock thermal quantities: conductivity and solid internal energy + // Note: + // - This must be called after updatePorosityAndPermeability and updatePhaseVolumeFraction + // - This step depends on porosity and phaseVolFraction + if( m_isThermal ) + { + initializeThermalState( mesh, regionNames ); + } + + // Save initial pressure and temperature fields + saveInitialPressureAndTemperature( mesh, regionNames ); + } ); + + // report to the user if some pore volumes are very small + // note: this function is here because: 1) porosity has been initialized and 2) NTG has been applied + validatePoreVolumes( domain ); +} + +void FlowSolverBase::initializePorosityAndPermeability( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) +{ + // Update porosity and permeability + // In addition, to avoid multiplying permeability/porosity bay netToGross in the assembly kernel, we do it once and for all here + mesh.getElemManager().forElementSubRegions< CellElementSubRegion, SurfaceElementSubRegion >( regionNames, [&]( localIndex const, + auto & subRegion ) + { + // Apply netToGross to reference porosity and horizontal permeability + CoupledSolidBase const & porousSolid = + getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); + PermeabilityBase const & permeability = + getConstitutiveModel< PermeabilityBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::permeabilityNamesString() ) ); + arrayView1d< real64 const > const netToGross = subRegion.template getField< fields::flow::netToGross >(); + porousSolid.scaleReferencePorosity( netToGross ); + permeability.scaleHorizontalPermeability( netToGross ); + + // in some initializeState versions it uses newPorosity, so let's run updatePorosityAndPermeability to compute something + saveConvergedState( subRegion ); // necessary for a meaningful porosity update in sequential schemes + updatePorosityAndPermeability( subRegion ); + porousSolid.initializeState(); + + // run final update + saveConvergedState( subRegion ); // necessary for a meaningful porosity update in sequential schemes + updatePorosityAndPermeability( subRegion ); + + // Save the computed porosity into the old porosity + // Note: + // - This must be called after updatePorosityAndPermeability + // - This step depends on porosity + porousSolid.saveConvergedState(); + } ); +} + +void FlowSolverBase::initializeHydraulicAperture( MeshLevel & mesh, const arrayView1d< const string > & regionNames ) +{ + mesh.getElemManager().forElementRegions< SurfaceElementRegion >( regionNames, + [&]( localIndex const, + SurfaceElementRegion & region ) + { + region.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion & subRegion ) + { subRegion.getWrapper< real64_array >( fields::flow::hydraulicAperture::key()).setApplyDefaultValue( region.getDefaultAperture()); } ); + } ); +} + +void FlowSolverBase::saveInitialPressureAndTemperature( MeshLevel & mesh, const arrayView1d< const string > & regionNames ) +{ + mesh.getElemManager().forElementSubRegions( regionNames, [&]( localIndex const, + ElementSubRegionBase & subRegion ) + { + arrayView1d< real64 const > const pres = subRegion.getField< fields::flow::pressure >(); + arrayView1d< real64 > const initPres = subRegion.getField< fields::flow::initialPressure >(); + arrayView1d< real64 const > const temp = subRegion.getField< fields::flow::temperature >(); + arrayView1d< real64 > const initTemp = subRegion.template getField< fields::flow::initialTemperature >(); + initPres.setValues< parallelDevicePolicy<> >( pres ); + initTemp.setValues< parallelDevicePolicy<> >( temp ); + } ); +} + void FlowSolverBase::updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const { GEOS_MARK_FUNCTION; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index 6b65e91e979..1d46d170e37 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -100,9 +100,9 @@ class FlowSolverBase : public PhysicsSolverBase */ void updateStencilWeights( DomainPartition & domain ) const; - void enableFixedStressPoromechanicsUpdate(); + void enableFixedStressPoromechanicsUpdate() { m_isFixedStressPoromechanicsUpdate = true; } - void enableJumpStabilization(); + void enableJumpStabilization() { m_isJumpStabilized = true; } void updatePorosityAndPermeability( CellElementSubRegion & subRegion ) const; @@ -114,39 +114,12 @@ class FlowSolverBase : public PhysicsSolverBase */ virtual void saveSequentialIterationState( DomainPartition & domain ) override; - /** - * @brief For each equilibrium initial condition, loop over all the target cells and compute the min/max elevation - * @param[in] domain the domain partition - * @param[in] equilNameToEquilId the map from the name of the initial condition to the initial condition index (used in min/maxElevation) - * @param[out] maxElevation the max elevation for each initial condition - * @param[out] minElevation the min elevation for each initial condition - */ - void findMinMaxElevationInEquilibriumTarget( DomainPartition & domain, // cannot be const... - std::map< string, localIndex > const & equilNameToEquilId, - arrayView1d< real64 > const & maxElevation, - arrayView1d< real64 > const & minElevation ) const; - - /** - * @brief For each source flux boundary condition, loop over all the target cells and sum the owned cells - * @param[in] time the time at the beginning of the time step - * @param[in] dt the time step size - * @param[in] domain the domain partition - * @param[in] bcNameToBcId the map from the name of the boundary condition to the boundary condition index - * @param[out] bcAllSetsSize the total number of owned cells for each source flux boundary condition - */ - void computeSourceFluxSizeScalingFactor( real64 const & time, - real64 const & dt, - DomainPartition & domain, // cannot be const... - std::map< string, localIndex > const & bcNameToBcId, - arrayView1d< globalIndex > const & bcAllSetsSize ) const; - integer & isThermal() { return m_isThermal; } /** * @return The unit in which we evaluate the amount of fluid per element (Mass or Mole). */ - virtual units::Unit getMassUnit() const - { return units::Unit::Mass; } + virtual units::Unit getMassUnit() const { return units::Unit::Mass; } /** * @brief Function to activate the flag allowing negative pressure @@ -173,6 +146,36 @@ class FlowSolverBase : public PhysicsSolverBase real64 const & timeAtBeginningOfStep, real64 const & dt ); + virtual void initializeFluidState( MeshLevel & mesh, const arrayView1d< const string > & regionNames ) { GEOS_UNUSED_VAR( mesh, regionNames ); } + + virtual void initializeThermalState( MeshLevel & mesh, const arrayView1d< const string > & regionNames ) { GEOS_UNUSED_VAR( mesh, regionNames ); } + + /** + * @brief For each equilibrium initial condition, loop over all the target cells and compute the min/max elevation + * @param[in] domain the domain partition + * @param[in] equilNameToEquilId the map from the name of the initial condition to the initial condition index (used in min/maxElevation) + * @param[out] maxElevation the max elevation for each initial condition + * @param[out] minElevation the min elevation for each initial condition + */ + void findMinMaxElevationInEquilibriumTarget( DomainPartition & domain, // cannot be const... + std::map< string, localIndex > const & equilNameToEquilId, + arrayView1d< real64 > const & maxElevation, + arrayView1d< real64 > const & minElevation ) const; + + /** + * @brief For each source flux boundary condition, loop over all the target cells and sum the owned cells + * @param[in] time the time at the beginning of the time step + * @param[in] dt the time step size + * @param[in] domain the domain partition + * @param[in] bcNameToBcId the map from the name of the boundary condition to the boundary condition index + * @param[out] bcAllSetsSize the total number of owned cells for each source flux boundary condition + */ + void computeSourceFluxSizeScalingFactor( real64 const & time, + real64 const & dt, + DomainPartition & domain, // cannot be const... + std::map< string, localIndex > const & bcNameToBcId, + arrayView1d< globalIndex > const & bcAllSetsSize ) const; + protected: /** @@ -207,6 +210,16 @@ class FlowSolverBase : public PhysicsSolverBase virtual void initializePostInitialConditionsPreSubGroups() override; + void initialize( DomainPartition & domain ); + + virtual void computeHydrostaticEquilibrium( DomainPartition & domain ) { GEOS_UNUSED_VAR( domain ); } + + void initializePorosityAndPermeability( MeshLevel & mesh, arrayView1d< string const > const & regionNames ); + + void initializeHydraulicAperture( MeshLevel & mesh, const arrayView1d< const string > & regionNames ); + + void saveInitialPressureAndTemperature( MeshLevel & mesh, const arrayView1d< const string > & regionNames ); + virtual void setConstitutiveNamesCallSuper( ElementSubRegionBase & subRegion ) const override; /// the number of Degrees of Freedom per cell diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index f1a77c2001d..aca05df65e3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -404,105 +404,12 @@ void SinglePhaseBase::initializePostInitialConditionsPreSubGroups() DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); - - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) - { - FieldIdentifiers fieldsToBeSync; - fieldsToBeSync.addElementFields( { fields::flow::pressure::key() }, - regionNames ); - - CommunicationTools::getInstance().synchronizeFields( fieldsToBeSync, mesh, domain.getNeighbors(), false ); - - // Moved the following part from ImplicitStepSetup to here since it only needs to be initialized once - // They will be updated in applySystemSolution and ImplicitStepComplete, respectively - mesh.getElemManager().forElementSubRegions< CellElementSubRegion, SurfaceElementSubRegion >( regionNames, [&]( localIndex const, - auto & subRegion ) - { - // Compute hydrostatic equilibrium in the regions for which corresponding field specification tag has been specified - computeHydrostaticEquilibrium(); - - // 1. update porosity, permeability, and density/viscosity - // In addition, to avoid multiplying permeability/porosity bay netToGross in the assembly kernel, we do it once and for all here - arrayView1d< real64 const > const netToGross = subRegion.template getField< fields::flow::netToGross >(); - CoupledSolidBase const & porousSolid = - getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); - PermeabilityBase const & permeabilityModel = - getConstitutiveModel< PermeabilityBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::permeabilityNamesString() ) ); - permeabilityModel.scaleHorizontalPermeability( netToGross ); - porousSolid.scaleReferencePorosity( netToGross ); - saveConvergedState( subRegion ); // necessary for a meaningful porosity update in sequential schemes - updatePorosityAndPermeability( subRegion ); - - SingleFluidBase const & fluid = - getConstitutiveModel< SingleFluidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::fluidNamesString() ) ); - updateFluidState( subRegion ); - - // 2. save the initial density (for use in the single-phase poromechanics solver to compute the deltaBodyForce) - fluid.initializeState(); - - // 3. save the initial/old porosity - porousSolid.initializeState(); - - // 4. initialize the rock thermal quantities: conductivity and solid internal energy - if( m_isThermal ) - { - // initialized porosity - arrayView2d< real64 const > const porosity = porousSolid.getPorosity(); - - string const & thermalConductivityName = subRegion.template getReference< string >( viewKeyStruct::thermalConductivityNamesString() ); - SinglePhaseThermalConductivityBase const & conductivityMaterial = - getConstitutiveModel< SinglePhaseThermalConductivityBase >( subRegion, thermalConductivityName ); - conductivityMaterial.initializeRockFluidState( porosity ); - // note that there is nothing to update here because thermal conductivity is explicit for now - - updateSolidInternalEnergyModel( subRegion ); - string const & solidInternalEnergyName = subRegion.template getReference< string >( viewKeyStruct::solidInternalEnergyNamesString() ); - SolidInternalEnergy const & solidInternalEnergyMaterial = - getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); - solidInternalEnergyMaterial.saveConvergedState(); - } - } ); - - mesh.getElemManager().forElementRegions< SurfaceElementRegion >( regionNames, - [&]( localIndex const, - SurfaceElementRegion & region ) - { - region.forElementSubRegions< SurfaceElementSubRegion >( [&]( SurfaceElementSubRegion & subRegion ) - { - subRegion.getWrapper< real64_array >( fields::flow::hydraulicAperture::key() ). - setApplyDefaultValue( region.getDefaultAperture() ); - } ); - } ); - - mesh.getElemManager().forElementSubRegions( regionNames, [&]( localIndex const, - ElementSubRegionBase & subRegion ) - { - // Save initial pressure field - arrayView1d< real64 const > const pres = subRegion.getField< fields::flow::pressure >(); - arrayView1d< real64 > const initPres = subRegion.getField< fields::flow::initialPressure >(); - arrayView1d< real64 const > const & temp = subRegion.template getField< fields::flow::temperature >(); - arrayView1d< real64 > const initTemp = subRegion.template getField< fields::flow::initialTemperature >(); - initPres.setValues< parallelDevicePolicy<> >( pres ); - initTemp.setValues< parallelDevicePolicy<> >( temp ); - - // finally update mass and energy - updateMass( subRegion ); - if( m_isThermal ) - updateEnergy( subRegion ); - } ); - } ); - - // report to the user if some pore volumes are very small - // note: this function is here because: 1) porosity has been initialized and 2) NTG has been applied - validatePoreVolumes( domain ); + FlowSolverBase::initialize( domain ); } -void SinglePhaseBase::computeHydrostaticEquilibrium() +void SinglePhaseBase::computeHydrostaticEquilibrium( DomainPartition & domain ) { FieldSpecificationManager & fsManager = FieldSpecificationManager::getInstance(); - DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); real64 const gravVector[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( gravityVector() ); @@ -676,6 +583,48 @@ void SinglePhaseBase::computeHydrostaticEquilibrium() } ); } +void SinglePhaseBase::initializeFluidState( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) +{ + mesh.getElemManager().forElementSubRegions< CellElementSubRegion, SurfaceElementSubRegion >( regionNames, [&]( localIndex const, + auto & subRegion ) + { + SingleFluidBase const & fluid = + getConstitutiveModel< SingleFluidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::fluidNamesString())); + updateFluidState( subRegion ); + + // 2. save the initial density (for use in the single-phase poromechanics solver to compute the deltaBodyForce) + fluid.initializeState(); + + updateMass( subRegion ); + } ); +} + +void SinglePhaseBase::initializeThermalState( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) +{ + mesh.getElemManager().forElementSubRegions< CellElementSubRegion, SurfaceElementSubRegion >( regionNames, [&]( localIndex const, + auto & subRegion ) + { + // initialized porosity + CoupledSolidBase const & porousSolid = + getConstitutiveModel< CoupledSolidBase >( subRegion, subRegion.template getReference< string >( viewKeyStruct::solidNamesString() ) ); + arrayView2d< real64 const > const porosity = porousSolid.getPorosity(); + + string const & thermalConductivityName = subRegion.template getReference< string >( viewKeyStruct::thermalConductivityNamesString()); + SinglePhaseThermalConductivityBase const & conductivityMaterial = + getConstitutiveModel< SinglePhaseThermalConductivityBase >( subRegion, thermalConductivityName ); + conductivityMaterial.initializeRockFluidState( porosity ); + // note that there is nothing to update here because thermal conductivity is explicit for now + + updateSolidInternalEnergyModel( subRegion ); + string const & solidInternalEnergyName = subRegion.template getReference< string >( viewKeyStruct::solidInternalEnergyNamesString()); + SolidInternalEnergy const & solidInternalEnergyMaterial = + getConstitutiveModel< SolidInternalEnergy >( subRegion, solidInternalEnergyName ); + solidInternalEnergyMaterial.saveConvergedState(); + + updateEnergy( subRegion ); + } ); +} + void SinglePhaseBase::implicitStepSetup( real64 const & GEOS_UNUSED_PARAM( time_n ), real64 const & GEOS_UNUSED_PARAM( dt ), DomainPartition & domain ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index bf1cd19eadd..ad175412dc1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -335,18 +335,14 @@ class SinglePhaseBase : public FlowSolverBase virtual void initializePostInitialConditionsPreSubGroups() override; - /** - * @brief Compute the hydrostatic equilibrium using the compositions and temperature input tables - */ - void computeHydrostaticEquilibrium(); + virtual void initializeFluidState( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; + + virtual void initializeThermalState( MeshLevel & mesh, arrayView1d< string const > const & regionNames ) override; /** - * @brief Update the cell-wise pressure gradient + * @brief Compute the hydrostatic equilibrium using the compositions and temperature input tables */ - virtual void updatePressureGradient( DomainPartition & domain ) - { - GEOS_UNUSED_VAR( domain ); - } + virtual void computeHydrostaticEquilibrium( DomainPartition & domain ) override; /** * @brief Function to fix the initial state during the initialization step in coupled problems diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 233eb1d1363..f2022bc9e40 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -656,22 +656,5 @@ void SinglePhaseHybridFVM::resetStateToBeginningOfStep( DomainPartition & domain } ); } -void SinglePhaseHybridFVM::updatePressureGradient( DomainPartition & domain ) -{ - forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, - MeshLevel & mesh, - arrayView1d< string const > const & regionNames ) - { - FaceManager & faceManager = mesh.getFaceManager(); - - mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, - auto & subRegion ) - { - singlePhaseHybridFVMKernels::AveragePressureGradientKernelFactory::createAndLaunch< parallelHostPolicy >( subRegion, - faceManager ); - } ); - } ); -} - REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhaseHybridFVM, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp index a1ae07fb5b5..f8427490c60 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp @@ -164,8 +164,6 @@ class SinglePhaseHybridFVM : public SinglePhaseBase real64 const & dt, DomainPartition & domain ) override; - virtual void updatePressureGradient( DomainPartition & domain ) override final; - /** * @brief Function to perform the application of Dirichlet BCs on faces * @param[in] time_n current time From 738175ee14a396b9ddc76cdc7bc7bbd787321665 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Tue, 3 Dec 2024 13:38:13 -0600 Subject: [PATCH 270/286] fix: restore updatePressureGradient (#3472) --- .../fluidFlow/CompositionalMultiphaseBase.cpp | 2 +- .../physicsSolvers/fluidFlow/FlowSolverBase.cpp | 2 +- .../physicsSolvers/fluidFlow/FlowSolverBase.hpp | 2 +- .../fluidFlow/SinglePhaseBase.cpp | 2 +- .../fluidFlow/SinglePhaseBase.hpp | 8 ++++++++ .../fluidFlow/SinglePhaseHybridFVM.cpp | 17 +++++++++++++++++ .../fluidFlow/SinglePhaseHybridFVM.hpp | 2 ++ 7 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 5e59ba4bc2c..9c7d0108c7b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -1263,7 +1263,7 @@ void CompositionalMultiphaseBase::initializePostInitialConditionsPreSubGroups() } ); } ); - initialize( domain ); + initializeState( domain ); } void diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index bfbbbf368cd..8cd3ff1b942 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -487,7 +487,7 @@ void FlowSolverBase::precomputeData( MeshLevel & mesh, } } -void FlowSolverBase::initialize( DomainPartition & domain ) +void FlowSolverBase::initializeState( DomainPartition & domain ) { // Compute hydrostatic equilibrium in the regions for which corresponding field specification tag has been specified computeHydrostaticEquilibrium( domain ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index 1d46d170e37..23897ccb899 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -210,7 +210,7 @@ class FlowSolverBase : public PhysicsSolverBase virtual void initializePostInitialConditionsPreSubGroups() override; - void initialize( DomainPartition & domain ); + void initializeState( DomainPartition & domain ); virtual void computeHydrostaticEquilibrium( DomainPartition & domain ) { GEOS_UNUSED_VAR( domain ); } diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index aca05df65e3..812c342de0a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -404,7 +404,7 @@ void SinglePhaseBase::initializePostInitialConditionsPreSubGroups() DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" ); - FlowSolverBase::initialize( domain ); + FlowSolverBase::initializeState( domain ); } void SinglePhaseBase::computeHydrostaticEquilibrium( DomainPartition & domain ) diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index ad175412dc1..9e40ecda15f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -344,6 +344,14 @@ class SinglePhaseBase : public FlowSolverBase */ virtual void computeHydrostaticEquilibrium( DomainPartition & domain ) override; + /** + * @brief Update the cell-wise pressure gradient + */ + virtual void updatePressureGradient( DomainPartition & domain ) + { + GEOS_UNUSED_VAR( domain ); + } + /** * @brief Function to fix the initial state during the initialization step in coupled problems * @param[in] time current time diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index f2022bc9e40..233eb1d1363 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -656,5 +656,22 @@ void SinglePhaseHybridFVM::resetStateToBeginningOfStep( DomainPartition & domain } ); } +void SinglePhaseHybridFVM::updatePressureGradient( DomainPartition & domain ) +{ + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + FaceManager & faceManager = mesh.getFaceManager(); + + mesh.getElemManager().forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, + auto & subRegion ) + { + singlePhaseHybridFVMKernels::AveragePressureGradientKernelFactory::createAndLaunch< parallelHostPolicy >( subRegion, + faceManager ); + } ); + } ); +} + REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SinglePhaseHybridFVM, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp index f8427490c60..a1ae07fb5b5 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp @@ -164,6 +164,8 @@ class SinglePhaseHybridFVM : public SinglePhaseBase real64 const & dt, DomainPartition & domain ) override; + virtual void updatePressureGradient( DomainPartition & domain ) override final; + /** * @brief Function to perform the application of Dirichlet BCs on faces * @param[in] time_n current time From dc6a6be319d2a3873424dbdcd7c96b4819d10c23 Mon Sep 17 00:00:00 2001 From: tbeltzun <129868353+tbeltzun@users.noreply.github.com> Date: Wed, 4 Dec 2024 18:29:11 +0100 Subject: [PATCH 271/286] fix: add early check for invalid `toMetricPrefixString` input (#2652) --- src/coreComponents/common/format/StringUtilities.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/coreComponents/common/format/StringUtilities.cpp b/src/coreComponents/common/format/StringUtilities.cpp index cfc00307781..b8f316456f8 100644 --- a/src/coreComponents/common/format/StringUtilities.cpp +++ b/src/coreComponents/common/format/StringUtilities.cpp @@ -103,6 +103,11 @@ template string addCommaSeparators( long long int const & num ); template< typename T > string toMetricPrefixString( T const & value ) { + if( std::fpclassify( value ) == FP_ZERO ) + { + return " 0.0 "; + } + // These are the metric prefixes corrosponding to kilo, mega, giga...etc. char const prefixes[12] = { 'f', 'p', 'n', 'u', 'm', ' ', 'K', 'M', 'G', 'T', 'P', 'E'}; string rval; From b56762c290796b2fd7e93ce82943484a5fa362b1 Mon Sep 17 00:00:00 2001 From: Ronan Madec <137914343+rmadec-cs@users.noreply.github.com> Date: Thu, 5 Dec 2024 00:43:35 +0100 Subject: [PATCH 272/286] feat: WaveEquation : new acoustic gradient formulation (#3361) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 +- .../isotropic/AcousticWaveEquationSEM.cpp | 92 ++-- .../sem/acoustic/shared/AcousticFields.hpp | 14 +- .../shared/AcousticMatricesSEMKernel.hpp | 63 +++ .../wavePropagation/shared/WaveSolverBase.cpp | 34 +- .../wavePropagationTests/CMakeLists.txt | 4 +- .../testWavePropagationAdjoint1.cpp | 404 ++++++++++++++++++ 8 files changed, 569 insertions(+), 50 deletions(-) create mode 100644 src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAdjoint1.cpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 92b83368c51..97f13dd9062 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3393-9089-c187f5d + baseline: integratedTests/baseline_integratedTests-pr3361-9139-2fc4131 allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 46193312093..e5e337912cb 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,7 +6,11 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). -PR #3393 (2024-12-2) +PR #3361 (2024-12-03) +===================== +Baseline diffs after reimplementation of wave equation acoustic gradient for velocity and density parameters: new field "partialGradient2" and "pressureForward" field replacing "pressureDoubleDerivative". + +PR #3393 (2024-12-02) ===================== Fix netToGross bug. diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index 059259cb12b..a3c8a6cc967 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -77,7 +77,7 @@ void AcousticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) nodeManager.registerField< acousticfields::Pressure_nm1, acousticfields::Pressure_n, acousticfields::Pressure_np1, - acousticfields::PressureDoubleDerivative, + acousticfields::PressureForward, acousticfields::ForcingRHS, acousticfields::AcousticMassVector, acousticfields::DampingVector, @@ -106,6 +106,7 @@ void AcousticWaveEquationSEM::registerDataOnMesh( Group & meshBodies ) subRegion.registerField< acousticfields::AcousticVelocity >( getName() ); subRegion.registerField< acousticfields::AcousticDensity >( getName() ); subRegion.registerField< acousticfields::PartialGradient >( getName() ); + subRegion.registerField< acousticfields::PartialGradient2 >( getName() ); } ); } ); @@ -298,6 +299,8 @@ void AcousticWaveEquationSEM::initializePostInitialConditionsPreSubGroups() arrayView1d< real32 > grad = elementSubRegion.getField< acousticfields::PartialGradient >(); grad.zero(); + arrayView1d< real32 > grad2 = elementSubRegion.getField< acousticfields::PartialGradient2 >(); + grad2.zero(); finiteElement::FiniteElementDispatchHandler< SEM_FE_TYPES >::dispatch3D( fe, [&] ( auto const finiteElement ) { @@ -881,43 +884,35 @@ real64 AcousticWaveEquationSEM::explicitStepForward( real64 const & time_n, { NodeManager & nodeManager = mesh.getNodeManager(); - arrayView1d< real32 > const p_nm1 = nodeManager.getField< acousticfields::Pressure_nm1 >(); arrayView1d< real32 > const p_n = nodeManager.getField< acousticfields::Pressure_n >(); - arrayView1d< real32 > const p_np1 = nodeManager.getField< acousticfields::Pressure_np1 >(); if( computeGradient && cycleNumber >= 0 ) { - arrayView1d< real32 > const p_dt2 = nodeManager.getField< acousticfields::PressureDoubleDerivative >(); - if( m_enableLifo ) { if( !m_lifo ) { int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); - std::string lifoPrefix = GEOS_FMT( "lifo/rank_{:05}/pdt2_shot{:06}", rank, m_shotIndex ); - m_lifo = std::make_unique< LifoStorage< real32, localIndex > >( lifoPrefix, p_dt2, m_lifoOnDevice, m_lifoOnHost, m_lifoSize ); + std::string lifoPrefix = GEOS_FMT( "lifo/rank_{:05}/p_forward_shot{:06}", rank, m_shotIndex ); + m_lifo = std::make_unique< LifoStorage< real32, localIndex > >( lifoPrefix, p_n, m_lifoOnDevice, m_lifoOnHost, m_lifoSize ); } m_lifo->pushWait(); } - forAll< EXEC_POLICY >( nodeManager.size(), [=] GEOS_HOST_DEVICE ( localIndex const nodeIdx ) - { - p_dt2[nodeIdx] = (p_np1[nodeIdx] - 2*p_n[nodeIdx] + p_nm1[nodeIdx]) / pow( dt, 2 ); - } ); if( m_enableLifo ) { // Need to tell LvArray data is on GPU to avoir HtoD copy - p_dt2.move( LvArray::MemorySpace::cuda, false ); - m_lifo->pushAsync( p_dt2 ); + p_n.move( LvArray::MemorySpace::cuda, false ); + m_lifo->pushAsync( p_n ); } else { GEOS_MARK_SCOPE ( DirectWrite ); - p_dt2.move( LvArray::MemorySpace::host, false ); + p_n.move( LvArray::MemorySpace::host, false ); int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); - std::string fileName = GEOS_FMT( "lifo/rank_{:05}/pressuredt2_{:06}_{:08}.dat", rank, m_shotIndex, cycleNumber ); + std::string fileName = GEOS_FMT( "lifo/rank_{:05}/pressure_forward_{:06}_{:08}.dat", rank, m_shotIndex, cycleNumber ); int lastDirSeparator = fileName.find_last_of( "/\\" ); std::string dirName = fileName.substr( 0, lastDirSeparator ); if( string::npos != (size_t)lastDirSeparator && !directoryExists( dirName )) @@ -929,7 +924,7 @@ real64 AcousticWaveEquationSEM::explicitStepForward( real64 const & time_n, GEOS_THROW_IF( !wf, getDataContext() << ": Could not open file "<< fileName << " for writing", InputError ); - wf.write( (char *)&p_dt2[0], p_dt2.size()*sizeof( real32 ) ); + wf.write( (char *)&p_n[0], p_n.size()*sizeof( real32 ) ); wf.close( ); GEOS_THROW_IF( !wf.good(), getDataContext() << ": An error occured while writing "<< fileName, @@ -959,12 +954,18 @@ real64 AcousticWaveEquationSEM::explicitStepBackward( real64 const & time_n, { NodeManager & nodeManager = mesh.getNodeManager(); - arrayView1d< real32 const > const mass = nodeManager.getField< acousticfields::AcousticMassVector >(); - arrayView1d< real32 > const p_nm1 = nodeManager.getField< acousticfields::Pressure_nm1 >(); arrayView1d< real32 > const p_n = nodeManager.getField< acousticfields::Pressure_n >(); arrayView1d< real32 > const p_np1 = nodeManager.getField< acousticfields::Pressure_np1 >(); + //// Compute q_dt2 and store it in p_nm1 + SortedArrayView< localIndex const > const solverTargetNodesSet = m_solverTargetNodesSet.toViewConst(); + forAll< EXEC_POLICY >( solverTargetNodesSet.size(), [=] GEOS_HOST_DEVICE ( localIndex const n ) + { + localIndex const a = solverTargetNodesSet[n]; + p_nm1[a] = (p_np1[a] - 2*p_n[a] + p_nm1[a]) / pow( dt, 2 ); + } ); + EventManager const & event = getGroupByPath< EventManager >( "/Problem/Events" ); real64 const & maxTime = event.getReference< real64 >( EventManager::viewKeyStruct::maxTimeString() ); int const maxCycle = int(round( maxTime / dt )); @@ -973,11 +974,11 @@ real64 AcousticWaveEquationSEM::explicitStepBackward( real64 const & time_n, { ElementRegionManager & elemManager = mesh.getElemManager(); - arrayView1d< real32 > const p_dt2 = nodeManager.getField< acousticfields::PressureDoubleDerivative >(); + arrayView1d< real32 > const p_forward = nodeManager.getField< acousticfields::PressureForward >(); if( m_enableLifo ) { - m_lifo->pop( p_dt2 ); + m_lifo->pop( p_forward ); if( m_lifo->empty() ) delete m_lifo.release(); } @@ -986,37 +987,60 @@ real64 AcousticWaveEquationSEM::explicitStepBackward( real64 const & time_n, GEOS_MARK_SCOPE ( DirectRead ); int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); - std::string fileName = GEOS_FMT( "lifo/rank_{:05}/pressuredt2_{:06}_{:08}.dat", rank, m_shotIndex, cycleNumber ); + std::string fileName = GEOS_FMT( "lifo/rank_{:05}/pressure_forward_{:06}_{:08}.dat", rank, m_shotIndex, cycleNumber ); std::ifstream wf( fileName, std::ios::in | std::ios::binary ); GEOS_THROW_IF( !wf, getDataContext() << ": Could not open file "<< fileName << " for reading", InputError ); - p_dt2.move( LvArray::MemorySpace::host, true ); - wf.read( (char *)&p_dt2[0], p_dt2.size()*sizeof( real32 ) ); + p_forward.move( LvArray::MemorySpace::host, true ); + wf.read( (char *)&p_forward[0], p_forward.size()*sizeof( real32 ) ); wf.close( ); remove( fileName.c_str() ); } elemManager.forElementSubRegions< CellElementSubRegion >( regionNames, [&]( localIndex const, CellElementSubRegion & elementSubRegion ) { - arrayView1d< real32 const > const velocity = elementSubRegion.getField< acousticfields::AcousticVelocity >(); + arrayView2d< wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords = nodeManager.getField< fields::referencePosition32 >().toViewConst(); arrayView1d< real32 > grad = elementSubRegion.getField< acousticfields::PartialGradient >(); + arrayView1d< real32 > grad2 = elementSubRegion.getField< acousticfields::PartialGradient2 >(); arrayView2d< localIndex const, cells::NODE_MAP_USD > const & elemsToNodes = elementSubRegion.nodeList(); - constexpr localIndex numNodesPerElem = 8; arrayView1d< integer const > const elemGhostRank = elementSubRegion.ghostRank(); GEOS_MARK_SCOPE ( updatePartialGradient ); - forAll< EXEC_POLICY >( elementSubRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const eltIdx ) + + //COMPUTE GRADIENTS with respect to K=1/rho*c2 (grad) and b=1/rho (grad2) + finiteElement::FiniteElementBase const & + fe = elementSubRegion.getReference< finiteElement::FiniteElementBase >( getDiscretizationName() ); + + finiteElement::FiniteElementDispatchHandler< SEM_FE_TYPES >::dispatch3D( fe, [&] ( auto const finiteElement ) { - if( elemGhostRank[eltIdx]<0 ) - { - for( localIndex i = 0; i < numNodesPerElem; ++i ) - { - localIndex nodeIdx = elemsToNodes[eltIdx][i]; - grad[eltIdx] += (-2/velocity[eltIdx]) * mass[nodeIdx]/8.0 * (p_dt2[nodeIdx] * p_n[nodeIdx]); - } - } + using FE_TYPE = TYPEOFREF( finiteElement ); + + AcousticMatricesSEM::GradientKappaBuoyancy< FE_TYPE > kernelG( finiteElement ); + kernelG.template computeGradient< EXEC_POLICY, ATOMIC_POLICY >( elementSubRegion.size(), + nodeCoords, + elemsToNodes, + elemGhostRank, + p_nm1, + p_n, + p_forward, + grad, + grad2 ); + + } ); + + // // Change of variables to return grad with respect to c and rho + // arrayView1d< real32 const > const velocity = elementSubRegion.getField< acousticfields::AcousticVelocity >(); + // arrayView1d< real32 const > const density = elementSubRegion.getField< acousticfields::AcousticDensity >(); + // forAll< EXEC_POLICY >( elementSubRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const eltIdx ) + // { + // if( elemGhostRank[eltIdx]<0 ) + // { + // grad2[eltIdx] = -1/(pow(density[eltIdx]*velocity[eltIdx],2)) * grad[eltIdx] - 1/pow(density[eltIdx],2) * grad2[eltIdx]; + // grad[eltIdx]= -2/(density[eltIdx]*pow(velocity[eltIdx],3)) * grad[eltIdx]; + // } + // } ); } ); } diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp index dd067a11a1f..de61245599c 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp @@ -59,13 +59,13 @@ DECLARE_FIELD( Pressure_np1, WRITE_AND_READ, "Scalar pressure at time n+1." ); -DECLARE_FIELD( PressureDoubleDerivative, - "pressureDoubleDerivative", +DECLARE_FIELD( PressureForward, + "pressureForward", array1d< real32 >, 0, NOPLOT, WRITE_AND_READ, - "Double derivative of the pressure for each node to compute the gradient" ); + "Pressure field from forward pass on each node to compute the gradient" ); DECLARE_FIELD( Velocity_x, "velocity_x", @@ -99,6 +99,14 @@ DECLARE_FIELD( PartialGradient, WRITE_AND_READ, "Partiel gradient computed during backward propagation" ); +DECLARE_FIELD( PartialGradient2, + "partialGradient2", + array1d< real32 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Partial gradient for density/velocity computed during backward propagation" ); + DECLARE_FIELD( ForcingRHS, "rhs", array1d< real32 >, diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp index b311d04d45d..9d3d14fa31c 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp @@ -152,7 +152,70 @@ struct AcousticMatricesSEM }; + template< typename FE_TYPE > + struct GradientKappaBuoyancy + { + + GradientKappaBuoyancy( FE_TYPE const & finiteElement ) + : m_finiteElement( finiteElement ) + {} + + /** + * @brief Launch the computation of the 2 gradients relative to the coeff of the wave equation K=1/rho*c2 and b=1/rho + * @tparam EXEC_POLICY the execution policy + * @tparam ATOMIC_POLICY the atomic policy + * @param[in] size the number of cells in the subRegion + * @param[in] nodeCoords coordinates of the nodes + * @param[in] elemsToNodes map from element to nodes + * @param[in] q_dt2 second order derivative in time of backward + * @param[in] q_n current time step of backward + * @param[in] p_n current time step of forward + * @param[out] grad first part of gradient vector with respect to K=1/rho*c2 + * @param[out] grad2 second part of gradient vector with respact to b=1/rho + */ + template< typename EXEC_POLICY, typename ATOMIC_POLICY > + void + computeGradient( localIndex const size, + arrayView2d< WaveSolverBase::wsCoordType const, nodes::REFERENCE_POSITION_USD > const nodeCoords, + arrayView2d< localIndex const, cells::NODE_MAP_USD > const elemsToNodes, + arrayView1d< integer const > const elemGhostRank, + arrayView1d< real32 const > const q_dt2, + arrayView1d< real32 const > const q_n, + arrayView1d< real32 const > const p_n, + arrayView1d< real32 > const grad, + arrayView1d< real32 > const grad2 ) + { + forAll< EXEC_POLICY >( size, [=] GEOS_HOST_DEVICE ( localIndex const e ) + { + if( elemGhostRank[e]<0 ) + { + // only the eight corners of the mesh cell are needed to compute the Jacobian + real64 xLocal[ 8 ][ 3 ]; + for( localIndex a = 0; a < 8; ++a ) + { + localIndex const nodeIndex = elemsToNodes( e, FE_TYPE::meshIndexToLinearIndex3D( a ) ); + for( localIndex i = 0; i < 3; ++i ) + { + xLocal[a][i] = nodeCoords( nodeIndex, i ); + } + } + constexpr localIndex numQuadraturePointsPerElem = FE_TYPE::numQuadraturePoints; + for( localIndex q = 0; q < numQuadraturePointsPerElem; ++q ) + { + localIndex nodeIdx = elemsToNodes( e, q ); + grad[e] += q_dt2[nodeIdx] * p_n[nodeIdx] * m_finiteElement.computeMassTerm( q, xLocal ); + m_finiteElement.template computeStiffnessTerm( q, xLocal, [&] ( const int i, const int j, const real64 val ) + { + grad2[e] += val* q_n[elemsToNodes( e, j )] * p_n[elemsToNodes( e, i )]; + } ); + } + } + } ); // end loop over element + } + /// The finite element space/discretization object for the element type in the subRegion + FE_TYPE const & m_finiteElement; + }; }; diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index c5baf9c7983..f1ac14c24ea 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -484,9 +484,19 @@ void WaveSolverBase::computeTargetNodeSet( arrayView2d< localIndex const, cells: void WaveSolverBase::incrementIndexSeismoTrace( real64 const time_n ) { - while( (m_dtSeismoTrace * m_indexSeismoTrace) <= (time_n + epsilonLoc) && m_indexSeismoTrace < m_nsamplesSeismoTrace ) + if( m_forward ) + { + while( (m_dtSeismoTrace * m_indexSeismoTrace) <= (time_n + epsilonLoc) && m_indexSeismoTrace < m_nsamplesSeismoTrace ) + { + m_indexSeismoTrace++; + } + } + else { - m_indexSeismoTrace++; + while( (m_dtSeismoTrace * m_indexSeismoTrace) >= (time_n - epsilonLoc) && m_indexSeismoTrace > 0 ) + { + m_indexSeismoTrace--; + } } } @@ -515,12 +525,14 @@ void WaveSolverBase::computeAllSeismoTraces( real64 const time_n, if( m_nsamplesSeismoTrace == 0 ) return; integer const dir = m_forward ? +1 : -1; - for( localIndex iSeismo = m_indexSeismoTrace; iSeismo < m_nsamplesSeismoTrace; iSeismo++ ) + integer const beginIndex = m_forward ? m_indexSeismoTrace : m_nsamplesSeismoTrace-m_indexSeismoTrace; + for( localIndex iSeismo = beginIndex; iSeismo < m_nsamplesSeismoTrace; iSeismo++ ) { - real64 const timeSeismo = m_dtSeismoTrace * (m_forward ? iSeismo : (m_nsamplesSeismoTrace - 1) - iSeismo); - if( dir * timeSeismo > dir * (time_n + epsilonLoc) ) + localIndex seismoIndex = m_forward ? iSeismo : m_nsamplesSeismoTrace-iSeismo; + real64 const timeSeismo = m_dtSeismoTrace * seismoIndex; + if( dir * timeSeismo > dir * time_n + epsilonLoc ) break; - WaveSolverUtils::computeSeismoTrace( time_n, dir * dt, timeSeismo, iSeismo, m_receiverNodeIds, + WaveSolverUtils::computeSeismoTrace( time_n, dir * dt, timeSeismo, seismoIndex, m_receiverNodeIds, m_receiverConstants, m_receiverIsLocal, var_np1, var_n, varAtReceivers, coeffs, add ); } } @@ -535,12 +547,14 @@ void WaveSolverBase::compute2dVariableAllSeismoTraces( localIndex const regionIn if( m_nsamplesSeismoTrace == 0 ) return; integer const dir = m_forward ? +1 : -1; - for( localIndex iSeismo = m_indexSeismoTrace; iSeismo < m_nsamplesSeismoTrace; iSeismo++ ) + integer const beginIndex = m_forward ? m_indexSeismoTrace : m_nsamplesSeismoTrace-m_indexSeismoTrace; + for( localIndex iSeismo = beginIndex; iSeismo < m_nsamplesSeismoTrace; iSeismo++ ) { - real64 const timeSeismo = m_dtSeismoTrace * (m_forward ? iSeismo : (m_nsamplesSeismoTrace - 1) - iSeismo); - if( dir * timeSeismo > dir * (time_n + epsilonLoc)) + localIndex seismoIndex = m_forward ? iSeismo : m_nsamplesSeismoTrace-iSeismo; + real64 const timeSeismo = m_dtSeismoTrace * seismoIndex; + if( dir * timeSeismo > dir * time_n + epsilonLoc ) break; - WaveSolverUtils::compute2dVariableSeismoTrace( time_n, dir * dt, regionIndex, m_receiverRegion, timeSeismo, iSeismo, m_receiverElem, + WaveSolverUtils::compute2dVariableSeismoTrace( time_n, dir * dt, regionIndex, m_receiverRegion, timeSeismo, seismoIndex, m_receiverElem, m_receiverConstants, m_receiverIsLocal, var_np1, var_n, varAtReceivers ); } } diff --git a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt index fab0a741e73..c1296f06b10 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/wavePropagationTests/CMakeLists.txt @@ -6,7 +6,9 @@ set( gtest_geosx_tests testWavePropagationDAS.cpp testWavePropagationElasticVTI.cpp testWavePropagationAttenuation.cpp - testWavePropagationAcousticFirstOrder.cpp ) + testWavePropagationAcousticFirstOrder.cpp + testWavePropagationAdjoint1.cpp + ) set( tplDependencyList ${parallelDeps} gtest ) diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAdjoint1.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAdjoint1.cpp new file mode 100644 index 00000000000..68c7618fecc --- /dev/null +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAdjoint1.cpp @@ -0,0 +1,404 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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. + * ------------------------------------------------------------------------------------------------------------ + */ + +// using some utility classes from the following unit test +#include "unitTests/fluidFlowTests/testCompFlowUtils.hpp" + +#include "common/DataTypes.hpp" +#include "mainInterface/initialization.hpp" +#include "mainInterface/ProblemManager.hpp" +#include "mesh/DomainPartition.hpp" +#include "mainInterface/GeosxState.hpp" +#include "physicsSolvers/PhysicsSolverManager.hpp" +#include "physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp" +#include "physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp" + +#include + +using namespace geos; +using namespace geos::dataRepository; +using namespace geos::testing; + +CommandLineOptions g_commandLineOptions; + +// This unit test checks the interpolation done to extract seismic traces from a wavefield. +// It computes a seismogram at a receiver co-located with the source and compares it to the surrounding receivers. +char const * xmlInput = + R"xml( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + )xml"; + +class AcousticWaveEquationSEMTest : public ::testing::Test +{ +public: + + AcousticWaveEquationSEMTest(): + state( std::make_unique< CommandLineOptions >( g_commandLineOptions ) ) + {} + +protected: + + void SetUp() override + { + setupProblemFromXML( state.getProblemManager(), xmlInput ); + } + + static real64 constexpr time = 0.0; + static real64 constexpr dt = 5e-3; + static real64 constexpr eps = std::numeric_limits< real64 >::epsilon(); + + GeosxState state; + AcousticWaveEquationSEM * propagator; +}; + +real64 constexpr AcousticWaveEquationSEMTest::time; +real64 constexpr AcousticWaveEquationSEMTest::dt; +real64 constexpr AcousticWaveEquationSEMTest::eps; + +TEST_F( AcousticWaveEquationSEMTest, SeismoTrace ) +{ + + DomainPartition & domain = state.getProblemManager().getDomainPartition(); + propagator = &state.getProblemManager().getPhysicsSolverManager().getGroup< AcousticWaveEquationSEM >( "acousticSolver" ); + + // Check source term (sourceCoordinates and sourceValue) + array2d< real32 > rhsForward; + rhsForward.resize( 51, 1 ); + real32 * ptrTimeSourceFrequency = &propagator->getReference< real32 >( AcousticWaveEquationSEM::viewKeyStruct::timeSourceFrequencyString() ); + real32 * ptrTimeSourceDelay = &propagator->getReference< real32 >( AcousticWaveEquationSEM::viewKeyStruct::timeSourceDelayString() ); + localIndex * ptrRickerOrder = &propagator->getReference< localIndex >( AcousticWaveEquationSEM::viewKeyStruct::rickerOrderString() ); + + real64 time_n = time; + std::cout << "Begin forward:" << time_n << std::endl; + // run for 0.25s (100 steps) + for( int i=0; i<50; i++ ) + { + rhsForward[i][0]=WaveSolverUtils::evaluateRicker( time_n, *ptrTimeSourceFrequency, *ptrTimeSourceDelay, *ptrRickerOrder ); + propagator->explicitStepForward( time_n, dt, i, domain, false ); + time_n += dt; + } + // cleanup (triggers calculation of the remaining seismograms data points) + propagator->cleanup( 1.0, 50, 0, 0, domain ); + + // retrieve seismo + arrayView2d< real32 > const pReceivers = propagator->getReference< array2d< real32 > >( AcousticWaveEquationSEM::viewKeyStruct::pressureNp1AtReceiversString() ).toView(); + + // move it to CPU, if needed + pReceivers.move( hostMemorySpace, false ); + + // check number of seismos and trace length + ASSERT_EQ( pReceivers.size( 1 ), 5 ); + ASSERT_EQ( pReceivers.size( 0 ), 51 ); + + /*----------Save receiver forward----------------------*/ + array2d< real32 > uForward; + uForward.resize( 51, 1 ); + + // save receiver value forward on uForward. + for( int i = 0; i < 51; i++ ) + { + /*std::cout << "time: " << i*dt << std::endl; + std::cout << "pReceivers1 " << i << ":" << pReceivers[i][0] << std::endl; + std::cout << "pReceivers2 " << i << ":" << pReceivers[i][1] << std::endl; + std::cout << "pReceivers3 " << i << ":" << pReceivers[i][2] << std::endl; + std::cout << "pReceivers4 " << i << ":" << pReceivers[i][3] << std::endl; + std::cout << "rhsForward " << i << ":" << rhsForward[i][0] << std::endl;*/ + uForward[i][0] = pReceivers[i][0]; + pReceivers[i][0] = 0.; + pReceivers[i][1] = 0.; + pReceivers[i][2] = 0.; + pReceivers[i][3] = 0.; + } + + ASSERT_EQ( rhsForward.size( 1 ), 1 ); + ASSERT_EQ( rhsForward.size( 0 ), 51 ); + + arrayView2d< localIndex > const rNodeIds = propagator->getReference< array2d< localIndex > >( AcousticWaveEquationSEM::viewKeyStruct::receiverNodeIdsString() ).toView(); + rNodeIds.move( hostMemorySpace, false ); + localIndex sNodesIdsAfterModif=rNodeIds[0][0]; + std::cout << "ref back sNodeIds[0][0]:" << sNodesIdsAfterModif << std::endl; + + /*---------------------------------------------------*/ + + std::cout << "Begin backward:" << time_n << std::endl; + + //----------Switch source and receiver1 position for backward----------------------// + arrayView2d< real64 > const sCoord = propagator->getReference< array2d< real64 > >( AcousticWaveEquationSEM::viewKeyStruct::sourceCoordinatesString() ).toView(); + arrayView2d< real64 > const rCoord = propagator->getReference< array2d< real64 > >( AcousticWaveEquationSEM::viewKeyStruct::receiverCoordinatesString() ).toView(); + + for( int i = 0; i < 3; i++ ) + { + real64 tmp_double; + tmp_double=rCoord[0][i]; + rCoord[0][i]=sCoord[0][i]; + sCoord[0][i]=tmp_double; + } + + sCoord.registerTouch( hostMemorySpace ); + rCoord.registerTouch( hostMemorySpace ); + + std::cout << "sCoord :" << sCoord[0][0] <<" "<< sCoord[0][1] <<" "<< sCoord[0][2] << std::endl; + std::cout << "rCoord1 :" << rCoord[0][0] <<" "<< rCoord[0][1] <<" "<< rCoord[0][2] << std::endl; + std::cout << "rCoord2 :" << rCoord[1][0] <<" "<< rCoord[1][1] <<" "<< rCoord[1][2] << std::endl; + std::cout << "rCoord3 :" << rCoord[2][0] <<" "<< rCoord[2][1] <<" "<< rCoord[2][2] << std::endl; + std::cout << "rCoord4 :" << rCoord[3][0] <<" "<< rCoord[3][1] <<" "<< rCoord[3][2] << std::endl; + + //change timeSourceFrequency + std::cout << "timeSourceFrequency forward:" << *ptrTimeSourceFrequency << std::endl; + real32 newTimeFreq=2; + *ptrTimeSourceFrequency = newTimeFreq; + std::cout << "timeSourceFrequency backward:" << *ptrTimeSourceFrequency << std::endl; + + //reinit m_indexSeismoTrace + localIndex * ptrISeismo = &propagator->getReference< localIndex >( AcousticWaveEquationSEM::viewKeyStruct::indexSeismoTraceString() ); + *ptrISeismo = pReceivers.size( 0 )-1; + //reinit m_forward + localIndex * ptrForward = &propagator->getReference< localIndex >( AcousticWaveEquationSEM::viewKeyStruct::forwardString() ); + *ptrForward = 0; + + //"propagator->reinit()" not enough because state field not reinit to zero + //propagator->reinit(); + state.getProblemManager().applyInitialConditions(); + + array2d< real32 > rhsBackward; + rhsBackward.resize( 51, 1 ); + + arrayView2d< localIndex > const sNodeIds_new2 = propagator->getReference< array2d< localIndex > >( AcousticWaveEquationSEM::viewKeyStruct::sourceNodeIdsString() ).toView(); + sNodeIds_new2.move( hostMemorySpace, false ); + std::cout << "sNodeIds[0][0] second get2:" << sNodeIds_new2[0][0] << std::endl; + ASSERT_TRUE( sNodeIds_new2[0][0] == sNodesIdsAfterModif ); + + /*---------------------------------------------------*/ + // run backward solver + for( int i = 50; i > 0; i-- ) + { + rhsBackward[i][0]=WaveSolverUtils::evaluateRicker( time_n, *ptrTimeSourceFrequency, *ptrTimeSourceDelay, *ptrRickerOrder ); + propagator->explicitStepBackward( time_n, dt, i, domain, false ); + time_n -= dt; + //check source node in backward loop + arrayView2d< localIndex > const sNodeIds_loop = propagator->getReference< array2d< localIndex > >( AcousticWaveEquationSEM::viewKeyStruct::sourceNodeIdsString() ).toView(); + sNodeIds_loop.move( hostMemorySpace, false ); + ASSERT_TRUE( sNodeIds_loop[0][0] == sNodesIdsAfterModif ); + } + + // move it to CPU, if needed + pReceivers.move( hostMemorySpace, false ); + + localIndex mForward2 = propagator->getReference< localIndex >( AcousticWaveEquationSEM::viewKeyStruct::forwardString() ); + std::cout << "m_forward second get:" << mForward2 << std::endl; + ASSERT_TRUE( mForward2 == 0 ); + + arrayView2d< localIndex > const sNodeIds_new3 = propagator->getReference< array2d< localIndex > >( AcousticWaveEquationSEM::viewKeyStruct::sourceNodeIdsString() ).toView(); + sNodeIds_new3.move( hostMemorySpace, false ); + std::cout << "sNodeIds[0][0] get3:" << sNodeIds_new3[0][0] << std::endl; + ASSERT_TRUE( sNodeIds_new3[0][0] == sNodesIdsAfterModif ); + + real32 const timeSourceFrequency_new = propagator->getReference< real32 >( AcousticWaveEquationSEM::viewKeyStruct::timeSourceFrequencyString() ); + ASSERT_TRUE( std::abs( timeSourceFrequency_new - newTimeFreq ) < 1.e-8 ); + + /*std::cout << "pReceiver size(0):" << pReceivers.size(0) << std::endl; + std::cout << "pReceiver size(1):" << pReceivers.size(1) << std::endl;*/ + + + /*----------Save receiver backward----------------------*/ + array2d< real32 > qBackward; + qBackward.resize( 51, 1 ); + + real32 sum_ufb=0.; + real32 sum_qff=0.; + real32 sum_u2=0.; + real32 sum_q2=0.; + real32 sum_ff2=0.; + real32 sum_fb2=0.; + + // fill backward field at receiver. + for( int i=50; i > 0; i-- ) + { + /*std::cout << "back time: " << i*dt << std::endl; + std::cout << "back pReceivers1 " << i << ":" << pReceivers[i][0] << std::endl; + std::cout << "back pReceivers2 " << i << ":" << pReceivers[i][1] << std::endl; + std::cout << "back pReceivers3 " << i << ":" << pReceivers[i][2] << std::endl; + std::cout << "back pReceivers4 " << i << ":" << pReceivers[i][3] << std::endl; + std::cout << "back rhsBackward " << i << ":" << rhsBackward[i][0] << std::endl;*/ + qBackward[i][0] = pReceivers[i][0]; + } + + //check transitivity with sum + for( int i=0; i<51; i++ ) + { + sum_ufb += uForward[i][0]*rhsBackward[i][0]; + sum_qff += qBackward[i][0]*rhsForward[i][0]; + + sum_u2 += uForward[i][0]*uForward[i][0]; + sum_q2 += qBackward[i][0]*qBackward[i][0]; + sum_ff2 += rhsForward[i][0]*rhsForward[i][0]; + sum_fb2 += rhsBackward[i][0]*rhsBackward[i][0]; + /*std::cout << "sum evol sum_ufb:" << sum_ufb << " / sum_qff:" << sum_qff << std::endl; + std::cout << "uForward:" << uForward[i][0] << " / qBackward:" << qBackward[i][0] << std::endl; + std::cout << "ufb:" << uForward[i][0]*rhsBackward[i][0] << " / qff:" << qBackward[i][0]*rhsForward[i][0] << std::endl;*/ + } + + // check scalar products and are non null + ASSERT_TRUE( sum_ufb > 1.e-8 ); + ASSERT_TRUE( sum_qff > 1.e-8 ); + + // check || - ||/max(||f||.||q||,||f'||.||u||) < 10^1or2 x epsilon_machine with f rhs direct and f' rhs backward + std::cout << ": " << sum_ufb << " / : " << sum_qff << std::endl; + std::cout << "|| - ||=" << std::abs( sum_ufb-sum_qff ) << " / ||f||.||q||=" << std::sqrt( sum_q2*sum_ff2 ); + std::cout << " / ||f'||.||u||=" << std::sqrt( sum_fb2*sum_u2 ) << " / ||f||.||f'||=" << std::sqrt( sum_ff2*sum_fb2 ) << std::endl; + real32 diffToCheck; + diffToCheck=std::abs( sum_ufb-sum_qff ) / std::max( std::sqrt( sum_fb2*sum_u2 ), std::sqrt( sum_q2*sum_ff2 )); + std::cout << " Diff to compare with 2.e-4: " << diffToCheck << std::endl; + ASSERT_TRUE( diffToCheck < 2.e-4 ); +} + +int main( int argc, char * * argv ) +{ + ::testing::InitGoogleTest( &argc, argv ); + g_commandLineOptions = *geos::basicSetup( argc, argv ); + int const result = RUN_ALL_TESTS(); + geos::basicCleanup(); + return result; +} From be0eb0e2e92d933f0f976a2c341d0ab4d9289ebf Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Fri, 6 Dec 2024 21:03:14 -0600 Subject: [PATCH 273/286] fix: make new gravity treatment from #3337 an option (#3467) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../fluidFlow/CompositionalMultiphaseBase.cpp | 8 + .../fluidFlow/CompositionalMultiphaseBase.hpp | 4 + .../fluidFlow/CompositionalMultiphaseFVM.cpp | 1 + .../kernels/compositional/C1PPUPhaseFlux.hpp | 3 +- .../kernels/compositional/CFLKernel.cpp | 102 +++++++------ .../kernels/compositional/CFLKernel.hpp | 18 ++- .../DissipationFluxComputeKernel.hpp | 1 + .../compositional/FluxComputeKernel.hpp | 9 +- .../compositional/FluxComputeKernelBase.hpp | 7 +- .../kernels/compositional/IHUPhaseFlux.hpp | 138 +++++++++++------- .../kernels/compositional/PPUPhaseFlux.hpp | 3 +- .../kernels/compositional/PotGrad.hpp | 111 ++++++++------ .../StabilizedFluxComputeKernel.hpp | 1 + .../ThermalFluxComputeKernel.hpp | 3 +- 16 files changed, 259 insertions(+), 156 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 97f13dd9062..0ce10cbe33b 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3361-9139-2fc4131 + baseline: integratedTests/baseline_integratedTests-pr3467-9212-976cc3b allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index e5e337912cb..8f344877826 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3361 (2024-12-03) +===================== +Revert default gravity treatment to old version. Make the way introduced in #3337 optional. + PR #3361 (2024-12-03) ===================== Baseline diffs after reimplementation of wave equation acoustic gradient for velocity and density parameters: new field "partialGradient2" and "pressureForward" field replacing "pressureDoubleDerivative". diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 9c7d0108c7b..9eb10dbab90 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -78,6 +78,7 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, m_allowCompDensChopping( 1 ), m_useTotalMassEquation( 1 ), m_useSimpleAccumulation( 1 ), + m_useNewGravity( 0 ), m_minCompDens( isothermalCompositionalMultiphaseBaseKernels::minDensForDivision ) { //START_SPHINX_INCLUDE_00 @@ -164,6 +165,12 @@ CompositionalMultiphaseBase::CompositionalMultiphaseBase( const string & name, setApplyDefaultValue( 1 ). setDescription( "Flag indicating whether simple accumulation form is used" ); + this->registerWrapper( viewKeyStruct::useNewGravityString(), &m_useNewGravity ). + setSizedFromParent( 0 ). + setInputFlag( InputFlags::OPTIONAL ). + setApplyDefaultValue( 0 ). + setDescription( "Flag indicating whether new gravity treatment is used" ); + this->registerWrapper( viewKeyStruct::minCompDensString(), &m_minCompDens ). setSizedFromParent( 0 ). setInputFlag( InputFlags::OPTIONAL ). @@ -2245,6 +2252,7 @@ void CompositionalMultiphaseBase::computeCFLNumbers( geos::DomainPartition & dom isothermalCompositionalMultiphaseBaseKernels::KernelLaunchSelector1 < isothermalCompositionalMultiphaseFVMKernels::CFLFluxKernel >( numComps, numPhases, + m_useNewGravity, dt, stencilWrapper, compFlowAccessors.get( fields::flow::pressure{} ), diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index 278d8d6b453..1e657613848 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -268,6 +268,7 @@ class CompositionalMultiphaseBase : public FlowSolverBase static constexpr char const * allowLocalCompDensChoppingString() { return "allowLocalCompDensityChopping"; } static constexpr char const * useTotalMassEquationString() { return "useTotalMassEquation"; } static constexpr char const * useSimpleAccumulationString() { return "useSimpleAccumulation"; } + static constexpr char const * useNewGravityString() { return "useNewGravity"; } static constexpr char const * minCompDensString() { return "minCompDens"; } static constexpr char const * maxSequentialCompDensChangeString() { return "maxSequentialCompDensChange"; } static constexpr char const * minScalingFactorString() { return "minScalingFactor"; } @@ -486,6 +487,9 @@ class CompositionalMultiphaseBase : public FlowSolverBase /// flag indicating whether simple accumulation form is used integer m_useSimpleAccumulation; + /// flag indicating whether new gravity treatment is used + integer m_useNewGravity; + /// minimum allowed global component density real64 m_minCompDens; diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 2e99cfe6f48..8eec4acbef0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -231,6 +231,7 @@ void CompositionalMultiphaseFVM::assembleFluxTerms( real64 const dt, elemDofKey, m_hasCapPressure, m_useTotalMassEquation, + m_useNewGravity, fluxApprox.upwindingParams(), getName(), mesh.getElemManager(), diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp index a254aa9f97d..07e5d54df99 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp @@ -79,6 +79,7 @@ struct C1PPUPhaseFlux compute( integer const numPhase, integer const ip, integer const hasCapPressure, + integer const useNewGravity, localIndex const ( &seri )[numFluxSupportPoints], localIndex const ( &sesri )[numFluxSupportPoints], localIndex const ( &sei )[numFluxSupportPoints], @@ -110,7 +111,7 @@ struct C1PPUPhaseFlux real64 dPresGrad_dC[numFluxSupportPoints][numComp]{}; real64 dGravHead_dP[numFluxSupportPoints]{}; real64 dGravHead_dC[numFluxSupportPoints][numComp]{}; - PotGrad::compute< numComp, numFluxSupportPoints >( numPhase, ip, hasCapPressure, seri, sesri, sei, trans, dTrans_dPres, pres, + PotGrad::compute< numComp, numFluxSupportPoints >( numPhase, ip, hasCapPressure, useNewGravity, seri, sesri, sei, trans, dTrans_dPres, pres, gravCoef, phaseVolFrac, dPhaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, potGrad, dPresGrad_dP, dPresGrad_dC, dGravHead_dP, dGravHead_dC ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.cpp index b416573af0b..e2f32348bcc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.cpp @@ -22,6 +22,7 @@ #include "finiteVolume/SurfaceElementStencil.hpp" #include "finiteVolume/EmbeddedSurfaceToCellStencil.hpp" #include "finiteVolume/FaceElementToCellStencil.hpp" +#include "CFLKernel.hpp" namespace geos { @@ -32,12 +33,13 @@ namespace isothermalCompositionalMultiphaseFVMKernels /******************************** CFLFluxKernel ********************************/ -template< integer NC, localIndex NUM_ELEMS, localIndex maxStencilSize > +template< integer NC > GEOS_HOST_DEVICE inline void CFLFluxKernel:: compute( integer const numPhases, + integer const useNewGravity, localIndex const stencilSize, real64 const dt, arraySlice1d< localIndex const > const seri, @@ -67,27 +69,7 @@ CFLFluxKernel:: real64 gravHead{}; // calculate quantities on primary connected cells - integer denom = 0; - for( localIndex i = 0; i < NUM_ELEMS; ++i ) - { - localIndex const er = seri[i]; - localIndex const esr = sesri[i]; - localIndex const ei = sei[i]; - - bool const phaseExists = (phaseVolFrac[er][esr][ei][ip] > 0); - if( !phaseExists ) - { - continue; - } - - // average density across the face - densMean += phaseMassDens[er][esr][ei][0][ip]; - denom++; - } - if( denom > 1 ) - { - densMean /= denom; - } + calculateMeanDensity( useNewGravity, ip, stencilSize, seri, sesri, sei, phaseVolFrac, phaseMassDens, densMean ); //***** calculation of phase volumetric flux ***** @@ -138,10 +120,43 @@ CFLFluxKernel:: } } -template< integer NC, typename STENCILWRAPPER_TYPE > +GEOS_HOST_DEVICE +inline void -CFLFluxKernel:: +CFLFluxKernel::calculateMeanDensity( integer const useNewGravity, integer const ip, localIndex const stencilSize, + arraySlice1d< localIndex const > const seri, + arraySlice1d< localIndex const > const sesri, + arraySlice1d< localIndex const > const sei, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, + ElementViewConst< arrayView3d< real64 const, multifluid::USD_PHASE > > const & phaseMassDens, + real64 & densMean ) +{ + integer denom = 0; + for( localIndex i = 0; i < stencilSize; ++i ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + bool const phaseExists = (phaseVolFrac[er][esr][ei][ip] > 0); + if( useNewGravity && !phaseExists ) + { + continue; + } + + // average density across the face + densMean += phaseMassDens[er][esr][ei][0][ip]; + denom++; + } + if( denom > 1 ) + { + densMean /= denom; + } +} +template< integer NC, typename STENCILWRAPPER_TYPE > +void CFLFluxKernel:: launch( integer const numPhases, + integer const useNewGravity, real64 const dt, STENCILWRAPPER_TYPE const & stencilWrapper, ElementViewConst< arrayView1d< real64 const > > const & pres, @@ -161,9 +176,6 @@ CFLFluxKernel:: typename STENCILWRAPPER_TYPE::IndexContainerViewConstType const & sesri = stencilWrapper.getElementSubRegionIndices(); typename STENCILWRAPPER_TYPE::IndexContainerViewConstType const & sei = stencilWrapper.getElementIndices(); - localIndex constexpr numElems = STENCILWRAPPER_TYPE::maxNumPointsInFlux; - localIndex constexpr maxStencilSize = STENCILWRAPPER_TYPE::maxStencilSize; - forAll< parallelDevicePolicy<> >( stencilWrapper.size(), [=] GEOS_HOST_DEVICE ( localIndex const iconn ) { // compute transmissibility @@ -176,23 +188,24 @@ CFLFluxKernel:: transmissibility, dTrans_dPres ); - CFLFluxKernel::compute< NC, numElems, maxStencilSize >( numPhases, - sei[iconn].size(), - dt, - seri[iconn], - sesri[iconn], - sei[iconn], - transmissibility[0], - pres, - gravCoef, - phaseVolFrac, - phaseRelPerm, - phaseVisc, - phaseDens, - phaseMassDens, - phaseCompFrac, - phaseOutflux, - compOutflux ); + CFLFluxKernel::compute< NC >( numPhases, + useNewGravity, + sei[iconn].size(), + dt, + seri[iconn], + sesri[iconn], + sei[iconn], + transmissibility[0], + pres, + gravCoef, + phaseVolFrac, + phaseRelPerm, + phaseVisc, + phaseDens, + phaseMassDens, + phaseCompFrac, + phaseOutflux, + compOutflux ); } ); } @@ -200,6 +213,7 @@ CFLFluxKernel:: template \ void CFLFluxKernel:: \ launch< NC, STENCILWRAPPER_TYPE >( integer const numPhases, \ + integer const useNewGravity, \ real64 const dt, \ STENCILWRAPPER_TYPE const & stencil, \ ElementViewConst< arrayView1d< real64 const > > const & pres, \ diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp index 8449d57e43e..a2242e202fb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp @@ -23,6 +23,7 @@ #include "common/DataLayouts.hpp" #include "common/DataTypes.hpp" #include "common/GEOS_RAJA_Interface.hpp" +#include "constitutive/fluid/multifluid/Layouts.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/fluid/multifluid/MultiFluidFields.hpp" #include "constitutive/permeability/PermeabilityBase.hpp" @@ -83,11 +84,10 @@ struct CFLFluxKernel using RelPermAccessors = StencilMaterialAccessors< constitutive::RelativePermeabilityBase, fields::relperm::phaseRelPerm >; - template< integer NC, localIndex NUM_ELEMS, localIndex maxStencilSize > - GEOS_HOST_DEVICE - inline - static void + template< integer NC > + GEOS_HOST_DEVICE inline static void compute( integer const numPhases, + integer const useNewGravity, localIndex const stencilSize, real64 const dt, arraySlice1d< localIndex const > const seri, @@ -105,9 +105,19 @@ struct CFLFluxKernel ElementView< arrayView2d< real64, compflow::USD_PHASE > > const & phaseOutflux, ElementView< arrayView2d< real64, compflow::USD_COMP > > const & compOutflux ); + GEOS_HOST_DEVICE inline static void + calculateMeanDensity( integer const useNewGravity, integer const ip, localIndex const stencilSize, + arraySlice1d< localIndex const > const seri, + arraySlice1d< localIndex const > const sesri, + arraySlice1d< localIndex const > const sei, + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + real64 & densMean ); + template< integer NC, typename STENCILWRAPPER_TYPE > static void launch( integer const numPhases, + integer const useNewGravity, real64 const dt, STENCILWRAPPER_TYPE const & stencil, ElementViewConst< arrayView1d< real64 const > > const & pres, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp index 1b4183c8c1a..62df1c74088 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp @@ -185,6 +185,7 @@ class FluxComputeKernel : public isothermalCompositionalMultiphaseFVMKernels::Fl // // We use the lambda below (called **inside** the phase loop of the base computeFlux) to compute dissipation terms Base::computeFlux( iconn, stack, [&] ( integer const ip, + integer const GEOS_UNUSED_PARAM( useNewGravity ), localIndex const (&k)[2], localIndex const (&seri)[2], localIndex const (&sesri)[2], diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp index d28ecf41b41..acd5c371d7f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp @@ -277,6 +277,7 @@ class FluxComputeKernel : public FluxComputeKernelBase ( m_numPhases, ip, m_kernelFlags.isSet( KernelFlags::CapPressure ), + m_kernelFlags.isSet( KernelFlags::NewGravity ), seri, sesri, sei, trans, dTrans_dPres, @@ -303,6 +304,7 @@ class FluxComputeKernel : public FluxComputeKernelBase ( m_numPhases, ip, m_kernelFlags.isSet( KernelFlags::CapPressure ), + m_kernelFlags.isSet( KernelFlags::NewGravity ), seri, sesri, sei, trans, dTrans_dPres, @@ -329,6 +331,7 @@ class FluxComputeKernel : public FluxComputeKernelBase ( m_numPhases, ip, m_kernelFlags.isSet( KernelFlags::CapPressure ), + m_kernelFlags.isSet( KernelFlags::NewGravity ), seri, sesri, sei, trans, dTrans_dPres, @@ -352,7 +355,8 @@ class FluxComputeKernel : public FluxComputeKernelBase // call the lambda in the phase loop to allow the reuse of the phase fluxes and their derivatives // possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase - compFluxKernelOp( ip, k, seri, sesri, sei, connectionIndex, + compFluxKernelOp( ip, m_kernelFlags.isSet( KernelFlags::NewGravity ), + k, seri, sesri, sei, connectionIndex, k_up, seri[k_up], sesri[k_up], sei[k_up], potGrad, phaseFlux, dPhaseFlux_dP, dPhaseFlux_dC ); @@ -525,6 +529,7 @@ class FluxComputeKernelFactory string const & dofKey, integer const hasCapPressure, integer const useTotalMassEquation, + integer const useNewGravity, UpwindingParameters upwindingParams, string const & solverName, ElementRegionManager const & elemManager, @@ -547,6 +552,8 @@ class FluxComputeKernelFactory kernelFlags.set( KernelFlags::CapPressure ); if( useTotalMassEquation ) kernelFlags.set( KernelFlags::TotalMassEquation ); + if( useNewGravity ) + kernelFlags.set( KernelFlags::NewGravity ); if( upwindingParams.upwindingScheme == UpwindingScheme::C1PPU && isothermalCompositionalMultiphaseFVMKernelUtilities::epsC1PPU > 0 ) kernelFlags.set( KernelFlags::C1PPU ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp index f36124d6ed6..340d5c7f5f8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp @@ -47,12 +47,13 @@ enum class KernelFlags CapPressure = 1 << 0, // 1 /// Flag indicating whether total mass equation is formed or not TotalMassEquation = 1 << 1, // 2 + /// Flag indicating whether new gravity treatment is used or not + NewGravity = 1 << 2, // 4 /// Flag indicating whether C1-PPU is used or not - C1PPU = 1 << 2, // 4 + C1PPU = 1 << 3, // 8 /// Flag indicating whether IHU is used or not - IHU = 1 << 3 // 8 + IHU = 1 << 4 // 16 /// Add more flags like that if needed: - // Flag5 = 1 << 4, // 16 // Flag6 = 1 << 5, // 32 // Flag7 = 1 << 6, // 64 // Flag8 = 1 << 7 //128 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp index ec9b3c55783..bce2f8cd261 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp @@ -65,7 +65,7 @@ upwindMobilityViscous( localIndex const numPhase, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const capPressureFlag, + integer const hasCapPressure, localIndex & upwindDir, real64 & mobility, real64( &dMobility_dP), @@ -99,7 +99,7 @@ upwindMobilityViscous( localIndex const numPhase, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, upwindDir ); localIndex const er_up = seri[upwindDir]; @@ -139,7 +139,8 @@ upwindMobilityGravity( localIndex const numPhase, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const capPressureFlag, + integer const hasCapPressure, + integer const useNewGravity, localIndex & upwindDir, real64 & mobility, real64( &dMobility_dP), @@ -174,7 +175,8 @@ upwindMobilityGravity( localIndex const numPhase, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, + useNewGravity, upwindDir ); localIndex const er_up = seri[upwindDir]; @@ -213,7 +215,7 @@ upwindMobilityCapillary( localIndex const numPhase, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const capPressureFlag, + integer const hasCapPressure, localIndex & upwindDir, real64 & mobility, real64( &dMobility_dP), @@ -247,7 +249,7 @@ upwindMobilityCapillary( localIndex const numPhase, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, upwindDir ); localIndex const er_up = seri[upwindDir]; @@ -290,7 +292,7 @@ computeFractionalFlowViscous( localIndex const numPhase, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const capPressureFlag, + integer const hasCapPressure, localIndex & k_up_main, real64 & fractionalFlow, real64 ( & dFractionalFlow_dP)[numFluxSupportPoints], @@ -341,7 +343,7 @@ computeFractionalFlowViscous( localIndex const numPhase, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, k_up, mob, dMob_dP, @@ -405,7 +407,8 @@ computeFractionalFlowGravity( localIndex const numPhase, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const capPressureFlag, + integer const hasCapPressure, + integer const useNewGravity, localIndex & k_up_main, real64 & fractionalFlow, real64 ( & dFractionalFlow_dP)[numFluxSupportPoints], @@ -455,7 +458,8 @@ computeFractionalFlowGravity( localIndex const numPhase, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, + useNewGravity, k_up, mob, dMob_dP, @@ -517,7 +521,7 @@ computeFractionalFlowCapillary( localIndex const numPhase, ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const capPressureFlag, + integer const hasCapPressure, localIndex & k_up_main, real64 & fractionalFlow, real64 ( & dFractionalFlow_dP)[numFluxSupportPoints], @@ -565,7 +569,7 @@ computeFractionalFlowCapillary( localIndex const numPhase, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, k_up, mob, dMob_dP, @@ -658,6 +662,7 @@ struct computePotentialGravity GEOS_HOST_DEVICE static void compute( localIndex const GEOS_UNUSED_PARAM( numPhase ), localIndex const ip, + integer const useNewGravity, localIndex const (&seri)[numFluxSupportPoints], localIndex const (&sesri)[numFluxSupportPoints], localIndex const (&sei)[numFluxSupportPoints], @@ -697,7 +702,46 @@ struct computePotentialGravity } } - //inner loop to get average density + calculateMeanDensity( useNewGravity, ip, seri, sesri, sei, phaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, dProp_dComp, + densMean, dDensMean_dPres, dDensMean_dComp ); + + // compute potential difference MPFA-style + for( localIndex i = 0; i < numFluxSupportPoints; ++i ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + real64 const gravD = transmissibility[i] * gravCoef[er][esr][ei]; + real64 const dGravD_dP = dTrans_dPres[i] * gravCoef[er][esr][ei]; + pot += densMean * gravD; + + // need to add contributions from both cells the mean density depends on + for( localIndex j = 0; j < numFluxSupportPoints; ++j ) + { + dPot_dPres[j] += dDensMean_dPres[j] * gravD + densMean * dGravD_dP; + for( localIndex jc = 0; jc < numComp; ++jc ) + { + dPot_dComp[j][jc] += dDensMean_dComp[j][jc] * gravD; + } + } + } + } + + template< localIndex numComp, localIndex numFluxSupportPoints > + GEOS_HOST_DEVICE + static void calculateMeanDensity( integer const useNewGravity, + localIndex const ip, + localIndex const (&seri)[numFluxSupportPoints], + localIndex const (&sesri)[numFluxSupportPoints], + localIndex const (&sei)[numFluxSupportPoints], + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + real64 (& dProp_dComp)[numComp], + real64 & densMean, real64 (& dDensMean_dPres)[numFluxSupportPoints], real64 (& dDensMean_dComp)[numFluxSupportPoints][numComp] ) + { integer denom = 0; for( localIndex i = 0; i < numFluxSupportPoints; ++i ) { @@ -706,7 +750,7 @@ struct computePotentialGravity localIndex const ei = sei[i]; bool const phaseExists = (phaseVolFrac[er][esr][ei][ip] > 0); - if( !phaseExists ) + if( useNewGravity && !phaseExists ) { continue; } @@ -742,29 +786,6 @@ struct computePotentialGravity } } } - - // compute potential difference MPFA-style - for( localIndex i = 0; i < numFluxSupportPoints; ++i ) - { - localIndex const er = seri[i]; - localIndex const esr = sesri[i]; - localIndex const ei = sei[i]; - - real64 const gravD = transmissibility[i] * gravCoef[er][esr][ei]; - real64 const dGravD_dP = dTrans_dPres[i] * gravCoef[er][esr][ei]; - pot += densMean * gravD; - - // need to add contributions from both cells the mean density depends on - for( localIndex j = 0; j < numFluxSupportPoints; ++j ) - { - dPot_dPres[j] += dDensMean_dPres[j] * gravD + densMean * dGravD_dP; - for( localIndex jc = 0; jc < numComp; ++jc ) - { - dPot_dComp[j][jc] += dDensMean_dComp[j][jc] * gravD; - } - } - } - } }; @@ -856,7 +877,8 @@ static void computePotentialFluxesGravity( localIndex const numPhase, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - localIndex const capPressureFlag, + localIndex const hasCapPressure, + integer const useNewGravity, localIndex( &k_up), localIndex (&k_up_o), real64 & phaseFlux, @@ -876,6 +898,7 @@ static void computePotentialFluxesGravity( localIndex const numPhase, // UpwindHelpers::computePotentialGravity::compute< numComp, numFluxSupportPoints >( numPhase, ip, + useNewGravity, seri, sesri, sei, @@ -920,7 +943,8 @@ static void computePotentialFluxesGravity( localIndex const numPhase, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, + useNewGravity, k_up, fflow, dFflow_dP, @@ -940,6 +964,7 @@ static void computePotentialFluxesGravity( localIndex const numPhase, //Fetch pot for phase j!=i defined as \rho_j g dz/dx UpwindHelpers::computePotentialGravity::compute< numComp, numFluxSupportPoints >( numPhase, jp, + useNewGravity, seri, sesri, sei, @@ -986,7 +1011,8 @@ static void computePotentialFluxesGravity( localIndex const numPhase, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, + useNewGravity, k_up_o, mobOther, dMobOther_dP, @@ -1049,7 +1075,7 @@ static void computePotentialFluxesCapillary( localIndex const numPhase, ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - localIndex const capPressureFlag, + localIndex const hasCapPressure, localIndex( &k_up), localIndex (&k_up_o), real64 & phaseFlux, @@ -1110,7 +1136,7 @@ static void computePotentialFluxesCapillary( localIndex const numPhase, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, k_up, fflow, dFflow_dP, @@ -1174,7 +1200,7 @@ static void computePotentialFluxesCapillary( localIndex const numPhase, dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, k_up_o, mobOther, dMobOther_dP, @@ -1261,7 +1287,7 @@ class UpwindScheme ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const capPressureFlag, + integer const hasCapPressure, localIndex & upwindDir ) { @@ -1286,7 +1312,7 @@ class UpwindScheme dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, pot ); //all definition has been changed to fit pot>0 => first cell is upstream @@ -1314,7 +1340,8 @@ class UpwindScheme ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const capPressureFlag, + integer const hasCapPressure, + integer const useNewGravity, localIndex & upwindDir ) { @@ -1340,7 +1367,8 @@ class UpwindScheme dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, + useNewGravity, pot ); //all definition has been changed to fit pot>0 => first cell is upstream @@ -1368,7 +1396,7 @@ class UpwindScheme ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const capPressureFlag, + integer const hasCapPressure, localIndex & upwindDir ) { @@ -1393,7 +1421,7 @@ class UpwindScheme dPhaseVolFrac, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, - capPressureFlag, + hasCapPressure, pot ); //all definition has been changed to fit pot>0 => first cell is upstream @@ -1486,7 +1514,7 @@ class HybridUpwind : public UpwindScheme ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const GEOS_UNUSED_PARAM( capPressureFlag ), + integer const GEOS_UNUSED_PARAM( hasCapPressure ), real64 & potential ) { @@ -1538,7 +1566,8 @@ class HybridUpwind : public UpwindScheme ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const GEOS_UNUSED_PARAM( capPressureFlag ), + integer const GEOS_UNUSED_PARAM( hasCapPressure ), + integer const useNewGravity, real64 & potential ) { @@ -1558,6 +1587,7 @@ class HybridUpwind : public UpwindScheme UpwindHelpers::computePotentialGravity::compute< numComp, numFluxSupportPoints >( numPhase, ipp, + useNewGravity, seri, sesri, sei, @@ -1602,7 +1632,7 @@ class HybridUpwind : public UpwindScheme ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac, ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure, ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac, - integer const GEOS_UNUSED_PARAM( capPressureFlag ), + integer const GEOS_UNUSED_PARAM( hasCapPressure ), real64 & potential ) { @@ -1685,6 +1715,7 @@ struct IHUPhaseFlux compute( integer const numPhase, integer const ip, integer const hasCapPressure, + integer const useNewGravity, localIndex const ( &seri )[numFluxSupportPoints], localIndex const ( &sesri )[numFluxSupportPoints], localIndex const ( &sei )[numFluxSupportPoints], @@ -1732,7 +1763,7 @@ struct IHUPhaseFlux for( integer jp = 0; jp < numPhase; ++jp ) { - PPUPhaseFlux::compute( numPhase, jp, hasCapPressure, + PPUPhaseFlux::compute( numPhase, jp, hasCapPressure, useNewGravity, seri, sesri, sei, trans, dTrans_dPres, pres, gravCoef, @@ -1886,6 +1917,7 @@ struct IHUPhaseFlux phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, hasCapPressure, + useNewGravity, k_up_g, k_up_og, gravitationalPhaseFlux, diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp index c8ac5256d98..58ba51a9f94 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp @@ -75,6 +75,7 @@ struct PPUPhaseFlux compute( integer const numPhase, integer const ip, integer const hasCapPressure, + integer const useNewGravity, localIndex const ( &seri )[numFluxSupportPoints], localIndex const ( &sesri )[numFluxSupportPoints], localIndex const ( &sei )[numFluxSupportPoints], @@ -106,7 +107,7 @@ struct PPUPhaseFlux real64 dPresGrad_dC[numFluxSupportPoints][numComp]{}; real64 dGravHead_dP[numFluxSupportPoints]{}; real64 dGravHead_dC[numFluxSupportPoints][numComp]{}; - PotGrad::compute< numComp, numFluxSupportPoints >( numPhase, ip, hasCapPressure, seri, sesri, sei, trans, dTrans_dPres, pres, + PotGrad::compute< numComp, numFluxSupportPoints >( numPhase, ip, hasCapPressure, useNewGravity, seri, sesri, sei, trans, dTrans_dPres, pres, gravCoef, phaseVolFrac, dPhaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac, potGrad, dPresGrad_dP, dPresGrad_dC, dGravHead_dP, dGravHead_dC ); diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp index 14f702792db..138175d5c89 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp @@ -46,6 +46,7 @@ struct PotGrad compute ( integer const numPhase, integer const ip, integer const hasCapPressure, + integer const useNewGravity, localIndex const ( &seri )[numFluxSupportPoints], localIndex const ( &sesri )[numFluxSupportPoints], localIndex const ( &sei )[numFluxSupportPoints], @@ -87,53 +88,7 @@ struct PotGrad real64 gravHead = 0.0; real64 dCapPressure_dC[numComp]{}; - real64 dProp_dC[numComp]{}; - - // calculate quantities on primary connected cells - integer denom = 0; - for( integer i = 0; i < numFluxSupportPoints; ++i ) - { - localIndex const er = seri[i]; - localIndex const esr = sesri[i]; - localIndex const ei = sei[i]; - - bool const phaseExists = (phaseVolFrac[er][esr][ei][ip] > 0); - if( !phaseExists ) - { - continue; - } - - // density - real64 const density = phaseMassDens[er][esr][ei][0][ip]; - real64 const dDens_dP = dPhaseMassDens[er][esr][ei][0][ip][Deriv::dP]; - - applyChainRule( numComp, - dCompFrac_dCompDens[er][esr][ei], - dPhaseMassDens[er][esr][ei][0][ip], - dProp_dC, - Deriv::dC ); - - // average density and derivatives - densMean += density; - dDensMean_dP[i] = dDens_dP; - for( integer jc = 0; jc < numComp; ++jc ) - { - dDensMean_dC[i][jc] = dProp_dC[jc]; - } - denom++; - } - if( denom > 1 ) - { - densMean /= denom; - for( integer i = 0; i < numFluxSupportPoints; ++i ) - { - dDensMean_dP[i] /= denom; - for( integer jc = 0; jc < numComp; ++jc ) - { - dDensMean_dC[i][jc] /= denom; - } - } - } + calculateMeanDensity( useNewGravity, ip, seri, sesri, sei, phaseVolFrac, dCompFrac_dCompDens, phaseMassDens, dPhaseMassDens, densMean, dDensMean_dP, dDensMean_dC ); /// compute the TPFA potential difference for( integer i = 0; i < numFluxSupportPoints; i++ ) @@ -199,6 +154,68 @@ struct PotGrad } + template< integer numComp, integer numFluxSupportPoints > + GEOS_HOST_DEVICE + static void + calculateMeanDensity( integer const useNewGravity, + integer const ip, + localIndex const ( &seri )[numFluxSupportPoints], + localIndex const ( &sesri )[numFluxSupportPoints], + localIndex const ( &sei )[numFluxSupportPoints], + ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac, + ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens, + ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens, + ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens, + real64 & densMean, real64 ( & dDensMean_dP)[numFluxSupportPoints], real64 ( & dDensMean_dC )[numFluxSupportPoints][numComp] ) + { + real64 dDens_dC[numComp]{}; + + integer denom = 0; + for( integer i = 0; i < numFluxSupportPoints; ++i ) + { + localIndex const er = seri[i]; + localIndex const esr = sesri[i]; + localIndex const ei = sei[i]; + + bool const phaseExists = (phaseVolFrac[er][esr][ei][ip] > 0); + if( useNewGravity && !phaseExists ) + { + continue; + } + + // density + real64 const density = phaseMassDens[er][esr][ei][0][ip]; + real64 const dDens_dP = dPhaseMassDens[er][esr][ei][0][ip][Deriv::dP]; + + applyChainRule( numComp, + dCompFrac_dCompDens[er][esr][ei], + dPhaseMassDens[er][esr][ei][0][ip], + dDens_dC, + Deriv::dC ); + + // average density and derivatives + densMean += density; + dDensMean_dP[i] = dDens_dP; + for( integer jc = 0; jc < numComp; ++jc ) + { + dDensMean_dC[i][jc] = dDens_dC[jc]; + } + denom++; + } + if( denom > 1 ) + { + densMean /= denom; + for( integer i = 0; i < numFluxSupportPoints; ++i ) + { + dDensMean_dP[i] /= denom; + for( integer jc = 0; jc < numComp; ++jc ) + { + dDensMean_dC[i][jc] /= denom; + } + } + } + } + }; } // namespace isothermalCompositionalMultiPhaseFVMKernelUtilities diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp index de9e92c8b80..71801e9ee59 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp @@ -193,6 +193,7 @@ class FluxComputeKernel : public isothermalCompositionalMultiphaseFVMKernels::Fl // // We use the lambda below (called **inside** the phase loop of the base computeFlux) to compute stabilization terms Base::computeFlux( iconn, stack, [&] ( integer const ip, + integer const GEOS_UNUSED_PARAM( useNewGravity ), localIndex const (&k)[2], localIndex const (&seri)[2], localIndex const (&sesri)[2], diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp index 17395f62324..8d7190cc70b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp @@ -197,6 +197,7 @@ class FluxComputeKernel : public isothermalCompositionalMultiphaseFVMKernels::Fl // such as potGrad, phaseFlux, and the indices of the upwind cell // We use the lambda below (called **inside** the phase loop of the base computeFlux) to access these variables Base::computeFlux( iconn, stack, [&] ( integer const ip, + integer const useNewGravity, localIndex const (&k)[2], localIndex const (&seri)[2], localIndex const (&sesri)[2], @@ -234,7 +235,7 @@ class FluxComputeKernel : public isothermalCompositionalMultiphaseFVMKernels::Fl localIndex const ei = sei[i]; bool const phaseExists = (m_phaseVolFrac[er_up][esr_up][ei_up][ip] > 0); - if( !phaseExists ) + if( useNewGravity && !phaseExists ) { continue; } From eef8de43ccee83c4dfac15b313a4c783ee69199f Mon Sep 17 00:00:00 2001 From: "Victor A. P. Magri" <50467563+victorapm@users.noreply.github.com> Date: Sat, 7 Dec 2024 07:57:15 -0800 Subject: [PATCH 274/286] feat: IO timers (#3480) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../fileIO/Outputs/BlueprintOutput.cpp | 84 +++++++++++-------- .../fileIO/Outputs/BlueprintOutput.hpp | 6 ++ .../fileIO/Outputs/ChomboIO.cpp | 14 ++++ .../fileIO/Outputs/ChomboIO.hpp | 6 ++ .../fileIO/Outputs/OutputBase.cpp | 21 +++++ .../fileIO/Outputs/OutputBase.hpp | 57 ++++++++++++- .../fileIO/Outputs/PythonOutput.cpp | 14 ++++ .../fileIO/Outputs/PythonOutput.hpp | 3 + .../fileIO/Outputs/RestartOutput.cpp | 29 +++++-- .../fileIO/Outputs/RestartOutput.hpp | 6 ++ .../fileIO/Outputs/SiloOutput.cpp | 68 +++++++++------ .../fileIO/Outputs/SiloOutput.hpp | 6 ++ .../fileIO/Outputs/TimeHistoryOutput.cpp | 28 ++++++- .../fileIO/Outputs/TimeHistoryOutput.hpp | 6 ++ .../fileIO/Outputs/VTKOutput.cpp | 38 +++++++-- .../fileIO/Outputs/VTKOutput.hpp | 9 ++ 18 files changed, 319 insertions(+), 82 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 0ce10cbe33b..3aa31a7e4cb 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3467-9212-976cc3b + baseline: integratedTests/baseline_integratedTests-pr3480-9217-caaecb8 allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 8f344877826..acbeb39e382 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3480 (2024-12-06) +===================== +Add "logLevel" parameter under /Problem/Outputs in baseline files + PR #3361 (2024-12-03) ===================== Revert default gravity treatment to old version. Make the way introduced in #3337 optional. diff --git a/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp b/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp index 21457e7796e..cad26fcbb54 100644 --- a/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp @@ -129,53 +129,57 @@ BlueprintOutput::BlueprintOutput( string const & name, } /////////////////////////////////////////////////////////////////////////////////////////////////// -bool BlueprintOutput::execute( real64 const time, - real64 const, - integer const cycle, - integer const, - real64 const, +bool BlueprintOutput::execute( real64 const time_n, + real64 const GEOS_UNUSED_PARAM( dt ), + integer const cycleNumber, + integer const GEOS_UNUSED_PARAM( eventCounter ), + real64 const GEOS_UNUSED_PARAM( eventProgress ), DomainPartition & domain ) { GEOS_MARK_FUNCTION; - MeshLevel const & meshLevel = domain.getMeshBody( 0 ).getBaseDiscretization(); + { + Timer timer( m_outputTimer ); - conduit::Node meshRoot; - conduit::Node & mesh = meshRoot[ "mesh" ]; - conduit::Node & coordset = mesh[ "coordsets/nodes" ]; - conduit::Node & topologies = mesh[ "topologies" ]; + MeshLevel const & meshLevel = domain.getMeshBody( 0 ).getBaseDiscretization(); - mesh[ "state/time" ] = time; - mesh[ "state/cycle" ] = cycle; + conduit::Node meshRoot; + conduit::Node & mesh = meshRoot[ "mesh" ]; + conduit::Node & coordset = mesh[ "coordsets/nodes" ]; + conduit::Node & topologies = mesh[ "topologies" ]; - addNodalData( meshLevel.getNodeManager(), coordset, topologies, mesh[ "fields" ] ); + mesh[ "state/time" ] = time_n; + mesh[ "state/cycle" ] = cycleNumber; - dataRepository::Group averagedElementData( "averagedElementData", this ); - addElementData( meshLevel.getElemManager(), coordset, topologies, mesh[ "fields" ], averagedElementData ); + addNodalData( meshLevel.getNodeManager(), coordset, topologies, mesh[ "fields" ] ); - /// The Blueprint will complain if the fields node is present but empty. - if( mesh[ "fields" ].number_of_children() == 0 ) - { - mesh.remove( "fields" ); - } + dataRepository::Group averagedElementData( "averagedElementData", this ); + addElementData( meshLevel.getElemManager(), coordset, topologies, mesh[ "fields" ], averagedElementData ); + + /// The Blueprint will complain if the fields node is present but empty. + if( mesh[ "fields" ].number_of_children() == 0 ) + { + mesh.remove( "fields" ); + } - /// Verify that the mesh conforms to the Blueprint. - conduit::Node info; - GEOS_ASSERT_MSG( conduit::blueprint::verify( "mesh", meshRoot, info ), info.to_json() ); + /// Verify that the mesh conforms to the Blueprint. + conduit::Node info; + GEOS_ASSERT_MSG( conduit::blueprint::verify( "mesh", meshRoot, info ), info.to_json() ); - /// Generate the Blueprint index. - conduit::Node fileRoot; - conduit::Node & index = fileRoot[ "blueprint_index/mesh" ]; - conduit::blueprint::mesh::generate_index( mesh, "mesh", MpiWrapper::commSize(), index ); + /// Generate the Blueprint index. + conduit::Node fileRoot; + conduit::Node & index = fileRoot[ "blueprint_index/mesh" ]; + conduit::blueprint::mesh::generate_index( mesh, "mesh", MpiWrapper::commSize(), index ); - /// Verify that the index conforms to the Blueprint. - info.reset(); - GEOS_ASSERT_MSG( conduit::blueprint::mesh::index::verify( index, info ), info.to_json() ); + /// Verify that the index conforms to the Blueprint. + info.reset(); + GEOS_ASSERT_MSG( conduit::blueprint::mesh::index::verify( index, info ), info.to_json() ); - /// Write out the root index file, then write out the mesh. - string const completePath = GEOS_FMT( "{}/blueprintFiles/cycle_{:07}", OutputBase::getOutputDirectory(), cycle ); - string const filePathForRank = dataRepository::writeRootFile( fileRoot, completePath ); - conduit::relay::io::save( meshRoot, filePathForRank, "hdf5" ); + /// Write out the root index file, then write out the mesh. + string const completePath = GEOS_FMT( "{}/blueprintFiles/cycle_{:07}", OutputBase::getOutputDirectory(), cycleNumber ); + string const filePathForRank = dataRepository::writeRootFile( fileRoot, completePath ); + conduit::relay::io::save( meshRoot, filePathForRank, "hdf5" ); + } return false; } @@ -307,7 +311,19 @@ void BlueprintOutput::writeOutConstitutiveData( dataRepository::Group const & co } ); } +namespace logInfo +{ +struct BlueprintOutputTimer : public OutputTimerBase +{ + std::string_view getDescription() const override { return "Blueprint output timing"; } +}; +} +logInfo::OutputTimerBase const & BlueprintOutput::getTimerCategory() const +{ + static logInfo::BlueprintOutputTimer timer; + return timer; +} REGISTER_CATALOG_ENTRY( OutputBase, BlueprintOutput, string const &, dataRepository::Group * const ) diff --git a/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp b/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp index 7d17570d47d..fd963698c3c 100644 --- a/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp @@ -36,6 +36,12 @@ class ElementRegionManager; */ class BlueprintOutput : public OutputBase { +protected: + /** + * @copydoc OutputBase::getTimerCategory + */ + logInfo::OutputTimerBase const & getTimerCategory() const override; + public: /** diff --git a/src/coreComponents/fileIO/Outputs/ChomboIO.cpp b/src/coreComponents/fileIO/Outputs/ChomboIO.cpp index 674f1e4eace..26f73a9eb43 100644 --- a/src/coreComponents/fileIO/Outputs/ChomboIO.cpp +++ b/src/coreComponents/fileIO/Outputs/ChomboIO.cpp @@ -30,6 +30,20 @@ namespace geos using namespace dataRepository; +namespace logInfo +{ +struct ChomboOutputTimer : public OutputTimerBase +{ + std::string_view getDescription() const override { return "Chombo output timing"; } +}; +} + +logInfo::OutputTimerBase const & ChomboIO::getTimerCategory() const +{ + static logInfo::ChomboOutputTimer timer; + return timer; +} + ChomboIO::ChomboIO( string const & name, Group * const parent ): OutputBase( name, parent ), m_coupler( nullptr ), diff --git a/src/coreComponents/fileIO/Outputs/ChomboIO.hpp b/src/coreComponents/fileIO/Outputs/ChomboIO.hpp index c483f066968..c9e60cf2f79 100644 --- a/src/coreComponents/fileIO/Outputs/ChomboIO.hpp +++ b/src/coreComponents/fileIO/Outputs/ChomboIO.hpp @@ -89,6 +89,12 @@ class ChomboIO final : public OutputBase } viewKeys; /// @endcond +protected: + /** + * @copydoc OutputBase::getTimerCategory + */ + logInfo::OutputTimerBase const & getTimerCategory() const override; + private: ChomboCoupler * m_coupler; string m_outputPath; diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.cpp b/src/coreComponents/fileIO/Outputs/OutputBase.cpp index 0733dd38cc5..54dcab668e6 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.cpp @@ -29,6 +29,7 @@ using namespace dataRepository; OutputBase::OutputBase( string const & name, Group * const parent ): ExecutableGroup( name, parent ), + m_outputTimer(), m_childDirectory(), m_parallelThreads( 1 ) { @@ -43,6 +44,8 @@ OutputBase::OutputBase( string const & name, setInputFlag( InputFlags::OPTIONAL ). setDescription( "Number of plot files." ); + // Add the Timers log level + addLogLevel< logInfo::OutputTimers >(); } OutputBase::~OutputBase() @@ -106,5 +109,23 @@ void OutputBase::setupDirectoryStructure() } } +void OutputBase::cleanup( real64 const GEOS_UNUSED_PARAM( time_n ), + integer const GEOS_UNUSED_PARAM( cycleNumber ), + integer const GEOS_UNUSED_PARAM( eventCounter ), + real64 const GEOS_UNUSED_PARAM( eventProgress ), + DomainPartition & GEOS_UNUSED_PARAM( domain ) ) +{ + // Report timing statistics + real64 const time = std::chrono::duration< double >( m_outputTimer ).count(); + real64 const minTime = MpiWrapper::min( time ); + real64 const maxTime = MpiWrapper::max( time ); + if( maxTime > 0 ) + { + GEOS_LOG_LEVEL_INFO_RANK_0( logInfo::OutputTimers, + GEOS_FMT( "{}: file writing time = {} s (min), {} s (max)", + getName(), minTime, maxTime ) ); + } +} + } /* namespace geos */ diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.hpp b/src/coreComponents/fileIO/Outputs/OutputBase.hpp index f4129433f7d..ae957e22213 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.hpp @@ -21,11 +21,50 @@ #include "dataRepository/Group.hpp" #include "dataRepository/ExecutableGroup.hpp" - +#include "dataRepository/LogLevelsInfo.hpp" // For logInfo namespace +#include "common/Timer.hpp" namespace geos { +namespace logInfo +{ +/** + * @brief Base timer category for output operations + * @details Provides configuration for logging output operation timing information + */ +struct OutputTimers +{ + /** + * @brief Get the description of this timer + * @return String view containing the timer description + */ + static std::string_view getDescription() { return "Output timing information"; } + + /** + * @brief Get the minimum log level for this timer + * @return Integer representing the minimum log level + */ + static constexpr int getMinLogLevel() { return 1; } +}; + +/** + * @brief Base interface for specific output type timers + * @details Each output type (VTK, Silo, etc.) implements this interface to provide + * its own timing category. This is used in conjunction with OutputTimers: + * - OutputTimerBase: For polymorphic behavior in derived output classes + * - OutputTimers: For the general output timing logging infrastructure + */ +struct OutputTimerBase +{ + /** + * @brief Get the description of this timer + * @return String view containing the timer description + */ + virtual std::string_view getDescription() const = 0; +}; +} + /** * @class OutputBase * @@ -102,6 +141,22 @@ class OutputBase : public ExecutableGroup **/ virtual void initializePreSubGroups() override; + /// Timer used to track duration of file writing operations for this specific output type + std::chrono::system_clock::duration m_outputTimer; + + /** + * @brief Get the timer category for this output type + * @return Reference to the output timer base for timing statistics + */ + virtual logInfo::OutputTimerBase const & getTimerCategory() const = 0; + + /// @copydoc geos::ExecutableGroup::cleanup + virtual void cleanup( real64 const time_n, + integer const cycleNumber, + integer const eventCounter, + real64 const eventProgress, + DomainPartition & domain ) override; + private: string m_childDirectory; integer m_parallelThreads; diff --git a/src/coreComponents/fileIO/Outputs/PythonOutput.cpp b/src/coreComponents/fileIO/Outputs/PythonOutput.cpp index e78f8835a06..5891fe55e26 100644 --- a/src/coreComponents/fileIO/Outputs/PythonOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/PythonOutput.cpp @@ -18,6 +18,20 @@ namespace geos { +namespace logInfo +{ +struct PythonOutputTimer : public OutputTimerBase +{ + std::string_view getDescription() const override { return "Python output timing"; } +}; +} + +logInfo::OutputTimerBase const & PythonOutput::getTimerCategory() const +{ + static logInfo::PythonOutputTimer timer; + return timer; +} + REGISTER_CATALOG_ENTRY( OutputBase, PythonOutput, string const &, dataRepository::Group * const ) } // namespace geos diff --git a/src/coreComponents/fileIO/Outputs/PythonOutput.hpp b/src/coreComponents/fileIO/Outputs/PythonOutput.hpp index 0e6c3cebb85..a73b6781654 100644 --- a/src/coreComponents/fileIO/Outputs/PythonOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/PythonOutput.hpp @@ -75,6 +75,9 @@ class PythonOutput : public OutputBase GEOS_UNUSED_VAR( domain ); return true; } + +protected: + logInfo::OutputTimerBase const & getTimerCategory() const override; }; diff --git a/src/coreComponents/fileIO/Outputs/RestartOutput.cpp b/src/coreComponents/fileIO/Outputs/RestartOutput.cpp index 6fb7a2c6b19..6eb07281cf6 100644 --- a/src/coreComponents/fileIO/Outputs/RestartOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/RestartOutput.cpp @@ -24,6 +24,14 @@ namespace geos using namespace dataRepository; +namespace logInfo +{ +struct RestartOutputTimer : public OutputTimerBase +{ + std::string_view getDescription() const override { return "Restart output timing"; } +}; +} + RestartOutput::RestartOutput( string const & name, Group * const parent ): OutputBase( name, parent ) @@ -41,19 +49,24 @@ bool RestartOutput::execute( real64 const GEOS_UNUSED_PARAM( time_n ), { GEOS_MARK_FUNCTION; - Group & rootGroup = this->getGroupByPath( "/Problem" ); + { + Timer timer( m_outputTimer ); - // Ignoring the eventProgress indicator for now to be compliant with the integrated test repo - // integer const eventProgressPercent = static_cast(eventProgress * 100.0); - string const fileName = GEOS_FMT( "{}_restart_{:09}", getFileNameRoot(), cycleNumber ); - - rootGroup.prepareToWrite(); - writeTree( joinPath( OutputBase::getOutputDirectory(), fileName ), *(rootGroup.getConduitNode().parent()) ); - rootGroup.finishWriting(); + Group & rootGroup = this->getGroupByPath( "/Problem" ); + string const fileName = GEOS_FMT( "{}_restart_{:09}", getFileNameRoot(), cycleNumber ); + rootGroup.prepareToWrite(); + writeTree( joinPath( OutputBase::getOutputDirectory(), fileName ), *(rootGroup.getConduitNode().parent()) ); + rootGroup.finishWriting(); + } return false; } +logInfo::OutputTimerBase const & RestartOutput::getTimerCategory() const +{ + static logInfo::RestartOutputTimer timer; + return timer; +} REGISTER_CATALOG_ENTRY( OutputBase, RestartOutput, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/fileIO/Outputs/RestartOutput.hpp b/src/coreComponents/fileIO/Outputs/RestartOutput.hpp index a2a12be781c..11c8715ed76 100644 --- a/src/coreComponents/fileIO/Outputs/RestartOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/RestartOutput.hpp @@ -78,6 +78,12 @@ class RestartOutput : public OutputBase dataRepository::ViewKey writeFEMFaces = { "writeFEMFaces" }; } viewKeys; /// @endcond + +protected: + /** + * @copydoc OutputBase::getTimerCategory + */ + logInfo::OutputTimerBase const & getTimerCategory() const override; }; diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp index 756facc2da1..ba03ceead5f 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp @@ -28,6 +28,20 @@ namespace geos using namespace dataRepository; +namespace logInfo +{ +struct SiloOutputTimer : public OutputTimerBase +{ + std::string_view getDescription() const override { return "Silo output timing"; } +}; +} + +logInfo::OutputTimerBase const & SiloOutput::getTimerCategory() const +{ + static logInfo::SiloOutputTimer timer; + return timer; +} + SiloOutput::SiloOutput( string const & name, Group * const parent ): OutputBase( name, parent ), @@ -122,31 +136,35 @@ bool SiloOutput::execute( real64 const time_n, { GEOS_MARK_FUNCTION; - SiloFile silo; - - int const size = MpiWrapper::commSize( MPI_COMM_GEOS ); - int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); - MpiWrapper::barrier( MPI_COMM_GEOS ); - - integer const numFiles = parallelThreads() == 0 ? size : parallelThreads(); - - // TODO set this during initialization - // silo.setOutputDirectory( getGlobalState().getCommandLineOptions().outputDirectory ), - silo.setOutputDirectory( getOutputDirectory() ), - silo.setPlotLevel( m_plotLevel ); - silo.setWriteEdgeMesh( m_writeEdgeMesh ); - silo.setWriteFaceMesh( m_writeFaceMesh ); - silo.setWriteCellElementMesh( m_writeCellElementMesh ); - silo.setWriteFaceElementMesh( m_writeFaceElementMesh ); - silo.setOnlyPlotSpecifiedFieldNamesFlag( m_onlyPlotSpecifiedFieldNames ); - silo.setFieldNames( m_fieldNames.toViewConst() ); - silo.setPlotFileRoot( m_plotFileRoot ); - silo.initialize( numFiles ); - silo.waitForBatonWrite( rank, cycleNumber, eventCounter, false ); - silo.writeDomainPartition( domain, cycleNumber, time_n + dt * eventProgress, 0 ); - silo.handOffBaton(); - silo.clearEmptiesFromMultiObjects( cycleNumber ); - silo.finish(); + { + Timer timer( m_outputTimer ); + + SiloFile silo; + + int const size = MpiWrapper::commSize( MPI_COMM_GEOS ); + int const rank = MpiWrapper::commRank( MPI_COMM_GEOS ); + MpiWrapper::barrier( MPI_COMM_GEOS ); + + integer const numFiles = parallelThreads() == 0 ? size : parallelThreads(); + + // TODO set this during initialization + // silo.setOutputDirectory( getGlobalState().getCommandLineOptions().outputDirectory ), + silo.setOutputDirectory( getOutputDirectory() ), + silo.setPlotLevel( m_plotLevel ); + silo.setWriteEdgeMesh( m_writeEdgeMesh ); + silo.setWriteFaceMesh( m_writeFaceMesh ); + silo.setWriteCellElementMesh( m_writeCellElementMesh ); + silo.setWriteFaceElementMesh( m_writeFaceElementMesh ); + silo.setOnlyPlotSpecifiedFieldNamesFlag( m_onlyPlotSpecifiedFieldNames ); + silo.setFieldNames( m_fieldNames.toViewConst() ); + silo.setPlotFileRoot( m_plotFileRoot ); + silo.initialize( numFiles ); + silo.waitForBatonWrite( rank, cycleNumber, eventCounter, false ); + silo.writeDomainPartition( domain, cycleNumber, time_n + dt * eventProgress, 0 ); + silo.handOffBaton(); + silo.clearEmptiesFromMultiObjects( cycleNumber ); + silo.finish(); + } return false; } diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.hpp b/src/coreComponents/fileIO/Outputs/SiloOutput.hpp index bb3574f3745..6b0a371974f 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.hpp @@ -85,6 +85,12 @@ class SiloOutput : public OutputBase } siloOutputViewKeys; /// @endcond +protected: + /** + * @copydoc OutputBase::getTimerCategory + */ + logInfo::OutputTimerBase const & getTimerCategory() const override; + private: void postInputInitialization() override; diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index d01edac3dcf..7e1299aac57 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -25,6 +25,20 @@ namespace geos { using namespace dataRepository; +namespace logInfo +{ +struct TimeHistoryOutputTimer : public OutputTimerBase +{ + std::string_view getDescription() const override { return "Time history output timing"; } +}; +} + +logInfo::OutputTimerBase const & TimeHistoryOutput::getTimerCategory() const +{ + static logInfo::TimeHistoryOutputTimer timer; + return timer; +} + TimeHistoryOutput::TimeHistoryOutput( string const & name, Group * const parent ): OutputBase( name, parent ), @@ -166,12 +180,18 @@ bool TimeHistoryOutput::execute( real64 const GEOS_UNUSED_PARAM( time_n ), DomainPartition & GEOS_UNUSED_PARAM( domain ) ) { GEOS_MARK_FUNCTION; - localIndex newBuffered = m_io.front()->getBufferedCount( ); - for( auto & th_io : m_io ) + { - th_io->write( ); + Timer timer( m_outputTimer ); + + localIndex newBuffered = m_io.front()->getBufferedCount( ); + for( auto & th_io : m_io ) + { + th_io->write( ); + } + m_recordCount += newBuffered; } - m_recordCount += newBuffered; + return false; } diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp index d7793943d9c..e2846f7c312 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp @@ -114,6 +114,12 @@ class TimeHistoryOutput : public OutputBase virtual PyTypeObject * getPythonType() const override; #endif +protected: + /** + * @copydoc OutputBase::getTimerCategory + */ + logInfo::OutputTimerBase const & getTimerCategory() const override; + private: /** diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp index 15e4b1dac13..b6f4348899e 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp @@ -29,6 +29,20 @@ namespace geos using namespace dataRepository; +namespace logInfo +{ +struct VTKOutputTimer : public OutputTimerBase +{ + std::string_view getDescription() const override { return "VTK output timing"; } +}; +} + +logInfo::OutputTimerBase const & VTKOutput::getTimerCategory() const +{ + static logInfo::VTKOutputTimer timer; + return timer; +} + VTKOutput::VTKOutput( string const & name, Group * const parent ): OutputBase( name, parent ), @@ -80,7 +94,7 @@ VTKOutput::VTKOutput( string const & name, registerWrapper( viewKeysStruct::fieldNames, &m_fieldNames ). setRTTypeName( rtTypes::CustomTypes::groupNameRefArray ). setInputFlag( InputFlags::OPTIONAL ). - setDescription( "Names of the fields to output. If this attribute is specified, GEOSX outputs all the fields specified by the user, regardless of their `plotLevel`" ); + setDescription( "Names of the fields to output. If this attribute is specified, GEOS outputs all the fields specified by the user, regardless of their `plotLevel`" ); registerWrapper( viewKeysStruct::levelNames, &m_levelNames ). setInputFlag( InputFlags::OPTIONAL ). @@ -159,14 +173,20 @@ bool VTKOutput::execute( real64 const time_n, real64 const GEOS_UNUSED_PARAM ( eventProgress ), DomainPartition & domain ) { - GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: writing {} at time {} s (cycle number {})", getName(), m_fieldNames, time_n + dt, cycleNumber )); - - m_writer.setWriteGhostCells( m_writeGhostCells ); - m_writer.setWriteFaceElementsAs3D ( m_writeFaceElementsAs3D ); - m_writer.setOutputMode( m_writeBinaryData ); - m_writer.setOutputRegionType( m_outputRegionType ); - m_writer.setPlotLevel( m_plotLevel ); - m_writer.write( time_n, cycleNumber, domain ); + GEOS_MARK_FUNCTION; + + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{}: writing {} at time {} s (cycle number {})", getName(), m_fieldNames, time_n + dt, cycleNumber )); + + { + Timer timer( m_outputTimer ); + + m_writer.setWriteGhostCells( m_writeGhostCells ); + m_writer.setWriteFaceElementsAs3D ( m_writeFaceElementsAs3D ); + m_writer.setOutputMode( m_writeBinaryData ); + m_writer.setOutputRegionType( m_outputRegionType ); + m_writer.setPlotLevel( m_plotLevel ); + m_writer.write( time_n, cycleNumber, domain ); + } return false; } diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp index 5b167dc66d6..bf36e900eaf 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp @@ -77,6 +77,9 @@ class VTKOutput : public OutputBase DomainPartition & domain ) override { execute( time_n, 0, cycleNumber, eventCounter, eventProgress, domain ); + + // Call parent class cleanup to get the timing statistics + OutputBase::cleanup( time_n, cycleNumber, eventCounter, eventProgress, domain ); } /** @@ -109,6 +112,12 @@ class VTKOutput : public OutputBase virtual PyTypeObject * getPythonType() const override; #endif +protected: + /** + * @copydoc OutputBase::getTimerCategory + */ + logInfo::OutputTimerBase const & getTimerCategory() const override; + private: string m_plotFileRoot; From 7e2c33b57ab7617964c1467faaa8cfedbc5bd816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vidar=20Stiernstr=C3=B6m?= Date: Mon, 9 Dec 2024 16:23:06 -0800 Subject: [PATCH 275/286] feat: Rate-and-state friction with explicit time integration (#3450) * Add rate-and-state kernel for explicit time stepping and quasi-dynamic solver using Runge-Kutta 3(2) * Update strings for added rate-and-state fields * Change to using a single multi-d array for the Runge-Kutta stage rates * Add PID controller to adaptive time step update * Bracket slip rate after Newton update * Add kernel for EmbeddedRungeKutta time stepping of slip and state and refactor QuasiDynamicEQRK32 solver * Add some comments to QuasiDynamicEQRK32 solver * Add Bogacki-Shampine 3(2) Runge-Kutta method * Add PIDController class for time step control * Add xml input for explicit solver, update subrepo, add docs * Rename constructor arguments to prevent shadowing * rebaseline --------- Co-authored-by: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 + .../SpringSliderExplicit_base.xml | 167 ++++++ .../SpringSliderExplicit_smoke.xml | 32 ++ .../inducedSeismicity/SpringSlider_base.xml | 4 +- .../inducedSeismicity/inducedSeismicity.ats | 9 +- .../physicsSolvers/contact/ContactFields.hpp | 16 + .../inducedSeismicity/CMakeLists.txt | 4 +- .../inducedSeismicity/QuasiDynamicEQ.cpp | 8 +- .../inducedSeismicity/QuasiDynamicEQ.hpp | 2 +- .../inducedSeismicity/QuasiDynamicEQRK32.cpp | 478 ++++++++++++++++++ .../inducedSeismicity/QuasiDynamicEQRK32.hpp | 235 +++++++++ .../kernels/RateAndStateKernels.hpp | 409 ++++++++++++++- .../inducedSeismicity/rateAndStateFields.hpp | 54 +- src/coreComponents/schema/schema.xsd | 75 ++- src/coreComponents/schema/schema.xsd.other | 148 +++--- 16 files changed, 1539 insertions(+), 108 deletions(-) create mode 100644 inputFiles/inducedSeismicity/SpringSliderExplicit_base.xml create mode 100644 inputFiles/inducedSeismicity/SpringSliderExplicit_smoke.xml create mode 100644 src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.cpp create mode 100644 src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.hpp diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 3aa31a7e4cb..31ce96119a9 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3480-9217-caaecb8 + baseline: integratedTests/baseline_integratedTests-pr3450-9221-37d940c allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index acbeb39e382..3b097223255 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3450 (2024-12-08) +===================== +Added test for explicit runge kutta sprinslider. + PR #3480 (2024-12-06) ===================== Add "logLevel" parameter under /Problem/Outputs in baseline files diff --git a/inputFiles/inducedSeismicity/SpringSliderExplicit_base.xml b/inputFiles/inducedSeismicity/SpringSliderExplicit_base.xml new file mode 100644 index 00000000000..a0c0381fb23 --- /dev/null +++ b/inputFiles/inducedSeismicity/SpringSliderExplicit_base.xml @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inputFiles/inducedSeismicity/SpringSliderExplicit_smoke.xml b/inputFiles/inducedSeismicity/SpringSliderExplicit_smoke.xml new file mode 100644 index 00000000000..2de09b79a03 --- /dev/null +++ b/inputFiles/inducedSeismicity/SpringSliderExplicit_smoke.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/inputFiles/inducedSeismicity/SpringSlider_base.xml b/inputFiles/inducedSeismicity/SpringSlider_base.xml index 9f141031607..5f6aefc94ad 100644 --- a/inputFiles/inducedSeismicity/SpringSlider_base.xml +++ b/inputFiles/inducedSeismicity/SpringSlider_base.xml @@ -123,7 +123,7 @@ initialCondition="1" objectPath="ElementRegions/Fault/FractureSubRegion" component="0" - scale="0." + scale="0.70710678118e-6" setNames="{all}"/> diff --git a/inputFiles/inducedSeismicity/inducedSeismicity.ats b/inputFiles/inducedSeismicity/inducedSeismicity.ats index 08b031177f0..813bdf08b8b 100644 --- a/inputFiles/inducedSeismicity/inducedSeismicity.ats +++ b/inputFiles/inducedSeismicity/inducedSeismicity.ats @@ -28,6 +28,13 @@ decks = [ partitions=((1, 1, 1), ), restart_step=0, check_step=3262, - restartcheck_params=RestartcheckParameters(atol=1e-4, rtol=1e-3)) + restartcheck_params=RestartcheckParameters(atol=1e-4, rtol=1e-3)), + TestDeck( + name="SpringSliderExplicit_smoke", + description="Spring slider 0D system", + partitions=((1, 1, 1), ), + restart_step=0, + check_step=532, + restartcheck_params=RestartcheckParameters(atol=1e-4, rtol=1e-3)) ] generate_geos_tests(decks) diff --git a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp index 59671a5ad6b..3a5005774e9 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp @@ -74,6 +74,14 @@ DECLARE_FIELD( dispJump, WRITE_AND_READ, "Displacement jump vector in the local reference system" ); +DECLARE_FIELD( dispJump_n, + "displacementJump", + array2d< real64 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Displacement jump vector in the local reference system at the current time-step" ); + DECLARE_FIELD( slip, "slip", array1d< real64 >, @@ -114,6 +122,14 @@ DECLARE_FIELD( traction, WRITE_AND_READ, "Fracture traction vector in the local reference system." ); +DECLARE_FIELD( traction_n, + "traction_n", + array2d< real64 >, + 0, + NOPLOT, + WRITE_AND_READ, + "Initial fracture traction vector in the local reference system at this time-step." ); + DECLARE_FIELD( deltaTraction, "deltaTraction", array2d< real64 >, diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt b/src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt index 7edf040454d..c8f23c55323 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/CMakeLists.txt @@ -4,6 +4,7 @@ set( physicsSolvers_headers inducedSeismicity/inducedSeismicityFields.hpp inducedSeismicity/rateAndStateFields.hpp inducedSeismicity/QuasiDynamicEQ.hpp + inducedSeismicity/QuasiDynamicEQRK32.hpp inducedSeismicity/SeismicityRate.hpp inducedSeismicity/kernels/RateAndStateKernels.hpp inducedSeismicity/kernels/SeismicityRateKernels.hpp @@ -12,6 +13,7 @@ set( physicsSolvers_headers # Specify solver sources set( physicsSolvers_sources ${physicsSolvers_sources} - inducedSeismicity/QuasiDynamicEQ.cpp + inducedSeismicity/QuasiDynamicEQ.cpp + inducedSeismicity/QuasiDynamicEQRK32.cpp inducedSeismicity/SeismicityRate.cpp PARENT_SCOPE ) diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp index 059fa9d33e1..d00e64357e0 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp @@ -32,6 +32,7 @@ namespace geos using namespace dataRepository; using namespace fields; using namespace constitutive; +using namespace rateAndStateKernels; QuasiDynamicEQ::QuasiDynamicEQ( const string & name, Group * const parent ): @@ -149,8 +150,8 @@ real64 QuasiDynamicEQ::solverStep( real64 const & time_n, /// 2. Solve for slip rate and state variable and, compute slip GEOS_LOG_LEVEL_RANK_0( 1, "Rate and State solver" ); - - integer const maxNewtonIter = m_nonlinearSolverParameters.m_maxIterNewton; + integer const maxIterNewton = m_nonlinearSolverParameters.m_maxIterNewton; + real64 const newtonTol = m_nonlinearSolverParameters.m_newtonTol; forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, MeshLevel & mesh, arrayView1d< string const > const & regionNames ) @@ -161,7 +162,8 @@ real64 QuasiDynamicEQ::solverStep( real64 const & time_n, SurfaceElementSubRegion & subRegion ) { // solve rate and state equations. - rateAndStateKernels::createAndLaunch< parallelDevicePolicy<> >( subRegion, viewKeyStruct::frictionLawNameString(), m_shearImpedance, maxNewtonIter, time_n, dtStress ); + createAndLaunch< ImplicitFixedStressRateAndStateKernel, parallelDevicePolicy<> >( subRegion, viewKeyStruct::frictionLawNameString(), m_shearImpedance, maxIterNewton, newtonTol, time_n, + dtStress ); // save old state saveOldStateAndUpdateSlip( subRegion, dtStress ); } ); diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp index edff334c003..97b202ee7e6 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp @@ -47,7 +47,7 @@ class QuasiDynamicEQ : public PhysicsSolverBase struct viewKeyStruct : public PhysicsSolverBase::viewKeyStruct { /// stress solver name - static constexpr char const * stressSolverNameString() { return "stressSolverName"; } + constexpr static char const * stressSolverNameString() { return "stressSolverName"; } /// Friction law name string constexpr static char const * frictionLawNameString() { return "frictionLawName"; } /// Friction law name string diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.cpp new file mode 100644 index 00000000000..7b569118934 --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.cpp @@ -0,0 +1,478 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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 QuasiDynamicEQRK32.cpp + */ + +#include "QuasiDynamicEQRK32.hpp" + +#include "dataRepository/InputFlags.hpp" +#include "mesh/DomainPartition.hpp" +#include "kernels/RateAndStateKernels.hpp" +#include "rateAndStateFields.hpp" +#include "physicsSolvers/contact/ContactFields.hpp" +#include "fieldSpecification/FieldSpecificationManager.hpp" + +namespace geos +{ + +using namespace dataRepository; +using namespace fields; +using namespace constitutive; +using namespace rateAndStateKernels; + +QuasiDynamicEQRK32::QuasiDynamicEQRK32( const string & name, + Group * const parent ): + PhysicsSolverBase( name, parent ), + m_stressSolver( nullptr ), + m_stressSolverName( "SpringSlider" ), + m_shearImpedance( 0.0 ), + m_butcherTable( BogackiShampine32Table()), // TODO: The butcher table should be specified in the XML input. + m_successfulStep( false ), + m_controller( PIDController( { 1.0/18.0, 1.0/9.0, 1.0/18.0 }, + 1.0e-6, 1.0e-6, 0.81 )) // TODO: The control parameters should be specified in the XML input +{ + this->registerWrapper( viewKeyStruct::shearImpedanceString(), &m_shearImpedance ). + setInputFlag( InputFlags::REQUIRED ). + setDescription( "Shear impedance." ); + + this->registerWrapper( viewKeyStruct::stressSolverNameString(), &m_stressSolverName ). + setInputFlag( InputFlags::OPTIONAL ). + setDescription( "Name of solver for computing stress. If empty, the spring-slider model is run." ); +} + +void QuasiDynamicEQRK32::postInputInitialization() +{ + + // Initialize member stress solver as specified in XML input + if( !m_stressSolverName.empty() ) + { + m_stressSolver = &this->getParent().getGroup< PhysicsSolverBase >( m_stressSolverName ); + } + + PhysicsSolverBase::postInputInitialization(); +} + +QuasiDynamicEQRK32::~QuasiDynamicEQRK32() +{ + // TODO Auto-generated destructor stub +} + + +void QuasiDynamicEQRK32::registerDataOnMesh( Group & meshBodies ) +{ + PhysicsSolverBase::registerDataOnMesh( meshBodies ); + + forDiscretizationOnMeshTargets( meshBodies, [&] ( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + { + ElementRegionManager & elemManager = mesh.getElemManager(); + + elemManager.forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) + { + // Scalar functions on fault + subRegion.registerField< rateAndState::stateVariable >( getName() ); + subRegion.registerField< rateAndState::stateVariable_n >( getName() ); + subRegion.registerField< rateAndState::slipRate >( getName() ); + + // Tangent (2-component) functions on fault + string const labels2Comp[2] = {"tangent1", "tangent2" }; + subRegion.registerField< rateAndState::slipVelocity >( getName() ). + setDimLabels( 1, labels2Comp ).reference().resizeDimension< 1 >( 2 ); + subRegion.registerField< rateAndState::slipVelocity_n >( getName() ). + setDimLabels( 1, labels2Comp ).reference().resizeDimension< 1 >( 2 ); + subRegion.registerField< rateAndState::deltaSlip >( getName() ). + setDimLabels( 1, labels2Comp ).reference().resizeDimension< 1 >( 2 ); + subRegion.registerField< rateAndState::deltaSlip_n >( getName() ). + setDimLabels( 1, labels2Comp ).reference().resizeDimension< 1 >( 2 ); + + // Runge-Kutta stage rates and error + integer const numRKComponents = 3; + subRegion.registerField< rateAndState::rungeKuttaStageRates >( getName() ).reference().resizeDimension< 1, 2 >( m_butcherTable.numStages, numRKComponents ); + subRegion.registerField< rateAndState::error >( getName() ).reference().resizeDimension< 1 >( numRKComponents ); + + + if( !subRegion.hasWrapper( contact::dispJump::key() )) + { + // 3-component functions on fault + string const labels3Comp[3] = { "normal", "tangent1", "tangent2" }; + subRegion.registerField< contact::dispJump >( getName() ). + setDimLabels( 1, labels3Comp ). + reference().resizeDimension< 1 >( 3 ); + subRegion.registerField< contact::dispJump_n >( getName() ). + setDimLabels( 1, labels3Comp ). + reference().resizeDimension< 1 >( 3 ); + subRegion.registerField< contact::traction >( getName() ). + setDimLabels( 1, labels3Comp ). + reference().resizeDimension< 1 >( 3 ); + subRegion.registerField< contact::traction_n >( getName() ). + setDimLabels( 1, labels3Comp ). + reference().resizeDimension< 1 >( 3 ); + + subRegion.registerWrapper< string >( viewKeyStruct::frictionLawNameString() ). + setPlotLevel( PlotLevel::NOPLOT ). + setRestartFlags( RestartFlags::NO_WRITE ). + setSizedFromParent( 0 ); + + string & frictionLawName = subRegion.getReference< string >( viewKeyStruct::frictionLawNameString() ); + frictionLawName = PhysicsSolverBase::getConstitutiveName< FrictionBase >( subRegion ); + GEOS_ERROR_IF( frictionLawName.empty(), GEOS_FMT( "{}: FrictionBase model not found on subregion {}", + getDataContext(), subRegion.getDataContext() ) ); + } + } ); + } ); +} + +real64 QuasiDynamicEQRK32::solverStep( real64 const & time_n, + real64 const & dt, + int const cycleNumber, + DomainPartition & domain ) +{ + if( cycleNumber == 0 ) + { + /// Apply initial conditions to the Fault + FieldSpecificationManager & fieldSpecificationManager = FieldSpecificationManager::getInstance(); + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & ) + + { + fieldSpecificationManager.applyInitialConditions( mesh ); + + } ); + saveState( domain ); + } + + real64 dtAdaptive = dt; + + GEOS_LOG_LEVEL_RANK_0( 1, "Begin adaptive time step" ); + while( true ) // Adaptive time step loop. Performs a Runge-Kutta time stepping with error control on state and slip + { + real64 dtStress; GEOS_UNUSED_VAR( dtStress ); + + // Initial Runge-Kutta stage + stepRateStateODEInitialSubstage( dtAdaptive, domain ); + real64 dtStage = m_butcherTable.c[1]*dtAdaptive; + dtStress = updateStresses( time_n, dtStage, cycleNumber, domain ); + updateSlipVelocity( time_n, dtStage, domain ); + + // Remaining stages + for( integer stageIndex = 1; stageIndex < m_butcherTable.numStages-1; stageIndex++ ) + { + stepRateStateODESubstage( stageIndex, dtAdaptive, domain ); + dtStage = m_butcherTable.c[stageIndex+1]*dtAdaptive; + dtStress = updateStresses( time_n, dtStage, cycleNumber, domain ); + updateSlipVelocity( time_n, dtStage, domain ); + } + + stepRateStateODEAndComputeError( dtAdaptive, domain ); + // Update timestep based on the time step error + real64 const dtNext = setNextDt( dtAdaptive, domain ); + if( m_successfulStep ) // set in setNextDt + { + // Compute stresses, and slip velocity and save results at updated time, + if( !m_butcherTable.FSAL ) + { + dtStress = updateStresses( time_n, dtAdaptive, cycleNumber, domain ); + updateSlipVelocity( time_n, dtAdaptive, domain ); + } + saveState( domain ); + // update the time step and exit the adaptive time step loop + dtAdaptive = dtNext; + break; + } + else + { + // Retry with updated time step + dtAdaptive = dtNext; + } + } + // return time step size achieved by stress solver + return dtAdaptive; +} + +void QuasiDynamicEQRK32::stepRateStateODEInitialSubstage( real64 const dt, DomainPartition & domain ) const +{ + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) + { + + string const & fricitonLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + RateAndStateFriction const & frictionLaw = getConstitutiveModel< RateAndStateFriction >( subRegion, fricitonLawName ); + rateAndStateKernels::EmbeddedRungeKuttaKernel rkKernel( subRegion, frictionLaw, m_butcherTable ); + arrayView3d< real64 > const rkStageRates = subRegion.getField< rateAndState::rungeKuttaStageRates >(); + + if( m_butcherTable.FSAL && m_successfulStep ) + { + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + rkKernel.updateStageRatesFSAL( k ); + rkKernel.updateStageValues( k, 1, dt ); + } ); + } + else + { + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + rkKernel.initialize( k ); + rkKernel.updateStageRates( k, 0 ); + rkKernel.updateStageValues( k, 1, dt ); + } ); + } + } ); + } ); +} + +void QuasiDynamicEQRK32::stepRateStateODESubstage( integer const stageIndex, + real64 const dt, + DomainPartition & domain ) const +{ + + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) + { + + string const & fricitonLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + RateAndStateFriction const & frictionLaw = getConstitutiveModel< RateAndStateFriction >( subRegion, fricitonLawName ); + rateAndStateKernels::EmbeddedRungeKuttaKernel rkKernel( subRegion, frictionLaw, m_butcherTable ); + arrayView3d< real64 > const rkStageRates = subRegion.getField< rateAndState::rungeKuttaStageRates >(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + rkKernel.updateStageRates( k, stageIndex ); + rkKernel.updateStageValues( k, stageIndex+1, dt ); + } ); + } ); + } ); +} + +void QuasiDynamicEQRK32::stepRateStateODEAndComputeError( real64 const dt, DomainPartition & domain ) const +{ + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) + { + + string const & fricitonLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + RateAndStateFriction const & frictionLaw = getConstitutiveModel< RateAndStateFriction >( subRegion, fricitonLawName ); + rateAndStateKernels::EmbeddedRungeKuttaKernel rkKernel( subRegion, frictionLaw, m_butcherTable ); + arrayView3d< real64 > const rkStageRates = subRegion.getField< rateAndState::rungeKuttaStageRates >(); + if( m_butcherTable.FSAL ) + { + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // Perform last stage rate update + rkKernel.updateStageRates( k, m_butcherTable.numStages-1 ); + // Update solution to final time and compute errors + rkKernel.updateSolutionAndLocalErrorFSAL( k, dt, m_controller.absTol, m_controller.relTol ); + } ); + } + else + { + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + // Perform last stage rate update + rkKernel.updateStageRates( k, m_butcherTable.numStages-1 ); + // Update solution to final time and compute errors + rkKernel.updateSolutionAndLocalError( k, dt, m_controller.absTol, m_controller.relTol ); + } ); + } + } ); + } ); +} + +real64 QuasiDynamicEQRK32::updateStresses( real64 const & time_n, + real64 const & dt, + const int cycleNumber, + DomainPartition & domain ) const +{ + GEOS_LOG_LEVEL_RANK_0( 1, "Stress solver" ); + // Call member variable stress solver to update the stress state + if( m_stressSolver ) + { + // 1. Solve the momentum balance + real64 const dtStress = m_stressSolver->solverStep( time_n, dt, cycleNumber, domain ); + + return dtStress; + } + else + { + // Spring-slider shear traction computation + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) + { + + arrayView2d< real64 const > const deltaSlip = subRegion.getField< rateAndState::deltaSlip >(); + arrayView2d< real64 > const traction = subRegion.getField< fields::contact::traction >(); + arrayView2d< real64 const > const traction_n = subRegion.getField< fields::contact::traction_n >(); + + string const & fricitonLawName = subRegion.template getReference< string >( viewKeyStruct::frictionLawNameString() ); + RateAndStateFriction const & frictionLaw = getConstitutiveModel< RateAndStateFriction >( subRegion, fricitonLawName ); + + RateAndStateFriction::KernelWrapper frictionKernelWrapper = frictionLaw.createKernelUpdates(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + SpringSliderParameters springSliderParameters = SpringSliderParameters( traction[k][0], + frictionKernelWrapper.getACoefficient( k ), + frictionKernelWrapper.getBCoefficient( k ), + frictionKernelWrapper.getDcCoefficient( k ) ); + + + traction[k][1] = traction_n[k][1] + springSliderParameters.tauRate * dt + - springSliderParameters.springStiffness * deltaSlip[k][0]; + traction[k][2] = traction_n[k][2] + springSliderParameters.tauRate * dt + - springSliderParameters.springStiffness * deltaSlip[k][1]; + } ); + } ); + } ); + return dt; + } +} + +void QuasiDynamicEQRK32::updateSlipVelocity( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) const +{ + GEOS_LOG_LEVEL_RANK_0( 1, "Rate and State solver" ); + integer const maxIterNewton = m_nonlinearSolverParameters.m_maxIterNewton; + real64 const newtonTol = m_nonlinearSolverParameters.m_newtonTol; + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) + { + // solve rate and state equations. + rateAndStateKernels::createAndLaunch< rateAndStateKernels::ExplicitRateAndStateKernel, parallelDevicePolicy<> >( subRegion, viewKeyStruct::frictionLawNameString(), m_shearImpedance, + maxIterNewton, newtonTol, time_n, dt ); + } ); + } ); +} + +void QuasiDynamicEQRK32::saveState( DomainPartition & domain ) const +{ + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion & subRegion ) + { + arrayView1d< real64 const > const stateVariable = subRegion.getField< rateAndState::stateVariable >(); + arrayView2d< real64 const > const slipVelocity = subRegion.getField< rateAndState::slipVelocity >(); + arrayView2d< real64 const > const deltaSlip = subRegion.getField< rateAndState::deltaSlip >(); + arrayView2d< real64 const > const dispJump = subRegion.getField< contact::dispJump >(); + arrayView2d< real64 const > const traction = subRegion.getField< contact::traction >(); + + arrayView1d< real64 > const stateVariable_n = subRegion.getField< rateAndState::stateVariable_n >(); + arrayView2d< real64 > const slipVelocity_n = subRegion.getField< rateAndState::slipVelocity_n >(); + arrayView2d< real64 > const deltaSlip_n = subRegion.getField< rateAndState::deltaSlip >(); + arrayView2d< real64 > const dispJump_n = subRegion.getField< contact::dispJump_n >(); + arrayView2d< real64 > const traction_n = subRegion.getField< contact::traction_n >(); + + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + stateVariable_n[k] = stateVariable[k]; + LvArray::tensorOps::copy< 2 >( deltaSlip_n[k], deltaSlip[k] ); + LvArray::tensorOps::copy< 2 >( slipVelocity_n[k], slipVelocity[k] ); + LvArray::tensorOps::copy< 3 >( dispJump_n[k], dispJump[k] ); + LvArray::tensorOps::copy< 3 >( traction_n[k], traction[k] ); + } ); + } ); + } ); +} + +real64 QuasiDynamicEQRK32::setNextDt( real64 const & currentDt, DomainPartition & domain ) +{ + + // Spring-slider shear traction computation + forDiscretizationOnMeshTargets( domain.getMeshBodies(), [&]( string const &, + MeshLevel const & mesh, + arrayView1d< string const > const & regionNames ) + + { + mesh.getElemManager().forElementSubRegions< SurfaceElementSubRegion >( regionNames, + [&]( localIndex const, + SurfaceElementSubRegion const & subRegion ) + { + arrayView2d< real64 const > const error = subRegion.getField< rateAndState::error >(); + + RAJA::ReduceSum< parallelDeviceReduce, real64 > scaledl2ErrorSquared( 0.0 ); + integer const N = subRegion.size(); + forAll< parallelDevicePolicy<> >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) + { + scaledl2ErrorSquared += LvArray::tensorOps::l2NormSquared< 3 >( error[k] ); + } ); + m_controller.errors[0] = LvArray::math::sqrt( MpiWrapper::sum( scaledl2ErrorSquared.get() / (3.0*N) )); + } ); + } ); + + // Compute update factor to currentDt using PID error controller + limiter + real64 const dtFactor = m_controller.computeUpdateFactor( m_butcherTable.algHighOrder, m_butcherTable.algLowOrder ); + real64 const nextDt = dtFactor*currentDt; + // Check if step was acceptable + m_successfulStep = (dtFactor >= m_controller.acceptSafety) ? true : false; + if( m_successfulStep ) + { + m_controller.errors[2] = m_controller.errors[1]; + m_controller.errors[1] = m_controller.errors[0]; + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Adaptive time step successful. The next dt will be {:.2e} s", nextDt )); + } + else + { + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "Adaptive time step failed. The next dt will be {:.2e} s", nextDt )); + } + + return nextDt; +} + +REGISTER_CATALOG_ENTRY( PhysicsSolverBase, QuasiDynamicEQRK32, string const &, dataRepository::Group * const ) + +} // namespace geos diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.hpp new file mode 100644 index 00000000000..0979fd22dd7 --- /dev/null +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.hpp @@ -0,0 +1,235 @@ +/* + * ------------------------------------------------------------------------------------------------------------ + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC + * Copyright (c) 2018-2024 Total, S.A + * 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. + * ------------------------------------------------------------------------------------------------------------ + */ + +#ifndef GEOS_PHYSICSSOLVERS_INDUCED_QUASIDYNAMICEQRK32_HPP +#define GEOS_PHYSICSSOLVERS_INDUCED_QUASIDYNAMICEQRK32_HPP + +#include "physicsSolvers/PhysicsSolverBase.hpp" +#include "kernels/RateAndStateKernels.hpp" + +namespace geos +{ + +class QuasiDynamicEQRK32 : public PhysicsSolverBase +{ +public: + /// The default nullary constructor is disabled to avoid compiler auto-generation: + QuasiDynamicEQRK32() = delete; + + /// The constructor needs a user-defined "name" and a parent Group (to place this instance in the tree structure of classes) + QuasiDynamicEQRK32( const string & name, + Group * const parent ); + + /// Destructor + virtual ~QuasiDynamicEQRK32() override; + + static string catalogName() { return "QuasiDynamicEQRK32"; } + + /** + * @return Get the final class Catalog name + */ + virtual string getCatalogName() const override { return catalogName(); } + + /// This method ties properties with their supporting mesh + virtual void registerDataOnMesh( Group & meshBodies ) override; + + struct viewKeyStruct : public PhysicsSolverBase::viewKeyStruct + { + /// stress solver name + constexpr static char const * stressSolverNameString() { return "stressSolverName"; } + /// Friction law name string + constexpr static char const * frictionLawNameString() { return "frictionLawName"; } + /// Friction law name string + constexpr static char const * shearImpedanceString() { return "shearImpedance"; } + /// target slip increment + constexpr static char const * timeStepTol() { return "timeStepTol"; } + }; + + virtual real64 solverStep( real64 const & time_n, + real64 const & dt, + integer const cycleNumber, + DomainPartition & domain ) override final; + + + virtual real64 setNextDt( real64 const & currentDt, + DomainPartition & domain ) override final; + + /** + * @brief Computes stage rates for the initial Runge-Kutta substage and updates slip and state + * @param dt + * @param domain + */ + void stepRateStateODEInitialSubstage( real64 const dt, DomainPartition & domain ) const; + + /** + * @brief Computes stage rates at the Runge-Kutta substage specified by stageIndex and updates slip and state + * @param stageIndex + * @param dt + * @param domain + */ + void stepRateStateODESubstage( integer const stageIndex, + real64 const dt, + DomainPartition & domain ) const; + + /** + * @brief Updates slip and state to t + dt and approximates the error + * @param dt + * @param domain + */ + void stepRateStateODEAndComputeError( real64 const dt, DomainPartition & domain ) const; + + real64 updateStresses( real64 const & time_n, + real64 const & dt, + const int cycleNumber, + DomainPartition & domain ) const; + + /** + * @brief Updates rate-and-state slip velocity + * @param domain + */ + void updateSlipVelocity( real64 const & time_n, + real64 const & dt, + DomainPartition & domain ) const; + + /** + * @brief save the current state + * @param domain + */ + void saveState( DomainPartition & domain ) const; + +private: + + virtual void postInputInitialization() override; + + + /// pointer to stress solver + PhysicsSolverBase * m_stressSolver; + + /// stress solver name + string m_stressSolverName; + + /// shear impedance + real64 m_shearImpedance; + + /// Runge-Kutta Butcher table (specifies the embedded RK method) + // TODO: The specific type should not be hardcoded! + // Should be possible to change RK-method based on the table. + rateAndStateKernels::BogackiShampine32Table m_butcherTable; + + bool m_successfulStep; // Flag indicating if the adative time step was accepted + + /** + * @brief Proportional-integral-derivative controller used for updating time step + * based error estimate in the current and previous time steps. + */ + class PIDController + { +public: + + GEOS_HOST_DEVICE + PIDController( std::array< const real64, 3 > const & cparams, + const real64 atol, + const real64 rtol, + const real64 safety ): + controlParameters{ cparams }, + absTol( atol ), + relTol( rtol ), + acceptSafety( safety ), + errors{ {0.0, 0.0, 0.0} } + {} + + /// Default copy constructor + PIDController( PIDController const & ) = default; + + /// Default move constructor + PIDController( PIDController && ) = default; + + /// Deleted default constructor + PIDController() = delete; + + /// Deleted copy assignment operator + PIDController & operator=( PIDController const & ) = delete; + + /// Deleted move assignment operator + PIDController & operator=( PIDController && ) = delete; + + /// Parameters for the PID error controller + const std::array< const real64, 3 > controlParameters; // Controller parameters + + real64 const absTol; // absolut tolerence + + real64 const relTol; // relative tolerence + + real64 const acceptSafety; // Acceptance safety + + std::array< real64, 3 > errors; // Errors for current and two previous updates + // stored as [n+1, n, n-1] + + real64 computeUpdateFactor( integer const algHighOrder, integer const algLowOrder ) + { + // PID error controller + limiter + real64 const k = LvArray::math::min( algHighOrder, algLowOrder ) + 1.0; + real64 const eps0 = 1.0/(errors[0] + std::numeric_limits< real64 >::epsilon()); // n + 1 + real64 const eps1 = 1.0/(errors[1] + std::numeric_limits< real64 >::epsilon()); // n + real64 const eps2 = 1.0/(errors[2] + std::numeric_limits< real64 >::epsilon()); // n-1 + // Compute update factor eps0^(beta0/k)*eps1^(beta1/k)*eps2^(beta2/k) where + // beta0 - beta2 are the control parameters. Also apply limiter to smoothen changes. + // Limiter is 1.0 + atan(x - 1.0). Here use atan(x) = atan2(x, 1.0). + return 1.0 + LvArray::math::atan2( pow( eps0, controlParameters[0] / k ) * + pow( eps1, controlParameters[1] / k ) * + pow( eps2, controlParameters[2] / k ) - 1.0, 1.0 ); + } + }; + + PIDController m_controller; + + + class SpringSliderParameters + { +public: + + GEOS_HOST_DEVICE + SpringSliderParameters( real64 const normalTraction, real64 const a, real64 const b, real64 const Dc ): + tauRate( 1e-4 ), + springStiffness( 0.0 ) + { + real64 const criticalStiffness = normalTraction * (b - a) / Dc; + springStiffness = 0.9 * criticalStiffness; + } + + /// Default copy constructor + SpringSliderParameters( SpringSliderParameters const & ) = default; + + /// Default move constructor + SpringSliderParameters( SpringSliderParameters && ) = default; + + /// Deleted default constructor + SpringSliderParameters() = delete; + + /// Deleted copy assignment operator + SpringSliderParameters & operator=( SpringSliderParameters const & ) = delete; + + /// Deleted move assignment operator + SpringSliderParameters & operator=( SpringSliderParameters && ) = delete; + + real64 tauRate; + + real64 springStiffness; + }; +}; + +} /* namespace geos */ + +#endif /* GEOS_PHYSICSSOLVERS_INDUCED_QUASIDYNAMICEQRK32_HPP */ diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp index cf2fc306b6b..87d05f3b443 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp @@ -27,20 +27,38 @@ namespace geos namespace rateAndStateKernels { + +// TBD: Pass the kernel and add getters for relevant fields to make this function general purpose and avoid +// wrappers? +GEOS_HOST_DEVICE +static void projectSlipRateBase( localIndex const k, + real64 const frictionCoefficient, + real64 const shearImpedance, + arrayView2d< real64 const > const traction, + arrayView1d< real64 const > const slipRate, + arrayView2d< real64 > const slipVelocity ) +{ + // Project slip rate onto shear traction to get slip velocity components + real64 const frictionForce = traction[k][0] * frictionCoefficient; + real64 const projectionScaling = 1.0 / ( shearImpedance + frictionForce / slipRate[k] ); + slipVelocity[k][0] = projectionScaling * traction[k][1]; + slipVelocity[k][1] = projectionScaling * traction[k][2]; +} + /** - * @class RateAndStateKernel + * @class ImplicitFixedStressRateAndStateKernel * * @brief * * @details */ -class RateAndStateKernel +class ImplicitFixedStressRateAndStateKernel { public: - RateAndStateKernel( SurfaceElementSubRegion & subRegion, - constitutive::RateAndStateFriction const & frictionLaw, - real64 const shearImpedance ): + ImplicitFixedStressRateAndStateKernel( SurfaceElementSubRegion & subRegion, + constitutive::RateAndStateFriction const & frictionLaw, + real64 const shearImpedance ): m_slipRate( subRegion.getField< fields::rateAndState::slipRate >() ), m_stateVariable( subRegion.getField< fields::rateAndState::stateVariable >() ), m_stateVariable_n( subRegion.getField< fields::rateAndState::stateVariable_n >() ), @@ -90,7 +108,7 @@ class RateAndStateKernel stack.jacobian[0][0] = dFriction[0]; // derivative of Eq 1 w.r.t. stateVariable stack.jacobian[0][1] = dFriction[1]; // derivative of Eq 1 w.r.t. slipRate stack.jacobian[1][0] = dStateEvolutionLaw[0]; // derivative of Eq 2 w.r.t. stateVariable - stack.jacobian[1][1] = dStateEvolutionLaw[1]; // derivative of Eq 2 w.r.t. m_slipRate + stack.jacobian[1][1] = dStateEvolutionLaw[1]; // derivative of Eq 2 w.r.t. slipRate } GEOS_HOST_DEVICE @@ -109,11 +127,8 @@ class RateAndStateKernel GEOS_HOST_DEVICE void projectSlipRate( localIndex const k ) const { - // Project slip rate onto shear traction to get slip velocity components - real64 const frictionForce = m_traction[k][0] * m_frictionLaw.frictionCoefficient( k, m_slipRate[k], m_stateVariable[k] ); - real64 const projectionScaling = 1.0 / ( m_shearImpedance + frictionForce / m_slipRate[k] ); - m_slipVelocity[k][0] = projectionScaling * m_traction[k][1]; - m_slipVelocity[k][1] = projectionScaling * m_traction[k][2]; + real64 const frictionCoefficient = m_frictionLaw.frictionCoefficient( k, m_slipRate[k], m_stateVariable[k] ); + projectSlipRateBase( k, frictionCoefficient, m_shearImpedance, m_traction, m_slipRate, m_slipVelocity ); } GEOS_HOST_DEVICE @@ -144,18 +159,124 @@ class RateAndStateKernel }; +/** + * @class ExplicitRateAndStateKernel + * + * @brief + * + * @details + */ +class ExplicitRateAndStateKernel +{ +public: + + ExplicitRateAndStateKernel( SurfaceElementSubRegion & subRegion, + constitutive::RateAndStateFriction const & frictionLaw, + real64 const shearImpedance ): + m_slipRate( subRegion.getField< fields::rateAndState::slipRate >() ), + m_stateVariable( subRegion.getField< fields::rateAndState::stateVariable >() ), + m_traction( subRegion.getField< fields::contact::traction >() ), + m_slipVelocity( subRegion.getField< fields::rateAndState::slipVelocity >() ), + m_shearImpedance( shearImpedance ), + m_frictionLaw( frictionLaw.createKernelUpdates() ) + {} + + /** + * @struct StackVariables + * @brief Kernel variables located on the stack + */ + struct StackVariables + { +public: + + GEOS_HOST_DEVICE + StackVariables( ) + {} + + real64 jacobian; + real64 rhs; + + }; + + GEOS_HOST_DEVICE + void setup( localIndex const k, + real64 const dt, + StackVariables & stack ) const + { + GEOS_UNUSED_VAR( dt ); + real64 const normalTraction = m_traction[k][0]; + real64 const shearTractionMagnitude = LvArray::math::sqrt( m_traction[k][1] * m_traction[k][1] + m_traction[k][2] * m_traction[k][2] ); + + // Slip rate is bracketed between [0, shear traction magnitude / shear impedance] + // If slip rate is outside the bracket, re-initialize to the middle value + real64 const upperBound = shearTractionMagnitude/m_shearImpedance; + real64 const bracketedSlipRate = m_slipRate[k] > upperBound ? 0.5*upperBound : m_slipRate[k]; + + stack.rhs = shearTractionMagnitude - m_shearImpedance *bracketedSlipRate - normalTraction * m_frictionLaw.frictionCoefficient( k, bracketedSlipRate, m_stateVariable[k] ); + stack.jacobian = -m_shearImpedance - normalTraction * m_frictionLaw.dFrictionCoefficient_dSlipRate( k, bracketedSlipRate, m_stateVariable[k] ); + } + + GEOS_HOST_DEVICE + void solve( localIndex const k, + StackVariables & stack ) const + { + m_slipRate[k] -= stack.rhs/stack.jacobian; + + // Slip rate is bracketed between [0, shear traction magnitude / shear impedance] + // Check that the update did not end outside of the bracket. + real64 const shearTractionMagnitude = LvArray::math::sqrt( m_traction[k][1] * m_traction[k][1] + m_traction[k][2] * m_traction[k][2] ); + real64 const upperBound = shearTractionMagnitude/m_shearImpedance; + if( m_slipRate[k] > upperBound ) m_slipRate[k] = 0.5*upperBound; + + } + + + GEOS_HOST_DEVICE + camp::tuple< int, real64 > checkConvergence( StackVariables const & stack, + real64 const tol ) const + { + real64 const residualNorm = LvArray::math::abs( stack.rhs ); + int const converged = residualNorm < tol ? 1 : 0; + camp::tuple< int, real64 > result { converged, residualNorm }; + return result; + } + + GEOS_HOST_DEVICE + void projectSlipRate( localIndex const k ) const + { + real64 const frictionCoefficient = m_frictionLaw.frictionCoefficient( k, m_slipRate[k], m_stateVariable[k] ); + projectSlipRateBase( k, frictionCoefficient, m_shearImpedance, m_traction, m_slipRate, m_slipVelocity ); + } + +private: + + arrayView1d< real64 > const m_slipRate; + + arrayView1d< real64 > const m_stateVariable; + + arrayView2d< real64 const > const m_traction; + + arrayView2d< real64 > const m_slipVelocity; + + real64 const m_shearImpedance; + + constitutive::RateAndStateFriction::KernelWrapper m_frictionLaw; + +}; /** * @brief Performs the kernel launch + * @tparam KernelType The Rate-and-state kernel to launch * @tparam POLICY the policy used in the RAJA kernels */ -template< typename POLICY > +template< typename KernelType, typename POLICY > static void createAndLaunch( SurfaceElementSubRegion & subRegion, string const & frictionLawNameKey, real64 const shearImpedance, - integer const maxNewtonIter, + integer const maxIterNewton, + real64 const newtonTol, real64 const time_n, real64 const dt ) { @@ -165,20 +286,20 @@ createAndLaunch( SurfaceElementSubRegion & subRegion, string const & frictionaLawName = subRegion.getReference< string >( frictionLawNameKey ); constitutive::RateAndStateFriction const & frictionLaw = subRegion.getConstitutiveModel< constitutive::RateAndStateFriction >( frictionaLawName ); - RateAndStateKernel kernel( subRegion, frictionLaw, shearImpedance ); + KernelType kernel( subRegion, frictionLaw, shearImpedance ); // Newton loop (outside of the kernel launch) bool allConverged = false; - for( integer iter = 0; iter < maxNewtonIter; iter++ ) + for( integer iter = 0; iter < maxIterNewton; iter++ ) { RAJA::ReduceMin< parallelDeviceReduce, int > converged( 1 ); RAJA::ReduceMax< parallelDeviceReduce, real64 > residualNorm( 0.0 ); forAll< POLICY >( subRegion.size(), [=] GEOS_HOST_DEVICE ( localIndex const k ) { - RateAndStateKernel::StackVariables stack; + typename KernelType::StackVariables stack; kernel.setup( k, dt, stack ); kernel.solve( k, stack ); - auto const [elementConverged, elementResidualNorm] = kernel.checkConvergence( stack, 1.0e-6 ); + auto const [elementConverged, elementResidualNorm] = kernel.checkConvergence( stack, newtonTol ); converged.min( elementConverged ); residualNorm.max( elementResidualNorm ); } ); @@ -202,8 +323,260 @@ createAndLaunch( SurfaceElementSubRegion & subRegion, } ); } +/** + * @brief Butcher table for embedded RK3(2) method using Kuttas third order + * method for the high-order update, and an explicit trapezoidal rule + * based on the first and third stage rates for the low-order update. + */ +struct Kutta32Table +{ + integer constexpr static algHighOrder = 3; // High-order update order + integer constexpr static algLowOrder = 2; // Low-order update order + integer constexpr static numStages = 3; // Number of stages + real64 const a[2][2] = { { 1.0/2.0, 0.0 }, // Coefficients for stage value updates + { -1.0, 2.0 } }; // (lower-triangular part of table). + real64 const c[3] = { 0.0, 1.0/2.0, 1.0 }; // Coefficients for time increments of substages + real64 const b[3] = { 1.0/6.0, 4.0/6.0, 1.0/6.0 }; // Quadrature weights used to step the solution to next time + real64 const bStar[3] = { 1.0/2.0, 0.0, 1.0/2.0 }; // Quadrature weights used for low-order comparision solution + real64 constexpr static FSAL = false; // Not first same as last +}; + +/** + * @brief Butcher table for the BogackiShampine 3(2) method. + */ +struct BogackiShampine32Table +{ + integer constexpr static algHighOrder = 3; // High-order update order + integer constexpr static algLowOrder = 2; // Low-order update order + integer constexpr static numStages = 4; // Number of stages + real64 const a[3][3] = { { 1.0/2.0, 0.0, 0.0 }, // Coefficients for stage value updates + { 0.0, 3.0/4.0, 0.0 }, // (lower-triangular part of table). + { 2.0/9.0, 1.0/3.0, 4.0/9.0 } }; + real64 const c[4] = { 0.0, 1.0/2.0, 3.0/4.0, 1.0 }; // Coefficients for time increments of substages + real64 const b[4] = { 2.0/9.0, 1.0/3.0, 4.0/9.0, 0.0 }; // Quadrature weights used to step the solution to next time + real64 const bStar[4] = { 7.0/24.0, 1.0/4.0, 1.0/3.0, 1.0/8.0}; // Quadrature weights used for low-order comparision solution + bool constexpr static FSAL = true; // First same as last (can reuse the last stage rate in next + // update) +}; + +/** + * @brief Runge-Kutta method used to time integrate slip and state. Uses of a high order + * update used to integrate the solutions, and a lower order update to estimate the error + * in the time step. + * + * @tparam Butcher table defining the Runge-Kutta method. + */ +template< typename TABLE_TYPE > class EmbeddedRungeKuttaKernel +{ + +public: + EmbeddedRungeKuttaKernel( SurfaceElementSubRegion & subRegion, + constitutive::RateAndStateFriction const & frictionLaw, + TABLE_TYPE butcherTable ): + m_stateVariable( subRegion.getField< fields::rateAndState::stateVariable >() ), + m_stateVariable_n( subRegion.getField< fields::rateAndState::stateVariable_n >() ), + m_slipRate( subRegion.getField< fields::rateAndState::slipRate >() ), + m_slipVelocity( subRegion.getField< fields::rateAndState::slipVelocity >() ), + m_slipVelocity_n( subRegion.getField< fields::rateAndState::slipVelocity_n >() ), + m_deltaSlip( subRegion.getField< fields::rateAndState::deltaSlip >() ), + m_deltaSlip_n( subRegion.getField< fields::rateAndState::deltaSlip_n >() ), + m_dispJump( subRegion.getField< fields::contact::dispJump >() ), + m_dispJump_n( subRegion.getField< fields::contact::dispJump_n >() ), + m_error( subRegion.getField< fields::rateAndState::error >() ), + m_stageRates( subRegion.getField< fields::rateAndState::rungeKuttaStageRates >() ), + m_frictionLaw( frictionLaw.createKernelUpdates() ), + m_butcherTable( butcherTable ) + {} + + /** + * @brief Initialize slip and state buffers + */ + GEOS_HOST_DEVICE + void initialize( localIndex const k ) const + { + LvArray::tensorOps::copy< 2 >( m_slipVelocity[k], m_slipVelocity_n[k] ); + m_slipRate[k] = LvArray::tensorOps::l2Norm< 2 >( m_slipVelocity_n[k] ); + m_stateVariable[k] = m_stateVariable_n[k]; + } + + /** + * @brief Re-uses the last stage rate from the previous time step as the first + * in the next update. Only valid for FSAL (first-same-as-last) Runge-Kutta methods. + */ + GEOS_HOST_DEVICE + void updateStageRatesFSAL( localIndex const k ) const + { + LvArray::tensorOps::copy< 3 >( m_stageRates[k][0], m_stageRates[k][m_butcherTable.numStages-1] ); + } + + /** + * @brief Updates the stage rates rates (the right-hand-side of the ODEs for slip and state) + */ + GEOS_HOST_DEVICE + void updateStageRates( localIndex const k, integer const stageIndex ) const + { + m_stageRates[k][stageIndex][0] = m_slipVelocity[k][0]; + m_stageRates[k][stageIndex][1] = m_slipVelocity[k][1]; + m_stageRates[k][stageIndex][2] = m_frictionLaw.stateEvolution( k, m_slipRate[k], m_stateVariable[k] ); + } + + /** + * @brief Update stage values (slip, state and displacement jump) to a Runge-Kutta substage. + */ + GEOS_HOST_DEVICE + void updateStageValues( localIndex const k, integer const stageIndex, real64 const dt ) const + { + + real64 stateVariableIncrement = 0.0; + real64 deltaSlipIncrement[2] = {0.0, 0.0}; + + for( integer i = 0; i < stageIndex; i++ ) + { + deltaSlipIncrement[0] += m_butcherTable.a[stageIndex-1][i] * m_stageRates[k][i][0]; + deltaSlipIncrement[1] += m_butcherTable.a[stageIndex-1][i] * m_stageRates[k][i][1]; + stateVariableIncrement += m_butcherTable.a[stageIndex-1][i] * m_stageRates[k][i][2]; + } + m_deltaSlip[k][0] = m_deltaSlip_n[k][0] + dt*deltaSlipIncrement[0]; + m_deltaSlip[k][1] = m_deltaSlip_n[k][1] + dt*deltaSlipIncrement[1]; + m_stateVariable[k] = m_stateVariable_n[k] + dt*stateVariableIncrement; + + m_dispJump[k][1] = m_dispJump_n[k][1] + m_deltaSlip[k][0]; + m_dispJump[k][2] = m_dispJump_n[k][2] + m_deltaSlip[k][1]; + } + + /** + * @brief Updates slip, state and displacement jump to the next time computes error the local error + * in the time step + */ + GEOS_HOST_DEVICE + void updateSolutionAndLocalError( localIndex const k, real64 const dt, real64 const absTol, real64 const relTol ) const + { + + real64 deltaSlipIncrement[2] = {0.0, 0.0}; + real64 deltaSlipIncrementLowOrder[2] = {0.0, 0.0}; + + real64 stateVariableIncrement = 0.0; + real64 stateVariableIncrementLowOrder = 0.0; + + for( localIndex i = 0; i < m_butcherTable.numStages; i++ ) + { + + // High order update of solution + deltaSlipIncrement[0] += m_butcherTable.b[i] * m_stageRates[k][i][0]; + deltaSlipIncrement[1] += m_butcherTable.b[i] * m_stageRates[k][i][1]; + stateVariableIncrement += m_butcherTable.b[i] * m_stageRates[k][i][2]; + + // Low order update for error + deltaSlipIncrementLowOrder[0] += m_butcherTable.bStar[i] * m_stageRates[k][i][0]; + deltaSlipIncrementLowOrder[1] += m_butcherTable.bStar[i] * m_stageRates[k][i][1]; + stateVariableIncrementLowOrder += m_butcherTable.bStar[i] * m_stageRates[k][i][2]; + } + + m_deltaSlip[k][0] = m_deltaSlip_n[k][0] + dt * deltaSlipIncrement[0]; + m_deltaSlip[k][1] = m_deltaSlip_n[k][1] + dt * deltaSlipIncrement[1]; + m_stateVariable[k] = m_stateVariable_n[k] + dt * stateVariableIncrement; + + real64 const deltaSlipLowOrder[2] = {m_deltaSlip_n[k][0] + dt * deltaSlipIncrementLowOrder[0], + m_deltaSlip_n[k][1] + dt * deltaSlipIncrementLowOrder[1]}; + real64 const stateVariableLowOrder = m_stateVariable_n[k] + dt * stateVariableIncrementLowOrder; + + m_dispJump[k][1] = m_dispJump_n[k][1] + m_deltaSlip[k][0]; + m_dispJump[k][2] = m_dispJump_n[k][2] + m_deltaSlip[k][1]; + + // Compute error + m_error[k][0] = computeError( m_deltaSlip[k][0], deltaSlipLowOrder[0], absTol, relTol ); + m_error[k][1] = computeError( m_deltaSlip[k][1], deltaSlipLowOrder[1], absTol, relTol ); + m_error[k][2] = computeError( m_stateVariable[k], stateVariableLowOrder, absTol, relTol ); + } + + /** + * @brief Updates slip, state and displacement jump to the next time computes error the local error + * in the time step. Uses the FSAL (first-same-as-last) property. + */ + GEOS_HOST_DEVICE + void updateSolutionAndLocalErrorFSAL( localIndex const k, real64 const dt, real64 const absTol, real64 const relTol ) const + { + + real64 deltaSlipIncrementLowOrder[2] = {0.0, 0.0}; + real64 stateVariableIncrementLowOrder = 0.0; + + for( localIndex i = 0; i < m_butcherTable.numStages; i++ ) + { + // In FSAL algorithms the last RK substage update coincides with the + // high-order update. Only need to compute increments for the the + // low-order updates for error computation. + deltaSlipIncrementLowOrder[0] += m_butcherTable.bStar[i] * m_stageRates[k][i][0]; + deltaSlipIncrementLowOrder[1] += m_butcherTable.bStar[i] * m_stageRates[k][i][1]; + stateVariableIncrementLowOrder += m_butcherTable.bStar[i] * m_stageRates[k][i][2]; + } + + real64 const deltaSlipLowOrder[2] = {m_deltaSlip_n[k][0] + dt * deltaSlipIncrementLowOrder[0], + m_deltaSlip_n[k][1] + dt * deltaSlipIncrementLowOrder[1]}; + real64 const stateVariableLowOrder = m_stateVariable_n[k] + dt * stateVariableIncrementLowOrder; + + m_dispJump[k][1] = m_dispJump_n[k][1] + m_deltaSlip[k][0]; + m_dispJump[k][2] = m_dispJump_n[k][2] + m_deltaSlip[k][1]; + + // Compute error + m_error[k][0] = computeError( m_deltaSlip[k][0], deltaSlipLowOrder[0], absTol, relTol ); + m_error[k][1] = computeError( m_deltaSlip[k][1], deltaSlipLowOrder[1], absTol, relTol ); + m_error[k][2] = computeError( m_stateVariable[k], stateVariableLowOrder, absTol, relTol ); + } + + /** + * @brief Computes the relative error scaled by error tolerances + */ + GEOS_HOST_DEVICE + real64 computeError( real64 const highOrderApprox, real64 const lowOrderApprox, real64 const absTol, real64 const relTol ) const + { + return (highOrderApprox - lowOrderApprox) / + ( absTol + relTol * LvArray::math::max( LvArray::math::abs( highOrderApprox ), LvArray::math::abs( lowOrderApprox ) )); + } + +private: + + /// Current state variable + arrayView1d< real64 > const m_stateVariable; + + /// State variable at t = t_n + arrayView1d< real64 > const m_stateVariable_n; + + /// Current slip rate (magnitude of slip velocity) + arrayView1d< real64 > const m_slipRate; + + /// Current slip velocity + arrayView2d< real64 > const m_slipVelocity; + + /// Slip velocity at time t_n + arrayView2d< real64 > const m_slipVelocity_n; + + /// Current slip change + arrayView2d< real64 > const m_deltaSlip; + + /// Slip change at time t_n + arrayView2d< real64 > const m_deltaSlip_n; + + /// Current displacment jump + arrayView2d< real64 > const m_dispJump; + + /// Displacment jump at time t_n + arrayView2d< real64 > const m_dispJump_n; + + /// Local error for each solution component stored as slip1, slip2, state + arrayView2d< real64 > const m_error; + + /// Stage rates for each solution component stored as slip1, slip2, state + arrayView3d< real64 > const m_stageRates; + + /// Friction law used for rate-and-state updates + constitutive::RateAndStateFriction::KernelWrapper m_frictionLaw; + + /// Butcher table used for explicit time stepping of slip and state + TABLE_TYPE m_butcherTable; +}; + } /* namespace rateAndStateKernels */ -}/* namespace geos */ +} /* namespace geos */ #endif /* GEOS_PHYSICSSOLVERS_RATEANDSTATEKERNELS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp index 8031ab1c344..df5e63a2d19 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp @@ -36,10 +36,26 @@ DECLARE_FIELD( slipRate, "slipRate", array1d< real64 >, 1.0e-6, - LEVEL_0, + NOPLOT, WRITE_AND_READ, "Slip rate" ); +DECLARE_FIELD( slipVelocity, + "slipVelocity", + array2d< real64 >, + 0.70710678118e-6, + LEVEL_0, + WRITE_AND_READ, + "Slip velocity" ); + +DECLARE_FIELD( slipVelocity_n, + "slipVelocity_n", + array2d< real64 >, + 0.70710678118e-6, + NOPLOT, + WRITE_AND_READ, + "Slip velocity at previous time step" ); + DECLARE_FIELD( stateVariable, "stateVariable", array1d< real64 >, @@ -48,21 +64,14 @@ DECLARE_FIELD( stateVariable, WRITE_AND_READ, "Rate- and state-dependent friction state variable" ); -DECLARE_FIELD( slipVelocity, - "slipVelocity", - array2d< real64 >, - 1.0e-6, - LEVEL_0, - WRITE_AND_READ, - "Slip velocity" ); - DECLARE_FIELD( stateVariable_n, "stateVariable_n", array1d< real64 >, 0.6, NOPLOT, WRITE_AND_READ, - "Rate- and state-dependent friction state variable at previous time step" ); + "Initial rate- and state-dependent friction state variable at this time step" ); + DECLARE_FIELD( deltaSlip, "deltaSlip", @@ -72,6 +81,31 @@ DECLARE_FIELD( deltaSlip, WRITE_AND_READ, "Slip increment" ); +DECLARE_FIELD( deltaSlip_n, + "deltaSlip_n", + array2d< real64 >, + 0.0, + NOPLOT, + WRITE_AND_READ, + "Initial slip increment at this time step" ); + + +DECLARE_FIELD( rungeKuttaStageRates, + "rungeKuttaStageRates", + array3d< real64 >, + 0.0, + NOPLOT, + WRITE_AND_READ, + "Runge-Kutta stage rates for rate-and-state variables" ); + + +DECLARE_FIELD( error, + "error", + array2d< real64 >, + 0.0, + LEVEL_0, + WRITE_AND_READ, + "Error for rate-and-state fields" ); } diff --git a/src/coreComponents/schema/schema.xsd b/src/coreComponents/schema/schema.xsd index 7a6e7967c03..e130b1e56d4 100644 --- a/src/coreComponents/schema/schema.xsd +++ b/src/coreComponents/schema/schema.xsd @@ -399,6 +399,10 @@ + + + + @@ -2109,6 +2113,11 @@ the relative residual norm satisfies: + + @@ -2125,6 +2134,11 @@ the relative residual norm satisfies: + + @@ -2139,6 +2153,11 @@ the relative residual norm satisfies: + + @@ -2147,6 +2166,11 @@ the relative residual norm satisfies: + + @@ -2157,6 +2181,11 @@ the relative residual norm satisfies: + + @@ -2195,7 +2224,7 @@ the relative residual norm satisfies: - + @@ -2262,6 +2291,7 @@ the relative residual norm satisfies: + @@ -2647,6 +2677,8 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + @@ -2734,6 +2766,8 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + @@ -3211,7 +3245,7 @@ Level 0 outputs no specific information for this solver. Higher levels require m - + @@ -3234,7 +3268,7 @@ Local- Add jump stabilization on interior of macro elements--> - + @@ -3538,6 +3572,41 @@ Level 0 outputs no specific information for this solver. Higher levels require m + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/schema/schema.xsd.other b/src/coreComponents/schema/schema.xsd.other index 33386f19956..3abf5b863f0 100644 --- a/src/coreComponents/schema/schema.xsd.other +++ b/src/coreComponents/schema/schema.xsd.other @@ -486,7 +486,7 @@ - + @@ -538,6 +538,7 @@ + @@ -571,7 +572,7 @@ - + @@ -608,7 +609,7 @@ - + @@ -659,7 +660,7 @@ - + @@ -700,7 +701,7 @@ - + @@ -733,7 +734,7 @@ - + @@ -744,7 +745,7 @@ - + @@ -757,7 +758,7 @@ - + @@ -770,7 +771,7 @@ - + @@ -786,7 +787,7 @@ - + @@ -820,7 +821,7 @@ - + @@ -883,7 +884,7 @@ - + @@ -914,7 +915,7 @@ - + @@ -927,7 +928,7 @@ - + @@ -940,7 +941,7 @@ - + @@ -953,7 +954,7 @@ - + @@ -966,7 +967,7 @@ - + @@ -981,7 +982,7 @@ - + @@ -992,7 +993,7 @@ - + @@ -1005,7 +1006,7 @@ - + @@ -1016,7 +1017,7 @@ - + @@ -1027,7 +1028,18 @@ - + + + + + + + + + + + + @@ -1038,7 +1050,7 @@ - + @@ -1051,7 +1063,7 @@ - + @@ -1062,7 +1074,7 @@ - + @@ -1073,7 +1085,7 @@ - + @@ -1086,7 +1098,7 @@ - + @@ -1101,7 +1113,7 @@ - + @@ -1116,7 +1128,7 @@ - + @@ -1129,7 +1141,7 @@ - + @@ -1144,7 +1156,7 @@ - + @@ -1155,7 +1167,7 @@ - + @@ -1168,7 +1180,7 @@ - + @@ -1181,7 +1193,7 @@ - + @@ -1196,7 +1208,7 @@ - + @@ -1212,7 +1224,7 @@ - + @@ -1227,7 +1239,7 @@ - + @@ -1244,7 +1256,7 @@ - + @@ -1261,7 +1273,7 @@ - + @@ -1278,7 +1290,7 @@ - + @@ -1293,7 +1305,7 @@ - + @@ -1306,7 +1318,7 @@ - + @@ -1345,7 +1357,7 @@ - + @@ -1374,7 +1386,7 @@ - + @@ -1467,7 +1479,7 @@ - + @@ -3091,7 +3103,7 @@ - + @@ -3119,7 +3131,7 @@ - + @@ -3138,11 +3150,11 @@ - + - + @@ -3152,7 +3164,7 @@ - + @@ -3162,11 +3174,11 @@ - + - + @@ -3176,7 +3188,7 @@ - + @@ -3186,7 +3198,7 @@ - + @@ -3196,7 +3208,7 @@ - + @@ -3220,7 +3232,7 @@ - + @@ -3238,7 +3250,7 @@ - + @@ -3250,7 +3262,7 @@ - + @@ -3262,7 +3274,7 @@ - + @@ -3270,11 +3282,11 @@ - + - + @@ -3297,7 +3309,7 @@ - + @@ -3323,7 +3335,7 @@ - + @@ -3344,7 +3356,7 @@ - + @@ -3374,7 +3386,7 @@ - + @@ -3388,7 +3400,7 @@ - + @@ -3415,7 +3427,7 @@ - + @@ -3454,7 +3466,7 @@ - + From 651c600a996637f0b761b1f9dc632a77eb0ce90d Mon Sep 17 00:00:00 2001 From: Randolph Settgast Date: Wed, 11 Dec 2024 09:07:51 -0800 Subject: [PATCH 276/286] fix: change Total S.A. to TotalEnergies (#3487) * change Total S.A. to TotalEnergies * update PVTPackage submodule * remove RELEASE and RELEASE_NOTES.md --- COPYRIGHT | 2 +- RELEASE | 13 --- RELEASE_NOTES.md | 82 ------------------- examples/ObjectCatalog/Base.hpp | 2 +- examples/ObjectCatalog/Derived1.cpp | 2 +- examples/ObjectCatalog/Derived1.hpp | 2 +- examples/ObjectCatalog/Derived2.cpp | 9 +- examples/ObjectCatalog/Derived2.hpp | 2 +- examples/ObjectCatalog/main.cpp | 2 +- scripts/copyrightPrepender.py | 11 +-- .../blueos_3_ppc64le_ib_p9/spack.yaml | 8 +- .../toss_4_x86_64_ib/spack.yaml | 8 +- .../blueos_3_ppc64le_ib_p9/spack.yaml | 8 +- .../spack_configs/toss_3_x86_64_ib/spack.yaml | 8 +- .../spack_configs/toss_4_x86_64_ib/spack.yaml | 8 +- .../codingUtilities/CMakeLists.txt | 2 +- .../codingUtilities/Parsing.cpp | 2 +- .../codingUtilities/Parsing.hpp | 2 +- .../codingUtilities/RTTypes.cpp | 2 +- .../codingUtilities/RTTypes.hpp | 2 +- .../codingUtilities/SFINAE_Macros.hpp | 2 +- .../codingUtilities/UnitTestUtilities.hpp | 2 +- .../codingUtilities/Utilities.hpp | 2 +- .../codingUtilities/tests/testGeosxTraits.cpp | 2 +- .../tests/testParallelTestUtilities.cpp | 2 +- .../codingUtilities/tests/testParsing.cpp | 2 +- .../codingUtilities/tests/testUtilities.cpp | 2 +- src/coreComponents/codingUtilities/traits.hpp | 2 +- src/coreComponents/common/BufferAllocator.cpp | 2 +- src/coreComponents/common/BufferAllocator.hpp | 2 +- src/coreComponents/common/CMakeLists.txt | 2 +- src/coreComponents/common/DataLayouts.hpp | 2 +- src/coreComponents/common/DataTypes.hpp | 2 +- .../common/FieldSpecificationOps.hpp | 2 +- src/coreComponents/common/FixedSizeDeque.hpp | 2 +- .../common/FixedSizeDequeWithMutexes.hpp | 2 +- .../common/GEOS_RAJA_Interface.hpp | 2 +- src/coreComponents/common/GeosxConfig.hpp.in | 2 +- src/coreComponents/common/GeosxMacros.hpp | 2 +- src/coreComponents/common/LifoStorage.hpp | 2 +- .../common/LifoStorageCommon.hpp | 2 +- src/coreComponents/common/LifoStorageCuda.hpp | 2 +- src/coreComponents/common/LifoStorageHost.hpp | 2 +- src/coreComponents/common/MemoryInfos.cpp | 2 +- src/coreComponents/common/MemoryInfos.hpp | 2 +- src/coreComponents/common/MpiWrapper.cpp | 2 +- src/coreComponents/common/MpiWrapper.hpp | 2 +- .../common/MultiMutexesLock.hpp | 2 +- src/coreComponents/common/Path.cpp | 2 +- src/coreComponents/common/Path.hpp | 2 +- .../common/PhysicsConstants.hpp | 2 +- src/coreComponents/common/Span.hpp | 2 +- src/coreComponents/common/Stopwatch.hpp | 2 +- src/coreComponents/common/Tensor.hpp | 2 +- src/coreComponents/common/Timer.hpp | 2 +- src/coreComponents/common/TimingMacros.hpp | 2 +- src/coreComponents/common/TypeDispatch.hpp | 2 +- src/coreComponents/common/Units.cpp | 2 +- src/coreComponents/common/Units.hpp | 2 +- .../common/format/EnumStrings.hpp | 2 +- src/coreComponents/common/format/Format.hpp | 2 +- .../common/format/StringUtilities.cpp | 2 +- .../common/format/StringUtilities.hpp | 2 +- .../common/format/table/TableData.cpp | 2 +- .../common/format/table/TableData.hpp | 2 +- .../common/format/table/TableFormatter.cpp | 2 +- .../common/format/table/TableFormatter.hpp | 2 +- .../common/format/table/TableLayout.cpp | 2 +- .../common/format/table/TableLayout.hpp | 2 +- .../format/table/unitTests/testTable.cpp | 2 +- .../format/unitTests/testStringUtilities.cpp | 2 +- .../common/initializeEnvironment.cpp | 2 +- .../common/initializeEnvironment.hpp | 2 +- src/coreComponents/common/logger/Logger.cpp | 2 +- src/coreComponents/common/logger/Logger.hpp | 2 +- .../common/unitTests/testCaliperSmoke.cpp | 2 +- .../common/unitTests/testDataTypes.cpp | 2 +- .../common/unitTests/testFixedSizeDeque.cpp | 2 +- .../common/unitTests/testLifoStorage.cpp | 2 +- .../common/unitTests/testTypeDispatch.cpp | 2 +- .../common/unitTests/testUnits.cpp | 2 +- .../constitutive/CMakeLists.txt | 2 +- .../constitutive/ConstitutiveBase.cpp | 2 +- .../constitutive/ConstitutiveBase.hpp | 2 +- .../constitutive/ConstitutiveManager.cpp | 2 +- .../constitutive/ConstitutiveManager.hpp | 2 +- .../constitutive/ConstitutivePassThru.hpp | 2 +- .../ConstitutivePassThruHandler.hpp | 2 +- .../constitutive/ExponentialRelation.hpp | 2 +- src/coreComponents/constitutive/NullModel.cpp | 2 +- src/coreComponents/constitutive/NullModel.hpp | 2 +- src/coreComponents/constitutive/PVTPackage | 2 +- .../BrooksCoreyCapillaryPressure.cpp | 2 +- .../BrooksCoreyCapillaryPressure.hpp | 2 +- .../CapillaryPressureBase.cpp | 2 +- .../CapillaryPressureBase.hpp | 2 +- .../CapillaryPressureFields.hpp | 2 +- .../JFunctionCapillaryPressure.cpp | 2 +- .../JFunctionCapillaryPressure.hpp | 2 +- .../TableCapillaryPressure.cpp | 2 +- .../TableCapillaryPressure.hpp | 2 +- .../TableCapillaryPressureHelpers.cpp | 2 +- .../TableCapillaryPressureHelpers.hpp | 2 +- .../VanGenuchtenCapillaryPressure.cpp | 2 +- .../VanGenuchtenCapillaryPressure.hpp | 2 +- .../capillaryPressureSelector.hpp | 2 +- .../capillaryPressure/layouts.hpp | 2 +- .../constitutive/contact/BartonBandis.cpp | 9 +- .../constitutive/contact/BartonBandis.hpp | 9 +- .../constitutive/contact/CoulombFriction.cpp | 2 +- .../constitutive/contact/CoulombFriction.hpp | 2 +- .../constitutive/contact/FrictionBase.cpp | 9 +- .../constitutive/contact/FrictionBase.hpp | 9 +- .../constitutive/contact/FrictionSelector.hpp | 2 +- .../contact/FrictionlessContact.cpp | 2 +- .../contact/FrictionlessContact.hpp | 2 +- .../contact/HydraulicApertureBase.cpp | 9 +- .../contact/HydraulicApertureBase.hpp | 9 +- .../HydraulicApertureRelationSelector.hpp | 9 +- .../contact/HydraulicApertureTable.cpp | 2 +- .../contact/HydraulicApertureTable.hpp | 2 +- .../contact/RateAndStateFriction.cpp | 2 +- .../contact/RateAndStateFriction.hpp | 2 +- .../diffusion/ConstantDiffusion.cpp | 2 +- .../diffusion/ConstantDiffusion.hpp | 2 +- .../constitutive/diffusion/DiffusionBase.cpp | 2 +- .../constitutive/diffusion/DiffusionBase.hpp | 2 +- .../diffusion/DiffusionFields.hpp | 2 +- .../diffusion/DiffusionSelector.hpp | 2 +- .../dispersion/DispersionBase.cpp | 2 +- .../dispersion/DispersionBase.hpp | 2 +- .../dispersion/DispersionFields.hpp | 2 +- .../dispersion/DispersionSelector.hpp | 2 +- .../dispersion/LinearIsotropicDispersion.cpp | 2 +- .../dispersion/LinearIsotropicDispersion.hpp | 2 +- .../multifluid/CO2Brine/CO2BrineFluid.cpp | 2 +- .../multifluid/CO2Brine/CO2BrineFluid.hpp | 2 +- .../fluid/multifluid/CO2Brine/PhaseModel.hpp | 2 +- .../CO2Brine/functions/BrineEnthalpy.cpp | 2 +- .../CO2Brine/functions/BrineEnthalpy.hpp | 2 +- .../CO2Brine/functions/CO2EOSSolver.cpp | 2 +- .../CO2Brine/functions/CO2EOSSolver.hpp | 2 +- .../CO2Brine/functions/CO2Enthalpy.cpp | 2 +- .../CO2Brine/functions/CO2Enthalpy.hpp | 2 +- .../CO2Brine/functions/CO2Solubility.cpp | 2 +- .../CO2Brine/functions/CO2Solubility.hpp | 2 +- .../functions/CO2SolubilityDuanSun.cpp | 2 +- .../functions/CO2SolubilityDuanSun.hpp | 2 +- .../functions/CO2SolubilitySpycherPruess.cpp | 2 +- .../functions/CO2SolubilitySpycherPruess.hpp | 2 +- .../functions/EzrokhiBrineDensity.cpp | 2 +- .../functions/EzrokhiBrineDensity.hpp | 2 +- .../functions/EzrokhiBrineViscosity.cpp | 2 +- .../functions/EzrokhiBrineViscosity.hpp | 2 +- .../functions/FenghourCO2Viscosity.cpp | 2 +- .../functions/FenghourCO2Viscosity.hpp | 2 +- .../CO2Brine/functions/FlashModelBase.hpp | 2 +- .../CO2Brine/functions/NoOpPVTFunction.hpp | 2 +- .../CO2Brine/functions/PVTFunctionBase.hpp | 2 +- .../CO2Brine/functions/PVTFunctionHelpers.cpp | 2 +- .../CO2Brine/functions/PVTFunctionHelpers.hpp | 2 +- .../functions/PhillipsBrineDensity.cpp | 2 +- .../functions/PhillipsBrineDensity.hpp | 2 +- .../functions/PhillipsBrineViscosity.cpp | 2 +- .../functions/PhillipsBrineViscosity.hpp | 2 +- .../functions/PureWaterProperties.cpp | 2 +- .../functions/PureWaterProperties.hpp | 2 +- .../functions/SpanWagnerCO2Density.cpp | 2 +- .../functions/SpanWagnerCO2Density.hpp | 2 +- .../CO2Brine/functions/WaterDensity.cpp | 2 +- .../CO2Brine/functions/WaterDensity.hpp | 2 +- .../constitutive/fluid/multifluid/Layouts.hpp | 2 +- .../fluid/multifluid/MultiFluidBase.cpp | 2 +- .../fluid/multifluid/MultiFluidBase.hpp | 2 +- .../fluid/multifluid/MultiFluidConstants.hpp | 2 +- .../fluid/multifluid/MultiFluidFields.hpp | 2 +- .../fluid/multifluid/MultiFluidSelector.hpp | 2 +- .../fluid/multifluid/MultiFluidUtils.hpp | 2 +- .../multifluid/blackOil/BlackOilFluid.cpp | 2 +- .../multifluid/blackOil/BlackOilFluid.hpp | 2 +- .../multifluid/blackOil/BlackOilFluidBase.cpp | 2 +- .../multifluid/blackOil/BlackOilFluidBase.hpp | 2 +- .../multifluid/blackOil/DeadOilFluid.cpp | 2 +- .../multifluid/blackOil/DeadOilFluid.hpp | 2 +- .../fluid/multifluid/blackOil/PVTOData.cpp | 2 +- .../fluid/multifluid/blackOil/PVTOData.hpp | 2 +- .../CompositionalMultiphaseFluid.cpp | 2 +- .../CompositionalMultiphaseFluid.hpp | 2 +- ...CompositionalMultiphaseFluidPVTPackage.cpp | 2 +- ...CompositionalMultiphaseFluidPVTPackage.hpp | 2 +- .../CompositionalMultiphaseFluidUpdates.cpp | 2 +- .../CompositionalMultiphaseFluidUpdates.hpp | 2 +- .../functions/CompositionalProperties.hpp | 2 +- .../functions/CompositionalPropertiesImpl.hpp | 2 +- .../functions/CubicEOSPhaseModel.hpp | 2 +- .../functions/FugacityCalculator.hpp | 2 +- .../functions/KValueInitialization.hpp | 2 +- .../functions/NegativeTwoPhaseFlash.hpp | 2 +- .../compositional/functions/RachfordRice.hpp | 2 +- .../compositional/functions/StabilityTest.hpp | 2 +- .../models/ComponentProperties.hpp | 2 +- .../models/CompositionalDensity.cpp | 2 +- .../models/CompositionalDensity.hpp | 2 +- .../models/ConstantViscosity.cpp | 2 +- .../models/ConstantViscosity.hpp | 2 +- .../compositional/models/CriticalVolume.cpp | 9 +- .../compositional/models/CriticalVolume.hpp | 9 +- .../compositional/models/EquationOfState.hpp | 2 +- .../compositional/models/FunctionBase.hpp | 2 +- .../models/ImmiscibleWaterDensity.cpp | 2 +- .../models/ImmiscibleWaterDensity.hpp | 2 +- .../models/ImmiscibleWaterFlashModel.cpp | 2 +- .../models/ImmiscibleWaterFlashModel.hpp | 2 +- .../models/ImmiscibleWaterParameters.cpp | 2 +- .../models/ImmiscibleWaterParameters.hpp | 2 +- .../models/ImmiscibleWaterViscosity.cpp | 2 +- .../models/ImmiscibleWaterViscosity.hpp | 2 +- .../models/LohrenzBrayClarkViscosity.cpp | 2 +- .../models/LohrenzBrayClarkViscosity.hpp | 2 +- .../models/LohrenzBrayClarkViscosityImpl.hpp | 2 +- .../compositional/models/ModelParameters.hpp | 2 +- .../models/NegativeTwoPhaseFlashModel.cpp | 2 +- .../models/NegativeTwoPhaseFlashModel.hpp | 2 +- .../compositional/models/NullModel.hpp | 2 +- .../compositional/models/PhaseModel.hpp | 2 +- .../reactive/ReactiveBrineFluid.cpp | 2 +- .../reactive/ReactiveBrineFluid.hpp | 2 +- .../reactive/ReactiveFluidSelector.hpp | 2 +- .../reactive/ReactiveMultiFluid.cpp | 2 +- .../reactive/ReactiveMultiFluid.hpp | 2 +- .../reactive/ReactiveMultiFluidFields.hpp | 2 +- .../EquilibriumReactions.cpp | 2 +- .../EquilibriumReactions.hpp | 2 +- .../chemicalReactions/KineticReactions.cpp | 2 +- .../chemicalReactions/KineticReactions.hpp | 2 +- .../chemicalReactions/ReactionsBase.cpp | 2 +- .../chemicalReactions/ReactionsBase.hpp | 2 +- .../CompressibleSinglePhaseFluid.cpp | 2 +- .../CompressibleSinglePhaseFluid.hpp | 2 +- .../fluid/singlefluid/ParticleFluid.cpp | 2 +- .../fluid/singlefluid/ParticleFluid.hpp | 2 +- .../fluid/singlefluid/ParticleFluidBase.cpp | 2 +- .../fluid/singlefluid/ParticleFluidBase.hpp | 2 +- .../fluid/singlefluid/ParticleFluidFields.hpp | 2 +- .../singlefluid/ParticleFluidSelector.hpp | 2 +- .../fluid/singlefluid/ProppantSlurryFluid.cpp | 2 +- .../fluid/singlefluid/ProppantSlurryFluid.hpp | 2 +- .../fluid/singlefluid/SingleFluidBase.cpp | 2 +- .../fluid/singlefluid/SingleFluidBase.hpp | 2 +- .../fluid/singlefluid/SingleFluidFields.hpp | 2 +- .../fluid/singlefluid/SingleFluidSelector.hpp | 2 +- .../fluid/singlefluid/SlurryFluidBase.cpp | 2 +- .../fluid/singlefluid/SlurryFluidBase.hpp | 2 +- .../fluid/singlefluid/SlurryFluidFields.hpp | 2 +- .../fluid/singlefluid/SlurryFluidSelector.hpp | 2 +- .../ThermalCompressibleSinglePhaseFluid.cpp | 2 +- .../ThermalCompressibleSinglePhaseFluid.hpp | 2 +- .../permeability/CarmanKozenyPermeability.cpp | 2 +- .../permeability/CarmanKozenyPermeability.hpp | 2 +- .../permeability/ConstantPermeability.cpp | 2 +- .../permeability/ConstantPermeability.hpp | 2 +- .../ExponentialDecayPermeability.cpp | 2 +- .../ExponentialDecayPermeability.hpp | 2 +- .../ParallelPlatesPermeability.cpp | 2 +- .../ParallelPlatesPermeability.hpp | 2 +- .../permeability/PermeabilityBase.cpp | 2 +- .../permeability/PermeabilityBase.hpp | 2 +- .../permeability/PermeabilityFields.hpp | 2 +- .../permeability/PressurePermeability.cpp | 2 +- .../permeability/PressurePermeability.hpp | 2 +- .../permeability/ProppantPermeability.cpp | 2 +- .../permeability/ProppantPermeability.hpp | 2 +- .../SlipDependentPermeability.cpp | 2 +- .../SlipDependentPermeability.hpp | 2 +- .../WillisRichardsPermeability.cpp | 2 +- .../WillisRichardsPermeability.hpp | 2 +- .../BrooksCoreyBakerRelativePermeability.cpp | 2 +- .../BrooksCoreyBakerRelativePermeability.hpp | 2 +- .../BrooksCoreyRelativePermeability.cpp | 2 +- .../BrooksCoreyRelativePermeability.hpp | 2 +- .../BrooksCoreyStone2RelativePermeability.cpp | 2 +- .../BrooksCoreyStone2RelativePermeability.hpp | 2 +- .../RelativePermeabilityBase.cpp | 2 +- .../RelativePermeabilityBase.hpp | 2 +- .../RelativePermeabilityFields.hpp | 2 +- .../RelativePermeabilityInterpolators.hpp | 2 +- .../RelativePermeabilitySelector.hpp | 2 +- .../TableRelativePermeability.cpp | 2 +- .../TableRelativePermeability.hpp | 2 +- .../TableRelativePermeabilityHelpers.cpp | 2 +- .../TableRelativePermeabilityHelpers.hpp | 2 +- .../TableRelativePermeabilityHysteresis.cpp | 2 +- .../TableRelativePermeabilityHysteresis.hpp | 2 +- .../VanGenuchtenBakerRelativePermeability.cpp | 2 +- .../VanGenuchtenBakerRelativePermeability.hpp | 2 +- ...VanGenuchtenStone2RelativePermeability.cpp | 2 +- ...VanGenuchtenStone2RelativePermeability.hpp | 2 +- .../relativePermeability/layouts.hpp | 2 +- .../constitutive/solid/CeramicDamage.cpp | 2 +- .../constitutive/solid/CeramicDamage.hpp | 2 +- .../constitutive/solid/CompressibleSolid.cpp | 2 +- .../constitutive/solid/CompressibleSolid.hpp | 2 +- .../constitutive/solid/CoupledSolid.hpp | 2 +- .../constitutive/solid/CoupledSolidBase.cpp | 2 +- .../constitutive/solid/CoupledSolidBase.hpp | 2 +- .../constitutive/solid/Damage.cpp | 2 +- .../constitutive/solid/Damage.hpp | 2 +- .../constitutive/solid/DamageSpectral.cpp | 2 +- .../constitutive/solid/DamageSpectral.hpp | 2 +- .../solid/DamageSpectralUtilities.hpp | 2 +- .../constitutive/solid/DamageVolDev.cpp | 2 +- .../constitutive/solid/DamageVolDev.hpp | 2 +- .../constitutive/solid/DelftEgg.cpp | 2 +- .../constitutive/solid/DelftEgg.hpp | 2 +- .../PoreVolumeCompressibleSolid.cpp | 2 +- .../PoreVolumeCompressibleSolid.hpp | 2 +- .../solid/Deprecated/PoroElastic.cpp | 2 +- .../solid/Deprecated/PoroElastic.hpp | 2 +- .../constitutive/solid/DruckerPrager.cpp | 2 +- .../constitutive/solid/DruckerPrager.hpp | 2 +- .../solid/DruckerPragerExtended.cpp | 2 +- .../solid/DruckerPragerExtended.hpp | 2 +- .../constitutive/solid/DuvautLionsSolid.cpp | 2 +- .../constitutive/solid/DuvautLionsSolid.hpp | 2 +- .../constitutive/solid/ElasticIsotropic.cpp | 2 +- .../constitutive/solid/ElasticIsotropic.hpp | 2 +- .../ElasticIsotropicPressureDependent.cpp | 2 +- .../ElasticIsotropicPressureDependent.hpp | 2 +- .../constitutive/solid/ElasticOrthotropic.cpp | 2 +- .../constitutive/solid/ElasticOrthotropic.hpp | 2 +- .../solid/ElasticTransverseIsotropic.cpp | 2 +- .../solid/ElasticTransverseIsotropic.hpp | 2 +- .../solid/InvariantDecompositions.hpp | 2 +- .../constitutive/solid/ModifiedCamClay.cpp | 2 +- .../constitutive/solid/ModifiedCamClay.hpp | 2 +- .../constitutive/solid/PerfectlyPlastic.cpp | 2 +- .../constitutive/solid/PerfectlyPlastic.hpp | 2 +- .../constitutive/solid/PorousSolid.cpp | 2 +- .../constitutive/solid/PorousSolid.hpp | 2 +- .../solid/PropertyConversions.hpp | 2 +- .../constitutive/solid/ProppantSolid.cpp | 2 +- .../constitutive/solid/ProppantSolid.hpp | 2 +- .../constitutive/solid/SolidBase.cpp | 2 +- .../constitutive/solid/SolidBase.hpp | 2 +- .../solid/SolidInternalEnergy.cpp | 2 +- .../solid/SolidInternalEnergy.hpp | 2 +- .../solid/SolidModelDiscretizationOps.hpp | 2 +- ...odelDiscretizationOpsFullyAnisotroipic.hpp | 2 +- .../SolidModelDiscretizationOpsIsotropic.hpp | 2 +- ...SolidModelDiscretizationOpsOrthotropic.hpp | 2 +- ...elDiscretizationOpsTransverseIsotropic.hpp | 2 +- .../constitutive/solid/SolidUtilities.hpp | 2 +- .../solid/porosity/BiotPorosity.cpp | 2 +- .../solid/porosity/BiotPorosity.hpp | 2 +- .../solid/porosity/PorosityBase.cpp | 2 +- .../solid/porosity/PorosityBase.hpp | 2 +- .../solid/porosity/PorosityFields.hpp | 2 +- .../solid/porosity/PressurePorosity.cpp | 2 +- .../solid/porosity/PressurePorosity.hpp | 2 +- .../solid/porosity/ProppantPorosity.cpp | 2 +- .../solid/porosity/ProppantPorosity.hpp | 2 +- .../MultiPhaseConstantThermalConductivity.cpp | 2 +- .../MultiPhaseConstantThermalConductivity.hpp | 2 +- .../MultiPhaseThermalConductivityBase.cpp | 2 +- .../MultiPhaseThermalConductivityBase.hpp | 2 +- .../MultiPhaseThermalConductivityFields.hpp | 2 +- .../MultiPhaseThermalConductivitySelector.hpp | 2 +- ...PhaseVolumeWeightedThermalConductivity.cpp | 2 +- ...PhaseVolumeWeightedThermalConductivity.hpp | 2 +- .../SinglePhaseThermalConductivity.cpp | 2 +- .../SinglePhaseThermalConductivity.hpp | 2 +- .../SinglePhaseThermalConductivityBase.cpp | 2 +- .../SinglePhaseThermalConductivityBase.hpp | 2 +- ...SinglePhaseThermalConductivitySelector.hpp | 2 +- .../ThermalConductivityFields.hpp | 2 +- .../constitutive/unitTests/TestFluid.hpp | 2 +- .../unitTests/TestFluidUtilities.hpp | 2 +- .../unitTests/testCompositionalDensity.cpp | 2 +- .../unitTests/testCompositionalProperties.cpp | 2 +- .../constitutive/unitTests/testCubicEOS.cpp | 2 +- .../unitTests/testDamageUtilities.cpp | 2 +- .../unitTests/testDruckerPrager.cpp | 2 +- .../unitTests/testElasticIsotropic.cpp | 2 +- .../testImmiscibleWaterFlashModel.cpp | 2 +- .../testImmiscibleWaterProperties.cpp | 2 +- .../unitTests/testKValueInitialization.cpp | 2 +- .../testLohrenzBrayClarkViscosity.cpp | 2 +- .../unitTests/testModifiedCamClay.cpp | 2 +- .../unitTests/testMultiFluidSelector.cpp | 9 +- .../unitTests/testNegativeTwoPhaseFlash.cpp | 2 +- .../testNegativeTwoPhaseFlash9Comp.cpp | 2 +- .../unitTests/testParticleFluidEnums.cpp | 2 +- .../unitTests/testPropertyConversions.cpp | 2 +- .../unitTests/testRachfordRice.cpp | 2 +- .../unitTests/testStabilityTest2Comp.cpp | 2 +- .../unitTests/testStabilityTest9Comp.cpp | 2 +- .../constitutive/unitTests/testTriaxial.cpp | 2 +- .../constitutiveDrivers/CMakeLists.txt | 2 +- .../PVTDriverRunTestCO2BrineEzrokhiFluid.cpp | 2 +- ...iverRunTestCO2BrineEzrokhiThermalFluid.cpp | 2 +- .../PVTDriverRunTestCO2BrinePhillipsFluid.cpp | 2 +- ...verRunTestCO2BrinePhillipsThermalFluid.cpp | 2 +- .../fluid/multiFluid/PVTDriver.cpp | 2 +- .../fluid/multiFluid/PVTDriver.hpp | 2 +- .../fluid/multiFluid/PVTDriverRunTest.hpp | 2 +- .../blackOil/PVTDriverRunTestDeadOilFluid.cpp | 2 +- ...verRunTestCompositionalMultiphaseFluid.cpp | 2 +- ...nalThreePhaseLohrenzBrayClarkViscosity.cpp | 2 +- ...CompositionalTwoPhaseConstantViscosity.cpp | 2 +- ...ionalTwoPhaseLohrenzBrayClarkViscosity.cpp | 2 +- .../reactive/ReactiveFluidDriver.cpp | 2 +- .../reactive/ReactiveFluidDriver.hpp | 2 +- .../relativePermeability/RelpermDriver.cpp | 2 +- .../relativePermeability/RelpermDriver.hpp | 2 +- .../RelpermDriverBrooksCoreyBakerRunTest.cpp | 2 +- .../RelpermDriverBrooksCoreyRunTest.cpp | 2 +- .../RelpermDriverBrooksCoreyStone2RunTest.cpp | 2 +- .../RelpermDriverRunTest.hpp | 2 +- ...rmDriverTableRelativeHysteresisRunTest.cpp | 2 +- .../RelpermDriverTableRelativeRunTest.cpp | 2 +- .../RelpermDriverVanGenuchtenBakerRunTest.cpp | 2 +- ...RelpermDriverVanGenuchtenStone2RunTest.cpp | 2 +- .../solid/TriaxialDriver.cpp | 2 +- .../solid/TriaxialDriver.hpp | 2 +- .../dataRepository/BufferOps.hpp | 2 +- .../dataRepository/BufferOpsDevice.cpp | 2 +- .../dataRepository/BufferOpsDevice.hpp | 2 +- .../dataRepository/BufferOps_inline.hpp | 2 +- .../dataRepository/CMakeLists.txt | 2 +- .../dataRepository/ConduitRestart.cpp | 2 +- .../dataRepository/ConduitRestart.hpp | 2 +- .../dataRepository/DataContext.cpp | 2 +- .../dataRepository/DataContext.hpp | 2 +- .../dataRepository/DefaultValue.hpp | 2 +- .../dataRepository/ExecutableGroup.cpp | 2 +- .../dataRepository/ExecutableGroup.hpp | 2 +- src/coreComponents/dataRepository/Group.cpp | 2 +- src/coreComponents/dataRepository/Group.hpp | 2 +- .../dataRepository/GroupContext.cpp | 2 +- .../dataRepository/GroupContext.hpp | 2 +- .../dataRepository/HistoryDataSpec.hpp | 2 +- .../dataRepository/InputFlags.hpp | 2 +- .../dataRepository/KeyIndexT.hpp | 2 +- .../dataRepository/KeyNames.hpp | 2 +- .../dataRepository/LogLevelsInfo.hpp | 9 +- .../dataRepository/LogLevelsRegistry.cpp | 9 +- .../dataRepository/LogLevelsRegistry.hpp | 9 +- .../dataRepository/MappedVector.hpp | 2 +- .../dataRepository/ObjectCatalog.hpp | 2 +- .../dataRepository/ReferenceWrapper.hpp | 2 +- .../dataRepository/RestartFlags.hpp | 2 +- .../dataRepository/Utilities.cpp | 2 +- .../dataRepository/Utilities.hpp | 2 +- src/coreComponents/dataRepository/Wrapper.hpp | 2 +- .../dataRepository/WrapperBase.cpp | 2 +- .../dataRepository/WrapperBase.hpp | 2 +- .../dataRepository/WrapperContext.cpp | 2 +- .../dataRepository/WrapperContext.hpp | 2 +- .../dataRepository/python/PyGroup.cpp | 2 +- .../dataRepository/python/PyGroup.hpp | 2 +- .../dataRepository/python/PyGroupType.hpp | 2 +- .../dataRepository/python/PyWrapper.cpp | 2 +- .../dataRepository/python/PyWrapper.hpp | 2 +- .../unitTests/testBufferOps.cpp | 2 +- .../unitTests/testDefaultValue.cpp | 2 +- .../dataRepository/unitTests/testPacking.cpp | 2 +- .../unitTests/testReferenceWrapper.cpp | 2 +- .../dataRepository/unitTests/testWrapper.cpp | 2 +- .../unitTests/testXmlWrapper.cpp | 2 +- .../dataRepository/wrapperHelpers.hpp | 2 +- .../dataRepository/xmlWrapper.cpp | 2 +- .../dataRepository/xmlWrapper.hpp | 2 +- .../denseLinearAlgebra/CMakeLists.txt | 2 +- .../denseLinearAlgebra/common/layouts.hpp | 2 +- .../denseLinearAlgebra/denseLASolvers.hpp | 2 +- .../blaslapack/BlasLapackFunctions.h | 2 +- .../interfaces/blaslapack/BlasLapackLA.cpp | 2 +- .../interfaces/blaslapack/BlasLapackLA.hpp | 2 +- .../unitTests/testBlasLapack.cpp | 2 +- .../unitTests/testDenseLASolvers.cpp | 2 +- .../unitTests/testSolveLinearSystem.cpp | 2 +- .../discretizationMethods/CMakeLists.txt | 2 +- .../NumericalMethodsManager.cpp | 2 +- .../NumericalMethodsManager.hpp | 2 +- src/coreComponents/dummy.cpp | 2 +- src/coreComponents/events/CMakeLists.txt | 2 +- src/coreComponents/events/EventBase.cpp | 2 +- src/coreComponents/events/EventBase.hpp | 2 +- src/coreComponents/events/EventManager.cpp | 2 +- src/coreComponents/events/EventManager.hpp | 2 +- src/coreComponents/events/HaltEvent.cpp | 2 +- src/coreComponents/events/HaltEvent.hpp | 2 +- src/coreComponents/events/PeriodicEvent.cpp | 2 +- src/coreComponents/events/PeriodicEvent.hpp | 2 +- src/coreComponents/events/SoloEvent.cpp | 2 +- src/coreComponents/events/SoloEvent.hpp | 2 +- src/coreComponents/events/tasks/TaskBase.cpp | 2 +- src/coreComponents/events/tasks/TaskBase.hpp | 2 +- .../events/tasks/TasksManager.cpp | 2 +- .../events/tasks/TasksManager.hpp | 2 +- .../AquiferBoundaryCondition.cpp | 2 +- .../AquiferBoundaryCondition.hpp | 2 +- .../fieldSpecification/CMakeLists.txt | 2 +- .../DirichletBoundaryCondition.cpp | 2 +- .../DirichletBoundaryCondition.hpp | 2 +- .../EquilibriumInitialCondition.cpp | 2 +- .../EquilibriumInitialCondition.hpp | 2 +- .../FieldSpecificationBase.cpp | 2 +- .../FieldSpecificationBase.hpp | 2 +- .../FieldSpecificationManager.cpp | 2 +- .../FieldSpecificationManager.hpp | 2 +- .../PerfectlyMatchedLayer.cpp | 2 +- .../PerfectlyMatchedLayer.hpp | 2 +- .../SourceFluxBoundaryCondition.cpp | 2 +- .../SourceFluxBoundaryCondition.hpp | 2 +- .../TractionBoundaryCondition.cpp | 2 +- .../TractionBoundaryCondition.hpp | 2 +- src/coreComponents/fileIO/CMakeLists.txt | 2 +- .../fileIO/Outputs/BlueprintOutput.cpp | 2 +- .../fileIO/Outputs/BlueprintOutput.hpp | 2 +- .../fileIO/Outputs/ChomboIO.cpp | 2 +- .../fileIO/Outputs/ChomboIO.hpp | 2 +- .../fileIO/Outputs/OutputBase.cpp | 2 +- .../fileIO/Outputs/OutputBase.hpp | 2 +- .../fileIO/Outputs/OutputManager.cpp | 2 +- .../fileIO/Outputs/OutputManager.hpp | 2 +- .../fileIO/Outputs/OutputUtilities.cpp | 2 +- .../fileIO/Outputs/OutputUtilities.hpp | 2 +- .../fileIO/Outputs/PythonOutput.cpp | 2 +- .../fileIO/Outputs/PythonOutput.hpp | 2 +- .../fileIO/Outputs/RestartOutput.cpp | 2 +- .../fileIO/Outputs/RestartOutput.hpp | 2 +- .../fileIO/Outputs/SiloOutput.cpp | 2 +- .../fileIO/Outputs/SiloOutput.hpp | 2 +- .../fileIO/Outputs/TimeHistoryOutput.cpp | 2 +- .../fileIO/Outputs/TimeHistoryOutput.hpp | 2 +- .../fileIO/Outputs/VTKOutput.cpp | 2 +- .../fileIO/Outputs/VTKOutput.hpp | 2 +- .../fileIO/coupling/ChomboCoupler.cpp | 2 +- .../fileIO/coupling/ChomboCoupler.hpp | 2 +- .../fileIO/python/PyHistoryCollection.cpp | 2 +- .../fileIO/python/PyHistoryCollectionType.hpp | 2 +- .../fileIO/python/PyHistoryOutput.cpp | 2 +- .../fileIO/python/PyHistoryOutputType.hpp | 2 +- .../fileIO/python/PyVTKOutput.cpp | 2 +- .../fileIO/python/PyVTKOutputType.hpp | 2 +- src/coreComponents/fileIO/silo/SiloFile.cpp | 2 +- src/coreComponents/fileIO/silo/SiloFile.hpp | 2 +- .../fileIO/timeHistory/BufferedHistoryIO.hpp | 2 +- .../fileIO/timeHistory/HDFFile.cpp | 2 +- .../fileIO/timeHistory/HDFFile.hpp | 2 +- .../fileIO/timeHistory/HDFHistoryIO.cpp | 2 +- .../fileIO/timeHistory/HDFHistoryIO.hpp | 2 +- .../fileIO/timeHistory/HistoryCollection.hpp | 2 +- .../timeHistory/HistoryCollectionBase.cpp | 2 +- .../timeHistory/HistoryCollectionBase.hpp | 2 +- .../fileIO/timeHistory/PackCollection.cpp | 2 +- .../fileIO/timeHistory/PackCollection.hpp | 2 +- .../fileIO/vtk/VTKPVDWriter.cpp | 2 +- .../fileIO/vtk/VTKPVDWriter.hpp | 2 +- .../fileIO/vtk/VTKPolyDataWriterInterface.cpp | 2 +- .../fileIO/vtk/VTKPolyDataWriterInterface.hpp | 2 +- .../fileIO/vtk/VTKVTMWriter.cpp | 2 +- .../fileIO/vtk/VTKVTMWriter.hpp | 2 +- .../finiteElement/BilinearFormUtilities.hpp | 2 +- .../finiteElement/CMakeLists.txt | 2 +- .../UniformStrainHexahedron.cpp | 2 +- .../UniformStrainHexahedron.h | 2 +- .../FiniteElementDiscretization.cpp | 2 +- .../FiniteElementDiscretization.hpp | 2 +- .../FiniteElementDiscretizationManager.cpp | 2 +- .../FiniteElementDiscretizationManager.hpp | 2 +- .../finiteElement/FiniteElementDispatch.hpp | 2 +- src/coreComponents/finiteElement/Kinematics.h | 2 +- .../finiteElement/LinearFormUtilities.hpp | 2 +- .../finiteElement/PDEUtilities.hpp | 2 +- .../ConformingVirtualElementOrder1.hpp | 2 +- .../ConformingVirtualElementOrder1_impl.hpp | 2 +- .../elementFormulations/FiniteElementBase.hpp | 2 +- ...H1_Hexahedron_Lagrange1_GaussLegendre2.hpp | 2 +- .../H1_Pyramid_Lagrange1_Gauss5.hpp | 2 +- ...rilateralFace_Lagrange1_GaussLegendre2.hpp | 2 +- .../H1_Tetrahedron_Lagrange1_Gauss1.hpp | 2 +- .../H1_TriangleFace_Lagrange1_Gauss1.hpp | 2 +- .../H1_Wedge_Lagrange1_Gauss6.hpp | 2 +- .../elementFormulations/LagrangeBasis1.hpp | 2 +- .../elementFormulations/LagrangeBasis2.hpp | 2 +- .../elementFormulations/LagrangeBasis3GL.hpp | 2 +- .../elementFormulations/LagrangeBasis4GL.hpp | 2 +- .../elementFormulations/LagrangeBasis5GL.hpp | 2 +- .../Qk_Hexahedron_Lagrange_GaussLobatto.hpp | 2 +- .../kernelInterface/ImplicitKernelBase.hpp | 2 +- .../kernelInterface/InterfaceKernelBase.hpp | 2 +- .../kernelInterface/KernelBase.hpp | 2 +- .../kernelInterface/SparsityKernelBase.hpp | 2 +- .../unitTests/testFiniteElementBase.cpp | 2 +- .../unitTests/testFiniteElementHelpers.hpp | 2 +- ...H1_Hexahedron_Lagrange1_GaussLegendre2.cpp | 2 +- .../testH1_Pyramid_Lagrange1_Gauss5.cpp | 2 +- ...rilateralFace_Lagrange1_GaussLegendre2.cpp | 2 +- .../testH1_Tetrahedron_Lagrange1_Gauss1.cpp | 2 +- .../testH1_TriangleFace_Lagrange1_Gauss1.cpp | 2 +- .../testH1_Wedge_Lagrange1_Gauss6.cpp | 2 +- ...estQ3_Hexahedron_Lagrange_GaussLobatto.cpp | 2 +- ...estQ5_Hexahedron_Lagrange_GaussLobatto.cpp | 2 +- .../finiteVolume/BoundaryStencil.cpp | 2 +- .../finiteVolume/BoundaryStencil.hpp | 2 +- .../finiteVolume/CMakeLists.txt | 2 +- .../finiteVolume/CellElementStencilMPFA.cpp | 2 +- .../finiteVolume/CellElementStencilMPFA.hpp | 2 +- .../finiteVolume/CellElementStencilTPFA.cpp | 2 +- .../finiteVolume/CellElementStencilTPFA.hpp | 2 +- .../EmbeddedSurfaceToCellStencil.cpp | 2 +- .../EmbeddedSurfaceToCellStencil.hpp | 2 +- .../finiteVolume/FaceElementToCellStencil.cpp | 2 +- .../finiteVolume/FaceElementToCellStencil.hpp | 2 +- .../finiteVolume/FiniteVolumeManager.cpp | 2 +- .../finiteVolume/FiniteVolumeManager.hpp | 2 +- .../finiteVolume/FluxApproximationBase.cpp | 2 +- .../finiteVolume/FluxApproximationBase.hpp | 2 +- .../HybridMimeticDiscretization.cpp | 2 +- .../HybridMimeticDiscretization.hpp | 2 +- .../MimeticInnerProductDispatch.hpp | 2 +- .../finiteVolume/ProjectionEDFMHelper.cpp | 2 +- .../finiteVolume/ProjectionEDFMHelper.hpp | 2 +- .../finiteVolume/StencilBase.hpp | 2 +- .../finiteVolume/SurfaceElementStencil.cpp | 2 +- .../finiteVolume/SurfaceElementStencil.hpp | 2 +- .../TwoPointFluxApproximation.cpp | 2 +- .../TwoPointFluxApproximation.hpp | 2 +- .../BdVLMInnerProduct.hpp | 2 +- .../MimeticInnerProductBase.hpp | 2 +- .../MimeticInnerProductHelpers.hpp | 2 +- .../QuasiRTInnerProduct.hpp | 2 +- .../QuasiTPFAInnerProduct.hpp | 2 +- .../SimpleInnerProduct.hpp | 2 +- .../mimeticInnerProducts/TPFAInnerProduct.hpp | 2 +- src/coreComponents/functions/CMakeLists.txt | 2 +- .../functions/CompositeFunction.cpp | 2 +- .../functions/CompositeFunction.hpp | 2 +- src/coreComponents/functions/FunctionBase.cpp | 2 +- src/coreComponents/functions/FunctionBase.hpp | 2 +- .../functions/FunctionManager.cpp | 2 +- .../functions/FunctionManager.hpp | 2 +- .../functions/MultivariableTableFunction.cpp | 2 +- .../functions/MultivariableTableFunction.hpp | 2 +- .../MultivariableTableFunctionKernels.hpp | 2 +- .../functions/SymbolicFunction.cpp | 2 +- .../functions/SymbolicFunction.hpp | 2 +- .../functions/TableFunction.cpp | 2 +- .../functions/TableFunction.hpp | 2 +- .../functions/unitTests/testFunctions.cpp | 2 +- .../linearAlgebra/CMakeLists.txt | 2 +- .../linearAlgebra/DofManager.cpp | 2 +- .../linearAlgebra/DofManager.hpp | 2 +- .../linearAlgebra/DofManagerHelpers.hpp | 2 +- .../linearAlgebra/common/LinearOperator.hpp | 2 +- .../linearAlgebra/common/LinearSolverBase.hpp | 2 +- .../common/PreconditionerBase.hpp | 2 +- .../linearAlgebra/common/common.hpp | 2 +- .../linearAlgebra/common/traits.hpp | 2 +- .../interfaces/InterfaceTypes.hpp | 2 +- .../linearAlgebra/interfaces/MatrixBase.hpp | 2 +- .../linearAlgebra/interfaces/VectorBase.hpp | 2 +- .../interfaces/direct/SuiteSparse.cpp | 2 +- .../interfaces/direct/SuiteSparse.hpp | 2 +- .../interfaces/direct/SuperLUDist.cpp | 2 +- .../interfaces/direct/SuperLUDist.hpp | 2 +- .../interfaces/hypre/HypreExport.cpp | 2 +- .../interfaces/hypre/HypreExport.hpp | 2 +- .../interfaces/hypre/HypreInterface.cpp | 2 +- .../interfaces/hypre/HypreInterface.hpp | 2 +- .../interfaces/hypre/HypreKernels.cpp | 2 +- .../interfaces/hypre/HypreKernels.hpp | 2 +- .../interfaces/hypre/HypreMGR.cpp | 2 +- .../interfaces/hypre/HypreMGR.hpp | 2 +- .../interfaces/hypre/HypreMatrix.cpp | 2 +- .../interfaces/hypre/HypreMatrix.hpp | 2 +- .../interfaces/hypre/HyprePreconditioner.cpp | 2 +- .../interfaces/hypre/HyprePreconditioner.hpp | 2 +- .../interfaces/hypre/HypreSolver.cpp | 2 +- .../interfaces/hypre/HypreSolver.hpp | 2 +- .../interfaces/hypre/HypreUtils.cpp | 2 +- .../interfaces/hypre/HypreUtils.hpp | 2 +- .../interfaces/hypre/HypreVector.cpp | 2 +- .../interfaces/hypre/HypreVector.hpp | 2 +- .../CompositionalMultiphaseFVM.hpp | 2 +- .../CompositionalMultiphaseHybridFVM.hpp | 2 +- .../CompositionalMultiphaseReservoirFVM.hpp | 2 +- ...positionalMultiphaseReservoirHybridFVM.hpp | 2 +- .../HybridSinglePhasePoromechanics.hpp | 2 +- .../hypre/mgrStrategies/Hydrofracture.hpp | 2 +- .../LagrangianContactMechanics.hpp | 2 +- .../mgrStrategies/MultiphasePoromechanics.hpp | 2 +- .../MultiphasePoromechanicsReservoirFVM.hpp | 2 +- .../ReactiveCompositionalMultiphaseOBL.hpp | 2 +- .../mgrStrategies/SinglePhaseHybridFVM.hpp | 2 +- .../SinglePhasePoromechanics.hpp | 2 +- ...ePhasePoromechanicsConformingFractures.hpp | 2 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 2 +- .../SinglePhasePoromechanicsReservoirFVM.hpp | 2 +- .../mgrStrategies/SinglePhaseReservoirFVM.hpp | 2 +- .../SinglePhaseReservoirHybridFVM.hpp | 2 +- .../SolidMechanicsEmbeddedFractures.hpp | 2 +- .../ThermalCompositionalMultiphaseFVM.hpp | 2 +- ...malCompositionalMultiphaseReservoirFVM.hpp | 9 +- .../ThermalMultiphasePoromechanics.hpp | 2 +- .../ThermalSinglePhasePoromechanics.hpp | 2 +- .../interfaces/petsc/PetscExport.cpp | 2 +- .../interfaces/petsc/PetscExport.hpp | 2 +- .../interfaces/petsc/PetscInterface.cpp | 2 +- .../interfaces/petsc/PetscInterface.hpp | 2 +- .../interfaces/petsc/PetscMatrix.cpp | 2 +- .../interfaces/petsc/PetscMatrix.hpp | 2 +- .../interfaces/petsc/PetscPreconditioner.cpp | 2 +- .../interfaces/petsc/PetscPreconditioner.hpp | 2 +- .../interfaces/petsc/PetscSolver.cpp | 2 +- .../interfaces/petsc/PetscSolver.hpp | 2 +- .../interfaces/petsc/PetscUtils.hpp | 2 +- .../interfaces/petsc/PetscVector.cpp | 2 +- .../interfaces/petsc/PetscVector.hpp | 2 +- .../interfaces/trilinos/EpetraExport.cpp | 2 +- .../interfaces/trilinos/EpetraExport.hpp | 2 +- .../interfaces/trilinos/EpetraMatrix.cpp | 2 +- .../interfaces/trilinos/EpetraMatrix.hpp | 2 +- .../interfaces/trilinos/EpetraUtils.hpp | 2 +- .../interfaces/trilinos/EpetraVector.cpp | 2 +- .../interfaces/trilinos/EpetraVector.hpp | 2 +- .../interfaces/trilinos/TrilinosInterface.cpp | 2 +- .../interfaces/trilinos/TrilinosInterface.hpp | 2 +- .../trilinos/TrilinosPreconditioner.cpp | 2 +- .../trilinos/TrilinosPreconditioner.hpp | 2 +- .../interfaces/trilinos/TrilinosSolver.cpp | 2 +- .../interfaces/trilinos/TrilinosSolver.hpp | 2 +- .../linearAlgebra/solvers/BicgstabSolver.cpp | 2 +- .../linearAlgebra/solvers/BicgstabSolver.hpp | 2 +- .../solvers/BlockPreconditioner.cpp | 2 +- .../solvers/BlockPreconditioner.hpp | 2 +- .../linearAlgebra/solvers/CgSolver.cpp | 2 +- .../linearAlgebra/solvers/CgSolver.hpp | 2 +- .../linearAlgebra/solvers/GmresSolver.cpp | 2 +- .../linearAlgebra/solvers/GmresSolver.hpp | 2 +- .../linearAlgebra/solvers/KrylovSolver.cpp | 2 +- .../linearAlgebra/solvers/KrylovSolver.hpp | 2 +- .../linearAlgebra/solvers/KrylovUtils.hpp | 2 +- .../solvers/PreconditionerBlockJacobi.hpp | 2 +- .../solvers/PreconditionerIdentity.hpp | 2 +- .../solvers/PreconditionerJacobi.hpp | 2 +- .../SeparateComponentPreconditioner.cpp | 2 +- .../SeparateComponentPreconditioner.hpp | 2 +- .../unitTests/testComponentMask.cpp | 2 +- .../unitTests/testExternalSolvers.cpp | 2 +- .../unitTests/testKrylovSolvers.cpp | 2 +- .../unitTests/testLinearAlgebraUtils.hpp | 2 +- .../testLinearSolverParametersEnums.cpp | 2 +- .../linearAlgebra/unitTests/testMatrices.cpp | 2 +- .../testReverseCutHillMcKeeOrdering.cpp | 2 +- .../linearAlgebra/unitTests/testVectors.cpp | 2 +- .../linearAlgebra/utilities/Arnoldi.hpp | 2 +- .../linearAlgebra/utilities/BlockOperator.hpp | 2 +- .../utilities/BlockOperatorView.hpp | 2 +- .../utilities/BlockOperatorWrapper.hpp | 2 +- .../linearAlgebra/utilities/BlockVector.hpp | 2 +- .../utilities/BlockVectorView.hpp | 2 +- .../utilities/BlockVectorWrapper.hpp | 2 +- .../linearAlgebra/utilities/ComponentMask.hpp | 2 +- .../utilities/InverseNormalOperator.hpp | 2 +- .../utilities/LAIHelperFunctions.hpp | 2 +- .../utilities/LinearSolverParameters.hpp | 2 +- .../utilities/LinearSolverResult.hpp | 2 +- .../utilities/NormalOperator.hpp | 2 +- .../utilities/ReverseCutHillMcKeeOrdering.cpp | 2 +- .../utilities/ReverseCutHillMcKeeOrdering.hpp | 2 +- .../utilities/TransposeOperator.hpp | 2 +- .../mainInterface/CMakeLists.txt | 2 +- .../mainInterface/GeosxState.cpp | 2 +- .../mainInterface/GeosxState.hpp | 2 +- .../mainInterface/GeosxVersion.hpp.in | 2 +- .../mainInterface/ProblemManager.cpp | 2 +- .../mainInterface/ProblemManager.hpp | 2 +- .../mainInterface/initialization.cpp | 2 +- .../mainInterface/initialization.hpp | 2 +- src/coreComponents/mainInterface/version.cpp | 2 +- src/coreComponents/mainInterface/version.hpp | 2 +- src/coreComponents/math/CMakeLists.txt | 2 +- .../math/extrapolation/Extrapolation.hpp | 2 +- .../math/interpolation/Interpolation.hpp | 2 +- src/coreComponents/mesh/BufferOps.cpp | 2 +- src/coreComponents/mesh/BufferOps.hpp | 2 +- src/coreComponents/mesh/CMakeLists.txt | 2 +- src/coreComponents/mesh/CellElementRegion.cpp | 2 +- src/coreComponents/mesh/CellElementRegion.hpp | 2 +- .../mesh/CellElementRegionSelector.cpp | 9 +- .../mesh/CellElementRegionSelector.hpp | 9 +- .../mesh/CellElementSubRegion.cpp | 2 +- .../mesh/CellElementSubRegion.hpp | 2 +- src/coreComponents/mesh/DomainPartition.cpp | 2 +- src/coreComponents/mesh/DomainPartition.hpp | 2 +- src/coreComponents/mesh/EdgeManager.cpp | 2 +- src/coreComponents/mesh/EdgeManager.hpp | 2 +- src/coreComponents/mesh/ElementRegionBase.cpp | 2 +- src/coreComponents/mesh/ElementRegionBase.hpp | 2 +- .../mesh/ElementRegionManager.cpp | 2 +- .../mesh/ElementRegionManager.hpp | 2 +- .../mesh/ElementSubRegionBase.cpp | 2 +- .../mesh/ElementSubRegionBase.hpp | 2 +- src/coreComponents/mesh/ElementType.hpp | 2 +- .../mesh/EmbeddedSurfaceNodeManager.cpp | 2 +- .../mesh/EmbeddedSurfaceNodeManager.hpp | 2 +- .../mesh/EmbeddedSurfaceSubRegion.cpp | 2 +- .../mesh/EmbeddedSurfaceSubRegion.hpp | 2 +- .../mesh/ExternalDataSourceBase.cpp | 9 +- .../mesh/ExternalDataSourceBase.hpp | 9 +- .../mesh/ExternalDataSourceManager.cpp | 2 +- .../mesh/ExternalDataSourceManager.hpp | 2 +- .../mesh/FaceElementSubRegion.cpp | 2 +- .../mesh/FaceElementSubRegion.hpp | 2 +- src/coreComponents/mesh/FaceManager.cpp | 2 +- src/coreComponents/mesh/FaceManager.hpp | 2 +- src/coreComponents/mesh/FieldIdentifiers.hpp | 2 +- .../mesh/InterObjectRelation.hpp | 2 +- src/coreComponents/mesh/MeshBody.cpp | 2 +- src/coreComponents/mesh/MeshBody.hpp | 2 +- src/coreComponents/mesh/MeshFields.hpp | 2 +- .../mesh/MeshForLoopInterface.hpp | 2 +- src/coreComponents/mesh/MeshLevel.cpp | 2 +- src/coreComponents/mesh/MeshLevel.hpp | 2 +- src/coreComponents/mesh/MeshManager.cpp | 2 +- src/coreComponents/mesh/MeshManager.hpp | 2 +- src/coreComponents/mesh/MeshObjectPath.cpp | 2 +- src/coreComponents/mesh/MeshObjectPath.hpp | 2 +- src/coreComponents/mesh/NodeManager.cpp | 2 +- src/coreComponents/mesh/NodeManager.hpp | 2 +- src/coreComponents/mesh/ObjectManagerBase.cpp | 2 +- src/coreComponents/mesh/ObjectManagerBase.hpp | 2 +- src/coreComponents/mesh/ParticleManager.cpp | 2 +- src/coreComponents/mesh/ParticleManager.hpp | 2 +- src/coreComponents/mesh/ParticleRegion.cpp | 2 +- src/coreComponents/mesh/ParticleRegion.hpp | 2 +- .../mesh/ParticleRegionBase.cpp | 2 +- .../mesh/ParticleRegionBase.hpp | 2 +- src/coreComponents/mesh/ParticleSubRegion.cpp | 2 +- src/coreComponents/mesh/ParticleSubRegion.hpp | 2 +- .../mesh/ParticleSubRegionBase.cpp | 2 +- .../mesh/ParticleSubRegionBase.hpp | 2 +- src/coreComponents/mesh/ParticleType.hpp | 2 +- src/coreComponents/mesh/Perforation.cpp | 2 +- src/coreComponents/mesh/Perforation.hpp | 2 +- src/coreComponents/mesh/PerforationData.cpp | 2 +- src/coreComponents/mesh/PerforationData.hpp | 2 +- src/coreComponents/mesh/PerforationFields.hpp | 2 +- .../mesh/SurfaceElementRegion.cpp | 2 +- .../mesh/SurfaceElementRegion.hpp | 2 +- .../mesh/SurfaceElementSubRegion.cpp | 2 +- .../mesh/SurfaceElementSubRegion.hpp | 2 +- src/coreComponents/mesh/ToElementRelation.cpp | 2 +- src/coreComponents/mesh/ToElementRelation.hpp | 2 +- .../mesh/ToParticleRelation.cpp | 2 +- .../mesh/ToParticleRelation.hpp | 2 +- src/coreComponents/mesh/WellElementRegion.cpp | 2 +- src/coreComponents/mesh/WellElementRegion.hpp | 2 +- .../mesh/WellElementSubRegion.cpp | 2 +- .../mesh/WellElementSubRegion.hpp | 2 +- .../mesh/generators/CellBlock.cpp | 2 +- .../mesh/generators/CellBlock.hpp | 2 +- .../mesh/generators/CellBlockABC.hpp | 2 +- .../mesh/generators/CellBlockManager.cpp | 2 +- .../mesh/generators/CellBlockManager.hpp | 2 +- .../mesh/generators/CellBlockManagerABC.hpp | 2 +- .../mesh/generators/CellBlockUtilities.cpp | 2 +- .../mesh/generators/CellBlockUtilities.hpp | 2 +- .../mesh/generators/CollocatedNodes.cpp | 2 +- .../mesh/generators/CollocatedNodes.hpp | 2 +- .../generators/ExternalMeshGeneratorBase.cpp | 2 +- .../generators/ExternalMeshGeneratorBase.hpp | 2 +- .../mesh/generators/FaceBlock.cpp | 2 +- .../mesh/generators/FaceBlock.hpp | 2 +- .../mesh/generators/FaceBlockABC.hpp | 2 +- .../mesh/generators/InternalMeshGenerator.cpp | 2 +- .../mesh/generators/InternalMeshGenerator.hpp | 2 +- .../mesh/generators/InternalWellGenerator.cpp | 2 +- .../mesh/generators/InternalWellGenerator.hpp | 2 +- .../generators/InternalWellboreGenerator.cpp | 2 +- .../generators/InternalWellboreGenerator.hpp | 2 +- .../mesh/generators/LineBlock.cpp | 2 +- .../mesh/generators/LineBlock.hpp | 2 +- .../mesh/generators/LineBlockABC.hpp | 2 +- .../mesh/generators/MeshComponentBase.cpp | 2 +- .../mesh/generators/MeshComponentBase.hpp | 2 +- .../mesh/generators/MeshGeneratorBase.cpp | 2 +- .../mesh/generators/MeshGeneratorBase.hpp | 2 +- .../mesh/generators/PTScotchInterface.cpp | 2 +- .../mesh/generators/PTScotchInterface.hpp | 2 +- .../mesh/generators/ParMETISInterface.cpp | 2 +- .../mesh/generators/ParMETISInterface.hpp | 2 +- .../mesh/generators/ParticleBlock.cpp | 2 +- .../mesh/generators/ParticleBlock.hpp | 2 +- .../mesh/generators/ParticleBlockABC.hpp | 2 +- .../mesh/generators/ParticleBlockManager.cpp | 2 +- .../mesh/generators/ParticleBlockManager.hpp | 2 +- .../generators/ParticleBlockManagerABC.hpp | 2 +- .../mesh/generators/ParticleMeshGenerator.cpp | 2 +- .../mesh/generators/ParticleMeshGenerator.hpp | 2 +- .../mesh/generators/PartitionDescriptor.hpp | 2 +- .../mesh/generators/PrismUtilities.hpp | 2 +- src/coreComponents/mesh/generators/Region.cpp | 2 +- src/coreComponents/mesh/generators/Region.hpp | 2 +- .../mesh/generators/VTKFaceBlockUtilities.cpp | 2 +- .../mesh/generators/VTKFaceBlockUtilities.hpp | 2 +- .../generators/VTKHierarchicalDataSource.cpp | 2 +- .../generators/VTKHierarchicalDataSource.hpp | 2 +- .../mesh/generators/VTKMeshGenerator.cpp | 2 +- .../mesh/generators/VTKMeshGenerator.hpp | 2 +- .../mesh/generators/VTKMeshGeneratorTools.cpp | 2 +- .../mesh/generators/VTKMeshGeneratorTools.hpp | 2 +- .../mesh/generators/VTKUtilities.cpp | 2 +- .../mesh/generators/VTKUtilities.hpp | 2 +- .../mesh/generators/VTKWellGenerator.cpp | 2 +- .../mesh/generators/VTKWellGenerator.hpp | 2 +- .../mesh/generators/WellGeneratorBase.cpp | 2 +- .../mesh/generators/WellGeneratorBase.hpp | 2 +- .../mesh/mpiCommunications/CommID.cpp | 2 +- .../mesh/mpiCommunications/CommID.hpp | 2 +- .../mpiCommunications/CommunicationTools.cpp | 2 +- .../mpiCommunications/CommunicationTools.hpp | 2 +- .../mesh/mpiCommunications/MPI_iCommData.cpp | 2 +- .../mesh/mpiCommunications/MPI_iCommData.hpp | 2 +- .../NeighborCommunicator.cpp | 2 +- .../NeighborCommunicator.hpp | 2 +- .../mesh/mpiCommunications/NeighborData.hpp | 2 +- .../mesh/mpiCommunications/PartitionBase.cpp | 2 +- .../mesh/mpiCommunications/PartitionBase.hpp | 2 +- .../mpiCommunications/SpatialPartition.cpp | 2 +- .../mpiCommunications/SpatialPartition.hpp | 2 +- .../mesh/simpleGeometricObjects/Box.cpp | 2 +- .../mesh/simpleGeometricObjects/Box.hpp | 2 +- .../CustomPolarObject.cpp | 2 +- .../CustomPolarObject.hpp | 2 +- .../mesh/simpleGeometricObjects/Cylinder.cpp | 2 +- .../mesh/simpleGeometricObjects/Cylinder.hpp | 2 +- .../mesh/simpleGeometricObjects/Disc.cpp | 2 +- .../mesh/simpleGeometricObjects/Disc.hpp | 2 +- .../GeometricObjectManager.cpp | 2 +- .../GeometricObjectManager.hpp | 2 +- .../PlanarGeometricObject.cpp | 2 +- .../PlanarGeometricObject.hpp | 2 +- .../mesh/simpleGeometricObjects/Rectangle.cpp | 2 +- .../mesh/simpleGeometricObjects/Rectangle.hpp | 2 +- .../SimpleGeometricObjectBase.cpp | 2 +- .../SimpleGeometricObjectBase.hpp | 2 +- .../simpleGeometricObjects/ThickPlane.cpp | 2 +- .../simpleGeometricObjects/ThickPlane.hpp | 2 +- .../unitTests/testComputationalGeometry.cpp | 2 +- .../mesh/unitTests/testGeometricObjects.cpp | 2 +- .../mesh/unitTests/testMeshObjectPath.cpp | 2 +- .../AverageOverQuadraturePointsKernel.hpp | 2 +- .../mesh/utilities/CIcomputationKernel.hpp | 2 +- .../mesh/utilities/ComputationalGeometry.cpp | 2 +- .../mesh/utilities/ComputationalGeometry.hpp | 2 +- .../mesh/utilities/MeshMapUtilities.hpp | 2 +- .../utilities/StructuredGridUtilities.hpp | 2 +- .../physicsSolvers/CMakeLists.txt | 2 +- .../physicsSolvers/FieldStatisticsBase.hpp | 2 +- .../physicsSolvers/KernelLaunchSelectors.hpp | 9 +- .../physicsSolvers/LinearSolverParameters.cpp | 2 +- .../physicsSolvers/LinearSolverParameters.hpp | 2 +- .../physicsSolvers/LogLevelsInfo.hpp | 9 +- .../NonlinearSolverParameters.cpp | 2 +- .../NonlinearSolverParameters.hpp | 2 +- .../physicsSolvers/PhysicsSolverBase.cpp | 2 +- .../physicsSolvers/PhysicsSolverBase.hpp | 2 +- .../PhysicsSolverBaseKernels.hpp | 2 +- .../physicsSolvers/PhysicsSolverManager.cpp | 2 +- .../physicsSolvers/PhysicsSolverManager.hpp | 2 +- .../physicsSolvers/SolverStatistics.cpp | 2 +- .../physicsSolvers/SolverStatistics.hpp | 2 +- .../physicsSolvers/contact/ContactFields.hpp | 2 +- .../contact/ContactSolverBase.cpp | 2 +- .../contact/ContactSolverBase.hpp | 2 +- .../physicsSolvers/contact/LogLevelsInfo.hpp | 9 +- ...lidMechanicsAugmentedLagrangianContact.cpp | 2 +- ...lidMechanicsAugmentedLagrangianContact.hpp | 2 +- .../SolidMechanicsEmbeddedFractures.cpp | 2 +- .../SolidMechanicsEmbeddedFractures.hpp | 2 +- .../contact/SolidMechanicsLagrangeContact.cpp | 2 +- .../contact/SolidMechanicsLagrangeContact.hpp | 2 +- ...olidMechanicsLagrangeContactBubbleStab.cpp | 2 +- ...olidMechanicsLagrangeContactBubbleStab.hpp | 2 +- .../contact/SolidMechanicsPenaltyContact.cpp | 9 +- .../contact/SolidMechanicsPenaltyContact.hpp | 9 +- .../kernels/SolidMechanicsALMKernels.hpp | 2 +- .../kernels/SolidMechanicsALMKernelsBase.hpp | 2 +- .../SolidMechanicsALMSimultaneousKernels.hpp | 9 +- ...dMechanicsConformingContactKernelsBase.hpp | 2 +- ...echanicsConformingContactKernelsHelper.hpp | 2 +- ...SolidMechanicsContactFaceBubbleKernels.hpp | 2 +- ...MechanicsDisplacementJumpUpdateKernels.hpp | 2 +- .../SolidMechanicsEFEMJumpUpdateKernels.hpp | 2 +- .../kernels/SolidMechanicsEFEMKernels.hpp | 2 +- .../kernels/SolidMechanicsEFEMKernelsBase.hpp | 2 +- .../SolidMechanicsEFEMKernelsHelper.hpp | 2 +- ...MechanicsEFEMStaticCondensationKernels.hpp | 2 +- .../SolidMechanicsLagrangeContactKernels.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseBase.cpp | 2 +- .../fluidFlow/CompositionalMultiphaseBase.hpp | 2 +- .../CompositionalMultiphaseBaseFields.hpp | 2 +- .../fluidFlow/CompositionalMultiphaseFVM.cpp | 2 +- .../fluidFlow/CompositionalMultiphaseFVM.hpp | 2 +- .../CompositionalMultiphaseHybridFVM.cpp | 2 +- .../CompositionalMultiphaseHybridFVM.hpp | 2 +- .../CompositionalMultiphaseStatistics.cpp | 2 +- .../CompositionalMultiphaseStatistics.hpp | 2 +- .../CompositionalMultiphaseUtilities.hpp | 2 +- .../fluidFlow/FlowSolverBase.cpp | 2 +- .../fluidFlow/FlowSolverBase.hpp | 2 +- .../fluidFlow/FlowSolverBaseFields.hpp | 2 +- .../fluidFlow/LogLevelsInfo.hpp | 9 +- .../ReactiveCompositionalMultiphaseOBL.cpp | 2 +- .../ReactiveCompositionalMultiphaseOBL.hpp | 2 +- ...activeCompositionalMultiphaseOBLFields.hpp | 2 +- .../fluidFlow/SinglePhaseBase.cpp | 2 +- .../fluidFlow/SinglePhaseBase.hpp | 2 +- .../fluidFlow/SinglePhaseBaseFields.hpp | 2 +- .../fluidFlow/SinglePhaseFVM.cpp | 2 +- .../fluidFlow/SinglePhaseFVM.hpp | 2 +- .../fluidFlow/SinglePhaseHybridFVM.cpp | 2 +- .../fluidFlow/SinglePhaseHybridFVM.hpp | 2 +- .../fluidFlow/SinglePhaseProppantBase.cpp | 2 +- .../fluidFlow/SinglePhaseProppantBase.hpp | 2 +- .../fluidFlow/SinglePhaseStatistics.cpp | 2 +- .../fluidFlow/SinglePhaseStatistics.hpp | 2 +- .../fluidFlow/SourceFluxStatistics.cpp | 2 +- .../fluidFlow/SourceFluxStatistics.hpp | 2 +- .../fluidFlow/StencilAccessors.hpp | 2 +- .../fluidFlow/StencilDataCollection.cpp | 9 +- .../fluidFlow/StencilDataCollection.hpp | 9 +- .../kernels/HybridFVMHelperKernels.hpp | 2 +- .../MinPoreVolumeMaxPorosityKernel.hpp | 2 +- .../kernels/StencilWeightsUpdateKernel.hpp | 2 +- .../compositional/AccumulationKernel.hpp | 2 +- .../kernels/compositional/AquiferBCKernel.cpp | 2 +- .../kernels/compositional/AquiferBCKernel.hpp | 2 +- .../kernels/compositional/C1PPUPhaseFlux.hpp | 2 +- .../kernels/compositional/CFLKernel.cpp | 2 +- .../kernels/compositional/CFLKernel.hpp | 2 +- .../CapillaryPressureUpdateKernel.hpp | 2 +- ...ompositionalMultiphaseHybridFVMKernels.cpp | 2 +- ...ompositionalMultiphaseHybridFVMKernels.hpp | 2 +- .../DiffusionDispersionFluxComputeKernel.hpp | 2 +- .../DirichletFluxComputeKernel.hpp | 2 +- .../DissipationFluxComputeKernel.hpp | 2 +- .../compositional/FluidUpdateKernel.hpp | 2 +- .../compositional/FluxComputeKernel.hpp | 2 +- .../compositional/FluxComputeKernelBase.cpp | 2 +- .../compositional/FluxComputeKernelBase.hpp | 2 +- .../GlobalComponentFractionKernel.hpp | 2 +- .../HydrostaticPressureKernel.hpp | 2 +- .../kernels/compositional/IHUPhaseFlux.hpp | 2 +- .../compositional/KernelLaunchSelectors.hpp | 2 +- .../kernels/compositional/PPUPhaseFlux.hpp | 2 +- .../compositional/PhaseComponentFlux.hpp | 2 +- .../compositional/PhaseMobilityKernel.hpp | 2 +- .../PhaseVolumeFractionKernel.hpp | 2 +- .../kernels/compositional/PotGrad.hpp | 2 +- .../compositional/PropertyKernelBase.hpp | 2 +- ...ctiveCompositionalMultiphaseOBLKernels.hpp | 2 +- .../RelativePermeabilityUpdateKernel.hpp | 2 +- .../compositional/ResidualNormKernel.hpp | 2 +- .../SolidInternalEnergyUpdateKernel.hpp | 2 +- .../compositional/SolutionCheckKernel.hpp | 2 +- .../SolutionScalingAndCheckingKernelBase.hpp | 2 +- .../compositional/SolutionScalingKernel.hpp | 2 +- .../StabilizedFluxComputeKernel.hpp | 2 +- .../compositional/StatisticsKernel.hpp | 2 +- .../ThermalAccumulationKernel.hpp | 2 +- ...alDiffusionDispersionFluxComputeKernel.hpp | 2 +- .../ThermalDirichletFluxComputeKernel.hpp | 2 +- .../ThermalFluxComputeKernel.hpp | 2 +- .../ThermalPhaseMobilityKernel.hpp | 2 +- .../ThermalPhaseVolumeFractionKernel.hpp | 2 +- .../ThermalResidualNormKernel.hpp | 2 +- .../ThermalSolutionCheckKernel.hpp | 2 +- .../ThermalSolutionScalingKernel.hpp | 2 +- .../singlePhase/AccumulationKernels.hpp | 2 +- .../kernels/singlePhase/AquiferBCKernel.hpp | 2 +- .../DirichletFluxComputeKernel.hpp | 2 +- .../kernels/singlePhase/FluidUpdateKernel.hpp | 2 +- .../kernels/singlePhase/FluxComputeKernel.hpp | 2 +- .../singlePhase/FluxComputeKernelBase.hpp | 2 +- .../kernels/singlePhase/FluxKernelsHelper.hpp | 2 +- .../singlePhase/HydrostaticPressureKernel.hpp | 2 +- .../kernels/singlePhase/MobilityKernel.hpp | 2 +- .../singlePhase/ResidualNormKernel.hpp | 2 +- .../SinglePhaseHybridFVMKernels.hpp | 2 +- .../SolidInternalEnergyUpdateKernel.hpp | 2 +- .../singlePhase/SolutionCheckKernel.hpp | 2 +- .../singlePhase/SolutionScalingKernel.hpp | 2 +- .../StabilizedFluxComputeKernel.hpp | 2 +- .../kernels/singlePhase/StatisticsKernel.hpp | 2 +- .../ThermalAccumulationKernels.hpp | 2 +- .../ThermalDirichletFluxComputeKernel.hpp | 2 +- .../singlePhase/ThermalFluxComputeKernel.hpp | 2 +- .../proppant/ProppantBaseKernels.hpp | 2 +- .../proppant/ProppantFluxKernels.cpp | 2 +- .../proppant/ProppantFluxKernels.hpp | 2 +- .../proppantTransport/ProppantTransport.cpp | 2 +- .../proppantTransport/ProppantTransport.hpp | 2 +- .../ProppantTransportFields.hpp | 2 +- .../ProppantTransportKernels.cpp | 2 +- .../ProppantTransportKernels.hpp | 2 +- .../wells/CompositionalMultiphaseWell.cpp | 2 +- .../wells/CompositionalMultiphaseWell.hpp | 2 +- .../CompositionalMultiphaseWellFields.hpp | 2 +- .../fluidFlow/wells/LogLevelsInfo.hpp | 9 +- .../fluidFlow/wells/SinglePhaseWell.cpp | 2 +- .../fluidFlow/wells/SinglePhaseWell.hpp | 2 +- .../fluidFlow/wells/SinglePhaseWellFields.hpp | 2 +- .../fluidFlow/wells/WellConstants.hpp | 2 +- .../fluidFlow/wells/WellControls.cpp | 2 +- .../fluidFlow/wells/WellControls.hpp | 2 +- .../fluidFlow/wells/WellFields.hpp | 9 +- .../fluidFlow/wells/WellSolverBase.cpp | 2 +- .../fluidFlow/wells/WellSolverBase.hpp | 2 +- .../fluidFlow/wells/WellSolverBaseFields.hpp | 2 +- .../fluidFlow/wells/WellTags.hpp | 9 +- .../CompositionalMultiphaseWellKernels.cpp | 2 +- .../CompositionalMultiphaseWellKernels.hpp | 2 +- .../wells/kernels/PerforationFluxKernels.hpp | 9 +- .../wells/kernels/SinglePhaseWellKernels.cpp | 2 +- .../wells/kernels/SinglePhaseWellKernels.hpp | 2 +- ...rmalCompositionalMultiphaseWellKernels.hpp | 9 +- .../kernels/ThermalSinglePhaseWellKernels.hpp | 9 +- .../inducedSeismicity/QuasiDynamicEQ.cpp | 2 +- .../inducedSeismicity/QuasiDynamicEQ.hpp | 2 +- .../inducedSeismicity/SeismicityRate.cpp | 2 +- .../inducedSeismicity/SeismicityRate.hpp | 2 +- .../inducedSeismicityFields.hpp | 2 +- .../kernels/RateAndStateKernels.hpp | 2 +- .../kernels/SeismicityRateKernels.hpp | 2 +- .../inducedSeismicity/rateAndStateFields.hpp | 2 +- ...mpositionalMultiphaseReservoirAndWells.cpp | 2 +- ...mpositionalMultiphaseReservoirAndWells.hpp | 2 +- .../CoupledReservoirAndWellKernels.hpp | 9 +- .../CoupledReservoirAndWellsBase.cpp | 2 +- .../CoupledReservoirAndWellsBase.hpp | 2 +- .../multiphysics/CoupledSolver.hpp | 2 +- .../FlowProppantTransportSolver.cpp | 2 +- .../FlowProppantTransportSolver.hpp | 2 +- .../multiphysics/HydrofractureSolver.cpp | 2 +- .../multiphysics/HydrofractureSolver.hpp | 2 +- .../HydrofractureSolverKernels.hpp | 2 +- .../multiphysics/LogLevelsInfo.hpp | 9 +- .../multiphysics/MultiphasePoromechanics.cpp | 2 +- .../multiphysics/MultiphasePoromechanics.hpp | 2 +- .../multiphysics/PhaseFieldFractureSolver.cpp | 2 +- .../multiphysics/PhaseFieldFractureSolver.hpp | 2 +- .../multiphysics/PoromechanicsFields.hpp | 2 +- .../PoromechanicsInitialization.cpp | 2 +- .../PoromechanicsInitialization.hpp | 2 +- .../multiphysics/PoromechanicsSolver.hpp | 2 +- .../multiphysics/SinglePhasePoromechanics.cpp | 2 +- .../multiphysics/SinglePhasePoromechanics.hpp | 2 +- ...ePhasePoromechanicsConformingFractures.cpp | 2 +- ...ePhasePoromechanicsConformingFractures.hpp | 2 +- ...glePhasePoromechanicsEmbeddedFractures.cpp | 2 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 2 +- .../SinglePhaseReservoirAndWells.cpp | 2 +- .../SinglePhaseReservoirAndWells.hpp | 2 +- .../MultiphasePoromechanics.hpp | 2 +- .../MultiphasePoromechanics_impl.hpp | 2 +- .../PoromechanicsBase.hpp | 2 +- .../PoromechanicsEFEMKernels.cpp.template | 2 +- .../PoromechanicsKernels.cpp.template | 2 +- .../SinglePhasePoromechanics.hpp | 2 +- ...ePhasePoromechanicsConformingFractures.hpp | 2 +- .../SinglePhasePoromechanicsEFEM.hpp | 2 +- .../SinglePhasePoromechanicsEFEM_impl.hpp | 2 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 2 +- .../SinglePhasePoromechanicsFractures.hpp | 2 +- .../SinglePhasePoromechanics_impl.hpp | 2 +- .../ThermalMultiphasePoromechanics.hpp | 2 +- .../ThermalMultiphasePoromechanics_impl.hpp | 2 +- .../ThermalSinglePhasePoromechanics.hpp | 2 +- ...ePhasePoromechanicsConformingFractures.hpp | 2 +- .../ThermalSinglePhasePoromechanicsEFEM.hpp | 2 +- ...ermalSinglePhasePoromechanicsEFEM_impl.hpp | 2 +- ...glePhasePoromechanicsEmbeddedFractures.hpp | 2 +- .../ThermalSinglePhasePoromechanics_impl.hpp | 2 +- .../ThermoPoromechanicsKernels.cpp.template | 2 +- .../physicsSolvers/python/PySolver.cpp | 2 +- .../physicsSolvers/python/PySolver.hpp | 2 +- .../physicsSolvers/python/PySolverType.hpp | 2 +- .../simplePDE/LaplaceBaseH1.cpp | 2 +- .../simplePDE/LaplaceBaseH1.hpp | 2 +- .../physicsSolvers/simplePDE/LaplaceFEM.cpp | 2 +- .../physicsSolvers/simplePDE/LaplaceFEM.hpp | 2 +- .../simplePDE/LaplaceFEMKernels.hpp | 2 +- .../simplePDE/PhaseFieldDamageFEM.cpp | 2 +- .../simplePDE/PhaseFieldDamageFEM.hpp | 2 +- .../simplePDE/PhaseFieldDamageFEMKernels.hpp | 2 +- .../solidMechanics/LogLevelsInfo.hpp | 9 +- .../solidMechanics/MPMSolverFields.hpp | 2 +- .../solidMechanics/SolidMechanicsFields.hpp | 2 +- .../SolidMechanicsLagrangianFEM.cpp | 2 +- .../SolidMechanicsLagrangianFEM.hpp | 2 +- .../SolidMechanicsLagrangianSSLE.cpp | 2 +- .../SolidMechanicsLagrangianSSLE.hpp | 2 +- .../solidMechanics/SolidMechanicsMPM.cpp | 2 +- .../solidMechanics/SolidMechanicsMPM.hpp | 2 +- .../SolidMechanicsStateReset.cpp | 2 +- .../SolidMechanicsStateReset.hpp | 2 +- .../SolidMechanicsStatistics.cpp | 2 +- .../SolidMechanicsStatistics.hpp | 2 +- .../kernels/ExplicitFiniteStrain.hpp | 2 +- .../kernels/ExplicitFiniteStrain_impl.hpp | 2 +- .../solidMechanics/kernels/ExplicitMPM.hpp | 2 +- .../kernels/ExplicitSmallStrain.hpp | 2 +- .../kernels/ExplicitSmallStrain_impl.hpp | 2 +- .../FixedStressThermoPoromechanics.hpp | 2 +- .../FixedStressThermoPoromechanics_impl.hpp | 2 +- .../kernels/ImplicitSmallStrainNewmark.hpp | 2 +- .../ImplicitSmallStrainNewmark_impl.hpp | 2 +- .../ImplicitSmallStrainQuasiStatic.hpp | 2 +- .../ImplicitSmallStrainQuasiStatic_impl.hpp | 2 +- ...essThermoPoromechanicsKernels.cpp.template | 2 +- .../SolidMechanicsKernels.cpp.template | 2 +- .../SolidMechanicsLagrangianFEMKernels.hpp | 2 +- .../solidMechanics/kernels/StrainHelper.hpp | 2 +- .../solidMechanics/kernels/policies.hpp.in | 2 +- .../EmbeddedSurfaceGenerator.cpp | 2 +- .../EmbeddedSurfaceGenerator.hpp | 2 +- ...mbeddedSurfacesParallelSynchronization.cpp | 2 +- ...mbeddedSurfacesParallelSynchronization.hpp | 2 +- .../surfaceGeneration/LogLevelsInfo.hpp | 9 +- .../ParallelTopologyChange.cpp | 2 +- .../ParallelTopologyChange.hpp | 2 +- .../ParallelTopologyChangeNoFixup.cpp | 2 +- .../surfaceGeneration/SurfaceGenerator.cpp | 2 +- .../surfaceGeneration/SurfaceGenerator.hpp | 2 +- .../SurfaceGeneratorFields.hpp | 2 +- .../kernels/surfaceGenerationKernels.hpp | 2 +- .../surfaceGenerationKernelsHelpers.hpp | 2 +- .../AcousticFirstOrderWaveEquationSEM.cpp | 2 +- .../AcousticFirstOrderWaveEquationSEM.hpp | 2 +- ...cousticFirstOrderWaveEquationSEMKernel.hpp | 2 +- .../anisotropic/AcousticVTIFields.hpp | 2 +- .../AcousticVTIWaveEquationSEM.cpp | 2 +- .../AcousticVTIWaveEquationSEM.hpp | 2 +- .../AcousticVTIWaveEquationSEMKernel.hpp | 2 +- .../isotropic/AcousticPMLSEMKernel.hpp | 2 +- .../isotropic/AcousticWaveEquationSEM.cpp | 2 +- .../isotropic/AcousticWaveEquationSEM.hpp | 2 +- .../AcousticWaveEquationSEMKernel.hpp | 2 +- .../sem/acoustic/shared/AcousticFields.hpp | 2 +- .../shared/AcousticMatricesSEMKernel.hpp | 2 +- .../shared/AcousticTimeSchemeSEMKernel.hpp | 2 +- .../AcousticElasticWaveEquationSEM.cpp | 2 +- .../AcousticElasticWaveEquationSEM.hpp | 2 +- .../AcousticElasticWaveEquationSEMKernel.hpp | 2 +- .../isotropic/AcoustoElasticFields.hpp | 2 +- .../AcoustoElasticTimeSchemeSEMKernel.hpp | 2 +- .../ElasticFirstOrderWaveEquationSEM.cpp | 2 +- .../ElasticFirstOrderWaveEquationSEM.hpp | 2 +- ...ElasticFirstOrderWaveEquationSEMKernel.hpp | 2 +- .../anisotropic/ElasticVTIFields.hpp | 2 +- .../ElasticVTIWaveEquationSEMKernel.hpp | 2 +- .../isotropic/ElasticWaveEquationSEM.cpp | 2 +- .../isotropic/ElasticWaveEquationSEM.hpp | 2 +- .../ElasticWaveEquationSEMKernel.hpp | 2 +- .../sem/elastic/shared/ElasticFields.hpp | 2 +- .../shared/ElasticMatricesSEMKernel.hpp | 2 +- .../shared/ElasticTimeSchemeSEMKernel.hpp | 2 +- .../PrecomputeSourcesAndReceiversKernel.hpp | 2 +- .../wavePropagation/shared/WaveSolverBase.cpp | 2 +- .../wavePropagation/shared/WaveSolverBase.hpp | 2 +- .../shared/WaveSolverUtils.hpp | 2 +- src/coreComponents/schema/CMakeLists.txt | 2 +- src/coreComponents/schema/schemaUtilities.cpp | 2 +- src/coreComponents/schema/schemaUtilities.hpp | 2 +- src/coreComponents/unitTests/CMakeLists.txt | 2 +- .../constitutiveTests/MultiFluidTest.hpp | 2 +- .../constitutiveTestHelpers.hpp | 2 +- .../testCO2BrinePVTModels.cpp | 2 +- .../testCO2SpycherPruessModels.cpp | 2 +- .../testCapillaryPressure.cpp | 2 +- .../constitutiveTests/testDamage.cpp | 2 +- .../testMultiFluidCO2Brine.cpp | 2 +- .../testMultiFluidCompositionalMultiphase.cpp | 9 +- ...FluidCompositionalMultiphasePVTPackage.cpp | 2 +- .../testMultiFluidDeadOil.cpp | 2 +- .../testMultiFluidLiveOil.cpp | 2 +- .../unitTests/constitutiveTests/testPVT.cpp | 2 +- .../constitutiveTests/testReactiveFluid.cpp | 2 +- .../constitutiveTests/testRelPerm.cpp | 2 +- .../testRelPermHysteresis.cpp | 2 +- .../constitutiveTests/testTriaxial.cpp | 2 +- .../dataRepositoryTests/testGroupPath.cpp | 2 +- .../dataRepositoryTests/testObjectCatalog.cpp | 2 +- .../dataRepositoryTests/testRestartBasic.cpp | 2 +- .../testRestartExtended.cpp | 2 +- .../testWrapperHelpers.cpp | 2 +- .../unitTests/dataRepositoryTests/utils.hpp | 2 +- .../testAquiferBoundaryCondition.cpp | 2 +- .../testFieldSpecificationsEnums.cpp | 2 +- .../testRecursiveFieldApplication.cpp | 2 +- .../unitTests/fileIOTests/testHDFFile.cpp | 2 +- .../fileIOTests/testHDFParallelFile.cpp | 2 +- .../testMimeticInnerProducts.cpp | 2 +- .../fluidFlowTests/testCompFlowUtils.hpp | 2 +- .../fluidFlowTests/testCompMultiphaseFlow.cpp | 2 +- .../testCompMultiphaseFlowHybrid.cpp | 2 +- .../fluidFlowTests/testFlowKernelHelpers.hpp | 2 +- .../fluidFlowTests/testFlowStatistics.cpp | 2 +- .../fluidFlowTests/testFlowUtils.hpp | 2 +- ...testReactiveCompositionalMultiphaseOBL.cpp | 2 +- .../fluidFlowTests/testSingleFlowUtils.hpp | 2 +- .../testSinglePhaseFVMKernels.cpp | 2 +- .../testSinglePhaseMobilityKernel.cpp | 2 +- .../testThermalCompMultiphaseFlow.cpp | 2 +- .../testThermalSinglePhaseFlow.cpp | 2 +- .../fluidFlowTests/testTransmissibility.cpp | 9 +- .../linearAlgebraTests/testDofManager.cpp | 2 +- .../testDofManagerUtils.hpp | 2 +- .../testLAIHelperFunctions.cpp | 2 +- .../unitTests/meshTests/meshDirName.hpp.in | 2 +- .../meshTests/testElementRegions.cpp | 2 +- .../unitTests/meshTests/testMeshEnums.cpp | 2 +- .../meshTests/testMeshGeneration.cpp | 2 +- .../meshTests/testNeighborCommunicator.cpp | 2 +- .../unitTests/meshTests/testVTKImport.cpp | 2 +- .../testingUtilities/TestingTasks.cpp | 2 +- .../testingUtilities/TestingTasks.hpp | 2 +- .../unitTests/toolchain/testToolchain.cpp | 2 +- .../testConformingVirtualElementOrder1.cpp | 2 +- .../testWavePropagation.cpp | 2 +- .../testWavePropagationAcousticFirstOrder.cpp | 2 +- .../testWavePropagationAdjoint1.cpp | 2 +- .../testWavePropagationAttenuation.cpp | 2 +- .../testWavePropagationDAS.cpp | 2 +- .../testWavePropagationElasticFirstOrder.cpp | 2 +- .../testWavePropagationElasticVTI.cpp | 2 +- .../testWavePropagationQ2.cpp | 2 +- ...eservoirCompositionalMultiphaseMSWells.cpp | 9 +- ...eservoirCompositionalMultiphaseSSWells.cpp | 9 +- ...eservoirCompositionalMultiphaseMSWells.cpp | 2 +- .../testReservoirSinglePhaseMSWells.cpp | 2 +- ...eservoirCompositionalMultiphaseMSWells.cpp | 9 +- ...eservoirCompositionalMultiphaseSSWells.cpp | 9 +- .../unitTests/wellsTests/testWellEnums.cpp | 2 +- .../unitTests/xmlTests/testXML.cpp | 2 +- .../unitTests/xmlTests/testXMLFile.cpp | 2 +- .../newComponentTemplate/src/NewComponent.cpp | 2 +- .../newComponentTemplate/src/NewComponent.hpp | 2 +- .../tests/testNewComponent.cpp | 2 +- src/main/main.cpp | 2 +- src/pygeosx/pygeosx.cpp | 2 +- src/pygeosx/pygeosx.hpp | 2 +- 1357 files changed, 1551 insertions(+), 1601 deletions(-) delete mode 100644 RELEASE delete mode 100644 RELEASE_NOTES.md diff --git a/COPYRIGHT b/COPYRIGHT index 75b72981c2d..8f0b0b47cbd 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -8,7 +8,7 @@ contributors. The following copyright applies to each file in the GEOS distribution, unless otherwise stated in the file: * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/RELEASE b/RELEASE deleted file mode 100644 index 4d39ef0a36e..00000000000 --- a/RELEASE +++ /dev/null @@ -1,13 +0,0 @@ -******************************************************************************* - -GEOSX version 0.2.0 - - Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - Copyright (c) 2018-2020 TotalEnergies - Copyright (c) 2019- GEOSX Contributors - All rights reserved. See details in the file LICENSE. - -Unlimited Open Source - LGPL v2.1 Distribution -LLNL-CODE-812638 -OCEC-18-039 diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md deleted file mode 100644 index 5a0dc167c94..00000000000 --- a/RELEASE_NOTES.md +++ /dev/null @@ -1,82 +0,0 @@ -[comment]: # (-----------------------------------------------------------------) -[comment]: # (SPDX-License-Identifier: LGPL-2.1-only) -[comment]: # -[comment]: # (Copyright 2018-2020 Lawrence Livermore National Security LLC) -[comment]: # (Copyright 2018-2020 The Board of Trustees of the Leland Stanford) -[comment]: # ( Junior University) -[comment]: # (Copyright 2018-2020 Total, S.A) -[comment]: # (Copyright 2019- GEOSX Contributors) -[comment]: # (All right reserved) -[comment]: # -[comment]: # (For more details see:) -[comment]: # ( https://github.com/GEOS-DEV/GEOS/LICENSE) -[comment]: # ( https://github.com/GEOS-DEV/GEOS/COPYRIGHT) -[comment]: # ( https://github.com/GEOS-DEV/GEOS/CONTRIBUTORS) -[comment]: # ( https://github.com/GEOS-DEV/GEOS/NOTICE) -[comment]: # ( https://github.com/GEOS-DEV/GEOS/ACKNOWLEDGEMENTS) -[comment]: # ( https://github.com/GEOS-DEV/GEOS/RELEASE) - - -Version v0.2.0 -- Release date 2020-06-20 -========================================== -* Extensive updates to Data Repository -* Discretization - * Finite element interface - * Kernel launching interface looping abstraction - * Element formulations for 1st order: - * 8-node hexahedron - * 6-node wedge - * 5-node pyramid - * 4-node tetrahedron - * Cell-centered Finite Volume method with Two-point Flux Approximation (TPFA) - * Hybrid Finite Volume method with TPFA and quasi-TPFA inner products -* Physics Solvers - * Solid mechanics explicit on GPU, implicit assembly on GPU - * Single-phase flow (assembly on GPU) - * Classical FVM and Hybrid FVM formulations - * Porous matrix and DFM fracture flow - * Compositional multiphase flow (assembly on GPU) - * Fully implicit isothermal overall composition formulation - * Fluid constitutive models: - * Equation-of-state hydrocarbon compositional - * Three-phase extended black-oil - * Two-phase CO2-brine - * Multi-segmented wells for single phase and compositional multiphase flow (assembly on GPU) - * Surface Generation - * Topology change (legacy GEOS approach) -* Embedded Discrete Fractures - * Enriched finite element method for the discretization of the mechanics - * Piecewise constant displacement jump enrichment - * Hydrofracture solver (legacy GEOS approach) - * Small strain aligned contact using Lagrange multipliers - * Discrete fracture model using a low-order stabilized mixed finite element method - * Proppant Transport Solver - * FVM formulation - * Major physical processes modeled: - * Proppant-fluid slurry flow and multicomponent transport in fractures - * Proppant gravitational settling - * Proppant bed build-up and development space -* Mesh Structure - * Introduced the concept of extrinsic mesh data - * Fracture elements to represent FV cells in fractures -* VTK output -* Linear algebra interface layers for Hypre, Trilinos, Petsc - * Common interface for supported linear algebra packages - * Krylov solvers (CG, GMRES, BiCGSTAB) - * Preconditioners (algebraic multigrid, incomplete factorizations) - * Block matrix and vector support - * Serial and parallel direct solvers - - -Version v0.1.0 -- Release date 2018-02-15 -========================================== -Initial Code Release containing: -* Data Repository - * Group - * Wrapper - * Input processing -* Physics solver hierarchy - * Solid Mechanics -* Mesh data structure - * NodeManager, EdgeManager, FaceManager, ElementManager - * Silo Output diff --git a/examples/ObjectCatalog/Base.hpp b/examples/ObjectCatalog/Base.hpp index 19ba0cb73e8..2075058c05a 100644 --- a/examples/ObjectCatalog/Base.hpp +++ b/examples/ObjectCatalog/Base.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/examples/ObjectCatalog/Derived1.cpp b/examples/ObjectCatalog/Derived1.cpp index 8f688f3d486..ef257e85a78 100644 --- a/examples/ObjectCatalog/Derived1.cpp +++ b/examples/ObjectCatalog/Derived1.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/examples/ObjectCatalog/Derived1.hpp b/examples/ObjectCatalog/Derived1.hpp index 49ec9755ea2..557ae84e409 100644 --- a/examples/ObjectCatalog/Derived1.hpp +++ b/examples/ObjectCatalog/Derived1.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/examples/ObjectCatalog/Derived2.cpp b/examples/ObjectCatalog/Derived2.cpp index 3c43129c014..59e61ad94d1 100644 --- a/examples/ObjectCatalog/Derived2.cpp +++ b/examples/ObjectCatalog/Derived2.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/examples/ObjectCatalog/Derived2.hpp b/examples/ObjectCatalog/Derived2.hpp index bb06254d07e..bc3ebede41a 100644 --- a/examples/ObjectCatalog/Derived2.hpp +++ b/examples/ObjectCatalog/Derived2.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/examples/ObjectCatalog/main.cpp b/examples/ObjectCatalog/main.cpp index 11452b82e93..2a9ed5ba436 100644 --- a/examples/ObjectCatalog/main.cpp +++ b/examples/ObjectCatalog/main.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/scripts/copyrightPrepender.py b/scripts/copyrightPrepender.py index 216f3528260..1fb3a3f3925 100644 --- a/scripts/copyrightPrepender.py +++ b/scripts/copyrightPrepender.py @@ -37,7 +37,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 @@ -54,10 +54,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/scripts/pygeosx_configs/blueos_3_ppc64le_ib_p9/spack.yaml b/scripts/pygeosx_configs/blueos_3_ppc64le_ib_p9/spack.yaml index 565a12075fc..008808c9726 100644 --- a/scripts/pygeosx_configs/blueos_3_ppc64le_ib_p9/spack.yaml +++ b/scripts/pygeosx_configs/blueos_3_ppc64le_ib_p9/spack.yaml @@ -1,10 +1,10 @@ #------------------------------------------------------------------------------------------------------------ # SPDX-License-Identifier: LGPL-2.1-only # -# Copyright (c) 2018-2020 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University -# Copyright (c) 2018-2020 TotalEnergies -# Copyright (c) 2019- GEOSX Contributors +# Copyright (c) 2018-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University +# Copyright (c) 2018-2024 TotalEnergies +# Copyright (c) 2019- GEOS/GEOSX Contributors # All rights reserved # # See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/scripts/pygeosx_configs/toss_4_x86_64_ib/spack.yaml b/scripts/pygeosx_configs/toss_4_x86_64_ib/spack.yaml index 0fb9dc34d75..efc5a9acbf0 100644 --- a/scripts/pygeosx_configs/toss_4_x86_64_ib/spack.yaml +++ b/scripts/pygeosx_configs/toss_4_x86_64_ib/spack.yaml @@ -1,10 +1,10 @@ #------------------------------------------------------------------------------------------------------------ # SPDX-License-Identifier: LGPL-2.1-only # -# Copyright (c) 2018-2020 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University -# Copyright (c) 2018-2020 TotalEnergies -# Copyright (c) 2019- GEOSX Contributors +# Copyright (c) 2018-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University +# Copyright (c) 2018-2024 TotalEnergies +# Copyright (c) 2019- GEOS/GEOSX Contributors # All rights reserved # # See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/scripts/spack_configs/blueos_3_ppc64le_ib_p9/spack.yaml b/scripts/spack_configs/blueos_3_ppc64le_ib_p9/spack.yaml index 798f19bff0b..9c737836c86 100644 --- a/scripts/spack_configs/blueos_3_ppc64le_ib_p9/spack.yaml +++ b/scripts/spack_configs/blueos_3_ppc64le_ib_p9/spack.yaml @@ -1,10 +1,10 @@ #------------------------------------------------------------------------------------------------------------ # SPDX-License-Identifier: LGPL-2.1-only # -# Copyright (c) 2018-2020 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University -# Copyright (c) 2018-2020 TotalEnergies -# Copyright (c) 2019- GEOSX Contributors +# Copyright (c) 2018-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University +# Copyright (c) 2018-2024 TotalEnergies +# Copyright (c) 2019- GEOS/GEOSX Contributors # All rights reserved # # See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/scripts/spack_configs/toss_3_x86_64_ib/spack.yaml b/scripts/spack_configs/toss_3_x86_64_ib/spack.yaml index ce601ad9237..cf89682e891 100644 --- a/scripts/spack_configs/toss_3_x86_64_ib/spack.yaml +++ b/scripts/spack_configs/toss_3_x86_64_ib/spack.yaml @@ -1,10 +1,10 @@ #------------------------------------------------------------------------------------------------------------ # SPDX-License-Identifier: LGPL-2.1-only # -# Copyright (c) 2018-2020 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University -# Copyright (c) 2018-2020 TotalEnergies -# Copyright (c) 2019- GEOSX Contributors +# Copyright (c) 2018-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University +# Copyright (c) 2018-2024 TotalEnergies +# Copyright (c) 2019- GEOS/GEOSX Contributors # All rights reserved # # See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/scripts/spack_configs/toss_4_x86_64_ib/spack.yaml b/scripts/spack_configs/toss_4_x86_64_ib/spack.yaml index 817a6e8199d..7e061aa7e33 100644 --- a/scripts/spack_configs/toss_4_x86_64_ib/spack.yaml +++ b/scripts/spack_configs/toss_4_x86_64_ib/spack.yaml @@ -1,10 +1,10 @@ #------------------------------------------------------------------------------------------------------------ # SPDX-License-Identifier: LGPL-2.1-only # -# Copyright (c) 2018-2020 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University -# Copyright (c) 2018-2020 TotalEnergies -# Copyright (c) 2019- GEOSX Contributors +# Copyright (c) 2018-2024 Lawrence Livermore National Security LLC +# Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University +# Copyright (c) 2018-2024 TotalEnergies +# Copyright (c) 2019- GEOS/GEOSX Contributors # All rights reserved # # See top level LICENSE, COPYRIGHT, CONTRIBUTORS, NOTICE, and ACKNOWLEDGEMENTS files for details. diff --git a/src/coreComponents/codingUtilities/CMakeLists.txt b/src/coreComponents/codingUtilities/CMakeLists.txt index d25e033e688..0fbbae3876a 100644 --- a/src/coreComponents/codingUtilities/CMakeLists.txt +++ b/src/coreComponents/codingUtilities/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/codingUtilities/Parsing.cpp b/src/coreComponents/codingUtilities/Parsing.cpp index 3e8c970ea9f..d977ef6831e 100644 --- a/src/coreComponents/codingUtilities/Parsing.cpp +++ b/src/coreComponents/codingUtilities/Parsing.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/codingUtilities/Parsing.hpp b/src/coreComponents/codingUtilities/Parsing.hpp index 645e9615198..ec75cb757f8 100644 --- a/src/coreComponents/codingUtilities/Parsing.hpp +++ b/src/coreComponents/codingUtilities/Parsing.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/codingUtilities/RTTypes.cpp b/src/coreComponents/codingUtilities/RTTypes.cpp index 6fbf864d253..648f94e6b31 100644 --- a/src/coreComponents/codingUtilities/RTTypes.cpp +++ b/src/coreComponents/codingUtilities/RTTypes.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/codingUtilities/RTTypes.hpp b/src/coreComponents/codingUtilities/RTTypes.hpp index 93f6d89aed8..b5327b4fcb6 100644 --- a/src/coreComponents/codingUtilities/RTTypes.hpp +++ b/src/coreComponents/codingUtilities/RTTypes.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/codingUtilities/SFINAE_Macros.hpp b/src/coreComponents/codingUtilities/SFINAE_Macros.hpp index 9dfc0a9ed2a..83a5f7f8faf 100644 --- a/src/coreComponents/codingUtilities/SFINAE_Macros.hpp +++ b/src/coreComponents/codingUtilities/SFINAE_Macros.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp index 7e251ffbf0a..6bc2d0ea5b3 100644 --- a/src/coreComponents/codingUtilities/UnitTestUtilities.hpp +++ b/src/coreComponents/codingUtilities/UnitTestUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/codingUtilities/Utilities.hpp b/src/coreComponents/codingUtilities/Utilities.hpp index d4951f7185b..868d096c28b 100644 --- a/src/coreComponents/codingUtilities/Utilities.hpp +++ b/src/coreComponents/codingUtilities/Utilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp b/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp index 4c3820cc249..26f37878b4b 100644 --- a/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp +++ b/src/coreComponents/codingUtilities/tests/testGeosxTraits.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp b/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp index 5dfc65c1a8c..69872e0813a 100644 --- a/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp +++ b/src/coreComponents/codingUtilities/tests/testParallelTestUtilities.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/codingUtilities/tests/testParsing.cpp b/src/coreComponents/codingUtilities/tests/testParsing.cpp index 586697330ac..63b72772f7f 100644 --- a/src/coreComponents/codingUtilities/tests/testParsing.cpp +++ b/src/coreComponents/codingUtilities/tests/testParsing.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/codingUtilities/tests/testUtilities.cpp b/src/coreComponents/codingUtilities/tests/testUtilities.cpp index cb481fccd0e..ee0f3773446 100644 --- a/src/coreComponents/codingUtilities/tests/testUtilities.cpp +++ b/src/coreComponents/codingUtilities/tests/testUtilities.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/codingUtilities/traits.hpp b/src/coreComponents/codingUtilities/traits.hpp index 740430a56d3..ecf7b4e4dab 100644 --- a/src/coreComponents/codingUtilities/traits.hpp +++ b/src/coreComponents/codingUtilities/traits.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/BufferAllocator.cpp b/src/coreComponents/common/BufferAllocator.cpp index 26d432c28c7..bcee360d14e 100644 --- a/src/coreComponents/common/BufferAllocator.cpp +++ b/src/coreComponents/common/BufferAllocator.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/BufferAllocator.hpp b/src/coreComponents/common/BufferAllocator.hpp index 7fa789efd9b..dbce67d911c 100644 --- a/src/coreComponents/common/BufferAllocator.hpp +++ b/src/coreComponents/common/BufferAllocator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/CMakeLists.txt b/src/coreComponents/common/CMakeLists.txt index ec9e350db1d..830be7b7b1f 100644 --- a/src/coreComponents/common/CMakeLists.txt +++ b/src/coreComponents/common/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/common/DataLayouts.hpp b/src/coreComponents/common/DataLayouts.hpp index 2f6c53af4fc..e330aa00f1e 100644 --- a/src/coreComponents/common/DataLayouts.hpp +++ b/src/coreComponents/common/DataLayouts.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/DataTypes.hpp b/src/coreComponents/common/DataTypes.hpp index c458412540a..42c14433f0d 100644 --- a/src/coreComponents/common/DataTypes.hpp +++ b/src/coreComponents/common/DataTypes.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/FieldSpecificationOps.hpp b/src/coreComponents/common/FieldSpecificationOps.hpp index 534768330fd..d663aae38a7 100644 --- a/src/coreComponents/common/FieldSpecificationOps.hpp +++ b/src/coreComponents/common/FieldSpecificationOps.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/FixedSizeDeque.hpp b/src/coreComponents/common/FixedSizeDeque.hpp index 5746419ca71..207d5dc7efb 100644 --- a/src/coreComponents/common/FixedSizeDeque.hpp +++ b/src/coreComponents/common/FixedSizeDeque.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp b/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp index 800e1e1806f..68d1e9b983b 100644 --- a/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp +++ b/src/coreComponents/common/FixedSizeDequeWithMutexes.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/GEOS_RAJA_Interface.hpp b/src/coreComponents/common/GEOS_RAJA_Interface.hpp index 3b651c9e5c6..d1b2f2e3c8b 100644 --- a/src/coreComponents/common/GEOS_RAJA_Interface.hpp +++ b/src/coreComponents/common/GEOS_RAJA_Interface.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/GeosxConfig.hpp.in b/src/coreComponents/common/GeosxConfig.hpp.in index 704a9ebd0ac..f09203faf06 100644 --- a/src/coreComponents/common/GeosxConfig.hpp.in +++ b/src/coreComponents/common/GeosxConfig.hpp.in @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/GeosxMacros.hpp b/src/coreComponents/common/GeosxMacros.hpp index f73cb2740a3..bf3ab070948 100644 --- a/src/coreComponents/common/GeosxMacros.hpp +++ b/src/coreComponents/common/GeosxMacros.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/LifoStorage.hpp b/src/coreComponents/common/LifoStorage.hpp index 16ce24f0e13..a8e68640fc5 100644 --- a/src/coreComponents/common/LifoStorage.hpp +++ b/src/coreComponents/common/LifoStorage.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/LifoStorageCommon.hpp b/src/coreComponents/common/LifoStorageCommon.hpp index 08c1144e9fe..3183cde65b8 100644 --- a/src/coreComponents/common/LifoStorageCommon.hpp +++ b/src/coreComponents/common/LifoStorageCommon.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/LifoStorageCuda.hpp b/src/coreComponents/common/LifoStorageCuda.hpp index bb03115f011..58016032dcb 100644 --- a/src/coreComponents/common/LifoStorageCuda.hpp +++ b/src/coreComponents/common/LifoStorageCuda.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/LifoStorageHost.hpp b/src/coreComponents/common/LifoStorageHost.hpp index f787f10a17f..348b4a4109c 100644 --- a/src/coreComponents/common/LifoStorageHost.hpp +++ b/src/coreComponents/common/LifoStorageHost.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/MemoryInfos.cpp b/src/coreComponents/common/MemoryInfos.cpp index 4ad404188e3..1e31cdb6bed 100644 --- a/src/coreComponents/common/MemoryInfos.cpp +++ b/src/coreComponents/common/MemoryInfos.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/MemoryInfos.hpp b/src/coreComponents/common/MemoryInfos.hpp index a3dcc024359..3500093c6de 100644 --- a/src/coreComponents/common/MemoryInfos.hpp +++ b/src/coreComponents/common/MemoryInfos.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/MpiWrapper.cpp b/src/coreComponents/common/MpiWrapper.cpp index f2b830e734e..f050151a3e4 100644 --- a/src/coreComponents/common/MpiWrapper.cpp +++ b/src/coreComponents/common/MpiWrapper.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/MpiWrapper.hpp b/src/coreComponents/common/MpiWrapper.hpp index f6f0136eb55..22def51e1e8 100644 --- a/src/coreComponents/common/MpiWrapper.hpp +++ b/src/coreComponents/common/MpiWrapper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/MultiMutexesLock.hpp b/src/coreComponents/common/MultiMutexesLock.hpp index e3142abbadc..aebd4fa036e 100644 --- a/src/coreComponents/common/MultiMutexesLock.hpp +++ b/src/coreComponents/common/MultiMutexesLock.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/Path.cpp b/src/coreComponents/common/Path.cpp index a983e5af3cc..30cf6d278e7 100644 --- a/src/coreComponents/common/Path.cpp +++ b/src/coreComponents/common/Path.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/Path.hpp b/src/coreComponents/common/Path.hpp index 9f768838e31..fe1015d78ff 100644 --- a/src/coreComponents/common/Path.hpp +++ b/src/coreComponents/common/Path.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/PhysicsConstants.hpp b/src/coreComponents/common/PhysicsConstants.hpp index 50a2384ef8c..69274cf7f91 100644 --- a/src/coreComponents/common/PhysicsConstants.hpp +++ b/src/coreComponents/common/PhysicsConstants.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/Span.hpp b/src/coreComponents/common/Span.hpp index 49469bf968e..3fc2185273a 100644 --- a/src/coreComponents/common/Span.hpp +++ b/src/coreComponents/common/Span.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/Stopwatch.hpp b/src/coreComponents/common/Stopwatch.hpp index 9aec6f65f66..0c6a6fd11a7 100644 --- a/src/coreComponents/common/Stopwatch.hpp +++ b/src/coreComponents/common/Stopwatch.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/Tensor.hpp b/src/coreComponents/common/Tensor.hpp index 602f21794e1..3af62760530 100644 --- a/src/coreComponents/common/Tensor.hpp +++ b/src/coreComponents/common/Tensor.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/Timer.hpp b/src/coreComponents/common/Timer.hpp index f7a4b342dcc..ddd5f580119 100644 --- a/src/coreComponents/common/Timer.hpp +++ b/src/coreComponents/common/Timer.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/TimingMacros.hpp b/src/coreComponents/common/TimingMacros.hpp index c9935cbd1b6..3d42f1d83b4 100644 --- a/src/coreComponents/common/TimingMacros.hpp +++ b/src/coreComponents/common/TimingMacros.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/TypeDispatch.hpp b/src/coreComponents/common/TypeDispatch.hpp index 282c9421589..a1881944de2 100644 --- a/src/coreComponents/common/TypeDispatch.hpp +++ b/src/coreComponents/common/TypeDispatch.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/Units.cpp b/src/coreComponents/common/Units.cpp index 746cd866a7c..e249441f3ff 100644 --- a/src/coreComponents/common/Units.cpp +++ b/src/coreComponents/common/Units.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/Units.hpp b/src/coreComponents/common/Units.hpp index ba35f3fb8d6..8bfdc04ca80 100644 --- a/src/coreComponents/common/Units.hpp +++ b/src/coreComponents/common/Units.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/EnumStrings.hpp b/src/coreComponents/common/format/EnumStrings.hpp index 4d4c2eaa6ce..f5b37de1df1 100644 --- a/src/coreComponents/common/format/EnumStrings.hpp +++ b/src/coreComponents/common/format/EnumStrings.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/Format.hpp b/src/coreComponents/common/format/Format.hpp index de5954dcc37..23f3e3225e3 100644 --- a/src/coreComponents/common/format/Format.hpp +++ b/src/coreComponents/common/format/Format.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/StringUtilities.cpp b/src/coreComponents/common/format/StringUtilities.cpp index b8f316456f8..004c82276bb 100644 --- a/src/coreComponents/common/format/StringUtilities.cpp +++ b/src/coreComponents/common/format/StringUtilities.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/StringUtilities.hpp b/src/coreComponents/common/format/StringUtilities.hpp index b98f03afef9..79b0333d0a2 100644 --- a/src/coreComponents/common/format/StringUtilities.hpp +++ b/src/coreComponents/common/format/StringUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/table/TableData.cpp b/src/coreComponents/common/format/table/TableData.cpp index dcbec10a01a..5153bf58752 100644 --- a/src/coreComponents/common/format/table/TableData.cpp +++ b/src/coreComponents/common/format/table/TableData.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/table/TableData.hpp b/src/coreComponents/common/format/table/TableData.hpp index aa35f06a0f6..0842c3a4fbe 100644 --- a/src/coreComponents/common/format/table/TableData.hpp +++ b/src/coreComponents/common/format/table/TableData.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/table/TableFormatter.cpp b/src/coreComponents/common/format/table/TableFormatter.cpp index 56f529bdcee..7392834e060 100644 --- a/src/coreComponents/common/format/table/TableFormatter.cpp +++ b/src/coreComponents/common/format/table/TableFormatter.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/table/TableFormatter.hpp b/src/coreComponents/common/format/table/TableFormatter.hpp index 165533445b6..26dd2b16ba4 100644 --- a/src/coreComponents/common/format/table/TableFormatter.hpp +++ b/src/coreComponents/common/format/table/TableFormatter.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/table/TableLayout.cpp b/src/coreComponents/common/format/table/TableLayout.cpp index 7912baa9211..7e6b134d606 100644 --- a/src/coreComponents/common/format/table/TableLayout.cpp +++ b/src/coreComponents/common/format/table/TableLayout.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/table/TableLayout.hpp b/src/coreComponents/common/format/table/TableLayout.hpp index 4f24fa5559c..e6f96a878eb 100644 --- a/src/coreComponents/common/format/table/TableLayout.hpp +++ b/src/coreComponents/common/format/table/TableLayout.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/table/unitTests/testTable.cpp b/src/coreComponents/common/format/table/unitTests/testTable.cpp index 3663b5eae22..0258385b1a1 100644 --- a/src/coreComponents/common/format/table/unitTests/testTable.cpp +++ b/src/coreComponents/common/format/table/unitTests/testTable.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/format/unitTests/testStringUtilities.cpp b/src/coreComponents/common/format/unitTests/testStringUtilities.cpp index 94ca8bc039e..57dca300d6f 100644 --- a/src/coreComponents/common/format/unitTests/testStringUtilities.cpp +++ b/src/coreComponents/common/format/unitTests/testStringUtilities.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/initializeEnvironment.cpp b/src/coreComponents/common/initializeEnvironment.cpp index ee3b826aec6..179f7ca4279 100644 --- a/src/coreComponents/common/initializeEnvironment.cpp +++ b/src/coreComponents/common/initializeEnvironment.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/initializeEnvironment.hpp b/src/coreComponents/common/initializeEnvironment.hpp index d6364028799..9cd72d023ad 100644 --- a/src/coreComponents/common/initializeEnvironment.hpp +++ b/src/coreComponents/common/initializeEnvironment.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/logger/Logger.cpp b/src/coreComponents/common/logger/Logger.cpp index bd800697524..0ea4c47a7cb 100644 --- a/src/coreComponents/common/logger/Logger.cpp +++ b/src/coreComponents/common/logger/Logger.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/logger/Logger.hpp b/src/coreComponents/common/logger/Logger.hpp index a10c5330b19..0d0cf69c3bf 100644 --- a/src/coreComponents/common/logger/Logger.hpp +++ b/src/coreComponents/common/logger/Logger.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/unitTests/testCaliperSmoke.cpp b/src/coreComponents/common/unitTests/testCaliperSmoke.cpp index 2c3b5fa8cde..7376aeb55c6 100644 --- a/src/coreComponents/common/unitTests/testCaliperSmoke.cpp +++ b/src/coreComponents/common/unitTests/testCaliperSmoke.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/unitTests/testDataTypes.cpp b/src/coreComponents/common/unitTests/testDataTypes.cpp index b5c2a1f87ee..f83a3f13d5e 100644 --- a/src/coreComponents/common/unitTests/testDataTypes.cpp +++ b/src/coreComponents/common/unitTests/testDataTypes.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp b/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp index e5f64662e64..05293b3fc6c 100644 --- a/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp +++ b/src/coreComponents/common/unitTests/testFixedSizeDeque.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/unitTests/testLifoStorage.cpp b/src/coreComponents/common/unitTests/testLifoStorage.cpp index f5b260b0b28..54c5a864bc3 100644 --- a/src/coreComponents/common/unitTests/testLifoStorage.cpp +++ b/src/coreComponents/common/unitTests/testLifoStorage.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/unitTests/testTypeDispatch.cpp b/src/coreComponents/common/unitTests/testTypeDispatch.cpp index 414436cd46d..c252adb9fc5 100644 --- a/src/coreComponents/common/unitTests/testTypeDispatch.cpp +++ b/src/coreComponents/common/unitTests/testTypeDispatch.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/common/unitTests/testUnits.cpp b/src/coreComponents/common/unitTests/testUnits.cpp index f94a3616b5e..59651a53588 100644 --- a/src/coreComponents/common/unitTests/testUnits.cpp +++ b/src/coreComponents/common/unitTests/testUnits.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/CMakeLists.txt b/src/coreComponents/constitutive/CMakeLists.txt index b8a3d02c811..e7f798c3b5f 100644 --- a/src/coreComponents/constitutive/CMakeLists.txt +++ b/src/coreComponents/constitutive/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/constitutive/ConstitutiveBase.cpp b/src/coreComponents/constitutive/ConstitutiveBase.cpp index 2c7334239c3..03bf6852ecc 100644 --- a/src/coreComponents/constitutive/ConstitutiveBase.cpp +++ b/src/coreComponents/constitutive/ConstitutiveBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/ConstitutiveBase.hpp b/src/coreComponents/constitutive/ConstitutiveBase.hpp index c025a58bb4b..12fa1449142 100644 --- a/src/coreComponents/constitutive/ConstitutiveBase.hpp +++ b/src/coreComponents/constitutive/ConstitutiveBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/ConstitutiveManager.cpp b/src/coreComponents/constitutive/ConstitutiveManager.cpp index 38d47321344..e3e59bb7554 100644 --- a/src/coreComponents/constitutive/ConstitutiveManager.cpp +++ b/src/coreComponents/constitutive/ConstitutiveManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/ConstitutiveManager.hpp b/src/coreComponents/constitutive/ConstitutiveManager.hpp index fbea4c187ed..1ef7f194314 100644 --- a/src/coreComponents/constitutive/ConstitutiveManager.hpp +++ b/src/coreComponents/constitutive/ConstitutiveManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/ConstitutivePassThru.hpp b/src/coreComponents/constitutive/ConstitutivePassThru.hpp index 3ec1b954192..ec72812cdb1 100644 --- a/src/coreComponents/constitutive/ConstitutivePassThru.hpp +++ b/src/coreComponents/constitutive/ConstitutivePassThru.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp b/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp index 54dc51b24cc..1597cc65cc4 100644 --- a/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp +++ b/src/coreComponents/constitutive/ConstitutivePassThruHandler.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/ExponentialRelation.hpp b/src/coreComponents/constitutive/ExponentialRelation.hpp index e2215b23f1b..2982b0b8e5f 100644 --- a/src/coreComponents/constitutive/ExponentialRelation.hpp +++ b/src/coreComponents/constitutive/ExponentialRelation.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/NullModel.cpp b/src/coreComponents/constitutive/NullModel.cpp index 7ec9e6f19c0..9676802af3d 100644 --- a/src/coreComponents/constitutive/NullModel.cpp +++ b/src/coreComponents/constitutive/NullModel.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/NullModel.hpp b/src/coreComponents/constitutive/NullModel.hpp index e26a34b525b..ceddf84a4ac 100644 --- a/src/coreComponents/constitutive/NullModel.hpp +++ b/src/coreComponents/constitutive/NullModel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/PVTPackage b/src/coreComponents/constitutive/PVTPackage index 3bf1c021569..374b72962f7 160000 --- a/src/coreComponents/constitutive/PVTPackage +++ b/src/coreComponents/constitutive/PVTPackage @@ -1 +1 @@ -Subproject commit 3bf1c02156911768f022fc2954939ee1c1c2f66d +Subproject commit 374b72962f7e605e74a1943c541e94d7b3f492a3 diff --git a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp index eab49c34049..16315425bee 100644 --- a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp index 67f4195d31b..c020174dd21 100644 --- a/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/BrooksCoreyCapillaryPressure.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp index b3d7e2bba0b..97eb0127978 100644 --- a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp index b63aea24aac..a4c11561d83 100644 --- a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp index b9836e21f11..db38eb3fdc1 100644 --- a/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/CapillaryPressureFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp index 1dda8c49484..908c42604b4 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp index 58ceb90ab73..55f099e24fa 100644 --- a/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/JFunctionCapillaryPressure.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp index 13d9926f49a..2304238b540 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp index 170055d19bb..739b9993083 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressure.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp index 818f869f2b4..6e4da85ccba 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp index 3e66d868928..9e3504b1a8a 100644 --- a/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/TableCapillaryPressureHelpers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp index d739e9e2d5b..31a965992ad 100644 --- a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp +++ b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp index 17e58221279..14944dd980b 100644 --- a/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/VanGenuchtenCapillaryPressure.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp b/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp index ad6b69b9082..b164f55aa16 100644 --- a/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/capillaryPressureSelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/capillaryPressure/layouts.hpp b/src/coreComponents/constitutive/capillaryPressure/layouts.hpp index e66655c18b9..d4903b67c31 100644 --- a/src/coreComponents/constitutive/capillaryPressure/layouts.hpp +++ b/src/coreComponents/constitutive/capillaryPressure/layouts.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/contact/BartonBandis.cpp b/src/coreComponents/constitutive/contact/BartonBandis.cpp index e1e3c050285..f478c015b28 100644 --- a/src/coreComponents/constitutive/contact/BartonBandis.cpp +++ b/src/coreComponents/constitutive/contact/BartonBandis.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/constitutive/contact/BartonBandis.hpp b/src/coreComponents/constitutive/contact/BartonBandis.hpp index 77d8a636e02..64f9281924b 100644 --- a/src/coreComponents/constitutive/contact/BartonBandis.hpp +++ b/src/coreComponents/constitutive/contact/BartonBandis.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.cpp b/src/coreComponents/constitutive/contact/CoulombFriction.cpp index a7bc27300dc..d59d3d99a45 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.cpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/contact/CoulombFriction.hpp b/src/coreComponents/constitutive/contact/CoulombFriction.hpp index a43fdcbbdc0..d64453fe31a 100644 --- a/src/coreComponents/constitutive/contact/CoulombFriction.hpp +++ b/src/coreComponents/constitutive/contact/CoulombFriction.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/contact/FrictionBase.cpp b/src/coreComponents/constitutive/contact/FrictionBase.cpp index a4443bcf335..d440e9c53bb 100644 --- a/src/coreComponents/constitutive/contact/FrictionBase.cpp +++ b/src/coreComponents/constitutive/contact/FrictionBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/constitutive/contact/FrictionBase.hpp b/src/coreComponents/constitutive/contact/FrictionBase.hpp index 2011310ee6e..d44a9fae7d4 100644 --- a/src/coreComponents/constitutive/contact/FrictionBase.hpp +++ b/src/coreComponents/constitutive/contact/FrictionBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/constitutive/contact/FrictionSelector.hpp b/src/coreComponents/constitutive/contact/FrictionSelector.hpp index 08b7a232a1b..7ed06f6a797 100644 --- a/src/coreComponents/constitutive/contact/FrictionSelector.hpp +++ b/src/coreComponents/constitutive/contact/FrictionSelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.cpp b/src/coreComponents/constitutive/contact/FrictionlessContact.cpp index e7fb6bb8ba6..de63d4d8812 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.cpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp index 31a13a088c2..1b17e07dfd7 100644 --- a/src/coreComponents/constitutive/contact/FrictionlessContact.hpp +++ b/src/coreComponents/constitutive/contact/FrictionlessContact.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureBase.cpp b/src/coreComponents/constitutive/contact/HydraulicApertureBase.cpp index 81ca7a55097..2f5c715453c 100644 --- a/src/coreComponents/constitutive/contact/HydraulicApertureBase.cpp +++ b/src/coreComponents/constitutive/contact/HydraulicApertureBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureBase.hpp b/src/coreComponents/constitutive/contact/HydraulicApertureBase.hpp index dab7b35957d..701a20213fc 100644 --- a/src/coreComponents/constitutive/contact/HydraulicApertureBase.hpp +++ b/src/coreComponents/constitutive/contact/HydraulicApertureBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureRelationSelector.hpp b/src/coreComponents/constitutive/contact/HydraulicApertureRelationSelector.hpp index 0d32794c1eb..f8675f1dc1e 100644 --- a/src/coreComponents/constitutive/contact/HydraulicApertureRelationSelector.hpp +++ b/src/coreComponents/constitutive/contact/HydraulicApertureRelationSelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp index b57d9e3e58e..6fe5c08b42f 100644 --- a/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp +++ b/src/coreComponents/constitutive/contact/HydraulicApertureTable.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp b/src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp index 2022e6cec5c..49aad4568bd 100644 --- a/src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp +++ b/src/coreComponents/constitutive/contact/HydraulicApertureTable.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/contact/RateAndStateFriction.cpp b/src/coreComponents/constitutive/contact/RateAndStateFriction.cpp index f26954a3316..30d43c9ae7f 100644 --- a/src/coreComponents/constitutive/contact/RateAndStateFriction.cpp +++ b/src/coreComponents/constitutive/contact/RateAndStateFriction.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/contact/RateAndStateFriction.hpp b/src/coreComponents/constitutive/contact/RateAndStateFriction.hpp index bab0684bca6..e05a4089838 100644 --- a/src/coreComponents/constitutive/contact/RateAndStateFriction.hpp +++ b/src/coreComponents/constitutive/contact/RateAndStateFriction.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 TotalEnergies * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University * Copyright (c) 2018-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors diff --git a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp index d53096ba4ff..cff80fed216 100644 --- a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp +++ b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp index c482781b8bb..66f586ab637 100644 --- a/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp +++ b/src/coreComponents/constitutive/diffusion/ConstantDiffusion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp index 8bacdb7dfb5..491bc987a99 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp b/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp index 7bc5daed75b..430d52852f2 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp b/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp index 397f6214553..e570a5584d8 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp b/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp index fe077fef543..40325527e2c 100644 --- a/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp +++ b/src/coreComponents/constitutive/diffusion/DiffusionSelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/dispersion/DispersionBase.cpp b/src/coreComponents/constitutive/dispersion/DispersionBase.cpp index 8e15b45fe77..2789f5a07d9 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionBase.cpp +++ b/src/coreComponents/constitutive/dispersion/DispersionBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/dispersion/DispersionBase.hpp b/src/coreComponents/constitutive/dispersion/DispersionBase.hpp index 6ced3ca28b8..4a653aed6e0 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionBase.hpp +++ b/src/coreComponents/constitutive/dispersion/DispersionBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/dispersion/DispersionFields.hpp b/src/coreComponents/constitutive/dispersion/DispersionFields.hpp index 0baca85dca8..a4be8187737 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionFields.hpp +++ b/src/coreComponents/constitutive/dispersion/DispersionFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp b/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp index 3dda4ba2ab1..c330115a49b 100644 --- a/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp +++ b/src/coreComponents/constitutive/dispersion/DispersionSelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp index 5f49d1a66fd..88e0339f142 100644 --- a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp +++ b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp index 949f72e51d6..de7193694b1 100644 --- a/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp +++ b/src/coreComponents/constitutive/dispersion/LinearIsotropicDispersion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp index c90b6c296f6..ee6b5482a92 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp index 3675ff4ac81..7b35053a4ab 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp index 9c398939b62..d422cc39bd4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/PhaseModel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp index 5edd296fd51..27eb1053d38 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp index 2e000d40f97..5231b07740d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp index 227f5a93912..1ab2bf40a91 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp index 534c9d1f1d2..bb5a47ea10a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2EOSSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp index 01683a9dd64..90de88580bf 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp index 034ad20475a..6cc0852f4ae 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp index 131fdb60ed9..f3946b7bc0d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp index fe24e1e0270..9e637b7c9b7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp index 7defd458bd4..3170912fecc 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp index 9b918c8be5f..92c37932e5d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilityDuanSun.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp index f9ce8006fc9..4d832d01a27 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp index 1f612890a9a..187ad434fdb 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2SolubilitySpycherPruess.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp index a1a7c238df4..d35b2c040f5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp index 5942eff4f0a..edf0d083335 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineDensity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp index c0411ad922b..65976e0d0d9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp index 7140a4ca41c..bcecc698226 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/EzrokhiBrineViscosity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp index 11bc6522254..9664a1b3ec4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp index ea490882910..889c1e39451 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FenghourCO2Viscosity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp index acef1ec1ab0..ca568be573c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/FlashModelBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp index c647a071f79..4be877cc7d7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/NoOpPVTFunction.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp index 135d7c899c4..877d097bf47 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp index b0297d9b00e..d38da4703bf 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp index 9dde0d4cf39..91afd9c887d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PVTFunctionHelpers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp index 017f5ab92f8..de646696998 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp index fbfa037be96..6a1147d57ee 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineDensity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp index 8dd96a8a82d..a38a58cc664 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp index bdb6bfa0f5a..1f429e5d559 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PhillipsBrineViscosity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp index a3cb6458b94..3d47411ea94 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp index 872983ce8b8..15d39c325ef 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/PureWaterProperties.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp index 0ef520014a0..d2922a6a174 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp index f729064fcf0..fcaaff68ca2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/SpanWagnerCO2Density.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp index 41a047c11b5..bcfccaf9754 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp index 36cd4932661..2787b80f124 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/WaterDensity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp b/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp index 626f988104e..49a0431a292 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/Layouts.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp index 1afc822b97b..506741cf8d4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp index 97a3acff8a5..dbddad1cd41 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp index 191d49a90bb..1fbd6db0aca 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidConstants.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp index 4983406b17a..bc47e09d759 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp index 7ca5afe50cc..5636a98d99d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidSelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp index 68283ef38c5..900561fa5e9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/MultiFluidUtils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp index 66e017b23fe..a1e44064dd1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp index f789a7a82c2..444330af0b0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp index 0e86a3e7777..45e40461025 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp index eb7215a8361..a5f4f9b7569 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/BlackOilFluidBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp index 91162808882..ef8888c16d1 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp index 86d82b50114..0b87bbd7d6a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/DeadOilFluid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp index 1a36a2e124b..a8d96c41d82 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp index cec6671cb93..d73bfb702e7 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/blackOil/PVTOData.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp index 6e95fed3f4c..493c92db612 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp index b43047ade63..e4bb5789175 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp index 0edd0113625..9aea320884d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp index e6fa1574e55..1b5d9b6db4a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidPVTPackage.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp index 1ef2d44b8f7..299dd2eb111 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp index c3a301e98a5..ee3b4ee1dd0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluidUpdates.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp index d58252d405f..c0bfac86dda 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalProperties.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp index d7ac72c2912..9c6a39b30b3 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CompositionalPropertiesImpl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp index ac6d7efc240..faa8d4496bd 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/CubicEOSPhaseModel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp index 758a4e8ec89..2fa6af3a6fd 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/FugacityCalculator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp index 7135d944906..f19219aeb94 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/KValueInitialization.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp index f492995b1ad..2af75b9b4b9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp index f12b715cbe7..4b997c2c45b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/RachfordRice.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp index 95577d6a2c4..2317bcfd342 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/StabilityTest.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp index 2d92185454f..e4a99359228 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ComponentProperties.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp index 6fe6b1a11e7..99802799c43 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp index 9fce5bdd029..beb58c14fb2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CompositionalDensity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp index 76c565f51a7..a3239a34f21 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp index d7fabd362d6..cee73c0ae1c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ConstantViscosity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.cpp index e62ddefe077..95d147af02f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.hpp index c191e3cad2c..3221e403eca 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/CriticalVolume.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp index f88b8608b39..b27dd249318 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/EquationOfState.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp index 60d15385144..2bb0299e24c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/FunctionBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.cpp index e257b3b984a..22bb8d40b9d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 TotalEnergies * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University * Copyright (c) 2018-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.hpp index 9d258085649..8afadca5bbf 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterDensity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 TotalEnergies * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University * Copyright (c) 2018-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp index 62fafd82953..d095bcf0df8 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp index 96b213940c1..d154b45d97f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterFlashModel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp index ddb64316270..217b5ad54ae 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp index da1e0e4ddf4..76242ba5ed4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterParameters.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.cpp index d1e5cd30867..37d070a1a46 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 TotalEnergies * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University * Copyright (c) 2018-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.hpp index 815769110ab..453589962e4 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ImmiscibleWaterViscosity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 TotalEnergies * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University * Copyright (c) 2018-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp index 615e24ab9c1..fc06c82a949 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp index 95cb6644d9f..bf9a47c70f0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp index 1a1999e78ba..590da10921d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/LohrenzBrayClarkViscosityImpl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp index 922e1ef877c..3cc6f0a4333 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/ModelParameters.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp index 12d0e5ba541..16a39c39e23 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp index c1696c2a635..d55d3df6656 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp index 9226dda9343..dd10f7caef5 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NullModel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp index bf13c8d01ab..c99b723c0b0 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/PhaseModel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp index fa2dc6eb819..7451008cd6c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp index 2ee7cf86687..f1d88712b00 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveBrineFluid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp index c322d6a3fb5..03439e9629b 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveFluidSelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp index 7e66577b671..09ac848a16a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp index 3a9cd32f95c..71ebd796571 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp index 83fda798442..d3a3a77f967 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/ReactiveMultiFluidFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp index 7c5bc5b162b..8ae3e0c8ee2 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp index ecd3a28633d..e3908d4df7d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/EquilibriumReactions.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp index 7a17afc8666..5009c9fbeae 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp index 05f82ae4d64..7c2ff5bf64a 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/KineticReactions.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp index 3b8f8a6db28..df579b3587e 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp index 35c084290c1..8b3e01b335f 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/reactive/chemicalReactions/ReactionsBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp index 28550afbfc6..76646b5222a 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp index d4c545b002e..b28f2109a21 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/CompressibleSinglePhaseFluid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp index 38f067be667..adf166a4540 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp index c218ffbbad4..a6a724f0933 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp index 778d9a752ab..d4faa0d8a20 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp index 761e0c63a28..9960b7376ee 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp index fd8a69196fd..30b10912683 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp index f7e39e26b73..f0033da5c48 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ParticleFluidSelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp index 4c59aeb37ba..95c4d0a8fb0 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp index 0a9c1610635..eb8809bac58 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ProppantSlurryFluid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp index e9870a759a4..b5a91dfdb58 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp index d5f63c8dedb..d94b98672e5 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp index 61949828116..8714083accd 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp index cdb7103fd1a..be6560c6c21 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SingleFluidSelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp index c51906552a5..11a49d4da84 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp index 2ab967932c9..94a101b32e3 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp index fe45d82982f..55bd3b82b6f 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp index 731c0856eec..53b341c95fb 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/SlurryFluidSelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp index 181af8bcba2..af28e00814a 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp index 01d7a802e6d..af79dd929c1 100644 --- a/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp +++ b/src/coreComponents/constitutive/fluid/singlefluid/ThermalCompressibleSinglePhaseFluid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp index 598f0851e5a..f57f52ffd77 100644 --- a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp index 56215dd6df5..2d7605b4871 100644 --- a/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/CarmanKozenyPermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp b/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp index 798bc79bb9a..eecbc1c6645 100644 --- a/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ConstantPermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp b/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp index 70954cf1e22..4357ea50b5d 100644 --- a/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ConstantPermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp index 31ecf701137..4ac85ac4d9a 100644 --- a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp index df2136e18dd..c8d39b0bfcf 100644 --- a/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ExponentialDecayPermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp index 65b42bb0103..379a584bbd0 100644 --- a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp index 0f42a319307..6977221fbfd 100644 --- a/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ParallelPlatesPermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp b/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp index 949adb86f97..0086cf6dc13 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp index 6c7cb62bdd9..d983bcf8d8e 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp b/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp index cafb94fb3ee..e1a48f17618 100644 --- a/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp +++ b/src/coreComponents/constitutive/permeability/PermeabilityFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp index 625b4af4c38..abcb8cde307 100644 --- a/src/coreComponents/constitutive/permeability/PressurePermeability.cpp +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/PressurePermeability.hpp b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp index 28ad3559670..df517530771 100644 --- a/src/coreComponents/constitutive/permeability/PressurePermeability.hpp +++ b/src/coreComponents/constitutive/permeability/PressurePermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp b/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp index b9a72df93bc..201afe3fd63 100644 --- a/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/ProppantPermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp b/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp index 3c81228d217..73b54febf02 100644 --- a/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/ProppantPermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp index ca69e02561e..63d17baa9e5 100644 --- a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp index b7d52617a64..2c883115fa9 100644 --- a/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/SlipDependentPermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp index 9be8d42e3b2..b57ae9b5086 100644 --- a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp +++ b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp index d1d6a846745..400e8f8356c 100644 --- a/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp +++ b/src/coreComponents/constitutive/permeability/WillisRichardsPermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp index b43afd85521..bb8ad661a74 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp index 723abef4df9..f1d80333f86 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyBakerRelativePermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp index 458a0fc23b1..2c64e5de56c 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp index e4fc6195e7e..4518603dc3e 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyRelativePermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp index f7bf08c0f4f..8eb25929ddb 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp index c6486d65551..7cb1a097537 100644 --- a/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/BrooksCoreyStone2RelativePermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp index 093dd9a52fd..1376c0a6b6a 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp index 16100d449d2..9fac61f555e 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp index d4aad3b60e0..06f4cf37ec8 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp index b2e18b9df9a..7f44d468490 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilityInterpolators.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp index 6ee5cd3d31d..ee20a4c4f6e 100644 --- a/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp +++ b/src/coreComponents/constitutive/relativePermeability/RelativePermeabilitySelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp index 26bd464c4ac..cd88449a1b1 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp index 89ad0cc0460..363cea73608 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp index ab8fa7e3749..0edd1537af7 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp index bb220ab6bdc..275949a41ff 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHelpers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp index 5fda6ae4c6a..44ce342cd09 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp index 7e5edb71292..f5390ff7034 100644 --- a/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp +++ b/src/coreComponents/constitutive/relativePermeability/TableRelativePermeabilityHysteresis.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp index b690d9abcfe..12823c81163 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp index cf3d399f2ef..dae8a72c3c7 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenBakerRelativePermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp index 816b4639ace..dbb0ee05f0e 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp index 28c9adda0b7..8a9c6db6217 100644 --- a/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp +++ b/src/coreComponents/constitutive/relativePermeability/VanGenuchtenStone2RelativePermeability.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/relativePermeability/layouts.hpp b/src/coreComponents/constitutive/relativePermeability/layouts.hpp index 54c2e307a30..9343a7a36a6 100644 --- a/src/coreComponents/constitutive/relativePermeability/layouts.hpp +++ b/src/coreComponents/constitutive/relativePermeability/layouts.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/CeramicDamage.cpp b/src/coreComponents/constitutive/solid/CeramicDamage.cpp index 77cc069f45b..389cf93a711 100644 --- a/src/coreComponents/constitutive/solid/CeramicDamage.cpp +++ b/src/coreComponents/constitutive/solid/CeramicDamage.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/CeramicDamage.hpp b/src/coreComponents/constitutive/solid/CeramicDamage.hpp index e53fb9c4eb7..1575fe84fac 100644 --- a/src/coreComponents/constitutive/solid/CeramicDamage.hpp +++ b/src/coreComponents/constitutive/solid/CeramicDamage.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/CompressibleSolid.cpp b/src/coreComponents/constitutive/solid/CompressibleSolid.cpp index 2366d66654b..a0e5609b618 100644 --- a/src/coreComponents/constitutive/solid/CompressibleSolid.cpp +++ b/src/coreComponents/constitutive/solid/CompressibleSolid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp index 0fc8464a260..83e0690e9a4 100644 --- a/src/coreComponents/constitutive/solid/CompressibleSolid.hpp +++ b/src/coreComponents/constitutive/solid/CompressibleSolid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/CoupledSolid.hpp b/src/coreComponents/constitutive/solid/CoupledSolid.hpp index e255738fd22..2c2e508e12a 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolid.hpp +++ b/src/coreComponents/constitutive/solid/CoupledSolid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp b/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp index 70cdb0f1a3c..14c7a2fcc0b 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp +++ b/src/coreComponents/constitutive/solid/CoupledSolidBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp index abeb42ffb23..c91395707f1 100644 --- a/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp +++ b/src/coreComponents/constitutive/solid/CoupledSolidBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/Damage.cpp b/src/coreComponents/constitutive/solid/Damage.cpp index 46f64f49621..6515fe4990d 100644 --- a/src/coreComponents/constitutive/solid/Damage.cpp +++ b/src/coreComponents/constitutive/solid/Damage.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/Damage.hpp b/src/coreComponents/constitutive/solid/Damage.hpp index 53eb7b6b1b4..5c2cc22488e 100644 --- a/src/coreComponents/constitutive/solid/Damage.hpp +++ b/src/coreComponents/constitutive/solid/Damage.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DamageSpectral.cpp b/src/coreComponents/constitutive/solid/DamageSpectral.cpp index 995870109c1..68e67cd0fb6 100644 --- a/src/coreComponents/constitutive/solid/DamageSpectral.cpp +++ b/src/coreComponents/constitutive/solid/DamageSpectral.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DamageSpectral.hpp b/src/coreComponents/constitutive/solid/DamageSpectral.hpp index 6e2fe29a2b2..5ad79b47567 100644 --- a/src/coreComponents/constitutive/solid/DamageSpectral.hpp +++ b/src/coreComponents/constitutive/solid/DamageSpectral.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp b/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp index ebd09c0defe..1706ded507a 100644 --- a/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp +++ b/src/coreComponents/constitutive/solid/DamageSpectralUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DamageVolDev.cpp b/src/coreComponents/constitutive/solid/DamageVolDev.cpp index 5b739797f08..0bacfa2a8dd 100644 --- a/src/coreComponents/constitutive/solid/DamageVolDev.cpp +++ b/src/coreComponents/constitutive/solid/DamageVolDev.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DamageVolDev.hpp b/src/coreComponents/constitutive/solid/DamageVolDev.hpp index 5121efd3264..914a5d2cc4e 100644 --- a/src/coreComponents/constitutive/solid/DamageVolDev.hpp +++ b/src/coreComponents/constitutive/solid/DamageVolDev.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DelftEgg.cpp b/src/coreComponents/constitutive/solid/DelftEgg.cpp index c0067b98c74..cd45347cb72 100644 --- a/src/coreComponents/constitutive/solid/DelftEgg.cpp +++ b/src/coreComponents/constitutive/solid/DelftEgg.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DelftEgg.hpp b/src/coreComponents/constitutive/solid/DelftEgg.hpp index aa0d523b96e..5789b46178c 100644 --- a/src/coreComponents/constitutive/solid/DelftEgg.hpp +++ b/src/coreComponents/constitutive/solid/DelftEgg.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp index d5dd8ae8571..6952ec194cf 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp index 41fea87e3a0..fa60f97d4ab 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoreVolumeCompressibleSolid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp index 45e3b5d0163..688140ec100 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp index 730c7366741..9d3c1e9a359 100644 --- a/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp +++ b/src/coreComponents/constitutive/solid/Deprecated/PoroElastic.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DruckerPrager.cpp b/src/coreComponents/constitutive/solid/DruckerPrager.cpp index 31f5eadde37..cfdbfb05253 100644 --- a/src/coreComponents/constitutive/solid/DruckerPrager.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPrager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DruckerPrager.hpp b/src/coreComponents/constitutive/solid/DruckerPrager.hpp index 559b2574a6f..f741f60166d 100644 --- a/src/coreComponents/constitutive/solid/DruckerPrager.hpp +++ b/src/coreComponents/constitutive/solid/DruckerPrager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp index 589017c137b..2158e78f3a0 100644 --- a/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp +++ b/src/coreComponents/constitutive/solid/DruckerPragerExtended.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp b/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp index 3ee5589a467..20869d79e66 100644 --- a/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp +++ b/src/coreComponents/constitutive/solid/DruckerPragerExtended.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp b/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp index e6de4db060a..4e3e128adee 100644 --- a/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp +++ b/src/coreComponents/constitutive/solid/DuvautLionsSolid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp b/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp index aea9de6e248..8c3bd5d849c 100644 --- a/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp +++ b/src/coreComponents/constitutive/solid/DuvautLionsSolid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp b/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp index 0567a493b3f..773087398a4 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropic.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp b/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp index b6388f8e907..bed64cb6e6a 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropic.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp index fc6221a64fa..95172384a19 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp index 3718765d3b2..4181e8e2013 100644 --- a/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp +++ b/src/coreComponents/constitutive/solid/ElasticIsotropicPressureDependent.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp b/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp index 53ec491e631..7c707d690cc 100644 --- a/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticOrthotropic.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp b/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp index 8b2de4284a5..4445b88cc12 100644 --- a/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticOrthotropic.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp index 5e96b28a251..9cad0340f36 100644 --- a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp +++ b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp index 0e5f53fe2b3..f2c86d4439a 100644 --- a/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/ElasticTransverseIsotropic.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp b/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp index fed49ad74f7..588d3e69f33 100644 --- a/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp +++ b/src/coreComponents/constitutive/solid/InvariantDecompositions.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp index f5dfae8f624..6d0e8f401d6 100644 --- a/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp +++ b/src/coreComponents/constitutive/solid/ModifiedCamClay.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp b/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp index 8098ed1a851..4377571e603 100644 --- a/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp +++ b/src/coreComponents/constitutive/solid/ModifiedCamClay.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp b/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp index e7425e97c0c..a1d39db1f50 100644 --- a/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp +++ b/src/coreComponents/constitutive/solid/PerfectlyPlastic.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp b/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp index 58531b5fa8b..d1faf2ff686 100644 --- a/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp +++ b/src/coreComponents/constitutive/solid/PerfectlyPlastic.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/PorousSolid.cpp b/src/coreComponents/constitutive/solid/PorousSolid.cpp index b4641e0b863..9514e505fe2 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.cpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/PorousSolid.hpp b/src/coreComponents/constitutive/solid/PorousSolid.hpp index 92502fd947c..b4a9429eb43 100644 --- a/src/coreComponents/constitutive/solid/PorousSolid.hpp +++ b/src/coreComponents/constitutive/solid/PorousSolid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/PropertyConversions.hpp b/src/coreComponents/constitutive/solid/PropertyConversions.hpp index 232004c7388..169e70c9ed5 100644 --- a/src/coreComponents/constitutive/solid/PropertyConversions.hpp +++ b/src/coreComponents/constitutive/solid/PropertyConversions.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ProppantSolid.cpp b/src/coreComponents/constitutive/solid/ProppantSolid.cpp index 60fae0f7796..db1d67d2aac 100644 --- a/src/coreComponents/constitutive/solid/ProppantSolid.cpp +++ b/src/coreComponents/constitutive/solid/ProppantSolid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/ProppantSolid.hpp b/src/coreComponents/constitutive/solid/ProppantSolid.hpp index ef3f596fb39..084689a7c73 100644 --- a/src/coreComponents/constitutive/solid/ProppantSolid.hpp +++ b/src/coreComponents/constitutive/solid/ProppantSolid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/SolidBase.cpp b/src/coreComponents/constitutive/solid/SolidBase.cpp index 88985c4c710..f22cec62d93 100644 --- a/src/coreComponents/constitutive/solid/SolidBase.cpp +++ b/src/coreComponents/constitutive/solid/SolidBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/SolidBase.hpp b/src/coreComponents/constitutive/solid/SolidBase.hpp index cbcf7ffaca8..24b05eea71a 100644 --- a/src/coreComponents/constitutive/solid/SolidBase.hpp +++ b/src/coreComponents/constitutive/solid/SolidBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp b/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp index ccd670cd40c..6f78fd8c78b 100644 --- a/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp +++ b/src/coreComponents/constitutive/solid/SolidInternalEnergy.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp b/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp index 49dde48bb02..20dcdf52abb 100644 --- a/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp +++ b/src/coreComponents/constitutive/solid/SolidInternalEnergy.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp index 710449b0a19..2e196534bf6 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOps.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp index a3e3ccb715e..6eefc6d686f 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsFullyAnisotroipic.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp index 27cdf14073b..78172ee75f9 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsIsotropic.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp index 435802503b9..a16fdb8fb23 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsOrthotropic.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp index e4a6f6d75b9..9cf78b133de 100644 --- a/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp +++ b/src/coreComponents/constitutive/solid/SolidModelDiscretizationOpsTransverseIsotropic.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/SolidUtilities.hpp b/src/coreComponents/constitutive/solid/SolidUtilities.hpp index 59cd1c79a91..337b7f30509 100644 --- a/src/coreComponents/constitutive/solid/SolidUtilities.hpp +++ b/src/coreComponents/constitutive/solid/SolidUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp index ca0bcfc2a2e..37454064d27 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp index 1e7087744f7..8ea2df08b22 100644 --- a/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/BiotPorosity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp b/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp index 4665e9a78be..8b354eaebcc 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp index 2f5486e73a0..72cffcf623f 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp b/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp index 835a15ec859..60b90dcbff1 100644 --- a/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PorosityFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp index 37b79e20fdf..cf62672c08d 100644 --- a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp index 10b896a40ef..37228c53c65 100644 --- a/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/PressurePorosity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp index cf6f62a5059..fb27663d63d 100644 --- a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp +++ b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp index 49256bbfd80..45a23163aec 100644 --- a/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp +++ b/src/coreComponents/constitutive/solid/porosity/ProppantPorosity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp index b7a78462ce5..3ca4d0ba26a 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp index e819bd9a5dd..8d9edf7bd91 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseConstantThermalConductivity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp index 5754a2960ce..8e74a96e8ed 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp index 96c70739b2f..be06063814b 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp index 98107f4f134..335ba640bb1 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivityFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp index c1036ea94ce..fdb89e7ba00 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseThermalConductivitySelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp index f88f92a932c..f72e78bfdb3 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp index 5e0844f1178..ad1c4b37680 100644 --- a/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/MultiPhaseVolumeWeightedThermalConductivity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp index aad8dcb5187..51a8082165e 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.hpp index fa6d7623ef8..e19319c841b 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp index 2ee0fa4a908..c0a4b0a47ed 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp index c0037f04751..fd51086b7fa 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivityBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp index 689dc17d22b..445d6f58c13 100644 --- a/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/SinglePhaseThermalConductivitySelector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp b/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp index 52d85814310..64ff08e9a70 100644 --- a/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp +++ b/src/coreComponents/constitutive/thermalConductivity/ThermalConductivityFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/TestFluid.hpp b/src/coreComponents/constitutive/unitTests/TestFluid.hpp index 18f8393ec14..4728b19aaff 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluid.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluid.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp b/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp index d9824534902..c3d13fc6ed8 100644 --- a/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp +++ b/src/coreComponents/constitutive/unitTests/TestFluidUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp index 5c787084189..2a5c25759a9 100644 --- a/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp +++ b/src/coreComponents/constitutive/unitTests/testCompositionalDensity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp b/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp index b4f0ff4e4d4..910fd96059c 100644 --- a/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp +++ b/src/coreComponents/constitutive/unitTests/testCompositionalProperties.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp b/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp index 8a0c0de0d44..7ca010ba8e5 100644 --- a/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp +++ b/src/coreComponents/constitutive/unitTests/testCubicEOS.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp b/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp index ee8eee252b9..c6c676469be 100644 --- a/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp +++ b/src/coreComponents/constitutive/unitTests/testDamageUtilities.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp b/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp index 06d8292f9a7..69ced2da66c 100644 --- a/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp +++ b/src/coreComponents/constitutive/unitTests/testDruckerPrager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp b/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp index b514a16eca2..64ecf8d41f2 100644 --- a/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp +++ b/src/coreComponents/constitutive/unitTests/testElasticIsotropic.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp b/src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp index 36716b44831..9f0c5fefe50 100644 --- a/src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp +++ b/src/coreComponents/constitutive/unitTests/testImmiscibleWaterFlashModel.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testImmiscibleWaterProperties.cpp b/src/coreComponents/constitutive/unitTests/testImmiscibleWaterProperties.cpp index 6b31ceffc9e..d1a6e998b79 100644 --- a/src/coreComponents/constitutive/unitTests/testImmiscibleWaterProperties.cpp +++ b/src/coreComponents/constitutive/unitTests/testImmiscibleWaterProperties.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp index 7fde1b28d6d..ac0d01dcd35 100644 --- a/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp +++ b/src/coreComponents/constitutive/unitTests/testKValueInitialization.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp index f74d3c78a26..3adeab00ab1 100644 --- a/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutive/unitTests/testLohrenzBrayClarkViscosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp b/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp index 7507a986d2c..6cfbb6791d8 100644 --- a/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp +++ b/src/coreComponents/constitutive/unitTests/testModifiedCamClay.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testMultiFluidSelector.cpp b/src/coreComponents/constitutive/unitTests/testMultiFluidSelector.cpp index 12d05d769bd..55a045b5be9 100644 --- a/src/coreComponents/constitutive/unitTests/testMultiFluidSelector.cpp +++ b/src/coreComponents/constitutive/unitTests/testMultiFluidSelector.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp index 05db5efdac7..d27bc16d58c 100644 --- a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp index afb9644ba24..49c494e9dd3 100644 --- a/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testNegativeTwoPhaseFlash9Comp.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp b/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp index 48ea052e2cc..bd9dd97d83c 100644 --- a/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp +++ b/src/coreComponents/constitutive/unitTests/testParticleFluidEnums.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp b/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp index 86cb9470651..4c21a7759b4 100644 --- a/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp +++ b/src/coreComponents/constitutive/unitTests/testPropertyConversions.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp b/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp index 8b771529ac6..a8ce4fc2f1a 100644 --- a/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp +++ b/src/coreComponents/constitutive/unitTests/testRachfordRice.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp index a3f200202e8..b967f9ba83d 100644 --- a/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest2Comp.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp index 0a1289223ab..c3c8a479ae2 100644 --- a/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp +++ b/src/coreComponents/constitutive/unitTests/testStabilityTest9Comp.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutive/unitTests/testTriaxial.cpp b/src/coreComponents/constitutive/unitTests/testTriaxial.cpp index 009d7727d9a..b9de06affcd 100644 --- a/src/coreComponents/constitutive/unitTests/testTriaxial.cpp +++ b/src/coreComponents/constitutive/unitTests/testTriaxial.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/CMakeLists.txt b/src/coreComponents/constitutiveDrivers/CMakeLists.txt index 4cc69dd4935..36dad24e0d4 100644 --- a/src/coreComponents/constitutiveDrivers/CMakeLists.txt +++ b/src/coreComponents/constitutiveDrivers/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp index fb0ab379189..3d5d5d46ea4 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp index a27cfb29699..e5d457ca9f7 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrineEzrokhiThermalFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp index 145b2faae17..8815bc53000 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp index d6f41b1bf52..0839e37d65b 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/CO2Brine/PVTDriverRunTestCO2BrinePhillipsThermalFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp index 47150da347f..56cece6e149 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.hpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.hpp index dda67dac39c..bae4e9827c9 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.hpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp index 0a0254b196f..6b763d25134 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/PVTDriverRunTest.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp index 829f310e773..1b5bbf0e469 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/blackOil/PVTDriverRunTestDeadOilFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp index dbf4cf32eef..6506255acce 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalMultiphaseFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalThreePhaseLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalThreePhaseLohrenzBrayClarkViscosity.cpp index c7ae9568177..38299b6c451 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalThreePhaseLohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalThreePhaseLohrenzBrayClarkViscosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 TotalEnergies * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University * Copyright (c) 2018-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp index 821b98d216e..7404cb9d035 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseConstantViscosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp index ba69e1f711d..f97b8526705 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/compositional/PVTDriverRunTestCompositionalTwoPhaseLohrenzBrayClarkViscosity.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp index 8c2cc1f083f..1d0259bcd5c 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.hpp b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.hpp index 57f273e3b1e..170f761c704 100644 --- a/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.hpp +++ b/src/coreComponents/constitutiveDrivers/fluid/multiFluid/reactive/ReactiveFluidDriver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp index 75c701977d9..06085a50861 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.hpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.hpp index b2516879f99..426c66bf130 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.hpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp index 578a3d59522..4fc2d6a03d5 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyBakerRunTest.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp index 7e492550302..a2b0db0fb93 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyRunTest.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp index c1ca451cdc2..12c68c39cf2 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverBrooksCoreyStone2RunTest.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverRunTest.hpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverRunTest.hpp index 7187ae8feb9..4ae09f0c00c 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverRunTest.hpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverRunTest.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp index cad00bfc8a1..4ed6420b673 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeHysteresisRunTest.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeRunTest.cpp index 22b21ea79d8..e5c8a240853 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverTableRelativeRunTest.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp index 45b9400a33e..7f441eb5130 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenBakerRunTest.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp index caac2444ec7..53b39539a5d 100644 --- a/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp +++ b/src/coreComponents/constitutiveDrivers/relativePermeability/RelpermDriverVanGenuchtenStone2RunTest.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp index 49158cbc925..6dbd8bb13c3 100644 --- a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp +++ b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.hpp b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.hpp index 1072d924818..1147e52b0b7 100644 --- a/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.hpp +++ b/src/coreComponents/constitutiveDrivers/solid/TriaxialDriver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/BufferOps.hpp b/src/coreComponents/dataRepository/BufferOps.hpp index c76bcee136e..1601dae424c 100644 --- a/src/coreComponents/dataRepository/BufferOps.hpp +++ b/src/coreComponents/dataRepository/BufferOps.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/BufferOpsDevice.cpp b/src/coreComponents/dataRepository/BufferOpsDevice.cpp index cf9c562a634..ada2da9b8a9 100644 --- a/src/coreComponents/dataRepository/BufferOpsDevice.cpp +++ b/src/coreComponents/dataRepository/BufferOpsDevice.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/BufferOpsDevice.hpp b/src/coreComponents/dataRepository/BufferOpsDevice.hpp index 0fec5bbf5a7..5bef77f360b 100644 --- a/src/coreComponents/dataRepository/BufferOpsDevice.hpp +++ b/src/coreComponents/dataRepository/BufferOpsDevice.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/BufferOps_inline.hpp b/src/coreComponents/dataRepository/BufferOps_inline.hpp index 14b16a04402..8792e9a153e 100644 --- a/src/coreComponents/dataRepository/BufferOps_inline.hpp +++ b/src/coreComponents/dataRepository/BufferOps_inline.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/CMakeLists.txt b/src/coreComponents/dataRepository/CMakeLists.txt index 49f4404cbd6..8d0fc0e09ce 100644 --- a/src/coreComponents/dataRepository/CMakeLists.txt +++ b/src/coreComponents/dataRepository/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/dataRepository/ConduitRestart.cpp b/src/coreComponents/dataRepository/ConduitRestart.cpp index e0c18bc1b24..10e3c4e58f2 100644 --- a/src/coreComponents/dataRepository/ConduitRestart.cpp +++ b/src/coreComponents/dataRepository/ConduitRestart.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/ConduitRestart.hpp b/src/coreComponents/dataRepository/ConduitRestart.hpp index 2fe3c07c98e..68cf0766e0a 100644 --- a/src/coreComponents/dataRepository/ConduitRestart.hpp +++ b/src/coreComponents/dataRepository/ConduitRestart.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/DataContext.cpp b/src/coreComponents/dataRepository/DataContext.cpp index e20eab50e60..87e9f791750 100644 --- a/src/coreComponents/dataRepository/DataContext.cpp +++ b/src/coreComponents/dataRepository/DataContext.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/DataContext.hpp b/src/coreComponents/dataRepository/DataContext.hpp index 16600e02f1b..46daeb38506 100644 --- a/src/coreComponents/dataRepository/DataContext.hpp +++ b/src/coreComponents/dataRepository/DataContext.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/DefaultValue.hpp b/src/coreComponents/dataRepository/DefaultValue.hpp index dd2fed96a7d..4212244aa72 100644 --- a/src/coreComponents/dataRepository/DefaultValue.hpp +++ b/src/coreComponents/dataRepository/DefaultValue.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/ExecutableGroup.cpp b/src/coreComponents/dataRepository/ExecutableGroup.cpp index 4552db2d3d4..b268730af7e 100644 --- a/src/coreComponents/dataRepository/ExecutableGroup.cpp +++ b/src/coreComponents/dataRepository/ExecutableGroup.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/ExecutableGroup.hpp b/src/coreComponents/dataRepository/ExecutableGroup.hpp index 201b6642227..b1751f3e1f0 100644 --- a/src/coreComponents/dataRepository/ExecutableGroup.hpp +++ b/src/coreComponents/dataRepository/ExecutableGroup.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/Group.cpp b/src/coreComponents/dataRepository/Group.cpp index abbf6379fa9..440178c2a7d 100644 --- a/src/coreComponents/dataRepository/Group.cpp +++ b/src/coreComponents/dataRepository/Group.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/Group.hpp b/src/coreComponents/dataRepository/Group.hpp index 1cbc00c739a..a9925c49c77 100644 --- a/src/coreComponents/dataRepository/Group.hpp +++ b/src/coreComponents/dataRepository/Group.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/GroupContext.cpp b/src/coreComponents/dataRepository/GroupContext.cpp index e19a7358fa1..d21771cfbdb 100644 --- a/src/coreComponents/dataRepository/GroupContext.cpp +++ b/src/coreComponents/dataRepository/GroupContext.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/GroupContext.hpp b/src/coreComponents/dataRepository/GroupContext.hpp index d361bd26e58..476540f98eb 100644 --- a/src/coreComponents/dataRepository/GroupContext.hpp +++ b/src/coreComponents/dataRepository/GroupContext.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/HistoryDataSpec.hpp b/src/coreComponents/dataRepository/HistoryDataSpec.hpp index 5ffbc3eb343..f1d083f1d2a 100644 --- a/src/coreComponents/dataRepository/HistoryDataSpec.hpp +++ b/src/coreComponents/dataRepository/HistoryDataSpec.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/InputFlags.hpp b/src/coreComponents/dataRepository/InputFlags.hpp index d761ad85f28..4390eec54b0 100644 --- a/src/coreComponents/dataRepository/InputFlags.hpp +++ b/src/coreComponents/dataRepository/InputFlags.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/KeyIndexT.hpp b/src/coreComponents/dataRepository/KeyIndexT.hpp index 6a6b2ff32a3..2812bc1ca8f 100644 --- a/src/coreComponents/dataRepository/KeyIndexT.hpp +++ b/src/coreComponents/dataRepository/KeyIndexT.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/KeyNames.hpp b/src/coreComponents/dataRepository/KeyNames.hpp index 30842d4c719..4c46b69a266 100644 --- a/src/coreComponents/dataRepository/KeyNames.hpp +++ b/src/coreComponents/dataRepository/KeyNames.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/LogLevelsInfo.hpp b/src/coreComponents/dataRepository/LogLevelsInfo.hpp index d0b0ee1817d..7e50ece2eb4 100644 --- a/src/coreComponents/dataRepository/LogLevelsInfo.hpp +++ b/src/coreComponents/dataRepository/LogLevelsInfo.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/dataRepository/LogLevelsRegistry.cpp b/src/coreComponents/dataRepository/LogLevelsRegistry.cpp index ae3e48ccd72..3f81ef9e285 100644 --- a/src/coreComponents/dataRepository/LogLevelsRegistry.cpp +++ b/src/coreComponents/dataRepository/LogLevelsRegistry.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/dataRepository/LogLevelsRegistry.hpp b/src/coreComponents/dataRepository/LogLevelsRegistry.hpp index 88b38224cdc..d96f9a79d4e 100644 --- a/src/coreComponents/dataRepository/LogLevelsRegistry.hpp +++ b/src/coreComponents/dataRepository/LogLevelsRegistry.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/dataRepository/MappedVector.hpp b/src/coreComponents/dataRepository/MappedVector.hpp index 4fe016be1c1..59f7967d991 100644 --- a/src/coreComponents/dataRepository/MappedVector.hpp +++ b/src/coreComponents/dataRepository/MappedVector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/ObjectCatalog.hpp b/src/coreComponents/dataRepository/ObjectCatalog.hpp index c03715e09df..dbf089033a6 100644 --- a/src/coreComponents/dataRepository/ObjectCatalog.hpp +++ b/src/coreComponents/dataRepository/ObjectCatalog.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/ReferenceWrapper.hpp b/src/coreComponents/dataRepository/ReferenceWrapper.hpp index 0bd8b374b5e..6fb666b3e9f 100644 --- a/src/coreComponents/dataRepository/ReferenceWrapper.hpp +++ b/src/coreComponents/dataRepository/ReferenceWrapper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/RestartFlags.hpp b/src/coreComponents/dataRepository/RestartFlags.hpp index 3188c7ad601..f6fc765d94a 100644 --- a/src/coreComponents/dataRepository/RestartFlags.hpp +++ b/src/coreComponents/dataRepository/RestartFlags.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/Utilities.cpp b/src/coreComponents/dataRepository/Utilities.cpp index 37180553677..03be7e7f721 100644 --- a/src/coreComponents/dataRepository/Utilities.cpp +++ b/src/coreComponents/dataRepository/Utilities.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/Utilities.hpp b/src/coreComponents/dataRepository/Utilities.hpp index c88cc3290e7..93a2084d15e 100644 --- a/src/coreComponents/dataRepository/Utilities.hpp +++ b/src/coreComponents/dataRepository/Utilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/Wrapper.hpp b/src/coreComponents/dataRepository/Wrapper.hpp index a75bf3cb9c5..344806e5362 100644 --- a/src/coreComponents/dataRepository/Wrapper.hpp +++ b/src/coreComponents/dataRepository/Wrapper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/WrapperBase.cpp b/src/coreComponents/dataRepository/WrapperBase.cpp index 518bf4dfed2..306878ab9e6 100644 --- a/src/coreComponents/dataRepository/WrapperBase.cpp +++ b/src/coreComponents/dataRepository/WrapperBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/WrapperBase.hpp b/src/coreComponents/dataRepository/WrapperBase.hpp index 8737beb8473..36b74c84971 100644 --- a/src/coreComponents/dataRepository/WrapperBase.hpp +++ b/src/coreComponents/dataRepository/WrapperBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/WrapperContext.cpp b/src/coreComponents/dataRepository/WrapperContext.cpp index 253a2d9c053..92f52ba8708 100644 --- a/src/coreComponents/dataRepository/WrapperContext.cpp +++ b/src/coreComponents/dataRepository/WrapperContext.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/WrapperContext.hpp b/src/coreComponents/dataRepository/WrapperContext.hpp index 7c1b059919d..78fd48fb6f1 100644 --- a/src/coreComponents/dataRepository/WrapperContext.hpp +++ b/src/coreComponents/dataRepository/WrapperContext.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/python/PyGroup.cpp b/src/coreComponents/dataRepository/python/PyGroup.cpp index a9dbe024844..9fa25b2db3c 100644 --- a/src/coreComponents/dataRepository/python/PyGroup.cpp +++ b/src/coreComponents/dataRepository/python/PyGroup.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/python/PyGroup.hpp b/src/coreComponents/dataRepository/python/PyGroup.hpp index fc5d70ea934..80af2282c50 100644 --- a/src/coreComponents/dataRepository/python/PyGroup.hpp +++ b/src/coreComponents/dataRepository/python/PyGroup.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/python/PyGroupType.hpp b/src/coreComponents/dataRepository/python/PyGroupType.hpp index 042442a9f36..df0879ae86e 100644 --- a/src/coreComponents/dataRepository/python/PyGroupType.hpp +++ b/src/coreComponents/dataRepository/python/PyGroupType.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/python/PyWrapper.cpp b/src/coreComponents/dataRepository/python/PyWrapper.cpp index cff2b890e95..68b620986c7 100644 --- a/src/coreComponents/dataRepository/python/PyWrapper.cpp +++ b/src/coreComponents/dataRepository/python/PyWrapper.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/python/PyWrapper.hpp b/src/coreComponents/dataRepository/python/PyWrapper.hpp index b6bb4400a07..c059459e397 100644 --- a/src/coreComponents/dataRepository/python/PyWrapper.hpp +++ b/src/coreComponents/dataRepository/python/PyWrapper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp index 0f3c469f345..bc7fb8357b1 100644 --- a/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp +++ b/src/coreComponents/dataRepository/unitTests/testBufferOps.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp b/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp index 92f5861fa7d..eef51a81bf8 100644 --- a/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp +++ b/src/coreComponents/dataRepository/unitTests/testDefaultValue.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/unitTests/testPacking.cpp b/src/coreComponents/dataRepository/unitTests/testPacking.cpp index 4befe364d83..32b31f7c1b6 100644 --- a/src/coreComponents/dataRepository/unitTests/testPacking.cpp +++ b/src/coreComponents/dataRepository/unitTests/testPacking.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp b/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp index 15db54edc25..1a7979cf541 100644 --- a/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp +++ b/src/coreComponents/dataRepository/unitTests/testReferenceWrapper.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/unitTests/testWrapper.cpp b/src/coreComponents/dataRepository/unitTests/testWrapper.cpp index 6982cec6560..d04fd2b5440 100644 --- a/src/coreComponents/dataRepository/unitTests/testWrapper.cpp +++ b/src/coreComponents/dataRepository/unitTests/testWrapper.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp b/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp index ce1dbaf3e7e..fba0eec3ab4 100644 --- a/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp +++ b/src/coreComponents/dataRepository/unitTests/testXmlWrapper.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/wrapperHelpers.hpp b/src/coreComponents/dataRepository/wrapperHelpers.hpp index c77b178d5f2..7b66b1b2178 100644 --- a/src/coreComponents/dataRepository/wrapperHelpers.hpp +++ b/src/coreComponents/dataRepository/wrapperHelpers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/xmlWrapper.cpp b/src/coreComponents/dataRepository/xmlWrapper.cpp index e2e7d85332c..19f0f223e10 100644 --- a/src/coreComponents/dataRepository/xmlWrapper.cpp +++ b/src/coreComponents/dataRepository/xmlWrapper.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dataRepository/xmlWrapper.hpp b/src/coreComponents/dataRepository/xmlWrapper.hpp index 3909184a5be..71890a2a21f 100644 --- a/src/coreComponents/dataRepository/xmlWrapper.hpp +++ b/src/coreComponents/dataRepository/xmlWrapper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt index 259a0ab9ff1..c91c99e352f 100644 --- a/src/coreComponents/denseLinearAlgebra/CMakeLists.txt +++ b/src/coreComponents/denseLinearAlgebra/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/denseLinearAlgebra/common/layouts.hpp b/src/coreComponents/denseLinearAlgebra/common/layouts.hpp index 9e9415afa2b..77bf184d868 100644 --- a/src/coreComponents/denseLinearAlgebra/common/layouts.hpp +++ b/src/coreComponents/denseLinearAlgebra/common/layouts.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp b/src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp index bdc2b22614f..976b6df848d 100644 --- a/src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp +++ b/src/coreComponents/denseLinearAlgebra/denseLASolvers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h index c3716c8a870..47600b5b100 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackFunctions.h @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp index d9f1405cec4..2642d481a4d 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp index 370c4c4ee5d..ffacecc65de 100644 --- a/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp +++ b/src/coreComponents/denseLinearAlgebra/interfaces/blaslapack/BlasLapackLA.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp index 51abc10565e..b3b8046b0f9 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testBlasLapack.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp index 5ec47ac1982..cbeda07ea64 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testDenseLASolvers.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp b/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp index 678332963a0..605a3e16ea6 100644 --- a/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp +++ b/src/coreComponents/denseLinearAlgebra/unitTests/testSolveLinearSystem.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/discretizationMethods/CMakeLists.txt b/src/coreComponents/discretizationMethods/CMakeLists.txt index ae7cff10390..176924f5c41 100644 --- a/src/coreComponents/discretizationMethods/CMakeLists.txt +++ b/src/coreComponents/discretizationMethods/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp b/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp index b57a2fe5192..6e4fb3c5cf5 100644 --- a/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp +++ b/src/coreComponents/discretizationMethods/NumericalMethodsManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp b/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp index 3db8a3e6a7b..503647f206a 100644 --- a/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp +++ b/src/coreComponents/discretizationMethods/NumericalMethodsManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/dummy.cpp b/src/coreComponents/dummy.cpp index e64d16594db..44722daa7d7 100644 --- a/src/coreComponents/dummy.cpp +++ b/src/coreComponents/dummy.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/CMakeLists.txt b/src/coreComponents/events/CMakeLists.txt index 4f80fe771ab..a8e2e2ba714 100644 --- a/src/coreComponents/events/CMakeLists.txt +++ b/src/coreComponents/events/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/events/EventBase.cpp b/src/coreComponents/events/EventBase.cpp index 5a185d1c719..6b9a2f2c0c4 100644 --- a/src/coreComponents/events/EventBase.cpp +++ b/src/coreComponents/events/EventBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/EventBase.hpp b/src/coreComponents/events/EventBase.hpp index 6e9651c5e4e..c3e4920b188 100644 --- a/src/coreComponents/events/EventBase.hpp +++ b/src/coreComponents/events/EventBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/EventManager.cpp b/src/coreComponents/events/EventManager.cpp index 8e176f41d4a..a30706b8aa5 100644 --- a/src/coreComponents/events/EventManager.cpp +++ b/src/coreComponents/events/EventManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/EventManager.hpp b/src/coreComponents/events/EventManager.hpp index f60c004fbf2..b86f48b8518 100644 --- a/src/coreComponents/events/EventManager.hpp +++ b/src/coreComponents/events/EventManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/HaltEvent.cpp b/src/coreComponents/events/HaltEvent.cpp index f4381f0b0fb..93cc9d2d581 100644 --- a/src/coreComponents/events/HaltEvent.cpp +++ b/src/coreComponents/events/HaltEvent.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/HaltEvent.hpp b/src/coreComponents/events/HaltEvent.hpp index 5614484e54a..68501ea47b2 100644 --- a/src/coreComponents/events/HaltEvent.hpp +++ b/src/coreComponents/events/HaltEvent.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/PeriodicEvent.cpp b/src/coreComponents/events/PeriodicEvent.cpp index bb55daa3b19..e26ea889137 100644 --- a/src/coreComponents/events/PeriodicEvent.cpp +++ b/src/coreComponents/events/PeriodicEvent.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/PeriodicEvent.hpp b/src/coreComponents/events/PeriodicEvent.hpp index a737400358a..9c2cf943c87 100644 --- a/src/coreComponents/events/PeriodicEvent.hpp +++ b/src/coreComponents/events/PeriodicEvent.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/SoloEvent.cpp b/src/coreComponents/events/SoloEvent.cpp index 5f3b1e87738..89d8b2edd23 100644 --- a/src/coreComponents/events/SoloEvent.cpp +++ b/src/coreComponents/events/SoloEvent.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/SoloEvent.hpp b/src/coreComponents/events/SoloEvent.hpp index ce53eba8f5f..d905e07e479 100644 --- a/src/coreComponents/events/SoloEvent.hpp +++ b/src/coreComponents/events/SoloEvent.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/tasks/TaskBase.cpp b/src/coreComponents/events/tasks/TaskBase.cpp index 1a885b95ec2..6020534f189 100644 --- a/src/coreComponents/events/tasks/TaskBase.cpp +++ b/src/coreComponents/events/tasks/TaskBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/tasks/TaskBase.hpp b/src/coreComponents/events/tasks/TaskBase.hpp index c8744e18e15..dfe0393fe86 100644 --- a/src/coreComponents/events/tasks/TaskBase.hpp +++ b/src/coreComponents/events/tasks/TaskBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/tasks/TasksManager.cpp b/src/coreComponents/events/tasks/TasksManager.cpp index ad23ae788b1..ea0eea28a4d 100644 --- a/src/coreComponents/events/tasks/TasksManager.cpp +++ b/src/coreComponents/events/tasks/TasksManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/events/tasks/TasksManager.hpp b/src/coreComponents/events/tasks/TasksManager.hpp index 79117b59437..852e0fd8cf4 100644 --- a/src/coreComponents/events/tasks/TasksManager.hpp +++ b/src/coreComponents/events/tasks/TasksManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp index afaa450a27e..061cfc344b9 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp index 00333656f74..4b27724fefe 100644 --- a/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/AquiferBoundaryCondition.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/CMakeLists.txt b/src/coreComponents/fieldSpecification/CMakeLists.txt index d93d54fe702..0b6ff6691e6 100644 --- a/src/coreComponents/fieldSpecification/CMakeLists.txt +++ b/src/coreComponents/fieldSpecification/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp index 69229b5814f..19a62d921dd 100644 --- a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp index 589171fcd4e..553ac23e7dc 100644 --- a/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/DirichletBoundaryCondition.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp index 14a4f0cf60d..c355f36d927 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp index 9cff7dd6a93..fe29ce2fc40 100644 --- a/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp +++ b/src/coreComponents/fieldSpecification/EquilibriumInitialCondition.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp index 45e58177dd4..693ecc2f4aa 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp index 8306eafca0b..cdce71bc664 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp index 6edc963b457..307437e748c 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp b/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp index 91672902314..be7f8ffec7b 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp index 42a360dff3a..c2d7317cec0 100644 --- a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp +++ b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp index ce7a6151b2b..802e2be9cc7 100644 --- a/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp +++ b/src/coreComponents/fieldSpecification/PerfectlyMatchedLayer.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp index c3d68b14bf7..df2c01431cd 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp index e04aa99b9d0..2ee5e258bef 100644 --- a/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/SourceFluxBoundaryCondition.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp index 9feb2731c58..4d924a8a41a 100644 --- a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp +++ b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp index a64404f40de..03c67657393 100644 --- a/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp +++ b/src/coreComponents/fieldSpecification/TractionBoundaryCondition.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/CMakeLists.txt b/src/coreComponents/fileIO/CMakeLists.txt index 95ffd8fcb63..a53eda4945c 100644 --- a/src/coreComponents/fileIO/CMakeLists.txt +++ b/src/coreComponents/fileIO/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp b/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp index cad26fcbb54..55bf84e79ba 100644 --- a/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/BlueprintOutput.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp b/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp index fd963698c3c..7ba575f967d 100644 --- a/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/BlueprintOutput.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/ChomboIO.cpp b/src/coreComponents/fileIO/Outputs/ChomboIO.cpp index 26f73a9eb43..ea2a16da38e 100644 --- a/src/coreComponents/fileIO/Outputs/ChomboIO.cpp +++ b/src/coreComponents/fileIO/Outputs/ChomboIO.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/ChomboIO.hpp b/src/coreComponents/fileIO/Outputs/ChomboIO.hpp index c9e60cf2f79..ea6defc059a 100644 --- a/src/coreComponents/fileIO/Outputs/ChomboIO.hpp +++ b/src/coreComponents/fileIO/Outputs/ChomboIO.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.cpp b/src/coreComponents/fileIO/Outputs/OutputBase.cpp index 54dcab668e6..64b93e51635 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/OutputBase.hpp b/src/coreComponents/fileIO/Outputs/OutputBase.hpp index ae957e22213..01dad62582f 100644 --- a/src/coreComponents/fileIO/Outputs/OutputBase.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/OutputManager.cpp b/src/coreComponents/fileIO/Outputs/OutputManager.cpp index 19034f1326b..157328fa248 100644 --- a/src/coreComponents/fileIO/Outputs/OutputManager.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/OutputManager.hpp b/src/coreComponents/fileIO/Outputs/OutputManager.hpp index 399b5fd21b0..38a68c06568 100644 --- a/src/coreComponents/fileIO/Outputs/OutputManager.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp b/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp index dceca432602..a3731f88c78 100644 --- a/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputUtilities.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp b/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp index 1aa69d07527..1cfd7f0deba 100644 --- a/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp +++ b/src/coreComponents/fileIO/Outputs/OutputUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/PythonOutput.cpp b/src/coreComponents/fileIO/Outputs/PythonOutput.cpp index 5891fe55e26..3ef3adf4d46 100644 --- a/src/coreComponents/fileIO/Outputs/PythonOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/PythonOutput.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/PythonOutput.hpp b/src/coreComponents/fileIO/Outputs/PythonOutput.hpp index a73b6781654..eabcea33fbe 100644 --- a/src/coreComponents/fileIO/Outputs/PythonOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/PythonOutput.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/RestartOutput.cpp b/src/coreComponents/fileIO/Outputs/RestartOutput.cpp index 6eb07281cf6..b8f8e5b9f0c 100644 --- a/src/coreComponents/fileIO/Outputs/RestartOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/RestartOutput.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/RestartOutput.hpp b/src/coreComponents/fileIO/Outputs/RestartOutput.hpp index 11c8715ed76..09e336a50fe 100644 --- a/src/coreComponents/fileIO/Outputs/RestartOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/RestartOutput.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp index ba03ceead5f..6d372b59e04 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/SiloOutput.hpp b/src/coreComponents/fileIO/Outputs/SiloOutput.hpp index 6b0a371974f..0780ef7bb22 100644 --- a/src/coreComponents/fileIO/Outputs/SiloOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/SiloOutput.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp index 7e1299aac57..7f03e7cc2fd 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp index e2846f7c312..59f129ea8df 100644 --- a/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/TimeHistoryOutput.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp index b6f4348899e..01168c319fe 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.cpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp index bf36e900eaf..d4112de73b3 100644 --- a/src/coreComponents/fileIO/Outputs/VTKOutput.hpp +++ b/src/coreComponents/fileIO/Outputs/VTKOutput.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp b/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp index 34761acb4a1..75ebd8f7015 100644 --- a/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp +++ b/src/coreComponents/fileIO/coupling/ChomboCoupler.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp b/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp index 357ca59f8da..a2d839576da 100644 --- a/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp +++ b/src/coreComponents/fileIO/coupling/ChomboCoupler.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/python/PyHistoryCollection.cpp b/src/coreComponents/fileIO/python/PyHistoryCollection.cpp index 6c844ad87dd..5f65e62966a 100644 --- a/src/coreComponents/fileIO/python/PyHistoryCollection.cpp +++ b/src/coreComponents/fileIO/python/PyHistoryCollection.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp b/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp index 6d8f4c5abe7..5e7af98e496 100644 --- a/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp +++ b/src/coreComponents/fileIO/python/PyHistoryCollectionType.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/python/PyHistoryOutput.cpp b/src/coreComponents/fileIO/python/PyHistoryOutput.cpp index 689aaf7517a..5da919b192a 100644 --- a/src/coreComponents/fileIO/python/PyHistoryOutput.cpp +++ b/src/coreComponents/fileIO/python/PyHistoryOutput.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp b/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp index 9b1ba1fd947..ac8f382d4dc 100644 --- a/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp +++ b/src/coreComponents/fileIO/python/PyHistoryOutputType.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/python/PyVTKOutput.cpp b/src/coreComponents/fileIO/python/PyVTKOutput.cpp index cfdc269be0d..496fe116348 100644 --- a/src/coreComponents/fileIO/python/PyVTKOutput.cpp +++ b/src/coreComponents/fileIO/python/PyVTKOutput.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/python/PyVTKOutputType.hpp b/src/coreComponents/fileIO/python/PyVTKOutputType.hpp index 10ea1e1bcfb..4c58691e990 100644 --- a/src/coreComponents/fileIO/python/PyVTKOutputType.hpp +++ b/src/coreComponents/fileIO/python/PyVTKOutputType.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/silo/SiloFile.cpp b/src/coreComponents/fileIO/silo/SiloFile.cpp index 861839fe578..7c5b6b1fa17 100644 --- a/src/coreComponents/fileIO/silo/SiloFile.cpp +++ b/src/coreComponents/fileIO/silo/SiloFile.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/silo/SiloFile.hpp b/src/coreComponents/fileIO/silo/SiloFile.hpp index 5f7e0dd9460..e05904b6acd 100644 --- a/src/coreComponents/fileIO/silo/SiloFile.hpp +++ b/src/coreComponents/fileIO/silo/SiloFile.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp b/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp index 3207f296ae5..a54b81790b9 100644 --- a/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp +++ b/src/coreComponents/fileIO/timeHistory/BufferedHistoryIO.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/timeHistory/HDFFile.cpp b/src/coreComponents/fileIO/timeHistory/HDFFile.cpp index 1ed8e6be170..b88767d6ecc 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFFile.cpp +++ b/src/coreComponents/fileIO/timeHistory/HDFFile.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/timeHistory/HDFFile.hpp b/src/coreComponents/fileIO/timeHistory/HDFFile.hpp index 7e428c4ce7d..f2ab6358099 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFFile.hpp +++ b/src/coreComponents/fileIO/timeHistory/HDFFile.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp index 813ea0ad335..24ae0ddddf6 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp +++ b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp index 043d0658300..8de982b5d2b 100644 --- a/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp +++ b/src/coreComponents/fileIO/timeHistory/HDFHistoryIO.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp b/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp index 2965e631b14..de2a68f3ac7 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollection.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp index b08471a6940..3fc95d6c825 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp index cc367e8fa5f..ef30cf21b55 100644 --- a/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp +++ b/src/coreComponents/fileIO/timeHistory/HistoryCollectionBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp index ee2822d3f66..746d26ce24b 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.cpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/timeHistory/PackCollection.hpp b/src/coreComponents/fileIO/timeHistory/PackCollection.hpp index a39b2d2fac9..468bc5ecb62 100644 --- a/src/coreComponents/fileIO/timeHistory/PackCollection.hpp +++ b/src/coreComponents/fileIO/timeHistory/PackCollection.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp b/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp index 1efb816a350..f928e64097c 100644 --- a/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPVDWriter.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp b/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp index e0a43121be8..756a6fa03df 100644 --- a/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp +++ b/src/coreComponents/fileIO/vtk/VTKPVDWriter.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp index bafc1bf89da..fbd36b2b166 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp index 20bbc54923a..c44ca64347d 100644 --- a/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp +++ b/src/coreComponents/fileIO/vtk/VTKPolyDataWriterInterface.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp b/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp index 8e9b86eff92..2f4bfe41c1b 100644 --- a/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp +++ b/src/coreComponents/fileIO/vtk/VTKVTMWriter.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp b/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp index 23199ab7b9c..45a8d52dea7 100644 --- a/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp +++ b/src/coreComponents/fileIO/vtk/VTKVTMWriter.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/BilinearFormUtilities.hpp b/src/coreComponents/finiteElement/BilinearFormUtilities.hpp index 28128c26be4..a268c2db764 100644 --- a/src/coreComponents/finiteElement/BilinearFormUtilities.hpp +++ b/src/coreComponents/finiteElement/BilinearFormUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/CMakeLists.txt b/src/coreComponents/finiteElement/CMakeLists.txt index 5d7c38fa465..1fd77c86b1a 100644 --- a/src/coreComponents/finiteElement/CMakeLists.txt +++ b/src/coreComponents/finiteElement/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp index 87611b8ce0c..31f6c6504e7 100644 --- a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp +++ b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h index 5e31aea441c..ea634ecf95e 100644 --- a/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h +++ b/src/coreComponents/finiteElement/ElementLibrary_depricated/SpecializedFormulations/UniformStrainHexahedron.h @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp index 92e13064399..85f18da5efe 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretization.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp b/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp index 55f3e7f7447..0ee428550a9 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretization.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp index fe7a1d668c8..2e7c8e3ccc3 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp index 0f4b49edf4c..e82a8b99244 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/FiniteElementDispatch.hpp b/src/coreComponents/finiteElement/FiniteElementDispatch.hpp index 7190acbfd47..5db1789d6e8 100644 --- a/src/coreComponents/finiteElement/FiniteElementDispatch.hpp +++ b/src/coreComponents/finiteElement/FiniteElementDispatch.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/Kinematics.h b/src/coreComponents/finiteElement/Kinematics.h index c4350cb9cd3..9cc8bed31cd 100644 --- a/src/coreComponents/finiteElement/Kinematics.h +++ b/src/coreComponents/finiteElement/Kinematics.h @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/LinearFormUtilities.hpp b/src/coreComponents/finiteElement/LinearFormUtilities.hpp index 90153e86578..678725c1ad6 100644 --- a/src/coreComponents/finiteElement/LinearFormUtilities.hpp +++ b/src/coreComponents/finiteElement/LinearFormUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/PDEUtilities.hpp b/src/coreComponents/finiteElement/PDEUtilities.hpp index e060d4d339d..a7f958ae17f 100644 --- a/src/coreComponents/finiteElement/PDEUtilities.hpp +++ b/src/coreComponents/finiteElement/PDEUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp index b796efa611b..3486004d766 100644 --- a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp index 976858220d0..932603a3b9c 100644 --- a/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/ConformingVirtualElementOrder1_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp b/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp index 4ea49bb651f..10f246bd49a 100644 --- a/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/FiniteElementBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp index 58a685beda8..0b164a174c2 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Hexahedron_Lagrange1_GaussLegendre2.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp index da69a72a195..3f89788e48b 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Pyramid_Lagrange1_Gauss5.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp index 71a72025977..6aa3001b291 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_QuadrilateralFace_Lagrange1_GaussLegendre2.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp index 8ab7b85b244..0750d7a196b 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Tetrahedron_Lagrange1_Gauss1.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp index 47ed48f9b3d..9d87f889397 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_TriangleFace_Lagrange1_Gauss1.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp b/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp index f74a2979296..3afcee034fc 100644 --- a/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/H1_Wedge_Lagrange1_Gauss6.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp index 2ea2d584a79..b3ef7f24b1d 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis1.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp index 24e04d4f774..3b577ef2283 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis2.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp index b3022db5c37..104367a2ead 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis3GL.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp index 2562fdb1693..ff7efc7ffaa 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis4GL.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp index fa3fd99be08..e8fadab6f5b 100644 --- a/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/LagrangeBasis5GL.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp b/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp index 2290c28456a..25a3f6c7783 100644 --- a/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp +++ b/src/coreComponents/finiteElement/elementFormulations/Qk_Hexahedron_Lagrange_GaussLobatto.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp index 05aff84961b..8e86d076e68 100644 --- a/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/ImplicitKernelBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp index 2d7799380ca..5315b8451ae 100644 --- a/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/InterfaceKernelBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp index eaa4f66a1c4..d759430485b 100644 --- a/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/KernelBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp b/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp index cf16647a23b..cc1abe0e1f5 100644 --- a/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp +++ b/src/coreComponents/finiteElement/kernelInterface/SparsityKernelBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp b/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp index 463c1a10ea4..b6e3c1f4610 100644 --- a/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp +++ b/src/coreComponents/finiteElement/unitTests/testFiniteElementBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp b/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp index c996e7d2d53..d59d26bc794 100644 --- a/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp +++ b/src/coreComponents/finiteElement/unitTests/testFiniteElementHelpers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp index fcee7b20126..f84126503f2 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Hexahedron_Lagrange1_GaussLegendre2.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp index dd0312ffb6d..2b0226a1521 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Pyramid_Lagrange1_Gauss5.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp b/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp index 59a7381d164..327b7a51a75 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_QuadrilateralFace_Lagrange1_GaussLegendre2.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp index 17def32ab98..6ff8c6ee6ec 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Tetrahedron_Lagrange1_Gauss1.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp b/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp index b30208893be..058e20d2db2 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_TriangleFace_Lagrange1_Gauss1.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp b/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp index cacbd995848..7951af09a7b 100644 --- a/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp +++ b/src/coreComponents/finiteElement/unitTests/testH1_Wedge_Lagrange1_Gauss6.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp b/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp index 74ce89005b2..b204cc9baa9 100644 --- a/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp +++ b/src/coreComponents/finiteElement/unitTests/testQ3_Hexahedron_Lagrange_GaussLobatto.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp b/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp index 11da6407f41..2e74a035da0 100644 --- a/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp +++ b/src/coreComponents/finiteElement/unitTests/testQ5_Hexahedron_Lagrange_GaussLobatto.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/BoundaryStencil.cpp b/src/coreComponents/finiteVolume/BoundaryStencil.cpp index 5d08b265115..d2bb993141b 100644 --- a/src/coreComponents/finiteVolume/BoundaryStencil.cpp +++ b/src/coreComponents/finiteVolume/BoundaryStencil.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/BoundaryStencil.hpp b/src/coreComponents/finiteVolume/BoundaryStencil.hpp index f6f1a40b969..137bd6692a9 100644 --- a/src/coreComponents/finiteVolume/BoundaryStencil.hpp +++ b/src/coreComponents/finiteVolume/BoundaryStencil.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/CMakeLists.txt b/src/coreComponents/finiteVolume/CMakeLists.txt index b561b024d73..77aa9112334 100644 --- a/src/coreComponents/finiteVolume/CMakeLists.txt +++ b/src/coreComponents/finiteVolume/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp b/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp index 7bc34a70fb6..1f9556667fc 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp +++ b/src/coreComponents/finiteVolume/CellElementStencilMPFA.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp b/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp index 7a68580460a..296db38ad8d 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp +++ b/src/coreComponents/finiteVolume/CellElementStencilMPFA.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp b/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp index 5464447494a..d95969e7a48 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp +++ b/src/coreComponents/finiteVolume/CellElementStencilTPFA.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp b/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp index dcbe5850cea..88fa3bb2b27 100644 --- a/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp +++ b/src/coreComponents/finiteVolume/CellElementStencilTPFA.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp index 199767e948c..3fe641696e1 100644 --- a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp +++ b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp index 511d4601a17..7f9c1562366 100644 --- a/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp +++ b/src/coreComponents/finiteVolume/EmbeddedSurfaceToCellStencil.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp b/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp index a032dcb9c6b..df56d0db33e 100644 --- a/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp +++ b/src/coreComponents/finiteVolume/FaceElementToCellStencil.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp b/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp index 2654d3d9f90..3b970bd8b2b 100644 --- a/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp +++ b/src/coreComponents/finiteVolume/FaceElementToCellStencil.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp b/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp index 7c1bb141182..14161b5a0e9 100644 --- a/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp +++ b/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp b/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp index 8e1fc606b1d..82e2e638854 100644 --- a/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp +++ b/src/coreComponents/finiteVolume/FiniteVolumeManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/FluxApproximationBase.cpp b/src/coreComponents/finiteVolume/FluxApproximationBase.cpp index 9cca35ac2ef..36b61678f39 100644 --- a/src/coreComponents/finiteVolume/FluxApproximationBase.cpp +++ b/src/coreComponents/finiteVolume/FluxApproximationBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp index 873fa531b3b..fafce71f6ff 100644 --- a/src/coreComponents/finiteVolume/FluxApproximationBase.hpp +++ b/src/coreComponents/finiteVolume/FluxApproximationBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp index 267a5d7905f..f9740cbb547 100644 --- a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp +++ b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp index 3d39e41b3d2..c5bad903c66 100644 --- a/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp +++ b/src/coreComponents/finiteVolume/HybridMimeticDiscretization.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp b/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp index 37a1b28c5f9..d9362edd0a3 100644 --- a/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp +++ b/src/coreComponents/finiteVolume/MimeticInnerProductDispatch.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp index 080375a17cc..ed477300ff0 100644 --- a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp +++ b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp index d2f83e54d45..ac044dcf10c 100644 --- a/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp +++ b/src/coreComponents/finiteVolume/ProjectionEDFMHelper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/StencilBase.hpp b/src/coreComponents/finiteVolume/StencilBase.hpp index abd2ce0a1d2..cf6fb20eebe 100644 --- a/src/coreComponents/finiteVolume/StencilBase.hpp +++ b/src/coreComponents/finiteVolume/StencilBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp b/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp index 21ac95e9129..2a030dff1eb 100644 --- a/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp +++ b/src/coreComponents/finiteVolume/SurfaceElementStencil.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp b/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp index 5639a109b71..69b2a85c08a 100644 --- a/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp +++ b/src/coreComponents/finiteVolume/SurfaceElementStencil.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp index 4b1178bb545..25c128770fa 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp index 498e6b77213..53be3ad3e04 100644 --- a/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp +++ b/src/coreComponents/finiteVolume/TwoPointFluxApproximation.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp index 98587eedb75..5bde9c3a3c3 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/BdVLMInnerProduct.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp index f96ac38c88b..2c905c1713a 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp index 83d62e2ace9..7eb8f5558c6 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/MimeticInnerProductHelpers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp index 7d0606e990c..e125659ec8e 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiRTInnerProduct.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp index 61c5f07a078..4f481e7181b 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/QuasiTPFAInnerProduct.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp index 19282b23568..da7f4b2b330 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/SimpleInnerProduct.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp b/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp index 6264135df16..dde1042e41b 100644 --- a/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp +++ b/src/coreComponents/finiteVolume/mimeticInnerProducts/TPFAInnerProduct.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/CMakeLists.txt b/src/coreComponents/functions/CMakeLists.txt index bf8eed9b134..8fb39ce419d 100644 --- a/src/coreComponents/functions/CMakeLists.txt +++ b/src/coreComponents/functions/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/functions/CompositeFunction.cpp b/src/coreComponents/functions/CompositeFunction.cpp index 2bd9885ba88..58cc844a106 100644 --- a/src/coreComponents/functions/CompositeFunction.cpp +++ b/src/coreComponents/functions/CompositeFunction.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/CompositeFunction.hpp b/src/coreComponents/functions/CompositeFunction.hpp index 1ba6c8d9407..be055245814 100644 --- a/src/coreComponents/functions/CompositeFunction.hpp +++ b/src/coreComponents/functions/CompositeFunction.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/FunctionBase.cpp b/src/coreComponents/functions/FunctionBase.cpp index 9b4ae666e51..07a831fb05f 100644 --- a/src/coreComponents/functions/FunctionBase.cpp +++ b/src/coreComponents/functions/FunctionBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/FunctionBase.hpp b/src/coreComponents/functions/FunctionBase.hpp index 44f9c30bf47..c86033050fd 100644 --- a/src/coreComponents/functions/FunctionBase.hpp +++ b/src/coreComponents/functions/FunctionBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/FunctionManager.cpp b/src/coreComponents/functions/FunctionManager.cpp index 5cf652a8593..738432e89df 100644 --- a/src/coreComponents/functions/FunctionManager.cpp +++ b/src/coreComponents/functions/FunctionManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/FunctionManager.hpp b/src/coreComponents/functions/FunctionManager.hpp index 9c5359fb622..dac7ad85b0a 100644 --- a/src/coreComponents/functions/FunctionManager.hpp +++ b/src/coreComponents/functions/FunctionManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/MultivariableTableFunction.cpp b/src/coreComponents/functions/MultivariableTableFunction.cpp index 9200e188076..4f8db1244bb 100644 --- a/src/coreComponents/functions/MultivariableTableFunction.cpp +++ b/src/coreComponents/functions/MultivariableTableFunction.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/MultivariableTableFunction.hpp b/src/coreComponents/functions/MultivariableTableFunction.hpp index cc924974f49..927a020d817 100644 --- a/src/coreComponents/functions/MultivariableTableFunction.hpp +++ b/src/coreComponents/functions/MultivariableTableFunction.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp b/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp index 0647536f524..99022f23dc0 100644 --- a/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp +++ b/src/coreComponents/functions/MultivariableTableFunctionKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/SymbolicFunction.cpp b/src/coreComponents/functions/SymbolicFunction.cpp index 52187b1af13..26ae27b1be5 100644 --- a/src/coreComponents/functions/SymbolicFunction.cpp +++ b/src/coreComponents/functions/SymbolicFunction.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/SymbolicFunction.hpp b/src/coreComponents/functions/SymbolicFunction.hpp index f05e5d22336..5f0c3ea79e5 100644 --- a/src/coreComponents/functions/SymbolicFunction.hpp +++ b/src/coreComponents/functions/SymbolicFunction.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/TableFunction.cpp b/src/coreComponents/functions/TableFunction.cpp index 2e1897e7629..74f031fef87 100644 --- a/src/coreComponents/functions/TableFunction.cpp +++ b/src/coreComponents/functions/TableFunction.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/TableFunction.hpp b/src/coreComponents/functions/TableFunction.hpp index bd1fe75903a..b7be867d123 100644 --- a/src/coreComponents/functions/TableFunction.hpp +++ b/src/coreComponents/functions/TableFunction.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/functions/unitTests/testFunctions.cpp b/src/coreComponents/functions/unitTests/testFunctions.cpp index 33050f651ef..04ca26acca6 100644 --- a/src/coreComponents/functions/unitTests/testFunctions.cpp +++ b/src/coreComponents/functions/unitTests/testFunctions.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/CMakeLists.txt b/src/coreComponents/linearAlgebra/CMakeLists.txt index 0b62b22690a..99cc0bc77d4 100644 --- a/src/coreComponents/linearAlgebra/CMakeLists.txt +++ b/src/coreComponents/linearAlgebra/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/linearAlgebra/DofManager.cpp b/src/coreComponents/linearAlgebra/DofManager.cpp index 173c9cc3e09..64af6fb82e3 100644 --- a/src/coreComponents/linearAlgebra/DofManager.cpp +++ b/src/coreComponents/linearAlgebra/DofManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/DofManager.hpp b/src/coreComponents/linearAlgebra/DofManager.hpp index 82fea749d25..c37dcc1a450 100644 --- a/src/coreComponents/linearAlgebra/DofManager.hpp +++ b/src/coreComponents/linearAlgebra/DofManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp b/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp index a1b700679d5..6ae81b10790 100644 --- a/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp +++ b/src/coreComponents/linearAlgebra/DofManagerHelpers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/common/LinearOperator.hpp b/src/coreComponents/linearAlgebra/common/LinearOperator.hpp index 59b2a31b677..57476c305bc 100644 --- a/src/coreComponents/linearAlgebra/common/LinearOperator.hpp +++ b/src/coreComponents/linearAlgebra/common/LinearOperator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp b/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp index e1d881b75fc..045d096dfbc 100644 --- a/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp +++ b/src/coreComponents/linearAlgebra/common/LinearSolverBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp b/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp index f07d7c02850..ac9d0b022a9 100644 --- a/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp +++ b/src/coreComponents/linearAlgebra/common/PreconditionerBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/common/common.hpp b/src/coreComponents/linearAlgebra/common/common.hpp index 8619e89785e..54cd03337a7 100644 --- a/src/coreComponents/linearAlgebra/common/common.hpp +++ b/src/coreComponents/linearAlgebra/common/common.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/common/traits.hpp b/src/coreComponents/linearAlgebra/common/traits.hpp index 87e2af5f3c4..d300b7b782c 100644 --- a/src/coreComponents/linearAlgebra/common/traits.hpp +++ b/src/coreComponents/linearAlgebra/common/traits.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp b/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp index ab2821460dc..25098fc623b 100644 --- a/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/InterfaceTypes.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp b/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp index f82018d393e..302e220b213 100644 --- a/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/MatrixBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp b/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp index 5e9a30cd929..2efb0725fa0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/VectorBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp index 75c060fd30f..53a45e2ce7f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp index 38339ef0ab5..77534242052 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuiteSparse.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp index de01e815ba3..e4c1bdaa8a0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp index c0aa351aab9..779ad77cee0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/direct/SuperLUDist.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp index db21e94af02..9f8f33bc659 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp index e1f4e711274..9db9201ab56 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreExport.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp index 70591e59973..783c2e6b483 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp index 7ad3b790246..d6bdfd44d0a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreInterface.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp index 36a577c530a..31627dd91cb 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp index 93eba297723..b71248aa0d5 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp index 67de2ca96ae..03791b006e1 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp index feca89dd6d0..8bacdf8b978 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMGR.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp index 0f94f9c1b51..5e68ad1887d 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp index b44c3caca9a..c3dc2055bcc 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreMatrix.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp index 0d76b175eab..06d2a98981c 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp index ee7382f8ae3..f26f15a636f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HyprePreconditioner.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp index a3f87354ed6..35263458231 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp index 7cc8c5b5738..42c4bde43e8 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp index 5916fedbb4e..80a6ffba199 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp index a309557dd81..47f901330f0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreUtils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp index 7e9b7ecf5b3..5b6f7b30790 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp index 086589275b4..771c1cfe30a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/HypreVector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp index fc54f4bd24d..e496997a70c 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp index 897d3e1b9d4..5f1b8a87f98 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseHybridFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp index 709b9422f92..1042906b43e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp index 0498e304a56..8fcf6d3b189 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/CompositionalMultiphaseReservoirHybridFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp index 687be08785a..1b595cb0cee 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/HybridSinglePhasePoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp index 6983d364a89..3555d7d824e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/Hydrofracture.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp index 68dd3e5c837..40d9d565a9e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/LagrangianContactMechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp index cfeca18d3f1..90c0d3d3d05 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp index 18293db1f12..97c91e28979 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/MultiphasePoromechanicsReservoirFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp index 2285670a5b9..ee2561ad491 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ReactiveCompositionalMultiphaseOBL.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp index a0f4a101049..b7c9c5dc78e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseHybridFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp index da9b9b8e2d8..47fc589406b 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp index e3b2dbb37d1..ad7c37179a0 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsConformingFractures.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp index 26383837143..8546b24fcef 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp index 88be6a13d9b..a3f5b05918f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhasePoromechanicsReservoirFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp index a2f1bb749b7..39f4d796889 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp index b86937c3ba4..fcb2c664e49 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SinglePhaseReservoirHybridFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp index 52324cc6ba1..83cee477b41 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/SolidMechanicsEmbeddedFractures.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp index f88dffdf738..08800ab2d64 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseReservoirFVM.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseReservoirFVM.hpp index 81702aa2f8b..09b5b832035 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseReservoirFVM.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalCompositionalMultiphaseReservoirFVM.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp index 1abf2f77d94..a276456ee32 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalMultiphasePoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp index d14919e57ee..bd0aa80d5da 100644 --- a/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/hypre/mgrStrategies/ThermalSinglePhasePoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp index d6e9091dc27..a4e3361252c 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp index 34dd1a6919a..e32eab2ab40 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscExport.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp index 81334efeda6..bb404c744eb 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp index 0a9fa8021f8..d49caa38cee 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscInterface.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp index a3a49238d04..1ddf73808e2 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp index ea8ab63286a..8c1666d4c42 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscMatrix.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp index 0083c360aa0..822bf336aae 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp index d291dfffd1f..ac4a9891247 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscPreconditioner.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp index 026e047d811..1470cd2e4a9 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp index 9f036afd0df..4264573bda3 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp index b97e623d911..94002ab46bb 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscUtils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp index 9e923c7245a..5e2106127bf 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp index 77e06e73242..16a325323ff 100644 --- a/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/petsc/PetscVector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp index bb48bc8433d..30537c0764e 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp index 5d2b440b953..51e055152bc 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraExport.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp index d6da38b3639..4b92501c57a 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp index 8866ab1f312..501e5d03916 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraMatrix.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp index 1d6900dab4a..7ca7495574d 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraUtils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp index 78df1acee35..a9285597103 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp index 6605102fa53..0d1b394a005 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/EpetraVector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp index 2a3b7bd2b8b..39c5883876f 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp index 4a63c4ce138..6c3a2a06925 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosInterface.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp index a49a8b03f88..1f2bfb02faf 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp index 9db8a0c50dc..2efdf01b192 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosPreconditioner.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp index df8fed1921a..e6dec1a5082 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp index 8e73c1c37e0..a8f6b78cb0b 100644 --- a/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp +++ b/src/coreComponents/linearAlgebra/interfaces/trilinos/TrilinosSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp index 089ebfceb50..e8e486916d8 100644 --- a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp index 82602e2942d..41400be9b27 100644 --- a/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/BicgstabSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp index 4e708f936a9..4cbbbace185 100644 --- a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp index 390d7549d32..d7648406aa0 100644 --- a/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/solvers/BlockPreconditioner.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp b/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp index dfb58db5a9d..ca80ddb1c5a 100644 --- a/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/CgSolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp b/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp index 28d36c7dce1..bc88229735d 100644 --- a/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/CgSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp b/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp index 5c1e7eb1bc9..f2b801c5d04 100644 --- a/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/GmresSolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp b/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp index 4b11df1b441..1f41810c7d5 100644 --- a/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/GmresSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp index 25dfbbae30b..c2c7eb4d59d 100644 --- a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp +++ b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp index 8f0381c391e..44856621892 100644 --- a/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp +++ b/src/coreComponents/linearAlgebra/solvers/KrylovSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp b/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp index 5a65b48670a..3b69ee74b54 100644 --- a/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp +++ b/src/coreComponents/linearAlgebra/solvers/KrylovUtils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp b/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp index 6685ba45be2..7fe79b244a4 100644 --- a/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp +++ b/src/coreComponents/linearAlgebra/solvers/PreconditionerBlockJacobi.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp b/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp index 006b9bfa413..696a8ab481d 100644 --- a/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp +++ b/src/coreComponents/linearAlgebra/solvers/PreconditionerIdentity.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp b/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp index fcd4f0490f1..e5034cd57e6 100644 --- a/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp +++ b/src/coreComponents/linearAlgebra/solvers/PreconditionerJacobi.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp index 735c44ec3ce..0c27b3b5291 100644 --- a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp +++ b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp index 4c65ef51894..d2b3b6e19a2 100644 --- a/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp +++ b/src/coreComponents/linearAlgebra/solvers/SeparateComponentPreconditioner.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp b/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp index c5fe76ede5b..23aef693db0 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testComponentMask.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp b/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp index 7c8cebb3627..d9ed3a881dc 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testExternalSolvers.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp index f3d59a84963..898cfa63f41 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testKrylovSolvers.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp b/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp index b230f7a8394..19cd2754d33 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp +++ b/src/coreComponents/linearAlgebra/unitTests/testLinearAlgebraUtils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp b/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp index 5194fab06bd..689188e9bfd 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testLinearSolverParametersEnums.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp b/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp index e5219b37bd9..baadb01ce9f 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testMatrices.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp b/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp index 9e5890f9899..88db5cb59dc 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testReverseCutHillMcKeeOrdering.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp b/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp index a90bb2ecb97..927f818b3ba 100644 --- a/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp +++ b/src/coreComponents/linearAlgebra/unitTests/testVectors.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp b/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp index cd9b427ba65..d399b278b2d 100644 --- a/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp +++ b/src/coreComponents/linearAlgebra/utilities/Arnoldi.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp b/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp index 8b49577ce63..f25068efeb4 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockOperator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp b/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp index 26daf4818c4..a7da7ca9a79 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockOperatorView.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp b/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp index b0ac936e2bf..4cab49d47e6 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockOperatorWrapper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp b/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp index ea78c17e96d..c71e0a59c8c 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockVector.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp b/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp index bfedf07dc24..626744a796b 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockVectorView.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp b/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp index d1dcbddb107..b1a7f1ab603 100644 --- a/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp +++ b/src/coreComponents/linearAlgebra/utilities/BlockVectorWrapper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp b/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp index 7d7a0b019ad..a27d1a37a64 100644 --- a/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp +++ b/src/coreComponents/linearAlgebra/utilities/ComponentMask.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp b/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp index f5f70510185..977135fb419 100644 --- a/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/InverseNormalOperator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp b/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp index 477e5485c7f..6a06e310583 100644 --- a/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LAIHelperFunctions.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp index cd0aecfc572..803946ac95c 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverParameters.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp b/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp index 90d6365f229..3a12e612a79 100644 --- a/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp +++ b/src/coreComponents/linearAlgebra/utilities/LinearSolverResult.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp b/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp index 466808c0170..2382af2e0c2 100644 --- a/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/NormalOperator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp index 4631d42f70e..8716ee585e9 100644 --- a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp +++ b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp index bed455a783f..01b8479b964 100644 --- a/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp +++ b/src/coreComponents/linearAlgebra/utilities/ReverseCutHillMcKeeOrdering.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp b/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp index cd623bddf78..18d1ed2c35a 100644 --- a/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp +++ b/src/coreComponents/linearAlgebra/utilities/TransposeOperator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mainInterface/CMakeLists.txt b/src/coreComponents/mainInterface/CMakeLists.txt index 1e21b437bc0..a7b02f95041 100644 --- a/src/coreComponents/mainInterface/CMakeLists.txt +++ b/src/coreComponents/mainInterface/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/mainInterface/GeosxState.cpp b/src/coreComponents/mainInterface/GeosxState.cpp index 8aceec88991..12cb2baf62a 100644 --- a/src/coreComponents/mainInterface/GeosxState.cpp +++ b/src/coreComponents/mainInterface/GeosxState.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mainInterface/GeosxState.hpp b/src/coreComponents/mainInterface/GeosxState.hpp index 888bef6d7dd..43d44de6674 100644 --- a/src/coreComponents/mainInterface/GeosxState.hpp +++ b/src/coreComponents/mainInterface/GeosxState.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mainInterface/GeosxVersion.hpp.in b/src/coreComponents/mainInterface/GeosxVersion.hpp.in index 4d523fbf5b8..57e801ba7f0 100644 --- a/src/coreComponents/mainInterface/GeosxVersion.hpp.in +++ b/src/coreComponents/mainInterface/GeosxVersion.hpp.in @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mainInterface/ProblemManager.cpp b/src/coreComponents/mainInterface/ProblemManager.cpp index d60a61663b7..652c1d3193d 100644 --- a/src/coreComponents/mainInterface/ProblemManager.cpp +++ b/src/coreComponents/mainInterface/ProblemManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mainInterface/ProblemManager.hpp b/src/coreComponents/mainInterface/ProblemManager.hpp index 6067f1b4391..8ff875005d2 100644 --- a/src/coreComponents/mainInterface/ProblemManager.hpp +++ b/src/coreComponents/mainInterface/ProblemManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mainInterface/initialization.cpp b/src/coreComponents/mainInterface/initialization.cpp index 71388045b03..c33da0c59a7 100644 --- a/src/coreComponents/mainInterface/initialization.cpp +++ b/src/coreComponents/mainInterface/initialization.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mainInterface/initialization.hpp b/src/coreComponents/mainInterface/initialization.hpp index 8f8eb32ad24..85cd4331066 100644 --- a/src/coreComponents/mainInterface/initialization.hpp +++ b/src/coreComponents/mainInterface/initialization.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mainInterface/version.cpp b/src/coreComponents/mainInterface/version.cpp index e478d0cf1fd..0ed60fc6b18 100644 --- a/src/coreComponents/mainInterface/version.cpp +++ b/src/coreComponents/mainInterface/version.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mainInterface/version.hpp b/src/coreComponents/mainInterface/version.hpp index 4187c7d032b..8d4847c9497 100644 --- a/src/coreComponents/mainInterface/version.hpp +++ b/src/coreComponents/mainInterface/version.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/math/CMakeLists.txt b/src/coreComponents/math/CMakeLists.txt index 1afa1d60688..9af283583e3 100644 --- a/src/coreComponents/math/CMakeLists.txt +++ b/src/coreComponents/math/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/math/extrapolation/Extrapolation.hpp b/src/coreComponents/math/extrapolation/Extrapolation.hpp index fe79a94913e..9df48fdefb8 100644 --- a/src/coreComponents/math/extrapolation/Extrapolation.hpp +++ b/src/coreComponents/math/extrapolation/Extrapolation.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/math/interpolation/Interpolation.hpp b/src/coreComponents/math/interpolation/Interpolation.hpp index 5a20e9ec7a9..1b72fe943bb 100644 --- a/src/coreComponents/math/interpolation/Interpolation.hpp +++ b/src/coreComponents/math/interpolation/Interpolation.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/BufferOps.cpp b/src/coreComponents/mesh/BufferOps.cpp index 7225ad52847..408e11839a7 100644 --- a/src/coreComponents/mesh/BufferOps.cpp +++ b/src/coreComponents/mesh/BufferOps.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/BufferOps.hpp b/src/coreComponents/mesh/BufferOps.hpp index 1d18096a120..ef6b926ac8d 100644 --- a/src/coreComponents/mesh/BufferOps.hpp +++ b/src/coreComponents/mesh/BufferOps.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/CMakeLists.txt b/src/coreComponents/mesh/CMakeLists.txt index 277df76bc4a..05f09e22dc8 100644 --- a/src/coreComponents/mesh/CMakeLists.txt +++ b/src/coreComponents/mesh/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/mesh/CellElementRegion.cpp b/src/coreComponents/mesh/CellElementRegion.cpp index da3aabb63b3..4207cdefdca 100644 --- a/src/coreComponents/mesh/CellElementRegion.cpp +++ b/src/coreComponents/mesh/CellElementRegion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/CellElementRegion.hpp b/src/coreComponents/mesh/CellElementRegion.hpp index e2156ceb805..95d9d978de8 100644 --- a/src/coreComponents/mesh/CellElementRegion.hpp +++ b/src/coreComponents/mesh/CellElementRegion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/CellElementRegionSelector.cpp b/src/coreComponents/mesh/CellElementRegionSelector.cpp index 80047d71c79..f5bbc006116 100644 --- a/src/coreComponents/mesh/CellElementRegionSelector.cpp +++ b/src/coreComponents/mesh/CellElementRegionSelector.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/mesh/CellElementRegionSelector.hpp b/src/coreComponents/mesh/CellElementRegionSelector.hpp index 962f99aca1b..d3d1c6a840d 100644 --- a/src/coreComponents/mesh/CellElementRegionSelector.hpp +++ b/src/coreComponents/mesh/CellElementRegionSelector.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/mesh/CellElementSubRegion.cpp b/src/coreComponents/mesh/CellElementSubRegion.cpp index 255e732c8e3..d324b6189c0 100644 --- a/src/coreComponents/mesh/CellElementSubRegion.cpp +++ b/src/coreComponents/mesh/CellElementSubRegion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/CellElementSubRegion.hpp b/src/coreComponents/mesh/CellElementSubRegion.hpp index b230a64bdb1..cdb158fa88f 100644 --- a/src/coreComponents/mesh/CellElementSubRegion.hpp +++ b/src/coreComponents/mesh/CellElementSubRegion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/DomainPartition.cpp b/src/coreComponents/mesh/DomainPartition.cpp index 9604c30932c..befc10b4850 100644 --- a/src/coreComponents/mesh/DomainPartition.cpp +++ b/src/coreComponents/mesh/DomainPartition.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/DomainPartition.hpp b/src/coreComponents/mesh/DomainPartition.hpp index c15eb224100..0af42ee9256 100644 --- a/src/coreComponents/mesh/DomainPartition.hpp +++ b/src/coreComponents/mesh/DomainPartition.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/EdgeManager.cpp b/src/coreComponents/mesh/EdgeManager.cpp index e751cd61729..f8227cb4a67 100644 --- a/src/coreComponents/mesh/EdgeManager.cpp +++ b/src/coreComponents/mesh/EdgeManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/EdgeManager.hpp b/src/coreComponents/mesh/EdgeManager.hpp index eedcc23a4d4..f955b9dd83e 100644 --- a/src/coreComponents/mesh/EdgeManager.hpp +++ b/src/coreComponents/mesh/EdgeManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ElementRegionBase.cpp b/src/coreComponents/mesh/ElementRegionBase.cpp index 844827c28bf..97304535015 100644 --- a/src/coreComponents/mesh/ElementRegionBase.cpp +++ b/src/coreComponents/mesh/ElementRegionBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ElementRegionBase.hpp b/src/coreComponents/mesh/ElementRegionBase.hpp index f2050f351bd..60f0f9b7a5e 100644 --- a/src/coreComponents/mesh/ElementRegionBase.hpp +++ b/src/coreComponents/mesh/ElementRegionBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index e953e42de03..89c05003385 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ElementRegionManager.hpp b/src/coreComponents/mesh/ElementRegionManager.hpp index 8282172d274..fe47a863655 100644 --- a/src/coreComponents/mesh/ElementRegionManager.hpp +++ b/src/coreComponents/mesh/ElementRegionManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ElementSubRegionBase.cpp b/src/coreComponents/mesh/ElementSubRegionBase.cpp index f3dc3a23745..6234dbaca94 100644 --- a/src/coreComponents/mesh/ElementSubRegionBase.cpp +++ b/src/coreComponents/mesh/ElementSubRegionBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ElementSubRegionBase.hpp b/src/coreComponents/mesh/ElementSubRegionBase.hpp index 74bd710a310..c61289839c8 100644 --- a/src/coreComponents/mesh/ElementSubRegionBase.hpp +++ b/src/coreComponents/mesh/ElementSubRegionBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ElementType.hpp b/src/coreComponents/mesh/ElementType.hpp index 0dd913402cd..0ebb7ba5e03 100644 --- a/src/coreComponents/mesh/ElementType.hpp +++ b/src/coreComponents/mesh/ElementType.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp index dd18ab4439b..d8d053b7951 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp index fdb11f62c98..7d49caf0ff3 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceNodeManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp index ab0714cfc42..875d23b289f 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp index 85dbf465049..5baa73ec274 100644 --- a/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp +++ b/src/coreComponents/mesh/EmbeddedSurfaceSubRegion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ExternalDataSourceBase.cpp b/src/coreComponents/mesh/ExternalDataSourceBase.cpp index a3b8fd0c1b2..2f3ea7bf8a9 100644 --- a/src/coreComponents/mesh/ExternalDataSourceBase.cpp +++ b/src/coreComponents/mesh/ExternalDataSourceBase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/mesh/ExternalDataSourceBase.hpp b/src/coreComponents/mesh/ExternalDataSourceBase.hpp index 8dabca1abe0..0e2f9a4ab17 100644 --- a/src/coreComponents/mesh/ExternalDataSourceBase.hpp +++ b/src/coreComponents/mesh/ExternalDataSourceBase.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/mesh/ExternalDataSourceManager.cpp b/src/coreComponents/mesh/ExternalDataSourceManager.cpp index c8259594713..5cd6eb6fd88 100644 --- a/src/coreComponents/mesh/ExternalDataSourceManager.cpp +++ b/src/coreComponents/mesh/ExternalDataSourceManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ExternalDataSourceManager.hpp b/src/coreComponents/mesh/ExternalDataSourceManager.hpp index 2e6141af4e3..28ccecb2fc1 100644 --- a/src/coreComponents/mesh/ExternalDataSourceManager.hpp +++ b/src/coreComponents/mesh/ExternalDataSourceManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/FaceElementSubRegion.cpp b/src/coreComponents/mesh/FaceElementSubRegion.cpp index 3537ca4fba4..f1e1162a060 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/FaceElementSubRegion.hpp b/src/coreComponents/mesh/FaceElementSubRegion.hpp index 41b4d298d94..42655d7a274 100644 --- a/src/coreComponents/mesh/FaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/FaceElementSubRegion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/FaceManager.cpp b/src/coreComponents/mesh/FaceManager.cpp index 710e3d5d47b..044cd1beb47 100644 --- a/src/coreComponents/mesh/FaceManager.cpp +++ b/src/coreComponents/mesh/FaceManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/FaceManager.hpp b/src/coreComponents/mesh/FaceManager.hpp index 7d7693ab4d6..97fc8187671 100644 --- a/src/coreComponents/mesh/FaceManager.hpp +++ b/src/coreComponents/mesh/FaceManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/FieldIdentifiers.hpp b/src/coreComponents/mesh/FieldIdentifiers.hpp index 677106340e6..dcbd8620f65 100644 --- a/src/coreComponents/mesh/FieldIdentifiers.hpp +++ b/src/coreComponents/mesh/FieldIdentifiers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/InterObjectRelation.hpp b/src/coreComponents/mesh/InterObjectRelation.hpp index 33e39155e52..b48f99f1a61 100644 --- a/src/coreComponents/mesh/InterObjectRelation.hpp +++ b/src/coreComponents/mesh/InterObjectRelation.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/MeshBody.cpp b/src/coreComponents/mesh/MeshBody.cpp index 80696370fb3..7695972f6d4 100644 --- a/src/coreComponents/mesh/MeshBody.cpp +++ b/src/coreComponents/mesh/MeshBody.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/MeshBody.hpp b/src/coreComponents/mesh/MeshBody.hpp index ca614f8f18f..bf06ca72501 100644 --- a/src/coreComponents/mesh/MeshBody.hpp +++ b/src/coreComponents/mesh/MeshBody.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/MeshFields.hpp b/src/coreComponents/mesh/MeshFields.hpp index e2afe94e100..dc8ff969e64 100644 --- a/src/coreComponents/mesh/MeshFields.hpp +++ b/src/coreComponents/mesh/MeshFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/MeshForLoopInterface.hpp b/src/coreComponents/mesh/MeshForLoopInterface.hpp index d069fbc5fc1..b7c126b1e23 100644 --- a/src/coreComponents/mesh/MeshForLoopInterface.hpp +++ b/src/coreComponents/mesh/MeshForLoopInterface.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/MeshLevel.cpp b/src/coreComponents/mesh/MeshLevel.cpp index 626f88f2af6..be5bc7763d8 100644 --- a/src/coreComponents/mesh/MeshLevel.cpp +++ b/src/coreComponents/mesh/MeshLevel.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/MeshLevel.hpp b/src/coreComponents/mesh/MeshLevel.hpp index dee7e31bd1e..f61892216c4 100644 --- a/src/coreComponents/mesh/MeshLevel.hpp +++ b/src/coreComponents/mesh/MeshLevel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/MeshManager.cpp b/src/coreComponents/mesh/MeshManager.cpp index b88a4ca9a31..e5bc0979c8d 100644 --- a/src/coreComponents/mesh/MeshManager.cpp +++ b/src/coreComponents/mesh/MeshManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/MeshManager.hpp b/src/coreComponents/mesh/MeshManager.hpp index c00c8cc093b..9f8ed2aaaa4 100644 --- a/src/coreComponents/mesh/MeshManager.hpp +++ b/src/coreComponents/mesh/MeshManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/MeshObjectPath.cpp b/src/coreComponents/mesh/MeshObjectPath.cpp index 4607ad0416e..31481e53b72 100644 --- a/src/coreComponents/mesh/MeshObjectPath.cpp +++ b/src/coreComponents/mesh/MeshObjectPath.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/MeshObjectPath.hpp b/src/coreComponents/mesh/MeshObjectPath.hpp index 832ef9a5548..5aa5ec98758 100644 --- a/src/coreComponents/mesh/MeshObjectPath.hpp +++ b/src/coreComponents/mesh/MeshObjectPath.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/NodeManager.cpp b/src/coreComponents/mesh/NodeManager.cpp index aa839d8cf4a..55f6aed4568 100644 --- a/src/coreComponents/mesh/NodeManager.cpp +++ b/src/coreComponents/mesh/NodeManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/NodeManager.hpp b/src/coreComponents/mesh/NodeManager.hpp index 5e9bcc11b43..4cc3b6fdd94 100644 --- a/src/coreComponents/mesh/NodeManager.hpp +++ b/src/coreComponents/mesh/NodeManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ObjectManagerBase.cpp b/src/coreComponents/mesh/ObjectManagerBase.cpp index 51f75effb2e..d2e75463c99 100644 --- a/src/coreComponents/mesh/ObjectManagerBase.cpp +++ b/src/coreComponents/mesh/ObjectManagerBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ObjectManagerBase.hpp b/src/coreComponents/mesh/ObjectManagerBase.hpp index 78940fd0e60..1ac1297ed26 100644 --- a/src/coreComponents/mesh/ObjectManagerBase.hpp +++ b/src/coreComponents/mesh/ObjectManagerBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ParticleManager.cpp b/src/coreComponents/mesh/ParticleManager.cpp index af1096d02c2..34ddd5ae39f 100644 --- a/src/coreComponents/mesh/ParticleManager.cpp +++ b/src/coreComponents/mesh/ParticleManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ParticleManager.hpp b/src/coreComponents/mesh/ParticleManager.hpp index f123471b9c3..2af33a6eb76 100644 --- a/src/coreComponents/mesh/ParticleManager.hpp +++ b/src/coreComponents/mesh/ParticleManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ParticleRegion.cpp b/src/coreComponents/mesh/ParticleRegion.cpp index a18cb3e32dc..d79e35ade22 100644 --- a/src/coreComponents/mesh/ParticleRegion.cpp +++ b/src/coreComponents/mesh/ParticleRegion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ParticleRegion.hpp b/src/coreComponents/mesh/ParticleRegion.hpp index 7295fb8c029..4967a043200 100644 --- a/src/coreComponents/mesh/ParticleRegion.hpp +++ b/src/coreComponents/mesh/ParticleRegion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ParticleRegionBase.cpp b/src/coreComponents/mesh/ParticleRegionBase.cpp index 1503dcf6947..8dff7c56f96 100644 --- a/src/coreComponents/mesh/ParticleRegionBase.cpp +++ b/src/coreComponents/mesh/ParticleRegionBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ParticleRegionBase.hpp b/src/coreComponents/mesh/ParticleRegionBase.hpp index 7989c1392f1..ae551db35ba 100644 --- a/src/coreComponents/mesh/ParticleRegionBase.hpp +++ b/src/coreComponents/mesh/ParticleRegionBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ParticleSubRegion.cpp b/src/coreComponents/mesh/ParticleSubRegion.cpp index 4f1380347af..ea30521dc70 100644 --- a/src/coreComponents/mesh/ParticleSubRegion.cpp +++ b/src/coreComponents/mesh/ParticleSubRegion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ParticleSubRegion.hpp b/src/coreComponents/mesh/ParticleSubRegion.hpp index 6fef225e1e4..1f9111b43d9 100644 --- a/src/coreComponents/mesh/ParticleSubRegion.hpp +++ b/src/coreComponents/mesh/ParticleSubRegion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ParticleSubRegionBase.cpp b/src/coreComponents/mesh/ParticleSubRegionBase.cpp index 78b7fb20560..829f1f4a376 100644 --- a/src/coreComponents/mesh/ParticleSubRegionBase.cpp +++ b/src/coreComponents/mesh/ParticleSubRegionBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ParticleSubRegionBase.hpp b/src/coreComponents/mesh/ParticleSubRegionBase.hpp index deb99881a86..b89af32a1ab 100644 --- a/src/coreComponents/mesh/ParticleSubRegionBase.hpp +++ b/src/coreComponents/mesh/ParticleSubRegionBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ParticleType.hpp b/src/coreComponents/mesh/ParticleType.hpp index b221f538084..3a61803ebcb 100644 --- a/src/coreComponents/mesh/ParticleType.hpp +++ b/src/coreComponents/mesh/ParticleType.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/Perforation.cpp b/src/coreComponents/mesh/Perforation.cpp index fdfa6170d0f..74ade6d4269 100644 --- a/src/coreComponents/mesh/Perforation.cpp +++ b/src/coreComponents/mesh/Perforation.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/Perforation.hpp b/src/coreComponents/mesh/Perforation.hpp index e225b2d53c1..5a3a3ae8721 100644 --- a/src/coreComponents/mesh/Perforation.hpp +++ b/src/coreComponents/mesh/Perforation.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/PerforationData.cpp b/src/coreComponents/mesh/PerforationData.cpp index 536e03f51ad..4363c2ac1cb 100644 --- a/src/coreComponents/mesh/PerforationData.cpp +++ b/src/coreComponents/mesh/PerforationData.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/PerforationData.hpp b/src/coreComponents/mesh/PerforationData.hpp index f8f2e801c40..1bc24f45a1f 100644 --- a/src/coreComponents/mesh/PerforationData.hpp +++ b/src/coreComponents/mesh/PerforationData.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/PerforationFields.hpp b/src/coreComponents/mesh/PerforationFields.hpp index 263c7254078..b9438b1afd0 100644 --- a/src/coreComponents/mesh/PerforationFields.hpp +++ b/src/coreComponents/mesh/PerforationFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/SurfaceElementRegion.cpp b/src/coreComponents/mesh/SurfaceElementRegion.cpp index 0734ee3a06e..e6b47dbae4d 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/SurfaceElementRegion.hpp b/src/coreComponents/mesh/SurfaceElementRegion.hpp index 9abd8a6ed06..f15de2d63f6 100644 --- a/src/coreComponents/mesh/SurfaceElementRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementRegion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp index 9f946de082f..3b371106393 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.cpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp index 0ec1adba3a2..f2c367b475d 100644 --- a/src/coreComponents/mesh/SurfaceElementSubRegion.hpp +++ b/src/coreComponents/mesh/SurfaceElementSubRegion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ToElementRelation.cpp b/src/coreComponents/mesh/ToElementRelation.cpp index 6f3bfb37b7e..2e657bb51d4 100644 --- a/src/coreComponents/mesh/ToElementRelation.cpp +++ b/src/coreComponents/mesh/ToElementRelation.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ToElementRelation.hpp b/src/coreComponents/mesh/ToElementRelation.hpp index b596b273fa3..097b58faea5 100644 --- a/src/coreComponents/mesh/ToElementRelation.hpp +++ b/src/coreComponents/mesh/ToElementRelation.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ToParticleRelation.cpp b/src/coreComponents/mesh/ToParticleRelation.cpp index 8b39e66e06d..78989d32479 100644 --- a/src/coreComponents/mesh/ToParticleRelation.cpp +++ b/src/coreComponents/mesh/ToParticleRelation.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/ToParticleRelation.hpp b/src/coreComponents/mesh/ToParticleRelation.hpp index fc539e24f71..f9e0e540d40 100644 --- a/src/coreComponents/mesh/ToParticleRelation.hpp +++ b/src/coreComponents/mesh/ToParticleRelation.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/WellElementRegion.cpp b/src/coreComponents/mesh/WellElementRegion.cpp index a9093f7679e..ec70f49d042 100644 --- a/src/coreComponents/mesh/WellElementRegion.cpp +++ b/src/coreComponents/mesh/WellElementRegion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/WellElementRegion.hpp b/src/coreComponents/mesh/WellElementRegion.hpp index b4abdd08027..5a41cf19526 100644 --- a/src/coreComponents/mesh/WellElementRegion.hpp +++ b/src/coreComponents/mesh/WellElementRegion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/WellElementSubRegion.cpp b/src/coreComponents/mesh/WellElementSubRegion.cpp index daf53c67621..cd8d5cde24f 100644 --- a/src/coreComponents/mesh/WellElementSubRegion.cpp +++ b/src/coreComponents/mesh/WellElementSubRegion.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/WellElementSubRegion.hpp b/src/coreComponents/mesh/WellElementSubRegion.hpp index 0ddc7583e66..9abc515064b 100644 --- a/src/coreComponents/mesh/WellElementSubRegion.hpp +++ b/src/coreComponents/mesh/WellElementSubRegion.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/CellBlock.cpp b/src/coreComponents/mesh/generators/CellBlock.cpp index 97ce7e08a74..cd60545c5e9 100644 --- a/src/coreComponents/mesh/generators/CellBlock.cpp +++ b/src/coreComponents/mesh/generators/CellBlock.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/CellBlock.hpp b/src/coreComponents/mesh/generators/CellBlock.hpp index 4d704b62a8e..6fa0de501a9 100644 --- a/src/coreComponents/mesh/generators/CellBlock.hpp +++ b/src/coreComponents/mesh/generators/CellBlock.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/CellBlockABC.hpp b/src/coreComponents/mesh/generators/CellBlockABC.hpp index 9c1427b7a74..7749ce687fe 100644 --- a/src/coreComponents/mesh/generators/CellBlockABC.hpp +++ b/src/coreComponents/mesh/generators/CellBlockABC.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/CellBlockManager.cpp b/src/coreComponents/mesh/generators/CellBlockManager.cpp index 2db3b3cfff2..2dd41c0987a 100644 --- a/src/coreComponents/mesh/generators/CellBlockManager.cpp +++ b/src/coreComponents/mesh/generators/CellBlockManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/CellBlockManager.hpp b/src/coreComponents/mesh/generators/CellBlockManager.hpp index dcb15629251..4e8d2688564 100644 --- a/src/coreComponents/mesh/generators/CellBlockManager.hpp +++ b/src/coreComponents/mesh/generators/CellBlockManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp b/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp index 3c474520389..c68c2a1bf13 100644 --- a/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp +++ b/src/coreComponents/mesh/generators/CellBlockManagerABC.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/CellBlockUtilities.cpp b/src/coreComponents/mesh/generators/CellBlockUtilities.cpp index bbb246700de..6c2f902e556 100644 --- a/src/coreComponents/mesh/generators/CellBlockUtilities.cpp +++ b/src/coreComponents/mesh/generators/CellBlockUtilities.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/CellBlockUtilities.hpp b/src/coreComponents/mesh/generators/CellBlockUtilities.hpp index dcfdc1d5dd2..ab2d83b52ba 100644 --- a/src/coreComponents/mesh/generators/CellBlockUtilities.hpp +++ b/src/coreComponents/mesh/generators/CellBlockUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/CollocatedNodes.cpp b/src/coreComponents/mesh/generators/CollocatedNodes.cpp index 149c49b93dd..89f6fdcd484 100644 --- a/src/coreComponents/mesh/generators/CollocatedNodes.cpp +++ b/src/coreComponents/mesh/generators/CollocatedNodes.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/CollocatedNodes.hpp b/src/coreComponents/mesh/generators/CollocatedNodes.hpp index 73f00f8d6b3..54fea6afef7 100644 --- a/src/coreComponents/mesh/generators/CollocatedNodes.hpp +++ b/src/coreComponents/mesh/generators/CollocatedNodes.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp index d05abf7a680..ff3cd238c91 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp index fd1a006c192..f01d3938b7b 100644 --- a/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/ExternalMeshGeneratorBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/FaceBlock.cpp b/src/coreComponents/mesh/generators/FaceBlock.cpp index 478a33ae05f..717f3395f99 100644 --- a/src/coreComponents/mesh/generators/FaceBlock.cpp +++ b/src/coreComponents/mesh/generators/FaceBlock.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/FaceBlock.hpp b/src/coreComponents/mesh/generators/FaceBlock.hpp index be458a85067..55b0d5840b8 100644 --- a/src/coreComponents/mesh/generators/FaceBlock.hpp +++ b/src/coreComponents/mesh/generators/FaceBlock.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/FaceBlockABC.hpp b/src/coreComponents/mesh/generators/FaceBlockABC.hpp index 98fdbcfe856..2df82db9913 100644 --- a/src/coreComponents/mesh/generators/FaceBlockABC.hpp +++ b/src/coreComponents/mesh/generators/FaceBlockABC.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp index 0536ce29fbe..ace6dd8846e 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp index 40b0b01ee90..c9d86cc35a7 100644 --- a/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalMeshGenerator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp index 81fc219dbbc..ffffbd7e3a8 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/InternalWellGenerator.hpp b/src/coreComponents/mesh/generators/InternalWellGenerator.hpp index ff937a3d000..6f58313f1b7 100644 --- a/src/coreComponents/mesh/generators/InternalWellGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalWellGenerator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp index 78a2ab785df..008ff4f91f3 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp b/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp index c4b63aec5ac..5076a9e39c1 100644 --- a/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp +++ b/src/coreComponents/mesh/generators/InternalWellboreGenerator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/LineBlock.cpp b/src/coreComponents/mesh/generators/LineBlock.cpp index 72fd83d301d..d87b3a63240 100644 --- a/src/coreComponents/mesh/generators/LineBlock.cpp +++ b/src/coreComponents/mesh/generators/LineBlock.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/LineBlock.hpp b/src/coreComponents/mesh/generators/LineBlock.hpp index 137af0bca80..e2af5724ec5 100644 --- a/src/coreComponents/mesh/generators/LineBlock.hpp +++ b/src/coreComponents/mesh/generators/LineBlock.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/LineBlockABC.hpp b/src/coreComponents/mesh/generators/LineBlockABC.hpp index ca64400d1e1..2855789ed66 100644 --- a/src/coreComponents/mesh/generators/LineBlockABC.hpp +++ b/src/coreComponents/mesh/generators/LineBlockABC.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/MeshComponentBase.cpp b/src/coreComponents/mesh/generators/MeshComponentBase.cpp index 896bb0745a0..75742a87e30 100644 --- a/src/coreComponents/mesh/generators/MeshComponentBase.cpp +++ b/src/coreComponents/mesh/generators/MeshComponentBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/MeshComponentBase.hpp b/src/coreComponents/mesh/generators/MeshComponentBase.hpp index 3f1553dd449..e24ee2b42d8 100644 --- a/src/coreComponents/mesh/generators/MeshComponentBase.hpp +++ b/src/coreComponents/mesh/generators/MeshComponentBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp index 8a474eaf09f..45971d410bc 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp index 0a0ba34ba81..d71de5cac30 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/PTScotchInterface.cpp b/src/coreComponents/mesh/generators/PTScotchInterface.cpp index 270615f1869..2737c42db70 100644 --- a/src/coreComponents/mesh/generators/PTScotchInterface.cpp +++ b/src/coreComponents/mesh/generators/PTScotchInterface.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/PTScotchInterface.hpp b/src/coreComponents/mesh/generators/PTScotchInterface.hpp index bdd7cf6ff1e..e188aadd55b 100644 --- a/src/coreComponents/mesh/generators/PTScotchInterface.hpp +++ b/src/coreComponents/mesh/generators/PTScotchInterface.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ParMETISInterface.cpp b/src/coreComponents/mesh/generators/ParMETISInterface.cpp index 9f9d574b945..4567826b341 100644 --- a/src/coreComponents/mesh/generators/ParMETISInterface.cpp +++ b/src/coreComponents/mesh/generators/ParMETISInterface.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ParMETISInterface.hpp b/src/coreComponents/mesh/generators/ParMETISInterface.hpp index f9dc2af71ac..fa1bb2c8545 100644 --- a/src/coreComponents/mesh/generators/ParMETISInterface.hpp +++ b/src/coreComponents/mesh/generators/ParMETISInterface.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ParticleBlock.cpp b/src/coreComponents/mesh/generators/ParticleBlock.cpp index 1981cb89a0e..3cf22ea8ae2 100644 --- a/src/coreComponents/mesh/generators/ParticleBlock.cpp +++ b/src/coreComponents/mesh/generators/ParticleBlock.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ParticleBlock.hpp b/src/coreComponents/mesh/generators/ParticleBlock.hpp index 01b22edf7a1..947533e1e53 100644 --- a/src/coreComponents/mesh/generators/ParticleBlock.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlock.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ParticleBlockABC.hpp b/src/coreComponents/mesh/generators/ParticleBlockABC.hpp index 966c188d6c3..c8f16c03e46 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockABC.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockABC.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ParticleBlockManager.cpp b/src/coreComponents/mesh/generators/ParticleBlockManager.cpp index b9645f04fd2..d96f11711dc 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManager.cpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ParticleBlockManager.hpp b/src/coreComponents/mesh/generators/ParticleBlockManager.hpp index 8db63988897..87e69c767e3 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManager.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp b/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp index fc2decfd008..c622f31af24 100644 --- a/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp +++ b/src/coreComponents/mesh/generators/ParticleBlockManagerABC.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp b/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp index 436a41a81a4..eeef02ae013 100644 --- a/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/ParticleMeshGenerator.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp index e6060f0b854..b6ee283aaac 100644 --- a/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/ParticleMeshGenerator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/PartitionDescriptor.hpp b/src/coreComponents/mesh/generators/PartitionDescriptor.hpp index 2527ec16984..ef4e4bb4566 100644 --- a/src/coreComponents/mesh/generators/PartitionDescriptor.hpp +++ b/src/coreComponents/mesh/generators/PartitionDescriptor.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/PrismUtilities.hpp b/src/coreComponents/mesh/generators/PrismUtilities.hpp index 483f97d3d28..f6e70aef310 100644 --- a/src/coreComponents/mesh/generators/PrismUtilities.hpp +++ b/src/coreComponents/mesh/generators/PrismUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/Region.cpp b/src/coreComponents/mesh/generators/Region.cpp index 05212f599d8..b707e6077ba 100644 --- a/src/coreComponents/mesh/generators/Region.cpp +++ b/src/coreComponents/mesh/generators/Region.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/Region.hpp b/src/coreComponents/mesh/generators/Region.hpp index 4fce224a0a5..6a5af64d92e 100644 --- a/src/coreComponents/mesh/generators/Region.hpp +++ b/src/coreComponents/mesh/generators/Region.hpp @@ -4,7 +4,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp index 05df2e0a99f..2618d8138f9 100644 --- a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp index 243cceedc94..f812071440d 100644 --- a/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp +++ b/src/coreComponents/mesh/generators/VTKFaceBlockUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.cpp b/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.cpp index cd7c1ce27ba..cd0e3d83729 100644 --- a/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.cpp +++ b/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.hpp b/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.hpp index bf737d4913b..adb9a69d830 100644 --- a/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.hpp +++ b/src/coreComponents/mesh/generators/VTKHierarchicalDataSource.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp index 7ed1c0ae2df..2b9d94ca063 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp index cad9378dde4..20747c848c2 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp index 6261c76a150..a6d00f561ef 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp index 9bd1a89118f..68740cefc92 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp +++ b/src/coreComponents/mesh/generators/VTKMeshGeneratorTools.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKUtilities.cpp b/src/coreComponents/mesh/generators/VTKUtilities.cpp index 72045afa4e5..a18b3e6767a 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.cpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKUtilities.hpp b/src/coreComponents/mesh/generators/VTKUtilities.hpp index 6ebf4e6e89d..0a2f5f3903a 100644 --- a/src/coreComponents/mesh/generators/VTKUtilities.hpp +++ b/src/coreComponents/mesh/generators/VTKUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKWellGenerator.cpp b/src/coreComponents/mesh/generators/VTKWellGenerator.cpp index 173412ca23b..b52409d3f68 100644 --- a/src/coreComponents/mesh/generators/VTKWellGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKWellGenerator.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/VTKWellGenerator.hpp b/src/coreComponents/mesh/generators/VTKWellGenerator.hpp index df4e92b3c87..3454044beba 100644 --- a/src/coreComponents/mesh/generators/VTKWellGenerator.hpp +++ b/src/coreComponents/mesh/generators/VTKWellGenerator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index 5e8efb4bc61..56e71955446 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp index ca29973ae36..fbe05157d6f 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.hpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/CommID.cpp b/src/coreComponents/mesh/mpiCommunications/CommID.cpp index 5a93eaee64e..da6d47a48cb 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommID.cpp +++ b/src/coreComponents/mesh/mpiCommunications/CommID.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/CommID.hpp b/src/coreComponents/mesh/mpiCommunications/CommID.hpp index 2f8997c1ba4..259fc340985 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommID.hpp +++ b/src/coreComponents/mesh/mpiCommunications/CommID.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp index d5d0b781ebf..0abb2fc2f53 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp +++ b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp index 486565e9e73..d29b0345b68 100644 --- a/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp +++ b/src/coreComponents/mesh/mpiCommunications/CommunicationTools.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp index 91160261987..59be5f37fc6 100644 --- a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp +++ b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp index 24f5e8cdbad..8d001ad4114 100644 --- a/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp +++ b/src/coreComponents/mesh/mpiCommunications/MPI_iCommData.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp index adad740b210..fd8cfbf366d 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp index f5d52efd988..06f07fddb82 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp b/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp index c35eb3cc615..236528cec9e 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborData.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp b/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp index fdd1db1cfec..a1175c74b62 100644 --- a/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp +++ b/src/coreComponents/mesh/mpiCommunications/PartitionBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp b/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp index 09605d6e0c2..b4b5bc402bc 100644 --- a/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp +++ b/src/coreComponents/mesh/mpiCommunications/PartitionBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp index dda0542444e..26f6f4c90a0 100644 --- a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp +++ b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp index 0328b4611a3..00825c9b6e7 100644 --- a/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp +++ b/src/coreComponents/mesh/mpiCommunications/SpatialPartition.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp index 852aa3b3e79..c8ff70834c9 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Box.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp index fd0262a22cc..feacb96c193 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Box.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp index c5e06695806..5bcab75fcde 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp index 0edc644df7d..1a320d3162c 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/CustomPolarObject.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp index bc848f317b3..da38cb43438 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp index b3b880e851f..2185c4d315c 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Cylinder.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp index 31e0bfd5e50..f88f139f73c 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Disc.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp index 8a0cd4ebe75..38b3c7c4d17 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Disc.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp index a6824ff7fa8..bb964e0c6dd 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp index 499dddddcba..7aef070b24f 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp index 470040f682e..f8539b88504 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp index 47483f4f233..b7ed93439f1 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/PlanarGeometricObject.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp index fa8639eb5d0..e8817e10dca 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp index 4e23c3b06c8..03dd2f8ba8a 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/Rectangle.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp index 932bdf78758..8b823b233b7 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp index dc7ddf71925..9b9338d6dc3 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/SimpleGeometricObjectBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp index 919881583d3..d69092b79cc 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp index 9d46881108b..ce4fa5fb65f 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/ThickPlane.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp b/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp index 21b68839d4a..403d5f25483 100644 --- a/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp +++ b/src/coreComponents/mesh/unitTests/testComputationalGeometry.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp b/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp index 32c2181f58a..e767a9f46ff 100644 --- a/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp +++ b/src/coreComponents/mesh/unitTests/testGeometricObjects.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp b/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp index 1b222308603..e1f82992bd4 100644 --- a/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp +++ b/src/coreComponents/mesh/unitTests/testMeshObjectPath.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp b/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp index 6f2d4840b41..254bc81fcce 100644 --- a/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp +++ b/src/coreComponents/mesh/utilities/AverageOverQuadraturePointsKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp b/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp index d76f0ec131d..d9abae9ed31 100644 --- a/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp +++ b/src/coreComponents/mesh/utilities/CIcomputationKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp b/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp index 91bbeb087eb..c920605de80 100644 --- a/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp +++ b/src/coreComponents/mesh/utilities/ComputationalGeometry.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp index 23e3fe65887..d9c054d3401 100644 --- a/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp +++ b/src/coreComponents/mesh/utilities/ComputationalGeometry.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp b/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp index 8eadb77b594..a3508a6e55b 100644 --- a/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp +++ b/src/coreComponents/mesh/utilities/MeshMapUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp b/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp index 305696161c6..41c62f6a860 100644 --- a/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp +++ b/src/coreComponents/mesh/utilities/StructuredGridUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/CMakeLists.txt b/src/coreComponents/physicsSolvers/CMakeLists.txt index 64487629fd3..37c1da41495 100644 --- a/src/coreComponents/physicsSolvers/CMakeLists.txt +++ b/src/coreComponents/physicsSolvers/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp index 512edb7af7e..c2516decb26 100644 --- a/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp +++ b/src/coreComponents/physicsSolvers/FieldStatisticsBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/KernelLaunchSelectors.hpp b/src/coreComponents/physicsSolvers/KernelLaunchSelectors.hpp index 6a07386bd79..99dd27435c1 100644 --- a/src/coreComponents/physicsSolvers/KernelLaunchSelectors.hpp +++ b/src/coreComponents/physicsSolvers/KernelLaunchSelectors.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp index 3bc0888dae6..a5f5b402760 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp index 2d6636b8f77..4b1699a1615 100644 --- a/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/LinearSolverParameters.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/LogLevelsInfo.hpp index a6c75d3e1c6..85f17120411 100644 --- a/src/coreComponents/physicsSolvers/LogLevelsInfo.hpp +++ b/src/coreComponents/physicsSolvers/LogLevelsInfo.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp index c8438212f63..86563d4be24 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp index a084b693774..a1efed70d84 100644 --- a/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp +++ b/src/coreComponents/physicsSolvers/NonlinearSolverParameters.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp index 13066188e5c..14ec3cbfd45 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBase.hpp b/src/coreComponents/physicsSolvers/PhysicsSolverBase.hpp index c6b8866343a..92b004f8624 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverBaseKernels.hpp b/src/coreComponents/physicsSolvers/PhysicsSolverBaseKernels.hpp index e085177bae8..ac8433b208b 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverBaseKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp index 5c199154f30..0bf40f860d9 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp b/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp index 6c4e66c3127..3399cf5c631 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverManager.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/SolverStatistics.cpp b/src/coreComponents/physicsSolvers/SolverStatistics.cpp index cf3eaf44f14..9928a95bec7 100644 --- a/src/coreComponents/physicsSolvers/SolverStatistics.cpp +++ b/src/coreComponents/physicsSolvers/SolverStatistics.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/SolverStatistics.hpp b/src/coreComponents/physicsSolvers/SolverStatistics.hpp index ce8293dbcc0..7bb1abc0f44 100644 --- a/src/coreComponents/physicsSolvers/SolverStatistics.hpp +++ b/src/coreComponents/physicsSolvers/SolverStatistics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp index 3a5005774e9..df37934c0cd 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactFields.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp index 4b6aaef3599..6fecd60e93c 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp index 829c4761ef1..646d6b17277 100644 --- a/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/ContactSolverBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/contact/LogLevelsInfo.hpp index f58f9494b0d..09228674f74 100644 --- a/src/coreComponents/physicsSolvers/contact/LogLevelsInfo.hpp +++ b/src/coreComponents/physicsSolvers/contact/LogLevelsInfo.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp index 852370c6371..c940cb45289 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp index c9f517d7403..0ed5d059b8a 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsAugmentedLagrangianContact.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index 5c1ff768efc..15cc190fed1 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index 64aed9bd227..6e146d34863 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index bcde95cdb7a..7ca9cd24c29 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index bfb2b7656b0..b77fac6ef27 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp index 086139a90f3..2d1f139362b 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.hpp index b1256f47d1f..8daefd588fc 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContactBubbleStab.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp index c1c3ec434d7..04d82d10cb6 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp index 231d0b9159d..3b1c0da697c 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsPenaltyContact.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernels.hpp index 4f50212c5be..b93406cf877 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernelsBase.hpp index 18e5c3b1a4d..b3f96f9f182 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMKernelsBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMSimultaneousKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMSimultaneousKernels.hpp index 4a39f3580ee..2769a101963 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMSimultaneousKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsALMSimultaneousKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 Total, S.A - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp index 495e4fa677b..dc5de425b0d 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsHelper.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsHelper.hpp index fc8fb5f6f72..ac79e062648 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsConformingContactKernelsHelper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsContactFaceBubbleKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsContactFaceBubbleKernels.hpp index 0d622571def..46e8034c581 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsContactFaceBubbleKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsContactFaceBubbleKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsDisplacementJumpUpdateKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsDisplacementJumpUpdateKernels.hpp index ba0bc23272a..c06b00ff819 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsDisplacementJumpUpdateKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsDisplacementJumpUpdateKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMJumpUpdateKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMJumpUpdateKernels.hpp index cca58c08ddd..eab65325840 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMJumpUpdateKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMJumpUpdateKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernels.hpp index ff06f6137c1..6cf1f59ceeb 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsBase.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsBase.hpp index dd3d95d49b9..4a0ad46b4e9 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsBase.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsHelper.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsHelper.hpp index dc5232d75ee..07bd6ffb810 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMKernelsHelper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMStaticCondensationKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMStaticCondensationKernels.hpp index 980d6d61892..c6efed43093 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMStaticCondensationKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsEFEMStaticCondensationKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsLagrangeContactKernels.hpp b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsLagrangeContactKernels.hpp index 90fdec8ec4f..b5ab97955b6 100644 --- a/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsLagrangeContactKernels.hpp +++ b/src/coreComponents/physicsSolvers/contact/kernels/SolidMechanicsLagrangeContactKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp index 9eb10dbab90..66c79677033 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp index 1e657613848..1cec9ca685b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp index eb00898d8df..68faa9d681b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseBaseFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp index 8eec4acbef0..9a64efef23d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp index 48efd363a96..f14b2436740 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp index d6a0c9568d6..021ce8fd96b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp index 45bea1e810e..d133610a7b1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp index 4e9337b4368..254c2a72a17 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp index ad81a74f521..bee1a2468a4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseStatistics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp index ea13aa7ec05..3af76d4928d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/CompositionalMultiphaseUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp index 8cd3ff1b942..c081f20d4ce 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp index 23897ccb899..4352e059405 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp index d9f01e908b9..ddb20e7bf5c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/fluidFlow/LogLevelsInfo.hpp index cd9f3eb5322..c42ac620388 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/LogLevelsInfo.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/LogLevelsInfo.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp index 3d8143e0d83..07c38cd2726 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp index 5f615600d9f..b510d9daf42 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBL.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp index 84d9f0e5f54..d83c199f8be 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/ReactiveCompositionalMultiphaseOBLFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp index 812c342de0a..98934988d8d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp index 9e40ecda15f..db72beaa75a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp index 8b3f80b95c9..b68848e634f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseBaseFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp index 760394bb02b..cc9cdc6aaf6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp index b93ce7e6b33..49926bcf5a1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp index 233eb1d1363..e0b9732cec2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp index a1ae07fb5b5..7a804ccf7ee 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp index 0a5ccd5d41e..d5273602f58 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp index ab07e60f9aa..f8d2e5c9a0b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseProppantBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp index fca8f4cfc99..26ed404707d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp index 99d5c57f9d3..b7f279c239c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SinglePhaseStatistics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp index 9667e4270f7..6c8a1e36cb3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.hpp b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.hpp index 2be2995f0aa..43dad5d1c3a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/SourceFluxStatistics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp index 59f0215a0d4..7b27c5f1788 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StencilAccessors.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp index dcd795ec3ed..4b0adc25b20 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.hpp b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.hpp index c7685f8706c..b1453803f05 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/StencilDataCollection.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp index c3eb3805be3..6e4c9d69e23 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/HybridFVMHelperKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/MinPoreVolumeMaxPorosityKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/MinPoreVolumeMaxPorosityKernel.hpp index 6d930e5d592..9add06e9a23 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/MinPoreVolumeMaxPorosityKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/MinPoreVolumeMaxPorosityKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/StencilWeightsUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/StencilWeightsUpdateKernel.hpp index d61b9d379dd..d8fd200dcb1 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/StencilWeightsUpdateKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/StencilWeightsUpdateKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp index f749853ad6f..c88ec507449 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AccumulationKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.cpp index 36ea1aa3226..9d107531c46 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.hpp index b1729589b30..fd97385586e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/AquiferBCKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp index 07e5d54df99..6b31d7b9165 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.cpp index e2f32348bcc..0b34792763f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp index a2242e202fb..a13c9170bc6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CFLKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CapillaryPressureUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CapillaryPressureUpdateKernel.hpp index 7842c859189..2d182b515cc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CapillaryPressureUpdateKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CapillaryPressureUpdateKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.cpp index 4e698041b4c..e5ac3d7e7b8 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp index ea1f4ec0d12..dac73b0a0aa 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/CompositionalMultiphaseHybridFVMKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp index e8ea185c993..f4293d5f83d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DiffusionDispersionFluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp index 420d8538f1b..a4b00cf8180 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DirichletFluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp index 62df1c74088..3d09e878fbf 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/DissipationFluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluidUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluidUpdateKernel.hpp index 9389da529de..f8483ce94c7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluidUpdateKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluidUpdateKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp index acd5c371d7f..83af007a79f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.cpp index f3f33c92d69..a5a01550c52 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp index 340d5c7f5f8..ff96044c991 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/FluxComputeKernelBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp index e8d53a625ba..c5317e3a659 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/HydrostaticPressureKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/HydrostaticPressureKernel.hpp index 65b6bde6360..a3495e46a94 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/HydrostaticPressureKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/HydrostaticPressureKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp index bce2f8cd261..98ee6989a18 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp index 0e7b2b84dc3..3e7370f1c6f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp index 58ba51a9f94..483e8c4c2ba 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp index 812cc19eb3d..3d7f1cba38b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp index 1886cdbe4f5..7eb1f79ab2f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp index 875bfe07c8e..a693ba124e9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PhaseVolumeFractionKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp index 138175d5c89..2b4522343e3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp index 4390ad8a34b..ff312c40151 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/PropertyKernelBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp index 362fc17a562..c07fb716b9f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ReactiveCompositionalMultiphaseOBLKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/RelativePermeabilityUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/RelativePermeabilityUpdateKernel.hpp index 7706d28b679..05da6a151f4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/RelativePermeabilityUpdateKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/RelativePermeabilityUpdateKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp index b5d4d8c0ae0..3b41be7145b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ResidualNormKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolidInternalEnergyUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolidInternalEnergyUpdateKernel.hpp index 67a37d81282..5c534fcc154 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolidInternalEnergyUpdateKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolidInternalEnergyUpdateKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp index 63b5975dd7a..5cbf59b932d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionCheckKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp index ff03cf15f71..14abec8e0b7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingAndCheckingKernelBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp index 7cdbd3456cb..316859e9de7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/SolutionScalingKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp index 71801e9ee59..eb679f2942c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StabilizedFluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StatisticsKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StatisticsKernel.hpp index ae7c91fcc6e..af2cec319f2 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StatisticsKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/StatisticsKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp index 1dcaf7acbe4..58d6aa12cf4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalAccumulationKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDiffusionDispersionFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDiffusionDispersionFluxComputeKernel.hpp index 9dd607a5d0c..957d98bee43 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDiffusionDispersionFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDiffusionDispersionFluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDirichletFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDirichletFluxComputeKernel.hpp index edd4df9f192..5df89fc5e3e 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDirichletFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalDirichletFluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp index 8d7190cc70b..519b1a538bb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalFluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp index f6be6b2cf55..796e59bee30 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseMobilityKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseVolumeFractionKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseVolumeFractionKernel.hpp index 375fecd1cea..3c4ed036b3b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseVolumeFractionKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalPhaseVolumeFractionKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalResidualNormKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalResidualNormKernel.hpp index 7dbb7bab2f9..6b60c11b66f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalResidualNormKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalResidualNormKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionCheckKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionCheckKernel.hpp index 57007c9f673..35c969bb891 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionCheckKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionCheckKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp index 00af7a5eca4..1a4a2b4c782 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/compositional/ThermalSolutionScalingKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp index d7bcb6068f1..c2e2845ff74 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AccumulationKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AquiferBCKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AquiferBCKernel.hpp index 733a7013ac2..c35ec2cfbc7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AquiferBCKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/AquiferBCKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/DirichletFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/DirichletFluxComputeKernel.hpp index e2a33419262..e5c45309b0d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/DirichletFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/DirichletFluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluidUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluidUpdateKernel.hpp index 9ee7550c9b7..dbf86d97295 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluidUpdateKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluidUpdateKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp index 8083ad10746..05034149bb7 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernelBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernelBase.hpp index 5a3896fdd79..15c528a8f60 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernelBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxComputeKernelBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp index 07f81dfd2f0..814eb7e6234 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/FluxKernelsHelper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/HydrostaticPressureKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/HydrostaticPressureKernel.hpp index fe08f309833..6a4e5bab264 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/HydrostaticPressureKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/HydrostaticPressureKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp index 22f6470f5f3..6f55e13e545 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/MobilityKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp index f88ef04eb96..9360af72ea9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ResidualNormKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp index 124e454d90f..2898e11a3a3 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SinglePhaseHybridFVMKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolidInternalEnergyUpdateKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolidInternalEnergyUpdateKernel.hpp index 4ed3658e569..f1b0942ea16 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolidInternalEnergyUpdateKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolidInternalEnergyUpdateKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp index 29a22e422f7..24529dda836 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionCheckKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionScalingKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionScalingKernel.hpp index 5994d972e3b..fe0572da818 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionScalingKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/SolutionScalingKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StabilizedFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StabilizedFluxComputeKernel.hpp index 88d4cc4ce73..02bc73de112 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StabilizedFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StabilizedFluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StatisticsKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StatisticsKernel.hpp index 59e0d267dc8..c99e4c17971 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StatisticsKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/StatisticsKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp index 792558b5b2e..2cba35dac4f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalAccumulationKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalDirichletFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalDirichletFluxComputeKernel.hpp index 8e6bc1ba8fe..5ab2f2959b0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalDirichletFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalDirichletFluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalFluxComputeKernel.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalFluxComputeKernel.hpp index cba7c440e09..4dd02b5d35f 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalFluxComputeKernel.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/ThermalFluxComputeKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantBaseKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantBaseKernels.hpp index 9e36375b45c..f18d8befbf9 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantBaseKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantBaseKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.cpp index 22dec62d10f..9843c0fc5ab 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.hpp index 69b50bb2f82..19b318c7316 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/kernels/singlePhase/proppant/ProppantFluxKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp index 2d5b26f4f3d..798286fc9e0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp index 269926e83d2..3332d1e6a41 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransport.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp index 7c324a399a8..b96b212fe71 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp index c0c1b3b02ed..c74004bafb4 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp index 89fcbef5c9c..f857e3f6bba 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/proppantTransport/ProppantTransportKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp index dbd4637d01b..1f13044d87d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp index a09420b5e81..aa70d4f4507 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWell.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp index be0aa3e48ae..3ca423cd7ac 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/CompositionalMultiphaseWellFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp index 9e9b9f20b50..43120e4b77b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/LogLevelsInfo.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp index 4671f593665..75797a3490c 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp index df677346ab6..a27be685524 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWell.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp index 3d733dde731..773a7e3be60 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp index 9b24c9f61df..58b8b421c3a 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellConstants.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp index 30ed4a17f09..7ce65b6cbec 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp index fefa7e4435b..3335b7d98dc 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellControls.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellFields.hpp index 2c6549958b0..e24c0d3293d 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellFields.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp index a8e271ea2e9..e7496035ec6 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp index b8a007d203c..a02af416759 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp index 1c6f4d4a748..b9dfebc799b 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellSolverBaseFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellTags.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellTags.hpp index dc75bcbdc9a..b96fa2d0618 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/WellTags.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/WellTags.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp index 7b592d049d5..42ec6911080 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp index 1995119e9f4..41d63148bfb 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/CompositionalMultiphaseWellKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/PerforationFluxKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/PerforationFluxKernels.hpp index 6c042f18d34..fff9e893cf0 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/PerforationFluxKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/PerforationFluxKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp index a2446c60b6a..e3dae7a4616 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp index 91590ed1d6b..8269b9f3cce 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp index 3c3b9a2b9d6..e7beb347528 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalCompositionalMultiphaseWellKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalSinglePhaseWellKernels.hpp b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalSinglePhaseWellKernels.hpp index cbd0ae0b423..74a8c1f7414 100644 --- a/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalSinglePhaseWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/fluidFlow/wells/kernels/ThermalSinglePhaseWellKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp index d00e64357e0..3ddf5fc1494 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp index 97b202ee7e6..6d85175d3c7 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQ.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp index 2c7e663567f..8409180dfba 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp index 722edd7e8c5..67cce07e74f 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/SeismicityRate.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp index 370951e101a..ac9af24c68b 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/inducedSeismicityFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp index 87d05f3b443..d91dff75ef6 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/RateAndStateKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 TotalEnergies * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University * Copyright (c) 2018-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/SeismicityRateKernels.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/SeismicityRateKernels.hpp index 8bbb0f5865f..63ca4bdee7a 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/SeismicityRateKernels.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/kernels/SeismicityRateKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp index df5e63a2d19..e060dceb28a 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/rateAndStateFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * Copyright (c) 2018-2024 TotalEnergies * Copyright (c) 2018-2024 The Board of Trustees of the Leland Stanford Junior University * Copyright (c) 2018-2024 Chevron * Copyright (c) 2019- GEOS/GEOSX Contributors diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index 560569a8b63..b2c668bb182 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index 7b3a25a82a5..65a2e813be8 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp index 6aba3bc91f3..5fdb80fdf62 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellKernels.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp index e981e5048c2..631a5ee6cd3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index 264525673e3..a34cf788470 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp index c83c224b86a..8517edb3dfe 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp index 933c8afa977..fe329e26569 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp index 270c13b179f..9b14cea8309 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/FlowProppantTransportSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index fc1e3798cd4..3a526d7ccbd 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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/GEOS Contributors diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index 8ea2ddc1d8b..d08f7d89e4e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp index 41f959bf396..86630e16ead 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolverKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/multiphysics/LogLevelsInfo.hpp index fb9322e1021..e87c0615e53 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/LogLevelsInfo.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/LogLevelsInfo.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index c477f2b83d3..29b47efd161 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index 9251d86dac1..55dbd180534 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp index 447cdc1f1b1..c9fe35f6145 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp index b9625e1f41d..a1aae598694 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PhaseFieldFractureSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp index 1d38ccf74e4..d3dec017bc4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp index 295eaa33321..02fa02be59b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp index aa13564261b..60e8535a2b7 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsInitialization.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index 7053aec0d07..fb5d63043c2 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 8026c45a80a..3d04a90004b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index f311b786c38..35d11acb118 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index bf257cda107..50e56820a10 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp index 7d0b4f121ea..3d109b4e0b3 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 0e1c3dd7198..9c1dab6f9ab 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp index a6d72b4f728..497ebdffe64 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index 0ccdd95f91a..06361544a3f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 9e4cc906a9f..0ded9b7bd36 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp index b3079a9e8c5..ae031f13988 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp index d12925a3daf..b5f2621b165 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp index 75c78e1c1aa..4bd3c9f44aa 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template index 09802963fca..debff643f00 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsEFEMKernels.cpp.template @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template index f2c44120f13..19f7ad4cb18 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/PoromechanicsKernels.cpp.template @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp index 711adb82808..302c8113b3d 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp index d2a2b413126..e32a6d26eb7 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsConformingFractures.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp index e88ce14509f..ac266ec21d6 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp index 9229f1ff774..efc8ae09ea8 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEFEM_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp index 2cb1dec4ecc..d9e69daf444 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp index b2073b58f95..34b875a8cd1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanicsFractures.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp index bb79e9e66b4..2f020977794 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/SinglePhasePoromechanics_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp index faea5ade235..110376c9d95 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp index 5fd1de083e4..98e5a37075f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp index 378285326bd..a84c66dbaec 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp index c9eb1dcafaf..e8589fa70ed 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsConformingFractures.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp index b90d9006683..f996e34f0ec 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp index b838e72f7b2..c5380934118 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEFEM_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp index 03690cbf27d..ec7184db1f5 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanicsEmbeddedFractures.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp index 3f20f8f7618..786ad448381 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermalSinglePhasePoromechanics_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template index ff083ddc02a..8523ae35545 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/multiphysics/poromechanicsKernels/ThermoPoromechanicsKernels.cpp.template @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/python/PySolver.cpp b/src/coreComponents/physicsSolvers/python/PySolver.cpp index 0d84b780736..befc482dc15 100644 --- a/src/coreComponents/physicsSolvers/python/PySolver.cpp +++ b/src/coreComponents/physicsSolvers/python/PySolver.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/python/PySolver.hpp b/src/coreComponents/physicsSolvers/python/PySolver.hpp index 2c15ace10e5..968f7a6dffe 100644 --- a/src/coreComponents/physicsSolvers/python/PySolver.hpp +++ b/src/coreComponents/physicsSolvers/python/PySolver.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/python/PySolverType.hpp b/src/coreComponents/physicsSolvers/python/PySolverType.hpp index 0d975291ea2..aa59dd45f70 100644 --- a/src/coreComponents/physicsSolvers/python/PySolverType.hpp +++ b/src/coreComponents/physicsSolvers/python/PySolverType.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp index e1f2411f56a..f873ad46826 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp index 70a3165b0f1..88bcf008b26 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceBaseH1.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp index 4cc4abfd4bf..2feaab25a0b 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp index 6e0d8422cd8..802d6cb1bca 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp index 23b5e2cae9c..6d992ba0134 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/LaplaceFEMKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp index 8ac607f7c67..72d275cd39e 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp index ce1de6db454..afd53e8aa5c 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp index 177373a5176..80296a11b44 100644 --- a/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/simplePDE/PhaseFieldDamageFEMKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/solidMechanics/LogLevelsInfo.hpp index c70c238f6a9..27e59cf4709 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/LogLevelsInfo.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/LogLevelsInfo.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp b/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp index 024caaa22ba..2f77032716b 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/MPMSolverFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp index d12b9b4e243..68117918b7f 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 79230a70970..434e4fde4a8 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp index 6d331793e7b..76d98cb5143 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp index de86e0c4ab8..cf1e138d21b 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp index 3a316fa2ace..77c3c338f36 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianSSLE.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp index c59481ecbfe..a2b1d3ec2ff 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp index b528b6d9e7f..571e365f14a 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsMPM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp index 6c35edca982..764d86d8f38 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp index 73d3772be1a..4a9c5219038 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStateReset.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp index 01b0073205f..5e266c0258c 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp index 64ec6a97721..975c057b075 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsStatistics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp index e232b156156..6384ac17292 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp index 30f42a86fb5..8454837b438 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitFiniteStrain_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp index d610b0331f4..403619a20a2 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitMPM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp index f2dbcb00e2f..b4518ca4cbd 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp index 6f12850a63d..30910aac4b0 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ExplicitSmallStrain_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp index ed39ff7e78f..4b67faf912a 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp index 72700e67ebc..36d70558513 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/FixedStressThermoPoromechanics_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp index c0866309721..5b97f0022da 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp index 3f4b3a7e17a..d0e2c71ea0a 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainNewmark_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp index 304183a9192..0e9bcf87b18 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp index dc3508c1ab9..12753ab393f 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic_impl.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template index eb4d851b027..69211cfeb85 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsFixedStressThermoPoromechanicsKernels.cpp.template @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template index d6014e31c30..cd5829c9b16 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsKernels.cpp.template @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp index fac98f550b5..2ccdfd7a87d 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/SolidMechanicsLagrangianFEMKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp b/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp index d77b1cb1e26..d1c5567eff4 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/StrainHelper.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in b/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in index 2cbf4ce9a1c..c14654cf0c7 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in +++ b/src/coreComponents/physicsSolvers/solidMechanics/kernels/policies.hpp.in @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp index a0ce1d96de9..da4e2856368 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp index 043530d94ad..5f9219a4ea0 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfaceGenerator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp index 3e41eb295fb..26d1c5fe380 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp index 02714f610e8..eb92f4dc8b5 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/EmbeddedSurfacesParallelSynchronization.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp index a3be90fff02..564e5fd95a5 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/LogLevelsInfo.hpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp index 1c7a39796fb..5f10b92116e 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp index 5d7f42debf3..249cb5c434a 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChange.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChangeNoFixup.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChangeNoFixup.cpp index 174f4f701ad..44f42069418 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChangeNoFixup.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/ParallelTopologyChangeNoFixup.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp index add1dc1f8e7..2e16f5bfeea 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp index 1064fe5f6b0..4e435f9b566 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGenerator.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp index 2217165e789..921cb0e7e45 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/SurfaceGeneratorFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp index beeea1533c5..3a3198c9e0c 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernels.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp index 926e6bde6b3..1e1a596bb68 100644 --- a/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp +++ b/src/coreComponents/physicsSolvers/surfaceGeneration/kernels/surfaceGenerationKernelsHelpers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp index e6be717bb30..506c95a3d5d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp index 18daccacb08..173600e1b90 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp index ccc359a55ee..92f36773282 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/firstOrderEqn/isotropic/AcousticFirstOrderWaveEquationSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp index 1069ee8ae31..a53cf0c52ac 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp index 1257b0ef41a..28b2497012d 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp index df6d248581f..dcfe6da4d14 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp index 3c388de273a..c0b6e66e190 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/anisotropic/AcousticVTIWaveEquationSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp index 6cb55e191a3..8f1b96077ba 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticPMLSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp index a3c8a6cc967..c47e6e83fc1 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp index a51bb5a1f31..5f3f1c70885 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp index f582a027f97..1e993b9aa4e 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/secondOrderEqn/isotropic/AcousticWaveEquationSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp index de61245599c..5222bc115a3 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp index 9d3d14fa31c..279c6c1e834 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticMatricesSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp index 20b838f6d62..69b78be7a78 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustic/shared/AcousticTimeSchemeSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp index f833c9dc8c5..ce244edf2ec 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp index bfbb8edf88b..72bdd0473ea 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp index 7352b5fc42b..bef479eb855 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcousticElasticWaveEquationSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp index 89341e561a1..977e8ab7898 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp index c806342cfd6..b8064cbbbf7 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/acoustoelastic/secondOrderEqn/isotropic/AcoustoElasticTimeSchemeSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp index da2b95f5f38..5569e40dcdf 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp index a687653c332..4cdf886919a 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp index 2ff51cb6488..5525d6cbb44 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/firstOrderEqn/isotropic/ElasticFirstOrderWaveEquationSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp index 7e17769a02c..e2380615eb4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp index 02f2c3618c4..181c41884da 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/anisotropic/ElasticVTIWaveEquationSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp index 361f927d5d5..acf9572b216 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp index 15d2d0429ec..8907f35cd76 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEM.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp index c9d78fe64c6..c7c9b44a1a4 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/secondOrderEqn/isotropic/ElasticWaveEquationSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp index 5b98c51e0be..c9d2e62b43b 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticFields.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp index f699039e9c9..40b8947ead5 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticMatricesSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp index 55f7dcc163d..9b36fea0443 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/sem/elastic/shared/ElasticTimeSchemeSEMKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp index 761569c7fe0..6fd876ff6ef 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/PrecomputeSourcesAndReceiversKernel.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp index f1ac14c24ea..b55ca1f38d7 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp index dec7284f70d..2c319ca4f38 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverBase.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp index 17287299fe3..530f7e3b8e0 100644 --- a/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp +++ b/src/coreComponents/physicsSolvers/wavePropagation/shared/WaveSolverUtils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/schema/CMakeLists.txt b/src/coreComponents/schema/CMakeLists.txt index 344f72e6234..2a331ee9d69 100644 --- a/src/coreComponents/schema/CMakeLists.txt +++ b/src/coreComponents/schema/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/schema/schemaUtilities.cpp b/src/coreComponents/schema/schemaUtilities.cpp index e9d69702d33..d39b1af77f3 100644 --- a/src/coreComponents/schema/schemaUtilities.cpp +++ b/src/coreComponents/schema/schemaUtilities.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/schema/schemaUtilities.hpp b/src/coreComponents/schema/schemaUtilities.hpp index 3152eeec60d..aa9ae40e9b5 100644 --- a/src/coreComponents/schema/schemaUtilities.hpp +++ b/src/coreComponents/schema/schemaUtilities.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/CMakeLists.txt b/src/coreComponents/unitTests/CMakeLists.txt index e270b21da1c..8b760067a42 100644 --- a/src/coreComponents/unitTests/CMakeLists.txt +++ b/src/coreComponents/unitTests/CMakeLists.txt @@ -1,7 +1,7 @@ # SPDX-License-Identifier: LGPL-2.1-only # # Copyright (c) 2016-2024 Lawrence Livermore National Security LLC -# Copyright (c) 2018-2024 Total, S.A +# 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp index cb3902d198d..5aa748e071b 100644 --- a/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp +++ b/src/coreComponents/unitTests/constitutiveTests/MultiFluidTest.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp b/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp index 14a9032a1ca..5762461edff 100644 --- a/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp +++ b/src/coreComponents/unitTests/constitutiveTests/constitutiveTestHelpers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp b/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp index 20df8c70fe5..a686c917319 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCO2BrinePVTModels.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp b/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp index a8160dc51f9..24214ecc6fa 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCO2SpycherPruessModels.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp b/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp index 5c13f68c5cf..9d8d5ac3941 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testCapillaryPressure.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp b/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp index 29e6f6992f1..28f85106fc5 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testDamage.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp index 80f88fb53f4..a55618c19d2 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCO2Brine.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphase.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphase.cpp index 3aa633cd190..ffd9658a0b6 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphase.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphase.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp index 367c8bbd724..150da341455 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidCompositionalMultiphasePVTPackage.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp index 9b4b515ac7d..58aefab3ed3 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidDeadOil.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp index 659fd8b3d18..37ac3043753 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testMultiFluidLiveOil.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp b/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp index 7c2208cdce9..205153ceda8 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testPVT.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp b/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp index 18bac11d647..8ad1df7c3b5 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testReactiveFluid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp b/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp index d2526d367c2..b8aeeb671f1 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testRelPerm.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp b/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp index 292957072bf..f6476d1d978 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testRelPermHysteresis.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp b/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp index e208b9720aa..9dd8301388c 100644 --- a/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp +++ b/src/coreComponents/unitTests/constitutiveTests/testTriaxial.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp index 032d6a191ab..00e05ab421a 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testGroupPath.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp index e511c09a0e0..586e4fb3bc3 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testObjectCatalog.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp index e77aae20bff..e7e061384cb 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testRestartBasic.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp index 48d30aa4750..7acc2d9b07f 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testRestartExtended.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp b/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp index 2d06ad0fcca..b93b4615e8c 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/testWrapperHelpers.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp b/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp index 79b749fa981..9757182f66d 100644 --- a/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp +++ b/src/coreComponents/unitTests/dataRepositoryTests/utils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp index e894ca9b92a..9d20070af07 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testAquiferBoundaryCondition.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp index 0a4cd2d67de..0f800b4e8aa 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testFieldSpecificationsEnums.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp b/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp index 12288b381e0..0e948a64332 100644 --- a/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp +++ b/src/coreComponents/unitTests/fieldSpecificationTests/testRecursiveFieldApplication.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp b/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp index dc759b01c77..ea44608f06a 100644 --- a/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp +++ b/src/coreComponents/unitTests/fileIOTests/testHDFFile.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp b/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp index 1a8e7ca4609..a447019d854 100644 --- a/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp +++ b/src/coreComponents/unitTests/fileIOTests/testHDFParallelFile.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp b/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp index df8f7af001c..b00f24fc4e3 100644 --- a/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp +++ b/src/coreComponents/unitTests/finiteVolumeTests/testMimeticInnerProducts.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp index 791e5fe8607..d9790a2aa7b 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompFlowUtils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp index 31f816164e1..0bb997307cc 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlow.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp index 298427c367f..e4e10ede8da 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testCompMultiphaseFlowHybrid.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp index cecdd689fe6..c1c1fcaf6e1 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowKernelHelpers.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp index 4ac4c12786f..9258009135d 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowStatistics.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp index 7e04abc48c2..d1408c90c44 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testFlowUtils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp b/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp index a50242801f2..cc46cda8af9 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testReactiveCompositionalMultiphaseOBL.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp index d42ca9877ce..1b139d11917 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSingleFlowUtils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp index 31ec3c9951a..6e9302a4ad3 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseFVMKernels.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseMobilityKernel.cpp b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseMobilityKernel.cpp index b48cb9d4cf8..6b10d8a3d31 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseMobilityKernel.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testSinglePhaseMobilityKernel.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp index 1eb5ce7c95a..90a8e454cd2 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testThermalCompMultiphaseFlow.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp b/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp index f0eea49be3a..b98ae8bbcef 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testThermalSinglePhaseFlow.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/fluidFlowTests/testTransmissibility.cpp b/src/coreComponents/unitTests/fluidFlowTests/testTransmissibility.cpp index b35b824f62b..ddc0d074630 100644 --- a/src/coreComponents/unitTests/fluidFlowTests/testTransmissibility.cpp +++ b/src/coreComponents/unitTests/fluidFlowTests/testTransmissibility.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp b/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp index 306653cc7fd..d707e9a06e9 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testDofManager.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp b/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp index 6f4cb6d5026..4c6c41ad02e 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testDofManagerUtils.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp b/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp index a6ba2385b95..dc63258877f 100644 --- a/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp +++ b/src/coreComponents/unitTests/linearAlgebraTests/testLAIHelperFunctions.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in b/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in index c244f79e62c..68b452a2726 100644 --- a/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in +++ b/src/coreComponents/unitTests/meshTests/meshDirName.hpp.in @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/meshTests/testElementRegions.cpp b/src/coreComponents/unitTests/meshTests/testElementRegions.cpp index 3202f0b71fb..571fe59973c 100644 --- a/src/coreComponents/unitTests/meshTests/testElementRegions.cpp +++ b/src/coreComponents/unitTests/meshTests/testElementRegions.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp b/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp index 3dad8b16738..b014e193437 100644 --- a/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp +++ b/src/coreComponents/unitTests/meshTests/testMeshEnums.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp index cb0bc13651b..2655a93c491 100644 --- a/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp +++ b/src/coreComponents/unitTests/meshTests/testMeshGeneration.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp b/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp index 31fa9918fe7..cc7200e9229 100644 --- a/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp +++ b/src/coreComponents/unitTests/meshTests/testNeighborCommunicator.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/meshTests/testVTKImport.cpp b/src/coreComponents/unitTests/meshTests/testVTKImport.cpp index 38dbd02ced9..5ca9043b0c3 100644 --- a/src/coreComponents/unitTests/meshTests/testVTKImport.cpp +++ b/src/coreComponents/unitTests/meshTests/testVTKImport.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp b/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp index 1a0cdda6e2f..0a1e4644f97 100644 --- a/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp +++ b/src/coreComponents/unitTests/testingUtilities/TestingTasks.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp b/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp index 0080b79c749..fb4dfa359f8 100644 --- a/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp +++ b/src/coreComponents/unitTests/testingUtilities/TestingTasks.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/toolchain/testToolchain.cpp b/src/coreComponents/unitTests/toolchain/testToolchain.cpp index 8c5ff278d92..5bb8eb0ccc5 100644 --- a/src/coreComponents/unitTests/toolchain/testToolchain.cpp +++ b/src/coreComponents/unitTests/toolchain/testToolchain.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp b/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp index 0344a73c899..266ce88d436 100644 --- a/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp +++ b/src/coreComponents/unitTests/virtualElementTests/testConformingVirtualElementOrder1.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp index f1cb6261cfe..18902b383c2 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagation.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp index bb9a6eef28e..a161fcd24c3 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAcousticFirstOrder.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAdjoint1.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAdjoint1.cpp index 68c7618fecc..fb4bcd943e3 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAdjoint1.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAdjoint1.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp index fed816e5022..8f6e2ccbc57 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationAttenuation.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp index f36795c930d..e63c563095d 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationDAS.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp index 10fa8cae06f..294cf5eafce 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticFirstOrder.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp index 136e7ab17fa..85ee6da6dcd 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationElasticVTI.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp index ad2e70b9b5c..bbb0352d6f1 100644 --- a/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp +++ b/src/coreComponents/unitTests/wavePropagationTests/testWavePropagationQ2.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp index a84c14960a7..d329810880d 100644 --- a/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseMSWells.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp index 59bf3765590..35551790c50 100644 --- a/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testIsothermalReservoirCompositionalMultiphaseSSWells.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp index bc18b9af46d..e16b651723b 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirCompositionalMultiphaseMSWells.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp index 7441e826c27..948dbc5017f 100644 --- a/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testReservoirSinglePhaseMSWells.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp index e87c1c823e5..c28abf070bd 100644 --- a/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseMSWells.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp index 11d96b731fd..3c26e4d9f68 100644 --- a/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp +++ b/src/coreComponents/unitTests/wellsTests/testThermalReservoirCompositionalMultiphaseSSWells.cpp @@ -2,10 +2,11 @@ * ------------------------------------------------------------------------------------------------------------ * SPDX-License-Identifier: LGPL-2.1-only * - * Copyright (c) 2018-2020 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2020 The Board of Trustees of the Leland Stanford Junior University - * Copyright (c) 2018-2020 TotalEnergies - * Copyright (c) 2019- GEOSX Contributors + * 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. diff --git a/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp b/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp index 192f3e50f71..27b318e4511 100644 --- a/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp +++ b/src/coreComponents/unitTests/wellsTests/testWellEnums.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/xmlTests/testXML.cpp b/src/coreComponents/unitTests/xmlTests/testXML.cpp index 40fa4f64f9b..0f2e4c90d67 100644 --- a/src/coreComponents/unitTests/xmlTests/testXML.cpp +++ b/src/coreComponents/unitTests/xmlTests/testXML.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp b/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp index 8d2231cc216..274a5d52e9b 100644 --- a/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp +++ b/src/coreComponents/unitTests/xmlTests/testXMLFile.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/externalComponents/newComponentTemplate/src/NewComponent.cpp b/src/externalComponents/newComponentTemplate/src/NewComponent.cpp index 2ce2383e178..a09a49ce425 100644 --- a/src/externalComponents/newComponentTemplate/src/NewComponent.cpp +++ b/src/externalComponents/newComponentTemplate/src/NewComponent.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/externalComponents/newComponentTemplate/src/NewComponent.hpp b/src/externalComponents/newComponentTemplate/src/NewComponent.hpp index 2dbfa595d0c..9b8d0424f49 100644 --- a/src/externalComponents/newComponentTemplate/src/NewComponent.hpp +++ b/src/externalComponents/newComponentTemplate/src/NewComponent.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp b/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp index 9a9a521007c..444e3839226 100644 --- a/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp +++ b/src/externalComponents/newComponentTemplate/tests/testNewComponent.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/main/main.cpp b/src/main/main.cpp index 3904111aa1c..4673f2e228a 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/pygeosx/pygeosx.cpp b/src/pygeosx/pygeosx.cpp index 75879623f5c..3f3394307f3 100644 --- a/src/pygeosx/pygeosx.cpp +++ b/src/pygeosx/pygeosx.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/pygeosx/pygeosx.hpp b/src/pygeosx/pygeosx.hpp index 0e54130019a..087bbaa5529 100644 --- a/src/pygeosx/pygeosx.hpp +++ b/src/pygeosx/pygeosx.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 From 6cc493e53a4638241fe9f68b8d5d6ae7b108ac77 Mon Sep 17 00:00:00 2001 From: Matteo Cusini <49037133+CusiniM@users.noreply.github.com> Date: Wed, 11 Dec 2024 13:03:03 -0800 Subject: [PATCH 277/286] chore: upgrade Trilinos. (#3475) * chore: upgrade Trilinos. * update LvArray for lc path. udpate GEOS_TPL_TAG --------- Co-authored-by: Randolph Settgast --- .devcontainer/devcontainer.json | 2 +- host-configs/LLNL/lassen-clang-10-cuda-11.cmake | 6 +++--- host-configs/LLNL/lassen-clang-13-cuda-11.cmake | 4 ++-- host-configs/LLNL/lassen-gcc-8-cuda-11.cmake | 2 ++ src/coreComponents/LvArray | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 216993fba02..28ba75bfd2b 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,7 +2,7 @@ "build": { "dockerfile": "Dockerfile", "args": { - "GEOS_TPL_TAG": "286-547" + "GEOS_TPL_TAG": "288-584" } }, "runArgs": [ diff --git a/host-configs/LLNL/lassen-clang-10-cuda-11.cmake b/host-configs/LLNL/lassen-clang-10-cuda-11.cmake index 74c04803ed8..9c9ff7de26c 100644 --- a/host-configs/LLNL/lassen-clang-10-cuda-11.cmake +++ b/host-configs/LLNL/lassen-clang-10-cuda-11.cmake @@ -1,7 +1,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/LLNL/lassen-clang-10-cuda-11.cmake) # Fortran -set(CMAKE_Fortran_COMPILER /usr/tce/packages/xl/xl-2022.08.19-cuda-11.8.0/bin/xlf_r CACHE PATH "") +set(CMAKE_Fortran_COMPILER /usr/tce/packages/xl/xl-2023.06.28/xlf/16.1.1/bin/xlf CACHE PATH "") set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -qarch=pwr9 -qtune=pwr9" CACHE STRING "") set(FORTRAN_MANGLE_NO_UNDERSCORE ON CACHE BOOL "") set(OpenMP_Fortran_FLAGS "-qsmp=omp" CACHE STRING "") @@ -9,8 +9,8 @@ set(OpenMP_Fortran_LIB_NAMES "" CACHE STRING "") # MPI set(MPI_HOME /usr/tce/packages/spectrum-mpi/spectrum-mpi-rolling-release-clang-10.0.1-gcc-8.3.1 CACHE PATH "") -set(MPI_Fortran_COMPILER /usr/tce/packages/spectrum-mpi/spectrum-mpi-rolling-release-xl-2022.08.19-cuda-11.8.0/bin/mpifort CACHE PATH "") +set(MPI_Fortran_COMPILER /usr/tce/packages/spectrum-mpi/spectrum-mpi-rolling-release-xl-2023.06.28-cuda-11.8.0/bin/mpifort CACHE PATH "") include(${CMAKE_CURRENT_LIST_DIR}/lassen-base.cmake) -set(ENABLE_CUDA_NVTOOLSEXT OFF CACHE BOOL "") \ No newline at end of file +set(ENABLE_CUDA_NVTOOLSEXT ON CACHE BOOL "") \ No newline at end of file diff --git a/host-configs/LLNL/lassen-clang-13-cuda-11.cmake b/host-configs/LLNL/lassen-clang-13-cuda-11.cmake index 428274e26d2..c57f0014e51 100644 --- a/host-configs/LLNL/lassen-clang-13-cuda-11.cmake +++ b/host-configs/LLNL/lassen-clang-13-cuda-11.cmake @@ -1,7 +1,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/../../src/coreComponents/LvArray/host-configs/LLNL/lassen-clang-13-cuda-11.cmake) # Fortran -set(CMAKE_Fortran_COMPILER /usr/tce/packages/xl/xl-2022.08.19-cuda-11.8.0/bin/xlf_r CACHE PATH "") +set(CMAKE_Fortran_COMPILER /usr/tce/packages/xl/xl-2023.06.28/xlf/16.1.1/bin/xlf CACHE PATH "") set(CMAKE_Fortran_FLAGS_RELEASE "-O3 -DNDEBUG -qarch=pwr9 -qtune=pwr9" CACHE STRING "") set(FORTRAN_MANGLE_NO_UNDERSCORE ON CACHE BOOL "") set(OpenMP_Fortran_FLAGS "-qsmp=omp" CACHE STRING "") @@ -9,7 +9,7 @@ set(OpenMP_Fortran_LIB_NAMES "" CACHE STRING "") # MPI set(MPI_HOME /usr/tce/packages/spectrum-mpi/spectrum-mpi-rolling-release-clang-13.0.1-gcc-8.3.1 CACHE PATH "") -set(MPI_Fortran_COMPILER /usr/tce/packages/spectrum-mpi/spectrum-mpi-rolling-release-xl-2022.08.19-cuda-11.8.0/bin/mpifort CACHE PATH "") +set(MPI_Fortran_COMPILER /usr/tce/packages/spectrum-mpi/spectrum-mpi-rolling-release-xl-2023.06.28-cuda-11.8.0/bin/mpifort CACHE PATH "") include(${CMAKE_CURRENT_LIST_DIR}/lassen-base.cmake) diff --git a/host-configs/LLNL/lassen-gcc-8-cuda-11.cmake b/host-configs/LLNL/lassen-gcc-8-cuda-11.cmake index fa12811e52e..3e9fd6783d7 100644 --- a/host-configs/LLNL/lassen-gcc-8-cuda-11.cmake +++ b/host-configs/LLNL/lassen-gcc-8-cuda-11.cmake @@ -14,4 +14,6 @@ set(FORTRAN_MANGLE_NO_UNDERSCORE OFF CACHE BOOL "") set(MPI_HOME /usr/tce/packages/spectrum-mpi/spectrum-mpi-rolling-release-gcc-8.3.1 CACHE PATH "") set(MPI_Fortran_COMPILER ${MPI_HOME}/bin/mpifort CACHE PATH "") +set(ENABLE_CUDA_NVTOOLSEXT ON CACHE BOOL "") + include(${CMAKE_CURRENT_LIST_DIR}/lassen-base.cmake) diff --git a/src/coreComponents/LvArray b/src/coreComponents/LvArray index 9b1c0049497..00e3ead6706 160000 --- a/src/coreComponents/LvArray +++ b/src/coreComponents/LvArray @@ -1 +1 @@ -Subproject commit 9b1c00494974c73ff38f8590f010f624efe9964c +Subproject commit 00e3ead67060d3c3d4b8291d8e4abbf680b87eb3 From ec52431bb56fc74eaac8f3c566063741d5f16f5c Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Wed, 11 Dec 2024 16:40:04 -0600 Subject: [PATCH 278/286] refactor: remove assemblyLaunch duplicates in poromechanics solvers (#3488) --- .../multiphysics/MultiphasePoromechanics.cpp | 74 +++++++++---------- .../multiphysics/MultiphasePoromechanics.hpp | 58 --------------- .../multiphysics/PoromechanicsSolver.hpp | 39 ++++++++++ .../multiphysics/SinglePhasePoromechanics.cpp | 60 +++++++-------- .../multiphysics/SinglePhasePoromechanics.hpp | 55 -------------- 5 files changed, 106 insertions(+), 180 deletions(-) diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 29b47efd161..dc3875a88ec 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -141,39 +141,39 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementBa if( this->m_isThermal ) { poromechanicsMaxForce = - assemblyLaunch< constitutive::PorousSolidBase, - thermalPoromechanicsKernels::ThermalMultiphasePoromechanicsKernelFactory >( mesh, - dofManager, - regionNames, - Base::viewKeyStruct::porousMaterialNamesString(), - localMatrix, - localRhs, - dt, - flowDofKey, - this->flowSolver()->numFluidComponents(), - this->flowSolver()->numFluidPhases(), - this->flowSolver()->useTotalMassEquation(), - this->m_performStressInitialization, - FlowSolverBase::viewKeyStruct::fluidNamesString() ); + this->template assemblyLaunch< constitutive::PorousSolidBase, + thermalPoromechanicsKernels::ThermalMultiphasePoromechanicsKernelFactory >( mesh, + dofManager, + regionNames, + Base::viewKeyStruct::porousMaterialNamesString(), + localMatrix, + localRhs, + dt, + flowDofKey, + this->flowSolver()->numFluidComponents(), + this->flowSolver()->numFluidPhases(), + this->flowSolver()->useTotalMassEquation(), + this->m_performStressInitialization, + FlowSolverBase::viewKeyStruct::fluidNamesString() ); } else { poromechanicsMaxForce = - assemblyLaunch< constitutive::PorousSolidBase, - poromechanicsKernels::MultiphasePoromechanicsKernelFactory >( mesh, - dofManager, - regionNames, - Base::viewKeyStruct::porousMaterialNamesString(), - localMatrix, - localRhs, - dt, - flowDofKey, - this->flowSolver()->numFluidComponents(), - this->flowSolver()->numFluidPhases(), - this->flowSolver()->useSimpleAccumulation(), - this->flowSolver()->useTotalMassEquation(), - this->m_performStressInitialization, - FlowSolverBase::viewKeyStruct::fluidNamesString() ); + this->template assemblyLaunch< constitutive::PorousSolidBase, + poromechanicsKernels::MultiphasePoromechanicsKernelFactory >( mesh, + dofManager, + regionNames, + Base::viewKeyStruct::porousMaterialNamesString(), + localMatrix, + localRhs, + dt, + flowDofKey, + this->flowSolver()->numFluidComponents(), + this->flowSolver()->numFluidPhases(), + this->flowSolver()->useSimpleAccumulation(), + this->flowSolver()->useTotalMassEquation(), + this->m_performStressInitialization, + FlowSolverBase::viewKeyStruct::fluidNamesString() ); } } ); @@ -203,14 +203,14 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementBa } mechanicsMaxForce = - assemblyLaunch< constitutive::SolidBase, - solidMechanicsLagrangianFEMKernels::QuasiStaticFactory >( mesh, - dofManager, - filteredRegionNames.toViewConst(), - SolidMechanicsLagrangianFEM::viewKeyStruct::solidMaterialNamesString(), - localMatrix, - localRhs, - dt ); + this->template assemblyLaunch< constitutive::SolidBase, + solidMechanicsLagrangianFEMKernels::QuasiStaticFactory >( mesh, + dofManager, + filteredRegionNames.toViewConst(), + SolidMechanicsLagrangianFEM::viewKeyStruct::solidMaterialNamesString(), + localMatrix, + localRhs, + dt ); } ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index 55dbd180534..89d46b554be 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -107,72 +107,14 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANI virtual void initializePostInitialConditionsPreSubGroups() override; - - -private: - /** * @brief Helper function to recompute the bulk density * @param[in] subRegion the element subRegion */ virtual void updateBulkDensity( ElementSubRegionBase & subRegion ) override; - template< typename CONSTITUTIVE_BASE, - typename KERNEL_WRAPPER, - typename ... PARAMS > - real64 assemblyLaunch( MeshLevel & mesh, - DofManager const & dofManager, - arrayView1d< string const > const & regionNames, - string const & materialNamesString, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - real64 const dt, - PARAMS && ... params ); - - }; -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -template< typename CONSTITUTIVE_BASE, - typename KERNEL_WRAPPER, - typename ... PARAMS > -real64 MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assemblyLaunch( MeshLevel & mesh, - DofManager const & dofManager, - arrayView1d< string const > const & regionNames, - string const & materialNamesString, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - real64 const dt, - PARAMS && ... params ) -{ - GEOS_MARK_FUNCTION; - - NodeManager const & nodeManager = mesh.getNodeManager(); - - string const dofKey = dofManager.getKey( fields::solidMechanics::totalDisplacement::key() ); - arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey ); - - real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( PhysicsSolverBase::gravityVector() ); - - KERNEL_WRAPPER kernelWrapper( dofNumber, - dofManager.rankOffset(), - localMatrix, - localRhs, - dt, - gravityVectorData, - std::forward< PARAMS >( params )... ); - - return finiteElement:: - regionBasedKernelApplication< parallelDevicePolicy< >, - CONSTITUTIVE_BASE, - CellElementSubRegion >( mesh, - regionNames, - this->solidMechanicsSolver()->getDiscretizationName(), - materialNamesString, - kernelWrapper ); -} - - } /* namespace geos */ #endif /* GEOS_PHYSICSSOLVERS_MULTIPHYSICS_MULTIPHASEPOROMECHANICS_HPP_ */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp index fb5d63043c2..62a772e0278 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/PoromechanicsSolver.hpp @@ -395,6 +395,45 @@ class PoromechanicsSolver : public CoupledSolver< FLOW_SOLVER, MECHANICS_SOLVER protected: + template< typename CONSTITUTIVE_BASE, + typename KERNEL_WRAPPER, + typename ... PARAMS > + real64 assemblyLaunch( MeshLevel & mesh, + DofManager const & dofManager, + arrayView1d< string const > const & regionNames, + string const & materialNamesString, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs, + real64 const dt, + PARAMS && ... params ) + { + GEOS_MARK_FUNCTION; + + NodeManager const & nodeManager = mesh.getNodeManager(); + + string const dofKey = dofManager.getKey( fields::solidMechanics::totalDisplacement::key() ); + arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey ); + + real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( PhysicsSolverBase::gravityVector() ); + + KERNEL_WRAPPER kernelWrapper( dofNumber, + dofManager.rankOffset(), + localMatrix, + localRhs, + dt, + gravityVectorData, + std::forward< PARAMS >( params )... ); + + return finiteElement:: + regionBasedKernelApplication< parallelDevicePolicy< >, + CONSTITUTIVE_BASE, + CellElementSubRegion >( mesh, + regionNames, + this->solidMechanicsSolver()->getDiscretizationName(), + materialNamesString, + kernelWrapper ); + } + /* Implementation of Nonlinear Acceleration (Aitken) of averageMeanTotalStressIncrement */ void recordAverageMeanTotalStressIncrement( DomainPartition & domain, diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 3d04a90004b..b28c0d0b9af 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -194,32 +194,32 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementB if( this->m_isThermal ) { poromechanicsMaxForce = - assemblyLaunch< constitutive::PorousSolidBase, - thermalPoromechanicsKernels::ThermalSinglePhasePoromechanicsKernelFactory >( mesh, - dofManager, - regionNames, - viewKeyStruct::porousMaterialNamesString(), - localMatrix, - localRhs, - dt, - flowDofKey, - this->m_performStressInitialization, - FlowSolverBase::viewKeyStruct::fluidNamesString() ); + this->template assemblyLaunch< constitutive::PorousSolidBase, + thermalPoromechanicsKernels::ThermalSinglePhasePoromechanicsKernelFactory >( mesh, + dofManager, + regionNames, + viewKeyStruct::porousMaterialNamesString(), + localMatrix, + localRhs, + dt, + flowDofKey, + this->m_performStressInitialization, + FlowSolverBase::viewKeyStruct::fluidNamesString() ); } else { poromechanicsMaxForce = - assemblyLaunch< constitutive::PorousSolidBase, - poromechanicsKernels::SinglePhasePoromechanicsKernelFactory >( mesh, - dofManager, - regionNames, - viewKeyStruct::porousMaterialNamesString(), - localMatrix, - localRhs, - dt, - flowDofKey, - this->m_performStressInitialization, - FlowSolverBase::viewKeyStruct::fluidNamesString() ); + this->template assemblyLaunch< constitutive::PorousSolidBase, + poromechanicsKernels::SinglePhasePoromechanicsKernelFactory >( mesh, + dofManager, + regionNames, + viewKeyStruct::porousMaterialNamesString(), + localMatrix, + localRhs, + dt, + flowDofKey, + this->m_performStressInitialization, + FlowSolverBase::viewKeyStruct::fluidNamesString() ); } } ); @@ -248,14 +248,14 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementB } mechanicsMaxForce = - assemblyLaunch< constitutive::SolidBase, - solidMechanicsLagrangianFEMKernels::QuasiStaticFactory >( mesh, - dofManager, - filteredRegionNames.toViewConst(), - SolidMechanicsLagrangianFEM::viewKeyStruct::solidMaterialNamesString(), - localMatrix, - localRhs, - dt ); + this->template assemblyLaunch< constitutive::SolidBase, + solidMechanicsLagrangianFEMKernels::QuasiStaticFactory >( mesh, + dofManager, + filteredRegionNames.toViewConst(), + SolidMechanicsLagrangianFEM::viewKeyStruct::solidMaterialNamesString(), + localMatrix, + localRhs, + dt ); } ); this->solidMechanicsSolver()->applyContactConstraint( dofManager, domain, localMatrix, localRhs ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index 35d11acb118..4b9dfbf7427 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -118,20 +118,6 @@ class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHAN virtual void initializePostInitialConditionsPreSubGroups() override; - template< typename CONSTITUTIVE_BASE, - typename KERNEL_WRAPPER, - typename ... PARAMS > - real64 assemblyLaunch( MeshLevel & mesh, - DofManager const & dofManager, - arrayView1d< string const > const & regionNames, - string const & materialNamesString, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - real64 const dt, - PARAMS && ... params ); - -private: - /** * @brief Helper function to recompute the bulk density * @param[in] subRegion the element subRegion @@ -142,47 +128,6 @@ class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHAN }; -template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > -template< typename CONSTITUTIVE_BASE, - typename KERNEL_WRAPPER, - typename ... PARAMS > -real64 SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assemblyLaunch( MeshLevel & mesh, - DofManager const & dofManager, - arrayView1d< string const > const & regionNames, - string const & materialNamesString, - CRSMatrixView< real64, globalIndex const > const & localMatrix, - arrayView1d< real64 > const & localRhs, - real64 const dt, - PARAMS && ... params ) -{ - GEOS_MARK_FUNCTION; - - NodeManager const & nodeManager = mesh.getNodeManager(); - - string const dofKey = dofManager.getKey( fields::solidMechanics::totalDisplacement::key() ); - arrayView1d< globalIndex const > const & dofNumber = nodeManager.getReference< globalIndex_array >( dofKey ); - - real64 const gravityVectorData[3] = LVARRAY_TENSOROPS_INIT_LOCAL_3( PhysicsSolverBase::gravityVector() ); - - KERNEL_WRAPPER kernelWrapper( dofNumber, - dofManager.rankOffset(), - localMatrix, - localRhs, - dt, - gravityVectorData, - std::forward< PARAMS >( params )... ); - - return finiteElement:: - regionBasedKernelApplication< parallelDevicePolicy< >, - CONSTITUTIVE_BASE, - CellElementSubRegion >( mesh, - regionNames, - this->solidMechanicsSolver()->getDiscretizationName(), - materialNamesString, - kernelWrapper ); -} - - } /* namespace geos */ #endif /* GEOS_PHYSICSSOLVERS_MULTIPHYSICS_SINGLEPHASEPOROMECHANICS_HPP_ */ From f46fb7aeafd0fae4ac1268b80cad3800d93a6865 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 12 Dec 2024 15:44:20 -0600 Subject: [PATCH 279/286] fix: fix issue #2615 (#3477) --- src/coreComponents/mesh/FieldIdentifiers.hpp | 7 ++++--- .../mesh/mpiCommunications/NeighborCommunicator.cpp | 9 +++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/coreComponents/mesh/FieldIdentifiers.hpp b/src/coreComponents/mesh/FieldIdentifiers.hpp index dcbd8620f65..82a05050565 100644 --- a/src/coreComponents/mesh/FieldIdentifiers.hpp +++ b/src/coreComponents/mesh/FieldIdentifiers.hpp @@ -98,11 +98,11 @@ class FieldIdentifiers * @brief Get the Location object * * @param key key used to store the list of fields in the map. - * @param location mesh location where fields defined by the key provided were registered. + * @return mesh location where fields defined by the key provided were registered. */ - void getLocation( string const & key, - FieldLocation & location ) const + FieldLocation getLocation( string const & key ) const { + FieldLocation location{}; if( key.find( m_locationKeys.nodesKey() ) != string::npos ) { location = FieldLocation::Node; @@ -123,6 +123,7 @@ class FieldIdentifiers { GEOS_ERROR( GEOS_FMT( "Invalid key, {}, was provided. Location cannot be retrieved.", key ) ); } + return location; } private: diff --git a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp index fd8cfbf366d..3300cd2ddad 100644 --- a/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp +++ b/src/coreComponents/mesh/mpiCommunications/NeighborCommunicator.cpp @@ -511,8 +511,7 @@ int NeighborCommunicator::packCommSizeForSync( FieldIdentifiers const & fieldsTo for( auto const & iter : fieldsToBeSync.getFields() ) { - FieldLocation location{}; - fieldsToBeSync.getLocation( iter.first, location ); + FieldLocation const location = fieldsToBeSync.getLocation( iter.first ); switch( location ) { case FieldLocation::Node: @@ -569,8 +568,7 @@ void NeighborCommunicator::packCommBufferForSync( FieldIdentifiers const & field for( auto const & iter : fieldsToBeSync.getFields() ) { - FieldLocation location{}; - fieldsToBeSync.getLocation( iter.first, location ); + FieldLocation const location = fieldsToBeSync.getLocation( iter.first ); switch( location ) { case FieldLocation::Node: @@ -628,8 +626,7 @@ void NeighborCommunicator::unpackBufferForSync( FieldIdentifiers const & fieldsT for( auto const & iter : fieldsToBeSync.getFields() ) { - FieldLocation location{}; - fieldsToBeSync.getLocation( iter.first, location ); + FieldLocation const location = fieldsToBeSync.getLocation( iter.first ); switch( location ) { case FieldLocation::Node: From da4cd7f555c62efe144dc2edce0f462e44fefc2a Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Thu, 12 Dec 2024 21:43:12 -0600 Subject: [PATCH 280/286] fix: fix small typo in ATS docs (#3478) --- .github/workflows/ci_tests.yml | 2 +- src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index a1803a9e008..32d77b0cc5e 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -330,7 +330,7 @@ jobs: DOCKER_CERTS_DIR: "/etc/pki/ca-trust/source/anchors" DOCKER_CERTS_UPDATE_COMMAND: "update-ca-trust" - - name: Pangea 3 (AlmaLinux 8.8, gcc 9.4.0, open-mpi 4.1.2, cuda 11.5.0, openblas 0.3.10) + - name: Pangea 3 CUDA (AlmaLinux 8.8, gcc 9.4.0, open-mpi 4.1.2, cuda 11.5.0, openblas 0.3.10) BUILD_AND_TEST_CLI_ARGS: "--build-exe-only --no-install-schema" CMAKE_BUILD_TYPE: Release BUILD_GENERATOR: "--makefile" diff --git a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst index 2f712ee5506..4841a4fab43 100644 --- a/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst +++ b/src/docs/sphinx/developerGuide/Contributing/IntegratedTests.rst @@ -121,7 +121,7 @@ After building GEOS, the integrated tests can be triggered in the GEOS build dir .. note:: - The `make_ats_environment` and `ats_run` steps may require internet access to collect python packages and baseline files. + The `make ats_environment` and `make ats_run` steps may require internet access to collect python packages and baseline files. .. note:: From b5ea7ce672974c5a68c7ac2443dfe8ac02c81f67 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Fri, 13 Dec 2024 11:47:46 -0600 Subject: [PATCH 281/286] refactor: some more details for mesh import, unify createChild log messages (#3476) Co-authored-by: Nicola Castelletto <38361926+castelletto1@users.noreply.github.com> --- .../constitutive/ConstitutiveManager.cpp | 1 + .../dataRepository/xmlWrapper.cpp | 2 +- src/coreComponents/events/EventBase.cpp | 2 +- src/coreComponents/events/EventManager.cpp | 2 +- .../events/tasks/TasksManager.cpp | 1 + .../FieldSpecificationManager.cpp | 1 + .../fileIO/Outputs/OutputManager.cpp | 2 +- .../FiniteElementDiscretizationManager.cpp | 1 + .../finiteVolume/FiniteVolumeManager.cpp | 1 + .../functions/FunctionManager.cpp | 2 +- .../mesh/ElementRegionManager.cpp | 2 +- .../mesh/ExternalDataSourceBase.cpp | 2 +- .../mesh/ExternalDataSourceManager.cpp | 2 +- src/coreComponents/mesh/MeshManager.cpp | 96 +++++++++---------- src/coreComponents/mesh/MeshManager.hpp | 17 ++++ src/coreComponents/mesh/ParticleManager.cpp | 2 +- .../mesh/generators/MeshGeneratorBase.cpp | 2 +- .../mesh/generators/VTKMeshGenerator.cpp | 22 ++--- .../mesh/generators/WellGeneratorBase.cpp | 2 +- .../GeometricObjectManager.cpp | 2 +- .../physicsSolvers/PhysicsSolverManager.cpp | 2 +- 21 files changed, 94 insertions(+), 72 deletions(-) diff --git a/src/coreComponents/constitutive/ConstitutiveManager.cpp b/src/coreComponents/constitutive/ConstitutiveManager.cpp index e3e59bb7554..3babd88203e 100644 --- a/src/coreComponents/constitutive/ConstitutiveManager.cpp +++ b/src/coreComponents/constitutive/ConstitutiveManager.cpp @@ -43,6 +43,7 @@ ConstitutiveManager::~ConstitutiveManager() Group * ConstitutiveManager::createChild( string const & childKey, string const & childName ) { + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); std::unique_ptr< ConstitutiveBase > material = ConstitutiveBase::CatalogInterface::factory( childKey, childName, this ); return ®isterGroup< ConstitutiveBase >( childName, std::move( material ) ); } diff --git a/src/coreComponents/dataRepository/xmlWrapper.cpp b/src/coreComponents/dataRepository/xmlWrapper.cpp index 19f0f223e10..e0ada302c49 100644 --- a/src/coreComponents/dataRepository/xmlWrapper.cpp +++ b/src/coreComponents/dataRepository/xmlWrapper.cpp @@ -171,7 +171,7 @@ void xmlDocument::addIncludedXML( xmlNode & targetNode, int const level ) return isAbsolutePath( fileName ) ? fileName : joinPath( splitPath( currentFilePath ).first, fileName ); }(); - GEOS_LOG_RANK_0( "Included additionnal XML file: " << getAbsolutePath( includedFilePath ) ); + GEOS_LOG_RANK_0( "Included additional XML file: " << getAbsolutePath( includedFilePath ) ); xmlDocument includedXmlDocument; xmlResult const result = includedXmlDocument.loadFile( includedFilePath, hasNodeFileInfo() ); diff --git a/src/coreComponents/events/EventBase.cpp b/src/coreComponents/events/EventBase.cpp index 6b9a2f2c0c4..6212dc89d61 100644 --- a/src/coreComponents/events/EventBase.cpp +++ b/src/coreComponents/events/EventBase.cpp @@ -122,7 +122,7 @@ EventBase::CatalogInterface::CatalogType & EventBase::getCatalog() Group * EventBase::createChild( string const & childKey, string const & childName ) { - GEOS_LOG_RANK_0( "Adding Event: " << childKey << ", " << childName ); + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); std::unique_ptr< EventBase > event = EventBase::CatalogInterface::factory( childKey, childName, this ); return &this->registerGroup< EventBase >( childName, std::move( event ) ); } diff --git a/src/coreComponents/events/EventManager.cpp b/src/coreComponents/events/EventManager.cpp index a30706b8aa5..69c3a46dd95 100644 --- a/src/coreComponents/events/EventManager.cpp +++ b/src/coreComponents/events/EventManager.cpp @@ -93,7 +93,7 @@ EventManager::~EventManager() Group * EventManager::createChild( string const & childKey, string const & childName ) { - GEOS_LOG_RANK_0( "Adding Event: " << childKey << ", " << childName ); + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); std::unique_ptr< EventBase > event = EventBase::CatalogInterface::factory( childKey, childName, this ); return &this->registerGroup< EventBase >( childName, std::move( event ) ); } diff --git a/src/coreComponents/events/tasks/TasksManager.cpp b/src/coreComponents/events/tasks/TasksManager.cpp index ea0eea28a4d..9f95aefb2ac 100644 --- a/src/coreComponents/events/tasks/TasksManager.cpp +++ b/src/coreComponents/events/tasks/TasksManager.cpp @@ -38,6 +38,7 @@ TasksManager::~TasksManager() Group * TasksManager::createChild( string const & childKey, string const & childName ) { + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); std::unique_ptr< TaskBase > task = TaskBase::CatalogInterface::factory( childKey, childName, this ); return &this->registerGroup< TaskBase >( childName, std::move( task ) ); } diff --git a/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp b/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp index 307437e748c..155596304d6 100644 --- a/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp +++ b/src/coreComponents/fieldSpecification/FieldSpecificationManager.cpp @@ -51,6 +51,7 @@ 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< FieldSpecificationBase > bc = FieldSpecificationBase::CatalogInterface::factory( childKey, childName, this ); return &this->registerGroup( childName, std::move( bc ) ); } diff --git a/src/coreComponents/fileIO/Outputs/OutputManager.cpp b/src/coreComponents/fileIO/Outputs/OutputManager.cpp index 157328fa248..42ea71af77a 100644 --- a/src/coreComponents/fileIO/Outputs/OutputManager.cpp +++ b/src/coreComponents/fileIO/Outputs/OutputManager.cpp @@ -39,7 +39,7 @@ OutputManager::~OutputManager() Group * OutputManager::createChild( string const & childKey, string const & childName ) { - GEOS_LOG_RANK_0( "Adding Output: " << childKey << ", " << childName ); + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); std::unique_ptr< OutputBase > output = OutputBase::CatalogInterface::factory( childKey, childName, this ); return &this->registerGroup< OutputBase >( childName, std::move( output ) ); } diff --git a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp index 2e7c8e3ccc3..8bd43f0cdaf 100644 --- a/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp +++ b/src/coreComponents/finiteElement/FiniteElementDiscretizationManager.cpp @@ -40,6 +40,7 @@ FiniteElementDiscretizationManager::~FiniteElementDiscretizationManager() Group * FiniteElementDiscretizationManager::createChild( string const & childKey, string const & childName ) { // These objects should probably not be registered on managed group... + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); std::unique_ptr< Group > fem = Group::CatalogInterface::factory( childKey, childName, this ); return &this->registerGroup( childName, std::move( fem ) ); } diff --git a/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp b/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp index 14161b5a0e9..500d1da5ecf 100644 --- a/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp +++ b/src/coreComponents/finiteVolume/FiniteVolumeManager.cpp @@ -42,6 +42,7 @@ FiniteVolumeManager::~FiniteVolumeManager() Group * FiniteVolumeManager::createChild( string const & childKey, string const & childName ) { + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); if( childKey == HybridMimeticDiscretization::catalogName() ) { std::unique_ptr< HybridMimeticDiscretization > hm = std::make_unique< HybridMimeticDiscretization >( childName, this ); diff --git a/src/coreComponents/functions/FunctionManager.cpp b/src/coreComponents/functions/FunctionManager.cpp index 738432e89df..0cd5a92ba9c 100644 --- a/src/coreComponents/functions/FunctionManager.cpp +++ b/src/coreComponents/functions/FunctionManager.cpp @@ -53,7 +53,7 @@ FunctionManager & FunctionManager::getInstance() Group * FunctionManager::createChild( string const & functionCatalogKey, string const & functionName ) { - GEOS_LOG_RANK_0( " " << functionCatalogKey << ": " << functionName ); + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), functionCatalogKey, functionName ) ); std::unique_ptr< FunctionBase > function = FunctionBase::CatalogInterface::factory( functionCatalogKey, functionName, this ); return &this->registerGroup< FunctionBase >( functionName, std::move( function ) ); } diff --git a/src/coreComponents/mesh/ElementRegionManager.cpp b/src/coreComponents/mesh/ElementRegionManager.cpp index 89c05003385..18da04ec066 100644 --- a/src/coreComponents/mesh/ElementRegionManager.cpp +++ b/src/coreComponents/mesh/ElementRegionManager.cpp @@ -75,7 +75,7 @@ Group * ElementRegionManager::createChild( string const & childKey, string const { GEOS_ERROR_IF( !(CatalogInterface::hasKeyName( childKey )), "KeyName ("<getGroup( ElementRegionManager::groupKeyStruct::elementRegionsGroup() ); return &elementRegions.registerGroup( childName, diff --git a/src/coreComponents/mesh/ExternalDataSourceBase.cpp b/src/coreComponents/mesh/ExternalDataSourceBase.cpp index 2f3ea7bf8a9..157fe3de31e 100644 --- a/src/coreComponents/mesh/ExternalDataSourceBase.cpp +++ b/src/coreComponents/mesh/ExternalDataSourceBase.cpp @@ -27,7 +27,7 @@ ExternalDataSourceBase::ExternalDataSourceBase( string const & name, Group * con Group * ExternalDataSourceBase::createChild( string const & childKey, string const & childName ) { - GEOS_LOG_RANK_0( "Adding External Data Source: " << childKey << ", " << childName ); + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); std::unique_ptr< ExternalDataSourceBase > event = ExternalDataSourceBase::CatalogInterface::factory( childKey, childName, this ); return &this->registerGroup< ExternalDataSourceBase >( childName, std::move( event ) ); } diff --git a/src/coreComponents/mesh/ExternalDataSourceManager.cpp b/src/coreComponents/mesh/ExternalDataSourceManager.cpp index 5cd6eb6fd88..8a22203af8e 100644 --- a/src/coreComponents/mesh/ExternalDataSourceManager.cpp +++ b/src/coreComponents/mesh/ExternalDataSourceManager.cpp @@ -35,7 +35,7 @@ ExternalDataSourceManager::~ExternalDataSourceManager() Group * ExternalDataSourceManager::createChild( string const & childKey, string const & childName ) { - GEOS_LOG_RANK_0( "Adding External Data Source: " << childKey << ", " << childName ); + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); std::unique_ptr< ExternalDataSourceBase > externalDataSource = ExternalDataSourceBase::CatalogInterface::factory( childKey, childName, this ); return &this->registerGroup< ExternalDataSourceBase >( childName, std::move( externalDataSource ) ); } diff --git a/src/coreComponents/mesh/MeshManager.cpp b/src/coreComponents/mesh/MeshManager.cpp index e5bc0979c8d..662b06002b6 100644 --- a/src/coreComponents/mesh/MeshManager.cpp +++ b/src/coreComponents/mesh/MeshManager.cpp @@ -20,7 +20,6 @@ #include "mesh/mpiCommunications/SpatialPartition.hpp" #include "generators/CellBlockManagerABC.hpp" -#include "generators/MeshGeneratorBase.hpp" #include "mesh/mpiCommunications/CommunicationTools.hpp" #include "common/TimingMacros.hpp" @@ -43,7 +42,7 @@ MeshManager::~MeshManager() Group * MeshManager::createChild( string const & childKey, string const & childName ) { - GEOS_LOG_RANK_0( "Adding Mesh: " << childKey << ", " << childName ); + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); std::unique_ptr< MeshGeneratorBase > mesh = MeshGeneratorBase::CatalogInterface::factory( childKey, childName, this ); return &this->registerGroup< MeshGeneratorBase >( childName, std::move( mesh ) ); } @@ -81,7 +80,7 @@ void MeshManager::generateMeshes( DomainPartition & domain ) void MeshManager::generateMeshLevels( DomainPartition & domain ) { - this->forSubGroups< MeshGeneratorBase >( [&]( MeshGeneratorBase & meshGen ) + forSubGroups< MeshGeneratorBase >( [&]( MeshGeneratorBase & meshGen ) { string const & meshName = meshGen.getName(); domain.getMeshBodies().registerGroup< MeshBody >( meshName ).createMeshLevel( MeshBody::groupStructKeys::baseDiscretizationString() ); @@ -126,50 +125,10 @@ void MeshManager::importFields( DomainPartition & domain ) } GEOS_LOG_RANK_0( GEOS_FMT( "{}: importing field data from mesh dataset", generator.getName() ) ); - - auto const importFields = [&generator]( ElementRegionBase const & region, - ElementSubRegionBase & subRegion, - MeshGeneratorBase::Block block, - std::map< string, string > const & fieldsMapping, - FieldIdentifiers & fieldsToBeSync ) - { - std::unordered_set< string > const materialWrapperNames = getMaterialWrapperNames( subRegion ); - // Writing properties - for( auto const & pair : fieldsMapping ) - { - string const & meshFieldName = pair.first; - string const & geosFieldName = pair.second; - // Find destination - if( !subRegion.hasWrapper( geosFieldName ) ) - { - // Skip - the user may have not enabled a particular physics model/solver on this destination region. - if( generator.getLogLevel() >= 1 ) - { - GEOS_LOG_RANK_0( "Skipping import of " << meshFieldName << " -> " << geosFieldName << - " on " << region.getName() << "/" << subRegion.getName() << " (field not found)" ); - } - - continue; - } - - // Now that we know that the subRegion has this wrapper, - // we can add the geosFieldName to the list of fields to synchronize - fieldsToBeSync.addElementFields( { geosFieldName }, { region.getName() } ); - WrapperBase & wrapper = subRegion.getWrapperBase( geosFieldName ); - if( generator.getLogLevel() >= 1 ) - { - GEOS_LOG_RANK_0( "Importing field " << meshFieldName << " into " << geosFieldName << - " on " << region.getName() << "/" << subRegion.getName() ); - } - - bool const isMaterialField = materialWrapperNames.count( geosFieldName ) > 0 && wrapper.numArrayDims() > 1; - generator.importFieldOnArray( block, subRegion.getName(), meshFieldName, isMaterialField, wrapper ); - } - }; - - dataRepository::Group & meshLevels = domain.getMeshBody( generator.getName() ).getMeshLevels(); - meshLevels.forSubGroups< MeshLevel >( [&]( MeshLevel & meshLevel ) + MeshBody & meshBody = domain.getMeshBody( generator.getName() ); + meshBody.forMeshLevels( [&]( MeshLevel & meshLevel ) { + GEOS_LOG_RANK_0( GEOS_FMT( " mesh level = {}", meshLevel.getName() ) ); FieldIdentifiers fieldsToBeSync; meshLevel.getElemManager().forElementSubRegionsComplete< CellElementSubRegion >( [&]( localIndex, @@ -177,7 +136,8 @@ void MeshManager::importFields( DomainPartition & domain ) ElementRegionBase const & region, CellElementSubRegion & subRegion ) { - importFields( region, subRegion, MeshGeneratorBase::Block::VOLUMIC, generator.getVolumicFieldsMapping(), fieldsToBeSync ); + GEOS_LOG_RANK_0( GEOS_FMT( " volumic fields on {}/{}", region.getName(), subRegion.getName() ) ); + importFields( generator, region.getName(), subRegion, MeshGeneratorBase::Block::VOLUMIC, generator.getVolumicFieldsMapping(), fieldsToBeSync ); } ); meshLevel.getElemManager().forElementSubRegionsComplete< FaceElementSubRegion >( [&]( localIndex, @@ -185,7 +145,8 @@ void MeshManager::importFields( DomainPartition & domain ) ElementRegionBase const & region, FaceElementSubRegion & subRegion ) { - importFields( region, subRegion, MeshGeneratorBase::Block::SURFACIC, generator.getSurfacicFieldsMapping(), fieldsToBeSync ); + GEOS_LOG_RANK_0( GEOS_FMT( " surfaic fields on {}/{}", region.getName(), subRegion.getName() ) ); + importFields( generator, region.getName(), subRegion, MeshGeneratorBase::Block::SURFACIC, generator.getSurfacicFieldsMapping(), fieldsToBeSync ); } ); CommunicationTools::getInstance().synchronizeFields( fieldsToBeSync, meshLevel, domain.getNeighbors(), false ); // TODO Validate this. } ); @@ -197,4 +158,43 @@ void MeshManager::importFields( DomainPartition & domain ) } ); } +void MeshManager::importFields( MeshGeneratorBase const & generator, + string const & regionName, + ElementSubRegionBase & subRegion, + MeshGeneratorBase::Block const block, + std::map< string, string > const & fieldsMapping, + FieldIdentifiers & fieldsToBeSync ) +{ + std::unordered_set< string > const materialWrapperNames = getMaterialWrapperNames( subRegion ); + // Writing properties + for( auto const & pair : fieldsMapping ) + { + string const & meshFieldName = pair.first; + string const & geosFieldName = pair.second; + // Find destination + if( !subRegion.hasWrapper( geosFieldName ) ) + { + // Skip - the user may have not enabled a particular physics model/solver on this destination region. + if( generator.getLogLevel() >= 1 ) + { + GEOS_LOG_RANK_0( GEOS_FMT( " Skipping import of {} -> {} (field not found)", meshFieldName, geosFieldName ) ); + } + + continue; + } + + // Now that we know that the subRegion has this wrapper, + // we can add the geosFieldName to the list of fields to synchronize + fieldsToBeSync.addElementFields( { geosFieldName }, { regionName } ); + WrapperBase & wrapper = subRegion.getWrapperBase( geosFieldName ); + if( generator.getLogLevel() >= 1 ) + { + GEOS_LOG_RANK_0( GEOS_FMT( " {} -> {}", meshFieldName, geosFieldName ) ); + } + + bool const isMaterialField = materialWrapperNames.count( geosFieldName ) > 0 && wrapper.numArrayDims() > 1; + generator.importFieldOnArray( block, subRegion.getName(), meshFieldName, isMaterialField, wrapper ); + } +} + } /* namespace geos */ diff --git a/src/coreComponents/mesh/MeshManager.hpp b/src/coreComponents/mesh/MeshManager.hpp index 9f8ed2aaaa4..d2f7eff56d0 100644 --- a/src/coreComponents/mesh/MeshManager.hpp +++ b/src/coreComponents/mesh/MeshManager.hpp @@ -22,6 +22,7 @@ #include "dataRepository/Group.hpp" #include "mesh/DomainPartition.hpp" +#include "generators/MeshGeneratorBase.hpp" namespace geos { @@ -74,6 +75,22 @@ class MeshManager : public dataRepository::Group */ void importFields( DomainPartition & domain ); + /** + * @brief Import fields data + * @param[in] generator reference to mesh generator + * @param[in] regionName name of the region + * @param[in] subRegion reference to the subregion + * @param[in] block block type + * @param[in] fieldsMapping mapping for fields + * @param[out] fieldsToBeSync list of fields to synchronize + */ + static void importFields( MeshGeneratorBase const & generator, + string const & regionName, + ElementSubRegionBase & subRegion, + MeshGeneratorBase::Block block, + std::map< string, string > const & fieldsMapping, + FieldIdentifiers & fieldsToBeSync ); + private: /** diff --git a/src/coreComponents/mesh/ParticleManager.cpp b/src/coreComponents/mesh/ParticleManager.cpp index 34ddd5ae39f..314c23120b4 100644 --- a/src/coreComponents/mesh/ParticleManager.cpp +++ b/src/coreComponents/mesh/ParticleManager.cpp @@ -88,7 +88,7 @@ Group * ParticleManager::createChild( string const & childKey, string const & ch { GEOS_ERROR_IF( !(CatalogInterface::hasKeyName( childKey )), "KeyName ("<getGroup( ParticleManager::groupKeyStruct::particleRegionsGroup() ); return &particleRegions.registerGroup( childName, diff --git a/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp b/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp index 45971d410bc..555bef92167 100644 --- a/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/MeshGeneratorBase.cpp @@ -29,7 +29,7 @@ MeshGeneratorBase::MeshGeneratorBase( string const & name, Group * const parent Group * MeshGeneratorBase::createChild( string const & childKey, string const & childName ) { - GEOS_LOG_RANK_0( "Adding Mesh attribute: " << childKey << ", " << childName ); + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); std::unique_ptr< MeshComponentBase > comp = MeshComponentBase::CatalogInterface::factory( childKey, childName, this ); return &this->registerGroup< MeshComponentBase >( childName, std::move( comp ) ); } diff --git a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp index 2b9d94ca063..6d791068dfd 100644 --- a/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp +++ b/src/coreComponents/mesh/generators/VTKMeshGenerator.cpp @@ -125,7 +125,7 @@ void VTKMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockManager { vtk::AllMeshes allMeshes; - GEOS_LOG_LEVEL_RANK_0( 2, " reading the dataset..." ); + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{} '{}': reading the dataset...", catalogName(), getName() ) ); if( !m_filePath.empty()) { @@ -183,33 +183,33 @@ void VTKMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockManager } } - GEOS_LOG_LEVEL_RANK_0( 2, " redistributing mesh..." ); + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{} '{}': redistributing mesh...", catalogName(), getName() ) ); vtk::AllMeshes redistributedMeshes = vtk::redistributeMeshes( getLogLevel(), allMeshes.getMainMesh(), allMeshes.getFaceBlocks(), comm, m_partitionMethod, m_partitionRefinement, m_useGlobalIds ); m_vtkMesh = redistributedMeshes.getMainMesh(); m_faceBlockMeshes = redistributedMeshes.getFaceBlocks(); - GEOS_LOG_LEVEL_RANK_0( 2, " finding neighbor ranks..." ); + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{} '{}': finding neighbor ranks...", catalogName(), getName() ) ); std::vector< vtkBoundingBox > boxes = vtk::exchangeBoundingBoxes( *m_vtkMesh, comm ); std::vector< int > const neighbors = vtk::findNeighborRanks( std::move( boxes ) ); partition.setMetisNeighborList( std::move( neighbors ) ); - GEOS_LOG_LEVEL_RANK_0( 2, " done!" ); + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{} '{}': done!", catalogName(), getName() ) ); } - GEOS_LOG_RANK_0( GEOS_FMT( "{} '{}': generating GEOSX mesh data structure", catalogName(), getName() ) ); + GEOS_LOG_RANK_0( GEOS_FMT( "{} '{}': generating GEOS mesh data structure", catalogName(), getName() ) ); - GEOS_LOG_LEVEL_RANK_0( 2, " preprocessing..." ); + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{} '{}': preprocessing...", catalogName(), getName() ) ); m_cellMap = vtk::buildCellMap( *m_vtkMesh, m_attributeName ); - GEOS_LOG_LEVEL_RANK_0( 2, " writing nodes..." ); + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{} '{}': writing nodes...", catalogName(), getName() ) ); cellBlockManager.setGlobalLength( writeNodes( getLogLevel(), *m_vtkMesh, m_nodesetNames, cellBlockManager, this->m_translate, this->m_scale ) ); - GEOS_LOG_LEVEL_RANK_0( 2, " writing cells..." ); + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{} '{}': writing cells...", catalogName(), getName() ) ); writeCells( getLogLevel(), *m_vtkMesh, m_cellMap, cellBlockManager ); - GEOS_LOG_LEVEL_RANK_0( 2, " writing surfaces..." ); + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{} '{}': writing surfaces...", catalogName(), getName() ) ); writeSurfaces( getLogLevel(), *m_vtkMesh, m_cellMap, cellBlockManager ); - GEOS_LOG_LEVEL_RANK_0( 2, " building connectivity maps..." ); + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{} '{}': building connectivity maps...", catalogName(), getName() ) ); cellBlockManager.buildMaps(); for( auto const & [name, mesh]: m_faceBlockMeshes ) @@ -217,7 +217,7 @@ void VTKMeshGenerator::fillCellBlockManager( CellBlockManager & cellBlockManager vtk::importFractureNetwork( name, mesh, m_vtkMesh, cellBlockManager ); } - GEOS_LOG_LEVEL_RANK_0( 2, " done!" ); + GEOS_LOG_LEVEL_RANK_0( 2, GEOS_FMT( "{} '{}': done!", catalogName(), getName() ) ); vtk::printMeshStatistics( *m_vtkMesh, m_cellMap, comm ); } diff --git a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp index 56e71955446..f64e0e9b7d0 100644 --- a/src/coreComponents/mesh/generators/WellGeneratorBase.cpp +++ b/src/coreComponents/mesh/generators/WellGeneratorBase.cpp @@ -80,7 +80,7 @@ Group * WellGeneratorBase::createChild( string const & childKey, string const & // keep track of the perforations that have been added m_perforationList.emplace_back( childName ); - GEOS_LOG_RANK_0( "Adding Well attribute: " << childKey << ", " << childName ); + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); return ®isterGroup< Perforation >( childName ); } else diff --git a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp index bb964e0c6dd..c5843dbc747 100644 --- a/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp +++ b/src/coreComponents/mesh/simpleGeometricObjects/GeometricObjectManager.cpp @@ -53,7 +53,7 @@ GeometricObjectManager & GeometricObjectManager::getInstance() Group * GeometricObjectManager::createChild( string const & childKey, string const & childName ) { - GEOS_LOG_RANK_0( "Adding Geometric Object: " << childKey << ", " << childName ); + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); std::unique_ptr< SimpleGeometricObjectBase > geometriObject = SimpleGeometricObjectBase::CatalogInterface::factory( childKey, childName, this ); return &this->registerGroup< SimpleGeometricObjectBase >( childName, std::move( geometriObject ) ); } diff --git a/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp b/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp index 0bf40f860d9..0267c7df811 100644 --- a/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp +++ b/src/coreComponents/physicsSolvers/PhysicsSolverManager.cpp @@ -49,7 +49,7 @@ Group * PhysicsSolverManager::createChild( string const & childKey, string const Group * rval = nullptr; if( PhysicsSolverBase::CatalogInterface::hasKeyName( childKey ) ) { - GEOS_LOG_RANK_0( "Adding Solver of type " << childKey << ", named " << childName ); + GEOS_LOG_RANK_0( GEOS_FMT( "{}: adding {} {}", getName(), childKey, childName ) ); rval = ®isterGroup( childName, PhysicsSolverBase::CatalogInterface::factory( childKey, childName, this ) ); } From 8497dfac811373c0cc4bb36deed5417e09cd1d69 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Fri, 13 Dec 2024 16:41:49 -0600 Subject: [PATCH 282/286] refactor: cleanup setMGRStrategy a bit (#3422) --- .../SolidMechanicsEmbeddedFractures.cpp | 30 +++++++--- .../SolidMechanicsEmbeddedFractures.hpp | 2 + .../contact/SolidMechanicsLagrangeContact.cpp | 25 ++++++-- .../contact/SolidMechanicsLagrangeContact.hpp | 5 +- ...mpositionalMultiphaseReservoirAndWells.cpp | 58 +++++++++++-------- ...mpositionalMultiphaseReservoirAndWells.hpp | 4 +- .../CoupledReservoirAndWellsBase.hpp | 16 ++++- .../multiphysics/HydrofractureSolver.cpp | 21 +++++-- .../multiphysics/HydrofractureSolver.hpp | 1 + .../multiphysics/MultiphasePoromechanics.cpp | 40 ++++++++++--- .../multiphysics/MultiphasePoromechanics.hpp | 6 ++ .../multiphysics/SinglePhasePoromechanics.cpp | 44 ++++++++++---- .../multiphysics/SinglePhasePoromechanics.hpp | 6 ++ ...ePhasePoromechanicsConformingFractures.cpp | 19 ++++-- ...ePhasePoromechanicsConformingFractures.hpp | 7 ++- ...glePhasePoromechanicsEmbeddedFractures.cpp | 22 +++++-- ...glePhasePoromechanicsEmbeddedFractures.hpp | 2 + .../SinglePhaseReservoirAndWells.cpp | 51 +++++++++------- .../SinglePhaseReservoirAndWells.hpp | 8 ++- .../SolidMechanicsLagrangianFEM.cpp | 1 + 20 files changed, 269 insertions(+), 99 deletions(-) diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp index 15cc190fed1..b78afce691a 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.cpp @@ -64,23 +64,37 @@ SolidMechanicsEmbeddedFractures::~SolidMechanicsEmbeddedFractures() void SolidMechanicsEmbeddedFractures::postInputInitialization() { - SolidMechanicsLagrangianFEM::postInputInitialization(); + ContactSolverBase::postInputInitialization(); - LinearSolverParameters & linParams = m_linearSolverParameters.get(); - - linParams.dofsPerNode = 3; + LinearSolverParameters & linearSolverParameters = m_linearSolverParameters.get(); if( m_useStaticCondensation ) { - linParams.isSymmetric = true; - linParams.amg.separateComponents = true; + // configure AMG + linearSolverParameters.isSymmetric = true; + linearSolverParameters.amg.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; } else { - linParams.mgr.strategy = LinearSolverParameters::MGR::StrategyType::solidMechanicsEmbeddedFractures; - linParams.mgr.separateComponents = true; + setMGRStrategy(); } } +void SolidMechanicsEmbeddedFractures::setMGRStrategy() +{ + LinearSolverParameters & linearSolverParameters = m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; + + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::solidMechanicsEmbeddedFractures; + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); +} + void SolidMechanicsEmbeddedFractures::registerDataOnMesh( dataRepository::Group & meshBodies ) { ContactSolverBase::registerDataOnMesh( meshBodies ); diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp index 6e146d34863..384137706c9 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp @@ -135,6 +135,8 @@ class SolidMechanicsEmbeddedFractures : public ContactSolverBase virtual void postInputInitialization() override final; + void setMGRStrategy(); + private: void updateJump( DofManager const & dofManager, diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index 7ca9cd24c29..c0be250ff1e 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -73,11 +73,28 @@ SolidMechanicsLagrangeContact::SolidMechanicsLagrangeContact( const string & nam setDescription( "It be used to increase the scale of the stabilization entries. A value < 1.0 results in larger entries in the stabilization matrix." ); addLogLevel< logInfo::Configuration >(); +} + +void SolidMechanicsLagrangeContact::postInputInitialization() +{ + ContactSolverBase::postInputInitialization(); + + setMGRStrategy(); +} + +void SolidMechanicsLagrangeContact::setMGRStrategy() +{ + LinearSolverParameters & linearSolverParameters = m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; - LinearSolverParameters & linSolParams = m_linearSolverParameters.get(); - linSolParams.mgr.strategy = LinearSolverParameters::MGR::StrategyType::lagrangianContactMechanics; - linSolParams.mgr.separateComponents = true; - linSolParams.dofsPerNode = 3; + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::lagrangianContactMechanics; + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); } void SolidMechanicsLagrangeContact::registerDataOnMesh( Group & meshBodies ) diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index b77fac6ef27..da33861a54e 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -31,7 +31,6 @@ class NumericalMethodsManager; class SolidMechanicsLagrangeContact : public ContactSolverBase { public: - SolidMechanicsLagrangeContact( const string & name, Group * const parent ); @@ -179,6 +178,10 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase DofManager const & dofManager, arrayView1d< real64 const > const & localRhs ); + virtual void postInputInitialization() override final; + + void setMGRStrategy(); + private: string m_stabilizationName; diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp index b2c668bb182..ea2c6f34b3e 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.cpp @@ -77,26 +77,39 @@ void CompositionalMultiphaseReservoirAndWells<>:: setMGRStrategy() { - LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); + LinearSolverParameters & linearSolverParameters = m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; linearSolverParameters.mgr.separateComponents = true; linearSolverParameters.dofsPerNode = 3; - if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM ) - { - // add Reservoir - linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirHybridFVM; - } - else if( isThermal() ) + if( dynamic_cast< CompositionalMultiphaseHybridFVM * >( this->flowSolver() ) ) { - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::thermalCompositionalMultiphaseReservoirFVM; - + if( isThermal() ) + { + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for thermal {}/{}", + this->getName(), this->getCatalogName(), this->flowSolver()->getCatalogName())); + } + else + { + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirHybridFVM; + } } else { - // add Reservoir - linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirFVM; + if( isThermal() ) + { + m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::thermalCompositionalMultiphaseReservoirFVM; + } + else + { + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseReservoirFVM; + } } + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); } template<> @@ -104,21 +117,25 @@ void CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> >:: setMGRStrategy() { - LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); + LinearSolverParameters & linearSolverParameters = m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; linearSolverParameters.mgr.separateComponents = true; linearSolverParameters.dofsPerNode = 3; - // flow solver here is indeed flow solver, not poromechanics solver - if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseHybridFVM ) + if( dynamic_cast< CompositionalMultiphaseHybridFVM * >( this->flowSolver() ) ) { - GEOS_ERROR( "The poromechanics MGR strategy for hybrid FVM is not implemented" ); + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for {}/{}", + this->getName(), this->getCatalogName(), this->flowSolver()->getCatalogName() ) ); } else { - // add Reservoir linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanicsReservoirFVM; } + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); } template< typename RESERVOIR_SOLVER > @@ -140,15 +157,6 @@ initializePreSubGroups() InputError ); } -template< typename RESERVOIR_SOLVER > -void -CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: -initializePostInitialConditionsPreSubGroups() -{ - Base::initializePostInitialConditionsPreSubGroups(); - setMGRStrategy(); -} - template< typename RESERVOIR_SOLVER > void CompositionalMultiphaseReservoirAndWells< RESERVOIR_SOLVER >:: diff --git a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp index 65a2e813be8..0ceee38fdfe 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CompositionalMultiphaseReservoirAndWells.hpp @@ -95,14 +95,12 @@ class CompositionalMultiphaseReservoirAndWells : public CoupledReservoirAndWells virtual void initializePreSubGroups() override; - virtual void initializePostInitialConditionsPreSubGroups() override; + virtual void setMGRStrategy() override; private: CompositionalMultiphaseBase * flowSolver() const; - void setMGRStrategy(); - }; } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp index a34cf788470..c40265648f1 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/CoupledReservoirAndWellsBase.hpp @@ -201,10 +201,18 @@ class CoupledReservoirAndWellsBase : public CoupledSolver< RESERVOIR_SOLVER, WEL // Validate well perforations: Ensure that each perforation is in a region targeted by the solver if( !validateWellPerforations( domain )) { - return; + GEOS_ERROR( GEOS_FMT( "{}: well perforations validation failed, bad perforations found", this->getName())); } } + virtual void + postInputInitialization() override + { + Base::postInputInitialization(); + + setMGRStrategy(); + } + virtual void implicitStepSetup( real64 const & time_n, real64 const & dt, @@ -298,6 +306,12 @@ class CoupledReservoirAndWellsBase : public CoupledSolver< RESERVOIR_SOLVER, WEL DofManager const & dofManager, SparsityPatternView< globalIndex > const & pattern ) const = 0; + virtual void setMGRStrategy() + { + if( this->m_linearSolverParameters.get().preconditionerType == LinearSolverParameters::PreconditionerType::mgr ) + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for {}", this->getName(), this->getCatalogName())); + } + /// Flag to determine whether the well transmissibility needs to be computed bool m_isWellTransmissibilityComputed; diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp index 3a526d7ccbd..c11d99f3fad 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.cpp @@ -81,12 +81,23 @@ HydrofractureSolver< POROMECHANICS_SOLVER >::HydrofractureSolver( const string & setDescription( "Flag to determine whether or not to apply lagging update for the fracture stencil weights. " ); m_numResolves[0] = 0; +} - // This may need to be different depending on whether poroelasticity is on or not. - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::hydrofracture; - m_linearSolverParameters.get().mgr.separateComponents = true; - m_linearSolverParameters.get().dofsPerNode = 3; +template< typename POROMECHANICS_SOLVER > +void HydrofractureSolver< POROMECHANICS_SOLVER >::setMGRStrategy() +{ + LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; + + // This may need to be different depending on whether poroelasticity is on or not. + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::hydrofracture; + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", this->getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); } template< typename POROMECHANICS_SOLVER > @@ -157,6 +168,8 @@ void HydrofractureSolver< POROMECHANICS_SOLVER >::postInputInitialization() { Base::postInputInitialization(); + setMGRStrategy(); + static const std::set< integer > binaryOptions = { 0, 1 }; GEOS_ERROR_IF( binaryOptions.count( m_isMatrixPoroelastic ) == 0, viewKeyStruct::isMatrixPoroelasticString() << " option can be either 0 (false) or 1 (true)" ); diff --git a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp index d08f7d89e4e..05a96830440 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/HydrofractureSolver.hpp @@ -215,6 +215,7 @@ class HydrofractureSolver : public POROMECHANICS_SOLVER DofManager const & dofManager, CRSMatrix< real64, globalIndex > & localMatrix ); + virtual void setMGRStrategy() override; private: diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index dc3875a88ec..30cd3db9a68 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -25,6 +25,7 @@ #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/solid/PorousSolid.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/ThermalMultiphasePoromechanics.hpp" #include "physicsSolvers/solidMechanics/SolidMechanicsFields.hpp" @@ -45,18 +46,15 @@ template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::MultiphasePoromechanics( const string & name, Group * const parent ) : Base( name, parent ) -{ - LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); - linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanics; - linearSolverParameters.mgr.separateComponents = true; - linearSolverParameters.dofsPerNode = 3; -} +{} template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postInputInitialization() { Base::postInputInitialization(); + setMGRStrategy(); + GEOS_ERROR_IF( this->flowSolver()->getCatalogName() == "CompositionalMultiphaseReservoir" && this->getNonlinearSolverParameters().couplingType() != NonlinearSolverParameters::CouplingType::Sequential, GEOS_FMT( "{}: {} solver is only designed to work for {} = {}", @@ -244,11 +242,37 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIni getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), InputError ); } +} + +template<> +void MultiphasePoromechanics<>::setMGRStrategy() +{ + LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; - if( this->m_isThermal ) + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; + + if( dynamic_cast< CompositionalMultiphaseHybridFVM * >( this->flowSolver() ) ) + { + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for {}/{}", + this->getName(), this->getCatalogName(), this->flowSolver()->getCatalogName())); + } + else { - this->m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::thermalMultiphasePoromechanics; + if( this->m_isThermal ) + { + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::thermalMultiphasePoromechanics; + } + else + { + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanics; + } } + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); } template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp index 89d46b554be..30259c11b43 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.hpp @@ -107,6 +107,12 @@ class MultiphasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHANI virtual void initializePostInitialConditionsPreSubGroups() override; + virtual void setMGRStrategy() + { + if( this->m_linearSolverParameters.get().preconditionerType == LinearSolverParameters::PreconditionerType::mgr ) + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for {}", this->getName(), this->getCatalogName())); + } + /** * @brief Helper function to recompute the bulk density * @param[in] subRegion the element subRegion diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index b28c0d0b9af..4c3d3fc6e9f 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -32,6 +32,7 @@ #include "physicsSolvers/solidMechanics/kernels/ImplicitSmallStrainQuasiStatic.hpp" #include "physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp" #include "physicsSolvers/contact/SolidMechanicsEmbeddedFractures.hpp" +#include "physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp" namespace geos { @@ -45,18 +46,15 @@ template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::SinglePhasePoromechanics( const string & name, Group * const parent ) : Base( name, parent ) -{ - LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); - linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanics; - linearSolverParameters.mgr.separateComponents = true; - linearSolverParameters.dofsPerNode = 3; -} +{} template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postInputInitialization() { Base::postInputInitialization(); + setMGRStrategy(); + GEOS_ERROR_IF( this->flowSolver()->getCatalogName() == "SinglePhaseReservoir" && this->getNonlinearSolverParameters().couplingType() != NonlinearSolverParameters::CouplingType::Sequential, GEOS_FMT( "{}: {} solver is only designed to work for {} = {}", @@ -113,18 +111,44 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::initializePostIn getCatalogName(), this->getDataContext(), poromechanicsTargetRegionNames[i], this->flowSolver()->getDataContext() ), InputError ); } +} + +template<> +void SinglePhasePoromechanics<>::setMGRStrategy() +{ + LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; - if( this->m_isThermal ) + if( dynamic_cast< SinglePhaseHybridFVM * >( this->flowSolver() ) ) { - this->m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::thermalSinglePhasePoromechanics; + if( this->m_isThermal ) + { + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for thermal {}/{}", + this->getName(), this->getCatalogName(), this->flowSolver()->getCatalogName() )); + } + else + { + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::hybridSinglePhasePoromechanics; + } } else { - if( this->flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseHybridFVM ) + if( this->m_isThermal ) + { + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::thermalSinglePhasePoromechanics; + } + else { - this->m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::hybridSinglePhasePoromechanics; + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanics; } } + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); } template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp index 4b9dfbf7427..e742fb9715b 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.hpp @@ -118,6 +118,12 @@ class SinglePhasePoromechanics : public PoromechanicsSolver< FLOW_SOLVER, MECHAN virtual void initializePostInitialConditionsPreSubGroups() override; + virtual void setMGRStrategy() + { + if( this->m_linearSolverParameters.get().preconditionerType == LinearSolverParameters::PreconditionerType::mgr ) + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for {}", this->getName(), this->getCatalogName())); + } + /** * @brief Helper function to recompute the bulk density * @param[in] subRegion the element subRegion diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp index 50e56820a10..51fef65a2de 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.cpp @@ -44,11 +44,22 @@ template< typename FLOW_SOLVER > SinglePhasePoromechanicsConformingFractures< FLOW_SOLVER >::SinglePhasePoromechanicsConformingFractures( const string & name, Group * const parent ) : Base( name, parent ) +{} + +template<> +void SinglePhasePoromechanicsConformingFractures<>::setMGRStrategy() { - LinearSolverParameters & params = this->m_linearSolverParameters.get(); - params.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsConformingFractures; - params.mgr.separateComponents = true; - params.dofsPerNode = 3; + LinearSolverParameters & linearSolverParameters = this->m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; + + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsConformingFractures; + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); } template< typename FLOW_SOLVER > diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp index 3d109b4e0b3..0e657441f11 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsConformingFractures.hpp @@ -103,6 +103,12 @@ class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechan virtual void updateState( DomainPartition & domain ) override final; + virtual void setMGRStrategy() override + { + if( this->m_linearSolverParameters.get().preconditionerType == LinearSolverParameters::PreconditionerType::mgr ) + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for {}", this->getName(), this->getCatalogName())); + } + /**@}*/ private: @@ -176,7 +182,6 @@ class SinglePhasePoromechanicsConformingFractures : public SinglePhasePoromechan */ void updateHydraulicApertureAndFracturePermeability( DomainPartition & domain ); - std::unique_ptr< CRSMatrix< real64, localIndex > > & getRefDerivativeFluxResidual_dAperture() { return m_derivativeFluxResidual_dAperture; diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp index 9c1dab6f9ab..6c6e2be5bc4 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.cpp @@ -41,16 +41,26 @@ using namespace fields; SinglePhasePoromechanicsEmbeddedFractures::SinglePhasePoromechanicsEmbeddedFractures( const std::string & name, Group * const parent ): SinglePhasePoromechanics( name, parent ) -{ - LinearSolverParameters & params = m_linearSolverParameters.get(); - params.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsEmbeddedFractures; - params.mgr.separateComponents = true; - params.dofsPerNode = 3; -} +{} SinglePhasePoromechanicsEmbeddedFractures::~SinglePhasePoromechanicsEmbeddedFractures() {} +void SinglePhasePoromechanicsEmbeddedFractures::setMGRStrategy() +{ + LinearSolverParameters & linearSolverParameters = m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; + + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsEmbeddedFractures; + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); +} + void SinglePhasePoromechanicsEmbeddedFractures::postInputInitialization() { Base::postInputInitialization(); diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp index 497ebdffe64..95c3e7b7f82 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanicsEmbeddedFractures.hpp @@ -105,6 +105,8 @@ class SinglePhasePoromechanicsEmbeddedFractures : public SinglePhasePoromechanic virtual void initializePostInitialConditionsPreSubGroups() override final; + virtual void setMGRStrategy() override; + private: template< typename CONSTITUTIVE_BASE, diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp index 06361544a3f..f83652d7455 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.cpp @@ -24,6 +24,7 @@ #include "mesh/PerforationFields.hpp" #include "physicsSolvers/KernelLaunchSelectors.hpp" #include "physicsSolvers/fluidFlow/SinglePhaseFVM.hpp" +#include "physicsSolvers/fluidFlow/SinglePhaseHybridFVM.hpp" #include "physicsSolvers/fluidFlow/wells/SinglePhaseWellFields.hpp" #include "physicsSolvers/fluidFlow/wells/WellControls.hpp" #include "physicsSolvers/fluidFlow/wells/kernels/SinglePhaseWellKernels.hpp" @@ -69,33 +70,50 @@ void SinglePhaseReservoirAndWells<>:: setMGRStrategy() { - if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseHybridFVM ) + LinearSolverParameters & linearSolverParameters = m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; + + if( dynamic_cast< SinglePhaseHybridFVM * >( this->flowSolver() ) ) { - // add Reservoir - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirHybridFVM; + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirHybridFVM; } else { - // add Reservoir - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirFVM; + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhaseReservoirFVM; } + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); } -template< typename POROMECHANICS_SOLVER > +template<> void -SinglePhaseReservoirAndWells< POROMECHANICS_SOLVER >:: +SinglePhaseReservoirAndWells< SinglePhasePoromechanics<> >:: setMGRStrategy() { - // flow solver here is indeed flow solver, not poromechanics solver - if( flowSolver()->getLinearSolverParameters().mgr.strategy == LinearSolverParameters::MGR::StrategyType::singlePhaseHybridFVM ) + LinearSolverParameters & linearSolverParameters = m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; + + if( dynamic_cast< SinglePhaseHybridFVM * >( this->flowSolver() ) ) { - GEOS_LOG_RANK_0( "The poromechanics MGR strategy for hybrid FVM is not implemented" ); + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for poromechanics {}/{}", + this->getName(), this->getCatalogName(), this->flowSolver()->getCatalogName())); } else { - // add Reservoir - m_linearSolverParameters.get().mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsReservoirFVM; + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsReservoirFVM; } + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", this->getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); } template< typename RESERVOIR_SOLVER > @@ -108,15 +126,6 @@ initializePreSubGroups() Base::wellSolver()->setFlowSolverName( flowSolver->getName() ); } -template< typename RESERVOIR_SOLVER > -void -SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: -initializePostInitialConditionsPreSubGroups() -{ - Base::initializePostInitialConditionsPreSubGroups(); - setMGRStrategy(); -} - template< typename RESERVOIR_SOLVER > void SinglePhaseReservoirAndWells< RESERVOIR_SOLVER >:: diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp index 0ded9b7bd36..6ce8df9632c 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhaseReservoirAndWells.hpp @@ -111,14 +111,16 @@ class SinglePhaseReservoirAndWells : public CoupledReservoirAndWellsBase< RESERV virtual void initializePreSubGroups() override; - virtual void initializePostInitialConditionsPreSubGroups() override; + virtual void setMGRStrategy() override + { + if( this->m_linearSolverParameters.get().preconditionerType == LinearSolverParameters::PreconditionerType::mgr ) + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for {}", this->getName(), this->getCatalogName())); + } private: SinglePhaseBase * flowSolver() const; - void setMGRStrategy(); - }; } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp index 434e4fde4a8..70cb8b3c56e 100644 --- a/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp +++ b/src/coreComponents/physicsSolvers/solidMechanics/SolidMechanicsLagrangianFEM.cpp @@ -130,6 +130,7 @@ void SolidMechanicsLagrangianFEM::postInputInitialization() { PhysicsSolverBase::postInputInitialization(); + // configure AMG LinearSolverParameters & linParams = m_linearSolverParameters.get(); linParams.isSymmetric = true; linParams.dofsPerNode = 3; From 5ce649762bce0f5676aafe136ba84f2fc7cf2a93 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Fri, 13 Dec 2024 21:07:11 -0600 Subject: [PATCH 283/286] feat: Enable fully coupled mode for CompositionalMultiphaseReservoirPoromechanics and SinglePhaseReservoirPoromechanics (#3388) --- .../multiphysics/MultiphasePoromechanics.cpp | 79 +++++++++++++++++-- .../multiphysics/SinglePhasePoromechanics.cpp | 74 +++++++++++++++-- 2 files changed, 139 insertions(+), 14 deletions(-) diff --git a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp index 30cd3db9a68..6b01f872f5c 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/MultiphasePoromechanics.cpp @@ -24,6 +24,7 @@ #include "dataRepository/LogLevelsInfo.hpp" #include "constitutive/fluid/multifluid/MultiFluidBase.hpp" #include "constitutive/solid/PorousSolid.hpp" +#include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp" #include "physicsSolvers/fluidFlow/FlowSolverBaseFields.hpp" #include "physicsSolvers/fluidFlow/CompositionalMultiphaseHybridFVM.hpp" #include "physicsSolvers/multiphysics/poromechanicsKernels/MultiphasePoromechanics.hpp" @@ -54,13 +55,6 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postInputInitiali Base::postInputInitialization(); setMGRStrategy(); - - GEOS_ERROR_IF( this->flowSolver()->getCatalogName() == "CompositionalMultiphaseReservoir" && - this->getNonlinearSolverParameters().couplingType() != NonlinearSolverParameters::CouplingType::Sequential, - GEOS_FMT( "{}: {} solver is only designed to work for {} = {}", - this->getDataContext(), catalogName(), NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), - EnumStrings< NonlinearSolverParameters::CouplingType >::toString( NonlinearSolverParameters::CouplingType::Sequential ) - )); } template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > @@ -82,6 +76,7 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleSystem( r { GEOS_MARK_FUNCTION; + // Steps 1 and 2: compute element-based terms (mechanics and local flow terms) assembleElementBasedTerms( time, dt, domain, @@ -110,6 +105,50 @@ void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleSystem( r } } +template<> +void MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells<>, SolidMechanicsLagrangianFEM >::assembleSystem( real64 const time, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + GEOS_MARK_FUNCTION; + + // Steps 1 and 2: compute element-based terms (mechanics and local flow terms) + assembleElementBasedTerms( time, + dt, + domain, + dofManager, + localMatrix, + localRhs ); + + // step 3: compute the fluxes (face-based contributions) + + if( m_stabilizationType == StabilizationType::Global || + m_stabilizationType == StabilizationType::Local ) + { + this->flowSolver()->assembleStabilizedFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } + else + { + this->flowSolver()->assembleFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } + + // step 4: assemble well contributions + + this->flowSolver()->wellSolver()->assembleSystem( time, dt, domain, dofManager, localMatrix, localRhs ); + this->flowSolver()->assembleCouplingTerms( time, dt, domain, dofManager, localMatrix, localRhs ); +} + template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleElementBasedTerms( real64 const time_n, real64 const dt, @@ -275,6 +314,32 @@ void MultiphasePoromechanics<>::setMGRStrategy() EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); } +template<> +void MultiphasePoromechanics< CompositionalMultiphaseReservoirAndWells<>, SolidMechanicsLagrangianFEM >::setMGRStrategy() +{ + // same as CompositionalMultiphaseReservoirAndWells< MultiphasePoromechanics<> >::setMGRStrategy + + LinearSolverParameters & linearSolverParameters = m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; + + if( dynamic_cast< CompositionalMultiphaseHybridFVM * >( this->flowSolver() ) ) + { + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for {}/{}", + this->getName(), this->getCatalogName(), this->flowSolver()->getCatalogName() ) ); + } + else + { + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::multiphasePoromechanicsReservoirFVM; + } + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); +} + template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > void MultiphasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::updateBulkDensity( ElementSubRegionBase & subRegion ) { diff --git a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp index 4c3d3fc6e9f..0bfa9146a27 100644 --- a/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp +++ b/src/coreComponents/physicsSolvers/multiphysics/SinglePhasePoromechanics.cpp @@ -54,13 +54,6 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::postInputInitial Base::postInputInitialization(); setMGRStrategy(); - - GEOS_ERROR_IF( this->flowSolver()->getCatalogName() == "SinglePhaseReservoir" && - this->getNonlinearSolverParameters().couplingType() != NonlinearSolverParameters::CouplingType::Sequential, - GEOS_FMT( "{}: {} solver is only designed to work for {} = {}", - this->getName(), catalogName(), NonlinearSolverParameters::viewKeysStruct::couplingTypeString(), - EnumStrings< NonlinearSolverParameters::CouplingType >::toString( NonlinearSolverParameters::CouplingType::Sequential ) - )); } template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > @@ -151,6 +144,32 @@ void SinglePhasePoromechanics<>::setMGRStrategy() EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); } +template<> +void SinglePhasePoromechanics< SinglePhaseReservoirAndWells<>, SolidMechanicsLagrangianFEM >::setMGRStrategy() +{ + // same as SinglePhaseReservoirAndWells< SinglePhasePoromechanics<> >::setMGRStrategy + + LinearSolverParameters & linearSolverParameters = m_linearSolverParameters.get(); + + if( linearSolverParameters.preconditionerType != LinearSolverParameters::PreconditionerType::mgr ) + return; + + linearSolverParameters.mgr.separateComponents = true; + linearSolverParameters.dofsPerNode = 3; + + if( dynamic_cast< SinglePhaseHybridFVM * >( this->flowSolver() ) ) + { + GEOS_ERROR( GEOS_FMT( "{}: MGR strategy is not implemented for poromechanics {}/{}", + this->getName(), this->getCatalogName(), this->flowSolver()->getCatalogName())); + } + else + { + linearSolverParameters.mgr.strategy = LinearSolverParameters::MGR::StrategyType::singlePhasePoromechanicsReservoirFVM; + } + GEOS_LOG_LEVEL_RANK_0( 1, GEOS_FMT( "{}: MGR strategy set to {}", this->getName(), + EnumStrings< LinearSolverParameters::MGR::StrategyType >::toString( linearSolverParameters.mgr.strategy ))); +} + template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleSystem( real64 const time_n, real64 const dt, @@ -186,7 +205,48 @@ void SinglePhasePoromechanics< FLOW_SOLVER, MECHANICS_SOLVER >::assembleSystem( localMatrix, localRhs ); } +} + +template<> +void SinglePhasePoromechanics< SinglePhaseReservoirAndWells<>, SolidMechanicsLagrangianFEM >::assembleSystem( real64 const time_n, + real64 const dt, + DomainPartition & domain, + DofManager const & dofManager, + CRSMatrixView< real64, globalIndex const > const & localMatrix, + arrayView1d< real64 > const & localRhs ) +{ + GEOS_MARK_FUNCTION; + + // Steps 1 and 2: compute element-based terms (mechanics and local flow terms) + assembleElementBasedTerms( time_n, + dt, + domain, + dofManager, + localMatrix, + localRhs ); + + // Step 3: compute the fluxes (face-based contributions) + if( m_stabilizationType == StabilizationType::Global || m_stabilizationType == StabilizationType::Local ) + { + this->flowSolver()->assembleStabilizedFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } + else + { + this->flowSolver()->assembleFluxTerms( dt, + domain, + dofManager, + localMatrix, + localRhs ); + } + + // step 4: assemble well contributions + this->flowSolver()->wellSolver()->assembleSystem( time_n, dt, domain, dofManager, localMatrix, localRhs ); + this->flowSolver()->assembleCouplingTerms( time_n, dt, domain, dofManager, localMatrix, localRhs ); } template< typename FLOW_SOLVER, typename MECHANICS_SOLVER > From bc41885b617a679e1add79905bfc289ab76a3cee Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Sat, 14 Dec 2024 21:18:14 -0600 Subject: [PATCH 284/286] fix: remove setNextDt from SolidMechanicsLagrangeContact (#3490) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 4 ++++ .../contact/SolidMechanicsLagrangeContact.cpp | 7 ------- .../contact/SolidMechanicsLagrangeContact.hpp | 4 ---- 4 files changed, 5 insertions(+), 12 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 31ce96119a9..09af5eafaf4 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3450-9221-37d940c + baseline: integratedTests/baseline_integratedTests-pr3490-9351-03417a1 allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 3b097223255..74e7e6efed1 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,6 +6,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3450 (2024-12-14) +===================== +Fix time step selecor flaw in SolidMechanicsLagrangeContact. + PR #3450 (2024-12-08) ===================== Added test for explicit runge kutta sprinslider. diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp index c0be250ff1e..9a76b95632b 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.cpp @@ -2359,13 +2359,6 @@ bool SolidMechanicsLagrangeContact::isFractureAllInStickCondition( DomainPartiti return ( ( numNewSlip + numSlip + numOpen ) == 0 ); } -real64 SolidMechanicsLagrangeContact::setNextDt( real64 const & currentDt, - DomainPartition & domain ) -{ - GEOS_UNUSED_VAR( domain ); - return currentDt; -} - REGISTER_CATALOG_ENTRY( PhysicsSolverBase, SolidMechanicsLagrangeContact, string const &, Group * const ) } /* namespace geos */ diff --git a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp index da33861a54e..a39b1374735 100644 --- a/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp +++ b/src/coreComponents/physicsSolvers/contact/SolidMechanicsLagrangeContact.hpp @@ -100,10 +100,6 @@ class SolidMechanicsLagrangeContact : public ContactSolverBase virtual void resetStateToBeginningOfStep( DomainPartition & domain ) override; - virtual real64 - setNextDt( real64 const & currentDt, - DomainPartition & domain ) override; - void updateState( DomainPartition & domain ) override final; void assembleContact( DomainPartition & domain, From ab079a48d5ad8af7973411459c7ecbe90238ef40 Mon Sep 17 00:00:00 2001 From: Pavel Tomin Date: Sun, 15 Dec 2024 17:43:48 -0600 Subject: [PATCH 285/286] test: refine comp flow tests (#3479) --- .integrated_tests.yaml | 2 +- BASELINE_NOTES.md | 6 ++- .../2ph_cap_1d_ihu.xml | 2 +- .../4comp_2ph_1d.xml | 2 +- .../4comp_2ph_cap_1d.xml | 7 ++- .../co2_flux_3d.xml | 8 ++- .../co2_flux_dirichlet.xml | 5 +- .../co2_hybrid_1d.xml | 7 ++- .../compositionalMultiphaseFlow.ats | 50 +++++++++---------- ...l_2ph_staircase_gravity_segregation_3d.xml | 5 +- .../deadoil_3ph_baker_1d.xml | 7 ++- .../deadoil_3ph_corey_1d.xml | 4 +- .../deadoil_3ph_corey_1d_fractured.xml | 18 +++---- .../deadoil_3ph_staircase_3d.xml | 8 +-- .../deadoil_3ph_staircase_hybrid_3d.xml | 6 +-- .../deadoil_3ph_staircase_obl_3d.xml | 6 +-- .../deadoil_3ph_stone2_1d.xml | 10 ++-- 17 files changed, 74 insertions(+), 79 deletions(-) diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index 09af5eafaf4..6dfbf981b0c 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr3490-9351-03417a1 + baseline: integratedTests/baseline_integratedTests-pr3479-9362-cffefcc allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 74e7e6efed1..0bc5c80f561 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -6,9 +6,13 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #3479 (2024-12-15) +===================== +Refine inputFiles/compositionalMultiphaseFlow: shift reference pressures to initial pressures, make nonlinear tuning more reasonable, minimize output. + PR #3450 (2024-12-14) ===================== -Fix time step selecor flaw in SolidMechanicsLagrangeContact. +Fix timestep selector flaw in SolidMechanicsLagrangeContact. PR #3450 (2024-12-08) ===================== diff --git a/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml b/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml index 07a0f5d4731..8c25605b332 100644 --- a/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml +++ b/inputFiles/compositionalMultiphaseFlow/2ph_cap_1d_ihu.xml @@ -94,7 +94,7 @@ + name="fluidTPFA"/> @@ -117,7 +116,7 @@ @@ -92,7 +90,7 @@ diff --git a/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml b/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml index 99e5d1ad3b0..345c17b0b96 100644 --- a/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml +++ b/inputFiles/compositionalMultiphaseFlow/co2_hybrid_1d.xml @@ -14,8 +14,7 @@ targetRegions="{ region }"> + newtonMaxIter="10"/> @@ -50,7 +49,7 @@ maxTime="1e5"> + newtonMaxIter="15"/> @@ -108,7 +107,7 @@ + newtonMaxIter="10"/> @@ -46,7 +45,7 @@ maxTime="2e7"> + directParallel="0"/> @@ -111,18 +109,18 @@ + materialList="{ fluid, rock, relperm }"/> + newtonMaxIter="10"/> @@ -57,11 +57,11 @@ maxTime="2e8"> @@ -51,7 +51,7 @@ maxTime="2e8"> + newtonMaxIter="10"/> @@ -60,7 +60,7 @@ maxTime="2e8"> + temperature="300" + targetRegions="{ region }"> - + Date: Mon, 16 Dec 2024 12:36:30 -0800 Subject: [PATCH 286/286] fix remaining copyright errors (#3491) --- src/conf.py | 2 +- .../physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.cpp | 2 +- .../physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.hpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/conf.py b/src/conf.py index 0bcf74a68b2..c7347bd29fb 100644 --- a/src/conf.py +++ b/src/conf.py @@ -89,7 +89,7 @@ # -- Project information ----------------------------------------------------- project = u'GEOS' -copyright = u'2016-2024 Lawrence Livermore National Security LLC, 2018-2024 Total, S.A, The Board of Trustees of the Leland Stanford Junior University, 2023-2024 Chevron, 2019- GEOS/GEOSX Contributors' +copyright = u'2016-2024 Lawrence Livermore National Security LLC, 2018-2024 Total Energies, The Board of Trustees of the Leland Stanford Junior University, 2023-2024 Chevron, 2019- GEOS/GEOSX Contributors' author = u'GEOS/GEOSX Contributors' # The short X.Y version diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.cpp b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.cpp index 7b569118934..28ff8f5ff14 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.cpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.cpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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 diff --git a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.hpp b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.hpp index 0979fd22dd7..bcb3dd8a72a 100644 --- a/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.hpp +++ b/src/coreComponents/physicsSolvers/inducedSeismicity/QuasiDynamicEQRK32.hpp @@ -3,7 +3,7 @@ * SPDX-License-Identifier: LGPL-2.1-only * * Copyright (c) 2016-2024 Lawrence Livermore National Security LLC - * Copyright (c) 2018-2024 Total, S.A + * 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

    N&c9*%^kG@xJBHftZ2 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

  • TnYBPj(~F6tat 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%0A1v7k&CxIlYjJj*gJ0uusKA=xKqD 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 %CiepEP0w(jI4-a z9I8v_u2_o$Q_N*5OpUDEpWmc#p3A)qco6$s*X7*#$azm=^mrJATtC&i+Ax|?<*P$I zTBPb$&^vU5>SylpF$Ek@(cI|vdNtOnNx49wDeFt;mu??klHn4#+Fhu7Fv}^ zD}I8745s-t+|kmZNSgidYq}YVx|bcuyjDC_FP7{o?A8|?k^)*AqYUe~6ee+@>Jg&j|(Kjg+LMb8_Hb?BceeMiz zMu7>(gN(hg2r`am)Q4BK7xLBcd8bWExrAQkE=zwE6B-t;>kc$(u4^w(bX{v2fJ}lMrSy}2N`?sGpZf4GCLRgm zr!AL`1O7mx$#^Y}R!|h-beg}~L@f&ZkfL?=xJ!uw@OHy4R zu%!8qEwkWC{h{~kxO{(_e+EP|&?>K%3e?r7lkfK~jrA!?c7X*Nl#U^hcQ|CSUV%$v z9~#talP-R+lH=%qCSS3~$W9=^@mW7+nbaw8N><3i*D6|)Y2!1y5GAB!A zCg#fF47xpPvFv9y8h5mS5)zqZYa!y!zId1A{0lfoc=9J*5b8&*Zr=yhwPH=-`Mr5u#2ai{KX{ zJ9tdZoW2<|_j&Bp(wk>u{@pja%6vVxEpJFLtM({6LF`fKjObE9u88cgr1gnwm0y=-#;AuFE+kHBDcnΜgY_pz?;-4Ac| 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

    $wu$vyF-U{dG4D-;@ZTZ#6#H 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

    ^D?t~l4buOY89Q2*?T-+$$hLx|wJ|5{KzH=0{N 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

    ed_f~J+JD97RVu%<$Moi+6t7JmE^)_sv3Au={t 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

    5Jd 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%0AuC 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

    +4bk1&$`Vnjz% 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�o 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∓_(v-%QmvM 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

    A!)&_ivFKo#h56J?)9=Uo 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�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